ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKaW5kZXggNDYxNDgxZC4uN2RjMDY5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKQEAgLTE2LDYgKzE2LDggQEAKIAktIExpc3Qgb2YgUkNVIHBhcGVycyAoYmlibGlvZ3JhcGh5KSBnb2luZyBiYWNrIHRvIDE5ODAuCiB0b3J0dXJlLnR4dAogCS0gUkNVIFRvcnR1cmUgVGVzdCBPcGVyYXRpb24gKENPTkZJR19SQ1VfVE9SVFVSRV9URVNUKQordHJhY2UudHh0CisJLSBDT05GSUdfUkNVX1RSQUNFIGRlYnVnZnMgZmlsZXMgYW5kIGZvcm1hdHMKIFVQLnR4dAogCS0gUkNVIG9uIFVuaXByb2Nlc3NvciBTeXN0ZW1zCiB3aGF0aXNSQ1UudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ODQ4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RyYWNlLnR4dApAQCAtMCwwICsxLDQxMyBAQAorQ09ORklHX1JDVV9UUkFDRSBkZWJ1Z2ZzIEZpbGVzIGFuZCBGb3JtYXRzCisKKworVGhlIHJjdXByZWVtcHQgYW5kIHJjdXRyZWUgaW1wbGVtZW50YXRpb25zIG9mIFJDVSBwcm92aWRlIGRlYnVnZnMgdHJhY2UKK291dHB1dCB0aGF0IHN1bW1hcml6ZXMgY291bnRlcnMgYW5kIHN0YXRlLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yCitkZWJ1Z2dpbmcgUkNVIGl0c2VsZiwgYW5kIGNhbiBzb21ldGltZXMgYWxzbyBoZWxwIHRvIGRlYnVnIGFidXNlcyBvZiBSQ1UuCitOb3RlIHRoYXQgdGhlIHJjdWNsYXNzaWMgaW1wbGVtZW50YXRpb24gb2YgUkNVIGRvZXMgbm90IHByb3ZpZGUgZGVidWdmcwordHJhY2Ugb3V0cHV0LgorCitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIHRoZSBkZWJ1Z2ZzIGZpbGVzIGFuZCBmb3JtYXRzIGZvcgorcHJlZW1wdGFibGUgUkNVIChyY3VwcmVlbXB0KSBhbmQgaGllcmFyY2hpY2FsIFJDVSAocmN1dHJlZSkuCisKKworUHJlZW1wdGFibGUgUkNVIGRlYnVnZnMgRmlsZXMgYW5kIEZvcm1hdHMKKworVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBSQ1UgcHJvdmlkZXMgdGhyZWUgZGVidWdmcyBmaWxlcyB1bmRlciB0aGUKK3RvcC1sZXZlbCBkaXJlY3RvcnkgUkNVOiByY3UvcmN1Y3RycyAod2hpY2ggZGlzcGxheXMgdGhlIHBlci1DUFUKK2NvdW50ZXJzIHVzZWQgYnkgcHJlZW1wdGFibGUgUkNVKSByY3UvcmN1Z3AgKHdoaWNoIGRpc3BsYXlzIGdyYWNlLXBlcmlvZAorY291bnRlcnMpLCBhbmQgcmN1L3JjdXN0YXRzICh3aGljaCBpbnRlcm5hbCBjb3VudGVycyBmb3IgZGVidWdnaW5nIFJDVSkuCisKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1Y3RycyIgbG9va3MgYXMgZm9sbG93czoKKworQ1BVIGxhc3QgY3VyIEYgTQorICAwICAgIDUgIC01IDAgMAorICAxICAgLTEgICAwIDAgMAorICAyICAgIDAgICAxIDAgMAorICAzICAgIDAgICAxIDAgMAorICA0ICAgIDAgICAxIDAgMAorICA1ICAgIDAgICAxIDAgMAorICA2ICAgIDAgICAyIDAgMAorICA3ICAgIDAgIC0xIDAgMAorICA4ICAgIDAgICAxIDAgMAorZ2dwID0gMjYyMjYsIHN0YXRlID0gd2FpdHplcm8KKworVGhlIHBlci1DUFUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCSJDUFUiIGdpdmVzIHRoZSBDUFUgbnVtYmVyLiAgT2ZmbGluZSBDUFVzIGFyZSBub3QgZGlzcGxheWVkLgorCitvCSJsYXN0IiBnaXZlcyB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgdGhhdCBpcyBiZWluZyBkZWNyZW1lbnRlZAorCWZvciB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QgcGhhc2UuICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwKKwl0aGUgY291bnRlcnMgc3VtIHRvIDQsIGluZGljYXRpbmcgdGhhdCB0aGVyZSBhcmUgc3RpbGwgZm91cgorCVJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgc3RpbGwgcnVubmluZyB0aGF0IHN0YXJ0ZWQKKwliZWZvcmUgdGhlIGxhc3QgY291bnRlciBmbGlwLgorCitvCSJjdXIiIGdpdmVzIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZworCWJvdGggaW5jcmVtZW50ZWQgKGJ5IHJjdV9yZWFkX2xvY2soKSkgYW5kIGRlY3JlbWVudGVkIChieQorCXJjdV9yZWFkX3VubG9jaygpKS4gIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgY291bnRlcnMgc3VtIHRvCisJMSwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbgorCXN0aWxsIHJ1bm5pbmcgdGhhdCBzdGFydGVkIGFmdGVyIHRoZSBsYXN0IGNvdW50ZXIgZmxpcC4KKworbwkiRiIgaW5kaWNhdGVzIHdoZXRoZXIgUkNVIGlzIHdhaXRpbmcgZm9yIHRoaXMgQ1BVIHRvIGFja25vd2xlZGdlCisJYSBjb3VudGVyIGZsaXAuICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgUkNVIGlzIG5vdCB3YWl0aW5nIG9uIGFueSwKKwl3aGljaCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHN0YXRlIGJlaW5nICJ3YWl0emVybyIgcmF0aGVyIHRoYW4KKwkid2FpdGFjayIuCisKK28JIk0iIGluZGljYXRlcyB3aGV0aGVyIFJDVSBpcyB3YWl0aW5nIGZvciB0aGlzIENQVSB0byBleGVjdXRlIGEKKwltZW1vcnkgYmFycmllci4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCBSQ1UgaXMgbm90IHdhaXRpbmcgb24gYW55LAorCXdoaWNoIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RhdGUgYmVpbmcgIndhaXR6ZXJvIiByYXRoZXIgdGhhbgorCSJ3YWl0bWIiLgorCitvCSJnZ3AiIGlzIHRoZSBnbG9iYWwgZ3JhY2UtcGVyaW9kIGNvdW50ZXIuCisKK28JInN0YXRlIiBpcyB0aGUgUkNVIHN0YXRlLCB3aGljaCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKwlvCSJpZGxlIjogdGhlcmUgaXMgbm8gZ3JhY2UgcGVyaW9kIGluIHByb2dyZXNzLgorCisJbwkid2FpdGFjayI6IFJDVSBqdXN0IGluY3JlbWVudGVkIHRoZSBnbG9iYWwgZ3JhY2UtcGVyaW9kCisJCWNvdW50ZXIsIHdoaWNoIGhhcyB0aGUgZWZmZWN0IG9mIHJldmVyc2luZyB0aGUgcm9sZXMgb2YKKwkJdGhlICJsYXN0IiBhbmQgImN1ciIgY291bnRlcnMgYWJvdmUsIGFuZCBpcyB3YWl0aW5nIGZvcgorCQlhbGwgdGhlIENQVXMgdG8gYWNrbm93bGVkZ2UgdGhlIGZsaXAuICBPbmNlIHRoZSBmbGlwIGhhcworCQliZWVuIGFja25vd2xlZGdlZCwgQ1BVcyB3aWxsIG5vIGxvbmdlciBiZSBpbmNyZW1lbnRpbmcKKwkJd2hhdCBhcmUgbm93IHRoZSAibGFzdCIgY291bnRlcnMsIHNvIHRoYXQgdGhlaXIgc3VtIHdpbGwKKwkJZGVjcmVhc2UgbW9ub3RvbmljYWxseSBkb3duIHRvIHplcm8uCisKKwlvCSJ3YWl0emVybyI6IFJDVSBpcyB3YWl0aW5nIGZvciB0aGUgc3VtIG9mIHRoZSAibGFzdCIgY291bnRlcnMKKwkJdG8gZGVjcmVhc2UgdG8gemVyby4KKworCW8JIndhaXRtYiI6IFJDVSBpcyB3YWl0aW5nIGZvciBlYWNoIENQVSB0byBleGVjdXRlIGEgbWVtb3J5CisJCWJhcnJpZXIsIHdoaWNoIGVuc3VyZXMgdGhhdCBpbnN0cnVjdGlvbnMgZnJvbSBhIGdpdmVuIENQVSdzCisJCWxhc3QgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIGNhbm5vdCBiZSByZW9yZGVyZWQKKwkJd2l0aCBpbnN0cnVjdGlvbnMgZm9sbG93aW5nIHRoZSBtZW1vcnktYmFycmllciBpbnN0cnVjdGlvbi4KKworVGhlIG91dHB1dCBvZiAiY2F0IHJjdS9yY3VncCIgbG9va3MgYXMgZm9sbG93czoKKworb2xkZ2dwPTQ4ODcwICBuZXdnZ3A9NDg4NzMKKworTm90ZSB0aGF0IHJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgcHJvdm9rZXMgYSBzeW5jaHJvbml6ZV9yY3UoKS4gIFRoZQorIm9sZGdncCIgdmFsdWUgaXMgdGhhdCBvZiAiZ2dwIiBmcm9tIHJjdS9yY3VjdHJzIGFib3ZlLCB0YWtlbiBiZWZvcmUKK2V4ZWN1dGluZyB0aGUgc3luY2hyb25pemVfcmN1KCksIGFuZCB0aGUgIm5ld2dncCIgdmFsdWUgaXMgYWxzbyB0aGUKKyJnZ3AiIHZhbHVlLCBidXQgdGFrZW4gYWZ0ZXIgdGhlIHN5bmNocm9uaXplX3JjdSgpIGNvbW1hbmQgcmV0dXJucy4KKworCitUaGUgb3V0cHV0IG9mICJjYXQgcmN1L3JjdWdwIiBsb29rcyBhcyBmb2xsb3dzOgorCituYT0xMzM3OTU1IG5sPTQwIHdhPTEzMzc5MTUgd2w9NDQgZGE9MTMzNzg3MSBkbD0wIGRyPTEzMzc4NzEgZGk9MTMzNzg3MQorMT01MDk4OSBlMT02MTM4IGkxPTQ5NzIyIGllMT04MiBnMT00OTY0MCBhMT0zMTUyMDMgYWUxPTI2NTU2MyBhMj00OTY0MAorejE9MTQwMTI0NCB6ZTE9MTM1MTYwNSB6Mj00OTYzOSBtMT01NjYxMjUzIG1lMT01NjExNjE0IG0yPTQ5NjM5CisKK1RoZXNlIGFyZSBjb3VudGVycyB0cmFja2luZyBpbnRlcm5hbCBwcmVlbXB0YWJsZS1SQ1UgZXZlbnRzLCBob3dldmVyLAorc29tZSBvZiB0aGVtIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbGdvcml0aG1zIHVzaW5nIFJDVS4gIEluCitwYXJ0aWN1bGFyLCB0aGUgIm5sIiwgIndsIiwgYW5kICJkbCIgdmFsdWVzIHRyYWNrIHRoZSBudW1iZXIgb2YgUkNVCitjYWxsYmFja3MgaW4gdmFyaW91cyBzdGF0ZXMuICBUaGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCSJuYSIgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBSQ1UgY2FsbGJhY2tzIHRoYXQgaGF2ZSBiZWVuIGVucXVldWVkCisJc2luY2UgYm9vdC4KKworbwkibmwiIGlzIHRoZSBudW1iZXIgb2YgUkNVIGNhbGxiYWNrcyB3YWl0aW5nIGZvciB0aGUgcHJldmlvdXMKKwlncmFjZSBwZXJpb2QgdG8gZW5kIHNvIHRoYXQgdGhleSBjYW4gc3RhcnQgd2FpdGluZyBvbiB0aGUgbmV4dAorCWdyYWNlIHBlcmlvZC4KKworbwkid2EiIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgUkNVIGNhbGxiYWNrcyB0aGF0IGhhdmUgc3RhcnRlZCB3YWl0aW5nCisJZm9yIGEgZ3JhY2UgcGVyaW9kIHNpbmNlIGJvb3QuICAibmEiIHNob3VsZCBiZSByb3VnaGx5IGVxdWFsIHRvCisJIm5sIiBwbHVzICJ3YSIuCisKK28JIndsIiBpcyB0aGUgbnVtYmVyIG9mIFJDVSBjYWxsYmFja3MgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZWlyCisJZ3JhY2UgcGVyaW9kIHRvIGVuZC4KKworbwkiZGEiIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgUkNVIGNhbGxiYWNrcyB3aG9zZSBncmFjZSBwZXJpb2RzCisJaGF2ZSBjb21wbGV0ZWQgc2luY2UgYm9vdC4gICJ3YSIgc2hvdWxkIGJlIHJvdWdobHkgZXF1YWwgdG8KKwkid2wiIHBsdXMgImRhIi4KKworbwkiZHIiIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgUkNVIGNhbGxiYWNrcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkCisJZnJvbSB0aGUgbGlzdCBvZiBjYWxsYmFja3MgcmVhZHkgdG8gaW52b2tlLiAgImRyIiBzaG91bGQgYmUgcm91Z2hseQorCWVxdWFsIHRvICJkYSIuCisKK28JImRpIiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFJDVSBjYWxsYmFja3MgdGhhdCBoYXZlIGJlZW4gaW52b2tlZAorCXNpbmNlIGJvb3QuICAiZGkiIHNob3VsZCBiZSByb3VnaGx5IGVxdWFsIHRvICJkYSIsIHRob3VnaCBzb21lCisJZWFybHkgdmVyc2lvbnMgb2YgcHJlZW1wdGFibGUgUkNVIGhhZCBhIGJ1ZyBzbyB0aGF0IG9ubHkgdGhlCisJbGFzdCBDUFUncyBjb3VudCBvZiBpbnZvY2F0aW9ucyB3YXMgZGlzcGxheWVkLCByYXRoZXIgdGhhbiB0aGUKKwlzdW0gb2YgYWxsIENQVSdzIGNvdW50cy4KKworbwkiMSIgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byByY3VfdHJ5X2ZsaXAoKS4gIFRoaXMgc2hvdWxkIGJlCisJcm91Z2hseSBlcXVhbCB0byB0aGUgc3VtIG9mICJlMSIsICJpMSIsICJhMSIsICJ6MSIsIGFuZCAibTEiCisJZGVzY3JpYmVkIGJlbG93LiAgSW4gb3RoZXIgd29yZHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAorCXRoZSBzdGF0ZSBtYWNoaW5lIGlzIHZpc2l0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlCisJbnVtYmVyIG9mIHRpbWVzIHRoYXQgZWFjaCBzdGF0ZSBpcyB2aXNpdGVkIHBsdXMgdGhlIG51bWJlciBvZgorCXRpbWVzIHRoYXQgdGhlIHN0YXRlLW1hY2hpbmUgbG9jayBhY3F1aXNpdGlvbiBmYWlsZWQuCisKK28JImUxIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgcmN1X3RyeV9mbGlwKCkgd2FzIHVuYWJsZSB0bworCWFjcXVpcmUgdGhlIGZsaXBsb2NrLgorCitvCSJpMSIgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byByY3VfdHJ5X2ZsaXBfaWRsZSgpLgorCitvCSJpZTEiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgcmN1X3RyeV9mbGlwX2lkbGUoKSBleGl0ZWQgZWFybHkKKwlkdWUgdG8gdGhlIGNhbGxpbmcgQ1BVIGhhdmluZyBubyB3b3JrIGZvciBSQ1UuCisKK28JImcxIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgcmN1X3RyeV9mbGlwX2lkbGUoKSBkZWNpZGVkCisJdG8gc3RhcnQgYSBuZXcgZ3JhY2UgcGVyaW9kLiAgImkxIiBzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0bworCSJpZTEiIHBsdXMgImcxIi4KKworbwkiYTEiIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gcmN1X3RyeV9mbGlwX3dhaXRhY2soKS4KKworbwkiYWUxIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgcmN1X3RyeV9mbGlwX3dhaXRhY2soKSBmb3VuZAorCXRoYXQgYXQgbGVhc3Qgb25lIENQVSBoYWQgbm90IHlldCBhY2tub3dsZWRnZSB0aGUgbmV3IGdyYWNlIHBlcmlvZAorCShBS0EgImNvdW50ZXIgZmxpcCIpLgorCitvCSJhMiIgaXMgdGhlIG51bWJlciBvZiB0aW1lIHJjdV90cnlfZmxpcF93YWl0YWNrKCkgZm91bmQgdGhhdAorCWFsbCBDUFVzIGhhZCBhY2tub3dsZWRnZWQuICAiYTEiIHNob3VsZCBiZSByb3VnaGx5IGVxdWFsIHRvCisJImFlMSIgcGx1cyAiYTIiLiAgKFRoaXMgcGFydGljdWxhciBvdXRwdXQgd2FzIGNvbGxlY3RlZCBvbgorCWEgMTI4LUNQVSBtYWNoaW5lLCBoZW5jZSB0aGUgc21hbGxlci10aGFuLXVzdWFsIGZyYWN0aW9uIG9mCisJY2FsbHMgdG8gcmN1X3RyeV9mbGlwX3dhaXRhY2soKSBmaW5kaW5nIGFsbCBDUFVzIGhhdmluZyBhbHJlYWR5CisJYWNrbm93bGVkZ2VkLikKKworbwkiejEiIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gcmN1X3RyeV9mbGlwX3dhaXR6ZXJvKCkuCisKK28JInplMSIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHJjdV90cnlfZmxpcF93YWl0emVybygpIGZvdW5kCisJdGhhdCBub3QgYWxsIG9mIHRoZSBvbGQgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBoYWQKKwljb21wbGV0ZWQuCisKK28JInoyIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgcmN1X3RyeV9mbGlwX3dhaXR6ZXJvKCkgZmluZHMKKwl0aGUgc3VtIG9mIHRoZSBjb3VudGVycyBlcXVhbCB0byB6ZXJvLCBpbiBvdGhlciB3b3JkcywgdGhhdAorCWFsbCBvZiB0aGUgb2xkIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgaGFkIGNvbXBsZXRlZC4KKwlUaGUgdmFsdWUgb2YgInoxIiBzaG91bGQgYmUgcm91Z2hseSBlcXVhbCB0byAiemUxIiBwbHVzCisJInoyIi4KKworbwkibTEiIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gcmN1X3RyeV9mbGlwX3dhaXRtYigpLgorCitvCSJtZTEiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCByY3VfdHJ5X2ZsaXBfd2FpdG1iKCkgZmluZHMKKwl0aGF0IGF0IGxlYXN0IG9uZSBDUFUgaGFzIG5vdCB5ZXQgZXhlY3V0ZWQgYSBtZW1vcnkgYmFycmllci4KKworbwkibTIiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCByY3VfdHJ5X2ZsaXBfd2FpdG1iKCkgZmluZHMgdGhhdAorCWFsbCBDUFVzIGhhdmUgZXhlY3V0ZWQgYSBtZW1vcnkgYmFycmllci4KKworCitIaWVyYXJjaGljYWwgUkNVIGRlYnVnZnMgRmlsZXMgYW5kIEZvcm1hdHMKKworVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBSQ1UgcHJvdmlkZXMgdGhyZWUgZGVidWdmcyBmaWxlcyB1bmRlciB0aGUKK3RvcC1sZXZlbCBkaXJlY3RvcnkgUkNVOiByY3UvcmN1ZGF0YSAod2hpY2ggZGlzcGxheXMgZmllbGRzIGluIHN0cnVjdAorcmN1X2RhdGEpLCByY3UvcmN1Z3AgKHdoaWNoIGRpc3BsYXlzIGdyYWNlLXBlcmlvZCBjb3VudGVycyksIGFuZAorcmN1L3JjdWhpZXIgKHdoaWNoIGRpc3BsYXlzIHRoZSBzdHJ1Y3QgcmN1X25vZGUgaGllcmFyY2h5KS4KKworVGhlIG91dHB1dCBvZiAiY2F0IHJjdS9yY3VkYXRhIiBsb29rcyBhcyBmb2xsb3dzOgorCityY3U6CisgIDAgYz00MDExIGc9NDAxMiBwcT0xIHBxYz00MDExIHFwPTAgcnBmcT0xIHJwPTNjMmEgZHQ9MjMzMDEvNzMgZG49MiBkZj0xODgyIG9mPTAgcmk9MjEyNiBxbD0yIGI9MTAKKyAgMSBjPTQwMTEgZz00MDEyIHBxPTEgcHFjPTQwMTEgcXA9MCBycGZxPTMgcnA9MzlhNiBkdD03ODA3My8xIGRuPTIgZGY9MTQwMiBvZj0wIHJpPTE4NzUgcWw9NDYgYj0xMAorICAyIGM9NDAxMCBnPTQwMTAgcHE9MSBwcWM9NDAxMCBxcD0wIHJwZnE9LTUgcnA9MWQxMiBkdD0xNjY0Ni8wIGRuPTIgZGY9MzE0MCBvZj0wIHJpPTIwODAgcWw9MCBiPTEwCisgIDMgYz00MDEyIGc9NDAxMyBwcT0xIHBxYz00MDEyIHFwPTEgcnBmcT0zIHJwPTJiNTAgZHQ9MjExNTkvMSBkbj0yIGRmPTIyMzAgb2Y9MCByaT0xOTIzIHFsPTcyIGI9MTAKKyAgNCBjPTQwMTIgZz00MDEzIHBxPTEgcHFjPTQwMTIgcXA9MSBycGZxPTMgcnA9MTY0NCBkdD01NzgzLzEgZG49MiBkZj0zMzQ4IG9mPTAgcmk9MjgwNSBxbD03IGI9MTAKKyAgNSBjPTQwMTIgZz00MDEzIHBxPTAgcHFjPTQwMTEgcXA9MSBycGZxPTMgcnA9MWFhYyBkdD01ODc5LzEgZG49MiBkZj0zMTQwIG9mPTAgcmk9MjA2NiBxbD0xMCBiPTEwCisgIDYgYz00MDEyIGc9NDAxMyBwcT0xIHBxYz00MDEyIHFwPTEgcnBmcT0zIHJwPWVkOCBkdD01ODQ3LzEgZG49MiBkZj0zNzk3IG9mPTAgcmk9MTI2NiBxbD0xMCBiPTEwCisgIDcgYz00MDEyIGc9NDAxMyBwcT0xIHBxYz00MDEyIHFwPTEgcnBmcT0zIHJwPTFmYTIgZHQ9NjE5OS8xIGRuPTIgZGY9Mjc5NSBvZj0wIHJpPTIxNjIgcWw9MjggYj0xMAorcmN1X2JoOgorICAwIGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0wIHJwZnE9LTE0NSBycD0yMWQ2IGR0PTIzMzAxLzczIGRuPTIgZGY9MCBvZj0wIHJpPTAgcWw9MCBiPTEwCisgIDEgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMTcwIHJwPTIwY2UgZHQ9NzgwNzMvMSBkbj0yIGRmPTI2IG9mPTAgcmk9NSBxbD0wIGI9MTAKKyAgMiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS04MyBycD1mYmQgZHQ9MTY2NDYvMCBkbj0yIGRmPTI4IG9mPTAgcmk9NCBxbD0wIGI9MTAKKyAgMyBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MCBycGZxPS0xMDUgcnA9MTc4YyBkdD0yMTE1OS8xIGRuPTIgZGY9Mjggb2Y9MCByaT0yIHFsPTAgYj0xMAorICA0IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTMwIHJwPWI1NCBkdD01NzgzLzEgZG49MiBkZj0zMiBvZj0wIHJpPTAgcWw9MCBiPTEwCisgIDUgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMjkgcnA9ZGY1IGR0PTU4NzkvMSBkbj0yIGRmPTMwIG9mPTAgcmk9MyBxbD0wIGI9MTAKKyAgNiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS0yOCBycD03ODggZHQ9NTg0Ny8xIGRuPTIgZGY9MzIgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA3IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTUzIHJwPTEwOTggZHQ9NjE5OS8xIGRuPTIgZGY9MzAgb2Y9MCByaT0zIHFsPTAgYj0xMAorCitUaGUgZmlyc3Qgc2VjdGlvbiBsaXN0cyB0aGUgcmN1X2RhdGEgc3RydWN0dXJlcyBmb3IgcmN1LCB0aGUgc2Vjb25kIGZvcgorcmN1X2JoLiAgRWFjaCBzZWN0aW9uIGhhcyBvbmUgbGluZSBwZXIgQ1BVLCBvciBlaWdodCBmb3IgdGhpcyA4LUNQVSBzeXN0ZW0uCitUaGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCVRoZSBudW1iZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgaXMgdGhlIENQVSBudW1iZXIuCisJQ1BVcyBudW1iZXJzIGZvbGxvd2VkIGJ5IGFuIGV4Y2xhbWF0aW9uIG1hcmsgYXJlIG9mZmxpbmUsCisJYnV0IGhhdmUgYmVlbiBvbmxpbmUgYXQgbGVhc3Qgb25jZSBzaW5jZSBib290LglUaGVyZSB3aWxsIGJlCisJbm8gb3V0cHV0IGZvciBDUFVzIHRoYXQgaGF2ZSBuZXZlciBiZWVuIG9ubGluZSwgd2hpY2ggY2FuIGJlCisJYSBnb29kIHRoaW5nIGluIHRoZSBzdXJwcmlzaW5nbHkgY29tbW9uIGNhc2Ugd2hlcmUgTlJfQ1BVUyBpcworCXN1YnN0YW50aWFsbHkgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBhY3R1YWwgQ1BVcy4KKworbwkiYyIgaXMgdGhlIGNvdW50IG9mIGdyYWNlIHBlcmlvZHMgdGhhdCB0aGlzIENQVSBiZWxpZXZlcyBoYXZlCisJY29tcGxldGVkLiAgQ1BVcyBpbiBkeW50aWNrcyBpZGxlIG1vZGUgbWF5IGxhZyBxdWl0ZSBhIHdheXMKKwliZWhpbmQsIGZvciBleGFtcGxlLCBDUFUgNCB1bmRlciAicmN1IiBhYm92ZSwgd2hpY2ggaGFzIHNsZXB0CisJdGhyb3VnaCB0aGUgcGFzdCAyNSBSQ1UgZ3JhY2UgcGVyaW9kcy4JSXQgaXMgbm90IHVudXN1YWwgdG8KKwlzZWUgQ1BVcyBsYWdnaW5nIGJ5IHRob3VzYW5kcyBvZiBncmFjZSBwZXJpb2RzLgorCitvCSJnIiBpcyB0aGUgY291bnQgb2YgZ3JhY2UgcGVyaW9kcyB0aGF0IHRoaXMgQ1BVIGJlbGlldmVzIGhhdmUKKwlzdGFydGVkLiAgQWdhaW4sIENQVXMgaW4gZHludGlja3MgaWRsZSBtb2RlIG1heSBsYWcgYmVoaW5kLgorCUlmIHRoZSAiYyIgYW5kICJnIiB2YWx1ZXMgYXJlIGVxdWFsLCB0aGlzIENQVSBoYXMgYWxyZWFkeQorCXJlcG9ydGVkIGEgcXVpZXNjZW50IHN0YXRlIGZvciB0aGUgbGFzdCBSQ1UgZ3JhY2UgcGVyaW9kIHRoYXQKKwlpdCBpcyBhd2FyZSBvZiwgb3RoZXJ3aXNlLCB0aGUgQ1BVIGJlbGlldmVzIHRoYXQgaXQgb3dlcyBSQ1UgYQorCXF1aWVzY2VudCBzdGF0ZS4KKworbwkicHEiIGluZGljYXRlcyB0aGF0IHRoaXMgQ1BVIGhhcyBwYXNzZWQgdGhyb3VnaCBhIHF1aWVzY2VudCBzdGF0ZQorCWZvciB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QuICBJdCBpcyBwb3NzaWJsZSBmb3IgInBxIiB0byBiZQorCSIxIiBhbmQgImMiIGRpZmZlcmVudCB0aGFuICJnIiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYWx0aG91Z2gKKwl0aGUgQ1BVIGhhcyBwYXNzZWQgdGhyb3VnaCBhIHF1aWVzY2VudCBzdGF0ZSwgZWl0aGVyICgxKSB0aGlzCisJQ1BVIGhhcyBub3QgeWV0IHJlcG9ydGVkIHRoYXQgZmFjdCwgKDIpIHNvbWUgb3RoZXIgQ1BVIGhhcyBub3QKKwl5ZXQgcmVwb3J0ZWQgZm9yIHRoaXMgZ3JhY2UgcGVyaW9kLCBvciAoMykgYm90aC4KKworbwkicHFjIiBpbmRpY2F0ZXMgd2hpY2ggZ3JhY2UgcGVyaW9kIHRoZSBsYXN0LW9ic2VydmVkIHF1aWVzY2VudAorCXN0YXRlIGZvciB0aGlzIENQVSBjb3JyZXNwb25kcyB0by4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBoYW5kbGluZworCXRoZSByYWNlIGJldHdlZW4gQ1BVIDAgcmVwb3J0aW5nIGFuIGV4dGVuZGVkIGR5bnRpY2tzLWlkbGUKKwlxdWllc2NlbnQgc3RhdGUgZm9yIENQVSAxIGFuZCBDUFUgMSBzdWRkZW5seSB3YWtpbmcgdXAgYW5kCisJcmVwb3J0aW5nIGl0cyBvd24gcXVpZXNjZW50IHN0YXRlLiAgSWYgQ1BVIDEgd2FzIHRoZSBsYXN0IENQVQorCWZvciB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QsIHRoZW4gdGhlIENQVSB0aGF0IGxvc2VzIHRoaXMgcmFjZQorCXdpbGwgYXR0ZW1wdCB0byBpbmNvcnJlY3RseSBtYXJrIENQVSAxIGFzIGhhdmluZyBjaGVja2VkIGluIGZvcgorCXRoZSBuZXh0IGdyYWNlIHBlcmlvZCEKKworbwkicXAiIGluZGljYXRlcyB0aGF0IFJDVSBzdGlsbCBleHBlY3RzIGEgcXVpZXNjZW50IHN0YXRlIGZyb20KKwl0aGlzIENQVS4KKworbwkicnBmcSIgaXMgdGhlIG51bWJlciBvZiByY3VfcGVuZGluZygpIGNhbGxzIG9uIHRoaXMgQ1BVIHJlcXVpcmVkCisJdG8gaW5kdWNlIHRoaXMgQ1BVIHRvIGludm9rZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKS4KKworbwkicnAiIGlzIGxvdy1vcmRlciBmb3VyIGhleCBkaWdpdHMgb2YgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzCisJcmN1X3BlbmRpbmcoKSBoYXMgYmVlbiBpbnZva2VkIG9uIHRoaXMgQ1BVLgorCitvCSJkdCIgaXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGR5bnRpY2sgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkCisJd2hlbiBlbnRlcmluZyBvciBsZWF2aW5nIGR5bnRpY2tzIGlkbGUgc3RhdGUsIGVpdGhlciBieSB0aGUKKwlzY2hlZHVsZXIgb3IgYnkgaXJxLiAgVGhlIG51bWJlciBhZnRlciB0aGUgIi8iIGlzIHRoZSBpbnRlcnJ1cHQKKwluZXN0aW5nIGRlcHRoIHdoZW4gaW4gZHludGljay1pZGxlIHN0YXRlLCBvciBvbmUgZ3JlYXRlciB0aGFuCisJdGhlIGludGVycnVwdC1uZXN0aW5nIGRlcHRoIG90aGVyd2lzZS4KKworCVRoaXMgZmllbGQgaXMgZGlzcGxheWVkIG9ubHkgZm9yIENPTkZJR19OT19IWiBrZXJuZWxzLgorCitvCSJkbiIgaXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGR5bnRpY2sgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkCisJd2hlbiBlbnRlcmluZyBvciBsZWF2aW5nIGR5bnRpY2tzIGlkbGUgc3RhdGUgdmlhIE5NSS4gIElmIGJvdGgKKwl0aGUgImR0IiBhbmQgImRuIiB2YWx1ZXMgYXJlIGV2ZW4sIHRoZW4gdGhpcyBDUFUgaXMgaW4gZHludGlja3MKKwlpZGxlIG1vZGUgYW5kIG1heSBiZSBpZ25vcmVkIGJ5IFJDVS4gIElmIGVpdGhlciBvZiB0aGVzZSB0d28KKwljb3VudGVycyBpcyBvZGQsIHRoZW4gUkNVIG11c3QgYmUgYWxlcnQgdG8gdGhlIHBvc3NpYmlsaXR5IG9mCisJYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIHJ1bm5pbmcgb24gdGhpcyBDUFUuCisKKwlUaGlzIGZpZWxkIGlzIGRpc3BsYXllZCBvbmx5IGZvciBDT05GSUdfTk9fSFoga2VybmVscy4KKworbwkiZGYiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzb21lIG90aGVyIENQVSBoYXMgZm9yY2VkIGEKKwlxdWllc2NlbnQgc3RhdGUgb24gYmVoYWxmIG9mIHRoaXMgQ1BVIGR1ZSB0byB0aGlzIENQVSBiZWluZyBpbgorCWR5bnRpY2tzLWlkbGUgc3RhdGUuCisKKwlUaGlzIGZpZWxkIGlzIGRpc3BsYXllZCBvbmx5IGZvciBDT05GSUdfTk9fSFoga2VybmVscy4KKworbwkib2YiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBzb21lIG90aGVyIENQVSBoYXMgZm9yY2VkIGEKKwlxdWllc2NlbnQgc3RhdGUgb24gYmVoYWxmIG9mIHRoaXMgQ1BVIGR1ZSB0byB0aGlzIENQVSBiZWluZworCW9mZmxpbmUuICBJbiBhIHBlcmZlY3Qgd29ybGQsIHRoaXMgbWlnaHQgbmV2ZSBoYXBwZW4sIGJ1dCBpdAorCXR1cm5zIG91dCB0aGF0IG9mZmxpbmluZyBhbmQgb25saW5pbmcgYSBDUFUgY2FuIHRha2Ugc2V2ZXJhbCBncmFjZQorCXBlcmlvZHMsIGFuZCBzbyB0aGVyZSBpcyBsaWtlbHkgdG8gYmUgYW4gZXh0ZW5kZWQgcGVyaW9kIG9mIHRpbWUKKwl3aGVuIFJDVSBiZWxpZXZlcyB0aGF0IHRoZSBDUFUgaXMgb25saW5lIHdoZW4gaXQgcmVhbGx5IGlzIG5vdC4KKwlQbGVhc2Ugbm90ZSB0aGF0IGVycmluZyBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIChSQ1UgYmVsaWV2aW5nIGEKKwlDUFUgaXMgb2ZmbGluZSB3aGVuIGl0IGlzIHJlYWxseSBhbGl2ZSBhbmQga2lja2luZykgaXMgYSBmYXRhbAorCWVycm9yLCBzbyBpdCBtYWtlcyBzZW5zZSB0byBlcnIgY29uc2VydmF0aXZlbHkuCisKK28JInJpIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgUkNVIGhhcyBzZWVuIGZpdCB0byBzZW5kIGEKKwlyZXNjaGVkdWxlIElQSSB0byB0aGlzIENQVSBpbiBvcmRlciB0byBnZXQgaXQgdG8gcmVwb3J0IGEKKwlxdWllc2NlbnQgc3RhdGUuCisKK28JInFsIiBpcyB0aGUgbnVtYmVyIG9mIFJDVSBjYWxsYmFja3MgY3VycmVudGx5IHJlc2lkaW5nIG9uCisJdGhpcyBDUFUuICBUaGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FsbGJhY2tzLCByZWdhcmRsZXNzCisJb2Ygd2hhdCBzdGF0ZSB0aGV5IGFyZSBpbiAobmV3LCB3YWl0aW5nIGZvciBncmFjZSBwZXJpb2QgdG8KKwlzdGFydCwgd2FpdGluZyBmb3IgZ3JhY2UgcGVyaW9kIHRvIGVuZCwgcmVhZHkgdG8gaW52b2tlKS4KKworbwkiYiIgaXMgdGhlIGJhdGNoIGxpbWl0IGZvciB0aGlzIENQVS4gIElmIG1vcmUgdGhhbiB0aGlzIG51bWJlcgorCW9mIFJDVSBjYWxsYmFja3MgaXMgcmVhZHkgdG8gaW52b2tlLCB0aGVuIHRoZSByZW1haW5kZXIgd2lsbAorCWJlIGRlZmVycmVkLgorCisKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1Z3AiIGxvb2tzIGFzIGZvbGxvd3M6CisKK3JjdTogY29tcGxldGVkPTMzMDYyICBncG51bT0zMzA2MworcmN1X2JoOiBjb21wbGV0ZWQ9NDY0ICBncG51bT00NjQKKworQWdhaW4sIHRoaXMgb3V0cHV0IGlzIGZvciBib3RoICJyY3UiIGFuZCAicmN1X2JoIi4gIFRoZSBmaWVsZHMgYXJlCit0YWtlbiBmcm9tIHRoZSByY3Vfc3RhdGUgc3RydWN0dXJlLCBhbmQgYXJlIGFzIGZvbGxvd3M6CisKK28JImNvbXBsZXRlZCIgaXMgdGhlIG51bWJlciBvZiBncmFjZSBwZXJpb2RzIHRoYXQgaGF2ZSBjb21wbGV0ZWQuCisJSXQgaXMgY29tcGFyYWJsZSB0byB0aGUgImMiIGZpZWxkIGZyb20gcmN1L3JjdWRhdGEgaW4gdGhhdCBhCisJQ1BVIHdob3NlICJjIiBmaWVsZCBtYXRjaGVzIHRoZSB2YWx1ZSBvZiAiY29tcGxldGVkIiBpcyBhd2FyZQorCXRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgUkNVIGdyYWNlIHBlcmlvZCBoYXMgY29tcGxldGVkLgorCitvCSJncG51bSIgaXMgdGhlIG51bWJlciBvZiBncmFjZSBwZXJpb2RzIHRoYXQgaGF2ZSBzdGFydGVkLiAgSXQgaXMKKwljb21wYXJhYmxlIHRvIHRoZSAiZyIgZmllbGQgZnJvbSByY3UvcmN1ZGF0YSBpbiB0aGF0IGEgQ1BVCisJd2hvc2UgImciIGZpZWxkIG1hdGNoZXMgdGhlIHZhbHVlIG9mICJncG51bSIgaXMgYXdhcmUgdGhhdCB0aGUKKwljb3JyZXNwb25kaW5nIFJDVSBncmFjZSBwZXJpb2QgaGFzIHN0YXJ0ZWQuCisKKwlJZiB0aGVzZSB0d28gZmllbGRzIGFyZSBlcXVhbCAoYXMgdGhleSBhcmUgZm9yICJyY3VfYmgiIGFib3ZlKSwKKwl0aGVuIHRoZXJlIGlzIG5vIGdyYWNlIHBlcmlvZCBpbiBwcm9ncmVzcywgaW4gb3RoZXIgd29yZHMsIFJDVQorCWlzIGlkbGUuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIHR3byBmaWVsZHMgZGlmZmVyIChhcyB0aGV5CisJZG8gZm9yICJyY3UiIGFib3ZlKSwgdGhlbiBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGlzIGluIHByb2dyZXNzLgorCisKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1aGllciIgbG9va3MgYXMgZm9sbG93cywgd2l0aCB2ZXJ5IGxvbmcgbGluZXM6CisKK2M9NjkwMiBnPTY5MDMgcz0yIGpmcT0zIGo9NzJjNyBuZnFzPTEzMTQyL25mcXNuZz0wKDEzMTQyKSBmcWxoPTYKKzEvMSAwOjEyNyBeMCAgICAKKzMvMyAwOjM1IF4wICAgIDAvMCAzNjo3MSBeMSAgICAwLzAgNzI6MTA3IF4yICAgIDAvMCAxMDg6MTI3IF4zICAgIAorMy8zZiAwOjUgXjAgICAgMi8zIDY6MTEgXjEgICAgMC8wIDEyOjE3IF4yICAgIDAvMCAxODoyMyBeMyAgICAwLzAgMjQ6MjkgXjQgICAgMC8wIDMwOjM1IF41ICAgIDAvMCAzNjo0MSBeMCAgICAwLzAgNDI6NDcgXjEgICAgMC8wIDQ4OjUzIF4yICAgIDAvMCA1NDo1OSBeMyAgICAwLzAgNjA6NjUgXjQgICAgMC8wIDY2OjcxIF41ICAgIDAvMCA3Mjo3NyBeMCAgICAwLzAgNzg6ODMgXjEgICAgMC8wIDg0Ojg5IF4yICAgIDAvMCA5MDo5NSBeMyAgICAwLzAgOTY6MTAxIF40ICAgIDAvMCAxMDI6MTA3IF41ICAgIDAvMCAxMDg6MTEzIF4wICAgIDAvMCAxMTQ6MTE5IF4xICAgIDAvMCAxMjA6MTI1IF4yICAgIDAvMCAxMjY6MTI3IF4zICAgIAorcmN1X2JoOgorYz0tMjI2IGc9LTIyNiBzPTEgamZxPS01NzAxIGo9NzJjNyBuZnFzPTg4L25mcXNuZz0wKDg4KSBmcWxoPTAKKzAvMSAwOjEyNyBeMCAgICAKKzAvMyAwOjM1IF4wICAgIDAvMCAzNjo3MSBeMSAgICAwLzAgNzI6MTA3IF4yICAgIDAvMCAxMDg6MTI3IF4zICAgIAorMC8zZiAwOjUgXjAgICAgMC8zIDY6MTEgXjEgICAgMC8wIDEyOjE3IF4yICAgIDAvMCAxODoyMyBeMyAgICAwLzAgMjQ6MjkgXjQgICAgMC8wIDMwOjM1IF41ICAgIDAvMCAzNjo0MSBeMCAgICAwLzAgNDI6NDcgXjEgICAgMC8wIDQ4OjUzIF4yICAgIDAvMCA1NDo1OSBeMyAgICAwLzAgNjA6NjUgXjQgICAgMC8wIDY2OjcxIF41ICAgIDAvMCA3Mjo3NyBeMCAgICAwLzAgNzg6ODMgXjEgICAgMC8wIDg0Ojg5IF4yICAgIDAvMCA5MDo5NSBeMyAgICAwLzAgOTY6MTAxIF40ICAgIDAvMCAxMDI6MTA3IF41ICAgIDAvMCAxMDg6MTEzIF4wICAgIDAvMCAxMTQ6MTE5IF4xICAgIDAvMCAxMjA6MTI1IF4yICAgIDAvMCAxMjY6MTI3IF4zCisKK1RoaXMgaXMgb25jZSBhZ2FpbiBzcGxpdCBpbnRvICJyY3UiIGFuZCAicmN1X2JoIiBwb3J0aW9ucy4gIFRoZSBmaWVsZHMgYXJlCithcyBmb2xsb3dzOgorCitvCSJjIiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzICJjb21wbGV0ZWQiIHVuZGVyIHJjdS9yY3VncC4KKworbwkiZyIgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyAiZ3BudW0iIHVuZGVyIHJjdS9yY3VncC4KKworbwkicyIgaXMgdGhlICJzaWduYWxlZCIgc3RhdGUgdGhhdCBkcml2ZXMgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkncworCXN0YXRlIG1hY2hpbmUuCisKK28JImpmcSIgaXMgdGhlIG51bWJlciBvZiBqaWZmaWVzIHJlbWFpbmluZyBmb3IgdGhpcyBncmFjZSBwZXJpb2QKKwliZWZvcmUgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCkgaXMgaW52b2tlZCB0byBoZWxwIHB1c2ggdGhpbmdzCisJYWxvbmcuICBOb3RlIHRoYXQgQ1BVcyBpbiBkeW50aWNrLWlkbGUgbW9kZSB0aG91Z2hvdXQgdGhlIGdyYWNlCisJcGVyaW9kIHdpbGwgbm90IHJlcG9ydCBvbiB0aGVpciBvd24sIGJ1dCByYXRoZXIgbXVzdCBiZSBjaGVjayBieQorCXNvbWUgb3RoZXIgQ1BVIHZpYSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKS4KKworbwkiaiIgaXMgdGhlIGxvdy1vcmRlciBmb3VyIGhleCBkaWdpdHMgb2YgdGhlIGppZmZpZXMgY291bnRlci4KKwlZZXMsIFBhdWwgZGlkIHJ1biBpbnRvIGEgbnVtYmVyIG9mIHByb2JsZW1zIHRoYXQgdHVybmVkIG91dCB0bworCWJlIGR1ZSB0byB0aGUgamlmZmllcyBjb3VudGVyIG5vIGxvbmdlciBjb3VudGluZy4gIFdoeSBkbyB5b3UgYXNrPworCitvCSJuZnFzIiBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpIHNpbmNlCisJYm9vdC4KKworbwkibmZxc25nIiBpcyB0aGUgbnVtYmVyIG9mIHVzZWxlc3MgY2FsbHMgdG8gZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksCisJd2hlcmUgdGhlcmUgd2Fzbid0IGFjdHVhbGx5IGEgZ3JhY2UgcGVyaW9kIGFjdGl2ZS4gIFRoaXMgY2FuCisJaGFwcGVuIGR1ZSB0byByYWNlcy4gIFRoZSBudW1iZXIgaW4gcGFyZW50aGVzZXMgaXMgdGhlIGRpZmZlcmVuY2UKKwliZXR3ZWVuICJuZnFzIiBhbmQgIm5mcXNuZyIsIG9yIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAorCWZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpIGFjdHVhbGx5IGRpZCBzb21lIHJlYWwgd29yay4KKworbwkiZnFsaCIgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKSB0aGF0CisJZXhpdGVkIGltbWVkaWF0ZWx5ICh3aXRob3V0IGV2ZW4gYmVpbmcgY291bnRlZCBpbiBuZnFzIGFib3ZlKQorCWR1ZSB0byBjb250ZW50aW9uIG9uIC0+ZnFzbG9jay4KKworbwlFYWNoIGVsZW1lbnQgb2YgdGhlIGZvcm0gIjEvMSAwOjEyNyBeMCIgcmVwcmVzZW50cyBvbmUgc3RydWN0CisJcmN1X25vZGUuICBFYWNoIGxpbmUgcmVwcmVzZW50cyBvbmUgbGV2ZWwgb2YgdGhlIGhpZXJhcmNoeSwgZnJvbQorCXJvb3QgdG8gbGVhdmVzLiAgSXQgaXMgYmVzdCB0byB0aGluayBvZiB0aGUgcmN1X2RhdGEgc3RydWN0dXJlcworCWFzIGZvcm1pbmcgeWV0IGFub3RoZXIgbGV2ZWwgYWZ0ZXIgdGhlIGxlYXZlcy4gIE5vdGUgdGhhdCB0aGVyZQorCW1pZ2h0IGJlIGVpdGhlciBvbmUsIHR3bywgb3IgdGhyZWUgbGV2ZWxzIG9mIHJjdV9ub2RlIHN0cnVjdHVyZXMsCisJZGVwZW5kaW5nIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBDT05GSUdfUkNVX0ZBTk9VVCBhbmQKKwlDT05GSUdfTlJfQ1BVUy4KKwkKKwlvCVRoZSBudW1iZXJzIHNlcGFyYXRlZCBieSB0aGUgIi8iIGFyZSB0aGUgcXNtYXNrIGZvbGxvd2VkCisJCWJ5IHRoZSBxc21hc2tpbml0LiAgVGhlIHFzbWFzayB3aWxsIGhhdmUgb25lIGJpdAorCQlzZXQgZm9yIGVhY2ggZW50aXR5IGluIHRoZSBuZXh0IGxvd2VyIGxldmVsIHRoYXQKKwkJaGFzIG5vdCB5ZXQgY2hlY2tlZCBpbiBmb3IgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kLgorCQlUaGUgcXNtYXNraW5pdCB3aWxsIGhhdmUgb25lIGJpdCBmb3IgZWFjaCBlbnRpdHkgdGhhdCBpcworCQljdXJyZW50bHkgZXhwZWN0ZWQgdG8gY2hlY2sgaW4gZHVyaW5nIGVhY2ggZ3JhY2UgcGVyaW9kLgorCQlUaGUgdmFsdWUgb2YgcXNtYXNraW5pdCBpcyBhc3NpZ25lZCB0byB0aGF0IG9mIHFzbWFzaworCQlhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZ3JhY2UgcGVyaW9kLgorCisJCUZvciBleGFtcGxlLCBmb3IgInJjdSIsIHRoZSBxc21hc2sgb2YgdGhlIGZpcnN0IGVudHJ5CisJCW9mIHRoZSBsb3dlc3QgbGV2ZWwgaXMgMHgxNCwgbWVhbmluZyB0aGF0IHdlIGFyZSBzdGlsbAorCQl3YWl0aW5nIGZvciBDUFVzIDIgYW5kIDQgdG8gY2hlY2sgaW4gZm9yIHRoZSBjdXJyZW50CisJCWdyYWNlIHBlcmlvZC4KKworCW8JVGhlIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHRoZSAiOiIgYXJlIHRoZSByYW5nZSBvZiBDUFVzCisJCXNlcnZlZCBieSB0aGlzIHN0cnVjdCByY3Vfbm9kZS4gIFRoaXMgY2FuIGJlIGhlbHBmdWwKKwkJaW4gd29ya2luZyBvdXQgaG93IHRoZSBoaWVyYXJjaHkgaXMgd2lyZWQgdG9nZXRoZXIuCisKKwkJRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBlbnRyeSBhdCB0aGUgbG93ZXN0IGxldmVsIHNob3dzCisJCSIwOjUiLCBpbmRpY2F0aW5nIHRoYXQgaXQgY292ZXJzIENQVXMgMCB0aHJvdWdoIDUuCisKKwlvCVRoZSBudW1iZXIgYWZ0ZXIgdGhlICJeIiBpbmRpY2F0ZXMgdGhlIGJpdCBpbiB0aGUKKwkJbmV4dCBoaWdoZXIgbGV2ZWwgcmN1X25vZGUgc3RydWN0dXJlIHRoYXQgdGhpcworCQlyY3Vfbm9kZSBzdHJ1Y3R1cmUgY29ycmVzcG9uZHMgdG8uCisKKwkJRm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBlbnRyeSBhdCB0aGUgbG93ZXN0IGxldmVsIHNob3dzCisJCSJeMCIsIGluZGljYXRpbmcgdGhhdCBpdCBjb3JyZXNwb25kcyB0byBiaXQgemVybyBpbgorCQl0aGUgZmlyc3QgZW50cnkgYXQgdGhlIG1pZGRsZSBsZXZlbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL3B4YS9tZnAudHh0IGIvRG9jdW1lbnRhdGlvbi9hcm0vcHhhL21mcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3OWU1YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL3B4YS9tZnAudHh0CkBAIC0wLDAgKzEsMjg2IEBACisgICAgICAgICAgICAgICAgIE1GUCBDb25maWd1cmF0aW9uIGZvciBQWEEyeHgvUFhBM3h4IFByb2Nlc3NvcnMKKworCQkJRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+CisKK01GUCBzdGFuZHMgZm9yIE11bHRpLUZ1bmN0aW9uIFBpbiwgd2hpY2ggaXMgdGhlIHBpbi1tdXggbG9naWMgb24gUFhBM3h4IGFuZAorbGF0ZXIgUFhBIHNlcmllcyBwcm9jZXNzb3JzLiAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGV4aXN0aW5nIE1GUCBBUEksCithbmQgaG93IGJvYXJkL3BsYXRmb3JtIGRyaXZlciBhdXRob3JzIGNvdWxkIG1ha2UgdXNlIG9mIGl0LgorCisgQmFzaWMgQ29uY2VwdAorPT09PT09PT09PT09PT09CisKK1VubGlrZSB0aGUgR1BJTyBhbHRlcm5hdGUgZnVuY3Rpb24gc2V0dGluZ3Mgb24gUFhBMjV4IGFuZCBQWEEyN3gsIGEgbmV3IE1GUAorbWVjaGFuaXNtIGlzIGludHJvZHVjZWQgZnJvbSBQWEEzeHggdG8gY29tcGxldGVseSBtb3ZlIHRoZSBwaW4tbXV4IGZ1bmN0aW9ucworb3V0IG9mIHRoZSBHUElPIGNvbnRyb2xsZXIuIEluIGFkZGl0aW9uIHRvIHBpbi1tdXggY29uZmlndXJhdGlvbnMsIHRoZSBNRlAKK2Fsc28gY29udHJvbHMgdGhlIGxvdyBwb3dlciBzdGF0ZSwgZHJpdmluZyBzdHJlbmd0aCwgcHVsbC11cC9kb3duIGFuZCBldmVudAorZGV0ZWN0aW9uIG9mIGVhY2ggcGluLiAgQmVsb3cgaXMgYSBkaWFncmFtIG9mIGludGVybmFsIGNvbm5lY3Rpb25zIGJldHdlZW4KK3RoZSBNRlAgbG9naWMgYW5kIHRoZSByZW1haW5pbmcgU29DIHBlcmlwaGVyYWxzOgorCisgKy0tLS0tLS0tKworIHwgICAgICAgIHwtLShHUElPMTkpLS0rCisgfCAgR1BJTyAgfCAgICAgICAgICAgIHwKKyB8ICAgICAgICB8LS0oR1BJTy4uLikgfAorICstLS0tLS0tLSsgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0tLSsKKyArLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLT58ICAgICAgICAgfAorIHwgIFBXTTIgIHwtLShQV01fT1VUKS0tLS0tLS0tPnwgICBNRlAgICB8CisgKy0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0+fCAgICAgICAgIHwtLS0tLS0tPiB0byBleHRlcm5hbCBQQUQKKyAgICAgICAgICAgICAgICAgICAgICAgfCArLS0tLT58ICAgICAgICAgfAorICstLS0tLS0tLSsgICAgICAgICAgICB8IHwgKy0tPnwgICAgICAgICB8CisgfCAgU1NQMiAgfC0tLShUWEQpLS0tLSsgfCB8ICAgKy0tLS0tLS0tLSsKKyArLS0tLS0tLS0rICAgICAgICAgICAgICB8IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyArLS0tLS0tLS0rICAgICAgICAgICAgICB8IHwKKyB8IEtleXBhZCB8LS0oTUtPVVQ0KS0tLS0rIHwKKyArLS0tLS0tLS0rICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0rICAgICAgICAgICAgICAgIHwKKyB8ICBVQVJUMiB8LS0tKFRYRCktLS0tLS0tLSsKKyArLS0tLS0tLS0rCisKK05PVEU6IHRoZSBleHRlcm5hbCBwYWQgaXMgbmFtZWQgYXMgTUZQX1BJTl9HUElPMTksIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkKK21lYW4gaXQncyBkZWRpY2F0ZWQgZm9yIEdQSU8xOSwgb25seSBhcyBhIGhpbnQgdGhhdCBpbnRlcm5hbGx5IHRoaXMgcGluCitjYW4gYmUgcm91dGVkIGZyb20gR1BJTzE5IG9mIHRoZSBHUElPIGNvbnRyb2xsZXIuCisKK1RvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UgZnJvbSBQWEEyNXgvUFhBMjd4IEdQSU8gYWx0ZXJuYXRlIGZ1bmN0aW9uCit0byB0aGlzIG5ldyBNRlAgbWVjaGFuaXNtLCBoZXJlIGFyZSBzZXZlcmFsIGtleSBwb2ludHM6CisKKyAgMS4gR1BJTyBjb250cm9sbGVyIG9uIFBYQTN4eCBpcyBub3cgYSBkZWRpY2F0ZWQgY29udHJvbGxlciwgc2FtZSBhcyBvdGhlcgorICAgICBpbnRlcm5hbCBjb250cm9sbGVycyBsaWtlIFBXTSwgU1NQIGFuZCBVQVJULCB3aXRoIDEyOCBpbnRlcm5hbCBzaWduYWxzCisgICAgIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gZXh0ZXJuYWwgdGhyb3VnaCBvbmUgb3IgbW9yZSBNRlBzIChlLmcuIEdQSU88MD4KKyAgICAgY2FuIGJlIHJvdXRlZCB0aHJvdWdoIGVpdGhlciBNRlBfUElOX0dQSU8wIGFzIHdlbGwgYXMgTUZQX1BJTl9HUElPMF8yLAorICAgICBzZWUgYXJjaC9hcm0vbWFjaC1weGEvbWFjaC9pbmNsdWRlL21mcC1weGEzMDAuaCkKKworICAyLiBBbHRlcm5hdGUgZnVuY3Rpb24gY29uZmlndXJhdGlvbiBpcyByZW1vdmVkIGZyb20gdGhpcyBHUElPIGNvbnRyb2xsZXIsCisgICAgIHRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGFyZSBwdXJlIEdQSU8tc3BlY2lmaWMsIGkuZS4KKworICAgICAgIC0gR1BJTyBzaWduYWwgbGV2ZWwgY29udHJvbAorICAgICAgIC0gR1BJTyBkaXJlY3Rpb24gY29udHJvbAorICAgICAgIC0gR1BJTyBsZXZlbCBjaGFuZ2UgZGV0ZWN0aW9uCisKKyAgMy4gTG93IHBvd2VyIHN0YXRlIGZvciBlYWNoIHBpbiBpcyBub3cgY29udHJvbGxlZCBieSBNRlAsIHRoaXMgbWVhbnMgdGhlCisgICAgIFBHU1J4IHJlZ2lzdGVycyBvbiBQWEEyeHggYXJlIG5vdyB1c2VsZXNzIG9uIFBYQTN4eAorCisgIDQuIFdha2V1cCBkZXRlY3Rpb24gaXMgbm93IGNvbnRyb2xsZWQgYnkgTUZQLCBQV0VSIGRvZXMgbm90IGNvbnRyb2wgdGhlCisgICAgIHdha2V1cCBmcm9tIEdQSU8ocykgYW55IG1vcmUsIGRlcGVuZGluZyBvbiB0aGUgc2xlZXBpbmcgc3RhdGUsIEFEeEVSCisgICAgIChhcyBkZWZpbmVkIGluIHB4YTN4eC1yZWdzLmgpIGNvbnRyb2xzIHRoZSB3YWtldXAgZnJvbSBNRlAKKworTk9URTogd2l0aCBzdWNoIGEgY2xlYXIgc2VwYXJhdGlvbiBvZiBNRlAgYW5kIEdQSU8sIGJ5IEdQSU88eHg+IHdlIG5vcm1hbGx5CittZWFuIGl0IGlzIGEgR1BJTyBzaWduYWwsIGFuZCBieSBNRlA8eHh4PiBvciBwaW4geHh4LCB3ZSBtZWFuIGEgcGh5c2ljYWwKK3BhZCAob3IgYmFsbCkuCisKKyBNRlAgQVBJIFVzYWdlCis9PT09PT09PT09PT09PT0KKworRm9yIGJvYXJkIGNvZGUgd3JpdGVycywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgorCisxLiBpbmNsdWRlIE9ORSBvZiB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWxlcyBpbiB5b3VyIDxib2FyZD4uYzoKKworICAgLSAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisgICAtICNpbmNsdWRlIDxtYWNoL21mcC1weGEyN3guaD4KKyAgIC0gI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTMwMC5oPgorICAgLSAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMzIwLmg+CisgICAtICNpbmNsdWRlIDxtYWNoL21mcC1weGE5MzAuaD4KKworICAgTk9URTogb25seSBvbmUgZmlsZSBpbiB5b3VyIDxib2FyZD4uYywgZGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzb3JzIHVzZWQsCisgICBiZWNhdXNlIHBpbiBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIG1heSBjb25mbGljdCBpbiB0aGVzZSBmaWxlIChpLmUuCisgICBzYW1lIG5hbWUsIGRpZmZlcmVudCBtZWFuaW5nIGFuZCBzZXR0aW5ncyBvbiBkaWZmZXJlbnQgcHJvY2Vzc29ycykuIEUuZy4KKyAgIGZvciB6eWxvbml0ZSBwbGF0Zm9ybSwgd2hpY2ggc3VwcG9ydCBib3RoIFBYQTMwMC9QWEEzMTAgYW5kIFBYQTMyMCwgdHdvCisgICBzZXBhcmF0ZSBmaWxlcyBhcmUgaW50cm9kdWNlZDogenlsb25pdGVfcHhhMzAwLmMgYW5kIHp5bG9uaXRlX3B4YTMyMC5jCisgICAoaW4gYWRkaXRpb24gdG8gaGFuZGxlIE1GUCBjb25maWd1cmF0aW9uIGRpZmZlcmVuY2VzLCB0aGV5IGFsc28gaGFuZGxlCisgICB0aGUgb3RoZXIgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGNvbWJpbmF0aW9ucykuCisKKyAgIE5PVEU6IFBYQTMwMCBhbmQgUFhBMzEwIGFyZSBhbG1vc3QgaWRlbnRpY2FsIGluIHBpbiBjb25maWd1cmF0aW9ucyAod2l0aAorICAgUFhBMzEwIHN1cHBvcnRpbmcgc29tZSBhZGRpdGlvbmFsIG9uZXMpLCB0aHVzIHRoZSBkaWZmZXJlbmNlIGlzIGFjdHVhbGx5CisgICBjb3ZlcmVkIGluIGEgc2luZ2xlIG1mcC1weGEzMDAuaC4KKworMi4gcHJlcGFyZSBhbiBhcnJheSBmb3IgdGhlIGluaXRpYWwgcGluIGNvbmZpZ3VyYXRpb25zLCBlLmcuOgorCisgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWluc3RvbmVfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogQ2hpcCBTZWxlY3QgKi8KKwlHUElPMTVfbkNTXzEsCisKKwkvKiBMQ0QgLSAxNmJwcCBBY3RpdmUgVEZUICovCisJR1BJT3h4X1RGVF9MQ0RfMTZCUFAsCisJR1BJTzE2X1BXTTBfT1VULAkvKiBCYWNrbGlnaHQgKi8KKworCS8qIE1NQyAqLworCUdQSU8zMl9NTUNfQ0xLLAorCUdQSU8xMTJfTU1DX0NNRCwKKwlHUElPOTJfTU1DX0RBVF8wLAorCUdQSU8xMDlfTU1DX0RBVF8xLAorCUdQSU8xMTBfTU1DX0RBVF8yLAorCUdQSU8xMTFfTU1DX0RBVF8zLAorCisJLi4uCisKKwkvKiBHUElPICovCisJR1BJTzFfR1BJTyB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCisgICB9OworCisgICBhKSBvbmNlIHRoZSBwaW4gY29uZmlndXJhdGlvbnMgYXJlIHBhc3NlZCB0byBweGF7Mnh4LDN4eH1fbWZwX2NvbmZpZygpLAorICAgYW5kIHdyaXR0ZW4gdG8gdGhlIGFjdHVhbCByZWdpc3RlcnMsIHRoZXkgYXJlIHVzZWxlc3MgYW5kIG1heSBkaXNjYXJkLAorICAgYWRkaW5nICdfX2luaXRkYXRhJyB3aWxsIGhlbHAgc2F2ZSBzb21lIGFkZGl0aW9uYWwgYnl0ZXMgaGVyZS4KKworICAgYikgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBwaW4gY29uZmlndXJhdGlvbnMgZm9yIGEgY29tcG9uZW50LAorICAgc29tZSBzaW1wbGlmaWVkIGRlZmluaXRpb25zIGNhbiBiZSB1c2VkLCBlLmcuIEdQSU94eF9URlRfTENEXzE2QlBQIG9uCisgICBQWEEyNXggYW5kIFBYQTI3eCBwcm9jZXNzb3JzCisKKyAgIGMpIGlmIGJ5IGJvYXJkIGRlc2lnbiwgYSBwaW4gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gd2FrZSB1cCB0aGUgc3lzdGVtCisgICBmcm9tIGxvdyBwb3dlciBzdGF0ZSwgaXQgY2FuIGJlICdPUidlZCB3aXRoIGFueSBvZjoKKworICAgICAgV0FLRVVQX09OX0VER0VfQk9USAorICAgICAgV0FLRVVQX09OX0VER0VfUklTRQorICAgICAgV0FLRVVQX09OX0VER0VfRkFMTAorICAgICAgV0FLRVVQX09OX0xFVkVMX0hJR0ggLSBzcGVjaWZpY2FsbHkgZm9yIGVuYWJsaW5nIG9mIGtleXBhZCBHUElPcywKKworICAgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHBpbiBoYXMgdGhlIGNhcGFiaWxpdHkgb2Ygd2FrZS11cCB0aGUgc3lzdGVtLAorICAgYW5kIG9uIHdoaWNoIGVkZ2UocykuIFRoaXMsIGhvd2V2ZXIsIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUKKyAgIHBpbiBfd2lsbF8gd2FrZXVwIHRoZSBzeXN0ZW0sIGl0IHdpbGwgb25seSB3aGVuIHNldF9pcnFfd2FrZSgpIGlzCisgICBpbnZva2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyBJUlEgKEdQSU9fSVJRKHh4KSBvciBncGlvX3RvX2lycSgpKQorICAgYW5kIGV2ZW50dWFsbHkgY2FsbHMgZ3Bpb19zZXRfd2FrZSgpIGZvciB0aGUgYWN0dWFsIHJlZ2lzdGVyIHNldHRpbmcuCisKKyAgIGQpIGFsdGhvdWdoIFBYQTN4eCBNRlAgc3VwcG9ydHMgZWRnZSBkZXRlY3Rpb24gb24gZWFjaCBwaW4sIHRoZQorICAgaW50ZXJuYWwgbG9naWMgd2lsbCBvbmx5IHdha2V1cCB0aGUgc3lzdGVtIHdoZW4gdGhvc2Ugc3BlY2lmaWMgYml0cworICAgaW4gQUR4RVIgcmVnaXN0ZXJzIGFyZSBzZXQsIHdoaWNoIGNhbiBiZSB3ZWxsIG1hcHBlZCB0byB0aGUKKyAgIGNvcnJlc3BvbmRpbmcgcGVyaXBoZXJhbCwgdGh1cyBzZXRfaXJxX3dha2UoKSBjYW4gYmUgY2FsbGVkIHdpdGggCisgICB0aGUgcGVyaXBoZXJhbCBJUlEgdG8gZW5hYmxlIHRoZSB3YWtldXAuCisKKworIE1GUCBvbiBQWEEzeHgKKz09PT09PT09PT09PT09PQorCitFdmVyeSBleHRlcm5hbCBJL08gcGFkIG9uIFBYQTN4eCAoZXhjbHVkaW5nIHRob3NlIGZvciBzcGVjaWFsIHB1cnBvc2UpIGhhcworb25lIE1GUCBsb2dpYyBhc3NvY2lhdGVkLCBhbmQgaXMgY29udHJvbGxlZCBieSBvbmUgTUZQIHJlZ2lzdGVyIChNRlBSKS4KKworVGhlIE1GUFIgaGFzIHRoZSBmb2xsb3dpbmcgYml0IGRlZmluaXRpb25zIChmb3IgUFhBMzAwL1BYQTMxMC9QWEEzMjApOgorCisgMzEgICAgICAgICAgICAgICAgICAgICAgICAxNiAxNSAxNCAxMyAxMiAxMSAxMCAgOSAgOCAgNyAgNiAgNSAgNCAgMyAgMiAgMSAgMAorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgfCAgICAgICAgIFJFU0VSVkVEICAgICAgICB8UFN8UFV8UER8ICBEUklWRSB8U1N8U0R8U098RUN8RUZ8RVJ8LS18IEFGX1NFTCB8CisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworCisgIEJpdCAzOiAgIFJFU0VSVkVECisgIEJpdCA0OiAgIEVER0VfUklTRV9FTiAtIGVuYWJsZSBkZXRlY3Rpb24gb2YgcmlzaW5nIGVkZ2Ugb24gdGhpcyBwaW4KKyAgQml0IDU6ICAgRURHRV9GQUxMX0VOIC0gZW5hYmxlIGRldGVjdGlvbiBvZiBmYWxsaW5nIGVkZ2Ugb24gdGhpcyBwaW4KKyAgQml0IDY6ICAgRURHRV9DTEVBUiAgIC0gZGlzYWJsZSBlZGdlIGRldGVjdGlvbiBvbiB0aGlzIHBpbgorICBCaXQgNzogICBTTEVFUF9PRV9OICAgLSBlbmFibGUgb3V0cHV0cyBkdXJpbmcgbG93IHBvd2VyIG1vZGVzCisgIEJpdCA4OiAgIFNMRUVQX0RBVEEgICAtIG91dHB1dCBkYXRhIG9uIHRoZSBwaW4gZHVyaW5nIGxvdyBwb3dlciBtb2RlcworICBCaXQgOTogICBTTEVFUF9TRUwgICAgLSBzZWxlY3Rpb24gY29udHJvbCBmb3IgbG93IHBvd2VyIG1vZGVzIHNpZ25hbHMKKyAgQml0IDEzOiAgUFVMTERPV05fRU4gIC0gZW5hYmxlIHRoZSBpbnRlcm5hbCBwdWxsLWRvd24gcmVzaXN0b3Igb24gdGhpcyBwaW4KKyAgQml0IDE0OiAgUFVMTFVQX0VOICAgIC0gZW5hYmxlIHRoZSBpbnRlcm5hbCBwdWxsLXVwIHJlc2lzdG9yIG9uIHRoaXMgcGluCisgIEJpdCAxNTogIFBVTExfU0VMICAgICAtIHB1bGwgc3RhdGUgY29udHJvbGxlZCBieSBzZWxlY3RlZCBhbHRlcm5hdGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDApIG9yIGJ5IFBVTEx7VVAsRE9XTn1fRU4gYml0cyAoMSkKKworICBCaXQgMCAtIDI6IEFGX1NFTCAtIGFsdGVybmF0ZSBmdW5jdGlvbiBzZWxlY3Rpb24sIDggcG9zc2liaWxpdGllcywgZnJvbSAwLTcKKyAgQml0IDEwLTEyOiBEUklWRSAgLSBkcml2ZSBzdHJlbmd0aCBhbmQgc2xldyByYXRlCisJCQkwYjAwMCAtIGZhc3QgMW1BCisJCQkwYjAwMSAtIGZhc3QgMm1BCisJCQkwYjAwMiAtIGZhc3QgM21BCisJCQkwYjAwMyAtIGZhc3QgNG1BCisJCQkwYjAwNCAtIHNsb3cgNm1BCisJCQkwYjAwNSAtIGZhc3QgNm1BCisJCQkwYjAwNiAtIHNsb3cgMTBtQQorCQkJMGIwMDcgLSBmYXN0IDEwbUEKKworIE1GUCBEZXNpZ24gZm9yIFBYQTJ4eC9QWEEzeHgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEdWUgdG8gdGhlIGRpZmZlcmVuY2Ugb2YgcGluLW11eCBoYW5kbGluZyBiZXR3ZWVuIFBYQTJ4eCBhbmQgUFhBM3h4LCBhIHVuaWZpZWQKK01GUCBBUEkgaXMgaW50cm9kdWNlZCB0byBjb3ZlciBib3RoIHNlcmllcyBvZiBwcm9jZXNzb3JzLgorCitUaGUgYmFzaWMgaWRlYSBvZiB0aGlzIGRlc2lnbiBpcyB0byBpbnRyb2R1Y2UgZGVmaW5pdGlvbnMgZm9yIGFsbCBwb3NzaWJsZSBwaW4KK2NvbmZpZ3VyYXRpb25zLCB0aGVzZSBkZWZpbml0aW9ucyBhcmUgcHJvY2Vzc29yIGFuZCBwbGF0Zm9ybSBpbmRlcGVuZGVudCwgYW5kCit0aGUgYWN0dWFsIEFQSSBpbnZva2VkIHRvIGNvbnZlcnQgdGhlc2UgZGVmaW5pdGlvbnMgaW50byByZWdpc3RlciBzZXR0aW5ncyBhbmQKK21ha2UgdGhlbSBlZmZlY3RpdmUgdGhlcmUtYWZ0ZXIuCisKKyAgRmlsZXMgSW52b2x2ZWQKKyAgLS0tLS0tLS0tLS0tLS0KKworICAtIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAuaAorICAKKyAgZm9yCisgICAgMS4gVW5pZmllZCBwaW4gZGVmaW5pdGlvbnMgLSBlbnVtIGNvbnN0YW50cyBmb3IgYWxsIGNvbmZpZ3VyYWJsZSBwaW5zCisgICAgMi4gcHJvY2Vzc29yLW5ldXRyYWwgYml0IGRlZmluaXRpb25zIGZvciBhIHBvc3NpYmxlIE1GUCBjb25maWd1cmF0aW9uCisKKyAgLSBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTN4eC5oCisKKyAgZm9yIFBYQTN4eCBzcGVjaWZpYyBNRlBSIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyBhbmQgUFhBM3h4IGNvbW1vbiBwaW4KKyAgY29uZmlndXJhdGlvbnMKKworICAtIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMnh4LmgKKworICBmb3IgUFhBMnh4IHNwZWNpZmljIGRlZmluaXRpb25zIGFuZCBQWEEyNXgvUFhBMjd4IGNvbW1vbiBwaW4gY29uZmlndXJhdGlvbnMKKworICAtIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMjV4LmgKKyAgICBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTI3eC5oCisgICAgYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEzMDAuaAorICAgIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMzIwLmgKKyAgICBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTkzMC5oCisKKyAgZm9yIHByb2Nlc3NvciBzcGVjaWZpYyBkZWZpbml0aW9ucworCisgIC0gYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTN4eC5jCisgIC0gYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCisKKyAgZm9yIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwaW4gY29uZmlndXJhdGlvbiB0byB0YWtlIGVmZmVjdCBmb3IgdGhlIGFjdHVhbAorICBwcm9jZXNzb3IuCisKKyAgUGluIENvbmZpZ3VyYXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0KKworICBUaGUgZm9sbG93aW5nIGNvbW1lbnRzIGFyZSBjb3BpZWQgZnJvbSBtZnAuaCAoc2VlIHRoZSBhY3R1YWwgc291cmNlIGNvZGUKKyAgZm9yIG1vc3QgdXBkYXRlZCBpbmZvKQorICAKKyAgLyoKKyAgICogYSBwb3NzaWJsZSBNRlAgY29uZmlndXJhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIDMyLWJpdCBpbnRlZ2VyCisgICAqCisgICAqIGJpdCAgMC4uIDkgLSBNRlAgUGluIE51bWJlciAoMTAyNCBQaW5zIE1heGltdW0pCisgICAqIGJpdCAxMC4uMTIgLSBBbHRlcm5hdGUgRnVuY3Rpb24gU2VsZWN0aW9uCisgICAqIGJpdCAxMy4uMTUgLSBEcml2ZSBTdHJlbmd0aAorICAgKiBiaXQgMTYuLjE4IC0gTG93IFBvd2VyIE1vZGUgU3RhdGUKKyAgICogYml0IDE5Li4yMCAtIExvdyBQb3dlciBNb2RlIEVkZ2UgRGV0ZWN0aW9uCisgICAqIGJpdCAyMS4uMjIgLSBSdW4gTW9kZSBQdWxsIFN0YXRlCisgICAqCisgICAqIHRvIGZhY2lsaXRhdGUgdGhlIGRlZmluaXRpb24sIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBwcm92aWRlZAorICAgKgorICAgKiBNRlBfQ0ZHX0RFRkFVTFQgLSBkZWZhdWx0IE1GUCBjb25maWd1cmF0aW9uIHZhbHVlLCB3aXRoCisgICAqIAkJICBhbHRlcm5hdGUgZnVuY3Rpb24gPSAwLAorICAgKiAJCSAgZHJpdmUgc3RyZW5ndGggPSBmYXN0IDNtQSAoTUZQX0RTMDNYKQorICAgKiAJCSAgbG93IHBvd2VyIG1vZGUgPSBkZWZhdWx0CisgICAqIAkJICBlZGdlIGRldGVjdGlvbiA9IG5vbmUKKyAgICoKKyAgICogTUZQX0NGRwktIGRlZmF1bHQgTUZQUiB2YWx1ZSB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbgorICAgKiBNRlBfQ0ZHX0RSVgktIGRlZmF1bHQgTUZQUiB2YWx1ZSB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbiBhbmQKKyAgICogCQkgIHBpbiBkcml2ZSBzdHJlbmd0aAorICAgKiBNRlBfQ0ZHX0xQTQktIGRlZmF1bHQgTUZQUiB2YWx1ZSB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbiBhbmQKKyAgICogCQkgIGxvdyBwb3dlciBtb2RlCisgICAqIE1GUF9DRkdfWAktIGRlZmF1bHQgTUZQUiB2YWx1ZSB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbiwKKyAgICogCQkgIHBpbiBkcml2ZSBzdHJlbmd0aCBhbmQgbG93IHBvd2VyIG1vZGUKKyAgICovCisKKyAgIEV4YW1wbGVzIG9mIHBpbiBjb25maWd1cmF0aW9ucyBhcmU6CisKKyAgICNkZWZpbmUgR1BJTzk0X1NTUDNfUlhECQlNRlBfQ0ZHX1goR1BJTzk0LCBBRjEsIERTMDhYLCBGTE9BVCkKKworICAgd2hpY2ggcmVhZHMgR1BJTzk0IGNhbiBiZSBjb25maWd1cmVkIGFzIFNTUDNfUlhELCB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbgorICAgc2VsZWN0aW9uIG9mIDEsIGRyaXZpbmcgc3RyZW5ndGggb2YgMGIxMDEsIGFuZCBhIGZsb2F0IHN0YXRlIGluIGxvdyBwb3dlcgorICAgbW9kZXMuCisKKyAgIE5PVEU6IHRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiB0aGlzIHBpbiBiZWluZyBjb25maWd1cmVkIGFzIFNTUDNfUlhECisgICB3aGljaCBjYW4gYmUgbW9kaWZpZWQgYSBiaXQgaW4gYm9hcmQgY29kZSwgdGhvdWdoIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0bworICAgZG8gc28sIHNpbXBseSBiZWNhdXNlIHRoaXMgZGVmYXVsdCBzZXR0aW5nIGlzIHVzdWFsbHkgY2FyZWZ1bGx5IGVuY29kZWQsCisgICBhbmQgaXMgc3VwcG9zZWQgdG8gd29yayBpbiBtb3N0IGNhc2VzLgorCisgIFJlZ2lzdGVyIFNldHRpbmdzCisgIC0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFJlZ2lzdGVyIHNldHRpbmdzIG9uIFBYQTN4eCBmb3IgYSBwaW4gY29uZmlndXJhdGlvbiBpcyBhY3R1YWxseSB2ZXJ5CisgICBzdHJhaWdodC1mb3J3YXJkLCBtb3N0IGJpdHMgY2FuIGJlIGNvbnZlcnRlZCBkaXJlY3RseSBpbnRvIE1GUFIgdmFsdWUKKyAgIGluIGEgZWFzaWVyIHdheS4gVHdvIHNldHMgb2YgTUZQUiB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQ6IHRoZSBydW4tdGltZQorICAgb25lcyBhbmQgdGhlIGxvdyBwb3dlciBtb2RlIG9uZXMsIHRvIGFsbG93IGRpZmZlcmVudCBzZXR0aW5ncy4KKworICAgVGhlIGNvbnZlcnNpb24gZnJvbSBhIGdlbmVyaWMgcGluIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGFjdHVhbCByZWdpc3RlcgorICAgc2V0dGluZ3Mgb24gUFhBMnh4IGlzIGEgYml0IGNvbXBsaWNhdGVkOiBtYW55IHJlZ2lzdGVycyBhcmUgaW52b2x2ZWQsCisgICBpbmNsdWRpbmcgR0FGUngsIEdQRFJ4LCBQR1NSeCwgUFdFUiwgUEtXUiwgUEZFUiBhbmQgUFJFUi4gUGxlYXNlIHNlZQorICAgbWZwLXB4YTJ4eC5jIGZvciBob3cgdGhlIGNvbnZlcnNpb24gaXMgbWFkZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAppbmRleCA0ZGJiOGJlLi4zYzU0MzRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CkBAIC05MTQsNyArOTE0LDcgQEAKIHF1ZXVlIGFuZCBzcGVjaWZpYyBJL08gc2NoZWR1bGVycy4gIFVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLCBlbGV2YXRvciBpcyB1c2VkCiB0byByZWZlciB0byBib3RoIHBhcnRzIGFuZCBJL08gc2NoZWR1bGVyIHRvIHNwZWNpZmljIEkvTyBzY2hlZHVsZXJzLgogCi1CbG9jayBsYXllciBpbXBsZW1lbnRzIGdlbmVyaWMgZGlzcGF0Y2ggcXVldWUgaW4gbGxfcndfYmxrLmMgYW5kIGVsZXZhdG9yLmMuCitCbG9jayBsYXllciBpbXBsZW1lbnRzIGdlbmVyaWMgZGlzcGF0Y2ggcXVldWUgaW4gYmxvY2svKi5jLgogVGhlIGdlbmVyaWMgZGlzcGF0Y2ggcXVldWUgaXMgcmVzcG9uc2libGUgZm9yIHByb3Blcmx5IG9yZGVyaW5nIGJhcnJpZXIKIHJlcXVlc3RzLCByZXF1ZXVlaW5nLCBoYW5kbGluZyBub24tZnMgcmVxdWVzdHMgYW5kIGFsbCBvdGhlciBzdWJ0bGV0aWVzLgogCkBAIC05MjYsOCArOTI2LDggQEAKIGNoYW5nZSB0byBhbm90aGVyIG9uZSBkeW5hbWljYWxseS4KIAogQSBibG9jayBsYXllciBjYWxsIHRvIHRoZSBpL28gc2NoZWR1bGVyIGZvbGxvd3MgdGhlIGNvbnZlbnRpb24gZWx2X3h4eCgpLiBUaGlzCi1jYWxscyBlbGV2YXRvcl94eHhfZm4gaW4gdGhlIGVsZXZhdG9yIHN3aXRjaCAoZHJpdmVycy9ibG9jay9lbGV2YXRvci5jKS4gT2gsCi14eHggYW5kIHh4eCBtaWdodCBub3QgbWF0Y2ggZXhhY3RseSwgYnV0IHVzZSB5b3VyIGltYWdpbmF0aW9uLiBJZiBhbiBlbGV2YXRvcgorY2FsbHMgZWxldmF0b3JfeHh4X2ZuIGluIHRoZSBlbGV2YXRvciBzd2l0Y2ggKGJsb2NrL2VsZXZhdG9yLmMpLiBPaCwgeHh4CithbmQgeHh4IG1pZ2h0IG5vdCBtYXRjaCBleGFjdGx5LCBidXQgdXNlIHlvdXIgaW1hZ2luYXRpb24uIElmIGFuIGVsZXZhdG9yCiBkb2Vzbid0IGltcGxlbWVudCBhIGZ1bmN0aW9uLCB0aGUgc3dpdGNoIGRvZXMgbm90aGluZyBvciBzb21lIG1pbmltYWwgaG91c2UKIGtlZXBpbmcgd29yay4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvdGVjaG5pc2F0LnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL3RlY2huaXNhdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNmVlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL3RlY2huaXNhdC50eHQKQEAgLTAsMCArMSw2OSBAQAorSG93IHRvIHNldCB1cCB0aGUgVGVjaG5pc2F0IGRldmljZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEpIEZpbmQgb3V0IHdoYXQgZGV2aWNlIHlvdSBoYXZlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaXJzdCBzdGFydCB5b3VyIGxpbnV4IGJveCB3aXRoIGEgc2hpcHBlZCBrZXJuZWw6Citsc3BjaSAtdnZ2IGZvciBhIFBDSSBkZXZpY2UgKGxzdXNiIC12dnYgZm9yIGFuIFVTQiBkZXZpY2UpIHdpbGwgc2hvdyB5b3UgZm9yIGV4YW1wbGU6CiswMjowYi4wIE5ldHdvcmsgY29udHJvbGxlcjogVGVjaHNhbiBFbGVjdHJvbmljcyBDbyBMdGQgQjJDMiBGbGV4Q29wSUkgRFZCIGNoaXAgLyBUZWNobmlzYXQgU2t5U3RhcjIgRFZCIGNhcmQgKHJldiAwMikKKworZG1lc2cgfCBncmVwIGZyb250ZW5kIG1heSBzaG93IHlvdSBmb3IgZXhhbXBsZToKK0RWQjogcmVnaXN0ZXJpbmcgZnJvbnRlbmQgMCAoQ29uZXhhbnQgQ1gyNDEyMy9DWDI0MTA5KS4uLgorCisyKSBLZXJuZWwgY29tcGlsYXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09CisKK0lmIHRoZSBUZWNobmlzYXQgaXMgdGhlIG9ubHkgVFYgZGV2aWNlIGluIHlvdXIgYm94IGdldCByaWQgb2YgdW5uZWNlc3NhcnkgbW9kdWxlcyBhbmQgY2hlY2sgdGhpcyBvbmU6CisiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIGFuYWxvZyBhbmQgaHlicmlkIHR1bmVyIG1vZHVsZXMgdG8gYnVpbGQiCitJbiB0aGlzIGRpcmVjdG9yeSB1bmNoZWNrIGV2ZXJ5IGRyaXZlciB3aGljaCBpcyBhY3RpdmF0ZWQgdGhlcmUuCisKK1RoZW4gcGxlYXNlIGFjdGl2YXRlOgorMmEpIE1haW4gbW9kdWxlIHBhcnQ6CisKK2EuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJEVkIvQVRTQyBhZGFwdGVycyIgPT4gIlRlY2huaXNhdC9CMkMyIEZsZXhjb3BJSShiKSBhbmQgRmxleENvcElJSSBhZGFwdGVycyIKK2IuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJEVkIvQVRTQyBhZGFwdGVycyIgPT4gIlRlY2huaXNhdC9CMkMyIEZsZXhjb3BJSShiKSBhbmQgRmxleENvcElJSSBhZGFwdGVycyIgPT4gIlRlY2huaXNhdC9CMkMyIEFpci9Ta3kvQ2FibGUyUEMgUENJIiBpbiBjYXNlIG9mIGEgUENJIGNhcmQgT1IKK2MuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJEVkIvQVRTQyBhZGFwdGVycyIgPT4gIlRlY2huaXNhdC9CMkMyIEZsZXhjb3BJSShiKSBhbmQgRmxleENvcElJSSBhZGFwdGVycyIgPT4gIlRlY2huaXNhdC9CMkMyIEFpci9Ta3kvQ2FibGUyUEMgVVNCIiBpbiBjYXNlIG9mIGFuIFVTQiAxLjEgYWRhcHRlcgorZC4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkRWQi9BVFNDIGFkYXB0ZXJzIiA9PiAiVGVjaG5pc2F0L0IyQzIgRmxleGNvcElJKGIpIGFuZCBGbGV4Q29wSUlJIGFkYXB0ZXJzIiA9PiAiRW5hYmxlIGRlYnVnIGZvciB0aGUgQjJDMiBGbGV4Q29wIGRyaXZlcnMiCitOb3RpY2U6IGQuKSBpcyBoZWxwZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcKKworMmIpIEZyb250ZW5kIG1vZHVsZSBwYXJ0OgorCisxLikgUmV2aXNpb24gMi4zOgorYS4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiQ3VzdG9taXNlIHRoZSBmcm9udGVuZCBtb2R1bGVzIHRvIGJ1aWxkIgorYi4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiWmFybGluayBWUDMxMC9NVDMxMi9aTDEwMzEzIGJhc2VkIgorCisyLikgUmV2aXNpb24gMi42OgorYS4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiQ3VzdG9taXNlIHRoZSBmcm9udGVuZCBtb2R1bGVzIHRvIGJ1aWxkIgorYi4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiU1QgU1RWMDI5OSBiYXNlZCIKKworMy4pIFJldmlzaW9uIDIuNzoKK2EuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkN1c3RvbWlzZSB0aGUgZnJvbnRlbmQgbW9kdWxlcyB0byBidWlsZCIKK2IuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIlNhbXN1bmcgUzVIMTQyMCBiYXNlZCIKK2MuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkludGVncmFudCBJVEQxMDAwIFplcm8gSUYgdHVuZXIgZm9yIERWQi1TL0RTUyIKK2QuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIklTTDY0MjEgU0VDIGNvbnRyb2xsZXIiCisKKzQuKSBSZXZpc2lvbiAyLjg6CithLikiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIERWQiBmcm9udGVuZHMiID0+ICJDdXN0b21pc2UgdGhlIGZyb250ZW5kIG1vZHVsZXMgdG8gYnVpbGQiCitiLikiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIERWQiBmcm9udGVuZHMiID0+ICJDb25leGFudCBDWDI0MTEzL0NYMjQxMjggdHVuZXIgZm9yIERWQi1TL0RTUyIKK2MuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkNvbmV4YW50IENYMjQxMjMgYmFzZWQiCitkLikiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIERWQiBmcm9udGVuZHMiID0+ICJJU0w2NDIxIFNFQyBjb250cm9sbGVyIgorCis1LikgRFZCLVQgY2FyZDoKK2EuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkN1c3RvbWlzZSB0aGUgZnJvbnRlbmQgbW9kdWxlcyB0byBidWlsZCIKK2IuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIlphcmxpbmsgTVQzNTIgYmFzZWQiCisKKzYuKSBEVkItQyBjYXJkOgorYS4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiQ3VzdG9taXNlIHRoZSBmcm9udGVuZCBtb2R1bGVzIHRvIGJ1aWxkIgorYi4pIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkN1c3RvbWlzZSBEVkIgZnJvbnRlbmRzIiA9PiAiU1QgU1RWMDI5NyBiYXNlZCIKKworNy4pIEFUU0MgY2FyZCAxc3QgZ2VuZXJhdGlvbjoKK2EuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkN1c3RvbWlzZSB0aGUgZnJvbnRlbmQgbW9kdWxlcyB0byBidWlsZCIKK2IuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkJyb2FkY29tIEJDTTM1MTAiCisKKzguKSBBVFNDIGNhcmQgMm5kIGdlbmVyYXRpb246CithLikiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIERWQiBmcm9udGVuZHMiID0+ICJDdXN0b21pc2UgdGhlIGZyb250ZW5kIG1vZHVsZXMgdG8gYnVpbGQiCitiLikiTXVsdGltZWRpYSBkZXZpY2VzIiA9PiAiQ3VzdG9taXNlIERWQiBmcm9udGVuZHMiID0+ICJOeHRXYXZlIENvbW11bmljYXRpb25zIE5YVDIwMDIvTlhUMjAwNCBiYXNlZCIKK2MuKSJNdWx0aW1lZGlhIGRldmljZXMiID0+ICJDdXN0b21pc2UgRFZCIGZyb250ZW5kcyIgPT4gIkxHIEVsZWN0cm9uaWNzIExHRFQzMzAyL0xHRFQzMzAzIGJhc2VkIgorCitBdXRob3I6IFV3ZSBCdWdsYSA8dXdlLmJ1Z2xhQGdteC5kZT4gRGVjZW1iZXIgMjAwOApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9weGFmYi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZiL3B4YWZiLnR4dAppbmRleCBkYjliODUwLi5kMTQzYTBhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL3B4YWZiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL3B4YWZiLnR4dApAQCAtNSw5ICs1LDEzIEBACiBvcHRpb25zPTxPUFRJT05TPiB3aGVuIG1vZHVsYXIgb3IgdmlkZW89cHhhZmI6PE9QVElPTlM+IHdoZW4gYnVpbHQgaW4uCiAKIEZvciBleGFtcGxlOgotCW1vZHByb2JlIHB4YWZiIG9wdGlvbnM9bW9kZTo2NDB4NDgwLTgscGFzc2l2ZQorCW1vZHByb2JlIHB4YWZiIG9wdGlvbnM9dm1lbToyTSxtb2RlOjY0MHg0ODAtOCxwYXNzaXZlCiBvciBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZQotCXZpZGVvPXB4YWZiOm1vZGU6NjQweDQ4MC04LHBhc3NpdmUKKwl2aWRlbz1weGFmYjp2bWVtOjJNLG1vZGU6NjQweDQ4MC04LHBhc3NpdmUKKwordm1lbTogVklERU9fTUVNX1NJWkUKKwlBbW91bnQgb2YgdmlkZW8gbWVtb3J5IHRvIGFsbG9jYXRlIChjYW4gYmUgc3VmZml4ZWQgd2l0aCBLIG9yIE0KKwlmb3Iga2lsb2J5dGVzIG9yIG1lZ2FieXRlcykKIAogbW9kZTpYUkVTeFlSRVNbLUJQUF0KIAlYUkVTID09IExDQ1IxX1BQTCArIDEKQEAgLTUyLDMgKzU2LDg3IEBACiBwaXhjbG9ja3BvbDpQT0xBUklUWQogCXBpeGVsIGNsb2NrIHBvbGFyaXR5CiAJMCA9PiBmYWxsaW5nIGVkZ2UsIDEgPT4gcmlzaW5nIGVkZ2UKKworCitPdmVybGF5IFN1cHBvcnQgZm9yIFBYQTI3eCBhbmQgbGF0ZXIgTENEIGNvbnRyb2xsZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgUFhBMjd4IGFuZCBsYXRlciBwcm9jZXNzb3JzIHN1cHBvcnQgb3ZlcmxheTEgYW5kIG92ZXJsYXkyIG9uLXRvcCBvZiB0aGUKKyAgYmFzZSBmcmFtZWJ1ZmZlciAoYWx0aG91Z2ggdW5kZXItbmVhdGggdGhlIGJhc2UgaXMgYWxzbyBwb3NzaWJsZSkuIFRoZXkKKyAgc3VwcG9ydCBwYWxldHRlIGFuZCBuby1wYWxldHRlIFJHQiBmb3JtYXRzLCBhcyB3ZWxsIGFzIFlVViBmb3JtYXRzIChvbmx5CisgIGF2YWlsYWJsZSBvbiBvdmVybGF5MikuIFRoZXNlIG92ZXJsYXlzIGhhdmUgZGVkaWNhdGVkIERNQSBjaGFubmVscyBhbmQKKyAgYmVoYXZlIGluIGEgc2ltaWxhciB3YXkgYXMgYSBmcmFtZWJ1ZmZlci4KKworICBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIG92ZXJsYXkgZnJhbWVidWZmZXJzCisgIGFuZCBub3JtYWwgZnJhbWVidWZmZXJzLCBhcyBsaXN0ZWQgYmVsb3c6CisKKyAgMS4gb3ZlcmxheSBjYW4gc3RhcnQgYXQgYSAzMi1iaXQgd29yZCBhbGlnbmVkIHBvc2l0aW9uIHdpdGhpbiB0aGUgYmFzZQorICAgICBmcmFtZWJ1ZmZlciwgd2hpY2ggbWVhbnMgdGhleSBoYXZlIGEgc3RhcnQgKHgsIHkpLiBUaGlzIGluZm9ybWF0aW9uCisgICAgIGlzIGVuY29kZWQgaW50byB2YXItPm5vbnN0ZCAobm8sIHZhci0+eG9mZnNldCBhbmQgdmFyLT55b2Zmc2V0IGFyZQorICAgICBub3QgZm9yIHN1Y2ggcHVycG9zZSkuCisKKyAgMi4gb3ZlcmxheSBmcmFtZWJ1ZmZlciBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIHNwZWNpZmllZAorICAgICAnc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvJywgdGhlIGFtb3VudCBpcyBkZWNpZGVkIGJ5OgorCisgICAgICAgIHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiBicHAKKworICAgICBicHAgPSAxNiAtLSBmb3IgUkdCNTY1IG9yIFJHQlQ1NTUKKyAgICAgICAgID0gMjQgLS0gZm9yIFlVVjQ0NCBwYWNrZWQKKyAgICAgICAgID0gMjQgLS0gZm9yIFlVVjQ0NCBwbGFuYXIKKwkgPSAxNiAtLSBmb3IgWVVWNDIyIHBsYW5hciAoMSBwaXhlbCA9IDEgWSArIDEvMiBDYiArIDEvMiBDcikKKwkgPSAxMiAtLSBmb3IgWVVWNDIwIHBsYW5hciAoMSBwaXhlbCA9IDEgWSArIDEvNCBDYiArIDEvNCBDcikKKworICAgICBOT1RFOgorCisgICAgIGEuIG92ZXJsYXkgZG9lcyBub3Qgc3VwcG9ydCBwYW5uaW5nIGluIHgtZGlyZWN0aW9uLCB0aHVzCisgICAgICAgIHZhci0+eHJlc192aXJ0dWFsIHdpbGwgYWx3YXlzIGJlIGVxdWFsIHRvIHZhci0+eHJlcworCisgICAgIGIuIGxpbmUgbGVuZ3RoIG9mIG92ZXJsYXkocykgbXVzdCBiZSBvbiBhIDMyLWJpdCB3b3JkIGJvdW5kYXJ5LAorICAgICAgICBmb3IgWVVWIHBsYW5hciBtb2RlcywgaXQgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGNvbXBvbmVudAorCXdpdGggbWluaW11bSBiaXRzIHBlciBwaXhlbCwgIGUuZy4gZm9yIFlVVjQyMCwgQ3IgY29tcG9uZW50CisJZm9yIG9uZSBwaXhlbCBpcyBhY3R1YWxseSAyLWJpdHMsIGl0IG1lYW5zIHRoZSBsaW5lIGxlbmd0aAorCXNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2LXBpeGVscworCisgICAgIGMuIHN0YXJ0aW5nIGhvcml6b250YWwgcG9zaXRpb24gKFhQT1MpIHNob3VsZCBzdGFydCBvbiBhIDMyLWJpdAorICAgICAgICB3b3JkIGJvdW5kYXJ5LCBvdGhlcndpc2UgdGhlIGZiX2NoZWNrX3ZhcigpIHdpbGwganVzdCBmYWlsLgorCisgICAgIGQuIHRoZSByZWN0YW5nbGUgb2YgdGhlIG92ZXJsYXkgc2hvdWxkIGJlIHdpdGhpbiB0aGUgYmFzZSBwbGFuZSwKKyAgICAgICAgb3RoZXJ3aXNlIGZhaWwKKworICAgICBBcHBsaWNhdGlvbnMgc2hvdWxkIGZvbGxvdyB0aGUgc2VxdWVuY2UgYmVsb3cgdG8gb3BlcmF0ZSBhbiBvdmVybGF5CisgICAgIGZyYW1lYnVmZmVyOgorCisgICAgICAgICBhLiBvcGVuKCIvZGV2L2ZiWzEtMl0iLCAuLi4pCisJIGIuIGlvY3RsKGZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAuLi4pCisJIGMuIG1vZGlmeSAndmFyJyB3aXRoIGRlc2lyZWQgcGFyYW1ldGVyczoKKwkgICAgMSkgdmFyLT54cmVzIGFuZCB2YXItPnlyZXMKKwkgICAgMikgbGFyZ2VyIHZhci0+eXJlc192aXJ0dWFsIGlmIG1vcmUgbWVtb3J5IGlzIHJlcXVpcmVkLAorCSAgICAgICB1c3VhbGx5IGZvciBkb3VibGUtYnVmZmVyaW5nCisJICAgIDMpIHZhci0+bm9uc3RkIGZvciBzdGFydGluZyAoeCwgeSkgYW5kIGNvbG9yIGZvcm1hdAorCSAgICA0KSB2YXItPntyZWQsIGdyZWVuLCBibHVlLCB0cmFuc3B9IGlmIFJHQiBtb2RlIGlzIHRvIGJlIHVzZWQKKwkgZC4gaW9jdGwoZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sIC4uLikKKwkgZS4gaW9jdGwoZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sIC4uLikKKwkgZi4gbW1hcAorCSBnLiAuLi4KKworICAzLiBmb3IgWVVWIHBsYW5hciBmb3JtYXRzLCB0aGVzZSBhcmUgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlCisgICAgIGZyYW1lYnVmZmVyIGZyYW1ld29yaywgYXBwbGljYXRpb24gaGFzIHRvIHRha2UgY2FyZSBvZiB0aGUgb2Zmc2V0cworICAgICBhbmQgbGVuZ3RocyBvZiBlYWNoIGNvbXBvbmVudCB3aXRoaW4gdGhlIGZyYW1lYnVmZmVyLgorCisgIDQuIHZhci0+bm9uc3RkIGlzIHVzZWQgdG8gcGFzcyBzdGFydGluZyAoeCwgeSkgcG9zaXRpb24gYW5kIGNvbG9yIGZvcm1hdCwKKyAgICAgdGhlIGRldGFpbGVkIGJpdCBmaWVsZHMgYXJlIHNob3duIGJlbG93OgorCisgICAgMzEgICAgICAgICAgICAgICAgMjMgIDIwICAgICAgICAgMTAgICAgICAgICAgMAorICAgICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgICAgfCAgLi4uIHVudXNlZCAuLi4gfEZPUnwgICBYUE9TICAgfCAgIFlQT1MgICB8CisgICAgICstLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKworCisgICAgIEZPUiAgLSBjb2xvciBmb3JtYXQsIGFzIGRlZmluZWQgYnkgT1ZFUkxBWV9GT1JNQVRfKiBpbiBweGFmYi5oCisgICAgICAgICAgICAwIC0gUkdCCisJICAgIDEgLSBZVVY0NDQgUEFDS0VECisJICAgIDIgLSBZVVY0NDQgUExBTkFSCisJICAgIDMgLSBZVVY0MjIgUExBTkFSCisJICAgIDQgLSBZVVI0MjAgUExBTkFSCisKKyAgICAgWFBPUyAtIHN0YXJ0aW5nIGhvcml6b250YWwgcG9zaXRpb24KKyAgICAgWVBPUyAtIHN0YXJ0aW5nIHZlcnRpY2FsIHBvc2l0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKaW5kZXggMGExNjY4Yi4uOTg3OGY1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dApAQCAtMjI5LDEwICsyMjksNiBAQAogCUlTR0lEIGJpdCBpcyBjbGVhcmVkIGlmIHRoZSBpcml4X3NnaWRfaW5oZXJpdCBjb21wYXRpYmlsaXR5IHN5c2N0bAogCWlzIHNldC4KIAotICBmcy54ZnMucmVzdHJpY3RfY2hvd24JCShNaW46IDAgIERlZmF1bHQ6IDEgIE1heDogMSkKLSAgCUNvbnRyb2xzIHdoZXRoZXIgdW5wcml2aWxlZ2VkIHVzZXJzIGNhbiB1c2UgY2hvd24gdG8gImdpdmUgYXdheSIKLQlhIGZpbGUgdG8gYW5vdGhlciB1c2VyLgotCiAgIGZzLnhmcy5pbmhlcml0X3N5bmMJCShNaW46IDAgIERlZmF1bHQ6IDEgIE1heDogMSkKIAlTZXR0aW5nIHRoaXMgdG8gIjEiIHdpbGwgY2F1c2UgdGhlICJzeW5jIiBmbGFnIHNldAogCWJ5IHRoZSB4ZnNfaW8oOCkgY2hhdHRyIGNvbW1hbmQgb24gYSBkaXJlY3RvcnkgdG8gYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jIGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKaW5kZXggODA0NTIwNi4uZjJkYmJmMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKKysrIGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LmMKQEAgLTQ4MSw1MSArNDgxLDYgQEAKIAkvKiBXZSByZXR1cm4gdGhlIGluaXRyZCBzaXplLiAqLwogCXJldHVybiBsZW47CiB9Ci0KLS8qIE9uY2Ugd2Uga25vdyBob3cgbXVjaCBtZW1vcnkgd2UgaGF2ZSB3ZSBjYW4gY29uc3RydWN0IHNpbXBsZSBsaW5lYXIgcGFnZQotICogdGFibGVzIHdoaWNoIHNldCB2aXJ0dWFsID09IHBoeXNpY2FsIHdoaWNoIHdpbGwgZ2V0IHRoZSBHdWVzdCBmYXIgZW5vdWdoCi0gKiBpbnRvIHRoZSBib290IHRvIGNyZWF0ZSBpdHMgb3duLgotICoKLSAqIFdlIGxheSB0aGVtIG91dCBvZiB0aGUgd2F5LCBqdXN0IGJlbG93IHRoZSBpbml0cmQgKHdoaWNoIGlzIHdoeSB3ZSBuZWVkIHRvCi0gKiBrbm93IGl0cyBzaXplIGhlcmUpLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0dXBfcGFnZXRhYmxlcyh1bnNpZ25lZCBsb25nIG1lbSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9zaXplKQotewotCXVuc2lnbmVkIGxvbmcgKnBnZGlyLCAqbGluZWFyOwotCXVuc2lnbmVkIGludCBtYXBwZWRfcGFnZXMsIGksIGxpbmVhcl9wYWdlczsKLQl1bnNpZ25lZCBpbnQgcHRlc19wZXJfcGFnZSA9IGdldHBhZ2VzaXplKCkvc2l6ZW9mKHZvaWQgKik7Ci0KLQltYXBwZWRfcGFnZXMgPSBtZW0vZ2V0cGFnZXNpemUoKTsKLQotCS8qIEVhY2ggUFRFIHBhZ2UgY2FuIG1hcCBwdGVzX3Blcl9wYWdlIHBhZ2VzOiBob3cgbWFueSBkbyB3ZSBuZWVkPyAqLwotCWxpbmVhcl9wYWdlcyA9IChtYXBwZWRfcGFnZXMgKyBwdGVzX3Blcl9wYWdlLTEpL3B0ZXNfcGVyX3BhZ2U7Ci0KLQkvKiBXZSBwdXQgdGhlIHRvcGxldmVsIHBhZ2UgZGlyZWN0b3J5IHBhZ2UgYXQgdGhlIHRvcCBvZiBtZW1vcnkuICovCi0JcGdkaXIgPSBmcm9tX2d1ZXN0X3BoeXMobWVtKSAtIGluaXRyZF9zaXplIC0gZ2V0cGFnZXNpemUoKTsKLQotCS8qIE5vdyB3ZSB1c2UgdGhlIG5leHQgbGluZWFyX3BhZ2VzIHBhZ2VzIGFzIHB0ZSBwYWdlcyAqLwotCWxpbmVhciA9ICh2b2lkICopcGdkaXIgLSBsaW5lYXJfcGFnZXMqZ2V0cGFnZXNpemUoKTsKLQotCS8qIExpbmVhciBtYXBwaW5nIGlzIGVhc3k6IHB1dCBldmVyeSBwYWdlJ3MgYWRkcmVzcyBpbnRvIHRoZSBtYXBwaW5nIGluCi0JICogb3JkZXIuICBQQUdFX1BSRVNFTlQgY29udGFpbnMgdGhlIGZsYWdzIFByZXNlbnQsIFdyaXRhYmxlIGFuZAotCSAqIEV4ZWN1dGFibGUuICovCi0JZm9yIChpID0gMDsgaSA8IG1hcHBlZF9wYWdlczsgaSsrKQotCQlsaW5lYXJbaV0gPSAoKGkgKiBnZXRwYWdlc2l6ZSgpKSB8IFBBR0VfUFJFU0VOVCk7Ci0KLQkvKiBUaGUgdG9wIGxldmVsIHBvaW50cyB0byB0aGUgbGluZWFyIHBhZ2UgdGFibGUgcGFnZXMgYWJvdmUuICovCi0JZm9yIChpID0gMDsgaSA8IG1hcHBlZF9wYWdlczsgaSArPSBwdGVzX3Blcl9wYWdlKSB7Ci0JCXBnZGlyW2kvcHRlc19wZXJfcGFnZV0KLQkJCT0gKCh0b19ndWVzdF9waHlzKGxpbmVhcikgKyBpKnNpemVvZih2b2lkICopKQotCQkJICAgfCBQQUdFX1BSRVNFTlQpOwotCX0KLQotCXZlcmJvc2UoIkxpbmVhciBtYXBwaW5nIG9mICV1IHBhZ2VzIGluICV1IHB0ZSBwYWdlcyBhdCAlI2x4XG4iLAotCQltYXBwZWRfcGFnZXMsIGxpbmVhcl9wYWdlcywgdG9fZ3Vlc3RfcGh5cyhsaW5lYXIpKTsKLQotCS8qIFdlIHJldHVybiB0aGUgdG9wIGxldmVsIChndWVzdC1waHlzaWNhbCkgYWRkcmVzczogdGhlIGtlcm5lbCBuZWVkcwotCSAqIHRvIGtub3cgd2hlcmUgaXQgaXMuICovCi0JcmV0dXJuIHRvX2d1ZXN0X3BoeXMocGdkaXIpOwotfQogLyo6Ki8KIAogLyogU2ltcGxlIHJvdXRpbmUgdG8gcm9sbCBhbGwgdGhlIGNvbW1hbmRsaW5lIGFyZ3VtZW50cyB0b2dldGhlciB3aXRoIHNwYWNlcwpAQCAtNTQ4LDEzICs1MDMsMTMgQEAKIAogLypMOjE4NSBUaGlzIGlzIHdoZXJlIHdlIGFjdHVhbGx5IHRlbGwgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZSBHdWVzdC4gIFdlCiAgKiBzYXcgdGhlIGFyZ3VtZW50cyBpdCBleHBlY3RzIHdoZW4gd2UgbG9va2VkIGF0IGluaXRpYWxpemUoKSBpbiBsZ3Vlc3RfdXNlci5jOgotICogdGhlIGJhc2Ugb2YgR3Vlc3QgInBoeXNpY2FsIiBtZW1vcnksIHRoZSB0b3AgcGh5c2ljYWwgcGFnZSB0byBhbGxvdywgdGhlCi0gKiB0b3AgbGV2ZWwgcGFnZXRhYmxlIGFuZCB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBHdWVzdC4gKi8KLXN0YXRpYyBpbnQgdGVsbF9rZXJuZWwodW5zaWduZWQgbG9uZyBwZ2RpciwgdW5zaWduZWQgbG9uZyBzdGFydCkKKyAqIHRoZSBiYXNlIG9mIEd1ZXN0ICJwaHlzaWNhbCIgbWVtb3J5LCB0aGUgdG9wIHBoeXNpY2FsIHBhZ2UgdG8gYWxsb3cgYW5kIHRoZQorICogZW50cnkgcG9pbnQgZm9yIHRoZSBHdWVzdC4gKi8KK3N0YXRpYyBpbnQgdGVsbF9rZXJuZWwodW5zaWduZWQgbG9uZyBzdGFydCkKIHsKIAl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgTEhSRVFfSU5JVElBTElaRSwKIAkJCQkgKHVuc2lnbmVkIGxvbmcpZ3Vlc3RfYmFzZSwKLQkJCQkgZ3Vlc3RfbGltaXQgLyBnZXRwYWdlc2l6ZSgpLCBwZ2Rpciwgc3RhcnQgfTsKKwkJCQkgZ3Vlc3RfbGltaXQgLyBnZXRwYWdlc2l6ZSgpLCBzdGFydCB9OwogCWludCBmZDsKIAogCXZlcmJvc2UoIkd1ZXN0OiAlcCAtICVwICglI2x4KVxuIiwKQEAgLTEwMzAsNyArOTg1LDcgQEAKIAkJLyogWmVybyBvdXQgdGhlIHZpcnRxdWV1ZXMuICovCiAJCWZvciAodnEgPSBkZXYtPnZxOyB2cTsgdnEgPSB2cS0+bmV4dCkgewogCQkJbWVtc2V0KHZxLT52cmluZy5kZXNjLCAwLAotCQkJICAgICAgIHZyaW5nX3NpemUodnEtPmNvbmZpZy5udW0sIGdldHBhZ2VzaXplKCkpKTsKKwkJCSAgICAgICB2cmluZ19zaXplKHZxLT5jb25maWcubnVtLCBMR1VFU1RfVlJJTkdfQUxJR04pKTsKIAkJCWxnX2xhc3RfYXZhaWwodnEpID0gMDsKIAkJfQogCX0gZWxzZSBpZiAoZGV2LT5kZXNjLT5zdGF0dXMgJiBWSVJUSU9fQ09ORklHX1NfRkFJTEVEKSB7CkBAIC0xMjExLDcgKzExNjYsNyBAQAogCXZvaWQgKnA7CiAKIAkvKiBGaXJzdCB3ZSBuZWVkIHNvbWUgbWVtb3J5IGZvciB0aGlzIHZpcnRxdWV1ZS4gKi8KLQlwYWdlcyA9ICh2cmluZ19zaXplKG51bV9kZXNjcywgZ2V0cGFnZXNpemUoKSkgKyBnZXRwYWdlc2l6ZSgpIC0gMSkKKwlwYWdlcyA9ICh2cmluZ19zaXplKG51bV9kZXNjcywgTEdVRVNUX1ZSSU5HX0FMSUdOKSArIGdldHBhZ2VzaXplKCkgLSAxKQogCQkvIGdldHBhZ2VzaXplKCk7CiAJcCA9IGdldF9wYWdlcyhwYWdlcyk7CiAKQEAgLTEyMjgsNyArMTE4Myw3IEBACiAJdnEtPmNvbmZpZy5wZm4gPSB0b19ndWVzdF9waHlzKHApIC8gZ2V0cGFnZXNpemUoKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHZyaW5nLiAqLwotCXZyaW5nX2luaXQoJnZxLT52cmluZywgbnVtX2Rlc2NzLCBwLCBnZXRwYWdlc2l6ZSgpKTsKKwl2cmluZ19pbml0KCZ2cS0+dnJpbmcsIG51bV9kZXNjcywgcCwgTEdVRVNUX1ZSSU5HX0FMSUdOKTsKIAogCS8qIEFwcGVuZCB2aXJ0cXVldWUgdG8gdGhpcyBkZXZpY2UncyBkZXNjcmlwdG9yLiAgV2UgdXNlCiAJICogZGV2aWNlX2NvbmZpZygpIHRvIGdldCB0aGUgZW5kIG9mIHRoZSBkZXZpY2UncyBjdXJyZW50IHZpcnRxdWV1ZXM7CkBAIC0xOTQxLDcgKzE4OTYsNyBAQAogewogCS8qIE1lbW9yeSwgdG9wLWxldmVsIHBhZ2V0YWJsZSwgY29kZSBzdGFydHBvaW50IGFuZCBzaXplIG9mIHRoZQogCSAqIChvcHRpb25hbCkgaW5pdHJkLiAqLwotCXVuc2lnbmVkIGxvbmcgbWVtID0gMCwgcGdkaXIsIHN0YXJ0LCBpbml0cmRfc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBtZW0gPSAwLCBzdGFydCwgaW5pdHJkX3NpemUgPSAwOwogCS8qIFR3byB0ZW1wb3JhcmllcyBhbmQgdGhlIC9kZXYvbGd1ZXN0IGZpbGUgZGVzY3JpcHRvci4gKi8KIAlpbnQgaSwgYywgbGd1ZXN0X2ZkOwogCS8qIFRoZSBib290IGluZm9ybWF0aW9uIGZvciB0aGUgR3Vlc3QuICovCkBAIC0yMDQwLDkgKzE5OTUsNiBAQAogCQlib290LT5oZHIudHlwZV9vZl9sb2FkZXIgPSAweEZGOwogCX0KIAotCS8qIFNldCB1cCB0aGUgaW5pdGlhbCBsaW5lYXIgcGFnZXRhYmxlcywgc3RhcnRpbmcgYmVsb3cgdGhlIGluaXRyZC4gKi8KLQlwZ2RpciA9IHNldHVwX3BhZ2V0YWJsZXMobWVtLCBpbml0cmRfc2l6ZSk7Ci0KIAkvKiBUaGUgTGludXggYm9vdCBoZWFkZXIgY29udGFpbnMgYW4gIkU4MjAiIG1lbW9yeSBtYXA6IG91cnMgaXMgYQogCSAqIHNpbXBsZSwgc2luZ2xlIHJlZ2lvbi4gKi8KIAlib290LT5lODIwX2VudHJpZXMgPSAxOwpAQCAtMjA2NCw3ICsyMDE2LDcgQEAKIAogCS8qIFdlIHRlbGwgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZSBHdWVzdDogdGhpcyByZXR1cm5zIHRoZSBvcGVuCiAJICogL2Rldi9sZ3Vlc3QgZmlsZSBkZXNjcmlwdG9yLiAqLwotCWxndWVzdF9mZCA9IHRlbGxfa2VybmVsKHBnZGlyLCBzdGFydCk7CisJbGd1ZXN0X2ZkID0gdGVsbF9rZXJuZWwoc3RhcnQpOwogCiAJLyogV2UgY2xvbmUgb2ZmIGEgdGhyZWFkLCB3aGljaCB3YWtlcyB0aGUgTGF1bmNoZXIgd2hlbmV2ZXIgb25lIG9mIHRoZQogCSAqIGlucHV0IGZpbGUgZGVzY3JpcHRvcnMgbmVlZHMgYXR0ZW50aW9uLiAgV2UgY2FsbCB0aGlzIHRoZSBXYWtlciwgYW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dCBiL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CmluZGV4IDRiYTQ2NjQuLjljYjkxMzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CkBAIC03MSwzNSArNzEsNTAgQEAKIAogIyBsZXNzIC9wcm9jL2xvY2tfc3RhdAogCi0wMSBsb2NrX3N0YXQgdmVyc2lvbiAwLjIKKzAxIGxvY2tfc3RhdCB2ZXJzaW9uIDAuMwogMDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUgICAgY29uLWJvdW5jZXMgICAgY29udGVudGlvbnMgICB3YWl0dGltZS1taW4gICB3YWl0dGltZS1tYXggd2FpdHRpbWUtdG90YWwgICAgYWNxLWJvdW5jZXMgICBhY3F1aXNpdGlvbnMgICBob2xkdGltZS1taW4gICBob2xkdGltZS1tYXggaG9sZHRpbWUtdG90YWwKIDA0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAwNQotMDYgICAgICAgICAgICAgICAmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2stVzogICAgICAgICAgICAxNSAgICAgICAgICAyMTY1NyAgICAgICAgICAgMC4xOCAgICAgMTA5MzI5NS4zMCAxMTU0NzEzMTA1NC44NSAgICAgICAgICAgICA1OCAgICAgICAgICAxMDQxNSAgICAgICAgICAgMC4xNiAgICAgICAgICA4Ny41MSAgICAgICAgNjM4Ny42MAotMDcgICAgICAgICAgICAgICAmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2stUjogICAgICAgICAgICAgMCAgICAgICAgICAgICAgMCAgICAgICAgICAgMC4wMCAgICAgICAgICAgMC4wMCAgICAgICAgICAgMC4wMCAgICAgICAgICAyMzMwMiAgICAgICAgIDIzMTE5OCAgICAgICAgICAgMC4yNSAgICAgICAgICAgOC40NSAgICAgICA5ODAyMy4zOAotMDggICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotMDkgICAgICAgICAgICAgICAgICZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayAgICAgICAgICAgICAgMCAgICAgICAgICBbPGZmZmZmZmZmODAyN2MwOGY+XSBhZGRfdG9fcGFnZV9jYWNoZSsweDVmLzB4MTkwCi0xMAotMTEgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLTEyCi0xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYWNoZV9sb2NrOiAgICAgICAgICAxMDM3ICAgICAgICAgICAxMTYxICAgICAgICAgICAwLjM4ICAgICAgICAgIDQ1LjMyICAgICAgICAgNzc0LjUxICAgICAgICAgICA2NjExICAgICAgICAgMjQzMzcxICAgICAgICAgICAwLjE1ICAgICAgICAgMzA2LjQ4ICAgICAgIDc3Mzg3LjI0Ci0xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tCi0xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYWNoZV9sb2NrICAgICAgICAgICAgMTgwICAgICAgICAgIFs8ZmZmZmZmZmY4MDJjMGQ3ZT5dIHN5c19nZXRjd2QrMHgxMWUvMHgyMzAKLTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNhY2hlX2xvY2sgICAgICAgICAgICAxNjUgICAgICAgICAgWzxmZmZmZmZmZjgwMmMwMDJhPl0gZF9hbGxvYysweDE1YS8weDIxMAotMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FjaGVfbG9jayAgICAgICAgICAgICAzMyAgICAgICAgICBbPGZmZmZmZmZmODAzNTgxOGQ+XSBfYXRvbWljX2RlY19hbmRfbG9jaysweDRkLzB4NzAKLTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNhY2hlX2xvY2sgICAgICAgICAgICAgIDEgICAgICAgICAgWzxmZmZmZmZmZjgwMmJlZWY4Pl0gc2hyaW5rX2RjYWNoZV9wYXJlbnQrMHgxOC8weDEzMAorMDYgICAgICAgICAgICAgICAgICAgICAgICAgICZtbS0+bW1hcF9zZW0tVzogICAgICAgICAgIDIzMyAgICAgICAgICAgIDUzOCAxODQ0Njc0NDA3MzcwOCAgICAgICAyMjkyNC4yNyAgICAgIDYwNzI0My41MSAgICAgICAgICAgMTM0MiAgICAgICAgICA0NTgwNiAgICAgICAgICAgMS43MSAgICAgICAgODU5NS44OSAgICAgMTE4MDU4Mi4zNAorMDcgICAgICAgICAgICAgICAgICAgICAgICAgICZtbS0+bW1hcF9zZW0tUjogICAgICAgICAgIDIwNSAgICAgICAgICAgIDU4NyAxODQ0Njc0NDA3MzcwOCAgICAgICAyODQwMy4zNiAgICAgIDczMTk3NS4wMCAgICAgICAgICAgMTk0MCAgICAgICAgIDQxMjQyNiAgICAgICAgICAgMC41OCAgICAgIDE4NzgyNS40NSAgICAgNjMwNzUwMi44OAorMDggICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQorMDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tLT5tbWFwX3NlbSAgICAgICAgICAgIDQ4NyAgICAgICAgICBbPGZmZmZmZmZmODA1MzQ5MWY+XSBkb19wYWdlX2ZhdWx0KzB4NDY2LzB4OTI4CisxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW0tPm1tYXBfc2VtICAgICAgICAgICAgMTc5ICAgICAgICAgIFs8ZmZmZmZmZmY4MDJhNjIwMD5dIHN5c19tcHJvdGVjdCsweGNkLzB4MjFkCisxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW0tPm1tYXBfc2VtICAgICAgICAgICAgMjc5ICAgICAgICAgIFs8ZmZmZmZmZmY4MDIxMGE1Nz5dIHN5c19tbWFwKzB4NzUvMHhjZQorMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tLT5tbWFwX3NlbSAgICAgICAgICAgICA3NiAgICAgICAgICBbPGZmZmZmZmZmODAyYTQ5MGI+XSBzeXNfbXVubWFwKzB4MzIvMHg1OQorMTMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLQorMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tLT5tbWFwX3NlbSAgICAgICAgICAgIDI3MCAgICAgICAgICBbPGZmZmZmZmZmODAyMTBhNTc+XSBzeXNfbW1hcCsweDc1LzB4Y2UKKzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtbS0+bW1hcF9zZW0gICAgICAgICAgICA0MzEgICAgICAgICAgWzxmZmZmZmZmZjgwNTM0OTFmPl0gZG9fcGFnZV9mYXVsdCsweDQ2Ni8weDkyOAorMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tLT5tbWFwX3NlbSAgICAgICAgICAgIDEzOCAgICAgICAgICBbPGZmZmZmZmZmODAyYTQ5MGI+XSBzeXNfbXVubWFwKzB4MzIvMHg1OQorMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tLT5tbWFwX3NlbSAgICAgICAgICAgIDE0NSAgICAgICAgICBbPGZmZmZmZmZmODAyYTYyMDA+XSBzeXNfbXByb3RlY3QrMHhjZC8weDIxZAorMTgKKzE5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisyMAorMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FjaGVfbG9jazogICAgICAgICAgIDYyMSAgICAgICAgICAgIDYyMyAgICAgICAgICAgMC41MiAgICAgICAgIDExOC4yNiAgICAgICAgMTA1My4wMiAgICAgICAgICAgNjc0NSAgICAgICAgICA5MTkzMCAgICAgICAgICAgMC4yOSAgICAgICAgIDMxNi4yOSAgICAgIDExODQyMy40MQorMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLQorMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FjaGVfbG9jayAgICAgICAgICAgIDE3OSAgICAgICAgICBbPGZmZmZmZmZmODAzNzgyNzQ+XSBfYXRvbWljX2RlY19hbmRfbG9jaysweDM0LzB4NTQKKzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNhY2hlX2xvY2sgICAgICAgICAgICAxMTMgICAgICAgICAgWzxmZmZmZmZmZjgwMmNjMTdiPl0gZF9hbGxvYysweDE5YS8weDFlYgorMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FjaGVfbG9jayAgICAgICAgICAgICA5OSAgICAgICAgICBbPGZmZmZmZmZmODAyY2EwZGM+XSBkX3JlaGFzaCsweDFiLzB4NDQKKzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNhY2hlX2xvY2sgICAgICAgICAgICAxMDQgICAgICAgICAgWzxmZmZmZmZmZjgwMmNiY2EwPl0gZF9pbnN0YW50aWF0ZSsweDM2LzB4OGEKKzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0KKzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNhY2hlX2xvY2sgICAgICAgICAgICAxOTIgICAgICAgICAgWzxmZmZmZmZmZjgwMzc4Mjc0Pl0gX2F0b21pY19kZWNfYW5kX2xvY2srMHgzNC8weDU0CisyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYWNoZV9sb2NrICAgICAgICAgICAgIDk4ICAgICAgICAgIFs8ZmZmZmZmZmY4MDJjYTBkYz5dIGRfcmVoYXNoKzB4MWIvMHg0NAorMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FjaGVfbG9jayAgICAgICAgICAgICA3MiAgICAgICAgICBbPGZmZmZmZmZmODAyY2MxN2I+XSBkX2FsbG9jKzB4MTlhLzB4MWViCiszMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYWNoZV9sb2NrICAgICAgICAgICAgMTEyICAgICAgICAgIFs8ZmZmZmZmZmY4MDJjYmNhMD5dIGRfaW5zdGFudGlhdGUrMHgzNi8weDhhCiAKIFRoaXMgZXhjZXJwdCBzaG93cyB0aGUgZmlyc3QgdHdvIGxvY2sgY2xhc3Mgc3RhdGlzdGljcy4gTGluZSAwMSBzaG93cyB0aGUKIG91dHB1dCB2ZXJzaW9uIC0gZWFjaCB0aW1lIHRoZSBmb3JtYXQgY2hhbmdlcyB0aGlzIHdpbGwgYmUgdXBkYXRlZC4gTGluZSAwMi0wNAotc2hvdyB0aGUgaGVhZGVyIHdpdGggY29sdW1uIGRlc2NyaXB0aW9ucy4gTGluZXMgMDUtMTAgYW5kIDEzLTE4IHNob3cgdGhlIGFjdHVhbAorc2hvdyB0aGUgaGVhZGVyIHdpdGggY29sdW1uIGRlc2NyaXB0aW9ucy4gTGluZXMgMDUtMTggYW5kIDIwLTMxIHNob3cgdGhlIGFjdHVhbAogc3RhdGlzdGljcy4gVGhlc2Ugc3RhdGlzdGljcyBjb21lIGluIHR3byBwYXJ0czsgdGhlIGFjdHVhbCBzdGF0cyBzZXBhcmF0ZWQgYnkgYQotc2hvcnQgc2VwYXJhdG9yIChsaW5lIDA4LCAxNCkgZnJvbSB0aGUgY29udGVudGlvbiBwb2ludHMuCitzaG9ydCBzZXBhcmF0b3IgKGxpbmUgMDgsIDEzKSBmcm9tIHRoZSBjb250ZW50aW9uIHBvaW50cy4KIAotVGhlIGZpcnN0IGxvY2sgKDA1LTEwKSBpcyBhIHJlYWQvd3JpdGUgbG9jaywgYW5kIHNob3dzIHR3byBsaW5lcyBhYm92ZSB0aGUKK1RoZSBmaXJzdCBsb2NrICgwNS0xOCkgaXMgYSByZWFkL3dyaXRlIGxvY2ssIGFuZCBzaG93cyB0d28gbGluZXMgYWJvdmUgdGhlCiBzaG9ydCBzZXBhcmF0b3IuIFRoZSBjb250ZW50aW9uIHBvaW50cyBkb24ndCBtYXRjaCB0aGUgY29sdW1uIGRlc2NyaXB0b3JzLAotdGhleSBoYXZlIHR3bzogY29udGVudGlvbnMgYW5kIFs8SVA+XSBzeW1ib2wuCit0aGV5IGhhdmUgdHdvOiBjb250ZW50aW9ucyBhbmQgWzxJUD5dIHN5bWJvbC4gVGhlIHNlY29uZCBzZXQgb2YgY29udGVudGlvbgorcG9pbnRzIGFyZSB0aGUgcG9pbnRzIHdlJ3JlIGNvbnRlbmRpbmcgd2l0aC4KIAorVGhlIGludGVnZXIgcGFydCBvZiB0aGUgdGltZSB2YWx1ZXMgaXMgaW4gdXMuCiAKIFZpZXcgdGhlIHRvcCBjb250ZW5kaW5nIGxvY2tzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvY3hnYjNpLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9jeGdiM2kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDFmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvY3hnYjNpLnR4dApAQCAtMCwwICsxLDg1IEBACitDaGVsc2lvIFMzIGlTQ1NJIERyaXZlciBmb3IgTGludXgKKworSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhlIENoZWxzaW8gVDMgQVNJQyBiYXNlZCBBZGFwdGVycyAoUzMxMCwgUzMyMCwgUzMwMiwgUzMwNCwgTWV6eiBjYXJkcywgZXRjLgorc2VyaWVzIG9mIHByb2R1Y3RzKSBzdXBwb3J0cyBpU0NTSSBhY2NlbGVyYXRpb24gYW5kIGlTQ1NJIERpcmVjdCBEYXRhIFBsYWNlbWVudAorKEREUCkgd2hlcmUgdGhlIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGV4cGVuc2l2ZSBieXRlIHRvdWNoaW5nIG9wZXJhdGlvbnMsIHN1Y2gKK2FzIENSQyBjb21wdXRhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLCBhbmQgZGlyZWN0IERNQSB0byB0aGUgZmluYWwgaG9zdCBtZW1vcnkKK2Rlc3RpbmF0aW9uOgorCisJLSBpU0NTSSBQRFUgZGlnZXN0IGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbgorCisJICBPbiB0cmFuc21pdHRpbmcsIENoZWxzaW8gUzMgaC93IGNvbXB1dGVzIGFuZCBpbnNlcnRzIHRoZSBIZWFkZXIgYW5kCisJICBEYXRhIGRpZ2VzdCBpbnRvIHRoZSBQRFVzLgorCSAgT24gcmVjZWl2aW5nLCBDaGVsc2lvIFMzIGgvdyBjb21wdXRlcyBhbmQgdmVyaWZpZXMgdGhlIEhlYWRlciBhbmQKKwkgIERhdGEgZGlnZXN0IG9mIHRoZSBQRFVzLgorCisJLSBEaXJlY3QgRGF0YSBQbGFjZW1lbnQgKEREUCkKKworCSAgUzMgaC93IGNhbiBkaXJlY3RseSBwbGFjZSB0aGUgaVNDU0kgRGF0YS1JbiBvciBEYXRhLU91dCBQRFUncworCSAgcGF5bG9hZCBpbnRvIHByZS1wb3N0ZWQgZmluYWwgZGVzdGluYXRpb24gaG9zdC1tZW1vcnkgYnVmZmVycyBiYXNlZAorCSAgb24gdGhlIEluaXRpYXRvciBUYXNrIFRhZyAoSVRUKSBpbiBEYXRhLUluIG9yIFRhcmdldCBUYXNrIFRhZyAoVFRUKQorCSAgaW4gRGF0YS1PdXQgUERVcy4KKworCS0gUERVIFRyYW5zbWl0IGFuZCBSZWNvdmVyeQorCisJICBPbiB0cmFuc21pdHRpbmcsIFMzIGgvdyBhY2NlcHRzIHRoZSBjb21wbGV0ZSBQRFUgKGhlYWRlciArIGRhdGEpCisJICBmcm9tIHRoZSBob3N0IGRyaXZlciwgY29tcHV0ZXMgYW5kIGluc2VydHMgdGhlIGRpZ2VzdHMsIGRlY29tcG9zZXMKKwkgIHRoZSBQRFUgaW50byBtdWx0aXBsZSBUQ1Agc2VnbWVudHMgaWYgbmVjZXNzYXJ5LCBhbmQgdHJhbnNtaXQgYWxsCisJICB0aGUgVENQIHNlZ21lbnRzIG9udG8gdGhlIHdpcmUuIEl0IGhhbmRsZXMgVENQIHJldHJhbnNtaXNzaW9uIGlmCisJICBuZWVkZWQuCisKKwkgIE9uIHJlY2V2aW5nLCBTMyBoL3cgcmVjb3ZlcnMgdGhlIGlTQ1NJIFBEVSBieSByZWFzc2VtYmxpbmcgVENQCisJICBzZWdtZW50cywgc2VwYXJhdGluZyB0aGUgaGVhZGVyIGFuZCBkYXRhLCBjYWxjdWxhdGluZyBhbmQgdmVyaWZ5aW5nCisJICB0aGUgZGlnZXN0cywgdGhlbiBmb3J3YXJkcyB0aGUgaGVhZGVyIHRvIHRoZSBob3N0LiBUaGUgcGF5bG9hZCBkYXRhLAorCSAgaWYgcG9zc2libGUsIHdpbGwgYmUgZGlyZWN0bHkgcGxhY2VkIGludG8gdGhlIHByZS1wb3N0ZWQgaG9zdCBERFAKKwkgIGJ1ZmZlci4gT3RoZXJ3aXNlLCB0aGUgcGF5bG9hZCBkYXRhIHdpbGwgYmUgc2VudCB0byB0aGUgaG9zdCB0b28uCisKK1RoZSBjeGdiM2kgZHJpdmVyIGludGVyZmFjZXMgd2l0aCBvcGVuLWlzY3NpIGluaXRpYXRvciBhbmQgcHJvdmlkZXMgdGhlIGlTQ1NJCithY2NlbGVyYXRpb24gdGhyb3VnaCBDaGVsc2lvIGhhcmR3YXJlIHdoZXJldmVyIGFwcGxpY2FibGUuCisKK1VzaW5nIHRoZSBjeGdiM2kgRHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIHN0ZXBzIG5lZWQgdG8gYmUgdGFrZW4gdG8gYWNjZWxlcmF0ZXMgdGhlIG9wZW4taXNjc2kgaW5pdGlhdG9yOgorCisxLiBMb2FkIHRoZSBjeGdiM2kgZHJpdmVyOiAibW9kcHJvYmUgY3hnYjNpIgorCisgICBUaGUgY3hnYjNpIG1vZHVsZSByZWdpc3RlcnMgYSBuZXcgdHJhbnNwb3J0IGNsYXNzICJjeGdiM2kiIHdpdGggb3Blbi1pc2NzaS4KKworICAgKiBpbiB0aGUgY2FzZSBvZiByZWNvbXBpbGluZyB0aGUga2VybmVsLCB0aGUgY3hnYjNpIHNlbGVjdGlvbiBpcyBsb2NhdGVkIGF0CisJRGV2aWNlIERyaXZlcnMKKwkJU0NTSSBkZXZpY2Ugc3VwcG9ydCAtLS0+CisJCQlbKl0gU0NTSSBsb3ctbGV2ZWwgZHJpdmVycyAgLS0tPgorCQkJCTxNPiAgIENoZWxzaW8gUzN4eCBpU0NTSSBzdXBwb3J0CisKKzIuIENyZWF0ZSBhbiBpbnRlcmZhY2UgZmlsZSBsb2NhdGVkIHVuZGVyIC9ldGMvaXNjc2kvaWZhY2VzLyBmb3IgdGhlIG5ldworICAgdHJhbnNwb3J0IGNsYXNzICJjeGdiM2kiLgorCisgICBUaGUgY29udGVudCBvZiB0aGUgZmlsZSBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisJaWZhY2UudHJhbnNwb3J0X25hbWUgPSBjeGdiM2kKKwlpZmFjZS5uZXRfaWZhY2VuYW1lID0gPGV0aFg+CisJaWZhY2UuaXBhZGRyZXNzID0gPGlzY3NpIGlwIGFkZHJlc3M+CisKKyAgICogaWYgaWZhY2UuaXBhZGRyZXNzIGlzIHNwZWNpZmllZCwgPGlzY3NpIGlwIGFkZHJlc3M+IG5lZWRzIHRvIGJlIGVpdGhlciB0aGUKKwlzYW1lIGFzIHRoZSBldGhYJ3MgaXAgYWRkcmVzcyBvciBhbiBhZGRyZXNzIG9uIHRoZSBzYW1lIHN1Ym5ldC4gTWFrZQorCXN1cmUgdGhlIGlwIGFkZHJlc3MgaXMgdW5pcXVlIGluIHRoZSBuZXR3b3JrLgorCiszLiBlZGl0IC9ldGMvaXNjc2kvaXNjc2lkLmNvbmYKKyAgIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIE1heFJlY3ZEYXRhU2VnbWVudExlbmd0aCAoMTMxMDcyKSBpcyB0b28gYmlnLAorICAgcmVwbGFjZSAibm9kZS5jb25uWzBdLmlzY3NpLk1heFJlY3ZEYXRhU2VnbWVudExlbmd0aCIgdG8gYmUgYSB2YWx1ZSBubworICAgYmlnZ2VyIHRoYW4gMTUzNjAgKGZvciBleGFtcGxlIDgxOTIpOgorCisJbm9kZS5jb25uWzBdLmlzY3NpLk1heFJlY3ZEYXRhU2VnbWVudExlbmd0aCA9IDgxOTIKKworICAgKiBUaGUgbG9naW4gd291bGQgZmFpbCBmb3IgYSBub3JtYWwgc2Vzc2lvbiBpZiBNYXhSZWN2RGF0YVNlZ21lbnRMZW5ndGggaXMKKwl0b28gYmlnLiAgQSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtYXQgb2YKKwkiY3hnYjNpOiBFUlIhIE1heFJlY3ZTZWdtZW50TGVuZ3RoIDxYPiB0b28gYmlnLiBOZWVkIHRvIGJlIDw9IDxZPi4iCisJd291bGQgYmUgbG9nZ2VkIHRvIGRtZXNnLgorCis0LiBUbyBkaXJlY3Qgb3Blbi1pc2NzaSB0cmFmZmljIHRvIGdvIHRocm91Z2ggY3hnYjNpJ3MgYWNjZWxlcmF0ZWQgcGF0aCwKKyAgICItSSA8aWZhY2UgZmlsZSBuYW1lPiIgb3B0aW9uIG5lZWRzIHRvIGJlIHNwZWNpZmllZCB3aXRoIG1vc3Qgb2YgdGhlCisgICBpc2NzaWFkbSBjb21tYW5kLiA8aWZhY2UgZmlsZSBuYW1lPiBpcyB0aGUgdHJhbnNwb3J0IGludGVyZmFjZSBmaWxlIGNyZWF0ZWQKKyAgIGluIHN0ZXAgMi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCmluZGV4IGFmYmU5YWUuLmQ3NDlkNDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbApAQCAtMSwxNiArMSwyNyBAQAotPFRJVExFPlY0TCBBUEk8L1RJVExFPgotPEgxPlZpZGVvIEZvciBMaW51eCBBUElzPC9IMT4KLTx0YWJsZSBib3JkZXI9MD4KLTx0cj4KLTx0ZD4KLTxBIEhSRUY9aHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvdmlkZW80bGludXgvQVBJL1Y0TDFfQVBJLmh0bWw+Ci1WNEwgb3JpZ2luYWwgQVBJPC9hPgotPC90ZD48dGQ+Ci1PYnNvbGV0ZWQgYnkgVjRMMiBBUEkKLTwvdGQ+PC90cj48dHI+PHRkPgotPEEgSFJFRj1odHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy92aWRlbzRsaW51eC9BUEkvVjRMMl9BUEk+Ci1WNEwyIEFQSTwvYT4KLTwvdGQ+PHRkPgotU2hvdWxkIGJlIHVzZWQgZm9yIG5ldyBwcm9qZWN0cwotPC90ZD48L3RyPgotPC90YWJsZT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KKyA8aGVhZD4KKyAgPG1ldGEgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9SVNPLTg4NTktMiIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgorICA8dGl0bGU+VjRMIEFQSTwvdGl0bGU+CisgPC9oZWFkPgorIDxib2R5PgorICA8aDE+VmlkZW8gRm9yIExpbnV4IEFQSXM8L2gxPgorICA8dGFibGUgYm9yZGVyPSIwIj4KKyAgIDx0cj4KKyAgICA8dGQ+CisgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwxX0FQSS5odG1sIj5WNEwgb3JpZ2luYWwgQVBJPC9hPgorICAgIDwvdGQ+CisgICAgPHRkPgorICAgICBPYnNvbGV0ZWQgYnkgVjRMMiBBUEkKKyAgICA8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICA8dGQ+CisgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwyX0FQSSI+VjRMMiBBUEk8L2E+CisgICAgPC90ZD4KKyAgICA8dGQ+U2hvdWxkIGJlIHVzZWQgZm9yIG5ldyBwcm9qZWN0cworICAgIDwvdGQ+CisgICA8L3RyPgorICA8L3RhYmxlPgorIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgppbmRleCA2MGJhNjY4Li4wZDkzZmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CkBAIC0xMDQsOCArMTA0LDggQEAKIDEwMyAtPiBHcmFuZCBYLUd1YXJkIC8gVHJ1c3QgODE0UENJICAgICAgICAgICAgICAgICAgICAgICAgWzAzMDQ6MDEwMl0KIDEwNCAtPiBOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzE6MDEwMV0KIDEwNSAtPiBQcm9WaWRlbyBQVjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FhMDA6MTQzMCxhYTAwOjE0MzEsYWEwMDoxNDMyLGFhMDA6MTQzMyxhYTAzOjE0MzNdCi0xMDYgLT4gUEhZVEVDIFZELTAwOS1YMSBNaW5pRElOIChidDg3OCkKLTEwNyAtPiBQSFlURUMgVkQtMDA5LVgxIENvbWJpIChidDg3OCkKKzEwNiAtPiBQSFlURUMgVkQtMDA5LVgxIFZELTAxMSBNaW5pRElOIChidDg3OCkKKzEwNyAtPiBQSFlURUMgVkQtMDA5LVgxIFZELTAxMSBDb21iaSAoYnQ4NzgpCiAxMDggLT4gUEhZVEVDIFZELTAwOSBNaW5pRElOIChidDg3OCkKIDEwOSAtPiBQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkKIDExMCAtPiBJVkMtMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZmMDA6YTEzMl0KQEAgLTE1MSwzICsxNTEsNiBAQAogMTUwIC0+IEdlb3Zpc2lvbiBHVi02MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA4YTo3NjNjXQogMTUxIC0+IEtvenVtaSBLVFYtMDFDCiAxNTIgLT4gRW5jb3JlIEVOTCBUVi1GTS0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDAwOjE4MDFdCisxNTMgLT4gUEhZVEVDIFZELTAxMiAoYnQ4NzgpCisxNTQgLT4gUEhZVEVDIFZELTAxMi1YMSAoYnQ4NzgpCisxNTUgLT4gUEhZVEVDIFZELTAxMi1YMiAoYnQ4NzgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKaW5kZXggNjQ4MjNjYy4uMzVlYTEzMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQpAQCAtMTEsMyArMTEsNCBAQAogIDEwIC0+IERWaUNPIEZ1c2lvbkhEVFY3IER1YWwgRXhwcmVzcyAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkNjE4XQogIDExIC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgRHVhbCBFeHByZXNzICAgICAgICAgICAgICAgICBbMThhYzpkYjc4XQogIDEyIC0+IExlYWR0ZWsgV2luZmFzdCBQeERWUjMyMDAgSCAgICAgICAgICAgICAgICAgICAgICAgICBbMTA3ZDo2NjgxXQorIDEzIC0+IENvbXBybyBWaWRlb01hdGUgRTY1MEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTg1YjplODAwXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IGE1MjI3ZTMuLjBkMDhmMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKQEAgLTIsNyArMiw3IEBACiAgIDEgLT4gSGF1cHBhdWdlIFdpblRWIDM0eHh4IG1vZGVscyAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOjM0MDAsMDA3MDozNDAxXQogICAyIC0+IEdESSBCbGFjayBHb2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRjNzowMTA2LDE0Yzc6MDEwN10KICAgMyAtPiBQaXhlbFZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NTQ6NDgxMV0KLSAgNCAtPiBBVEkgVFYgV29uZGVyIFBybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwMDI6MDBmOF0KKyAgNCAtPiBBVEkgVFYgV29uZGVyIFBybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwMDI6MDBmOCwxMDAyOjAwZjldCiAgIDUgLT4gTGVhZHRlayBXaW5mYXN0IDIwMDBYUCBFeHBlcnQgICAgICAgICAgICAgICAgICAgICAgIFsxMDdkOjY2MTEsMTA3ZDo2NjEzXQogICA2IC0+IEF2ZXJUViBTdHVkaW8gMzAzIChNMTI2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTQ2MTowMDBiXQogICA3IC0+IE1TSSBUVi1Abnl3aGVyZSBNYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTQ2Mjo4NjA2XQpAQCAtNzQsMyArNzQsNiBAQAogIDczIC0+IFRlVmlpIFM0MjAgRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZDQyMDo5MDIyXQogIDc0IC0+IFByb2xpbmsgUGl4ZWx2aWV3IEdsb2JhbCBFeHRyZW1lICAgICAgICAgICAgICAgICAgICBbMTU1NDo0OTc2XQogIDc1IC0+IFBST0YgNzMwMCBEVkItUy9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQjAzMzozMDMzXQorIDc2IC0+IFNBVFRSQURFIFNUNDIwMCBEVkItUy9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYjIwMDo0MjAwXQorIDc3IC0+IFRCUyA4OTEwIERWQi1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbODkxMDo4ODg4XQorIDc4IC0+IFByb2YgNjIwMCBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYjAyMjozMDIyXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAppbmRleCAxODdjYzQ4Li43NWJkZWQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eApAQCAtMSw1ICsxLDUgQEAKICAgMCAtPiBVbmtub3duIEVNMjgwMCB2aWRlbyBncmFiYmVyICAgICAgICAgICAgIChlbTI4MDApICAgICAgICBbZWIxYToyODAwXQotICAxIC0+IFVua25vd24gRU0yNzUwLzI4eHggdmlkZW8gZ3JhYmJlciAgICAgICAgKGVtMjgyMC9lbTI4NDApIFtlYjFhOjI4MjAsZWIxYToyODYwLGViMWE6Mjg2MSxlYjFhOjI4NzAsZWIxYToyODgxLGViMWE6Mjg4M10KKyAgMSAtPiBVbmtub3duIEVNMjc1MC8yOHh4IHZpZGVvIGdyYWJiZXIgICAgICAgIChlbTI4MjAvZW0yODQwKSBbZWIxYToyODIwLGViMWE6MjgyMSxlYjFhOjI4NjAsZWIxYToyODYxLGViMWE6Mjg3MCxlYjFhOjI4ODEsZWIxYToyODgzXQogICAyIC0+IFRlcnJhdGVjIENpbmVyZ3kgMjUwIFVTQiAgICAgICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApIFswY2NkOjAwMzZdCiAgIDMgLT4gUGlubmFjbGUgUENUViBVU0IgMiAgICAgICAgICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkgWzIzMDQ6MDIwOF0KICAgNCAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIDIgICAgICAgICAgICAgICAgICAgIChlbTI4MjAvZW0yODQwKSBbMjA0MDo0MjAwLDIwNDA6NDIwMV0KQEAgLTEyLDkgKzEyLDkgQEAKICAxMSAtPiBUZXJyYXRlYyBIeWJyaWQgWFMgICAgICAgICAgICAgICAgICAgICAgIChlbTI4ODApICAgICAgICBbMGNjZDowMDQyXQogIDEyIC0+IEt3b3JsZCBQVlIgVFYgMjgwMCBSRiAgICAgICAgICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApCiAgMTMgLT4gVGVycmF0ZWMgUHJvZGlneSBYUyAgICAgICAgICAgICAgICAgICAgICAoZW0yODgwKSAgICAgICAgWzBjY2Q6MDA0N10KLSAxNCAtPiBQaXhlbHZpZXcgUHJvbGluayBQbGF5VFYgVVNCIDIuMCAgICAgICAgIChlbTI4MjAvZW0yODQwKSBbZWIxYToyODIxXQorIDE0IC0+IFBpeGVsdmlldyBQcm9saW5rIFBsYXlUViBVU0IgMi4wICAgICAgICAgKGVtMjgyMC9lbTI4NDApCiAgMTUgLT4gVi1HZWFyIFBvY2tldFRWICAgICAgICAgICAgICAgICAgICAgICAgICAoZW0yODAwKQotIDE2IC0+IEhhdXBwYXVnZSBXaW5UViBIVlIgOTUwICAgICAgICAgICAgICAgICAgKGVtMjg4MykgICAgICAgIFsyMDQwOjY1MTMsMjA0MDo2NTE3LDIwNDA6NjUxYiwyMDQwOjY1MWZdCisgMTYgLT4gSGF1cHBhdWdlIFdpblRWIEhWUiA5NTAgICAgICAgICAgICAgICAgICAoZW0yODgzKSAgICAgICAgWzIwNDA6NjUxMywyMDQwOjY1MTcsMjA0MDo2NTFiXQogIDE3IC0+IFBpbm5hY2xlIFBDVFYgSEQgUHJvIFN0aWNrICAgICAgICAgICAgICAgKGVtMjg4MCkgICAgICAgIFsyMzA0OjAyMjddCiAgMTggLT4gSGF1cHBhdWdlIFdpblRWIEhWUiA5MDAgKFIyKSAgICAgICAgICAgICAoZW0yODgwKSAgICAgICAgWzIwNDA6NjUwMl0KICAxOSAtPiBQb2ludE5peCBJbnRyYS1PcmFsIENhbWVyYSAgICAgICAgICAgICAgIChlbTI4NjApCkBAIC0yNyw3ICsyNyw2IEBACiAgMjYgLT4gSGVyY3VsZXMgU21hcnQgVFYgVVNCIDIuMCAgICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkKICAyNyAtPiBQaW5uYWNsZSBQQ1RWIFVTQiAyIChQaGlsaXBzIEZNMTIxNk1FKSAgIChlbTI4MjAvZW0yODQwKQogIDI4IC0+IExlYWR0ZWsgV2luZmFzdCBVU0IgSUkgRGVsdXhlICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApCi0gMjkgLT4gUGlubmFjbGUgRGF6emxlIERWQyAxMDAgICAgICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkKICAzMCAtPiBWaWRlb2xvZ3kgMjBLMTRYVVNCIFVTQjIuMCAgICAgICAgICAgICAgIChlbTI4MjAvZW0yODQwKQogIDMxIC0+IFVzYmdlYXIgVkQyMDR2OSAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtMjgyMSkKICAzMiAtPiBTdXBlcmNvbXAgVVNCIDIuMCBUViAgICAgICAgICAgICAgICAgICAgIChlbTI4MjEpCkBAIC01NywzICs1Niw1IEBACiAgNTYgLT4gUGlubmFjbGUgSHlicmlkIFBybyAoMikgICAgICAgICAgICAgICAgICAoZW0yODgyKSAgICAgICAgWzIzMDQ6MDIyNl0KICA1NyAtPiBLd29ybGQgUGx1c1RWIEhEIEh5YnJpZCAzMzAgICAgICAgICAgICAgIChlbTI4ODMpICAgICAgICBbZWIxYTphMzE2XQogIDU4IC0+IENvbXBybyBWaWRlb01hdGUgRm9yWW91L1N0ZXJlbyAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApIFsxODViOjIwNDFdCisgNjAgLT4gSGF1cHBhdWdlIFdpblRWIEhWUiA4NTAgICAgICAgICAgICAgICAgICAoZW0yODgzKSAgICAgICAgWzIwNDA6NjUxZl0KKyA2MSAtPiBQaXhlbHZpZXcgUGxheVRWIEJveCA0IFVTQiAyLjAgICAgICAgICAgIChlbTI4MjAvZW0yODQwKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IGRjNjdlZWYuLjMzNWFlZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTEwLDcgKzEwLDcgQEAKICAgOSAtPiBNZWRpb24gNTA0NAogIDEwIC0+IEt3b3JsZC9LdXJvdXRvU2hpa291IFNBQTcxMzAtVFZQQ0kKICAxMSAtPiBUZXJyYXRlYyBDaW5lcmd5IDYwMCBUViAgICAgICAgICAgICAgICAgIFsxNTNiOjExNDNdCi0gMTIgLT4gTWVkaW9uIDcxMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTZiZTowMDAzXQorIDEyIC0+IE1lZGlvbiA3MTM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE2YmU6MDAwMywxNmJlOjUwMDBdCiAgMTMgLT4gVHlwaG9vbiBUVitSYWRpbyA5MDAzMQogIDE0IC0+IEVMU0EgRVgtVklTSU9OIDMwMFRWICAgICAgICAgICAgICAgICAgICAgWzEwNDg6MjI2Yl0KICAxNSAtPiBFTFNBIEVYLVZJU0lPTiA1MDBUViAgICAgICAgICAgICAgICAgICAgIFsxMDQ4OjIyNmFdCkBAIC0xNTEsMyArMTUxLDQgQEAKIDE1MCAtPiBab2dpcyBSZWFsIEFuZ2VsIDIyMAogMTUxIC0+IEFEUyBUZWNoIEluc3RhbnQgSERUViAgICAgICAgICAgICAgICAgICAgWzE0MjE6MDM4MF0KIDE1MiAtPiBBc3VzIFRpZ2VyIFJldjoxLjAwICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NTddCisxNTMgLT4gS3dvcmxkIFBsdXMgVFYgQW5hbG9nIExpdGUgUENJICAgICAgICAgICBbMTdkZTo3MTI4XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLmN4ODgKaW5kZXggMTY2ZDU5Ni4uMzVmYWUyMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5jeDg4CkBAIC0xLDQgKzEsMyBAQAotCiBjeDg4MDAgcmVsZWFzZSBub3RlcwogPT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTAsMjEgKzksMjAgQEAKIAogdmlkZW8KIAktIEJhc2ljYWxseSB3b3Jrcy4KLQktIFNvbWUgbWlub3IgaW1hZ2UgcXVhbGl0eSBnbGl0Y2hlcy4KLQktIEZvciBub3cgb25seSBjYXB0dXJlLCBvdmVybGF5IHN1cHBvcnQgaXNuJ3QgY29tcGxldGVkIHlldC4KKwktIEZvciBub3csIG9ubHkgY2FwdHVyZSBhbmQgcmVhZCgpLiBPdmVybGF5IGlzbid0IHN1cHBvcnRlZC4KIAogYXVkaW8KIAktIFRoZSBjaGlwIHNwZWNzIGZvciB0aGUgb24tY2hpcCBUViBzb3VuZCBkZWNvZGVyIGFyZSBuZXh0CiAJICB0byB1c2VsZXNzIDotLwogCS0gTmV2ZXJsZXNzIHRoZSBidWlsdGluIFRWIHNvdW5kIGRlY29kZXIgc3RhcnRzIHdvcmtpbmcgbm93LAotCSAgYXQgbGVhc3QgZm9yIFBBTC1CRy4gIE90aGVyIFRWIG5vcm1zIG5lZWQgb3RoZXIgY29kZSAuLi4KKwkgIGF0IGxlYXN0IGZvciBzb21lIHN0YW5kYXJkcy4KIAkgIEZPUiBBTlkgUkVQT1JUUyBPTiBUSElTIFBMRUFTRSBNRU5USU9OIFRIRSBUViBOT1JNIFlPVSBBUkUKIAkgIFVTSU5HLgogCS0gTW9zdCB0dW5lciBjaGlwcyBkbyBwcm92aWRlIG1vbm8gc291bmQsIHdoaWNoIG1heSBvciBtYXkgbm90CiAJICBiZSB1c2VhYmxlIGRlcGVuZGluZyBvbiB0aGUgYm9hcmQgZGVzaWduLiAgV2l0aCB0aGUgSGF1cHBhdWdlCiAJICBjYXJkcyBpdCB3b3Jrcywgc28gdGhlcmUgaXMgbW9ubyBzb3VuZCBhdmFpbGFibGUgYXMgZmFsbGJhY2suCiAJLSBhdWRpbyBkYXRhIGRtYSAoaS5lLiByZWNvcmRpbmcgd2l0aG91dCBsb29wYmFjayBjYWJsZSB0byB0aGUKLQkgIHNvdW5kIGNhcmQpIHNob3VsZCBiZSBwb3NzaWJsZSwgYnV0IHRoZXJlIGlzIG5vIGNvZGUgeWV0IC4uLgorCSAgc291bmQgY2FyZCkgaXMgc3VwcG9ydGVkIHZpYSBjeDg4LWFsc2EuCiAKIHZiaQogCS0gQ29kZSBwcmVzZW50LiBXb3JrcyBmb3IgTlRTQyBjbG9zZWQgY2FwdGlvbi4gUEFMIGFuZCBvdGhlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAppbmRleCAwMDQ4MThmLi4xYzU4YTc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dApAQCAtNTAsOSArNTAsMTQgQEAKIHNwY2E1MDgJCTA0NjE6MDgxNQlNaWNybyBJbm5vdmF0aW9uIElDMjAwCiBzdW5wbHVzCQkwNDYxOjA4MjEJRnVqaWZpbG0gTVYtMQogemMzeHgJCTA0NjE6MGEwMAlNaWNyb0lubm92YXRpb24gV2ViQ2FtMzIwCitzdHYwNnh4CQkwNDZkOjA4NDAJUXVpY2tDYW0gRXhwcmVzcworc3R2MDZ4eAkJMDQ2ZDowODUwCUxFR08gY2FtIC8gUXVpY2tDYW0gV2ViCitzdHYwNnh4CQkwNDZkOjA4NzAJRGV4eGEgV2ViQ2FtIFVTQgogc3BjYTUwMAkJMDQ2ZDowODkwCUxvZ2l0ZWNoIFF1aWNrQ2FtIHRyYXZlbGVyCiB2YzAzMngJCTA0NmQ6MDg5MglMb2dpdGVjaCBPcmJpY2FtCiB2YzAzMngJCTA0NmQ6MDg5NglMb2dpdGVjaCBPcmJpY2FtCit2YzAzMngJCTA0NmQ6MDg5NwlMb2dpdGVjaCBRdWlja0NhbSBmb3IgRGVsbCBub3RlYm9va3MKK3pjM3h4CQkwNDZkOjA4OWQJTG9naXRlY2ggUXVpY2tDYW0gRTI1MDAKIHpjM3h4CQkwNDZkOjA4YTAJTG9naXRlY2ggUUMgSU0KIHpjM3h4CQkwNDZkOjA4YTEJTG9naXRlY2ggUUMgSU0gMHgwOEExICtzb3VuZAogemMzeHgJCTA0NmQ6MDhhMglMYWJ0ZWMgV2ViY2FtIFBybwpAQCAtMTY5LDYgKzE3NCw5IEBACiBzcGNhNTAwCQkwNmJlOjA4MDAJT3B0aW1lZGlhCiBzdW5wbHVzCQkwNmQ2OjAwMzEJVHJ1c3QgNjEwIExDRCBQb3dlckNAbSBab29tCiBzcGNhNTA2CQkwNmUxOmExOTAJQURTIEluc3RhbnQgVkNECitvdjUzNAkJMDZmODozMDAyCUhlcmN1bGVzIEJsb2cgV2ViY2FtCitvdjUzNAkJMDZmODozMDAzCUhlcmN1bGVzIER1YWxwaXggSEQgV2VibG9nCitzb25peGoJCTA2Zjg6MzAwNAlIZXJjdWxlcyBDbGFzc2ljIFNpbHZlcgogc3BjYTUwOAkJMDczMzowMTEwCVZpZXdRdWVzdCBWUTExMAogc3BjYTUwOAkJMDEzMDowMTMwCUNsb25lIERpZ2l0YWwgV2ViY2FtIDExMDQzCiBzcGNhNTAxCQkwNzMzOjA0MDEJSW50ZWwgQ3JlYXRlIGFuZCBTaGFyZQpAQCAtMTk5LDcgKzIwNyw4IEBACiBzdW5wbHVzCQkwOGNhOjIwNjAJQWlwdGVrIFBvY2tldERWNTMwMAogdHY4NTMyCQkwOTIzOjAxMGYJSUNNNTMyIGNhbXMKIG1hcnMJCTA5M2E6MDUwZglNYXJzLVNlbWkgUGMtQ2FtZXJhCi1wYWMyMDcJCTA5M2E6MjQ2MAlQQUMyMDcgUXRlYyBXZWJjYW0gMTAwCitwYWMyMDcJCTA5M2E6MjQ2MAlRdGVjIFdlYmNhbSAxMDAKK3BhYzIwNwkJMDkzYToyNDYxCUhQIFdlYmNhbQogcGFjMjA3CQkwOTNhOjI0NjMJUGhpbGlwcyBTUEMgMjIwIE5DCiBwYWMyMDcJCTA5M2E6MjQ2NAlMYWJ0ZWMgV2ViY2FtIDEyMDAKIHBhYzIwNwkJMDkzYToyNDY4CVBBQzIwNwpAQCAtMjEzLDEwICsyMjIsMTMgQEAKIHBhYzczMTEJCTA5M2E6MjYwOAlUcnVzdCBXQi0zMzAwcAogcGFjNzMxMQkJMDkzYToyNjBlCUdpZ2F3YXJlIFZHQSBQQyBDYW1lcmEsIFRydXN0IFdCLTMzNTBwLCBTSUdNQSBjYW0gMjM1MAogcGFjNzMxMQkJMDkzYToyNjBmCVNuYWtlQ2FtCitwYWM3MzExCQkwOTNhOjI2MjAJQXBvbGxvIEFDLTkwNQogcGFjNzMxMQkJMDkzYToyNjIxCVBBQzczMXgKK3BhYzczMTEJCTA5M2E6MjYyMglHZW5pdXMgRXllIDMxMgogcGFjNzMxMQkJMDkzYToyNjI0CVBBQzczMDIKIHBhYzczMTEJCTA5M2E6MjYyNglMYWJ0ZWMgMjIwMAogcGFjNzMxMQkJMDkzYToyNjJhCVdlYmNhbSAzMDBrCitwYWM3MzExCQkwOTNhOjI2MmMJUGhpbGlwcyBTUEMgMjMwIE5DCiB6YzN4eAkJMGFjODowMzAyCVotc3RhciBWaW1pY3JvIHpjMDMwMgogdmMwMzJ4CQkwYWM4OjAzMjEJVmltaWNybyBnZW5lcmljIHZjMDMyMQogdmMwMzJ4CQkwYWM4OjAzMjMJVmltaWNybyBWYzAzMjMKQEAgLTI0OSwxMSArMjYxLDEzIEBACiBzb25peGoJCTBjNDU6NjBlYwlTTjlDMTA1K01PNDAwMAogc29uaXhqCQkwYzQ1OjYwZmIJU3VyZmVyIE5vTmFtZQogc29uaXhqCQkwYzQ1OjYwZmMJTEctTElDMzAwCitzb25peGoJCTBjNDU6NjBmZQlNaWNyb2RpYSBBdWRpbwogc29uaXhqCQkwYzQ1OjYxMjgJTWljcm9kaWEvU29uaXggU05QMzI1CiBzb25peGoJCTBjNDU6NjEyYQlBdmFudCBDYW1lcmEKIHNvbml4agkJMGM0NTo2MTJjCVR5cGhvb24gUmFzeSBDYW0gMS4zTVBpeAogc29uaXhqCQkwYzQ1OjYxMzAJU29uaXggUGNjYW0KIHNvbml4agkJMGM0NTo2MTM4CVNuOWMxMjAgTW80MDAwCitzb25peGoJCTBjNDU6NjEzYQlNaWNyb2RpYSBTb25peCBQQyBDYW1lcmEKIHNvbml4agkJMGM0NTo2MTNiCVN1cmZlciBTTi0yMDYKIHNvbml4agkJMGM0NTo2MTNjCVNvbml4IFBjY2FtMTY4CiBzb25peGoJCTBjNDU6NjE0MwlTb25peCBQY2NhbTE2OApAQCAtMjYzLDYgKzI3Nyw5IEBACiB6YzN4eAkJMTBmZDowMTI4CVR5cGhvb24gV2Vic2hvdCBJSSBVU0IgMzAwayAweDAxMjgKIHNwY2E1NjEJCTEwZmQ6N2U1MAlGbHlDYW0gVXNiIDEwMAogemMzeHgJCTEwZmQ6ODA1MAlUeXBob29uIFdlYnNob3QgSUkgVVNCIDMwMGsKK292NTM0CQkxNDE1OjIwMDAJU29ueSBIRCBFeWUgZm9yIFBTMyAoU0xFSCAwMDIwMSkKK3BhYzIwNwkJMTQ1ZjowMTNhCVRydXN0IFdCLTEzMDBOCit2YzAzMngJCTE1Yjg6NjAwMglIUCAyLjAgTWVnYXBpeGVsIHJ6NDA2YWEKIHNwY2E1MDEJCTE3NzY6NTAxYwlBcm93YW5hIDMwMEsgQ01PUyBDYW1lcmEKIHQ2MTMJCTE3YTE6MDEyOAlUQVNDT1JQIEpQRUcgV2ViY2FtLCBOR1MgQ3ljbG9wcwogdmMwMzJ4CQkxN2VmOjQ4MDIJTGVub3ZvIFZjMDMyMytNSTEzMTBfU09DCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1mcmFtZXdvcmsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWU3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dApAQCAtMCwwICsxLDUyMCBAQAorT3ZlcnZpZXcgb2YgdGhlIFY0TDIgZHJpdmVyIGZyYW1ld29yaworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHRleHQgZG9jdW1lbnRzIHRoZSB2YXJpb3VzIHN0cnVjdHVyZXMgcHJvdmlkZWQgYnkgdGhlIFY0TDIgZnJhbWV3b3JrIGFuZAordGhlaXIgcmVsYXRpb25zaGlwcy4KKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitUaGUgVjRMMiBkcml2ZXJzIHRlbmQgdG8gYmUgdmVyeSBjb21wbGV4IGR1ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUKK2hhcmR3YXJlOiBtb3N0IGRldmljZXMgaGF2ZSBtdWx0aXBsZSBJQ3MsIGV4cG9ydCBtdWx0aXBsZSBkZXZpY2Ugbm9kZXMgaW4KKy9kZXYsIGFuZCBjcmVhdGUgYWxzbyBub24tVjRMMiBkZXZpY2VzIHN1Y2ggYXMgRFZCLCBBTFNBLCBGQiwgSTJDIGFuZCBpbnB1dAorKElSKSBkZXZpY2VzLgorCitFc3BlY2lhbGx5IHRoZSBmYWN0IHRoYXQgVjRMMiBkcml2ZXJzIGhhdmUgdG8gc2V0dXAgc3VwcG9ydGluZyBJQ3MgdG8KK2RvIGF1ZGlvL3ZpZGVvIG11eGluZy9lbmNvZGluZy9kZWNvZGluZyBtYWtlcyBpdCBtb3JlIGNvbXBsZXggdGhhbiBtb3N0LgorVXN1YWxseSB0aGVzZSBJQ3MgYXJlIGNvbm5lY3RlZCB0byB0aGUgbWFpbiBicmlkZ2UgZHJpdmVyIHRocm91Z2ggb25lIG9yCittb3JlIEkyQyBidXNzZXMsIGJ1dCBvdGhlciBidXNzZXMgY2FuIGFsc28gYmUgdXNlZC4gU3VjaCBkZXZpY2VzIGFyZQorY2FsbGVkICdzdWItZGV2aWNlcycuCisKK0ZvciBhIGxvbmcgdGltZSB0aGUgZnJhbWV3b3JrIHdhcyBsaW1pdGVkIHRvIHRoZSB2aWRlb19kZXZpY2Ugc3RydWN0IGZvcgorY3JlYXRpbmcgVjRMIGRldmljZSBub2RlcyBhbmQgdmlkZW9fYnVmIGZvciBoYW5kbGluZyB0aGUgdmlkZW8gYnVmZmVycworKG5vdGUgdGhhdCB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGRpc2N1c3MgdGhlIHZpZGVvX2J1ZiBmcmFtZXdvcmspLgorCitUaGlzIG1lYW50IHRoYXQgYWxsIGRyaXZlcnMgaGFkIHRvIGRvIHRoZSBzZXR1cCBvZiBkZXZpY2UgaW5zdGFuY2VzIGFuZAorY29ubmVjdGluZyB0byBzdWItZGV2aWNlcyB0aGVtc2VsdmVzLiBTb21lIG9mIHRoaXMgaXMgcXVpdGUgY29tcGxpY2F0ZWQKK3RvIGRvIHJpZ2h0IGFuZCBtYW55IGRyaXZlcnMgbmV2ZXIgZGlkIGRvIGl0IGNvcnJlY3RseS4KKworVGhlcmUgaXMgYWxzbyBhIGxvdCBvZiBjb21tb24gY29kZSB0aGF0IGNvdWxkIG5ldmVyIGJlIHJlZmFjdG9yZWQgZHVlIHRvCit0aGUgbGFjayBvZiBhIGZyYW1ld29yay4KKworU28gdGhpcyBmcmFtZXdvcmsgc2V0cyB1cCB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2tzIHRoYXQgYWxsIGRyaXZlcnMKK25lZWQgYW5kIHRoaXMgc2FtZSBmcmFtZXdvcmsgc2hvdWxkIG1ha2UgaXQgbXVjaCBlYXNpZXIgdG8gcmVmYWN0b3IKK2NvbW1vbiBjb2RlIGludG8gdXRpbGl0eSBmdW5jdGlvbnMgc2hhcmVkIGJ5IGFsbCBkcml2ZXJzLgorCisKK1N0cnVjdHVyZSBvZiBhIGRyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCBkcml2ZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKzEpIEEgc3RydWN0IGZvciBlYWNoIGRldmljZSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBkZXZpY2Ugc3RhdGUuCisKKzIpIEEgd2F5IG9mIGluaXRpYWxpemluZyBhbmQgY29tbWFuZGluZyBzdWItZGV2aWNlcyAoaWYgYW55KS4KKworMykgQ3JlYXRpbmcgVjRMMiBkZXZpY2Ugbm9kZXMgKC9kZXYvdmlkZW9YLCAvZGV2L3ZiaVgsIC9kZXYvcmFkaW9YIGFuZAorICAgL2Rldi92dHhYKSBhbmQga2VlcGluZyB0cmFjayBvZiBkZXZpY2Utbm9kZSBzcGVjaWZpYyBkYXRhLgorCis0KSBGaWxlaGFuZGxlLXNwZWNpZmljIHN0cnVjdHMgY29udGFpbmluZyBwZXItZmlsZWhhbmRsZSBkYXRhLgorCitUaGlzIGlzIGEgcm91Z2ggc2NoZW1hdGljIG9mIGhvdyBpdCBhbGwgcmVsYXRlczoKKworICAgIGRldmljZSBpbnN0YW5jZXMKKyAgICAgIHwKKyAgICAgICstc3ViLWRldmljZSBpbnN0YW5jZXMKKyAgICAgIHwKKyAgICAgIFwtVjRMMiBkZXZpY2Ugbm9kZXMKKwkgIHwKKwkgIFwtZmlsZWhhbmRsZSBpbnN0YW5jZXMKKworCitTdHJ1Y3R1cmUgb2YgdGhlIGZyYW1ld29yaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZyYW1ld29yayBjbG9zZWx5IHJlc2VtYmxlcyB0aGUgZHJpdmVyIHN0cnVjdHVyZTogaXQgaGFzIGEgdjRsMl9kZXZpY2UKK3N0cnVjdCBmb3IgdGhlIGRldmljZSBpbnN0YW5jZSBkYXRhLCBhIHY0bDJfc3ViZGV2IHN0cnVjdCB0byByZWZlciB0bworc3ViLWRldmljZSBpbnN0YW5jZXMsIHRoZSB2aWRlb19kZXZpY2Ugc3RydWN0IHN0b3JlcyBWNEwyIGRldmljZSBub2RlIGRhdGEKK2FuZCBpbiB0aGUgZnV0dXJlIGEgdjRsMl9maCBzdHJ1Y3Qgd2lsbCBrZWVwIHRyYWNrIG9mIGZpbGVoYW5kbGUgaW5zdGFuY2VzCisodGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkKS4KKworCitzdHJ1Y3QgdjRsMl9kZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGRldmljZSBpbnN0YW5jZSBpcyByZXByZXNlbnRlZCBieSBhIHN0cnVjdCB2NGwyX2RldmljZSAodjRsMi1kZXZpY2UuaCkuCitWZXJ5IHNpbXBsZSBkZXZpY2VzIGNhbiBqdXN0IGFsbG9jYXRlIHRoaXMgc3RydWN0LCBidXQgbW9zdCBvZiB0aGUgdGltZSB5b3UKK3dvdWxkIGVtYmVkIHRoaXMgc3RydWN0IGluc2lkZSBhIGxhcmdlciBzdHJ1Y3QuCisKK1lvdSBtdXN0IHJlZ2lzdGVyIHRoZSBkZXZpY2UgaW5zdGFuY2U6CisKKwl2NGwyX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpOworCitSZWdpc3RyYXRpb24gd2lsbCBpbml0aWFsaXplIHRoZSB2NGwyX2RldmljZSBzdHJ1Y3QgYW5kIGxpbmsgZGV2LT5kcml2ZXJfZGF0YQordG8gdjRsMl9kZXYuIFJlZ2lzdHJhdGlvbiB3aWxsIGFsc28gc2V0IHY0bDJfZGV2LT5uYW1lIHRvIGEgdmFsdWUgZGVyaXZlZCBmcm9tCitkZXYgKGRyaXZlciBuYW1lIGZvbGxvd2VkIGJ5IHRoZSBidXNfaWQsIHRvIGJlIHByZWNpc2UpLiBZb3UgbWF5IGNoYW5nZSB0aGUKK25hbWUgYWZ0ZXIgcmVnaXN0cmF0aW9uIGlmIHlvdSB3YW50LgorCitUaGUgZmlyc3QgJ2RldicgYXJndW1lbnQgaXMgbm9ybWFsbHkgdGhlIHN0cnVjdCBkZXZpY2UgcG9pbnRlciBvZiBhIHBjaV9kZXYsCit1c2JfZGV2aWNlIG9yIHBsYXRmb3JtX2RldmljZS4KKworWW91IHVucmVnaXN0ZXIgd2l0aDoKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2Rldik7CisKK1VucmVnaXN0ZXJpbmcgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciBhbGwgc3ViZGV2cyBmcm9tIHRoZSBkZXZpY2UuCisKK1NvbWV0aW1lcyB5b3UgbmVlZCB0byBpdGVyYXRlIG92ZXIgYWxsIGRldmljZXMgcmVnaXN0ZXJlZCBieSBhIHNwZWNpZmljCitkcml2ZXIuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSBpZiBtdWx0aXBsZSBkZXZpY2UgZHJpdmVycyB1c2UgdGhlIHNhbWUKK2hhcmR3YXJlLiBFLmcuIHRoZSBpdnR2ZmIgZHJpdmVyIGlzIGEgZnJhbWVidWZmZXIgZHJpdmVyIHRoYXQgdXNlcyB0aGUgaXZ0dgoraGFyZHdhcmUuIFRoZSBzYW1lIGlzIHRydWUgZm9yIGFsc2EgZHJpdmVycyBmb3IgZXhhbXBsZS4KKworWW91IGNhbiBpdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgZGV2aWNlcyBhcyBmb2xsb3dzOgorCitzdGF0aWMgaW50IGNhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiB0ZXN0IGlmIHRoaXMgZGV2aWNlIHdhcyBpbml0ZWQgKi8KKwlpZiAodjRsMl9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLi4uCisJcmV0dXJuIDA7Cit9CisKK2ludCBpdGVyYXRlKHZvaWQgKnApCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKKwlpbnQgZXJyOworCisJLyogRmluZCBkcml2ZXIgJ2l2dHYnIG9uIHRoZSBQQ0kgYnVzLgorCSAgIHBjaV9idXNfdHlwZSBpcyBhIGdsb2JhbC4gRm9yIFVTQiBidXNzZXMgdXNlIHVzYl9idXNfdHlwZS4gKi8KKwlkcnYgPSBkcml2ZXJfZmluZCgiaXZ0diIsICZwY2lfYnVzX3R5cGUpOworCS8qIGl0ZXJhdGUgb3ZlciBhbGwgaXZ0diBkZXZpY2UgaW5zdGFuY2VzICovCisJZXJyID0gZHJpdmVyX2Zvcl9lYWNoX2RldmljZShkcnYsIE5VTEwsIHAsIGNhbGxiYWNrKTsKKwlwdXRfZHJpdmVyKGRydik7CisJcmV0dXJuIGVycjsKK30KKworU29tZXRpbWVzIHlvdSBuZWVkIHRvIGtlZXAgYSBydW5uaW5nIGNvdW50ZXIgb2YgdGhlIGRldmljZSBpbnN0YW5jZS4gVGhpcyBpcworY29tbW9ubHkgdXNlZCB0byBtYXAgYSBkZXZpY2UgaW5zdGFuY2UgdG8gYW4gaW5kZXggb2YgYSBtb2R1bGUgb3B0aW9uIGFycmF5LgorCitUaGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggaXMgYXMgZm9sbG93czoKKworc3RhdGljIGF0b21pY190IGRydl9pbnN0YW5jZSA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkcnZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCS4uLgorCXN0YXRlLT5pbnN0YW5jZSA9IGF0b21pY19pbmNfcmV0dXJuKCZkcnZfaW5zdGFuY2UpIC0gMTsKK30KKworCitzdHJ1Y3QgdjRsMl9zdWJkZXYKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitNYW55IGRyaXZlcnMgbmVlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHN1Yi1kZXZpY2VzLiBUaGVzZSBkZXZpY2VzIGNhbiBkbyBhbGwKK3NvcnQgb2YgdGFza3MsIGJ1dCBtb3N0IGNvbW1vbmx5IHRoZXkgaGFuZGxlIGF1ZGlvIGFuZC9vciB2aWRlbyBtdXhpbmcsCitlbmNvZGluZyBvciBkZWNvZGluZy4gRm9yIHdlYmNhbXMgY29tbW9uIHN1Yi1kZXZpY2VzIGFyZSBzZW5zb3JzIGFuZCBjYW1lcmEKK2NvbnRyb2xsZXJzLgorCitVc3VhbGx5IHRoZXNlIGFyZSBJMkMgZGV2aWNlcywgYnV0IG5vdCBuZWNlc3NhcmlseS4gSW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUKK2RyaXZlciB3aXRoIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gdGhlc2Ugc3ViLWRldmljZXMgdGhlIHY0bDJfc3ViZGV2IHN0cnVjdAorKHY0bDItc3ViZGV2LmgpIHdhcyBjcmVhdGVkLgorCitFYWNoIHN1Yi1kZXZpY2UgZHJpdmVyIG11c3QgaGF2ZSBhIHY0bDJfc3ViZGV2IHN0cnVjdC4gVGhpcyBzdHJ1Y3QgY2FuIGJlCitzdGFuZC1hbG9uZSBmb3Igc2ltcGxlIHN1Yi1kZXZpY2VzIG9yIGl0IG1pZ2h0IGJlIGVtYmVkZGVkIGluIGEgbGFyZ2VyIHN0cnVjdAoraWYgbW9yZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBzdG9yZWQuIFVzdWFsbHkgdGhlcmUgaXMgYSBsb3ctbGV2ZWwKK2RldmljZSBzdHJ1Y3QgKGUuZy4gaTJjX2NsaWVudCkgdGhhdCBjb250YWlucyB0aGUgZGV2aWNlIGRhdGEgYXMgc2V0dXAKK2J5IHRoZSBrZXJuZWwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHN0b3JlIHRoYXQgcG9pbnRlciBpbiB0aGUgcHJpdmF0ZQorZGF0YSBvZiB2NGwyX3N1YmRldiB1c2luZyB2NGwyX3NldF9zdWJkZXZkYXRhKCkuIFRoYXQgbWFrZXMgaXQgZWFzeSB0byBnbworZnJvbSBhIHY0bDJfc3ViZGV2IHRvIHRoZSBhY3R1YWwgbG93LWxldmVsIGJ1cy1zcGVjaWZpYyBkZXZpY2UgZGF0YS4KKworWW91IGFsc28gbmVlZCBhIHdheSB0byBnbyBmcm9tIHRoZSBsb3ctbGV2ZWwgc3RydWN0IHRvIHY0bDJfc3ViZGV2LiBGb3IgdGhlCitjb21tb24gaTJjX2NsaWVudCBzdHJ1Y3QgdGhlIGkyY19zZXRfY2xpZW50ZGF0YSgpIGNhbGwgaXMgdXNlZCB0byBzdG9yZSBhCit2NGwyX3N1YmRldiBwb2ludGVyLCBmb3Igb3RoZXIgYnVzc2VzIHlvdSBtYXkgaGF2ZSB0byB1c2Ugb3RoZXIgbWV0aG9kcy4KKworRnJvbSB0aGUgYnJpZGdlIGRyaXZlciBwZXJzcGVjdGl2ZSB5b3UgbG9hZCB0aGUgc3ViLWRldmljZSBtb2R1bGUgYW5kIHNvbWVob3cKK29idGFpbiB0aGUgdjRsMl9zdWJkZXYgcG9pbnRlci4gRm9yIGkyYyBkZXZpY2VzIHRoaXMgaXMgZWFzeTogeW91IGNhbGwKK2kyY19nZXRfY2xpZW50ZGF0YSgpLiBGb3Igb3RoZXIgYnVzc2VzIHNvbWV0aGluZyBzaW1pbGFyIG5lZWRzIHRvIGJlIGRvbmUuCitIZWxwZXIgZnVuY3Rpb25zIGV4aXN0cyBmb3Igc3ViLWRldmljZXMgb24gYW4gSTJDIGJ1cyB0aGF0IGRvIG1vc3Qgb2YgdGhpcwordHJpY2t5IHdvcmsgZm9yIHlvdS4KKworRWFjaCB2NGwyX3N1YmRldiBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyB0aGF0IHN1Yi1kZXZpY2UgZHJpdmVycyBjYW4KK2ltcGxlbWVudCAob3IgbGVhdmUgTlVMTCBpZiBpdCBpcyBub3QgYXBwbGljYWJsZSkuIFNpbmNlIHN1Yi1kZXZpY2VzIGNhbiBkbworc28gbWFueSBkaWZmZXJlbnQgdGhpbmdzIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gZW5kIHVwIHdpdGggYSBodWdlIG9wcyBzdHJ1Y3QKK29mIHdoaWNoIG9ubHkgYSBoYW5kZnVsIG9mIG9wcyBhcmUgY29tbW9ubHkgaW1wbGVtZW50ZWQsIHRoZSBmdW5jdGlvbiBwb2ludGVycworYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gY2F0ZWdvcnkgYW5kIGVhY2ggY2F0ZWdvcnkgaGFzIGl0cyBvd24gb3BzIHN0cnVjdC4KKworVGhlIHRvcC1sZXZlbCBvcHMgc3RydWN0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBjYXRlZ29yeSBvcHMgc3RydWN0cywgd2hpY2gKK21heSBiZSBOVUxMIGlmIHRoZSBzdWJkZXYgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgZnJvbSB0aGF0IGNhdGVnb3J5LgorCitJdCBsb29rcyBsaWtlIHRoaXM6CisKK3N0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB7CisJaW50ICgqZ19jaGlwX2lkZW50KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKTsKKwlpbnQgKCpsb2dfc3RhdHVzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgdmFsKTsKKwkuLi4KK307CisKK3N0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgeworCS4uLgorfTsKKworc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyB7CisJLi4uCit9OworCitzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHsKKwkuLi4KK307CisKK3N0cnVjdCB2NGwyX3N1YmRldl9vcHMgeworCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyAgKmNvcmU7CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyAqdHVuZXI7CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyAqYXVkaW87CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyAqdmlkZW87Cit9OworCitUaGUgY29yZSBvcHMgYXJlIGNvbW1vbiB0byBhbGwgc3ViZGV2cywgdGhlIG90aGVyIGNhdGVnb3JpZXMgYXJlIGltcGxlbWVudGVkCitkZXBlbmRpbmcgb24gdGhlIHN1Yi1kZXZpY2UuIEUuZy4gYSB2aWRlbyBkZXZpY2UgaXMgdW5saWtlbHkgdG8gc3VwcG9ydCB0aGUKK2F1ZGlvIG9wcyBhbmQgdmljZSB2ZXJzYS4KKworVGhpcyBzZXR1cCBsaW1pdHMgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBwb2ludGVycyB3aGlsZSBzdGlsbCBtYWtpbmcgaXQgZWFzeQordG8gYWRkIG5ldyBvcHMgYW5kIGNhdGVnb3JpZXMuCisKK0Egc3ViLWRldmljZSBkcml2ZXIgaW5pdGlhbGl6ZXMgdGhlIHY0bDJfc3ViZGV2IHN0cnVjdCB1c2luZzoKKworCXY0bDJfc3ViZGV2X2luaXQoc3ViZGV2LCAmb3BzKTsKKworQWZ0ZXJ3YXJkcyB5b3UgbmVlZCB0byBpbml0aWFsaXplIHN1YmRldi0+bmFtZSB3aXRoIGEgdW5pcXVlIG5hbWUgYW5kIHNldCB0aGUKK21vZHVsZSBvd25lci4gVGhpcyBpcyBkb25lIGZvciB5b3UgaWYgeW91IHVzZSB0aGUgaTJjIGhlbHBlciBmdW5jdGlvbnMuCisKK0EgZGV2aWNlIChicmlkZ2UpIGRyaXZlciBuZWVkcyB0byByZWdpc3RlciB0aGUgdjRsMl9zdWJkZXYgd2l0aCB0aGUKK3Y0bDJfZGV2aWNlOgorCisJaW50IGVyciA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldihkZXZpY2UsIHN1YmRldik7CisKK1RoaXMgY2FuIGZhaWwgaWYgdGhlIHN1YmRldiBtb2R1bGUgZGlzYXBwZWFyZWQgYmVmb3JlIGl0IGNvdWxkIGJlIHJlZ2lzdGVyZWQuCitBZnRlciB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5IHRoZSBzdWJkZXYtPmRldiBmaWVsZCBwb2ludHMgdG8KK3RoZSB2NGwyX2RldmljZS4KKworWW91IGNhbiB1bnJlZ2lzdGVyIGEgc3ViLWRldmljZSB1c2luZzoKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHN1YmRldik7CisKK0FmdGVyd2FyZHMgdGhlIHN1YmRldiBtb2R1bGUgY2FuIGJlIHVubG9hZGVkIGFuZCBzdWJkZXYtPmRldiA9PSBOVUxMLgorCitZb3UgY2FuIGNhbGwgYW4gb3BzIGZ1bmN0aW9uIGVpdGhlciBkaXJlY3RseToKKworCWVyciA9IHN1YmRldi0+b3BzLT5jb3JlLT5nX2NoaXBfaWRlbnQoc3ViZGV2LCAmY2hpcCk7CisKK2J1dCBpdCBpcyBiZXR0ZXIgYW5kIGVhc2llciB0byB1c2UgdGhpcyBtYWNybzoKKworCWVyciA9IHY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCBjb3JlLCBnX2NoaXBfaWRlbnQsICZjaGlwKTsKKworVGhlIG1hY3JvIHdpbGwgdG8gdGhlIHJpZ2h0IE5VTEwgcG9pbnRlciBjaGVja3MgYW5kIHJldHVybnMgLUVOT0RFViBpZiBzdWJkZXYKK2lzIE5VTEwsIC1FTk9JT0NUTENNRCBpZiBlaXRoZXIgc3ViZGV2LT5jb3JlIG9yIHN1YmRldi0+Y29yZS0+Z19jaGlwX2lkZW50IGlzCitOVUxMLCBvciB0aGUgYWN0dWFsIHJlc3VsdCBvZiB0aGUgc3ViZGV2LT5vcHMtPmNvcmUtPmdfY2hpcF9pZGVudCBvcHMuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gY2FsbCBhbGwgb3IgYSBzdWJzZXQgb2YgdGhlIHN1Yi1kZXZpY2VzOgorCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoZGV2LCAwLCBjb3JlLCBnX2NoaXBfaWRlbnQsICZjaGlwKTsKKworQW55IHN1YmRldiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcHMgaXMgc2tpcHBlZCBhbmQgZXJyb3IgcmVzdWx0cyBhcmUKK2lnbm9yZWQuIElmIHlvdSB3YW50IHRvIGNoZWNrIGZvciBlcnJvcnMgdXNlIHRoaXM6CisKKwllcnIgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihkZXYsIDAsIGNvcmUsIGdfY2hpcF9pZGVudCwgJmNoaXApOworCitBbnkgZXJyb3IgZXhjZXB0IC1FTk9JT0NUTENNRCB3aWxsIGV4aXQgdGhlIGxvb3Agd2l0aCB0aGF0IGVycm9yLiBJZiBubworZXJyb3JzIChleGNlcHQgLUVOT0lPQ1RMQ01EKSBvY2N1cmVkLCB0aGVuIDAgaXMgcmV0dXJuZWQuCisKK1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gYm90aCBjYWxscyBpcyBhIGdyb3VwIElELiBJZiAwLCB0aGVuIGFsbCBzdWJkZXZzIGFyZQorY2FsbGVkLiBJZiBub24temVybywgdGhlbiBvbmx5IHRob3NlIHdob3NlIGdyb3VwIElEIG1hdGNoIHRoYXQgdmFsdWUgd2lsbAorYmUgY2FsbGVkLiBCZWZvcmUgYSBicmlkZ2UgZHJpdmVyIHJlZ2lzdGVycyBhIHN1YmRldiBpdCBjYW4gc2V0IHN1YmRldi0+Z3JwX2lkCit0byB3aGF0ZXZlciB2YWx1ZSBpdCB3YW50cyAoaXQncyAwIGJ5IGRlZmF1bHQpLiBUaGlzIHZhbHVlIGlzIG93bmVkIGJ5IHRoZQorYnJpZGdlIGRyaXZlciBhbmQgdGhlIHN1Yi1kZXZpY2UgZHJpdmVyIHdpbGwgbmV2ZXIgbW9kaWZ5IG9yIHVzZSBpdC4KKworVGhlIGdyb3VwIElEIGdpdmVzIHRoZSBicmlkZ2UgZHJpdmVyIG1vcmUgY29udHJvbCBob3cgY2FsbGJhY2tzIGFyZSBjYWxsZWQuCitGb3IgZXhhbXBsZSwgdGhlcmUgbWF5IGJlIG11bHRpcGxlIGF1ZGlvIGNoaXBzIG9uIGEgYm9hcmQsIGVhY2ggY2FwYWJsZSBvZgorY2hhbmdpbmcgdGhlIHZvbHVtZS4gQnV0IHVzdWFsbHkgb25seSBvbmUgd2lsbCBhY3R1YWxseSBiZSB1c2VkIHdoZW4gdGhlCit1c2VyIHdhbnQgdG8gY2hhbmdlIHRoZSB2b2x1bWUuIFlvdSBjYW4gc2V0IHRoZSBncm91cCBJRCBmb3IgdGhhdCBzdWJkZXYgdG8KK2UuZy4gQVVESU9fQ09OVFJPTExFUiBhbmQgc3BlY2lmeSB0aGF0IGFzIHRoZSBncm91cCBJRCB2YWx1ZSB3aGVuIGNhbGxpbmcKK3Y0bDJfZGV2aWNlX2NhbGxfYWxsKCkuIFRoYXQgZW5zdXJlcyB0aGF0IGl0IHdpbGwgb25seSBnbyB0byB0aGUgc3ViZGV2Cit0aGF0IG5lZWRzIGl0LgorCitUaGUgYWR2YW50YWdlIG9mIHVzaW5nIHY0bDJfc3ViZGV2IGlzIHRoYXQgaXQgaXMgYSBnZW5lcmljIHN0cnVjdCBhbmQgZG9lcworbm90IGNvbnRhaW4gYW55IGtub3dsZWRnZSBhYm91dCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS4gU28gYSBkcml2ZXIgbWlnaHQKK2NvbnRhaW4gc2V2ZXJhbCBzdWJkZXZzIHRoYXQgdXNlIGFuIEkyQyBidXMsIGJ1dCBhbHNvIGEgc3ViZGV2IHRoYXQgaXMKK2NvbnRyb2xsZWQgdGhyb3VnaCBHUElPIHBpbnMuIFRoaXMgZGlzdGluY3Rpb24gaXMgb25seSByZWxldmFudCB3aGVuIHNldHRpbmcKK3VwIHRoZSBkZXZpY2UsIGJ1dCBvbmNlIHRoZSBzdWJkZXYgaXMgcmVnaXN0ZXJlZCBpdCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LgorCisKK0kyQyBzdWItZGV2aWNlIGRyaXZlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2luY2UgdGhlc2UgZHJpdmVycyBhcmUgc28gY29tbW9uLCBzcGVjaWFsIGhlbHBlciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB0bworZWFzZSB0aGUgdXNlIG9mIHRoZXNlIGRyaXZlcnMgKHY0bDItY29tbW9uLmgpLgorCitUaGUgcmVjb21tZW5kZWQgbWV0aG9kIG9mIGFkZGluZyB2NGwyX3N1YmRldiBzdXBwb3J0IHRvIGFuIEkyQyBkcml2ZXIgaXMgdG8KK2VtYmVkIHRoZSB2NGwyX3N1YmRldiBzdHJ1Y3QgaW50byB0aGUgc3RhdGUgc3RydWN0IHRoYXQgaXMgY3JlYXRlZCBmb3IgZWFjaAorSTJDIGRldmljZSBpbnN0YW5jZS4gVmVyeSBzaW1wbGUgZGV2aWNlcyBoYXZlIG5vIHN0YXRlIHN0cnVjdCBhbmQgaW4gdGhhdCBjYXNlCit5b3UgY2FuIGp1c3QgY3JlYXRlIGEgdjRsMl9zdWJkZXYgZGlyZWN0bHkuCisKK0EgdHlwaWNhbCBzdGF0ZSBzdHJ1Y3Qgd291bGQgbG9vayBsaWtlIHRoaXMgKHdoZXJlICdjaGlwbmFtZScgaXMgcmVwbGFjZWQgYnkKK3RoZSBuYW1lIG9mIHRoZSBjaGlwKToKKworc3RydWN0IGNoaXBuYW1lX3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisJLi4uICAvKiBhZGRpdGlvbmFsIHN0YXRlIGZpZWxkcyAqLworfTsKKworSW5pdGlhbGl6ZSB0aGUgdjRsMl9zdWJkZXYgc3RydWN0IGFzIGZvbGxvd3M6CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmc3RhdGUtPnNkLCBjbGllbnQsIHN1YmRldl9vcHMpOworCitUaGlzIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiBhbGwgdGhlIGZpZWxkcyBvZiB2NGwyX3N1YmRldiBhbmQgZW5zdXJlIHRoYXQgdGhlCit2NGwyX3N1YmRldiBhbmQgaTJjX2NsaWVudCBib3RoIHBvaW50IHRvIG9uZSBhbm90aGVyLgorCitZb3Ugc2hvdWxkIGFsc28gYWRkIGEgaGVscGVyIGlubGluZSBmdW5jdGlvbiB0byBnbyBmcm9tIGEgdjRsMl9zdWJkZXYgcG9pbnRlcgordG8gYSBjaGlwbmFtZV9zdGF0ZSBzdHJ1Y3Q6CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNoaXBuYW1lX3N0YXRlICp0b19zdGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBjaGlwbmFtZV9zdGF0ZSwgc2QpOworfQorCitVc2UgdGhpcyB0byBnbyBmcm9tIHRoZSB2NGwyX3N1YmRldiBzdHJ1Y3QgdG8gdGhlIGkyY19jbGllbnQgc3RydWN0OgorCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCitBbmQgdGhpcyB0byBnbyBmcm9tIGFuIGkyY19jbGllbnQgdG8gYSB2NGwyX3N1YmRldiBzdHJ1Y3Q6CisKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKK0ZpbmFsbHkgeW91IG5lZWQgdG8gbWFrZSBhIGNvbW1hbmQgZnVuY3Rpb24gdG8gbWFrZSBkcml2ZXItPmNvbW1hbmQoKQorY2FsbCB0aGUgcmlnaHQgc3ViZGV2X29wcyBmdW5jdGlvbnM6CisKK3N0YXRpYyBpbnQgc3ViZGV2X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKK30KKworSWYgZHJpdmVyLT5jb21tYW5kIGlzIG5ldmVyIHVzZWQgdGhlbiB5b3UgY2FuIGxlYXZlIHRoaXMgb3V0LiBFdmVudHVhbGx5IHRoZQorZHJpdmVyLT5jb21tYW5kIHVzYWdlIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdjRsLgorCitNYWtlIHN1cmUgdG8gY2FsbCB2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCkgd2hlbiB0aGUgcmVtb3ZlKCkgY2FsbGJhY2sKK2lzIGNhbGxlZC4gVGhpcyB3aWxsIHVucmVnaXN0ZXIgdGhlIHN1Yi1kZXZpY2UgZnJvbSB0aGUgYnJpZGdlIGRyaXZlci4gSXQgaXMKK3NhZmUgdG8gY2FsbCB0aGlzIGV2ZW4gaWYgdGhlIHN1Yi1kZXZpY2Ugd2FzIG5ldmVyIHJlZ2lzdGVyZWQuCisKKworVGhlIGJyaWRnZSBkcml2ZXIgYWxzbyBoYXMgc29tZSBoZWxwZXIgZnVuY3Rpb25zIGl0IGNhbiB1c2U6CisKK3N0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2KGFkYXB0ZXIsICJtb2R1bGVfZm9vIiwgImNoaXBpZCIsIDB4MzYpOworCitUaGlzIGxvYWRzIHRoZSBnaXZlbiBtb2R1bGUgKGNhbiBiZSBOVUxMIGlmIG5vIG1vZHVsZSBuZWVkcyB0byBiZSBsb2FkZWQpIGFuZAorY2FsbHMgaTJjX25ld19kZXZpY2UoKSB3aXRoIHRoZSBnaXZlbiBpMmNfYWRhcHRlciBhbmQgY2hpcC9hZGRyZXNzIGFyZ3VtZW50cy4KK0lmIGFsbCBnb2VzIHdlbGwsIHRoZW4gaXQgcmVnaXN0ZXJzIHRoZSBzdWJkZXYgd2l0aCB0aGUgdjRsMl9kZXZpY2UuIEl0IGdldHMKK3RoZSB2NGwyX2RldmljZSBieSBjYWxsaW5nIGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlciksIHNvIHlvdSBzaG91bGQgbWFrZSBzdXJlCit0aGF0IGFkYXBkYXRhIGlzIHNldCB0byB2NGwyX2RldmljZSB3aGVuIHlvdSBzZXR1cCB0aGUgaTJjX2FkYXB0ZXIgaW4geW91cgorZHJpdmVyLgorCitZb3UgY2FuIGFsc28gdXNlIHY0bDJfaTJjX25ld19wcm9iZWRfc3ViZGV2KCkgd2hpY2ggaXMgdmVyeSBzaW1pbGFyIHRvCit2NGwyX2kyY19uZXdfc3ViZGV2KCksIGV4Y2VwdCB0aGF0IGl0IGhhcyBhbiBhcnJheSBvZiBwb3NzaWJsZSBJMkMgYWRkcmVzc2VzCit0aGF0IGl0IHNob3VsZCBwcm9iZS4gSW50ZXJuYWxseSBpdCBjYWxscyBpMmNfbmV3X3Byb2JlZF9kZXZpY2UoKS4KKworQm90aCBmdW5jdGlvbnMgcmV0dXJuIE5VTEwgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisKKworc3RydWN0IHZpZGVvX2RldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYWN0dWFsIGRldmljZSBub2RlcyBpbiB0aGUgL2RldiBkaXJlY3RvcnkgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlCit2aWRlb19kZXZpY2Ugc3RydWN0ICh2NGwyLWRldi5oKS4gVGhpcyBzdHJ1Y3QgY2FuIGVpdGhlciBiZSBhbGxvY2F0ZWQKK2R5bmFtaWNhbGx5IG9yIGVtYmVkZGVkIGluIGEgbGFyZ2VyIHN0cnVjdC4KKworVG8gYWxsb2NhdGUgaXQgZHluYW1pY2FsbHkgdXNlOgorCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCisJaWYgKHZkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisKK0lmIHlvdSBlbWJlZCBpdCBpbiBhIGxhcmdlciBzdHJ1Y3QsIHRoZW4geW91IG11c3Qgc2V0IHRoZSByZWxlYXNlKCkKK2NhbGxiYWNrIHRvIHlvdXIgb3duIGZ1bmN0aW9uOgorCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9ICZteV92ZGV2LT52ZGV2OworCisJdmRldi0+cmVsZWFzZSA9IG15X3ZkZXZfcmVsZWFzZTsKKworVGhlIHJlbGVhc2UgY2FsbGJhY2sgbXVzdCBiZSBzZXQgYW5kIGl0IGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIKK29mIHRoZSB2aWRlbyBkZXZpY2UgZXhpdHMuCisKK1RoZSBkZWZhdWx0IHZpZGVvX2RldmljZV9yZWxlYXNlKCkgY2FsbGJhY2sganVzdCBjYWxscyBrZnJlZSB0byBmcmVlIHRoZQorYWxsb2NhdGVkIG1lbW9yeS4KKworWW91IHNob3VsZCBhbHNvIHNldCB0aGVzZSBmaWVsZHM6CisKKy0gcGFyZW50OiBzZXQgdG8gdGhlIHBhcmVudCBkZXZpY2UgKHNhbWUgZGV2aWNlIGFzIHdhcyB1c2VkIHRvIHJlZ2lzdGVyCisgIHY0bDJfZGV2aWNlKS4KKy0gbmFtZTogc2V0IHRvIHNvbWV0aGluZyBkZXNjcmlwdGl2ZSBhbmQgdW5pcXVlLgorLSBmb3BzOiBzZXQgdG8gdGhlIGZpbGVfb3BlcmF0aW9ucyBzdHJ1Y3QuCistIGlvY3RsX29wczogaWYgeW91IHVzZSB0aGUgdjRsMl9pb2N0bF9vcHMgdG8gc2ltcGxpZnkgaW9jdGwgbWFpbnRlbmFuY2UKKyAgKGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBhbmQgaXQgbWlnaHQgYmVjb21lIGNvbXB1bHNvcnkgaW4gdGhlCisgIGZ1dHVyZSEpLCB0aGVuIHNldCB0aGlzIHRvIHlvdXIgdjRsMl9pb2N0bF9vcHMgc3RydWN0LgorCitJZiB5b3UgdXNlIHY0bDJfaW9jdGxfb3BzLCB0aGVuIHlvdSBzaG91bGQgc2V0IC51bmxvY2tlZF9pb2N0bCB0bworX192aWRlb19pb2N0bDIgb3IgLmlvY3RsIHRvIHZpZGVvX2lvY3RsMiBpbiB5b3VyIGZpbGVfb3BlcmF0aW9ucyBzdHJ1Y3QuCisKKwordmlkZW9fZGV2aWNlIHJlZ2lzdHJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOZXh0IHlvdSByZWdpc3RlciB0aGUgdmlkZW8gZGV2aWNlOiB0aGlzIHdpbGwgY3JlYXRlIHRoZSBjaGFyYWN0ZXIgZGV2aWNlCitmb3IgeW91LgorCisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAoZXJyKSB7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHZkZXYpOyAvLyBvciBrZnJlZShteV92ZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKK1doaWNoIGRldmljZSBpcyByZWdpc3RlcmVkIGRlcGVuZHMgb24gdGhlIHR5cGUgYXJndW1lbnQuIFRoZSBmb2xsb3dpbmcKK3R5cGVzIGV4aXN0OgorCitWRkxfVFlQRV9HUkFCQkVSOiB2aWRlb1ggZm9yIHZpZGVvIGlucHV0L291dHB1dCBkZXZpY2VzCitWRkxfVFlQRV9WQkk6IHZiaVggZm9yIHZlcnRpY2FsIGJsYW5rIGRhdGEgKGkuZS4gY2xvc2VkIGNhcHRpb25zLCB0ZWxldGV4dCkKK1ZGTF9UWVBFX1JBRElPOiByYWRpb1ggZm9yIHJhZGlvIHR1bmVycworVkZMX1RZUEVfVlRYOiB2dHhYIGZvciB0ZWxldGV4dCBkZXZpY2VzIChkZXByZWNhdGVkLCBkb24ndCB1c2UpCisKK1RoZSBsYXN0IGFyZ3VtZW50IGdpdmVzIHlvdSBhIGNlcnRhaW4gYW1vdW50IG9mIGNvbnRyb2wgb3ZlciB0aGUgZGV2aWNlCitrZXJuZWwgbnVtYmVyIHVzZWQgKGkuZS4gdGhlIFggaW4gdmlkZW9YKS4gTm9ybWFsbHkgeW91IHdpbGwgcGFzcyAtMSB0bworbGV0IHRoZSB2NGwyIGZyYW1ld29yayBwaWNrIHRoZSBmaXJzdCBmcmVlIG51bWJlci4gQnV0IGlmIGEgZHJpdmVyIGNyZWF0ZXMKK21hbnkgZGV2aWNlcywgdGhlbiBpdCBjYW4gYmUgdXNlZnVsIHRvIGhhdmUgZGlmZmVyZW50IHZpZGVvIGRldmljZXMgaW4KK3NlcGFyYXRlIHJhbmdlcy4gRm9yIGV4YW1wbGUsIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyBzdGFydCBhdCAwLCB2aWRlbworb3V0cHV0IGRldmljZXMgc3RhcnQgYXQgMTYuCisKK1NvIHlvdSBjYW4gdXNlIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHNwZWNpZnkgYSBtaW5pbXVtIGtlcm5lbCBudW1iZXIgYW5kCit0aGUgdjRsMiBmcmFtZXdvcmsgd2lsbCB0cnkgdG8gcGljayB0aGUgZmlyc3QgZnJlZSBudW1iZXIgdGhhdCBpcyBlcXVhbAorb3IgaGlnaGVyIHRvIHdoYXQgeW91IHBhc3NlZC4gSWYgdGhhdCBmYWlscywgdGhlbiBpdCB3aWxsIGp1c3QgcGljayB0aGUKK2ZpcnN0IGZyZWUgbnVtYmVyLgorCitXaGVuZXZlciBhIGRldmljZSBub2RlIGlzIGNyZWF0ZWQgc29tZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIGNyZWF0ZWQgZm9yIHlvdS4KK0lmIHlvdSBsb29rIGluIC9zeXMvY2xhc3MvdmlkZW80bGludXggeW91IHNlZSB0aGUgZGV2aWNlcy4gR28gaW50byBlLmcuCit2aWRlbzAgYW5kIHlvdSB3aWxsIHNlZSAnbmFtZScgYW5kICdpbmRleCcgYXR0cmlidXRlcy4gVGhlICduYW1lJyBhdHRyaWJ1dGUKK2lzIHRoZSAnbmFtZScgZmllbGQgb2YgdGhlIHZpZGVvX2RldmljZSBzdHJ1Y3QuIFRoZSAnaW5kZXgnIGF0dHJpYnV0ZSBpcworYSBkZXZpY2Ugbm9kZSBpbmRleCB0aGF0IGNhbiBiZSBhc3NpZ25lZCBieSB0aGUgZHJpdmVyLCBvciB0aGF0IGlzIGNhbGN1bGF0ZWQKK2ZvciB5b3UuCisKK0lmIHlvdSBjYWxsIHZpZGVvX3JlZ2lzdGVyX2RldmljZSgpLCB0aGVuIHRoZSBpbmRleCBpcyBqdXN0IGluY3JlYXNlZCBieQorMSBmb3IgZWFjaCBkZXZpY2Ugbm9kZSB5b3UgcmVnaXN0ZXIuIFRoZSBmaXJzdCB2aWRlbyBkZXZpY2Ugbm9kZSB5b3UgcmVnaXN0ZXIKK2Fsd2F5cyBzdGFydHMgb2ZmIHdpdGggMC4KKworQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNhbGwgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlX2luZGV4KCkgd2hpY2ggaXMgaWRlbnRpY2FsCit0byB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKSwgYnV0IHdpdGggYW4gZXh0cmEgaW5kZXggYXJndW1lbnQuIEhlcmUgeW91IGNhbgorcGFzcyBhIHNwZWNpZmljIGluZGV4IHZhbHVlIChiZXR3ZWVuIDAgYW5kIDMxKSB0aGF0IHNob3VsZCBiZSB1c2VkLgorCitVc2VycyBjYW4gc2V0dXAgdWRldiBydWxlcyB0aGF0IHV0aWxpemUgdGhlIGluZGV4IGF0dHJpYnV0ZSB0byBtYWtlIGZhbmN5CitkZXZpY2UgbmFtZXMgKGUuZy4gJ21wZWdYJyBmb3IgTVBFRyB2aWRlbyBjYXB0dXJlIGRldmljZSBub2RlcykuCisKK0FmdGVyIHRoZSBkZXZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLCB0aGVuIHlvdSBjYW4gdXNlIHRoZXNlIGZpZWxkczoKKworLSB2ZmxfdHlwZTogdGhlIGRldmljZSB0eXBlIHBhc3NlZCB0byB2aWRlb19yZWdpc3Rlcl9kZXZpY2UuCistIG1pbm9yOiB0aGUgYXNzaWduZWQgZGV2aWNlIG1pbm9yIG51bWJlci4KKy0gbnVtOiB0aGUgZGV2aWNlIGtlcm5lbCBudW1iZXIgKGkuZS4gdGhlIFggaW4gdmlkZW9YKS4KKy0gaW5kZXg6IHRoZSBkZXZpY2UgaW5kZXggbnVtYmVyIChjYWxjdWxhdGVkIG9yIHNldCBleHBsaWNpdGx5IHVzaW5nCisgIHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleCkuCisKK0lmIHRoZSByZWdpc3RyYXRpb24gZmFpbGVkLCB0aGVuIHlvdSBuZWVkIHRvIGNhbGwgdmlkZW9fZGV2aWNlX3JlbGVhc2UoKQordG8gZnJlZSB0aGUgYWxsb2NhdGVkIHZpZGVvX2RldmljZSBzdHJ1Y3QsIG9yIGZyZWUgeW91ciBvd24gc3RydWN0IGlmIHRoZQordmlkZW9fZGV2aWNlIHdhcyBlbWJlZGRlZCBpbiBpdC4gVGhlIHZkZXYtPnJlbGVhc2UoKSBjYWxsYmFjayB3aWxsIG5ldmVyCitiZSBjYWxsZWQgaWYgdGhlIHJlZ2lzdHJhdGlvbiBmYWlsZWQsIG5vciBzaG91bGQgeW91IGV2ZXIgYXR0ZW1wdCB0bwordW5yZWdpc3RlciB0aGUgZGV2aWNlIGlmIHRoZSByZWdpc3RyYXRpb24gZmFpbGVkLgorCisKK3ZpZGVvX2RldmljZSBjbGVhbnVwCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSB2aWRlbyBkZXZpY2Ugbm9kZXMgaGF2ZSB0byBiZSByZW1vdmVkLCBlaXRoZXIgZHVyaW5nIHRoZSB1bmxvYWQKK29mIHRoZSBkcml2ZXIgb3IgYmVjYXVzZSB0aGUgVVNCIGRldmljZSB3YXMgZGlzY29ubmVjdGVkLCB0aGVuIHlvdSBzaG91bGQKK3VucmVnaXN0ZXIgdGhlbToKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkZXYpOworCitUaGlzIHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2Ugbm9kZXMgZnJvbSBzeXNmcyAoY2F1c2luZyB1ZGV2IHRvIHJlbW92ZSB0aGVtCitmcm9tIC9kZXYpLgorCitBZnRlciB2aWRlb191bnJlZ2lzdGVyX2RldmljZSgpIHJldHVybnMgbm8gbmV3IG9wZW5zIGNhbiBiZSBkb25lLgorCitIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBVU0IgZGV2aWNlcyBzb21lIGFwcGxpY2F0aW9uIG1pZ2h0IHN0aWxsIGhhdmUgb25lCitvZiB0aGVzZSBkZXZpY2Ugbm9kZXMgb3Blbi4gWW91IHNob3VsZCBibG9jayBhbGwgbmV3IGFjY2Vzc2VzIHRvIHJlYWQsCit3cml0ZSwgcG9sbCwgZXRjLiBleGNlcHQgcG9zc2libHkgZm9yIGNlcnRhaW4gaW9jdGwgb3BlcmF0aW9ucyBsaWtlCitxdWV1ZWluZyBidWZmZXJzLgorCitXaGVuIHRoZSBsYXN0IHVzZXIgb2YgdGhlIHZpZGVvIGRldmljZSBub2RlIGV4aXRzLCB0aGVuIHRoZSB2ZGV2LT5yZWxlYXNlKCkKK2NhbGxiYWNrIGlzIGNhbGxlZCBhbmQgeW91IGNhbiBkbyB0aGUgZmluYWwgY2xlYW51cCB0aGVyZS4KKworCit2aWRlb19kZXZpY2UgaGVscGVyIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgZmV3IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgorCitZb3UgY2FuIHNldC9nZXQgZHJpdmVyIHByaXZhdGUgZGF0YSBpbiB0aGUgdmlkZW9fZGV2aWNlIHN0cnVjdCB1c2luZzoKKwordm9pZCAqdmlkZW9fZ2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KTsKK3ZvaWQgdmlkZW9fc2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCB2b2lkICpkYXRhKTsKKworTm90ZSB0aGF0IHlvdSBjYW4gc2FmZWx5IGNhbGwgdmlkZW9fc2V0X2RydmRhdGEoKSBiZWZvcmUgY2FsbGluZwordmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCkuCisKK0FuZCB0aGlzIGZ1bmN0aW9uOgorCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZkYXRhKHN0cnVjdCBmaWxlICpmaWxlKTsKKworcmV0dXJucyB0aGUgdmlkZW9fZGV2aWNlIGJlbG9uZ2luZyB0byB0aGUgZmlsZSBzdHJ1Y3QuCisKK1RoZSBmaW5hbCBoZWxwZXIgZnVuY3Rpb24gY29tYmluZXMgdmlkZW9fZ2V0X2RydmRhdGEgd2l0aAordmlkZW9fZGV2ZGF0YToKKwordm9pZCAqdmlkZW9fZHJ2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKK1lvdSBjYW4gZ28gZnJvbSBhIHZpZGVvX2RldmljZSBzdHJ1Y3QgdG8gdGhlIHY0bDJfZGV2aWNlIHN0cnVjdCB1c2luZzoKKworc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSh2ZGV2LT5wYXJlbnQpOworCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDg1N2M4NzcuLjcyZDZlZWQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xNzU1LDYgKzE3NTUsMTMgQEAKIEw6CWxpbnV4LWkyY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorRlJFRVNDQUxFIElNWCAvIE1YQyBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CVNhc2NoYSBIYXVlcgorTToJa2VybmVsQHBlbmd1dHJvbml4LmRlCitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5hcm0ubGludXgub3JnLnVrIChzdWJzY3JpYmVycy1vbmx5KQorUzoJTWFpbnRhaW5lZAorCiBGUkVFU0NBTEUgU09DIEZTX0VORVQgRFJJVkVSCiBQOglQYW50ZWxpcyBBbnRvbmlvdQogTToJcGFudGVsaXMuYW50b25pb3VAZ21haWwuY29tCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDA5ZmY3ZDguLmQxM2E5NjkgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0yMDUsMTMgKzIwNSwxNCBAQAogICAgICAgICBTUkNBUkNIIDo9IHg4NgogZW5kaWYKIAotIyBXaGVyZSB0byBsb2NhdGUgYXJjaCBzcGVjaWZpYyBoZWFkZXJzCisjIEFkZGl0aW9uYWwgQVJDSCBzZXR0aW5ncyBmb3Igc3BhcmMKIGlmZXEgKCQoQVJDSCksc3BhcmM2NCkKLSAgICAgICBoZHItYXJjaCAgOj0gc3BhcmMKLWVsc2UKLSAgICAgICBoZHItYXJjaCAgOj0gJChTUkNBUkNIKQorICAgICAgIFNSQ0FSQ0ggOj0gc3BhcmMKIGVuZGlmCiAKKyMgV2hlcmUgdG8gbG9jYXRlIGFyY2ggc3BlY2lmaWMgaGVhZGVycworaGRyLWFyY2ggIDo9ICQoU1JDQVJDSCkKKwogS0NPTkZJR19DT05GSUcJPz0gLmNvbmZpZwogCiAjIFNIRUxMIHVzZWQgYnkga2J1aWxkCmRpZmYgLS1naXQgYS9hcmNoL0tjb25maWcgYi9hcmNoL0tjb25maWcKaW5kZXggNDcxZTcyZC4uMmUxM2FhMiAxMDA2NDQKLS0tIGEvYXJjaC9LY29uZmlnCisrKyBiL2FyY2gvS2NvbmZpZwpAQCAtNiw2ICs2LDggQEAKIAl0cmlzdGF0ZSAiT1Byb2ZpbGUgc3lzdGVtIHByb2ZpbGluZyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFBST0ZJTElORwogCWRlcGVuZHMgb24gSEFWRV9PUFJPRklMRQorCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IFJJTkdfQlVGRkVSCiAJaGVscAogCSAgT1Byb2ZpbGUgaXMgYSBwcm9maWxpbmcgc3lzdGVtIGNhcGFibGUgb2YgcHJvZmlsaW5nIHRoZQogCSAgd2hvbGUgc3lzdGVtLCBpbmNsdWRlIHRoZSBrZXJuZWwsIGtlcm5lbCBtb2R1bGVzLCBsaWJyYXJpZXMsCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggZTk3MWFiMC4uZWRhOWI5MCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vaW8uaApAQCAtOTYsOSArOTYsNiBAQAogCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSk7CiB9CiAKLS8qIFRoaXMgZGVwZW5kcyBvbiB3b3JraW5nIGlvbW11LiAgKi8KLSNkZWZpbmUgQklPX1ZNRVJHRV9CT1VOREFSWQkoYWxwaGFfbXYubXZfcGNpX3RiaSA/IFBBR0VfU0laRSA6IDApCi0KIC8qIE1heGltdW0gUElPIHNwYWNlIGFkZHJlc3Mgc3VwcG9ydGVkPyAgKi8KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDk3MjJmOGIuLmQ2ZWJlMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTU2LDcgKzE1Niw2IEBACiAJYm9vbAogCiBjb25maWcgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCi0JYm9vbAogCWRlZl9ib29sIHkKIAogaWYgT1BST0ZJTEUKQEAgLTIwMSw2ICsyMDAsNyBAQAogCiBjb25maWcgQVJDSF9BQUVDMjAwMAogCWJvb2wgIkFnaWxlbnQgQUFFQy0yMDAwIGJhc2VkIgorCXNlbGVjdCBDUFVfQVJNOTIwVAogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBIQVZFX0NMSwogCWhlbHAKQEAgLTIxMCw2ICsyMTAsNyBAQAogCWJvb2wgIkFSTSBMdGQuIEludGVncmF0b3IgZmFtaWx5IgogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDT01NT05fQ0xLREVWCiAJc2VsZWN0IElDU1Q1MjUKIAloZWxwCiAJICBTdXBwb3J0IGZvciBBUk0ncyBJbnRlZ3JhdG9yIHBsYXRmb3JtLgpAQCAtMjE4LDYgKzIxOSw3IEBACiAJYm9vbCAiQVJNIEx0ZC4gUmVhbFZpZXcgZmFtaWx5IgogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDT01NT05fQ0xLREVWCiAJc2VsZWN0IElDU1QzMDcKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTIyOSw2ICsyMzEsNyBAQAogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBBUk1fVklDCiAJc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IENPTU1PTl9DTEtERVYKIAlzZWxlY3QgSUNTVDMwNwogCXNlbGVjdCBHRU5FUklDX1RJTUUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwpAQCAtMjQzLDIyICsyNDYsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBBdG1lbCBBVDkxUk05MjAwLAogCSAgQVQ5MVNBTTkgYW5kIEFUOTFDQVA5IHByb2Nlc3NvcnMuCiAKLWNvbmZpZyBBUkNIX0NMUFM3NTAwCi0JYm9vbCAiQ2lycnVzIENMLVBTNzUwMEZFIgotCXNlbGVjdCBUSU1FUl9BQ09STgotCXNlbGVjdCBJU0EKLQlzZWxlY3QgTk9fSU9QT1JUCi0Jc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBDaXJydXMgTG9naWMgUFM3NTAwRkUgc3lzdGVtLW9uLWEtY2hpcC4KLQogY29uZmlnIEFSQ0hfQ0xQUzcxMVgKIAlib29sICJDaXJydXMgTG9naWMgQ0xQUzcxMXgvRVA3MjF4LWJhc2VkIgorCXNlbGVjdCBDUFVfQVJNNzIwVAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIENpcnJ1cyBMb2dpYyA3MTF4LzcyMXggYmFzZWQgYm9hcmRzLgogCiBjb25maWcgQVJDSF9FQlNBMTEwCiAJYm9vbCAiRUJTQS0xMTAiCisJc2VsZWN0IENQVV9TQTExMAogCXNlbGVjdCBJU0EKIAlzZWxlY3QgTk9fSU9QT1JUCiAJaGVscApAQCAtMjY5LDE2ICsyNjUsMTkgQEAKIAogY29uZmlnIEFSQ0hfRVA5M1hYCiAJYm9vbCAiRVA5M3h4LWJhc2VkIgorCXNlbGVjdCBDUFVfQVJNOTIwVAogCXNlbGVjdCBBUk1fQU1CQQogCXNlbGVjdCBBUk1fVklDCiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBDT01NT05fQ0xLREVWCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDaXJydXMgRVA5M3h4IHNlcmllcyBvZiBDUFVzLgogCiBjb25maWcgQVJDSF9GT09UQlJJREdFCiAJYm9vbCAiRm9vdEJyaWRnZSIKKwlzZWxlY3QgQ1BVX1NBMTEwCiAJc2VsZWN0IEZPT1RCUklER0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBEQzIxMjg1IGNvbXBhbmlvbiBjaGlwCkBAIC0yODYsMTggKzI4NSwyMyBAQAogCiBjb25maWcgQVJDSF9ORVRYCiAJYm9vbCAiSGlsc2NoZXIgTmV0WCBiYXNlZCIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQVJNX1ZJQworCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEdFTkVSSUNfVElNRQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBIaWxzY2hlciBOZXRYIFNvYwogCiBjb25maWcgQVJDSF9INzIwWAogCWJvb2wgIkh5bml4IEhNUzcyMHgtYmFzZWQiCisJc2VsZWN0IENQVV9BUk03MjBUCiAJc2VsZWN0IElTQV9ETUFfQVBJCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEh5bml4IEhNUzcyMHgKIAogY29uZmlnIEFSQ0hfSU1YCiAJYm9vbCAiSU1YIgorCXNlbGVjdCBDUFVfQVJNOTIwVAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTMwNyw2ICszMTEsNyBAQAogY29uZmlnIEFSQ0hfSU9QMTNYWAogCWJvb2wgIklPUDEzeHgtYmFzZWQiCiAJZGVwZW5kcyBvbiBNTVUKKwlzZWxlY3QgQ1BVX1hTQzMKIAlzZWxlY3QgUExBVF9JT1AKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCkBAIC0zMTcsNiArMzIyLDcgQEAKIGNvbmZpZyBBUkNIX0lPUDMyWAogCWJvb2wgIklPUDMyeC1iYXNlZCIKIAlkZXBlbmRzIG9uIE1NVQorCXNlbGVjdCBDUFVfWFNDQUxFCiAJc2VsZWN0IFBMQVRfSU9QCiAJc2VsZWN0IFBDSQogCXNlbGVjdCBHRU5FUklDX0dQSU8KQEAgLTMyOCw2ICszMzQsNyBAQAogY29uZmlnIEFSQ0hfSU9QMzNYCiAJYm9vbCAiSU9QMzN4LWJhc2VkIgogCWRlcGVuZHMgb24gTU1VCisJc2VsZWN0IENQVV9YU0NBTEUKIAlzZWxlY3QgUExBVF9JT1AKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEdFTkVSSUNfR1BJTwpAQCAtMzM4LDYgKzM0NSw3IEBACiBjb25maWcgQVJDSF9JWFAyM1hYCiAgCWJvb2wgIklYUDIzWFgtYmFzZWQiCiAJZGVwZW5kcyBvbiBNTVUKKwlzZWxlY3QgQ1BVX1hTQzMKICAJc2VsZWN0IFBDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEludGVsJ3MgSVhQMjN4eCAoWFNjYWxlKSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KQEAgLTM0NSw2ICszNTMsNyBAQAogY29uZmlnIEFSQ0hfSVhQMjAwMAogCWJvb2wgIklYUDI0MDAvMjgwMC1iYXNlZCIKIAlkZXBlbmRzIG9uIE1NVQorCXNlbGVjdCBDUFVfWFNDQUxFCiAJc2VsZWN0IFBDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEludGVsJ3MgSVhQMjQwMC8yODAwIChYU2NhbGUpIGZhbWlseSBvZiBwcm9jZXNzb3JzLgpAQCAtMzUyLDYgKzM2MSw3IEBACiBjb25maWcgQVJDSF9JWFA0WFgKIAlib29sICJJWFA0eHgtYmFzZWQiCiAJZGVwZW5kcyBvbiBNTVUKKwlzZWxlY3QgQ1BVX1hTQ0FMRQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTM2MSw2ICszNzEsNyBAQAogCiBjb25maWcgQVJDSF9MNzIwMAogCWJvb2wgIkxpbmtVcC1MNzIwMCIKKwlzZWxlY3QgQ1BVX0FSTTcyMFQKIAlzZWxlY3QgRklRCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIExpbmtVcCBTeXN0ZW1zCkBAIC0zNzQsNyArMzg1LDkgQEAKIAogY29uZmlnIEFSQ0hfS0lSS1dPT0QKIAlib29sICJNYXJ2ZWxsIEtpcmt3b29kIgorCXNlbGVjdCBDUFVfRkVST0NFT04KIAlzZWxlY3QgUENJCisJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBHRU5FUklDX1RJTUUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBQTEFUX09SSU9OCkBAIC0zODQsMTMgKzM5NywxNiBAQAogCiBjb25maWcgQVJDSF9LUzg2OTUKIAlib29sICJNaWNyZWwvS2VuZGluIEtTODY5NSIKKwlzZWxlY3QgQ1BVX0FSTTkyMlQKIAlzZWxlY3QgR0VORVJJQ19HUElPCisgICAgICAgIHNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE1pY3JlbC9LZW5kaW4gS1M4Njk1ICJDZW50YXVyIiAoQVJNOTIyVCkgYmFzZWQKIAkgIFN5c3RlbS1vbi1DaGlwIGRldmljZXMuCiAKIGNvbmZpZyBBUkNIX05TOVhYWAogCWJvb2wgIk5ldFNpbGljb24gTlM5eHh4IgorCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTQwMyw2ICs0MTksNyBAQAogCiBjb25maWcgQVJDSF9MT0tJCiAJYm9vbCAiTWFydmVsbCBMb2tpICg4OFJDODQ4MCkiCisJc2VsZWN0IENQVV9GRVJPQ0VPTgogCXNlbGVjdCBHRU5FUklDX1RJTUUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBQTEFUX09SSU9OCkBAIC00MTEsNyArNDI4LDkgQEAKIAogY29uZmlnIEFSQ0hfTVY3OFhYMAogCWJvb2wgIk1hcnZlbGwgTVY3OHh4MCIKKwlzZWxlY3QgQ1BVX0ZFUk9DRU9OCiAJc2VsZWN0IFBDSQorCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgUExBVF9PUklPTgpAQCAtNDMyLDYgKzQ1MSw3IEBACiBjb25maWcgQVJDSF9PUklPTjVYCiAJYm9vbCAiTWFydmVsbCBPcmlvbiIKIAlkZXBlbmRzIG9uIE1NVQorCXNlbGVjdCBDUFVfRkVST0NFT04KIAlzZWxlY3QgUENJCiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBHRU5FUklDX1RJTUUKQEAgLTQ0NCw2ICs0NjQsNyBAQAogCiBjb25maWcgQVJDSF9QTlg0MDA4CiAJYm9vbCAiUGhpbGlwcyBOZXhwZXJpYSBQTlg0MDA4IE1vYmlsZSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgSEFWRV9DTEsKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgUGhpbGlwcyBQTlg0MDA4IG1vYmlsZSBwbGF0Zm9ybS4KQEAgLTQ1NCw2ICs0NzUsNyBAQAogCXNlbGVjdCBBUkNIX01URF9YSVAKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IENPTU1PTl9DTEtERVYKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTQ3Nyw2ICs0OTksNyBAQAogCiBjb25maWcgQVJDSF9TQTExMDAKIAlib29sICJTQTExMDAtYmFzZWQiCisJc2VsZWN0IENQVV9TQTExMDAKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBBUkNIX01URF9YSVAKQEAgLTQ5OCw4ICs1MjEsMTYgQEAKIAkgIEJBU1QgKDxodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9FQjExMElUWC8+KSwgdGhlIElQQVEgMTk0MCBvcgogCSAgdGhlIFNhbXN1bmcgU01ESzI0MTAgZGV2ZWxvcG1lbnQgYm9hcmQgKGFuZCBkZXJpdmF0aXZlcykuCiAKK2NvbmZpZyBBUkNIX1MzQzY0WFgKKwlib29sICJTYW1zdW5nIFMzQzY0WFgiCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBIQVZFX0NMSworCWhlbHAKKwkgIFNhbXN1bmcgUzNDNjRYWCBzZXJpZXMgYmFzZWQgc3lzdGVtcworCiBjb25maWcgQVJDSF9TSEFSSwogCWJvb2wgIlNoYXJrIgorCXNlbGVjdCBDUFVfU0ExMTAKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IElTQV9ETUEKIAlzZWxlY3QgWk9ORV9ETUEKQEAgLTUxMCw2ICs1NDEsNyBAQAogCiBjb25maWcgQVJDSF9MSDdBNDBYCiAJYm9vbCAiU2hhcnAgTEg3QTQwWCIKKwlzZWxlY3QgQ1BVX0FSTTkyMlQKIAlzZWxlY3QgQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlmICFMSDdBNDBYX0NPTlRJR01FTQogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUgaWYgIUxIN0E0MFhfQ09OVElHTUVNCiAJaGVscApAQCAtNTIwLDYgKzU1Miw3IEBACiAKIGNvbmZpZyBBUkNIX0RBVklOQ0kKIAlib29sICJUSSBEYVZpbmNpIgorCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBHRU5FUklDX1RJTUUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBHRU5FUklDX0dQSU8KQEAgLTU0MSw2ICs1NzQsNyBAQAogCiBjb25maWcgQVJDSF9NU00KIAlib29sICJRdWFsY29tbSBNU00iCisJc2VsZWN0IENQVV9WNgogCXNlbGVjdCBHRU5FUklDX1RJTUUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCWhlbHAKQEAgLTU0OSw2ICs1ODMsMTMgQEAKIAkgIGludGVyZmFjZSB0byB0aGUgQVJNOSBtb2RlbSBwcm9jZXNzb3Igd2hpY2ggcnVucyB0aGUgYmFzZWJhbmQgc3RhY2sKIAkgIGFuZCBjb250cm9scyBzb21lIHZpdGFsIHN1YnN5c3RlbXMgKGNsb2NrIGFuZCBwb3dlciBjb250cm9sLCBldGMpLgogCitjb25maWcgQVJDSF9XOTBYOTAwCisJYm9vbCAiTnV2b3RvbiBXOTBYOTAwIENQVSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKKwloZWxwCisJCVN1cHBvcnQgZm9yIE51dm90b24gKFdpbmJvbmQgbG9naWMgZGVwdC4pIEFSTTkgcHJvY2Vzc29yLFlvdQorCQljYW4gbG9naW4gd3d3Lm1jdW9zLmNvbSBvciB3d3cubnV2b3Rvbi5jb20gdG8ga25vdyBtb3JlLgorCiBlbmRjaG9pY2UKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWciCkBAIC01OTAsNiArNjMxLDcgQEAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1raXJrd29vZC9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnIgorc291cmNlICJhcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vcGxhdC1zM2MvS2NvbmZpZyIKIAogaWYgQVJDSF9TM0MyNDEwCkBAIC02MDEsNiArNjQzLDExIEBACiBzb3VyY2UgImFyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnIgogZW5kaWYKIAoraWYgQVJDSF9TM0M2NFhYCitzb3VyY2UgImFyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnIgorc291cmNlICJhcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZyIKK2VuZGlmCisKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1saDdhNDB4L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyIKQEAgLTYyNyw2ICs2NzQsOCBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXNtL0tjb25maWciCiAKK3NvdXJjZSAiYXJjaC9hcm0vbWFjaC13OTB4OTAwL0tjb25maWciCisKICMgRGVmaW5pdGlvbnMgdG8gbWFrZSBsaWZlIGVhc2llcgogY29uZmlnIEFSQ0hfQUNPUk4KIAlib29sCkBAIC03ODEsNyArODMwLDcgQEAKIAogY29uZmlnIExPQ0FMX1RJTUVSUwogCWJvb2wgIlVzZSBsb2NhbCB0aW1lciBpbnRlcnJ1cHRzIgotCWRlcGVuZHMgb24gU01QICYmIChSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QKQorCWRlcGVuZHMgb24gU01QICYmIChSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IFJFQUxWSUVXX0VCX0E5TVApCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGxvY2FsIHRpbWVycyBvbiBTTVAgcGxhdGZvcm1zLCByYXRoZXIgdGhlbiB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggYmQ2ZTI4MS4uMjRlMGYwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTc2LDYgKzc2LDcgQEAKIHR1bmUtJChDT05GSUdfQ1BVX1NBMTEwMCkJOj0tbXR1bmU9c3Ryb25nYXJtMTEwMAogdHVuZS0kKENPTkZJR19DUFVfWFNDQUxFKQk6PSQoY2FsbCBjYy1vcHRpb24sLW10dW5lPXhzY2FsZSwtbXR1bmU9c3Ryb25nYXJtMTEwKSAtV2EsLW1jcHU9eHNjYWxlCiB0dW5lLSQoQ09ORklHX0NQVV9YU0MzKQkJOj0kKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT14c2NhbGUsLW10dW5lPXN0cm9uZ2FybTExMCkgLVdhLC1tY3B1PXhzY2FsZQordHVuZS0kKENPTkZJR19DUFVfRkVST0NFT04pCTo9JChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9bWFydmVsbC1mLC1tdHVuZT14c2NhbGUpCiB0dW5lLSQoQ09ORklHX0NQVV9WNikJCTo9JChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9YXJtMTEzNmotcywtbXR1bmU9c3Ryb25nYXJtKQogCiBpZmVxICgkKENPTkZJR19BRUFCSSkseSkKQEAgLTk2LDcgKzk3LDYgQEAKIAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9SUEMpCSAgIDo9IHJwYwogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9FQlNBMTEwKQkgICA6PSBlYnNhMTEwCi0gbWFjaGluZS0kKENPTkZJR19BUkNIX0NMUFM3NTAwKSAgIDo9IGNscHM3NTAwCiAgbWFjaGluZS0kKENPTkZJR19GT09UQlJJREdFKQkgICA6PSBmb290YnJpZGdlCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1NIQVJLKQkgICA6PSBzaGFyawogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TQTExMDApCSAgIDo9IHNhMTEwMApAQCAtMTIxLDcgKzEyMSwxMCBAQAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PTUFQMykJICAgOj0gb21hcDIKICAgICBwbGF0LSQoQ09ORklHX0FSQ0hfT01BUCkJICAgOj0gb21hcAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNDEwKQkgICA6PSBzM2MyNDEwIHMzYzI0MDAgczNjMjQxMiBzM2MyNDQwIHMzYzI0NDIgczNjMjQ0MworIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNEEwKQkgICA6PSBzM2MyNGEwCiAgICAgcGxhdC0kKENPTkZJR19QTEFUX1MzQzI0WFgpCSAgIDo9IHMzYzI0eHggczNjCisgbWFjaGluZS0kKENPTkZJR19BUkNIX1MzQzY0WFgpCSAgIDo9IHMzYzY0MDAgczNjNjQxMAorICAgIHBsYXQtJChDT05GSUdfUExBVF9TM0M2NFhYKQkgICA6PSBzM2M2NHh4IHMzYwogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9MSDdBNDBYKQkgICA6PSBsaDdhNDB4CiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1ZFUlNBVElMRSkgIDo9IHZlcnNhdGlsZQogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JTVgpCSAgIDo9IGlteApAQCAtMTM5LDExICsxNDIsMTMgQEAKICAgICBwbGF0LSQoQ09ORklHX0FSQ0hfTVhDKQkgICA6PSBteGMKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyKQkgICA6PSBteDIKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgzKQkgICA6PSBteDMKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgxKQkgICA6PSBteDEKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfT1JJT041WCkJICAgOj0gb3Jpb241eAogICAgIHBsYXQtJChDT05GSUdfUExBVF9PUklPTikJICAgOj0gb3Jpb24KICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVNNKQkgICA6PSBtc20KICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTE9LSSkgICAgICAgOj0gbG9raQogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NVjc4WFgwKSAgICA6PSBtdjc4eHgwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX1c5MFg5MDApICAgIDo9IHc5MHg5MDAKIAogaWZlcSAoJChDT05GSUdfQVJDSF9FQlNBMTEwKSx5KQogIyBUaGlzIGlzIHdoYXQgaGFwcGVucyBpZiB5b3UgZm9yZ2V0IHRoZSBJT0NTMTYgbGluZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCBjNDdmMmEzLi5mYmU1ZWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0yMywxMCArMjMsNiBAQAogT0JKUwkJKz0gaGVhZC1sNzIwMC5vCiBlbmRpZgogCi1pZmVxICgkKENPTkZJR19BUkNIX0NMUFM3NTAwKSx5KQotSEVBRAkJPSBoZWFkLWNscHM3NTAwLm8KLWVuZGlmCi0KIGlmZXEgKCQoQ09ORklHX0FSQ0hfUDcyMFQpLHkpCiAjIEJvcnJvdyB0aGlzIGNvZGUgZnJvbSBTQTExMDAKIE9CSlMJCSs9IGhlYWQtc2ExMTAwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWNscHM3NTAwLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1jbHBzNzUwMC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNjNzhhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWNscHM3NTAwLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQtY2xwczc1MDAuUwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSBOZXh1cyBFbGVjdHJvbmljcyBMdGQKLSAqLwotCi0KLQkJLyogVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRoZSBrZXJuZWwgY2FuIGJlCi0JCSAgIGJvb3RlZCBvbiBhIDc1MDAgc3lzdGVtOiBmcm9tIEFuZ2VsIChsb2FkZWQgaW4gUkFNKSwgZnJvbQotCQkgICAxNi1iaXQgUk9NIG9yIGZyb20gMzItYml0IEZsYXNoLiAgTHVja2lseSwgYSBzaW5nbGUga2VybmVsCi0JCSAgIGltYWdlIGRvZXMgZm9yIHRoZW0gYWxsLiAqLwotCQkvKiBUaGlzIGJyYW5jaCBpcyB0YWtlbiBpZiB0aGUgQ1BVIG1lbW9yeSB3aWR0aCBtYXRjaGVzIHRoZQotCQkgICBhY3R1YWwgZGV2aWNlIGluIHVzZS4gIFRoZSBkZWZhdWx0IGF0IHBvd2VyIG9uIGlzIDE2IGJpdHMKLQkJICAgc28gd2UgbXVzdCBiZSBwcmVwYXJlZCBmb3IgYSBtaXNtYXRjaC4gKi8KLQkJLnNlY3Rpb24gIi5zdGFydCIsICJheCIKLTI6Ci0JCWIJMWYKLQkJLndvcmQJMHhmZmZmCi0JCS53b3JkCTB4YjYzMgkJQCBtb3YgcjExLCAjMHgwMzIwMDAwMAotCQkud29yZAkweGUzYTAKLQkJLndvcmQJMHgwMDAwCQlAIG1vdiByMCwgIzAKLQkJLndvcmQJMHhlM2EwCi0JCS53b3JkCTB4MDA4MAkJQCBzdHJiIHIwLCBbcjExLCAjMHg4MF0KLQkJLndvcmQJMHhlNWNiCi0JCS53b3JkCTB4ZjAwMAkJQCBtb3YgcGMsICMwCi0JCS53b3JkCTB4ZTNhMAotMToKLQkJYWRyCXIxLCAyYgotCQl0ZXEJcjEsICMwCi0JCWJuZQkuTGFuZ2VsCi0JCS8qIFRoaXMgaXMgYSBkaXJlY3QtZnJvbS1ST00gYm9vdC4gIENvcHkgdGhlIGtlcm5lbCBpbnRvIAotCQkgICBSQU0gYW5kIHJ1biBpdCB0aGVyZS4gKi8KLQkJbW92CXIwLCAjMHgzMAotCQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCi0JCW1vdglyMCwgIzB4MTMKLQkJbXNyCWNwc3JfY3hzZiwgcjAKLQkJbW92CXIxMiwgIzB4MDMwMDAwMDAJQCBwb2ludCB0byBMRURzCi0JCW9ycglyMTIsIHIxMiwgIzB4MDAwMjAwMDAKLQkJb3JyCXIxMiwgcjEyLCAjMHhiYTAwCi0JCW1vdglyMCwgIzB4NTUwMAotCQlzdHIJcjAsIFtyMTJdCi0JCW1vdglyMCwgIzB4MTAwMDAwMDAKLQkJb3JyCXIwLCByMCwgIzB4ODAwMAotCQltb3YJcjQsIHIwCi0JCWxkcglyMiwgPV9lbmQKLTI6Ci0JCWxkcglyMywgW3IxXSwgIzQKLQkJc3RyCXIzLCBbcjBdLCAjNAotCQl0ZXEJcjAsIHIyCi0JCWJuZQkyYgotCQltb3YJcjAsICMweGZmMDAKLQkJc3RyCXIwLCBbcjEyXQotMToJCi0JCW1vdglyMTIsICMweDAzMDAwMDAwCUAgcG9pbnQgdG8gTEVEcwotCQlvcnIJcjEyLCByMTIsICMweDAwMDIwMDAwCi0JCW9ycglyMTIsIHIxMiwgIzB4YmEwMAotCQltb3YJcjAsICMweGZlMDAKLQkJc3RyCXIwLCBbcjEyXQotCi0JCWFkcglsciwgMWYKLQkJbW92CXIwLCAjMAotCQltb3YJcjEsICMxNAkJLyogTUFDSF9UWVBFX0NMUFM3NTAwICovCi0JCW1vdglwYywgbHIKLS5MYW5nZWw6Ci0jaWZkZWYgQ09ORklHX0FOR0VMQk9PVAotCQkvKiBDYWxsIEFuZ2VsIHRvIHN3aXRjaCBpbnRvIFNWQyBtb2RlLiAqLwotCQltb3YJcjAsICMweDE3Ci0JCXN3aQkweDEyMzQ1NgotI2VuZGlmCi0JCS8qIEVuc3VyZSBhbGwgaW50ZXJydXB0cyBhcmUgb2ZmIGFuZCBNTVUgZGlzYWJsZWQgKi8KLQkJbXJzCXIwLCBjcHNyCi0JCW9ycglyMCwgcjAsICMweGMwCi0JCW1zcgljcHNyX2N4c2YsIHIwCi0KLQkJYWRyCWxyLCAxYgotCQlvcnIJbHIsIGxyLCAjMHgxMDAwMDAwMAotCQltb3YJcjAsICMweDMwCQlAIE1NVSBvZmYKLQkJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAotCQltb3YJcjAsIHIwCi0JIAltb3YJcGMsIGxyCi0KLQkJLmx0b3JnCi0KLTE6Ci0vKiBBbmQgdGhlIHJlc3QgKi8KLSNpbmNsdWRlICJoZWFkLlMiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwppbmRleCA4NGExZTA0Li43N2Q2MTQyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC02MjQsNiArNjI0LDEyIEBACiAJCWIJX19hcm12NF9tbXVfY2FjaGVfb2ZmCiAJCWIJX19hcm12NF9tbXVfY2FjaGVfZmx1c2gKIAorCQkud29yZAkweDU2MDU2OTMwCisJCS53b3JkCTB4ZmYwZmZmZjAJCUAgUFhBOTM1CisJCWIJX19hcm12NF9tbXVfY2FjaGVfb24KKwkJYglfX2FybXY0X21tdV9jYWNoZV9vZmYKKwkJYglfX2FybXY0X21tdV9jYWNoZV9mbHVzaAorCiAJCS53b3JkCTB4NTYwNTAwMDAJCUAgRmVyb2Nlb24KIAkJLndvcmQJMHhmZjBmMDAwMAogCQliCV9fYXJtdjRfbW11X2NhY2hlX29uCkBAIC03MTcsNiArNzIzLDkgQEAKIAkJYmwJX19hcm12N19tbXVfY2FjaGVfZmx1c2gKIAkJbW92CXIwLCAjMAogCQltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSB3aG9sZSBUTEIKKwkJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgNglAIGludmFsaWRhdGUgQlRDCisJCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CUAgRFNCCisJCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDQJQCBJU0IKIAkJbW92CXBjLCByMTIKIAogX19hcm02X21tdV9jYWNoZV9vZmY6CkBAIC03NzgsMTIgKzc4NywxMyBAQAogX19hcm12N19tbXVfY2FjaGVfZmx1c2g6CiAJCW1yYwlwMTUsIDAsIHIxMCwgYzAsIGMxLCA1CUAgcmVhZCBJRF9NTUZSMQogCQl0c3QJcjEwLCAjMHhmIDw8IDE2CQlAIGhpZXJhcmNoaWNhbCBjYWNoZSAoQVJNdjcpCi0JCWJlcQloaWVyYXJjaGljYWwKIAkJbW92CXIxMCwgIzAKKwkJYmVxCWhpZXJhcmNoaWNhbAogCQltY3IJcDE1LCAwLCByMTAsIGM3LCBjMTQsIDAJQCBjbGVhbitpbnZhbGlkYXRlIEQKIAkJYglpZmx1c2gKIGhpZXJhcmNoaWNhbDoKLQkJc3RtZmQJc3AhLCB7cjAtcjUsIHI3LCByOS1yMTF9CisJCW1jcglwMTUsIDAsIHIxMCwgYzcsIGMxMCwgNQlAIERNQgorCQlzdG1mZAlzcCEsIHtyMC1yNSwgcjcsIHI5LCByMTF9CiAJCW1yYwlwMTUsIDEsIHIwLCBjMCwgYzAsIDEJQCByZWFkIGNsaWRyCiAJCWFuZHMJcjMsIHIwLCAjMHg3MDAwMDAwCUAgZXh0cmFjdCBsb2MgZnJvbSBjbGlkcgogCQltb3YJcjMsIHIzLCBsc3IgIzIzCQlAIGxlZnQgYWxpZ24gbG9jIGJpdCBmaWVsZApAQCAtODIwLDEyICs4MzAsMTQgQEAKIAkJY21wCXIzLCByMTAKIAkJYmd0CWxvb3AxCiBmaW5pc2hlZDoKKwkJbGRtZmQJc3AhLCB7cjAtcjUsIHI3LCByOSwgcjExfQogCQltb3YJcjEwLCAjMAkJCUAgc3dpdGggYmFjayB0byBjYWNoZSBsZXZlbCAwCiAJCW1jcglwMTUsIDIsIHIxMCwgYzAsIGMwLCAwCUAgc2VsZWN0IGN1cnJlbnQgY2FjaGUgbGV2ZWwgaW4gY3NzcgotCQlsZG1mZAlzcCEsIHtyMC1yNSwgcjcsIHI5LXIxMX0KIGlmbHVzaDoKKwkJbWNyCXAxNSwgMCwgcjEwLCBjNywgYzEwLCA0CUAgRFNCCiAJCW1jcglwMTUsIDAsIHIxMCwgYzcsIGM1LCAwCUAgaW52YWxpZGF0ZSBJK0JUQgotCQltY3IJcDE1LCAwLCByMTAsIGM3LCBjMTAsIDQJQCBkcmFpbiBXQgorCQltY3IJcDE1LCAwLCByMTAsIGM3LCBjMTAsIDQJQCBEU0IKKwkJbWNyCXAxNSwgMCwgcjEwLCBjNywgYzUsIDQJQCBJU0IKIAkJbW92CXBjLCBscgogCiBfX2FybXY1dGVqX21tdV9jYWNoZV9mbHVzaDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDY1Y2U4ZmYuLjNmYzA4NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtODYsNiArODYsOCBAQAogCiAjZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCiAKKyNkZWZpbmUgbWVtemVybyhzLG4pIF9fbWVtemVybyhzLG4pCisKIC8qCiAgKiBPcHRpbWlzZWQgQyB2ZXJzaW9uIG9mIG1lbXplcm8gZm9yIHRoZSBBUk0uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnIGIvYXJjaC9hcm0vY29tbW9uL0tjb25maWcKaW5kZXggODZiNWU2OS4uYTJjZDliZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL0tjb25maWcKKysrIGIvYXJjaC9hcm0vY29tbW9uL0tjb25maWcKQEAgLTMzLDMgKzMzLDYgQEAKIAogY29uZmlnIFNIQVJQX1NDT09QCiAJYm9vbAorCitjb25maWcgQ09NTU9OX0NMS0RFVgorCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvYXJtL2NvbW1vbi9NYWtlZmlsZQppbmRleCAzMjVlNGI2Li43Y2I3OTYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vY29tbW9uL01ha2VmaWxlCkBAIC0xNywzICsxNyw0IEBACiBvYmotJChDT05GSUdfQVJDSF9JWFAyMDAwKQkrPSB1ZW5naW5lLm8KIG9iai0kKENPTkZJR19BUkNIX0lYUDIzWFgpCSs9IHVlbmdpbmUubwogb2JqLSQoQ09ORklHX1BDSV9IT1NUX0lURTgxNTIpICArPSBpdDgxNTIubworb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtERVYpCSs9IGNsa2Rldi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vY2xrZGV2LmMgYi9hcmNoL2FybS9jb21tb24vY2xrZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMTdiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9jbGtkZXYuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBhcmNoL2FybS9jb21tb24vY2xrZGV2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEhlbHBlciBmb3IgdGhlIGNsayBBUEkgdG8gYXNzaXN0IGxvb2tpbmcgdXAgYSBzdHJ1Y3QgY2xrLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KKyNpbmNsdWRlIDxtYWNoL2Nsa2Rldi5oPgorCitzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7CitzdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfZmluZChjb25zdCBjaGFyICpkZXZfaWQsIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3sKKwlzdHJ1Y3QgY2xrX2xvb2t1cCAqcDsKKwlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCWludCBtYXRjaCwgYmVzdCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKKwkJaWYgKChwLT5kZXZfaWQgJiYgIWRldl9pZCkgfHwgKHAtPmNvbl9pZCAmJiAhY29uX2lkKSkKKwkJCWNvbnRpbnVlOworCQltYXRjaCA9IDA7CisJCWlmIChwLT5kZXZfaWQpCisJCQltYXRjaCArPSAyICogKHN0cmNtcChwLT5kZXZfaWQsIGRldl9pZCkgPT0gMCk7CisJCWlmIChwLT5jb25faWQpCisJCQltYXRjaCArPSAxICogKHN0cmNtcChwLT5jb25faWQsIGNvbl9pZCkgPT0gMCk7CisJCWlmIChtYXRjaCA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNoID4gYmVzdCkgeworCQkJY2xrID0gcC0+Y2xrOworCQkJYmVzdCA9IG1hdGNoOworCQl9CisJfQorCXJldHVybiBjbGs7Cit9CisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQpCit7CisJY29uc3QgY2hhciAqZGV2X2lkID0gZGV2ID8gZGV2X25hbWUoZGV2KSA6IE5VTEw7CisJc3RydWN0IGNsayAqY2xrOworCisJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKKwljbGsgPSBjbGtfZmluZChkZXZfaWQsIGNvbl9pZCk7CisJaWYgKGNsayAmJiAhX19jbGtfZ2V0KGNsaykpCisJCWNsayA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOworCisJcmV0dXJuIGNsayA/IGNsayA6IEVSUl9QVFIoLUVOT0VOVCk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXQpOworCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworCV9fY2xrX3B1dChjbGspOworfQorRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKwordm9pZCBjbGtkZXZfYWRkKHN0cnVjdCBjbGtfbG9va3VwICpjbCkKK3sKKwltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmNsLT5ub2RlLCAmY2xvY2tzKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGNsa2Rldl9hZGQpOworCisjZGVmaW5lIE1BWF9ERVZfSUQJMjAKKyNkZWZpbmUgTUFYX0NPTl9JRAkxNgorCitzdHJ1Y3QgY2xrX2xvb2t1cF9hbGxvYyB7CisJc3RydWN0IGNsa19sb29rdXAgY2w7CisJY2hhcglkZXZfaWRbTUFYX0RFVl9JRF07CisJY2hhcgljb25faWRbTUFYX0NPTl9JRF07Cit9OworCitzdHJ1Y3QgY2xrX2xvb2t1cCAqY2xrZGV2X2FsbG9jKHN0cnVjdCBjbGsgKmNsaywgY29uc3QgY2hhciAqY29uX2lkLAorCWNvbnN0IGNoYXIgKmRldl9mbXQsIC4uLikKK3sKKwlzdHJ1Y3QgY2xrX2xvb2t1cF9hbGxvYyAqY2xhOworCisJY2xhID0ga3phbGxvYyhzaXplb2YoKmNsYSksIEdGUF9LRVJORUwpOworCWlmICghY2xhKQorCQlyZXR1cm4gTlVMTDsKKworCWNsYS0+Y2wuY2xrID0gY2xrOworCWlmIChjb25faWQpIHsKKwkJc3RybGNweShjbGEtPmNvbl9pZCwgY29uX2lkLCBzaXplb2YoY2xhLT5jb25faWQpKTsKKwkJY2xhLT5jbC5jb25faWQgPSBjbGEtPmNvbl9pZDsKKwl9CisKKwlpZiAoZGV2X2ZtdCkgeworCQl2YV9saXN0IGFwOworCisJCXZhX3N0YXJ0KGFwLCBkZXZfZm10KTsKKwkJdnNjbnByaW50ZihjbGEtPmRldl9pZCwgc2l6ZW9mKGNsYS0+ZGV2X2lkKSwgZGV2X2ZtdCwgYXApOworCQljbGEtPmNsLmRldl9pZCA9IGNsYS0+ZGV2X2lkOworCQl2YV9lbmQoYXApOworCX0KKworCXJldHVybiAmY2xhLT5jbDsKK30KK0VYUE9SVF9TWU1CT0woY2xrZGV2X2FsbG9jKTsKKworLyoKKyAqIGNsa2Rldl9kcm9wIC0gcmVtb3ZlIGEgY2xvY2sgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgKi8KK3ZvaWQgY2xrZGV2X2Ryb3Aoc3RydWN0IGNsa19sb29rdXAgKmNsKQoreworCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CisJbGlzdF9kZWwoJmNsLT5ub2RlKTsKKwltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7CisJa2ZyZWUoY2wpOworfQorRVhQT1JUX1NZTUJPTChjbGtkZXZfZHJvcCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vbG9jb21vLmMgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKaW5kZXggN2M2YjRiOS4uMjI5M2YwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwpAQCAtMTEwOCw2ICsxMTA4LDcgQEAKIAlsb2NvbW9fd3JpdGVsKGJwd2YgfCBMT0NPTU9fQUxDX0VOLCBsY2hpcC0+YmFzZSArIExPQ09NT19GUk9OVExJR0hUICsgTE9DT01PX0FMUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGNoaXAtPmxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0wobG9jb21vX2Zyb250bGlnaHRfc2V0KTsKIAogLyoKICAqCUxvQ29NbyAiUmVnaXN0ZXIgQWNjZXNzIEJ1cy4iCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vdmljLmMgYi9hcmNoL2FybS9jb21tb24vdmljLmMKaW5kZXggZjFlNGI4Zi4uZWNmMGJmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi92aWMuYwpAQCAtNjksMTIgKzY5LDEyIEBACiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgY2xlYXIgYWxsIGV4aXN0aW5nIGludGVycnVwdHMKIAkgKi8KLQl3cml0ZWwoMCwgYmFzZSArIFZJQ19WRUNUX0FERFIpOworCXdyaXRlbCgwLCBiYXNlICsgVklDX1BMMTkwX1ZFQ1RfQUREUik7CiAJZm9yIChpID0gMDsgaSA8IDE5OyBpKyspIHsKIAkJdW5zaWduZWQgaW50IHZhbHVlOwogCi0JCXZhbHVlID0gcmVhZGwoYmFzZSArIFZJQ19WRUNUX0FERFIpOwotCQl3cml0ZWwodmFsdWUsIGJhc2UgKyBWSUNfVkVDVF9BRERSKTsKKwkJdmFsdWUgPSByZWFkbChiYXNlICsgVklDX1BMMTkwX1ZFQ1RfQUREUik7CisJCXdyaXRlbCh2YWx1ZSwgYmFzZSArIFZJQ19QTDE5MF9WRUNUX0FERFIpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CkBAIC04Miw3ICs4Miw3IEBACiAJCXdyaXRlbChWSUNfVkVDVF9DTlRMX0VOQUJMRSB8IGksIHJlZyk7CiAJfQogCi0Jd3JpdGVsKDMyLCBiYXNlICsgVklDX0RFRl9WRUNUX0FERFIpOworCXdyaXRlbCgzMiwgYmFzZSArIFZJQ19QTDE5MF9ERUZfVkVDVF9BRERSKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfc3RhcnQgKyBpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9lc2VyaWVzX3B4YV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2VzZXJpZXNfcHhhX2RlZmNvbmZpZwppbmRleCAyMzA3NTg3Li5iNmM1Y2JiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2VzZXJpZXNfcHhhX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2VzZXJpZXNfcHhhX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNgotIyBTYXQgSnVsIDI2IDIyOjI4OjQ2IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzgKKyMgV2VkIERlYyAyNCAyMzozNTo0NSAyMDA4CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CkBAIC0yMiw4ICsyMiw2IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVD15Ci1DT05GSUdfWk9ORV9ETUE9eQogQ09ORklHX0FSQ0hfTVREX1hJUD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMApAQCAtNDgsOCArNDYsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKQEAgLTU4LDEzICs1NSwxMiBAQAogQ09ORklHX0VNQkVEREVEPXkKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CiBDT05GSUdfRUxGX0NPUkU9eQotQ09ORklHX0NPTVBBVF9CUks9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzMsNiArNjksNyBAQAogQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldApAQCAtODAsMTUgKzc3LDEwIEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15Ci0jIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15Ci0jIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0NMSz15Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldApAQCAtMTEyLDE0ICsxMDQsMTUgQEAKICMKIENPTkZJR19JT1NDSEVEX05PT1A9eQogQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfQVM9eQogIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgogQ09ORklHX0NMQVNTSUNfUkNVPXkKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBTeXN0ZW0gVHlwZQpAQCAtMTI5LDcgKzEyMiw2IEBACiAjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKQEAgLTE2MCw3ICsxNTIsOCBAQAogIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAogCiAjCiAjIEludGVsIFBYQTJ4eC9QWEEzeHggSW1wbGVtZW50YXRpb25zCkBAIC0xNjksOCArMTYyLDEwIEBACiAjIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01QOTAwQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAogIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WSVBFUiBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9QWEFfRVNFUklFUz15CiBDT05GSUdfTUFDSF9FMzMwPXkKIENPTkZJR19NQUNIX0UzNTA9eQpAQCAtMTc4LDcgKzE3Myw4IEBACiBDT05GSUdfTUFDSF9FNzUwPXkKIENPTkZJR19NQUNIX0U0MDA9eQogQ09ORklHX01BQ0hfRTgwMD15Ci0jIENPTkZJR19NQUNIX1RSSVpFUFM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSSVpFUFNfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSDUwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9FTV9YMjcwIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfQ09MSUJSSSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX1pZTE9OSVRFIGlzIG5vdCBzZXQKQEAgLTE4NiwxMiArMTgyLDE1IEBACiAjIENPTkZJR19NQUNIX1RBVk9SRVZCIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfU0FBUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DTV9YMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfTUFHSUNJQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NSU9BNzAxIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfUENNMDI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUFhBX1BBTE0gaXMgbm90IHNldAogIyBDT05GSUdfUFhBX0VaWCBpcyBub3Qgc2V0CiBDT05GSUdfUFhBMjV4PXkKICMgQ09ORklHX1BYQV9QV00gaXMgbm90IHNldAorQ09ORklHX1BYQV9IQVZFX0JPQVJEX0lSUVM9eQogCiAjCiAjIEJvb3Qgb3B0aW9ucwpAQCAtMjIyLDYgKzIyMSw3IEBACiAjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfSVdNTVhUPXkKIENPTkZJR19YU0NBTEVfUE1VPXkKK0NPTkZJR19DT01NT05fQ0xLREVWPXkKIAogIwogIyBCdXMgc3VwcG9ydApAQCAtMjM3LDYgKzIzNyw3IEBACiAjCiAjIFBDLWNhcmQgYnJpZGdlcwogIworQ09ORklHX1BDTUNJQV9QWEEyWFg9bQogCiAjCiAjIEtlcm5lbCBGZWF0dXJlcwpAQCAtMjQ1LDI1ICsyNDYsMzAgQEAKICMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogQ09ORklHX0FFQUJJPXkKIENPTkZJR19PQUJJX0NPTVBBVD15Ci0jIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKICMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAogQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIAogIwpAQCAtMjc3LDkgKzI4MywxMCBAQAogQ09ORklHX0FUQUdTX1BST0M9eQogCiAjCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAogCiAjCiAjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgpAQCAtMjk2LDYgKzMwMyw4IEBACiAjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQU9VVD15CiAjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CiBDT05GSUdfQklORk1UX01JU0M9eQogCkBAIC0zMDksMTAgKzMxOCw2IEBACiBDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKICMgQ09ORklHX0FQTV9FTVVMQVRJT04gaXMgbm90IHNldAogQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTMzOSw3ICszNDQsNyBAQAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9UVU5ORUw9eQorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKQEAgLTM1MCwyNSArMzU1LDcgQEAKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2PXkKLSMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15Ci0jIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAotQ09ORklHX0lQVjZfU0lUPXkKLUNPTkZJR19JUFY2X05ESVNDX05PREVUWVBFPXkKLSMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKQEAgLTM3Niw2ICszNjMsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00MjEsMjUgKzQwOSwxOCBAQAogIwogIyBEb25nbGUgc3VwcG9ydAogIwotIyBDT05GSUdfS0lOR1NVTl9ET05HTEUgaXMgbm90IHNldAotIyBDT05GSUdfS1NEQVpaTEVfRE9OR0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tTOTU5X0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19VU0JfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUdNQVRFTF9GSVIgaXMgbm90IHNldAogQ09ORklHX1BYQV9GSUNQPXkKLSMgQ09ORklHX01DU19GSVIgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKIENPTkZJR19DRkc4MDIxMT1tCiBDT05GSUdfTkw4MDIxMT15CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogQ09ORklHX1dJUkVMRVNTX0VYVD15CiBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKIENPTkZJR19NQUM4MDIxMT1tCkBAIC00NDgsNyArNDI5LDkgQEAKICMgUmF0ZSBjb250cm9sIGFsZ29yaXRobSBzZWxlY3Rpb24KICMKIENPTkZJR19NQUM4MDIxMV9SQ19QSUQ9eQorIyBDT05GSUdfTUFDODAyMTFfUkNfTUlOU1RSRUwgaXMgbm90IHNldAogQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfUElEPXkKKyMgQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfTUlOU1RSRUwgaXMgbm90IHNldAogQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFQ9InBpZCIKICMgQ09ORklHX01BQzgwMjExX01FU0ggaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTFfTEVEUyBpcyBub3Qgc2V0CkBAIC01MzksMTEgKzUyMiwxMiBAQAogIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19NVERfTkFORF9JRFM9bQogIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9TSEFSUFNMIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9UTUlPPW0KICMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BTEFVREEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCkBAIC01NTYsMTMgKzU0MCwxMyBAQAogQ09ORklHX0JMS19ERVZfTE9PUD1tCiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCkBAIC02MzIsMzcgKzYxNiwyNSBAQAogQ09ORklHX1dMQU5fODAyMTE9eQogIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkVSVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNIGlzIG5vdCBzZXQKIENPTkZJR19IRVJNRVM9bQogQ09ORklHX1BDTUNJQV9IRVJNRVM9bQogIyBDT05GSUdfUENNQ0lBX1NQRUNUUlVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0FJUk9fQ1MgaXMgbm90IHNldAogIyBDT05GSUdfUENNQ0lBX1dMMzUwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfWkQxMjAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ORVRfUk5ESVNfV0xBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEw4MTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExX0hXU0lNIGlzIG5vdCBzZXQKICMgQ09ORklHX1A1NF9DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDMgaXMgbm90IHNldAogIyBDT05GSUdfQjQzTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1pEMTIxMVJXIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUMlgwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKLSMKLSMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1BDTUNJQT15CiAjIENPTkZJR19QQ01DSUFfM0M1ODkgaXMgbm90IHNldAogIyBDT05GSUdfUENNQ0lBXzNDNTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1BDTUNJQV9GTVZKMThYIGlzIG5vdCBzZXQKLUNPTkZJR19QQ01DSUFfUENORVQ9bQorIyBDT05GSUdfUENNQ0lBX1BDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDTUNJQV9OTUNMQU4gaXMgbm90IHNldAogIyBDT05GSUdfUENNQ0lBX1NNQzkxQzkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKQEAgLTcxNCwxMyArNjg2LDExIEBACiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAogQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWD1tCiBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1PXkKIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTI9eQogQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMz15CiAjIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFhfTUFJTlNUT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNzQ5LDExICs3MTksMTMgQEAKICMKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAogIwotIyBDT05GSUdfU0VSSUFMX1BYQSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX1BYQT15CisjIENPTkZJR19TRVJJQUxfUFhBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19VTklYOThfUFRZUz15CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT1tCisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogCkBAIC03NzMsNiArNzQ1LDEwIEBACiAjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKIAogIworIyBNZW1vcnkgbWFwcGVkIEdQSU8gZXhwYW5kZXJzOgorIworCisjCiAjIEkyQyBHUElPIGV4cGFuZGVyczoKICMKIApAQCAtNzg2LDEyICs3NjIsMTQgQEAKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKICMKICMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAjCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKICMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc5OSw4ICs3NzcsMTMgQEAKICMKIENPTkZJR19NRkRfQ09SRT15CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX0FTSUMzIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VDQjE0MDBfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfTUZEX1RNSU89eQorQ09ORklHX01GRF9UN0w2NlhCPXkKK0NPTkZJR19NRkRfVEM2Mzg3WEI9eQogQ09ORklHX01GRF9UQzYzOTNYQj15CiAKICMKQEAgLTgyNyw2ICs4MTAsNyBAQAogQ09ORklHX0ZCPXkKICMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CkBAIC04NTEsOCArODM1LDEwIEBACiAjIENPTkZJR19GQl9QWEFfUEFSQU1FVEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQlggaXMgbm90IHNldAogQ09ORklHX0ZCX1cxMDA9eQotIyBDT05GSUdfRkJfQU0yMDBFUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVE1JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQjg2MlhYIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQogQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9eQogIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldApAQCAtODg2LDYgKzg3Miw3IEBACiAjIENPTkZJR19GT05UXzEweDE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAogQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtODk5LDE0ICs4ODYsMTggQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USz15CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9WTUFTVEVSPXkKK0NPTkZJR19TTkRfQUM5N19DT0RFQz1tCiBDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAogQ09ORklHX1NORF9BUk09eQorQ09ORklHX1NORF9QWEEyWFhfTElCPW0KK0NPTkZJR19TTkRfUFhBMlhYX0xJQl9BQzk3PXkKICMgQ09ORklHX1NORF9QWEEyWFhfQUM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9QQ01DSUEgaXMgbm90IHNldAogQ09ORklHX1NORF9TT0M9bQogQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQpAQCAtOTIwLDEzMyArOTExLDE5IEBACiBDT05GSUdfSElEPXkKICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAKICMKLSMgVVNCIElucHV0IERldmljZXMKKyMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX1VTQl9ISUQ9bQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU1VQUE9SVD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCPW0KLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLSMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0RFVklDRV9DTEFTUz15Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAotCi0jCi0jIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwotIwotIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW1hZ2luZyBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0dBREdFVD15Ci0jIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKLSMgQ09ORklHX1VTQl9HQURHRVRfQU1ENTUzNlVEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAotQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYPXkKLUNPTkZJR19VU0JfUFhBMjVYPXkKLUNPTkZJR19VU0JfUFhBMjVYX1NNQUxMPXkKLSMgQ09ORklHX1VTQl9HQURHRVRfTTY2NTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0FUOTEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAotQ09ORklHX1VTQl9FVEg9bQotIyBDT05GSUdfVVNCX0VUSF9STkRJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VURlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR19TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01JRElfR0FER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HX1BSSU5URVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUgaXMgbm90IHNldAorQ09ORklHX0hJRF9DT01QQVQ9eQorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX01NQz15CiAjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FPXkKIAogIwotIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycwogIwogQ09ORklHX01NQ19CTE9DSz15CiBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CkBAIC0xMDU0LDE0ICs5MzEsMTggQEAKICMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKIAogIwotIyBNTUMvU0QgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKICMgQ09ORklHX01NQ19QWEEgaXMgbm90IHNldAogIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfVE1JTz15CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCkBAIC0xMDcwLDExICs5NTEsMTcgQEAKIENPTkZJR19FWFQyX0ZTPXkKICMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPW0KK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPW0KK0NPTkZJR19GU19NQkNBQ0hFPW0KICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQpAQCAtMTEwNiw2ICs5OTMsNyBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CkBAIC0xMTQyLDYgKzEwMzAsNyBAQAogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMjI4LDEzICsxMTE3LDE1IEBACiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9GVFJBQ0U9eQotQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQotIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CisKKyMKKyMgVHJhY2VycworIworIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CkBAIC0xMjQ0LDE1ICsxMTM1LDIzIEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUTz15CiAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST1tCitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9bQorQ09ORklHX0NSWVBUT19BRUFEMj1tCiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9bQorQ09ORklHX0NSWVBUT19IQVNIMj1tCitDT05GSUdfQ1JZUFRPX1JORzI9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9bQogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldApAQCAtMTMyNCwxNCArMTIyMywxNyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiBDT05GSUdfQklUUkVWRVJTRT15Ci0jIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPXkKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oNTAwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2g1MDAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDliYWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oNTAwMF9kZWZjb25maWcKQEAgLTAsMCArMSw5OTYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzYKKyMgVHVlIFNlcCAxNiAxNjoxMzo0OCAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19BUkNIX01URF9YSVA9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTYKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9DTEs9eQorIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEE9eQorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfR1VNU1RJWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAorIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEFfRVNFUklFUyBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9INTAwMD15CisjIENPTkZJR19NQUNIX1RSSVpFUFM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfRU1fWDI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xJVFRMRVRPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RBVk9SRVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU0FBUiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NQUdJQ0lBTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9QQUxNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorQ09ORklHX1BYQTI1eD15CisjIENPTkZJR19QWEFfUFdNIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19JV01NWFQgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fSEFTX0hPTEVTPXkKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9ImtlZXBpbml0cmQiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19LRVhFQz15CitDT05GSUdfQVRBR1NfUFJPQz15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorQ09ORklHX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworIyBDT05GSUdfTVREX0NIQVIgaXMgbm90IHNldAorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT1RQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHg4MDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfUFhBMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0hBUlBfU0wgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVBNUE9XRVIgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTMyCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CisjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fU1lTRlMgaXMgbm90IHNldAorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVVNCX0hEUkMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1VTQjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1BYQTI1WD15CitDT05GSUdfVVNCX1BYQTI1WD15CitDT05GSUdfVVNCX1BYQTI1WF9TTUFMTD15CisjIENPTkZJR19VU0JfR0FER0VUX002NjU5MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRVJPIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRVRIPXkKKyMgQ09ORklHX1VTQl9FVEhfUk5ESVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfQ01PUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfU0ExMTAwPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TPXkKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ01PREVfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFk9eQorIyBDT05GSUdfSkZGUzJfQ01PREVfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DTU9ERV9GQVZPVVJMWk8gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0NDSVRUPXkKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9raXJrd29vZF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2tpcmt3b29kX2RlZmNvbmZpZwppbmRleCBlMzM1N2JhLi5hYjhiMWUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2tpcmt3b29kX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2tpcmt3b29kX2RlZmNvbmZpZwpAQCAtMSwxMSArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LXJjNQotIyBTdW4gSnVuIDIyIDE1OjUxOjI1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzcKKyMgVGh1IERlYyAgNCAxNToyNzozOSAyMDA4CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15Ci1DT05GSUdfR0VORVJJQ19HUElPPXkKKyMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19NTVU9eQpAQCAtMjIsOCArMjIsNyBAQAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQotQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCkBAIC00OSwxNCArNDgsMTcgQEAKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtNzMsOSArNzUsMTIgQEAKIENPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfU0xBQj15Ci0jIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfUVVJUktTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldApAQCAtODUsOCArOTAsNyBAQAogQ09ORklHX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKLSMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CkBAIC05NywxMiArMTAxLDEzIEBACiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTExNyw2ICsxMjIsNyBAQAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKIENPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBTeXN0ZW0gVHlwZQpAQCAtMTI4LDcgKzEzNCw2IEBACiAjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CkBAIC0xNTgsNyArMTYzLDcgQEAKICMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVNNN1gwMEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAogCiAjCiAjIE1hcnZlbGwgS2lya3dvb2QgSW1wbGVtZW50YXRpb25zCkBAIC0xOTksNiArMjA0LDcgQEAKICMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfT1VURVJfQ0FDSEU9eQogQ09ORklHX0NBQ0hFX0ZFUk9DRU9OX0wyPXkKKyMgQ09ORklHX0NBQ0hFX0ZFUk9DRU9OX0wyX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIHN1cHBvcnQKQEAgLTIxNywyNSArMjIzLDMwIEBACiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19IWj0xMDAKIENPTkZJR19BRUFCST15CiAjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKICMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAogQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIAogIwpAQCAtMjQ4LDYgKzI1OSwxMSBAQAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogCiAjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKICMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCiAjCiAKQEAgLTI2MCw2ICsyNzYsOCBAQAogIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQogIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCkBAIC0yNjgsMTAgKzI4Niw2IEBACiAjCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzIyLDYgKzMzNiwxNSBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRFNBPXkKKyMgQ09ORklHX05FVF9EU0FfVEFHX0RTQSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0RTQV9UQUdfRURTQT15CisjIENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRFNBX01WODhFNlhYWD15CisjIENPTkZJR19ORVRfRFNBX01WODhFNjA2MCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBX01WODhFNjEzMSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0RTQV9NVjg4RTYxMjNfNjFfNjU9eQogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC0zNDMsMTIgKzM2NiwxMiBAQAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKQEAgLTM2NSw2ICszODgsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CkBAIC00NTMsNyArNDc4LDcgQEAKICMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX05BTkQ9eQotQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURT15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfTkFORF9JRFM9eQpAQCAtNTYxLDYgKzU4Niw3IEBACiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfU0FUQV9QTVA9eQpAQCAtNjE5LDcgKzY0NSw2IEBACiAjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNJT04gaXMgbm90IHNldApAQCAtNjI3LDExICs2NTIsMTQgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworCisjCisjIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIwogIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNjM5LDcgKzY2NywyMyBAQAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZFVEggaXMgbm90IHNldAogIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9eQorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST15CiAjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKQEAgLTY1MCwxMiArNjk0LDE2IEBACiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVF9QQ0k9eQogIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CkBAIC02NzYsMTQgKzcyNCwxMiBAQAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci1DT05GSUdfRTEwMDA9eQotQ09ORklHX0UxMDAwX05BUEk9eQotIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwRV9FTkFCTEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CkBAIC02OTksNiArNzQ1LDggQEAKIENPTkZJR19NVjY0M1hYX0VUSD15CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldAorIyBDT05GSUdfSk1FIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKQEAgLTc2NSw3ICs4MTMsMTEgQEAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CkBAIC03NzUsNyArODI3LDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfODI1MF9QQ0kgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX1BDST15CiBDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAogQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgogIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldApAQCAtODAwLDQ0ICs4NTIsNjQgQEAKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCisjCiAjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX01WNjRYWFg9eQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBhZGFwdGVyIEkyQy9EREMgY2hhbm5lbCBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CkBAIC04NjQsMjAgKzkzNiwyNiBAQAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKIAogIwogIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQogIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0FTSUMzIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC05MTAsOCArOTg4LDEwIEBACiAjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCi0jIFNvdW5kCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAogIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQpAQCAtOTIyLDkgKzEwMDIsMzYgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorQ09ORklHX0hJRF9BNFRFQ0g9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0JFTEtJTj15CitDT05GSUdfSElEX0JSSUdIVD15CitDT05GSUdfSElEX0NIRVJSWT15CitDT05GSUdfSElEX0NISUNPTlk9eQorQ09ORklHX0hJRF9DWVBSRVNTPXkKK0NPTkZJR19ISURfREVMTD15CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9MT0dJVEVDSD15CisjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX01JQ1JPU09GVD15CitDT05GSUdfSElEX01PTlRFUkVZPXkKK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD15CitDT05GSUdfSElEX1NBTVNVTkc9eQorQ09ORklHX0hJRF9TT05ZPXkKK0NPTkZJR19ISURfU1VOUExVUz15CisjIENPTkZJR19USFJVU1RNQVNURVJfRkYgaXMgbm90IHNldAorIyBDT05GSUdfWkVST1BMVVNfRkYgaXMgbm90IHNldAogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC05NDAsOCArMTA0Nyw5IEBACiBDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CiAjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKQEAgLTk1NiwyMCArMTA2NCwyMyBAQAogIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0hDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAogCiAjCiAjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwogIwogIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1BSSU5URVI9eQorQ09ORklHX1VTQl9QUklOVEVSPW0KICMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5IGFsc28gYmUgbmVlZGVkOwogIwogCiAjCi0jIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CkBAIC05OTIsNyArMTEwMyw2IEBACiAjCiAjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTU9OIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCkBAIC0xMDA1LDcgKzExMTUsNyBAQAogIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CkBAIC0xMDIzLDggKzExMzMsMTIgQEAKICMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VV0IgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX05FV19MRURTPXkKICMgQ09ORklHX0xFRFNfQ0xBU1MgaXMgbm90IHNldAogCkBAIC0xMDM4LDYgKzExNTIsOCBAQAogIyBDT05GSUdfTEVEU19UUklHR0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgogIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA1Niw3ICsxMTcyLDYgQEAKICMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9NVj15CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldApAQCAtMTA2NCwyOSArMTE3OSwzOSBAQAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM5MCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKK0NPTkZJR19SVENfRFJWX01WPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKIAogIwpAQCAtMTA5OSw2ICsxMjI0LDggQEAKICMgRE1BIENsaWVudHMKICMKICMgQ09ORklHX05FVF9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfRE1BVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwpAQCAtMTEwOSwxMSArMTIzNiwxMiBAQAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogQ09ORklHX1hGU19GUz15CiAjIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CkBAIC0xMTMxLDcgKzEyNTksNyBAQAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCi1DT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSVNPOTY2MF9GUz1tCiBDT05GSUdfSk9MSUVUPXkKICMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CiBDT05GSUdfVURGX0ZTPW0KQEAgLTExNDAsOSArMTI2OCw5IEBACiAjCiAjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKICMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KIENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKIENPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKICMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldApAQCAtMTE1Miw2ICsxMjgwLDcgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldApAQCAtMTE4Miw2ICsxMzExLDcgQEAKIENPTkZJR19DUkFNRlM9eQogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTExOTIsMTMgKzEzMjIsMTMgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKQEAgLTEyMTAsMjQgKzEzNDAsOCBAQAogIwogIyBQYXJ0aXRpb24gVHlwZXMKICMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19OTFM9eQogQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CkBAIC0xMjg0LDExICsxMzk4LDE0IEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldApAQCAtMTMwMCwyMSArMTQxNyw0MCBAQAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiBDT05GSUdfREVCVUdfSU5GTz15CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19LUFJPQkVTX1NBTklUWV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAogIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CisKKyMKKyMgVHJhY2VycworIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogQ09ORklHX0RFQlVHX0VSUk9SUz15CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CkBAIC0xMzI2LDYgKzE0NjIsNyBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKIENPTkZJR19BU1lOQ19DT1JFPXkKIENPTkZJR19DUllQVE89eQpAQCAtMTMzMyw4ICsxNDcwLDEyIEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9bQorQ09ORklHX0NSWVBUT19BRUFEPW0KIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fSEFTSD1tCitDT05GSUdfQ1JZUFRPX1JORz1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9bQogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKQEAgLTEzNzMsNiArMTUxNCwxMCBAQAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CkBAIC0xNDAzLDYgKzE1NDgsMTEgQEAKICMKICMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CiAKQEAgLTE0MTAsMTAgKzE1NjAsOSBAQAogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiBDT05GSUdfQklUUkVWRVJTRT15Ci0jIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPXkKIENPTkZJR19DUkMxNj15CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9rczg2OTVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9rczg2OTVfZGVmY29uZmlnCmluZGV4IDYwNzdmMmMuLmQyNWM0MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva3M4Njk1X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2tzODY5NV9kZWZjb25maWcKQEAgLTEsMzkgKzEsNjcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNy1yYzQKLSMgVGh1IE1heSAyNSAxNTo0Mjo1MSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctc2ltdGVjLW1pY3JlbDEKKyMgRnJpIERlYyAgNSAxMDozMDoyNyAyMDA4CiAjCiBDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKICMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi1DT05GSUdfVUlEMTY9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtNDEsMzAgKzY5LDUwIEBACiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfSU5URVJNT0RVTEU9eQotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS01PRD15Ci0KLSMKLSMgQmxvY2sgbGF5ZXIKLSMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTc4LDYwICsxMjYsNzcgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogCiAjCiAjIFN5c3RlbSBUeXBlCiAjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0tTODY5NT15CisjIENPTkZJR19BUkNIX05TOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xPS0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0tTODY5NT15CisjIENPTkZJR19BUkNIX01TTTdYMDBBIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCiAKICMKICMgS2VuZGluL01pY3JlbCBLUzg2OTUgSW1wbGVtZW50YXRpb25zCiAjCiBDT05GSUdfTUFDSF9LUzg2OTU9eQotIyBDT05GSUdfTUFDSF9EU00zMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9DTTQwMDIgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9DTTQwMDggaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9DTTQweHggaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9MSVRFMzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfU0U0MjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTUFOR0FfS1M4Njk1IGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0RTTTMyMD15CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKICMKIENPTkZJR19DUFVfMzI9eQogQ09ORklHX0NQVV9BUk05MjJUPXkKLUNPTkZJR19DUFVfMzJ2ND15CitDT05GSUdfQ1BVXzMydjRUPXkKIENPTkZJR19DUFVfQUJSVF9FVjRUPXkKK0NPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKIENPTkZJR19DUFVfQ0FDSEVfVjRXVD15CiBDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQogQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQogQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQogCiAjCiAjIFByb2Nlc3NvciBGZWF0dXJlcwpAQCAtMTQwLDE2ICsyMDUsMTYgQEAKICMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBzdXBwb3J0CiAjCiBDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWT15CiBDT05GSUdfUENJX0RFQlVHPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCiBDT05GSUdfUENDQVJEPXkKICMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUENNQ0lBPXkKQEAgLTE3Myw5ICsyMzgsMTIgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MTAwCi0jIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0CitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fSEFTX0hPTEVTPXkKICMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMTg0LDcgKzI1MiwxNCBAQAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKICMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKICMKQEAgLTE5NCw2ICsyNjksNyBAQAogQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCiBDT05GSUdfQ01ETElORT0ibWVtPTMyTSBjb25zb2xlPXR0eVMwLDExNTIwMCBpbml0cmQ9MHgyMDQxMDAwMCwzMTQ1NzI4IHJvb3Q9L2Rldi9yYW0wIHJ3IgogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAKICMKICMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCkBAIC0yMDIsOCArMjc4LDcgQEAKICMKICMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCiAjCi1DT05GSUdfRlBFX05XRlBFPXkKLSMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAogIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAogCiAjCkBAIC0yMTIsMzQgKzI4NywzMyBAQAogQ09ORklHX0JJTkZNVF9FTEY9eQogIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIworQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiBDT05GSUdfTkVUPXkKIAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CiBDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAogIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKQEAgLTI1MCwyOCArMzI0LDIxIEBACiAjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTI4MiwxMyArMzQ5LDggQEAKICMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKICMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKIAogIwpAQCAtMjk2LDkgKzM1OCwyMSBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTMwNywzNiArMzgxLDQwIEBACiAjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiBDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCiAjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKLSMKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAogCiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCkBAIC0zNTUsMjIgKzQzMywyNSBAQAogQ09ORklHX01URF9DRklfSTI9eQogIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NGSV9VVElMPXkKICMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CiAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwogIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDgwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD00CiAjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0lNUEE3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9JTlRFTF9WUl9OT1IgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCiAjCkBAIC0zODgsMjkgKzQ2OSwxNSBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwogIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIworQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldApAQCAtNDIyLDEzICs0ODksMTcgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQX0lMTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDM2LDEyNyArNTA3LDg1IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCiAjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUEhZIGRldmljZSBzdXBwb3J0Ci0jCiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwogQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotQ09ORklHX0FSTV9LUzg2OTVfRVRIRVI9eQorQ09ORklHX01JST15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKICMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAogIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAotIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAotIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLR0UgaXMgbm90IHNldAotIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIyBXaXJlbGVzcyBMQU4KICMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dMQU5fODAyMTE9eQorIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJFUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKK0NPTkZJR19QUklTTTU0PW0KKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUQVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BDTUNJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKICMgQ09ORklHX0lTRE4gaXMgbm90IHNldAogCiAjCiAjIElucHV0IGRldmljZSBzdXBwb3J0CiAjCiBDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKIAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCkBAIC01NjYsNyArNTk1LDYgQEAKIENPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CiBDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCkBAIC01NzYsNiArNjA0LDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNTg5LDkgKzYxOCwxMyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CiAKICMKICMgU2VyaWFsIGRyaXZlcnMKQEAgLTYwOSwxMzIgKzY0MiwxMTMgQEAKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT1tCiAjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKIAogIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0KLSMKICMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCiAjCiAjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQV0lSRUxFU1MgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiAjIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIworIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQogIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAogCiAjCi0jIExFRCBkZXZpY2VzCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAKICMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAogIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIworQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorQ09ORklHX0hJRF9ERUJVRz15CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQogIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKIAogIworIyBFbmFibGUgSG9zdCBvciBHYWRnZXQgc3VwcG9ydCB0byBzZWUgSW52ZW50cmEgb3B0aW9ucworIworCisjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKICMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgUmVhbCBUaW1lIENsb2NrCi0jCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTc0MywxNiArNzU3LDE2IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtNzc0LDEwICs3ODgsMTEgQEAKICMgUHNldWRvIGZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTc5MCw2NyArODA1LDExMyBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1NVTU1BUlk9eQorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlM9eQorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CitDT05GSUdfSkZGUzJfUlVCSU49eQorIyBDT05GSUdfSkZGUzJfQ01PREVfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFk9eQorIyBDT05GSUdfSkZGUzJfQ01PREVfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DTU9ERV9GQVZPVVJMWk8gaXMgbm90IHNldAogQ09ORklHX0NSQU1GUz15CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi0jIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwogIwogIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCiAjIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAotQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAogCkBAIC04NTksMjEgKzkyMCwxMDMgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CiAKICMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKICMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgzMW1vYm9hcmRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDMxbW9ib2FyZF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwZjg2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgzMW1vYm9hcmRfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzkwIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM1CisjIEZyaSBPY3QgMjQgMTE6NDE6MjIgMjAwOAorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTVhDPXkKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworCisjCisjIEZyZWVzY2FsZSBNWEMgSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19BUkNIX01YMiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9NWDM9eQorCisjCisjIE1YMyBPcHRpb25zCisjCisjIENPTkZJR19NQUNIX01YMzFBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9QQ00wMzcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NWDMxTElURSBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9NWDMxTU9CT0FSRD15CisjIENPTkZJR19NWENfSVJRX1BSSU9SIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1Y2PXkKKyMgQ09ORklHX0NQVV8zMnY2SyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVXzMydjY9eQorQ09ORklHX0NQVV9BQlJUX0VWNj15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1Y2PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjY9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfSFo9MTAwCitDT05GSUdfQUVBQkk9eQorIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibm9pbml0cmQgY29uc29sZT10dHlteGMwLDExNTIwMCByb290PS9kZXYvbXRkYmxvY2syIHJ3IGlwPW9mZiIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX1ZGUD15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFk9eQorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9OT1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzEgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfSU1YPXkKK0NPTkZJR19TRVJJQUxfSU1YX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CisjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19OTFMgaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19IQVZFX0ZUUkFDRT15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDMxcGRrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgzMXBka19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmZmMwZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgzMXBka19kZWZjb25maWcKQEAgLTAsMCArMSw3NzMgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMgU3VuIE9jdCAyNiAxNTo1NToyOSAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX01URF9YSVA9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworIyBDT05GSUdfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNworIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTVhDPXkKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKKworIworIyBGcmVlc2NhbGUgTVhDIEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfQVJDSF9NWDIgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTVgzPXkKKworIworIyBNWDMgT3B0aW9ucworIworIyBDT05GSUdfTUFDSF9NWDMxQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfUENNMDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTVgzMUxJVEUgaXMgbm90IHNldAorQ09ORklHX01BQ0hfTVgzMV8zRFM9eQorIyBDT05GSUdfTVhDX0lSUV9QUklPUiBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9WNj15CisjIENPTkZJR19DUFVfMzJ2NksgaXMgbm90IHNldAorQ09ORklHX0NQVV8zMnY2PXkKK0NPTkZJR19DUFVfQUJSVF9FVjY9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WNj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQ9eQorQ09ORklHX0NQVV9DT1BZX1Y2PXkKK0NPTkZJR19DUFVfVExCX1Y2PXkKK0NPTkZJR19DUFVfSEFTX0FTSUQ9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX09VVEVSX0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKK0NPTkZJR19IWj0xMDAKK0NPTkZJR19BRUFCST15CitDT05GSUdfQVJDSF9GTEFUTUVNX0hBU19IT0xFUz15CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CisjIENPTkZJR19VTkVWSUNUQUJMRV9MUlUgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0wCitDT05GSUdfWkJPT1RfUk9NX0JTUz0wCitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKKyMgQ09ORklHX1ZGUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKK0NPTkZJR19JUFY2PXkKKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSVBWNl9TSVQ9eQorQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQorIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTExWCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWXzEwMDA9eQorQ09ORklHX05FVERFVl8xMDAwMD15CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0lNWD15CitDT05GSUdfU0VSSUFMX0lNWF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX05PUF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZW9jb3JlOTI2X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmVvY29yZTkyNl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1ZjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmVvY29yZTkyNl9kZWZjb25maWcKQEAgLTAsMCArMSwxMzAyIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmMxCisjIFR1ZSBKdWwgMjkgMTA6NDY6NTQgMjAwOAorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNworIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MT15CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVNNN1gwMEEgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKKworIworIyBBdG1lbCBBVDkxIFN5c3RlbS1vbi1DaGlwCisjCisjIENPTkZJR19BUkNIX0FUOTFSTTkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFTQU05MjYxIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTFTQU05MjYzPXkKKyMgQ09ORklHX0FSQ0hfQVQ5MVNBTTlSTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFTQU05RzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MUNBUDkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxWDQwIGlzIG5vdCBzZXQKK0NPTkZJR19BVDkxX1BNQ19VTklUPXkKKworIworIyBBVDkxU0FNOTI2MyBCb2FyZCBUeXBlCisjCisjIENPTkZJR19NQUNIX0FUOTFTQU05MjYzRUsgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9VU0JfQTkyNjMgaXMgbm90IHNldAorQ09ORklHX01BQ0hfTkVPQ09SRTkyNj15CisKKyMKKyMgQVQ5MSBCb2FyZCBPcHRpb25zCisjCitDT05GSUdfTVREX0FUOTFfREFUQUZMQVNIX0NBUkQ9eQorCisjCisjIEFUOTEgRmVhdHVyZSBTZWxlY3Rpb25zCisjCisjIENPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1MgaXMgbm90IHNldAorQ09ORklHX0FUOTFfVElNRVJfSFo9MTAwCitDT05GSUdfQVQ5MV9FQVJMWV9EQkdVPXkKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFfRUFSTFlfVVNBUlQ1IGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTkyNlQ9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUSj15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorIyBDT05GSUdfQUVBQkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSIiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT15CisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX05FVF9JUElQPXkKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorQ09ORklHX0lQVjY9eQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9eQorQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQorIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlRMPXkKK0NPTkZJR19ORlRMX1JXPXkKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQkxPQ0syTVREPXkKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkQ9eQorQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURT15CitDT05GSUdfTVREX05BTkRfRUNDX1NNQz15CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfQVRNRUw9eQorQ09ORklHX01URF9OQU5EX0FUTUVMX0VDQ19IVz15CisjIENPTkZJR19NVERfTkFORF9BVE1FTF9FQ0NfU09GVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9BVE1FTF9FQ0NfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9QTEFURk9STT15CisjIENPTkZJR19NVERfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTkJEPXkKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CitDT05GSUdfQVRNRUxfUFdNPXkKK0NPTkZJR19BVE1FTF9UQ0xJQj15CitDT05GSUdfQVRNRUxfVENCX0NMS1NSQz15CitDT05GSUdfQVRNRUxfVENCX0NMS1NSQ19CTE9DSz0wCisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUxfU1NDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz15CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfU01TQ19QSFk9eQorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CitDT05GSUdfTUFDQj15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKK0NPTkZJR19NT1VTRV9QUzJfQUxQUz15CitDT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15CitDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15CitDT05GSUdfTU9VU0VfUFMyX0xJRkVCT09LPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0FQUExFVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDY9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CitDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15CisjIENPTkZJR19OX0hETEMgaXMgbm90IHNldAorIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAorIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVE1FTD15CitDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0FUTUVMX1BEQyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQVRNRUxfVFRZQVQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1NQSV9BVE1FTD15CisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfQVRNRUw9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0xDRF9MVFYzNTBRViBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CitDT05GSUdfQkFDS0xJR0hUX0FUTUVMX0xDREM9eQorIyBDT05GSUdfQkFDS0xJR0hUX0FUTUVMX1BXTSBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfQ09SR0kgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CitDT05GSUdfSElEX0RFQlVHPXkKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorQ09ORklHX1NESU9fVUFSVD15CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorQ09ORklHX01NQ19BVDkxPXkKKyMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTX0ZTPXkKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKK0NPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWT15CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0ZUUkFDRT15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZwppbmRleCAwODg0ZjIzLi42MWQwZmM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcKQEAgLTcyOCw5ICs3MjgsOSBAQAogIwogIyBSVEMgaW50ZXJmYWNlcwogIwotQ09ORklHX1JUQ19JTlRGX1NZU0ZTPW0KLUNPTkZJR19SVENfSU5URl9QUk9DPW0KLUNPTkZJR19SVENfSU5URl9ERVY9bQorQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQogCiAjCiAjIFJUQyBkcml2ZXJzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29tYXAzX3BhbmRvcmFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwM19wYW5kb3JhX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU0M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwM19wYW5kb3JhX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE0MDkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzcKKyMgRnJpIERlYyAgNSAxMTo1NDowOSAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19HUk9VUF9TQ0hFRD15CitDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CisjIENPTkZJR19SVF9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNFUl9TQ0hFRD15CisjIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfT01BUD15CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisKKyMKKyMgVEkgT01BUCBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19BUkNIX09NQVBfT1RHPXkKKyMgQ09ORklHX0FSQ0hfT01BUDEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQMiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9PTUFQMz15CisKKyMKKyMgT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKKyMgQ09ORklHX09NQVBfREVCVUdfUE9XRVJET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9ERUJVR19DTE9DS0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX01VWCBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9NQ0JTUD15CisjIENPTkZJR19PTUFQX01QVV9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfT01BUF8zMktfVElNRVI9eQorQ09ORklHX09NQVBfMzJLX1RJTUVSX0haPTEyOAorQ09ORklHX09NQVBfRE1fVElNRVI9eQorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMSBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzPXkKK0NPTkZJR19BUkNIX09NQVAzNFhYPXkKK0NPTkZJR19BUkNIX09NQVAzNDMwPXkKKworIworIyBPTUFQIEJvYXJkIFR5cGUKKyMKKyMgQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfT01BUF9MRFAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9PVkVSTyBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9PTUFQM19QQU5ET1JBPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV8zMnY2Sz15CitDT05GSUdfQ1BVX1Y3PXkKK0NPTkZJR19DUFVfMzJ2Nz15CitDT05GSUdfQ1BVX0FCUlRfRVY3PXkKK0NPTkZJR19DUFVfUEFCUlRfSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjc9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKK0NPTkZJR19BUk1fVEhVTUJFRT15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfVExTX1JFRz15CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTI4CitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fSEFTX0hPTEVTPXkKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CisjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSIgZGVidWcgIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKK0NPTkZJR19WRlA9eQorQ09ORklHX1ZGUHYzPXkKK0NPTkZJR19ORU9OPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPXkKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT15CisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EPXkKKyMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX01VU0VVTV9JRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfSURTPXkKKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfTE9XTEVWRUw9eQorIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD04MDAKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT00ODAKK0NPTkZJR19JTlBVVF9KT1lERVY9eQorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDY9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0zMgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfT01BUD15CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19JU1AxMzAxX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX1NQSV9PTUFQMjRYWD15CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hcHBlZCBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CitDT05GSUdfR1BJT19UV0w0MDMwPXkKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTUNQMjNTMDggaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9BU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfRUdQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CitDT05GSUdfVFdMNDAzMF9DT1JFPXkKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCitDT05GSUdfREFCPXkKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKKyMgQ09ORklHX0hJRF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0E0VEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQVBQTEUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQlJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DSEVSUlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NISUNPTlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0RFTEwgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0VaS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTE9HSVRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSElEX01JQ1JPU09GVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTU9OVEVSRVkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BBTlRIRVJMT1JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QRVRBTFlOWCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU0FNU1VORyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU09OWSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VOUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19USFJVU1RNQVNURVJfRkYgaXMgbm90IHNldAorIyBDT05GSUdfWkVST1BMVVNfRkYgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKyMgQ09ORklHX1VTQl9XVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XVVNCX0NCQUYgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9NVVNCX0hEUkM9eQorQ09ORklHX1VTQl9NVVNCX1NPQz15CisKKyMKKyMgT01BUCAzNDN4IGhpZ2ggc3BlZWQgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfTVVTQl9IT1NUPXkKKyMgQ09ORklHX1VTQl9NVVNCX1BFUklQSEVSQUwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTVVTQl9IRFJDX0hDRD15CisjIENPTkZJR19NVVNCX1BJT19PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfSU5WRU5UUkFfRE1BPXkKKyMgQ09ORklHX1VTQl9USV9DUFBJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heSBhbHNvIGJlIG5lZWRlZDsKKyMKKworIworIyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVZTRUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9WQlVTX0RSQVc9MgorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0ZTTF9VU0IyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9PTUFQPXkKK0NPTkZJR19VU0JfT01BUD15CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI1WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BTUQ1NTM2VURDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1FFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAorQ09ORklHX1VTQl9FVEg9eQorQ09ORklHX1VTQl9FVEhfUk5ESVM9eQorIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorIyBDT05GSUdfU0RJT19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfVFdMNDAzMD15CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzOTAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorQ09ORklHX1FVT1RBPXkKKyMgQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HPXkKKyMgQ09ORklHX1FGTVRfVjEgaXMgbm90IHNldAorQ09ORklHX1FGTVRfVjI9eQorQ09ORklHX1FVT1RBQ1RMPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKKworIworIyBUcmFjZXJzCisjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BRUFEPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX1JORz15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfQ1JDX0NDSVRUPXkKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKK0NPTkZJR19MSUJDUkMzMkM9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX2xkcF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXBfbGRwX2RlZmNvbmZpZwppbmRleCA5NDhhMjEyLi5iNzdkMDU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXBfbGRwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfbGRwX2RlZmNvbmZpZwpAQCAtMzE2LDcgKzMxNiw4MiBAQAogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAogQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15Ci0jIENPTkZJR19ORVQgaXMgbm90IHNldAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9eQorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX01JR1JBVEU9eQorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19ORVRfS0VZX01JR1JBVEU9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTMzMiw2ICs0MDcsOCBAQAogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CitDT05GSUdfQ09OTkVDVE9SPXkKK0NPTkZJR19QUk9DX0VWRU5UUz15CiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVj15CkBAIC0zOTAsNiArNDY3LDU0IEBACiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKK0NPTkZJR19TTUM5MTFYPXkKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfTkVUREVWXzEwMDAwPXkKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAogCiAjCiAjIElucHV0IGRldmljZSBzdXBwb3J0CkBAIC04MTYsNiArOTQxLDI3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQUNMX1NVUFBPUlQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3BpY290dXgyMDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9waWNvdHV4MjAwX2RlZmNvbmZpZwppbmRleCAxNDgyNmYwLi41OWU0NDYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3BpY290dXgyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcGljb3R1eDIwMF9kZWZjb25maWcKQEAgLTEwNjksOSArMTA2OSw5IEBACiAjCiAjIFJUQyBpbnRlcmZhY2VzCiAjCi1DT05GSUdfUlRDX0lOVEZfU1lTRlM9bQotQ09ORklHX1JUQ19JTlRGX1BST0M9bQotQ09ORklHX1JUQ19JTlRGX0RFVj1tCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CiAjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3LXNtcF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3LXNtcF9kZWZjb25maWcKaW5kZXggMGMwOWIyMy4uY2QyOTgyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlldy1zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcmVhbHZpZXctc21wX2RlZmNvbmZpZwpAQCAtMSw4NCArMSwxMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzMKLSMgV2VkIE9jdCAyNSAxNDoxMjowMCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCisjIE1vbiBOb3YgMTAgMTQ6NDE6NDcgMjAwOAogIwogQ09ORklHX0FSTT15Ci0jIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKIENPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIyBHZW5lcmFsIHNldHVwCiAjCiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKIENPTkZJR19MT0NLX0tFUk5FTD15CiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVVNFVFMgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKLSMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CiBDT05GSUdfU1RPUF9NQUNISU5FPXkKLQotIwotIyBCbG9jayBsYXllcgotIwogQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTIsNiArMTE5LDggQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJkZWFkbGluZSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBTeXN0ZW0gVHlwZQpAQCAtMTAzLDE5ICsxMzIsMjYgQEAKICMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKQEAgLTEyMywxMyArMTU5LDI5IEBACiAjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIwogCiAjCiAjIFJlYWxWaWV3IHBsYXRmb3JtIHR5cGUKICMKIENPTkZJR19NQUNIX1JFQUxWSUVXX0VCPXkKLUNPTkZJR19SRUFMVklFV19NUENPUkU9eQorIyBDT05GSUdfUkVBTFZJRVdfRUJfQTlNUCBpcyBub3Qgc2V0CitDT05GSUdfUkVBTFZJRVdfRUJfQVJNMTFNUD15CisjIENPTkZJR19SRUFMVklFV19FQl9BUk0xMU1QX1JFVkIgaXMgbm90IHNldAorQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMU1QPXkKKyMgQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMTc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCBpcyBub3Qgc2V0CitDT05GSUdfUkVBTFZJRVdfSElHSF9QSFlTX09GRlNFVD15CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEzOCwxMiArMTkwLDE1IEBACiAjIENPTkZJR19DUFVfQVJNOTI2VCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1Y2PXkKIENPTkZJR19DUFVfMzJ2Nks9eQorIyBDT05GSUdfQ1BVX1Y3IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfMzJ2Nj15CiBDT05GSUdfQ1BVX0FCUlRfRVY2PXkKK0NPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKIENPTkZJR19DUFVfQ0FDSEVfVjY9eQogQ09ORklHX0NQVV9DQUNIRV9WSVBUPXkKIENPTkZJR19DUFVfQ09QWV9WNj15CiBDT05GSUdfQ1BVX1RMQl9WNj15CitDT05GSUdfQ1BVX0hBU19BU0lEPXkKIENPTkZJR19DUFVfQ1AxNT15CiBDT05GSUdfQ1BVX0NQMTVfTU1VPXkKIApAQCAtMTUzLDkgKzIwOCwxMCBAQAogQ09ORklHX0FSTV9USFVNQj15CiAjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKIENPTkZJR19IQVNfVExTX1JFRz15CitDT05GSUdfT1VURVJfQ0FDSEU9eQorQ09ORklHX0NBQ0hFX0wyWDA9eQogQ09ORklHX0FSTV9HSUM9eQogQ09ORklHX0lDU1QzMDc9eQogCkBAIC0xNjMsMzIgKzIxOSw0NCBAQAogIyBCdXMgc3VwcG9ydAogIwogQ09ORklHX0FSTV9BTUJBPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIworIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIENPTkZJR19TTVA9eQorQ09ORklHX1ZNU1BMSVRfM0c9eQorIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CisjIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCiBDT05GSUdfTlJfQ1BVUz00CiBDT05GSUdfSE9UUExVR19DUFU9eQogQ09ORklHX0xPQ0FMX1RJTUVSUz15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKLSMgQ09ORklHX0FFQUJJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fSEFTX0hPTEVTPXkKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CiAKICMKQEAgLTE5OCw2ICsyNjYsMTIgQEAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MAogQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xMC4xLjY5LjM6L3dvcmsvbmZzcm9vdCBpcD1kaGNwIGNvbnNvbGU9dHR5QU1BMCBtZW09MTI4TSIKICMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CiAKICMKICMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCkBAIC0yMDYsOCArMjgwLDcgQEAKICMKICMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCiAjCi1DT05GSUdfRlBFX05XRlBFPXkKLSMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAogIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAogQ09ORklHX1ZGUD15CiAKQEAgLTIxNSwyOCArMjg4LDI5IEBACiAjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQU9VVD15CiAjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19ORVQ9eQogCiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMjU1LDM2ICszMjksMjUgQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtMjk0LDEwICszNTcsNiBAQAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogCiAjCkBAIC0zMDUsOSArMzY0LDE0IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTMxNiwzOCArMzgwLDM3IEBACiAjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAogIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAogCiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCkBAIC0zNzMsNyArNDM2LDYgQEAKICMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CiAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwpAQCAtMzk3LDExNSArNDU5LDczIEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKLQotIwotIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCitDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIworIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKKyMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAogQ09ORklHX1NNQzkxWD15CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorQ09ORklHX1NNQzkxMVg9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKIAogIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIyBXaXJlbGVzcyBMQU4KICMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKICMgQ09ORklHX0lTRE4gaXMgbm90IHNldAogCiAjCkBAIC01MTMsNiArNTMzLDcgQEAKICMKIENPTkZJR19JTlBVVD15CiAjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTUyMiw3ICs1NDMsNiBAQAogQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKIENPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKICMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKQEAgLTUzOCw5ICs1NTgsMTYgQEAKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15CiBDT05GSUdfTU9VU0VfUFMyPXkKK0NPTkZJR19NT1VTRV9QUzJfQUxQUz15CitDT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15CitDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15CitDT05GSUdfTU9VU0VfUFMyX0xJRkVCT09LPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC01NTgsOSArNTg1LDExIEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKICMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC01NzksOTcgKzYwOCw5MSBAQAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgotCi0jCi0jIElQTUkKLSMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAjCi0jIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAogCiAjCi0jIExFRCBkZXZpY2VzCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKIAogIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CiAjCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiBDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCiBDT05GSUdfRkJfQVJNQ0xDRD15CiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CkBAIC02NzcsMjggKzcwMCwxNyBAQAogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQogQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKIENPTkZJR19GT05UXzh4OD15CiBDT05GSUdfRk9OVF84eDE2PXkKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKIENPTkZJR19MT0dPPXkKICMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPXkKLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPXkKIENPTkZJR19TTkRfVElNRVI9eQogQ09ORklHX1NORF9QQ009eQpAQCAtNzEyLDEwMCArNzI0LDY1IEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIwotQ09ORklHX1NORF9BQzk3X0NPREVDPW0KLUNPTkZJR19TTkRfQUM5N19CVVM9bQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBBTFNBIEFSTSBkZXZpY2VzCi0jCi1DT05GSUdfU05EX0FSTUFBQ0k9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCitDT05GSUdfU05EX1ZNQVNURVI9eQorQ09ORklHX1NORF9BQzk3X0NPREVDPXkKKyMgQ09ORklHX1NORF9EUklWRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQVJNPXkKK0NPTkZJR19TTkRfQVJNQUFDST15CisjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCitDT05GSUdfQUM5N19CVVM9eQorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX01NQz15CiAjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycworIwogQ09ORklHX01NQ19CTE9DSz15CitDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CisjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCiBDT05GSUdfTU1DX0FSTU1NQ0k9eQotIyBDT05GSUdfTU1DX1RJRk1fU0QgaXMgbm90IHNldAotCi0jCi0jIFJlYWwgVGltZSBDbG9jawotIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0hDVE9TWVM9eQotQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKLSMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAKICMKLSMgUlRDIGludGVyZmFjZXMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCiAjCi1DT05GSUdfUlRDX0lOVEZfU1lTRlM9eQotQ09ORklHX1JUQ19JTlRGX1BST0M9eQotQ09ORklHX1JUQ19JTlRGX0RFVj15Ci1DT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMPXkKLQotIwotIyBSVEMgZHJpdmVycwotIwotIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAotQ09ORklHX1JUQ19EUlZfUEwwMzE9eQotIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKLSMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtODMxLDExICs4MDgsMTEgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTg0OCwyOSArODI1LDI4IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JBTUZTPXkKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC04NzgsMTcgKzg1NCwxMiBAQAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKICMKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwogQ09ORklHX05MUz15CiBDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKQEAgLTkyOSw2NCArOTAwLDE3NyBAQAogIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19TUElOTE9DSz15Ci1DT05GSUdfREVCVUdfTVVURVhFUz15Ci1DT05GSUdfREVCVUdfUldTRU1TPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAotQ09ORklHX0ZPUkNFRF9JTkxJTklORz15Ci0jIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTk9QX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogQ09ORklHX0RFQlVHX0VSUk9SUz15Ci1DT05GSUdfREVCVUdfTEw9eQotIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CiAKICMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKIENPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvcmVhbHZpZXdfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcKaW5kZXggOTA3ZTU0My4uN2UyNTNmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcKQEAgLTEsMTA1ICsxLDIwNCBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE0LXJjMgotIyBUaHUgU2VwIDI5IDE0OjUwOjEwIDIwMDUKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMgTW9uIE5vdiAxMCAxNDozOTo0OCAyMDA4CiAjCiBDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CisjIENPTkZJR19HRU5FUklDX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiBDT05GSUdfTU1VPXkKLUNPTkZJR19VSUQxNj15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLSMgQ09ORklHX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0Ci1DT05GSUdfQ0xFQU5fQ09NUElMRT15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwogIyBHZW5lcmFsIHNldHVwCiAjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CitDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMgSU8gU2NoZWR1bGVycwogIwotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImRlYWRsaW5lIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIFN5c3RlbSBUeXBlCiAjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SRUFMVklFVz15CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9SRUFMVklFVz15Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKIAogIwogIyBSZWFsVmlldyBwbGF0Zm9ybSB0eXBlCiAjCiBDT05GSUdfTUFDSF9SRUFMVklFV19FQj15CisjIENPTkZJR19SRUFMVklFV19FQl9BOU1QIGlzIG5vdCBzZXQKK0NPTkZJR19SRUFMVklFV19FQl9BUk0xMU1QPXkKKyMgQ09ORklHX1JFQUxWSUVXX0VCX0FSTTExTVBfUkVWQiBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9SRUFMVklFV19QQjExTVA9eQorQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMTc2PXkKKyMgQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKICMKIENPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9BUk05MjZUPXkKLSMgQ09ORklHX0NQVV9WNiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVXzMydjU9eQotQ09ORklHX0NQVV9BQlJUX0VWNVRKPXkKLUNPTkZJR19DUFVfQ0FDSEVfVklWVD15Ci1DT05GSUdfQ1BVX0NPUFlfVjRXQj15Ci1DT05GSUdfQ1BVX1RMQl9WNFdCST15CisjIENPTkZJR19DUFVfQVJNOTI2VCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX1Y2PXkKKyMgQ09ORklHX0NQVV8zMnY2SyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfVjcgaXMgbm90IHNldAorQ09ORklHX0NQVV8zMnY2PXkKK0NPTkZJR19DUFVfQUJSVF9FVjY9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WNj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQ9eQorQ09ORklHX0NQVV9DT1BZX1Y2PXkKK0NPTkZJR19DUFVfVExCX1Y2PXkKK0NPTkZJR19DUFVfSEFTX0FTSUQ9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQogCiAjCiAjIFByb2Nlc3NvciBGZWF0dXJlcwpAQCAtMTA3LDggKzIwNiw5IEBACiBDT05GSUdfQVJNX1RIVU1CPXkKICMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19PVVRFUl9DQUNIRT15CitDT05GSUdfQ0FDSEVfTDJYMD15CiBDT05GSUdfQVJNX0dJQz15CiBDT05GSUdfSUNTVDMwNz15CiAKQEAgLTExNiwyMCArMjE2LDQxIEBACiAjIEJ1cyBzdXBwb3J0CiAjCiBDT05GSUdfQVJNX0FNQkE9eQotQ09ORklHX0lTQV9ETUFfQVBJPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIwotIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorQ09ORklHX1ZNU1BMSVRfM0c9eQorIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CisjIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKK0NPTkZJR19BRUFCST15CitDT05GSUdfT0FCSV9DT01QQVQ9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIAogIwpAQCAtMTM5LDYgKzI2MCwxMiBAQAogQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCiBDT05GSUdfQ01ETElORT0icm9vdD0vZGV2L25mcyBuZnNyb290PTEwLjEuNjkuMzovd29yay9uZnNyb290IGlwPWRoY3AgY29uc29sZT10dHlBTUEwIG1lbT0xMjhNIgogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKIAogIwogIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KQEAgLTE0NywyNiArMjc0LDI0IEBACiAjCiAjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAogIwotQ09ORklHX0ZQRV9OV0ZQRT15Ci0jIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAotIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9OV0ZQRSBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CitDT05GSUdfVkZQPXkKIAogIwogIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQogIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0xNzUsNiArMzAwLDExIEBACiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0xODYsMzQgKzMxNiw1NiBAQAogIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAogIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayB0ZXN0aW5nCiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTIyMiwzMCArMzc0LDM3IEBACiAjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCiAjCiBDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldAogIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CiAKICMKICMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKQEAgLTI2Niw3ICs0MjUsNiBAQAogIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CiBDT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfQU1EU1REX1JFVFJZPTAKICMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NGSV9VVElMPXkKICMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldApAQCAtMjc5LDcgKzQzNyw2IEBACiAjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SPXkKLSMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwpAQCAtMjg4LDcgKzQ0NSw3IEBACiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKIAogIwogIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKQEAgLTI5NiwxMjEgKzQ1Myw4MSBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCitDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci0jIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLSMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIworIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwogQ09ORklHX05FVERFVklDRVM9eQogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIworIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKKyMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAogQ09ORklHX1NNQzkxWD15CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorQ09ORklHX1NNQzkxMVg9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKIAogIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIyBXaXJlbGVzcyBMQU4KICMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTQyMCw3ICs1MzcsNiBAQAogQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKIENPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKICMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKQEAgLTQzMywxMSArNTQ5LDE5IEBACiAjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX01PVVNFPXkKIENPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfTElGRUJPT0s9eQorQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTQ1NSw4ICs1NzksMTEgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ3NSw3MyArNjAyLDkxIEBACiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTE2Ci0KLSMKLSMgSVBNSQotIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQogIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAogCiAjCi0jIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogCiAjCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKICMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiBDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLUNPTkZJR19GQl9TT0ZUX0NVUlNPUj15CisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIwogQ09ORklHX0ZCX0FSTUNMQ0Q9eQogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydApAQCAtNTQ5LDI3ICs2OTQsMTcgQEAKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CiBDT05GSUdfRk9OVF84eDg9eQogQ09ORklHX0ZPTlRfOHgxNj15Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD15Ci0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCitDT05GSUdfU09VTkRfT1NTX0NPUkU9eQogQ09ORklHX1NORD15CiBDT05GSUdfU05EX1RJTUVSPXkKIENPTkZJR19TTkRfUENNPXkKQEAgLTU3Nyw1OSArNzEyLDcxIEBACiBDT05GSUdfU05EX09TU0VNVUw9eQogQ09ORklHX1NORF9NSVhFUl9PU1M9eQogQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBBTFNBIEFSTSBkZXZpY2VzCi0jCi0jIENPTkZJR19TTkRfQVJNQUFDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKK0NPTkZJR19TTkRfVk1BU1RFUj15CitDT05GSUdfU05EX0FDOTdfQ09ERUM9eQorIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAorQ09ORklHX1NORF9BUk09eQorQ09ORklHX1NORF9BUk1BQUNJPXkKKyMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorQ09ORklHX0FDOTdfQlVTPXkKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKIAogIwotIyBVU0Igc3VwcG9ydAorIyBNTUMvU0QvU0RJTyBDYXJkIERyaXZlcnMKICMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgVVNCIEdhZGdldCBTdXBwb3J0CisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQVJNTU1DST15CisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAKICMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAorIyBWb2x0YWdlIGFuZCBDdXJyZW50IHJlZ3VsYXRvcnMKICMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC02NTQsNTEgKzgwMSw1OSBAQAogIyBQc2V1ZG8gZmlsZXN5c3RlbXMKICMKIENPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci0jIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCiAjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX0NSQU1GUz15CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKIENPTkZJR19OTFM9eQogQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CkBAIC03MzksMjYgKzg5NCw3MSBAQAogIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKIENPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTk9QX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQogQ09ORklHX0RFQlVHX0VSUk9SUz15CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CiAKICMKQEAgLTc2NiwyMSArOTY2LDEwNiBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQogCiAjCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCiAjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3MzYzY0MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zM2M2NDAwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNjMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zM2M2NDAwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg0NSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMworIyBNb24gTm92ICAzIDEwOjEwOjMwIDIwMDgKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMgaXMgbm90IHNldAorQ09ORklHX01NVT15CitDT05GSUdfTk9fSU9QT1JUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CisjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CitDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkQ9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfTFNGPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05TOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xPS0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1MzQzY0WFg9eQorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CitDT05GSUdfUExBVF9TM0M2NFhYPXkKK0NPTkZJR19DUFVfUzNDNjQwMF9JTklUPXkKK0NPTkZJR19DUFVfUzNDNjQwMF9DTE9DSz15CitDT05GSUdfUzNDNjRYWF9TRVRVUF9JMkMwPXkKK0NPTkZJR19TM0M2NFhYX1NFVFVQX0kyQzE9eQorQ09ORklHX1BMQVRfUzNDPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19TM0NfQk9PVF9FUlJPUl9SRVNFVD15CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQ9MAorQ09ORklHX1MzQ19HUElPX1NQQUNFPTAKK0NPTkZJR19TM0NfR1BJT19UUkFDSz15CitDT05GSUdfUzNDX0dQSU9fUFVMTF9VUERPV049eQorQ09ORklHX1MzQ19HUElPX0NGR19TM0MyNFhYPXkKK0NPTkZJR19TM0NfR1BJT19DRkdfUzNDNjRYWD15CitDT05GSUdfUzNDX0RFVl9IU01NQz15CitDT05GSUdfUzNDX0RFVl9IU01NQzE9eQorQ09ORklHX1MzQ19ERVZfSTJDMT15CitDT05GSUdfQ1BVX1MzQzY0MTA9eQorQ09ORklHX1MzQzY0MTBfU0VUVVBfU0RIQ0k9eQorQ09ORklHX01BQ0hfU01ESzY0MTA9eQorQ09ORklHX1NNREs2NDEwX1NEX0NIMD15CisjIENPTkZJR19TTURLNjQxMF9TRF9DSDEgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfVjY9eQorQ09ORklHX0NQVV8zMnY2Sz15CitDT05GSUdfQ1BVXzMydjY9eQorQ09ORklHX0NQVV9BQlJUX0VWNj15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1Y2PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjY9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAorQ09ORklHX0FSTV9WSUM9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1ZNU1BMSVRfM0c9eQorIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CisjIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKK0NPTkZJR19BRUFCST15CitDT05GSUdfT0FCSV9DT01QQVQ9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MAorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0FDMCwxMTUyMDAgcm9vdD0vZGV2L3JhbSBpbml0PS9iaW4vYmFzaCBpbml0cmQ9MHg1MTAwMDAwMCw0TSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorQ09ORklHX1ZGUD15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKK0NPTkZJR19NT1VTRV9QUzJfQUxQUz15CitDT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15CitDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15CitDT05GSUdfTU9VU0VfUFMyX0xJRkVCT09LPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TQU1TVU5HPXkKK0NPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUz00CisjIENPTkZJR19TRVJJQUxfU0FNU1VOR19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX1NBTVNVTkdfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1MzQzY0MDA9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUzNDMjQxMD15CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorQ09ORklHX0FUMjQ9eQorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CisjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fU1lTRlMgaXMgbm90IHNldAorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX0FTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKK0NPTkZJR19ISURfREVCVUc9eQorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKKyMgQ09ORklHX0hJRF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKKyMKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19ERUJVRz15CitDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUU9eQorCisjCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycworIworQ09ORklHX01NQ19CTE9DSz15CitDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CitDT05GSUdfU0RJT19VQVJUPXkKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX01NQ19TREhDST15CitDT05GSUdfTU1DX1NESENJX1MzQz15CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBWb2x0YWdlIGFuZCBDdXJyZW50IHJlZ3VsYXRvcnMKKyMKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CitDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0FDTD15CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPXkKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQorQ09ORklHX0RFQlVHX1BJX0xJU1Q9eQorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorCisjCisjIFRyYWNlcnMKKyMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19VU0VSPXkKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfUzNDX1BPUlQ9eQorQ09ORklHX0RFQlVHX1MzQ19VQVJUPTAKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy93OTBwOTEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvdzkwcDkxMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvdzkwcDkxMF9kZWZjb25maWcKQEAgLTAsMCArMSw2MjYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzgtZ2l0OAorIyBTYXQgTm92IDE1IDEwOjA1OjAwIDIwMDgKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKKyMgQ09ORklHX05PX0lPUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVD15CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1VTRVJfTlM9eQorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19CTE9DSz15CitDT05GSUdfTEJEPXkKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKK0NPTkZJR19MU0Y9eQorQ09ORklHX0JMS19ERVZfQlNHPXkKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVNNN1gwMEEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfVzkwWDkwMD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworQ09ORklHX0NQVV9XOTBQOTEwPXkKKworIworIyBXOTBQOTEwIE1hY2hpbmVzCisjCitDT05GSUdfTUFDSF9XOTBQOTEwRVZCPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX0FSTTkyNlQ9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUSj15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCisjIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0haPTEwMAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0hBU19IT0xFUz15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9yYW0wIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggaW5pdHJkPTB4YTAwMDAwLDQwMDAwMDAgbWVtPTY0TSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19BVEFHU19QUk9DPXkKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9XOTBYOTAwPXkKKyMgQ09ORklHX1NFUklBTF9XOTBYOTAwX1BPUlQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9XOTBYOTAwX1BPUlQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9XOTBYOTAwX1BPUlQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9XOTBYOTAwX1BPUlQ0IGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfVzkwWDkwMF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0FDTD15CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ST01GU19GUz15CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IGRlNmM1OWYuLjZjYmQ4ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTEwLDExICsxMCwxMSBAQAogI2lmbmRlZiBfQVNNQVJNX0NBQ0hFRkxVU0hfSAogI2RlZmluZSBfQVNNQVJNX0NBQ0hFRkxVU0hfSAogCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL2dsdWUuaD4KICNpbmNsdWRlIDxhc20vc2htcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGV0eXBlLmg+CiAKICNkZWZpbmUgQ0FDSEVfQ09MT1VSKHZhZGRyKQkoKHZhZGRyICYgKFNITUxCQSAtIDEpKSA+PiBQQUdFX1NISUZUKQogCkBAIC0yOTYsMTYgKzI5Niw2IEBACiAjZW5kaWYKIAogLyoKLSAqIGZsdXNoX2NhY2hlX3ZtYXAoKSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgbWFwcGluZ3MgKGVnLCB2aWEgdm1hcCwKLSAqIHZtYWxsb2MsIGlvcmVtYXAgZXRjKSBpbiBrZXJuZWwgc3BhY2UgZm9yIHBhZ2VzLiAgU2luY2UgdGhlCi0gKiBkaXJlY3QtbWFwcGluZ3Mgb2YgdGhlc2UgcGFnZXMgbWF5IGNvbnRhaW4gY2FjaGVkIGRhdGEsIHdlIG5lZWQKLSAqIHRvIGRvIGEgZnVsbCBjYWNoZSBmbHVzaCB0byBlbnN1cmUgdGhhdCB3cml0ZWJhY2tzIGRvbid0IGNvcnJ1cHQKLSAqIGRhdGEgcGxhY2VkIGludG8gdGhlc2UgcGFnZXMgdmlhIHRoZSBuZXcgbWFwcGluZ3MuCi0gKi8KLSNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCwgZW5kKQkJZmx1c2hfY2FjaGVfYWxsKCkKLSNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LCBlbmQpCQlmbHVzaF9jYWNoZV9hbGwoKQotCi0vKgogICogQ29weSB1c2VyIGRhdGEgZnJvbS90byBhIHBhZ2Ugd2hpY2ggaXMgbWFwcGVkIGludG8gYSBkaWZmZXJlbnQKICAqIHByb2Nlc3NlcyBhZGRyZXNzIHNwYWNlLiAgUmVhbGx5LCB3ZSB3YW50IHRvIGFsbG93IG91ciAidXNlcgogICogc3BhY2UiIG1vZGVsIHRvIGhhbmRsZSB0aGlzLgpAQCAtNDQ0LDQgKzQzNCwyOSBAQAogCWRtYWNfaW52X3JhbmdlKHN0YXJ0LCBzdGFydCArIHNpemUpOwogfQogCisvKgorICogZmx1c2hfY2FjaGVfdm1hcCgpIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBtYXBwaW5ncyAoZWcsIHZpYSB2bWFwLAorICogdm1hbGxvYywgaW9yZW1hcCBldGMpIGluIGtlcm5lbCBzcGFjZSBmb3IgcGFnZXMuICBPbiBub24tVklQVAorICogY2FjaGVzLCBzaW5jZSB0aGUgZGlyZWN0LW1hcHBpbmdzIG9mIHRoZXNlIHBhZ2VzIG1heSBjb250YWluIGNhY2hlZAorICogZGF0YSwgd2UgbmVlZCB0byBkbyBhIGZ1bGwgY2FjaGUgZmx1c2ggdG8gZW5zdXJlIHRoYXQgd3JpdGViYWNrcworICogZG9uJ3QgY29ycnVwdCBkYXRhIHBsYWNlZCBpbnRvIHRoZXNlIHBhZ2VzIHZpYSB0aGUgbmV3IG1hcHBpbmdzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGVfdm1hcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpZiAoIWNhY2hlX2lzX3ZpcHRfbm9uYWxpYXNpbmcoKSkKKwkJZmx1c2hfY2FjaGVfYWxsKCk7CisJZWxzZQorCQkvKgorCQkgKiBzZXRfcHRlX2F0KCkgY2FsbGVkIGZyb20gdm1hcF9wdGVfcmFuZ2UoKSBkb2VzIG5vdAorCQkgKiBoYXZlIGEgRFNCIGFmdGVyIGNsZWFuaW5nIHRoZSBjYWNoZSBsaW5lLgorCQkgKi8KKwkJZHNiKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV92dW5tYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKCFjYWNoZV9pc192aXB0X25vbmFsaWFzaW5nKCkpCisJCWZsdXNoX2NhY2hlX2FsbCgpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Nsa2Rldi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xrZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Nsa2Rldi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAgYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xrZGV2LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEhlbHBlciBmb3IgdGhlIGNsayBBUEkgdG8gYXNzaXN0IGxvb2tpbmcgdXAgYSBzdHJ1Y3QgY2xrLgorICovCisjaWZuZGVmIF9fQVNNX0NMS0RFVl9ICisjZGVmaW5lIF9fQVNNX0NMS0RFVl9ICisKK3N0cnVjdCBjbGs7CisKK3N0cnVjdCBjbGtfbG9va3VwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJY29uc3QgY2hhcgkJKmRldl9pZDsKKwljb25zdCBjaGFyCQkqY29uX2lkOworCXN0cnVjdCBjbGsJCSpjbGs7Cit9OworCitzdHJ1Y3QgY2xrX2xvb2t1cCAqY2xrZGV2X2FsbG9jKHN0cnVjdCBjbGsgKmNsaywgY29uc3QgY2hhciAqY29uX2lkLAorCWNvbnN0IGNoYXIgKmRldl9mbXQsIC4uLik7CisKK3ZvaWQgY2xrZGV2X2FkZChzdHJ1Y3QgY2xrX2xvb2t1cCAqY2wpOwordm9pZCBjbGtkZXZfZHJvcChzdHJ1Y3QgY2xrX2xvb2t1cCAqY2wpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IDRlZDE0OWMuLjIyY2IxNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtNjksNyArNjksOSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCiB7Ci0JcmV0dXJuIGRldi0+ZG1hX21hc2sgJiYgKmRldi0+ZG1hX21hc2sgIT0gMDsKKwlpZiAobWFzayA8IElTQV9ETUFfVEhSRVNIT0xEKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEuaAppbmRleCA3NTE1NGIxLi5kZjU2MzhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEuaApAQCAtMSwxMiArMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9ETUFfSAogI2RlZmluZSBfX0FTTV9BUk1fRE1BX0gKIAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZG1hY2hfdDsKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCiAvKgogICogVGhpcyBpcyB0aGUgbWF4aW11bSB2aXJ0dWFsIGFkZHJlc3Mgd2hpY2ggY2FuIGJlIERNQSdkIGZyb20uCkBAIC0xNSw2ICsxMCwxOSBAQAogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJMHhmZmZmZmZmZgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfSVNBX0RNQV9BUEkKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBkcml2ZXJzIHdyaXR0ZW4gZm9yIHRoZSB4ODYgSVNBIERNQSBBUEkuCisgKiBJdCBzaG91bGQgbm90IGJlIHJlLXVzZWQgZXhjZXB0IGZvciB0aGF0IHB1cnBvc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZG1hY2hfdDsKKworI2luY2x1ZGUgPG1hY2gvaXNhLWRtYS5oPgorCiAvKgogICogRE1BIG1vZGVzCiAgKi8KQEAgLTE0MCw0ICsxNDgsNiBAQAogI2RlZmluZSBpc2FfZG1hX2JyaWRnZV9idWdneSAgICAoMCkKICNlbmRpZgogCi0jZW5kaWYgLyogX0FSTV9ETUFfSCAqLworI2VuZGlmIC8qIENPTkZJR19JU0FfRE1BX0FQSSAqLworCisjZW5kaWYgLyogX19BU01fQVJNX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb21kLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb21kLmgKaW5kZXggOWM1YWZiZC4uZjllZTY5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9tZC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvbWQuaApAQCAtMzIsMTkgKzMyLDExIEBACiAjZGVmaW5lIElPTURfS0FSVFJYCSgweDAwNCkKICNkZWZpbmUgSU9NRF9LQ1RSTAkoMHgwMDgpCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9DTFBTNzUwMAotI2RlZmluZSBJT01EX0lPTElORVMJKDB4MDBDKQotI2VuZGlmCi0KICNkZWZpbmUgSU9NRF9JUlFTVEFUQQkoMHgwMTApCiAjZGVmaW5lIElPTURfSVJRUkVRQQkoMHgwMTQpCiAjZGVmaW5lIElPTURfSVJRQ0xSQQkoMHgwMTQpCiAjZGVmaW5lIElPTURfSVJRTUFTS0EJKDB4MDE4KQogCi0jaWZkZWYgQ09ORklHX0FSQ0hfQ0xQUzc1MDAKLSNkZWZpbmUgSU9NRF9TVVNNT0RFCSgweDAxQykKLSNlbmRpZgotCiAjZGVmaW5lIElPTURfSVJRU1RBVEIJKDB4MDIwKQogI2RlZmluZSBJT01EX0lSUVJFUUIJKDB4MDI0KQogI2RlZmluZSBJT01EX0lSUU1BU0tCCSgweDAyOCkKQEAgLTUzLDEwICs0NSw2IEBACiAjZGVmaW5lIElPTURfRklRUkVRCSgweDAzNCkKICNkZWZpbmUgSU9NRF9GSVFNQVNLCSgweDAzOCkKIAotI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCi0jZGVmaW5lIElPTURfQ0xLQ1RMCSgweDAzQykKLSNlbmRpZgotCiAjZGVmaW5lIElPTURfVDBDTlRMCSgweDA0MCkKICNkZWZpbmUgSU9NRF9UMExUQ0hMCSgweDA0MCkKICNkZWZpbmUgSU9NRF9UMENOVEgJKDB4MDQ0KQpAQCAtNzEsMTggKzU5LDYgQEAKICNkZWZpbmUgSU9NRF9UMUdPCSgweDA1OCkKICNkZWZpbmUgSU9NRF9UMUxBVENICSgweDA1YykKIAotI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCi0jZGVmaW5lIElPTURfSVJRU1RBVEMJKDB4MDYwKQotI2RlZmluZSBJT01EX0lSUVJFUUMJKDB4MDY0KQotI2RlZmluZSBJT01EX0lSUU1BU0tDCSgweDA2OCkKLQotI2RlZmluZSBJT01EX1ZJRE1VWAkoMHgwNmMpCi0KLSNkZWZpbmUgSU9NRF9JUlFTVEFURAkoMHgwNzApCi0jZGVmaW5lIElPTURfSVJRUkVRRAkoMHgwNzQpCi0jZGVmaW5lIElPTURfSVJRTUFTS0QJKDB4MDc4KQotI2VuZGlmCi0KICNkZWZpbmUgSU9NRF9ST01DUjAJKDB4MDgwKQogI2RlZmluZSBJT01EX1JPTUNSMQkoMHgwODQpCiAjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCkBAIC0xMDAsMTEgKzc2LDYgQEAKICNkZWZpbmUgSU9NRF9NT1VTRVkJKDB4MEE0KQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9DTFBTNzUwMAotI2RlZmluZSBJT01EX01TRURBVAkoMHgwQTgpCi0jZGVmaW5lIElPTURfTVNFQ1RMCSgweDBBYykKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCiAjZGVmaW5lIElPTURfRE1BVENSCSgweDBDMCkKICNlbmRpZgpAQCAtMTEzLDE4ICs4NCw2IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCiAjZGVmaW5lIElPTURfRE1BRVhUCSgweDBDQykKICNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCi0jZGVmaW5lIElPTURfQVNUQ1IJKDB4MENDKQotI2RlZmluZSBJT01EX0RSQU1DUgkoMHgwRDApCi0jZGVmaW5lIElPTURfU0VMRlJFRgkoMHgwRDQpCi0jZGVmaW5lIElPTURfQVRPRElDUgkoMHgwRTApCi0jZGVmaW5lIElPTURfQVRPRFNSCSgweDBFNCkKLSNkZWZpbmUgSU9NRF9BVE9EQ0MJKDB4MEU4KQotI2RlZmluZSBJT01EX0FUT0RDTlQxCSgweDBFQykKLSNkZWZpbmUgSU9NRF9BVE9EQ05UMgkoMHgwRjApCi0jZGVmaW5lIElPTURfQVRPRENOVDMJKDB4MEY0KQotI2RlZmluZSBJT01EX0FUT0RDTlQ0CSgweDBGOCkKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfUlBDCiAjZGVmaW5lIERNQV9FWFRfSU8wCTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3ZpYy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvdmljLmgKaW5kZXggMjYzZjJjMy4uZjg3MzI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvdmljLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvdmljLmgKQEAgLTI5LDE1ICsyOSwxNyBAQAogI2RlZmluZSBWSUNfSU5UX1NPRlQJCQkweDE4CiAjZGVmaW5lIFZJQ19JTlRfU09GVF9DTEVBUgkJMHgxYwogI2RlZmluZSBWSUNfUFJPVEVDVAkJCTB4MjAKLSNkZWZpbmUgVklDX1ZFQ1RfQUREUgkJCTB4MzAKLSNkZWZpbmUgVklDX0RFRl9WRUNUX0FERFIJCTB4MzQKKyNkZWZpbmUgVklDX1BMMTkwX1ZFQ1RfQUREUgkJMHgzMAkvKiBQTDE5MCBvbmx5ICovCisjZGVmaW5lIFZJQ19QTDE5MF9ERUZfVkVDVF9BRERSCQkweDM0CS8qIFBMMTkwIG9ubHkgKi8KIAotI2RlZmluZSBWSUNfVkVDVF9BRERSMAkJCTB4MTAwCS8qIDAgdG8gMTUgKi8KLSNkZWZpbmUgVklDX1ZFQ1RfQ05UTDAJCQkweDIwMAkvKiAwIHRvIDE1ICovCisjZGVmaW5lIFZJQ19WRUNUX0FERFIwCQkJMHgxMDAJLyogMCB0byAxNSAoMC4uMzEgUEwxOTIpICovCisjZGVmaW5lIFZJQ19WRUNUX0NOVEwwCQkJMHgyMDAJLyogMCB0byAxNSAoMC4uMzEgUEwxOTIpICovCiAjZGVmaW5lIFZJQ19JVENSCQkJMHgzMDAJLyogVklDIHRlc3QgY29udHJvbCByZWdpc3RlciAqLwogCiAjZGVmaW5lIFZJQ19WRUNUX0NOVExfRU5BQkxFCQkoMSA8PCA1KQogCisjZGVmaW5lIFZJQ19QTDE5Ml9WRUNUX0FERFIJCTB4RjAwCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiB2b2lkIHZpY19pbml0KHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgaW50IGlycV9zdGFydCwgdTMyIHZpY19zb3VyY2VzKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdjYXAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3Y2FwLmgKaW5kZXggODFmNGM4OS4uYmRhNDg5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdjYXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9od2NhcC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIEhXQ0FQX0lXTU1YVAk1MTIKICNkZWZpbmUgSFdDQVBfQ1JVTkNICTEwMjQKICNkZWZpbmUgSFdDQVBfVEhVTUJFRQkyMDQ4CisjZGVmaW5lIEhXQ0FQX05FT04JNDA5NgogCiAjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggYTgwOTQ0NS4uZDJhNTljZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9pby5oCkBAIC04MCw2ICs4MCwxNCBAQAogZXh0ZXJuIHZvaWQgX19yZWFkd3JpdGVfYnVnKGNvbnN0IGNoYXIgKmZuKTsKIAogLyoKKyAqIEEgdHlwZXNhZmUgX19pbygpIGhlbHBlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX190eXBlc2FmZV9pbyh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOworfQorCisvKgogICogTm93LCBwaWNrIHVwIHRoZSBtYWNoaW5lLWRlZmluZWQgSU8gZGVmaW5pdGlvbnMKICAqLwogI2luY2x1ZGUgPG1hY2gvaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggYTAwMDlhYS4uMzI4ZjE0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaXJxLmgKQEAgLTcsMTAgKzcsNiBAQAogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGkpCShpKQogI2VuZGlmCiAKLSNpZm5kZWYgTlJfSVJRUwotI2RlZmluZSBOUl9JUlFTCTEyOAotI2VuZGlmCi0KIC8qCiAgKiBVc2UgdGhpcyB2YWx1ZSB0byBpbmRpY2F0ZSBsYWNrIG9mIGludGVycnVwdAogICogY2FwYWJpbGl0eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAppbmRleCA3Nzc2NDMwLi4wMjAyYTdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMTEyLDEwICsxMTIsOCBAQAogICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lkZSBtZW1vcnkuaAogICogZmlsZXMuICBVc2UgdmlydF90b19waHlzL3BoeXNfdG9fdmlydC9fX3BhL19fdmEgaW5zdGVhZC4KICAqLwotI2lmbmRlZiBfX3ZpcnRfdG9fcGh5cwogI2RlZmluZSBfX3ZpcnRfdG9fcGh5cyh4KQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBQSFlTX09GRlNFVCkKICNkZWZpbmUgX19waHlzX3RvX3ZpcnQoeCkJKCh4KSAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCi0jZW5kaWYKIAogLyoKICAqIENvbnZlcnQgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgUGFnZSBGcmFtZSBOdW1iZXIgYW5kIGJhY2sKQEAgLTE4MCw2ICsxNzgsMTEgQEAKICAqIG1lbW9yeS4gIFVzZSBvZiB0aGVzZSBpcyAqZGVwcmVjYXRlZCogKGFuZCB0aGF0IGRvZXNuJ3QgbWVhbgogICogdXNlIHRoZSBfXyBwcmVmaXhlZCBmb3JtcyBpbnN0ZWFkLikgIFNlZSBkbWEtbWFwcGluZy5oLgogICovCisjaWZuZGVmIF9fdmlydF90b19idXMKKyNkZWZpbmUgX192aXJ0X3RvX2J1cwlfX3ZpcnRfdG9fcGh5cworI2RlZmluZSBfX2J1c190b192aXJ0CV9fcGh5c190b192aXJ0CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBfX2RlcHJlY2F0ZWQgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2lkICp4KQogewogCXJldHVybiBfX3ZpcnRfdG9fYnVzKCh1bnNpZ25lZCBsb25nKXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggMDU1OWYzNy4uMjYzZmVkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9NTVVfQ09OVEVYVF9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tdGQteGlwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tdGQteGlwLmgKaW5kZXggZDhmYmUyZC4uZDc5ZDY2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbXRkLXhpcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL210ZC14aXAuaApAQCAtMTUsNyArMTUsNiBAQAogI2lmbmRlZiBfX0FSTV9NVERfWElQX0hfXwogI2RlZmluZSBfX0FSTV9NVERfWElQX0hfXwogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbXRkLXhpcC5oPgogCiAvKiBmaWxsIGluc3RydWN0aW9uIHByZWZldGNoICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggYmVkMWMwYS4uZjM0MWM5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTA4LDMyICsxMDgsMzggQEAKICNlcnJvciBVbmtub3duIHVzZXIgb3BlcmF0aW9ucyBtb2RlbAogI2VuZGlmCiAKK3N0cnVjdCBwYWdlOworCiBzdHJ1Y3QgY3B1X3VzZXJfZm5zIHsKLQl2b2lkICgqY3B1X2NsZWFyX3VzZXJfcGFnZSkodm9pZCAqcCwgdW5zaWduZWQgbG9uZyB1c2VyKTsKLQl2b2lkICgqY3B1X2NvcHlfdXNlcl9wYWdlKSh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKLQkJCQkgICB1bnNpZ25lZCBsb25nIHVzZXIpOworCXZvaWQgKCpjcHVfY2xlYXJfdXNlcl9oaWdocGFnZSkoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpOworCXZvaWQgKCpjcHVfY29weV91c2VyX2hpZ2hwYWdlKShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCQkJdW5zaWduZWQgbG9uZyB2YWRkcik7CiB9OwogCiAjaWZkZWYgTVVMVElfVVNFUgogZXh0ZXJuIHN0cnVjdCBjcHVfdXNlcl9mbnMgY3B1X3VzZXI7CiAKLSNkZWZpbmUgX19jcHVfY2xlYXJfdXNlcl9wYWdlCWNwdV91c2VyLmNwdV9jbGVhcl91c2VyX3BhZ2UKLSNkZWZpbmUgX19jcHVfY29weV91c2VyX3BhZ2UJY3B1X3VzZXIuY3B1X2NvcHlfdXNlcl9wYWdlCisjZGVmaW5lIF9fY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UJY3B1X3VzZXIuY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UKKyNkZWZpbmUgX19jcHVfY29weV91c2VyX2hpZ2hwYWdlCWNwdV91c2VyLmNwdV9jb3B5X3VzZXJfaGlnaHBhZ2UKIAogI2Vsc2UKIAotI2RlZmluZSBfX2NwdV9jbGVhcl91c2VyX3BhZ2UJX19nbHVlKF9VU0VSLF9jbGVhcl91c2VyX3BhZ2UpCi0jZGVmaW5lIF9fY3B1X2NvcHlfdXNlcl9wYWdlCV9fZ2x1ZShfVVNFUixfY29weV91c2VyX3BhZ2UpCisjZGVmaW5lIF9fY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UJX19nbHVlKF9VU0VSLF9jbGVhcl91c2VyX2hpZ2hwYWdlKQorI2RlZmluZSBfX2NwdV9jb3B5X3VzZXJfaGlnaHBhZ2UJX19nbHVlKF9VU0VSLF9jb3B5X3VzZXJfaGlnaHBhZ2UpCiAKLWV4dGVybiB2b2lkIF9fY3B1X2NsZWFyX3VzZXJfcGFnZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHVzZXIpOwotZXh0ZXJuIHZvaWQgX19jcHVfY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCi0JCQkJIHVuc2lnbmVkIGxvbmcgdXNlcik7CitleHRlcm4gdm9pZCBfX2NwdV9jbGVhcl91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyKTsKK2V4dGVybiB2b2lkIF9fY3B1X2NvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCQkJdW5zaWduZWQgbG9uZyB2YWRkcik7CiAjZW5kaWYKIAotI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UoYWRkcix2YWRkcixwZykJIF9fY3B1X2NsZWFyX3VzZXJfcGFnZShhZGRyLCB2YWRkcikKLSNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sZnJvbSx2YWRkcixwZykgX19jcHVfY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyKQorI2RlZmluZSBjbGVhcl91c2VyX2hpZ2hwYWdlKHBhZ2UsdmFkZHIpCQlcCisJIF9fY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgdmFkZHIpCiAKLSNkZWZpbmUgY2xlYXJfcGFnZShwYWdlKQltZW16ZXJvKCh2b2lkICopKHBhZ2UpLCBQQUdFX1NJWkUpCisjZGVmaW5lIF9fSEFWRV9BUkNIX0NPUFlfVVNFUl9ISUdIUEFHRQorI2RlZmluZSBjb3B5X3VzZXJfaGlnaHBhZ2UodG8sZnJvbSx2YWRkcix2bWEpCVwKKwlfX2NwdV9jb3B5X3VzZXJfaGlnaHBhZ2UodG8sIGZyb20sIHZhZGRyKQorCisjZGVmaW5lIGNsZWFyX3BhZ2UocGFnZSkJbWVtc2V0KCh2b2lkICopKHBhZ2UpLCAwLCBQQUdFX1NJWkUpCiBleHRlcm4gdm9pZCBjb3B5X3BhZ2Uodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20pOwogCiAjdW5kZWYgU1RSSUNUX01NX1RZUEVDSEVDS1MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNmZmMzM3OS4uMTg0NTg5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTY0LDcgKzY0LDcgQEAKICh7CQkJCQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgKnN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilzcDsJCQlcCiAJc2V0X2ZzKFVTRVJfRFMpOwkJCQkJCVwKLQltZW16ZXJvKHJlZ3MtPnVyZWdzLCBzaXplb2YocmVncy0+dXJlZ3MpKTsJCQlcCisJbWVtc2V0KHJlZ3MtPnVyZWdzLCAwLCBzaXplb2YocmVncy0+dXJlZ3MpKTsJCQlcCiAJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9MSU1JVF8zMkJJVCkJCQlcCiAJCXJlZ3MtPkFSTV9jcHNyID0gVVNSX01PREU7CQkJCVwKIAllbHNlCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBhNjU0MTNiLi5mMmNkMThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTIwOSw5ICsyMDksMTEgQEAKIAlzdHJ1Y3QgbWVtYmFuayBiYW5rW05SX0JBTktTXTsKIH07CiAKK2V4dGVybiBzdHJ1Y3QgbWVtaW5mbyBtZW1pbmZvOworCiAjZGVmaW5lIGZvcl9lYWNoX25vZGViYW5rKGl0ZXIsbWksbm8pCQkJXAotCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBtaS0+bnJfYmFua3M7IGl0ZXIrKykJXAotCQlpZiAobWktPmJhbmtbaXRlcl0ubm9kZSA9PSBubykKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgKG1pKS0+bnJfYmFua3M7IGl0ZXIrKykJXAorCQlpZiAoKG1pKS0+YmFua1tpdGVyXS5ub2RlID09IG5vKQogCiAjZGVmaW5lIGJhbmtfcGZuX3N0YXJ0KGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCkKICNkZWZpbmUgYmFua19wZm5fZW5kKGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCArIChiYW5rKS0+c2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wLmgKaW5kZXggNzI3YjVjMC4uZmFkNzBkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wLmgKQEAgLTExNCw3ICsxMTQsNyBAQAogLyoKICAqIFN0b3AgYSBsb2NhbCB0aW1lciBpbnRlcnJ1cHQuCiAgKi8KLWV4dGVybiB2b2lkIGxvY2FsX3RpbWVyX3N0b3AodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBsb2NhbF90aW1lcl9zdG9wKHZvaWQpOwogCiAvKgogICogUGxhdGZvcm0gcHJvdmlkZXMgdGhpcyB0byBhY2tub3dsZWRnZSBhIGxvY2FsIHRpbWVyIElSUQpAQCAtMTIzLDcgKzEyMyw3IEBACiAKICNlbHNlCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF90aW1lcl9zdG9wKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfdGltZXJfc3RvcCh2b2lkKQogewogfQogCkBAIC0xMzIsNyArMTMyLDcgQEAKIC8qCiAgKiBTZXR1cCBhIGxvY2FsIHRpbWVyIGludGVycnVwdCBmb3IgYSBDUFUuCiAgKi8KLWV4dGVybiB2b2lkIGxvY2FsX3RpbWVyX3NldHVwKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHZvaWQgbG9jYWxfdGltZXJfc2V0dXAodm9pZCk7CiAKIC8qCiAgKiBzaG93IGxvY2FsIGludGVycnVwdCBpbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdHJpbmcuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N0cmluZy5oCmluZGV4IGU1MGM0YTMuLmNmNGYzYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N0cmluZy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N0cmluZy5oCkBAIC0yMSw3ICsyMSw2IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNIUgogZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLCBpbnQsIF9fa2VybmVsX3NpemVfdCk7CiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNWkVSTwogI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1TRVQKIGV4dGVybiB2b2lkICogbWVtc2V0KHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOwogCkBAIC0zOSwxMiArMzgsNCBAQAogCQkoX19wKTsJCQkJCQkJXAogCX0pCiAKLSNkZWZpbmUgbWVtemVybyhwLG4pIAkJCQkJCQlcCi0JKHsgCQkJCQkJCQlcCi0JIAl2b2lkICpfX3AgPSAocCk7IHNpemVfdCBfX24gPSBuOwkJCVwKLQkgCWlmICgoX19uKSAhPSAwKSAJCQkJCVwKLQkgCQlfX21lbXplcm8oKF9fcCksKF9fbikpOyAJCQlcCi0JIAkoX19wKTsgCQkJCQkJCVwKLQkgfSkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IDU2ODAyMGIuLjgxMWJlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0zLDggKzMsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotCiAjZGVmaW5lIENQVV9BUkNIX1VOS05PV04JMAogI2RlZmluZSBDUFVfQVJDSF9BUk12MwkJMQogI2RlZmluZSBDUFVfQVJDSF9BUk12NAkJMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGU5OGVjNjAuLjc4OTc0NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTExLDcgKzExLDggQEAKIC8qCiAgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS9kb21haW4uaD4KQEAgLTQwMCw3ICs0MDEsNyBAQAogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQogCQluID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CiAJZWxzZSAvKiBzZWN1cml0eSBob2xlIC0gcGx1ZyBpdCAqLwotCQltZW16ZXJvKHRvLCBuKTsKKwkJbWVtc2V0KHRvLCAwLCBuKTsKIAlyZXR1cm4gbjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwppbmRleCAyM2FmM2M5Li41MzFlMTg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwpAQCAtOCw2ICs4LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYwppbmRleCA2YzkwNDc5Li5jNjM4NDI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jCkBAIC05NSw3ICs5NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogcnVuIGZyb20ga3N0b3BfbWFjaGluZSAqLworLyogcnVuIGZyb20gZnRyYWNlX2luaXQgd2l0aCBpcnFzIGRpc2FibGVkICovCiBpbnQgX19pbml0IGZ0cmFjZV9keW5fYXJjaF9pbml0KHZvaWQgKmRhdGEpCiB7CiAJZnRyYWNlX21jb3VudF9zZXQoZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC1jb21tb24uUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLWNvbW1vbi5TCmluZGV4IGJkZTUyZGYuLjk5MTk1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLWNvbW1vbi5TCkBAIC0xOCw3ICsxOCw3IEBACiBfX3N3aXRjaF9kYXRhOgogCS5sb25nCV9fbW1hcF9zd2l0Y2hlZAogCS5sb25nCV9fZGF0YV9sb2MJCQlAIHI0Ci0JLmxvbmcJX19kYXRhX3N0YXJ0CQkJQCByNQorCS5sb25nCV9kYXRhCQkJCUAgcjUKIAkubG9uZwlfX2Jzc19zdGFydAkJCUAgcjYKIAkubG9uZwlfZW5kCQkJCUAgcjcKIAkubG9uZwlwcm9jZXNzb3JfaWQJCQlAIHI0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYjhkOTY1ZC4uZGFiNDhmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCiAvKgpAQCAtMjksOSArMzAsOCBAQAogICogTU9EVUxFU19WQUREUiBpcyByZWRlZmluZWQgaGVyZSBhbmQgbm90IGluIGFzbS9tZW1vcnkuaCB0byBhdm9pZAogICogcmVjb21waWxpbmcgdGhlIHdob2xlIGtlcm5lbCB3aGVuIENPTkZJR19YSVBfS0VSTkVMIGlzIHR1cm5lZCBvbi9vZmYuCiAgKi8KLWV4dGVybiB2b2lkIF9ldGV4dDsKICN1bmRlZiBNT0RVTEVTX1ZBRERSCi0jZGVmaW5lIE1PRFVMRVNfVkFERFIJKCgodW5zaWduZWQgbG9uZykmX2V0ZXh0ICsgflBHRElSX01BU0spICYgUEdESVJfTUFTSykKKyNkZWZpbmUgTU9EVUxFU19WQUREUgkoKCh1bnNpZ25lZCBsb25nKV9ldGV4dCArIH5QR0RJUl9NQVNLKSAmIFBHRElSX01BU0spCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NTVUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggMWYxZWVjYy4uNzA0OTgxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC01OSw5ICs2MCw4IEBACiBfX3NldHVwKCJmcGU9IiwgZnBlX3NldHVwKTsKICNlbmRpZgogCi1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqLCBzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgcmVib290X3NldHVwKGNoYXIgKnN0cik7Ci1leHRlcm4gdm9pZCBfdGV4dCwgX2V0ZXh0LCBfX2RhdGFfc3RhcnQsIF9lZGF0YSwgX2VuZDsKIAogdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKIEVYUE9SVF9TWU1CT0wocHJvY2Vzc29yX2lkKTsKQEAgLTExMiw3ICsxMTIsNiBAQAogY2hhciBlbGZfcGxhdGZvcm1bRUxGX1BMQVRGT1JNX1NJWkVdOwogRVhQT1JUX1NZTUJPTChlbGZfcGxhdGZvcm0pOwogCi1zdGF0aWMgc3RydWN0IG1lbWluZm8gbWVtaW5mbyBfX2luaXRkYXRhID0geyAwLCB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9uYW1lOwogc3RhdGljIGNvbnN0IGNoYXIgKm1hY2hpbmVfbmFtZTsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKQEAgLTM2NywyMSArMzY2LDM0IEBACiAJcmV0dXJuIGxpc3Q7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhcm1fYWRkX21lbW9yeSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBhcm1fYWRkX21lbW9yeSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc3RydWN0IG1lbWJhbmsgKmJhbms7CisJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWVtaW5mby5iYW5rW21lbWluZm8ubnJfYmFua3NdOworCisJaWYgKG1lbWluZm8ubnJfYmFua3MgPj0gTlJfQkFOS1MpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlJfQkFOS1MgdG9vIGxvdywgIgorCQkJImlnbm9yaW5nIG1lbW9yeSBhdCAlI2x4XG4iLCBzdGFydCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qCiAJICogRW5zdXJlIHRoYXQgc3RhcnQvc2l6ZSBhcmUgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkuCiAJICogU2l6ZSBpcyBhcHByb3ByaWF0ZWx5IHJvdW5kZWQgZG93biwgc3RhcnQgaXMgcm91bmRlZCB1cC4KIAkgKi8KIAlzaXplIC09IHN0YXJ0ICYgflBBR0VfTUFTSzsKLQotCWJhbmsgPSAmbWVtaW5mby5iYW5rW21lbWluZm8ubnJfYmFua3MrK107Ci0KIAliYW5rLT5zdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOwogCWJhbmstPnNpemUgID0gc2l6ZSAmIFBBR0VfTUFTSzsKIAliYW5rLT5ub2RlICA9IFBIWVNfVE9fTklEKHN0YXJ0KTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGlzIG1lbW9yeSByZWdpb24gaGFzIG5vbi16ZXJvIHNpemUgb3IKKwkgKiBpbnZhbGlkIG5vZGUgbnVtYmVyLgorCSAqLworCWlmIChiYW5rLT5zaXplID09IDAgfHwgYmFuay0+bm9kZSA+PSBNQVhfTlVNTk9ERVMpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtaW5mby5ucl9iYW5rcysrOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDcyLDEwICs0ODQsMTAgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaTsKIAotCWtlcm5lbF9jb2RlLnN0YXJ0ICAgPSB2aXJ0X3RvX3BoeXMoJl90ZXh0KTsKLQlrZXJuZWxfY29kZS5lbmQgICAgID0gdmlydF90b19waHlzKCZfZXRleHQgLSAxKTsKLQlrZXJuZWxfZGF0YS5zdGFydCAgID0gdmlydF90b19waHlzKCZfX2RhdGFfc3RhcnQpOwotCWtlcm5lbF9kYXRhLmVuZCAgICAgPSB2aXJ0X3RvX3BoeXMoJl9lbmQgLSAxKTsKKwlrZXJuZWxfY29kZS5zdGFydCAgID0gdmlydF90b19waHlzKF90ZXh0KTsKKwlrZXJuZWxfY29kZS5lbmQgICAgID0gdmlydF90b19waHlzKF9ldGV4dCAtIDEpOworCWtlcm5lbF9kYXRhLnN0YXJ0ICAgPSB2aXJ0X3RvX3BoeXMoX2RhdGEpOworCWtlcm5lbF9kYXRhLmVuZCAgICAgPSB2aXJ0X3RvX3BoeXMoX2VuZCAtIDEpOwogCiAJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7CiAJCWlmIChtaS0+YmFua1tpXS5zaXplID09IDApCkBAIC01MzksMTQgKzU1MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW0zMihjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCiB7Ci0JaWYgKG1lbWluZm8ubnJfYmFua3MgPj0gTlJfQkFOS1MpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIklnbm9yaW5nIG1lbW9yeSBiYW5rIDB4JTA4eCBzaXplICVkS0JcbiIsCi0JCQl0YWctPnUubWVtLnN0YXJ0LCB0YWctPnUubWVtLnNpemUgLyAxMDI0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFybV9hZGRfbWVtb3J5KHRhZy0+dS5tZW0uc3RhcnQsIHRhZy0+dS5tZW0uc2l6ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGFybV9hZGRfbWVtb3J5KHRhZy0+dS5tZW0uc3RhcnQsIHRhZy0+dS5tZW0uc2l6ZSk7CiB9CiAKIF9fdGFndGFibGUoQVRBR19NRU0sIHBhcnNlX3RhZ19tZW0zMik7CkBAIC03MTAsMTUgKzcxNSwxNSBAQAogCQlwYXJzZV90YWdzKHRhZ3MpOwogCX0KIAotCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7Ci0JaW5pdF9tbS5lbmRfY29kZSAgID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7Ci0JaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7Ci0JaW5pdF9tbS5icmsJICAgPSAodW5zaWduZWQgbG9uZykgJl9lbmQ7CisJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF90ZXh0OworCWluaXRfbW0uZW5kX2NvZGUgICA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CisJaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKKwlpbml0X21tLmJyawkgICA9ICh1bnNpZ25lZCBsb25nKSBfZW5kOwogCiAJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCBmcm9tLCBDT01NQU5EX0xJTkVfU0laRSk7CiAJYm9vdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOwogCXBhcnNlX2NtZGxpbmUoY21kbGluZV9wLCBmcm9tKTsKLQlwYWdpbmdfaW5pdCgmbWVtaW5mbywgbWRlc2MpOworCXBhZ2luZ19pbml0KG1kZXNjKTsKIAlyZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcygmbWVtaW5mbywgbWRlc2MpOwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNzcyLDYgKzc3Nyw4IEBACiAJImphdmEiLAogCSJpd21teHQiLAogCSJjcnVuY2giLAorCSJ0aHVtYmVlIiwKKwkibmVvbiIsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IGU0MmE3NDkuLjAxOTIzN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogCS8qCiAJICogU3RvcCB0aGUgbG9jYWwgdGltZXIgZm9yIHRoaXMgQ1BVLgogCSAqLwotCWxvY2FsX3RpbWVyX3N0b3AoY3B1KTsKKwlsb2NhbF90aW1lcl9zdG9wKCk7CiAKIAkvKgogCSAqIEZsdXNoIHVzZXIgY2FjaGUgYW5kIFRMQiBtYXBwaW5ncywgYW5kIHRoZW4gcmVtb3ZlIHRoaXMgQ1BVCkBAIC0yODQsNyArMjg0LDcgQEAKIAkvKgogCSAqIFNldHVwIGxvY2FsIHRpbWVyIGZvciB0aGlzIENQVS4KIAkgKi8KLQlsb2NhbF90aW1lcl9zZXR1cChjcHUpOworCWxvY2FsX3RpbWVyX3NldHVwKCk7CiAKIAljYWxpYnJhdGVfZGVsYXkoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RodW1iZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC90aHVtYmVlLmMKaW5kZXggZGYzZjZiNy4uOWNiN2FhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RodW1iZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdGh1bWJlZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAvKgogICogQWNjZXNzIHRvIHRoZSBUaHVtYkVFIEhhbmRsZXIgQmFzZSByZWdpc3RlcgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGVlaGJyX3JlYWQoKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRlZWhicl9yZWFkKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2OwogCWFzbSgibXJjCXAxNCwgNiwgJTAsIGMxLCBjMCwgMFxuIiA6ICI9ciIgKHYpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNDg5OGJkYy4uMDAyMTYwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTExOSw3ICsxMTksNyBAQAogI2VuZGlmCiAKIAkuZGF0YSA6IEFUKF9fZGF0YV9sb2MpIHsKLQkJX19kYXRhX3N0YXJ0ID0gLjsJLyogYWRkcmVzcyBpbiBtZW1vcnkgKi8KKwkJX2RhdGEgPSAuOwkJLyogYWRkcmVzcyBpbiBtZW1vcnkgKi8KIAogCQkvKgogCQkgKiBmaXJzdCwgdGhlIGluaXQgdGFzayB1bmlvbiwgYWxpZ25lZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL01ha2VmaWxlIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCmluZGV4IDMwMzUxY2Q0Li44NjZmODRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCkBAIC0zOCw3ICszOCw2IEBACiBlbmRpZgogCiBsaWItJChDT05GSUdfQVJDSF9SUEMpCQkrPSBlY2FyZC5vIGlvLWFjb3JuLm8gZmxvcHB5ZG1hLm8KLWxpYi0kKENPTkZJR19BUkNIX0NMUFM3NTAwKQkrPSBpby1hY29ybi5vCiBsaWItJChDT05GSUdfQVJDSF9MNzIwMCkJKz0gaW8tYWNvcm4ubwogbGliLSQoQ09ORklHX0FSQ0hfU0hBUkspCSs9IGlvLXNoYXJrLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL21lbXNldC5TIGIvYXJjaC9hcm0vbGliL21lbXNldC5TCmluZGV4IDc2MWVlZmEuLjY1MGQ1OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL2FybS9saWIvbWVtc2V0LlMKQEAgLTI1LDcgKzI1LDcgQEAKIAlhZGQJcjIsIHIyLCByMwkJQCAxIChyMiA9IHIyIC0gKDQgLSByMykpCiAvKgogICogVGhlIHBvaW50ZXIgaXMgbm93IGFsaWduZWQgYW5kIHRoZSBsZW5ndGggaXMgYWRqdXN0ZWQuICBUcnkgZG9pbmcgdGhlCi0gKiBtZW16ZXJvIGFnYWluLgorICogbWVtc2V0IGFnYWluLgogICovCiAKIEVOVFJZKG1lbXNldCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL01ha2VmaWxlCmluZGV4IGE4ZTQ2MmYuLjIwZWM4MzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogIyBDb21tb24gc3VwcG9ydCAobXVzdCBiZSBsaW5rZWQgYmVmb3JlIGJvYXJkIHNwZWNpZmljIHN1cHBvcnQpCi1vYmoteSArPSBjb3JlLm8gY2xvY2subworb2JqLXkgKz0gY29yZS5vCiAKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQUFFRDIwMDApICs9IGFhZWQyMDAwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZWUxNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY2xvY2suYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgTmljb2xhcyBCZWxsaWRvIFkgT3J0ZWdhCi0gKgotICogIEJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlICJjbG9jay5oIgotCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7Ci0KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIGNsazsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci0KLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbW9kdWxlX3B1dChjbGstPm93bmVyKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7Ci0KLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7Ci0KLXZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotfQotRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7Ci0KLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrLT5yYXRlOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwotCi1sb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXJldHVybiByYXRlOwotfQotRVhQT1JUX1NZTUJPTChjbGtfcm91bmRfcmF0ZSk7Ci0KLWludCBjbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7Ci0KLWludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQotewotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjbGtfcmVnaXN0ZXIpOwotCi12b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfZGVsKCZjbGstPm5vZGUpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChjbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YmI3NGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2Nsb2NrLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IE5pY29sYXMgQmVsbGlkbyBZIE9ydGVnYQotICoKLSAqICBCYXNlZCBvbiBsaW51eC9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY2xvY2suaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLXN0cnVjdCBtb2R1bGU7Ci0KLXN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQl2b2lkCQkJKmRhdGE7Ci19OwotCi1pbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7Ci12b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCmluZGV4IGRmYjI2YmMuLjUwZTEzOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zMCw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAiY2xvY2suaCIKIAogLyoKICAqIENvbW1vbiBJL08gbWFwcGluZzoKQEAgLTIyOSw5ICsyMjksMjggQEAKIAkmY2xjZF9kZXZpY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBhYWVjMjAwMF9jbGNkX2NsayA9IHsKLQkubmFtZSA9ICJDTENEQ0xLIiwKLX07Cit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKK30KKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCit7CisJcmV0dXJuIGRldiAmJiBzdHJjbXAoZGV2X25hbWUoZGV2KSwgIm1iOjE2IikgPT0gMCA/IE5VTEwgOiBFUlJfUFRSKC1FTk9FTlQpOworfQorCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworfQogCiB2b2lkIF9faW5pdCBhYWVjMjAwMF9zZXRfY2xjZF9wbGF0X2RhdGEoc3RydWN0IGFhZWMyMDAwX2NsY2RfaW5mbyAqY2xjZCkKIHsKQEAgLTI2NSw4ICsyODQsNiBAQAogewogCWludCBpOwogCi0JY2xrX3JlZ2lzdGVyKCZhYWVjMjAwMF9jbGNkX2Nsayk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKIAkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOwogCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhODQ2Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9kbWEuaAotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTmljb2xhcyBCZWxsaWRvIFkgT3J0ZWdhCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYzg3YzI0ZC4uYWI0ZmU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9pby5oCkBAIC02LDE1ICs2LDEzIEBACiAjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lPX0gKICNkZWZpbmUgX19BU01fQVJNX0FSQ0hfSU9fSAogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyoKICAqIFdlIGRvbid0IGFjdHVhbGx5IGhhdmUgcmVhbCBJU0Egbm9yIFBDSSBidXNlcywgYnV0IHRoZXJlIGlzIHNvIG1hbnkKICAqIGRyaXZlcnMgb3V0IHRoZXJlIHRoYXQgbWlnaHQganVzdCB3b3JrIGlmIHdlIGZha2UgdGhlbS4uLgogICovCi0jZGVmaW5lIF9faW8oYSkJCQkoKHZvaWQgX19pb21lbSAqKShhKSkKLSNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKKyNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQorI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA1NmFlOTAwLi5jMDA4MjI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTQsOSArMTQsNiBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4ZjAwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KIC8qCiAgKiBUaGUgbm9kZXMgYXJlIHRoZSBmb2xsb3dpbmdzOgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcKaW5kZXggNWFhZmIyZS4uMzIzYjQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL0tjb25maWcKQEAgLTcsMzYgKzcsNDMgQEAKIAogY29uZmlnIEFSQ0hfQVQ5MVJNOTIwMAogCWJvb2wgIkFUOTFSTTkyMDAiCisJc2VsZWN0IENQVV9BUk05MjBUCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAKIGNvbmZpZyBBUkNIX0FUOTFTQU05MjYwCiAJYm9vbCAiQVQ5MVNBTTkyNjAgb3IgQVQ5MVNBTTlYRSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAogY29uZmlnIEFSQ0hfQVQ5MVNBTTkyNjEKIAlib29sICJBVDkxU0FNOTI2MSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAogY29uZmlnIEFSQ0hfQVQ5MVNBTTkyNjMKIAlib29sICJBVDkxU0FNOTI2MyIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAogY29uZmlnIEFSQ0hfQVQ5MVNBTTlSTAogCWJvb2wgIkFUOTFTQU05UkwiCisJc2VsZWN0IENQVV9BUk05MjZUCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAKIGNvbmZpZyBBUkNIX0FUOTFTQU05RzIwCiAJYm9vbCAiQVQ5MVNBTTlHMjAiCisJc2VsZWN0IENQVV9BUk05MjZUCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAKIGNvbmZpZyBBUkNIX0FUOTFDQVA5CiAJYm9vbCAiQVQ5MUNBUDkiCisJc2VsZWN0IENQVV9BUk05MjZUCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAKQEAgLTIzNSw2ICsyNDIsMTIgQEAKIAkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgYSBDYWxhbyBTeXN0ZW1zIFVTQi1BOTI2My4KIAkgIDxodHRwOi8vd3d3LmNhbGFvLXN5c3RlbXMuY29tPgogCitjb25maWcgTUFDSF9ORU9DT1JFOTI2CisJYm9vbCAiQWRlbmVvIE5FT0NPUkU5MjYiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTFTQU05MjYzCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyB0aGUgQWRlbmVvIE5lb2NvcmUgOTI2IGJvYXJkLgorCiBlbmRpZgogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMiw3ICszMTUsNyBAQAogCiBjb25maWcgTVREX0FUOTFfREFUQUZMQVNIX0NBUkQKIAlib29sICJFbmFibGUgRGF0YUZsYXNoIENhcmQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChBUkNIX0FUOTFSTTkyMDBESyB8fCBNQUNIX0FUOTFSTTkyMDBFSyB8fCBNQUNIX0FUOTFTQU05MjYwRUsgfHwgTUFDSF9BVDkxU0FNOTI2MUVLIHx8IE1BQ0hfQVQ5MVNBTTkyNjNFSyB8fCBNQUNIX0FUOTFTQU05RzIwRUsgfHwgTUFDSF9FQ0JBVDkxIHx8IE1BQ0hfU0FNOV9MOTI2MCB8fCBNQUNIX0FUOTFDQVA5QURLKQorCWRlcGVuZHMgb24gKEFSQ0hfQVQ5MVJNOTIwMERLIHx8IE1BQ0hfQVQ5MVJNOTIwMEVLIHx8IE1BQ0hfQVQ5MVNBTTkyNjBFSyB8fCBNQUNIX0FUOTFTQU05MjYxRUsgfHwgTUFDSF9BVDkxU0FNOTI2M0VLIHx8IE1BQ0hfQVQ5MVNBTTlHMjBFSyB8fCBNQUNIX0VDQkFUOTEgfHwgTUFDSF9TQU05X0w5MjYwIHx8IE1BQ0hfQVQ5MUNBUDlBREsgfHwgTUFDSF9ORU9DT1JFOTI2KQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRGF0YUZsYXNoIGNhcmQuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQppbmRleCBjY2E2MTJkLi5jNjlmZjIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCkBAIC0xMSwxMiArMTEsMTIgQEAKIAogIyBDUFUtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkJKz0gYXQ5MXJtOTIwMC5vIGF0OTFybTkyMDBfdGltZS5vIGF0OTFybTkyMDBfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkJKz0gYXQ5MXNhbTkyNjAubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjBfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MSkJKz0gYXQ5MXNhbTkyNjEubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjFfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MykJKz0gYXQ5MXNhbTkyNjMubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjNfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOVJMKQkrPSBhdDkxc2FtOXJsLm8gYXQ5MXNhbTkyNnhfdGltZS5vIGF0OTFzYW05cmxfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOUcyMCkJKz0gYXQ5MXNhbTkyNjAubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjBfZGV2aWNlcy5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxQ0FQOSkJKz0gYXQ5MWNhcDkubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MWNhcDlfZGV2aWNlcy5vCitvYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkJKz0gYXQ5MXNhbTkyNjAubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjBfZGV2aWNlcy5vIHNhbTlfc21jLm8KK29iai0kKENPTkZJR19BUkNIX0FUOTFTQU05MjYxKQkrPSBhdDkxc2FtOTI2MS5vIGF0OTFzYW05MjZ4X3RpbWUubyBhdDkxc2FtOTI2MV9kZXZpY2VzLm8gc2FtOV9zbWMubworb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjMpCSs9IGF0OTFzYW05MjYzLm8gYXQ5MXNhbTkyNnhfdGltZS5vIGF0OTFzYW05MjYzX2RldmljZXMubyBzYW05X3NtYy5vCitvYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOVJMKQkrPSBhdDkxc2FtOXJsLm8gYXQ5MXNhbTkyNnhfdGltZS5vIGF0OTFzYW05cmxfZGV2aWNlcy5vIHNhbTlfc21jLm8KK29iai0kKENPTkZJR19BUkNIX0FUOTFTQU05RzIwKQkrPSBhdDkxc2FtOTI2MC5vIGF0OTFzYW05MjZ4X3RpbWUubyBhdDkxc2FtOTI2MF9kZXZpY2VzLm8gIHNhbTlfc21jLm8KK29iai0kKENPTkZJR19BUkNIX0FUOTFDQVA5KQkrPSBhdDkxY2FwOS5vIGF0OTFzYW05MjZ4X3RpbWUubyBhdDkxY2FwOV9kZXZpY2VzLm8gc2FtOV9zbWMubwogb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVg0MCkJKz0gYXQ5MXg0MC5vIGF0OTF4NDBfdGltZS5vCiAKICMgQVQ5MVJNOTIwMCBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CkBAIC00Nyw2ICs0Nyw3IEBACiAjIEFUOTFTQU05MjYzIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0FUOTFTQU05MjYzRUspICs9IGJvYXJkLXNhbTkyNjNlay5vCiBvYmotJChDT05GSUdfTUFDSF9VU0JfQTkyNjMpCSs9IGJvYXJkLXVzYi1hOTI2My5vCitvYmotJChDT05GSUdfTUFDSF9ORU9DT1JFOTI2KQkrPSBib2FyZC1uZW9jb3JlOTI2Lm8KIAogIyBBVDkxU0FNOVJMIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0FUOTFTQU05UkxFSykJKz0gYm9hcmQtc2FtOXJsZWsubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwppbmRleCAwZmMwYWRhLi4wYTM4YzY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwpAQCAtMTcsNiArMTcsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFjYXA5Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CkBAIC0zMTcsNiArMzE5LDEyIEBACiAKIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFjYXA5X2dwaW8sIDQpOworCisJLyogUmVtZW1iZXIgdGhlIHNpbGljb24gcmV2aXNpb24gKi8KKwlpZiAoY3B1X2lzX2F0OTFjYXA5X3JldkIoKSkKKwkJc3lzdGVtX3JldiA9IDB4QjsKKwllbHNlIGlmIChjcHVfaXNfYXQ5MWNhcDlfcmV2QygpKQorCQlzeXN0ZW1fcmV2ID0gMHhDOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKaW5kZXggNWViZDQyNy4uOWVjYTIyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjEsNiArMjIsNyBAQAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MWNhcDkuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFjYXA5X21hdHJpeC5oPgpAQCAtNjksNiArNzEsOSBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuOwogCisJaWYgKGNwdV9pc19hdDkxY2FwOV9yZXZCKCkpCisJCXNldF9pcnFfdHlwZShBVDkxQ0FQOV9JRF9VSFAsIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCiAJLyogRW5hYmxlIFZCdXMgY29udHJvbCBmb3IgVUhQIHBvcnRzICovCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKIAkJaWYgKGRhdGEtPnZidXNfcGluW2ldKQpAQCAtMTUxLDggKzE1NiwxMyBAQAogCiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiYShzdHJ1Y3QgdXNiYV9wbGF0Zm9ybV9kYXRhICpkYXRhKQogewotCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX1VEUEhTLCBBVDkxX01BVFJJWF9TRUxFQ1RfVURQSFMgfAotCQkJCQkgIEFUOTFfTUFUUklYX1VEUEhTX0JZUEFTU19MT0NLKTsKKwlpZiAoY3B1X2lzX2F0OTFjYXA5X3JldkIoKSkgeworCQlzZXRfaXJxX3R5cGUoQVQ5MUNBUDlfSURfVURQSFMsIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCQlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9VRFBIUywgQVQ5MV9NQVRSSVhfU0VMRUNUX1VEUEhTIHwKKwkJCQkJCSAgQVQ5MV9NQVRSSVhfVURQSFNfQllQQVNTX0xPQ0spOworCX0KKwllbHNlCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX1VEUEhTLCBBVDkxX01BVFJJWF9TRUxFQ1RfVURQSFMpOwogCiAJLyoKIAkgKiBJbnZhbGlkIHBpbnMgYXJlIDAgb24gQVQ5MSwgYnV0IHRoZSB1c2JhIGRyaXZlciBpcyBzaGFyZWQKQEAgLTQwNiwyOCArNDE2LDEzIEBACiAKIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9uYW5kKHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKmRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyBjc2EsIG1vZGU7CisJdW5zaWduZWQgbG9uZyBjc2E7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKIAogCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9NQVRSSVhfRUJJQ1NBKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9FQklDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0VCSV9DUzNBX1NNQ19TTUFSVE1FRElBIHwgQVQ5MV9NQVRSSVhfRUJJX1ZERElPTVNFTF8zXzNWKTsKLQotCS8qIHNldCB0aGUgYnVzIGludGVyZmFjZSBjaGFyYWN0ZXJpc3RpY3MgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19TRVRVUCgzKSwgQVQ5MV9TTUNfTldFU0VUVVBfKDIpIHwgQVQ5MV9TTUNfTkNTX1dSU0VUVVBfKDEpCi0JCQl8IEFUOTFfU01DX05SRFNFVFVQXygyKSB8IEFUOTFfU01DX05DU19SRFNFVFVQXygxKSk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19QVUxTRSgzKSwgQVQ5MV9TTUNfTldFUFVMU0VfKDQpIHwgQVQ5MV9TTUNfTkNTX1dSUFVMU0VfKDYpCi0JCQl8IEFUOTFfU01DX05SRFBVTFNFXyg0KSB8IEFUOTFfU01DX05DU19SRFBVTFNFXyg2KSk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DWUNMRSgzKSwgQVQ5MV9TTUNfTldFQ1lDTEVfKDgpIHwgQVQ5MV9TTUNfTlJEQ1lDTEVfKDgpKTsKLQotCWlmIChkYXRhLT5idXNfd2lkdGhfMTYpCi0JCW1vZGUgPSBBVDkxX1NNQ19EQldfMTY7Ci0JZWxzZQotCQltb2RlID0gQVQ5MV9TTUNfREJXXzg7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfTU9ERSgzKSwgbW9kZSB8IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX1RERl8oMSkpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX0VCSUNTQSwgY3NhIHwgQVQ5MV9NQVRSSVhfRUJJX0NTM0FfU01DX1NNQVJUTUVESUEpOwogCiAJLyogZW5hYmxlIHBpbiAqLwogCWlmIChkYXRhLT5lbmFibGVfcGluKQpAQCAtODY1LDYgKzg2MCw5IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm47CiAKKwlpZiAoY3B1X2lzX2F0OTFjYXA5X3JldkIoKSkKKwkJc2V0X2lycV90eXBlKEFUOTFDQVA5X0lEX0xDREMsIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCiAJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxLCAwKTsJLyogTENESFNZTkMgKi8KIAlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzIsIDApOwkvKiBMQ0RET1RDSyAqLwogCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMywgMCk7CS8qIExDRERFTiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfdGltZS5jCmluZGV4IGE3MmU3OTguLmQxNDBlYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF90aW1lLmMKQEAgLTE0MSw2ICsxNDEsMTUgQEAKIAkvKiBVc2UgInJhdyIgcHJpbWl0aXZlcyBzbyB3ZSBiZWhhdmUgY29ycmVjdGx5IG9uIFJUIGtlcm5lbHMuICovCiAJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAorCS8qCisJICogQWNjb3JkaW5nIHRvIFRob21hcyBHbGVpeG5lciBpcnFzIGFyZSBhbHJlYWR5IGRpc2FibGVkIGhlcmUuICBTaW1wbHkKKwkgKiByZW1vdmluZyByYXdfbG9jYWxfaXJxX3NhdmUgYWJvdmUgKGFuZCB0aGUgbWF0Y2hpbmcKKwkgKiByYXdfbG9jYWxfaXJxX3Jlc3RvcmUpIHdhcyBub3QgYWNjZXB0ZWQuICBTZWUKKwkgKiBodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5saW51eC5wb3J0cy5hcm0ua2VybmVsLzQxMTc0CisJICogU28gZm9yIG5vdyAoMjAwOC0xMS0yMCkganVzdCB3YXJuIG9uY2UgaWYgaXJxcyB3ZXJlIG5vdCBkaXNhYmxlZCAuLi4KKwkgKi8KKwlXQVJOX09OX09OQ0UoIXJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSk7CisKIAkvKiBUaGUgYWxhcm0gSVJRIHVzZXMgYWJzb2x1dGUgdGltZSAobm93K2RlbHRhKSwgbm90IHRoZSByZWxhdGl2ZQogCSAqIHRpbWUgKGRlbHRhKSBpbiBvdXIgY2FsbGluZyBjb252ZW50aW9uLiAgTGlrZSBhbGwgY2xvY2tldmVudHMKIAkgKiB1c2luZyBzdWNoICJtYXRjaCIgaGFyZHdhcmUsIHdlIGhhdmUgYSByYWNlIHRvIGRlZmVuZCBhZ2FpbnN0LgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKaW5kZXggNzc3NGQxNy4uZmRkZTFlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAogdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX25hbmQoc3RydWN0IGF0bWVsX25hbmRfZGF0YSAqZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIGNzYSwgbW9kZTsKKwl1bnNpZ25lZCBsb25nIGNzYTsKIAogCWlmICghZGF0YSkKIAkJcmV0dXJuOwpAQCAtMzIxLDQyICszMjEsNiBAQAogCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9NQVRSSVhfRUJJQ1NBKTsKIAlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9FQklDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0NTM0FfU01DX1NNQVJUTUVESUEpOwogCi0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MCgpKSB7Ci0JCS8qIFRpbWluZyBmb3Igc2FtOTI2MCAqLwotCQkvKiBzZXQgdGhlIGJ1cyBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzICovCi0JCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKDMpLCBBVDkxX1NNQ19OV0VTRVRVUF8oMSkgfCBBVDkxX1NNQ19OQ1NfV1JTRVRVUF8oMCkKLQkJCQl8IEFUOTFfU01DX05SRFNFVFVQXygxKSB8IEFUOTFfU01DX05DU19SRFNFVFVQXygwKSk7Ci0KLQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMyksIEFUOTFfU01DX05XRVBVTFNFXygzKSB8IEFUOTFfU01DX05DU19XUlBVTFNFXygzKQotCQkJCXwgQVQ5MV9TTUNfTlJEUFVMU0VfKDMpIHwgQVQ5MV9TTUNfTkNTX1JEUFVMU0VfKDMpKTsKLQotCQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DWUNMRSgzKSwgQVQ5MV9TTUNfTldFQ1lDTEVfKDUpIHwgQVQ5MV9TTUNfTlJEQ1lDTEVfKDUpKTsKLQotCQlpZiAoZGF0YS0+YnVzX3dpZHRoXzE2KQotCQkJbW9kZSA9IEFUOTFfU01DX0RCV18xNjsKLQkJZWxzZQotCQkJbW9kZSA9IEFUOTFfU01DX0RCV184OwotCQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19NT0RFKDMpLCBtb2RlIHwgQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfVERGXygyKSk7Ci0JfQotCi0JaWYgKGNwdV9pc19hdDkxc2FtOWcyMCgpKSB7Ci0JCS8qIFRpbWluZyBmb3Igc2FtOWcyMCAqLwotCQkvKiBzZXQgdGhlIGJ1cyBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzICovCi0JCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKDMpLCBBVDkxX1NNQ19OV0VTRVRVUF8oMikgfCBBVDkxX1NNQ19OQ1NfV1JTRVRVUF8oMCkKLQkJCQl8IEFUOTFfU01DX05SRFNFVFVQXygyKSB8IEFUOTFfU01DX05DU19SRFNFVFVQXygwKSk7Ci0KLQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMyksIEFUOTFfU01DX05XRVBVTFNFXyg0KSB8IEFUOTFfU01DX05DU19XUlBVTFNFXyg0KQotCQkJCXwgQVQ5MV9TTUNfTlJEUFVMU0VfKDQpIHwgQVQ5MV9TTUNfTkNTX1JEUFVMU0VfKDQpKTsKLQotCQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DWUNMRSgzKSwgQVQ5MV9TTUNfTldFQ1lDTEVfKDcpIHwgQVQ5MV9TTUNfTlJEQ1lDTEVfKDcpKTsKLQotCQlpZiAoZGF0YS0+YnVzX3dpZHRoXzE2KQotCQkJbW9kZSA9IEFUOTFfU01DX0RCV18xNjsKLQkJZWxzZQotCQkJbW9kZSA9IEFUOTFfU01DX0RCV184OwotCQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19NT0RFKDMpLCBtb2RlIHwgQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfVERGXygzKSk7Ci0JfQotCiAJLyogZW5hYmxlIHBpbiAqLwogCWlmIChkYXRhLT5lbmFibGVfcGluKQogCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT5lbmFibGVfcGluLCAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCmluZGV4IDZiODkxNzIuLjE3Mjg5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9uYW5kKHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKmRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyBjc2EsIG1vZGU7CisJdW5zaWduZWQgbG9uZyBjc2E7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTIzMSwyMSArMjMxLDYgQEAKIAljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSUNTQSk7CiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9NQVRSSVhfRUJJQ1NBLCBjc2EgfCBBVDkxX01BVFJJWF9DUzNBX1NNQ19TTUFSVE1FRElBKTsKIAotCS8qIHNldCB0aGUgYnVzIGludGVyZmFjZSBjaGFyYWN0ZXJpc3RpY3MgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19TRVRVUCgzKSwgQVQ5MV9TTUNfTldFU0VUVVBfKDEpIHwgQVQ5MV9TTUNfTkNTX1dSU0VUVVBfKDApCi0JCQl8IEFUOTFfU01DX05SRFNFVFVQXygxKSB8IEFUOTFfU01DX05DU19SRFNFVFVQXygwKSk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19QVUxTRSgzKSwgQVQ5MV9TTUNfTldFUFVMU0VfKDMpIHwgQVQ5MV9TTUNfTkNTX1dSUFVMU0VfKDMpCi0JCQl8IEFUOTFfU01DX05SRFBVTFNFXygzKSB8IEFUOTFfU01DX05DU19SRFBVTFNFXygzKSk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DWUNMRSgzKSwgQVQ5MV9TTUNfTldFQ1lDTEVfKDUpIHwgQVQ5MV9TTUNfTlJEQ1lDTEVfKDUpKTsKLQotCWlmIChkYXRhLT5idXNfd2lkdGhfMTYpCi0JCW1vZGUgPSBBVDkxX1NNQ19EQldfMTY7Ci0JZWxzZQotCQltb2RlID0gQVQ5MV9TTUNfREJXXzg7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfTU9ERSgzKSwgbW9kZSB8IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX1RERl8oMikpOwotCiAJLyogZW5hYmxlIHBpbiAqLwogCWlmIChkYXRhLT5lbmFibGVfcGluKQogCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT5lbmFibGVfcGluLCAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCmluZGV4IDhiODg0MDguLmI3NTNjYjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYwpAQCAtMzgyLDcgKzM4Miw3IEBACiAKIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9uYW5kKHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKmRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyBjc2EsIG1vZGU7CisJdW5zaWduZWQgbG9uZyBjc2E7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTM5MCwyMSArMzkwLDYgQEAKIAljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSTBDU0EpOwogCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX0VCSTBDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0VCSTBfQ1MzQV9TTUNfU01BUlRNRURJQSk7CiAKLQkvKiBzZXQgdGhlIGJ1cyBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzICovCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfU0VUVVAoMyksIEFUOTFfU01DX05XRVNFVFVQXygxKSB8IEFUOTFfU01DX05DU19XUlNFVFVQXygwKQotCQkJfCBBVDkxX1NNQ19OUkRTRVRVUF8oMSkgfCBBVDkxX1NNQ19OQ1NfUkRTRVRVUF8oMCkpOwotCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMyksIEFUOTFfU01DX05XRVBVTFNFXygzKSB8IEFUOTFfU01DX05DU19XUlBVTFNFXygzKQotCQkJfCBBVDkxX1NNQ19OUkRQVUxTRV8oMykgfCBBVDkxX1NNQ19OQ1NfUkRQVUxTRV8oMykpOwotCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1lDTEUoMyksIEFUOTFfU01DX05XRUNZQ0xFXyg1KSB8IEFUOTFfU01DX05SRENZQ0xFXyg1KSk7Ci0KLQlpZiAoZGF0YS0+YnVzX3dpZHRoXzE2KQotCQltb2RlID0gQVQ5MV9TTUNfREJXXzE2OwotCWVsc2UKLQkJbW9kZSA9IEFUOTFfU01DX0RCV184OwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX01PREUoMyksIG1vZGUgfCBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19UREZfKDIpKTsKLQogCS8qIGVuYWJsZSBwaW4gKi8KIAlpZiAoZGF0YS0+ZW5hYmxlX3BpbikKIAkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+ZW5hYmxlX3BpbiwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKaW5kZXggODdkZWIxZS4uMTQ1MzI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwpAQCAtMjMyLDE3ICsyMzIsNiBAQAogCWNzYSA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9NQVRSSVhfRUJJQ1NBKTsKIAlhdDkxX3N5c193cml0ZShBVDkxX01BVFJJWF9FQklDU0EsIGNzYSB8IEFUOTFfTUFUUklYX0NTM0FfU01DX1NNQVJUTUVESUEpOwogCi0JLyogc2V0IHRoZSBidXMgaW50ZXJmYWNlIGNoYXJhY3RlcmlzdGljcyAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKDMpLCBBVDkxX1NNQ19OV0VTRVRVUF8oMSkgfCBBVDkxX1NNQ19OQ1NfV1JTRVRVUF8oMCkKLQkJCXwgQVQ5MV9TTUNfTlJEU0VUVVBfKDEpIHwgQVQ5MV9TTUNfTkNTX1JEU0VUVVBfKDApKTsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1BVTFNFKDMpLCBBVDkxX1NNQ19OV0VQVUxTRV8oMykgfCBBVDkxX1NNQ19OQ1NfV1JQVUxTRV8oMykKLQkJCXwgQVQ5MV9TTUNfTlJEUFVMU0VfKDMpIHwgQVQ5MV9TTUNfTkNTX1JEUFVMU0VfKDMpKTsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX0NZQ0xFKDMpLCBBVDkxX1NNQ19OV0VDWUNMRV8oNSkgfCBBVDkxX1NNQ19OUkRDWUNMRV8oNSkpOwotCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfTU9ERSgzKSwgQVQ5MV9TTUNfREJXXzggfCBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19UREZfKDIpKTsKLQogCS8qIGVuYWJsZSBwaW4gKi8KIAlpZiAoZGF0YS0+ZW5hYmxlX3BpbikKIAkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+ZW5hYmxlX3BpbiwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYW02MC5jCmluZGV4IGNkZGRjYTUuLmQzYmEyOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYW02MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYW02MC5jCkBAIC0zOSw3ICszOSw5IEBACiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAorI2luY2x1ZGUgInNhbTlfc21jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAKQEAgLTE1MSw2ICsxNTMsMzIgQEAKIAkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCiB9OwogCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGNhbTYwX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDEsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDMsCisJLm5yZF9wdWxzZQkJPSAzLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAorCS5ud2VfcHVsc2UJCT0gMywKKworCS5yZWFkX2N5Y2xlCQk9IDUsCisJLndyaXRlX2N5Y2xlCQk9IDUsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCisJLnRkZl9jeWNsZXMJCT0gMiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYW02MF9hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmNhbTYwX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmY2FtNjBfbmFuZF9kYXRhKTsKK30KKwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2FtNjBfYm9hcmRfaW5pdCh2b2lkKQogewpAQCAtMTY1LDcgKzE5Myw3IEBACiAJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEIxOCwgMSk7CiAJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmNhbTYwX3VzYmhfZGF0YSk7CiAJLyogTkFORCAqLwotCWF0OTFfYWRkX2RldmljZV9uYW5kKCZjYW02MF9uYW5kX2RhdGEpOworCWNhbTYwX2FkZF9kZXZpY2VfbmFuZCgpOwogfQogCiBNQUNISU5FX1NUQVJUKENBTTYwLCAiS3dpa0J5dGUgQ0FNNjAiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKaW5kZXggMjAxYjg5My4uODNhMWEwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCkBAIC0zNiwxNyArMzYsMTYgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxY2FwOV9tYXRyaXguaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIApAQCAtMTk1LDYgKzE5NCw0MyBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGNhcDlhZGtfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAxLAorCS5ucmRfc2V0dXAJCT0gMiwKKwkubmNzX3dyaXRlX3NldHVwCT0gMSwKKwkubndlX3NldHVwCQk9IDIsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gNiwKKwkubnJkX3B1bHNlCQk9IDQsCisJLm5jc193cml0ZV9wdWxzZQk9IDYsCisJLm53ZV9wdWxzZQkJPSA0LAorCisJLnJlYWRfY3ljbGUJCT0gOCwKKwkud3JpdGVfY3ljbGUJCT0gOCwKKworCS5tb2RlCQkJPSBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUsCisJLnRkZl9jeWNsZXMJCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYXA5YWRrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3NhOworCisJY3NhID0gYXQ5MV9zeXNfcmVhZChBVDkxX01BVFJJWF9FQklDU0EpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX0VCSUNTQSwgY3NhIHwgQVQ5MV9NQVRSSVhfRUJJX1ZERElPTVNFTF8zXzNWKTsKKworCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KKwlpZiAoY2FwOWFka19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQorCQljYXA5YWRrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKKwllbHNlCisJCWNhcDlhZGtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzg7CisKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmNhcDlhZGtfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZjYXA5YWRrX25hbmRfZGF0YSk7Cit9CisKIAogLyoKICAqIE5PUiBmbGFzaApAQCAtMjM0LDYgKzI3MCwyNCBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShub3JfZmxhc2hfcmVzb3VyY2VzKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgY2FwOWFka19ub3Jfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMiwKKwkubnJkX3NldHVwCQk9IDQsCisJLm5jc193cml0ZV9zZXR1cAk9IDIsCisJLm53ZV9zZXR1cAkJPSA0LAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDEwLAorCS5ucmRfcHVsc2UJCT0gOCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gMTAsCisJLm53ZV9wdWxzZQkJPSA4LAorCisJLnJlYWRfY3ljbGUJCT0gMTYsCisJLndyaXRlX2N5Y2xlCQk9IDE2LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0JBVF9XUklURSB8IEFUOTFfU01DX0RCV18xNiwKKwkudGRmX2N5Y2xlcwkJPSAxLAorfTsKKwogc3RhdGljIF9faW5pdCB2b2lkIGNhcDlhZGtfYWRkX2RldmljZV9ub3Iodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNzYTsKQEAgLTI0MSwxOCArMjk1LDggQEAKIAljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSUNTQSk7CiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9NQVRSSVhfRUJJQ1NBLCBjc2EgfCBBVDkxX01BVFJJWF9FQklfVkRESU9NU0VMXzNfM1YpOwogCi0JLyogc2V0IHRoZSBidXMgaW50ZXJmYWNlIGNoYXJhY3RlcmlzdGljcyAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKDApLCBBVDkxX1NNQ19OV0VTRVRVUF8oNCkgfCBBVDkxX1NNQ19OQ1NfV1JTRVRVUF8oMikKLQkJCXwgQVQ5MV9TTUNfTlJEU0VUVVBfKDQpIHwgQVQ5MV9TTUNfTkNTX1JEU0VUVVBfKDIpKTsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1BVTFNFKDApLCBBVDkxX1NNQ19OV0VQVUxTRV8oOCkgfCBBVDkxX1NNQ19OQ1NfV1JQVUxTRV8oMTApCi0JCQl8IEFUOTFfU01DX05SRFBVTFNFXyg4KSB8IEFUOTFfU01DX05DU19SRFBVTFNFXygxMCkpOwotCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1lDTEUoMCksIEFUOTFfU01DX05XRUNZQ0xFXygxNikgfCBBVDkxX1NNQ19OUkRDWUNMRV8oMTYpKTsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX01PREUoMCksIEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFCi0JCQl8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19CQVRfV1JJVEUKLQkJCXwgQVQ5MV9TTUNfREJXXzE2IHwgQVQ5MV9TTUNfVERGXygxKSk7CisJLyogY29uZmlndXJlIGNoaXAtc2VsZWN0IDAgKE5PUikgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMCwgJmNhcDlhZGtfbm9yX3NtY19jb25maWcpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjYXA5YWRrX25vcl9mbGFzaCk7CiB9CkBAIC0zMzAsMTAgKzM3NCw4IEBACiAJLyogU2VyaWFsICovCiAJYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOwogCS8qIFVTQiBIb3N0ICovCi0Jc2V0X2lycV90eXBlKEFUOTFDQVA5X0lEX1VIUCwgSVJRX1RZUEVfTEVWRUxfSElHSCk7CiAJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmNhcDlhZGtfdXNiaF9kYXRhKTsKIAkvKiBVU0IgSFMgKi8KLQlzZXRfaXJxX3R5cGUoQVQ5MUNBUDlfSURfVURQSFMsIElSUV9UWVBFX0xFVkVMX0hJR0gpOwogCWF0OTFfYWRkX2RldmljZV91c2JhKCZjYXA5YWRrX3VzYmFfdWRjX2RhdGEpOwogCS8qIFNQSSAqLwogCWF0OTFfYWRkX2RldmljZV9zcGkoY2FwOWFka19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShjYXA5YWRrX3NwaV9kZXZpY2VzKSk7CkBAIC0zNDQsMTMgKzM4NiwxMiBAQAogCS8qIEV0aGVybmV0ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmY2FwOWFka19tYWNiX2RhdGEpOwogCS8qIE5BTkQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmY2FwOWFka19uYW5kX2RhdGEpOworCWNhcDlhZGtfYWRkX2RldmljZV9uYW5kKCk7CiAJLyogTk9SIEZsYXNoICovCiAJY2FwOWFka19hZGRfZGV2aWNlX25vcigpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CiAJLyogTENEIENvbnRyb2xsZXIgKi8KLQlzZXRfaXJxX3R5cGUoQVQ5MUNBUDlfSURfTENEQywgSVJRX1RZUEVfTEVWRUxfSElHSCk7CiAJYXQ5MV9hZGRfZGV2aWNlX2xjZGMoJmNhcDlhZGtfbGNkY19kYXRhKTsKIAkvKiBBQzk3ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2FjOTcoJmNhcDlhZGtfYWM5N19kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTdiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQorICogIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoQykgMjAwOCBBREVORU8uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfbWFwX2lvKHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDIwIE1IeiBjcnlzdGFsICovCisJYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSgyMDAwMDAwMCk7CisKKwkvKiBER0JVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLworCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKKworCS8qIFVTQVJUMCBvbiB0dHlTMS4gKFJ4LCBUeCwgUlRTLCBDVFMpICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYzX0lEX1VTMCwgMSwgQVRNRUxfVUFSVF9DVFMgfCBBVE1FTF9VQVJUX1JUUyk7CisKKwkvKiBzZXQgc2VyaWFsIGNvbnNvbGUgdG8gdHR5UzAgKGllLCBEQkdVKSAqLworCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbmVvY29yZTkyNl9pbml0X2lycSh2b2lkKQoreworCWF0OTFzYW05MjYzX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKK30KKworCisvKgorICogVVNCIEhvc3QgcG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgbmVvY29yZTkyNl91c2JoX2RhdGEgPSB7CisJLnBvcnRzCQk9IDIsCisJLnZidXNfcGluCT0geyBBVDkxX1BJTl9QQTI0LCBBVDkxX1BJTl9QQTIxIH0sCit9OworCisvKgorICogVVNCIERldmljZSBwb3J0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSBfX2luaXRkYXRhIG5lb2NvcmU5MjZfdWRjX2RhdGEgPSB7CisJLnZidXNfcGluCT0gQVQ5MV9QSU5fUEEyNSwKKwkucHVsbHVwX3Bpbgk9IDAsCQkvKiBwdWxsLXVwIGRyaXZlbiBieSBVREMgKi8KK307CisKKworLyoKKyAqIEFEUzc4NDYgVG91Y2hzY3JlZW4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDZfTU9EVUxFKQorc3RhdGljIGludCBhZHM3ODQzX3BlbmRvd25fc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gIWF0OTFfZ2V0X2dwaW9fdmFsdWUoQVQ5MV9QSU5fUEExNSk7CS8qIFRvdWNoc2NyZWVuIFBFTklSUSAqLworfQorCitzdGF0aWMgc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSBhZHNfaW5mbyA9IHsKKwkubW9kZWwJCQk9IDc4NDMsCisJLnhfbWluCQkJPSAxNTAsCisJLnhfbWF4CQkJPSAzODMwLAorCS55X21pbgkJCT0gMTkwLAorCS55X21heAkJCT0gMzgzMCwKKwkudnJlZl9kZWxheV91c2Vjcwk9IDEwMCwKKwkueF9wbGF0ZV9vaG1zCQk9IDQ1MCwKKwkueV9wbGF0ZV9vaG1zCQk9IDI1MCwKKwkucHJlc3N1cmVfbWF4CQk9IDE1MDAwLAorCS5kZWJvdW5jZV9tYXgJCT0gMSwKKwkuZGVib3VuY2VfcmVwCQk9IDAsCisJLmRlYm91bmNlX3RvbAkJPSAofjApLAorCS5nZXRfcGVuZG93bl9zdGF0ZQk9IGFkczc4NDNfcGVuZG93bl9zdGF0ZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBuZW9jb3JlOTI2X2FkZF9kZXZpY2VfdHModm9pZCkKK3sKKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTE1LCAxKTsJLyogRXh0ZXJuYWwgSVJRMSwgd2l0aCBwdWxsdXAgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BDMTMsIDEpOwkvKiBUb3VjaHNjcmVlbiBCVVNZIHNpZ25hbCAqLworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBuZW9jb3JlOTI2X2FkZF9kZXZpY2VfdHModm9pZCkge30KKyNlbmRpZgorCisvKgorICogU1BJIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gbmVvY29yZTkyNl9zcGlfZGV2aWNlc1tdID0geworI2lmIGRlZmluZWQoQ09ORklHX01URF9BVDkxX0RBVEFGTEFTSF9DQVJEKQorCXsJLyogRGF0YUZsYXNoIGNhcmQgKi8KKwkJLm1vZGFsaWFzCT0gIm10ZF9kYXRhZmxhc2giLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCQkubWF4X3NwZWVkX2h6CT0gMTUgKiAxMDAwICogMTAwMCwKKwkJLmJ1c19udW0JPSAwLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2X01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcwk9ICJhZHM3ODQ2IiwKKwkJLmNoaXBfc2VsZWN0CT0gMSwKKwkJLm1heF9zcGVlZF9oegk9IDEyNTAwMCAqIDE2LAorCQkuYnVzX251bQk9IDAsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmFkc19pbmZvLAorCQkuaXJxCQk9IEFUOTFTQU05MjYzX0lEX0lSUTEsCisJfSwKKyNlbmRpZgorfTsKKworCisvKgorICogTUNJIChTRC9NTUMpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSBfX2luaXRkYXRhIG5lb2NvcmU5MjZfbW1jX2RhdGEgPSB7CisJLndpcmU0CQk9IDEsCisJLmRldF9waW4JPSBBVDkxX1BJTl9QRTE4LAorCS53cF9waW4JCT0gQVQ5MV9QSU5fUEUxOSwKK307CisKKworLyoKKyAqIE1BQ0IgRXRoZXJuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIG5lb2NvcmU5MjZfbWFjYl9kYXRhID0geworCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BFMzEsCisJLmlzX3JtaWkJPSAxLAorfTsKKworCisvKgorICogTkFORCBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBuZW9jb3JlOTI2X25hbmRfcGFydGl0aW9uW10gPSB7CisJeworCQkubmFtZQk9ICJMaW51eCBLZXJuZWwiLAkvKiAiUGFydGl0aW9uIDEiLCAqLworCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSBTWl84TSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiRmlsZXN5c3RlbSIsCQkvKiAiUGFydGl0aW9uIDIiLCAqLworCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IFNaXzMyTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiRnJlZSIsCQkvKiAiUGFydGl0aW9uIDMiLCAqLworCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCit7CisJKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShuZW9jb3JlOTI2X25hbmRfcGFydGl0aW9uKTsKKwlyZXR1cm4gbmVvY29yZTkyNl9uYW5kX3BhcnRpdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBuZW9jb3JlOTI2X25hbmRfZGF0YSA9IHsKKwkuYWxlCQkJPSAyMSwKKwkuY2xlCQkJPSAyMiwKKwkucmR5X3BpbgkJPSBBVDkxX1BJTl9QQjE5LAorCS5yZHlfcGluX2FjdGl2ZV9sb3cJPSAxLAorCS5lbmFibGVfcGluCQk9IEFUOTFfUElOX1BEMTUsCisJLnBhcnRpdGlvbl9pbmZvCQk9IG5hbmRfcGFydGl0aW9ucywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgbmVvY29yZTkyNl9uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAxLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMSwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSA0LAorCS5ucmRfcHVsc2UJCT0gNCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gNCwKKwkubndlX3B1bHNlCQk9IDQsCisKKwkucmVhZF9jeWNsZQkJPSA2LAorCS53cml0ZV9jeWNsZQkJPSA2LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAorCS50ZGZfY3ljbGVzCQk9IDIsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbmVvY29yZTkyNl9hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJm5lb2NvcmU5MjZfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZuZW9jb3JlOTI2X25hbmRfZGF0YSk7Cit9CisKKworLyoKKyAqIExDRCBDb250cm9sbGVyCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GQl9BVE1FTCkgfHwgZGVmaW5lZChDT05GSUdfRkJfQVRNRUxfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgYXQ5MV90ZnRfdmdhX21vZGVzW10gPSB7CisJeworCQkubmFtZQkJPSAiVFgwOUQ1MFZNMUNDQSBAIDYwIiwKKwkJLnJlZnJlc2gJPSA2MCwKKwkJLnhyZXMJCT0gMjQwLAkJLnlyZXMJCT0gMzIwLAorCQkucGl4Y2xvY2sJPSBLSFoyUElDT1MoNTAwMCksCisKKwkJLmxlZnRfbWFyZ2luCT0gMSwJCS5yaWdodF9tYXJnaW4JPSAzMywKKwkJLnVwcGVyX21hcmdpbgk9IDEsCQkubG93ZXJfbWFyZ2luCT0gMCwKKwkJLmhzeW5jX2xlbgk9IDUsCQkudnN5bmNfbGVuCT0gMSwKKworCQkuc3luYwkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmJfbW9uc3BlY3MgYXQ5MWZiX2RlZmF1bHRfbW9uc3BlY3MgPSB7CisJLm1hbnVmYWN0dXJlcgk9ICJISVQiLAorCS5tb25pdG9yCT0gIlRYMDlENzBWTTFDQ0EiLAorCisJLm1vZGVkYgkJPSBhdDkxX3RmdF92Z2FfbW9kZXMsCisJLm1vZGVkYl9sZW4JPSBBUlJBWV9TSVpFKGF0OTFfdGZ0X3ZnYV9tb2RlcyksCisJLmhmbWluCQk9IDE1MDAwLAorCS5oZm1heAkJPSA2NDAwMCwKKwkudmZtaW4JCT0gNTAsCisJLnZmbWF4CQk9IDE1MCwKK307CisKKyNkZWZpbmUgQVQ5MVNBTTkyNjNfREVGQVVMVF9MQ0RDT04yIChBVE1FTF9MQ0RDX01FTU9SX0xJVFRMRSBcCisJCQkJCXwgQVRNRUxfTENEQ19ESVNUWVBFX1RGVCBcCisJCQkJCXwgQVRNRUxfTENEQ19DTEtNT0RfQUxXQVlTQUNUSVZFKQorCitzdGF0aWMgdm9pZCBhdDkxX2xjZGNfcG93ZXJfY29udHJvbChpbnQgb24pCit7CisJYXQ5MV9zZXRfZ3Bpb192YWx1ZShBVDkxX1BJTl9QQTMwLCBvbik7Cit9CisKKy8qIERyaXZlciBkYXRhcyAqLworc3RhdGljIHN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvIF9faW5pdGRhdGEgbmVvY29yZTkyNl9sY2RjX2RhdGEgPSB7CisJLmxjZGNvbl9pc19iYWNrbGlnaHQJCT0gdHJ1ZSwKKwkuZGVmYXVsdF9icHAJCQk9IDE2LAorCS5kZWZhdWx0X2RtYWNvbgkJCT0gQVRNRUxfTENEQ19ETUFFTiwKKwkuZGVmYXVsdF9sY2Rjb24yCQk9IEFUOTFTQU05MjYzX0RFRkFVTFRfTENEQ09OMiwKKwkuZGVmYXVsdF9tb25zcGVjcwkJPSAmYXQ5MWZiX2RlZmF1bHRfbW9uc3BlY3MsCisJLmF0bWVsX2xjZGZiX3Bvd2VyX2NvbnRyb2wJPSBhdDkxX2xjZGNfcG93ZXJfY29udHJvbCwKKwkuZ3VhcmRfdGltZQkJCT0gMSwKKwkubGNkX3dpcmluZ19tb2RlCQk9IEFUTUVMX0xDRENfV0lSSU5HX1JHQjU1NSwKK307CisKKyNlbHNlCitzdGF0aWMgc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gX19pbml0ZGF0YSBuZW9jb3JlOTI2X2xjZGNfZGF0YTsKKyNlbmRpZgorCisKKy8qCisgKiBHUElPIEJ1dHRvbnMKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIG5lb2NvcmU5MjZfYnV0dG9uc1tdID0geworCXsJLyogQlAxLCAibGVmdGNsaWMiICovCisJCS5jb2RlCQk9IEJUTl9MRUZULAorCQkuZ3BpbwkJPSBBVDkxX1BJTl9QQzUsCisJCS5hY3RpdmVfbG93CT0gMSwKKwkJLmRlc2MJCT0gImxlZnRfY2xpY2siLAorCQkud2FrZXVwCQk9IDEsCisJfSwKKwl7CS8qIEJQMiwgInJpZ2h0Y2xpYyIgKi8KKwkJLmNvZGUJCT0gQlROX1JJR0hULAorCQkuZ3BpbwkJPSBBVDkxX1BJTl9QQzQsCisJCS5hY3RpdmVfbG93CT0gMSwKKwkJLmRlc2MJCT0gInJpZ2h0X2NsaWNrIiwKKwkJLndha2V1cAkJPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIG5lb2NvcmU5MjZfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBuZW9jb3JlOTI2X2J1dHRvbnMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShuZW9jb3JlOTI2X2J1dHRvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmVvY29yZTkyNl9idXR0b25fZGV2aWNlID0geworCS5uYW1lCQk9ICJncGlvLWtleXMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm5lb2NvcmU5MjZfYnV0dG9uX2RhdGEsCisJfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfYWRkX2RldmljZV9idXR0b25zKHZvaWQpCit7CisJYXQ5MV9zZXRfR1BJT19wZXJpcGgoQVQ5MV9QSU5fUEM1LCAwKTsJLyogbGVmdCBidXR0b24gKi8KKwlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQzUsIDEpOworCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BDNCwgMCk7CS8qIHJpZ2h0IGJ1dHRvbiAqLworCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BDNCwgMSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm5lb2NvcmU5MjZfYnV0dG9uX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfYWRkX2RldmljZV9idXR0b25zKHZvaWQpIHt9CisjZW5kaWYKKworCisvKgorICogQUM5NworICovCitzdGF0aWMgc3RydWN0IGF0bWVsX2FjOTdfZGF0YSBuZW9jb3JlOTI2X2FjOTdfZGF0YSA9IHsKKwkucmVzZXRfcGluCT0gQVQ5MV9QSU5fUEExMywKK307CisKKworc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIFNlcmlhbCAqLworCWF0OTFfYWRkX2RldmljZV9zZXJpYWwoKTsKKworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJm5lb2NvcmU5MjZfdXNiaF9kYXRhKTsKKworCS8qIFVTQiBEZXZpY2UgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdWRjKCZuZW9jb3JlOTI2X3VkY19kYXRhKTsKKworCS8qIFNQSSAqLworCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BFMjAsIDEpOwkJLyogc2VsZWN0IHNwaTAgY2xvY2sgKi8KKwlhdDkxX2FkZF9kZXZpY2Vfc3BpKG5lb2NvcmU5MjZfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUobmVvY29yZTkyNl9zcGlfZGV2aWNlcykpOworCisJLyogVG91Y2hzY3JlZW4gKi8KKwluZW9jb3JlOTI2X2FkZF9kZXZpY2VfdHMoKTsKKworCS8qIE1NQyAqLworCWF0OTFfYWRkX2RldmljZV9tbWMoMSwgJm5lb2NvcmU5MjZfbW1jX2RhdGEpOworCisJLyogRXRoZXJuZXQgKi8KKwlhdDkxX2FkZF9kZXZpY2VfZXRoKCZuZW9jb3JlOTI2X21hY2JfZGF0YSk7CisKKwkvKiBOQU5EICovCisJbmVvY29yZTkyNl9hZGRfZGV2aWNlX25hbmQoKTsKKworCS8qIEkyQyAqLworCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CisKKwkvKiBMQ0QgQ29udHJvbGxlciAqLworCWF0OTFfYWRkX2RldmljZV9sY2RjKCZuZW9jb3JlOTI2X2xjZGNfZGF0YSk7CisKKwkvKiBQdXNoIEJ1dHRvbnMgKi8KKwluZW9jb3JlOTI2X2FkZF9kZXZpY2VfYnV0dG9ucygpOworCisJLyogQUM5NyAqLworCWF0OTFfYWRkX2RldmljZV9hYzk3KCZuZW9jb3JlOTI2X2FjOTdfZGF0YSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoTkVPQ09SRTkyNiwgIkFERU5FTyBORU9DT1JFIDkyNiIpCisJLyogTWFpbnRhaW5lcjogQURFTkVPICovCisJLnBoeXNfaW8JPSBBVDkxX0JBU0VfU1lTLAorCS5pb19wZ19vZmZzdAk9IChBVDkxX1ZBX0JBU0VfU1lTID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBBVDkxX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gbmVvY29yZTkyNl9tYXBfaW8sCisJLmluaXRfaXJxCT0gbmVvY29yZTkyNl9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gbmVvY29yZTkyNl9ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwppbmRleCBjZmI0NTcxLi40Y2ZmOWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCkBAIC00MSw4ICs0MSwxMCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAorI2luY2x1ZGUgInNhbTlfc21jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAKQEAgLTE0NywxMyArMTQ5LDM0IEBACiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKIAkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQVRNRUxfQlVTV0lEVEhfMTYpCi0JLmJ1c193aWR0aF8xNgk9IDEsCi0jZWxzZQotCS5idXNfd2lkdGhfMTYJPSAwLAotI2VuZGlmCiB9OwogCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDEsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDMsCisJLm5yZF9wdWxzZQkJPSAzLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAorCS5ud2VfcHVsc2UJCT0gMywKKworCS5yZWFkX2N5Y2xlCQk9IDUsCisJLndyaXRlX2N5Y2xlCQk9IDUsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCisJLnRkZl9jeWNsZXMJCT0gMiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKwogLyoKICAqIE1DSSAoU0QvTU1DKQogICovCkBAIC0yMjcsNyArMjUwLDcgQEAKIAkvKiBTUEkgKi8KIAlhdDkxX2FkZF9kZXZpY2Vfc3BpKGVrX3NwaV9kZXZpY2VzLCBBUlJBWV9TSVpFKGVrX3NwaV9kZXZpY2VzKSk7CiAJLyogTkFORCAqLwotCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CiAJLyogRXRoZXJuZXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCmluZGV4IDk5YmI0Y2MuLmI0ODM0NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYwpAQCAtMzgsNyArMzgsOSBAQAogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAKKyNpbmNsdWRlICJzYW05X3NtYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKIAogCkBAIC0xNDgsMTMgKzE1MCwzNCBAQAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCiAJLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAotI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUTUVMX0JVU1dJRFRIXzE2KQotCS5idXNfd2lkdGhfMTYJPSAxLAotI2Vsc2UKLQkuYnVzX3dpZHRoXzE2CT0gMCwKLSNlbmRpZgogfTsKIAorc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAxLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMSwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSAzLAorCS5ucmRfcHVsc2UJCT0gMywKKwkubmNzX3dyaXRlX3B1bHNlCT0gMywKKwkubndlX3B1bHNlCQk9IDMsCisKKwkucmVhZF9jeWNsZQkJPSA1LAorCS53cml0ZV9jeWNsZQkJPSA1LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSB8IEFUOTFfU01DX0RCV184LAorCS50ZGZfY3ljbGVzCQk9IDIsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCit7CisJLyogY29uZmlndXJlIGNoaXAtc2VsZWN0IDMgKE5BTkQpICovCisJc2FtOV9zbWNfY29uZmlndXJlKDMsICZla19uYW5kX3NtY19jb25maWcpOworCisJYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7Cit9CisKIAogLyoKICAqIE1DSSAoU0QvTU1DKQpAQCAtMTc4LDcgKzIwMSw3IEBACiAJLyogU1BJICovCiAJYXQ5MV9hZGRfZGV2aWNlX3NwaShla19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShla19zcGlfZGV2aWNlcykpOwogCS8qIE5BTkQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKKwlla19hZGRfZGV2aWNlX25hbmQoKTsKIAkvKiBFdGhlcm5ldCAqLwogCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7CiAJLyogTU1DICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKaW5kZXggYjQ5ZWI2ZS4uOTNhMGY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwpAQCAtNDIsNyArNDIsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzYW05X3NtYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKIAogCkBAIC0xOTUsNiArMTk4LDM4IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gMSwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDEsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gMywKKwkubnJkX3B1bHNlCQk9IDMsCisJLm5jc193cml0ZV9wdWxzZQk9IDMsCisJLm53ZV9wdWxzZQkJPSAzLAorCisJLnJlYWRfY3ljbGUJCT0gNSwKKwkud3JpdGVfY3ljbGUJCT0gNSwKKworCS5tb2RlCQkJPSBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUsCisJLnRkZl9jeWNsZXMJCT0gMiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwkvKiBzZXR1cCBidXMtd2lkdGggKDggb3IgMTYpICovCisJaWYgKGVrX25hbmRfZGF0YS5idXNfd2lkdGhfMTYpCisJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV18xNjsKKwllbHNlCisJCWVrX25hbmRfc21jX2NvbmZpZy5tb2RlIHw9IEFUOTFfU01DX0RCV184OworCisJLyogY29uZmlndXJlIGNoaXAtc2VsZWN0IDMgKE5BTkQpICovCisJc2FtOV9zbWNfY29uZmlndXJlKDMsICZla19uYW5kX3NtY19jb25maWcpOworCisJYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7Cit9CisKIAogLyoKICAqIE1DSSAoU0QvTU1DKQpAQCAtMzAzLDcgKzMzOCw3IEBACiAJLyogU1BJICovCiAJYXQ5MV9hZGRfZGV2aWNlX3NwaShla19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShla19zcGlfZGV2aWNlcykpOwogCS8qIE5BTkQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKKwlla19hZGRfZGV2aWNlX25hbmQoKTsKIAkvKiBFdGhlcm5ldCAqLwogCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7CiAJLyogTU1DICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKaW5kZXggNDk3NzQwOS4uZDUyNjZkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYwpAQCAtNDcsNyArNDcsOSBAQAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIApAQCAtNzYsNyArNzgsNyBAQAogICogRE05MDAwIGV0aGVybmV0IGRldmljZQogICovCiAjaWYgZGVmaW5lZChDT05GSUdfRE05MDAwKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdDkxc2FtOTI2MV9kbTkwMDBfcmVzb3VyY2VbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG05MDAwX3Jlc291cmNlW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSBBVDkxX0NISVBTRUxFQ1RfMiwKIAkJLmVuZAk9IEFUOTFfQ0hJUFNFTEVDVF8yICsgMywKQEAgLTk4LDI3ICsxMDAsNDIgQEAKIAkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX2RtOTAwMF9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkbTkwMDBfZGV2aWNlID0gewogCS5uYW1lCQk9ICJkbTkwMDAiLAogCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdDkxc2FtOTI2MV9kbTkwMDBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IGF0OTFzYW05MjYxX2RtOTAwMF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZG05MDAwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBkbTkwMDBfcmVzb3VyY2UsCiAJLmRldgkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmRtOTAwMF9wbGF0ZGF0YSwKIAl9CiB9OwogCisvKgorICogU01DIHRpbWluZ3MgZm9yIHRoZSBETTkwMDAuCisgKiBOb3RlOiBUaGVzZSB0aW1pbmdzIHdlcmUgY2FsY3VsYXRlZCBmb3IgTUFTVEVSX0NMT0NLID0gMTAwMDAwMDAwIGFjY29yZGluZyB0byB0aGUgRE05MDAwIHRpbWluZ3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZG05MDAwX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAyLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMiwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSA4LAorCS5ucmRfcHVsc2UJCT0gNCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gOCwKKwkubndlX3B1bHNlCQk9IDQsCisKKwkucmVhZF9jeWNsZQkJPSAxNiwKKwkud3JpdGVfY3ljbGUJCT0gMTYsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfQkFUX1dSSVRFIHwgQVQ5MV9TTUNfREJXXzE2LAorCS50ZGZfY3ljbGVzCQk9IDEsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9kbTkwMDAodm9pZCkKIHsKLQkvKgotCSAqIENvbmZpZ3VyZSBDaGlwLVNlbGVjdCAyIG9uIFNNQyBmb3IgdGhlIERNOTAwMC4KLQkgKiBOb3RlOiBUaGVzZSB0aW1pbmdzIHdlcmUgY2FsY3VsYXRlZCBmb3IgTUFTVEVSX0NMT0NLID0gMTAwMDAwMDAwCi0JICogIGFjY29yZGluZyB0byB0aGUgRE05MDAwIHRpbWluZ3MuCi0JICovCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfU0VUVVAoMiksIEFUOTFfU01DX05XRVNFVFVQXygyKSB8IEFUOTFfU01DX05DU19XUlNFVFVQXygwKSB8IEFUOTFfU01DX05SRFNFVFVQXygyKSB8IEFUOTFfU01DX05DU19SRFNFVFVQXygwKSk7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMiksIEFUOTFfU01DX05XRVBVTFNFXyg0KSB8IEFUOTFfU01DX05DU19XUlBVTFNFXyg4KSB8IEFUOTFfU01DX05SRFBVTFNFXyg0KSB8IEFUOTFfU01DX05DU19SRFBVTFNFXyg4KSk7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1lDTEUoMiksIEFUOTFfU01DX05XRUNZQ0xFXygxNikgfCBBVDkxX1NNQ19OUkRDWUNMRV8oMTYpKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19NT0RFKDIpLCBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19CQVRfV1JJVEUgfCBBVDkxX1NNQ19EQldfMTYgfCBBVDkxX1NNQ19UREZfKDEpKTsKKwkvKiBDb25maWd1cmUgY2hpcC1zZWxlY3QgMiAoRE05MDAwKSAqLworCXNhbTlfc21jX2NvbmZpZ3VyZSgyLCAmZG05MDAwX3NtY19jb25maWcpOwogCiAJLyogQ29uZmlndXJlIFJlc2V0IHNpZ25hbCBhcyBvdXRwdXQgKi8KIAlhdDkxX3NldF9ncGlvX291dHB1dChBVDkxX1BJTl9QQzEwLCAwKTsKQEAgLTEyNiw3ICsxNDMsNyBAQAogCS8qIENvbmZpZ3VyZSBJbnRlcnJ1cHQgcGluIGFzIGlucHV0LCBubyBwdWxsLXVwICovCiAJYXQ5MV9zZXRfZ3Bpb19pbnB1dChBVDkxX1BJTl9QQzExLCAwKTsKIAotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjFfZG05MDAwX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkbTkwMDBfZGV2aWNlKTsKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9kbTkwMDAodm9pZCkge30KQEAgLTE5Nyw2ICsyMTQsMzkgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAxLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMSwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSAzLAorCS5ucmRfcHVsc2UJCT0gMywKKwkubmNzX3dyaXRlX3B1bHNlCT0gMywKKwkubndlX3B1bHNlCQk9IDMsCisKKwkucmVhZF9jeWNsZQkJPSA1LAorCS53cml0ZV9jeWNsZQkJPSA1LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSwKKwkudGRmX2N5Y2xlcwkJPSAyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KKwlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OworCWVsc2UKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzg7CisKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKworCiAvKgogICogQURTNzg0NiBUb3VjaHNjcmVlbgogICovCkBAIC01MjUsNyArNTc1LDcgQEAKIAkvKiBJMkMgKi8KIAlhdDkxX2FkZF9kZXZpY2VfaTJjKE5VTEwsIDApOwogCS8qIE5BTkQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKKwlla19hZGRfZGV2aWNlX25hbmQoKTsKIAkvKiBETTkwMDAgZXRoZXJuZXQgKi8KIAlla19hZGRfZGV2aWNlX2RtOTAwMCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKaW5kZXggODM1NDAxNS4uNTdkNTI1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwpAQCAtNDYsNyArNDYsOSBAQAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIApAQCAtMjAzLDYgKzIwNSwzOCBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDEsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDMsCisJLm5yZF9wdWxzZQkJPSAzLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAorCS5ud2VfcHVsc2UJCT0gMywKKworCS5yZWFkX2N5Y2xlCQk9IDUsCisJLndyaXRlX2N5Y2xlCQk9IDUsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFLAorCS50ZGZfY3ljbGVzCQk9IDIsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9uYW5kKHZvaWQpCit7CisJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLworCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQorCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CisJZWxzZQorCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfODsKKworCS8qIGNvbmZpZ3VyZSBjaGlwLXNlbGVjdCAzIChOQU5EKSAqLworCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmZWtfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworfQorCiAKIC8qCiAgKiBJMkMgZGV2aWNlcwpAQCAtMzg1LDcgKzQxOSw3IEBACiAJLyogRXRoZXJuZXQgKi8KIAlhdDkxX2FkZF9kZXZpY2VfZXRoKCZla19tYWNiX2RhdGEpOwogCS8qIE5BTkQgKi8KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKKwlla19hZGRfZGV2aWNlX25hbmQoKTsKIAkvKiBJMkMgKi8KIAlhdDkxX2FkZF9kZXZpY2VfaTJjKGVrX2kyY19kZXZpY2VzLCBBUlJBWV9TSVpFKGVrX2kyY19kZXZpY2VzKSk7CiAJLyogTENEIENvbnRyb2xsZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwppbmRleCBiNTg4ZWFkLi44MTQzOWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCkBAIC0zNyw3ICszNyw5IEBACiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAorI2luY2x1ZGUgInNhbTlfc21jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAKQEAgLTE1Niw2ICsxNTgsMzggQEAKICNlbmRpZgogfTsKIAorc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSAyLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMiwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSA0LAorCS5ucmRfcHVsc2UJCT0gNCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gNCwKKwkubndlX3B1bHNlCQk9IDQsCisKKwkucmVhZF9jeWNsZQkJPSA3LAorCS53cml0ZV9jeWNsZQkJPSA3LAorCisJLm1vZGUJCQk9IEFUOTFfU01DX1JFQURNT0RFIHwgQVQ5MV9TTUNfV1JJVEVNT0RFIHwgQVQ5MV9TTUNfRVhOV01PREVfRElTQUJMRSwKKwkudGRmX2N5Y2xlcwkJPSAzLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCS8qIHNldHVwIGJ1cy13aWR0aCAoOCBvciAxNikgKi8KKwlpZiAoZWtfbmFuZF9kYXRhLmJ1c193aWR0aF8xNikKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzE2OworCWVsc2UKKwkJZWtfbmFuZF9zbWNfY29uZmlnLm1vZGUgfD0gQVQ5MV9TTUNfREJXXzg7CisKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKwogCiAvKgogICogTUNJIChTRC9NTUMpCkBAIC0xOTUsNyArMjI5LDcgQEAKIAkvKiBTUEkgKi8KIAlhdDkxX2FkZF9kZXZpY2Vfc3BpKGVrX3NwaV9kZXZpY2VzLCBBUlJBWV9TSVpFKGVrX3NwaV9kZXZpY2VzKSk7CiAJLyogTkFORCAqLwotCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwogCS8qIEV0aGVybmV0ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZWtfbWFjYl9kYXRhKTsKIAkvKiBNTUMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKaW5kZXggMjcwODUxOC4uOWI5MzdlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKQEAgLTI5LDggKzI5LDkgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzYW05X3NtYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKIAogCkBAIC0xMDMsOSArMTA0LDM0IEBACiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QRDE3LAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEI2LAogCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKLQkuYnVzX3dpZHRoXzE2CT0gMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gMSwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDEsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gMywKKwkubnJkX3B1bHNlCQk9IDMsCisJLm5jc193cml0ZV9wdWxzZQk9IDMsCisJLm53ZV9wdWxzZQkJPSAzLAorCisJLnJlYWRfY3ljbGUJCT0gNSwKKwkud3JpdGVfY3ljbGUJCT0gNSwKKworCS5tb2RlCQkJPSBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19EQldfOCwKKwkudGRmX2N5Y2xlcwkJPSAyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCS8qIGNvbmZpZ3VyZSBjaGlwLXNlbGVjdCAzIChOQU5EKSAqLworCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmZWtfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworfQorCiAKIC8qCiAgKiBTUEkgZGV2aWNlcwpAQCAtMTg4LDcgKzIxNCw3IEBACiAJLyogSTJDICovCiAJYXQ5MV9hZGRfZGV2aWNlX2kyYyhOVUxMLCAwKTsKIAkvKiBOQU5EICovCi0JYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7CisJZWtfYWRkX2RldmljZV9uYW5kKCk7CiAJLyogU1BJICovCiAJYXQ5MV9hZGRfZGV2aWNlX3NwaShla19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShla19zcGlfZGV2aWNlcykpOwogCS8qIE1NQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCmluZGV4IDdjMzUwMzUuLmQxMzMwNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKQEAgLTQxLDggKzQxLDEwIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIApAQCAtMTIxLDEzICsxMjMsMzQgQEAKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAogCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKLSNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9BVE1FTF9CVVNXSURUSF8xNikKLQkuYnVzX3dpZHRoXzE2CT0gMSwKLSNlbHNlCi0JLmJ1c193aWR0aF8xNgk9IDAsCi0jZW5kaWYKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gMSwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDEsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gMywKKwkubnJkX3B1bHNlCQk9IDMsCisJLm5jc193cml0ZV9wdWxzZQk9IDMsCisJLm53ZV9wdWxzZQkJPSAzLAorCisJLnJlYWRfY3ljbGUJCT0gNSwKKwkud3JpdGVfY3ljbGUJCT0gNSwKKworCS5tb2RlCQkJPSBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19EQldfOCwKKwkudGRmX2N5Y2xlcwkJPSAyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbmFuZCh2b2lkKQoreworCS8qIGNvbmZpZ3VyZSBjaGlwLXNlbGVjdCAzIChOQU5EKSAqLworCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmZWtfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworfQorCiAvKgogICogR1BJTyBCdXR0b25zCiAgKi8KQEAgLTE4OSw3ICsyMTIsNyBAQAogCS8qIFVTQiBEZXZpY2UgKi8KIAlhdDkxX2FkZF9kZXZpY2VfdWRjKCZla191ZGNfZGF0YSk7CiAJLyogTkFORCAqLwotCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CiAJLyogRXRoZXJuZXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYwppbmRleCAzOTFiNTY2Li5kOTY0MDViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCkBAIC00MCw4ICs0MCwxMCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAorI2luY2x1ZGUgInNhbTlfc21jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAKQEAgLTEzNCwxMyArMTM2LDM1IEBACiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQTIyLAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEQxNSwKIAkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQVRNRUxfQlVTV0lEVEhfMTYpCi0JLmJ1c193aWR0aF8xNgk9IDEsCi0jZWxzZQotCS5idXNfd2lkdGhfMTYJPSAwLAotI2VuZGlmCiB9OwogCitzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDEsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDMsCisJLm5yZF9wdWxzZQkJPSAzLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAorCS5ud2VfcHVsc2UJCT0gMywKKworCS5yZWFkX2N5Y2xlCQk9IDUsCisJLndyaXRlX2N5Y2xlCQk9IDUsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCisJLnRkZl9jeWNsZXMJCT0gMiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KKwlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7CisKKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKK30KKworCiAvKgogICogR1BJTyBCdXR0b25zCiAgKi8KQEAgLTIwNiw3ICsyMzAsNyBAQAogCS8qIEV0aGVybmV0ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZWtfbWFjYl9kYXRhKTsKIAkvKiBOQU5EICovCi0JYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmVrX25hbmRfZGF0YSk7CisJZWtfYWRkX2RldmljZV9uYW5kKCk7CiAJLyogSTJDICovCiAJYXQ5MV9hZGRfZGV2aWNlX2kyYyhOVUxMLCAwKTsKIAkvKiBQdXNoIEJ1dHRvbnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9wbWMuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9wbWMuaAppbmRleCAyZTNmMjg5Li45NTYxZTMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcG1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3BtYy5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lCQlBVDkxX1BNQ19QQ0sJCSgxIDw8ICAwKQkJLyogUHJvY2Vzc29yIENsb2NrICovCiAjZGVmaW5lCQlBVDkxUk05MjAwX1BNQ19VRFAJKDEgPDwgIDEpCQkvKiBVU0IgRGV2Y2ljZSBQb3J0IENsb2NrIFtBVDkxUk05MjAwIG9ubHldICovCiAjZGVmaW5lCQlBVDkxUk05MjAwX1BNQ19NQ0tVRFAJKDEgPDwgIDIpCQkvKiBVU0IgRGV2aWNlIFBvcnQgTWFzdGVyIENsb2NrIEF1dG9tYXRpYyBEaXNhYmxlIG9uIFN1c3BlbmQgW0FUOTFSTTkyMDAgb25seV0gKi8KKyNkZWZpbmUJCUFUOTFDQVA5X1BNQ19ERFIJKDEgPDwgIDIpCQkvKiBERFIgQ2xvY2sgW0FUOTFDQVA5IHJldkMgb25seV0gKi8KICNkZWZpbmUJCUFUOTFSTTkyMDBfUE1DX1VIUAkoMSA8PCAgNCkJCS8qIFVTQiBIb3N0IFBvcnQgQ2xvY2sgW0FUOTFSTTkyMDAgb25seV0gKi8KICNkZWZpbmUJCUFUOTFTQU05MjZ4X1BNQ19VSFAJKDEgPDwgIDYpCQkvKiBVU0IgSG9zdCBQb3J0IENsb2NrIFtBVDkxU0FNOTI2eCBvbmx5XSAqLwogI2RlZmluZQkJQVQ5MUNBUDlfUE1DX1VIUAkoMSA8PCAgNikJCS8qIFVTQiBIb3N0IFBvcnQgQ2xvY2sgW0FUOTFDQVA5IG9ubHldICovCkBAIC0xMDIsMTAgKzEwMywxNiBAQAogI2RlZmluZQkJQVQ5MV9QTUNfTE9DS0IJCSgxIDw8ICAyKQkJLyogUExMQiBMb2NrICovCiAjZGVmaW5lCQlBVDkxX1BNQ19NQ0tSRFkJCSgxIDw8ICAzKQkJLyogTWFzdGVyIENsb2NrICovCiAjZGVmaW5lCQlBVDkxX1BNQ19MT0NLVQkJKDEgPDwgIDYpCQkvKiBVUExMIExvY2sgW0FUOTFDQVA5IG9ubHldICovCisjZGVmaW5lCQlBVDkxX1BNQ19PU0NTRUwJCSgxIDw8ICA3KQkJLyogU2xvdyBDbG9jayBPc2NpbGxhdG9yIFtBVDkxQ0FQOSByZXZDIG9ubHldICovCiAjZGVmaW5lCQlBVDkxX1BNQ19QQ0swUkRZCSgxIDw8ICA4KQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDAgKi8KICNkZWZpbmUJCUFUOTFfUE1DX1BDSzFSRFkJKDEgPDwgIDkpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMSAqLwogI2RlZmluZQkJQVQ5MV9QTUNfUENLMlJEWQkoMSA8PCAxMCkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAyICovCiAjZGVmaW5lCQlBVDkxX1BNQ19QQ0szUkRZCSgxIDw8IDExKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDMgKi8KICNkZWZpbmUJQVQ5MV9QTUNfSU1SCQkoQVQ5MV9QTUMgKyAweDZjKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwogCisjZGVmaW5lIEFUOTFfUE1DX1BST1QJCShBVDkxX1BNQyArIDB4ZTQpCS8qIFByb3RlY3QgUmVnaXN0ZXIgW0FUOTFDQVA5IHJldkMgb25seV0gKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BST1RLRVkJMHg1MDRkNDMwMQkvKiBBY3RpdmF0aW9uIENvZGUgKi8KKworI2RlZmluZSBBVDkxX1BNQ19WRVIJCShBVDkxX1BNQyArIDB4ZmMpCS8qIFBNQyBNb2R1bGUgVmVyc2lvbiBbQVQ5MUNBUDkgb25seV0gKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmgKaW5kZXggNGE0YjY0MS4uZDhjMWVkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaApAQCAtMTAxLDcgKzEwMSw5IEBACiAjZGVmaW5lIEFUOTFfUlRUCSgweGZmZmZmZDIwIC0gQVQ5MV9CQVNFX1NZUykKICNkZWZpbmUgQVQ5MV9QSVQJKDB4ZmZmZmZkMzAgLSBBVDkxX0JBU0VfU1lTKQogI2RlZmluZSBBVDkxX1dEVAkoMHhmZmZmZmQ0MCAtIEFUOTFfQkFTRV9TWVMpCi0jZGVmaW5lIEFUOTFfR1BCUgkoMHhmZmZmZmQ1MCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfR1BCUgkoY3B1X2lzX2F0OTFjYXA5X3JldkIoKSA/CVwKKwkJCSgweGZmZmZmZDUwIC0gQVQ5MV9CQVNFX1NZUykgOglcCisJCQkoMHhmZmZmZmQ2MCAtIEFUOTFfQkFTRV9TWVMpKQogCiAjZGVmaW5lIEFUOTFfVVNBUlQwCUFUOTFDQVA5X0JBU0VfVVMwCiAjZGVmaW5lIEFUOTFfVVNBUlQxCUFUOTFDQVA5X0JBU0VfVVMxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCBkYmZkOWY3Li5jNTU0YzNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTQ5LDYgKzQ5LDE3IEBACiAJcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKSAmIEFUOTFfQ0lEUl9BUkNIKTsKIH0KIAorI2lmZGVmIENPTkZJR19BUkNIX0FUOTFDQVA5CisjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgorCisjZGVmaW5lIEFSQ0hfUkVWSVNJT05fQ0FQOV9CCTB4Mzk5CisjZGVmaW5lIEFSQ0hfUkVWSVNJT05fQ0FQOV9DCTB4NjAxCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxY2FwOV9yZXZfaWRlbnRpZnkodm9pZCkKK3sKKwlyZXR1cm4gKGF0OTFfc3lzX3JlYWQoQVQ5MV9QTUNfVkVSKSk7Cit9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKICNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDAoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFSTTkyMDApCkBAIC05MCw4ICsxMDEsMTIgQEAKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFDQVA5CiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MUNBUDkpCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZCKCkJKGF0OTFjYXA5X3Jldl9pZGVudGlmeSgpID09IEFSQ0hfUkVWSVNJT05fQ0FQOV9CKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QygpCShhdDkxY2FwOV9yZXZfaWRlbnRpZnkoKSA9PSBBUkNIX1JFVklTSU9OX0NBUDlfQykKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QigpCSgwKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QygpCSgwKQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmOTBjMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaAppbmRleCAxNjExYmQwLi4wYjBjY2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0yMyw4ICsyMyw4IEBACiAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJCTB4RkZGRkZGRkYKIAotI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA5ZGQxYjhjLi4xNGY0ZWY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTI1LDE1ICsyNSw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJKEFUOTFfU0RSQU1fQkFTRSkKIAotCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpIF9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgX19waHlzX3RvX3ZpcnQoeCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvc2FtOV9zbWMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zYW05X3NtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWI2YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3NhbTlfc21jLmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MS9zYW05X3NtYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuZHJldyBWaWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KKworI2luY2x1ZGUgInNhbTlfc21jLmgiCisKK3ZvaWQgX19pbml0IHNhbTlfc21jX2NvbmZpZ3VyZShpbnQgY3MsIHN0cnVjdCBzYW05X3NtY19jb25maWcqIGNvbmZpZykKK3sKKwkvKiBTZXR1cCByZWdpc3RlciAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKGNzKSwKKwkJICBBVDkxX1NNQ19OV0VTRVRVUF8oY29uZmlnLT5ud2Vfc2V0dXApCisJCXwgQVQ5MV9TTUNfTkNTX1dSU0VUVVBfKGNvbmZpZy0+bmNzX3dyaXRlX3NldHVwKQorCQl8IEFUOTFfU01DX05SRFNFVFVQXyhjb25maWctPm5yZF9zZXR1cCkKKwkJfCBBVDkxX1NNQ19OQ1NfUkRTRVRVUF8oY29uZmlnLT5uY3NfcmVhZF9zZXR1cCkKKwkpOworCisJLyogUHVsc2UgcmVnaXN0ZXIgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19QVUxTRShjcyksCisJCSAgQVQ5MV9TTUNfTldFUFVMU0VfKGNvbmZpZy0+bndlX3B1bHNlKQorCQl8IEFUOTFfU01DX05DU19XUlBVTFNFXyhjb25maWctPm5jc193cml0ZV9wdWxzZSkKKyAgICAgICAgICAgICAgICB8IEFUOTFfU01DX05SRFBVTFNFXyhjb25maWctPm5yZF9wdWxzZSkKKwkJfCBBVDkxX1NNQ19OQ1NfUkRQVUxTRV8oY29uZmlnLT5uY3NfcmVhZF9wdWxzZSkKKwkpOworCisJLyogQ3ljbGUgcmVnaXN0ZXIgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DWUNMRShjcyksCisJCSAgQVQ5MV9TTUNfTldFQ1lDTEVfKGNvbmZpZy0+d3JpdGVfY3ljbGUpCisJCXwgQVQ5MV9TTUNfTlJEQ1lDTEVfKGNvbmZpZy0+cmVhZF9jeWNsZSkKKwkpOworCisJLyogTW9kZSByZWdpc3RlciAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX01PREUoY3MpLAorCQkgIGNvbmZpZy0+bW9kZQorCQl8IEFUOTFfU01DX1RERl8oY29uZmlnLT50ZGZfY3ljbGVzKQorCSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvc2FtOV9zbWMuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zYW05X3NtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzJjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvc2FtOV9zbWMuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1hdDkxL3NhbTlfc21jLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmRyZXcgVmljdG9yCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCitzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIHsKKwkvKiBTZXR1cCByZWdpc3RlciAqLworCXU4IG5jc19yZWFkX3NldHVwOworCXU4IG5yZF9zZXR1cDsKKwl1OCBuY3Nfd3JpdGVfc2V0dXA7CisJdTggbndlX3NldHVwOworCisJLyogUHVsc2UgcmVnaXN0ZXIgKi8KKwl1OCBuY3NfcmVhZF9wdWxzZTsKKwl1OCBucmRfcHVsc2U7CisJdTggbmNzX3dyaXRlX3B1bHNlOworCXU4IG53ZV9wdWxzZTsKKworCS8qIEN5Y2xlIHJlZ2lzdGVyICovCisJdTE2IHJlYWRfY3ljbGU7CisJdTE2IHdyaXRlX2N5Y2xlOworCisJLyogTW9kZSByZWdpc3RlciAqLworCXUzMiBtb2RlOworCXU4IHRkZl9jeWNsZXM6NDsKK307CisKK2V4dGVybiB2b2lkIF9faW5pdCBzYW05X3NtY19jb25maWd1cmUoaW50IGNzLCBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnKiBjb25maWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2MjBlOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk3LDE5OTggUnVzc2VsbCBLaW5nCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvaW8uaAppbmRleCA0Yzg0NDAwLi4yZTBiM2NlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIwLDEyICsyMCwxMCBAQAogI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICiAjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCiAKLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQotI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAogLyoKICAqIFdlIGRvbid0IHN1cHBvcnQgaW5zW2xiXS9vdXRzW2xiXS4gIE1ha2UgdGhlbSBmYXVsdC4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOThlYzMwYy4uZTUyMmIyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTI2LDI1ICsyNiw3IEBACiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHhjMDAwMDAwMCkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICogICAgICAgICAgICAgIGFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ0RCODk3MTIpCi0KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoeCkKLQotI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FSQ0hfQVVUQ1BVMTIpCi0KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoeCkKLQotI2Vsc2UKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9DREI4OTcxMikgJiYgIWRlZmluZWQgKENPTkZJR19BUkNIX0FVVENQVTEyKQogCiAjZGVmaW5lIF9fdmlydF90b19idXMoeCkJKCh4KSAtIFBBR0VfT0ZGU0VUKQogI2RlZmluZSBfX2J1c190b192aXJ0KHgpCSgoeCkgKyBQQUdFX09GRlNFVCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ4ZWJkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgotIwotCi0jIE9iamVjdCBmaWxlIGxpc3RzLgotCi1vYmoteQkJCTo9IGNvcmUubwotb2JqLW0JCQk6PQotb2JqLW4JCQk6PQotb2JqLQkJCTo9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvTWFrZWZpbGUuYm9vdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNjUwNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSAgIHpyZWxhZGRyLXkJOj0gMHgxMDAwODAwMAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTI0N2MwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk4IFJ1c3NlbGwgS2luZwotICogIENvcHlyaWdodCAoQykgMTk5OSBOZXh1cyBFbGVjdHJvbmljcyBMdGQKLSAqCi0gKiBFeHRyYSBNTSByb3V0aW5lcyBmb3IgQ0w3NTAwIGFyY2hpdGVjdHVyZQotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi11bnNpZ25lZCBpbnQgdnJhbV9zaXplOwotCi1zdGF0aWMgdm9pZCBjbDc1MDBfYWNrX2lycV9hKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHZhbCwgbWFzazsKLQotCW1hc2sgPSAxIDw8IGlycTsKLQl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0EpOwotCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tBKTsKLQlpb21kX3dyaXRlYihtYXNrLCBJT01EX0lSUUNMUkEpOwotfQotCi1zdGF0aWMgdm9pZCBjbDc1MDBfbWFza19pcnFfYSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7Ci0KLQltYXNrID0gMSA8PCBpcnE7Ci0JdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tBKTsKLQlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9JUlFNQVNLQSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsNzUwMF91bm1hc2tfaXJxX2EodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOwotCi0JbWFzayA9IDEgPDwgaXJxOwotCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQSk7Ci0JaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLQSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfYV9jaGlwID0gewotCS5hY2sJPSBjbDc1MDBfYWNrX2lycV9hLAotCS5tYXNrCT0gY2w3NTAwX21hc2tfaXJxX2EsCi0JLnVubWFzawk9IGNsNzUwMF91bm1hc2tfaXJxX2EsCi19OwotCi1zdGF0aWMgdm9pZCBjbDc1MDBfbWFza19pcnFfYih1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7Ci0KLQltYXNrID0gMSA8PCAoaXJxICYgNyk7Ci0JdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tCKTsKLQlpb21kX3dyaXRlYih2YWwgJiB+bWFzaywgSU9NRF9JUlFNQVNLQik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsNzUwMF91bm1hc2tfaXJxX2IodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOwotCi0JbWFzayA9IDEgPDwgKGlycSAmIDcpOwotCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQik7Ci0JaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLQik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfYl9jaGlwID0gewotCS5hY2sJPSBjbDc1MDBfbWFza19pcnFfYiwKLQkubWFzawk9IGNsNzUwMF9tYXNrX2lycV9iLAotCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9iLAotfTsKLQotc3RhdGljIHZvaWQgY2w3NTAwX21hc2tfaXJxX2ModW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrOwotCi0JbWFzayA9IDEgPDwgKGlycSAmIDcpOwotCXZhbCA9IGlvbWRfcmVhZGIoSU9NRF9JUlFNQVNLQyk7Ci0JaW9tZF93cml0ZWIodmFsICYgfm1hc2ssIElPTURfSVJRTUFTS0MpOwotfQotCi1zdGF0aWMgdm9pZCBjbDc1MDBfdW5tYXNrX2lycV9jKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHZhbCwgbWFzazsKLQotCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKLQl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0MpOwotCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfSVJRTUFTS0MpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGNscHM3NTAwX2NfY2hpcCA9IHsKLQkuYWNrCT0gY2w3NTAwX21hc2tfaXJxX2MsCi0JLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfYywKLQkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfYywKLX07Ci0KLXN0YXRpYyB2b2lkIGNsNzUwMF9tYXNrX2lycV9kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHZhbCwgbWFzazsKLQotCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKLQl2YWwgPSBpb21kX3JlYWRiKElPTURfSVJRTUFTS0QpOwotCWlvbWRfd3JpdGViKHZhbCAmIH5tYXNrLCBJT01EX0lSUU1BU0tEKTsKLX0KLQotc3RhdGljIHZvaWQgY2w3NTAwX3VubWFza19pcnFfZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7Ci0KLQltYXNrID0gMSA8PCAoaXJxICYgNyk7Ci0JdmFsID0gaW9tZF9yZWFkYihJT01EX0lSUU1BU0tEKTsKLQlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tEKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjbHBzNzUwMF9kX2NoaXAgPSB7Ci0JLmFjawk9IGNsNzUwMF9tYXNrX2lycV9kLAotCS5tYXNrCT0gY2w3NTAwX21hc2tfaXJxX2QsCi0JLnVubWFzawk9IGNsNzUwMF91bm1hc2tfaXJxX2QsCi19OwotCi1zdGF0aWMgdm9pZCBjbDc1MDBfbWFza19pcnFfZG1hKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHZhbCwgbWFzazsKLQotCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKLQl2YWwgPSBpb21kX3JlYWRiKElPTURfRE1BTUFTSyk7Ci0JaW9tZF93cml0ZWIodmFsICYgfm1hc2ssIElPTURfRE1BTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsNzUwMF91bm1hc2tfaXJxX2RtYSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7Ci0KLQltYXNrID0gMSA8PCAoaXJxICYgNyk7Ci0JdmFsID0gaW9tZF9yZWFkYihJT01EX0RNQU1BU0spOwotCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRE1BTUFTSyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfZG1hX2NoaXAgPSB7Ci0JLmFjawk9IGNsNzUwMF9tYXNrX2lycV9kbWEsCi0JLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZG1hLAotCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9kbWEsCi19OwotCi1zdGF0aWMgdm9pZCBjbDc1MDBfbWFza19pcnFfZmlxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHZhbCwgbWFzazsKLQotCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKLQl2YWwgPSBpb21kX3JlYWRiKElPTURfRklRTUFTSyk7Ci0JaW9tZF93cml0ZWIodmFsICYgfm1hc2ssIElPTURfRklRTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsNzUwMF91bm1hc2tfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCB2YWwsIG1hc2s7Ci0KLQltYXNrID0gMSA8PCAoaXJxICYgNyk7Ci0JdmFsID0gaW9tZF9yZWFkYihJT01EX0ZJUU1BU0spOwotCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRklRTUFTSyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfZmlxX2NoaXAgPSB7Ci0JLmFjawk9IGNsNzUwMF9tYXNrX2lycV9maXEsCi0JLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZmlxLAotCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9maXEsCi19OwotCi1zdGF0aWMgdm9pZCBjbDc1MDBfbm9fYWN0aW9uKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfbm9fY2hpcCA9IHsKLQkuYWNrCT0gY2w3NTAwX25vX2FjdGlvbiwKLQkubWFzawk9IGNsNzUwMF9ub19hY3Rpb24sCi0JLnVubWFzawk9IGNsNzUwMF9ub19hY3Rpb24sCi19OwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnFfaXNhID0gewotCS5oYW5kbGVyID0gbm9fYWN0aW9uLAotCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKLQkubmFtZSA9ICJpc2EiLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3NTAwX2luaXRfaXJxKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGlycSwgZmxhZ3M7Ci0KLQlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tBKTsKLQlpb21kX3dyaXRlYigwLCBJT01EX0lSUU1BU0tCKTsKLQlpb21kX3dyaXRlYigwLCBJT01EX0ZJUU1BU0spOwotCWlvbWRfd3JpdGViKDAsIElPTURfRE1BTUFTSyk7Ci0KLQlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7Ci0JCWZsYWdzID0gSVJRRl9WQUxJRDsKLQotCQlpZiAoaXJxIDw9IDYgfHwgKGlycSA+PSA5ICYmIGlycSA8PSAxNSkgfHwKLQkJICAgIChpcnEgPj0gNDggJiYgaXJxIDw9IDU1KSkKLQkJCWZsYWdzIHw9IElSUUZfUFJPQkU7Ci0KLQkJc3dpdGNoIChpcnEpIHsKLQkJY2FzZSAwIC4uLiA3OgotCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX2FfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7Ci0JCQlicmVhazsKLQotCQljYXNlIDggLi4uIDE1OgotCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX2JfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7Ci0JCQlicmVhazsKLQotCQljYXNlIDE2IC4uLiAyMjoKLQkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9kbWFfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7Ci0JCQlicmVhazsKLQotCQljYXNlIDI0IC4uLiAzMToKLQkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9jX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSA0MCAuLi4gNDc6Ci0JCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfZF9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwotCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgNDggLi4uIDU1OgotCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX25vX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSA2NCAuLi4gNzI6Ci0JCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfZmlxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzZXR1cF9pcnEoSVJRX0lTQSwgJmlycV9pc2EpOwotfQotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNsNzUwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7IAkvKiBJTyBzcGFjZQkqLwotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKUlPX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihJT19TVEFSVCksCi0JCS5sZW5ndGgJCT0gSU9fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfSwgewkvKiBJU0Egc3BhY2UJKi8KLQkJLnZpcnR1YWwJPSBJU0FfQkFTRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElTQV9TVEFSVCksCi0JCS5sZW5ndGgJCT0gSVNBX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsJLyogRmxhc2gJKi8KLQkJLnZpcnR1YWwJPSBDTFBTNzUwMF9GTEFTSF9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQ0xQUzc1MDBfRkxBU0hfU1RBUlQpLAotCQkubGVuZ3RoCQk9IENMUFM3NTAwX0ZMQVNIX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsJLyogTEVECQkqLwotCQkudmlydHVhbAk9IExFRF9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oTEVEX1NUQVJUKSwKLQkJLmxlbmd0aAkJPSBMRURfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3NTAwX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChjbDc1MDBfaW9fZGVzYywgQVJSQVlfU0laRShjbDc1MDBfaW9fZGVzYykpOwotfQotCi1leHRlcm4gdm9pZCBpb2N0aW1lX2luaXQodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpb2NfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKTsKLQotc3RhdGljIGlycXJldHVybl90Ci1jbHBzNzUwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXRpbWVyX3RpY2soKTsKLQotCS8qIFdoeSBub3QgdXNpbmcgZG9fbGVkcyBpbnRlcmZhY2U/PyAqLwotCXsKLQkJLyogVHdpbmtsZSB0aGUgbGlnaHRzLiAqLwotCQlzdGF0aWMgaW50IGNvdW50LCBzdGF0ZSA9IDB4ZmYwMDsKLQkJaWYgKGNvdW50LS0gPT0gMCkgewotCQkJc3RhdGUgXj0gMHgxMDA7Ci0JCQljb3VudCA9IDI1OwotCQkJKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopTEVEX0FERFJFU1MpID0gc3RhdGU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNscHM3NTAwX3RpbWVyX2lycSA9IHsKLQkubmFtZQkJPSAiQ0xQUzc1MDAgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5oYW5kbGVyCT0gY2xwczc1MDBfdGltZXJfaW50ZXJydXB0LAotfTsKLQotLyoKLSAqIFNldCB1cCB0aW1lciBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzUwMF90aW1lcl9pbml0KHZvaWQpCi17Ci0JaW9jdGltZV9pbml0KCk7Ci0Jc2V0dXBfaXJxKElSUV9USU1FUiwgJmNscHM3NTAwX3RpbWVyX2lycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGNscHM3NTAwX3RpbWVyID0gewotCS5pbml0CQk9IGNscHM3NTAwX3RpbWVyX2luaXQsCi0JLm9mZnNldAkJPSBpb2NfdGltZXJfZ2V0dGltZW9mZnNldCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKLQl7Ci0JCS5tYXBiYXNlCT0gMHgwMzAxMGZlMCwKLQkJLmlycQkJPSAxMCwKLQkJLnVhcnRjbGsJPSAxODQzMjAwLAotCQkucmVnc2hpZnQJPSAyLAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCB8IFVQRl9TS0lQX1RFU1QsCi0JfSwKLQl7Ci0JCS5tYXBiYXNlCT0gMHgwMzAxMGJlMCwKLQkJLmlycQkJPSAwLAotCQkudWFydGNsawk9IDE4NDMyMDAsCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQIHwgVVBGX1NLSVBfVEVTVCwKLQl9LAotCXsKLQkJLmlvYmFzZQkJPSBJU0FTTE9UX0lPICsgMHgyZTgsCi0JCS5pcnEJCT0gNDEsCi0JCS51YXJ0Y2xrCT0gMTg0MzIwMCwKLQkJLnJlZ3NoaWZ0CT0gMCwKLQkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCi0JfSwKLQl7Ci0JCS5pb2Jhc2UJCT0gSVNBU0xPVF9JTyArIDB4M2U4LAotCQkuaXJxCQk9IDQwLAotCQkudWFydGNsawk9IDE4NDMyMDAsCi0JCS5yZWdzaGlmdAk9IDAsCi0JCS5pb3R5cGUJCT0gVVBJT19QT1JULAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAotCX0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKLQkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3NTAwX2luaXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNlcmlhbF9kZXZpY2UpOwotfQotCi1NQUNISU5FX1NUQVJUKENMUFM3NTAwLCAiQ0wtUFM3NTAwIikKLQkvKiBNYWludGFpbmVyOiBQaGlsaXAgQmx1bmRlbGwgKi8KLQkucGh5c19pbwk9IDB4MDMwMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLm1hcF9pbwkJPSBjbHBzNzUwMF9tYXBfaW8sCi0JLmluaXRfaXJxCT0gY2xwczc1MDBfaW5pdF9pcnEsCi0JLmluaXRfbWFjaGluZQk9IGNscHM3NTAwX2luaXQsCi0JLnRpbWVyCQk9ICZjbHBzNzUwMF90aW1lciwKLU1BQ0hJTkVfRU5ECi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2Fjb3JuZmIuaCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2Fjb3JuZmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhNjMzMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9hY29ybmZiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jZGVmaW5lIGFjb3JuZmJfdmFsaWRfcGl4cmF0ZSh2YXIpICh2YXItPnBpeGNsb2NrID49IDM5MzI1ICYmIHZhci0+cGl4Y2xvY2sgPD0gNDAxMTkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotYWNvcm5mYl92aWRjMjBfZmluZF9yYXRlcyhzdHJ1Y3QgdmlkY190aW1pbmcgKnZpZGMsCi0JCQkgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQotewotCXVfaW50IGJhbmR3aWR0aDsKLSAgCi0JdmlkYy0+Y29udHJvbCB8PSBWSURDMjBfQ1RSTF9QSVhfQ0s7Ci0KLQkvKiBDYWxjdWxhdGUgYmFuZHdpZHRoICovCi0JYmFuZHdpZHRoID0gdmFyLT5waXhjbG9jayAqIDggLyB2YXItPmJpdHNfcGVyX3BpeGVsOwotCi0JLyogRW5jb2RlIGJhbmR3aWR0aCBhcyBWSURDMjAgc2V0dGluZyAqLwotCWlmIChiYW5kd2lkdGggPiAxNjY2NyoyKQotCQl2aWRjLT5jb250cm9sIHw9IFZJREMyMF9DVFJMX0ZJRk9fMTY7Ci0JZWxzZSBpZiAoYmFuZHdpZHRoID4gMTMzMzMqMikKLQkJdmlkYy0+Y29udHJvbCB8PSBWSURDMjBfQ1RSTF9GSUZPXzIwOwotCWVsc2UgaWYgKGJhbmR3aWR0aCA+IDExMTExKjIpCi0JCXZpZGMtPmNvbnRyb2wgfD0gVklEQzIwX0NUUkxfRklGT18yNDsKLQllbHNlCi0JCXZpZGMtPmNvbnRyb2wgfD0gVklEQzIwX0NUUkxfRklGT18yODsKLQotCXZpZGMtPnBsbF9jdGwgID0gMHgyMDIwOwotfQotCi0jaWZkZWYgQ09ORklHX0NIUk9OVEVMXzcwMDMKLSNkZWZpbmUgYWNvcm5mYl9kZWZhdWx0X2NvbnRyb2woKQlWSURDMjBfQ1RSTF9QSVhfSENMSwotI2Vsc2UKLSNkZWZpbmUgYWNvcm5mYl9kZWZhdWx0X2NvbnRyb2woKQlWSURDMjBfQ1RSTF9QSVhfVkNMSwotI2VuZGlmCi0KLSNkZWZpbmUgYWNvcm5mYl9kZWZhdWx0X2Vjb250cm9sKCkJVklEQzIwX0VDVExfREFDIHwgVklEQzIwX0VDVExfUkVHKDMpIHwgVklEQzIwX0VDVExfRUNLCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0MTA0ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwotICoKLSAqIERlYnVnZ2luZyBtYWNybyBpbmNsdWRlIGhlYWRlcgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OSBSdXNzZWxsIEtpbmcKLSAqICBNb3ZlZCBmcm9tIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9kZWJ1Zy5TIGJ5IEJlbiBEb29rcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotKi8KLQotCQkubWFjcm8JYWRkcnVhcnQscngKLQkJbW92CVxyeCwgIzB4ZTAwMDAwMDAKLQkJb3JyCVxyeCwgXHJ4LCAjMHgwMDAxMDAwMAotCQlvcnIJXHJ4LCBccngsICMweDAwMDAwYmUwCi0JCS5lbmRtCi0KLSNkZWZpbmUgVUFSVF9TSElGVAkyCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYnVnLTgyNTAuUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmNkZTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgTmV4dXMgRWxlY3Ryb25pY3MgTHRkLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLS8qIERNQSBpcyBub3QgeWV0IGltcGxlbWVudGVkISBJdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgYWNvcm4sIGNvcHkgb3Zlci4uICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCi0gKiBUaGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAoMHhkMDAwMDAwMCAtIDB4YzAwMDAwMDApCi0gKiBieXRlcyBvZiBSQU0uCi0gKi8KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkweGQwMDAwMDAwCi0KLSNkZWZpbmUgRE1BX1MwCQkJMAotCi0jZW5kaWYgLyogX0FTTV9BUkNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZTU0MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZW50cnktbWFjcm8taW9tZC5TPgotCi0JLmVxdQlpb2NfYmFzZV9oaWdoLCBJT0NfQkFTRSAmIDB4ZmYwMDAwMDAKLQkuZXF1CWlvY19iYXNlX2xvdywgSU9DX0JBU0UgJiAweDAwZmYwMDAwCi0KLQkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCi0JbW92CVxiYXNlLCAjaW9jX2Jhc2VfaGlnaAkJQCBwb2ludCBhdCBJT0MKLQkuaWYJaW9jX2Jhc2VfbG93Ci0Jb3JyCVxiYXNlLCBcYmFzZSwgI2lvY19iYXNlX2xvdwotCS5lbmRpZgotCS5lbmRtCi0KLQkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKLQkuZW5kbQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZDFkNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBSdXNzZWxsIEtpbmcuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgTmV4dXMgRWxlY3Ryb25pY3MgTHRkLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgZGVmaW5pdGlvbnMgb2YgdGhlIAotICogQ0w3NTAwIGV2YWx1YXRpb24gYm9hcmQuCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAotCi0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgotCi0jaWZkZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIElPTUVNKHgpIHgKLSNlbHNlCi0jZGVmaW5lIElPTUVNKHgpICgodm9pZCBfX2lvbWVtICopKHgpKQotI2VuZGlmCi0KLS8qCi0gKiBXaGF0IGhhcmR3YXJlIG11c3QgYmUgcHJlc2VudAotICovCi0jZGVmaW5lIEhBU19JT01ECi0jZGVmaW5lIEhBU19WSURDMjAKLQotLyogSGFyZHdhcmUgYWRkcmVzc2VzIG9mIG1ham9yIGFyZWFzLgotICogICpfU1RBUlQgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKLSAqICAqX1NJWkUgIGlzIHRoZSBzaXplIG9mIHRoZSByZWdpb24KLSAqICAqX0JBU0UgIGlzIHRoZSB2aXJ0dWFsIGFkZHJlc3MKLSAqLwotCi0jZGVmaW5lIElPX1NUQVJUCQkweDAzMDAwMDAwCS8qIEkvTyAqLwotI2RlZmluZSBJT19TSVpFCQkJMHgwMTAwMDAwMAotI2RlZmluZSBJT19CQVNFCQkJSU9NRU0oMHhlMDAwMDAwMCkKLQotI2RlZmluZSBJU0FfU1RBUlQJCTB4MGMwMDAwMDAJLyogSVNBICovCi0jZGVmaW5lIElTQV9TSVpFCQkweDAwMDEwMDAwCi0jZGVmaW5lIElTQV9CQVNFCQkweGUxMDAwMDAwCi0KLSNkZWZpbmUgQ0xQUzc1MDBfRkxBU0hfU1RBUlQJMHgwMTAwMDAwMAkvKiBYWFggKi8KLSNkZWZpbmUgQ0xQUzc1MDBfRkxBU0hfU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lIENMUFM3NTAwX0ZMQVNIX0JBU0UJMHhlMjAwMDAwMAotCi0jZGVmaW5lIExFRF9TVEFSVAkJMHgwMzAyQjAwMAotI2RlZmluZSBMRURfU0laRQkJMHgwMDAwMTAwMAotI2RlZmluZSBMRURfQkFTRQkJMHhlMzAwMDAwMAotI2RlZmluZSBMRURfQUREUkVTUwkJKExFRF9CQVNFICsgMHhhMDApCi0KLS8qIExldCdzIGRlZmluZSBTQ1JFRU5fU1RBUlQgZm9yIENMNzUwMCwgZXZlbiB0aG91Z2ggaXQncyBhIGxpZS4gKi8KLSNkZWZpbmUgU0NSRUVOX1NUQVJUCQkweDAyMDAwMDAwCS8qIFZSQU0gKi8KLSNkZWZpbmUgU0NSRUVOX0VORAkJMHhkZmMwMDAwMAotI2RlZmluZSBTQ1JFRU5fQkFTRQkJMHhkZjgwMDAwMAotCi0jZGVmaW5lIFZJRENfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZTA0MDAwMDAKLSNkZWZpbmUgSU9NRF9CQVNFCQlJT01FTSgweGUwMjAwMDAwKQotI2RlZmluZSBJT0NfQkFTRQkJSU9NRU0oMHhlMDIwMDAwMCkKLSNkZWZpbmUgRkxPUFBZRE1BX0JBU0UJCUlPTUVNKDB4ZTAwMmEwMDApCi0jZGVmaW5lIFBDSU9fQkFTRQkJSU9NRU0oMHhlMDAxMDAwMCkKLQotI2RlZmluZSB2aWRjX3dyaXRlbCh2YWwpCV9fcmF3X3dyaXRlbCh2YWwsIFZJRENfQkFTRSkKLQotLyogaW4vb3V0IGJpYXMgZm9yIHRoZSBJU0Egc2xvdCByZWdpb24gKi8KLSNkZWZpbmUgSVNBU0xPVF9JTwkJMHg4MDQwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYyODYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lvLmgKLSAqICBmcm9tIGFyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pby5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3IFJ1c3NlbGwgS2luZwotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiAgMDYtRGVjLTE5OTcJUk1LCUNyZWF0ZWQuCi0gKi8KLSNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAotI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgotCi0vKgotICogR0NDIGlzIHRvdGFsbHkgY3JhcCBhdCBsb2FkaW5nL3N0b3JpbmcgZGF0YS4gIFdlIHRyeSB0byBwZXJzdWFkZSBpdAotICogdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGJ5IHVzaW5nIHRoZXNlIHdoZXJlZXZlciBwb3NzaWJsZSBpbnN0ZWFkIG9mCi0gKiB0aGUgYWJvdmUuCi0gKi8KLSNkZWZpbmUgX19hcmNoX2Jhc2VfZ2V0YihiLG8pCQkJXAotICh7CQkJCQkJXAotCXVuc2lnbmVkIGludCB2LCByID0gKGIpOwkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJImxkcmIJJTAsIFslMSwgJTJdIgkJXAotCQk6ICI9ciIgKHYpCQkJXAotCQk6ICJyIiAociksICJJciIgKG8pKTsJCVwKLQl2OwkJCQkJXAotIH0pCi0KLSNkZWZpbmUgX19hcmNoX2Jhc2VfZ2V0bChiLG8pCQkJXAotICh7CQkJCQkJXAotCXVuc2lnbmVkIGludCB2LCByID0gKGIpOwkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJImxkcgklMCwgWyUxLCAlMl0iCQlcCi0JCTogIj1yIiAodikJCQlcCi0JCTogInIiIChyKSwgIklyIiAobykpOwkJXAotCXY7CQkJCQlcCi0gfSkKLQotI2RlZmluZSBfX2FyY2hfYmFzZV9wdXRiKHYsYixvKQkJCVwKLSAoewkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgciA9IChiKTsJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAotCQkic3RyYgklMCwgWyUxLCAlMl0iCQlcCi0JCToJCQkJXAotCQk6ICJyIiAodiksICJyIiAociksICJJciIgKG8pKTsJXAotIH0pCi0KLSNkZWZpbmUgX19hcmNoX2Jhc2VfcHV0bCh2LGIsbykJCQlcCi0gKHsJCQkJCQlcCi0JdW5zaWduZWQgaW50IHIgPSAoYik7CQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJInN0cgklMCwgWyUxLCAlMl0iCQlcCi0JCToJCQkJXAotCQk6ICJyIiAodiksICJyIiAociksICJJciIgKG8pKTsJXAotIH0pCi0KLS8qCi0gKiBXZSB1c2UgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBhZGRyZXNzaW5nIC0gUEMgc3R5bGUgYWRkcmVzc2VzLCBhbmQgQVJNCi0gKiBhZGRyZXNzZXMuICBQQyBzdHlsZSBhY2Nlc3NlcyB0aGUgUEMgaGFyZHdhcmUgd2l0aCB0aGUgbm9ybWFsIFBDIElPCi0gKiBhZGRyZXNzZXMsIGVnIDB4M2Y4IGZvciBzZXJpYWwjMS4gIEFSTSBhZGRyZXNzZXMgYXJlIDB4ODAwMDAwMDArCi0gKiBhbmQgYXJlIHRyYW5zbGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIElPLiAgTm90ZSB0aGF0IGFsbCBhZGRyZXNzZXMgYXJlCi0gKiBzaGlmdGVkIGxlZnQhCi0gKi8KLSNkZWZpbmUgX19QT1JUX1BDSU8oeCkJKCEoKHgpICYgMHg4MDAwMDAwMCkpCi0KLS8qCi0gKiBEeW5hbWljIElPIGZ1bmN0aW9ucyAtIGxldCB0aGUgY29tcGlsZXIKLSAqIG9wdGltaXplIHRoZSBleHByZXNzaW9ucwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRiICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBwb3J0KQotewotCXVuc2lnbmVkIGxvbmcgdGVtcDsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkidHN0CSUyLCAjMHg4MDAwMDAwMFxuXHQiCi0JIm1vdgklMCwgJTRcblx0IgotCSJhZGRlcQklMCwgJTAsICUzXG5cdCIKLQkic3RyYgklMSwgWyUwLCAlMiwgbHNsICMyXQlAIG91dGIiCi0JOiAiPSZyIiAodGVtcCkKLQk6ICJyIiAodmFsdWUpLCAiciIgKHBvcnQpLCAiSXIiIChQQ0lPX0JBU0UgLSBJT19CQVNFKSwgIklyIiAoSU9fQkFTRSkKLQk6ICJjYyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXR3ICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBwb3J0KQotewotCXVuc2lnbmVkIGxvbmcgdGVtcDsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkidHN0CSUyLCAjMHg4MDAwMDAwMFxuXHQiCi0JIm1vdgklMCwgJTRcblx0IgotCSJhZGRlcQklMCwgJTAsICUzXG5cdCIKLQkic3RyCSUxLCBbJTAsICUyLCBsc2wgIzJdCUAgb3V0dyIKLQk6ICI9JnIiICh0ZW1wKQotCTogInIiICh2YWx1ZXx2YWx1ZTw8MTYpLCAiciIgKHBvcnQpLCAiSXIiIChQQ0lPX0JBU0UgLSBJT19CQVNFKSwgIklyIiAoSU9fQkFTRSkKLQk6ICJjYyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vdXRsICh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBwb3J0KQotewotCXVuc2lnbmVkIGxvbmcgdGVtcDsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkidHN0CSUyLCAjMHg4MDAwMDAwMFxuXHQiCi0JIm1vdgklMCwgJTRcblx0IgotCSJhZGRlcQklMCwgJTAsICUzXG5cdCIKLQkic3RyCSUxLCBbJTAsICUyLCBsc2wgIzJdCUAgb3V0bCIKLQk6ICI9JnIiICh0ZW1wKQotCTogInIiICh2YWx1ZSksICJyIiAocG9ydCksICJJciIgKFBDSU9fQkFTRSAtIElPX0JBU0UpLCAiSXIiIChJT19CQVNFKQotCTogImNjIik7Ci19Ci0KLSNkZWZpbmUgREVDTEFSRV9EWU5fSU4oc3osZm5zdWZmaXgsaW5zdHIpCQkJCQlcCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHN6IF9faW4jI2Zuc3VmZml4ICh1bnNpZ25lZCBpbnQgcG9ydCkJCVwKLXsJCQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgdGVtcCwgdmFsdWU7CQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCQlcCi0JInRzdAklMiwgIzB4ODAwMDAwMDBcblx0IgkJCQkJCVwKLQkibW92CSUwLCAlNFxuXHQiCQkJCQkJCVwKLQkiYWRkZXEJJTAsICUwLCAlM1xuXHQiCQkJCQkJCVwKLQkibGRyIiBpbnN0ciAiCSUxLCBbJTAsICUyLCBsc2wgIzJdCUAgaW4iICNmbnN1ZmZpeAkJCVwKLQk6ICI9JnIiICh0ZW1wKSwgIj1yIiAodmFsdWUpCQkJCQkJXAotCTogInIiIChwb3J0KSwgIklyIiAoUENJT19CQVNFIC0gSU9fQkFTRSksICJJciIgKElPX0JBU0UpCQlcCi0JOiAiY2MiKTsJCQkJCQkJCVwKLQlyZXR1cm4gKHVuc2lnbmVkIHN6KXZhbHVlOwkJCQkJCVwKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19pb2FkZHIgKHVuc2lnbmVkIGludCBwb3J0KQkJCVwKLXsJCQkJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTyhwb3J0KSkJCQkJCQkJXAotCQlyZXR1cm4gKHVuc2lnbmVkIGludCkoUENJT19CQVNFICsgKHBvcnQgPDwgMikpOwkJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlyZXR1cm4gKHVuc2lnbmVkIGludCkoSU9fQkFTRSArIChwb3J0IDw8IDIpKTsJCQlcCi19Ci0KLSNkZWZpbmUgREVDTEFSRV9JTyhzeixmbnN1ZmZpeCxpbnN0cikJXAotCURFQ0xBUkVfRFlOX0lOKHN6LGZuc3VmZml4LGluc3RyKQotCi1ERUNMQVJFX0lPKGNoYXIsYiwiYiIpCi1ERUNMQVJFX0lPKHNob3J0LHcsIiIpCi1ERUNMQVJFX0lPKGludCxsLCIiKQotCi0jdW5kZWYgREVDTEFSRV9JTwotI3VuZGVmIERFQ0xBUkVfRFlOX0lOCi0KLS8qCi0gKiBDb25zdGFudCBhZGRyZXNzIElPIGZ1bmN0aW9ucwotICoKLSAqIFRoZXNlIGhhdmUgdG8gYmUgbWFjcm9zIGZvciB0aGUgJ0onIGNvbnN0cmFpbnQgdG8gd29yayAtCi0gKiArLy00MDk2IGltbWVkaWF0ZSBvcGVyYW5kLgotICovCi0jZGVmaW5lIF9fb3V0YmModmFsdWUscG9ydCkJCQkJCQkJXAotKHsJCQkJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkic3RyYgklMCwgWyUxLCAlMl0JQCBvdXRiYyIJCQkJXAotCQk6IDogInIiICh2YWx1ZSksICJyIiAoUENJT19CQVNFKSwgIkpyIiAoKHBvcnQpIDw8IDIpKTsJCVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJzdHJiCSUwLCBbJTEsICUyXQlAIG91dGJjIgkJCQlcCi0JCTogOiAiciIgKHZhbHVlKSwgInIiIChJT19CQVNFKSwgInIiICgocG9ydCkgPDwgMikpOwkJXAotfSkKLQotI2RlZmluZSBfX2luYmMocG9ydCkJCQkJCQkJCVwKLSh7CQkJCQkJCQkJCVwKLQl1bnNpZ25lZCBjaGFyIHJlc3VsdDsJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkibGRyYgklMCwgWyUxLCAlMl0JQCBpbmJjIgkJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKFBDSU9fQkFTRSksICJKciIgKChwb3J0KSA8PCAyKSk7CQlcCi0JZWxzZQkJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkibGRyYgklMCwgWyUxLCAlMl0JQCBpbmJjIgkJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKElPX0JBU0UpLCAiciIgKChwb3J0KSA8PCAyKSk7CQlcCi0JcmVzdWx0OwkJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19vdXR3Yyh2YWx1ZSxwb3J0KQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyB2ID0gdmFsdWU7CQkJCQkJXAotCWlmIChfX1BPUlRfUENJTygocG9ydCkpKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkic3RyCSUwLCBbJTEsICUyXQlAIG91dHdjIgkJCQlcCi0JCTogOiAiciIgKHZ8djw8MTYpLCAiciIgKFBDSU9fQkFTRSksICJKciIgKChwb3J0KSA8PCAyKSk7CVwKLQllbHNlCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJzdHIJJTAsIFslMSwgJTJdCUAgb3V0d2MiCQkJCVwKLQkJOiA6ICJyIiAodnx2PDwxNiksICJyIiAoSU9fQkFTRSksICJyIiAoKHBvcnQpIDw8IDIpKTsJCVwKLX0pCi0KLSNkZWZpbmUgX19pbndjKHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgc2hvcnQgcmVzdWx0OwkJCQkJCQlcCi0JaWYgKF9fUE9SVF9QQ0lPKChwb3J0KSkpCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JCSJsZHIJJTAsIFslMSwgJTJdCUAgaW53YyIJCQkJCVwKLQkJOiAiPXIiIChyZXN1bHQpIDogInIiIChQQ0lPX0JBU0UpLCAiSnIiICgocG9ydCkgPDwgMikpOwkJXAotCWVsc2UJCQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJImxkcgklMCwgWyUxLCAlMl0JQCBpbndjIgkJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKElPX0JBU0UpLCAiciIgKChwb3J0KSA8PCAyKSk7CQlcCi0JcmVzdWx0ICYgMHhmZmZmOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fb3V0bGModmFsdWUscG9ydCkJCQkJCQkJXAotKHsJCQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgdiA9IHZhbHVlOwkJCQkJCVwKLQlpZiAoX19QT1JUX1BDSU8oKHBvcnQpKSkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJInN0cgklMCwgWyUxLCAlMl0JQCBvdXRsYyIJCQkJXAotCQk6IDogInIiICh2KSwgInIiIChQQ0lPX0JBU0UpLCAiSnIiICgocG9ydCkgPDwgMikpOwkJXAotCWVsc2UJCQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJInN0cgklMCwgWyUxLCAlMl0JQCBvdXRsYyIJCQkJXAotCQk6IDogInIiICh2KSwgInIiIChJT19CQVNFKSwgInIiICgocG9ydCkgPDwgMikpOwkJCVwKLX0pCi0KLSNkZWZpbmUgX19pbmxjKHBvcnQpCQkJCQkJCQlcCi0oewkJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyByZXN1bHQ7CQkJCQkJCVwKLQlpZiAoX19QT1JUX1BDSU8oKHBvcnQpKSkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJImxkcgklMCwgWyUxLCAlMl0JQCBpbmxjIgkJCQkJXAotCQk6ICI9ciIgKHJlc3VsdCkgOiAiciIgKFBDSU9fQkFTRSksICJKciIgKChwb3J0KSA8PCAyKSk7CQlcCi0JZWxzZQkJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkibGRyCSUwLCBbJTEsICUyXQlAIGlubGMiCQkJCQlcCi0JCTogIj1yIiAocmVzdWx0KSA6ICJyIiAoSU9fQkFTRSksICJyIiAoKHBvcnQpIDw8IDIpKTsJCVwKLQlyZXN1bHQ7CQkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX2lvYWRkcmMocG9ydCkJCQkJCQkJCVwKLQkoX19QT1JUX1BDSU8oKHBvcnQpKSA/IFBDSU9fQkFTRSArICgocG9ydCkgPDwgMikgOiBJT19CQVNFICsgKChwb3J0KSA8PCAyKSkKLQotI2RlZmluZSBpbmIocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW5iYyhwKSAgICA6IF9faW5iKHApKQotI2RlZmluZSBpbncocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW53YyhwKSAgICA6IF9faW53KHApKQotI2RlZmluZSBpbmwocCkJIAkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW5sYyhwKSAgICA6IF9faW5sKHApKQotI2RlZmluZSBvdXRiKHYscCkJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX291dGJjKHYscCkgOiBfX291dGIodixwKSkKLSNkZWZpbmUgb3V0dyh2LHApCShfX2J1aWx0aW5fY29uc3RhbnRfcCgocCkpID8gX19vdXR3Yyh2LHApIDogX19vdXR3KHYscCkpCi0jZGVmaW5lIG91dGwodixwKQkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9fb3V0bGModixwKSA6IF9fb3V0bCh2LHApKQotI2RlZmluZSBfX2lvYWRkcihwKQkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9faW9hZGRyKHApICA6IF9faW9hZGRyYyhwKSkKLS8qIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZCAqLwotI2RlZmluZSBpb2FkZHIocG9ydCkJCQlfX2lvYWRkcigocG9ydCkpCi0KLSNkZWZpbmUgaW5zYihwLGQsbCkJX19yYXdfcmVhZHNiKF9faW9hZGRyKHApLGQsbCkKLSNkZWZpbmUgaW5zdyhwLGQsbCkJX19yYXdfcmVhZHN3KF9faW9hZGRyKHApLGQsbCkKLQotI2RlZmluZSBvdXRzYihwLGQsbCkJX19yYXdfd3JpdGVzYihfX2lvYWRkcihwKSxkLGwpCi0jZGVmaW5lIG91dHN3KHAsZCxsKQlfX3Jhd193cml0ZXN3KF9faW9hZGRyKHApLGQsbCkKLQotLyoKLSAqIDE6MSBtYXBwaW5nIGZvciBpb3JlbWFwcGVkIHJlZ2lvbnMuCi0gKi8KLSNkZWZpbmUgX19tZW1fcGNpKHgpCSh4KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMmZjZjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaXJxLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgUnVzc2VsbCBLaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDEgTmV4dXMgRWxlY3Ryb25pY3MgTHRkLgotICoKLSAqIENoYW5nZWxvZzoKLSAqICAgMTAtMTAtMTk5NglSTUsJQnJvdWdodCB1cCB0byBkYXRlIHdpdGggYXJjaC1zYTExMGV2YWwKLSAqICAgMjItMDgtMTk5OAlSTUsJUmVzdHJ1Y3R1cmVkIElSUSByb3V0aW5lcwotICogICAxMS0wOC0xOTk5CVBKQglDcmVhdGVkIEFSTTc1MDAgdmVyc2lvbiwgZGVyaXZlZCBmcm9tIFJpc2NQQyBjb2RlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KLQotc3RhdGljIGlubGluZSBpbnQgZml4dXBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSA9PSBJUlFfSVNBKSB7Ci0JCWludCBpc2FiaXRzID0gKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhlMDAyYjcwMCk7Ci0JCWlmIChpc2FiaXRzID09IDApIHsKLQkJCXByaW50aygiU3B1cmlvdXMgSVNBIElSUSFcbiIpOwotCQkJcmV0dXJuIGlycTsKLQkJfQotCQlpcnEgPSBJUlFfSVNBX0JBU0U7Ci0JCXdoaWxlICghKGlzYWJpdHMgJiAxKSkgewotCQkJaXJxKys7Ci0JCQlpc2FiaXRzID4+PSAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIGlycTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL2lycXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNjZiNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaXJxcy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IE5leHVzIEVsZWN0cm9uaWNzIEx0ZAotICovCi0KLSNkZWZpbmUgSVJRX0lOVDIJCTAKLSNkZWZpbmUgSVJRX0lOVDEJCTIKLSNkZWZpbmUgSVJRX1ZTWU5DUFVMU0UJCTMKLSNkZWZpbmUgSVJRX1BPV0VST04JCTQKLSNkZWZpbmUgSVJRX1RJTUVSMAkJNQotI2RlZmluZSBJUlFfVElNRVIxCQk2Ci0jZGVmaW5lIElSUV9GT1JDRQkJNwotI2RlZmluZSBJUlFfSU5UOAkJOAotI2RlZmluZSBJUlFfSVNBCQkJOQotI2RlZmluZSBJUlFfSU5UNgkJMTAKLSNkZWZpbmUgSVJRX0lOVDUJCTExCi0jZGVmaW5lIElSUV9JTlQ0CQkxMgotI2RlZmluZSBJUlFfSU5UMwkJMTMKLSNkZWZpbmUgSVJRX0tFWUJPQVJEVFgJCTE0Ci0jZGVmaW5lIElSUV9LRVlCT0FSRFJYCQkxNQotCi0jZGVmaW5lIElSUV9ETUEwCQkxNgotI2RlZmluZSBJUlFfRE1BMQkJMTcKLSNkZWZpbmUgSVJRX0RNQTIJCTE4Ci0jZGVmaW5lIElSUV9ETUEzCQkxOQotI2RlZmluZSBJUlFfRE1BUzAJCTIwCi0jZGVmaW5lIElSUV9ETUFTMQkJMjEKLQotI2RlZmluZSBJUlFfSU9QMAkJMjQKLSNkZWZpbmUgSVJRX0lPUDEJCTI1Ci0jZGVmaW5lIElSUV9JT1AyCQkyNgotI2RlZmluZSBJUlFfSU9QMwkJMjcKLSNkZWZpbmUgSVJRX0lPUDQJCTI4Ci0jZGVmaW5lIElSUV9JT1A1CQkyOQotI2RlZmluZSBJUlFfSU9QNgkJMzAKLSNkZWZpbmUgSVJRX0lPUDcJCTMxCi0KLSNkZWZpbmUgSVJRX01PVVNFUlgJCTQwCi0jZGVmaW5lIElSUV9NT1VTRVRYCQk0MQotI2RlZmluZSBJUlFfQURDCQkJNDIKLSNkZWZpbmUgSVJRX0VWRU5UMQkJNDMKLSNkZWZpbmUgSVJRX0VWRU5UMgkJNDQKLQotI2RlZmluZSBJUlFfSVNBX0JBU0UJCTQ4Ci0jZGVmaW5lIElSUV9JU0FfMwkJNDgKLSNkZWZpbmUgSVJRX0lTQV80CQk0OQotI2RlZmluZSBJUlFfSVNBXzUJCTUwCi0jZGVmaW5lIElSUV9JU0FfNwkJNTEKLSNkZWZpbmUgSVJRX0lTQV85CQk1MgotI2RlZmluZSBJUlFfSVNBXzEwCQk1MwotI2RlZmluZSBJUlFfSVNBXzExCQk1NAotI2RlZmluZSBJUlFfSVNBXzE0CQk1NQkKLQotI2RlZmluZSBGSVFfSU5UOQkJMAotI2RlZmluZSBGSVFfSU5UNQkJMQotI2RlZmluZSBGSVFfSU5UNgkJNAotI2RlZmluZSBGSVFfSU5UOAkJNgotI2RlZmluZSBGSVFfRk9SQ0UJCTcKLQotLyoKLSAqIFRoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGUgRklRICJJUlEiIG51bWJlcnMKLSAqLwotI2RlZmluZSBGSVFfU1RBUlQJCTY0Ci0KLSNkZWZpbmUgSVJRX1RJTUVSCQlJUlFfVElNRVIwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IzMmRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcuCi0gKgotICogQ2hhbmdlbG9nOgotICogIDIwLU9jdC0xOTk2CVJNSwlDcmVhdGVkCi0gKiAgMzEtRGVjLTE5OTcJUk1LCUZpeGVkIGRlZmluaXRpb25zIHRvIHJlZHVjZSB3YXJuaW5ncwotICogIDExLUphbi0xOTk4CVJNSwlVbmlubGluZWQgdG8gcmVkdWNlIGhpdHMgb24gY2FjaGUKLSAqICAwOC1GZWItMTk5OAlSTUsJQWRkZWQgX192aXJ0X3RvX2J1cyBhbmQgX19idXNfdG9fdmlydAotICogIDIxLU1hci0xOTk5CVJNSwlSZW5hbWVkIHRvIG1lbW9yeS5oCi0gKgkJUk1LCUFkZGVkIFRBU0tfU0laRSBhbmQgUEFHRV9PRkZTRVQKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MTAwMDAwMDApCi0KLS8qCi0gKiBUaGVzZSBhcmUgZXhhY3RseSB0aGUgc2FtZSBvbiB0aGUgUmlzY1BDIGFzIHRoZQotICogcGh5c2ljYWwgbWVtb3J5IHZpZXcuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KSBfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpIF9fcGh5c190b192aXJ0KHgpCi0KLS8qCi0gKiBDYWNoZSBmbHVzaGluZyBhcmVhIC0gUk9NCi0gKi8KLSNkZWZpbmUgRkxVU0hfQkFTRV9QSFlTCQkweDAwMDAwMDAwCi0jZGVmaW5lIEZMVVNIX0JBU0UJCTB4ZGYwMDAwMDAKLQotLyoKLSAqIFNwYXJzZW1lbSBzdXBwb3J0LiAgRWFjaCBzZWN0aW9uIGlzIGEgbWF4aW11bSBvZiA2NE1CLiAgVGhlIHNlY3Rpb25zCi0gKiBhcmUgb2Zmc2V0IGJ5IDEyOE1CIGFuZCBjYW4gY292ZXIgMTI4TUIsIHNvIHRoYXQgZ2l2ZXMgdXMgYSBtYXhpbXVtCi0gKiBvZiAyOSBwaHlzbWVtIGJpdHMuCi0gKi8KLSNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwkyOQotI2RlZmluZSBTRUNUSU9OX1NJWkVfQklUUwkyNgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzI1ZmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmV4dXMgRWxlY3Ryb25pY3MgTHRkLgotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKLSNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCi17Ci0JaW9tZF93cml0ZWIoMCwgSU9NRF9TVVNNT0RFKTsKLX0KLQotI2RlZmluZSBhcmNoX3Jlc2V0KG1vZGUpCQkJXAotCWRvIHsJCQkJCVwKLQkJaW9tZF93cml0ZWIoMCwgSU9NRF9ST01DUjApOwlcCi0JCWNwdV9yZXNldCgwKTsJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvdGltZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhYTliNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC90aW1leC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKLSAqCi0gKiBDTDc1MDAgYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IE5leHVzIEVsZWN0cm9uaWNzIEx0ZAotICovCi0KLS8qCi0gKiBPbiB0aGUgQVJNNzUwMCwgdGhlIGNsb2NrIHRpY2tzIGF0IDJNSHouCi0gKi8KLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkyMDAwMDAwCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkMGFmNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIE5leHVzIEVsZWN0cm9uaWNzIEx0ZC4KLSAqLwotI2RlZmluZSBCQVNFIDB4MDMwMTAwMDAKLSNkZWZpbmUgU0VSQkFTRSAoQkFTRSArICgweDJmOCA8PCAyKSkKLQotc3RhdGljIGlubGluZSB2b2lkIHB1dGMoY2hhciBjKQotewotCXdoaWxlICghKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShTRVJCQVNFICsgMHgxNCkpICYgMHgyMCkpCi0JCWJhcnJpZXIoKTsKLQotCSooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShTRVJCQVNFKSkgPSBjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2godm9pZCkKLXsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhcmNoX2RlY29tcF9zZXR1cCh2b2lkKQotewotCWludCBiYXVkID0gMzY4NjQwMCAvICg5NjAwICogMzIpOwotCi0JKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKFNFUkJBU0UgKyAweEMpKSA9IDB4ODA7Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKFNFUkJBU0UgKyAweDApKSA9IGJhdWQgJiAweGZmOwotCSooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShTRVJCQVNFICsgMHg0KSkgPSAoYmF1ZCAmIDB4ZmYwMCkgPj4gODsKLQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoU0VSQkFTRSArIDB4QykpID0gMzsgLyogOCBiaXRzICovCi0JKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKFNFUkJBU0UgKyAweDEwKSkgPSAzOyAvKiBEVFIsIFJUUyAqLwotfQotCi0vKgotICogbm90aGluZyB0byBkbwotICovCi0jZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM1NDA2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAotICovCi0jZGVmaW5lIFZNQUxMT0NfRU5EICAgICAgIChQQUdFX09GRlNFVCArIDB4MWMwMDAwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyZjJkMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoKLSAqIERhVmluY2kgRE1BIGRlZmluaXRpb25zCi0gKgotICogQXV0aG9yOiBLZXZpbiBIaWxtYW4sIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkJMHhmZmZmZmZmZgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IGI3OGVlOTEuLmE0ODc5NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTI5LDggKzI5LDcgQEAKICAqIFdlIGRvbid0IGFjdHVhbGx5IGhhdmUgcmVhbCBJU0Egbm9yIFBDSSBidXNlcywgYnV0IHRoZXJlIGlzIHNvIG1hbnkKICAqIGRyaXZlcnMgb3V0IHRoZXJlIHRoYXQgbWlnaHQganVzdCB3b3JrIGlmIHdlIGZha2UgdGhlbS4uLgogICovCi0jZGVmaW5lIFBDSU9fQkFTRSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKFBDSU9fQkFTRSArIChhKSkpCisjZGVmaW5lIF9faW8oYSkJCQlfX3R5cGVzYWZlX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCiAjZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGRkMTYyNWMuLjg2YzI1YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNTIsMTMgKzUyLDggQEAKICAgICAgICAgaWYgKChtZW1pbmZvLmJhbmtbMF0uc2l6ZSA+PiAyMCkgPiAxMjgpIF9fYXJjaF9hZGp1c3Rfem9uZXMobm9kZSwgem9uZV9zaXplLCBob2xlcykKIAogI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAkoUEhZU19PRkZTRVQgKyAoMTI4PDwyMCkgLSAxKQorI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCShQQUdFX09GRlNFVCArICgxMjg8PDIwKSkKIAogI2VuZGlmCiAKLS8qCi0gKiBCdXMgYWRkcmVzcyBpcyBwaHlzaWNhbCBhZGRyZXNzCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCmluZGV4IGI5OGJkOWUuLmFkNTE2MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCkBAIC04LDcgKzgsNiBAQAogICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCiAgKiBvciBpbXBsaWVkLgogICovCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPG1hY2gvaW8uaD4KIAogLyogQWxsb3cgdm1hbGxvYyByYW5nZSB1bnRpbCB0aGUgSU8gdmlydHVhbCByYW5nZSBtaW51cyBhIDJNICJob2xlIiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pbmNsdWRlL21hY2gvZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGEwNGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9kbWEuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBFQlNBMTEwIERNQSBkZWZpbml0aW9ucwotICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBlZWE0Yjc1Li4wY2E2NmQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTIyLDEzICsyMiw2IEBACiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCiAKIC8qCi0gKiBXZSBrZWVwIHRoaXMgMToxIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJmZXJlCi0gKiB3aXRoIHRoZSBQQ01DSUEgbWVtb3J5IHJlZ2lvbnMKLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCSh4KQotCi0vKgogICogQ2FjaGUgZmx1c2hpbmcgYXJlYSAtIFNSQU0KICAqLwogI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMJCTB4NDAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCmluZGV4IDVhMWI4YzAuLjU2YmRkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZwpAQCAtMzMsNiArMzMsMTIgQEAKIAkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZSBDaXJydXMKIAkgIExvZ2ljIEVEQjkzMDcgRXZhbHVhdGlvbiBCb2FyZC4KIAorY29uZmlnIE1BQ0hfRURCOTMwN0EKKwlib29sICJTdXBwb3J0IENpcnJ1cyBMb2dpYyBFREI5MzA3QSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgQ2lycnVzCisJICBMb2dpYyBFREI5MzA3QSBFdmFsdWF0aW9uIEJvYXJkLgorCiBjb25maWcgTUFDSF9FREI5MzEyCiAJYm9vbCAiU3VwcG9ydCBDaXJydXMgTG9naWMgRURCOTMxMiIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCmluZGV4IGMxMjUyY2EuLjk0NGU0MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfTUFDSF9FREI5MzAyKQkrPSBlZGI5MzAyLm8KIG9iai0kKENPTkZJR19NQUNIX0VEQjkzMDJBKQkrPSBlZGI5MzAyYS5vCiBvYmotJChDT05GSUdfTUFDSF9FREI5MzA3KQkrPSBlZGI5MzA3Lm8KK29iai0kKENPTkZJR19NQUNIX0VEQjkzMDdBKQkrPSBlZGI5MzA3YS5vCiBvYmotJChDT05GSUdfTUFDSF9FREI5MzEyKQkrPSBlZGI5MzEyLm8KIG9iai0kKENPTkZJR19NQUNIX0VEQjkzMTUpCSs9IGVkYjkzMTUubwogb2JqLSQoQ09ORklHX01BQ0hfRURCOTMxNUEpCSs9IGVkYjkzMTVhLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMKaW5kZXggNTYxZGI3My4uM2ZiZDliMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjgsOCArMjksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhZHNzcGhlcmVfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IDB4NjAwMDAwMDAsCi0JLmVuZAkJPSAweDYxZmZmZmZmLAorCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKKwkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfMzJNIC0gMSwKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC01OSw3ICs2MCw3IEBACiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Nsb2NrLmMKaW5kZXggOGM5ZjI0OS4uOTYwNDkyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jCkBAIC0xNiwxMSArMTYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogc3RydWN0IGNsayB7Ci0JY2hhcgkJKm5hbWU7CiAJdW5zaWduZWQgbG9uZwlyYXRlOwogCWludAkJdXNlcnM7CiAJdTMyCQllbmFibGVfcmVnOwpAQCAtMjgsNTMgKzI5LDMzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfdWFydCA9IHsKLQkubmFtZQkJPSAiVUFSVENMSyIsCiAJLnJhdGUJCT0gMTQ3NDU2MDAsCiB9Owotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BsbDEgPSB7Ci0JLm5hbWUJCT0gInBsbDEiLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19mID0gewotCS5uYW1lCQk9ICJmY2xrIiwKLX07Ci1zdGF0aWMgc3RydWN0IGNsayBjbGtfaCA9IHsKLQkubmFtZQkJPSAiaGNsayIsCi19Owotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3AgPSB7Ci0JLm5hbWUJCT0gInBjbGsiLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwyID0gewotCS5uYW1lCQk9ICJwbGwyIiwKLX07CitzdGF0aWMgc3RydWN0IGNsayBjbGtfcGxsMTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19mOworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2g7CitzdGF0aWMgc3RydWN0IGNsayBjbGtfcDsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwyOwogc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VzYl9ob3N0ID0gewotCS5uYW1lCQk9ICJ1c2JfaG9zdCIsCiAJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX0NMT0NLX0NPTlRST0wsCiAJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9DTE9DS19VU0hfRU4sCiB9OwogCisjZGVmaW5lIElOSVRfQ0soZGV2LGNvbixjaykJCQkJCVwKKwl7IC5kZXZfaWQgPSBkZXYsIC5jb25faWQgPSBjb24sIC5jbGsgPSBjayB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbG9ja3NbXSA9IHsKLQkmY2xrX3VhcnQsCi0JJmNsa19wbGwxLAotCSZjbGtfZiwKLQkmY2xrX2gsCi0JJmNsa19wLAotCSZjbGtfcGxsMiwKLQkmY2xrX3VzYl9ob3N0LAorc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGNsb2Nrc1tdID0geworCUlOSVRfQ0soImFwYjp1YXJ0MSIsIE5VTEwsICZjbGtfdWFydCksCisJSU5JVF9DSygiYXBiOnVhcnQyIiwgTlVMTCwgJmNsa191YXJ0KSwKKwlJTklUX0NLKCJhcGI6dWFydDMiLCBOVUxMLCAmY2xrX3VhcnQpLAorCUlOSVRfQ0soTlVMTCwgInBsbDEiLCAmY2xrX3BsbDEpLAorCUlOSVRfQ0soTlVMTCwgImZjbGsiLCAmY2xrX2YpLAorCUlOSVRfQ0soTlVMTCwgImhjbGsiLCAmY2xrX2gpLAorCUlOSVRfQ0soTlVMTCwgInBjbGsiLCAmY2xrX3ApLAorCUlOSVRfQ0soTlVMTCwgInBsbDIiLCAmY2xrX3BsbDIpLAorCUlOSVRfQ0soTlVMTCwgInVzYl9ob3N0IiwgJmNsa191c2JfaG9zdCksCiB9OwogCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbG9ja3MpOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoY2xvY2tzW2ldLT5uYW1lLCBpZCkpCi0JCQlyZXR1cm4gY2xvY2tzW2ldOwotCX0KLQotCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKIAogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewpAQCAtMTA2LDEyICs4Nyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsa19nZXRfcmF0ZSk7CiAKLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19wdXQpOwotCi0KIAogc3RhdGljIGNoYXIgZmNsa19kaXZpc29yc1tdID0geyAxLCAyLCA0LCA4LCAxNiwgMSwgMSwgMSB9Owogc3RhdGljIGNoYXIgaGNsa19kaXZpc29yc1tdID0geyAxLCAyLCA0LCA1LCA2LCA4LCAxNiwgMzIgfTsKQEAgLTEzOCw2ICsxMTMsNyBAQAogc3RhdGljIGludCBfX2luaXQgZXA5M3h4X2Nsb2NrX2luaXQodm9pZCkKIHsKIAl1MzIgdmFsdWU7CisJaW50IGk7CiAKIAl2YWx1ZSA9IF9fcmF3X3JlYWRsKEVQOTNYWF9TWVNDT05fQ0xPQ0tfU0VUMSk7CiAJaWYgKCEodmFsdWUgJiAweDAwODAwMDAwKSkgewkJCS8qIFBMTDEgYnlwYXNzZWQ/ICAqLwpAQCAtMTY1LDYgKzE0MSw4IEBACiAJCWNsa19mLnJhdGUgLyAxMDAwMDAwLCBjbGtfaC5yYXRlIC8gMTAwMDAwMCwKIAkJY2xrX3AucmF0ZSAvIDEwMDAwMDApOwogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xvY2tzKTsgaSsrKQorCQljbGtkZXZfYWRkKCZjbG9ja3NbaV0pOwogCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbChlcDkzeHhfY2xvY2tfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggNDgzNDVmYi4uNDc4MWYzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTE1MywxMiArMTU1LDE0IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBncGlvX2ludF9lbmFibGVkWzNdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3Bpb19pbnRfdHlwZTFbM107CiBzdGF0aWMgdW5zaWduZWQgY2hhciBncGlvX2ludF90eXBlMlszXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9faW50X2RlYm91Y2VbM107CiAKIC8qIFBvcnQgb3JkZXJpbmcgaXM6IEEgQiBGICovCiBzdGF0aWMgY29uc3QgdTggaW50X3R5cGUxX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5MCwgMHhhYywgMHg0YyB9Owogc3RhdGljIGNvbnN0IHU4IGludF90eXBlMl9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4OTQsIDB4YjAsIDB4NTAgfTsKIHN0YXRpYyBjb25zdCB1OCBlb2lfcmVnaXN0ZXJfb2Zmc2V0WzNdCQk9IHsgMHg5OCwgMHhiNCwgMHg1NCB9Owogc3RhdGljIGNvbnN0IHU4IGludF9lbl9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4OWMsIDB4YjgsIDB4NTggfTsKK3N0YXRpYyBjb25zdCB1OCBpbnRfZGVib3VuY2VfcmVnaXN0ZXJfb2Zmc2V0WzNdCT0geyAweGE4LCAweGM0LCAweDY0IH07CiAKIHZvaWQgZXA5M3h4X2dwaW9fdXBkYXRlX2ludF9wYXJhbXModW5zaWduZWQgcG9ydCkKIHsKQEAgLTE4MSw2ICsxODUsMjIgQEAKIAlncGlvX2ludF91bm1hc2tlZFtsaW5lID4+IDNdICY9IH4oMSA8PCAobGluZSAmIDcpKTsKIH0KIAordm9pZCBlcDkzeHhfZ3Bpb19pbnRfZGVib3VuY2UodW5zaWduZWQgaW50IGlycSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgbGluZSA9IGlycV90b19ncGlvKGlycSk7CisJaW50IHBvcnQgPSBsaW5lID4+IDM7CisJaW50IHBvcnRfbWFzayA9IDEgPDwgKGxpbmUgJiA3KTsKKworCWlmIChlbmFibGUpCisJCWdwaW9faW50X2RlYm91Y2VbcG9ydF0gfD0gcG9ydF9tYXNrOworCWVsc2UKKwkJZ3Bpb19pbnRfZGVib3VjZVtwb3J0XSAmPSB+cG9ydF9tYXNrOworCisJX19yYXdfd3JpdGViKGdwaW9faW50X2RlYm91Y2VbcG9ydF0sCisJCUVQOTNYWF9HUElPX1JFRyhpbnRfZGVib3VuY2VfcmVnaXN0ZXJfb2Zmc2V0W3BvcnRdKSk7Cit9CitFWFBPUlRfU1lNQk9MKGVwOTN4eF9ncGlvX2ludF9kZWJvdW5jZSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFUDkzeHggSVJRIGhhbmRsaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ5Nyw2ICs1MTcsMjYgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVwOTN4eF9ldGhfZGV2aWNlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGVwOTN4eF9pMmNfZGF0YSA9IHsKKwkuc2RhX3BpbgkJPSBFUDkzWFhfR1BJT19MSU5FX0VFREFULAorCS5zZGFfaXNfb3Blbl9kcmFpbgk9IDAsCisJLnNjbF9waW4JCT0gRVA5M1hYX0dQSU9fTElORV9FRUNMSywKKwkuc2NsX2lzX29wZW5fZHJhaW4JPSAwLAorCS51ZGVsYXkJCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlcDkzeHhfaTJjX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImkyYy1ncGlvIiwKKwkuaWQJCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF9pMmNfZGF0YSwKK307CisKK3ZvaWQgX19pbml0IGVwOTN4eF9yZWdpc3Rlcl9pMmMoc3RydWN0IGkyY19ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnVtKQoreworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGRldmljZXMsIG51bSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfaTJjX2RldmljZSk7Cit9CisKIGV4dGVybiB2b2lkIGVwOTN4eF9ncGlvX2luaXQodm9pZCk7CiAKIHZvaWQgX19pbml0IGVwOTN4eF9pbml0X2RldmljZXModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDIuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDIuYwppbmRleCBlNGFkZDViLi44YmY4ZDdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTI4LDggKzI5LDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWRiOTMwMl9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gMHg2MDAwMDAwMCwKLQkuZW5kCQk9IDB4NjBmZmZmZmYsCisJLnN0YXJ0CQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFLAorCS5lbmQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UgKyBTWl8xNk0gLSAxLAogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTU5LDcgKzYwLDcgQEAKIAkvKiBNYWludGFpbmVyOiBHZW9yZ2UgS2FzaHBlcmtvIDxnZW9yZ2VAY2hhcy5jb20udWE+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMmEuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMKaW5kZXggMDJjNDQwNS4uYTM1MmM1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMmEuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzAyYS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTI4LDggKzI5LDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWRiOTMwMmFfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IDB4NjAwMDAwMDAsCi0JLmVuZAkJPSAweDYwZmZmZmZmLAorCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKKwkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfMTZNIC0gMSwKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC00NCw3ICs0NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBlZGI5MzAyYV9ldGhfZGF0YSA9IHsKLQkucGh5X2lkCQkJPSAxLAorCS5waHlfaWQJCT0gMSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzAyYV9pbml0X21hY2hpbmUodm9pZCkKQEAgLTU5LDcgKzYwLDcgQEAKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KIAkucGh5c19pbwk9IEVQOTNYWF9BUEJfUEhZU19CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoRVA5M1hYX0FQQl9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFMF9QSFlTX0JBU0UgKyAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwNy5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwNy5jCmluZGV4IDA0MGVkYmQuLjVhYjIyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDcuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzA3LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjgsOCArMjksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5MzA3X2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSAweDYwMDAwMDAwLAotCS5lbmQJCT0gMHg2MWZmZmZmZiwKKwkuc3RhcnQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UsCisJLmVuZAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSArIFNaXzMyTSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIApAQCAtNDQsNyArNDUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZWRiOTMwN19ldGhfZGF0YSA9IHsKLQkucGh5X2lkCQkJPSAxLAorCS5waHlfaWQJCT0gMSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzA3X2luaXRfbWFjaGluZSh2b2lkKQpAQCAtNTksNyArNjAsNyBAQAogCS8qIE1haW50YWluZXI6IEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPiAqLwogCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDdhLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzA3YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWMyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzA3YS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzA3YS5jCisgKiBDaXJydXMgTG9naWMgRURCOTMwN0Egc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBlZGI5MzA3YV9mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5MzA3YV9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UsCisJLmVuZAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSArIFNaXzE2TSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWRiOTMwN2FfZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlZGI5MzA3YV9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZlZGI5MzA3YV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIGVkYjkzMDdhX2V0aF9kYXRhID0geworCS5waHlfaWQJCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzA3YV9pbml0X21hY2hpbmUodm9pZCkKK3sKKwllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5MzA3YV9mbGFzaCk7CisKKwllcDkzeHhfcmVnaXN0ZXJfZXRoKCZlZGI5MzA3YV9ldGhfZGF0YSwgMSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoRURCOTMwN0EsICJDaXJydXMgTG9naWMgRURCOTMwN0EgRXZhbHVhdGlvbiBCb2FyZCIpCisJLyogTWFpbnRhaW5lcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+ICovCisJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGVkYjkzMDdhX2luaXRfbWFjaGluZSwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzEyLmMKaW5kZXggNjg1M2UzMC4uZDcxNzlmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTIuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yOSw4ICszMCw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGVkYjkzMTJfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IDB4NjAwMDAwMDAsCi0JLmVuZAkJPSAweDYxZmZmZmZmLAorCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKKwkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfMzJNIC0gMSwKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC00NSw3ICs0Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBlZGI5MzEyX2V0aF9kYXRhID0gewotCS5waHlfaWQJCQk9IDEsCisJLnBoeV9pZAkJPSAxLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGVkYjkzMTJfaW5pdF9tYWNoaW5lKHZvaWQpCkBAIC02MCw3ICs2MSw3IEBACiAJLyogTWFpbnRhaW5lcjogVG91ZmVlcSBIdXNzYWluIDx0b3VmZWVxX2h1c3NhaW5AaW5mb3N5cy5jb20+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNS5jCmluZGV4IDk0NjliMzUuLjAyNWFmNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzE1LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjgsOCArMjksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5MzE1X2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSAweDYwMDAwMDAwLAotCS5lbmQJCT0gMHg2MWZmZmZmZiwKKwkuc3RhcnQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UsCisJLmVuZAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSArIFNaXzMyTSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIApAQCAtNDQsNyArNDUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZWRiOTMxNV9ldGhfZGF0YSA9IHsKLQkucGh5X2lkCQkJPSAxLAorCS5waHlfaWQJCT0gMSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzE1X2luaXRfbWFjaGluZSh2b2lkKQpAQCAtNTksNyArNjAsNyBAQAogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwogCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCiAJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTVhLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzE1YS5jCmluZGV4IDU4NDQ1N2MuLjRjOWNjOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTVhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNWEuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yOCw4ICsyOSw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGVkYjkzMTVhX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSAweDYwMDAwMDAwLAotCS5lbmQJCT0gMHg2MGZmZmZmZiwKKwkuc3RhcnQJCT0gRVA5M1hYX0NTNl9QSFlTX0JBU0UsCisJLmVuZAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSArIFNaXzE2TSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIApAQCAtNDQsNyArNDUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZWRiOTMxNWFfZXRoX2RhdGEgPSB7Ci0JLnBoeV9pZAkJCT0gMSwKKwkucGh5X2lkCQk9IDEsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWRiOTMxNWFfaW5pdF9tYWNoaW5lKHZvaWQpCkBAIC01OSw3ICs2MCw3IEBACiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dlc2JjOTMxMi5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMKaW5kZXggMDM1YjI0ZS4uM2JhZDUwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjgsOCArMjksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnZXNiYzkzMTJfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IDB4NjAwMDAwMDAsCi0JLmVuZAkJPSAweDYwN2ZmZmZmLAorCS5zdGFydAkJPSBFUDkzWFhfQ1M2X1BIWVNfQkFTRSwKKwkuZW5kCQk9IEVQOTNYWF9DUzZfUEhZU19CQVNFICsgU1pfOE0gLSAxLAogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTU5LDcgKzYwLDcgQEAKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KIAkucGh5c19pbwk9IEVQOTNYWF9BUEJfUEhZU19CQVNFLAogCS5pb19wZ19vZmZzdAk9ICgoRVA5M1hYX0FQQl9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMzdhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9jbGtkZXYuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19BU01fTUFDSF9DTEtERVZfSAorI2RlZmluZSBfX0FTTV9NQUNIX0NMS0RFVl9ICisKKyNkZWZpbmUgX19jbGtfZ2V0KGNsaykgKHsgMTsgfSkKKyNkZWZpbmUgX19jbGtfcHV0KGNsaykgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmYTk2NS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZG1hLmgKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZjcwMjA0MS4uMGExNDk4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC05OSw2ICs5OSw4IEBACiAvKiBtYXhpbXVtIHZhbHVlIGZvciBpcnEgY2FwYWJsZSBsaW5lIGlkZW50aWZpZXJzICovCiAjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUQlFUDkzWFhfR1BJT19MSU5FX0YoNykKIAorZXh0ZXJuIHZvaWQgZXA5M3h4X2dwaW9faW50X2RlYm91bmNlKHVuc2lnbmVkIGludCBpcnEsIGludCBlbmFibGUpOworCiAvKiBuZXcgZ2VuZXJpYyBHUElPIEFQSSAtIHNlZSBEb2N1bWVudGF0aW9uL2dwaW8udHh0ICovCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDFhYjlhOTAuLmZkNWYwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC00LDUgKzQsNSBAQAogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweGZmZmZmZmZmCiAKLSNkZWZpbmUgX19pbyhwKQkJCSgodm9pZCBfX2lvbWVtICopKHApKQotI2RlZmluZSBfX21lbV9wY2kocCkJCShwKQorI2RlZmluZSBfX2lvKHApCQlfX3R5cGVzYWZlX2lvKHApCisjZGVmaW5lIF9fbWVtX3BjaShwKQkocCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBmMWI2MzM1Li41YzgwYzNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC03LDggKzcsNCBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQogCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJX19waHlzX3RvX3ZpcnQoeCkKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaAppbmRleCBkYjI0ODlkLi44OGY3ZTg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvcGxhdGZvcm0uaApAQCAtMTQsNiArMTQsNyBAQAogdm9pZCBlcDkzeHhfaW5pdF9pcnEodm9pZCk7CiB2b2lkIGVwOTN4eF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyk7CiB2b2lkIGVwOTN4eF9yZWdpc3Rlcl9ldGgoc3RydWN0IGVwOTN4eF9ldGhfZGF0YSAqZGF0YSwgaW50IGNvcHlfYWRkcik7Cit2b2lkIGVwOTN4eF9yZWdpc3Rlcl9pMmMoc3RydWN0IGkyY19ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnVtKTsKIHZvaWQgZXA5M3h4X2luaXRfZGV2aWNlcyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGVwOTN4eF90aW1lcjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYwppbmRleCBjMjE5NzIzLi4xNWQ2ODE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMjUsNyArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIG1pY3JvOV9ldGhfZGF0YSA9IHsKLSAgICAgICAucGh5X2lkICAgICAgICAgICAgICAgICA9IDB4MWYsCisJLnBoeV9pZAkJPSAweDFmLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOV9pbml0KHZvaWQpCkBAIC0zOCw0NiArMzksNDYgQEAKICAqLwogI2lmZGVmIENPTkZJR19NQUNIX01JQ1JPOUgKIHN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG1pY3JvOWhfZmxhc2hfZGF0YSA9IHsKLSAgICAgICAud2lkdGggICAgICAgICAgPSA0LAorCS53aWR0aAkJPSA0LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtaWNybzloX2ZsYXNoX3Jlc291cmNlID0gewotICAgICAgIC5zdGFydCAgICAgICAgICA9IDB4MTAwMDAwMDAsCi0gICAgICAgLmVuZCAgICAgICAgICAgID0gMHgxM2ZmZmZmZiwKLSAgICAgICAuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwkuc3RhcnQJCT0gRVA5M1hYX0NTMV9QSFlTX0JBU0UsCisJLmVuZAkJPSBFUDkzWFhfQ1MxX1BIWVNfQkFTRSArIFNaXzY0TSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWljcm85aF9mbGFzaCA9IHsKLSAgICAgICAubmFtZSAgICAgICAgICAgPSAicGh5c21hcC1mbGFzaCIsCi0gICAgICAgLmlkICAgICAgICAgICAgID0gMCwKLSAgICAgICAuZGV2ICAgICAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAucGxhdGZvcm1fZGF0YSAgPSAmbWljcm85aF9mbGFzaF9kYXRhLAotICAgICAgIH0sCi0gICAgICAgLm51bV9yZXNvdXJjZXMgID0gMSwKLSAgICAgICAucmVzb3VyY2UgICAgICAgPSAmbWljcm85aF9mbGFzaF9yZXNvdXJjZSwKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm1pY3JvOWhfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmbWljcm85aF9mbGFzaF9yZXNvdXJjZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtaWNybzloX2luaXQodm9pZCkKIHsKLSAgICAgICBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1pY3JvOWhfZmxhc2gpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbWljcm85aF9mbGFzaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtaWNybzloX2luaXRfbWFjaGluZSh2b2lkKQogewotICAgICAgIGVwOTN4eF9pbml0X2RldmljZXMoKTsKLSAgICAgICBtaWNybzlfaW5pdCgpOwotICAgICAgIG1pY3JvOWhfaW5pdCgpOworCWVwOTN4eF9pbml0X2RldmljZXMoKTsKKwltaWNybzlfaW5pdCgpOworCW1pY3JvOWhfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE1JQ1JPOSwgIkNvbnRlYyBIeXBlcmNvbnRyb2wgTWljcm85LUgiKQotICAgICAgIC8qIE1haW50YWluZXI6IE1hbmZyZWQgR3J1YmVyIDxtYW5mcmVkLmdydWJlckBjb250ZWMuYXQ+ICovCi0gICAgICAgLnBoeXNfaW8gICAgICAgID0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCi0gICAgICAgLmlvX3BnX29mZnN0ICAgID0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAotICAgICAgIC5ib290X3BhcmFtcyAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgLm1hcF9pbyAgICAgICAgID0gZXA5M3h4X21hcF9pbywKLSAgICAgICAuaW5pdF9pcnEgICAgICAgPSBlcDkzeHhfaW5pdF9pcnEsCi0gICAgICAgLnRpbWVyICAgICAgICAgID0gJmVwOTN4eF90aW1lciwKLSAgICAgICAuaW5pdF9tYWNoaW5lICAgPSBtaWNybzloX2luaXRfbWFjaGluZSwKKwkvKiBNYWludGFpbmVyOiBNYW5mcmVkIEdydWJlciA8bWFuZnJlZC5ncnViZXJAY29udGVjLmF0PiAqLworCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG1pY3JvOWhfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKICNlbmRpZgogCkBAIC04NywxOSArODgsMTkgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9NSUNSTzlNCiBzdGF0aWMgdm9pZCBfX2luaXQgbWljcm85bV9pbml0X21hY2hpbmUodm9pZCkKIHsKLSAgICAgICBlcDkzeHhfaW5pdF9kZXZpY2VzKCk7Ci0gICAgICAgbWljcm85X2luaXQoKTsKKwllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CisJbWljcm85X2luaXQoKTsKIH0KIAogTUFDSElORV9TVEFSVChNSUNSTzlNLCAiQ29udGVjIEh5cGVyY29udHJvbCBNaWNybzktTSIpCi0gICAgICAgLyogTWFpbnRhaW5lcjogTWFuZnJlZCBHcnViZXIgPG1hbmZyZWQuZ3J1YmVyQGNvbnRlYy5hdD4gKi8KLSAgICAgICAucGh5c19pbyAgICAgICAgPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKLSAgICAgICAuaW9fcGdfb2Zmc3QgICAgPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0gICAgICAgLmJvb3RfcGFyYW1zICAgID0gMHgwMDAwMDEwMCwKLSAgICAgICAubWFwX2lvICAgICAgICAgPSBlcDkzeHhfbWFwX2lvLAotICAgICAgIC5pbml0X2lycSAgICAgICA9IGVwOTN4eF9pbml0X2lycSwKLSAgICAgICAudGltZXIgICAgICAgICAgPSAmZXA5M3h4X3RpbWVyLAotICAgICAgIC5pbml0X21hY2hpbmUgICA9IG1pY3JvOW1faW5pdF9tYWNoaW5lLAorCS8qIE1haW50YWluZXI6IE1hbmZyZWQgR3J1YmVyIDxtYW5mcmVkLmdydWJlckBjb250ZWMuYXQ+ICovCisJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKKwkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gbWljcm85bV9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKQEAgLTEwOSwxOSArMTEwLDE5IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85TAogc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOWxfaW5pdF9tYWNoaW5lKHZvaWQpCiB7Ci0gICAgICAgZXA5M3h4X2luaXRfZGV2aWNlcygpOwotICAgICAgIG1pY3JvOV9pbml0KCk7CisJZXA5M3h4X2luaXRfZGV2aWNlcygpOworCW1pY3JvOV9pbml0KCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoTUlDUk85TCwgIkNvbnRlYyBIeXBlcmNvbnRyb2wgTWljcm85LUwiKQotICAgICAgIC8qIE1haW50YWluZXI6IE1hbmZyZWQgR3J1YmVyIDxtYW5mcmVkLmdydWJlckBjb250ZWMuYXQ+ICovCi0gICAgICAgLnBoeXNfaW8gICAgICAgID0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCi0gICAgICAgLmlvX3BnX29mZnN0ICAgID0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAotICAgICAgIC5ib290X3BhcmFtcyAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgLm1hcF9pbyAgICAgICAgID0gZXA5M3h4X21hcF9pbywKLSAgICAgICAuaW5pdF9pcnEgICAgICAgPSBlcDkzeHhfaW5pdF9pcnEsCi0gICAgICAgLnRpbWVyICAgICAgICAgID0gJmVwOTN4eF90aW1lciwKLSAgICAgICAuaW5pdF9tYWNoaW5lICAgPSBtaWNybzlsX2luaXRfbWFjaGluZSwKKwkvKiBNYWludGFpbmVyOiBNYW5mcmVkIEdydWJlciA8bWFuZnJlZC5ncnViZXJAY29udGVjLmF0PiAqLworCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG1pY3JvOWxfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3RzNzJ4eC5jCmluZGV4IGI0YWE0YzAuLjdlZTAyNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3RzNzJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3RzNzJ4eC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbTQ4dDg2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xMTcsNyArMTE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0czcyeHhfZmxhc2hfcmVzb3VyY2UgPSB7CiAJLnN0YXJ0CQk9IFRTNzJYWF9OT1JfUEhZU19CQVNFLAotCS5lbmQJCT0gVFM3MlhYX05PUl9QSFlTX0JBU0UgKyAweDAwZmZmZmZmLAorCS5lbmQJCT0gVFM3MlhYX05PUl9QSFlTX0JBU0UgKyBTWl8xNk0gLSAxLAogCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTE0NCwyMSArMTQ1LDIxIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbTQ4dDg2X29wcyB0czcyeHhfcnRjX29wcyA9IHsKLQkucmVhZGJ5dGUJCT0gdHM3Mnh4X3J0Y19yZWFkYnl0ZSwKLQkud3JpdGVieXRlCQk9IHRzNzJ4eF9ydGNfd3JpdGVieXRlLAorCS5yZWFkYnl0ZQk9IHRzNzJ4eF9ydGNfcmVhZGJ5dGUsCisJLndyaXRlYnl0ZQk9IHRzNzJ4eF9ydGNfd3JpdGVieXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdHM3Mnh4X3J0Y19kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJydGMtbTQ4dDg2IiwKLQkuaWQJCQk9IC0xLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJnRzNzJ4eF9ydGNfb3BzLAorCS5uYW1lCQk9ICJydGMtbTQ4dDg2IiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRzNzJ4eF9ydGNfb3BzLAogCX0sCi0JLm51bV9yZXNvdXJjZXMJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSB0czcyeHhfZXRoX2RhdGEgPSB7Ci0JLnBoeV9pZAkJCT0gMSwKKwkucGh5X2lkCQk9IDEsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdHM3Mnh4X2luaXRfbWFjaGluZSh2b2lkKQpAQCAtMTc1LDcgKzE3Niw3IEBACiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCiAJLnBoeXNfaW8JPSBFUDkzWFhfQVBCX1BIWVNfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoKEVQOTNYWF9BUEJfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKIAkubWFwX2lvCQk9IHRzNzJ4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKaW5kZXggNmE1YjQzNy4uMWI5OTZiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwppbmRleCA4MTgwMTRlLi4zNmZmMDZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAgCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKaW5kZXggYjJhMjExOC4uZGEzNWJjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwppbmRleCBkNGMxZTUyLi4xMzMwODYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RtYS5jCmluZGV4IGI2NTNlOWMuLjRmMzUwNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYwppbmRleCBiMWQzYmYyLi4zMDA0MGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKQEAgLTQsNiArNCw3IEBACiAgKiBFQlNBMjg1IG1hY2hpbmUgZml4dXAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBmZmFlYTkwLi41MWRkOTAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0xMiw4ICsxMiw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAogI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKIAotI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0KIC8qICAgVmlydHVhbCAgICAgIFBoeXNpY2FsCVNpemUKICAqIDB4ZmY4MDAwMDAJMHg0MDAwMDAwMAkxTUIJWC1CdXMKICAqIDB4ZmYwMDAwMDAJMHg3YzAwMDAwMAkxTUIJUENJIEkvTyBzcGFjZQpAQCAtMjgsOSArMjYsNiBAQAogI2RlZmluZSBYQlVTX1NJWkUJCTB4MDAxMDAwMDAKICNkZWZpbmUgWEJVU19CQVNFCQkweGZmODAwMDAwCiAKLSNkZWZpbmUgUENJT19TSVpFCQkweDAwMTAwMDAwCi0jZGVmaW5lIFBDSU9fQkFTRQkJMHhmZjAwMDAwMAotCiAjZGVmaW5lIEFSTUNTUl9TSVpFCQkweDAwMTAwMDAwCiAjZGVmaW5lIEFSTUNTUl9CQVNFCQkweGZlMDAwMDAwCiAKQEAgLTkxLDEwICs4NiwxMSBAQAogI2RlZmluZSBDUExEX0ZMQVNIX1dSX0VOQUJMRQkxCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCBncGlvX21vZGlmeV9vcChpbnQgbWFzaywgaW50IHNldCk7Ci1leHRlcm4gdm9pZCBncGlvX21vZGlmeV9pbyhpbnQgbWFzaywgaW50IGluKTsKLWV4dGVybiBpbnQgIGdwaW9fcmVhZCh2b2lkKTsKLWV4dGVybiB2b2lkIGNwbGRfbW9kaWZ5KGludCBtYXNrLCBpbnQgc2V0KTsKK2V4dGVybiBzcGlubG9ja190IG53X2dwaW9fbG9jazsKK2V4dGVybiB2b2lkIG53X2dwaW9fbW9kaWZ5X29wKHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgc2V0KTsKK2V4dGVybiB2b2lkIG53X2dwaW9fbW9kaWZ5X2lvKHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgaW4pOworZXh0ZXJuIHVuc2lnbmVkIGludCBud19ncGlvX3JlYWQodm9pZCk7CitleHRlcm4gdm9pZCBud19jcGxkX21vZGlmeSh1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNldCk7CiAjZW5kaWYKIAogI2RlZmluZSBwY2liaW9zX2Fzc2lnbl9hbGxfYnVzc2VzKCkJMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IGE3YjA2NjIuLjEwMWE0ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTE0LDcgKzE0LDggQEAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjZGVmaW5lIFBDSU9fU0laRQkJMHgwMDEwMDAwMAorI2RlZmluZSBQQ0lPX0JBU0UJCTB4ZmYwMDAwMDAKIAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZG1hLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCmluZGV4IDYyYWZkMjEuLjViZDRhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9pc2EtZG1hLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZG1hLmgKKyAqICBhcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2lzYS1kbWEuaAogICoKICAqICBBcmNoaXRlY3R1cmUgRE1BIHJvdXRpbmVzCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggNmFlMmYxYS4uY2IxNmU1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0zMCw5ICszMCwxOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX192aXJ0X3RvX2J1cyh1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyk7CiAjZW5kaWYKKyNkZWZpbmUgX192aXJ0X3RvX2J1cwlfX3ZpcnRfdG9fYnVzCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQJX19idXNfdG9fdmlydAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19GT09UQlJJREdFX0hPU1QpCiAKKy8qCisgKiBUaGUgZm9vdGJyaWRnZSBpcyBwcm9ncmFtbWVkIHRvIGV4cG9zZSB0aGUgc3lzdGVtIFJBTSBhdCB0aGUgY29ycmVzcG9uZGluZworICogYWRkcmVzcy4gIFNvLCBpZiBQQUdFX09GRlNFVCBpcyAweGMwMDAwMDAwLCBSQU0gYXBwZWFycyBhdCAweGUwMDAwMDAwLgorICogSWYgMHg4MDAwMDAwMCwgdGhlbiBpdHMgZXhwb3NlZCBhdCAweGEwMDAwMDAwIG9uIHRoZSBidXMuIGV0Yy4KKyAqIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIFJBTSBpc24ndCBwbGFjZWQgYXQgYnVzIGFkZHJlc3MgMCB3aGljaAorICogd291bGQgY2xhc2ggd2l0aCBWR0EgY2FyZHMuCisgKi8KICNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoKHgpIC0gMHhlMDAwMDAwMCkKICNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoKHgpICsgMHhlMDAwMDAwMCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKaW5kZXggNTRmZWM5YS4uOWVlODBhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCmluZGV4IDAwYjBkZGMuLmFjN2ZmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVjMjEyODUuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgpAQCAtNjcsMTMgKzY4LDE0IEBACiAvKgogICogVGhpcyBpcyBhIGxvY2sgZm9yIGFjY2Vzc2luZyBwb3J0cyBHUDFfSU9fQkFTRSBhbmQgR1AyX0lPX0JBU0UKICAqLwotREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7CitERUZJTkVfU1BJTkxPQ0sobndfZ3Bpb19sb2NrKTsKK0VYUE9SVF9TWU1CT0wobndfZ3Bpb19sb2NrKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2dwaW9fb3A7CiBzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfZ3Bpb19pbzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9jcGxkOwogCi12b2lkIGdwaW9fbW9kaWZ5X29wKGludCBtYXNrLCBpbnQgc2V0KQordm9pZCBud19ncGlvX21vZGlmeV9vcCh1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNldCkKIHsKIAl1bnNpZ25lZCBpbnQgbmV3X2dwaW8sIGNoYW5nZWQ7CiAKQEAgLTg2LDYgKzg4LDcgQEAKIAlpZiAoY2hhbmdlZCAmIDB4ZmYwMCkKIAkJb3V0YihuZXdfZ3BpbyA+PiA4LCBHUDJfSU9fQkFTRSk7CiB9CitFWFBPUlRfU1lNQk9MKG53X2dwaW9fbW9kaWZ5X29wKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9fZ3Bpb19tb2RpZnlfaW8oaW50IG1hc2ssIGludCBpbikKIHsKQEAgLTExOCw3ICsxMjEsNyBAQAogCX0KIH0KIAotdm9pZCBncGlvX21vZGlmeV9pbyhpbnQgbWFzaywgaW50IGluKQordm9pZCBud19ncGlvX21vZGlmeV9pbyh1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGluKQogewogCS8qIE9wZW4gdXAgdGhlIFN1cGVySU8gY2hpcCAqLwogCXdiOTc3X29wZW4oKTsKQEAgLTEyOCwxMSArMTMxLDEzIEBACiAJLyogQ2xvc2UgdXAgdGhlIEVGRVIgZ2F0ZSAqLwogCXdiOTc3X2Nsb3NlKCk7CiB9CitFWFBPUlRfU1lNQk9MKG53X2dwaW9fbW9kaWZ5X2lvKTsKIAotaW50IGdwaW9fcmVhZCh2b2lkKQordW5zaWduZWQgaW50IG53X2dwaW9fcmVhZCh2b2lkKQogewogCXJldHVybiBpbmIoR1AxX0lPX0JBU0UpIHwgaW5iKEdQMl9JT19CQVNFKSA8PCA4OwogfQorRVhQT1JUX1NZTUJPTChud19ncGlvX3JlYWQpOwogCiAvKgogICogSW5pdGlhbGlzZSB0aGUgV2luYm9uZCBXODM5NzdGIGdsb2JhbCByZWdpc3RlcnMKQEAgLTMyMiw5ICszMjcsOSBAQAogCS8qCiAJICogU2V0IEdyb3VwMS9Hcm91cDIgb3V0cHV0cwogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQlncGlvX21vZGlmeV9vcCgtMSwgR1BJT19SRURfTEVEIHwgR1BJT19GQU4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZud19ncGlvX2xvY2ssIGZsYWdzKTsKKwlud19ncGlvX21vZGlmeV9vcCgtMSwgR1BJT19SRURfTEVEIHwgR1BJT19GQU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMzU5LDM0ICszNjQsMzUgQEAKIAl3Yjk3N19jbG9zZSgpOwogfQogCi12b2lkIGNwbGRfbW9kaWZ5KGludCBtYXNrLCBpbnQgc2V0KQordm9pZCBud19jcGxkX21vZGlmeSh1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHNldCkKIHsKIAlpbnQgbXNrOwogCiAJY3VycmVudF9jcGxkID0gKGN1cnJlbnRfY3BsZCAmIH5tYXNrKSB8IHNldDsKIAotCWdwaW9fbW9kaWZ5X2lvKEdQSU9fREFUQSB8IEdQSU9fSU9DTEsgfCBHUElPX0lPTE9BRCwgMCk7Ci0JZ3Bpb19tb2RpZnlfb3AoR1BJT19JT0xPQUQsIDApOworCW53X2dwaW9fbW9kaWZ5X2lvKEdQSU9fREFUQSB8IEdQSU9fSU9DTEsgfCBHUElPX0lPTE9BRCwgMCk7CisJbndfZ3Bpb19tb2RpZnlfb3AoR1BJT19JT0xPQUQsIDApOwogCiAJZm9yIChtc2sgPSA4OyBtc2s7IG1zayA+Pj0gMSkgewogCQlpbnQgYml0ID0gY3VycmVudF9jcGxkICYgbXNrOwogCi0JCWdwaW9fbW9kaWZ5X29wKEdQSU9fREFUQSB8IEdQSU9fSU9DTEssIGJpdCA/IEdQSU9fREFUQSA6IDApOwotCQlncGlvX21vZGlmeV9vcChHUElPX0lPQ0xLLCBHUElPX0lPQ0xLKTsKKwkJbndfZ3Bpb19tb2RpZnlfb3AoR1BJT19EQVRBIHwgR1BJT19JT0NMSywgYml0ID8gR1BJT19EQVRBIDogMCk7CisJCW53X2dwaW9fbW9kaWZ5X29wKEdQSU9fSU9DTEssIEdQSU9fSU9DTEspOwogCX0KIAotCWdwaW9fbW9kaWZ5X29wKEdQSU9fSU9DTEt8R1BJT19EQVRBLCAwKTsKLQlncGlvX21vZGlmeV9vcChHUElPX0lPTE9BRHxHUElPX0RTQ0xLLCBHUElPX0lPTE9BRHxHUElPX0RTQ0xLKTsKLQlncGlvX21vZGlmeV9vcChHUElPX0lPTE9BRCwgMCk7CisJbndfZ3Bpb19tb2RpZnlfb3AoR1BJT19JT0NMS3xHUElPX0RBVEEsIDApOworCW53X2dwaW9fbW9kaWZ5X29wKEdQSU9fSU9MT0FEfEdQSU9fRFNDTEssIEdQSU9fSU9MT0FEfEdQSU9fRFNDTEspOworCW53X2dwaW9fbW9kaWZ5X29wKEdQSU9fSU9MT0FELCAwKTsKIH0KK0VYUE9SVF9TWU1CT0wobndfY3BsZF9tb2RpZnkpOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY3BsZF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQljcGxkX21vZGlmeSgtMSwgQ1BMRF9VTk1VVEUgfCBDUExEXzcxMTFfRElTQUJMRSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOworCW53X2NwbGRfbW9kaWZ5KC0xLCBDUExEX1VOTVVURSB8IENQTERfNzExMV9ESVNBQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZud19ncGlvX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcndhX3VubG9ja1tdIF9faW5pdGRhdGEgPQpAQCAtNTk2LDEyICs2MDIsNiBAQAogCXJ3YTAxMF9zb3VuZGJsYXN0ZXJfcmVzZXQoKTsKIH0KIAotRVhQT1JUX1NZTUJPTChncGlvX2xvY2spOwotRVhQT1JUX1NZTUJPTChncGlvX21vZGlmeV9vcCk7Ci1FWFBPUlRfU1lNQk9MKGdwaW9fbW9kaWZ5X2lvKTsKLUVYUE9SVF9TWU1CT0woY3BsZF9tb2RpZnkpOwotRVhQT1JUX1NZTUJPTChncGlvX3JlYWQpOwotCiAvKgogICogSW5pdGlhbGlzZSBhbnkgb3RoZXIgaGFyZHdhcmUgYWZ0ZXIgd2UndmUgZ290IHRoZSBQQ0kgYnVzCiAgKiBpbml0aWFsaXNlZC4gIFdlIG1heSBuZWVkIHRoZSBQQ0kgYnVzIHRvIHRhbGsgdG8gdGhpcyBvdGhlcgpAQCAtNjE2LDkgKzYxNiw5IEBACiAJCWNwbGRfaW5pdCgpOwogCQlyd2EwMTBfaW5pdCgpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQkJZ3Bpb19tb2RpZnlfb3AoR1BJT19SRURfTEVEfEdQSU9fR1JFRU5fTEVELCBERUZBVUxUX0xFRFMpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOworCQlud19ncGlvX21vZGlmeV9vcChHUElPX1JFRF9MRUR8R1BJT19HUkVFTl9MRUQsIERFRkFVTFRfTEVEUyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1sZWRzLmMKaW5kZXggZDkxYTRmNC4uMDAyNjlmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1sZWRzLmMKQEAgLTMyLDcgKzMyLDYgQEAKIHN0YXRpYyBjaGFyIGh3X2xlZF9zdGF0ZTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhsZWRzX2xvY2spOwotZXh0ZXJuIHNwaW5sb2NrX3QgZ3Bpb19sb2NrOwogCiBzdGF0aWMgdm9pZCBuZXR3aW5kZXJfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCiB7CkBAIC0xMjEsOSArMTIwLDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsZWRzX2xvY2ssIGZsYWdzKTsKIAogCWlmICAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCQlncGlvX21vZGlmeV9vcChHUElPX1JFRF9MRUQgfCBHUElPX0dSRUVOX0xFRCwgaHdfbGVkX3N0YXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZud19ncGlvX2xvY2ssIGZsYWdzKTsKKwkJbndfZ3Bpb19tb2RpZnlfb3AoR1BJT19SRURfTEVEIHwgR1BJT19HUkVFTl9MRUQsIGh3X2xlZF9zdGF0ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwuYwppbmRleCBjNGY4NDNmLi5lMmM5ZjA2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwuYwpAQCAtNCw2ICs0LDcgQEAKICAqIFBlcnNvbmFsIHNlcnZlciAoU2tpZmYpIG1hY2hpbmUgZml4dXAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDFkYWI3NGMuLjJjODY1OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvaW8uaApAQCAtMTQsMTEgKzE0LDkgQEAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCi0jZGVmaW5lIF9faW8oYSkJCSgodm9pZCBfX2lvbWVtICopKGEpKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2lzYS1kbWEuaApzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9kbWEuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCmluZGV4IDBhOWQ4NmUuLjNlYWZiM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2lzYS1kbWEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9kbWEuaAorICogYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCiAgKgogICogQXJjaGl0ZWN0dXJlIERNQSByb3V0ZXMKICAqCkBAIC04LDEzICs4LDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAogI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICiAKLS8qCi0gKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCi0gKiBUaGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAoMHhkMDAwMDAwMCAtIDB4YzAwMDAwMDApCi0gKiBieXRlcyBvZiBSQU0uCi0gKi8KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkweGQwMDAwMDAwCi0KICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX0g3MjAxKQogI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTMKICNlbGlmIGRlZmluZWQgKENPTkZJR19DUFVfSDcyMDIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGNiMjZmNDkuLmVmNGMxZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC03LDIzICs3LDEzIEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKICNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAogCi0vKgotICogUGFnZSBvZmZzZXQ6Ci0gKiAgICAoIDB4YzAwMDAwMDBVTCApCi0gKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHg0MDAwMDAwMCkKLQogLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICogICAgICAgICAgICAgIGFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKgotICogVGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGhlcmUgbGF0ZXIgISwgTWFyIDIwMDAsIEp1bmdqdW4gS2ltCisgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCisgKiBUaGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAoMHhkMDAwMDAwMCAtIDB4YzAwMDAwMDApCisgKiBieXRlcyBvZiBSQU0uCiAgKi8KLQotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCV9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJX19waHlzX3RvX3ZpcnQoeCkKKyNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQJKFBIWVNfT0ZGU0VUICsgU1pfMjU2TSAtIDEpCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfMjU2TSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2RtYS5jCmluZGV4IGMxMDgxMGMuLjE1MzY1ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RtYS5jCkBAIC0yOCwxMCArMjgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9pbXgtZG1hLmg+CiAKIHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgaW14X2RtYV9jaGFubmVsc1tJTVhfRE1BX0NIQU5ORUxTXTsKQEAgLTEzOCw3ICsxMzksNyBAQAogaW50CiBpbXhfZG1hX3NldHVwX3NpbmdsZShpbXhfZG1hY2hfdCBkbWFfY2gsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCiAJCSAgICAgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsIHVuc2lnbmVkIGludCBkZXZfYWRkciwKLQkJICAgICBkbWFtb2RlX3QgZG1hbW9kZSkKKwkJICAgICB1bnNpZ25lZCBpbnQgZG1hbW9kZSkKIHsKIAlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tkbWFfY2hdOwogCkBAIC0yMjMsNyArMjI0LDcgQEAKIGludAogaW14X2RtYV9zZXR1cF9zZyhpbXhfZG1hY2hfdCBkbWFfY2gsCiAJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgc2djb3VudCwgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsCi0JCSB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIGRtYW1vZGVfdCBkbWFtb2RlKQorCQkgdW5zaWduZWQgaW50IGRldl9hZGRyLCB1bnNpZ25lZCBpbnQgZG1hbW9kZSkKIHsKIAlpbnQgcmVzOwogCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2RtYV9jaF07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvaW14LWRtYS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lteC1kbWEuaAppbmRleCA0NGQ4OWMzLi5iYmU1NGRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvaW14LWRtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pbXgtZG1hLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKICNpZm5kZWYgX19BU01fQVJDSF9JTVhfRE1BX0gKICNkZWZpbmUgX19BU01fQVJDSF9JTVhfRE1BX0gKQEAgLTQ4LDcgKzQ4LDcgQEAKIAl2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKik7CiAJdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIGludCBlcnJjb2RlKTsKIAl2b2lkICpkYXRhOwotCWRtYW1vZGVfdCAgZG1hX21vZGU7CisJdW5zaWduZWQgaW50ICBkbWFfbW9kZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGludCBzZ2JjOwogCXVuc2lnbmVkIGludCBzZ2NvdW50OwpAQCAtNjYsMTQgKzY2LDE4IEBACiAvKiBUaGUgdHlwZSB0byBkaXN0aW5ndWlzaCBjaGFubmVsIG51bWJlcnMgcGFyYW1ldGVyIGZyb20gb3JkaW5hbCBpbnQgdHlwZSAqLwogdHlwZWRlZiBpbnQgaW14X2RtYWNoX3Q7CiAKKyNkZWZpbmUgRE1BX01PREVfUkVBRAkJMAorI2RlZmluZSBETUFfTU9ERV9XUklURQkJMQorI2RlZmluZSBETUFfTU9ERV9NQVNLCQkxCisKIGludAogaW14X2RtYV9zZXR1cF9zaW5nbGUoaW14X2RtYWNoX3QgZG1hX2NoLCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAotCQl1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLCBkbWFtb2RlX3QgZG1hbW9kZSk7CisJCXVuc2lnbmVkIGludCBkbWFfbGVuZ3RoLCB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIHVuc2lnbmVkIGludCBkbWFtb2RlKTsKIAogaW50CiBpbXhfZG1hX3NldHVwX3NnKGlteF9kbWFjaF90IGRtYV9jaCwKIAkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBzZ2NvdW50LCB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwKLQkJIHVuc2lnbmVkIGludCBkZXZfYWRkciwgZG1hbW9kZV90IGRtYW1vZGUpOworCQkgdW5zaWduZWQgaW50IGRldl9hZGRyLCB1bnNpZ25lZCBpbnQgZG1hbW9kZSk7CiAKIGludAogaW14X2RtYV9zZXR1cF9oYW5kbGVycyhpbXhfZG1hY2hfdCBkbWFfY2gsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvaW14ZmIuaCBiL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pbXhmYi5oCmluZGV4IDNlZDllYzguLjg3MGQwZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pbXhmYi5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pbXhmYi5oCkBAIC0xLDcgKzEsNTIgQEAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIG1hY2hpbmUgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgb24uCiAgKi8KLXN0cnVjdCBpbXhmYl9tYWNoX2luZm8geworCisjZGVmaW5lIFBDUl9URlQJCSgxIDw8IDMxKQorI2RlZmluZSBQQ1JfQ09MT1IJKDEgPDwgMzApCisjZGVmaW5lIFBDUl9QQlNJWl8xCSgwIDw8IDI4KQorI2RlZmluZSBQQ1JfUEJTSVpfMgkoMSA8PCAyOCkKKyNkZWZpbmUgUENSX1BCU0laXzQJKDIgPDwgMjgpCisjZGVmaW5lIFBDUl9QQlNJWl84CSgzIDw8IDI4KQorI2RlZmluZSBQQ1JfQlBJWF8xCSgwIDw8IDI1KQorI2RlZmluZSBQQ1JfQlBJWF8yCSgxIDw8IDI1KQorI2RlZmluZSBQQ1JfQlBJWF80CSgyIDw8IDI1KQorI2RlZmluZSBQQ1JfQlBJWF84CSgzIDw8IDI1KQorI2RlZmluZSBQQ1JfQlBJWF8xMgkoNCA8PCAyNSkKKyNkZWZpbmUgUENSX0JQSVhfMTYJKDQgPDwgMjUpCisjZGVmaW5lIFBDUl9QSVhQT0wJKDEgPDwgMjQpCisjZGVmaW5lIFBDUl9GTE1QT0wJKDEgPDwgMjMpCisjZGVmaW5lIFBDUl9MUFBPTAkoMSA8PCAyMikKKyNkZWZpbmUgUENSX0NMS1BPTAkoMSA8PCAyMSkKKyNkZWZpbmUgUENSX09FUE9MCSgxIDw8IDIwKQorI2RlZmluZSBQQ1JfU0NMS0lETEUJKDEgPDwgMTkpCisjZGVmaW5lIFBDUl9FTkRfU0VMCSgxIDw8IDE4KQorI2RlZmluZSBQQ1JfRU5EX0JZVEVfU1dBUCAoMSA8PCAxNykKKyNkZWZpbmUgUENSX1JFVl9WUwkoMSA8PCAxNikKKyNkZWZpbmUgUENSX0FDRF9TRUwJKDEgPDwgMTUpCisjZGVmaW5lIFBDUl9BQ0QoeCkJKCgoeCkgJiAweDdmKSA8PCA4KQorI2RlZmluZSBQQ1JfU0NMS19TRUwJKDEgPDwgNykKKyNkZWZpbmUgUENSX1NIQVJQCSgxIDw8IDYpCisjZGVmaW5lIFBDUl9QQ0QoeCkJKCh4KSAmIDB4M2YpCisKKyNkZWZpbmUgUFdNUl9DTFMoeCkJKCgoeCkgJiAweDFmZikgPDwgMTYpCisjZGVmaW5lIFBXTVJfTERNU0sJKDEgPDwgMTUpCisjZGVmaW5lIFBXTVJfU0NSMQkoMSA8PCAxMCkKKyNkZWZpbmUgUFdNUl9TQ1IwCSgxIDw8IDkpCisjZGVmaW5lIFBXTVJfQ0NfRU4JKDEgPDwgOCkKKyNkZWZpbmUgUFdNUl9QVyh4KQkoKHgpICYgMHhmZikKKworI2RlZmluZSBMU0NSMV9QU19SSVNFX0RFTEFZKHgpICAgICgoKHgpICYgMHg3ZikgPDwgMjYpCisjZGVmaW5lIExTQ1IxX0NMU19SSVNFX0RFTEFZKHgpICAgKCgoeCkgJiAweDNmKSA8PCAxNikKKyNkZWZpbmUgTFNDUjFfUkVWX1RPR0dMRV9ERUxBWSh4KSAoKCh4KSAmIDB4ZikgPDwgOCkKKyNkZWZpbmUgTFNDUjFfR1JBWTIoeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgNCkKKyNkZWZpbmUgTFNDUjFfR1JBWTEoeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikpCisKKyNkZWZpbmUgRE1BQ1JfQlVSU1QJKDEgPDwgMzEpCisjZGVmaW5lIERNQUNSX0hNKHgpCSgoKHgpICYgMHhmKSA8PCAxNikKKyNkZWZpbmUgRE1BQ1JfVE0oeCkJKCh4KSAmIDB4ZikKKworc3RydWN0IGlteF9mYl9wbGF0Zm9ybV9kYXRhIHsKIAl1X2xvbmcJCXBpeGNsb2NrOwogCiAJdV9zaG9ydAkJeHJlczsKQEAgLTM0LDQgKzc5LDUgQEAKIAl2b2lkICgqbGNkX3Bvd2VyKShpbnQpOwogCXZvaWQgKCpiYWNrbGlnaHRfcG93ZXIpKGludCk7CiB9Owotdm9pZCBzZXRfaW14X2ZiX2luZm8oc3RydWN0IGlteGZiX21hY2hfaW5mbyAqaGFyZF9pbXhfZmJfaW5mbyk7CisKK3ZvaWQgc2V0X2lteF9mYl9pbmZvKHN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYzUwYzVmYS4uOWUxOTdhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIwLDExICsyMCw5IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lPX0gKICNkZWZpbmUgX19BU01fQVJNX0FSQ0hfSU9fSAogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAotI2RlZmluZSBfX2lvKGEpCQkoKHZvaWQgX19pb21lbSAqKShhKSkKKyNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQogI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDVjNDUzMDYuLmE5M2RmN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTIzLDE0ICsyMyw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgwODAwMDAwMCkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICogICAgICAgICAgICAgIGFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoeCAtIFBBR0VfT0ZGU0VUICsgUEhZU19PRkZTRVQpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKHggLSBQSFlTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKaW5kZXggOGQ3NjFmZC4uOTg5ZWNmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmMKQEAgLTEwLDQyICsxMCwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+Ci0KLSNpbmNsdWRlICJjbG9jay5oIgotCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7Ci0KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIGNsazsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci0KLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbW9kdWxlX3B1dChjbGstPm93bmVyKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7CisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgorI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAKIGludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKQEAgLTY3LDcgKzM3LDYgQEAKIGxvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJc3RydWN0IGljc3Q1MjVfdmNvIHZjbzsKLQogCXZjbyA9IGljc3Q1MjVfa2h6X3RvX3ZjbyhjbGstPnBhcmFtcywgcmF0ZSAvIDEwMDApOwogCXJldHVybiBpY3N0NTI1X2toeihjbGstPnBhcmFtcywgdmNvKSAqIDEwMDA7CiB9CkBAIC03Niw1NiArNDUsMTUgQEAKIGludCBjbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJaW50IHJldCA9IC1FSU87CisKIAlpZiAoY2xrLT5zZXR2Y28pIHsKIAkJc3RydWN0IGljc3Q1MjVfdmNvIHZjbzsKIAogCQl2Y28gPSBpY3N0NTI1X2toel90b192Y28oY2xrLT5wYXJhbXMsIHJhdGUgLyAxMDAwKTsKIAkJY2xrLT5yYXRlID0gaWNzdDUyNV9raHooY2xrLT5wYXJhbXMsIHZjbykgKiAxMDAwOwotCi0JCXByaW50aygiQ2xvY2sgJXM6IHNldHRpbmcgVkNPIHJlZyBwYXJhbXM6IFM9JWQgUj0lZCBWPSVkXG4iLAotCQkJY2xrLT5uYW1lLCB2Y28ucywgdmNvLnIsIHZjby52KTsKLQogCQljbGstPnNldHZjbyhjbGssIHZjbyk7CiAJCXJldCA9IDA7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgZml4ZWQgY2xvY2tzLgotICovCi1zdGF0aWMgc3RydWN0IGNsayBrbWlfY2xrID0gewotCS5uYW1lCT0gIktNSVJFRkNMSyIsCi0JLnJhdGUJPSAyNDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnRfY2xrID0gewotCS5uYW1lCT0gIlVBUlRDTEsiLAotCS5yYXRlCT0gMTQ3NDU2MDAsCi19OwotCi1pbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3JlZ2lzdGVyKTsKLQotdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQlsaXN0X2RlbCgmY2xrLT5ub2RlKTsKLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnJlZ2lzdGVyKTsKLQotc3RhdGljIGludCBfX2luaXQgY2xrX2luaXQodm9pZCkKLXsKLQljbGtfcmVnaXN0ZXIoJmttaV9jbGspOwotCWNsa19yZWdpc3RlcigmdWFydF9jbGspOwotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChjbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5oCmluZGV4IDA5ZTYzMjguLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jbG9jay5oCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2Nsb2NrLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkLgotICogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLXN0cnVjdCBtb2R1bGU7Ci1zdHJ1Y3QgaWNzdDUyNV9wYXJhbXM7Ci0KLXN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQljb25zdCBzdHJ1Y3QgaWNzdDUyNV9wYXJhbXMgKnBhcmFtczsKLQl2b2lkCQkJKmRhdGE7Ci0Jdm9pZAkJCSgqc2V0dmNvKShzdHJ1Y3QgY2xrICosIHN0cnVjdCBpY3N0NTI1X3ZjbyB2Y28pOwotfTsKLQotaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwotdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKaW5kZXggNTk1YjczOS4uYzg5Yzk0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgorI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CkBAIC0xMDgsMTAgKzExMCw0MyBAQAogCSZrbWkxX2RldmljZSwKIH07CiAKKy8qCisgKiBUaGVzZSBhcmUgZml4ZWQgY2xvY2tzLgorICovCitzdGF0aWMgc3RydWN0IGNsayBjbGsyNG1oeiA9IHsKKwkucmF0ZQk9IDI0MDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydGNsayA9IHsKKwkucmF0ZQk9IDE0NzQ1NjAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSBfX2luaXRkYXRhID0geworCXsJLyogVUFSVDAgKi8KKwkJLmRldl9pZAkJPSAibWI6MTYiLAorCQkuY2xrCQk9ICZ1YXJ0Y2xrLAorCX0sIHsJLyogVUFSVDEgKi8KKwkJLmRldl9pZAkJPSAibWI6MTciLAorCQkuY2xrCQk9ICZ1YXJ0Y2xrLAorCX0sIHsJLyogS01JMCAqLworCQkuZGV2X2lkCQk9ICJtYjoxOCIsCisJCS5jbGsJCT0gJmNsazI0bWh6LAorCX0sIHsJLyogS01JMSAqLworCQkuZGV2X2lkCQk9ICJtYjoxOSIsCisJCS5jbGsJCT0gJmNsazI0bWh6LAorCX0sIHsJLyogTU1DSSAtIEludGVncmF0b3JDUCAqLworCQkuZGV2X2lkCQk9ICJtYjoxYyIsCisJCS5jbGsJCT0gJnVhcnRjbGssCisJfQorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW50ZWdyYXRvcl9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsb29rdXBzKTsgaSsrKQorCQljbGtkZXZfYWRkKCZsb29rdXBzW2ldKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtYmFfZGV2cyk7IGkrKykgewogCQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQgPSBhbWJhX2RldnNbaV07CiAJCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKGQsICZpb21lbV9yZXNvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW1wZDEuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCmluZGV4IDE3MjI5OWEuLjAwNThjOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jCkBAIC0yMiwxMyArMjIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgorI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3Q1MjUuaD4KICNpbmNsdWRlIDxtYWNoL2xtLmg+CiAjaW5jbHVkZSA8bWFjaC9pbXBkMS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCi0jaW5jbHVkZSAiY2xvY2suaCIKLQogc3RhdGljIGludCBtb2R1bGVfaWQ7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChsbWlkLCBtb2R1bGVfaWQsIGludCwgMDQ0NCk7CkBAIC0zNyw2ICszNyw3IEBACiBzdHJ1Y3QgaW1wZDFfbW9kdWxlIHsKIAl2b2lkIF9faW9tZW0JKmJhc2U7CiAJc3RydWN0IGNsawl2Y29zWzJdOworCXN0cnVjdCBjbGtfbG9va3VwICpjbGtzWzNdOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0NTI1X3BhcmFtcyBpbXBkMV92Y29fcGFyYW1zID0gewpAQCAtMzM5LDkgKzM0MCw4IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmltcGQxX3Zjb25hbWVzWzJdID0gewotCSJDTENEQ0xLIiwKLQkiQVVYVkNPMiIsCitzdGF0aWMgc3RydWN0IGNsayBmaXhlZF8xNDc0NTYwMCA9IHsKKwkucmF0ZSA9IDE0NzQ1NjAwLAogfTsKIAogc3RhdGljIGludCBpbXBkMV9wcm9iZShzdHJ1Y3QgbG1fZGV2aWNlICpkZXYpCkBAIC0zNzQsMTQgKzM3NCwyMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW1wZDEtPnZjb3MpOyBpKyspIHsKIAkJaW1wZDEtPnZjb3NbaV0ub3duZXIgPSBUSElTX01PRFVMRSwKLQkJaW1wZDEtPnZjb3NbaV0ubmFtZSA9IGltcGQxX3Zjb25hbWVzW2ldLAogCQlpbXBkMS0+dmNvc1tpXS5wYXJhbXMgPSAmaW1wZDFfdmNvX3BhcmFtcywKIAkJaW1wZDEtPnZjb3NbaV0uZGF0YSA9IGltcGQxLAogCQlpbXBkMS0+dmNvc1tpXS5zZXR2Y28gPSBpbXBkMV9zZXR2Y287Ci0KLQkJY2xrX3JlZ2lzdGVyKCZpbXBkMS0+dmNvc1tpXSk7CiAJfQogCisJaW1wZDEtPmNsa3NbMF0gPSBjbGtkZXZfYWxsb2MoJmltcGQxLT52Y29zWzBdLCBOVUxMLCAibG0leDowMTAwMCIsCisJCQkJCWRldi0+aWQpOworCWltcGQxLT5jbGtzWzFdID0gY2xrZGV2X2FsbG9jKCZmaXhlZF8xNDc0NTYwMCwgTlVMTCwgImxtJXg6MDAxMDAiLAorCQkJCQlkZXYtPmlkKTsKKwlpbXBkMS0+Y2xrc1syXSA9IGNsa2Rldl9hbGxvYygmZml4ZWRfMTQ3NDU2MDAsIE5VTEwsICJsbSV4OjAwMjAwIiwKKwkJCQkJZGV2LT5pZCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW1wZDEtPmNsa3MpOyBpKyspCisJCWNsa2Rldl9hZGQoaW1wZDEtPmNsa3NbaV0pOworCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW1wZDFfZGV2cyk7IGkrKykgewogCQlzdHJ1Y3QgaW1wZDFfZGV2aWNlICppZGV2ID0gaW1wZDFfZGV2cyArIGk7CiAJCXN0cnVjdCBhbWJhX2RldmljZSAqZDsKQEAgLTQzNCw4ICs0NDAsOCBAQAogCiAJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgTlVMTCwgaW1wZDFfcmVtb3ZlX29uZSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbXBkMS0+dmNvcyk7IGkrKykKLQkJY2xrX3VucmVnaXN0ZXIoJmltcGQxLT52Y29zW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbXBkMS0+Y2xrcyk7IGkrKykKKwkJY2xrZGV2X2Ryb3AoaW1wZDEtPmNsa3NbaV0pOwogCiAJbG1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvY2xrZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5M2U0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvY2xrZGV2LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0NMS0RFVl9ICisjZGVmaW5lIF9fQVNNX01BQ0hfQ0xLREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CisKK3N0cnVjdCBjbGsgeworCXVuc2lnbmVkIGxvbmcJCXJhdGU7CisJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCWNvbnN0IHN0cnVjdCBpY3N0NTI1X3BhcmFtcyAqcGFyYW1zOworCXZvaWQJCQkqZGF0YTsKKwl2b2lkCQkJKCpzZXR2Y28pKHN0cnVjdCBjbGsgKiwgc3RydWN0IGljc3Q1MjVfdmNvIHZjbyk7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBfX2Nsa19nZXQoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiB0cnlfbW9kdWxlX2dldChjbGstPm93bmVyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCit7CisJbW9kdWxlX3B1dChjbGstPm93bmVyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlYmU4NS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5NywxOTk4IFJ1c3NlbGwgS2luZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggYmU3ZTYzYy4uMmIyZTdhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yNCwxNiArMjQsOSBAQAogICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLSNkZWZpbmUgQlVTX09GRlNFVAlVTCgweDgwMDAwMDAwKQogCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSh4IC0gUEFHRV9PRkZTRVQgKyBCVVNfT0ZGU0VUKQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCSh4IC0gQlVTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBCVVNfT0ZGU0VUCVVMKDB4ODAwMDAwMDApCisjZGVmaW5lIF9fdmlydF90b19idXMoeCkJKCh4KSAtIFBBR0VfT0ZGU0VUICsgQlVTX09GRlNFVCkKKyNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoKHgpIC0gQlVTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDg4MDI2Y2MuLjQyN2MyZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CisjaW5jbHVkZSA8bWFjaC9jbGtkZXYuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMzgsNyArNDAsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImNsb2NrLmgiCiAKICNkZWZpbmUgSU5UQ1BfUEFfTU1DX0JBU0UJCTB4MWMwMDAwMDAKICNkZWZpbmUgSU5UQ1BfUEFfQUFDSV9CQVNFCQkweDFkMDAwMDAwCkBAIC0yODksMTUgKzI5MCwxNiBAQAogCXdyaXRlbCgwLCBDTV9MT0NLKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGsgY3BfY2xjZF9jbGsgPSB7Ci0JLm5hbWUJPSAiQ0xDRENMSyIsCitzdGF0aWMgc3RydWN0IGNsayBjcF9hdXhjbGsgPSB7CiAJLnBhcmFtcwk9ICZjcF9hdXh2Y29fcGFyYW1zLAogCS5zZXR2Y28gPSBjcF9hdXh2Y29fc2V0LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgY3BfbW1jaV9jbGsgPSB7Ci0JLm5hbWUJPSAiTUNMSyIsCi0JLnJhdGUJPSAxNDc0NTYwMCwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBjcF9sb29rdXBzW10gPSB7CisJewkvKiBDTENEICovCisJCS5kZXZfaWQJCT0gIm1iOmMwIiwKKwkJLmNsawkJPSAmY3BfYXV4Y2xrLAorCX0sCiB9OwogCiAvKgpAQCAtNTU0LDggKzU1Niw4IEBACiB7CiAJaW50IGk7CiAKLQljbGtfcmVnaXN0ZXIoJmNwX2NsY2RfY2xrKTsKLQljbGtfcmVnaXN0ZXIoJmNwX21tY2lfY2xrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcF9sb29rdXBzKTsgaSsrKQorCQljbGtkZXZfYWRkKCZjcF9sb29rdXBzW2ldKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGludGNwX2RldnMsIEFSUkFZX1NJWkUoaW50Y3BfZGV2cykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ODQ2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jaWZuZGVmIF9JT1AxM1hYX0RNQV9ICi0jZGVmaW5lIF9JT1AxM1hYX0RNQV9ICi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGI4MjYwMmQuLmUwMTJiZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTYsMTggKzE2LDYgQEAKICNkZWZpbmUgSU9QMTNYWF9QTU1SX1BfU1RBUlQgKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFKQogI2RlZmluZSBJT1AxM1hYX1BNTVJfUF9FTkQgICAoSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgKyBJT1AxM1hYX1BNTVJfU0laRSkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gUENJIERNQSB2aWV3IG1lbW9yeSBhZGRyZXNzIHRyYW5zbGF0aW9ucwotICogdmlydF90b19idXM6IFVzZWQgdG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYW4KLSAqCQlhZGRyZXNzIHN1aXRhYmxlIHRvIGJlIHBhc3NlZCB0byBzZXRfZG1hX2FkZHIKLSAqIGJ1c190b192aXJ0OiBVc2VkIHRvIGNvbnZlcnQgYW4gYWRkcmVzcyBmb3IgRE1BIG9wZXJhdGlvbnMKLSAqCQl0byBhbiBhZGRyZXNzIHRoYXQgdGhlIGtlcm5lbCBjYW4gdXNlLgotICovCi0KLS8qIFJBTSBoYXMgMToxIG1hcHBpbmcgb24gdGhlIFBDSWUveCBCdXNzZXMgKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoX192aXJ0X3RvX3BoeXMoeCkpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKF9fcGh5c190b192aXJ0KHgpKQotCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgX192aXJ0X3RvX2xidXModW5zaWduZWQgbG9uZyB4KQogewogCXJldHVybiB4ICsgSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgLSBJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRTsKQEAgLTU1LDcgKzQzLDcgQEAKIAkJaWYgKGlzX2xidXNfZGV2aWNlKGRldikgJiYgX19pc19sYnVzX2RtYShfX2RtYSkpCVwKIAkJCV9fdmlydCA9IF9fbGJ1c190b192aXJ0KF9fZG1hKTsJCQlcCiAJCWVsc2UJCQkJCQkJXAotCQkJX192aXJ0ID0gX19idXNfdG9fdmlydChfX2RtYSk7CQkJXAorCQkJX192aXJ0ID0gX19waHlzX3RvX3ZpcnQoX19kbWEpOwkJCVwKIAkJKHZvaWQgKilfX3ZpcnQ7CQkJCQkJXAogCX0pCiAKQEAgLTY2LDcgKzU0LDcgQEAKIAkJaWYgKGlzX2xidXNfZGV2aWNlKGRldikgJiYgX19pc19sYnVzX3ZpcnQoX192aXJ0KSkJXAogCQkJX19kbWEgPSBfX3ZpcnRfdG9fbGJ1cyhfX3ZpcnQpOwkJCVwKIAkJZWxzZQkJCQkJCQlcCi0JCQlfX2RtYSA9IF9fdmlydF90b19idXMoX192aXJ0KTsJCQlcCisJCQlfX2RtYSA9IF9fdmlydF90b19waHlzKF9fdmlydCk7CQkJXAogCQlfX2RtYTsJCQkJCQkJXAogCX0pCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCA1YjFmMWM4Li40NWZiMjc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC0xLDMgKzEgQEAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFICgxMDAgKiBIWikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiZDgxNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IGNlNTQ3MDUuLjMzOWU1ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9fSU9fSAogI2RlZmluZSBfX0lPX0gKIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9wM3h4Lmg+CiAKIGV4dGVybiB2b2lkIF9faW9tZW0gKl9faW9wM3h4X2lvcmVtYXAodW5zaWduZWQgbG9uZyBjb29raWUsIHNpemVfdCBzaXplLAogCXVuc2lnbmVkIGludCBtdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggNDJjZDRiZi4uYzMwZjY0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNSwyMiArNSw5IEBACiAjaWZuZGVmIF9fTUVNT1JZX0gKICNkZWZpbmUgX19NRU1PUllfSAogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAvKgogICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHhhMDAwMDAwMCkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gUENJIERNQSB2aWV3IG1lbW9yeSBhZGRyZXNzIHRyYW5zbGF0aW9ucwotICogdmlydF90b19idXM6IFVzZWQgdG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYW4KLSAqCQlhZGRyZXNzIHN1aXRhYmxlIHRvIGJlIHBhc3NlZCB0byBzZXRfZG1hX2FkZHIKLSAqIGJ1c190b192aXJ0OiBVc2VkIHRvIGNvbnZlcnQgYW4gYWRkcmVzcyBmb3IgRE1BIG9wZXJhdGlvbnMKLSAqCQl0byBhbiBhZGRyZXNzIHRoYXQgdGhlIGtlcm5lbCBjYW4gdXNlLgotICovCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkJKF9fdmlydF90b19waHlzKHgpKQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCShfX3BoeXNfdG9fdmlydCh4KSkKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCAyMGY5MjNlLi4zMmQ5ZTViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC03LDggKzcsOSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb3AzeHguaD4KKyNpbmNsdWRlIDxtYWNoL24yMTAwLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL3RpbWV4LmgKaW5kZXggYTU0MWFmYy4uNzI2MmFiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL3RpbWV4LmgKQEAgLTMsNyArMyw0IEBACiAgKgogICogSU9QMzJ4IGFyY2hpdGVjdHVyZSB0aW1leCBzcGVjaWZpY2F0aW9ucwogICovCi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkoMTAwICogSFopCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YjQyMjMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvaW8uaAppbmRleCAxNTg4NzQ2Li5lOTlhN2VkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvaW8uaApAQCAtMTEsNyArMTEsNyBAQAogI2lmbmRlZiBfX0lPX0gKICNkZWZpbmUgX19JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvcDN4eC5oPgogCiBleHRlcm4gdm9pZCBfX2lvbWVtICpfX2lvcDN4eF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgY29va2llLCBzaXplX3Qgc2l6ZSwKIAl1bnNpZ25lZCBpbnQgbXR5cGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDJjZWYwYmIuLmEzMGE5NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTUsMjIgKzUsOSBAQAogI2lmbmRlZiBfX01FTU9SWV9ICiAjZGVmaW5lIF9fTUVNT1JZX0gKIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQogLyoKICAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgogICovCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCiAKLS8qCi0gKiBWaXJ0dWFsIHZpZXcgPC0+IFBDSSBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKgkJYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKgkJdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCShfX3ZpcnRfdG9fcGh5cyh4KSkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoX19waHlzX3RvX3ZpcnQoeCkpCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKaW5kZXggN2JmM2JmYi4uMGNiM2FkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtNyw2ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb3AzeHguaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCBjNzU3NjA4Li41NGM1ODkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMyw3ICszLDQgQEAKICAqCiAgKiBJT1AzeHggYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zCiAgKi8KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQogI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCSgxMDAgKiBIWikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA2M2Q2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEludGVsIENvcnAuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjQxNTI5YS4uYWVlN2ViOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xNSwxMyArMTUsNiBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCiAKLS8qCi0gKiBWaXJ0dWFsIHZpZXcgPC0+IERNQSB2aWV3IG1lbW9yeSBhZGRyZXNzIHRyYW5zbGF0aW9ucwotICogdmlydF90b19idXM6IFVzZWQgdG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYW4KLSAqCQlhZGRyZXNzIHN1aXRhYmxlIHRvIGJlIHBhc3NlZCB0byBzZXRfZG1hX2FkZHIKLSAqIGJ1c190b192aXJ0OiBVc2VkIHRvIGNvbnZlcnQgYW4gYWRkcmVzcyBmb3IgRE1BIG9wZXJhdGlvbnMKLSAqCQl0byBhbiBhZGRyZXNzIHRoYXQgdGhlIGtlcm5lbCBjYW4gdXNlLgotICovCiAjaW5jbHVkZSA8bWFjaC9peHAyMDAwLXJlZ3MuaD4KIAogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg2NTQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvaW8uaAppbmRleCAzMDVlYTE4Li5mZDllZjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC0yMCw4ICsyMCw2IEBACiAjZGVmaW5lIF9faW8ocCkJCSgodm9pZCBfX2lvbWVtKikoKHApICsgSVhQMjNYWF9QQ0lfSU9fVklSVCkpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBGb3IgQlVHICovCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKIGl4cDIzeHhfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgaW50IG10eXBlKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOWQ0MDExNS4uZmRkMTM4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xOSwxNiArMTksNiBAQAogICovCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCQkoMHgwMDAwMDAwMCkKIAotCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKgkJYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKgkJdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpCQkJCQkJXAogCSh7IHVuc2lnbmVkIGludCByZXQ7CQkJCQkJXAogCXJldCA9ICgoX192aXJ0X3RvX3BoeXModikgLSAweDAwMDAwMDAwKSArCQkJXApAQCAtNDMsNiArMzMsMyBAQAogI2RlZmluZSBhcmNoX2lzX2NvaGVyZW50KCkJMQogCiAjZW5kaWYKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjNTA3MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfRE1BX0gKLSNkZWZpbmUgX19BU01fQVJDSF9ETUFfSAotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBTWl82NE0pCi0KLSNlbmRpZiAvKiBfQVNNX0FSQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggMzE5OTQ4ZS4uY2U2MzA0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTQ5LDggKzQ5LDYgQEAKIAogI2Vsc2UKIAotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KIC8qCiAgKiBJbiB0aGUgY2FzZSBvZiB1c2luZyBpbmRpcmVjdCBQQ0ksIHdlIHNpbXBseSByZXR1cm4gdGhlIGFjdHVhbCBQQ0kKICAqIGFkZHJlc3MgYW5kIG91ciByZWFkL3dyaXRlIGltcGxlbWVudGF0aW9uIHVzZSB0aGF0IHRvIGRyaXZlIHRoZSAKQEAgLTI0MSw3ICsyMzksNyBAQAogCiAjaWZuZGVmIENPTkZJR19QQ0kKIAotI2RlZmluZQlfX2lvKHYpCQl2CisjZGVmaW5lCV9faW8odikJCV9fdHlwZXNhZmVfaW8odikKIAogI2Vsc2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGM0ZDI4MzAuLjk4ZjVlNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTIyLDE5ICsyMiw4IEBACiAJaXhwNHh4X2FkanVzdF96b25lcyhub2RlLCBzaXplLCBob2xlcykKIAogI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRCAoU1pfNjRNIC0gMSkKKyNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBTWl82NE0pCiAKICNlbmRpZgogCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKgkJYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKgkJdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqCi0gKiBUaGVzZSBhcmUgZHVtbWllcyBmb3Igbm93LgotICovCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkJIF9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJIF9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKaW5kZXggMGJiMWZiZC4uN2I4ZWY5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCkBAIC01Nyw2ICs1Nyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3Qgb3Jpb25fZWhjaV9kYXRhIGtpcmt3b29kX2VoY2lfZGF0YSA9IHsKIAkuZHJhbQkJPSAma2lya3dvb2RfbWJ1c19kcmFtX2luZm8sCisJLnBoeV92ZXJzaW9uCT0gRUhDSV9QSFlfTkEsCiB9OwogCiBzdGF0aWMgdTY0IGVoY2lfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKQEAgLTE1Myw2ICsxNTQsNjQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdFMDEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG12NjQzeHhfZXRoX3NoYXJlZF9wbGF0Zm9ybV9kYXRhIGtpcmt3b29kX2dlMDFfc2hhcmVkX2RhdGEgPSB7CisJLmRyYW0JCT0gJmtpcmt3b29kX21idXNfZHJhbV9pbmZvLAorCS5zaGFyZWRfc21pCT0gJmtpcmt3b29kX2dlMDBfc2hhcmVkLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBraXJrd29vZF9nZTAxX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lCT0gImdlMDEgYmFzZSIsCisJCS5zdGFydAk9IEdFMDFfUEhZU19CQVNFICsgMHgyMDAwLAorCQkuZW5kCT0gR0UwMV9QSFlTX0JBU0UgKyAweDNmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLm5hbWUJPSAiZ2UwMSBlcnIgaXJxIiwKKwkJLnN0YXJ0CT0gSVJRX0tJUktXT09EX0dFMDFfRVJSLAorCQkuZW5kCT0gSVJRX0tJUktXT09EX0dFMDFfRVJSLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2lya3dvb2RfZ2UwMV9zaGFyZWQgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfU0hBUkVEX05BTUUsCisJLmlkCQk9IDEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmtpcmt3b29kX2dlMDFfc2hhcmVkX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoa2lya3dvb2RfZ2UwMV9zaGFyZWRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBraXJrd29vZF9nZTAxX3NoYXJlZF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGtpcmt3b29kX2dlMDFfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJnZTAxIGlycSIsCisJCS5zdGFydAk9IElSUV9LSVJLV09PRF9HRTAxX1NVTSwKKwkJLmVuZAk9IElSUV9LSVJLV09PRF9HRTAxX1NVTSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGtpcmt3b29kX2dlMDEgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfTkFNRSwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0ga2lya3dvb2RfZ2UwMV9yZXNvdXJjZXMsCit9OworCit2b2lkIF9faW5pdCBraXJrd29vZF9nZTAxX2luaXQoc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKmV0aF9kYXRhKQoreworCWV0aF9kYXRhLT5zaGFyZWQgPSAma2lya3dvb2RfZ2UwMV9zaGFyZWQ7CisJa2lya3dvb2RfZ2UwMS5kZXYucGxhdGZvcm1fZGF0YSA9IGV0aF9kYXRhOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZraXJrd29vZF9nZTAxX3NoYXJlZCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZraXJrd29vZF9nZTAxKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV0aGVybmV0IHN3aXRjaAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGtpcmt3b29kX3N3aXRjaF9yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5oCmluZGV4IDU3NzQ2MzIuLmZlMzY3YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uaApAQCAtMzAsNiArMzAsNyBAQAogCiB2b2lkIGtpcmt3b29kX2VoY2lfaW5pdCh2b2lkKTsKIHZvaWQga2lya3dvb2RfZ2UwMF9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSk7Cit2b2lkIGtpcmt3b29kX2dlMDFfaW5pdChzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSAqZXRoX2RhdGEpOwogdm9pZCBraXJrd29vZF9nZTAwX3N3aXRjaF9pbml0KHN0cnVjdCBkc2FfcGxhdGZvcm1fZGF0YSAqZCwgaW50IGlycSk7CiB2b2lkIGtpcmt3b29kX3BjaWVfaW5pdCh2b2lkKTsKIHZvaWQga2lya3dvb2RfcnRjX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIzMzVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBhcmNoL2FzbS1hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAorCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KKworI2RlZmluZSBHUElPX01BWAkJNTAKKyNkZWZpbmUgR1BJT19PRkYocGluKQkJKCgocGluKSA+PiA1KSA/IDB4MDE0MCA6IDB4MDEwMCkKKyNkZWZpbmUgR1BJT19PVVQocGluKQkJKERFVl9CVVNfVklSVF9CQVNFICsgR1BJT19PRkYocGluKSArIDB4MDApCisjZGVmaW5lIEdQSU9fSU9fQ09ORihwaW4pCShERVZfQlVTX1ZJUlRfQkFTRSArIEdQSU9fT0ZGKHBpbikgKyAweDA0KQorI2RlZmluZSBHUElPX0JMSU5LX0VOKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgR1BJT19PRkYocGluKSArIDB4MDgpCisjZGVmaW5lIEdQSU9fSU5fUE9MKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgR1BJT19PRkYocGluKSArIDB4MGMpCisjZGVmaW5lIEdQSU9fREFUQV9JTihwaW4pCShERVZfQlVTX1ZJUlRfQkFTRSArIEdQSU9fT0ZGKHBpbikgKyAweDEwKQorI2RlZmluZSBHUElPX0VER0VfQ0FVU0UocGluKQkoREVWX0JVU19WSVJUX0JBU0UgKyBHUElPX09GRihwaW4pICsgMHgxNCkKKyNkZWZpbmUgR1BJT19FREdFX01BU0socGluKQkoREVWX0JVU19WSVJUX0JBU0UgKyBHUElPX09GRihwaW4pICsgMHgxOCkKKyNkZWZpbmUgR1BJT19MRVZFTF9NQVNLKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgR1BJT19PRkYocGluKSArIDB4MWMpCisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKGludCBwaW4pCit7CisJcmV0dXJuIHBpbiArIElSUV9LSVJLV09PRF9HUElPX1NUQVJUOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3BpbyhpbnQgaXJxKQoreworCXJldHVybiBpcnEgLSBJUlFfS0lSS1dPT0RfR1BJT19TVEFSVDsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBmZmFiODlmLi5mMDBhMGE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMSw4ICsxMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICiAKLSNpbmNsdWRlICJraXJrd29vZC5oIgkvKiBuZWVkIEdQSU9fTUFYICovCi0KIC8qCiAgKiBMb3cgSW50ZXJydXB0IENvbnRyb2xsZXIKICAqLwpAQCAtNTEsMTIgKzQ5LDEzIEBACiAjZGVmaW5lIElSUV9LSVJLV09PRF9HUElPX0hJR0hfOF8xNQk0MAogI2RlZmluZSBJUlFfS0lSS1dPT0RfR1BJT19ISUdIXzE2XzIzCTQxCiAjZGVmaW5lIElSUV9LSVJLV09PRF9HRTAwX0VSUgk0NgorI2RlZmluZSBJUlFfS0lSS1dPT0RfR0UwMV9FUlIJNDcKIAogLyoKICAqIEtJUktXT09EIEdlbmVyYWwgUHVycG9zZSBQaW5zCiAgKi8KICNkZWZpbmUgSVJRX0tJUktXT09EX0dQSU9fU1RBUlQJNjQKLSNkZWZpbmUgTlJfR1BJT19JUlFTCQlHUElPX01BWAorI2RlZmluZSBOUl9HUElPX0lSUVMJCTUwCiAKICNkZWZpbmUgTlJfSVJRUwkJCShJUlFfS0lSS1dPT0RfR1BJT19TVEFSVCArIE5SX0dQSU9fSVJRUykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gva2lya3dvb2QuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2tpcmt3b29kLmgKaW5kZXggZWFlNDI0MC4uYWRhNDgwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gva2lya3dvb2QuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9raXJrd29vZC5oCkBAIC0xMTcsNyArMTE3LDQgQEAKICNkZWZpbmUgU0FUQV9QSFlTX0JBU0UJCShLSVJLV09PRF9SRUdTX1BIWVNfQkFTRSB8IDB4ODAwMDApCiAKIAotI2RlZmluZSBHUElPX01BWAkJNTAKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggYjVmYjM0Yi4uNDU0MzFlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTcsOCArNyw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pcnEuYwppbmRleCA1NzkwNjQzLi5lZmI4NmI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaXJxLmMKQEAgLTEzLDEwICsxMyw0NSBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCitzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlCVUdfT04oaXJxIDwgSVJRX0tJUktXT09EX0dQSU9fTE9XXzBfNyk7CisJQlVHX09OKGlycSA+IElSUV9LSVJLV09PRF9HUElPX0hJR0hfMTZfMjMpOworCisJb3Jpb25fZ3Bpb19pcnFfaGFuZGxlcigoaXJxIC0gSVJRX0tJUktXT09EX0dQSU9fTE9XXzBfNykgPDwgMyk7Cit9CisKIHZvaWQgX19pbml0IGtpcmt3b29kX2luaXRfaXJxKHZvaWQpCiB7CisJaW50IGk7CisKIAlvcmlvbl9pcnFfaW5pdCgwLCAodm9pZCBfX2lvbWVtICopKElSUV9WSVJUX0JBU0UgKyBJUlFfTUFTS19MT1dfT0ZGKSk7CiAJb3Jpb25faXJxX2luaXQoMzIsICh2b2lkIF9faW9tZW0gKikoSVJRX1ZJUlRfQkFTRSArIElSUV9NQVNLX0hJR0hfT0ZGKSk7CisKKwkvKgorCSAqIE1hc2sgYW5kIGNsZWFyIEdQSU8gSVJRIGludGVycnVwdHMuCisJICovCisJd3JpdGVsKDAsIEdQSU9fTEVWRUxfTUFTSygwKSk7CisJd3JpdGVsKDAsIEdQSU9fRURHRV9NQVNLKDApKTsKKwl3cml0ZWwoMCwgR1BJT19FREdFX0NBVVNFKDApKTsKKwl3cml0ZWwoMCwgR1BJT19MRVZFTF9NQVNLKDMyKSk7CisJd3JpdGVsKDAsIEdQSU9fRURHRV9NQVNLKDMyKSk7CisJd3JpdGVsKDAsIEdQSU9fRURHRV9DQVVTRSgzMikpOworCisJZm9yIChpID0gSVJRX0tJUktXT09EX0dQSU9fU1RBUlQ7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc2V0X2lycV9jaGlwKGksICZvcmlvbl9ncGlvX2lycV9sZXZlbF9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOworCQlpcnFfZGVzY1tpXS5zdGF0dXMgfD0gSVJRX0xFVkVMOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfS0lSS1dPT0RfR1BJT19MT1dfMF83LCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfS0lSS1dPT0RfR1BJT19MT1dfOF8xNSwgZ3Bpb19pcnFfaGFuZGxlcik7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0tJUktXT09EX0dQSU9fTE9XXzE2XzIzLCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfS0lSS1dPT0RfR1BJT19MT1dfMjRfMzEsIGdwaW9faXJxX2hhbmRsZXIpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9LSVJLV09PRF9HUElPX0hJR0hfMF83LCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfS0lSS1dPT0RfR1BJT19ISUdIXzhfMTUsIGdwaW9faXJxX2hhbmRsZXIpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9LSVJLV09PRF9HUElPX0hJR0hfMTZfMjMsIGdwaW9faXJxX2hhbmRsZXIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MjgxLXNldHVwLmMKaW5kZXggMTc1MDU0YS4uOWEwZTkwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jCkBAIC04MCwyNCArODAsMzggQEAKIAkucG9ydF9uYW1lc1sxXQk9ICJsYW4yIiwKIAkucG9ydF9uYW1lc1syXQk9ICJsYW4zIiwKIAkucG9ydF9uYW1lc1szXQk9ICJsYW40IiwKLQkucG9ydF9uYW1lc1s0XQk9ICJ3YW4iLAogCS5wb3J0X25hbWVzWzVdCT0gImNwdSIsCiB9OwogCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgcmQ4OGY2MjgxX2dlMDFfZGF0YSA9IHsKKwkucGh5X2FkZHIJPSBNVjY0M1hYX0VUSF9QSFlfQUREUigxMSksCit9OworCiBzdGF0aWMgc3RydWN0IG12X3NhdGFfcGxhdGZvcm1fZGF0YSByZDg4ZjYyODFfc2F0YV9kYXRhID0gewogCS5uX3BvcnRzCT0gMiwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCByZDg4ZjYyODFfaW5pdCh2b2lkKQogeworCXUzMiBkZXYsIHJldjsKKwogCS8qCiAJICogQmFzaWMgc2V0dXAuIE5lZWRzIHRvIGJlIGNhbGxlZCBlYXJseS4KIAkgKi8KIAlraXJrd29vZF9pbml0KCk7CiAKIAlraXJrd29vZF9laGNpX2luaXQoKTsKKwogCWtpcmt3b29kX2dlMDBfaW5pdCgmcmQ4OGY2MjgxX2dlMDBfZGF0YSk7CisJa2lya3dvb2RfcGNpZV9pZCgmZGV2LCAmcmV2KTsKKwlpZiAocmV2ID09IE1WODhGNjI4MV9SRVZfQTApIHsKKwkJcmQ4OGY2MjgxX3N3aXRjaF9kYXRhLnN3X2FkZHIgPSAxMDsKKwkJa2lya3dvb2RfZ2UwMV9pbml0KCZyZDg4ZjYyODFfZ2UwMV9kYXRhKTsKKwl9IGVsc2UgeworCQlyZDg4ZjYyODFfc3dpdGNoX2RhdGEucG9ydF9uYW1lc1s0XSA9ICJ3YW4iOworCX0KIAlraXJrd29vZF9nZTAwX3N3aXRjaF9pbml0KCZyZDg4ZjYyODFfc3dpdGNoX2RhdGEsIE5PX0lSUSk7CisKIAlraXJrd29vZF9ydGNfaW5pdCgpOwogCWtpcmt3b29kX3NhdGFfaW5pdCgmcmQ4OGY2MjgxX3NhdGFfZGF0YSk7CiAJa2lya3dvb2RfdWFydDBfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L0tjb25maWcKaW5kZXggY2UxY2Y4ZC4uMjc1NGRhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9LY29uZmlnCkBAIC04LDYgKzgsMTIgQEAKIAkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBydW4gb24gdGhlIG9yaWdpbmFsCiAJICBLZW5kaW4tTWljcmVsIEtTODY5NSBkZXZlbG9wbWVudCBib2FyZC4KIAorY29uZmlnIE1BQ0hfRFNNMzIwCisJYm9vbCAiRFNNLTMyMCBXaXJlbGVzcyBNZWRpYSBQbGF5ZXIiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHJ1biBvbiB0aGUgRC1MaW5rCisJICBEU00tMzIwIFdpcmVsZXNzIE1lZGlhIFBsYXllci4KKwogZW5kbWVudQogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9NYWtlZmlsZQppbmRleCBhZGU0MmI3Li5mNzM1ZDJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogCiAjIEJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0tTODY5NSkJKz0gYm9hcmQtbWljcmVsLm8KK29iai0kKENPTkZJR19NQUNIX0RTTTMyMCkJKz0gYm9hcmQtZHNtMzIwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZmYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMKKyAqCisgKiBEU00tMzIwIEQtTGluayBXaXJlbGVzcyBNZWRpYSBQbGF5ZXIsIGJvYXJkIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKgkJICBEYW5pZWwgU2lsdmVyc3RvbmUgPGRzaWx2ZXJzQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBkc20zMjBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN3aXRjaCAoc2xvdCkgeworCWNhc2UgMDoKKwkJLyogUENJLUFIQiBicmlkZ2U/ICovCisJCXJldHVybiBLUzg2OTVfSVJRX0VYVEVSTjA7CisJY2FzZSAxODoKKwkJLyogTWluaSBQQ0kgc2xvdCAqLworCQlyZXR1cm4gS1M4Njk1X0lSUV9FWFRFUk4yOworCWNhc2UgMjA6CisJCS8qIFJlYWxNQUdJQyBjaGlwICovCisJCXJldHVybiBLUzg2OTVfSVJRX0VYVEVSTjA7CisJfQorCUJVRygpOworfQorCitzdGF0aWMgc3RydWN0IGtzODY5NV9wY2lfY2ZnIF9faW5pdGRhdGEgZHNtMzIwX3BjaSA9IHsKKwkubW9kZQkJPSBLUzg2OTVfTU9ERV9NSU5JUENJLAorCS5tYXBfaXJxCT0gZHNtMzIwX3BjaV9tYXBfaXJxLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGRzbTMyMF9yZWdpc3Rlcl9wY2kodm9pZCkKK3sKKwkvKiBJbml0aWFsaXNlIHRoZSBHUElPIGxpbmVzIGZvciBpbnRlcnJ1cHQgbW9kZSAqLworCS8qIFJlYWxNQUdJQyAqLworCWtzODY5NV9ncGlvX2ludGVycnVwdChLUzg2OTVfR1BJT18wLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCS8qIE1pbmlQQ0kgU2xvdCAqLworCWtzODY5NV9ncGlvX2ludGVycnVwdChLUzg2OTVfR1BJT18yLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCisJa3M4Njk1X2luaXRfcGNpKCZkc20zMjBfcGNpKTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgZHNtMzIwX3JlZ2lzdGVyX3BjaSh2b2lkKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBkc20zMjBfbm9yX3BkYXRhID0geworCS53aWR0aAkJPSA0LAorCS5ucl9wYXJ0cwk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRzbTMyMF9ub3JfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNaXzMyTSwgLyogV2UgZXhwZWN0IHRoZSBib290bG9hZGVyIHRvIG1hcAorCQkJCSAgKiB0aGUgZmxhc2ggaGVyZS4KKwkJCQkgICovCisJCS5lbmQgICA9IFNaXzMyTSArIFNaXzRNIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZHNtMzIwX2RldmljZV9ub3IgPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZHNtMzIwX25vcl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gZHNtMzIwX25vcl9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZHNtMzIwX25vcl9wZGF0YSwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgZHNtMzIwX3JlZ2lzdGVyX25vcih2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRzbTMyMF9kZXZpY2Vfbm9yKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgcGh5c21hcC1mbGFzaCBkZXZpY2VcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZHNtMzIwX2luaXQodm9pZCkKK3sKKwkvKiBHUElPIHJlZ2lzdHJhdGlvbiAqLworCWtzODY5NV9yZWdpc3Rlcl9ncGlvcygpOworCisJLyogUENJIHJlZ2lzdHJhdGlvbiAqLworCWRzbTMyMF9yZWdpc3Rlcl9wY2koKTsKKworCS8qIE5ldHdvcmsgZGV2aWNlICovCisJa3M4Njk1X2FkZF9kZXZpY2VfbGFuKCk7CS8qIGV0aDAgPSBMQU4gKi8KKworCS8qIE5PUiBkZXZpY2VzICovCisJZHNtMzIwX3JlZ2lzdGVyX25vcigpOworfQorCitNQUNISU5FX1NUQVJUKERTTTMyMCwgIkQtTGluayBEU00tMzIwIFdpcmVsZXNzIE1lZGlhIFBsYXllciIpCisJLyogTWFpbnRhaW5lcjogU2ltdGVjIEVsZWN0cm9uaWNzLiAqLworCS5waHlzX2lvCT0gS1M4Njk1X0lPX1BBLAorCS5pb19wZ19vZmZzdAk9IChLUzg2OTVfSU9fVkEgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IEtTODY5NV9TRFJBTV9QQSArIDB4MTAwLAorCS5tYXBfaW8JCT0ga3M4Njk1X21hcF9pbywKKwkuaW5pdF9pcnEJPSBrczg2OTVfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGRzbTMyMF9pbml0LAorCS50aW1lcgkJPSAma3M4Njk1X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKaW5kZXggMDQ2OGU5My4uOGNlYWY1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpAQCAtMzksNiArNDAsOCBAQAogewogCXByaW50ayhLRVJOX0lORk8gIk1pY3JlbCBLUzg2OTUgRGV2ZWxvcG1lbnQgQm9hcmQgaW5pdGlhbGl6aW5nXG4iKTsKIAorCWtzODY5NV9yZWdpc3Rlcl9ncGlvcygpOworCiAjaWZkZWYgQ09ORklHX1BDSQogCWtzODY5NV9pbml0X3BjaSgmbWljcmVsX3BjaSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYwppbmRleCA0YmQyNTE0Li4zNmFiMGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCkBAIC0yNSwxOSArMjUsMjAgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3Mtd2FuLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxhbi5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ocG5hLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLXN3aXRjaC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1taXNjLmg+CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBFdGhlcm5ldAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTV9LUzg2OTVfRVRIRVIpIHx8IGRlZmluZWQoQ09ORklHX0FSTV9LUzg2OTVfRVRIRVJfTU9EVUxFKQogc3RhdGljIHU2NCBldGhfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBrczg2OTVfd2FuX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gS1M4Njk1X1dBTl9WQSwKLQkJLmVuZAk9IEtTODY5NV9XQU5fVkEgKyAweDAwZmYsCisJCS5zdGFydAk9IEtTODY5NV9XQU5fUEEsCisJCS5lbmQJPSBLUzg2OTVfV0FOX1BBICsgMHgwMGZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTU4LDYgKzU5LDEyIEBACiAJCS5lbmQJPSBLUzg2OTVfSVJRX1dBTl9MSU5LLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAorCVs0XSA9IHsKKwkJLm5hbWUJPSAiV0FOIFBIWSIsCisJCS5zdGFydAk9IEtTODY5NV9NSVNDX1BBLAorCQkuZW5kCT0gS1M4Njk1X01JU0NfUEEgKyAweDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga3M4Njk1X3dhbl9kZXZpY2UgPSB7CkBAIC03NCw4ICs4MSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Uga3M4Njk1X2xhbl9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IEtTODY5NV9MQU5fVkEsCi0JCS5lbmQJPSBLUzg2OTVfTEFOX1ZBICsgMHgwMGZmLAorCQkuc3RhcnQJPSBLUzg2OTVfTEFOX1BBLAorCQkuZW5kCT0gS1M4Njk1X0xBTl9QQSArIDB4MDBmZiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC05MCw2ICs5NywxMiBAQAogCQkuZW5kCT0gS1M4Njk1X0lSUV9MQU5fVFhfU1RBVFVTLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAorCVszXSA9IHsKKwkJLm5hbWUJPSAiTEFOIFNXSVRDSCIsCisJCS5zdGFydAk9IEtTODY5NV9TV0lUQ0hfUEEsCisJCS5lbmQJPSBLUzg2OTVfU1dJVENIX1BBICsgMHg0ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGtzODY5NV9sYW5fZGV2aWNlID0gewpAQCAtMTA2LDggKzExOSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Uga3M4Njk1X2hwbmFfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBLUzg2OTVfSFBOQV9WQSwKLQkJLmVuZAk9IEtTODY5NV9IUE5BX1ZBICsgMHgwMGZmLAorCQkuc3RhcnQJPSBLUzg2OTVfSFBOQV9QQSwKKwkJLmVuZAk9IEtTODY5NV9IUE5BX1BBICsgMHgwMGZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTE0OSwxOCArMTYyLDEyIEBACiB7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZrczg2OTVfaHBuYV9kZXZpY2UpOwogfQotI2Vsc2UKLXZvaWQgX19pbml0IGtzODY5NV9hZGRfZGV2aWNlX3dhbih2b2lkKSB7fQotdm9pZCBfX2luaXQga3M4Njk1X2FkZF9kZXZpY2VfbGFuKHZvaWQpIHt9Ci12b2lkIF9faW5pdCBrczg2OTZfYWRkX2RldmljZV9ocG5hKHZvaWQpIHt9Ci0jZW5kaWYKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFdhdGNoZG9nCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfS1M4Njk1X1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19LUzg2OTVfV0FUQ0hET0dfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga3M4Njk1X3dkdF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImtzODY5NV93ZHQiLAogCS5pZAkJPSAtMSwKQEAgLTE3MSw5ICsxNzgsNiBAQAogewogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigma3M4Njk1X3dkdF9kZXZpY2UpOwogfQotI2Vsc2UKLXN0YXRpYyB2b2lkIF9faW5pdCBrczg2OTVfYWRkX2RldmljZV93YXRjaGRvZyh2b2lkKSB7fQotI2VuZGlmCiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE5MCw3ICsxOTQsNyBAQAogCWdwaW9fZGlyZWN0aW9uX291dHB1dChjcHVfbGVkLCAxKTsKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQodGltZXJfbGVkLCAxKTsKIAotCWtzODY5NV9sZWRzX2NwdSAgID0gY3B1X2xlZDsKKwlrczg2OTVfbGVkc19jcHUJICA9IGNwdV9sZWQ7CiAJa3M4Njk1X2xlZHNfdGltZXIgPSB0aW1lcl9sZWQ7CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jCmluZGV4IDlhZWNmMGMuLjU1ZmJmNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ncGlvLmMKQEAgLTIsNiArMiw4IEBACiAgKiBhcmNoL2FybS9tYWNoLWtzODY5NS9ncGlvLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW5kcmV3IFZpY3RvcgorICogVXBkYXRlZCB0byBHUElPTElCLCBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgICAgICAgICAgICAgICAgRGFuaWVsIFNpbHZlcnN0b25lIDxkc2lsdmVyc0BzaW10ZWMuY28udWs+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0zNSw3ICszNyw3IEBACiAgKiBDb25maWd1cmUgYSBHUElPIGxpbmUgZm9yIGVpdGhlciBHUElPIGZ1bmN0aW9uLCBvciBpdHMgaW50ZXJuYWwKICAqIGZ1bmN0aW9uIChJbnRlcnJ1cHQsIFRpbWVyLCBldGMpLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIGtzODY5NV9ncGlvX21vZGUodW5zaWduZWQgaW50IHBpbiwgc2hvcnQgZ3BpbykKK3N0YXRpYyB2b2lkIGtzODY5NV9ncGlvX21vZGUodW5zaWduZWQgaW50IHBpbiwgc2hvcnQgZ3BpbykKIHsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlW10gPSB7IElPUENfSU9FSU5UMEVOLCBJT1BDX0lPRUlOVDFFTiwgSU9QQ19JT0VJTlQyRU4sIElPUENfSU9FSU5UM0VOLCBJT1BDX0lPVElNMEVOLCBJT1BDX0lPVElNMUVOIH07CiAJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKQEAgLTYxLDcgKzYzLDcgQEAKIC8qCiAgKiBDb25maWd1cmUgR1BJTyBwaW4gYXMgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZS4KICAqLwotaW50IF9faW5pdF9vcl9tb2R1bGUga3M4Njk1X2dwaW9faW50ZXJydXB0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0eXBlKQoraW50IGtzODY5NV9ncGlvX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwogCkBAIC05NCw3ICs5Niw3IEBACiAvKgogICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gaW5wdXQuCiAgKi8KLWludCBfX2luaXRfb3JfbW9kdWxlIGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGludCBwaW4pCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKIHsKIAl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwogCkBAIC0xMTUsMTMgKzExNywxMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKIAogCiAvKgogICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gb3V0cHV0LCB3aXRoIGRlZmF1bHQgc3RhdGUuCiAgKi8KLWludCBfX2luaXRfb3JfbW9kdWxlIGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgc3RhdGUpCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCQkJCXVuc2lnbmVkIGludCBwaW4sIGludCBzdGF0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwogCkBAIC0xNTAsMTMgKzE1MiwxMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CiAKIAogLyoKICAqIFNldCB0aGUgc3RhdGUgb2YgYW4gb3V0cHV0IEdQSU8gbGluZS4KICAqLwotdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgc3RhdGUpCitzdGF0aWMgdm9pZCBrczg2OTVfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCQkJICB1bnNpZ25lZCBpbnQgcGluLCBpbnQgc3RhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKIApAQCAtMTc1LDEzICsxNzcsMTIgQEAKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19zZXRfdmFsdWUpOwogCiAKIC8qCiAgKiBSZWFkIHRoZSBzdGF0ZSBvZiBhIEdQSU8gbGluZS4KICAqLwotaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGludCBwaW4pCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKIHsKIAl1bnNpZ25lZCBsb25nIHg7CiAKQEAgLTE5MSwyMSArMTkyLDE4IEBACiAJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwogCXJldHVybiAoeCAmIElPUEQocGluKSkgIT0gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19nZXRfdmFsdWUpOwogCiAKIC8qCiAgKiBNYXAgR1BJTyBsaW5lIHRvIElSUSBudW1iZXIuCiAgKi8KLWludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgcGluKQorc3RhdGljIGludCBrczg2OTVfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBwaW4pCiB7CiAJaWYgKHBpbiA+IEtTODY5NV9HUElPXzMpCS8qIG9ubHkgR1BJTyAwLi4zIGNhbiBnZW5lcmF0ZSBJUlEgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gZ3Bpb19pcnFbcGluXTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb190b19pcnEpOwotCiAKIC8qCiAgKiBNYXAgSVJRIG51bWJlciB0byBHUElPIGxpbmUuCkBAIC0yMTksNiArMjE3LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlycV90b19ncGlvKTsKIAorLyogR1BJT0xJQiBpbnRlcmZhY2UgKi8KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAga3M4Njk1X2dwaW9fY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJLUzg2OTUiLAorCS5kaXJlY3Rpb25faW5wdXQJPSBrczg2OTVfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBrczg2OTVfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCS5nZXQJCQk9IGtzODY5NV9ncGlvX2dldF92YWx1ZSwKKwkuc2V0CQkJPSBrczg2OTVfZ3Bpb19zZXRfdmFsdWUsCisJLnRvX2lycQkJCT0ga3M4Njk1X2dwaW9fdG9faXJxLAorCS5iYXNlCQkJPSAwLAorCS5uZ3BpbwkJCT0gMTYsCisJLmNhbl9zbGVlcAkJPSAwLAorfTsKKworLyogUmVnaXN0ZXIgdGhlIEdQSU9zICovCit2b2lkIGtzODY5NV9yZWdpc3Rlcl9ncGlvcyh2b2lkKQoreworCWlmIChncGlvY2hpcF9hZGQoJmtzODY5NV9ncGlvX2NoaXApKQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjb3JlIEdQSU9zXG4iKTsKK30KIAogLyogLi4uLiBEZWJ1ZyBpbnRlcmZhY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjEyMDYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGQ0YWY1YzMuLjg2MzEyZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMzAsNTMgKzMwLDI4IEBACiAjZGVmaW5lIEtTODY5NV9HUElPXzE0CQkxNAogI2RlZmluZSBLUzg2OTVfR1BJT18xNQkJMTUKIAotCiAvKgogICogQ29uZmlndXJlIEdQSU8gcGluIGFzIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2UuCiAgKi8KLWludCBfX2luaXRfb3JfbW9kdWxlIGtzODY5NV9ncGlvX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdHlwZSk7Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIEdQSU8gbGluZSBhcyBhbiBpbnB1dC4KLSAqLwotaW50IF9faW5pdF9vcl9tb2R1bGUgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgaW50IHBpbik7Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIEdQSU8gbGluZSBhcyBhbiBvdXRwdXQsIHdpdGggZGVmYXVsdCBzdGF0ZS4KLSAqLwotaW50IF9faW5pdF9vcl9tb2R1bGUgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBzdGF0ZSk7Ci0KLS8qCi0gKiBTZXQgdGhlIHN0YXRlIG9mIGFuIG91dHB1dCBHUElPIGxpbmUuCi0gKi8KLXZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHN0YXRlKTsKLQotLyoKLSAqIFJlYWQgdGhlIHN0YXRlIG9mIGEgR1BJTyBsaW5lLgotICovCi1pbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgaW50IHBpbik7Ci0KLS8qCi0gKiBNYXAgR1BJTyBsaW5lIHRvIElSUSBudW1iZXIuCi0gKi8KLWludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgcGluKTsKK2V4dGVybiBpbnQga3M4Njk1X2dwaW9faW50ZXJydXB0KHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB0eXBlKTsKIAogLyoKICAqIE1hcCBJUlEgbnVtYmVyIHRvIEdQSU8gbGluZS4KICAqLwotaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpOwotCitleHRlcm4gaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgogCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgaW50IHBpbiwgY29uc3QgY2hhciAqbGFiZWwpCi17Ci0JcmV0dXJuIDA7Ci19CisvKiBJZiBpdCB0dXJucyBvdXQgdGhhdCB3ZSBuZWVkIHRvIG9wdGltaXNlIEdQSU8gYWNjZXNzIGZvciB0aGUKKyAqIE1pY3JlbCdzIEdQSU9zLCB0aGVuIHRoZXNlIGNhbiBiZSBjaGFuZ2VkIHRvIGNoZWNrIHRoZWlyIGFyZ3VtZW50CisgKiBkaXJlY3RseSBhcyBzdGF0aWMgaW5saW5lcy4gSG93ZXZlciBmb3Igbm93IGl0J3MgcHJvYmFibHkgbm90CisgKiB3b3J0aHdoaWxlLgorICovCisjZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlIF9fZ3Bpb19nZXRfdmFsdWUKKyNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUgX19ncGlvX3NldF92YWx1ZQorI2RlZmluZSBncGlvX3RvX2lycSBfX2dwaW9fdG9faXJxCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgaW50IHBpbikKLXsKLQltaWdodF9zbGVlcCgpOwotfQorLyogUmVnaXN0ZXIgdGhlIEdQSU9zICovCitleHRlcm4gdm9pZCBrczg2OTVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvaW8uaAppbmRleCBmMzY0ZjI0Li5hN2E2M2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvaW8uaApAQCAtMTMsNyArMTMsNyBAQAogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweGZmZmZmZmZmCiAKLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQotI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOGZiYzRjNy4uNmQ1ODg3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMzcsMTEgKzM3LDYgQEAKIAkJCQkJKGRtYV9hZGRyX3QpX192aXJ0X3RvX3BoeXMoeCkgOiAoZG1hX2FkZHJfdClfX3ZpcnRfdG9fYnVzKHgpOyB9KQogI2RlZmluZSBfX2FyY2hfcGFnZV90b19kbWEoZGV2LCB4KQlfX2FyY2hfdmlydF90b19kbWEoZGV2LCBwYWdlX2FkZHJlc3MoeCkpCiAKLSNlbHNlCi0KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZTQ4YmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmUgSGlsbCAoc2poaWxsQGNvdHcuY29tKQotICoKLSAqIENoYW5nZWxvZzoKLSAqICAwOC0yOS0yMDAwCVNKSAlDcmVhdGVkCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLS8qIERNQSBpcyBub3QgeWV0IGltcGxlbWVudGVkISBJdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgYWNvcm4sIGNvcHkgb3Zlci4uICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBtYXhpbXVtIERNQSBhZGRyZXNzIHRoYXQgY2FuIGJlIERNQWQgdG8uCi0gKiBUaGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAoMHhkMDAwMDAwMCAtIDB4YzAwMDAwMDApCi0gKiBieXRlcyBvZiBSQU0uCi0gKi8KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTICAgICAgICAgMHhkMDAwMDAwMAotCi0jZGVmaW5lIERNQV9TMCAgICAgICAgICAgICAgICAgIDAKLQotI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggZDQzMmJhOS4uYTc3MGE4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0xMCwxOCArMTAsMTIgQEAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCiAvKgogICogVGhlcmUgYXJlIG5vdCByZWFsIElTQSBub3IgUENJIGJ1c2VzLCBzbyB3ZSBmYWtlIGl0LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX19pbyh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOwotfQotI2RlZmluZSBfX2lvKGEpCV9faW8oYSkKLSNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKKyNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQorI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBmMzM4Y2YzLi45ZmI0MGVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTcsOSArMTcsNiBAQAogICovCiAjZGVmaW5lIFBIWVNfT0ZGU0VUICAgICBVTCgweGYwMDAwMDAwKQogCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkgX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KSBfX3BoeXNfdG9fdmlydCh4KQotCiAvKgogICogQ2FjaGUgZmx1c2hpbmcgYXJlYSAtIFJPTQogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xvY2tzLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xvY2tzLmMKaW5kZXggNGZiMjNhYy4uNjE4MmY1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2Nsb2Nrcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbG9ja3MuYwpAQCAtMTQsMjEgKzE0LDE0IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIHN0cnVjdCBtb2R1bGU7Ci1zdHJ1Y3QgaWNzdDUyNV9wYXJhbXM7CiAKIHN0cnVjdCBjbGsgewogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJY29uc3QgY2hhciAqbmFtZTsKLS8vCXZvaWQgKmRhdGE7Ci0vLwljb25zdCBzdHJ1Y3QgaWNzdDUyNV9wYXJhbXMgKnBhcmFtczsKLS8vCXZvaWQgKCpzZXR2Y28pKHN0cnVjdCBjbGsgKiwgc3RydWN0IGljc3Q1MjVfdmNvIHZjbyk7CiB9OwogCi1pbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7Ci12b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7Ci0KIC8qIC0tLS0tICovCiAKICNkZWZpbmUgTUFJTkRJVjEoYykJKCgoYykgPj4gIDcpICYgMHgwZikKQEAgLTc5LDMxICs3MiwxNSBAQAogCiAvKiAtLS0tLSAqLwogCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKLQogc3RydWN0IGNsayAqY2xrX2dldCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKLQlzdHJ1Y3QgY2xrICpwOwotCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0KLQlkb3duICgmY2xvY2tzX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSAocCwgJmNsb2Nrcywgbm9kZSkgewotCQlpZiAoc3RyY21wIChpZCwgcC0+bmFtZSkgPT0gMAotCQkgICAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JdXAgKCZjbG9ja3Nfc2VtKTsKLQotCXJldHVybiBjbGs7CisJcmV0dXJuIGRldiAmJiBzdHJjbXAoZGV2X25hbWUoZGV2KSwgImNsZGMtbGg3YTQweCIpID09IDAKKwkJID8gTlVMTCA6IEVSUl9QVFIoLUVOT0VOVCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19nZXQpOwogCiB2b2lkIGNsa19wdXQgKHN0cnVjdCBjbGsgKmNsaykKIHsKLQltb2R1bGVfcHV0KGNsay0+b3duZXIpOwogfQogRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKIApAQCAtMTE4LDIwICs5NSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKIAotaW50IGNsa191c2UgKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VzZSk7Ci0KLXZvaWQgY2xrX3VudXNlIChzdHJ1Y3QgY2xrICpjbGspCi17Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnVzZSk7Ci0KIHVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlIChzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JcmV0dXJuIGNsay0+cmF0ZTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKIApAQCAtMTQzLDU2ICsxMDksNiBAQAogCiBpbnQgY2xrX3NldF9yYXRlIChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKLQlpbnQgcmV0ID0gLUVJTzsKLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlPOwogfQogRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOwotCi0jaWYgMAotLyoKLSAqIFRoZXNlIGFyZSBmaXhlZCBjbG9ja3MuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGttaV9jbGsgPSB7Ci0JLm5hbWUJPSAiS01JUkVGQ0xLIiwKLQkucmF0ZQk9IDI0MDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydF9jbGsgPSB7Ci0JLm5hbWUJPSAiVUFSVENMSyIsCi0JLnJhdGUJPSAyNDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2lfY2xrID0gewotCS5uYW1lCT0gIk1DTEsiLAotCS5yYXRlCT0gMzMwMDAwMDAsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsY2RfY2xrID0gewotCS5uYW1lCT0gIkNMQ0RDTEsiLAotCS5yYXRlCT0gMCwKLX07Ci0KLWludCBjbGtfcmVnaXN0ZXIgKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlkb3duICgmY2xvY2tzX3NlbSk7Ci0JbGlzdF9hZGQgKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCXVwICgmY2xvY2tzX3NlbSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7Ci0KLXZvaWQgY2xrX3VucmVnaXN0ZXIgKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlkb3duICgmY2xvY2tzX3NlbSk7Ci0JbGlzdF9kZWwgKCZjbGstPm5vZGUpOwotCXVwICgmY2xvY2tzX3NlbSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnJlZ2lzdGVyKTsKLQotc3RhdGljIGludCBfX2luaXQgY2xrX2luaXQgKHZvaWQpCi17Ci0JY2xrX3JlZ2lzdGVyKCZjbGNkX2Nsayk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGNsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvaW8uaAppbmRleCAwMzFkMjZmLi42ZWNlNDU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC0xMSwxMiArMTEsMTAgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSU9fSAogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyogTm8gSVNBIG9yIFBDSSBidXMgb24gdGhpcyBtYWNoaW5lLiAqLwotI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAxZGExNGZmLi4xODlkMjBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE5LDE2ICsxOSw2IEBACiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHhjMDAwMDAwMCkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICoJCWFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICoJCXRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkgX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkgX19waHlzX3RvX3ZpcnQoeCkKLQogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWxva2kvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggYTM5NTMzYS4uMmVkN2U2ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNyw4ICs3LDQgQEAKIAogI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKIAotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCV9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJX19waHlzX3RvX3ZpcnQoeCkKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYzZhMmZlYi4uYWFiOTY0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIzLDExICsyMyw3IEBACiAKIHZvaWQgX19pb21lbSAqX19tc21faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBtdHlwZSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2lvKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWFkZHI7Ci19Ci0jZGVmaW5lIF9faW8oYSkgICAgICAgICBfX2lvKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKICNkZWZpbmUgX19tZW1fcGNpKGEpICAgIChhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA2M2ZkNDdmLi5mNDY5OGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xOSw5ICsxOSw1IEBACiAvKiBwaHlzaWNhbCBvZmZzZXQgb2YgUkFNICovCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweDEwMDAwMDAwKQogCi0vKiBidXMgYWRkcmVzcyBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZSBpZGVudGljYWwgKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvY29tbW9uLmMKaW5kZXggMjM4YTJmOC4uYjBlNGUwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9jb21tb24uYwpAQCAtMTY3LDYgKzE2Nyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3Qgb3Jpb25fZWhjaV9kYXRhIG12Nzh4eDBfZWhjaV9kYXRhID0gewogCS5kcmFtCQk9ICZtdjc4eHgwX21idXNfZHJhbV9pbmZvLAorCS5waHlfdmVyc2lvbgk9IEVIQ0lfUEhZX05BLAogfTsKIAogc3RhdGljIHU2NCBlaGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhOGMxNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkMTUzNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBhcmNoL2FzbS1hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19ICisKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCitleHRlcm4gaW50IG12Nzh4eDBfY29yZV9pbmRleCh2b2lkKTsKKworI2RlZmluZSBHUElPX01BWAkJMzIKKyNkZWZpbmUgR1BJT19PVVQocGluKQkJKERFVl9CVVNfVklSVF9CQVNFICsgMHgwMTAwKQorI2RlZmluZSBHUElPX0lPX0NPTkYocGluKQkoREVWX0JVU19WSVJUX0JBU0UgKyAweDAxMDQpCisjZGVmaW5lIEdQSU9fQkxJTktfRU4ocGluKQkoREVWX0JVU19WSVJUX0JBU0UgKyAweDAxMDgpCisjZGVmaW5lIEdQSU9fSU5fUE9MKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgMHgwMTBjKQorI2RlZmluZSBHUElPX0RBVEFfSU4ocGluKQkoREVWX0JVU19WSVJUX0JBU0UgKyAweDAxMTApCisjZGVmaW5lIEdQSU9fRURHRV9DQVVTRShwaW4pCShERVZfQlVTX1ZJUlRfQkFTRSArIDB4MDExNCkKKyNkZWZpbmUgR1BJT19NQVNLX09GRgkJKG12Nzh4eDBfY29yZV9pbmRleCgpID8gMHgxOCA6IDApCisjZGVmaW5lIEdQSU9fRURHRV9NQVNLKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgMHgwMTE4ICsgR1BJT19NQVNLX09GRikKKyNkZWZpbmUgR1BJT19MRVZFTF9NQVNLKHBpbikJKERFVl9CVVNfVklSVF9CQVNFICsgMHgwMTFjICsgR1BJT19NQVNLX09GRikKKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEoaW50IHBpbikKK3sKKwlyZXR1cm4gcGluICsgSVJRX01WNzhYWDBfR1BJT19TVEFSVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8oaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxIC0gSVJRX01WNzhYWDBfR1BJT19TVEFSVDsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggYmViYzMzMC4uZmExZDQyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTExLDggKzExLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKICNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0gKIAotI2luY2x1ZGUgIm12Nzh4eDAuaCIJLyogbmVlZCBHUElPX01BWCAqLwotCiAvKgogICogTVY3OHh4MCBMb3cgSW50ZXJydXB0IENvbnRyb2xsZXIKICAqLwpAQCAtODgsNyArODYsNyBAQAogICogTVY3OFhYMCBHZW5lcmFsIFB1cnBvc2UgUGlucwogICovCiAjZGVmaW5lIElSUV9NVjc4WFgwX0dQSU9fU1RBUlQJOTYKLSNkZWZpbmUgTlJfR1BJT19JUlFTCQlHUElPX01BWAorI2RlZmluZSBOUl9HUElPX0lSUVMJCTMyCiAKICNkZWZpbmUgTlJfSVJRUwkJCShJUlFfTVY3OFhYMF9HUElPX1NUQVJUICsgTlJfR1BJT19JUlFTKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA5ZTQ3YTE0Li5lNjYzMDQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTcsOCArNyw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL212Nzh4eDAuaCBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCmluZGV4IGVlOWM1NTkuLmU5MzBlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCkBAIC0xMjIsNyArMTIyLDQgQEAKICNkZWZpbmUgU0FUQV9QSFlTX0JBU0UJCShNVjc4WFgwX1JFR1NfUEhZU19CQVNFIHwgMHhhMDAwMCkKIAogCi0jZGVmaW5lIEdQSU9fTUFYCQkzMgotCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2lycS5jCmluZGV4IDUwM2U1ZDEuLmUyNzM0MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMKQEAgLTExLDEzICsxMSw0MiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvbXY3OHh4MC5oPgogI2luY2x1ZGUgPHBsYXQvaXJxLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCUJVR19PTihpcnEgPCBJUlFfTVY3OFhYMF9HUElPXzBfNyB8fCBpcnEgPiBJUlFfTVY3OFhYMF9HUElPXzI0XzMxKTsKKworCW9yaW9uX2dwaW9faXJxX2hhbmRsZXIoKGlycSAtIElSUV9NVjc4WFgwX0dQSU9fMF83KSA8PCAzKTsKK30KKwogdm9pZCBfX2luaXQgbXY3OHh4MF9pbml0X2lycSh2b2lkKQogeworCWludCBpOworCiAJb3Jpb25faXJxX2luaXQoMCwgKHZvaWQgX19pb21lbSAqKShJUlFfVklSVF9CQVNFICsgSVJRX01BU0tfTE9XX09GRikpOwogCW9yaW9uX2lycV9pbml0KDMyLCAodm9pZCBfX2lvbWVtICopKElSUV9WSVJUX0JBU0UgKyBJUlFfTUFTS19ISUdIX09GRikpOwogCW9yaW9uX2lycV9pbml0KDY0LCAodm9pZCBfX2lvbWVtICopKElSUV9WSVJUX0JBU0UgKyBJUlFfTUFTS19FUlJfT0ZGKSk7CisKKwkvKgorCSAqIE1hc2sgYW5kIGNsZWFyIEdQSU8gSVJRIGludGVycnVwdHMuCisJICovCisJd3JpdGVsKDAsIEdQSU9fTEVWRUxfTUFTSygwKSk7CisJd3JpdGVsKDAsIEdQSU9fRURHRV9NQVNLKDApKTsKKwl3cml0ZWwoMCwgR1BJT19FREdFX0NBVVNFKDApKTsKKworCWZvciAoaSA9IElSUV9NVjc4WFgwX0dQSU9fU1RBUlQ7IGkgPCBOUl9JUlFTOyBpKyspIHsKKwkJc2V0X2lycV9jaGlwKGksICZvcmlvbl9ncGlvX2lycV9sZXZlbF9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOworCQlpcnFfZGVzY1tpXS5zdGF0dXMgfD0gSVJRX0xFVkVMOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTVY3OFhYMF9HUElPXzBfNywgZ3Bpb19pcnFfaGFuZGxlcik7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX01WNzhYWDBfR1BJT184XzE1LCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTVY3OFhYMF9HUElPXzE2XzIzLCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTVY3OFhYMF9HUElPXzI0XzMxLCBncGlvX2lycV9oYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW14MS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTlmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14MS9LY29uZmlnCkBAIC0wLDAgKzEsMTQgQEAKK2lmIEFSQ0hfTVgxCisKK2NvbW1lbnQgIk1YMSBQbGF0Zm9ybXMiCisKK2NvbmZpZyBNQUNIX01YTEFEUworCWJvb2wKKworY29uZmlnIEFSQ0hfTVgxQURTCisJYm9vbCAiTVgxQURTIHBsYXRmb3JtIgorCXNlbGVjdCBNQUNIX01YTEFEUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBNb3Rvcm9sYSBNWDFBRFMvTVhMQURTIGJvYXJkcworCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW14MS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY5NzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkJCQkrPSBnZW5lcmljLm8gY2xvY2subyBkZXZpY2VzLm8KKworIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0CitvYmotJChDT05GSUdfQVJDSF9NWDFBRFMpICs9IG14MWFkcy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1teDEvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQxNDkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDEvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDQgQEAKKyAgIHpyZWxhZGRyLXkJOj0gMHgwODAwODAwMAorcGFyYW1zX3BoeXMteQk6PSAweDA4MDAwMTAwCitpbml0cmRfcGh5cy15CTo9IDB4MDg4MDAwMDAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtbXgxL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjZDFlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgxL2Nsb2NrLmMKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiY3JtX3JlZ3MuaCIKKworc3RhdGljIGludCBfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJcmVnIHw9IDEgPDwgY2xrLT5lbmFibGVfc2hpZnQ7CisJX19yYXdfd3JpdGVsKHJlZywgY2xrLT5lbmFibGVfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCXJlZyAmPSB+KDEgPDwgY2xrLT5lbmFibGVfc2hpZnQpOworCV9fcmF3X3dyaXRlbChyZWcsIGNsay0+ZW5hYmxlX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgX2Nsa19jYW5fdXNlX3BhcmVudChjb25zdCBzdHJ1Y3QgY2xrICpjbGtfYXJyW10sIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICAgIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWlmIChwYXJlbnQgPT0gY2xrX2FycltpXSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitfY2xrX3NpbXBsZV9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlLCB1bnNpZ25lZCBpbnQgbGltaXQpCit7CisJaW50IGRpdjsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCWlmIChwYXJlbnRfcmF0ZSAlIHJhdGUpCisJCWRpdisrOworCisJaWYgKGRpdiA+IGxpbWl0KQorCQlkaXYgPSBsaW1pdDsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIGRpdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX2Nsa19wYXJlbnRfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJvdW5kX3JhdGUoY2xrLT5wYXJlbnQsIHJhdGUpOworfQorCitzdGF0aWMgaW50IF9jbGtfcGFyZW50X3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBjbGstPnBhcmVudC0+c2V0X3JhdGUoY2xrLT5wYXJlbnQsIHJhdGUpOworfQorCisvKgorICogIGdldCB0aGUgc3lzdGVtIHBsbCBjbG9jayBpbiBIegorICoKKyAqICAgICAgICAgICAgICAgICAgbWZpICsgbWZuIC8gKG1mZCArMSkKKyAqICBmID0gMiAqIGZfcmVmICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcGQgKyAxCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG14MV9kZWNvZGVfcGxsKHVuc2lnbmVkIGludCBwbGwsIHUzMiBmX3JlZikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGw7CisJdW5zaWduZWQgbG9uZyBxdW90OworCisJdTMyIG1maSA9IChwbGwgPj4gMTApICYgMHhmOworCXUzMiBtZm4gPSBwbGwgJiAweDNmZjsKKwl1MzIgbWZkID0gKHBsbCA+PiAxNikgJiAweDNmZjsKKwl1MzIgcGQgPSAgKHBsbCA+PiAyNikgJiAweGY7CisKKwltZmkgPSBtZmkgPD0gNSA/IDUgOiBtZmk7CisKKwlsbCA9IDIgKiAodW5zaWduZWQgbG9uZyBsb25nKWZfcmVmICoKKwkJKChtZmkgPDwgMTYpICsgKG1mbiA8PCAxNikgLyAobWZkICsgMSkpOworCXF1b3QgPSAocGQgKyAxKSAqICgxIDw8IDE2KTsKKwlsbCArPSBxdW90IC8gMjsKKwlkb19kaXYobGwsIHF1b3QpOworCXJldHVybiAodW5zaWduZWQgbG9uZylsbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMTZtX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gMTYwMDAwMDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsazE2bSA9IHsKKwkubmFtZSA9ICJDTEsxNk0iLAorCS5nZXRfcmF0ZSA9IGNsazE2bV9nZXRfcmF0ZSwKKwkuZW5hYmxlID0gX2Nsa19lbmFibGUsCisJLmVuYWJsZV9yZWcgPSBDQ01fQ1NDUiwKKwkuZW5hYmxlX3NoaWZ0ID0gQ0NNX0NTQ1JfT1NDX0VOX1NISUZULAorCS5kaXNhYmxlID0gX2Nsa19kaXNhYmxlLAorfTsKKworLyogaW4gSHogKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazMyX3JhdGU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazMyX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrMzJfcmF0ZTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrMzIgPSB7CisJLm5hbWUgPSAiQ0xLMzIiLAorCS5nZXRfcmF0ZSA9IGNsazMyX2dldF9yYXRlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrMzJfcHJlbXVsdF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiA1MTI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsazMyX3ByZW11bHQgPSB7CisJLm5hbWUgPSAiQ0xLMzJfcHJlbXVsdGlwbGllciIsCisJLnBhcmVudCA9ICZjbGszMiwKKwkuZ2V0X3JhdGUgPSBjbGszMl9wcmVtdWx0X2dldF9yYXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGsgKnByZW1fY2xrX2Nsb2Nrc1tdID0geworCSZjbGszMl9wcmVtdWx0LAorCSZjbGsxNm0sCit9OworCitzdGF0aWMgaW50IHByZW1fY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKworCWkgPSBfY2xrX2Nhbl91c2VfcGFyZW50KHByZW1fY2xrX2Nsb2NrcywgQVJSQVlfU0laRShwcmVtX2Nsa19jbG9ja3MpLAorCQkJCXBhcmVudCk7CisKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCXJlZyAmPSB+Q0NNX0NTQ1JfU1lTVEVNX1NFTDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZWcgfD0gQ0NNX0NTQ1JfU1lTVEVNX1NFTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGk7CisJfQorCisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHByZW1fY2xrID0geworCS5uYW1lID0gInByZW1fY2xrIiwKKwkuc2V0X3BhcmVudCA9IHByZW1fY2xrX3NldF9wYXJlbnQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzeXN0ZW1fY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gbXgxX2RlY29kZV9wbGwoX19yYXdfcmVhZGwoQ0NNX1NQQ1RMMCksCisJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgc3lzdGVtX2NsayA9IHsKKwkubmFtZSA9ICJzeXN0ZW1fY2xrIiwKKwkucGFyZW50ID0gJnByZW1fY2xrLAorCS5nZXRfcmF0ZSA9IHN5c3RlbV9jbGtfZ2V0X3JhdGUsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtY3VfY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gbXgxX2RlY29kZV9wbGwoX19yYXdfcmVhZGwoQ0NNX01QQ1RMMCksCisJCQkgICAgICBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgbWN1X2NsayA9IHsKKwkubmFtZSA9ICJtY3VfY2xrIiwKKwkucGFyZW50ID0gJmNsazMyX3ByZW11bHQsCisJLmdldF9yYXRlID0gbWN1X2Nsa19nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmNsayA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlpZiAoX19yYXdfcmVhZGwoQ0NNX0NTQ1IpICYgQ0NNX0NTQ1JfUFJFU0MpCisJCWZjbGsgLz0gMjsKKworCXJldHVybiBmY2xrOworfQorCitzdGF0aWMgc3RydWN0IGNsayBmY2xrID0geworCS5uYW1lID0gImZjbGsiLAorCS5wYXJlbnQgPSAmbWN1X2NsaywKKwkuZ2V0X3JhdGUgPSBmY2xrX2dldF9yYXRlLAorfTsKKworLyoKKyAqICBnZXQgaGNsayAoIFNEUkFNLCBDU0ksIE1lbW9yeSBTdGljaywgSTJDLCBETUEgKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9DU0NSKSAmCisJCQlDQ01fQ1NDUl9CQ0xLX01BU0spID4+IENDTV9DU0NSX0JDTEtfT0ZGU0VUKSArIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIF9jbGtfc2ltcGxlX3JvdW5kX3JhdGUoY2xrLCByYXRlLCAxNik7Cit9CisKK3N0YXRpYyBpbnQgaGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKworCWlmIChkaXYgPiAxNiB8fCBkaXYgPCAxIHx8ICgocGFyZW50X3JhdGUgLyBkaXYpICE9IHJhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpdi0tOworCisJcmVnID0gX19yYXdfcmVhZGwoQ0NNX0NTQ1IpOworCXJlZyAmPSB+Q0NNX0NTQ1JfQkNMS19NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX0NTQ1JfQkNMS19PRkZTRVQ7CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGhjbGsgPSB7CisJLm5hbWUgPSAiaGNsayIsCisJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAorCS5nZXRfcmF0ZSA9IGhjbGtfZ2V0X3JhdGUsCisJLnJvdW5kX3JhdGUgPSBoY2xrX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gaGNsa19zZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazQ4bV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoKChfX3Jhd19yZWFkbChDQ01fQ1NDUikgJgorCQkJQ0NNX0NTQ1JfVVNCX01BU0spID4+IENDTV9DU0NSX1VTQl9PRkZTRVQpICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsazQ4bV9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBfY2xrX3NpbXBsZV9yb3VuZF9yYXRlKGNsaywgcmF0ZSwgOCk7Cit9CisKK3N0YXRpYyBpbnQgY2xrNDhtX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCisJaWYgKGRpdiA+IDggfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYtLTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKwlyZWcgJj0gfkNDTV9DU0NSX1VTQl9NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX0NTQ1JfVVNCX09GRlNFVDsKKwlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrNDhtID0geworCS5uYW1lID0gIkNMSzQ4TSIsCisJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAorCS5nZXRfcmF0ZSA9IGNsazQ4bV9nZXRfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IGNsazQ4bV9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IGNsazQ4bV9zZXRfcmF0ZSwKK307CisKKy8qCisgKiAgZ2V0IHBlcmlwaGVyYWwgY2xvY2sgMSAoIFVBUlRbMTJdLCBUaW1lclsxMl0sIFBXTSApCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazFfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gKCgoX19yYXdfcmVhZGwoQ0NNX1BDRFIpICYKKwkJCUNDTV9QQ0RSX1BDTEsxX01BU0spID4+IENDTV9QQ0RSX1BDTEsxX09GRlNFVCkgKyAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyY2xrMV9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBfY2xrX3NpbXBsZV9yb3VuZF9yYXRlKGNsaywgcmF0ZSwgMTYpOworfQorCitzdGF0aWMgaW50IHBlcmNsazFfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IGRpdjsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGU7CisKKwlwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlkaXYgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisKKwlpZiAoZGl2ID4gMTYgfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYtLTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9QQ0RSKTsKKwlyZWcgJj0gfkNDTV9QQ0RSX1BDTEsxX01BU0s7CisJcmVnIHw9IGRpdiA8PCBDQ01fUENEUl9QQ0xLMV9PRkZTRVQ7CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX1BDRFIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgZ2V0IHBlcmlwaGVyYWwgY2xvY2sgMiAoIExDRCwgU0QsIFNQSVsxMl0gKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGsyX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9QQ0RSKSAmCisJCQlDQ01fUENEUl9QQ0xLMl9NQVNLKSA+PiBDQ01fUENEUl9QQ0xLMl9PRkZTRVQpICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazJfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDE2KTsKK30KKworc3RhdGljIGludCBwZXJjbGsyX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlOworCisJcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCisJaWYgKGRpdiA+IDE2IHx8IGRpdiA8IDEgfHwgKChwYXJlbnRfcmF0ZSAvIGRpdikgIT0gcmF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2LS07CisKKwlyZWcgPSBfX3Jhd19yZWFkbChDQ01fUENEUik7CisJcmVnICY9IH5DQ01fUENEUl9QQ0xLMl9NQVNLOworCXJlZyB8PSBkaXYgPDwgQ0NNX1BDRFJfUENMSzJfT0ZGU0VUOworCV9fcmF3X3dyaXRlbChyZWcsIENDTV9QQ0RSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIGdldCBwZXJpcGhlcmFsIGNsb2NrIDMgKCBTU0kgKQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJjbGszX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvICgoKF9fcmF3X3JlYWRsKENDTV9QQ0RSKSAmCisJCQlDQ01fUENEUl9QQ0xLM19NQVNLKSA+PiBDQ01fUENEUl9QQ0xLM19PRkZTRVQpICsgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmNsazNfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gX2Nsa19zaW1wbGVfcm91bmRfcmF0ZShjbGssIHJhdGUsIDEyOCk7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2xrM19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZTsKKworCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKworCWlmIChkaXYgPiAxMjggfHwgZGl2IDwgMSB8fCAoKHBhcmVudF9yYXRlIC8gZGl2KSAhPSByYXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYtLTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9QQ0RSKTsKKwlyZWcgJj0gfkNDTV9QQ0RSX1BDTEszX01BU0s7CisJcmVnIHw9IGRpdiA8PCBDQ01fUENEUl9QQ0xLM19PRkZTRVQ7CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX1BDRFIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmNsa1tdID0geworCXsKKwkJLm5hbWUgPSAicGVyY2xrIiwKKwkJLmlkID0gMCwKKwkJLnBhcmVudCA9ICZzeXN0ZW1fY2xrLAorCQkuZ2V0X3JhdGUgPSBwZXJjbGsxX2dldF9yYXRlLAorCQkucm91bmRfcmF0ZSA9IHBlcmNsazFfcm91bmRfcmF0ZSwKKwkJLnNldF9yYXRlID0gcGVyY2xrMV9zZXRfcmF0ZSwKKwl9LCB7CisJCS5uYW1lID0gInBlcmNsayIsCisJCS5pZCA9IDEsCisJCS5wYXJlbnQgPSAmc3lzdGVtX2NsaywKKwkJLmdldF9yYXRlID0gcGVyY2xrMl9nZXRfcmF0ZSwKKwkJLnJvdW5kX3JhdGUgPSBwZXJjbGsyX3JvdW5kX3JhdGUsCisJCS5zZXRfcmF0ZSA9IHBlcmNsazJfc2V0X3JhdGUsCisJfSwgeworCQkubmFtZSA9ICJwZXJjbGsiLAorCQkuaWQgPSAyLAorCQkucGFyZW50ID0gJnN5c3RlbV9jbGssCisJCS5nZXRfcmF0ZSA9IHBlcmNsazNfZ2V0X3JhdGUsCisJCS5yb3VuZF9yYXRlID0gcGVyY2xrM19yb3VuZF9yYXRlLAorCQkuc2V0X3JhdGUgPSBwZXJjbGszX3NldF9yYXRlLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrICpjbGtvX2Nsb2Nrc1tdID0geworCSZwZXJjbGtbMF0sCisJJmhjbGssCisJJmNsazQ4bSwKKwkmY2xrMTZtLAorCSZwcmVtX2NsaywKKwkmZmNsaywKK307CisKK3N0YXRpYyBpbnQgY2xrb19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCWludCBpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlpID0gX2Nsa19jYW5fdXNlX3BhcmVudChjbGtvX2Nsb2NrcywgQVJSQVlfU0laRShjbGtvX2Nsb2NrcyksIHBhcmVudCk7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKSAmIH5DQ01fQ1NDUl9DTEtPX01BU0s7CisJcmVnIHw9IGkgPDwgQ0NNX0NTQ1JfQ0xLT19PRkZTRVQ7CisJX19yYXdfd3JpdGVsKHJlZywgQ0NNX0NTQ1IpOworCisJaWYgKGNsa29fY2xvY2tzW2ldLT5zZXRfcmF0ZSAmJiBjbGtvX2Nsb2Nrc1tpXS0+cm91bmRfcmF0ZSkgeworCQljbGstPnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGU7CisJCWNsay0+cm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGU7CisJfSBlbHNlIHsKKwkJY2xrLT5zZXRfcmF0ZSA9IE5VTEw7CisJCWNsay0+cm91bmRfcmF0ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa29fY2xrID0geworCS5uYW1lID0gImNsa29fY2xrIiwKKwkuc2V0X3BhcmVudCA9IGNsa29fc2V0X3BhcmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9jbGsgPSB7CisJLm5hbWUgPSAiZG1hX2NsayIsCisJLnBhcmVudCA9ICZoY2xrLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKKwkuZW5hYmxlID0gX2Nsa19lbmFibGUsCisJLmVuYWJsZV9yZWcgPSBTQ01fR0NDUiwKKwkuZW5hYmxlX3NoaWZ0ID0gU0NNX0dDQ1JfRE1BX0NMS19FTl9PRkZTRVQsCisJLmRpc2FibGUgPSBfY2xrX2Rpc2FibGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjc2lfY2xrID0geworCS5uYW1lID0gImNzaV9jbGsiLAorCS5wYXJlbnQgPSAmaGNsaywKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCisJLmVuYWJsZSA9IF9jbGtfZW5hYmxlLAorCS5lbmFibGVfcmVnID0gU0NNX0dDQ1IsCisJLmVuYWJsZV9zaGlmdCA9IFNDTV9HQ0NSX0NTSV9DTEtfRU5fT0ZGU0VULAorCS5kaXNhYmxlID0gX2Nsa19kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1hX2NsayA9IHsKKwkubmFtZSA9ICJtbWFfY2xrIiwKKwkucGFyZW50ID0gJmhjbGssCisJLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAorCS5lbmFibGUgPSBfY2xrX2VuYWJsZSwKKwkuZW5hYmxlX3JlZyA9IFNDTV9HQ0NSLAorCS5lbmFibGVfc2hpZnQgPSBTQ01fR0NDUl9NTUFfQ0xLX0VOX09GRlNFVCwKKwkuZGlzYWJsZSA9IF9jbGtfZGlzYWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmRfY2xrID0geworCS5uYW1lID0gInVzYmRfY2xrIiwKKwkucGFyZW50ID0gJmNsazQ4bSwKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCisJLmVuYWJsZSA9IF9jbGtfZW5hYmxlLAorCS5lbmFibGVfcmVnID0gU0NNX0dDQ1IsCisJLmVuYWJsZV9zaGlmdCA9IFNDTV9HQ0NSX1VTQkRfQ0xLX0VOX09GRlNFVCwKKwkuZGlzYWJsZSA9IF9jbGtfZGlzYWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdF9jbGsgPSB7CisJLm5hbWUgPSAiZ3B0X2NsayIsCisJLnBhcmVudCA9ICZwZXJjbGtbMF0sCisJLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydF9jbGsgPSB7CisJLm5hbWUgPSAidWFydF9jbGsiLAorCS5wYXJlbnQgPSAmcGVyY2xrWzBdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyY19jbGsgPSB7CisJLm5hbWUgPSAiaTJjX2NsayIsCisJLnBhcmVudCA9ICZoY2xrLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwaV9jbGsgPSB7CisJLm5hbWUgPSAic3BpX2NsayIsCisJLnBhcmVudCA9ICZwZXJjbGtbMV0sCisJLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2RoY19jbGsgPSB7CisJLm5hbWUgPSAic2RoY19jbGsiLAorCS5wYXJlbnQgPSAmcGVyY2xrWzFdLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGxjZGNfY2xrID0geworCS5uYW1lID0gImxjZGNfY2xrIiwKKwkucGFyZW50ID0gJnBlcmNsa1sxXSwKKwkucm91bmRfcmF0ZSA9IF9jbGtfcGFyZW50X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gX2Nsa19wYXJlbnRfc2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtc2hjX2NsayA9IHsKKwkubmFtZSA9ICJtc2hjX2NsayIsCisJLnBhcmVudCA9ICZoY2xrLAorCS5yb3VuZF9yYXRlID0gX2Nsa19wYXJlbnRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBfY2xrX3BhcmVudF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9jbGsgPSB7CisJLm5hbWUgPSAic3NpX2NsayIsCisJLnBhcmVudCA9ICZwZXJjbGtbMl0sCisJLnJvdW5kX3JhdGUgPSBfY2xrX3BhcmVudF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZSA9IF9jbGtfcGFyZW50X3NldF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcnRjX2NsayA9IHsKKwkubmFtZSA9ICJydGNfY2xrIiwKKwkucGFyZW50ID0gJmNsazMyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKm14Y19jbGtzW10gPSB7CisJJmNsazE2bSwKKwkmY2xrMzIsCisJJmNsazMyX3ByZW11bHQsCisJJnByZW1fY2xrLAorCSZzeXN0ZW1fY2xrLAorCSZtY3VfY2xrLAorCSZmY2xrLAorCSZoY2xrLAorCSZjbGs0OG0sCisJJnBlcmNsa1swXSwKKwkmcGVyY2xrWzFdLAorCSZwZXJjbGtbMl0sCisJJmNsa29fY2xrLAorCSZkbWFfY2xrLAorCSZjc2lfY2xrLAorCSZtbWFfY2xrLAorCSZ1c2JkX2NsaywKKwkmZ3B0X2NsaywKKwkmdWFydF9jbGssCisJJmkyY19jbGssCisJJnNwaV9jbGssCisJJnNkaGNfY2xrLAorCSZsY2RjX2NsaywKKwkmbXNoY19jbGssCisJJnNzaV9jbGssCisJJnJ0Y19jbGssCit9OworCitpbnQgX19pbml0IG14Y19jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpCit7CisJc3RydWN0IGNsayAqKmNsa3A7CisJdW5zaWduZWQgaW50IHJlZzsKKworCS8qIGRpc2FibGUgY2xvY2tzIHdlIGFyZSBhYmxlIHRvICovCisJX19yYXdfd3JpdGVsKDAsIFNDTV9HQ0NSKTsKKworCWNsazMyX3JhdGUgPSBmcmVmOworCXJlZyA9IF9fcmF3X3JlYWRsKENDTV9DU0NSKTsKKworCS8qIGRldGVjdCBjbG9jayByZWZlcmVuY2UgZm9yIHN5c3RlbSBQTEwgKi8KKwlpZiAocmVnICYgQ0NNX0NTQ1JfU1lTVEVNX1NFTCkgeworCQlwcmVtX2Nsay5wYXJlbnQgPSAmY2xrMTZtOworCX0gZWxzZSB7CisJCS8qIGVuc3VyZSB0aGF0IG9zY2lsbGF0b3IgaXMgZGlzYWJsZWQgKi8KKwkJcmVnICY9IH4oMSA8PCBDQ01fQ1NDUl9PU0NfRU5fU0hJRlQpOworCQlfX3Jhd193cml0ZWwocmVnLCBDQ01fQ1NDUik7CisJCXByZW1fY2xrLnBhcmVudCA9ICZjbGszMl9wcmVtdWx0OworCX0KKworCS8qIGRldGVjdCByZWZlcmVuY2UgZm9yIENMS08gKi8KKwlyZWcgPSAocmVnICYgQ0NNX0NTQ1JfQ0xLT19NQVNLKSA+PiBDQ01fQ1NDUl9DTEtPX09GRlNFVDsKKwljbGtvX2Nsay5wYXJlbnQgPSAoc3RydWN0IGNsayAqKWNsa29fY2xvY2tzW3JlZ107CisKKwlmb3IgKGNsa3AgPSBteGNfY2xrczsgY2xrcCA8IG14Y19jbGtzICsgQVJSQVlfU0laRShteGNfY2xrcyk7IGNsa3ArKykKKwkJY2xrX3JlZ2lzdGVyKCpjbGtwKTsKKworCWNsa19lbmFibGUoJmhjbGspOworCWNsa19lbmFibGUoJmZjbGspOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9jcm1fcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1teDEvY3JtX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmU4NjZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDEvY3JtX3JlZ3MuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9NWDFfQ1JNX1JFR1NfSF9fCisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9NWDFfQ1JNX1JFR1NfSF9fCisKKyNkZWZpbmUgQ0NNX0JBU0UJSU9fQUREUkVTUyhDQ01fQkFTRV9BRERSKQorI2RlZmluZSBTQ01fQkFTRQlJT19BRERSRVNTKFNDTV9CQVNFX0FERFIpCisKKy8qIENDTSByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQ0NNX0NTQ1IJKENDTV9CQVNFICsgMHgwKQorI2RlZmluZSBDQ01fTVBDVEwwCShDQ01fQkFTRSArIDB4NCkKKyNkZWZpbmUgQ0NNX01QQ1RMMQkoQ0NNX0JBU0UgKyAweDgpCisjZGVmaW5lIENDTV9TUENUTDAJKENDTV9CQVNFICsgMHhDKQorI2RlZmluZSBDQ01fU1BDVEwxCShDQ01fQkFTRSArIDB4MTApCisjZGVmaW5lIENDTV9QQ0RSCShDQ01fQkFTRSArIDB4MjApCisKKyNkZWZpbmUgQ0NNX0NTQ1JfQ0xLT19PRkZTRVQJMjkKKyNkZWZpbmUgQ0NNX0NTQ1JfQ0xLT19NQVNLCSgweDcgPDwgMjkpCisjZGVmaW5lIENDTV9DU0NSX1VTQl9PRkZTRVQJMjYKKyNkZWZpbmUgQ0NNX0NTQ1JfVVNCX01BU0sJKDB4NyA8PCAyNikKKyNkZWZpbmUgQ0NNX0NTQ1JfU1BMTF9SRVNUQVJUCSgxIDw8IDIyKQorI2RlZmluZSBDQ01fQ1NDUl9NUExMX1JFU1RBUlQJKDEgPDwgMjEpCisjZGVmaW5lIENDTV9DU0NSX09TQ19FTl9TSElGVAkxNworI2RlZmluZSBDQ01fQ1NDUl9TWVNURU1fU0VMCSgxIDw8IDE2KQorI2RlZmluZSBDQ01fQ1NDUl9CQ0xLX09GRlNFVAkxMAorI2RlZmluZSBDQ01fQ1NDUl9CQ0xLX01BU0sJKDB4RiA8PCAxMCkKKyNkZWZpbmUgQ0NNX0NTQ1JfUFJFU0MJCSgxIDw8IDE1KQorI2RlZmluZSBDQ01fQ1NDUl9TUEVOCQkoMSA8PCAxKQorI2RlZmluZSBDQ01fQ1NDUl9NUEVOCQkoMSA8PCAwKQorCisjZGVmaW5lIENDTV9QQ0RSX1BDTEszX09GRlNFVAkxNgorI2RlZmluZSBDQ01fUENEUl9QQ0xLM19NQVNLCSgweDdGIDw8IDE2KQorI2RlZmluZSBDQ01fUENEUl9QQ0xLMl9PRkZTRVQJNAorI2RlZmluZSBDQ01fUENEUl9QQ0xLMl9NQVNLCSgweEYgPDwgNCkKKyNkZWZpbmUgQ0NNX1BDRFJfUENMSzFfT0ZGU0VUCTAKKyNkZWZpbmUgQ0NNX1BDRFJfUENMSzFfTUFTSwkweEYKKworLyogU0NNIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBTQ01fU0lEUgkoU0NNX0JBU0UgKyAweDApCisjZGVmaW5lIFNDTV9GTUNSCShTQ01fQkFTRSArIDB4NCkKKyNkZWZpbmUgU0NNX0dQQ1IJKFNDTV9CQVNFICsgMHg4KQorI2RlZmluZSBTQ01fR0NDUgkoU0NNX0JBU0UgKyAweEMpCisKKyNkZWZpbmUgU0NNX0dDQ1JfRE1BX0NMS19FTl9PRkZTRVQJMworI2RlZmluZSBTQ01fR0NDUl9DU0lfQ0xLX0VOX09GRlNFVAkyCisjZGVmaW5lIFNDTV9HQ0NSX01NQV9DTEtfRU5fT0ZGU0VUCTEKKyNkZWZpbmUgU0NNX0dDQ1JfVVNCRF9DTEtfRU5fT0ZGU0VUCTAKKworI2VuZGlmIC8qIF9fQVJDSF9BUk1fTUFDSF9NWDJfQ1JNX1JFR1NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14MS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14MS9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2ZDhkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4IFNhc2NoYSBIYXVlciwga2VybmVsQHBlbmd1dHJvbml4LmRlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUGF1bGl1cyBaYWxlY2thcyA8cGF1bGl1cy56YWxlY2thc0B0ZWx0b25pa2EubHQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRGFyaXVzIEF1Z3VsaXMgPGRhcml1cy5hdWd1bGlzQHRlbHRvbmlrYS5sdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF9jc2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgwMDIyNDAwMCwKKwkJLmVuZCAgICA9IDB4MDAyMjQwMTAsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IENTSV9JTlQsCisJCS5lbmQgICAgPSBDU0lfSU5ULAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyB1NjQgaW14X2NzaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9jc2lfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpbXgtY3NpIiwKKwkuaWQgICAgICAgICAgICAgPSAwLCAvKiBUaGlzIGlzIHVzZWQgdG8gcHV0IGNhbWVyYXMgb24gdGhpcyBpbnRlcmZhY2UgKi8KKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJmlteF9jc2lfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZSAgICAgICA9IGlteF9jc2lfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X2NzaV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfaTJjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MDAyMTcwMDAsCisJCS5lbmQgICAgPSAweDAwMjE3MDEwLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBJMkNfSU5ULAorCQkuZW5kICAgID0gSTJDX0lOVCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9pMmNfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpbXgtaTJjIiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5yZXNvdXJjZSAgICAgICA9IGlteF9pMmNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X2kyY19yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfdWFydDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBVQVJUMV9CQVNFX0FERFIsCisJCS5lbmQJPSBVQVJUMV9CQVNFX0FERFIgKyAweEQwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gVUFSVDFfTUlOVF9SWCwKKwkJLmVuZAk9IFVBUlQxX01JTlRfUlgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBVQVJUMV9NSU5UX1RYLAorCQkuZW5kCT0gVUFSVDFfTUlOVF9UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IFVBUlQxX01JTlRfUlRTLAorCQkuZW5kCT0gVUFSVDFfTUlOVF9SVFMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF91YXJ0MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImlteC11YXJ0IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW14X3VhcnQxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaW14X3VhcnQxX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW14X3VhcnQyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gVUFSVDJfQkFTRV9BRERSLAorCQkuZW5kCT0gVUFSVDJfQkFTRV9BRERSICsgMHhEMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IFVBUlQyX01JTlRfUlgsCisJCS5lbmQJPSBVQVJUMl9NSU5UX1JYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gVUFSVDJfTUlOVF9UWCwKKwkJLmVuZAk9IFVBUlQyX01JTlRfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBVQVJUMl9NSU5UX1JUUywKKwkJLmVuZAk9IFVBUlQyX01JTlRfUlRTLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdWFydDJfZGV2aWNlID0geworCS5uYW1lCQk9ICJpbXgtdWFydCIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlteF91YXJ0Ml9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlteF91YXJ0Ml9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlteF9ydGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgwMDIwNDAwMCwKKwkJLmVuZCAgICA9IDB4MDAyMDQwMjQsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IFJUQ19JTlQsCisJCS5lbmQgICAgPSBSVENfSU5ULAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCAgPSBSVENfU0FNSU5ULAorCQkuZW5kICAgID0gUlRDX1NBTUlOVCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF9ydGNfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJydGMtaW14IiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5yZXNvdXJjZSAgICAgICA9IGlteF9ydGNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X3J0Y19yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfd2R0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MDAyMDEwMDAsCisJCS5lbmQgICAgPSAweDAwMjAxMDA4LAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBXRFRfSU5ULAorCQkuZW5kICAgID0gV0RUX0lOVCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF93ZHRfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpbXgtd2R0IiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5yZXNvdXJjZSAgICAgICA9IGlteF93ZHRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoaW14X3dkdF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhfdXNiX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHgwMDIxMjAwMCwKKwkJLmVuZAk9IDB4MDAyMTIxNDgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDAsCisJCS5lbmQJPSBVU0JEX0lOVDAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDEsCisJCS5lbmQJPSBVU0JEX0lOVDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDIsCisJCS5lbmQJPSBVU0JEX0lOVDIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzRdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDMsCisJCS5lbmQJPSBVU0JEX0lOVDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzVdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDQsCisJCS5lbmQJPSBVU0JEX0lOVDQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzZdID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDUsCisJCS5lbmQJPSBVU0JEX0lOVDUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzddID0geworCQkuc3RhcnQJPSBVU0JEX0lOVDYsCisJCS5lbmQJPSBVU0JEX0lOVDYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF91c2JfZGV2aWNlID0geworCS5uYW1lCQk9ICJpbXhfdWRjIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW14X3VzYl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlteF91c2JfcmVzb3VyY2VzLAorfTsKKworLyogR1BJTyBwb3J0IGRlc2NyaXB0aW9uICovCitzdGF0aWMgc3RydWN0IG14Y19ncGlvX3BvcnQgaW14X2dwaW9fcG9ydHNbXSA9IHsKKwlbMF0gPSB7CisJCS5jaGlwLmxhYmVsID0gImdwaW8tMCIsCisJCS5iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoR1BJT19CQVNFX0FERFIpLAorCQkuaXJxID0gR1BJT19JTlRfUE9SVEEsCisJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVAorCX0sCisJWzFdID0geworCQkuY2hpcC5sYWJlbCA9ICJncGlvLTEiLAorCQkuYmFzZSA9ICh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKEdQSU9fQkFTRV9BRERSICsgMHgxMDApLAorCQkuaXJxID0gR1BJT19JTlRfUE9SVEIsCisJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDMyCisJfSwKKwlbMl0gPSB7CisJCS5jaGlwLmxhYmVsID0gImdwaW8tMiIsCisJCS5iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoR1BJT19CQVNFX0FERFIgKyAweDIwMCksCisJCS5pcnEgPSBHUElPX0lOVF9QT1JUQywKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgNjQKKwl9LAorCVszXSA9IHsKKwkJLmNoaXAubGFiZWwgPSAiZ3Bpby0zIiwKKwkJLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhHUElPX0JBU0VfQUREUiArIDB4MzAwKSwKKwkJLmlycSA9IEdQSU9fSU5UX1BPUlRELAorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyA5NgorCX0KK307CisKK2ludCBfX2luaXQgbXhjX3JlZ2lzdGVyX2dwaW9zKHZvaWQpCit7CisJcmV0dXJuIG14Y19ncGlvX2luaXQoaW14X2dwaW9fcG9ydHMsIEFSUkFZX1NJWkUoaW14X2dwaW9fcG9ydHMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgxL2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGE1ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDEvZGV2aWNlcy5oCkBAIC0wLDAgKzEsNyBAQAorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X2NzaV9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfaTJjX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF91YXJ0MV9kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfdWFydDJfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW14X3J0Y19kZXZpY2U7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbXhfd2R0X2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlteF91c2JfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1teDEvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZWM2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14MS9nZW5lcmljLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBhdXRob3I6IFNhc2NoYSBIYXVlcgorICogIENyZWF0ZWQ6IGFwcmlsIDIwdGgsIDIwMDQKKyAqICBDb3B5cmlnaHQ6IFN5bmVydHJvbml4eCBHbWJICisgKgorICogIENvbW1vbiBjb2RlIGZvciBpLk1YIG1hY2hpbmVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW14X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBJTVhfSU9fQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElNWF9JT19QSFlTKSwKKwkJLmxlbmd0aAkJPSBJTVhfSU9fU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfQorfTsKKwordm9pZCBfX2luaXQgbXhjX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChpbXhfaW9fZGVzYywgQVJSQVlfU0laRShpbXhfaW9fZGVzYykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDEvbXgxYWRzLmMgYi9hcmNoL2FybS9tYWNoLW14MS9teDFhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTRiMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDEvbXgxYWRzLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYworICoKKyAqIEluaXRpYWxseSBiYXNlZCBvbjoKKyAqCWxpbnV4LTIuNi43LWlteC9hcmNoL2FybS9tYWNoLWlteC9zY2I5MzI4LmMKKyAqCUNvcHlyaWdodCAoYykgMjAwNCBTYXNjaGEgSGF1ZXIgPHNhc2NoYUBzYXNjaGFoYXVlci5kZT4KKyAqCisgKiAyMDA0IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CisjaW5jbHVkZSA8bWFjaC9pb211eC1teDEtbXgyLmg+CisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisvKgorICogVUFSVHMgcGxhdGZvcm0gZGF0YQorICovCitzdGF0aWMgaW50IG14Y191YXJ0MV9waW5zW10gPSB7CisJUEM5X1BGX1VBUlQxX0NUUywKKwlQQzEwX1BGX1VBUlQxX1JUUywKKwlQQzExX1BGX1VBUlQxX1RYRCwKKwlQQzEyX1BGX1VBUlQxX1JYRCwKK307CisKK3N0YXRpYyBpbnQgdWFydDFfbXhjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpLCAiVUFSVDEiKTsKK30KKworc3RhdGljIGludCB1YXJ0MV9teGNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGNfdWFydDJfcGluc1tdID0geworCVBCMjhfUEZfVUFSVDJfQ1RTLAorCVBCMjlfUEZfVUFSVDJfUlRTLAorCVBCMzBfUEZfVUFSVDJfVFhELAorCVBCMzFfUEZfVUFSVDJfUlhELAorfTsKKworc3RhdGljIGludCB1YXJ0Ml9teGNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0Ml9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDJfcGlucyksICJVQVJUMiIpOworfQorCitzdGF0aWMgaW50IHVhcnQyX214Y19leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0Ml9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDJfcGlucykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhW10gPSB7CisJeworCQkuaW5pdCA9IHVhcnQxX214Y19pbml0LAorCQkuZXhpdCA9IHVhcnQxX214Y19leGl0LAorCQkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorCX0sIHsKKwkJLmluaXQgPSB1YXJ0Ml9teGNfaW5pdCwKKwkJLmV4aXQgPSB1YXJ0Ml9teGNfZXhpdCwKKwkJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKKwl9LAorfTsKKworLyoKKyAqIFBoeXNtYXAgZmxhc2gKKyAqLworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBteDFhZHNfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gNCwJCS8qIGJhbmt3aWR0aCBpbiBieXRlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBJTVhfQ1MwX1BIWVMsCisJLmVuZAk9IElNWF9DUzBfUEhZUyArIFNaXzMyTSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCT0gMCwKKwkucmVzb3VyY2UgPSAmZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworLyoKKyAqIEJvYXJkIGluaXQKKyAqLworc3RhdGljIHZvaWQgX19pbml0IG14MWFkc19pbml0KHZvaWQpCit7CisJLyogVUFSVCAqLworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJmlteF91YXJ0MV9kZXZpY2UsICZ1YXJ0X3BkYXRhWzBdKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZpbXhfdWFydDJfZGV2aWNlLCAmdWFydF9wZGF0YVsxXSk7CisKKwkvKiBQaHlzbWFwIGZsYXNoICovCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmZmxhc2hfZGV2aWNlLCAmbXgxYWRzX2ZsYXNoX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXgxYWRzX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteGNfY2xvY2tzX2luaXQoMzIwMDApOworCW14Y190aW1lcl9pbml0KCJncHRfY2xrIik7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgbXgxYWRzX3RpbWVyID0geworCS5pbml0CT0gbXgxYWRzX3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKE1YMUFEUywgIkZyZWVzY2FsZSBNWDFBRFMiKQorCS8qIE1haW50YWluZXI6IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXggKi8KKwkucGh5c19pbwk9IElNWF9JT19QSFlTLAorCS5pb19wZ19vZmZzdAk9IChJTVhfSU9fQkFTRSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvCQk9IG14Y19tYXBfaW8sCisJLmluaXRfaXJxCT0gbXhjX2luaXRfaXJxLAorCS50aW1lcgkJPSAmbXgxYWRzX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBteDFhZHNfaW5pdCwKK01BQ0hJTkVfRU5ECisKK01BQ0hJTkVfU1RBUlQoTVhMQURTLCAiRnJlZXNjYWxlIE1YTEFEUyIpCisJLnBoeXNfaW8JPSBJTVhfSU9fUEhZUywKKwkuaW9fcGdfb2Zmc3QJPSAoSU1YX0lPX0JBU0UgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFBIWVNfT0ZGU0VUICsgMHgxMDAsCisJLm1hcF9pbwkJPSBteGNfbWFwX2lvLAorCS5pbml0X2lycQk9IG14Y19pbml0X2lycSwKKwkudGltZXIJCT0gJm14MWFkc190aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gbXgxYWRzX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5jCmluZGV4IGJkMDU1OWQuLmFmMTIxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMKQEAgLTE5MCwzOCArMTkwLDcyIEBACiAJLnJlc291cmNlID0gbXhjX3dkdF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBPV0lSRV9CQVNFX0FERFIsCisJCS5lbmQgICA9IE9XSVJFX0JBU0VfQUREUiArIFNaXzRLIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3cxX21hc3Rlcl9kZXZpY2UgPSB7CisJLm5hbWUgPSAibXhjX3cxIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfdzFfbWFzdGVyX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gbXhjX3cxX21hc3Rlcl9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG14Y19uYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gTkZDX0JBU0VfQUREUiwKKwkJLmVuZAk9IE5GQ19CQVNFX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KKwl9LCB7CisJCS5zdGFydAk9IE1YQ19JTlRfTkFOREZDLAorCQkuZW5kCT0gTVhDX0lOVF9OQU5ERkMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX25hbmRfZGV2aWNlID0geworCS5uYW1lID0gIm14Y19uYW5kIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShteGNfbmFuZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IG14Y19uYW5kX3Jlc291cmNlcywKK307CisKIC8qIEdQSU8gcG9ydCBkZXNjcmlwdGlvbiAqLwogc3RhdGljIHN0cnVjdCBteGNfZ3Bpb19wb3J0IGlteF9ncGlvX3BvcnRzW10gPSB7CiAJWzBdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTAiLAogCQkuaXJxID0gTVhDX0lOVF9HUElPLAogCQkuYmFzZSA9ICh2b2lkKikoQUlQSV9CQVNFX0FERFJfVklSVCArIDB4MTUwMDAgKyAweDEwMCAqIDApLAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfTUFYX0lOVF9MSU5FUywKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJULAogCX0sCiAJWzFdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTEiLAogCQkuYmFzZSA9ICh2b2lkKikoQUlQSV9CQVNFX0FERFJfVklSVCArIDB4MTUwMDAgKyAweDEwMCAqIDEpLAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfTUFYX0lOVF9MSU5FUyArIDMyLAorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyAzMiwKIAl9LAogCVsyXSA9IHsKIAkJLmNoaXAubGFiZWwgPSAiZ3Bpby0yIiwKIAkJLmJhc2UgPSAodm9pZCopKEFJUElfQkFTRV9BRERSX1ZJUlQgKyAweDE1MDAwICsgMHgxMDAgKiAyKSwKLQkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX01BWF9JTlRfTElORVMgKyA2NCwKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgNjQsCiAJfSwKIAlbM10gPSB7CiAJCS5jaGlwLmxhYmVsID0gImdwaW8tMyIsCiAJCS5iYXNlID0gKHZvaWQqKShBSVBJX0JBU0VfQUREUl9WSVJUICsgMHgxNTAwMCArIDB4MTAwICogMyksCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19NQVhfSU5UX0xJTkVTICsgOTYsCisJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDk2LAogCX0sCiAJWzRdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTQiLAogCQkuYmFzZSA9ICh2b2lkKikoQUlQSV9CQVNFX0FERFJfVklSVCArIDB4MTUwMDAgKyAweDEwMCAqIDQpLAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfTUFYX0lOVF9MSU5FUyArIDEyOCwKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgMTI4LAogCX0sCiAJWzVdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTUiLAogCQkuYmFzZSA9ICh2b2lkKikoQUlQSV9CQVNFX0FERFJfVklSVCArIDB4MTUwMDAgKyAweDEwMCAqIDUpLAotCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfTUFYX0lOVF9MSU5FUyArIDE2MCwKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgMTYwLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuaAppbmRleCBjNzdhNGI4Li4xZThjYjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5oCkBAIC0xMiw0ICsxMiw1IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTU7Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193MV9tYXN0ZXJfZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX25hbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbXgyN2Fkcy5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbXgyN2Fkcy5jCmluZGV4IDU2ZTIyZDMuLjJiNWM2N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL214MjdhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9teDI3YWRzLmMKQEAgLTY4LDE1ICs2OCwxNCBAQAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0MF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQwX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0MF9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfTk9STUFMLCAiVUFSVDAiKTsKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQwX3BpbnMpLCAiVUFSVDAiKTsKIH0KIAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0MF9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQwX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0MF9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfUkVMRUFTRSwgIlVBUlQwIik7CisJbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0MF9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDBfcGlucykpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG14Y191YXJ0MV9waW5zW10gPSB7CkBAIC04OSwxNSArODgsMTQgQEAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIlVBUlQxIik7CisJCQlBUlJBWV9TSVpFKG14Y191YXJ0MV9waW5zKSwgIlVBUlQxIik7CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDFfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0MV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJVQVJUMSIpOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteGNfdWFydDJfcGluc1tdID0gewpAQCAtMTEwLDE1ICsxMDgsMTQgQEAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDJfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0Ml9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDJfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIlVBUlQyIik7CisJCQlBUlJBWV9TSVpFKG14Y191YXJ0Ml9waW5zKSwgIlVBUlQyIik7CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDJfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0Ml9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDJfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJVQVJUMiIpOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDJfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQyX3BpbnMpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteGNfdWFydDNfcGluc1tdID0gewpAQCAtMTMxLDE1ICsxMjgsMTMgQEAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDNfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0M19waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDNfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIlVBUlQzIik7CisJCQlBUlJBWV9TSVpFKG14Y191YXJ0M19waW5zKSwgIlVBUlQzIik7CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0M19waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDNfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJVQVJUMyIpOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDNfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQzX3BpbnMpKTsKIH0KIAogc3RhdGljIGludCBteGNfdWFydDRfcGluc1tdID0gewpAQCAtMTUyLDE1ICsxNDcsMTQgQEAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDRfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0NF9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDRfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIlVBUlQ0Iik7CisJCQlBUlJBWV9TSVpFKG14Y191YXJ0NF9waW5zKSwgIlVBUlQ0Iik7CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDRfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0NF9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDRfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJVQVJUNCIpOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDRfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQ0X3BpbnMpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteGNfdWFydDVfcGluc1tdID0gewpAQCAtMTczLDE1ICsxNjcsMTQgQEAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0NV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDVfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIlVBUlQ1Iik7CisJCQlBUlJBWV9TSVpFKG14Y191YXJ0NV9waW5zKSwgIlVBUlQ1Iik7CiB9CiAKIHN0YXRpYyBpbnQgdWFydF9teGNfcG9ydDVfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBteGNfZ3Bpb19zZXR1cF9tdWx0aXBsZV9waW5zKG14Y191YXJ0NV9waW5zLAotCQkJQVJSQVlfU0laRShteGNfdWFydDVfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJVQVJUNSIpOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhteGNfdWFydDVfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQ1X3BpbnMpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewpAQCAtMjEyLDE1ICsyMDUsMTMgQEAKIHN0YXRpYyB2b2lkIGdwaW9fZmVjX2FjdGl2ZSh2b2lkKQogewogCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX2ZlY19waW5zLAotCQkJQVJSQVlfU0laRShteGNfZmVjX3BpbnMpLAotCQkJTVhDX0dQSU9fQUxMT0NfTU9ERV9OT1JNQUwsICJGRUMiKTsKKwkJCUFSUkFZX1NJWkUobXhjX2ZlY19waW5zKSwgIkZFQyIpOwogfQogCiBzdGF0aWMgdm9pZCBncGlvX2ZlY19pbmFjdGl2ZSh2b2lkKQogewotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX2ZlY19waW5zLAotCQkJQVJSQVlfU0laRShteGNfZmVjX3BpbnMpLAotCQkJTVhDX0dQSU9fQUxMT0NfTU9ERV9SRUxFQVNFLCAiRkVDIik7CisJbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y19mZWNfcGlucywKKwkJCUFSUkFZX1NJWkUobXhjX2ZlY19waW5zKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGFbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL3BjbTAzOC5jIGIvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKaW5kZXggN2Y1NTc0Ni4uZGZkNDE1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KQEAgLTI3LDEwICsyOCwzNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1wY20wMzguaD4KKyNpbmNsdWRlIDxtYWNoL214Y19uYW5kLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKIC8qCisgKiBQaHl0ZWMncyBQQ00wMzggY29tZXMgd2l0aCAyTWlCIGJhdHRlcnkgYnVmZmVyZWQgU1JBTSwKKyAqIDE2IGJpdCB3aWR0aAorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBwY20wMzhfc3JhbV9kYXRhID0geworCS5iYW5rd2lkdGggPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY20wMzhfc3JhbV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSBDUzFfQkFTRV9BRERSLAorCS5lbmQgICA9IENTMV9CQVNFX0FERFIgKyA1MTIgKiAxMDI0IC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBjbTAzOF9zcmFtX210ZF9kZXZpY2UgPSB7CisJLm5hbWUgPSAibXRkLXJhbSIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZwY20wMzhfc3JhbV9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZwY20wMzhfc3JhbV9yZXNvdXJjZSwKK307CisKKy8qCiAgKiBQaHl0ZWMncyBwaHlDT1JFLWkuTVgyNyBjb21lcyB3aXRoIDMyTWlCIGZsYXNoLAogICogMTYgYml0IHdpZHRoCiAgKi8KQEAgLTY0LDE1ICs5MSwxNCBAQAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0MF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQwX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0MF9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfTk9STUFMLCAiVUFSVDAiKTsKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQwX3BpbnMpLCAiVUFSVDAiKTsKIH0KIAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0MF9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQwX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0MF9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfUkVMRUFTRSwgIlVBUlQwIik7CisJbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0MF9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDBfcGlucykpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG14Y191YXJ0MV9waW5zW10gPSB7CkBAIC04NSwxNSArMTExLDE0IEBACiBzdGF0aWMgaW50IHVhcnRfbXhjX3BvcnQxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlyZXR1cm4gbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKLQkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpLAotCQkJTVhDX0dQSU9fQUxMT0NfTU9ERV9OT1JNQUwsICJVQVJUMSIpOworCQkJQVJSQVlfU0laRShteGNfdWFydDFfcGlucyksICJVQVJUMSIpOwogfQogCiBzdGF0aWMgaW50IHVhcnRfbXhjX3BvcnQxX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlyZXR1cm4gbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKLQkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpLAotCQkJTVhDX0dQSU9fQUxMT0NfTU9ERV9SRUxFQVNFLCAiVUFSVDEiKTsKKwlteGNfZ3Bpb19yZWxlYXNlX211bHRpcGxlX3BpbnMobXhjX3VhcnQxX3BpbnMsCisJCQlBUlJBWV9TSVpFKG14Y191YXJ0MV9waW5zKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXhjX3VhcnQyX3BpbnNbXSA9IHsgUEUxMF9QRl9VQVJUM19DVFMsCkBAIC0xMDQsMTUgKzEyOSwxNCBAQAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0Ml9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQyX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0Ml9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfTk9STUFMLCAiVUFSVDIiKTsKKwkJCUFSUkFZX1NJWkUobXhjX3VhcnQyX3BpbnMpLCAiVUFSVDIiKTsKIH0KIAogc3RhdGljIGludCB1YXJ0X214Y19wb3J0Ml9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMobXhjX3VhcnQyX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y191YXJ0Ml9waW5zKSwKLQkJCU1YQ19HUElPX0FMTE9DX01PREVfUkVMRUFTRSwgIlVBUlQyIik7CisJbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKG14Y191YXJ0Ml9waW5zLAorCQkJQVJSQVlfU0laRShteGNfdWFydDJfcGlucykpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhW10gPSB7CkBAIC0xNTUsMjkgKzE3OSw0NyBAQAogc3RhdGljIHZvaWQgZ3Bpb19mZWNfYWN0aXZlKHZvaWQpCiB7CiAJbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfZmVjX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y19mZWNfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX05PUk1BTCwgIkZFQyIpOworCQkJQVJSQVlfU0laRShteGNfZmVjX3BpbnMpLCAiRkVDIik7CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fZmVjX2luYWN0aXZlKHZvaWQpCiB7Ci0JbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfZmVjX3BpbnMsCi0JCQlBUlJBWV9TSVpFKG14Y19mZWNfcGlucyksCi0JCQlNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UsICJGRUMiKTsKKwlteGNfZ3Bpb19yZWxlYXNlX211bHRpcGxlX3BpbnMobXhjX2ZlY19waW5zLAorCQkJQVJSQVlfU0laRShteGNfZmVjX3BpbnMpKTsKIH0KIAorc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIHBjbTAzOF9uYW5kX2JvYXJkX2luZm8gPSB7CisJLndpZHRoID0gMSwKKwkuaHdfZWNjID0gMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmcGNtMDM4X25vcl9tdGRfZGV2aWNlLAorCSZteGNfdzFfbWFzdGVyX2RldmljZSwKKwkmcGNtMDM4X3NyYW1fbXRkX2RldmljZSwKIH07CiAKKy8qIE9uIHBjbTAzOCB0aGVyZSdzIGEgc3JhbSBhdHRhY2hlZCB0byBDUzEsIHdlIGVuYWJsZSB0aGUgY2hpcHNlbGVjdCBoZXJlIGFuZAorICogc2V0dXAgb3RoZXIgc3R1ZmZzIHRvIGFjY2VzcyB0aGUgc3JhbS4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdF9zcmFtKHZvaWQpCit7CisJX19yYXdfd3JpdGVsKDB4MDAwMGQ4NDMsIENTQ1JfVSgxKSk7CisJX19yYXdfd3JpdGVsKDB4MjIyNTI1MjEsIENTQ1JfTCgxKSk7CisJX19yYXdfd3JpdGVsKDB4MjIyMjBhMDAsIENTQ1JfQSgxKSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdCh2b2lkKQogewogCWdwaW9fZmVjX2FjdGl2ZSgpOworCXBjbTAzOF9pbml0X3NyYW0oKTsKIAogCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhWzBdKTsKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UxLCAmdWFydF9wZGF0YVsxXSk7CiAJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMiwgJnVhcnRfcGRhdGFbMl0pOwogCisJbXhjX2dwaW9fbW9kZShQRTE2X0FGX1JUQ0spOyAvKiBPV0lSRSAqLworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19uYW5kX2RldmljZSwgJnBjbTAzOF9uYW5kX2JvYXJkX2luZm8pOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGxhdGZvcm1fZGV2aWNlcywgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKSk7CiAKICNpZmRlZiBDT05GSUdfTUFDSF9QQ005NzBfQkFTRUJPQVJECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1teDMvS2NvbmZpZwppbmRleCBkYjk0MzFkLi5lNzk2NTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL0tjb25maWcKQEAgLTIxLDUgKzIxLDE5IEBACiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMzEgTElURUtJVCBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgogCitjb25maWcgTUFDSF9NWDMxXzNEUworCWJvb2wgIlN1cHBvcnQgTVgzMVBESyAoM0RTKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMzFQREsgKDNEUykgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKKwkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KKworY29uZmlnIE1BQ0hfTVgzMU1PQk9BUkQKKwlib29sICJTdXBwb3J0IG14MzFtb2JvYXJkIHBsYXRmb3JtcyAoRVBGTCBNb2JvdHMgZ3JvdXApIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgbXgzMW1vYm9hcmQgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKKwkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXgzL01ha2VmaWxlCmluZGV4IDhiMjFhYmIuLjVhMTUxNTQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW14My9NYWtlZmlsZQpAQCAtOCwzICs4LDUgQEAKIG9iai0kKENPTkZJR19NQUNIX01YMzFBRFMpCSs9IG14MzFhZHMubwogb2JqLSQoQ09ORklHX01BQ0hfTVgzMUxJVEUpCSs9IG14MzFsaXRlLm8KIG9iai0kKENPTkZJR19NQUNIX1BDTTAzNykJKz0gcGNtMDM3Lm8KK29iai0kKENPTkZJR19NQUNIX01YMzFfM0RTKQkrPSBteDMxcGRrLm8KK29iai0kKENPTkZJR19NQUNIX01YMzFNT0JPQVJEKQkrPSBteDMxbW9ib2FyZC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1teDMvY2xvY2suYwppbmRleCA5ZjE0YTg3Li5iMTc0NmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL2Nsb2NrLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICJjcm1fcmVncy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCmluZGV4IGE2YmRjYzAuLjFkNDZjYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKQEAgLTEyNSwxOSArMTI1LDE5IEBACiAJCS5jaGlwLmxhYmVsID0gImdwaW8tMCIsCiAJCS5iYXNlID0gSU9fQUREUkVTUyhHUElPMV9CQVNFX0FERFIpLAogCQkuaXJxID0gTVhDX0lOVF9HUElPMSwKLQkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSU5UX0JBU0UKKwkJLnZpcnR1YWxfaXJxX3N0YXJ0ID0gTVhDX0dQSU9fSVJRX1NUQVJULAogCX0sCiAJWzFdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTEiLAogCQkuYmFzZSA9IElPX0FERFJFU1MoR1BJTzJfQkFTRV9BRERSKSwKIAkJLmlycSA9IE1YQ19JTlRfR1BJTzIsCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lOVF9CQVNFICsgR1BJT19OVU1fUElOCisJCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lSUV9TVEFSVCArIDMyLAogCX0sCiAJWzJdID0gewogCQkuY2hpcC5sYWJlbCA9ICJncGlvLTIiLAogCQkuYmFzZSA9IElPX0FERFJFU1MoR1BJTzNfQkFTRV9BRERSKSwKIAkJLmlycSA9IE1YQ19JTlRfR1BJTzMsCi0JCS52aXJ0dWFsX2lycV9zdGFydCA9IE1YQ19HUElPX0lOVF9CQVNFICsgR1BJT19OVU1fUElOICogMgorCQkudmlydHVhbF9pcnFfc3RhcnQgPSBNWENfR1BJT19JUlFfU1RBUlQgKyA2NCwKIAl9CiB9OwogCkBAIC0xNDUsMyArMTQ1LDM3IEBACiB7CiAJcmV0dXJuIG14Y19ncGlvX2luaXQoaW14X2dwaW9fcG9ydHMsIEFSUkFZX1NJWkUoaW14X2dwaW9fcG9ydHMpKTsKIH0KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfdzFfbWFzdGVyX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gT1dJUkVfQkFTRV9BRERSLAorCQkuZW5kICAgPSBPV0lSRV9CQVNFX0FERFIgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y193MV9tYXN0ZXJfZGV2aWNlID0geworCS5uYW1lID0gIm14Y193MSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX3cxX21hc3Rlcl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IG14Y193MV9tYXN0ZXJfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfbmFuZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE5GQ19CQVNFX0FERFIsCisJCS5lbmQJPSBORkNfQkFTRV9BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCisJfSwgeworCQkuc3RhcnQJPSBNWENfSU5UX05BTkRGQywKKwkJLmVuZAk9IE1YQ19JTlRfTkFOREZDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19uYW5kX2RldmljZSA9IHsKKwkubmFtZSA9ICJteGNfbmFuZCIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX25hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBteGNfbmFuZF9yZXNvdXJjZXMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5oCmluZGV4IDRkYzAzZjkuLjk5NDllZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaAorKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmgKQEAgLTQsMyArNCw1IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdzFfbWFzdGVyX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19uYW5kX2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2lvbXV4LmMgYi9hcmNoL2FybS9tYWNoLW14My9pb211eC5jCmluZGV4IDZlNjY0YmUuLjdhNTA4OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2lvbXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvaW9tdXguYwpAQCAtNzQsMTcgKzc0LDE4IEBACiAJdTMyIGZpZWxkLCBsOwogCXZvaWQgX19pb21lbSAqcmVnOwogCi0JcmVnID0gSU9NVVhTV19QQURfQ1RMICsgKHBpbiArIDIpIC8gMzsKKwlwaW4gJj0gSU9NVVhfUEFETlVNX01BU0s7CisJcmVnID0gSU9NVVhTV19QQURfQ1RMICsgKHBpbiArIDIpIC8gMyAqIDQ7CiAJZmllbGQgPSAocGluICsgMikgJSAzOwogCi0JcHJfZGVidWcoIiVzOiByZWcgb2Zmc2V0ID0gMHgleCBmaWVsZCA9ICVkXG4iLAorCXByX2RlYnVnKCIlczogcmVnIG9mZnNldCA9IDB4JXgsIGZpZWxkID0gJWRcbiIsCiAJCQlfX2Z1bmNfXywgKHBpbiArIDIpIC8gMywgZmllbGQpOwogCiAJc3Bpbl9sb2NrKCZncGlvX211eF9sb2NrKTsKIAogCWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCWwgJj0gfigweDFmZiA8PCAoZmllbGQgKiA5KSk7Ci0JbCB8PSBjb25maWcgPDwgKGZpZWxkICogOSk7CisJbCAmPSB+KDB4MWZmIDw8IChmaWVsZCAqIDEwKSk7CisJbCB8PSBjb25maWcgPDwgKGZpZWxkICogMTApOwogCV9fcmF3X3dyaXRlbChsLCByZWcpOwogCiAJc3Bpbl91bmxvY2soJmdwaW9fbXV4X2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvbXgzMW1vYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL214MzFtb2JvYXJkLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFZhbGVudGluIExvbmdjaGFtcCwgRVBGTCBNb2JvdHMgZ3JvdXAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBteDMxbW9ib2FyZF9mbGFzaF9kYXRhID0geworCS53aWR0aCAgCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXgzMW1vYm9hcmRfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CT0gMHhhMDAwMDAwMCwKKwkuZW5kCT0gMHhhMWZmZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14MzFtb2JvYXJkX2ZsYXNoID0geworCS5uYW1lCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJm14MzFtb2JvYXJkX2ZsYXNoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UgPSAmbXgzMW1vYm9hcmRfZmxhc2hfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZteDMxbW9ib2FyZF9mbGFzaCwKK307CisKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9DVFMxX19DVFMxKTsKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9SVFMxX19SVFMxKTsKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9UWEQxX19UWEQxKTsKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9SWEQxX19SWEQxKTsKKworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTAsICZ1YXJ0X3BkYXRhKTsKKworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX0NUUzJfX0NUUzIpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1JUUzJfX1JUUzIpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1RYRDJfX1RYRDIpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1JYRDJfX1JYRDIpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMSwgJnVhcnRfcGRhdGEpOworCisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fUENfUlNUX19DVFM1KTsKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9QQ19WUzJfX1JUUzUpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1BDX0JWRDJfX1RYRDUpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1BDX0JWRDFfX1JYRDUpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlNCwgJnVhcnRfcGRhdGEpOworfQorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzdGF0aWMgbWFwcGluZ3MgZm9yIHRoZSBteDMxbW9ib2FyZC4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDMxbW9ib2FyZF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gQUlQUzFfQkFTRV9BRERSX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBSVBTMV9CQVNFX0FERFIpLAorCQkubGVuZ3RoCQk9IEFJUFMxX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRV9OT05TSEFSRUQKKwl9LCB7CisJCS52aXJ0dWFsCT0gQUlQUzJfQkFTRV9BRERSX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBSVBTMl9CQVNFX0FERFIpLAorCQkubGVuZ3RoCQk9IEFJUFMyX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRV9OT05TSEFSRUQKKwl9LAorfTsKKworLyoKKyAqIFNldCB1cCBzdGF0aWMgdmlydHVhbCBtYXBwaW5ncy4KKyAqLwordm9pZCBfX2luaXQgbXgzMW1vYm9hcmRfbWFwX2lvKHZvaWQpCit7CisJbXhjX21hcF9pbygpOworCWlvdGFibGVfaW5pdChteDMxbW9ib2FyZF9pb19kZXNjLCBBUlJBWV9TSVpFKG14MzFtb2JvYXJkX2lvX2Rlc2MpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MzFtb2JvYXJkX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteGNfY2xvY2tzX2luaXQoMjYwMDAwMDApOworCW14Y190aW1lcl9pbml0KCJpcGdfY2xrLjAiKTsKK30KKworc3RydWN0IHN5c190aW1lciBteDMxbW9ib2FyZF90aW1lciA9IHsKKwkuaW5pdAk9IG14MzFtb2JvYXJkX3RpbWVyX2luaXQsCit9OworCitNQUNISU5FX1NUQVJUKE1YMzFNT0JPQVJELCAiRVBGTCBNb2JvdHMgbXgzMW1vYm9hcmQiKQorCS8qIE1haW50YWluZXI6IFZhbGVudGluIExvbmdjaGFtcCwgRVBGTCBNb2JvdHMgZ3JvdXAgKi8KKwkucGh5c19pbwk9IEFJUFMxX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QJPSAoKEFJUFMxX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zICAgID0gUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvICAgICAgICAgPSBteDMxbW9ib2FyZF9tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gbXhjX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUgICA9IG14Y19ib2FyZF9pbml0LAorCS50aW1lciAgICAgICAgICA9ICZteDMxbW9ib2FyZF90aW1lciwKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFwZGsuYyBiL2FyY2gvYXJtL21hY2gtbXgzL214MzFwZGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY0ZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMXBkay5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9ib2FyZC1teDMxcGRrLmg+CisjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisvKiEKKyAqIEBmaWxlIG14MzFwZGsuYworICoKKyAqIEBicmllZiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLgorICoKKyAqIEBpbmdyb3VwIFN5c3RlbQorICovCisKK3N0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7CisJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBteGNfaW5pdF9pbXhfdWFydCh2b2lkKQoreworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX0NUUzFfX0NUUzEpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1JUUzFfX1JUUzEpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1RYRDFfX1RYRDEpOworCW14Y19pb211eF9tb2RlKE1YMzFfUElOX1JYRDFfX1JYRDEpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGEpOworfQorCisvKiEKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RhdGljIG1hcHBpbmdzIGZvciB0aGUgaS5NWDMxUERLIGJvYXJkLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MzFwZGtfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9IEFJUFMxX0JBU0VfQUREUl9WSVJULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQUlQUzFfQkFTRV9BRERSKSwKKwkJLmxlbmd0aAkJPSBBSVBTMV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0VfTk9OU0hBUkVECisJfSwgeworCQkudmlydHVhbAk9IEFJUFMyX0JBU0VfQUREUl9WSVJULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQUlQUzJfQkFTRV9BRERSKSwKKwkJLmxlbmd0aAkJPSBBSVBTMl9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0VfTk9OU0hBUkVECisJfSwKK307CisKKy8qIQorICogU2V0IHVwIHN0YXRpYyB2aXJ0dWFsIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbXgzMXBka19tYXBfaW8odm9pZCkKK3sKKwlteGNfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KG14MzFwZGtfaW9fZGVzYywgQVJSQVlfU0laRShteDMxcGRrX2lvX2Rlc2MpKTsKK30KKworLyohCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCit7CisJbXhjX2luaXRfaW14X3VhcnQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG14MzFwZGtfdGltZXJfaW5pdCh2b2lkKQoreworCW14Y19jbG9ja3NfaW5pdCgyNjAwMDAwMCk7CisJbXhjX3RpbWVyX2luaXQoImlwZ19jbGsuMCIpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBteDMxcGRrX3RpbWVyID0geworCS5pbml0CT0gbXgzMXBka190aW1lcl9pbml0LAorfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdXNlcyBzdGFuZGFyZCBrZXJuZWwgbWFjcm9zIGRlZmluZWQgaW4gYXJjaC5oIGluIG9yZGVyIHRvCisgKiBpbml0aWFsaXplIF9fbWFjaF9kZXNjX01YMzFQREsgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK01BQ0hJTkVfU1RBUlQoTVgzMV8zRFMsICJGcmVlc2NhbGUgTVgzMVBESyAoM0RTKSIpCisJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KKwkucGh5c19pbwk9IEFJUFMxX0JBU0VfQUREUiwKKwkuaW9fcGdfb2Zmc3QJPSAoKEFJUFMxX0JBU0VfQUREUl9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zICAgID0gUEhZU19PRkZTRVQgKyAweDEwMCwKKwkubWFwX2lvICAgICAgICAgPSBteDMxcGRrX21hcF9pbywKKwkuaW5pdF9pcnEgICAgICAgPSBteGNfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZSAgID0gbXhjX2JvYXJkX2luaXQsCisJLnRpbWVyICAgICAgICAgID0gJm14MzFwZGtfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvcGNtMDM3LmMgYi9hcmNoL2FybS9tYWNoLW14My9wY20wMzcuYwppbmRleCA4NDNmNjhjLi44Y2VhODI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9wY20wMzcuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9wY20wMzcuYwpAQCAtMjEsNyArMjEsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BsYXQtcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxMXguaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzIsNiArMzYsNyBAQAogI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGNtMDM3Lmg+CisjaW5jbHVkZSA8bWFjaC9teGNfbmFuZC5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogCkBAIC01OSw4ICs2NCw2MyBAQAogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxMXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJCT0gQ1MxX0JBU0VfQUREUiArIDB4MzAwLAorCQkuZW5kCQk9IENTMV9CQVNFX0FERFIgKyAweDMwMCArIFNaXzY0SyAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CQk9IElPTVVYX1RPX0lSUShNWDMxX1BJTl9HUElPM18xKSwKKwkJLmVuZAkJPSBJT01VWF9UT19JUlEoTVgzMV9QSU5fR1BJTzNfMSksCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbWM5MTF4X3BsYXRkYXRhIHNtYzkxMXhfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gU01DOTExWF9VU0VfMzJCSVQsCisJLmlycV9mbGFncwk9IElSUUZfU0hBUkVEIHwgSVJRRl9UUklHR0VSX0xPVywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBjbTAzN19ldGggPSB7CisJLm5hbWUJCT0gInNtYzkxMXgiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTExeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxMXhfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzbWM5MTF4X2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBwY20wMzhfc3JhbV9kYXRhID0geworCS5iYW5rd2lkdGggPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY20wMzhfc3JhbV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSBDUzRfQkFTRV9BRERSLAorCS5lbmQgICA9IENTNF9CQVNFX0FERFIgKyA1MTIgKiAxMDI0IC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBjbTAzN19zcmFtX2RldmljZSA9IHsKKwkubmFtZSA9ICJtdGQtcmFtIiwKKwkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnBjbTAzOF9zcmFtX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJnBjbTAzOF9zcmFtX3Jlc291cmNlLAorfTsKKworc3RhdGljIHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhIHBjbTAzN19uYW5kX2JvYXJkX2luZm8gPSB7CisJLndpZHRoID0gMSwKKwkuaHdfZWNjID0gMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmcGNtMDM3X2ZsYXNoLAorCSZwY20wMzdfZXRoLAorCSZwY20wMzdfc3JhbV9kZXZpY2UsCiB9OwogCiAvKgpAQCAtODEsNiArMTQxLDE2IEBACiAJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fQ1NQSTNfTUlTT19fVFhEMyk7CiAKIAlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YSk7CisKKwlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9CQVRUX0xJTkVfX09XSVJFKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdzFfbWFzdGVyX2RldmljZSwgTlVMTCk7CisKKwkvKiBTTVNDOTIxNSBJUlEgcGluICovCisJbXhjX2lvbXV4X21vZGUoSU9NVVhfTU9ERShNWDMxX1BJTl9HUElPM18xLCBJT01VWF9DT05GSUdfR1BJTykpOworCWlmICghZ3Bpb19yZXF1ZXN0KE1YMzFfUElOX0dQSU8zXzEsICJwY20wMzctZXRoIikpCisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KE1YMzFfUElOX0dQSU8zXzEpOworCisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX25hbmRfZGV2aWNlLCAmcGNtMDM3X25hbmRfYm9hcmRfaW5mbyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9mYi5jCmluZGV4IDI0Yzc5NjUuLjhmMWY5OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9mYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC9mYi5jCkBAIC0yMiwxNCArMjIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxtYWNoL25ldHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotc3RydWN0IGNsayB7fTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZmJfY2xrOwotCiBzdGF0aWMgc3RydWN0IGNsY2RfcGFuZWwgKm5ldHhfcGFuZWw7CiAKIHZvaWQgbmV0eF9jbGNkX2VuYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCkBAIC04NSw3ICs4Miw3IEBACiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKLQlyZXR1cm4gJmZiX2NsazsKKwlyZXR1cm4gZGV2ICYmIHN0cmNtcChkZXZfbmFtZShkZXYpLCAiZmIiKSA9PSAwID8gTlVMTCA6IEVSUl9QVFIoLUVOT0VOVCk7CiB9CiAKIHZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYjNlYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAwCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUyB+MApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDQ2OGI5MmEuLmMzOTIxY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCiAKLSNkZWZpbmUgX19pbyhhKSAgICAgICAgICgodm9pZCBfX2lvbWVtICopKGEpKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKSAgICAgICAgICAgIChhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDUzNzQ1YTEuLjlhMzYzZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMjIsMTUgKzIyLDUgQEAKIAogI2RlZmluZSBQSFlTX09GRlNFVCBVTCgweDgwMDAwMDAwKQogCi0vKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpICAgICAgICAgX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KSAgICAgICAgIF9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL25ldHgtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9uZXR4LXJlZ3MuaAppbmRleCA1MTA0YTAwLi4wOGM2MGZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL25ldHgtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbmV0eC1yZWdzLmgKQEAgLTMyOCw2ICszMjgsMjggQEAKICNkZWZpbmUgTkVUWF9QRklGT19GSUxMX0xFVkVMKHBmaWZvKSAgTkVUWF9QRklGT19SRUcoMHgxODAgKyAoKHBmaWZvKTw8MikpCiAjZGVmaW5lIE5FVFhfUEZJRk9fWFBFQ19JU1IoeHBlYykgICAgIE5FVFhfUEZJRk9fUkVHKDB4NDAwICsgKCh4cGVjKSA8PCAyKSkKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWVtb3J5IENvbnRyb2xsZXIgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTkVUWF9NRU1DUl9SRUcob2ZzKSAgICAgICAgICAgICAgIF9faW8oTkVUWF9WQV9NRU1DUiArIChvZnMpKQorI2RlZmluZSBORVRYX01FTUNSX1NSQU1fQ1RSTChjcykgICAgICBORVRYX01FTUNSX1JFRygweDAgKyA0ICogKGNzKSkgLyogU1JBTSBmb3IgQ1MgMC4uMiAqLworI2RlZmluZSBORVRYX01FTUNSX1NEUkFNX0NGR19DVFJMICAgICBORVRYX01FTUNSX1JFRygweDQwKQorI2RlZmluZSBORVRYX01FTUNSX1NEUkFNX1RJTUlOR19DVFJMICBORVRYX01FTUNSX1JFRygweDQ0KQorI2RlZmluZSBORVRYX01FTUNSX1NEUkFNX01PREUgICAgICAgICBORVRYX01FTUNSX1JFRygweDQ4KQorI2RlZmluZSBORVRYX01FTUNSX1NEUkFNX0VYVF9NT0RFICAgICBORVRYX01FTUNSX1JFRygweDRjKQorI2RlZmluZSBORVRYX01FTUNSX1BSSU9fVElNRVNMT1RfQ1RSTCBORVRYX01FTUNSX1JFRygweDgwKQorI2RlZmluZSBORVRYX01FTUNSX1BSSU9fQUNDRVNTX0NUUkwgICBORVRYX01FTUNSX1JFRygweDg0KQorCisvKiBCaXRzICovCisjZGVmaW5lIE5FVFhfTUVNQ1JfU1JBTV9DVFJMX1dJRFRIRVhUTUVNKHgpICAgICAgICgoKHgpICYgMHgzKSAgPDwgMjQpCisjZGVmaW5lIE5FVFhfTUVNQ1JfU1JBTV9DVFJMX1dTUE9TVFBBVVNFRVhUTUVNKHgpICgoKHgpICYgMHgzKSAgPDwgMTYpCisjZGVmaW5lIE5FVFhfTUVNQ1JfU1JBTV9DVFJMX1dTUFJFUEFTRUVYVE1FTSh4KSAgICgoKHgpICYgMHgzKSAgPDwgOCkKKyNkZWZpbmUgTkVUWF9NRU1DUl9TUkFNX0NUUkxfV1NFWFRNRU0oeCkgICAgICAgICAgKCgoeCkgJiAweDFmKSA8PCAwKQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEdWFsIFBvcnQgTWVtb3J5ICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwppbmRleCA3YzU0MGMxLi5kNTFkNjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKQEAgLTIxLDQzICsyMSwxMDAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxtYWNoL25ldHgtcmVncy5oPgogCisjZGVmaW5lIFRJTUVSX0NMT0NLRVZFTlQgMAorI2RlZmluZSBUSU1FUl9DTE9DS1NPVVJDRSAxCisKK3N0YXRpYyB2b2lkIG5ldHhfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKK3sKKwl1MzIgdG1vZGU7CisKKwkvKiBkaXNhYmxlIHRpbWVyICovCisJd3JpdGVsKDAsIE5FVFhfR1BJT19DT1VOVEVSX0NUUkwoVElNRVJfQ0xPQ0tFVkVOVCkpOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJd3JpdGVsKExBVENILCBORVRYX0dQSU9fQ09VTlRFUl9NQVgoVElNRVJfQ0xPQ0tFVkVOVCkpOworCQl0bW9kZSA9IE5FVFhfR1BJT19DT1VOVEVSX0NUUkxfUlNUX0VOIHwKKwkJCU5FVFhfR1BJT19DT1VOVEVSX0NUUkxfSVJRX0VOIHwKKwkJCU5FVFhfR1BJT19DT1VOVEVSX0NUUkxfUlVOOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJd3JpdGVsKDAsIE5FVFhfR1BJT19DT1VOVEVSX01BWChUSU1FUl9DTE9DS0VWRU5UKSk7CisJCXRtb2RlID0gTkVUWF9HUElPX0NPVU5URVJfQ1RSTF9JUlFfRU4gfAorCQkJTkVUWF9HUElPX0NPVU5URVJfQ1RSTF9SVU47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTigxLCAiJXM6IHVuaGFuZGxlZCBtb2RlICVkXG4iLCBfX2Z1bmNfXywgbW9kZSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKKwkJdG1vZGUgPSAwOworCQlicmVhazsKKwl9CisKKwl3cml0ZWwodG1vZGUsIE5FVFhfR1BJT19DT1VOVEVSX0NUUkwoVElNRVJfQ0xPQ0tFVkVOVCkpOworfQorCitzdGF0aWMgaW50IG5ldHhfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBldnQsCisJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKK3sKKwl3cml0ZWwoMCAtIGV2dCwgTkVUWF9HUElPX0NPVU5URVJfQ1VSUkVOVChUSU1FUl9DTE9DS0VWRU5UKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG5ldHhfY2xvY2tldmVudCA9IHsKKwkubmFtZSA9ICJuZXR4LXRpbWVyIiBfX3N0cmluZ2lmeShUSU1FUl9DTE9DS0VWRU5UKSwKKwkuc2hpZnQgPSAzMiwKKwkuZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJLnNldF9uZXh0X2V2ZW50ID0gbmV0eF9zZXRfbmV4dF9ldmVudCwKKwkuc2V0X21vZGUgPSBuZXR4X3NldF9tb2RlLAorfTsKKwogLyoKICAqIElSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIKICAqLwogc3RhdGljIGlycXJldHVybl90CiBuZXR4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdGltZXJfdGljaygpOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZuZXR4X2Nsb2NrZXZlbnQ7CiAKIAkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KIAl3cml0ZWwoQ09VTlRFUl9CSVQoMCksIE5FVFhfR1BJT19JUlEpOwogCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG5ldHhfdGltZXJfaXJxID0gewotCS5uYW1lICAgICAgICAgICA9ICJOZXRYIFRpbWVyIFRpY2siLAotCS5mbGFncyAgICAgICAgICA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotCS5oYW5kbGVyICAgICAgICA9IG5ldHhfdGltZXJfaW50ZXJydXB0LAorCS5uYW1lCQk9ICJOZXRYIFRpbWVyIFRpY2siLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKKwkuaGFuZGxlcgk9IG5ldHhfdGltZXJfaW50ZXJydXB0LAogfTsKIAogY3ljbGVfdCBuZXR4X2dldF9jeWNsZXModm9pZCkKIHsKLQlyZXR1cm4gcmVhZGwoTkVUWF9HUElPX0NPVU5URVJfQ1VSUkVOVCgxKSk7CisJcmV0dXJuIHJlYWRsKE5FVFhfR1BJT19DT1VOVEVSX0NVUlJFTlQoVElNRVJfQ0xPQ0tTT1VSQ0UpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9uZXR4ID0gewotCS5uYW1lIAkJPSAibmV0eF90aW1lciIsCisJLm5hbWUJCT0gIm5ldHhfdGltZXIiLAogCS5yYXRpbmcJCT0gMjAwLAogCS5yZWFkCQk9IG5ldHhfZ2V0X2N5Y2xlcywKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKLQkuc2hpZnQgCQk9IDIwLAorCS5zaGlmdAkJPSAyMCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC03NywyNCArMTM0LDM3IEBACiAJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCiAJd3JpdGVsKENPVU5URVJfQklUKDApLCBORVRYX0dQSU9fSVJRKTsKIAotCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGluIHRoZSBzcGVjaWZpYyB0aW1lciByZWdpc3RlciBhbmQgc3RhcnQgdGltZXIgKi8KKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCBpbiB0aGUgc3BlY2lmaWMgdGltZXIKKwkgKiByZWdpc3RlciBhbmQgc3RhcnQgdGltZXIKKwkgKi8KIAl3cml0ZWwoQ09VTlRFUl9CSVQoMCksIE5FVFhfR1BJT19JUlFfRU5BQkxFKTsKIAl3cml0ZWwoTkVUWF9HUElPX0NPVU5URVJfQ1RSTF9JUlFfRU4gfCBORVRYX0dQSU9fQ09VTlRFUl9DVFJMX1JVTiwKLQkJTkVUWF9HUElPX0NPVU5URVJfQ1RSTCgwKSk7CisJCQlORVRYX0dQSU9fQ09VTlRFUl9DVFJMKDApKTsKIAogCXNldHVwX2lycShORVRYX0lSUV9USU1FUjAsICZuZXR4X3RpbWVyX2lycSk7CiAKIAkvKiBTZXR1cCB0aW1lciBvbmUgZm9yIGNsb2Nrc291cmNlICovCi0gICAgICAgIHdyaXRlbCgwLCBORVRYX0dQSU9fQ09VTlRFUl9DVFJMKDEpKTsKLSAgICAgICAgd3JpdGVsKDAsIE5FVFhfR1BJT19DT1VOVEVSX0NVUlJFTlQoMSkpOwotICAgICAgICB3cml0ZWwoMHhGRkZGRkZGRiwgTkVUWF9HUElPX0NPVU5URVJfTUFYKDEpKTsKKwl3cml0ZWwoMCwgTkVUWF9HUElPX0NPVU5URVJfQ1RSTChUSU1FUl9DTE9DS1NPVVJDRSkpOworCXdyaXRlbCgwLCBORVRYX0dQSU9fQ09VTlRFUl9DVVJSRU5UKFRJTUVSX0NMT0NLU09VUkNFKSk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIE5FVFhfR1BJT19DT1VOVEVSX01BWChUSU1FUl9DTE9DS1NPVVJDRSkpOwogCi0gICAgICAgIHdyaXRlbChORVRYX0dQSU9fQ09VTlRFUl9DVFJMX1JVTiwKLSAgICAgICAgICAgICAgICBORVRYX0dQSU9fQ09VTlRFUl9DVFJMKDEpKTsKKwl3cml0ZWwoTkVUWF9HUElPX0NPVU5URVJfQ1RSTF9SVU4sCisJCQlORVRYX0dQSU9fQ09VTlRFUl9DVFJMKFRJTUVSX0NMT0NLU09VUkNFKSk7CiAKIAljbG9ja3NvdXJjZV9uZXR4Lm11bHQgPQogCQljbG9ja3NvdXJjZV9oejJtdWx0KENMT0NLX1RJQ0tfUkFURSwgY2xvY2tzb3VyY2VfbmV0eC5zaGlmdCk7CiAJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX25ldHgpOworCisJbmV0eF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoQ0xPQ0tfVElDS19SQVRFLCBOU0VDX1BFUl9TRUMsCisJCQluZXR4X2Nsb2NrZXZlbnQuc2hpZnQpOworCW5ldHhfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmUsICZuZXR4X2Nsb2NrZXZlbnQpOworCS8qIHdpdGggbWF4X2RlbHRhX25zID49IGRlbHRhMm5zKDB4ODAwKSB0aGUgc3lzdGVtIGN1cnJlbnRseSBydW5zIGZpbmUuCisJICogQWRkaW5nIHNvbWUgc2FmZXR5IC4uLiAqLworCW5ldHhfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4YTAwLCAmbmV0eF9jbG9ja2V2ZW50KTsKKwluZXR4X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmbmV0eF9jbG9ja2V2ZW50KTsKIH0KIAogc3RydWN0IHN5c190aW1lciBuZXR4X3RpbWVyID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwppbmRleCAzMmVhYmY1Li44ZmM2MjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgveGMuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwpAQCAtOTIsMTAgKzkyLDEwIEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IHhjX3BhdGNoKHN0cnVjdCB4YyAqeCwgdm9pZCAqcGF0Y2gsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgeGNfcGF0Y2goc3RydWN0IHhjICp4LCBjb25zdCB2b2lkICpwYXRjaCwgaW50IGNvdW50KQogewogCXVuc2lnbmVkIGludCB2YWwsIGFkcjsKLQl1bnNpZ25lZCBpbnQgKmRhdGEgPSBwYXRjaDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKmRhdGEgPSBwYXRjaDsKIAogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlzdHJ1Y3QgZndfaGVhZGVyICpoZWFkOwogCXVuc2lnbmVkIGludCBzaXplOwogCWludCBpOwotCXZvaWQgKnNyYzsKKwljb25zdCB2b2lkICpzcmM7CiAJdW5zaWduZWQgbG9uZyBkc3Q7CiAKIAlzcHJpbnRmKG5hbWUsICJ4YyVkLmJpbiIsIHgtPm5vKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1MGQ4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IERpZ2kgSW50ZXJuYXRpb25hbCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAotI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9ICi0KLSNlbmRpZiAvKiBpZm5kZWYgX19BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCA2ZGJiMjAzLi43NjYzMTEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMTEsOCArMTEsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKICNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICiAKLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KIC8qCiAgKiBOZXRTaWxpY29uIE5TOXh4eCBpbnRlcm5hbCBtYXBwaW5nOgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggMDI3YmY2NC4uZjA4NDUxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAgMHhmZmZmZmZmZiAvKiBYWFggKi8KIAotI2RlZmluZSBfX2lvKGEpICAgICAgICAgKCh2b2lkIF9faW9tZW0gKikoYSkpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKICNkZWZpbmUgX19tZW1fcGNpKGEpICAgIChhKQogI2RlZmluZSBfX21lbV9pc2EoYSkgICAgKElPX0JBU0UgKyAoYSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA2NDllZTYyLi42MTA3MTkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yMSw3ICsyMSw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKIAotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpIF9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgX19waHlzX3RvX3ZpcnQoeCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKaW5kZXggNzlmMGIxZi4uMTBhMzAxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZwpAQCAtNCwxNiArNCwxOSBAQAogY29uZmlnIEFSQ0hfT01BUDczMAogCWRlcGVuZHMgb24gQVJDSF9PTUFQMQogCWJvb2wgIk9NQVA3MzAgQmFzZWQgU3lzdGVtIgorCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBBUkNIX09NQVBfT1RHCiAKIGNvbmZpZyBBUkNIX09NQVAxNVhYCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAxCiAJZGVmYXVsdCB5CiAJYm9vbCAiT01BUDE1eHggQmFzZWQgU3lzdGVtIgorCXNlbGVjdCBDUFVfQVJNOTI1VAogCiBjb25maWcgQVJDSF9PTUFQMTZYWAogCWRlcGVuZHMgb24gQVJDSF9PTUFQMQogCWJvb2wgIk9NQVAxNnh4IEJhc2VkIFN5c3RlbSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQVJDSF9PTUFQX09URwogCiBjb21tZW50ICJPTUFQIEJvYXJkIFR5cGUiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCmluZGV4IGRiNzg5NDYuLjMwMzA4MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogc3RhdGljIGludCBuYW5kX2Rldl9yZWFkeShzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7Ci0JcmV0dXJuIG9tYXBfZ2V0X2dwaW9fZGF0YWluKFAyX05BTkRfUkJfR1BJT19QSU4pOworCXJldHVybiBncGlvX2dldF92YWx1ZShQMl9OQU5EX1JCX0dQSU9fUElOKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGZzYW1wbGVfdWFydF9jb25maWcgX19pbml0ZGF0YSA9IHsKQEAgLTIyMyw4ICsyMjMsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9mc2FtcGxlX2luaXQodm9pZCkKIHsKLQlpZiAoIShvbWFwX3JlcXVlc3RfZ3BpbyhQMl9OQU5EX1JCX0dQSU9fUElOKSkpCi0JCW5hbmRfZGF0YS5kZXZfcmVhZHkgPSBuYW5kX2Rldl9yZWFkeTsKKwlpZiAoZ3Bpb19yZXF1ZXN0KFAyX05BTkRfUkJfR1BJT19QSU4sICJOQU5EIHJlYWR5IikgPCAwKQorCQlCVUcoKTsKKwluYW5kX2RhdGEuZGV2X3JlYWR5ID0gbmFuZF9kZXZfcmVhZHk7CiAKIAlvbWFwX2NmZ19yZWcoTDNfMTYxMF9GTEFTSF9DUzJCX09FKTsKIAlvbWFwX2NmZ19yZWcoTThfMTYxMF9GTEFTSF9DUzJCX1dFKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLW1tYy5jCmluZGV4IGFiOWVlNTguLjQwOWZhNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi1tbWMuYwpAQCAtMTIsOTAgKzEyLDY4IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KKwogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKLSNpZmRlZiBDT05GSUdfTU1DX09NQVAKLXN0YXRpYyBpbnQgc2xvdF9jb3Zlcl9vcGVuOwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKm1tY19kZXZpY2U7CisjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKIAotc3RhdGljIGludCBoMl9tbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKK3N0YXRpYyBpbnQgbW1jX3NldF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90LCBpbnQgcG93ZXJfb24sCiAJCQkJaW50IHZkZCkKIHsKLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JZGV2X2RiZyhkZXYsICJTZXQgc2xvdCAlZCBwb3dlcjogJXMgKHZkZCAlZClcbiIsIHNsb3QgKyAxLAotCQlwb3dlcl9vbiA/ICJvbiIgOiAib2ZmIiwgdmRkKTsKLSNlbmRpZgotCWlmIChzbG90ICE9IDApIHsKLQkJZGV2X2VycihkZXYsICJObyBzdWNoIHNsb3QgJWRcbiIsIHNsb3QgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmIChwb3dlcl9vbikKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEgyX1RQU19HUElPX01NQ19QV1JfRU4sIDEpOworCWVsc2UKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEgyX1RQU19HUElPX01NQ19QV1JfRU4sIDApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaDJfbW1jX3NldF9idXNfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90LCBpbnQgYnVzX21vZGUpCitzdGF0aWMgaW50IG1tY19sYXRlX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLQlkZXZfZGJnKGRldiwgIlNldCBzbG90ICVkIGJ1c19tb2RlICVzXG4iLCBzbG90ICsgMSwKLQkJYnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOID8gIm9wZW4tZHJhaW4iIDogInB1c2gtcHVsbCIpOwotI2VuZGlmCi0JaWYgKHNsb3QgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIHN1Y2ggc2xvdCAlZFxuIiwgc2xvdCArIDEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJaW50IHJldDsKIAotCXJldHVybiAwOwotfQorCXJldCA9IGdwaW9fcmVxdWVzdChIMl9UUFNfR1BJT19NTUNfUFdSX0VOLCAiTU1DIHBvd2VyIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLXN0YXRpYyBpbnQgaDJfbW1jX2dldF9jb3Zlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90KQotewotCUJVR19PTihzbG90ICE9IDApOwotCi0JcmV0dXJuIHNsb3RfY292ZXJfb3BlbjsKLX0KLQotdm9pZCBoMl9tbWNfc2xvdF9jb3Zlcl9oYW5kbGVyKHZvaWQgKmFyZywgaW50IHN0YXRlKQotewotCWlmIChtbWNfZGV2aWNlID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNsb3RfY292ZXJfb3BlbiA9IHN0YXRlOwotCW9tYXBfbW1jX25vdGlmeV9jb3Zlcl9ldmVudChtbWNfZGV2aWNlLCAwLCBzdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaDJfbW1jX2xhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltbWNfZGV2aWNlID0gZGV2OworCWdwaW9fZGlyZWN0aW9uX291dHB1dChIMl9UUFNfR1BJT19NTUNfUFdSX0VOLCAwKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGgyX21tY19jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG1tY19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJZ3Bpb19mcmVlKEgyX1RQU19HUElPX01NQ19QV1JfRU4pOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgaDJfbW1jX2RhdGEgPSB7CisvKgorICogSDIgY291bGQgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRlc3RlZDoKKyAqIC0gbW1jX2dldF9jb3Zlcl9zdGF0ZSB0aGF0IHVzZXMgT01BUF9NUFVJTygxKQorICogLSBtbWNfZ2V0X3dwIHRoYXQgdXNlcyBPTUFQX01QVUlPKDMpCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBtbWMxX2RhdGEgPSB7CiAJLm5yX3Nsb3RzICAgICAgICAgICAgICAgICAgICAgICA9IDEsCi0JLnN3aXRjaF9zbG90ICAgICAgICAgICAgICAgICAgICA9IE5VTEwsCi0JLmluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgyX21tY19sYXRlX2luaXQsCi0JLmNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICA9IGgyX21tY19jbGVhbnVwLAorCS5pbml0CQkJCT0gbW1jX2xhdGVfaW5pdCwKKwkuc2h1dGRvd24JCQk9IG1tY19zaHV0ZG93biwKKwkuZG1hX21hc2sJCQk9IDB4ZmZmZmZmZmYsCiAJLnNsb3RzWzBdICAgICAgID0gewotCQkuc2V0X3Bvd2VyICAgICAgICAgICAgICA9IGgyX21tY19zZXRfcG93ZXIsCi0JCS5zZXRfYnVzX21vZGUgICAgICAgICAgID0gaDJfbW1jX3NldF9idXNfbW9kZSwKLQkJLmdldF9ybyAgICAgICAgICAgICAgICAgPSBOVUxMLAotCQkuZ2V0X2NvdmVyX3N0YXRlICAgICAgICA9IGgyX21tY19nZXRfY292ZXJfc3RhdGUsCisJCS5zZXRfcG93ZXIgICAgICAgICAgICAgID0gbW1jX3NldF9wb3dlciwKIAkJLm9jcl9tYXNrICAgICAgICAgICAgICAgPSBNTUNfVkREXzI4XzI5IHwgTU1DX1ZERF8zMF8zMSB8CiAJCQkJCSAgTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCiAJCS5uYW1lICAgICAgICAgICAgICAgICAgID0gIm1tY2JsayIsCiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jX2RhdGFbT01BUDE2WFhfTlJfTU1DXTsKKwogdm9pZCBfX2luaXQgaDJfbW1jX2luaXQodm9pZCkKIHsKLQlvbWFwX3NldF9tbWNfaW5mbygxLCAmaDJfbW1jX2RhdGEpOworCW1tY19kYXRhWzBdID0gJm1tYzFfZGF0YTsKKwlvbWFwMV9pbml0X21tYyhtbWNfZGF0YSwgT01BUDE2WFhfTlJfTU1DKTsKIH0KIAogI2Vsc2UKQEAgLTEwNCw3ICs4Miw0IEBACiB7CiB9CiAKLXZvaWQgaDJfbW1jX3Nsb3RfY292ZXJfaGFuZGxlcih2b2lkICphcmcsIGludCBzdGF0ZSkKLXsKLX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCmluZGV4IDNiNjU5MTQuLmIyNDBjNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTI1MCwxMSArMjUwLDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0lSKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX0lSX01PRFVMRSkKIHN0YXRpYyBpbnQgaDJfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdGF0ZSkKIHsKLQlpZiAoc3RhdGUgJiBJUl9TSVJNT0RFKQotCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoSDJfSVJEQV9GSVJTRUxfR1BJT19QSU4sIDApOwotCWVsc2UgICAgLyogTUlSL0ZJUiAqLwotCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoSDJfSVJEQV9GSVJTRUxfR1BJT19QSU4sIDEpOwotCisJLyogU0lSIHdoZW4gbG93LCBlbHNlIE1JUi9GSVIgd2hlbiBISUdIICovCisJZ3Bpb19zZXRfdmFsdWUoSDJfSVJEQV9GSVJTRUxfR1BJT19QSU4sICEoc3RhdGUgJiBJUl9TSVJNT0RFKSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTM0MiwxNiArMzM5LDMxIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0X3NtYzkxeCh2b2lkKQogewotCWlmICgob21hcF9yZXF1ZXN0X2dwaW8oMCkpIDwgMCkgeworCWlmIChncGlvX3JlcXVlc3QoMCwgIlNNQzkxeCBpcnEiKSA8IDApIHsKIAkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CiAJCXJldHVybjsKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdHBzX3NldHVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHZvaWQgKmNvbnRleHQpCit7CisJdHBzNjUwMTBfY29uZmlnX3ZyZWdzMShUUFNfTERPMl9FTkFCTEUgfCBUUFNfVkxETzJfM18wViB8CisJCQkJVFBTX0xETzFfRU5BQkxFIHwgVFBTX1ZMRE8xXzNfMFYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHBzNjUwMTBfYm9hcmQgdHBzX2JvYXJkID0geworCS5iYXNlCQk9IEgyX1RQU19HUElPX0JBU0UsCisJLm91dG1hc2sJPSAweDBmLAorCS5zZXR1cAkJPSB0cHNfc2V0dXAsCit9OworCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaDJfaTJjX2JvYXJkX2luZm9bXSA9IHsKIAl7CiAJCUkyQ19CT0FSRF9JTkZPKCJ0cHM2NTAxMCIsIDB4NDgpLAogCQkuaXJxICAgICAgICAgICAgPSBPTUFQX0dQSU9fSVJRKDU4KSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdHBzX2JvYXJkLAogCX0sIHsKIAkJSTJDX0JPQVJEX0lORk8oImlzcDEzMDFfb21hcCIsIDB4MmQpLAogCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMiksCkBAIC0zODEsMTUgKzM5Myw2IEBACiAJLnBpbnNbMV0JPSAzLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgaDJfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5tbWNbMF0gPSB7Ci0JCS5lbmFibGVkCT0gMSwKLQkJLndpcmU0CQk9IDEsCi0JfSwKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBoMl9tbWNfZGF0YTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGgyX3VhcnRfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLmVuYWJsZWRfdWFydHMgPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CkBAIC00MDAsNyArNDAzLDYgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDJfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwJCSZoMl91c2JfY29uZmlnIH0sCi0JeyBPTUFQX1RBR19NTUMsCQkmaDJfbW1jX2NvbmZpZyB9LAogCXsgT01BUF9UQUdfVUFSVCwJJmgyX3VhcnRfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19MQ0QsCQkmaDJfbGNkX2NvbmZpZyB9LAogfTsKQEAgLTQwOSw3ICs0MTEsNyBAQAogCiBzdGF0aWMgaW50IGgyX25hbmRfZGV2X3JlYWR5KHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZGF0YSkKIHsKLQlyZXR1cm4gb21hcF9nZXRfZ3Bpb19kYXRhaW4oSDJfTkFORF9SQl9HUElPX1BJTik7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEgyX05BTkRfUkJfR1BJT19QSU4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdCh2b2lkKQpAQCAtNDI4LDggKzQzMCw5IEBACiAKIAloMl9uYW5kX3Jlc291cmNlLmVuZCA9IGgyX25hbmRfcmVzb3VyY2Uuc3RhcnQgPSBPTUFQX0NTMkJfUEhZUzsKIAloMl9uYW5kX3Jlc291cmNlLmVuZCArPSBTWl80SyAtIDE7Ci0JaWYgKCEob21hcF9yZXF1ZXN0X2dwaW8oSDJfTkFORF9SQl9HUElPX1BJTikpKQotCQloMl9uYW5kX2RhdGEuZGV2X3JlYWR5ID0gaDJfbmFuZF9kZXZfcmVhZHk7CisJaWYgKGdwaW9fcmVxdWVzdChIMl9OQU5EX1JCX0dQSU9fUElOLCAiTkFORCByZWFkeSIpIDwgMCkKKwkJQlVHKCk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoSDJfTkFORF9SQl9HUElPX1BJTik7CiAKIAlvbWFwX2NmZ19yZWcoTDNfMTYxMF9GTEFTSF9DUzJCX09FKTsKIAlvbWFwX2NmZ19yZWcoTThfMTYxMF9GTEFTSF9DUzJCX1dFKTsKQEAgLTQ0MSwxMCArNDQ0LDEwIEBACiAJLyogSXJkYSAqLwogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfSVIpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfSVJfTU9EVUxFKQogCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoRlVOQ19NVVhfQ1RSTF9BKSB8IDcsIEZVTkNfTVVYX0NUUkxfQSk7Ci0JaWYgKCEob21hcF9yZXF1ZXN0X2dwaW8oSDJfSVJEQV9GSVJTRUxfR1BJT19QSU4pKSkgewotCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihIMl9JUkRBX0ZJUlNFTF9HUElPX1BJTiwgMCk7Ci0JCWgyX2lyZGFfZGF0YS50cmFuc2NlaXZlcl9tb2RlID0gaDJfdHJhbnNjZWl2ZXJfbW9kZTsKLQl9CisJaWYgKGdwaW9fcmVxdWVzdChIMl9JUkRBX0ZJUlNFTF9HUElPX1BJTiwgIklSREEgbW9kZSIpIDwgMCkKKwkJQlVHKCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEgyX0lSREFfRklSU0VMX0dQSU9fUElOLCAwKTsKKwloMl9pcmRhX2RhdGEudHJhbnNjZWl2ZXJfbW9kZSA9IGgyX3RyYW5zY2VpdmVyX21vZGU7CiAjZW5kaWYKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGgyX2RldmljZXMsIEFSUkFZX1NJWkUoaDJfZGV2aWNlcykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMtbW1jLmMKaW5kZXggMzYwODU4MS4uZmRmZTc5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLW1tYy5jCkBAIC0xMiw5NCArMTIsNTUgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy90cHM2NTAxMC5oPgorCiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAotI2lmZGVmIENPTkZJR19NTUNfT01BUAotc3RhdGljIGludCBzbG90X2NvdmVyX29wZW47Ci1zdGF0aWMgc3RydWN0IGRldmljZSAqbW1jX2RldmljZTsKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKQogCi1zdGF0aWMgaW50IGgzX21tY19zZXRfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCwgaW50IHBvd2VyX29uLAorc3RhdGljIGludCBtbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKIAkJCQlpbnQgdmRkKQogewotI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLQlkZXZfZGJnKGRldiwgIlNldCBzbG90ICVkIHBvd2VyOiAlcyAodmRkICVkKVxuIiwgc2xvdCArIDEsCi0JCXBvd2VyX29uID8gIm9uIiA6ICJvZmYiLCB2ZGQpOwotI2VuZGlmCi0JaWYgKHNsb3QgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIHN1Y2ggc2xvdCAlZFxuIiwgc2xvdCArIDEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJaWYgKHBvd2VyX29uKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoSDNfVFBTX0dQSU9fTU1DX1BXUl9FTiwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoSDNfVFBTX0dQSU9fTU1DX1BXUl9FTiwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoM19tbWNfc2V0X2J1c19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBidXNfbW9kZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLQlkZXZfZGJnKGRldiwgIlNldCBzbG90ICVkIGJ1c19tb2RlICVzXG4iLCBzbG90ICsgMSwKLQkJYnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOID8gIm9wZW4tZHJhaW4iIDogInB1c2gtcHVsbCIpOwotI2VuZGlmCi0JaWYgKHNsb3QgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIHN1Y2ggc2xvdCAlZFxuIiwgc2xvdCArIDEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBUcmVhdGVkIG9uIHVwcGVyIGxldmVsICovCi0KLQlyZXR1cm4gYnVzX21vZGU7Ci19Ci0KLXN0YXRpYyBpbnQgaDNfbW1jX2dldF9jb3Zlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90KQotewotCUJVR19PTihzbG90ICE9IDApOwotCi0JcmV0dXJuIHNsb3RfY292ZXJfb3BlbjsKLX0KLQotdm9pZCBoM19tbWNfc2xvdF9jb3Zlcl9oYW5kbGVyKHZvaWQgKmFyZywgaW50IHN0YXRlKQotewotCWlmIChtbWNfZGV2aWNlID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNsb3RfY292ZXJfb3BlbiA9IHN0YXRlOwotCW9tYXBfbW1jX25vdGlmeV9jb3Zlcl9ldmVudChtbWNfZGV2aWNlLCAwLCBzdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaDNfbW1jX2xhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltbWNfZGV2aWNlID0gZGV2OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaDNfbW1jX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgaDNfbW1jX2RhdGEgPSB7CisvKgorICogSDMgY291bGQgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRlc3RlZDoKKyAqIC0gbW1jX2dldF9jb3Zlcl9zdGF0ZSB0aGF0IHVzZXMgT01BUF9NUFVJTygxKQorICogLSBtbWNfZ2V0X3dwIHRoYXQgbWF5YmUgdXNlcyBPTUFQX01QVUlPKDMpCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBtbWMxX2RhdGEgPSB7CiAJLm5yX3Nsb3RzICAgICAgICAgICAgICAgICAgICAgICA9IDEsCi0JLnN3aXRjaF9zbG90ICAgICAgICAgICAgICAgICAgICA9IE5VTEwsCi0JLmluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgzX21tY19sYXRlX2luaXQsCi0JLmNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICA9IGgzX21tY19jbGVhbnVwLAorCS5kbWFfbWFzawkJCT0gMHhmZmZmZmZmZiwKIAkuc2xvdHNbMF0gICAgICAgPSB7Ci0JCS5zZXRfcG93ZXIgICAgICAgICAgICAgID0gaDNfbW1jX3NldF9wb3dlciwKLQkJLnNldF9idXNfbW9kZSAgICAgICAgICAgPSBoM19tbWNfc2V0X2J1c19tb2RlLAotCQkuZ2V0X3JvICAgICAgICAgICAgICAgICA9IE5VTEwsCi0JCS5nZXRfY292ZXJfc3RhdGUgICAgICAgID0gaDNfbW1jX2dldF9jb3Zlcl9zdGF0ZSwKKwkJLnNldF9wb3dlciAgICAgICAgICAgICAgPSBtbWNfc2V0X3Bvd2VyLAogCQkub2NyX21hc2sgICAgICAgICAgICAgICA9IE1NQ19WRERfMjhfMjkgfCBNTUNfVkREXzMwXzMxIHwKIAkJCQkJICBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKIAkJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAibW1jYmxrIiwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWNfZGF0YVtPTUFQMTZYWF9OUl9NTUNdOworCiB2b2lkIF9faW5pdCBoM19tbWNfaW5pdCh2b2lkKQogewotCW9tYXBfc2V0X21tY19pbmZvKDEsICZoM19tbWNfZGF0YSk7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChIM19UUFNfR1BJT19NTUNfUFdSX0VOLCAiTU1DIHBvd2VyIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoSDNfVFBTX0dQSU9fTU1DX1BXUl9FTiwgMCk7CisKKwltbWNfZGF0YVswXSA9ICZtbWMxX2RhdGE7CisJb21hcDFfaW5pdF9tbWMobW1jX2RhdGEsIE9NQVAxNlhYX05SX01NQyk7CiB9CiAKICNlbHNlCkBAIC0xMDgsNyArNjksNCBAQAogewogfQogCi12b2lkIGgzX21tY19zbG90X2NvdmVyX2hhbmRsZXIodm9pZCAqYXJnLCBpbnQgc3RhdGUpCi17Ci19CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwppbmRleCBhZGZjZDdiLi41MTU3ZWVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC00NDcsMTUgKzQ0Nyw2IEBACiAJLnBpbnNbMV0JPSAzLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgaDNfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5tbWNbMF0gPSB7Ci0JCS5lbmFibGVkCT0gMSwKLQkJLndpcmU0CQk9IDEsCi0gICAgICAgfSwKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBoM19tbWNfZGF0YTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGgzX3VhcnRfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLmVuYWJsZWRfdWFydHMgPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CkBAIC00NjYsNyArNDU3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDNfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwJCSZoM191c2JfY29uZmlnIH0sCi0JeyBPTUFQX1RBR19NTUMsCQkmaDNfbW1jX2NvbmZpZyB9LAogCXsgT01BUF9UQUdfVUFSVCwJJmgzX3VhcnRfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19MQ0QsCQkmaDNfbGNkX2NvbmZpZyB9LAogfTsKQEAgLTQ5OCw3ICs0ODgsNyBAQAogCiBzdGF0aWMgaW50IG5hbmRfZGV2X3JlYWR5KHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZGF0YSkKIHsKLQlyZXR1cm4gb21hcF9nZXRfZ3Bpb19kYXRhaW4oSDNfTkFORF9SQl9HUElPX1BJTik7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEgzX05BTkRfUkJfR1BJT19QSU4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaDNfaW5pdCh2b2lkKQpAQCAtNTE2LDggKzUwNiw5IEBACiAKIAluYW5kX3Jlc291cmNlLmVuZCA9IG5hbmRfcmVzb3VyY2Uuc3RhcnQgPSBPTUFQX0NTMkJfUEhZUzsKIAluYW5kX3Jlc291cmNlLmVuZCArPSBTWl80SyAtIDE7Ci0JaWYgKCEob21hcF9yZXF1ZXN0X2dwaW8oSDNfTkFORF9SQl9HUElPX1BJTikpKQotCQluYW5kX2RhdGEuZGV2X3JlYWR5ID0gbmFuZF9kZXZfcmVhZHk7CisJaWYgKGdwaW9fcmVxdWVzdChIM19OQU5EX1JCX0dQSU9fUElOLCAiTkFORCByZWFkeSIpIDwgMCkKKwkJQlVHKCk7CisJbmFuZF9kYXRhLmRldl9yZWFkeSA9IG5hbmRfZGV2X3JlYWR5OwogCiAJLyogR1BJTzEwIEZ1bmNfTVVYX0NUUkwgcmVnIGJpdCAyOToyNywgQ29uZmlndXJlIFYyIHRvIG1vZGUxIGFzIEdQSU8gKi8KIAkvKiBHUElPMTAgcHVsbHVwL2Rvd24gcmVnaXN0ZXIsIEVuYWJsZSBwdWxsdXAgb24gR1BJTzEwICovCkBAIC01MzcsNyArNTI4LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X3NtYzkxeCh2b2lkKQogewogCW9tYXBfY2ZnX3JlZyhXMTVfMTcxMF9HUElPNDApOwotCWlmIChvbWFwX3JlcXVlc3RfZ3Bpbyg0MCkgPCAwKSB7CisJaWYgKGdwaW9fcmVxdWVzdCg0MCwgIlNNQzkxeCBpcnEiKSA8IDApIHsKIAkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gNDAgZm9yIHNtYzkxeCBpcnFcbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKaW5kZXggY2JjMTFiZS4uYWYyZmI5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL21jYnNwLmg+CiAjaW5jbHVkZSA8bWFjaC9vbWFwLWFsc2EuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgogCiBzdGF0aWMgaW50IGlubm92YXRvcl9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0YxKSwKQEAgLTMwMSw3ICszMDIsNyBAQAogCQkJICAgT01BUDE1MTBfRlBHQV9SU1QpOwogCQl1ZGVsYXkoNzUwKTsKIAl9IGVsc2UgewotCQlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKKwkJaWYgKGdwaW9fcmVxdWVzdCgwLCAiU01DOTF4IGlycSIpIDwgMCkgewogCQkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTM2MCwxNiArMzYxLDQ5IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGlubm92YXRvcl9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLm1tYyBbMF0gPSB7Ci0JCS5lbmFibGVkIAk9IDEsCi0JCS53aXJlNAkJPSAxLAotCQkud3BfcGluCQk9IE9NQVBfTVBVSU8oMyksCi0JCS5wb3dlcl9waW4JPSAtMSwJLyogRlBHQSBGMyBVSU80MiAqLwotCQkuc3dpdGNoX3Bpbgk9IC0xLAkvKiBGUEdBIEY0IFVJTzQzICovCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKworc3RhdGljIGludCBtbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKKwkJCQlpbnQgdmRkKQoreworCWlmIChwb3dlcl9vbikKKwkJZnBnYV93cml0ZShmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUikgfCAoMSA8PCAzKSwKKwkJCQlPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwllbHNlCisJCWZwZ2Ffd3JpdGUoZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUE9XRVIpICYgfigxIDw8IDMpLAorCQkJCU9NQVAxNTEwX0ZQR0FfUE9XRVIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbm5vdmF0b3IgY291bGQgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRlc3RlZDoKKyAqIC0gbW1jX2dldF93cCB0aGF0IHVzZXMgT01BUF9NUFVJTygzKQorICogLSBtbWNfZ2V0X2NvdmVyX3N0YXRlIHRoYXQgdXNlcyBGUEdBIEY0IFVJTzQzCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBtbWMxX2RhdGEgPSB7CisJLm5yX3Nsb3RzICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisJLnNsb3RzWzBdICAgICAgID0geworCQkuc2V0X3Bvd2VyCQk9IG1tY19zZXRfcG93ZXIsCisJCS53aXJlcwkJCT0gNCwKKwkJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAibW1jYmxrIiwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWNfZGF0YVtPTUFQMTZYWF9OUl9NTUNdOworCit2b2lkIF9faW5pdCBpbm5vdmF0b3JfbW1jX2luaXQodm9pZCkKK3sKKwltbWNfZGF0YVswXSA9ICZtbWMxX2RhdGE7CisJb21hcDFfaW5pdF9tbWMobW1jX2RhdGEsIE9NQVAxNVhYX05SX01NQyk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgaW5ub3ZhdG9yX21tY19pbml0KHZvaWQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGlubm92YXRvcl91YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0gewogCS5lbmFibGVkX3VhcnRzID0gKCgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSksCiB9OwpAQCAtMzc3LDcgKzQxMSw2IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBpbm5vdmF0b3JfY29uZmlnW10gPSB7CiAJeyBPTUFQX1RBR19VU0IsICAgICAgICAgTlVMTCB9LAogCXsgT01BUF9UQUdfTENELAkJTlVMTCB9LAotCXsgT01BUF9UQUdfTU1DLAkJJmlubm92YXRvcl9tbWNfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19VQVJULAkmaW5ub3ZhdG9yX3VhcnRfY29uZmlnIH0sCiB9OwogCkBAIC00MTIsNiArNDQ1LDcgQEAKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShpbm5vdmF0b3JfY29uZmlnKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7CisJaW5ub3ZhdG9yX21tY19pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfbWFwX2lvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKaW5kZXggMzhkOTc4My4uNDk3MGM0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1hY2gvYWljMjMuaD4KICNpbmNsdWRlIDxtYWNoL29tYXBmYi5oPgogI2luY2x1ZGUgPG1hY2gvbGNkX21pcGlkLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KIAogI2RlZmluZSBBRFM3ODQ2X1BFTkRPV05fR1BJTwkxNQogCkBAIC0xMDIsNyArMTAzLDcgQEAKIHsKIAlpZiAocGRhdGEtPm5yZXNldF9ncGlvICE9IC0xKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInNodXRkb3duIExDRFxuIik7Ci0JCW9tYXBfc2V0X2dwaW9fZGF0YW91dChwZGF0YS0+bnJlc2V0X2dwaW8sIDApOworCQlncGlvX3NldF92YWx1ZShwZGF0YS0+bnJlc2V0X2dwaW8sIDApOwogCQltc2xlZXAoMTIwKTsKIAl9CiB9CkBAIC0xMjQsMTMgKzEyNSwxMyBAQAogCiBzdGF0aWMgdm9pZCBhZHM3ODQ2X2Rldl9pbml0KHZvaWQpCiB7Ci0JaWYgKG9tYXBfcmVxdWVzdF9ncGlvKEFEUzc4NDZfUEVORE9XTl9HUElPKSA8IDApCisJaWYgKGdwaW9fcmVxdWVzdChBRFM3ODQ2X1BFTkRPV05fR1BJTywgIkFEUzc4NDYgcGVuZG93biIpIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBnZXQgYWRzNzg0NiBwZW4gZG93biBHUElPXG4iKTsKIH0KIAogc3RhdGljIGludCBhZHM3ODQ2X2dldF9wZW5kb3duX3N0YXRlKHZvaWQpCiB7Ci0JcmV0dXJuICFvbWFwX2dldF9ncGlvX2RhdGFpbihBRFM3ODQ2X1BFTkRPV05fR1BJTyk7CisJcmV0dXJuICFncGlvX2dldF92YWx1ZShBRFM3ODQ2X1BFTkRPV05fR1BJTyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIG5va2lhNzcwX2Fkczc4NDZfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhID0gewpAQCAtMTczLDI2ICsxNzQsNjggQEAKIAkucGluc1swXQk9IDYsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyBub2tpYTc3MF9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLm1tY1swXSA9IHsKLQkJLmVuYWJsZWQJPSAwLAotCQkud2lyZTQJCT0gMCwKLQkJLndwX3BpbgkJPSAtMSwKLQkJLnBvd2VyX3Bpbgk9IC0xLAotCQkuc3dpdGNoX3Bpbgk9IC0xLAotCX0sCi0JLm1tY1sxXSA9IHsKLQkJLmVuYWJsZWQJPSAwLAotCQkud2lyZTQJCT0gMCwKLQkJLndwX3BpbgkJPSAtMSwKLQkJLnBvd2VyX3Bpbgk9IC0xLAotCQkuc3dpdGNoX3Bpbgk9IC0xLAorI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCisKKyNkZWZpbmUgTk9LSUE3NzBfR1BJT19NTUNfUE9XRVIJCTQxCisjZGVmaW5lIE5PS0lBNzcwX0dQSU9fTU1DX1NXSVRDSAkyMworCitzdGF0aWMgaW50IG5va2lhNzcwX21tY19zZXRfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCwgaW50IHBvd2VyX29uLAorCQkJCWludCB2ZGQpCit7CisJaWYgKHBvd2VyX29uKQorCQlncGlvX3NldF92YWx1ZShOT0tJQTc3MF9HUElPX01NQ19QT1dFUiwgMSk7CisJZWxzZQorCQlncGlvX3NldF92YWx1ZShOT0tJQTc3MF9HUElPX01NQ19QT1dFUiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBub2tpYTc3MF9tbWNfZ2V0X2NvdmVyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKE5PS0lBNzcwX0dQSU9fTU1DX1NXSVRDSCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBub2tpYTc3MF9tbWMyX2RhdGEgPSB7CisJLm5yX3Nsb3RzICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisJLmRtYV9tYXNrCQkJPSAweGZmZmZmZmZmLAorCS5zbG90c1swXSAgICAgICA9IHsKKwkJLnNldF9wb3dlcgkJPSBub2tpYTc3MF9tbWNfc2V0X3Bvd2VyLAorCQkuZ2V0X2NvdmVyX3N0YXRlCT0gbm9raWE3NzBfbW1jX2dldF9jb3Zlcl9zdGF0ZSwKKwkJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAibW1jYmxrIiwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICpub2tpYTc3MF9tbWNfZGF0YVtPTUFQMTZYWF9OUl9NTUNdOworCitzdGF0aWMgdm9pZCBfX2luaXQgbm9raWE3NzBfbW1jX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KE5PS0lBNzcwX0dQSU9fTU1DX1BPV0VSLCAiTU1DIHBvd2VyIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTk9LSUE3NzBfR1BJT19NTUNfUE9XRVIsIDApOworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KE5PS0lBNzcwX0dQSU9fTU1DX1NXSVRDSCwgIk1NQyBjb3ZlciIpOworCWlmIChyZXQgPCAwKSB7CisJCWdwaW9fZnJlZShOT0tJQTc3MF9HUElPX01NQ19QT1dFUik7CisJCXJldHVybjsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoTk9LSUE3NzBfR1BJT19NTUNfU1dJVENIKTsKKworCS8qIE9ubHkgdGhlIHNlY29uZCBNTUMgY29udHJvbGxlciBpcyB1c2VkICovCisJbm9raWE3NzBfbW1jX2RhdGFbMV0gPSAmbm9raWE3NzBfbW1jMl9kYXRhOworCW9tYXAxX2luaXRfbW1jKG5va2lhNzcwX21tY19kYXRhLCBPTUFQMTZYWF9OUl9NTUMpOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG5va2lhNzcwX21tY19pbml0KHZvaWQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgbm9raWE3NzBfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwJCU5VTEwgfSwKLQl7IE9NQVBfVEFHX01NQywJCSZub2tpYTc3MF9tbWNfY29uZmlnIH0sCiB9OwogCiAjaWYJZGVmaW5lZChDT05GSUdfT01BUF9EU1ApCkBAIC0yMjgsOSArMjcxLDkgQEAKIAkvKiBUdXJuIG9uIGNvZGVjICovCiAJYWljMjNfcG93ZXJfdXAoKTsKIAotCWlmIChvbWFwX2dldF9ncGlvX2RhdGFpbihIRUFEUEhPTkVfR1BJTykpCisJaWYgKGdwaW9fZ2V0X3ZhbHVlKEhFQURQSE9ORV9HUElPKSkKIAkJLyogSFAgbm90IGNvbm5lY3RlZCwgdHVybiBvbiBhbXBsaWZpZXIgKi8KLQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFNUExJRklFUl9DVFJMX0dQSU8sIDEpOworCQlncGlvX3NldF92YWx1ZShBTVBMSUZJRVJfQ1RSTF9HUElPLCAxKTsKIAllbHNlCiAJCS8qIEhQIGNvbm5lY3RlZCwgZG8gbm90IHR1cm4gb24gYW1wbGlmaWVyICovCiAJCXByaW50aygiSFAgY29ubmVjdGVkXG4iKTsKQEAgLTI1MCw3ICsyOTMsNyBAQAogc3RhdGljIHZvaWQgbm9raWE3NzBfYXVkaW9fcHdyX2Rvd24odm9pZCkKIHsKIAkvKiBUdXJuIG9mZiBhbXBsaWZpZXIgKi8KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQU1QTElGSUVSX0NUUkxfR1BJTywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoQU1QTElGSUVSX0NUUkxfR1BJTywgMCk7CiAKIAkvKiBUdXJuIG9mZiBjb2RlYzogc2NoZWR1bGUgZGVsYXllZCB3b3JrICovCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb2RlY19wb3dlcl9kb3duX3dvcmssIEhaIC8gMjApOwkvKiA1MG1zICovCkBAIC0zMzUsNiArMzc4LDcgQEAKIAlvbWFwX2RzcF9pbml0KCk7CiAJYWRzNzg0Nl9kZXZfaW5pdCgpOwogCW1pcGlkX2Rldl9pbml0KCk7CisJbm9raWE3NzBfbW1jX2luaXQoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbm9raWE3NzBfbWFwX2lvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwppbmRleCAzZTc2NmU0Li5mZjllNjdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKQEAgLTE4OCw3ICsxODgsOCBAQAogCS8qIE5PVEU6ICBEOSBhbmQgRDIgaGF2ZSBoYXJkd2FyZSBibGluayBzdXBwb3J0LgogCSAqIEFsc28sIEQ5IHJlcXVpcmVzIG5vbi1iYXR0ZXJ5IHBvd2VyLgogCSAqLwotCXsgLmdwaW8gPSBPU0tfVFBTX0dQSU9fTEVEX0Q5LCAubmFtZSA9ICJkOSIsIH0sCisJeyAuZ3BpbyA9IE9TS19UUFNfR1BJT19MRURfRDksIC5uYW1lID0gImQ5IiwKKwkJCS5kZWZhdWx0X3RyaWdnZXIgPSAiaWRlLWRpc2siLCB9LAogCXsgLmdwaW8gPSBPU0tfVFBTX0dQSU9fTEVEX0QyLCAubmFtZSA9ICJkMiIsIH0sCiAJeyAuZ3BpbyA9IE9TS19UUFNfR1BJT19MRURfRDMsIC5uYW1lID0gImQzIiwgLmFjdGl2ZV9sb3cgPSAxLAogCQkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLCB9LApAQCAtMjYwLDcgKzI2MSw2IEBACiAJfSwKIAkvKiBUT0RPIHdoZW4gZHJpdmVyIHN1cHBvcnQgaXMgcmVhZHk6CiAJICogIC0gYWljMjMgYXVkaW8gY2hpcCBhdCAweDFhCi0JICogIC0gb24gTWlzdHJhbCwgMjRjMDQgZWVwcm9tIGF0IDB4NTAKIAkgKiAgLSBvcHRpb25hbGx5IG9uIE1pc3RyYWwsIG92OTY0MCBjYW1lcmEgc2Vuc29yIGF0IDB4MzAKIAkgKi8KIH07CkBAIC0yODgsNyArMjg4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAkvKiB0aGUgQ0YgSS9PIElSUSBpcyByZWFsbHkgYWN0aXZlLWxvdyAqLwotCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDYyKSwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKKwlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoNjIpLCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfaXJxKHZvaWQpCkBAIC0zMzcsMTEgKzMzNywyOCBAQAogI2lmZGVmCUNPTkZJR19PTUFQX09TS19NSVNUUkFMCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2tleXBhZC5oPgogCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBhdDI0YzA0ID0geworCS5ieXRlX2xlbgk9IFNaXzRLIC8gOCwKKwkucGFnZV9zaXplCT0gMTYsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgbWlzdHJhbF9pMmNfYm9hcmRfaW5mb1tdID0geworCXsKKwkJLyogTk9URTogIHBvd2VyZWQgZnJvbSBMQ0Qgc3VwcGx5ICovCisJCUkyQ19CT0FSRF9JTkZPKCIyNGMwNCIsIDB4NTApLAorCQkucGxhdGZvcm1fZGF0YQk9ICZhdDI0YzA0LAorCX0sCisJLyogVE9ETyB3aGVuIGRyaXZlciBzdXBwb3J0IGlzIHJlYWR5OgorCSAqICAtIG9wdGlvbmFsbHkgb3Y5NjQwIGNhbWVyYSBzZW5zb3IgYXQgMHgzMAorCSAqLworfTsKKwogc3RhdGljIGNvbnN0IGludCBvc2tfa2V5bWFwW10gPSB7CiAJLyogS0VZKGNvbCwgcm93LCBjb2RlKSAqLwogCUtFWSgwLCAwLCBLRVlfRjEpLAkJLyogU1c0ICovCkBAIC00ODMsMjMgKzUwMCwzMCBAQAogCW9tYXBfY2ZnX3JlZyhQMjBfMTYxMF9HUElPNCk7CS8qIFBFTklSUSAqLwogCWdwaW9fcmVxdWVzdCg0LCAidHNfaW50Iik7CiAJZ3Bpb19kaXJlY3Rpb25faW5wdXQoNCk7Ci0Jc2V0X2lycV90eXBlKE9NQVBfR1BJT19JUlEoNCksIElSUV9UWVBFX0VER0VfRkFMTElORyk7CisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKDQpLCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOwogCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8obWlzdHJhbF9ib2FyZGluZm8sCiAJCQlBUlJBWV9TSVpFKG1pc3RyYWxfYm9hcmRpbmZvKSk7CiAKLQkvKiB0aGUgc2lkZXdheXMgYnV0dG9uIChTVzEpIGlzIGZvciB1c2UgYXMgYSAid2FrZXVwIiBidXR0b24gKi8KKwkvKiB0aGUgc2lkZXdheXMgYnV0dG9uIChTVzEpIGlzIGZvciB1c2UgYXMgYSAid2FrZXVwIiBidXR0b24KKwkgKgorCSAqIE5PVEU6ICBUaGUgTWlzdHJhbCBib2FyZCBoYXMgdGhlIHdha2V1cCBidXR0b24gKFNXMSkgd2lyZWQKKwkgKiB0byB0aGUgTENEIDMuM1YgcmFpbCwgd2hpY2ggaXMgcG93ZXJlZCBkb3duIGR1cmluZyBzdXNwZW5kLgorCSAqIFRvIGFsbG93IHRoaXMgYnV0dG9uIHRvIHdha2UgdXAgdGhlIG9tYXAsIHdvcmsgYXJvdW5kIHRoaXMKKwkgKiBIVyBidWcgYnkgcmV3aXJpbmcgU1cxIHRvIHVzZSB0aGUgbWFpbiAzLjNWIHJhaWwuCisJICovCiAJb21hcF9jZmdfcmVnKE4xNV8xNjEwX01QVUlPMik7CiAJaWYgKGdwaW9fcmVxdWVzdChPTUFQX01QVUlPKDIpLCAid2FrZXVwIikgPT0gMCkgewogCQlpbnQgcmV0ID0gMDsKKwkJaW50IGlycSA9IGdwaW9fdG9faXJxKE9NQVBfTVBVSU8oMikpOwogCiAJCWdwaW9fZGlyZWN0aW9uX2lucHV0KE9NQVBfTVBVSU8oMikpOwotCQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUShPTUFQX01QVUlPKDIpKSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCQlzZXRfaXJxX3R5cGUoaXJxLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CiAjaWZkZWYJQ09ORklHX1BNCiAJCS8qIHNoYXJlIHRoZSBJUlEgaW4gY2FzZSBzb21lb25lIHdhbnRzIHRvIHVzZSB0aGUKIAkJICogYnV0dG9uIGZvciBtb3JlIHRoYW4gd2FrZXVwIGZyb20gc3lzdGVtIHNsZWVwLgogCQkgKi8KLQkJcmV0ID0gcmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShPTUFQX01QVUlPKDIpKSwKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLAogCQkJCSZvc2tfbWlzdHJhbF93YWtlX2ludGVycnVwdCwKIAkJCQlJUlFGX1NIQVJFRCwgIm1pc3RyYWxfd2FrZXVwIiwKIAkJCQkmb3NrX21pc3RyYWxfd2FrZV9pbnRlcnJ1cHQpOwpAQCAtNTA4LDcgKzUzMiw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIk9TSytNaXN0cmFsOiBubyB3YWtldXAgaXJxLCAlZD9cbiIsCiAJCQkJcmV0KTsKIAkJfSBlbHNlCi0JCQllbmFibGVfaXJxX3dha2UoT01BUF9HUElPX0lSUShPTUFQX01QVUlPKDIpKSk7CisJCQllbmFibGVfaXJxX3dha2UoaXJxKTsKICNlbmRpZgogCX0gZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIk9TSytNaXN0cmFsOiB3YWtldXAgYnV0dG9uIGlzIGF3b2xcbiIpOwpAQCAtNTIwLDYgKzU0NCw5IEBACiAJaWYgKGdwaW9fcmVxdWVzdCgyLCAibGNkX3B3ciIpID09IDApCiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dCgyLCAxKTsKIAorCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIG1pc3RyYWxfaTJjX2JvYXJkX2luZm8sCisJCQlBUlJBWV9TSVpFKG1pc3RyYWxfaTJjX2JvYXJkX2luZm8pKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG1pc3RyYWxfZGV2aWNlcywgQVJSQVlfU0laRShtaXN0cmFsX2RldmljZXMpKTsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYwppbmRleCBiNTgwNDM2Li43NWUzMmQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogewogCWludCBjaGFyZ2luZywgYmF0dCwgaGksIGxvLCBtaWQ7CiAKLQljaGFyZ2luZyA9ICFvbWFwX2dldF9ncGlvX2RhdGFpbihQQUxNVEVfRENfR1BJTyk7CisJY2hhcmdpbmcgPSAhZ3Bpb19nZXRfdmFsdWUoUEFMTVRFX0RDX0dQSU8pOwogCWJhdHQgPSBiYXR0ZXJ5WzBdOwogCWlmIChjaGFyZ2luZykKIAkJYmF0dCAtPSA2MDsKQEAgLTMxNiw3ICszMTYsNiBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBwYWxtdGVfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIAl7IE9NQVBfVEFHX1VTQiwJCSZwYWxtdGVfdXNiX2NvbmZpZyB9LAotCXsgT01BUF9UQUdfTU1DLAkJJnBhbG10ZV9tbWNfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19MQ0QsCQkmcGFsbXRlX2xjZF9jb25maWcgfSwKIAl7IE9NQVBfVEFHX1VBUlQsCSZwYWxtdGVfdWFydF9jb25maWcgfSwKIH07CkBAIC0zMzUsMTEgKzMzNCwxMSBAQAogewogCWlmIChzdGF0ZSkgewogCQkvKiBIZWFkcGhvbmVzIGNvbm5lY3RlZCwgZGlzYWJsZSBzcGVha2VyICovCi0JCW9tYXBfc2V0X2dwaW9fZGF0YW91dChQQUxNVEVfU1BFQUtFUl9HUElPLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUEFMTVRFX1NQRUFLRVJfR1BJTywgMCk7CiAJCXByaW50ayhLRVJOX0lORk8gIlBNOiBzcGVha2VyIG9mZlxuIik7CiAJfSBlbHNlIHsKIAkJLyogSGVhZHBob25lcyB1bnBsdWdnZWQsIHJlLWVuYWJsZSBzcGVha2VyICovCi0JCW9tYXBfc2V0X2dwaW9fZGF0YW91dChQQUxNVEVfU1BFQUtFUl9HUElPLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUEFMTVRFX1NQRUFLRVJfR1BJTywgMSk7CiAJCXByaW50ayhLRVJOX0lORk8gIlBNOiBzcGVha2VyIG9uXG4iKTsKIAl9CiB9CkBAIC0zNDcsMTggKzM0NiwxOCBAQAogc3RhdGljIHZvaWQgX19pbml0IHBhbG10ZV9taXNjX2dwaW9fc2V0dXAodm9pZCkKIHsKIAkvKiBTZXQgVFNDMjEwMiBQSU5UREFWIHBpbiBhcyBpbnB1dCAodXNlZCBieSBUU0MyMTAyIGRyaXZlcikgKi8KLQlpZiAob21hcF9yZXF1ZXN0X2dwaW8oUEFMTVRFX1BJTlREQVZfR1BJTykpIHsKKwlpZiAoZ3Bpb19yZXF1ZXN0KFBBTE1URV9QSU5UREFWX0dQSU8sICJUU0MyMTAyIFBJTlREQVYiKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVzZXJ2ZSBQSU5UREFWIEdQSU8hXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihQQUxNVEVfUElOVERBVl9HUElPLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChQQUxNVEVfUElOVERBVl9HUElPKTsKIAogCS8qIFNldCBVU0Itb3ItREMtSU4gcGluIGFzIGlucHV0ICh1bnVzZWQpICovCi0JaWYgKG9tYXBfcmVxdWVzdF9ncGlvKFBBTE1URV9VU0JfT1JfRENfR1BJTykpIHsKKwlpZiAoZ3Bpb19yZXF1ZXN0KFBBTE1URV9VU0JfT1JfRENfR1BJTywgIlVTQi9EQy1JTiIpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZXNlcnZlIGNhYmxlIHNpZ25hbCBHUElPIVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oUEFMTVRFX1VTQl9PUl9EQ19HUElPLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChQQUxNVEVfVVNCX09SX0RDX0dQSU8pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wYWxtdGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKaW5kZXggNDBmOTg2MC4uNWMwMDFhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogc3RhdGljIGludCBwYWxtdHRfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKIHsKLQlyZXR1cm4gIW9tYXBfZ2V0X2dwaW9fZGF0YWluKDYpOworCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoNik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIHBhbG10dF90c19pbmZvID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwppbmRleCBlNzE5Mjk0Li5jYzA1MjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiBzdGF0aWMgaW50CiBwYWxtejcxX2dldF9wZW5kb3duX3N0YXRlKHZvaWQpCiB7Ci0JcmV0dXJuICFvbWFwX2dldF9ncGlvX2RhdGFpbihQQUxNWjcxX1BFTklSUV9HUElPKTsKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKFBBTE1aNzFfUEVOSVJRX0dQSU8pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSBwYWxtejcxX3RzX2luZm8gPSB7CkBAIC0yNjcsMTYgKzI2Nyw2IEBACiAJLnBpbnNbMF0JPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgcGFsbXo3MV9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLm1tY1swXSA9IHsKLQkJLmVuYWJsZWQJPSAxLAotCQkud2lyZTQJCT0gMCwKLQkJLndwX3BpbgkJPSBQQUxNWjcxX01NQ19XUF9HUElPLAotCQkucG93ZXJfcGluCT0gLTEsCi0JCS5zd2l0Y2hfcGluCT0gUEFMTVo3MV9NTUNfSU5fR1BJTywKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgcGFsbXo3MV9sY2RfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLmN0cmxfbmFtZSA9ICJpbnRlcm5hbCIsCiB9OwpAQCAtMjg3LDcgKzI3Nyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHBhbG16NzFfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIAl7T01BUF9UQUdfVVNCLAkmcGFsbXo3MV91c2JfY29uZmlnfSwKLQl7T01BUF9UQUdfTU1DLAkmcGFsbXo3MV9tbWNfY29uZmlnfSwKIAl7T01BUF9UQUdfTENELAkmcGFsbXo3MV9sY2RfY29uZmlnfSwKIAl7T01BUF9UQUdfVUFSVCwJJnBhbG16NzFfdWFydF9jb25maWd9LAogfTsKQEAgLTI5NSwxMyArMjg0LDEzIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QKIHBhbG16NzFfcG93ZXJjYWJsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JaWYgKG9tYXBfZ2V0X2dwaW9fZGF0YWluKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pKSB7CisJaWYgKGdwaW9fZ2V0X3ZhbHVlKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlBNOiBQb3dlciBjYWJsZSBjb25uZWN0ZWRcbiIpOwotCQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUShQQUxNWjcxX1VTQkRFVEVDVF9HUElPKSwKKwkJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pLAogCQkJCUlSUV9UWVBFX0VER0VfRkFMTElORyk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUE06IFBvd2VyIGNhYmxlIGRpc2Nvbm5lY3RlZFxuIik7Ci0JCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pLAorCQlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoUEFMTVo3MV9VU0JERVRFQ1RfR1BJTyksCiAJCQkJSVJRX1RZUEVfRURHRV9SSVNJTkcpOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0zMjMsMjkgKzMxMiwyOCBAQAogewogCWlmIChlYXJseSkgewogCQkvKiBPbmx5IHNldCBHUElPMSBzbyB3ZSBoYXZlIGEgd29ya2luZyBzZXJpYWwgKi8KLQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDEsIDEpOwotCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxLCAwKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDEsIDEpOwogCX0gZWxzZSB7CiAJCS8qIFNldCBNTUMvU0QgaG9zdCBXUCBwaW4gYXMgaW5wdXQgKi8KLQkJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKFBBTE1aNzFfTU1DX1dQX0dQSU8pKSB7CisJCWlmIChncGlvX3JlcXVlc3QoUEFMTVo3MV9NTUNfV1BfR1BJTywgIk1NQyBXUCIpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVzZXJ2ZSBXUCBHUElPIVxuIik7CiAJCQlyZXR1cm47CiAJCX0KLQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oUEFMTVo3MV9NTUNfV1BfR1BJTywgMSk7CisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KFBBTE1aNzFfTU1DX1dQX0dQSU8pOwogCiAJCS8qIE1vbml0b3IgdGhlIFBvd2VyLWNhYmxlLWNvbm5lY3RlZCBzaWduYWwgKi8KLQkJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pKSB7CisJCWlmIChncGlvX3JlcXVlc3QoUEFMTVo3MV9VU0JERVRFQ1RfR1BJTywgIlVTQiBkZXRlY3QiKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJDb3VsZCBub3QgcmVzZXJ2ZSBjYWJsZSBzaWduYWwgR1BJTyFcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKFBBTE1aNzFfVVNCREVURUNUX0dQSU8sIDEpOwotCQlpZiAocmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShQQUxNWjcxX1VTQkRFVEVDVF9HUElPKSwKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoUEFMTVo3MV9VU0JERVRFQ1RfR1BJTyk7CisJCWlmIChyZXF1ZXN0X2lycShncGlvX3RvX2lycShQQUxNWjcxX1VTQkRFVEVDVF9HUElPKSwKIAkJCQlwYWxtejcxX3Bvd2VyY2FibGUsIElSUUZfU0FNUExFX1JBTkRPTSwKIAkJCQkicGFsbXo3MS1jYWJsZSIsIDApKQogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJCSJJUlEgcmVxdWVzdCBmb3IgcG93ZXIgY2FibGUgZmFpbGVkIVxuIik7Ci0JCXBhbG16NzFfcG93ZXJjYWJsZShPTUFQX0dQSU9fSVJRKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pLCAwKTsKKwkJcGFsbXo3MV9wb3dlcmNhYmxlKGdwaW9fdG9faXJxKFBBTE1aNzFfVVNCREVURUNUX0dQSU8pLCAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwppbmRleCBiNzE1OTE3Li4zYjlmOTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogc3RhdGljIGludCBuYW5kX2Rldl9yZWFkeShzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7Ci0JcmV0dXJuIG9tYXBfZ2V0X2dwaW9fZGF0YWluKFAyX05BTkRfUkJfR1BJT19QSU4pOworCXJldHVybiBncGlvX2dldF92YWx1ZShQMl9OQU5EX1JCX0dQSU9fUElOKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHBlcnNldXMyX3VhcnRfY29uZmlnIF9faW5pdGRhdGEgPSB7CkBAIC0yMjMsOCArMjIzLDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfaW5pdCh2b2lkKQogewotCWlmICghKG9tYXBfcmVxdWVzdF9ncGlvKFAyX05BTkRfUkJfR1BJT19QSU4pKSkKLQkJbmFuZF9kYXRhLmRldl9yZWFkeSA9IG5hbmRfZGV2X3JlYWR5OworCWlmIChncGlvX3JlcXVlc3QoUDJfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCisJCUJVRygpOworCW5hbmRfZGF0YS5kZXZfcmVhZHkgPSBuYW5kX2Rldl9yZWFkeTsKIAogCW9tYXBfY2ZnX3JlZyhMM18xNjEwX0ZMQVNIX0NTMkJfT0UpOwogCW9tYXBfY2ZnX3JlZyhNOF8xNjEwX0ZMQVNIX0NTMkJfV0UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEtbW1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYwppbmRleCAwYmU0ZWJhLi42NmE0ZDdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYwpAQCAtMTIsMzAgKzEyLDIwIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAotI2lmZGVmIENPTkZJR19NTUNfT01BUAotc3RhdGljIGludCBzbG90X2NvdmVyX29wZW47Ci1zdGF0aWMgc3RydWN0IGRldmljZSAqbW1jX2RldmljZTsKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKQogCi1zdGF0aWMgaW50IHN4MV9tbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKK3N0YXRpYyBpbnQgbW1jX3NldF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90LCBpbnQgcG93ZXJfb24sCiAJCQkJaW50IHZkZCkKIHsKIAlpbnQgZXJyOwogCXU4IGRhdCA9IDA7CiAKLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JZGV2X2RiZyhkZXYsICJTZXQgc2xvdCAlZCBwb3dlcjogJXMgKHZkZCAlZClcbiIsIHNsb3QgKyAxLAotCQlwb3dlcl9vbiA/ICJvbiIgOiAib2ZmIiwgdmRkKTsKLSNlbmRpZgotCi0JaWYgKHNsb3QgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIk5vIHN1Y2ggc2xvdCAlZFxuIiwgc2xvdCArIDEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAllcnIgPSBzeDFfaTJjX3JlYWRfYnl0ZShTT0ZJQV9JMkNfQUREUiwgU09GSUFfUE9XRVIxX1JFRywgJmRhdCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC00OCw2OCArMzgsMjMgQEAKIAlyZXR1cm4gc3gxX2kyY193cml0ZV9ieXRlKFNPRklBX0kyQ19BRERSLCBTT0ZJQV9QT1dFUjFfUkVHLCBkYXQpOwogfQogCi1zdGF0aWMgaW50IHN4MV9tbWNfc2V0X2J1c19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBidXNfbW9kZSkKLXsKLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JZGV2X2RiZyhkZXYsICJTZXQgc2xvdCAlZCBidXNfbW9kZSAlc1xuIiwgc2xvdCArIDEsCi0JCWJ1c19tb2RlID09IE1NQ19CVVNNT0RFX09QRU5EUkFJTiA/ICJvcGVuLWRyYWluIiA6ICJwdXNoLXB1bGwiKTsKLSNlbmRpZgotCWlmIChzbG90ICE9IDApIHsKLQkJZGV2X2VycihkZXYsICJObyBzdWNoIHNsb3QgJWRcbiIsIHNsb3QgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3gxX21tY19nZXRfY292ZXJfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCkKLXsKLQlCVUdfT04oc2xvdCAhPSAwKTsKLQotCXJldHVybiBzbG90X2NvdmVyX29wZW47Ci19Ci0KLXZvaWQgc3gxX21tY19zbG90X2NvdmVyX2hhbmRsZXIodm9pZCAqYXJnLCBpbnQgc3RhdGUpCi17Ci0JaWYgKG1tY19kZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc2xvdF9jb3Zlcl9vcGVuID0gc3RhdGU7Ci0Jb21hcF9tbWNfbm90aWZ5X2NvdmVyX2V2ZW50KG1tY19kZXZpY2UsIDAsIHN0YXRlKTsKLX0KLQotc3RhdGljIGludCBzeDFfbW1jX2xhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltbWNfZGV2aWNlID0gZGV2OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc3gxX21tY19jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLX0KLQotc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhIHN4MV9tbWNfZGF0YSA9IHsKKy8qIENvdmVyIHN3aXRjaCBpcyBhdCBPTUFQX01QVUlPKDMpICovCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgbW1jMV9kYXRhID0gewogCS5ucl9zbG90cyAgICAgICAgICAgICAgICAgICAgICAgPSAxLAotCS5zd2l0Y2hfc2xvdCAgICAgICAgICAgICAgICAgICAgPSBOVUxMLAotCS5pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzeDFfbW1jX2xhdGVfaW5pdCwKLQkuY2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgID0gc3gxX21tY19jbGVhbnVwLAogCS5zbG90c1swXSAgICAgICA9IHsKLQkJLnNldF9wb3dlciAgICAgICAgICAgICAgPSBzeDFfbW1jX3NldF9wb3dlciwKLQkJLnNldF9idXNfbW9kZSAgICAgICAgICAgPSBzeDFfbW1jX3NldF9idXNfbW9kZSwKLQkJLmdldF9ybyAgICAgICAgICAgICAgICAgPSBOVUxMLAotCQkuZ2V0X2NvdmVyX3N0YXRlICAgICAgICA9IHN4MV9tbWNfZ2V0X2NvdmVyX3N0YXRlLAorCQkuc2V0X3Bvd2VyICAgICAgICAgICAgICA9IG1tY19zZXRfcG93ZXIsCiAJCS5vY3JfbWFzayAgICAgICAgICAgICAgID0gTU1DX1ZERF8yOF8yOSB8IE1NQ19WRERfMzBfMzEgfAogCQkJCQkgIE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LAogCQkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJtbWNibGsiLAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tY19kYXRhW09NQVAxNVhYX05SX01NQ107CisKIHZvaWQgX19pbml0IHN4MV9tbWNfaW5pdCh2b2lkKQogewotCW9tYXBfc2V0X21tY19pbmZvKDEsICZzeDFfbW1jX2RhdGEpOworCW1tY19kYXRhWzBdID0gJm1tYzFfZGF0YTsKKwlvbWFwMV9pbml0X21tYyhtbWNfZGF0YSwgT01BUDE1WFhfTlJfTU1DKTsKIH0KIAogI2Vsc2UKQEAgLTExOCw3ICs2Myw0IEBACiB7CiB9CiAKLXZvaWQgc3gxX21tY19zbG90X2NvdmVyX2hhbmRsZXIodm9pZCAqYXJnLCBpbnQgc3RhdGUpCi17Ci19CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCmluZGV4IDEzMGJjYzYuLjgxNzFmZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYwpAQCAtMzc4LDE1ICszNzgsNiBAQAogCS5waW5zWzJdCT0gMCwKIH07CiAKLS8qLS0tLS0tLS0tLS0gTU1DIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyBzeDFfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5tbWMgWzBdID0gewotCQkuZW5hYmxlZAk9IDEsCi0JCS53aXJlNAkJPSAwLAotCX0sCi19OwotCiAvKi0tLS0tLS0tLS0tIExDRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3gxX2xjZF9kZXZpY2UgPSB7CkBAIC00MTQsNyArNDA1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgc3gxX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiAJeyBPTUFQX1RBR19VU0IsCSZzeDFfdXNiX2NvbmZpZyB9LAotCXsgT01BUF9UQUdfTU1DLAkmc3gxX21tY19jb25maWcgfSwKIAl7IE9NQVBfVEFHX0xDRCwJJnN4MV9sY2RfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19VQVJULAkmc3gxX3VhcnRfY29uZmlnIH0sCiB9OwpAQCAtNDM2LDE0ICs0MjYsOSBAQAogCW9tYXBfcmVxdWVzdF9ncGlvKDEpOwkvKiBBX0lSREFfT0ZGICovCiAJb21hcF9yZXF1ZXN0X2dwaW8oMTEpOwkvKiBBX1NXSVRDSCAqLwogCW9tYXBfcmVxdWVzdF9ncGlvKDE1KTsJLyogQV9VU0JfT04gKi8KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxLCAwKTsvKiBncGlvMSAtPiBvdXRwdXQgKi8KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxMSwgMCk7LyogZ3BpbzExIC0+IG91dHB1dCAqLwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDE1LCAwKTsvKiBncGlvMTUgLT4gb3V0cHV0ICovCi0JLyogc2V0IEdQSU8gZGF0YSAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxLCAxKTsvKkFfSVJEQV9PRkYgPSAxICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDExLCAwKTsvKkFfU1dJVENIID0gMCAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNSwgMCk7LypBX1VTQl9PTiA9IDAgKi8KLQorCWdwaW9fZGlyZWN0aW9uX291dHB1dCgxLCAxKTsJLypBX0lSREFfT0ZGID0gMSAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dCgxMSwgMCk7CS8qQV9TV0lUQ0ggPSAwICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDE1LCAwKTsJLypBX1VTQl9PTiA9IDAgKi8KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zeDFfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCmluZGV4IDQ1YTAxMzEuLmMyMjRmM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC0xNDAsMjEgKzE0MSwxMiBAQAogCS5waW5zWzJdCT0gNiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIHZvaWNlYmx1ZV9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLm1tY1swXSA9IHsKLQkJLmVuYWJsZWQJPSAxLAotCQkucG93ZXJfcGluCT0gMiwKLQkJLnN3aXRjaF9waW4JPSAtMSwKLQl9LAotfTsKLQogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHZvaWNlYmx1ZV91YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0gewogCS5lbmFibGVkX3VhcnRzID0gKCgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCB2b2ljZWJsdWVfY29uZmlnW10gPSB7CiAJeyBPTUFQX1RBR19VU0IsICAmdm9pY2VibHVlX3VzYl9jb25maWcgfSwKLQl7IE9NQVBfVEFHX01NQywgICZ2b2ljZWJsdWVfbW1jX2NvbmZpZyB9LAogCXsgT01BUF9UQUdfVUFSVCwgJnZvaWNlYmx1ZV91YXJ0X2NvbmZpZyB9LAogfTsKIApAQCAtMTY4LDI5ICsxNjAsMjcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdCh2b2lkKQogewogCS8qIFdhdGNoZG9nICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oMCk7CisJZ3Bpb19yZXF1ZXN0KDAsICJXYXRjaGRvZyIpOwogCS8qIHNtYzkxeCByZXNldCAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDcpOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDcsIDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAxKTsKKwlncGlvX3JlcXVlc3QoNywgIlNNQzkxeCByZXNldCIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dCg3LCAxKTsKIAl1ZGVsYXkoMik7CS8qIHdhaXQgYXQgbGVhc3QgMTAwbnMgKi8KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoNywgMCk7CiAJbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KIAkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDgpOworCWdwaW9fcmVxdWVzdCg4LCAiU01DOTF4IGlycSIpOwogCS8qIDE2QzU1NCByZXNldCovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oNik7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNiwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDYsIDApOworCWdwaW9fcmVxdWVzdCg2LCAiMTZDNTU0IHJlc2V0Iik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDYsIDApOwogCS8qIDE2QzU1NCBpbnRlcnJ1cHQgcGlucyAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDEyKTsKLQlvbWFwX3JlcXVlc3RfZ3BpbygxMyk7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oMTQpOwotCW9tYXBfcmVxdWVzdF9ncGlvKDE1KTsKLQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxMiksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxMyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxNCksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUSgxNSksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKwlncGlvX3JlcXVlc3QoMTIsICIxNkM1NTQgaXJxIik7CisJZ3Bpb19yZXF1ZXN0KDEzLCAiMTZDNTU0IGlycSIpOworCWdwaW9fcmVxdWVzdCgxNCwgIjE2QzU1NCBpcnEiKTsKKwlncGlvX3JlcXVlc3QoMTUsICIxNkM1NTQgaXJxIik7CisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKDEyKSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycSgxMyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKwlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoMTQpLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKDE1KSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXModm9pY2VibHVlX2RldmljZXMsIEFSUkFZX1NJWkUodm9pY2VibHVlX2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHZvaWNlYmx1ZV9jb25maWc7CkBAIC0yNDQsMTkgKzIzNCwxOCBAQAogCiB2b2lkIHZvaWNlYmx1ZV93ZHRfZW5hYmxlKHZvaWQpCiB7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAxKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDAsIDApOworCWdwaW9fc2V0X3ZhbHVlKDAsIDEpOworCWdwaW9fc2V0X3ZhbHVlKDAsIDApOwogCXdkdF9ncGlvX3N0YXRlID0gMDsKIH0KIAogdm9pZCB2b2ljZWJsdWVfd2R0X2Rpc2FibGUodm9pZCkKIHsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAwKTsKLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigwLCAxKTsKKwlncGlvX3NldF92YWx1ZSgwLCAwKTsKKwlncGlvX3NldF92YWx1ZSgwLCAxKTsKKwlncGlvX3NldF92YWx1ZSgwLCAwKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dCgwKTsKIH0KIAogdm9pZCB2b2ljZWJsdWVfd2R0X3Bpbmcodm9pZCkKQEAgLTI2NSw3ICsyNTQsNyBAQAogCQlyZXR1cm47CiAKIAl3ZHRfZ3Bpb19zdGF0ZSA9ICF3ZHRfZ3Bpb19zdGF0ZTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgd2R0X2dwaW9fc3RhdGUpOworCWdwaW9fc2V0X3ZhbHVlKDAsIHdkdF9ncGlvX3N0YXRlKTsKIH0KIAogdm9pZCB2b2ljZWJsdWVfcmVzZXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaAppbmRleCA1NjM1YjUxLi5jMWRjZGYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oCkBAIC03MDUsNyArNzA1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgbW1jMV9jayA9IHsKIAkubmFtZQkJPSAibW1jX2NrIiwKLQkuaWQJCT0gMSwKIAkvKiBGdW5jdGlvbmFsIGNsb2NrIGlzIGRpcmVjdCBmcm9tIFVMUEQsIGludGVyZmFjZSBjbG9jayBpcyBBUk1QRVIgKi8KIAkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAogCS5yYXRlCQk9IDQ4MDAwMDAwLApAQCAtNzIwLDcgKzcxOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tYzJfY2sgPSB7CiAJLm5hbWUJCT0gIm1tY19jayIsCi0JLmlkCQk9IDIsCisJLmlkCQk9IDEsCiAJLyogRnVuY3Rpb25hbCBjbG9jayBpcyBkaXJlY3QgZnJvbSBVTFBELCBpbnRlcmZhY2UgY2xvY2sgaXMgQVJNUEVSICovCiAJLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKIAkucmF0ZQkJPSA0ODAwMDAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKaW5kZXggZTM4MmI0My4uNzczODJkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC05OSw2ICsxMDAsOTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbWJveCh2b2lkKSB7IH0KICNlbmRpZgogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKworc3RhdGljIGlubGluZSB2b2lkIG9tYXAxX21tY19tdXgoc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tY19jb250cm9sbGVyLAorCQkJaW50IGNvbnRyb2xsZXJfbnIpCit7CisJaWYgKGNvbnRyb2xsZXJfbnIgPT0gMCkgeworCQlvbWFwX2NmZ19yZWcoTU1DX0NNRCk7CisJCW9tYXBfY2ZnX3JlZyhNTUNfQ0xLKTsKKwkJb21hcF9jZmdfcmVnKE1NQ19EQVQwKTsKKwkJaWYgKGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCQlvbWFwX2NmZ19yZWcoTTE1XzE3MTBfTU1DX0NMS0kpOworCQkJb21hcF9jZmdfcmVnKFAxOV8xNzEwX01NQ19DTURESVIpOworCQkJb21hcF9jZmdfcmVnKFAyMF8xNzEwX01NQ19EQVRESVIwKTsKKwkJfQorCQlpZiAobW1jX2NvbnRyb2xsZXItPnNsb3RzWzBdLndpcmVzID09IDQpIHsKKwkJCW9tYXBfY2ZnX3JlZyhNTUNfREFUMSk7CisJCQkvKiBOT1RFOiBEQVQyIGNhbiBiZSBvbiBXMTAgKGhlcmUpIG9yIE0xNSAqLworCQkJaWYgKCFtbWNfY29udHJvbGxlci0+c2xvdHNbMF0ubm9tdXgpCisJCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQyKTsKKwkJCW9tYXBfY2ZnX3JlZyhNTUNfREFUMyk7CisJCX0KKwl9CisKKwkvKiBCbG9jayAyIGlzIG9uIG5ld2VyIGNoaXBzLCBhbmQgaGFzIG1hbnkgcGlub3V0IG9wdGlvbnMgKi8KKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkgJiYgY29udHJvbGxlcl9uciA9PSAxKSB7CisJCWlmICghbW1jX2NvbnRyb2xsZXItPnNsb3RzWzFdLm5vbXV4KSB7CisJCQlvbWFwX2NmZ19yZWcoWThfMTYxMF9NTUMyX0NNRCk7CisJCQlvbWFwX2NmZ19yZWcoWTEwXzE2MTBfTU1DMl9DTEspOworCQkJb21hcF9jZmdfcmVnKFIxOF8xNjEwX01NQzJfQ0xLSU4pOworCQkJb21hcF9jZmdfcmVnKFc4XzE2MTBfTU1DMl9EQVQwKTsKKwkJCWlmIChtbWNfY29udHJvbGxlci0+c2xvdHNbMV0ud2lyZXMgPT0gNCkgeworCQkJCW9tYXBfY2ZnX3JlZyhWOF8xNjEwX01NQzJfREFUMSk7CisJCQkJb21hcF9jZmdfcmVnKFcxNV8xNjEwX01NQzJfREFUMik7CisJCQkJb21hcF9jZmdfcmVnKFIxMF8xNjEwX01NQzJfREFUMyk7CisJCQl9CisKKwkJCS8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIHRoZSBsZXZlbCBzaGlmdGVyICovCisJCQlvbWFwX2NmZ19yZWcoVjlfMTYxMF9NTUMyX0NNRERJUik7CisJCQlvbWFwX2NmZ19yZWcoVjVfMTYxMF9NTUMyX0RBVERJUjApOworCQkJb21hcF9jZmdfcmVnKFcxOV8xNjEwX01NQzJfREFURElSMSk7CisJCX0KKworCQkvKiBGZWVkYmFjayBjbG9jayBtdXN0IGJlIHNldCBvbiBPTUFQLTE3MTAgTU1DMiAqLworCQlpZiAoY3B1X2lzX29tYXAxNzEwKCkpCisJCQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMSkgfCAoMSA8PCAyNCksCisJCQkJCU1PRF9DT05GX0NUUkxfMSk7CisJfQorfQorCit2b2lkIF9faW5pdCBvbWFwMV9pbml0X21tYyhzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqKm1tY19kYXRhLAorCQkJaW50IG5yX2NvbnRyb2xsZXJzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBiYXNlLCBzaXplOworCQl1bnNpZ25lZCBpbnQgaXJxID0gMDsKKworCQlpZiAoIW1tY19kYXRhW2ldKQorCQkJY29udGludWU7CisKKwkJb21hcDFfbW1jX211eChtbWNfZGF0YVtpXSwgaSk7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWJhc2UgPSBPTUFQMV9NTUMxX0JBU0U7CisJCQlpcnEgPSBJTlRfTU1DOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICghY3B1X2lzX29tYXAxNnh4KCkpCisJCQkJcmV0dXJuOworCQkJYmFzZSA9IE9NQVAxX01NQzJfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX01NQzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCXNpemUgPSBPTUFQMV9NTUNfU0laRTsKKworCQlvbWFwX21tY19hZGQoaSwgYmFzZSwgc2l6ZSwgaXJxLCBtbWNfZGF0YVtpXSk7CisJfTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1NUSSkKIAogI2RlZmluZSBPTUFQMV9TVElfQkFTRQkJMHhmZmZlYTAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwppbmRleCAwNDk5NTM4Li40ZjJiOGE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwpAQCAtMTc3LDkgKzE3Nyw5IEBACiAJICogTk9URTogRm9yIGdlbmVyYWwgR1BJTy9NUFVJTyBhY2Nlc3MgYW5kIGludGVycnVwdHMsIHBsZWFzZSBzZWUKIAkgKiBncGlvLltjaF0KIAkgKi8KLQlvbWFwX3JlcXVlc3RfZ3BpbygxMyk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTMsIDEpOwotCXNldF9pcnFfdHlwZShPTUFQX0dQSU9fSVJRKDEzKSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCWdwaW9fcmVxdWVzdCgxMywgIkZQR0EgaXJxIik7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoMTMpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycSgxMyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihPTUFQMTUxMF9JTlRfRlBHQSwgaW5ub3ZhdG9yX2ZwZ2FfSVJRX2RlbXV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCmluZGV4IDEzMDgzZDcuLjg5YmI4NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCiAjZGVmaW5lIE9NQVBfRElFX0lEXzAJCTB4ZmZmZTE4MDAKICNkZWZpbmUgT01BUF9ESUVfSURfMQkJMHhmZmZlMTgwNApAQCAtMzAsNiArMzEsOCBAQAogCXUzMgl0eXBlOwkJLyogQ3B1IGlkIGJpdHMgWzMxOjA4XSwgY3B1IGNsYXNzIGJpdHMgWzA3OjAwXSAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBvbWFwX3JldmlzaW9uOworCiAvKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJeyAuanRhZ19pZCA9IDB4YjU3NCwgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMxMDMxNSwgLnR5cGUgPSAweDAzMTAwMDAwfSwKQEAgLTUzLDYgKzU2LDEyIEBACiAJeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDIsIC5vbWFwX2lkID0gMHgwMzMzMDEwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKIH07CiAKK3Vuc2lnbmVkIGludCBvbWFwX3Jldih2b2lkKQoreworCXJldHVybiBvbWFwX3JldmlzaW9uOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3Jldik7CisKIC8qCiAgKiBHZXQgT01BUCB0eXBlIGZyb20gUFJPRF9JRC4KICAqIDE3MTAgaGFzIHRoZSBQUk9EX0lEIGluIGJpdHMgMTU6MDAsIG5vdCBpbiAxNjowMSBhcyBkb2N1bWVudGVkIGluIFRSTS4KQEAgLTEyMSwxNyArMTMwLDE4IEBACiAJb21hcF9pZCA9IG9tYXBfcmVhZGwoT01BUDMyX0lEXzApOwogCiAjaWZkZWYgREVCVUcKLQlwcmludGsoIk9NQVBfRElFX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQX0RJRV9JRF8xOiAweCUwOHggRElFX1JFVjogJWlcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgIk9NQVBfRElFX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIk9NQVBfRElFX0lEXzE6IDB4JTA4eCBESUVfUkVWOiAlaVxuIiwKIAkJb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSwKIAkgICAgICAgKG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSkgPj4gMTcpICYgMHhmKTsKLQlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzApKTsKLQlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8xOiAweCUwOHggSlRBR19JRDogMHglMDR4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJPTUFQX1BST0RVQ1RJT05fSURfMDogMHglMDh4XG4iLAorCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8wKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIk9NQVBfUFJPRFVDVElPTl9JRF8xOiAweCUwOHggSlRBR19JRDogMHglMDR4XG4iLAogCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSwKIAkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSkgJiAweGZmZmYpOwotCXByaW50aygiT01BUDMyX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMCkpOwotCXByaW50aygiT01BUDMyX0lEXzE6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMSkpOwotCXByaW50aygiSlRBR19JRDogMHglMDR4IERJRV9SRVY6ICVpXG4iLCBqdGFnX2lkLCBkaWVfcmV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiT01BUDMyX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMCkpOworCXByaW50ayhLRVJOX0RFQlVHICJPTUFQMzJfSURfMTogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVAzMl9JRF8xKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkpUQUdfSUQ6IDB4JTA0eCBESUVfUkVWOiAlaVxuIiwganRhZ19pZCwgZGllX3Jldik7CiAjZW5kaWYKIAogCXN5c3RlbV9zZXJpYWxfaGlnaCA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMCk7CkBAIC0xNDAsNyArMTUwLDcgQEAKIAkvKiBGaXJzdCBjaGVjayBvbmx5IHRoZSBtYWpvciB2ZXJzaW9uIGluIGEgc2FmZSB3YXkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgewogCQlpZiAoanRhZ19pZCA9PSAob21hcF9pZHNbaV0uanRhZ19pZCkpIHsKLQkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJb21hcF9yZXZpc2lvbiA9IG9tYXBfaWRzW2ldLnR5cGU7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE0OCw3ICsxNTgsNyBAQAogCS8qIENoZWNrIGlmIHdlIGNhbiBmaW5kIHRoZSBkaWUgcmV2aXNpb24gKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgewogCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkICYmIGRpZV9yZXYgPT0gb21hcF9pZHNbaV0uZGllX3JldikgewotCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlvbWFwX3JldmlzaW9uID0gb21hcF9pZHNbaV0udHlwZTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTU4LDM4ICsxNjgsMzUgQEAKIAkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZAogCQkgICAgJiYgZGllX3JldiA9PSBvbWFwX2lkc1tpXS5kaWVfcmV2CiAJCSAgICAmJiBvbWFwX2lkID09IG9tYXBfaWRzW2ldLm9tYXBfaWQpIHsKLQkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJb21hcF9yZXZpc2lvbiA9IG9tYXBfaWRzW2ldLnR5cGU7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCS8qIEFkZCB0aGUgY3B1IGNsYXNzIGluZm8gKDd4eCwgMTV4eCwgMTZ4eCwgMjR4eCkgKi8KLQljcHVfdHlwZSA9IHN5c3RlbV9yZXYgPj4gMjQ7CisJY3B1X3R5cGUgPSBvbWFwX3JldmlzaW9uID4+IDI0OwogCiAJc3dpdGNoIChjcHVfdHlwZSkgewogCWNhc2UgMHgwNzoKLQkJc3lzdGVtX3JldiB8PSAweDA3OworCQlvbWFwX3JldmlzaW9uIHw9IDB4MDc7CiAJCWJyZWFrOwogCWNhc2UgMHgwMzoKIAljYXNlIDB4MTU6Ci0JCXN5c3RlbV9yZXYgfD0gMHgxNTsKKwkJb21hcF9yZXZpc2lvbiB8PSAweDE1OwogCQlicmVhazsKIAljYXNlIDB4MTY6CiAJY2FzZSAweDE3OgotCQlzeXN0ZW1fcmV2IHw9IDB4MTY7Ci0JCWJyZWFrOwotCWNhc2UgMHgyNDoKLQkJc3lzdGVtX3JldiB8PSAweDI0OworCQlvbWFwX3JldmlzaW9uIHw9IDB4MTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5rbm93biBPTUFQIGNwdSB0eXBlOiAweCUwMnhcbiIsIGNwdV90eXBlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBPTUFQIGNwdSB0eXBlOiAweCUwMnhcbiIsIGNwdV90eXBlKTsKIAl9CiAKLQlwcmludGsoIk9NQVAlMDR4Iiwgc3lzdGVtX3JldiA+PiAxNik7Ci0JaWYgKChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZikKLQkJcHJpbnRrKCIleCIsIChzeXN0ZW1fcmV2ID4+IDgpICYgMHhmZik7Ci0JcHJpbnRrKCIgcmV2aXNpb24gJWkgaGFuZGxlZCBhcyAlMDJ4eHggaWQ6ICUwOHglMDh4XG4iLAotCSAgICAgICBkaWVfcmV2LCBzeXN0ZW1fcmV2ICYgMHhmZiwgc3lzdGVtX3NlcmlhbF9sb3csCisJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCUwNHgiLCBvbWFwX3JldmlzaW9uID4+IDE2KTsKKwlpZiAoKG9tYXBfcmV2aXNpb24gPj4gOCkgJiAweGZmKQorCQlwcmludGsoS0VSTl9JTkZPICIleCIsIChvbWFwX3JldmlzaW9uID4+IDgpICYgMHhmZik7CisJcHJpbnRrKEtFUk5fSU5GTyAiIHJldmlzaW9uICVpIGhhbmRsZWQgYXMgJTAyeHh4IGlkOiAlMDh4JTA4eFxuIiwKKwkgICAgICAgZGllX3Jldiwgb21hcF9yZXZpc2lvbiAmIDB4ZmYsIHN5c3RlbV9zZXJpYWxfbG93LAogCSAgICAgICBzeXN0ZW1fc2VyaWFsX2hpZ2gpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwppbmRleCA3MWZlMmNjLi4xN2M5ZDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKQEAgLTY1LDggKzY1LDggQEAKIAkJLyogYWxsIGxlZHMgb2ZmIGR1cmluZyBzdXNwZW5kIG9yIHNodXRkb3duICovCiAKIAkJaWYgKCEgbWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkpIHsKLQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX1RJTUVSLCAwKTsKLQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDApOworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19USU1FUiwgMCk7CisJCQlncGlvX3NldF92YWx1ZShHUElPX0lETEUsIDApOwogCQl9CiAKIAkJX19yYXdfd3JpdGV3KH4wLCAmZnBnYS0+bGVkcyk7CkBAIC05NCw3ICs5NCw3IEBACiAJCWlmIChtYWNoaW5lX2lzX29tYXBfcGVyc2V1czIoKSkKIAkJCWh3X2xlZF9zdGF0ZSBePSBIMlAyX0RCR19GUEdBX1AyX0xFRF9USU1FUjsKIAkJZWxzZSB7Ci0JCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoR1BJT19USU1FUiwgbGVkX3N0YXRlICYgTEVEX1RJTUVSX09OKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fVElNRVIsIGxlZF9zdGF0ZSAmIExFRF9USU1FUl9PTik7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIApAQCAtMTA2LDcgKzEwNiw3IEBACiAJCWlmIChtYWNoaW5lX2lzX29tYXBfcGVyc2V1czIoKSkKIAkJCWh3X2xlZF9zdGF0ZSB8PSBIMlAyX0RCR19GUEdBX1AyX0xFRF9JRExFOwogCQllbHNlIHsKLQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDEpOworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19JRExFLCAxKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJaWYgKG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpKQogCQkJaHdfbGVkX3N0YXRlICY9IH5IMlAyX0RCR19GUEdBX1AyX0xFRF9JRExFOwogCQllbHNlIHsKLQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDApOworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19JRExFLCAwKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKaW5kZXggOThlNzg5Ni4uNDk5ZDdhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwpAQCAtNDQsOCArNDQsOCBAQAogCQlncmVlbiA9IDE7CiAJLyogZWxzZSBib3RoIHNpZGVzIGFyZSBkaXNhYmxlZCAqLwogCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fTEVEX0dSRUVOLCBncmVlbik7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fTEVEX1JFRCwgcmVkKTsKKwlncGlvX3NldF92YWx1ZShHUElPX0xFRF9HUkVFTiwgZ3JlZW4pOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTEVEX1JFRCwgcmVkKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCmluZGV4IDZjZGFkOTMuLjhjYmYyNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCkBAIC00NywxNCArNDcsMTQgQEAKIAkJICogdGhhdCdzIGEgZGlmZmVyZW50IGtpbmQgb2YgTEVEIChqdXN0IG9uZSBjb2xvciBhdCBhIHRpbWUpLgogCQkgKi8KIAkJb21hcF9jZmdfcmVnKFAxOF8xNjEwX0dQSU8zKTsKLQkJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDMpID09IDApCi0JCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigzLCAwKTsKKwkJaWYgKGdwaW9fcmVxdWVzdCgzLCAiTEVEIHJlZCIpID09IDApCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMywgMSk7CiAJCWVsc2UKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxFRDogY2FuJ3QgZ2V0IEdQSU8zL3JlZD9cbiIpOwogCiAJCW9tYXBfY2ZnX3JlZyhNUFVJTzQpOwotCQlpZiAob21hcF9yZXF1ZXN0X2dwaW8oT01BUF9NUFVJTyg0KSkgPT0gMCkKLQkJCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKE9NQVBfTVBVSU8oNCksIDApOworCQlpZiAoZ3Bpb19yZXF1ZXN0KE9NQVBfTVBVSU8oNCksICJMRUQgZ3JlZW4iKSA9PSAwKQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9NQVBfTVBVSU8oNCksIDEpOwogCQllbHNlCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJMRUQ6IGNhbid0IGdldCBNUFVJTzQvZ3JlZW4/XG4iKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKaW5kZXggNzcwZDI1Ni4uOTc3NGMxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYwpAQCAtMjI2LDcgKzIyNiw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBhcmcwID0gMCwgYXJnMSA9IDA7CiAKLQlwcmludGsoIlBNOiBPTUFQJXggaXMgdHJ5aW5nIHRvIGVudGVyIGRlZXAgc2xlZXAuLi5cbiIsIHN5c3RlbV9yZXYpOworCXByaW50ayhLRVJOX0lORk8gIlBNOiBPTUFQJXggaXMgdHJ5aW5nIHRvIGVudGVyIGRlZXAgc2xlZXAuLi5cbiIsCisJCW9tYXBfcmV2KCkpOwogCiAJb21hcF9zZXJpYWxfd2FrZV90cmlnZ2VyKDEpOwogCkBAIC00MjEsNyArNDIyLDggQEAKIAogCW9tYXBfc2VyaWFsX3dha2VfdHJpZ2dlcigwKTsKIAotCXByaW50aygiUE06IE9NQVAleCBpcyByZS1zdGFydGluZyBmcm9tIGRlZXAgc2xlZXAuLi5cbiIsIHN5c3RlbV9yZXYpOworCXByaW50ayhLRVJOX0lORk8gIlBNOiBPTUFQJXggaXMgcmUtc3RhcnRpbmcgZnJvbSBkZWVwIHNsZWVwLi4uXG4iLAorCQlvbWFwX3JldigpKTsKIH0KIAogI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwppbmRleCA1Mjg2OTFkNWMuLjAwMDIwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwpAQCAtMjQ0LDIyICsyNDQsMjIgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gb21hcF9yZXF1ZXN0X2dwaW8oZ3Bpb19ucik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9fbnIsICJVQVJUIHdha2UiKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZXF1ZXN0IFVBUlQgd2FrZSBHUElPOiAlaVxuIiwKIAkJICAgICAgIGdwaW9fbnIpOwogCQlyZXR1cm47CiAJfQotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGdwaW9fbnIsIDEpOwotCXJldCA9IHJlcXVlc3RfaXJxKE9NQVBfR1BJT19JUlEoZ3Bpb19uciksICZvbWFwX3NlcmlhbF93YWtlX2ludGVycnVwdCwKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvX25yKTsKKwlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShncGlvX25yKSwgJm9tYXBfc2VyaWFsX3dha2VfaW50ZXJydXB0LAogCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HLCAic2VyaWFsIHdha2V1cCIsIE5VTEwpOwogCWlmIChyZXQpIHsKLQkJb21hcF9mcmVlX2dwaW8oZ3Bpb19ucik7CisJCWdwaW9fZnJlZShncGlvX25yKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJObyBpbnRlcnJ1cHQgZm9yIFVBUlQgd2FrZSBHUElPOiAlaVxuIiwKIAkJICAgICAgIGdwaW9fbnIpOwogCQlyZXR1cm47CiAJfQotCWVuYWJsZV9pcnFfd2FrZShPTUFQX0dQSU9fSVJRKGdwaW9fbnIpKTsKKwllbmFibGVfaXJxX3dha2UoZ3Bpb190b19pcnEoZ3Bpb19ucikpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX3NlcmlhbF93YWtldXBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDQ4MzJmY2MuLjM3NTRiNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTU1LDMgKzU1LDcgQEAKIGNvbmZpZyBNQUNIX09WRVJPCiAJYm9vbCAiR3Vtc3RpeCBPdmVybyBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCitjb25maWcgTUFDSF9PTUFQM19QQU5ET1JBCisJYm9vbCAiT01BUDMgUGFuZG9yYSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCmluZGV4IGM2OTM5MjMuLmJiZDEyYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQpAQCAtMjcsOSArMjcsMTUgQEAKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfT01BUF9HRU5FUklDKQkJKz0gYm9hcmQtZ2VuZXJpYy5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQX0g0KQkJKz0gYm9hcmQtaDQubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUF8yNDMwU0RQKQkJKz0gYm9hcmQtMjQzMHNkcC5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQXzI0MzBTRFApCQkrPSBib2FyZC0yNDMwc2RwLm8gXAorCQkJCQkgICBtbWMtdHdsNDAzMC5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQX0FQT0xMT04pCQkrPSBib2FyZC1hcG9sbG9uLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVAzX0JFQUdMRSkJCSs9IGJvYXJkLW9tYXAzYmVhZ2xlLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfTERQKQkJKz0gYm9hcmQtbGRwLm8KLW9iai0kKENPTkZJR19NQUNIX09WRVJPKQkJKz0gYm9hcmQtb3Zlcm8ubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFKQkJKz0gYm9hcmQtb21hcDNiZWFnbGUubyBcCisJCQkJCSAgIG1tYy10d2w0MDMwLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfTERQKQkJKz0gYm9hcmQtbGRwLm8gXAorCQkJCQkgICBtbWMtdHdsNDAzMC5vCitvYmotJChDT05GSUdfTUFDSF9PVkVSTykJCSs9IGJvYXJkLW92ZXJvLm8gXAorCQkJCQkgICBtbWMtdHdsNDAzMC5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQM19QQU5ET1JBKQkrPSBib2FyZC1vbWFwM3BhbmRvcmEubyBcCisJCQkJCSAgIG1tYy10d2w0MDMwLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwppbmRleCAyNDY4OGVmLi44M2ZhMzcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMzUsNiArMzYsNyBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9ncG1jLmg+CiAKKyNpbmNsdWRlICJtbWMtdHdsNDAzMC5oIgogCiAjZGVmaW5lCVNEUDI0MzBfRkxBU0hfQ1MJMAogI2RlZmluZQlTRFAyNDMwX1NNQzkxWF9DUwk1CkBAIC0xNjgsMTMgKzE3MCwxMyBAQAogCXNkcDI0MzBfc21jOTF4X3Jlc291cmNlc1swXS5lbmQgPSBjc19tZW1fYmFzZSArIDB4MzBmOwogCXVkZWxheSgxMDApOwogCi0JaWYgKG9tYXBfcmVxdWVzdF9ncGlvKE9NQVAyNFhYX0VUSFJfR1BJT19JUlEpIDwgMCkgeworCWlmIChncGlvX3JlcXVlc3QoT01BUDI0WFhfRVRIUl9HUElPX0lSUSwgIlNNQzkxeCBpcnEiKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBHUElPJWQgZm9yIHNtYzkxeCBJUlFcbiIsCiAJCQlPTUFQMjRYWF9FVEhSX0dQSU9fSVJRKTsKIAkJZ3BtY19jc19mcmVlKGV0aF9jcyk7CiAJCWdvdG8gb3V0OwogCX0KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihPTUFQMjRYWF9FVEhSX0dQSU9fSVJRLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChPTUFQMjRYWF9FVEhSX0dQSU9fSVJRKTsKIAogb3V0OgogCWNsa19kaXNhYmxlKGdwbWNfZmNrKTsKQEAgLTE5NywxMiArMTk5LDU4IEBACiAJe09NQVBfVEFHX1VBUlQsICZzZHAyNDMwX3VhcnRfY29uZmlnfSwKIH07CiAKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSBzZHAyNDMwX2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gT01BUF9NQVhfR1BJT19MSU5FUywKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0dQSU9fSVJRX0JBU0UsCisJLmlycV9lbmQJPSBUV0w0MDMwX0dQSU9fSVJRX0VORCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIHNkcDI0MzBfdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAorCisJLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCisJLmdwaW8JCT0gJnNkcDI0MzBfZ3Bpb19kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHNkcDI0MzBfaTJjX2JvYXJkaW5mb1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInR3bDQwMzAiLCAweDQ4KSwKKwkJLmZsYWdzID0gSTJDX0NMSUVOVF9XQUtFLAorCQkuaXJxID0gSU5UXzI0WFhfU1lTX05JUlEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNkcDI0MzBfdHdsZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcDI0MzBfaTJjX2luaXQodm9pZCkKK3sKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgNDAwLCBOVUxMLCAwKTsKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMiwgMjYwMCwgc2RwMjQzMF9pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRShzZHAyNDMwX2kyY19ib2FyZGluZm8pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2hzbW1jX2luZm8gbW1jW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tbWMJCT0gMSwKKwkJLndpcmVzCQk9IDQsCisJCS5ncGlvX2NkCT0gLUVJTlZBTCwKKwkJLmdwaW9fd3AJPSAtRUlOVkFMLAorCQkuZXh0X2Nsb2NrCT0gMSwKKwl9LAorCXt9CS8qIFRlcm1pbmF0b3IgKi8KK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzI0MzBzZHBfaW5pdCh2b2lkKQogeworCW9tYXAyNDMwX2kyY19pbml0KCk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzZHAyNDMwX2RldmljZXMsIEFSUkFZX1NJWkUoc2RwMjQzMF9kZXZpY2VzKSk7CiAJb21hcF9ib2FyZF9jb25maWcgPSBzZHAyNDMwX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShzZHAyNDMwX2NvbmZpZyk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCXR3bDQwMzBfbW1jX2luaXQobW1jKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfMjQzMHNkcF9tYXBfaW8odm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKaW5kZXggOTg5YWQxNS4uYmYxZTVkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKQEAgLTIzNiwxMyArMjM2LDEzIEBACiAJdWRlbGF5KDEwMCk7CiAKIAlvbWFwX2NmZ19yZWcoVzRfXzI0WFhfR1BJTzc0KTsKLQlpZiAob21hcF9yZXF1ZXN0X2dwaW8oQVBPTExPTl9FVEhSX0dQSU9fSVJRKSA8IDApIHsKKwlpZiAoZ3Bpb19yZXF1ZXN0KEFQT0xMT05fRVRIUl9HUElPX0lSUSwgIlNNQzkxeCBpcnEiKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBHUElPJWQgZm9yIHNtYzkxeCBJUlFcbiIsCiAJCQlBUE9MTE9OX0VUSFJfR1BJT19JUlEpOwogCQlncG1jX2NzX2ZyZWUoQVBPTExPTl9FVEhfQ1MpOwogCQlnb3RvIG91dDsKIAl9Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oQVBPTExPTl9FVEhSX0dQSU9fSVJRLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChBUE9MTE9OX0VUSFJfR1BJT19JUlEpOwogCiBvdXQ6CiAJY2xrX2Rpc2FibGUoZ3BtY19mY2spOwpAQCAtMjYxLDE2ICsyNjEsNiBAQAogCS5lbmFibGVkX3VhcnRzID0gKDEgPDwgMCkgfCAoMCA8PCAxKSB8ICgwIDw8IDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgYXBvbGxvbl9tbWNfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLm1tYyBbMF0gPSB7Ci0JCS5lbmFibGVkIAk9IDEsCi0JCS53aXJlNAkJPSAxLAotCQkud3BfcGluCQk9IC0xLAotCQkucG93ZXJfcGluCT0gLTEsCi0JCS5zd2l0Y2hfcGluCT0gLTEsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGFwb2xsb25fdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS5yZWdpc3Rlcl9kZXYJPSAxLAogCS5obWNfbW9kZQk9IDB4MTQsCS8qIDA6ZGV2IDE6aG9zdDEgMjpkaXNhYmxlICovCkBAIC0yODQsNyArMjc0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgYXBvbGxvbl9jb25maWdbXSA9IHsKIAl7IE9NQVBfVEFHX1VBUlQsCSZhcG9sbG9uX3VhcnRfY29uZmlnIH0sCi0JeyBPTUFQX1RBR19NTUMsCQkmYXBvbGxvbl9tbWNfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19VU0IsCQkmYXBvbGxvbl91c2JfY29uZmlnIH0sCiAJeyBPTUFQX1RBR19MQ0QsCQkmYXBvbGxvbl9sY2RfY29uZmlnIH0sCiB9OwpAQCAtMzI3LDE1ICszMTYsMTUgQEAKIAkvKiBFbnRlciBTVyAtIFkxMSAqLwogCW9tYXBfY2ZnX3JlZyhZMTFfMjQyWF9HUElPMTYpOwogCW9tYXBfcmVxdWVzdF9ncGlvKFNXX0VOVEVSX0dQSU8xNik7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oU1dfRU5URVJfR1BJTzE2LCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChTV19FTlRFUl9HUElPMTYpOwogCS8qIFVwIFNXIC0gQUExMiAqLwogCW9tYXBfY2ZnX3JlZyhBQTEyXzI0MlhfR1BJTzE3KTsKIAlvbWFwX3JlcXVlc3RfZ3BpbyhTV19VUF9HUElPMTcpOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKFNXX1VQX0dQSU8xNywgMSk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoU1dfVVBfR1BJTzE3KTsKIAkvKiBEb3duIFNXIC0gQUE4ICovCiAJb21hcF9jZmdfcmVnKEFBOF8yNDJYX0dQSU81OCk7CiAJb21hcF9yZXF1ZXN0X2dwaW8oU1dfRE9XTl9HUElPNTgpOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKFNXX0RPV05fR1BJTzU4LCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChTV19ET1dOX0dQSU81OCk7CiAKIAlzZXRfaXJxX3R5cGUoT01BUF9HUElPX0lSUShTV19FTlRFUl9HUElPMTYpLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CiAJaWYgKHJlcXVlc3RfaXJxKE9NQVBfR1BJT19JUlEoU1dfRU5URVJfR1BJTzE2KSwgJmFwb2xsb25fc3dfaW50ZXJydXB0LApAQCAtMzU5LDkgKzM0OCw4IEBACiAJLyogVVNCIGRldmljZSAqLwogCS8qIERFVklDRV9TVVNQRU5EICovCiAJb21hcF9jZmdfcmVnKFAyMV8yNDJYX0dQSU8xMik7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oMTIpOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDEyLCAwKTsJCS8qIE9VVCAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxMiwgMCk7CisJZ3Bpb19yZXF1ZXN0KDEyLCAiVVNCIHN1c3BlbmQiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTIsIDApOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9hcG9sbG9uX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKaW5kZXggOWJhMDk3OC4uM2IzNGMyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1nZW5lcmljLmMKQEAgLTQxLDE5ICs0MSw4IEBACiAJLmVuYWJsZWRfdWFydHMgPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGdlbmVyaWNfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5tbWMgWzBdID0gewotCQkuZW5hYmxlZCAJPSAwLAotCQkud2lyZTQJCT0gMCwKLQkJLndwX3BpbgkJPSAtMSwKLQkJLnBvd2VyX3Bpbgk9IC0xLAotCQkuc3dpdGNoX3Bpbgk9IC0xLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBnZW5lcmljX2NvbmZpZ1tdID0gewogCXsgT01BUF9UQUdfVUFSVCwJJmdlbmVyaWNfdWFydF9jb25maWcgfSwKLQl7IE9NQVBfVEFHX01NQywJCSZnZW5lcmljX21tY19jb25maWcgfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCmluZGV4IDJmZWYyYzguLjVlOWIxNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTM3MiwzMSArMzczLDMzIEBACiAJLmVuYWJsZWRfdWFydHMgPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGg0X21tY19jb25maWcgX19pbml0ZGF0YSA9IHsKLQkubW1jIFswXSA9IHsKLQkJLmVuYWJsZWQJPSAxLAotCQkud2lyZTQJCT0gMSwKLQkJLndwX3BpbgkJPSAtMSwKLQkJLnBvd2VyX3Bpbgk9IC0xLAotCQkuc3dpdGNoX3Bpbgk9IC0xLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBoNF9sY2RfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLmN0cmxfbmFtZQk9ICJpbnRlcm5hbCIsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBoNF9jb25maWdbXSA9IHsKIAl7IE9NQVBfVEFHX1VBUlQsCSZoNF91YXJ0X2NvbmZpZyB9LAotCXsgT01BUF9UQUdfTU1DLAkJJmg0X21tY19jb25maWcgfSwKIAl7IE9NQVBfVEFHX0xDRCwJCSZoNF9sY2RfY29uZmlnIH0sCiB9OwogCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBtMjRjMDEgPSB7CisJLmJ5dGVfbGVuCT0gU1pfMUsgLyA4LAorCS5wYWdlX3NpemUJPSAxNiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBoNF9pMmNfYm9hcmRfaW5mb1tdID0gewogCXsKIAkJSTJDX0JPQVJEX0lORk8oImlzcDEzMDFfb21hcCIsIDB4MmQpLAogCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTI1KSwKIAl9LAorCXsJLyogRUVQUk9NIG9uIG1haW5ib2FyZCAqLworCQlJMkNfQk9BUkRfSU5GTygiMjRjMDEiLCAweDUyKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbTI0YzAxLAorCX0sCisJewkvKiBFRVBST00gb24gY3B1IGNhcmQgKi8KKwkJSTJDX0JPQVJEX0lORk8oIjI0YzAxIiwgMHg1NyksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm0yNGMwMSwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaDRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKaW5kZXggMWVhNTk5OC4uYWE2OTcyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzgsMTEgKzM5LDY5IEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8bWFjaC9jb250cm9sLmg+CiAKKyNpbmNsdWRlICJtbWMtdHdsNDAzMC5oIgorCisjZGVmaW5lIFNEUDM0MzBfU01DOTFYX0NTCTMKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsZHBfc21jOTExeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IE9NQVAzNFhYX0VUSFJfU1RBUlQsCisJCS5lbmQJPSBPTUFQMzRYWF9FVEhSX1NUQVJUICsgU1pfNEssCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAwLAorCQkuZW5kCT0gMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGRwX3NtYzkxMXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MTF4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGxkcF9zbWM5MTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbGRwX3NtYzkxMXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmxkcF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbGRwX3NtYzkxMXhfZGV2aWNlLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBsZHBfaW5pdF9zbWM5MTF4KHZvaWQpCit7CisJaW50IGV0aF9jczsKKwl1bnNpZ25lZCBsb25nIGNzX21lbV9iYXNlOworCWludCBldGhfZ3BpbyA9IDA7CisKKwlldGhfY3MgPSBMRFBfU01DOTExWF9DUzsKKworCWlmIChncG1jX2NzX3JlcXVlc3QoZXRoX2NzLCBTWl8xNk0sICZjc19tZW1fYmFzZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgR1BNQyBtZW0gZm9yIHNtYzkxMXhcbiIpOworCQlyZXR1cm47CisJfQorCisJbGRwX3NtYzkxMXhfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gY3NfbWVtX2Jhc2UgKyAweDA7CisJbGRwX3NtYzkxMXhfcmVzb3VyY2VzWzBdLmVuZCAgID0gY3NfbWVtX2Jhc2UgKyAweGY7CisJdWRlbGF5KDEwMCk7CisKKwlldGhfZ3BpbyA9IExEUF9TTUM5MTFYX0dQSU87CisKKwlsZHBfc21jOTExeF9yZXNvdXJjZXNbMV0uc3RhcnQgPSBPTUFQX0dQSU9fSVJRKGV0aF9ncGlvKTsKKworCWlmIChvbWFwX3JlcXVlc3RfZ3BpbyhldGhfZ3BpbykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgR1BJTyVkIGZvciBzbWM5MTF4IElSUVxuIiwKKwkJCQlldGhfZ3Bpbyk7CisJCXJldHVybjsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZXRoX2dwaW8pOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfaW5pdF9pcnEodm9pZCkKIHsKIAlvbWFwMl9pbml0X2NvbW1vbl9odygpOwogCW9tYXBfaW5pdF9pcnEoKTsKIAlvbWFwX2dwaW9faW5pdCgpOworCWxkcF9pbml0X3NtYzkxMXgoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGxkcF91YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0gewpAQCAtNTMsMjAgKzExMiw1NiBAQAogCXsgT01BUF9UQUdfVUFSVCwJJmxkcF91YXJ0X2NvbmZpZyB9LAogfTsKIAorc3RhdGljIHN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSBsZHBfZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBPTUFQX01BWF9HUElPX0xJTkVTLAorCS5pcnFfYmFzZQk9IFRXTDQwMzBfR1BJT19JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDQwMzBfR1BJT19JUlFfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgbGRwX3R3bGRhdGEgPSB7CisJLmlycV9iYXNlCT0gVFdMNDAzMF9JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDQwMzBfSVJRX0VORCwKKworCS8qIHBsYXRmb3JtX2RhdGEgZm9yIGNoaWxkcmVuIGdvZXMgaGVyZSAqLworCS5ncGlvCQk9ICZsZHBfZ3Bpb19kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGxkcF9pMmNfYm9hcmRpbmZvW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygidHdsNDAzMCIsIDB4NDgpLAorCQkuZmxhZ3MgPSBJMkNfQ0xJRU5UX1dBS0UsCisJCS5pcnEgPSBJTlRfMzRYWF9TWVNfTklSUSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbGRwX3R3bGRhdGEsCisJfSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG9tYXBfaTJjX2luaXQodm9pZCkKIHsKLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMjYwMCwgTlVMTCwgMCk7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDI2MDAsIGxkcF9pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRShsZHBfaTJjX2JvYXJkaW5mbykpOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygyLCA0MDAsIE5VTEwsIDApOwogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfaHNtbWNfaW5mbyBtbWNbXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1tYwkJPSAxLAorCQkud2lyZXMJCT0gNCwKKwkJLmdwaW9fY2QJPSAtRUlOVkFMLAorCQkuZ3Bpb193cAk9IC1FSU5WQUwsCisJfSwKKwl7fQkvKiBUZXJtaW5hdG9yICovCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfaW5pdCh2b2lkKQogewogCW9tYXBfaTJjX2luaXQoKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhsZHBfZGV2aWNlcywgQVJSQVlfU0laRShsZHBfZGV2aWNlcykpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gbGRwX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShsZHBfY29uZmlnKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJdHdsNDAzMF9tbWNfaW5pdChtbWMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfbWFwX2lvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKaW5kZXggYmFhNzk2Ny4uOWU1YWRhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtMzgsNyArMzgsOSBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9ncG1jLmg+CiAjaW5jbHVkZSA8bWFjaC9uYW5kLmg+CisjaW5jbHVkZSA8bWFjaC9tdXguaD4KIAorI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCiAKICNkZWZpbmUgR1BNQ19DUzBfQkFTRSAgMHg2MAogI2RlZmluZSBHUE1DX0NTX1NJWkUgICAweDMwCkBAIC0xMDMsNiArMTA1LDc4IEBACiAJLmVuYWJsZWRfdWFydHMJPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvIG1tY1tdID0geworCXsKKwkJLm1tYwkJPSAxLAorCQkud2lyZXMJCT0gOCwKKwkJLmdwaW9fd3AJPSAyOSwKKwl9LAorCXt9CS8qIFRlcm1pbmF0b3IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW107CisKK3N0YXRpYyBpbnQgYmVhZ2xlX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCit7CisJLyogZ3BpbyArIDAgaXMgIm1tYzBfY2QiIChpbnB1dC9JUlEpICovCisKKwkvKiBSRVZJU0lUOiBuZWVkIGVoY2ktb21hcCBob29rcyBmb3IgZXh0ZXJuYWwgVkJVUworCSAqIHBvd2VyIHN3aXRjaCBhbmQgb3ZlcmN1cnJlbnQgZGV0ZWN0CisJICovCisKKwlncGlvX3JlcXVlc3QoZ3BpbyArIDEsICJFSENJX25PQyIpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8gKyAxKTsKKworCS8qIFRXTDQwMzBfR1BJT19NQVggKyAwID09IGxlZEEsIEVIQ0kgbkVOX1VTQl9QV1IgKG91dCwgYWN0aXZlIGxvdykgKi8KKwlncGlvX3JlcXVlc3QoZ3BpbyArIFRXTDQwMzBfR1BJT19NQVgsICJuRU5fVVNCX1BXUiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgVFdMNDAzMF9HUElPX01BWCwgMSk7CisKKwkvKiBUV0w0MDMwX0dQSU9fTUFYICsgMSA9PSBsZWRCLCBQTVVfU1RBVCAob3V0LCBhY3RpdmUgbG93IExFRCkgKi8KKwlncGlvX2xlZHNbMl0uZ3BpbyA9IGdwaW8gKyBUV0w0MDMwX0dQSU9fTUFYICsgMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhIGJlYWdsZV9ncGlvX2RhdGEgPSB7CisJLmdwaW9fYmFzZQk9IE9NQVBfTUFYX0dQSU9fTElORVMsCisJLmlycV9iYXNlCT0gVFdMNDAzMF9HUElPX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9HUElPX0lSUV9FTkQsCisJLnVzZV9sZWRzCT0gdHJ1ZSwKKwkucHVsbHVwcwk9IEJJVCgxKSwKKwkucHVsbGRvd25zCT0gQklUKDIpIHwgQklUKDYpIHwgQklUKDcpIHwgQklUKDgpIHwgQklUKDEzKQorCQkJCXwgQklUKDE1KSB8IEJJVCgxNikgfCBCSVQoMTcpLAorCS5zZXR1cAkJPSBiZWFnbGVfdHdsX2dwaW9fc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBiZWFnbGVfdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAorCisJLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCisJLmdwaW8JCT0gJmJlYWdsZV9ncGlvX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYmVhZ2xlX2kyY19ib2FyZGluZm9bXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJ0d2w0MDMwIiwgMHg0OCksCisJCS5mbGFncyA9IEkyQ19DTElFTlRfV0FLRSwKKwkJLmlycSA9IElOVF8zNFhYX1NZU19OSVJRLAorCQkucGxhdGZvcm1fZGF0YSA9ICZiZWFnbGVfdHdsZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcDNfYmVhZ2xlX2kyY19pbml0KHZvaWQpCit7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDI2MDAsIGJlYWdsZV9pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRShiZWFnbGVfaTJjX2JvYXJkaW5mbykpOworI2lmZGVmIENPTkZJR19JMkMyX09NQVBfQkVBR0xFCisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CisjZW5kaWYKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgNDAwLCBOVUxMLCAwKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2JlYWdsZV9pbml0X2lycSh2b2lkKQogewogCW9tYXAyX2luaXRfY29tbW9uX2h3KCk7CkBAIC0xMzAsNiArMjA0LDExIEBACiAJCS5kZWZhdWx0X3RyaWdnZXIJPSAibW1jMCIsCiAJCS5ncGlvCQkJPSAxNDksCiAJfSwKKwl7CisJCS5uYW1lCQkJPSAiYmVhZ2xlYm9hcmQ6OnBtdV9zdGF0IiwKKwkJLmdwaW8JCQk9IC1FSU5WQUwsCS8qIGdldHMgcmVwbGFjZWQgKi8KKwkJLmFjdGl2ZV9sb3cJCT0gdHJ1ZSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGdwaW9fbGVkX2luZm8gPSB7CkBAIC0yMTgsMTEgKzI5NywyMiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfYmVhZ2xlX2luaXQodm9pZCkKIHsKKwlvbWFwM19iZWFnbGVfaTJjX2luaXQoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvbWFwM19iZWFnbGVfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IG9tYXAzX2JlYWdsZV9jb25maWc7CiAJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX2NvbmZpZyk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCisJb21hcF9jZmdfcmVnKEFIOF8zNFhYX0dQSU8yOSk7CisJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKKwl0d2w0MDMwX21tY19pbml0KG1tYyk7CisKKwlvbWFwX2NmZ19yZWcoSjI1XzM0WFhfR1BJTzE3MCk7CisJZ3Bpb19yZXF1ZXN0KDE3MCwgIkRWSV9uUEQiKTsKKwkvKiBSRVZJU0lUIGxlYXZlIERWSSBwb3dlcmVkIGRvd24gdW50aWwgaXQncyBuZWVkZWQgLi4uICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDE3MCwgdHJ1ZSk7CisKIAlvbWFwM2JlYWdsZV9mbGFzaF9pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTk2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogYm9hcmQtb21hcDNwYW5kb3JhLmMgKFBhbmRvcmEgSGFuZGhlbGQgQ29uc29sZSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tY3NwaS5oPgorCisjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKKworI2RlZmluZSBPTUFQM19QQU5ET1JBX1RTX0dQSU8JCTk0CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvIG9tYXAzcGFuZG9yYV9tbWNbXSA9IHsKKwl7CisJCS5tbWMJCT0gMSwKKwkJLndpcmVzCQk9IDQsCisJCS5ncGlvX2NkCT0gLUVJTlZBTCwKKwkJLmdwaW9fd3AJPSAxMjYsCisJCS5leHRfY2xvY2sJPSAwLAorCX0sCisJeworCQkubW1jCQk9IDIsCisJCS53aXJlcwkJPSA0LAorCQkuZ3Bpb19jZAk9IC1FSU5WQUwsCisJCS5ncGlvX3dwCT0gMTI3LAorCQkuZXh0X2Nsb2NrCT0gMSwKKwl9LAorCXt9CS8qIFRlcm1pbmF0b3IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyBvbWFwM3BhbmRvcmFfdWFydF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuZW5hYmxlZF91YXJ0cwk9ICgxIDw8IDIpLCAvKiBVQVJUMyAqLworfTsKKworc3RhdGljIGludCBvbWFwM3BhbmRvcmFfdHdsX2dwaW9fc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3BpbykKK3sKKwkvKiBncGlvICsgezAsMX0gaXMgIm1tY3swLDF9X2NkIiAoaW5wdXQvSVJRKSAqLworCW9tYXAzcGFuZG9yYV9tbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOworCW9tYXAzcGFuZG9yYV9tbWNbMV0uZ3Bpb19jZCA9IGdwaW8gKyAxOworCXR3bDQwMzBfbW1jX2luaXQob21hcDNwYW5kb3JhX21tYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSBvbWFwM3BhbmRvcmFfZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBPTUFQX01BWF9HUElPX0xJTkVTLAorCS5pcnFfYmFzZQk9IFRXTDQwMzBfR1BJT19JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDQwMzBfR1BJT19JUlFfRU5ELAorCS5zZXR1cAkJPSBvbWFwM3BhbmRvcmFfdHdsX2dwaW9fc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgb21hcDNwYW5kb3JhX3VzYl9kYXRhID0geworCS51c2JfbW9kZQk9IFQyX1VTQl9NT0RFX1VMUEksCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBvbWFwM3BhbmRvcmFfdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAorCS5ncGlvCQk9ICZvbWFwM3BhbmRvcmFfZ3Bpb19kYXRhLAorCS51c2IJCT0gJm9tYXAzcGFuZG9yYV91c2JfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBvbWFwM3BhbmRvcmFfaTJjX2JvYXJkaW5mb1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInRwczY1OTUwIiwgMHg0OCksCisJCS5mbGFncyA9IEkyQ19DTElFTlRfV0FLRSwKKwkJLmlycSA9IElOVF8zNFhYX1NZU19OSVJRLAorCQkucGxhdGZvcm1fZGF0YSA9ICZvbWFwM3BhbmRvcmFfdHdsZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcDNwYW5kb3JhX2kyY19pbml0KHZvaWQpCit7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDI2MDAsIG9tYXAzcGFuZG9yYV9pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfaTJjX2JvYXJkaW5mbykpOworCS8qIGkyYzIgcGlucyBhcmUgbm90IGNvbm5lY3RlZCAqLworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNwYW5kb3JhX2luaXRfaXJxKHZvaWQpCit7CisJb21hcDJfaW5pdF9jb21tb25faHcoKTsKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9hZHM3ODQ2X2luaXQodm9pZCkKK3sKKwlpbnQgZ3BpbyA9IE9NQVAzX1BBTkRPUkFfVFNfR1BJTzsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJhZHM3ODQ2X3Blbl9kb3duIik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkIGZvciAiCisJCQkJImFkczc4NDYgcGVuIGRvd24gSVJRXG4iLCBncGlvKTsKKwkJcmV0dXJuOworCX0KKworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorCitzdGF0aWMgaW50IGFkczc4NDZfZ2V0X3BlbmRvd25fc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKE9NQVAzX1BBTkRPUkFfVFNfR1BJTyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIGFkczc4NDZfY29uZmlnID0geworCS54X21heAkJCT0gMHgwZmZmLAorCS55X21heAkJCT0gMHgwZmZmLAorCS54X3BsYXRlX29obXMJCT0gMTgwLAorCS5wcmVzc3VyZV9tYXgJCT0gMjU1LAorCS5kZWJvdW5jZV9tYXgJCT0gMTAsCisJLmRlYm91bmNlX3RvbAkJPSAzLAorCS5kZWJvdW5jZV9yZXAJCT0gMSwKKwkuZ2V0X3BlbmRvd25fc3RhdGUJPSBhZHM3ODQ2X2dldF9wZW5kb3duX3N0YXRlLAorCS5rZWVwX3ZyZWZfb24JCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcDJfbWNzcGlfZGV2aWNlX2NvbmZpZyBhZHM3ODQ2X21jc3BpX2NvbmZpZyA9IHsKKwkudHVyYm9fbW9kZQk9IDAsCisJLnNpbmdsZV9jaGFubmVsCT0gMSwJLyogMDogc2xhdmUsIDE6IG1hc3RlciAqLworfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBvbWFwM3BhbmRvcmFfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJLm1vZGFsaWFzCQk9ICJhZHM3ODQ2IiwKKwkJLmJ1c19udW0JCT0gMSwKKwkJLmNoaXBfc2VsZWN0CQk9IDAsCisJCS5tYXhfc3BlZWRfaHoJCT0gMTUwMDAwMCwKKwkJLmNvbnRyb2xsZXJfZGF0YQk9ICZhZHM3ODQ2X21jc3BpX2NvbmZpZywKKwkJLmlycQkJCT0gT01BUF9HUElPX0lSUShPTUFQM19QQU5ET1JBX1RTX0dQSU8pLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmYWRzNzg0Nl9jb25maWcsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDNwYW5kb3JhX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBhbmRvcmFfbGNkIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBvbWFwM3BhbmRvcmFfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgb21hcDNwYW5kb3JhX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJeyBPTUFQX1RBR19VQVJULAkmb21hcDNwYW5kb3JhX3VhcnRfY29uZmlnIH0sCisJeyBPTUFQX1RBR19MQ0QsCQkmb21hcDNwYW5kb3JhX2xjZF9jb25maWcgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwM3BhbmRvcmFfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm9tYXAzcGFuZG9yYV9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9pbml0KHZvaWQpCit7CisJb21hcDNwYW5kb3JhX2kyY19pbml0KCk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMob21hcDNwYW5kb3JhX2RldmljZXMsCisJCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9kZXZpY2VzKSk7CisJb21hcF9ib2FyZF9jb25maWcgPSBvbWFwM3BhbmRvcmFfY29uZmlnOworCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9jb25maWcpOworCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhvbWFwM3BhbmRvcmFfc3BpX2JvYXJkX2luZm8sCisJCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9zcGlfYm9hcmRfaW5mbykpOworCW9tYXAzcGFuZG9yYV9hZHM3ODQ2X2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMl9zZXRfZ2xvYmFsc18zNDN4KCk7CisJb21hcDJfbWFwX2NvbW1vbl9pbygpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVAzX1BBTkRPUkEsICJQYW5kb3JhIEhhbmRoZWxkIENvbnNvbGUiKQorCS5waHlzX2lvCT0gMHg0ODAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5tYXBfaW8JCT0gb21hcDNwYW5kb3JhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBvbWFwM3BhbmRvcmFfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXAzcGFuZG9yYV9pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKaW5kZXggZTA5YWE1OS4uODJiM2RjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgpAQCAtNDQsNiArNDUsOCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL25hbmQuaD4KIAorI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCisKICNkZWZpbmUgTkFORF9CTE9DS19TSVpFIFNaXzEyOEsKICNkZWZpbmUgR1BNQ19DUzBfQkFTRSAgMHg2MAogI2RlZmluZSBHUE1DX0NTX1NJWkUgICAweDMwCkBAIC0xMzksOCArMTQyLDMxIEBACiAJLmVuYWJsZWRfdWFydHMJPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgb3Zlcm9fZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBPTUFQX01BWF9HUElPX0xJTkVTLAorCS5pcnFfYmFzZQk9IFRXTDQwMzBfR1BJT19JUlFfQkFTRSwKKwkuaXJxX2VuZAk9IFRXTDQwMzBfR1BJT19JUlFfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgb3Zlcm9fdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAorCS5ncGlvCQk9ICZvdmVyb19ncGlvX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgb3Zlcm9faTJjX2JvYXJkaW5mb1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInR3bDQwMzAiLCAweDQ4KSwKKwkJLmZsYWdzID0gSTJDX0NMSUVOVF9XQUtFLAorCQkuaXJxID0gSU5UXzM0WFhfU1lTX05JUlEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJm92ZXJvX3R3bGRhdGEsCisJfSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG92ZXJvX2kyY19pbml0KHZvaWQpCiB7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDI2MDAsIG92ZXJvX2kyY19ib2FyZGluZm8sCisJCQlBUlJBWV9TSVpFKG92ZXJvX2kyY19ib2FyZGluZm8pKTsKIAkvKiBpMmMyIHBpbnMgYXJlIHVzZWQgZm9yIGdwaW8gKi8KIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgNDAwLCBOVUxMLCAwKTsKIAlyZXR1cm4gMDsKQEAgLTE3MSw2ICsxOTcsMjIgQEAKIAkmb3Zlcm9fbGNkX2RldmljZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvIG1tY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW1jCQk9IDEsCisJCS53aXJlcwkJPSA0LAorCQkuZ3Bpb19jZAk9IC1FSU5WQUwsCisJCS5ncGlvX3dwCT0gLUVJTlZBTCwKKwl9LAorCXsKKwkJLm1tYwkJPSAyLAorCQkud2lyZXMJCT0gNCwKKwkJLmdwaW9fY2QJPSAtRUlOVkFMLAorCQkuZ3Bpb193cAk9IC1FSU5WQUwsCisJfSwKKwl7fQkvKiBUZXJtaW5hdG9yICovCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgb3Zlcm9faW5pdCh2b2lkKQogewogCW92ZXJvX2kyY19pbml0KCk7CkBAIC0xNzgsNiArMjIwLDcgQEAKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IG92ZXJvX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShvdmVyb19jb25maWcpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwl0d2w0MDMwX21tY19pbml0KG1tYyk7CiAJb3Zlcm9fZmxhc2hfaW5pdCgpOwogCiAJaWYgKChncGlvX3JlcXVlc3QoT1ZFUk9fR1BJT19XMldfTlJFU0VULApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmgKaW5kZXggMjQyYTE5ZC4uZmY2Y2QxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oCkBAIC0yNTIyLDcgKzI1MjIsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNoczFfaWNrID0gewogCS5uYW1lCQk9ICJtbWNoc19pY2siLAotCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKIAkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKQEAgLTI1MzMsNyArMjUzMiw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMV9mY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzX2ZjayIsCi0JLmlkCQk9IDEsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAogCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLApAQCAtMjU0NCw3ICsyNTQyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMyX2ljayA9IHsKIAkubmFtZQkJPSAibW1jaHNfaWNrIiwKLQkuaWQJCT0gMiwKKwkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCiAJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCkBAIC0yNTU1LDcgKzI1NTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNoczJfZmNrID0gewogCS5uYW1lCQk9ICJtbWNoc19mY2siLAotCS5pZAkJPSAyLAorCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCkBAIC0yNTk1LDcgKzI1OTMsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNoc2RiMV9mY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzZGJfZmNrIiwKLQkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCiAJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCkBAIC0yNjA2LDcgKzI2MDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNoc2RiMl9mY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzZGJfZmNrIiwKLQkuaWQJCT0gMiwKKwkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCiAJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYwppbmRleCAwODRlMTEwLi4zMWJiNzAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQkgKiBVcGRhdGUgdGhpcyBpZiB0aGVyZSBhcmUgZnVydGhlciBjbG9jayBjaGFuZ2VzIGJldHdlZW4gRVMyCiAJCSAqIGFuZCBwcm9kdWN0aW9uIHBhcnRzCiAJCSAqLwotCQlpZiAoaXNfc2lsX3Jldl9lcXVhbF90byhPTUFQMzQzMF9SRVZfRVMxXzApKSB7CisJCWlmIChvbWFwX3JldigpID09IE9NQVAzNDMwX1JFVl9FUzFfMCkgewogCQkJLyogTm8gMzQzMEVTMS1vbmx5IHJhdGVzIGV4aXN0LCBzbyBubyBSQVRFX0lOXzM0MzBFUzEgKi8KIAkJCWNwdV9jbGtmbGcgfD0gQ0xPQ0tfSU5fT01BUDM0MzBFUzE7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguaAppbmRleCBjMzhhOGEwLi5hODI2MDk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmgKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzM19mY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzX2ZjayIsCi0JLmlkCQk9IDMsCisJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX01NQzNfU0hJRlQsCkBAIC0xMzg1LDcgKzEzODUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBtbWNoczJfZmNrID0gewogCS5uYW1lCQk9ICJtbWNoc19mY2siLAotCS5pZAkJPSAyLAorCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NTUMyX1NISUZULApAQCAtMTQwNiw3ICsxNDA2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMxX2ZjayA9IHsKIAkubmFtZQkJPSAibW1jaHNfZmNrIiwKLQkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZjb3JlXzk2bV9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMV9TSElGVCwKQEAgLTE3MjIsNyArMTcyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzM19pY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzX2ljayIsCi0JLmlkCQk9IDMsCisJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fTU1DM19TSElGVCwKQEAgLTE3NzQsNyArMTc3Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMl9pY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzX2ljayIsCi0JLmlkCQk9IDIsCisJLmlkCQk9IDEsCiAJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMl9TSElGVCwKQEAgLTE3ODUsNyArMTc4NCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMV9pY2sgPSB7CiAJLm5hbWUJCT0gIm1tY2hzX2ljayIsCi0JLmlkCQk9IDEsCiAJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMV9TSElGVCwKQEAgLTIyODAsOCArMjI3OCw4IEBACiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8xX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3BpbzFfZmNrIiwKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8xX2RiY2sgPSB7CisJLm5hbWUJCT0gImdwaW8xX2RiY2siLAogCS5wYXJlbnQJCT0gJndrdXBfMzJrX2ZjaywKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU8xX1NISUZULApAQCAtMjUyNyw4ICsyNTI1LDggQEAKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzZfZmNrID0gewotCS5uYW1lCQk9ICJncGlvNl9mY2siLAorc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzZfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzZfZGJjayIsCiAJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU82X1NISUZULApAQCAtMjUzNyw4ICsyNTM1LDggQEAKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzVfZmNrID0gewotCS5uYW1lCQk9ICJncGlvNV9mY2siLAorc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzVfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzVfZGJjayIsCiAJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU81X1NISUZULApAQCAtMjU0Nyw4ICsyNTQ1LDggQEAKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzRfZmNrID0gewotCS5uYW1lCQk9ICJncGlvNF9mY2siLAorc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzRfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzRfZGJjayIsCiAJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU80X1NISUZULApAQCAtMjU1Nyw4ICsyNTU1LDggQEAKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzNfZmNrID0gewotCS5uYW1lCQk9ICJncGlvM19mY2siLAorc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzNfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzNfZGJjayIsCiAJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU8zX1NISUZULApAQCAtMjU2Nyw4ICsyNTY1LDggQEAKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzJfZmNrID0gewotCS5uYW1lCQk9ICJncGlvMl9mY2siLAorc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzJfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzJfZGJjayIsCiAJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU8yX1NISUZULApAQCAtMzE3MCw3ICszMTY4LDcgQEAKIAkmdXNpbV9mY2ssCiAJJmdwdDFfZmNrLAogCSZ3a3VwXzMya19mY2ssCi0JJmdwaW8xX2ZjaywKKwkmZ3BpbzFfZGJjaywKIAkmd2R0Ml9mY2ssCiAJJndrdXBfbDRfaWNrLAogCSZ1c2ltX2ljaywKQEAgLTMxOTIsMTEgKzMxOTAsMTEgQEAKIAkmZ3B0OF9mY2ssCiAJJmdwdDlfZmNrLAogCSZwZXJfMzJrX2Fsd29uX2ZjaywKLQkmZ3BpbzZfZmNrLAotCSZncGlvNV9mY2ssCi0JJmdwaW80X2ZjaywKLQkmZ3BpbzNfZmNrLAotCSZncGlvMl9mY2ssCisJJmdwaW82X2RiY2ssCisJJmdwaW81X2RiY2ssCisJJmdwaW80X2RiY2ssCisJJmdwaW8zX2RiY2ssCisJJmdwaW8yX2RiY2ssCiAJJndkdDNfZmNrLAogCSZwZXJfbDRfaWNrLAogCSZncGlvNl9pY2ssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IDkwYWYyYWMuLjlkNzIxNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC0xNCwxNiArMTQsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCisjaW5jbHVkZSA8bWFjaC9jb250cm9sLmg+CiAjaW5jbHVkZSA8bWFjaC90Yy5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvZWFjLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfRFNQKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX0RTUF9NT0RVTEUpCiAjZGVmaW5lIE9NQVAyX01CT1hfQkFTRQkJSU9fQUREUkVTUyhPTUFQMjRYWF9NQUlMQk9YX0JBU0UpCkBAIC0yOTUsNiArMjk4LDE3MSBAQAogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9zaGExX21kNSh2b2lkKSB7IH0KICNlbmRpZgogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKKworI2RlZmluZSBNTUNIU19TWVNDT05GSUcJCQkweDAwMTAKKyNkZWZpbmUgTU1DSFNfU1lTQ09ORklHX1NXUkVTRVQJCSgxIDw8IDEpCisjZGVmaW5lIE1NQ0hTX1NZU1NUQVRVUwkJCTB4MDAxNAorI2RlZmluZSBNTUNIU19TWVNTVEFUVVNfUkVTRVRET05FCSgxIDw8IDApCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGR1bW15X3BkZXYgPSB7CisJLmRldiA9IHsKKwkJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwl9LAorfTsKKworLyoqCisgKiBvbWFwX2hzbW1jX3Jlc2V0KCkgLSBGdWxsIHJlc2V0IG9mIGVhY2ggSFMtTU1DIGNvbnRyb2xsZXIKKyAqCisgKiBFbnN1cmUgdGhhdCBlYWNoIE1NQyBjb250cm9sbGVyIGlzIGZ1bGx5IHJlc2V0LiAgQ29udHJvbGxlcnMKKyAqIGxlZnQgaW4gYW4gdW5rbm93biBzdGF0ZSAoYnkgYm9vdGxvYWRlcikgbWF5IHByZXZlbnQgcmV0ZW50aW9uCisgKiBvciBPRkYtbW9kZS4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgaW4gY2FzZXMgd2hlcmUgdGhlCisgKiBNTUMgZHJpdmVyIGlzIG5vdCBlbmFibGVkLCBfb3JfIGJ1aWx0IGFzIGEgbW9kdWxlLgorICoKKyAqIEluIG9yZGVyIGZvciByZXNldCB0byB3b3JrLCBpbnRlcmZhY2UsIGZ1bmN0aW9uYWwgYW5kIGRlYm91bmNlCisgKiBjbG9ja3MgbXVzdCBiZSBlbmFibGVkLiAgVGhlIGRlYm91bmNlIGNsb2NrIGNvbWVzIGZyb20gZnVuY18zMmtfY2xrCisgKiBhbmQgaXMgbm90IHVuZGVyIFNXIGNvbnRyb2wsIHNvIHdlIG9ubHkgZW5hYmxlIGktIGFuZCBmLWNsb2Nrcy4KKyAqKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2hzbW1jX3Jlc2V0KHZvaWQpCit7CisJdTMyIGksIG5yX2NvbnRyb2xsZXJzID0gY3B1X2lzX29tYXAzNHh4KCkgPyBPTUFQMzRYWF9OUl9NTUMgOgorCQlPTUFQMjRYWF9OUl9NTUM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY29udHJvbGxlcnM7IGkrKykgeworCQl1MzIgdiwgYmFzZSA9IDA7CisJCXN0cnVjdCBjbGsgKmljbGssICpmY2xrOworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZHVtbXlfcGRldi5kZXY7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWJhc2UgPSBPTUFQMl9NTUMxX0JBU0U7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYmFzZSA9IE9NQVAyX01NQzJfQkFTRTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQliYXNlID0gT01BUDNfTU1DM19CQVNFOworCQkJYnJlYWs7CisJCX0KKworCQlkdW1teV9wZGV2LmlkID0gaTsKKwkJaWNsayA9IGNsa19nZXQoZGV2LCAibW1jaHNfaWNrIik7CisJCWlmIChpY2xrICYmIGNsa19lbmFibGUoaWNsaykpCisJCQlpY2xrID0gTlVMTDsKKworCQlmY2xrID0gY2xrX2dldChkZXYsICJtbWNoc19mY2siKTsKKwkJaWYgKGZjbGsgJiYgY2xrX2VuYWJsZShmY2xrKSkKKwkJCWZjbGsgPSBOVUxMOworCisJCWlmICghaWNsayB8fCAhZmNsaykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogVW5hYmxlIHRvIGVuYWJsZSBjbG9ja3MgZm9yIE1NQyVkLCAiCisJCQkgICAgICAgImNhbm5vdCByZXNldC5cbiIsICBfX2Z1bmNfXywgaSk7CisJCQlicmVhazsKKwkJfQorCisJCW9tYXBfd3JpdGVsKE1NQ0hTX1NZU0NPTkZJR19TV1JFU0VULCBiYXNlICsgTU1DSFNfU1lTQ09ORklHKTsKKwkJdiA9IG9tYXBfcmVhZGwoYmFzZSArIE1NQ0hTX1NZU1NUQVRVUyk7CisJCXdoaWxlICghKG9tYXBfcmVhZGwoYmFzZSArIE1NQ0hTX1NZU1NUQVRVUykgJgorCQkJIE1NQ0hTX1NZU1NUQVRVU19SRVNFVERPTkUpKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKGZjbGspIHsKKwkJCWNsa19kaXNhYmxlKGZjbGspOworCQkJY2xrX3B1dChmY2xrKTsKKwkJfQorCQlpZiAoaWNsaykgeworCQkJY2xrX2Rpc2FibGUoaWNsayk7CisJCQljbGtfcHV0KGljbGspOworCQl9CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2hzbW1jX3Jlc2V0KHZvaWQpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IUykgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfSFNfTU9EVUxFKQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcDJfbW1jX211eChzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jX2NvbnRyb2xsZXIsCisJCQlpbnQgY29udHJvbGxlcl9ucikKK3sKKwlpZiAoY3B1X2lzX29tYXAyNDIwKCkgJiYgY29udHJvbGxlcl9uciA9PSAwKSB7CisJCW9tYXBfY2ZnX3JlZyhIMThfMjRYWF9NTUNfQ01EKTsKKwkJb21hcF9jZmdfcmVnKEgxNV8yNFhYX01NQ19DTEtJKTsKKwkJb21hcF9jZmdfcmVnKEcxOV8yNFhYX01NQ19DTEtPKTsKKwkJb21hcF9jZmdfcmVnKEYyMF8yNFhYX01NQ19EQVQwKTsKKwkJb21hcF9jZmdfcmVnKEYxOV8yNFhYX01NQ19EQVRfRElSMCk7CisJCW9tYXBfY2ZnX3JlZyhHMThfMjRYWF9NTUNfQ01EX0RJUik7CisJCWlmIChtbWNfY29udHJvbGxlci0+c2xvdHNbMF0ud2lyZXMgPT0gNCkgeworCQkJb21hcF9jZmdfcmVnKEgxNF8yNFhYX01NQ19EQVQxKTsKKwkJCW9tYXBfY2ZnX3JlZyhFMTlfMjRYWF9NTUNfREFUMik7CisJCQlvbWFwX2NmZ19yZWcoRDE5XzI0WFhfTU1DX0RBVDMpOworCQkJb21hcF9jZmdfcmVnKEUyMF8yNFhYX01NQ19EQVRfRElSMSk7CisJCQlvbWFwX2NmZ19yZWcoRjE4XzI0WFhfTU1DX0RBVF9ESVIyKTsKKwkJCW9tYXBfY2ZnX3JlZyhFMThfMjRYWF9NTUNfREFUX0RJUjMpOworCQl9CisKKwkJLyoKKwkJICogVXNlIGludGVybmFsIGxvb3AtYmFjayBpbiBNTUMvU0RJTyBNb2R1bGUgSW5wdXQgQ2xvY2sKKwkJICogc2VsZWN0aW9uCisJCSAqLworCQlpZiAobW1jX2NvbnRyb2xsZXItPnNsb3RzWzBdLmludGVybmFsX2Nsb2NrKSB7CisJCQl1MzIgdiA9IG9tYXBfY3RybF9yZWFkbChPTUFQMl9DT05UUk9MX0RFVkNPTkYwKTsKKwkJCXYgfD0gKDEgPDwgMjQpOworCQkJb21hcF9jdHJsX3dyaXRlbCh2LCBPTUFQMl9DT05UUk9MX0RFVkNPTkYwKTsKKwkJfQorCX0KK30KKwordm9pZCBfX2luaXQgb21hcDJfaW5pdF9tbWMoc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKiptbWNfZGF0YSwKKwkJCWludCBucl9jb250cm9sbGVycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jb250cm9sbGVyczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKKwkJdW5zaWduZWQgaW50IGlycSA9IDA7CisKKwkJaWYgKCFtbWNfZGF0YVtpXSkKKwkJCWNvbnRpbnVlOworCisJCW9tYXAyX21tY19tdXgobW1jX2RhdGFbaV0sIGkpOworCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQliYXNlID0gT01BUDJfTU1DMV9CQVNFOworCQkJaXJxID0gSU5UXzI0WFhfTU1DX0lSUTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQliYXNlID0gT01BUDJfTU1DMl9CQVNFOworCQkJaXJxID0gSU5UXzI0WFhfTU1DMl9JUlE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKKwkJCQlyZXR1cm47CisJCQliYXNlID0gT01BUDNfTU1DM19CQVNFOworCQkJaXJxID0gSU5UXzM0WFhfTU1DM19JUlE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNwdV9pc19vbWFwMjQyMCgpKQorCQkJc2l6ZSA9IE9NQVAyNDIwX01NQ19TSVpFOworCQllbHNlCisJCQlzaXplID0gSFNNTUNfU0laRTsKKworCQlvbWFwX21tY19hZGQoaSwgYmFzZSwgc2l6ZSwgaXJxLCBtbWNfZGF0YVtpXSk7CisJfTsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKICNpZiBkZWZpbmVkKENPTkZJR19IRFFfTUFTVEVSX09NQVApIHx8IGRlZmluZWQoQ09ORklHX0hEUV9NQVNURVJfT01BUF9NT0RVTEUpCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkKICNkZWZpbmUgT01BUF9IRFFfQkFTRQkweDQ4MEIyMDAwCkBAIC0zMzQsNiArNTAyLDcgQEAKIAkvKiBwbGVhc2Uga2VlcCB0aGVzZSBjYWxscywgYW5kIHRoZWlyIGltcGxlbWVudGF0aW9ucyBhYm92ZSwKIAkgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhleSdyZSBlYXNpZXIgdG8gc29ydCB0aHJvdWdoLgogCSAqLworCW9tYXBfaHNtbWNfcmVzZXQoKTsKIAlvbWFwX2luaXRfbWJveCgpOwogCW9tYXBfaW5pdF9tY3NwaSgpOwogCW9tYXBfaGRxX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYwppbmRleCBiZjQ1ZmYzLi5iMGY4ZTdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCkBAIC0yMiw0MCArMjIsMTUgQEAKICNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCi1zdGF0aWMgdTMyIGNsYXNzOwotc3RhdGljIHZvaWQgX19pb21lbSAqdGFwX2Jhc2U7Ci1zdGF0aWMgdTE2IHRhcF9wcm9kX2lkOwotCi0jZGVmaW5lIE9NQVBfVEFQX0lEQ09ERQkJMHgwMjA0Ci0jZGVmaW5lIE9NQVBfVEFQX0RJRV9JRF8wCTB4MDIxOAotI2RlZmluZSBPTUFQX1RBUF9ESUVfSURfMQkweDAyMUMKLSNkZWZpbmUgT01BUF9UQVBfRElFX0lEXzIJMHgwMjIwCi0jZGVmaW5lIE9NQVBfVEFQX0RJRV9JRF8zCTB4MDIyNAotCi0vKiBzeXN0ZW1fcmV2IGZpZWxkcyBmb3IgT01BUDIgcHJvY2Vzc29yczoKLSAqICAgQ1BVIGlkIGJpdHMgICAgIFszMToxNl0sCi0gKiAgIENQVSBkZXZpY2UgdHlwZSBbMTU6MTJdLCAodW5wcmcsbm9ybWFsLFBPUCkKLSAqICAgQ1BVIHJldmlzaW9uICAgIFsxMTowOF0KLSAqICAgQ1BVIGNsYXNzIGJpdHMgIFswNzowMF0KLSAqLwotCi1zdHJ1Y3Qgb21hcF9pZCB7Ci0JdTE2CWhhd2tleWU7CS8qIFNpbGljb24gdHlwZSAoSGF3a2V5ZSBpZCkgKi8KLQl1OAlkZXY7CQkvKiBEZXZpY2UgdHlwZSBmcm9tIHByb2R1Y3Rpb25faWQgcmVnICovCi0JdTMyCXR5cGU7CQkvKiBjb21iaW5lZCB0eXBlIGlkIGNvcGllZCB0byBzeXN0ZW1fcmV2ICovCi19OwotCi0vKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MCwgLnR5cGUgPSAweDI0MjAwMDAwIH0sCi0JeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MSwgLnR5cGUgPSAweDI0MjAxMDAwIH0sCi0JeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MiwgLnR5cGUgPSAweDI0MjAyMDAwIH0sCi0JeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4NCwgLnR5cGUgPSAweDI0MjIwMDAwIH0sCi0JeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4OCwgLnR5cGUgPSAweDI0MjMwMDAwIH0sCi0JeyAuaGF3a2V5ZSA9IDB4YjY4YSwgLmRldiA9IDB4MCwgLnR5cGUgPSAweDI0MzAwMDAwIH0sCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CitzdGF0aWMgdW5zaWduZWQgaW50IG9tYXBfcmV2aXNpb247CisKKwordW5zaWduZWQgaW50IG9tYXBfcmV2KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfcmV2aXNpb247Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfcmV2KTsKIAogLyoqCiAgKiBvbWFwX2NoaXBfaXMgLSB0ZXN0IHdoZXRoZXIgY3VycmVudGx5IHJ1bm5pbmcgT01BUCBtYXRjaGVzIGEgY2hpcCB0eXBlCkBAIC03MCwxMzUgKzQ1LDQxIEBACiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfY2hpcF9pcyk7CiAKLXN0YXRpYyB1MzIgX19pbml0IHJlYWRfdGFwX3JlZyhpbnQgcmVnKQotewotCXVuc2lnbmVkIGludCByZWd2YWwgPSAwOwotCXUzMiBjcHVpZDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQkvKiBSZWFkaW5nIHRoZSBJRENPREUgcmVnaXN0ZXIgb24gMzQzMCBFUzEgcmVzdWx0cyBpbiBhCi0JICogZGF0YSBhYm9ydCBhcyB0aGUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gdGhlIE9DUAotCSAqIEhlbmNlIHJlYWRpbmcgdGhlIENvcnRleCBSZXYKLQkgKi8KLQljcHVpZCA9IHJlYWRfY3B1aWQoQ1BVSURfSUQpOworI2RlZmluZSBPTUFQX1RBUF9JRENPREUJCTB4MDIwNAorI2RlZmluZSBPTUFQX1RBUF9ESUVfSURfMAkweDAyMTgKKyNkZWZpbmUgT01BUF9UQVBfRElFX0lEXzEJMHgwMjFDCisjZGVmaW5lIE9NQVBfVEFQX0RJRV9JRF8yCTB4MDIyMAorI2RlZmluZSBPTUFQX1RBUF9ESUVfSURfMwkweDAyMjQKIAotCS8qIElmIHRoZSBwcm9jZXNzb3IgdHlwZSBpcyBDb3J0ZXgtQTggYW5kIHRoZSByZXZpc2lvbiBpcyAweDAKLQkgKiBpdCBtZWFucyBpdHMgQ29ydGV4IHIwcDAgd2hpY2ggaXMgMzQzMCBFUzEKLQkgKi8KLQlpZiAoKCgoY3B1aWQgPj4gNCkgJiAweEZGRikgPT0gMHhDMDgpICYmICgoY3B1aWQgJiAweEYpID09IDB4MCkpIHsKKyNkZWZpbmUgcmVhZF90YXBfcmVnKHJlZykJX19yYXdfcmVhZGwodGFwX2Jhc2UgICsgKHJlZykpCiAKLQkJaWYgKHJlZyA9PSB0YXBfcHJvZF9pZCkgewotCQkJcmVndmFsID0gMHgwMDBGMDBGMDsKLQkJCWdvdG8gb3V0OwotCQl9CitzdHJ1Y3Qgb21hcF9pZCB7CisJdTE2CWhhd2tleWU7CS8qIFNpbGljb24gdHlwZSAoSGF3a2V5ZSBpZCkgKi8KKwl1OAlkZXY7CQkvKiBEZXZpY2UgdHlwZSBmcm9tIHByb2R1Y3Rpb25faWQgcmVnICovCisJdTMyCXR5cGU7CQkvKiBDb21iaW5lZCB0eXBlIGlkIGNvcGllZCB0byBvbWFwX3JldmlzaW9uICovCit9OwogCi0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgT01BUF9UQVBfSURDT0RFICA6IHJlZ3ZhbCA9IDB4MEI3QUUwMkY7IGJyZWFrOwotCQkvKiBNYWtpbmcgRGV2VHlwZSBhcyAweEYgaW4gRVMxIHRvIGRpZmZlciBmcm9tIEVTMiAqLwotCQljYXNlIE9NQVBfVEFQX0RJRV9JRF8wOiByZWd2YWwgPSAweDAxMDAwMDAwOyBicmVhazsKLQkJY2FzZSBPTUFQX1RBUF9ESUVfSURfMTogcmVndmFsID0gMHgxMDEyZDY4NzsgYnJlYWs7Ci0JCWNhc2UgT01BUF9UQVBfRElFX0lEXzI6CXJlZ3ZhbCA9IDB4MDAwMDAwMDA7IGJyZWFrOwotCQljYXNlIE9NQVBfVEFQX0RJRV9JRF8zOglyZWd2YWwgPSAweDJkMmMwMDAwOyBicmVhazsKLQkJfQotCX0gZWxzZQotCQlyZWd2YWwgPSBfX3Jhd19yZWFkbCh0YXBfYmFzZSArIHJlZyk7CisvKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MCwgLnR5cGUgPSAweDI0MjAwMDI0IH0sCisJeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MSwgLnR5cGUgPSAweDI0MjAxMDI0IH0sCisJeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4MiwgLnR5cGUgPSAweDI0MjAyMDI0IH0sCisJeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4NCwgLnR5cGUgPSAweDI0MjIwMDI0IH0sCisJeyAuaGF3a2V5ZSA9IDB4YjVkOSwgLmRldiA9IDB4OCwgLnR5cGUgPSAweDI0MjMwMDI0IH0sCisJeyAuaGF3a2V5ZSA9IDB4YjY4YSwgLmRldiA9IDB4MCwgLnR5cGUgPSAweDI0MzAwMDI0IH0sCit9OwogCi1vdXQ6Ci0JcmV0dXJuIHJlZ3ZhbDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnRhcF9iYXNlOworc3RhdGljIHUxNiB0YXBfcHJvZF9pZDsKIAotfQotCi0vKgotICogX3NldF9zeXN0ZW1fcmV2IC0gc2V0IHRoZSBzeXN0ZW1fcmV2IGdsb2JhbCBiYXNlZCBvbiBjdXJyZW50IE9NQVAgY2hpcCB0eXBlCi0gKgotICogU2V0IHRoZSBzeXN0ZW1fcmV2IGdsb2JhbC4gIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgYnkgdGhlIGNwdV9pc19vbWFweHh4eCgpCi0gKiBtYWNyb3MuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBfc2V0X3N5c3RlbV9yZXYodTMyIHR5cGUsIHU4IHJldikKLXsKLQl1MzIgaSwgY3RybF9zdGF0dXM7Ci0KLQkvKgotCSAqIHN5c3RlbV9yZXYgZW5jb2RpbmcgaXMgYXMgZm9sbG93cwotCSAqIHN5c3RlbV9yZXYgJiAweGZmMDAwMDAwIC0+IE9tYXAgQ2xhc3MgKDI0eHgvMzR4eCkKLQkgKiBzeXN0ZW1fcmV2ICYgMHhmZmYwMDAwMCAtPiBPbWFwIFN1YiBDbGFzcyAoMjQyeC8zNDN4KQotCSAqIHN5c3RlbV9yZXYgJiAweGZmZmYwMDAwIC0+IE9tYXAgdHlwZSAoMjQyMC8yNDIyLzI0MjMvMjQzMC8zNDMwKQotCSAqIHN5c3RlbV9yZXYgJiAweDAwMDBmMDAwIC0+IFNpbGljb24gcmV2aXNpb24gKEVTMSwgRVMyICkKLQkgKiBzeXN0ZW1fcmV2ICYgMHgwMDAwMDcwMCAtPiBEZXZpY2UgVHlwZSAoIEVNVS9IUy9HUC9CQUQgKQotCSAqIHN5c3RlbV9yZXYgJiAweDAwMDAwMGMwIC0+IElEQ09ERSByZXZpc2lvbls2OjddCi0JICogc3lzdGVtX3JldiAmIDB4MDAwMDAwM2YgLT4gc3lzX2Jvb3RbMDo1XQotCSAqLwotCS8qIEVtYmVkZGluZyB0aGUgRVMgcmV2aXNpb24gaW5mbyBpbiB0eXBlIGZpZWxkICovCi0Jc3lzdGVtX3JldiA9IHR5cGU7Ci0JLyogQWxzbyBhZGQgSURDT0RFIHJldmlzaW9uIGluZm8gb25seSB0d28gbG93ZXIgYml0cyAqLwotCXN5c3RlbV9yZXYgfD0gKChyZXYgJiAweDMpIDw8IDYpOwotCi0JLyogQWRkIGluIHRoZSBkZXZpY2UgdHlwZSBhbmQgc3lzX2Jvb3QgZmllbGRzIChzZWUgYWJvdmUpICovCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCWkgPSBPTUFQMjRYWF9DT05UUk9MX1NUQVRVUzsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzQzeCgpKSB7Ci0JCWkgPSBPTUFQMzQzWF9DT05UUk9MX1NUQVRVUzsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgImlkOiB1bmtub3duIENQVSB0eXBlXG4iKTsKLQkJQlVHKCk7Ci0JfQotCWN0cmxfc3RhdHVzID0gb21hcF9jdHJsX3JlYWRsKGkpOwotCXN5c3RlbV9yZXYgfD0gKGN0cmxfc3RhdHVzICYgKE9NQVAyX1NZU0JPT1RfNV9NQVNLIHwKLQkJCQkgICAgICBPTUFQMl9TWVNCT09UXzRfTUFTSyB8Ci0JCQkJICAgICAgT01BUDJfU1lTQk9PVF8zX01BU0sgfAotCQkJCSAgICAgIE9NQVAyX1NZU0JPT1RfMl9NQVNLIHwKLQkJCQkgICAgICBPTUFQMl9TWVNCT09UXzFfTUFTSyB8Ci0JCQkJICAgICAgT01BUDJfU1lTQk9PVF8wX01BU0spKTsKLQlzeXN0ZW1fcmV2IHw9IChjdHJsX3N0YXR1cyAmIE9NQVAyX0RFVklDRVRZUEVfTUFTSyk7Ci19Ci0KLQotLyoKLSAqIF9zZXRfb21hcF9jaGlwIC0gc2V0IHRoZSBvbWFwX2NoaXAgZ2xvYmFsIGJhc2VkIG9uIE9NQVAgY2hpcCB0eXBlCi0gKgotICogQnVpbGQgdGhlIG9tYXBfY2hpcCBiaXRzLiAgVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHBvd2VyZG9tYWluIGFuZAotICogY2xvY2tkb21haW4gY29kZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHN0cnVjdHVyZXMgYXJlIGFwcGxpY2FibGUgZm9yCi0gKiB0aGUgY3VycmVudCBPTUFQIGNoaXAgdHlwZSBieSBBTkRpbmcgaXQgYWdhaW5zdCBhICdwbGF0Zm9ybScgYml0ZmllbGQKLSAqIGluIHRoZSBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBfc2V0X29tYXBfY2hpcCh2b2lkKQotewotCWlmIChjcHVfaXNfb21hcDM0M3goKSkgewotCi0JCW9tYXBfY2hpcC5vYyA9IENISVBfSVNfT01BUDM0MzA7Ci0JCWlmIChpc19zaWxfcmV2X2VxdWFsX3RvKE9NQVAzNDMwX1JFVl9FUzFfMCkpCi0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTMTsKLQkJZWxzZSBpZiAoaXNfc2lsX3Jldl9ncmVhdGVyX3RoYW4oT01BUDM0MzBfUkVWX0VTMV8wKSkKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNDMwRVMyOwotCi0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0M3goKSkgewotCi0JCS8qIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDI0MzBFUzIuMSBhbmQgMjQzMC1hbGwgKi8KLQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDI0MzA7Ci0KLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjQyeCgpKSB7Ci0KLQkJLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMjQyMEVTMi4xLjEgYW5kIDI0MjAtYWxsICovCi0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAyNDIwOwotCi0JfSBlbHNlIHsKLQotCQkvKiBDdXJyZW50IENQVSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29kZS4gKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiT01BUCBjaGlwIHR5cGUgY29kZSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCAiCi0JCSAgICAgICAidGhpcyBDUFUgdHlwZS5cbiIpOwotCQlXQVJOX09OKDEpOwotCi0JfQotCi19Ci0KLXZvaWQgX19pbml0IG9tYXAyX2NoZWNrX3JldmlzaW9uKHZvaWQpCit2b2lkIF9faW5pdCBvbWFwMjR4eF9jaGVja19yZXZpc2lvbih2b2lkKQogewogCWludCBpLCBqOwotCXUzMiBpZGNvZGU7Ci0JdTMyIHByb2RfaWQ7CisJdTMyIGlkY29kZSwgcHJvZF9pZDsKIAl1MTYgaGF3a2V5ZTsKLQl1OCAgZGV2X3R5cGU7Ci0JdTggIHJldjsKKwl1OCAgZGV2X3R5cGUsIHJldjsKIAogCWlkY29kZSA9IHJlYWRfdGFwX3JlZyhPTUFQX1RBUF9JRENPREUpOwogCXByb2RfaWQgPSByZWFkX3RhcF9yZWcodGFwX3Byb2RfaWQpOwpAQCAtMjIwLDE4ICsxMDEsNiBAQAogCXByX2RlYnVnKCJPTUFQX1RBUF9QUk9EX0lEXzA6IDB4JTA4eCBERVZfVFlQRTogJWlcbiIsCiAJCSBwcm9kX2lkLCBkZXZfdHlwZSk7CiAKLQkvKgotCSAqIERldGVjdGlvbiBmb3IgMzR4eCBFUzIuMCBhbmQgYWJvdmUgY2FuIGJlIGRvbmUgd2l0aCBqdXN0Ci0JICogaGF3a2V5ZSBhbmQgcmV2LiBTZWUgVFJNIDEuNS4yIERldmljZSBJZGVudGlmaWNhdGlvbi4KLQkgKiBOb3RlIHRoYXQgcmV2IGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5IGFzIEVTMS4wIHVzZXMgdmFsdWUgMC4KLQkgKi8KLQlpZiAoaGF3a2V5ZSA9PSAweGI3YWUpIHsKLQkJc3lzdGVtX3JldiA9IDB4MzQzMDAwMDAgfCAoKDEgKyByZXYpIDw8IDEyKTsKLQkJcHJfaW5mbygiT01BUCUwNHggRVMyLiVpXG4iLCBzeXN0ZW1fcmV2ID4+IDE2LCByZXYpOwotCQlfc2V0X29tYXBfY2hpcCgpOwotCQlyZXR1cm47Ci0JfQotCiAJLyogQ2hlY2sgaGF3a2V5ZSBpZHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgewogCQlpZiAoaGF3a2V5ZSA9PSBvbWFwX2lkc1tpXS5oYXdrZXllKQpAQCAtMjU1LDIzICsxMjQsMTE1IEBACiAJCWogPSBpOwogCX0KIAotCV9zZXRfc3lzdGVtX3JldihvbWFwX2lkc1tqXS50eXBlLCByZXYpOwotCi0JX3NldF9vbWFwX2NoaXAoKTsKLQotCXByX2luZm8oIk9NQVAlMDR4Iiwgc3lzdGVtX3JldiA+PiAxNik7Ci0JaWYgKChzeXN0ZW1fcmV2ID4+IDgpICYgMHgwZikKLQkJcHJfaW5mbygiRVMleCIsIChzeXN0ZW1fcmV2ID4+IDEyKSAmIDB4Zik7CisJcHJfaW5mbygiT01BUCUwNHgiLCBvbWFwX3JldigpID4+IDE2KTsKKwlpZiAoKG9tYXBfcmV2KCkgPj4gOCkgJiAweDBmKQorCQlwcl9pbmZvKCJFUyV4IiwgKG9tYXBfcmV2KCkgPj4gMTIpICYgMHhmKTsKIAlwcl9pbmZvKCJcbiIpOwotCiB9CiAKK3ZvaWQgX19pbml0IG9tYXAzNHh4X2NoZWNrX3JldmlzaW9uKHZvaWQpCit7CisJdTMyIGNwdWlkLCBpZGNvZGU7CisJdTE2IGhhd2tleWU7CisJdTggcmV2OworCWNoYXIgKnJldl9uYW1lID0gIkVTMS4wIjsKKworCS8qCisJICogV2UgY2Fubm90IGFjY2VzcyByZXZpc2lvbiByZWdpc3RlcnMgb24gRVMxLjAuCisJICogSWYgdGhlIHByb2Nlc3NvciB0eXBlIGlzIENvcnRleC1BOCBhbmQgdGhlIHJldmlzaW9uIGlzIDB4MAorCSAqIGl0IG1lYW5zIGl0cyBDb3J0ZXggcjBwMCB3aGljaCBpcyAzNDMwIEVTMS4wLgorCSAqLworCWNwdWlkID0gcmVhZF9jcHVpZChDUFVJRF9JRCk7CisJaWYgKCgoKGNwdWlkID4+IDQpICYgMHhmZmYpID09IDB4YzA4KSAmJiAoKGNwdWlkICYgMHhmKSA9PSAweDApKSB7CisJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMxXzA7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRGV0ZWN0aW9uIGZvciAzNHh4IEVTMi4wIGFuZCBhYm92ZSBjYW4gYmUgZG9uZSB3aXRoIGp1c3QKKwkgKiBoYXdrZXllIGFuZCByZXYuIFNlZSBUUk0gMS41LjIgRGV2aWNlIElkZW50aWZpY2F0aW9uLgorCSAqIE5vdGUgdGhhdCByZXYgZG9lcyBub3QgbWFwIGRpcmVjdGx5IHRvIG91ciBkZWZpbmVkIHByb2Nlc3NvcgorCSAqIHJldmlzaW9uIG51bWJlcnMgYXMgRVMxLjAgdXNlcyB2YWx1ZSAwLgorCSAqLworCWlkY29kZSA9IHJlYWRfdGFwX3JlZyhPTUFQX1RBUF9JRENPREUpOworCWhhd2tleWUgPSAoaWRjb2RlID4+IDEyKSAmIDB4ZmZmZjsKKwlyZXYgPSAoaWRjb2RlID4+IDI4KSAmIDB4ZmY7CisKKwlpZiAoaGF3a2V5ZSA9PSAweGI3YWUpIHsKKwkJc3dpdGNoIChyZXYpIHsKKwkJY2FzZSAwOgorCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNDMwX1JFVl9FUzJfMDsKKwkJCXJldl9uYW1lID0gIkVTMi4wIjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTMl8xOworCQkJcmV2X25hbWUgPSAiRVMyLjEiOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMzXzA7CisJCQlyZXZfbmFtZSA9ICJFUzMuMCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFVzZSB0aGUgbGF0ZXN0IGtub3duIHJldmlzaW9uIGFzIGRlZmF1bHQgKi8KKwkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMzXzA7CisJCQlyZXZfbmFtZSA9ICJVbmtub3duIHJldmlzaW9uXG4iOworCQl9CisJfQorCitvdXQ6CisJcHJfaW5mbygiT01BUCUwNHggJXNcbiIsIG9tYXBfcmV2KCkgPj4gMTYsIHJldl9uYW1lKTsKK30KKworLyoKKyAqIFRyeSB0byBkZXRlY3QgdGhlIGV4YWN0IHJldmlzaW9uIG9mIHRoZSBvbWFwIHdlJ3JlIHJ1bm5pbmcgb24KKyAqLwordm9pZCBfX2luaXQgb21hcDJfY2hlY2tfcmV2aXNpb24odm9pZCkKK3sKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbiBpZGVhIGFib3V0IHRoZSBwcm9jZXNzb3IgcmV2aXNpb24gc2V0CisJICogZWFybGllciB3aXRoIG9tYXAyX3NldF9nbG9iYWxzX3RhcCgpLgorCSAqLworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJb21hcDI0eHhfY2hlY2tfcmV2aXNpb24oKTsKKwllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJb21hcDM0eHhfY2hlY2tfcmV2aXNpb24oKTsKKwllbHNlCisJCXByX2VycigiT01BUCByZXZpc2lvbiB1bmtub3duLCBwbGVhc2UgZml4IVxuIik7CisKKwkvKgorCSAqIE9LLCBub3cgd2Uga25vdyB0aGUgZXhhY3QgcmV2aXNpb24uIEluaXRpYWxpemUgb21hcF9jaGlwIGJpdHMKKwkgKiBmb3IgcG93ZXJkb3dtYWluIGFuZCBjbG9ja2RvbWFpbiBjb2RlLgorCSAqLworCWlmIChjcHVfaXNfb21hcDI0M3goKSkgeworCQkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyAyNDMwRVMyLjEgYW5kIDI0MzAtYWxsICovCisJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAyNDMwOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDJ4KCkpIHsKKwkJLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMjQyMEVTMi4xLjEgYW5kIDI0MjAtYWxsICovCisJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAyNDIwOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNDN4KCkpIHsKKwkJb21hcF9jaGlwLm9jID0gQ0hJUF9JU19PTUFQMzQzMDsKKwkJaWYgKG9tYXBfcmV2KCkgPT0gT01BUDM0MzBfUkVWX0VTMV8wKQorCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzE7CisJCWVsc2UgaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApCisJCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTMjsKKwl9IGVsc2UgeworCQlwcl9lcnIoIlVuaW5pdGlhbGl6ZWQgb21hcF9jaGlwLCBwbGVhc2UgZml4IVxuIik7CisJfQorfQorCisvKgorICogU2V0IHVwIHRoaW5ncyBmb3IgbWFwX2lvIGFuZCBwcm9jZXNzb3IgZGV0ZWN0aW9uIGxhdGVyIG9uLiBHZXRzIGNhbGxlZAorICogcHJldHR5IG11Y2ggZmlyc3QgdGhpbmcgZnJvbSBib2FyZCBpbml0LiBGb3IgbXVsdGktb21hcCwgdGhpcyBnZXRzCisgKiBjcHVfaXNfb21hcHh4eHgoKSB3b3JraW5nIGFjY3VyYXRlbHkgZW5vdWdoIGZvciBtYXBfaW8uIFRoZW4gd2UnbGwgdHJ5IHRvCisgKiBkZXRlY3QgdGhlIGV4YWN0IHJldmlzaW9uIGxhdGVyIG9uIGluIG9tYXAyX2RldGVjdF9yZXZpc2lvbigpIG9uY2UgbWFwX2lvCisgKiBpcyBkb25lLgorICovCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc190YXAoc3RydWN0IG9tYXBfZ2xvYmFscyAqb21hcDJfZ2xvYmFscykKIHsKLQljbGFzcyA9IG9tYXAyX2dsb2JhbHMtPmNsYXNzOworCW9tYXBfcmV2aXNpb24gPSBvbWFwMl9nbG9iYWxzLT5jbGFzczsKIAl0YXBfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPnRhcDsKIAotCWlmIChjbGFzcyA9PSAweDM0MzApCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQogCQl0YXBfcHJvZF9pZCA9IDB4MDIxMDsKIAllbHNlCiAJCXRhcF9wcm9kX2lkID0gMHgwMjA4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKaW5kZXggYzQwZmMzNy4uNjM2ZTI4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIElOVENfUkVWSVNJT04JCTB4MDAwMAogI2RlZmluZSBJTlRDX1NZU0NPTkZJRwkJMHgwMDEwCiAjZGVmaW5lIElOVENfU1lTU1RBVFVTCQkweDAwMTQKKyNkZWZpbmUgSU5UQ19TSVIJCTB4MDA0MAogI2RlZmluZSBJTlRDX0NPTlRST0wJCTB4MDA0OAogI2RlZmluZSBJTlRDX01JUl9DTEVBUjAJCTB4MDA4OAogI2RlZmluZSBJTlRDX01JUl9TRVQwCQkweDAwOGMKQEAgLTYwLDYgKzYxLDMwIEBACiAJcmV0dXJuIF9fcmF3X3JlYWRsKGJhbmstPmJhc2VfcmVnICsgcmVnKTsKIH0KIAorc3RhdGljIGludCBwcmV2aW91c19pcnE7CisKKy8qCisgKiBPbiAzNHh4IHdlIGNhbiBnZXQgb2NjYXNpb25hbCBzcHVyaW91cyBpbnRlcnJ1cHRzIGlmIHRoZSBhY2sgZnJvbQorICogYW4gaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBub3QgZ2V0IHBvc3RlZCBiZWZvcmUgd2UgdW5tYXNrLiBXYXJuIGFib3V0CisgKiB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIHRoYXQgbmVlZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzLgorICovCitzdGF0aWMgaW50IG9tYXBfY2hlY2tfc3B1cmlvdXModW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgc2lyLCBzcHVyaW91czsKKworCXNpciA9IGludGNfYmFua19yZWFkX3JlZygmaXJxX2JhbmtzWzBdLCBJTlRDX1NJUik7CisJc3B1cmlvdXMgPSBzaXIgPj4gNjsKKworCWlmIChzcHVyaW91cyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgaXJxICVpOiAweCUwOHgsIHBsZWFzZSBmbHVzaCAiCisJCQkJCSJwb3N0ZWQgd3JpdGUgZm9yIGlycSAlaVxuIiwKKwkJCQkJaXJxLCBzaXIsIHByZXZpb3VzX2lycSk7CisJCXJldHVybiBzcHVyaW91czsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogWFhYOiBGSVEgYW5kIGFkZGl0aW9uYWwgSU5UQyBzdXBwb3J0IChvbmx5IE1QVSBhdCB0aGUgbW9tZW50KSAqLwogc3RhdGljIHZvaWQgb21hcF9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC03MCw2ICs5NSwyMCBAQAogewogCWludCBvZmZzZXQgPSBpcnEgJiAofihJUlFfQklUU19QRVJfUkVHIC0gMSkpOwogCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWludCBzcHVyaW91cyA9IDA7CisKKwkJLyoKKwkJICogSU5UXzM0WFhfR1BUMTJfSVJRIGlzIGFsc28gdGhlIHNwdXJpb3VzIGlycS4gTWF5YmUgYmVjYXVzZQorCQkgKiBpdCBpcyB0aGUgaGlnaGVzdCBpcnEgbnVtYmVyPworCQkgKi8KKwkJaWYgKGlycSA9PSBJTlRfMzRYWF9HUFQxMl9JUlEpCisJCQlzcHVyaW91cyA9IG9tYXBfY2hlY2tfc3B1cmlvdXMoaXJxKTsKKworCQlpZiAoIXNwdXJpb3VzKQorCQkJcHJldmlvdXNfaXJxID0gaXJxOworCX0KKwogCWlycSAmPSAoSVJRX0JJVFNfUEVSX1JFRyAtIDEpOwogCiAJaW50Y19iYW5rX3dyaXRlX3JlZygxIDw8IGlycSwgJmlycV9iYW5rc1swXSwgSU5UQ19NSVJfU0VUMCArIG9mZnNldCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21tYy10d2w0MDMwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21tYy10d2w0MDMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3ZjUyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbW1jLXR3bDQwMzAuYwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvbW1jLXR3bDQwMzAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY29udHJvbC5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorCisjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX1RXTDQwMzBfQ09SRSkgJiYgXAorCShkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IUykgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfSFNfTU9EVUxFKSkKKworI2RlZmluZSBMRE9fQ0xSCQkJMHgwMAorI2RlZmluZSBWU0VMX1MyX0NMUgkJMHg0MAorCisjZGVmaW5lIFZNTUMxX0RFVl9HUlAJCTB4MjcKKyNkZWZpbmUgVk1NQzFfQ0xSCQkweDAwCisjZGVmaW5lIFZNTUMxXzMxNVYJCTB4MDMKKyNkZWZpbmUgVk1NQzFfMzAwVgkJMHgwMgorI2RlZmluZSBWTU1DMV8yODVWCQkweDAxCisjZGVmaW5lIFZNTUMxXzE4NVYJCTB4MDAKKyNkZWZpbmUgVk1NQzFfREVESUNBVEVECQkweDJBCisKKyNkZWZpbmUgVk1NQzJfREVWX0dSUAkJMHgyQgorI2RlZmluZSBWTU1DMl9DTFIJCTB4NDAKKyNkZWZpbmUgVk1NQzJfMzE1VgkJMHgwYworI2RlZmluZSBWTU1DMl8zMDBWCQkweDBiCisjZGVmaW5lIFZNTUMyXzI4NVYJCTB4MGEKKyNkZWZpbmUgVk1NQzJfMjYwVgkJMHgwOAorI2RlZmluZSBWTU1DMl8xODVWCQkweDA2CisjZGVmaW5lIFZNTUMyX0RFRElDQVRFRAkJMHgyRQorCisjZGVmaW5lIFZNTUNfREVWX0dSUF9QMQkJMHgyMAorCitzdGF0aWMgdTE2IGNvbnRyb2xfcGJpYXNfb2Zmc2V0Oworc3RhdGljIHUxNiBjb250cm9sX2RldmNvbmYxX29mZnNldDsKKworI2RlZmluZSBIU01NQ19OQU1FX0xFTgk5CisKK3N0YXRpYyBzdHJ1Y3QgdHdsX21tY19jb250cm9sbGVyIHsKKwlzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YQkqbW1jOworCXU4CQl0d2xfdm1tY19kZXZfZ3JwOworCXU4CQl0d2xfbW1jX2RlZGljYXRlZDsKKwljaGFyCQluYW1lW0hTTU1DX05BTUVfTEVOXTsKK30gaHNtbWNbXSA9IHsKKwl7CisJCS50d2xfdm1tY19kZXZfZ3JwCQk9IFZNTUMxX0RFVl9HUlAsCisJCS50d2xfbW1jX2RlZGljYXRlZAkJPSBWTU1DMV9ERURJQ0FURUQsCisJfSwKKwl7CisJCS50d2xfdm1tY19kZXZfZ3JwCQk9IFZNTUMyX0RFVl9HUlAsCisJCS50d2xfbW1jX2RlZGljYXRlZAkJPSBWTU1DMl9ERURJQ0FURUQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgdHdsX21tY19jYXJkX2RldGVjdChpbnQgaXJxKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoc21tYyk7IGkrKykgeworCQlzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jOworCisJCW1tYyA9IGhzbW1jW2ldLm1tYzsKKwkJaWYgKCFtbWMpCisJCQljb250aW51ZTsKKwkJaWYgKGlycSAhPSBtbWMtPnNsb3RzWzBdLmNhcmRfZGV0ZWN0X2lycSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE5PVEU6IGFzc3VtZXMgY2FyZCBkZXRlY3Qgc2lnbmFsIGlzIGFjdGl2ZS1sb3cgKi8KKwkJcmV0dXJuICFncGlvX2dldF92YWx1ZV9jYW5zbGVlcChtbWMtPnNsb3RzWzBdLnN3aXRjaF9waW4pOworCX0KKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGludCB0d2xfbW1jX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90KQoreworCXN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWMgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwkvKiBOT1RFOiBhc3N1bWVzIHdyaXRlIHByb3RlY3Qgc2lnbmFsIGlzIGFjdGl2ZS1oaWdoICovCisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKG1tYy0+c2xvdHNbMF0uZ3Bpb193cCk7Cit9CisKKy8qCisgKiBNTUMgU2xvdCBJbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIGludCB0d2xfbW1jX2xhdGVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tYyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChtbWMtPnNsb3RzWzBdLnN3aXRjaF9waW4sICJtbWNfY2QiKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQobW1jLT5zbG90c1swXS5zd2l0Y2hfcGluKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzbW1jKTsgaSsrKSB7CisJCWlmIChoc21tY1tpXS5uYW1lID09IG1tYy0+c2xvdHNbMF0ubmFtZSkgeworCQkJaHNtbWNbaV0ubW1jID0gbW1jOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWdwaW9fZnJlZShtbWMtPnNsb3RzWzBdLnN3aXRjaF9waW4pOworZG9uZToKKwltbWMtPnNsb3RzWzBdLmNhcmRfZGV0ZWN0X2lycSA9IDA7CisJbW1jLT5zbG90c1swXS5jYXJkX2RldGVjdCA9IE5VTEw7CisKKwlkZXZfZXJyKGRldiwgImVyciAlZCBjb25maWd1cmluZyBjYXJkIGRldGVjdFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0d2xfbW1jX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWMgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlncGlvX2ZyZWUobW1jLT5zbG90c1swXS5zd2l0Y2hfcGluKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHR3bF9tbWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90KQoreworCXN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWMgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlkaXNhYmxlX2lycShtbWMtPnNsb3RzWzBdLmNhcmRfZGV0ZWN0X2lycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHdsX21tY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJZW5hYmxlX2lycShtbWMtPnNsb3RzWzBdLmNhcmRfZGV0ZWN0X2lycSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHR3bF9tbWNfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHR3bF9tbWNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisvKgorICogU2V0cyB0aGUgTU1DIHZvbHRhZ2UgaW4gdHdsNDAzMAorICovCitzdGF0aWMgaW50IHR3bF9tbWNfc2V0X3ZvbHRhZ2Uoc3RydWN0IHR3bF9tbWNfY29udHJvbGxlciAqYywgaW50IHZkZCkKK3sKKwlpbnQgcmV0OworCXU4IHZtbWMsIGRldl9ncnBfdmFsOworCisJc3dpdGNoICgxIDw8IHZkZCkgeworCWNhc2UgTU1DX1ZERF8zNV8zNjoKKwljYXNlIE1NQ19WRERfMzRfMzU6CisJY2FzZSBNTUNfVkREXzMzXzM0OgorCWNhc2UgTU1DX1ZERF8zMl8zMzoKKwljYXNlIE1NQ19WRERfMzFfMzI6CisJY2FzZSBNTUNfVkREXzMwXzMxOgorCQlpZiAoYy0+dHdsX3ZtbWNfZGV2X2dycCA9PSBWTU1DMV9ERVZfR1JQKQorCQkJdm1tYyA9IFZNTUMxXzMxNVY7CisJCWVsc2UKKwkJCXZtbWMgPSBWTU1DMl8zMTVWOworCQlicmVhazsKKwljYXNlIE1NQ19WRERfMjlfMzA6CisJCWlmIChjLT50d2xfdm1tY19kZXZfZ3JwID09IFZNTUMxX0RFVl9HUlApCisJCQl2bW1jID0gVk1NQzFfMzE1VjsKKwkJZWxzZQorCQkJdm1tYyA9IFZNTUMyXzMwMFY7CisJCWJyZWFrOworCWNhc2UgTU1DX1ZERF8yN18yODoKKwljYXNlIE1NQ19WRERfMjZfMjc6CisJCWlmIChjLT50d2xfdm1tY19kZXZfZ3JwID09IFZNTUMxX0RFVl9HUlApCisJCQl2bW1jID0gVk1NQzFfMjg1VjsKKwkJZWxzZQorCQkJdm1tYyA9IFZNTUMyXzI4NVY7CisJCWJyZWFrOworCWNhc2UgTU1DX1ZERF8yNV8yNjoKKwljYXNlIE1NQ19WRERfMjRfMjU6CisJY2FzZSBNTUNfVkREXzIzXzI0OgorCWNhc2UgTU1DX1ZERF8yMl8yMzoKKwljYXNlIE1NQ19WRERfMjFfMjI6CisJY2FzZSBNTUNfVkREXzIwXzIxOgorCQlpZiAoYy0+dHdsX3ZtbWNfZGV2X2dycCA9PSBWTU1DMV9ERVZfR1JQKQorCQkJdm1tYyA9IFZNTUMxXzI4NVY7CisJCWVsc2UKKwkJCXZtbWMgPSBWTU1DMl8yNjBWOworCQlicmVhazsKKwljYXNlIE1NQ19WRERfMTY1XzE5NToKKwkJaWYgKGMtPnR3bF92bW1jX2Rldl9ncnAgPT0gVk1NQzFfREVWX0dSUCkKKwkJCXZtbWMgPSBWTU1DMV8xODVWOworCQllbHNlCisJCQl2bW1jID0gVk1NQzJfMTg1VjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdm1tYyA9IDA7CisJCWJyZWFrOworCX0KKworCWlmICh2bW1jKQorCQlkZXZfZ3JwX3ZhbCA9IFZNTUNfREVWX0dSUF9QMTsJLyogUG93ZXIgdXAgKi8KKwllbHNlCisJCWRldl9ncnBfdmFsID0gTERPX0NMUjsJCS8qIFBvd2VyIGRvd24gKi8KKworCXJldCA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLAorCQkJCQlkZXZfZ3JwX3ZhbCwgYy0+dHdsX3ZtbWNfZGV2X2dycCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLAorCQkJCQl2bW1jLCBjLT50d2xfbW1jX2RlZGljYXRlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3bF9tbWMxX3NldF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90LCBpbnQgcG93ZXJfb24sCisJCQkJaW50IHZkZCkKK3sKKwl1MzIgcmVnOworCWludCByZXQgPSAwOworCXN0cnVjdCB0d2xfbW1jX2NvbnRyb2xsZXIgKmMgPSAmaHNtbWNbMF07CisJc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tYyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmIChwb3dlcl9vbikgeworCQlpZiAoY3B1X2lzX29tYXAyNDMwKCkpIHsKKwkJCXJlZyA9IG9tYXBfY3RybF9yZWFkbChPTUFQMjQzWF9DT05UUk9MX0RFVkNPTkYxKTsKKwkJCWlmICgoMSA8PCB2ZGQpID49IE1NQ19WRERfMzBfMzEpCisJCQkJcmVnIHw9IE9NQVAyNDNYX01NQzFfQUNUSVZFX09WRVJXUklURTsKKwkJCWVsc2UKKwkJCQlyZWcgJj0gfk9NQVAyNDNYX01NQzFfQUNUSVZFX09WRVJXUklURTsKKwkJCW9tYXBfY3RybF93cml0ZWwocmVnLCBPTUFQMjQzWF9DT05UUk9MX0RFVkNPTkYxKTsKKwkJfQorCisJCWlmIChtbWMtPnNsb3RzWzBdLmludGVybmFsX2Nsb2NrKSB7CisJCQlyZWcgPSBvbWFwX2N0cmxfcmVhZGwoT01BUDJfQ09OVFJPTF9ERVZDT05GMCk7CisJCQlyZWcgfD0gT01BUDJfTU1DU0RJTzFBRFBDTEtJU0VMOworCQkJb21hcF9jdHJsX3dyaXRlbChyZWcsIE9NQVAyX0NPTlRST0xfREVWQ09ORjApOworCQl9CisKKwkJcmVnID0gb21hcF9jdHJsX3JlYWRsKGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKKwkJcmVnIHw9IE9NQVAyX1BCSUFTU1BFRURDVFJMMDsKKwkJcmVnICY9IH5PTUFQMl9QQklBU0xJVEVQV1JETlowOworCQlvbWFwX2N0cmxfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOworCisJCXJldCA9IHR3bF9tbWNfc2V0X3ZvbHRhZ2UoYywgdmRkKTsKKworCQkvKiAxMDBtcyBkZWxheSByZXF1aXJlZCBmb3IgUEJJQVMgY29uZmlndXJhdGlvbiAqLworCQltc2xlZXAoMTAwKTsKKwkJcmVnID0gb21hcF9jdHJsX3JlYWRsKGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKKwkJcmVnIHw9IChPTUFQMl9QQklBU0xJVEVQV1JETlowIHwgT01BUDJfUEJJQVNTUEVFRENUUkwwKTsKKwkJaWYgKCgxIDw8IHZkZCkgPD0gTU1DX1ZERF8xNjVfMTk1KQorCQkJcmVnICY9IH5PTUFQMl9QQklBU0xJVEVWTU9ERTA7CisJCWVsc2UKKwkJCXJlZyB8PSBPTUFQMl9QQklBU0xJVEVWTU9ERTA7CisJCW9tYXBfY3RybF93cml0ZWwocmVnLCBjb250cm9sX3BiaWFzX29mZnNldCk7CisJfSBlbHNlIHsKKwkJcmVnID0gb21hcF9jdHJsX3JlYWRsKGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKKwkJcmVnICY9IH5PTUFQMl9QQklBU0xJVEVQV1JETlowOworCQlvbWFwX2N0cmxfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOworCisJCXJldCA9IHR3bF9tbWNfc2V0X3ZvbHRhZ2UoYywgMCk7CisKKwkJLyogMTAwbXMgZGVsYXkgcmVxdWlyZWQgZm9yIFBCSUFTIGNvbmZpZ3VyYXRpb24gKi8KKwkJbXNsZWVwKDEwMCk7CisJCXJlZyA9IG9tYXBfY3RybF9yZWFkbChjb250cm9sX3BiaWFzX29mZnNldCk7CisJCXJlZyB8PSAoT01BUDJfUEJJQVNTUEVFRENUUkwwIHwgT01BUDJfUEJJQVNMSVRFUFdSRE5aMCB8CisJCQlPTUFQMl9QQklBU0xJVEVWTU9ERTApOworCQlvbWFwX2N0cmxfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHdsX21tYzJfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwgaW50IHZkZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB0d2xfbW1jX2NvbnRyb2xsZXIgKmMgPSAmaHNtbWNbMV07CisJc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKm1tYyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmIChwb3dlcl9vbikgeworCQlpZiAobW1jLT5zbG90c1swXS5pbnRlcm5hbF9jbG9jaykgeworCQkJdTMyIHJlZzsKKworCQkJcmVnID0gb21hcF9jdHJsX3JlYWRsKGNvbnRyb2xfZGV2Y29uZjFfb2Zmc2V0KTsKKwkJCXJlZyB8PSBPTUFQMl9NTUNTRElPMkFEUENMS0lTRUw7CisJCQlvbWFwX2N0cmxfd3JpdGVsKHJlZywgY29udHJvbF9kZXZjb25mMV9vZmZzZXQpOworCQl9CisJCXJldCA9IHR3bF9tbWNfc2V0X3ZvbHRhZ2UoYywgdmRkKTsKKwl9IGVsc2UgeworCQlyZXQgPSB0d2xfbW1jX3NldF92b2x0YWdlKGMsIDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqaHNtbWNfZGF0YVtPTUFQMzRYWF9OUl9NTUNdIF9faW5pdGRhdGE7CisKK3ZvaWQgX19pbml0IHR3bDQwMzBfbW1jX2luaXQoc3RydWN0IHR3bDQwMzBfaHNtbWNfaW5mbyAqY29udHJvbGxlcnMpCit7CisJc3RydWN0IHR3bDQwMzBfaHNtbWNfaW5mbyAqYzsKKwlpbnQgbnJfaHNtbWMgPSBBUlJBWV9TSVpFKGhzbW1jX2RhdGEpOworCisJaWYgKGNwdV9pc19vbWFwMjQzMCgpKSB7CisJCWNvbnRyb2xfcGJpYXNfb2Zmc2V0ID0gT01BUDI0M1hfQ09OVFJPTF9QQklBU19MSVRFOworCQljb250cm9sX2RldmNvbmYxX29mZnNldCA9IE9NQVAyNDNYX0NPTlRST0xfREVWQ09ORjE7CisJCW5yX2hzbW1jID0gMjsKKwl9IGVsc2UgeworCQljb250cm9sX3BiaWFzX29mZnNldCA9IE9NQVAzNDNYX0NPTlRST0xfUEJJQVNfTElURTsKKwkJY29udHJvbF9kZXZjb25mMV9vZmZzZXQgPSBPTUFQMzQzWF9DT05UUk9MX0RFVkNPTkYxOworCX0KKworCWZvciAoYyA9IGNvbnRyb2xsZXJzOyBjLT5tbWM7IGMrKykgeworCQlzdHJ1Y3QgdHdsX21tY19jb250cm9sbGVyICp0d2wgPSBoc21tYyArIGMtPm1tYyAtIDE7CisJCXN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICptbWMgPSBoc21tY19kYXRhW2MtPm1tYyAtIDFdOworCisJCWlmICghYy0+bW1jIHx8IGMtPm1tYyA+IG5yX2hzbW1jKSB7CisJCQlwcl9kZWJ1ZygiTU1DJWQ6IG5vIHN1Y2ggY29udHJvbGxlclxuIiwgYy0+bW1jKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtbWMpIHsKKwkJCXByX2RlYnVnKCJNTUMlZDogYWxyZWFkeSBjb25maWd1cmVkXG4iLCBjLT5tbWMpOworCQkJY29udGludWU7CisJCX0KKworCQltbWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOworCQlpZiAoIW1tYykgeworCQkJcHJfZXJyKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBtbWMgZGV2aWNlIVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlzcHJpbnRmKHR3bC0+bmFtZSwgIm1tYyVpc2xvdCVpIiwgYy0+bW1jLCAxKTsKKwkJbW1jLT5zbG90c1swXS5uYW1lID0gdHdsLT5uYW1lOworCQltbWMtPm5yX3Nsb3RzID0gMTsKKwkJbW1jLT5zbG90c1swXS5vY3JfbWFzayA9IE1NQ19WRERfMTY1XzE5NSB8CisJCQkJCU1NQ19WRERfMjZfMjcgfCBNTUNfVkREXzI3XzI4IHwKKwkJCQkJTU1DX1ZERF8yOV8zMCB8CisJCQkJCU1NQ19WRERfMzBfMzEgfCBNTUNfVkREXzMxXzMyOworCQltbWMtPnNsb3RzWzBdLndpcmVzID0gYy0+d2lyZXM7CisJCW1tYy0+c2xvdHNbMF0uaW50ZXJuYWxfY2xvY2sgPSAhYy0+ZXh0X2Nsb2NrOworCQltbWMtPmRtYV9tYXNrID0gMHhmZmZmZmZmZjsKKworCQkvKiBub3RlOiB0d2w0MDMwIGNhcmQgZGV0ZWN0IEdQSU9zIG5vcm1hbGx5IHN3aXRjaCBWTU1DeCAuLi4gKi8KKwkJaWYgKGdwaW9faXNfdmFsaWQoYy0+Z3Bpb19jZCkpIHsKKwkJCW1tYy0+aW5pdCA9IHR3bF9tbWNfbGF0ZV9pbml0OworCQkJbW1jLT5jbGVhbnVwID0gdHdsX21tY19jbGVhbnVwOworCQkJbW1jLT5zdXNwZW5kID0gdHdsX21tY19zdXNwZW5kOworCQkJbW1jLT5yZXN1bWUgPSB0d2xfbW1jX3Jlc3VtZTsKKworCQkJbW1jLT5zbG90c1swXS5zd2l0Y2hfcGluID0gYy0+Z3Bpb19jZDsKKwkJCW1tYy0+c2xvdHNbMF0uY2FyZF9kZXRlY3RfaXJxID0gZ3Bpb190b19pcnEoYy0+Z3Bpb19jZCk7CisJCQltbWMtPnNsb3RzWzBdLmNhcmRfZGV0ZWN0ID0gdHdsX21tY19jYXJkX2RldGVjdDsKKwkJfSBlbHNlCisJCQltbWMtPnNsb3RzWzBdLnN3aXRjaF9waW4gPSAtRUlOVkFMOworCisJCS8qIHdyaXRlIHByb3RlY3Qgbm9ybWFsbHkgdXNlcyBhbiBPTUFQIGdwaW8gKi8KKwkJaWYgKGdwaW9faXNfdmFsaWQoYy0+Z3Bpb193cCkpIHsKKwkJCWdwaW9fcmVxdWVzdChjLT5ncGlvX3dwLCAibW1jX3dwIik7CisJCQlncGlvX2RpcmVjdGlvbl9pbnB1dChjLT5ncGlvX3dwKTsKKworCQkJbW1jLT5zbG90c1swXS5ncGlvX3dwID0gYy0+Z3Bpb193cDsKKwkJCW1tYy0+c2xvdHNbMF0uZ2V0X3JvID0gdHdsX21tY19nZXRfcm87CisJCX0gZWxzZQorCQkJbW1jLT5zbG90c1swXS5ncGlvX3dwID0gLUVJTlZBTDsKKworCQkvKiBOT1RFOiAgd2UgYXNzdW1lIE9NQVAncyBNTUMxIGFuZCBNTUMyIHVzZQorCQkgKiB0aGUgVFdMNDAzMCdzIFZNTUMxIGFuZCBWTU1DMiwgcmVzcGVjdGl2ZWx5OworCQkgKiBhbmQgdGhhdCBPTUFQJ3MgTU1DMyBpc24ndCB1c2VkLgorCQkgKi8KKworCQlzd2l0Y2ggKGMtPm1tYykgeworCQljYXNlIDE6CisJCQltbWMtPnNsb3RzWzBdLnNldF9wb3dlciA9IHR3bF9tbWMxX3NldF9wb3dlcjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltbWMtPnNsb3RzWzBdLnNldF9wb3dlciA9IHR3bF9tbWMyX3NldF9wb3dlcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJNTUMlZCBjb25maWd1cmF0aW9uIG5vdCBzdXBwb3J0ZWQhXG4iLCBjLT5tbWMpOworCQkJY29udGludWU7CisJCX0KKwkJaHNtbWNfZGF0YVtjLT5tbWMgLSAxXSA9IG1tYzsKKwl9CisKKwlvbWFwMl9pbml0X21tYyhoc21tY19kYXRhLCBPTUFQMzRYWF9OUl9NTUMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbW1jLXR3bDQwMzAuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvbW1jLXR3bDQwMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM4MDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tbWMtdHdsNDAzMC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBNTUMgZGVmaW5pdGlvbnMgZm9yIE9NQVAyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCitzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvIHsKKwl1OAltbWM7CQkvKiBjb250cm9sbGVyIDEvMi8zICovCisJdTgJd2lyZXM7CQkvKiAxLzQvOCB3aXJlcyAqLworCWludAlncGlvX2NkOwkvKiBvciAtRUlOVkFMICovCisJaW50CWdwaW9fd3A7CS8qIG9yIC1FSU5WQUwgKi8KKwlpbnQJZXh0X2Nsb2NrOjE7CS8qIHVzZSBleHRlcm5hbCBwaW4gZm9yIGlucHV0IGNsb2NrICovCit9OworCisjaWYJZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT1JFKSAmJiBcCisJKGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpIHx8IFwKKwkgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfSFMpIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTX01PRFVMRSkpCisKK3ZvaWQgdHdsNDAzMF9tbWNfaW5pdChzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvICopOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHdsNDAzMF9tbWNfaW5pdChzdHJ1Y3QgdHdsNDAzMF9oc21tY19pbmZvICppbmZvKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCmluZGV4IGIxMzkzNjcuLmRhY2I0MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYwpAQCAtMjAzLDYgKzIwMywxNSBAQAogTVVYX0NGR18yNFhYKCJBQzdfMjQzMF9VU0IwSFNfREFUQTciLAkweDEzRSwJMCwJMCwJMCwJMSkKIAogLyogMjQzMCBNY0JTUCAqLworTVVYX0NGR18yNFhYKCJBRDZfMjQzMF9NQ0JTUF9DTEtTIiwJMHgwMTFFLAkwLAkwLAkwLAkxKQorCitNVVhfQ0ZHXzI0WFgoIkFCMl8yNDMwX01DQlNQMV9DTEtSIiwJMHgwMTFBLAkwLAkwLAkwLAkxKQorTVVYX0NGR18yNFhYKCJBRDVfMjQzMF9NQ0JTUDFfRlNSIiwJMHgwMTFCLAkwLAkwLAkwLAkxKQorTVVYX0NGR18yNFhYKCJBQTFfMjQzMF9NQ0JTUDFfRFgiLAkweDAxMUMsCTAsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFGM18yNDMwX01DQlNQMV9EUiIsCTB4MDExRCwJMCwJMCwJMCwJMSkKK01VWF9DRkdfMjRYWCgiQUIzXzI0MzBfTUNCU1AxX0ZTWCIsCTB4MDExRiwJMCwJMCwJMCwJMSkKK01VWF9DRkdfMjRYWCgiWTlfMjQzMF9NQ0JTUDFfQ0xLWCIsCTB4MDEyMCwJMCwJMCwJMCwJMSkKKwogTVVYX0NGR18yNFhYKCJBQzEwXzI0MzBfTUNCU1AyX0ZTWCIsCTB4MDEyRSwJMSwJMCwJMCwJMSkKIE1VWF9DRkdfMjRYWCgiQUQxNl8yNDMwX01DQlNQMl9DTFgiLAkweDAxMkYsCTEsCTAsCTAsCTEpCiBNVVhfQ0ZHXzI0WFgoIkFFMTNfMjQzMF9NQ0JTUDJfRFgiLAkweDAxMzAsCTEsCTAsCTAsCTEpCkBAIC0yMTEsNiArMjIwLDMxIEBACiBNVVhfQ0ZHXzI0WFgoIkFEMTZfMjQzMF9NQ0JTUDJfQ0xYX09GRiIsMHgwMTJGLAkwLAkwLAkwLAkxKQogTVVYX0NGR18yNFhYKCJBRTEzXzI0MzBfTUNCU1AyX0RYX09GRiIsCTB4MDEzMCwJMCwJMCwJMCwJMSkKIE1VWF9DRkdfMjRYWCgiQUQxM18yNDMwX01DQlNQMl9EUl9PRkYiLAkweDAxMzEsCTAsCTAsCTAsCTEpCisKK01VWF9DRkdfMjRYWCgiQUM5XzI0MzBfTUNCU1AzX0NMS1giLAkweDAxMDMsCTAsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFFNF8yNDMwX01DQlNQM19GU1giLAkweDAxMDQsCTAsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFFMl8yNDMwX01DQlNQM19EUiIsCTB4MDEwNSwJMCwJMCwJMCwJMSkKK01VWF9DRkdfMjRYWCgiQUY0XzI0MzBfTUNCU1AzX0RYIiwJMHgwMTA2LAkwLAkwLAkwLAkxKQorCitNVVhfQ0ZHXzI0WFgoIk4zXzI0MzBfTUNCU1A0X0NMS1giLAkweDAxMEIsCTEsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFEMjNfMjQzMF9NQ0JTUDRfRFIiLAkweDAxMEMsCTEsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFCMjVfMjQzMF9NQ0JTUDRfRFgiLAkweDAxMEQsCTEsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIkFDMjVfMjQzMF9NQ0JTUDRfRlNYIiwJMHgwMTBFLAkxLAkwLAkwLAkxKQorCitNVVhfQ0ZHXzI0WFgoIkFFMTZfMjQzMF9NQ0JTUDVfQ0xLWCIsCTB4MDBFRCwJMSwJMCwJMCwJMSkKK01VWF9DRkdfMjRYWCgiQUYxMl8yNDMwX01DQlNQNV9GU1giLAkweDAwRUQsCTEsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIks3XzI0MzBfTUNCU1A1X0RYIiwJMHgwMEVGLAkxLAkwLAkwLAkxKQorTVVYX0NGR18yNFhYKCJNMV8yNDMwX01DQlNQNV9EUiIsCTB4MDBGMCwJMSwJMCwJMCwJMSkKKworLyogMjQzMCBNQ1NQSTEgKi8KK01VWF9DRkdfMjRYWCgiWTE4XzI0MzBfTUNTUEkxX0NMSyIsCTB4MDEwRiwJMCwJMCwJMCwJMSkKK01VWF9DRkdfMjRYWCgiQUQxNV8yNDMwX01DU1BJMV9TSU1PIiwJMHgwMTEwLAkwLAkwLAkwLAkxKQorTVVYX0NGR18yNFhYKCJBRTE3XzI0MzBfTUNTUEkxX1NPTUkiLAkweDAxMTEsCTAsCTAsCTAsCTEpCitNVVhfQ0ZHXzI0WFgoIlUxXzI0MzBfTUNTUEkxX0NTMCIsCTB4MDExMiwJMCwJMCwJMCwJMSkKKworLyogVG91Y2hzY3JlZW4gR1BJTyAqLworTVVYX0NGR18yNFhYKCJBRjE5XzI0MzBfR1BJT184NSIsCTB4MDExMywJMywJMCwJMCwJMSkKKwogfTsKIAogI2RlZmluZSBPTUFQMjRYWF9QSU5TX1NaCUFSUkFZX1NJWkUob21hcDI0eHhfcGlucykKQEAgLTQxNyw2ICs0NTEsMTQgQEAKIE1VWF9DRkdfMzRYWCgiQUMxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhFTl9OIiwgMHgxOGEsCiAJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCiAKKworLyogMzRYWCBHUElPIC0gYmlkaXJlY3Rpb25hbCwgdW5sZXNzIHRoZSBuYW1lIGhhcyBhbiAiX09VVCIgc3VmZml4LgorICogTm8gaW50ZXJuYWwgcHVsbHVwL3B1bGxkb3duIHdpdGhvdXQgIl9VUCIgb3IgIl9ET1dOIiBzdWZmaXguCisgKi8KK01VWF9DRkdfMzRYWCgiQUg4XzM0WFhfR1BJTzI5IiwgMHg1ZmEsCisJCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9JTlBVVCkKK01VWF9DRkdfMzRYWCgiSjI1XzM0WFhfR1BJTzE3MCIsIDB4MWM2LAorCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCiB9OwogCiAjZGVmaW5lIE9NQVAzNFhYX1BJTlNfU1oJQVJSQVlfU0laRShvbWFwMzR4eF9waW5zKQpAQCAtNDUyLDcgKzQ5NCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCi1pbnQgX19pbml0X29yX21vZHVsZSBvbWFwMjR4eF9jZmdfcmVnKGNvbnN0IHN0cnVjdCBwaW5fY29uZmlnICpjZmcpCitzdGF0aWMgaW50IF9faW5pdF9vcl9tb2R1bGUgb21hcDI0eHhfY2ZnX3JlZyhjb25zdCBzdHJ1Y3QgcGluX2NvbmZpZyAqY2ZnKQogewogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXV4X3NwaW5fbG9jayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLXR1c2I2MDEwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi10dXNiNjAxMC5jCmluZGV4IDEwZWY0NjQuLjE1ZTUwOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLXR1c2I2MDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItdHVzYjYwMTAuYwpAQCAtMTIsMTEgKzEyLDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLmg+CiAKICNpbmNsdWRlIDxtYWNoL2dwbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogCiAKQEAgLTI5MiwxMiArMjkyLDEyIEBACiAJCQkpOwogCiAJLyogSVJRICovCi0Jc3RhdHVzID0gb21hcF9yZXF1ZXN0X2dwaW8oaXJxKTsKKwlzdGF0dXMgPSBncGlvX3JlcXVlc3QoaXJxLCAiVFVTQjYwMTAgaXJxIik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJcHJpbnRrKGVycm9yLCAzLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihpcnEsIDEpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGlycSk7CiAJdHVzYl9yZXNvdXJjZXNbMl0uc3RhcnQgPSBpcnEgKyBJSF9HUElPX0JBU0U7CiAKIAkvKiBzZXQgdXAgbWVtb3J5IHRpbWluZ3MgLi4uIGNhbiBzcGVlZCB0aGVtIHVwIGxhdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvTWFrZWZpbGUKaW5kZXggM2Q0YTFiYy4uZWRjMzhlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLW9iai15CQkJCSs9IGNvbW1vbi5vIGFkZHItbWFwLm8gcGNpLm8gZ3Bpby5vIGlycS5vIG1wcC5vCitvYmoteQkJCQkrPSBjb21tb24ubyBhZGRyLW1hcC5vIHBjaS5vIGlycS5vIG1wcC5vCiBvYmotJChDT05GSUdfTUFDSF9EQjg4RjUyODEpCSs9IGRiODhmNTI4MS1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9SRDg4RjUxODIpCSs9IHJkODhmNTE4Mi1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9LVVJPQk9YX1BSTykJKz0ga3Vyb2JveF9wcm8tc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5jCmluZGV4IDQzNzA2NWMuLjBhNjIzMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmMKQEAgLTcyLDYgKzcyLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBvcmlvbl9laGNpX2RhdGEgb3Jpb241eF9laGNpX2RhdGEgPSB7CiAJLmRyYW0JCT0gJm9yaW9uNXhfbWJ1c19kcmFtX2luZm8sCisJLnBoeV92ZXJzaW9uCT0gRUhDSV9QSFlfT1JJT04sCiB9OwogCiBzdGF0aWMgdTY0IGVoY2lfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaAppbmRleCBhMDAwYzdjLi43OThiOWE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5oCkBAIC01MSwxMyArNTEsNiBAQAogc3RydWN0IHBjaV9idXMgKm9yaW9uNXhfcGNpX3N5c19zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CiBpbnQgb3Jpb241eF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogCi0vKgotICogVmFsaWQgR1BJTyBwaW5zIGFjY29yZGluZyB0byBNUFAgc2V0dXAsIHVzZWQgYnkgbWFjaGluZS1zZXR1cC4KLSAqICgvbWFjaC1vcmlvbi9ncGlvLmMpLgotICovCi12b2lkIG9yaW9uNXhfZ3Bpb19zZXRfdmFsaWQodW5zaWduZWQgcGluLCBpbnQgdmFsaWQpOwotdm9pZCBncGlvX2Rpc3BsYXkodm9pZCk7CS8qIGRlYnVnICovCi0KIHN0cnVjdCBtYWNoaW5lX2Rlc2M7CiBzdHJ1Y3QgbWVtaW5mbzsKIHN0cnVjdCB0YWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKaW5kZXggM2U2NjA5OC4uMDcyMmQ2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTY0LDkgKzY1LDIxIEBACiAJLm1hcF9pcnEJPSBkbnMzMjNfcGNpX21hcF9pcnEsCiB9OwogCitzdGF0aWMgaW50IF9faW5pdCBkbnMzMjNfZGV2X2lkKHZvaWQpCit7CisJdTMyIGRldiwgcmV2OworCisJb3Jpb241eF9wY2llX2lkKCZkZXYsICZyZXYpOworCisJcmV0dXJuIGRldjsKK30KKwogc3RhdGljIGludCBfX2luaXQgZG5zMzIzX3BjaV9pbml0KHZvaWQpCiB7Ci0JaWYgKG1hY2hpbmVfaXNfZG5zMzIzKCkpCisJLyogVGhlIDUxODIgZG9lc24ndCByZWFsbHkgdXNlIGl0J3MgUENJIGJ1cywgYW5kIGluaXRpYWxpc2luZyBQQ0kKKwkgKiBnZXRzIGluIHRoZSB3YXkgb2YgaW5pdGlhbGlzaW5nIHRoZSBTQVRBIGNvbnRyb2xsZXIuCisJICovCisJaWYgKG1hY2hpbmVfaXNfZG5zMzIzKCkgJiYgZG5zMzIzX2Rldl9pZCgpICE9IE1WODhGNTE4Ml9ERVZfSUQpCiAJCXBjaV9jb21tb25faW5pdCgmZG5zMzIzX3BjaSk7CiAKIAlyZXR1cm4gMDsKQEAgLTc1LDE0ICs4OCw2IEBACiBzdWJzeXNfaW5pdGNhbGwoZG5zMzIzX3BjaV9pbml0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEV0aGVybmV0Ci0gKi8KLQotc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGRuczMyM19ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIgPSBNVjY0M1hYX0VUSF9QSFlfQUREUig4KSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiA4TWlCIE5PUiBmbGFzaCAoU3BhbnNpb24gUzI5R0wwNjRNOTBURklSNCkKICAqCiAgKiBMYXlvdXQgYXMgdXNlZCBieSBELUxpbms6CkBAIC0xNDMsNiArMTQ4LDkwIEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXRoZXJuZXQKKyAqLworCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZG5zMzIzX2V0aF9kYXRhID0geworCS5waHlfYWRkciA9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAorfTsKKworLyogZG5zMzIzX3BhcnNlX2hleF8qKCkgdGFrZW4gZnJvbSB0c3gwOS1jb21tb24uYzsgc2hvdWxkIGEgY29tbW9uIGNvcHkgb2YgdGhlc2UKKyAqIGZ1bmN0aW9ucyBiZSBrZXB0IHNvbWV3aGVyZT8KKyAqLworc3RhdGljIGludCBfX2luaXQgZG5zMzIzX3BhcnNlX2hleF9uaWJibGUoY2hhciBuKQoreworCWlmIChuID49ICcwJyAmJiBuIDw9ICc5JykKKwkJcmV0dXJuIG4gLSAnMCc7CisKKwlpZiAobiA+PSAnQScgJiYgbiA8PSAnRicpCisJCXJldHVybiBuIC0gJ0EnICsgMTA7CisKKwlpZiAobiA+PSAnYScgJiYgbiA8PSAnZicpCisJCXJldHVybiBuIC0gJ2EnICsgMTA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRuczMyM19wYXJzZV9oZXhfYnl0ZShjb25zdCBjaGFyICpiKQoreworCWludCBoaTsKKwlpbnQgbG87CisKKwloaSA9IGRuczMyM19wYXJzZV9oZXhfbmliYmxlKGJbMF0pOworCWxvID0gZG5zMzIzX3BhcnNlX2hleF9uaWJibGUoYlsxXSk7CisKKwlpZiAoaGkgPCAwIHx8IGxvIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIChoaSA8PCA0KSB8IGxvOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkbnMzMjNfcmVhZF9tYWNfYWRkcih2b2lkKQoreworCXVfaW50OF90IGFkZHJbNl07CisJaW50IGk7CisJY2hhciAqbWFjX3BhZ2U7CisKKwkvKiBNQUMgYWRkcmVzcyBpcyBzdG9yZWQgYXMgYSByZWd1bGFyIG9sJyBzdHJpbmcgaW4gL2Rldi9tdGRibG9jazQKKwkgKiAoMHgwMDdkMDAwMC0weDAwODAwMDAwKSBzdGFydGluZyBhdCBvZmZzZXQgMTk2NDgwICgweDJmZjgwKS4KKwkgKi8KKwltYWNfcGFnZSA9IGlvcmVtYXAoRE5TMzIzX05PUl9CT09UX0JBU0UgKyAweDdkMDAwMCArIDE5NjQ4MCwgMTAyNCk7CisJaWYgKCFtYWNfcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTYW5pdHkgY2hlY2sgdGhlIHN0cmluZyB3ZSdyZSBsb29raW5nIGF0ICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoKihtYWNfcGFnZSArIChpICogMykgKyAyKSAhPSAnOicpIHsKKwkJCWdvdG8gZXJyb3JfZmFpbDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCXsKKwkJaW50IGJ5dGU7CisKKwkJYnl0ZSA9IGRuczMyM19wYXJzZV9oZXhfYnl0ZShtYWNfcGFnZSArIChpICogMykpOworCQlpZiAoYnl0ZSA8IDApIHsKKwkJCWdvdG8gZXJyb3JfZmFpbDsKKwkJfQorCisJCWFkZHJbaV0gPSBieXRlOworCX0KKworCWlvdW5tYXAobWFjX3BhZ2UpOworCXByaW50aygiRE5TMzIzOiBGb3VuZCBldGhlcm5ldCBNQUMgYWRkcmVzczogIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlLjJ4JXMiLCBhZGRyW2ldLCAoaSA8IDUpID8gIjoiIDogIi5cbiIpOworCisJbWVtY3B5KGRuczMyM19ldGhfZGF0YS5tYWNfYWRkciwgYWRkciwgNik7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZmFpbDoKKwlpb3VubWFwKG1hY19wYWdlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEdQSU8gTEVEcyAoc2ltcGxlIC0gZG9lc24ndCB1c2UgaGFyZHdhcmUgYmxpbmtpbmcgc3VwcG9ydCkKICAqLwogCkBAIC0yMDcsMTAgKzI5NiwxNyBAQAogCX0sCiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNBVEEKKyAqLworc3RhdGljIHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgZG5zMzIzX3NhdGFfZGF0YSA9IHsKKyAgICAgICAubl9wb3J0cyAgICAgICAgPSAyLAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEdlbmVyYWwgU2V0dXAKICAqLwotc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM19tcHBfbW9kZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM19tdjg4ZjUxODFfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKIAl7ICAwLCBNUFBfUENJRV9SU1RfT1VUbiB9LAogCXsgIDEsIE1QUF9HUElPIH0sCQkvKiByaWdodCBhbWJlciBMRUQgKHNhdGEgY2gwKSAqLwogCXsgIDIsIE1QUF9HUElPIH0sCQkvKiBsZWZ0IGFtYmVyIExFRCAoc2F0YSBjaDEpICovCkBAIC0yMzQsNiArMzMwLDMwIEBACiAJeyAtMSB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvcmlvbjV4X21wcF9tb2RlIGRuczMyM19tdjg4ZjUxODJfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKKwl7ICAwLCBNUFBfVU5VU0VEIH0sCisJeyAgMSwgTVBQX0dQSU8gfSwJCS8qIHJpZ2h0IGFtYmVyIExFRCAoc2F0YSBjaDApICovCisJeyAgMiwgTVBQX0dQSU8gfSwJCS8qIGxlZnQgYW1iZXIgTEVEIChzYXRhIGNoMSkgKi8KKwl7ICAzLCBNUFBfVU5VU0VEIH0sCisJeyAgNCwgTVBQX0dQSU8gfSwJCS8qIHBvd2VyIGJ1dHRvbiBMRUQgKi8KKwl7ICA1LCBNUFBfR1BJTyB9LAkJLyogcG93ZXIgYnV0dG9uIExFRCAqLworCXsgIDYsIE1QUF9HUElPIH0sCQkvKiBHTVQgRzc1MS0yZiBvdmVydGVtcCAqLworCXsgIDcsIE1QUF9HUElPIH0sCQkvKiBNNDFUODAgbklSUS9PVVQvU1FXICovCisJeyAgOCwgTVBQX0dQSU8gfSwJCS8qIHRyaWdnZXJzIHBvd2VyIG9mZiAqLworCXsgIDksIE1QUF9HUElPIH0sCQkvKiBwb3dlciBidXR0b24gc3dpdGNoICovCisJeyAxMCwgTVBQX0dQSU8gfSwJCS8qIHJlc2V0IGJ1dHRvbiBzd2l0Y2ggKi8KKwl7IDExLCBNUFBfVU5VU0VEIH0sCisJeyAxMiwgTVBQX1NBVEFfTEVEIH0sCisJeyAxMywgTVBQX1NBVEFfTEVEIH0sCisJeyAxNCwgTVBQX1NBVEFfTEVEIH0sCisJeyAxNSwgTVBQX1NBVEFfTEVEIH0sCisJeyAxNiwgTVBQX1VOVVNFRCB9LAorCXsgMTcsIE1QUF9VTlVTRUQgfSwKKwl7IDE4LCBNUFBfVU5VU0VEIH0sCisJeyAxOSwgTVBQX1VOVVNFRCB9LAorCXsgLTEgfSwKK307CisKIC8qCiAgKiBPbiB0aGUgRE5TLTMyMyB0aGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGF0dGFjaGVkIHZpYSBJMkM6CiAgKgpAQCAtMjY0LDE2ICszODQsMTUgQEAKIAkvKiBTZXR1cCBiYXNpYyBPcmlvbiBmdW5jdGlvbnMuIE5lZWQgdG8gYmUgY2FsbGVkIGVhcmx5LiAqLwogCW9yaW9uNXhfaW5pdCgpOwogCi0Jb3Jpb241eF9tcHBfY29uZihkbnMzMjNfbXBwX21vZGVzKTsKLQl3cml0ZWwoMCwgTVBQX0RFVl9DVFJMKTsJCS8qIERFVl9EWzMxOjE2XSAqLwotCi0JLyoKLQkgKiBDb25maWd1cmUgcGVyaXBoZXJhbHMuCisJLyogSnVzdCB0byBiZSB0cmlja3ksIHRoZSA1MTgyIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50CisJICogc2V0IG9mIE1QUCBtb2RlcyB0byB0aGUgNTE4MS4KIAkgKi8KLQlvcmlvbjV4X2VoY2kwX2luaXQoKTsKLQlvcmlvbjV4X2V0aF9pbml0KCZkbnMzMjNfZXRoX2RhdGEpOwotCW9yaW9uNXhfaTJjX2luaXQoKTsKLQlvcmlvbjV4X3VhcnQwX2luaXQoKTsKKwlpZiAoZG5zMzIzX2Rldl9pZCgpID09IE1WODhGNTE4Ml9ERVZfSUQpCisJCW9yaW9uNXhfbXBwX2NvbmYoZG5zMzIzX212ODhmNTE4Ml9tcHBfbW9kZXMpOworCWVsc2UgeworCQlvcmlvbjV4X21wcF9jb25mKGRuczMyM19tdjg4ZjUxODFfbXBwX21vZGVzKTsKKwkJd3JpdGVsKDAsIE1QUF9ERVZfQ1RSTCk7CQkvKiBERVZfRFszMToxNl0gKi8KKwl9CiAKIAkvKiBzZXR1cCBmbGFzaCBtYXBwaW5nCiAJICogQ1MzIGhvbGRzIGEgOCBNQiBTcGFuc2lvbiBTMjlHTDA2NE05MFRGSVI0CkBAIC0yODgsNiArNDA3LDIzIEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgZG5zMzIzX2kyY19kZXZpY2VzLAogCQkJCUFSUkFZX1NJWkUoZG5zMzIzX2kyY19kZXZpY2VzKSk7CiAKKwkvKgorCSAqIENvbmZpZ3VyZSBwZXJpcGhlcmFscy4KKwkgKi8KKwlpZiAoZG5zMzIzX3JlYWRfbWFjX2FkZHIoKSA8IDApCisJCXByaW50aygiRE5TMzIzOiBGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzc1xuIik7CisKKwlvcmlvbjV4X2VoY2kwX2luaXQoKTsKKwlvcmlvbjV4X2V0aF9pbml0KCZkbnMzMjNfZXRoX2RhdGEpOworCW9yaW9uNXhfaTJjX2luaXQoKTsKKwlvcmlvbjV4X3VhcnQwX2luaXQoKTsKKworCS8qIFRoZSA1MTgyIGhhcyBpdCdzIFNBVEEgY29udHJvbGxlciBvbi1jaGlwLCBhbmQgbmVlZHMgaXQncyBvd24gbGl0dGxlCisJICogaW5pdCByb3V0aW5lLgorCSAqLworCWlmIChkbnMzMjNfZGV2X2lkKCkgPT0gTVY4OEY1MTgyX0RFVl9JRCkKKwkJb3Jpb241eF9zYXRhX2luaXQoJmRuczMyM19zYXRhX2RhdGEpOworCiAJLyogcmVnaXN0ZXIgZG5zMzIzIHNwZWNpZmljIHBvd2VyLW9mZiBtZXRob2QgKi8KIAlpZiAoZ3Bpb19yZXF1ZXN0KEROUzMyM19HUElPX1BPV0VSX09GRiwgIlBPV0VST0ZGIikgIT0gMCB8fAogCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoRE5TMzIzX0dQSU9fUE9XRVJfT0ZGLCAwKSAhPSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWQwODguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2dwaW8uYwotICoKLSAqIEdQSU8gZnVuY3Rpb25zIGZvciBNYXJ2ZWxsIE9yaW9uIFN5c3RlbSBPbiBDaGlwCi0gKgotICogTWFpbnRhaW5lcjogVHphY2hpIFBlcmVsc3RlaW4gPHR6YWNoaUBtYXJ2ZWxsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fbG9jayk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX3ZhbGlkW0JJVFNfVE9fTE9OR1MoR1BJT19NQVgpXTsKLXN0YXRpYyBjb25zdCBjaGFyICpncGlvX2xhYmVsW0dQSU9fTUFYXTsgIC8qIG5vbiBudWxsIGZvciBhbGxvY2F0ZWQgR1BJT3MgKi8KLQotdm9pZCBfX2luaXQgb3Jpb241eF9ncGlvX3NldF92YWxpZCh1bnNpZ25lZCBwaW4sIGludCB2YWxpZCkKLXsKLQlpZiAodmFsaWQpCi0JCV9fc2V0X2JpdChwaW4sIGdwaW9fdmFsaWQpOwotCWVsc2UKLQkJX19jbGVhcl9iaXQocGluLCBncGlvX3ZhbGlkKTsKLX0KLQotLyoKLSAqIEdFTkVSSUNfR1BJTyBwcmltaXRpdmVzCi0gKi8KLWludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBwaW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChwaW4gPj0gR1BJT19NQVggfHwgIXRlc3RfYml0KHBpbiwgZ3Bpb192YWxpZCkpIHsKLQkJcHJfZGVidWcoIiVzOiBpbnZhbGlkIEdQSU8gJWRcbiIsIF9fZnVuY19fLCBwaW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNvbWUgY2FsbGVycyBtaWdodCBoYXZlIG5vdCB1c2VkIHRoZSBncGlvX3JlcXVlc3QoKSwKLQkgKiBzbyBmbGFnIHRoaXMgcGluIGFzIHJlcXVlc3RlZCBub3cuCi0JICovCi0JaWYgKCFncGlvX2xhYmVsW3Bpbl0pCi0JCWdwaW9fbGFiZWxbcGluXSA9ICI/IjsKLQotCW9yaW9uNXhfc2V0Yml0cyhHUElPX0lPX0NPTkYsIDEgPDwgcGluKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7Ci0KLWludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgcGluLCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbWFzazsKLQotCWlmIChwaW4gPj0gR1BJT19NQVggfHwgIXRlc3RfYml0KHBpbiwgZ3Bpb192YWxpZCkpIHsKLQkJcHJfZGVidWcoIiVzOiBpbnZhbGlkIEdQSU8gJWRcbiIsIF9fZnVuY19fLCBwaW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNvbWUgY2FsbGVycyBtaWdodCBoYXZlIG5vdCB1c2VkIHRoZSBncGlvX3JlcXVlc3QoKSwKLQkgKiBzbyBmbGFnIHRoaXMgcGluIGFzIHJlcXVlc3RlZCBub3cuCi0JICovCi0JaWYgKCFncGlvX2xhYmVsW3Bpbl0pCi0JCWdwaW9fbGFiZWxbcGluXSA9ICI/IjsKLQotCW1hc2sgPSAxIDw8IHBpbjsKLQlvcmlvbjV4X2NscmJpdHMoR1BJT19CTElOS19FTiwgbWFzayk7Ci0JaWYgKHZhbHVlKQotCQlvcmlvbjV4X3NldGJpdHMoR1BJT19PVVQsIG1hc2spOwotCWVsc2UKLQkJb3Jpb241eF9jbHJiaXRzKEdQSU9fT1VULCBtYXNrKTsKLQlvcmlvbjV4X2NscmJpdHMoR1BJT19JT19DT05GLCBtYXNrKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwotCi1pbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgcGluKQotewotCWludCB2YWwsIG1hc2sgPSAxIDw8IHBpbjsKLQotCWlmIChyZWFkbChHUElPX0lPX0NPTkYpICYgbWFzaykKLQkJdmFsID0gcmVhZGwoR1BJT19EQVRBX0lOKSBeIHJlYWRsKEdQSU9fSU5fUE9MKTsKLQllbHNlCi0JCXZhbCA9IHJlYWRsKEdQSU9fT1VUKTsKLQotCXJldHVybiB2YWwgJiBtYXNrOwotfQotRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7Ci0KLXZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgcGluLCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbWFzayA9IDEgPDwgcGluOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0Jb3Jpb241eF9jbHJiaXRzKEdQSU9fQkxJTktfRU4sIG1hc2spOwotCWlmICh2YWx1ZSkKLQkJb3Jpb241eF9zZXRiaXRzKEdQSU9fT1VULCBtYXNrKTsKLQllbHNlCi0JCW9yaW9uNXhfY2xyYml0cyhHUElPX09VVCwgbWFzayk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0woZ3Bpb19zZXRfdmFsdWUpOwotCi12b2lkIG9yaW9uNXhfZ3Bpb19zZXRfYmxpbmsodW5zaWduZWQgcGluLCBpbnQgYmxpbmspCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbWFzayA9IDEgPDwgcGluOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0Jb3Jpb241eF9jbHJiaXRzKEdQSU9fT1VULCBtYXNrKTsKLQlpZiAoYmxpbmspCi0JCW9yaW9uNXhfc2V0Yml0cyhHUElPX0JMSU5LX0VOLCBtYXNrKTsKLQllbHNlCi0JCW9yaW9uNXhfY2xyYml0cyhHUElPX0JMSU5LX0VOLCBtYXNrKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChvcmlvbjV4X2dwaW9fc2V0X2JsaW5rKTsKLQotaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBwaW4sIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAocGluID49IEdQSU9fTUFYIHx8ICF0ZXN0X2JpdChwaW4sIGdwaW9fdmFsaWQpKSB7Ci0JCXByX2RlYnVnKCIlczogaW52YWxpZCBHUElPICVkXG4iLCBfX2Z1bmNfXywgcGluKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JaWYgKGdwaW9fbGFiZWxbcGluXSkgewotCQlwcl9kZWJ1ZygiJXM6IEdQSU8gJWQgYWxyZWFkeSB1c2VkIGFzICVzXG4iLAotCQkJIF9fZnVuY19fLCBwaW4sIGdwaW9fbGFiZWxbcGluXSk7Ci0JCXJldCA9IC1FQlVTWTsKLQl9IGVsc2UKLQkJZ3Bpb19sYWJlbFtwaW5dID0gbGFiZWwgPyBsYWJlbCA6ICI/IjsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7Ci0KLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIHBpbikKLXsKLQltaWdodF9zbGVlcCgpOwotCi0JaWYgKHBpbiA+PSBHUElPX01BWCB8fCAhdGVzdF9iaXQocGluLCBncGlvX3ZhbGlkKSkgewotCQlwcl9kZWJ1ZygiJXM6IGludmFsaWQgR1BJTyAlZFxuIiwgX19mdW5jX18sIHBpbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWdwaW9fbGFiZWxbcGluXSkKLQkJcHJfd2FybmluZygiJXM6IEdQSU8gJWQgYWxyZWFkeSBmcmVlZFxuIiwgX19mdW5jX18sIHBpbik7Ci0JZWxzZQotCQlncGlvX2xhYmVsW3Bpbl0gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOwotCi0vKiBEZWJ1ZyBoZWxwZXIgKi8KLXZvaWQgZ3Bpb19kaXNwbGF5KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgR1BJT19NQVg7IGkrKykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiUGluLSVkOiAiLCBpKTsKLQotCQlpZiAoIXRlc3RfYml0KGksIGdwaW9fdmFsaWQpKSB7Ci0JCQlwcmludGsoIm5vbi1HUElPXG4iKTsKLQkJfSBlbHNlIGlmICghZ3Bpb19sYWJlbFtpXSkgewotCQkJcHJpbnRrKCJHUElPLCBmcmVlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiR1BJTywgdXNlZCBieSAlcywgIiwgZ3Bpb19sYWJlbFtpXSk7Ci0JCQlpZiAocmVhZGwoR1BJT19JT19DT05GKSAmICgxIDw8IGkpKSB7Ci0JCQkJcHJpbnRrKCJpbnB1dCwgYWN0aXZlICVzLCBsZXZlbCAlcywgZWRnZSAlc1xuIiwKLQkJCQkoKHJlYWRsKEdQSU9fSU5fUE9MKSA+PiBpKSAmIDEpID8gImxvdyIgOiAiaGlnaCIsCi0JCQkJKChyZWFkbChHUElPX0xFVkVMX01BU0spID4+IGkpICYgMSkgPyAiZW5hYmxlZCIgOiAibWFza2VkIiwKLQkJCQkoKHJlYWRsKEdQSU9fRURHRV9NQVNLKSA+PiBpKSAmIDEpID8gImVuYWJsZWQiIDogIm1hc2tlZCIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoIm91dHB1dCwgdmFsPSVkXG4iLCAocmVhZGwoR1BJT19PVVQpID4+IGkpICYgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiTVBQXzBfN19DVFJMICgweCUwOHgpID0gMHglMDh4XG4iLAotCQkJCU1QUF8wXzdfQ1RSTCwgcmVhZGwoTVBQXzBfN19DVFJMKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIk1QUF84XzE1X0NUUkwgKDB4JTA4eCkgPSAweCUwOHhcbiIsCi0JCQkJTVBQXzhfMTVfQ1RSTCwgcmVhZGwoTVBQXzhfMTVfQ1RSTCkpOwotCXByaW50ayhLRVJOX0RFQlVHICJNUFBfMTZfMTlfQ1RSTCAoMHglMDh4KSA9IDB4JTA4eFxuIiwKLQkJCQlNUFBfMTZfMTlfQ1RSTCwgcmVhZGwoTVBQXzE2XzE5X0NUUkwpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTVBQX0RFVl9DVFJMICgweCUwOHgpID0gMHglMDh4XG4iLAotCQkJCU1QUF9ERVZfQ1RSTCwgcmVhZGwoTVBQX0RFVl9DVFJMKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkdQSU9fT1VUICgweCUwOHgpID0gMHglMDh4XG4iLAotCQkJCUdQSU9fT1VULCByZWFkbChHUElPX09VVCkpOwotCXByaW50ayhLRVJOX0RFQlVHICJHUElPX0lPX0NPTkYgKDB4JTA4eCkgPSAweCUwOHhcbiIsCi0JCQkJR1BJT19JT19DT05GLCByZWFkbChHUElPX0lPX0NPTkYpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiR1BJT19CTElOS19FTiAoMHglMDh4KSA9IDB4JTA4eFxuIiwKLQkJCQlHUElPX0JMSU5LX0VOLCByZWFkbChHUElPX0JMSU5LX0VOKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkdQSU9fSU5fUE9MICgweCUwOHgpID0gMHglMDh4XG4iLAotCQkJCUdQSU9fSU5fUE9MLCByZWFkbChHUElPX0lOX1BPTCkpOwotCXByaW50ayhLRVJOX0RFQlVHICJHUElPX0RBVEFfSU4gKDB4JTA4eCkgPSAweCUwOHhcbiIsCi0JCQkJR1BJT19EQVRBX0lOLCByZWFkbChHUElPX0RBVEFfSU4pKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiR1BJT19MRVZFTF9NQVNLICgweCUwOHgpID0gMHglMDh4XG4iLAotCQkJCUdQSU9fTEVWRUxfTUFTSywgcmVhZGwoR1BJT19MRVZFTF9NQVNLKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkdQSU9fRURHRV9DQVVTRSAoMHglMDh4KSA9IDB4JTA4eFxuIiwKLQkJCQlHUElPX0VER0VfQ0FVU0UsIHJlYWRsKEdQSU9fRURHRV9DQVVTRSkpOwotCXByaW50ayhLRVJOX0RFQlVHICJHUElPX0VER0VfTUFTSyAoMHglMDh4KSA9IDB4JTA4eFxuIiwKLQkJCQlHUElPX0VER0VfTUFTSywgcmVhZGwoR1BJT19FREdFX01BU0spKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA2NWRjMTM2Li5kODE4MmU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMiwxOCArMiwyNiBAQAogICogYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9ncGlvLmgKICAqCiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKLWV4dGVybiBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIHBpbiwgY29uc3QgY2hhciAqbGFiZWwpOwotZXh0ZXJuIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIHBpbik7Ci1leHRlcm4gaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIHBpbik7Ci1leHRlcm4gaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIHBpbik7Ci1leHRlcm4gdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSk7Ci1leHRlcm4gdm9pZCBvcmlvbjV4X2dwaW9fc2V0X2JsaW5rKHVuc2lnbmVkIHBpbiwgaW50IGJsaW5rKTsKLWV4dGVybiB2b2lkIGdwaW9fZGlzcGxheSh2b2lkKTsJCS8qIGRlYnVnICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19ICisKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCisjZGVmaW5lIEdQSU9fTUFYCQkzMgorI2RlZmluZSBHUElPX09VVChwaW4pCQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTAwKQorI2RlZmluZSBHUElPX0lPX0NPTkYocGluKQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTA0KQorI2RlZmluZSBHUElPX0JMSU5LX0VOKHBpbikJT1JJT041WF9ERVZfQlVTX1JFRygweDEwOCkKKyNkZWZpbmUgR1BJT19JTl9QT0wocGluKQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTBjKQorI2RlZmluZSBHUElPX0RBVEFfSU4ocGluKQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTEwKQorI2RlZmluZSBHUElPX0VER0VfQ0FVU0UocGluKQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTE0KQorI2RlZmluZSBHUElPX0VER0VfTUFTSyhwaW4pCU9SSU9ONVhfREVWX0JVU19SRUcoMHgxMTgpCisjZGVmaW5lIEdQSU9fTEVWRUxfTUFTSyhwaW4pCU9SSU9ONVhfREVWX0JVU19SRUcoMHgxMWMpCiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKGludCBwaW4pCiB7CkBAIC0yNSw0ICszMyw1IEBACiAJcmV0dXJuIGlycSAtIElSUV9PUklPTjVYX0dQSU9fU1RBUlQ7CiB9CiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvaW8uaAppbmRleCBmMjRiMjUxLi5jNDdiMDMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9pby5oCkBAIC0zOCwxNCArMzgsOSBAQAogCQlfX2lvdW5tYXAoYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2lvKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWFkZHI7Ci19Ci0KICNkZWZpbmUgX19hcmNoX2lvcmVtYXAocCwgcywgbSkJX19hcmNoX2lvcmVtYXAocCwgcywgbSkKICNkZWZpbmUgX19hcmNoX2lvdW5tYXAoYSkJX19hcmNoX2lvdW5tYXAoYSkKLSNkZWZpbmUgX19pbyhhKQkJCV9faW8oYSkKKyNkZWZpbmUgX19pbyhhKQkJCV9fdHlwZXNhZmVfaW8oYSkKICNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IGQ1YjBmYmYuLmE2ZmE5ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMyw4ICsxMyw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICiAKLSNpbmNsdWRlICJvcmlvbjV4LmgiCS8qIG5lZWQgR1BJT19NQVggKi8KLQogLyoKICAqIE9yaW9uIE1haW4gSW50ZXJydXB0IENvbnRyb2xsZXIKICAqLwpAQCAtNTQsNyArNTIsNyBAQAogICogT3Jpb24gR2VuZXJhbCBQdXJwb3NlIFBpbnMKICAqLwogI2RlZmluZSBJUlFfT1JJT041WF9HUElPX1NUQVJUCTMyCi0jZGVmaW5lIE5SX0dQSU9fSVJRUwkJR1BJT19NQVgKKyNkZWZpbmUgTlJfR1BJT19JUlFTCQkzMgogCiAjZGVmaW5lIE5SX0lSUVMJCQkoSVJRX09SSU9ONVhfR1BJT19TVEFSVCArIE5SX0dQSU9fSVJRUykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggNTRkZDc2Yi4uNTJhMjk1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC05LDggKzksNCBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL29yaW9uNXguaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCmluZGV4IDlmNWNlMWMuLjY3YmRhMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCkBAIC0xMzQsMTQgKzEzNCw2IEBACiAjZGVmaW5lIE1QUF8xNl8xOV9DVFJMCQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MDUwKQogI2RlZmluZSBNUFBfREVWX0NUUkwJCU9SSU9ONVhfREVWX0JVU19SRUcoMHgwMDgpCiAjZGVmaW5lIE1QUF9SRVNFVF9TQU1QTEUJT1JJT041WF9ERVZfQlVTX1JFRygweDAxMCkKLSNkZWZpbmUgR1BJT19PVVQJCU9SSU9ONVhfREVWX0JVU19SRUcoMHgxMDApCi0jZGVmaW5lIEdQSU9fSU9fQ09ORgkJT1JJT041WF9ERVZfQlVTX1JFRygweDEwNCkKLSNkZWZpbmUgR1BJT19CTElOS19FTgkJT1JJT041WF9ERVZfQlVTX1JFRygweDEwOCkKLSNkZWZpbmUgR1BJT19JTl9QT0wJCU9SSU9ONVhfREVWX0JVU19SRUcoMHgxMGMpCi0jZGVmaW5lIEdQSU9fREFUQV9JTgkJT1JJT041WF9ERVZfQlVTX1JFRygweDExMCkKLSNkZWZpbmUgR1BJT19FREdFX0NBVVNFCQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTE0KQotI2RlZmluZSBHUElPX0VER0VfTUFTSwkJT1JJT041WF9ERVZfQlVTX1JFRygweDExOCkKLSNkZWZpbmUgR1BJT19MRVZFTF9NQVNLCQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4MTFjKQogI2RlZmluZSBERVZfQkFOS18wX1BBUkFNCU9SSU9ONVhfREVWX0JVU19SRUcoMHg0NWMpCiAjZGVmaW5lIERFVl9CQU5LXzFfUEFSQU0JT1JJT041WF9ERVZfQlVTX1JFRygweDQ2MCkKICNkZWZpbmUgREVWX0JBTktfMl9QQVJBTQlPUklPTjVYX0RFVl9CVVNfUkVHKDB4NDY0KQpAQCAtMTQ5LDcgKzE0MSw2IEBACiAjZGVmaW5lIERFVl9CVVNfQ1RSTAkJT1JJT041WF9ERVZfQlVTX1JFRygweDRjMCkKICNkZWZpbmUgREVWX0JVU19JTlRfQ0FVU0UJT1JJT041WF9ERVZfQlVTX1JFRygweDRkMCkKICNkZWZpbmUgREVWX0JVU19JTlRfTUFTSwlPUklPTjVYX0RFVl9CVVNfUkVHKDB4NGQ0KQotI2RlZmluZSBHUElPX01BWAkJMzIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogT3Jpb24gQ1BVIEJyaWRnZSBSZWdpc3RlcnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pcnEuYwppbmRleCA2MzJhMzZmLi4wY2FhZTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2lycS5jCkBAIC0xOSwxOTMgKzE5LDM4IEBACiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KICNpbmNsdWRlICJjb21tb24uaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPcmlvbiBHUElPIElSUQotICoKLSAqIEdQSU9fSU5fUE9MIHJlZ2lzdGVyIGNvbnRyb2xscyB3aGV0aGVyIEdQSU9fREFUQV9JTiB3aWxsIGhvbGQgdGhlIHNhbWUKLSAqIHZhbHVlIG9mIHRoZSBsaW5lIG9yIHRoZSBvcHBvc2l0ZSB2YWx1ZS4KLSAqCi0gKiBMZXZlbCBJUlEgaGFuZGxlcnM6IERBVEFfSU4gaXMgdXNlZCBkaXJlY3RseSBhcyBjYXVzZSByZWdpc3Rlci4KLSAqICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IGFyZSBtYXNrZWQgYnkgTEVWRUxfTUFTSyByZWdpc3RlcnMuCi0gKiBFZGdlIElSUSBoYW5kbGVyczogIENoYW5nZSBpbiBEQVRBX0lOIGFyZSBsYXRjaGVkIGluIEVER0VfQ0FVU0UuCi0gKiAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdCBhcmUgbWFza2VkIGJ5IEVER0VfTUFTSyByZWdpc3RlcnMuCi0gKiBCb3RoLWVkZ2UgaGFuZGxlcnM6IFNpbWlsYXIgdG8gcmVndWxhciBFZGdlIGhhbmRsZXJzLCBidXQgYWxzbyBzd2FwcwotICogICAgICAgICAgICAgICAgICAgICB0aGUgcG9sYXJpdHkgdG8gY2F0Y2ggdGhlIG5leHQgbGluZSB0cmFuc2FjdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHJhY2UgY29uZGl0aW9uIHRoYXQgbWlnaHQgbm90IHBlcmZlY3RseQotICogICAgICAgICAgICAgICAgICAgICB3b3JrIG9uIHNvbWUgdXNlIGNhc2VzLgotICoKLSAqIEV2ZXJ5IGVpZ2h0IEdQSU8gbGluZXMgYXJlIGdyb3VwZWQgKE9SJ2VkKSBiZWZvcmUgZ29pbmcgdXAgdG8gbWFpbgotICogY2F1c2UgcmVnaXN0ZXIuCi0gKgotICogICAgICAgICAgICAgICAgICAgIEVER0UgIGNhdXNlICAgIG1hc2sKLSAqICAgICAgICBkYXRhLWluICAgLy0tLS0tLS0tfCB8LS0tLS18IHwtLS0tXAotICogICAgIC0tLS0tfCB8LS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgLS0tLSB0byBtYWluIGNhdXNlIHJlZwotICogICAgICAgICAgIFggICAgICBcLS0tLS0tLS0tLS0tLS0tLXwgfC0tLS0vCi0gKiAgICAgICAgcG9sYXJpdHkgICAgTEVWRUwgICAgICAgICAgbWFzawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgb3Jpb241eF9ncGlvX2lycV9hY2sodTMyIGlycSkKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCWludCBwaW4gPSBpcnFfdG9fZ3BpbyhpcnEpOwotCWlmIChpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIElSUV9MRVZFTCkKLQkJLyoKLQkJICogTWFzayBiaXQgZm9yIGxldmVsIGludGVycnVwdAotCQkgKi8KLQkJb3Jpb241eF9jbHJiaXRzKEdQSU9fTEVWRUxfTUFTSywgMSA8PCBwaW4pOwotCWVsc2UKLQkJLyoKLQkJICogQ2xlYXIgY2FzdWUgYml0IGZvciBlZ2RlIGludGVycnVwdAotCQkgKi8KLQkJb3Jpb241eF9jbHJiaXRzKEdQSU9fRURHRV9DQVVTRSwgMSA8PCBwaW4pOwotfQotCi1zdGF0aWMgdm9pZCBvcmlvbjV4X2dwaW9faXJxX21hc2sodTMyIGlycSkKLXsKLQlpbnQgcGluID0gaXJxX3RvX2dwaW8oaXJxKTsKLQlpZiAoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfTEVWRUwpCi0JCW9yaW9uNXhfY2xyYml0cyhHUElPX0xFVkVMX01BU0ssIDEgPDwgcGluKTsKLQllbHNlCi0JCW9yaW9uNXhfY2xyYml0cyhHUElPX0VER0VfTUFTSywgMSA8PCBwaW4pOwotfQotCi1zdGF0aWMgdm9pZCBvcmlvbjV4X2dwaW9faXJxX3VubWFzayh1MzIgaXJxKQotewotCWludCBwaW4gPSBpcnFfdG9fZ3BpbyhpcnEpOwotCWlmIChpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIElSUV9MRVZFTCkKLQkJb3Jpb241eF9zZXRiaXRzKEdQSU9fTEVWRUxfTUFTSywgMSA8PCBwaW4pOwotCWVsc2UKLQkJb3Jpb241eF9zZXRiaXRzKEdQSU9fRURHRV9NQVNLLCAxIDw8IHBpbik7Ci19Ci0KLXN0YXRpYyBpbnQgb3Jpb241eF9ncGlvX3NldF9pcnFfdHlwZSh1MzIgaXJxLCB1MzIgdHlwZSkKLXsKLQlpbnQgcGluID0gaXJxX3RvX2dwaW8oaXJxKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7Ci0KLQlpZiAoKHJlYWRsKEdQSU9fSU9fQ09ORikgJiAoMSA8PCBwaW4pKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib3Jpb241eF9ncGlvX3NldF9pcnFfdHlwZSBmYWlsZWQgIgotCQkJCSIoaXJxICVkLCBwaW4gJWQpLlxuIiwgaXJxLCBwaW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6Ci0JCWRlc2MtPmhhbmRsZV9pcnEgPSBoYW5kbGVfbGV2ZWxfaXJxOwotCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwotCQlvcmlvbjV4X2NscmJpdHMoR1BJT19JTl9QT0wsICgxIDw8IHBpbikpOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZV9sZXZlbF9pcnE7Ci0JCWRlc2MtPnN0YXR1cyB8PSBJUlFfTEVWRUw7Ci0JCW9yaW9uNXhfc2V0Yml0cyhHUElPX0lOX1BPTCwgKDEgPDwgcGluKSk7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6Ci0JCWRlc2MtPmhhbmRsZV9pcnEgPSBoYW5kbGVfZWRnZV9pcnE7Ci0JCWRlc2MtPnN0YXR1cyAmPSB+SVJRX0xFVkVMOwotCQlvcmlvbjV4X2NscmJpdHMoR1BJT19JTl9QT0wsICgxIDw8IHBpbikpOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZV9lZGdlX2lycTsKLQkJZGVzYy0+c3RhdHVzICY9IH5JUlFfTEVWRUw7Ci0JCW9yaW9uNXhfc2V0Yml0cyhHUElPX0lOX1BPTCwgKDEgPDwgcGluKSk7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlX2VkZ2VfaXJxOwotCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9MRVZFTDsKLQkJLyoKLQkJICogc2V0IGluaXRpYWwgcG9sYXJpdHkgYmFzZWQgb24gY3VycmVudCBpbnB1dCBsZXZlbAotCQkgKi8KLQkJaWYgKChyZWFkbChHUElPX0lOX1BPTCkgXiByZWFkbChHUElPX0RBVEFfSU4pKQotCQkgICAgJiAoMSA8PCBwaW4pKQotCQkJb3Jpb241eF9zZXRiaXRzKEdQSU9fSU5fUE9MLCAoMSA8PCBwaW4pKTsgLyogZmFsbGluZyAqLwotCQllbHNlCi0JCQlvcmlvbjV4X2NscmJpdHMoR1BJT19JTl9QT0wsICgxIDw8IHBpbikpOyAvKiByaXNpbmcgKi8KLQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBzZXQgaXJxPSVkICh0eXBlPSVkKVxuIiwgaXJxLCB0eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGVzYy0+c3RhdHVzICY9IH5JUlFfVFlQRV9TRU5TRV9NQVNLOwotCWRlc2MtPnN0YXR1cyB8PSB0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG9yaW9uNXhfZ3Bpb19pcnFfY2hpcCA9IHsKLQkubmFtZQkJPSAiT3Jpb24tSVJRLUdQSU8iLAotCS5hY2sJCT0gb3Jpb241eF9ncGlvX2lycV9hY2ssCi0JLm1hc2sJCT0gb3Jpb241eF9ncGlvX2lycV9tYXNrLAotCS51bm1hc2sJCT0gb3Jpb241eF9ncGlvX2lycV91bm1hc2ssCi0JLnNldF90eXBlCT0gb3Jpb241eF9ncGlvX3NldF9pcnFfdHlwZSwKLX07Ci0KLXN0YXRpYyB2b2lkIG9yaW9uNXhfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0JdTMyIGNhdXNlLCBvZmZzLCBwaW47Ci0KIAlCVUdfT04oaXJxIDwgSVJRX09SSU9ONVhfR1BJT18wXzcgfHwgaXJxID4gSVJRX09SSU9ONVhfR1BJT18yNF8zMSk7Ci0Jb2ZmcyA9IChpcnEgLSBJUlFfT1JJT041WF9HUElPXzBfNykgKiA4OwotCWNhdXNlID0gKHJlYWRsKEdQSU9fREFUQV9JTikgJiByZWFkbChHUElPX0xFVkVMX01BU0spKSB8Ci0JCShyZWFkbChHUElPX0VER0VfQ0FVU0UpICYgcmVhZGwoR1BJT19FREdFX01BU0spKTsKIAotCWZvciAocGluID0gb2ZmczsgcGluIDwgb2ZmcyArIDg7IHBpbisrKSB7Ci0JCWlmIChjYXVzZSAmICgxIDw8IHBpbikpIHsKLQkJCWlycSA9IGdwaW9fdG9faXJxKHBpbik7Ci0JCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQlpZiAoKGRlc2MtPnN0YXR1cyAmIElSUV9UWVBFX1NFTlNFX01BU0spID09IElSUV9UWVBFX0VER0VfQk9USCkgewotCQkJCS8qIFN3YXAgcG9sYXJpdHkgKHJhY2Ugd2l0aCBHUElPIGxpbmUpICovCi0JCQkJdTMyIHBvbGFyaXR5ID0gcmVhZGwoR1BJT19JTl9QT0wpOwotCQkJCXBvbGFyaXR5IF49IDEgPDwgcGluOwotCQkJCXdyaXRlbChwb2xhcml0eSwgR1BJT19JTl9QT0wpOwotCQkJfQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7Ci0JCX0KLQl9CisJb3Jpb25fZ3Bpb19pcnFfaGFuZGxlcigoaXJxIC0gSVJRX09SSU9ONVhfR1BJT18wXzcpIDw8IDMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb3Jpb241eF9pbml0X2dwaW9faXJxKHZvaWQpCit2b2lkIF9faW5pdCBvcmlvbjV4X2luaXRfaXJxKHZvaWQpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOworCisJb3Jpb25faXJxX2luaXQoMCwgKHZvaWQgX19pb21lbSAqKU1BSU5fSVJRX01BU0spOwogCiAJLyoKIAkgKiBNYXNrIGFuZCBjbGVhciBHUElPIElSUSBpbnRlcnJ1cHRzCiAJICovCi0Jd3JpdGVsKDB4MCwgR1BJT19MRVZFTF9NQVNLKTsKLQl3cml0ZWwoMHgwLCBHUElPX0VER0VfTUFTSyk7Ci0Jd3JpdGVsKDB4MCwgR1BJT19FREdFX0NBVVNFKTsKKwl3cml0ZWwoMHgwLCBHUElPX0xFVkVMX01BU0soMCkpOworCXdyaXRlbCgweDAsIEdQSU9fRURHRV9NQVNLKDApKTsKKwl3cml0ZWwoMHgwLCBHUElPX0VER0VfQ0FVU0UoMCkpOwogCiAJLyoKIAkgKiBSZWdpc3RlciBjaGFpbmVkIGxldmVsIGhhbmRsZXJzIGZvciBHUElPIElSUXMgYnkgZGVmYXVsdC4KIAkgKiBVc2VyIGNhbiB1c2Ugc2V0X3R5cGUoKSBpZiBoZSB3YW50cyB0byB1c2UgZWRnZSB0eXBlcyBoYW5kbGVycy4KIAkgKi8KIAlmb3IgKGkgPSBJUlFfT1JJT041WF9HUElPX1NUQVJUOyBpIDwgTlJfSVJRUzsgaSsrKSB7Ci0JCXNldF9pcnFfY2hpcChpLCAmb3Jpb241eF9ncGlvX2lycV9jaGlwKTsKKwkJc2V0X2lycV9jaGlwKGksICZvcmlvbl9ncGlvX2lycV9sZXZlbF9jaGlwKTsKIAkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOwotCQlkZXNjID0gaXJxX2Rlc2MgKyBpOwotCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCQlpcnFfZGVzY1tpXS5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOwogCX0KLQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzBfNywgb3Jpb241eF9ncGlvX2lycV9oYW5kbGVyKTsKLQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzhfMTUsIG9yaW9uNXhfZ3Bpb19pcnFfaGFuZGxlcik7Ci0Jc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX09SSU9ONVhfR1BJT18xNl8yMywgb3Jpb241eF9ncGlvX2lycV9oYW5kbGVyKTsKLQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzI0XzMxLCBvcmlvbjV4X2dwaW9faXJxX2hhbmRsZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE9yaW9uIE1haW4gSVJRCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBvcmlvbjV4X2luaXRfbWFpbl9pcnEodm9pZCkKLXsKLQlvcmlvbl9pcnFfaW5pdCgwLCAodm9pZCBfX2lvbWVtICopTUFJTl9JUlFfTUFTSyk7Ci19Ci0KLXZvaWQgX19pbml0IG9yaW9uNXhfaW5pdF9pcnEodm9pZCkKLXsKLQlvcmlvbjV4X2luaXRfbWFpbl9pcnEoKTsKLQlvcmlvbjV4X2luaXRfZ3Bpb19pcnEoKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzBfNywgZ3Bpb19pcnFfaGFuZGxlcik7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX09SSU9ONVhfR1BJT184XzE1LCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzE2XzIzLCBncGlvX2lycV9oYW5kbGVyKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfT1JJT041WF9HUElPXzI0XzMxLCBncGlvX2lycV9oYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tcHAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tcHAuYwppbmRleCA2NDBlYTJhLi5lMjNhM2Y5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXBwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21wcC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgIm1wcC5oIgpAQCAtMTUyLDcgKzE1MywxMCBAQAogCQkqcmVnICY9IH4oMHhmIDw8IHNoaWZ0KTsKIAkJKnJlZyB8PSAobnVtX3R5cGUgJiAweGYpIDw8IHNoaWZ0OwogCi0JCW9yaW9uNXhfZ3Bpb19zZXRfdmFsaWQobW9kZS0+bXBwLCAhIShtb2RlLT50eXBlID09IE1QUF9HUElPKSk7CisJCWlmIChtb2RlLT50eXBlID09IE1QUF9VTlVTRUQgJiYgKG1vZGUtPm1wcCA8IDE2IHx8IGlzXzUxODIoKSkpCisJCQlvcmlvbl9ncGlvX3NldF91bnVzZWQobW9kZS0+bXBwKTsKKworCQlvcmlvbl9ncGlvX3NldF92YWxpZChtb2RlLT5tcHAsICEhKG1vZGUtPnR5cGUgPT0gTVBQX0dQSU8pKTsKIAogCQltb2RlKys7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2RtYS5jCmluZGV4IGFjMmY3MGUuLjQyNWY3MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvZG1hLmMKQEAgLTI1LDkgKzI1LDggQEAKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogCiBzdGF0aWMgc3RydWN0IGRtYV9jaGFubmVsIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDU0NDJkMDQuLmYwOTRiZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMTYsOCArMTYsNiBAQAogCiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZmZmZmZmZmYKLQogI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTgKIAogI2RlZmluZSBETUFDX0JBU0UJCUlPX0FERFJFU1MoUE5YNDAwOF9ETUFfQ09ORklHX0JBU0UpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYzYyMDZmMi4uY2JmMDkwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvaW8uaApAQCAtMTUsNyArMTUsNyBAQAogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAotI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDU3ODlhMmQuLjBlODc3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTYsOSArMTYsNiBAQAogLyoKICAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgogICovCi0jZGVmaW5lIFBIWVNfT0ZGU0VUICAgICAoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpICgoeCkgLSBQQUdFX09GRlNFVCArIFBIWVNfT0ZGU0VUKQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpICgoeCkgKyBQQUdFX09GRlNFVCAtIFBIWVNfT0ZGU0VUKQorI2RlZmluZSBQSFlTX09GRlNFVAlVTCgweDgwMDAwMDAwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCmluZGV4IGEwNjIyMzUuLjhlZWE3MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpAQCAtMTksMjAgKzE5LDM0IEBACiBjb25maWcgQ1BVX1BYQTkzMAogCWJvb2wgIlBYQTkzMCAoY29kZW5hbWUgVGF2b3ItUCkiCiAKK2NvbmZpZyBDUFVfUFhBOTM1CisJYm9vbCAiUFhBOTM1IChjb2RlbmFtZSBUYXZvci1QNjUpIgorCiBlbmRtZW51CiAKIGVuZGlmCiAKIGNvbmZpZyBBUkNIX0dVTVNUSVgKLQlib29sICJHdW1zdGl4IFhTY2FsZSBib2FyZHMiCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhCi0JICBHdW1zdGl4IEZ1bGwgRnVuY3Rpb24gTWluYXR1cmUgQ29tcHV0ZXIuCi0KLWNvbmZpZyBNQUNIX0dVTVNUSVhfRgotCWJvb2wgIkJhc2l4LCBDb25uZXgsIHdzLTIwMGF4LCB3cy00MDBheCBzeXN0ZW1zIgotCWRlcGVuZHMgb24gQVJDSF9HVU1TVElYCisJYm9vbCAiR3Vtc3RpeCBYU2NhbGUgMjU1IGJvYXJkcyIKIAlzZWxlY3QgUFhBMjV4CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbgorCSAgQmFzaXgsIENvbm5leCwgd3MtMjAwYXgsIHdzLTQwMGF4IHN5c3RlbXMKKworY2hvaWNlCisJcHJvbXB0ICJHdW1zdGl4IENhcnJpZXIvRXhwYW5zaW9uIEJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9HVU1TVElYCisKK2NvbmZpZyBHVU1TVElYX0FNMjAwRVBECisJYm9vbCAiRW5hYmxlIEFNMjAwRVBEIGJvYXJkIHN1cHBvcnQiCisKK2VuZGNob2ljZQorCitjb25maWcgTUFDSF9JTlRFTE1PVEUyCisJYm9vbCAiSW50ZWwgTW90ZSAyIFBsYXRmb3JtIgorCXNlbGVjdCBQWEEyN3gKKwlzZWxlY3QgSVdNTVhUCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKIAogY29uZmlnIEFSQ0hfTFVCQk9DSwogCWJvb2wgIkludGVsIERCUFhBMjUwIERldmVsb3BtZW50IFBsYXRmb3JtIgpAQCAtMTk5LDYgKzIxMywxMCBAQAogY29uZmlnIFRSSVpFUFNfUFhBCiAJYm9vbCAiUFhBIGJhc2VkIEtlaXRoIHVuZCBLb2VwIFRyaXplcHMgRElNTS1Nb2R1bGVzIgogCitjb25maWcgTUFDSF9INTAwMAorCWJvb2wgIkhQIGlQQVEgaDUwMDAiCisJc2VsZWN0IFBYQTI1eAorCiBjb25maWcgTUFDSF9UUklaRVBTNAogCWJvb2wgIktlaXRoIHVuZCBLb2VwIFRyaXplcHM0IERJTU0tTW9kdWxlIgogCWRlcGVuZHMgb24gVFJJWkVQU19QWEEKQEAgLTI4Myw3ICszMDEsNiBAQAogCWJvb2wgIk1pdGFjIE1pbyBBNzAxIFN1cHBvcnQiCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBJV01NWFQKLQlzZWxlY3QgTEVEU19HUElPCiAJc2VsZWN0IEhBVkVfUFdNCiAJc2VsZWN0IEdQSU9fU1lTRlMKIAloZWxwCkBAIC0zNDIsMTAgKzM1OSw2IEBACiAKIGVuZGNob2ljZQogCi1jb25maWcgTUFDSF9BTTIwMEVQRAotCWRlcGVuZHMgb24gTUFDSF9HVU1TVElYX0YKLQlib29sICJFbmFibGUgQU0yMDBFUEQgYm9hcmQgc3VwcG9ydCIKLQogY29uZmlnIFBYQV9FWlgKIAlib29sICJNb3Rvcm9sYSBFWlggUGxhdGZvcm0iCiAJc2VsZWN0IFBYQTI3eApAQCAtMzg2LDE2ICszOTksMjUgQEAKIAogY29uZmlnIFBYQTI1eAogCWJvb2wKKwlzZWxlY3QgQ1BVX1hTQ0FMRQogCWhlbHAKIAkgIFNlbGVjdCBjb2RlIHNwZWNpZmljIHRvIFBYQTIxeC8yNXgvMjZ4IHZhcmlhbnRzCiAKIGNvbmZpZyBQWEEyN3gKIAlib29sCisJc2VsZWN0IENQVV9YU0NBTEUKIAloZWxwCiAJICBTZWxlY3QgY29kZSBzcGVjaWZpYyB0byBQWEEyN3ggdmFyaWFudHMKIAorY29uZmlnIENQVV9QWEEyNngKKwlib29sCisJc2VsZWN0IFBYQTI1eAorCWhlbHAKKwkgIFNlbGVjdCBjb2RlIHNwZWNpZmljIHRvIFBYQTI2eCAoY29kZW5hbWUgRGFsaGFydCkKKwogY29uZmlnIFBYQTN4eAogCWJvb2wKKwlzZWxlY3QgQ1BVX1hTQzMKIAloZWxwCiAJICBTZWxlY3QgY29kZSBzcGVjaWZpYyB0byBQWEEzeHggdmFyaWFudHMKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQppbmRleCBkNjRjNjhiLi43YjI4YmI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQpAQCAtMjcsNyArMjcsNyBAQAogCiAjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKIG9iai0kKENPTkZJR19BUkNIX0dVTVNUSVgpCSs9IGd1bXN0aXgubwotb2JqLSQoQ09ORklHX01BQ0hfQU0yMDBFUEQpCSs9IGFtMjAwZXBkLm8KK29iai0kKENPTkZJR19HVU1TVElYX0FNMjAwRVBEKQkrPSBhbTIwMGVwZC5vCiBvYmotJChDT05GSUdfQVJDSF9MVUJCT0NLKQkrPSBsdWJib2NrLm8KIG9iai0kKENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwKSArPSBscGQyNzAubwogb2JqLSQoQ09ORklHX01BQ0hfTUFJTlNUT05FKQkrPSBtYWluc3RvbmUubwpAQCAtMzUsNiArMzUsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfUFhBX0lEUCkJKz0gaWRwLm8KIG9iai0kKENPTkZJR19NQUNIX1RSSVpFUFM0KQkrPSB0cml6ZXBzNC5vCiBvYmotJChDT05GSUdfTUFDSF9DT0xJQlJJKQkrPSBjb2xpYnJpLm8KK29iai0kKENPTkZJR19NQUNIX0g1MDAwKQkrPSBoNTAwMC5vCiBvYmotJChDT05GSUdfUFhBX1NIQVJQX0M3eHgpCSs9IGNvcmdpLm8gc2hhcnBzbF9wbS5vIGNvcmdpX3BtLm8KIG9iai0kKENPTkZJR19QWEFfU0hBUlBfQ3h4MDApCSs9IHNwaXR6Lm8gc2hhcnBzbF9wbS5vIHNwaXR6X3BtLm8KIG9iai0kKENPTkZJR19DT1JHSV9TU1BfREVQUkVDQVRFRCkJKz0gY29yZ2lfc3NwLm8gY29yZ2lfbGNkLm8KQEAgLTY5LDYgKzcwLDggQEAKIG9iai0kKENPTkZJR19NQUNIX0NNX1gzMDApICAgICAgKz0gY20teDMwMC5vCiBvYmotJChDT05GSUdfUFhBX0VaWCkgICAgICAgICAgICs9IGV6eC5vCiAKK29iai0kKENPTkZJR19NQUNIX0lOVEVMTU9URTIpICAgKz0gaW1vdGUyLm8KKwogIyBTdXBwb3J0IGZvciBibGlua3kgbGlnaHRzCiBsZWQteSA6PSBsZWRzLm8KIGxlZC0kKENPTkZJR19BUkNIX0xVQkJPQ0spCSs9IGxlZHMtbHViYm9jay5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9hbTIwMGVwZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvYW0yMDBlcGQuYwppbmRleCBiOTY1MDg1Li43N2VlODBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9hbTIwMGVwZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2FtMjAwZXBkLmMKQEAgLTMwLDggKzMwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCisjaW5jbHVkZSA8bWFjaC9ndW1zdGl4Lmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCiAjaW5jbHVkZSA8dmlkZW8vbWV0cm9ub21lZmIuaD4KIAogc3RhdGljIHVuc2lnbmVkIGludCBwYW5lbF90eXBlID0gNjsKQEAgLTMzMSw3ICszMzUsMTYgQEAKIAkuY2xlYW51cAkJPSBhbTIwMF9jbGVhbnVwLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYW0yMDBfaW5pdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYW0yMDBfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJR1BJTzUxX0dQSU8sCisJR1BJTzQ5X0dQSU8sCisJR1BJTzQ4X0dQSU8sCisJR1BJTzMyX0dQSU8sCisJR1BJTzE3X0dQSU8sCisJR1BJTzE2X0dQSU8sCit9OworCitpbnQgX19pbml0IGFtMjAwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCkBAIC0zMzksNiArMzUyLDggQEAKIAkgKiBjcmVhdGlvbiBldmVudHMgKi8KIAlmYl9yZWdpc3Rlcl9jbGllbnQoJmFtMjAwX2ZiX25vdGlmKTsKIAorCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGFtMjAwX3Bpbl9jb25maWcpKTsKKwogCS8qIHJlcXVlc3Qgb3VyIHBsYXRmb3JtIGluZGVwZW5kZW50IGRyaXZlciAqLwogCXJlcXVlc3RfbW9kdWxlKCJtZXRyb25vbWVmYiIpOwogCkBAIC0zNjcsOCArMzgyLDYgQEAKIG1vZHVsZV9wYXJhbShwYW5lbF90eXBlLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocGFuZWxfdHlwZSwgIlNlbGVjdCB0aGUgcGFuZWwgdHlwZTogNiwgOCwgOTciKTsKIAotbW9kdWxlX2luaXQoYW0yMDBfaW5pdCk7Ci0KIE1PRFVMRV9ERVNDUklQVElPTigiYm9hcmQgZHJpdmVyIGZvciBhbTIwMCBtZXRyb25vbWUgZXBkIGtpdCIpOwogTU9EVUxFX0FVVEhPUigiSmF5YSBLdW1hciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLmMKaW5kZXggY2E4ZTIwNS4uNDBiNzc0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5jCkBAIC0xMiw1MyArMTIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsb2Nrc19sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKmNsa19sb29rdXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKQotCQlpZiAoc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmIHAtPmRldiA9PSBkZXYpCi0JCQlyZXR1cm4gcDsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCi17Ci0Jc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0KLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCXAgPSBjbGtfbG9va3VwKGRldiwgaWQpOwotCWlmICghcCkKLQkJcCA9IGNsa19sb29rdXAoTlVMTCwgaWQpOwotCWlmIChwKQotCQljbGsgPSBwOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLQotCWlmICghSVNfRVJSKGNsaykgJiYgY2xrLT5vcHMgPT0gTlVMTCkKLQkJY2xrID0gY2xrLT5vdGhlcjsKLQotCXJldHVybiBjbGs7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19nZXQpOwotCi12b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQotewotfQotRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKLQogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMTYsMzcgKzc5LDI3IEBACiAJLmRpc2FibGUJPSBjbGtfY2tlbl9kaXNhYmxlLAogfTsKIAotdm9pZCBjbGtzX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIHNpemVfdCBudW0pCit2b2lkIGNsa3NfcmVnaXN0ZXIoc3RydWN0IGNsa19sb29rdXAgKmNsa3MsIHNpemVfdCBudW0pCiB7CiAJaW50IGk7CiAKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLQkJbGlzdF9hZGQoJmNsa3NbaV0ubm9kZSwgJmNsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOworCQljbGtkZXZfYWRkKCZjbGtzW2ldKTsKIH0KIAogaW50IGNsa19hZGRfYWxpYXMoY2hhciAqYWxpYXMsIHN0cnVjdCBkZXZpY2UgKmFsaWFzX2RldiwgY2hhciAqaWQsCiAJc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBjbGsgKnIgPSBjbGtfbG9va3VwKGRldiwgaWQpOwotCXN0cnVjdCBjbGsgKm5ldzsKKwlzdHJ1Y3QgY2xrICpyID0gY2xrX2dldChkZXYsIGlkKTsKKwlzdHJ1Y3QgY2xrX2xvb2t1cCAqbDsKIAogCWlmICghcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2xrKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW5ldykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZXctPm5hbWUgPSBhbGlhczsKLQluZXctPmRldiA9IGFsaWFzX2RldjsKLQluZXctPm90aGVyID0gcjsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9hZGQoJm5ldy0+bm9kZSwgJmNsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCisJbCA9IGNsa2Rldl9hbGxvYyhyLCBhbGlhcywgYWxpYXNfZGV2ID8gZGV2X25hbWUoYWxpYXNfZGV2KSA6IE5VTEwpOworCWNsa19wdXQocik7CisJaWYgKCFsKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljbGtkZXZfYWRkKGwpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtcHhhL2Nsb2NrLmgKaW5kZXggNzNiZTc5NS4uNGU5YzYxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbG9jay5oCkBAIC0xLDYgKzEsNCBAQAotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotc3RydWN0IGNsazsKKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CiAKIHN0cnVjdCBjbGtvcHMgewogCXZvaWQJCQkoKmVuYWJsZSkoc3RydWN0IGNsayAqKTsKQEAgLTksOSArNyw2IEBACiB9OwogCiBzdHJ1Y3QgY2xrIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKIAljb25zdCBzdHJ1Y3QgY2xrb3BzCSpvcHM7CiAJdW5zaWduZWQgbG9uZwkJcmF0ZTsKIAl1bnNpZ25lZCBpbnQJCWNrZW47CkBAIC0yMCw0MSArMTUsMzEgQEAKIAlzdHJ1Y3QgY2xrCQkqb3RoZXI7CiB9OwogCi0jZGVmaW5lIElOSVRfQ0tFTihfbmFtZSwgX2NrZW4sIF9yYXRlLCBfZGVsYXksIF9kZXYpCVwKKyNkZWZpbmUgSU5JVF9DTEtSRUcoX2NsayxfZGV2bmFtZSxfY29ubmFtZSkJCVwKIAl7CQkJCQkJXAotCQkubmFtZQk9IF9uYW1lLAkJCVwKLQkJLmRldgk9IF9kZXYsCQkJCVwKKwkJLmNsawkJPSBfY2xrLAkJCVwKKwkJLmRldl9pZAkJPSBfZGV2bmFtZSwJCVwKKwkJLmNvbl9pZAkJPSBfY29ubmFtZSwJCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX0NLRU4oX25hbWUsIF9ja2VuLCBfcmF0ZSwgX2RlbGF5KQlcCitzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQlcCiAJCS5vcHMJPSAmY2xrX2NrZW5fb3BzLAkJXAogCQkucmF0ZQk9IF9yYXRlLAkJCVwKIAkJLmNrZW4JPSBDS0VOXyMjX2NrZW4sCQkJXAogCQkuZGVsYXkJPSBfZGVsYXksCQkJXAogCX0KIAotI2RlZmluZSBJTklUX0NLKF9uYW1lLCBfY2tlbiwgX29wcywgX2RldikJCVwKLQl7CQkJCQkJXAotCQkubmFtZQk9IF9uYW1lLAkJCVwKLQkJLmRldgk9IF9kZXYsCQkJCVwKKyNkZWZpbmUgREVGSU5FX0NLKF9uYW1lLCBfY2tlbiwgX29wcykJCQlcCitzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQlcCiAJCS5vcHMJPSBfb3BzLAkJCQlcCiAJCS5ja2VuCT0gQ0tFTl8jI19ja2VuLAkJCVwKIAl9CiAKLS8qCi0gKiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgdG8gYWxpYXMgb25lIGNsb2NrIGRldmljZStuYW1lIHBhaXIKLSAqIHRvIGFub3RoZXIgc3RydWN0IGNsay4KLSAqLwotI2RlZmluZSBJTklUX0NLT1RIRVIoX25hbWUsIF9vdGhlciwgX2RldikJCVwKLQl7CQkJCQkJXAotCQkubmFtZQk9IF9uYW1lLAkJCVwKLQkJLmRldgk9IF9kZXYsCQkJCVwKLQkJLm90aGVyCT0gX290aGVyLAkJCVwKLQl9Ci0KLSNkZWZpbmUgSU5JVF9DTEsoX25hbWUsIF9vcHMsIF9yYXRlLCBfZGVsYXksIF9kZXYpICAgICAgXAotCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLm5hbWUgICA9IF9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLmRldiAgICA9IF9kZXYsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLm9wcyAgICA9IF9vcHMsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLnJhdGUgICA9IF9yYXRlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgREVGSU5FX0NMSyhfbmFtZSwgX29wcywgX3JhdGUsIF9kZWxheSkJCVwKK3N0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCVwKKwkJLm9wcwk9IF9vcHMsIAkJCVwKKwkJLnJhdGUJPSBfcmF0ZSwJCQlcCiAJCS5kZWxheQk9IF9kZWxheSwJCQlcCiAJfQogCkBAIC02NCwyMCArNDksMTYgQEAKIHZvaWQgY2xrX2NrZW5fZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOwogCiAjaWZkZWYgQ09ORklHX1BYQTN4eAotI2RlZmluZSBQWEEzeHhfQ0tFTihfbmFtZSwgX2NrZW4sIF9yYXRlLCBfZGVsYXksIF9kZXYpCVwKLQl7CQkJCQkJXAotCQkubmFtZQk9IF9uYW1lLAkJCVwKLQkJLmRldgk9IF9kZXYsCQkJCVwKKyNkZWZpbmUgREVGSU5FX1BYQTNfQ0tFTihfbmFtZSwgX2NrZW4sIF9yYXRlLCBfZGVsYXkpCVwKK3N0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCVwKIAkJLm9wcwk9ICZjbGtfcHhhM3h4X2NrZW5fb3BzLAkJXAogCQkucmF0ZQk9IF9yYXRlLAkJCVwKIAkJLmNrZW4JPSBDS0VOXyMjX2NrZW4sCQkJXAogCQkuZGVsYXkJPSBfZGVsYXksCQkJXAogCX0KIAotI2RlZmluZSBQWEEzeHhfQ0soX25hbWUsIF9ja2VuLCBfb3BzLCBfZGV2KQkJXAotCXsJCQkJCQlcCi0JCS5uYW1lCT0gX25hbWUsCQkJXAotCQkuZGV2CT0gX2RldiwJCQkJXAorI2RlZmluZSBERUZJTkVfUFhBM19DSyhfbmFtZSwgX2NrZW4sIF9vcHMpCQlcCitzdHJ1Y3QgY2xrIGNsa18jI19uYW1lID0gewkJCQlcCiAJCS5vcHMJPSBfb3BzLAkJCQlcCiAJCS5ja2VuCT0gQ0tFTl8jI19ja2VuLAkJCVwKIAl9CkBAIC04Nyw3ICs2OCw3IEBACiBleHRlcm4gdm9pZCBjbGtfcHhhM3h4X2NrZW5fZGlzYWJsZShzdHJ1Y3QgY2xrICopOwogI2VuZGlmCiAKLXZvaWQgY2xrc19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGtzLCBzaXplX3QgbnVtKTsKK3ZvaWQgY2xrc19yZWdpc3RlcihzdHJ1Y3QgY2xrX2xvb2t1cCAqY2xrcywgc2l6ZV90IG51bSk7CiBpbnQgY2xrX2FkZF9hbGlhcyhjaGFyICphbGlhcywgc3RydWN0IGRldmljZSAqYWxpYXNfZGV2LCBjaGFyICppZCwKIAlzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMKaW5kZXggMGIzY2UzYi4uZDk5ZmQ5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYwpAQCAtMjEwLDEwICsyMTAsOCBAQAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY19zdG5fMzIweDI0MCA9IHsKIAkubW9kZXMJCT0gJmdlbmVyaWNfc3RuXzMyMHgyNDBfbW9kZSwKIAkubnVtX21vZGVzCT0gMSwKLQkubGNjcjAJCT0gMCwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDAzKSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikgfAotCQkJICAgTENDUjNfUENQKSwKKwkubGNkX2Nvbm4JPSBMQ0RfQ09MT1JfU1ROXzhCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwgfFwKKwkJCSAgTENEX0FDX0JJQVNfRlJFUSgweGZmKSwKIAkuY21hcF9pbnZlcnNlCT0gMCwKIAkuY21hcF9zdGF0aWMJPSAwLAogfTsKQEAgLTIzNiwxMCArMjM0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfdGZ0XzY0MHg0ODAgPSB7CiAJLm1vZGVzCQk9ICZnZW5lcmljX3RmdF82NDB4NDgwX21vZGUsCiAJLm51bV9tb2Rlcwk9IDEsCi0JLmxjY3IwCQk9IChMQ0NSMF9QQVMpLAotCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDEpIHwKLQkJCSAgIExDQ1IzX0FjYigweGZmKSB8Ci0JCQkgICBMQ0NSM19QQ1ApLAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfOEJQUCB8IExDRF9QQ0xLX0VER0VfRkFMTCB8XAorCQkJICBMQ0RfQUNfQklBU19GUkVRKDB4ZmYpLAogCS5jbWFwX2ludmVyc2UJPSAwLAogCS5jbWFwX3N0YXRpYwk9IDAsCiB9OwpAQCAtMjYzLDkgKzI1OSw3IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX2NydF82NDB4NDgwID0gewogCS5tb2RlcwkJPSAmZ2VuZXJpY19jcnRfNjQweDQ4MF9tb2RlLAogCS5udW1fbW9kZXMJPSAxLAotCS5sY2NyMAkJPSAoTENDUjBfUEFTKSwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDAxKSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikpLAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfOEJQUCB8IExDRF9BQ19CSUFTX0ZSRVEoMHhmZiksCiAJLmNtYXBfaW52ZXJzZQk9IDAsCiAJLmNtYXBfc3RhdGljCT0gMCwKIH07CkBAIC0yODksOSArMjgzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfY3J0XzgwMHg2MDAgPSB7CiAJLm1vZGVzCQk9ICZnZW5lcmljX2NydF84MDB4NjAwX21vZGUsCiAJLm51bV9tb2Rlcwk9IDEsCi0JLmxjY3IwCQk9IChMQ0NSMF9QQVMpLAotCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDIpIHwKLQkJCSAgIExDQ1IzX0FjYigweGZmKSksCisJLmxjZF9jb25uCT0gTENEX0NPTE9SX1RGVF84QlBQIHwgTENEX0FDX0JJQVNfRlJFUSgweGZmKSwKIAkuY21hcF9pbnZlcnNlCT0gMCwKIAkuY21hcF9zdGF0aWMJPSAwLAogfTsKQEAgLTMxNCwxMCArMzA2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfdGZ0XzMyMHgyNDAgPSB7CiAJLm1vZGVzCQk9ICZnZW5lcmljX3RmdF8zMjB4MjQwX21vZGUsCiAJLm51bV9tb2Rlcwk9IDEsCi0JLmxjY3IwCQk9IChMQ0NSMF9QQVMpLAotCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDYpIHwKLQkJCSAgIExDQ1IzX0FjYigweGZmKSB8Ci0JCQkgICBMQ0NSM19QQ1ApLAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfQUNfQklBU19GUkVRKDB4ZmYpLAogCS5jbWFwX2ludmVyc2UJPSAwLAogCS5jbWFwX3N0YXRpYwk9IDAsCiB9OwpAQCAtMzQxLDkgKzMzMCw3IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX3N0bl82NDB4NDgwID0gewogCS5tb2RlcwkJPSAmZ2VuZXJpY19zdG5fNjQweDQ4MF9tb2RlLAogCS5udW1fbW9kZXMJPSAxLAotCS5sY2NyMAkJPSAwLAotCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDIpIHwKLQkJCSAgIExDQ1IzX0FjYigweGZmKSksCisJLmxjZF9jb25uCT0gTENEX0NPTE9SX1NUTl84QlBQIHwgTENEX0FDX0JJQVNfRlJFUSgweGZmKSwKIAkuY21hcF9pbnZlcnNlCT0gMCwKIAkuY21hcF9zdGF0aWMJPSAwLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYwppbmRleCBkZWI0NmNkLi5mZjBjNTc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMzAwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CkBAIC0xMzcsNiArMTM2LDEwIEBACiAJR1BJTzgyX0dQSU8gfCBNRlBfUFVMTF9ISUdILAkvKiBNTUMgQ0QgKi8KIAlHUElPODVfR1BJTywJCQkvKiBNTUMgV1AgKi8KIAlHUElPOTlfR1BJTywJCQkvKiBFdGhlcm5ldCBJUlEgKi8KKworCS8qIFN0YW5kYXJkIEkyQyAqLworCUdQSU8yMV9JMkNfU0NMLAorCUdQSU8yMl9JMkNfU0RBLAogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0RNOTAwMCkgfHwgZGVmaW5lZChDT05GSUdfRE05MDAwX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCmluZGV4IDY1NTU4ZDYuLmM1ZTI4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgpAQCAtNTQxLDExICs1NDIsNDIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3JnaV9pbml0X3NwaSh2b2lkKSB7fQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzaGFycHNsX3JvbV9wYXJ0c1tdID0geworCXsKKwkJLm5hbWUJPSJCb290IFBST00gRmlsZXN5c3RlbSIsCisJCS5vZmZzZXQJPSAweDAwMTIwMDAwLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHNoYXJwc2xfcm9tX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShzaGFycHNsX3JvbV9wYXJ0cyksCisJLnBhcnRzCQk9IHNoYXJwc2xfcm9tX3BhcnRzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaGFycHNsX3JvbV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4MDAwMDAwMDAsCisJCS5lbmQJPSAweDAwN2ZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2hhcnBzbF9yb21fZGV2aWNlID0geworCS5uYW1lCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAk9IC0xLAorCS5yZXNvdXJjZSA9IHNoYXJwc2xfcm9tX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoc2hhcnBzbF9yb21fcmVzb3VyY2VzKSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmc2hhcnBzbF9yb21fZGF0YSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmY29yZ2lzY29vcF9kZXZpY2UsCiAJJmNvcmdpZmJfZGV2aWNlLAogCSZjb3JnaWtiZF9kZXZpY2UsCiAJJmNvcmdpbGVkX2RldmljZSwKKwkmc2hhcnBzbF9yb21fZGV2aWNlLAogfTsKIAogc3RhdGljIHZvaWQgY29yZ2lfcG93ZXJvZmYodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NwdWZyZXEtcHhhMnh4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTJ4eC5jCmluZGV4IDFmMjcyZWEuLjc3MWRkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NwdWZyZXEtcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEyeHguYwpAQCAtNjQsNyArNjQsNyBAQAogCiAvKiBEZWZpbmUgdGhlIHJlZnJlc2ggcGVyaW9kIGluIG1TZWMgZm9yIHRoZSBTRFJBTSBhbmQgdGhlIG51bWJlciBvZiByb3dzICovCiAjZGVmaW5lIFNEUkFNX1RSRUYJNjQJLyogc3RhbmRhcmQgNjRtcyBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9ST1dTCTQwOTYJLyogNjRNQj04MTkyIDMyTUI9NDA5NiAqLworc3RhdGljIHVuc2lnbmVkIGludCBzZHJhbV9yb3dzOwogCiAjZGVmaW5lIENDTEtDRkdfVFVSQk8JCTB4MQogI2RlZmluZSBDQ0xLQ0ZHX0ZDUwkJMHgyCkBAIC03Myw2ICs3Myw5IEBACiAjZGVmaW5lIE1EUkVGUl9EQjJfTUFTSwkJKE1EUkVGUl9LMkRCMiB8IE1EUkVGUl9LMURCMikKICNkZWZpbmUgTURSRUZSX0RSSV9NQVNLCQkweEZGRgogCisjZGVmaW5lIE1EQ05GR19EUkFDMihtZGNuZmcpICgoKG1kY25mZykgPj4gMjEpICYgMHgzKQorI2RlZmluZSBNRENORkdfRFJBQzAobWRjbmZnKSAoKChtZGNuZmcpID4+IDUpICYgMHgzKQorCiAvKgogICogUFhBMjU1IGRlZmluaXRpb25zCiAgKi8KQEAgLTEwOSw2ICsxMTIsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUKIAlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtOVU1fUFhBMjV4X1RVUkJPX0ZSRVFTKzFdOwogCitzdGF0aWMgdW5zaWduZWQgaW50IHB4YTI1NV90dXJib190YWJsZTsKK21vZHVsZV9wYXJhbShweGEyNTVfdHVyYm9fdGFibGUsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhweGEyNTVfdHVyYm9fdGFibGUsICJTZWxlY3RzIHRoZSBmcmVxdWVuY3kgdGFibGUgKDAgPSBydW4gdGFibGUsICEwID0gdHVyYm8gdGFibGUpIik7CisKIC8qCiAgKiBQWEEyNzAgZGVmaW5pdGlvbnMKICAqCkBAIC0xNTgsMjIgKzE2NSwxNiBAQAogCiBleHRlcm4gdW5zaWduZWQgZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KGludCBpbmZvKTsKIAotc3RhdGljIHZvaWQgZmluZF9mcmVxX3RhYmxlcyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKLQkJCSAgICAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICoqZnJlcV90YWJsZSwKK3N0YXRpYyB2b2lkIGZpbmRfZnJlcV90YWJsZXMoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICoqZnJlcV90YWJsZSwKIAkJCSAgICAgcHhhX2ZyZXFzX3QgKipweGFfZnJlcXMpCiB7CiAJaWYgKGNwdV9pc19weGEyNXgoKSkgewotCQlpZiAocG9saWN5LT5wb2xpY3kgPT0gQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0UpIHsKKwkJaWYgKCFweGEyNTVfdHVyYm9fdGFibGUpIHsKIAkJCSpweGFfZnJlcXMgPSBweGEyNTVfcnVuX2ZyZXFzOwogCQkJKmZyZXFfdGFibGUgPSBweGEyNTVfcnVuX2ZyZXFfdGFibGU7Ci0JCX0gZWxzZSBpZiAocG9saWN5LT5wb2xpY3kgPT0gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFKSB7CisJCX0gZWxzZSB7CiAJCQkqcHhhX2ZyZXFzID0gcHhhMjU1X3R1cmJvX2ZyZXFzOwogCQkJKmZyZXFfdGFibGUgPSBweGEyNTVfdHVyYm9fZnJlcV90YWJsZTsKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiQ1BVIFBYQTogVW5rbm93biBwb2xpY3kgZm91bmQuICIKLQkJCSAgICAgICAiVXNpbmcgQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0VcbiIpOwotCQkJKnB4YV9mcmVxcyA9IHB4YTI1NV9ydW5fZnJlcXM7Ci0JCQkqZnJlcV90YWJsZSA9IHB4YTI1NV9ydW5fZnJlcV90YWJsZTsKIAkJfQogCX0KIAlpZiAoY3B1X2lzX3B4YTI3eCgpKSB7CkBAIC0xOTQsMTQgKzE5NSwyOCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaW5pdF9zZHJhbV9yb3dzKHZvaWQpCit7CisJdWludDMyX3QgbWRjbmZnID0gTURDTkZHOworCXVuc2lnbmVkIGludCBkcmFjMiA9IDAsIGRyYWMwID0gMDsKKworCWlmIChtZGNuZmcgJiAoTURDTkZHX0RFMiB8IE1EQ05GR19ERTMpKQorCQlkcmFjMiA9IE1EQ05GR19EUkFDMihtZGNuZmcpOworCisJaWYgKG1kY25mZyAmIChNRENORkdfREUwIHwgTURDTkZHX0RFMSkpCisJCWRyYWMwID0gTURDTkZHX0RSQUMwKG1kY25mZyk7CisKKwlzZHJhbV9yb3dzID0gMSA8PCAoMTEgKyBtYXgoZHJhYzAsIGRyYWMyKSk7Cit9CisKIHN0YXRpYyB1MzIgbWRyZWZyX2RyaSh1bnNpZ25lZCBpbnQgZnJlcSkKIHsKIAl1MzIgZHJpID0gMDsKIAogCWlmIChjcHVfaXNfcHhhMjV4KCkpCi0JCWRyaSA9ICgoZnJlcSAqIFNEUkFNX1RSRUYpIC8gKFNEUkFNX1JPV1MgKiAzMikpOworCQlkcmkgPSAoKGZyZXEgKiBTRFJBTV9UUkVGKSAvIChzZHJhbV9yb3dzICogMzIpKTsKIAlpZiAoY3B1X2lzX3B4YTI3eCgpKQotCQlkcmkgPSAoKGZyZXEgKiBTRFJBTV9UUkVGKSAvIChTRFJBTV9ST1dTIC0gMzEpKSAvIDMyOworCQlkcmkgPSAoKGZyZXEgKiBTRFJBTV9UUkVGKSAvIChzZHJhbV9yb3dzIC0gMzEpKSAvIDMyOwogCXJldHVybiBkcmk7CiB9CiAKQEAgLTIxMiw3ICsyMjcsNyBAQAogCXB4YV9mcmVxc190ICpweGFfZnJlcXM7CiAJaW50IHJldDsKIAotCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFzKTsKKwlmaW5kX2ZyZXFfdGFibGVzKCZweGFfZnJlcXNfdGFibGUsICZweGFfZnJlcXMpOwogCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHB4YV9mcmVxc190YWJsZSk7CiAKIAlpZiAoZnJlcV9kZWJ1ZykKQEAgLTI0MCw3ICsyNTUsNyBAQAogCXVuc2lnbmVkIGludCB1bnVzZWQsIHByZXNldF9tZHJlZnIsIHBvc3RzZXRfbWRyZWZyLCBjY2xrY2ZnOwogCiAJLyogR2V0IHRoZSBjdXJyZW50IHBvbGljeSAqLwotCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFfc2V0dGluZ3MpOworCWZpbmRfZnJlcV90YWJsZXMoJnB4YV9mcmVxc190YWJsZSwgJnB4YV9mcmVxX3NldHRpbmdzKTsKIAogCS8qIExvb2t1cCB0aGUgbmV4dCBmcmVxdWVuY3kgKi8KIAlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgcHhhX2ZyZXFzX3RhYmxlLApAQCAtMzI5LDExICszNDQsMTUgQEAKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgZnJlcTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnB4YTI1NV9mcmVxX3RhYmxlOworCXB4YV9mcmVxc190ICpweGEyNTVfZnJlcXM7CiAKIAkvKiB0cnkgdG8gZ3Vlc3MgcHhhMjd4IGNwdSAqLwogCWlmIChjcHVfaXNfcHhhMjd4KCkpCiAJCXB4YTI3eF9ndWVzc19tYXhfZnJlcSgpOwogCisJaW5pdF9zZHJhbV9yb3dzKCk7CisKIAkvKiBzZXQgZGVmYXVsdCBwb2xpY3kgYW5kIGNwdWluZm8gKi8KIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMTAwMDsgLyogRklYTUU6IDEgbXMsIGFzc3VtZWQgKi8KIAlwb2xpY3ktPmN1ciA9IGdldF9jbGtfZnJlcXVlbmN5X2toeigwKTsJICAgLyogY3VycmVudCBmcmVxICovCkBAIC0zNTQsNiArMzczLDggQEAKIAl9CiAJcHhhMjU1X3R1cmJvX2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CiAKKwlweGEyNTVfdHVyYm9fdGFibGUgPSAhIXB4YTI1NV90dXJib190YWJsZTsKKwogCS8qIEdlbmVyYXRlIHRoZSBweGEyN3ggY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc3RydWN0ICovCiAJZm9yIChpID0gMDsgaSA8IE5VTV9QWEEyN3hfRlJFUVM7IGkrKykgewogCQlmcmVxID0gcHhhMjd4X2ZyZXFzW2ldLmtoejsKQEAgLTM2OCw4ICszODksMTIgQEAKIAkgKiBTZXQgdGhlIHBvbGljeSdzIG1pbmltdW0gYW5kIG1heGltdW0gZnJlcXVlbmNpZXMgZnJvbSB0aGUgdGFibGVzCiAJICoganVzdCBjb25zdHJ1Y3RlZC4gIFRoaXMgc2V0cyBjcHVpbmZvLm14eF9mcmVxLCBtaW4gYW5kIG1heC4KIAkgKi8KLQlpZiAoY3B1X2lzX3B4YTI1eCgpKQotCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgcHhhMjU1X3J1bl9mcmVxX3RhYmxlKTsKKwlpZiAoY3B1X2lzX3B4YTI1eCgpKSB7CisJCWZpbmRfZnJlcV90YWJsZXMoJnB4YTI1NV9mcmVxX3RhYmxlLCAmcHhhMjU1X2ZyZXFzKTsKKwkJcHJfaW5mbygiUFhBMjU1IGNwdWZyZXEgdXNpbmcgJXMgZnJlcXVlbmN5IHRhYmxlXG4iLAorCQkJcHhhMjU1X3R1cmJvX3RhYmxlID8gInR1cmJvIiA6ICJydW4iKTsKKwkJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHB4YTI1NV9mcmVxX3RhYmxlKTsKKwl9CiAJZWxzZSBpZiAoY3B1X2lzX3B4YTI3eCgpKQogCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgcHhhMjd4X2ZyZXFfdGFibGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmMKaW5kZXggMzU3MzZmYy4uZTE2ZjhlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuYwpAQCAtNCwxMyArNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL2lyZGEuaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvb2hjaS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMjd4X2tleXBhZC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4X3NwaS5oPgpAQCAtMTU2LDggKzE1NSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX3Jlc291cmNlX2ZmdWFydFtdID0gewogCXsKLQkJLnN0YXJ0CT0gX19QUkVHKEZGVUFSVCksCi0JCS5lbmQJPSBfX1BSRUcoRkZVQVJUKSArIDM1LAorCQkuc3RhcnQJPSAweDQwMTAwMDAwLAorCQkuZW5kCT0gMHg0MDEwMDAyMywKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgewogCQkuc3RhcnQJPSBJUlFfRkZVQVJULApAQCAtMTc1LDggKzE3NCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX3Jlc291cmNlX2J0dWFydFtdID0gewogCXsKLQkJLnN0YXJ0CT0gX19QUkVHKEJUVUFSVCksCi0JCS5lbmQJPSBfX1BSRUcoQlRVQVJUKSArIDM1LAorCQkuc3RhcnQJPSAweDQwMjAwMDAwLAorCQkuZW5kCT0gMHg0MDIwMDAyMywKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgewogCQkuc3RhcnQJPSBJUlFfQlRVQVJULApAQCAtMTk0LDggKzE5Myw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX3Jlc291cmNlX3N0dWFydFtdID0gewogCXsKLQkJLnN0YXJ0CT0gX19QUkVHKFNUVUFSVCksCi0JCS5lbmQJPSBfX1BSRUcoU1RVQVJUKSArIDM1LAorCQkuc3RhcnQJPSAweDQwNzAwMDAwLAorCQkuZW5kCT0gMHg0MDcwMDAyMywKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgewogCQkuc3RhcnQJPSBJUlFfU1RVQVJULApAQCAtMjEzLDggKzIxMiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX3Jlc291cmNlX2h3dWFydFtdID0gewogCXsKLQkJLnN0YXJ0CT0gX19QUkVHKEhXVUFSVCksCi0JCS5lbmQJPSBfX1BSRUcoSFdVQVJUKSArIDQ3LAorCQkuc3RhcnQJPSAweDQxNjAwMDAwLAorCQkuZW5kCT0gMHg0MTYwMDAyRiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwgewogCQkuc3RhcnQJPSBJUlFfSFdVQVJULApAQCAtMjQ5LDE4ICsyNDgsNTMgQEAKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocHhhaTJjX3Jlc291cmNlcyksCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBweGEyN3hfaTJjX21mcF9jZmdbXSA9IHsKLQlHUElPMTE3X0kyQ19TQ0wsCi0JR1BJTzExOF9JMkNfU0RBLAotfTsKLQogdm9pZCBfX2luaXQgcHhhX3NldF9pMmNfaW5mbyhzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhICppbmZvKQogewotCWlmIChjcHVfaXNfcHhhMjd4KCkpCi0JCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKHB4YTI3eF9pMmNfbWZwX2NmZykpOwogCXB4YV9yZWdpc3Rlcl9kZXZpY2UoJnB4YV9kZXZpY2VfaTJjLCBpbmZvKTsKIH0KIAorI2lmZGVmIENPTkZJR19QWEEyN3gKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhMjd4X3Jlc291cmNlc19pMmNfcG93ZXJbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4NDBmMDAxODAsCisJCS5lbmQJPSAweDQwZjAwMWEzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IElSUV9QV1JJMkMsCisJCS5lbmQJPSBJUlFfUFdSSTJDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEyN3hfZGV2aWNlX2kyY19wb3dlciA9IHsKKwkubmFtZQkJPSAicHhhMnh4LWkyYyIsCisJLmlkCQk9IDEsCisJLnJlc291cmNlCT0gcHhhMjd4X3Jlc291cmNlc19pMmNfcG93ZXIsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHB4YTI3eF9yZXNvdXJjZXNfaTJjX3Bvd2VyKSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QWEEzeHgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhM3h4X3Jlc291cmNlc19pMmNfcG93ZXJbXSA9IHsKKwl7CisJCS5zdGFydCAgPSAweDQwZjUwMGMwLAorCQkuZW5kICAgID0gMHg0MGY1MDBkMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJPSBJUlFfUFdSSTJDLAorCQkuZW5kCT0gSVJRX1BXUkkyQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhM3h4X2RldmljZV9pMmNfcG93ZXIgPSB7CisJLm5hbWUJCT0gInB4YTJ4eC1pMmMiLAorCS5pZAkJPSAxLAorCS5yZXNvdXJjZQk9IHB4YTN4eF9yZXNvdXJjZXNfaTJjX3Bvd2VyLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShweGEzeHhfcmVzb3VyY2VzX2kyY19wb3dlciksCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhaTJzX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0CT0gMHg0MDQwMDAwMCwKQEAgLTI5NiwxMSArMzMwLDM2IEBACiAJcHhhX3JlZ2lzdGVyX2RldmljZSgmcHhhX2RldmljZV9maWNwLCBpbmZvKTsKIH0KIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGFfZGV2aWNlX3J0YyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX3J0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgPSAweDQwOTAwMDAwLAorCQkuZW5kCT0gMHg0MDkwMDAwMCArIDB4M2IsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IElSUV9SVEMxSHosCisJCS5lbmQgICAgPSBJUlFfUlRDMUh6LAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCAgPSBJUlFfUlRDQWxybSwKKwkJLmVuZCAgICA9IElSUV9SVENBbHJtLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMTAwX2RldmljZV9ydGMgPSB7CiAJLm5hbWUJCT0gInNhMTEwMC1ydGMiLAogCS5pZAkJPSAtMSwKIH07CiAKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhX2RldmljZV9ydGMgPSB7CisJLm5hbWUJCT0gInB4YS1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHB4YV9ydGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBweGFfcnRjX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHhhX2FjOTdfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQgID0gMHg0MDUwMDAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuaAppbmRleCBiYjA0YWY0Li5lY2MyNGE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZGV2aWNlcy5oCkBAIC0xMSw2ICsxMSw3IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGFfZGV2aWNlX2kyYzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHB4YV9kZXZpY2VfaTJzOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhX2RldmljZV9maWNwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2ExMTAwX2RldmljZV9ydGM7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGFfZGV2aWNlX3J0YzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHB4YV9kZXZpY2VfYWM5NzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9kbWEuYwppbmRleCBjMGJlMTdlLi5iMTUxNGZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9kbWEuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lMzMwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lMzMwLmMKaW5kZXggZDQ4OGVkZS4uMWJkN2Y3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZTMzMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2UzMzAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgdGhlIFRvc2hpYmEgZXNlcmllcyBQREFzCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgdGhlIFRvc2hpYmEgZTMzMCBQREFzCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAzIElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CiAgKgpAQCAtMTIsNiArMTIsOSBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90YzYzODd4Yi5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTksMTMgKzIyLDQ0IEBACiAKICNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJlc2VyaWVzLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gZTMzMCB0YzYzODd4YiBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdGM2Mzg3eGJfcGxhdGZvcm1fZGF0YSBlMzMwX3RjNjM4N3hiX2luZm8gPSB7CisJLmVuYWJsZSAgID0gJmVzZXJpZXNfdG1pb19lbmFibGUsCisJLmRpc2FibGUgID0gJmVzZXJpZXNfdG1pb19kaXNhYmxlLAorCS5zdXNwZW5kICA9ICZlc2VyaWVzX3RtaW9fc3VzcGVuZCwKKwkucmVzdW1lICAgPSAmZXNlcmllc190bWlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGUzMzBfdGM2Mzg3eGJfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJ0YzYzODd4YiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZlMzMwX3RjNjM4N3hiX2luZm8sCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDIsCisJLnJlc291cmNlICAgICAgPSBlc2VyaWVzX3RtaW9fcmVzb3VyY2VzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZTMzMF90YzYzODd4Yl9kZXZpY2UsCit9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZTMzMF9pbml0KHZvaWQpCiB7CisJZXNlcmllc19yZWdpc3Rlcl9jbGtzKCk7CisJZXNlcmllc19nZXRfdG1pb19ncGlvcygpOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCXB4YV9zZXRfdWRjX2luZm8oJmU3eHhfdWRjX21hY2hfaW5mbyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYwppbmRleCA4ZWNiYzU0Li4yNTExMjkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lMzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciB0aGUgVG9zaGliYSBlc2VyaWVzIFBEQXMKKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciB0aGUgVG9zaGliYSBlMzUwIFBEQXMKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KICAqCkBAIC0xMiwyMCArMTIsNTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdDdsNjZ4Yi5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJlc2VyaWVzLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gZTM1MCB0N2w2NnhiIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0N2w2NnhiX3BsYXRmb3JtX2RhdGEgZTM1MF90N2w2NnhiX2luZm8gPSB7CisJLmlycV9iYXNlICAgICAgICAgICAgICAgPSBJUlFfQk9BUkRfU1RBUlQsCisJLmVuYWJsZSAgICAgICAgICAgICAgICAgPSAmZXNlcmllc190bWlvX2VuYWJsZSwKKwkuc3VzcGVuZCAgICAgICAgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fc3VzcGVuZCwKKwkucmVzdW1lICAgICAgICAgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZTM1MF90N2w2NnhiX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAidDdsNjZ4YiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZlMzUwX3Q3bDY2eGJfaW5mbywKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMiwKKwkucmVzb3VyY2UgICAgICA9IGVzZXJpZXNfdG1pb19yZXNvdXJjZXMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZTM1MF90N2w2NnhiX2RldmljZSwKK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlMzUwX2luaXQodm9pZCkKIHsKKwllc2VyaWVzX3JlZ2lzdGVyX2Nsa3MoKTsKKwllc2VyaWVzX2dldF90bWlvX2dwaW9zKCk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAJcHhhX3NldF91ZGNfaW5mbygmZTd4eF91ZGNfbWFjaF9pbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jCmluZGV4IDU0NGJiYWEuLmJlZDAzMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMKQEAgLTEyLDIwICsxMiwyNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90N2w2NnhiLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQorI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZXNlcmllcy5oIgorI2luY2x1ZGUgImNsb2NrLmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFNDAwIExDRCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNDYsNyArNTIsNyBAQAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZTQwMF9weGFmYl9tYWNoX2luZm8gPSB7CiAJLm1vZGVzICAgICAgICAgID0gJmU0MDBfcHhhZmJfbW9kZV9pbmZvLAogCS5udW1fbW9kZXMgICAgICA9IDEsCi0JLmxjY3IwICAgICAgICAgID0gTENDUjBfQ29sb3IgfCBMQ0NSMF9TbmdsIHwgTENDUjBfQWN0LAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfMTZCUFAsCiAJLmxjY3IzICAgICAgICAgID0gMCwKIAkucHhhZmJfYmFja2xpZ2h0X3Bvd2VyICA9IE5VTEwsCiB9OwpAQCAtNjUsNyArNzEsMTAgQEAKIAlHUElPNDJfQlRVQVJUX1JYRCwKIAlHUElPNDNfQlRVQVJUX1RYRCwKIAlHUElPNDRfQlRVQVJUX0NUUywKLQlHUElPNDVfR1BJTywgLyogVXNlZCBieSBUTUlPIGZvciAjU1VTUEVORCAqLworCisJLyogVE1JTyBjb250cm9sbGVyICovCisJR1BJTzE5X0dQSU8sIC8qIHQ3bDY2eGIgI1BDTFIgKi8KKwlHUElPNDVfR1BJTywgLyogdDdsNjZ4YiAjU1VTUEVORCAoTk9UIEJUVUFSVCEpICovCiAKIAkvKiB3YWtldXAgKi8KIAlHUElPMF9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwKQEAgLTczLDEwICs4Miw2MCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25fYSA9IHsKKwkubmFtZSA9ICJJbnRlcm5hbCBOQU5EIGZsYXNoIiwKKwkub2Zmc2V0ID0gIDAsCisJLnNpemUgPSAgTVREUEFSVF9TSVpfRlVMTCwKK307CisKK3N0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmLCAweGZmIH07CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgZTQwMF90N2w2NnhiX25hbmRfYmJ0ID0geworCS5vcHRpb25zID0gMCwKKwkub2ZmcyA9IDQsCisJLmxlbiA9IDIsCisJLnBhdHRlcm4gPSBzY2FuX2ZmX3BhdHRlcm4KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG1pb19uYW5kX2RhdGEgZTQwMF90N2w2NnhiX25hbmRfY29uZmlnID0geworCS5udW1fcGFydGl0aW9ucyA9IDEsCisJLnBhcnRpdGlvbiA9ICZwYXJ0aXRpb25fYSwKKwkuYmFkYmxvY2tfcGF0dGVybiA9ICZlNDAwX3Q3bDY2eGJfbmFuZF9iYnQsCit9OworCitzdGF0aWMgc3RydWN0IHQ3bDY2eGJfcGxhdGZvcm1fZGF0YSBlNDAwX3Q3bDY2eGJfaW5mbyA9IHsKKwkuaXJxX2Jhc2UgCQk9IElSUV9CT0FSRF9TVEFSVCwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fZW5hYmxlLAorCS5zdXNwZW5kICAgICAgICAgICAgICAgID0gJmVzZXJpZXNfdG1pb19zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICAgICAgICAgID0gJmVzZXJpZXNfdG1pb19yZXN1bWUsCisKKwkubmFuZF9kYXRhICAgICAgICAgICAgICA9ICZlNDAwX3Q3bDY2eGJfbmFuZF9jb25maWcsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlNDAwX3Q3bDY2eGJfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJ0N2w2NnhiIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmU0MDBfdDdsNjZ4Yl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSAgICAgID0gZXNlcmllc190bWlvX3Jlc291cmNlcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZlNDAwX3Q3bDY2eGJfZGV2aWNlLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGU0MDBfaW5pdCh2b2lkKQogewogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGU0MDBfcGluX2NvbmZpZykpOworCS8qIEZpeG1lIC0gZTQwMCBtYXkgaGF2ZSBhIHN3aXRjaGVkIGNsb2NrICovCisJZXNlcmllc19yZWdpc3Rlcl9jbGtzKCk7CisJZXNlcmllc19nZXRfdG1pb19ncGlvcygpOwogCXNldF9weGFfZmJfaW5mbygmZTQwMF9weGFmYl9tYWNoX2luZm8pOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCXB4YV9zZXRfdWRjX2luZm8oJmU3eHhfdWRjX21hY2hfaW5mbyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYwppbmRleCBjNTdhMTViLi5iMDBkNjcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdDdsNjZ4Yi5oPgogCiAjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CiAKQEAgLTIzLDEyICsyNSwxNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL2lyZGEuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJlc2VyaWVzLmgiCi0KKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGU3NDAgdmlkZW8gc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTE2LDcgKzEyMiwxNyBAQAogCUdQSU80Ml9CVFVBUlRfUlhELAogCUdQSU80M19CVFVBUlRfVFhELAogCUdQSU80NF9CVFVBUlRfQ1RTLAotCUdQSU80NV9HUElPLCAvKiBVc2VkIGJ5IFRNSU8gZm9yICNTVVNQRU5EICovCisKKwkvKiBUTUlPIGNvbnRyb2xsZXIgKi8KKwlHUElPMTlfR1BJTywgLyogdDdsNjZ4YiAjUENMUiAqLworCUdQSU80NV9HUElPLCAvKiB0N2w2NnhiICNTVVNQRU5EIChOT1QgQlRVQVJUISkgKi8KKworCS8qIFVEQyAqLworCUdQSU8xM19HUElPLAorCUdQSU8zX0dQSU8sCisKKwkvKiBJckRBICovCisJR1BJTzM4X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0hJR0gsCiAKIAkvKiBQQyBDYXJkICovCiAJR1BJTzhfR1BJTywgICAvKiBDRDAgKi8KQEAgLTE0MiwxNyArMTU4LDQzIEBACiAJR1BJTzBfR1BJTyB8IFdBS0VVUF9PTl9FREdFX1JJU0UsCiB9OwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBlNzQwIHQ3bDY2eGIgcGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHQ3bDY2eGJfcGxhdGZvcm1fZGF0YSBlNzQwX3Q3bDY2eGJfaW5mbyA9IHsKKwkuaXJxX2Jhc2UgCQk9IElSUV9CT0FSRF9TVEFSVCwKKwkuZW5hYmxlICAgICAgICAgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fZW5hYmxlLAorCS5zdXNwZW5kICAgICAgICAgICAgICAgID0gJmVzZXJpZXNfdG1pb19zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICAgICAgICAgID0gJmVzZXJpZXNfdG1pb19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlNzQwX3Q3bDY2eGJfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJ0N2w2NnhiIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmU3NDBfdDdsNjZ4Yl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSAgICAgID0gZXNlcmllc190bWlvX3Jlc291cmNlcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmZTc0MF9mYl9kZXZpY2UsCisJJmU3NDBfdDdsNjZ4Yl9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZTc0MF9pbml0KHZvaWQpCiB7CiAJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZTc0MF9waW5fY29uZmlnKSk7CisJZXNlcmllc19yZWdpc3Rlcl9jbGtzKCk7CisJY2xrX2FkZF9hbGlhcygiQ0xLX0NLNDhNIiwgJmU3NDBfdDdsNjZ4Yl9kZXZpY2UuZGV2LAorCQkJIlVEQ0NMSyIsICZweGEyNXhfZGV2aWNlX3VkYy5kZXYpLAorCWVzZXJpZXNfZ2V0X3RtaW9fZ3Bpb3MoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAlweGFfc2V0X3VkY19pbmZvKCZlN3h4X3VkY19tYWNoX2luZm8pOworCWU3eHhfaXJkYV9pbml0KCk7CisJcHhhX3NldF9maWNwX2luZm8oJmU3eHhfZmljcF9wbGF0Zm9ybV9kYXRhKTsKIH0KIAogTUFDSElORV9TVEFSVChFNzQwLCAiVG9zaGliYSBlNzQwIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYwppbmRleCA2NDBlNzM4Li44NGQ3YzFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdGM2MzkzeGIuaD4KIAogI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgogCkBAIC0yMywxMSArMjQsMTUgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9pcmRhLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZXNlcmllcy5oIgorI2luY2x1ZGUgImNsb2NrLmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTc1MCBMQ0QgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTAwLDE2ICsxMDUsNDUgQEAKIAkucmVzb3VyY2UgICAgICAgPSBlNzUwX2ZiX3Jlc291cmNlcywKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBlNzUwIHRjNjM5M3hiIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdGM2MzkzeGJfcGxhdGZvcm1fZGF0YSBlNzUwX3RjNjM5M3hiX2luZm8gPSB7CisJLmlycV9iYXNlICAgICAgID0gSVJRX0JPQVJEX1NUQVJULAorCS5zY3JfcGxsMmNyICAgICA9IDB4MGNjMSwKKwkuc2NyX2dwZXIgICAgICAgPSAwLAorCS5ncGlvX2Jhc2UgICAgICA9IC0xLAorCS5zdXNwZW5kICAgICAgICA9ICZlc2VyaWVzX3RtaW9fc3VzcGVuZCwKKwkucmVzdW1lICAgICAgICAgPSAmZXNlcmllc190bWlvX3Jlc3VtZSwKKwkuZW5hYmxlICAgICAgICAgPSAmZXNlcmllc190bWlvX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICAgPSAmZXNlcmllc190bWlvX2Rpc2FibGUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlNzUwX3RjNjM5M3hiX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAidGM2MzkzeGIiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5kZXYgICAgICAgICAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZTc1MF90YzYzOTN4Yl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSAgICAgID0gZXNlcmllc190bWlvX3Jlc291cmNlcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZlNzUwX2ZiX2RldmljZSwKKwkmZTc1MF90YzYzOTN4Yl9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZTc1MF9pbml0KHZvaWQpCiB7CisJY2xrX2FkZF9hbGlhcygiQ0xLX0NLM1A2TUkiLCAmZTc1MF90YzYzOTN4Yl9kZXZpY2UuZGV2LAorCQkJIkdQSU8xMV9DTEsiLCBOVUxMKSwKKwllc2VyaWVzX2dldF90bWlvX2dwaW9zKCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAJcHhhX3NldF91ZGNfaW5mbygmZTd4eF91ZGNfbWFjaF9pbmZvKTsKKwllN3h4X2lyZGFfaW5pdCgpOworCXB4YV9zZXRfZmljcF9pbmZvKCZlN3h4X2ZpY3BfcGxhdGZvcm1fZGF0YSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoRTc1MCwgIlRvc2hpYmEgZTc1MCIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMKaW5kZXggYTI5M2UwOS4uOWE4NmE0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RjNjM5M3hiLmg+CiAKICNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KIApAQCAtMjMsMTIgKzI0LDE0IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKKyNpbmNsdWRlICJjbG9jay5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZTgwMCBMQ0QgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xNjAsMTQgKzE2Myw0MSBAQAogCS5ncGlvX3B1bGx1cF9pbnZlcnRlZCA9IDEKIH07CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIGU4MDAgdGM2MzkzeGIgcGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0YzYzOTN4Yl9wbGF0Zm9ybV9kYXRhIGU4MDBfdGM2MzkzeGJfaW5mbyA9IHsKKwkuaXJxX2Jhc2UgICAgICAgPSBJUlFfQk9BUkRfU1RBUlQsCisJLnNjcl9wbGwyY3IgICAgID0gMHgwY2MxLAorCS5zY3JfZ3BlciAgICAgICA9IDAsCisJLmdwaW9fYmFzZSAgICAgID0gLTEsCisJLnN1c3BlbmQgICAgICAgID0gJmVzZXJpZXNfdG1pb19zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fcmVzdW1lLAorCS5lbmFibGUgICAgICAgICA9ICZlc2VyaWVzX3RtaW9fZW5hYmxlLAorCS5kaXNhYmxlICAgICAgICA9ICZlc2VyaWVzX3RtaW9fZGlzYWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGU4MDBfdGM2MzkzeGJfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJ0YzYzOTN4YiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZlODAwX3RjNjM5M3hiX2luZm8sCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDIsCisJLnJlc291cmNlICAgICAgPSBlc2VyaWVzX3RtaW9fcmVzb3VyY2VzLAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZlODAwX2ZiX2RldmljZSwKKwkmZTgwMF90YzYzOTN4Yl9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZTgwMF9pbml0KHZvaWQpCiB7CisJY2xrX2FkZF9hbGlhcygiQ0xLX0NLM1A2TUkiLCAmZTgwMF90YzYzOTN4Yl9kZXZpY2UuZGV2LAorCQkJIkdQSU8xMV9DTEsiLCBOVUxMKSwKKwllc2VyaWVzX2dldF90bWlvX2dwaW9zKCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAJcHhhX3NldF91ZGNfaW5mbygmZTgwMF91ZGNfbWFjaF9pbmZvKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYwppbmRleCBkMjg4NDliLi5kZmNlN2Q1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCkBAIC0xMiw2ICsxMiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yMSw4ICsyNCwxMCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9pcmRhLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKIAogLyogT25seSBlODAwIGhhcyAxMjhNQiBSQU0gKi8KIHZvaWQgX19pbml0IGVzZXJpZXNfZml4dXAoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYywKQEAgLTQzLDMgKzQ4LDEyMiBAQAogCS5ncGlvX3B1bGx1cF9pbnZlcnRlZCA9IDEKIH07CiAKK3N0YXRpYyB2b2lkIGU3eHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgJiBJUl9PRkYpIHsKKwkJZ3Bpb19zZXRfdmFsdWUoR1BJT19FN1hYX0lSX09GRiwgMSk7CisJCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7CisJfSBlbHNlIHsKKwkJcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKKwkJZ3Bpb19zZXRfdmFsdWUoR1BJT19FN1hYX0lSX09GRiwgMCk7CisJfQorfQorCitpbnQgZTd4eF9pcmRhX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fRTdYWF9JUl9PRkYsICJJckRBIHBvd2VyIik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19FN1hYX0lSX09GRiwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwllN3h4X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShOVUxMLCBJUl9TSVJNT0RFIHwgSVJfT0ZGKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlN3h4X2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWU3eHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlKGRldiwgSVJfU0lSTU9ERSB8IElSX09GRik7CisJZ3Bpb19mcmVlKEdQSU9fRTdYWF9JUl9PRkYpOworfQorCitzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIGU3eHhfZmljcF9wbGF0Zm9ybV9kYXRhID0geworCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZSA9IGU3eHhfaXJkYV90cmFuc2NlaXZlcl9tb2RlLAorCS5zaHV0ZG93biA9IGU3eHhfaXJkYV9zaHV0ZG93biwKK307CisKK2ludCBlc2VyaWVzX3RtaW9fZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwkvKiBSZXNldCAtIGJyaW5nIFNVU1BFTkQgaGlnaCBiZWZvcmUgUENMUiAqLworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRVNFUklFU19UTUlPX1NVU1BFTkQsIDApOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRVNFUklFU19UTUlPX1BDTFIsIDApOworCW1zbGVlcCgxKTsKKwlncGlvX3NldF92YWx1ZShHUElPX0VTRVJJRVNfVE1JT19TVVNQRU5ELCAxKTsKKwltc2xlZXAoMSk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19FU0VSSUVTX1RNSU9fUENMUiwgMSk7CisJbXNsZWVwKDEpOworCXJldHVybiAwOworfQorCitpbnQgZXNlcmllc190bWlvX2Rpc2FibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRVNFUklFU19UTUlPX1NVU1BFTkQsIDApOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRVNFUklFU19UTUlPX1BDTFIsIDApOworCXJldHVybiAwOworfQorCitpbnQgZXNlcmllc190bWlvX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRVNFUklFU19UTUlPX1NVU1BFTkQsIDApOworCXJldHVybiAwOworfQorCitpbnQgZXNlcmllc190bWlvX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19FU0VSSUVTX1RNSU9fU1VTUEVORCwgMSk7CisJbXNsZWVwKDEpOworCXJldHVybiAwOworfQorCit2b2lkIGVzZXJpZXNfZ2V0X3RtaW9fZ3Bpb3Modm9pZCkKK3sKKwlncGlvX3JlcXVlc3QoR1BJT19FU0VSSUVTX1RNSU9fU1VTUEVORCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRVNFUklFU19UTUlPX1BDTFIsIE5VTEwpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0VTRVJJRVNfVE1JT19TVVNQRU5ELCAwKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19FU0VSSUVTX1RNSU9fUENMUiwgMCk7Cit9CisKKy8qIFRNSU8gY29udHJvbGxlciB1c2VzIHRoZSBzYW1lIHJlc291cmNlcyBvbiBhbGwgZS1zZXJpZXMgbWFjaGluZXMuICovCitzdHJ1Y3QgcmVzb3VyY2UgZXNlcmllc190bWlvX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IFBYQV9DUzRfUEhZUywKKwkJLmVuZCAgICA9IFBYQV9DUzRfUEhZUyArIDB4MWZmZmZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBJUlFfR1BJTyhHUElPX0VTRVJJRVNfVE1JT19JUlEpLAorCQkuZW5kICAgID0gSVJRX0dQSU8oR1BJT19FU0VSSUVTX1RNSU9fSVJRKSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCisvKiBTb21lIGUtc2VyaWVzIGhhcmR3YXJlIGNhbm5vdCBjb250cm9sIHRoZSAzMksgY2xvY2sgKi8KK3N0YXRpYyB2b2lkIGNsa18zMmtfZHVtbXkoc3RydWN0IGNsayAqY2xrKQoreworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtfMzJrX2R1bW15X29wcyA9IHsKKwkuZW5hYmxlICAgICAgICAgPSBjbGtfMzJrX2R1bW15LAorCS5kaXNhYmxlICAgICAgICA9IGNsa18zMmtfZHVtbXksCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0bWlvX2R1bW15X2NsayA9IHsKKwkub3BzCT0gJmNsa18zMmtfZHVtbXlfb3BzLAorCS5yYXRlCT0gMzI3NjgsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgZXNlcmllc19jbGtyZWdzW10gPSB7CisJSU5JVF9DTEtSRUcoJnRtaW9fZHVtbXlfY2xrLCBOVUxMLCAiQ0xLX0NLMzJLIiksCit9OworCit2b2lkIGVzZXJpZXNfcmVnaXN0ZXJfY2xrcyh2b2lkKQoreworCWNsa3NfcmVnaXN0ZXIoZXNlcmllc19jbGtyZWdzLCBBUlJBWV9TSVpFKGVzZXJpZXNfY2xrcmVncykpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmgKaW5kZXggYTgzZjg4ZC4uNTkzMGY1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuaApAQCAtMiwzICsyLDE1IEBACiAJc3RydWN0IHRhZyAqdGFncywgY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSk7CiAKIGV4dGVybiBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gZTd4eF91ZGNfbWFjaF9pbmZvOworZXh0ZXJuIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgZTd4eF9maWNwX3BsYXRmb3JtX2RhdGE7CitleHRlcm4gaW50IGU3eHhfaXJkYV9pbml0KHZvaWQpOworCitleHRlcm4gaW50IGVzZXJpZXNfdG1pb19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZXNlcmllc190bWlvX2Rpc2FibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZXNlcmllc190bWlvX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZXNlcmllc190bWlvX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZXNlcmllc19nZXRfdG1pb19ncGlvcyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgZXNlcmllc190bWlvX3Jlc291cmNlc1tdOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZTMwMF90YzYzODd4Yl9kZXZpY2U7CitleHRlcm4gdm9pZCBlc2VyaWVzX3JlZ2lzdGVyX2Nsa3Modm9pZCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2V6eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKaW5kZXggY2MzZDg1MC4uZGY1ZjgyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKQEAgLTE2LDExICsxNiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyN3hfa2V5cGFkLmg+CiAKICNpbmNsdWRlIDxtYWNoL21mcC1weGEyN3guaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CkBAIC0xMDEsMTIwICsxMDQsNzMyIEBACiAJR1BJTzQ0X0JUVUFSVF9DVFMsCiAJR1BJTzQ1X0JUVUFSVF9SVFMsCiAKLQkvKiBTVFVBUlQgKi8KLQlHUElPNDZfU1RVQVJUX1JYRCwKLQlHUElPNDdfU1RVQVJUX1RYRCwKKwkvKiBJMkMgKi8KKwlHUElPMTE3X0kyQ19TQ0wsCisJR1BJTzExOF9JMkNfU0RBLAogCi0JLyogRm9yIEE3ODAgc3VwcG9ydCAoY29ubmVjdGVkIHdpdGggTmVwdHVuZSBHU00gY2hpcCkgKi8KLQlHUElPMzBfVVNCX1AzXzIsCS8qIElDTF9UWEVOQiAqLwotCUdQSU8zMV9VU0JfUDNfNiwJLyogSUNMX1ZQT1VUICovCi0JR1BJTzkwX1VTQl9QM181LAkvKiBJQ0xfVlBJTiAqLwotCUdQSU85MV9VU0JfUDNfMSwJLyogSUNMX1hSWEQgKi8KLQlHUElPNTZfVVNCX1AzXzQsCS8qIElDTF9WTU9VVCAqLwotCUdQSU8xMTNfVVNCX1AzXzMsCS8qIC9JQ0xfVk1JTiAqLworCS8qIFBDQVAgU1NQICovCisJR1BJTzI5X1NTUDFfU0NMSywKKwlHUElPMjVfU1NQMV9UWEQsCisJR1BJTzI2X1NTUDFfUlhELAorCUdQSU8yNF9HUElPLAkJCQkvKiBwY2FwIGNoaXAgc2VsZWN0ICovCisJR1BJTzFfR1BJTywJCQkJLyogcGNhcCBpbnRlcnJ1cHQgKi8KKwlHUElPNF9HUElPLAkJCQkvKiBXRElfQVAgKi8KKwlHUElPNTVfR1BJTywJCQkJLyogU1lTX1JFU1RBUlQgKi8KKworCS8qIE1NQyAqLworCUdQSU8zMl9NTUNfQ0xLLAorCUdQSU85Ml9NTUNfREFUXzAsCisJR1BJTzEwOV9NTUNfREFUXzEsCisJR1BJTzExMF9NTUNfREFUXzIsCisJR1BJTzExMV9NTUNfREFUXzMsCisJR1BJTzExMl9NTUNfQ01ELAorCUdQSU8xMV9HUElPLAkJCQkvKiBtbWMgZGV0ZWN0ICovCisKKwkvKiB1c2IgdG8gZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKwlHUElPMzRfVVNCX1AyXzIsCisJR1BJTzM1X1VTQl9QMl8xLAorCUdQSU8zNl9VU0JfUDJfNCwKKwlHUElPMzlfVVNCX1AyXzYsCisJR1BJTzQwX1VTQl9QMl81LAorCUdQSU81M19VU0JfUDJfMywKKworCS8qIHVzYiB0byBOZXB0dW5lIEdTTSBjaGlwICovCisJR1BJTzMwX1VTQl9QM18yLAorCUdQSU8zMV9VU0JfUDNfNiwKKwlHUElPOTBfVVNCX1AzXzUsCisJR1BJTzkxX1VTQl9QM18xLAorCUdQSU81Nl9VU0JfUDNfNCwKKwlHUElPMTEzX1VTQl9QM18zLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGV6eF9pbml0KHZvaWQpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9FWlhfQTc4MCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9FWlhfRTY4MCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdlbjFfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogZmxpcCAvIGxvY2tzd2l0Y2ggKi8KKwlHUElPMTJfR1BJTywKKworCS8qIGJsdWV0b290aCAoYmNtMjAzNSkgKi8KKwlHUElPMTRfR1BJTyB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAkvKiBIT1NUV0FLRSAqLworCUdQSU80OF9HUElPLAkJCQkvKiBSRVNFVCAqLworCUdQSU8yOF9HUElPLAkJCQkvKiBXQUtFVVAgKi8KKworCS8qIE5lcHR1bmUgaGFuZHNoYWtlICovCisJR1BJTzBfR1BJTyB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAkvKiBCUF9SRFkgKi8KKwlHUElPNTdfR1BJTywJCQkJLyogQVBfUkRZICovCisJR1BJTzEzX0dQSU8gfCBXQUtFVVBfT05fTEVWRUxfSElHSCwJLyogV0RJICovCisJR1BJTzNfR1BJTyB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAkvKiBXREkyICovCisJR1BJTzgyX0dQSU8sCQkJCS8qIFJFU0VUICovCisJR1BJTzk5X0dQSU8sCQkJCS8qIFRDX01NX0VOICovCisKKwkvKiBzb3VuZCAqLworCUdQSU81Ml9TU1AzX1NDTEssCisJR1BJTzgzX1NTUDNfU0ZSTSwKKwlHUElPODFfU1NQM19UWEQsCisJR1BJTzg5X1NTUDNfUlhELAorCisJLyogc3NwMiBwaW5zIHRvIGluICovCisJR1BJTzIyX0dQSU8sCQkJCS8qIFNTUDJfU0NMSyAqLworCUdQSU8zN19HUElPLAkJCQkvKiBTU1AyX1NGUk0gKi8KKwlHUElPMzhfR1BJTywJCQkJLyogU1NQMl9UWEQgKi8KKwlHUElPODhfR1BJTywJCQkJLyogU1NQMl9SWEQgKi8KKworCS8qIGNhbWVyYSAqLworCUdQSU8yM19DSUZfTUNMSywKKwlHUElPNTRfQ0lGX1BDTEssCisJR1BJTzg1X0NJRl9MViwKKwlHUElPODRfQ0lGX0ZWLAorCUdQSU8yN19DSUZfRERfMCwKKwlHUElPMTE0X0NJRl9ERF8xLAorCUdQSU81MV9DSUZfRERfMiwKKwlHUElPMTE1X0NJRl9ERF8zLAorCUdQSU85NV9DSUZfRERfNCwKKwlHUElPOTRfQ0lGX0REXzUsCisJR1BJTzE3X0NJRl9ERF82LAorCUdQSU8xMDhfQ0lGX0REXzcsCisJR1BJTzUwX0dQSU8sCQkJCS8qIENBTV9FTiAqLworCUdQSU8xOV9HUElPLAkJCQkvKiBDQU1fUlNUICovCisKKwkvKiBFTVUgKi8KKwlHUElPMTIwX0dQSU8sCQkJCS8qIEVNVV9NVVgxICovCisJR1BJTzExOV9HUElPLAkJCQkvKiBFTVVfTVVYMiAqLworCUdQSU84Nl9HUElPLAkJCQkvKiBTTlBfSU5UX0NUTCAqLworCUdQSU84N19HUElPLAkJCQkvKiBTTlBfSU5UX0lOICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0VaWF9BMTIwMCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9FWlhfQTkxMCkgfHwgXAorCWRlZmluZWQoQ09ORklHX01BQ0hfRVpYX0UyKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX0VaWF9FNikKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdlbjJfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogZmxpcCAvIGxvY2tzd2l0Y2ggKi8KKwlHUElPMTVfR1BJTywKKworCS8qIEVPQyAqLworCUdQSU8xMF9HUElPLAorCisJLyogYmx1ZXRvb3RoIChiY20yMDQ1KSAqLworCUdQSU8xM19HUElPIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCS8qIEhPU1RXQUtFICovCisJR1BJTzM3X0dQSU8sCQkJCS8qIFJFU0VUICovCisJR1BJTzU3X0dQSU8sCQkJCS8qIFdBS0VVUCAqLworCisJLyogTmVwdHVuZSBoYW5kc2hha2UgKi8KKwlHUElPMF9HUElPIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCS8qIEJQX1JEWSAqLworCUdQSU85Nl9HUElPLAkJCQkvKiBBUF9SRFkgKi8KKwlHUElPM19HUElPIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCS8qIFdESSAqLworCUdQSU8xMTZfR1BJTywJCQkJLyogUkVTRVQgKi8KKwlHUElPNDFfR1BJTywJCQkJLyogQlBfRkxBU0ggKi8KKworCS8qIHNvdW5kICovCisJR1BJTzUyX1NTUDNfU0NMSywKKwlHUElPODNfU1NQM19TRlJNLAorCUdQSU84MV9TU1AzX1RYRCwKKwlHUElPODJfU1NQM19SWEQsCisKKwkvKiBzc3AyIHBpbnMgdG8gaW4gKi8KKwlHUElPMjJfR1BJTywJCQkJLyogU1NQMl9TQ0xLICovCisJR1BJTzE0X0dQSU8sCQkJCS8qIFNTUDJfU0ZSTSAqLworCUdQSU8zOF9HUElPLAkJCQkvKiBTU1AyX1RYRCAqLworCUdQSU84OF9HUElPLAkJCQkvKiBTU1AyX1JYRCAqLworCisJLyogY2FtZXJhICovCisJR1BJTzIzX0NJRl9NQ0xLLAorCUdQSU81NF9DSUZfUENMSywKKwlHUElPODVfQ0lGX0xWLAorCUdQSU84NF9DSUZfRlYsCisJR1BJTzI3X0NJRl9ERF8wLAorCUdQSU8xMTRfQ0lGX0REXzEsCisJR1BJTzUxX0NJRl9ERF8yLAorCUdQSU8xMTVfQ0lGX0REXzMsCisJR1BJTzk1X0NJRl9ERF80LAorCUdQSU80OF9DSUZfRERfNSwKKwlHUElPOTNfQ0lGX0REXzYsCisJR1BJTzEyX0NJRl9ERF83LAorCUdQSU81MF9HUElPLAkJCQkvKiBDQU1fRU4gKi8KKwlHUElPMjhfR1BJTywJCQkJLyogQ0FNX1JTVCAqLworCUdQSU8xN19HUElPLAkJCQkvKiBDQU1fRkxBU0ggKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0VaWF9BNzgwCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhNzgwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIGtleXBhZCAqLworCUdQSU85M19LUF9ES0lOXzAgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAwX0tQX01LSU5fMCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDFfS1BfTUtJTl8xIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzEwMl9LUF9NS0lOXzIgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPOTdfS1BfTUtJTl8zIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk4X0tQX01LSU5fNCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCUdQSU8xMDZfS1BfTUtPVVRfMywKKwlHUElPMTA3X0tQX01LT1VUXzQsCisKKwkvKiBhdHRlbnVhdGUgc291bmQgKi8KKwlHUElPOTZfR1BJTywKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0VaWF9FNjgwCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlNjgwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIGtleXBhZCAqLworCUdQSU85M19LUF9ES0lOXzAgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPOTZfS1BfREtJTl8zIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk3X0tQX0RLSU5fNCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU85OF9LUF9ES0lOXzUgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAwX0tQX01LSU5fMCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDFfS1BfTUtJTl8xIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzEwMl9LUF9NS0lOXzIgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAzX0tQX01LT1VUXzAsCisJR1BJTzEwNF9LUF9NS09VVF8xLAorCUdQSU8xMDVfS1BfTUtPVVRfMiwKKwlHUElPMTA2X0tQX01LT1VUXzMsCisKKwkvKiBNSURJICovCisJR1BJTzc5X0dQSU8sCQkJCS8qIFZBX1NFTF9CVUwgKi8KKwlHUElPODBfR1BJTywJCQkJLyogRkxUX1NFTF9CVUwgKi8KKwlHUElPNzhfR1BJTywJCQkJLyogTUlESV9SRVNFVCAqLworCUdQSU8zM19HUElPLAkJCQkvKiBNSURJX0NTICovCisJR1BJTzE1X0dQSU8sCQkJCS8qIE1JRElfSVJRICovCisJR1BJTzQ5X0dQSU8sCQkJCS8qIE1JRElfTlBXRSAqLworCUdQSU8xOF9HUElPLAkJCQkvKiBNSURJX1JEWSAqLworCisJLyogbGVkcyAqLworCUdQSU80Nl9HUElPLAorCUdQSU80N19HUElPLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0ExMjAwCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhMTIwMF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBrZXlwYWQgKi8KKwlHUElPMTAwX0tQX01LSU5fMCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDFfS1BfTUtJTl8xIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzEwMl9LUF9NS0lOXzIgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPOTdfS1BfTUtJTl8zIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk4X0tQX01LSU5fNCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCUdQSU8xMDZfS1BfTUtPVVRfMywKKwlHUElPMTA3X0tQX01LT1VUXzQsCisJR1BJTzEwOF9LUF9NS09VVF81LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0E5MTAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGE5MTBfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyoga2V5cGFkICovCisJR1BJTzEwMF9LUF9NS0lOXzAgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAxX0tQX01LSU5fMSB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDJfS1BfTUtJTl8yIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk3X0tQX01LSU5fMyB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU85OF9LUF9NS0lOXzQgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAzX0tQX01LT1VUXzAsCisJR1BJTzEwNF9LUF9NS09VVF8xLAorCUdQSU8xMDVfS1BfTUtPVVRfMiwKKwlHUElPMTA2X0tQX01LT1VUXzMsCisJR1BJTzEwN19LUF9NS09VVF80LAorCUdQSU8xMDhfS1BfTUtPVVRfNSwKKworCS8qIFdMQU4gKi8KKwlHUElPODlfR1BJTywJCQkJLyogUkVTRVQgKi8KKwlHUElPMzNfR1BJTywJCQkJLyogV0FLRVVQICovCisJR1BJTzk0X0dQSU8gfCBXQUtFVVBfT05fTEVWRUxfSElHSCwJLyogSE9TVFdBS0UgKi8KKworCS8qIE1NQyBDUyAqLworCUdQSU8yMF9HUElPLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0UyCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlMl9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBrZXlwYWQgKi8KKwlHUElPMTAwX0tQX01LSU5fMCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDFfS1BfTUtJTl8xIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzEwMl9LUF9NS0lOXzIgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPOTdfS1BfTUtJTl8zIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk4X0tQX01LSU5fNCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCUdQSU8xMDZfS1BfTUtPVVRfMywKKwlHUElPMTA3X0tQX01LT1VUXzQsCisJR1BJTzEwOF9LUF9NS09VVF81LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0U2CitzdGF0aWMgdW5zaWduZWQgbG9uZyBlNl9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBrZXlwYWQgKi8KKwlHUElPMTAwX0tQX01LSU5fMCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDFfS1BfTUtJTl8xIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzEwMl9LUF9NS0lOXzIgfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPOTdfS1BfTUtJTl8zIHwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk4X0tQX01LSU5fNCB8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCUdQSU8xMDZfS1BfTUtPVVRfMywKKwlHUElPMTA3X0tQX01LT1VUXzQsCisJR1BJTzEwOF9LUF9NS09VVF81LAorfTsKKyNlbmRpZgorCisvKiBLRVlQQUQgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9FWlhfQTc4MAorc3RhdGljIHVuc2lnbmVkIGludCBhNzgwX2tleV9tYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZX1NFTkQpLAorCUtFWSgwLCAxLCBLRVlfQkFDSyksCisJS0VZKDAsIDIsIEtFWV9FTkQpLAorCUtFWSgwLCAzLCBLRVlfUEFHRVVQKSwKKwlLRVkoMCwgNCwgS0VZX1VQKSwKKworCUtFWSgxLCAwLCBLRVlfTlVNRVJJQ18xKSwKKwlLRVkoMSwgMSwgS0VZX05VTUVSSUNfMiksCisJS0VZKDEsIDIsIEtFWV9OVU1FUklDXzMpLAorCUtFWSgxLCAzLCBLRVlfU0VMRUNUKSwKKwlLRVkoMSwgNCwgS0VZX0tQRU5URVIpLAorCisJS0VZKDIsIDAsIEtFWV9OVU1FUklDXzQpLAorCUtFWSgyLCAxLCBLRVlfTlVNRVJJQ181KSwKKwlLRVkoMiwgMiwgS0VZX05VTUVSSUNfNiksCisJS0VZKDIsIDMsIEtFWV9SRUNPUkQpLAorCUtFWSgyLCA0LCBLRVlfTEVGVCksCisKKwlLRVkoMywgMCwgS0VZX05VTUVSSUNfNyksCisJS0VZKDMsIDEsIEtFWV9OVU1FUklDXzgpLAorCUtFWSgzLCAyLCBLRVlfTlVNRVJJQ185KSwKKwlLRVkoMywgMywgS0VZX0hPTUUpLAorCUtFWSgzLCA0LCBLRVlfUklHSFQpLAorCisJS0VZKDQsIDAsIEtFWV9OVU1FUklDX1NUQVIpLAorCUtFWSg0LCAxLCBLRVlfTlVNRVJJQ18wKSwKKwlLRVkoNCwgMiwgS0VZX05VTUVSSUNfUE9VTkQpLAorCUtFWSg0LCAzLCBLRVlfUEFHRURPV04pLAorCUtFWSg0LCA0LCBLRVlfRE9XTiksCit9OworCitzdGF0aWMgc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSBhNzgwX2tleXBhZF9wbGF0Zm9ybV9kYXRhID0geworCS5tYXRyaXhfa2V5X3Jvd3MgPSA1LAorCS5tYXRyaXhfa2V5X2NvbHMgPSA1LAorCS5tYXRyaXhfa2V5X21hcCA9IGE3ODBfa2V5X21hcCwKKwkubWF0cml4X2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoYTc4MF9rZXlfbWFwKSwKKworCS5kaXJlY3Rfa2V5X21hcCA9IHsgS0VZX0NBTUVSQSB9LAorCS5kaXJlY3Rfa2V5X251bSA9IDEsCisKKwkuZGVib3VuY2VfaW50ZXJ2YWwgPSAzMCwKK307CisjZW5kaWYgLyogQ09ORklHX01BQ0hfRVpYX0E3ODAgKi8KKworI2lmZGVmIENPTkZJR19NQUNIX0VaWF9FNjgwCitzdGF0aWMgdW5zaWduZWQgaW50IGU2ODBfa2V5X21hcFtdID0geworCUtFWSgwLCAwLCBLRVlfVVApLAorCUtFWSgwLCAxLCBLRVlfUklHSFQpLAorCUtFWSgwLCAyLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgwLCAzLCBLRVlfU0VORCksCisKKwlLRVkoMSwgMCwgS0VZX0RPV04pLAorCUtFWSgxLCAxLCBLRVlfTEVGVCksCisJS0VZKDEsIDIsIEtFWV9QQUdFVVApLAorCUtFWSgxLCAzLCBLRVlfUEFHRURPV04pLAorCisJS0VZKDIsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDIsIDEsIEtFWV9SRVNFUlZFRCksCisJS0VZKDIsIDIsIEtFWV9SRVNFUlZFRCksCisJS0VZKDIsIDMsIEtFWV9LUEVOVEVSKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMjd4X2tleXBhZF9wbGF0Zm9ybV9kYXRhIGU2ODBfa2V5cGFkX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1hdHJpeF9rZXlfcm93cyA9IDMsCisJLm1hdHJpeF9rZXlfY29scyA9IDQsCisJLm1hdHJpeF9rZXlfbWFwID0gZTY4MF9rZXlfbWFwLAorCS5tYXRyaXhfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShlNjgwX2tleV9tYXApLAorCisJLmRpcmVjdF9rZXlfbWFwID0geworCQlLRVlfQ0FNRVJBLAorCQlLRVlfUkVTRVJWRUQsCisJCUtFWV9SRVNFUlZFRCwKKwkJS0VZX0YxLAorCQlLRVlfQ0FOQ0VMLAorCQlLRVlfRjIsCisJfSwKKwkuZGlyZWN0X2tleV9udW0gPSA2LAorCisJLmRlYm91bmNlX2ludGVydmFsID0gMzAsCit9OworI2VuZGlmIC8qIENPTkZJR19NQUNIX0VaWF9FNjgwICovCisKKyNpZmRlZiBDT05GSUdfTUFDSF9FWlhfQTEyMDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYTEyMDBfa2V5X21hcFtdID0geworCUtFWSgwLCAwLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgwLCAxLCBLRVlfUklHSFQpLAorCUtFWSgwLCAyLCBLRVlfUEFHRURPV04pLAorCUtFWSgwLCAzLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgwLCA0LCBLRVlfUkVTRVJWRUQpLAorCUtFWSgwLCA1LCBLRVlfUkVTRVJWRUQpLAorCisJS0VZKDEsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDEsIDEsIEtFWV9ET1dOKSwKKwlLRVkoMSwgMiwgS0VZX0NBTUVSQSksCisJS0VZKDEsIDMsIEtFWV9SRVNFUlZFRCksCisJS0VZKDEsIDQsIEtFWV9SRVNFUlZFRCksCisJS0VZKDEsIDUsIEtFWV9SRVNFUlZFRCksCisKKwlLRVkoMiwgMCwgS0VZX1JFU0VSVkVEKSwKKwlLRVkoMiwgMSwgS0VZX0tQRU5URVIpLAorCUtFWSgyLCAyLCBLRVlfUkVDT1JEKSwKKwlLRVkoMiwgMywgS0VZX1JFU0VSVkVEKSwKKwlLRVkoMiwgNCwgS0VZX1JFU0VSVkVEKSwKKwlLRVkoMiwgNSwgS0VZX1NFTEVDVCksCisKKwlLRVkoMywgMCwgS0VZX1JFU0VSVkVEKSwKKwlLRVkoMywgMSwgS0VZX1VQKSwKKwlLRVkoMywgMiwgS0VZX1NFTkQpLAorCUtFWSgzLCAzLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgzLCA0LCBLRVlfUkVTRVJWRUQpLAorCUtFWSgzLCA1LCBLRVlfUkVTRVJWRUQpLAorCisJS0VZKDQsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDEsIEtFWV9MRUZUKSwKKwlLRVkoNCwgMiwgS0VZX1BBR0VVUCksCisJS0VZKDQsIDMsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDQsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDUsIEtFWV9SRVNFUlZFRCksCit9OworCitzdGF0aWMgc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSBhMTIwMF9rZXlwYWRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubWF0cml4X2tleV9yb3dzID0gNSwKKwkubWF0cml4X2tleV9jb2xzID0gNiwKKwkubWF0cml4X2tleV9tYXAgPSBhMTIwMF9rZXlfbWFwLAorCS5tYXRyaXhfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShhMTIwMF9rZXlfbWFwKSwKKworCS5kZWJvdW5jZV9pbnRlcnZhbCA9IDMwLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDSF9FWlhfQTEyMDAgKi8KKworI2lmZGVmIENPTkZJR19NQUNIX0VaWF9FNgorc3RhdGljIHVuc2lnbmVkIGludCBlNl9rZXlfbWFwW10gPSB7CisJS0VZKDAsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDAsIDEsIEtFWV9SSUdIVCksCisJS0VZKDAsIDIsIEtFWV9QQUdFRE9XTiksCisJS0VZKDAsIDMsIEtFWV9SRVNFUlZFRCksCisJS0VZKDAsIDQsIEtFWV9SRVNFUlZFRCksCisJS0VZKDAsIDUsIEtFWV9ORVhUU09ORyksCisKKwlLRVkoMSwgMCwgS0VZX1JFU0VSVkVEKSwKKwlLRVkoMSwgMSwgS0VZX0RPV04pLAorCUtFWSgxLCAyLCBLRVlfUFJPRzEpLAorCUtFWSgxLCAzLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgxLCA0LCBLRVlfUkVTRVJWRUQpLAorCUtFWSgxLCA1LCBLRVlfUkVTRVJWRUQpLAorCisJS0VZKDIsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDIsIDEsIEtFWV9FTlRFUiksCisJS0VZKDIsIDIsIEtFWV9DQU1FUkEpLAorCUtFWSgyLCAzLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgyLCA0LCBLRVlfUkVTRVJWRUQpLAorCUtFWSgyLCA1LCBLRVlfV1dXKSwKKworCUtFWSgzLCAwLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgzLCAxLCBLRVlfVVApLAorCUtFWSgzLCAyLCBLRVlfU0VORCksCisJS0VZKDMsIDMsIEtFWV9SRVNFUlZFRCksCisJS0VZKDMsIDQsIEtFWV9SRVNFUlZFRCksCisJS0VZKDMsIDUsIEtFWV9QTEFZUEFVU0UpLAorCisJS0VZKDQsIDAsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDEsIEtFWV9MRUZUKSwKKwlLRVkoNCwgMiwgS0VZX1BBR0VVUCksCisJS0VZKDQsIDMsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDQsIEtFWV9SRVNFUlZFRCksCisJS0VZKDQsIDUsIEtFWV9QUkVWSU9VU1NPTkcpLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyN3hfa2V5cGFkX3BsYXRmb3JtX2RhdGEgZTZfa2V5cGFkX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1hdHJpeF9rZXlfcm93cyA9IDUsCisJLm1hdHJpeF9rZXlfY29scyA9IDYsCisJLm1hdHJpeF9rZXlfbWFwID0gZTZfa2V5X21hcCwKKwkubWF0cml4X2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZTZfa2V5X21hcCksCisKKwkuZGVib3VuY2VfaW50ZXJ2YWwgPSAzMCwKK307CisjZW5kaWYgLyogQ09ORklHX01BQ0hfRVpYX0U2ICovCisKKyNpZmRlZiBDT05GSUdfTUFDSF9FWlhfQTkxMAorc3RhdGljIHVuc2lnbmVkIGludCBhOTEwX2tleV9tYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZX05VTUVSSUNfNiksCisJS0VZKDAsIDEsIEtFWV9SSUdIVCksCisJS0VZKDAsIDIsIEtFWV9QQUdFRE9XTiksCisJS0VZKDAsIDMsIEtFWV9LUEVOVEVSKSwKKwlLRVkoMCwgNCwgS0VZX05VTUVSSUNfNSksCisJS0VZKDAsIDUsIEtFWV9DQU1FUkEpLAorCisJS0VZKDEsIDAsIEtFWV9OVU1FUklDXzgpLAorCUtFWSgxLCAxLCBLRVlfRE9XTiksCisJS0VZKDEsIDIsIEtFWV9SRVNFUlZFRCksCisJS0VZKDEsIDMsIEtFWV9GMSksIC8qIExlZnQgU29mdEtleSAqLworCUtFWSgxLCA0LCBLRVlfTlVNRVJJQ19TVEFSKSwKKwlLRVkoMSwgNSwgS0VZX1JFU0VSVkVEKSwKKworCUtFWSgyLCAwLCBLRVlfTlVNRVJJQ183KSwKKwlLRVkoMiwgMSwgS0VZX05VTUVSSUNfOSksCisJS0VZKDIsIDIsIEtFWV9SRUNPUkQpLAorCUtFWSgyLCAzLCBLRVlfRjIpLCAvKiBSaWdodCBTb2Z0S2V5ICovCisJS0VZKDIsIDQsIEtFWV9CQUNLKSwKKwlLRVkoMiwgNSwgS0VZX1NFTEVDVCksCisKKwlLRVkoMywgMCwgS0VZX05VTUVSSUNfMiksCisJS0VZKDMsIDEsIEtFWV9VUCksCisJS0VZKDMsIDIsIEtFWV9TRU5EKSwKKwlLRVkoMywgMywgS0VZX05VTUVSSUNfMCksCisJS0VZKDMsIDQsIEtFWV9OVU1FUklDXzEpLAorCUtFWSgzLCA1LCBLRVlfUkVDT1JEKSwKKworCUtFWSg0LCAwLCBLRVlfTlVNRVJJQ180KSwKKwlLRVkoNCwgMSwgS0VZX0xFRlQpLAorCUtFWSg0LCAyLCBLRVlfUEFHRVVQKSwKKwlLRVkoNCwgMywgS0VZX05VTUVSSUNfUE9VTkQpLAorCUtFWSg0LCA0LCBLRVlfTlVNRVJJQ18zKSwKKwlLRVkoNCwgNSwgS0VZX1JFU0VSVkVEKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMjd4X2tleXBhZF9wbGF0Zm9ybV9kYXRhIGE5MTBfa2V5cGFkX3BsYXRmb3JtX2RhdGEgPSB7CisJLm1hdHJpeF9rZXlfcm93cyA9IDUsCisJLm1hdHJpeF9rZXlfY29scyA9IDYsCisJLm1hdHJpeF9rZXlfbWFwID0gYTkxMF9rZXlfbWFwLAorCS5tYXRyaXhfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShhOTEwX2tleV9tYXApLAorCisJLmRlYm91bmNlX2ludGVydmFsID0gMzAsCit9OworI2VuZGlmIC8qIENPTkZJR19NQUNIX0VaWF9BOTEwICovCisKKyNpZmRlZiBDT05GSUdfTUFDSF9FWlhfRTIKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZTJfa2V5X21hcFtdID0geworCUtFWSgwLCAwLCBLRVlfTlVNRVJJQ182KSwKKwlLRVkoMCwgMSwgS0VZX1JJR0hUKSwKKwlLRVkoMCwgMiwgS0VZX05VTUVSSUNfOSksCisJS0VZKDAsIDMsIEtFWV9ORVhUU09ORyksCisJS0VZKDAsIDQsIEtFWV9OVU1FUklDXzUpLAorCUtFWSgwLCA1LCBLRVlfRjEpLCAvKiBMZWZ0IFNvZnRLZXkgKi8KKworCUtFWSgxLCAwLCBLRVlfTlVNRVJJQ184KSwKKwlLRVkoMSwgMSwgS0VZX0RPV04pLAorCUtFWSgxLCAyLCBLRVlfUkVTRVJWRUQpLAorCUtFWSgxLCAzLCBLRVlfUEFHRVVQKSwKKwlLRVkoMSwgNCwgS0VZX05VTUVSSUNfU1RBUiksCisJS0VZKDEsIDUsIEtFWV9GMiksIC8qIFJpZ2h0IFNvZnRLZXkgKi8KKworCUtFWSgyLCAwLCBLRVlfTlVNRVJJQ183KSwKKwlLRVkoMiwgMSwgS0VZX0tQRU5URVIpLAorCUtFWSgyLCAyLCBLRVlfUkVDT1JEKSwKKwlLRVkoMiwgMywgS0VZX1BBR0VET1dOKSwKKwlLRVkoMiwgNCwgS0VZX0JBQ0spLAorCUtFWSgyLCA1LCBLRVlfTlVNRVJJQ18wKSwKKworCUtFWSgzLCAwLCBLRVlfTlVNRVJJQ18yKSwKKwlLRVkoMywgMSwgS0VZX1VQKSwKKwlLRVkoMywgMiwgS0VZX1NFTkQpLAorCUtFWSgzLCAzLCBLRVlfUExBWVBBVVNFKSwKKwlLRVkoMywgNCwgS0VZX05VTUVSSUNfMSksCisJS0VZKDMsIDUsIEtFWV9TT1VORCksIC8qIE11c2ljIFNvZnRLZXkgKi8KKworCUtFWSg0LCAwLCBLRVlfTlVNRVJJQ180KSwKKwlLRVkoNCwgMSwgS0VZX0xFRlQpLAorCUtFWSg0LCAyLCBLRVlfTlVNRVJJQ19QT1VORCksCisJS0VZKDQsIDMsIEtFWV9QUkVWSU9VU1NPTkcpLAorCUtFWSg0LCA0LCBLRVlfTlVNRVJJQ18zKSwKKwlLRVkoNCwgNSwgS0VZX1JFU0VSVkVEKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMjd4X2tleXBhZF9wbGF0Zm9ybV9kYXRhIGUyX2tleXBhZF9wbGF0Zm9ybV9kYXRhID0geworCS5tYXRyaXhfa2V5X3Jvd3MgPSA1LAorCS5tYXRyaXhfa2V5X2NvbHMgPSA2LAorCS5tYXRyaXhfa2V5X21hcCA9IGUyX2tleV9tYXAsCisJLm1hdHJpeF9rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGUyX2tleV9tYXApLAorCisJLmRlYm91bmNlX2ludGVydmFsID0gMzAsCit9OworI2VuZGlmIC8qIENPTkZJR19NQUNIX0VaWF9FMiAqLworCisjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0E3ODAKK3N0YXRpYyB2b2lkIF9faW5pdCBhNzgwX2luaXQodm9pZCkKIHsKIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlenhfcGluX2NvbmZpZykpOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGdlbjFfcGluX2NvbmZpZykpOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGE3ODBfcGluX2NvbmZpZykpOworCiAJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKLQlpZiAobWFjaGluZV9pc19lenhfYTc4MCgpIHx8IG1hY2hpbmVfaXNfZXp4X2U2ODAoKSkKLQkJc2V0X3B4YV9mYl9pbmZvKCZlenhfZmJfaW5mb18xKTsKLQllbHNlCi0JCXNldF9weGFfZmJfaW5mbygmZXp4X2ZiX2luZm9fMik7CisKKwlzZXRfcHhhX2ZiX2luZm8oJmV6eF9mYl9pbmZvXzEpOworCisJcHhhX3NldF9rZXlwYWRfaW5mbygmYTc4MF9rZXlwYWRfcGxhdGZvcm1fZGF0YSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGV6eF9maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLAotCQljaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQotewotCS8qIFdlIGhhdmUgdHdvIHJhbSBjaGlwcy4gRmlyc3Qgb25lIHdpdGggMzJNQiBhdCAweEEwMDAwMDAwIGFuZCBhIHNlY29uZAotCSAqIDE2TUIgb25lIGF0IDB4QUMwMDAwMDAKLQkgKi8KLQltaS0+bnJfYmFua3MgPSAyOwotCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHhhMDAwMDAwMDsKLQltaS0+YmFua1swXS5ub2RlID0gMDsKLQltaS0+YmFua1swXS5zaXplID0gKDMyKjEwMjQqMTAyNCk7Ci0JbWktPmJhbmtbMV0uc3RhcnQgPSAweGFjMDAwMDAwOwotCW1pLT5iYW5rWzFdLm5vZGUgPSAxOwotCW1pLT5iYW5rWzFdLnNpemUgPSAoMTYqMTAyNCoxMDI0KTsKLX0KLQotI2lmZGVmIENPTkZJR19NQUNIX0VaWF9BNzgwCiBNQUNISU5FX1NUQVJUKEVaWF9BNzgwLCAiTW90b3JvbGEgRVpYIEE3ODAiKQogCS5waHlzX2lvICAgICAgICA9IDB4NDAwMDAwMDAsCiAJLmlvX3BnX29mZnN0ICAgID0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLmZpeHVwCQkJPSBlenhfZml4dXAsCiAJLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGFfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKIAkudGltZXIgICAgICAgICAgPSAmcHhhX3RpbWVyLAotCS5pbml0X21hY2hpbmUgICA9ICZlenhfaW5pdCwKKwkuaW5pdF9tYWNoaW5lICAgPSBhNzgwX2luaXQsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTUFDSF9FWlhfRTY4MAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGU2ODBfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ0ZWE1NzY3IiwgMHg4MSkgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlNjgwX2luaXQodm9pZCkKK3sKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlenhfcGluX2NvbmZpZykpOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGdlbjFfcGluX2NvbmZpZykpOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGU2ODBfcGluX2NvbmZpZykpOworCisJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBBUlJBWV9BTkRfU0laRShlNjgwX2kyY19ib2FyZF9pbmZvKSk7CisKKwlzZXRfcHhhX2ZiX2luZm8oJmV6eF9mYl9pbmZvXzEpOworCisJcHhhX3NldF9rZXlwYWRfaW5mbygmZTY4MF9rZXlwYWRfcGxhdGZvcm1fZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK30KKwogTUFDSElORV9TVEFSVChFWlhfRTY4MCwgIk1vdG9yb2xhIEVaWCBFNjgwIikKIAkucGh5c19pbyAgICAgICAgPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdCAgICA9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5maXh1cAkJCT0gZXp4X2ZpeHVwLAogCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhX21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKLQkuaW5pdF9tYWNoaW5lICAgPSAmZXp4X2luaXQsCisJLmluaXRfbWFjaGluZSAgID0gZTY4MF9pbml0LAogTUFDSElORV9FTkQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0ExMjAwCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYTEyMDBfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ0ZWE1NzY3IiwgMHg4MSkgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhMTIwMF9pbml0KHZvaWQpCit7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZXp4X3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShnZW4yX3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShhMTIwMF9waW5fY29uZmlnKSk7CisKKwlweGFfc2V0X2kyY19pbmZvKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIEFSUkFZX0FORF9TSVpFKGExMjAwX2kyY19ib2FyZF9pbmZvKSk7CisKKwlzZXRfcHhhX2ZiX2luZm8oJmV6eF9mYl9pbmZvXzIpOworCisJcHhhX3NldF9rZXlwYWRfaW5mbygmYTEyMDBfa2V5cGFkX3BsYXRmb3JtX2RhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKIE1BQ0hJTkVfU1RBUlQoRVpYX0ExMjAwLCAiTW90b3JvbGEgRVpYIEExMjAwIikKIAkucGh5c19pbyAgICAgICAgPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdCAgICA9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5maXh1cAkJCT0gZXp4X2ZpeHVwLAogCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhX21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKLQkuaW5pdF9tYWNoaW5lICAgPSAmZXp4X2luaXQsCisJLmluaXRfbWFjaGluZSAgID0gYTEyMDBfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NQUNIX0VaWF9BOTEwCitzdGF0aWMgdm9pZCBfX2luaXQgYTkxMF9pbml0KHZvaWQpCit7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZXp4X3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShnZW4yX3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShhOTEwX3Bpbl9jb25maWcpKTsKKworCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisKKwlzZXRfcHhhX2ZiX2luZm8oJmV6eF9mYl9pbmZvXzIpOworCisJcHhhX3NldF9rZXlwYWRfaW5mbygmYTkxMF9rZXlwYWRfcGxhdGZvcm1fZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK30KKwogTUFDSElORV9TVEFSVChFWlhfQTkxMCwgIk1vdG9yb2xhIEVaWCBBOTEwIikKIAkucGh5c19pbyAgICAgICAgPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdCAgICA9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5maXh1cAkJCT0gZXp4X2ZpeHVwLAogCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhX21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKLQkuaW5pdF9tYWNoaW5lICAgPSAmZXp4X2luaXQsCisJLmluaXRfbWFjaGluZSAgID0gYTkxMF9pbml0LAogTUFDSElORV9FTkQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01BQ0hfRVpYX0U2CitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZTZfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ0ZWE1NzY3IiwgMHg4MSkgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlNl9pbml0KHZvaWQpCit7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZXp4X3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShnZW4yX3Bpbl9jb25maWcpKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlNl9waW5fY29uZmlnKSk7CisKKwlweGFfc2V0X2kyY19pbmZvKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIEFSUkFZX0FORF9TSVpFKGU2X2kyY19ib2FyZF9pbmZvKSk7CisKKwlzZXRfcHhhX2ZiX2luZm8oJmV6eF9mYl9pbmZvXzIpOworCisJcHhhX3NldF9rZXlwYWRfaW5mbygmZTZfa2V5cGFkX3BsYXRmb3JtX2RhdGEpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKIE1BQ0hJTkVfU1RBUlQoRVpYX0U2LCAiTW90b3JvbGEgRVpYIEU2IikKIAkucGh5c19pbyAgICAgICAgPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdCAgICA9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5maXh1cAkJCT0gZXp4X2ZpeHVwLAogCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhX21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKLQkuaW5pdF9tYWNoaW5lICAgPSAmZXp4X2luaXQsCisJLmluaXRfbWFjaGluZSAgID0gZTZfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NQUNIX0VaWF9FMgorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGUyX2kyY19ib2FyZF9pbmZvW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygidGVhNTc2NyIsIDB4ODEpIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZTJfaW5pdCh2b2lkKQoreworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGV6eF9waW5fY29uZmlnKSk7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZ2VuMl9waW5fY29uZmlnKSk7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZTJfcGluX2NvbmZpZykpOworCisJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBBUlJBWV9BTkRfU0laRShlMl9pMmNfYm9hcmRfaW5mbykpOworCisJc2V0X3B4YV9mYl9pbmZvKCZlenhfZmJfaW5mb18yKTsKKworCXB4YV9zZXRfa2V5cGFkX2luZm8oJmUyX2tleXBhZF9wbGF0Zm9ybV9kYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCiBNQUNISU5FX1NUQVJUKEVaWF9FMiwgIk1vdG9yb2xhIEVaWCBFMiIpCiAJLnBoeXNfaW8gICAgICAgID0gMHg0MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QgICAgPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKLQkuZml4dXAJCQk9IGV6eF9maXh1cCwKIAkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YV9tYXBfaW8sCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLAogCS50aW1lciAgICAgICAgICA9ICZweGFfdGltZXIsCi0JLmluaXRfbWFjaGluZSAgID0gJmV6eF9pbml0LAorCS5pbml0X21hY2hpbmUgICA9IGUyX2luaXQsCiBNQUNISU5FX0VORAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMKaW5kZXggODVlZDBiMy4uMGNjYzkxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgpAQCAtMzksNiArNDAsMjEgQEAKIAkJcHhhM3h4X2NsZWFyX3Jlc2V0X3N0YXR1cyhtYXNrKTsKIH0KIAordW5zaWduZWQgbG9uZyBnZXRfY2xvY2tfdGlja19yYXRlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbG9ja190aWNrX3JhdGU7CisKKwlpZiAoY3B1X2lzX3B4YTI1eCgpKQorCQljbG9ja190aWNrX3JhdGUgPSAzNjg2NDAwOworCWVsc2UgaWYgKG1hY2hpbmVfaXNfbWFpbnN0b25lKCkpCisJCWNsb2NrX3RpY2tfcmF0ZSA9IDMyNDk2MDA7CisJZWxzZQorCQljbG9ja190aWNrX3JhdGUgPSAzMjUwMDAwOworCisJcmV0dXJuIGNsb2NrX3RpY2tfcmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X2Nsb2NrX3RpY2tfcmF0ZSk7CisKIC8qCiAgKiBHZXQgdGhlIGNsb2NrIGZyZXF1ZW5jeSBhcyByZWZsZWN0ZWQgYnkgQ0NDUiBhbmQgdGhlIHR1cmJvIGZsYWcuCiAgKiBXZSBhc3N1bWUgdGhlc2UgdmFsdWVzIGhhdmUgYmVlbiBhcHBsaWVkIHZpYSBhIGZjcy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtcHhhL2dwaW8uYwppbmRleCAxNDkzMGNmLi41ZmVjMWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ3Bpby5jCkBAIC0yNSw2ICsyNSwxOCBAQAogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCisjZGVmaW5lIEdQSU8wX0JBU0UJKCh2b2lkIF9faW9tZW0gKilpb19wMnYoMHg0MEUwMDAwMCkpCisjZGVmaW5lIEdQSU8xX0JBU0UJKCh2b2lkIF9faW9tZW0gKilpb19wMnYoMHg0MEUwMDAwNCkpCisjZGVmaW5lIEdQSU8yX0JBU0UJKCh2b2lkIF9faW9tZW0gKilpb19wMnYoMHg0MEUwMDAwOCkpCisjZGVmaW5lIEdQSU8zX0JBU0UJKCh2b2lkIF9faW9tZW0gKilpb19wMnYoMHg0MEUwMDEwMCkpCisKKyNkZWZpbmUgR1BMUl9PRkZTRVQJMHgwMAorI2RlZmluZSBHUERSX09GRlNFVAkweDBDCisjZGVmaW5lIEdQU1JfT0ZGU0VUCTB4MTgKKyNkZWZpbmUgR1BDUl9PRkZTRVQJMHgyNAorI2RlZmluZSBHUkVSX09GRlNFVAkweDMwCisjZGVmaW5lIEdGRVJfT0ZGU0VUCTB4M0MKKyNkZWZpbmUgR0VEUl9PRkZTRVQJMHg0OAogCiBzdHJ1Y3QgcHhhX2dwaW9fY2hpcCB7CiAJc3RydWN0IGdwaW9fY2hpcCBjaGlwOwpAQCAtMzMsNiArNDUsMTggQEAKIAogaW50IHB4YV9sYXN0X2dwaW87CiAKKyNpZmRlZiBDT05GSUdfQ1BVX1BYQTI2eAorLyogR1BJTzg2Lzg3Lzg4Lzg5IG9uIFBYQTI2eCBoYXZlIHRoZWlyIGRpcmVjdGlvbiBiaXRzIGluIEdQRFIyIGludmVydGVkLAorICogYXMgd2VsbCBhcyB0aGVpciBBbHRlcm5hdGUgRnVuY3Rpb24gdmFsdWUgYmVpbmcgJzEnIGZvciBHUElPIGluIEdBRlJ4LgorICovCitzdGF0aWMgaW50IF9fZ3Bpb19pc19pbnZlcnRlZCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBjcHVfaXNfcHhhMjV4KCkgJiYgZ3BpbyA+IDg1OworfQorI2Vsc2UKKyNkZWZpbmUgX19ncGlvX2lzX2ludmVydGVkKGdwaW8pCSgwKQorI2VuZGlmCisKIC8qCiAgKiBDb25maWd1cmUgcGlucyBmb3IgR1BJTyBvciBvdGhlciBmdW5jdGlvbnMKICAqLwpAQCAtNzUsNyArOTksMTAgQEAKIAlncGRyID0gcHhhLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQ7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXZhbHVlID0gX19yYXdfcmVhZGwoZ3Bkcik7Ci0JdmFsdWUgJj0gfm1hc2s7CisJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChjaGlwLT5iYXNlICsgb2Zmc2V0KSkKKwkJdmFsdWUgfD0gbWFzazsKKwllbHNlCisJCXZhbHVlICY9IH5tYXNrOwogCV9fcmF3X3dyaXRlbCh2YWx1ZSwgZ3Bkcik7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC05Nyw3ICsxMjQsMTAgQEAKIAlncGRyID0gcHhhLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQ7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXRtcCA9IF9fcmF3X3JlYWRsKGdwZHIpOwotCXRtcCB8PSBtYXNrOworCWlmIChfX2dwaW9faXNfaW52ZXJ0ZWQoY2hpcC0+YmFzZSArIG9mZnNldCkpCisJCXRtcCAmPSB+bWFzazsKKwllbHNlCisJCXRtcCB8PSBtYXNrOwogCV9fcmF3X3dyaXRlbCh0bXAsIGdwZHIpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIApAQCAtMTczLDEwICsyMDMsMTcgQEAKICAqLwogc3RhdGljIGludCBfX2dwaW9faXNfb2NjdXBpZWQodW5zaWduZWQgZ3BpbykKIHsKLQlpZiAoY3B1X2lzX3B4YTI1eCgpIHx8IGNwdV9pc19weGEyN3goKSkKLQkJcmV0dXJuIEdBRlIoZ3BpbykgJiAoMHgzIDw8ICgoKGdwaW8pICYgMHhmKSAqIDIpKTsKLQllbHNlCi0JCXJldHVybiAwOworCWlmIChjcHVfaXNfcHhhMjd4KCkgfHwgY3B1X2lzX3B4YTI1eCgpKSB7CisJCWludCBhZiA9IChHQUZSKGdwaW8pID4+ICgoZ3BpbyAmIDB4ZikgKiAyKSkgJiAweDM7CisJCWludCBkaXIgPSBHUERSKGdwaW8pICYgR1BJT19iaXQoZ3Bpbyk7CisKKwkJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChncGlvKSkKKwkJCXJldHVybiBhZiAhPSAxIHx8IGRpciA9PSAwOworCQllbHNlCisJCQlyZXR1cm4gYWYgIT0gMCB8fCBkaXIgIT0gMDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBweGFfZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKQEAgLTE5MCw5ICsyMjcsOCBAQAogCQkvKiBEb24ndCBtZXNzIHdpdGggZW5hYmxlZCBHUElPcyB1c2luZyBwcmVjb25maWd1cmVkIGVkZ2VzIG9yCiAJCSAqIEdQSU9zIHNldCB0byBhbHRlcm5hdGUgZnVuY3Rpb24gb3IgdG8gb3V0cHV0IGR1cmluZyBwcm9iZQogCQkgKi8KLQkJaWYgKChHUElPX0lSUV9yaXNpbmdfZWRnZVtpZHhdIHwKLQkJICAgICBHUElPX0lSUV9mYWxsaW5nX2VkZ2VbaWR4XSB8Ci0JCSAgICAgR1BEUihncGlvKSkgJiBHUElPX2JpdChncGlvKSkKKwkJaWYgKChHUElPX0lSUV9yaXNpbmdfZWRnZVtpZHhdICYgR1BJT19iaXQoZ3BpbykpIHx8CisJCSAgICAoR1BJT19JUlFfZmFsbGluZ19lZGdlW2lkeF0gJiBHUElPX2JpdChncGlvKSkpCiAJCQlyZXR1cm4gMDsKIAogCQlpZiAoX19ncGlvX2lzX29jY3VwaWVkKGdwaW8pKQpAQCAtMjAxLDcgKzIzNywxMCBAQAogCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CiAJfQogCi0JR1BEUihncGlvKSAmPSB+R1BJT19iaXQoZ3Bpbyk7CisJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChncGlvKSkKKwkJR1BEUihncGlvKSB8PSBHUElPX2JpdChncGlvKTsKKwllbHNlCisJCUdQRFIoZ3BpbykgJj0gfkdQSU9fYml0KGdwaW8pOwogCiAJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKIAkJX19zZXRfYml0KGdwaW8sIEdQSU9fSVJRX3Jpc2luZ19lZGdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYwppbmRleCBkODk2MmEwLi5lMjk2Y2UxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jCkBAIC0xODQsMTUgKzE4NCwyMiBAQAogCUdQSU82X01NQ19DTEssCiAJR1BJTzUzX01NQ19DTEssCiAJR1BJTzhfTU1DX0NTMCwKLQkvKiB0aGVzZSBhcmUgdXNlZCBieSBBTTIwMEVQRCAqLwotCUdQSU81MV9HUElPLAotCUdQSU80OV9HUElPLAotCUdQSU80OF9HUElPLAotCUdQSU8zMl9HUElPLAotCUdQSU8xN19HUElPLAotCUdQSU8xNl9HUElPLAogfTsKIAoraW50IF9fYXR0cmlidXRlX18oKHdlYWspKSBhbTIwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjYXJyaWVyX2JvYXJkX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIHB1dCBjYXJyaWVyL2V4cGFuc2lvbiBib2FyZCBpbml0IGhlcmUgaWYKKwkgKiB0aGV5IGNhbm5vdCBiZSBkZXRlY3RlZCBwcm9ncmFtYXRpY2FsbHkKKwkgKi8KKwlhbTIwMF9pbml0KCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBndW1zdGl4X2luaXQodm9pZCkKIHsKIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShndW1zdGl4X3Bpbl9jb25maWcpKTsKQEAgLTIwMSw2ICsyMDgsNyBAQAogCWd1bXN0aXhfdWRjX2luaXQoKTsKIAlndW1zdGl4X21tY19pbml0KCk7CiAJKHZvaWQpIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCWNhcnJpZXJfYm9hcmRfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKEdVTVNUSVgsICJHdW1zdGl4IikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2g1MDAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmU0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogSGFyZHdhcmUgZGVmaW5pdGlvbnMgZm9yIEhQIGlQQVEgaDV4eHggSGFuZGhlbGQgQ29tcHV0ZXJzCisgKgorICogQ29weXJpZ2h0IDIwMDAtMjAwMyAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKiBDb3B5cmlnaHQgMjAwMiAgICAgICBKYW1leSBIaWNrcyA8amFtZXkuaGlja3NAaHAuY29tPgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSAgUGhpbCBCbHVuZGVsbCA8cGJAaGFuZGhlbGRzLm9yZz4KKyAqIENvcHlyaWdodCAyMDA3LTIwMDggIEFudG9uIFZvcm9udHNvdiA8Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTiBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTRUQgT1IgSU1QTElFRCwKKyAqIEFTIFRPIFRIRSBVU0VGVUxORVNTIE9SIENPUlJFQ1RORVNTIE9GIFRISVMgQ09ERSBPUiBJVFMKKyAqIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQXV0aG9yOiBKYW1leSBIaWNrcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9oNTAwMC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKy8qCisgKiBGbGFzaAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBoNTAwMF9mbGFzaDBfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgPSAiYm9vdGxkciIsCisJCS5zaXplID0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9IDAsCisJCS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAicm9vdCIsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGg1MDAwX2ZsYXNoMV9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJzZWNvbmQgcm9vdCIsCisJCS5zaXplID0gU1pfMTZNIC0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9IDAsCisJfSwKKwl7CisJCS5uYW1lID0gImFzc2V0IiwKKwkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkubWFza19mbGFncyA9IE1URF9XUklURUFCTEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGg1MDAwX2ZsYXNoMF9kYXRhID0geworCS53aWR0aCA9IDQsCisJLnBhcnRzID0gaDUwMDBfZmxhc2gwX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShoNTAwMF9mbGFzaDBfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBoNTAwMF9mbGFzaDFfZGF0YSA9IHsKKwkud2lkdGggPSA0LAorCS5wYXJ0cyA9IGg1MDAwX2ZsYXNoMV9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUoaDUwMDBfZmxhc2gxX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoNTAwMF9mbGFzaDBfcmVzb3VyY2VzID0geworCS5zdGFydCA9IFBYQV9DUzBfUEhZUywKKwkuZW5kID0gUFhBX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfTUVNXzMyQklULAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoNTAwMF9mbGFzaDFfcmVzb3VyY2VzID0geworCS5zdGFydCA9IFBYQV9DUzBfUEhZUyArIFNaXzMyTSwKKwkuZW5kID0gUFhBX0NTMF9QSFlTICsgU1pfMzJNICsgU1pfMTZNIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfTUVNXzMyQklULAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDUwMDBfZmxhc2hbXSA9IHsKKwl7CisJCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAorCQkuaWQgPSAwLAorCQkucmVzb3VyY2UgPSAmaDUwMDBfZmxhc2gwX3Jlc291cmNlcywKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmaDUwMDBfZmxhc2gwX2RhdGEsCisJCX0sCisJfSwKKwl7CisJCS5uYW1lID0gInBoeXNtYXAtZmxhc2giLAorCQkuaWQgPSAxLAorCQkucmVzb3VyY2UgPSAmaDUwMDBfZmxhc2gxX3Jlc291cmNlcywKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmaDUwMDBfZmxhc2gxX2RhdGEsCisJCX0sCisJfSwKK307CisKKy8qCisgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKKyAqLworCitzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIGg1MDAwX3VkY19tYWNoX2luZm8gX19pbml0ZGF0YSA9IHsKKwkuZ3Bpb19wdWxsdXAgPSBINTAwMF9HUElPX1VTQl9QVUxMVVAsCit9OworCisvKgorICogR1BJTyBzZXR1cAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGg1MDAwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIENyeXN0YWwgYW5kIENsb2NrIFNpZ25hbHMgKi8KKwlHUElPMTJfMzJLSHosCisKKwkvKiBTRFJBTSBhbmQgU3RhdGljIE1lbW9yeSBJL08gU2lnbmFscyAqLworCUdQSU8xNV9uQ1NfMSwKKwlHUElPNzhfbkNTXzIsCisJR1BJTzc5X25DU18zLAorCUdQSU84MF9uQ1NfNCwKKworCS8qIEZGVUFSVCAqLworCUdQSU8zNF9GRlVBUlRfUlhELAorCUdQSU8zNV9GRlVBUlRfQ1RTLAorCUdQSU8zNl9GRlVBUlRfRENELAorCUdQSU8zN19GRlVBUlRfRFNSLAorCUdQSU8zOF9GRlVBUlRfUkksCisJR1BJTzM5X0ZGVUFSVF9UWEQsCisJR1BJTzQwX0ZGVUFSVF9EVFIsCisJR1BJTzQxX0ZGVUFSVF9SVFMsCisKKwkvKiBCVFVBUlQgKi8KKwlHUElPNDJfQlRVQVJUX1JYRCwKKwlHUElPNDNfQlRVQVJUX1RYRCwKKwlHUElPNDRfQlRVQVJUX0NUUywKKwlHUElPNDVfQlRVQVJUX1JUUywKKworCS8qIFNTUDEgKi8KKwlHUElPMjNfU1NQMV9TQ0xLLAorCUdQSU8yNV9TU1AxX1RYRCwKKwlHUElPMjZfU1NQMV9SWEQsCit9OworCisvKgorICogTG9jYWxidXMgc2V0dXA6CisgKiBDUzA6IEZsYXNoOworICogQ1MxOiBNZWRpYVEgY2hpcCwgc2VsZWN0IDE2LWJpdCBidXMgYW5kIHZsaW87CisgKiBDUzU6IFNBTUNPUC4KKyAqLworCitzdGF0aWMgdm9pZCBmaXhfbXNjKHZvaWQpCit7CisJTVNDMCA9IDB4MTI5YzI0ZjI7CisJTVNDMSA9IDB4N2ZmNDI0ZmE7CisJTVNDMiA9IDB4N2ZmNDdmZjQ7CisKKwlNRFJFRlIgfD0gMHgwMjA4MDAwMDsKK30KKworLyoKKyAqIFBsYXRmb3JtIGRldmljZXMKKyAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmg1MDAwX2ZsYXNoWzBdLAorCSZoNTAwMF9mbGFzaFsxXSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoNTAwMF9pbml0KHZvaWQpCit7CisJZml4X21zYygpOworCisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoaDUwMDBfcGluX2NvbmZpZykpOworCXB4YV9zZXRfdWRjX2luZm8oJmg1MDAwX3VkY19tYWNoX2luZm8pOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKEFSUkFZX0FORF9TSVpFKGRldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChINTQwMCwgIkhQIGlQQVEgSDUwMDAiKQorCS5waHlzX2lvID0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QgPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMgPSAweGEwMDAwMTAwLAorCS5tYXBfaW8gPSBweGFfbWFwX2lvLAorCS5pbml0X2lycSA9IHB4YTI1eF9pbml0X2lycSwKKwkudGltZXIgPSAmcHhhX3RpbWVyLAorCS5pbml0X21hY2hpbmUgPSBoNTAwMF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2ltb3RlMi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaW1vdGUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0YzVlMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2ltb3RlMi5jCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvaW1vdGUyLmMKKyAqCisgKiBBdXRob3I6CUVkIEMuIEVwcAorICogQ3JlYXRlZDoJTm92IDA1LCAyMDAyCisgKiBDb3B5cmlnaHQ6CUludGVsIENvcnAuCisgKgorICogTW9kaWZpZWQgMjAwODogIEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGUgSW1vdGUyIGlzIGEgd2lyZWxlc3Mgc2Vuc29yIG5vZGUgcGxhdGZvcm0gc29sZAorICogYnkgQ3Jvc3Nib3cgKHd3dy54Ym93LmNvbSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwM3guaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjd4Lmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLXNzcC5oPgorI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eF9zcGkuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTI3eC11ZGMuaD4KKworI2luY2x1ZGUgImRldmljZXMuaCIKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGltb3RlMl9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKworCS8qIERldmljZSBJZGVudGlmaWNhdGlvbiBmb3Igd2FrZXVwKi8KKwlHUElPMTAyX0dQSU8sCisKKwkvKiBCdXR0b24gKi8KKwlHUElPOTFfR1BJTywKKworCS8qIERBOTAzMCAqLworCUdQSU8xX0dQSU8sCisKKwkvKiBNTUMgKi8KKwlHUElPMzJfTU1DX0NMSywKKwlHUElPMTEyX01NQ19DTUQsCisJR1BJTzkyX01NQ19EQVRfMCwKKwlHUElPMTA5X01NQ19EQVRfMSwKKwlHUElPMTEwX01NQ19EQVRfMiwKKwlHUElPMTExX01NQ19EQVRfMywKKworCS8qIDgwMi4xNS40IHJhZGlvIC0gZHJpdmVyIG91dCBvZiBtYWlubGluZSAqLworCUdQSU8yMl9HUElPLAkJCS8qIENDX1JTVE4gKi8KKwlHUElPMTE0X0dQSU8sCQkJLyogQ0NfRklGTyAqLworCUdQSU8xMTZfR1BJTywJCQkvKiBDQ19DQ0EgKi8KKwlHUElPMF9HUElPLAkJCS8qIENDX0ZJRk9QICovCisJR1BJTzE2X0dQSU8sCQkJLyogQ0NTRkQgKi8KKwlHUElPMzlfR1BJTywJCQkvKiBDU24gKi8KKwlHUElPMTE1X0dQSU8sCQkJLyogUG93ZXIgZW5hYmxlICovCisKKwkvKiBJMkMgKi8KKwlHUElPMTE3X0kyQ19TQ0wsCisJR1BJTzExOF9JMkNfU0RBLAorCisJLyogU1NQIDMgLSA4MDIuMTUuNCByYWRpbyAqLworCUdQSU8zOV9HUElPLCAJCQkvKiBDaGlwIFNlbGVjdCAqLworCUdQSU8zNF9TU1AzX1NDTEssCisJR1BJTzM1X1NTUDNfVFhELAorCUdQSU80MV9TU1AzX1JYRCwKKworCS8qIFNTUCAyIC0gdG8gZGF1Z2h0ZXIgYm9hcmRzICovCisJR1BJTzM3X0dQSU8sCQkJLyogQ2hpcCBTZWxlY3QgKi8KKwlHUElPMzZfU1NQMl9TQ0xLLAorCUdQSU8zOF9TU1AyX1RYRCwKKwlHUElPMTFfU1NQMl9SWEQsCisKKwkvKiBTU1AgMSAtIHRvIGRhdWdodGVyIGJvYXJkcyAqLworCUdQSU8yNF9HUElPLAkJCS8qIENoaXAgU2VsZWN0ICovCisJR1BJTzIzX1NTUDFfU0NMSywKKwlHUElPMjVfU1NQMV9UWEQsCisJR1BJTzI2X1NTUDFfUlhELAorCisJLyogQlRVQVJUIEJhc2ljIENvbm5lY3RvciovCisJR1BJTzQyX0JUVUFSVF9SWEQsCisJR1BJTzQzX0JUVUFSVF9UWEQsCisJR1BJTzQ0X0JUVUFSVF9DVFMsCisJR1BJTzQ1X0JUVUFSVF9SVFMsCisKKwkvKiBTVFVBUlQgU2VyaWFsIGNvbnNvbGUgdmlhIGRlYnVnIGJvYXJkKi8KKwlHUElPNDZfU1RVQVJUX1JYRCwKKwlHUElPNDdfU1RVQVJUX1RYRCwKKworCS8qIEJhc2ljIHNlbnNvciBib2FyZCAqLworCUdQSU85Nl9HUElPLAkvKiBhY2NlbGVyb21ldGVyIGludGVycnVwdCAqLworCUdQSU85OV9HUElPLAkvKiBBREMgaW50ZXJydXB0ICovCisKKwkvKiBDb25uZWN0b3IgcGlucyBzcGVjaWZpZWQgYXMgZ3Bpb3MgKi8KKwlHUElPOTRfR1BJTywgLyogbGFyZ2UgYmFzaWMgY29ubmVjdG9yIHBpbiAxNCAqLworCUdQSU8xMF9HUElPLCAvKiBsYXJnZSBiYXNpYyBjb25uZWN0b3IgcGluIDIzICovCisKKwkvKiBMRURTICovCisJR1BJTzEwM19HUElPLCAvKiByZWQgbGVkICovCisJR1BJTzEwNF9HUElPLCAvKiBncmVlbiBsZWQgKi8KKwlHUElPMTA1X0dQSU8sIC8qIGJsdWUgbGVkICovCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGltb3RlMl9sZWRfcGluc1tdID0geworCXsKKwkJLm5hbWUgICAgICAgPSAgImltb3RlMjpyZWQiLAorCQkuZ3BpbyAgICAgICA9IDEwMywKKwkJLmFjdGl2ZV9sb3cgPSAxLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAiaW1vdGUyOmdyZWVuIiwKKwkJLmdwaW8gICAgICAgPSAxMDQsCisJCS5hY3RpdmVfbG93ID0gMSwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImltb3RlMjpibHVlIiwKKwkJLmdwaW8gICAgICAgPSAxMDUsCisJCS5hY3RpdmVfbG93ID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGltb3RlMl9sZWRfZGF0YSA9IHsKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGltb3RlMl9sZWRfcGlucyksCisJLmxlZHMgICAgID0gaW1vdGUyX2xlZF9waW5zLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW1vdGUyX2xlZHMgPSB7CisJLm5hbWUgPSAibGVkcy1ncGlvIiwKKwkuaWQgICA9IC0xLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZWRfZGF0YSwKKwl9LAorfTsKKworLyogUmV2ZXJzZSBlbmdpbmVlcmVkIHBhcnRseSBmcm9tIFBsYXRmb3JteCBkcml2ZXJzICovCitlbnVtIGltb3RlMl9sZG9zeworCXZjY192cmVmLAorCXZjY19jYzI0MjAsCisJdmNjX21pY2EsCisJdmNjX2J0LAorCS8qIFRoZSB0d28gdm9sdGFnZXMgYXZhaWxhYmxlIHRvIHNlbnNvciBib2FyZHMgKi8KKwl2Y2Nfc2Vuc29yXzFfOCwKKwl2Y2Nfc2Vuc29yXzMsCisKKwl2Y2Nfc3JhbV9leHQsIC8qIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgcHhhMjcxICovCisJdmNjX3B4YV9wbGwsCisJdmNjX3B4YV91c2ltLCAvKiBSZWZlcmVuY2Ugdm9sdGFnZSBmb3IgY2VydGFpbiBncGlvcyAqLworCXZjY19weGFfbWVtLAorCXZjY19weGFfZmxhc2gsCisJdmNjX3B4YV9jb3JlLCAvKkRjLURjIGJ1Y2sgbm90IHlldCBzdXBwb3J0ZWQgKi8KKwl2Y2NfbGNkLAorCXZjY19iYiwKKwl2Y2NfYmJpbywKKwl2Y2NfaW8sIC8qIGNjMjQyMCA4MDIuMTUuNCByYWRpbyBhbmQgcHhhIHZjY19pbyA/Ki8KK307CisKKy8qIFRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlvdXMgcmVndWxhdG9yIGNvbnN0cmFpbnRzIGFyZSBvYnZpb3VzbHkgZGVwZW5kZW50CisgKiBvbiBleGFjdGx5IHdoYXQgaXMgd2lyZWQgdG8gZWFjaCBsZG8uICBVbmZvcnR1bmF0ZWx5IHRoaXMgaW5mb3JtYXRpb24gaXMKKyAqIG5vdCBnZW5lcmFsbHkgYXZhaWxhYmxlLiAgTW9yZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQgZnJvbSBYYm93CisgKiBidXQgYXMgb2YgeWV0IHRoZXkgaGF2ZW4ndCBiZWVuIGZvcnRoY29taW5nLgorICoKKyAqIFNvbWUgb2YgdGhlc2UgYXJlIGNsZWFybHkgU3RhcmdhdGUgMiByZWxhdGVkIChubyB3YXkgb2YgcGx1Z2dpbmcKKyAqIGluIGFuIGxjZCBvbiB0aGUgSU0yIGZvciBleGFtcGxlISkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBpbW90ZTJfbGRvX2luaXRfZGF0YVtdID0geworCVt2Y2NfYmJpb10gPSB7CisJCS5jb25zdHJhaW50cyA9IHsgLyogYm9hcmQgZGVmYXVsdCAxLjhWICovCisJCQkubmFtZSA9ICJ2Y2NfYmJpbyIsCisJCQkubWluX3VWID0gMTgwMDAwMCwKKwkJCS5tYXhfdVYgPSAxODAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19iYl0gPSB7CisJCS5jb25zdHJhaW50cyA9IHsgLyogYm9hcmQgZGVmYXVsdCAyLjhWICovCisJCQkubmFtZSA9ICJ2Y2NfYmIiLAorCQkJLm1pbl91ViA9IDI3MDAwMDAsCisJCQkubWF4X3VWID0gMzAwMDAwMCwKKwkJfSwKKwl9LAorCVt2Y2NfcHhhX2ZsYXNoXSA9IHsKKwkJLmNvbnN0cmFpbnRzID0gey8qIGRlZmF1bHQgaXMgMS44ViAqLworCQkJLm5hbWUgPSAidmNjX3B4YV9mbGFzaCIsCisJCQkubWluX3VWID0gMTgwMDAwMCwKKwkJCS5tYXhfdVYgPSAxODAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19jYzI0MjBdID0geyAvKiBhbHNvIHZjY19pbyAqLworCQkuY29uc3RyYWludHMgPSB7CisJCQkvKiBib2FyZCBkZWZhdWx0IGlzIDIuOFYgKi8KKwkJCS5uYW1lID0gInZjY19jYzI0MjAiLAorCQkJLm1pbl91ViA9IDI3MDAwMDAsCisJCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJfSwKKwl9LAorCVt2Y2NfdnJlZl0gPSB7IC8qIFJlZmVyZW5jZSBmb3Igd2hhdD8gKi8KKwkJLmNvbnN0cmFpbnRzID0geyAvKiBkZWZhdWx0IDEuOFYgKi8KKwkJCS5uYW1lID0gInZjY192cmVmIiwKKwkJCS5taW5fdVYgPSAxODAwMDAwLAorCQkJLm1heF91ViA9IDE4MDAwMDAsCisJCX0sCisJfSwKKwlbdmNjX3NyYW1fZXh0XSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geyAvKiBkZWZhdWx0IDIuOFYgKi8KKwkJCS5uYW1lID0gInZjY19zcmFtX2V4dCIsCisJCQkubWluX3VWID0gMjgwMDAwMCwKKwkJCS5tYXhfdVYgPSAyODAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19taWNhXSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geyAvKiBkZWZhdWx0IDIuOFYgKi8KKwkJCS5uYW1lID0gInZjY19taWNhIiwKKwkJCS5taW5fdVYgPSAyODAwMDAwLAorCQkJLm1heF91ViA9IDI4MDAwMDAsCisJCX0sCisJfSwKKwlbdmNjX2J0XSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geyAvKiBkZWZhdWx0IDIuOFYgKi8KKwkJCS5uYW1lID0gInZjY19idCIsCisJCQkubWluX3VWID0gMjgwMDAwMCwKKwkJCS5tYXhfdVYgPSAyODAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19sY2RdID0geworCQkuY29uc3RyYWludHMgPSB7IC8qIGRlZmF1bHQgMi44ViAqLworCQkJLm5hbWUgPSAidmNjX2xjZCIsCisJCQkubWluX3VWID0gMjcwMDAwMCwKKwkJCS5tYXhfdVYgPSAzMzAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19pb10gPSB7IC8qIFNhbWUgb3IgaGlnaGVyIHRoYW4gZXZlcnl0aGluZworCQkJICAqIGJhciB2Y2NiYXQgYW5kIHZjY3VzYiAqLworCQkuY29uc3RyYWludHMgPSB7IC8qIGRlZmF1bHQgMi44ViAqLworCQkJLm5hbWUgPSAidmNjX2lvIiwKKwkJCS5taW5fdVYgPSAyNjkyMDAwLAorCQkJLm1heF91ViA9IDMzMDAwMDAsCisJCX0sCisJfSwKKwlbdmNjX3NlbnNvcl8xXzhdID0geworCQkuY29uc3RyYWludHMgPSB7IC8qIGRlZmF1bHQgMS44ViAqLworCQkJLm5hbWUgPSAidmNjX3NlbnNvcl8xXzgiLAorCQkJLm1pbl91ViA9IDE4MDAwMDAsCisJCQkubWF4X3VWID0gMTgwMDAwMCwKKwkJfSwKKwl9LAorCVt2Y2Nfc2Vuc29yXzNdID0geyAvKiBjdXJpb3VzbHkgZGVmYXVsdCAyLjhWICovCisJCS5jb25zdHJhaW50cyA9IHsKKwkJCS5uYW1lID0gInZjY19zZW5zb3JfMyIsCisJCQkubWluX3VWID0gMjgwMDAwMCwKKwkJCS5tYXhfdVYgPSAzMDAwMDAwLAorCQl9LAorCX0sCisJW3ZjY19weGFfcGxsXSA9IHsgLyogMS4xN1YgLSAxLjQzViwgZGVmYXVsdCAxLjNWKi8KKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm5hbWUgPSAidmNjX3B4YV9wbGwiLAorCQkJLm1pbl91ViA9IDExNzAwMDAsCisJCQkubWF4X3VWID0gMTQzMDAwMCwKKwkJfSwKKwl9LAorCVt2Y2NfcHhhX3VzaW1dID0geworCQkuY29uc3RyYWludHMgPSB7IC8qIGRlZmF1bHQgMS44ViAqLworCQkJLm5hbWUgPSAidmNjX3B4YV91c2ltIiwKKwkJCS5taW5fdVYgPSAxNzEwMDAwLAorCQkJLm1heF91ViA9IDIxNjAwMDAsCisJCX0sCisJfSwKKwlbdmNjX3B4YV9tZW1dID0geworCQkuY29uc3RyYWludHMgPSB7IC8qIGRlZmF1bHQgMS44ViAqLworCQkJLm5hbWUgPSAidmNjX3B4YV9tZW0iLAorCQkJLm1pbl91ViA9IDE4MDAwMDAsCisJCQkubWF4X3VWID0gMTgwMDAwMCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkYTkwM3hfc3ViZGV2X2luZm8gaW1vdGUyX2RhOTAzMF9zdWJkZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzIsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19iYmlvXSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPMywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaW1vdGUyX2xkb19pbml0X2RhdGFbdmNjX2JiXSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPNCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaW1vdGUyX2xkb19pbml0X2RhdGFbdmNjX3B4YV9mbGFzaF0sCisJfSwgeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzUsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19jYzI0MjBdLAorCX0sIHsKKwkJLm5hbWUgPSAiZGE5MDN4LXJlZ3VsYXRvciIsCisJCS5pZCA9IERBOTAzMF9JRF9MRE82LAorCQkucGxhdGZvcm1fZGF0YSA9ICZpbW90ZTJfbGRvX2luaXRfZGF0YVt2Y2NfdnJlZl0sCisJfSwgeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzcsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19zcmFtX2V4dF0sCisJfSwgeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzgsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19taWNhXSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPOSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaW1vdGUyX2xkb19pbml0X2RhdGFbdmNjX2J0XSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPMTAsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19zZW5zb3JfMV84XSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPMTEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19zZW5zb3JfM10sCisJfSwgeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzEyLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpbW90ZTJfbGRvX2luaXRfZGF0YVt2Y2NfbGNkXSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPMTUsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19weGFfcGxsXSwKKwl9LCB7CisJCS5uYW1lID0gImRhOTAzeC1yZWd1bGF0b3IiLAorCQkuaWQgPSBEQTkwMzBfSURfTERPMTcsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9sZG9faW5pdF9kYXRhW3ZjY19weGFfdXNpbV0sCisJfSwgeworCQkubmFtZSA9ICJkYTkwM3gtcmVndWxhdG9yIiwKKwkJLmlkID0gREE5MDMwX0lEX0xETzE4LAorCQkucGxhdGZvcm1fZGF0YSA9ICZpbW90ZTJfbGRvX2luaXRfZGF0YVt2Y2NfaW9dLAorCX0sIHsKKwkJLm5hbWUgPSAiZGE5MDN4LXJlZ3VsYXRvciIsCisJCS5pZCA9IERBOTAzMF9JRF9MRE8xOSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaW1vdGUyX2xkb19pbml0X2RhdGFbdmNjX3B4YV9tZW1dLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGRhOTAzeF9wbGF0Zm9ybV9kYXRhIGltb3RlMl9kYTkwMzBfcGRhdGEgPSB7CisJLm51bV9zdWJkZXZzID0gQVJSQVlfU0laRShpbW90ZTJfZGE5MDMwX3N1YmRldnMpLAorCS5zdWJkZXZzID0gaW1vdGUyX2RhOTAzMF9zdWJkZXZzLAorfTsKKworLyogQXMgdGhlIHRoZSBpbW90ZTIgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBhIGNvbnZlbnRpb25hbCBTRCBzbG90CisgKiB0aGVyZSBpcyBubyBvcHRpb24gdG8gaG90cGx1ZyBjYXJkcywgbWFraW5nIGFsbCB0aGlzIHJhdGhlciBzaW1wbGUKKyAqLworc3RhdGljIGludCBpbW90ZTJfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJhdGhlciBzaW1wbGUgY2FzZSBhcyBob3RwbHVnZ2luZyBub3QgcG9zc2libGUgKi8KK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgaW1vdGUyX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5vY3JfbWFzayA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0LCAvKiBkZWZhdWx0IGFueXdheSAqLworCS5nZXRfcm8gPSBpbW90ZTJfbWNpX2dldF9ybywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBpbW90ZTJmbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJCb290bG9hZGVyIiwKKwkJLnNpemUgPSAweDAwMDQwMDAwLAorCQkub2Zmc2V0ID0gMCwKKwkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFLAorCX0sIHsKKwkJLm5hbWUgPSAiS2VybmVsIiwKKwkJLnNpemUgPSAweDAwMjAwMDAwLAorCQkub2Zmc2V0ID0gMHgwMDA0MDAwMCwKKwkJLm1hc2tfZmxhZ3MgPSAwLAorCX0sIHsKKwkJLm5hbWUgPSAiRmlsZXN5c3RlbSIsCisJCS5zaXplID0gMHgwMURDMDAwMCwKKwkJLm9mZnNldCA9IDB4MDAyNDAwMDAsCisJCS5tYXNrX2ZsYWdzID0gMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gUFhBX0NTMF9QSFlTLAorCS5lbmQgPSBQWEFfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGltb3RlMl9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZSA9ICJjZmlfcHJvYmUiLAorCS5wYXJ0cyA9IGltb3RlMmZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShpbW90ZTJmbGFzaF9wYXJ0aXRpb25zKSwKKwkubmFtZSA9ICJQWEEyN3hPbkNoaXBST00iLAorCS53aWR0aCA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbW90ZTJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lID0gInB4YTJ4eC1mbGFzaCIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpbW90ZTJfZmxhc2hfZGF0YSwKKwl9LAorCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorfTsKKworLyogU29tZSBvZiB0aGUgZHJpdmVycyBoZXJlIGFyZSBvdXQgb2Yga2VybmVsIGF0IHRoZSBtb21lbnQgKHBhcnRzIG9mIElJTykKKyAqIGFuZCBpdCBtYXkgYmUgYSB3aGlsZSBiZWZvcmUgdGhleSBhcmUgaW4gdGhlIG1haW5saW5lLgorICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaW1vdGUyX2kyY19ib2FyZF9pbmZvW10gPSB7CisJeyAvKiBVQ0FNIHNlbnNvciBib2FyZCAqLworCQkudHlwZSA9ICJtYXgxMjM4IiwKKwkJLmFkZHIgPSAweDM1LAorCX0sIHsgLyogSVRTNDAwIFNlbnNvciBib2FyZCBvbmx5ICovCisJCS50eXBlID0gIm1heDEzNjMiLAorCQkuYWRkciA9IDB4MzQsCisJCS8qIFRocm91Z2ggYSBuYW5kIGdhdGUgLSBBbHNvIGJld2FyZSwgb24gVjIgc2Vuc29yIGJvYXJkIHRoZQorCQkgKiBwdWxsIHVwIHJlc2lzdG9ycyBhcmUgbWlzc2luZy4KKwkJICovCisJCS5pcnEgPSBJUlFfR1BJTyg5OSksCisJfSwgeyAvKiBJVFM0MDAgU2Vuc29yIGJvYXJkIG9ubHkgKi8KKwkJLnR5cGUgPSAidHNsMjU2MSIsCisJCS5hZGRyID0gMHg0OSwKKwkJLyogVGhyb3VnaCBhIG5hbmQgZ2F0ZSAtIEFsc28gYmV3YXJlLCBvbiBWMiBzZW5zb3IgYm9hcmQgdGhlCisJCSAqIHB1bGwgdXAgcmVzaXN0b3JzIGFyZSBtaXNzaW5nLgorCQkgKi8KKwkJLmlycSA9IElSUV9HUElPKDk5KSwKKwl9LCB7IC8qIElUUzQwMCBTZW5zb3IgYm9hcmQgb25seSAqLworCQkudHlwZSA9ICJ0bXAxNzUiLAorCQkuYWRkciA9IDB4NEEsCisJCS5pcnEgPSBJUlFfR1BJTyg5NiksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBpbW90ZTJfcHdyX2kyY19ib2FyZF9pbmZvW10gPSB7CisJeworCQkudHlwZSA9ICJkYTkwMzAiLAorCQkuYWRkciA9IDB4NDksCisJCS5wbGF0Zm9ybV9kYXRhID0gJmltb3RlMl9kYTkwMzBfcGRhdGEsCisJCS5pcnEgPSBncGlvX3RvX2lycSgxKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBweGFfc3NwX21hc3Rlcl8wX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3NwaV9tYXN0ZXIgcHhhX3NzcF9tYXN0ZXJfMV9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdCA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfbWFzdGVyIHB4YV9zc3BfbWFzdGVyXzJfaW5mbyA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSAxLAorfTsKKworLyogUGF0Y2ggcG9zdGVkIGJ5IEVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiB3aWxsIHJlbW92ZQorICogdGhlIG5lZWQgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgc3BpMWNvbnRyb2wodTMyIGNvbW1hbmQpCit7CisJZ3Bpb19zZXRfdmFsdWUoMjQsIGNvbW1hbmQgJiBQWEEyWFhfQ1NfQVNTRVJUID8gMCA6IDEpOworfTsKKworc3RhdGljIHZvaWQgc3BpM2NvbnRyb2wodTMyIGNvbW1hbmQpCit7CisJZ3Bpb19zZXRfdmFsdWUoMzksIGNvbW1hbmQgJiBQWEEyWFhfQ1NfQVNTRVJUID8gMCA6IDEpOworfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgc3RhY2NlbF9jaGlwX2luZm8gPSB7CisJLnR4X3RocmVzaG9sZCA9IDgsCisJLnJ4X3RocmVzaG9sZCA9IDgsCisJLmRtYV9idXJzdF9zaXplID0gOCwKKwkudGltZW91dCA9IDIzNSwKKwkuY3NfY29udHJvbCA9IHNwaTFjb250cm9sLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgY2MyNDIwX2luZm8gPSB7CisJLnR4X3RocmVzaG9sZCA9IDgsCisJLnJ4X3RocmVzaG9sZCA9IDgsCisJLmRtYV9idXJzdF9zaXplID0gOCwKKwkudGltZW91dCA9IDIzNSwKKwkuY3NfY29udHJvbCA9IHNwaTNjb250cm9sLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeyAvKiBEcml2ZXIgaW4gSUlPICovCisJCS5tb2RhbGlhcyA9ICJsaXMzbDAyZHEiLAorCQkubWF4X3NwZWVkX2h6ID0gODAwMDAwMCwvKiA4TUh6IG1heCBzcGkgZnJlcXVlbmN5IGF0IDNWICovCisJCS5idXNfbnVtID0gMSwKKwkJLmNoaXBfc2VsZWN0ID0gMCwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzdGFjY2VsX2NoaXBfaW5mbywKKwkJLmlycSA9IElSUV9HUElPKDk2KSwKKwl9LCB7IC8qIERyaXZlciBvdXQgb2Yga2VybmVsIGFzIGl0IG5lZWRzIGNvbnNpZGVyYWJsZSByZXdyaXRpbmcgKi8KKwkJLm1vZGFsaWFzID0gImNjMjQyMCIsCisJCS5tYXhfc3BlZWRfaHogPSA2NTAwMDAwLAorCQkuYnVzX251bSA9IDMsCisJCS5jaGlwX3NlbGVjdCA9IDAsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmY2MyNDIwX2luZm8sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGltMl91ZGNfY29tbWFuZChpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQWEEyWFhfVURDX0NNRF9DT05ORUNUOgorCQlVUDJPQ1IgfD0gIFVQMk9DUl9IWE9FIHwgVVAyT0NSX0RQUFVFIHwgVVAyT0NSX0RQUFVCRTsKKwkJYnJlYWs7CisJY2FzZSBQWEEyWFhfVURDX0NNRF9ESVNDT05ORUNUOgorCQlVUDJPQ1IgJj0gfihVUDJPQ1JfSFhPRSB8IFVQMk9DUl9EUFBVRSB8IFVQMk9DUl9EUFBVQkUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gaW1vdGUyX3VkY19pbmZvIF9faW5pdGRhdGEgPSB7CisJLnVkY19jb21tYW5kCQk9IGltMl91ZGNfY29tbWFuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbW90ZTJfZGV2aWNlc1tdID0geworCSZpbW90ZTJfZmxhc2hfZGV2aWNlLAorCSZpbW90ZTJfbGVkcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhIGkyY19wd3JfcGRhdGEgPSB7CisJLmZhc3RfbW9kZSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSBpMmNfcGRhdGEgPSB7CisJLmZhc3RfbW9kZSA9IDEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW1vdGUyX2luaXQodm9pZCkKK3sKKworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGltb3RlMl9waW5fY29uZmlnKSk7CisJLyogU1BJIGNoaXAgc2VsZWN0IGRpcmVjdGlvbnMgLSBhbGwgb3RoZXIgZGlyZWN0aW9ucyBzaG91bGQKKwkgKiBiZSBoYW5kbGVkIGJ5IGRyaXZlcnMuKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMzcsIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dCgyNCwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDM5LCAwKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGltb3RlMl9kZXZpY2VzLCBBUlJBWV9TSVpFKGltb3RlMl9kZXZpY2VzKSk7CisKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDEsICZweGFfc3NwX21hc3Rlcl8wX2luZm8pOworCXB4YTJ4eF9zZXRfc3BpX2luZm8oMiwgJnB4YV9zc3BfbWFzdGVyXzFfaW5mbyk7CisJcHhhMnh4X3NldF9zcGlfaW5mbygzLCAmcHhhX3NzcF9tYXN0ZXJfMl9pbmZvKTsKKworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBpbW90ZTJfaTJjX2JvYXJkX2luZm8sCisJCQkJQVJSQVlfU0laRShpbW90ZTJfaTJjX2JvYXJkX2luZm8pKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpbW90ZTJfcHdyX2kyY19ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUoaW1vdGUyX3B3cl9pMmNfYm9hcmRfaW5mbykpOworCisJcHhhMjd4X3NldF9pMmNfcG93ZXJfaW5mbygmaTJjX3B3cl9wZGF0YSk7CisJcHhhX3NldF9pMmNfaW5mbygmaTJjX3BkYXRhKTsKKworCXB4YV9zZXRfbWNpX2luZm8oJmltb3RlMl9tY2lfcGxhdGZvcm1fZGF0YSk7CisJcHhhX3NldF91ZGNfaW5mbygmaW1vdGUyX3VkY19pbmZvKTsKK30KKworTUFDSElORV9TVEFSVChJTlRFTE1PVEUyLCAiSU1PVEUgMiIpCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGltb3RlMl9pbml0LAorCS5ib290X3BhcmFtcwk9IDB4QTAwMDAxMDAsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YjM3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY2xrZGV2LmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fQVNNX01BQ0hfQ0xLREVWX0gKKyNkZWZpbmUgX19BU01fTUFDSF9DTEtERVZfSAorCisjZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCisjZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggOTU1YmZlNi4uNzgwNDYzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMzAsMTAgKzMwLDYgQEAKIAlETUFfUFJJT19MT1cgPSAyCiB9IHB4YV9kbWFfcHJpbzsKIAotI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfQVJNQ09SRSkgJiYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSBIQVZFX0FSQ0hfUENJX1NFVF9ETUFfTUFTSwkxCi0jZW5kaWYKLQogLyoKICAqIERNQSByZWdpc3RyYXRpb24KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2VzZXJpZXMtZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2VzZXJpZXMtZ3Bpby5oCmluZGV4IDRjOTBiMTMuLmVmYmQyYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9lc2VyaWVzLWdwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZXNlcmllcy1ncGlvLmgKQEAgLTQzLDggKzQzLDEwIEBACiAjZGVmaW5lIEdQSU9fRTgwMF9QQ01DSUFfUFdSMSAgICA3MwogCiAvKiBlN3h4IElyREEgcG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBHUElPX0U3WFhfSVJfT04gICAgICAgICAgMzgKKyNkZWZpbmUgR1BJT19FN1hYX0lSX09GRiAgICAgICAgIDM4CiAKIC8qIEFTSUMgcmVsYXRlZCBHUElPcyAqLwogI2RlZmluZSBHUElPX0VTRVJJRVNfVE1JT19JUlEgICAgICAgIDUKKyNkZWZpbmUgR1BJT19FU0VSSUVTX1RNSU9fUENMUiAgICAgIDE5CisjZGVmaW5lIEdQSU9fRVNFUklFU19UTUlPX1NVU1BFTkQgICA0NQogI2RlZmluZSBHUElPX0U4MDBfQU5HRUxYX0lSUSAgICAgIDgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ndW1zdGl4LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Vtc3RpeC5oCmluZGV4IDQyZWUxOTUuLjA5OWY1NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ndW1zdGl4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2d1bXN0aXguaApAQCAtOTQsMyArOTQsNyBAQAogI2RlZmluZSBHUElPMjZfUFJEWV9uQlNZX01ECQkoR1BJTzI2X1BSRFlfbkJTWSB8IEdQSU9fSU4pCiAjZGVmaW5lIEdQSU8yN19QUkRZX25CU1lfTUQJCShHUElPMjdfUFJEWV9uQlNZIHwgR1BJT19JTikKICNkZWZpbmUgR1BJTzM2X25DRF9NRAkJCShHUElPMzZfbkNEIHwgR1BJT19JTikKKworLyogZm9yIGV4cGFuc2lvbiBib2FyZHMgdGhhdCBjYW4ndCBiZSBwcm9ncmFtYXRpY2FsbHkgZGV0ZWN0ZWQgKi8KK2V4dGVybiBpbnQgYW0yMDBfaW5pdCh2b2lkKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2g1MDAwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaDUwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVhZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2g1MDAwLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgSFAgaVBBUSBoNXh4eCBIYW5kaGVsZCBDb21wdXRlcnMKKyAqCisgKiBDb3B5cmlnaHQoMjApMDIgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTU0VEIE9SIElNUExJRUQsCisgKiBBUyBUTyBUSEUgVVNFRlVMTkVTUyBPUiBDT1JSRUNUTkVTUyBPRiBUSElTIENPREUgT1IgSVRTCisgKiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEF1dGhvcjogSmFtZXkgSGlja3MKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSDUwMDBfSAorI2RlZmluZSBfX0FTTV9BUkNIX0g1MDAwX0gKKworI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorCisvKgorICogQ1BVIEdQSU9zCisgKi8KKworI2RlZmluZSBINTAwMF9HUElPX1BPV0VSX0JVVFRPTiAgICgwKQorI2RlZmluZSBINTAwMF9HUElPX1JFU0VUX0JVVFRPTl9OICgxKQorI2RlZmluZSBINTAwMF9HUElPX09QVF9JTlQgICAgICAgICgyKQorI2RlZmluZSBINTAwMF9HUElPX0JBQ0tVUF9QT1dFUiAgICgzKQorI2RlZmluZSBINTAwMF9HUElPX0FDVElPTl9CVVRUT04gICg0KQorI2RlZmluZSBINTAwMF9HUElPX0NPTV9EQ0RfU09NRVRISU5HICAoNSkgLyogd2hhdCBpcyB0aGlzIHJlYWxseSA/ICovCisvKiA2IG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19SRVNFVF9CVVRUT05fQUdBSU5fTiAoNykgLyogY29ubmVjdGVkIHRvIGdwaW8gMSBhcyB3ZWxsICovCisvKiA4IG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19SU09fTiAgICAgICAgICAoOSkgICAgICAgLyogcmVzZXQgb3V0cHV0IGZyb20gbWF4MTcwMiB3aGljaCByZWd1bGF0ZXMgMy4zIGFuZCAyLjUgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19BU0lDX0lOVF9OICAgKDEwKSAgICAgICAvKiBmcm9tIGNvbXBhbmlvbiBhc2ljICovCisjZGVmaW5lIEg1MDAwX0dQSU9fQlRfRU5WXzAgICAgICgxMSkgICAgICAgLyogdG8gTE1YOTgxNCwgc2V0IHRvIDEgYWNjb3JkaW5nIHRvIHJlZ2R1bXAgKi8KKy8qKDEyKSBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIEg1MDAwX0dQSU9fQlRfRU5WXzEgICAgICgxMykgICAgICAgLyogdG8gTE1YOTgxNCwgc2V0IHRvIDEgYWNjb3JkaW5nIHRvIHJlZ2R1bXAgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19CVF9XVSAgICAgICAgKDE0KSAgICAgICAvKiBmcm9tIExNWDk4MTQsIERlZmluZWQgYXMgSE9TVF9XQUtFVVAgaW4gdGhlIExNWDk4MjAgZGF0YSBzaGVldCAqLworLyooMTUpIGlzIENTMSMgKi8KKy8qKDE2KSBub3QgY29ubmVjdGVkICovCisvKigxNykgbm90IGNvbm5lY3RlZCAqLworLyooMTgpIGlzIHBjbWNpYSByZWFkeSAqLworLyooMTkpIGlzIGRyZXExICovCisvKigyMCkgaXMgZHJlcTAgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19PRV9SRF9OV1IJKDIxKSAgICAgICAvKiBvdXRwdXQgZW5hYmxlIG9uIHJkL253ciBzaWduYWwgdG8gY29tcGFuaW9uIGFzaWMgKi8KKy8qKDIyKSBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIEg1MDAwX0dQSU9fT1BUX1NQSV9DTEsgICgyMykgICAgICAgLyogdG8gZXh0ZW5zaW9uIHBhY2sgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19PUFRfU1BJX0NTX04gKDI0KSAgICAgICAvKiB0byBleHRlbnNpb24gcGFjayAqLworI2RlZmluZSBINTAwMF9HUElPX09QVF9TUElfRE9VVCAoMjUpICAgICAgIC8qIHRvIGV4dGVuc2lvbiBwYWNrICovCisjZGVmaW5lIEg1MDAwX0dQSU9fT1BUX1NQSV9ESU4gICgyNikgICAgICAgLyogdG8gZXh0ZW5zaW9uIHBhY2sgKi8KKy8qKDI3KSBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIEg1MDAwX0dQSU9fSTJTX0JJVENMSyAgICgyOCkgICAgICAgLyogY29ubmVjdGVkIHRvIEFDOTcgY29kZWMgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19JMlNfREFUQU9VVCAgKDI5KSAgICAgICAvKiBjb25uZWN0ZWQgdG8gQUM5NyBjb2RlYyAqLworI2RlZmluZSBINTAwMF9HUElPX0kyU19EQVRBSU4gICAoMzApICAgICAgIC8qIGNvbm5lY3RlZCB0byBBQzk3IGNvZGVjICovCisjZGVmaW5lIEg1MDAwX0dQSU9fSTJTX0xSQ0xLICAgICgzMSkgICAgICAgLyogY29ubmVjdGVkIHRvIEFDOTcgY29kZWMgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19JMlNfU1lTQ0xLICAgKDMyKSAgICAgICAvKiBjb25uZWN0ZWQgdG8gQUM5NyBjb2RlYyAqLworLyooMzMpIGlzIENTNSMgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19DT01fUlhEICAgICAgKDM0KSAgICAgICAvKiBjb25uZWN0ZWQgdG8gY3JhZGxlL2NhYmxlIGNvbm5lY3RvciAqLworI2RlZmluZSBINTAwMF9HUElPX0NPTV9DVFMgICAgICAoMzUpICAgICAgIC8qIGNvbm5lY3RlZCB0byBjcmFkbGUvY2FibGUgY29ubmVjdG9yICovCisjZGVmaW5lIEg1MDAwX0dQSU9fQ09NX0RDRCAgICAgICgzNikgICAgICAgLyogY29ubmVjdGVkIHRvIGNyYWRsZS9jYWJsZSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19DT01fRFNSICAgICAgKDM3KSAgICAgICAvKiBjb25uZWN0ZWQgdG8gY3JhZGxlL2NhYmxlIGNvbm5lY3RvciAqLworI2RlZmluZSBINTAwMF9HUElPX0NPTV9SSSAgICAgICAoMzgpICAgICAgIC8qIGNvbm5lY3RlZCB0byBjcmFkbGUvY2FibGUgY29ubmVjdG9yICovCisjZGVmaW5lIEg1MDAwX0dQSU9fQ09NX1RYRCAgICAgICgzOSkgICAgICAgLyogY29ubmVjdGVkIHRvIGNyYWRsZS9jYWJsZSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19DT01fRFRSICAgICAgKDQwKSAgICAgICAvKiBjb25uZWN0ZWQgdG8gY3JhZGxlL2NhYmxlIGNvbm5lY3RvciAqLworI2RlZmluZSBINTAwMF9HUElPX0NPTV9SVFMgICAgICAoNDEpICAgICAgIC8qIGNvbm5lY3RlZCB0byBjcmFkbGUvY2FibGUgY29ubmVjdG9yICovCisKKyNkZWZpbmUgSDUwMDBfR1BJT19CVF9SWEQgICAgICAgKDQyKSAgICAgICAvKiBjb25uZWN0ZWQgdG8gQlQgKExNWDk4MTQpICovCisjZGVmaW5lIEg1MDAwX0dQSU9fQlRfVFhEICAgICAgICg0MykgICAgICAgLyogY29ubmVjdGVkIHRvIEJUIChMTVg5ODE0KSAqLworI2RlZmluZSBINTAwMF9HUElPX0JUX0NUUyAgICAgICAoNDQpICAgICAgIC8qIGNvbm5lY3RlZCB0byBCVCAoTE1YOTgxNCkgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19CVF9SVFMgICAgICAgKDQ1KSAgICAgICAvKiBjb25uZWN0ZWQgdG8gQlQgKExNWDk4MTQpICovCisKKyNkZWZpbmUgSDUwMDBfR1BJT19JUkRBX1JYRCAgICAgKDQ2KQorI2RlZmluZSBINTAwMF9HUElPX0lSREFfVFhEICAgICAoNDcpCisKKyNkZWZpbmUgSDUwMDBfR1BJT19QT0VfTiAgICAgICAgKDQ4KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QV0VfTiAgICAgICAgKDQ5KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QSU9SX04gICAgICAgKDUwKSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QSU9XX04gICAgICAgKDUxKSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QQ0UxX04gICAgICAgKDUyKSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QQ0UyX04gICAgICAgKDUzKSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QU0tUU0VMICAgICAgKDU0KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QUkVHX04gICAgICAgKDU1KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QV0FJVF9OICAgICAgKDU2KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19JT0lTMTZfTiAgICAgKDU3KSAgICAgICAvKiB1c2VkIGZvciBwY21jaWEgKi8KKworI2RlZmluZSBINTAwMF9HUElPX0lSREFfU0QgICAgICAoNTgpICAgICAgIC8qIHRvIGhzZGwzMDAyIHNkICovCisvKig1OSkgbm90IGNvbm5lY3RlZCAqLworI2RlZmluZSBINTAwMF9HUElPX1BPV0VSX1NEX04gICAoNjApICAgICAgIC8qIGNvbnRyb2xzIHBvd2VyIHRvIFNEICovCisjZGVmaW5lIEg1MDAwX0dQSU9fUE9XRVJfUlMyMzJfTgkoNjEpICAgICAgIC8qIGludmVydGVkIEZPUkNFT04gdG8gcnMyMzIgdHJhbnNjZWl2ZXIgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19QT1dFUl9BQ0NFTF9OCSg2MikgICAgICAgLyogY29udHJvbHMgcG93ZXIgdG8gYWNjZWwgKi8KKy8qKDYzKSBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIEg1MDAwX0dQSU9fT1BUX05WUkFNICAgICg2NCkgICAgICAgLyogY29udHJvbHMgcG93ZXIgdG8gZXhwYW5zaW9uIHBhY2sgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19DSEdfRU4gICAgICAgKDY1KSAgICAgICAvKiB0byBzYzgwMSBlbiAqLworI2RlZmluZSBINTAwMF9HUElPX1VTQl9QVUxMVVAgICAoNjYpICAgICAgIC8qIFVTQiBkKyBwdWxsdXAgdmlhIDEuNUsgcmVzaXN0b3IgKi8KKyNkZWZpbmUgSDUwMDBfR1BJT19CVF8yVjhfTiAgICAgKDY3KSAgICAgICAvKiAyLjhWIHVzZWQgYnkgYmx1ZXRvb3RoICovCisjZGVmaW5lIEg1MDAwX0dQSU9fRVhUX0NIR19SQVRFICg2OCkgICAgICAgLyogZW5hYmxlcyBleHRlcm5hbCBjaGFyZ2luZyByYXRlICovCisvKig2OSkgaXMgbm90IGNvbm5lY3RlZCAqLworI2RlZmluZSBINTAwMF9HUElPX0NJUl9SRVNFVCAgICAoNzApICAgICAgIC8qIGNvbnN1bWVyIElSIHJlc2V0ICovCisjZGVmaW5lIEg1MDAwX0dQSU9fUE9XRVJfTElHSFRfU0VOU09SX04JKDcxKQorI2RlZmluZSBINTAwMF9HUElPX0JUX01fUkVTRVQgICAoNzIpCisjZGVmaW5lIEg1MDAwX0dQSU9fU1REX0NIR19SQVRFICg3MykKKyNkZWZpbmUgSDUwMDBfR1BJT19TRF9XUF9OICAgICAgKDc0KQorI2RlZmluZSBINTAwMF9HUElPX01PVE9SX09OX04gICAoNzUpICAgICAgIC8qIGV4dGVybmFsIHB1bGx1cCBvbiB0aGlzICovCisjZGVmaW5lIEg1MDAwX0dQSU9fSEVBRFBIT05FX0RFVEVDVAkoNzYpCisjZGVmaW5lIEg1MDAwX0dQSU9fVVNCX0NIR19SQVRFICg3NykgICAgICAgLyogc2VsZWN0IHJhdGUgZm9yIGNoYXJnaW5nIHZpYSB1c2IgKi8KKy8qKDc4KSBpcyBDUzIjICovCisvKig3OSkgaXMgQ1MzIyAqLworLyooODApIGlzIENTNCMgKi8KKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSDUwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBhNTgyYTZkLi4xNmFiNzk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMTAyLDYgKzEwMiw5IEBACiAgKiAgUFhBOTMwCUIwCTB4NjkwNTY4MzUJMHg1RTY0MzAxMwogICogIFBYQTkzMAlCMQkweDY5MDU2ODM3CTB4N0U2NDMwMTMKICAqICBQWEE5MzAJQjIJMHg2OTA1NjgzOAkweDhFNjQzMDEzCisgKgorICogIFBYQTkzNQlBMAkweDU2MDU2OTMxCTB4MUU2NTMwMTMKKyAqICBQWEE5MzUJQjAJMHg1NjA1NjkzNgkweDZFNjUzMDEzCiAgKi8KICNpZmRlZiBDT05GSUdfUFhBMjV4CiAjZGVmaW5lIF9fY3B1X2lzX3B4YTIxMChpZCkJCQkJXApAQCAtMTc4LDEyICsxODEsMjIgQEAKICNkZWZpbmUgX19jcHVfaXNfcHhhOTMwKGlkKQkJCQlcCiAJKHsJCQkJCQlcCiAJCXVuc2lnbmVkIGludCBfaWQgPSAoaWQpID4+IDQgJiAweGZmZjsJXAotCQlfaWQgPT0gMHg2ODM7CQlcCisJCV9pZCA9PSAweDY4MzsJCQkJXAogCSB9KQogI2Vsc2UKICNkZWZpbmUgX19jcHVfaXNfcHhhOTMwKGlkKQkoMCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NQVV9QWEE5MzUKKyNkZWZpbmUgX19jcHVfaXNfcHhhOTM1KGlkKQkJCQlcCisJKHsJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfaWQgPSAoaWQpID4+IDQgJiAweGZmZjsJXAorCQlfaWQgPT0gMHg2OTM7CQkJCVwKKwkgfSkKKyNlbHNlCisjZGVmaW5lIF9fY3B1X2lzX3B4YTkzNShpZCkJKDApCisjZW5kaWYKKwogI2RlZmluZSBjcHVfaXNfcHhhMjEwKCkJCQkJCVwKIAkoewkJCQkJCVwKIAkJX19jcHVfaXNfcHhhMjEwKHJlYWRfY3B1aWRfaWQoKSk7CVwKQEAgLTIwNCw4ICsyMTcsNiBAQAogCQlfX2NwdV9pc19weGEyNXgocmVhZF9jcHVpZF9pZCgpKTsJXAogCX0pCiAKLWV4dGVybiBpbnQgY3B1X2lzX3B4YTI2eCh2b2lkKTsKLQogI2RlZmluZSBjcHVfaXNfcHhhMjd4KCkJCQkJCVwKIAkoewkJCQkJCVwKIAkJX19jcHVfaXNfcHhhMjd4KHJlYWRfY3B1aWRfaWQoKSk7CVwKQEAgLTIzMiw2ICsyNDMsMTIgQEAKIAkJX19jcHVfaXNfcHhhOTMwKGlkKTsJCQlcCiAJIH0pCiAKKyNkZWZpbmUgY3B1X2lzX3B4YTkzNSgpCQkJCQlcCisJKHsJCQkJCQlcCisJCXVuc2lnbmVkIGludCBpZCA9IHJlYWRfY3B1aWQoQ1BVSURfSUQpOwlcCisJCV9fY3B1X2lzX3B4YTkzNShpZCk7CQkJXAorCSB9KQorCiAvKgogICogQ1BVSUQgQ29yZSBHZW5lcmF0aW9uIEJpdAogICogPD0gMHgyIGZvciBweGEyMXgvcHhhMjV4L3B4YTI2eC9weGEyN3gKQEAgLTI0OSw2ICsyNjYsMTIgQEAKIAkJX2lkID09IDB4MzsJCQkJXAogCSB9KQogCisjZGVmaW5lIF9fY3B1X2lzX3B4YTl4eChpZCkJCQkJXAorCSh7CQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX2lkID0gKGlkKSA+PiA0ICYgMHhmZmY7CVwKKwkJX2lkID09IDB4NjgzIHx8IF9pZCA9PSAweDY5MzsJCVwKKwkgfSkKKwogI2RlZmluZSBjcHVfaXNfcHhhMnh4KCkJCQkJCVwKIAkoewkJCQkJCVwKIAkJX19jcHVfaXNfcHhhMnh4KHJlYWRfY3B1aWRfaWQoKSk7CVwKQEAgLTI1OSwzMiArMjgyLDI1IEBACiAJCV9fY3B1X2lzX3B4YTN4eChyZWFkX2NwdWlkX2lkKCkpOwlcCiAJIH0pCiAKLS8qCi0gKiBIYW5keSByb3V0aW5lIHRvIHNldCBHUElPIGFsdGVybmF0ZSBmdW5jdGlvbnMKLSAqLwotZXh0ZXJuIGludCBweGFfZ3Bpb19tb2RlKCBpbnQgZ3Bpb19tb2RlICk7Ci0KLS8qCi0gKiBSZXR1cm4gR1BJTyBsZXZlbCwgbm9uemVybyBtZWFucyBoaWdoLCB6ZXJvIGlzIGxvdwotICovCi1leHRlcm4gaW50IHB4YV9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKLQotLyoKLSAqIFNldCBvdXRwdXQgR1BJTyBsZXZlbAotICovCi1leHRlcm4gdm9pZCBweGFfZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKTsKLQorI2RlZmluZSBjcHVfaXNfcHhhOXh4KCkJCQkJCVwKKwkoewkJCQkJCVwKKwkJX19jcHVfaXNfcHhhOXh4KHJlYWRfY3B1aWRfaWQoKSk7CVwKKwkgfSkKIC8qCiAgKiByZXR1cm4gY3VycmVudCBtZW1vcnkgYW5kIExDRCBjbG9jayBmcmVxdWVuY3kgaW4gdW5pdHMgb2YgMTBrSHoKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfbWVtY2xrX2ZyZXF1ZW5jeV8xMGtoeih2b2lkKTsKIAorLyogcmV0dXJuIHRoZSBjbG9jayB0aWNrIHJhdGUgb2YgdGhlIE9TIHRpbWVyICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfY2xvY2tfdGlja19yYXRlKHZvaWQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19NQUNIX0FSTUNPUkUpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKICNkZWZpbmUgUENJQklPU19NSU5fSU8JCTAKICNkZWZpbmUgUENJQklPU19NSU5fTUVNCQkwCiAjZGVmaW5lIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKQkxCisjZGVmaW5lIEhBVkVfQVJDSF9QQ0lfU0VUX0RNQV9NQVNLCTEKICNlbmRpZgogCisKICNlbmRpZiAgLyogX0FTTV9BUkNIX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggNjAwZmQ0Zi4uMjYyNjkxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTYsMTUgKzYsMTMgQEAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCiAvKgogICogV2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSByZWFsIElTQSBub3IgUENJIGJ1c2VzLCBidXQgdGhlcmUgaXMgc28gbWFueQogICogZHJpdmVycyBvdXQgdGhlcmUgdGhhdCBtaWdodCBqdXN0IHdvcmsgaWYgd2UgZmFrZSB0aGVtLi4uCiAgKi8KLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQotI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmgKaW5kZXggNWM0ZTMyMC4uNmM5YjIxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xpdHRsZXRvbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaApAQCAtMSw4ICsxLDEzIEBACi0jaWZuZGVmIF9fQVNNX0FSQ0hfWllMT05JVEVfSAotI2RlZmluZSBfX0FTTV9BUkNIX1pZTE9OSVRFX0gKKyNpZm5kZWYgX19BU01fQVJDSF9MSVRUTEVUT05fSAorI2RlZmluZSBfX0FTTV9BUkNIX0xJVFRMRVRPTl9ICisKKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2RlZmluZSBMSVRUTEVUT05fRVRIX1BIWVMJMHgzMDAwMDAwMAogCiAjZGVmaW5lIExJVFRMRVRPTl9HUElPX0xDRF9DUwkoMTcpCiAKLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1pZTE9OSVRFX0ggKi8KKyNkZWZpbmUgRVhUMF9HUElPX0JBU0UJKE5SX0JVSUxUSU5fR1BJTykKKyNkZWZpbmUgRVhUMF9HUElPKHgpCShFWFQwX0dQSU9fQkFTRSArICh4KSkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTElUVExFVE9OX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA1OWFlZjg5Li5mNjI2NzMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xOCwxNiArMTgsNiBAQAogI2RlZmluZSBQSFlTX09GRlNFVAlVTCgweGEwMDAwMDAwKQogCiAvKgotICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKLSAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCi0gKgkJYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCi0gKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCi0gKgkJdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSBfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCSBfX3BoeXNfdG9fdmlydCh4KQotCi0vKgogICogVGhlIG5vZGVzIGFyZSBtYXRjaGVkIHdpdGggdGhlIHBoeXNpY2FsIFNEUkFNIGJhbmtzIGFzIGZvbGxvd3M6CiAgKgogICogCW5vZGUgMDogIDB4YTAwMDAwMDAtMHhhM2ZmZmZmZgktLT4gIDB4YzAwMDAwMDAtMHhjM2ZmZmZmZgpAQCAtNDcsNiArMzcsNyBAQAogCWNteDJ4eF9wY2lfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQogCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECShQSFlTX09GRlNFVCArIFNaXzY0TSAtIDEpCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgU1pfNjRNKQogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEyNXguaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMjV4LmgKaW5kZXggNjE3Y2FiMi4uYTcyODY5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEyNXguaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTI1eC5oCkBAIC0xNTgsNCArMTU4LDM1IEBACiAjZGVmaW5lIEdQSU83Nl9MQ0RfUENMSwkJTUZQX0NGR19PVVQoR1BJTzc2LCBBRjIsIERSSVZFX0xPVykKICNkZWZpbmUgR1BJTzc3X0xDRF9CSUFTCQlNRlBfQ0ZHX09VVChHUElPNzcsIEFGMiwgRFJJVkVfTE9XKQogCisjaWZkZWYgQ09ORklHX0NQVV9QWEEyNngKKy8qIEdQSU8gKi8KKyNkZWZpbmUgR1BJTzg1X0dQSU8JCU1GUF9DRkdfSU4oR1BJTzg1LCBBRjApCisjZGVmaW5lIEdQSU84Nl9HUElPCQlNRlBfQ0ZHX0lOKEdQSU84NiwgQUYxKQorI2RlZmluZSBHUElPODdfR1BJTwkJTUZQX0NGR19JTihHUElPODcsIEFGMSkKKyNkZWZpbmUgR1BJTzg4X0dQSU8JCU1GUF9DRkdfSU4oR1BJTzg4LCBBRjEpCisjZGVmaW5lIEdQSU84OV9HUElPCQlNRlBfQ0ZHX0lOKEdQSU84OSwgQUYxKQorCisvKiBTRFJBTSAqLworI2RlZmluZSBHUElPODZfblNEQ1MyCQlNRlBfQ0ZHX09VVChHUElPODYsIEFGMCwgRFJJVkVfSElHSCkKKyNkZWZpbmUgR1BJTzg3X25TRENTMwkJTUZQX0NGR19PVVQoR1BJTzg3LCBBRjAsIERSSVZFX0hJR0gpCisjZGVmaW5lIEdQSU84OF9SRG5XUgkJTUZQX0NGR19PVVQoR1BJTzg4LCBBRjAsIERSSVZFX0hJR0gpCisjZGVmaW5lIEdQSU84OV9uQUNSRVNFVAkJTUZQX0NGR19PVVQoR1BJTzg5LCBBRjAsIERSSVZFX0hJR0gpCisKKy8qIFVTQiAqLworI2RlZmluZSBHUElPOV9VU0JfUkNWCQlNRlBfQ0ZHX0lOKEdQSU85LCBBRjEpCisjZGVmaW5lIEdQSU8zMl9VU0JfVlAJCU1GUF9DRkdfSU4oR1BJTzMyLCBBRjIpCisjZGVmaW5lIEdQSU8zNF9VU0JfVk0JCU1GUF9DRkdfSU4oR1BJTzM0LCBBRjIpCisjZGVmaW5lIEdQSU8zOV9VU0JfVlBPCQlNRlBfQ0ZHX09VVChHUElPMzksIEFGMywgRFJJVkVfTE9XKQorI2RlZmluZSBHUElPNTZfVVNCX1ZNTwkJTUZQX0NGR19PVVQoR1BJTzU2LCBBRjEsIERSSVZFX0xPVykKKyNkZWZpbmUgR1BJTzU3X1VTQl9uT0UJCU1GUF9DRkdfT1VUKEdQSU81NywgQUYxLCBEUklWRV9ISUdIKQorCisvKiBBU1NQICovCisjZGVmaW5lIEdQSU8yOF9BU1NQX0JJVENMS19JTglNRlBfQ0ZHX0lOKEdQSU8yOCwgQUYzKQorI2RlZmluZSBHUElPMjhfQVNTUF9CSVRDTEtfT1VUCU1GUF9DRkdfT1VUKEdQSU8yOCwgQUYzLCBEUklWRV9MT1cpCisjZGVmaW5lIEdQSU8yOV9BU1NQX1JYRAkJTUZQX0NGR19JTihHUElPMjksIEFGMykKKyNkZWZpbmUgR1BJTzMwX0FTU1BfVFhECQlNRlBfQ0ZHX09VVChHUElPMzAsIEFGMywgRFJJVkVfTE9XKQorI2RlZmluZSBHUElPMzFfQVNTUF9TRlJNX0lOCU1GUF9DRkdfSU4oR1BJTzMxLCBBRjEpCisjZGVmaW5lIEdQSU8zMV9BU1NQX1NGUk1fT1VUCU1GUF9DRkdfT1VUKEdQSU8zMSwgQUYzLCBEUklWRV9MT1cpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUZQX1BYQTI1WF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTI3eC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEyN3guaAppbmRleCAxMjJiZGJkLi5kYTRmODVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTI3eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMjd4LmgKQEAgLTExLDYgKzExLDEyIEBACiAjaW5jbHVkZSA8bWFjaC9tZnAuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEyeHguaD4KIAorLyogTm90ZTogR1BJTzMvR1BJTzQgd2lsbCBiZSBkcml2ZW4gYnkgUG93ZXIgSTJDIHdoZW4gUENGUi9QSTJDX0VOCisgKiBiaXQgaXMgc2V0LCByZWdhcmRsZXNzIG9mIHRoZSBHUElPIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBHUElPM19HUElPCQlNRlBfQ0ZHX0lOKEdQSU8zLCBBRjApCisjZGVmaW5lIEdQSU80X0dQSU8JCU1GUF9DRkdfSU4oR1BJTzQsIEFGMCkKKwogLyogR1BJTyAqLwogI2RlZmluZSBHUElPODVfR1BJTwkJTUZQX0NGR19JTihHUElPODUsIEFGMCkKICNkZWZpbmUgR1BJTzg2X0dQSU8JCU1GUF9DRkdfSU4oR1BJTzg2LCBBRjApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTkzMC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGE5MzAuaAppbmRleCBmYWJkOWI0Li5mYTczZjU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTkzMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhOTMwLmgKQEAgLTQyMSw2ICs0MjEsNyBAQAogI2RlZmluZSBHUElPMjBfUFdNMAkJTUZQX0NGR19MUE0oR1BJTzIwLCBBRjIsIFBVTExfTE9XKQogI2RlZmluZSBHUElPMjFfUFdNMgkJTUZQX0NGR19MUE0oR1BJTzIxLCBBRjMsIFBVTExfTE9XKQogI2RlZmluZSBHUElPMjJfUFdNMwkJTUZQX0NGR19MUE0oR1BJTzIyLCBBRjMsIFBVTExfTE9XKQorI2RlZmluZSBHUElPMzJfUFdNMAkJTUZQX0NGR19MUE0oR1BJTzMyLCBBRjQsIFBVTExfTE9XKQogCiAvKiBDSVIgKi8KICNkZWZpbmUgR1BJTzQ2X0NJUl9PVVQJCU1GUF9DRkcoR1BJTzQ2LCBBRjEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWlvYTcwMS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21pb2E3MDEuaAppbmRleCA4NDgzY2I1Li4wMjg2ODQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWlvYTcwMS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9taW9hNzAxLmgKQEAgLTEwLDEyICsxMCwxNCBAQAogCSAoTUZQX1BJTihwaW4pIHwgTUZQXyMjYWYgfCBNRlBfRElSX09VVCB8IE1GUF9MUE1fIyNzdGF0ZSkpCiAKIC8qIEdsb2JhbCBHUElPcyAqLwotI2RlZmluZSBHUElPOV9DSEFSR0VfbkVOCQkJOQorI2RlZmluZSBHUElPOV9DSEFSR0VfRU4JCQkJOQogI2RlZmluZSBHUElPMThfUE9XRVJPRkYJCQkJMTgKICNkZWZpbmUgR1BJTzg3X0xDRF9QT1dFUgkJCTg3CisjZGVmaW5lIEdQSU85Nl9BQ19ERVRFQ1QJCQk5NgorI2RlZmluZSBHUElPODBfTUFZQkVfQ0hBUkdFX1ZEUk9QCQk4MAkvKiBEcm9wIG9mIDg4bVYgKi8KIAogLyogVVNCICovCi0jZGVmaW5lIEdQSU8xM19VU0JfREVURUNUCQkJMTMKKyNkZWZpbmUgR1BJTzEzX25VU0JfREVURUNUCQkJMTMKICNkZWZpbmUgR1BJTzIyX1VTQl9FTkFCTEUJCQkyMgogCiAvKiBTRElPIGJpdHMgKi8KQEAgLTI0LDcgKzI2LDEwIEBACiAjZGVmaW5lIEdQSU85MV9TRElPX0VOCQkJCTkxCiAKIC8qIEJsdWV0b290aCAqLworI2RlZmluZSBHUElPMTRfQlRfbkFDVElWSVRZCQkJMTQKICNkZWZpbmUgR1BJTzgzX0JUX09OCQkJCTgzCisjZGVmaW5lIEdQSU83N19CVF9VTktOT1dOMQkJCTc3CisjZGVmaW5lIEdQSU84Nl9CVF9NQVlCRV9uUkVTRVQJCQk4NgogCiAvKiBHUFMgKi8KICNkZWZpbmUgR1BJTzIzX0dQU19VTktOT1dOMQkJCTIzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbXRkLXhpcC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL210ZC14aXAuaAppbmRleCA0ZDQ1MmZjLi5jZmNhODE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tdGQteGlwLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpZm5kZWYgX19BUkNIX1BYQV9NVERfWElQX0hfXwogI2RlZmluZSBfX0FSQ0hfUFhBX01URF9YSVBfSF9fCiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogCiAjZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YS1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaAppbmRleCAxNTI5NWQ5Li4zMWQ2MTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaApAQCAtMTMsNiArMTMsNyBAQAogI2lmbmRlZiBfX1BYQV9SRUdTX0gKICNkZWZpbmUgX19QWEFfUkVHU19ICiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKIC8qCiAgKiBQWEEgQ2hpcCBzZWxlY3RzCkBAIC0xMjMsMjk4ICsxMjQsNiBAQAogI2RlZmluZSBEQ01EX1dJRFRINAkoMyA8PCAxNCkJLyogNCBieXRlIHdpZHRoIChXb3JkKSAqLwogI2RlZmluZSBEQ01EX0xFTkdUSAkweDAxZmZmCQkvKiBsZW5ndGggbWFzayAobWF4ID0gOEsgLSAxKSAqLwogCi0KLS8qCi0gKiBVQVJUcwotICovCi0KLS8qIEZ1bGwgRnVuY3Rpb24gVUFSVCAoRkZVQVJUKSAqLwotI2RlZmluZSBGRlVBUlQJCUZGUkJSCi0jZGVmaW5lIEZGUkJSCQlfX1JFRygweDQwMTAwMDAwKSAgLyogUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgRkZUSFIJCV9fUkVHKDB4NDAxMDAwMDApICAvKiBUcmFuc21pdCBIb2xkaW5nIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBGRklFUgkJX19SRUcoMHg0MDEwMDAwNCkgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEZGSUlSCQlfX1JFRygweDQwMTAwMDA4KSAgLyogSW50ZXJydXB0IElEIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEZGRkNSCQlfX1JFRygweDQwMTAwMDA4KSAgLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBGRkxDUgkJX19SRUcoMHg0MDEwMDAwQykgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgRkZNQ1IJCV9fUkVHKDB4NDAxMDAwMTApICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBGRkxTUgkJX19SRUcoMHg0MDEwMDAxNCkgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEZGTVNSCQlfX1JFRygweDQwMTAwMDE4KSAgLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEZGU1BSCQlfX1JFRygweDQwMTAwMDFDKSAgLyogU2NyYXRjaCBQYWQgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEZGSVNSCQlfX1JFRygweDQwMTAwMDIwKSAgLyogSW5mcmFyZWQgU2VsZWN0aW9uIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBGRkRMTAkJX19SRUcoMHg0MDEwMDAwMCkgIC8qIERpdmlzb3IgTGF0Y2ggTG93IFJlZ2lzdGVyIChETEFCID0gMSkgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEZGRExICQlfX1JFRygweDQwMTAwMDA0KSAgLyogRGl2aXNvciBMYXRjaCBIaWdoIFJlZ2lzdGVyIChETEFCID0gMSkgKHJlYWQvd3JpdGUpICovCi0KLS8qIEJsdWV0b290aCBVQVJUIChCVFVBUlQpICovCi0jZGVmaW5lIEJUVUFSVAkJQlRSQlIKLSNkZWZpbmUgQlRSQlIJCV9fUkVHKDB4NDAyMDAwMDApICAvKiBSZWNlaXZlIEJ1ZmZlciBSZWdpc3RlciAocmVhZCBvbmx5KSAqLwotI2RlZmluZSBCVFRIUgkJX19SRUcoMHg0MDIwMDAwMCkgIC8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCi0jZGVmaW5lIEJUSUVSCQlfX1JFRygweDQwMjAwMDA0KSAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgQlRJSVIJCV9fUkVHKDB4NDAyMDAwMDgpICAvKiBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgQlRGQ1IJCV9fUkVHKDB4NDAyMDAwMDgpICAvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCi0jZGVmaW5lIEJUTENSCQlfX1JFRygweDQwMjAwMDBDKSAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBCVE1DUgkJX19SRUcoMHg0MDIwMDAxMCkgIC8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEJUTFNSCQlfX1JFRygweDQwMjAwMDE0KSAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgQlRNU1IJCV9fUkVHKDB4NDAyMDAwMTgpICAvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgQlRTUFIJCV9fUkVHKDB4NDAyMDAwMUMpICAvKiBTY3JhdGNoIFBhZCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgQlRJU1IJCV9fUkVHKDB4NDAyMDAwMjApICAvKiBJbmZyYXJlZCBTZWxlY3Rpb24gUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEJURExMCQlfX1JFRygweDQwMjAwMDAwKSAgLyogRGl2aXNvciBMYXRjaCBMb3cgUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgQlRETEgJCV9fUkVHKDB4NDAyMDAwMDQpICAvKiBEaXZpc29yIExhdGNoIEhpZ2ggUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KLQotLyogU3RhbmRhcmQgVUFSVCAoU1RVQVJUKSAqLwotI2RlZmluZSBTVFVBUlQJCVNUUkJSCi0jZGVmaW5lIFNUUkJSCQlfX1JFRygweDQwNzAwMDAwKSAgLyogUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgU1RUSFIJCV9fUkVHKDB4NDA3MDAwMDApICAvKiBUcmFuc21pdCBIb2xkaW5nIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBTVElFUgkJX19SRUcoMHg0MDcwMDAwNCkgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIFNUSUlSCQlfX1JFRygweDQwNzAwMDA4KSAgLyogSW50ZXJydXB0IElEIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIFNURkNSCQlfX1JFRygweDQwNzAwMDA4KSAgLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBTVExDUgkJX19SRUcoMHg0MDcwMDAwQykgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgU1RNQ1IJCV9fUkVHKDB4NDA3MDAwMTApICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBTVExTUgkJX19SRUcoMHg0MDcwMDAxNCkgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIFNUTVNSCQlfX1JFRygweDQwNzAwMDE4KSAgLyogUmVzZXJ2ZWQgKi8KLSNkZWZpbmUgU1RTUFIJCV9fUkVHKDB4NDA3MDAwMUMpICAvKiBTY3JhdGNoIFBhZCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgU1RJU1IJCV9fUkVHKDB4NDA3MDAwMjApICAvKiBJbmZyYXJlZCBTZWxlY3Rpb24gUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIFNURExMCQlfX1JFRygweDQwNzAwMDAwKSAgLyogRGl2aXNvciBMYXRjaCBMb3cgUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgU1RETEgJCV9fUkVHKDB4NDA3MDAwMDQpICAvKiBEaXZpc29yIExhdGNoIEhpZ2ggUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KLQotLyogSGFyZHdhcmUgVUFSVCAoSFdVQVJUKSAqLwotI2RlZmluZSBIV1VBUlQJCUhXUkJSCi0jZGVmaW5lIEhXUkJSCQlfX1JFRygweDQxNjAwMDAwKSAgLyogUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgSFdUSFIJCV9fUkVHKDB4NDE2MDAwMDApICAvKiBUcmFuc21pdCBIb2xkaW5nIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBIV0lFUgkJX19SRUcoMHg0MTYwMDAwNCkgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEhXSUlSCQlfX1JFRygweDQxNjAwMDA4KSAgLyogSW50ZXJydXB0IElEIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEhXRkNSCQlfX1JFRygweDQxNjAwMDA4KSAgLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICh3cml0ZSBvbmx5KSAqLwotI2RlZmluZSBIV0xDUgkJX19SRUcoMHg0MTYwMDAwQykgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgSFdNQ1IJCV9fUkVHKDB4NDE2MDAwMTApICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBIV0xTUgkJX19SRUcoMHg0MTYwMDAxNCkgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEhXTVNSCQlfX1JFRygweDQxNjAwMDE4KSAgLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCi0jZGVmaW5lIEhXU1BSCQlfX1JFRygweDQxNjAwMDFDKSAgLyogU2NyYXRjaCBQYWQgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCi0jZGVmaW5lIEhXSVNSCQlfX1JFRygweDQxNjAwMDIwKSAgLyogSW5mcmFyZWQgU2VsZWN0aW9uIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBIV0ZPUgkJX19SRUcoMHg0MTYwMDAyNCkgIC8qIFJlY2VpdmUgRklGTyBPY2N1cGFuY3kgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgSFdBQlIJCV9fUkVHKDB4NDE2MDAwMjgpICAvKiBBdXRvLUJhdWQgQ29udHJvbCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KLSNkZWZpbmUgSFdBQ1IJCV9fUkVHKDB4NDE2MDAwMkMpICAvKiBBdXRvLUJhdWQgQ291bnQgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KLSNkZWZpbmUgSFdETEwJCV9fUkVHKDB4NDE2MDAwMDApICAvKiBEaXZpc29yIExhdGNoIExvdyBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLwotI2RlZmluZSBIV0RMSAkJX19SRUcoMHg0MTYwMDAwNCkgIC8qIERpdmlzb3IgTGF0Y2ggSGlnaCBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLwotCi0jZGVmaW5lIElFUl9ETUFFCSgxIDw8IDcpCS8qIERNQSBSZXF1ZXN0cyBFbmFibGUgKi8KLSNkZWZpbmUgSUVSX1VVRQkJKDEgPDwgNikJLyogVUFSVCBVbml0IEVuYWJsZSAqLwotI2RlZmluZSBJRVJfTlJaRQkoMSA8PCA1KQkvKiBOUlogY29kaW5nIEVuYWJsZSAqLwotI2RlZmluZSBJRVJfUlRJT0UJKDEgPDwgNCkJLyogUmVjZWl2ZXIgVGltZSBPdXQgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBJRVJfTUlFCQkoMSA8PCAzKQkvKiBNb2RlbSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIElFUl9STFNFCSgxIDw8IDIpCS8qIFJlY2VpdmVyIExpbmUgU3RhdHVzIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgSUVSX1RJRQkJKDEgPDwgMSkJLyogVHJhbnNtaXQgRGF0YSByZXF1ZXN0IEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgSUVSX1JBVklFCSgxIDw8IDApCS8qIFJlY2VpdmVyIERhdGEgQXZhaWxhYmxlIEludGVycnVwdCBFbmFibGUgKi8KLQotI2RlZmluZSBJSVJfRklGT0VTMQkoMSA8PCA3KQkvKiBGSUZPIE1vZGUgRW5hYmxlIFN0YXR1cyAqLwotI2RlZmluZSBJSVJfRklGT0VTMAkoMSA8PCA2KQkvKiBGSUZPIE1vZGUgRW5hYmxlIFN0YXR1cyAqLwotI2RlZmluZSBJSVJfVE9ECQkoMSA8PCAzKQkvKiBUaW1lIE91dCBEZXRlY3RlZCAqLwotI2RlZmluZSBJSVJfSUlEMgkoMSA8PCAyKQkvKiBJbnRlcnJ1cHQgU291cmNlIEVuY29kZWQgKi8KLSNkZWZpbmUgSUlSX0lJRDEJKDEgPDwgMSkJLyogSW50ZXJydXB0IFNvdXJjZSBFbmNvZGVkICovCi0jZGVmaW5lIElJUl9JUAkJKDEgPDwgMCkJLyogSW50ZXJydXB0IFBlbmRpbmcgKGFjdGl2ZSBsb3cpICovCi0KLSNkZWZpbmUgRkNSX0lUTDIJKDEgPDwgNykJLyogSW50ZXJydXB0IFRyaWdnZXIgTGV2ZWwgKi8KLSNkZWZpbmUgRkNSX0lUTDEJKDEgPDwgNikJLyogSW50ZXJydXB0IFRyaWdnZXIgTGV2ZWwgKi8KLSNkZWZpbmUgRkNSX1JFU0VUVEYJKDEgPDwgMikJLyogUmVzZXQgVHJhbnNtaXR0ZXIgRklGTyAqLwotI2RlZmluZSBGQ1JfUkVTRVRSRgkoMSA8PCAxKQkvKiBSZXNldCBSZWNlaXZlciBGSUZPICovCi0jZGVmaW5lIEZDUl9UUkZJRk9FCSgxIDw8IDApCS8qIFRyYW5zbWl0IGFuZCBSZWNlaXZlIEZJRk8gRW5hYmxlICovCi0jZGVmaW5lIEZDUl9JVExfMQkoMCkKLSNkZWZpbmUgRkNSX0lUTF84CShGQ1JfSVRMMSkKLSNkZWZpbmUgRkNSX0lUTF8xNgkoRkNSX0lUTDIpCi0jZGVmaW5lIEZDUl9JVExfMzIJKEZDUl9JVEwyfEZDUl9JVEwxKQotCi0jZGVmaW5lIExDUl9ETEFCCSgxIDw8IDcpCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzIEJpdCAqLwotI2RlZmluZSBMQ1JfU0IJCSgxIDw8IDYpCS8qIFNldCBCcmVhayAqLwotI2RlZmluZSBMQ1JfU1RLWVAJKDEgPDwgNSkJLyogU3RpY2t5IFBhcml0eSAqLwotI2RlZmluZSBMQ1JfRVBTCQkoMSA8PCA0KQkvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgTENSX1BFTgkJKDEgPDwgMykJLyogUGFyaXR5IEVuYWJsZSAqLwotI2RlZmluZSBMQ1JfU1RCCQkoMSA8PCAyKQkvKiBTdG9wIEJpdCAqLwotI2RlZmluZSBMQ1JfV0xTMQkoMSA8PCAxKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KLSNkZWZpbmUgTENSX1dMUzAJKDEgPDwgMCkJLyogV29yZCBMZW5ndGggU2VsZWN0ICovCi0KLSNkZWZpbmUgTFNSX0ZJRk9FCSgxIDw8IDcpCS8qIEZJRk8gRXJyb3IgU3RhdHVzICovCi0jZGVmaW5lIExTUl9URU1UCSgxIDw8IDYpCS8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCi0jZGVmaW5lIExTUl9URFJRCSgxIDw8IDUpCS8qIFRyYW5zbWl0IERhdGEgUmVxdWVzdCAqLwotI2RlZmluZSBMU1JfQkkJCSgxIDw8IDQpCS8qIEJyZWFrIEludGVycnVwdCAqLwotI2RlZmluZSBMU1JfRkUJCSgxIDw8IDMpCS8qIEZyYW1pbmcgRXJyb3IgKi8KLSNkZWZpbmUgTFNSX1BFCQkoMSA8PCAyKQkvKiBQYXJpdHkgRXJyb3IgKi8KLSNkZWZpbmUgTFNSX09FCQkoMSA8PCAxKQkvKiBPdmVycnVuIEVycm9yICovCi0jZGVmaW5lIExTUl9EUgkJKDEgPDwgMCkJLyogRGF0YSBSZWFkeSAqLwotCi0jZGVmaW5lIE1DUl9MT09QCSgxIDw8IDQpCi0jZGVmaW5lIE1DUl9PVVQyCSgxIDw8IDMpCS8qIGZvcmNlIE1TUl9EQ0QgaW4gbG9vcGJhY2sgbW9kZSAqLwotI2RlZmluZSBNQ1JfT1VUMQkoMSA8PCAyKQkvKiBmb3JjZSBNU1JfUkkgaW4gbG9vcGJhY2sgbW9kZSAqLwotI2RlZmluZSBNQ1JfUlRTCQkoMSA8PCAxKQkvKiBSZXF1ZXN0IHRvIFNlbmQgKi8KLSNkZWZpbmUgTUNSX0RUUgkJKDEgPDwgMCkJLyogRGF0YSBUZXJtaW5hbCBSZWFkeSAqLwotCi0jZGVmaW5lIE1TUl9EQ0QJCSgxIDw8IDcpCS8qIERhdGEgQ2FycmllciBEZXRlY3QgKi8KLSNkZWZpbmUgTVNSX1JJCQkoMSA8PCA2KQkvKiBSaW5nIEluZGljYXRvciAqLwotI2RlZmluZSBNU1JfRFNSCQkoMSA8PCA1KQkvKiBEYXRhIFNldCBSZWFkeSAqLwotI2RlZmluZSBNU1JfQ1RTCQkoMSA8PCA0KQkvKiBDbGVhciBUbyBTZW5kICovCi0jZGVmaW5lIE1TUl9ERENECSgxIDw8IDMpCS8qIERlbHRhIERhdGEgQ2FycmllciBEZXRlY3QgKi8KLSNkZWZpbmUgTVNSX1RFUkkJKDEgPDwgMikJLyogVHJhaWxpbmcgRWRnZSBSaW5nIEluZGljYXRvciAqLwotI2RlZmluZSBNU1JfRERTUgkoMSA8PCAxKQkvKiBEZWx0YSBEYXRhIFNldCBSZWFkeSAqLwotI2RlZmluZSBNU1JfRENUUwkoMSA8PCAwKQkvKiBEZWx0YSBDbGVhciBUbyBTZW5kICovCi0KLS8qCi0gKiBJclNSIChJbmZyYXJlZCBTZWxlY3Rpb24gUmVnaXN0ZXIpCi0gKi8KLSNkZWZpbmUgU1RJU1JfUlhQTCAgICAgICgxIDw8IDQpICAgICAgICAvKiBSZWNlaXZlIERhdGEgUG9sYXJpdHkgKi8KLSNkZWZpbmUgU1RJU1JfVFhQTCAgICAgICgxIDw8IDMpICAgICAgICAvKiBUcmFuc21pdCBEYXRhIFBvbGFyaXR5ICovCi0jZGVmaW5lIFNUSVNSX1hNT0RFICAgICAoMSA8PCAyKSAgICAgICAgLyogVHJhbnNtaXQgUHVsc2UgV2lkdGggU2VsZWN0ICovCi0jZGVmaW5lIFNUSVNSX1JDVkVJUiAgICAoMSA8PCAxKSAgICAgICAgLyogUmVjZWl2ZXIgU0lSIEVuYWJsZSAqLwotI2RlZmluZSBTVElTUl9YTUlUSVIgICAgKDEgPDwgMCkgICAgICAgIC8qIFRyYW5zbWl0dGVyIFNJUiBFbmFibGUgKi8KLQotCi0vKgotICogSTJDIHJlZ2lzdGVycyAtIG1vdmVkIGludG8gZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwotICovCi0KLS8qCi0gKiBTZXJpYWwgQXVkaW8gQ29udHJvbGxlciAtIG1vdmVkIGludG8gc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMKLSAqLwotCi0vKgotICogQUM5NyBDb250cm9sbGVyIHJlZ2lzdGVycwotICovCi0KLSNkZWZpbmUgUE9DUgkJX19SRUcoMHg0MDUwMDAwMCkgIC8qIFBDTSBPdXQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBQT0NSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIFBPQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIFBJQ1IJCV9fUkVHKDB4NDA1MDAwMDQpICAvKiBQQ00gSW4gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBQSUNSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIFBJQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIE1DQ1IJCV9fUkVHKDB4NDA1MDAwMDgpICAvKiBNaWMgSW4gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBNQ0NSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIE1DQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIEdDUgkJX19SRUcoMHg0MDUwMDAwQykgIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCi0jaWZkZWYgQ09ORklHX1BYQTN4eAotI2RlZmluZSBHQ1JfQ0xLQlBCCSgxIDw8IDMxKQkvKiBJbnRlcm5hbCBjbG9jayBlbmFibGUgKi8KLSNlbmRpZgotI2RlZmluZSBHQ1JfbkRNQUVOCSgxIDw8IDI0KQkvKiBub24gRE1BIEVuYWJsZSAqLwotI2RlZmluZSBHQ1JfQ0RPTkVfSUUJKDEgPDwgMTkpCS8qIENvbW1hbmQgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIEdDUl9TRE9ORV9JRQkoMSA8PCAxOCkJLyogU3RhdHVzIERvbmUgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBHQ1JfU0VDUkRZX0lFTgkoMSA8PCA5KQkvKiBTZWNvbmRhcnkgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBHQ1JfUFJJUkRZX0lFTgkoMSA8PCA4KQkvKiBQcmltYXJ5IFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgR0NSX1NFQ1JFU19JRU4JKDEgPDwgNSkJLyogU2Vjb25kYXJ5IFJlc3VtZSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIEdDUl9QUklSRVNfSUVOCSgxIDw8IDQpCS8qIFByaW1hcnkgUmVzdW1lIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgR0NSX0FDTElOS19PRkYJKDEgPDwgMykJLyogQUMtbGluayBTaHV0IE9mZiAqLwotI2RlZmluZSBHQ1JfV0FSTV9SU1QJKDEgPDwgMikJLyogQUM5NyBXYXJtIFJlc2V0ICovCi0jZGVmaW5lIEdDUl9DT0xEX1JTVAkoMSA8PCAxKQkvKiBBQyc5NyBDb2xkIFJlc2V0ICgwID0gYWN0aXZlKSAqLwotI2RlZmluZSBHQ1JfR0lFCQkoMSA8PCAwKQkvKiBDb2RlYyBHUEkgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIFBPU1IJCV9fUkVHKDB4NDA1MDAwMTApICAvKiBQQ00gT3V0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQT1NSX0ZJRk9FCSgxIDw8IDQpCS8qIEZJRk8gZXJyb3IgKi8KLSNkZWZpbmUgUE9TUl9GU1IJKDEgPDwgMikJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KLQotI2RlZmluZSBQSVNSCQlfX1JFRygweDQwNTAwMDE0KSAgLyogUENNIEluIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQSVNSX0ZJRk9FCSgxIDw8IDQpCS8qIEZJRk8gZXJyb3IgKi8KLSNkZWZpbmUgUElTUl9FT0MJKDEgPDwgMykJLyogRE1BIEVuZC1vZi1DaGFpbiAoZXhjbHVzaXZlIGNsZWFyKSAqLwotI2RlZmluZSBQSVNSX0ZTUgkoMSA8PCAyKQkvKiBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLwotCi0jZGVmaW5lIE1DU1IJCV9fUkVHKDB4NDA1MDAwMTgpICAvKiBNaWMgSW4gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1DU1JfRklGT0UJKDEgPDwgNCkJLyogRklGTyBlcnJvciAqLwotI2RlZmluZSBNQ1NSX0VPQwkoMSA8PCAzKQkvKiBETUEgRW5kLW9mLUNoYWluIChleGNsdXNpdmUgY2xlYXIpICovCi0jZGVmaW5lIE1DU1JfRlNSCSgxIDw8IDIpCS8qIEZJRk8gU2VydmljZSBSZXF1ZXN0ICovCi0KLSNkZWZpbmUgR1NSCQlfX1JFRygweDQwNTAwMDFDKSAgLyogR2xvYmFsIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBHU1JfQ0RPTkUJKDEgPDwgMTkpCS8qIENvbW1hbmQgRG9uZSAqLwotI2RlZmluZSBHU1JfU0RPTkUJKDEgPDwgMTgpCS8qIFN0YXR1cyBEb25lICovCi0jZGVmaW5lIEdTUl9SRENTCSgxIDw8IDE1KQkvKiBSZWFkIENvbXBsZXRpb24gU3RhdHVzICovCi0jZGVmaW5lIEdTUl9CSVQzU0xUMTIJKDEgPDwgMTQpCS8qIEJpdCAzIG9mIHNsb3QgMTIgKi8KLSNkZWZpbmUgR1NSX0JJVDJTTFQxMgkoMSA8PCAxMykJLyogQml0IDIgb2Ygc2xvdCAxMiAqLwotI2RlZmluZSBHU1JfQklUMVNMVDEyCSgxIDw8IDEyKQkvKiBCaXQgMSBvZiBzbG90IDEyICovCi0jZGVmaW5lIEdTUl9TRUNSRVMJKDEgPDwgMTEpCS8qIFNlY29uZGFyeSBSZXN1bWUgSW50ZXJydXB0ICovCi0jZGVmaW5lIEdTUl9QUklSRVMJKDEgPDwgMTApCS8qIFByaW1hcnkgUmVzdW1lIEludGVycnVwdCAqLwotI2RlZmluZSBHU1JfU0NSCQkoMSA8PCA5KQkvKiBTZWNvbmRhcnkgQ29kZWMgUmVhZHkgKi8KLSNkZWZpbmUgR1NSX1BDUgkJKDEgPDwgOCkJLyogIFByaW1hcnkgQ29kZWMgUmVhZHkgKi8KLSNkZWZpbmUgR1NSX01DSU5UCSgxIDw8IDcpCS8qIE1pYyBJbiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgR1NSX1BPSU5UCSgxIDw8IDYpCS8qIFBDTSBPdXQgSW50ZXJydXB0ICovCi0jZGVmaW5lIEdTUl9QSUlOVAkoMSA8PCA1KQkvKiBQQ00gSW4gSW50ZXJydXB0ICovCi0jZGVmaW5lIEdTUl9BQ09GRkQJKDEgPDwgMykJLyogQUMtbGluayBTaHV0IE9mZiBEb25lICovCi0jZGVmaW5lIEdTUl9NT0lOVAkoMSA8PCAyKQkvKiBNb2RlbSBPdXQgSW50ZXJydXB0ICovCi0jZGVmaW5lIEdTUl9NSUlOVAkoMSA8PCAxKQkvKiBNb2RlbSBJbiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgR1NSX0dTQ0kJKDEgPDwgMCkJLyogQ29kZWMgR1BJIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0ICovCi0KLSNkZWZpbmUgQ0FSCQlfX1JFRygweDQwNTAwMDIwKSAgLyogQ09ERUMgQWNjZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIENBUl9DQUlQCSgxIDw8IDApCS8qIENvZGVjIEFjY2VzcyBJbiBQcm9ncmVzcyAqLwotCi0jZGVmaW5lIFBDRFIJCV9fUkVHKDB4NDA1MDAwNDApICAvKiBQQ00gRklGTyBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1DRFIJCV9fUkVHKDB4NDA1MDAwNjApICAvKiBNaWMtaW4gRklGTyBEYXRhIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgTU9DUgkJX19SRUcoMHg0MDUwMDEwMCkgIC8qIE1vZGVtIE91dCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1PQ1JfRkVJRQkoMSA8PCAzKQkvKiBGSUZPIEVycm9yICovCi0jZGVmaW5lIE1PQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIE1JQ1IJCV9fUkVHKDB4NDA1MDAxMDgpICAvKiBNb2RlbSBJbiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1JQ1JfRkVJRQkoMSA8PCAzKQkvKiBGSUZPIEVycm9yICovCi0jZGVmaW5lIE1JQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLwotCi0jZGVmaW5lIE1PU1IJCV9fUkVHKDB4NDA1MDAxMTApICAvKiBNb2RlbSBPdXQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1PU1JfRklGT0UJKDEgPDwgNCkJLyogRklGTyBlcnJvciAqLwotI2RlZmluZSBNT1NSX0ZTUgkoMSA8PCAyKQkvKiBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLwotCi0jZGVmaW5lIE1JU1IJCV9fUkVHKDB4NDA1MDAxMTgpICAvKiBNb2RlbSBJbiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUlTUl9GSUZPRQkoMSA8PCA0KQkvKiBGSUZPIGVycm9yICovCi0jZGVmaW5lIE1JU1JfRU9DCSgxIDw8IDMpCS8qIERNQSBFbmQtb2YtQ2hhaW4gKGV4Y2x1c2l2ZSBjbGVhcikgKi8KLSNkZWZpbmUgTUlTUl9GU1IJKDEgPDwgMikJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KLQotI2RlZmluZSBNT0RSCQlfX1JFRygweDQwNTAwMTQwKSAgLyogTW9kZW0gRklGTyBEYXRhIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgUEFDX1JFR19CQVNFCV9fUkVHKDB4NDA1MDAyMDApICAvKiBQcmltYXJ5IEF1ZGlvIENvZGVjICovCi0jZGVmaW5lIFNBQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwMzAwKSAgLyogU2Vjb25kYXJ5IEF1ZGlvIENvZGVjICovCi0jZGVmaW5lIFBNQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwNDAwKSAgLyogUHJpbWFyeSBNb2RlbSBDb2RlYyAqLwotI2RlZmluZSBTTUNfUkVHX0JBU0UJX19SRUcoMHg0MDUwMDUwMCkgIC8qIFNlY29uZGFyeSBNb2RlbSBDb2RlYyAqLwotCi0KLS8qCi0gKiBGYXN0IEluZnJhcmVkIENvbW11bmljYXRpb24gUG9ydAotICovCi0KLSNkZWZpbmUgRklDUAkJX19SRUcoMHg0MDgwMDAwMCkgIC8qIFN0YXJ0IG9mIEZJQ1AgYXJlYSAqLwotI2RlZmluZSBJQ0NSMAkJX19SRUcoMHg0MDgwMDAwMCkgIC8qIElDUCBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUgSUNDUjEJCV9fUkVHKDB4NDA4MDAwMDQpICAvKiBJQ1AgQ29udHJvbCBSZWdpc3RlciAxICovCi0jZGVmaW5lIElDQ1IyCQlfX1JFRygweDQwODAwMDA4KSAgLyogSUNQIENvbnRyb2wgUmVnaXN0ZXIgMiAqLwotI2RlZmluZSBJQ0RSCQlfX1JFRygweDQwODAwMDBjKSAgLyogSUNQIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUNTUjAJCV9fUkVHKDB4NDA4MDAwMTQpICAvKiBJQ1AgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUgSUNTUjEJCV9fUkVHKDB4NDA4MDAwMTgpICAvKiBJQ1AgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KLQotI2RlZmluZSBJQ0NSMF9BTUUJKDEgPDwgNykJLyogQWRkcmVzcyBtYXRjaCBlbmFibGUgKi8KLSNkZWZpbmUgSUNDUjBfVElFCSgxIDw8IDYpCS8qIFRyYW5zbWl0IEZJRk8gaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBJQ0NSMF9SSUUJKDEgPDwgNSkJLyogUmVjaWV2ZSBGSUZPIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgSUNDUjBfUlhFCSgxIDw8IDQpCS8qIFJlY2VpdmUgZW5hYmxlICovCi0jZGVmaW5lIElDQ1IwX1RYRQkoMSA8PCAzKQkvKiBUcmFuc21pdCBlbmFibGUgKi8KLSNkZWZpbmUgSUNDUjBfVFVTCSgxIDw8IDIpCS8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gc2VsZWN0ICovCi0jZGVmaW5lIElDQ1IwX0xCTQkoMSA8PCAxKQkvKiBMb29wYmFjayBtb2RlICovCi0jZGVmaW5lIElDQ1IwX0lUUgkoMSA8PCAwKQkvKiBJckRBIHRyYW5zbWlzc2lvbiAqLwotCi0jZGVmaW5lIElDQ1IyX1JYUCAgICAgICAoMSA8PCAzKQkvKiBSZWNlaXZlIFBpbiBQb2xhcml0eSBzZWxlY3QgKi8KLSNkZWZpbmUgSUNDUjJfVFhQICAgICAgICgxIDw8IDIpCS8qIFRyYW5zbWl0IFBpbiBQb2xhcml0eSBzZWxlY3QgKi8KLSNkZWZpbmUgSUNDUjJfVFJJRwkoMyA8PCAwKQkvKiBSZWNlaXZlIEZJRk8gVHJpZ2dlciB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgSUNDUjJfVFJJR184ICAgICgwIDw8IDApCS8qIAk+PSA4IGJ5dGVzICovCi0jZGVmaW5lIElDQ1IyX1RSSUdfMTYgICAoMSA8PCAwKQkvKgk+PSAxNiBieXRlcyAqLwotI2RlZmluZSBJQ0NSMl9UUklHXzMyICAgKDIgPDwgMCkJLyoJPj0gMzIgYnl0ZXMgKi8KLQotI2lmZGVmIENPTkZJR19QWEEyN3gKLSNkZWZpbmUgSUNTUjBfRU9DCSgxIDw8IDYpCS8qIERNQSBFbmQgb2YgRGVzY3JpcHRvciBDaGFpbiAqLwotI2VuZGlmCi0jZGVmaW5lIElDU1IwX0ZSRQkoMSA8PCA1KQkvKiBGcmFtaW5nIGVycm9yICovCi0jZGVmaW5lIElDU1IwX1JGUwkoMSA8PCA0KQkvKiBSZWNlaXZlIEZJRk8gc2VydmljZSByZXF1ZXN0ICovCi0jZGVmaW5lIElDU1IwX1RGUwkoMSA8PCAzKQkvKiBUcmFuc25pdCBGSUZPIHNlcnZpY2UgcmVxdWVzdCAqLwotI2RlZmluZSBJQ1NSMF9SQUIJKDEgPDwgMikJLyogUmVjZWl2ZXIgYWJvcnQgKi8KLSNkZWZpbmUgSUNTUjBfVFVSCSgxIDw8IDEpCS8qIFRydW5zbWl0IEZJRk8gdW5kZXJ1biAqLwotI2RlZmluZSBJQ1NSMF9FSUYJKDEgPDwgMCkJLyogRW5kL0Vycm9yIGluIEZJRk8gKi8KLQotI2RlZmluZSBJQ1NSMV9ST1IJKDEgPDwgNikJLyogUmVjZWl2ZXIgRklGTyB1bmRlcnJ1biAgKi8KLSNkZWZpbmUgSUNTUjFfQ1JFCSgxIDw8IDUpCS8qIENSQyBlcnJvciAqLwotI2RlZmluZSBJQ1NSMV9FT0YJKDEgPDwgNCkJLyogRW5kIG9mIGZyYW1lICovCi0jZGVmaW5lIElDU1IxX1RORgkoMSA8PCAzKQkvKiBUcmFuc21pdCBGSUZPIG5vdCBmdWxsICovCi0jZGVmaW5lIElDU1IxX1JORQkoMSA8PCAyKQkvKiBSZWNlaXZlIEZJRk8gbm90IGVtcHR5ICovCi0jZGVmaW5lIElDU1IxX1RCWQkoMSA8PCAxKQkvKiBUcmFtc21pdGVyIGJ1c3kgZmxhZyAqLwotI2RlZmluZSBJQ1NSMV9SU1kJKDEgPDwgMCkJLyogUmVjZXZpZXIgc3luY2hyb25pemVkIGZsYWcgKi8KLQotCiAvKgogICogUmVhbCBUaW1lIENsb2NrCiAgKi8KQEAgLTQ2MywxOSArMTcyLDYgQEAKIAogCiAvKgotICogUHVsc2UgV2lkdGggTW9kdWxhdG9yCi0gKi8KLQotI2RlZmluZSBQV01fQ1RSTDAJX19SRUcoMHg0MEIwMDAwMCkgIC8qIFBXTSAwIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFdNX1BXRFVUWTAJX19SRUcoMHg0MEIwMDAwNCkgIC8qIFBXTSAwIER1dHkgQ3ljbGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFdNX1BFUlZBTDAJX19SRUcoMHg0MEIwMDAwOCkgIC8qIFBXTSAwIFBlcmlvZCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgUFdNX0NUUkwxCV9fUkVHKDB4NDBDMDAwMDApICAvKiBQV00gMUNvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFdNX1BXRFVUWTEJX19SRUcoMHg0MEMwMDAwNCkgIC8qIFBXTSAxIER1dHkgQ3ljbGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUFdNX1BFUlZBTDEJX19SRUcoMHg0MEMwMDAwOCkgIC8qIFBXTSAxIFBlcmlvZCBDb250cm9sIFJlZ2lzdGVyICovCi0KLQotLyoKICAqIEludGVycnVwdCBDb250cm9sbGVyCiAgKi8KIApAQCAtNDk2LDE5ICsxOTIsNiBAQAogICogR2VuZXJhbCBQdXJwb3NlIEkvTwogICovCiAKLSNkZWZpbmUgR1BJTzBfQkFTRQkoKHZvaWQgX19pb21lbSAqKWlvX3AydigweDQwRTAwMDAwKSkKLSNkZWZpbmUgR1BJTzFfQkFTRQkoKHZvaWQgX19pb21lbSAqKWlvX3AydigweDQwRTAwMDA0KSkKLSNkZWZpbmUgR1BJTzJfQkFTRQkoKHZvaWQgX19pb21lbSAqKWlvX3AydigweDQwRTAwMDA4KSkKLSNkZWZpbmUgR1BJTzNfQkFTRQkoKHZvaWQgX19pb21lbSAqKWlvX3AydigweDQwRTAwMTAwKSkKLQotI2RlZmluZSBHUExSX09GRlNFVAkweDAwCi0jZGVmaW5lIEdQRFJfT0ZGU0VUCTB4MEMKLSNkZWZpbmUgR1BTUl9PRkZTRVQJMHgxOAotI2RlZmluZSBHUENSX09GRlNFVAkweDI0Ci0jZGVmaW5lIEdSRVJfT0ZGU0VUCTB4MzAKLSNkZWZpbmUgR0ZFUl9PRkZTRVQJMHgzQwotI2RlZmluZSBHRURSX09GRlNFVAkweDQ4Ci0KICNkZWZpbmUgR1BMUjAJCV9fUkVHKDB4NDBFMDAwMDApICAvKiBHUElPIFBpbi1MZXZlbCBSZWdpc3RlciBHUElPPDMxOjA+ICovCiAjZGVmaW5lIEdQTFIxCQlfX1JFRygweDQwRTAwMDA0KSAgLyogR1BJTyBQaW4tTGV2ZWwgUmVnaXN0ZXIgR1BJTzw2MzozMj4gKi8KICNkZWZpbmUgR1BMUjIJCV9fUkVHKDB4NDBFMDAwMDgpICAvKiBHUElPIFBpbi1MZXZlbCBSZWdpc3RlciBHUElPPDgwOjY0PiAqLwpAQCAtNTU4LDEwICsyNDEsNiBAQAogCiAjZGVmaW5lIEdQSU9fYml0KHgpCSgxIDw8ICgoeCkgJiAweDFmKSkKIAotI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3eCkgfHwgZGVmaW5lZChDT05GSUdfUFhBM3h4KQotCi0vKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLwotCiAjZGVmaW5lIF9HUExSKHgpCV9fUkVHMigweDQwRTAwMDAwLCAoKHgpICYgMHg2MCkgPj4gMykKICNkZWZpbmUgX0dQRFIoeCkJX19SRUcyKDB4NDBFMDAwMEMsICgoeCkgJiAweDYwKSA+PiAzKQogI2RlZmluZSBfR1BTUih4KQlfX1JFRzIoMHg0MEUwMDAxOCwgKCh4KSAmIDB4NjApID4+IDMpCkBAIC01ODAsMTg5ICsyNTksNSBAQAogI2RlZmluZSBHRURSKHgpCQkoKigoKCh4KSAmIDB4N2YpIDwgOTYpID8gJl9HRURSKHgpIDogJkdFRFIzKSkKICNkZWZpbmUgR0FGUih4KQkJKCooKCgoeCkgJiAweDdmKSA8IDk2KSA/ICZfR0FGUih4KSA6IFwKIAkJCSAoKCgoeCkgJiAweDdmKSA8IDExMikgPyAmR0FGUjNfTCA6ICZHQUZSM19VKSkpCi0jZWxzZQotCi0jZGVmaW5lIEdQTFIoeCkJCV9fUkVHMigweDQwRTAwMDAwLCAoKHgpICYgMHg2MCkgPj4gMykKLSNkZWZpbmUgR1BEUih4KQkJX19SRUcyKDB4NDBFMDAwMEMsICgoeCkgJiAweDYwKSA+PiAzKQotI2RlZmluZSBHUFNSKHgpCQlfX1JFRzIoMHg0MEUwMDAxOCwgKCh4KSAmIDB4NjApID4+IDMpCi0jZGVmaW5lIEdQQ1IoeCkJCV9fUkVHMigweDQwRTAwMDI0LCAoKHgpICYgMHg2MCkgPj4gMykKLSNkZWZpbmUgR1JFUih4KQkJX19SRUcyKDB4NDBFMDAwMzAsICgoeCkgJiAweDYwKSA+PiAzKQotI2RlZmluZSBHRkVSKHgpCQlfX1JFRzIoMHg0MEUwMDAzQywgKCh4KSAmIDB4NjApID4+IDMpCi0jZGVmaW5lIEdFRFIoeCkJCV9fUkVHMigweDQwRTAwMDQ4LCAoKHgpICYgMHg2MCkgPj4gMykKLSNkZWZpbmUgR0FGUih4KQkJX19SRUcyKDB4NDBFMDAwNTQsICgoeCkgJiAweDcwKSA+PiAyKQotCi0jZW5kaWYKLQotLyoKLSAqIFBvd2VyIE1hbmFnZXIgLSBzZWUgcHhhMnh4LXJlZ3MuaAotICovCi0KLS8qCi0gKiBTU1AgU2VyaWFsIFBvcnQgUmVnaXN0ZXJzIC0gc2VlIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9yZWdzLXNzcC5oCi0gKi8KLQotLyoKLSAqIE11bHRpTWVkaWFDYXJkIChNTUMpIGNvbnRyb2xsZXIgLSBzZWUgZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuaAotICovCi0KLS8qCi0gKiBDb3JlIENsb2NrIC0gc2VlIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtcmVncy5oCi0gKi8KLQotI2lmZGVmIENPTkZJR19QWEEyN3gKLQotLyogQ2FtZXJhIEludGVyZmFjZSAqLwotI2RlZmluZSBDSUNSMAkJX19SRUcoMHg1MDAwMDAwMCkKLSNkZWZpbmUgQ0lDUjEJCV9fUkVHKDB4NTAwMDAwMDQpCi0jZGVmaW5lIENJQ1IyCQlfX1JFRygweDUwMDAwMDA4KQotI2RlZmluZSBDSUNSMwkJX19SRUcoMHg1MDAwMDAwQykKLSNkZWZpbmUgQ0lDUjQJCV9fUkVHKDB4NTAwMDAwMTApCi0jZGVmaW5lIENJU1IJCV9fUkVHKDB4NTAwMDAwMTQpCi0jZGVmaW5lIENJRlIJCV9fUkVHKDB4NTAwMDAwMTgpCi0jZGVmaW5lIENJVE9SCQlfX1JFRygweDUwMDAwMDFDKQotI2RlZmluZSBDSUJSMAkJX19SRUcoMHg1MDAwMDAyOCkKLSNkZWZpbmUgQ0lCUjEJCV9fUkVHKDB4NTAwMDAwMzApCi0jZGVmaW5lIENJQlIyCQlfX1JFRygweDUwMDAwMDM4KQotCi0jZGVmaW5lIENJQ1IwX0RNQUVOCSgxIDw8IDMxKQkvKiBETUEgcmVxdWVzdCBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjBfUEFSX0VOCSgxIDw8IDMwKQkvKiBQYXJpdHkgZW5hYmxlICovCi0jZGVmaW5lIENJQ1IwX1NMX0NBUF9FTgkoMSA8PCAyOSkJLyogQ2FwdHVyZSBlbmFibGUgZm9yIHNsYXZlIG1vZGUgKi8KLSNkZWZpbmUgQ0lDUjBfRU5CCSgxIDw8IDI4KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSMF9ESVMJKDEgPDwgMjcpCS8qIENhbWVyYSBpbnRlcmZhY2UgZGlzYWJsZSAqLwotI2RlZmluZSBDSUNSMF9TSU0JKDB4NyA8PCAyNCkJLyogU2Vuc29yIGludGVyZmFjZSBtb2RlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfVE9NCSgxIDw8IDkpCS8qIFRpbWUtb3V0IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfUkRBVk0JKDEgPDwgOCkJLyogUmVjZWl2ZS1kYXRhLWF2YWlsYWJsZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0ZFTQkoMSA8PCA3KQkvKiBGSUZPLWVtcHR5IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfRU9MTQkoMSA8PCA2KQkvKiBFbmQtb2YtbGluZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1BFUlJNCSgxIDw8IDUpCS8qIFBhcml0eS1lcnJvciBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1FETQkoMSA8PCA0KQkvKiBRdWljay1kaXNhYmxlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfQ0RNCSgxIDw8IDMpCS8qIERpc2FibGUtZG9uZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1NPRk0JKDEgPDwgMikJLyogU3RhcnQtb2YtZnJhbWUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9FT0ZNCSgxIDw8IDEpCS8qIEVuZC1vZi1mcmFtZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0ZPTQkoMSA8PCAwKQkvKiBGSUZPLW92ZXJydW4gbWFzayAqLwotCi0jZGVmaW5lIENJQ1IxX1RCSVQJKDEgPDwgMzEpCS8qIFRyYW5zcGFyZW5jeSBiaXQgKi8KLSNkZWZpbmUgQ0lDUjFfUkdCVF9DT05WCSgweDMgPDwgMjkpCS8qIFJHQlQgY29udmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1BQTAkoMHg3ZmYgPDwgMTUpCS8qIFBpeGVscyBwZXIgbGluZSBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JHQl9DT05WCSgweDcgPDwgMTIpCS8qIFJHQiBjb252ZXJzaW9uIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjFfUkdCX0YJKDEgPDwgMTEpCS8qIFJHQiBmb3JtYXQgKi8KLSNkZWZpbmUgQ0lDUjFfWUNCQ1JfRgkoMSA8PCAxMCkJLyogWUNiQ3IgZm9ybWF0ICovCi0jZGVmaW5lIENJQ1IxX1JHQl9CUFAJKDB4NyA8PCA3KQkvKiBSR0IgYmlzIHBlciBwaXhlbCBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JBV19CUFAJKDB4MyA8PCA1KQkvKiBSYXcgYmlzIHBlciBwaXhlbCBtYXNrICovCi0jZGVmaW5lIENJQ1IxX0NPTE9SX1NQCSgweDMgPDwgMykJLyogQ29sb3Igc3BhY2UgbWFzayAqLwotI2RlZmluZSBDSUNSMV9EVwkoMHg3IDw8IDApCS8qIERhdGEgd2lkdGggbWFzayAqLwotCi0jZGVmaW5lIENJQ1IyX0JMVwkoMHhmZiA8PCAyNCkJLyogQmVnaW5uaW5nLW9mLWxpbmUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0VMVwkoMHhmZiA8PCAxNikJLyogRW5kLW9mLWxpbmUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0hTVwkoMHgzZiA8PCAxMCkJLyogSG9yaXpvbnRhbCBzeW5jIHB1bHNlIHdpZHRoIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjJfQkZQVwkoMHgzZiA8PCAzKQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0ZTVwkoMHg3IDw8IDApCS8qIEZyYW1lIHN0YWJpbGl6YXRpb24KLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0KLSNkZWZpbmUgQ0lDUjNfQkZXCSgweGZmIDw8IDI0KQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgbGluZSBjbG9jawotCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfRUZXCSgweGZmIDw8IDE2KQkvKiBFbmQtb2YtZnJhbWUgbGluZSBjbG9jawotCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfVlNXCSgweDNmIDw8IDEwKQkvKiBWZXJ0aWNhbCBzeW5jIHB1bHNlIHdpZHRoIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjNfQkZQVwkoMHgzZiA8PCAzKQkvKiBCZWdpbm5pbmctb2YtZnJhbWUgcGl4ZWwgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0xQRgkoMHg3ZmYgPDwgMCkJLyogTGluZXMgcGVyIGZyYW1lIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSNF9NQ0xLX0RMWQkoMHgzIDw8IDI0KQkvKiBNQ0xLIERhdGEgQ2FwdHVyZSBEZWxheSBtYXNrICovCi0jZGVmaW5lIENJQ1I0X1BDTEtfRU4JKDEgPDwgMjMpCS8qIFBpeGVsIGNsb2NrIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSNF9QQ1AJKDEgPDwgMjIpCS8qIFBpeGVsIGNsb2NrIHBvbGFyaXR5ICovCi0jZGVmaW5lIENJQ1I0X0hTUAkoMSA8PCAyMSkJLyogSG9yaXpvbnRhbCBzeW5jIHBvbGFyaXR5ICovCi0jZGVmaW5lIENJQ1I0X1ZTUAkoMSA8PCAyMCkJLyogVmVydGljYWwgc3luYyBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9NQ0xLX0VOCSgxIDw8IDE5KQkvKiBNQ0xLIGVuYWJsZSAqLwotI2RlZmluZSBDSUNSNF9GUl9SQVRFCSgweDcgPDwgOCkJLyogRnJhbWUgcmF0ZSBtYXNrICovCi0jZGVmaW5lIENJQ1I0X0RJVgkoMHhmZiA8PCAwKQkvKiBDbG9jayBkaXZpc29yIG1hc2sgKi8KLQotI2RlZmluZSBDSVNSX0ZUTwkoMSA8PCAxNSkJLyogRklGTyB0aW1lLW91dCAqLwotI2RlZmluZSBDSVNSX1JEQVZfMgkoMSA8PCAxNCkJLyogQ2hhbm5lbCAyIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQ0lTUl9SREFWXzEJKDEgPDwgMTMpCS8qIENoYW5uZWwgMSByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCi0jZGVmaW5lIENJU1JfUkRBVl8wCSgxIDw8IDEyKQkvKiBDaGFubmVsIDAgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8yCSgxIDw8IDExKQkvKiBDaGFubmVsIDIgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8xCSgxIDw8IDEwKQkvKiBDaGFubmVsIDEgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0ZFTVBUWV8wCSgxIDw8IDkpCS8qIENoYW5uZWwgMCBGSUZPIGVtcHR5ICovCi0jZGVmaW5lIENJU1JfRU9MCSgxIDw8IDgpCS8qIEVuZCBvZiBsaW5lICovCi0jZGVmaW5lIENJU1JfUEFSX0VSUgkoMSA8PCA3KQkvKiBQYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgQ0lTUl9DUUQJKDEgPDwgNikJLyogQ2FtZXJhIGludGVyZmFjZSBxdWljayBkaXNhYmxlICovCi0jZGVmaW5lIENJU1JfQ0RECSgxIDw8IDUpCS8qIENhbWVyYSBpbnRlcmZhY2UgZGlzYWJsZSBkb25lICovCi0jZGVmaW5lIENJU1JfU09GCSgxIDw8IDQpCS8qIFN0YXJ0IG9mIGZyYW1lICovCi0jZGVmaW5lIENJU1JfRU9GCSgxIDw8IDMpCS8qIEVuZCBvZiBmcmFtZSAqLwotI2RlZmluZSBDSVNSX0lGT18yCSgxIDw8IDIpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAyICovCi0jZGVmaW5lIENJU1JfSUZPXzEJKDEgPDwgMSkJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDEgKi8KLSNkZWZpbmUgQ0lTUl9JRk9fMAkoMSA8PCAwKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMCAqLwotCi0jZGVmaW5lIENJRlJfRkxWTDIJKDB4N2YgPDwgMjMpCS8qIEZJRk8gMiBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfRkxWTDEJKDB4N2YgPDwgMTYpCS8qIEZJRk8gMSBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfRkxWTDAJKDB4ZmYgPDwgOCkJLyogRklGTyAwIGxldmVsIG1hc2sgKi8KLSNkZWZpbmUgQ0lGUl9USExfMAkoMHgzIDw8IDQpCS8qIFRocmVzaG9sZCBMZXZlbCBmb3IgQ2hhbm5lbCAwIEZJRk8gKi8KLSNkZWZpbmUgQ0lGUl9SRVNFVF9GCSgxIDw8IDMpCS8qIFJlc2V0IGlucHV0IEZJRk9zICovCi0jZGVmaW5lIENJRlJfRkVOMgkoMSA8PCAyKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAyICovCi0jZGVmaW5lIENJRlJfRkVOMQkoMSA8PCAxKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAxICovCi0jZGVmaW5lIENJRlJfRkVOMAkoMSA8PCAwKQkvKiBGSUZPIGVuYWJsZSBmb3IgY2hhbm5lbCAwICovCi0KLSNkZWZpbmUgU1JBTV9TSVpFCQkweDQwMDAwIC8qIDR4NjRLICAqLwotCi0jZGVmaW5lIFNSQU1fTUVNX1BIWVMJCTB4NUMwMDAwMDAKLQotI2RlZmluZSBJTVBNQ1IJCV9fUkVHKDB4NTgwMDAwMDApIC8qIElNIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCBSZWcgKi8KLSNkZWZpbmUgSU1QTVNSCQlfX1JFRygweDU4MDAwMDA4KSAvKiBJTSBQb3dlciBNYW5hZ2VtZW50IFN0YXR1cyBSZWcgKi8KLQotI2RlZmluZSBJTVBNQ1JfUEMzCQkoMHgzIDw8IDIyKSAvKiBCYW5rIDMgUG93ZXIgQ29udHJvbCAqLwotI2RlZmluZSBJTVBNQ1JfUEMzX1JVTl9NT0RFCSgweDAgPDwgMjIpIC8qICAgUnVuIG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDM19TVEFOREJZX01PREUJKDB4MSA8PCAyMikgLyogICBTdGFuZGJ5IG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDM19BVVRPX01PREUJKDB4MyA8PCAyMikgLyogICBBdXRvbWF0aWNhbGx5IGNvbnRyb2xsZWQgKi8KLQotI2RlZmluZSBJTVBNQ1JfUEMyCQkoMHgzIDw8IDIwKSAvKiBCYW5rIDIgUG93ZXIgQ29udHJvbCAqLwotI2RlZmluZSBJTVBNQ1JfUEMyX1JVTl9NT0RFCSgweDAgPDwgMjApIC8qICAgUnVuIG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMl9TVEFOREJZX01PREUJKDB4MSA8PCAyMCkgLyogICBTdGFuZGJ5IG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMl9BVVRPX01PREUJKDB4MyA8PCAyMCkgLyogICBBdXRvbWF0aWNhbGx5IGNvbnRyb2xsZWQgKi8KLQotI2RlZmluZSBJTVBNQ1JfUEMxCQkoMHgzIDw8IDE4KSAvKiBCYW5rIDEgUG93ZXIgQ29udHJvbCAqLwotI2RlZmluZSBJTVBNQ1JfUEMxX1JVTl9NT0RFCSgweDAgPDwgMTgpIC8qICAgUnVuIG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMV9TVEFOREJZX01PREUJKDB4MSA8PCAxOCkgLyogICBTdGFuZGJ5IG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMV9BVVRPX01PREUJKDB4MyA8PCAxOCkgLyogICBBdXRvbWF0aWNhbGx5IGNvbnRyb2xsZWQgKi8KLQotI2RlZmluZSBJTVBNQ1JfUEMwCQkoMHgzIDw8IDE2KSAvKiBCYW5rIDAgUG93ZXIgQ29udHJvbCAqLwotI2RlZmluZSBJTVBNQ1JfUEMwX1JVTl9NT0RFCSgweDAgPDwgMTYpIC8qICAgUnVuIG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMF9TVEFOREJZX01PREUJKDB4MSA8PCAxNikgLyogICBTdGFuZGJ5IG1vZGUgKi8KLSNkZWZpbmUgSU1QTUNSX1BDMF9BVVRPX01PREUJKDB4MyA8PCAxNikgLyogICBBdXRvbWF0aWNhbGx5IGNvbnRyb2xsZWQgKi8KLQotI2RlZmluZSBJTVBNQ1JfQVczCQkoMSA8PCAxMSkgLyogQmFuayAzIEF1dG9tYXRpYyBXYWtlLXVwIGVuYWJsZSAqLwotI2RlZmluZSBJTVBNQ1JfQVcyCQkoMSA8PCAxMCkgLyogQmFuayAyIEF1dG9tYXRpYyBXYWtlLXVwIGVuYWJsZSAqLwotI2RlZmluZSBJTVBNQ1JfQVcxCQkoMSA8PCA5KSAgLyogQmFuayAxIEF1dG9tYXRpYyBXYWtlLXVwIGVuYWJsZSAqLwotI2RlZmluZSBJTVBNQ1JfQVcwCQkoMSA8PCA4KSAgLyogQmFuayAwIEF1dG9tYXRpYyBXYWtlLXVwIGVuYWJsZSAqLwotCi0jZGVmaW5lIElNUE1DUl9EU1QJCSgweEZGIDw8IDApIC8qIERlbGF5IFN0YW5kYnkgVGltZSwgbXMgKi8KLQotI2RlZmluZSBJTVBNU1JfUFMzCQkoMHgzIDw8IDYpIC8qIEJhbmsgMyBQb3dlciBTdGF0dXM6ICovCi0jZGVmaW5lIElNUE1TUl9QUzNfUlVOX01PREUJKDB4MCA8PCA2KSAvKiAgICBSdW4gbW9kZSAqLwotI2RlZmluZSBJTVBNU1JfUFMzX1NUQU5EQllfTU9ERQkoMHgxIDw8IDYpIC8qICAgIFN0YW5kYnkgbW9kZSAqLwotCi0jZGVmaW5lIElNUE1TUl9QUzIJCSgweDMgPDwgNCkgLyogQmFuayAyIFBvd2VyIFN0YXR1czogKi8KLSNkZWZpbmUgSU1QTVNSX1BTMl9SVU5fTU9ERQkoMHgwIDw8IDQpIC8qICAgIFJ1biBtb2RlICovCi0jZGVmaW5lIElNUE1TUl9QUzJfU1RBTkRCWV9NT0RFCSgweDEgPDwgNCkgLyogICAgU3RhbmRieSBtb2RlICovCi0KLSNkZWZpbmUgSU1QTVNSX1BTMQkJKDB4MyA8PCAyKSAvKiBCYW5rIDEgUG93ZXIgU3RhdHVzOiAqLwotI2RlZmluZSBJTVBNU1JfUFMxX1JVTl9NT0RFCSgweDAgPDwgMikgLyogICAgUnVuIG1vZGUgKi8KLSNkZWZpbmUgSU1QTVNSX1BTMV9TVEFOREJZX01PREUJKDB4MSA8PCAyKSAvKiAgICBTdGFuZGJ5IG1vZGUgKi8KLQotI2RlZmluZSBJTVBNU1JfUFMwCQkoMHgzIDw8IDApIC8qIEJhbmsgMCBQb3dlciBTdGF0dXM6ICovCi0jZGVmaW5lIElNUE1TUl9QUzBfUlVOX01PREUJKDB4MCA8PCAwKSAvKiAgICBSdW4gbW9kZSAqLwotI2RlZmluZSBJTVBNU1JfUFMwX1NUQU5EQllfTU9ERQkoMHgxIDw8IDApIC8qICAgIFN0YW5kYnkgbW9kZSAqLwotCi0jZW5kaWYKLQotLyogUFdSTU9ERSByZWdpc3RlciBNIGZpZWxkIHZhbHVlcyAqLwotCi0jZGVmaW5lIFBXUk1PREVfSURMRQkJMHgxCi0jZGVmaW5lIFBXUk1PREVfU1RBTkRCWQkJMHgyCi0jZGVmaW5lIFBXUk1PREVfU0xFRVAJCTB4MwotI2RlZmluZSBQV1JNT0RFX0RFRVBTTEVFUAkweDcKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhMnh4LWdwaW8uaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtZ3Bpby5oCmluZGV4IDZlZjFkZDAuLmQ4MzM5M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtZ3Bpby5oCkBAIC0zNjUsNCArMzY1LDkgQEAKICNkZWZpbmUgR1BJTzExN19JMkNTQ0xfTUQJKDExNyB8IEdQSU9fQUxUX0ZOXzFfSU4pCiAjZGVmaW5lIEdQSU8xMThfSTJDU0RBX01ECSgxMTggfCBHUElPX0FMVF9GTl8xX0lOKQogCisvKgorICogSGFuZHkgcm91dGluZSB0byBzZXQgR1BJTyBhbHRlcm5hdGUgZnVuY3Rpb25zCisgKi8KK2V4dGVybiBpbnQgcHhhX2dwaW9fbW9kZSggaW50IGdwaW9fbW9kZSApOworCiAjZW5kaWYgLyogX19BU01fQVJDSF9QWEEyWFhfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhMnh4LXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtcmVncy5oCmluZGV4IDgwNmVjZmUuLjc3MTAyZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHgtcmVncy5oCkBAIC00OSw2ICs0OSwxMSBAQAogI2RlZmluZSBNRUNSX05PUwkoMSA8PCAwKQkvKiBOdW1iZXIgT2YgU29ja2V0czogMCAtPiAxIHNvY2ssIDEgLT4gMiBzb2NrICovCiAjZGVmaW5lIE1FQ1JfQ0lUCSgxIDw8IDEpCS8qIENhcmQgSXMgVGhlcmU6IDAgLT4gbm8gY2FyZCwgMSAtPiBjYXJkIGluc2VydGVkICovCiAKKyNkZWZpbmUgTURDTkZHX0RFMAkoMSA8PCAwKQkvKiBTRFJBTSBCYW5rIDAgRW5hYmxlICovCisjZGVmaW5lIE1EQ05GR19ERTEJKDEgPDwgMSkJLyogU0RSQU0gQmFuayAxIEVuYWJsZSAqLworI2RlZmluZSBNRENORkdfREUyCSgxIDw8IDE2KQkvKiBTRFJBTSBCYW5rIDIgRW5hYmxlICovCisjZGVmaW5lIE1EQ05GR19ERTMJKDEgPDwgMTcpCS8qIFNEUkFNIEJhbmsgMyBFbmFibGUgKi8KKwogI2RlZmluZSBNRFJFRlJfSzBEQjQJKDEgPDwgMjkpCS8qIFNEQ0xLMCBEaXZpZGUgYnkgNCBDb250cm9sL1N0YXR1cyAqLwogI2RlZmluZSBNRFJFRlJfSzJGUkVFCSgxIDw8IDI1KQkvKiBTRFJBTSBGcmVlLVJ1bm5pbmcgQ29udHJvbCAqLwogI2RlZmluZSBNRFJFRlJfSzFGUkVFCSgxIDw8IDI0KQkvKiBTRFJBTSBGcmVlLVJ1bm5pbmcgQ29udHJvbCAqLwpAQCAtMjQzLDQgKzI0OCwxMSBAQAogI2RlZmluZSBPU0NDX09PTgkoMSA8PCAxKQkvKiAzMi43NjhrSHogT09OICh3cml0ZS1vbmNlIG9ubHkgYml0KSAqLwogI2RlZmluZSBPU0NDX09PSwkoMSA8PCAwKQkvKiAzMi43NjhrSHogT09LIChyZWFkLW9ubHkgYml0KSAqLwogCisvKiBQV1JNT0RFIHJlZ2lzdGVyIE0gZmllbGQgdmFsdWVzICovCisKKyNkZWZpbmUgUFdSTU9ERV9JRExFCQkweDEKKyNkZWZpbmUgUFdSTU9ERV9TVEFOREJZCQkweDIKKyNkZWZpbmUgUFdSTU9ERV9TTEVFUAkJMHgzCisjZGVmaW5lIFBXUk1PREVfREVFUFNMRUVQCTB4NworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YWZiLmgKaW5kZXggY2JkYTRkMy4uNjkzMjcyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YWZiLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YWZiLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgTENEX01PTk9fRFNUTl84QlBQCSgoOCAgPDwgNCkgfCBMQ0RfVFlQRV9NT05PX0RTVE4pCiAjZGVmaW5lIExDRF9DT0xPUl9TVE5fOEJQUAkoKDggIDw8IDQpIHwgTENEX1RZUEVfQ09MT1JfU1ROKQogI2RlZmluZSBMQ0RfQ09MT1JfRFNUTl8xNkJQUAkoKDE2IDw8IDQpIHwgTENEX1RZUEVfQ09MT1JfRFNUTikKKyNkZWZpbmUgTENEX0NPTE9SX1RGVF84QlBQCSgoOCAgPDwgNCkgfCBMQ0RfVFlQRV9DT0xPUl9URlQpCiAjZGVmaW5lIExDRF9DT0xPUl9URlRfMTZCUFAJKCgxNiA8PCA0KSB8IExDRF9UWVBFX0NPTE9SX1RGVCkKICNkZWZpbmUgTENEX0NPTE9SX1RGVF8xOEJQUAkoKDE4IDw8IDQpIHwgTENEX1RZUEVfQ09MT1JfVEZUKQogI2RlZmluZSBMQ0RfU01BUlRfUEFORUxfOEJQUAkoKDggIDw8IDQpIHwgTENEX1RZUEVfU01BUlRfUEFORUwpCkBAIC05NCw2ICs5NSwxMCBAQAogCSAqICAgIGluIHB4YTI3eCBhbmQgcHhhM3h4LCBpbml0aWFsaXplIHRoZW0gdG8gdGhlIHNhbWUgdmFsdWUgb3IKIAkgKiAgICB0aGUgbGFyZ2VyIG9uZSB3aWxsIGJlIHVzZWQKIAkgKiAzLiBzYW1lIHRvIHtyZCx3cn1fcHVsc2Vfd2lkdGgKKwkgKgorCSAqIDQuIExDRF9QQ0xLX0VER0Vfe1JJU0UsRkFMTH0gY29udHJvbHMgdGhlIExfUENMS19XUiBwb2xhcml0eQorCSAqIDUuIHN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCBjb250cm9scyB0aGUgTF9MQ0xLX0EwCisJICogNi4gc3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCBjb250cm9scyB0aGUgTF9MQ0xLX1JECiAJICovCiAJdW5zaWduZWQJYTBjc3JkX3NldF9obGQ7CS8qIEEwIGFuZCBDUyBTZXR1cC9Ib2xkIFRpbWUgYmVmb3JlL2FmdGVyIExfRkNMS19SRCAqLwogCXVuc2lnbmVkCWEwY3N3cl9zZXRfaGxkOwkvKiBBMCBhbmQgQ1MgU2V0dXAvSG9sZCBUaW1lIGJlZm9yZS9hZnRlciBMX1BDTEtfV1IgKi8KQEAgLTEwOCw2ICsxMTMsNyBAQAogCXVuc2lnbmVkIGludCBudW1fbW9kZXM7CiAKIAl1bnNpZ25lZCBpbnQJbGNkX2Nvbm47CisJdW5zaWduZWQgbG9uZwl2aWRlb19tZW1fc2l6ZTsKIAogCXVfaW50CQlmaXhlZF9tb2RlczoxLAogCQkJY21hcF9pbnZlcnNlOjEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1hYzk3LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1hYzk3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxYjlkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9yZWdzLWFjOTcuaApAQCAtMCwwICsxLDk5IEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19BQzk3X0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX0FDOTdfSAorCisvKgorICogQUM5NyBDb250cm9sbGVyIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgUE9DUgkJX19SRUcoMHg0MDUwMDAwMCkgIC8qIFBDTSBPdXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQT0NSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFBPQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIFBJQ1IJCV9fUkVHKDB4NDA1MDAwMDQpICAvKiBQQ00gSW4gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSUNSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFBJQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIE1DQ1IJCV9fUkVHKDB4NDA1MDAwMDgpICAvKiBNaWMgSW4gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNQ0NSX0ZFSUUJKDEgPDwgMykJLyogRklGTyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIE1DQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIEdDUgkJX19SRUcoMHg0MDUwMDAwQykgIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisjaWZkZWYgQ09ORklHX1BYQTN4eAorI2RlZmluZSBHQ1JfQ0xLQlBCCSgxIDw8IDMxKQkvKiBJbnRlcm5hbCBjbG9jayBlbmFibGUgKi8KKyNlbmRpZgorI2RlZmluZSBHQ1JfbkRNQUVOCSgxIDw8IDI0KQkvKiBub24gRE1BIEVuYWJsZSAqLworI2RlZmluZSBHQ1JfQ0RPTkVfSUUJKDEgPDwgMTkpCS8qIENvbW1hbmQgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEdDUl9TRE9ORV9JRQkoMSA8PCAxOCkJLyogU3RhdHVzIERvbmUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBHQ1JfU0VDUkRZX0lFTgkoMSA8PCA5KQkvKiBTZWNvbmRhcnkgUmVhZHkgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBHQ1JfUFJJUkRZX0lFTgkoMSA8PCA4KQkvKiBQcmltYXJ5IFJlYWR5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgR0NSX1NFQ1JFU19JRU4JKDEgPDwgNSkJLyogU2Vjb25kYXJ5IFJlc3VtZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEdDUl9QUklSRVNfSUVOCSgxIDw8IDQpCS8qIFByaW1hcnkgUmVzdW1lIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgR0NSX0FDTElOS19PRkYJKDEgPDwgMykJLyogQUMtbGluayBTaHV0IE9mZiAqLworI2RlZmluZSBHQ1JfV0FSTV9SU1QJKDEgPDwgMikJLyogQUM5NyBXYXJtIFJlc2V0ICovCisjZGVmaW5lIEdDUl9DT0xEX1JTVAkoMSA8PCAxKQkvKiBBQyc5NyBDb2xkIFJlc2V0ICgwID0gYWN0aXZlKSAqLworI2RlZmluZSBHQ1JfR0lFCQkoMSA8PCAwKQkvKiBDb2RlYyBHUEkgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIFBPU1IJCV9fUkVHKDB4NDA1MDAwMTApICAvKiBQQ00gT3V0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQT1NSX0ZJRk9FCSgxIDw8IDQpCS8qIEZJRk8gZXJyb3IgKi8KKyNkZWZpbmUgUE9TUl9GU1IJKDEgPDwgMikJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KKworI2RlZmluZSBQSVNSCQlfX1JFRygweDQwNTAwMDE0KSAgLyogUENNIEluIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSVNSX0ZJRk9FCSgxIDw8IDQpCS8qIEZJRk8gZXJyb3IgKi8KKyNkZWZpbmUgUElTUl9FT0MJKDEgPDwgMykJLyogRE1BIEVuZC1vZi1DaGFpbiAoZXhjbHVzaXZlIGNsZWFyKSAqLworI2RlZmluZSBQSVNSX0ZTUgkoMSA8PCAyKQkvKiBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLworCisjZGVmaW5lIE1DU1IJCV9fUkVHKDB4NDA1MDAwMTgpICAvKiBNaWMgSW4gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1DU1JfRklGT0UJKDEgPDwgNCkJLyogRklGTyBlcnJvciAqLworI2RlZmluZSBNQ1NSX0VPQwkoMSA8PCAzKQkvKiBETUEgRW5kLW9mLUNoYWluIChleGNsdXNpdmUgY2xlYXIpICovCisjZGVmaW5lIE1DU1JfRlNSCSgxIDw8IDIpCS8qIEZJRk8gU2VydmljZSBSZXF1ZXN0ICovCisKKyNkZWZpbmUgR1NSCQlfX1JFRygweDQwNTAwMDFDKSAgLyogR2xvYmFsIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBHU1JfQ0RPTkUJKDEgPDwgMTkpCS8qIENvbW1hbmQgRG9uZSAqLworI2RlZmluZSBHU1JfU0RPTkUJKDEgPDwgMTgpCS8qIFN0YXR1cyBEb25lICovCisjZGVmaW5lIEdTUl9SRENTCSgxIDw8IDE1KQkvKiBSZWFkIENvbXBsZXRpb24gU3RhdHVzICovCisjZGVmaW5lIEdTUl9CSVQzU0xUMTIJKDEgPDwgMTQpCS8qIEJpdCAzIG9mIHNsb3QgMTIgKi8KKyNkZWZpbmUgR1NSX0JJVDJTTFQxMgkoMSA8PCAxMykJLyogQml0IDIgb2Ygc2xvdCAxMiAqLworI2RlZmluZSBHU1JfQklUMVNMVDEyCSgxIDw8IDEyKQkvKiBCaXQgMSBvZiBzbG90IDEyICovCisjZGVmaW5lIEdTUl9TRUNSRVMJKDEgPDwgMTEpCS8qIFNlY29uZGFyeSBSZXN1bWUgSW50ZXJydXB0ICovCisjZGVmaW5lIEdTUl9QUklSRVMJKDEgPDwgMTApCS8qIFByaW1hcnkgUmVzdW1lIEludGVycnVwdCAqLworI2RlZmluZSBHU1JfU0NSCQkoMSA8PCA5KQkvKiBTZWNvbmRhcnkgQ29kZWMgUmVhZHkgKi8KKyNkZWZpbmUgR1NSX1BDUgkJKDEgPDwgOCkJLyogIFByaW1hcnkgQ29kZWMgUmVhZHkgKi8KKyNkZWZpbmUgR1NSX01DSU5UCSgxIDw8IDcpCS8qIE1pYyBJbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgR1NSX1BPSU5UCSgxIDw8IDYpCS8qIFBDTSBPdXQgSW50ZXJydXB0ICovCisjZGVmaW5lIEdTUl9QSUlOVAkoMSA8PCA1KQkvKiBQQ00gSW4gSW50ZXJydXB0ICovCisjZGVmaW5lIEdTUl9BQ09GRkQJKDEgPDwgMykJLyogQUMtbGluayBTaHV0IE9mZiBEb25lICovCisjZGVmaW5lIEdTUl9NT0lOVAkoMSA8PCAyKQkvKiBNb2RlbSBPdXQgSW50ZXJydXB0ICovCisjZGVmaW5lIEdTUl9NSUlOVAkoMSA8PCAxKQkvKiBNb2RlbSBJbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgR1NSX0dTQ0kJKDEgPDwgMCkJLyogQ29kZWMgR1BJIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgQ0FSCQlfX1JFRygweDQwNTAwMDIwKSAgLyogQ09ERUMgQWNjZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIENBUl9DQUlQCSgxIDw8IDApCS8qIENvZGVjIEFjY2VzcyBJbiBQcm9ncmVzcyAqLworCisjZGVmaW5lIFBDRFIJCV9fUkVHKDB4NDA1MDAwNDApICAvKiBQQ00gRklGTyBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIE1DRFIJCV9fUkVHKDB4NDA1MDAwNjApICAvKiBNaWMtaW4gRklGTyBEYXRhIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgTU9DUgkJX19SRUcoMHg0MDUwMDEwMCkgIC8qIE1vZGVtIE91dCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1PQ1JfRkVJRQkoMSA8PCAzKQkvKiBGSUZPIEVycm9yICovCisjZGVmaW5lIE1PQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIE1JQ1IJCV9fUkVHKDB4NDA1MDAxMDgpICAvKiBNb2RlbSBJbiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JQ1JfRkVJRQkoMSA8PCAzKQkvKiBGSUZPIEVycm9yICovCisjZGVmaW5lIE1JQ1JfRlNSSUUJKDEgPDwgMSkJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIE1PU1IJCV9fUkVHKDB4NDA1MDAxMTApICAvKiBNb2RlbSBPdXQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1PU1JfRklGT0UJKDEgPDwgNCkJLyogRklGTyBlcnJvciAqLworI2RlZmluZSBNT1NSX0ZTUgkoMSA8PCAyKQkvKiBGSUZPIFNlcnZpY2UgUmVxdWVzdCAqLworCisjZGVmaW5lIE1JU1IJCV9fUkVHKDB4NDA1MDAxMTgpICAvKiBNb2RlbSBJbiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlTUl9GSUZPRQkoMSA8PCA0KQkvKiBGSUZPIGVycm9yICovCisjZGVmaW5lIE1JU1JfRU9DCSgxIDw8IDMpCS8qIERNQSBFbmQtb2YtQ2hhaW4gKGV4Y2x1c2l2ZSBjbGVhcikgKi8KKyNkZWZpbmUgTUlTUl9GU1IJKDEgPDwgMikJLyogRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KKworI2RlZmluZSBNT0RSCQlfX1JFRygweDQwNTAwMTQwKSAgLyogTW9kZW0gRklGTyBEYXRhIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUEFDX1JFR19CQVNFCV9fUkVHKDB4NDA1MDAyMDApICAvKiBQcmltYXJ5IEF1ZGlvIENvZGVjICovCisjZGVmaW5lIFNBQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwMzAwKSAgLyogU2Vjb25kYXJ5IEF1ZGlvIENvZGVjICovCisjZGVmaW5lIFBNQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwNDAwKSAgLyogUHJpbWFyeSBNb2RlbSBDb2RlYyAqLworI2RlZmluZSBTTUNfUkVHX0JBU0UJX19SRUcoMHg0MDUwMDUwMCkgIC8qIFNlY29uZGFyeSBNb2RlbSBDb2RlYyAqLworCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0FDOTdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3JlZ3MtbGNkLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1sY2QuaAppbmRleCBjNjg5YzRlLi5mODJkY2VhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1sY2QuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy1sY2QuaApAQCAtMTIsMjcgKzEyLDI5IEBACiAjZGVmaW5lIExDQ1IzCQkoMHgwMEMpCS8qIExDRCBDb250cm9sbGVyIENvbnRyb2wgUmVnaXN0ZXIgMyAqLwogI2RlZmluZSBMQ0NSNAkJKDB4MDEwKQkvKiBMQ0QgQ29udHJvbGxlciBDb250cm9sIFJlZ2lzdGVyIDQgKi8KICNkZWZpbmUgTENDUjUJCSgweDAxNCkJLyogTENEIENvbnRyb2xsZXIgQ29udHJvbCBSZWdpc3RlciA1ICovCi0jZGVmaW5lIERGQlIwCQkoMHgwMjApCS8qIERNQSBDaGFubmVsIDAgRnJhbWUgQnJhbmNoIFJlZ2lzdGVyICovCi0jZGVmaW5lIERGQlIxCQkoMHgwMjQpCS8qIERNQSBDaGFubmVsIDEgRnJhbWUgQnJhbmNoIFJlZ2lzdGVyICovCi0jZGVmaW5lIExDU1IJCSgweDAzOCkJLyogTENEIENvbnRyb2xsZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIExDU1IJCSgweDAzOCkJLyogTENEIENvbnRyb2xsZXIgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgTENTUjEJCSgweDAzNCkJLyogTENEIENvbnRyb2xsZXIgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgTElJRFIJCSgweDAzQykJLyogTENEIENvbnRyb2xsZXIgSW50ZXJydXB0IElEIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRNRURSR0JSCSgweDA0MCkJLyogVE1FRCBSR0IgU2VlZCBSZWdpc3RlciAqLwogI2RlZmluZSBUTUVEQ1IJCSgweDA0NCkJLyogVE1FRCBDb250cm9sIFJlZ2lzdGVyICovCiAKKyNkZWZpbmUgRkJSMAkJKDB4MDIwKQkvKiBETUEgQ2hhbm5lbCAwIEZyYW1lIEJyYW5jaCBSZWdpc3RlciAqLworI2RlZmluZSBGQlIxCQkoMHgwMjQpCS8qIERNQSBDaGFubmVsIDEgRnJhbWUgQnJhbmNoIFJlZ2lzdGVyICovCisjZGVmaW5lIEZCUjIJCSgweDAyOCkgLyogRE1BIENoYW5uZWwgMiBGcmFtZSBCcmFuY2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkJSMwkJKDB4MDJDKSAvKiBETUEgQ2hhbm5lbCAyIEZyYW1lIEJyYW5jaCBSZWdpc3RlciAqLworI2RlZmluZSBGQlI0CQkoMHgwMzApIC8qIERNQSBDaGFubmVsIDIgRnJhbWUgQnJhbmNoIFJlZ2lzdGVyICovCisjZGVmaW5lIEZCUjUJCSgweDExMCkgLyogRE1BIENoYW5uZWwgMiBGcmFtZSBCcmFuY2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkJSNgkJKDB4MTE0KSAvKiBETUEgQ2hhbm5lbCAyIEZyYW1lIEJyYW5jaCBSZWdpc3RlciAqLworCisjZGVmaW5lIE9WTDFDMQkJKDB4MDUwKQkvKiBPdmVybGF5IDEgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIE9WTDFDMgkJKDB4MDYwKQkvKiBPdmVybGF5IDEgQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIE9WTDJDMQkJKDB4MDcwKQkvKiBPdmVybGF5IDIgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIE9WTDJDMgkJKDB4MDgwKQkvKiBPdmVybGF5IDIgQ29udHJvbCBSZWdpc3RlciAyICovCisKICNkZWZpbmUgQ01EQ1IJCSgweDEwMCkJLyogQ29tbWFuZCBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIFBSU1IJCSgweDEwNCkJLyogUGFuZWwgUmVhZCBTdGF0dXMgUmVnaXN0ZXIgKi8KIAotI2RlZmluZSBMQ0NSM18xQlBQCSgwIDw8IDI0KQotI2RlZmluZSBMQ0NSM18yQlBQCSgxIDw8IDI0KQotI2RlZmluZSBMQ0NSM180QlBQCSgyIDw8IDI0KQotI2RlZmluZSBMQ0NSM184QlBQCSgzIDw8IDI0KQotI2RlZmluZSBMQ0NSM18xNkJQUAkoNCA8PCAyNCkKLSNkZWZpbmUgTENDUjNfMThCUFAJKDUgPDwgMjQpCi0jZGVmaW5lIExDQ1IzXzE4QlBQX1AJKDYgPDwgMjQpCi0jZGVmaW5lIExDQ1IzXzE5QlBQCSg3IDw8IDI0KQotI2RlZmluZSBMQ0NSM18xOUJQUF9QCSgxIDw8IDI5KQotI2RlZmluZSBMQ0NSM18yNEJQUAkoKDEgPDwgMjkpIHwgKDEgPDwgMjQpKQotI2RlZmluZSBMQ0NSM18yNUJQUAkoKDEgPDwgMjkpIHwgKDIgPDwgMjQpKQorI2RlZmluZSBMQ0NSM19CUFAoeCkJKCgoKHgpICYgMHg3KSA8PCAyNCkgfCAoKCh4KSAmIDB4OCkgPyAoMSA8PCAyOSkgOiAwKSkKIAogI2RlZmluZSBMQ0NSM19QREZPUl8wCSgwIDw8IDMwKQogI2RlZmluZSBMQ0NSM19QREZPUl8xCSgxIDw8IDMwKQpAQCAtNDIsMTkgKzQ0LDE2IEBACiAjZGVmaW5lIExDQ1I0X1BBTF9GT1JfMAkoMCA8PCAxNSkKICNkZWZpbmUgTENDUjRfUEFMX0ZPUl8xCSgxIDw8IDE1KQogI2RlZmluZSBMQ0NSNF9QQUxfRk9SXzIJKDIgPDwgMTUpCisjZGVmaW5lIExDQ1I0X1BBTF9GT1JfMwkoMyA8PCAxNSkKICNkZWZpbmUgTENDUjRfUEFMX0ZPUl9NQVNLCSgzIDw8IDE1KQogCiAjZGVmaW5lIEZEQURSMAkJKDB4MjAwKQkvKiBETUEgQ2hhbm5lbCAwIEZyYW1lIERlc2NyaXB0b3IgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZSBGU0FEUjAJCSgweDIwNCkJLyogRE1BIENoYW5uZWwgMCBGcmFtZSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZSBGSURSMAkJKDB4MjA4KQkvKiBETUEgQ2hhbm5lbCAwIEZyYW1lIElEIFJlZ2lzdGVyICovCi0jZGVmaW5lIExEQ01EMAkJKDB4MjBDKQkvKiBETUEgQ2hhbm5lbCAwIENvbW1hbmQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRkRBRFIxCQkoMHgyMTApCS8qIERNQSBDaGFubmVsIDEgRnJhbWUgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTQURSMQkJKDB4MjE0KQkvKiBETUEgQ2hhbm5lbCAxIEZyYW1lIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZJRFIxCQkoMHgyMTgpCS8qIERNQSBDaGFubmVsIDEgRnJhbWUgSUQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTERDTUQxCQkoMHgyMUMpCS8qIERNQSBDaGFubmVsIDEgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBGREFEUjIJCSgweDIyMCkJLyogRE1BIENoYW5uZWwgMiBGcmFtZSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkRBRFIzCQkoMHgyMzApCS8qIERNQSBDaGFubmVsIDMgRnJhbWUgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEZEQURSNAkJKDB4MjQwKQkvKiBETUEgQ2hhbm5lbCA0IEZyYW1lIERlc2NyaXB0b3IgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBGREFEUjUJCSgweDI1MCkJLyogRE1BIENoYW5uZWwgNSBGcmFtZSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRkRBRFI2CQkoMHgyNjApIC8qIERNQSBDaGFubmVsIDYgRnJhbWUgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZTQURSNgkJKDB4MjY0KSAvKiBETUEgQ2hhbm5lbCA2IEZyYW1lIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZJRFI2CQkoMHgyNjgpIC8qIERNQSBDaGFubmVsIDYgRnJhbWUgSUQgUmVnaXN0ZXIgKi8KIAogI2RlZmluZSBMQ0NSMF9FTkIJKDEgPDwgMCkJLyogTENEIENvbnRyb2xsZXIgZW5hYmxlICovCiAjZGVmaW5lIExDQ1IwX0NNUwkoMSA8PCAxKQkvKiBDb2xvci9Nb25vY2hyb21lIERpc3BsYXkgU2VsZWN0ICovCkBAIC0xMjYsOSArMTI1LDYgQEAKICNkZWZpbmUgTENDUjNfUENECUZsZCAoOCwgMCkJLyogUGl4ZWwgQ2xvY2sgRGl2aXNvciAqLwogI2RlZmluZSBMQ0NSM19QaXhDbGtEaXYoRGl2KQkoKChEaXYpIDw8IEZTaGZ0IChMQ0NSM19QQ0QpKSkKIAotI2RlZmluZSBMQ0NSM19CUFAJRmxkICgzLCAyNCkJLyogQml0IFBlciBQaXhlbCAqLwotI2RlZmluZSBMQ0NSM19CcHAoQnBwKQkoKChCcHApIDw8IEZTaGZ0IChMQ0NSM19CUFApKSkKLQogI2RlZmluZSBMQ0NSM19BQ0IJRmxkICg4LCA4KQkvKiBBQyBCaWFzICovCiAjZGVmaW5lIExDQ1IzX0FjYihBY2IpCSgoKEFjYikgPDwgRlNoZnQgKExDQ1IzX0FDQikpKQogCkBAIC0xNTcsOCArMTUzLDIyIEBACiAjZGVmaW5lIExDU1JfUkRfU1QJKDEgPDwgMTEpCS8qIHJlYWQgc3RhdHVzICovCiAjZGVmaW5lIExDU1JfQ01EX0lOVAkoMSA8PCAxMikJLyogY29tbWFuZCBpbnRlcnJ1cHQgKi8KIAorI2RlZmluZSBMQ1NSMV9JVSh4KQkoMSA8PCAoKHgpICsgMjMpKSAvKiBJbnB1dCBGSUZPIHVuZGVycnVuICovCisjZGVmaW5lIExDU1IxX0JTKHgpCSgxIDw8ICgoeCkgKyAxNSkpIC8qIEJyYW5jaCBTdGF0dXMgKi8KKyNkZWZpbmUgTENTUjFfRU9GKHgpCSgxIDw8ICgoeCkgKyA3KSkgIC8qIEVuZCBvZiBGcmFtZSBTdGF0dXMgKi8KKyNkZWZpbmUgTENTUjFfU09GKHgpCSgxIDw8ICgoeCkgLSAxKSkgIC8qIFN0YXJ0IG9mIEZyYW1lIFN0YXR1cyAqLworCiAjZGVmaW5lIExEQ01EX1BBTAkoMSA8PCAyNikJLyogaW5zdHJ1Y3RzIERNQSB0byBsb2FkIHBhbGV0dGUgYnVmZmVyICovCiAKKy8qIG92ZXJsYXkgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT1ZMeEMxX1BQTCh4KQkoKCgoeCkgLSAxKSAmIDB4M2ZmKSA8PCAwKQkvKiBQaXhlbHMgUGVyIExpbmUgKi8KKyNkZWZpbmUgT1ZMeEMxX0xQTyh4KQkoKCgoeCkgLSAxKSAmIDB4M2ZmKSA8PCAxMCkJLyogTnVtYmVyIG9mIExpbmVzICovCisjZGVmaW5lIE9WTHhDMV9CUFAoeCkJKCgoeCkgJiAweGYpIDw8IDIwKQkvKiBCaXRzIFBlciBQaXhlbCAqLworI2RlZmluZSBPVkx4QzFfT0VOCSgxIDw8IDMxKQkJLyogRW5hYmxlIGJpdCBmb3IgT3ZlcmxheSAqLworI2RlZmluZSBPVkx4QzJfWFBPUyh4KQkoKCh4KSAmIDB4M2ZmKSA8PCAwKQkvKiBIb3Jpem9udGFsIFBvc2l0aW9uICovCisjZGVmaW5lIE9WTHhDMl9ZUE9TKHgpCSgoKHgpICYgMHgzZmYpIDw8IDEwKQkvKiBWZXJ0aWNhbCBQb3NpdGlvbiAqLworI2RlZmluZSBPVkwyQzJfUEZPUih4KQkoKCh4KSAmIDB4NykgPDwgMjApCS8qIFBpeGVsIEZvcm1hdCAqLworCiAvKiBzbWFydHBhbmVsIHJlbGF0ZWQgKi8KICNkZWZpbmUgUFJTUl9EQVRBKHgpCSgoeCkgJiAweGZmKQkvKiBQYW5lbCBEYXRhICovCiAjZGVmaW5lIFBSU1JfQTAJCSgxIDw8IDgpCS8qIFJlYWQgRGF0YSBTb3VyY2UgKi8KQEAgLTE3Nyw0ICsxODcsMTEgQEAKIAogI2RlZmluZSBTTUFSVF9DTUQoeCkJKFNNQVJUX0NNRF9XUklURV9DT01NQU5EIHwgKCh4KSAmIDB4ZmYpKQogI2RlZmluZSBTTUFSVF9EQVQoeCkJKFNNQVJUX0NNRF9XUklURV9EQVRBIHwgKCh4KSAmIDB4ZmYpKQorCisvKiBTTUFSVF9ERUxBWSgpIGlzIGludHJvZHVjZWQgZm9yIHNvZnR3YXJlIGNvbnRyb2xsZWQgZGVsYXkgcHJpbWl0aXZlIHdoaWNoCisgKiBjYW4gYmUgaW5zZXJ0ZWQgYmV0d2VlbiBjb21tYW5kIHNlcXVlbmNlcywgdW51c2VkIGNvbW1hbmQgMHg2IGlzIHVzZWQgaGVyZQorICogYW5kIGRlbGF5IHJhbmdlcyBmcm9tIDBtcyB+IDI1NW1zCisgKi8KKyNkZWZpbmUgU01BUlRfQ01EX0RFTEFZCQkoMHg2IDw8IDkpCisjZGVmaW5lIFNNQVJUX0RFTEFZKG1zKQkJKFNNQVJUX0NNRF9ERUxBWSB8ICgobXMpICYgMHhmZikpCiAjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX0xDRF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy11YXJ0LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVncy11YXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9yZWdzLXVhcnQuaApAQCAtMCwwICsxLDE0MyBAQAorI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfVUFSVF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19VQVJUX0gKKworLyoKKyAqIFVBUlRzCisgKi8KKworLyogRnVsbCBGdW5jdGlvbiBVQVJUIChGRlVBUlQpICovCisjZGVmaW5lIEZGVUFSVAkJRkZSQlIKKyNkZWZpbmUgRkZSQlIJCV9fUkVHKDB4NDAxMDAwMDApICAvKiBSZWNlaXZlIEJ1ZmZlciBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBGRlRIUgkJX19SRUcoMHg0MDEwMDAwMCkgIC8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIEZGSUVSCQlfX1JFRygweDQwMTAwMDA0KSAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgRkZJSVIJCV9fUkVHKDB4NDAxMDAwMDgpICAvKiBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgRkZGQ1IJCV9fUkVHKDB4NDAxMDAwMDgpICAvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIEZGTENSCQlfX1JFRygweDQwMTAwMDBDKSAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBGRk1DUgkJX19SRUcoMHg0MDEwMDAxMCkgIC8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEZGTFNSCQlfX1JFRygweDQwMTAwMDE0KSAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgRkZNU1IJCV9fUkVHKDB4NDAxMDAwMTgpICAvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgRkZTUFIJCV9fUkVHKDB4NDAxMDAwMUMpICAvKiBTY3JhdGNoIFBhZCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgRkZJU1IJCV9fUkVHKDB4NDAxMDAwMjApICAvKiBJbmZyYXJlZCBTZWxlY3Rpb24gUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEZGRExMCQlfX1JFRygweDQwMTAwMDAwKSAgLyogRGl2aXNvciBMYXRjaCBMb3cgUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgRkZETEgJCV9fUkVHKDB4NDAxMDAwMDQpICAvKiBEaXZpc29yIExhdGNoIEhpZ2ggUmVnaXN0ZXIgKERMQUIgPSAxKSAocmVhZC93cml0ZSkgKi8KKworLyogQmx1ZXRvb3RoIFVBUlQgKEJUVUFSVCkgKi8KKyNkZWZpbmUgQlRVQVJUCQlCVFJCUgorI2RlZmluZSBCVFJCUgkJX19SRUcoMHg0MDIwMDAwMCkgIC8qIFJlY2VpdmUgQnVmZmVyIFJlZ2lzdGVyIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEJUVEhSCQlfX1JFRygweDQwMjAwMDAwKSAgLyogVHJhbnNtaXQgSG9sZGluZyBSZWdpc3RlciAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgQlRJRVIJCV9fUkVHKDB4NDAyMDAwMDQpICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBCVElJUgkJX19SRUcoMHg0MDIwMDAwOCkgIC8qIEludGVycnVwdCBJRCBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBCVEZDUgkJX19SRUcoMHg0MDIwMDAwOCkgIC8qIEZJRk8gQ29udHJvbCBSZWdpc3RlciAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgQlRMQ1IJCV9fUkVHKDB4NDAyMDAwMEMpICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEJUTUNSCQlfX1JFRygweDQwMjAwMDEwKSAgLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgQlRMU1IJCV9fUkVHKDB4NDAyMDAwMTQpICAvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBCVE1TUgkJX19SRUcoMHg0MDIwMDAxOCkgIC8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBCVFNQUgkJX19SRUcoMHg0MDIwMDAxQykgIC8qIFNjcmF0Y2ggUGFkIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBCVElTUgkJX19SRUcoMHg0MDIwMDAyMCkgIC8qIEluZnJhcmVkIFNlbGVjdGlvbiBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgQlRETEwJCV9fUkVHKDB4NDAyMDAwMDApICAvKiBEaXZpc29yIExhdGNoIExvdyBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBCVERMSAkJX19SRUcoMHg0MDIwMDAwNCkgIC8qIERpdmlzb3IgTGF0Y2ggSGlnaCBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLworCisvKiBTdGFuZGFyZCBVQVJUIChTVFVBUlQpICovCisjZGVmaW5lIFNUVUFSVAkJU1RSQlIKKyNkZWZpbmUgU1RSQlIJCV9fUkVHKDB4NDA3MDAwMDApICAvKiBSZWNlaXZlIEJ1ZmZlciBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBTVFRIUgkJX19SRUcoMHg0MDcwMDAwMCkgIC8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFNUSUVSCQlfX1JFRygweDQwNzAwMDA0KSAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgU1RJSVIJCV9fUkVHKDB4NDA3MDAwMDgpICAvKiBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgU1RGQ1IJCV9fUkVHKDB4NDA3MDAwMDgpICAvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFNUTENSCQlfX1JFRygweDQwNzAwMDBDKSAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBTVE1DUgkJX19SRUcoMHg0MDcwMDAxMCkgIC8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIFNUTFNSCQlfX1JFRygweDQwNzAwMDE0KSAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgU1RNU1IJCV9fUkVHKDB4NDA3MDAwMTgpICAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBTVFNQUgkJX19SRUcoMHg0MDcwMDAxQykgIC8qIFNjcmF0Y2ggUGFkIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBTVElTUgkJX19SRUcoMHg0MDcwMDAyMCkgIC8qIEluZnJhcmVkIFNlbGVjdGlvbiBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgU1RETEwJCV9fUkVHKDB4NDA3MDAwMDApICAvKiBEaXZpc29yIExhdGNoIExvdyBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBTVERMSAkJX19SRUcoMHg0MDcwMDAwNCkgIC8qIERpdmlzb3IgTGF0Y2ggSGlnaCBSZWdpc3RlciAoRExBQiA9IDEpIChyZWFkL3dyaXRlKSAqLworCisvKiBIYXJkd2FyZSBVQVJUIChIV1VBUlQpICovCisjZGVmaW5lIEhXVUFSVAkJSFdSQlIKKyNkZWZpbmUgSFdSQlIJCV9fUkVHKDB4NDE2MDAwMDApICAvKiBSZWNlaXZlIEJ1ZmZlciBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBIV1RIUgkJX19SRUcoMHg0MTYwMDAwMCkgIC8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIEhXSUVSCQlfX1JFRygweDQxNjAwMDA0KSAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgSFdJSVIJCV9fUkVHKDB4NDE2MDAwMDgpICAvKiBJbnRlcnJ1cHQgSUQgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgSFdGQ1IJCV9fUkVHKDB4NDE2MDAwMDgpICAvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIEhXTENSCQlfX1JFRygweDQxNjAwMDBDKSAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBIV01DUgkJX19SRUcoMHg0MTYwMDAxMCkgIC8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEhXTFNSCQlfX1JFRygweDQxNjAwMDE0KSAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgSFdNU1IJCV9fUkVHKDB4NDE2MDAwMTgpICAvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgSFdTUFIJCV9fUkVHKDB4NDE2MDAwMUMpICAvKiBTY3JhdGNoIFBhZCBSZWdpc3RlciAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgSFdJU1IJCV9fUkVHKDB4NDE2MDAwMjApICAvKiBJbmZyYXJlZCBTZWxlY3Rpb24gUmVnaXN0ZXIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEhXRk9SCQlfX1JFRygweDQxNjAwMDI0KSAgLyogUmVjZWl2ZSBGSUZPIE9jY3VwYW5jeSBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBIV0FCUgkJX19SRUcoMHg0MTYwMDAyOCkgIC8qIEF1dG8tQmF1ZCBDb250cm9sIFJlZ2lzdGVyIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBIV0FDUgkJX19SRUcoMHg0MTYwMDAyQykgIC8qIEF1dG8tQmF1ZCBDb3VudCBSZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBIV0RMTAkJX19SRUcoMHg0MTYwMDAwMCkgIC8qIERpdmlzb3IgTGF0Y2ggTG93IFJlZ2lzdGVyIChETEFCID0gMSkgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIEhXRExICQlfX1JFRygweDQxNjAwMDA0KSAgLyogRGl2aXNvciBMYXRjaCBIaWdoIFJlZ2lzdGVyIChETEFCID0gMSkgKHJlYWQvd3JpdGUpICovCisKKyNkZWZpbmUgSUVSX0RNQUUJKDEgPDwgNykJLyogRE1BIFJlcXVlc3RzIEVuYWJsZSAqLworI2RlZmluZSBJRVJfVVVFCQkoMSA8PCA2KQkvKiBVQVJUIFVuaXQgRW5hYmxlICovCisjZGVmaW5lIElFUl9OUlpFCSgxIDw8IDUpCS8qIE5SWiBjb2RpbmcgRW5hYmxlICovCisjZGVmaW5lIElFUl9SVElPRQkoMSA8PCA0KQkvKiBSZWNlaXZlciBUaW1lIE91dCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElFUl9NSUUJCSgxIDw8IDMpCS8qIE1vZGVtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSUVSX1JMU0UJKDEgPDwgMikJLyogUmVjZWl2ZXIgTGluZSBTdGF0dXMgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJRVJfVElFCQkoMSA8PCAxKQkvKiBUcmFuc21pdCBEYXRhIHJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJRVJfUkFWSUUJKDEgPDwgMCkJLyogUmVjZWl2ZXIgRGF0YSBBdmFpbGFibGUgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIElJUl9GSUZPRVMxCSgxIDw8IDcpCS8qIEZJRk8gTW9kZSBFbmFibGUgU3RhdHVzICovCisjZGVmaW5lIElJUl9GSUZPRVMwCSgxIDw8IDYpCS8qIEZJRk8gTW9kZSBFbmFibGUgU3RhdHVzICovCisjZGVmaW5lIElJUl9UT0QJCSgxIDw8IDMpCS8qIFRpbWUgT3V0IERldGVjdGVkICovCisjZGVmaW5lIElJUl9JSUQyCSgxIDw8IDIpCS8qIEludGVycnVwdCBTb3VyY2UgRW5jb2RlZCAqLworI2RlZmluZSBJSVJfSUlEMQkoMSA8PCAxKQkvKiBJbnRlcnJ1cHQgU291cmNlIEVuY29kZWQgKi8KKyNkZWZpbmUgSUlSX0lQCQkoMSA8PCAwKQkvKiBJbnRlcnJ1cHQgUGVuZGluZyAoYWN0aXZlIGxvdykgKi8KKworI2RlZmluZSBGQ1JfSVRMMgkoMSA8PCA3KQkvKiBJbnRlcnJ1cHQgVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBGQ1JfSVRMMQkoMSA8PCA2KQkvKiBJbnRlcnJ1cHQgVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBGQ1JfUkVTRVRURgkoMSA8PCAyKQkvKiBSZXNldCBUcmFuc21pdHRlciBGSUZPICovCisjZGVmaW5lIEZDUl9SRVNFVFJGCSgxIDw8IDEpCS8qIFJlc2V0IFJlY2VpdmVyIEZJRk8gKi8KKyNkZWZpbmUgRkNSX1RSRklGT0UJKDEgPDwgMCkJLyogVHJhbnNtaXQgYW5kIFJlY2VpdmUgRklGTyBFbmFibGUgKi8KKyNkZWZpbmUgRkNSX0lUTF8xCSgwKQorI2RlZmluZSBGQ1JfSVRMXzgJKEZDUl9JVEwxKQorI2RlZmluZSBGQ1JfSVRMXzE2CShGQ1JfSVRMMikKKyNkZWZpbmUgRkNSX0lUTF8zMgkoRkNSX0lUTDJ8RkNSX0lUTDEpCisKKyNkZWZpbmUgTENSX0RMQUIJKDEgPDwgNykJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MgQml0ICovCisjZGVmaW5lIExDUl9TQgkJKDEgPDwgNikJLyogU2V0IEJyZWFrICovCisjZGVmaW5lIExDUl9TVEtZUAkoMSA8PCA1KQkvKiBTdGlja3kgUGFyaXR5ICovCisjZGVmaW5lIExDUl9FUFMJCSgxIDw8IDQpCS8qIEV2ZW4gUGFyaXR5IFNlbGVjdCAqLworI2RlZmluZSBMQ1JfUEVOCQkoMSA8PCAzKQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIExDUl9TVEIJCSgxIDw8IDIpCS8qIFN0b3AgQml0ICovCisjZGVmaW5lIExDUl9XTFMxCSgxIDw8IDEpCS8qIFdvcmQgTGVuZ3RoIFNlbGVjdCAqLworI2RlZmluZSBMQ1JfV0xTMAkoMSA8PCAwKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KKworI2RlZmluZSBMU1JfRklGT0UJKDEgPDwgNykJLyogRklGTyBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgTFNSX1RFTVQJKDEgPDwgNikJLyogVHJhbnNtaXR0ZXIgRW1wdHkgKi8KKyNkZWZpbmUgTFNSX1REUlEJKDEgPDwgNSkJLyogVHJhbnNtaXQgRGF0YSBSZXF1ZXN0ICovCisjZGVmaW5lIExTUl9CSQkJKDEgPDwgNCkJLyogQnJlYWsgSW50ZXJydXB0ICovCisjZGVmaW5lIExTUl9GRQkJKDEgPDwgMykJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBMU1JfUEUJCSgxIDw8IDIpCS8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBMU1JfT0UJCSgxIDw8IDEpCS8qIE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgTFNSX0RSCQkoMSA8PCAwKQkvKiBEYXRhIFJlYWR5ICovCisKKyNkZWZpbmUgTUNSX0xPT1AJKDEgPDwgNCkKKyNkZWZpbmUgTUNSX09VVDIJKDEgPDwgMykJLyogZm9yY2UgTVNSX0RDRCBpbiBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIE1DUl9PVVQxCSgxIDw8IDIpCS8qIGZvcmNlIE1TUl9SSSBpbiBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIE1DUl9SVFMJCSgxIDw8IDEpCS8qIFJlcXVlc3QgdG8gU2VuZCAqLworI2RlZmluZSBNQ1JfRFRSCQkoMSA8PCAwKQkvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisKKyNkZWZpbmUgTVNSX0RDRAkJKDEgPDwgNykJLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBNU1JfUkkJCSgxIDw8IDYpCS8qIFJpbmcgSW5kaWNhdG9yICovCisjZGVmaW5lIE1TUl9EU1IJCSgxIDw8IDUpCS8qIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIE1TUl9DVFMJCSgxIDw8IDQpCS8qIENsZWFyIFRvIFNlbmQgKi8KKyNkZWZpbmUgTVNSX0REQ0QJKDEgPDwgMykJLyogRGVsdGEgRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBNU1JfVEVSSQkoMSA8PCAyKQkvKiBUcmFpbGluZyBFZGdlIFJpbmcgSW5kaWNhdG9yICovCisjZGVmaW5lIE1TUl9ERFNSCSgxIDw8IDEpCS8qIERlbHRhIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIE1TUl9EQ1RTCSgxIDw8IDApCS8qIERlbHRhIENsZWFyIFRvIFNlbmQgKi8KKworLyoKKyAqIElyU1IgKEluZnJhcmVkIFNlbGVjdGlvbiBSZWdpc3RlcikKKyAqLworI2RlZmluZSBTVElTUl9SWFBMICAgICAgKDEgPDwgNCkgICAgICAgIC8qIFJlY2VpdmUgRGF0YSBQb2xhcml0eSAqLworI2RlZmluZSBTVElTUl9UWFBMICAgICAgKDEgPDwgMykgICAgICAgIC8qIFRyYW5zbWl0IERhdGEgUG9sYXJpdHkgKi8KKyNkZWZpbmUgU1RJU1JfWE1PREUgICAgICgxIDw8IDIpICAgICAgICAvKiBUcmFuc21pdCBQdWxzZSBXaWR0aCBTZWxlY3QgKi8KKyNkZWZpbmUgU1RJU1JfUkNWRUlSICAgICgxIDw8IDEpICAgICAgICAvKiBSZWNlaXZlciBTSVIgRW5hYmxlICovCisjZGVmaW5lIFNUSVNSX1hNSVRJUiAgICAoMSA8PCAwKSAgICAgICAgLyogVHJhbnNtaXR0ZXIgU0lSIEVuYWJsZSAqLworCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX1VBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCBiMDVmYzY2Li5hZjY3NjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMTAsNiArMTAsMTQgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKy8qIFZhcmlvdXMgZHJpdmVycyBhcmUgc3RpbGwgdXNpbmcgdGhlIGNvbnN0YW50IG9mIENMT0NLX1RJQ0tfUkFURSwgZm9yCisgKiB0aG9zZSBkcml2ZXJzIHRvIGF0IGxlYXN0IHdvcmssIHRoZSBkZWZpbml0aW9uIGlzIHByb3ZpZGVkIGhlcmUuCisgKgorICogTk9URTogdGhpcyBpcyBubyBsb25nZXIgYWNjdXJhdGUgd2hlbiBtdWx0aXBsZSBwcm9jZXNzb3JzIGFuZCBib2FyZHMKKyAqIGFyZSBzZWxlY3RlZCwgbmV3ZXIgZHJpdmVycyBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGlzIGFueSBtb3JlLiAgVXNlCisgKiBlaXRoZXIgdGhlIGNsb2Nrc291cmNlL2Nsb2NrZXZlbnQgb3IgZ2V0IHRoaXMgYXQgcnVuLXRpbWUgYnkgY2FsbGluZworICogZ2V0X2Nsb2NrX3RpY2tfcmF0ZSgpIChhcyBkZWZpbmVkIGluIGdlbmVyaWMuYykuCisgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1eCkKIC8qIFBYQTI1MC8yMTAgdGltZXIgYmFzZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggMjFlM2U4OS4uZjRiMDI5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0xMCw3ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLXVhcnQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjZGVmaW5lIF9fUkVHKHgpICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXgpCkBAIC0zNSw3ICszNSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2RlY29tcF9zZXR1cCh2b2lkKQogewotCWlmIChtYWNoaW5lX2lzX2xpdHRsZXRvbigpKQorCWlmIChtYWNoaW5lX2lzX2xpdHRsZXRvbigpIHx8IG1hY2hpbmVfaXNfaW50ZWxtb3RlMigpKQogCQlVQVJUID0gU1RVQVJUOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCmluZGV4IGI0ZDAwYWIuLjMxZGE3ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCkBAIC0yMCw4ICsyMCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9tYXg3MzJ4Lmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTM2LDEwICs0MSwxMCBAQAogCiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTMwMC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL3NzcC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4X3NwaS5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyN3hfa2V5cGFkLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHhfbmFuZC5oPgogI2luY2x1ZGUgPG1hY2gvbGl0dGxldG9uLmg+CkBAIC0zMTQsNiArMzE5LDczIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbGl0dGxldG9uX2luaXRfbmFuZCh2b2lkKSB7fQogI2VuZGlmIC8qIENPTkZJR19NVERfTkFORF9QWEEzeHggfHwgQ09ORklHX01URF9OQU5EX1BYQTN4eF9NT0RVTEUgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX0kyQ19QWEEpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19QWEFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBsZWRfaW5mbyBsaXR0bGV0b25fZGE5MDM0X2xlZHNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImxpdHRsZXRvbjprZXlwYWQxIiwKKwkJLmZsYWdzCT0gREE5MDM0X0xFRF9SQU1QLAorCX0sCisJWzFdID0geworCQkubmFtZQk9ICJsaXR0bGV0b246a2V5cGFkMiIsCisJCS5mbGFncwk9IERBOTAzNF9MRURfUkFNUCwKKwl9LAorCVsyXSA9IHsKKwkJLm5hbWUJPSAibGl0dGxldG9uOnZpYnJhIiwKKwkJLmZsYWdzCT0gMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkYTkwM3hfc3ViZGV2X2luZm8gbGl0dGxldG9uX2RhOTAzNF9zdWJkZXZzW10gPSB7CisJeworCQkubmFtZQkJPSAiZGE5MDN4LWxlZCIsCisJCS5pZAkJPSBEQTkwMzRfSURfTEVEXzEsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmxpdHRsZXRvbl9kYTkwMzRfbGVkc1swXSwKKwl9LCB7CisJCS5uYW1lCQk9ICJkYTkwM3gtbGVkIiwKKwkJLmlkCQk9IERBOTAzNF9JRF9MRURfMiwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbGl0dGxldG9uX2RhOTAzNF9sZWRzWzFdLAorCX0sIHsKKwkJLm5hbWUJCT0gImRhOTAzeC1sZWQiLAorCQkuaWQJCT0gREE5MDM0X0lEX1ZJQlJBLAorCQkucGxhdGZvcm1fZGF0YQk9ICZsaXR0bGV0b25fZGE5MDM0X2xlZHNbMl0sCisJfSwgeworCQkubmFtZQkJPSAiZGE5MDN4LWJhY2tsaWdodCIsCisJCS5pZAkJPSBEQTkwMzRfSURfV0xFRCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkYTkwM3hfcGxhdGZvcm1fZGF0YSBsaXR0bGV0b25fZGE5MDM0X2luZm8gPSB7CisJLm51bV9zdWJkZXZzCT0gQVJSQVlfU0laRShsaXR0bGV0b25fZGE5MDM0X3N1YmRldnMpLAorCS5zdWJkZXZzCT0gbGl0dGxldG9uX2RhOTAzNF9zdWJkZXZzLAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg3MzJ4X3BsYXRmb3JtX2RhdGEgbGl0dGxldG9uX21heDczMjBfaW5mbyA9IHsKKwkuZ3Bpb19iYXNlCT0gRVhUMF9HUElPX0JBU0UsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGxpdHRsZXRvbl9pMmNfaW5mb1tdID0geworCVswXSA9IHsKKwkJLnR5cGUJCT0gImRhOTAzNCIsCisJCS5hZGRyCQk9IDB4MzQsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmxpdHRsZXRvbl9kYTkwMzRfaW5mbywKKwkJLmlycQkJPSBncGlvX3RvX2lycShtZnBfdG9fZ3BpbyhNRlBfUElOX0dQSU8xOCkpLAorCX0sCisJWzFdID0geworCQkudHlwZQkJPSAibWF4NzMyMCIsCisJCS5hZGRyCQk9IDB4NTAsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmxpdHRsZXRvbl9tYXg3MzIwX2luZm8sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsaXR0bGV0b25faW5pdF9pMmModm9pZCkKK3sKKwlweGFfc2V0X2kyY19pbmZvKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIEFSUkFZX0FORF9TSVpFKGxpdHRsZXRvbl9pMmNfaW5mbykpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXR0bGV0b25faW5pdF9pMmModm9pZCkge30KKyNlbmRpZiAvKiBDT05GSUdfSTJDX1BYQSB8fCBDT05GSUdfSTJDX1BYQV9NT0RVTEUgKi8KKwogc3RhdGljIHZvaWQgX19pbml0IGxpdHRsZXRvbl9pbml0KHZvaWQpCiB7CiAJLyogaW5pdGlhbGl6ZSBNRlAgY29uZmlndXJhdGlvbnMgKi8KQEAgLTMyNiw2ICszOTgsNyBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7CiAKIAlsaXR0bGV0b25faW5pdF9zcGkoKTsKKwlsaXR0bGV0b25faW5pdF9pMmMoKTsKIAlsaXR0bGV0b25faW5pdF9sY2QoKTsKIAlsaXR0bGV0b25faW5pdF9rZXlwYWQoKTsKIAlsaXR0bGV0b25faW5pdF9uYW5kKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwppbmRleCA1MTkxMzhiLi4yMWI4MjFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKQEAgLTEyMyw2ICsxMjMsMTAgQEAKIAlHUElPMTA3X0dQSU8sCS8qIERTMVdNX0lSUSAqLwogCUdQSU8xMDhfR1BJTywJLyogR1NNX1JFQURZICovCiAJR1BJTzExNV9HUElPLAkvKiBuUEVOX0lSUSAqLworCisJLyogSTJDICovCisJR1BJTzExN19JMkNfU0NMLAorCUdQSU8xMThfSTJDX1NEQSwKIH07CiAKIC8qCkBAIC0zMzIsOCArMzM2LDcgQEAKIAkubW9kZXMgICAgICAgICAgID0gdG9wcG9seV9tb2RlcywKIAkubnVtX21vZGVzICAgICAgID0gMSwKIAkuZml4ZWRfbW9kZXMgICAgID0gMSwKLQkubGNjcjAgICAgICAgICAgID0gTENDUjBfQ29sb3IgfCBMQ0NSMF9TbmdsIHwgTENDUjBfQWN0LAotCS5sY2NyMyAgICAgICAgICAgPSBMQ0NSM19QaXhSc0VkZywKKwkubGNkX2Nvbm4JPSBMQ0RfQ09MT1JfVEZUXzE2QlBQLAogCS5weGFmYl9sY2RfcG93ZXIgPSB0b3Bwb2x5X2xjZF9wb3dlciwKIH07CiAKQEAgLTM0MSw4ICszNDQsOCBAQAogCS5tb2RlcyAgICAgICAgICAgPSBzYW1zdW5nX21vZGVzLAogCS5udW1fbW9kZXMgICAgICAgPSAxLAogCS5maXhlZF9tb2RlcyAgICAgPSAxLAotCS5sY2NyMCAgICAgICAgICAgPSBMQ0NSMF9MRERBTFQgfCBMQ0NSMF9Db2xvciB8IExDQ1IwX1NuZ2wgfCBMQ0NSMF9BY3QsCi0JLmxjY3IzICAgICAgICAgICA9IExDQ1IzX1BpeEZsRWRnLAorCS5sY2RfY29ubgkgPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMIHxcCisJCQkgICBMQ0RfQUxURVJOQVRFX01BUFBJTkcsCiAJLnB4YWZiX2xjZF9wb3dlciA9IHNhbXN1bmdfbGNkX3Bvd2VyLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwppbmRleCBmMmM3YWQ4Li41ZjIyNDk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwpAQCAtMTI4LDYgKzEyOCwxMCBAQAogCUdQSU8xMDhfS1BfTUtPVVRfNSwKIAlHUElPOTZfS1BfTUtPVVRfNiwKIAorCS8qIEkyQyAqLworCUdQSU8xMTdfSTJDX1NDTCwKKwlHUElPMTE4X0kyQ19TREEsCisKIAkvKiBHUElPICovCiAJR1BJTzFfR1BJTyB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCmluZGV4IDIwNjFjMDAuLjMzNjI2ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKQEAgLTM4LDEyICszOCwxMyBAQAogCXVuc2lnbmVkCXZhbGlkCQk6IDE7CiAJdW5zaWduZWQJY2FuX3dha2V1cAk6IDE7CiAJdW5zaWduZWQJa2V5cGFkX2dwaW8JOiAxOworCXVuc2lnbmVkCWRpcl9pbnZlcnRlZAk6IDE7CiAJdW5zaWduZWQgaW50CW1hc2s7IC8qIGJpdCBtYXNrIGluIFBXRVIgb3IgUEtXUiAqLworCXVuc2lnbmVkIGludAltdXhfbWFzazsgLyogYml0IG1hc2sgb2YgbXV4ZWQgZ3BpbyBiaXRzLCAwIGlmIG5vIG11eCAqLwogCXVuc2lnbmVkIGxvbmcJY29uZmlnOwogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgZ3Bpb19kZXNjW01GUF9QSU5fR1BJTzEyNyArIDFdOwotc3RhdGljIGludCBncGlvX25yOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBncGRyX2xwbVs0XTsKIApAQCAtNTQsNyArNTUsNyBAQAogCWludCB1b3JsID0gISEoZ3BpbyAmIDB4MTApOyAvKiBHQUZSeF9VIG9yIEdBRlJ4X0wgPyAqLwogCWludCBzaGZ0ID0gKGdwaW8gJiAweGYpIDw8IDE7CiAJaW50IGZuID0gTUZQX0FGKGMpOwotCWludCBkaXIgPSBjICYgTUZQX0RJUl9PVVQ7CisJaW50IGlzX291dCA9IChjICYgTUZQX0RJUl9PVVQpID8gMSA6IDA7CiAKIAlpZiAoZm4gPiAzKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY4LDcgKzY5LDcgQEAKIAllbHNlCiAJCUdBRlJfVShiYW5rKSA9IGdhZnI7CiAKLQlpZiAoZGlyID09IE1GUF9ESVJfT1VUKQorCWlmIChpc19vdXQgXiBncGlvX2Rlc2NbZ3Bpb10uZGlyX2ludmVydGVkKQogCQlHUERSKGdwaW8pIHw9IG1hc2s7CiAJZWxzZQogCQlHUERSKGdwaW8pICY9IH5tYXNrOwpAQCAtNzcsMTEgKzc4LDExIEBACiAJc3dpdGNoIChjICYgTUZQX0xQTV9TVEFURV9NQVNLKSB7CiAJY2FzZSBNRlBfTFBNX0RSSVZFX0hJR0g6CiAJCVBHU1IoYmFuaykgfD0gbWFzazsKLQkJZGlyID0gTUZQX0RJUl9PVVQ7CisJCWlzX291dCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgTUZQX0xQTV9EUklWRV9MT1c6CiAJCVBHU1IoYmFuaykgJj0gfm1hc2s7Ci0JCWRpciA9IE1GUF9ESVJfT1VUOworCQlpc19vdXQgPSAxOwogCQlicmVhazsKIAljYXNlIE1GUF9MUE1fREVGQVVMVDoKIAkJYnJlYWs7CkBAIC05Miw3ICs5Myw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChkaXIgPT0gTUZQX0RJUl9PVVQpCisJaWYgKGlzX291dCBeIGdwaW9fZGVzY1tncGlvXS5kaXJfaW52ZXJ0ZWQpCiAJCWdwZHJfbHBtW2JhbmtdIHw9IG1hc2s7CiAJZWxzZQogCQlncGRyX2xwbVtiYW5rXSAmPSB+bWFzazsKQEAgLTEwNiw3ICsxMDcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoKGMgJiBNRlBfTFBNX0NBTl9XQUtFVVApICYmIChkaXIgPT0gTUZQX0RJUl9PVVQpKSB7CisJaWYgKChjICYgTUZQX0xQTV9DQU5fV0FLRVVQKSAmJiBpc19vdXQpIHsKIAkJcHJfd2FybmluZygiJXM6IG91dHB1dCBHUElPJWQgdW5hYmxlIHRvIHdha2V1cFxuIiwKIAkJCQlfX2Z1bmNfXywgZ3Bpbyk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTY5LDcgKzE3MCw3IEBACiBpbnQgZ3Bpb19zZXRfd2FrZSh1bnNpZ25lZCBpbnQgZ3BpbywgdW5zaWduZWQgaW50IG9uKQogewogCXN0cnVjdCBncGlvX2Rlc2MgKmQ7Ci0JdW5zaWduZWQgbG9uZyBjOworCXVuc2lnbmVkIGxvbmcgYywgbXV4X3Rha2VuOwogCiAJaWYgKGdwaW8gPiBtZnBfdG9fZ3BpbyhNRlBfUElOX0dQSU8xMjcpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4Myw5ICsxODQsMTMgQEAKIAlpZiAoZC0+a2V5cGFkX2dwaW8pCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV4X3Rha2VuID0gKFBXRVIgJiBkLT5tdXhfbWFzaykgJiAofmQtPm1hc2spOworCWlmIChvbiAmJiBtdXhfdGFrZW4pCisJCXJldHVybiAtRUJVU1k7CisKIAlpZiAoZC0+Y2FuX3dha2V1cCAmJiAoYyAmIE1GUF9MUE1fQ0FOX1dBS0VVUCkpIHsKIAkJaWYgKG9uKSB7Ci0JCQlQV0VSIHw9IGQtPm1hc2s7CisJCQlQV0VSID0gKFBXRVIgJiB+ZC0+bXV4X21hc2spIHwgZC0+bWFzazsKIAogCQkJaWYgKGMgJiBNRlBfTFBNX0VER0VfUklTRSkKIAkJCQlQUkVSIHw9IGQtPm1hc2s7CkBAIC0yMTAsNyArMjE1LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPD0gODQ7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDw9IHB4YV9sYXN0X2dwaW87IGkrKykKIAkJZ3Bpb19kZXNjW2ldLnZhbGlkID0gMTsKIAogCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgewpAQCAtMjE4LDcgKzIyMywxMSBAQAogCQlncGlvX2Rlc2NbaV0ubWFzayA9IEdQSU9fYml0KGkpOwogCX0KIAotCWdwaW9fbnIgPSA4NTsKKwkvKiBQWEEyNnggaGFzIGFkZGl0aW9uYWwgNCBHUElPcyAoODYvODcvODgvODkpIHdoaWNoIGhhcyB0aGUKKwkgKiBkaXJlY3Rpb24gYml0IGludmVydGVkIGluIEdQRFIyLiBTZWUgUFhBMjZ4IERNIDQuMS4xLgorCSAqLworCWZvciAoaSA9IDg2OyBpIDw9IHB4YV9sYXN0X2dwaW87IGkrKykKKwkJZ3Bpb19kZXNjW2ldLmRpcl9pbnZlcnRlZCA9IDE7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHB4YTI1eF9tZnBfaW5pdCh2b2lkKSB7fQpAQCAtMjUxLDExICsyNjAsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBQV0VSX1dFTVVYMl9HUElPMzgJKDEgPDwgMTYpCisjZGVmaW5lIFBXRVJfV0VNVVgyX0dQSU81MwkoMiA8PCAxNikKKyNkZWZpbmUgUFdFUl9XRU1VWDJfR1BJTzQwCSgzIDw8IDE2KQorI2RlZmluZSBQV0VSX1dFTVVYMl9HUElPMzYJKDQgPDwgMTYpCisjZGVmaW5lIFBXRVJfV0VNVVgyX01BU0sJKDcgPDwgMTYpCisjZGVmaW5lIFBXRVJfV0VNVVgzX0dQSU8zMQkoMSA8PCAxOSkKKyNkZWZpbmUgUFdFUl9XRU1VWDNfR1BJTzExMwkoMiA8PCAxOSkKKyNkZWZpbmUgUFdFUl9XRU1VWDNfTUFTSwkoMyA8PCAxOSkKKworI2RlZmluZSBJTklUX0dQSU9fREVTQ19NVVhFRChtdXgsIGdwaW8pCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlncGlvX2Rlc2NbKGdwaW8pXS5jYW5fd2FrZXVwID0gMTsJCQlcCisJZ3Bpb19kZXNjWyhncGlvKV0ubWFzayA9IFBXRVJfICMjIG11eCAjIyBfR1BJTyAjI2dwaW87CVwKKwlncGlvX2Rlc2NbKGdwaW8pXS5tdXhfbWFzayA9IFBXRVJfICMjIG11eCAjIyBfTUFTSzsJXAorfSB3aGlsZSAoMCkKKwogc3RhdGljIHZvaWQgX19pbml0IHB4YTI3eF9tZnBfaW5pdCh2b2lkKQogewogCWludCBpLCBncGlvOwogCi0JZm9yIChpID0gMDsgaSA8PSAxMjA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gcHhhX2xhc3RfZ3BpbzsgaSsrKSB7CiAJCS8qIHNraXAgR1BJTzIsIDUsIDYsIDcsIDgsIHRoZXkgYXJlIG5vdAogCQkgKiB2YWxpZCBwaW5zIGFsbG93IGNvbmZpZ3VyYXRpb24KIAkJICovCkBAIC0yODYsNyArMzExLDEyIEBACiAJZ3Bpb19kZXNjWzM1XS5jYW5fd2FrZXVwID0gMTsKIAlncGlvX2Rlc2NbMzVdLm1hc2sgPSBQV0VSX1dFMzU7CiAKLQlncGlvX25yID0gMTIxOworCUlOSVRfR1BJT19ERVNDX01VWEVEKFdFTVVYMywgMzEpOworCUlOSVRfR1BJT19ERVNDX01VWEVEKFdFTVVYMywgMTEzKTsKKwlJTklUX0dQSU9fREVTQ19NVVhFRChXRU1VWDIsIDM4KTsKKwlJTklUX0dQSU9fREVTQ19NVVhFRChXRU1VWDIsIDUzKTsKKwlJTklUX0dQSU9fREVTQ19NVVhFRChXRU1VWDIsIDQwKTsKKwlJTklUX0dQSU9fREVTQ19NVVhFRChXRU1VWDIsIDM2KTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcHhhMjd4X21mcF9pbml0KHZvaWQpIHt9CkBAIC0zMDAsNyArMzMwLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPD0gZ3Bpb190b19iYW5rKGdwaW9fbnIpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IGdwaW9fdG9fYmFuayhweGFfbGFzdF9ncGlvKTsgaSsrKSB7CiAKIAkJc2F2ZWRfZ2FmclswXVtpXSA9IEdBRlJfTChpKTsKIAkJc2F2ZWRfZ2FmclsxXVtpXSA9IEdBRlJfVShpKTsKQEAgLTMxNSw3ICszNDUsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8PSBncGlvX3RvX2JhbmsoZ3Bpb19ucik7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gZ3Bpb190b19iYW5rKHB4YV9sYXN0X2dwaW8pOyBpKyspIHsKIAkJR0FGUl9MKGkpID0gc2F2ZWRfZ2FmclswXVtpXTsKIAkJR0FGUl9VKGkpID0gc2F2ZWRfZ2FmclsxXVtpXTsKIAkJR1BEUihpICogMzIpID0gc2F2ZWRfZ3BkcltpXTsKQEAgLTM0OCw3ICszNzgsNyBAQAogCQlweGEyN3hfbWZwX2luaXQoKTsKIAogCS8qIGluaXRpYWxpemUgZ2Fmcl9ydW5bXSwgcGdzcl9scG1bXSBmcm9tIGV4aXN0aW5nIHZhbHVlcyAqLwotCWZvciAoaSA9IDA7IGkgPD0gZ3Bpb190b19iYW5rKGdwaW9fbnIpOyBpKyspCisJZm9yIChpID0gMDsgaSA8PSBncGlvX3RvX2JhbmsocHhhX2xhc3RfZ3Bpbyk7IGkrKykKIAkJZ3Bkcl9scG1baV0gPSBHUERSKGkgKiAzMik7CiAKIAlyZXR1cm4gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZweGEyeHhfbWZwX3N5c2NsYXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYwppbmRleCA3ODI5MDNmLi4yYjQyN2UwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4X2JhdHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTQ2LDYgKzQ2LDkgQEAKICNpbmNsdWRlIDxtYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyN3gtdWRjLmg+CisjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWlvYTcwMS5oPgogCkBAIC01NCwxMCArNTcsMTEgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWlvYTcwMV9waW5fY29uZmlnW10gPSB7CiAJLyogTWlvIGdsb2JhbCAqLwotCU1JT19DRkdfT1VUKEdQSU85X0NIQVJHRV9uRU4sIEFGMCwgRFJJVkVfTE9XKSwKKwlNSU9fQ0ZHX09VVChHUElPOV9DSEFSR0VfRU4sIEFGMCwgRFJJVkVfTE9XKSwKIAlNSU9fQ0ZHX09VVChHUElPMThfUE9XRVJPRkYsIEFGMCwgRFJJVkVfTE9XKSwKIAlNRlBfQ0ZHX09VVChHUElPMywgQUYwLCBEUklWRV9ISUdIKSwKIAlNRlBfQ0ZHX09VVChHUElPNCwgQUYwLCBEUklWRV9ISUdIKSwKKwlNSU9fQ0ZHX0lOKEdQSU84MF9NQVlCRV9DSEFSR0VfVkRST1AsIEFGMCksCiAKIAkvKiBCYWNrbGlnaHQgUFdNIDAgKi8KIAlHUElPMTZfUFdNMF9PVVQsCkBAIC03NCw3ICs3OCw3IEBACiAJTUlPX0NGR19PVVQoR1BJTzkxX1NESU9fRU4sIEFGMCwgRFJJVkVfTE9XKSwKIAogCS8qIFVTQiAqLwotCU1JT19DRkdfSU4oR1BJTzEzX1VTQl9ERVRFQ1QsIEFGMCksCisJTUlPX0NGR19JTihHUElPMTNfblVTQl9ERVRFQ1QsIEFGMCksCiAJTUlPX0NGR19PVVQoR1BJTzIyX1VTQl9FTkFCTEUsIEFGMCwgRFJJVkVfTE9XKSwKIAogCS8qIExDRCAqLwpAQCAtOTgsMTIgKzEwMiwyOSBAQAogCUdQSU83NV9MQ0RfTENMSywKIAlHUElPNzZfTENEX1BDTEssCiAKKwkvKiBRQ0kgKi8KKwlHUElPMTJfQ0lGX0REXzcsCisJR1BJTzE3X0NJRl9ERF82LAorCUdQSU81MF9DSUZfRERfMywKKwlHUElPNTFfQ0lGX0REXzIsCisJR1BJTzUyX0NJRl9ERF80LAorCUdQSU81M19DSUZfTUNMSywKKwlHUElPNTRfQ0lGX1BDTEssCisJR1BJTzU1X0NJRl9ERF8xLAorCUdQSU84MV9DSUZfRERfMCwKKwlHUElPODJfQ0lGX0REXzUsCisJR1BJTzg0X0NJRl9GViwKKwlHUElPODVfQ0lGX0xWLAorCiAJLyogQmx1ZXRvb3RoICovCisJTUlPX0NGR19JTihHUElPMTRfQlRfbkFDVElWSVRZLCBBRjApLAogCUdQSU80NF9CVFVBUlRfQ1RTLAogCUdQSU80Ml9CVFVBUlRfUlhELAogCUdQSU80NV9CVFVBUlRfUlRTLAogCUdQSU80M19CVFVBUlRfVFhELAogCU1JT19DRkdfT1VUKEdQSU84M19CVF9PTiwgQUYwLCBEUklWRV9MT1cpLAorCU1JT19DRkdfT1VUKEdQSU83N19CVF9VTktOT1dOMSwgQUYwLCBEUklWRV9ISUdIKSwKKwlNSU9fQ0ZHX09VVChHUElPODZfQlRfTUFZQkVfblJFU0VULCBBRjAsIERSSVZFX0hJR0gpLAogCiAJLyogR1BTICovCiAJTUlPX0NGR19PVVQoR1BJTzIzX0dQU19VTktOT1dOMSwgQUYwLCBEUklWRV9MT1cpLApAQCAtMTUxLDE2ICsxNzIsMTYgQEAKIAlHUElPMTA0X0tQX01LT1VUXzEsCiAJR1BJTzEwNV9LUF9NS09VVF8yLAogCisJLyogSTJDICovCisJR1BJTzExN19JMkNfU0NMLAorCUdQSU8xMThfSTJDX1NEQSwKKwogCS8qIFVua25vd24gKi8KLQlNRlBfQ0ZHX0lOKEdQSU8xNCwgQUYwKSwKIAlNRlBfQ0ZHX0lOKEdQSU8yMCwgQUYwKSwKIAlNRlBfQ0ZHX0lOKEdQSU8yMSwgQUYwKSwKIAlNRlBfQ0ZHX0lOKEdQSU8zMywgQUYwKSwKIAlNRlBfQ0ZHX09VVChHUElPNDksIEFGMCwgRFJJVkVfSElHSCksCiAJTUZQX0NGR19PVVQoR1BJTzU3LCBBRjAsIERSSVZFX0hJR0gpLAotCU1GUF9DRkdfT1VUKEdQSU83NywgQUYwLCBEUklWRV9ISUdIKSwKLQlNRlBfQ0ZHX0lOKEdQSU84MCwgQUYwKSwKLQlNRlBfQ0ZHX09VVChHUElPODYsIEFGMCwgRFJJVkVfSElHSCksCiAJTUZQX0NGR19JTihHUElPOTYsIEFGMCksCiAJTUZQX0NGR19PVVQoR1BJTzExNiwgQUYwLCBEUklWRV9ISUdIKSwKIH07CkBAIC00MDcsNyArNDI4LDcgQEAKIAogc3RhdGljIGludCBpc191c2JfY29ubmVjdGVkKHZvaWQpCiB7Ci0JcmV0dXJuICEhZ3Bpb19nZXRfdmFsdWUoR1BJTzEzX1VTQl9ERVRFQ1QpOworCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoR1BJTzEzX25VU0JfREVURUNUKTsKIH0KIAogc3RhdGljIHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyBtaW9hNzAxX3VkY19pbmZvID0gewpAQCAtNjU5LDEzICs2ODAsMTkgQEAKIAkibWlvYTcwMV9iYXR0ZXJ5IgogfTsKIAorc3RhdGljIGludCBpc19hY19jb25uZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJTzk2X0FDX0RFVEVDVCk7Cit9CisKIHN0YXRpYyB2b2lkIG1pb2E3MDFfc2V0X2NoYXJnZShpbnQgZmxhZ3MpCiB7Ci0JZ3Bpb19zZXRfdmFsdWUoR1BJTzlfQ0hBUkdFX25FTiwgIWZsYWdzKTsKKwlncGlvX3NldF92YWx1ZShHUElPOV9DSEFSR0VfRU4sIChmbGFncyA9PSBQREFfUE9XRVJfQ0hBUkdFX1VTQikpOwogfQogCiBzdGF0aWMgc3RydWN0IHBkYV9wb3dlcl9wZGF0YSBwb3dlcl9wZGF0YSA9IHsKLQkuaXNfYWNfb25saW5lCT0gaXNfdXNiX2Nvbm5lY3RlZCwKKwkuaXNfYWNfb25saW5lCT0gaXNfYWNfY29ubmVjdGVkLAorCS5pc191c2Jfb25saW5lCT0gaXNfdXNiX2Nvbm5lY3RlZCwKIAkuc2V0X2NoYXJnZSA9IG1pb2E3MDFfc2V0X2NoYXJnZSwKIAkuc3VwcGxpZWRfdG8gPSBzdXBwbGljYW50cywKIAkubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbGljYW50cyksCkBAIC02NzQsOCArNzAxLDE1IEBACiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHBvd2VyX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLm5hbWUJPSAiYWMiLAotCQkuc3RhcnQJPSBncGlvX3RvX2lycShHUElPMTNfVVNCX0RFVEVDVCksCi0JCS5lbmQJPSBncGlvX3RvX2lycShHUElPMTNfVVNCX0RFVEVDVCksCisJCS5zdGFydAk9IGdwaW9fdG9faXJxKEdQSU85Nl9BQ19ERVRFQ1QpLAorCQkuZW5kCT0gZ3Bpb190b19pcnEoR1BJTzk2X0FDX0RFVEVDVCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfSElHSEVER0UgfAorCQlJT1JFU09VUkNFX0lSUV9MT1dFREdFLAorCX0sCisJWzFdID0geworCQkubmFtZQk9ICJ1c2IiLAorCQkuc3RhcnQJPSBncGlvX3RvX2lycShHUElPMTNfblVTQl9ERVRFQ1QpLAorCQkuZW5kCT0gZ3Bpb190b19pcnEoR1BJTzEzX25VU0JfREVURUNUKSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSB8CiAJCUlPUkVTT1VSQ0VfSVJRX0xPV0VER0UsCiAJfSwKQEAgLTY5MSwxMjAgKzcyNSw0MyBAQAogCX0sCiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfUERBX1BPV0VSKSAmJiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFgpCi1zdGF0aWMgc3RydWN0IHdtOTd4eCAqYmF0dGVyeV93bTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGJhdHRlcnlfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCS8qIE5lY2Vzc2FyeSBmb3IgYXBtICovCitzdGF0aWMgc3RydWN0IHdtOTd4eF9iYXR0X2luZm8gbWlvYTcwMV9iYXR0ZXJ5X2RhdGEgPSB7CisJLmJhdHRfYXV4CT0gV005N1hYX0FVWF9JRDEsCisJLnRlbXBfYXV4CT0gLTEsCisJLmNoYXJnZV9ncGlvCT0gLTEsCisJLm1pbl92b2x0YWdlCT0gMHhjMDAsCisJLm1heF92b2x0YWdlCT0gMHhmYzAsCisJLmJhdHRfdGVjaAk9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJT04sCisJLmJhdHRfZGl2CT0gMSwKKwkuYmF0dF9tdWx0CT0gMSwKKwkuYmF0dF9uYW1lCT0gIm1pb2E3MDFfYmF0dGVyeSIsCiB9OwogCi1zdGF0aWMgaW50IGdldF9iYXR0ZXJ5X3ZvbHRhZ2Uodm9pZCkKLXsKLQlpbnQgYWRjID0gLTE7Ci0KLQlpZiAoYmF0dGVyeV93bSkKLQkJYWRjID0gd205N3h4X3JlYWRfYXV4X2FkYyhiYXR0ZXJ5X3dtLCBXTTk3WFhfQVVYX0lEMSk7Ci0JcmV0dXJuIGFkYzsKLX0KLQotc3RhdGljIGludCBnZXRfYmF0dGVyeV9zdGF0dXMoc3RydWN0IHBvd2VyX3N1cHBseSAqYikKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGlzX3VzYl9jb25uZWN0ZWQoKSkKLQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQllbHNlCi0JCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGdldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiLAotCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJdmFsLT5pbnR2YWwgPSBnZXRfYmF0dGVyeV9zdGF0dXMoYik7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IDB4ZmQwOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKLQkJdmFsLT5pbnR2YWwgPSAweGMwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBnZXRfYmF0dGVyeV92b2x0YWdlKCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IDEwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmFsLT5pbnR2YWwgPSAtMTsKLQkJcmMgPSAtMTsKLQl9Ci0KLQlyZXR1cm4gcmM7CisvKgorICogQ2FtZXJhIGludGVyZmFjZQorICovCitzdHJ1Y3QgcHhhY2FtZXJhX3BsYXRmb3JtX2RhdGEgbWlvYTcwMV9weGFjYW1lcmFfcGxhdGZvcm1fZGF0YSA9IHsKKwkuZmxhZ3MgID0gUFhBX0NBTUVSQV9NQVNURVIgfCBQWEFfQ0FNRVJBX0RBVEFXSURUSF84IHwKKwkJUFhBX0NBTUVSQV9QQ0xLX0VOIHwgUFhBX0NBTUVSQV9NQ0xLX0VOLAorCS5tY2xrXzEwa2h6ID0gNTAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnlfcHMgPSB7Ci0JLm5hbWUgPSAibWlvYTcwMV9iYXR0ZXJ5IiwKLQkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLmdldF9wcm9wZXJ0eSA9IGdldF9wcm9wZXJ0eSwKLQkucHJvcGVydGllcyA9IGJhdHRlcnlfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShiYXR0ZXJ5X3Byb3BzKSwKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGljbGluayA9IHsKKwkuYnVzX2lkCT0gMCwgLyogTXVzdCBtYXRjaCBpZCBpbiBweGEyN3hfZGV2aWNlX2NhbWVyYSBpbiBkZXZpY2UuYyAqLwogfTsKIAotc3RhdGljIGludCBiYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdtOTd4eCAqd20gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmM7Ci0KLQliYXR0ZXJ5X3dtID0gd207Ci0KLQlyYyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihOVUxMLCAmYmF0dGVyeV9wcyk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCSJDb3VsZCBub3QgcmVnaXN0ZXIgbWlvYTcwMSBiYXR0ZXJ5IC0+ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGJhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JYmF0dGVyeV93bSA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1pb2E3MDFfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid205N3h4LWJhdHRlcnkiLAorLyogQm9hcmQgSTJDIGRldmljZXMuICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgbWlvYTcwMV9pMmNfZGV2aWNlc1tdID0geworCXsKKwkJLyogTXVzdCBpbml0aWFsaXplIGJlZm9yZSB0aGUgY2FtZXJhKHMpICovCisJCUkyQ19CT0FSRF9JTkZPKCJtdDltMTExIiwgMHg1ZCksCisJCS5wbGF0Zm9ybV9kYXRhID0gJmljbGluaywKIAl9LAotCS5wcm9iZSA9IGJhdHRlcnlfcHJvYmUsCi0JLnJlbW92ZSA9IGJhdHRlcnlfcmVtb3ZlCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtaW9hNzAxX2JhdHRlcnlfaW5pdCh2b2lkKQotewotCWludCByYzsKLQotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtaW9hNzAxX2JhdHRlcnlfZHJpdmVyKTsKLQlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIG1pb2E3MDEgYmF0dGVyeSBkcml2ZXJcbiIpOwotCXJldHVybiByYzsKLX0KLQotI2Vsc2UKLXN0YXRpYyBpbnQgX19pbml0IG1pb2E3MDFfYmF0dGVyeV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKK3N0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgaTJjX3BkYXRhID0geworCS5mYXN0X21vZGUgPSAxLAorfTsKIAogLyoKICAqIE1pbyBnbG9iYWwKQEAgLTg1MSwxNyArODA4LDE3IEBACiBzdGF0aWMgdm9pZCBtaW9hNzAxX3Bvd2Vyb2ZmKHZvaWQpCiB7CiAJbWlvYTcwMV9tYWNoaW5lX2V4aXQoKTsKLQlncGlvX3NldF92YWx1ZShHUElPMThfUE9XRVJPRkYsIDEpOworCWFybV9tYWNoaW5lX3Jlc3RhcnQoJ3MnKTsKIH0KIAogc3RhdGljIHZvaWQgbWlvYTcwMV9yZXN0YXJ0KGNoYXIgYykKIHsKIAltaW9hNzAxX21hY2hpbmVfZXhpdCgpOwotCWFybV9tYWNoaW5lX3Jlc3RhcnQoYyk7CisJYXJtX21hY2hpbmVfcmVzdGFydCgncycpOwogfQogCiBzdHJ1Y3QgZ3Bpb19yZXNzIGdsb2JhbF9ncGlvc1tdID0gewotCU1JT19HUElPX09VVChHUElPOV9DSEFSR0VfbkVOLCAxLCAiQ2hhcmdlciBlbmFibGUiKSwKKwlNSU9fR1BJT19PVVQoR1BJTzlfQ0hBUkdFX0VOLCAxLCAiQ2hhcmdlciBlbmFibGUiKSwKIAlNSU9fR1BJT19PVVQoR1BJTzE4X1BPV0VST0ZGLCAwLCAiUG93ZXIgT2ZmIiksCiAJTUlPX0dQSU9fT1VUKEdQSU84N19MQ0RfUE9XRVIsIDAsICJMQ0QgUG93ZXIiKQogfTsKQEAgLTg3OSwxMiArODM2LDE2IEBACiAJc2V0X3B4YV9mYl9pbmZvKCZtaW9hNzAxX3B4YWZiX2luZm8pOwogCXB4YV9zZXRfbWNpX2luZm8oJm1pb2E3MDFfbWNpX2luZm8pOwogCXB4YV9zZXRfa2V5cGFkX2luZm8oJm1pb2E3MDFfa2V5cGFkX2luZm8pOworCXdtOTd4eF9iYXRfc2V0X3BkYXRhKCZtaW9hNzAxX2JhdHRlcnlfZGF0YSk7CiAJdWRjX2luaXQoKTsKIAlwbV9wb3dlcl9vZmYgPSBtaW9hNzAxX3Bvd2Vyb2ZmOwogCWFybV9wbV9yZXN0YXJ0ID0gbWlvYTcwMV9yZXN0YXJ0OwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCWdzbV9pbml0KCk7Ci0JbWlvYTcwMV9iYXR0ZXJ5X2luaXQoKTsKKworCXB4YV9zZXRfaTJjX2luZm8oJmkyY19wZGF0YSk7CisJcHhhX3NldF9jYW1lcmFfaW5mbygmbWlvYTcwMV9weGFjYW1lcmFfcGxhdGZvcm1fZGF0YSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgQVJSQVlfQU5EX1NJWkUobWlvYTcwMV9pMmNfZGV2aWNlcykpOwogfQogCiBzdGF0aWMgdm9pZCBtaW9hNzAxX21hY2hpbmVfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCmluZGV4IGIzNmNlYzVjLi4zNDg0MWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCkBAIC01NSw2ICs1NSwxMCBAQAogCUdQSU84OV9VU0JIMV9QRU4sCiAJLyogUFdNMCAqLwogCUdQSU8xNl9QV00wX09VVCwKKworCS8qIEkyQyAqLworCUdQSU8xMTdfSTJDX1NDTCwKKwlHUElPMTE4X0kyQ19TREEsCiB9OwogCiAvKgpAQCAtMTAwLDggKzEwNCw3IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBwY205OTBfZmJpbmZvIF9faW5pdGRhdGEgPSB7CiAJLm1vZGVzCQkJPSAmZmJfaW5mb19zaGFycF9scTA4NHYxZGcyMSwKIAkubnVtX21vZGVzCQk9IDEsCi0JLmxjY3IwCQkJPSBMQ0NSMF9QQVMsCi0JLmxjY3IzCQkJPSBMQ0NSM19QQ1AsCisJLmxjZF9jb25uCQk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwsCiAJLnB4YWZiX2xjZF9wb3dlcgk9IHBjbTk5MF9sY2RfcG93ZXIsCiB9OwogI2VsaWYgZGVmaW5lZChDT05GSUdfUENNOTkwX0RJU1BMQVlfTkVDKQpAQCAtMTIzLDggKzEyNiw3IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBwY205OTBfZmJpbmZvIF9faW5pdGRhdGEgPSB7CiAJLm1vZGVzCQkJPSAmZmJfaW5mb19uZWNfbmw2NDQ4YmMyMF8xOGQsCiAJLm51bV9tb2RlcwkJPSAxLAotCS5sY2NyMAkJCT0gTENDUjBfQWN0LAotCS5sY2NyMwkJCT0gTENDUjNfUGl4RmxFZGcsCisJLmxjZF9jb25uCQk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwsCiAJLnB4YWZiX2xjZF9wb3dlcgk9IHBjbTk5MF9sY2RfcG93ZXIsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCmluZGV4IDJlM2JkOGIuLmFlODg4NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CkBAIC00MTMsOSArNDE0LDQwIEBACiAJLmxjZF9jb25uCT0gTENEX0NPTE9SX1RGVF8xNkJQUCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzaGFycHNsX3JvbV9wYXJ0c1tdID0geworCXsKKwkJLm5hbWUJPSJCb290IFBST00gRmlsZXN5c3RlbSIsCisJCS5vZmZzZXQJPSAweDAwMTIwMDAwLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHNoYXJwc2xfcm9tX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShzaGFycHNsX3JvbV9wYXJ0cyksCisJLnBhcnRzCQk9IHNoYXJwc2xfcm9tX3BhcnRzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaGFycHNsX3JvbV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IDB4MDAwMDAwMDAsCisJCS5lbmQJPSAweDAwN2ZmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2hhcnBzbF9yb21fZGV2aWNlID0geworCS5uYW1lCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAk9IC0xLAorCS5yZXNvdXJjZSA9IHNoYXJwc2xfcm9tX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoc2hhcnBzbF9yb21fcmVzb3VyY2VzKSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmc2hhcnBzbF9yb21fZGF0YSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmcG9vZGxlX2xvY29tb19kZXZpY2UsCiAJJnBvb2RsZV9zY29vcF9kZXZpY2UsCisJJnNoYXJwc2xfcm9tX2RldmljZSwKIH07CiAKIHN0YXRpYyB2b2lkIHBvb2RsZV9wb3dlcm9mZih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcHdtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wd20uYwppbmRleCA3NGUyZWFkLi4zY2E3ZmZjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHdtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHdtLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlwd20tPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIlBXTUNMSyIpOworCXB3bS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHB3bS0+Y2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKHB3bS0+Y2xrKTsKIAkJZ290byBlcnJfZnJlZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKaW5kZXggMjVkMTdhMS4uNmM1NzUyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKQEAgLTM2LDEyICszNiw2IEBACiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLWludCBjcHVfaXNfcHhhMjZ4KHZvaWQpCi17Ci0JcmV0dXJuIGNwdV9pc19weGEyNTAoKSAmJiAoKEJPT1RfREVGICYgMHg4KSA9PSAwKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGNwdV9pc19weGEyNngpOwotCiAvKgogICogVmFyaW91cyBjbG9jayBmYWN0b3JzIGRyaXZlbiBieSB0aGUgQ0NDUiByZWdpc3Rlci4KICAqLwpAQCAtMTY3LDM2ICsxNjEsNTEgQEAKICAqIDk1Ljg0Mk1IeiAtPiBNTUMgMTkuMTY5TUh6LCBJMkMgMzEuOTQ5TUh6LCBGSUNQIDQ3LjkyM01IeiwgVVNCIDQ3LjkyM01IegogICogMTQ3LjQ1Nk1IeiAtPiBVQVJUIDE0Ljc0NTZNSHosIEFDOTcgMTIuMjg4TUh6LCBJMlMgNS42NzJNSHogKGFsbGVnZWRseSkKICAqLwotc3RhdGljIHN0cnVjdCBjbGsgcHhhMjV4X2h3dWFydF9jbGsgPQotCUlOSVRfQ0tFTigiVUFSVENMSyIsIEhXVUFSVCwgMTQ3NDU2MDAsIDEsICZweGFfZGV2aWNlX2h3dWFydC5kZXYpCi07CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X2h3dWFydCwgSFdVQVJULCAxNDc0NTYwMCwgMSk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBweGEyNXhfaHd1YXJ0X2Nsa3JlZyA9CisJSU5JVF9DTEtSRUcoJmNsa19weGEyNXhfaHd1YXJ0LCAicHhhMnh4LXVhcnQuMyIsIE5VTEwpOwogCiAvKgogICogUFhBIDJ4eCBjbG9jayBkZWNsYXJhdGlvbnMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIHB4YTI1eF9jbGtzW10gPSB7Ci0JSU5JVF9DSygiTENEQ0xLIiwgTENELCAmY2xrX3B4YTI1eF9sY2Rfb3BzLCAmcHhhX2RldmljZV9mYi5kZXYpLAotCUlOSVRfQ0tFTigiVUFSVENMSyIsIEZGVUFSVCwgMTQ3NDU2MDAsIDEsICZweGFfZGV2aWNlX2ZmdWFydC5kZXYpLAotCUlOSVRfQ0tFTigiVUFSVENMSyIsIEJUVUFSVCwgMTQ3NDU2MDAsIDEsICZweGFfZGV2aWNlX2J0dWFydC5kZXYpLAotCUlOSVRfQ0tFTigiVUFSVENMSyIsIFNUVUFSVCwgMTQ3NDU2MDAsIDEsIE5VTEwpLAotCUlOSVRfQ0tFTigiVURDQ0xLIiwgVVNCLCA0NzkyMzAwMCwgNSwgJnB4YTI1eF9kZXZpY2VfdWRjLmRldiksCi0JSU5JVF9DTEsoIkdQSU8xMV9DTEsiLCAmY2xrX3B4YTI1eF9ncGlvMTFfb3BzLCAzNjg2NDAwLCAwLCBOVUxMKSwKLQlJTklUX0NMSygiR1BJTzEyX0NMSyIsICZjbGtfcHhhMjV4X2dwaW8xMl9vcHMsIDMyNzY4LCAwLCBOVUxMKSwKLQlJTklUX0NLRU4oIk1NQ0NMSyIsIE1NQywgMTkxNjkwMDAsIDAsICZweGFfZGV2aWNlX21jaS5kZXYpLAotCUlOSVRfQ0tFTigiSTJDQ0xLIiwgSTJDLCAzMTk0OTAwMCwgMCwgJnB4YV9kZXZpY2VfaTJjLmRldiksCitzdGF0aWMgREVGSU5FX0NLKHB4YTI1eF9sY2QsIExDRCwgJmNsa19weGEyNXhfbGNkX29wcyk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X2ZmdWFydCwgRkZVQVJULCAxNDc0NTYwMCwgMSk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X2J0dWFydCwgQlRVQVJULCAxNDc0NTYwMCwgMSk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X3N0dWFydCwgU1RVQVJULCAxNDc0NTYwMCwgMSk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X3VzYiwgVVNCLCA0NzkyMzAwMCwgNSk7CitzdGF0aWMgREVGSU5FX0NMSyhweGEyNXhfZ3BpbzExLCAmY2xrX3B4YTI1eF9ncGlvMTFfb3BzLCAzNjg2NDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0xLKHB4YTI1eF9ncGlvMTIsICZjbGtfcHhhMjV4X2dwaW8xMl9vcHMsIDMyNzY4LCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyNXhfbW1jLCBNTUMsIDE5MTY5MDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyNXhfaTJjLCBJMkMsIDMxOTQ5MDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyNXhfc3NwLCBTU1AsIDM2ODY0MDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI1eF9uc3NwLCBOU1NQLCAzNjg2NDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyNXhfYXNzcCwgQVNTUCwgMzY4NjQwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjV4X3B3bTAsIFBXTTAsIDM2ODY0MDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI1eF9wd20xLCBQV00xLCAzNjg2NDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyNXhfYWM5NywgQUM5NywgMjQ1NzYwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI1eF9pMnMsIEkyUywgMTQ3NDU2MDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI1eF9maWNwLCBGSUNQLCA0NzkyMzAwMCwgMCk7CiAKLQlJTklUX0NLRU4oIlNTUENMSyIsICBTU1AsIDM2ODY0MDAsIDAsICZweGEyNXhfZGV2aWNlX3NzcC5kZXYpLAotCUlOSVRfQ0tFTigiU1NQQ0xLIiwgTlNTUCwgMzY4NjQwMCwgMCwgJnB4YTI1eF9kZXZpY2VfbnNzcC5kZXYpLAotCUlOSVRfQ0tFTigiU1NQQ0xLIiwgQVNTUCwgMzY4NjQwMCwgMCwgJnB4YTI1eF9kZXZpY2VfYXNzcC5kZXYpLAotCUlOSVRfQ0tFTigiUFdNQ0xLIiwgUFdNMCwgMzY4NjQwMCwgMCwgJnB4YTI1eF9kZXZpY2VfcHdtMC5kZXYpLAotCUlOSVRfQ0tFTigiUFdNQ0xLIiwgUFdNMSwgMzY4NjQwMCwgMCwgJnB4YTI1eF9kZXZpY2VfcHdtMS5kZXYpLAotCi0JSU5JVF9DS0VOKCJBQzk3Q0xLIiwgICAgIEFDOTcsICAgICAyNDU3NjAwMCwgMCwgTlVMTCksCi0KLQkvKgotCUlOSVRfQ0tFTigiSTJTQ0xLIiwgIEkyUywgIDE0NzQ1NjAwLCAwLCBOVUxMKSwKLQkqLwotCUlOSVRfQ0tFTigiRklDUENMSyIsIEZJQ1AsIDQ3OTIzMDAwLCAwLCBOVUxMKSwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBweGEyNXhfY2xrcmVnc1tdID0geworCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X2xjZCwgInB4YTJ4eC1mYiIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X2ZmdWFydCwgInB4YTJ4eC11YXJ0LjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9idHVhcnQsICJweGEyeHgtdWFydC4xIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyNXhfc3R1YXJ0LCAicHhhMnh4LXVhcnQuMiIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X3VzYiwgInB4YTI1eC11ZGMiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9tbWMsICJweGEyeHgtbWNpLjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9pMmMsICJweGEyeHgtaTJjLjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9zc3AsICJweGEyNXgtc3NwLjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9uc3NwLCAicHhhMjV4LW5zc3AuMSIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X2Fzc3AsICJweGEyNXgtbnNzcC4yIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyNXhfcHdtMCwgInB4YTI1eC1wd20uMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X3B3bTEsICJweGEyNXgtcHdtLjEiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9pMnMsICJweGEyeHgtaTJzIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyNXhfc3R1YXJ0LCAicHhhMnh4LWlyIiwgIlVBUlRDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9maWNwLCAicHhhMnh4LWlyIiwgIkZJQ1BDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9hYzk3LCBOVUxMLCAiQUM5N0NMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjV4X2dwaW8xMSwgTlVMTCwgIkdQSU8xMV9DTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI1eF9ncGlvMTIsIE5VTEwsICJHUElPMTJfQ0xLIiksCiB9OwogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0zMDQsMTMgKzMxMywyMSBAQAogCXB4YV9pbml0X2dwaW8oODUsIHB4YTI1eF9zZXRfd2FrZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ1BVX1BYQTI2eAordm9pZCBfX2luaXQgcHhhMjZ4X2luaXRfaXJxKHZvaWQpCit7CisJcHhhX2luaXRfaXJxKDMyLCBweGEyNXhfc2V0X3dha2UpOworCXB4YV9pbml0X2dwaW8oOTAsIHB4YTI1eF9zZXRfd2FrZSk7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnB4YTI1eF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmcHhhMjV4X2RldmljZV91ZGMsCiAJJnB4YV9kZXZpY2VfZmZ1YXJ0LAogCSZweGFfZGV2aWNlX2J0dWFydCwKIAkmcHhhX2RldmljZV9zdHVhcnQsCiAJJnB4YV9kZXZpY2VfaTJzLAotCSZweGFfZGV2aWNlX3J0YywKKwkmc2ExMTAwX2RldmljZV9ydGMsCiAJJnB4YTI1eF9kZXZpY2Vfc3NwLAogCSZweGEyNXhfZGV2aWNlX25zc3AsCiAJJnB4YTI1eF9kZXZpY2VfYXNzcCwKQEAgLTMzNiw3ICszNTMsNyBAQAogCiAJCXJlc2V0X3N0YXR1cyA9IFJDU1I7CiAKLQkJY2xrc19yZWdpc3RlcihweGEyNXhfY2xrcywgQVJSQVlfU0laRShweGEyNXhfY2xrcykpOworCQljbGtzX3JlZ2lzdGVyKHB4YTI1eF9jbGtyZWdzLCBBUlJBWV9TSVpFKHB4YTI1eF9jbGtyZWdzKSk7CiAKIAkJaWYgKChyZXQgPSBweGFfaW5pdF9kbWEoMTYpKSkKIAkJCXJldHVybiByZXQ7CkBAIC0zNTYsOCArMzczLDggQEAKIAl9CiAKIAkvKiBPbmx5IGFkZCBIV1VBUlQgZm9yIFBYQTI1NS8yNng7IFBYQTIxMC8yNTAgZG8gbm90IGhhdmUgaXQuICovCi0JaWYgKGNwdV9pc19weGEyNTUoKSB8fCBjcHVfaXNfcHhhMjZ4KCkpIHsKLQkJY2xrc19yZWdpc3RlcigmcHhhMjV4X2h3dWFydF9jbGssIDEpOworCWlmIChjcHVfaXNfcHhhMjU1KCkpIHsKKwkJY2xrc19yZWdpc3RlcigmcHhhMjV4X2h3dWFydF9jbGtyZWcsIDEpOwogCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnB4YV9kZXZpY2VfaHd1YXJ0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKaW5kZXggM2U0YWIyMi4uNDExYmVjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKQEAgLTE0NCw0MCArMTQ0LDU5IEBACiAJLmdldHJhdGUJPSBjbGtfcHhhMjd4X2xjZF9nZXRyYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgcHhhMjd4X2Nsa3NbXSA9IHsKLQlJTklUX0NLKCJMQ0RDTEsiLCBMQ0QsICAgICZjbGtfcHhhMjd4X2xjZF9vcHMsICZweGFfZGV2aWNlX2ZiLmRldiksCi0JSU5JVF9DSygiQ0FNQ0xLIiwgQ0FNRVJBLCAmY2xrX3B4YTI3eF9sY2Rfb3BzLCBOVUxMKSwKK3N0YXRpYyBERUZJTkVfQ0socHhhMjd4X2xjZCwgTENELCAmY2xrX3B4YTI3eF9sY2Rfb3BzKTsKK3N0YXRpYyBERUZJTkVfQ0socHhhMjd4X2NhbWVyYSwgQ0FNRVJBLCAmY2xrX3B4YTI3eF9sY2Rfb3BzKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfZmZ1YXJ0LCBGRlVBUlQsIDE0ODU3MDAwLCAxKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfYnR1YXJ0LCBCVFVBUlQsIDE0ODU3MDAwLCAxKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfc3R1YXJ0LCBTVFVBUlQsIDE0ODU3MDAwLCAxKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfaTJzLCBJMlMsIDE0NjgyMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfaTJjLCBJMkMsIDMyODQyMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfdXNiLCBVU0IsIDQ4MDAwMDAwLCA1KTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfbW1jLCBNTUMsIDE5NTAwMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfZmljcCwgRklDUCwgNDgwMDAwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI3eF91c2Job3N0LCBVU0JIT1NULCA0ODAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X3B3cmkyYywgUFdSSTJDLCAxMzAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X2tleXBhZCwgS0VZUEFELCAzMjc2OCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X3NzcDEsIFNTUDEsIDEzMDAwMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfc3NwMiwgU1NQMiwgMTMwMDAwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI3eF9zc3AzLCBTU1AzLCAxMzAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X3B3bTAsIFBXTTAsIDEzMDAwMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfQ0tFTihweGEyN3hfcHdtMSwgUFdNMSwgMTMwMDAwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI3eF9hYzk3LCBBQzk3LCAyNDU3NjAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X2FjOTdjb25mLCBBQzk3Q09ORiwgMjQ1NzYwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI3eF9tc2wsIE1TTCwgNDgwMDAwMDAsIDApOworc3RhdGljIERFRklORV9DS0VOKHB4YTI3eF91c2ltLCBVU0lNLCA0ODAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X21lbXN0aywgTUVNU1RLLCAxOTUwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X2ltLCBJTSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX0NLRU4ocHhhMjd4X21lbWMsIE1FTUMsIDAsIDApOwogCi0JSU5JVF9DS0VOKCJVQVJUQ0xLIiwgRkZVQVJULCAxNDg1NzAwMCwgMSwgJnB4YV9kZXZpY2VfZmZ1YXJ0LmRldiksCi0JSU5JVF9DS0VOKCJVQVJUQ0xLIiwgQlRVQVJULCAxNDg1NzAwMCwgMSwgJnB4YV9kZXZpY2VfYnR1YXJ0LmRldiksCi0JSU5JVF9DS0VOKCJVQVJUQ0xLIiwgU1RVQVJULCAxNDg1NzAwMCwgMSwgTlVMTCksCi0KLQlJTklUX0NLRU4oIkkyU0NMSyIsICBJMlMsICAxNDY4MjAwMCwgMCwgJnB4YV9kZXZpY2VfaTJzLmRldiksCi0JSU5JVF9DS0VOKCJJMkNDTEsiLCAgSTJDLCAgMzI4NDIwMDAsIDAsICZweGFfZGV2aWNlX2kyYy5kZXYpLAotCUlOSVRfQ0tFTigiVURDQ0xLIiwgIFVTQiwgIDQ4MDAwMDAwLCA1LCAmcHhhMjd4X2RldmljZV91ZGMuZGV2KSwKLQlJTklUX0NLRU4oIk1NQ0NMSyIsICBNTUMsICAxOTUwMDAwMCwgMCwgJnB4YV9kZXZpY2VfbWNpLmRldiksCi0JSU5JVF9DS0VOKCJGSUNQQ0xLIiwgRklDUCwgNDgwMDAwMDAsIDAsICZweGFfZGV2aWNlX2ZpY3AuZGV2KSwKLQotCUlOSVRfQ0tFTigiVVNCQ0xLIiwgVVNCSE9TVCwgNDgwMDAwMDAsIDAsICZweGEyN3hfZGV2aWNlX29oY2kuZGV2KSwKLQlJTklUX0NLRU4oIkkyQ0NMSyIsIFBXUkkyQywgMTMwMDAwMDAsIDAsICZweGEyN3hfZGV2aWNlX2kyY19wb3dlci5kZXYpLAotCUlOSVRfQ0tFTigiS0JEQ0xLIiwgS0VZUEFELCAzMjc2OCwgMCwgJnB4YTI3eF9kZXZpY2Vfa2V5cGFkLmRldiksCi0KLQlJTklUX0NLRU4oIlNTUENMSyIsIFNTUDEsIDEzMDAwMDAwLCAwLCAmcHhhMjd4X2RldmljZV9zc3AxLmRldiksCi0JSU5JVF9DS0VOKCJTU1BDTEsiLCBTU1AyLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2Vfc3NwMi5kZXYpLAotCUlOSVRfQ0tFTigiU1NQQ0xLIiwgU1NQMywgMTMwMDAwMDAsIDAsICZweGEyN3hfZGV2aWNlX3NzcDMuZGV2KSwKLQlJTklUX0NLRU4oIlBXTUNMSyIsIFBXTTAsIDEzMDAwMDAwLCAwLCAmcHhhMjd4X2RldmljZV9wd20wLmRldiksCi0JSU5JVF9DS0VOKCJQV01DTEsiLCBQV00xLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2VfcHdtMS5kZXYpLAotCi0JSU5JVF9DS0VOKCJBQzk3Q0xLIiwgICAgIEFDOTcsICAgICAyNDU3NjAwMCwgMCwgTlVMTCksCi0JSU5JVF9DS0VOKCJBQzk3Q09ORkNMSyIsIEFDOTdDT05GLCAyNDU3NjAwMCwgMCwgTlVMTCksCi0KLQkvKgotCUlOSVRfQ0tFTigiTVNMQ0xLIiwgIE1TTCwgIDQ4MDAwMDAwLCAwLCBOVUxMKSwKLQlJTklUX0NLRU4oIlVTSU1DTEsiLCBVU0lNLCA0ODAwMDAwMCwgMCwgTlVMTCksCi0JSU5JVF9DS0VOKCJNU1RLQ0xLIiwgTUVNU1RLLCAxOTUwMDAwMCwgMCwgTlVMTCksCi0JSU5JVF9DS0VOKCJJTUNMSyIsICAgSU0sICAgMCwgMCwgTlVMTCksCi0JSU5JVF9DS0VOKCJNRU1DTEsiLCAgTUVNQywgMCwgMCwgTlVMTCksCi0JKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBweGEyN3hfY2xrcmVnc1tdID0geworCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X2xjZCwgInB4YTJ4eC1mYiIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X2NhbWVyYSwgInB4YTI3eC1jYW1lcmEuMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X2ZmdWFydCwgInB4YTJ4eC11YXJ0LjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9idHVhcnQsICJweGEyeHgtdWFydC4xIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfc3R1YXJ0LCAicHhhMnh4LXVhcnQuMiIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X2kycywgInB4YTJ4eC1pMnMiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9pMmMsICJweGEyeHgtaTJjLjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF91c2IsICJweGEyN3gtdWRjIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfbW1jLCAicHhhMnh4LW1jaS4wIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfc3R1YXJ0LCAicHhhMnh4LWlyIiwgIlVBUlRDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9maWNwLCAicHhhMnh4LWlyIiwgIkZJQ1BDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF91c2Job3N0LCAicHhhMjd4LW9oY2kiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9wd3JpMmMsICJweGEyeHgtaTJjLjEiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9rZXlwYWQsICJweGEyN3gta2V5cGFkIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfc3NwMSwgInB4YTI3eC1zc3AuMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X3NzcDIsICJweGEyN3gtc3NwLjEiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9zc3AzLCAicHhhMjd4LXNzcC4yIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfcHdtMCwgInB4YTI3eC1wd20uMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X3B3bTEsICJweGEyN3gtcHdtLjEiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9hYzk3LCBOVUxMLCAiQUM5N0NMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X2FjOTdjb25mLCBOVUxMLCAiQUM5N0NPTkZDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9tc2wsIE5VTEwsICJNU0xDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF91c2ltLCBOVUxMLCAiVVNJTUNMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMjd4X21lbXN0aywgTlVMTCwgIk1TVEtDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTI3eF9pbSwgTlVMTCwgIklNQ0xLIiksCisJSU5JVF9DTEtSRUcoJmNsa19weGEyN3hfbWVtYywgTlVMTCwgIk1FTUNMSyIpLAogfTsKIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMzEzLDM4ICszMzIsMTggQEAKIHZvaWQgX19pbml0IHB4YTI3eF9pbml0X2lycSh2b2lkKQogewogCXB4YV9pbml0X2lycSgzNCwgcHhhMjd4X3NldF93YWtlKTsKLQlweGFfaW5pdF9ncGlvKDEyOCwgcHhhMjd4X3NldF93YWtlKTsKKwlweGFfaW5pdF9ncGlvKDEyMSwgcHhhMjd4X3NldF93YWtlKTsKIH0KIAogLyoKICAqIGRldmljZSByZWdpc3RyYXRpb24gc3BlY2lmaWMgdG8gUFhBMjd4LgogICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Bvd2VyX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gMHg0MGYwMDE4MCwKLQkJLmVuZAk9IDB4NDBmMDAxYTMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0CT0gSVJRX1BXUkkyQywKLQkJLmVuZAk9IElSUV9QV1JJMkMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHB4YTI3eF9kZXZpY2VfaTJjX3Bvd2VyID0gewotCS5uYW1lCQk9ICJweGEyeHgtaTJjIiwKLQkuaWQJCT0gMSwKLQkucmVzb3VyY2UJPSBpMmNfcG93ZXJfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpMmNfcG93ZXJfcmVzb3VyY2VzKSwKLX07Ci0KIHZvaWQgX19pbml0IHB4YTI3eF9zZXRfaTJjX3Bvd2VyX2luZm8oc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSAqaW5mbykKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCVBDRlIgfD0gUENGUl9QSTJDRU47CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotCXB4YTI3eF9kZXZpY2VfaTJjX3Bvd2VyLmRldi5wbGF0Zm9ybV9kYXRhID0gaW5mbzsKKwlweGFfcmVnaXN0ZXJfZGV2aWNlKCZweGEyN3hfZGV2aWNlX2kyY19wb3dlciwgaW5mbyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKQEAgLTM1Myw4ICszNTIsOCBAQAogCSZweGFfZGV2aWNlX2J0dWFydCwKIAkmcHhhX2RldmljZV9zdHVhcnQsCiAJJnB4YV9kZXZpY2VfaTJzLAorCSZzYTExMDBfZGV2aWNlX3J0YywKIAkmcHhhX2RldmljZV9ydGMsCi0JJnB4YTI3eF9kZXZpY2VfaTJjX3Bvd2VyLAogCSZweGEyN3hfZGV2aWNlX3NzcDEsCiAJJnB4YTI3eF9kZXZpY2Vfc3NwMiwKIAkmcHhhMjd4X2RldmljZV9zc3AzLApAQCAtMzgwLDcgKzM3OSw3IEBACiAKIAkJcmVzZXRfc3RhdHVzID0gUkNTUjsKIAotCQljbGtzX3JlZ2lzdGVyKHB4YTI3eF9jbGtzLCBBUlJBWV9TSVpFKHB4YTI3eF9jbGtzKSk7CisJCWNsa3NfcmVnaXN0ZXIocHhhMjd4X2Nsa3JlZ3MsIEFSUkFZX1NJWkUocHhhMjd4X2Nsa3JlZ3MpKTsKIAogCQlpZiAoKHJldCA9IHB4YV9pbml0X2RtYSgzMikpKQogCQkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzAwLmMKaW5kZXggOWFkYzdmYy4uZjczNWU1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzAwLmMKQEAgLTg1LDE0ICs4NSwxNiBAQAogCU1GUF9BRERSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvbW1vbl9jbGtzW10gPSB7Ci0JUFhBM3h4X0NLRU4oIk5BTkRDTEsiLCBOQU5ELCAxNTYwMDAwMDAsIDAsICZweGEzeHhfZGV2aWNlX25hbmQuZGV2KSwKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKGNvbW1vbl9uYW5kLCBOQU5ELCAxNTYwMDAwMDAsIDApOworCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgY29tbW9uX2Nsa3JlZ3NbXSA9IHsKKwlJTklUX0NMS1JFRygmY2xrX2NvbW1vbl9uYW5kLCAicHhhM3h4LW5hbmQiLCAiTkFORENMSyIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgcHhhMzEwX2Nsa3NbXSA9IHsKLSNpZmRlZiBDT05GSUdfQ1BVX1BYQTMxMAotCVBYQTN4eF9DS0VOKCJNTUNDTEsiLCBNTUMzLCAxOTUwMDAwMCwgMCwgJnB4YTN4eF9kZXZpY2VfbWNpMy5kZXYpLAotI2VuZGlmCitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzMTBfbW1jMywgTU1DMywgMTk1MDAwMDAsIDApOworCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcHhhMzEwX2Nsa3JlZ3NbXSA9IHsKKwlJTklUX0NMS1JFRygmY2xrX3B4YTMxMF9tbWMzLCAicHhhMnh4LW1jaS4yIiwgIk1NQ0NMSyIpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHhhMzAwX2luaXQodm9pZCkKQEAgLTEwMCwxMiArMTAyLDEyIEBACiAJaWYgKGNwdV9pc19weGEzMDAoKSB8fCBjcHVfaXNfcHhhMzEwKCkpIHsKIAkJcHhhM3h4X2luaXRfbWZwKCk7CiAJCXB4YTN4eF9tZnBfaW5pdF9hZGRyKHB4YTMwMF9tZnBfYWRkcl9tYXApOwotCQljbGtzX3JlZ2lzdGVyKEFSUkFZX0FORF9TSVpFKGNvbW1vbl9jbGtzKSk7CisJCWNsa3NfcmVnaXN0ZXIoQVJSQVlfQU5EX1NJWkUoY29tbW9uX2Nsa3JlZ3MpKTsKIAl9CiAKIAlpZiAoY3B1X2lzX3B4YTMxMCgpKSB7CiAJCXB4YTN4eF9tZnBfaW5pdF9hZGRyKHB4YTMxMF9tZnBfYWRkcl9tYXApOwotCQljbGtzX3JlZ2lzdGVyKEFSUkFZX0FORF9TSVpFKHB4YTMxMF9jbGtzKSk7CisJCWNsa3NfcmVnaXN0ZXIoQVJSQVlfQU5EX1NJWkUocHhhMzEwX2Nsa3JlZ3MpKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTMyMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzIwLmMKaW5kZXggMDE2ZWIxOC4uZWZmZTQwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMzIwLmMKQEAgLTgwLDggKzgwLDEwIEBACiAJTUZQX0FERFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgcHhhMzIwX2Nsa3NbXSA9IHsKLQlQWEEzeHhfQ0tFTigiTkFORENMSyIsIE5BTkQsIDEwNDAwMDAwMCwgMCwgJnB4YTN4eF9kZXZpY2VfbmFuZC5kZXYpLAorc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhMzIwX25hbmQsIE5BTkQsIDEwNDAwMDAwMCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBweGEzMjBfY2xrcmVnc1tdID0geworCUlOSVRfQ0xLUkVHKCZjbGtfcHhhMzIwX25hbmQsICJweGEzeHgtbmFuZCIsICJOQU5EQ0xLIiksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBweGEzMjBfaW5pdCh2b2lkKQpAQCAtODksNyArOTEsNyBAQAogCWlmIChjcHVfaXNfcHhhMzIwKCkpIHsKIAkJcHhhM3h4X2luaXRfbWZwKCk7CiAJCXB4YTN4eF9tZnBfaW5pdF9hZGRyKHB4YTMyMF9tZnBfYWRkcl9tYXApOwotCQljbGtzX3JlZ2lzdGVyKEFSUkFZX0FORF9TSVpFKHB4YTMyMF9jbGtzKSk7CisJCWNsa3NfcmVnaXN0ZXIoQVJSQVlfQU5EX1NJWkUocHhhMzIwX2Nsa3JlZ3MpKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKaW5kZXggYjNjZDVkMC4uNDkwODkzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL3BtLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL3NzcC5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiZGV2aWNlcy5oIgpAQCAtMjE2LDQzICsyMTcsNTggQEAKIAkuZGlzYWJsZQk9IGNsa19kdW1teV9kaXNhYmxlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgcHhhM3h4X2Nsa3NbXSA9IHsKLQl7Ci0JCS5uYW1lICAgICAgICAgICA9ICJDTEtfUE9VVCIsCi0JCS5vcHMgICAgICAgICAgICA9ICZjbGtfcG91dF9vcHMsCi0JCS5yYXRlICAgICAgICAgICA9IDEzMDAwMDAwLAotCQkuZGVsYXkgICAgICAgICAgPSA3MCwKLQl9LAorc3RhdGljIHN0cnVjdCBjbGsgY2xrX3B4YTN4eF9wb3V0ID0geworCS5vcHMJCT0gJmNsa19wb3V0X29wcywKKwkucmF0ZQkJPSAxMzAwMDAwMCwKKwkuZGVsYXkJCT0gNzAsCit9OwogCitzdGF0aWMgc3RydWN0IGNsayBjbGtfZHVtbXkgPSB7CisJLm9wcwkJPSAmY2xrX2R1bW15X29wcywKK307CisKK3N0YXRpYyBERUZJTkVfUFhBM19DSyhweGEzeHhfbGNkLCBMQ0QsICZjbGtfcHhhM3h4X2hzaW9fb3BzKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DSyhweGEzeHhfY2FtZXJhLCBDQU1FUkEsICZjbGtfcHhhM3h4X2hzaW9fb3BzKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DSyhweGEzeHhfYWM5NywgQUM5NywgJmNsa19weGEzeHhfYWM5N19vcHMpOworc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhM3h4X2ZmdWFydCwgRkZVQVJULCAxNDg1NzAwMCwgMSk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfYnR1YXJ0LCBCVFVBUlQsIDE0ODU3MDAwLCAxKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTN4eF9zdHVhcnQsIFNUVUFSVCwgMTQ4NTcwMDAsIDEpOworc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhM3h4X2kyYywgSTJDLCAzMjg0MjAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfdWRjLCBVREMsIDQ4MDAwMDAwLCA1KTsKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTN4eF91c2JoLCBVU0JILCA0ODAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfa2V5cGFkLCBLRVlQQUQsIDMyNzY4LCAwKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTN4eF9zc3AxLCBTU1AxLCAxMzAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfc3NwMiwgU1NQMiwgMTMwMDAwMDAsIDApOworc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhM3h4X3NzcDMsIFNTUDMsIDEzMDAwMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTN4eF9zc3A0LCBTU1A0LCAxMzAwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfcHdtMCwgUFdNMCwgMTMwMDAwMDAsIDApOworc3RhdGljIERFRklORV9QWEEzX0NLRU4ocHhhM3h4X3B3bTEsIFBXTTEsIDEzMDAwMDAwLCAwKTsKK3N0YXRpYyBERUZJTkVfUFhBM19DS0VOKHB4YTN4eF9tbWMxLCBNTUMxLCAxOTUwMDAwMCwgMCk7CitzdGF0aWMgREVGSU5FX1BYQTNfQ0tFTihweGEzeHhfbW1jMiwgTU1DMiwgMTk1MDAwMDAsIDApOworCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgcHhhM3h4X2Nsa3JlZ3NbXSA9IHsKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9wb3V0LCBOVUxMLCAiQ0xLX1BPVVQiKSwKIAkvKiBQb3dlciBJMkMgY2xvY2sgaXMgYWx3YXlzIG9uICovCi0JewotCQkubmFtZQkJPSAiSTJDQ0xLIiwKLQkJLm9wcwkJPSAmY2xrX2R1bW15X29wcywKLQkJLmRldgkJPSAmcHhhM3h4X2RldmljZV9pMmNfcG93ZXIuZGV2LAotCX0sCi0KLQlQWEEzeHhfQ0soIkxDRENMSyIsICBMQ0QsICAgICZjbGtfcHhhM3h4X2hzaW9fb3BzLCAmcHhhX2RldmljZV9mYi5kZXYpLAotCVBYQTN4eF9DSygiQ0FNQ0xLIiwgIENBTUVSQSwgJmNsa19weGEzeHhfaHNpb19vcHMsIE5VTEwpLAotCVBYQTN4eF9DSygiQUM5N0NMSyIsIEFDOTcsICAgJmNsa19weGEzeHhfYWM5N19vcHMsIE5VTEwpLAotCi0JUFhBM3h4X0NLRU4oIlVBUlRDTEsiLCBGRlVBUlQsIDE0ODU3MDAwLCAxLCAmcHhhX2RldmljZV9mZnVhcnQuZGV2KSwKLQlQWEEzeHhfQ0tFTigiVUFSVENMSyIsIEJUVUFSVCwgMTQ4NTcwMDAsIDEsICZweGFfZGV2aWNlX2J0dWFydC5kZXYpLAotCVBYQTN4eF9DS0VOKCJVQVJUQ0xLIiwgU1RVQVJULCAxNDg1NzAwMCwgMSwgTlVMTCksCi0KLQlQWEEzeHhfQ0tFTigiSTJDQ0xLIiwgSTJDLCAgMzI4NDIwMDAsIDAsICZweGFfZGV2aWNlX2kyYy5kZXYpLAotCVBYQTN4eF9DS0VOKCJVRENDTEsiLCBVREMsICA0ODAwMDAwMCwgNSwgJnB4YTI3eF9kZXZpY2VfdWRjLmRldiksCi0JUFhBM3h4X0NLRU4oIlVTQkNMSyIsIFVTQkgsIDQ4MDAwMDAwLCAwLCAmcHhhMjd4X2RldmljZV9vaGNpLmRldiksCi0JUFhBM3h4X0NLRU4oIktCRENMSyIsIEtFWVBBRCwgIDMyNzY4LCAwLCAmcHhhMjd4X2RldmljZV9rZXlwYWQuZGV2KSwKLQotCVBYQTN4eF9DS0VOKCJTU1BDTEsiLCBTU1AxLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2Vfc3NwMS5kZXYpLAotCVBYQTN4eF9DS0VOKCJTU1BDTEsiLCBTU1AyLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2Vfc3NwMi5kZXYpLAotCVBYQTN4eF9DS0VOKCJTU1BDTEsiLCBTU1AzLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2Vfc3NwMy5kZXYpLAotCVBYQTN4eF9DS0VOKCJTU1BDTEsiLCBTU1A0LCAxMzAwMDAwMCwgMCwgJnB4YTN4eF9kZXZpY2Vfc3NwNC5kZXYpLAotCVBYQTN4eF9DS0VOKCJQV01DTEsiLCBQV00wLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2VfcHdtMC5kZXYpLAotCVBYQTN4eF9DS0VOKCJQV01DTEsiLCBQV00xLCAxMzAwMDAwMCwgMCwgJnB4YTI3eF9kZXZpY2VfcHdtMS5kZXYpLAotCi0JUFhBM3h4X0NLRU4oIk1NQ0NMSyIsIE1NQzEsIDE5NTAwMDAwLCAwLCAmcHhhX2RldmljZV9tY2kuZGV2KSwKLQlQWEEzeHhfQ0tFTigiTU1DQ0xLIiwgTU1DMiwgMTk1MDAwMDAsIDAsICZweGEzeHhfZGV2aWNlX21jaTIuZGV2KSwKKwlJTklUX0NMS1JFRygmY2xrX2R1bW15LCAicHhhMnh4LWkyYy4xIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfbGNkLCAicHhhMnh4LWZiIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfY2FtZXJhLCBOVUxMLCAiQ0FNQ0xLIiksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfYWM5NywgTlVMTCwgIkFDOTdDTEsiKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9mZnVhcnQsICJweGEyeHgtdWFydC4wIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfYnR1YXJ0LCAicHhhMnh4LXVhcnQuMSIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X3N0dWFydCwgInB4YTJ4eC11YXJ0LjIiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9zdHVhcnQsICJweGEyeHgtaXIiLCAiVUFSVENMSyIpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X2kyYywgInB4YTJ4eC1pMmMuMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X3VkYywgInB4YTI3eC11ZGMiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF91c2JoLCAicHhhMjd4LW9oY2kiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9rZXlwYWQsICJweGEyN3gta2V5cGFkIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfc3NwMSwgInB4YTI3eC1zc3AuMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X3NzcDIsICJweGEyN3gtc3NwLjEiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9zc3AzLCAicHhhMjd4LXNzcC4yIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfc3NwNCwgInB4YTI3eC1zc3AuMyIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X3B3bTAsICJweGEyN3gtcHdtLjAiLCBOVUxMKSwKKwlJTklUX0NMS1JFRygmY2xrX3B4YTN4eF9wd20xLCAicHhhMjd4LXB3bS4xIiwgTlVMTCksCisJSU5JVF9DTEtSRUcoJmNsa19weGEzeHhfbW1jMSwgInB4YTJ4eC1tY2kuMCIsIE5VTEwpLAorCUlOSVRfQ0xLUkVHKCZjbGtfcHhhM3h4X21tYzIsICJweGEyeHgtbWNpLjEiLCBOVUxMKSwKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTUyOSwyOCArNTQ1LDkgQEAKICAqIGRldmljZSByZWdpc3RyYXRpb24gc3BlY2lmaWMgdG8gUFhBM3h4LgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Bvd2VyX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ICA9IDB4NDBmNTAwYzAsCi0JCS5lbmQgICAgPSAweDQwZjUwMGQzLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9QV1JJMkMsCi0JCS5lbmQJPSBJUlFfUFdSSTJDLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX2kyY19wb3dlciA9IHsKLQkubmFtZQkJPSAicHhhMnh4LWkyYyIsCi0JLmlkCQk9IDEsCi0JLnJlc291cmNlCT0gaTJjX3Bvd2VyX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaTJjX3Bvd2VyX3Jlc291cmNlcyksCi19OwotCiB2b2lkIF9faW5pdCBweGEzeHhfc2V0X2kyY19wb3dlcl9pbmZvKHN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKmluZm8pCiB7Ci0JcHhhM3h4X2RldmljZV9pMmNfcG93ZXIuZGV2LnBsYXRmb3JtX2RhdGEgPSBpbmZvOworCXB4YV9yZWdpc3Rlcl9kZXZpY2UoJnB4YTN4eF9kZXZpY2VfaTJjX3Bvd2VyLCBpbmZvKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewpAQCAtNTU5LDYgKzU1Niw3IEBACiAJJnB4YV9kZXZpY2VfYnR1YXJ0LAogCSZweGFfZGV2aWNlX3N0dWFydCwKIAkmcHhhX2RldmljZV9pMnMsCisJJnNhMTEwMF9kZXZpY2VfcnRjLAogCSZweGFfZGV2aWNlX3J0YywKIAkmcHhhMjd4X2RldmljZV9zc3AxLAogCSZweGEyN3hfZGV2aWNlX3NzcDIsCkBAIC01NjYsNyArNTY0LDYgQEAKIAkmcHhhM3h4X2RldmljZV9zc3A0LAogCSZweGEyN3hfZGV2aWNlX3B3bTAsCiAJJnB4YTI3eF9kZXZpY2VfcHdtMSwKLQkmcHhhM3h4X2RldmljZV9pMmNfcG93ZXIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgcHhhM3h4X3N5c2RldltdID0gewpAQCAtNTk1LDcgKzU5Miw3IEBACiAJCSAqLwogCQlBU0NSICY9IH4oQVNDUl9SREggfCBBU0NSX0QxUyB8IEFTQ1JfRDJTIHwgQVNDUl9EM1MpOwogCi0JCWNsa3NfcmVnaXN0ZXIocHhhM3h4X2Nsa3MsIEFSUkFZX1NJWkUocHhhM3h4X2Nsa3MpKTsKKwkJY2xrc19yZWdpc3RlcihweGEzeHhfY2xrcmVncywgQVJSQVlfU0laRShweGEzeHhfY2xrcmVncykpOwogCiAJCWlmICgocmV0ID0gcHhhX2luaXRfZG1hKDMyKSkpCiAJCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jCmluZGV4IGU3ZWE5MWMuLjVkMDJhNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zYWFyLmMKQEAgLTE3LDE5ICsxNyw0NCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhM3h4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGE5MzAuaD4KKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCisjZGVmaW5lIEdQSU9fTENEX1JFU0VUCSgxNikKKwogLyogU0FBUiBNRlAgY29uZmlndXJhdGlvbnMgKi8KIHN0YXRpYyBtZnBfY2ZnX3Qgc2Fhcl9tZnBfY2ZnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBMQ0QgKi8KKwlHUElPMjNfTENEX0REMCwKKwlHUElPMjRfTENEX0REMSwKKwlHUElPMjVfTENEX0REMiwKKwlHUElPMjZfTENEX0REMywKKwlHUElPMjdfTENEX0RENCwKKwlHUElPMjhfTENEX0RENSwKKwlHUElPMjlfTENEX0RENiwKKwlHUElPNDRfTENEX0RENywKKwlHUElPMjFfTENEX0NTLAorCUdQSU8yMl9MQ0RfVlNZTkMsCisJR1BJTzE3X0xDRF9GQ0xLX1JELAorCUdQSU8xOF9MQ0RfTENMS19BMCwKKwlHUElPMTlfTENEX1BDTEtfV1IsCisJR1BJTzE2X0dQSU8sIC8qIExDRCByZXNldCAqLworCiAJLyogRXRoZXJuZXQgKi8KIAlERl9uQ1MxX25DUzMsCiAJR1BJTzk3X0dQSU8sCkBAIC02NCwxMiArODksNDA4IEBACiAJfSwKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QWEEpIHx8IChDT05GSUdfRkJfUFhBX01PRFVMRSkKK3N0YXRpYyB1aW50MTZfdCBsY2RfcG93ZXJfb25bXSA9IHsKKwkvKiBzaW5nbGUgZnJhbWUgKi8KKwlTTUFSVF9DTURfTk9PUCwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREVMQVkoMCksCisKKwlTTUFSVF9DTURfTk9PUCwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREVMQVkoMCksCisKKwlTTUFSVF9DTURfTk9PUCwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREVMQVkoMCksCisKKwlTTUFSVF9DTURfTk9PUCwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREVMQVkoMTApLAorCisJLyogY2FsaWJyYXRpb24gY29udHJvbCAqLworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHhBNCksCisJU01BUlRfREFUKDB4ODApLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9ERUxBWSgxNTApLAorCisJLypQb3dlci1PbiBJbml0IHNlcXVlbmNlKi8KKwlTTUFSVF9DTUQoMHgwMCksCS8qIG91dHB1dCBjdHJsICovCisJU01BUlRfQ01EKDB4MDEpLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLAkvKiB3YXZlIGN0cmwgKi8KKwlTTUFSVF9DTUQoMHgwMiksCisJU01BUlRfREFUKDB4MDcpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDMpLAkvKiBlbnRyeSBtb2RlICovCisJU01BUlRfREFUKDB4RDApLAorCVNNQVJUX0RBVCgweDMwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDgpLAkvKiBkaXNwbGF5IGN0cmwgMiAqLworCVNNQVJUX0RBVCgweDA4KSwKKwlTTUFSVF9EQVQoMHgwOCksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDA5KSwJLyogZGlzcGxheSBjdHJsIDMgKi8KKwlTTUFSVF9EQVQoMHgwNCksCisJU01BUlRfREFUKDB4MkYpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwQSksCS8qIGRpc3BsYXkgY3RybCA0ICovCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDA4KSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MEQpLAkvKiBGcmFtZSBNYXJrZXIgcG9zaXRpb24gKi8KKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDgpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHg2MCksCS8qIERyaXZlciBvdXRwdXQgY29udHJvbCAqLworCVNNQVJUX0RBVCgweDI3KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDYxKSwJLyogQmFzZSBpbWFnZSBkaXNwbGF5IGNvbnRyb2wgKi8KKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgzMCksCS8qIFkgc2V0dGluZ3MgMzBoLTNEaCAqLworCVNNQVJUX0RBVCgweDA3KSwKKwlTTUFSVF9EQVQoMHgwNyksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDMxKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDcpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgzMiksCS8qIFRpbWluZygzKSwgQVNXIEhPTEQ9MC41Q0xLICovCisJU01BUlRfREFUKDB4MDQpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MzMpLAkvKiBUaW1pbmcoNCksIENLViBTVD0wQ0xLLCBDS1YgRUQ9MUNMSyAqLworCVNNQVJUX0RBVCgweDAzKSwKKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDM0KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgzNSksCisJU01BUlRfREFUKDB4MDIpLAorCVNNQVJUX0RBVCgweDA1KSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MzYpLAorCVNNQVJUX0RBVCgweDFGKSwKKwlTTUFSVF9EQVQoMHgxRiksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDM3KSwKKwlTTUFSVF9EQVQoMHgwNyksCisJU01BUlRfREFUKDB4MDcpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgzOCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDA3KSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MzkpLAorCVNNQVJUX0RBVCgweDA0KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDNBKSwKKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfREFUKDB4MDMpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgzQiksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4M0MpLAorCVNNQVJUX0RBVCgweDAyKSwKKwlTTUFSVF9EQVQoMHgwNSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDNEKSwKKwlTTUFSVF9EQVQoMHgxRiksCisJU01BUlRfREFUKDB4MUYpLAorCVNNQVJUX0NNRCgweDAwKSwJLyogRGlzcGxheSBjb250cm9sIDEgKi8KKwlTTUFSVF9DTUQoMHgwNyksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMCksCS8qIFBvd2VyIGNvbnRyb2wgNSAqLworCVNNQVJUX0NNRCgweDE3KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0NNRCgweDAwKSwJLyogUG93ZXIgY29udHJvbCAxICovCisJU01BUlRfQ01EKDB4MTApLAorCVNNQVJUX0RBVCgweDEwKSwKKwlTTUFSVF9EQVQoMHhCMCksCisJU01BUlRfQ01EKDB4MDApLAkvKiBQb3dlciBjb250cm9sIDIgKi8KKwlTTUFSVF9DTUQoMHgxMSksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0RBVCgweDMwKSwKKwlTTUFSVF9DTUQoMHgwMCksCS8qIFBvd2VyIGNvbnRyb2wgMyAqLworCVNNQVJUX0NNRCgweDEyKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4OUUpLAorCVNNQVJUX0NNRCgweDAwKSwJLyogUG93ZXIgY29udHJvbCA0ICovCisJU01BUlRfQ01EKDB4MTMpLAorCVNNQVJUX0RBVCgweDE3KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLAkvKiBQb3dlciBjb250cm9sIDMgKi8KKwlTTUFSVF9DTUQoMHgxMiksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0RBVCgweEJFKSwKKwlTTUFSVF9ERUxBWSgxMDApLAorCisJLyogZGlzcGxheSBtb2RlIDogMjQwKjMyMCAqLworCVNNQVJUX0NNRCgweDAwKSwJLyogUkFNIGFkZHJlc3Mgc2V0KEgpIDAqLworCVNNQVJUX0NNRCgweDIwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAwKSwJLyogUkFNIGFkZHJlc3Mgc2V0KFYpICAgNCovCisJU01BUlRfQ01EKDB4MjEpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLAkvKiBTdGFydCBvZiBXaW5kb3cgUkFNIGFkZHJlc3Mgc2V0KEgpIDgqLworCVNNQVJUX0NNRCgweDUwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAwKSwgCS8qIEVuZCBvZiBXaW5kb3cgUkFNIGFkZHJlc3Mgc2V0KEgpIDEyKi8KKwlTTUFSVF9DTUQoMHg1MSksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweEVGKSwKKwlTTUFSVF9DTUQoMHgwMCksCS8qIFN0YXJ0IG9mIFdpbmRvdyBSQU0gYWRkcmVzcyBzZXQoVikgMTYqLworCVNNQVJUX0NNRCgweDUyKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAwKSwJLyogRW5kIG9mIFdpbmRvdyBSQU0gYWRkcmVzcyBzZXQoVikgMjAqLworCVNNQVJUX0NNRCgweDUzKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4M0YpLAorCVNNQVJUX0NNRCgweDAwKSwgCS8qIFBhbmVsIGludGVyZmFjZSBjb250cm9sIDEgKi8KKwlTTUFSVF9DTUQoMHg5MCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDFBKSwKKwlTTUFSVF9DTUQoMHgwMCksIAkvKiBQYW5lbCBpbnRlcmZhY2UgY29udHJvbCAyICovCisJU01BUlRfQ01EKDB4OTIpLAorCVNNQVJUX0RBVCgweDA0KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLCAJLyogUGFuZWwgaW50ZXJmYWNlIGNvbnRyb2wgMyAqLworCVNNQVJUX0NNRCgweDkzKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDUpLAorCVNNQVJUX0RFTEFZKDIwKSwKK307CisKK3N0YXRpYyB1aW50MTZfdCBsY2RfcGFuZWxfb25bXSA9IHsKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDcpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgyMSksCisJU01BUlRfREVMQVkoMSksCisKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDcpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHg2MSksCisJU01BUlRfREVMQVkoMTAwKSwKKworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwNyksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0RBVCgweDczKSwKKwlTTUFSVF9ERUxBWSgxKSwKK307CisKK3N0YXRpYyB1aW50MTZfdCBsY2RfcGFuZWxfb2ZmW10gPSB7CisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDA3KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4NzIpLAorCVNNQVJUX0RFTEFZKDQwKSwKKworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwNyksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9ERUxBWSgxKSwKKworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwNyksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9ERUxBWSgxKSwKK307CisKK3N0YXRpYyB1aW50MTZfdCBsY2RfcG93ZXJfb2ZmW10gPSB7CisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDEwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4ODApLAorCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDExKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4NjApLAorCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDEyKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4QUUpLAorCVNNQVJUX0RFTEFZKDQwKSwKKworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgxMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKK307CisKK3N0YXRpYyB1aW50MTZfdCB1cGRhdGVfZnJhbWVkYXRhW10gPSB7CisJLyogc2V0IGRpc3BsYXkgcmFtOiAyNDAqMzIwICovCisJU01BUlRfQ01EKDB4MDApLCAvKiBSQU0gYWRkcmVzcyBzZXQoSCkgMCovCisJU01BUlRfQ01EKDB4MjApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLCAvKiBSQU0gYWRkcmVzcyBzZXQoVikgNCovCisJU01BUlRfQ01EKDB4MjEpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLCAvKiBTdGFydCBvZiBXaW5kb3cgUkFNIGFkZHJlc3Mgc2V0KEgpIDggKi8KKwlTTUFSVF9DTUQoMHg1MCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksIC8qIEVuZCBvZiBXaW5kb3cgUkFNIGFkZHJlc3Mgc2V0KEgpIDEyICovCisJU01BUlRfQ01EKDB4NTEpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHhFRiksCisJU01BUlRfQ01EKDB4MDApLCAvKiBTdGFydCBvZiBXaW5kb3cgUkFNIGFkZHJlc3Mgc2V0KFYpIDE2ICovCisJU01BUlRfQ01EKDB4NTIpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDApLCAvKiBFbmQgb2YgV2luZG93IFJBTSBhZGRyZXNzIHNldChWKSAyMCAqLworCVNNQVJUX0NNRCgweDUzKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4M0YpLAorCisJLyogd2FpdCBmb3IgdnN5bmMgY21kIGJlZm9yZSB0cmFuc2ZlcnJpbmcgZnJhbWUgZGF0YSAqLworCVNNQVJUX0NNRF9XQUlUX0ZPUl9WU1lOQywKKworCS8qIHdyaXRlIHJhbSAqLworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgyMiksCisKKwkvKiB3cml0ZSBmcmFtZSBkYXRhICovCisJU01BUlRfQ01EX1dSSVRFX0ZSQU1FLAorfTsKKworc3RhdGljIHZvaWQgbHRtMDIyYTk3YV9sY2RfcG93ZXIoaW50IG9uLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzdGF0aWMgaW50IHBpbl9yZXF1ZXN0ZWQgPSAwOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gY29udGFpbmVyX29mKHZhciwgc3RydWN0IGZiX2luZm8sIHZhcik7CisJaW50IGVycjsKKworCWlmICghcGluX3JlcXVlc3RlZCkgeworCQllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19MQ0RfUkVTRVQsICJsY2QgcmVzZXQiKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBncGlvIGZvciBMQ0QgcmVzZXRcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fTENEX1JFU0VULCAwKTsKKwkJcGluX3JlcXVlc3RlZCA9IDE7CisJfQorCisJaWYgKG9uKSB7CisJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTENEX1JFU0VULCAwKTsgbXNsZWVwKDEwMCk7CisJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTENEX1JFU0VULCAxKTsgbXNsZWVwKDEwKTsKKworCQlweGFmYl9zbWFydF9xdWV1ZShpbmZvLCBBUlJBWV9BTkRfU0laRShsY2RfcG93ZXJfb24pKTsKKwkJcHhhZmJfc21hcnRfcXVldWUoaW5mbywgQVJSQVlfQU5EX1NJWkUobGNkX3BhbmVsX29uKSk7CisJfSBlbHNlIHsKKwkJcHhhZmJfc21hcnRfcXVldWUoaW5mbywgQVJSQVlfQU5EX1NJWkUobGNkX3BhbmVsX29mZikpOworCQlweGFmYl9zbWFydF9xdWV1ZShpbmZvLCBBUlJBWV9BTkRfU0laRShsY2RfcG93ZXJfb2ZmKSk7CisJfQorCisJZXJyID0gcHhhZmJfc21hcnRfZmx1c2goaW5mbyk7CisJaWYgKGVycikKKwkJcHJfZXJyKCIlczogdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIGx0bTAyMmE5N2FfdXBkYXRlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXB4YWZiX3NtYXJ0X3F1ZXVlKGluZm8sIEFSUkFZX0FORF9TSVpFKHVwZGF0ZV9mcmFtZWRhdGEpKTsKKwlweGFmYl9zbWFydF9mbHVzaChpbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gdG9zaGliYV9sdG0wMjJhOTdhX21vZGVzW10gPSB7CisJWzBdID0geworCQkueHJlcwkJCT0gMjQwLAorCQkueXJlcwkJCT0gMzIwLAorCQkuYnBwCQkJPSAxNiwKKwkJLmEwY3NyZF9zZXRfaGxkCQk9IDMwLAorCQkuYTBjc3dyX3NldF9obGQJCT0gMzAsCisJCS53cl9wdWxzZV93aWR0aAkJPSAzMCwKKwkJLnJkX3B1bHNlX3dpZHRoIAk9IDMwLAorCQkub3BfaG9sZF90aW1lIAkJPSAzMCwKKwkJLmNtZF9pbmhfdGltZQkJPSA2MCwKKworCQkvKiBMX0xDTEtfQTAgYW5kIExfTENMS19SRCBhY3RpdmUgbG93ICovCisJCS5zeW5jCQkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8CisJCQkJCSAgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBzYWFyX2xjZF9pbmZvID0geworCS5tb2RlcwkJCT0gdG9zaGliYV9sdG0wMjJhOTdhX21vZGVzLAorCS5udW1fbW9kZXMJCT0gMSwKKwkubGNkX2Nvbm4JCT0gTENEX1NNQVJUX1BBTkVMXzhCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwsCisJLnB4YWZiX2xjZF9wb3dlcgk9IGx0bTAyMmE5N2FfbGNkX3Bvd2VyLAorCS5zbWFydF91cGRhdGUJCT0gbHRtMDIyYTk3YV91cGRhdGUsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc2Fhcl9pbml0X2xjZCh2b2lkKQoreworCXNldF9weGFfZmJfaW5mbygmc2Fhcl9sY2RfaW5mbyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNhYXJfaW5pdF9sY2Qodm9pZCkge30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX1BYQSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX1BYQV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGRhOTAzeF9zdWJkZXZfaW5mbyBzYWFyX2RhOTAzNF9zdWJkZXZzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAiZGE5MDN4LWJhY2tsaWdodCIsCisJCS5pZAkJPSBEQTkwMzRfSURfV0xFRCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkYTkwM3hfcGxhdGZvcm1fZGF0YSBzYWFyX2RhOTAzNF9pbmZvID0geworCS5udW1fc3ViZGV2cwk9IEFSUkFZX1NJWkUoc2Fhcl9kYTkwMzRfc3ViZGV2cyksCisJLnN1YmRldnMJPSBzYWFyX2RhOTAzNF9zdWJkZXZzLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBzYWFyX2kyY19pbmZvW10gPSB7CisJWzBdID0geworCQkudHlwZQkJPSAiZGE5MDM0IiwKKwkJLmFkZHIJCT0gMHgzNCwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc2Fhcl9kYTkwMzRfaW5mbywKKwkJLmlycQkJPSBncGlvX3RvX2lycShtZnBfdG9fZ3BpbyhNRlBfUElOX0dQSU84MykpLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc2Fhcl9pbml0X2kyYyh2b2lkKQoreworCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgQVJSQVlfQU5EX1NJWkUoc2Fhcl9pMmNfaW5mbykpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYWFyX2luaXRfaTJjKHZvaWQpIHt9CisjZW5kaWYKIHN0YXRpYyB2b2lkIF9faW5pdCBzYWFyX2luaXQodm9pZCkKIHsKIAkvKiBpbml0aWFsaXplIE1GUCBjb25maWd1cmF0aW9ucyAqLwogCXB4YTN4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKHNhYXJfbWZwX2NmZykpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKKworCXNhYXJfaW5pdF9pMmMoKTsKKwlzYWFyX2luaXRfbGNkKCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoU0FBUiwgIlBYQTkzMCBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVIpIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NtZW1jLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zbWVtYy5jCmluZGV4IGFkMzQ2YWQuLmQ2ZjY5MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NtZW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc21lbWMuYwpAQCAtOCw2ICs4LDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCiAjZGVmaW5lIFNNRU1DX1BIWVNfQkFTRQkoMHg0QTAwMDAwMCkKICNkZWZpbmUgU01FTUNfUEhZU19TSVpFCSgweDkwKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwppbmRleCAzYmU3NmVlLi43Mjk5ZDg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xMjIsNiArMTIzLDEwIEBACiAJR1BJTzEwNV9HUElPLAkvKiBTUElUWl9HUElPX0NGX0lSUSAqLwogCUdQSU8xMDZfR1BJTywJLyogU1BJVFpfR1BJT19DRjJfSVJRICovCiAKKwkvKiBJMkMgKi8KKwlHUElPMTE3X0kyQ19TQ0wsCisJR1BJTzExOF9JMkNfU0RBLAorCiAJR1BJTzFfR1BJTyB8IFdBS0VVUF9PTl9FREdFX1JJU0UsCiB9OwogCkBAIC02MDksMTAgKzYxNCw0MSBAQAogfTsKIAogCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gc2hhcnBzbF9yb21fcGFydHNbXSA9IHsKKwl7CisJCS5uYW1lCT0iQm9vdCBQUk9NIEZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0CT0gMHgwMDE0MDAwMCwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBzaGFycHNsX3JvbV9kYXRhID0geworCS53aWR0aAkJPSAyLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoc2hhcnBzbF9yb21fcGFydHMpLAorCS5wYXJ0cwkJPSBzaGFycHNsX3JvbV9wYXJ0cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2hhcnBzbF9yb21fcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDAwMDAwMDAwLAorCQkuZW5kCT0gMHgwMDdmZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNoYXJwc2xfcm9tX2RldmljZSA9IHsKKwkubmFtZQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJPSAtMSwKKwkucmVzb3VyY2UgPSBzaGFycHNsX3JvbV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHNoYXJwc2xfcm9tX3Jlc291cmNlcyksCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJnNoYXJwc2xfcm9tX2RhdGEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNwaXR6c2Nvb3BfZGV2aWNlLAogCSZzcGl0emtiZF9kZXZpY2UsCiAJJnNwaXR6bGVkX2RldmljZSwKKwkmc2hhcnBzbF9yb21fZGV2aWNlLAogfTsKIAogc3RhdGljIHZvaWQgc3BpdHpfcG93ZXJvZmYodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMKaW5kZXggMmMzMWVjNy4uNmY0MjAwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCX0KIAlzc3AtPnBkZXYgPSBwZGV2OwogCi0Jc3NwLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJTU1BDTEsiKTsKKwlzc3AtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihzc3AtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihzc3AtPmNsayk7CiAJCWdvdG8gZXJyX2ZyZWU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIuYwppbmRleCA1ODlkMzJiLi41OGVmMDhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiLmMKQEAgLTE4LDEyICsxOCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KKyNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTkzMC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTI3eF9rZXlwYWQuaD4KIAogI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCkBAIC0zMyw2ICszNiw0NSBAQAogCS8qIEV0aGVybmV0ICovCiAJREZfbkNTMV9uQ1MzLAogCUdQSU80N19HUElPLAorCisJLyogTENEICovCisJR1BJTzIzX0xDRF9ERDAsCisJR1BJTzI0X0xDRF9ERDEsCisJR1BJTzI1X0xDRF9ERDIsCisJR1BJTzI2X0xDRF9ERDMsCisJR1BJTzI3X0xDRF9ERDQsCisJR1BJTzI4X0xDRF9ERDUsCisJR1BJTzI5X0xDRF9ERDYsCisJR1BJTzQ0X0xDRF9ERDcsCisJR1BJTzIxX0xDRF9DUywKKwlHUElPMjJfTENEX0NTMiwKKworCUdQSU8xN19MQ0RfRkNMS19SRCwKKwlHUElPMThfTENEX0xDTEtfQTAsCisJR1BJTzE5X0xDRF9QQ0xLX1dSLAorCisJLyogTENEIEJhY2tsaWdodCAqLworCUdQSU80M19QV00zLAkvKiBwcmltYXJ5IGJhY2tsaWdodCAqLworCUdQSU8zMl9QV00wLAkvKiBzZWNvbmRhcnkgYmFja2xpZ2h0ICovCisKKwkvKiBLZXlwYWQgKi8KKwlHUElPMF9LUF9NS0lOXzAsCisJR1BJTzJfS1BfTUtJTl8xLAorCUdQSU80X0tQX01LSU5fMiwKKwlHUElPNl9LUF9NS0lOXzMsCisJR1BJTzhfS1BfTUtJTl80LAorCUdQSU8xMF9LUF9NS0lOXzUsCisJR1BJTzEyX0tQX01LSU5fNiwKKwlHUElPMV9LUF9NS09VVF8wLAorCUdQSU8zX0tQX01LT1VUXzEsCisJR1BJTzVfS1BfTUtPVVRfMiwKKwlHUElPN19LUF9NS09VVF8zLAorCUdQSU85X0tQX01LT1VUXzQsCisJR1BJTzExX0tQX01LT1VUXzUsCisJR1BJTzEzX0tQX01LT1VUXzYsCisKKwlHUElPMTRfS1BfREtJTl8yLAorCUdQSU8xNV9LUF9ES0lOXzMsCiB9OwogCiAjZGVmaW5lIFRBVk9SRVZCX0VUSF9QSFlTCSgweDE0MDAwMDAwKQpAQCAtNjQsMTIgKzEwNiwzODIgQEAKIAl9LAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfUFhBMjd4X01PRFVMRSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGF2b3JldmJfbWF0cml4X2tleV9tYXBbXSA9IHsKKwkvKiBLRVkocm93LCBjb2wsIGtleV9jb2RlKSAqLworCUtFWSgwLCA0LCBLRVlfQSksIEtFWSgwLCA1LCBLRVlfQiksIEtFWSgwLCA2LCBLRVlfQyksCisJS0VZKDEsIDQsIEtFWV9FKSwgS0VZKDEsIDUsIEtFWV9GKSwgS0VZKDEsIDYsIEtFWV9HKSwKKwlLRVkoMiwgNCwgS0VZX0kpLCBLRVkoMiwgNSwgS0VZX0opLCBLRVkoMiwgNiwgS0VZX0spLAorCUtFWSgzLCA0LCBLRVlfTSksIEtFWSgzLCA1LCBLRVlfTiksIEtFWSgzLCA2LCBLRVlfTyksCisJS0VZKDQsIDUsIEtFWV9SKSwgS0VZKDQsIDYsIEtFWV9TKSwKKwlLRVkoNSwgNCwgS0VZX1UpLCBLRVkoNSwgNCwgS0VZX1YpLCBLRVkoNSwgNiwgS0VZX1cpLAorCisJS0VZKDYsIDQsIEtFWV9ZKSwgS0VZKDYsIDUsIEtFWV9aKSwKKworCUtFWSgwLCAzLCBLRVlfMCksIEtFWSgyLCAwLCBLRVlfMSksIEtFWSgyLCAxLCBLRVlfMiksIEtFWSgyLCAyLCBLRVlfMyksCisJS0VZKDIsIDMsIEtFWV80KSwgS0VZKDEsIDAsIEtFWV81KSwgS0VZKDEsIDEsIEtFWV82KSwgS0VZKDEsIDIsIEtFWV83KSwKKwlLRVkoMSwgMywgS0VZXzgpLCBLRVkoMCwgMiwgS0VZXzkpLAorCisJS0VZKDYsIDYsIEtFWV9TUEFDRSksCisJS0VZKDAsIDAsIEtFWV9LUEFTVEVSSVNLKSwgCS8qICogKi8KKwlLRVkoMCwgMSwgS0VZX0tQRE9UKSwgCQkvKiAjICovCisKKwlLRVkoNCwgMSwgS0VZX1VQKSwKKwlLRVkoNCwgMywgS0VZX0RPV04pLAorCUtFWSg0LCAwLCBLRVlfTEVGVCksCisJS0VZKDQsIDIsIEtFWV9SSUdIVCksCisJS0VZKDYsIDAsIEtFWV9IT01FKSwKKwlLRVkoMywgMiwgS0VZX0VORCksCisJS0VZKDYsIDEsIEtFWV9ERUxFVEUpLAorCUtFWSg1LCAyLCBLRVlfQkFDSyksCisJS0VZKDYsIDMsIEtFWV9DQVBTTE9DSyksCS8qIEtFWV9MRUZUU0hJRlQpLCAqLworCisJS0VZKDQsIDQsIEtFWV9FTlRFUiksCQkvKiBzY3JvbGwgcHVzaCAqLworCUtFWSg2LCAyLCBLRVlfRU5URVIpLAkJLyoga2V5cGFkIGFjdGlvbiAqLworCisJS0VZKDMsIDEsIEtFWV9TRU5EKSwKKwlLRVkoNSwgMywgS0VZX1JFQ09SRCksCisJS0VZKDUsIDAsIEtFWV9WT0xVTUVVUCksCisJS0VZKDUsIDEsIEtFWV9WT0xVTUVET1dOKSwKKworCUtFWSgzLCAwLCBLRVlfRjIyKSwJLyogc29mdDEgKi8KKwlLRVkoMywgMywgS0VZX0YyMyksCS8qIHNvZnQyICovCit9OworCitzdGF0aWMgc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSB0YXZvcmV2Yl9rZXlwYWRfaW5mbyA9IHsKKwkubWF0cml4X2tleV9yb3dzCT0gNywKKwkubWF0cml4X2tleV9jb2xzCT0gNywKKwkubWF0cml4X2tleV9tYXAJCT0gdGF2b3JldmJfbWF0cml4X2tleV9tYXAsCisJLm1hdHJpeF9rZXlfbWFwX3NpemUJPSBBUlJBWV9TSVpFKHRhdm9yZXZiX21hdHJpeF9rZXlfbWFwKSwKKwkuZGVib3VuY2VfaW50ZXJ2YWwJPSAzMCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0YXZvcmV2Yl9pbml0X2tleXBhZCh2b2lkKQoreworCXB4YV9zZXRfa2V5cGFkX2luZm8oJnRhdm9yZXZiX2tleXBhZF9pbmZvKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGF2b3JldmJfaW5pdF9rZXlwYWQodm9pZCkge30KKyNlbmRpZiAvKiBDT05GSUdfS0VZQk9BUkRfUFhBMjd4IHx8IENPTkZJR19LRVlCT0FSRF9QWEEyN3hfTU9EVUxFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QWEEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1BYQV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSB0YXZvcmV2Yl9iYWNrbGlnaHRfZGF0YVtdID0geworCVswXSA9IHsKKwkJLyogcHJpbWFyeSBiYWNrbGlnaHQgKi8KKwkJLnB3bV9pZAkJPSAyLAorCQkubWF4X2JyaWdodG5lc3MJPSAxMDAsCisJCS5kZnRfYnJpZ2h0bmVzcwk9IDEwMCwKKwkJLnB3bV9wZXJpb2RfbnMJPSAxMDAwMDAsCisJfSwKKwlbMV0gPSB7CisJCS8qIHNlY29uZGFyeSBiYWNrbGlnaHQgKi8KKwkJLnB3bV9pZAkJPSAwLAorCQkubWF4X2JyaWdodG5lc3MJPSAxMDAsCisJCS5kZnRfYnJpZ2h0bmVzcwk9IDEwMCwKKwkJLnB3bV9wZXJpb2RfbnMJPSAxMDAwMDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRhdm9yZXZiX2JhY2tsaWdodF9kZXZpY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAicHdtLWJhY2tsaWdodCIsCisJCS5pZAkJPSAwLAorCQkuZGV2CQk9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJnRhdm9yZXZiX2JhY2tsaWdodF9kYXRhWzBdLAorCQl9LAorCX0sCisJWzFdID0geworCQkubmFtZQkJPSAicHdtLWJhY2tsaWdodCIsCisJCS5pZAkJPSAxLAorCQkuZGV2CQk9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJnRhdm9yZXZiX2JhY2tsaWdodF9kYXRhWzFdLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgdWludDE2X3QgcGFuZWxfaW5pdFtdID0geworCS8qIERTVEIgT1VUICovCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRF9OT09QLAorCVNNQVJUX0RFTEFZKDEpLAorCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRF9OT09QLAorCVNNQVJUX0RFTEFZKDEpLAorCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRF9OT09QLAorCVNNQVJUX0RFTEFZKDEpLAorCisJLyogU1RCIE9VVCAqLworCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgxRCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDA1KSwKKwlTTUFSVF9ERUxBWSgxKSwKKworCS8qIFAtT04gSW5pdCBzZXF1ZW5jZSAqLworCVNNQVJUX0NNRCgweDAwKSwgLyogT1NDIE9OICovCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDAxKSwgLyogU09VUkNFIERSSVZFUiBTSElGVCBESVJFQ1RJT04gYW5kIGRpc3BsYXkgUkFNIHNldHRpbmcgKi8KKwlTTUFSVF9EQVQoMHgwMSksCisJU01BUlRfREFUKDB4MjcpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMiksIC8qIExJTkUgSU5WICovCisJU01BUlRfREFUKDB4MDIpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDMpLCAvKiBJRiBtb2RlKDEpICovCisJU01BUlRfREFUKDB4MDEpLCAvKiA4Yml0IHNtYXJ0IG1vZGUoOC04KSxoaWdoIHNwZWVkIHdyaXRlIG1vZGUgKi8KKwlTTUFSVF9EQVQoMHgzMCksCisJU01BUlRfQ01EKDB4MDcpLAorCVNNQVJUX0NNRCgweDAwKSwgLyogUkFNIFdyaXRlIE1vZGUgKi8KKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDMpLAorCVNNQVJUX0NNRCgweDAwKSwKKworCS8qIERJU1BMQVkgU2V0dGluZywgIDI2MkssIGZpeGVkKE5PIHNjcm9sbCksIG5vIHNwbGl0IHNjcmVlbiAqLworCVNNQVJUX0NNRCgweDA3KSwKKwlTTUFSVF9EQVQoMHg0MCksIC8qIDE2LzE4LzE5IEJQUCAqLworCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MDgpLCAvKiBCUCwgRlAgU2V0aW5nLCBCUD0ySCwgRlA9M0ggKi8KKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfREFUKDB4MDIpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwQyksIC8qIElGIG1vZGUoMiksIHVzaW5nIGludGVybmFsIGNsb2NrICYgTVBVICovCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MEQpLCAvKiBGcmFtZSBzZXR0aW5nLCAxTWluLiBGcmVxdWVuY2UsIDE2Q0xLICovCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDEwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MTIpLCAvKiBUaW1pbmcoMSksQVNXIFc9NENMSywgQVNXIFNUPTFDTEsgKi8KKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfREFUKDB4MDIpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgxMyksIC8qIFRpbWluZygyKSxPRVYgU1Q9MC41Q0xLLCBPRVYgRUQ9MUNMSyAqLworCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9EQVQoMHgwMiksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0NNRCgweDE0KSwgLyogVGltaW5nKDMpLCBBU1cgSE9MRD0wLjVDTEsgKi8KKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9DTUQoMHgxNSksIC8qIFRpbWluZyg0KSwgQ0tWIFNUPTBDTEssIENLViBFRD0xQ0xLICovCisJU01BUlRfREFUKDB4MjApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MUMpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDMpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwNCksCisJU01BUlRfREFUKDB4MDMpLAorCVNNQVJUX0NNRCgweDAzKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfREFUKDB4MDMpLAorCVNNQVJUX0RBVCgweDA0KSwKKwlTTUFSVF9DTUQoMHgwMyksCisJU01BUlRfQ01EKDB4MDIpLAorCVNNQVJUX0RBVCgweDA0KSwKKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfQ01EKDB4MDMpLAorCVNNQVJUX0NNRCgweDAzKSwKKwlTTUFSVF9EQVQoMHgwMyksCisJU01BUlRfREFUKDB4MDMpLAorCVNNQVJUX0NNRCgweDAzKSwKKwlTTUFSVF9DTUQoMHgwNCksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMyksCisJU01BUlRfQ01EKDB4MDUpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfQ01EKDB4MDQpLAorCVNNQVJUX0NNRCgweDAyKSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDA0KSwKKwlTTUFSVF9DTUQoMHgwMyksCisJU01BUlRfREFUKDB4MDEpLAorCVNNQVJUX0RBVCgweDNGKSwKKwlTTUFSVF9ERUxBWSgwKSwKKworCS8qIERJU1AgUkFNIHNldHRpbmc6IDI0MCozMjAgKi8KKwlTTUFSVF9DTUQoMHgwNCksIC8qIEhBRERSLCBTVEFSVCAwICovCisJU01BUlRfQ01EKDB4MDYpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksIC8qIHgxLDMgKi8KKwlTTUFSVF9DTUQoMHgwNCksIC8qIEhBRERSLCAgRU5EICAgNCAqLworCVNNQVJUX0NNRCgweDA3KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4RUYpLCAvKiB4MiwgNyAqLworCVNNQVJUX0NNRCgweDA0KSwgLyogVkFERFIsIFNUQVJUIDggKi8KKwlTTUFSVF9DTUQoMHgwOCksCisJU01BUlRfREFUKDB4MDApLCAvKiB5MSwgMTAgKi8KKwlTTUFSVF9EQVQoMHgwMCksIC8qIHkxLCAxMSAqLworCVNNQVJUX0NNRCgweDA0KSwgLyogVkFERFIsIEVORCAxMiAqLworCVNNQVJUX0NNRCgweDA5KSwKKwlTTUFSVF9EQVQoMHgwMSksIC8qIHkyLCAxNCAqLworCVNNQVJUX0RBVCgweDNGKSwgLyogeTIsIDE1ICovCisJU01BUlRfQ01EKDB4MDIpLCAvKiBSQU0gQUREUiBTRVRUSU5HIDE2ICovCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwMCksIC8qIHgxLCAxOSAqLworCVNNQVJUX0NNRCgweDAyKSwgLyogUkFNIEFERFIgU0VUVElORyAyMCAqLworCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9EQVQoMHgwMCksIC8qIHkxLCAyMiAqLworCVNNQVJUX0RBVCgweDAwKSwgLyogeTEsIDIzICovCit9OworCitzdGF0aWMgdWludDE2X3QgcGFuZWxfb25bXSA9IHsKKwkvKiBQb3dlci1JQyBPTiAqLworCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMiksCisJU01BUlRfREFUKDB4MDcpLAorCVNNQVJUX0RBVCgweDdEKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfQ01EKDB4MDMpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwNSksCisJU01BUlRfQ01EKDB4MDEpLAorCVNNQVJUX0NNRCgweDA0KSwKKwlTTUFSVF9EQVQoMHgwMCksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwNSksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDE1KSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweEMwKSwKKwlTTUFSVF9EQVQoMHgxMCksCisJU01BUlRfREVMQVkoMzApLAorCisJLyogRElTUCBPTiAqLworCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfREFUKDB4MDApLAorCVNNQVJUX0RBVCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweEZGKSwKKwlTTUFSVF9EQVQoMHhGRSksCisJU01BUlRfREVMQVkoMTUwKSwKK307CisKK3N0YXRpYyB1aW50MTZfdCBwYW5lbF9vZmZbXSA9IHsKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfQ01EKDB4MUUpLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgwQSksCisJU01BUlRfQ01EKDB4MDEpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9EQVQoMHhGRiksCisJU01BUlRfREFUKDB4RUUpLAorCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREFUKDB4RjgpLAorCVNNQVJUX0RBVCgweDEyKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweEU4KSwKKwlTTUFSVF9EQVQoMHgxMSksCisJU01BUlRfQ01EKDB4MDEpLAorCVNNQVJUX0NNRCgweDAwKSwKKwlTTUFSVF9EQVQoMHhDMCksCisJU01BUlRfREFUKDB4MTEpLAorCVNNQVJUX0NNRCgweDAxKSwKKwlTTUFSVF9DTUQoMHgwMCksCisJU01BUlRfREFUKDB4NDApLAorCVNNQVJUX0RBVCgweDExKSwKKwlTTUFSVF9DTUQoMHgwMSksCisJU01BUlRfQ01EKDB4MDApLAorCVNNQVJUX0RBVCgweDAwKSwKKwlTTUFSVF9EQVQoMHgxMCksCit9OworCitzdGF0aWMgdWludDE2X3QgdXBkYXRlX2ZyYW1lZGF0YVtdID0geworCS8qIHdyaXRlIHJhbSAqLworCVNNQVJUX0NNRCgweDAyKSwKKwlTTUFSVF9DTUQoMHgwMiksCisKKwkvKiB3cml0ZSBmcmFtZSBkYXRhICovCisJU01BUlRfQ01EX1dSSVRFX0ZSQU1FLAorfTsKKworc3RhdGljIHZvaWQgbHRtMDIwZDU1MF9sY2RfcG93ZXIoaW50IG9uLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZih2YXIsIHN0cnVjdCBmYl9pbmZvLCB2YXIpOworCisJaWYgKG9uKSB7CisJCXB4YWZiX3NtYXJ0X3F1ZXVlKGluZm8sIEFSUkFZX0FORF9TSVpFKHBhbmVsX2luaXQpKTsKKwkJcHhhZmJfc21hcnRfcXVldWUoaW5mbywgQVJSQVlfQU5EX1NJWkUocGFuZWxfb24pKTsKKwl9IGVsc2UgeworCQlweGFmYl9zbWFydF9xdWV1ZShpbmZvLCBBUlJBWV9BTkRfU0laRShwYW5lbF9vZmYpKTsKKwl9CisKKwlpZiAocHhhZmJfc21hcnRfZmx1c2goaW5mbykpCisJCXByX2VycigiJXM6IHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBsdG0wMjBkNTUwX3VwZGF0ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlweGFmYl9zbWFydF9xdWV1ZShpbmZvLCBBUlJBWV9BTkRfU0laRSh1cGRhdGVfZnJhbWVkYXRhKSk7CisJcHhhZmJfc21hcnRfZmx1c2goaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIHRvc2hpYmFfbHRtMDIwZDU1MF9tb2Rlc1tdID0geworCVswXSA9IHsKKwkJLnhyZXMJCQk9IDI0MCwKKwkJLnlyZXMJCQk9IDMyMCwKKwkJLmJwcAkJCT0gMTYsCisJCS5hMGNzcmRfc2V0X2hsZAkJPSAzMCwKKwkJLmEwY3N3cl9zZXRfaGxkCQk9IDMwLAorCQkud3JfcHVsc2Vfd2lkdGgJCT0gMzAsCisJCS5yZF9wdWxzZV93aWR0aCAJPSAxNzAsCisJCS5vcF9ob2xkX3RpbWUgCQk9IDMwLAorCQkuY21kX2luaF90aW1lCQk9IDYwLAorCisJCS8qIExfTENMS19BMCBhbmQgTF9MQ0xLX1JEIGFjdGl2ZSBsb3cgKi8KKwkJLnN5bmMJCQk9IEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwKKwkJCQkJICBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIHRhdm9yZXZiX2xjZF9pbmZvID0geworCS5tb2RlcwkJCT0gdG9zaGliYV9sdG0wMjBkNTUwX21vZGVzLAorCS5udW1fbW9kZXMJCT0gMSwKKwkubGNkX2Nvbm4JCT0gTENEX1NNQVJUX1BBTkVMXzhCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwsCisJLnB4YWZiX2xjZF9wb3dlcgk9IGx0bTAyMGQ1NTBfbGNkX3Bvd2VyLAorCS5zbWFydF91cGRhdGUJCT0gbHRtMDIwZDU1MF91cGRhdGUsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdGF2b3JldmJfaW5pdF9sY2Qodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRhdm9yZXZiX2JhY2tsaWdodF9kZXZpY2VzWzBdKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRhdm9yZXZiX2JhY2tsaWdodF9kZXZpY2VzWzFdKTsKKwlzZXRfcHhhX2ZiX2luZm8oJnRhdm9yZXZiX2xjZF9pbmZvKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGF2b3JldmJfaW5pdF9sY2Qodm9pZCkge30KKyNlbmRpZiAvKiBDT05GSUdfRkJfUFhBIHx8IENPTkZJR19GQl9QWEFfTU9EVUxFICovCisKIHN0YXRpYyB2b2lkIF9faW5pdCB0YXZvcmV2Yl9pbml0KHZvaWQpCiB7CiAJLyogaW5pdGlhbGl6ZSBNRlAgY29uZmlndXJhdGlvbnMgKi8KIAlweGEzeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRSh0YXZvcmV2Yl9tZnBfY2ZnKSk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworCisJdGF2b3JldmJfaW5pdF9sY2QoKTsKKwl0YXZvcmV2Yl9pbml0X2tleXBhZCgpOwogfQogCiBNQUNISU5FX1NUQVJUKFRBVk9SRVZCLCAiUFhBOTMwIEV2YWx1YXRpb24gQm9hcmQgKGFrYSBUYXZvckVWQikiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCmluZGV4IGY4YTlhNjIuLjAwMTYyNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAvKgogICogVGhpcyBpcyBQWEEncyBzY2hlZF9jbG9jayBpbXBsZW1lbnRhdGlvbi4gVGhpcyBoYXMgYSByZXNvbHV0aW9uCkBAIC0xNTAsMTggKzE1MCwxMSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHhhX3RpbWVyX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGNsb2NrX3RpY2tfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGNsb2NrX3RpY2tfcmF0ZSA9IGdldF9jbG9ja190aWNrX3JhdGUoKTsKIAogCU9JRVIgPSAwOwogCU9TU1IgPSBPU1NSX00wIHwgT1NTUl9NMSB8IE9TU1JfTTIgfCBPU1NSX00zOwogCi0JaWYgKGNwdV9pc19weGEyNXgoKSkKLQkJY2xvY2tfdGlja19yYXRlID0gMzY4NjQwMDsKLQllbHNlIGlmIChtYWNoaW5lX2lzX21haW5zdG9uZSgpKQotCQljbG9ja190aWNrX3JhdGUgPSAzMjQ5NjAwOwotCWVsc2UKLQkJY2xvY2tfdGlja19yYXRlID0gMzI1MDAwMDsKLQogCXNldF9vc2NyMm5zX3NjYWxlKGNsb2NrX3RpY2tfcmF0ZSk7CiAKIAlja2V2dF9weGFfb3NtcjAubXVsdCA9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKaW5kZXggMjI0ODk3YS4uMzMzMmU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC90bWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtNzMzLDYgKzczNCw0NSBAQAogCWdwaW9fZnJlZShUT1NBX0dQSU9fQ0FSRF9WQ0NfT04pOwogfQogCisjaWZkZWYgQ09ORklHX01GRF9UQzYzOTNYQgorc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgdG9zYV90YzYzOTN4Yl9sY2RfbW9kZVtdID0geworCXsKKwkJLnhyZXMgPSA0ODAsCisJCS55cmVzID0gNjQwLAorCQkucGl4Y2xvY2sgPSAweDAwMmNkZjAwLC8qIFBMTCBkaXZpc29yICovCisJCS5sZWZ0X21hcmdpbiA9IDB4MDA0YywKKwkJLnJpZ2h0X21hcmdpbiA9IDB4MDA1YiwKKwkJLnVwcGVyX21hcmdpbiA9IDB4MDAwMSwKKwkJLmxvd2VyX21hcmdpbiA9IDB4MDAwZCwKKwkJLmhzeW5jX2xlbiA9IDB4MDAwMiwKKwkJLnZzeW5jX2xlbiA9IDB4MDAwMSwKKwkJLnN5bmMgPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LHsKKwkJLnhyZXMgPSAyNDAsCisJCS55cmVzID0gMzIwLAorCQkucGl4Y2xvY2sgPSAweDAwZTdmMjAzLC8qIFBMTCBkaXZpc29yICovCisJCS5sZWZ0X21hcmdpbiA9IDB4MDAyNCwKKwkJLnJpZ2h0X21hcmdpbiA9IDB4MDAyZiwKKwkJLnVwcGVyX21hcmdpbiA9IDB4MDAwMSwKKwkJLmxvd2VyX21hcmdpbiA9IDB4MDAwZCwKKwkJLmhzeW5jX2xlbiA9IDB4MDAwMiwKKwkJLnZzeW5jX2xlbiA9IDB4MDAwMSwKKwkJLnN5bmMgPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHRtaW9fZmJfZGF0YSB0b3NhX3RjNjM5M3hiX2ZiX2NvbmZpZyA9IHsKKwkubGNkX3NldF9wb3dlcgk9IHRjNjM5M3hiX2xjZF9zZXRfcG93ZXIsCisJLmxjZF9tb2RlCT0gdGM2MzkzeGJfbGNkX21vZGUsCisJLm51bV9tb2Rlcwk9IEFSUkFZX1NJWkUodG9zYV90YzYzOTN4Yl9sY2RfbW9kZSksCisJLm1vZGVzCQk9ICZ0b3NhX3RjNjM5M3hiX2xjZF9tb2RlWzBdLAorCS5oZWlnaHQJCT0gODIsCisJLndpZHRoCQk9IDYwLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHRjNjM5M3hiX3BsYXRmb3JtX2RhdGEgdG9zYV90YzYzOTN4Yl9kYXRhID0gewogCS5zY3JfcGxsMmNyCT0gMHgwY2MxLAogCS5zY3JfZ3Blcgk9IDB4MzMwMCwKQEAgLTc0OCw2ICs3ODgsOSBAQAogCS5yZXN1bWUJCT0gdG9zYV90YzYzOTN4Yl9yZXN1bWUsCiAKIAkubmFuZF9kYXRhCT0gJnRvc2FfdGM2MzkzeGJfbmFuZF9jb25maWcsCisjaWZkZWYgQ09ORklHX01GRF9UQzYzOTNYQgorCS5mYl9kYXRhCT0gJnRvc2FfdGM2MzkzeGJfZmJfY29uZmlnLAorI2VuZGlmCiAKIAkucmVzdW1lX3Jlc3RvcmUgPSAxLAogfTsKQEAgLTc4OSw2ICs4MzIsMzYgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNoYXJwc2xfcm9tX3BhcnRzW10gPSB7CisJeworCQkubmFtZQk9IkJvb3QgUFJPTSBGaWxlc3lzdGVtIiwKKwkJLm9mZnNldAk9IDB4MDAxNjAwMDAsCisJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgc2hhcnBzbF9yb21fZGF0YSA9IHsKKwkud2lkdGgJCT0gMiwKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHNoYXJwc2xfcm9tX3BhcnRzKSwKKwkucGFydHMJCT0gc2hhcnBzbF9yb21fcGFydHMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoYXJwc2xfcm9tX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwMDAwMDAwMCwKKwkJLmVuZAk9IDB4MDA3ZmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaGFycHNsX3JvbV9kZXZpY2UgPSB7CisJLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCT0gLTEsCisJLnJlc291cmNlID0gc2hhcnBzbF9yb21fcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzaGFycHNsX3JvbV9yZXNvdXJjZXMpLAorCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZzaGFycHNsX3JvbV9kYXRhLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZ0b3Nhc2Nvb3BfZGV2aWNlLAogCSZ0b3Nhc2Nvb3BfamNfZGV2aWNlLApAQCAtNzk4LDYgKzg3MSw3IEBACiAJJnRvc2FfZ3Bpb19rZXlzX2RldmljZSwKIAkmdG9zYWxlZF9kZXZpY2UsCiAJJnRvc2FfYnRfZGV2aWNlLAorCSZzaGFycHNsX3JvbV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCB0b3NhX3Bvd2Vyb2ZmKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGUuYwppbmRleCA4MTM4MDQ0Li4yMThkMjAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIApAQCAtMjUsNyArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL3p5bG9uaXRlLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlX3B4YTMyMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGVfcHhhMzIwLmMKaW5kZXggMGYyNDQ3NC4uMjhlNGU2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGVfcHhhMzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGVfcHhhMzIwLmMKQEAgLTE2LDggKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMzIwLmg+CiAjaW5jbHVkZSA8bWFjaC96eWxvbml0ZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcKaW5kZXggNWNjZGU3Yy4uYWQ5MTE4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZwpAQCAtNyw5ICs3LDE3IEBACiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJNKFIpIFJlYWxWaWV3IEVtdWxhdGlvbiBCYXNlYm9hcmQgcGxhdGZvcm0uCiAKK2NvbmZpZyBSRUFMVklFV19FQl9BOU1QCisJYm9vbCAiU3VwcG9ydCBNdWx0aWNvcmUgQ29ydGV4LUE5IgorCWRlcGVuZHMgb24gTUFDSF9SRUFMVklFV19FQgorCXNlbGVjdCBDUFVfVjcKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIENvcnRleC1BOU1QQ29yZSB0aWxlIG9uIHRoZSBSZWFsdmlldyBwbGF0Zm9ybS4KKwogY29uZmlnIFJFQUxWSUVXX0VCX0FSTTExTVAKIAlib29sICJTdXBwb3J0IEFSTTExTVBDb3JlIHRpbGUiCiAJZGVwZW5kcyBvbiBNQUNIX1JFQUxWSUVXX0VCCisJc2VsZWN0IENQVV9WNgogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQVJNMTFNUENvcmUgdGlsZSBvbiB0aGUgUmVhbHZpZXcgcGxhdGZvcm0uCiAKQEAgLTI1LDYgKzMzLDcgQEAKIAogY29uZmlnIE1BQ0hfUkVBTFZJRVdfUEIxMU1QCiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldy9QQjExTVBDb3JlIHBsYXRmb3JtIgorCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgQVJNX0dJQwogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBSZWFsVmlldyBNUENvcmUgUGxhdGZvcm0gQmFzZWJvYXJkLgpAQCAtMzMsOCArNDIsMjkgQEAKIAogY29uZmlnIE1BQ0hfUkVBTFZJRVdfUEIxMTc2CiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldy9QQjExNzYgcGxhdGZvcm0iCisJc2VsZWN0IENQVV9WNgogCXNlbGVjdCBBUk1fR0lDCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJNKFIpIFJlYWxWaWV3IEFSTTExNzYgUGxhdGZvcm0gQmFzZWJvYXJkLgogCitjb25maWcgTUFDSF9SRUFMVklFV19QQkE4CisJYm9vbCAiU3VwcG9ydCBSZWFsVmlldy9QQi1BOCBwbGF0Zm9ybSIKKwlzZWxlY3QgQ1BVX1Y3CisJc2VsZWN0IEFSTV9HSUMKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgUmVhbFZpZXcgQ29ydGV4LUE4IFBsYXRmb3JtIEJhc2Vib2FyZC4KKwkgIFBCLUE4IGlzIGEgcGxhdGZvcm0gd2l0aCBhbiBvbi1ib2FyZCBDb3J0ZXgtQTggYW5kIGhhcyBzdXBwb3J0IGZvcgorCSAgUENJLUUgYW5kIENvbXBhY3QgRmxhc2guCisKK2NvbmZpZyBSRUFMVklFV19ISUdIX1BIWVNfT0ZGU0VUCisJYm9vbCAiSGlnaCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgZm9yIHRoZSBSZWFsVmlldyBwbGF0Zm9ybSIKKwlkZXBlbmRzIG9uICFNQUNIX1JFQUxWSUVXX1BCMTE3NgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFJlYWxWaWV3IGJvYXJkcyBvdGhlciB0aGFuIFBCMTE3NiBoYXZlIHRoZSBSQU0gYXZhaWxhYmxlIGF0CisJICAweDcwMDAwMDAwLCAyNTZNQiBvZiB3aGljaCBiZWluZyBtaXJyb3JlZCBhdCAweDAwMDAwMDAwLiBJZgorCSAgdGhlIGJvYXJkIHN1cHBvcnRzIDUxMk1CIG9mIFJBTSwgdGhpcyBvcHRpb24gYWxsb3dzIHRoZQorCSAgbWVtb3J5IHRvIGJlIGFjY2Vzc2VkIGNvbnRpZ3VvdXNseSBhdCB0aGUgaGlnaCBwaHlzaWNhbAorCSAgb2Zmc2V0LgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9NYWtlZmlsZQppbmRleCBkMmFlMDc3Li43YmVhOGZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvTWFrZWZpbGUKQEAgLTYsNSArNiw2IEBACiBvYmotJChDT05GSUdfTUFDSF9SRUFMVklFV19FQikJCSs9IHJlYWx2aWV3X2ViLm8KIG9iai0kKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCMTFNUCkJKz0gcmVhbHZpZXdfcGIxMW1wLm8KIG9iai0kKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCMTE3NikJKz0gcmVhbHZpZXdfcGIxMTc2Lm8KK29iai0kKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCQTgpCSs9IHJlYWx2aWV3X3BiYTgubwogb2JqLSQoQ09ORklHX1NNUCkJCQkrPSBwbGF0c21wLm8gaGVhZHNtcC5vIGxvY2FsdGltZXIubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkJKz0gaG90cGx1Zy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlLmJvb3QKaW5kZXggYzdlNzVhYy4uZDk3ZTAwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvTWFrZWZpbGUuYm9vdApAQCAtMSw0ICsxLDkgQEAKK2lmZXEgKCQoQ09ORklHX1JFQUxWSUVXX0hJR0hfUEhZU19PRkZTRVQpLHkpCisgICB6cmVsYWRkci15CTo9IDB4NzAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHg3MDAwMDEwMAoraW5pdHJkX3BoeXMteQk6PSAweDcwODAwMDAwCitlbHNlCiAgICB6cmVsYWRkci15CTo9IDB4MDAwMDgwMDAKIHBhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAogaW5pdHJkX3BoeXMteQk6PSAweDAwODAwMDAwCi0KK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmMKaW5kZXggMzM0N2M0Mi4uYTcwNDMxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY2xvY2suYwpAQCAtMTAsOSArMTAsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKQEAgLTIwLDMyICsyMiw2IEBACiAKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGNsb2Nrc19tdXRleCk7Ci0KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIGNsazsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci0KLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbW9kdWxlX3B1dChjbGstPm93bmVyKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7Ci0KIGludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlyZXR1cm4gMDsKQEAgLTY1LDcgKzQxLDkgQEAKIAogbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKLQlyZXR1cm4gcmF0ZTsKKwlzdHJ1Y3QgaWNzdDMwN192Y28gdmNvOworCXZjbyA9IGljc3QzMDdfa2h6X3RvX3ZjbyhjbGstPnBhcmFtcywgcmF0ZSAvIDEwMDApOworCXJldHVybiBpY3N0MzA3X2toeihjbGstPnBhcmFtcywgdmNvKSAqIDEwMDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKIApAQCAtNzgsNTcgKzU2LDkgQEAKIAogCQl2Y28gPSBpY3N0MzA3X2toel90b192Y28oY2xrLT5wYXJhbXMsIHJhdGUgLyAxMDAwKTsKIAkJY2xrLT5yYXRlID0gaWNzdDMwN19raHooY2xrLT5wYXJhbXMsIHZjbykgKiAxMDAwOwotCi0JCXByaW50aygiQ2xvY2sgJXM6IHNldHRpbmcgVkNPIHJlZyBwYXJhbXM6IFM9JWQgUj0lZCBWPSVkXG4iLAotCQkJY2xrLT5uYW1lLCB2Y28ucywgdmNvLnIsIHZjby52KTsKLQogCQljbGstPnNldHZjbyhjbGssIHZjbyk7CiAJCXJldCA9IDA7CiAJfQogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19zZXRfcmF0ZSk7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgZml4ZWQgY2xvY2tzLgotICovCi1zdGF0aWMgc3RydWN0IGNsayBrbWlfY2xrID0gewotCS5uYW1lCT0gIktNSVJFRkNMSyIsCi0JLnJhdGUJPSAyNDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnRfY2xrID0gewotCS5uYW1lCT0gIlVBUlRDTEsiLAotCS5yYXRlCT0gMjQwMDAwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNpX2NsayA9IHsKLQkubmFtZQk9ICJNQ0xLIiwKLQkucmF0ZQk9IDI0MDAwMDAwLAotfTsKLQotaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7Ci0KLXZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQotewotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9kZWwoJmNsay0+bm9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTChjbGtfdW5yZWdpc3Rlcik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCi17Ci0JY2xrX3JlZ2lzdGVyKCZrbWlfY2xrKTsKLQljbGtfcmVnaXN0ZXIoJnVhcnRfY2xrKTsKLQljbGtfcmVnaXN0ZXIoJm1tY2lfY2xrKTsKLQlyZXR1cm4gMDsKLX0KLWFyY2hfaW5pdGNhbGwoY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jbG9jay5oCmluZGV4IGRhZGJhNjkuLmViYmIwZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2Nsb2NrLmgKQEAgLTEyLDE0ICsxMiw4IEBACiBzdHJ1Y3QgaWNzdDMwN19wYXJhbXM7CiAKIHN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIAl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQljb25zdCBjaGFyCQkqbmFtZTsKIAljb25zdCBzdHJ1Y3QgaWNzdDMwN19wYXJhbXMgKnBhcmFtczsKIAl2b2lkCQkJKmRhdGE7CiAJdm9pZAkJCSgqc2V0dmNvKShzdHJ1Y3QgY2xrICosIHN0cnVjdCBpY3N0MzA3X3ZjbyB2Y28pOwogfTsKLQotaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwotdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwppbmRleCAyZjA0ZDU0Li41ZjFkNTU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwpAQCAtMjgsMTEgKzI4LDE0IEBACiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWM5MTF4Lmg+CiAKKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hcm1fdGltZXIuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgogCkBAIC00OSw3ICs1Miw3IEBACiAKICNkZWZpbmUgUkVBTFZJRVdfUkVGQ09VTlRFUgkoX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSArIFJFQUxWSUVXX1NZU18yNE1Iel9PRkZTRVQpCiAKLS8qIHVzZWQgYnkgZW50cnktbWFjcm8uUyAqLworLyogdXNlZCBieSBlbnRyeS1tYWNyby5TIGFuZCBwbGF0c21wLmMgKi8KIHZvaWQgX19pb21lbSAqZ2ljX2NwdV9iYXNlX2FkZHI7CiAKIC8qCkBAIC0xMjQsNiArMTI3LDI5IEBACiAJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfZmxhc2hfZGV2aWNlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzbWM5MTF4X3BsYXRkYXRhIHJlYWx2aWV3X3NtYzkxMXhfcGxhdGRhdGEgPSB7CisJLmZsYWdzCQk9IFNNQzkxMVhfVVNFXzMyQklULAorCS5pcnFfZmxhZ3MJPSBJUlFGX1NIQVJFRCwKKwkuaXJxX3BvbGFyaXR5CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X2V0aF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxMXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gMiwKK307CisKK2ludCByZWFsdmlld19ldGhfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJaWYgKG5hbWUpCisJCXJlYWx2aWV3X2V0aF9kZXZpY2UubmFtZSA9IG5hbWU7CisJcmVhbHZpZXdfZXRoX2RldmljZS5yZXNvdXJjZSA9IHJlczsKKwlpZiAoc3RyY21wKHJlYWx2aWV3X2V0aF9kZXZpY2UubmFtZSwgInNtYzkxMXgiKSA9PSAwKQorCQlyZWFsdmlld19ldGhfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gJnJlYWx2aWV3X3NtYzkxMXhfcGxhdGRhdGE7CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19ldGhfZGV2aWNlKTsKK30KKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19pMmNfcmVzb3VyY2UgPSB7CiAJLnN0YXJ0CQk9IFJFQUxWSUVXX0kyQ19CQVNFLAogCS5lbmQJCT0gUkVBTFZJRVdfSTJDX0JBU0UgKyBTWl80SyAtIDEsCkBAIC0xNzcsOSArMjAzLDE0IEBACiBzdGF0aWMgdm9pZCByZWFsdmlld19vc2N2Y29fc2V0KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGljc3QzMDdfdmNvIHZjbykKIHsKIAl2b2lkIF9faW9tZW0gKnN5c19sb2NrID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSArIFJFQUxWSUVXX1NZU19MT0NLX09GRlNFVDsKLQl2b2lkIF9faW9tZW0gKnN5c19vc2MgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfU1lTX09TQzRfT0ZGU0VUOworCXZvaWQgX19pb21lbSAqc3lzX29zYzsKIAl1MzIgdmFsOwogCisJaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfcGIxMTc2KCkpCisJCXN5c19vc2MgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfU1lTX09TQzBfT0ZGU0VUOworCWVsc2UKKwkJc3lzX29zYyA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfT1NDNF9PRkZTRVQ7CisKIAl2YWwgPSByZWFkbChzeXNfb3NjKSAmIH4weDdmZmZmOwogCXZhbCB8PSB2Y28udiB8ICh2Y28uciA8PCA5KSB8ICh2Y28ucyA8PCAxNik7CiAKQEAgLTE4OCwxMyArMjE5LDYwIEBACiAJd3JpdGVsKDAsIHN5c19sb2NrKTsKIH0KIAotc3RydWN0IGNsayByZWFsdmlld19jbGNkX2NsayA9IHsKLQkubmFtZQk9ICJDTENEQ0xLIiwKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9zY3Zjb19jbGsgPSB7CiAJLnBhcmFtcwk9ICZyZWFsdmlld19vc2N2Y29fcGFyYW1zLAogCS5zZXR2Y28gPSByZWFsdmlld19vc2N2Y29fc2V0LAogfTsKIAogLyoKKyAqIFRoZXNlIGFyZSBmaXhlZCBjbG9ja3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHJlZjI0X2NsayA9IHsKKwkucmF0ZQk9IDI0MDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKKwl7CS8qIFVBUlQwICovCisJCS5kZXZfaWQJCT0gImRldjpmMSIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIFVBUlQxICovCisJCS5kZXZfaWQJCT0gImRldjpmMiIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIFVBUlQyICovCisJCS5kZXZfaWQJCT0gImRldjpmMyIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIFVBUlQzICovCisJCS5kZXZfaWQJCT0gImZwZ2E6MDkiLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCisJfSwgewkvKiBLTUkwICovCisJCS5kZXZfaWQJCT0gImZwZ2E6MDYiLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCisJfSwgewkvKiBLTUkxICovCisJCS5kZXZfaWQJCT0gImZwZ2E6MDciLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCisJfSwgewkvKiBNTUMwICovCisJCS5kZXZfaWQJCT0gImZwZ2E6MDUiLAorCQkuY2xrCQk9ICZyZWYyNF9jbGssCisJfSwgewkvKiBFQjpDTENEICovCisJCS5kZXZfaWQJCT0gImRldjoyMCIsCisJCS5jbGsJCT0gJm9zY3Zjb19jbGssCisJfSwgewkvKiBQQjpDTENEICovCisJCS5kZXZfaWQJCT0gImlzc3A6MjAiLAorCQkuY2xrCQk9ICZvc2N2Y29fY2xrLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsb29rdXBzKTsgaSsrKQorCQljbGtkZXZfYWRkKCZsb29rdXBzW2ldKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoY2xrX2luaXQpOworCisvKgogICogQ0xDRCBzdXBwb3J0LgogICovCiAjZGVmaW5lIFNZU19DTENEX05MQ0RJT09OCSgxIDw8IDIpCkBAIC0yMjYsNyArMzA0LDMwIEBACiAJLndpZHRoCQk9IC0xLAogCS5oZWlnaHQJCT0gLTEsCiAJLnRpbTIJCT0gVElNMl9CQ0QgfCBUSU0yX0lQQywKLQkuY250bAkJPSBDTlRMX0xDRFRGVCB8IENOVExfTENEVkNPTVAoMSksCisJLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0JHUiB8IENOVExfTENEVkNPTVAoMSksCisJLmJwcAkJPSAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xjZF9wYW5lbCB4dmdhID0geworCS5tb2RlCQk9IHsKKwkJLm5hbWUJCT0gIlhWR0EiLAorCQkucmVmcmVzaAk9IDYwLAorCQkueHJlcwkJPSAxMDI0LAorCQkueXJlcwkJPSA3NjgsCisJCS5waXhjbG9jawk9IDE1NzQ4LAorCQkubGVmdF9tYXJnaW4JPSAxNTIsCisJCS5yaWdodF9tYXJnaW4JPSA0OCwKKwkJLnVwcGVyX21hcmdpbgk9IDIzLAorCQkubG93ZXJfbWFyZ2luCT0gMywKKwkJLmhzeW5jX2xlbgk9IDEwNCwKKwkJLnZzeW5jX2xlbgk9IDQsCisJCS5zeW5jCQk9IDAsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCisJLndpZHRoCQk9IC0xLAorCS5oZWlnaHQJCT0gLTEsCisJLnRpbTIJCT0gVElNMl9CQ0QgfCBUSU0yX0lQQywKKwkuY250bAkJPSBDTlRMX0xDRFRGVCB8IENOVExfQkdSIHwgQ05UTF9MQ0RWQ09NUCgxKSwKIAkuYnBwCQk9IDE2LAogfTsKIApAQCAtMjQ5LDcgKzM1MCw3IEBACiAJLndpZHRoCQk9IC0xLAogCS5oZWlnaHQJCT0gLTEsCiAJLnRpbTIJCT0gVElNMl9CQ0QsCi0JLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9CR1IgfCBDTlRMX0xDRFZDT01QKDEpLAogCS5icHAJCT0gMTYsCiB9OwogCkBAIC0yNzIsNyArMzczLDcgQEAKIAkud2lkdGgJCT0gLTEsCiAJLmhlaWdodAkJPSAtMSwKIAkudGltMgkJPSBUSU0yX0lWUyB8IFRJTTJfSUhTIHwgVElNMl9JUEMsCi0JLmNudGwJCT0gQ05UTF9MQ0RURlQgfCBDTlRMX0xDRFZDT01QKDEpLAorCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9CR1IgfCBDTlRMX0xDRFZDT01QKDEpLAogCS5icHAJCT0gMTYsCiB9OwogCkBAIC0yOTUsNyArMzk2LDcgQEAKIAkud2lkdGgJCT0gLTEsCiAJLmhlaWdodAkJPSAtMSwKIAkudGltMgkJPSBUSU0yX0JDRCB8IFRJTTJfSVBDLAotCS5jbnRsCQk9IENOVExfTENEVEZUIHwgQ05UTF9MQ0RWQ09NUCgxKSwKKwkuY250bAkJPSBDTlRMX0xDRFRGVCB8IENOVExfQkdSIHwgQ05UTF9MQ0RWQ09NUCgxKSwKIAkuYnBwCQk9IDE2LAogfTsKIApAQCAtMzA4LDkgKzQwOSwxNSBAQAogc3RhdGljIHN0cnVjdCBjbGNkX3BhbmVsICpyZWFsdmlld19jbGNkX3BhbmVsKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpzeXNfY2xjZCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfQ0xDRF9PRkZTRVQ7Ci0Jc3RydWN0IGNsY2RfcGFuZWwgKnBhbmVsID0gJnZnYTsKKwlzdHJ1Y3QgY2xjZF9wYW5lbCAqdmdhX3BhbmVsOworCXN0cnVjdCBjbGNkX3BhbmVsICpwYW5lbDsKIAl1MzIgdmFsOwogCisJaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWIoKSkKKwkJdmdhX3BhbmVsID0gJnZnYTsKKwllbHNlCisJCXZnYV9wYW5lbCA9ICZ4dmdhOworCiAJdmFsID0gcmVhZGwoc3lzX2NsY2QpICYgU1lTX0NMQ0RfSURfTUFTSzsKIAlpZiAodmFsID09IFNZU19DTENEX0lEX1NBTllPXzNfOCkKIAkJcGFuZWwgPSAmc2FueW9fM184X2luOwpAQCAtMzE5LDExICs0MjYsMTEgQEAKIAllbHNlIGlmICh2YWwgPT0gU1lTX0NMQ0RfSURfRVBTT05fMl8yKQogCQlwYW5lbCA9ICZlcHNvbl8yXzJfaW47CiAJZWxzZSBpZiAodmFsID09IFNZU19DTENEX0lEX1ZHQSkKLQkJcGFuZWwgPSAmdmdhOworCQlwYW5lbCA9IHZnYV9wYW5lbDsKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDTENEOiB1bmtub3duIExDRCBwYW5lbCBJRCAweCUwOHgsIHVzaW5nIFZHQVxuIiwKIAkJCXZhbCk7Ci0JCXBhbmVsID0gJnZnYTsKKwkJcGFuZWwgPSB2Z2FfcGFuZWw7CiAJfQogCiAJcmV0dXJuIHBhbmVsOwpAQCAtMzU4LDEyICs0NjUsMTggQEAKIAl3cml0ZWwodmFsLCBzeXNfY2xjZCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZyYW1lc2l6ZSA9IFNaXzFNOwotCiBzdGF0aWMgaW50IHJlYWx2aWV3X2NsY2Rfc2V0dXAoc3RydWN0IGNsY2RfZmIgKmZiKQogeworCXVuc2lnbmVkIGxvbmcgZnJhbWVzaXplOwogCWRtYV9hZGRyX3QgZG1hOwogCisJaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWIoKSkKKwkJLyogVkdBLCAxNmJwcCAqLworCQlmcmFtZXNpemUgPSA2NDAgKiA0ODAgKiAyOworCWVsc2UKKwkJLyogWFZHQSwgMTZicHAgKi8KKwkJZnJhbWVzaXplID0gMTAyNCAqIDc2OCAqIDI7CisKIAlmYi0+cGFuZWwJCT0gcmVhbHZpZXdfY2xjZF9wYW5lbCgpOwogCiAJZmItPmZiLnNjcmVlbl9iYXNlID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZSgmZmItPmRldi0+ZGV2LCBmcmFtZXNpemUsCkBAIC01ODgsNyArNzAxLDcgQEAKIAkgKiBUaGUgZHVtbXkgY2xvY2sgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgbWFpbiBkZXZpY2UKIAkgKiBzbyB0aGF0IHRoZSBsYXR0ZXIgd2lsbCBicm9hZGNhc3QgdGhlIGNsb2NrIGV2ZW50cwogCSAqLwotCWxvY2FsX3RpbWVyX3NldHVwKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbG9jYWxfdGltZXJfc2V0dXAoKTsKICNlbmRpZgogCiAJLyogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmluZGV4IDNjZWE5MmMuLjYzYmUyYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCkBAIC00OCwxMiArNDgsMTAgQEAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X2kyY19kZXZpY2U7CiBleHRlcm4gc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIHJlYWx2aWV3X21tYzBfcGxhdF9kYXRhOwogZXh0ZXJuIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMxX3BsYXRfZGF0YTsKLWV4dGVybiBzdHJ1Y3QgY2xrIHJlYWx2aWV3X2NsY2RfY2xrOwogZXh0ZXJuIHN0cnVjdCBjbGNkX2JvYXJkIGNsY2RfcGxhdF9kYXRhOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqZ2ljX2NwdV9iYXNlX2FkZHI7CiAjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotZXh0ZXJuIHZvaWQgX19pb21lbSAqdHdkX2Jhc2VfYWRkcjsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdHdkX3NpemU7CitleHRlcm4gdm9pZCBfX2lvbWVtICp0d2RfYmFzZTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgX19pb21lbSAqdGltZXIwX3ZhX2Jhc2U7CiBleHRlcm4gdm9pZCBfX2lvbWVtICp0aW1lcjFfdmFfYmFzZTsKQEAgLTYzLDUgKzYxLDYgQEAKIGV4dGVybiB2b2lkIHJlYWx2aWV3X2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgbGVkZXZ0KTsKIGV4dGVybiB2b2lkIHJlYWx2aWV3X3RpbWVyX2luaXQodW5zaWduZWQgaW50IHRpbWVyX2lycSk7CiBleHRlcm4gaW50IHJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgbnVtKTsKK2V4dGVybiBpbnQgcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCmluZGV4IDA5NzQ4Y2IuLmJlMDQ4ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKwogZXh0ZXJuIHZvbGF0aWxlIGludCBwZW5fcmVsZWFzZTsKIAogc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihjcHVfa2lsbGVkKTsKQEAgLTIxLDcgKzIzLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgdjsKIAotCWFzbSB2b2xhdGlsZSgJIm1jcglwMTUsIDAsICUxLCBjNywgYzE0LCAwXG4iCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJYXNtIHZvbGF0aWxlKAogCSIJbWNyCXAxNSwgMCwgJTEsIGM3LCBjNSwgMFxuIgogCSIJbWNyCXAxNSwgMCwgJTEsIGM3LCBjMTAsIDRcbiIKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtZWIuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLWViLmgKaW5kZXggOGQ2OTlmZC4uMjY4ZDc3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtZWIuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1lYi5oCkBAIC00OSwxNiArNDksMTQgQEAKICNpZmRlZiBDT05GSUdfUkVBTFZJRVdfRUJfQVJNMTFNUF9SRVZCCiAjZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9TQ1VfQkFTRQkweDEwMTAwMDAwCS8qIFNDVSByZWdpc3RlcnMgKi8KICNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX0dJQ19DUFVfQkFTRQkweDEwMTAwMTAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19FQjExTVBfVFdEX0JBU0UJMHgxMDEwMDcwMAotI2RlZmluZSBSRUFMVklFV19FQjExTVBfVFdEX1NJWkUJMHgwMDAwMDEwMAorI2RlZmluZSBSRUFMVklFV19FQjExTVBfVFdEX0JBU0UJMHgxMDEwMDYwMAogI2RlZmluZSBSRUFMVklFV19FQjExTVBfR0lDX0RJU1RfQkFTRQkweDEwMTAxMDAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgZGlzdHJpYnV0b3IgKi8KICNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX0wyMjBfQkFTRQkweDEwMTAyMDAwCS8qIEwyMjAgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9TWVNfUExEX0NUUkwxCTB4RDgJCS8qIFJlZ2lzdGVyIG9mZnNldCBmb3IgTVBDb3JlIHN5c2N0bCAqLwogI2Vsc2UKICNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX1NDVV9CQVNFCTB4MUYwMDAwMDAJLyogU0NVIHJlZ2lzdGVycyAqLwogI2RlZmluZSBSRUFMVklFV19FQjExTVBfR0lDX0NQVV9CQVNFCTB4MUYwMDAxMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBDUFUgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9UV0RfQkFTRQkweDFGMDAwNzAwCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9UV0RfU0laRQkweDAwMDAwMTAwCisjZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9UV0RfQkFTRQkweDFGMDAwNjAwCiAjZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9HSUNfRElTVF9CQVNFCTB4MUYwMDEwMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwogI2RlZmluZSBSRUFMVklFV19FQjExTVBfTDIyMF9CQVNFCTB4MUYwMDIwMDAJLyogTDIyMCByZWdpc3RlcnMgKi8KICNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX1NZU19QTERfQ1RSTDEJMHg3NAkJLyogUmVnaXN0ZXIgb2Zmc2V0IGZvciBNUENvcmUgc3lzY3RsICovCkBAIC0xNjMsNyArMTYxLDcgQEAKICNkZWZpbmUgTlJfSVJRUwkJCU5SX0lSUVNfRUIKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUkVBTFZJRVdfRUJfQVJNMTFNUCkgXAorI2lmIGRlZmluZWQoQ09ORklHX1JFQUxWSUVXX0VCX0FSTTExTVApIHx8IGRlZmluZWQoQ09ORklHX1JFQUxWSUVXX0VCX0E5TVApIFwKIAkmJiAoIWRlZmluZWQoTUFYX0dJQ19OUikgfHwgKE1BWF9HSUNfTlIgPCBOUl9HSUNfRUIxMU1QKSkKICN1bmRlZiBNQVhfR0lDX05SCiAjZGVmaW5lIE1BWF9HSUNfTlIJCU5SX0dJQ19FQjExTVAKQEAgLTE3Nyw2ICsxNzUsNyBAQAogI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0FSTTkJCTB4MDIwMDAwMDAKICNkZWZpbmUgUkVBTFZJRVdfRUJfUFJPQ19BUk0xMQkJMHgwNDAwMDAwMAogI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0FSTTExTVAJMHgwNjAwMDAwMAorI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0E5TVAJCTB4MEMwMDAwMDAKIAogI2RlZmluZSBjaGVja19lYl9wcm9jKHByb2NfdHlwZSkJCQkJCQlcCiAJKChyZWFkbChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX1BST0NJRCkpICYgUkVBTFZJRVdfRUJfUFJPQ19NQVNLKQlcCkBAIC0xODgsNCArMTg3LDEzIEBACiAjZGVmaW5lIGNvcmVfdGlsZV9lYjExbXAoKQkwCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19SRUFMVklFV19FQl9BOU1QCisjZGVmaW5lIGNvcmVfdGlsZV9hOW1wKCkJY2hlY2tfZWJfcHJvYyhSRUFMVklFV19FQl9QUk9DX0E5TVApCisjZWxzZQorI2RlZmluZSBjb3JlX3RpbGVfYTltcCgpCTAKKyNlbmRpZgorCisjZGVmaW5lIG1hY2hpbmVfaXNfcmVhbHZpZXdfZWJfbXAoKSBcCisJKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWIoKSAmJiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpKQorCiAjZW5kaWYJLyogX19BU01fQVJDSF9CT0FSRF9FQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYjExbXAuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTFtcC5oCmluZGV4IGVjZDgwZTUuLjUzZWEwZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTFtcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2JvYXJkLXBiMTFtcC5oCkBAIC03Nyw4ICs3Nyw3IEBACiAgKi8KICNkZWZpbmUgUkVBTFZJRVdfVEMxMU1QX1NDVV9CQVNFCQkweDFGMDAwMDAwCS8qIElSUSwgVGVzdCBjaGlwICovCiAjZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9HSUNfQ1BVX0JBU0UJCTB4MUYwMDAxMDAJLyogVGVzdCBjaGlwIGludGVycnVwdCBjb250cm9sbGVyIENQVSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgUkVBTFZJRVdfVEMxMU1QX1RXRF9CQVNFCQkweDFGMDAwNzAwCi0jZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9UV0RfU0laRQkJMHgwMDAwMDEwMAorI2RlZmluZSBSRUFMVklFV19UQzExTVBfVFdEX0JBU0UJCTB4MUYwMDA2MDAKICNkZWZpbmUgUkVBTFZJRVdfVEMxMU1QX0dJQ19ESVNUX0JBU0UJCTB4MUYwMDEwMDAJLyogVGVzdCBjaGlwIGludGVycnVwdCBjb250cm9sbGVyIGRpc3RyaWJ1dG9yICovCiAjZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9MMjIwX0JBU0UJCTB4MUYwMDIwMDAJLyogTDIyMCByZWdpc3RlcnMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGJhOC5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvYm9hcmQtcGJhOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmVkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ib2FyZC1wYmE4LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9ib2FyZC1wYmE4LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQVJNIExpbWl0ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0JPQVJEX1BCQThfSAorI2RlZmluZSBfX0FTTV9BUkNIX0JPQVJEX1BCQThfSAorCisjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgorCisvKgorICogUGVyaXBoZXJhbCBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1VBUlQwX0JBU0UJCTB4MTAwMDkwMDAJLyogVUFSVCAwICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfVUFSVDFfQkFTRQkJMHgxMDAwQTAwMAkvKiBVQVJUIDEgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9VQVJUMl9CQVNFCQkweDEwMDBCMDAwCS8qIFVBUlQgMiAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1VBUlQzX0JBU0UJCTB4MTAwMEMwMDAJLyogVUFSVCAzICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfU1NQX0JBU0UJCQkweDEwMDBEMDAwCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0ICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfV0FUQ0hET0cwX0JBU0UJCTB4MTAwMEYwMDAJLyogV2F0Y2hkb2cgMCAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1dBVENIRE9HX0JBU0UJCTB4MTAwMTAwMDAJLyogd2F0Y2hkb2cgaW50ZXJmYWNlICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRQkJMHgxMDAxMTAwMAkvKiBUaW1lciAwIGFuZCAxICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfVElNRVIyXzNfQkFTRQkJMHgxMDAxMjAwMAkvKiBUaW1lciAyIGFuZCAzICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfR1BJTzBfQkFTRQkJMHgxMDAxMzAwMAkvKiBHUElPIHBvcnQgMCAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1JUQ19CQVNFCQkJMHgxMDAxNzAwMAkvKiBSZWFsIFRpbWUgQ2xvY2sgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9USU1FUjRfNV9CQVNFCQkweDEwMDE4MDAwCS8qIFRpbWVyIDQvNSAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1RJTUVSNl83X0JBU0UJCTB4MTAwMTkwMDAJLyogVGltZXIgNi83ICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfU0NUTF9CQVNFCQkJMHgxMDAxQTAwMAkvKiBTeXN0ZW0gQ29udHJvbGxlciAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X0NMQ0RfQkFTRQkJCTB4MTAwMjAwMDAJLyogQ0xDRCAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X09OQl9TUkFNX0JBU0UJCTB4MTAwNjAwMDAJLyogT24tYm9hcmQgU1JBTSAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X0RNQ19CQVNFCQkJMHgxMDBFMDAwMAkvKiBETUMgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1NNQ19CQVNFCQkJMHgxMDBFMTAwMAkvKiBTTUMgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X0NBTl9CQVNFCQkJMHgxMDBFMjAwMAkvKiBDQU4gYnVzICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfQ0ZfQkFTRQkJCTB4MTgwMDAwMDAJLyogQ29tcGFjdCBmbGFzaCAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X0NGX01FTV9CQVNFCQkweDE4MDAzMDAwCS8qIFNNQyBmb3IgQ29tcGFjdCBmbGFzaCAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X0dJQ19DUFVfQkFTRQkJMHgxRTAwMDAwMAkvKiBHZW5lcmljIGludGVycnVwdCBjb250cm9sbGVyIENQVSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9GTEFTSDBfQkFTRQkJMHg0MDAwMDAwMAorI2RlZmluZSBSRUFMVklFV19QQkE4X0ZMQVNIMF9TSVpFCQlTWl82NE0KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9GTEFTSDFfQkFTRQkJMHg0NDAwMDAwMAorI2RlZmluZSBSRUFMVklFV19QQkE4X0ZMQVNIMV9TSVpFCQlTWl82NE0KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9FVEhfQkFTRQkJCTB4NEUwMDAwMDAJLyogRXRoZXJuZXQgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9VU0JfQkFTRQkJCTB4NEYwMDAwMDAJLyogVVNCICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfR0lDX0RJU1RfQkFTRQkJMHgxRTAwMTAwMAkvKiBHZW5lcmljIGludGVycnVwdCBjb250cm9sbGVyIGRpc3RyaWJ1dG9yICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfTFRfQkFTRQkJCTB4QzAwMDAwMDAJLyogTG9naWMgVGlsZSBleHBhbnNpb24gKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9TRFJBTTZfQkFTRQkJMHg3MDAwMDAwMAkvKiBTRFJBTSBiYW5rIDYgMjU2TUIgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9TRFJBTTdfQkFTRQkJMHg4MDAwMDAwMAkvKiBTRFJBTSBiYW5rIDcgMjU2TUIgKi8KKworI2RlZmluZSBSRUFMVklFV19QQkE4X1NZU19QTERfQ1RSTDEJCTB4NzQKKworLyoKKyAqIFBCQTggUENJIHJlZ2lvbnMKKyAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1BDSV9CQVNFCQkJMHg5MDA0MDAwMAkvKiBQQ0ktWCBVbml0IGJhc2UgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9QQ0lfSU9fQkFTRQkJMHg5MDA1MDAwMAkvKiBJTyBSZWdpb24gb24gQUhCICovCisjZGVmaW5lIFJFQUxWSUVXX1BCQThfUENJX01FTV9CQVNFCQkweEEwMDAwMDAwCS8qIE1FTSBSZWdpb24gb24gQUhCICovCisKKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9QQ0lfQkFTRV9TSVpFCQkweDEwMDAwCQkvKiAxNiBLYiAqLworI2RlZmluZSBSRUFMVklFV19QQkE4X1BDSV9JT19TSVpFCQkweDEwMDAJCS8qIDQgS2IgKi8KKyNkZWZpbmUgUkVBTFZJRVdfUEJBOF9QQ0lfTUVNX1NJWkUJCTB4MjAwMDAwMDAJLyogNTEyIE1CICovCisKKy8qCisgKiBJcnFzCisgKi8KKyNkZWZpbmUgSVJRX1BCQThfR0lDX1NUQVJUCQkJMzIKKworLyogTDIyMAorI2RlZmluZSBJUlFfUEJBOF9MMjIwX0VWRU5UCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyOSkKKyNkZWZpbmUgSVJRX1BCQThfTDIyMF9TTEFWRQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMzApCisjZGVmaW5lIElSUV9QQkE4X0wyMjBfREVDT0RFCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAzMSkKKyovCisKKy8qCisgKiBQQi1BOCBvbi1ib2FyZCBnaWMgaXJxIHNvdXJjZXMKKyAqLworI2RlZmluZSBJUlFfUEJBOF9XQVRDSERPRwkoSVJRX1BCQThfR0lDX1NUQVJUICsgMCkJLyogV2F0Y2hkb2cgdGltZXIgKi8KKyNkZWZpbmUgSVJRX1BCQThfU09GVAkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDEpCS8qIFNvZnR3YXJlIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfUEJBOF9DT01NUngJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyKQkvKiBEZWJ1ZyBDb21tIFJ4IGludGVycnVwdCAqLworI2RlZmluZSBJUlFfUEJBOF9DT01NVHgJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAzKQkvKiBEZWJ1ZyBDb21tIFR4IGludGVycnVwdCAqLworI2RlZmluZSBJUlFfUEJBOF9USU1FUjBfMQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNCkJLyogVGltZXIgMC8xIChkZWZhdWx0IHRpbWVyKSAqLworI2RlZmluZSBJUlFfUEJBOF9USU1FUjJfMwkoSVJRX1BCQThfR0lDX1NUQVJUICsgNSkJLyogVGltZXIgMi8zICovCisjZGVmaW5lIElSUV9QQkE4X0dQSU8wCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNikJLyogR1BJTyAwICovCisjZGVmaW5lIElSUV9QQkE4X0dQSU8xCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNykJLyogR1BJTyAxICovCisjZGVmaW5lIElSUV9QQkE4X0dQSU8yCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgOCkJLyogR1BJTyAyICovCisJCQkJCQkJCS8qIDkgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgSVJRX1BCQThfUlRDCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTApCS8qIFJlYWwgVGltZSBDbG9jayAqLworI2RlZmluZSBJUlFfUEJBOF9TU1AJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMSkJLyogU3luY2hyb25vdXMgU2VyaWFsIFBvcnQgKi8KKyNkZWZpbmUgSVJRX1BCQThfVUFSVDAJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMikJLyogVUFSVCAwIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KKyNkZWZpbmUgSVJRX1BCQThfVUFSVDEJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMykJLyogVUFSVCAxIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KKyNkZWZpbmUgSVJRX1BCQThfVUFSVDIJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxNCkJLyogVUFSVCAyIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KKyNkZWZpbmUgSVJRX1BCQThfVUFSVDMJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxNSkJLyogVUFSVCAzIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KKyNkZWZpbmUgSVJRX1BCQThfU0NJCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTYpCS8qIFNtYXJ0IENhcmQgSW50ZXJmYWNlICovCisjZGVmaW5lIElSUV9QQkE4X01NQ0kwQQkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDE3KQkvKiBNdWx0aW1lZGlhIENhcmQgMEEgKi8KKyNkZWZpbmUgSVJRX1BCQThfTU1DSTBCCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTgpCS8qIE11bHRpbWVkaWEgQ2FyZCAwQiAqLworI2RlZmluZSBJUlFfUEJBOF9BQUNJCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTkpCS8qIEF1ZGlvIENvZGVjICovCisjZGVmaW5lIElSUV9QQkE4X0tNSTAJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMCkJLyogS2V5Ym9hcmQvTW91c2UgcG9ydCAwICovCisjZGVmaW5lIElSUV9QQkE4X0tNSTEJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMSkJLyogS2V5Ym9hcmQvTW91c2UgcG9ydCAxICovCisjZGVmaW5lIElSUV9QQkE4X0NIQVJMQ0QJKElSUV9QQkE4X0dJQ19TVEFSVCArIDIyKQkvKiBDaGFyYWN0ZXIgTENEICovCisjZGVmaW5lIElSUV9QQkE4X0NMQ0QJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMykJLyogQ0xDRCBjb250cm9sbGVyICovCisjZGVmaW5lIElSUV9QQkE4X0RNQUMJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyNCkJLyogRE1BIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgSVJRX1BCQThfUFdSRkFJTAkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjUpCS8qIFBvd2VyIGZhaWx1cmUgKi8KKyNkZWZpbmUgSVJRX1BCQThfUElTTU8JCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyNikJLyogUElTTU8gaW50ZXJmYWNlICovCisjZGVmaW5lIElSUV9QQkE4X0RvQwkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDI3KQkvKiBEaXNrIG9uIENoaXAgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgSVJRX1BCQThfRVRICQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjgpCS8qIEV0aGVybmV0IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgSVJRX1BCQThfVVNCCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjkpCS8qIFVTQiBjb250cm9sbGVyICovCisjZGVmaW5lIElSUV9QQkE4X1RTUEVOCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMzApCS8qIFRvdWNoc2NyZWVuIHBlbiAqLworI2RlZmluZSBJUlFfUEJBOF9UU0tQQUQJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAzMSkJLyogVG91Y2hzY3JlZW4ga2V5cGFkICovCisKKy8qIC4uLiAqLworI2RlZmluZSBJUlFfUEJBOF9QQ0kwCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNTApCisjZGVmaW5lIElSUV9QQkE4X1BDSTEJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyA1MSkKKyNkZWZpbmUgSVJRX1BCQThfUENJMgkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDUyKQorI2RlZmluZSBJUlFfUEJBOF9QQ0kzCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNTMpCisKKyNkZWZpbmUgSVJRX1BCQThfU01DCQktMQorI2RlZmluZSBJUlFfUEJBOF9TQ1RMCQktMQorCisjZGVmaW5lIE5SX0dJQ19QQkE4CQkxCisKKy8qCisgKiBPbmx5IGRlZmluZSBOUl9JUlFTIGlmIGxlc3MgdGhhbiBOUl9JUlFTX1BCQTgKKyAqLworI2RlZmluZSBOUl9JUlFTX1BCQTgJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyA2NCkKKworI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCkKKworI2lmICFkZWZpbmVkKE5SX0lSUVMpIHx8IChOUl9JUlFTIDwgTlJfSVJRU19QQkE4KQorI3VuZGVmIE5SX0lSUVMKKyNkZWZpbmUgTlJfSVJRUwkJCU5SX0lSUVNfUEJBOAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChNQVhfR0lDX05SKSB8fCAoTUFYX0dJQ19OUiA8IE5SX0dJQ19QQkE4KQorI3VuZGVmIE1BWF9HSUNfTlIKKyNkZWZpbmUgTUFYX0dJQ19OUgkJTlJfR0lDX1BCQTgKKyNlbmRpZgorCisjZW5kaWYJLyogQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCAqLworCisjZW5kaWYJLyogX19BU01fQVJDSF9CT0FSRF9QQkE4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvY2xrZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMzdhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0NMS0RFVl9ICisjZGVmaW5lIF9fQVNNX01BQ0hfQ0xLREVWX0gKKworI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQorI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNzE5NmJjYS4uOTJkYmNiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC04LDE1ICs4LDM2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSovCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfUkVBTFZJRVdfRUIpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCMTFNUCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCkKKyNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKKyNkZWZpbmUgREVCVUdfTExfVUFSVF9PRkZTRVQJMHgwMDAwOTAwMAorI2VsaWYgREVCVUdfTExfVUFSVF9PRkZTRVQgIT0gMHgwMDAwOTAwMAorI3dhcm5pbmcgIkRFQlVHX0xMX1VBUlRfT0ZGU0VUIGFscmVhZHkgZGVmaW5lZCB0byBhIGRpZmZlcmVudCB2YWx1ZSIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9SRUFMVklFV19QQjExNzYKKyNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKKyNkZWZpbmUgREVCVUdfTExfVUFSVF9PRkZTRVQJMHgwMDEwYzAwMAorI2VsaWYgREVCVUdfTExfVUFSVF9PRkZTRVQgIT0gMHgwMDEwYzAwMAorI3dhcm5pbmcgIkRFQlVHX0xMX1VBUlRfT0ZGU0VUIGFscmVhZHkgZGVmaW5lZCB0byBhIGRpZmZlcmVudCB2YWx1ZSIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKKyNlcnJvciAiVW5rbm93biBSZWFsVmlldyBwbGF0Zm9ybSIKKyNlbmRpZgogCiAJCS5tYWNybwlhZGRydWFydCxyeAogCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMAogCQl0c3QJXHJ4LCAjMQkJCUAgTU1VIGVuYWJsZWQ/CiAJCW1vdmVxCVxyeCwgICAgICAjMHgxMDAwMDAwMAotCQltb3ZuZQlccngsICAgICAgIzB4ZjAwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKLQkJb3JyCVxyeCwgXHJ4LCAjMHgwMDAwOTAwMAorCQltb3ZuZQlccngsICAgICAgIzB4ZmIwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKKwkJb3JyCVxyeCwgXHJ4LCAjREVCVUdfTExfVUFSVF9PRkZTRVQKIAkJLmVuZG0KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWJ1Zy1wbDAxeC5TPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhNWExYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZG1hLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIEFSTSBMaW1pdGVkLgotICogIENvcHlyaWdodCAoQykgMTk5NywxOTk4IFJ1c3NlbGwgS2luZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggNzlhOTNiMy4uYjQyYzE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0yNSw3ICsyNSwxNCBAQAogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCiAvKiBtYWNybyB0byBnZXQgYXQgSU8gc3BhY2Ugd2hlbiBydW5uaW5nIHZpcnR1YWxseSAqLwotI2RlZmluZSBJT19BRERSRVNTKHgpCQkoKCh4KSAmIDB4MGZmZmZmZmYpICsgMHhmMDAwMDAwMCkKKy8qCisgKiBTdGF0aWNhbGx5IG1hcHBlZCBhZGRyZXNzZXM6CisgKgorICogMTB4eCB4eHh4IC0+IGZieHggeHh4eAorICogMWV4eCB4eHh4IC0+IGZkeHggeHh4eAorICogMWZ4eCB4eHh4IC0+IGZleHggeHh4eAorICovCisjZGVmaW5lIElPX0FERFJFU1MoeCkJCSgoKHgpICYgMHgwM2ZmZmZmZikgKyAweGZiMDAwMDAwKQogI2RlZmluZSBfX2lvX2FkZHJlc3MobikJCV9faW8oSU9fQUREUkVTUyhuKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaW8uaAppbmRleCBhYTA2OTQyLi5mMDViY2RmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIyLDEyICsyMiw3IEBACiAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX19pbyh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOwotfQotCi0jZGVmaW5lIF9faW8oYSkJCQlfX2lvKGEpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCAwMmE5MTg1Li5mZTVjYjk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1lYi5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGIxMW1wLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1wYjExNzYuaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLXBiYTguaD4KIAogI2RlZmluZSBJUlFfTE9DQUxUSU1FUgkJMjkKICNkZWZpbmUgSVJRX0xPQ0FMV0RPRwkJMzAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMGU2NzM0OC4uMjkzYzMwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTIzLDE2ICsyMywxMCBAQAogLyoKICAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgogICovCisjaWZkZWYgQ09ORklHX1JFQUxWSUVXX0hJR0hfUEhZU19PRkZTRVQKKyNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4NzAwMDAwMDApCisjZWxzZQogI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLQotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICogICAgICAgICAgICAgIGFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoKHgpIC0gUEFHRV9PRkZTRVQpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKCh4KSArIFBBR0VfT0ZGU0VUKQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDc5ZjUwZjIuLjQxNWQ2MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLWViLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1wYjExbXAuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLXBiMTE3Ni5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGJhOC5oPgogCiAjZGVmaW5lIEFNQkFfVUFSVF9EUihiYXNlKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKChiYXNlKSArIDB4MDApKQogI2RlZmluZSBBTUJBX1VBUlRfTENSSChiYXNlKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKChiYXNlKSArIDB4MmMpKQpAQCAtNDAsNiArNDEsOCBAQAogCQlyZXR1cm4gUkVBTFZJRVdfUEIxMU1QX1VBUlQwX0JBU0U7CiAJZWxzZSBpZiAobWFjaGluZV9pc19yZWFsdmlld19wYjExNzYoKSkKIAkJcmV0dXJuIFJFQUxWSUVXX1BCMTE3Nl9VQVJUMF9CQVNFOworCWVsc2UgaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfcGJhOCgpKQorCQlyZXR1cm4gUkVBTFZJRVdfUEJBOF9VQVJUMF9CQVNFOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKaW5kZXggNDhjYmNjODcuLmZlMGRlMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTE4LDQgKzE4LDQgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KLSNkZWZpbmUgVk1BTExPQ19FTkQJCShQQUdFX09GRlNFVCArIDB4MTgwMDAwMDApCisjZGVmaW5lIFZNQUxMT0NfRU5ECQkweGY4MDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvbG9jYWx0aW1lci5jCmluZGV4IDQ0ZDE3OGMuLjkwMTllZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvbG9jYWx0aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvbG9jYWx0aW1lci5jCkBAIC0zOCwxOCArMzgsMTQgQEAKIAogI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKIAotI2RlZmluZSBUV0RfQkFTRShjcHUpCSh0d2RfYmFzZV9hZGRyICsgKGNwdSkgKiB0d2Rfc2l6ZSkKLQogLyogc2V0IHVwIGJ5IHRoZSBwbGF0Zm9ybSBjb2RlICovCi12b2lkIF9faW9tZW0gKnR3ZF9iYXNlX2FkZHI7Ci11bnNpZ25lZCBpbnQgdHdkX3NpemU7Cit2b2lkIF9faW9tZW0gKnR3ZF9iYXNlOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtcGNvcmVfdGltZXJfcmF0ZTsKIAogc3RhdGljIHZvaWQgbG9jYWxfdGltZXJfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBUV0RfQkFTRShzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAogCXN3aXRjaChtb2RlKSB7CkBAIC02OCwxNyArNjQsMTYgQEAKIAkJY3RybCA9IDA7CiAJfQogCi0JX19yYXdfd3JpdGVsKGN0cmwsIGJhc2UgKyBUV0RfVElNRVJfQ09OVFJPTCk7CisJX19yYXdfd3JpdGVsKGN0cmwsIHR3ZF9iYXNlICsgVFdEX1RJTUVSX0NPTlRST0wpOwogfQogCiBzdGF0aWMgaW50IGxvY2FsX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZXZ0LAogCQkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKnVudXNlZCkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBUV0RfQkFTRShzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXVuc2lnbmVkIGxvbmcgY3RybCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBUV0RfVElNRVJfQ09OVFJPTCk7CisJdW5zaWduZWQgbG9uZyBjdHJsID0gX19yYXdfcmVhZGwodHdkX2Jhc2UgKyBUV0RfVElNRVJfQ09OVFJPTCk7CiAKLQlfX3Jhd193cml0ZWwoZXZ0LCBiYXNlICsgVFdEX1RJTUVSX0NPVU5URVIpOwotCV9fcmF3X3dyaXRlbChjdHJsIHwgVFdEX1RJTUVSX0NPTlRST0xfRU5BQkxFLCBiYXNlICsgVFdEX1RJTUVSX0NPTlRST0wpOworCV9fcmF3X3dyaXRlbChldnQsIHR3ZF9iYXNlICsgVFdEX1RJTUVSX0NPVU5URVIpOworCV9fcmF3X3dyaXRlbChjdHJsIHwgVFdEX1RJTUVSX0NPTlRST0xfRU5BQkxFLCB0d2RfYmFzZSArIFRXRF9USU1FUl9DT05UUk9MKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTEsMTkgKzg2LDE2IEBACiAgKi8KIGludCBsb2NhbF90aW1lcl9hY2sodm9pZCkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBUV0RfQkFTRShzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JaWYgKF9fcmF3X3JlYWRsKGJhc2UgKyBUV0RfVElNRVJfSU5UU1RBVCkpIHsKLQkJX19yYXdfd3JpdGVsKDEsIGJhc2UgKyBUV0RfVElNRVJfSU5UU1RBVCk7CisJaWYgKF9fcmF3X3JlYWRsKHR3ZF9iYXNlICsgVFdEX1RJTUVSX0lOVFNUQVQpKSB7CisJCV9fcmF3X3dyaXRlbCgxLCB0d2RfYmFzZSArIFRXRF9USU1FUl9JTlRTVEFUKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCB0d2RfY2FsaWJyYXRlX3JhdGUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCB0d2RfY2FsaWJyYXRlX3JhdGUodm9pZCkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBUV0RfQkFTRShjcHUpOwogCXVuc2lnbmVkIGxvbmcgbG9hZCwgY291bnQ7CiAJdTY0IHdhaXRqaWZmaWVzOwogCkBAIC0xMjQsMTUgKzExNiwxNSBAQAogCQl3YWl0amlmZmllcyArPSA1OwogCiAJCQkJIC8qIGVuYWJsZSwgbm8gaW50ZXJydXB0IG9yIHJlbG9hZCAqLwotCQlfX3Jhd193cml0ZWwoMHgxLCBiYXNlICsgVFdEX1RJTUVSX0NPTlRST0wpOworCQlfX3Jhd193cml0ZWwoMHgxLCB0d2RfYmFzZSArIFRXRF9USU1FUl9DT05UUk9MKTsKIAogCQkJCSAvKiBtYXhpbXVtIHZhbHVlICovCi0JCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZGVSwgYmFzZSArIFRXRF9USU1FUl9DT1VOVEVSKTsKKwkJX19yYXdfd3JpdGVsKDB4RkZGRkZGRkZVLCB0d2RfYmFzZSArIFRXRF9USU1FUl9DT1VOVEVSKTsKIAogCQl3aGlsZSAoZ2V0X2ppZmZpZXNfNjQoKSA8IHdhaXRqaWZmaWVzKQogCQkJdWRlbGF5KDEwKTsKIAotCQljb3VudCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBUV0RfVElNRVJfQ09VTlRFUik7CisJCWNvdW50ID0gX19yYXdfcmVhZGwodHdkX2Jhc2UgKyBUV0RfVElNRVJfQ09VTlRFUik7CiAKIAkJbXBjb3JlX3RpbWVyX3JhdGUgPSAoMHhGRkZGRkZGRlUgLSBjb3VudCkgKiAoSFogLyA1KTsKIApAQCAtMTQyLDE4ICsxMzQsMTkgQEAKIAogCWxvYWQgPSBtcGNvcmVfdGltZXJfcmF0ZSAvIEhaOwogCi0JX19yYXdfd3JpdGVsKGxvYWQsIGJhc2UgKyBUV0RfVElNRVJfTE9BRCk7CisJX19yYXdfd3JpdGVsKGxvYWQsIHR3ZF9iYXNlICsgVFdEX1RJTUVSX0xPQUQpOwogfQogCiAvKgogICogU2V0dXAgdGhlIGxvY2FsIGNsb2NrIGV2ZW50cyBmb3IgYSBDUFUuCiAgKi8KLXZvaWQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHVuc2lnbmVkIGludCBjcHUpCit2b2lkIF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cCh2b2lkKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrID0gJnBlcl9jcHUobG9jYWxfY2xvY2tldmVudCwgY3B1KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JdHdkX2NhbGlicmF0ZV9yYXRlKGNwdSk7CisJdHdkX2NhbGlicmF0ZV9yYXRlKCk7CiAKIAljbGstPm5hbWUJCT0gImxvY2FsX3RpbWVyIjsKIAljbGstPmZlYXR1cmVzCQk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKQEAgLTE3OCw5ICsxNzEsOSBAQAogLyoKICAqIHRha2UgYSBsb2NhbCB0aW1lciBkb3duCiAgKi8KLXZvaWQgX19jcHVleGl0IGxvY2FsX3RpbWVyX3N0b3AodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgX19jcHVleGl0IGxvY2FsX3RpbWVyX3N0b3Aodm9pZCkKIHsKLQlfX3Jhd193cml0ZWwoMCwgVFdEX0JBU0UoY3B1KSArIFRXRF9USU1FUl9DT05UUk9MKTsKKwlfX3Jhd193cml0ZWwoMCwgdHdkX2Jhc2UgKyBUV0RfVElNRVJfQ09OVFJPTCk7CiB9CiAKICNlbHNlCS8qIENPTkZJR19MT0NBTF9USU1FUlMgKi8KQEAgLTE5MCw4ICsxODMsOSBAQAogewogfQogCi12b2lkIF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cCh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCBfX2NwdWluaXQgbG9jYWxfdGltZXJfc2V0dXAodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsayA9ICZwZXJfY3B1KGxvY2FsX2Nsb2NrZXZlbnQsIGNwdSk7CiAKIAljbGstPm5hbWUJCT0gImR1bW15X3RpbWVyIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMKaW5kZXggZTEwMmFlYi4uOGZjZTg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLXBiMTFtcC5oPgogI2luY2x1ZGUgPG1hY2gvc2N1Lmg+CiAKKyNpbmNsdWRlICJjb3JlLmgiCisKIGV4dGVybiB2b2lkIHJlYWx2aWV3X3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOwogCiAvKgpAQCAtMzEsMTUgKzMzLDIwIEBACiAgKi8KIHZvbGF0aWxlIGludCBfX2NwdWluaXRkYXRhIHBlbl9yZWxlYXNlID0gLTE7CiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19yZWFsdmlld19lYl9tcCgpKQorCQlyZXR1cm4gX19pb19hZGRyZXNzKFJFQUxWSUVXX0VCMTFNUF9TQ1VfQkFTRSk7CisJZWxzZSBpZiAobWFjaGluZV9pc19yZWFsdmlld19wYjExbXAoKSkKKwkJcmV0dXJuIF9faW9fYWRkcmVzcyhSRUFMVklFV19UQzExTVBfU0NVX0JBU0UpOworCWVsc2UKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKikwOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBnZXRfY29yZV9jb3VudCh2b2lkKQogewogCXVuc2lnbmVkIGludCBuY29yZXM7Ci0Jdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IDA7Ci0KLQlpZiAobWFjaGluZV9pc19yZWFsdmlld19lYigpICYmIGNvcmVfdGlsZV9lYjExbXAoKSkKLQkJc2N1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX1NDVV9CQVNFKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX3JlYWx2aWV3X3BiMTFtcCgpKQotCQlzY3VfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19UQzExTVBfU0NVX0JBU0UpOworCXZvaWQgX19pb21lbSAqc2N1X2Jhc2UgPSBzY3VfYmFzZV9hZGRyKCk7CiAKIAlpZiAoc2N1X2Jhc2UpIHsKIAkJbmNvcmVzID0gX19yYXdfcmVhZGwoc2N1X2Jhc2UgKyBTQ1VfQ09ORklHKTsKQEAgLTU2LDE0ICs2Myw3IEBACiBzdGF0aWMgdm9pZCBzY3VfZW5hYmxlKHZvaWQpCiB7CiAJdTMyIHNjdV9jdHJsOwotCXZvaWQgX19pb21lbSAqc2N1X2Jhc2U7Ci0KLQlpZiAobWFjaGluZV9pc19yZWFsdmlld19lYigpICYmIGNvcmVfdGlsZV9lYjExbXAoKSkKLQkJc2N1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX1NDVV9CQVNFKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX3JlYWx2aWV3X3BiMTFtcCgpKQotCQlzY3VfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19UQzExTVBfU0NVX0JBU0UpOwotCWVsc2UKLQkJQlVHKCk7CisJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKIAogCXNjdV9jdHJsID0gX19yYXdfcmVhZGwoc2N1X2Jhc2UgKyBTQ1VfQ1RSTCk7CiAJc2N1X2N0cmwgfD0gMTsKQEAgLTg4LDEwICs4OCw3IEBACiAJICogY29yZSAoZS5nLiB0aW1lciBpcnEpLCB0aGVuIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGVuYWJsZWQKIAkgKiBmb3IgdXM6IGRvIHNvCiAJICovCi0JaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWIoKSAmJiBjb3JlX3RpbGVfZWIxMW1wKCkpCi0JCWdpY19jcHVfaW5pdCgwLCBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX0dJQ19DUFVfQkFTRSkpOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfcGIxMW1wKCkpCi0JCWdpY19jcHVfaW5pdCgwLCBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfVEMxMU1QX0dJQ19DUFVfQkFTRSkpOworCWdpY19jcHVfaW5pdCgwLCBnaWNfY3B1X2Jhc2VfYWRkcik7CiAKIAkvKgogCSAqIGxldCB0aGUgcHJpbWFyeSBwcm9jZXNzb3Iga25vdyB3ZSdyZSBvdXQgb2YgdGhlCkBAIC0yMzIsOSArMjI5LDcgQEAKIAkgKiBkdW1teSAoIUNPTkZJR19MT0NBTF9USU1FUlMpLCBpdCB3YXMgYWxyZWFkeSByZWdpc3RlcnMgaW4KIAkgKiByZWFsdmlld190aW1lcl9pbml0CiAJICovCi0JaWYgKChtYWNoaW5lX2lzX3JlYWx2aWV3X2ViKCkgJiYgY29yZV90aWxlX2ViMTFtcCgpKSB8fAotCSAgICBtYWNoaW5lX2lzX3JlYWx2aWV3X3BiMTFtcCgpKQotCQlsb2NhbF90aW1lcl9zZXR1cChjcHUpOworCWxvY2FsX3RpbWVyX3NldHVwKCk7CiAjZW5kaWYKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKaW5kZXggZWI4MjllYi4uYmVkMzllZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfZWJfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KHJlYWx2aWV3X2ViX2lvX2Rlc2MsIEFSUkFZX1NJWkUocmVhbHZpZXdfZWJfaW9fZGVzYykpOwotCWlmIChjb3JlX3RpbGVfZWIxMW1wKCkpCisJaWYgKGNvcmVfdGlsZV9lYjExbXAoKSB8fCBjb3JlX3RpbGVfYTltcCgpKQogCQlpb3RhYmxlX2luaXQocmVhbHZpZXdfZWIxMW1wX2lvX2Rlc2MsIEFSUkFZX1NJWkUocmVhbHZpZXdfZWIxMW1wX2lvX2Rlc2MpKTsKIH0KIApAQCAtMjQyLDEyICsyNDIsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19lYl9ldGhfZGV2aWNlID0gewotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShyZWFsdmlld19lYl9ldGhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSByZWFsdmlld19lYl9ldGhfcmVzb3VyY2VzLAotfTsKLQogLyoKICAqIERldGVjdCBhbmQgcmVnaXN0ZXIgdGhlIGNvcnJlY3QgRXRoZXJuZXQgZGV2aWNlLiBSZWFsVmlldy9FQiByZXYgRAogICogcGxhdGZvcm1zIHVzZSB0aGUgbmV3ZXIgU01TQyBMQU45MTE4IEV0aGVybmV0IGNoaXAKQEAgLTI1NSwyNiArMjQ5LDI0IEBACiBzdGF0aWMgaW50IGV0aF9kZXZpY2VfcmVnaXN0ZXIodm9pZCkKIHsKIAl2b2lkIF9faW9tZW0gKmV0aF9hZGRyID0gaW9yZW1hcChSRUFMVklFV19FQl9FVEhfQkFTRSwgU1pfNEspOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwogCXUzMiBpZHJldjsKIAogCWlmICghZXRoX2FkZHIpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWRyZXYgPSByZWFkbChldGhfYWRkciArIDB4NTApOwotCWlmICgoaWRyZXYgJiAweEZGRkYwMDAwKSA9PSAweDAxMTgwMDAwKQotCQkvKiBTTVNDIExBTjkxMTggY2hpcCBwcmVzZW50ICovCi0JCXJlYWx2aWV3X2ViX2V0aF9kZXZpY2UubmFtZSA9ICJzbWM5MTF4IjsKLQllbHNlCi0JCS8qIFNNU0MgOTFDMTExIGNoaXAgcHJlc2VudCAqLwotCQlyZWFsdmlld19lYl9ldGhfZGV2aWNlLm5hbWUgPSAic21jOTF4IjsKKwlpZiAoKGlkcmV2ICYgMHhGRkZGMDAwMCkgIT0gMHgwMTE4MDAwMCkKKwkJLyogU01TQyBMQU45MTE4IG5vdCBwcmVzZW50LCB1c2UgTEFOOTFDMTExIGluc3RlYWQgKi8KKwkJbmFtZSA9ICJzbWM5MXgiOwogCiAJaW91bm1hcChldGhfYWRkcik7Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfZWJfZXRoX2RldmljZSk7CisJcmV0dXJuIHJlYWx2aWV3X2V0aF9yZWdpc3RlcihuYW1lLCByZWFsdmlld19lYl9ldGhfcmVzb3VyY2VzKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGdpY19pbml0X2lycSh2b2lkKQogewotCWlmIChjb3JlX3RpbGVfZWIxMW1wKCkpIHsKKwlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpIHsKIAkJdW5zaWduZWQgaW50IHBsZGN0cmw7CiAKIAkJLyogbmV3IGlycSBtb2RlICovCkBAIC0zNDIsMTAgKzMzNCw5IEBACiAJdGltZXIyX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUJfVElNRVIyXzNfQkFTRSk7CiAJdGltZXIzX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUJfVElNRVIyXzNfQkFTRSkgKyAweDIwOwogCi0JaWYgKGNvcmVfdGlsZV9lYjExbXAoKSkgeworCWlmIChjb3JlX3RpbGVfZWIxMW1wKCkgfHwgY29yZV90aWxlX2E5bXAoKSkgewogI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLQkJdHdkX2Jhc2VfYWRkciA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19FQjExTVBfVFdEX0JBU0UpOwotCQl0d2Rfc2l6ZSA9IFJFQUxWSUVXX0VCMTFNUF9UV0RfU0laRTsKKwkJdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX1RXRF9CQVNFKTsKICNlbmRpZgogCQl0aW1lcl9pcnEgPSBJUlFfRUIxMU1QX1RJTUVSMF8xOwogCX0gZWxzZQpAQCAtMzYyLDcgKzM1Myw3IEBACiB7CiAJaW50IGk7CiAKLQlpZiAoY29yZV90aWxlX2ViMTFtcCgpKSB7CisJaWYgKGNvcmVfdGlsZV9lYjExbXAoKSB8fCBjb3JlX3RpbGVfYTltcCgpKSB7CiAJCXJlYWx2aWV3X2ViMTFtcF9maXh1cCgpOwogCiAjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKQEAgLTM3Miw4ICszNjMsNiBAQAogI2VuZGlmCiAJfQogCi0JY2xrX3JlZ2lzdGVyKCZyZWFsdmlld19jbGNkX2Nsayk7Ci0KIAlyZWFsdmlld19mbGFzaF9yZWdpc3RlcigmcmVhbHZpZXdfZWJfZmxhc2hfcmVzb3VyY2UsIDEpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfaTJjX2RldmljZSk7CiAJZXRoX2RldmljZV9yZWdpc3RlcigpOwpAQCAtMzkyLDcgKzM4MSw3IEBACiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwogCS5waHlzX2lvCT0gUkVBTFZJRVdfRUJfVUFSVDBfQkFTRSwKIAkuaW9fcGdfb2Zmc3QJPSAoSU9fQUREUkVTUyhSRUFMVklFV19FQl9VQVJUMF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBQSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCiAJLm1hcF9pbwkJPSByZWFsdmlld19lYl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcmVhbHZpZXdfZWJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYwppbmRleCBjY2NkYjNlLi44ZjA2ODNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKQEAgLTIyMiwxMyArMjIyLDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfcGIxMTc2X3Ntc2M5MTF4X2RldmljZSA9IHsKLQkubmFtZQkJPSAic21jOTExeCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJlYWx2aWV3X3BiMTE3Nl9zbXNjOTExeF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHJlYWx2aWV3X3BiMTE3Nl9zbXNjOTExeF9yZXNvdXJjZXMsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpCiB7CiAJLyogQVJNMTE3NiBEZXZDaGlwIEdJQywgcHJpbWFyeSAqLwpAQCAtMjY1LDEwICsyNTgsOCBAQAogCWwyeDBfaW5pdChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEIxMTc2X0wyMjBfQkFTRSksIDB4MDA3MzAwMDAsIDB4ZmUwMDBmZmYpOwogI2VuZGlmCiAKLQljbGtfcmVnaXN0ZXIoJnJlYWx2aWV3X2NsY2RfY2xrKTsKLQogCXJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKCZyZWFsdmlld19wYjExNzZfZmxhc2hfcmVzb3VyY2UsIDEpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfcGIxMTc2X3Ntc2M5MTF4X2RldmljZSk7CisJcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKE5VTEwsIHJlYWx2aWV3X3BiMTE3Nl9zbXNjOTExeF9yZXNvdXJjZXMpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7CiAJCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKQEAgLTI4NCw3ICsyNzUsNyBAQAogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KIAkucGh5c19pbwk9IFJFQUxWSUVXX1BCMTE3Nl9VQVJUMF9CQVNFLAogCS5pb19wZ19vZmZzdAk9IChJT19BRERSRVNTKFJFQUxWSUVXX1BCMTE3Nl9VQVJUMF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBQSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCiAJLm1hcF9pbwkJPSByZWFsdmlld19wYjExNzZfbWFwX2lvLAogCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKIAkudGltZXIJCT0gJnJlYWx2aWV3X3BiMTE3Nl90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCmluZGV4IDhiODYzMTQuLjNlYmRiMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYwpAQCAtMjMwLDEzICsyMzAsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19wYjExbXBfc21zYzkxMXhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzbWM5MTF4IiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocmVhbHZpZXdfcGIxMW1wX3Ntc2M5MTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gcmVhbHZpZXdfcGIxMW1wX3Ntc2M5MTF4X3Jlc291cmNlcywKLX07Ci0KIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYjExbXBfY2ZfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMU1QX0NGX0JBU0UsCkBAIC0yOTIsOCArMjg1LDcgQEAKIAl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExTVBfVElNRVIyXzNfQkFTRSkgKyAweDIwOwogCiAjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCXR3ZF9iYXNlX2FkZHIgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfVEMxMU1QX1RXRF9CQVNFKTsKLQl0d2Rfc2l6ZSA9IFJFQUxWSUVXX1RDMTFNUF9UV0RfU0laRTsKKwl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19UQzExTVBfVFdEX0JBU0UpOwogI2VuZGlmCiAJcmVhbHZpZXdfdGltZXJfaW5pdChJUlFfVEMxMU1QX1RJTUVSMF8xKTsKIH0KQEAgLTMxMiwxMSArMzA0LDkgQEAKIAlsMngwX2luaXQoX19pb19hZGRyZXNzKFJFQUxWSUVXX1RDMTFNUF9MMjIwX0JBU0UpLCAweDAwNzkwMDAwLCAweGZlMDAwZmZmKTsKICNlbmRpZgogCi0JY2xrX3JlZ2lzdGVyKCZyZWFsdmlld19jbGNkX2Nsayk7Ci0KIAlyZWFsdmlld19mbGFzaF9yZWdpc3RlcihyZWFsdmlld19wYjExbXBfZmxhc2hfcmVzb3VyY2UsCiAJCQkJQVJSQVlfU0laRShyZWFsdmlld19wYjExbXBfZmxhc2hfcmVzb3VyY2UpKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X3BiMTFtcF9zbXNjOTExeF9kZXZpY2UpOworCXJlYWx2aWV3X2V0aF9yZWdpc3RlcihOVUxMLCByZWFsdmlld19wYjExbXBfc21zYzkxMXhfcmVzb3VyY2VzKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X2kyY19kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfcGIxMW1wX2NmX2RldmljZSk7CiAKQEAgLTMzNCw3ICszMjQsNyBAQAogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KIAkucGh5c19pbwk9IFJFQUxWSUVXX1BCMTFNUF9VQVJUMF9CQVNFLAogCS5pb19wZ19vZmZzdAk9IChJT19BRERSRVNTKFJFQUxWSUVXX1BCMTFNUF9VQVJUMF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYm9vdF9wYXJhbXMJPSBQSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCiAJLm1hcF9pbwkJPSByZWFsdmlld19wYjExbXBfbWFwX2lvLAogCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKIAkudGltZXIJCT0gJnJlYWx2aWV3X3BiMTFtcF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYmE4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjOTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0MzA3Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGJhOC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcmVhbHZpZXdfcGJhOF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19TWVNfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19TWVNfQkFTRSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQkE4X0dJQ19DUFVfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQkE4X0dJQ19DUFVfQkFTRSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQkE4X0dJQ19ESVNUX0JBU0UpLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEJBOF9HSUNfRElTVF9CQVNFKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1NDVExfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19TQ1RMX0JBU0UpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEJBOF9USU1FUjBfMV9CQVNFKSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQkE4X1RJTUVSMl8zX0JBU0UpLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEJBOF9USU1FUjJfM19CQVNFKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sCisjaWZkZWYgQ09ORklHX1BDSQorCXsKKwkJLnZpcnR1YWwJPSBQQ0lYX1VOSVRfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCQThfUENJX0JBU0UpLAorCQkubGVuZ3RoCQk9IFJFQUxWSUVXX1BCQThfUENJX0JBU0VfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19MTAorCXsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCQThfVUFSVDBfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQkE4X1VBUlQwX0JBU0UpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiYThfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KHJlYWx2aWV3X3BiYThfaW9fZGVzYywgQVJSQVlfU0laRShyZWFsdmlld19wYmE4X2lvX2Rlc2MpKTsKK30KKworLyoKKyAqIFJlYWxWaWV3IFBCQThDb3JlIEFNQkEgZGV2aWNlcworICovCisKKyNkZWZpbmUgR1BJTzJfSVJRCQl7IElSUV9QQkE4X0dQSU8yLCBOT19JUlEgfQorI2RlZmluZSBHUElPMl9ETUEJCXsgMCwgMCB9CisjZGVmaW5lIEdQSU8zX0lSUQkJeyBJUlFfUEJBOF9HUElPMywgTk9fSVJRIH0KKyNkZWZpbmUgR1BJTzNfRE1BCQl7IDAsIDAgfQorI2RlZmluZSBBQUNJX0lSUQkJeyBJUlFfUEJBOF9BQUNJLCBOT19JUlEgfQorI2RlZmluZSBBQUNJX0RNQQkJeyAweDgwLCAweDgxIH0KKyNkZWZpbmUgTU1DSTBfSVJRCQl7IElSUV9QQkE4X01NQ0kwQSwgSVJRX1BCQThfTU1DSTBCIH0KKyNkZWZpbmUgTU1DSTBfRE1BCQl7IDB4ODQsIDAgfQorI2RlZmluZSBLTUkwX0lSUQkJeyBJUlFfUEJBOF9LTUkwLCBOT19JUlEgfQorI2RlZmluZSBLTUkwX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgS01JMV9JUlEJCXsgSVJRX1BCQThfS01JMSwgTk9fSVJRIH0KKyNkZWZpbmUgS01JMV9ETUEJCXsgMCwgMCB9CisjZGVmaW5lIFBCQThfU01DX0lSUQkJeyBOT19JUlEsIE5PX0lSUSB9CisjZGVmaW5lIFBCQThfU01DX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgTVBNQ19JUlEJCXsgTk9fSVJRLCBOT19JUlEgfQorI2RlZmluZSBNUE1DX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgUEJBOF9DTENEX0lSUQkJeyBJUlFfUEJBOF9DTENELCBOT19JUlEgfQorI2RlZmluZSBQQkE4X0NMQ0RfRE1BCQl7IDAsIDAgfQorI2RlZmluZSBETUFDX0lSUQkJeyBJUlFfUEJBOF9ETUFDLCBOT19JUlEgfQorI2RlZmluZSBETUFDX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgU0NUTF9JUlEJCXsgTk9fSVJRLCBOT19JUlEgfQorI2RlZmluZSBTQ1RMX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgUEJBOF9XQVRDSERPR19JUlEJeyBJUlFfUEJBOF9XQVRDSERPRywgTk9fSVJRIH0KKyNkZWZpbmUgUEJBOF9XQVRDSERPR19ETUEJeyAwLCAwIH0KKyNkZWZpbmUgUEJBOF9HUElPMF9JUlEJCXsgSVJRX1BCQThfR1BJTzAsIE5PX0lSUSB9CisjZGVmaW5lIFBCQThfR1BJTzBfRE1BCQl7IDAsIDAgfQorI2RlZmluZSBHUElPMV9JUlEJCXsgSVJRX1BCQThfR1BJTzEsIE5PX0lSUSB9CisjZGVmaW5lIEdQSU8xX0RNQQkJeyAwLCAwIH0KKyNkZWZpbmUgUEJBOF9SVENfSVJRCQl7IElSUV9QQkE4X1JUQywgTk9fSVJRIH0KKyNkZWZpbmUgUEJBOF9SVENfRE1BCQl7IDAsIDAgfQorI2RlZmluZSBTQ0lfSVJRCQkJeyBJUlFfUEJBOF9TQ0ksIE5PX0lSUSB9CisjZGVmaW5lIFNDSV9ETUEJCQl7IDcsIDYgfQorI2RlZmluZSBQQkE4X1VBUlQwX0lSUQkJeyBJUlFfUEJBOF9VQVJUMCwgTk9fSVJRIH0KKyNkZWZpbmUgUEJBOF9VQVJUMF9ETUEJCXsgMTUsIDE0IH0KKyNkZWZpbmUgUEJBOF9VQVJUMV9JUlEJCXsgSVJRX1BCQThfVUFSVDEsIE5PX0lSUSB9CisjZGVmaW5lIFBCQThfVUFSVDFfRE1BCQl7IDEzLCAxMiB9CisjZGVmaW5lIFBCQThfVUFSVDJfSVJRCQl7IElSUV9QQkE4X1VBUlQyLCBOT19JUlEgfQorI2RlZmluZSBQQkE4X1VBUlQyX0RNQQkJeyAxMSwgMTAgfQorI2RlZmluZSBQQkE4X1VBUlQzX0lSUQkJeyBJUlFfUEJBOF9VQVJUMywgTk9fSVJRIH0KKyNkZWZpbmUgUEJBOF9VQVJUM19ETUEJCXsgMHg4NiwgMHg4NyB9CisjZGVmaW5lIFBCQThfU1NQX0lSUQkJeyBJUlFfUEJBOF9TU1AsIE5PX0lSUSB9CisjZGVmaW5lIFBCQThfU1NQX0RNQQkJeyA5LCA4IH0KKworLyogRlBHQSBQcmltZWNlbGxzICovCitBTUJBX0RFVklDRShhYWNpLAkiZnBnYTowNCIsCUFBQ0ksCQlOVUxMKTsKK0FNQkFfREVWSUNFKG1tYzAsCSJmcGdhOjA1IiwJTU1DSTAsCQkmcmVhbHZpZXdfbW1jMF9wbGF0X2RhdGEpOworQU1CQV9ERVZJQ0Uoa21pMCwJImZwZ2E6MDYiLAlLTUkwLAkJTlVMTCk7CitBTUJBX0RFVklDRShrbWkxLAkiZnBnYTowNyIsCUtNSTEsCQlOVUxMKTsKK0FNQkFfREVWSUNFKHVhcnQzLAkiZnBnYTowOSIsCVBCQThfVUFSVDMsCU5VTEwpOworCisvKiBEZXZDaGlwIFByaW1lY2VsbHMgKi8KK0FNQkFfREVWSUNFKHNtYywJImRldjowMCIsCVBCQThfU01DLAlOVUxMKTsKK0FNQkFfREVWSUNFKHNjdGwsCSJkZXY6ZTAiLAlTQ1RMLAkJTlVMTCk7CitBTUJBX0RFVklDRSh3ZG9nLAkiZGV2OmUxIiwJUEJBOF9XQVRDSERPRywgTlVMTCk7CitBTUJBX0RFVklDRShncGlvMCwJImRldjplNCIsCVBCQThfR1BJTzAsCU5VTEwpOworQU1CQV9ERVZJQ0UoZ3BpbzEsCSJkZXY6ZTUiLAlHUElPMSwJCU5VTEwpOworQU1CQV9ERVZJQ0UoZ3BpbzIsCSJkZXY6ZTYiLAlHUElPMiwJCU5VTEwpOworQU1CQV9ERVZJQ0UocnRjLAkiZGV2OmU4IiwJUEJBOF9SVEMsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc2NpMCwJImRldjpmMCIsCVNDSSwJCU5VTEwpOworQU1CQV9ERVZJQ0UodWFydDAsCSJkZXY6ZjEiLAlQQkE4X1VBUlQwLAlOVUxMKTsKK0FNQkFfREVWSUNFKHVhcnQxLAkiZGV2OmYyIiwJUEJBOF9VQVJUMSwJTlVMTCk7CitBTUJBX0RFVklDRSh1YXJ0MiwJImRldjpmMyIsCVBCQThfVUFSVDIsCU5VTEwpOworQU1CQV9ERVZJQ0Uoc3NwMCwJImRldjpmNCIsCVBCQThfU1NQLAlOVUxMKTsKKworLyogUHJpbWVjZWxscyBvbiB0aGUgTkVDIElTU1AgY2hpcCAqLworQU1CQV9ERVZJQ0UoY2xjZCwJImlzc3A6MjAiLAlQQkE4X0NMQ0QsCSZjbGNkX3BsYXRfZGF0YSk7CitBTUJBX0RFVklDRShkbWFjLAkiaXNzcDozMCIsCURNQUMsCQlOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkmZG1hY19kZXZpY2UsCisJJnVhcnQwX2RldmljZSwKKwkmdWFydDFfZGV2aWNlLAorCSZ1YXJ0Ml9kZXZpY2UsCisJJnVhcnQzX2RldmljZSwKKwkmc21jX2RldmljZSwKKwkmY2xjZF9kZXZpY2UsCisJJnNjdGxfZGV2aWNlLAorCSZ3ZG9nX2RldmljZSwKKwkmZ3BpbzBfZGV2aWNlLAorCSZncGlvMV9kZXZpY2UsCisJJmdwaW8yX2RldmljZSwKKwkmcnRjX2RldmljZSwKKwkmc2NpMF9kZXZpY2UsCisJJnNzcDBfZGV2aWNlLAorCSZhYWNpX2RldmljZSwKKwkmbW1jMF9kZXZpY2UsCisJJmttaTBfZGV2aWNlLAorCSZrbWkxX2RldmljZSwKK307CisKKy8qCisgKiBSZWFsVmlldyBQQi1BOCBwbGF0Zm9ybSBkZXZpY2VzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfcGJhOF9mbGFzaF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IFJFQUxWSUVXX1BCQThfRkxBU0gwX0JBU0UsCisJCS5lbmQJCT0gUkVBTFZJRVdfUEJBOF9GTEFTSDBfQkFTRSArIFJFQUxWSUVXX1BCQThfRkxBU0gwX1NJWkUgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAkJPSBSRUFMVklFV19QQkE4X0ZMQVNIMV9CQVNFLAorCQkuZW5kCQk9IFJFQUxWSUVXX1BCQThfRkxBU0gxX0JBU0UgKyBSRUFMVklFV19QQkE4X0ZMQVNIMV9TSVpFIC0gMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X3BiYThfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEJBOF9FVEhfQkFTRSwKKwkJLmVuZAkJPSBSRUFMVklFV19QQkE4X0VUSF9CQVNFICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJCT0gSVJRX1BCQThfRVRILAorCQkuZW5kCQk9IElSUV9QQkE4X0VUSCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfcGJhOF9jZl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAkJPSBSRUFMVklFV19QQkE4X0NGX0JBU0UsCisJCS5lbmQJCT0gUkVBTFZJRVdfUEJBOF9DRl9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAkJPSBSRUFMVklFV19QQkE4X0NGX01FTV9CQVNFLAorCQkuZW5kCQk9IFJFQUxWSUVXX1BCQThfQ0ZfTUVNX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CQk9IC0xLAkJLyogRklYTUU6IEZpbmQgY29ycmVjdCBpcnEgKi8KKwkJLmVuZAkJPSAtMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X3BiYThfY2ZfZGV2aWNlID0geworCS5uYW1lCQk9ICJjb21wYWN0Zmxhc2giLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShyZWFsdmlld19wYmE4X2NmX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcmVhbHZpZXdfcGJhOF9jZl9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpCit7CisJLyogQVJNIFBCLUE4IG9uLWJvYXJkIEdJQyAqLworCWdpY19jcHVfYmFzZV9hZGRyID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCQThfR0lDX0NQVV9CQVNFKTsKKwlnaWNfZGlzdF9pbml0KDAsIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQkE4X0dJQ19ESVNUX0JBU0UpLCBJUlFfUEJBOF9HSUNfU1RBUlQpOworCWdpY19jcHVfaW5pdCgwLCBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9HSUNfQ1BVX0JBU0UpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiYThfdGltZXJfaW5pdCh2b2lkKQoreworCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRSk7CisJdGltZXIxX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9USU1FUjBfMV9CQVNFKSArIDB4MjA7CisJdGltZXIyX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9USU1FUjJfM19CQVNFKTsKKwl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQkE4X1RJTUVSMl8zX0JBU0UpICsgMHgyMDsKKworCXJlYWx2aWV3X3RpbWVyX2luaXQoSVJRX1BCQThfVElNRVIwXzEpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciByZWFsdmlld19wYmE4X3RpbWVyID0geworCS5pbml0CQk9IHJlYWx2aWV3X3BiYThfdGltZXJfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19wYmE4X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHJlYWx2aWV3X3BiYThfZmxhc2hfcmVzb3VyY2UsCisJCQkJQVJSQVlfU0laRShyZWFsdmlld19wYmE4X2ZsYXNoX3Jlc291cmNlKSk7CisJcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKE5VTEwsIHJlYWx2aWV3X3BiYThfc21zYzkxMXhfcmVzb3VyY2VzKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X2kyY19kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfcGJhOF9jZl9kZXZpY2UpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7CisJCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKKwkJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoZCwgJmlvbWVtX3Jlc291cmNlKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTEVEUworCWxlZHNfZXZlbnQgPSByZWFsdmlld19sZWRzX2V2ZW50OworI2VuZGlmCit9CisKK01BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfUEJBOCwgIkFSTS1SZWFsVmlldyBQQi1BOCIpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX2lvCT0gUkVBTFZJRVdfUEJBOF9VQVJUMF9CQVNFLAorCS5pb19wZ19vZmZzdAk9IChJT19BRERSRVNTKFJFQUxWSUVXX1BCQThfVUFSVDBfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFBIWVNfT0ZGU0VUICsgMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IHJlYWx2aWV3X3BiYThfbWFwX2lvLAorCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKKwkudGltZXIJCT0gJnJlYWx2aWV3X3BiYThfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X3BiYThfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDlmMDU1M2IuLjIwZGE3ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0xOCw0OSArMTgsNiBAQAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCiAKIC8qCi0gKiBHQ0MgaXMgdG90YWxseSBjcmFwIGF0IGxvYWRpbmcvc3RvcmluZyBkYXRhLiAgV2UgdHJ5IHRvIHBlcnN1YWRlIGl0Ci0gKiB0byBkbyB0aGUgcmlnaHQgdGhpbmcgYnkgdXNpbmcgdGhlc2Ugd2hlcmVldmVyIHBvc3NpYmxlIGluc3RlYWQgb2YKLSAqIHRoZSBhYm92ZS4KLSAqLwotI2RlZmluZSBfX2FyY2hfYmFzZV9nZXRiKGIsbykJCQlcCi0gKHsJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fdiwgX19yID0gKGIpOwkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJImxkcmIJJTAsIFslMSwgJTJdIgkJXAotCQk6ICI9ciIgKF9fdikJCQlcCi0JCTogInIiIChfX3IpLCAiSXIiIChvKSk7CQlcCi0JX192OwkJCQkJXAotIH0pCi0KLSNkZWZpbmUgX19hcmNoX2Jhc2VfZ2V0bChiLG8pCQkJXAotICh7CQkJCQkJXAotCXVuc2lnbmVkIGludCBfX3YsIF9fciA9IChiKTsJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCi0JCSJsZHIJJTAsIFslMSwgJTJdIgkJXAotCQk6ICI9ciIgKF9fdikJCQlcCi0JCTogInIiIChfX3IpLCAiSXIiIChvKSk7CQlcCi0JX192OwkJCQkJXAotIH0pCi0KLSNkZWZpbmUgX19hcmNoX2Jhc2VfcHV0Yih2LGIsbykJCQlcCi0gKHsJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fciA9IChiKTsJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAotCQkic3RyYgklMCwgWyUxLCAlMl0iCQlcCi0JCToJCQkJXAotCQk6ICJyIiAodiksICJyIiAoX19yKSwgIklyIiAobykpO1wKLSB9KQotCi0jZGVmaW5lIF9fYXJjaF9iYXNlX3B1dGwodixiLG8pCQkJXAotICh7CQkJCQkJXAotCXVuc2lnbmVkIGludCBfX3IgPSAoYik7CQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKLQkJInN0cgklMCwgWyUxLCAlMl0iCQlcCi0JCToJCQkJXAotCQk6ICJyIiAodiksICJyIiAoX19yKSwgIklyIiAobykpO1wKLSB9KQotCi0vKgogICogV2UgdXNlIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgYWRkcmVzc2luZyAtIFBDIHN0eWxlIGFkZHJlc3NlcywgYW5kIEFSTQogICogYWRkcmVzc2VzLiAgUEMgc3R5bGUgYWNjZXNzZXMgdGhlIFBDIGhhcmR3YXJlIHdpdGggdGhlIG5vcm1hbCBQQyBJTwogICogYWRkcmVzc2VzLCBlZyAweDNmOCBmb3Igc2VyaWFsIzEuICBBUk0gYWRkcmVzc2VzIGFyZSAweDgwMDAwMDAwKwpAQCAtMjMyLDE1ICsxODksMTMgQEAKIAlyZXN1bHQ7CQkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX2lvYWRkcmMocG9ydCkJCV9faW9hZGRyKHBvcnQpCi0KICNkZWZpbmUgaW5iKHApCSAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX2luYmMocCkgICAgOiBfX2luYihwKSkKICNkZWZpbmUgaW53KHApCSAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX2lud2MocCkgICAgOiBfX2ludyhwKSkKICNkZWZpbmUgaW5sKHApCSAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX2lubGMocCkgICAgOiBfX2lubChwKSkKICNkZWZpbmUgb3V0Yih2LHApCShfX2J1aWx0aW5fY29uc3RhbnRfcCgocCkpID8gX19vdXRiYyh2LHApIDogX19vdXRiKHYscCkpCiAjZGVmaW5lIG91dHcodixwKQkoX19idWlsdGluX2NvbnN0YW50X3AoKHApKSA/IF9fb3V0d2ModixwKSA6IF9fb3V0dyh2LHApKQogI2RlZmluZSBvdXRsKHYscCkJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX291dGxjKHYscCkgOiBfX291dGwodixwKSkKLSNkZWZpbmUgX19pb2FkZHIocCkJKF9fYnVpbHRpbl9jb25zdGFudF9wKChwKSkgPyBfX2lvYWRkcihwKSAgOiBfX2lvYWRkcmMocCkpCisKIC8qIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZCAqLwogI2RlZmluZSBpb2FkZHIocG9ydCkJKCh1bnNpZ25lZCBsb25nKV9faW9hZGRyKChwb3J0KSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDRjZTZjYTkuLjNkMjAzNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtNDQsMyArNDQsNCBAQAogCiAjZGVmaW5lIElSUV9USU1FUgkJSVJRX1RJTUVSMAogCisjZGVmaW5lIE5SX0lSUVMJCQkxMjgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9pc2EtZG1hLmgKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2RtYS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCmluZGV4IDM2MGI1NmYuLmJhZDcyMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBhcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvZG1hLmgKKyAqICBhcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKICAqCkBAIC0xMCwxMiArMTAsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKIAotLyoKLSAqIFRoaXMgaXMgdGhlIG1heGltdW0gRE1BIGFkZHJlc3MgdGhhdCBjYW4gYmUgRE1BZCB0by4KLSAqIFRoZXJlIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuICgweGQwMDAwMDAwIC0gMHhjMDAwMDAwMCkKLSAqIGJ5dGVzIG9mIFJBTS4KLSAqLwotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4ZDAwMDAwMDAKICNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwk4CiAKICNkZWZpbmUgRE1BXzAJCQkwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOWJmN2U0My4uNzgxOTFiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMjQsMTMgKzI0LDYgQEAKICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgxMDAwMDAwMCkKIAogLyoKLSAqIFRoZXNlIGFyZSBleGFjdGx5IHRoZSBzYW1lIG9uIHRoZSBSaXNjUEMgYXMgdGhlCi0gKiBwaHlzaWNhbCBtZW1vcnkgdmlldy4KLSAqLwotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpIF9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgX19waHlzX3RvX3ZpcnQoeCkKLQotLyoKICAqIENhY2hlIGZsdXNoaW5nIGFyZWEgLSBST00KICAqLwogI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMJCTB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDhmNDg3OGUuLmNmNTkwMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMTcsNyArMTcsNCBAQAogCiAjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MEMwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KSBfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpIF9fcGh5c190b192aXJ0KHgpCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCA5OWZkYzczLi42M2EzMGQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIGNvbmZpZyBDUFVfUzNDMjQxMAogCWJvb2wKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAorCXNlbGVjdCBDUFVfQVJNOTIwVAogCXNlbGVjdCBTM0MyNDEwX0NMT0NLCiAJc2VsZWN0IFMzQzI0MTBfR1BJTwogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQxMApAQCAtMzIsMTEgKzMzLDYgQEAKIAloZWxwCiAJICBHUElPIGNvZGUgZm9yIFMzQzI0MTAgYW5kIHNpbWlsYXIgcHJvY2Vzc29ycwogCi1jb25maWcgUzNDMjQxMF9DTE9DSwotCWJvb2wKLQloZWxwCi0JICBDbG9jayBjb2RlIGZvciB0aGUgUzNDMjQxMCwgYW5kIHNpbWlsYXIgcHJvY2Vzc29ycwotCiBjb25maWcgU0lNVEVDX05PUgogCWJvb2wKIAloZWxwCkBAIC04NCw2ICs4MCw3IEBACiAJc2VsZWN0IFBNX1NJTVRFQyBpZiBQTQogCXNlbGVjdCBTSU1URUNfTk9SCiAJc2VsZWN0IE1BQ0hfQkFTVF9JREUKKwlzZWxlY3QgUzNDMjRYWF9EQ0xLCiAJc2VsZWN0IElTQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgU2ltdGVjIEVsZWN0cm9uaWNzIEVCMjQxMElUWApAQCAtMTIxLDYgKzExOCw3IEBACiBjb25maWcgTUFDSF9WUjEwMDAKIAlib29sICJUaG9yY29tIFZSMTAwMCIKIAlzZWxlY3QgUE1fU0lNVEVDIGlmIFBNCisJc2VsZWN0IFMzQzI0WFhfRENMSwogCXNlbGVjdCBTSU1URUNfTk9SCiAJc2VsZWN0IE1BQ0hfQkFTVF9JREUKIAlzZWxlY3QgQ1BVX1MzQzI0MTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCAwMGYzMWY4Li5mY2EwMmY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfUE0pCSs9IHBtLm8gc2xlZXAubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfR1BJTykJKz0gZ3Bpby5vCi1vYmotJChDT05GSUdfUzNDMjQxMF9DTE9DSykJKz0gY2xvY2subwogCiAjIE1hY2hpbmUgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKaW5kZXggN2Q5MTRhNC4uNTUyYjRjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC0yNSwxMiArMjQsMTIgQEAKIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNkaS5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy1paXMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogCiBzdGF0aWMgc3RydWN0IHMzYzI0eHhfZG1hX21hcCBfX2luaXRkYXRhIHMzYzI0MTBfZG1hX21hcHBpbmdzW10gPSB7CiAJW0RNQUNIX1hEMF0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCA4OTFiNTNjLi4xMzM1OGNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTE2LDExICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0vKgotICogVGhpcyBpcyB0aGUgbWF4aW11bSBETUEgYWRkcmVzcyhwaHlzaWNhbCBhZGRyZXNzKSB0aGF0IGNhbiBiZSBETUFkIHRvLgotICoKLSAqLwotI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCTB4NDAwMDAwMDAKICNkZWZpbmUgTUFYX0RNQV9UUkFOU0ZFUl9TSVpFICAgMHgxMDAwMDAgLyogRGF0YSBVbml0IGlzIGhhbGYgd29yZCAgKi8KIAogLyogV2UgdXNlIGB2aXJ0dWFsYCBkbWEgY2hhbm5lbHMgdG8gaGlkZSB0aGUgZmFjdCB3ZSBoYXZlIG9ubHkgYSBsaW1pdGVkCkBAIC0yNTQsNyArMjQ5LDcgQEAKICAqIHJlcXVlc3QgYSBkbWEgY2hhbm5lbCBleGNsdXNpdmxleQogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KGRtYWNoX3QgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfcmVxdWVzdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKIAkJCSAgICAgICBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICosIHZvaWQgKmRldik7CiAKIApAQCAtMjYzLDE0ICsyNTgsMTQgQEAKICAqIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGRtYSBjaGFubmVsCiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX2N0cmwoZG1hY2hfdCBjaGFubmVsLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCk7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2N0cmwodW5zaWduZWQgaW50IGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKTsKIAogLyogczNjMjQxMF9kbWFfc2V0ZmxhZ3MKICAqCiAgKiBzZXQgdGhlIGNoYW5uZWwncyBmbGFncyB0byBhIGdpdmVuIHN0YXRlCiAqLwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKGRtYWNoX3QgY2hhbm5lbCwKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfc2V0ZmxhZ3ModW5zaWduZWQgaW50IGNoYW5uZWwsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKIAogLyogczNjMjQxMF9kbWFfZnJlZQpAQCAtMjc4LDcgKzI3Myw3IEBACiAgKiBmcmVlIHRoZSBkbWEgY2hhbm5lbCAod2lsbCBhbHNvIGFib3J0IGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zKQogKi8KIAotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9mcmVlKGRtYWNoX3QgY2hhbm5lbCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqKTsKK2V4dGVybiBpbnQgczNjMjQxMF9kbWFfZnJlZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqKTsKIAogLyogczNjMjQxMF9kbWFfZW5xdWV1ZQogICoKQEAgLTI4Nyw3ICsyODIsNyBAQAogICogZHJhaW5lZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBnaXZlbiB0byB0aGUgRE1BIHN5c3RlbS4KICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZW5xdWV1ZShkbWFjaF90IGNoYW5uZWwsIHZvaWQgKmlkLAorZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9lbnF1ZXVlKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICppZCwKIAkJCSAgICAgICBkbWFfYWRkcl90IGRhdGEsIGludCBzaXplKTsKIAogLyogczNjMjQxMF9kbWFfY29uZmlnCkBAIC0yOTUsNyArMjkwLDcgQEAKICAqIGNvbmZpZ3VyZSB0aGUgZG1hIGNoYW5uZWwKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfY29uZmlnKGRtYWNoX3QgY2hhbm5lbCwgaW50IHhmZXJ1bml0LCBpbnQgZGNvbik7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX2NvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaW50IHhmZXJ1bml0LCBpbnQgZGNvbik7CiAKIC8qIHMzYzI0MTBfZG1hX2RldmNvbmZpZwogICoKQEAgLTMxMCwxMSArMzA1LDExIEBACiAgKiBnZXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIGRtYSB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYXQKICovCiAKLWV4dGVybiBpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24oZG1hY2hfdCBjaGFubmVsLAorZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbih1bnNpZ25lZCBpbnQgY2hhbm5lbCwKIAkJCQkgICBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRlc3QpOwogCi1leHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9vcGZuKGRtYWNoX3QsIHMzYzI0MTBfZG1hX29wZm5fdCBydG4pOwotZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oZG1hY2hfdCwgczNjMjQxMF9kbWFfY2Jmbl90IHJ0bik7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9vcGZuKHVuc2lnbmVkIGludCwgczNjMjQxMF9kbWFfb3Bmbl90IHJ0bik7CitleHRlcm4gaW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbih1bnNpZ25lZCBpbnQsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pOwogCiAvKiBETUEgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWNvcmUuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5ZmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1jb3JlLmgKQEAgLTAsMCArMSwzNCBAQAorLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwMC9pbmNsdWRlL21hY2gvZ3Bpby1jb3JlLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0MyNDEwIC0gR1BJTyBjb3JlIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fQ09SRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19DT1JFX0ggX19GSUxFX18KKworI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKworZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIHMzYzI0eHhfZ3Bpb3NbXTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9saWJfZ2V0Y2hpcCh1bnNpZ25lZCBpbnQgcGluKQoreworCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwOworCisJaWYgKHBpbiA+IFMzQzI0MTBfR1BHMTApCisJCXJldHVybiBOVUxMOworCisJY2hpcCA9ICZzM2MyNHh4X2dwaW9zW3Bpbi8zMl07CisJcmV0dXJuIChTM0MyNDEwX0dQSU9fT0ZGU0VUKHBpbikgPiBjaGlwLT5jaGlwLm5ncGlvKSA/IGNoaXAgOiBOVUxMOworfQorCisjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzYjUyYjg2Li5lMDM0OWFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTUsNCArMTUsMTAgQEAKICNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQogI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAogCisvKiBzb21lIGJvYXJkcyByZXF1aXJlIGV4dHJhIGdwaW8gY2FwYWNpdHkgdG8gc3VwcG9ydCBleHRlcm5hbAorICogZGV2aWNlcyB0aGF0IG5lZWQgR1BJTy4KKyAqLworCisjZGVmaW5lIEFSQ0hfTlJfR1BJT1MJKDI1NiArIENPTkZJR19TM0MyNFhYX0dQSU9fRVhUUkEpCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDk1MGM3MWIuLjk1NjU5MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMzQsNiArMTM0LDggQEAKICNkZWZpbmUgSVJRX1MzQzI0NDNfSFNNTUMJUzNDMjQxMF9JUlEoMjApCQkvKiBJUlFfU0RJICovCiAjZGVmaW5lIElSUV9TM0MyNDQzX05BTkQJUzNDMjQxMF9JUlEoMjQpCQkvKiByZXNlcnZlZCAqLwogCisjZGVmaW5lIElSUV9IU01NQzAJCUlSUV9TM0MyNDQzX0hTTU1DCisKICNkZWZpbmUgSVJRX1MzQzI0NDNfTENEMQlTM0MyNDEwX0lSUVNVQigxNCkKICNkZWZpbmUgSVJRX1MzQzI0NDNfTENEMglTM0MyNDEwX0lSUVNVQigxNSkKICNkZWZpbmUgSVJRX1MzQzI0NDNfTENEMwlTM0MyNDEwX0lSUVNVQigxNikKQEAgLTE2MCw2ICsxNjIsMTIgQEAKICNkZWZpbmUgTlJfSVJRUyAoSVJRX1MzQzI0NDBfQUM5NysxKQogI2VuZGlmCiAKKy8qIGNvbXBhdGliaWxpdHkgZGVmaW5lLiAqLworI2RlZmluZSBJUlFfVUFSVDMJCUlSUV9TM0MyNDQzX1VBUlQzCisjZGVmaW5lIElSUV9TM0NVQVJUX1JYMwkJSVJRX1MzQzI0NDNfUlgzCisjZGVmaW5lIElSUV9TM0NVQVJUX1RYMwkJSVJRX1MzQzI0NDNfVFgzCisjZGVmaW5lIElSUV9TM0NVQVJUX0VSUjMJSVJRX1MzQzI0NDNfRVJSMworCiAvKiBPdXIgRklRcyBhcmUgcm91dGFibGUgZnJvbSBJUlFfRUlOVDAgdG8gSVJRX0FEQ1BBUkVOVCAqLwogI2RlZmluZSBGSVFfU1RBUlQJCUlSUV9FSU5UMAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaAppbmRleCAyM2M0NzBjLi4yNTVmZGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTEzLDM0ICsxMywyMCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01BUF9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfTUFQX0gKIAorI2luY2x1ZGUgPHBsYXQvbWFwLWJhc2UuaD4KICNpbmNsdWRlIDxwbGF0L21hcC5oPgogCiAjZGVmaW5lIFMzQzI0MTBfQUREUih4KQkJUzNDX0FERFIoeCkKIAotLyogaW50ZXJydXB0IGNvbnRyb2xsZXIgaXMgdGhlIGZpcnN0IHRoaW5nIHdlIHB1dCBpbiwgdG8gbWFrZQotICogdGhlIGFzc2VtYmx5IGNvZGUgZm9yIHRoZSBpcnEgZGV0ZWN0aW9uIGVhc2llcgotICovCi0jZGVmaW5lIFMzQzI0WFhfVkFfSVJRCSAgIFMzQ19WQV9JUlEKLSNkZWZpbmUgUzNDMjQxMF9QQV9JUlEJICAgKDB4NEEwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfSVJRCSAgIFNaXzFNCi0KLS8qIG1lbW9yeSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX01FTUNUUkwgUzNDX1ZBX01FTQotI2RlZmluZSBTM0MyNDEwX1BBX01FTUNUUkwgKDB4NDgwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfTUVNQ1RSTCBTWl8xTQotCiAvKiBVU0IgaG9zdCBjb250cm9sbGVyICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfVVNCSE9TVCAoMHg0OTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9VU0JIT1NUIFNaXzFNCiAKIC8qIERNQSBjb250cm9sbGVyICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfRE1BCSAgICgweDRCMDAwMDAwKQogI2RlZmluZSBTM0MyNFhYX1NaX0RNQQkgICBTWl8xTQogCiAvKiBDbG9jayBhbmQgUG93ZXIgbWFuYWdlbWVudCAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX0NMS1BXUiAgUzNDX1ZBX1NZUwogI2RlZmluZSBTM0MyNDEwX1BBX0NMS1BXUiAgKDB4NEMwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfQ0xLUFdSICBTWl8xTQogCiAvKiBMQ0QgY29udHJvbGxlciAqLwogI2RlZmluZSBTM0MyNDEwX1BBX0xDRAkgICAoMHg0RDAwMDAwMCkKQEAgLTQ4LDQ4ICszNCwxMiBAQAogCiAvKiBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgKi8KICNkZWZpbmUgUzNDMjQxMF9QQV9OQU5ECSAgICgweDRFMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX05BTkQJICAgU1pfMU0KLQotLyogVUFSVHMgKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9VQVJUCSAgIFMzQ19WQV9VQVJUCi0jZGVmaW5lIFMzQzI0MTBfUEFfVUFSVAkgICAoMHg1MDAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9VQVJUCSAgIFNaXzFNCi0KLS8qIFRpbWVycyAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX1RJTUVSICAgUzNDX1ZBX1RJTUVSCi0jZGVmaW5lIFMzQzI0MTBfUEFfVElNRVIgICAoMHg1MTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9USU1FUiAgIFNaXzFNCi0KLS8qIFVTQiBEZXZpY2UgcG9ydCAqLwotI2RlZmluZSBTM0MyNDEwX1BBX1VTQkRFViAgKDB4NTIwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfVVNCREVWICBTWl8xTQotCi0vKiBXYXRjaGRvZyAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX1dBVENIRE9HIFMzQ19WQV9XQVRDSERPRwotI2RlZmluZSBTM0MyNDEwX1BBX1dBVENIRE9HICgweDUzMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX1dBVENIRE9HIFNaXzFNCiAKIC8qIElJQyBoYXJkd2FyZSBjb250cm9sbGVyICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfSUlDCSAgICgweDU0MDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX0lJQwkgICBTWl8xTQogCiAvKiBJSVMgY29udHJvbGxlciAqLwogI2RlZmluZSBTM0MyNDEwX1BBX0lJUwkgICAoMHg1NTAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9JSVMJICAgU1pfMU0KLQotLyogR1BJTyBwb3J0cyAqLwotCi0vKiB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSBWQSBvZiB0aGlzIG11c3QgZW5zdXJlIHRoYXQKLSAqIGl0IGlzIHRoZSBzYW1lIGRpc3RhbmNlIGFwYXJ0IGZyb20gdGhlIFVBUlQgaW4gdGhlCi0gKiBwaHN5aWNhbCBhZGRyZXNzIHNwYWNlLCBhcyB0aGUgaW5pdGlhbCBtYXBwaW5nIGZvciB0aGUgSU8KLSAqIGlzIGRvbmUgYXMgYSAxOjEgbWFwaW5nLiBUaGlzIHB1dHMgaXQgKGN1cnJlbnRseSkgYXQKLSAqIDB4RkE4MDAwMDAsIHdoaWNoIGlzIG5vdCBpbiB0aGUgd2F5IG9mIGFueSBjdXJyZW50IG1hcHBpbmcKLSAqIGJ5IHRoZSBiYXNlIHN5c3RlbS4KLSovCi0KLSNkZWZpbmUgUzNDMjQxMF9QQV9HUElPCSAgICgweDU2MDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8JICAgKChTM0MyNDEwX1BBX0dQSU8gLSBTM0MyNFhYX1BBX1VBUlQpICsgUzNDMjRYWF9WQV9VQVJUKQotI2RlZmluZSBTM0MyNFhYX1NaX0dQSU8JICAgU1pfMU0KIAogLyogUlRDICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfUlRDCSAgICgweDU3MDAwMDAwKQpAQCAtOTcsMTUgKzQ3LDEyIEBACiAKIC8qIEFEQyAqLwogI2RlZmluZSBTM0MyNDEwX1BBX0FEQwkgICAoMHg1ODAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9BREMJICAgU1pfMU0KIAogLyogU1BJICovCiAjZGVmaW5lIFMzQzI0MTBfUEFfU1BJCSAgICgweDU5MDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX1NQSQkgICBTWl8xTQogCiAvKiBTREkgKi8KICNkZWZpbmUgUzNDMjQxMF9QQV9TREkJICAgKDB4NUEwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfU0RJCSAgIFNaXzFNCiAKIC8qIENBTUlGICovCiAjZGVmaW5lIFMzQzI0NDBfUEFfQ0FNSUYgICAoMHg0RjAwMDAwMCkKQEAgLTEyMCwxMyArNjcsNiBAQAogI2RlZmluZSBTM0MyNDQzX1BBX0hTTU1DICAgKDB4NEE4MDAwMDApCiAjZGVmaW5lIFMzQzI0NDNfU1pfSFNNTUMgICAoMjU2KQogCi0vKiBJU0Egc3R5bGUgSU8sIGZvciBlYWNoIG1hY2hpbmUgdG8gc29ydCBvdXQgbWFwcGluZ3MgZm9yLCBpZiBpdAotICogaW1wbGVtZW50cyBpdC4gV2UgcmVzZXJ2ZSB0d28gMTZNIHJlZ2lvbnMgZm9yIElTQS4KLSAqLwotCi0jZGVmaW5lIFMzQzI0WFhfVkFfSVNBX1dPUkQgIFMzQzI0MTBfQUREUigweDAyMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1ZBX0lTQV9CWVRFICBTM0MyNDEwX0FERFIoMHgwMzAwMDAwMCkKLQogLyogcGh5c2ljYWwgYWRkcmVzc2VzIG9mIGFsbCB0aGUgY2hpcC1zZWxlY3QgYXJlYXMgKi8KIAogI2RlZmluZSBTM0MyNDEwX0NTMCAoMHgwMDAwMDAwMCkKQEAgLTE1MiwyNyArOTIsMTYgQEAKICNkZWZpbmUgUzNDMjRYWF9QQV9USU1FUiAgICBTM0MyNDEwX1BBX1RJTUVSCiAjZGVmaW5lIFMzQzI0WFhfUEFfVVNCREVWICAgUzNDMjQxMF9QQV9VU0JERVYKICNkZWZpbmUgUzNDMjRYWF9QQV9XQVRDSERPRyBTM0MyNDEwX1BBX1dBVENIRE9HCi0jZGVmaW5lIFMzQzI0WFhfUEFfSUlDICAgICAgUzNDMjQxMF9QQV9JSUMKICNkZWZpbmUgUzNDMjRYWF9QQV9JSVMgICAgICBTM0MyNDEwX1BBX0lJUwogI2RlZmluZSBTM0MyNFhYX1BBX0dQSU8gICAgIFMzQzI0MTBfUEFfR1BJTwogI2RlZmluZSBTM0MyNFhYX1BBX1JUQyAgICAgIFMzQzI0MTBfUEFfUlRDCiAjZGVmaW5lIFMzQzI0WFhfUEFfQURDICAgICAgUzNDMjQxMF9QQV9BREMKICNkZWZpbmUgUzNDMjRYWF9QQV9TUEkgICAgICBTM0MyNDEwX1BBX1NQSQorI2RlZmluZSBTM0MyNFhYX1BBX1NESSAgICAgIFMzQzI0MTBfUEFfU0RJCisjZGVmaW5lIFMzQzI0WFhfUEFfTkFORAkgICAgUzNDMjQxMF9QQV9OQU5ECiAKLS8qIGRlYWwgd2l0aCB0aGUgcmVnaXN0ZXJzIHRoYXQgbW92ZSB1bmRlciB0aGUgMjQxMi8yNDEzICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTMpCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotZXh0ZXJuIHZvaWQgX19pb21lbSAqczNjMjR4eF92YV9ncGlvMjsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMl9PTkxZCi0jZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgKFMzQzI0WFhfVkFfR1BJTyArIDB4MTApCi0jZWxzZQotI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIHMzYzI0eHhfdmFfZ3BpbzIKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgczNjMjR4eF92YV9ncGlvMiBTM0MyNFhYX1ZBX0dQSU8KLSNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiBTM0MyNFhYX1ZBX0dQSU8KLSNlbmRpZgorI2RlZmluZSBTM0NfUEFfSUlDICAgICAgICAgIFMzQzI0MTBfUEFfSUlDCisjZGVmaW5lIFMzQ19QQV9VQVJUCSAgICBTM0MyNFhYX1BBX1VBUlQKKyNkZWZpbmUgUzNDX1BBX0hTTU1DMAkgICAgUzNDMjQ0M19QQV9IU01NQwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggOTM3ODI2Mi4uNmYxZTU4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xMyw3ICsxMyw0IEBACiAKICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgzMDAwMDAwMCkKIAotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpIF9fdmlydF90b19waHlzKHgpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgX19waHlzX3RvX3ZpcnQoeCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCmluZGV4IGIzZjkwYWEuLjJhNWQ5MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCkBAIC00MiwxMyArNDIsNiBAQAogI2RlZmluZSBTM0MyNDEwX0NMS0NPTl9JSVMJICAgICAoMTw8MTcpCiAjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1NQSQkgICAgICgxPDwxOCkKIAotI2RlZmluZSBTM0MyNDEwX1BMTENPTl9NRElWU0hJRlQgICAgIDEyCi0jZGVmaW5lIFMzQzI0MTBfUExMQ09OX1BESVZTSElGVCAgICAgNAotI2RlZmluZSBTM0MyNDEwX1BMTENPTl9TRElWU0hJRlQgICAgIDAKLSNkZWZpbmUgUzNDMjQxMF9QTExDT05fTURJVk1BU0sJICAgICAoKDE8PCgxKygxOS0xMikpKS0xKQotI2RlZmluZSBTM0MyNDEwX1BMTENPTl9QRElWTUFTSwkgICAgICgoMTw8NSktMSkKLSNkZWZpbmUgUzNDMjQxMF9QTExDT05fU0RJVk1BU0sJICAgICAzCi0KIC8qIERDTEtDT04gcmVnaXN0ZXIgYWRkcmVzc2VzIGluIGdwaW8uaCAqLwogCiAjZGVmaW5lIFMzQzI0MTBfRENMS0NPTl9EQ0xLMEVOCSAgICAgKDE8PDApCkBAIC03NiwzMiArNjksNiBAQAogI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfU0xPV1ZBTCh4KQkoeCkKICNkZWZpbmUgUzNDMjQxMF9DTEtTTE9XX0dFVF9TTE9XVkFMKHgpCSgoeCkgJiA3KQogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1zM2MyNDEwX2dldF9wbGwodW5zaWduZWQgaW50IHBsbHZhbCwgdW5zaWduZWQgaW50IGJhc2VjbGspCi17Ci0JdW5zaWduZWQgaW50IG1kaXYsIHBkaXYsIHNkaXY7Ci0JdWludDY0X3QgZnZjbzsKLQotCW1kaXYgPSBwbGx2YWwgPj4gUzNDMjQxMF9QTExDT05fTURJVlNISUZUOwotCXBkaXYgPSBwbGx2YWwgPj4gUzNDMjQxMF9QTExDT05fUERJVlNISUZUOwotCXNkaXYgPSBwbGx2YWwgPj4gUzNDMjQxMF9QTExDT05fU0RJVlNISUZUOwotCi0JbWRpdiAmPSBTM0MyNDEwX1BMTENPTl9NRElWTUFTSzsKLQlwZGl2ICY9IFMzQzI0MTBfUExMQ09OX1BESVZNQVNLOwotCXNkaXYgJj0gUzNDMjQxMF9QTExDT05fU0RJVk1BU0s7Ci0KLQlmdmNvID0gKHVpbnQ2NF90KWJhc2VjbGsgKiAobWRpdiArIDgpOwotCWRvX2RpdihmdmNvLCAocGRpdiArIDIpIDw8IHNkaXYpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBpbnQpZnZjbzsKLX0KLQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQyKQogCiAvKiBleHRyYSByZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCmluZGV4IDUyODA4MGMuLjMyMTA3NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaApAQCAtMTA1MywxMyArMTA1Myw2IEBACiAjZGVmaW5lIFMzQzI0WFhfRVhUSU5UMQkgICBTM0MyNFhYX0dQSU9SRUcyKDB4OEMpCiAjZGVmaW5lIFMzQzI0WFhfRVhUSU5UMgkgICBTM0MyNFhYX0dQSU9SRUcyKDB4OTApCiAKLS8qIHZhbHVlcyBmb3IgUzNDMjQxMF9FWFRJTlQwLzEvMiAqLwotI2RlZmluZSBTM0MyNDEwX0VYVElOVF9MT1dMRVYJICgweDAwKQotI2RlZmluZSBTM0MyNDEwX0VYVElOVF9ISUxFVgkgKDB4MDEpCi0jZGVmaW5lIFMzQzI0MTBfRVhUSU5UX0ZBTExFREdFCSAoMHgwMikKLSNkZWZpbmUgUzNDMjQxMF9FWFRJTlRfUklTRUVER0UJICgweDA0KQotI2RlZmluZSBTM0MyNDEwX0VYVElOVF9CT1RIRURHRQkgKDB4MDYpCi0KIC8qIGludGVycnVwdCBmaWx0ZXJpbmcgY29ucnJvbCBmb3IgRUlOVDE2Li5FSU5UMjMgKi8KICNkZWZpbmUgUzNDMjQxMF9FSU5GTFQwCSAgIFMzQzI0MTBfR1BJT1JFRygweDk0KQogI2RlZmluZSBTM0MyNDEwX0VJTkZMVDEJICAgUzNDMjQxMF9HUElPUkVHKDB4OTgpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAppbmRleCA0NmQ0NmY1Li43NzRmM2FkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTIyLDUgKzIyLDEyIEBACiAJdm9pZCAoKnNldF9jcykoc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnNwaSwgaW50IGNzLCBpbnQgcG9sKTsKIH07CiAKKy8qIFN0YW5kYXJkIHNldHVwIC8gc3VzcGVuZCByb3V0aW5lcyBmb3IgU1BJIEdQSU8gcGlucy4gKi8KKworZXh0ZXJuIHZvaWQgczNjMjR4eF9zcGlfZ3Bpb2NmZ19idXMwX2dwZTExXzEyXzEzKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksCisJCQkJCQkgaW50IGVuYWJsZSk7CisKK2V4dGVybiB2b2lkIHMzYzI0eHhfc3BpX2dwaW9jZmdfYnVzMV9ncGc1XzZfNyhzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyAqc3BpLAorCQkJCQkgICAgICBpbnQgZW5hYmxlKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLXJlc2V0LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS1yZXNldC5oCmluZGV4IDQzNTM1YTAuLjc2MTNkMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLXJlc2V0LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0tcmVzZXQuaApAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aWNrLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3RpY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRkYTQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aWNrLmgKQEAgLTAsMCArMSwxNSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aWNrLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzI0MTAgLSB0aW1lciB0aWNrIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIFNSQ1BORF9USU1FUjQgKDE8PChJUlFfVElNRVI0IC0gSVJRX0VJTlQwKSkKKworc3RhdGljIGlubGluZSBpbnQgczNjMjR4eF9vc3RpbWVyX3BlbmRpbmcodm9pZCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoUzNDMjQxMF9TUkNQTkQpICYgU1JDUE5EX1RJTUVSNDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggYWIzOTQ5MS4uYzk0MzIxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTEsMyArMSw0IEBACisKIC8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFtbG01OTAwLmMKaW5kZXggZDA2MWZlYS4uNmQ2OTk1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbWxtNTkwMC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKQEAgLTE1MCw3ICsxNTEsNyBAQAogI2VuZGlmCiAJJnMzY19kZXZpY2VfYWRjLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV91c2IsCiAgCSZzM2NfZGV2aWNlX3J0YywKIAkmczNjX2RldmljZV91c2JnYWRnZXQsCkBAIC0yMzMsNiArMjM0LDcgQEAKICNpZmRlZiBDT05GSUdfRkJfUzNDMjQxMAogCXMzYzI0eHhfZmJfc2V0X3BsYXRkYXRhKCZhbWxtNTkwMF9mYl9pbmZvKTsKICNlbmRpZgorCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhbWxtNTkwMF9kZXZpY2VzLCBBUlJBWV9TSVpFKGFtbG01OTAwX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCmluZGV4IDhkYjljNzAuLjAxYmQ3NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKQEAgLTQ0LDggKzQ0LDggQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CkBAIC00MDYsNyArNDA2LDcgQEAKICAqIHN0YW5kYXJkIDEwMEtIeiBpMmMgYnVzIGZyZXF1ZW5jeQogKi8KIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBiYXN0X2kyY19pbmZvID0geworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBfX2luaXRkYXRhIGJhc3RfaTJjX2luZm8gPSB7CiAJLmZsYWdzCQk9IDAsCiAJLnNsYXZlX2FkZHIJPSAweDEwLAogCS5idXNfZnJlcQk9IDEwMCoxMDAwLApAQCAtNTUzLDcgKzU1Myw3IEBACiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAgCSZzM2NfZGV2aWNlX3J0YywKIAkmczNjX2RldmljZV9uYW5kLAogCSZiYXN0X2RldmljZV9kbTlrLApAQCAtNTg4LDcgKzU4OCw4IEBACiAJczNjMjR4eF9yZWdpc3Rlcl9jbG9ja3MoYmFzdF9jbG9ja3MsIEFSUkFZX1NJWkUoYmFzdF9jbG9ja3MpKTsKIAogCXMzY19kZXZpY2VfbmFuZC5kZXYucGxhdGZvcm1fZGF0YSA9ICZiYXN0X25hbmRfaW5mbzsKLQlzM2NfZGV2aWNlX2kyYy5kZXYucGxhdGZvcm1fZGF0YSA9ICZiYXN0X2kyY19pbmZvOworCisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKCZiYXN0X2kyY19pbmZvKTsKIAogCXMzYzI0eHhfaW5pdF9pbyhiYXN0X2lvZGVzYywgQVJSQVlfU0laRShiYXN0X2lvZGVzYykpOwogCXMzYzI0eHhfaW5pdF9jbG9ja3MoMCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCA5ODcxNmQwLi44MjFhMTY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTM4LDExICszOCwxMyBAQAogI2luY2x1ZGUgPG1hY2gvaDE5NDAuaD4KICNpbmNsdWRlIDxtYWNoL2gxOTQwLWxhdGNoLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvdWRjLmg+CisjaW5jbHVkZSA8cGxhdC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogCiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbGwuaD4KICNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaDE5NDBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKQEAgLTE4Myw3ICsxODUsNyBAQAogCSZzM2NfZGV2aWNlX3VzYiwKIAkmczNjX2RldmljZV9sY2QsCiAJJnMzY19kZXZpY2Vfd2R0LAotCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9pMmMwLAogCSZzM2NfZGV2aWNlX2lpcywKIAkmczNjX2RldmljZV91c2JnYWRnZXQsCiAJJnMzY19kZXZpY2VfbGVkcywKQEAgLTIxNSw2ICsyMTcsNyBAQAogCiAJczNjMjR4eF9mYl9zZXRfcGxhdGRhdGEoJmgxOTQwX2ZiX2luZm8pOwogIAlzM2MyNHh4X3VkY19zZXRfcGxhdGRhdGEoJmgxOTQwX3VkY19jZmcpOworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCS8qIFR1cm4gb2ZmIHN1c3BlbmQgb24gYm90aCBVU0IgcG9ydHMsIGFuZCBzd2l0Y2ggdGhlCiAJICogc2VsZWN0YWJsZSBVU0IgcG9ydCB0byBVU0IgZGV2aWNlIG1vZGUuICovCkBAIC0yMjMsMTAgKzIyNiw5IEBACiAJCQkgICAgICBTM0MyNDEwX01JU0NDUl9VU0JTVVNQTkQwIHwKIAkJCSAgICAgIFMzQzI0MTBfTUlTQ0NSX1VTQlNVU1BORDEsIDB4MCk7CiAKLQl0bXAgPSAoCi0JCSAweDc4IDw8IFMzQzI0MTBfUExMQ09OX01ESVZTSElGVCkKLQkgICAgICB8ICgweDAyIDw8IFMzQzI0MTBfUExMQ09OX1BESVZTSElGVCkKLQkgICAgICB8ICgweDAzIDw8IFMzQzI0MTBfUExMQ09OX1NESVZTSElGVCk7CisJdG1wID0gICAoMHg3OCA8PCBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQpCisJICAgICAgfCAoMHgwMiA8PCBTM0MyNFhYX1BMTENPTl9QRElWU0hJRlQpCisJICAgICAgfCAoMHgwMyA8PCBTM0MyNFhYX1BMTENPTl9TRElWU0hJRlQpOwogCXdyaXRlbCh0bXAsIFMzQzI0MTBfVVBMTENPTik7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhoMTk0MF9kZXZpY2VzLCBBUlJBWV9TSVpFKGgxOTQwX2RldmljZXMpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKaW5kZXggODI1MDU1MS4uMDVhNWU4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTQwLDE0ICszOSwxNCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL2lpYy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogCiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG4zMF9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KQEAgLTMyMCw3ICszMTksNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm4zMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV9sY2QsCiAJJnMzY19kZXZpY2Vfd2R0LAotCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9pMmMwLAogCSZzM2NfZGV2aWNlX2lpcywKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2VfdXNiZ2FkZ2V0LApAQCAtMzMyLDcgKzMzMSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbjM1X2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAogCSZzM2NfZGV2aWNlX3VzYmdhZGdldCwKIAkmbjM1X2J1dHRvbl9kZXZpY2UsCkBAIC01MDEsNyArNTAwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBuMzBfaW5pdCh2b2lkKQogewogCXMzYzI0eHhfZmJfc2V0X3BsYXRkYXRhKCZuMzBfZmJfaW5mbyk7Ci0JczNjX2RldmljZV9pMmMuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbjMwX2kyY2NmZzsKKwlzM2NfZGV2aWNlX2kyYzAuZGV2LnBsYXRmb3JtX2RhdGEgPSAmbjMwX2kyY2NmZzsKIAlzM2MyNHh4X3VkY19zZXRfcGxhdGRhdGEoJm4zMF91ZGNfY2ZnKTsKIAogCS8qIFR1cm4gb2ZmIHN1c3BlbmQgb24gYm90aCBVU0IgcG9ydHMsIGFuZCBzd2l0Y2ggdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKaW5kZXggZDgyNTVjZi4uZjZjNzI2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb3RvbTExX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CkBAIC05NCw3ICs5NSw3IEBACiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAogIAkmczNjX2RldmljZV9ydGMsCiAJJm90b21fZGV2aWNlX25vciwKQEAgLTEwOSw2ICsxMTAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb3RvbTExX2luaXQodm9pZCkKIHsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMob3RvbTExX2RldmljZXMsIEFSUkFZX1NJWkUob3RvbTExX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcXQyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwppbmRleCA2NjE4MDdlLi45Njc4YTUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwpAQCAtNTAsMTAgKzUwLDExIEBACiAjaW5jbHVkZSA8bWFjaC9sZWRzLWdwaW8uaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L25hbmQuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGktZ3Bpby5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi1zbWRrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CkBAIC0yNDcsNyArMjQ4LDcgQEAKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2VfbGNkLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV9paXMsCiAJJnMzY19kZXZpY2Vfc2RpLAogCSZzM2NfZGV2aWNlX3VzYmdhZGdldCwKQEAgLTM0OSw2ICszNTAsNyBAQAogCXMzYzI0MTBfZ3Bpb19zZXRwaW4oUzNDMjQxMF9HUEIwLCAxKTsKIAogCXMzYzI0eHhfdWRjX3NldF9wbGF0ZGF0YSgmcXQyNDEwX3VkY19jZmcpOworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEI1LCBTM0MyNDEwX0dQSU9fT1VUUFVUKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKaW5kZXggMTUyNTI3Yi4uYzQ5MTI2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogCiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KQEAgLTg5LDcgKzkwLDcgQEAKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2VfbGNkLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV9paXMsCiB9OwogCkBAIC0xMDIsNiArMTAzLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNtZGsyNDEwX2luaXQodm9pZCkKIHsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc21kazI0MTBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrMjQxMF9kZXZpY2VzKSk7CiAJc21ka19tYWNoaW5lX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXRjdF9oYW1tZXIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXRjdF9oYW1tZXIuYwppbmRleCAzMDlkY2Y0Li44ZmRiMDQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdGN0X2hhbW1lci5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKQEAgLTEyNyw3ICsxMjgsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRjdF9oYW1tZXJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfYWRjLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2VfcnRjLAogCSZzM2NfZGV2aWNlX3VzYmdhZGdldCwKQEAgLTE0Niw2ICsxNDcsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgdGN0X2hhbW1lcl9pbml0KHZvaWQpCiB7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHRjdF9oYW1tZXJfZGV2aWNlcywgQVJSQVlfU0laRSh0Y3RfaGFtbWVyX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwppbmRleCA5NDEzNTNhLi42MWExZWE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKICNpbmNsdWRlICJ1c2Itc2ltdGVjLmgiCiAjaW5jbHVkZSAibm9yLXNpbXRlYy5oIgpAQCAtMzM0LDcgKzMzNSw3IEBACiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfYWRjLAogCSZzZXJpYWxfZGV2aWNlLAogCSZ2cjEwMDBfZG05azAsCkBAIC0zODQsNiArMzg1LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHZyMTAwMF9pbml0KHZvaWQpCiB7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHZyMTAwMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHZyMTAwMF9kZXZpY2VzKSk7CiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCB2cjEwMDBfaTJjX2RldnMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwppbmRleCBhYzc5YjUzLi5mZWIxNDFiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yOCw2ICsyOSw4IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KKwogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KIApAQCAtMzUsNiArMzgsNyBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvcGxsLmg+CiAKIC8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KIApAQCAtNTksMjUgKzYzLDI4IEBACiAgKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uLgogKi8KIAotdm9pZCBfX2luaXQgczNjMjQxMF9tYXBfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBtYWNoX3NpemUpCit2b2lkIF9faW5pdCBzM2MyNDEwX21hcF9pbyh2b2lkKQogewotCS8qIHJlZ2lzdGVyIG91ciBpby10YWJsZXMgKi8KLQogCWlvdGFibGVfaW5pdChzM2MyNDEwX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDEwX2lvZGVzYykpOwotCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIG1hY2hfc2l6ZSk7CiB9CiAKLXZvaWQgX19pbml0IHMzYzI0MTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit2b2lkIF9faW5pdF9vcl9jcHVmcmVxIHMzYzI0MTBfc2V0dXBfY2xvY2tzKHZvaWQpCiB7CisJc3RydWN0IGNsayAqeHRhbF9jbGs7CiAJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyB4dGFsOwogCXVuc2lnbmVkIGxvbmcgZmNsazsKIAl1bnNpZ25lZCBsb25nIGhjbGs7CiAJdW5zaWduZWQgbG9uZyBwY2xrOwogCisJeHRhbF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7CisJeHRhbCA9IGNsa19nZXRfcmF0ZSh4dGFsX2Nsayk7CisJY2xrX3B1dCh4dGFsX2Nsayk7CisKIAkvKiBub3cgd2UndmUgZ290IG91ciBtYWNoaW5lIGJpdHMgaW5pdGlhbGlzZWQsIHdvcmsgb3V0IHdoYXQKIAkgKiBjbG9ja3Mgd2UndmUgZ290ICovCiAKLQlmY2xrID0gczNjMjQxMF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfTVBMTENPTiksIHh0YWwpOworCWZjbGsgPSBzM2MyNHh4X2dldF9wbGwoX19yYXdfcmVhZGwoUzNDMjQxMF9NUExMQ09OKSwgeHRhbCk7CiAKIAl0bXAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0RJVk4pOwogCkBAIC05NSw3ICsxMDIsMTMgQEAKIAkgKiBjb25zb2xlIHRvIHVzZSB0aGVtCiAJICovCiAKLQlzM2MyNHh4X3NldHVwX2Nsb2Nrcyh4dGFsLCBmY2xrLCBoY2xrLCBwY2xrKTsKKwlzM2MyNHh4X3NldHVwX2Nsb2NrcyhmY2xrLCBoY2xrLCBwY2xrKTsKK30KKwordm9pZCBfX2luaXQgczNjMjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3sKKwlzM2MyNHh4X3JlZ2lzdGVyX2Jhc2VjbG9ja3MoeHRhbCk7CisJczNjMjQxMF9zZXR1cF9jbG9ja3MoKTsKIAlzM2MyNDEwX2Jhc2VjbGtfYWRkKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKaW5kZXggYzU5YTlkMi4uY2E5OTU2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiBjb25maWcgQ1BVX1MzQzI0MTIKIAlib29sCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKIAlzZWxlY3QgUzNDMjQxMl9QTSBpZiBQTQogCXNlbGVjdCBTM0MyNDEyX0RNQSBpZiBTM0MyNDEwX0RNQQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYwppbmRleCA5NmQ5ZWIxLi5hMDM3ZGY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYwpAQCAtOTMsMTIgKzkzLDYgQEAKIAogLyogY2xvY2sgc2VsZWN0aW9ucyAqLwogCi0vKiBDUFUgRVhUQ0xLIGlucHV0ICovCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfZXh0ID0gewotCS5uYW1lCQk9ICJleHRjbGsiLAotCS5pZAkJPSAtMSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19lcmVmY2xrID0gewogCS5uYW1lCQk9ICJlcmVmY2xrIiwKIAkuaWQJCT0gLTEsCkBAIC03NzMsNSArNzY3LDYgQEAKIAkJczNjMjQxMl9jbGtjb25fZW5hYmxlKGNsa3AsIDApOwogCX0KIAorCXMzY19wd21jbGtfaW5pdCgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jCmluZGV4IGJhMDU5MWUuLjkxOTg1NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZG1hLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC0yNiwxMyArMjUsMTMgQEAKIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNkaS5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy1zM2MyNDEyLWlpcy5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy1paXMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogCiAjZGVmaW5lIE1BUCh4KSB7ICh4KXwgRE1BX0NIX1ZBTElELCAoeCl8IERNQV9DSF9WQUxJRCwgKHgpfCBETUFfQ0hfVkFMSUQsICh4KXwgRE1BX0NIX1ZBTElEIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCmluZGV4IGIwOGYxOGMuLmVjZGRiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0zMSw4ICszMCw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1wb3dlci5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CkBAIC01Miw3ICs1MSw4IEBACiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L3BtLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgaml2ZV9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogfTsKQEAgLTM5OCwxMSArMzk4LDEyIEBACiAJLmJ1c19udW0JPSAxLAogCS5waW5fY2xrCT0gUzNDMjQxMF9HUEc4LAogCS5waW5fbW9zaQk9IFMzQzI0MTBfR1BCOCwKKwkubnVtX2NoaXBzZWxlY3QJPSAxLAogCS5jaGlwX3NlbGVjdAk9IGppdmVfbGNkX3NwaV9jaGlwc2VsZWN0LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugaml2ZV9kZXZpY2VfbGNkc3BpID0gewotCS5uYW1lCQk9ICJzM2MyNHh4LXNwaS1ncGlvIiwKKwkubmFtZQkJPSAic3BpX3MzYzI0eHhfZ3BpbyIsCiAJLmlkCQk9IDEsCiAJLm51bV9yZXNvdXJjZXMgID0gMCwKIAkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmaml2ZV9sY2Rfc3BpLApAQCAtNDE5LDExICs0MjAsMTIgQEAKIAkuYnVzX251bQk9IDIsCiAJLnBpbl9jbGsJPSBTM0MyNDEwX0dQQjQsCiAJLnBpbl9tb3NpCT0gUzNDMjQxMF9HUEI5LAorCS5udW1fY2hpcHNlbGVjdAk9IDEsCiAJLmNoaXBfc2VsZWN0CT0gaml2ZV93bTg3NTBfY2hpcHNlbGVjdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGppdmVfZGV2aWNlX3dtODc1MCA9IHsKLQkubmFtZQkJPSAiczNjMjR4eC1zcGktZ3BpbyIsCisJLm5hbWUJCT0gInNwaV9zM2MyNHh4X2dwaW8iLAogCS5pZAkJPSAyLAogCS5udW1fcmVzb3VyY2VzICA9IDAsCiAJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmppdmVfd204NzUwX3NwaSwKQEAgLTQ1MCwxNCArNDUyLDE0IEBACiAKIC8qIEkyQyBidXMgYW5kIGRldmljZSBjb25maWd1cmF0aW9uLiAqLwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGppdmVfaTJjX2NmZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgaml2ZV9pMmNfY2ZnIF9faW5pdGRhdGEgPSB7CiAJLm1heF9mcmVxCT0gODAgKiAxMDAwLAogCS5idXNfZnJlcQk9IDUwICogMTAwMCwKIAkuZmxhZ3MJCT0gUzNDX0lJQ0ZMR19GSUxURVIsCiAJLnNkYV9kZWxheQk9IDIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGppdmVfaTJjX2RldnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaml2ZV9pMmNfZGV2c1tdIF9faW5pdGRhdGEgPSB7CiAJWzBdID0gewogCQlJMkNfQk9BUkRfSU5GTygibGlzMzAyZGwiLCAweDFjKSwKIAkJLmlycQk9IElSUV9FSU5UMTQsCkBAIC00NzAsNyArNDcyLDcgQEAKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2VfcnRjLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV9sY2QsCiAJJmppdmVfZGV2aWNlX2xjZHNwaSwKIAkmaml2ZV9kZXZpY2Vfd204NzUwLApAQCAtNjYzLDcgKzY2NSw3IEBACiAKIAlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhqaXZlX3NwaV9kZXZzLCBBUlJBWV9TSVpFKGppdmVfc3BpX2RldnMpKTsKIAotCXMzY19kZXZpY2VfaTJjLmRldi5wbGF0Zm9ybV9kYXRhID0gJmppdmVfaTJjX2NmZzsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoJmppdmVfaTJjX2NmZyk7CiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaml2ZV9pMmNfZGV2cywgQVJSQVlfU0laRShqaXZlX2kyY19kZXZzKSk7CiAKIAlwbV9wb3dlcl9vZmYgPSBqaXZlX3Bvd2VyX29mZjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXNtZGsyNDEzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCmluZGV4IGM3MTliNWE3Li5lYmE2NmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXNtZGsyNDEzLmMKQEAgLTM3LDcgKzM3LDggQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAKICNpbmNsdWRlIDxtYWNoL2lkbGUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3VkYy5oPgorI2luY2x1ZGUgPHBsYXQvdWRjLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAKICNpbmNsdWRlIDxwbGF0L3MzYzI0MTAuaD4KQEAgLTEwNSw3ICsxMDYsNyBAQAogCSZzM2NfZGV2aWNlX3VzYiwKIAkvLyZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAogCSZzM2NfZGV2aWNlX3VzYmdhZGdldCwKIH07CkBAIC0xNDIsNiArMTQzLDcgQEAKIAogCiAgCXMzYzI0eHhfdWRjX3NldF9wbGF0ZGF0YSgmc21kazI0MTNfdWRjX2NmZyk7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc21kazI0MTNfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrMjQxM19kZXZpY2VzKSk7CiAJc21ka19tYWNoaW5lX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jCmluZGV4IDRjZmExOWEuLjExZThhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYwpAQCAtMzksNyArMzksOCBAQAogI2luY2x1ZGUgPG1hY2gvaWRsZS5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L25hbmQuaD4KIAogI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvczNjMjQxMi5oPgpAQCAtMTIyLDcgKzEyMyw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdnN0bXNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV9paXMsCiAJJnMzY19kZXZpY2VfcnRjLAogCSZzM2NfZGV2aWNlX25hbmQsCkBAIC0xNTEsNiArMTUyLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHZzdG1zX2luaXQodm9pZCkKIHsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXModnN0bXNfZGV2aWNlcywgQVJSQVlfU0laRSh2c3Rtc19kZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9zM2MyNDEyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvczNjMjQxMi5jCmluZGV4IDMxMzc1OWMuLjViNWFiYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9zM2MyNDEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3MzYzI0MTIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CkBAIC0zMywxMyArMzQsMTUgQEAKICNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bWFjaC9pZGxlLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXBvd2VyLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpb2ouaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZHNjLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9yZWdzLXNwaS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtczNjMjQxMi5oPgogCiAjaW5jbHVkZSA8cGxhdC9zM2MyNDEyLmg+CkBAIC00Nyw2ICs1MCw3IEBACiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgogCiAjaWZuZGVmIENPTkZJR19DUFVfUzNDMjQxMl9PTkxZCiB2b2lkIF9faW9tZW0gKnMzYzI0eHhfdmFfZ3BpbzIgPSBTM0MyNFhYX1ZBX0dQSU87CkBAIC0xMzYsNyArMTQwLDcgQEAKICAqIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24uCiAqLwogCi12b2lkIF9faW5pdCBzM2MyNDEyX21hcF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IG1hY2hfc2l6ZSkKK3ZvaWQgX19pbml0IHMzYzI0MTJfbWFwX2lvKHZvaWQpCiB7CiAJLyogbW92ZSBiYXNlIG9mIElPICovCiAKQEAgLTE1MywyMCArMTU3LDI1IEBACiAJLyogcmVnaXN0ZXIgb3VyIGlvLXRhYmxlcyAqLwogCiAJaW90YWJsZV9pbml0KHMzYzI0MTJfaW9kZXNjLCBBUlJBWV9TSVpFKHMzYzI0MTJfaW9kZXNjKSk7Ci0JaW90YWJsZV9pbml0KG1hY2hfZGVzYywgbWFjaF9zaXplKTsKIH0KIAotdm9pZCBfX2luaXQgczNjMjQxMl9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3ZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQxMl9zZXR1cF9jbG9ja3Modm9pZCkKIHsKKwlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKIAl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHh0YWw7CiAJdW5zaWduZWQgbG9uZyBmY2xrOwogCXVuc2lnbmVkIGxvbmcgaGNsazsKIAl1bnNpZ25lZCBsb25nIHBjbGs7CiAKKwl4dGFsX2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKwl4dGFsID0gY2xrX2dldF9yYXRlKHh0YWxfY2xrKTsKKwljbGtfcHV0KHh0YWxfY2xrKTsKKwogCS8qIG5vdyB3ZSd2ZSBnb3Qgb3VyIG1hY2hpbmUgYml0cyBpbml0aWFsaXNlZCwgd29yayBvdXQgd2hhdAogCSAqIGNsb2NrcyB3ZSd2ZSBnb3QgKi8KIAotCWZjbGsgPSBzM2MyNDEwX2dldF9wbGwoX19yYXdfcmVhZGwoUzNDMjQxMF9NUExMQ09OKSwgeHRhbCoyKTsKKwlmY2xrID0gczNjMjR4eF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfTVBMTENPTiksIHh0YWwgKiAyKTsKIAogCWNsa19tcGxsLnJhdGUgPSBmY2xrOwogCkBAIC0xODMsMTEgKzE5MiwxNyBAQAogCXByaW50aygiUzNDMjQxMjogY29yZSAlbGQuJTAzbGQgTUh6LCBtZW1vcnkgJWxkLiUwM2xkIE1IeiwgcGVyaXBoZXJhbCAlbGQuJTAzbGQgTUh6XG4iLAogCSAgICAgICBwcmludF9taHooZmNsayksIHByaW50X21oeihoY2xrKSwgcHJpbnRfbWh6KHBjbGspKTsKIAorCXMzYzI0eHhfc2V0dXBfY2xvY2tzKGZjbGssIGhjbGssIHBjbGspOworfQorCit2b2lkIF9faW5pdCBzM2MyNDEyX2luaXRfY2xvY2tzKGludCB4dGFsKQorewogCS8qIGluaXRpYWxpc2UgdGhlIGNsb2NrcyBoZXJlLCB0byBhbGxvdyBvdGhlciB0aGluZ3MgbGlrZSB0aGUKIAkgKiBjb25zb2xlIHRvIHVzZSB0aGVtCiAJICovCiAKLQlzM2MyNHh4X3NldHVwX2Nsb2Nrcyh4dGFsLCBmY2xrLCBoY2xrLCBwY2xrKTsKKwlzM2MyNHh4X3JlZ2lzdGVyX2Jhc2VjbG9ja3MoeHRhbCk7CisJczNjMjQxMl9zZXR1cF9jbG9ja3MoKTsKIAlzM2MyNDEyX2Jhc2VjbGtfYWRkKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKaW5kZXggMjVkZTA0Mi4uY2RlNWFlOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiBjb25maWcgQ1BVX1MzQzI0NDAKIAlib29sCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgQ1BVX0FSTTkyMFQKIAlzZWxlY3QgUzNDMjQxMF9DTE9DSwogCXNlbGVjdCBTM0MyNDEwX1BNIGlmIFBNCiAJc2VsZWN0IFMzQzI0MTBfR1BJTwpAQCAtMjgsOCArMjksMTAgQEAKIGNvbmZpZyBNQUNIX0FOVUJJUwogCWJvb2wgIlNpbXRlYyBFbGVjdHJvbmljcyBBTlVCSVMiCiAJc2VsZWN0IENQVV9TM0MyNDQwCisJc2VsZWN0IFMzQzI0WFhfRENMSwogCXNlbGVjdCBQTV9TSU1URUMgaWYgUE0KIAlzZWxlY3QgSEFWRV9QQVRBX1BMQVRGT1JNCisJc2VsZWN0IFMzQzI0WFhfR1BJT19FWFRSQTY0CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBTaW10ZWMgRWxlY3Ryb25pY3MgQU5VQklTCiAJICBkZXZlbG9wbWVudCBzeXN0ZW0KQEAgLTM3LDcgKzQwLDkgQEAKIGNvbmZpZyBNQUNIX09TSVJJUwogCWJvb2wgIlNpbXRlYyBJTTI0NDBEMjAgKE9TSVJJUykgbW9kdWxlIgogCXNlbGVjdCBDUFVfUzNDMjQ0MAorCXNlbGVjdCBTM0MyNFhYX0RDTEsKIAlzZWxlY3QgUE1fU0lNVEVDIGlmIFBNCisJc2VsZWN0IFMzQzI0WFhfR1BJT19FWFRSQTEyOAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgU2ltdGVjIElNMjQ0MEQyMCBtb2R1bGUsIGFsc28KIAkgIGtub3duIGFzIHRoZSBPc2lyaXMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZG1hLmMKaW5kZXggMzIzMDNmNi4uNWI1ZWUwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC0yNSwxMiArMjQsMTIgQEAKIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNkaS5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy1paXMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogCiBzdGF0aWMgc3RydWN0IHMzYzI0eHhfZG1hX21hcCBfX2luaXRkYXRhIHMzYzI0NDBfZG1hX21hcHBpbmdzW10gPSB7CiAJW0RNQUNIX1hEMF0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hbnViaXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWFudWJpcy5jCmluZGV4IGUyYmVjYTQuLmIwNWQ1NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWFudWJpcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWFudWJpcy5jCkBAIC0zOSw3ICszOSw4IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgpAQCAtMzY2LDYgKzM2Nyw4IEBACiAJCS5tYXNrCT0gMCwKIAl9LAogCisJLmRldmljZXMJPSBTTTUwMV9VU0VfR1BJTywKKwogCS8qIHNldCB0aGUgU0RSQU0gYW5kIGJ1cyBjbG9ja3MgKi8KIAkubWNsawkJPSA3MiAqIE1IWiwKIAkubTF4Y2xrCQk9IDE0NCAqIE1IWiwKQEAgLTM3MywxMCArMzc2LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc201MDFfcGxhdGRhdGFfZ3Bpb19pMmMgYW51YmlzX3NtNTAxX2dwaW9faTJjW10gPSB7CiAJWzBdID0geworCQkuYnVzX251bQk9IDEsCiAJCS5waW5fc2NsCT0gNDQsCiAJCS5waW5fc2RhCT0gNDUsCiAJfSwKIAlbMV0gPSB7CisJCS5idXNfbnVtCT0gMiwKIAkJLnBpbl9zY2wJPSA0MCwKIAkJLnBpbl9zZGEJPSA0MSwKIAl9LApAQCAtMzg0LDYgKzM4OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc201MDFfcGxhdGRhdGEgYW51YmlzX3NtNTAxX3BsYXRkYXRhID0gewogCS5pbml0CQk9ICZhbnViaXNfc201MDFfaW5pdGRhdGEsCisJLmdwaW9fYmFzZQk9IC0xLAogCS5ncGlvX2kyYwk9IGFudWJpc19zbTUwMV9ncGlvX2kyYywKIAkuZ3Bpb19pMmNfbnIJPSBBUlJBWV9TSVpFKGFudWJpc19zbTUwMV9ncGlvX2kyYyksCiB9OwpAQCAtNDA0LDcgKzQxMCw3IEBACiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX3dkdCwKIAkmczNjX2RldmljZV9hZGMsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAgCSZzM2NfZGV2aWNlX3J0YywKIAkmczNjX2RldmljZV9uYW5kLAogCSZhbnViaXNfZGV2aWNlX2lkZTAsCkBAIC00NjgsNiArNDc0LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGFudWJpc19pbml0KHZvaWQpCiB7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGFudWJpc19kZXZpY2VzLCBBUlJBWV9TSVpFKGFudWJpc19kZXZpY2VzKSk7CiAKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBhbnViaXNfaTJjX2RldnMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCmluZGV4IDY2ODc2YzYuLjBhNmQwYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9mYi5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCkBAIC0zNSw3ICszNiw4IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgpAQCAtNDUsNiArNDcsNyBAQAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvbWNpLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQyNDQwZXZiX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogTm90aGluZyBoZXJlICovCkBAIC0xNjIsMTkgKzE2NSw2MCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIGF0MjQ0MGV2Yl9tY2lfcGRhdGEgPSB7CisJLmdwaW9fZGV0ZWN0CT0gUzNDMjQxMF9HUEcxMCwKK307CisKKy8qIDciIExDRCBwYW5lbCAqLworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5IGF0MjQ0MGV2Yl9sY2RfY2ZnIF9faW5pdGRhdGEgPSB7CisKKwkubGNkY29uNQk9IFMzQzI0MTBfTENEQ09ONV9GUk01NjUgfAorCQkJICBTM0MyNDEwX0xDRENPTjVfSU5WVkxJTkUgfAorCQkJICBTM0MyNDEwX0xDRENPTjVfSU5WVkZSQU1FIHwKKwkJCSAgUzNDMjQxMF9MQ0RDT041X1BXUkVOIHwKKwkJCSAgUzNDMjQxMF9MQ0RDT041X0hXU1dQLAorCisJLnR5cGUJCT0gUzNDMjQxMF9MQ0RDT04xX1RGVCwKKworCS53aWR0aAkJPSA4MDAsCisJLmhlaWdodAkJPSA0ODAsCisKKwkucGl4Y2xvY2sJPSAzMzMzMywgLyogSENMSyA2MCBNSHosIGRpdmlzb3IgMiAqLworCS54cmVzCQk9IDgwMCwKKwkueXJlcwkJPSA0ODAsCisJLmJwcAkJPSAxNiwKKwkubGVmdF9tYXJnaW4JPSA4OCwKKwkucmlnaHRfbWFyZ2luCT0gNDAsCisJLmhzeW5jX2xlbgk9IDEyOCwKKwkudXBwZXJfbWFyZ2luCT0gMzIsCisJLmxvd2VyX21hcmdpbgk9IDExLAorCS52c3luY19sZW4JPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvIGF0MjQ0MGV2Yl9mYl9pbmZvIF9faW5pdGRhdGEgPSB7CisJLmRpc3BsYXlzCT0gJmF0MjQ0MGV2Yl9sY2RfY2ZnLAorCS5udW1fZGlzcGxheXMJPSAxLAorCS5kZWZhdWx0X2Rpc3BsYXkgPSAwLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0MjQ0MGV2Yl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV91c2IsCiAJJnMzY19kZXZpY2Vfd2R0LAogCSZzM2NfZGV2aWNlX2FkYywKLQkmczNjX2RldmljZV9pMmMsCisJJnMzY19kZXZpY2VfaTJjMCwKIAkmczNjX2RldmljZV9ydGMsCiAJJnMzY19kZXZpY2VfbmFuZCwKKwkmczNjX2RldmljZV9zZGksCisJJnMzY19kZXZpY2VfbGNkLAogCSZhdDI0NDBldmJfZGV2aWNlX2V0aCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdDI0NDBldmJfbWFwX2lvKHZvaWQpCiB7CiAJczNjX2RldmljZV9uYW5kLmRldi5wbGF0Zm9ybV9kYXRhID0gJmF0MjQ0MGV2Yl9uYW5kX2luZm87CisJczNjX2RldmljZV9zZGkubmFtZSA9ICJzM2MyNDQwLXNkaSI7CisJczNjX2RldmljZV9zZGkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmYXQyNDQwZXZiX21jaV9wZGF0YTsKIAogCXMzYzI0eHhfaW5pdF9pbyhhdDI0NDBldmJfaW9kZXNjLCBBUlJBWV9TSVpFKGF0MjQ0MGV2Yl9pb2Rlc2MpKTsKIAlzM2MyNHh4X2luaXRfY2xvY2tzKDE2OTM0NDAwKTsKQEAgLTE4Myw2ICsyMjcsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXQyNDQwZXZiX2luaXQodm9pZCkKIHsKKwlzM2MyNHh4X2ZiX3NldF9wbGF0ZGF0YSgmYXQyNDQwZXZiX2ZiX2luZm8pOworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGF0MjQ0MGV2Yl9kZXZpY2VzLCBBUlJBWV9TSVpFKGF0MjQ0MGV2Yl9kZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1uZXhjb2Rlci5jCmluZGV4IGE1NDYzMDcuLjdhZWFhOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbmV4Y29kZXIuYwpAQCAtMzcsNiArMzcsNyBAQAogLy8jaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KIAogI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvczNjMjQ0MC5oPgpAQCAtMTA3LDcgKzEwOCw3IEBACiAJJnMzY19kZXZpY2VfdXNiLAogCSZzM2NfZGV2aWNlX2xjZCwKIAkmczNjX2RldmljZV93ZHQsCi0JJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAogIAkmczNjX2RldmljZV9ydGMsCiAJJnMzY19kZXZpY2VfY2FtaWYsCkBAIC0xNDIsNiArMTQzLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG5leGNvZGVyX2luaXQodm9pZCkKIHsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMobmV4Y29kZXJfZGV2aWNlcywgQVJSQVlfU0laRShuZXhjb2Rlcl9kZXZpY2VzKSk7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCmluZGV4IDIzNjFkNjAuLjQxYTAwZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCkBAIC0zNyw3ICszNyw4IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgpAQCAtMzM1LDcgKzMzNiw3IEBACiAvKiBTdGFuZGFyZCBPc2lyaXMgZGV2aWNlcyAqLwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3NpcmlzX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9pMmMwLAogCSZzM2NfZGV2aWNlX3dkdCwKIAkmczNjX2RldmljZV9uYW5kLAogCSZvc2lyaXNfcGNtY2lhLApAQCAtMzk4LDYgKzM5OSw4IEBACiAJc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvc2lyaXNfcG1fc3lzY2xhc3MpOwogCXN5c2Rldl9yZWdpc3Rlcigmb3NpcmlzX3BtX3N5c2Rldik7CiAKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CisKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBvc2lyaXNfaTJjX2RldnMsCiAJCQkJQVJSQVlfU0laRShvc2lyaXNfaTJjX2RldnMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYwppbmRleCA0ZDE0YzdjLi4xMmQzNzhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KIAogI2luY2x1ZGUgPG1hY2gvaDE5NDAuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvbmFuZC5oPgorI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KIAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KQEAgLTE3OSw3ICsxNzksNyBAQAogCSZzM2NfZGV2aWNlX3VzYiwKIAkmczNjX2RldmljZV9sY2QsCiAJJnMzY19kZXZpY2Vfd2R0LAotCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9pMmMwLAogCSZzM2NfZGV2aWNlX2lpcywKIAkmczNjX2RldmljZV9uYW5kLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1zbWRrMjQ0MC5jCmluZGV4IGZlZmVhYWEuLmRiNmVhZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9pZGxlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKICNpbmNsdWRlIDxwbGF0L3MzYzI0MTAuaD4KICNpbmNsdWRlIDxwbGF0L3MzYzI0NDAuaD4KQEAgLTE1Miw3ICsxNTMsNyBAQAogCSZzM2NfZGV2aWNlX3VzYiwKIAkmczNjX2RldmljZV9sY2QsCiAJJnMzY19kZXZpY2Vfd2R0LAotCSZzM2NfZGV2aWNlX2kyYywKKwkmczNjX2RldmljZV9pMmMwLAogCSZzM2NfZGV2aWNlX2lpcywKIH07CiAKQEAgLTE2Niw2ICsxNjcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNtZGsyNDQwX21hY2hpbmVfaW5pdCh2b2lkKQogewogCXMzYzI0eHhfZmJfc2V0X3BsYXRkYXRhKCZzbWRrMjQ0MF9mYl9pbmZvKTsKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoTlVMTCk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrMjQ0MF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGsyNDQwX2RldmljZXMpKTsKIAlzbWRrX21hY2hpbmVfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQyL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDIvS2NvbmZpZwppbmRleCAyNmQxMzFhLi5iMjg5ZDE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDIvS2NvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIGNvbmZpZyBDUFVfUzNDMjQ0MgogCWJvb2wKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAorCXNlbGVjdCBDUFVfQVJNOTIwVAogCXNlbGVjdCBTM0MyNDEwX0NMT0NLCiAJc2VsZWN0IFMzQzI0MTBfR1BJTwogCXNlbGVjdCBTM0MyNDEwX1BNIGlmIFBNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCmluZGV4IDE0MjUyZjUuLjIxMjE0MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9LY29uZmlnCkBAIC0yNCw2ICsyNCw3IEBACiAJYm9vbCAiU01ESzI0NDMiCiAJc2VsZWN0IENQVV9TM0MyNDQzCiAJc2VsZWN0IE1BQ0hfU01ESworCXNlbGVjdCBTM0NfREVWX0hTTU1DCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGFuIFNNREsyNDQzCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKaW5kZXggZjg1NGU3My4uMjc4NWQ2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCkBAIC0zOSw2ICszOCw4IEBACiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtczNjMjQ0My1jbG9jay5oPgogCisjaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgorCiAjaW5jbHVkZSA8cGxhdC9zM2MyNDQzLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC0xNDUsMTIgKzE0Niw2IEBACiAKIC8qIGNsb2NrIHNlbGVjdGlvbnMgKi8KIAotLyogQ1BVIEVYVENMSyBpbnB1dCAqLwotc3RhdGljIHN0cnVjdCBjbGsgY2xrX2V4dCA9IHsKLQkubmFtZQkJPSAiZXh0IiwKLQkuaWQJCT0gLTEsCi19OwotCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfbXBsbHJlZiA9IHsKIAkubmFtZQkJPSAibXBsbHJlZiIsCiAJLnBhcmVudAkJPSAmY2xrX3h0YWwsCkBAIC0xNjUsMTQgKzE2MCw2IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19lcGxscmVmOwotCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfZXBsbCA9IHsKLQkubmFtZQkJPSAiZXBsbCIsCi0JLnBhcmVudAkJPSAmY2xrX2VwbGxyZWYsCi0JLmlkCQk9IC0xLAotfTsKLQogc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyc19leHQgPSB7CiAJLm5hbWUJCT0gImkycy1leHQiLAogCS5pZAkJPSAtMSwKQEAgLTEwMTEsMjIgKzk5OCwyMCBAQAogCSZjbGtfcHJlZGl2LAogfTsKIAotdm9pZCBfX2luaXQgczNjMjQ0M19pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3ZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQ0M19zZXR1cF9jbG9ja3Modm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGVwbGxjb24gPSBfX3Jhd19yZWFkbChTM0MyNDQzX0VQTExDT04pOwogCXVuc2lnbmVkIGxvbmcgbXBsbGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0NDNfTVBMTENPTik7CiAJdW5zaWduZWQgbG9uZyBjbGtkaXYwID0gX19yYXdfcmVhZGwoUzNDMjQ0M19DTEtESVYwKTsKKwlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKKwl1bnNpZ25lZCBsb25nIHh0YWw7CiAJdW5zaWduZWQgbG9uZyBwbGw7CiAJdW5zaWduZWQgbG9uZyBmY2xrOwogCXVuc2lnbmVkIGxvbmcgaGNsazsKIAl1bnNpZ25lZCBsb25nIHBjbGs7Ci0Jc3RydWN0IGNsayAqY2xrcDsKLQlpbnQgcmV0OwotCWludCBwdHI7CiAKLQkvKiBzM2MyNDQzIHBhcmVudHMgaCBhbmQgcCBjbG9ja3MgZnJvbSBwcmVkaXYgKi8KLQljbGtfaC5wYXJlbnQgPSAmY2xrX3ByZWRpdjsKLQljbGtfcC5wYXJlbnQgPSAmY2xrX3ByZWRpdjsKKwl4dGFsX2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKwl4dGFsID0gY2xrX2dldF9yYXRlKHh0YWxfY2xrKTsKKwljbGtfcHV0KHh0YWxfY2xrKTsKIAogCXBsbCA9IHMzYzI0NDNfZ2V0X21wbGwobXBsbGNvbiwgeHRhbCk7CiAJY2xrX21zeXNjbGsucmF0ZSA9IHBsbDsKQEAgLTEwMzYsMTMgKzEwMjEsMjkgQEAKIAloY2xrIC89IHMzYzI0NDNfZ2V0X2hkaXYoY2xrZGl2MCk7CiAgCXBjbGsgPSBoY2xrIC8gKChjbGtkaXYwICYgUzNDMjQ0M19DTEtESVYwX0hBTEZfUENMSykgPyAyIDogMSk7CiAKLQlzM2MyNHh4X3NldHVwX2Nsb2Nrcyh4dGFsLCBmY2xrLCBoY2xrLCBwY2xrKTsKKwlzM2MyNHh4X3NldHVwX2Nsb2NrcyhmY2xrLCBoY2xrLCBwY2xrKTsKIAogCXByaW50aygiUzNDMjQ0MzogbXBsbCAlcyAlbGQuJTAzbGQgTUh6LCBjcHUgJWxkLiUwM2xkIE1IeiwgbWVtICVsZC4lMDNsZCBNSHosIHBjbGsgJWxkLiUwM2xkIE1IelxuIiwKIAkgICAgICAgKG1wbGxjb24gJiBTM0MyNDQzX1BMTENPTl9PRkYpID8gIm9mZiI6Im9uIiwKIAkgICAgICAgcHJpbnRfbWh6KHBsbCksIHByaW50X21oeihmY2xrKSwKIAkgICAgICAgcHJpbnRfbWh6KGhjbGspLCBwcmludF9taHoocGNsaykpOwogCisJczNjMjR4eF9zZXR1cF9jbG9ja3MoZmNsaywgaGNsaywgcGNsayk7Cit9CisKK3ZvaWQgX19pbml0IHMzYzI0NDNfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit7CisJc3RydWN0IGNsayAqY2xrcDsKKwl1bnNpZ25lZCBsb25nIGVwbGxjb24gPSBfX3Jhd19yZWFkbChTM0MyNDQzX0VQTExDT04pOworCWludCByZXQ7CisJaW50IHB0cjsKKworCS8qIHMzYzI0NDMgcGFyZW50cyBoIGFuZCBwIGNsb2NrcyBmcm9tIHByZWRpdiAqLworCWNsa19oLnBhcmVudCA9ICZjbGtfcHJlZGl2OworCWNsa19wLnBhcmVudCA9ICZjbGtfcHJlZGl2OworCisJczNjMjR4eF9yZWdpc3Rlcl9iYXNlY2xvY2tzKHh0YWwpOworCXMzYzI0NDNfc2V0dXBfY2xvY2tzKCk7CiAJczNjMjQ0M19jbGtfaW5pdHBhcmVudHMoKTsKIAogCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShjbGtzKTsgcHRyKyspIHsKQEAgLTEwNTYsNyArMTA1Nyw3IEBACiAJfQogCiAJY2xrX2VwbGwucmF0ZSA9IHMzYzI0NDNfZ2V0X2VwbGwoZXBsbGNvbiwgeHRhbCk7Ci0KKwljbGtfZXBsbC5wYXJlbnQgPSAmY2xrX2VwbGxyZWY7CiAJY2xrX3VzYl9idXMucGFyZW50ID0gJmNsa191c2JfYnVzX2hvc3Q7CiAKIAkvKiBlbnN1cmUgdXNiIGJ1cyBjbG9jayBpcyB3aXRoaW4gY29ycmVjdCByYXRlIG9mIDQ4TUh6ICovCkBAIC0xMTA1LDQgKzExMDYsNiBAQAogCiAJCShjbGtwLT5lbmFibGUpKGNsa3AsIDApOwogCX0KKworCXMzY19wd21jbGtfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2RtYS5jCmluZGV4IGY3M2NjYjIuLjJhNThhNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC0yNiwxMiArMjUsMTIgQEAKIAogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNkaS5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy1paXMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogCiAjZGVmaW5lIE1BUCh4KSB7IFwKIAkJWzBdCT0gKHgpIHwgRE1BX0NIX1ZBTElELAlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYwppbmRleCBhN2ZlNjVmLi4wMzlhNDYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9tYWNoLXNtZGsyNDQzLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaWRsZS5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogCiAjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9zM2MyNDQwLmg+CkBAIC0xMDMsOCArMTA0LDggQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGsyNDQzX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV9pMmMsCi0JJnMzY19kZXZpY2VfaHNtbWMsCisJJnMzY19kZXZpY2VfaTJjMCwKKwkmczNjX2RldmljZV9oc21tYzAsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21kazI0NDNfbWFwX2lvKHZvaWQpCkBAIC0xMTYsNiArMTE3LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNtZGsyNDQzX21hY2hpbmVfaW5pdCh2b2lkKQogeworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWRrMjQ0M19kZXZpY2VzLCBBUlJBWV9TSVpFKHNtZGsyNDQzX2RldmljZXMpKTsKIAlzbWRrX21hY2hpbmVfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMKaW5kZXggYmJlZGRmOS4uY2UyZWMzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvczNjMjQ0My5jCkBAIC04MSwxMCArODEsOSBAQAogICogbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbi4KICAqLwogCi12b2lkIF9faW5pdCBzM2MyNDQzX21hcF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IG1hY2hfc2l6ZSkKK3ZvaWQgX19pbml0IHMzYzI0NDNfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KHMzYzI0NDNfaW9kZXNjLCBBUlJBWV9TSVpFKHMzYzI0NDNfaW9kZXNjKSk7Ci0JaW90YWJsZV9pbml0KG1hY2hfZGVzYywgbWFjaF9zaXplKTsKIH0KIAogLyogbmVlZCB0byByZWdpc3RlciBjbGFzcyBiZWZvcmUgd2UgYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRldmljZSwgYW5kCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMCwwICsxLDI4IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogcHVsbCBpbiB0aGUgcmVsZXZhbnQgcmVnaXN0ZXIgYW5kIG1hcCBmaWxlcy4gKi8KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorCisJLm1hY3JvIGFkZHJ1YXJ0LCByeAorCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMAorCQl0c3QJXHJ4LCAjMQorCQlsZHJlcQlccngsID0gUzNDMjRYWF9QQV9VQVJUCisJCWxkcm5lCVxyeCwgPSBTM0MyNFhYX1ZBX1VBUlQKKyNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMAorCQlhZGQJXHJ4LCBccngsICMoUzNDMjQxMF9VQVJUMV9PRkYgKiBDT05GSUdfREVCVUdfUzNDX1VBUlQpCisjZW5kaWYKKwkuZW5kbQorCisvKiBpbmNsdWRlIHRoZSByZXNldCBvZiB0aGUgY29kZSB3aGljaCB3aWxsIGRvIHRoZSB3b3JrLCB3ZSdyZSBvbmx5CisgKiBjb21waWxpbmcgZm9yIGEgc2luZ2xlIGNwdSBwcm9jZXNzb3IgdHlwZSBzbyB0aGUgZGVmYXVsdCBvZiBzM2MyNDQwCisgKiB3aWxsIGJlIGZpbmUgd2l0aCB1cy4KKyAqLworCisjaW5jbHVkZSA8cGxhdC9kZWJ1Zy1tYWNyby5TPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZThjMGUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvaXJxcy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworCisjaWZuZGVmIF9fQVNNX0FSQ0hfMjRBMF9JUlFTX0gKKyNkZWZpbmUgX19BU01fQVJDSF8yNEEwX0lSUVNfSCBfX0ZJTEVfXworCisjZGVmaW5lIElSUV9FSU5UMHQyCVMzQzI0MTBfSVJRKDApCS8qIDE2ICovCisvKiBmb3IgZ2VuZXJpYyBlbnRyeS1tYWNyby5TICovCisjZGVmaW5lIElSUV9FSU5UMAlJUlFfRUlOVDB0MgorCisjZGVmaW5lIElSUV9FSU5UM3Q2CVMzQzI0MTBfSVJRKDEpCisjZGVmaW5lIElSUV9FSU5UN3QxMAlTM0MyNDEwX0lSUSgyKQorI2RlZmluZSBJUlFfRUlOVDExdDE0CVMzQzI0MTBfSVJRKDMpCisjZGVmaW5lIElSUV9FSU5UMTV0MTgJUzNDMjQxMF9JUlEoNCkJLyogMjAgKi8KKyNkZWZpbmUgSVJRX1RJQ0sJUzNDMjQxMF9JUlEoNSkKKyNkZWZpbmUgSVJRX0RDVFEJUzNDMjQxMF9JUlEoNikKKyNkZWZpbmUgSVJRX01DCQlTM0MyNDEwX0lSUSg3KQorI2RlZmluZSBJUlFfTUUJCVMzQzI0MTBfSVJRKDgpCS8qIDI0ICovCisjZGVmaW5lIElSUV9LRVlQQUQJUzNDMjQxMF9JUlEoOSkKKyNkZWZpbmUgSVJRX1RJTUVSMAlTM0MyNDEwX0lSUSgxMCkKKyNkZWZpbmUgSVJRX1RJTUVSMQlTM0MyNDEwX0lSUSgxMSkKKyNkZWZpbmUgSVJRX1RJTUVSMglTM0MyNDEwX0lSUSgxMikKKyNkZWZpbmUgSVJRX1RJTUVSM180CVMzQzI0MTBfSVJRKDEzKQorI2RlZmluZSBJUlFfT1NfVElNRVIJSVJRX1RJTUVSM180CisjZGVmaW5lIElSUV9MQ0QJCVMzQzI0MTBfSVJRKDE0KQorI2RlZmluZSBJUlFfQ0FNX0MJUzNDMjQxMF9JUlEoMTUpCisjZGVmaW5lIElSUV9XRFRfQkFURkxUCVMzQzI0MTBfSVJRKDE2KQkvKiAzMiAqLworI2RlZmluZSBJUlFfVUFSVDAJUzNDMjQxMF9JUlEoMTcpCisjZGVmaW5lIElSUV9DQU1fUAlTM0MyNDEwX0lSUSgxOCkKKyNkZWZpbmUgSVJRX01PREVNCVMzQzI0MTBfSVJRKDE5KQorI2RlZmluZSBJUlFfRE1BCQlTM0MyNDEwX0lSUSgyMCkKKyNkZWZpbmUgSVJRX1NESQkJUzNDMjQxMF9JUlEoMjEpCisjZGVmaW5lIElSUV9TUEkwCVMzQzI0MTBfSVJRKDIyKQorI2RlZmluZSBJUlFfVUFSVDEJUzNDMjQxMF9JUlEoMjMpCisjZGVmaW5lIElSUV9BQzk3X05GTEFTSAlTM0MyNDEwX0lSUSgyNCkJLyogNDAgKi8KKyNkZWZpbmUgSVJRX1VTQkQJUzNDMjQxMF9JUlEoMjUpCisjZGVmaW5lIElSUV9VU0JICVMzQzI0MTBfSVJRKDI2KQorI2RlZmluZSBJUlFfSUlDCQlTM0MyNDEwX0lSUSgyNykKKyNkZWZpbmUgSVJRX0lSREFfTVNUSUNLCVMzQzI0MTBfSVJRKDI4KQkvKiA0NCAqLworI2RlZmluZSBJUlFfVkxYX1NQSTEJUzNDMjQxMF9JUlEoMjkpCisjZGVmaW5lIElSUV9SVEMJCVMzQzI0MTBfSVJRKDMwKQkvKiA0NiAqLworI2RlZmluZSBJUlFfQURDX1BFTiAgICAgUzNDMjQxMF9JUlEoMzEpCisKKy8qIGludGVycnVwdHMgZ2VuZXJhdGVkIGZyb20gdGhlIGV4dGVybmFsIGludGVycnVwdHMgc291cmNlcyAqLworI2RlZmluZSBJUlFfRUlOVDAwCVMzQzI0MTBfSVJRKDMyKQkvKiA0OCAqLworI2RlZmluZSBJUlFfRUlOVDEJUzNDMjQxMF9JUlEoMzMpCisjZGVmaW5lIElSUV9FSU5UMglTM0MyNDEwX0lSUSgzNCkKKyNkZWZpbmUgSVJRX0VJTlQzCVMzQzI0MTBfSVJRKDM1KQorI2RlZmluZSBJUlFfRUlOVDQJUzNDMjQxMF9JUlEoMzYpCisjZGVmaW5lIElSUV9FSU5UNQlTM0MyNDEwX0lSUSgzNykKKyNkZWZpbmUgSVJRX0VJTlQ2CVMzQzI0MTBfSVJRKDM4KQorI2RlZmluZSBJUlFfRUlOVDcJUzNDMjQxMF9JUlEoMzkpCisjZGVmaW5lIElSUV9FSU5UOAlTM0MyNDEwX0lSUSg0MCkKKyNkZWZpbmUgSVJRX0VJTlQ5CVMzQzI0MTBfSVJRKDQxKQorI2RlZmluZSBJUlFfRUlOVDEwCVMzQzI0MTBfSVJRKDQyKQorI2RlZmluZSBJUlFfRUlOVDExCVMzQzI0MTBfSVJRKDQzKQorI2RlZmluZSBJUlFfRUlOVDEyCVMzQzI0MTBfSVJRKDQ0KQorI2RlZmluZSBJUlFfRUlOVDEzCVMzQzI0MTBfSVJRKDQ1KQorI2RlZmluZSBJUlFfRUlOVDE0CVMzQzI0MTBfSVJRKDQ2KQorI2RlZmluZSBJUlFfRUlOVDE1CVMzQzI0MTBfSVJRKDQ3KQorI2RlZmluZSBJUlFfRUlOVDE2CVMzQzI0MTBfSVJRKDQ4KQorI2RlZmluZSBJUlFfRUlOVDE3CVMzQzI0MTBfSVJRKDQ5KQorI2RlZmluZSBJUlFfRUlOVDE4CVMzQzI0MTBfSVJRKDUwKQorCisvKiBTVUIgSVJRUyAqLworI2RlZmluZSBJUlFfUzNDVUFSVF9SWDAJCVMzQzI0MTBfSVJRKDUxKQkvKiA2NyAqLworI2RlZmluZSBJUlFfUzNDVUFSVF9UWDAJCVMzQzI0MTBfSVJRKDUyKQorI2RlZmluZSBJUlFfUzNDVUFSVF9FUlIwCVMzQzI0MTBfSVJRKDUzKQorCisjZGVmaW5lIElSUV9TM0NVQVJUX1JYMQkJUzNDMjQxMF9JUlEoNTQpCisjZGVmaW5lIElSUV9TM0NVQVJUX1RYMQkJUzNDMjQxMF9JUlEoNTUpCisjZGVmaW5lIElSUV9TM0NVQVJUX0VSUjEJUzNDMjQxMF9JUlEoNTYpCisKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfUlgyCQkoMHgwKQorI2RlZmluZSBJUlFfUzNDVUFSVF9UWDIJCSgweDApCisjZGVmaW5lIElSUV9TM0NVQVJUX0VSUjIJKDB4MCkKKworCisjZGVmaW5lIElSUV9JUkRBCVMzQzI0MTBfSVJRKDU3KQorI2RlZmluZSBJUlFfTVNUSUNLCVMzQzI0MTBfSVJRKDU4KQorI2RlZmluZSBJUlFfUkVTRVJWRUQwCVMzQzI0MTBfSVJRKDU5KQorI2RlZmluZSBJUlFfUkVTRVJWRUQxCVMzQzI0MTBfSVJRKDYwKQorI2RlZmluZSBJUlFfUkVTRVJWRUQyCVMzQzI0MTBfSVJRKDYxKQorI2RlZmluZSBJUlFfVElNRVIzCVMzQzI0MTBfSVJRKDYyKQorI2RlZmluZSBJUlFfVElNRVI0CVMzQzI0MTBfSVJRKDYzKQorI2RlZmluZSBJUlFfV0RUCQlTM0MyNDEwX0lSUSg2NCkKKyNkZWZpbmUgSVJRX0JBVEZMVAlTM0MyNDEwX0lSUSg2NSkKKyNkZWZpbmUgSVJRX1BPU1QJUzNDMjQxMF9JUlEoNjYpCisjZGVmaW5lIElSUV9ESVNQX0ZJRk8JUzNDMjQxMF9JUlEoNjcpCisjZGVmaW5lIElSUV9QRU5VUAlTM0MyNDEwX0lSUSg2OCkKKyNkZWZpbmUgSVJRX1BFTkROCVMzQzI0MTBfSVJRKDY5KQorI2RlZmluZSBJUlFfQURDCQlTM0MyNDEwX0lSUSg3MCkKKyNkZWZpbmUgSVJRX0RJU1BfRlJBTUUJUzNDMjQxMF9JUlEoNzEpCisjZGVmaW5lIElSUV9ORkxBU0gJUzNDMjQxMF9JUlEoNzIpCisjZGVmaW5lIElSUV9BQzk3CVMzQzI0MTBfSVJRKDczKQorI2RlZmluZSBJUlFfU1BJMQlTM0MyNDEwX0lSUSg3NCkKKyNkZWZpbmUgSVJRX1ZMWAkJUzNDMjQxMF9JUlEoNzUpCisjZGVmaW5lIElSUV9ETUEwCVMzQzI0MTBfSVJRKDc2KQorI2RlZmluZSBJUlFfRE1BMQlTM0MyNDEwX0lSUSg3NykKKyNkZWZpbmUgSVJRX0RNQTIJUzNDMjQxMF9JUlEoNzgpCisjZGVmaW5lIElSUV9ETUEzCVMzQzI0MTBfSVJRKDc5KQorCisjZGVmaW5lIElSUV9UQwkJKDB4MCkKKworI2RlZmluZSBOUl9JUlFTCQkoSVJRX0RNQTMrMSkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfMjRBMF9JUlFTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTEzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvbWFwLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwMywyMDA3ICBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjRBMCAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIXzI0QTBfTUFQX0gKKyNkZWZpbmUgX19BU01fQVJDSF8yNEEwX01BUF9IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxwbGF0L21hcC1iYXNlLmg+CisjaW5jbHVkZSA8cGxhdC9tYXAuaD4KKworI2RlZmluZSBTM0MyNEEwX1BBX0lPX0JBU0UJKDB4NDAwMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfQ0xLUFdSCSgweDQwMDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX0lSUQkJKDB4NDAyMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfRE1BCQkoMHg0MDQwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9NRU1DVFJMCSgweDQwQzAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX05BTkQJCSgweDQwQzAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1NST00JCSgweDQwQzIwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1NEUkFNCSgweDQwQzQwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX0JVU00JCSgweDQwQ0UwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1VTQkhPU1QJKDB4NDEwMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfTU9ERU1JRgkoMHg0MTE4MDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9JUkRBCQkoMHg0MTgwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9USU1FUgkoMHg0NDAwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9XQVRDSERPRwkoMHg0NDEwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9SVEMJCSgweDQ0MjAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1VBUlQJCSgweDQ0NDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1VBUlQwCShTM0MyNEEwX1BBX1VBUlQpCisjZGVmaW5lIFMzQzI0QTBfUEFfVUFSVDEJKFMzQzI0QTBfUEFfVUFSVCArIDB4NDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9TUEkJCSgweDQ0NTAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX0lJQwkJKDB4NDQ2MDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfSUlTCQkoMHg0NDcwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9HUElPCQkoMHg0NDgwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9LRVlJRgkoMHg0NDkwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9VU0JERVYJKDB4NDRBMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfQUM5NwkJKDB4NDUwMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfUEFfQURDCQkoMHg0NTgwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9TREkJCSgweDQ2MDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX01TCQkoMHg0NjEwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9QQV9MQ0QJCSgweDRBMDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX1BBX1ZQT1NUCSgweDRBMTAwMDAwKQorCisvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgYWxsIHRoZSBjaGlwLXNlbGVjdCBhcmVhcyAqLworCisjZGVmaW5lIFMzQzI0QTBfQ1MwCSgweDAwMDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX0NTMQkoMHgwNDAwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9DUzIJKDB4MDgwMDAwMDApCisjZGVmaW5lIFMzQzI0QTBfQ1MzCSgweDBDMDAwMDAwKQorI2RlZmluZSBTM0MyNEEwX0NTNAkoMHgxMDAwMDAwMCkKKyNkZWZpbmUgUzNDMjRBMF9DUzUJKDB4NDAwMDAwMDApCisKKyNkZWZpbmUgUzNDMjRBMF9TRFJBTV9QQQkoUzNDMjRBMF9DUzQpCisKKy8qIFVzZSBhIHNpbmdsZSBpbnRlcmZhY2UgZm9yIGNvbW1vbiByZXNvdXJjZXMgYmV0d2VlbiBTM0MyNFhYIGNwdXMgKi8KKworI2RlZmluZSBTM0MyNFhYX1BBX0lSUQkJUzNDMjRBMF9QQV9JUlEKKyNkZWZpbmUgUzNDMjRYWF9QQV9NRU1DVFJMCVMzQzI0QTBfUEFfTUVNQ1RSTAorI2RlZmluZSBTM0MyNFhYX1BBX1VTQkhPU1QJUzNDMjRBMF9QQV9VU0JIT1NUCisjZGVmaW5lIFMzQzI0WFhfUEFfRE1BCQlTM0MyNEEwX1BBX0RNQQorI2RlZmluZSBTM0MyNFhYX1BBX0NMS1BXUglTM0MyNEEwX1BBX0NMS1BXUgorI2RlZmluZSBTM0MyNFhYX1BBX0xDRAkJUzNDMjRBMF9QQV9MQ0QKKyNkZWZpbmUgUzNDMjRYWF9QQV9VQVJUCQlTM0MyNEEwX1BBX1VBUlQKKyNkZWZpbmUgUzNDMjRYWF9QQV9USU1FUglTM0MyNEEwX1BBX1RJTUVSCisjZGVmaW5lIFMzQzI0WFhfUEFfVVNCREVWCVMzQzI0QTBfUEFfVVNCREVWCisjZGVmaW5lIFMzQzI0WFhfUEFfV0FUQ0hET0cJUzNDMjRBMF9QQV9XQVRDSERPRworI2RlZmluZSBTM0MyNFhYX1BBX0lJUwkJUzNDMjRBMF9QQV9JSVMKKyNkZWZpbmUgUzNDMjRYWF9QQV9HUElPCQlTM0MyNEEwX1BBX0dQSU8KKyNkZWZpbmUgUzNDMjRYWF9QQV9SVEMJCVMzQzI0QTBfUEFfUlRDCisjZGVmaW5lIFMzQzI0WFhfUEFfQURDCQlTM0MyNEEwX1BBX0FEQworI2RlZmluZSBTM0MyNFhYX1BBX1NQSQkJUzNDMjRBMF9QQV9TUEkKKyNkZWZpbmUgUzNDMjRYWF9QQV9TREkJCVMzQzI0QTBfUEFfU0RJCisjZGVmaW5lIFMzQzI0WFhfUEFfTkFORAkJUzNDMjRBMF9QQV9OQU5ECisKKyNkZWZpbmUgUzNDX1BBX1VBUlQJCVMzQzI0QTBfUEFfVUFSVAorI2RlZmluZSBTM0NfUEFfSUlDCQlTM0MyNEEwX1BBX0lJQworCisjZW5kaWYgLyogX19BU01fQVJDSF8yNEEwX01BUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODUyMTFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMCwwICsxLDE5IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisgKiAgZnJvbSBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1ycGMvbWVtb3J5LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF8yNEEwX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfMjRBMF9NRU1PUllfSCBfX0ZJTEVfXworCisjZGVmaW5lIFBIWVNfT0ZGU0VUIFVMKDB4MTAwMDAwMDApCisKKyNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KSBfX3ZpcnRfdG9fcGh5cyh4KQorI2RlZmluZSBfX2J1c190b192aXJ0KHgpIF9fcGh5c190b192aXJ0KHgpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJhYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKQEAgLTAsMCArMSw4OCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCwyMDA1LDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzIDxsaW51eEBzaW10ZWMuY28udWs+CisgKgkJICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFMzQzI0QTAgY2xvY2sgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF8yNEEwX1JFR1NfQ0xPQ0tfSAorI2RlZmluZSBfX0FTTV9BUkNIXzI0QTBfUkVHU19DTE9DS19IIF9fRklMRV9fCisKKyNkZWZpbmUgUzNDMjRBMF9NUExMQ09OCQlTM0MyNDEwX0NMS1JFRygweDEwKQorI2RlZmluZSBTM0MyNEEwX1VQTExDT04JCVMzQzI0MTBfQ0xLUkVHKDB4MTQpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OCQlTM0MyNDEwX0NMS1JFRygweDIwKQorI2RlZmluZSBTM0MyNEEwX0NMS1NSQwkJUzNDMjQxMF9DTEtSRUcoMHgyNCkKKyNkZWZpbmUgUzNDMjRBMF9DTEtESVZOCQlTM0MyNDEwX0NMS1JFRygweDI4KQorCisvKiBDTEtDT04gcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1ZMWAkoMTw8MjkpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1ZQT1NUCSgxPDwyOCkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fV0RUCSgxPDwyNykJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFR0RDVFEJKDE8PDI2KQorI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9WUE9TVElGCSgxPDwyNSkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFRzRJRgkoMTw8MjQpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0NBTV9VUExMCSgxPDwyMykKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTENEQwkoMTw8MjIpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0NBTV9IQ0xLCSgxPDwyMSkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fTVBFRzQJKDE8PDIwKQorI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9LRVlQQUQJKDE8PDE5KQorI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9BREMJKDE8PDE4KQorI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9TREkJKDE8PDE3KQorI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9NUwkoMTw8MTYpIC8qIG1lbW9yeSBzdGljayAqLworI2RlZmluZSBTM0MyNEEwX0NMS0NPTl9VU0JECSgxPDwxNSkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fR1BJTwkoMTw8MTQpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lJUwkoMTw8MTMpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lJQwkoMTw8MTIpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1NQSQkoMTw8MTEpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1VBUlQxCSgxPDwxMCkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fVUFSVDAJKDE8PDkpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1BXTVQJKDE8PDgpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX1VTQkgJKDE8PDcpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0FDOTcJKDE8PDYpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lyREEJKDE8PDQpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX0lETEUJKDE8PDIpCisjZGVmaW5lIFMzQzI0QTBfQ0xLQ09OX01PTgkoMTw8MSkKKyNkZWZpbmUgUzNDMjRBMF9DTEtDT05fU1RPUAkoMTw8MCkKKworLyogQ0xLU1JDIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBTM0MyNEEwX0NMS1NSQ19PU0MJKDE8PDgpICAvKiBDTEtTUkMgKi8KKyNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfVVBMTAkoMTw8NykKKyNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfTVBMTAkoMTw8NSkKKyNkZWZpbmUgUzNDMjRBMF9DTEtTUkNfRVhUCSgxPDw0KQorCisvKiBVc2UgYSBzaW5nbGUgaW50ZXJmYWNlIHdpdGggdGhlIGNvbW1vbiBjb2RlLCBmb3IgczNjMjR4eCAqLworCisjZGVmaW5lIFMzQzI0MTBfTVBMTENPTgkJUzNDMjRBMF9NUExMQ09OCisjZGVmaW5lIFMzQzI0MTBfVVBMTENPTgkJUzNDMjRBMF9VUExMQ09OCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OCQlTM0MyNEEwX0NMS0NPTgorI2RlZmluZSBTM0MyNDEwX0NMS1NMT1cJCVMzQzI0QTBfQ0xLU1JDCisjZGVmaW5lIFMzQzI0MTBfQ0xLRElWTgkJUzNDMjRBMF9DTEtESVZOCisKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fSURMRQlTM0MyNEEwX0NMS0NPTl9JRExFCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1BPV0VSCVMzQzI0QTBfQ0xLQ09OX1NUT1AKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fTENEQwlTM0MyNEEwX0NMS0NPTl9MQ0RDCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1VTQkgJUzNDMjRBMF9DTEtDT05fVVNCSAorI2RlZmluZSBTM0MyNDEwX0NMS0NPTl9VU0JECVMzQzI0QTBfQ0xLQ09OX1VTQkQKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fUFdNVAlTM0MyNEEwX0NMS0NPTl9QV01UCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1NESQlTM0MyNEEwX0NMS0NPTl9TREkKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fVUFSVDAJUzNDMjRBMF9DTEtDT05fVUFSVDAKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fVUFSVDEJUzNDMjRBMF9DTEtDT05fVUFSVDEKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fR1BJTwlTM0MyNEEwX0NMS0NPTl9HUElPCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX0FEQwlTM0MyNEEwX0NMS0NPTl9BREMKKyNkZWZpbmUgUzNDMjQxMF9DTEtDT05fSUlDCVMzQzI0QTBfQ0xLQ09OX0lJQworI2RlZmluZSBTM0MyNDEwX0NMS0NPTl9JSVMJUzNDMjRBMF9DTEtDT05fSUlTCisjZGVmaW5lIFMzQzI0MTBfQ0xLQ09OX1NQSQlTM0MyNEEwX0NMS0NPTl9TUEkKKworI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfVUNMS19PRkYJUzNDMjRBMF9DTEtTUkNfVVBMTAorI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfTVBMTF9PRkYJUzNDMjRBMF9DTEtTUkNfTVBMTAorI2RlZmluZSBTM0MyNDEwX0NMS1NMT1dfU0xPVwkJKDB4RkYpCisjZGVmaW5lIFMzQzI0MTBfQ0xLU0xPV19HRVRfU0xPV1ZBTCh4KQkoMHgxKQorCisjZW5kaWYgLyogX19BU01fQVJDSF8yNEEwX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODZmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKQEAgLTAsMCArMSwyNSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICoJCSAgICAgIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKworI2lmbmRlZiBfX19BU01fQVJDSF8yNEEwX1JFR1NfSVJRX0gKKyNkZWZpbmUgX19fQVNNX0FSQ0hfMjRBMF9SRUdTX0lSUV9IIF9fRklMRV9fCisKKworI2RlZmluZSBTM0MyNDEwX0VJTlRNQVNLCVMzQzI0MTBfRUlOVFJFRygweDAzNCkKKyNkZWZpbmUgUzNDMjQxMF9FSU5UUEVORAlTM0MyNDEwX0VJTlRSRUcoMFgwMzgpCisKKyNkZWZpbmUgUzNDMjRYWF9FSU5UTUFTSwlTM0MyNFhYX0VJTlRSRUcoMHgwMzQpCisjZGVmaW5lIFMzQzI0WFhfRUlOVFBFTkQJUzNDMjRYWF9FSU5UUkVHKDBYMDM4KQorCisjZW5kaWYgLyogX19BU01fQVJDSF8yNEEwX1JFR1NfSVJRX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWJkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNEEwIC0gU3lzdGVtIGZ1bmN0aW9uIGRlZmluZXMgYW5kIGluY2x1ZGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCitzdGF0aWMgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKKwkvKiBjdXJyZW50bHkgbm8gc3BlY2lmaWMgaWRsZSBzdXBwb3J0LiAqLworfQorCit2b2lkICgqczNjMjR4eF9yZXNldF9ob29rKSh2b2lkKTsKKworI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvc3lzdGVtLXJlc2V0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpY2suaCBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvdGljay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZWE4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpY2suaApAQCAtMCwwICsxLDE1IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpY2suaAorICoKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDMjRBMCAtIHRpbWVyIHRpY2sgc3VwcG9ydAorICovCisKKyNkZWZpbmUgU1VCU1JDX1RJTUVSNAkoMSA8PCAoSVJRX1RJTUVSNCAtIElSUV9TM0NVQVJUX1JYMCkpCisKK3N0YXRpYyBpbmxpbmUgaW50IHMzYzI0eHhfb3N0aW1lcl9wZW5kaW5nKHZvaWQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKFMzQzI0MTBfU1VCU1JDUE5EKSAmIFNVQlNSQ19USU1FUjQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1NzM0MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMCwwICsxLDE4IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjQxMCAtIHRpbWUgcGFyYW1ldGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVElNRVhfSAorI2RlZmluZSBfX0FTTV9BUkNIX1RJTUVYX0gKKworI2RlZmluZSBDTE9DS19USUNLX1JBVEUgMTIwMDAwMDAKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfVElNRVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRmZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTAsMCArMSwxNyBAQAorLyogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjRhby92bWFsbG9jLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MgPGxpbnV4QHNpbXRlYy5jby51az4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTM0MyNEEwIHZtYWxsb2MgZGVmaW5pdGlvbgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1ZNQUxMT0NfSAorI2RlZmluZSBfX0FTTV9BUkNIX1ZNQUxMT0NfSAorCisjZGVmaW5lIFZNQUxMT0NfRU5ECSAgKDB4RTAwMDAwMDApCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1ZNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE4MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL0tjb25maWcKQEAgLTAsMCArMSw4IEBACisjIGFyY2gvYXJtL21hY2gtczNjNjQwMC9LY29uZmlnCisjCisjIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisjCVNpbXRlYyBFbGVjdHJvbmljcywgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2MgorCisjIEN1cnJlbnRseSBub3RoaW5nIGhlcmUsIHRoaXMgd2lsbCBiZSBhZGRlZCBsYXRlcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzk3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyBhcmNoL2FybS9tYWNoLXMzYzY0MDAvTWFrZWZpbGUKKyMKKyMgQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyMgQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyCisKK29iai15CQkJCTo9CitvYmotbQkJCQk6PQorb2JqLW4JCQkJOj0KK29iai0JCQkJOj0KKworIyBDb3JlIHN1cHBvcnQgZm9yIFMzQzY0MDAgc3lzdGVtCisKK29iai1uCQkJCSs9IGJsYW5rLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MWZkYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsMiBAQAorICAgenJlbGFkZHIteQk6PSAweDUwMDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4NTAwMDAxMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMThhYzUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGFyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIHB1bGwgaW4gdGhlIHJlbGV2YW50IHJlZ2lzdGVyIGFuZCBtYXAgZmlsZXMuICovCisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKworCS8qIG5vdGUsIGZvciB0aGUgYm9vdCBwcm9jZXNzIHRvIHdvcmsgd2UgaGF2ZSB0byBrZWVwIHRoZSBVQVJUCisJICogdmlydHVhbCBhZGRyZXNzIGFsaWduZWQgdG8gYW4gMU1pQiBib3VuZGFyeSBmb3IgdGhlIEwxCisJICogbWFwcGluZyB0aGUgaGVhZCBjb2RlIG1ha2VzLiBXZSBrZWVwIHRoZSBVQVJUIHZpcnR1YWwgYWRkcmVzcworCSAqIGFsaWduZWQgYW5kIGFkZCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2UgbG9hZCB0aGUgdmFsdWUgaGVyZS4KKwkgKi8KKworCS5tYWNybyBhZGRydWFydCwgcngKKwkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKKwkJdHN0CVxyeCwgIzEKKwkJbGRyZXEJXHJ4LCA9IFMzQ19QQV9VQVJUCisJCWxkcm5lCVxyeCwgPSAoUzNDX1ZBX1VBUlQgKyBTM0NfUEFfVUFSVCAmIDB4ZmZmZmYpCisjaWYgQ09ORklHX0RFQlVHX1MzQ19VQVJUICE9IDAKKwkJYWRkCVxyeCwgXHJ4LCAjKDB4NDAwICogQ09ORklHX0RFQlVHX1MzQ19VQVJUKQorI2VuZGlmCisJLmVuZG0KKworLyogaW5jbHVkZSB0aGUgcmVzZXQgb2YgdGhlIGNvZGUgd2hpY2ggd2lsbCBkbyB0aGUgd29yaywgd2UncmUgb25seQorICogY29tcGlsaW5nIGZvciBhIHNpbmdsZSBjcHUgcHJvY2Vzc29yIHR5cGUgc28gdGhlIGRlZmF1bHQgb2YgczNjMjQ0MAorICogd2lsbCBiZSBmaW5lIHdpdGggdXMuCisgKi8KKworI2luY2x1ZGUgPHBsYXQvZGVidWctbWFjcm8uUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzFhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvZG1hLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0M2NDAwIC0gRE1BIHN1cHBvcnQKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfRE1BX0gKKyNkZWZpbmUgX19BU01fQVJDSF9ETUFfSCBfX0ZJTEVfXworCisvKiBjdXJyZW50bHkgbm90aGluZyBoZXJlLCBwbGFjZWhvbGRlciAqLworCisjZW5kaWYgLyogX19BU01fQVJDSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDkwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTAsMCArMSw0NCBAQAorLyogYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIHRoZSBTYW1zdW5nIFMzQzY0WFggc2VyaWVzCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqLworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CisKKwkubWFjcm8JZGlzYWJsZV9maXEKKwkuZW5kbQorCisJLm1hY3JvCWdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCisJbGRyCVxiYXNlLCA9UzNDX1ZBX1ZJQzAKKwkuZW5kbQorCisJLm1hY3JvCWFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKKwkuZW5kbQorCisJLm1hY3JvCWdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAorCisJQCBjaGVjayB0aGUgdmljMAorCW1vdglcaXJxbnIsICMgUzNDX0lSUV9PRkZTRVQgKyAzMQorCWxkcglcaXJxc3RhdCwgWyBcYmFzZSwgIyBWSUNfSVJRX1NUQVRVUyBdCisJdGVxCVxpcnFzdGF0LCAjMAorCisJQCBvdGhlcndpc2UgdHJ5IHZpYzEKKwlhZGRlcQlcdG1wLCBcYmFzZSwgIyhTM0NfVkFfVklDMSAtIFMzQ19WQV9WSUMwKQorCWFkZGVxCVxpcnFuciwgXGlycW5yLCAjMzIKKwlsZHJlcQlcaXJxc3RhdCwgWyBcdG1wLCAjIFZJQ19JUlFfU1RBVFVTIF0KKwl0ZXFlcQlcaXJxc3RhdCwgIzAKKworCWNsem5lCVxpcnFzdGF0LCBcaXJxc3RhdAorCXN1Ym5lCVxpcnFuciwgXGlycW5yLCBcaXJxc3RhdAorCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2dwaW8tY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9ncGlvLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODlhYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9ncGlvLWNvcmUuaApAQCAtMCwwICsxLDIxIEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2dwaW8tY29yZS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjRYWCAtIEdQSU8gY29yZSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9HUElPX0NPUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fQ09SRV9IIF9fRklMRV9fCisKKy8qIGN1cnJlbnRseSB3ZSBqdXN0IGluY2x1ZGUgdGhlIHBsYXRmb3JtIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgorCisjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUzNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw5NiBAQAorLyogYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzY0MDAgLSBHUElPIGxpYiBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQorI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCisjZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKKworLyogR1BJTyBiYW5rIHNpemVzICovCisjZGVmaW5lIFMzQzY0WFhfR1BJT19BX05SCSg4KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fQl9OUgkoNykKKyNkZWZpbmUgUzNDNjRYWF9HUElPX0NfTlIJKDgpCisjZGVmaW5lIFMzQzY0WFhfR1BJT19EX05SCSg1KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fRV9OUgkoNSkKKyNkZWZpbmUgUzNDNjRYWF9HUElPX0ZfTlIJKDE2KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fR19OUgkoNykKKyNkZWZpbmUgUzNDNjRYWF9HUElPX0hfTlIJKDEwKQorI2RlZmluZSBTM0M2NFhYX0dQSU9fSV9OUgkoMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BJT19KX05SCSgxMikKKyNkZWZpbmUgUzNDNjRYWF9HUElPX0tfTlIJKDE2KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fTF9OUgkoMTUpCisjZGVmaW5lIFMzQzY0WFhfR1BJT19NX05SCSg2KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fTl9OUgkoMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BJT19PX05SCSgxNikKKyNkZWZpbmUgUzNDNjRYWF9HUElPX1BfTlIJKDE1KQorI2RlZmluZSBTM0M2NFhYX0dQSU9fUV9OUgkoOSkKKworLyogR1BJTyBiYW5rIG51bWJlcyAqLworCisvKiBDT05GSUdfUzNDX0dQSU9fU1BBQ0UgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBleHRyYQorICogc3BhY2UgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBzbyB0aGF0IGFueSBhY2NpZGVudGFsCisgKiBjaGFuZ2UgZnJvbSBvbmUgZ3BpbyBiYW5rIHRvIGFub3RoZXIgY2FuIGJlIGNhdWdodC4KKyovCisKKyNkZWZpbmUgUzNDNjRYWF9HUElPX05FWFQoX19ncGlvKSBcCisJKChfX2dwaW8jI19TVEFSVCkgKyAoX19ncGlvIyNfTlIpICsgQ09ORklHX1MzQ19HUElPX1NQQUNFICsgMSkKKworZW51bSBzM2NfZ3Bpb19udW1iZXIgeworCVMzQzY0WFhfR1BJT19BX1NUQVJUID0gMCwKKwlTM0M2NFhYX0dQSU9fQl9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19BKSwKKwlTM0M2NFhYX0dQSU9fQ19TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19CKSwKKwlTM0M2NFhYX0dQSU9fRF9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19DKSwKKwlTM0M2NFhYX0dQSU9fRV9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19EKSwKKwlTM0M2NFhYX0dQSU9fRl9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19FKSwKKwlTM0M2NFhYX0dQSU9fR19TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19GKSwKKwlTM0M2NFhYX0dQSU9fSF9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19HKSwKKwlTM0M2NFhYX0dQSU9fSV9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19IKSwKKwlTM0M2NFhYX0dQSU9fSl9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19JKSwKKwlTM0M2NFhYX0dQSU9fS19TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19KKSwKKwlTM0M2NFhYX0dQSU9fTF9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19LKSwKKwlTM0M2NFhYX0dQSU9fTV9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19MKSwKKwlTM0M2NFhYX0dQSU9fTl9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19NKSwKKwlTM0M2NFhYX0dQSU9fT19TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19OKSwKKwlTM0M2NFhYX0dQSU9fUF9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19PKSwKKwlTM0M2NFhYX0dQSU9fUV9TVEFSVCA9IFMzQzY0WFhfR1BJT19ORVhUKFMzQzY0WFhfR1BJT19QKSwKK307CisKKy8qIFMzQzY0WFggR1BJTyBudW1iZXIgZGVmaW5pdGlvbnMuICovCisKKyNkZWZpbmUgUzNDNjRYWF9HUEEoX25yKQkoUzNDNjRYWF9HUElPX0FfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEIoX25yKQkoUzNDNjRYWF9HUElPX0JfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEMoX25yKQkoUzNDNjRYWF9HUElPX0NfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEQoX25yKQkoUzNDNjRYWF9HUElPX0RfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEUoX25yKQkoUzNDNjRYWF9HUElPX0VfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEYoX25yKQkoUzNDNjRYWF9HUElPX0ZfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEcoX25yKQkoUzNDNjRYWF9HUElPX0dfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEgoX25yKQkoUzNDNjRYWF9HUElPX0hfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEkoX25yKQkoUzNDNjRYWF9HUElPX0lfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEooX25yKQkoUzNDNjRYWF9HUElPX0pfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEsoX25yKQkoUzNDNjRYWF9HUElPX0tfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEwoX25yKQkoUzNDNjRYWF9HUElPX0xfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUE0oX25yKQkoUzNDNjRYWF9HUElPX01fU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUE4oX25yKQkoUzNDNjRYWF9HUElPX05fU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUE8oX25yKQkoUzNDNjRYWF9HUElPX09fU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUFAoX25yKQkoUzNDNjRYWF9HUElPX1BfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgUzNDNjRYWF9HUFEoX25yKQkoUzNDNjRYWF9HUElPX1FfU1RBUlQgKyAoX25yKSkKKworLyogdGhlIGVuZCBvZiB0aGUgUzNDNjRYWCBzcGVjaWZpYyBncGlvcyAqLworI2RlZmluZSBTM0M2NFhYX0dQSU9fRU5ECShTM0M2NFhYX0dQUShTM0M2NFhYX0dQSU9fUV9OUikgKyAxKQorI2RlZmluZSBTM0NfR1BJT19FTkQJCVMzQzY0WFhfR1BJT19FTkQKKworLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgZ3Bpb3Mgd2UgbmVlZCB0byB0aGUgb25lIGFmdGVyIHRoZSBHUFEoKSByYW5nZSAqLworI2RlZmluZSBBUkNIX05SX0dQSU9TCShTM0M2NFhYX0dQUShTM0M2NFhYX0dQSU9fUV9OUikgKyAxKQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MmQwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTAsMCArMSwxNiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjQwMCAtIEhhcmR3YXJlIHN1cHBvcnQKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0ggX19GSUxFX18KKworLyogY3VycmVudGx5IG5vdGhpbmcgaGVyZSwgcGxhY2Vob2xkZXIgKi8KKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjQwMCAtIElSUSBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKKyNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0ggX19GSUxFX18KKworI2lmbmRlZiBfX0FTTV9BUk1fSVJRX0gKKyNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2lycS5oPiIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmYyN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtMCwwICsxLDY4IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL21hcC5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0M2NFhYIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKKyNkZWZpbmUgX19BU01fQVJDSF9NQVBfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8cGxhdC9tYXAtYmFzZS5oPgorCisvKiBIU01NQyB1bml0cyAqLworI2RlZmluZSBTM0M2NFhYX1BBX0hTTU1DKHgpCSgweDdDMjAwMDAwICsgKCh4KSAqIDB4MTAwMDAwKSkKKyNkZWZpbmUgUzNDNjRYWF9QQV9IU01NQzAJUzNDNjRYWF9QQV9IU01NQygwKQorI2RlZmluZSBTM0M2NFhYX1BBX0hTTU1DMQlTM0M2NFhYX1BBX0hTTU1DKDEpCisjZGVmaW5lIFMzQzY0WFhfUEFfSFNNTUMyCVMzQzY0WFhfUEFfSFNNTUMoMikKKworI2RlZmluZSBTM0NfUEFfVUFSVAkJKDB4N0YwMDUwMDApCisjZGVmaW5lIFMzQ19QQV9VQVJUMAkJKFMzQ19QQV9VQVJUICsgMHgwMCkKKyNkZWZpbmUgUzNDX1BBX1VBUlQxCQkoUzNDX1BBX1VBUlQgKyAweDQwMCkKKyNkZWZpbmUgUzNDX1BBX1VBUlQyCQkoUzNDX1BBX1VBUlQgKyAweDgwMCkKKyNkZWZpbmUgUzNDX1BBX1VBUlQzCQkoUzNDX1BBX1VBUlQgKyAweEMwMCkKKyNkZWZpbmUgUzNDX1VBUlRfT0ZGU0VUCQkoMHg0MDApCisKKy8qIFNlZSBub3RlcyBvbiBVQVJUIFZBIG1hcHBpbmcgaW4gZGVidWctbWFjcm8uUyAqLworI2RlZmluZSBTM0NfVkFfVUFSVHgoeCkJKFMzQ19WQV9VQVJUICsgKFMzQ19QQV9VQVJUICYgMHhmZmZmZikgKyAoKHgpICogUzNDX1VBUlRfT0ZGU0VUKSkKKworI2RlZmluZSBTM0NfVkFfVUFSVDAJCVMzQ19WQV9VQVJUeCgwKQorI2RlZmluZSBTM0NfVkFfVUFSVDEJCVMzQ19WQV9VQVJUeCgxKQorI2RlZmluZSBTM0NfVkFfVUFSVDIJCVMzQ19WQV9VQVJUeCgyKQorI2RlZmluZSBTM0NfVkFfVUFSVDMJCVMzQ19WQV9VQVJUeCgzKQorCisjZGVmaW5lIFMzQzY0WFhfUEFfRkIJCSgweDc3MTAwMDAwKQorI2RlZmluZSBTM0M2NFhYX1BBX1NZU0NPTgkoMHg3RTAwRjAwMCkKKyNkZWZpbmUgUzNDNjRYWF9QQV9USU1FUgkoMHg3RjAwNjAwMCkKKyNkZWZpbmUgUzNDNjRYWF9QQV9JSUMwCQkoMHg3RjAwNDAwMCkKKyNkZWZpbmUgUzNDNjRYWF9QQV9JSUMxCQkoMHg3RjAwRjAwMCkKKworI2RlZmluZSBTM0M2NFhYX1BBX0dQSU8JCSgweDdGMDA4MDAwKQorI2RlZmluZSBTM0M2NFhYX1ZBX0dQSU8JCVMzQ19BRERSKDB4MDA1MDAwMDApCisjZGVmaW5lIFMzQzY0WFhfU1pfR1BJTwkJU1pfNEsKKworI2RlZmluZSBTM0M2NFhYX1BBX1NEUkFNCSgweDUwMDAwMDAwKQorI2RlZmluZSBTM0M2NFhYX1BBX1ZJQzAJCSgweDcxMjAwMDAwKQorI2RlZmluZSBTM0M2NFhYX1BBX1ZJQzEJCSgweDcxMzAwMDAwKQorCisvKiBwbGFjZSBWSUNzIGNsb3NlIHRvZ2V0aGVyICovCisjZGVmaW5lIFMzQ19WQV9WSUMwCQkoUzNDX1ZBX0lSUSArIDB4MDApCisjZGVmaW5lIFMzQ19WQV9WSUMxCQkoUzNDX1ZBX0lSUSArIDB4MTAwMDApCisKKy8qIGNvbXBhdGliaWx0aXkgZGVmaW5lcy4gKi8KKyNkZWZpbmUgUzNDX1BBX1RJTUVSCQlTM0M2NFhYX1BBX1RJTUVSCisjZGVmaW5lIFMzQ19QQV9IU01NQzAJCVMzQzY0WFhfUEFfSFNNTUMwCisjZGVmaW5lIFMzQ19QQV9IU01NQzEJCVMzQzY0WFhfUEFfSFNNTUMxCisjZGVmaW5lIFMzQ19QQV9IU01NQzIJCVMzQzY0WFhfUEFfSFNNTUMyCisjZGVmaW5lIFMzQ19QQV9JSUMJCVMzQzY0WFhfUEFfSUlDMAorI2RlZmluZSBTM0NfUEFfSUlDMQkJUzNDNjRYWF9QQV9JSUMxCisjZGVmaW5lIFMzQ19QQV9GQgkJUzNDNjRYWF9QQV9GQgorCisjZW5kaWYgLyogX19BU01fQVJDSF82NDAwX01BUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FjODRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMCwwICsxLDE4IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAorI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICisKKyNkZWZpbmUgUEhZU19PRkZTRVQgICAgIFVMKDB4NTAwMDAwMDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1YmVkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKQEAgLTAsMCArMSw1NiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0eHggLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKKyAqLworCisvKioKKyAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsaworICogQHRjZmc6IFRoZSB0aW1lciBUQ0ZHMSByZWdpc3RlciBiaXRzIHNoaWZ0ZWQgZG93biB0byAwLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZyb20gVENGRzEgaXMgYSBUQ0xLIGluc3RlYWQKKyAqIGFueSBvZiB0aGUgVERJViBjbG9ja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB3bV9jZmdfc3JjX2lzX3RjbGsodW5zaWduZWQgbG9uZyB0Y2ZnKQoreworCXJldHVybiB0Y2ZnID49IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7Cit9CisKKy8qKgorICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCisgKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCisgKgorICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQorICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKK3sKKwlyZXR1cm4gMSA8PCB0Y2ZnMTsKK30KKworLyoqCisgKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQorICoKKyAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQoreworCXJldHVybiAxOworfQorCisvKioKKyAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KKyAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KKyAqCisgKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCit7CisJcmV0dXJuIGlsb2cyKGRpdik7Cit9CisKKyNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzY0WFhfVENGRzFfTVVYX1RDTEsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvcmVncy1mYi5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9yZWdzLWZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwMTk3OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvcmVncy1mYi5oCkBAIC0wLDAgKzEsMjU5IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3JlZ3MtZmIuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzY0WFggLSBuZXctc3R5bGUgZnJhbWVidWZmZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGlzIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBuZXcgc3R5bGUgZnJhbWVidWZmZXIgaW50ZXJmYWNlCisgKiBmb3VuZCBmcm9tIHRoZSBTM0MyNDQzIG9ud2FyZHMgYW5kIHNwZWNpZmljYWxseSB0aGUgUzNDNjRYWCBzZXJpZXMKKyAqIFMzQzY0MDAgYW5kIFMzQzY0MTAuCisgKgorICogVGhlIGZpbGUgY29udGFpbnMgdGhlIGNwdSBzcGVjaWZpYyBpdGVtcyB3aGljaCBjaGFuZ2UgYmV0d2VlbiB3aGljaGV2ZXIKKyAqIGFyY2hpdGVjdHVyZSBpcyBzZWxlY3RlZC4gU2VlIDxwbGF0L3JlZ3MtZmIuaD4gZm9yIHRoZSBjb3JlIGRlZmluaXRpb25zCisgKiB0aGF0IGFyZSB0aGUgc2FtZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogaW5jbHVkZSB0aGUgY29yZSBkZWZpbml0aW9ucyBoZXJlLCBpbiBjYXNlIHdlIHJlYWxseSBkbyBuZWVkIHRvCisgKiBvdmVycmlkZSB0aGVtIGF0IGEgbGF0ZXIgZGF0ZS4KKyovCisKKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmIuaD4KKworI2RlZmluZSBTM0NfRkJfTUFYX1dJTiAoNSkgIC8qIG51bWJlciBvZiBoYXJkd2FyZSB3aW5kb3dzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgVklEQ09OMV9GU1RBVFVTX0VWRU4JKDEgPDwgMTUpCisKKy8qIFZpZGVvIHRpbWluZyBjb250cm9scyAqLworI2RlZmluZSBWSURUQ09OMAkJCQkoMHgxMCkKKyNkZWZpbmUgVklEVENPTjEJCQkJKDB4MTQpCisjZGVmaW5lIFZJRFRDT04yCQkJCSgweDE4KQorCisvKiBXaW5kb3cgcG9zaXRpb24gY29udHJvbHMgKi8KKworI2RlZmluZSBXSU5DT04oX3dpbikJCQkJKDB4MjAgKyAoKF93aW4pICogNCkpCisKKy8qIE9TRDEgYW5kIE9TRDQgZG8gbm90IGhhdmUgcmVnaXN0ZXIgRCAqLworCisjZGVmaW5lIFZJRE9TRF9BKF93aW4pCQkJCSgweDQwICsgKChfd2luKSAqIDE2KSkKKyNkZWZpbmUgVklET1NEX0IoX3dpbikJCQkJKDB4NDQgKyAoKF93aW4pICogMTYpKQorI2RlZmluZSBWSURPU0RfQyhfd2luKQkJCQkoMHg0OCArICgoX3dpbikgKiAxNikpCisjZGVmaW5lIFZJRE9TRF9EKF93aW4pCQkJCSgweDRDICsgKChfd2luKSAqIDE2KSkKKworLyogVmlkZW8gYnVmZmVyIGFkZHJlc3NlcyAqLworCisjZGVmaW5lIFZJRFdfQlVGX1NUQVJUKF9idWZmKQkJCSgweEEwICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfU1RBUlQxKF9idWZmKQkJCSgweEE0ICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfRU5EKF9idWZmKQkJCSgweEQwICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfRU5EMShfYnVmZikJCQkoMHhENCArICgoX2J1ZmYpICogOCkpCisjZGVmaW5lIFZJRFdfQlVGX1NJWkUoX2J1ZmYpCQkJKDB4MTAwICsgKChfYnVmZikgKiA0KSkKKworI2RlZmluZSBWSURJTlRDT04wCQkJCSgweDEzMCkKKworI2RlZmluZSBXeEtFWUNPTnkoX3dpbiwgX2NvbikJCQkoKDB4MTQwICsgKChfd2luKSAqIDgpKSArICgoX2NvbikgKiA0KSkKKworLyogV0lOQ09OeCAqLworCisjZGVmaW5lIFdJTkNPTnhfQ1NDV0lEVEhfTUFTSwkJCSgweDMgPDwgMjYpCisjZGVmaW5lIFdJTkNPTnhfQ1NDV0lEVEhfU0hJRlQJCQkoMjYpCisjZGVmaW5lIFdJTkNPTnhfQ1NDV0lEVEhfV0lERQkJCSgweDAgPDwgMjYpCisjZGVmaW5lIFdJTkNPTnhfQ1NDV0lEVEhfTkFSUk9XCQkJKDB4MyA8PCAyNikKKworI2RlZmluZSBXSU5DT054X0VOTE9DQUwJCQkJKDEgPDwgMjIpCisjZGVmaW5lIFdJTkNPTnhfQlVGU1RBVFVTCQkJKDEgPDwgMjEpCisjZGVmaW5lIFdJTkNPTnhfQlVGU0VMCQkJCSgxIDw8IDIwKQorI2RlZmluZSBXSU5DT054X0JVRkFVVE9FTgkJCSgxIDw8IDE5KQorI2RlZmluZSBXSU5DT054X1lDYkNyCQkJCSgxIDw8IDEzKQorCisjZGVmaW5lIFdJTkNPTjFfTE9DQUxTRUxfQ0FNSUYJCQkoMSA8PCAyMykKKworI2RlZmluZSBXSU5DT04yX0xPQ0FMU0VMX0NBTUlGCQkJKDEgPDwgMjMpCisjZGVmaW5lIFdJTkNPTjJfQkxEX1BJWAkJCQkoMSA8PCA2KQorCisjZGVmaW5lIFdJTkNPTjJfQUxQSEFfU0VMCQkJKDEgPDwgMSkKKyNkZWZpbmUgV0lOQ09OMl9CUFBNT0RFX01BU0sJCQkoMHhmIDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV9TSElGVAkJCSgyKQorI2RlZmluZSBXSU5DT04yX0JQUE1PREVfMUJQUAkJCSgweDAgPDwgMikKKyNkZWZpbmUgV0lOQ09OMl9CUFBNT0RFXzJCUFAJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV80QlBQCQkJKDB4MiA8PCAyKQorI2RlZmluZSBXSU5DT04yX0JQUE1PREVfOEJQUF8xMjMyCQkoMHg0IDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV8xNkJQUF81NjUJCSgweDUgPDwgMikKKyNkZWZpbmUgV0lOQ09OMl9CUFBNT0RFXzE2QlBQX0ExNTU1CQkoMHg2IDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV8xNkJQUF9JMTU1NQkJKDB4NyA8PCAyKQorI2RlZmluZSBXSU5DT04yX0JQUE1PREVfMThCUFBfNjY2CQkoMHg4IDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV8xOEJQUF9BMTY2NQkJKDB4OSA8PCAyKQorI2RlZmluZSBXSU5DT04yX0JQUE1PREVfMTlCUFBfQTE2NjYJCSgweGEgPDwgMikKKyNkZWZpbmUgV0lOQ09OMl9CUFBNT0RFXzI0QlBQXzg4OAkJKDB4YiA8PCAyKQorI2RlZmluZSBXSU5DT04yX0JQUE1PREVfMjRCUFBfQTE4ODcJCSgweGMgPDwgMikKKyNkZWZpbmUgV0lOQ09OMl9CUFBNT0RFXzI1QlBQX0ExODg4CQkoMHhkIDw8IDIpCisjZGVmaW5lIFdJTkNPTjJfQlBQTU9ERV8yOEJQUF9BNDg4OAkJKDB4ZCA8PCAyKQorCisjZGVmaW5lIFdJTkNPTjNfQkxEX1BJWAkJCQkoMSA8PCA2KQorCisjZGVmaW5lIFdJTkNPTjNfQUxQSEFfU0VMCQkJKDEgPDwgMSkKKyNkZWZpbmUgV0lOQ09OM19CUFBNT0RFX01BU0sJCQkoMHhmIDw8IDIpCisjZGVmaW5lIFdJTkNPTjNfQlBQTU9ERV9TSElGVAkJCSgyKQorI2RlZmluZSBXSU5DT04zX0JQUE1PREVfMUJQUAkJCSgweDAgPDwgMikKKyNkZWZpbmUgV0lOQ09OM19CUFBNT0RFXzJCUFAJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFdJTkNPTjNfQlBQTU9ERV80QlBQCQkJKDB4MiA8PCAyKQorI2RlZmluZSBXSU5DT04zX0JQUE1PREVfMTZCUFBfNTY1CQkoMHg1IDw8IDIpCisjZGVmaW5lIFdJTkNPTjNfQlBQTU9ERV8xNkJQUF9BMTU1NQkJKDB4NiA8PCAyKQorI2RlZmluZSBXSU5DT04zX0JQUE1PREVfMTZCUFBfSTE1NTUJCSgweDcgPDwgMikKKyNkZWZpbmUgV0lOQ09OM19CUFBNT0RFXzE4QlBQXzY2NgkJKDB4OCA8PCAyKQorI2RlZmluZSBXSU5DT04zX0JQUE1PREVfMThCUFBfQTE2NjUJCSgweDkgPDwgMikKKyNkZWZpbmUgV0lOQ09OM19CUFBNT0RFXzE5QlBQX0ExNjY2CQkoMHhhIDw8IDIpCisjZGVmaW5lIFdJTkNPTjNfQlBQTU9ERV8yNEJQUF84ODgJCSgweGIgPDwgMikKKyNkZWZpbmUgV0lOQ09OM19CUFBNT0RFXzI0QlBQX0ExODg3CQkoMHhjIDw8IDIpCisjZGVmaW5lIFdJTkNPTjNfQlBQTU9ERV8yNUJQUF9BMTg4OAkJKDB4ZCA8PCAyKQorI2RlZmluZSBXSU5DT04zX0JQUE1PREVfMjhCUFBfQTQ4ODgJCSgweGQgPDwgMikKKworI2RlZmluZSBWSURJTlRDT04wX0ZJRklPU0VMX1dJTkRPVzIJCSgweDEwIDw8IDUpCisjZGVmaW5lIFZJRElOVENPTjBfRklGSU9TRUxfV0lORE9XMwkJKDB4MjAgPDwgNSkKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZJT1NFTF9XSU5ET1c0CQkoMHg0MCA8PCA1KQorCisjZGVmaW5lIERJVEhNT0RFCQkJCSgweDE3MCkKKyNkZWZpbmUgV0lOeE1BUChfd2luKQkJCQkoMHgxODAgKyAoKF93aW4pICogNCkpCisKKworI2RlZmluZSBESVRITU9ERV9SX1BPU19NQVNLCQkJKDB4MyA8PCA1KQorI2RlZmluZSBESVRITU9ERV9SX1BPU19TSElGVAkJCSg1KQorI2RlZmluZSBESVRITU9ERV9SX1BPU184QklUCQkJKDB4MCA8PCA1KQorI2RlZmluZSBESVRITU9ERV9SX1BPU182QklUCQkJKDB4MSA8PCA1KQorI2RlZmluZSBESVRITU9ERV9SX1BPU181QklUCQkJKDB4MiA8PCA1KQorCisjZGVmaW5lIERJVEhNT0RFX0dfUE9TX01BU0sJCQkoMHgzIDw8IDMpCisjZGVmaW5lIERJVEhNT0RFX0dfUE9TX1NISUZUCQkJKDMpCisjZGVmaW5lIERJVEhNT0RFX0dfUE9TXzhCSVQJCQkoMHgwIDw8IDMpCisjZGVmaW5lIERJVEhNT0RFX0dfUE9TXzZCSVQJCQkoMHgxIDw8IDMpCisjZGVmaW5lIERJVEhNT0RFX0dfUE9TXzVCSVQJCQkoMHgyIDw8IDMpCisKKyNkZWZpbmUgRElUSE1PREVfQl9QT1NfTUFTSwkJCSgweDMgPDwgMSkKKyNkZWZpbmUgRElUSE1PREVfQl9QT1NfU0hJRlQJCQkoMSkKKyNkZWZpbmUgRElUSE1PREVfQl9QT1NfOEJJVAkJCSgweDAgPDwgMSkKKyNkZWZpbmUgRElUSE1PREVfQl9QT1NfNkJJVAkJCSgweDEgPDwgMSkKKyNkZWZpbmUgRElUSE1PREVfQl9QT1NfNUJJVAkJCSgweDIgPDwgMSkKKworI2RlZmluZSBESVRITU9ERV9ESVRIX0VOCQkJKDEgPDwgMCkKKworI2RlZmluZSBXUEFMQ09OCQkJCQkoMHgxQTApCisKKyNkZWZpbmUgV1BBTENPTl9XNFBBTF8xNkJQUF9BNTU1CQkoMSA8PCA4KQorI2RlZmluZSBXUEFMQ09OX1czUEFMXzE2QlBQX0E1NTUJCSgxIDw8IDcpCisjZGVmaW5lIFdQQUxDT05fVzJQQUxfMTZCUFBfQTU1NQkJKDEgPDwgNikKKworLyogUGFsZXR0ZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBXSU4yX1BBTChfZW50cnkpCQkJKDB4MzAwICsgKChfZW50cnkpICogMikpCisjZGVmaW5lIFdJTjNfUEFMKF9lbnRyeSkJCQkoMHgzMjAgKyAoKF9lbnRyeSkgKiAyKSkKKyNkZWZpbmUgV0lONF9QQUwoX2VudHJ5KQkJCSgweDM0MCArICgoX2VudHJ5KSAqIDIpKQorI2RlZmluZSBXSU4wX1BBTChfZW50cnkpCQkJKDB4NDAwICsgKChfZW50cnkpICogNCkpCisjZGVmaW5lIFdJTjFfUEFMKF9lbnRyeSkJCQkoMHg4MDAgKyAoKF9lbnRyeSkgKiA0KSkKKworLyogc3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNvZGUgZm9yIHBhbGV0dGUgc2l6ZXMsIGFuZCBvdGhlcgorICogaW5mb3JtYXRpb24gdGhhdCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB3aGljaCBhcmNoaXRlY3R1cmUgaXMgYmVpbmcKKyAqIGNvbXBpbGVkLgorKi8KKworLyogcmV0dXJuIHRydWUgaWYgd2luZG93IF93aW4gaGFzIE9TRCByZWdpc3RlciBEICovCisjZGVmaW5lIHMzY19mYl9oYXNfb3NkX2QoX3dpbikgKChfd2luKSAhPSA0ICYmIChfd2luKSAhPSAwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzM2NfZmJfd2luX3BhbF9zaXplKHVuc2lnbmVkIGludCB3aW4pCit7CisJaWYgKHdpbiA8IDIpCisJCXJldHVybiAyNTY7CisJaWYgKHdpbiA8IDQpCisJCXJldHVybiAxNjsKKwlpZiAod2luID09IDQpCisJCXJldHVybiA0OworCisJQlVHKCk7CS8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLworfQorCitzdGF0aWMgaW5saW5lIGludCBzM2NfZmJfdmFsaWRhdGVfd2luX2JwcCh1bnNpZ25lZCBpbnQgd2luLCB1bnNpZ25lZCBpbnQgYnBwKQoreworCS8qIGFsbCB3aW5kb3dzIGNhbiBkbyAxLzIgYnBwICovCisKKwlpZiAoKGJwcCA9PSAyNSB8fCBicHAgPT0gMTkpICYmIHdpbiA9PSAwKQorCQlyZXR1cm4gMDsJLyogd2luIDAgZG9lcyBub3QgaGF2ZSAxOSBvciAyNWJwcCBtb2RlcyAqLworCisJaWYgKGJwcCA9PSA0ICYmIHdpbiA9PSA0KQorCQlyZXR1cm4gMDsKKworCWlmIChicHAgPT0gOCAmJiAod2luID49IDMpKQorCQlyZXR1cm4gMDsJLyogd2luIDMvNCBjYW5ub3QgZG8gOGJwcCBpbiBhbnkgbW9kZSAqLworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHMzY19mYl9wYWxfcmVnKHVuc2lnbmVkIGludCB3aW5kb3csIGludCByZWcpCit7CisJc3dpdGNoICh3aW5kb3cpIHsKKwljYXNlIDA6IHJldHVybiBXSU4wX1BBTChyZWcpOworCWNhc2UgMTogcmV0dXJuIFdJTjFfUEFMKHJlZyk7CisJY2FzZSAyOiByZXR1cm4gV0lOMl9QQUwocmVnKTsKKwljYXNlIDM6IHJldHVybiBXSU4zX1BBTChyZWcpOworCWNhc2UgNDogcmV0dXJuIFdJTjRfUEFMKHJlZyk7CisJfQorCisJQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzY19mYl9wYWxfaXMxNih1bnNpZ25lZCBpbnQgd2luZG93KQoreworCXJldHVybiB3aW5kb3cgPiAxOworfQorCitzdHJ1Y3QgczNjX2ZiX3BhbGV0dGUgeworCXN0cnVjdCBmYl9iaXRmaWVsZAlyOworCXN0cnVjdCBmYl9iaXRmaWVsZAlnOworCXN0cnVjdCBmYl9iaXRmaWVsZAliOworCXN0cnVjdCBmYl9iaXRmaWVsZAlhOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHMzY19mYl9pbml0X3BhbGV0dGUodW5zaWduZWQgaW50IHdpbmRvdywKKwkJCQkgICAgICAgc3RydWN0IHMzY19mYl9wYWxldHRlICpwYWxldHRlKQoreworCWlmICh3aW5kb3cgPCAyKSB7CisJCS8qIFdpbmRvd3MgMC8xIGFyZSA4LzgvOCBvciBBLzgvOC84ICovCisJCXBhbGV0dGUtPnIub2Zmc2V0ID0gMTY7CisJCXBhbGV0dGUtPnIubGVuZ3RoID0gODsKKwkJcGFsZXR0ZS0+Zy5vZmZzZXQgPSA4OworCQlwYWxldHRlLT5nLmxlbmd0aCA9IDg7CisJCXBhbGV0dGUtPmIub2Zmc2V0ID0gMDsKKwkJcGFsZXR0ZS0+Yi5sZW5ndGggPSA4OworCX0gZWxzZSB7CisJCS8qIGN1cnJlbnRseSB3ZSBhc3N1bWUgUkdCIDUvNi81ICovCisJCXBhbGV0dGUtPnIub2Zmc2V0ID0gMTE7CisJCXBhbGV0dGUtPnIubGVuZ3RoID0gNTsKKwkJcGFsZXR0ZS0+Zy5vZmZzZXQgPSA1OworCQlwYWxldHRlLT5nLmxlbmd0aCA9IDY7CisJCXBhbGV0dGUtPmIub2Zmc2V0ID0gMDsKKwkJcGFsZXR0ZS0+Yi5sZW5ndGggPSA1OworCX0KK30KKworLyogTm90ZXMgb24gcGVyLXdpbmRvdyBicHAgc2V0dGluZ3MKKyAqCisgKiBWYWx1ZQlXaW4wCSBXaW4xCSAgV2luMgkgICBXaW4zCSAgICBXaW4gNAorICogMDAwMAkJMShQKQkgMShQKQkgIDEoUCkJICAgMShQKQkgICAgMShQKQorICogMDAwMQkJMihQKQkgMihQKSAgICAgMihQKQkgICAyKFApCSAgICAyKFApCisgKiAwMDEwCQk0KFApCSA0KFApICAgICA0KFApCSAgIDQoUCkgICAgIC1ub25lLQorICogMDAxMQkJOChQKQkgOChQKSAgICAgLW5vbmUtICAgLW5vbmUtICAgLW5vbmUtCisgKiAwMTAwCQktbm9uZS0JIDgoQTIzMikgIDgoQTIzMikgIC1ub25lLSAgIC1ub25lLQorICogMDEwMQkJMTYoNTY1KQkgMTYoNTY1KSAgMTYoNTY1KSAgMTYoNTY1KSAgIDE2KDU2NSkKKyAqIDAxMTAJCS1ub25lLQkgMTYoQTU1NSkgMTYoQTU1NSkgMTYoQTU1NSkgIDE2KEE1NTUpCisgKiAwMTExCQkxNihJNTU1KSAxNihJNTY1KSAxNihJNTU1KSAxNihJNTU1KSAgMTYoSTU1NSkKKyAqIDEwMDAJCTE4KDY2NikJIDE4KDY2NikgIDE4KDY2NikgIDE4KDY2NikgICAxOCg2NjYpCisgKiAxMDAxCQktbm9uZS0JIDE4KEE2NjUpIDE4KEE2NjUpIDE4KEE2NjUpICAxNihBNjY1KQorICogMTAxMAkJLW5vbmUtCSAxOShBNjY2KSAxOShBNjY2KSAxOShBNjY2KSAgMTkoQTY2NikKKyAqIDEwMTEJCTI0KDg4OCkJIDI0KDg4OCkgIDI0KDg4OCkgIDI0KDg4OCkgICAyNCg4ODgpCisgKiAxMTAwCQktbm9uZS0JIDI0KEE4ODcpIDI0KEE4ODcpIDI0KEE4ODcpICAyNChBODg3KQorICogMTEwMQkJLW5vbmUtCSAyNShBODg4KSAyNShBODg4KSAyNShBODg4KSAgMjUoQTg4OCkKKyAqIDExMTAJCS1ub25lLQkgLW5vbmUtCSAgLW5vbmUtICAgLW5vbmUtICAgIC1ub25lLQorICogMTExMQkJLW5vbmUtCSAtbm9uZS0gICAtbm9uZS0gICAtbm9uZS0gICAgLW5vbmUtCisqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjY2U2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKQEAgLTAsMCArMSwyMCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0M2NFhYIC0gSVJRIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9SRUdTX0lSUV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19JUlFfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgorCisjZW5kaWYgLyogX19BU01fQVJDSF82NDAwX1JFR1NfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmJiYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0M2NDAwIC0gc3lzdGVtIGltcGxlbWVudGF0aW9uCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0ggX19GSUxFX18KKworc3RhdGljIHZvaWQgYXJjaF9pZGxlKHZvaWQpCit7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfQorCitzdGF0aWMgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3RpY2suaCBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvdGljay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzBkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3RpY2suaApAQCAtMCwwICsxLDI5IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3RpY2suaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDNjRYWCAtIFRpbWVyIHRpY2sgc3VwcG9ydCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVElDS19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfVElDS19IIF9fRklMRV9fCisKKy8qIG5vdGUsIHRoZSB0aW1lciBpbnRlcnJ1dHBzIHR1cm4gdXAgaW4gMiBwbGFjZXMsIHRoZSB2aWMgYW5kIHRoZW4KKyAqIHRoZSB0aW1lciBibG9jay4gV2UgdGFrZSB0aGUgVklDIGFzIHRoZSBiYXNlIGF0IHRoZSBtb21lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHMzYzI0eHhfb3N0aW1lcl9wZW5kaW5nKHZvaWQpCit7CisJdTMyIHBlbmQgPSBfX3Jhd19yZWFkbChTM0NfVkFfVklDMCArIFZJQ19SQVdfU1RBVFVTKTsKKwlyZXR1cm4gcGVuZCAmIDEgPDwgKElSUV9USU1FUjRfVklDIC0gUzNDNjRYWF9JUlFfVklDMCgwKSk7Cit9CisKKyNkZWZpbmUgVElDS19NQVgJKDB4ZmZmZmZmZmYpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIXzY0MDBfVElDS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTgyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMCwwICsxLDI4IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDNjQwMCAtIHVuY29tcHJlc3MgY29kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPHBsYXQvdW5jb21wcmVzcy5oPgorCitzdGF0aWMgdm9pZCBhcmNoX2RldGVjdF9jcHUodm9pZCkKK3sKKwkvKiB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnkgY3B1IGRldGVjdGlvbiBoZXJlIGF0IHRoZSBtb21lbnQuICovCisJZmlmb19tYXNrID0gUzNDMjQ0MF9VRlNUQVRfVFhNQVNLOworCWZpZm9fbWF4ID0gNjMgPDwgUzNDMjQ0MF9VRlNUQVRfVFhTSElGVDsKK30KKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTAxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MTAvS2NvbmZpZwpAQCAtMCwwICsxLDYyIEBACisjIGFyY2gvYXJtL21hY2gtczNjNjQxMC9LY29uZmlnCisjCisjIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisjIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworIworIyBMaWNlbnNlZCB1bmRlciBHUEx2MgorCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFMzQzY0MTAgQ1BVCisKK2NvbmZpZyBDUFVfUzNDNjQxMAorCWJvb2wKKwlzZWxlY3QgQ1BVX1MzQzY0MDBfSU5JVAorCXNlbGVjdCBDUFVfUzNDNjQwMF9DTE9DSworCWhlbHAKKwkgIEVuYWJsZSBTM0M2NDEwIENQVSBzdXBwb3J0CisKK2NvbmZpZyBTM0M2NDEwX1NFVFVQX1NESENJCisJYm9vbAorCWhlbHAKKwkgIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yIFMzQzY0MTAgYmFzZWQgU0RIQ0kgc3lzdGVtcworCitjb25maWcgTUFDSF9TTURLNjQxMAorCWJvb2wgIlNNREs2NDEwIgorCXNlbGVjdCBDUFVfUzNDNjQxMAorCXNlbGVjdCBTM0NfREVWX0hTTU1DCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMxCisJc2VsZWN0IFMzQ19ERVZfSTJDMQorCXNlbGVjdCBTM0NfREVWX0ZCCisJc2VsZWN0IFMzQzY0MTBfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgUzNDNjRYWF9TRVRVUF9JMkMxCisJc2VsZWN0IFMzQzY0WFhfU0VUVVBfRkJfMjRCUFAKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIHRoZSBTYW1zdW5nIFNNREs2NDEwCisKKyMgQXQgbGVhc3Qgc29tZSBvZiB0aGUgU01ESzY0MTBzIHdlcmUgc2hpcHBlZCB3aXRoIHRoZSBjYXJkIGRldGVjdAorIyBmb3IgdGhlIE1NQy9TRCBzbG90cyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgaW5wdXQuIFRoaXMgbWVhbnMgdGhhdAorIyBlaXRoZXIgdGhlIGJvYXJkcyBuZWVkIHRvIGJlIGFsdGVyZWQgdG8gaGF2ZSBjaGFubmVsMCB0byBhbiBhbHRlcm5hdGUKKyMgY29uZmlndXJhdGlvbiBvciB0aGF0IG9ubHkgb25lIHNsb3QgY2FuIGJlIHVzZWQuCisKK2Nob2ljZQorCXByb21wdCAiU01ESzY0MTAgTU1DL1NEIHNsb3Qgc2V0dXAiCisJZGVwZW5kcyBvbiBNQUNIX1NNREs2NDEwCisKK2NvbmZpZyBTTURLNjQxMF9TRF9DSDAKKwlib29sICJVc2UgY2hhbm5lbCAwIG9ubHkiCisJZGVwZW5kcyBvbiBNQUNIX1NNREs2NDEwCisJaGVscAorICAgICAgICAgIFNlbGVjdCBDT043IChjaGFubmVsIDApIGFzIHRoZSBNTUMvU0Qgc2xvdCwgYXMKKwkgIGF0IGxlYXN0IHNvbWUgU01ESzY0MTAgYm9hcmRzIGNvbWUgd2l0aCB0aGUKKwkgIHJlc2lzdG9ycyBmaXR0ZWQgc28gdGhhdCB0aGUgY2FyZCBkZXRlY3RzIGZvcgorCSAgY2hhbm5lbHMgMCBhbmQgMSBhcmUgdGhlIHNhbWUuCisgICAgICAgCitjb25maWcgU01ESzY0MTBfU0RfQ0gxCisJYm9vbCAiVXNlIGNoYW5uZWwgMSBvbmx5IgorCWRlcGVuZHMgb24gTUFDSF9TTURLNjQxMAorCWhlbHAKKyAgICAgICAgICBTZWxlY3QgQ09ONiAoY2hhbm5lbCAxKSBhcyB0aGUgTU1DL1NEIHNsb3QsIGFzCisJICBhdCBsZWFzdCBzb21lIFNNREs2NDEwIGJvYXJkcyBjb21lIHdpdGggdGhlCisJICByZXNpc3RvcnMgZml0dGVkIHNvIHRoYXQgdGhlIGNhcmQgZGV0ZWN0cyBmb3IKKwkgIGNoYW5uZWxzIDAgYW5kIDEgYXJlIHRoZSBzYW1lLgorCitlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q0ZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMgYXJjaC9hcm0vcGxhdC1zM2M2NDEwL01ha2VmaWxlCisjCisjIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisjIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworIworIyBMaWNlbnNlZCB1bmRlciBHUEx2MgorCitvYmoteQkJCQk6PQorb2JqLW0JCQkJOj0KK29iai1uCQkJCTo9CitvYmotCQkJCTo9CisKKyMgQ29yZSBzdXBwb3J0IGZvciBTM0M2NDEwIHN5c3RlbQorCitvYmotJChDT05GSUdfQ1BVX1MzQzY0MTApCSs9IGNwdS5vCisKKyMgSGVscGVyIGFuZCBkZXZpY2Ugc3VwcG9ydAorCitvYmotJChDT05GSUdfUzNDNjQxMF9TRVRVUF9TREhDSSkJKz0gc2V0dXAtc2RoY2kubworCisjIG1hY2hpbmUgc3VwcG9ydAorCitvYmotJChDT05GSUdfTUFDSF9TTURLNjQxMCkJKz0gbWFjaC1zbWRrNjQxMC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MTAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0MTAvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3M2NhNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9jcHUuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL2NwdS5jCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CisKKy8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzM2M2NDEwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7Cit9OworCisvKiBzM2M2NDEwX21hcF9pbworICoKKyAqIHJlZ2lzdGVyIHRoZSBzdGFuZGFyZCBjcHUgSU8gYXJlYXMKKyovCisKK3ZvaWQgX19pbml0IHMzYzY0MTBfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KHMzYzY0MTBfaW9kZXNjLCBBUlJBWV9TSVpFKHMzYzY0MTBfaW9kZXNjKSk7CisKKwkvKiBpbml0aWFsaXNlIGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLworCXMzYzY0MTBfZGVmYXVsdF9zZGhjaTAoKTsKKwlzM2M2NDEwX2RlZmF1bHRfc2RoY2kxKCk7CisKKwkvKiB0aGUgaTJjIGRldmljZXMgYXJlIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBzM2MyNDQwICovCisJczNjX2kyYzBfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKwlzM2NfaTJjMV9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOworfQorCit2b2lkIF9faW5pdCBzM2M2NDEwX2luaXRfY2xvY2tzKGludCB4dGFsKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5pdGlhbGlzaW5nIGNsb2Nrc1xuIiwgX19mdW5jX18pOworCXMzYzI0eHhfcmVnaXN0ZXJfYmFzZWNsb2Nrcyh4dGFsKTsKKwlzM2M2NHh4X3JlZ2lzdGVyX2Nsb2NrcygpOworCXMzYzY0MDBfcmVnaXN0ZXJfY2xvY2tzKCk7CisJczNjNjQwMF9zZXR1cF9jbG9ja3MoKTsKK30KKwordm9pZCBfX2luaXQgczNjNjQxMF9pbml0X2lycSh2b2lkKQoreworCS8qIFZJQzAgaXMgbWlzc2luZyBJUlE3LCBWSUMxIGlzIGZ1bGx5IHBvcHVsYXRlZC4gKi8KKwlzM2M2NHh4X2luaXRfaXJxKH4wICYgfigxIDw8IDcpLCB+MCk7Cit9CisKK3N0cnVjdCBzeXNkZXZfY2xhc3MgczNjNjQxMF9zeXNjbGFzcyA9IHsKKwkubmFtZQk9ICJzM2M2NDEwLWNvcmUiLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHMzYzY0MTBfc3lzZGV2ID0geworCS5jbHMJPSAmczNjNjQxMF9zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzY0MTBfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmczNjNjQxMF9zeXNjbGFzcyk7Cit9CisKK2NvcmVfaW5pdGNhbGwoczNjNjQxMF9jb3JlX2luaXQpOworCitpbnQgX19pbml0IHMzYzY0MTBfaW5pdCh2b2lkKQoreworCXByaW50aygiUzNDNjQxMDogSW5pdGlhbGlzaW5nIGFyY2hpdGVjdHVyZVxuIik7CisKKwlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzM2M2NDEwX3N5c2Rldik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0MTAvbWFjaC1zbWRrNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL21hY2gtc21kazY0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzRkNDcxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL21hY2gtc21kazY0MTAuYwpAQCAtMCwwICsxLDE4NSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL21hY2gtc21kazY0MTAuYworICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworI2RlZmluZSBVQ09OIFMzQzI0MTBfVUNPTl9ERUZBVUxUIHwgUzNDMjQxMF9VQ09OX1VDTEsKKyNkZWZpbmUgVUxDT04gUzNDMjQxMF9MQ09OX0NTOCB8IFMzQzI0MTBfTENPTl9QTk9ORSB8IFMzQzI0MTBfTENPTl9TVE9QQgorI2RlZmluZSBVRkNPTiBTM0MyNDEwX1VGQ09OX1JYVFJJRzggfCBTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHNtZGs2NDEwX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJICAgICA9IDAsCisJCS5mbGFncwkgICAgID0gMCwKKwkJLnVjb24JICAgICA9IDB4M2M1LAorCQkudWxjb24JICAgICA9IDB4MDMsCisJCS51ZmNvbgkgICAgID0gMHg1MSwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMSwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgzYzUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0sCit9OworCisvKiBmcmFtZWJ1ZmZlciBhbmQgTENEIHNldHVwLiAqLworCisvKiBHUEYxNSA9IExDRCBiYWNrbGlnaHQgY29udHJvbAorICogR1BGMTMgPT4gUGFuZWwgcG93ZXIKKyAqIEdQTjUgPSBMQ0QgblJFU0VUIHNpZ25hbAorICogUFdNX1RPVVQxID0+IGJhY2tsaWdodCBicmlnaHRuZXNzCisgKi8KKworc3RhdGljIHZvaWQgc21kazY0MTBfbGNkX3Bvd2VyX3NldChzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJICAgdW5zaWduZWQgaW50IHBvd2VyKQoreworCWlmIChwb3dlcikgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUzNDNjRYWF9HUEYoMTMpLCAxKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFMzQzY0WFhfR1BGKDE1KSwgMSk7CisKKwkJLyogZmlyZSBuUkVTRVQgb24gcG93ZXIgdXAgKi8KKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFMzQzY0WFhfR1BOKDUpLCAwKTsKKwkJbXNsZWVwKDEwKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFMzQzY0WFhfR1BOKDUpLCAxKTsKKwkJbXNsZWVwKDEpOworCX0gZWxzZSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChTM0M2NFhYX0dQRigxNSksIDApOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUzNDNjRYWF9HUEYoMTMpLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBzbWRrNjQxMF9sY2RfcG93ZXJfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCT0gc21kazY0MTBfbGNkX3Bvd2VyX3NldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtZGs2NDEwX2xjZF9wb3dlcmRldiA9IHsKKwkubmFtZQkJCT0gInBsYXRmb3JtLWxjZCIsCisJLmRldi5wYXJlbnQJCT0gJnMzY19kZXZpY2VfZmIuZGV2LAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZzbWRrNjQxMF9sY2RfcG93ZXJfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BkX3dpbiBzbWRrNjQxMF9mYl93aW4wID0geworCS8qIHRoaXMgaXMgdG8gZW5zdXJlIHdlIHVzZSB3aW4wICovCisJLndpbl9tb2RlCT0geworCQkucGl4Y2xvY2sJPSA0MTA5NCwKKwkJLmxlZnRfbWFyZ2luCT0gOCwKKwkJLnJpZ2h0X21hcmdpbgk9IDEzLAorCQkudXBwZXJfbWFyZ2luCT0gNywKKwkJLmxvd2VyX21hcmdpbgk9IDUsCisJCS5oc3luY19sZW4JPSAzLAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnhyZXMJCT0gODAwLAorCQkueXJlcwkJPSA0ODAsCisJfSwKKwkubWF4X2JwcAk9IDMyLAorCS5kZWZhdWx0X2JwcAk9IDE2LAorfTsKKworLyogNDA1NTY2IGNsb2NrcyBwZXIgZnJhbWUgPT4gNjBIeiByZWZyZXNoIHJlcXVpcmVzIDI0MzMzOTYwSHogY2xvY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHNtZGs2NDEwX2xjZF9wZGF0YSBfX2luaXRkYXRhID0geworCS5zZXR1cF9ncGlvCT0gczNjNjR4eF9mYl9ncGlvX3NldHVwXzI0YnBwLAorCS53aW5bMF0JCT0gJnNtZGs2NDEwX2ZiX3dpbjAsCisJLnZpZGNvbjAJPSBWSURDT04wX1ZJRE9VVF9SR0IgfCBWSURDT04wX1BOUk1PREVfUkdCLAorCS52aWRjb24xCT0gVklEQ09OMV9JTlZfSFNZTkMgfCBWSURDT04xX0lOVl9WU1lOQywKK307CisKK3N0cnVjdCBtYXBfZGVzYyBzbWRrNjQxMF9pb2Rlc2NbXSA9IHt9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21kazY0MTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX1NNREs2NDEwX1NEX0NIMAorCSZzM2NfZGV2aWNlX2hzbW1jMCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTURLNjQxMF9TRF9DSDEKKwkmczNjX2RldmljZV9oc21tYzEsCisjZW5kaWYKKwkmczNjX2RldmljZV9pMmMwLAorCSZzM2NfZGV2aWNlX2kyYzEsCisJJnMzY19kZXZpY2VfZmIsCisJJnNtZGs2NDEwX2xjZF9wb3dlcmRldiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2RldnMwW10gX19pbml0ZGF0YSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCIyNGMwOCIsIDB4NTApLCB9LAorCXsgSTJDX0JPQVJEX0lORk8oIldNODU4MCIsIDBYMWIpLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czFbXSBfX2luaXRkYXRhID0geworCXsgSTJDX0JPQVJEX0lORk8oIjI0YzEyOCIsIDB4NTcpLCB9LAkvKiBTYW1zdW5nIFM1MjRBRDBYRDEgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrNjQxMF9tYXBfaW8odm9pZCkKK3sKKwlzM2M2NHh4X2luaXRfaW8oc21kazY0MTBfaW9kZXNjLCBBUlJBWV9TSVpFKHNtZGs2NDEwX2lvZGVzYykpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMTIwMDAwMDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrNjQxMF91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrNjQxMF91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21kazY0MTBfbWFjaGluZV9pbml0KHZvaWQpCit7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOworCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlzM2NfZmJfc2V0X3BsYXRkYXRhKCZzbWRrNjQxMF9sY2RfcGRhdGEpOworCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaTJjX2RldnMwLCBBUlJBWV9TSVpFKGkyY19kZXZzMCkpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyY19kZXZzMSwgQVJSQVlfU0laRShpMmNfZGV2czEpKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGs2NDEwX2RldmljZXMsIEFSUkFZX1NJWkUoc21kazY0MTBfZGV2aWNlcykpOworfQorCitNQUNISU5FX1NUQVJUKFNNREs2NDEwLCAiU01ESzY0MTAiKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KKwkucGh5c19pbwk9IFMzQ19QQV9VQVJUICYgMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisKKwkuaW5pdF9pcnEJPSBzM2M2NDEwX2luaXRfaXJxLAorCS5tYXBfaW8JCT0gc21kazY0MTBfbWFwX2lvLAorCS5pbml0X21hY2hpbmUJPSBzbWRrNjQxMF9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQxMC9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDEwL3NldHVwLXNkaGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1Nzg4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjQxMC9zZXR1cC1zZGhjaS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzY0MTAvc2V0dXAtc2RoY2kuYworICoKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0MTAgLSBIZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aWduIHVwIFNESENJIGRldmljZShzKSAoSFNNTUMpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorCisvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLworCitjaGFyICpzM2M2NDEwX2hzbW1jX2Nsa3NyY3NbNF0gPSB7CisJWzBdID0gImhzbW1jIiwKKwlbMV0gPSAiaHNtbWMiLAorCVsyXSA9ICJtbWNfYnVzIiwKKwkvKiBbM10gPSAiNDhtIiwgLSBub3RlIG5vdCBzdWNjZXNmdWxseSB1c2VkIHlldCAqLworfTsKKwordm9pZCBzM2M2NDEwX3NldHVwX3NkaGNpMF9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIGludCB3aWR0aCkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbzsKKwl1bnNpZ25lZCBpbnQgZW5kOworCisJZW5kID0gUzNDNjRYWF9HUEcoMiArIHdpZHRoKTsKKworCS8qIFNldCBhbGwgdGhlIG5lY2Vzc2FyeSBHUEcgcGlucyB0byBzcGVjaWFsLWZ1bmN0aW9uIDAgKi8KKwlmb3IgKGdwaW8gPSBTM0M2NFhYX0dQRygwKTsgZ3BpbyA8IGVuZDsgZ3BpbysrKSB7CisJCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMikpOworCQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfTk9ORSk7CisJfQorCisJczNjX2dwaW9fc2V0cHVsbChTM0M2NFhYX0dQRyg2KSwgUzNDX0dQSU9fUFVMTF9VUCk7CisJczNjX2dwaW9fY2ZncGluKFMzQzY0WFhfR1BHKDYpLCBTM0NfR1BJT19TRk4oMikpOworfQorCit2b2lkIHMzYzY0MTBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgdm9pZCBfX2lvbWVtICpyLAorCQkJCSAgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAorCQkJCSAgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJdTMyIGN0cmwyLCBjdHJsMzsKKworCS8qIGRvbid0IG5lZWQgdG8gYWx0ZXIgYW55dGhpbmcgYWNvcmRpbmcgdG8gY2FyZC10eXBlICovCisKKwl3cml0ZWwoUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV85bUEsIHIgKyBTM0M2NFhYX1NESENJX0NPTlRST0w0KTsKKworCWN0cmwyID0gcmVhZGwociArIFMzQ19TREhDSV9DT05UUk9MMik7CisJY3RybDIgJj0gUzNDX1NESENJX0NUUkwyX1NFTEJBU0VDTEtfTUFTSzsKKwljdHJsMiB8PSAoUzNDNjRYWF9TREhDSV9DVFJMMl9FTlNUQUFTWU5DQ0xSIHwKKwkJICBTM0M2NFhYX1NESENJX0NUUkwyX0VOQ01EQ05GTVNLIHwKKwkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5GQkNMS1JYIHwKKwkJICBTM0NfU0RIQ0lfQ1RSTDJfREZDTlRfTk9ORSB8CisJCSAgUzNDX1NESENJX0NUUkwyX0VOQ0xLT1VUSE9MRCk7CisKKwlpZiAoaW9zLT5jbG9jayA8IDI1ICogMTAwMDAwMCkKKwkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMyB8CisJCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMiB8CisJCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8CisJCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7CisJZWxzZQorCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ1RSTCAyPSUwOHgsIDM9JTA4eFxuIiwgX19mdW5jX18sIGN0cmwyLCBjdHJsMyk7CisJd3JpdGVsKGN0cmwyLCByICsgUzNDX1NESENJX0NPTlRST0wyKTsKKwl3cml0ZWwoY3RybDMsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOworfQorCit2b2lkIHMzYzY0MTBfc2V0dXBfc2RoY2kxX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgaW50IHdpZHRoKQoreworCXVuc2lnbmVkIGludCBncGlvOworCXVuc2lnbmVkIGludCBlbmQ7CisKKwllbmQgPSBTM0M2NFhYX0dQSCgyICsgd2lkdGgpOworCisJLyogU2V0IGFsbCB0aGUgbmVjZXNzYXJ5IEdQRyBwaW5zIHRvIHNwZWNpYWwtZnVuY3Rpb24gMCAqLworCWZvciAoZ3BpbyA9IFMzQzY0WFhfR1BIKDApOyBncGlvIDwgZW5kOyBncGlvKyspIHsKKwkJczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigyKSk7CisJCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKKwl9CisKKwlzM2NfZ3Bpb19zZXRwdWxsKFMzQzY0WFhfR1BHKDYpLCBTM0NfR1BJT19QVUxMX1VQKTsKKwlzM2NfZ3Bpb19jZmdwaW4oUzNDNjRYWF9HUEcoNiksIFMzQ19HUElPX1NGTigzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYwppbmRleCA0M2MzMGY4Li5kYWIzYzYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Nsb2NrLmMKQEAgLTMsNiArMyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTE0LDc2ICsxNSwxMiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogLyoKLSAqIFZlcnkgc2ltcGxlIGNsb2NrIGltcGxlbWVudGF0aW9uIC0gd2Ugb25seSBoYXZlIG9uZSBjbG9jayB0bwotICogZGVhbCB3aXRoIGF0IHRoZSBtb21lbnQsIHNvIHdlIG9ubHkgbWF0Y2ggdXNpbmcgdGhlICJuYW1lIi4KKyAqIFZlcnkgc2ltcGxlIGNsb2NrIGltcGxlbWVudGF0aW9uIC0gd2Ugb25seSBoYXZlIG9uZSBjbG9jayB0byBkZWFsIHdpdGguCiAgKi8KIHN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCWNvbnN0IGNoYXIJCSpuYW1lOwogCXVuc2lnbmVkIGludAkJZW5hYmxlZDsKLQl2b2lkCQkJKCplbmFibGUpKHZvaWQpOwotCXZvaWQJCQkoKmRpc2FibGUpKHZvaWQpOwogfTsKIAotc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NfbG9jayk7Ci0KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwLCAqY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDApIHsKLQkJCWNsayA9IHA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0KLQlyZXR1cm4gY2xrOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKLQotdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKLXsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7Ci0KLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2Nrc19sb2NrLCBmbGFncyk7Ci0JaWYgKGNsay0+ZW5hYmxlZCsrID09IDApCi0JCWNsay0+ZW5hYmxlKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7Ci0KLXZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlXQVJOX09OKGNsay0+ZW5hYmxlZCA9PSAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwotCWlmICgtLWNsay0+ZW5hYmxlZCA9PSAwKQotCQljbGstPmRpc2FibGUoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7Ci0KLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrLT5yYXRlOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwotCi0KIHN0YXRpYyB2b2lkIGNsa19ncGlvMjdfZW5hYmxlKHZvaWQpCiB7CiAJLyoKQEAgLTEwMiwzMyArMzksNTAgQEAKIAlHQUZSICY9IH5HUElPXzMyXzc2OGtIejsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGsgY2xrX2dwaW8yNyA9IHsKLQkubmFtZQkJPSAiU0ExMTExX0NMSyIsCi0JLnJhdGUJCT0gMzY4NjQwMCwKLQkuZW5hYmxlCQk9IGNsa19ncGlvMjdfZW5hYmxlLAotCS5kaXNhYmxlCT0gY2xrX2dwaW8yN19kaXNhYmxlLAotfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19ncGlvMjc7CiAKLWludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NfbG9jayk7CisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja3MpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKKwljb25zdCBjaGFyICpkZXZuYW1lID0gZGV2X25hbWUoZGV2KTsKKworCXJldHVybiBzdHJjbXAoZGV2bmFtZSwgInNhMTExMS4wIikgPyBFUlJfUFRSKC1FTk9FTlQpIDogJmNsa19ncGlvMjc7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19nZXQpOworCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworfQorRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzX2xvY2ssIGZsYWdzKTsKKwlpZiAoY2xrLT5lbmFibGVkKysgPT0gMCkKKwkJY2xrX2dwaW8yN19lbmFibGUoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjbGtfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKIAotdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfZGVsKCZjbGstPm5vZGUpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLXN0YXRpYyBpbnQgX19pbml0IGNsa19pbml0KHZvaWQpCi17Ci0JY2xrX3JlZ2lzdGVyKCZjbGtfZ3BpbzI3KTsKLQlyZXR1cm4gMDsKKwlXQVJOX09OKGNsay0+ZW5hYmxlZCA9PSAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOworCWlmICgtLWNsay0+ZW5hYmxlZCA9PSAwKQorCQljbGtfZ3BpbzI3X2Rpc2FibGUoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwogfQotYXJjaF9pbml0Y2FsbChjbGtfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKKwordW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAzNjg2NDAwOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwppbmRleCBmZTI4OTk5Li4yMDUyZWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwpAQCAtNjgsMjMgKzY4LDIyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgY29sbGllX3BjbWNpYV9zY29vcFtdID0gewotewotICAgICAgIC5kZXYgICAgICAgID0gJmNvbGxpZXNjb29wX2RldmljZS5kZXYsCi0gICAgICAgLmlycSAgICAgICAgPSBDT0xMSUVfSVJRX0dQSU9fQ0ZfSVJRLAotICAgICAgIC5jZF9pcnEgICAgID0gQ09MTElFX0lSUV9HUElPX0NGX0NELAotICAgICAgIC5jZF9pcnFfc3RyID0gIlBDTUNJQTAgQ0QiLAotfSwKKwl7CisJLmRldgkJPSAmY29sbGllc2Nvb3BfZGV2aWNlLmRldiwKKwkuaXJxCQk9IENPTExJRV9JUlFfR1BJT19DRl9JUlEsCisJLmNkX2lycQkJPSBDT0xMSUVfSVJRX0dQSU9fQ0ZfQ0QsCisJLmNkX2lycV9zdHIJPSAiUENNQ0lBMCBDRCIsCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2NvbmZpZyBjb2xsaWVfcGNtY2lhX2NvbmZpZyA9IHsKLQkuZGV2cyAgICAgICAgID0gJmNvbGxpZV9wY21jaWFfc2Nvb3BbMF0sCi0JLm51bV9kZXZzICAgICA9IDEsCisJLmRldnMJCT0gJmNvbGxpZV9wY21jaWFfc2Nvb3BbMF0sCisJLm51bV9kZXZzCT0gMSwKIH07CiAKLQogc3RhdGljIHN0cnVjdCBtY3BfcGxhdF9kYXRhIGNvbGxpZV9tY3BfZGF0YSA9IHsKLQkubWNjcjAgICAgICAgICAgPSBNQ0NSMF9BRE0gfCBNQ0NSMF9FeHRDbGssCi0JLnNjbGtfcmF0ZSAgICAgID0gOTIxNjAwMCwKKwkubWNjcjAJCT0gTUNDUjBfQURNIHwgTUNDUjBfRXh0Q2xrLAorCS5zY2xrX3JhdGUJPSA5MjE2MDAwLAogfTsKIAogI2lmZGVmIENPTkZJR19TSEFSUF9MT0NPTU8KQEAgLTk1LDE0ICs5NCwxNCBAQAogCiBzdGF0aWMgdm9pZCBjb2xsaWVfdWFydF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdV9pbnQgbWN0cmwpCiB7Ci0gCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCiAJCWxvY29tb19ncGlvX3dyaXRlKCZjb2xsaWVfbG9jb21vX2RldmljZS5kZXYsIExPQ09NT19HUElPX1JUUywgMCk7Ci0gCWVsc2UKKwllbHNlCiAJCWxvY29tb19ncGlvX3dyaXRlKCZjb2xsaWVfbG9jb21vX2RldmljZS5kZXYsIExPQ09NT19HUElPX1JUUywgMSk7CiAKLSAJaWYgKG1jdHJsICYgVElPQ01fRFRSKQorCWlmIChtY3RybCAmIFRJT0NNX0RUUikKIAkJbG9jb21vX2dwaW9fd3JpdGUoJmNvbGxpZV9sb2NvbW9fZGV2aWNlLmRldiwgTE9DT01PX0dQSU9fRFRSLCAwKTsKLSAJZWxzZQorCWVsc2UKIAkJbG9jb21vX2dwaW9fd3JpdGUoJmNvbGxpZV9sb2NvbW9fZGV2aWNlLmRldiwgTE9DT01PX0dQSU9fRFRSLCAxKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllX3BtLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWVfcG0uYwppbmRleCBiMTE2MWZjLi5iMzkzMDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWVfcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWVfcG0uYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9jb2xsaWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9zaGFycHNsX3BhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NoYXJwc2xfcG0uaD4KQEAgLTI2MywyNCArMjYzLDI0IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdWNiMXgwMF9kcml2ZXIgY29sbGllX3BtX3VjYl9kcml2ZXIgPSB7Ci0JLmFkZCAgICAgICAgICAgID0gY29sbGllX3BtX3VjYl9hZGQsCisJLmFkZAk9IGNvbGxpZV9wbV91Y2JfYWRkLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbGxpZV9wbV9kZXZpY2U7CiAKIHN0YXRpYyBpbnQgX19pbml0IGNvbGxpZV9wbV9pbml0KHZvaWQpCiB7Ci0gICAgICAgIGludCByZXQ7CisJaW50IHJldDsKIAotICAgICAgICBjb2xsaWVfcG1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzaGFycHNsLXBtIiwgLTEpOwotICAgICAgICBpZiAoIWNvbGxpZV9wbV9kZXZpY2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisJY29sbGllX3BtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2hhcnBzbC1wbSIsIC0xKTsKKwlpZiAoIWNvbGxpZV9wbV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOwogCi0gICAgICAgIGNvbGxpZV9wbV9kZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhID0gJmNvbGxpZV9wbV9tYWNoaW5mbzsKLSAgICAgICAgcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChjb2xsaWVfcG1fZGV2aWNlKTsKKwljb2xsaWVfcG1fZGV2aWNlLT5kZXYucGxhdGZvcm1fZGF0YSA9ICZjb2xsaWVfcG1fbWFjaGluZm87CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChjb2xsaWVfcG1fZGV2aWNlKTsKIAotICAgICAgICBpZiAocmV0KQotICAgICAgICAgICAgICAgIHBsYXRmb3JtX2RldmljZV9wdXQoY29sbGllX3BtX2RldmljZSk7CisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChjb2xsaWVfcG1fZGV2aWNlKTsKIAogCWlmICghcmV0KQogCQlyZXQgPSB1Y2IxeDAwX3JlZ2lzdGVyX2RyaXZlcigmY29sbGllX3BtX3VjYl9kcml2ZXIpOwpAQCAtMjkxLDcgKzI5MSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgY29sbGllX3BtX2V4aXQodm9pZCkKIHsKIAl1Y2IxeDAwX3VucmVnaXN0ZXJfZHJpdmVyKCZjb2xsaWVfcG1fdWNiX2RyaXZlcik7Ci0gICAgICAgIHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGNvbGxpZV9wbV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGNvbGxpZV9wbV9kZXZpY2UpOwogfQogCiBtb2R1bGVfaW5pdChjb2xsaWVfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMKaW5kZXggMjQ0ZDU5NS4uZWY4MTc4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMDAuYwpAQCAtMywxNyArMywxNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAyMDAxLCBUaGUgRGVsZnQgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5CiAgKgotICogQXV0aG9yczogCisgKiBBdXRob3JzOgogICogLSBKb2hhbiBQb3V3ZWxzZSAoSi5BLlBvdXdlbHNlQGl0cy50dWRlbGZ0Lm5sKTogaW5pdGlhbCB2ZXJzaW9uCiAgKiAtIEVyaWsgTW91dyAoSi5BLksuTW91d0BpdHMudHVkZWxmdC5ubCk6CiAgKiAgIC0gbWFqb3IgcmV3cml0ZSBmb3IgbGludXgtMi4zLjk5Ci0gKiAgIC0gcmV3cml0dGVuIGZvciB0aGUgbW9yZSBnZW5lcmljIHBvd2VyIG1hbmFnZW1lbnQgc2NoZW1lIGluIAorICogICAtIHJld3JpdHRlbiBmb3IgdGhlIG1vcmUgZ2VuZXJpYyBwb3dlciBtYW5hZ2VtZW50IHNjaGVtZSBpbgogICogICAgIGxpbnV4LTIuNC41LXJtazEKICAqCiAgKiBUaGlzIHNvZnR3YXJlIGhhcyBiZWVuIGRldmVsb3BlZCB3aGlsZSB3b3JraW5nIG9uIHRoZSBMQVJUCiAgKiBjb21wdXRpbmcgYm9hcmQgKGh0dHA6Ly93d3cubGFydG1ha2VyLm5sLyksIHdoaWNoIGlzCiAgKiBzcG9uc29yZWQgYnkgdGhlIE1vYmlsZSBNdWx0aS1tZWRpYSBDb21tdW5pY2F0aW9ucwotICogKGh0dHA6Ly93d3cubW1jLnR1ZGVsZnQubmwvKSBhbmQgVWJpcXVpdG91cyBDb21tdW5pY2F0aW9ucyAKKyAqIChodHRwOi8vd3d3Lm1tYy50dWRlbGZ0Lm5sLykgYW5kIFViaXF1aXRvdXMgQ29tbXVuaWNhdGlvbnMKICAqIChodHRwOi8vd3d3LnViaWNvbS50dWRlbGZ0Lm5sLykgcHJvamVjdHMuCiAgKgogICogVGhlIGF1dGhvcnMgY2FuIGJlIHJlYWNoZWQgYXQ6CkBAIC0zNiw3ICszNiw3IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQpAQCAtNDQsNyArNDQsNyBAQAogICoKICAqIFRoZW9yeSBvZiBvcGVyYXRpb25zCiAgKiA9PT09PT09PT09PT09PT09PT09PQotICogCisgKgogICogQ2xvY2sgc2NhbGluZyBjYW4gYmUgdXNlZCB0byBsb3dlciB0aGUgcG93ZXIgY29uc3VtcHRpb24gb2YgdGhlIENQVQogICogY29yZS4gVGhpcyB3aWxsIGdpdmUgeW91IGEgc29tZXdoYXQgbG9uZ2VyIHJ1bm5pbmcgdGltZS4KICAqCkBAIC01OCwxMSArNTgsMTEgQEAKICAqICAgTURDTkZHICAgIDB4QTAwMDAwMDAgICAgRFJBTSBjb25maWcKICAqICAgTURDQVMwICAgIDB4QTAwMDAwMDQgICAgQWNjZXNzIHdhdmVmb3JtCiAgKiAgIE1EQ0FTMSAgICAweEEwMDAwMDA4ICAgIEFjY2VzcyB3YXZlZm9ybQotICogICBNRENBUzIgICAgMHhBMDAwMDAwQyAgICBBY2Nlc3Mgd2F2ZWZvcm0gCisgKiAgIE1EQ0FTMiAgICAweEEwMDAwMDBDICAgIEFjY2VzcyB3YXZlZm9ybQogICoKICAqIENhcmUgbXVzdCBiZSB0YWtlbiB0byBjaGFuZ2UgdGhlIERSQU0gcGFyYW1ldGVycyB0aGUgY29ycmVjdCB3YXksCiAgKiBiZWNhdXNlIG90aGVyd2lzZSB0aGUgRFJBTSBiZWNvbWVzIHVudXNhYmxlIGFuZCB0aGUga2VybmVsIHdpbGwKLSAqIGNyYXNoLiAKKyAqIGNyYXNoLgogICoKICAqIFRoZSBzaW1wbGUgc29sdXRpb24gdG8gYXZvaWQgYSBrZXJuZWwgY3Jhc2ggaXMgdG8gcHV0IHRoZSBhY3R1YWwKICAqIGNsb2NrIGNoYW5nZSBpbiBST00gYW5kIGp1bXAgdG8gdGhhdCBjb2RlIGZyb20gdGhlIGtlcm5lbC4gVGhlIG1haW4KQEAgLTc1LDcgKzc1LDcgQEAKICAqIGFzIGxvbmcgYXMgYWxsIHJlLWNvbmZpZ3VyYXRpb24gc3RlcHMgeWllbGQgYSB2YWxpZCBEUkFNCiAgKiBjb25maWd1cmF0aW9uLiBUaGUgYWR2YW50YWdlcyBhcmUgY2xlYXI6IGl0IHdpbGwgcnVuIG9uIGFsbCBTQS0xMTAwCiAgKiBwbGF0Zm9ybXMsIGFuZCB0aGUgY29kZSBpcyB2ZXJ5IHNpbXBsZS4KLSAqIAorICoKICAqIElmIHlvdSByZWFsbHkgd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24gaW4KICAqIHNhMTEwMF91cGRhdGVfZHJhbV90aW1pbmdzKCksIHlvdSdsbCBoYXZlIHRvIHJlYWQgc2VjdGlvbnMgOC4yLAogICogOS41LjcuMywgYW5kIDEwLjIgZnJvbSB0aGUgIkludGVsIFN0cm9uZ0FSTSBTQS0xMTAwIE1pY3JvcHJvY2Vzc29yCkBAIC05Nyw3ICs5Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJaW50IHNwZWVkOwogCXUzMiBtZGNuZmc7Ci0JdTMyIG1kY2FzMDsgCisJdTMyIG1kY2FzMDsKIAl1MzIgbWRjYXMxOwogCXUzMiBtZGNhczI7CiB9IHNhMTEwMF9kcmFtX3JlZ3NfdDsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCS8qIE5vIHJpc2ssIG5vIGZ1bjogcnVuIHdpdGggaW50ZXJydXB0cyBvbiEgKi8KIAlpZiAobmV3X3NwZWVkID4gY3VycmVudF9zcGVlZCkgewogCQkvKiBXZSdyZSBnb2luZyBGQVNURVIsIHNvIGZpcnN0IHJlbGF4IHRoZSBtZW1vcnkKLQkJICogdGltaW5ncyBiZWZvcmUgY2hhbmdpbmcgdGhlIGNvcmUgZnJlcXVlbmN5IAorCQkgKiB0aW1pbmdzIGJlZm9yZSBjaGFuZ2luZyB0aGUgY29yZSBmcmVxdWVuY3kKIAkJICovCiAJCQogCQkvKiBIYWxmIHRoZSBtZW1vcnkgYWNjZXNzIGNsb2NrICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKaW5kZXggM2U0ZmIyMS4uNjNiMzJiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYwpAQCAtODEsMTQgKzgxLDE0IEBACiAJCS50d3IJCT0gOSwKIAkJLnJlZnJlc2gJPSA2NDAwMCwKIAkJLmNhc19sYXRlbmN5CT0gMywKLQl9LCB7ICAgIC8qIFNhbXN1bmcgSzRTMjgxNjMyQi0xSCAqLwotCSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIks0UzI4MTYzMkItMUgiLAotCQkucm93cyAgICAgICAgICAgPSAxMiwKLQkJLnRjayAgICAgICAgICAgID0gMTAsCi0JCS50cnAgICAgICAgICAgICA9IDIwLAotCQkudHdyICAgICAgICAgICAgPSAxMCwKLQkJLnJlZnJlc2ggICAgICAgID0gNjQwMDAsCi0JCS5jYXNfbGF0ZW5jeSAgICA9IDMsCisJfSwgewkvKiBTYW1zdW5nIEs0UzI4MTYzMkItMUggKi8KKwkJLm5hbWUgICAgICAgICAgID0gIks0UzI4MTYzMkItMUgiLAorCQkucm93cwkJPSAxMiwKKwkJLnRjawkJPSAxMCwKKwkJLnRycAkJPSAyMCwKKwkJLnR3cgkJPSAxMCwKKwkJLnJlZnJlc2gJPSA2NDAwMCwKKwkJLmNhc19sYXRlbmN5CT0gMywKIAl9LCB7CS8qIFNhbXN1bmcgS000MTZTNDAzMENUICovCiAJCS5uYW1lCQk9ICJLTTQxNlM0MDMwQ1QiLAogCQkucm93cwkJPSAxMywKQEAgLTIyMCw3ICsyMjAsNyBAQAogfQogCiAvKgotICogT2ssIHNldCB0aGUgQ1BVIGZyZXF1ZW5jeS4gIAorICogT2ssIHNldCB0aGUgQ1BVIGZyZXF1ZW5jeS4KICAqLwogc3RhdGljIGludCBzYTExMTBfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKaW5kZXggZjk5MGEzZS4uOTVmOWM1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZG1hLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogCiAjdW5kZWYgREVCVUcKQEAgLTExMywxMCArMTEzLDEwIEBACiAJCX0KIAl9CiAJaWYgKCFlcnIpIHsKLQkgICAgICAgaWYgKGRtYSkKLQkJICAgICAgIGRtYS0+ZGV2aWNlID0gZGV2aWNlOwotCSAgICAgICBlbHNlCi0JCSAgICAgICBlcnIgPSAtRU5PU1I7CisJCWlmIChkbWEpCisJCQlkbWEtPmRldmljZSA9IGRldmljZTsKKwkJZWxzZQorCQkJZXJyID0gLUVOT1NSOwogCX0KIAlzcGluX3VubG9jaygmZG1hX2xpc3RfbG9jayk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oMzYwMC5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2gzNjAwLmgKaW5kZXggM2NhMGVjZi4uOWNjNDdmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2gzNjAwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2gzNjAwLmgKQEAgLTMyLDE0ICszMiwxNCBAQAogI2RlZmluZSBtYWNoaW5lX2lzX2gzeHh4KCkgKG1hY2hpbmVfaXNfaDMxMDAoKSB8fCBtYWNoaW5lX2lzX2gzNjAwKCkgfHwgbWFjaGluZV9pc19oMzgwMCgpKQogCiAvKiBQaHlzaWNhbCBtZW1vcnkgcmVnaW9ucyBjb3JyZXNwb25kaW5nIHRvIGNoaXAgc2VsZWN0cyAqLwotI2RlZmluZSBIMzYwMF9FR1BJT19QSFlTICAgICAoU0ExMTAwX0NTNV9QSFlTICsgMHgwMTAwMDAwMCkKLSNkZWZpbmUgSDM2MDBfQkFOS18yX1BIWVMgICAgU0ExMTAwX0NTMl9QSFlTCi0jZGVmaW5lIEgzNjAwX0JBTktfNF9QSFlTICAgIFNBMTEwMF9DUzRfUEhZUworI2RlZmluZSBIMzYwMF9FR1BJT19QSFlTCShTQTExMDBfQ1M1X1BIWVMgKyAweDAxMDAwMDAwKQorI2RlZmluZSBIMzYwMF9CQU5LXzJfUEhZUwlTQTExMDBfQ1MyX1BIWVMKKyNkZWZpbmUgSDM2MDBfQkFOS180X1BIWVMJU0ExMTAwX0NTNF9QSFlTCiAKIC8qIFZpcnR1YWwgbWVtb3J5IHJlZ2lvbnMgY29ycmVzcG9uZGluZyB0byBjaGlwIHNlbGVjdHMgMiAmIDQgKHVzZWQgb24gc2xlZXZlcykgKi8KLSNkZWZpbmUgSDM2MDBfRUdQSU9fVklSVCAgICAgMHhmMDAwMDAwMAotI2RlZmluZSBIMzYwMF9CQU5LXzJfVklSVCAgICAweGYxMDAwMDAwCi0jZGVmaW5lIEgzNjAwX0JBTktfNF9WSVJUICAgIDB4ZjM4MDAwMDAKKyNkZWZpbmUgSDM2MDBfRUdQSU9fVklSVAkweGYwMDAwMDAwCisjZGVmaW5lIEgzNjAwX0JBTktfMl9WSVJUCTB4ZjEwMDAwMDAKKyNkZWZpbmUgSDM2MDBfQkFOS180X1ZJUlQJMHhmMzgwMDAwMAogCiAvKgogICAgTWFjaGluZS1pbmRlcGVuZGVudCBHUElPIGRlZmluaXRpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IGI3MDg0NmMuLjYwNzExODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC01OSw2ICs1OSwxMCBAQAogIyBkZWZpbmUgX19SRUcoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilpb19wMnYoeCkpKQogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHVuc2lnbmVkIGxvbmcpJih4KSkpCiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfY2xvY2tfdGlja19yYXRlKHZvaWQpCit7CisJcmV0dXJuIDM2ODY0MDA7Cit9CiAjZWxzZQogCiAjIGRlZmluZSBfX1JFRyh4KQlpb19wMnYoeCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggMGMwNzBhNi4uZDhiNDNmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTE2LDExICsxNiw3IEBACiAgKiBXZSBkb24ndCBhY3R1YWxseSBoYXZlIHJlYWwgSVNBIG5vciBQQ0kgYnVzZXMsIGJ1dCB0aGVyZSBpcyBzbyBtYW55IAogICogZHJpdmVycyBvdXQgdGhlcmUgdGhhdCBtaWdodCBqdXN0IHdvcmsgaWYgd2UgZmFrZSB0aGVtLi4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2lvKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWFkZHI7Ci19Ci0jZGVmaW5lIF9faW8oYSkJCQlfX2lvKGEpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAxYzEyN2I2Li5lOWY4ZWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yMywyMyArMjMsMTIgQEAKIAlzYTExMTFfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQogCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECShQSFlTX09GRlNFVCArIFNaXzFNIC0gMSkKKyNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBTWl8xTSkKIAogI2VuZGlmCiAjZW5kaWYKIAogLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICoJCWFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICoJCXRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKgotICogT24gdGhlIFNBMTEwMCwgYnVzIGFkZHJlc3NlcyBhcmUgZXF1aXZhbGVudCB0byBwaHlzaWNhbCBhZGRyZXNzZXMuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkgX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkgX19waHlzX3RvX3ZpcnQoeCkKLQotLyoKICAqIEJlY2F1c2Ugb2YgdGhlIHdpZGUgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgYmV0d2VlbiBwaHlzaWNhbCBSQU0gYmFua3Mgb24gdGhlCiAgKiBTQTExMDAsIGl0J3MgbXVjaCBjb252ZW5pZW50IHRvIHVzZSBMaW51eCdzIFNwYXJzZU1FTSBzdXBwb3J0IHRvIGltcGxlbWVudAogICogb3VyIG1lbW9yeSBtYXAgcmVwcmVzZW50YXRpb24uICBBc3N1bWluZyBhbGwgbWVtb3J5IG5vZGVzIGhhdmUgZXF1YWwgYWNjZXNzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbXRkLXhpcC5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL210ZC14aXAuaAppbmRleCBlYWEwOWU4Li5iM2Q2ODQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tdGQteGlwLmgKQEAgLTE1LDYgKzE1LDggQEAKICNpZm5kZWYgX19BUkNIX1NBMTEwMF9NVERfWElQX0hfXwogI2RlZmluZSBfX0FSQ0hfU0ExMTAwX01URF9YSVBfSF9fCiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKICNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQkoSUNJUCAmIElDTVIpCiAKIC8qIHdlIHNhbXBsZSBPU0NSIGFuZCBjb252ZXJ0IGRlc2lyZWQgZGVsdGEgdG8gdXNlYyAoMS80IH49IDEwMDAwMDAvMzY4NjQwMCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwppbmRleCBlNDVkM2ExLi5lMTQ1OGJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCkBAIC0xMjIsMTIgKzEyMiwxMiBAQAogCXNhMTEwMF9tYXBfaW8oKTsKIAogCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDMpOwotICAgICAgICBzYTExMDBfcmVnaXN0ZXJfdWFydCgxLCAxKTsKKwlzYTExMDBfcmVnaXN0ZXJfdWFydCgxLCAxKTsKIAotICAgICAgICBHQUZSIHw9IChHUElPX1VBUlRfVFhEIHwgR1BJT19VQVJUX1JYRCk7Ci0gICAgICAgIEdQRFIgfD0gR1BJT19VQVJUX1RYRDsKLSAgICAgICAgR1BEUiAmPSB+R1BJT19VQVJUX1JYRDsKLSAgICAgICAgUFBBUiB8PSBQUEFSX1VQUjsKKwlHQUZSIHw9IChHUElPX1VBUlRfVFhEIHwgR1BJT19VQVJUX1JYRCk7CisJR1BEUiB8PSBHUElPX1VBUlRfVFhEOworCUdQRFIgJj0gfkdQSU9fVUFSVF9SWEQ7CisJUFBBUiB8PSBQUEFSX1VQUjsKIAogCS8qCiAJICogRml4IGV4cGFuc2lvbiBtZW1vcnkgdGltaW5nIGZvciBuZXR3b3JrIGNhcmQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYwppbmRleCA5Y2NkZDA5Li5kZGQ5MTdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCkBAIC0zMyw3ICszMyw3IEBACiAJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAogCQkuc2l6ZQkJPSAweGUwMDAwCiAJfSwKLQl7IAorCXsKIAkJLm5hbWUJCT0gImluaXRyZCIsCiAJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAkKIAkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NsZWVwLlMKaW5kZXggMTcxNDQxZi4uODBmMzFiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2xlZXAuUworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zbGVlcC5TCkBAIC0xMDAsMzYgKzEwMCwzNiBAQAogCWxkcglyMSwgPU1TQzEKIAlsZHIJcjIsID1NU0MyCiAKLSAgICAgICAgbGRyICAgICByMywgW3IwXQotICAgICAgICBiaWMgICAgIHIzLCByMywgI0ZNc2soTVNDX1JUKQotICAgICAgICBiaWMgICAgIHIzLCByMywgI0ZNc2soTVNDX1JUKTw8MTYKKwlsZHIJcjMsIFtyMF0KKwliaWMJcjMsIHIzLCAjRk1zayhNU0NfUlQpCisJYmljCXIzLCByMywgI0ZNc2soTVNDX1JUKTw8MTYKIAotICAgICAgICBsZHIgICAgIHI0LCBbcjFdCi0gICAgICAgIGJpYyAgICAgcjQsIHI0LCAjRk1zayhNU0NfUlQpCi0gICAgICAgIGJpYyAgICAgcjQsIHI0LCAjRk1zayhNU0NfUlQpPDwxNgorCWxkcglyNCwgW3IxXQorCWJpYwlyNCwgcjQsICNGTXNrKE1TQ19SVCkKKwliaWMJcjQsIHI0LCAjRk1zayhNU0NfUlQpPDwxNgogCi0gICAgICAgIGxkciAgICAgcjUsIFtyMl0KLSAgICAgICAgYmljICAgICByNSwgcjUsICNGTXNrKE1TQ19SVCkKLSAgICAgICAgYmljICAgICByNSwgcjUsICNGTXNrKE1TQ19SVCk8PDE2CisJbGRyCXI1LCBbcjJdCisJYmljCXI1LCByNSwgI0ZNc2soTVNDX1JUKQorCWJpYwlyNSwgcjUsICNGTXNrKE1TQ19SVCk8PDE2CiAKLSAgICAgICAgbGRyICAgICByNiwgPU1EUkVGUgorCWxkcglyNiwgPU1EUkVGUgogCi0gICAgICAgIGxkciAgICAgcjcsIFtyNl0KLSAgICAgICAgYmljICAgICByNywgcjcsICMweDAwMDBGRjAwCi0gICAgICAgIGJpYyAgICAgcjcsIHI3LCAjMHgwMDAwMDBGMAotICAgICAgICBvcnIgICAgIHI4LCByNywgI01EUkVGUl9TTEZSU0gKKwlsZHIJcjcsIFtyNl0KK2JpYwlyNywgcjcsICMweDAwMDBGRjAwCitiaWMJcjcsIHI3LCAjMHgwMDAwMDBGMAorb3JyCXI4LCByNywgI01EUkVGUl9TTEZSU0gKIAotICAgICAgICBsZHIgICAgIHI5LCA9TURDTkZHCi0gICAgICAgIGxkciAgICAgcjEwLCBbcjldCi0gICAgICAgIGJpYyAgICAgcjEwLCByMTAsICMoTURDTkZHX0RFMCtNRENORkdfREUxKQotICAgICAgICBiaWMgICAgIHIxMCwgcjEwLCAjKE1EQ05GR19ERTIrTURDTkZHX0RFMykKKwlsZHIJcjksID1NRENORkcKKwlsZHIJcjEwLCBbcjldCisJYmljCXIxMCwgcjEwLCAjKE1EQ05GR19ERTArTURDTkZHX0RFMSkKKwliaWMJcjEwLCByMTAsICMoTURDTkZHX0RFMitNRENORkdfREUzKQogCi0gICAgICAgIGJpYyAgICAgcjExLCByOCwgI01EUkVGUl9TTEZSU0gKLSAgICAgICAgYmljICAgICByMTEsIHIxMSwgI01EUkVGUl9FMVBJTgorCWJpYwlyMTEsIHI4LCAjTURSRUZSX1NMRlJTSAorCWJpYwlyMTEsIHIxMSwgI01EUkVGUl9FMVBJTgogCi0gICAgICAgIGxkciAgICAgcjEyLCA9UE1DUgorCWxkcglyMTIsID1QTUNSCiAKLSAgICAgICAgbW92ICAgICByMTMsICNQTUNSX1NGCisJbW92CXIxMywgI1BNQ1JfU0YKIAogCWIJc2ExMTEwX3NkcmFtX2NvbnRyb2xsZXJfZml4CiAKQEAgLTE4OCwxMCArMTg4LDEwIEBACiAJbWNyCXAxNSwgMCwgcjEsIGM4LCBjNywgMCAgIAlAIGZsdXNoIEkrRCBUTEJzCiAJbWNyCXAxNSwgMCwgcjEsIGM3LCBjNywgMAkJQCBmbHVzaCBJJkQgY2FjaGUKIAltY3IJcDE1LCAwLCByMSwgYzksIGMwLCAwCQlAIGludmFsaWRhdGUgUkIKLQltY3IgICAgIHAxNSwgMCwgcjEsIGM5LCBjMCwgNQkJQCBhbGxvdyB1c2VyIHNwYWNlIHRvIHVzZSBSQgorCW1jcglwMTUsIDAsIHIxLCBjOSwgYzAsIDUJCUAgYWxsb3cgdXNlciBzcGFjZSB0byB1c2UgUkIKIAotCW1jciAJcDE1LCAwLCByNCwgYzMsIGMwLCAwCQlAIGRvbWFpbiBJRAotCW1jciAJcDE1LCAwLCByNSwgYzIsIGMwLCAwCQlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgorCW1jcglwMTUsIDAsIHI0LCBjMywgYzAsIDAJCUAgZG9tYWluIElECisJbWNyCXAxNSwgMCwgcjUsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKIAltY3IJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAkJQCBQSUQKIAliCXJlc3VtZV90dXJuX29uX21tdQkJQCBjYWNoZSBhbGlnbiBleGVjdXRpb24KIApAQCAtMjA5LDcgKzIwOSw3IEBACiAKIAkudGV4dAogcmVzdW1lX2FmdGVyX21tdToKLQltY3IgICAgIHAxNSwgMCwgcjEsIGMxNSwgYzEsIDIJCUAgZW5hYmxlIGNsb2NrIHN3aXRjaGluZworCW1jcglwMTUsIDAsIHIxLCBjMTUsIGMxLCAyCQlAIGVuYWJsZSBjbG9jayBzd2l0Y2hpbmcKIAlsZG1mZAlzcCEsIHtyNCAtIHIxMiwgcGN9CQlAIHJldHVybiB0byBjYWxsZXIKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKaW5kZXggMjRjMGE0Yi4uOGM1ZTcyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwpAQCAtMiw4ICsyLDggQEAKICAqIGxpbnV4L2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5OCBEZWJvcmFoIFdhbGxhY2guCi0gKiBUd2lkZGxlcyAgKEMpIDE5OTkgCUh1Z28gRmllbm5lcyA8aHVnb0BlbXBlZy5jb20+Ci0gKiAKKyAqIFR3aWRkbGVzICAoQykgMTk5OSBIdWdvIEZpZW5uZXMgPGh1Z29AZW1wZWcuY29tPgorICoKICAqIDIwMDAvMDMvMjkgKEMpIE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KICAqCVJld3JpdHRlbjogYmlnIGNsZWFudXAsIG11Y2ggc2ltcGxlciwgYmV0dGVyIEhaIGFjY3VyYWN5LgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggYTk0MDBkOS4uYTIzZmQzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgogCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IGNiMGVlMjkuLjAxYmY3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMjgsOCArMjgsNiBAQAogI2RlZmluZSBST01DQVJEX1NJWkUJCTB4MDgwMDAwMDAKICNkZWZpbmUgUk9NQ0FSRF9TVEFSVAkJMHgxMDAwMDAwMAogCi0jZGVmaW5lIFBDSU9fQkFTRQkJMHhlMDAwMDAwMAotCiAKIC8qIGRlZmluZXMgZm9yIHRoZSBGcmFtZWJ1ZmZlciAqLwogI2RlZmluZSBGQl9TVEFSVAkJMHgwNjAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggOTI0NzU5Mi4uYzVjZWU4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0xMSw0NiArMTEsMTAgQEAKICNpZm5kZWYgX19BU01fQVJNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9JT19ICiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjZGVmaW5lIFBDSU9fQkFTRQkweGUwMDAwMDAwCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUCTB4ZmZmZmZmZmYKIAotI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCi0KLS8qCi0gKiBXZSB1c2UgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBhZGRyZXNzaW5nIC0gUEMgc3R5bGUgYWRkcmVzc2VzLCBhbmQgQVJNCi0gKiBhZGRyZXNzZXMuICBQQyBzdHlsZSBhY2Nlc3NlcyB0aGUgUEMgaGFyZHdhcmUgd2l0aCB0aGUgbm9ybWFsIFBDIElPCi0gKiBhZGRyZXNzZXMsIGVnIDB4M2Y4IGZvciBzZXJpYWwjMS4gIEFSTSBhZGRyZXNzZXMgYXJlIDB4ODAwMDAwMDArCi0gKiBhbmQgYXJlIHRyYW5zbGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIElPLgotICovCi0jZGVmaW5lIF9fUE9SVF9QQ0lPKHgpCSghKCh4KSAmIDB4ODAwMDAwMDApKQotCi0jZGVmaW5lIF9faW8oYSkgICAgICAgICAgICAgICAgICgodm9pZCBfX2lvbWVtICopKFBDSU9fQkFTRSArIChhKSkpCi0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19pb2FkZHIgKHVuc2lnbmVkIGludCBwb3J0KQkJCVwKLXsJCQkJCQkJCQkJXAotCWlmIChfX1BPUlRfUENJTyhwb3J0KSkJCQkJCQkJXAotCQlyZXR1cm4gKHVuc2lnbmVkIGludCkoUENJT19CQVNFICsgKHBvcnQpKTsJCQlcCi0JZWxzZQkJCQkJCQkJCVwKLQkJcmV0dXJuICh1bnNpZ25lZCBpbnQpKElPX0JBU0UgKyAocG9ydCkpOwkJCVwKLX0KLQotI2RlZmluZSBfX21lbV9wY2koYWRkcikgKGFkZHIpCi0KLS8qCi0gKiBUcmFuc2xhdGVkIGFkZHJlc3MgSU8gZnVuY3Rpb25zCi0gKgotICogSU8gYWRkcmVzcyBoYXMgYWxyZWFkeSBiZWVuIHRyYW5zbGF0ZWQgdG8gYSB2aXJ0dWFsIGFkZHJlc3MKLSAqLwotI2RlZmluZSBvdXRiX3QodixwKQkJCQkJCQkJXAotCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocCkgPSAodikpCi0KLSNkZWZpbmUgaW5iX3QocCkJCQkJCQkJCVwKLQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHApKQotCi0jZGVmaW5lIG91dGxfdCh2LHApCQkJCQkJCQlcCi0JKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShwKSA9ICh2KSkKLQotI2RlZmluZSBpbmxfdChwKQkJCQkJCQkJXAotCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikocCkpCisjZGVmaW5lIF9faW8oYSkJCSgodm9pZCBfX2lvbWVtICopKFBDSU9fQkFTRSArIChhKSkpCisjZGVmaW5lIF9fbWVtX3BjaShhZGRyKQkoYWRkcikKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2lzYS1kbWEuaApzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9kbWEuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCmluZGV4IGMwYTI5YmQuLjg2NDI5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2lzYS1kbWEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9kbWEuaAorICogYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvaXNhLWRtYS5oCiAgKgogICogYnkgQWxleGFuZGVyIFNjaHVsegogICovCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBUaGUgcmVzdCBpcyBub3QgRE1BYWJsZS4gU2VlIGRldiAvICAucHJvcGVydGllcwogICogaW4gT3BlbkZpcm13YXJlLgogICovCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJMHhDMDQwMDAwMAogI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTCTgKICNkZWZpbmUgRE1BX0lTQV9DQVNDQURFICAgICAgICAgNAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGI3ODc0YWQuLmM1YWIwMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0zMywxMiArMzMsMTAgQEAKIAlfX2FyY2hfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKQogCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECShQSFlTX09GRlNFVCArIFNaXzRNIC0gMSkKKyNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBTWl80TSkKIAogI2VuZGlmCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQlfX3ZpcnRfdG9fcGh5cyh4KQotI2RlZmluZSBfX2J1c190b192aXJ0KHgpCV9fcGh5c190b192aXJ0KHgpCi0KIC8qCiAgKiBDYWNoZSBmbHVzaGluZyBhcmVhCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCmluZGV4IDk1MDk2YWYuLmM3ODFmMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwpAQCAtMywxMiArMywxNCBAQAogCiBjb25maWcgQVJDSF9WRVJTQVRJTEVfUEIKIAlib29sICJTdXBwb3J0IFZlcnNhdGlsZS9QQiBwbGF0Zm9ybSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlL1BCIHBsYXRmb3JtLgogCiBjb25maWcgTUFDSF9WRVJTQVRJTEVfQUIKIAlib29sICJTdXBwb3J0IFZlcnNhdGlsZS9BQiBwbGF0Zm9ybSIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlL0FQIHBsYXRmb3JtLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY2xvY2suYwppbmRleCA1ODkzN2YxLi5jNTBhNDRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTcsMzYgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdDMwNy5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwotc3RhdGljIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwotCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCi17Ci0Jc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0KLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2Nrcywgbm9kZSkgewotCQlpZiAoc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgewotCQkJY2xrID0gcDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLQotCXJldHVybiBjbGs7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19nZXQpOwotCi12b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQotewotCW1vZHVsZV9wdXQoY2xrLT5vd25lcik7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19wdXQpOwotCiBpbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJcmV0dXJuIDA7CkBAIC02Niw3ICs0Miw5IEBACiAKIGxvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7Ci0JcmV0dXJuIHJhdGU7CisJc3RydWN0IGljc3QzMDdfdmNvIHZjbzsKKwl2Y28gPSBpY3N0MzA3X2toel90b192Y28oY2xrLT5wYXJhbXMsIHJhdGUgLyAxMDAwKTsKKwlyZXR1cm4gaWNzdDMwN19raHooY2xrLT5wYXJhbXMsIHZjbykgKiAxMDAwOwogfQogRVhQT1JUX1NZTUJPTChjbGtfcm91bmRfcmF0ZSk7CiAKQEAgLTc5LDU3ICs1Nyw5IEBACiAKIAkJdmNvID0gaWNzdDMwN19raHpfdG9fdmNvKGNsay0+cGFyYW1zLCByYXRlIC8gMTAwMCk7CiAJCWNsay0+cmF0ZSA9IGljc3QzMDdfa2h6KGNsay0+cGFyYW1zLCB2Y28pICogMTAwMDsKLQotCQlwcmludGsoIkNsb2NrICVzOiBzZXR0aW5nIFZDTyByZWcgcGFyYW1zOiBTPSVkIFI9JWQgVj0lZFxuIiwKLQkJCWNsay0+bmFtZSwgdmNvLnMsIHZjby5yLCB2Y28udik7Ci0KIAkJY2xrLT5zZXR2Y28oY2xrLCB2Y28pOwogCQlyZXQgPSAwOwogCX0KIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOwotCi0vKgotICogVGhlc2UgYXJlIGZpeGVkIGNsb2Nrcy4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsga21pX2NsayA9IHsKLQkubmFtZQk9ICJLTUlSRUZDTEsiLAotCS5yYXRlCT0gMjQwMDAwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0X2NsayA9IHsKLQkubmFtZQk9ICJVQVJUQ0xLIiwKLQkucmF0ZQk9IDI0MDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jaV9jbGsgPSB7Ci0JLm5hbWUJPSAiTUNMSyIsCi0JLnJhdGUJPSAyNDAwMDAwMCwKLX07Ci0KLWludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQotewotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9hZGQoJmNsay0+bm9kZSwgJmNsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChjbGtfcmVnaXN0ZXIpOwotCi12b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCWxpc3RfZGVsKCZjbGstPm5vZGUpOwotCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQotewotCWNsa19yZWdpc3Rlcigma21pX2Nsayk7Ci0JY2xrX3JlZ2lzdGVyKCZ1YXJ0X2Nsayk7Ci0JY2xrX3JlZ2lzdGVyKCZtbWNpX2Nsayk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGNsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5oCmluZGV4IDhiMGI2MWQuLjAzNDY4ZmRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmgKQEAgLTEyLDE0ICsxMiw5IEBACiBzdHJ1Y3QgaWNzdDMwN19wYXJhbXM7CiAKIHN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIAl1bnNpZ25lZCBsb25nCQlyYXRlOwotCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKLQljb25zdCBjaGFyCQkqbmFtZTsKIAljb25zdCBzdHJ1Y3QgaWNzdDMwN19wYXJhbXMgKnBhcmFtczsKKwl1MzIJCQlvc2NvZmY7CiAJdm9pZAkJCSpkYXRhOwogCXZvaWQJCQkoKnNldHZjbykoc3RydWN0IGNsayAqLCBzdHJ1Y3QgaWNzdDMwN192Y28gdmNvKTsKIH07Ci0KLWludCBjbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKLXZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCA1NjVlMGJhLi5kZjI1YWExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY250MzJfdG9fNjMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzczLDIyICszNzQsNjAgQEAKIAogc3RhdGljIHZvaWQgdmVyc2F0aWxlX29zY3Zjb19zZXQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgaWNzdDMwN192Y28gdmNvKQogewotCXZvaWQgX19pb21lbSAqc3lzX2xvY2sgPSBfX2lvX2FkZHJlc3MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfTE9DS19PRkZTRVQ7Ci0Jdm9pZCBfX2lvbWVtICpzeXNfb3NjID0gX19pb19hZGRyZXNzKFZFUlNBVElMRV9TWVNfQkFTRSkgKyBWRVJTQVRJTEVfU1lTX09TQ0NMQ0RfT0ZGU0VUOworCXZvaWQgX19pb21lbSAqc3lzID0gX19pb19hZGRyZXNzKFZFUlNBVElMRV9TWVNfQkFTRSk7CisJdm9pZCBfX2lvbWVtICpzeXNfbG9jayA9IHN5cyArIFZFUlNBVElMRV9TWVNfTE9DS19PRkZTRVQ7CiAJdTMyIHZhbDsKIAotCXZhbCA9IHJlYWRsKHN5c19vc2MpICYgfjB4N2ZmZmY7CisJdmFsID0gcmVhZGwoc3lzICsgY2xrLT5vc2NvZmYpICYgfjB4N2ZmZmY7CiAJdmFsIHw9IHZjby52IHwgKHZjby5yIDw8IDkpIHwgKHZjby5zIDw8IDE2KTsKIAogCXdyaXRlbCgweGEwNWYsIHN5c19sb2NrKTsKLQl3cml0ZWwodmFsLCBzeXNfb3NjKTsKKwl3cml0ZWwodmFsLCBzeXMgKyBjbGstPm9zY29mZik7CiAJd3JpdGVsKDAsIHN5c19sb2NrKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGsgdmVyc2F0aWxlX2NsY2RfY2xrID0gewotCS5uYW1lCT0gIkNMQ0RDTEsiLAorc3RhdGljIHN0cnVjdCBjbGsgb3NjNF9jbGsgPSB7CiAJLnBhcmFtcwk9ICZ2ZXJzYXRpbGVfb3NjdmNvX3BhcmFtcywKLQkuc2V0dmNvID0gdmVyc2F0aWxlX29zY3Zjb19zZXQsCisJLm9zY29mZgk9IFZFUlNBVElMRV9TWVNfT1NDQ0xDRF9PRkZTRVQsCisJLnNldHZjbwk9IHZlcnNhdGlsZV9vc2N2Y29fc2V0LAorfTsKKworLyoKKyAqIFRoZXNlIGFyZSBmaXhlZCBjbG9ja3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHJlZjI0X2NsayA9IHsKKwkucmF0ZQk9IDI0MDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSBfX2luaXRkYXRhID0geworCXsJLyogVUFSVDAgKi8KKwkJLmRldl9pZAkJPSAiZGV2OmYxIiwKKwkJLmNsawkJPSAmcmVmMjRfY2xrLAorCX0sIHsJLyogVUFSVDEgKi8KKwkJLmRldl9pZAkJPSAiZGV2OmYyIiwKKwkJLmNsawkJPSAmcmVmMjRfY2xrLAorCX0sIHsJLyogVUFSVDIgKi8KKwkJLmRldl9pZAkJPSAiZGV2OmYzIiwKKwkJLmNsawkJPSAmcmVmMjRfY2xrLAorCX0sIHsJLyogVUFSVDMgKi8KKwkJLmRldl9pZAkJPSAiZnBnYTowOSIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIEtNSTAgKi8KKwkJLmRldl9pZAkJPSAiZnBnYTowNiIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIEtNSTEgKi8KKwkJLmRldl9pZAkJPSAiZnBnYTowNyIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIE1NQzAgKi8KKwkJLmRldl9pZAkJPSAiZnBnYTowNSIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIE1NQzEgKi8KKwkJLmRldl9pZAkJPSAiZnBnYTowYiIsCisJCS5jbGsJCT0gJnJlZjI0X2NsaywKKwl9LCB7CS8qIENMQ0QgKi8KKwkJLmRldl9pZAkJPSAiZGV2OjIwIiwKKwkJLmNsawkJPSAmb3NjNF9jbGssCisJfQogfTsKIAogLyoKQEAgLTc4Niw3ICs4MjUsOCBAQAogewogCWludCBpOwogCi0JY2xrX3JlZ2lzdGVyKCZ2ZXJzYXRpbGVfY2xjZF9jbGspOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxvb2t1cHMpOyBpKyspCisJCWNsa2Rldl9hZGQoJmxvb2t1cHNbaV0pOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2ZXJzYXRpbGVfZmxhc2hfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZlcnNhdGlsZV9pMmNfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9jbGtkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGIzN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0NMS0RFVl9ICisjZGVmaW5lIF9fQVNNX01BQ0hfQ0xLREVWX0gKKworI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQorI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFiZjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBBUk0gTGltaXRlZC4KLSAqICBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYzBiOWRkMS4uZjA2N2MxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIyLDExICsyMiw3IEBACiAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX19pbyh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOwotfQotI2RlZmluZSBfX2lvKGEpCV9faW8oYSkKLSNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKKyNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQorI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggMjE2YTEzMS4uOWJmZGIzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC02MCwzOSArNjAsNiBAQAogI2RlZmluZSBJUlFfVklDU09VUkNFMzEJCShJUlFfVklDX1NUQVJUICsgSU5UX1ZJQ1NPVVJDRTMxKQogI2RlZmluZSBJUlFfVklDX0VORAkJKElSUV9WSUNfU1RBUlQgKyAzMSkKIAotI2RlZmluZSBJUlFNQVNLX1dET0dJTlQJCUlOVE1BU0tfV0RPR0lOVAotI2RlZmluZSBJUlFNQVNLX1NPRlRJTlQJCUlOVE1BU0tfU09GVElOVAotI2RlZmluZSBJUlFNQVNLX0NPTU1SeCAJCUlOVE1BU0tfQ09NTVJ4Ci0jZGVmaW5lIElSUU1BU0tfQ09NTVR4IAkJSU5UTUFTS19DT01NVHgKLSNkZWZpbmUgSVJRTUFTS19USU1FUklOVDBfMQlJTlRNQVNLX1RJTUVSSU5UMF8xCi0jZGVmaW5lIElSUU1BU0tfVElNRVJJTlQyXzMJSU5UTUFTS19USU1FUklOVDJfMwotI2RlZmluZSBJUlFNQVNLX0dQSU9JTlQwCUlOVE1BU0tfR1BJT0lOVDAKLSNkZWZpbmUgSVJRTUFTS19HUElPSU5UMQlJTlRNQVNLX0dQSU9JTlQxCi0jZGVmaW5lIElSUU1BU0tfR1BJT0lOVDIJSU5UTUFTS19HUElPSU5UMgotI2RlZmluZSBJUlFNQVNLX0dQSU9JTlQzCUlOVE1BU0tfR1BJT0lOVDMKLSNkZWZpbmUgSVJRTUFTS19SVENJTlQgCQlJTlRNQVNLX1JUQ0lOVAotI2RlZmluZSBJUlFNQVNLX1NTUElOVCAJCUlOVE1BU0tfU1NQSU5UCi0jZGVmaW5lIElSUU1BU0tfVUFSVElOVDAJSU5UTUFTS19VQVJUSU5UMAotI2RlZmluZSBJUlFNQVNLX1VBUlRJTlQxCUlOVE1BU0tfVUFSVElOVDEKLSNkZWZpbmUgSVJRTUFTS19VQVJUSU5UMglJTlRNQVNLX1VBUlRJTlQyCi0jZGVmaW5lIElSUU1BU0tfU0NJSU5UIAkJSU5UTUFTS19TQ0lJTlQKLSNkZWZpbmUgSVJRTUFTS19DTENESU5UCQlJTlRNQVNLX0NMQ0RJTlQKLSNkZWZpbmUgSVJRTUFTS19ETUFJTlQgCQlJTlRNQVNLX0RNQUlOVAotI2RlZmluZSBJUlFNQVNLX1BXUkZBSUxJTlQJSU5UTUFTS19QV1JGQUlMSU5UCi0jZGVmaW5lIElSUU1BU0tfTUJYSU5UIAkJSU5UTUFTS19NQlhJTlQKLSNkZWZpbmUgSVJRTUFTS19HTkRJTlQgCQlJTlRNQVNLX0dORElOVAotI2RlZmluZSBJUlFNQVNLX1ZJQ1NPVVJDRTIxCUlOVE1BU0tfVklDU09VUkNFMjEKLSNkZWZpbmUgSVJRTUFTS19WSUNTT1VSQ0UyMglJTlRNQVNLX1ZJQ1NPVVJDRTIyCi0jZGVmaW5lIElSUU1BU0tfVklDU09VUkNFMjMJSU5UTUFTS19WSUNTT1VSQ0UyMwotI2RlZmluZSBJUlFNQVNLX1ZJQ1NPVVJDRTI0CUlOVE1BU0tfVklDU09VUkNFMjQKLSNkZWZpbmUgSVJRTUFTS19WSUNTT1VSQ0UyNQlJTlRNQVNLX1ZJQ1NPVVJDRTI1Ci0jZGVmaW5lIElSUU1BU0tfVklDU09VUkNFMjYJSU5UTUFTS19WSUNTT1VSQ0UyNgotI2RlZmluZSBJUlFNQVNLX1ZJQ1NPVVJDRTI3CUlOVE1BU0tfVklDU09VUkNFMjcKLSNkZWZpbmUgSVJRTUFTS19WSUNTT1VSQ0UyOAlJTlRNQVNLX1ZJQ1NPVVJDRTI4Ci0jZGVmaW5lIElSUU1BU0tfVklDU09VUkNFMjkJSU5UTUFTS19WSUNTT1VSQ0UyOQotI2RlZmluZSBJUlFNQVNLX1ZJQ1NPVVJDRTMwCUlOVE1BU0tfVklDU09VUkNFMzAKLSNkZWZpbmUgSVJRTUFTS19WSUNTT1VSQ0UzMQlJTlRNQVNLX1ZJQ1NPVVJDRTMxCi0KIC8qIAogICogIEZJUSBpbnRlcnJ1cHRzIGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZSBhcyB0aGUgSU5UIGRlZmluaXRpb25zLgogICovCkBAIC0xMzAsMzkgKzk3LDYgQEAKICNkZWZpbmUgRklRX1ZJQ1NPVVJDRTMxCQlJTlRfVklDU09VUkNFMzEKIAogCi0jZGVmaW5lIEZJUU1BU0tfV0RPR0lOVAkJSU5UTUFTS19XRE9HSU5UCi0jZGVmaW5lIEZJUU1BU0tfU09GVElOVAkJSU5UTUFTS19TT0ZUSU5UCi0jZGVmaW5lIEZJUU1BU0tfQ09NTVJ4IAkJSU5UTUFTS19DT01NUngKLSNkZWZpbmUgRklRTUFTS19DT01NVHggCQlJTlRNQVNLX0NPTU1UeAotI2RlZmluZSBGSVFNQVNLX1RJTUVSSU5UMF8xCUlOVE1BU0tfVElNRVJJTlQwXzEKLSNkZWZpbmUgRklRTUFTS19USU1FUklOVDJfMwlJTlRNQVNLX1RJTUVSSU5UMl8zCi0jZGVmaW5lIEZJUU1BU0tfR1BJT0lOVDAJSU5UTUFTS19HUElPSU5UMAotI2RlZmluZSBGSVFNQVNLX0dQSU9JTlQxCUlOVE1BU0tfR1BJT0lOVDEKLSNkZWZpbmUgRklRTUFTS19HUElPSU5UMglJTlRNQVNLX0dQSU9JTlQyCi0jZGVmaW5lIEZJUU1BU0tfR1BJT0lOVDMJSU5UTUFTS19HUElPSU5UMwotI2RlZmluZSBGSVFNQVNLX1JUQ0lOVCAJCUlOVE1BU0tfUlRDSU5UCi0jZGVmaW5lIEZJUU1BU0tfU1NQSU5UIAkJSU5UTUFTS19TU1BJTlQKLSNkZWZpbmUgRklRTUFTS19VQVJUSU5UMAlJTlRNQVNLX1VBUlRJTlQwCi0jZGVmaW5lIEZJUU1BU0tfVUFSVElOVDEJSU5UTUFTS19VQVJUSU5UMQotI2RlZmluZSBGSVFNQVNLX1VBUlRJTlQyCUlOVE1BU0tfVUFSVElOVDIKLSNkZWZpbmUgRklRTUFTS19TQ0lJTlQgCQlJTlRNQVNLX1NDSUlOVAotI2RlZmluZSBGSVFNQVNLX0NMQ0RJTlQJCUlOVE1BU0tfQ0xDRElOVAotI2RlZmluZSBGSVFNQVNLX0RNQUlOVCAJCUlOVE1BU0tfRE1BSU5UCi0jZGVmaW5lIEZJUU1BU0tfUFdSRkFJTElOVAlJTlRNQVNLX1BXUkZBSUxJTlQKLSNkZWZpbmUgRklRTUFTS19NQlhJTlQgCQlJTlRNQVNLX01CWElOVAotI2RlZmluZSBGSVFNQVNLX0dORElOVCAJCUlOVE1BU0tfR05ESU5UCi0jZGVmaW5lIEZJUU1BU0tfVklDU09VUkNFMjEJSU5UTUFTS19WSUNTT1VSQ0UyMQotI2RlZmluZSBGSVFNQVNLX1ZJQ1NPVVJDRTIyCUlOVE1BU0tfVklDU09VUkNFMjIKLSNkZWZpbmUgRklRTUFTS19WSUNTT1VSQ0UyMwlJTlRNQVNLX1ZJQ1NPVVJDRTIzCi0jZGVmaW5lIEZJUU1BU0tfVklDU09VUkNFMjQJSU5UTUFTS19WSUNTT1VSQ0UyNAotI2RlZmluZSBGSVFNQVNLX1ZJQ1NPVVJDRTI1CUlOVE1BU0tfVklDU09VUkNFMjUKLSNkZWZpbmUgRklRTUFTS19WSUNTT1VSQ0UyNglJTlRNQVNLX1ZJQ1NPVVJDRTI2Ci0jZGVmaW5lIEZJUU1BU0tfVklDU09VUkNFMjcJSU5UTUFTS19WSUNTT1VSQ0UyNwotI2RlZmluZSBGSVFNQVNLX1ZJQ1NPVVJDRTI4CUlOVE1BU0tfVklDU09VUkNFMjgKLSNkZWZpbmUgRklRTUFTS19WSUNTT1VSQ0UyOQlJTlRNQVNLX1ZJQ1NPVVJDRTI5Ci0jZGVmaW5lIEZJUU1BU0tfVklDU09VUkNFMzAJSU5UTUFTS19WSUNTT1VSQ0UzMAotI2RlZmluZSBGSVFNQVNLX1ZJQ1NPVVJDRTMxCUlOVE1BU0tfVklDU09VUkNFMzEKLQogLyoKICAqIFNlY29uZGFyeSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICovCkBAIC0xODgsMjQgKzEyMiw0IEBACiAjZGVmaW5lIElSUV9TSUNfUENJMwkJKElSUV9TSUNfU1RBUlQgKyBTSUNfSU5UX1BDSTMpCiAjZGVmaW5lIElSUV9TSUNfRU5ECQk2MwogCi0jZGVmaW5lIFNJQ19JUlFNQVNLX01NQ0kwQglTSUNfSU5UTUFTS19NTUNJMEIKLSNkZWZpbmUgU0lDX0lSUU1BU0tfTU1DSTFCCVNJQ19JTlRNQVNLX01NQ0kxQgotI2RlZmluZSBTSUNfSVJRTUFTS19LTUkwCVNJQ19JTlRNQVNLX0tNSTAKLSNkZWZpbmUgU0lDX0lSUU1BU0tfS01JMQlTSUNfSU5UTUFTS19LTUkxCi0jZGVmaW5lIFNJQ19JUlFNQVNLX1NDSTMJU0lDX0lOVE1BU0tfU0NJMwotI2RlZmluZSBTSUNfSVJRTUFTS19VQVJUMwlTSUNfSU5UTUFTS19VQVJUMwotI2RlZmluZSBTSUNfSVJRTUFTS19DTENECVNJQ19JTlRNQVNLX0NMQ0QKLSNkZWZpbmUgU0lDX0lSUU1BU0tfVE9VQ0gJU0lDX0lOVE1BU0tfVE9VQ0gKLSNkZWZpbmUgU0lDX0lSUU1BU0tfS0VZUEFECVNJQ19JTlRNQVNLX0tFWVBBRAotI2RlZmluZSBTSUNfSVJRTUFTS19Eb0MJCVNJQ19JTlRNQVNLX0RvQwotI2RlZmluZSBTSUNfSVJRTUFTS19NTUNJMEEJU0lDX0lOVE1BU0tfTU1DSTBBCi0jZGVmaW5lIFNJQ19JUlFNQVNLX01NQ0kxQQlTSUNfSU5UTUFTS19NTUNJMUEKLSNkZWZpbmUgU0lDX0lSUU1BU0tfQUFDSQlTSUNfSU5UTUFTS19BQUNJCi0jZGVmaW5lIFNJQ19JUlFNQVNLX0VUSAkJU0lDX0lOVE1BU0tfRVRICi0jZGVmaW5lIFNJQ19JUlFNQVNLX1VTQgkJU0lDX0lOVE1BU0tfVVNCCi0jZGVmaW5lIFNJQ19JUlFNQVNLX1BDSTAJU0lDX0lOVE1BU0tfUENJMAotI2RlZmluZSBTSUNfSVJRTUFTS19QQ0kxCVNJQ19JTlRNQVNLX1BDSTEKLSNkZWZpbmUgU0lDX0lSUU1BU0tfUENJMglTSUNfSU5UTUFTS19QQ0kyCi0jZGVmaW5lIFNJQ19JUlFNQVNLX1BDSTMJU0lDX0lOVE1BU0tfUENJMwotCiAjZGVmaW5lIE5SX0lSUVMJCQk2NApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGI2MzE1YzAuLjc5YWVhYjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTI1LDE0ICsyNSw0IEBACiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKIAotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiB2aXJ0X3RvX2J1czogVXNlZCB0byB0cmFuc2xhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBhbgotICogICAgICAgICAgICAgIGFkZHJlc3Mgc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcgotICogYnVzX3RvX3ZpcnQ6IFVzZWQgdG8gY29udmVydCBhbiBhZGRyZXNzIGZvciBETUEgb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoKHgpIC0gUEFHRV9PRkZTRVQpCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKCh4KSArIFBBR0VfT0ZGU0VUKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKaW5kZXggZjkxYmE5My4uODMyMDczOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKQEAgLTM0Nyw0NCArMzQ3LDYgQEAKICNkZWZpbmUgSU5UX1ZJQ1NPVVJDRTMwICAgICAgICAgICAgICAgICAzMAkvKiBQQ0kgMyAqLwogI2RlZmluZSBJTlRfVklDU09VUkNFMzEgICAgICAgICAgICAgICAgIDMxCS8qIFNJQyBzb3VyY2UgKi8KIAotLyogCi0gKiAgSW50ZXJydXB0IGJpdCBwb3NpdGlvbnMKLSAqIAotICovCi0jZGVmaW5lIElOVE1BU0tfV0RPR0lOVCAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX1dET0dJTlQpCi0jZGVmaW5lIElOVE1BU0tfU09GVElOVCAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX1NPRlRJTlQpCi0jZGVmaW5lIElOVE1BU0tfQ09NTVJ4ICAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX0NPTU1SeCkKLSNkZWZpbmUgSU5UTUFTS19DT01NVHggICAgICAgICAgICAgICAgICAoMSA8PCBJTlRfQ09NTVR4KQotI2RlZmluZSBJTlRNQVNLX1RJTUVSSU5UMF8xICAgICAgICAgICAgICgxIDw8IElOVF9USU1FUklOVDBfMSkKLSNkZWZpbmUgSU5UTUFTS19USU1FUklOVDJfMyAgICAgICAgICAgICAoMSA8PCBJTlRfVElNRVJJTlQyXzMpCi0jZGVmaW5lIElOVE1BU0tfR1BJT0lOVDAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX0dQSU9JTlQwKQotI2RlZmluZSBJTlRNQVNLX0dQSU9JTlQxICAgICAgICAgICAgICAgICgxIDw8IElOVF9HUElPSU5UMSkKLSNkZWZpbmUgSU5UTUFTS19HUElPSU5UMiAgICAgICAgICAgICAgICAoMSA8PCBJTlRfR1BJT0lOVDIpCi0jZGVmaW5lIElOVE1BU0tfR1BJT0lOVDMgICAgICAgICAgICAgICAgKDEgPDwgSU5UX0dQSU9JTlQzKQotI2RlZmluZSBJTlRNQVNLX1JUQ0lOVCAgICAgICAgICAgICAgICAgICgxIDw8IElOVF9SVENJTlQpCi0jZGVmaW5lIElOVE1BU0tfU1NQSU5UICAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX1NTUElOVCkKLSNkZWZpbmUgSU5UTUFTS19VQVJUSU5UMCAgICAgICAgICAgICAgICAoMSA8PCBJTlRfVUFSVElOVDApCi0jZGVmaW5lIElOVE1BU0tfVUFSVElOVDEgICAgICAgICAgICAgICAgKDEgPDwgSU5UX1VBUlRJTlQxKQotI2RlZmluZSBJTlRNQVNLX1VBUlRJTlQyICAgICAgICAgICAgICAgICgxIDw8IElOVF9VQVJUSU5UMikKLSNkZWZpbmUgSU5UTUFTS19TQ0lJTlQgICAgICAgICAgICAgICAgICAoMSA8PCBJTlRfU0NJSU5UKQotI2RlZmluZSBJTlRNQVNLX0NMQ0RJTlQgICAgICAgICAgICAgICAgICgxIDw8IElOVF9DTENESU5UKQotI2RlZmluZSBJTlRNQVNLX0RNQUlOVCAgICAgICAgICAgICAgICAgICgxIDw8IElOVF9ETUFJTlQpCi0jZGVmaW5lIElOVE1BU0tfUFdSRkFJTElOVCAgICAgICAgICAgICAgKDEgPDwgSU5UX1BXUkZBSUxJTlQpCi0jZGVmaW5lIElOVE1BU0tfTUJYSU5UICAgICAgICAgICAgICAgICAgKDEgPDwgSU5UX01CWElOVCkKLSNkZWZpbmUgSU5UTUFTS19HTkRJTlQgICAgICAgICAgICAgICAgICAoMSA8PCBJTlRfR05ESU5UKQotI2RlZmluZSBJTlRNQVNLX1ZJQ1NPVVJDRTIxICAgICAgICAgICAgICgxIDw8IElOVF9WSUNTT1VSQ0UyMSkKLSNkZWZpbmUgSU5UTUFTS19WSUNTT1VSQ0UyMiAgICAgICAgICAgICAoMSA8PCBJTlRfVklDU09VUkNFMjIpCi0jZGVmaW5lIElOVE1BU0tfVklDU09VUkNFMjMgICAgICAgICAgICAgKDEgPDwgSU5UX1ZJQ1NPVVJDRTIzKQotI2RlZmluZSBJTlRNQVNLX1ZJQ1NPVVJDRTI0ICAgICAgICAgICAgICgxIDw8IElOVF9WSUNTT1VSQ0UyNCkKLSNkZWZpbmUgSU5UTUFTS19WSUNTT1VSQ0UyNSAgICAgICAgICAgICAoMSA8PCBJTlRfVklDU09VUkNFMjUpCi0jZGVmaW5lIElOVE1BU0tfVklDU09VUkNFMjYgICAgICAgICAgICAgKDEgPDwgSU5UX1ZJQ1NPVVJDRTI2KQotI2RlZmluZSBJTlRNQVNLX1ZJQ1NPVVJDRTI3ICAgICAgICAgICAgICgxIDw8IElOVF9WSUNTT1VSQ0UyNykKLSNkZWZpbmUgSU5UTUFTS19WSUNTT1VSQ0UyOCAgICAgICAgICAgICAoMSA8PCBJTlRfVklDU09VUkNFMjgpCi0jZGVmaW5lIElOVE1BU0tfVklDU09VUkNFMjkgICAgICAgICAgICAgKDEgPDwgSU5UX1ZJQ1NPVVJDRTI5KQotI2RlZmluZSBJTlRNQVNLX1ZJQ1NPVVJDRTMwICAgICAgICAgICAgICgxIDw8IElOVF9WSUNTT1VSQ0UzMCkKLSNkZWZpbmUgSU5UTUFTS19WSUNTT1VSQ0UzMSAgICAgICAgICAgICAoMSA8PCBJTlRfVklDU09VUkNFMzEpCi0KLQogI2RlZmluZSBWRVJTQVRJTEVfU0NfVkFMSURfSU5UICAgICAgICAgICAgICAgMHgwMDNGRkZGRgogCiAjZGVmaW5lIE1BWElSUU5VTSAgICAgICAgICAgICAgICAgICAgICAgMzEKQEAgLTQxNywyNiArMzc5LDYgQEAKICNkZWZpbmUgU0lDX0lOVF9QQ0kzICAgICAgICAgICAgICAgICAgICAzMAogCiAKLSNkZWZpbmUgU0lDX0lOVE1BU0tfTU1DSTBCICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX01NQ0kwQikKLSNkZWZpbmUgU0lDX0lOVE1BU0tfTU1DSTFCICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX01NQ0kxQikKLSNkZWZpbmUgU0lDX0lOVE1BU0tfS01JMCAgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX0tNSTApCi0jZGVmaW5lIFNJQ19JTlRNQVNLX0tNSTEgICAgICAgICAgICAgICAgKDEgPDwgU0lDX0lOVF9LTUkxKQotI2RlZmluZSBTSUNfSU5UTUFTS19TQ0kzICAgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfU0NJMykKLSNkZWZpbmUgU0lDX0lOVE1BU0tfVUFSVDMgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX1VBUlQzKQotI2RlZmluZSBTSUNfSU5UTUFTS19DTENEICAgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfQ0xDRCkKLSNkZWZpbmUgU0lDX0lOVE1BU0tfVE9VQ0ggICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX1RPVUNIKQotI2RlZmluZSBTSUNfSU5UTUFTS19LRVlQQUQgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfS0VZUEFEKQotI2RlZmluZSBTSUNfSU5UTUFTS19Eb0MgICAgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfRG9DKQotI2RlZmluZSBTSUNfSU5UTUFTS19NTUNJMEEgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfTU1DSTBBKQotI2RlZmluZSBTSUNfSU5UTUFTS19NTUNJMUEgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfTU1DSTFBKQotI2RlZmluZSBTSUNfSU5UTUFTS19BQUNJICAgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfQUFDSSkKLSNkZWZpbmUgU0lDX0lOVE1BU0tfRVRIICAgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX0VUSCkKLSNkZWZpbmUgU0lDX0lOVE1BU0tfVVNCICAgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX1VTQikKLSNkZWZpbmUgU0lDX0lOVE1BU0tfUENJMCAgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX1BDSTApCi0jZGVmaW5lIFNJQ19JTlRNQVNLX1BDSTEgICAgICAgICAgICAgICAgKDEgPDwgU0lDX0lOVF9QQ0kxKQotI2RlZmluZSBTSUNfSU5UTUFTS19QQ0kyICAgICAgICAgICAgICAgICgxIDw8IFNJQ19JTlRfUENJMikKLSNkZWZpbmUgU0lDX0lOVE1BU0tfUENJMyAgICAgICAgICAgICAgICAoMSA8PCBTSUNfSU5UX1BDSTMpCi0KIC8qIAogICogIENsZWFuIGJhc2UgLSBkdW1teQogICogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDE3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvS2NvbmZpZwpAQCAtMCwwICsxLDE5IEBACitpZiBBUkNIX1c5MFg5MDAKKworY29uZmlnIENQVV9XOTBQOTEwCisJYm9vbAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFc5MFA5MTAgb2YgTnV2b3RvbiBXOTBYOTAwIENQVXMuCisKK21lbnUgIlc5MFA5MTAgTWFjaGluZXMiCisKK2NvbmZpZyBNQUNIX1c5MFA5MTBFVkIKKwlib29sICJOdXZvdG9uIFc5MFA5MTAgRXZhbHVhdGlvbiBCb2FyZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgQ1BVX1c5MFA5MTAKKwloZWxwCisJICAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBOdXZvdG9uIFc5MFA5MTBFVkIKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMGMxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkJCQkJOj0gaXJxLm8gdGltZS5vCisKKyMgVzkwWDkwMCBDUFUgc3VwcG9ydCBmaWxlcworCitvYmotJChDT05GSUdfQ1BVX1c5MFA5MTApCSs9IHc5MHA5MTAubworCisjIG1hY2hpbmUgc3VwcG9ydAorCitvYmotJChDT05GSUdfTUFDSF9XOTBQOTEwRVZCKQkrPSBtYWNoLXc5MHA5MTBldmIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL01ha2VmaWxlLmJvb3QKQEAgLTAsMCArMSwzIEBACit6cmVsYWRkci15CTo9IDB4MDAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvY3B1LmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9jcHUuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2NwdS5oCisgKgorICogQmFzZWQgb24gbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9jcHUuaCBieSBCZW4gRG9va3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBXOTBYOTAwIENQVSBzdXBwb3J0CisgKgorICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNkZWZpbmUgSU9ERVNDX0VOVCh5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIC52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpVzkwWDkwMF9WQV8jI3ksICAgICAgIFwKKyAgICAgICAucGZuICAgICA9IF9fcGh5c190b19wZm4oVzkwWDkwMF9QQV8jI3kpLCAgICAgICBcCisgICAgICAgLmxlbmd0aCAgPSBXOTBYOTAwX1NaXyMjeSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIC50eXBlICAgID0gTVRfREVWSUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLypDcHUgaWRlbnRpZmllciByZWdpc3RlciovCisKKyNkZWZpbmUgVzkwWDkwMFBESUQJVzkwWDkwMF9WQV9HQ1IKKyNkZWZpbmUgVzkwUDkxMF9DUFVJRAkweDAyOTAwOTEwCisjZGVmaW5lIFc5MFA5MjBfQ1BVSUQJMHgwMjkwMDkyMAorI2RlZmluZSBXOTBQOTUwX0NQVUlECTB4MDI5MDA5NTAKKyNkZWZpbmUgVzkwTjk2MF9DUFVJRAkweDAyOTAwOTYwCisKK3N0cnVjdCB3OTB4OTAwX3VhcnRjZmc7CitzdHJ1Y3QgbWFwX2Rlc2M7CitzdHJ1Y3Qgc3lzX3RpbWVyOworCisvKiBjb3JlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyAqLworCitleHRlcm4gdm9pZCB3OTB4OTAwX2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHZvaWQgdzkwcDkxMF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCB3OTBwOTEwX2luaXRfdWFydHMoc3RydWN0IHc5MHg5MDBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworZXh0ZXJuIHZvaWQgdzkwcDkxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CitleHRlcm4gdm9pZCB3OTBwOTEwX21hcF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdzkweDkwMF90aW1lcjsKKworI2RlZmluZSBXOTBYOTAwX1JFUyhuYW1lKQkJCQlcCitzdHJ1Y3QgcmVzb3VyY2UgdzkweDkwMF8jI25hbWUjI19yZXNvdXJjZVtdID0gewkJXAorCVswXSA9IHsJCQkJCQlcCisJCS5zdGFydCA9IG5hbWUjI19QQSwJCQlcCisJCS5lbmQgICA9IG5hbWUjI19QQSArIDB4MGZmLAkJXAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwJCVwKKwl9LAkJCQkJCVwKKwlbMV0gPSB7CQkJCQkJXAorCQkuc3RhcnQgPSBJUlFfIyNuYW1lLAkJCVwKKwkJLmVuZCAgID0gSVJRXyMjbmFtZSwJCQlcCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAkJXAorCX0JCQkJCQlcCit9CisKKyNkZWZpbmUgVzkwWDkwMF9ERVZJQ0UoZGV2bmFtZSwgcmVnbmFtZSwgZGV2aWQsIHBsYXRkZXZuYW1lKQkJXAorc3RydWN0IHBsYXRmb3JtX2RldmljZSB3OTB4OTAwXyMjZGV2bmFtZSA9IHsJCQkJXAorCS5uYW1lCQk9IHBsYXRkZXZuYW1lLAkJCQkJXAorCS5pZAkJPSBkZXZpZCwJCQkJCVwKKwkubnVtX3Jlc291cmNlcyAJPSBBUlJBWV9TSVpFKHc5MHg5MDBfIyNyZWduYW1lIyNfcmVzb3VyY2UpLAlcCisJLnJlc291cmNlIAk9IHc5MHg5MDBfIyNyZWduYW1lIyNfcmVzb3VyY2UsCQkJXAorfQorCisjZGVmaW5lIFc5MFg5MDBfVUFSVENGRyhwb3J0LCBmbGFnLCB1YywgdWxjLCB1ZmMpCVwKK3sJCQkJCQkJXAorCQkuaHdwb3J0CT0gcG9ydCwJCQkJXAorCQkuZmxhZ3MJPSBmbGFnLAkJCQlcCisJCS51Y29uCT0gdWMsCQkJCVwKKwkJLnVsY29uCT0gdWxjLAkJCQlcCisJCS51ZmNvbgk9IHVmYywJCQkJXAorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOWFjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworICoKKyAqIExvdy1sZXZlbCBJUlEgaGVscGVyIG1hY3JvcyBmb3IgVzkwUDkxMC1iYXNlZCBwbGF0Zm9ybXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CisKKwkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCisJLmVuZG0KKworCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgorCS5lbmRtCisKKwkubWFjcm8JZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCisKKwkJbW92CVxiYXNlLCAjQUlDX0JBCisKKwkJbGRyCVxpcnFuciwgWyBcYmFzZSwgI0FJQ19JUEVSXQorCQlsZHIJXGlycW5yLCBbIFxiYXNlLCAjQUlDX0lTTlJdCisJCWNtcAlcaXJxbnIsICMwCisKKwkuZW5kbQorCisJLyogY3VycmVudGx5IGRvbid0IG5lZWQgYW4gZGlzYWJsZV9maXEgbWFjcm8gKi8KKworCS5tYWNybwlkaXNhYmxlX2ZpcQorCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzYzYyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKyNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICisKKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZW5kaWYgLyogX19BU01fQVJDSF9IQVJEV0FSRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2YWI5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvaW8uaApAQCAtMCwwICsxLDMwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9pby5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pby5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKKworI2RlZmluZSBJT19TUEFDRV9MSU1JVAkweGZmZmZmZmZmCisKKy8qCisgKiAxOjEgbWFwcGluZyBmb3IgaW9yZW1hcHBlZCByZWdpb25zLgorICovCisKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU4M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvaXJxcy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICisKKy8qCisgKiB3ZSBrZWVwIHRoZSBmaXJzdCBzZXQgb2YgQ1BVIElSUXMgb3V0IG9mIHRoZSByYW5nZSBvZgorICogdGhlIElTQSBzcGFjZSwgc28gdGhhdCB0aGUgUEMxMDQgaGFzIHRoZW0gdG8gaXRzZWxmCisgKiBhbmQgd2UgZG9uJ3QgZW5kIHVwIGhhdmluZyB0byBkbyBob3JyaWJsZSB0aGluZ3MgdG8gdGhlCisgKiBzdGFuZGFyZCBJU0EgZHJpdmVycy4uLi4KKyAqCisgKi8KKworI2RlZmluZSBXOTBYOTAwX0lSUSh4KQkoeCkKKworLyogTWFpbiBjcHUgaW50ZXJydXB0cyAqLworCisjZGVmaW5lIElSUV9XRFQJCVc5MFg5MDBfSVJRKDEpCisjZGVmaW5lIElSUV9VQVJUMAlXOTBYOTAwX0lSUSg3KQorI2RlZmluZSBJUlFfVUFSVDEJVzkwWDkwMF9JUlEoOCkKKyNkZWZpbmUgSVJRX1VBUlQyCVc5MFg5MDBfSVJRKDkpCisjZGVmaW5lIElSUV9VQVJUMwlXOTBYOTAwX0lSUSgxMCkKKyNkZWZpbmUgSVJRX1VBUlQ0CVc5MFg5MDBfSVJRKDExKQorI2RlZmluZSBJUlFfVElNRVIwCVc5MFg5MDBfSVJRKDEyKQorI2RlZmluZSBJUlFfVElNRVIxCVc5MFg5MDBfSVJRKDEzKQorI2RlZmluZSBJUlFfVF9JTlRfR1JPVVAJVzkwWDkwMF9JUlEoMTQpCisjZGVmaW5lIElSUV9BREMJCVc5MFg5MDBfSVJRKDMxKQorI2RlZmluZSBOUl9JUlFTCQkoSVJRX0FEQysxKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzMjBlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWFwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01BUF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUFQX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgVzkwWDkwMF9BRERSKHgpCQkoKHZvaWQgX19pb21lbSAqKSgweEYwMDAwMDAwICsgKHgpKSkKKyNlbHNlCisjZGVmaW5lIFc5MFg5MDBfQUREUih4KQkJKDB4RjAwMDAwMDAgKyAoeCkpCisjZW5kaWYKKworI2RlZmluZSBBSEJfSU9fQkFTRQkJMHhCMDAwMDAwMAorI2RlZmluZSBBUEJfSU9fQkFTRQkJMHhCODAwMDAwMAorI2RlZmluZSBDTE9DS1BXX0JBU0UJCShBUEJfSU9fQkFTRSsweDIwMCkKKyNkZWZpbmUgQUlDX0lPX0JBU0UJCShBUEJfSU9fQkFTRSsweDIwMDApCisjZGVmaW5lIFRJTUVSX0lPX0JBU0UJCShBUEJfSU9fQkFTRSsweDEwMDApCisKKy8qCisgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyB0aGUgZmlyc3QgdGhpbmcgd2UgcHV0IGluLCB0byBtYWtlCisgKiB0aGUgYXNzZW1ibHkgY29kZSBmb3IgdGhlIGlycSBkZXRlY3Rpb24gZWFzaWVyCisgKi8KKworI2RlZmluZSBXOTBYOTAwX1ZBX0lSUQkJVzkwWDkwMF9BRERSKDB4MDAwMDAwMDApCisjZGVmaW5lIFc5MFg5MDBfUEFfSVJRCQkoMHhCODAwMjAwMCkKKyNkZWZpbmUgVzkwWDkwMF9TWl9JUlEJCVNaXzRLCisKKyNkZWZpbmUgVzkwWDkwMF9WQV9HQ1IJCVc5MFg5MDBfQUREUigweDA4MDAyMDAwKQorI2RlZmluZSBXOTBYOTAwX1BBX0dDUgkJKDB4QjAwMDAwMDApCisjZGVmaW5lIFc5MFg5MDBfU1pfR0NSCQlTWl80SworCisvKiBDbG9jayBhbmQgUG93ZXIgbWFuYWdlbWVudCAqLworCisjZGVmaW5lIFc5MFg5MDBfVkFfQ0xLUFdSCShXOTBYOTAwX1ZBX0dDUisweDIwMCkKKyNkZWZpbmUgVzkwWDkwMF9QQV9DTEtQV1IJKDB4QjAwMDAyMDApCisjZGVmaW5lIFc5MFg5MDBfU1pfQ0xLUFdSCVNaXzRLCisKKy8qIEVCSSBtYW5hZ2VtZW50ICovCisKKyNkZWZpbmUgVzkwWDkwMF9WQV9FQkkJCVc5MFg5MDBfQUREUigweDAwMDAxMDAwKQorI2RlZmluZSBXOTBYOTAwX1BBX0VCSQkJKDB4QjAwMDEwMDApCisjZGVmaW5lIFc5MFg5MDBfU1pfRUJJCQlTWl80SworCisvKiBVQVJUcyAqLworCisjZGVmaW5lIFc5MFg5MDBfVkFfVUFSVAkJVzkwWDkwMF9BRERSKDB4MDgwMDAwMDApCisjZGVmaW5lIFc5MFg5MDBfUEFfVUFSVAkJKDB4QjgwMDAwMDApCisjZGVmaW5lIFc5MFg5MDBfU1pfVUFSVAkJU1pfNEsKKworLyogVGltZXJzICovCisKKyNkZWZpbmUgVzkwWDkwMF9WQV9USU1FUglXOTBYOTAwX0FERFIoMHgwODAwMTAwMCkKKyNkZWZpbmUgVzkwWDkwMF9QQV9USU1FUgkoMHhCODAwMTAwMCkKKyNkZWZpbmUgVzkwWDkwMF9TWl9USU1FUglTWl80SworCisvKiBHUElPIHBvcnRzICovCisKKyNkZWZpbmUgVzkwWDkwMF9WQV9HUElPCQlXOTBYOTAwX0FERFIoMHgwODAwMzAwMCkKKyNkZWZpbmUgVzkwWDkwMF9QQV9HUElPCQkoMHhCODAwMzAwMCkKKyNkZWZpbmUgVzkwWDkwMF9TWl9HUElPCQlTWl80SworCisjZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxYjgwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKworI2RlZmluZSBQSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTMxODVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fX0FTTV9BUkNIX1JFR1NfSVJRX0gKKyNkZWZpbmUgX19fQVNNX0FSQ0hfUkVHU19JUlFfSAorCisvKiBBZHZhbmNlIEludGVycnVwdCBDb250cm9sbGVyIChBSUMpIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIEFJQ19CQSAgICAJCVc5MFg5MDBfVkFfSVJRCisKKyNkZWZpbmUgUkVHX0FJQ19JUlFTQwkJKEFJQ19CQSsweDgwKQorI2RlZmluZSBSRUdfQUlDX0dFTgkJKEFJQ19CQSsweDg0KQorI2RlZmluZSBSRUdfQUlDX0dBU1IJCShBSUNfQkErMHg4OCkKKyNkZWZpbmUgUkVHX0FJQ19HU0NSCQkoQUlDX0JBKzB4OEMpCisjZGVmaW5lIFJFR19BSUNfSVJTUgkJKEFJQ19CQSsweDEwMCkKKyNkZWZpbmUgUkVHX0FJQ19JQVNSCQkoQUlDX0JBKzB4MTA0KQorI2RlZmluZSBSRUdfQUlDX0lTUgkJKEFJQ19CQSsweDEwOCkKKyNkZWZpbmUgUkVHX0FJQ19JUEVSCQkoQUlDX0JBKzB4MTBDKQorI2RlZmluZSBSRUdfQUlDX0lTTlIJCShBSUNfQkErMHgxMTApCisjZGVmaW5lIFJFR19BSUNfSU1SCQkoQUlDX0JBKzB4MTE0KQorI2RlZmluZSBSRUdfQUlDX09JU1IJCShBSUNfQkErMHgxMTgpCisjZGVmaW5lIFJFR19BSUNfTUVDUgkJKEFJQ19CQSsweDEyMCkKKyNkZWZpbmUgUkVHX0FJQ19NRENSCQkoQUlDX0JBKzB4MTI0KQorI2RlZmluZSBSRUdfQUlDX1NTQ1IJCShBSUNfQkErMHgxMjgpCisjZGVmaW5lIFJFR19BSUNfU0NDUgkJKEFJQ19CQSsweDEyQykKKyNkZWZpbmUgUkVHX0FJQ19FT1NDUgkJKEFJQ19CQSsweDEzMCkKKyNkZWZpbmUgQUlDX0lQRVIJCSgweDEwQykKKyNkZWZpbmUgQUlDX0lTTlIJCSgweDExMCkKKworLyoxNi0xOCBiaXRzIG9mIFJFR19BSUNfR0VOIGRlZmluZSBpcnEoMi00KSBncm91cCovCisKKyNkZWZpbmUgVElNRVIyX0lSUQkJKDEgPDwgMTYpCisjZGVmaW5lIFRJTUVSM19JUlEJCSgxIDw8IDE3KQorI2RlZmluZSBUSU1FUjRfSVJRCQkoMSA8PCAxOCkKKyNkZWZpbmUgVElNRV9HUk9VUF9JUlEJCShUSU1FUjJfSVJRfFRJTUVSM19JUlF8VElNRVI0X0lSUSkKKworI2VuZGlmIC8qIF9fX0FTTV9BUkNIX1JFR1NfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1zZXJpYWwuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy1zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDhmYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9yZWdzLXNlcmlhbC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSTV9SRUdTX1NFUklBTF9ICisjZGVmaW5lIF9fQVNNX0FSTV9SRUdTX1NFUklBTF9ICisKKyNkZWZpbmUgVUFSVDBfQkEJVzkwWDkwMF9WQV9VQVJUCisjZGVmaW5lIFVBUlQxX0JBCShXOTBYOTAwX1ZBX1VBUlQrMHgxMDApCisjZGVmaW5lIFVBUlQyX0JBCShXOTBYOTAwX1ZBX1VBUlQrMHgyMDApCisjZGVmaW5lIFVBUlQzX0JBCShXOTBYOTAwX1ZBX1VBUlQrMHgzMDApCisjZGVmaW5lIFVBUlQ0X0JBCShXOTBYOTAwX1ZBX1VBUlQrMHg0MDApCisKKyNkZWZpbmUgVUFSVDBfUEEJVzkwWDkwMF9QQV9VQVJUCisjZGVmaW5lIFVBUlQxX1BBCShXOTBYOTAwX1BBX1VBUlQrMHgxMDApCisjZGVmaW5lIFVBUlQyX1BBCShXOTBYOTAwX1BBX1VBUlQrMHgyMDApCisjZGVmaW5lIFVBUlQzX1BBCShXOTBYOTAwX1BBX1VBUlQrMHgzMDApCisjZGVmaW5lIFVBUlQ0X1BBCShXOTBYOTAwX1BBX1VBUlQrMHg0MDApCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCB3OTB4OTAwX3VhcnRfY2xrc3JjIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXVuc2lnbmVkIGludAlkaXZpc29yOworCXVuc2lnbmVkIGludAltaW5fYmF1ZDsKKwl1bnNpZ25lZCBpbnQJbWF4X2JhdWQ7Cit9OworCitzdHJ1Y3QgdzkweDkwMF91YXJ0Y2ZnIHsKKwl1bnNpZ25lZCBjaGFyCWh3cG9ydDsKKwl1bnNpZ25lZCBjaGFyCXVudXNlZDsKKwl1bnNpZ25lZCBzaG9ydAlmbGFnczsKKwl1bnNpZ25lZCBsb25nCXVhcnRfZmxhZ3M7CisKKwl1bnNpZ25lZCBsb25nCXVjb247CisJdW5zaWduZWQgbG9uZwl1bGNvbjsKKwl1bnNpZ25lZCBsb25nCXVmY29uOworCisJc3RydWN0IHc5MHg5MDBfdWFydF9jbGtzcmMgKmNsb2NrczsKKwl1bnNpZ25lZCBpbnQJY2xvY2tzX3NpemU7Cit9OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0FTTV9BUk1fUkVHU19TRVJJQUxfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvcmVncy10aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzkwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9yZWdzLXRpbWVyLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9SRUdTX1RJTUVSX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1RJTUVSX0gKKworLyogVGltZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgVE1SX0JBCQkJVzkwWDkwMF9WQV9USU1FUgorI2RlZmluZSBSRUdfVENTUjAJCShUTVJfQkErMHgwMCkKKyNkZWZpbmUgUkVHX1RDU1IxCQkoVE1SX0JBKzB4MDQpCisjZGVmaW5lIFJFR19USUNSMAkJKFRNUl9CQSsweDA4KQorI2RlZmluZSBSRUdfVElDUjEJCShUTVJfQkErMHgwQykKKyNkZWZpbmUgUkVHX1REUjAJCShUTVJfQkErMHgxMCkKKyNkZWZpbmUgUkVHX1REUjEJCShUTVJfQkErMHgxNCkKKyNkZWZpbmUgUkVHX1RJU1IJCShUTVJfQkErMHgxOCkKKyNkZWZpbmUgUkVHX1dUQ1IJCShUTVJfQkErMHgxQykKKyNkZWZpbmUgUkVHX1RDU1IyCQkoVE1SX0JBKzB4MjApCisjZGVmaW5lIFJFR19UQ1NSMwkJKFRNUl9CQSsweDI0KQorI2RlZmluZSBSRUdfVElDUjIJCShUTVJfQkErMHgyOCkKKyNkZWZpbmUgUkVHX1RJQ1IzCQkoVE1SX0JBKzB4MkMpCisjZGVmaW5lIFJFR19URFIyCQkoVE1SX0JBKzB4MzApCisjZGVmaW5lIFJFR19URFIzCQkoVE1SX0JBKzB4MzQpCisjZGVmaW5lIFJFR19UQ1NSNAkJKFRNUl9CQSsweDQwKQorI2RlZmluZSBSRUdfVElDUjQJCShUTVJfQkErMHg0OCkKKyNkZWZpbmUgUkVHX1REUjQJCShUTVJfQkErMHg1MCkKKworI2VuZGlmIC8qICBfX0FTTV9BUkNIX1JFR1NfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3NTNmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgorCitzdGF0aWMgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUpCit7CisJY3B1X3Jlc2V0KDApOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0ZGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMCwwICsxLDI1IEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC90aW1leC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aW1leC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1RJTUVYX0gKKyNkZWZpbmUgX19BU01fQVJDSF9USU1FWF9ICisKKy8qIENMT0NLX1RJQ0tfUkFURSBOb3csIEkgZG9uJ3QgdXNlIGl0LiAqLworCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAxNTAwMDAwMAorCisjZW5kaWYgLyogX19BU01fQVJDSF9USU1FWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGQ5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKKyNkZWZpbmUgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKKworLyogRGVmaW5lcyBmb3IgVUFSVCByZWdpc3RlcnMgKi8KKworI2luY2x1ZGUgPG1hY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQorCitzdGF0aWMgdm9pZCBwdXRjKGludCBjaCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hfZGVjb21wX3NldHVwKHZvaWQpCit7Cit9CisKKyNlbmRpZi8qIF9fQVNNX1c5MFg5MDBfVU5DT01QUkVTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWRmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9WTUFMTE9DX0gKKyNkZWZpbmUgX19BU01fQVJDSF9WTUFMTE9DX0gKKworI2RlZmluZSBWTUFMTE9DX0VORAkgICgweEUwMDAwMDAwKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9WTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjRmYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2lycS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaXJxLmMKKyAqCisgKiBiYXNlZCBvbiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMgYnkgQmVuIERvb2tzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KKworc3RhdGljIHZvaWQgdzkweDkwMF9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fcmF3X3dyaXRlbCgxIDw8IGlycSwgUkVHX0FJQ19NRENSKTsKK30KKworLyoKKyAqIEJ5IHRoZSB3OTBwOTEwIHNwZWMsYW55IGlycSxvbmx5IHdyaXRlIDEKKyAqIHRvIFJFR19BSUNfRU9TQ1IgZm9yIEFDSworICovCisKK3N0YXRpYyB2b2lkIHc5MHg5MDBfaXJxX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fcmF3X3dyaXRlbCgweDAxLCBSRUdfQUlDX0VPU0NSKTsKK30KKworc3RhdGljIHZvaWQgdzkweDkwMF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJaWYgKGlycSA9PSBJUlFfVF9JTlRfR1JPVVApIHsKKwkJbWFzayA9IF9fcmF3X3JlYWRsKFJFR19BSUNfR0VOKTsKKwkJX19yYXdfd3JpdGVsKFRJTUVfR1JPVVBfSVJRIHwgbWFzaywgUkVHX0FJQ19HRU4pOworCQlfX3Jhd193cml0ZWwoMSA8PCBJUlFfVF9JTlRfR1JPVVAsIFJFR19BSUNfTUVDUik7CisJfQorCV9fcmF3X3dyaXRlbCgxIDw8IGlycSwgUkVHX0FJQ19NRUNSKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3OTB4OTAwX2lycV9jaGlwID0geworCS5hY2sJICAgPSB3OTB4OTAwX2lycV9hY2ssCisJLm1hc2sJICAgPSB3OTB4OTAwX2lycV9tYXNrLAorCS51bm1hc2sJICAgPSB3OTB4OTAwX2lycV91bm1hc2ssCit9OworCit2b2lkIF9faW5pdCB3OTB4OTAwX2luaXRfaXJxKHZvaWQpCit7CisJaW50IGlycW5vOworCisJX19yYXdfd3JpdGVsKDB4RkZGRkZGRkUsIFJFR19BSUNfTURDUik7CisKKwlmb3IgKGlycW5vID0gSVJRX1dEVDsgaXJxbm8gPD0gSVJRX0FEQzsgaXJxbm8rKykgeworCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZ3OTB4OTAwX2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtdzkwcDkxMGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtdzkwcDkxMGV2Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDdhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC13OTBwOTEwZXZiLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLXc5MHA5MTBldmIuYworICoKKyAqIEJhc2VkIG9uIG1hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMgYnkgSm9uYXMgRGlldHNjaGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPG1hY2gvcmVncy1zZXJpYWwuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHc5MHA5MTBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzkweDkwMF91YXJ0Y2ZnIHc5MHA5MTBfdWFydGNmZ3NbXSA9IHsKKwlXOTBYOTAwX1VBUlRDRkcoMCwgMCwgMCwgMCwgMCksCisJVzkwWDkwMF9VQVJUQ0ZHKDEsIDAsIDAsIDAsIDApLAorCVc5MFg5MDBfVUFSVENGRygyLCAwLCAwLCAwLCAwKSwKKwlXOTBYOTAwX1VBUlRDRkcoMywgMCwgMCwgMCwgMCksCisJVzkwWDkwMF9VQVJUQ0ZHKDQsIDAsIDAsIDAsIDApLAorfTsKKworLypIZXJlIHNob3VsZCBiZSB5b3VyIGV2YiByZXNvdXJzZSxzdWNoIGFzIExDRCovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp3OTBwOTEwZXZiX2RldltdIF9faW5pdGRhdGEgPSB7Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdzkwcDkxMGV2Yl9tYXBfaW8odm9pZCkKK3sKKwl3OTBwOTEwX21hcF9pbyh3OTBwOTEwX2lvZGVzYywgQVJSQVlfU0laRSh3OTBwOTEwX2lvZGVzYykpOworCXc5MHA5MTBfaW5pdF9jbG9ja3MoMCk7CisJdzkwcDkxMF9pbml0X3VhcnRzKHc5MHA5MTBfdWFydGNmZ3MsIEFSUkFZX1NJWkUodzkwcDkxMF91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdzkwcDkxMGV2Yl9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXModzkwcDkxMGV2Yl9kZXYsIEFSUkFZX1NJWkUodzkwcDkxMGV2Yl9kZXYpKTsKK30KKworTUFDSElORV9TVEFSVChXOTBQOTEwRVZCLCAiVzkwUDkxMEVWQiIpCisJLyogTWFpbnRhaW5lcjogV2FuIFpvbmdTaHVuICovCisJLnBoeXNfaW8JPSBXOTBYOTAwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVc5MFg5MDBfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDAsCisJLm1hcF9pbwkJPSB3OTBwOTEwZXZiX21hcF9pbywKKwkuaW5pdF9pcnEJPSB3OTB4OTAwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSB3OTBwOTEwZXZiX2luaXQsCisJLnRpbWVyCQk9ICZ3OTB4OTAwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjllMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvdGltZS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXc5MHg5MDAvdGltZS5jCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3RpbWUuYyBieSBCZW4gRG9va3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworI2luY2x1ZGUgPG1hY2gvc3lzdGVtLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtdGltZXIuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdzkweDkwMF9nZXR0aW1lb2Zmc2V0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qSVJRIGhhbmRsZXIgZm9yIHRoZSB0aW1lciovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAordzkweDkwMF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXRpbWVyX3RpY2soKTsKKwlfX3Jhd193cml0ZWwoMHgwMSwgUkVHX1RJU1IpOyAvKiBjbGVhciBUSUYwICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB3OTB4OTAwX3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAidzkweDkwMCBUaW1lciBUaWNrIiwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCisJLmhhbmRsZXIJPSB3OTB4OTAwX3RpbWVyX2ludGVycnVwdCwKK307CisKKy8qU2V0IHVwIHRpbWVyIHJlZy4qLworCitzdGF0aWMgdm9pZCB3OTB4OTAwX3RpbWVyX3NldHVwKHZvaWQpCit7CisJX19yYXdfd3JpdGVsKDAsIFJFR19UQ1NSMCk7CisJX19yYXdfd3JpdGVsKDAsIFJFR19UQ1NSMSk7CisJX19yYXdfd3JpdGVsKDAsIFJFR19UQ1NSMik7CisJX19yYXdfd3JpdGVsKDAsIFJFR19UQ1NSMyk7CisJX19yYXdfd3JpdGVsKDAsIFJFR19UQ1NSNCk7CisJX19yYXdfd3JpdGVsKDB4MUYsIFJFR19USVNSKTsKKwlfX3Jhd193cml0ZWwoMTUwMDAwMDAvKDEwMCAqIDEwMCksIFJFR19USUNSMCk7CisJX19yYXdfd3JpdGVsKDB4NjgwMDAwNjMsIFJFR19UQ1NSMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3OTB4OTAwX3RpbWVyX2luaXQodm9pZCkKK3sKKwl3OTB4OTAwX3RpbWVyX3NldHVwKCk7CisJc2V0dXBfaXJxKElSUV9USU1FUjAsICZ3OTB4OTAwX3RpbWVyX2lycSk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgdzkweDkwMF90aW1lciA9IHsKKwkuaW5pdAkJPSB3OTB4OTAwX3RpbWVyX2luaXQsCisJLm9mZnNldAkJPSB3OTB4OTAwX2dldHRpbWVvZmZzZXQsCisJLnJlc3VtZQkJPSB3OTB4OTAwX3RpbWVyX3NldHVwCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL3c5MHA5MTAuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC93OTBwOTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3ODNiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC93OTBwOTEwLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLXc5MHg5MDAvdzkwcDkxMC5jCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHguYyBieSBCZW4gRG9va3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBXOTBQOTEwIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1zZXJpYWwuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCisvKlc5MFA5MTAgaGFzIGZpdmUgdWFydHMqLworCisjZGVmaW5lIE1BWF9VQVJUX0NPVU5UIDUKK3N0YXRpYyBpbnQgdWFydF9jb3VudDsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1YXJ0X2RldnNbTUFYX1VBUlRfQ09VTlQtMV07CisKKy8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB3OTBwOTEwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJSU9ERVNDX0VOVChJUlEpLAorCUlPREVTQ19FTlQoR0NSKSwKKwlJT0RFU0NfRU5UKFVBUlQpLAorCUlPREVTQ19FTlQoVElNRVIpLAorCUlPREVTQ19FTlQoRUJJKSwKKwkvKklPREVTQ19FTlQoTENEKSwqLworfTsKKworLypJbml0IHRoZSBkZXYgcmVzb3VyY2UqLworCitzdGF0aWMgVzkwWDkwMF9SRVMoVUFSVDApOworc3RhdGljIFc5MFg5MDBfUkVTKFVBUlQxKTsKK3N0YXRpYyBXOTBYOTAwX1JFUyhVQVJUMik7CitzdGF0aWMgVzkwWDkwMF9SRVMoVUFSVDMpOworc3RhdGljIFc5MFg5MDBfUkVTKFVBUlQ0KTsKK3N0YXRpYyBXOTBYOTAwX0RFVklDRSh1YXJ0MCwgVUFSVDAsIDAsICJ3OTB4OTAwLXVhcnQiKTsKK3N0YXRpYyBXOTBYOTAwX0RFVklDRSh1YXJ0MSwgVUFSVDEsIDEsICJ3OTB4OTAwLXVhcnQiKTsKK3N0YXRpYyBXOTBYOTAwX0RFVklDRSh1YXJ0MiwgVUFSVDIsIDIsICJ3OTB4OTAwLXVhcnQiKTsKK3N0YXRpYyBXOTBYOTAwX0RFVklDRSh1YXJ0MywgVUFSVDMsIDMsICJ3OTB4OTAwLXVhcnQiKTsKK3N0YXRpYyBXOTBYOTAwX0RFVklDRSh1YXJ0NCwgVUFSVDQsIDQsICJ3OTB4OTAwLXVhcnQiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnVhcnRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnc5MHg5MDBfdWFydDAsCisJJnc5MHg5MDBfdWFydDEsCisJJnc5MHg5MDBfdWFydDIsCisJJnc5MHg5MDBfdWFydDMsCisJJnc5MHg5MDBfdWFydDQKK307CisKKy8qSW5pdCBXOTBQOTEwIHVhcnQgZGV2aWNlKi8KKwordm9pZCBfX2luaXQgdzkwcDkxMF9pbml0X3VhcnRzKHN0cnVjdCB3OTB4OTAwX3VhcnRjZmcgKmNmZywgaW50IG5vKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRkZXY7CisJaW50IHVhcnQsIHVhcnRkZXY7CisKKwkvKkJ5IG1pbigpIHRvIGp1ZGdlIGNvdW50IG9mIHVhcnQgYmUgdXNlZCBpbmRlZWQqLworCisJdWFydGRldiA9IEFSUkFZX1NJWkUodWFydF9kZXZpY2VzKTsKKwlubyA9IG1pbih1YXJ0ZGV2LCBubyk7CisKKwlmb3IgKHVhcnQgPSAwOyB1YXJ0IDwgbm87IHVhcnQrKywgY2ZnKyspIHsKKwkJaWYgKGNmZy0+aHdwb3J0ICE9IHVhcnQpCisJCQlwcmludGsoS0VSTl9FUlIgInc5MHg5MDBfdWFydGNmZ1slZF0gZXJyb3JcbiIsIHVhcnQpOworCQlwbGF0ZGV2ID0gdWFydF9kZXZpY2VzW2NmZy0+aHdwb3J0XTsKKwkJdWFydF9kZXZzW3VhcnRdID0gcGxhdGRldjsKKwkJcGxhdGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBjZmc7CisJfQorCXVhcnRfY291bnQgPSB1YXJ0OworfQorCisvKkluaXQgVzkwUDkxMCBldmIgaW8qLworCit2b2lkIF9faW5pdCB3OTBwOTEwX21hcF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IG1hY2hfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkY29kZSA9IDB4MDsKKworCWlvdGFibGVfaW5pdCh3OTBwOTEwX2lvZGVzYywgQVJSQVlfU0laRSh3OTBwOTEwX2lvZGVzYykpOworCisJaWRjb2RlID0gX19yYXdfcmVhZGwoVzkwWDkwMFBESUQpOworCWlmIChpZGNvZGUgIT0gVzkwUDkxMF9DUFVJRCkKKwkJcHJpbnRrKEtFUk5fRVJSICJDUFUgdHlwZSAweCUwOGx4IGlzIG5vdCBXOTBQOTEwXG4iLCBpZGNvZGUpOworfQorCisvKkluaXQgVzkwUDkxMCBjbG9jayovCisKK3ZvaWQgX19pbml0IHc5MHA5MTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHc5MHA5MTBfaW5pdF9jcHUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdzkweDkwMF9hcmNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdzkwcDkxMF9pbml0X2NwdSgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyh1YXJ0X2RldnMsIHVhcnRfY291bnQpOworCit9CithcmNoX2luaXRjYWxsKHc5MHg5MDBfYXJjaF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IGFiNWY3YTIuLmQ0OTBmMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtMTAsOCArMTAsNyBAQAogCiAjIEFSTTYxMAogY29uZmlnIENQVV9BUk02MTAKLQlib29sICJTdXBwb3J0IEFSTTYxMCBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBBUkNIX1JQQworCWJvb2wgIlN1cHBvcnQgQVJNNjEwIHByb2Nlc3NvciIgaWYgQVJDSF9SUEMKIAlzZWxlY3QgQ1BVXzMydjMKIAlzZWxlY3QgQ1BVX0NBQ0hFX1YzCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCkBAIC00Myw4ICs0Miw3IEBACiAKICMgQVJNNzEwCiBjb25maWcgQ1BVX0FSTTcxMAotCWJvb2wgIlN1cHBvcnQgQVJNNzEwIHByb2Nlc3NvciIgaWYgIUFSQ0hfQ0xQUzc1MDAgJiYgQVJDSF9SUEMKLQlkZWZhdWx0IHkgaWYgQVJDSF9DTFBTNzUwMAorCWJvb2wgIlN1cHBvcnQgQVJNNzEwIHByb2Nlc3NvciIgaWYgQVJDSF9SUEMKIAlzZWxlY3QgQ1BVXzMydjMKIAlzZWxlY3QgQ1BVX0NBQ0hFX1YzCiAJc2VsZWN0IENQVV9DQUNIRV9WSVZUCkBAIC02Myw4ICs2MSw3IEBACiAKICMgQVJNNzIwVAogY29uZmlnIENQVV9BUk03MjBUCi0JYm9vbCAiU3VwcG9ydCBBUk03MjBUIHByb2Nlc3NvciIgaWYgIUFSQ0hfQ0xQUzcxMVggJiYgIUFSQ0hfTDcyMDAgJiYgIUFSQ0hfQ0RCODk3MTIgJiYgQVJDSF9JTlRFR1JBVE9SCi0JZGVmYXVsdCB5IGlmIEFSQ0hfQ0xQUzcxMVggfHwgQVJDSF9MNzIwMCB8fCBBUkNIX0NEQjg5NzEyIHx8IEFSQ0hfSDcyMFgKKwlib29sICJTdXBwb3J0IEFSTTcyMFQgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjRUCiAJc2VsZWN0IENQVV9BQlJUX0xWNFQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMTE0LDkgKzExMSw3IEBACiAKICMgQVJNOTIwVAogY29uZmlnIENQVV9BUk05MjBUCi0JYm9vbCAiU3VwcG9ydCBBUk05MjBUIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYIHx8IEFSQ0hfSU5URUdSQVRPUiB8fCBDUFVfUzNDMjQxMCB8fCBDUFVfUzNDMjQ0MCB8fCBDUFVfUzNDMjQ0MiB8fCBBUkNIX0lNWCB8fCBBUkNIX0FBRUMyMDAwIHx8IEFSQ0hfQVQ5MVJNOTIwMAotCWRlZmF1bHQgeSBpZiBDUFVfUzNDMjQxMCB8fCBDUFVfUzNDMjQ0MCB8fCBDUFVfUzNDMjQ0MiB8fCBBUkNIX0FUOTFSTTkyMDAKKwlib29sICJTdXBwb3J0IEFSTTkyMFQgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjRUCiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMTM4LDggKzEzMyw2IEBACiAjIEFSTTkyMlQKIGNvbmZpZyBDUFVfQVJNOTIyVAogCWJvb2wgIlN1cHBvcnQgQVJNOTIyVCBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgotCWRlcGVuZHMgb24gQVJDSF9MSDdBNDBYIHx8IEFSQ0hfSU5URUdSQVRPUiB8fCBBUkNIX0tTODY5NQotCWRlZmF1bHQgeSBpZiBBUkNIX0xIN0E0MFggfHwgQVJDSF9LUzg2OTUKIAlzZWxlY3QgQ1BVXzMydjRUCiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMTU5LDggKzE1Miw2IEBACiAjIEFSTTkyNVQKIGNvbmZpZyBDUFVfQVJNOTI1VAogIAlib29sICJTdXBwb3J0IEFSTTkyNVQgcHJvY2Vzc29yIiBpZiBBUkNIX09NQVAxCi0gCWRlcGVuZHMgb24gQVJDSF9PTUFQMTVYWAotIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMTVYWAogCXNlbGVjdCBDUFVfMzJ2NFQKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAogCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCkBAIC0xNzksMjIgKzE3MCw3IEBACiAKICMgQVJNOTI2VAogY29uZmlnIENQVV9BUk05MjZUCi0JYm9vbCAiU3VwcG9ydCBBUk05MjZUIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIEFSQ0hfSU5URUdSQVRPUiB8fCBBUkNIX1ZFUlNBVElMRV9QQiB8fCBcCi0JCU1BQ0hfVkVSU0FUSUxFX0FCIHx8IEFSQ0hfT01BUDczMCB8fCBcCi0JCUFSQ0hfT01BUDE2WFggfHwgTUFDSF9SRUFMVklFV19FQiB8fCBcCi0JCUFSQ0hfUE5YNDAwOCB8fCBBUkNIX05FVFggfHwgQ1BVX1MzQzI0MTIgfHwgXAotCQlBUkNIX0FUOTFTQU05MjYwIHx8IEFSQ0hfQVQ5MVNBTTkyNjEgfHwgXAotCQlBUkNIX0FUOTFTQU05MjYzIHx8IEFSQ0hfQVQ5MVNBTTlSTCB8fCBcCi0JCUFSQ0hfQVQ5MVNBTTlHMjAgfHwgQVJDSF9BVDkxQ0FQOSB8fCBcCi0JCUFSQ0hfTlM5WFhYIHx8IEFSQ0hfREFWSU5DSSB8fCBBUkNIX01YMgotCWRlZmF1bHQgeSBpZiBBUkNIX1ZFUlNBVElMRV9QQiB8fCBNQUNIX1ZFUlNBVElMRV9BQiB8fCBcCi0JCUFSQ0hfT01BUDczMCB8fCBBUkNIX09NQVAxNlhYIHx8IFwKLQkJQVJDSF9QTlg0MDA4IHx8IEFSQ0hfTkVUWCB8fCBDUFVfUzNDMjQxMiB8fCBcCi0JCUFSQ0hfQVQ5MVNBTTkyNjAgfHwgQVJDSF9BVDkxU0FNOTI2MSB8fCBcCi0JCUFSQ0hfQVQ5MVNBTTkyNjMgfHwgQVJDSF9BVDkxU0FNOVJMIHx8IFwKLQkJQVJDSF9BVDkxU0FNOUcyMCB8fCBBUkNIX0FUOTFDQVA5IHx8IFwKLQkJQVJDSF9OUzlYWFggfHwgQVJDSF9EQVZJTkNJIHx8IEFSQ0hfTVgyCisJYm9vbCAiU3VwcG9ydCBBUk05MjZUIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY1VEoKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMjQ3LDggKzIyMyw3IEBACiAKICMgQVJNMTAyMCAtIG5lZWRzIHZhbGlkYXRpbmcKIGNvbmZpZyBDUFVfQVJNMTAyMAotCWJvb2wgIlN1cHBvcnQgQVJNMTAyMFQgKHJldiAwKSBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IKKwlib29sICJTdXBwb3J0IEFSTTEwMjBUIChyZXYgMCkgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAogCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCkBAIC0yNjYsOCArMjQxLDcgQEAKIAogIyBBUk0xMDIwRSAtIG5lZWRzIHZhbGlkYXRpbmcKIGNvbmZpZyBDUFVfQVJNMTAyMEUKLQlib29sICJTdXBwb3J0IEFSTTEwMjBFIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIEFSQ0hfSU5URUdSQVRPUgorCWJvb2wgIlN1cHBvcnQgQVJNMTAyMEUgcHJvY2Vzc29yIiBpZiBBUkNIX0lOVEVHUkFUT1IKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAogCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCkBAIC0yODAsOCArMjU0LDcgQEAKIAogIyBBUk0xMDIyRQogY29uZmlnIENQVV9BUk0xMDIyCi0JYm9vbCAiU3VwcG9ydCBBUk0xMDIyRSBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IKKwlib29sICJTdXBwb3J0IEFSTTEwMjJFIHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SCiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNFQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMjk5LDggKzI3Miw3IEBACiAKICMgQVJNMTAyNkVKLVMKIGNvbmZpZyBDUFVfQVJNMTAyNgotCWJvb2wgIlN1cHBvcnQgQVJNMTAyNkVKLVMgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SCisJYm9vbCAiU3VwcG9ydCBBUk0xMDI2RUotUyBwcm9jZXNzb3IiIGlmIEFSQ0hfSU5URUdSQVRPUgogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9FVjVUICMgQnV0IG5lZWQgSmF6ZWxsZSwgYnV0IEVWNVRKIGlnbm9yZXMgYml0IDEwCiAJc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKQEAgLTMxNyw4ICsyODksNyBAQAogCiAjIFNBMTEwCiBjb25maWcgQ1BVX1NBMTEwCi0JYm9vbCAiU3VwcG9ydCBTdHJvbmdBUk0oUikgU0EtMTEwIHByb2Nlc3NvciIgaWYgIUFSQ0hfRUJTQTExMCAmJiAhRk9PVEJSSURHRSAmJiAhQVJDSF9UQk9YICYmICFBUkNIX1NIQVJLICYmICFBUkNIX05FWFVTUENJICYmIEFSQ0hfUlBDCi0JZGVmYXVsdCB5IGlmIEFSQ0hfRUJTQTExMCB8fCBGT09UQlJJREdFIHx8IEFSQ0hfVEJPWCB8fCBBUkNIX1NIQVJLIHx8IEFSQ0hfTkVYVVNQQ0kKKwlib29sICJTdXBwb3J0IFN0cm9uZ0FSTShSKSBTQS0xMTAgcHJvY2Vzc29yIiBpZiBBUkNIX1JQQwogCXNlbGVjdCBDUFVfMzJ2MyBpZiBBUkNIX1JQQwogCXNlbGVjdCBDUFVfMzJ2NCBpZiAhQVJDSF9SUEMKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0CkBAIC0zNDAsOCArMzExLDYgQEAKICMgU0ExMTAwCiBjb25maWcgQ1BVX1NBMTEwMAogCWJvb2wKLQlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwCi0JZGVmYXVsdCB5CiAJc2VsZWN0IENQVV8zMnY0CiAJc2VsZWN0IENQVV9BQlJUX0VWNAogCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCkBAIC0zNTMsOCArMzIyLDYgQEAKICMgWFNjYWxlCiBjb25maWcgQ1BVX1hTQ0FMRQogCWJvb2wKLQlkZXBlbmRzIG9uIEFSQ0hfSU9QMzJYIHx8IEFSQ0hfSU9QMzNYIHx8IFBYQTI1eCB8fCBQWEEyN3ggfHwgQVJDSF9JWFA0WFggfHwgQVJDSF9JWFAyMDAwCi0JZGVmYXVsdCB5CiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNVQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMzY1LDggKzMzMiw2IEBACiAjIFhTY2FsZSBDb3JlIFZlcnNpb24gMwogY29uZmlnIENQVV9YU0MzCiAJYm9vbAotCWRlcGVuZHMgb24gQVJDSF9JWFAyM1hYIHx8IEFSQ0hfSU9QMTNYWCB8fCBQWEEzeHgKLQlkZWZhdWx0IHkKIAlzZWxlY3QgQ1BVXzMydjUKIAlzZWxlY3QgQ1BVX0FCUlRfRVY1VAogCXNlbGVjdCBDUFVfUEFCUlRfTk9JRkFSCkBAIC0zNzgsOCArMzQzLDYgQEAKICMgRmVyb2Nlb24KIGNvbmZpZyBDUFVfRkVST0NFT04KIAlib29sCi0JZGVwZW5kcyBvbiBBUkNIX09SSU9ONVggfHwgQVJDSF9MT0tJIHx8IEFSQ0hfS0lSS1dPT0QgfHwgQVJDSF9NVjc4WFgwCi0JZGVmYXVsdCB5CiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNVQKIAlzZWxlY3QgQ1BVX1BBQlJUX05PSUZBUgpAQCAtMzk5LDEwICszNjIsNyBAQAogCiAjIEFSTXY2CiBjb25maWcgQ1BVX1Y2Ci0JYm9vbCAiU3VwcG9ydCBBUk0gVjYgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIgfHwgQVJDSF9PTUFQMiB8fCBBUkNIX01YMyB8fCBBUkNIX01TTSB8fCBNQUNIX1JFQUxWSUVXX1BCMTFNUCB8fCBNQUNIX1JFQUxWSUVXX1BCMTE3NgotCWRlZmF1bHQgeSBpZiBBUkNIX01YMwotCWRlZmF1bHQgeSBpZiBBUkNIX01TTQorCWJvb2wgIlN1cHBvcnQgQVJNIFY2IHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIKIAlzZWxlY3QgQ1BVXzMydjYKIAlzZWxlY3QgQ1BVX0FCUlRfRVY2CiAJc2VsZWN0IENQVV9QQUJSVF9OT0lGQVIKQEAgLTQyNyw4ICszODcsNyBAQAogCiAjIEFSTXY3CiBjb25maWcgQ1BVX1Y3Ci0JYm9vbCAiU3VwcG9ydCBBUk0gVjcgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIgfHwgQVJDSF9PTUFQMworCWJvb2wgIlN1cHBvcnQgQVJNIFY3IHByb2Nlc3NvciIgaWYgQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIKIAlzZWxlY3QgQ1BVXzMydjZLCiAJc2VsZWN0IENQVV8zMnY3CiAJc2VsZWN0IENQVV9BQlJUX0VWNwpAQCAtNzQ1LDcgKzcwNCw3IEBACiAKIGNvbmZpZyBDQUNIRV9MMlgwCiAJYm9vbCAiRW5hYmxlIHRoZSBMMngwIG91dGVyIGNhY2hlIGNvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMTc2CisJZGVwZW5kcyBvbiBSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMTc2IHx8IFJFQUxWSUVXX0VCX0E5TVAKIAlkZWZhdWx0IHkKIAlzZWxlY3QgT1VURVJfQ0FDSEUKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCmluZGV4IDJkNTg4NGMuLjNhMzk4YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCisrKyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXYzLlMgYi9hcmNoL2FybS9tbS9jYWNoZS12My5TCmluZGV4IDNiMzYzOWUuLjhhNGFiZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLXYzLlMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjMuUwpAQCAtOSw3ICs5LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjQuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY0LlMKaW5kZXggNTc4NmFkZi4uMzY2ODYxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjQuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12NC5TCkBAIC05LDcgKzksNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12NHd0LlMgYi9hcmNoL2FybS9tbS9jYWNoZS12NHd0LlMKaW5kZXggNTFhOWIwYi4uYzU0ZmEyYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjR3dC5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY0d3QuUwpAQCAtMTMsNyArMTMsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUwppbmRleCBkMTljMmJlLi5iZTkzZmYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKQEAgLTI2LDYgKzI2LDcgQEAKICAqCS0gbW0gICAgLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCiAgKi8KIEVOVFJZKHY3X2ZsdXNoX2RjYWNoZV9hbGwpCisJZG1iCQkJCQlAIGVuc3VyZSBvcmRlcmluZyB3aXRoIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3NlcwogCW1yYwlwMTUsIDEsIHIwLCBjMCwgYzAsIDEJCUAgcmVhZCBjbGlkcgogCWFuZHMJcjMsIHIwLCAjMHg3MDAwMDAwCQlAIGV4dHJhY3QgbG9jIGZyb20gY2xpZHIKIAltb3YJcjMsIHIzLCBsc3IgIzIzCQkJQCBsZWZ0IGFsaWduIGxvYyBiaXQgZmllbGQKQEAgLTY0LDYgKzY1LDcgQEAKIGZpbmlzaGVkOgogCW1vdglyMTAsICMwCQkJCUAgc3dpdGggYmFjayB0byBjYWNoZSBsZXZlbCAwCiAJbWNyCXAxNSwgMiwgcjEwLCBjMCwgYzAsIDAJCUAgc2VsZWN0IGN1cnJlbnQgY2FjaGUgbGV2ZWwgaW4gY3NzcgorCWRzYgogCWlzYgogCW1vdglwYywgbHIKIEVORFBST0ModjdfZmx1c2hfZGNhY2hlX2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLWZlcm9jZW9uLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS1mZXJvY2Vvbi5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWIwZDMyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLWZlcm9jZW9uLlMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL2xpYi9jb3B5cGFnZS1mZXJvY2Vvbi5TCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3JzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGhhbmRsZXMgY29weV91c2VyX3BhZ2UgYW5kIGNsZWFyX3VzZXJfcGFnZSBvbiBGZXJvY2VvbgotICogbW9yZSBvcHRpbWFsbHkgdGhhbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotCi0JLnRleHQKLQkuYWxpZ24JNQotCi1FTlRSWShmZXJvY2Vvbl9jb3B5X3VzZXJfcGFnZSkKLQlzdG1mZAlzcCEsIHtyNC1yOSwgbHJ9Ci0JbW92CWlwLCAjUEFHRV9TWgotMToJbW92CWxyLCByMQotCWxkbWlhCXIxISwge3IyIC0gcjl9Ci0JcGxkCVtsciwgIzMyXQotCXBsZAlbbHIsICM2NF0KLQlwbGQJW2xyLCAjOTZdCi0JcGxkCVtsciwgIzEyOF0KLQlwbGQJW2xyLCAjMTYwXQotCXBsZAlbbHIsICMxOTJdCi0JcGxkCVtsciwgIzIyNF0KLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0JbGRtaWEJcjEhLCB7cjIgLSByOX0KLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlzdG1pYQlyMCwge3IyIC0gcjl9Ci0Jc3VicwlpcCwgaXAsICMoMzIgKiA4KQotCW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuIGFuZCBpbnZhbGlkYXRlIEQgbGluZQotCWFkZAlyMCwgcjAsICMzMgotCWJuZQkxYgotCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCi0JbGRtZmQJc3AhLCB7cjQtcjksIHBjfQotCi0JLmFsaWduCTUKLQotRU5UUlkoZmVyb2Nlb25fY2xlYXJfdXNlcl9wYWdlKQotCXN0bWZkCXNwISwge3I0LXI3LCBscn0KLQltb3YJcjEsICNQQUdFX1NaLzMyCi0JbW92CXIyLCAjMAotCW1vdglyMywgIzAKLQltb3YJcjQsICMwCi0JbW92CXI1LCAjMAotCW1vdglyNiwgIzAKLQltb3YJcjcsICMwCi0JbW92CWlwLCAjMAotCW1vdglsciwgIzAKLTE6CXN0bWlhCXIwLCB7cjItcjcsIGlwLCBscn0KLQlzdWJzCXIxLCByMSwgIzEKLQltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmUKLQlhZGQJcjAsIHIwLCAjMzIKLQlibmUJMWIKLQltY3IJcDE1LCAwLCByMSwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgotCWxkbWZkCXNwISwge3I0LXI3LCBwY30KLQotCV9fSU5JVERBVEEKLQotCS50eXBlCWZlcm9jZW9uX3VzZXJfZm5zLCAjb2JqZWN0Ci1FTlRSWShmZXJvY2Vvbl91c2VyX2ZucykKLQkubG9uZwlmZXJvY2Vvbl9jbGVhcl91c2VyX3BhZ2UKLQkubG9uZwlmZXJvY2Vvbl9jb3B5X3VzZXJfcGFnZQotCS5zaXplCWZlcm9jZW9uX3VzZXJfZm5zLCAuIC0gZmVyb2Nlb25fdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLWZlcm9jZW9uLmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS1mZXJvY2Vvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYmE2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS1mZXJvY2Vvbi5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NvcHlwYWdlLWZlcm9jZW9uLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgaGFuZGxlcyBjb3B5X3VzZXJfaGlnaHBhZ2UgYW5kIGNsZWFyX3VzZXJfcGFnZSBvbiBGZXJvY2VvbgorICogbW9yZSBvcHRpbWFsbHkgdGhhbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCitmZXJvY2Vvbl9jb3B5X3VzZXJfcGFnZSh2b2lkICprdG8sIGNvbnN0IHZvaWQgKmtmcm9tKQoreworCWFzbSgiXAorCXN0bWZkCXNwISwge3I0LXI5LCBscn0JCVxuXAorCW1vdglpcCwgJTAJCQkJXG5cCisxOgltb3YJbHIsIHIxCQkJCVxuXAorCWxkbWlhCXIxISwge3IyIC0gcjl9CQkJXG5cCisJcGxkCVtsciwgIzMyXQkJCVxuXAorCXBsZAlbbHIsICM2NF0JCQlcblwKKwlwbGQJW2xyLCAjOTZdCQkJXG5cCisJcGxkCVtsciwgIzEyOF0JCQlcblwKKwlwbGQJW2xyLCAjMTYwXQkJCVxuXAorCXBsZAlbbHIsICMxOTJdCQkJXG5cCisJcGxkCVtsciwgIzIyNF0JCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJbGRtaWEJcjEhLCB7cjIgLSByOX0JCQlcblwKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxNCwgMQkJQCBjbGVhbiBhbmQgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlhZGQJcjAsIHIwLCAjMzIJCQlcblwKKwlzdG1pYQlyMCwge3IyIC0gcjl9CQkJXG5cCisJc3VicwlpcCwgaXAsICMoMzIgKiA4KQkJXG5cCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTQsIDEJCUAgY2xlYW4gYW5kIGludmFsaWRhdGUgRCBsaW5lXG5cCisJYWRkCXIwLCByMCwgIzMyCQkJXG5cCisJYm5lCTFiCQkJCVxuXAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCXG5cCisJbGRtZmQJc3AhLCB7cjQtcjksIHBjfSIKKwk6CisJOiAiSSIgKFBBR0VfU0laRSkpOworfQorCit2b2lkIGZlcm9jZW9uX2NvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCXVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqa3RvLCAqa2Zyb207CisKKwlrdG8gPSBrbWFwX2F0b21pYyh0bywgS01fVVNFUjApOworCWtmcm9tID0ga21hcF9hdG9taWMoZnJvbSwgS01fVVNFUjEpOworCWZlcm9jZW9uX2NvcHlfdXNlcl9wYWdlKGt0bywga2Zyb20pOworCWt1bm1hcF9hdG9taWMoa2Zyb20sIEtNX1VTRVIxKTsKKwlrdW5tYXBfYXRvbWljKGt0bywgS01fVVNFUjApOworfQorCit2b2lkIGZlcm9jZW9uX2NsZWFyX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqcHRyLCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJYXNtIHZvbGF0aWxlICgiXAorCW1vdglyMSwgJTIJCQkJXG5cCisJbW92CXIyLCAjMAkJCQlcblwKKwltb3YJcjMsICMwCQkJCVxuXAorCW1vdglyNCwgIzAJCQkJXG5cCisJbW92CXI1LCAjMAkJCQlcblwKKwltb3YJcjYsICMwCQkJCVxuXAorCW1vdglyNywgIzAJCQkJXG5cCisJbW92CWlwLCAjMAkJCQlcblwKKwltb3YJbHIsICMwCQkJCVxuXAorMToJc3RtaWEJJTAsIHtyMi1yNywgaXAsIGxyfQkJXG5cCisJc3VicwlyMSwgcjEsICMxCQkJXG5cCisJbWNyCXAxNSwgMCwgJTAsIGM3LCBjMTQsIDEJCUAgY2xlYW4gYW5kIGludmFsaWRhdGUgRCBsaW5lXG5cCisJYWRkCSUwLCAlMCwgIzMyCQkJXG5cCisJYm5lCTFiCQkJCVxuXAorCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCIgorCTogIj1yIiAocHRyKQorCTogIjAiIChrYWRkciksICJJIiAoUEFHRV9TSVpFIC8gMzIpCisJOiAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAiaXAiLCAibHIiKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Cit9CisKK3N0cnVjdCBjcHVfdXNlcl9mbnMgZmVyb2Nlb25fdXNlcl9mbnMgX19pbml0ZGF0YSA9IHsKKwkuY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UgPSBmZXJvY2Vvbl9jbGVhcl91c2VyX2hpZ2hwYWdlLAorCS5jcHVfY29weV91c2VyX2hpZ2hwYWdlCT0gZmVyb2Nlb25fY29weV91c2VyX2hpZ2hwYWdlLAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTM5NGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuUworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbGliL2NvcHlwYWdlLlMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgUnVzc2VsbCBLaW5nCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgQVNNIG9wdGltaXNlZCBzdHJpbmcgZnVuY3Rpb25zCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLQotCQkudGV4dAotCQkuYWxpZ24JNQotLyoKLSAqIEFSTXYzIG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQotICoKLSAqIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGhhbmRsZSBjYWNoZSBzdHVmZi4uLgotICovCi1FTlRSWSh2M19jb3B5X3VzZXJfcGFnZSkKLQlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQAkyCi0JbW92CXIyLCAjUEFHRV9TWi82NAkJCUAJMQotCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0KzEKLTE6CXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMQotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKLQlzdWJzCXIyLCByMiwgIzEJCQlACTEKLQlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAJNAotCWxkbW5laWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQKLQlibmUJMWIJCQkJQAkxCi0JbGRtZmQJc3AhLCB7cjQsIHBjfQkJCUAJMwotCi0JLmFsaWduCTUKLS8qCi0gKiBBUk12MyBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCi0gKgotICogRklYTUU6IGRvIHdlIG5lZWQgdG8gaGFuZGxlIGNhY2hlIHN0dWZmLi4uCi0gKi8KLUVOVFJZKHYzX2NsZWFyX3VzZXJfcGFnZSkKLQlzdHIJbHIsIFtzcCwgIy00XSEKLQltb3YJcjEsICNQQUdFX1NaLzY0CQkJQCAxCi0JbW92CXIyLCAjMAkJCQlAIDEKLQltb3YJcjMsICMwCQkJCUAgMQotCW1vdglpcCwgIzAJCQkJQCAxCi0JbW92CWxyLCAjMAkJCQlAIDEKLTE6CXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0Jc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0Jc3VicwlyMSwgcjEsICMxCQkJQCAxCi0JYm5lCTFiCQkJCUAgMQotCWxkcglwYywgW3NwXSwgIzQKLQotCV9fSU5JVERBVEEKLQotCS50eXBlCXYzX3VzZXJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh2M191c2VyX2ZucykKLQkubG9uZwl2M19jbGVhcl91c2VyX3BhZ2UKLQkubG9uZwl2M19jb3B5X3VzZXJfcGFnZQotCS5zaXplCXYzX3VzZXJfZm5zLCAuIC0gdjNfdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXYzLmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWQ5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12My5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworLyoKKyAqIEFSTXYzIG9wdGltaXNlZCBjb3B5X3VzZXJfaGlnaHBhZ2UKKyAqCisgKiBGSVhNRTogZG8gd2UgbmVlZCB0byBoYW5kbGUgY2FjaGUgc3R1ZmYuLi4KKyAqLworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobmFrZWQpKQordjNfY29weV91c2VyX3BhZ2Uodm9pZCAqa3RvLCBjb25zdCB2b2lkICprZnJvbSkKK3sKKwlhc20oIlxuXAorCXN0bWZkCXNwISwge3I0LCBscn0JCQlACTJcblwKKwltb3YJcjIsICUyCQkJCUAJMVxuXAorCWxkbWlhCSUwISwge3IzLCByNCwgaXAsIGxyfQkJQAk0KzFcblwKKzE6CXN0bWlhCSUxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0XG5cCisJbGRtaWEJJTAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMVxuXAorCXN0bWlhCSUxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0XG5cCisJbGRtaWEJJTAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTQrMVxuXAorCXN0bWlhCSUxISwge3IzLCByNCwgaXAsIGxyfQkJQAk0XG5cCisJbGRtaWEJJTAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTRcblwKKwlzdWJzCXIyLCByMiwgIzEJCQlACTFcblwKKwlzdG1pYQklMSEsIHtyMywgcjQsIGlwLCBscn0JCUAJNFxuXAorCWxkbW5laWEJJTAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlACTRcblwKKwlibmUJMWIJCQkJQAkxXG5cCisJbGRtZmQJc3AhLCB7cjQsIHBjfQkJCUAJMyIKKwk6CisJOiAiciIgKGtmcm9tKSwgInIiIChrdG8pLCAiSSIgKFBBR0VfU0laRSAvIDY0KSk7Cit9CisKK3ZvaWQgdjNfY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IHBhZ2UgKmZyb20sCisJdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl2b2lkICprdG8sICprZnJvbTsKKworCWt0byA9IGttYXBfYXRvbWljKHRvLCBLTV9VU0VSMCk7CisJa2Zyb20gPSBrbWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMSk7CisJdjNfY29weV91c2VyX3BhZ2Uoa3RvLCBrZnJvbSk7CisJa3VubWFwX2F0b21pYyhrZnJvbSwgS01fVVNFUjEpOworCWt1bm1hcF9hdG9taWMoa3RvLCBLTV9VU0VSMCk7Cit9CisKKy8qCisgKiBBUk12MyBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKgorICogRklYTUU6IGRvIHdlIG5lZWQgdG8gaGFuZGxlIGNhY2hlIHN0dWZmLi4uCisgKi8KK3ZvaWQgdjNfY2xlYXJfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl2b2lkICpwdHIsICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlhc20gdm9sYXRpbGUoIlxuXAorCW1vdglyMSwgJTIJCQkJQCAxXG5cCisJbW92CXIyLCAjMAkJCQlAIDFcblwKKwltb3YJcjMsICMwCQkJCUAgMVxuXAorCW1vdglpcCwgIzAJCQkJQCAxXG5cCisJbW92CWxyLCAjMAkJCQlAIDFcblwKKzE6CXN0bWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJc3RtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJc3VicwlyMSwgcjEsICMxCQkJQCAxXG5cCisJYm5lCTFiCQkJCUAgMSIKKwk6ICI9ciIgKHB0cikKKwk6ICIwIiAoa2FkZHIpLCAiSSIgKFBBR0VfU0laRSAvIDY0KQorCTogInIxIiwgInIyIiwgInIzIiwgImlwIiwgImxyIik7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworfQorCitzdHJ1Y3QgY3B1X3VzZXJfZm5zIHYzX3VzZXJfZm5zIF9faW5pdGRhdGEgPSB7CisJLmNwdV9jbGVhcl91c2VyX2hpZ2hwYWdlID0gdjNfY2xlYXJfdXNlcl9oaWdocGFnZSwKKwkuY3B1X2NvcHlfdXNlcl9oaWdocGFnZQk9IHYzX2NvcHlfdXNlcl9oaWdocGFnZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLmMKaW5kZXggOGQzM2UyNS4uYmRiNWZkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjRtYy5jCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYwpAQCAtMTUsOCArMTUsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0zMyw3ICszMyw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pbmljYWNoZV9sb2NrKTsKIAogLyoKLSAqIEFSTXY0IG1pbmktZGNhY2hlIG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQorICogQVJNdjQgbWluaS1kY2FjaGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9oaWdocGFnZQogICoKICAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQogICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCkBAIC00Miw3ICs0Miw3IEBACiAgKgogICogTm90ZTogV2UgcmVseSBvbiBhbGwgQVJNdjQgcHJvY2Vzc29ycyBpbXBsZW1lbnRpbmcgdGhlICJpbnZhbGlkYXRlIEQgbGluZSIKICAqIGluc3RydWN0aW9uLiAgSWYgeW91ciBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcGx5IHRoaXMsIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIKLSAqIG93biBjb3B5X3VzZXJfcGFnZSB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorICogb3duIGNvcHlfdXNlcl9oaWdocGFnZSB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgogICovCiBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCiBtY19jb3B5X3VzZXJfcGFnZSh2b2lkICpmcm9tLCB2b2lkICp0bykKQEAgLTY4LDUwICs2OCw1MyBAQAogCTogInIiIChmcm9tKSwgInIiICh0byksICJJIiAoUEFHRV9TSVpFIC8gNjQpKTsKIH0KIAotdm9pZCB2NF9tY19jb3B5X3VzZXJfcGFnZSh2b2lkICprdG8sIGNvbnN0IHZvaWQgKmtmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQordm9pZCB2NF9tY19jb3B5X3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKmZyb20sIHN0cnVjdCBwYWdlICp0bywKKwl1bnNpZ25lZCBsb25nIHZhZGRyKQogewotCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGtmcm9tKTsKKwl2b2lkICprdG8gPSBrbWFwX2F0b21pYyh0bywgS01fVVNFUjEpOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQR19kY2FjaGVfZGlydHksICZwYWdlLT5mbGFncykpCi0JCV9fZmx1c2hfZGNhY2hlX3BhZ2UocGFnZV9tYXBwaW5nKHBhZ2UpLCBwYWdlKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJmZyb20tPmZsYWdzKSkKKwkJX19mbHVzaF9kY2FjaGVfcGFnZShwYWdlX21hcHBpbmcoZnJvbSksIGZyb20pOwogCiAJc3Bpbl9sb2NrKCZtaW5pY2FjaGVfbG9jayk7CiAKLQlzZXRfcHRlX2V4dChUT1BfUFRFKDB4ZmZmZjgwMDApLCBwZm5fcHRlKF9fcGEoa2Zyb20pID4+IFBBR0VfU0hJRlQsIG1pbmljYWNoZV9wZ3Byb3QpLCAwKTsKKwlzZXRfcHRlX2V4dChUT1BfUFRFKDB4ZmZmZjgwMDApLCBwZm5fcHRlKHBhZ2VfdG9fcGZuKGZyb20pLCBtaW5pY2FjaGVfcGdwcm90KSwgMCk7CiAJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKDB4ZmZmZjgwMDApOwogCiAJbWNfY29weV91c2VyX3BhZ2UoKHZvaWQgKikweGZmZmY4MDAwLCBrdG8pOwogCiAJc3Bpbl91bmxvY2soJm1pbmljYWNoZV9sb2NrKTsKKworCWt1bm1hcF9hdG9taWMoa3RvLCBLTV9VU0VSMSk7CiB9CiAKIC8qCiAgKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCiAgKi8KLXZvaWQgX19hdHRyaWJ1dGVfXygobmFrZWQpKQotdjRfbWNfY2xlYXJfdXNlcl9wYWdlKHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIHZhZGRyKQordm9pZCB2NF9tY19jbGVhcl91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyKQogewotCWFzbSB2b2xhdGlsZSgKLQkic3RyCWxyLCBbc3AsICMtNF0hXG5cCi0JbW92CXIxLCAlMAkJCQlAIDFcblwKKwl2b2lkICpwdHIsICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlhc20gdm9sYXRpbGUoIlwKKwltb3YJcjEsICUyCQkJCUAgMVxuXAogCW1vdglyMiwgIzAJCQkJQCAxXG5cCiAJbW92CXIzLCAjMAkJCQlAIDFcblwKIAltb3YJaXAsICMwCQkJCUAgMVxuXAogCW1vdglsciwgIzAJCQkJQCAxXG5cCi0xOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZVxuXAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCi0Jc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKLQltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZVxuXAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCi0Jc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKzE6CW1jcglwMTUsIDAsICUwLCBjNywgYzYsIDEJCUAgMSAgIGludmFsaWRhdGUgRCBsaW5lXG5cCisJc3RtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCW1jcglwMTUsIDAsICUwLCBjNywgYzYsIDEJCUAgMSAgIGludmFsaWRhdGUgRCBsaW5lXG5cCisJc3RtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAogCXN1YnMJcjEsIHIxLCAjMQkJCUAgMVxuXAotCWJuZQkxYgkJCQlAIDFcblwKLQlsZHIJcGMsIFtzcF0sICM0IgotCToKLQk6ICJJIiAoUEFHRV9TSVpFIC8gNjQpKTsKKwlibmUJMWIJCQkJQCAxIgorCTogIj1yIiAocHRyKQorCTogIjAiIChrYWRkciksICJJIiAoUEFHRV9TSVpFIC8gNjQpCisJOiAicjEiLCAicjIiLCAicjMiLCAiaXAiLCAibHIiKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiB9CiAKIHN0cnVjdCBjcHVfdXNlcl9mbnMgdjRfbWNfdXNlcl9mbnMgX19pbml0ZGF0YSA9IHsKLQkuY3B1X2NsZWFyX3VzZXJfcGFnZQk9IHY0X21jX2NsZWFyX3VzZXJfcGFnZSwgCi0JLmNwdV9jb3B5X3VzZXJfcGFnZQk9IHY0X21jX2NvcHlfdXNlcl9wYWdlLAorCS5jcHVfY2xlYXJfdXNlcl9oaWdocGFnZSA9IHY0X21jX2NsZWFyX3VzZXJfaGlnaHBhZ2UsCisJLmNwdV9jb3B5X3VzZXJfaGlnaHBhZ2UJPSB2NF9tY19jb3B5X3VzZXJfaGlnaHBhZ2UsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzExNzM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d2IuUworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbGliL2NvcHlwYWdlLlMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgUnVzc2VsbCBLaW5nCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgQVNNIG9wdGltaXNlZCBzdHJpbmcgZnVuY3Rpb25zCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotCi0JLnRleHQKLQkuYWxpZ24JNQotLyoKLSAqIEFSTXY0IG9wdGltaXNlZCBjb3B5X3VzZXJfcGFnZQotICoKLSAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQotICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCi0gKiBEY2FjaGUgYWxpYXNpbmcgaXNzdWUuICBUaGUgd3JpdGVzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB3cml0ZSBidWZmZXIsCi0gKiBhbmQgbWVyZ2VkIGFzIGFwcHJvcHJpYXRlLgotICoKLSAqIE5vdGU6IFdlIHJlbHkgb24gYWxsIEFSTXY0IHByb2Nlc3NvcnMgaW1wbGVtZW50aW5nIHRoZSAiaW52YWxpZGF0ZSBEIGxpbmUiCi0gKiBpbnN0cnVjdGlvbi4gIElmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBseSB0aGlzLCB5b3UgaGF2ZSB0byB3cml0ZSB5b3VyCi0gKiBvd24gY29weV91c2VyX3BhZ2UgdGhhdCBkb2VzIHRoZSByaWdodCB0aGluZy4KLSAqLwotRU5UUlkodjR3Yl9jb3B5X3VzZXJfcGFnZSkKLQlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQCAyCi0JbW92CXIyLCAjUEFHRV9TWi82NAkJCUAgMQotCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0Ci0xOgltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQrMQotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQltY3IJcDE1LCAwLCByMCwgYzcsIGM2LCAxCQlAIDEgICBpbnZhbGlkYXRlIEQgbGluZQotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlzdWJzCXIyLCByMiwgIzEJCQlAIDEKLQlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAotCWxkbW5laWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlibmUJMWIJCQkJQCAxCi0JbWNyCXAxNSwgMCwgcjEsIGM3LCBjMTAsIDQJCUAgMSAgIGRyYWluIFdCCi0JbGRtZmQJIHNwISwge3I0LCBwY30JCQlAIDMKLQotCS5hbGlnbgk1Ci0vKgotICogQVJNdjQgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQotICoKLSAqIFNhbWUgc3RvcnkgYXMgYWJvdmUuCi0gKi8KLUVOVFJZKHY0d2JfY2xlYXJfdXNlcl9wYWdlKQotCXN0cglsciwgW3NwLCAjLTRdIQotCW1vdglyMSwgI1BBR0VfU1ovNjQJCQlAIDEKLQltb3YJcjIsICMwCQkJCUAgMQotCW1vdglyMywgIzAJCQkJQCAxCi0JbW92CWlwLCAjMAkJCQlAIDEKLQltb3YJbHIsICMwCQkJCUAgMQotMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0JbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmUKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0Jc3VicwlyMSwgcjEsICMxCQkJQCAxCi0JYm5lCTFiCQkJCUAgMQotCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIDEgICBkcmFpbiBXQgotCWxkcglwYywgW3NwXSwgIzQKLQotCV9fSU5JVERBVEEKLQotCS50eXBlCXY0d2JfdXNlcl9mbnMsICNvYmplY3QKLUVOVFJZKHY0d2JfdXNlcl9mbnMpCi0JLmxvbmcJdjR3Yl9jbGVhcl91c2VyX3BhZ2UKLQkubG9uZwl2NHdiX2NvcHlfdXNlcl9wYWdlCi0JLnNpemUJdjR3Yl91c2VyX2ZucywgLiAtIHY0d2JfdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d2IuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM5M2RhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3Yi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKgorICogQVJNdjQgb3B0aW1pc2VkIGNvcHlfdXNlcl9oaWdocGFnZQorICoKKyAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQorICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCisgKiBEY2FjaGUgYWxpYXNpbmcgaXNzdWUuICBUaGUgd3JpdGVzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB3cml0ZSBidWZmZXIsCisgKiBhbmQgbWVyZ2VkIGFzIGFwcHJvcHJpYXRlLgorICoKKyAqIE5vdGU6IFdlIHJlbHkgb24gYWxsIEFSTXY0IHByb2Nlc3NvcnMgaW1wbGVtZW50aW5nIHRoZSAiaW52YWxpZGF0ZSBEIGxpbmUiCisgKiBpbnN0cnVjdGlvbi4gIElmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBseSB0aGlzLCB5b3UgaGF2ZSB0byB3cml0ZSB5b3VyCisgKiBvd24gY29weV91c2VyX2hpZ2hwYWdlIHRoYXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkKK3Y0d2JfY29weV91c2VyX3BhZ2Uodm9pZCAqa3RvLCBjb25zdCB2b2lkICprZnJvbSkKK3sKKwlhc20oIlwKKwlzdG1mZAlzcCEsIHtyNCwgbHJ9CQkJQCAyXG5cCisJbW92CXIyLCAlMAkJCQlAIDFcblwKKwlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNFxuXAorMToJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNFxuXAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0KzFcblwKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNFxuXAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNFxuXAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJc3VicwlyMiwgcjIsICMxCQkJQCAxXG5cCisJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDRcblwKKwlsZG1uZWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJYm5lCTFiCQkJCUAgMVxuXAorCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIDEgICBkcmFpbiBXQlxuXAorCWxkbWZkCSBzcCEsIHtyNCwgcGN9CQkJQCAzIgorCToKKwk6ICJJIiAoUEFHRV9TSVpFIC8gNjQpKTsKK30KKwordm9pZCB2NHdiX2NvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCXVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqa3RvLCAqa2Zyb207CisKKwlrdG8gPSBrbWFwX2F0b21pYyh0bywgS01fVVNFUjApOworCWtmcm9tID0ga21hcF9hdG9taWMoZnJvbSwgS01fVVNFUjEpOworCXY0d2JfY29weV91c2VyX3BhZ2Uoa3RvLCBrZnJvbSk7CisJa3VubWFwX2F0b21pYyhrZnJvbSwgS01fVVNFUjEpOworCWt1bm1hcF9hdG9taWMoa3RvLCBLTV9VU0VSMCk7Cit9CisKKy8qCisgKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKgorICogU2FtZSBzdG9yeSBhcyBhYm92ZS4KKyAqLwordm9pZCB2NHdiX2NsZWFyX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqcHRyLCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJYXNtIHZvbGF0aWxlKCJcCisJbW92CXIxLCAlMgkJCQlAIDFcblwKKwltb3YJcjIsICMwCQkJCUAgMVxuXAorCW1vdglyMywgIzAJCQkJQCAxXG5cCisJbW92CWlwLCAjMAkJCQlAIDFcblwKKwltb3YJbHIsICMwCQkJCUAgMVxuXAorMToJbWNyCXAxNSwgMCwgJTAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJbWNyCXAxNSwgMCwgJTAsIGM3LCBjNiwgMQkJQCAxICAgaW52YWxpZGF0ZSBEIGxpbmVcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJc3VicwlyMSwgcjEsICMxCQkJQCAxXG5cCisJYm5lCTFiCQkJCUAgMVxuXAorCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIDEgICBkcmFpbiBXQiIKKwk6ICI9ciIgKHB0cikKKwk6ICIwIiAoa2FkZHIpLCAiSSIgKFBBR0VfU0laRSAvIDY0KQorCTogInIxIiwgInIyIiwgInIzIiwgImlwIiwgImxyIik7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworfQorCitzdHJ1Y3QgY3B1X3VzZXJfZm5zIHY0d2JfdXNlcl9mbnMgX19pbml0ZGF0YSA9IHsKKwkuY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UgPSB2NHdiX2NsZWFyX3VzZXJfaGlnaHBhZ2UsCisJLmNwdV9jb3B5X3VzZXJfaGlnaHBhZ2UJPSB2NHdiX2NvcHlfdXNlcl9oaWdocGFnZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHd0LlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12NHd0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjJhZjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9saWIvY29weXBhZ2UtdjQuUwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBSdXNzZWxsIEtpbmcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBBU00gb3B0aW1pc2VkIHN0cmluZyBmdW5jdGlvbnMKLSAqCi0gKiAgVGhpcyBpcyBmb3IgQ1BVcyB3aXRoIGEgd3JpdGV0aHJvdWdoIGNhY2hlIGFuZCAnZmx1c2ggSUQgY2FjaGUnIGlzCi0gKiAgdGhlIG9ubHkgc3VwcG9ydGVkIGNhY2hlIG9wZXJhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0KLQkudGV4dAotCS5hbGlnbgk1Ci0vKgotICogQVJNdjQgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCi0gKgotICogU2luY2Ugd2UgaGF2ZSB3cml0ZXRocm91Z2ggY2FjaGVzLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0gKiBkaXJ0eSBkYXRhIGluIHRoZSBjYWNoZS4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gZW5zdXJlIHRoYXQKLSAqIHN1YnNlcXVlbnQgcmVhZHMgYXJlIHVwIHRvIGRhdGUuCi0gKi8KLUVOVFJZKHY0d3RfY29weV91c2VyX3BhZ2UpCi0Jc3RtZmQJc3AhLCB7cjQsIGxyfQkJCUAgMgotCW1vdglyMiwgI1BBR0VfU1ovNjQJCQlAIDEKLQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAotMToJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNCsxCi0Jc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0Ci0JbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlzdWJzCXIyLCByMiwgIzEJCQlAIDEKLQlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNAotCWxkbW5laWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQKLQlibmUJMWIJCQkJQCAxCi0JbWNyCXAxNSwgMCwgcjIsIGM3LCBjNywgMAkJQCBmbHVzaCBJRCBjYWNoZQotCWxkbWZkCXNwISwge3I0LCBwY30JCQlAIDMKLQotCS5hbGlnbgk1Ci0vKgotICogQVJNdjQgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQotICoKLSAqIFNhbWUgc3RvcnkgYXMgYWJvdmUuCi0gKi8KLUVOVFJZKHY0d3RfY2xlYXJfdXNlcl9wYWdlKQotCXN0cglsciwgW3NwLCAjLTRdIQotCW1vdglyMSwgI1BBR0VfU1ovNjQJCQlAIDEKLQltb3YJcjIsICMwCQkJCUAgMQotCW1vdglyMywgIzAJCQkJQCAxCi0JbW92CWlwLCAjMAkJCQlAIDEKLQltb3YJbHIsICMwCQkJCUAgMQotMToJc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQlzdG1pYQlyMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNAotCXN0bWlhCXIwISwge3IyLCByMywgaXAsIGxyfQkJQCA0Ci0Jc3RtaWEJcjAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDQKLQlzdWJzCXIxLCByMSwgIzEJCQlAIDEKLQlibmUJMWIJCQkJQCAxCi0JbWNyCXAxNSwgMCwgcjIsIGM3LCBjNywgMAkJQCBmbHVzaCBJRCBjYWNoZQotCWxkcglwYywgW3NwXSwgIzQKLQotCV9fSU5JVERBVEEKLQotCS50eXBlCXY0d3RfdXNlcl9mbnMsICNvYmplY3QKLUVOVFJZKHY0d3RfdXNlcl9mbnMpCi0JLmxvbmcJdjR3dF9jbGVhcl91c2VyX3BhZ2UKLQkubG9uZwl2NHd0X2NvcHlfdXNlcl9wYWdlCi0JLnNpemUJdjR3dF91c2VyX2ZucywgLiAtIHY0d3RfdXNlcl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0d3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjExODhlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjR3dC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgaXMgZm9yIENQVXMgd2l0aCBhIHdyaXRldGhyb3VnaCBjYWNoZSBhbmQgJ2ZsdXNoIElEIGNhY2hlJyBpcworICogIHRoZSBvbmx5IHN1cHBvcnRlZCBjYWNoZSBvcGVyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKgorICogQVJNdjQgb3B0aW1pc2VkIGNvcHlfdXNlcl9oaWdocGFnZQorICoKKyAqIFNpbmNlIHdlIGhhdmUgd3JpdGV0aHJvdWdoIGNhY2hlcywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICogZGlydHkgZGF0YSBpbiB0aGUgY2FjaGUuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGVuc3VyZSB0aGF0CisgKiBzdWJzZXF1ZW50IHJlYWRzIGFyZSB1cCB0byBkYXRlLgorICovCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpCit2NHd0X2NvcHlfdXNlcl9wYWdlKHZvaWQgKmt0bywgY29uc3Qgdm9pZCAqa2Zyb20pCit7CisJYXNtKCJcCisJc3RtZmQJc3AhLCB7cjQsIGxyfQkJCUAgMlxuXAorCW1vdglyMiwgJTAJCQkJQCAxXG5cCisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDRcblwKKzE6CXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDQrMVxuXAorCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJbGRtaWEJcjEhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDRcblwKKwlzdG1pYQlyMCEsIHtyMywgcjQsIGlwLCBscn0JCUAgNFxuXAorCWxkbWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJc3VicwlyMiwgcjIsICMxCQkJQCAxXG5cCisJc3RtaWEJcjAhLCB7cjMsIHI0LCBpcCwgbHJ9CQlAIDRcblwKKwlsZG1uZWlhCXIxISwge3IzLCByNCwgaXAsIGxyfQkJQCA0XG5cCisJYm5lCTFiCQkJCUAgMVxuXAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzcsIDAJCUAgZmx1c2ggSUQgY2FjaGVcblwKKwlsZG1mZAlzcCEsIHtyNCwgcGN9CQkJQCAzIgorCToKKwk6ICJJIiAoUEFHRV9TSVpFIC8gNjQpKTsKK30KKwordm9pZCB2NHd0X2NvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCXVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqa3RvLCAqa2Zyb207CisKKwlrdG8gPSBrbWFwX2F0b21pYyh0bywgS01fVVNFUjApOworCWtmcm9tID0ga21hcF9hdG9taWMoZnJvbSwgS01fVVNFUjEpOworCXY0d3RfY29weV91c2VyX3BhZ2Uoa3RvLCBrZnJvbSk7CisJa3VubWFwX2F0b21pYyhrZnJvbSwgS01fVVNFUjEpOworCWt1bm1hcF9hdG9taWMoa3RvLCBLTV9VU0VSMCk7Cit9CisKKy8qCisgKiBBUk12NCBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKgorICogU2FtZSBzdG9yeSBhcyBhYm92ZS4KKyAqLwordm9pZCB2NHd0X2NsZWFyX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJdm9pZCAqcHRyLCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJYXNtIHZvbGF0aWxlKCJcCisJbW92CXIxLCAlMgkJCQlAIDFcblwKKwltb3YJcjIsICMwCQkJCUAgMVxuXAorCW1vdglyMywgIzAJCQkJQCAxXG5cCisJbW92CWlwLCAjMAkJCQlAIDFcblwKKwltb3YJbHIsICMwCQkJCUAgMVxuXAorMToJc3RtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdG1pYQklMCEsIHtyMiwgcjMsIGlwLCBscn0JCUAgNFxuXAorCXN0bWlhCSUwISwge3IyLCByMywgaXAsIGxyfQkJQCA0XG5cCisJc3RtaWEJJTAhLCB7cjIsIHIzLCBpcCwgbHJ9CQlAIDRcblwKKwlzdWJzCXIxLCByMSwgIzEJCQlAIDFcblwKKwlibmUJMWIJCQkJQCAxXG5cCisJbWNyCXAxNSwgMCwgcjIsIGM3LCBjNywgMAkJQCBmbHVzaCBJRCBjYWNoZSIKKwk6ICI9ciIgKHB0cikKKwk6ICIwIiAoa2FkZHIpLCAiSSIgKFBBR0VfU0laRSAvIDY0KQorCTogInIxIiwgInIyIiwgInIzIiwgImlwIiwgImxyIik7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworfQorCitzdHJ1Y3QgY3B1X3VzZXJfZm5zIHY0d3RfdXNlcl9mbnMgX19pbml0ZGF0YSA9IHsKKwkuY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UgPSB2NHd0X2NsZWFyX3VzZXJfaGlnaHBhZ2UsCisJLmNwdV9jb3B5X3VzZXJfaGlnaHBhZ2UJPSB2NHd0X2NvcHlfdXNlcl9oaWdocGFnZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYwppbmRleCAwZTIxYzA3Li40MTI3YTdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc2htcGFyYW0uaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KQEAgLTMzLDQxICszMyw1NiBAQAogICogQ29weSB0aGUgdXNlciBwYWdlLiAgTm8gYWxpYXNpbmcgdG8gZGVhbCB3aXRoIHNvIHdlIGNhbiBqdXN0CiAgKiBhdHRhY2sgdGhlIGtlcm5lbCdzIGV4aXN0aW5nIG1hcHBpbmcgb2YgdGhlc2UgcGFnZXMuCiAgKi8KLXN0YXRpYyB2b2lkIHY2X2NvcHlfdXNlcl9wYWdlX25vbmFsaWFzaW5nKHZvaWQgKmt0bywgY29uc3Qgdm9pZCAqa2Zyb20sIHVuc2lnbmVkIGxvbmcgdmFkZHIpCitzdGF0aWMgdm9pZCB2Nl9jb3B5X3VzZXJfaGlnaHBhZ2Vfbm9uYWxpYXNpbmcoc3RydWN0IHBhZ2UgKnRvLAorCXN0cnVjdCBwYWdlICpmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQogeworCXZvaWQgKmt0bywgKmtmcm9tOworCisJa2Zyb20gPSBrbWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMCk7CisJa3RvID0ga21hcF9hdG9taWModG8sIEtNX1VTRVIxKTsKIAljb3B5X3BhZ2Uoa3RvLCBrZnJvbSk7CisJa3VubWFwX2F0b21pYyhrdG8sIEtNX1VTRVIxKTsKKwlrdW5tYXBfYXRvbWljKGtmcm9tLCBLTV9VU0VSMCk7CiB9CiAKIC8qCiAgKiBDbGVhciB0aGUgdXNlciBwYWdlLiAgTm8gYWxpYXNpbmcgdG8gZGVhbCB3aXRoIHNvIHdlIGNhbiBqdXN0CiAgKiBhdHRhY2sgdGhlIGtlcm5lbCdzIGV4aXN0aW5nIG1hcHBpbmcgb2YgdGhpcyBwYWdlLgogICovCi1zdGF0aWMgdm9pZCB2Nl9jbGVhcl91c2VyX3BhZ2Vfbm9uYWxpYXNpbmcodm9pZCAqa2FkZHIsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCitzdGF0aWMgdm9pZCB2Nl9jbGVhcl91c2VyX2hpZ2hwYWdlX25vbmFsaWFzaW5nKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyKQogeworCXZvaWQgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCWNsZWFyX3BhZ2Uoa2FkZHIpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIH0KIAogLyoKLSAqIENvcHkgdGhlIHBhZ2UsIHRha2luZyBhY2NvdW50IG9mIHRoZSBjYWNoZSBjb2xvdXIuCisgKiBEaXNjYXJkIGRhdGEgaW4gdGhlIGtlcm5lbCBtYXBwaW5nIGZvciB0aGUgbmV3IHBhZ2UuCisgKiBGSVhNRTogbmVlZHMgdGhpcyBNQ1JSIHRvIGJlIHN1cHBvcnRlZC4KICAqLwotc3RhdGljIHZvaWQgdjZfY29weV91c2VyX3BhZ2VfYWxpYXNpbmcodm9pZCAqa3RvLCBjb25zdCB2b2lkICprZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3N0YXRpYyB2b2lkIGRpc2NhcmRfb2xkX2tlcm5lbF9kYXRhKHZvaWQgKmt0bykKIHsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gQ0FDSEVfQ09MT1VSKHZhZGRyKTsKLQl1bnNpZ25lZCBsb25nIGZyb20sIHRvOwotCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGtmcm9tKTsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmcGFnZS0+ZmxhZ3MpKQotCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VfbWFwcGluZyhwYWdlKSwgcGFnZSk7Ci0KLQkvKgotCSAqIERpc2NhcmQgZGF0YSBpbiB0aGUga2VybmVsIG1hcHBpbmcgZm9yIHRoZSBuZXcgcGFnZS4KLQkgKiBGSVhNRTogbmVlZHMgdGhpcyBNQ1JSIHRvIGJlIHN1cHBvcnRlZC4KLQkgKi8KIAlfX2FzbV9fKCJtY3JyCXAxNSwgMCwgJTEsICUwLCBjNglAIDB4ZWM0MDFmMDYiCiAJICAgOgogCSAgIDogInIiIChrdG8pLAogCSAgICAgInIiICgodW5zaWduZWQgbG9uZylrdG8gKyBQQUdFX1NJWkUgLSBMMV9DQUNIRV9CWVRFUykKIAkgICA6ICJjYyIpOworfQorCisvKgorICogQ29weSB0aGUgcGFnZSwgdGFraW5nIGFjY291bnQgb2YgdGhlIGNhY2hlIGNvbG91ci4KKyAqLworc3RhdGljIHZvaWQgdjZfY29weV91c2VyX2hpZ2hwYWdlX2FsaWFzaW5nKHN0cnVjdCBwYWdlICp0bywKKwlzdHJ1Y3QgcGFnZSAqZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gQ0FDSEVfQ09MT1VSKHZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIGtmcm9tLCBrdG87CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJmZyb20tPmZsYWdzKSkKKwkJX19mbHVzaF9kY2FjaGVfcGFnZShwYWdlX21hcHBpbmcoZnJvbSksIGZyb20pOworCisJLyogRklYTUU6IG5vdCBoaWdobWVtIHNhZmUgKi8KKwlkaXNjYXJkX29sZF9rZXJuZWxfZGF0YShwYWdlX2FkZHJlc3ModG8pKTsKIAogCS8qCiAJICogTm93IGNvcHkgdGhlIHBhZ2UgdXNpbmcgdGhlIHNhbWUgY2FjaGUgY29sb3VyIGFzIHRoZQpAQCAtNzUsMTYgKzkwLDE2IEBACiAJICovCiAJc3Bpbl9sb2NrKCZ2Nl9sb2NrKTsKIAotCXNldF9wdGVfZXh0KFRPUF9QVEUoZnJvbV9hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGtmcm9tKSA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCksIDApOwotCXNldF9wdGVfZXh0KFRPUF9QVEUodG9fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrdG8pID4+IFBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMKSwgMCk7CisJc2V0X3B0ZV9leHQoVE9QX1BURShmcm9tX2FkZHJlc3MpICsgb2Zmc2V0LCBwZm5fcHRlKHBhZ2VfdG9fcGZuKGZyb20pLCBQQUdFX0tFUk5FTCksIDApOworCXNldF9wdGVfZXh0KFRPUF9QVEUodG9fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUocGFnZV90b19wZm4odG8pLCBQQUdFX0tFUk5FTCksIDApOwogCi0JZnJvbSA9IGZyb21fYWRkcmVzcyArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7Ci0JdG8gICA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOworCWtmcm9tID0gZnJvbV9hZGRyZXNzICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKKwlrdG8gICA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwogCi0JZmx1c2hfdGxiX2tlcm5lbF9wYWdlKGZyb20pOwotCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSh0byk7CisJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKGtmcm9tKTsKKwlmbHVzaF90bGJfa2VybmVsX3BhZ2Uoa3RvKTsKIAotCWNvcHlfcGFnZSgodm9pZCAqKXRvLCAodm9pZCAqKWZyb20pOworCWNvcHlfcGFnZSgodm9pZCAqKWt0bywgKHZvaWQgKilrZnJvbSk7CiAKIAlzcGluX3VubG9jaygmdjZfbG9jayk7CiB9CkBAIC05NCwyMCArMTA5LDEzIEBACiAgKiBzbyByZW1hcCB0aGUga2VybmVsIHBhZ2UgaW50byB0aGUgc2FtZSBjYWNoZSBjb2xvdXIgYXMgdGhlIHVzZXIKICAqIHBhZ2UuCiAgKi8KLXN0YXRpYyB2b2lkIHY2X2NsZWFyX3VzZXJfcGFnZV9hbGlhc2luZyh2b2lkICprYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3N0YXRpYyB2b2lkIHY2X2NsZWFyX3VzZXJfaGlnaHBhZ2VfYWxpYXNpbmcoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IENBQ0hFX0NPTE9VUih2YWRkcik7CiAJdW5zaWduZWQgbG9uZyB0byA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwogCi0JLyoKLQkgKiBEaXNjYXJkIGRhdGEgaW4gdGhlIGtlcm5lbCBtYXBwaW5nIGZvciB0aGUgbmV3IHBhZ2UKLQkgKiBGSVhNRTogbmVlZHMgdGhpcyBNQ1JSIHRvIGJlIHN1cHBvcnRlZC4KLQkgKi8KLQlfX2FzbV9fKCJtY3JyCXAxNSwgMCwgJTEsICUwLCBjNglAIDB4ZWM0MDFmMDYiCi0JICAgOgotCSAgIDogInIiIChrYWRkciksCi0JICAgICAiciIgKCh1bnNpZ25lZCBsb25nKWthZGRyICsgUEFHRV9TSVpFIC0gTDFfQ0FDSEVfQllURVMpCi0JICAgOiAiY2MiKTsKKwkvKiBGSVhNRTogbm90IGhpZ2htZW0gc2FmZSAqLworCWRpc2NhcmRfb2xkX2tlcm5lbF9kYXRhKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAKIAkvKgogCSAqIE5vdyBjbGVhciB0aGUgcGFnZSB1c2luZyB0aGUgc2FtZSBjYWNoZSBjb2xvdXIgYXMKQEAgLTExNSw3ICsxMjMsNyBAQAogCSAqLwogCXNwaW5fbG9jaygmdjZfbG9jayk7CiAKLQlzZXRfcHRlX2V4dChUT1BfUFRFKHRvX2FkZHJlc3MpICsgb2Zmc2V0LCBwZm5fcHRlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMKSwgMCk7CisJc2V0X3B0ZV9leHQoVE9QX1BURSh0b19hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgUEFHRV9LRVJORUwpLCAwKTsKIAlmbHVzaF90bGJfa2VybmVsX3BhZ2UodG8pOwogCWNsZWFyX3BhZ2UoKHZvaWQgKil0byk7CiAKQEAgLTEyMywxNSArMTMxLDE1IEBACiB9CiAKIHN0cnVjdCBjcHVfdXNlcl9mbnMgdjZfdXNlcl9mbnMgX19pbml0ZGF0YSA9IHsKLQkuY3B1X2NsZWFyX3VzZXJfcGFnZQk9IHY2X2NsZWFyX3VzZXJfcGFnZV9ub25hbGlhc2luZywKLQkuY3B1X2NvcHlfdXNlcl9wYWdlCT0gdjZfY29weV91c2VyX3BhZ2Vfbm9uYWxpYXNpbmcsCisJLmNwdV9jbGVhcl91c2VyX2hpZ2hwYWdlID0gdjZfY2xlYXJfdXNlcl9oaWdocGFnZV9ub25hbGlhc2luZywKKwkuY3B1X2NvcHlfdXNlcl9oaWdocGFnZQk9IHY2X2NvcHlfdXNlcl9oaWdocGFnZV9ub25hbGlhc2luZywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHY2X3VzZXJwYWdlX2luaXQodm9pZCkKIHsKIAlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7Ci0JCWNwdV91c2VyLmNwdV9jbGVhcl91c2VyX3BhZ2UgPSB2Nl9jbGVhcl91c2VyX3BhZ2VfYWxpYXNpbmc7Ci0JCWNwdV91c2VyLmNwdV9jb3B5X3VzZXJfcGFnZSA9IHY2X2NvcHlfdXNlcl9wYWdlX2FsaWFzaW5nOworCQljcHVfdXNlci5jcHVfY2xlYXJfdXNlcl9oaWdocGFnZSA9IHY2X2NsZWFyX3VzZXJfaGlnaHBhZ2VfYWxpYXNpbmc7CisJCWNwdV91c2VyLmNwdV9jb3B5X3VzZXJfaGlnaHBhZ2UgPSB2Nl9jb3B5X3VzZXJfaGlnaHBhZ2VfYWxpYXNpbmc7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2MzLlMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2MzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmNiNDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjMy5TCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9saWIvY29weXBhZ2UteHNjMy5TCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3JwLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogQWRhcHRlZCBmb3IgM3JkIGdlbiBYU2NhbGUgY29yZSwgbm8gbW9yZSBtaW5pLWRjYWNoZQotICogQXV0aG9yOiBNYXR0IEdpbGJlcnQgKG1hdHRoZXcubS5naWxiZXJ0QGludGVsLmNvbSkKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLQotLyoKLSAqIEdlbmVyYWwgbm90ZToKLSAqICBXZSBkb24ndCByZWFsbHkgd2FudCB3cml0ZS1hbGxvY2F0ZSBjYWNoZSBiZWhhdmlvdXIgZm9yIHRoZXNlIGZ1bmN0aW9ucwotICogIHNpbmNlIHRoYXQgd2lsbCBqdXN0IGVhdCB0aHJvdWdoIDhLIG9mIHRoZSBjYWNoZS4KLSAqLwotCi0JLnRleHQKLQkuYWxpZ24JNQotLyoKLSAqIFhTQzMgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCi0gKiAgcjAgPSBkZXN0aW5hdGlvbgotICogIHIxID0gc291cmNlCi0gKiAgcjIgPSB2aXJ0dWFsIHVzZXIgYWRkcmVzcyBvZiB1bHRpbWF0ZSBkZXN0aW5hdGlvbiBwYWdlCi0gKgotICogVGhlIHNvdXJjZSBwYWdlIG1heSBoYXZlIHNvbWUgY2xlYW4gZW50cmllcyBpbiB0aGUgY2FjaGUgYWxyZWFkeSwgYnV0IHdlCi0gKiBjYW4gc2FmZWx5IGlnbm9yZSB0aGVtIC0gYnJlYWtfY293KCkgd2lsbCBmbHVzaCB0aGVtIG91dCBvZiB0aGUgY2FjaGUKLSAqIGlmIHdlIGV2ZW50dWFsbHkgZW5kIHVwIHVzaW5nIG91ciBjb3BpZWQgcGFnZS4KLSAqCi0gKi8KLUVOVFJZKHhzYzNfbWNfY29weV91c2VyX3BhZ2UpCi0Jc3RtZmQJc3AhLCB7cjQsIHI1LCBscn0KLQltb3YJbHIsICNQQUdFX1NaLzY0LTEKLQotCXBsZAlbcjEsICMwXQotCXBsZAlbcjEsICMzMl0KLTE6CXBsZAlbcjEsICM2NF0KLQlwbGQJW3IxLCAjOTZdCi0KLTI6CWxkcmQJcjIsIFtyMV0sICM4Ci0JbW92CWlwLCByMAotCWxkcmQJcjQsIFtyMV0sICM4Ci0JbWNyCXAxNSwgMCwgaXAsIGM3LCBjNiwgMQkJQCBpbnZhbGlkYXRlCi0Jc3RyZAlyMiwgW3IwXSwgIzgKLQlsZHJkCXIyLCBbcjFdLCAjOAotCXN0cmQJcjQsIFtyMF0sICM4Ci0JbGRyZAlyNCwgW3IxXSwgIzgKLQlzdHJkCXIyLCBbcjBdLCAjOAotCXN0cmQJcjQsIFtyMF0sICM4Ci0JbGRyZAlyMiwgW3IxXSwgIzgKLQltb3YJaXAsIHIwCi0JbGRyZAlyNCwgW3IxXSwgIzgKLQltY3IJcDE1LCAwLCBpcCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUKLQlzdHJkCXIyLCBbcjBdLCAjOAotCWxkcmQJcjIsIFtyMV0sICM4Ci0Jc3VicwlsciwgbHIsICMxCi0Jc3RyZAlyNCwgW3IwXSwgIzgKLQlsZHJkCXI0LCBbcjFdLCAjOAotCXN0cmQJcjIsIFtyMF0sICM4Ci0Jc3RyZAlyNCwgW3IwXSwgIzgKLQliZ3QJMWIKLQliZXEJMmIKLQotCWxkbWZkCXNwISwge3I0LCByNSwgcGN9Ci0KLQkuYWxpZ24JNQotLyoKLSAqIFhTY2FsZSBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCi0gKiAgcjAgPSBkZXN0aW5hdGlvbgotICogIHIxID0gdmlydHVhbCB1c2VyIGFkZHJlc3Mgb2YgdWx0aW1hdGUgZGVzdGluYXRpb24gcGFnZQotICovCi1FTlRSWSh4c2MzX21jX2NsZWFyX3VzZXJfcGFnZSkKLQltb3YJcjEsICNQQUdFX1NaLzMyCi0JbW92CXIyLCAjMAotCW1vdglyMywgIzAKLTE6CW1jcglwMTUsIDAsIHIwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBsaW5lCi0Jc3RyZAlyMiwgW3IwXSwgIzgKLQlzdHJkCXIyLCBbcjBdLCAjOAotCXN0cmQJcjIsIFtyMF0sICM4Ci0Jc3RyZAlyMiwgW3IwXSwgIzgKLQlzdWJzCXIxLCByMSwgIzEKLQlibmUJMWIKLQltb3YJcGMsIGxyCi0KLQlfX0lOSVREQVRBCi0KLQkudHlwZQl4c2MzX21jX3VzZXJfZm5zLCAjb2JqZWN0Ci1FTlRSWSh4c2MzX21jX3VzZXJfZm5zKQotCS5sb25nCXhzYzNfbWNfY2xlYXJfdXNlcl9wYWdlCi0JLmxvbmcJeHNjM19tY19jb3B5X3VzZXJfcGFnZQotCS5zaXplCXhzYzNfbWNfdXNlcl9mbnMsIC4gLSB4c2MzX21jX3VzZXJfZm5zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2MzLmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2MzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhOTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXhzYzMuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2MzLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBZGFwdGVkIGZvciAzcmQgZ2VuIFhTY2FsZSBjb3JlLCBubyBtb3JlIG1pbmktZGNhY2hlCisgKiBBdXRob3I6IE1hdHQgR2lsYmVydCAobWF0dGhldy5tLmdpbGJlcnRAaW50ZWwuY29tKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworLyoKKyAqIEdlbmVyYWwgbm90ZToKKyAqICBXZSBkb24ndCByZWFsbHkgd2FudCB3cml0ZS1hbGxvY2F0ZSBjYWNoZSBiZWhhdmlvdXIgZm9yIHRoZXNlIGZ1bmN0aW9ucworICogIHNpbmNlIHRoYXQgd2lsbCBqdXN0IGVhdCB0aHJvdWdoIDhLIG9mIHRoZSBjYWNoZS4KKyAqLworCisvKgorICogWFNDMyBvcHRpbWlzZWQgY29weV91c2VyX2hpZ2hwYWdlCisgKiAgcjAgPSBkZXN0aW5hdGlvbgorICogIHIxID0gc291cmNlCisgKgorICogVGhlIHNvdXJjZSBwYWdlIG1heSBoYXZlIHNvbWUgY2xlYW4gZW50cmllcyBpbiB0aGUgY2FjaGUgYWxyZWFkeSwgYnV0IHdlCisgKiBjYW4gc2FmZWx5IGlnbm9yZSB0aGVtIC0gYnJlYWtfY293KCkgd2lsbCBmbHVzaCB0aGVtIG91dCBvZiB0aGUgY2FjaGUKKyAqIGlmIHdlIGV2ZW50dWFsbHkgZW5kIHVwIHVzaW5nIG91ciBjb3BpZWQgcGFnZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkKK3hzYzNfbWNfY29weV91c2VyX3BhZ2Uodm9pZCAqa3RvLCBjb25zdCB2b2lkICprZnJvbSkKK3sKKwlhc20oIlwKKwlzdG1mZAlzcCEsIHtyNCwgcjUsIGxyfQkJXG5cCisJbW92CWxyLCAlMAkJCQlcblwKKwkJCQkJCVxuXAorCXBsZAlbcjEsICMwXQkJCVxuXAorCXBsZAlbcjEsICMzMl0JCQlcblwKKzE6CXBsZAlbcjEsICM2NF0JCQlcblwKKwlwbGQJW3IxLCAjOTZdCQkJXG5cCisJCQkJCQlcblwKKzI6CWxkcmQJcjIsIFtyMV0sICM4CQkJXG5cCisJbW92CWlwLCByMAkJCQlcblwKKwlsZHJkCXI0LCBbcjFdLCAjOAkJCVxuXAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZVxuXAorCXN0cmQJcjIsIFtyMF0sICM4CQkJXG5cCisJbGRyZAlyMiwgW3IxXSwgIzgJCQlcblwKKwlzdHJkCXI0LCBbcjBdLCAjOAkJCVxuXAorCWxkcmQJcjQsIFtyMV0sICM4CQkJXG5cCisJc3RyZAlyMiwgW3IwXSwgIzgJCQlcblwKKwlzdHJkCXI0LCBbcjBdLCAjOAkJCVxuXAorCWxkcmQJcjIsIFtyMV0sICM4CQkJXG5cCisJbW92CWlwLCByMAkJCQlcblwKKwlsZHJkCXI0LCBbcjFdLCAjOAkJCVxuXAorCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZVxuXAorCXN0cmQJcjIsIFtyMF0sICM4CQkJXG5cCisJbGRyZAlyMiwgW3IxXSwgIzgJCQlcblwKKwlzdWJzCWxyLCBsciwgIzEJCQlcblwKKwlzdHJkCXI0LCBbcjBdLCAjOAkJCVxuXAorCWxkcmQJcjQsIFtyMV0sICM4CQkJXG5cCisJc3RyZAlyMiwgW3IwXSwgIzgJCQlcblwKKwlzdHJkCXI0LCBbcjBdLCAjOAkJCVxuXAorCWJndAkxYgkJCQlcblwKKwliZXEJMmIJCQkJXG5cCisJCQkJCQlcblwKKwlsZG1mZAlzcCEsIHtyNCwgcjUsIHBjfSIKKwk6CisJOiAiSSIgKFBBR0VfU0laRSAvIDY0IC0gMSkpOworfQorCit2b2lkIHhzYzNfbWNfY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IHBhZ2UgKmZyb20sCisJdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl2b2lkICprdG8sICprZnJvbTsKKworCWt0byA9IGttYXBfYXRvbWljKHRvLCBLTV9VU0VSMCk7CisJa2Zyb20gPSBrbWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMSk7CisJeHNjM19tY19jb3B5X3VzZXJfcGFnZShrdG8sIGtmcm9tKTsKKwlrdW5tYXBfYXRvbWljKGtmcm9tLCBLTV9VU0VSMSk7CisJa3VubWFwX2F0b21pYyhrdG8sIEtNX1VTRVIwKTsKK30KKworLyoKKyAqIFhTY2FsZSBvcHRpbWlzZWQgY2xlYXJfdXNlcl9wYWdlCisgKiAgcjAgPSBkZXN0aW5hdGlvbgorICogIHIxID0gdmlydHVhbCB1c2VyIGFkZHJlc3Mgb2YgdWx0aW1hdGUgZGVzdGluYXRpb24gcGFnZQorICovCit2b2lkIHhzYzNfbWNfY2xlYXJfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwl2b2lkICpwdHIsICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlhc20gdm9sYXRpbGUgKCJcCisJbW92CXIxLCAlMgkJCQlcblwKKwltb3YJcjIsICMwCQkJCVxuXAorCW1vdglyMywgIzAJCQkJXG5cCisxOgltY3IJcDE1LCAwLCAlMCwgYzcsIGM2LCAxCQlAIGludmFsaWRhdGUgbGluZVxuXAorCXN0cmQJcjIsIFslMF0sICM4CQkJXG5cCisJc3RyZAlyMiwgWyUwXSwgIzgJCQlcblwKKwlzdHJkCXIyLCBbJTBdLCAjOAkJCVxuXAorCXN0cmQJcjIsIFslMF0sICM4CQkJXG5cCisJc3VicwlyMSwgcjEsICMxCQkJXG5cCisJYm5lCTFiIgorCTogIj1yIiAocHRyKQorCTogIjAiIChrYWRkciksICJJIiAoUEFHRV9TSVpFIC8gMzIpCisJOiAicjEiLCAicjIiLCAicjMiKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Cit9CisKK3N0cnVjdCBjcHVfdXNlcl9mbnMgeHNjM19tY191c2VyX2ZucyBfX2luaXRkYXRhID0geworCS5jcHVfY2xlYXJfdXNlcl9oaWdocGFnZSA9IHhzYzNfbWNfY2xlYXJfdXNlcl9oaWdocGFnZSwKKwkuY3B1X2NvcHlfdXNlcl9oaWdocGFnZQk9IHhzYzNfbWNfY29weV91c2VyX2hpZ2hwYWdlLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXhzY2FsZS5jIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKaW5kZXggYmFkNDkzMy4uZDE4ZjIzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKQEAgLTE1LDggKzE1LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMzUsNyArMzUsNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhtaW5pY2FjaGVfbG9jayk7CiAKIC8qCi0gKiBYU2NhbGUgbWluaS1kY2FjaGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9wYWdlCisgKiBYU2NhbGUgbWluaS1kY2FjaGUgb3B0aW1pc2VkIGNvcHlfdXNlcl9oaWdocGFnZQogICoKICAqIFdlIGZsdXNoIHRoZSBkZXN0aW5hdGlvbiBjYWNoZSBsaW5lcyBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUgZGF0YSBpbnRvIHRoZQogICogY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgU2luY2UgdGhlIERjYWNoZSBpcyByZWFkLWFsbG9jYXRlLCB0aGlzIHJlbW92ZXMgdGhlCkBAIC05MCw0OCArOTAsNTMgQEAKIAk6ICJyIiAoZnJvbSksICJyIiAodG8pLCAiSSIgKFBBR0VfU0laRSAvIDY0IC0gMSkpOwogfQogCi12b2lkIHhzY2FsZV9tY19jb3B5X3VzZXJfcGFnZSh2b2lkICprdG8sIGNvbnN0IHZvaWQgKmtmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQordm9pZCB4c2NhbGVfbWNfY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IHBhZ2UgKmZyb20sCisJdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShrZnJvbSk7CisJdm9pZCAqa3RvID0ga21hcF9hdG9taWModG8sIEtNX1VTRVIxKTsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmcGFnZS0+ZmxhZ3MpKQotCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VfbWFwcGluZyhwYWdlKSwgcGFnZSk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQR19kY2FjaGVfZGlydHksICZmcm9tLT5mbGFncykpCisJCV9fZmx1c2hfZGNhY2hlX3BhZ2UocGFnZV9tYXBwaW5nKGZyb20pLCBmcm9tKTsKIAogCXNwaW5fbG9jaygmbWluaWNhY2hlX2xvY2spOwogCi0Jc2V0X3B0ZV9leHQoVE9QX1BURShDT1BZUEFHRV9NSU5JQ0FDSEUpLCBwZm5fcHRlKF9fcGEoa2Zyb20pID4+IFBBR0VfU0hJRlQsIG1pbmljYWNoZV9wZ3Byb3QpLCAwKTsKKwlzZXRfcHRlX2V4dChUT1BfUFRFKENPUFlQQUdFX01JTklDQUNIRSksIHBmbl9wdGUocGFnZV90b19wZm4oZnJvbSksIG1pbmljYWNoZV9wZ3Byb3QpLCAwKTsKIAlmbHVzaF90bGJfa2VybmVsX3BhZ2UoQ09QWVBBR0VfTUlOSUNBQ0hFKTsKIAogCW1jX2NvcHlfdXNlcl9wYWdlKCh2b2lkICopQ09QWVBBR0VfTUlOSUNBQ0hFLCBrdG8pOwogCiAJc3Bpbl91bmxvY2soJm1pbmljYWNoZV9sb2NrKTsKKworCWt1bm1hcF9hdG9taWMoa3RvLCBLTV9VU0VSMSk7CiB9CiAKIC8qCiAgKiBYU2NhbGUgb3B0aW1pc2VkIGNsZWFyX3VzZXJfcGFnZQogICovCi12b2lkIF9fYXR0cmlidXRlX18oKG5ha2VkKSkKLXhzY2FsZV9tY19jbGVhcl91c2VyX3BhZ2Uodm9pZCAqa2FkZHIsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit2b2lkCit4c2NhbGVfbWNfY2xlYXJfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKKwl2b2lkICpwdHIsICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAlhc20gdm9sYXRpbGUoCi0JIm1vdglyMSwgJTAJCQkJXG5cCisJIm1vdglyMSwgJTIJCQkJXG5cCiAJbW92CXIyLCAjMAkJCQlcblwKIAltb3YJcjMsICMwCQkJCVxuXAotMToJbW92CWlwLCByMAkJCQlcblwKLQlzdHJkCXIyLCBbcjBdLCAjOAkJCVxuXAotCXN0cmQJcjIsIFtyMF0sICM4CQkJXG5cCi0Jc3RyZAlyMiwgW3IwXSwgIzgJCQlcblwKLQlzdHJkCXIyLCBbcjBdLCAjOAkJCVxuXAorMToJbW92CWlwLCAlMAkJCQlcblwKKwlzdHJkCXIyLCBbJTBdLCAjOAkJCVxuXAorCXN0cmQJcjIsIFslMF0sICM4CQkJXG5cCisJc3RyZAlyMiwgWyUwXSwgIzgJCQlcblwKKwlzdHJkCXIyLCBbJTBdLCAjOAkJCVxuXAogCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgbGluZVxuXAogCXN1YnMJcjEsIHIxLCAjMQkJCVxuXAogCW1jcglwMTUsIDAsIGlwLCBjNywgYzYsIDEJCUAgaW52YWxpZGF0ZSBEIGxpbmVcblwKLQlibmUJMWIJCQkJXG5cCi0JbW92CXBjLCBsciIKLQk6Ci0JOiAiSSIgKFBBR0VfU0laRSAvIDMyKSk7CisJYm5lCTFiIgorCTogIj1yIiAocHRyKQorCTogIjAiIChrYWRkciksICJJIiAoUEFHRV9TSVpFIC8gMzIpCisJOiAicjEiLCAicjIiLCAicjMiLCAiaXAiKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiB9CiAKIHN0cnVjdCBjcHVfdXNlcl9mbnMgeHNjYWxlX21jX3VzZXJfZm5zIF9faW5pdGRhdGEgPSB7Ci0JLmNwdV9jbGVhcl91c2VyX3BhZ2UJPSB4c2NhbGVfbWNfY2xlYXJfdXNlcl9wYWdlLCAKLQkuY3B1X2NvcHlfdXNlcl9wYWdlCT0geHNjYWxlX21jX2NvcHlfdXNlcl9wYWdlLAorCS5jcHVfY2xlYXJfdXNlcl9oaWdocGFnZSA9IHhzY2FsZV9tY19jbGVhcl91c2VyX2hpZ2hwYWdlLAorCS5jcHVfY29weV91c2VyX2hpZ2hwYWdlCT0geHNjYWxlX21jX2NvcHlfdXNlcl9oaWdocGFnZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC5jIGIvYXJjaC9hcm0vbW0vZmF1bHQuYwppbmRleCAyMmM5NTMwLi4wNDU1NTU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTg0LDEzICs4NSwxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAotI2lmbmRlZiBDT05GSUdfSElHSE1FTQogCQkvKiBXZSBtdXN0IG5vdCBtYXAgdGhpcyBpZiB3ZSBoYXZlIGhpZ2htZW0gZW5hYmxlZCAqLworCQlpZiAoUGFnZUhpZ2hNZW0ocGZuX3RvX3BhZ2UocG1kX3ZhbCgqcG1kKSA+PiBQQUdFX1NISUZUKSkpCisJCQlicmVhazsKKwogCQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOwogCQlwcmludGsoIiwgKnB0ZT0lMDhseCIsIHB0ZV92YWwoKnB0ZSkpOwogCQlwcmludGsoIiwgKnBwdGU9JTA4bHgiLCBwdGVfdmFsKHB0ZVstUFRSU19QRVJfUFRFXSkpOwogCQlwdGVfdW5tYXAocHRlKTsKLSNlbmRpZgogCX0gd2hpbGUoMCk7CiAKIAlwcmludGsoIlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pbml0LmMgYi9hcmNoL2FybS9tbS9pbml0LmMKaW5kZXggODJjNGI0Mi4uMzRkZjRkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtL21tL2luaXQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CkBAIC02NCwxMCArNjUsMTEgQEAKIF9fdGFndGFibGUoQVRBR19JTklUUkQyLCBwYXJzZV90YWdfaW5pdHJkMik7CiAKIC8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gcGFzcyBtZW1vcnkgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gcGFnaW5nX2luaXQKLSAqIHRvIG1lbV9pbml0LCBhbmQgYnkgc2hvd19tZW0oKSB0byBza2lwIGhvbGVzIGluIHRoZSBtZW1vcnkgbWFwLgorICogVGhpcyBrZWVwcyBtZW1vcnkgY29uZmlndXJhdGlvbiBkYXRhIHVzZWQgYnkgYSBjb3VwbGUgbWVtb3J5CisgKiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMsIGFzIHdlbGwgYXMgc2hvd19tZW0oKSBmb3IgdGhlIHNraXBwaW5nCisgKiBvZiBob2xlcyBpbiB0aGUgbWVtb3J5IG1hcC4gIEl0IGlzIHBvcHVsYXRlZCBieSBhcm1fYWRkX21lbW9yeSgpLgogICovCi1zdGF0aWMgc3RydWN0IG1lbWluZm8gbWVtaW5mbyA9IHsgMCwgfTsKK3N0cnVjdCBtZW1pbmZvIG1lbWluZm87CiAKIHZvaWQgc2hvd19tZW0odm9pZCkKIHsKQEAgLTEyOCw3ICsxMzAsNyBAQAogewogCXVuc2lnbmVkIGludCBzdGFydF9wZm4sIGksIGJvb3RtYXBfcGZuOwogCi0Jc3RhcnRfcGZuICAgPSBQQUdFX0FMSUdOKF9fcGEoJl9lbmQpKSA+PiBQQUdFX1NISUZUOworCXN0YXJ0X3BmbiAgID0gUEFHRV9BTElHTihfX3BhKF9lbmQpKSA+PiBQQUdFX1NISUZUOwogCWJvb3RtYXBfcGZuID0gMDsKIAogCWZvcl9lYWNoX25vZGViYW5rKGksIG1pLCBub2RlKSB7CkBAIC0zMzEsMTMgKzMzMywxMiBAQAogCWZyZWVfYXJlYV9pbml0X25vZGUobm9kZSwgem9uZV9zaXplLCBzdGFydF9wZm4sIHpob2xlX3NpemUpOwogfQogCi12b2lkIF9faW5pdCBib290bWVtX2luaXQoc3RydWN0IG1lbWluZm8gKm1pKQordm9pZCBfX2luaXQgYm9vdG1lbV9pbml0KHZvaWQpCiB7CisJc3RydWN0IG1lbWluZm8gKm1pID0gJm1lbWluZm87CiAJdW5zaWduZWQgbG9uZyBtZW1lbmRfcGZuID0gMDsKIAlpbnQgbm9kZSwgaW5pdHJkX25vZGU7CiAKLQltZW1jcHkoJm1lbWluZm8sIG1pLCBzaXplb2YobWVtaW5mbykpOwotCiAJLyoKIAkgKiBMb2NhdGUgd2hpY2ggbm9kZSBjb250YWlucyB0aGUgcmFtZGlzayBpbWFnZSwgaWYgYW55LgogCSAqLwpAQCAtMzk0LDIwICszOTUsMjIgQEAKIAltYXhfcGZuID0gbWF4X2xvd19wZm4gPSBtZW1lbmRfcGZuIC0gUEhZU19QRk5fT0ZGU0VUOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIGNoYXIgKnMpCitzdGF0aWMgaW5saW5lIGludCBmcmVlX2FyZWEodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgZW5kLCBjaGFyICpzKQogewotCXVuc2lnbmVkIGludCBzaXplID0gKGVuZCAtIGFkZHIpID4+IDEwOworCXVuc2lnbmVkIGludCBwYWdlcyA9IDAsIHNpemUgPSAoZW5kIC0gcGZuKSA8PCAoUEFHRV9TSElGVCAtIDEwKTsKIAotCWZvciAoOyBhZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShhZGRyKTsKKwlmb3IgKDsgcGZuIDwgZW5kOyBwZm4rKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwogCQlpbml0X3BhZ2VfY291bnQocGFnZSk7Ci0JCWZyZWVfcGFnZShhZGRyKTsKLQkJdG90YWxyYW1fcGFnZXMrKzsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXBhZ2VzKys7CiAJfQogCiAJaWYgKHNpemUgJiYgcykKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyAlcyBtZW1vcnk6ICVkS1xuIiwgcywgc2l6ZSk7CisKKwlyZXR1cm4gcGFnZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDc4LDEzICs0ODEsOSBAQAogICovCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjb2RlcGFnZXMsIGRhdGFwYWdlcywgaW5pdHBhZ2VzOworCXVuc2lnbmVkIGludCBjb2Rlc2l6ZSwgZGF0YXNpemUsIGluaXRzaXplOwogCWludCBpLCBub2RlOwogCi0JY29kZXBhZ2VzID0gJl9ldGV4dCAtICZfdGV4dDsKLQlkYXRhcGFnZXMgPSAmX2VuZCAtICZfX2RhdGFfc3RhcnQ7Ci0JaW5pdHBhZ2VzID0gJl9faW5pdF9lbmQgLSAmX19pbml0X2JlZ2luOwotCiAjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KIAltYXhfbWFwbnIgICA9IHZpcnRfdG9fcGFnZShoaWdoX21lbW9yeSkgLSBtZW1fbWFwOwogI2VuZGlmCkBAIC01MDEsNyArNTAwLDggQEAKIAogI2lmZGVmIENPTkZJR19TQTExMTEKIAkvKiBub3cgdGhhdCBvdXIgRE1BIG1lbW9yeSBpcyBhY3R1YWxseSBzbyBkZXNpZ25hdGVkLCB3ZSBjYW4gZnJlZSBpdCAqLwotCWZyZWVfYXJlYShQQUdFX09GRlNFVCwgKHVuc2lnbmVkIGxvbmcpc3dhcHBlcl9wZ19kaXIsIE5VTEwpOworCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYXJlYShQSFlTX1BGTl9PRkZTRVQsCisJCQkJICAgIF9fcGh5c190b19wZm4oX19wYShzd2FwcGVyX3BnX2RpcikpLCBOVUxMKTsKICNlbmRpZgogCiAJLyoKQEAgLTUwOSwxOCArNTA5LDIxIEBACiAJICogcmVhbCBudW1iZXIgb2YgcGFnZXMgd2UgaGF2ZSBpbiB0aGlzIHN5c3RlbQogCSAqLwogCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeToiKTsKLQogCW51bV9waHlzcGFnZXMgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBtZW1pbmZvLm5yX2JhbmtzOyBpKyspIHsKIAkJbnVtX3BoeXNwYWdlcyArPSBiYW5rX3Bmbl9zaXplKCZtZW1pbmZvLmJhbmtbaV0pOwogCQlwcmludGsoIiAlbGRNQiIsIGJhbmtfcGh5c19zaXplKCZtZW1pbmZvLmJhbmtbaV0pID4+IDIwKTsKIAl9Ci0KIAlwcmludGsoIiA9ICVsdU1CIHRvdGFsXG4iLCBudW1fcGh5c3BhZ2VzID4+ICgyMCAtIFBBR0VfU0hJRlQpKTsKKworCWNvZGVzaXplID0gX2V0ZXh0IC0gX3RleHQ7CisJZGF0YXNpemUgPSBfZW5kIC0gX2RhdGE7CisJaW5pdHNpemUgPSBfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luOworCiAJcHJpbnRrKEtFUk5fTk9USUNFICJNZW1vcnk6ICVsdUtCIGF2YWlsYWJsZSAoJWRLIGNvZGUsICIKIAkJIiVkSyBkYXRhLCAlZEsgaW5pdClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAotCQljb2RlcGFnZXMgPj4gMTAsIGRhdGFwYWdlcyA+PiAxMCwgaW5pdHBhZ2VzID4+IDEwKTsKKwkJY29kZXNpemUgPj4gMTAsIGRhdGFzaXplID4+IDEwLCBpbml0c2l6ZSA+PiAxMCk7CiAKIAlpZiAoUEFHRV9TSVpFID49IDE2Mzg0ICYmIG51bV9waHlzcGFnZXMgPD0gMTI4KSB7CiAJCWV4dGVybiBpbnQgc3lzY3RsX292ZXJjb21taXRfbWVtb3J5OwpAQCAtNTM1LDExICs1MzgsMTAgQEAKIAogdm9pZCBmcmVlX2luaXRtZW0odm9pZCkKIHsKLQlpZiAoIW1hY2hpbmVfaXNfaW50ZWdyYXRvcigpICYmICFtYWNoaW5lX2lzX2NpbnRlZ3JhdG9yKCkpIHsKLQkJZnJlZV9hcmVhKCh1bnNpZ25lZCBsb25nKSgmX19pbml0X2JlZ2luKSwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKSwKLQkJCSAgImluaXQiKTsKLQl9CisJaWYgKCFtYWNoaW5lX2lzX2ludGVncmF0b3IoKSAmJiAhbWFjaGluZV9pc19jaW50ZWdyYXRvcigpKQorCQl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FyZWEoX19waHlzX3RvX3BmbihfX3BhKF9faW5pdF9iZWdpbikpLAorCQkJCQkgICAgX19waHlzX3RvX3BmbihfX3BhKF9faW5pdF9lbmQpKSwKKwkJCQkJICAgICJpbml0Iik7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKQEAgLTU0OSw3ICs1NTEsOSBAQAogdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJaWYgKCFrZWVwX2luaXRyZCkKLQkJZnJlZV9hcmVhKHN0YXJ0LCBlbmQsICJpbml0cmQiKTsKKwkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hcmVhKF9fcGh5c190b19wZm4oX19wYShzdGFydCkpLAorCQkJCQkgICAgX19waHlzX3RvX3BmbihfX3BhKGVuZCkpLAorCQkJCQkgICAgImluaXRyZCIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBrZWVwaW5pdHJkX3NldHVwKGNoYXIgKl9fdW51c2VkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW0uaCBiL2FyY2gvYXJtL21tL21tLmgKaW5kZXggNWQ5ZjUzOS4uOTViYmUxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW0uaAorKysgYi9hcmNoL2FybS9tbS9tbS5oCkBAIC0zMiw3ICszMiw1IEBACiBzdHJ1Y3QgcGdsaXN0X2RhdGE7CiAKIHZvaWQgX19pbml0IGNyZWF0ZV9tYXBwaW5nKHN0cnVjdCBtYXBfZGVzYyAqbWQpOwotdm9pZCBfX2luaXQgYm9vdG1lbV9pbml0KHN0cnVjdCBtZW1pbmZvICptaSk7Cit2b2lkIF9faW5pdCBib290bWVtX2luaXQodm9pZCk7CiB2b2lkIHJlc2VydmVfbm9kZV96ZXJvKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpOwotCi1leHRlcm4gdm9pZCBfdGV4dCwgX3N0ZXh0LCBfZXRleHQsIF9fZGF0YV9zdGFydCwgX2VuZCwgX19pbml0X2JlZ2luLCBfX2luaXRfZW5kOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwppbmRleCA3ZjM2YzgyLi45YjM2YzVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbXUuYworKysgYi9hcmNoL2FybS9tbS9tbXUuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KQEAgLTY0Niw2MSArNjQ3LDc5IEBACiAJCQkidm1hbGxvYyBhcmVhIHRvbyBzbWFsbCwgbGltaXRpbmcgdG8gJWx1TUJcbiIsCiAJCQl2bWFsbG9jX3Jlc2VydmUgPj4gMjApOwogCX0KKworCWlmICh2bWFsbG9jX3Jlc2VydmUgPiBWTUFMTE9DX0VORCAtIChQQUdFX09GRlNFVCArIFNaXzMyTSkpIHsKKwkJdm1hbGxvY19yZXNlcnZlID0gVk1BTExPQ19FTkQgLSAoUEFHRV9PRkZTRVQgKyBTWl8zMk0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkidm1hbGxvYyBhcmVhIGlzIHRvbyBiaWcsIGxpbWl0aW5nIHRvICVsdU1CXG4iLAorCQkJdm1hbGxvY19yZXNlcnZlID4+IDIwKTsKKwl9CiB9CiBfX2Vhcmx5X3BhcmFtKCJ2bWFsbG9jPSIsIGVhcmx5X3ZtYWxsb2MpOwogCiAjZGVmaW5lIFZNQUxMT0NfTUlOCSh2b2lkICopKFZNQUxMT0NfRU5EIC0gdm1hbGxvY19yZXNlcnZlKQogCi1zdGF0aWMgaW50IF9faW5pdCBjaGVja19tZW1iYW5rX3ZhbGlkKHN0cnVjdCBtZW1iYW5rICptYikKLXsKLQkvKgotCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBtZW1vcnkgcmVnaW9uIGhhcyBub24temVybyBzaXplIG9yCi0JICogaW52YWxpZCBub2RlIG51bWJlci4KLQkgKi8KLQlpZiAobWItPnNpemUgPT0gMCB8fCBtYi0+bm9kZSA+PSBNQVhfTlVNTk9ERVMpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IHJlZ2lvbiB3b3VsZCBlbnRpcmVseSBvdmVybGFwCi0JICogdGhlIHZtYWxsb2MgYXJlYS4KLQkgKi8KLQlpZiAocGh5c190b192aXJ0KG1iLT5zdGFydCkgPj0gVk1BTExPQ19NSU4pIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJJZ25vcmluZyBSQU0gYXQgJS44bHgtJS44bHggIgotCQkJIih2bWFsbG9jIHJlZ2lvbiBvdmVybGFwKS5cbiIsCi0JCQltYi0+c3RhcnQsIG1iLT5zdGFydCArIG1iLT5zaXplIC0gMSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQ2hlY2sgd2hldGhlciB0aGlzIG1lbW9yeSByZWdpb24gd291bGQgcGFydGlhbGx5IG92ZXJsYXAKLQkgKiB0aGUgdm1hbGxvYyBhcmVhLgotCSAqLwotCWlmIChwaHlzX3RvX3ZpcnQobWItPnN0YXJ0ICsgbWItPnNpemUpIDwgcGh5c190b192aXJ0KG1iLT5zdGFydCkgfHwKLQkgICAgcGh5c190b192aXJ0KG1iLT5zdGFydCArIG1iLT5zaXplKSA+IFZNQUxMT0NfTUlOKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmV3c2l6ZSA9IFZNQUxMT0NfTUlOIC0gcGh5c190b192aXJ0KG1iLT5zdGFydCk7Ci0KLQkJcHJpbnRrKEtFUk5fTk9USUNFICJUcnVuY2F0aW5nIFJBTSBhdCAlLjhseC0lLjhseCAiCi0JCQkidG8gLSUuOGx4ICh2bWFsbG9jIHJlZ2lvbiBvdmVybGFwKS5cbiIsCi0JCQltYi0+c3RhcnQsIG1iLT5zdGFydCArIG1iLT5zaXplIC0gMSwKLQkJCW1iLT5zdGFydCArIG5ld3NpemUgLSAxKTsKLQkJbWItPnNpemUgPSBuZXdzaXplOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FuaXR5X2NoZWNrX21lbWluZm8oc3RydWN0IG1lbWluZm8gKm1pKQorc3RhdGljIHZvaWQgX19pbml0IHNhbml0eV9jaGVja19tZW1pbmZvKHZvaWQpCiB7CiAJaW50IGksIGo7CiAKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7Ci0JCWlmIChjaGVja19tZW1iYW5rX3ZhbGlkKCZtaS0+YmFua1tpXSkpCi0JCQltaS0+YmFua1tqKytdID0gbWktPmJhbmtbaV07CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBtZW1pbmZvLm5yX2JhbmtzOyBpKyspIHsKKwkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWVtaW5mby5iYW5rW2pdOworCQkqYmFuayA9IG1lbWluZm8uYmFua1tpXTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCS8qCisJCSAqIFNwbGl0IHRob3NlIG1lbW9yeSBiYW5rcyB3aGljaCBhcmUgcGFydGlhbGx5IG92ZXJsYXBwaW5nCisJCSAqIHRoZSB2bWFsbG9jIGFyZWEgZ3JlYXRseSBzaW1wbGlmeWluZyB0aGluZ3MgbGF0ZXIuCisJCSAqLworCQlpZiAoX192YShiYW5rLT5zdGFydCkgPCBWTUFMTE9DX01JTiAmJgorCQkgICAgYmFuay0+c2l6ZSA+IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCkpIHsKKwkJCWlmIChtZW1pbmZvLm5yX2JhbmtzID49IE5SX0JBTktTKSB7CisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlJfQkFOS1MgdG9vIGxvdywgIgorCQkJCQkJICJpZ25vcmluZyBoaWdoIG1lbW9yeVxuIik7CisJCQl9IGVsc2UgeworCQkJCW1lbW1vdmUoYmFuayArIDEsIGJhbmssCisJCQkJCShtZW1pbmZvLm5yX2JhbmtzIC0gaSkgKiBzaXplb2YoKmJhbmspKTsKKwkJCQltZW1pbmZvLm5yX2JhbmtzKys7CisJCQkJaSsrOworCQkJCWJhbmtbMV0uc2l6ZSAtPSBWTUFMTE9DX01JTiAtIF9fdmEoYmFuay0+c3RhcnQpOworCQkJCWJhbmtbMV0uc3RhcnQgPSBfX3BhKFZNQUxMT0NfTUlOIC0gMSkgKyAxOworCQkJCWorKzsKKwkJCX0KKwkJCWJhbmstPnNpemUgPSBWTUFMTE9DX01JTiAtIF9fdmEoYmFuay0+c3RhcnQpOworCQl9CisjZWxzZQorCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IGJhbmsgd291bGQgZW50aXJlbHkgb3ZlcmxhcAorCQkgKiB0aGUgdm1hbGxvYyBhcmVhLgorCQkgKi8KKwkJaWYgKF9fdmEoYmFuay0+c3RhcnQpID49IFZNQUxMT0NfTUlOKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIklnbm9yaW5nIFJBTSBhdCAlLjhseC0lLjhseCAiCisJCQkgICAgICAgIih2bWFsbG9jIHJlZ2lvbiBvdmVybGFwKS5cbiIsCisJCQkgICAgICAgYmFuay0+c3RhcnQsIGJhbmstPnN0YXJ0ICsgYmFuay0+c2l6ZSAtIDEpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IGJhbmsgd291bGQgcGFydGlhbGx5IG92ZXJsYXAKKwkJICogdGhlIHZtYWxsb2MgYXJlYS4KKwkJICovCisJCWlmIChfX3ZhKGJhbmstPnN0YXJ0ICsgYmFuay0+c2l6ZSkgPiBWTUFMTE9DX01JTiB8fAorCQkgICAgX192YShiYW5rLT5zdGFydCArIGJhbmstPnNpemUpIDwgX192YShiYW5rLT5zdGFydCkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbmV3c2l6ZSA9IFZNQUxMT0NfTUlOIC0gX192YShiYW5rLT5zdGFydCk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlRydW5jYXRpbmcgUkFNIGF0ICUuOGx4LSUuOGx4ICIKKwkJCSAgICAgICAidG8gLSUuOGx4ICh2bWFsbG9jIHJlZ2lvbiBvdmVybGFwKS5cbiIsCisJCQkgICAgICAgYmFuay0+c3RhcnQsIGJhbmstPnN0YXJ0ICsgYmFuay0+c2l6ZSAtIDEsCisJCQkgICAgICAgYmFuay0+c3RhcnQgKyBuZXdzaXplIC0gMSk7CisJCQliYW5rLT5zaXplID0gbmV3c2l6ZTsKKwkJfQorI2VuZGlmCisJCWorKzsKIAl9Ci0JbWktPm5yX2JhbmtzID0gajsKKwltZW1pbmZvLm5yX2JhbmtzID0gajsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfcGFnZV90YWJsZShzdHJ1Y3QgbWVtaW5mbyAqbWkpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9wYWdlX3RhYmxlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCkBAIC03MTIsNyArNzMxLDcgQEAKIAogI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCiAJLyogVGhlIFhJUCBrZXJuZWwgaXMgbWFwcGVkIGluIHRoZSBtb2R1bGUgYXJlYSAtLSBza2lwIG92ZXIgaXQgKi8KLQlhZGRyID0gKCh1bnNpZ25lZCBsb25nKSZfZXRleHQgKyBQR0RJUl9TSVpFIC0gMSkgJiBQR0RJUl9NQVNLOworCWFkZHIgPSAoKHVuc2lnbmVkIGxvbmcpX2V0ZXh0ICsgUEdESVJfU0laRSAtIDEpICYgUEdESVJfTUFTSzsKICNlbmRpZgogCWZvciAoIDsgYWRkciA8IFBBR0VfT0ZGU0VUOyBhZGRyICs9IFBHRElSX1NJWkUpCiAJCXBtZF9jbGVhcihwbWRfb2ZmX2soYWRkcikpOwpAQCAtNzIxLDcgKzc0MCw3IEBACiAJICogQ2xlYXIgb3V0IGFsbCB0aGUga2VybmVsIHNwYWNlIG1hcHBpbmdzLCBleGNlcHQgZm9yIHRoZSBmaXJzdAogCSAqIG1lbW9yeSBiYW5rLCB1cCB0byB0aGUgZW5kIG9mIHRoZSB2bWFsbG9jIHJlZ2lvbi4KIAkgKi8KLQlmb3IgKGFkZHIgPSBfX3BoeXNfdG9fdmlydChtaS0+YmFua1swXS5zdGFydCArIG1pLT5iYW5rWzBdLnNpemUpOworCWZvciAoYWRkciA9IF9fcGh5c190b192aXJ0KGJhbmtfcGh5c19lbmQoJm1lbWluZm8uYmFua1swXSkpOwogCSAgICAgYWRkciA8IFZNQUxMT0NfRU5EOyBhZGRyICs9IFBHRElSX1NJWkUpCiAJCXBtZF9jbGVhcihwbWRfb2ZmX2soYWRkcikpOwogfQpAQCAtNzM4LDEwICs3NTcsMTAgQEAKIAkgKiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSBpbiBub2RlIDAuCiAJICovCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYSgmX19kYXRhX3N0YXJ0KSwgJl9lbmQgLSAmX19kYXRhX3N0YXJ0LAorCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKF9kYXRhKSwgX2VuZCAtIF9kYXRhLAogCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbHNlCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9zdGV4dCksICZfZW5kIC0gJl9zdGV4dCwKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYShfc3RleHQpLCBfZW5kIC0gX3N0ZXh0LAogCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCkBAIC04MDgsNyArODI3LDYgQEAKIAkgKiBBbGxvY2F0ZSB0aGUgdmVjdG9yIHBhZ2UgZWFybHkuCiAJICovCiAJdmVjdG9ycyA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7Ci0JQlVHX09OKCF2ZWN0b3JzKTsKIAogCWZvciAoYWRkciA9IFZNQUxMT0NfRU5EOyBhZGRyOyBhZGRyICs9IFBHRElSX1NJWkUpCiAJCXBtZF9jbGVhcihwbWRfb2ZmX2soYWRkcikpOwpAQCAtODIwLDcgKzgzOCw3IEBACiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKIAltYXAucGZuID0gX19waHlzX3RvX3BmbihDT05GSUdfWElQX1BIWVNfQUREUiAmIFNFQ1RJT05fTUFTSyk7CiAJbWFwLnZpcnR1YWwgPSBNT0RVTEVTX1ZBRERSOwotCW1hcC5sZW5ndGggPSAoKHVuc2lnbmVkIGxvbmcpJl9ldGV4dCAtIG1hcC52aXJ0dWFsICsgflNFQ1RJT05fTUFTSykgJiBTRUNUSU9OX01BU0s7CisJbWFwLmxlbmd0aCA9ICgodW5zaWduZWQgbG9uZylfZXRleHQgLSBtYXAudmlydHVhbCArIH5TRUNUSU9OX01BU0spICYgU0VDVElPTl9NQVNLOwogCW1hcC50eXBlID0gTVRfUk9NOwogCWNyZWF0ZV9tYXBwaW5nKCZtYXApOwogI2VuZGlmCkBAIC04ODAsMjMgKzg5OCwyMyBAQAogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcywgaW5pdGlhbGlzZXMgdGhlIHpvbmUgbWVtb3J5CiAgKiBtYXBzLCBhbmQgc2V0cyB1cCB0aGUgemVybyBwYWdlLCBiYWQgcGFnZSBhbmQgYmFkIHBhZ2UgdGFibGVzLgogICovCi12b2lkIF9faW5pdCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqbWksIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQordm9pZCBfX2luaXQgcGFnaW5nX2luaXQoc3RydWN0IG1hY2hpbmVfZGVzYyAqbWRlc2MpCiB7CiAJdm9pZCAqemVyb19wYWdlOwogCiAJYnVpbGRfbWVtX3R5cGVfdGFibGUoKTsKLQlzYW5pdHlfY2hlY2tfbWVtaW5mbyhtaSk7Ci0JcHJlcGFyZV9wYWdlX3RhYmxlKG1pKTsKLQlib290bWVtX2luaXQobWkpOworCXNhbml0eV9jaGVja19tZW1pbmZvKCk7CisJcHJlcGFyZV9wYWdlX3RhYmxlKCk7CisJYm9vdG1lbV9pbml0KCk7CiAJZGV2aWNlbWFwc19pbml0KG1kZXNjKTsKIAogCXRvcF9wbWQgPSBwbWRfb2ZmX2soMHhmZmZmMDAwMCk7CiAKIAkvKgotCSAqIGFsbG9jYXRlIHRoZSB6ZXJvIHBhZ2UuICBOb3RlIHRoYXQgd2UgY291bnQgb24gdGhpcyBnb2luZyBvay4KKwkgKiBhbGxvY2F0ZSB0aGUgemVybyBwYWdlLiAgTm90ZSB0aGF0IHRoaXMgYWx3YXlzIHN1Y2NlZWRzIGFuZAorCSAqIHJldHVybnMgYSB6ZXJvZWQgcmVzdWx0LgogCSAqLwogCXplcm9fcGFnZSA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7Ci0JbWVtemVybyh6ZXJvX3BhZ2UsIFBBR0VfU0laRSk7CiAJZW1wdHlfemVyb19wYWdlID0gdmlydF90b19wYWdlKHplcm9fcGFnZSk7CiAJZmx1c2hfZGNhY2hlX3BhZ2UoZW1wdHlfemVyb19wYWdlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL25vbW11LmMgYi9hcmNoL2FybS9tbS9ub21tdS5jCmluZGV4IDA3YjYyYjIuLmFkN2JhY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL25vbW11LmMKKysrIGIvYXJjaC9hcm0vbW0vbm9tbXUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCkBAIC0yNSwxMCArMjYsMTAgQEAKIAkgKiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSBpbiBub2RlIDAuCiAJICovCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYSgmX19kYXRhX3N0YXJ0KSwgJl9lbmQgLSAmX19kYXRhX3N0YXJ0LAorCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKF9kYXRhKSwgX2VuZCAtIF9kYXRhLAogCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbHNlCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9zdGV4dCksICZfZW5kIC0gJl9zdGV4dCwKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYShfc3RleHQpLCBfZW5kIC0gX3N0ZXh0LAogCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCkBAIC00MSwyNyArNDIsMTMgQEAKIAkJCUJPT1RNRU1fREVGQVVMVCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYW5pdHlfY2hlY2tfbWVtaW5mbyhzdHJ1Y3QgbWVtaW5mbyAqbWkpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7Ci0JCXN0cnVjdCBtZW1iYW5rICptYiA9ICZtaS0+YmFua1tpXTsKLQotCQlpZiAobWItPnNpemUgIT0gMCAmJiBtYi0+bm9kZSA8IE1BWF9OVU1OT0RFUykKLQkJCW1pLT5iYW5rW2orK10gPSBtaS0+YmFua1tpXTsKLQl9Ci0JbWktPm5yX2JhbmtzID0gajsKLX0KLQogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMsIGluaXRpYWxpc2VzIHRoZSB6b25lIG1lbW9yeQogICogbWFwcywgYW5kIHNldHMgdXAgdGhlIHplcm8gcGFnZSwgYmFkIHBhZ2UgYW5kIGJhZCBwYWdlIHRhYmxlcy4KICAqLwotdm9pZCBfX2luaXQgcGFnaW5nX2luaXQoc3RydWN0IG1lbWluZm8gKm1pLCBzdHJ1Y3QgbWFjaGluZV9kZXNjICptZGVzYykKK3ZvaWQgX19pbml0IHBhZ2luZ19pbml0KHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQogewotCXNhbml0eV9jaGVja19tZW1pbmZvKG1pKTsKLQlib290bWVtX2luaXQobWkpOworCWJvb3RtZW1faW5pdCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcGdkLmMgYi9hcmNoL2FybS9tbS9wZ2QuYwppbmRleCBlMGYxOWFiLi4yNjkwMTQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wZ2QuYworKysgYi9hcmNoL2FybS9tbS9wZ2QuYwpAQCAtMzEsNyArMzEsNyBAQAogCWlmICghbmV3X3BnZCkKIAkJZ290byBub19wZ2Q7CiAKLQltZW16ZXJvKG5ld19wZ2QsIEZJUlNUX0tFUk5FTF9QR0RfTlIgKiBzaXplb2YocGdkX3QpKTsKKwltZW1zZXQobmV3X3BnZCwgMCwgRklSU1RfS0VSTkVMX1BHRF9OUiAqIHNpemVvZihwZ2RfdCkpOwogCiAJLyoKIAkgKiBDb3B5IG92ZXIgdGhlIGtlcm5lbCBhbmQgSU8gUEdEIGVudHJpZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jIGIvYXJjaC9hcm0vbW0vcHJvYy1zeW1zLmMKaW5kZXggMmI1YmEzOS4uNGFkM2JmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1zeW1zLmMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zeW1zLmMKQEAgLTMzLDggKzMzLDggQEAKIAogI2lmZGVmIENPTkZJR19NTVUKICNpZm5kZWYgTVVMVElfVVNFUgotRVhQT1JUX1NZTUJPTChfX2NwdV9jbGVhcl91c2VyX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChfX2NwdV9jb3B5X3VzZXJfcGFnZSk7CitFWFBPUlRfU1lNQk9MKF9fY3B1X2NsZWFyX3VzZXJfaGlnaHBhZ2UpOworRVhQT1JUX1NZTUJPTChfX2NwdV9jb3B5X3VzZXJfaGlnaHBhZ2UpOwogI2Vsc2UKIEVYUE9SVF9TWU1CT0woY3B1X3VzZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKaW5kZXggMjk0OTQzYi4uZjBjYzU5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwpAQCAtNzEsNiArNzEsOCBAQAogICoJSVJRcyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KICAqLwogRU5UUlkoY3B1X3Y2X2RvX2lkbGUpCisJbW92CXIxLCAjMAorCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCA0CQlAIERXQiAtIFdGSSBtYXkgZW50ZXIgYSBsb3ctcG93ZXIgbW9kZQogCW1jcglwMTUsIDAsIHIxLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CiAJbW92CXBjLCBscgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKaW5kZXggNGQzYzBhNy4uZDFlYmVjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwpAQCAtMjAsOSArMjAsMTcgQEAKIAogI2RlZmluZSBUVEJfQwkJKDEgPDwgMCkKICNkZWZpbmUgVFRCX1MJCSgxIDw8IDEpCisjZGVmaW5lIFRUQl9SR05fTkMJKDAgPDwgMykKKyNkZWZpbmUgVFRCX1JHTl9PQ19XQldBCSgxIDw8IDMpCiAjZGVmaW5lIFRUQl9SR05fT0NfV1QJKDIgPDwgMykKICNkZWZpbmUgVFRCX1JHTl9PQ19XQgkoMyA8PCAzKQogCisjaWZuZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgVFRCX0ZMQUdTCVRUQl9DfFRUQl9SR05fT0NfV0IJCUAgbWFyayBQVFdzIGNhY2hlYWJsZSwgb3V0ZXIgV0IKKyNlbHNlCisjZGVmaW5lIFRUQl9GTEFHUwlUVEJfQ3xUVEJfU3xUVEJfUkdOX09DX1dCV0EJQCBtYXJrIFBUV3MgY2FjaGVhYmxlIGFuZCBzaGFyZWQsIG91dGVyIFdCV0EKKyNlbmRpZgorCiBFTlRSWShjcHVfdjdfcHJvY19pbml0KQogCW1vdglwYywgbHIKIEVORFBST0MoY3B1X3Y3X3Byb2NfaW5pdCkKQEAgLTU1LDYgKzYzLDcgQEAKICAqCUlSUXMgYXJlIGFscmVhZHkgZGlzYWJsZWQuCiAgKi8KIEVOVFJZKGNwdV92N19kb19pZGxlKQorCWRzYgkJCQkJQCBXRkkgbWF5IGVudGVyIGEgbG93LXBvd2VyIG1vZGUKIAl3ZmkKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGNwdV92N19kb19pZGxlKQpAQCAtODUsNyArOTQsNyBAQAogI2lmZGVmIENPTkZJR19NTVUKIAltb3YJcjIsICMwCiAJbGRyCXIxLCBbcjEsICNNTV9DT05URVhUX0lEXQlAIGdldCBtbS0+Y29udGV4dC5pZAotCW9ycglyMCwgcjAsICNUVEJfUkdOX09DX1dCCQlAIG1hcmsgUFRXcyBvdXRlciBjYWNoZWFibGUsIFdCCisJb3JyCXIwLCByMCwgI1RUQl9GTEFHUwogCW1jcglwMTUsIDAsIHIyLCBjMTMsIGMwLCAxCQlAIHNldCByZXNlcnZlZCBjb250ZXh0IElECiAJaXNiCiAxOgltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHNldCBUVEIgMApAQCAtMTYyLDYgKzE3MSwxMSBAQAogICoJLSBjYWNoZSB0eXBlIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkCiAgKi8KIF9fdjdfc2V0dXA6CisjaWZkZWYgQ09ORklHX1NNUAorCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDEJCUAgRW5hYmxlIFNNUC9uQU1QIG1vZGUKKwlvcnIJcjAsIHIwLCAjKDB4MSA8PCA2KQorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDEKKyNlbmRpZgogCWFkcglyMTIsIF9fdjdfc2V0dXBfc3RhY2sJCUAgdGhlIGxvY2FsIHN0YWNrCiAJc3RtaWEJcjEyLCB7cjAtcjUsIHI3LCByOSwgcjExLCBscn0KIAlibAl2N19mbHVzaF9kY2FjaGVfYWxsCkBAIC0xNzQsOCArMTg4LDcgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJbWNyCXAxNSwgMCwgcjEwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJICsgRCBUTEJzCiAJbWNyCXAxNSwgMCwgcjEwLCBjMiwgYzAsIDIJCUAgVFRCIGNvbnRyb2wgcmVnaXN0ZXIKLQlvcnIJcjQsIHI0LCAjVFRCX1JHTl9PQ19XQgkJQCBtYXJrIFBUV3Mgb3V0ZXIgY2FjaGVhYmxlLCBXQgotCW1jcglwMTUsIDAsIHI0LCBjMiwgYzAsIDAJCUAgbG9hZCBUVEIwCisJb3JyCXI0LCByNCwgI1RUQl9GTEFHUwogCW1jcglwMTUsIDAsIHI0LCBjMiwgYzAsIDEJCUAgbG9hZCBUVEIxCiAJbW92CXIxMCwgIzB4MWYJCQlAIGRvbWFpbnMgMCwgMSA9IG1hbmFnZXIKIAltY3IJcDE1LCAwLCByMTAsIGMzLCBjMCwgMAkJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgcmVnaXN0ZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKaW5kZXggOGY2Y2Y1Ni4uMzM1MTVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKQEAgLTQ4MSwzICs0ODEsMjggQEAKIAkubG9uZwl4c2MzX21jX3VzZXJfZm5zCiAJLmxvbmcJeHNjM19jYWNoZV9mbnMKIAkuc2l6ZQlfX3hzYzNfcHJvY19pbmZvLCAuIC0gX194c2MzX3Byb2NfaW5mbworCisvKiBOb3RlOiBQWEE5MzUgY2hhbmdlZCBpdHMgaW1wbGVtZW50b3IgSUQgZnJvbSBJbnRlbCB0byBNYXJ2ZWxsICovCisKKwkudHlwZQlfX3hzYzNfcHhhOTM1X3Byb2NfaW5mbywjb2JqZWN0CitfX3hzYzNfcHhhOTM1X3Byb2NfaW5mbzoKKwkubG9uZwkweDU2MDU2MDAwCisJLmxvbmcJMHhmZmZmZTAwMAorCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCisJCVBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCisJCVBNRF9TRUNUX0NBQ0hFQUJMRSB8IFwKKwkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCisJCVBNRF9TRUNUX0FQX1JFQUQKKwkubG9uZwlQTURfVFlQRV9TRUNUIHwgXAorCQlQTURfU0VDVF9BUF9XUklURSB8IFwKKwkJUE1EX1NFQ1RfQVBfUkVBRAorCWIJX194c2MzX3NldHVwCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCisJLmxvbmcJY3B1X3hzYzNfbmFtZQorCS5sb25nCXhzYzNfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCXY0d2JpX3RsYl9mbnMKKwkubG9uZwl4c2MzX21jX3VzZXJfZm5zCisJLmxvbmcJeHNjM19jYWNoZV9mbnMKKwkuc2l6ZQlfX3hzYzNfcHhhOTM1X3Byb2NfaW5mbywgLiAtIF9feHNjM19weGE5MzVfcHJvY19pbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZwppbmRleCBiMmE3ZTNmLi45Y2MyYjE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcKQEAgLTYsMTggKzYsMjcgQEAKIAlwcm9tcHQgIk1YQy9pTVggQmFzZSBUeXBlIgogCWRlZmF1bHQgQVJDSF9NWDMKIAorY29uZmlnIEFSQ0hfTVgxCisJYm9vbCAiTVgxLWJhc2VkIgorCXNlbGVjdCBDUFVfQVJNOTIwVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDEgZmFtaWx5CisKIGNvbmZpZyBBUkNIX01YMgogCWJvb2wgIk1YMi1iYXNlZCIKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVgyIGZhbWlseQogCiBjb25maWcgQVJDSF9NWDMKIAlib29sICJNWDMtYmFzZWQiCisJc2VsZWN0IENQVV9WNgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDMgZmFtaWx5CiAKIGVuZGNob2ljZQogCitzb3VyY2UgImFyY2gvYXJtL21hY2gtbXgxL0tjb25maWciCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXgyL0tjb25maWciCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtbXgzL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKaW5kZXggMDY3NTU2Zi4uZGI3NGE5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUKQEAgLTUsNCArNSw1IEBACiAjIENvbW1vbiBzdXBwb3J0CiBvYmoteSA6PSBpcnEubyBjbG9jay5vIGdwaW8ubyB0aW1lLm8gZGV2aWNlcy5vCiAKK29iai0kKENPTkZJR19BUkNIX01YMSkgKz0gaW9tdXgtbXgxLW14Mi5vIGRtYS1teDEtbXgyLm8KIG9iai0kKENPTkZJR19BUkNIX01YMikgKz0gaW9tdXgtbXgxLW14Mi5vIGRtYS1teDEtbXgyLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kbWEtbXgxLW14Mi5jCmluZGV4IGIyOTZmMTkuLjI5MDVlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZG1hLW14MS1teDIuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS1teDEtbXgyLmg+CiAKICNkZWZpbmUgRE1BX0RDUiAgICAgMHgwMAkJLyogQ29udHJvbCBSZWdpc3RlciAqLwpAQCAtMTE0LDcgKzExMyw3IEBACiAJdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIGludCBlcnJjb2RlKTsKIAl2b2lkICgqcHJvZ19oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBzY2F0dGVybGlzdCAqKTsKIAl2b2lkICpkYXRhOwotCWRtYW1vZGVfdCAgZG1hX21vZGU7CisJdW5zaWduZWQgaW50ICBkbWFfbW9kZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGludCByZXNieXRlczsKIAlpbnQgZG1hX251bTsKQEAgLTE5Myw3ICsxOTIsNyBAQAogaW50CiBpbXhfZG1hX3NldHVwX3NpbmdsZShpbnQgY2hhbm5lbCwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKIAkJICAgICB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAotCQkgICAgIGRtYW1vZGVfdCBkbWFtb2RlKQorCQkgICAgIHVuc2lnbmVkIGludCBkbWFtb2RlKQogewogCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwogCkBAIC0yODgsNyArMjg3LDcgQEAKIGlteF9kbWFfc2V0dXBfc2coaW50IGNoYW5uZWwsCiAJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgc2djb3VudCwKIAkJIHVuc2lnbmVkIGludCBkbWFfbGVuZ3RoLCB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsCi0JCSBkbWFtb2RlX3QgZG1hbW9kZSkKKwkJIHVuc2lnbmVkIGludCBkbWFtb2RlKQogewogCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOwogCkBAIC01MTIsNiArNTExLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW14X2RtYV9kaXNhYmxlKTsKIAorI2lmZGVmIENPTkZJR19BUkNIX01YMgogc3RhdGljIHZvaWQgaW14X2RtYV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGNobm8pCiB7CiAJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hub107CkBAIC01MjMsNiArNTIzLDcgQEAKIAlpZiAoaW14ZG1hLT5lcnJfaGFuZGxlcikKIAkJaW14ZG1hLT5lcnJfaGFuZGxlcihjaG5vLCBpbXhkbWEtPmRhdGEsIElNWF9ETUFfRVJSX1RJTUVPVVQpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfZXJyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewpAQCAtNjc1LDcgKzY3Niw3IEBACiB7CiAJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJLyogYmFzaWMgc2FuaXR5IGNoZWNrcyAqLwogCWlmICghbmFtZSkKQEAgLTY5Nyw2ICs2OTgsNyBAQAogCXJldCA9IHJlcXVlc3RfaXJxKE1YQ19JTlRfRE1BQ0gwICsgY2hhbm5lbCwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwKIAkJCU5VTEwpOwogCWlmIChyZXQpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCByZWdpc3RlciBJUlEgJWQgZm9yIERNQSBjaGFubmVsICVkXG4iLAogCQkJCU1YQ19JTlRfRE1BQ0gwICsgY2hhbm5lbCwgY2hhbm5lbCk7CiAJCXJldHVybiByZXQ7CkBAIC03MTMsNyArNzE1LDcgQEAKIAlpbXhkbWEtPnNnID0gTlVMTDsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChpbXhfZG1hX3JlcXVlc3QpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9ncGlvLmMKaW5kZXggZGU1YzQ3NC4uY2NiZDk0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2dwaW8uYwpAQCAtMTE1LDggKzExNSw4IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVgzCi0vKiBNWDMgaGFzIG9uZSBpbnRlcnJ1cHQgKnBlciogZ3BpbyBwb3J0ICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NWDMpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfTVgxKQorLyogTVgxIGFuZCBNWDMgaGFzIG9uZSBpbnRlcnJ1cHQgKnBlciogZ3BpbyBwb3J0ICovCiBzdGF0aWMgdm9pZCBteDNfZ3Bpb19pcnFfaGFuZGxlcih1MzIgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdTMyIGlycV9zdGF0OwpAQCAtMjM3LDcgKzIzNyw3IEBACiAJCS8qIGl0cyBhIHNlcmlvdXMgY29uZmlndXJhdGlvbiBidWcgd2hlbiBpdCBmYWlscyAqLwogCQlCVUdfT04oIGdwaW9jaGlwX2FkZCgmcG9ydFtpXS5jaGlwKSA8IDAgKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX01YMworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX01YMSkKIAkJLyogc2V0dXAgb25lIGhhbmRsZXIgZm9yIGVhY2ggZW50cnkgKi8KIAkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIocG9ydFtpXS5pcnEsIG14M19ncGlvX2lycV9oYW5kbGVyKTsKIAkJc2V0X2lycV9kYXRhKHBvcnRbaV0uaXJxLCAmcG9ydFtpXSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN2Fkcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MjdhZHMuaAppbmRleCA2MWU2NmRhLi44ZjM0YTA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgyN2Fkcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDI3YWRzLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9NWENfQk9BUkRfTVgyN0FEU19IX18KIAogLyogZXh0ZXJuYWwgaW50ZXJydXB0IG11bHRpcGxleGVyICovCi0jZGVmaW5lIE1YQ19FWFBfSU9fQkFTRQkJKE1YQ19HUElPX0JBU0UgKyBNWENfTUFYX0dQSU9fTElORVMpCisjZGVmaW5lIE1YQ19FWFBfSU9fQkFTRQkJKE1YQ19CT0FSRF9JUlFfU1RBUlQpCiAKICNkZWZpbmUgTVhDX1ZJUlRVQUxfSU5UU19CQVNFCShNWENfRVhQX0lPX0JBU0UgKyBNWENfTUFYX0VYUF9JT19MSU5FUykKICNkZWZpbmUgTVhDX1NESU8xX0NBUkRfSVJRCU1YQ19WSVJUVUFMX0lOVFNfQkFTRQpAQCAtMjgsMTEgKzI4LDYgQEAKIC8qCiAgKiBNWEMgVUFSVCBFVkIgYm9hcmQgbGV2ZWwgY29uZmlndXJhdGlvbnMKICAqLwotCi0jZGVmaW5lIE1YQ19MTF9FWFRVQVJUX1BBRERSCShDUzRfQkFTRV9BRERSICsgMHgyMDAwMCkKLSNkZWZpbmUgTVhDX0xMX0VYVFVBUlRfVkFERFIJKENTNF9CQVNFX0FERFJfVklSVCArIDB4MjAwMDApCi0jZGVmaW5lIE1YQ19MTF9FWFRVQVJUXzE2QklUX0JVUwotCiAjZGVmaW5lIE1YQ19MTF9VQVJUX1BBRERSICAgICAgIFVBUlQxX0JBU0VfQUREUgogI2RlZmluZSBNWENfTExfVUFSVF9WQUREUiAgICAgICBBSVBJX0lPX0FERFJFU1MoVUFSVDFfQkFTRV9BRERSKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWFkcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFhZHMuaAppbmRleCA3NDViNDg4Li40NTFkNTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWFkcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxYWRzLmgKQEAgLTkwLDcgKzkwLDcgQEAKICNkZWZpbmUgUEJDX0lOVE1BU0tfQ0xFQVJfUkVHCShQQkNfSU5UTUFTS19DTEVBUiArIFBCQ19CQVNFX0FERFJFU1MpCiAjZGVmaW5lIEVYUElPX1BBUkVOVF9JTlQJSU9NVVhfVE9fSVJRKE1YMzFfUElOX0dQSU8xXzQpCiAKLSNkZWZpbmUgTVhDX0VYUF9JT19CQVNFCQkoTVhDX01BWF9JTlRfTElORVMgKyBNWENfTUFYX0dQSU9fTElORVMpCisjZGVmaW5lIE1YQ19FWFBfSU9fQkFTRQkJKE1YQ19CT0FSRF9JUlFfU1RBUlQpCiAjZGVmaW5lIE1YQ19JUlFfVE9fRVhQSU8oaXJxKQkoKGlycSkgLSBNWENfRVhQX0lPX0JBU0UpCiAKICNkZWZpbmUgRVhQSU9fSU5UX0xPV19CQVQJKE1YQ19FWFBfSU9fQkFTRSArIDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMXBkay5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFwZGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZiMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFwZGsuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX01YMzFQREtfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0JPQVJEX01YMzFQREtfSF9fCisKKy8qIG1hbmRhdG9yeSBmb3IgQ09ORklHX0xMX0RFQlVHICovCisKKyNkZWZpbmUgTVhDX0xMX1VBUlRfUEFERFIJVUFSVDFfQkFTRV9BRERSCisjZGVmaW5lIE1YQ19MTF9VQVJUX1ZBRERSCUFJUFMxX0lPX0FERFJFU1MoVUFSVDFfQkFTRV9BRERSKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9NWENfQk9BUkRfTVgzMVBES19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYjk5MDdiZS4uNjAyNzY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTI4LDYgKzI4LDkgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9QQ00wMzgKICNpbmNsdWRlIDxtYWNoL2JvYXJkLXBjbTAzOC5oPgogI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQ0hfTVgzMV8zRFMKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MzFwZGsuaD4KKyNlbmRpZgogCQkubWFjcm8JYWRkcnVhcnQscngKIAkJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKIAkJdHN0CVxyeCwgIzEJCQlAIE1NVSBlbmFibGVkPwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaAppbmRleCBlODVmZDk0Li5iMzg3NmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaApAQCAtMjIsMTMgKzIyLDE1IEBACiAgKiBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLQogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19ETUFfSAogI2RlZmluZSBfX0FTTV9BUkNIX01YQ19ETUFfSAogCiAjZGVmaW5lIElNWF9ETUFfQ0hBTk5FTFMgIDE2CiAKKyNkZWZpbmUgRE1BX01PREVfUkVBRAkJMAorI2RlZmluZSBETUFfTU9ERV9XUklURQkJMQorI2RlZmluZSBETUFfTU9ERV9NQVNLCQkxCisKICNkZWZpbmUgRE1BX0JBU0UgSU9fQUREUkVTUyhETUFfQkFTRV9BRERSKQogCiAjZGVmaW5lIElNWF9ETUFfTUVNU0laRV8zMgkoMCA8PCA0KQpAQCAtNTQsMTIgKzU2LDEyIEBACiBpbnQKIGlteF9kbWFfc2V0dXBfc2luZ2xlKGludCBjaGFubmVsLCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAogCQl1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAotCQlkbWFtb2RlX3QgZG1hbW9kZSk7CisJCXVuc2lnbmVkIGludCBkbWFtb2RlKTsKIAogaW50CiBpbXhfZG1hX3NldHVwX3NnKGludCBjaGFubmVsLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQl1bnNpZ25lZCBpbnQgc2djb3VudCwgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsCi0JCXVuc2lnbmVkIGludCBkZXZfYWRkciwgZG1hbW9kZV90IGRtYW1vZGUpOworCQl1bnNpZ25lZCBpbnQgZGV2X2FkZHIsIHVuc2lnbmVkIGludCBkbWFtb2RlKTsKIAogaW50CiBpbXhfZG1hX3NldHVwX2hhbmRsZXJzKGludCBjaGFubmVsLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIyZDU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19ETUFfSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0RNQV9IX18KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IDExNjMyMDIuLjVmMDFkNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC05LDYgKzksOCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKwogI2RlZmluZSBBVklDX05JTUFTSwkweDA0CiAKIAlAIHRoaXMgbWFjcm8gZGlzYWJsZXMgZmFzdCBpcnEgKG5vdCBpbXBsZW1lbnRlZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDY1ZWVkYzAuLmVhNTA5ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjcsOCArMjcsOCBAQAogI2RlZmluZSBncGlvX3NldF92YWx1ZQkJX19ncGlvX3NldF92YWx1ZQogI2RlZmluZSBncGlvX2NhbnNsZWVwCQlfX2dwaW9fY2Fuc2xlZXAKIAotI2RlZmluZSBncGlvX3RvX2lycShncGlvKQkoTVhDX01BWF9JTlRfTElORVMgKyAoZ3BpbykpCi0jZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhDX01BWF9JTlRfTElORVMpCisjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCShNWENfR1BJT19JUlFfU1RBUlQgKyAoZ3BpbykpCisjZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhDX0dQSU9fSVJRX1NUQVJUKQogCiBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCAzY2FhZGVlLi5hNjEyZDhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMzIsNiArMzIsMTAgQEAKICMgZW5kaWYKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgxCisjIGluY2x1ZGUgPG1hY2gvbXgxLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hY2gvbXhjLmg+CiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19IQVJEV0FSRV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggNWQ0Y2IxMS4uYjRmMmRlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTI1LDggKzI1LDggQEAKIAkJLyogQWNjZXNzIGFsbCBwZXJpcGhlcmFscyBiZWxvdyAweDgwMDAwMDAwIGFzIG5vbnNoYXJlZCBkZXZpY2UKIAkJICogYnV0IGxlYXZlIGwyY2MgYWxvbmUuCiAJCSAqLwotCQlpZiAoKHBoeXNfYWRkciA8IDB4ODAwMDAwMDApICYmICgocGh5c19hZGRyIDwgTDJDQ19CQVNFX0FERFIpIHx8Ci0JCQkocGh5c19hZGRyID49IEwyQ0NfQkFTRV9BRERSICsgTDJDQ19TSVpFKSkpCisJCWlmICgocGh5c19hZGRyIDwgMHg4MDAwMDAwMCkgJiYgKChwaHlzX2FkZHIgPCAweDMwMDAwMDAwKSB8fAorCQkJKHBoeXNfYWRkciA+PSAweDMwMDAwMDAwICsgU1pfMU0pKSkKIAkJCW10eXBlID0gTVRfREVWSUNFX05PTlNIQVJFRDsKIAl9CiAKQEAgLTM1LDggKzM1LDggQEAKICNlbmRpZgogCiAvKiBpbyBhZGRyZXNzIG1hcHBpbmcgbWFjcm8gKi8KLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQorI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCiAKLSNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDEtbXgyLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgxLW14Mi5oCmluZGV4IDNkMDliZmQuLjk1YTM4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDEtbXgyLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14MS1teDIuaApAQCAtMjEsMTIgKzIxLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNkZWZpbmUgTVhDX0dQSU9fQUxMT0NfTU9ERV9OT1JNQUwJMAotI2RlZmluZSBNWENfR1BJT19BTExPQ19NT0RFX05PX0FMTE9DCTEKLSNkZWZpbmUgTVhDX0dQSU9fQUxMT0NfTU9ERV9UUllfQUxMT0MJMgotI2RlZmluZSBNWENfR1BJT19BTExPQ19NT0RFX0FMTE9DX09OTFkJNAotI2RlZmluZSBNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UJOAotCiAvKgogICogIEdQSU8gTW9kdWxlIGFuZCBJL08gTXVsdGlwbGV4ZXIKICAqICB4ID0gMC4uMyBmb3IgcmVnX0EsIHJlZ19CLCByZWdfQywgcmVnX0QKQEAgLTEwMyw3ICs5Nyw4IEBACiAKIGV4dGVybiB2b2lkIG14Y19ncGlvX21vZGUoaW50IGdwaW9fbW9kZSk7CiBleHRlcm4gaW50IG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoY29uc3QgaW50ICpwaW5fbGlzdCwgdW5zaWduZWQgY291bnQsCi0JCQkJCWludCBhbGxvY19tb2RlLCBjb25zdCBjaGFyICpsYWJlbCk7CisJCQkJCWNvbnN0IGNoYXIgKmxhYmVsKTsKK2V4dGVybiB2b2lkIG14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhjb25zdCBpbnQgKnBpbl9saXN0LCBpbnQgY291bnQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xMTMsOSArMTA4LDkgQEAKICAqIG1pc3Npbmcgb24gc29tZSAobWFueSkgcGlucwogICovCiAjaWZkZWYgQ09ORklHX0FSQ0hfTVgxCi0jZGVmaW5lIFBBMF9BSU5fU1BJMl9DTEsgICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlRBIHwgR1BJT19PVVQgfCAwKQorI2RlZmluZSBQQTBfQUlOX1NQSTJfQ0xLICAgICAoR1BJT19QT1JUQSB8IEdQSU9fT1VUIHwgMCkKICNkZWZpbmUgUEEwX0FGX0VUTVRSQUNFU1lOQyAgKEdQSU9fUE9SVEEgfCBHUElPX0FGIHwgMCkKLSNkZWZpbmUgUEExX0FPVVRfU1BJMl9SWEQgICAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEEgfCBHUElPX0lOIHwgMSkKKyNkZWZpbmUgUEExX0FPVVRfU1BJMl9SWEQgICAgKEdQSU9fUE9SVEEgfCBHUElPX0lOIHwgMSkKICNkZWZpbmUgUEExX1BGX1RJTiAgICAgICAgICAgKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMSkKICNkZWZpbmUgUEEyX1BGX1BXTTAgICAgICAgICAgKEdQSU9fUE9SVEEgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAyKQogI2RlZmluZSBQQTNfUEZfQ1NJX01DTEsgICAgICAoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCAzKQpAQCAtMTMzLDcgKzEyOCw3IEBACiAjZGVmaW5lIFBBMTVfUEZfSTJDX1NEQSAgICAgIChHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTUpCiAjZGVmaW5lIFBBMTZfUEZfSTJDX1NDTCAgICAgIChHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTYpCiAjZGVmaW5lIFBBMTdfQUZfRVRNVFJBQ0VQS1Q0IChHUElPX1BPUlRBIHwgR1BJT19BRiB8IDE3KQotI2RlZmluZSBQQTE3X0FJTl9TUEkyX1NTICAgICAoR1BJT19HSVVTIHwgR1BJT19QT1JUQSB8IEdQSU9fT1VUIHwgMTcpCisjZGVmaW5lIFBBMTdfQUlOX1NQSTJfU1MgICAgIChHUElPX1BPUlRBIHwgR1BJT19PVVQgfCAxNykKICNkZWZpbmUgUEExOF9BRl9FVE1UUkFDRVBLVDUgKEdQSU9fUE9SVEEgfCBHUElPX0FGIHwgMTgpCiAjZGVmaW5lIFBBMTlfQUZfRVRNVFJBQ0VQS1Q2IChHUElPX1BPUlRBIHwgR1BJT19BRiB8IDE5KQogI2RlZmluZSBQQTIwX0FGX0VUTVRSQUNFUEtUNyAoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyMCkKQEAgLTIwMSwyNyArMTk2LDI3IEBACiAjZGVmaW5lIFBDMTVfUEZfU1BJMV9TUyAgICAgIChHUElPX1BPUlRDIHwgR1BJT19QRiB8IDE1KQogI2RlZmluZSBQQzE2X1BGX1NQSTFfTUlTTyAgICAoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCAxNikKICNkZWZpbmUgUEMxN19QRl9TUEkxX01PU0kgICAgKEdQSU9fUE9SVEMgfCBHUElPX1BGIHwgMTcpCi0jZGVmaW5lIFBDMjRfQklOX1VBUlQzX1JJICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX0JJTiB8IDI0KQotI2RlZmluZSBQQzI1X0JJTl9VQVJUM19EU1IgICAoR1BJT19HSVVTIHwgR1BJT19QT1JUQyB8IEdQSU9fT1VUIHwgR1BJT19CSU4gfCAyNSkKLSNkZWZpbmUgUEMyNl9BT1VUX1VBUlQzX0RUUiAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMjYpCi0jZGVmaW5lIFBDMjdfQklOX1VBUlQzX0RDRCAgIChHUElPX0dJVVMgfCBHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX0JJTiB8IDI3KQotI2RlZmluZSBQQzI4X0JJTl9VQVJUM19DVFMgICAoR1BJT19HSVVTIHwgR1BJT19QT1JUQyB8IEdQSU9fT1VUIHwgR1BJT19CSU4gfCAyOCkKLSNkZWZpbmUgUEMyOV9BT1VUX1VBUlQzX1JUUyAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMjkpCi0jZGVmaW5lIFBDMzBfQklOX1VBUlQzX1RYICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlRDIHwgR1BJT19CSU4gfCAzMCkKLSNkZWZpbmUgUEMzMV9BT1VUX1VBUlQzX1JYICAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMzEpCisjZGVmaW5lIFBDMjRfQklOX1VBUlQzX1JJICAgIChHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX0JJTiB8IDI0KQorI2RlZmluZSBQQzI1X0JJTl9VQVJUM19EU1IgICAoR1BJT19QT1JUQyB8IEdQSU9fT1VUIHwgR1BJT19CSU4gfCAyNSkKKyNkZWZpbmUgUEMyNl9BT1VUX1VBUlQzX0RUUiAgKEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMjYpCisjZGVmaW5lIFBDMjdfQklOX1VBUlQzX0RDRCAgIChHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX0JJTiB8IDI3KQorI2RlZmluZSBQQzI4X0JJTl9VQVJUM19DVFMgICAoR1BJT19QT1JUQyB8IEdQSU9fT1VUIHwgR1BJT19CSU4gfCAyOCkKKyNkZWZpbmUgUEMyOV9BT1VUX1VBUlQzX1JUUyAgKEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMjkpCisjZGVmaW5lIFBDMzBfQklOX1VBUlQzX1RYICAgIChHUElPX1BPUlRDIHwgR1BJT19CSU4gfCAzMCkKKyNkZWZpbmUgUEMzMV9BT1VUX1VBUlQzX1JYICAgKEdQSU9fUE9SVEMgfCBHUElPX0lOIHwgMzEpCiAjZGVmaW5lIFBENl9QRl9MU0NMSyAgICAgICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgNikKICNkZWZpbmUgUEQ3X1BGX1JFViAgICAgICAgICAgKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgNykKLSNkZWZpbmUgUEQ3X0FGX1VBUlQyX0RUUiAgICAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEQgfCBHUElPX0lOIHwgR1BJT19BRiB8IDcpCi0jZGVmaW5lIFBEN19BSU5fU1BJMl9TQ0xLICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlREIHwgR1BJT19BSU4gfCA3KQorI2RlZmluZSBQRDdfQUZfVUFSVDJfRFRSICAgICAoR1BJT19QT1JURCB8IEdQSU9fSU4gfCBHUElPX0FGIHwgNykKKyNkZWZpbmUgUEQ3X0FJTl9TUEkyX1NDTEsgICAgKEdQSU9fUE9SVEQgfCBHUElPX0FJTiB8IDcpCiAjZGVmaW5lIFBEOF9QRl9DTFMgICAgICAgICAgIChHUElPX1BPUlREIHwgR1BJT19QRiB8IDgpCiAjZGVmaW5lIFBEOF9BRl9VQVJUMl9EQ0QgICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgOCkKLSNkZWZpbmUgUEQ4X0FJTl9TUEkyX1NTICAgICAgKEdQSU9fR0lVUyB8IEdQSU9fUE9SVEQgfCBHUElPX0FJTiB8IDgpCisjZGVmaW5lIFBEOF9BSU5fU1BJMl9TUyAgICAgIChHUElPX1BPUlREIHwgR1BJT19BSU4gfCA4KQogI2RlZmluZSBQRDlfUEZfUFMgICAgICAgICAgICAoR1BJT19QT1JURCB8IEdQSU9fUEYgfCA5KQogI2RlZmluZSBQRDlfQUZfVUFSVDJfUkkgICAgICAoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19BRiB8IDkpCi0jZGVmaW5lIFBEOV9BT1VUX1NQSTJfUlhEICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlREIHwgR1BJT19JTiB8IDkpCisjZGVmaW5lIFBEOV9BT1VUX1NQSTJfUlhEICAgIChHUElPX1BPUlREIHwgR1BJT19JTiB8IDkpCiAjZGVmaW5lIFBEMTBfUEZfU1BMX1NQUiAgICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTApCiAjZGVmaW5lIFBEMTBfQUZfVUFSVDJfRFNSICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgMTApCi0jZGVmaW5lIFBEMTBfQUlOX1NQSTJfVFhEICAgIChHUElPX0dJVVMgfCBHUElPX1BPUlREIHwgR1BJT19PVVQgfCAxMCkKKyNkZWZpbmUgUEQxMF9BSU5fU1BJMl9UWEQgICAgKEdQSU9fUE9SVEQgfCBHUElPX09VVCB8IDEwKQogI2RlZmluZSBQRDExX1BGX0NPTlRSQVNUICAgICAoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDExKQogI2RlZmluZSBQRDEyX1BGX0FDRF9PRSAgICAgICAoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDEyKQogI2RlZmluZSBQRDEzX1BGX0xQX0hTWU5DICAgICAoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDEzKQpAQCAtMjQzLDcgKzIzOCw3IEBACiAjZGVmaW5lIFBEMjlfUEZfTEQxNCAgICAgICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMjkpCiAjZGVmaW5lIFBEMzBfUEZfTEQxNSAgICAgICAgIChHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMzApCiAjZGVmaW5lIFBEMzFfUEZfVE1SMk9VVCAgICAgIChHUElPX1BPUlREIHwgR1BJT19QRiB8IDMxKQotI2RlZmluZSBQRDMxX0JJTl9TUEkyX1RYRCAgICAoR1BJT19HSVVTIHwgR1BJT19QT1JURCB8IEdQSU9fQklOIHwgMzEpCisjZGVmaW5lIFBEMzFfQklOX1NQSTJfVFhEICAgIChHUElPX1BPUlREIHwgR1BJT19CSU4gfCAzMSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfTVgyCkBAIC0yNzksNiArMjc0LDEyIEBACiAjZGVmaW5lIFBBMjlfUEZfVlNZTkMJCShHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMjkpCiAjZGVmaW5lIFBBMzBfUEZfQ09OVFJBU1QJKEdQSU9fUE9SVEEgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAzMCkKICNkZWZpbmUgUEEzMV9QRl9PRV9BQ0QJCShHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMzEpCisjZGVmaW5lIFBCNF9QRl9TRDJfRDAJCShHUElPX1BPUlRCIHwgR1BJT19QRiB8ICA0KQorI2RlZmluZSBQQjVfUEZfU0QyX0QxCQkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAgNSkKKyNkZWZpbmUgUEI2X1BGX1NEMl9EMgkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgIDYpCisjZGVmaW5lIFBCN19QRl9TRDJfRDMJCShHUElPX1BPUlRCIHwgR1BJT19QRiB8ICA3KQorI2RlZmluZSBQQjhfUEZfU0QyX0NNRAkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgIDgpCisjZGVmaW5lIFBCOV9QRl9TRDJfQ0xLCQkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAgOSkKICNkZWZpbmUgUEIxMF9QRl9DU0lfRDAJCShHUElPX1BPUlRCIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTApCiAjZGVmaW5lIFBCMTBfQUZfVUFSVDZfVFhECShHUElPX1BPUlRCIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgMTApCiAjZGVmaW5lIFBCMTFfUEZfQ1NJX0QxCQkoR1BJT19QT1JUQiB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDExKQpAQCAtMzE1LDYgKzMxNiwxMyBAQAogI2RlZmluZSBQQjMxX0FGX1VBUlQ0X1JYRAkoR1BJT19QT1JUQiB8IEdQSU9fSU4gIHwgR1BJT19BRiB8IDMxKQogI2RlZmluZSBQQzVfUEZfSTJDMl9TREEJCShHUElPX1BPUlRDIHwgR1BJT19JTiAgfCBHUElPX1BGIHwgNSkKICNkZWZpbmUgUEM2X1BGX0kyQzJfU0NMCQkoR1BJT19QT1JUQyB8IEdQSU9fSU4gIHwgR1BJT19QRiB8IDYpCisjZGVmaW5lIFBDN19QRl9VU0JPVEdfREFUQTUJKEdQSU9fUE9SVEMgfCBHUElPX09VVCB8IEdQSU9fUEYgfCA3KQorI2RlZmluZSBQQzhfUEZfVVNCT1RHX0RBVEE2CShHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgOCkKKyNkZWZpbmUgUEM5X1BGX1VTQk9UR19EQVRBMAkoR1BJT19QT1JUQyB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDkpCisjZGVmaW5lIFBDMTBfUEZfVVNCT1RHX0RBVEEyCShHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTApCisjZGVmaW5lIFBDMTFfUEZfVVNCT1RHX0RBVEExCShHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTEpCisjZGVmaW5lIFBDMTJfUEZfVVNCT1RHX0RBVEE0CShHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTIpCisjZGVmaW5lIFBDMTNfUEZfVVNCT1RHX0RBVEEzCShHUElPX1BPUlRDIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTMpCiAjZGVmaW5lIFBDMTZfUEZfU1NJNF9GUwkJKEdQSU9fUE9SVEMgfCBHUElPX0lOICB8IEdQSU9fUEYgfCAxNikKICNkZWZpbmUgUEMxN19QRl9TU0k0X1JYRAkoR1BJT19QT1JUQyB8IEdQSU9fSU4gIHwgR1BJT19QRiB8IDE3KQogI2RlZmluZSBQQzE4X1BGX1NTSTRfVFhECShHUElPX1BPUlRDIHwgR1BJT19JTiAgfCBHUElPX1BGIHwgMTgpCkBAIC0zNjUsNiArMzczLDkgQEAKICNkZWZpbmUgUEQzMF9QRl9DU1BJMV9NSVNPCShHUElPX1BPUlREIHwgR1BJT19JTiB8IEdQSU9fUEYgIHwgMzApCiAjZGVmaW5lIFBEMzFfUEZfQ1NQSTFfTU9TSQkoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiAgfCAzMSkKICNkZWZpbmUgUEYyM19BSU5fRkVDX1RYX0VOCShHUElPX1BPUlRGIHwgR1BJT19PVVQgfCBHUElPX0FJTiB8IDIzKQorI2RlZmluZSBQRTBfUEZfVVNCT1RHX05YVAkoR1BJT19QT1JURSB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDApCisjZGVmaW5lIFBFMV9QRl9VU0JPVEdfU1RQCShHUElPX1BPUlRFIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMSkKKyNkZWZpbmUgUEUyX1BGX1VTQk9UR19ESVIJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAyKQogI2RlZmluZSBQRTNfUEZfVUFSVDJfQ1RTCShHUElPX1BPUlRFIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMykKICNkZWZpbmUgUEU0X1BGX1VBUlQyX1JUUwkoR1BJT19QT1JURSB8IEdQSU9fSU4gIHwgR1BJT19QRiB8IDQpCiAjZGVmaW5lIFBFNl9QRl9VQVJUMl9UWEQJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fUEYgfCA2KQpAQCAtMzc5LDE4ICszOTAsMjcgQEAKICNkZWZpbmUgUEUxNV9QRl9VQVJUMV9SVFMJKEdQSU9fUE9SVEUgfCBHUElPX0lOICB8IEdQSU9fUEYgfCAxNSkKICNkZWZpbmUgUEUxNl9BRl9SVENLCQkoR1BJT19QT1JURSB8IEdQSU9fT1VUIHwgR1BJT19BRiB8IDE2KQogI2RlZmluZSBQRTE2X1BGX1JUQ0sJCShHUElPX1BPUlRFIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTYpCisjZGVmaW5lIFBFMThfUEZfU0RIQzFfRDAJKEdQSU9fUE9SVEUgfCBHUElPX1BGIHwgMTgpCiAjZGVmaW5lIFBFMThfQUZfQ1NQSTNfTUlTTwkoR1BJT19QT1JURSB8IEdQSU9fSU4gIHwgR1BJT19BRiB8IDE4KQorI2RlZmluZSBQRTE5X1BGX1NESEMxX0QxCShHUElPX1BPUlRFIHwgR1BJT19QRiB8IDE5KQorI2RlZmluZSBQRTIwX1BGX1NESEMxX0QyCShHUElPX1BPUlRFIHwgR1BJT19QRiB8IDIwKQorI2RlZmluZSBQRTIxX1BGX1NESEMxX0QzCShHUElPX1BPUlRFIHwgR1BJT19QRiB8IDIxKQogI2RlZmluZSBQRTIxX0FGX0NTUEkzX1NTCShHUElPX1BPUlRFIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgMjEpCisjZGVmaW5lIFBFMjJfUEZfU0RIQzFfQ01ECShHUElPX1BPUlRFIHwgR1BJT19QRiB8IDIyKQogI2RlZmluZSBQRTIyX0FGX0NTUEkzX01PU0kJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fQUYgfCAyMikKKyNkZWZpbmUgUEUyMl9QRl9TREhDMV9DTEsJKEdQSU9fUE9SVEUgfCBHUElPX1BGIHwgMjMpCiAjZGVmaW5lIFBFMjNfQUZfQ1NQSTNfU0NMSwkoR1BJT19QT1JURSB8IEdQSU9fT1VUIHwgR1BJT19BRiB8IDIzKQorI2RlZmluZSBQRTI0X1BGX1VTQk9UR19DTEsJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAyNCkKKyNkZWZpbmUgUEUyNV9QRl9VU0JPVEdfREFUQTcJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAyNSkKICNlbmRpZgogCiAvKiBkZWNvZGUgaXJxIG51bWJlciB0byB1c2Ugd2l0aCBJTVIoeCksIElTUih4KSBhbmQgZnJpZW5kcyAqLwotI2RlZmluZSBJUlFfVE9fUkVHKGlycSkgKChpcnEgLSBNWENfTUFYX0lOVF9MSU5FUykgPj4gNSkKKyNkZWZpbmUgSVJRX1RPX1JFRyhpcnEpICgoaXJxIC0gTVhDX0lOVEVSTkFMX0lSUVMpID4+IDUpCiAKLSNkZWZpbmUgSVJRX0dQSU9BKHgpICAoTVhDX01BWF9JTlRfTElORVMgKyB4KQorI2RlZmluZSBJUlFfR1BJT0EoeCkgIChNWENfR1BJT19JUlFfU1RBUlQgKyB4KQogI2RlZmluZSBJUlFfR1BJT0IoeCkgIChJUlFfR1BJT0EoMzIpICsgeCkKICNkZWZpbmUgSVJRX0dQSU9DKHgpICAoSVJRX0dQSU9CKDMyKSArIHgpCiAjZGVmaW5lIElSUV9HUElPRCh4KSAgKElSUV9HUElPQygzMikgKyB4KQorI2RlZmluZSBJUlFfR1BJT0UoeCkgIChJUlFfR1BJT0QoMzIpICsgeCkKIAogI2VuZGlmIC8qIF9NWENfR1BJT19NWDFfTVgyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaAppbmRleCBjOWYzOWMyLi5jOTE5OGMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oCkBAIC0xNDEsNyArMTQxLDcgQEAKIAkoKGlvbXV4X3BpbiAmIElPTVVYX0dQSU9OVU1fTUFTSykgPj4gSU9NVVhfR1BJT05VTV9TSElGVCkKICNkZWZpbmUgSU9NVVhfVE9fSVJRKGlvbXV4X3BpbikgXAogCSgoKGlvbXV4X3BpbiAmIElPTVVYX0dQSU9OVU1fTUFTSykgPj4gSU9NVVhfR1BJT05VTV9TSElGVCkgKyBcCi0JTVhDX0dQSU9fSU5UX0JBU0UpCisJTVhDX0dQSU9fSVJRX1NUQVJUKQogCiAvKgogICogVGhpcyBlbnVtZXJhdGlvbiBpcyBjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgU2VjdGlvbgpAQCAtNDkxLDYgKzQ5MSwxNCBAQAogI2RlZmluZSBNWDMxX1BJTl9SVFMxX19SVFMxCQlJT01VWF9NT0RFKE1YMzFfUElOX1JUUzEsIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9UWEQxX19UWEQxCQlJT01VWF9NT0RFKE1YMzFfUElOX1RYRDEsIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9SWEQxX19SWEQxCQlJT01VWF9NT0RFKE1YMzFfUElOX1JYRDEsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DVFMyX19DVFMyCQlJT01VWF9NT0RFKE1YMzFfUElOX0NUUzIsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9SVFMyX19SVFMyCQlJT01VWF9NT0RFKE1YMzFfUElOX1JUUzIsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9UWEQyX19UWEQyCQlJT01VWF9NT0RFKE1YMzFfUElOX1RYRDIsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9SWEQyX19SWEQyCQlJT01VWF9NT0RFKE1YMzFfUElOX1JYRDIsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9QQ19SU1RfX0NUUzUJCUlPTVVYX01PREUoTVgzMV9QSU5fUENfUlNULCBJT01VWF9DT05GSUdfQUxUMikKKyNkZWZpbmUgTVgzMV9QSU5fUENfVlMyX19SVFM1CQlJT01VWF9NT0RFKE1YMzFfUElOX1BDX1ZTMiwgSU9NVVhfQ09ORklHX0FMVDIpCisjZGVmaW5lIE1YMzFfUElOX1BDX0JWRDJfX1RYRDUJCUlPTVVYX01PREUoTVgzMV9QSU5fUENfQlZEMiwgSU9NVVhfQ09ORklHX0FMVDIpCisjZGVmaW5lIE1YMzFfUElOX1BDX0JWRDFfX1JYRDUJCUlPTVVYX01PREUoTVgzMV9QSU5fUENfQlZEMSwgSU9NVVhfQ09ORklHX0FMVDIpCiAjZGVmaW5lIE1YMzFfUElOX0NTUEkxX01PU0lfX01PU0kJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMV9NT1NJLCBJT01VWF9DT05GSUdfRlVOQykKICNkZWZpbmUgTVgzMV9QSU5fQ1NQSTFfTUlTT19fTUlTTwlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkxX01JU08sIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9DU1BJMV9TQ0xLX19TQ0xLCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTFfU0NMSywgSU9NVVhfQ09ORklHX0ZVTkMpCkBAIC01MDksNiArNTE3LDE1IEBACiAjZGVmaW5lIE1YMzFfUElOX0NTUEkzX01JU09fX01JU08JSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJM19NSVNPLCBJT01VWF9DT05GSUdfRlVOQykKICNkZWZpbmUgTVgzMV9QSU5fQ1NQSTNfU0NMS19fU0NMSwlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkzX1NDTEssIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9DU1BJM19TUElfUkRZX19TUElfUkRZCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTNfU1BJX1JEWSwgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX0JBVFRfTElORV9fT1dJUkUJSU9NVVhfTU9ERShNWDMxX1BJTl9CQVRUX0xJTkUsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DUzRfX0NTNAkJSU9NVVhfTU9ERShNWDMxX1BJTl9DUzQsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9TRDFfREFUQTNfX1NEMV9EQVRBMwlJT01VWF9NT0RFKE1YMzFfUElOX1NEMV9EQVRBMywgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX1NEMV9EQVRBMl9fU0QxX0RBVEEyCUlPTVVYX01PREUoTVgzMV9QSU5fU0QxX0RBVEEyLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fU0QxX0RBVEExX19TRDFfREFUQTEJSU9NVVhfTU9ERShNWDMxX1BJTl9TRDFfREFUQTEsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9TRDFfREFUQTBfX1NEMV9EQVRBMAlJT01VWF9NT0RFKE1YMzFfUElOX1NEMV9EQVRBMCwgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX1NEMV9DTEtfX1NEMV9DTEsJSU9NVVhfTU9ERShNWDMxX1BJTl9TRDFfQ0xLLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fU0QxX0NNRF9fU0QxX0NNRAlJT01VWF9NT0RFKE1YMzFfUElOX1NEMV9DTUQsIElPTVVYX0NPTkZJR19GVU5DKQorCiAvKlhYWDogVGhlIFNTMCwgU1MxLCBTUzIsIFNTMyBsaW5lcyBvZiBzcGkzIGFyZSBtdWx0aXBsZXhlZCBieSBjc3BpMl9zczAsIGNzcGkyX3NzMSwgY3NwaTFfc3MwCiAgKiBjc3BpMV9zczEqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBiNTViYmEzLi5lMDZkM2NiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTExLDcgKzExLDM3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX0lSUVNfSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0lSUVNfSF9fCiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisvKgorICogU28gZmFyIGFsbCBpLk1YIFNvQ3MgaGF2ZSA2NCBpbnRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KKyNkZWZpbmUgTVhDX0lOVEVSTkFMX0lSUVMJNjQKKworI2RlZmluZSBNWENfR1BJT19JUlFfU1RBUlQJTVhDX0lOVEVSTkFMX0lSUVMKKworI2lmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgxCisjZGVmaW5lIE1YQ19HUElPX0lSUVMJCSgzMiAqIDQpCisjZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMgorI2RlZmluZSBNWENfR1BJT19JUlFTCQkoMzIgKiA2KQorI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKKyNkZWZpbmUgTVhDX0dQSU9fSVJRUwkJKDMyICogMykKKyNlbmRpZgorCisvKgorICogVGhlIG5leHQgMTYgaW50ZXJydXB0cyBhcmUgZm9yIGJvYXJkIHNwZWNpZmljIHB1cnBvc2VzLiAgU2luY2UKKyAqIHRoZSBrZXJuZWwgY2FuIG9ubHkgcnVuIG9uIG9uZSBtYWNoaW5lIGF0IGEgdGltZSwgd2UgY2FuIHJlLXVzZQorICogdGhlc2UuICBJZiB5b3UgbmVlZCBtb3JlLCBpbmNyZWFzZSBNWENfQk9BUkRfSVJRUywgYnV0IGtlZXAgaXQKKyAqIHdpdGhpbiBzZW5zaWJsZSBsaW1pdHMuCisgKi8KKyNkZWZpbmUgTVhDX0JPQVJEX0lSUV9TVEFSVAkoTVhDX0lOVEVSTkFMX0lSUVMgKyBNWENfR1BJT19JUlFTKQorI2RlZmluZSBNWENfQk9BUkRfSVJRUwkxNgorCisjZGVmaW5lIE5SX0lSUVMJCShNWENfQk9BUkRfSVJRX1NUQVJUICsgTVhDX0JPQVJEX0lSUVMpCisKIGV4dGVybiB2b2lkIGlteF9pcnFfc2V0X3ByaW9yaXR5KHVuc2lnbmVkIGNoYXIgaXJxLCB1bnNpZ25lZCBjaGFyIHByaW8pOwogCisvKiBhbGwgbm9ybWFsIElSUXMgY2FuIGJlIEZJUXMgKi8KKyNkZWZpbmUgRklRX1NUQVJUCTAKKy8qIHN3aXRjaCBiZXR3ZWFuIElSUSBhbmQgRklRICovCitleHRlcm4gaW50IG14Y19zZXRfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSk7CisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19JUlFTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGQ3YThkM2UuLjBiODA4MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTExLDE5ICsxMSwxMiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19NRU1PUllfSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX01FTU9SWV9IX18KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotLyoKLSAqIFZpcnR1YWwgdmlldyA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCi0gKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYW4gYWRkcmVzcwotICogc3VpdGFibGUgdG8gYmUgcGFzc2VkIHRvIHNldF9kbWFfYWRkcigpCi0gKi8KLSNkZWZpbmUgX192aXJ0X3RvX2J1cyhhKQlfX3ZpcnRfdG9fcGh5cyhhKQotCi0vKgotICogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zIHRvIGFuIGFkZHJlc3MgdGhhdCB0aGUKLSAqIGtlcm5lbCBjYW4gdXNlLgotICovCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoYSkJX19waHlzX3RvX3ZpcnQoYSkKKyNpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMQorI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHgwODAwMDAwMCkKKyNlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgyCisjZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweEEwMDAwMDAwKQorI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKKyNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4ODAwMDAwMDApCisjZW5kaWYKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVhDX01FTU9SWV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9tdGQteGlwLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjFiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBNVEQgcHJpbWl0aXZlcyBmb3IgWElQIHN1cHBvcnQuIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqCisgKiBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuIEl0J3MgaW5jbHVkZWQgZnJvbSBsaW51eC9tdGQveGlwLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGFyaXVzIEF1Z3VsaXMgPGF1Z3VsaXMuZGFyaXVzQGdtYWlsLmNvbT4sIFRlbHRvbmlrYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxtYWNoL214Y190aW1lci5oPgorCisjaWZuZGVmIF9fQVJDSF9JTVhfTVREX1hJUF9IX18KKyNkZWZpbmUgX19BUkNIX0lNWF9NVERfWElQX0hfXworCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgxCisvKiBBSVRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBBSVRDX0JBU0UJSU9fQUREUkVTUyhBVklDX0JBU0VfQUREUikKKyNkZWZpbmUgTklQTkRICQkoQUlUQ19CQVNFICsgMHg1OCkKKyNkZWZpbmUgTklQTkRMCQkoQUlUQ19CQVNFICsgMHg1QykKKyNkZWZpbmUgSU5URU5BQkxFSAkoQUlUQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgSU5URU5BQkxFTAkoQUlUQ19CQVNFICsgMHgxNCkKKy8qIE1URCBtYWNyb3MgKi8KKyNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKSAoKF9fcmF3X3JlYWRsKElOVEVOQUJMRUgpICYgIF9fcmF3X3JlYWRsKE5JUE5ESCkpIFwKKwkJCXx8IChfX3Jhd19yZWFkbChJTlRFTkFCTEVMKSAmICBfX3Jhd19yZWFkbChOSVBOREwpKSkKKyNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCShfX3Jhd19yZWFkbChUSU1FUl9CQVNFICsgTVhDX1RDTikpCisjZGVmaW5lIHhpcF9lbGFwc2VkX3NpbmNlKHgpCShzaWduZWQpKChfX3Jhd19yZWFkbChUSU1FUl9CQVNFICsgTVhDX1RDTikgLSAoeCkpIC8gOTYpCisjZGVmaW5lIHhpcF9jcHVfaWRsZSgpCQlhc20gdm9sYXRpbGUgKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMwLCA0IiA6OiAiciIgKDApKQorI2VuZGlmIC8qIENPTkZJR19BUkNIX01YMSAqLworCisjZW5kaWYgLyogX19BUkNIX0lNWF9NVERfWElQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmUwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgxLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAorICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19NWDFfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX01YMV9IX18KKworI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19IQVJEV0FSRV9IX18KKyNlcnJvciAiRG8gbm90IGluY2x1ZGUgZGlyZWN0bHkuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWNoL3ZtYWxsb2MuaD4KKworLyoKKyAqIE1lbW9yeSBtYXAKKyAqLworI2RlZmluZSBJTVhfSU9fUEhZUwkweDAwMjAwMDAwCisjZGVmaW5lIElNWF9JT19TSVpFCTB4MDAxMDAwMDAKKyNkZWZpbmUgSU1YX0lPX0JBU0UJVk1BTExPQ19FTkQKKworI2RlZmluZSBJTVhfQ1MwX1BIWVMJMHgxMDAwMDAwMAorI2RlZmluZSBJTVhfQ1MwX1NJWkUJMHgwMjAwMDAwMAorCisjZGVmaW5lIElNWF9DUzFfUEhZUwkweDEyMDAwMDAwCisjZGVmaW5lIElNWF9DUzFfU0laRQkweDAxMDAwMDAwCisKKyNkZWZpbmUgSU1YX0NTMl9QSFlTCTB4MTMwMDAwMDAKKyNkZWZpbmUgSU1YX0NTMl9TSVpFCTB4MDEwMDAwMDAKKworI2RlZmluZSBJTVhfQ1MzX1BIWVMJMHgxNDAwMDAwMAorI2RlZmluZSBJTVhfQ1MzX1NJWkUJMHgwMTAwMDAwMAorCisjZGVmaW5lIElNWF9DUzRfUEhZUwkweDE1MDAwMDAwCisjZGVmaW5lIElNWF9DUzRfU0laRQkweDAxMDAwMDAwCisKKyNkZWZpbmUgSU1YX0NTNV9QSFlTCTB4MTYwMDAwMDAKKyNkZWZpbmUgSU1YX0NTNV9TSVpFCTB4MDEwMDAwMDAKKworLyoKKyAqICBSZWdpc3RlciBCQVNFcywgYmFzZWQgb24gT0ZGU0VUcworICovCisjZGVmaW5lIEFJUEkxX0JBU0VfQUREUgkJKDB4MDAwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgV0RUX0JBU0VfQUREUgkJKDB4MDEwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgVElNMV9CQVNFX0FERFIJCSgweDAyMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIFRJTTJfQkFTRV9BRERSCQkoMHgwMzAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBSVENfQkFTRV9BRERSCQkoMHgwNDAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBMQ0RDX0JBU0VfQUREUgkJKDB4MDUwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgVUFSVDFfQkFTRV9BRERSCQkoMHgwNjAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBVQVJUMl9CQVNFX0FERFIJCSgweDA3MDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIFBXTV9CQVNFX0FERFIJCSgweDA4MDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIERNQV9CQVNFX0FERFIJCSgweDA5MDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIEFJUEkyX0JBU0VfQUREUgkJKDB4MTAwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgU0lNX0JBU0VfQUREUgkJKDB4MTEwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgVVNCRF9CQVNFX0FERFIJCSgweDEyMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIFNQSTFfQkFTRV9BRERSCQkoMHgxMzAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBNTUNfQkFTRV9BRERSCQkoMHgxNDAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBBU1BfQkFTRV9BRERSCQkoMHgxNTAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBCVEFfQkFTRV9BRERSCQkoMHgxNjAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBJMkNfQkFTRV9BRERSCQkoMHgxNzAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBTU0lfQkFTRV9BRERSCQkoMHgxODAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBTUEkyX0JBU0VfQUREUgkJKDB4MTkwMDAgKyBJTVhfSU9fUEhZUykKKyNkZWZpbmUgTVNIQ19CQVNFX0FERFIJCSgweDFBMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIENDTV9CQVNFX0FERFIJCSgweDFCMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIFNDTV9CQVNFX0FERFIJCSgweDFCODA0ICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIEdQSU9fQkFTRV9BRERSCQkoMHgxQzAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBFSU1fQkFTRV9BRERSCQkoMHgyMDAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBTRFJBTUNfQkFTRV9BRERSCSgweDIxMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIE1NQV9CQVNFX0FERFIJCSgweDIyMDAwICsgSU1YX0lPX1BIWVMpCisjZGVmaW5lIEFWSUNfQkFTRV9BRERSCQkoMHgyMzAwMCArIElNWF9JT19QSFlTKQorI2RlZmluZSBDU0lfQkFTRV9BRERSCQkoMHgyNDAwMCArIElNWF9JT19QSFlTKQorCisvKiBtYWNybyB0byBnZXQgYXQgSU8gc3BhY2Ugd2hlbiBydW5uaW5nIHZpcnR1YWxseSAqLworI2RlZmluZSBJT19BRERSRVNTKHgpCSgoeCkgLSBJTVhfSU9fUEhZUyArIElNWF9JT19CQVNFKQorCisvKiBkZWZpbmUgbWFjcm9zIG5lZWRlZCBmb3IgZW50cnktbWFjcm8uUyAqLworI2RlZmluZSBBVklDX0lPX0FERFJFU1MoeCkJSU9fQUREUkVTUyh4KQorCisvKiBmaXhlZCBpbnRlcnJwdXQgbnVtYmVycyAqLworI2RlZmluZSBJTlRfU09GVElOVAkJMAorI2RlZmluZSBDU0lfSU5UCQkJNgorI2RlZmluZSBEU1BBX01BQ19JTlQJCTcKKyNkZWZpbmUgRFNQQV9JTlQJCTgKKyNkZWZpbmUgQ09NUF9JTlQJCTkKKyNkZWZpbmUgTVNIQ19YSU5UCQkxMAorI2RlZmluZSBHUElPX0lOVF9QT1JUQQkJMTEKKyNkZWZpbmUgR1BJT19JTlRfUE9SVEIJCTEyCisjZGVmaW5lIEdQSU9fSU5UX1BPUlRDCQkxMworI2RlZmluZSBMQ0RDX0lOVAkJMTQKKyNkZWZpbmUgU0lNX0lOVAkJCTE1CisjZGVmaW5lIFNJTV9EQVRBX0lOVAkJMTYKKyNkZWZpbmUgUlRDX0lOVAkJCTE3CisjZGVmaW5lIFJUQ19TQU1JTlQJCTE4CisjZGVmaW5lIFVBUlQyX01JTlRfUEZFUlIJMTkKKyNkZWZpbmUgVUFSVDJfTUlOVF9SVFMJCTIwCisjZGVmaW5lIFVBUlQyX01JTlRfRFRSCQkyMQorI2RlZmluZSBVQVJUMl9NSU5UX1VBUlRDCTIyCisjZGVmaW5lIFVBUlQyX01JTlRfVFgJCTIzCisjZGVmaW5lIFVBUlQyX01JTlRfUlgJCTI0CisjZGVmaW5lIFVBUlQxX01JTlRfUEZFUlIJMjUKKyNkZWZpbmUgVUFSVDFfTUlOVF9SVFMJCTI2CisjZGVmaW5lIFVBUlQxX01JTlRfRFRSCQkyNworI2RlZmluZSBVQVJUMV9NSU5UX1VBUlRDCTI4CisjZGVmaW5lIFVBUlQxX01JTlRfVFgJCTI5CisjZGVmaW5lIFVBUlQxX01JTlRfUlgJCTMwCisjZGVmaW5lIFZPSUNFX0RBQ19JTlQJCTMxCisjZGVmaW5lIFZPSUNFX0FEQ19JTlQJCTMyCisjZGVmaW5lIFBFTl9EQVRBX0lOVAkJMzMKKyNkZWZpbmUgUFdNX0lOVAkJCTM0CisjZGVmaW5lIFNESENfSU5UCQkzNQorI2RlZmluZSBJMkNfSU5UCQkJMzkKKyNkZWZpbmUgQ1NQSV9JTlQJCTQxCisjZGVmaW5lIFNTSV9UWF9JTlQJCTQyCisjZGVmaW5lIFNTSV9UWF9FUlJfSU5UCQk0MworI2RlZmluZSBTU0lfUlhfSU5UCQk0NAorI2RlZmluZSBTU0lfUlhfRVJSX0lOVAkJNDUKKyNkZWZpbmUgVE9VQ0hfSU5UCQk0NgorI2RlZmluZSBVU0JEX0lOVDAJCTQ3CisjZGVmaW5lIFVTQkRfSU5UMQkJNDgKKyNkZWZpbmUgVVNCRF9JTlQyCQk0OQorI2RlZmluZSBVU0JEX0lOVDMJCTUwCisjZGVmaW5lIFVTQkRfSU5UNAkJNTEKKyNkZWZpbmUgVVNCRF9JTlQ1CQk1MgorI2RlZmluZSBVU0JEX0lOVDYJCTUzCisjZGVmaW5lIEJUU1lTX0lOVAkJNTUKKyNkZWZpbmUgQlRUSU1fSU5UCQk1NgorI2RlZmluZSBCVFdVSV9JTlQJCTU3CisjZGVmaW5lIFRJTTJfSU5UCQk1OAorI2RlZmluZSBUSU0xX0lOVAkJNTkKKyNkZWZpbmUgRE1BX0VSUgkJCTYwCisjZGVmaW5lIERNQV9JTlQJCQk2MQorI2RlZmluZSBHUElPX0lOVF9QT1JURAkJNjIKKyNkZWZpbmUgV0RUX0lOVAkJCTYzCisKKy8qIGdwaW8gYW5kIGdwaW8gYmFzZWQgaW50ZXJydXB0IGhhbmRsaW5nICovCisjZGVmaW5lIEdQSU9fRFIJCSAJMHgxQworI2RlZmluZSBHUElPX0dESVIJIAkweDAwCisjZGVmaW5lIEdQSU9fUFNSCSAJMHgyNAorI2RlZmluZSBHUElPX0lDUjEJIAkweDI4CisjZGVmaW5lIEdQSU9fSUNSMgkgCTB4MkMKKyNkZWZpbmUgR1BJT19JTVIJIAkweDMwCisjZGVmaW5lIEdQSU9fSVNSCSAJMHgzNAorI2RlZmluZSBHUElPX0lOVF9MT1dfTEVWCTB4MworI2RlZmluZSBHUElPX0lOVF9ISUdIX0xFVgkweDIKKyNkZWZpbmUgR1BJT19JTlRfUklTRV9FREdFIAkweDAKKyNkZWZpbmUgR1BJT19JTlRfRkFMTF9FREdFCTB4MQorI2RlZmluZSBHUElPX0lOVF9OT05FCQkweDQKKworLyogRE1BICovCisjZGVmaW5lIERNQV9SRVFfVUFSVDNfVAkJMgorI2RlZmluZSBETUFfUkVRX1VBUlQzX1IJCTMKKyNkZWZpbmUgRE1BX1JFUV9TU0kyX1QJCTQKKyNkZWZpbmUgRE1BX1JFUV9TU0kyX1IJCTUKKyNkZWZpbmUgRE1BX1JFUV9DU0lfU1RBVAk2CisjZGVmaW5lIERNQV9SRVFfQ1NJX1IJCTcKKyNkZWZpbmUgRE1BX1JFUV9NU0hDCQk4CisjZGVmaW5lIERNQV9SRVFfRFNQQV9EQ1RfRE9VVAk5CisjZGVmaW5lIERNQV9SRVFfRFNQQV9EQ1RfRElOCTEwCisjZGVmaW5lIERNQV9SRVFfRFNQQV9NQUMJMTEKKyNkZWZpbmUgRE1BX1JFUV9FWFQJCTEyCisjZGVmaW5lIERNQV9SRVFfU0RIQwkJMTMKKyNkZWZpbmUgRE1BX1JFUV9TUEkxX1IJCTE0CisjZGVmaW5lIERNQV9SRVFfU1BJMV9UCQkxNQorI2RlZmluZSBETUFfUkVRX1NTSV9UCQkxNgorI2RlZmluZSBETUFfUkVRX1NTSV9SCQkxNworI2RlZmluZSBETUFfUkVRX0FTUF9EQUMJCTE4CisjZGVmaW5lIERNQV9SRVFfQVNQX0FEQwkJMTkKKyNkZWZpbmUgRE1BX1JFUV9VU1BfRVAoeCkJKDIwICsgKHgpKQorI2RlZmluZSBETUFfUkVRX1NQSTJfUgkJMjYKKyNkZWZpbmUgRE1BX1JFUV9TUEkyX1QJCTI3CisjZGVmaW5lIERNQV9SRVFfVUFSVDJfVAkJMjgKKyNkZWZpbmUgRE1BX1JFUV9VQVJUMl9SCQkyOQorI2RlZmluZSBETUFfUkVRX1VBUlQxX1QJCTMwCisjZGVmaW5lIERNQV9SRVFfVUFSVDFfUgkJMzEKKworLyogbWFuZGF0b3J5IGZvciBDT05GSUdfTExfREVCVUcgKi8KKyNkZWZpbmUgTVhDX0xMX1VBUlRfUEFERFIJVUFSVDFfQkFTRV9BRERSCisjZGVmaW5lIE1YQ19MTF9VQVJUX1ZBRERSCUlPX0FERFJFU1MoVUFSVDFfQkFTRV9BRERSKQorCisjZW5kaWYgLyogIF9fQVNNX0FSQ0hfTVhDX01YMV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oCmluZGV4IGE4NmRiNjQuLjAzMTNiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaApAQCAtNzIsNyArNzIsOCBAQAogLyogZm9yIG14MjcqLwogI2RlZmluZSBPVEdfQkFTRV9BRERSICAgICAgICAgICBVU0JPVEdfQkFTRV9BRERSCiAjZGVmaW5lIFNBSEFSQV9CQVNFX0FERFIgICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjUwMDApCi0jZGVmaW5lIEVNTUFfQkFTRV9BRERSICAgICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjY0MDApCisjZGVmaW5lIEVNTUFfUFBfQkFTRV9BRERSICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjYwMDApCisjZGVmaW5lIEVNTUFfUFJQX0JBU0VfQUREUiAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjY0MDApCiAjZGVmaW5lIENDTV9CQVNFX0FERFIgICAgICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjcwMDApCiAjZGVmaW5lIFNZU0NUUkxfQkFTRV9BRERSICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4Mjc4MDApCiAjZGVmaW5lIElJTV9CQVNFX0FERFIgICAgICAgICAgIChBSVBJX0JBU0VfQUREUiArIDB4MjgwMDApCkBAIC0yODgsMTYgKzI4OSw0IEBACiAvKiB0aGlzIENQVSBzdXBwb3J0cyB1cCB0byAxOTIgR1BJT3MgKGRvbid0IGZvcmdldCB0aGUgYmFzZWJvYXJkISkgKi8KICNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKDE5MiArIDE2KQogCi0vKiBPUyBjbG9jayB0aWNrIHJhdGUgKi8KLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFICAgICAgICAgMTMzMDAwMDAKLQotLyogU3RhcnQgb2YgUkFNICovCi0jZGVmaW5lIFBIWVNfT0ZGU0VUCQlTRFJBTV9CQVNFX0FERFIKLQotLyogbWF4IGludGVycnVwdCBsaW5lcyBjb3VudCAqLwotI2RlZmluZSBOUl9JUlFTCQkJMjU2Ci0KLS8qIGNvdW50IG9mIGludGVybmFsIGludGVycnVwdCBzb3VyY2VzICovCi0jZGVmaW5lIE1YQ19NQVhfSU5UX0xJTkVTCTY0Ci0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19NWDI3X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmgKaW5kZXggMDUzNmY4OS4uZGUwMjY2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oCkBAIC0xNSwxMSArMTUsNiBAQAogI2Vycm9yICJEbyBub3QgaW5jbHVkZSBkaXJlY3RseS4iCiAjZW5kaWYKIAotLyohCi0gKiBkZWZpbmVzIHRoZSBoYXJkd2FyZSBjbG9jayB0aWNrIHJhdGUKLSAqLwotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCTE2NjI1MDAwCi0KIC8qCiAgKiBNWDMxIG1lbW9yeSBtYXA6CiAgKgpAQCAtMjQ0LDkgKzIzOSw2IEBACiAjZGVmaW5lIFBDTUNJQV9JT19BRERSRVNTKHgpIFwKIAkoKCh4KSAtIFhfTUVNQ19CQVNFX0FERFIpICsgWF9NRU1DX0JBU0VfQUREUl9WSVJUKQogCi0vKiBTdGFydCBvZiBwaHlzaWNhbCBSQU0gLSBPbiBtYW55IE1YMzEgcGxhdGZvcm1zLCB0aGlzIGlzIHRoZSBmaXJzdCBTRFJBTSBiYW5rIChDU0QwKSAqLwotI2RlZmluZSBQSFlTX09GRlNFVCAgICAgICAgICAgICBDU0QwX0JBU0VfQUREUgotCiAvKgogICogSW50ZXJydXB0IG51bWJlcnMKICAqLwpAQCAtMzE1LDIzICszMDcsNiBAQAogI2RlZmluZSBNWENfSU5UX0VYVF9XRE9HCTYyCiAjZGVmaW5lIE1YQ19JTlRfRVhUX1RWCQk2MwogCi0jZGVmaW5lIE1YQ19NQVhfSU5UX0xJTkVTCTY0Ci0KLSNkZWZpbmUgTVhDX0dQSU9fSU5UX0JBU0UJTVhDX01BWF9JTlRfTElORVMKLSNkZWZpbmUgTVhDX01BWF9HUElPX0xJTkVTICAgICAgKEdQSU9fTlVNX1BJTiAqIEdQSU9fUE9SVF9OVU0pCi0jZGVmaW5lIE1YQ19NQVhfVklSVFVBTF9JTlRTCTE2Ci0KLSNkZWZpbmUgTlJfSVJRUyAoTVhDX01BWF9JTlRfTElORVMgKyBNWENfTUFYX0dQSU9fTElORVMgKyBNWENfTUFYX1ZJUlRVQUxfSU5UUykKLQotLyohCi0gKiBOdW1iZXIgb2YgR1BJTyBwb3J0IGFzIGRlZmluZWQgaW4gdGhlIElDIFNwZWMKLSAqLwotI2RlZmluZSBHUElPX1BPUlRfTlVNCQkzCi0vKiEKLSAqIE51bWJlciBvZiBHUElPIHBpbnMgcGVyIHBvcnQKLSAqLwotI2RlZmluZSBHUElPX05VTV9QSU4JCTMyCi0KICNkZWZpbmUgUFJPRF9TSUdOQVRVUkUJCTB4MQkvKiBGb3IgTVgzMSAqLwogCiAvKiBzaWxpY29uIHJldmlzaW9ucyBzcGVjaWZpYyB0byBpLk1YMzEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfdGltZXIuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfdGltZXIuaAppbmRleCAxMzBhZWJmLi42YzE5YTEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjX3RpbWVyLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Y190aW1lci5oCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0jaWZkZWYgQ09ORklHX0FSQ0hfSU1YCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgxCiAjZGVmaW5lIFRJTUVSX0JBU0UJCUlPX0FERFJFU1MoVElNMV9CQVNFX0FERFIpCiAjZGVmaW5lIFRJTUVSX0lOVEVSUlVQVAkJVElNMV9JTlQKIApAQCAtNjUsNyArNjUsNyBAQAogewogCV9fcmF3X3dyaXRlbCgwLCBUSU1FUl9CQVNFICsgTVhDX1RTVEFUKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9JTVggKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9NWDEgKi8KIAogI2lmZGVmIENPTkZJR19BUkNIX01YMgogI2RlZmluZSBUSU1FUl9CQVNFCQlJT19BRERSRVNTKEdQVDFfQkFTRV9BRERSKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCAwYjBhZjAyLi4wN2I0YTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMjAsNiArMjAsMTIgQEAKICNpZm5kZWYgX19BU01fQVJDSF9NWENfVElNRVhfSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX1RJTUVYX0hfXwogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgkvKiBmb3IgQ0xPQ0tfVElDS19SQVRFICovCisjaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDEKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkxNjAwMDAwMAorI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkxMzMwMDAwMAorI2VsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkxNjYyNTAwMAorI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX0FTTV9BUkNIX01YQ19USU1FWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2lvbXV4LW14MS1teDIuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2lvbXV4LW14MS1teDIuYwppbmRleCBkOTczODdhLi5kZjZmMTgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pb211eC1teDEtbXgyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW9tdXgtbXgxLW14Mi5jCkBAIC0xMTAsMTIgKzExMCwxMyBAQAogRVhQT1JUX1NZTUJPTChteGNfZ3Bpb19tb2RlKTsKIAogaW50IG14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoY29uc3QgaW50ICpwaW5fbGlzdCwgdW5zaWduZWQgY291bnQsCi0JCQkJaW50IGFsbG9jX21vZGUsIGNvbnN0IGNoYXIgKmxhYmVsKQorCQljb25zdCBjaGFyICpsYWJlbCkKIHsKIAljb25zdCBpbnQgKnAgPSBwaW5fbGlzdDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBncGlvOwogCXVuc2lnbmVkIG1vZGU7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlncGlvID0gKnAgJiAoR1BJT19QSU5fTUFTSyB8IEdQSU9fUE9SVF9NQVNLKTsKQEAgLTEyNCwzMyArMTI1LDMzIEBACiAJCWlmIChncGlvID49IChHUElPX1BPUlRfTUFYICsgMSkgKiAzMikKIAkJCWdvdG8gc2V0dXBfZXJyb3I7CiAKLQkJaWYgKGFsbG9jX21vZGUgJiBNWENfR1BJT19BTExPQ19NT0RFX1JFTEVBU0UpCi0JCQlncGlvX2ZyZWUoZ3Bpbyk7Ci0JCWVsc2UgaWYgKCEoYWxsb2NfbW9kZSAmIE1YQ19HUElPX0FMTE9DX01PREVfTk9fQUxMT0MpKQotCQkJaWYgKGdwaW9fcmVxdWVzdChncGlvLCBsYWJlbCkKLQkJCSAgICYmICEoYWxsb2NfbW9kZSAmIE1YQ19HUElPX0FMTE9DX01PREVfVFJZX0FMTE9DKSkKLQkJCQlnb3RvIHNldHVwX2Vycm9yOworCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3BpbywgbGFiZWwpOworCQlpZiAocmV0KQorCQkJZ290byBzZXR1cF9lcnJvcjsKIAotCQlpZiAoIShhbGxvY19tb2RlICYgKE1YQ19HUElPX0FMTE9DX01PREVfQUxMT0NfT05MWSB8Ci0JCQkJICAgIE1YQ19HUElPX0FMTE9DX01PREVfUkVMRUFTRSkpKQotCQkJbXhjX2dwaW9fbW9kZShncGlvIHwgbW9kZSk7CisJCW14Y19ncGlvX21vZGUoZ3BpbyB8IG1vZGUpOwogCiAJCXArKzsKIAl9CiAJcmV0dXJuIDA7CiAKIHNldHVwX2Vycm9yOgotCWlmIChhbGxvY19tb2RlICYgKE1YQ19HUElPX0FMTE9DX01PREVfTk9fQUxMT0MgfAotCSAgICBNWENfR1BJT19BTExPQ19NT0RFX1RSWV9BTExPQykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2hpbGUgKHAgIT0gcGluX2xpc3QpIHsKLQkJcC0tOwotCQlncGlvID0gKnAgJiAoR1BJT19QSU5fTUFTSyB8IEdQSU9fUE9SVF9NQVNLKTsKLQkJZ3Bpb19mcmVlKGdwaW8pOwotCX0KLQotCXJldHVybiAtRUlOVkFMOworCW14Y19ncGlvX3JlbGVhc2VfbXVsdGlwbGVfcGlucyhwaW5fbGlzdCwgaSk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyk7CiAKK3ZvaWQgbXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKGNvbnN0IGludCAqcGluX2xpc3QsIGludCBjb3VudCkKK3sKKwljb25zdCBpbnQgKnAgPSBwaW5fbGlzdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVuc2lnbmVkIGdwaW8gPSAqcCAmIChHUElPX1BJTl9NQVNLIHwgR1BJT19QT1JUX01BU0spOworCQlncGlvX2ZyZWUoZ3Bpbyk7CisJCXArKzsKKwl9CisKK30KK0VYUE9SVF9TWU1CT0wobXhjX2dwaW9fcmVsZWFzZV9tdWx0aXBsZV9waW5zKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaXJxLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9pcnEuYwppbmRleCBkODYyYzllLi42ZTc1NzhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pcnEuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pcnEuYwpAQCAtMTcsOSArMTcsMTIgQEAKICAqIE1BICAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNkZWZpbmUgQVZJQ19CQVNFCQlJT19BRERSRVNTKEFWSUNfQkFTRV9BRERSKQogI2RlZmluZSBBVklDX0lOVENOVEwJCShBVklDX0JBU0UgKyAweDAwKQkvKiBpbnQgY29udHJvbCByZWcgKi8KQEAgLTY1LDYgKzY4LDI4IEBACiBFWFBPUlRfU1lNQk9MKGlteF9pcnFfc2V0X3ByaW9yaXR5KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0ZJUQoraW50IG14Y19zZXRfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxdDsKKworCWlmIChpcnEgPj0gTVhDX0lOVEVSTkFMX0lSUVMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlycSA8IE1YQ19JTlRFUk5BTF9JUlFTIC8gMikgeworCQlpcnF0ID0gX19yYXdfcmVhZGwoQVZJQ19JTlRUWVBFTCkgJiB+KDEgPDwgaXJxKTsKKwkJX19yYXdfd3JpdGVsKGlycXQgfCAoISF0eXBlIDw8IGlycSksIEFWSUNfSU5UVFlQRUwpOworCX0gZWxzZSB7CisJCWlycSAtPSBNWENfSU5URVJOQUxfSVJRUyAvIDI7CisJCWlycXQgPSBfX3Jhd19yZWFkbChBVklDX0lOVFRZUEVIKSAmIH4oMSA8PCBpcnEpOworCQlfX3Jhd193cml0ZWwoaXJxdCB8ICghIXR5cGUgPDwgaXJxKSwgQVZJQ19JTlRUWVBFSCk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG14Y19zZXRfaXJxX2ZpcSk7CisjZW5kaWYgLyogQ09ORklHX0ZJUSAqLworCiAvKiBEaXNhYmxlIGludGVycnVwdCBudW1iZXIgImlycSIgaW4gdGhlIEFWSUMgKi8KIHN0YXRpYyB2b2lkIG14Y19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtOTEsNyArMTE2LDYgQEAKIHZvaWQgX19pbml0IG14Y19pbml0X2lycSh2b2lkKQogewogCWludCBpOwotCXUzMiByZWc7CiAKIAkvKiBwdXQgdGhlIEFWSUMgaW50byB0aGUgcmVzZXQgdmFsdWUgd2l0aAogCSAqIGFsbCBpbnRlcnJ1cHRzIGRpc2FibGVkCkBAIC0xMDYsNyArMTMwLDcgQEAKIAkvKiBhbGwgSVJRIG5vIEZJUSAqLwogCV9fcmF3X3dyaXRlbCgwLCBBVklDX0lOVFRZUEVIKTsKIAlfX3Jhd193cml0ZWwoMCwgQVZJQ19JTlRUWVBFTCk7Ci0JZm9yIChpID0gMDsgaSA8IE1YQ19NQVhfSU5UX0xJTkVTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTVhDX0lOVEVSTkFMX0lSUVM7IGkrKykgewogCQlzZXRfaXJxX2NoaXAoaSwgJm14Y19hdmljX2NoaXApOwogCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CkBAIC0xMTksNSArMTQzLDEwIEBACiAJLyogaW5pdCBhcmNoaXRlY3R1cmVzIGNoYWluZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlteGNfcmVnaXN0ZXJfZ3Bpb3MoKTsKIAorI2lmZGVmIENPTkZJR19GSVEKKwkvKiBJbml0aWFsaXplIEZJUSAqLworCWluaXRfRklRKCk7CisjZW5kaWYKKwogCXByaW50ayhLRVJOX0lORk8gIk1YQyBJUlEgaW5pdGlhbGl6ZWRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwppbmRleCBhOTRmMGM0Li40NmQzYjBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpAQCAtMTQsOSArMTQsMTEgQEAKIAogY29uZmlnIEFSQ0hfT01BUDIKIAlib29sICJUSSBPTUFQMiIKKwlzZWxlY3QgQ1BVX1Y2CiAKIGNvbmZpZyBBUkNIX09NQVAzCiAJYm9vbCAiVEkgT01BUDMiCisJc2VsZWN0IENQVV9WNwogCiBlbmRjaG9pY2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMKaW5kZXggZTMxMTU0Yi4uZjY2ODQ4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jCkBAIC02OSwxNSArNjksMTUgQEAKIAlzbWM5MXhfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gYWRkciArIDB4MzAwOwogCXNtYzkxeF9yZXNvdXJjZXNbMF0uZW5kICAgPSBhZGRyICsgMHgzMGY7CiAKLQlzbWM5MXhfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gT01BUF9HUElPX0lSUShncGlvKTsKLQlzbWM5MXhfcmVzb3VyY2VzWzFdLmVuZCAgID0gT01BUF9HUElPX0lSUShncGlvKTsKKwlzbWM5MXhfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJc21jOTF4X3Jlc291cmNlc1sxXS5lbmQgICA9IGdwaW9fdG9faXJxKGdwaW8pOwogCi0Jc3RhdHVzID0gb21hcF9yZXF1ZXN0X2dwaW8oZ3Bpbyk7CisJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJTTUM5MXggaXJxIik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJHUElPJWQgdW5hdmFpbGFibGUgZm9yIHNtYzkxeCBJUlFcbiIsIGdwaW8pOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihncGlvLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKIAogCWxlZF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBhZGRyOwogCWxlZF9yZXNvdXJjZXNbMF0uZW5kICAgPSBhZGRyICsgU1pfNEsgLSAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1sZWRzLmMKaW5kZXggMmY0YzBjYS4uYmU0ZWVmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctbGVkcy5jCkBAIC04Myw4ICs4Myw4IEBACiAJCS8qIGFsbCBsZWRzIG9mZiBkdXJpbmcgc3VzcGVuZCBvciBzaHV0ZG93biAqLwogCiAJCWlmICghKG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpIHx8IG1hY2hpbmVfaXNfb21hcF9oNCgpKSkgewotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fVElNRVIsIDApOwotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fSURMRSwgMCk7CisJCQlncGlvX3NldF92YWx1ZShHUElPX1RJTUVSLCAwKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fSURMRSwgMCk7CiAJCX0KIAogCQlfX3Jhd193cml0ZXcofjAsICZmcGdhLT5sZWRzKTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQlpZiAobWFjaGluZV9pc19vbWFwX3BlcnNldXMyKCkgfHwgbWFjaGluZV9pc19vbWFwX2g0KCkpCiAJCQlod19sZWRfc3RhdGUgXj0gSDJQMl9EQkdfRlBHQV9QMl9MRURfVElNRVI7CiAJCWVsc2UgewotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fVElNRVIsCisJCQlncGlvX3NldF92YWx1ZShHUElPX1RJTUVSLAogCQkJCQlsZWRfc3RhdGUgJiBMRURfVElNRVJfT04pOwogCQkJZ290byBkb25lOwogCQl9CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJaWYgKG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpIHx8IG1hY2hpbmVfaXNfb21hcF9oNCgpKQogCQkJaHdfbGVkX3N0YXRlICY9IH5IMlAyX0RCR19GUEdBX1AyX0xFRF9JRExFOwogCQllbHNlIHsKLQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChHUElPX0lETEUsIDEpOworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19JRExFLCAxKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJaWYgKG1hY2hpbmVfaXNfb21hcF9wZXJzZXVzMigpIHx8IG1hY2hpbmVfaXNfb21hcF9oNCgpKQogCQkJaHdfbGVkX3N0YXRlIHw9IEgyUDJfREJHX0ZQR0FfUDJfTEVEX0lETEU7CiAJCWVsc2UgewotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fSURMRSwgMCk7CisJCQlncGlvX3NldF92YWx1ZShHUElPX0lETEUsIDApOwogCQkJZ290byBkb25lOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jCmluZGV4IDBjYjJiMjIuLmFjMTVjMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYwpAQCAtMTkyLDIwMiArMTkyLDQ4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZglkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKSB8fCBcCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkgfHwgXAogCWRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IU19NT0RVTEUpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQotI2RlZmluZQlPTUFQX01NQzFfQkFTRQkJMHg0ODA5YzAwMAotI2RlZmluZQlPTUFQX01NQzFfRU5ECQkoT01BUF9NTUMxX0JBU0UgKyAweDFmYykKLSNkZWZpbmUJT01BUF9NTUMxX0lOVAkJSU5UXzI0WFhfTU1DX0lSUQorI2RlZmluZSBPTUFQX01NQ19OUl9SRVMJCTIKIAotI2RlZmluZQlPTUFQX01NQzJfQkFTRQkJMHg0ODBiNDAwMAotI2RlZmluZQlPTUFQX01NQzJfRU5ECQkoT01BUF9NTUMyX0JBU0UgKyAweDFmYykKLSNkZWZpbmUJT01BUF9NTUMyX0lOVAkJSU5UXzI0WFhfTU1DMl9JUlEKLQotI2Vsc2UKLQotI2RlZmluZQlPTUFQX01NQzFfQkFTRQkJMHhmZmZiNzgwMAotI2RlZmluZQlPTUFQX01NQzFfRU5ECQkoT01BUF9NTUMxX0JBU0UgKyAweDdmKQotI2RlZmluZSBPTUFQX01NQzFfSU5UCQlJTlRfTU1DCi0KLSNkZWZpbmUJT01BUF9NTUMyX0JBU0UJCTB4ZmZmYjdjMDAJLyogb21hcDE2eHggb25seSAqLwotI2RlZmluZQlPTUFQX01NQzJfRU5ECQkoT01BUF9NTUMyX0JBU0UgKyAweDdmKQotI2RlZmluZQlPTUFQX01NQzJfSU5UCQlJTlRfMTYxMF9NTUMyCi0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgbW1jMV9kYXRhOwotCi1zdGF0aWMgdTY0IG1tYzFfZG1hbWFzayA9IDB4ZmZmZmZmZmY7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jMV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAkJPSBPTUFQX01NQzFfQkFTRSwKLQkJLmVuZAkJPSBPTUFQX01NQzFfRU5ELAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydAkJPSBPTUFQX01NQzFfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1tY19vbWFwX2RldmljZTEgPSB7Ci0JLm5hbWUJCT0gIm1tY2ktb21hcCIsCi0JLmlkCQk9IDEsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrCT0gJm1tYzFfZG1hbWFzaywKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbW1jMV9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1tYzFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBtbWMxX3Jlc291cmNlcywKLX07Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKLQotc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhIG1tYzJfZGF0YTsKLQotc3RhdGljIHU2NCBtbWMyX2RtYW1hc2sgPSAweGZmZmZmZmZmOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG1tYzJfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJCT0gT01BUF9NTUMyX0JBU0UsCi0JCS5lbmQJCT0gT01BUF9NTUMyX0VORCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JewotCQkuc3RhcnQJCT0gT01BUF9NTUMyX0lOVCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtbWNfb21hcF9kZXZpY2UyID0gewotCS5uYW1lCQk9ICJtbWNpLW9tYXAiLAotCS5pZAkJPSAyLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzawk9ICZtbWMyX2RtYW1hc2ssCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJm1tYzJfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtbWMyX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gbW1jMl9yZXNvdXJjZXMsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbW1jX2NvbmYoY29uc3Qgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyAqbW1jX2NvbmYpCisvKgorICogUmVnaXN0ZXIgTU1DIGRldmljZXMuIENhbGxlZCBmcm9tIG1hY2gtb21hcDEgYW5kIG1hY2gtb21hcDIgZGV2aWNlIGluaXQuCisgKi8KK2ludCBfX2luaXQgb21hcF9tbWNfYWRkKGludCBpZCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCXVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICpkYXRhKQogewotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkKLQkJcmV0dXJuOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlc291cmNlIHJlc1tPTUFQX01NQ19OUl9SRVNdOworCWludCByZXQ7CiAKLQlpZiAobW1jX2NvbmYtPm1tY1swXS5lbmFibGVkKSB7Ci0JCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJb21hcF9jZmdfcmVnKEgxOF8yNFhYX01NQ19DTUQpOwotCQkJb21hcF9jZmdfcmVnKEgxNV8yNFhYX01NQ19DTEtJKTsKLQkJCW9tYXBfY2ZnX3JlZyhHMTlfMjRYWF9NTUNfQ0xLTyk7Ci0JCQlvbWFwX2NmZ19yZWcoRjIwXzI0WFhfTU1DX0RBVDApOwotCQkJb21hcF9jZmdfcmVnKEYxOV8yNFhYX01NQ19EQVRfRElSMCk7Ci0JCQlvbWFwX2NmZ19yZWcoRzE4XzI0WFhfTU1DX0NNRF9ESVIpOwotCQl9IGVsc2UgewotCQkJb21hcF9jZmdfcmVnKE1NQ19DTUQpOwotCQkJb21hcF9jZmdfcmVnKE1NQ19DTEspOwotCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQwKTsKLQkJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhNMTVfMTcxMF9NTUNfQ0xLSSk7Ci0JCQkJb21hcF9jZmdfcmVnKFAxOV8xNzEwX01NQ19DTURESVIpOwotCQkJCW9tYXBfY2ZnX3JlZyhQMjBfMTcxMF9NTUNfREFURElSMCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1tY19jb25mLT5tbWNbMF0ud2lyZTQpIHsKLQkJCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhIMTRfMjRYWF9NTUNfREFUMSk7Ci0JCQkJb21hcF9jZmdfcmVnKEUxOV8yNFhYX01NQ19EQVQyKTsKLQkJCQlvbWFwX2NmZ19yZWcoRDE5XzI0WFhfTU1DX0RBVDMpOwotCQkJCW9tYXBfY2ZnX3JlZyhFMjBfMjRYWF9NTUNfREFUX0RJUjEpOwotCQkJCW9tYXBfY2ZnX3JlZyhGMThfMjRYWF9NTUNfREFUX0RJUjIpOwotCQkJCW9tYXBfY2ZnX3JlZyhFMThfMjRYWF9NTUNfREFUX0RJUjMpOwotCQkJfSBlbHNlIHsKLQkJCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDEpOwotCQkJCS8qIE5PVEU6ICBEQVQyIGNhbiBiZSBvbiBXMTAgKGhlcmUpIG9yIE0xNSAqLwotCQkJCWlmICghbW1jX2NvbmYtPm1tY1swXS5ub211eCkKLQkJCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQyKTsKLQkJCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDMpOwotCQkJfQotCQl9Ci0JfQorCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIm1tY2ktb21hcCIsIGlkKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOwogCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUDE2WFgKLQkvKiBibG9jayAyIGlzIG9uIG5ld2VyIGNoaXBzLCBhbmQgaGFzIG1hbnkgcGlub3V0IG9wdGlvbnMgKi8KLQlpZiAobW1jX2NvbmYtPm1tY1sxXS5lbmFibGVkKSB7Ci0JCWlmICghbW1jX2NvbmYtPm1tY1sxXS5ub211eCkgewotCQkJb21hcF9jZmdfcmVnKFk4XzE2MTBfTU1DMl9DTUQpOwotCQkJb21hcF9jZmdfcmVnKFkxMF8xNjEwX01NQzJfQ0xLKTsKLQkJCW9tYXBfY2ZnX3JlZyhSMThfMTYxMF9NTUMyX0NMS0lOKTsKLQkJCW9tYXBfY2ZnX3JlZyhXOF8xNjEwX01NQzJfREFUMCk7Ci0JCQlpZiAobW1jX2NvbmYtPm1tY1sxXS53aXJlNCkgewotCQkJCW9tYXBfY2ZnX3JlZyhWOF8xNjEwX01NQzJfREFUMSk7Ci0JCQkJb21hcF9jZmdfcmVnKFcxNV8xNjEwX01NQzJfREFUMik7Ci0JCQkJb21hcF9jZmdfcmVnKFIxMF8xNjEwX01NQzJfREFUMyk7Ci0JCQl9CisJbWVtc2V0KHJlcywgMCwgT01BUF9NTUNfTlJfUkVTICogc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCXJlc1swXS5zdGFydCA9IGJhc2U7CisJcmVzWzBdLmVuZCA9IGJhc2UgKyBzaXplIC0gMTsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwlyZXNbMV0uc3RhcnQgPSByZXNbMV0uZW5kID0gaXJxOworCXJlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwogCi0JCQkvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciB0aGUgbGV2ZWwgc2hpZnRlciAqLwotCQkJb21hcF9jZmdfcmVnKFY5XzE2MTBfTU1DMl9DTURESVIpOwotCQkJb21hcF9jZmdfcmVnKFY1XzE2MTBfTU1DMl9EQVRESVIwKTsKLQkJCW9tYXBfY2ZnX3JlZyhXMTlfMTYxMF9NTUMyX0RBVERJUjEpOwotCQl9CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgcmVzLCBBUlJBWV9TSVpFKHJlcykpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIGRhdGEsIHNpemVvZigqZGF0YSkpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKIAotCQkvKiBGZWVkYmFjayBjbG9jayBtdXN0IGJlIHNldCBvbiBPTUFQLTE3MTAgTU1DMiAqLwotCQlpZiAoY3B1X2lzX29tYXAxNzEwKCkpCi0JCQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMSkgfCAoMSA8PCAyNCksCi0JCQkJICAgICBNT0RfQ09ORl9DVFJMXzEpOwotCX0KLSNlbmRpZgorCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCXJldHVybiAwOworCitmYWlsOgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaW5pdF9tbWModm9pZCkKLXsKLQljb25zdCBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnCSptbWNfY29uZjsKLQotCS8qIE5PVEU6ICBhc3N1bWVzIE1NQyB3YXMgbmV2ZXIgKHdyb25nbHkpIGVuYWJsZWQgKi8KLQltbWNfY29uZiA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19NTUMsIHN0cnVjdCBvbWFwX21tY19jb25maWcpOwotCWlmICghbW1jX2NvbmYpCi0JCXJldHVybjsKLQotCW9tYXBfaW5pdF9tbWNfY29uZihtbWNfY29uZik7Ci0KLQlpZiAobW1jX2NvbmYtPm1tY1swXS5lbmFibGVkKSB7Ci0JCW1tYzFfZGF0YS5jb25mID0gbW1jX2NvbmYtPm1tY1swXTsKLQkJKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbW1jX29tYXBfZGV2aWNlMSk7Ci0JfQotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgXAotCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCi0JaWYgKG1tY19jb25mLT5tbWNbMV0uZW5hYmxlZCkgewotCQltbWMyX2RhdGEuY29uZiA9IG1tY19jb25mLT5tbWNbMV07Ci0JCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1tY19vbWFwX2RldmljZTIpOwotCX0KLSNlbmRpZgotfQotCi12b2lkIG9tYXBfc2V0X21tY19pbmZvKGludCBob3N0LCBjb25zdCBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqaW5mbykKLXsKLQlzd2l0Y2ggKGhvc3QpIHsKLQljYXNlIDE6Ci0JCW1tYzFfZGF0YSA9ICppbmZvOwotCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKLQljYXNlIDI6Ci0JCW1tYzJfZGF0YSA9ICppbmZvOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLX0KLQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbW1jKHZvaWQpIHt9Ci12b2lkIG9tYXBfc2V0X21tY19pbmZvKGludCBob3N0LCBjb25zdCBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqaW5mbykge30KICNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTMyLDcgKzM3OCw2IEBACiAJICovCiAJb21hcF9pbml0X2RzcCgpOwogCW9tYXBfaW5pdF9rcCgpOwotCW9tYXBfaW5pdF9tbWMoKTsKIAlvbWFwX2luaXRfdXdpcmUoKTsKIAlvbWFwX2luaXRfd2R0KCk7CiAJb21hcF9pbml0X3JuZygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCmluZGV4IDUwZjhiNGEuLjY5MmQyYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKICNpbmNsdWRlIDxtYWNoL3RjLmg+CiAKQEAgLTE4NDgsOSArMTg0OCwyMiBAQAogCQlwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICAiRE1BIHN5bmNocm9uaXphdGlvbiBldmVudCBkcm9wIG9jY3VycmVkIHdpdGggZGV2aWNlICIKIAkJICAgICAgICIlZFxuIiwgZG1hX2NoYW5bY2hdLmRldl9pZCk7Ci0JaWYgKHVubGlrZWx5KHN0YXR1cyAmIE9NQVAyX0RNQV9UUkFOU19FUlJfSVJRKSkKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgT01BUDJfRE1BX1RSQU5TX0VSUl9JUlEpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkRNQSB0cmFuc2FjdGlvbiBlcnJvciB3aXRoIGRldmljZSAlZFxuIiwKIAkJICAgICAgIGRtYV9jaGFuW2NoXS5kZXZfaWQpOworCQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKKwkJCS8qIEVycmF0YTogc0RNQSBDaGFubmVsIGlzIG5vdCBkaXNhYmxlZAorCQkJICogYWZ0ZXIgYSB0cmFuc2FjdGlvbiBlcnJvci4gU28gd2UgZXhwbGljaXRlbHkKKwkJCSAqIGRpc2FibGUgdGhlIGNoYW5uZWwKKwkJCSAqLworCQkJdTMyIGNjcjsKKworCQkJY2NyID0gZG1hX3JlYWQoQ0NSKGNoKSk7CisJCQljY3IgJj0gfk9NQVBfRE1BX0NDUl9FTjsKKwkJCWRtYV93cml0ZShjY3IsIENDUihjaCkpOworCQkJZG1hX2NoYW5bY2hdLmZsYWdzICY9IH5PTUFQX0RNQV9BQ1RJVkU7CisJCX0KKwl9CiAJaWYgKHVubGlrZWx5KHN0YXR1cyAmIE9NQVAyX0RNQV9TRUNVUkVfRVJSX0lSUSkpCiAJCXByaW50ayhLRVJOX0lORk8gIkRNQSBzZWN1cmUgZXJyb3Igd2l0aCBkZXZpY2UgJWRcbiIsCiAJCSAgICAgICBkbWFfY2hhbltjaF0uZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCmluZGV4IDk2M2MzMWMuLmU0ZjBjZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYwpAQCAtNTM5LDEwICs1MzksNiBAQAogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9MT0FEX1JFRywgbG9hZCk7CiAKLQkvKiBSRVZJU0lUOiBodyBmZWF0dXJlLCB0dGdyIG92ZXJ0YWtpbmcgdGxkcj8gKi8KLQl3aGlsZSAocmVhZGwodGltZXItPmlvX2Jhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKSkKLQkJY3B1X3JlbGF4KCk7Ci0KIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9UUklHR0VSX1JFRywgMCk7CiB9CiAKQEAgLTU1MywxNCArNTQ5LDE1IEBACiAJdTMyIGw7CiAKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7Ci0JaWYgKGF1dG9yZWxvYWQpCisJaWYgKGF1dG9yZWxvYWQpIHsKIAkJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQVI7Ci0JZWxzZQorCQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9MT0FEX1JFRywgbG9hZCk7CisJfSBlbHNlIHsKIAkJbCAmPSB+T01BUF9USU1FUl9DVFJMX0FSOworCX0KIAlsIHw9IE9NQVBfVElNRVJfQ1RSTF9TVDsKIAogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBsb2FkKTsKLQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9MT0FEX1JFRywgbG9hZCk7CiAJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwppbmRleCA0MjQwNDlkLi4wN2I2OTY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKQEAgLTE1Miw2ICsxNTIsNyBAQAogCXUzMiBsZXZlbF9tYXNrOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3RydWN0IGNsayAqZGJjazsKIH07CiAKICNkZWZpbmUgTUVUSE9EX01QVUlPCQkwCkBAIC0yNDQsNiArMjQ1LDggQEAKIAkJcmV0dXJuICZncGlvX2JhbmtbZ3BpbyA+PiA1XTsKIAlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybiAmZ3Bpb19iYW5rW2dwaW8gPj4gNV07CisJQlVHKCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdldF9ncGlvX2luZGV4KGludCBncGlvKQpAQCAtMzMyLDE5ICszMzUsNiBAQAogCV9fcmF3X3dyaXRlbChsLCByZWcpOwogfQogCi12b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCi17Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm47Ci0JYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKLQlfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBpc19pbnB1dCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGF0YW91dChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CkBAIC00MDYsMjAgKzM5Niw3IEBACiAJX19yYXdfd3JpdGVsKGwsIHJlZyk7CiB9CiAKLXZvaWQgb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGludCBncGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuOwotCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7Ci0JX3NldF9ncGlvX2RhdGFvdXQoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pCitzdGF0aWMgaW50IF9fb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pCiB7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKIAl2b2lkIF9faW9tZW0gKnJlZzsKQEAgLTQ3Myw2ICs0NTAsNyBAQAogewogCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CiAJdm9pZCBfX2lvbWVtICpyZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsLCBsID0gMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKTsKIAogCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkKQEAgLTQ4MCwxNiArNDU4LDI4IEBACiAKIAliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKIAlyZWcgPSBiYW5rLT5iYXNlOwotCiAJcmVnICs9IE9NQVAyNFhYX0dQSU9fREVCT1VOQ0VfRU47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogCXZhbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAKLQlpZiAoZW5hYmxlKQorCWlmIChlbmFibGUgJiYgISh2YWwgJiBsKSkKIAkJdmFsIHw9IGw7Ci0JZWxzZQorCWVsc2UgaWYgKCFlbmFibGUgJiYgKHZhbCAmIGwpKQogCQl2YWwgJj0gfmw7CisJZWxzZQorCQlnb3RvIGRvbmU7CisKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCWNsa19lbmFibGUoYmFuay0+ZGJjayk7CisJCWVsc2UKKwkJCWNsa19kaXNhYmxlKGJhbmstPmRiY2spOworCX0KIAogCV9fcmF3X3dyaXRlbCh2YWwsIHJlZyk7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kZWJvdW5jZSk7CiAKQEAgLTkwNiwyNiArODk2LDE3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotaW50IG9tYXBfcmVxdWVzdF9ncGlvKGludCBncGlvKQorc3RhdGljIGludCBvbWFwX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBncGlvX2JhbmssIGNoaXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YXR1czsKIAotCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdGF0dXMgPSBncGlvX3JlcXVlc3QoZ3BpbywgTlVMTCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogCiAJLyogU2V0IHRyaWdnZXIgdG8gbm9uZS4gWW91IG5lZWQgdG8gZW5hYmxlIHRoZSBkZXNpcmVkIHRyaWdnZXIgd2l0aAogCSAqIHJlcXVlc3RfaXJxKCkgb3Igc2V0X2lycV90eXBlKCkuCiAJICovCi0JX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIElSUV9UWVBFX05PTkUpOworCV9zZXRfZ3Bpb190cmlnZ2VyaW5nKGJhbmssIG9mZnNldCwgSVJRX1RZUEVfTk9ORSk7CiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAogCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkgewpAQCAtOTMzLDcgKzkxNCw3IEBACiAKIAkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgTVBVICovCiAJCXJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MOwotCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwocmVnKSB8ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSwgcmVnKTsKKwkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKHJlZykgfCAoMSA8PCBvZmZzZXQpLCByZWcpOwogCX0KICNlbmRpZgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKQEAgLTk0MSwzOSArOTIyLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pCitzdGF0aWMgdm9pZCBvbWFwX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBncGlvX2JhbmssIGNoaXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCi0JCXJldHVybjsKLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFuay0+bG9jaywgZmxhZ3MpOwotCWlmICh1bmxpa2VseSghZ3Bpb2NoaXBfaXNfcmVxdWVzdGVkKCZiYW5rLT5jaGlwLAotCQkJCWdldF9ncGlvX2luZGV4KGdwaW8pKSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwotCQlwcmludGsoS0VSTl9FUlIgIm9tYXAtZ3BpbzogR1BJTyAlZCB3YXNuJ3QgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKLQkJZHVtcF9zdGFjaygpOwotCQlyZXR1cm47Ci0JfQogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CiAJCS8qIERpc2FibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCiAJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOwotCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgb2Zmc2V0LCByZWcpOwogCX0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKSB7CiAJCS8qIERpc2FibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCiAJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fQ0xFQVJXS1VFTkE7Ci0JCV9fcmF3X3dyaXRlbCgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCByZWcpOworCQlfX3Jhd193cml0ZWwoMSA8PCBvZmZzZXQsIHJlZyk7CiAJfQogI2VuZGlmCi0JX3Jlc2V0X2dwaW8oYmFuaywgZ3Bpbyk7CisJX3Jlc2V0X2dwaW8oYmFuaywgYmFuay0+Y2hpcC5iYXNlICsgb2Zmc2V0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYW5rLT5sb2NrLCBmbGFncyk7Ci0JZ3Bpb19mcmVlKGdwaW8pOwogfQogCiAvKgpAQCAtMTI1Miw3ICsxMjIyLDcgQEAKIAogc3RhdGljIGludCBncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0JcmV0dXJuIG9tYXBfZ2V0X2dwaW9fZGF0YWluKGNoaXAtPmJhc2UgKyBvZmZzZXQpOworCXJldHVybiBfX29tYXBfZ2V0X2dwaW9fZGF0YWluKGNoaXAtPmJhc2UgKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50IGdwaW9fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQpAQCAtMTI3OSw2ICsxMjQ5LDE0IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGdwaW9fMmlycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKworCWJhbmsgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGdwaW9fYmFuaywgY2hpcCk7CisJcmV0dXJuIGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0ICsgb2Zmc2V0OworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CkBAIC0xMjk2LDcgKzEyNzQsNiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQotc3RhdGljIHN0cnVjdCBjbGsgKmdwaW9fZmNsa3NbT01BUDM0WFhfTlJfR1BJT1NdOwogc3RhdGljIHN0cnVjdCBjbGsgKmdwaW9faWNsa3NbT01BUDM0WFhfTlJfR1BJT1NdOwogI2VuZGlmCiAKQEAgLTEzMTAsOSArMTI4Nyw3IEBACiAJaW50IGk7CiAJaW50IGdwaW8gPSAwOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKIAljaGFyIGNsa19uYW1lWzExXTsKLSNlbmRpZgogCiAJaW5pdGlhbGl6ZWQgPSAxOwogCkBAIC0xMzY3LDEyICsxMzQyLDYgQEAKIAkJCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBnZXQgJXNcbiIsIGNsa19uYW1lKTsKIAkJCWVsc2UKIAkJCQljbGtfZW5hYmxlKGdwaW9faWNsa3NbaV0pOwotCQkJc3ByaW50ZihjbGtfbmFtZSwgImdwaW8lZF9mY2siLCBpICsgMSk7Ci0JCQlncGlvX2ZjbGtzW2ldID0gY2xrX2dldChOVUxMLCBjbGtfbmFtZSk7Ci0JCQlpZiAoSVNfRVJSKGdwaW9fZmNsa3NbaV0pKQotCQkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGdldCAlc1xuIiwgY2xrX25hbWUpOwotCQkJZWxzZQotCQkJCWNsa19lbmFibGUoZ3Bpb19mY2xrc1tpXSk7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTE0NzksMTAgKzE0NDgsMTMgQEAKIAkJLyogUkVWSVNJVCBldmVudHVhbGx5IHN3aXRjaCBmcm9tIE9NQVAtc3BlY2lmaWMgZ3BpbyBzdHJ1Y3RzCiAJCSAqIG92ZXIgdG8gdGhlIGdlbmVyaWMgb25lcwogCQkgKi8KKwkJYmFuay0+Y2hpcC5yZXF1ZXN0ID0gb21hcF9ncGlvX3JlcXVlc3Q7CisJCWJhbmstPmNoaXAuZnJlZSA9IG9tYXBfZ3Bpb19mcmVlOwogCQliYW5rLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGdwaW9faW5wdXQ7CiAJCWJhbmstPmNoaXAuZ2V0ID0gZ3Bpb19nZXQ7CiAJCWJhbmstPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGdwaW9fb3V0cHV0OwogCQliYW5rLT5jaGlwLnNldCA9IGdwaW9fc2V0OworCQliYW5rLT5jaGlwLnRvX2lycSA9IGdwaW9fMmlycTsKIAkJaWYgKGJhbmtfaXNfbXB1aW8oYmFuaykpIHsKIAkJCWJhbmstPmNoaXAubGFiZWwgPSAibXB1aW8iOwogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCkBAIC0xNTExLDYgKzE0ODMsMTMgQEAKIAkJfQogCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihiYW5rLT5pcnEsIGdwaW9faXJxX2hhbmRsZXIpOwogCQlzZXRfaXJxX2RhdGEoYmFuay0+aXJxLCBiYW5rKTsKKworCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJCXNwcmludGYoY2xrX25hbWUsICJncGlvJWRfZGJjayIsIGkgKyAxKTsKKwkJCWJhbmstPmRiY2sgPSBjbGtfZ2V0KE5VTEwsIGNsa19uYW1lKTsKKwkJCWlmIChJU19FUlIoYmFuay0+ZGJjaykpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZ2V0ICVzXG4iLCBjbGtfbmFtZSk7CisJCX0KIAl9CiAKIAkvKiBFbmFibGUgc3lzdGVtIGNsb2NrIGZvciBHUElPIG1vZHVsZS4KQEAgLTE3MzksMTIgKzE3MTgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLUVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2dwaW8pOwotRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfZ3Bpbyk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kYXRhb3V0KTsKLUVYUE9SVF9TWU1CT0wob21hcF9nZXRfZ3Bpb19kYXRhaW4pOwotCiBhcmNoX2luaXRjYWxsKG9tYXBfZ3Bpb19zeXNpbml0KTsKIAogCkBAIC0xODAxLDE0ICsxNzc0LDE0IEBACiAJCQkJY29udGludWU7CiAKIAkJCWlycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0ICsgajsKLQkJCXZhbHVlID0gb21hcF9nZXRfZ3Bpb19kYXRhaW4oZ3Bpbyk7CisJCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlKGdwaW8pOwogCQkJaXNfaW4gPSBncGlvX2lzX2lucHV0KGJhbmssIG1hc2spOwogCiAJCQlpZiAoYmFua19pc19tcHVpbyhiYW5rKSkKIAkJCQlzZXFfcHJpbnRmKHMsICJNUFVJTyAlMmQgIiwgaik7CiAJCQllbHNlCiAJCQkJc2VxX3ByaW50ZihzLCAiR1BJTyAlM2QgIiwgZ3Bpbyk7Ci0JCQlzZXFfcHJpbnRmKHMsICIoJTEwcyk6ICVzICVzIiwKKwkJCXNlcV9wcmludGYocywgIiglLTIwLjIwcyk6ICVzICVzIiwKIAkJCQkJbGFiZWwsCiAJCQkJCWlzX2luID8gImluICIgOiAib3V0IiwKIAkJCQkJdmFsdWUgPyAiaGkiICA6ICJsbyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCmluZGV4IDBlNmQxNDcuLjg5YTZhYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKQEAgLTc5LDI2ICs3OSw0MyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9pMmNfbXV4X3BpbnMoaW50IGJ1c19pZCkKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorc3RhdGljIGNvbnN0IGludCBvbWFwMjR4eF9waW5zW11bMl0gPSB7CisJeyBNMTlfMjRYWF9JMkMxX1NDTCwgTDE1XzI0WFhfSTJDMV9TREEgfSwKKwl7IEoxNV8yNFhYX0kyQzJfU0NMLCBIMTlfMjRYWF9JMkMyX1NEQSB9LAorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgaW50IG9tYXAyNHh4X3BpbnNbXVsyXSA9IHt9OworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKK3N0YXRpYyBjb25zdCBpbnQgb21hcDM0eHhfcGluc1tdWzJdID0geworCXsgSzIxXzM0WFhfSTJDMV9TQ0wsIEoyMV8zNFhYX0kyQzFfU0RBfSwKKwl7IEFGMTVfMzRYWF9JMkMyX1NDTCwgQUUxNV8zNFhYX0kyQzJfU0RBfSwKKwl7IEFGMTRfMzRYWF9JMkMzX1NDTCwgQUcxNF8zNFhYX0kyQzNfU0RBfSwKK307CisjZWxzZQorc3RhdGljIGNvbnN0IGludCBvbWFwMzR4eF9waW5zW11bMl0gPSB7fTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9pMmNfbXV4X3BpbnMoaW50IGJ1cykKIHsKLQkvKiBUT0RPOiBNdXhpbmcgZm9yIE9NQVAzICovCi0Jc3dpdGNoIChidXNfaWQpIHsKLQljYXNlIDE6Ci0JCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQkJb21hcF9jZmdfcmVnKEkyQ19TQ0wpOwotCQkJb21hcF9jZmdfcmVnKEkyQ19TREEpOwotCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCQlvbWFwX2NmZ19yZWcoTTE5XzI0WFhfSTJDMV9TQ0wpOwotCQkJb21hcF9jZmdfcmVnKEwxNV8yNFhYX0kyQzFfU0RBKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQkJb21hcF9jZmdfcmVnKEoxNV8yNFhYX0kyQzJfU0NMKTsKLQkJCW9tYXBfY2ZnX3JlZyhIMTlfMjRYWF9JMkMyX1NEQSk7Ci0JCX0KLQkJYnJlYWs7CisJaW50IHNjbCwgc2RhOworCisJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CisJCXNjbCA9IEkyQ19TQ0w7CisJCXNkYSA9IEkyQ19TREE7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQlzY2wgPSBvbWFwMjR4eF9waW5zW2J1c11bMF07CisJCXNkYSA9IG9tYXAyNHh4X3BpbnNbYnVzXVsxXTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCXNjbCA9IG9tYXAzNHh4X3BpbnNbYnVzXVswXTsKKwkJc2RhID0gb21hcDM0eHhfcGluc1tidXNdWzFdOworCX0gZWxzZSB7CisJCXJldHVybjsKIAl9CisKKwlvbWFwX2NmZ19yZWcoc2RhKTsKKwlvbWFwX2NmZ19yZWcoc2NsKTsKIH0KIAogaW50IF9faW5pdCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCkBAIC0xNDIsNiArMTU5LDYgQEAKIAkJcmVzWzFdLnN0YXJ0ID0gaXJxOwogCX0KIAotCW9tYXBfaTJjX211eF9waW5zKGJ1c19pZCk7CisJb21hcF9pMmNfbXV4X3BpbnMoYnVzX2lkIC0gMSk7CiAJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihwZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtYXBvbGxvbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKaW5kZXggNzMxYzg1OC4uNjFiZDVlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKQEAgLTI5LDEyICsyOSwxNCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX09NQVBfQVBPTExPTl9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfT01BUF9BUE9MTE9OX0gKIAorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisKIGV4dGVybiB2b2lkIGFwb2xsb25fbW1jX2luaXQodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFwb2xsb25fcGx1cyh2b2lkKQogewogCS8qIFRoZSBhcG9sbG9uIHBsdXMgaGFzIElEQ09ERSByZXZpc2lvbiA1ICovCi0JcmV0dXJuIHN5c3RlbV9yZXYgJiAweGMwOworCXJldHVybiBvbWFwX3JldigpICYgMHhjMDsKIH0KIAogLyogUGxhY2Vob2xkZXIgZm9yIEFQT0xMT04gc3BlY2lmaWMgZGVmaW5lcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1oMi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1oMi5oCmluZGV4IDJhMDUwZTkuLjE1NTMxYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtaDIuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLWgyLmgKQEAgLTI5LDEzICsyOSwxMyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX09NQVBfSDJfSAogI2RlZmluZSBfX0FTTV9BUkNIX09NQVBfSDJfSAogCi0vKiBQbGFjZWhvbGRlciBmb3IgSDIgc3BlY2lmaWMgZGVmaW5lcyAqLwotCiAvKiBBdCBPTUFQMTYxMCBJbm5vdmF0b3IgdGhlIEV0aGVybmV0IGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBDUzEgKi8KICNkZWZpbmUgT01BUDE2MTBfRVRIUl9TVEFSVAkJMHgwNDAwMDMwMAogCisjZGVmaW5lIEgyX1RQU19HUElPX0JBU0UJCShPTUFQX01BWF9HUElPX0xJTkVTICsgMTYgLyogTVBVSU8gKi8pCisjCWRlZmluZSBIMl9UUFNfR1BJT19NTUNfUFdSX0VOCShIMl9UUFNfR1BJT19CQVNFICsgMykKKwogZXh0ZXJuIHZvaWQgaDJfbW1jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBoMl9tbWNfc2xvdF9jb3Zlcl9oYW5kbGVyKHZvaWQgKmFyZywgaW50IHN0YXRlKTsKIAogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVBfSDJfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLWxkcC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1sZHAuaAppbmRleCA2NmUyNzQ2Li5mMjMzOTk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLWxkcC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtbGRwLmgKQEAgLTMyLDUgKzMyLDggQEAKIGV4dGVybiB2b2lkIHR3bDQwMzBfYmNpX2JhdHRlcnlfaW5pdCh2b2lkKTsKIAogI2RlZmluZSBUV0w0MDMwX0lSUU5VTQkJSU5UXzM0WFhfU1lTX05JUlEKLQorI2RlZmluZSBMRFBfU01DOTExWF9DUyAgICAgICAgIDEKKyNkZWZpbmUgTERQX1NNQzkxMVhfR1BJTyAgICAgICAxNTIKKyNkZWZpbmUgREVCVUdfQkFTRSAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIE9NQVAzNFhYX0VUSFJfU1RBUlQgICAgREVCVUdfQkFTRQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfT01BUF9MRFBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oCmluZGV4IGMyM2MxMmMuLjk0NjY3NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmgKQEAgLTE2LDcgKzE2LDYgQEAKIAogLyogRGlmZmVyZW50IHBlcmlwaGVyYWwgaWRzICovCiAjZGVmaW5lIE9NQVBfVEFHX0NMT0NLCQkweDRmMDEKLSNkZWZpbmUgT01BUF9UQUdfTU1DCQkweDRmMDIKICNkZWZpbmUgT01BUF9UQUdfU0VSSUFMX0NPTlNPTEUgMHg0ZjAzCiAjZGVmaW5lIE9NQVBfVEFHX1VTQgkJMHg0ZjA0CiAjZGVmaW5lIE9NQVBfVEFHX0xDRAkJMHg0ZjA1CkBAIC0zNSwyNyArMzQsNiBAQAogCXU4IHN5c3RlbV9jbG9ja190eXBlOwogfTsKIAotc3RydWN0IG9tYXBfbW1jX2NvbmYgewotCXVuc2lnbmVkIGVuYWJsZWQ6MTsKLQkvKiBub211eCBtZWFucyAic3RhbmRhcmQiIG11eGluZyBpcyB3cm9uZyBvbiB0aGlzIGJvYXJkLCBhbmQgdGhhdAotCSAqIGJvYXJkLXNwZWNpZmljIGNvZGUgaGFuZGxlZCBpdCBiZWZvcmUgY29tbW9uIGluaXQgbG9naWMuCi0JICovCi0JdW5zaWduZWQgbm9tdXg6MTsKLQkvKiBzd2l0Y2ggcGluIGNhbiBiZSBmb3IgY2FyZCBkZXRlY3QgKGRlZmF1bHQpIG9yIGNhcmQgY292ZXIgKi8KLQl1bnNpZ25lZCBjb3ZlcjoxOwotCS8qIDQgd2lyZSBzaWduYWxpbmcgaXMgb3B0aW9uYWwsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFNEL1NESU8gKi8KLQl1bnNpZ25lZCB3aXJlNDoxOwotCS8qIHVzZSB0aGUgaW50ZXJuYWwgY2xvY2sgKi8KLQl1bnNpZ25lZCBpbnRlcm5hbF9jbG9jazoxOwotCXMxNiBwb3dlcl9waW47Ci0JczE2IHN3aXRjaF9waW47Ci0JczE2IHdwX3BpbjsKLX07Ci0KLXN0cnVjdCBvbWFwX21tY19jb25maWcgewotCXN0cnVjdCBvbWFwX21tY19jb25mIG1tY1syXTsKLX07Ci0KIHN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyB7CiAJdTggY29uc29sZV91YXJ0OwogCXUzMiBjb25zb2xlX3NwZWVkOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jb250cm9sLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NvbnRyb2wuaAppbmRleCBkYzk4ODY3Ni4uMjY5MTQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jb250cm9sLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jb250cm9sLmgKQEAgLTc0LDYgKzc0LDcgQEAKICNkZWZpbmUgT01BUDI0M1hfQ09OVFJPTF9JVkEyX0JPT1RBRERSCShPTUFQMl9DT05UUk9MX0dFTkVSQUwgKyAweDAxOTApCiAjZGVmaW5lIE9NQVAyNDNYX0NPTlRST0xfSVZBMl9CT09UTU9ECShPTUFQMl9DT05UUk9MX0dFTkVSQUwgKyAweDAxOTQpCiAjZGVmaW5lIE9NQVAyNDNYX0NPTlRST0xfSVZBMl9HRU1DRkcJKE9NQVAyX0NPTlRST0xfR0VORVJBTCArIDB4MDE5OCkKKyNkZWZpbmUgT01BUDI0M1hfQ09OVFJPTF9QQklBU19MSVRFCShPTUFQMl9DT05UUk9MX0dFTkVSQUwgKyAweDAyMzApCiAKIC8qIDI0eHgtb25seSBDT05UUk9MX0dFTkVSQUwgcmVnaXN0ZXIgb2Zmc2V0cyAqLwogI2RlZmluZSBPTUFQMjRYWF9DT05UUk9MX0RFQk9CUwkJKE9NQVAyX0NPTlRST0xfR0VORVJBTCArIDB4MDAwMCkKQEAgLTE0MCw2ICsxNDEsNyBAQAogI2RlZmluZSBPTUFQMzQzWF9DT05UUk9MX1RFU1RfS0VZXzEzCShPTUFQMl9DT05UUk9MX0dFTkVSQUwgKyAweDAwZmMpCiAjZGVmaW5lIE9NQVAzNDNYX0NPTlRST0xfSVZBMl9CT09UQUREUgkoT01BUDJfQ09OVFJPTF9HRU5FUkFMICsgMHgwMTkwKQogI2RlZmluZSBPTUFQMzQzWF9DT05UUk9MX0lWQTJfQk9PVE1PRAkoT01BUDJfQ09OVFJPTF9HRU5FUkFMICsgMHgwMTk0KQorI2RlZmluZSBPTUFQMzQzWF9DT05UUk9MX1BCSUFTX0xJVEUJKE9NQVAyX0NPTlRST0xfR0VORVJBTCArIDB4MDJiMCkKICNkZWZpbmUgT01BUDM0M1hfQ09OVFJPTF9URU1QX1NFTlNPUgkoT01BUDJfQ09OVFJPTF9HRU5FUkFMICsgMHgwMmI0KQogCiAvKgpAQCAtMTU0LDExICsxNTYsMTQgQEAKICAqIGFuZCB0aGUgc2VjdXJpdHkgbW9kZSAoc2VjdXJlLCBub24tc2VjdXJlLCBkb24ndCBjYXJlKQogICovCiAvKiBDT05UUk9MX0RFVkNPTkYwIGJpdHMgKi8KKyNkZWZpbmUgT01BUDJfTU1DU0RJTzFBRFBDTEtJU0VMCSgxIDw8IDI0KSAvKiBNTUMxIGxvb3AgYmFjayBjbG9jayAqLwogI2RlZmluZSBPTUFQMjRYWF9VU0JTVEFOREJZQ1RSTAkJKDEgPDwgMTUpCiAjZGVmaW5lIE9NQVAyX01DQlNQMl9DTEtTX01BU0sJCSgxIDw8IDYpCiAjZGVmaW5lIE9NQVAyX01DQlNQMV9DTEtTX01BU0sJCSgxIDw8IDIpCiAKIC8qIENPTlRST0xfREVWQ09ORjEgYml0cyAqLworI2RlZmluZSBPTUFQMjQzWF9NTUMxX0FDVElWRV9PVkVSV1JJVEUJKDEgPDwgMzEpCisjZGVmaW5lIE9NQVAyX01NQ1NESU8yQURQQ0xLSVNFTAkoMSA8PCA2KSAvKiBNTUMyIGxvb3AgYmFjayBjbG9jayAqLwogI2RlZmluZSBPTUFQMl9NQ0JTUDVfQ0xLU19NQVNLCQkoMSA8PCA0KSAvKiA+IDI0MnggKi8KICNkZWZpbmUgT01BUDJfTUNCU1A0X0NMS1NfTUFTSwkJKDEgPDwgMikgLyogPiAyNDJ4ICovCiAjZGVmaW5lIE9NQVAyX01DQlNQM19DTEtTX01BU0sJCSgxIDw8IDApIC8qID4gMjQyeCAqLwpAQCAtMTcyLDYgKzE3NywxOCBAQAogI2RlZmluZSBPTUFQMl9TWVNCT09UXzFfTUFTSwkJKDEgPDwgMSkKICNkZWZpbmUgT01BUDJfU1lTQk9PVF8wX01BU0sJCSgxIDw8IDApCiAKKy8qIENPTlRST0xfUEJJQVNfTElURSBiaXRzICovCisjZGVmaW5lIE9NQVAzNDNYX1BCSUFTTElURVNVUFBMWV9ISUdIMQkoMSA8PCAxNSkKKyNkZWZpbmUgT01BUDM0M1hfUEJJQVNMSVRFVk1PREVFUlJPUjEJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVAzNDNYX1BCSUFTU1BFRURDVFJMMQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDM0M1hfUEJJQVNMSVRFUFdSRE5aMQkoMSA8PCA5KQorI2RlZmluZSBPTUFQMzQzWF9QQklBU0xJVEVWTU9ERTEJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDM0M1hfUEJJQVNMSVRFU1VQUExZX0hJR0gwCSgxIDw8IDcpCisjZGVmaW5lIE9NQVAzNDNYX1BCSUFTTElURVZNT0RFRVJST1IwCSgxIDw8IDMpCisjZGVmaW5lIE9NQVAyX1BCSUFTU1BFRURDVFJMMAkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDJfUEJJQVNMSVRFUFdSRE5aMAkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDJfUEJJQVNMSVRFVk1PREUwCQkoMSA8PCAwKQorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCiBleHRlcm4gdm9pZCBfX2lvbWVtICpvbWFwX2N0cmxfYmFzZV9nZXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCBlMDQ2NDE4Li5iMjA2MmYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTI4LDEzICsyOCwxOCBAQAogCiBzdHJ1Y3Qgb21hcF9jaGlwX2lkIHsKIAl1OCBvYzsKKwl1OCB0eXBlOwogfTsKIAogI2RlZmluZSBPTUFQX0NISVBfSU5JVCh4KQl7IC5vYyA9IHggfQogCi1leHRlcm4gdW5zaWduZWQgaW50IHN5c3RlbV9yZXY7Ci0KLSNkZWZpbmUgb21hcDJfY3B1X3JldigpCQkoKHN5c3RlbV9yZXYgPj4gMTIpICYgMHgwZikKKy8qCisgKiBvbWFwX3JldiBiaXRzOgorICogQ1BVIGlkIGJpdHMJKDA3MzAsIDE1MTAsIDE3MTAsIDI0MjIuLi4pCVszMToxNl0KKyAqIENQVSByZXZpc2lvbgkoU2VlIF9SRVZfIGRlZmluZWQgaW4gY3B1LmgpCVsxNTowOF0KKyAqIENQVSBjbGFzcyBiaXRzICgxNXh4LCAxNnh4LCAyNHh4LCAzNHh4Li4uKQlbMDc6MDBdCisgKi8KK3Vuc2lnbmVkIGludCBvbWFwX3Jldih2b2lkKTsKIAogLyoKICAqIFRlc3QgaWYgbXVsdGljb3JlIE9NQVAgc3VwcG9ydCBpcyBuZWVkZWQKQEAgLTEwOCw3ICsxMTMsNyBAQAogICogY3B1X2lzX29tYXAyNDN4KCk6CVRydWUgZm9yIE9NQVAyNDMwCiAgKiBjcHVfaXNfb21hcDM0M3goKToJVHJ1ZSBmb3IgT01BUDM0MzAKICAqLwotI2RlZmluZSBHRVRfT01BUF9DTEFTUwkoKHN5c3RlbV9yZXYgPj4gMjQpICYgMHhmZikKKyNkZWZpbmUgR0VUX09NQVBfQ0xBU1MJKG9tYXBfcmV2KCkgJiAweGZmKQogCiAjZGVmaW5lIElTX09NQVBfQ0xBU1MoY2xhc3MsIGlkKQkJCVwKIHN0YXRpYyBpbmxpbmUgaW50IGlzX29tYXAgIyNjbGFzcyAodm9pZCkJCVwKQEAgLTExNiw3ICsxMjEsNyBAQAogCXJldHVybiAoR0VUX09NQVBfQ0xBU1MgPT0gKGlkKSkgPyAxIDogMDsJXAogfQogCi0jZGVmaW5lIEdFVF9PTUFQX1NVQkNMQVNTCSgoc3lzdGVtX3JldiA+PiAyMCkgJiAweDBmZmYpCisjZGVmaW5lIEdFVF9PTUFQX1NVQkNMQVNTCSgob21hcF9yZXYoKSA+PiAyMCkgJiAweDBmZmYpCiAKICNkZWZpbmUgSVNfT01BUF9TVUJDTEFTUyhzdWJjbGFzcywgaWQpCQkJXAogc3RhdGljIGlubGluZSBpbnQgaXNfb21hcCAjI3N1YmNsYXNzICh2b2lkKQkJXApAQCAtMjI2LDcgKzIzMSw3IEBACiAgKiBjcHVfaXNfb21hcDI0MzAoKToJVHJ1ZSBmb3IgT01BUDI0MzAKICAqIGNwdV9pc19vbWFwMzQzMCgpOglUcnVlIGZvciBPTUFQMzQzMAogICovCi0jZGVmaW5lIEdFVF9PTUFQX1RZUEUJKChzeXN0ZW1fcmV2ID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgR0VUX09NQVBfVFlQRQkoKG9tYXBfcmV2KCkgPj4gMTYpICYgMHhmZmZmKQogCiAjZGVmaW5lIElTX09NQVBfVFlQRSh0eXBlLCBpZCkJCQkJXAogc3RhdGljIGlubGluZSBpbnQgaXNfb21hcCAjI3R5cGUgKHZvaWQpCQkJXApAQCAtMzIwLDQ0ICszMjUsMjAgQEAKICNkZWZpbmUgY3B1X2NsYXNzX2lzX29tYXAyKCkJKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKQogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKLS8qCi0gKiBNYWNyb3MgdG8gZGV0ZWN0IHNpbGljb24gcmV2aXNpb24gb2YgT01BUDIvMyBwcm9jZXNzb3JzLgotICogaXNfc2lsX3Jldl9ncmVhdGVyX3RoYW46CXRydWUgaWYgcGFzc2VkIGNwdSB0eXBlICYgaXRzIHJldiBpcyBncmVhdGVyLgotICogaXNfc2lsX3Jldl9sZXNzZXJfdGhhbjoJdHJ1ZSBpZiBwYXNzZWQgY3B1IHR5cGUgJiBpdHMgcmV2IGlzIGxlc3Nlci4KLSAqIGlzX3NpbF9yZXZfZXF1YWxfdG86CQl0cnVlIGlmIHBhc3NlZCBjcHUgdHlwZSAmIGl0cyByZXYgaXMgZXF1YWwuCi0gKiBnZXRfc2lsX3JldjoJCQlyZXR1cm4gdGhlIHNpbGljb24gcmV2IHZhbHVlLgotICovCi0jZGVmaW5lIGdldF9zaWxfb21hcF90eXBlKHJldikJKChyZXYgJiAweGZmZmYwMDAwKSA+PiAxNikKLSNkZWZpbmUgZ2V0X3NpbF9yZXZpc2lvbihyZXYpCSgocmV2ICYgMHgwMDAwZjAwMCkgPj4gMTIpCiAKLSNkZWZpbmUgaXNfc2lsX3Jldl9ncmVhdGVyX3RoYW4ocmV2KSBcCi0JCSgoZ2V0X3NpbF9vbWFwX3R5cGUoc3lzdGVtX3JldikgPT0gZ2V0X3NpbF9vbWFwX3R5cGUocmV2KSkgJiYgXAotCQkoZ2V0X3NpbF9yZXZpc2lvbihzeXN0ZW1fcmV2KSA+IGdldF9zaWxfcmV2aXNpb24ocmV2KSkpCisvKiBWYXJpb3VzIHNpbGljb24gcmV2aXNpb25zIGZvciBvbWFwMiAqLworI2RlZmluZSBPTUFQMjQyWF9DTEFTUwkJMHgyNDIwMDAyNAorI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMxXzAJMHgyNDIwMDAyNAorI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMyXzAJMHgyNDIwMTAyNAogCi0jZGVmaW5lIGlzX3NpbF9yZXZfbGVzc190aGFuKHJldikgXAotCQkoKGdldF9zaWxfb21hcF90eXBlKHN5c3RlbV9yZXYpID09IGdldF9zaWxfb21hcF90eXBlKHJldikpICYmIFwKLQkJKGdldF9zaWxfcmV2aXNpb24oc3lzdGVtX3JldikgPCBnZXRfc2lsX3JldmlzaW9uKHJldikpKQorI2RlZmluZSBPTUFQMjQzWF9DTEFTUwkJMHgyNDMwMDAyNAorI2RlZmluZSBPTUFQMjQzMF9SRVZfRVMxXzAJMHgyNDMwMDAyNAogCi0jZGVmaW5lIGlzX3NpbF9yZXZfZXF1YWxfdG8ocmV2KSBcCi0JCSgoZ2V0X3NpbF9vbWFwX3R5cGUoc3lzdGVtX3JldikgPT0gZ2V0X3NpbF9vbWFwX3R5cGUocmV2KSkgJiYgXAotCQkoZ2V0X3NpbF9yZXZpc2lvbihzeXN0ZW1fcmV2KSA9PSBnZXRfc2lsX3JldmlzaW9uKHJldikpKQotCi0jZGVmaW5lIGdldF9zaWxfcmV2KCkgXAotCQlnZXRfc2lsX3JldmlzaW9uKHN5c3RlbV9yZXYpCi0KLS8qIFZhcmlvdXMgc2lsaWNvbiBtYWNyb3MgZGVmaW5lZCBoZXJlICovCi0jZGVmaW5lIE9NQVAyNDJYX0NMQVNTCQkweDI0MjAwMDAwCi0jZGVmaW5lIE9NQVAyNDIwX1JFVl9FUzFfMAkweDI0MjAwMDAwCi0jZGVmaW5lIE9NQVAyNDIwX1JFVl9FUzJfMAkweDI0MjAxMDAwCi0KLSNkZWZpbmUgT01BUDI0M1hfQ0xBU1MJCTB4MjQzMDAwMDAKLSNkZWZpbmUgT01BUDI0MzBfUkVWX0VTMV8wCTB4MjQzMDAwMDAKLQotI2RlZmluZSBPTUFQMzQzWF9DTEFTUwkJMHgzNDMwMDAwMAotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMxXzAJMHgzNDMwMDAwMAotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzAJMHgzNDMwMTAwMAotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzEJMHgzNDMwMjAwMAotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzIJMHgzNDMwMzAwMAorI2RlZmluZSBPTUFQMzQzWF9DTEFTUwkJMHgzNDMwMDAzNAorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMxXzAJMHgzNDMwMDAzNAorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzAJMHgzNDMwMTAzNAorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzEJMHgzNDMwMjAzNAorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMzXzAJMHgzNDMwMzAzNAogCiAvKgogICogb21hcF9jaGlwIGJpdHMKQEAgLTM4MiwyMyArMzYzLDE2IEBACiAjZGVmaW5lIENISVBfSVNfT01BUDI0WFggICAgICAgKENISVBfSVNfT01BUDI0MjAgfCBDSElQX0lTX09NQVAyNDMwKQogCiBpbnQgb21hcF9jaGlwX2lzKHN0cnVjdCBvbWFwX2NoaXBfaWQgb2NpKTsKLQoraW50IG9tYXBfdHlwZSh2b2lkKTsKIAogLyoKICAqIE1hY3JvIHRvIGRldGVjdCBkZXZpY2UgdHlwZSBpLmUuIEVNVS9IUy9UU1QvR1AvQkFECiAgKi8KLSNkZWZpbmUgREVWSUNFX1RZUEVfVEVTVAkwCi0jZGVmaW5lIERFVklDRV9UWVBFX0VNVQkJMQotI2RlZmluZSBERVZJQ0VfVFlQRV9TRUMJCTIKLSNkZWZpbmUgREVWSUNFX1RZUEVfR1AJCTMKLSNkZWZpbmUgREVWSUNFX1RZUEVfQkFECQk0Ci0KLSNkZWZpbmUgZ2V0X2RldmljZV90eXBlKCkJKChzeXN0ZW1fcmV2ICYgMHg3MDApID4+IDgpCi0jZGVmaW5lIGlzX2RldmljZV90eXBlX3Rlc3QoKQkoZ2V0X2RldmljZV90eXBlKCkgPT0gREVWSUNFX1RZUEVfVEVTVCkKLSNkZWZpbmUgaXNfZGV2aWNlX3R5cGVfZW11KCkJKGdldF9kZXZpY2VfdHlwZSgpID09IERFVklDRV9UWVBFX0VNVSkKLSNkZWZpbmUgaXNfZGV2aWNlX3R5cGVfc2VjKCkJKGdldF9kZXZpY2VfdHlwZSgpID09IERFVklDRV9UWVBFX1NFQykKLSNkZWZpbmUgaXNfZGV2aWNlX3R5cGVfZ3AoKQkoZ2V0X2RldmljZV90eXBlKCkgPT0gREVWSUNFX1RZUEVfR1ApCi0jZGVmaW5lIGlzX2RldmljZV90eXBlX2JhZCgpCShnZXRfZGV2aWNlX3R5cGUoKSA9PSBERVZJQ0VfVFlQRV9CQUQpCisjZGVmaW5lIE9NQVAyX0RFVklDRV9UWVBFX1RFU1QJCTAKKyNkZWZpbmUgT01BUDJfREVWSUNFX1RZUEVfRU1VCQkxCisjZGVmaW5lIE9NQVAyX0RFVklDRV9UWVBFX1NFQwkJMgorI2RlZmluZSBPTUFQMl9ERVZJQ0VfVFlQRV9HUAkJMworI2RlZmluZSBPTUFQMl9ERVZJQ0VfVFlQRV9CQUQJCTQKIAogdm9pZCBvbWFwMl9jaGVja19yZXZpc2lvbih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA5OGU5MDA4Li4wNGU2OGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtNzEsMTEgKzcxLDYgQEAKIAkJCQkgSUhfR1BJT19CQVNFICsgKG5yKSkKIAogZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsJLyogQ2FsbCBmcm9tIGJvYXJkIGluaXQgb25seSAqLwotZXh0ZXJuIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBvbWFwX2ZyZWVfZ3BpbyhpbnQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihpbnQgZ3BpbywgaW50IGlzX2lucHV0KTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSk7Ci1leHRlcm4gaW50IG9tYXBfZ2V0X2dwaW9fZGF0YWluKGludCBncGlvKTsKIGV4dGVybiB2b2lkIG9tYXAyX2dwaW9fcHJlcGFyZV9mb3JfcmV0ZW50aW9uKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDJfZ3Bpb19yZXN1bWVfYWZ0ZXJfcmV0ZW50aW9uKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kZWJvdW5jZShpbnQgZ3BpbywgaW50IGVuYWJsZSk7CkBAIC05Miw2ICs4NywxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgogCitzdGF0aWMgaW5saW5lIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3BpbykKK3sKKwlyZXR1cm4gZ3Bpb19yZXF1ZXN0KGdwaW8sICJGSVhNRSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pCit7CisJZ3Bpb19mcmVlKGdwaW8pOworfQorCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewogCXJldHVybiBfX2dwaW9fZ2V0X3ZhbHVlKGdwaW8pOwpAQCAtMTA5LDE2ICsxMTQsMjQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKIHsKLQlpZiAoZ3BpbyA8IChPTUFQX01BWF9HUElPX0xJTkVTICsgMTYpKQotCQlyZXR1cm4gT01BUF9HUElPX0lSUShncGlvKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19ncGlvX3RvX2lycShncGlvKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQogeworCWludCB0bXA7CisKKwkvKiBvbWFwMSBTT0MgbXB1aW8gKi8KIAlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkgJiYgKGlycSA8IChJSF9NUFVJT19CQVNFICsgMTYpKSkKIAkJcmV0dXJuIChpcnEgLSBJSF9NUFVJT19CQVNFKSArIE9NQVBfTUFYX0dQSU9fTElORVM7Ci0JcmV0dXJuIGlycSAtIElIX0dQSU9fQkFTRTsKKworCS8qIFNPQyBncGlvICovCisJdG1wID0gaXJxIC0gSUhfR1BJT19CQVNFOworCWlmICh0bXAgPCBPTUFQX01BWF9HUElPX0xJTkVTKQorCQlyZXR1cm4gdG1wOworCisJLyogd2UgZG9uJ3Qgc3VwcGx5IHJldmVyc2UgbWFwcGluZ3MgZm9yIG5vbi1TT0MgZ3Bpb3MgKi8KKwlyZXR1cm4gLUVJTzsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggYWRjODNiNy4uZDkyYmY3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvaW8uaApAQCAtNDIsOCArNDIsOCBAQAogICogV2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSByZWFsIElTQSBub3IgUENJIGJ1c2VzLCBidXQgdGhlcmUgaXMgc28gbWFueQogICogZHJpdmVycyBvdXQgdGhlcmUgdGhhdCBtaWdodCBqdXN0IHdvcmsgaWYgd2UgZmFrZSB0aGVtLi4uCiAgKi8KLSNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKFBDSU9fQkFTRSArIChhKSkpCi0jZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTEsOCArNTEsNiBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKLSNkZWZpbmUgUENJT19CQVNFCTAKLQogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDEpCiAKICNkZWZpbmUgSU9fUEhZUwkJCTB4RkZGQjAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGQ0MGNhYzYuLjIxMWM5ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNDMsMTggKzQzLDcgQEAKICNlbmRpZgogCiAvKgotICogQ29udmVyc2lvbiBiZXR3ZWVuIFNEUkFNIGFuZCBmYWtlIFBDSSBidXMsIHVzZWQgYnkgVVNCCi0gKiBOT1RFOiBQaHlzaWNhbCBhZGRyZXNzIG11c3QgYmUgY29udmVydGVkIHRvIExvY2FsIEJ1cyBhZGRyZXNzCi0gKgkgb24gT01BUC0xNTEwIG9ubHkKLSAqLwotCi0vKgogICogQnVzIGFkZHJlc3MgaXMgcGh5c2ljYWwgYWRkcmVzcywgZXhjZXB0IGZvciBPTUFQLTE1MTAgTG9jYWwgQnVzLgotICovCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkJX192aXJ0X3RvX3BoeXMoeCkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KQlfX3BoeXNfdG9fdmlydCh4KQotCi0vKgogICogT01BUC0xNTEwIGJ1cyBhZGRyZXNzIGlzIHRyYW5zbGF0ZWQgaW50byBhIExvY2FsIEJ1cyBhZGRyZXNzIGlmIHRoZQogICogT01BUCBidXMgdHlwZSBpcyBsYnVzLiBXZSBkbyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUKICAqIGRldmljZSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cyB1c2VkIGluIHRoZSBkbWEtbWFwcGluZyBBUEkuCkBAIC03NCwxNiArNjMsMTYgQEAKIAogI2RlZmluZSBfX2FyY2hfcGFnZV90b19kbWEoZGV2LCBwYWdlKQkoe2lzX2xidXNfZGV2aWNlKGRldikgPyBcCiAJCQkJCShkbWFfYWRkcl90KXZpcnRfdG9fbGJ1cyhwYWdlX2FkZHJlc3MocGFnZSkpIDogXAotCQkJCQkoZG1hX2FkZHJfdClfX3ZpcnRfdG9fYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSk7fSkKKwkJCQkJKGRtYV9hZGRyX3QpX192aXJ0X3RvX3BoeXMocGFnZV9hZGRyZXNzKHBhZ2UpKTt9KQogCiAjZGVmaW5lIF9fYXJjaF9kbWFfdG9fdmlydChkZXYsIGFkZHIpCSh7ICh2b2lkICopIChpc19sYnVzX2RldmljZShkZXYpID8gXAogCQkJCQkJbGJ1c190b192aXJ0KGFkZHIpIDogXAotCQkJCQkJX19idXNfdG9fdmlydChhZGRyKSk7IH0pCisJCQkJCQlfX3BoeXNfdG9fdmlydChhZGRyKSk7IH0pCiAKICNkZWZpbmUgX19hcmNoX3ZpcnRfdG9fZG1hKGRldiwgYWRkcikJKHsgdW5zaWduZWQgbG9uZyBfX2FkZHIgPSAodW5zaWduZWQgbG9uZykoYWRkcik7IFwKIAkJCQkJICAgKGRtYV9hZGRyX3QpIChpc19sYnVzX2RldmljZShkZXYpID8gXAogCQkJCQkJdmlydF90b19sYnVzKF9fYWRkcikgOiBcCi0JCQkJCQlfX3ZpcnRfdG9fYnVzKF9fYWRkcikpOyB9KQorCQkJCQkJX192aXJ0X3RvX3BoeXMoX19hZGRyKSk7IH0pCiAKICNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMTVYWCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21tYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tbWMuaAppbmRleCBmYzE1ZDEzLi4wMzEyNTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21tYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbW1jLmgKQEAgLTE3LDEyICsxNywyOCBAQAogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogCisjZGVmaW5lIE9NQVAxNVhYX05SX01NQwkJMQorI2RlZmluZSBPTUFQMTZYWF9OUl9NTUMJCTIKKyNkZWZpbmUgT01BUDFfTU1DX1NJWkUJCTB4MDgwCisjZGVmaW5lIE9NQVAxX01NQzFfQkFTRQkJMHhmZmZiNzgwMAorI2RlZmluZSBPTUFQMV9NTUMyX0JBU0UJCTB4ZmZmYjdjMDAJLyogb21hcDE2eHggb25seSAqLworCisjZGVmaW5lIE9NQVAyNFhYX05SX01NQwkJMgorI2RlZmluZSBPTUFQMzRYWF9OUl9NTUMJCTMKKyNkZWZpbmUgT01BUDI0MjBfTU1DX1NJWkUJT01BUDFfTU1DX1NJWkUKKyNkZWZpbmUgSFNNTUNfU0laRQkJMHgyMDAKKyNkZWZpbmUgT01BUDJfTU1DMV9CQVNFCQkweDQ4MDljMDAwCisjZGVmaW5lIE9NQVAyX01NQzJfQkFTRQkJMHg0ODBiNDAwMAorI2RlZmluZSBPTUFQM19NTUMzX0JBU0UJCTB4NDgwYWQwMDAKKyNkZWZpbmUgSFNNTUMzCQkJKDEgPDwgMikKKyNkZWZpbmUgSFNNTUMyCQkJKDEgPDwgMSkKKyNkZWZpbmUgSFNNTUMxCQkJKDEgPDwgMCkKKwogI2RlZmluZSBPTUFQX01NQ19NQVhfU0xPVFMJMgogCiBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IG9tYXBfbW1jX2NvbmYJY29uZjsKIAotCS8qIG51bWJlciBvZiBzbG90cyBvbiBib2FyZCAqLworCS8qIG51bWJlciBvZiBzbG90cyBwZXIgY29udHJvbGxlciAqLwogCXVuc2lnbmVkIG5yX3Nsb3RzOjI7CiAKIAkvKiBzZXQgaWYgeW91ciBib2FyZCBoYXMgY29tcG9uZW50cyBvciB3aXJpbmcgdGhhdCBsaW1pdHMgdGhlCkBAIC00MSw3ICs1NywzMSBAQAogCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCk7CiAKKwl1NjQgZG1hX21hc2s7CisKIAlzdHJ1Y3Qgb21hcF9tbWNfc2xvdF9kYXRhIHsKKworCQkvKiA0IHdpcmUgc2lnbmFsaW5nIGlzIG9wdGlvbmFsLCBhbmQgaXMgdXNlZCBmb3IgU0QvU0RJTy9IU01NQzsKKwkJICogOCB3aXJlIHNpZ25hbGluZyBpcyBhbHNvIG9wdGlvbmFsLCBhbmQgaXMgdXNlZCB3aXRoIEhTTU1DCisJCSAqLworCQl1OCB3aXJlczsKKworCQkvKgorCQkgKiBub211eCBtZWFucyAic3RhbmRhcmQiIG11eGluZyBpcyB3cm9uZyBvbiB0aGlzIGJvYXJkLCBhbmQKKwkJICogdGhhdCBib2FyZC1zcGVjaWZpYyBjb2RlIGhhbmRsZWQgaXQgYmVmb3JlIGNvbW1vbiBpbml0IGxvZ2ljLgorCQkgKi8KKwkJdW5zaWduZWQgbm9tdXg6MTsKKworCQkvKiBzd2l0Y2ggcGluIGNhbiBiZSBmb3IgY2FyZCBkZXRlY3QgKGRlZmF1bHQpIG9yIGNhcmQgY292ZXIgKi8KKwkJdW5zaWduZWQgY292ZXI6MTsKKworCQkvKiB1c2UgdGhlIGludGVybmFsIGNsb2NrICovCisJCXVuc2lnbmVkIGludGVybmFsX2Nsb2NrOjE7CisJCXMxNiBwb3dlcl9waW47CisKKwkJaW50IHN3aXRjaF9waW47CQkJLyogZ3BpbyAoY2FyZCBkZXRlY3QpICovCisJCWludCBncGlvX3dwOwkJCS8qIGdwaW8gKHdyaXRlIHByb3RlY3QpICovCisKIAkJaW50ICgqIHNldF9idXNfbW9kZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCwgaW50IGJ1c19tb2RlKTsKIAkJaW50ICgqIHNldF9wb3dlcikoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCwgaW50IHBvd2VyX29uLCBpbnQgdmRkKTsKIAkJaW50ICgqIGdldF9ybykoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCk7CkBAIC00OSw4ICs4OSw4IEBACiAJCS8qIHJldHVybiBNTUMgY292ZXIgc3dpdGNoIHN0YXRlLCBjYW4gYmUgTlVMTCBpZiBub3Qgc3VwcG9ydGVkLgogCQkgKgogCQkgKiBwb3NzaWJsZSByZXR1cm4gdmFsdWVzOgotCQkgKiAgIDAgLSBvcGVuCi0JCSAqICAgMSAtIGNsb3NlZAorCQkgKiAgIDAgLSBjbG9zZWQKKwkJICogICAxIC0gb3BlbgogCQkgKi8KIAkJaW50ICgqIGdldF9jb3Zlcl9zdGF0ZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2xvdCk7CiAKQEAgLTY2LDkgKzEwNiwzMSBAQAogCX0gc2xvdHNbT01BUF9NTUNfTUFYX1NMT1RTXTsKIH07CiAKLWV4dGVybiB2b2lkIG9tYXBfc2V0X21tY19pbmZvKGludCBob3N0LCBjb25zdCBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqaW5mbyk7Ci0KIC8qIGNhbGxlZCBmcm9tIGJvYXJkLXNwZWNpZmljIGNhcmQgZGV0ZWN0aW9uIHNlcnZpY2Ugcm91dGluZSAqLwogZXh0ZXJuIHZvaWQgb21hcF9tbWNfbm90aWZ5X2NvdmVyX2V2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBpc19jbG9zZWQpOwogCisjaWYJZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkgfHwgXAorCWRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IU19NT0RVTEUpCit2b2lkIG9tYXAxX2luaXRfbW1jKHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICoqbW1jX2RhdGEsCisJCQkJaW50IG5yX2NvbnRyb2xsZXJzKTsKK3ZvaWQgb21hcDJfaW5pdF9tbWMoc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKiptbWNfZGF0YSwKKwkJCQlpbnQgbnJfY29udHJvbGxlcnMpOworaW50IG9tYXBfbW1jX2FkZChpbnQgaWQsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJdW5zaWduZWQgaW50IGlycSwgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgKmRhdGEpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMV9pbml0X21tYyhzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqKm1tY19kYXRhLAorCQkJCWludCBucl9jb250cm9sbGVycykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMl9pbml0X21tYyhzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqKm1tY19kYXRhLAorCQkJCWludCBucl9jb250cm9sbGVycykKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9tYXBfbW1jX2FkZChpbnQgaWQsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQl1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbXV4LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL211eC5oCmluZGV4IDZiYmYxNzguLmY0MzYyYjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbXV4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tdXguaApAQCAtNjMyLDYgKzYzMiwxNSBAQAogCUFDN18yNDMwX1VTQjBIU19EQVRBNywKIAogCS8qIDI0MzAgTWNCU1AgKi8KKwlBRDZfMjQzMF9NQ0JTUF9DTEtTLAorCisJQUIyXzI0MzBfTUNCU1AxX0NMS1IsCisJQUQ1XzI0MzBfTUNCU1AxX0ZTUiwKKwlBQTFfMjQzMF9NQ0JTUDFfRFgsCisJQUYzXzI0MzBfTUNCU1AxX0RSLAorCUFCM18yNDMwX01DQlNQMV9GU1gsCisJWTlfMjQzMF9NQ0JTUDFfQ0xLWCwKKwogCUFDMTBfMjQzMF9NQ0JTUDJfRlNYLAogCUFEMTZfMjQzMF9NQ0JTUDJfQ0xYLAogCUFFMTNfMjQzMF9NQ0JTUDJfRFgsCkBAIC02NDEsNiArNjUwLDMwIEBACiAJQUUxM18yNDMwX01DQlNQMl9EWF9PRkYsCiAJQUQxM18yNDMwX01DQlNQMl9EUl9PRkYsCiAKKwlBQzlfMjQzMF9NQ0JTUDNfQ0xLWCwKKwlBRTRfMjQzMF9NQ0JTUDNfRlNYLAorCUFFMl8yNDMwX01DQlNQM19EUiwKKwlBRjRfMjQzMF9NQ0JTUDNfRFgsCisKKwlOM18yNDMwX01DQlNQNF9DTEtYLAorCUFEMjNfMjQzMF9NQ0JTUDRfRFIsCisJQUIyNV8yNDMwX01DQlNQNF9EWCwKKwlBQzI1XzI0MzBfTUNCU1A0X0ZTWCwKKworCUFFMTZfMjQzMF9NQ0JTUDVfQ0xLWCwKKwlBRjEyXzI0MzBfTUNCU1A1X0ZTWCwKKwlLN18yNDMwX01DQlNQNV9EWCwKKwlNMV8yNDMwX01DQlNQNV9EUiwKKworCS8qIDI0MzAgTWNTUEkqLworCVkxOF8yNDMwX01DU1BJMV9DTEssCisJQUQxNV8yNDMwX01DU1BJMV9TSU1PLAorCUFFMTdfMjQzMF9NQ1NQSTFfU09NSSwKKwlVMV8yNDMwX01DU1BJMV9DUzAsCisKKwkvKiBUb3VjaHNjcmVlbiBHUElPICovCisJQUYxOV8yNDMwX0dQSU9fODUsCisKIH07CiAKIGVudW0gb21hcDM0eHhfaW5kZXggewpAQCAtNzQ5LDYgKzc4MiwxNCBAQAogCUFEMl8zNDMwX1VTQjNGU19QSFlfTU0zX1RYREFULAogCUFDMV8zNDMwX1VTQjNGU19QSFlfTU0zX1RYRU5fTiwKIAorCS8qIDM0eHggR1BJTworCSAqICAtIG5vcm1hbGx5IHRoZXNlIGFyZSBiaWRpcmVjdGlvbmFsLCBubyBpbnRlcm5hbCBwdWxsdXAvcHVsbGRvd24KKwkgKiAgLSAiX1VQIiBzdWZmaXggKEdQSU8zX1VQKSBpZiBpbnRlcm5hbCBwdWxsdXAgaXMgY29uZmlndXJlZAorCSAqICAtICJfRE9XTiIgc3VmZml4IChHUElPM19ET1dOKSB3aXRoIGludGVybmFsIHB1bGxkb3duCisJICogIC0gIl9PVVQiIHN1ZmZpeCAoR1BJTzNfT1VUKSBmb3Igb3V0cHV0LW9ubHkgcGlucyAodW5saWtlIDI0eHgpCisJICovCisJQUg4XzM0WFhfR1BJTzI5LAorCUoyNV8zNFhYX0dQSU8xNzAsCiB9OwogCiBzdHJ1Y3Qgb21hcF9tdXhfY2ZnIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCmluZGV4IGRjZDlkMTYuLmJlN2JjYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9zcmFtLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KIApAQCAtODcsNyArODgsNyBAQAogCWludCB0eXBlID0gMDsKIAogCWlmIChjcHVfaXNfb21hcDI0MngoKSkKLQkJdHlwZSA9IHN5c3RlbV9yZXYgJiBPTUFQMl9ERVZJQ0VUWVBFX01BU0s7CisJCXR5cGUgPSBvbWFwX3JldigpICYgT01BUDJfREVWSUNFVFlQRV9NQVNLOwogCiAJaWYgKHR5cGUgPT0gR1BfREVWSUNFKSB7CiAJCS8qIFJBTUZXOiBSL1cgYWNjZXNzIHRvIGFsbCBpbml0aWF0b3JzIGZvciBhbGwgcXVhbGlmaWVyIHNldHMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW9yaW9uL01ha2VmaWxlCmluZGV4IDE5OGYzZGQuLjU2MDIxYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9NYWtlZmlsZQpAQCAtNiwzICs2LDUgQEAKIG9iai1tCTo9CiBvYmotbgk6PQogb2JqLQk6PQorCitvYmotJChDT05GSUdfR0VORVJJQ19HUElPKSArPSBncGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MTg2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKKyAqCisgKiBNYXJ2ZWxsIE9yaW9uIFNvQyBHUElPIGhhbmRsaW5nLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3Bpb19sb2NrKTsKK3N0YXRpYyBjb25zdCBjaGFyICpncGlvX2xhYmVsW0dQSU9fTUFYXTsgIC8qIG5vbiBudWxsIGZvciBhbGxvY2F0ZWQgR1BJT3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdwaW9fdmFsaWRbQklUU19UT19MT05HUyhHUElPX01BWCldOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfZGlyZWN0aW9uKHVuc2lnbmVkIHBpbiwgaW50IGlucHV0KQoreworCXUzMiB1OworCisJdSA9IHJlYWRsKEdQSU9fSU9fQ09ORihwaW4pKTsKKwlpZiAoaW5wdXQpCisJCXUgfD0gMSA8PCAocGluICYgMzEpOworCWVsc2UKKwkJdSAmPSB+KDEgPDwgKHBpbiAmIDMxKSk7CisJd3JpdGVsKHUsIEdQSU9fSU9fQ09ORihwaW4pKTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfbGV2ZWwodW5zaWduZWQgcGluLCBpbnQgaGlnaCkKK3sKKwl1MzIgdTsKKworCXUgPSByZWFkbChHUElPX09VVChwaW4pKTsKKwlpZiAoaGlnaCkKKwkJdSB8PSAxIDw8IChwaW4gJiAzMSk7CisJZWxzZQorCQl1ICY9IH4oMSA8PCAocGluICYgMzEpKTsKKwl3cml0ZWwodSwgR1BJT19PVVQocGluKSk7Cit9CisKKworLyoKKyAqIEdFTkVSSUNfR1BJTyBwcmltaXRpdmVzLgorICovCitpbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgcGluKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocGluID49IEdQSU9fTUFYIHx8ICF0ZXN0X2JpdChwaW4sIGdwaW9fdmFsaWQpKSB7CisJCXByX2RlYnVnKCIlczogaW52YWxpZCBHUElPICVkXG4iLCBfX2Z1bmNfXywgcGluKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTb21lIGNhbGxlcnMgbWlnaHQgbm90IGhhdmUgdXNlZCBncGlvX3JlcXVlc3QoKSwKKwkgKiBzbyBmbGFnIHRoaXMgcGluIGFzIHJlcXVlc3RlZCBub3cuCisJICovCisJaWYgKGdwaW9fbGFiZWxbcGluXSA9PSBOVUxMKQorCQlncGlvX2xhYmVsW3Bpbl0gPSAiPyI7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBHUElPIGRpcmVjdGlvbi4KKwkgKi8KKwlfX3NldF9kaXJlY3Rpb24ocGluLCAxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKKworaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB1OworCisJaWYgKHBpbiA+PSBHUElPX01BWCB8fCAhdGVzdF9iaXQocGluLCBncGlvX3ZhbGlkKSkgeworCQlwcl9kZWJ1ZygiJXM6IGludmFsaWQgR1BJTyAlZFxuIiwgX19mdW5jX18sIHBpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogU29tZSBjYWxsZXJzIG1pZ2h0IG5vdCBoYXZlIHVzZWQgZ3Bpb19yZXF1ZXN0KCksCisJICogc28gZmxhZyB0aGlzIHBpbiBhcyByZXF1ZXN0ZWQgbm93LgorCSAqLworCWlmIChncGlvX2xhYmVsW3Bpbl0gPT0gTlVMTCkKKwkJZ3Bpb19sYWJlbFtwaW5dID0gIj8iOworCisJLyoKKwkgKiBEaXNhYmxlIGJsaW5raW5nLgorCSAqLworCXUgPSByZWFkbChHUElPX0JMSU5LX0VOKHBpbikpOworCXUgJj0gfigxIDw8IChwaW4gJiAzMSkpOworCXdyaXRlbCh1LCBHUElPX0JMSU5LX0VOKHBpbikpOworCisJLyoKKwkgKiBDb25maWd1cmUgR1BJTyBvdXRwdXQgdmFsdWUuCisJICovCisJX19zZXRfbGV2ZWwocGluLCB2YWx1ZSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBHUElPIGRpcmVjdGlvbi4KKwkgKi8KKwlfX3NldF9kaXJlY3Rpb24ocGluLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CisKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBwaW4pCit7CisJaW50IHZhbDsKKworCWlmIChyZWFkbChHUElPX0lPX0NPTkYocGluKSkgJiAoMSA8PCAocGluICYgMzEpKSkKKwkJdmFsID0gcmVhZGwoR1BJT19EQVRBX0lOKHBpbikpIF4gcmVhZGwoR1BJT19JTl9QT0wocGluKSk7CisJZWxzZQorCQl2YWwgPSByZWFkbChHUElPX09VVChwaW4pKTsKKworCXJldHVybiAodmFsID4+IChwaW4gJiAzMSkpICYgMTsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19nZXRfdmFsdWUpOworCit2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIHBpbiwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIERpc2FibGUgYmxpbmtpbmcuCisJICovCisJdSA9IHJlYWRsKEdQSU9fQkxJTktfRU4ocGluKSk7CisJdSAmPSB+KDEgPDwgKHBpbiAmIDMxKSk7CisJd3JpdGVsKHUsIEdQSU9fQkxJTktfRU4ocGluKSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBHUElPIG91dHB1dCB2YWx1ZS4KKwkgKi8KKwlfX3NldF9sZXZlbChwaW4sIHZhbHVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChncGlvX3NldF92YWx1ZSk7CisKK2ludCBncGlvX3JlcXVlc3QodW5zaWduZWQgcGluLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZiAocGluID49IEdQSU9fTUFYIHx8ICF0ZXN0X2JpdChwaW4sIGdwaW9fdmFsaWQpKSB7CisJCXByX2RlYnVnKCIlczogaW52YWxpZCBHUElPICVkXG4iLCBfX2Z1bmNfXywgcGluKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCWlmIChncGlvX2xhYmVsW3Bpbl0gPT0gTlVMTCkgeworCQlncGlvX2xhYmVsW3Bpbl0gPSBsYWJlbCA/IGxhYmVsIDogIj8iOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogR1BJTyAlZCBhbHJlYWR5IHVzZWQgYXMgJXNcbiIsCisJCQkgX19mdW5jX18sIHBpbiwgZ3Bpb19sYWJlbFtwaW5dKTsKKwkJcmV0ID0gLUVCVVNZOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7CisKK3ZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIHBpbikKK3sKKwlpZiAocGluID49IEdQSU9fTUFYIHx8ICF0ZXN0X2JpdChwaW4sIGdwaW9fdmFsaWQpKSB7CisJCXByX2RlYnVnKCIlczogaW52YWxpZCBHUElPICVkXG4iLCBfX2Z1bmNfXywgcGluKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChncGlvX2xhYmVsW3Bpbl0gPT0gTlVMTCkKKwkJcHJfd2FybmluZygiJXM6IEdQSU8gJWQgYWxyZWFkeSBmcmVlZFxuIiwgX19mdW5jX18sIHBpbik7CisJZWxzZQorCQlncGlvX2xhYmVsW3Bpbl0gPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOworCisKKy8qCisgKiBPcmlvbi1zcGVjaWZpYyBHUElPIEFQSSBleHRlbnNpb25zLgorICovCit2b2lkIF9faW5pdCBvcmlvbl9ncGlvX3NldF91bnVzZWQodW5zaWduZWQgcGluKQoreworCS8qCisJICogQ29uZmlndXJlIGFzIG91dHB1dCwgZHJpdmUgbG93LgorCSAqLworCV9fc2V0X2xldmVsKHBpbiwgMCk7CisJX19zZXRfZGlyZWN0aW9uKHBpbiwgMCk7Cit9CisKK3ZvaWQgX19pbml0IG9yaW9uX2dwaW9fc2V0X3ZhbGlkKHVuc2lnbmVkIHBpbiwgaW50IHZhbGlkKQoreworCWlmICh2YWxpZCkKKwkJX19zZXRfYml0KHBpbiwgZ3Bpb192YWxpZCk7CisJZWxzZQorCQlfX2NsZWFyX2JpdChwaW4sIGdwaW9fdmFsaWQpOworfQorCit2b2lkIG9yaW9uX2dwaW9fc2V0X2JsaW5rKHVuc2lnbmVkIHBpbiwgaW50IGJsaW5rKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFNldCBvdXRwdXQgdmFsdWUgdG8gemVyby4KKwkgKi8KKwlfX3NldF9sZXZlbChwaW4sIDApOworCisJdSA9IHJlYWRsKEdQSU9fQkxJTktfRU4ocGluKSk7CisJaWYgKGJsaW5rKQorCQl1IHw9IDEgPDwgKHBpbiAmIDMxKTsKKwllbHNlCisJCXUgJj0gfigxIDw8IChwaW4gJiAzMSkpOworCXdyaXRlbCh1LCBHUElPX0JMSU5LX0VOKHBpbikpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKG9yaW9uX2dwaW9fc2V0X2JsaW5rKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaW9uIEdQSU8gSVJRCisgKgorICogR1BJT19JTl9QT0wgcmVnaXN0ZXIgY29udHJvbHMgd2hldGhlciBHUElPX0RBVEFfSU4gd2lsbCBob2xkIHRoZSBzYW1lCisgKiB2YWx1ZSBvZiB0aGUgbGluZSBvciB0aGUgb3Bwb3NpdGUgdmFsdWUuCisgKgorICogTGV2ZWwgSVJRIGhhbmRsZXJzOiBEQVRBX0lOIGlzIHVzZWQgZGlyZWN0bHkgYXMgY2F1c2UgcmVnaXN0ZXIuCisgKiAgICAgICAgICAgICAgICAgICAgIEludGVycnVwdCBhcmUgbWFza2VkIGJ5IExFVkVMX01BU0sgcmVnaXN0ZXJzLgorICogRWRnZSBJUlEgaGFuZGxlcnM6ICBDaGFuZ2UgaW4gREFUQV9JTiBhcmUgbGF0Y2hlZCBpbiBFREdFX0NBVVNFLgorICogICAgICAgICAgICAgICAgICAgICBJbnRlcnJ1cHQgYXJlIG1hc2tlZCBieSBFREdFX01BU0sgcmVnaXN0ZXJzLgorICogQm90aC1lZGdlIGhhbmRsZXJzOiBTaW1pbGFyIHRvIHJlZ3VsYXIgRWRnZSBoYW5kbGVycywgYnV0IGFsc28gc3dhcHMKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIHBvbGFyaXR5IHRvIGNhdGNoIHRoZSBuZXh0IGxpbmUgdHJhbnNhY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IG1pZ2h0IG5vdCBwZXJmZWN0bHkKKyAqICAgICAgICAgICAgICAgICAgICAgd29yayBvbiBzb21lIHVzZSBjYXNlcy4KKyAqCisgKiBFdmVyeSBlaWdodCBHUElPIGxpbmVzIGFyZSBncm91cGVkIChPUidlZCkgYmVmb3JlIGdvaW5nIHVwIHRvIG1haW4KKyAqIGNhdXNlIHJlZ2lzdGVyLgorICoKKyAqICAgICAgICAgICAgICAgICAgICBFREdFICBjYXVzZSAgICBtYXNrCisgKiAgICAgICAgZGF0YS1pbiAgIC8tLS0tLS0tLXwgfC0tLS0tfCB8LS0tLVwKKyAqICAgICAtLS0tLXwgfC0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0gdG8gbWFpbiBjYXVzZSByZWcKKyAqICAgICAgICAgICBYICAgICAgXC0tLS0tLS0tLS0tLS0tLS18IHwtLS0tLworICogICAgICAgIHBvbGFyaXR5ICAgIExFVkVMICAgICAgICAgIG1hc2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGdwaW9faXJxX2VkZ2VfYWNrKHUzMiBpcnEpCit7CisJaW50IHBpbiA9IGlycV90b19ncGlvKGlycSk7CisKKwl3cml0ZWwofigxIDw8IChwaW4gJiAzMSkpLCBHUElPX0VER0VfQ0FVU0UocGluKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2VkZ2VfbWFzayh1MzIgaXJxKQoreworCWludCBwaW4gPSBpcnFfdG9fZ3BpbyhpcnEpOworCXUzMiB1OworCisJdSA9IHJlYWRsKEdQSU9fRURHRV9NQVNLKHBpbikpOworCXUgJj0gfigxIDw8IChwaW4gJiAzMSkpOworCXdyaXRlbCh1LCBHUElPX0VER0VfTUFTSyhwaW4pKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfZWRnZV91bm1hc2sodTMyIGlycSkKK3sKKwlpbnQgcGluID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1MzIgdTsKKworCXUgPSByZWFkbChHUElPX0VER0VfTUFTSyhwaW4pKTsKKwl1IHw9IDEgPDwgKHBpbiAmIDMxKTsKKwl3cml0ZWwodSwgR1BJT19FREdFX01BU0socGluKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2xldmVsX21hc2sodTMyIGlycSkKK3sKKwlpbnQgcGluID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1MzIgdTsKKworCXUgPSByZWFkbChHUElPX0xFVkVMX01BU0socGluKSk7CisJdSAmPSB+KDEgPDwgKHBpbiAmIDMxKSk7CisJd3JpdGVsKHUsIEdQSU9fTEVWRUxfTUFTSyhwaW4pKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfbGV2ZWxfdW5tYXNrKHUzMiBpcnEpCit7CisJaW50IHBpbiA9IGlycV90b19ncGlvKGlycSk7CisJdTMyIHU7CisKKwl1ID0gcmVhZGwoR1BJT19MRVZFTF9NQVNLKHBpbikpOworCXUgfD0gMSA8PCAocGluICYgMzEpOworCXdyaXRlbCh1LCBHUElPX0xFVkVMX01BU0socGluKSk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19pcnFfc2V0X3R5cGUodTMyIGlycSwgdTMyIHR5cGUpCit7CisJaW50IHBpbiA9IGlycV90b19ncGlvKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOworCXUzMiB1OworCisJdSA9IHJlYWRsKEdQSU9fSU9fQ09ORihwaW4pKSAmICgxIDw8IChwaW4gJiAzMSkpOworCWlmICghdSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9yaW9uIGdwaW9faXJxX3NldF90eXBlIGZhaWxlZCAiCisJCQkJIihpcnEgJWQsIHBpbiAlZCkuXG4iLCBpcnEsIHBpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKworCS8qCisJICogU2V0IGVkZ2UvbGV2ZWwgdHlwZS4KKwkgKi8KKwlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKKwkJZGVzYy0+Y2hpcCA9ICZvcmlvbl9ncGlvX2lycV9lZGdlX2NoaXA7CisJfSBlbHNlIGlmICh0eXBlICYgKElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSB7CisJCWRlc2MtPmNoaXAgPSAmb3Jpb25fZ3Bpb19pcnFfbGV2ZWxfY2hpcDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBzZXQgaXJxPSVkICh0eXBlPSVkKVxuIiwgaXJxLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBDb25maWd1cmUgaW50ZXJydXB0IHBvbGFyaXR5LgorCSAqLworCWlmICh0eXBlID09IElSUV9UWVBFX0VER0VfUklTSU5HIHx8IHR5cGUgPT0gSVJRX1RZUEVfTEVWRUxfSElHSCkgeworCQl1ID0gcmVhZGwoR1BJT19JTl9QT0wocGluKSk7CisJCXUgJj0gfigxIDw8IChwaW4gJiAzMSkpOworCQl3cml0ZWwodSwgR1BJT19JTl9QT0wocGluKSk7CisJfSBlbHNlIGlmICh0eXBlID09IElSUV9UWVBFX0VER0VfRkFMTElORyB8fCB0eXBlID09IElSUV9UWVBFX0xFVkVMX0xPVykgeworCQl1ID0gcmVhZGwoR1BJT19JTl9QT0wocGluKSk7CisJCXUgfD0gMSA8PCAocGluICYgMzEpOworCQl3cml0ZWwodSwgR1BJT19JTl9QT0wocGluKSk7CisJfSBlbHNlIGlmICh0eXBlID09IElSUV9UWVBFX0VER0VfQk9USCkgeworCQl1MzIgdjsKKworCQl2ID0gcmVhZGwoR1BJT19JTl9QT0wocGluKSkgXiByZWFkbChHUElPX0RBVEFfSU4ocGluKSk7CisKKwkJLyoKKwkJICogc2V0IGluaXRpYWwgcG9sYXJpdHkgYmFzZWQgb24gY3VycmVudCBpbnB1dCBsZXZlbAorCQkgKi8KKwkJdSA9IHJlYWRsKEdQSU9fSU5fUE9MKHBpbikpOworCQlpZiAodiAmICgxIDw8IChwaW4gJiAzMSkpKQorCQkJdSB8PSAxIDw8IChwaW4gJiAzMSk7CQkvKiBmYWxsaW5nICovCisJCWVsc2UKKwkJCXUgJj0gfigxIDw8IChwaW4gJiAzMSkpOwkvKiByaXNpbmcgKi8KKwkJd3JpdGVsKHUsIEdQSU9fSU5fUE9MKHBpbikpOworCX0KKworCWRlc2MtPnN0YXR1cyA9IChkZXNjLT5zdGF0dXMgJiB+SVJRX1RZUEVfU0VOU0VfTUFTSykgfCB0eXBlOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpcnFfY2hpcCBvcmlvbl9ncGlvX2lycV9lZGdlX2NoaXAgPSB7CisJLm5hbWUJCT0gIm9yaW9uX2dwaW9faXJxX2VkZ2UiLAorCS5hY2sJCT0gZ3Bpb19pcnFfZWRnZV9hY2ssCisJLm1hc2sJCT0gZ3Bpb19pcnFfZWRnZV9tYXNrLAorCS51bm1hc2sJCT0gZ3Bpb19pcnFfZWRnZV91bm1hc2ssCisJLnNldF90eXBlCT0gZ3Bpb19pcnFfc2V0X3R5cGUsCit9OworCitzdHJ1Y3QgaXJxX2NoaXAgb3Jpb25fZ3Bpb19pcnFfbGV2ZWxfY2hpcCA9IHsKKwkubmFtZQkJPSAib3Jpb25fZ3Bpb19pcnFfbGV2ZWwiLAorCS5tYXNrCQk9IGdwaW9faXJxX2xldmVsX21hc2ssCisJLm1hc2tfYWNrCT0gZ3Bpb19pcnFfbGV2ZWxfbWFzaywKKwkudW5tYXNrCQk9IGdwaW9faXJxX2xldmVsX3VubWFzaywKKwkuc2V0X3R5cGUJPSBncGlvX2lycV9zZXRfdHlwZSwKK307CisKK3ZvaWQgb3Jpb25fZ3Bpb19pcnFfaGFuZGxlcihpbnQgcGlub2ZmKQoreworCXUzMiBjYXVzZTsKKwlpbnQgcGluOworCisJY2F1c2UgPSByZWFkbChHUElPX0RBVEFfSU4ocGlub2ZmKSkgJiByZWFkbChHUElPX0xFVkVMX01BU0socGlub2ZmKSk7CisJY2F1c2UgfD0gcmVhZGwoR1BJT19FREdFX0NBVVNFKHBpbm9mZikpICYgcmVhZGwoR1BJT19FREdFX01BU0socGlub2ZmKSk7CisKKwlmb3IgKHBpbiA9IHBpbm9mZjsgcGluIDwgcGlub2ZmICsgODsgcGluKyspIHsKKwkJaW50IGlycSA9IGdwaW9fdG9faXJxKHBpbik7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJCWlmICghKGNhdXNlICYgKDEgPDwgKHBpbiAmIDMxKSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJCS8qIFN3YXAgcG9sYXJpdHkgKHJhY2Ugd2l0aCBHUElPIGxpbmUpICovCisJCQl1MzIgcG9sYXJpdHk7CisKKwkJCXBvbGFyaXR5ID0gcmVhZGwoR1BJT19JTl9QT0wocGluKSk7CisJCQlwb2xhcml0eSBePSAxIDw8IChwaW4gJiAzMSk7CisJCQl3cml0ZWwocG9sYXJpdHksIEdQSU9fSU5fUE9MKHBpbikpOworCQl9CisJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2VoY2ktb3Jpb24uaCBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2VoY2ktb3Jpb24uaAppbmRleCA2NDM0MzA1Li40ZWM2NjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9laGNpLW9yaW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9pbmNsdWRlL3BsYXQvZWhjaS1vcmlvbi5oCkBAIC0xMSw4ICsxMSwxNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgogCitlbnVtIG9yaW9uX2VoY2lfcGh5X3ZlciB7CisJRUhDSV9QSFlfT1JJT04sCisJRUhDSV9QSFlfREQsCisJRUhDSV9QSFlfS1csCisJRUhDSV9QSFlfTkEsCit9OworCiBzdHJ1Y3Qgb3Jpb25fZWhjaV9kYXRhIHsKIAlzdHJ1Y3QgbWJ1c19kcmFtX3RhcmdldF9pbmZvCSpkcmFtOworCWVudW0gb3Jpb25fZWhjaV9waHlfdmVyIHBoeV92ZXJzaW9uOwogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkZWFmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2dwaW8uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogYXJjaC9hcm0vcGxhdC1vcmlvbi9pbmNsdWRlL3BsYXQvZ3Bpby5oCisgKgorICogTWFydmVsbCBPcmlvbiBTb0MgR1BJTyBoYW5kbGluZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fUExBVF9HUElPX0gKKyNkZWZpbmUgX19QTEFUX0dQSU9fSAorCisvKgorICogR0VORVJJQ19HUElPIHByaW1pdGl2ZXMuCisgKi8KK2ludCBncGlvX3JlcXVlc3QodW5zaWduZWQgcGluLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBwaW4pOworaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIHBpbik7CitpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIHBpbiwgaW50IHZhbHVlKTsKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBwaW4pOwordm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBwaW4sIGludCB2YWx1ZSk7CisKKy8qCisgKiBPcmlvbi1zcGVjaWZpYyBHUElPIEFQSSBleHRlbnNpb25zLgorICovCit2b2lkIG9yaW9uX2dwaW9fc2V0X3VudXNlZCh1bnNpZ25lZCBwaW4pOwordm9pZCBvcmlvbl9ncGlvX3NldF92YWxpZCh1bnNpZ25lZCBwaW4sIGludCB2YWxpZCk7Cit2b2lkIG9yaW9uX2dwaW9fc2V0X2JsaW5rKHVuc2lnbmVkIHBpbiwgaW50IGJsaW5rKTsKKworLyoKKyAqIEdQSU8gaW50ZXJydXB0IGhhbmRsaW5nLgorICovCitleHRlcm4gc3RydWN0IGlycV9jaGlwIG9yaW9uX2dwaW9faXJxX2VkZ2VfY2hpcDsKK2V4dGVybiBzdHJ1Y3QgaXJxX2NoaXAgb3Jpb25fZ3Bpb19pcnFfbGV2ZWxfY2hpcDsKK3ZvaWQgb3Jpb25fZ3Bpb19pcnFfaGFuZGxlcihpbnQgaXJxb2ZmKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXMzYy9LY29uZmlnCmluZGV4IDMxNjU2YzMuLmRlOTM4MzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvS2NvbmZpZwpAQCAtNiwzNCArNiwzMiBAQAogCiBjb25maWcgUExBVF9TM0MKIAlib29sCi0JZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKLQlkZWZhdWx0IHkgaWYgQVJDSF9TM0MyNDEwCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAgfHwgQVJDSF9TM0MyNEEwIHx8IEFSQ0hfUzNDNjRYWAorCWRlZmF1bHQgeQogCXNlbGVjdCBOT19JT1BPUlQKIAloZWxwCiAJICBCYXNlIHBsYXRmb3JtIGNvZGUgZm9yIGFueSBTYW1zdW5nIFMzQyBkZXZpY2UKIAogIyBsb3ctbGV2ZWwgc2VyaWFsIG9wdGlvbiBub2RlcwogCitpZiBQTEFUX1MzQworCiBjb25maWcgQ1BVX0xMU0VSSUFMX1MzQzI0MTBfT05MWQogCWJvb2wKLQlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAogCWRlZmF1bHQgeSBpZiBDUFVfTExTRVJJQUxfUzNDMjQxMCAmJiAhQ1BVX0xMU0VSSUFMX1MzQzI0NDAKIAogY29uZmlnIENQVV9MTFNFUklBTF9TM0MyNDQwX09OTFkKIAlib29sCi0JZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKIAlkZWZhdWx0IHkgaWYgQ1BVX0xMU0VSSUFMX1MzQzI0NDAgJiYgIUNQVV9MTFNFUklBTF9TM0MyNDEwCiAKIGNvbmZpZyBDUFVfTExTRVJJQUxfUzNDMjQxMAogCWJvb2wKLQlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAogCWhlbHAKIAkgIFNlbGVjdGVkIGlmIHRoZXJlIGlzIGFuIFMzQzI0MTAgKG9yIHJlZ2lzdGVyIGNvbXBhdGlibGUpIHNlcmlhbAogCSAgbG93LWxldmVsIGltcGxlbWVudGF0aW9uIG5lZWRlZAogCiBjb25maWcgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKIAlib29sCi0JZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKIAloZWxwCiAJICBTZWxlY3RlZCBpZiB0aGVyZSBpcyBhbiBTM0MyNDQwIChvciByZWdpc3RlciBjb21wYXRpYmxlKSBzZXJpYWwKIAkgIGxvdy1sZXZlbCBpbXBsZW1lbnRhdGlvbiBuZWVkZWQKQEAgLTQ0LDcgKzQyLDcgQEAKIAogY29uZmlnIFMzQ19CT09UX1dBVENIRE9HCiAJYm9vbCAiUzNDIEluaXRpYWxpc2F0aW9uIHdhdGNoZG9nIgotCWRlcGVuZHMgb24gUExBVF9TM0MgJiYgUzNDMjQxMF9XQVRDSERPRworCWRlcGVuZHMgb24gUzNDMjQxMF9XQVRDSERPRwogCWhlbHAKIAkgIFNheSB5IHRvIGVuYWJsZSB0aGUgd2F0Y2hkb2cgZHVyaW5nIHRoZSBrZXJuZWwgZGVjb21wcmVzc2lvbgogCSAgc3RhZ2UuIElmIHRoZSBrZXJuZWwgZmFpbHMgdG8gdW5jb21wcmVzcywgdGhlbiB0aGUgd2F0Y2hkb2cKQEAgLTUyLDE2ICs1MCwyMiBAQAogCiBjb25maWcgUzNDX0JPT1RfRVJST1JfUkVTRVQKIAlib29sICJTM0MgUmVib290IG9uIGRlY29tcHJlc3Npb24gZXJyb3IiCi0JZGVwZW5kcyBvbiBQTEFUX1MzQwogCWhlbHAKIAkgIFNheSB5IGhlcmUgdG8gdXNlIHRoZSB3YXRjaGRvZyB0byByZXNldCB0aGUgc3lzdGVtIGlmIHRoZQogCSAga2VybmVsIGRlY29tcHJlc3NvciBkZXRlY3RzIGFuIGVycm9yIGR1cmluZyBkZWNvbXByZXNzaW9uLgogCitjb25maWcgUzNDX0JPT1RfVUFSVF9GT1JDRV9GSUZPCisgICAgICAgYm9vbCAiRm9yY2UgVUFSVCBGSUZPIG9uIGR1cmluZyBib290IHByb2Nlc3MiCisgICAgICAgZGVmYXVsdCB5CisgICAgICAgaGVscAorICAgICAgICAgU2F5IFkgaGVyZSB0byBmb3JjZSB0aGUgVUFSVCBGSUZPcyBvbiBkdXJpbmcgdGhlIGtlcm5lbAorCSB1bmNvbXByZXNzb3IKKwogY29tbWVudCAiUG93ZXIgbWFuYWdlbWVudCIKIAogY29uZmlnIFMzQzI0MTBfUE1fREVCVUcKIAlib29sICJTM0MyNDEwIFBNIFN1c3BlbmQgZGVidWciCi0JZGVwZW5kcyBvbiBQTEFUX1MzQyAmJiBQTQorCWRlcGVuZHMgb24gUE0KIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHZlcmJvc2UgZGVidWdnaW5nIGZyb20gdGhlIFBNIFN1c3BlbmQgYW5kCiAJICBSZXN1bWUgY29kZS4gU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL1NhbXN1bmctUzNDMjRYWC9TdXNwZW5kLnR4dD4KQEAgLTY5LDcgKzczLDcgQEAKIAogY29uZmlnIFMzQzI0MTBfUE1fQ0hFQ0sKIAlib29sICJTM0MyNDEwIFBNIFN1c3BlbmQgTWVtb3J5IENSQyIKLQlkZXBlbmRzIG9uIFBMQVRfUzNDICYmIFBNICYmIENSQzMyCisJZGVwZW5kcyBvbiBQTSAmJiBDUkMzMgogCWhlbHAKICAJICBFbmFibGUgdGhlIFBNIGNvZGUncyBtZW1vcnkgYXJlYSBjaGVja3N1bSBvdmVyIHNsZWVwLiBUaGlzIG9wdGlvbgogCSAgd2lsbCBnZW5lcmF0ZSBDUkNzIG9mIGFsbCBibG9ja3Mgb2YgbWVtb3J5LCBhbmQgc3RvcmUgdGhlbSBiZWZvcmUKQEAgLTgzLDcgKzg3LDcgQEAKIAogY29uZmlnIFMzQzI0MTBfUE1fQ0hFQ0tfQ0hVTktTSVpFCiAJaW50ICJTM0MyNDEwIFBNIFN1c3BlbmQgQ1JDIENodW5rc2l6ZSAoS2lCKSIKLQlkZXBlbmRzIG9uIFBMQVRfUzNDICYmIFBNICYmIFMzQzI0MTBfUE1fQ0hFQ0sKKwlkZXBlbmRzIG9uIFBNICYmIFMzQzI0MTBfUE1fQ0hFQ0sKIAlkZWZhdWx0IDY0CiAJaGVscAogCSAgU2V0IHRoZSBjaHVua3NpemUgaW4gS2lsb2J5dGVzIG9mIHRoZSBDUkMgZm9yIGNoZWNraW5nIG1lbW9yeQpAQCAtOTUsMTAgKzk5LDc3IEBACiAKIGNvbmZpZyBTM0NfTE9XTEVWRUxfVUFSVF9QT1JUCiAJaW50ICJTM0MgVUFSVCB0byB1c2UgZm9yIGxvdy1sZXZlbCBtZXNzYWdlcyIKLQlkZXBlbmRzIG9uIFBMQVRfUzNDCiAJZGVmYXVsdCAwCiAJaGVscAogCSAgQ2hvaWNlIG9mIHdoaWNoIFVBUlQgcG9ydCB0byB1c2UgZm9yIHRoZSBsb3ctbGV2ZWwgbWVzc2FnZXMsCiAJICBzdWNoIGFzIHRoZSBgVW5jb21wcmVzc2luZy4uLmAgYXQgc3RhcnQgdGltZS4gVGhlIHZhbHVlIG9mCiAJICB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGJldHdlZW4gemVybyBhbmQgdHdvLiBUaGUgcG9ydAogCSAgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgYnkgdGhlIGJvb3QtbG9hZGVyIGJlZm9yZSB1c2UuCisKKyMgb3B0aW9ucyBmb3IgZ3Bpb2xpYiBzdXBwb3J0CisKK2NvbmZpZyBTM0NfR1BJT19TUEFDRQorCWludCAiU3BhY2UgYmV0d2VlbiBncGlvIGJhbmtzIgorCWRlZmF1bHQgMAorCWhlbHAKKwkgIEFkZCBhIG51bWJlciBvZiBzcGFyZSBHUElPIGVudHJpZXMgYmV0d2VlbiBlYWNoIGJhbmsgZm9yIGRlYnVnZ2luZworCSAgcHVycG9zZXMuIFRoaXMgYWxsb3dzIGFueSBwcm9ibGVtcyB3aGVyZSBhbiBjb3VudGVyIG92ZXJmbG93cyBmcm9tCisJICBvbmUgYmFuayB0byBhbm90aGVyIHRvIGJlIGNhdWdodCwgYXQgdGhlIGV4cGVuc2Ugb2YgdXNpbmcgYSBsaXR0bGUKKwkgIG1vcmUgbWVtb3J5LgorCitjb25maWcgUzNDX0dQSU9fVFJBQ0sKKwlib29sCisJaGVscAorCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBzM2Mgc3BlY2lmaWMgZ3BpbworCSAgY2hpcCB0cmFja2luZyBpZiB0aGUgcGxhdGZvcm0gcmVxdWlyZXMgaXQuCisKK2NvbmZpZyBTM0NfR1BJT19QVUxMX1VQRE9XTgorCWJvb2wKKwloZWxwCisJICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgY29ycmVjdCBHUElPIHB1bGwgaGVscGVyCisKK2NvbmZpZyBTM0NfR1BJT19QVUxMX0RPV04KKwlib29sCisJaGVscAorCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGNvcnJlY3QgR1BJTyBwdWxsIGhlbHBlcgorCitjb25maWcgUzNDX0dQSU9fUFVMTF9VUAorCWJvb2wKKwloZWxwCisJICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgY29ycmVjdCBHUElPIHB1bGwgaGVscGVyCisKK2NvbmZpZyBTM0NfR1BJT19DRkdfUzNDMjRYWAorCWJvb2wKKwloZWxwCisJICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbgorCSAgZnVuY3Rpb25zLgorCitjb25maWcgUzNDX0dQSU9fQ0ZHX1MzQzY0WFgKKwlib29sCisJaGVscAorCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB0byBlbmFibGUgUzNDNjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24KKwkgIGZ1bmN0aW9ucy4KKworIyBkZXZpY2UgZGVmaW5pdGlvbnMgdG8gY29tcGlsZSBpbgorCitjb25maWcgUzNDX0RFVl9IU01NQworCWJvb2wKKwloZWxwCisJICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgSFNNTUMgY29kZQorCitjb25maWcgUzNDX0RFVl9IU01NQzEKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIEhTTU1DIGNoYW5uZWwgMQorCitjb25maWcgUzNDX0RFVl9JMkMxCisJYm9vbAorCWhlbHAKKwkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciBJMkMgY2hhbm5lbCAxCisKK2NvbmZpZyBTM0NfREVWX0ZCCisJYm9vbAorCWhlbHAKKwkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb24gZm9yIGZyYW1lYnVmZmVyCisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtczNjL01ha2VmaWxlCmluZGV4IGYwM2Q3YjMuLjM5MTk1ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL01ha2VmaWxlCkBAIC0xLDMgKzEsMjcgQEAKLSMgZHVtbXkgbWFrZWZpbGUsIGN1cnJlbnRseSBqdXN0IGluY2x1ZGluZyBhc20vYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdAorIyBhcmNoL2FybS9wbGF0LXMzYy9NYWtlZmlsZQorIworIyBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIKIAotb2JqLW4JOj0gZHVtbXkubworb2JqLXkJCQkJOj0KK29iai1tCQkJCTo9CitvYmotbgkJCQk6PQorb2JqLQkJCQk6PQorCisjIENvcmUgc3VwcG9ydCBmb3IgYWxsIFNhbXN1bmcgU29DcworCitvYmoteQkJCQkrPSAgaW5pdC5vCitvYmoteQkJCQkrPSB0aW1lLm8KK29iai15CQkJCSs9IGNsb2NrLm8KK29iai15CQkJCSs9IHB3bS1jbG9jay5vCitvYmoteQkJCQkrPSBncGlvLm8KK29iai15CQkJCSs9IGdwaW8tY29uZmlnLm8KKworIyBkZXZpY2VzCisKK29iai0kKENPTkZJR19TM0NfREVWX0hTTU1DKQkrPSBkZXYtaHNtbWMubworb2JqLSQoQ09ORklHX1MzQ19ERVZfSFNNTUMxKQkrPSBkZXYtaHNtbWMxLm8KK29iai15CQkJCSs9IGRldi1pMmMwLm8KK29iai0kKENPTkZJR19TM0NfREVWX0kyQzEpCSs9IGRldi1pMmMxLm8KK29iai0kKENPTkZJR19TM0NfREVWX0ZCKQkrPSBkZXYtZmIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiZTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Nsb2NrLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jbG9jay5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjRYWCBDb3JlIGNsb2NrIGNvbnRyb2wgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uLCBhbmQgY29kZSBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2Nsb2NrLmMKKyAqKgorICoqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQuCisgKiogIFdyaXR0ZW4gYnkgRGVlcCBCbHVlIFNvbHV0aW9ucyBMaW1pdGVkLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworLyogY2xvY2sgaW5mb3JtYXRpb24gKi8KKworc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOworCisvKiBXZSBvcmlnaW5hbGx5IHVzZWQgYW4gbXV0ZXggaGVyZSwgYnV0IHNvbWUgY29udGV4dHMgKHNlZSByZXN1bWUpCisgKiBhcmUgY2FsbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBjbGtfc2V0X3BhcmVudCgpIHdpdGggSVJRcyBkaXNhYmxlZAorICogY2F1c2luZyBhbiBCVUcgdG8gYmUgdHJpZ2dlcmVkLgorICovCitERUZJTkVfU1BJTkxPQ0soY2xvY2tzX2xvY2spOworCisvKiBlbmFibGUgYW5kIGRpc2FibGUgY2FsbHMgZm9yIHVzZSB3aXRoIHRoZSBjbGsgc3RydWN0ICovCisKK3N0YXRpYyBpbnQgY2xrX251bGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQ2xvY2sgQVBJIGNhbGxzICovCisKK3N0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKK3sKKwlzdHJ1Y3QgY2xrICpwOworCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CisJaW50IGlkbm87CisKKwlpZiAoZGV2ID09IE5VTEwgfHwgZGV2LT5idXMgIT0gJnBsYXRmb3JtX2J1c190eXBlKQorCQlpZG5vID0gLTE7CisJZWxzZQorCQlpZG5vID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldiktPmlkOworCisJc3Bpbl9sb2NrKCZjbG9ja3NfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIGxpc3QpIHsKKwkJaWYgKHAtPmlkID09IGlkbm8gJiYKKwkJICAgIHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJgorCQkgICAgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CisJCQljbGsgPSBwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBkZXZpY2Ugd2FzIHN1cHBsaWVkLCBidXQgdGhlCisJICogY2xvY2sgdGhhdCB3YXMgYmVpbmcgc2VhcmNoZWQgZm9yIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgKi8KKworCWlmIChJU19FUlIoY2xrKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIGxpc3QpIHsKKwkJCWlmIChwLT5pZCA9PSAtMSAmJiBzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYKKwkJCSAgICB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKKwkJCQljbGsgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmNsb2Nrc19sb2NrKTsKKwlyZXR1cm4gY2xrOworfQorCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworCW1vZHVsZV9wdXQoY2xrLT5vd25lcik7Cit9CisKK2ludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoSVNfRVJSKGNsaykgfHwgY2xrID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrX2VuYWJsZShjbGstPnBhcmVudCk7CisKKwlzcGluX2xvY2soJmNsb2Nrc19sb2NrKTsKKworCWlmICgoY2xrLT51c2FnZSsrKSA9PSAwKQorCQkoY2xrLT5lbmFibGUpKGNsaywgMSk7CisKKwlzcGluX3VubG9jaygmY2xvY2tzX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoSVNfRVJSKGNsaykgfHwgY2xrID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmY2xvY2tzX2xvY2spOworCisJaWYgKCgtLWNsay0+dXNhZ2UpID09IDApCisJCShjbGstPmVuYWJsZSkoY2xrLCAwKTsKKworCXNwaW5fdW5sb2NrKCZjbG9ja3NfbG9jayk7CisJY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOworfQorCisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiAwOworCisJaWYgKGNsay0+cmF0ZSAhPSAwKQorCQlyZXR1cm4gY2xrLT5yYXRlOworCisJaWYgKGNsay0+Z2V0X3JhdGUgIT0gTlVMTCkKKwkJcmV0dXJuIChjbGstPmdldF9yYXRlKShjbGspOworCisJaWYgKGNsay0+cGFyZW50ICE9IE5VTEwpCisJCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpZiAoIUlTX0VSUihjbGspICYmIGNsay0+cm91bmRfcmF0ZSkKKwkJcmV0dXJuIChjbGstPnJvdW5kX3JhdGUpKGNsaywgcmF0ZSk7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFdlIGRvIG5vdCBkZWZhdWx0IGp1c3QgZG8gYSBjbGstPnJhdGUgPSByYXRlIGFzCisJICogdGhlIGNsb2NrIG1heSBoYXZlIGJlZW4gbWFkZSB0aGlzIHdheSBieSBjaG9pY2UuCisJICovCisKKwlXQVJOX09OKGNsay0+c2V0X3JhdGUgPT0gTlVMTCk7CisKKwlpZiAoY2xrLT5zZXRfcmF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmY2xvY2tzX2xvY2spOworCXJldCA9IChjbGstPnNldF9yYXRlKShjbGssIHJhdGUpOworCXNwaW5fdW5sb2NrKCZjbG9ja3NfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgY2xrICpjbGtfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cGFyZW50OworfQorCitpbnQgY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZjbG9ja3NfbG9jayk7CisKKwlpZiAoY2xrLT5zZXRfcGFyZW50KQorCQlyZXQgPSAoY2xrLT5zZXRfcGFyZW50KShjbGssIHBhcmVudCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKK0VYUE9SVF9TWU1CT0woY2xrX3B1dCk7CitFWFBPUlRfU1lNQk9MKGNsa19lbmFibGUpOworRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MKGNsa19nZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woY2xrX2dldF9wYXJlbnQpOworRVhQT1JUX1NZTUJPTChjbGtfc2V0X3BhcmVudCk7CisKKy8qIGJhc2UgY2xvY2tzICovCisKK3N0YXRpYyBpbnQgY2xrX2RlZmF1bHRfc2V0cmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwljbGstPnJhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY2xrIGNsa194dGFsID0geworCS5uYW1lCQk9ICJ4dGFsIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gMCwKKwkucGFyZW50CQk9IE5VTEwsCisJLmN0cmxiaXQJPSAwLAorfTsKKworc3RydWN0IGNsayBjbGtfZXh0ID0geworCS5uYW1lCQk9ICJleHQiLAorCS5pZAkJPSAtMSwKK307CisKK3N0cnVjdCBjbGsgY2xrX2VwbGwgPSB7CisJLm5hbWUJCT0gImVwbGwiLAorCS5pZAkJPSAtMSwKK307CisKK3N0cnVjdCBjbGsgY2xrX21wbGwgPSB7CisJLm5hbWUJCT0gIm1wbGwiLAorCS5pZAkJPSAtMSwKKwkuc2V0X3JhdGUJPSBjbGtfZGVmYXVsdF9zZXRyYXRlLAorfTsKKworc3RydWN0IGNsayBjbGtfdXBsbCA9IHsKKwkubmFtZQkJPSAidXBsbCIsCisJLmlkCQk9IC0xLAorCS5wYXJlbnQJCT0gTlVMTCwKKwkuY3RybGJpdAk9IDAsCit9OworCitzdHJ1Y3QgY2xrIGNsa19mID0geworCS5uYW1lCQk9ICJmY2xrIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gMCwKKwkucGFyZW50CQk9ICZjbGtfbXBsbCwKKwkuY3RybGJpdAk9IDAsCisJLnNldF9yYXRlCT0gY2xrX2RlZmF1bHRfc2V0cmF0ZSwKK307CisKK3N0cnVjdCBjbGsgY2xrX2ggPSB7CisJLm5hbWUJCT0gImhjbGsiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAwLAorCS5wYXJlbnQJCT0gTlVMTCwKKwkuY3RybGJpdAk9IDAsCisJLnNldF9yYXRlCT0gY2xrX2RlZmF1bHRfc2V0cmF0ZSwKK307CisKK3N0cnVjdCBjbGsgY2xrX3AgPSB7CisJLm5hbWUJCT0gInBjbGsiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAwLAorCS5wYXJlbnQJCT0gTlVMTCwKKwkuY3RybGJpdAk9IDAsCisJLnNldF9yYXRlCT0gY2xrX2RlZmF1bHRfc2V0cmF0ZSwKK307CisKK3N0cnVjdCBjbGsgY2xrX3VzYl9idXMgPSB7CisJLm5hbWUJCT0gInVzYi1idXMiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAwLAorCS5wYXJlbnQJCT0gJmNsa191cGxsLAorfTsKKworCisKK3N0cnVjdCBjbGsgczNjMjR4eF91Y2xrID0geworCS5uYW1lCQk9ICJ1Y2xrIiwKKwkuaWQJCT0gLTEsCit9OworCisvKiBpbml0aWFsaXNlIHRoZSBjbG9jayBzeXN0ZW0gKi8KKworaW50IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCWlmIChjbGstPmVuYWJsZSA9PSBOVUxMKQorCQljbGstPmVuYWJsZSA9IGNsa19udWxsX2VuYWJsZTsKKworCS8qIGFkZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2xvY2tzICovCisKKwkvKiBRdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBjbG9jayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuICovCisJQlVHX09OKGNsay0+bGlzdC5wcmV2ICE9IGNsay0+bGlzdC5uZXh0KTsKKworCXNwaW5fbG9jaygmY2xvY2tzX2xvY2spOworCWxpc3RfYWRkKCZjbGstPmxpc3QsICZjbG9ja3MpOworCXNwaW5fdW5sb2NrKCZjbG9ja3NfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2tzKHN0cnVjdCBjbGsgKipjbGtzLCBpbnQgbnJfY2xrcykKK3sKKwlpbnQgZmFpbHMgPSAwOworCisJZm9yICg7IG5yX2Nsa3MgPiAwOyBucl9jbGtzLS0sIGNsa3MrKykgeworCQlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygqY2xrcykgPCAwKQorCQkJZmFpbHMrKzsKKwl9CisKKwlyZXR1cm4gZmFpbHM7Cit9CisKKy8qIGluaXRhbGlzZSBhbGwgdGhlIGNsb2NrcyAqLworCitpbnQgX19pbml0IHMzYzI0eHhfcmVnaXN0ZXJfYmFzZWNsb2Nrcyh1bnNpZ25lZCBsb25nIHh0YWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiUzNDMjRYWCBDbG9ja3MsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisKKwljbGtfeHRhbC5yYXRlID0geHRhbDsKKworCS8qIHJlZ2lzdGVyIG91ciBjbG9ja3MgKi8KKworCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfeHRhbCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBtYXN0ZXIgeHRhbFxuIik7CisKKwlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX21wbGwpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgbXBsbCBjbG9ja1xuIik7CisKKwlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX3VwbGwpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgdXBsbCBjbG9ja1xuIik7CisKKwlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX2YpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgY3B1IGZjbGtcbiIpOworCisJaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa19oKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdSBoY2xrXG4iKTsKKworCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfcCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBjcHUgcGNsa1xuIik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU0YjhlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMKQEAgLTAsMCArMSw3MiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgZnJhbWVidWZmZXIgZGV2aWNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KKworI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19mYl9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDX1BBX0ZCLAorCQkuZW5kICAgPSBTM0NfUEFfRkIgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0xDRF9WU1lOQywKKwkJLmVuZCAgID0gSVJRX0xDRF9WU1lOQywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCA9IElSUV9MQ0RfRklGTywKKwkJLmVuZCAgID0gSVJRX0xDRF9GSUZPLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0xDRF9TWVNURU0sCisJCS5lbmQgICA9IElSUV9MQ0RfU1lTVEVNLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2ZiID0geworCS5uYW1lCQkgID0gInMzYy1mYiIsCisJLmlkCQkgID0gLTEsCisJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2ZiX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19mYl9yZXNvdXJjZSwKKwkuZGV2LmRtYV9tYXNrCSAgPSAmczNjX2RldmljZV9mYi5kZXYuY29oZXJlbnRfZG1hX21hc2ssCisJLmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTCwKK307CisKK3ZvaWQgX19pbml0IHMzY19mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqcGQpCit7CisJc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqbnBkOworCisJaWYgKCFwZCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2Yoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghbnBkKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKKworCXMzY19kZXZpY2VfZmIuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMuYyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1oc21tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDViMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMuYwpAQCAtMCwwICsxLDY4IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaHNtbWMgZGV2aWNlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKyNkZWZpbmUgUzNDX1NaX0hTTU1DCSgweDEwMDApCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0NfUEFfSFNNTUMwLAorCQkuZW5kICAgPSBTM0NfUEFfSFNNTUMwICsgUzNDX1NaX0hTTU1DIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9IU01NQzAsCisJCS5lbmQgICA9IElSUV9IU01NQzAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyB1NjQgczNjX2RldmljZV9oc21tY19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzBfZGVmX3BsYXRkYXRhID0geworCS5tYXhfd2lkdGgJPSA0LAorCS5ob3N0X2NhcHMJPSAoTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCSAgIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzAgPSB7CisJLm5hbWUJCT0gInMzYy1zZGhjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc21tY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzbW1jX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnMzY19kZXZpY2VfaHNtbWNfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZlVMLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEsCisJfSwKK307CisKK3ZvaWQgczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCit7CisJc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqc2V0ID0gJnMzY19oc21tYzBfZGVmX3BsYXRkYXRhOworCisJc2V0LT5tYXhfd2lkdGggPSBwZC0+bWF4X3dpZHRoOworCisJaWYgKHBkLT5jZmdfZ3BpbykKKwkJc2V0LT5jZmdfZ3BpbyA9IHBkLT5jZmdfZ3BpbzsKKwlpZiAocGQtPmNmZ19jYXJkKQorCQlzZXQtPmNmZ19jYXJkID0gcGQtPmNmZ19jYXJkOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jMS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWJjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMxLmMKQEAgLTAsMCArMSw2OCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jMS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBoc21tYyBkZXZpY2UgMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKyNkZWZpbmUgUzNDX1NaX0hTTU1DCSgweDEwMDApCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDX1BBX0hTTU1DMSwKKwkJLmVuZCAgID0gUzNDX1BBX0hTTU1DMSArIFMzQ19TWl9IU01NQyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSFNNTUMxLAorCQkuZW5kICAgPSBJUlFfSFNNTUMxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWMxX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CisKK3N0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEgPSB7CisJLm1heF93aWR0aAk9IDQsCisJLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMSA9IHsKKwkubmFtZQkJPSAiczNjLXNkaGNpIiwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jMV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzbW1jMV9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2hzbW1jMV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YSwKKwl9LAorfTsKKwordm9pZCBzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCkKK3sKKwlzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpzZXQgPSAmczNjX2hzbW1jMV9kZWZfcGxhdGRhdGE7CisKKwlzZXQtPm1heF93aWR0aCA9IHBkLT5tYXhfd2lkdGg7CisKKwlpZiAocGQtPmNmZ19ncGlvKQorCQlzZXQtPmNmZ19ncGlvID0gcGQtPmNmZ19ncGlvOworCWlmIChwZC0+Y2ZnX2NhcmQpCisJCXNldC0+Y2ZnX2NhcmQgPSBwZC0+Y2ZnX2NhcmQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzAxMjhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzAuYwpAQCAtMCwwICsxLDcxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgMAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0NfUEFfSUlDLAorCQkuZW5kICAgPSBTM0NfUEFfSUlDICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0lJQywKKwkJLmVuZCAgID0gSVJRX0lJQywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMwID0geworCS5uYW1lCQkgID0gInMzYzI0MTAtaTJjIiwKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkMxCisJLmlkCQkgID0gMCwKKyNlbHNlCisJLmlkCQkgID0gLTEsCisjZW5kaWYKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19pMmNfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGEwIF9faW5pdGRhdGEgPSB7CisJLmZsYWdzCQk9IDAsCisJLnNsYXZlX2FkZHIJPSAweDEwLAorCS5idXNfZnJlcQk9IDEwMCoxMDAwLAorCS5tYXhfZnJlcQk9IDQwMCoxMDAwLAorCS5zZGFfZGVsYXkJPSBTM0MyNDEwX0lJQ0xDX1NEQV9ERUxBWTUgfCBTM0MyNDEwX0lJQ0xDX0ZJTFRFUl9PTiwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmMwX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTA7CisKKwlucGQgPSBrbWVtZHVwKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFucGQpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeSBmb3IgcGxhdGZvcm0gZGF0YVxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKCFucGQtPmNmZ19ncGlvKQorCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzBfY2ZnX2dwaW87CisKKwlzM2NfZGV2aWNlX2kyYzAuZGV2LnBsYXRmb3JtX2RhdGEgPSBucGQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU4ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzEuYwpAQCAtMCwwICsxLDY4IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgMQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0NfUEFfSUlDMSwKKwkJLmVuZCAgID0gUzNDX1BBX0lJQzEgKyBTWl80SyAtIDEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSUlDMSwKKwkJLmVuZCAgID0gSVJRX0lJQzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMSA9IHsKKwkubmFtZQkJICA9ICJzM2MyNDEwLWkyYyIsCisJLmlkCQkgID0gMSwKKwkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJICA9IHMzY19pMmNfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGExIF9faW5pdGRhdGEgPSB7CisJLmZsYWdzCQk9IDAsCisJLmJ1c19udW0JPSAxLAorCS5zbGF2ZV9hZGRyCT0gMHgxMCwKKwkuYnVzX2ZyZXEJPSAxMDAqMTAwMCwKKwkubWF4X2ZyZXEJPSA0MDAqMTAwMCwKKwkuc2RhX2RlbGF5CT0gUzNDMjQxMF9JSUNMQ19TREFfREVMQVk1IHwgUzNDMjQxMF9JSUNMQ19GSUxURVJfT04sCit9OworCit2b2lkIF9faW5pdCBzM2NfaTJjMV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKKworCWlmICghcGQpCisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGExOworCisJbnBkID0ga21lbWR1cChwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksIEdGUF9LRVJORUwpOworCWlmICghbnBkKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKKwllbHNlIGlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMxX2NmZ19ncGlvOworCisJczNjX2RldmljZV9pMmMxLmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvZ3Bpby1jb25maWcuYyBiL2FyY2gvYXJtL3BsYXQtczNjL2dwaW8tY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0MmI5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2dwaW8tY29uZmlnLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2dwaW8tY29uZmlnLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQyBzZXJpZXMgR1BJTyBjb25maWd1cmF0aW9uIGNvcmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9ncGlvLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+CisKK2ludCBzM2NfZ3Bpb19jZmdwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzZXQ7CisJaW50IHJldDsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gczNjX2dwaW9fZG9fc2V0Y2ZnKGNoaXAsIG9mZnNldCwgY29uZmlnKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgczNjX2dwaW9fc2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzZXQsIHJldDsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gczNjX2dwaW9fZG9fc2V0cHVsbChjaGlwLCBvZmZzZXQsIHB1bGwpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUzNDX0dQSU9fQ0ZHX1MzQzI0WFgKK2ludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9iYW5rYShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG9mZjsKKwl1MzIgY29uOworCisJaWYgKHMzY19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKworCQkvKiBNYXAgb3V0cHV0IHRvIDAsIGFuZCBTRk4yIHRvIDEgKi8KKwkJY2ZnIC09IDE7CisJCWlmIChjZmcgPiAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2ZnIDw8PSBzaGlmdDsKKwl9CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiAmPSB+KDB4MSA8PCBzaGlmdCk7CisJY29uIHw9IGNmZzsKKwlfX3Jhd193cml0ZWwoY29uLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBvZmYgKiAyOworCXUzMiBjb247CisKKwlpZiAoczNjX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgeworCQljZmcgJj0gMHhmOworCQlpZiAoY2ZnID4gMykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNmZyA8PD0gc2hpZnQ7CisJfQorCisJY29uID0gX19yYXdfcmVhZGwocmVnKTsKKwljb24gJj0gfigweDMgPDwgc2hpZnQpOworCWNvbiB8PSBjZmc7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUzNDX0dQSU9fQ0ZHX1MzQzY0WFgKK2ludCBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSAob2ZmICYgNykgKiA0OworCXUzMiBjb247CisKKwlpZiAob2ZmIDwgOCAmJiBjaGlwLT5jaGlwLm5ncGlvID49IDgpCisJCXJlZyAtPSA0OworCisJaWYgKHMzY19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKwkJY2ZnIDw8PSBzaGlmdDsKKwl9CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiAmPSB+KDB4ZiA8PCBzaGlmdCk7CisJY29uIHw9IGNmZzsKKwlfX3Jhd193cml0ZWwoY29uLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX0NGR19TM0M2NFhYICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0dQSU9fUFVMTF9VUERPV04KK2ludCBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OworCWludCBzaGlmdCA9IG9mZiAqIDI7CisJdTMyIHB1cDsKKworCXB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJcHVwICY9IH4oMyA8PCBzaGlmdCk7CisJcHVwIHw9IHB1bGwgPDwgc2hpZnQ7CisJX19yYXdfd3JpdGVsKHB1cCwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF91cGRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmYpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlICsgMHgwODsKKwlpbnQgc2hpZnQgPSBvZmYgKiAyOworCXUzMiBwdXAgPSBfX3Jhd19yZWFkbChyZWcpOworCisJcHVwID4+PSBzaGlmdDsKKwlwdXAgJj0gMHgzOworCXJldHVybiAoX19mb3JjZSBzM2NfZ3Bpb19wdWxsX3QpcHVwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxZGQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2dwaW8uYwpAQCAtMCwwICsxLDE0NyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQyBzZXJpZXMgR1BJTyBjb3JlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgorCisjaWZkZWYgQ09ORklHX1MzQ19HUElPX1RSQUNLCitzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9zW1MzQ19HUElPX0VORF07CisKK3N0YXRpYyBfX2luaXQgdm9pZCBzM2NfZ3Bpb2xpYl90cmFjayhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BuOworCWludCBpOworCisJZ3BuID0gY2hpcC0+Y2hpcC5iYXNlOworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5jaGlwLm5ncGlvOyBpKyssIGdwbisrKSB7CisJCUJVR19PTihncG4gPiBBUlJBWV9TSVpFKHMzY19ncGlvcykpOworCQlzM2NfZ3Bpb3NbZ3BuXSA9IGNoaXA7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TM0NfR1BJT19UUkFDSyAqLworCisvKiBEZWZhdWx0IHJvdXRpbmVzIGZvciBjb250cm9sbGluZyBHUElPLCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgUzNDMjRYWAorICogR1BJTyBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIGVhY2ggZ3BpbyBiYW5rIG9mIHRoZQorICogY2hpcCBpcyBhcyBmb2xsb3dpbmc6CisgKgorICogYmFzZSArIDB4MDA6IENvbnRyb2wgcmVnaXN0ZXIsIDIgYml0cyBwZXIgZ3BpbworICoJICAgICAgICBncGlvIG46IDIgYml0cyBzdGFydGluZyBhdCAoMipuKQorICoJCTAwID0gaW5wdXQsIDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCisgKiBiYXNlICsgMHgwNDogRGF0YSByZWdpc3RlciwgMSBiaXQgcGVyIGdwaW8KKyAqCQliaXQgbjogZGF0YSBiaXQgbgorKi8KKworc3RhdGljIGludCBzM2NfZ3Bpb2xpYl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7CisJY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOworCisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzY19ncGlvbGliX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJICAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkYXQ7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOworCWlmICh2YWx1ZSkKKwkJZGF0IHw9IDEgPDwgb2Zmc2V0OworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDAwKTsKKwljb24gJj0gfigzIDw8IChvZmZzZXQgKiAyKSk7CisJY29uIHw9IDEgPDwgKG9mZnNldCAqIDIpOworCisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczNjX2dwaW9saWJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkYXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOworCWlmICh2YWx1ZSkKKwkJZGF0IHw9IDEgPDwgb2Zmc2V0OworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBzM2NfZ3Bpb2xpYl9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChvdXJjaGlwLT5iYXNlICsgMHgwNCk7CisJdmFsID4+PSBvZmZzZXQ7CisJdmFsICY9IDE7CisKKwlyZXR1cm4gdmFsOworfQorCitfX2luaXQgdm9pZCBzM2NfZ3Bpb2xpYl9hZGQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSAmY2hpcC0+Y2hpcDsKKwlpbnQgcmV0OworCisJQlVHX09OKCFjaGlwLT5iYXNlKTsKKwlCVUdfT04oIWdjLT5sYWJlbCk7CisJQlVHX09OKCFnYy0+bmdwaW8pOworCisJaWYgKCFnYy0+ZGlyZWN0aW9uX2lucHV0KQorCQlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gczNjX2dwaW9saWJfaW5wdXQ7CisJaWYgKCFnYy0+ZGlyZWN0aW9uX291dHB1dCkKKwkJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBzM2NfZ3Bpb2xpYl9vdXRwdXQ7CisJaWYgKCFnYy0+c2V0KQorCQlnYy0+c2V0ID0gczNjX2dwaW9saWJfc2V0OworCWlmICghZ2MtPmdldCkKKwkJZ2MtPmdldCA9IHMzY19ncGlvbGliX2dldDsKKworCS8qIGdwaW9jaGlwX2FkZCgpIHByaW50cyBvd24gZmFpbHVyZSBtZXNzYWdlIG9uIGVycm9yLiAqLworCXJldCA9IGdwaW9jaGlwX2FkZChnYyk7CisJaWYgKHJldCA+PSAwKQorCQlzM2NfZ3Bpb2xpYl90cmFjayhjaGlwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9tYWNoL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNTM2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvbWFjaC9pby5oCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+CisgKgorICogRGVmYXVsdCBJTyByb3V0aW5lcyBmb3IgcGxhdC1zM2MgYmFzZWQgc3lzdGVtcywgc3VjaCBhcyBTM0MyNEEwCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUk1fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSTV9BUkNIX0lPX0gKKworLyogTm8gY3VycmVudCBJU0EvUENJIGJ1cyBzdXBwb3J0LiAqLworI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKKworI2RlZmluZSBJT19TUEFDRV9MSU1JVCAoMHhGRkZGRkZGRikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL21hY2gvdGltZXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC90aW1leC5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL21hY2gvdGltZXguaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCmluZGV4IDMxNWIwMDcuLmJmZDJjYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTEsNCArMSw0IEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorLyogYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAogICoKICAqIGZyb20gYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9hZGMuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9hZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RmMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2FkYy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9hZGMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW1udGUuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjRYWCBBREMgZHJpdmVyIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fUExBVF9BRENfSAorI2RlZmluZSBfX0FTTV9QTEFUX0FEQ19IIF9fRklMRV9fCisKK3N0cnVjdCBzM2NfYWRjX2NsaWVudDsKKworZXh0ZXJuIGludCBzM2NfYWRjX3N0YXJ0KHN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50LAorCQkJIHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgbnJfc2FtcGxlcyk7CisKK2V4dGVybiBzdHJ1Y3QgczNjX2FkY19jbGllbnQgKnMzY19hZGNfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJICAgICAgIHZvaWQgKCpzZWxlY3QpKHVuc2lnbmVkIHNlbGVjdGVkKSwKKwkJCQkJICAgICAgIHZvaWQgKCpjb252KSh1bnNpZ25lZCBkMCwgdW5zaWduZWQgZDEpLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGlzX3RzKTsKKworZXh0ZXJuIHZvaWQgczNjX2FkY19yZWxlYXNlKHN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50KTsKKworI2VuZGlmIC8qIF9fQVNNX1BMQVRfQURDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jbG9jay5oCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY2xvY2suaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKaW5kZXggMjM1Yjc1My4uYTEwNjIyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jbG9jay5oCkBAIC0xLDUgKzEsNCBAQAotLyogbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9jbG9jay5oCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suaAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKICAqCWh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCkBAIC0xMCw2ICs5LDggQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKIHN0cnVjdCBjbGsgewogCXN0cnVjdCBsaXN0X2hlYWQgICAgICBsaXN0OwogCXN0cnVjdCBtb2R1bGUgICAgICAgICpvd25lcjsKQEAgLTQ0LDIxICs0NSw0NCBAQAogZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3A7CiBleHRlcm4gc3RydWN0IGNsayBjbGtfbXBsbDsKIGV4dGVybiBzdHJ1Y3QgY2xrIGNsa191cGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2VwbGw7CiBleHRlcm4gc3RydWN0IGNsayBjbGtfeHRhbDsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19leHQ7CisKKy8qIFMzQzY0WFggc3BlY2lmaWMgY2xvY2tzICovCitleHRlcm4gc3RydWN0IGNsayBjbGtfMjdtOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrXzQ4bTsKIAogLyogZXhwb3J0cyBmb3IgYXJjaC9hcm0vbWFjaC1zM2MyNDEwCiAgKgogICogUGxlYXNlIERPIE5PVCB1c2UgdGhlc2Ugb3V0c2lkZSBvZiBhcmNoL2FybS9tYWNoLXMzYzI0MTAKICovCiAKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggY2xvY2tzX211dGV4OworZXh0ZXJuIHNwaW5sb2NrX3QgY2xvY2tzX2xvY2s7CiAKIGV4dGVybiBpbnQgczNjMjQxMF9jbGtjb25fZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CiAKIGV4dGVybiBpbnQgczNjMjR4eF9yZWdpc3Rlcl9jbG9jayhzdHJ1Y3QgY2xrICpjbGspOwogZXh0ZXJuIGludCBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrcyhzdHJ1Y3QgY2xrICoqY2xrLCBpbnQgbnJfY2xrcyk7CiAKLWV4dGVybiBpbnQgczNjMjR4eF9zZXR1cF9jbG9ja3ModW5zaWduZWQgbG9uZyB4dGFsLAotCQkJCXVuc2lnbmVkIGxvbmcgZmNsaywKLQkJCQl1bnNpZ25lZCBsb25nIGhjbGssCi0JCQkJdW5zaWduZWQgbG9uZyBwY2xrKTsKK2V4dGVybiBpbnQgczNjMjR4eF9yZWdpc3Rlcl9iYXNlY2xvY2tzKHVuc2lnbmVkIGxvbmcgeHRhbCk7CisKK2V4dGVybiB2b2lkIHMzYzY0eHhfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNHh4X3NldHVwX2Nsb2Nrcyh1bnNpZ25lZCBsb25nIGZjbGssCisJCQkJIHVuc2lnbmVkIGxvbmcgaGNsaywKKwkJCQkgdW5zaWduZWQgbG9uZyBwY2xrKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9zZXR1cF9jbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBzM2MyNDEyX3NldHVwX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzI0NHhfc2V0dXBfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjMjQ0M19zZXR1cF9jbG9ja3Modm9pZCk7CisKKy8qIFMzQzY0WFggc3BlY2lmaWMgZnVuY3Rpb25zIGFuZCBjbG9ja3MgKi8KKworZXh0ZXJuIGludCBzM2M2NHh4X3NjbGtfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOworCisvKiBJbml0IGZvciBwd20gY2xvY2sgY29kZSAqLworCitleHRlcm4gdm9pZCBzM2NfcHdtY2xrX2luaXQodm9pZCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQyBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgc3VwcG9ydCAtIGRyaXZlciBhbmQgYm9hcmQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworc3RydWN0IHMzY19jcHVmcmVxX2luZm87CitzdHJ1Y3QgczNjX2NwdWZyZXFfYm9hcmQ7CitzdHJ1Y3QgczNjX2lvdGltaW5nczsKKworc3RydWN0IHMzY19mcmVxIHsKKwl1bnNpZ25lZCBsb25nCWZjbGs7CisJdW5zaWduZWQgbG9uZwlhcm1jbGs7CisJdW5zaWduZWQgbG9uZwloY2xrX3RuczsJLyogaW4gMTB0aHMgb2YgbnMgKi8KKwl1bnNpZ25lZCBsb25nCWhjbGs7CisJdW5zaWduZWQgbG9uZwlwY2xrOworfTsKKworLyogd3JhcHBlciAnc3RydWN0IGNwdWZyZXFfZnJlcXMnIHNvIHRoYXQgYW55IGRyaXZlcnMgcmVjZWl2aW5nIHRoZQorICogbm90aWZpY2F0aW9uIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBwcm92aWRlZCBieSBqdXN0CisgKiBoYXZpbmcgdGhlIGNvcmUgZnJlcXVlbmN5IGFsb25lLgorICovCisKK3N0cnVjdCBzM2NfY3B1ZnJlcV9mcmVxcyB7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMJZnJlcXM7CisJc3RydWN0IHMzY19mcmVxCQlvbGQ7CisJc3RydWN0IHMzY19mcmVxCQluZXc7Cit9OworCisjZGVmaW5lIHRvX3MzY19jcHVmcmVxKF9jZikgY29udGFpbmVyX29mKF9jZiwgc3RydWN0IHMzY19jcHVmcmVxX2ZyZXFzLCBmcmVxcykKKworc3RydWN0IHMzY19jbGtkaXZzIHsKKwlpbnQJCXBfZGl2aXNvcjsJLyogZmNsayAvIHBjbGsgKi8KKwlpbnQJCWhfZGl2aXNvcjsJLyogZmNsayAvIGhjbGsgKi8KKwlpbnQJCWFybV9kaXZpc29yOwkvKiBub3QgYWxsIGNwdXMgaGF2ZSB0aGlzLiAqLworCXVuc2lnbmVkIGNoYXIJZHZzOwkJLyogdXNpbmcgZHZzIG1vZGUgdG8gYXJtLiAqLworfTsKKworI2RlZmluZSBQTExWQUwoX20sIF9wLCBfcykgKCgoX20pIDw8IDEyKSB8ICgoX3ApIDw8IDQpIHwgKF9zKSkKKworc3RydWN0IHMzY19wbGx2YWwgeworCXVuc2lnbmVkIGxvbmcJCWZyZXE7CisJdW5zaWduZWQgbG9uZwkJcGxsX3JlZzsKK307CisKK3N0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgeworCXN0cnVjdCBzM2NfZnJlcQkJZnJlcTsKKwlzdHJ1Y3QgczNjX3BsbHZhbAlwbGw7CisJc3RydWN0IHMzY19jbGtkaXZzCWRpdnM7CisJc3RydWN0IHMzY19jcHVmcmVxX2luZm8gKmluZm87CS8qIGZvciBjb3JlLCBub3QgZHJpdmVycyAqLworCXN0cnVjdCBzM2NfY3B1ZnJlcV9ib2FyZCAqYm9hcmQ7Cit9OworCisvKiBzM2NfY3B1ZnJlcV9ib2FyZAorICoKKyAqIHBlci1ib2FyZCBjb25maWd1cmF0b24gaW5mb3JtYXRpb24sIHN1Y2ggYXMgbWVtb3J5IHJlZnJlc2ggYW5kCisgKiBob3cgdG8gaW5pdGlhbGlzZSBJTyB0aW1pbmdzLgorICovCitzdHJ1Y3QgczNjX2NwdWZyZXFfYm9hcmQgeworCXVuc2lnbmVkIGludAlyZWZyZXNoOwkvKiByZWZyZXNoIHBlcmlvZCBpbiBucyAqLworCXVuc2lnbmVkIGludAlhdXRvX2lvOjE7CS8qIGF1dG9tYXRpY2FsbHkgaW5pdCBpbyB0aW1pbmdzLiAqLworCXVuc2lnbmVkIGludAluZWVkX2lvOjE7CS8qIHNldCBpZiBuZWVkcyBpbyB0aW1pbmcgc3VwcG9ydC4gKi8KKworCS8qIGFueSBub24temVybyBmaWVsZCBpbiBoZXJlIGlzIHRha2VuIGFzIGFuIHVwcGVyIGxpbWl0LiAqLworCXN0cnVjdCBzM2NfZnJlcQltYXg7CS8qIGZyZXF1ZW5jeSBsaW1pdHMgKi8KK307CisKKy8qIFRoaW5ncyBkZXBlbmRpbmcgb24gZnJlcXVlbmN5IHNjYWxpbmcuICovCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQworI2RlZmluZSBfX2luaXRfb3JfY3B1ZnJlcQorI2Vsc2UKKyNkZWZpbmUgX19pbml0X29yX2NwdWZyZXEgX19pbml0CisjZW5kaWYKKworLyogQm9hcmQgZnVuY3Rpb25zICovCisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfUzNDCitleHRlcm4gaW50IHMzY19jcHVmcmVxX3NldGJvYXJkKHN0cnVjdCBzM2NfY3B1ZnJlcV9ib2FyZCAqYm9hcmQpOworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgczNjX2NwdWZyZXFfc2V0Ym9hcmQoc3RydWN0IHMzY19jcHVmcmVxX2JvYXJkICpib2FyZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAgLyogQ09ORklHX0NQVV9GUkVRX1MzQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jcHUuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jcHUuaApzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvY3B1LmgKaW5kZXggMjNlNDIwZS4uZTYyYWUwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jcHUuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvY3B1LmgKQEAgLTEsNCArMSw0IEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2NwdS5oCisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvY3B1LmgKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKICAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTUhaICgxMDAwKjEwMDApCiAjZW5kaWYKIAotI2RlZmluZSBwcmludF9taHoobSkgKChtKSAvIE1IWiksICgobSAvIDEwMDApICUgMTAwMCkKKyNkZWZpbmUgcHJpbnRfbWh6KG0pICgobSkgLyBNSFopLCAoKChtKSAvIDEwMDApICUgMTAwMCkKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXM7CkBAIC0yNiwxMSArMjYsMjggQEAKIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmc7CiBzdHJ1Y3QgbWFwX2Rlc2M7CiAKKy8qIHBlci1jcHUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gdGFibGUuICovCisKK3N0cnVjdCBjcHVfdGFibGUgeworCXVuc2lnbmVkIGxvbmcJaWRjb2RlOworCXVuc2lnbmVkIGxvbmcJaWRtYXNrOworCXZvaWQJCSgqbWFwX2lvKSh2b2lkKTsKKwl2b2lkCQkoKmluaXRfdWFydHMpKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKwl2b2lkCQkoKmluaXRfY2xvY2tzKShpbnQgeHRhbCk7CisJaW50CQkoKmluaXQpKHZvaWQpOworCWNvbnN0IGNoYXIJKm5hbWU7Cit9OworCitleHRlcm4gdm9pZCBzM2NfaW5pdF9jcHUodW5zaWduZWQgbG9uZyBpZGNvZGUsCisJCQkgc3RydWN0IGNwdV90YWJsZSAqY3B1cywgdW5zaWduZWQgaW50IGNwdXRhYl9zaXplKTsKKwogLyogY29yZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgKi8KIAogZXh0ZXJuIHZvaWQgczNjMjR4eF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0eHhfaW5pdF9pcnEodTMyIHZpYzAsIHUzMiB2aWMxKTsKIAogZXh0ZXJuIHZvaWQgczNjMjR4eF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2M2NHh4X2luaXRfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBzaXplKTsKIAogZXh0ZXJuIHZvaWQgczNjMjR4eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUwppbmRleCA0YWE3ZTJlLi4zNjM0ZDRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUwpAQCAtMjAsNyArMjAsNyBAQAogCS5lbmRtCiAKICNpZm5kZWYgZmlmb19sZXZlbAotI2RlZmluZSBmaWZvX2xldmVsIGZpZm9fbGV2ZWxfczNjMjQxMAorI2RlZmluZSBmaWZvX2xldmVsIGZpZm9fbGV2ZWxfczNjMjQ0MAogI2VuZGlmCiAKIAkubWFjcm8gIGZpZm9fZnVsbF9zM2MyNDQwIHJkLCByeApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9kZXZzLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGV2cy5oCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvZGV2cy5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGV2cy5oCmluZGV4IGJhZGFhYzkuLjZiMWI1MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvZGV2cy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9kZXZzLmgKQEAgLTE3LDIxICsxNywyNiBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBzM2MyNHh4X3VhcnRfcmVzb3VyY2VzIHMzYzI0MTBfdWFydF9yZXNvdXJjZXNbXTsKK2V4dGVybiBzdHJ1Y3QgczNjMjR4eF91YXJ0X3Jlc291cmNlcyBzM2M2NHh4X3VhcnRfcmVzb3VyY2VzW107CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3VhcnRfZGV2c1tdOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWFydF9zcmNbXTsKIAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90aW1lcltdOwogCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2ZiOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2I7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2xjZDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfd2R0OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2lpczsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcnRjOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGM7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NkaTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzI7CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9mYi5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0ZmY1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9mYi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9mYi5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MgLSBGQiBwbGF0Zm9ybSBkYXRhIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19QTEFUX1MzQ19GQl9ICisjZGVmaW5lIF9fUExBVF9TM0NfRkJfSCBfX0ZJTEVfXworCisvKioKKyAqIHN0cnVjdCBzM2NfZmJfcGRfd2luIC0gcGVyIHdpbmRvdyBzZXR1cCBkYXRhCisgKiBAd2luX21vZGU6IFRoZSBkaXNwbGF5IHBhcmFtZXRlcnMgdG8gaW5pdGlhbGlzZSAobm90IGZvciB3aW5kb3cgMCkKKyAqIEB2aXJ0dWFsX3g6IFRoZSB2aXJ0dWFsIFggc2l6ZS4KKyAqIEB2aXJ0dWFsX3k6IFRoZSB2aXJ0dWFsIFkgc2l6ZS4KKyAqLworc3RydWN0IHMzY19mYl9wZF93aW4geworCXN0cnVjdCBmYl92aWRlb21vZGUJd2luX21vZGU7CisKKwl1bnNpZ25lZCBzaG9ydAkJZGVmYXVsdF9icHA7CisJdW5zaWduZWQgc2hvcnQJCW1heF9icHA7CisJdW5zaWduZWQgc2hvcnQJCXZpcnR1YWxfeDsKKwl1bnNpZ25lZCBzaG9ydAkJdmlydHVhbF95OworfTsKKworLyoqCisgKiBzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIC0gIFMzQyBkcml2ZXIgcGxhdGZvcm0gc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqIEBzZXR1cF9ncGlvOiBTZXR1cCB0aGUgZXh0ZXJuYWwgR1BJTyBwaW5zIHRvIHRoZSByaWdodCBzdGF0ZSB0byB0cmFuc2ZlcgorICoJCXRoZSBkYXRhIGZyb20gdGhlIGRpc3BsYXkgc3lzdGVtIHRvIHRoZSBjb25uZWN0ZWQgZGlzcGxheQorICoJCWRldmljZS4KKyAqIEB2aWRjb24wOiBUaGUgYmFzZSB2aWRjb24wIHZhbHVlcyB0byBjb250cm9sIHRoZSBwYW5lbCBkYXRhIGZvcm1hdC4KKyAqIEB2aWRjb24xOiBUaGUgYmFzZSB2aWRjb24xIHZhbHVlcyB0byBjb250cm9sIHRoZSBwYW5lbCBkYXRhIG91dHB1dC4KKyAqIEB3aW46IFRoZSBzZXR1cCBkYXRhIGZvciBlYWNoIGhhcmR3YXJlIHdpbmRvdywgb3IgTlVMTCBmb3IgdW51c2VkLgorICogQGRpc3BsYXlfbW9kZTogVGhlIExDRCBvdXRwdXQgZGlzcGxheSBtb2RlLgorICoKKyAqIFRoZSBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVzIHRoZSB2aWRlbyBkcml2ZXIgd2l0aCBhbGwgdGhlIGluZm9ybWF0aW9uCisgKiBpdCByZXF1aXJlcyB0byB3b3JrIHdpdGggdGhlIGRpc3BsYXkocykgYXR0YWNoZWQgdG8gdGhlIG1hY2hpbmUuIEl0CisgKiBjb250cm9scyB0aGUgaW5pdGlhbCBtb2RlLCB0aGUgbnVtYmVyIG9mIGRpc3BsYXkgd2luZG93cyAoMCBpcyBhbHdheXMKKyAqIHRoZSBiYXNlIGZyYW1lYnVmZmVyKSB0aGF0IGFyZSBpbml0aWFsaXNlZCBldGMuCisgKgorICovCitzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhIHsKKwl2b2lkCSgqc2V0dXBfZ3Bpbykodm9pZCk7CisKKwlzdHJ1Y3QgczNjX2ZiX3BkX3dpbgkqd2luW1MzQ19GQl9NQVhfV0lOXTsKKworCXUzMgkJCSB2aWRjb24wOworCXUzMgkJCSB2aWRjb24xOworfTsKKworLyoqCisgKiBzM2NfZmJfc2V0X3BsYXRkYXRhKCkgLSBTZXR1cCB0aGUgRkIgZGV2aWNlIHdpdGggcGxhdGZvcm0gZGF0YS4KKyAqIEBwZDogVGhlIHBsYXRmb3JtIGRhdGEgdG8gc2V0LiBUaGUgZGF0YSBpcyBjb3BpZWQgZnJvbSB0aGUgcGFzc2VkIHN0cnVjdHVyZQorICogICAgICBzbyB0aGUgbWFjaGluZSBkYXRhIGNhbiBtYXJrIHRoZSBkYXRhIF9faW5pdGRhdGEgc28gdGhhdCBhbnkgdW51c2VkCisgKiAgICAgIG1hY2hpbmVzIHdpbGwgZW5kIHVwIGR1bXBpbmcgdGhlaXIgZGF0YSBhdCBydW50aW1lLgorICovCitleHRlcm4gdm9pZCBzM2NfZmJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgKnBkKTsKKworLyoqCisgKiBzM2M2NHh4X2ZiX2dwaW9fc2V0dXBfMjRicHAoKSAtIFMzQzY0WFggc2V0dXAgZnVuY3Rpb24gZm9yIDI0YnBwIExDRAorICoKKyAqIEluaXRpYWxpc2UgdGhlIEdQSU8gZm9yIGFuIDI0YnBwIExDRCBkaXNwbGF5IG9uIHRoZSBSR0IgaW50ZXJmYWNlLgorICovCitleHRlcm4gdm9pZCBzM2M2NHh4X2ZiX2dwaW9fc2V0dXBfMjRicHAodm9pZCk7CisKKyNlbmRpZiAvKiBfX1BMQVRfUzNDX0ZCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmctaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmUyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmctaGVscGVycy5oCkBAIC0wLDAgKzEsMTc2IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmctaGVscGVyLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQyBQbGF0Zm9ybSAtIEdQSU8gcGluIGNvbmZpZ3VyYXRpb24gaGVscGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIFRoaXMgaXMgbWVhbnQgZm9yIGNvcmUgY3B1IHN1cHBvcnQsIG1hY2hpbmUgb3Igb3RoZXIgZHJpdmVyIGZpbGVzCisgKiBzaG91bGQgbm90IGJlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9fUExBVF9HUElPX0NGR19IRUxQRVJTX0gKKyNkZWZpbmUgX19QTEFUX0dQSU9fQ0ZHX0hFTFBFUlNfSCBfX0ZJTEVfXworCisvKiBBcyBhIG5vdGUsIGFsbCBncGlvIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIGFyZSBlbnRlcmVkIGV4Y2x1c2l2ZWx5LCBlaXRoZXIKKyAqIHdpdGggdGhlIHJlbGV2YW50IGxvY2sgaGVsZCBvciB0aGUgc3lzdGVtIHByZXZlbnRlZCBmcm9tIGRvaW5nIGFueXRoaW5nIGVsc2UKKyAqIGJ5IGRpc2FibGluZyBpbnRlcnJ1cHRzLgorKi8KKworc3RhdGljIGlubGluZSBpbnQgczNjX2dwaW9fZG9fc2V0Y2ZnKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlyZXR1cm4gKGNoaXAtPmNvbmZpZy0+c2V0X2NvbmZpZykoY2hpcCwgb2ZmLCBjb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzM2NfZ3Bpb19kb19zZXRwdWxsKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQoreworCXJldHVybiAoY2hpcC0+Y29uZmlnLT5zZXRfcHVsbCkoY2hpcCwgb2ZmLCBwdWxsKTsKK30KKworLyoqCisgKiBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCAtIFMzQzI0WFggc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KKyAqCisgKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIGhhcyB0d28gYml0cyBvZiBjb25maWd1cmF0aW9uIHBlciBncGlvLCB3aGljaCBoYXZlIHRoZSBmb2xsb3dpbmcKKyAqIGZ1bmN0aW9uczoKKyAqCTAwID0gaW5wdXQKKyAqCTAxID0gb3V0cHV0CisgKgkxeCA9IHNwZWNpYWwgZnVuY3Rpb24KKyovCitleHRlcm4gaW50IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpOworCisvKioKKyAqIHMzY19ncGlvX3NldGNmZ19zM2MyNHh4X2EgLSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbiAoQmFuayBBKQorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KKyAqCisgKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIGhhcyBvbmUgYml0IG9mIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBncGlvLCB3aGVyZSBzZXR0aW5nIHRoZSBiaXQKKyAqIG1lYW5zIHRoZSBwaW4gaXMgaW4gc3BlY2lhbCBmdW5jdGlvbiBtb2RlIGFuZCB1bnNldCBtZWFucyBvdXRwdXQuCisqLworZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZyk7CisKKy8qKgorICogczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCAtIFMzQzY0WFggNGJpdCBzaW5nbGUgcmVnaXN0ZXIgR1BJTyBjb25maWcuCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICogQGNmZzogVGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gc2V0LgorICoKKyAqIFRoaXMgaGVscGVyIGRlYWwgd2l0aCB0aGUgR1BJTyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgNCBiaXRzCisgKiBvZiBjb250cm9sIHBlciBHUElPLCBnZW5lcmFsbHkgaW4gdGhlIGZvcm0gb2Y6CisgKgkwMDAwID0gSW5wdXQKKyAqCTAwMDEgPSBPdXRwdXQKKyAqCW90aGVycyA9IFNwZWNpYWwgZnVuY3Rpb25zIChkZXBlbmRhbnQgb24gYmFuaykKKyAqCisgKiBOb3RlLCBzaW5jZSB0aGUgY29kZSB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIHR3byBjb250cm9sCisgKiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbmUsIHdlIGRvIG5vdCBoYXZlIGEgc2VwZXJhdGUgc2V0IG9mIGZ1bmN0aW9ucyBmb3IKKyAqIGVhY2ggY2FzZS4KKyovCitleHRlcm4gaW50IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpOworCisKKy8qIFB1bGwte3VwLGRvd259IHJlc2lzdG9yIGNvbnRyb2xzLgorICoKKyAqIFMzQzI0MTAsUzNDMjQ0MCxTM0MyNEEwID0gUHVsbC1VUCwKKyAqIFMzQzI0MTIsUzNDMjQxMyA9IFB1bGwtRG93bgorICogUzNDNjQwMCxTM0M2NDEwID0gUHVsbC1Cb3RoIFtOb25lLERvd24sVXAsVW5kZWZdCisgKiBTM0MyNDQzID0gUHVsbC1Cb3RoIFtub3Qgc2FtZSBhcyBTM0M2NDAwXQorICovCisKKy8qKgorICogczNjX2dwaW9fc2V0cHVsbF8xdXAoKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwIG9yIG5vbmUuCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICogQHBhcmFtOiBwdWxsOiBUaGUgcHVsbCBtb2RlIGJlaW5nIHJlcXVlc3RlZC4KKyAqCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIEdQSU9zIHdpdGggb25lCisgKiBiaXQgY29uZmlndXJpbmcgdGhlIHByZXNlbmNlIG9mIGEgcHVsbC11cCByZXNpc3Rvci4KKyAqLworZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRwdWxsXzF1cChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CisKKy8qKgorICogczNjX2dwaW9fc2V0cHVsbF8xZG93bigpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgZG93biBvciBub25lCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQKKyAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQKKyAqIEBwYXJhbTogcHVsbDogVGhlIHB1bGwgbW9kZSBiZWluZyByZXF1ZXN0ZWQKKyAqCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIEdQSU9zIHdpdGggb25lCisgKiBiaXQgY29uZmlndXJpbmcgdGhlIHByZXNlbmNlIG9mIGEgcHVsbC1kb3duIHJlc2lzdG9yLgorICovCitleHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGxfMWRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CisKKy8qKgorICogczNjX2dwaW9fc2V0cHVsbF91cG93bigpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAsIGRvd24gb3Igbm9uZQorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqIEBwYXJhbTogcHVsbDogVGhlIHB1bGwgbW9kZSBiZWluZyByZXF1ZXN0ZWQuCisgKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBHUElPcyB3aXRoIHR3bworICogYml0cyBjb25maWd1cmluZyB0aGUgcHJlc2VuY2Ugb2YgYSBwdWxsIHJlc2lzdG9yLCBpbiB0aGUgZm9sbG93aW5nCisgKiBvcmRlcjoKKyAqCTAwID0gTm8gcHVsbCByZXNpc3RvciBjb25uZWN0ZWQKKyAqCTAxID0gUHVsbC11cCByZXNpc3RvciBjb25uZWN0ZWQKKyAqCTEwID0gUHVsbC1kb3duIHJlc2lzdG9yIGNvbm5lY3RlZAorICovCitleHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGxfdXBkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKKworCisvKioKKyAqIHMzY19ncGlvX2dldHB1bGxfdXBkb3duKCkgLSBHZXQgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwLCBkb3duIG9yIG5vbmUKKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgdGhlIEdQSU8gcGluIGJlbG9uZ3MgdG8KKyAqIEBvZmY6IFRoZSBvZmZzZXQgdG8gdGhlIHBpbiB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YuCisgKgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVhZHMgdGhlIHN0YXRlIG9mIHRoZSBwdWxsLXt1cCxkb3dufSByZXNpc3RvciBmb3IgdGhlCisgKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjX2dwaW9fc2V0cHVsbF91cG93bi4KKyovCitleHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfdXBkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZik7CisKKy8qKgorICogczNjX2dwaW9fc2V0cHVsbF9zM2MyNDQzKCkgLSBQdWxsIGNvbmZpZ3VyYXRpb24gZm9yIHMzYzI0NDMuCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICogQHBhcmFtOiBwdWxsOiBUaGUgcHVsbCBtb2RlIGJlaW5nIHJlcXVlc3RlZC4KKyAqCisgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIEdQSU9zIHdpdGggdHdvCisgKiBiaXRzIGNvbmZpZ3VyaW5nIHRoZSBwcmVzZW5jZSBvZiBhIHB1bGwgcmVzaXN0b3IsIGluIHRoZSBmb2xsb3dpbmcKKyAqIG9yZGVyOgorICoJMDAgPSBQdWxsLXVwIHJlc2lzdG9yIGNvbm5lY3RlZAorICoJMTAgPSBQdWxsLWRvd24gcmVzaXN0b3IgY29ubmVjdGVkCisgKgl4MSA9IE5vIHB1bGwgdXAgcmVzaXN0b3IKKyAqLworZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRwdWxsX3MzYzI0NDMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKKworLyoqCisgKiBzM2NfZ3Bpb19nZXRwdWxsX3MzYzI0NDMoKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBzM2MyNDQzIHB1bGwgcmVzaXN0b3JzCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IHRoZSBHUElPIHBpbiBiZWxvbmdzIHRvLgorICogQG9mZjogVGhlIG9mZnNldCB0byB0aGUgcGluIHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiBvZi4KKyAqCisgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWFkcyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwte3VwLGRvd259IHJlc2lzdG9yIGZvciB0aGUKKyAqIGdpdmVuIEdQSU8gaW4gdGhlIHNhbWUgY2FzZSBhcyBzM2NfZ3Bpb19zZXRwdWxsX3Vwb3duLgorKi8KK2V4dGVybiBzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF9zM2MyNHh4KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJdW5zaWduZWQgaW50IG9mZik7CisKKyNlbmRpZiAvKiBfX1BMQVRfR1BJT19DRkdfSEVMUEVSU19IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZDZhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmcuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDIFBsYXRmb3JtIC0gR1BJTyBwaW4gY29uZmlndXJhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBkZWZpbml0aW9ucyB0byBnZXQgdGhlIGJhc2ljIGdwaW8KKyAqIHBpbiBjb25maWd1cmF0aW9uIGRvbmUgc3VjaCBhcyBzZXR0aW5nIGEgcGluIHRvIGlucHV0IG9yIG91dHB1dCBvcgorICogY2hhbmdpbmcgdGhlIHB1bGwte3VwLGRvd259IGNvbmZpZ3VyYXRpb25zLgorICovCisKKy8qIE5vdGUsIHRoaXMgaW50ZXJmYWNlIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBzM2M2NHh4IGFyY2ggZmlyc3QgYW5kIHdpbGwKKyAqIGJlIGFkZGVkIHRvIHRoZSBzM2MyNHh4IHN5c3RlbXMgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX1BMQVRfR1BJT19DRkdfSAorI2RlZmluZSBfX1BMQVRfR1BJT19DRkdfSCBfX0ZJTEVfXworCit0eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2VfXyBzM2NfZ3Bpb19wdWxsX3Q7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gaWYgZ3Bpby1jb3JlLmggaGFzbid0IGJlZW4gaW5jbHVkZWQgKi8KK3N0cnVjdCBzM2NfZ3Bpb19jaGlwOworCisvKioKKyAqIHN0cnVjdCBzM2NfZ3Bpb19jZmcgR1BJTyBjb25maWd1cmF0aW9uCisgKiBAY2ZnX2VpbnQ6IENvbmZpZ3VyYXRpb24gc2V0dGluZyB3aGVuIHVzZWQgZm9yIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2UKKyAqIEBnZXRfcHVsbDogUmVhZCB0aGUgY3VycmVudCBwdWxsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHUElPCisgKiBAc2V0X3B1bGw6IFNldCB0aGUgY3VycmVudCBwdWxsIGNvbmZpZ3VyYWl0b24gZm9yIHRoZSBHUElPCisgKiBAc2V0X2NvbmZpZzogU2V0IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHUElPCisgKiBAZ2V0X2NvbmZpZzogUmVhZCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGZvciB0aGUgR1BJTworICoKKyAqIEVhY2ggY2hpcCBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHR5cGUgb2YgR1BJTyBiYW5rIGF2YWlsYWJsZSBhbmQgc29tZQorICogaGF2ZSBkaWZmZXJlbnQgY2FwYWJpbGl0ZXMgZXZlbiB3aGVuIHRoZXkgaGF2ZSB0aGUgc2FtZSBjb250cm9sIHJlZ2lzdGVyCisgKiBsYXlvdXRzLiBQcm92aWRlIGFuIHBvaW50IHRvIHZlY3RvciBjb250cm9sIHJvdXRpbmUgYW5kIHByb3ZpZGUgYW55CisgKiBwZXItYmFuayBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgb3RoZXIgc3lzdGVtcyBzdWNoIGFzIHRoZQorICogZXh0ZXJuYWwgaW50ZXJydXB0IGNvZGUgd2lsbCBuZWVkLgorICovCitzdHJ1Y3QgczNjX2dwaW9fY2ZnIHsKKwl1bnNpZ25lZCBpbnQJY2ZnX2VpbnQ7CisKKwlzM2NfZ3Bpb19wdWxsX3QJKCpnZXRfcHVsbCkoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnMpOworCWludAkJKCpzZXRfcHVsbCkoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnMsCisJCQkJICAgIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKKworCXVuc2lnbmVkICgqZ2V0X2NvbmZpZykoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnMpOworCWludAkgKCpzZXRfY29uZmlnKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmcywKKwkJCSAgICAgICB1bnNpZ25lZCBjb25maWcpOworfTsKKworI2RlZmluZSBTM0NfR1BJT19TUEVDSUFMX01BUksJKDB4ZmZmZmZmZjApCisjZGVmaW5lIFMzQ19HUElPX1NQRUNJQUwoeCkJKFMzQ19HUElPX1NQRUNJQUxfTUFSSyB8ICh4KSkKKworLyogRGVmaW5lcyBmb3IgZ2VuZXJpYyBwaW4gY29uZmlndXJhdGlvbnMgKi8KKyNkZWZpbmUgUzNDX0dQSU9fSU5QVVQJKFMzQ19HUElPX1NQRUNJQUwoMCkpCisjZGVmaW5lIFMzQ19HUElPX09VVFBVVAkoUzNDX0dQSU9fU1BFQ0lBTCgxKSkKKyNkZWZpbmUgUzNDX0dQSU9fU0ZOKHgpCShTM0NfR1BJT19TUEVDSUFMKHgpKQorCisjZGVmaW5lIHMzY19ncGlvX2lzX2NmZ19zcGVjaWFsKF9jZmcpIFwKKwkoKChfY2ZnKSAmIFMzQ19HUElPX1NQRUNJQUxfTUFSSykgPT0gUzNDX0dQSU9fU1BFQ0lBTF9NQVJLKQorCisvKioKKyAqIHMzY19ncGlvX2NmZ3BpbigpIC0gQ2hhbmdlIHRoZSBHUElPIGZ1bmN0aW9uIG9mIGEgcGluLgorICogQHBpbiBwaW4gVGhlIHBpbiBudW1iZXIgdG8gY29uZmlndXJlLgorICogQHBpbiB0byBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHBpbidzIGZ1bmN0aW9uLgorICoKKyAqIENvbmZpZ3VyZSB3aGljaCBmdW5jdGlvbiBpcyBhY3R1YWxseSBjb25uZWN0ZWQgdG8gdGhlIGV4dGVybmFsCisgKiBwaW4sIHN1Y2ggYXMgYW4gZ3BpbyBpbnB1dCwgb3V0cHV0IG9yIHNvbWUgZm9ybSBvZiBzcGVjaWFsIGZ1bmN0aW9uCisgKiBjb25uZWN0ZWQgdG8gYW4gaW50ZXJuYWwgcGVyaXBoZXJhbCBibG9jay4KKyAqLworZXh0ZXJuIGludCBzM2NfZ3Bpb19jZmdwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKTsKKworLyogRGVmaW5lIHZhbHVlcyBmb3IgdGhlIHB1bGwte3VwLGRvd259IGF2YWlsYWJsZSBmb3IgZWFjaCBncGlvIHBpbi4KKyAqCisgKiBUaGVzZSB2YWx1ZXMgY29udHJvbCB0aGUgc3RhdGUgb2YgdGhlIHdlYWsgcHVsbC17dXAsZG93bn0gcmVzaXN0b3JzCisgKiBhdmFpbGFibGUgb24gbW9zdCBwaW5zIG9uIHRoZSBTM0Mgc2VyaWVzLiBOb3QgYWxsIGNoaXBzIHN1cHBvcnQgYm90aAorICogdXAgb3IgZG93biBzZXR0aW5ncywgYW5kIGl0IG1heSBiZSBkZXBlbmRhbnQgb24gdGhlIGNoaXAgdGhhdCBpcyBiZWluZworICogdXNlZCB0byB3aGV0aGVyIHRoZSBwYXJ0aWN1bGFyIG1vZGUgaXMgYXZhaWxhYmxlLgorICovCisjZGVmaW5lIFMzQ19HUElPX1BVTExfTk9ORQkoKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KTB4MDApCisjZGVmaW5lIFMzQ19HUElPX1BVTExfRE9XTgkoKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KTB4MDEpCisjZGVmaW5lIFMzQ19HUElPX1BVTExfVVAJKChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdCkweDAyKQorCisvKioKKyAqIHMzY19ncGlvX3NldHB1bGwoKSAtIHNldCB0aGUgc3RhdGUgb2YgYSBncGlvIHBpbiBwdWxsIHJlc2lzdG9yCisgKiBAcGluOiBUaGUgcGluIG51bWJlciB0byBjb25maWd1cmUgdGhlIHB1bGwgcmVzaXN0b3IuCisgKiBAcHVsbDogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwdWxsIHJlc2lzdG9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwte3VwLGRvd259IHJlc2lzdG9yIGZvciB0aGUKKyAqIHNwZWNpZmllZCBwaW4uIEl0IHdpbGwgcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bGwsIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgaWYgdGhlIHBpbiBjYW5ub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHB1bGwgc2V0dGluZy4KKyovCitleHRlcm4gaW50IHMzY19ncGlvX3NldHB1bGwodW5zaWduZWQgaW50IHBpbiwgczNjX2dwaW9fcHVsbF90IHB1bGwpOworCisvKioKKyAqIHMzY19ncGlvX2dldHB1bGwoKSAtIGdldCB0aGUgcHVsbCByZXNpc3RvciBzdGF0ZSBvZiBhIGdwaW8gcGluCisgKiBAcGluOiBUaGUgcGluIG51bWJlciB0byBnZXQgdGhlIHNldHRpbmdzIGZvcgorICoKKyAqIFJlYWQgdGhlIHB1bGwgcmVzaXN0b3IgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcGluLgorKi8KK2V4dGVybiBzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluKTsKKworI2VuZGlmIC8qIF9fUExBVF9HUElPX0NGR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jb3JlLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNjBhNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9ncGlvLWNvcmUuaApAQCAtMCwwICsxLDc3IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZ3Bpby1jb3JlLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDIFBsYXRmb3JtIC0gR1BJTyBjb3JlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIERlZmluZSB0aGUgY29yZSBncGlvbGliIHN1cHBvcnQgZnVuY3Rpb25zIHRoYXQgdGhlIHMzYyBwbGF0Zm9ybXMgbWF5CisgKiBuZWVkIHRvIGV4dGVuZCBvciBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSBhbmQgdGhlIHMzYyBjaGlwCisgKiBzZWxlY3RlZCBhdCBidWlsZCBvciBmb3VuZCBhdCBydW4gdGltZS4KKyAqCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgbm90IGludGVuZGVkIGZvciBkcml2ZXIgaW5jbHVzaW9uLCB0aGVyZSBpcworICogbm90aGluZyBoZXJlIHRoYXQgc2hvdWxkIG5vdCBsaXZlIG91dHNpZGUgdGhlIHBsYXRmb3JtIGFuZCBjb3JlCisgKiBzcGVjaWZpYyBjb2RlLgorKi8KKworc3RydWN0IHMzY19ncGlvX2NmZzsKKworLyoqCisgKiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAtIHdyYXBwZXIgZm9yIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGdwaW8KKyAqIEBjaGlwOiBUaGUgY2hpcCBzdHJ1Y3R1cmUgdG8gYmUgZXhwb3J0ZWQgdmlhIGdwaW9saWIuCisgKiBAYmFzZTogVGhlIGJhc2UgcG9pbnRlciB0byB0aGUgZ3BpbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqIEBjb25maWc6IHNwZWNpYWwgZnVuY3Rpb24gYW5kIHB1bGwtcmVzaXN0b3IgY29udHJvbCBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIHdyYXBwZXIgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIFNhbXN1bmcKKyAqIHNwZWNpZmljIGdwaW9zIGJlaW5nIHJlZ2lzdGVyZWQgd2l0aCBncGlvbGliLgorICovCitzdHJ1Y3QgczNjX2dwaW9fY2hpcCB7CisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCXN0cnVjdCBzM2NfZ3Bpb19jZmcJKmNvbmZpZzsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqdG9fczNjX2dwaW8oc3RydWN0IGdwaW9fY2hpcCAqZ3BjKQoreworCXJldHVybiBjb250YWluZXJfb2YoZ3BjLCBzdHJ1Y3QgczNjX2dwaW9fY2hpcCwgY2hpcCk7Cit9CisKKy8qKiBzM2NfZ3Bpb2xpYl9hZGQoKSAtIGFkZCB0aGUgczNjIHNwZWNpZmljIHZlcnNpb24gb2YgYSBncGlvX2NoaXAuCisgKiBAY2hpcDogVGhlIGNoaXAgdG8gcmVnaXN0ZXIKKyAqCisgKiBUaGlzIGlzIGEgd3JhcHBlciB0byBncGlvY2hpcF9hZGQoKSB0aGF0IHRha2VzIG91ciBzcGVjaWZpYyBncGlvIGNoaXAKKyAqIGluZm9ybWF0aW9uIGFuZCBtYWtlcyB0aGUgbmVjZXNzYXJ5IGFsdGVyYXRpb25zIGZvciB0aGUgcGxhdGZvcm0gYW5kCisgKiBub3RlcyB0aGUgaW5mb3JtYXRpb24gZm9yIHVzZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbXMgYW5kIGFueQorICogb3RoZXIgcGFydHMgb2YgdGhlIHN5c3RlbS4KKyAqLworZXh0ZXJuIHZvaWQgczNjX2dwaW9saWJfYWRkKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKTsKKworLyogQ09ORklHX1MzQ19HUElPX1RSQUNLIGVuYWJsZXMgdGhlIHRyYWNraW5nIG9mIHRoZSBzM2Mgc3BlY2lmaWMgZ3Bpb3MKKyAqIGZvciB1c2Ugd2l0aCB0aGUgY29uZmlndXJhdGlvbiBjYWxscywgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBzM2MgZ3Bpb2xpYgorICogc3VwcG9ydCBjb2RlLgorICoKKyAqIE5vdCBhbGwgczNjIHN1cHBvcnQgY29kZSB3aWxsIG5lZWQgdGhpcywgYXMgc29tZSBjb25maWd1cmF0aW9ucyBvZiBjcHUKKyAqIG1heSBvbmx5IHN1cHBvcnQgb25lIG9yIHR3byBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBoYXZlIGFuCisgKiBlYXN5IGdwaW8gdG8gczNjX2dwaW9fY2hpcCBtYXBwaW5nIGZ1bmN0aW9uLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuCisgKiB0aGUgbWFjaGluZSBzdXBwb3J0IGZpbGUgc2hvdWxkIHByb3ZpZGUgaXRzIG93biBzM2NfZ3Bpb2xpYl9nZXRjaGlwKCkKKyAqIGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19HUElPX1RSQUNLCitleHRlcm4gc3RydWN0IHMzY19ncGlvX2NoaXAgKnMzY19ncGlvc1tTM0NfR1BJT19FTkRdOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpzM2NfZ3Bpb2xpYl9nZXRjaGlwKHVuc2lnbmVkIGludCBjaGlwKQoreworCXJldHVybiAoY2hpcCA8IFMzQ19HUElPX0VORCkgPyBzM2NfZ3Bpb3NbY2hpcF0gOiBOVUxMOworfQorI2Vsc2UKKy8qIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBzaG91bGQgcHJvdmlkZSBzM2NfZ3Bpb2xpYl9nZXRjaGlwICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfZ3Bpb2xpYl90cmFjayhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkgeyB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9paWMtY29yZS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2lpYy1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzOTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9paWMtY29yZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaWljLWNvcmUuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MgLSBJMkMgQ29udHJvbGxlciBjb3JlIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSUlDX0NPUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0lJQ19DT1JFX0ggX19GSUxFX18KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGZvciB1c2Ugd2l0aCB0aGUgY29yZSBzdXBwb3J0IGNvZGUsIHN1Y2ggYXMKKyAqIHRoZSBjcHUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gY29kZQorICovCisKKy8qIHJlLWRlZmluZSBkZXZpY2UgbmFtZSBkZXBlbmRpbmcgb24gc3VwcG9ydC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaTJjMF9zZXRuYW1lKGNoYXIgKm5hbWUpCit7CisJLyogY3VycmVudGx5IHRoaXMgZGV2aWNlIGlzIGFsd2F5cyBjb21waWxlZCBpbiAqLworCXMzY19kZXZpY2VfaTJjMC5uYW1lID0gbmFtZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19pMmMxX3NldG5hbWUoY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkMxCisJczNjX2RldmljZV9pMmMxLm5hbWUgPSBuYW1lOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lJQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvaWljLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvaWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxZGZjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9paWMuaApAQCAtMCwwICsxLDU3IEBACisvKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lpYy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0MTAgLSBJMkMgQ29udHJvbGxlciBwbGF0ZnJvbV9kZXZpY2UgaW5mbworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSUlDX0gKKyNkZWZpbmUgX19BU01fQVJDSF9JSUNfSCBfX0ZJTEVfXworCisjZGVmaW5lIFMzQ19JSUNGTEdfRklMVEVSCSgxPDwwKQkvKiBlbmFibGUgczNjMjQ0MCBmaWx0ZXIgKi8KKworLyogTm90ZXM6CisgKgkxKSBBbGwgZnJlcXVlbmNpZXMgYXJlIGV4cHJlc3NlZCBpbiBIegorICoJMikgQSB2YWx1ZSBvZiB6ZXJvIGlzIGBkbyBub3QgY2FyZWAKKyovCisKK3N0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyB7CisJaW50CQlidXNfbnVtOwkvKiBidXMgbnVtYmVyIHRvIHVzZSAqLworCXVuc2lnbmVkIGludAlmbGFnczsKKwl1bnNpZ25lZCBpbnQJc2xhdmVfYWRkcjsJLyogc2xhdmUgYWRkcmVzcyBmb3IgY29udHJvbGxlciAqLworCXVuc2lnbmVkIGxvbmcJYnVzX2ZyZXE7CS8qIHN0YW5kYXJkIGJ1cyBmcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBsb25nCW1heF9mcmVxOwkvKiBtYXggZnJlcXVlbmN5IGZvciB0aGUgYnVzICovCisJdW5zaWduZWQgbG9uZwltaW5fZnJlcTsJLyogbWluIGZyZXF1ZW5jeSBmb3IgdGhlIGJ1cyAqLworCXVuc2lnbmVkIGludAlzZGFfZGVsYXk7CS8qIHBjbGtzIChzM2MyNDQwIG9ubHkpICovCisKKwl2b2lkCSgqY2ZnX2dwaW8pKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7Cit9OworCisvKioKKyAqIHMzY19pMmMwX3NldF9wbGF0ZGF0YSAtIHNldCBwbGF0Zm9ybSBkYXRhIGZvciBpMmMwIGRldmljZQorICogQGkyYzogVGhlIHBsYXRmb3JtIGRhdGEgdG8gc2V0LCBvciBOVUxMIGZvciBkZWZhdWx0IGRhdGEuCisgKgorICogUmVnaXN0ZXIgdGhlIGdpdmVuIHBsYXRmb3JtIGRhdGEgZm9yIHVzZSB3aXRoIHRoZSBpMmMwIGRldmljZS4gVGhpcworICogY2FsbCBjb3BpZXMgdGhlIHBsYXRmb3JtIGRhdGEsIHNvIHRoZSBjYWxsZXIgY2FuIHVzZSBfX2luaXRkYXRhIGZvcgorICogdGhlaXIgY29weS4KKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBzZXQgY2ZnX2dwaW8gaWYgaXMgbnVsbCB0byB0aGUgZGVmYXVsdCBwbGF0Zm9ybQorICogaW1wbGVtZW50YXRpb24uCisgKgorICogQW55IHVzZXIgb2YgczNjX2RldmljZV9pMmMwIHNob3VsZCBjYWxsIHRoaXMsIGV2ZW4gaWYgaXQgaXMgd2l0aAorICogTlVMTCB0byBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIGdpdmVuIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGRhdGEKKyAqIGFzIHRoZSBkcml2ZXIgd2lsbCBubyBsb25nZXIgY2FycnkgZGVmYXVsdHMuCisgKi8KK2V4dGVybiB2b2lkIHMzY19pMmMwX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKmkyYyk7CitleHRlcm4gdm9pZCBzM2NfaTJjMV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICppMmMpOworCisvKiBkZWZpbmVkIGJ5IGFyY2hpdGVjdHVyZSB0byBjb25maWd1cmUgZ3BpbyAqLworZXh0ZXJuIHZvaWQgczNjX2kyYzBfY2ZnX2dwaW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHMzY19pMmMxX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lJQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvbWFwLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvbWFwLWJhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L21hcC5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvbWFwLWJhc2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL25hbmQuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9uYW5kLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9uYW5kLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9uYW5kLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9yZWdzLWFjOTcuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWFjOTcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL3JlZ3MtYWM5Ny5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1hYzk3LmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWZiLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZWU1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1mYi5oCkBAIC0wLDAgKzEsMzY2IEBACisvKiBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1mYi5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDIFBsYXRmb3JtIC0gbmV3LXN0eWxlIGZyYW1lYnVmZmVyIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgbmV3IHN0eWxlIGZyYW1lYnVmZmVyIGludGVyZmFjZQorICogZm91bmQgZnJvbSB0aGUgUzNDMjQ0MyBvbndhcmRzIGludG8gdGhlIFMzQzI0MTYsIFMzQzI0NTAgYW5kIHRoZQorICogUzNDNjRYWCBzZXJpZXMgc3VjaCBhcyB0aGUgUzNDNjQwMCBhbmQgUzNDNjQxMC4KKyAqCisgKiBUaGUgZmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSBjcHUgc3BlY2lmaWMgaXRlbXMgd2hpY2ggYXJlIGJhc2VkIG9uCisgKiB3aGljaGV2ZXIgYXJjaGl0ZWN0dXJlIGlzIHNlbGVjdGVkLCBpdCBvbmx5IGNvbnRhaW5zIHRoZSBjb3JlIG9mIHRoZQorICogcmVnaXN0ZXIgc2V0LiBTZWUgPG1hY2gvcmVncy1mYi5oPiB0byBnZXQgdGhlIHNwZWNpZmljcy4KKyAqCisgKiBOb3RlLCB3ZSBjaGFuZ2VkIHRvIHVzaW5nIHJlZ3MtZmIuaCBhcyBpdCBhdm9pZHMgYW55IGNsYXNoZXMgd2l0aAorICogdGhlIG9yaWdpbmFsIHJlZ3MtbGNkLmggc28gb3V0IG9mIHRoZSB3YXkgb2YgcmVncy1sY2QuaCBhcyB3ZWxsIGFzCisgKiBpbmRpY2F0aW5nIHRoZSBuZXdlciBibG9jayBpcyBtdWNoIG1vcmUgdGhhbiBqdXN0IGFuIExDRCBpbnRlcmZhY2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIFBsZWFzZSBkbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIHVzZSA8bWFjaC9yZWdzLWZiLmg+IHRvCisgKiBlbnN1cmUgYWxsIHRoZSBsb2NhbGlzZWQgU29DIHN1cHBvcnQgaXMgaW5jbHVkZWQgYXMgbmVjZXNzYXJ5LgorKi8KKworLyogVklEQ09OMCAqLworCisjZGVmaW5lIFZJRENPTjAJCQkJCSgweDAwKQorI2RlZmluZSBWSURDT04wX0lOVEVSTEFDRQkJCSgxIDw8IDI5KQorI2RlZmluZSBWSURDT04wX1ZJRE9VVF9NQVNLCQkJKDB4MyA8PCAyNikKKyNkZWZpbmUgVklEQ09OMF9WSURPVVRfU0hJRlQJCQkoMjYpCisjZGVmaW5lIFZJRENPTjBfVklET1VUX1JHQgkJCSgweDAgPDwgMjYpCisjZGVmaW5lIFZJRENPTjBfVklET1VUX1RWCQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgVklEQ09OMF9WSURPVVRfSTgwX0xESTAJCQkoMHgyIDw8IDI2KQorI2RlZmluZSBWSURDT04wX1ZJRE9VVF9JODBfTERJMQkJCSgweDMgPDwgMjYpCisKKyNkZWZpbmUgVklEQ09OMF9MMV9EQVRBX01BU0sJCQkoMHg3IDw8IDIzKQorI2RlZmluZSBWSURDT04wX0wxX0RBVEFfU0hJRlQJCQkoMjMpCisjZGVmaW5lIFZJRENPTjBfTDFfREFUQV8xNkJQUAkJCSgweDAgPDwgMjMpCisjZGVmaW5lIFZJRENPTjBfTDFfREFUQV8xOEJQUDE2CQkJKDB4MSA8PCAyMykKKyNkZWZpbmUgVklEQ09OMF9MMV9EQVRBXzE4QlBQOQkJCSgweDIgPDwgMjMpCisjZGVmaW5lIFZJRENPTjBfTDFfREFUQV8yNEJQUAkJCSgweDMgPDwgMjMpCisjZGVmaW5lIFZJRENPTjBfTDFfREFUQV8xOEJQUAkJCSgweDQgPDwgMjMpCisjZGVmaW5lIFZJRENPTjBfTDFfREFUQV8xNkJQUDgJCQkoMHg1IDw8IDIzKQorCisjZGVmaW5lIFZJRENPTjBfTDBfREFUQV9NQVNLCQkJKDB4NyA8PCAyMCkKKyNkZWZpbmUgVklEQ09OMF9MMF9EQVRBX1NISUZUCQkJKDIwKQorI2RlZmluZSBWSURDT04wX0wwX0RBVEFfMTZCUFAJCQkoMHgwIDw8IDIwKQorI2RlZmluZSBWSURDT04wX0wwX0RBVEFfMThCUFAxNgkJCSgweDEgPDwgMjApCisjZGVmaW5lIFZJRENPTjBfTDBfREFUQV8xOEJQUDkJCQkoMHgyIDw8IDIwKQorI2RlZmluZSBWSURDT04wX0wwX0RBVEFfMjRCUFAJCQkoMHgzIDw8IDIwKQorI2RlZmluZSBWSURDT04wX0wwX0RBVEFfMThCUFAJCQkoMHg0IDw8IDIwKQorI2RlZmluZSBWSURDT04wX0wwX0RBVEFfMTZCUFA4CQkJKDB4NSA8PCAyMCkKKworI2RlZmluZSBWSURDT04wX1BOUk1PREVfTUFTSwkJCSgweDMgPDwgMTcpCisjZGVmaW5lIFZJRENPTjBfUE5STU9ERV9TSElGVAkJCSgxNykKKyNkZWZpbmUgVklEQ09OMF9QTlJNT0RFX1JHQgkJCSgweDAgPDwgMTcpCisjZGVmaW5lIFZJRENPTjBfUE5STU9ERV9CR1IJCQkoMHgxIDw8IDE3KQorI2RlZmluZSBWSURDT04wX1BOUk1PREVfU0VSSUFMX1JHQgkJKDB4MiA8PCAxNykKKyNkZWZpbmUgVklEQ09OMF9QTlJNT0RFX1NFUklBTF9CR1IJCSgweDMgPDwgMTcpCisKKyNkZWZpbmUgVklEQ09OMF9DTEtWQUxVUAkJCSgxIDw8IDE2KQorI2RlZmluZSBWSURDT04wX0NMS1ZBTF9GX01BU0sJCQkoMHhmZiA8PCA2KQorI2RlZmluZSBWSURDT04wX0NMS1ZBTF9GX1NISUZUCQkJKDYpCisjZGVmaW5lIFZJRENPTjBfQ0xLVkFMX0ZfTElNSVQJCQkoMHhmZikKKyNkZWZpbmUgVklEQ09OMF9DTEtWQUxfRihfeCkJCQkoKF94KSA8PCA2KQorI2RlZmluZSBWSURDT04wX1ZMQ0tGUkVFCQkJKDEgPDwgNSkKKyNkZWZpbmUgVklEQ09OMF9DTEtESVIJCQkJKDEgPDwgNCkKKworI2RlZmluZSBWSURDT04wX0NMS1NFTF9NQVNLCQkJKDB4MyA8PCAyKQorI2RlZmluZSBWSURDT04wX0NMS1NFTF9TSElGVAkJCSgyKQorI2RlZmluZSBWSURDT04wX0NMS1NFTF9IQ0xLCQkJKDB4MCA8PCAyKQorI2RlZmluZSBWSURDT04wX0NMS1NFTF9MQ0QJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFZJRENPTjBfQ0xLU0VMXzI3TQkJCSgweDMgPDwgMikKKworI2RlZmluZSBWSURDT04wX0VOVklECQkJCSgxIDw8IDEpCisjZGVmaW5lIFZJRENPTjBfRU5WSURfRgkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZJRENPTjEJCQkJCSgweDA0KQorI2RlZmluZSBWSURDT04xX0xJTkVDTlRfTUFTSwkJCSgweDdmZiA8PCAxNikKKyNkZWZpbmUgVklEQ09OMV9MSU5FQ05UX1NISUZUCQkJKDE2KQorI2RlZmluZSBWSURDT04xX0xJTkVDTlRfR0VUKF92KQkJCSgoKF92KSA+PiAxNikgJiAweDdmZikKKyNkZWZpbmUgVklEQ09OMV9WU1RBVFVTX01BU0sJCQkoMHgzIDw8IDEzKQorI2RlZmluZSBWSURDT04xX1ZTVEFUVVNfU0hJRlQJCQkoMTMpCisjZGVmaW5lIFZJRENPTjFfVlNUQVRVU19WU1lOQwkJCSgweDAgPDwgMTMpCisjZGVmaW5lIFZJRENPTjFfVlNUQVRVU19CQUNLUE9SQ0gJCSgweDEgPDwgMTMpCisjZGVmaW5lIFZJRENPTjFfVlNUQVRVU19BQ1RJVkUJCQkoMHgyIDw8IDEzKQorI2RlZmluZSBWSURDT04xX1ZTVEFUVVNfRlJPTlRQT1JDSAkJKDB4MCA8PCAxMykKKworI2RlZmluZSBWSURDT04xX0lOVl9WQ0xLCQkJKDEgPDwgNykKKyNkZWZpbmUgVklEQ09OMV9JTlZfSFNZTkMJCQkoMSA8PCA2KQorI2RlZmluZSBWSURDT04xX0lOVl9WU1lOQwkJCSgxIDw8IDUpCisjZGVmaW5lIFZJRENPTjFfSU5WX1ZERU4JCQkoMSA8PCA0KQorCisvKiBWSURDT04yICovCisKKyNkZWZpbmUgVklEQ09OMgkJCQkJKDB4MDgpCisjZGVmaW5lIFZJRENPTjJfRU42MDEJCQkJKDEgPDwgMjMpCisjZGVmaW5lIFZJRENPTjJfVFZGTVRTRUxfU1cJCQkoMSA8PCAxNCkKKworI2RlZmluZSBWSURDT04yX1RWRk1UU0VMMV9NQVNLCQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgVklEQ09OMl9UVkZNVFNFTDFfU0hJRlQJCQkoMTIpCisjZGVmaW5lIFZJRENPTjJfVFZGTVRTRUwxX1JHQgkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFZJRENPTjJfVFZGTVRTRUwxX1lVVjQyMgkJKDB4MSA8PCAxMikKKyNkZWZpbmUgVklEQ09OMl9UVkZNVFNFTDFfWVVWNDQ0CQkoMHgyIDw8IDEyKQorCisjZGVmaW5lIFZJRENPTjJfT1JHWUNiQ3IJCQkoMSA8PCA4KQorI2RlZmluZSBWSURDT04yX1lVVk9SRENyQ2IJCQkoMSA8PCA3KQorCisvKiBWSURUQ09OMCAqLworCisjZGVmaW5lIFZJRFRDT04wX1ZCUERFX01BU0sJCQkoMHhmZiA8PCAyNCkKKyNkZWZpbmUgVklEVENPTjBfVkJQREVfU0hJRlQJCQkoMjQpCisjZGVmaW5lIFZJRFRDT04wX1ZCUERFX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04wX1ZCUERFKF94KQkJCSgoX3gpIDw8IDI0KQorCisjZGVmaW5lIFZJRFRDT04wX1ZCUERfTUFTSwkJCSgweGZmIDw8IDE2KQorI2RlZmluZSBWSURUQ09OMF9WQlBEX1NISUZUCQkJKDE2KQorI2RlZmluZSBWSURUQ09OMF9WQlBEX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04wX1ZCUEQoX3gpCQkJKChfeCkgPDwgMTYpCisKKyNkZWZpbmUgVklEVENPTjBfVkZQRF9NQVNLCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgVklEVENPTjBfVkZQRF9TSElGVAkJCSg4KQorI2RlZmluZSBWSURUQ09OMF9WRlBEX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04wX1ZGUEQoX3gpCQkJKChfeCkgPDwgOCkKKworI2RlZmluZSBWSURUQ09OMF9WU1BXX01BU0sJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBWSURUQ09OMF9WU1BXX1NISUZUCQkJKDApCisjZGVmaW5lIFZJRFRDT04wX1ZTUFdfTElNSVQJCQkoMHhmZikKKyNkZWZpbmUgVklEVENPTjBfVlNQVyhfeCkJCQkoKF94KSA8PCAwKQorCisvKiBWSURUQ09OMSAqLworCisjZGVmaW5lIFZJRFRDT04xX1ZGUERFX01BU0sJCQkoMHhmZiA8PCAyNCkKKyNkZWZpbmUgVklEVENPTjFfVkZQREVfU0hJRlQJCQkoMjQpCisjZGVmaW5lIFZJRFRDT04xX1ZGUERFX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04xX1ZGUERFKF94KQkJCSgoX3gpIDw8IDI0KQorCisjZGVmaW5lIFZJRFRDT04xX0hCUERfTUFTSwkJCSgweGZmIDw8IDE2KQorI2RlZmluZSBWSURUQ09OMV9IQlBEX1NISUZUCQkJKDE2KQorI2RlZmluZSBWSURUQ09OMV9IQlBEX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04xX0hCUEQoX3gpCQkJKChfeCkgPDwgMTYpCisKKyNkZWZpbmUgVklEVENPTjFfSEZQRF9NQVNLCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgVklEVENPTjFfSEZQRF9TSElGVAkJCSg4KQorI2RlZmluZSBWSURUQ09OMV9IRlBEX0xJTUlUCQkJKDB4ZmYpCisjZGVmaW5lIFZJRFRDT04xX0hGUEQoX3gpCQkJKChfeCkgPDwgOCkKKworI2RlZmluZSBWSURUQ09OMV9IU1BXX01BU0sJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBWSURUQ09OMV9IU1BXX1NISUZUCQkJKDApCisjZGVmaW5lIFZJRFRDT04xX0hTUFdfTElNSVQJCQkoMHhmZikKKyNkZWZpbmUgVklEVENPTjFfSFNQVyhfeCkJCQkoKF94KSA8PCAwKQorCisjZGVmaW5lIFZJRFRDT04yCQkJCSgweDE4KQorI2RlZmluZSBWSURUQ09OMl9MSU5FVkFMX01BU0sJCQkoMHg3ZmYgPDwgMTEpCisjZGVmaW5lIFZJRFRDT04yX0xJTkVWQUxfU0hJRlQJCQkoMTEpCisjZGVmaW5lIFZJRFRDT04yX0xJTkVWQUxfTElNSVQJCQkoMHg3ZmYpCisjZGVmaW5lIFZJRFRDT04yX0xJTkVWQUwoX3gpCQkJKChfeCkgPDwgMTEpCisKKyNkZWZpbmUgVklEVENPTjJfSE9aVkFMX01BU0sJCQkoMHg3ZmYgPDwgMCkKKyNkZWZpbmUgVklEVENPTjJfSE9aVkFMX1NISUZUCQkJKDApCisjZGVmaW5lIFZJRFRDT04yX0hPWlZBTF9MSU1JVAkJCSgweDdmZikKKyNkZWZpbmUgVklEVENPTjJfSE9aVkFMKF94KQkJCSgoX3gpIDw8IDApCisKKy8qIFdJTkNPTnggKi8KKworCisjZGVmaW5lIFdJTkNPTnhfQklUU1dQCQkJCSgxIDw8IDE4KQorI2RlZmluZSBXSU5DT054X0JZVFNXUAkJCQkoMSA8PCAxNykKKyNkZWZpbmUgV0lOQ09OeF9IQVdTV1AJCQkJKDEgPDwgMTYpCisjZGVmaW5lIFdJTkNPTnhfQlVSU1RMRU5fTUFTSwkJCSgweDMgPDwgOSkKKyNkZWZpbmUgV0lOQ09OeF9CVVJTVExFTl9TSElGVAkJCSg5KQorI2RlZmluZSBXSU5DT054X0JVUlNUTEVOXzE2V09SRAkJCSgweDAgPDwgOSkKKyNkZWZpbmUgV0lOQ09OeF9CVVJTVExFTl84V09SRAkJCSgweDEgPDwgOSkKKyNkZWZpbmUgV0lOQ09OeF9CVVJTVExFTl80V09SRAkJCSgweDIgPDwgOSkKKworI2RlZmluZSBXSU5DT054X0VOV0lOCQkJCSgxIDw8IDApCisjZGVmaW5lIFdJTkNPTjBfQlBQTU9ERV9NQVNLCQkJKDB4ZiA8PCAyKQorI2RlZmluZSBXSU5DT04wX0JQUE1PREVfU0hJRlQJCQkoMikKKyNkZWZpbmUgV0lOQ09OMF9CUFBNT0RFXzFCUFAJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFdJTkNPTjBfQlBQTU9ERV8yQlBQCQkJKDB4MSA8PCAyKQorI2RlZmluZSBXSU5DT04wX0JQUE1PREVfNEJQUAkJCSgweDIgPDwgMikKKyNkZWZpbmUgV0lOQ09OMF9CUFBNT0RFXzhCUFBfUEFMRVRURQkJKDB4MyA8PCAyKQorI2RlZmluZSBXSU5DT04wX0JQUE1PREVfMTZCUFBfNTY1CQkoMHg1IDw8IDIpCisjZGVmaW5lIFdJTkNPTjBfQlBQTU9ERV8xNkJQUF8xNTU1CQkoMHg3IDw8IDIpCisjZGVmaW5lIFdJTkNPTjBfQlBQTU9ERV8xOEJQUF82NjYJCSgweDggPDwgMikKKyNkZWZpbmUgV0lOQ09OMF9CUFBNT0RFXzI0QlBQXzg4OAkJKDB4YiA8PCAyKQorCisjZGVmaW5lIFdJTkNPTjFfQkxEX1BJWAkJCQkoMSA8PCA2KQorCisjZGVmaW5lIFdJTkNPTjFfQUxQSEFfU0VMCQkJKDEgPDwgMSkKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFX01BU0sJCQkoMHhmIDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV9TSElGVAkJCSgyKQorI2RlZmluZSBXSU5DT04xX0JQUE1PREVfMUJQUAkJCSgweDAgPDwgMikKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFXzJCUFAJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV80QlBQCQkJKDB4MiA8PCAyKQorI2RlZmluZSBXSU5DT04xX0JQUE1PREVfOEJQUF9QQUxFVFRFCQkoMHgzIDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV84QlBQXzEyMzIJCSgweDQgPDwgMikKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFXzE2QlBQXzU2NQkJKDB4NSA8PCAyKQorI2RlZmluZSBXSU5DT04xX0JQUE1PREVfMTZCUFBfQTE1NTUJCSgweDYgPDwgMikKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFXzE2QlBQX0kxNTU1CQkoMHg3IDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV8xOEJQUF82NjYJCSgweDggPDwgMikKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFXzE4QlBQX0ExNjY1CQkoMHg5IDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV8xOUJQUF9BMTY2NgkJKDB4YSA8PCAyKQorI2RlZmluZSBXSU5DT04xX0JQUE1PREVfMjRCUFBfODg4CQkoMHhiIDw8IDIpCisjZGVmaW5lIFdJTkNPTjFfQlBQTU9ERV8yNEJQUF9BMTg4NwkJKDB4YyA8PCAyKQorI2RlZmluZSBXSU5DT04xX0JQUE1PREVfMjVCUFBfQTE4ODgJCSgweGQgPDwgMikKKyNkZWZpbmUgV0lOQ09OMV9CUFBNT0RFXzI4QlBQX0E0ODg4CQkoMHhkIDw8IDIpCisKKworI2RlZmluZSBWSURPU0R4QV9UT1BMRUZUX1hfTUFTSwkJCSgweDdmZiA8PCAxMSkKKyNkZWZpbmUgVklET1NEeEFfVE9QTEVGVF9YX1NISUZUCQkoMTEpCisjZGVmaW5lIFZJRE9TRHhBX1RPUExFRlRfWF9MSU1JVAkJKDB4N2ZmKQorI2RlZmluZSBWSURPU0R4QV9UT1BMRUZUX1goX3gpCQkJKChfeCkgPDwgMTEpCisKKyNkZWZpbmUgVklET1NEeEFfVE9QTEVGVF9ZX01BU0sJCQkoMHg3ZmYgPDwgMCkKKyNkZWZpbmUgVklET1NEeEFfVE9QTEVGVF9ZX1NISUZUCQkoMCkKKyNkZWZpbmUgVklET1NEeEFfVE9QTEVGVF9ZX0xJTUlUCQkoMHg3ZmYpCisjZGVmaW5lIFZJRE9TRHhBX1RPUExFRlRfWShfeCkJCQkoKF94KSA8PCAwKQorCisjZGVmaW5lIFZJRE9TRHhCX0JPVFJJR0hUX1hfTUFTSwkJKDB4N2ZmIDw8IDExKQorI2RlZmluZSBWSURPU0R4Ql9CT1RSSUdIVF9YX1NISUZUCQkoMTEpCisjZGVmaW5lIFZJRE9TRHhCX0JPVFJJR0hUX1hfTElNSVQJCSgweDdmZikKKyNkZWZpbmUgVklET1NEeEJfQk9UUklHSFRfWChfeCkJCQkoKF94KSA8PCAxMSkKKworI2RlZmluZSBWSURPU0R4Ql9CT1RSSUdIVF9ZX01BU0sJCSgweDdmZiA8PCAwKQorI2RlZmluZSBWSURPU0R4Ql9CT1RSSUdIVF9ZX1NISUZUCQkoMCkKKyNkZWZpbmUgVklET1NEeEJfQk9UUklHSFRfWV9MSU1JVAkJKDB4N2ZmKQorI2RlZmluZSBWSURPU0R4Ql9CT1RSSUdIVF9ZKF94KQkJCSgoX3gpIDw8IDApCisKKy8qIEZvciBWSURPU0RbMS4uNF1DICovCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTBfUihfeCkJCQkoKF94KSA8PCAyMCkKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMF9HX01BU0sJCQkoMHhmIDw8IDE2KQorI2RlZmluZSBWSURJU0QxNENfQUxQSEEwX0dfU0hJRlQJCSgxNikKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMF9HX0xJTUlUCQkoMHhmKQorI2RlZmluZSBWSURJU0QxNENfQUxQSEEwX0coX3gpCQkJKChfeCkgPDwgMTYpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTBfQl9NQVNLCQkJKDB4ZiA8PCAxMikKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMF9CX1NISUZUCQkoMTIpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTBfQl9MSU1JVAkJKDB4ZikKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMF9CKF94KQkJCSgoX3gpIDw8IDEyKQorI2RlZmluZSBWSURJU0QxNENfQUxQSEExX1JfTUFTSwkJCSgweGYgPDwgOCkKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMV9SX1NISUZUCQkoOCkKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMV9SX0xJTUlUCQkoMHhmKQorI2RlZmluZSBWSURJU0QxNENfQUxQSEExX1IoX3gpCQkJKChfeCkgPDwgOCkKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMV9HX01BU0sJCQkoMHhmIDw8IDQpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTFfR19TSElGVAkJKDQpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTFfR19MSU1JVAkJKDB4ZikKKyNkZWZpbmUgVklESVNEMTRDX0FMUEhBMV9HKF94KQkJCSgoX3gpIDw8IDQpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTFfQl9NQVNLCQkJKDB4ZiA8PCAwKQorI2RlZmluZSBWSURJU0QxNENfQUxQSEExX0JfU0hJRlQJCSgwKQorI2RlZmluZSBWSURJU0QxNENfQUxQSEExX0JfTElNSVQJCSgweGYpCisjZGVmaW5lIFZJRElTRDE0Q19BTFBIQTFfQihfeCkJCQkoKF94KSA8PCAwKQorCisvKiBWaWRlbyBidWZmZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIFZJRFdfQlVGX1NUQVJUKF9idWZmKQkJCSgweEEwICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfU1RBUlQxKF9idWZmKQkJCSgweEE0ICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfRU5EKF9idWZmKQkJCSgweEQwICsgKChfYnVmZikgKiA4KSkKKyNkZWZpbmUgVklEV19CVUZfRU5EMShfYnVmZikJCQkoMHhENCArICgoX2J1ZmYpICogOCkpCisjZGVmaW5lIFZJRFdfQlVGX1NJWkUoX2J1ZmYpCQkJKDB4MTAwICsgKChfYnVmZikgKiA0KSkKKworI2RlZmluZSBWSURXX0JVRl9TSVpFX09GRlNFVF9NQVNLCQkoMHgxZmZmIDw8IDEzKQorI2RlZmluZSBWSURXX0JVRl9TSVpFX09GRlNFVF9TSElGVAkJKDEzKQorI2RlZmluZSBWSURXX0JVRl9TSVpFX09GRlNFVF9MSU1JVAkJKDB4MWZmZikKKyNkZWZpbmUgVklEV19CVUZfU0laRV9PRkZTRVQoX3gpCQkoKF94KSA8PCAxMykKKworI2RlZmluZSBWSURXX0JVRl9TSVpFX1BBR0VXSURUSF9NQVNLCQkoMHgxZmZmIDw8IDApCisjZGVmaW5lIFZJRFdfQlVGX1NJWkVfUEFHRVdJRFRIX1NISUZUCQkoMCkKKyNkZWZpbmUgVklEV19CVUZfU0laRV9QQUdFV0lEVEhfTElNSVQJCSgweDFmZmYpCisjZGVmaW5lIFZJRFdfQlVGX1NJWkVfUEFHRVdJRFRIKF94KQkJKChfeCkgPDwgMCkKKworLyogSW50ZXJydXB0IGNvbnRyb2xzIGFuZCBzdGF0dXMgKi8KKworI2RlZmluZSBWSURJTlRDT04wX0ZJRk9JTlRFUlZBTF9NQVNLCQkoMHgzZiA8PCAyMCkKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZPSU5URVJWQUxfU0hJRlQJCSgyMCkKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZPSU5URVJWQUxfTElNSVQJCSgweDNmKQorI2RlZmluZSBWSURJTlRDT04wX0ZJRk9JTlRFUlZBTChfeCkJCSgoX3gpIDw8IDIwKQorCisjZGVmaW5lIFZJRElOVENPTjBfSU5UX1NZU01BSU5DT04JCSgxIDw8IDE5KQorI2RlZmluZSBWSURJTlRDT04wX0lOVF9TWVNTVUJDT04JCSgxIDw8IDE4KQorI2RlZmluZSBWSURJTlRDT04wX0lOVF9JODBJRkRPTkUJCSgxIDw8IDE3KQorCisjZGVmaW5lIFZJRElOVENPTjBfRlJBTUVTRUwwX01BU0sJCSgweDMgPDwgMTUpCisjZGVmaW5lIFZJRElOVENPTjBfRlJBTUVTRUwwX1NISUZUCQkoMTUpCisjZGVmaW5lIFZJRElOVENPTjBfRlJBTUVTRUwwX0JBQ0tQT1JDSAkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgVklESU5UQ09OMF9GUkFNRVNFTDBfVlNZTkMJCSgweDEgPDwgMTUpCisjZGVmaW5lIFZJRElOVENPTjBfRlJBTUVTRUwwX0FDVElWRQkJKDB4MiA8PCAxNSkKKyNkZWZpbmUgVklESU5UQ09OMF9GUkFNRVNFTDBfRlJPTlRQT1JDSAkJKDB4MyA8PCAxNSkKKworI2RlZmluZSBWSURJTlRDT04wX0ZSQU1FU0VMMQkJCSgxIDw8IDE0KQorI2RlZmluZSBWSURJTlRDT04wX0ZSQU1FU0VMMV9OT05FCQkoMHgwIDw8IDE0KQorI2RlZmluZSBWSURJTlRDT04wX0ZSQU1FU0VMMV9CQUNLUE9SQ0gJCSgweDEgPDwgMTQpCisjZGVmaW5lIFZJRElOVENPTjBfRlJBTUVTRUwxX1ZTWU5DCQkoMHgyIDw8IDE0KQorI2RlZmluZSBWSURJTlRDT04wX0ZSQU1FU0VMMV9GUk9OVFBPUkNICQkoMHgzIDw8IDE0KQorCisjZGVmaW5lIFZJRElOVENPTjBfSU5UX0ZSQU1FCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZJRElOVENPTjBfRklGSU9TRUxfTUFTSwkJKDB4N2YgPDwgNSkKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZJT1NFTF9TSElGVAkJKDUpCisjZGVmaW5lIFZJRElOVENPTjBfRklGSU9TRUxfV0lORE9XMAkJKDB4MSA8PCA1KQorI2RlZmluZSBWSURJTlRDT04wX0ZJRklPU0VMX1dJTkRPVzEJCSgweDIgPDwgNSkKKworI2RlZmluZSBWSURJTlRDT04wX0ZJRk9MRVZFTF9NQVNLCQkoMHg3IDw8IDIpCisjZGVmaW5lIFZJRElOVENPTjBfRklGT0xFVkVMX1NISUZUCQkoMikKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZPTEVWRUxfVE8yNVBDCQkoMHgwIDw8IDIpCisjZGVmaW5lIFZJRElOVENPTjBfRklGT0xFVkVMX1RPNTBQQwkJKDB4MSA8PCAyKQorI2RlZmluZSBWSURJTlRDT04wX0ZJRk9MRVZFTF9UTzc1UEMJCSgweDIgPDwgMikKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZPTEVWRUxfRU1QVFkJCSgweDMgPDwgMikKKyNkZWZpbmUgVklESU5UQ09OMF9GSUZPTEVWRUxfRlVMTAkJKDB4NCA8PCAyKQorCisjZGVmaW5lIFZJRElOVENPTjBfSU5UX0ZJRk9fTUFTSwkJKDB4MyA8PCAwKQorI2RlZmluZSBWSURJTlRDT04wX0lOVF9GSUZPX1NISUZUCQkoMCkKKyNkZWZpbmUgVklESU5UQ09OMF9JTlRfRU5BQkxFCQkJKDEgPDwgMCkKKworI2RlZmluZSBWSURJTlRDT04xCQkJCSgweDEzNCkKKyNkZWZpbmUgVklESU5UQ09OMV9JTlRfSTE4MAkJCSgxIDw8IDIpCisjZGVmaW5lIFZJRElOVENPTjFfSU5UX0ZSQU1FCQkJKDEgPDwgMSkKKyNkZWZpbmUgVklESU5UQ09OMV9JTlRfRklGTwkJCSgxIDw8IDApCisKKy8qIFdpbmRvdyBjb2xvdXIta2V5IGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgV3hLRVlDT04wX0tFWUJMX0VOCQkJKDEgPDwgMjYpCisjZGVmaW5lIFd4S0VZQ09OMF9LRVlFTl9GCQkJKDEgPDwgMjUpCisjZGVmaW5lIFd4S0VZQ09OMF9ESVJDT04JCQkoMSA8PCAyNCkKKyNkZWZpbmUgV3hLRVlDT04wX0NPTVBLRVlfTUFTSwkJCSgweGZmZmZmZiA8PCAwKQorI2RlZmluZSBXeEtFWUNPTjBfQ09NUEtFWV9TSElGVAkJCSgwKQorI2RlZmluZSBXeEtFWUNPTjBfQ09NUEtFWV9MSU1JVAkJCSgweGZmZmZmZikKKyNkZWZpbmUgV3hLRVlDT04wX0NPTVBLRVkoX3gpCQkJKChfeCkgPDwgMCkKKyNkZWZpbmUgV3hLRVlDT04xX0NPTFZBTF9NQVNLCQkJKDB4ZmZmZmZmIDw8IDApCisjZGVmaW5lIFd4S0VZQ09OMV9DT0xWQUxfU0hJRlQJCQkoMCkKKyNkZWZpbmUgV3hLRVlDT04xX0NPTFZBTF9MSU1JVAkJCSgweGZmZmZmZikKKyNkZWZpbmUgV3hLRVlDT04xX0NPTFZBTChfeCkJCQkoKF94KSA8PCAwKQorCisKKy8qIFdpbmRvdyBibGFua2luZyAoTUFQKSAqLworCisjZGVmaW5lIFdJTnhNQVBfTUFQCQkJCSgxIDw8IDI0KQorI2RlZmluZSBXSU54TUFQX01BUF9DT0xPVVJfTUFTSwkJCSgweGZmZmZmZiA8PCAwKQorI2RlZmluZSBXSU54TUFQX01BUF9DT0xPVVJfU0hJRlQJCSgwKQorI2RlZmluZSBXSU54TUFQX01BUF9DT0xPVVJfTElNSVQJCSgweGZmZmZmZikKKyNkZWZpbmUgV0lOeE1BUF9NQVBfQ09MT1VSKF94KQkJCSgoX3gpIDw8IDApCisKKyNkZWZpbmUgV1BBTENPTl9QQUxfVVBEQVRFCQkJKDEgPDwgOSkKKyNkZWZpbmUgV1BBTENPTl9XMVBBTF9NQVNLCQkJKDB4NyA8PCAzKQorI2RlZmluZSBXUEFMQ09OX1cxUEFMX1NISUZUCQkJKDMpCisjZGVmaW5lIFdQQUxDT05fVzFQQUxfMjVCUFBfQTg4OAkJKDB4MCA8PCAzKQorI2RlZmluZSBXUEFMQ09OX1cxUEFMXzI0QlBQCQkJKDB4MSA8PCAzKQorI2RlZmluZSBXUEFMQ09OX1cxUEFMXzE5QlBQX0E2NjYJCSgweDIgPDwgMykKKyNkZWZpbmUgV1BBTENPTl9XMVBBTF8xOEJQUF9BNjY1CQkoMHgzIDw8IDMpCisjZGVmaW5lIFdQQUxDT05fVzFQQUxfMThCUFAJCQkoMHg0IDw8IDMpCisjZGVmaW5lIFdQQUxDT05fVzFQQUxfMTZCUFBfQTU1NQkJKDB4NSA8PCAzKQorI2RlZmluZSBXUEFMQ09OX1cxUEFMXzE2QlBQXzU2NQkJCSgweDYgPDwgMykKKworI2RlZmluZSBXUEFMQ09OX1cwUEFMX01BU0sJCQkoMHg3IDw8IDApCisjZGVmaW5lIFdQQUxDT05fVzBQQUxfU0hJRlQJCQkoMCkKKyNkZWZpbmUgV1BBTENPTl9XMFBBTF8yNUJQUF9BODg4CQkoMHgwIDw8IDApCisjZGVmaW5lIFdQQUxDT05fVzBQQUxfMjRCUFAJCQkoMHgxIDw8IDApCisjZGVmaW5lIFdQQUxDT05fVzBQQUxfMTlCUFBfQTY2NgkJKDB4MiA8PCAwKQorI2RlZmluZSBXUEFMQ09OX1cwUEFMXzE4QlBQX0E2NjUJCSgweDMgPDwgMCkKKyNkZWZpbmUgV1BBTENPTl9XMFBBTF8xOEJQUAkJCSgweDQgPDwgMCkKKyNkZWZpbmUgV1BBTENPTl9XMFBBTF8xNkJQUF9BNTU1CQkoMHg1IDw8IDApCisjZGVmaW5lIFdQQUxDT05fVzBQQUxfMTZCUFBfNTY1CQkJKDB4NiA8PCAwKQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1paWMuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWlpYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1paWMuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtaWljLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWlycXR5cGUuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWlycXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNjZDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtaXJxdHlwZS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWlycXR5cGUuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDIC0gSVJRIGRldGVjdGlvbiB0eXBlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qIHZhbHVlcyBmb3IgUzNDMjQxMF9FWFRJTlQwLzEvMiBhbmQgb3RoZXIgY3B1cyBpbiB0aGUgc2VyaWVzLCBpbmNsdWRpbmcKKyAqIHRoZSBTM0M2NFhYCisqLworI2RlZmluZSBTM0MyNDEwX0VYVElOVF9MT1dMRVYJICgweDAwKQorI2RlZmluZSBTM0MyNDEwX0VYVElOVF9ISUxFVgkgKDB4MDEpCisjZGVmaW5lIFMzQzI0MTBfRVhUSU5UX0ZBTExFREdFCSAoMHgwMikKKyNkZWZpbmUgUzNDMjQxMF9FWFRJTlRfUklTRUVER0UJICgweDA0KQorI2RlZmluZSBTM0MyNDEwX0VYVElOVF9CT1RIRURHRQkgKDB4MDYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1uYW5kLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1uYW5kLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9yZWdzLW5hbmQuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtbmFuZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1ydGMuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXJ0Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1ydGMuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtcnRjLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXNkaGNpLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1zZGhjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDA0OWFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtc2RoY2kuaApAQCAtMCwwICsxLDg3IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1zZGhjaS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MgUGxhdGZvcm0gLSBTREhDSSAoSFNNTUMpIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19QTEFUX1MzQ19TREhDSV9SRUdTX0gKKyNkZWZpbmUgX19QTEFUX1MzQ19TREhDSV9SRUdTX0ggX19GSUxFX18KKworI2RlZmluZSBTM0NfU0RIQ0lfQ09OVFJPTDIJCQkoMHg4MCkKKyNkZWZpbmUgUzNDX1NESENJX0NPTlRST0wzCQkJKDB4ODQpCisjZGVmaW5lIFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDQJCQkoMHg4QykKKworI2RlZmluZSBTM0M2NFhYX1NESENJX0NUUkwyX0VOU1RBQVNZTkNDTFIJKDEgPDwgMzEpCisjZGVmaW5lIFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5DTURDTkZNU0sJCSgxIDw8IDMwKQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfQ0RJTlZSWEQzCQkoMSA8PCAyOSkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX1NMQ0FSRE9VVAkJKDEgPDwgMjgpCisKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX0ZMVENMS1NFTF9NQVNLCQkoMHhmIDw8IDI0KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfRkxUQ0xLU0VMX1NISUZUCQkoMjQpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9GTFRDTEtTRUwoX3gpCQkoKF94KSA8PCAyNCkKKworI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfTFZMREFUX01BU0sJCSgweGZmIDw8IDE2KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfTFZMREFUX1NISUZUCQkoMTYpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9MVkxEQVQoX3gpCQkoKF94KSA8PCAxNikKKworI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfRU5GQkNMS1RYCQkoMSA8PCAxNSkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWAkJKDEgPDwgMTQpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9TRENEU0VMCQkJKDEgPDwgMTMpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9TRFNJR1BDCQkJKDEgPDwgMTIpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9FTkJVU1lDSEtUWFNUQVJUCSgxIDw8IDExKQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9NQVNLCQkoMHgzIDw8IDkpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9TSElGVAkJKDkpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9OT05FCQkoMHgwIDw8IDkpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9ERkNOVF80U0RDTEsJCSgweDEgPDwgOSkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX0RGQ05UXzE2U0RDTEsJCSgweDIgPDwgOSkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX0RGQ05UXzY0U0RDTEsJCSgweDMgPDwgOSkKKworI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfRU5DTEtPVVRIT0xECQkoMSA8PCA4KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfUldBSVRNT0RFCQkoMSA8PCA3KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfRElTQlVGUkQJCSgxIDw8IDYpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0sJCSgweDMgPDwgNCkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX1NFTEJBU0VDTEtfU0hJRlQJKDQpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMMl9QV1JTWU5DCQkJKDEgPDwgMykKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwyX0VOQ0xLT1VUTVNLQ09OCQkoMSA8PCAxKQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDJfSFdJTklURklOCQkoMSA8PCAwKQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GQ1NFTDMJCQkoMSA8PCAzMSkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwzX0ZDU0VMMgkJCSgxIDw8IDIzKQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxCQkJKDEgPDwgMTUpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GQ1NFTDAJCQkoMSA8PCA3KQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUEzX01BU0sJCSgweDdmIDw8IDI0KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDNfRklBM19TSElGVAkJKDI0KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDNfRklBMyhfeCkJCSgoX3gpIDw8IDI0KQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUEyX01BU0sJCSgweDdmIDw8IDE2KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDNfRklBMl9TSElGVAkJKDE2KQorI2RlZmluZSBTM0NfU0RIQ0lfQ1RSTDNfRklBMihfeCkJCSgoX3gpIDw8IDE2KQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUExX01BU0sJCSgweDdmIDw8IDgpCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUExX1NISUZUCQkoOCkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwzX0ZJQTEoX3gpCQkoKF94KSA8PCA4KQorCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUEwX01BU0sJCSgweDdmIDw8IDApCisjZGVmaW5lIFMzQ19TREhDSV9DVFJMM19GSUEwX1NISUZUCQkoMCkKKyNkZWZpbmUgUzNDX1NESENJX0NUUkwzX0ZJQTAoX3gpCQkoKF94KSA8PCAwKQorCisjZGVmaW5lIFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDRfRFJJVkVfTUFTSwkoMHgzIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX1NESENJX0NPTlRST0w0X0RSSVZFX1NISUZUCSgxNikKKyNkZWZpbmUgUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV8ybUEJKDB4MCA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV80bUEJKDB4MSA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV83bUEJKDB4MiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV85bUEJKDB4MyA8PCAxNikKKworI2RlZmluZSBTM0M2NFhYX1NESENJX0NPTlRST0w0X0JVU1kJCSgxKQorCisjZW5kaWYgLyogX19QTEFUX1MzQ19TREhDSV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKaW5kZXggYTBkYWE2NC4uNDg3ZDdkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKQEAgLTc3LDYgKzc3LDEyIEBACiAjZGVmaW5lIFMzQzI0NDBfVUNPTl9GQ0xLCSAgKDM8PDEwKQogI2RlZmluZSBTM0MyNDQzX1VDT05fRVBMTAkgICgzPDwxMCkKIAorI2RlZmluZSBTM0M2NDAwX1VDT05fQ0xLTUFTSwkoMzw8MTApCisjZGVmaW5lIFMzQzY0MDBfVUNPTl9QQ0xLCSgwPDwxMCkKKyNkZWZpbmUgUzNDNjQwMF9VQ09OX1BDTEsyCSgyPDwxMCkKKyNkZWZpbmUgUzNDNjQwMF9VQ09OX1VDTEswCSgxPDwxMCkKKyNkZWZpbmUgUzNDNjQwMF9VQ09OX1VDTEsxCSgzPDwxMCkKKwogI2RlZmluZSBTM0MyNDQwX1VDT04yX0ZDTEtfRU4JICAoMTw8MTUpCiAjZGVmaW5lIFMzQzI0NDBfVUNPTjBfRElWTUFTSwkgICgxNSA8PCAxMikKICNkZWZpbmUgUzNDMjQ0MF9VQ09OMV9ESVZNQVNLCSAgKDE1IDw8IDEyKQpAQCAtMTQ5LDYgKzE1NSwxNCBAQAogI2RlZmluZSBTM0MyNDEwX1VGU1RBVF9SWE1BU0sJICAoMTU8PDApCiAjZGVmaW5lIFMzQzI0MTBfVUZTVEFUX1JYU0hJRlQJICAoMCkKIAorLyogVUZTVEFUIFMzQzI0QTAgKi8KKyNkZWZpbmUgUzNDMjRBMF9VRlNUQVRfVFhGVUxMCSAgKDEgPDwgMTQpCisjZGVmaW5lIFMzQzI0QTBfVUZTVEFUX1JYRlVMTAkgICgxIDw8IDYpCisjZGVmaW5lIFMzQzI0QTBfVUZTVEFUX1RYTUFTSwkgICg2MyA8PCA4KQorI2RlZmluZSBTM0MyNEEwX1VGU1RBVF9UWFNISUZUCSAgKDgpCisjZGVmaW5lIFMzQzI0QTBfVUZTVEFUX1JYTUFTSwkgICg2MykKKyNkZWZpbmUgUzNDMjRBMF9VRlNUQVRfUlhTSElGVAkgICgwKQorCiAvKiBVRlNUQVQgUzNDMjQ0MyBzYW1lIGFzIFMzQzI0NDAgKi8KICNkZWZpbmUgUzNDMjQ0MF9VRlNUQVRfVFhGVUxMCSAgKDE8PDE0KQogI2RlZmluZSBTM0MyNDQwX1VGU1RBVF9SWEZVTEwJICAoMTw8NikKQEAgLTIyNCw3ICsyMzgsNyBAQAogICogb3IgcGxhdGZvcm1fYWRkX2RldmljZSgpIGJlZm9yZSB0aGUgY29uc29sZV9pbml0Y2FsbCgpCiAqLwogCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X2RldnNbM107CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X2RldnNbNF07CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtdGltZXIuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXRpbWVyLmgKaW5kZXggY2MwZWVkZC4uZDA5N2Q5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtdGltZXIuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy10aW1lci5oCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBTM0MyNDEwIFRpbWVyIGNvbmZpZ3VyYXRpb24KICovCiAKLQogI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfVElNRVJfSAogI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfVElNRVJfSAogCkBAIC0yMSw2ICsyMCw4IEBACiAjZGVmaW5lIFMzQzI0MTBfVENGRzEJICAgICAgUzNDX1RJTUVSUkVHKDB4MDQpCiAjZGVmaW5lIFMzQzI0MTBfVENPTgkgICAgICBTM0NfVElNRVJSRUcoMHgwOCkKIAorI2RlZmluZSBTM0M2NFhYX1RJTlRfQ1NUQVQgICAgUzNDX1RJTUVSUkVHKDB4NDQpCisKICNkZWZpbmUgUzNDMjQxMF9UQ0ZHX1BSRVNDQUxFUjBfTUFTSyAoMjU1PDwwKQogI2RlZmluZSBTM0MyNDEwX1RDRkdfUFJFU0NBTEVSMV9NQVNLICgyNTU8PDgpCiAjZGVmaW5lIFMzQzI0MTBfVENGR19QUkVTQ0FMRVIxX1NISUZUICg4KQpAQCAtNzIsNiArNzMsMTQgQEAKICNkZWZpbmUgUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSyAgICAoNDw8MCkKICNkZWZpbmUgUzNDMjQxMF9UQ0ZHMV9NVVhfTUFTSwkgICgxNTw8MCkKIAorI2RlZmluZSBTM0M2NFhYX1RDRkcxX01VWF9ESVYxCSAgKDA8PDApCisjZGVmaW5lIFMzQzY0WFhfVENGRzFfTVVYX0RJVjIJICAoMTw8MCkKKyNkZWZpbmUgUzNDNjRYWF9UQ0ZHMV9NVVhfRElWNAkgICgyPDwwKQorI2RlZmluZSBTM0M2NFhYX1RDRkcxX01VWF9ESVY4ICAgICgzPDwwKQorI2RlZmluZSBTM0M2NFhYX1RDRkcxX01VWF9ESVYxNiAgICg0PDwwKQorI2RlZmluZSBTM0M2NFhYX1RDRkcxX01VWF9UQ0xLICAgICg1PDwwKSAgLyogMyBzZXRzIG9mIFRDTEsgKi8KKyNkZWZpbmUgUzNDNjRYWF9UQ0ZHMV9NVVhfTUFTSwkgICgxNTw8MCkKKwogI2RlZmluZSBTM0MyNDEwX1RDRkcxX1NISUZUKHgpCSAgKCh4KSAqIDQpCiAKIC8qIGZvciBlYWNoIHRpbWVyLCB3ZSBoYXZlIGFuIGNvdW50IGJ1ZmZlciwgYW4gY29tcGFyZSBidWZmZXIgYW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy13YXRjaGRvZy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtd2F0Y2hkb2cuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtd2F0Y2hkb2cuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3NkaGNpLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvc2RoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGNhMzkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3NkaGNpLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9zZGhjaS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MgUGxhdGZvcm0gLSBTREhDSSAoSFNNTUMpIHBsYXRmb3JtIGRhdGEgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX1BMQVRfUzNDX1NESENJX0gKKyNkZWZpbmUgX19QTEFUX1MzQ19TREhDSV9IIF9fRklMRV9fCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CitzdHJ1Y3QgbW1jX2hvc3Q7CitzdHJ1Y3QgbW1jX2NhcmQ7CitzdHJ1Y3QgbW1jX2lvczsKKworLyoqCisgKiBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhKCkgLSBQbGF0Zm9ybSBkZXZpY2UgZGF0YSBmb3IgU2Ftc3VuZyBTREhDSQorICogQG1heF93aWR0aDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRhdGEgYml0cyBzdXBwb3J0ZWQuCisgKiBAaG9zdF9jYXBzOiBTdGFuZGFyZCBNTUMgaG9zdCBjYXBhYmlsaXRpZXMgYml0IGZpZWxkLgorICogQGNmZ19ncGlvOiBDb25maWd1cmUgdGhlIEdQSU8gZm9yIGEgc3BlY2lmaWMgY2FyZCBiaXQtd2lkdGgKKyAqIEBjZmdfY2FyZDogQ29uZmlndXJlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3BlY2lmaWMgY2FyZCBhbmQgc3BlZWQuIFRoaXMKKyAqICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IHRoZSBjb250cm9sbGVycyBhbmQvb3IgR1BJTyBibG9ja3MgcmVxdWlyZSB0aGUKKyAqCSAgICAgIGNoYW5naW5nIG9mIGRyaXZlci1zdHJlbmd0aCBhbmQgb3RoZXIgY29udHJvbHMgZGVwZW5kYW50IG9uCisgKgkgICAgICB0aGUgY2FyZCBhbmQgc3BlZWQgb2Ygb3BlcmF0aW9uLgorICoKKyAqIEluaXRpYWxpc2F0aW9uIGRhdGEgc3BlY2lmaWMgdG8gZWl0aGVyIHRoZSBtYWNoaW5lIG9yIHRoZSBwbGF0Zm9ybQorICogZm9yIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHVzZSBvciBjYWxsLWJhY2sgd2hlbiBjb25maWd1cmluZyBncGlvIG9yCisgKiBjYXJkIHNwZWVkIGluZm9ybWF0aW9uLgorKi8KK3N0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgeworCXVuc2lnbmVkIGludAltYXhfd2lkdGg7CisJdW5zaWduZWQgaW50CWhvc3RfY2FwczsKKworCWNoYXIJCSoqY2xvY2tzOwkvKiBzZXQgb2YgY2xvY2sgc291cmNlcyAqLworCisJdm9pZAkoKmNmZ19ncGlvKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIGludCB3aWR0aCk7CisJdm9pZAkoKmNmZ19jYXJkKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkgICAgdm9pZCBfX2lvbWVtICpyZWdiYXNlLAorCQkJICAgIHN0cnVjdCBtbWNfaW9zICppb3MsCisJCQkgICAgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKK307CisKKy8qKgorICogczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEgLSBTZXQgcGxhdGZvcm0gZGF0YSBmb3IgUzNDIFNESENJIGRldmljZS4KKyAqIEBwZDogUGxhdGZvcm0gZGF0YSB0byByZWdpc3RlciB0byBkZXZpY2UuCisgKgorICogUmVnaXN0ZXIgdGhlIGdpdmVuIHBsYXRmb3JtIGRhdGEgZm9yIHVzZSB3aXRoZSBTM0MgU0RIQ0kgZGV2aWNlLgorICogVGhlIGNhbGwgd2lsbCBjb3B5IHRoZSBwbGF0Zm9ybSBkYXRhLCBzbyB0aGUgYm9hcmQgZGVmaW5pdGlvbnMgY2FuCisgKiBtYWtlIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmIF9faW5pdGRhdGEuCisgKi8KK2V4dGVybiB2b2lkIHMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKTsKK2V4dGVybiB2b2lkIHMzY19zZGhjaTFfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKTsKKworLyogRGVmYXVsdCBwbGF0Zm9ybSBkYXRhLCBleHBvcnRlZCBzbyB0aGF0IHBlci1jcHUgaW5pdGlhbGlzYXRpb24gY2FuCisgKiBzZXQgdGhlIGNvcnJlY3Qgb25lIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY3B1IHR5cGUgc2VsZWN0ZWQuCisqLworCitleHRlcm4gc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YTsKK2V4dGVybiBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzFfZGVmX3BsYXRkYXRhOworCisvKiBIZWxwZXIgZnVuY3Rpb24gYXZhaWxhYmxpdHkgKi8KKworI2lmZGVmIENPTkZJR19TM0M2NDEwX1NFVFVQX1NESENJCitleHRlcm4gY2hhciAqczNjNjQxMF9oc21tY19jbGtzcmNzWzRdOworCitleHRlcm4gdm9pZCBzM2M2NDEwX3NldHVwX3NkaGNpMF9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIGludCB3KTsKK2V4dGVybiB2b2lkIHMzYzY0MTBfc2V0dXBfc2RoY2kxX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgaW50IHcpOworCitleHRlcm4gdm9pZCBzM2M2NDEwX3NldHVwX3NkaGNpMF9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgIHZvaWQgX19pb21lbSAqciwKKwkJCQkJICAgc3RydWN0IG1tY19pb3MgKmlvcywKKwkJCQkJICAgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCitzdGF0aWMgaW5saW5lIHZvaWQgczNjNjQxMF9kZWZhdWx0X3NkaGNpMCh2b2lkKQoreworCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0MTBfaHNtbWNfY2xrc3JjczsKKwlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0MTBfc2V0dXBfc2RoY2kwX2NmZ19ncGlvOworCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQxMF9zZXR1cF9zZGhjaTBfY2ZnX2NhcmQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHMzYzY0MTBfZGVmYXVsdF9zZGhjaTAodm9pZCkgeyB9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSFNNTUMgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQorc3RhdGljIGlubGluZSB2b2lkIHMzYzY0MTBfZGVmYXVsdF9zZGhjaTEodm9pZCkKK3sKKwlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2M2NDEwX2hzbW1jX2Nsa3NyY3M7CisJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2M2NDEwX3NldHVwX3NkaGNpMV9jZmdfZ3BpbzsKKwlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzY0MTBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2M2NDEwX2RlZmF1bHRfc2RoY2kxKHZvaWQpIHsgfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0hTTU1DMSAqLworCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHMzYzY0MTBfZGVmYXVsdF9zZGhjaTAodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgczNjNjQxMF9kZWZhdWx0X3NkaGNpMSh2b2lkKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfUzNDNjQxMF9TRVRVUF9TREhDSSAqLworCisjZW5kaWYgLyogX19QTEFUX1MzQ19TREhDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3VuY29tcHJlc3MuaAppbmRleCA0ZGYwMDZiLi42MDYxZGU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC91bmNvbXByZXNzLmgKQEAgLTI4LDcgKzI4LDcgQEAKIC8qIGRlZmluZXMgZm9yIFVBUlQgcmVnaXN0ZXJzICovCiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtd2F0Y2hkb2cuaD4KIAogLyogd29ya2luZyBpbiBwaHlzaWNhbCBzcGFjZS4uLiAqLwogI3VuZGVmIFMzQzI0MTBfV0RPR1JFRwpAQCAtMzcsNyArMzcsNyBAQAogLyogaG93IG1hbnkgYnl0ZXMgd2UgYWxsb3cgaW50byB0aGUgRklGTyBhdCBhIHRpbWUgaW4gRklGTyBtb2RlICovCiAjZGVmaW5lIEZJRk9fTUFYCSAoMTQpCiAKLSNkZWZpbmUgdWFydF9iYXNlIFMzQzI0WFhfUEFfVUFSVCArICgweDQwMDAqQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQpCisjZGVmaW5lIHVhcnRfYmFzZSBTM0NfUEFfVUFSVCArIChTM0NfVUFSVF9PRkZTRVQgKiBDT05GSUdfUzNDX0xPV0xFVkVMX1VBUlRfUE9SVCkKIAogc3RhdGljIF9faW5saW5lX18gdm9pZAogdWFydF93cih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQpAQCAtMTM5LDYgKzEzOSwyOCBAQAogCiBzdGF0aWMgdm9pZCBlcnJvcihjaGFyICplcnIpOwogCisjaWZkZWYgQ09ORklHX1MzQ19CT09UX1VBUlRfRk9SQ0VfRklGTworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZW5hYmxlX3VhcnRfZmlmbyh2b2lkKQoreworCXUzMiBmaWZvY29uID0gdWFydF9yZChTM0MyNDEwX1VGQ09OKTsKKworCWlmICghKGZpZm9jb24gJiBTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFKSkgeworCQlmaWZvY29uIHw9IFMzQzI0MTBfVUZDT05fUkVTRVRCT1RIOworCQl1YXJ0X3dyKFMzQzI0MTBfVUZDT04sIGZpZm9jb24pOworCisJCS8qIHdhaXQgZm9yIGZpZm8gcmVzZXQgdG8gY29tcGxldGUgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWZpZm9jb24gPSB1YXJ0X3JkKFMzQzI0MTBfVUZDT04pOworCQkJaWYgKCEoZmlmb2NvbiAmIFMzQzI0MTBfVUZDT05fUkVTRVRCT1RIKSkKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbHNlCisjZGVmaW5lIGFyY2hfZW5hYmxlX3VhcnRfZmlmbygpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKwogc3RhdGljIHZvaWQKIGFyY2hfZGVjb21wX3NldHVwKHZvaWQpCiB7CkBAIC0xNDksNiArMTcxLDEyIEBACiAKIAlhcmNoX2RldGVjdF9jcHUoKTsKIAlhcmNoX2RlY29tcF93ZG9nX3N0YXJ0KCk7CisKKwkvKiBFbmFibGUgdGhlIFVBUlQgRklGT3MgaWYgdGhleSB3aGVyZSBub3QgZW5hYmxlZCBhbmQgb3VyCisJICogY29uZmlndXJhdGlvbiBzYXlzIHdlIHNob3VsZCB0dXJuIHRoZW0gb24uCisJICovCisKKwlhcmNoX2VuYWJsZV91YXJ0X2ZpZm8oKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbml0LmMgYi9hcmNoL2FybS9wbGF0LXMzYy9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MGVkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2luaXQuYwpAQCAtMCwwICsxLDE2MCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvaW5pdC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0Mgc2VyaWVzIENQVSBpbml0aWFsaXNhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKworc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgKmNwdTsKKworc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgKiBfX2luaXQgczNjX2xvb2t1cF9jcHUodW5zaWduZWQgbG9uZyBpZGNvZGUsCisJCQkJCQlzdHJ1Y3QgY3B1X3RhYmxlICp0YWIsCisJCQkJCQl1bnNpZ25lZCBpbnQgY291bnQpCit7CisJZm9yICg7IGNvdW50ICE9IDA7IGNvdW50LS0sIHRhYisrKSB7CisJCWlmICgoaWRjb2RlICYgdGFiLT5pZG1hc2spID09IHRhYi0+aWRjb2RlKQorCQkJcmV0dXJuIHRhYjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX2luaXQgczNjX2luaXRfY3B1KHVuc2lnbmVkIGxvbmcgaWRjb2RlLAorCQkJIHN0cnVjdCBjcHVfdGFibGUgKmNwdXRhYiwgdW5zaWduZWQgaW50IGNwdXRhYl9zaXplKQoreworCWNwdSA9IHMzY19sb29rdXBfY3B1KGlkY29kZSwgY3B1dGFiLCBjcHV0YWJfc2l6ZSk7CisKKwlpZiAoY3B1ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIENQVSB0eXBlIDB4JTA4bHhcbiIsIGlkY29kZSk7CisJCXBhbmljKCJVbmtub3duIFMzQzI0WFggQ1BVIik7CisJfQorCisJcHJpbnRrKCJDUFUgJXMgKGlkIDB4JTA4bHgpXG4iLCBjcHUtPm5hbWUsIGlkY29kZSk7CisKKwlpZiAoY3B1LT5tYXBfaW8gPT0gTlVMTCB8fCBjcHUtPmluaXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVSAlcyBzdXBwb3J0IG5vdCBlbmFibGVkXG4iLCBjcHUtPm5hbWUpOworCQlwYW5pYygiVW5zdXBwb3J0ZWQgU2Ftc3VuZyBDUFUiKTsKKwl9CisKKwljcHUtPm1hcF9pbygpOworfQorCisvKiBzM2MyNHh4X2luaXRfY2xvY2tzCisgKgorICogSW5pdGlhbGlzZSB0aGUgY2xvY2sgc3Vic3lzdGVtIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiBnaXZlbiBtYXN0ZXIgY3J5c3RhbCB2YWx1ZS4KKyAqCisgKiB4dGFsICA9IDAgLT4gdXNlIGRlZmF1bHQgUExMIGNyeXN0YWwgdmFsdWUgKG5vcm1hbGx5IDEyTUh6KQorICogICAgICAhPSAwIC0+IFBMTCBjcnlzdGFsIHZhbHVlIGluIEh6CisqLworCit2b2lkIF9faW5pdCBzM2MyNHh4X2luaXRfY2xvY2tzKGludCB4dGFsKQoreworCWlmICh4dGFsID09IDApCisJCXh0YWwgPSAxMioxMDAwKjEwMDA7CisKKwlpZiAoY3B1ID09IE5VTEwpCisJCXBhbmljKCJzM2MyNHh4X2luaXRfY2xvY2tzOiBubyBjcHUgc2V0dXA/XG4iKTsKKworCWlmIChjcHUtPmluaXRfY2xvY2tzID09IE5VTEwpCisJCXBhbmljKCJzM2MyNHh4X2luaXRfY2xvY2tzOiBjcHUgaGFzIG5vIGNsb2NrIGluaXRcbiIpOworCWVsc2UKKwkJKGNwdS0+aW5pdF9jbG9ja3MpKHh0YWwpOworfQorCisvKiB1YXJ0IG1hbmFnZW1lbnQgKi8KKworc3RhdGljIGludCBucl91YXJ0cyBfX2luaXRkYXRhID0gMDsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgdWFydF9jZmdzW0NPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUU107CisKKy8qIHMzYzI0eHhfaW5pdF91YXJ0ZGV2cworICoKKyAqIGNvcHkgdGhlIHNwZWNpZmllZCBwbGF0Zm9ybSBkYXRhIGFuZCBjb25maWd1cmF0aW9uIGludG8gb3VyIGNlbnRyYWwKKyAqIHNldCBvZiBkZXZpY2VzLCBiZWZvcmUgdGhlIGRhdGEgaXMgdGhyb3duIGF3YXkgYWZ0ZXIgdGhlIGluaXQgcHJvY2Vzcy4KKyAqCisgKiBUaGlzIGFsc28gZmlsbHMgaW4gdGhlIGFycmF5IHBhc3NlZCB0byB0aGUgc2VyaWFsIGRyaXZlciBmb3IgdGhlCisgKiBlYXJseSBpbml0aWFsaXNhdGlvbiBvZiB0aGUgY29uc29sZS4KKyovCisKK3ZvaWQgX19pbml0IHMzYzI0eHhfaW5pdF91YXJ0ZGV2cyhjaGFyICpuYW1lLAorCQkJCSAgc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXMgKnJlcywKKwkJCQkgIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRkZXY7CisJc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZncHRyID0gdWFydF9jZmdzOworCXN0cnVjdCBzM2MyNHh4X3VhcnRfcmVzb3VyY2VzICpyZXNwOworCWludCB1YXJ0OworCisJbWVtY3B5KGNmZ3B0ciwgY2ZnLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfdWFydGNmZykgKiBubyk7CisKKwlmb3IgKHVhcnQgPSAwOyB1YXJ0IDwgbm87IHVhcnQrKywgY2ZnKyssIGNmZ3B0cisrKSB7CisJCXBsYXRkZXYgPSBzM2MyNHh4X3VhcnRfc3JjW2NmZ3B0ci0+aHdwb3J0XTsKKworCQlyZXNwID0gcmVzICsgY2ZncHRyLT5od3BvcnQ7CisKKwkJczNjMjR4eF91YXJ0X2RldnNbdWFydF0gPSBwbGF0ZGV2OworCisJCXBsYXRkZXYtPm5hbWUgPSBuYW1lOworCQlwbGF0ZGV2LT5yZXNvdXJjZSA9IHJlc3AtPnJlc291cmNlczsKKwkJcGxhdGRldi0+bnVtX3Jlc291cmNlcyA9IHJlc3AtPm5yX3Jlc291cmNlczsKKworCQlwbGF0ZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IGNmZ3B0cjsKKwl9CisKKwlucl91YXJ0cyA9IG5vOworfQorCit2b2lkIF9faW5pdCBzM2MyNHh4X2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pCit7CisJaWYgKGNwdSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY3B1LT5pbml0X3VhcnRzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzM2MyNHh4X2luaXRfdWFydHM6IGNwdSBoYXMgbm8gdWFydCBpbml0XG4iKTsKKwl9IGVsc2UKKwkJKGNwdS0+aW5pdF91YXJ0cykoY2ZnLCBubyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHMzY19hcmNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLy8gZG8gdGhlIGNvcnJlY3QgaW5pdCBmb3IgY3B1CisKKwlpZiAoY3B1ID09IE5VTEwpCisJCXBhbmljKCJzM2NfYXJjaF9pbml0OiBOVUxMIGNwdVxuIik7CisKKwlyZXQgPSAoY3B1LT5pbml0KSgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKHMzYzI0eHhfdWFydF9kZXZzLCBucl91YXJ0cyk7CisJcmV0dXJuIHJldDsKK30KKworYXJjaF9pbml0Y2FsbChzM2NfYXJjaF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20tY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjL3B3bS1jbG9jay5jCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20tY2xvY2suYwpyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvcHdtLWNsb2NrLmMKaW5kZXggM2ZhZDY4YS4uYTMxODIxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS1jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL3B3bS1jbG9jay5jCkBAIC0xNCwyMCArMTQsMjAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy10aW1lci5oPgorI2luY2x1ZGUgPG1hY2gvcHdtLWNsb2NrLmg+CiAKIC8qIEVhY2ggb2YgdGhlIHRpbWVycyAwIHRocm91Z2ggNSBnbyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKICAqIGNsb2NrIHRyZWUsIHdpdGggdGhlIGlucHV0cyBkZXBlbmRpbmcgb24gdGhlIHRpbWVycy4KQEAgLTczLDExICs3MywxMyBAQAogICogdGNsayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLwogKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3B3bV9zY2FsZXJfZ2V0cmF0ZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgc3RydWN0IGNsayBjbGtfdGltZXJfc2NhbGVyW107CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19wd21fc2NhbGVyX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1bnNpZ25lZCBsb25nIHRjZmcwID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ0ZHMCk7CiAKLQlpZiAoY2xrLT5pZCA9PSAxKSB7CisJaWYgKGNsayA9PSAmY2xrX3RpbWVyX3NjYWxlclsxXSkgewogCQl0Y2ZnMCAmPSBTM0MyNDEwX1RDRkdfUFJFU0NBTEVSMV9NQVNLOwogCQl0Y2ZnMCA+Pj0gUzNDMjQxMF9UQ0ZHX1BSRVNDQUxFUjFfU0hJRlQ7CiAJfSBlbHNlIHsKQEAgLTg3LDE4ICs4OSw2MSBAQAogCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gKHRjZmcwICsgMSk7CiB9CiAKLS8qIFRPRE8gLSBhZGQgc2V0IHJhdGUgY2FsbHMuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfcHdtX3NjYWxlcl9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGRpdmlzb3IgPSBwYXJlbnRfcmF0ZSAvIHJhdGU7CisKKwlpZiAoZGl2aXNvciA+IDI1NikKKwkJZGl2aXNvciA9IDI1NjsKKwllbHNlIGlmIChkaXZpc29yIDwgMikKKwkJZGl2aXNvciA9IDI7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgLyBkaXZpc29yOworfQorCitzdGF0aWMgaW50IGNsa19wd21fc2NhbGVyX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcm91bmQgPSBjbGtfcHdtX3NjYWxlcl9yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisJdW5zaWduZWQgbG9uZyB0Y2ZnMDsKKwl1bnNpZ25lZCBsb25nIGRpdmlzb3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRpdmlzb3IgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gcm91bmQ7CisJZGl2aXNvci0tOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRjZmcwID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ0ZHMCk7CisKKwlpZiAoY2xrID09ICZjbGtfdGltZXJfc2NhbGVyWzFdKSB7CisJCXRjZmcwICY9IH5TM0MyNDEwX1RDRkdfUFJFU0NBTEVSMV9NQVNLOworCQl0Y2ZnMCB8PSBkaXZpc29yIDw8IFMzQzI0MTBfVENGR19QUkVTQ0FMRVIxX1NISUZUOworCX0gZWxzZSB7CisJCXRjZmcwICY9IH5TM0MyNDEwX1RDRkdfUFJFU0NBTEVSMF9NQVNLOworCQl0Y2ZnMCB8PSBkaXZpc29yOworCX0KKworCV9fcmF3X3dyaXRlbCh0Y2ZnMCwgUzNDMjQxMF9UQ0ZHMCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGNsa190aW1lcl9zY2FsZXJbXSA9IHsKIAlbMF0JPSB7CiAJCS5uYW1lCQk9ICJwd20tc2NhbGVyMCIsCiAJCS5pZAkJPSAtMSwKLQkJLmdldF9yYXRlCT0gY2xrX3B3bV9zY2FsZXJfZ2V0cmF0ZSwKKwkJLmdldF9yYXRlCT0gY2xrX3B3bV9zY2FsZXJfZ2V0X3JhdGUsCisJCS5zZXRfcmF0ZQk9IGNsa19wd21fc2NhbGVyX3NldF9yYXRlLAorCQkucm91bmRfcmF0ZQk9IGNsa19wd21fc2NhbGVyX3JvdW5kX3JhdGUsCiAJfSwKIAlbMV0JPSB7CiAJCS5uYW1lCQk9ICJwd20tc2NhbGVyMSIsCiAJCS5pZAkJPSAtMSwKLQkJLmdldF9yYXRlCT0gY2xrX3B3bV9zY2FsZXJfZ2V0cmF0ZSwKKwkJLmdldF9yYXRlCT0gY2xrX3B3bV9zY2FsZXJfZ2V0X3JhdGUsCisJCS5zZXRfcmF0ZQk9IGNsa19wd21fc2NhbGVyX3NldF9yYXRlLAorCQkucm91bmRfcmF0ZQk9IGNsa19wd21fc2NhbGVyX3JvdW5kX3JhdGUsCiAJfSwKIH07CiAKQEAgLTEyMywxMSArMTY4LDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGNsaywgc3RydWN0IHB3bV90ZGl2X2NsaywgY2xrKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8ICgxICsgdGNmZzEpOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfcHdtX3RkaXZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgdGNmZzEgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1RDRkcxKTsKQEAgLTEzNiw3ICsxNzYsNyBAQAogCXRjZmcxID4+PSBTM0MyNDEwX1RDRkcxX1NISUZUKGNsay0+aWQpOwogCXRjZmcxICY9IFMzQzI0MTBfVENGRzFfTVVYX01BU0s7CiAKLQlpZiAodGNmZzEgPT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSykKKwlpZiAocHdtX2NmZ19zcmNfaXNfdGNsayh0Y2ZnMSkpCiAJCWRpdmlzb3IgPSB0b190ZGl2KGNsayktPmRpdmlzb3I7CiAJZWxzZQogCQlkaXZpc29yID0gdGNmZ190b19kaXZpc29yKHRjZmcxKTsKQEAgLTE1Myw3ICsxOTMsOSBAQAogCXBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKIAlkaXZpc29yID0gcGFyZW50X3JhdGUgLyByYXRlOwogCi0JaWYgKGRpdmlzb3IgPD0gMikKKwlpZiAoZGl2aXNvciA8PSAxICYmIHB3bV90ZGl2X2hhc19kaXYxKCkpCisJCWRpdmlzb3IgPSAxOworCWVsc2UgaWYgKGRpdmlzb3IgPD0gMikKIAkJZGl2aXNvciA9IDI7CiAJZWxzZSBpZiAoZGl2aXNvciA8PSA0KQogCQlkaXZpc29yID0gNDsKQEAgLTE2NywyNSArMjA5LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3B3bV90ZGl2X2JpdHMoc3RydWN0IHB3bV90ZGl2X2NsayAqZGl2Y2xrKQogewotCXVuc2lnbmVkIGxvbmcgYml0czsKLQotCXN3aXRjaCAoZGl2Y2xrLT5kaXZpc29yKSB7Ci0JY2FzZSAyOgotCQliaXRzID0gUzNDMjQxMF9UQ0ZHMV9NVVhfRElWMjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQliaXRzID0gUzNDMjQxMF9UQ0ZHMV9NVVhfRElWNDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQliaXRzID0gUzNDMjQxMF9UQ0ZHMV9NVVhfRElWODsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQlkZWZhdWx0OgotCQliaXRzID0gUzNDMjQxMF9UQ0ZHMV9NVVhfRElWMTY7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBiaXRzOworCXJldHVybiBwd21fdGRpdl9kaXZfYml0cyhkaXZjbGstPmRpdmlzb3IpOwogfQogCiBzdGF0aWMgdm9pZCBjbGtfcHdtX3RkaXZfdXBkYXRlKHN0cnVjdCBwd21fdGRpdl9jbGsgKmRpdmNsaykKQEAgLTIyNiw3ICsyNTAsNyBAQAogCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBNVVggc2V0dGluZ3MgaWYgd2UgYXJlIGN1cnJlbnRseQogCSAqIHNlbGVjdGVkIGFzIHRoZSBjbG9jayBzb3VyY2UgZm9yIHRoaXMgY2xvY2suICovCiAKLQlpZiAodGNmZzEgIT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSykKKwlpZiAoIXB3bV9jZmdfc3JjX2lzX3RjbGsodGNmZzEpKQogCQljbGtfcHdtX3RkaXZfdXBkYXRlKGRpdmNsayk7CiAKIAlyZXR1cm4gMDsKQEAgLTMxMyw3ICszMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgc2hpZnQgPSBTM0MyNDEwX1RDRkcxX1NISUZUKGlkKTsKIAogCWlmIChwYXJlbnQgPT0gczNjMjR4eF9wd21jbGtfdGNsayhpZCkpCi0JCWJpdHMgPSBTM0MyNDEwX1RDRkcxX01VWF9UQ0xLIDw8IHNoaWZ0OworCQliaXRzID0gUzNDX1RDRkcxX01VWF9UQ0xLIDw8IHNoaWZ0OwogCWVsc2UgaWYgKHBhcmVudCA9PSBzM2MyNHh4X3B3bWNsa190ZGl2KGlkKSkKIAkJYml0cyA9IGNsa19wd21fdGRpdl9iaXRzKHRvX3RkaXYocGFyZW50KSkgPDwgc2hpZnQ7CiAJZWxzZQpAQCAtMzc1LDcgKzM5OSw3IEBACiAJdGNmZzEgPj49IFMzQzI0MTBfVENGRzFfU0hJRlQoaWQpOwogCXRjZmcxICY9IFMzQzI0MTBfVENGRzFfTVVYX01BU0s7CiAKLQlpZiAodGNmZzEgPT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSykKKwlpZiAocHdtX2NmZ19zcmNfaXNfdGNsayh0Y2ZnMSkpCiAJCXBhcmVudCA9IHMzYzI0eHhfcHdtY2xrX3RjbGsoaWQpOwogCWVsc2UKIAkJcGFyZW50ID0gczNjMjR4eF9wd21jbGtfdGRpdihpZCk7CkBAIC0zODMsNyArNDA3LDE2IEBACiAJcmV0dXJuIGNsa19zZXRfcGFyZW50KHB3bSwgcGFyZW50KTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgczNjMjR4eF9wd21jbGtfaW5pdCh2b2lkKQorLyoqCisgKiBzM2NfcHdtY2xrX2luaXQoKSAtIGluaXRpYWxpc2UgcHdtIGNsb2NrcworICoKKyAqIEluaXRpYWxpc2UgYW5kIHJlZ2lzdGVyIHRoZSBjbG9ja3Mgd2hpY2ggcHJvdmlkZSB0aGUgaW5wdXRzIGZvciB0aGUKKyAqIHB3bSB0aW1lciBibG9ja3MuCisgKgorICogTm90ZSwgdGhpcyBjYWxsIGlzIHJlcXVpcmVkIGJ5IHRoZSB0aW1lIGNvcmUsIHNvIG11c3QgYmUgY2FsbGVkIGFmdGVyCisgKiB0aGUgYmFzZSBjbG9ja3MgYXJlIGFkZGVkIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBpbml0Y2FsbHMgYXJlIHJ1bi4KKyAqLworX19pbml0IHZvaWQgczNjX3B3bWNsa19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGNsayAqY2xrX3RpbWVyczsKIAl1bnNpZ25lZCBpbnQgY2xrOwpAQCAtMzkyLDcgKzQyNSw3IEBACiAJY2xrX3RpbWVycyA9IGNsa19nZXQoTlVMTCwgInRpbWVycyIpOwogCWlmIChJU19FUlIoY2xrX3RpbWVycykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcGFyZW50IGNsb2NrXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm47CiAJfQogCiAJZm9yIChjbGsgPSAwOyBjbGsgPCBBUlJBWV9TSVpFKGNsa190aW1lcl9zY2FsZXIpOyBjbGsrKykgewpAQCAtNDAwLDcgKzQzMyw3IEBACiAJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa190aW1lcl9zY2FsZXJbY2xrXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGFkZGluZyBwd20gc2NhbGVyJWQgY2xvY2tcbiIsIGNsayk7Ci0JCQlnb3RvIGVycjsKKwkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtNDA4LDcgKzQ0MSw3IEBACiAJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa190aW1lcl90Y2xrW2Nsa10pOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBhZGRpbmcgcHd3IHRjbGslZFxuIiwgY2xrKTsKLQkJCWdvdG8gZXJyOworCQkJcmV0dXJuOwogCQl9CiAJfQogCkBAIC00MTYsNyArNDQ5LDcgQEAKIAkJcmV0ID0gY2xrX3B3bV90ZGl2X3JlZ2lzdGVyKGNsayk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGFkZGluZyBwd20lZCB0ZGl2IGNsb2NrXG4iLCBjbGspOwotCQkJZ290byBlcnI7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAKQEAgLTQyNCwxNCArNDU3LDcgQEAKIAkJcmV0ID0gY2xrX3B3bV90aW5fcmVnaXN0ZXIoJmNsa190aW5bY2xrXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGFkZGluZyBwd20lZCB0aW4gY2xvY2tcbiIsIGNsayk7Ci0JCQlnb3RvIGVycjsKKwkJCXJldHVybjsKIAkJfQogCX0KLQotCXJldHVybiAwOwotCi0gZXJyOgotCXJldHVybiByZXQ7CiB9Ci0KLWFyY2hfaW5pdGNhbGwoczNjMjR4eF9wd21jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvdGltZS5jCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC90aW1lLmMKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjL3RpbWUuYwppbmRleCBjNTE5MTYyLi4zYjI3YjI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL3RpbWUuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KQEAgLTM2LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvdGljay5oPgogCiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC00Myw2ICs0NSwxMCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfc3RhcnR2YWw7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl91c2VjX3RpY2tzOwogCisjaWZuZGVmIFRJQ0tfTUFYCisjZGVmaW5lIFRJQ0tfTUFYICgweGZmZmYpCisjZW5kaWYKKwogI2RlZmluZSBUSU1FUl9VU0VDX1NISUZUIDE2CiAKIC8qIHdlIHVzZSB0aGUgc2hpZnRlZCBhcml0aG1ldGljIHRvIHdvcmsgb3V0IHRoZSByYXRpbyBvZiB0aW1lciB0aWNrcwpAQCAtOTEsMjMgKzk3LDE5IEBACiAgKiBJUlFzIGFyZSBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcgaGVyZSBmcm9tIGRvX2dldHRpbWVvZmRheSgpCiAgKi8KIAotI2RlZmluZSBTUkNQTkRfVElNRVI0ICgxPDwoSVJRX1RJTUVSNCAtIElSUV9FSU5UMCkpCi0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0MTBfZ2V0dGltZW9mZnNldCAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHRkb25lOwotCXVuc2lnbmVkIGxvbmcgaXJxcGVuZDsKIAl1bnNpZ25lZCBsb25nIHR2YWw7CiAKIAkvKiB3b3JrIG91dCBob3cgbWFueSB0aWNrcyBoYXZlIGdvbmUgc2luY2UgbGFzdCB0aW1lciBpbnRlcnJ1cHQgKi8KIAotICAgICAgICB0dmFsID0gIF9fcmF3X3JlYWRsKFMzQzI0MTBfVENOVE8oNCkpOworCXR2YWwgPSAgX19yYXdfcmVhZGwoUzNDMjQxMF9UQ05UTyg0KSk7CiAJdGRvbmUgPSB0aW1lcl9zdGFydHZhbCAtIHR2YWw7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gaW50ZXJydXB0IHBlbmRpbmcgKi8KIAotCWlycXBlbmQgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1NSQ1BORCk7Ci0JaWYgKGlycXBlbmQgJiBTUkNQTkRfVElNRVI0KSB7CisJaWYgKHMzYzI0eHhfb3N0aW1lcl9wZW5kaW5nKCkpIHsKIAkJLyogcmUtcmVhZCB0aGUgdGltZXIsIGFuZCB0cnkgYW5kIGZpeCB1cCBmb3IgdGhlIG1pc3NlZAogCQkgKiBpbnRlcnJ1cHQuIE5vdGUsIHRoZSBpbnRlcnJ1cHQgbWF5IGdvIG9mZiBiZWZvcmUgdGhlCiAJCSAqIHRpbWVyIGhhcyByZS1sb2FkZWQgZnJvbSB3cmFwcGluZy4KQEAgLTE0NCw3ICsxNDYsMTEgQEAKIAltYWNoaW5lX2lzX2Jhc3QoKQl8fCBcCiAJbWFjaGluZV9pc192cjEwMDAoKQl8fCBcCiAJbWFjaGluZV9pc19hbnViaXMoKQl8fCBcCi0JbWFjaGluZV9pc19vc2lyaXMoKSApCisJbWFjaGluZV9pc19vc2lyaXMoKSkKKworc3RhdGljIHN0cnVjdCBjbGsgKnRpbjsKK3N0YXRpYyBzdHJ1Y3QgY2xrICp0ZGl2Oworc3RhdGljIHN0cnVjdCBjbGsgKnRpbWVyY2xrOwogCiAvKgogICogU2V0IHVwIHRpbWVyIGludGVycnVwdCwgYW5kIHJldHVybiB0aGUgY3VycmVudCB0aW1lIGluIHNlY29uZHMuCkBAIC0xNTksMTMgKzE2NSw3IEBACiAJdW5zaWduZWQgbG9uZyB0Y2ZnMTsKIAl1bnNpZ25lZCBsb25nIHRjZmcwOwogCi0JdGNudCA9IDB4ZmZmZjsgIC8qIGRlZmF1bHQgdmFsdWUgZm9yIHRjbnQgKi8KLQotCS8qIHJlYWQgdGhlIGN1cnJlbnQgdGltZXIgY29uZmlndXJhdGlvbiBiaXRzICovCi0KLQl0Y29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ09OKTsKLQl0Y2ZnMSA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVENGRzEpOwotCXRjZmcwID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ0ZHMCk7CisJdGNudCA9IFRJQ0tfTUFYOyAgLyogZGVmYXVsdCB2YWx1ZSBmb3IgdGNudCAqLwogCiAJLyogY29uZmlndXJlIHRoZSBzeXN0ZW0gZm9yIHdoaWNoZXZlciBtYWNoaW5lIGlzIGluIHVzZSAqLwogCkBAIC0xNzQsMTEgKzE3NCwxMyBAQAogCQl0aW1lcl91c2VjX3RpY2tzID0gdGltZXJfbWFza191c2VjX3RpY2tzKDEsIDEyMDAwMDAwKTsKIAkJdGNudCA9IDEyMDAwMDAwIC8gSFo7CiAKKwkJdGNmZzEgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1RDRkcxKTsKIAkJdGNmZzEgJj0gflMzQzI0MTBfVENGRzFfTVVYNF9NQVNLOwogCQl0Y2ZnMSB8PSBTM0MyNDEwX1RDRkcxX01VWDRfVENMSzE7CisJCV9fcmF3X3dyaXRlbCh0Y2ZnMSwgUzNDMjQxMF9UQ0ZHMSk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBwY2xrOwotCQlzdHJ1Y3QgY2xrICpjbGs7CisJCXN0cnVjdCBjbGsgKnRzY2FsZXI7CiAKIAkJLyogZm9yIHRoZSBoMTk0MCAoYW5kIG90aGVycyksIHdlIHVzZSB0aGUgcGNsayBmcm9tIHRoZSBjb3JlCiAJCSAqIHRvIGdlbmVyYXRlIHRoZSB0aW1lciB2YWx1ZXMuIHNpbmNlIHZhbHVlcyBhcm91bmQgNTAgdG8KQEAgLTE4OSwzOCArMTkxLDM0IEBACiAJCSAqICg4LjQ1IHRpY2tzIHBlciB1c2VjKQogCQkgKi8KIAotCQkvKiB0aGlzIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBvdGhlciB0aW1lciBjYW4gYmUgZm91bmQgKi8KLQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJ0aW1lcnMiKTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcGFuaWMoImZhaWxlZCB0byBnZXQgY2xvY2sgZm9yIHN5c3RlbSB0aW1lciIpOwotCi0JCWNsa19lbmFibGUoY2xrKTsKLQotCQlwY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CisJCXBjbGsgPSBjbGtfZ2V0X3JhdGUodGltZXJjbGspOwogCiAJCS8qIGNvbmZpZ3VyZSBjbG9jayB0aWNrICovCiAKIAkJdGltZXJfdXNlY190aWNrcyA9IHRpbWVyX21hc2tfdXNlY190aWNrcyg2LCBwY2xrKTsKIAotCQl0Y2ZnMSAmPSB+UzNDMjQxMF9UQ0ZHMV9NVVg0X01BU0s7Ci0JCXRjZmcxIHw9IFMzQzI0MTBfVENGRzFfTVVYNF9ESVYyOworCQl0c2NhbGVyID0gY2xrX2dldF9wYXJlbnQodGRpdik7CiAKLQkJdGNmZzAgJj0gflMzQzI0MTBfVENGR19QUkVTQ0FMRVIxX01BU0s7Ci0JCXRjZmcwIHw9ICgoNiAtIDEpIC8gMikgPDwgUzNDMjQxMF9UQ0ZHX1BSRVNDQUxFUjFfU0hJRlQ7CisJCWNsa19zZXRfcmF0ZSh0c2NhbGVyLCBwY2xrIC8gMyk7CisJCWNsa19zZXRfcmF0ZSh0ZGl2LCBwY2xrIC8gNik7CisJCWNsa19zZXRfcGFyZW50KHRpbiwgdGRpdik7CiAKLQkJdGNudCA9IChwY2xrIC8gNikgLyBIWjsKKwkJdGNudCA9IGNsa19nZXRfcmF0ZSh0aW4pIC8gSFo7CiAJfQogCisJdGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVENPTik7CisJdGNmZzAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX1RDRkcwKTsKKwl0Y2ZnMSA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVENGRzEpOworCiAJLyogdGltZXJzIHJlbG9hZCBhZnRlciBjb3VudGluZyB6ZXJvLCBzbyByZWR1Y2UgdGhlIGNvdW50IGJ5IDEgKi8KIAogCXRjbnQtLTsKIAotCXByaW50aygidGltZXIgdGNvbj0lMDhseCwgdGNudCAlMDRseCwgdGNmZyAlMDhseCwlMDhseCwgdXNlYyAlMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAidGltZXIgdGNvbj0lMDhseCwgdGNudCAlMDRseCwgdGNmZyAlMDhseCwlMDhseCwgdXNlYyAlMDhseFxuIiwKIAkgICAgICAgdGNvbiwgdGNudCwgdGNmZzAsIHRjZmcxLCB0aW1lcl91c2VjX3RpY2tzKTsKIAogCS8qIGNoZWNrIHRvIHNlZSBpZiB0aW1lciBpcyB3aXRoaW4gMTZiaXQgcmFuZ2UuLi4gKi8KLQlpZiAodGNudCA+IDB4ZmZmZikgeworCWlmICh0Y250ID4gVElDS19NQVgpIHsKIAkJcGFuaWMoInNldHVwX3RpbWVyOiBIWiBpcyB0b28gc21hbGwsIGNhbm5vdCBjb25maWd1cmUgdGltZXIhIik7CiAJCXJldHVybjsKIAl9CkBAIC0yNDcsOCArMjQ1LDM1IEBACiAJX19yYXdfd3JpdGVsKHRjb24sIFMzQzI0MTBfVENPTik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzM2MyNDEwX3RpbWVyX2luaXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgczNjMjQxMF90aW1lcl9yZXNvdXJjZXModm9pZCkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtcGRldjsKKworCXRtcGRldi5kZXYuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlOworCXRtcGRldi5pZCA9IDQ7CisKKwl0aW1lcmNsayA9IGNsa19nZXQoTlVMTCwgInRpbWVycyIpOworCWlmIChJU19FUlIodGltZXJjbGspKQorCQlwYW5pYygiZmFpbGVkIHRvIGdldCBjbG9jayBmb3Igc3lzdGVtIHRpbWVyIik7CisKKwljbGtfZW5hYmxlKHRpbWVyY2xrKTsKKworCWlmICghdXNlX3RjbGsxXzEyKCkpIHsKKwkJdGluID0gY2xrX2dldCgmdG1wZGV2LmRldiwgInB3bS10aW4iKTsKKwkJaWYgKElTX0VSUih0aW4pKQorCQkJcGFuaWMoImZhaWxlZCB0byBnZXQgcHdtLXRpbiBjbG9jayBmb3Igc3lzdGVtIHRpbWVyIik7CisKKwkJdGRpdiA9IGNsa19nZXQoJnRtcGRldi5kZXYsICJwd20tdGRpdiIpOworCQlpZiAoSVNfRVJSKHRkaXYpKQorCQkJcGFuaWMoImZhaWxlZCB0byBnZXQgcHdtLXRkaXYgY2xvY2sgZm9yIHN5c3RlbSB0aW1lciIpOworCX0KKworCWNsa19lbmFibGUodGluKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHMzYzI0MTBfdGltZXJfaW5pdCh2b2lkKQoreworCXMzYzI0MTBfdGltZXJfcmVzb3VyY2VzKCk7CiAJczNjMjQxMF90aW1lcl9zZXR1cCgpOwogCXNldHVwX2lycShJUlFfVElNRVI0LCAmczNjMjQxMF90aW1lcl9pcnEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZwppbmRleCAwYWYzODcyLi4yYzhhMmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvS2NvbmZpZwpAQCAtNiw4ICs2LDggQEAKIAogY29uZmlnIFBMQVRfUzNDMjRYWAogCWJvb2wKLQlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAotCWRlZmF1bHQgeSBpZiBBUkNIX1MzQzI0MTAKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCB8fCBBUkNIX1MzQzI0QTAKKwlkZWZhdWx0IHkKIAlzZWxlY3QgTk9fSU9QT1JUCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscApAQCAtMTUsNiArMTUsMTkgQEAKIAogaWYgUExBVF9TM0MyNFhYCiAKKyMgY29kZSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGEgbnVtYmVyIG9mIHRoZSBzM2MyNHh4IGltcGxlbWVudGF0aW9ucworCitjb25maWcgUzNDMjQxMF9DTE9DSworCWJvb2wKKwloZWxwCisJICBDbG9jayBjb2RlIGZvciB0aGUgUzNDMjQxMCwgYW5kIHNpbWlsYXIgcHJvY2Vzc29ycyB3aGljaAorCSAgaXMgY3VycmVudGx5IGluY2x1ZGVzIHRoZSBTM0MyNDEwLCBTM0MyNDQwLCBTM0MyNDQyLgorCitjb25maWcgUzNDMjRYWF9EQ0xLCisJYm9vbAorCWhlbHAKKwkgIENsb2NrIGNvZGUgZm9yIHN1cHBvcnRpbmcgRENMSy9DTEtPVVQgb24gUzNDMjRYWCBhcmNoaXRlY3R1cmVzCisKIGNvbmZpZyBDUFVfUzNDMjQ0WAogCWJvb2wKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCAmJiAoQ1BVX1MzQzI0NDAgfHwgQ1BVX1MzQzI0NDIpCkBAIC0yOCw2ICs0MSwyNyBAQAogCSAgU3VwcG9ydCBmb3IgZXhwb3J0aW5nIHRoZSBQV00gdGltZXIgYmxvY2tzIHZpYSB0aGUgcHdtIGRldmljZQogCSAgc3lzdGVtLgogCisKKyMgZ3BpbyBjb25maWd1cmF0aW9ucworCitjb25maWcgUzNDMjRYWF9HUElPX0VYVFJBCisJaW50CisJZGVmYXVsdCAxMjggaWYgUzNDMjRYWF9HUElPX0VYVFJBMTI4CisJZGVmYXVsdCA2NCBpZiBTM0MyNFhYX0dQSU9fRVhUUkE2NAorCWRlZmF1bHQgMAorCitjb25maWcgUzNDMjRYWF9HUElPX0VYVFJBNjQKKwlib29sCisJaGVscAorCSAgQWRkIGFuIGV4dHJhIDY0IGdwaW8gbnVtYmVycyB0byB0aGUgYXZhaWxhYmxlIEdQSU8gcG9vbC4gVGhpcyBpcworCSAgYXZhaWxhYmxlIGZvciBib2FyZHMgdGhhdCBuZWVkIGV4dHJhIGdwaW9zIGZvciBleHRlcm5hbCBkZXZpY2VzLgorCitjb25maWcgUzNDMjRYWF9HUElPX0VYVFJBMTI4CisJYm9vbAorCWhlbHAKKwkgIEFkZCBhbiBleHRyYSAxMjggZ3BpbyBudW1iZXJzIHRvIHRoZSBhdmFpbGFibGUgR1BJTyBwb29sLiBUaGlzIGlzCisJICBhdmFpbGFibGUgZm9yIGJvYXJkcyB0aGF0IG5lZWQgZXh0cmEgZ3Bpb3MgZm9yIGV4dGVybmFsIGRldmljZXMuCisKIGNvbmZpZyBQTV9TSU1URUMKIAlib29sCiAJaGVscApAQCAtNDksNiArODMsMjkgQEAKIAkgIEVuYWJsZSBkZWJ1Z2dpbmcgb3V0cHV0IGZvciB0aGUgRE1BIGNvZGUuIFRoaXMgb3B0aW9uIHNlbmRzIGluZm8KIAkgIHRvIHRoZSBrZXJuZWwgbG9nLCBhdCBwcmlvcml0eSBLRVJOX0RFQlVHLgogCitjb25maWcgUzNDMjRYWF9BREMKKwlib29sICJBREMgY29tbW9uIGRyaXZlciBzdXBwb3J0IgorCWhlbHAKKwkgIENvcmUgc3VwcG9ydCBmb3IgdGhlIEFEQyBibG9jayBmb3VuZCBpbiB0aGUgUzNDMjRYWCBTb0Mgc3lzdGVtcworCSAgZm9yIGRyaXZlcnMgc3VjaCBhcyB0aGUgdG91Y2hzY3JlZW4gYW5kIGh3bW9uIHRvIHVzZSB0byBzaGFyZQorCSAgdGhpcyByZXNvdXJjZS4KKworIyBTUEkgZGVmYXVsdCBwaW4gY29uZmlndXJhdGlvbiBjb2RlCisKK2NvbmZpZyBTM0MyNFhYX1NQSV9CVVMwX0dQRTExX0dQRTEyX0dQRTEzCisJYm9vbAorCWhlbHAKKwkgIFNQSSBHUElPIGNvbmZpZ3VyYXRpb24gY29kZSBmb3IgQlVTMCB3aGVuIGNvbm5lY3RlZCB0bworCSAgR1BFMTEsIEdQRTEyIGFuZCBHUEUxMy4KKworY29uZmlnIFMzQzI0WFhfU1BJX0JVUzFfR1BHNV9HUEc2X0dQRzcKKwlib29sCisJaGVscAorCSAgU1BJIEdQSU8gY29uZmlndXJhdGlvbiBjb2RlIGZvciBCVVMgMSB3aGVuIGNvbm5lY3RlZCB0bworCSAgR1BHNSwgR1BHNiBhbmQgR1BHNy4KKworIyBjb21tb24gY29kZSBmb3IgczNjMjR4eCBiYXNlZCBtYWNoaW5lcywgc3VjaCBhcyB0aGUgU01ES3MuCisKIGNvbmZpZyBNQUNIX1NNREsKIAlib29sCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L01ha2VmaWxlCmluZGV4IGQ4Mjc2N2IuLjFlMDc2N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvTWFrZWZpbGUKQEAgLTE3LDkgKzE3LDggQEAKIG9iai15CQkJCSs9IGRldnMubwogb2JqLXkJCQkJKz0gZ3Bpby5vCiBvYmoteQkJCQkrPSBncGlvbGliLm8KLW9iai15CQkJCSs9IHRpbWUubwogb2JqLXkJCQkJKz0gY2xvY2subwotb2JqLXkJCQkJKz0gcHdtLWNsb2NrLm8KK29iai0kKENPTkZJR19TM0MyNFhYX0RDTEspCSs9IGNsb2NrLWRjbGsubwogCiAjIEFyY2hpdGVjdHVyZSBkZXBlbmRhbnQgYnVpbGRzCiAKQEAgLTMwLDUgKzI5LDE4IEBACiBvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vCiBvYmotJChDT05GSUdfUE0pCQkrPSBzbGVlcC5vCiBvYmotJChDT05GSUdfSEFWRV9QV00pCQkrPSBwd20ubworb2JqLSQoQ09ORklHX1MzQzI0MTBfQ0xPQ0spCSs9IHMzYzI0MTAtY2xvY2subwogb2JqLSQoQ09ORklHX1MzQzI0MTBfRE1BKQkrPSBkbWEubworb2JqLSQoQ09ORklHX1MzQzI0WFhfQURDKQkrPSBhZGMubworCisjIGRldmljZSBzcGVjaWZpYyBzZXR1cCBhbmQvb3IgaW5pdGlhbGlzYXRpb24KK29iai0kKENPTkZJR19BUkNIX1MzQzI0MTApCSs9IHNldHVwLWkyYy5vCisKKyMgU1BJIGdwaW8gY2VudHJhbCBHUElPIGZ1bmN0aW9ucworCitvYmotJChDT05GSUdfUzNDMjRYWF9TUElfQlVTMF9HUEUxMV9HUEUxMl9HUEUxMykgKz0gc3BpLWJ1czAtZ3BlMTFfMTJfMTMubworb2JqLSQoQ09ORklHX1MzQzI0WFhfU1BJX0JVUzFfR1BHNV9HUEc2X0dQRzcpICAgICs9IHNwaS1idXMxLWdwZzVfNl83Lm8KKworIyBtYWNoaW5lIGNvbW1vbiBzdXBwb3J0CisKIG9iai0kKENPTkZJR19NQUNIX1NNREspCQkrPSBjb21tb24tc21kay5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvYWRjLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1Yzc2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9hZGMuYwpAQCAtMCwwICsxLDM3MiBAQAorLyogYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2FkYy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4sIDxiZW4tbGludXhAZmx1ZmYub3JnPgorICoKKyAqIFMzQzI0WFggQURDIGRldmljZSBjb3JlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLWFkYy5oPgorI2luY2x1ZGUgPHBsYXQvYWRjLmg+CisKKy8qIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIHRvIGNvbnRyb2wgdGhlIHVzYWdlIG9mIHRoZSBBREMgYmxvY2sgYmV0d2VlbgorICogdGhlIHRvdWNoc2NyZWVuIGFuZCBhbnkgb3RoZXIgZHJpdmVycyB0aGF0IG1heSBuZWVkIHRvIHVzZSBpdCwgc3VjaCBhcworICogdGhlIGh3bW9uIGRyaXZlci4KKyAqCisgKiBQcmlvcml0eSB3aWxsIGJlIGdpdmVuIHRvIHRoZSB0b3VjaHNjcmVlbiBkcml2ZXIsIGJ1dCBhcyB0aGlzIGl0c2VsZiBpcworICogcmF0ZSBsaW1pdGVkIGl0IHNob3VsZCBub3Qgc3RhcnZlIG90aGVyIHJlcXVlc3RzIHdoaWNoIGFyZSBwcm9jZXNzZWQgaW4KKyAqIG9yZGVyIHRoYXQgdGhleSBhcmUgcmVjZWl2ZWQuCisgKgorICogRWFjaCB1c2VyIHJlZ2lzdGVycyB0byBnZXQgYSBjbGllbnQgYmxvY2sgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyBpdAorICogYW5kIHN0b3JlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25zIHRvIGNhbGxiYWNrIHdoZW4KKyAqIGFjdGlvbiBpcyByZXF1aXJlZC4KKyAqLworCitzdHJ1Y3QgczNjX2FkY19jbGllbnQgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGxpc3RfaGVhZAkgcGVuZDsKKworCXVuc2lnbmVkIGludAkJIG5yX3NhbXBsZXM7CisJdW5zaWduZWQgY2hhcgkJIGlzX3RzOworCXVuc2lnbmVkIGNoYXIJCSBjaGFubmVsOworCisJdm9pZAkoKnNlbGVjdF9jYikodW5zaWduZWQgc2VsZWN0ZWQpOworCXZvaWQJKCpjb252ZXJ0X2NiKSh1bnNpZ25lZCB2YWwxLCB1bnNpZ25lZCB2YWwyKTsKK307CisKK3N0cnVjdCBhZGNfZGV2aWNlIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKm93bmVyOworCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHMzY19hZGNfY2xpZW50CSpjdXI7CisJc3RydWN0IHMzY19hZGNfY2xpZW50CSp0c19wZW5kOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisKKwl1bnNpZ25lZCBpbnQJCSBwcmVzY2FsZTsKKworCWludAkJCSBpcnE7Cit9OworCitzdGF0aWMgc3RydWN0IGFkY19kZXZpY2UgKmFkY19kZXY7CisKK3N0YXRpYyBMSVNUX0hFQUQoYWRjX3BlbmRpbmcpOworCisjZGVmaW5lIGFkY19kYmcoX2FkYywgbXNnLi4uKSBkZXZfZGJnKCYoX2FkYyktPnBkZXYtPmRldiwgbXNnKQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX2FkY19jb252ZXJ0KHN0cnVjdCBhZGNfZGV2aWNlICphZGMpCit7CisJdW5zaWduZWQgY29uID0gcmVhZGwoYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOworCisJY29uIHw9IFMzQzI0MTBfQURDQ09OX0VOQUJMRV9TVEFSVDsKKwl3cml0ZWwoY29uLCBhZGMtPnJlZ3MgKyBTM0MyNDEwX0FEQ0NPTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfYWRjX3NlbGVjdChzdHJ1Y3QgYWRjX2RldmljZSAqYWRjLAorCQkJCSAgc3RydWN0IHMzY19hZGNfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgY29uID0gcmVhZGwoYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOworCisJY2xpZW50LT5zZWxlY3RfY2IoMSk7CisKKwljb24gJj0gflMzQzI0MTBfQURDQ09OX01VWE1BU0s7CisJY29uICY9IH5TM0MyNDEwX0FEQ0NPTl9TVERCTTsKKwljb24gJj0gflMzQzI0MTBfQURDQ09OX1NUQVJUTUFTSzsKKworCWlmICghY2xpZW50LT5pc190cykKKwkJY29uIHw9IFMzQzI0MTBfQURDQ09OX1NFTE1VWChjbGllbnQtPmNoYW5uZWwpOworCisJd3JpdGVsKGNvbiwgYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOworfQorCitzdGF0aWMgdm9pZCBzM2NfYWRjX2RiZ3Nob3coc3RydWN0IGFkY19kZXZpY2UgKmFkYykKK3sKKwlhZGNfZGJnKGFkYywgIkNPTj0lMDh4LCBUU0M9JTA4eCwgRExZPSUwOHhcbiIsCisJCXJlYWRsKGFkYy0+cmVncyArIFMzQzI0MTBfQURDQ09OKSwKKwkJcmVhZGwoYWRjLT5yZWdzICsgUzNDMjQxMF9BRENUU0MpLAorCQlyZWFkbChhZGMtPnJlZ3MgKyBTM0MyNDEwX0FEQ0RMWSkpOworfQorCit2b2lkIHMzY19hZGNfdHJ5KHN0cnVjdCBhZGNfZGV2aWNlICphZGMpCit7CisJc3RydWN0IHMzY19hZGNfY2xpZW50ICpuZXh0ID0gYWRjLT50c19wZW5kOworCisJaWYgKCFuZXh0ICYmICFsaXN0X2VtcHR5KCZhZGNfcGVuZGluZykpIHsKKwkJbmV4dCA9IGxpc3RfZmlyc3RfZW50cnkoJmFkY19wZW5kaW5nLAorCQkJCQlzdHJ1Y3QgczNjX2FkY19jbGllbnQsIHBlbmQpOworCQlsaXN0X2RlbCgmbmV4dC0+cGVuZCk7CisJfSBlbHNlCisJCWFkYy0+dHNfcGVuZCA9IE5VTEw7CisKKwlpZiAobmV4dCkgeworCQlhZGNfZGJnKGFkYywgIm5ldyBjbGllbnQgaXMgJXBcbiIsIG5leHQpOworCQlhZGMtPmN1ciA9IG5leHQ7CisJCXMzY19hZGNfc2VsZWN0KGFkYywgbmV4dCk7CisJCXMzY19hZGNfY29udmVydChhZGMpOworCQlzM2NfYWRjX2RiZ3Nob3coYWRjKTsKKwl9Cit9CisKK2ludCBzM2NfYWRjX3N0YXJ0KHN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50LAorCQkgIHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgbnJfc2FtcGxlcykKK3sKKwlzdHJ1Y3QgYWRjX2RldmljZSAqYWRjID0gYWRjX2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhZGMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGZpbmQgYWRjXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbGllbnQtPmlzX3RzICYmIGFkYy0+dHNfcGVuZCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbGllbnQtPmNoYW5uZWwgPSBjaGFubmVsOworCWNsaWVudC0+bnJfc2FtcGxlcyA9IG5yX3NhbXBsZXM7CisKKwlpZiAoY2xpZW50LT5pc190cykKKwkJYWRjLT50c19wZW5kID0gY2xpZW50OworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5wZW5kLCAmYWRjX3BlbmRpbmcpOworCisJaWYgKCFhZGMtPmN1cikKKwkJczNjX2FkY190cnkoYWRjKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHMzY19hZGNfc3RhcnQpOworCitzdGF0aWMgdm9pZCBzM2NfYWRjX2RlZmF1bHRfc2VsZWN0KHVuc2lnbmVkIHNlbGVjdCkKK3sKK30KKworc3RydWN0IHMzY19hZGNfY2xpZW50ICpzM2NfYWRjX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCXZvaWQgKCpzZWxlY3QpKHVuc2lnbmVkIGludCBzZWxlY3RlZCksCisJCQkJCXZvaWQgKCpjb252KSh1bnNpZ25lZCBkMCwgdW5zaWduZWQgZDEpLAorCQkJCQl1bnNpZ25lZCBpbnQgaXNfdHMpCit7CisJc3RydWN0IHMzY19hZGNfY2xpZW50ICpjbGllbnQ7CisKKwlXQVJOX09OKCFwZGV2KTsKKwlXQVJOX09OKCFjb252KTsKKworCWlmICghc2VsZWN0KQorCQlzZWxlY3QgPSBzM2NfYWRjX2RlZmF1bHRfc2VsZWN0OworCisJaWYgKCFjb252IHx8ICFwZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzM2NfYWRjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbW9yeSBmb3IgYWRjIGNsaWVudFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWNsaWVudC0+cGRldiA9IHBkZXY7CisJY2xpZW50LT5pc190cyA9IGlzX3RzOworCWNsaWVudC0+c2VsZWN0X2NiID0gc2VsZWN0OworCWNsaWVudC0+Y29udmVydF9jYiA9IGNvbnY7CisKKwlyZXR1cm4gY2xpZW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwoczNjX2FkY19yZWdpc3Rlcik7CisKK3ZvaWQgczNjX2FkY19yZWxlYXNlKHN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50KQoreworCS8qIFdlIHNob3VsZCByZWFsbHkgY2hlY2sgdGhhdCBub3RoaW5nIGlzIGluIHByb2dyZXNzLiAqLworCWtmcmVlKGNsaWVudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzM2NfYWRjX3JlbGVhc2UpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgczNjX2FkY19pcnEoaW50IGlycSwgdm9pZCAqcHcpCit7CisJc3RydWN0IGFkY19kZXZpY2UgKmFkYyA9IHB3OworCXN0cnVjdCBzM2NfYWRjX2NsaWVudCAqY2xpZW50ID0gYWRjLT5jdXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBkYXRhMCwgZGF0YTE7CisKKwlpZiAoIWNsaWVudCkgeworCQlkZXZfd2FybigmYWRjLT5wZGV2LT5kZXYsICIlczogbm8gYWRjIHBlbmRpbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWRhdGEwID0gcmVhZGwoYWRjLT5yZWdzICsgUzNDMjQxMF9BRENEQVQwKTsKKwlkYXRhMSA9IHJlYWRsKGFkYy0+cmVncyArIFMzQzI0MTBfQURDREFUMSk7CisJYWRjX2RiZyhhZGMsICJyZWFkICVkOiAweCUwNHgsIDB4JTA0eFxuIiwgY2xpZW50LT5ucl9zYW1wbGVzLCBkYXRhMCwgZGF0YTEpOworCisJKGNsaWVudC0+Y29udmVydF9jYikoZGF0YTAgJiAweDNmZiwgZGF0YTEgJiAweDNmZik7CisKKwlpZiAoLS1jbGllbnQtPm5yX3NhbXBsZXMgPiAwKSB7CisJCS8qIGZpcmUgYW5vdGhlciBjb252ZXJzaW9uIGZvciB0aGlzICovCisKKwkJY2xpZW50LT5zZWxlY3RfY2IoMSk7CisJCXMzY19hZGNfY29udmVydChhZGMpOworCX0gZWxzZSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJKGNsaWVudC0+c2VsZWN0X2NiKSgwKTsKKwkJYWRjLT5jdXIgPSBOVUxMOworCisJCXMzY19hZGNfdHJ5KGFkYyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgczNjX2FkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFkY19kZXZpY2UgKmFkYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJaW50IHJldDsKKworCWFkYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGNfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGFkY19kZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZGMtPnBkZXYgPSBwZGV2OworCWFkYy0+cHJlc2NhbGUgPSBTM0MyNDEwX0FEQ0NPTl9QUlNDVkwoNDkpOworCisJYWRjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChhZGMtPmlycSA8PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBhZGMgaXJxXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfYWxsb2M7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoYWRjLT5pcnEsIHMzY19hZGNfaXJxLCAwLCBkZXZfbmFtZShkZXYpLCBhZGMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGF0dGFjaCBhZGMgaXJxXG4iKTsKKwkJZ290byBlcnJfYWxsb2M7CisJfQorCisJYWRjLT5jbGsgPSBjbGtfZ2V0KGRldiwgImFkYyIpOworCWlmIChJU19FUlIoYWRjLT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBhZGMgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKGFkYy0+Y2xrKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVncykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBmaW5kIHJlZ2lzdGVyc1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJfY2xrOworCX0KKworCWFkYy0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOworCWlmICghYWRjLT5yZWdzKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwljbGtfZW5hYmxlKGFkYy0+Y2xrKTsKKworCXdyaXRlbChhZGMtPnByZXNjYWxlIHwgUzNDMjQxMF9BRENDT05fUFJTQ0VOLAorCSAgICAgICBhZGMtPnJlZ3MgKyBTM0MyNDEwX0FEQ0NPTik7CisKKwlkZXZfaW5mbyhkZXYsICJhdHRhY2hlZCBhZGMgZHJpdmVyXG4iKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGFkYyk7CisJYWRjX2RldiA9IGFkYzsKKworCXJldHVybiAwOworCisgZXJyX2NsazoKKwljbGtfcHV0KGFkYy0+Y2xrKTsKKworIGVycl9pcnE6CisJZnJlZV9pcnEoYWRjLT5pcnEsIGFkYyk7CisKKyBlcnJfYWxsb2M6CisJa2ZyZWUoYWRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHMzY19hZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFkY19kZXZpY2UgKmFkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaW91bm1hcChhZGMtPnJlZ3MpOworCWZyZWVfaXJxKGFkYy0+aXJxLCBhZGMpOworCWNsa19kaXNhYmxlKGFkYy0+Y2xrKTsKKwljbGtfcHV0KGFkYy0+Y2xrKTsKKwlrZnJlZShhZGMpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgczNjX2FkY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRjX2RldmljZSAqYWRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyIGNvbjsKKworCWNvbiA9IHJlYWRsKGFkYy0+cmVncyArIFMzQzI0MTBfQURDQ09OKTsKKwljb24gfD0gUzNDMjQxMF9BRENDT05fU1REQk07CisJd3JpdGVsKGNvbiwgYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOworCisJY2xrX2Rpc2FibGUoYWRjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjX2FkY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWRjX2RldmljZSAqYWRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljbGtfZW5hYmxlKGFkYy0+Y2xrKTsKKworCXdyaXRlbChhZGMtPnByZXNjYWxlIHwgUzNDMjQxMF9BRENDT05fUFJTQ0VOLAorCSAgICAgICBhZGMtPnJlZ3MgKyBTM0MyNDEwX0FEQ0NPTik7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgczNjX2FkY19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgczNjX2FkY19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzY19hZGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzM2MyNHh4LWFkYyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHMzY19hZGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzM2NfYWRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBzM2NfYWRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzM2NfYWRjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkY19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmczNjX2FkY19kcml2ZXIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhZGQgYWRjIGRyaXZlclxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworYXJjaF9pbml0Y2FsbChhZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2stZGNsay5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLWRjbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc1YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLWRjbGsuYwpAQCAtMCwwICsxLDE5NCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLWRjbGsuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFMzQzI0WFggLSBkZWZpbml0aW9ucyBmb3IgRENMSyBhbmQgQ0xLT1VUIHJlZ2lzdGVycworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKy8qIGNsb2NrcyB0aGF0IGNvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworCitzdGF0aWMgaW50IHMzYzI0eHhfZGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGxvbmcgZGNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRENMS0NPTik7CisKKwlpZiAoZW5hYmxlKQorCQlkY2xrY29uIHw9IGNsay0+Y3RybGJpdDsKKwllbHNlCisJCWRjbGtjb24gJj0gfmNsay0+Y3RybGJpdDsKKworCV9fcmF3X3dyaXRlbChkY2xrY29uLCBTM0MyNFhYX0RDTEtDT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9kY2xrX3NldHBhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGRjbGtjb247CisJdW5zaWduZWQgaW50IHVjbGs7CisKKwlpZiAocGFyZW50ID09ICZjbGtfdXBsbCkKKwkJdWNsayA9IDE7CisJZWxzZSBpZiAocGFyZW50ID09ICZjbGtfcCkKKwkJdWNsayA9IDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsay0+cGFyZW50ID0gcGFyZW50OworCisJZGNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRENMS0NPTik7CisKKwlpZiAoY2xrLT5jdHJsYml0ID09IFMzQzI0MTBfRENMS0NPTl9EQ0xLMEVOKSB7CisJCWlmICh1Y2xrKQorCQkJZGNsa2NvbiB8PSBTM0MyNDEwX0RDTEtDT05fRENMSzBfVUNMSzsKKwkJZWxzZQorCQkJZGNsa2NvbiAmPSB+UzNDMjQxMF9EQ0xLQ09OX0RDTEswX1VDTEs7CisJfSBlbHNlIHsKKwkJaWYgKHVjbGspCisJCQlkY2xrY29uIHw9IFMzQzI0MTBfRENMS0NPTl9EQ0xLMV9VQ0xLOworCQllbHNlCisJCQlkY2xrY29uICY9IH5TM0MyNDEwX0RDTEtDT05fRENMSzFfVUNMSzsKKwl9CisKKwlfX3Jhd193cml0ZWwoZGNsa2NvbiwgUzNDMjRYWF9EQ0xLQ09OKTsKKworCXJldHVybiAwOworfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjR4eF9jYWxjX2RpdihzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpdjsKKworCWlmICgocmF0ZSA9PSAwKSB8fCAhY2xrLT5wYXJlbnQpCisJCXJldHVybiAwOworCisJZGl2ID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIHJhdGU7CisJaWYgKGRpdiA8IDIpCisJCWRpdiA9IDI7CisJZWxzZSBpZiAoZGl2ID4gMTYpCisJCWRpdiA9IDE2OworCisJcmV0dXJuIGRpdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjR4eF9yb3VuZF9kY2xrX3JhdGUoc3RydWN0IGNsayAqY2xrLAorCXVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpdiA9IHMzYzI0eHhfY2FsY19kaXYoY2xrLCByYXRlKTsKKworCWlmIChkaXYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIGRpdjsKK30KKworc3RhdGljIGludCBzM2MyNHh4X3NldF9kY2xrX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBkYXRhLCBkaXYgPSBzM2MyNHh4X2NhbGNfZGl2KGNsaywgcmF0ZSk7CisKKwlpZiAoZGl2ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNsayA9PSAmczNjMjR4eF9kY2xrMCkgeworCQltYXNrID0gUzNDMjQxMF9EQ0xLQ09OX0RDTEswX0RJVl9NQVNLIHwKKwkJCVMzQzI0MTBfRENMS0NPTl9EQ0xLMF9DTVBfTUFTSzsKKwkJZGF0YSA9IFMzQzI0MTBfRENMS0NPTl9EQ0xLMF9ESVYoZGl2KSB8CisJCQlTM0MyNDEwX0RDTEtDT05fRENMSzBfQ01QKChkaXYgKyAxKSAvIDIpOworCX0gZWxzZSBpZiAoY2xrID09ICZzM2MyNHh4X2RjbGsxKSB7CisJCW1hc2sgPSBTM0MyNDEwX0RDTEtDT05fRENMSzFfRElWX01BU0sgfAorCQkJUzNDMjQxMF9EQ0xLQ09OX0RDTEsxX0NNUF9NQVNLOworCQlkYXRhID0gUzNDMjQxMF9EQ0xLQ09OX0RDTEsxX0RJVihkaXYpIHwKKwkJCVMzQzI0MTBfRENMS0NPTl9EQ0xLMV9DTVAoKGRpdiArIDEpIC8gMik7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIGRpdjsKKwlfX3Jhd193cml0ZWwoKChfX3Jhd19yZWFkbChTM0MyNFhYX0RDTEtDT04pICYgfm1hc2spIHwgZGF0YSksCisJCVMzQzI0WFhfRENMS0NPTik7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KK3N0YXRpYyBpbnQgczNjMjR4eF9jbGtvdXRfc2V0cGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIHNvdXJjZTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgTUlTQ0NSIHNldHRpbmcgZm9yIHRoZSBjbG9jayAqLworCisJaWYgKHBhcmVudCA9PSAmY2xrX3h0YWwpCisJCXNvdXJjZSA9IFMzQzI0MTBfTUlTQ0NSX0NMSzBfTVBMTDsKKwllbHNlIGlmIChwYXJlbnQgPT0gJmNsa191cGxsKQorCQlzb3VyY2UgPSBTM0MyNDEwX01JU0NDUl9DTEswX1VQTEw7CisJZWxzZSBpZiAocGFyZW50ID09ICZjbGtfZikKKwkJc291cmNlID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9GQ0xLOworCWVsc2UgaWYgKHBhcmVudCA9PSAmY2xrX2gpCisJCXNvdXJjZSA9IFMzQzI0MTBfTUlTQ0NSX0NMSzBfSENMSzsKKwllbHNlIGlmIChwYXJlbnQgPT0gJmNsa19wKQorCQlzb3VyY2UgPSBTM0MyNDEwX01JU0NDUl9DTEswX1BDTEs7CisJZWxzZSBpZiAoY2xrID09ICZzM2MyNHh4X2Nsa291dDAgJiYgcGFyZW50ID09ICZzM2MyNHh4X2RjbGswKQorCQlzb3VyY2UgPSBTM0MyNDEwX01JU0NDUl9DTEswX0RDTEswOworCWVsc2UgaWYgKGNsayA9PSAmczNjMjR4eF9jbGtvdXQxICYmIHBhcmVudCA9PSAmczNjMjR4eF9kY2xrMSkKKwkJc291cmNlID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9EQ0xLMDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlpZiAoY2xrID09ICZzM2MyNHh4X2Nsa291dDApCisJCW1hc2sgPSBTM0MyNDEwX01JU0NDUl9DTEswX01BU0s7CisJZWxzZSB7CisJCXNvdXJjZSA8PD0gNDsKKwkJbWFzayA9IFMzQzI0MTBfTUlTQ0NSX0NMSzFfTUFTSzsKKwl9CisKKwlzM2MyNDEwX21vZGlmeV9taXNjY3IobWFzaywgc291cmNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogZXh0ZXJuYWwgY2xvY2sgZGVmaW5pdGlvbnMgKi8KKworc3RydWN0IGNsayBzM2MyNHh4X2RjbGswID0geworCS5uYW1lCQk9ICJkY2xrMCIsCisJLmlkCQk9IC0xLAorCS5jdHJsYml0CT0gUzNDMjQxMF9EQ0xLQ09OX0RDTEswRU4sCisJLmVuYWJsZQkgICAgICAgID0gczNjMjR4eF9kY2xrX2VuYWJsZSwKKwkuc2V0X3BhcmVudAk9IHMzYzI0eHhfZGNsa19zZXRwYXJlbnQsCisJLnNldF9yYXRlCT0gczNjMjR4eF9zZXRfZGNsa19yYXRlLAorCS5yb3VuZF9yYXRlCT0gczNjMjR4eF9yb3VuZF9kY2xrX3JhdGUsCit9OworCitzdHJ1Y3QgY2xrIHMzYzI0eHhfZGNsazEgPSB7CisJLm5hbWUJCT0gImRjbGsxIiwKKwkuaWQJCT0gLTEsCisJLmN0cmxiaXQJPSBTM0MyNDEwX0RDTEtDT05fRENMSzFFTiwKKwkuZW5hYmxlCQk9IHMzYzI0eHhfZGNsa19lbmFibGUsCisJLnNldF9wYXJlbnQJPSBzM2MyNHh4X2RjbGtfc2V0cGFyZW50LAorCS5zZXRfcmF0ZQk9IHMzYzI0eHhfc2V0X2RjbGtfcmF0ZSwKKwkucm91bmRfcmF0ZQk9IHMzYzI0eHhfcm91bmRfZGNsa19yYXRlLAorfTsKKworc3RydWN0IGNsayBzM2MyNHh4X2Nsa291dDAgPSB7CisJLm5hbWUJCT0gImNsa291dDAiLAorCS5pZAkJPSAtMSwKKwkuc2V0X3BhcmVudAk9IHMzYzI0eHhfY2xrb3V0X3NldHBhcmVudCwKK307CisKK3N0cnVjdCBjbGsgczNjMjR4eF9jbGtvdXQxID0geworCS5uYW1lCQk9ICJjbGtvdXQxIiwKKwkuaWQJCT0gLTEsCisJLnNldF9wYXJlbnQJPSBzM2MyNHh4X2Nsa291dF9zZXRwYXJlbnQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYwppbmRleCBhMDA1ZGRiLi44NDc0ZDA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYwpAQCAtMjcsMTggKzI3LDggQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC00Nyw0OTAgKzM3LDIzIEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KKwogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi0vKiBjbG9jayBpbmZvcm1hdGlvbiAqLwotCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci0KLURFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwotCi0vKiBlbmFibGUgYW5kIGRpc2FibGUgY2FsbHMgZm9yIHVzZSB3aXRoIHRoZSBjbGsgc3RydWN0ICovCi0KLXN0YXRpYyBpbnQgY2xrX251bGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2xvY2sgQVBJIGNhbGxzICovCi0KLXN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpwOwotCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0JaW50IGlkbm87Ci0KLQlpZiAoZGV2ID09IE5VTEwgfHwgZGV2LT5idXMgIT0gJnBsYXRmb3JtX2J1c190eXBlKQotCQlpZG5vID0gLTE7Ci0JZWxzZQotCQlpZG5vID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldiktPmlkOwotCi0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewotCQlpZiAocC0+aWQgPT0gaWRubyAmJgotCQkgICAgc3RyY21wKGlkLCBwLT5uYW1lKSA9PSAwICYmCi0JCSAgICB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKLQkJCWNsayA9IHA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIGNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSBhIGRldmljZSB3YXMgc3VwcGxpZWQsIGJ1dCB0aGUKLQkgKiBjbG9jayB0aGF0IHdhcyBiZWluZyBzZWFyY2hlZCBmb3IgaXMgbm90IGRldmljZSBzcGVjaWZpYyAqLwotCi0JaWYgKElTX0VSUihjbGspKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrcywgbGlzdCkgewotCQkJaWYgKHAtPmlkID09IC0xICYmIHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJgotCQkJICAgIHRyeV9tb2R1bGVfZ2V0KHAtPm93bmVyKSkgewotCQkJCWNsayA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0JcmV0dXJuIGNsazsKLX0KLQotdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKLXsKLQltb2R1bGVfcHV0KGNsay0+b3duZXIpOwotfQotCi1pbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKElTX0VSUihjbGspIHx8IGNsayA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNsa19lbmFibGUoY2xrLT5wYXJlbnQpOwotCi0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQotCWlmICgoY2xrLT51c2FnZSsrKSA9PSAwKQotCQkoY2xrLT5lbmFibGUpKGNsaywgMSk7Ci0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotCWlmIChJU19FUlIoY2xrKSB8fCBjbGsgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKLQotCWlmICgoLS1jbGstPnVzYWdlKSA9PSAwKQotCQkoY2xrLT5lbmFibGUpKGNsaywgMCk7Ci0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0JY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOwotfQotCi0KLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNsay0+cmF0ZSAhPSAwKQotCQlyZXR1cm4gY2xrLT5yYXRlOwotCi0JaWYgKGNsay0+Z2V0X3JhdGUgIT0gTlVMTCkKLQkJcmV0dXJuIChjbGstPmdldF9yYXRlKShjbGspOwotCi0JaWYgKGNsay0+cGFyZW50ICE9IE5VTEwpCi0JCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwotCi0JcmV0dXJuIGNsay0+cmF0ZTsKLX0KLQotbG9uZyBjbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlpZiAoIUlTX0VSUihjbGspICYmIGNsay0+cm91bmRfcmF0ZSkKLQkJcmV0dXJuIChjbGstPnJvdW5kX3JhdGUpKGNsaywgcmF0ZSk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFdlIGRvIG5vdCBkZWZhdWx0IGp1c3QgZG8gYSBjbGstPnJhdGUgPSByYXRlIGFzCi0JICogdGhlIGNsb2NrIG1heSBoYXZlIGJlZW4gbWFkZSB0aGlzIHdheSBieSBjaG9pY2UuCi0JICovCi0KLQlXQVJOX09OKGNsay0+c2V0X3JhdGUgPT0gTlVMTCk7Ci0KLQlpZiAoY2xrLT5zZXRfcmF0ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JcmV0ID0gKGNsay0+c2V0X3JhdGUpKGNsaywgcmF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IGNsayAqY2xrX2dldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBjbGstPnBhcmVudDsKLX0KLQotaW50IGNsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0KLQlpZiAoY2xrLT5zZXRfcGFyZW50KQotCQlyZXQgPSAoY2xrLT5zZXRfcGFyZW50KShjbGssIHBhcmVudCk7Ci0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1FWFBPUlRfU1lNQk9MKGNsa19nZXQpOwotRVhQT1JUX1NZTUJPTChjbGtfcHV0KTsKLUVYUE9SVF9TWU1CT0woY2xrX2VuYWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKLUVYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKLUVYUE9SVF9TWU1CT0woY2xrX3JvdW5kX3JhdGUpOwotRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOwotRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3BhcmVudCk7Ci1FWFBPUlRfU1lNQk9MKGNsa19zZXRfcGFyZW50KTsKLQotLyogYmFzZSBjbG9ja3MgKi8KLQotc3RhdGljIGludCBjbGtfZGVmYXVsdF9zZXRyYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCWNsay0+cmF0ZSA9IHJhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBjbGsgY2xrX3h0YWwgPSB7Ci0JLm5hbWUJCT0gInh0YWwiLAotCS5pZAkJPSAtMSwKLQkucmF0ZQkJPSAwLAotCS5wYXJlbnQJCT0gTlVMTCwKLQkuY3RybGJpdAk9IDAsCi19OwotCi1zdHJ1Y3QgY2xrIGNsa19tcGxsID0gewotCS5uYW1lCQk9ICJtcGxsIiwKLQkuaWQJCT0gLTEsCi0JLnNldF9yYXRlCT0gY2xrX2RlZmF1bHRfc2V0cmF0ZSwKLX07Ci0KLXN0cnVjdCBjbGsgY2xrX3VwbGwgPSB7Ci0JLm5hbWUJCT0gInVwbGwiLAotCS5pZAkJPSAtMSwKLQkucGFyZW50CQk9IE5VTEwsCi0JLmN0cmxiaXQJPSAwLAotfTsKLQotc3RydWN0IGNsayBjbGtfZiA9IHsKLQkubmFtZQkJPSAiZmNsayIsCi0JLmlkCQk9IC0xLAotCS5yYXRlCQk9IDAsCi0JLnBhcmVudAkJPSAmY2xrX21wbGwsCi0JLmN0cmxiaXQJPSAwLAotCS5zZXRfcmF0ZQk9IGNsa19kZWZhdWx0X3NldHJhdGUsCi19OwotCi1zdHJ1Y3QgY2xrIGNsa19oID0gewotCS5uYW1lCQk9ICJoY2xrIiwKLQkuaWQJCT0gLTEsCi0JLnJhdGUJCT0gMCwKLQkucGFyZW50CQk9IE5VTEwsCi0JLmN0cmxiaXQJPSAwLAotCS5zZXRfcmF0ZQk9IGNsa19kZWZhdWx0X3NldHJhdGUsCi19OwotCi1zdHJ1Y3QgY2xrIGNsa19wID0gewotCS5uYW1lCQk9ICJwY2xrIiwKLQkuaWQJCT0gLTEsCi0JLnJhdGUJCT0gMCwKLQkucGFyZW50CQk9IE5VTEwsCi0JLmN0cmxiaXQJPSAwLAotCS5zZXRfcmF0ZQk9IGNsa19kZWZhdWx0X3NldHJhdGUsCi19OwotCi1zdHJ1Y3QgY2xrIGNsa191c2JfYnVzID0gewotCS5uYW1lCQk9ICJ1c2ItYnVzIiwKLQkuaWQJCT0gLTEsCi0JLnJhdGUJCT0gMCwKLQkucGFyZW50CQk9ICZjbGtfdXBsbCwKLX07Ci0KLS8qIGNsb2NrcyB0aGF0IGNvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgZXh0ZXJuYWwgY29kZSAqLwotCi1zdGF0aWMgaW50IHMzYzI0eHhfZGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGxvbmcgZGNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRENMS0NPTik7Ci0KLQlpZiAoZW5hYmxlKQotCQlkY2xrY29uIHw9IGNsay0+Y3RybGJpdDsKLQllbHNlCi0JCWRjbGtjb24gJj0gfmNsay0+Y3RybGJpdDsKLQotCV9fcmF3X3dyaXRlbChkY2xrY29uLCBTM0MyNFhYX0RDTEtDT04pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9kY2xrX3NldHBhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKLXsKLQl1bnNpZ25lZCBsb25nIGRjbGtjb247Ci0JdW5zaWduZWQgaW50IHVjbGs7Ci0KLQlpZiAocGFyZW50ID09ICZjbGtfdXBsbCkKLQkJdWNsayA9IDE7Ci0JZWxzZSBpZiAocGFyZW50ID09ICZjbGtfcCkKLQkJdWNsayA9IDA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNsay0+cGFyZW50ID0gcGFyZW50OwotCi0JZGNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRENMS0NPTik7Ci0KLQlpZiAoY2xrLT5jdHJsYml0ID09IFMzQzI0MTBfRENMS0NPTl9EQ0xLMEVOKSB7Ci0JCWlmICh1Y2xrKQotCQkJZGNsa2NvbiB8PSBTM0MyNDEwX0RDTEtDT05fRENMSzBfVUNMSzsKLQkJZWxzZQotCQkJZGNsa2NvbiAmPSB+UzNDMjQxMF9EQ0xLQ09OX0RDTEswX1VDTEs7Ci0JfSBlbHNlIHsKLQkJaWYgKHVjbGspCi0JCQlkY2xrY29uIHw9IFMzQzI0MTBfRENMS0NPTl9EQ0xLMV9VQ0xLOwotCQllbHNlCi0JCQlkY2xrY29uICY9IH5TM0MyNDEwX0RDTEtDT05fRENMSzFfVUNMSzsKLQl9Ci0KLQlfX3Jhd193cml0ZWwoZGNsa2NvbiwgUzNDMjRYWF9EQ0xLQ09OKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNHh4X2NhbGNfZGl2KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGxvbmcgZGl2OwotCi0JaWYgKChyYXRlID09IDApIHx8ICFjbGstPnBhcmVudCkKLQkJcmV0dXJuIDA7Ci0KLQlkaXYgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gcmF0ZTsKLQlpZiAoZGl2IDwgMikKLQkJZGl2ID0gMjsKLQllbHNlIGlmIChkaXYgPiAxNikKLQkJZGl2ID0gMTY7Ci0KLQlyZXR1cm4gZGl2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNHh4X3JvdW5kX2RjbGtfcmF0ZShzdHJ1Y3QgY2xrICpjbGssCi0JdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGxvbmcgZGl2ID0gczNjMjR4eF9jYWxjX2RpdihjbGssIHJhdGUpOwotCi0JaWYgKGRpdiA9PSAwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gZGl2OwotfQotCi1zdGF0aWMgaW50IHMzYzI0eHhfc2V0X2RjbGtfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIG1hc2ssIGRhdGEsIGRpdiA9IHMzYzI0eHhfY2FsY19kaXYoY2xrLCByYXRlKTsKLQotCWlmIChkaXYgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY2xrID09ICZzM2MyNHh4X2RjbGswKSB7Ci0JCW1hc2sgPSBTM0MyNDEwX0RDTEtDT05fRENMSzBfRElWX01BU0sgfAotCQkJUzNDMjQxMF9EQ0xLQ09OX0RDTEswX0NNUF9NQVNLOwotCQlkYXRhID0gUzNDMjQxMF9EQ0xLQ09OX0RDTEswX0RJVihkaXYpIHwKLQkJCVMzQzI0MTBfRENMS0NPTl9EQ0xLMF9DTVAoKGRpdiArIDEpIC8gMik7Ci0JfSBlbHNlIGlmIChjbGsgPT0gJnMzYzI0eHhfZGNsazEpIHsKLQkJbWFzayA9IFMzQzI0MTBfRENMS0NPTl9EQ0xLMV9ESVZfTUFTSyB8Ci0JCQlTM0MyNDEwX0RDTEtDT05fRENMSzFfQ01QX01BU0s7Ci0JCWRhdGEgPSBTM0MyNDEwX0RDTEtDT05fRENMSzFfRElWKGRpdikgfAotCQkJUzNDMjQxMF9EQ0xLQ09OX0RDTEsxX0NNUCgoZGl2ICsgMSkgLyAyKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljbGstPnJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gZGl2OwotCV9fcmF3X3dyaXRlbCgoKF9fcmF3X3JlYWRsKFMzQzI0WFhfRENMS0NPTikgJiB+bWFzaykgfCBkYXRhKSwKLQkJUzNDMjRYWF9EQ0xLQ09OKTsKLQlyZXR1cm4gY2xrLT5yYXRlOwotfQotCi1zdGF0aWMgaW50IHMzYzI0eHhfY2xrb3V0X3NldHBhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKLXsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBzb3VyY2U7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIE1JU0NDUiBzZXR0aW5nIGZvciB0aGUgY2xvY2sgKi8KLQotCWlmIChwYXJlbnQgPT0gJmNsa194dGFsKQotCQlzb3VyY2UgPSBTM0MyNDEwX01JU0NDUl9DTEswX01QTEw7Ci0JZWxzZSBpZiAocGFyZW50ID09ICZjbGtfdXBsbCkKLQkJc291cmNlID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9VUExMOwotCWVsc2UgaWYgKHBhcmVudCA9PSAmY2xrX2YpCi0JCXNvdXJjZSA9IFMzQzI0MTBfTUlTQ0NSX0NMSzBfRkNMSzsKLQllbHNlIGlmIChwYXJlbnQgPT0gJmNsa19oKQotCQlzb3VyY2UgPSBTM0MyNDEwX01JU0NDUl9DTEswX0hDTEs7Ci0JZWxzZSBpZiAocGFyZW50ID09ICZjbGtfcCkKLQkJc291cmNlID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9QQ0xLOwotCWVsc2UgaWYgKGNsayA9PSAmczNjMjR4eF9jbGtvdXQwICYmIHBhcmVudCA9PSAmczNjMjR4eF9kY2xrMCkKLQkJc291cmNlID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9EQ0xLMDsKLQllbHNlIGlmIChjbGsgPT0gJnMzYzI0eHhfY2xrb3V0MSAmJiBwYXJlbnQgPT0gJnMzYzI0eHhfZGNsazEpCi0JCXNvdXJjZSA9IFMzQzI0MTBfTUlTQ0NSX0NMSzBfRENMSzA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNsay0+cGFyZW50ID0gcGFyZW50OwotCi0JaWYgKGNsayA9PSAmczNjMjR4eF9jbGtvdXQwKQotCQltYXNrID0gUzNDMjQxMF9NSVNDQ1JfQ0xLMF9NQVNLOwotCWVsc2UgewotCQlzb3VyY2UgPDw9IDQ7Ci0JCW1hc2sgPSBTM0MyNDEwX01JU0NDUl9DTEsxX01BU0s7Ci0JfQotCi0JczNjMjQxMF9tb2RpZnlfbWlzY2NyKG1hc2ssIHNvdXJjZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGV4dGVybmFsIGNsb2NrIGRlZmluaXRpb25zICovCi0KLXN0cnVjdCBjbGsgczNjMjR4eF9kY2xrMCA9IHsKLQkubmFtZQkJPSAiZGNsazAiLAotCS5pZAkJPSAtMSwKLQkuY3RybGJpdAk9IFMzQzI0MTBfRENMS0NPTl9EQ0xLMEVOLAotCS5lbmFibGUJICAgICAgICA9IHMzYzI0eHhfZGNsa19lbmFibGUsCi0JLnNldF9wYXJlbnQJPSBzM2MyNHh4X2RjbGtfc2V0cGFyZW50LAotCS5zZXRfcmF0ZQk9IHMzYzI0eHhfc2V0X2RjbGtfcmF0ZSwKLQkucm91bmRfcmF0ZQk9IHMzYzI0eHhfcm91bmRfZGNsa19yYXRlLAotfTsKLQotc3RydWN0IGNsayBzM2MyNHh4X2RjbGsxID0gewotCS5uYW1lCQk9ICJkY2xrMSIsCi0JLmlkCQk9IC0xLAotCS5jdHJsYml0CT0gUzNDMjQxMF9EQ0xLQ09OX0RDTEsxRU4sCi0JLmVuYWJsZQkJPSBzM2MyNHh4X2RjbGtfZW5hYmxlLAotCS5zZXRfcGFyZW50CT0gczNjMjR4eF9kY2xrX3NldHBhcmVudCwKLQkuc2V0X3JhdGUJPSBzM2MyNHh4X3NldF9kY2xrX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSBzM2MyNHh4X3JvdW5kX2RjbGtfcmF0ZSwKLX07Ci0KLXN0cnVjdCBjbGsgczNjMjR4eF9jbGtvdXQwID0gewotCS5uYW1lCQk9ICJjbGtvdXQwIiwKLQkuaWQJCT0gLTEsCi0JLnNldF9wYXJlbnQJPSBzM2MyNHh4X2Nsa291dF9zZXRwYXJlbnQsCi19OwotCi1zdHJ1Y3QgY2xrIHMzYzI0eHhfY2xrb3V0MSA9IHsKLQkubmFtZQkJPSAiY2xrb3V0MSIsCi0JLmlkCQk9IC0xLAotCS5zZXRfcGFyZW50CT0gczNjMjR4eF9jbGtvdXRfc2V0cGFyZW50LAotfTsKLQotc3RydWN0IGNsayBzM2MyNHh4X3VjbGsgPSB7Ci0JLm5hbWUJCT0gInVjbGsiLAotCS5pZAkJPSAtMSwKLX07Ci0KLS8qIGluaXRpYWxpc2UgdGhlIGNsb2NrIHN5c3RlbSAqLwotCi1pbnQgczNjMjR4eF9yZWdpc3Rlcl9jbG9jayhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JY2xrLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JaWYgKGNsay0+ZW5hYmxlID09IE5VTEwpCi0JCWNsay0+ZW5hYmxlID0gY2xrX251bGxfZW5hYmxlOwotCi0JLyogYWRkIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjbG9ja3MgKi8KLQotCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7Ci0JbGlzdF9hZGQoJmNsay0+bGlzdCwgJmNsb2Nrcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrcyhzdHJ1Y3QgY2xrICoqY2xrcywgaW50IG5yX2Nsa3MpCi17Ci0JaW50IGZhaWxzID0gMDsKLQotCWZvciAoOyBucl9jbGtzID4gMDsgbnJfY2xrcy0tLCBjbGtzKyspIHsKLQkJaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soKmNsa3MpIDwgMCkKLQkJCWZhaWxzKys7Ci0JfQotCi0JcmV0dXJuIGZhaWxzOwotfQorI2luY2x1ZGUgPHBsYXQvcGxsLmg+CiAKIC8qIGluaXRhbGlzZSBhbGwgdGhlIGNsb2NrcyAqLwogCi1pbnQgX19pbml0IHMzYzI0eHhfc2V0dXBfY2xvY2tzKHVuc2lnbmVkIGxvbmcgeHRhbCwKLQkJCQl1bnNpZ25lZCBsb25nIGZjbGssCi0JCQkJdW5zaWduZWQgbG9uZyBoY2xrLAotCQkJCXVuc2lnbmVkIGxvbmcgcGNsaykKK3ZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjR4eF9zZXR1cF9jbG9ja3ModW5zaWduZWQgbG9uZyBmY2xrLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGhjbGssCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgcGNsaykKIHsKLQlwcmludGsoS0VSTl9JTkZPICJTM0MyNFhYIENsb2NrcywgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKLQotCS8qIGluaXRpYWxpc2UgdGhlIG1haW4gc3lzdGVtIGNsb2NrcyAqLwotCi0JY2xrX3h0YWwucmF0ZSA9IHh0YWw7Ci0JY2xrX3VwbGwucmF0ZSA9IHMzYzI0MTBfZ2V0X3BsbChfX3Jhd19yZWFkbChTM0MyNDEwX1VQTExDT04pLCB4dGFsKTsKKwljbGtfdXBsbC5yYXRlID0gczNjMjR4eF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfVVBMTENPTiksCisJCQkJCWNsa194dGFsLnJhdGUpOwogCiAJY2xrX21wbGwucmF0ZSA9IGZjbGs7CiAJY2xrX2gucmF0ZSA9IGhjbGs7CiAJY2xrX3AucmF0ZSA9IHBjbGs7CiAJY2xrX2YucmF0ZSA9IGZjbGs7Ci0KLQkvKiBhc3N1bWUgdWFydCBjbG9ja3MgYXJlIGNvcnJlY3RseSBzZXR1cCAqLwotCi0JLyogcmVnaXN0ZXIgb3VyIGNsb2NrcyAqLwotCi0JaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa194dGFsKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIG1hc3RlciB4dGFsXG4iKTsKLQotCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfbXBsbCkgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBtcGxsIGNsb2NrXG4iKTsKLQotCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfdXBsbCkgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciB1cGxsIGNsb2NrXG4iKTsKLQotCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfZikgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBjcHUgZmNsa1xuIik7Ci0KLQlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX2gpIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgY3B1IGhjbGtcbiIpOwotCi0JaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa19wKSA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdSBwY2xrXG4iKTsKLQotCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NvbW1vbi1zbWRrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuYwppbmRleCAzMDk4NzM2Li4zZDQ4MzcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9sZWRzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi1zbWRrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKaW5kZXggMjJhMzI5NS4uNTQyMDYyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTU1LDE2ICs1NCw2IEBACiAjaW5jbHVkZSA8cGxhdC9zM2MyNDQyLmg+CiAjaW5jbHVkZSA8cGxhdC9zM2MyNDQzLmg+CiAKLXN0cnVjdCBjcHVfdGFibGUgewotCXVuc2lnbmVkIGxvbmcJaWRjb2RlOwotCXVuc2lnbmVkIGxvbmcJaWRtYXNrOwotCXZvaWQJCSgqbWFwX2lvKShzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpOwotCXZvaWQJCSgqaW5pdF91YXJ0cykoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotCXZvaWQJCSgqaW5pdF9jbG9ja3MpKGludCB4dGFsKTsKLQlpbnQJCSgqaW5pdCkodm9pZCk7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLX07Ci0KIC8qIHRhYmxlIG9mIHN1cHBvcnRlZCBDUFVzICovCiAKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQwMFtdICA9ICJTM0MyNDAwIjsKQEAgLTE2OSwyMyArMTU4LDcgQEAKIAlJT0RFU0NfRU5UKFVBUlQpCiB9OwogCi1zdGF0aWMgc3RydWN0IGNwdV90YWJsZSAqIF9faW5pdCBzM2NfbG9va3VwX2NwdSh1bnNpZ25lZCBsb25nIGlkY29kZSkKLXsKLQlzdHJ1Y3QgY3B1X3RhYmxlICp0YWI7Ci0JaW50IGNvdW50OwotCi0JdGFiID0gY3B1X2lkczsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBUlJBWV9TSVpFKGNwdV9pZHMpOyBjb3VudCsrLCB0YWIrKykgewotCQlpZiAoKGlkY29kZSAmIHRhYi0+aWRtYXNrKSA9PSB0YWItPmlkY29kZSkKLQkJCXJldHVybiB0YWI7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGNwdSBpbmZvcm1hdGlvbiAqLwotCi1zdGF0aWMgc3RydWN0IGNwdV90YWJsZSAqY3B1OworLyogcmVhZCBjcHUgaWRlbnRpZmljYWl0b24gY29kZSAqLwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y1KHZvaWQpCiB7CkBAIC0yMzEsNiArMjA0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGlkY29kZSA9IDB4MDsKIAogCS8qIGluaXRpYWxpc2UgdGhlIGlvIGRlc2NyaXB0b3JzIHdlIG5lZWQgZm9yIGluaXRpYWxpc2F0aW9uICovCisJaW90YWJsZV9pbml0KG1hY2hfZGVzYywgc2l6ZSk7CiAJaW90YWJsZV9pbml0KHMzY19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjX2lvZGVzYykpOwogCiAJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NSkgewpAQCAtMjM5LDExNyArMjEzLDcgQEAKIAkJaWRjb2RlID0gczNjMjR4eF9yZWFkX2lkY29kZV92NCgpOwogCX0KIAotCWNwdSA9IHMzY19sb29rdXBfY3B1KGlkY29kZSk7Ci0KLQlpZiAoY3B1ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIENQVSB0eXBlIDB4JTA4bHhcbiIsIGlkY29kZSk7Ci0JCXBhbmljKCJVbmtub3duIFMzQzI0WFggQ1BVIik7Ci0JfQotCi0JcHJpbnRrKCJDUFUgJXMgKGlkIDB4JTA4bHgpXG4iLCBjcHUtPm5hbWUsIGlkY29kZSk7Ci0KLQlpZiAoY3B1LT5tYXBfaW8gPT0gTlVMTCB8fCBjcHUtPmluaXQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNQVSAlcyBzdXBwb3J0IG5vdCBlbmFibGVkXG4iLCBjcHUtPm5hbWUpOwotCQlwYW5pYygiVW5zdXBwb3J0ZWQgUzNDMjRYWCBDUFUiKTsKLQl9Ci0KIAlhcm1fcG1fcmVzdGFydCA9IHMzYzI0eHhfcG1fcmVzdGFydDsKIAotCShjcHUtPm1hcF9pbykobWFjaF9kZXNjLCBzaXplKTsKKwlzM2NfaW5pdF9jcHUoaWRjb2RlLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKIH0KLQotLyogczNjMjR4eF9pbml0X2Nsb2NrcwotICoKLSAqIEluaXRpYWxpc2UgdGhlIGNsb2NrIHN1YnN5c3RlbSBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICogZ2l2ZW4gbWFzdGVyIGNyeXN0YWwgdmFsdWUuCi0gKgotICogeHRhbCAgPSAwIC0+IHVzZSBkZWZhdWx0IFBMTCBjcnlzdGFsIHZhbHVlIChub3JtYWxseSAxMk1IeikKLSAqICAgICAgIT0gMCAtPiBQTEwgY3J5c3RhbCB2YWx1ZSBpbiBIegotKi8KLQotdm9pZCBfX2luaXQgczNjMjR4eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKLXsKLQlpZiAoeHRhbCA9PSAwKQotCQl4dGFsID0gMTIqMTAwMCoxMDAwOwotCi0JaWYgKGNwdSA9PSBOVUxMKQotCQlwYW5pYygiczNjMjR4eF9pbml0X2Nsb2Nrczogbm8gY3B1IHNldHVwP1xuIik7Ci0KLQlpZiAoY3B1LT5pbml0X2Nsb2NrcyA9PSBOVUxMKQotCQlwYW5pYygiczNjMjR4eF9pbml0X2Nsb2NrczogY3B1IGhhcyBubyBjbG9jayBpbml0XG4iKTsKLQllbHNlCi0JCShjcHUtPmluaXRfY2xvY2tzKSh4dGFsKTsKLX0KLQotLyogdWFydCBtYW5hZ2VtZW50ICovCi0KLXN0YXRpYyBpbnQgbnJfdWFydHMgX19pbml0ZGF0YSA9IDA7Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHVhcnRfY2Znc1szXTsKLQotLyogczNjMjR4eF9pbml0X3VhcnRkZXZzCi0gKgotICogY29weSB0aGUgc3BlY2lmaWVkIHBsYXRmb3JtIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24gaW50byBvdXIgY2VudHJhbAotICogc2V0IG9mIGRldmljZXMsIGJlZm9yZSB0aGUgZGF0YSBpcyB0aHJvd24gYXdheSBhZnRlciB0aGUgaW5pdCBwcm9jZXNzLgotICoKLSAqIFRoaXMgYWxzbyBmaWxscyBpbiB0aGUgYXJyYXkgcGFzc2VkIHRvIHRoZSBzZXJpYWwgZHJpdmVyIGZvciB0aGUKLSAqIGVhcmx5IGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb25zb2xlLgotKi8KLQotdm9pZCBfX2luaXQgczNjMjR4eF9pbml0X3VhcnRkZXZzKGNoYXIgKm5hbWUsCi0JCQkJICBzdHJ1Y3QgczNjMjR4eF91YXJ0X3Jlc291cmNlcyAqcmVzLAotCQkJCSAgc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGRldjsKLQlzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmdwdHIgPSB1YXJ0X2NmZ3M7Ci0Jc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXMgKnJlc3A7Ci0JaW50IHVhcnQ7Ci0KLQltZW1jcHkoY2ZncHRyLCBjZmcsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnKSAqIG5vKTsKLQotCWZvciAodWFydCA9IDA7IHVhcnQgPCBubzsgdWFydCsrLCBjZmcrKywgY2ZncHRyKyspIHsKLQkJcGxhdGRldiA9IHMzYzI0eHhfdWFydF9zcmNbY2ZncHRyLT5od3BvcnRdOwotCi0JCXJlc3AgPSByZXMgKyBjZmdwdHItPmh3cG9ydDsKLQotCQlzM2MyNHh4X3VhcnRfZGV2c1t1YXJ0XSA9IHBsYXRkZXY7Ci0KLQkJcGxhdGRldi0+bmFtZSA9IG5hbWU7Ci0JCXBsYXRkZXYtPnJlc291cmNlID0gcmVzcC0+cmVzb3VyY2VzOwotCQlwbGF0ZGV2LT5udW1fcmVzb3VyY2VzID0gcmVzcC0+bnJfcmVzb3VyY2VzOwotCi0JCXBsYXRkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gY2ZncHRyOwotCX0KLQotCW5yX3VhcnRzID0gbm87Ci19Ci0KLXZvaWQgX19pbml0IHMzYzI0eHhfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubykKLXsKLQlpZiAoY3B1ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChjcHUtPmluaXRfdWFydHMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInMzYzI0eHhfaW5pdF91YXJ0czogY3B1IGhhcyBubyB1YXJ0IGluaXRcbiIpOwotCX0gZWxzZQotCQkoY3B1LT5pbml0X3VhcnRzKShjZmcsIG5vKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgczNjX2FyY2hfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQkvLyBkbyB0aGUgY29ycmVjdCBpbml0IGZvciBjcHUKLQotCWlmIChjcHUgPT0gTlVMTCkKLQkJcGFuaWMoInMzY19hcmNoX2luaXQ6IE5VTEwgY3B1XG4iKTsKLQotCXJldCA9IChjcHUtPmluaXQpKCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gcGxhdGZvcm1fYWRkX2RldmljZXMoczNjMjR4eF91YXJ0X2RldnMsIG5yX3VhcnRzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1hcmNoX2luaXRjYWxsKHMzY19hcmNoX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKaW5kZXggZTkzZjhiZi4uMTZhYzAxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCkBAIC0yOSwxMSArMjksMTEgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgogCiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogCiAvKiBTZXJpYWwgcG9ydCByZWdpc3RyYXRpb25zICovCiAKQEAgLTc2LDYgKzc2LDE5IEBACiAJfQogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQzX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDQzX1BBX1VBUlQzLAorCQkuZW5kICAgPSBTM0MyNDQzX1BBX1VBUlQzICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgzLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIzLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKwogc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXMgczNjMjQxMF91YXJ0X3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7CiAJWzBdID0gewogCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0MF9yZXNvdXJjZSwKQEAgLTg5LDYgKzEwMiwxMCBAQAogCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0Ml9yZXNvdXJjZSwKIAkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0Ml9yZXNvdXJjZSksCiAJfSwKKwlbM10gPSB7CisJCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQzX3Jlc291cmNlLAorCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQzX3Jlc291cmNlKSwKKwl9LAogfTsKIAogLyogeWFydCBkZXZpY2VzICovCkBAIC0xMDUsMTMgKzEyMiwxOCBAQAogCS5pZAkJPSAyLAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X3NyY1szXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzI0eHhfdWFydF9kZXZpY2UzID0geworCS5pZAkJPSAzLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X3NyY1s0XSA9IHsKIAkmczNjMjR4eF91YXJ0X2RldmljZTAsCiAJJnMzYzI0eHhfdWFydF9kZXZpY2UxLAogCSZzM2MyNHh4X3VhcnRfZGV2aWNlMiwKKwkmczNjMjR4eF91YXJ0X2RldmljZTMsCiB9OwogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3VhcnRfZGV2c1szXSA9IHsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWFydF9kZXZzWzRdID0gewogfTsKIAogLyogVVNCIEhvc3QgQ29udHJvbGxlciAqLwpAQCAtMTkyLDggKzIxNCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX25hbmRfcmVzb3VyY2VbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0MTBfUEFfTkFORCwKLQkJLmVuZCAgID0gUzNDMjQxMF9QQV9OQU5EICsgUzNDMjRYWF9TWl9OQU5EIC0gMSwKKwkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9OQU5ELAorCQkuZW5kICAgPSBTM0MyNFhYX1BBX05BTkQgKyBTM0MyNFhYX1NaX05BTkQgLSAxLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9CiB9OwpAQCAtMjcxLDMxICsyOTMsNiBAQAogCiBFWFBPUlRfU1lNQk9MKHMzY19kZXZpY2Vfd2R0KTsKIAotLyogSTJDICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9JSUMsCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfSUlDICsgUzNDMjRYWF9TWl9JSUMgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0lJQywKLQkJLmVuZCAgID0gSVJRX0lJQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtaTJjIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19pMmNfcmVzb3VyY2UsCi19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfaTJjKTsKLQogLyogSUlTICovCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2lpc19yZXNvdXJjZVtdID0gewpAQCAtMzcyLDE4ICszNjksMjYgQEAKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1hZGMiLAorCS5uYW1lCQkgID0gInMzYzI0eHgtYWRjIiwKIAkuaWQJCSAgPSAtMSwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfYWRjX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHMzY19hZGNfcmVzb3VyY2UsCiB9OwogCisvKiBIV01PTiAqLworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb24gPSB7CisJLm5hbWUJCT0gInMzYzI0eHgtaHdtb24iLAorCS5pZAkJPSAtMSwKKwkuZGV2LnBhcmVudAk9ICZzM2NfZGV2aWNlX2FkYy5kZXYsCit9OworCiAvKiBTREkgKi8KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfc2RpX3Jlc291cmNlW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1NESSwKLQkJLmVuZCAgID0gUzNDMjQxMF9QQV9TREkgKyBTM0MyNFhYX1NaX1NESSAtIDEsCisJCS5zdGFydCA9IFMzQzI0WFhfUEFfU0RJLAorCQkuZW5kICAgPSBTM0MyNFhYX1BBX1NESSArIFMzQzI0WFhfU1pfU0RJIC0gMSwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC00MDMsMzYgKzQwOCw2IEBACiAKIEVYUE9SVF9TWU1CT0woczNjX2RldmljZV9zZGkpOwogCi0vKiBIaWdoLXNwZWVkIE1NQy9TRCAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc21tY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjQ0M19QQV9IU01NQywKLQkJLmVuZCAgID0gUzNDMjQ0M19QQV9IU01NQyArIFMzQzI0NDNfU1pfSFNNTUMgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1MzQzI0NDNfSFNNTUMsCi0JCS5lbmQgICA9IElSUV9TM0MyNDQzX0hTTU1DLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWNfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jID0gewotCS5uYW1lCQkgID0gInMzYy1zZGhjaSIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2hzbW1jX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19oc21tY19yZXNvdXJjZSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfaHNtbWNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotCi0KIC8qIFNQSSAoMCkgKi8KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfc3BpMF9yZXNvdXJjZVtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCmluZGV4IDFiYWY5NDEuLmFlZTJhZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKQEAgLTI1LDE1ICsyNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC04MDQsNyArODAyLDcgQEAKICAqIGFsbG93ZWQgdG8gZ28gdGhyb3VnaC4KICovCiAKLWludCBzM2MyNDEwX2RtYV9mcmVlKGRtYWNoX3QgY2hhbm5lbCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqY2xpZW50KQoraW50IHMzYzI0MTBfZG1hX2ZyZWUodW5zaWduZWQgaW50IGNoYW5uZWwsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IGxvb2t1cF9kbWFfY2hhbm5lbChjaGFubmVsKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtOTk1LDcgKzk5Myw3IEBACiB9CiAKIGludAotczNjMjQxMF9kbWFfY3RybChkbWFjaF90IGNoYW5uZWwsIGVudW0gczNjMjQxMF9jaGFuX29wIG9wKQorczNjMjQxMF9kbWFfY3RybCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgZW51bSBzM2MyNDEwX2NoYW5fb3Agb3ApCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBsb29rdXBfZG1hX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTEwNDMsNyArMTA0MSw3IEBACiAgKiBkY29uOiAgICAgICAgIGJhc2UgdmFsdWUgb2YgdGhlIERDT054IHJlZ2lzdGVyCiAqLwogCi1pbnQgczNjMjQxMF9kbWFfY29uZmlnKGRtYWNoX3QgY2hhbm5lbCwKK2ludCBzM2MyNDEwX2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsCiAJCSAgICAgICBpbnQgeGZlcnVuaXQsCiAJCSAgICAgICBpbnQgZGNvbikKIHsKQEAgLTEwOTIsNyArMTA5MCw3IEBACiAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfY29uZmlnKTsKIAotaW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKGRtYWNoX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50IHMzYzI0MTBfZG1hX3NldGZsYWdzKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBsb29rdXBfZG1hX2NoYW5uZWwoY2hhbm5lbCk7CiAKQEAgLTExMTMsNyArMTExMSw3IEBACiAgKiBpcnE/CiAqLwogCi1pbnQgczNjMjQxMF9kbWFfc2V0X29wZm4oZG1hY2hfdCBjaGFubmVsLCBzM2MyNDEwX2RtYV9vcGZuX3QgcnRuKQoraW50IHMzYzI0MTBfZG1hX3NldF9vcGZuKHVuc2lnbmVkIGludCBjaGFubmVsLCBzM2MyNDEwX2RtYV9vcGZuX3QgcnRuKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gbG9va3VwX2RtYV9jaGFubmVsKGNoYW5uZWwpOwogCkBAIC0xMTI5LDcgKzExMjcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX3NldF9vcGZuKTsKIAotaW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihkbWFjaF90IGNoYW5uZWwsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pCitpbnQgczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHVuc2lnbmVkIGludCBjaGFubmVsLCBzM2MyNDEwX2RtYV9jYmZuX3QgcnRuKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gbG9va3VwX2RtYV9jaGFubmVsKGNoYW5uZWwpOwogCkBAIC0xMjE5LDcgKzEyMTcsNyBAQAogICogcmV0dXJucyB0aGUgY3VycmVudCB0cmFuc2ZlciBwb2ludHMgZm9yIHRoZSBkbWEgc291cmNlIGFuZCBkZXN0aW5hdGlvbgogKi8KIAotaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGRtYWNoX3QgY2hhbm5lbCwgZG1hX2FkZHJfdCAqc3JjLCBkbWFfYWRkcl90ICpkc3QpCitpbnQgczNjMjQxMF9kbWFfZ2V0cG9zaXRpb24odW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogIAlzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiA9IGxvb2t1cF9kbWFfY2hhbm5lbChjaGFubmVsKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKaW5kZXggM2NhZWM2Yi4uZjk1YzZjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCkBAIC0xOSwxMDQgKzE5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi1zdHJ1Y3QgczNjMjR4eF9ncGlvX2NoaXAgewotCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKLQl2b2lkIF9faW9tZW0JCSpiYXNlOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4eF9ncGlvX2NoaXAgKnRvX3MzY19jaGlwKHN0cnVjdCBncGlvX2NoaXAgKmdwYykKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGdwYywgc3RydWN0IHMzYzI0eHhfZ3Bpb19jaGlwLCBjaGlwKTsKLX0KLQotLyogdGhlc2Ugcm91dGluZXMgYXJlIGV4cG9ydGVkIGZvciB1c2UgYnkgb3RoZXIgcGFydHMgb2YgdGhlIHBsYXRmb3JtCi0gKiBhbmQgc3lzdGVtIHN1cHBvcnQsIGJ1dCBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgYnkgdGhlCi0gKiBkcml2ZXJzIHRoZW1zZXZsZXMuCi0gKi8KLQotc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBzM2MyNHh4X2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19jaGlwKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDAwKTsKLQljb24gJj0gfigzIDw8IChvZmZzZXQgKiAyKSk7Ci0JY29uIHw9IChTM0MyNDEwX0dQSU9fT1VUUFVUICYgMHhmKSA8PCAob2Zmc2V0ICogMik7Ci0KLQlfX3Jhd193cml0ZWwoY29uLCBiYXNlICsgMHgwMCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHMzYzI0eHhfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2NoaXAoY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCXVuc2lnbmVkIGxvbmcgY29uOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOwotCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKLQlpZiAodmFsdWUpCi0JCWRhdCB8PSAxIDw8IG9mZnNldDsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7Ci0JY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOwotCWNvbiB8PSAoUzNDMjQxMF9HUElPX09VVFBVVCAmIDB4ZikgPDwgKG9mZnNldCAqIDIpOwotCi0JX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgczNjMjR4eF9ncGlvbGliX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2MyNHh4X2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19jaGlwKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDA0KTsKLQlkYXQgJj0gfigxIDw8IG9mZnNldCk7Ci0JaWYgKHZhbHVlKQotCQlkYXQgfD0gMSA8PCBvZmZzZXQ7Ci0JX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIDB4MDQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb2xpYl9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBzM2MyNHh4X2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19jaGlwKGNoaXApOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwob3VyY2hpcC0+YmFzZSArIDB4MDQpOwotCXZhbCA+Pj0gb2Zmc2V0OwotCXZhbCAmPSAxOwotCi0JcmV0dXJuIHZhbDsKLX0KLQogc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfYmFua2FfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewogCXJldHVybiAtRUlOVkFMOwpAQCAtMTI1LDcgKzMzLDcgQEAKIHN0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmthX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAogCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgczNjMjR4eF9ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfY2hpcChjaGlwKTsKKwlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGRhdDsKQEAgLTE1MSw3ICs1OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ncGlvX2NoaXAgZ3Bpb3NbXSA9IHsKK3N0cnVjdCBzM2NfZ3Bpb19jaGlwIHMzYzI0eHhfZ3Bpb3NbXSA9IHsKIAlbMF0gPSB7CiAJCS5iYXNlCT0gUzNDMjRYWF9HUElPX0JBU0UoUzNDMjQxMF9HUEEwKSwKIAkJLmNoaXAJPSB7CkBAIC0xNjEsOCArNjksNiBAQAogCQkJLm5ncGlvCQkJPSAyNCwKIAkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfYmFua2FfaW5wdXQsCiAJCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rYV9vdXRwdXQsCi0JCQkuc2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfc2V0LAotCQkJLmdldAkJCT0gczNjMjR4eF9ncGlvbGliX2dldCwKIAkJfSwKIAl9LAogCVsxXSA9IHsKQEAgLTE3MiwxMCArNzgsNiBAQAogCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkJCS5sYWJlbAkJCT0gIkdQSU9CIiwKIAkJCS5uZ3BpbwkJCT0gMTYsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gczNjMjR4eF9ncGlvbGliX2lucHV0LAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBzM2MyNHh4X2dwaW9saWJfb3V0cHV0LAotCQkJLnNldAkJCT0gczNjMjR4eF9ncGlvbGliX3NldCwKLQkJCS5nZXQJCQk9IHMzYzI0eHhfZ3Bpb2xpYl9nZXQsCiAJCX0sCiAJfSwKIAlbMl0gPSB7CkBAIC0xODUsMTAgKzg3LDYgQEAKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubGFiZWwJCQk9ICJHUElPQyIsCiAJCQkubmdwaW8JCQk9IDE2LAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9pbnB1dCwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gczNjMjR4eF9ncGlvbGliX291dHB1dCwKLQkJCS5zZXQJCQk9IHMzYzI0eHhfZ3Bpb2xpYl9zZXQsCi0JCQkuZ2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfZ2V0LAogCQl9LAogCX0sCiAJWzNdID0gewpAQCAtMTk4LDEwICs5Niw2IEBACiAJCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCQkJLmxhYmVsCQkJPSAiR1BJT0QiLAogCQkJLm5ncGlvCQkJPSAxNiwKLQkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfaW5wdXQsCi0JCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9vdXRwdXQsCi0JCQkuc2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfc2V0LAotCQkJLmdldAkJCT0gczNjMjR4eF9ncGlvbGliX2dldCwKIAkJfSwKIAl9LAogCVs0XSA9IHsKQEAgLTIxMSwxMCArMTA1LDYgQEAKIAkJCS5sYWJlbAkJCT0gIkdQSU9FIiwKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubmdwaW8JCQk9IDE2LAotCQkJLmRpcmVjdGlvbl9pbnB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9pbnB1dCwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gczNjMjR4eF9ncGlvbGliX291dHB1dCwKLQkJCS5zZXQJCQk9IHMzYzI0eHhfZ3Bpb2xpYl9zZXQsCi0JCQkuZ2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfZ2V0LAogCQl9LAogCX0sCiAJWzVdID0gewpAQCAtMjI0LDEwICsxMTQsNiBAQAogCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkJCS5sYWJlbAkJCT0gIkdQSU9GIiwKIAkJCS5uZ3BpbwkJCT0gOCwKLQkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfaW5wdXQsCi0JCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9vdXRwdXQsCi0JCQkuc2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfc2V0LAotCQkJLmdldAkJCT0gczNjMjR4eF9ncGlvbGliX2dldCwKIAkJfSwKIAl9LAogCVs2XSA9IHsKQEAgLTIzNywyMSArMTIzLDE3IEBACiAJCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCQkJLmxhYmVsCQkJPSAiR1BJT0ciLAogCQkJLm5ncGlvCQkJPSAxMCwKLQkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfaW5wdXQsCi0JCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9vdXRwdXQsCi0JCQkuc2V0CQkJPSBzM2MyNHh4X2dwaW9saWJfc2V0LAotCQkJLmdldAkJCT0gczNjMjR4eF9ncGlvbGliX2dldCwKIAkJfSwKIAl9LAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgczNjMjR4eF9ncGlvbGliX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgczNjMjR4eF9ncGlvX2NoaXAgKmNoaXAgPSBncGlvczsKKwlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzYzI0eHhfZ3Bpb3M7CiAJaW50IGdwbjsKIAotCWZvciAoZ3BuID0gMDsgZ3BuIDwgQVJSQVlfU0laRShncGlvcyk7IGdwbisrLCBjaGlwKyspCi0JCWdwaW9jaGlwX2FkZCgmY2hpcC0+Y2hpcCk7CisJZm9yIChncG4gPSAwOyBncG4gPCBBUlJBWV9TSVpFKHMzYzI0eHhfZ3Bpb3MpOyBncG4rKywgY2hpcCsrKQorCQlzM2NfZ3Bpb2xpYl9hZGQoY2hpcCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODdkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzI0eHggLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKKyAqLworCisvKioKKyAqIHB3bV9jZmdfc3JjX2lzX3RjbGsoKSAtIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtdXggY29uZmlnIGlzIGEgdGNsaworICogQGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAorICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCit7CisJcmV0dXJuIHRjZmcgPT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSzsKK30KKworLyoqCisgKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKKyAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KKyAqCisgKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCisgKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQoreworCXJldHVybiAxIDw8ICgxICsgdGNmZzEpOworfQorCisvKioKKyAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCisgKgorICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgorICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgorICoKKyAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKK3sKKwlyZXR1cm4gaWxvZzIoZGl2KSAtIDE7Cit9CisKKyNkZWZpbmUgUzNDX1RDRkcxX01VWF9UQ0xLIFMzQzI0MTBfVENGRzFfTVVYX1RDTEsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWFwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjhlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvbWFwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjRYWCAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1MzQzI0WFhfTUFQX0gKKyNkZWZpbmUgX19BU01fUExBVF9TM0MyNFhYX01BUF9ICisKKy8qIGludGVycnVwdCBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCB0aGluZyB3ZSBwdXQgaW4sIHRvIG1ha2UKKyAqIHRoZSBhc3NlbWJseSBjb2RlIGZvciB0aGUgaXJxIGRldGVjdGlvbiBlYXNpZXIKKyAqLworI2RlZmluZSBTM0MyNFhYX1ZBX0lSUQkgICBTM0NfVkFfSVJRCisjZGVmaW5lIFMzQzI0MTBfUEFfSVJRCSAgICgweDRBMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX0lSUQkgICBTWl8xTQorCisvKiBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUzNDMjRYWF9WQV9NRU1DVFJMIFMzQ19WQV9NRU0KKyNkZWZpbmUgUzNDMjQxMF9QQV9NRU1DVFJMICgweDQ4MDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX01FTUNUUkwgU1pfMU0KKworLyogVUFSVHMgKi8KKyNkZWZpbmUgUzNDMjRYWF9WQV9VQVJUCSAgIFMzQ19WQV9VQVJUCisjZGVmaW5lIFMzQzI0MTBfUEFfVUFSVAkgICAoMHg1MDAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9TWl9VQVJUCSAgIFNaXzFNCisjZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkgICAoMHg0MDAwKQorCisvKiBUaW1lcnMgKi8KKyNkZWZpbmUgUzNDMjRYWF9WQV9USU1FUiAgIFMzQ19WQV9USU1FUgorI2RlZmluZSBTM0MyNDEwX1BBX1RJTUVSICAgKDB4NTEwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfVElNRVIgICBTWl8xTQorCisvKiBDbG9jayBhbmQgUG93ZXIgbWFuYWdlbWVudCAqLworI2RlZmluZSBTM0MyNFhYX1ZBX0NMS1BXUiAgUzNDX1ZBX1NZUworI2RlZmluZSBTM0MyNFhYX1NaX0NMS1BXUiAgU1pfMU0KKworLyogVVNCIERldmljZSBwb3J0ICovCisjZGVmaW5lIFMzQzI0MTBfUEFfVVNCREVWICAoMHg1MjAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9TWl9VU0JERVYgIFNaXzFNCisKKy8qIFdhdGNoZG9nICovCisjZGVmaW5lIFMzQzI0WFhfVkFfV0FUQ0hET0cgUzNDX1ZBX1dBVENIRE9HCisjZGVmaW5lIFMzQzI0MTBfUEFfV0FUQ0hET0cgKDB4NTMwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfV0FUQ0hET0cgU1pfMU0KKworLyogU3RhbmRhcmQgc2l6ZSBkZWZpbml0aW9ucyBmb3IgcGVyaXBoZXJhbCBibG9ja3MuICovCisKKyNkZWZpbmUgUzNDMjRYWF9TWl9JSVMJCVNaXzFNCisjZGVmaW5lIFMzQzI0WFhfU1pfQURDCQlTWl8xTQorI2RlZmluZSBTM0MyNFhYX1NaX1NQSQkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9TREkJCVNaXzFNCisjZGVmaW5lIFMzQzI0WFhfU1pfTkFORAkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9VU0JIT1NUCVNaXzFNCisKKy8qIEdQSU8gcG9ydHMgKi8KKworLyogdGhlIGNhbGN1bGF0aW9uIGZvciB0aGUgVkEgb2YgdGhpcyBtdXN0IGVuc3VyZSB0aGF0CisgKiBpdCBpcyB0aGUgc2FtZSBkaXN0YW5jZSBhcGFydCBmcm9tIHRoZSBVQVJUIGluIHRoZQorICogcGhzeWljYWwgYWRkcmVzcyBzcGFjZSwgYXMgdGhlIGluaXRpYWwgbWFwcGluZyBmb3IgdGhlIElPCisgKiBpcyBkb25lIGFzIGEgMToxIG1hcGluZy4gVGhpcyBwdXRzIGl0IChjdXJyZW50bHkpIGF0CisgKiAweEZBODAwMDAwLCB3aGljaCBpcyBub3QgaW4gdGhlIHdheSBvZiBhbnkgY3VycmVudCBtYXBwaW5nCisgKiBieSB0aGUgYmFzZSBzeXN0ZW0uCisqLworCisjZGVmaW5lIFMzQzI0MTBfUEFfR1BJTwkgICAoMHg1NjAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPCSAgICgoUzNDMjRYWF9QQV9HUElPIC0gUzNDMjRYWF9QQV9VQVJUKSArIFMzQzI0WFhfVkFfVUFSVCkKKyNkZWZpbmUgUzNDMjRYWF9TWl9HUElPCSAgIFNaXzFNCisKKworLyogSVNBIHN0eWxlIElPLCBmb3IgZWFjaCBtYWNoaW5lIHRvIHNvcnQgb3V0IG1hcHBpbmdzIGZvciwgaWYgaXQKKyAqIGltcGxlbWVudHMgaXQuIFdlIHJlc2VydmUgdHdvIDE2TSByZWdpb25zIGZvciBJU0EuCisgKi8KKworI2RlZmluZSBTM0MyNFhYX1ZBX0lTQV9XT1JEICBTM0MyNDEwX0FERFIoMHgwMjAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9WQV9JU0FfQllURSAgUzNDMjQxMF9BRERSKDB4MDMwMDAwMDApCisKKy8qIGRlYWwgd2l0aCB0aGUgcmVnaXN0ZXJzIHRoYXQgbW92ZSB1bmRlciB0aGUgMjQxMi8yNDEzICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTMpCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIHZvaWQgX19pb21lbSAqczNjMjR4eF92YV9ncGlvMjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMl9PTkxZCisjZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgKFMzQzI0WFhfVkFfR1BJTyArIDB4MTApCisjZWxzZQorI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIHMzYzI0eHhfdmFfZ3BpbzIKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgczNjMjR4eF92YV9ncGlvMiBTM0MyNFhYX1ZBX0dQSU8KKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiBTM0MyNFhYX1ZBX0dQSU8KKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fUExBVF9TM0MyNFhYX01BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L21jaS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9tY2kuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhOGJmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKQEAgLTAsMCArMSwzNyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDMjR4eCAtIGNvbW1vbiBwbGwgcmVnaXN0ZXJzIGFuZCBjb2RlCisgKi8KKworI2RlZmluZSBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQJMTIKKyNkZWZpbmUgUzNDMjRYWF9QTExDT05fUERJVlNISUZUCTQKKyNkZWZpbmUgUzNDMjRYWF9QTExDT05fU0RJVlNISUZUCTAKKyNkZWZpbmUgUzNDMjRYWF9QTExDT05fTURJVk1BU0sJCSgoMTw8KDErKDE5LTEyKSkpLTEpCisjZGVmaW5lIFMzQzI0WFhfUExMQ09OX1BESVZNQVNLCQkoKDE8PDUpLTEpCisjZGVmaW5lIFMzQzI0WFhfUExMQ09OX1NESVZNQVNLCQkzCisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK3MzYzI0eHhfZ2V0X3BsbCh1bnNpZ25lZCBpbnQgcGxsdmFsLCB1bnNpZ25lZCBpbnQgYmFzZWNsaykKK3sKKwl1bnNpZ25lZCBpbnQgbWRpdiwgcGRpdiwgc2RpdjsKKwl1aW50NjRfdCBmdmNvOworCisJbWRpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQ7CisJcGRpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9QRElWU0hJRlQ7CisJc2RpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9TRElWU0hJRlQ7CisKKwltZGl2ICY9IFMzQzI0WFhfUExMQ09OX01ESVZNQVNLOworCXBkaXYgJj0gUzNDMjRYWF9QTExDT05fUERJVk1BU0s7CisJc2RpdiAmPSBTM0MyNFhYX1BMTENPTl9TRElWTUFTSzsKKworCWZ2Y28gPSAodWludDY0X3QpYmFzZWNsayAqIChtZGl2ICsgOCk7CisJZG9fZGl2KGZ2Y28sIChwZGl2ICsgMikgPDwgc2Rpdik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludClmdmNvOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9yZWdzLXNwaS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXNwaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9yZWdzLXVkYy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3JlZ3MtdWRjLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy11ZGMuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDAwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MDAuaAppbmRleCAzYTVhMTY4Li5iM2ZlYWVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MDAuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MDAuaApAQCAtMTcsNyArMTcsNyBAQAogCiBleHRlcm4gIGludCBzM2MyNDAwX2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHMzYzI0MDBfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2MyNDAwX21hcF9pbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgczNjMjQwMF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaAppbmRleCAzY2QxZWM2Li5hOWFjOWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaApAQCAtMTUsNyArMTUsNyBAQAogCiBleHRlcm4gIGludCBzM2MyNDEwX2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHMzYzI0MTBfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2MyNDEwX21hcF9pbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEyLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaAppbmRleCAzZWM5NzY4Li5iYjE1ZDNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaApAQCAtMTQsNyArMTQsNyBAQAogCiBleHRlcm4gIGludCBzM2MyNDEyX2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHMzYzI0MTJfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2MyNDEyX21hcF9pbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgczNjMjQxMl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDQzLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaAppbmRleCAxMWQ4M2I1Li44MTViMTA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaApAQCAtMTYsNyArMTYsNyBAQAogCiBleHRlcm4gIGludCBzM2MyNDQzX2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIHMzYzI0NDNfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2MyNDQzX21hcF9pbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgczNjMjQ0M19pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC91ZGMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvdWRjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvdWRjLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvdWRjLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYwppbmRleCA5NjNmN2E0Li4wMTkyZWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCkBAIC02Miw2ICs2Miw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPHBsYXQvcmVncy1pcnF0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKaW5kZXggOGVmYjU3YS4uMzRlZjE4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCkBAIC03NiwxMSArNzUsMTMgQEAKIAlTQVZFX0lURU0oUzNDMjQxMF9CQU5LQ09ONCksCiAJU0FWRV9JVEVNKFMzQzI0MTBfQkFOS0NPTjUpLAogCisjaWZuZGVmIENPTkZJR19DUFVfRlJFUQogCVNBVkVfSVRFTShTM0MyNDEwX0NMS0RJVk4pLAogCVNBVkVfSVRFTShTM0MyNDEwX01QTExDT04pLAorCVNBVkVfSVRFTShTM0MyNDEwX1JFRlJFU0gpLAorI2VuZGlmCiAJU0FWRV9JVEVNKFMzQzI0MTBfVVBMTENPTiksCiAJU0FWRV9JVEVNKFMzQzI0MTBfQ0xLU0xPVyksCi0JU0FWRV9JVEVNKFMzQzI0MTBfUkVGUkVTSCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW9fc2xlZXAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQxMC1jbG9jay5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQxMC1jbG9jay5jCmluZGV4IDRlMDc5NDMuLmI2MWJkYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDEwLWNsb2NrLmMKQEAgLTI3Miw1ICsyNzIsNiBAQAogCSAgICAgICAoY2xrc2xvdyAmIFMzQzI0MTBfQ0xLU0xPV19NUExMX09GRikgPyAib2ZmIiA6ICJvbiIsCiAJICAgICAgIChjbGtzbG93ICYgUzNDMjQxMF9DTEtTTE9XX1VDTEtfT0ZGKSA/ICJvZmYiIDogIm9uIik7CiAKKwlzM2NfcHdtY2xrX2luaXQoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC1jbG9jay5jCmluZGV4IDdjMDk3NzMuLmRkZTQxZjE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC1jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LWNsb2NrLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKQEAgLTEwMiwxMyArMTAxLDEzIEBACiAJaWYgKGNsa19nZXRfcmF0ZShjbG9ja191cGxsKSA+ICg5NCAqIE1IWikpIHsKIAkJY2xrX3VzYl9idXMucmF0ZSA9IGNsa19nZXRfcmF0ZShjbG9ja191cGxsKSAvIDI7CiAKLQkJbXV0ZXhfbG9jaygmY2xvY2tzX211dGV4KTsKKwkJc3Bpbl9sb2NrKCZjbG9ja3NfbG9jayk7CiAKIAkJY2xrZGl2biA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLRElWTik7CiAJCWNsa2Rpdm4gfD0gUzNDMjQ0MF9DTEtESVZOX1VDTEs7CiAJCV9fcmF3X3dyaXRlbChjbGtkaXZuLCBTM0MyNDEwX0NMS0RJVk4pOwogCi0JCW11dGV4X3VubG9jaygmY2xvY2tzX211dGV4KTsKKwkJc3Bpbl91bmxvY2soJmNsb2Nrc19sb2NrKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC5jCmluZGV4IGMwMzQ0ZmEuLmMxZGU2YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHguYwpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KQEAgLTQyLDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHMzYzI0NHhfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKIAlJT0RFU0NfRU5UKENMS1BXUiksCkBAIC01NiwzMiArNTksMzQgQEAKIAlzM2MyNHh4X2luaXRfdWFydGRldnMoInMzYzI0NDAtdWFydCIsIHMzYzI0MTBfdWFydF9yZXNvdXJjZXMsIGNmZywgbm8pOwogfQogCi12b2lkIF9faW5pdCBzM2MyNDR4X21hcF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpCit2b2lkIF9faW5pdCBzM2MyNDR4X21hcF9pbyh2b2lkKQogewogCS8qIHJlZ2lzdGVyIG91ciBpby10YWJsZXMgKi8KIAogCWlvdGFibGVfaW5pdChzM2MyNDR4X2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDR4X2lvZGVzYykpOwotCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIHNpemUpOwogCiAJLyogcmVuYW1lIGFueSBwZXJpcGhlcmFscyB1c2VkIGRpZmZlcmluZyBmcm9tIHRoZSBzM2MyNDEwICovCiAKIAlzM2NfZGV2aWNlX3NkaS5uYW1lICA9ICJzM2MyNDQwLXNkaSI7Ci0JczNjX2RldmljZV9pMmMubmFtZSAgPSAiczNjMjQ0MC1pMmMiOworCXMzY19kZXZpY2VfaTJjMC5uYW1lICA9ICJzM2MyNDQwLWkyYyI7CiAJczNjX2RldmljZV9uYW5kLm5hbWUgPSAiczNjMjQ0MC1uYW5kIjsKIAlzM2NfZGV2aWNlX3VzYmdhZGdldC5uYW1lID0gInMzYzI0NDAtdXNiZ2FkZ2V0IjsKIH0KIAotdm9pZCBfX2luaXQgczNjMjQ0eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3ZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQ0eF9zZXR1cF9jbG9ja3Modm9pZCkKIHsKKwlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKIAl1bnNpZ25lZCBsb25nIGNsa2RpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWRpdjsKKwl1bnNpZ25lZCBsb25nIHh0YWw7CiAJdW5zaWduZWQgbG9uZyBoY2xrLCBmY2xrLCBwY2xrOwogCWludCBoZGl2ID0gMTsKIAotCS8qIG5vdyB3ZSd2ZSBnb3Qgb3VyIG1hY2hpbmUgYml0cyBpbml0aWFsaXNlZCwgd29yayBvdXQgd2hhdAotCSAqIGNsb2NrcyB3ZSd2ZSBnb3QgKi8KKwl4dGFsX2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKwl4dGFsID0gY2xrX2dldF9yYXRlKHh0YWxfY2xrKTsKKwljbGtfcHV0KHh0YWxfY2xrKTsKIAotCWZjbGsgPSBzM2MyNDEwX2dldF9wbGwoX19yYXdfcmVhZGwoUzNDMjQxMF9NUExMQ09OKSwgeHRhbCkgKiAyOworCWZjbGsgPSBzM2MyNHh4X2dldF9wbGwoX19yYXdfcmVhZGwoUzNDMjQxMF9NUExMQ09OKSwgeHRhbCkgKiAyOwogCiAJY2xrZGl2ID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtESVZOKTsKIAljYW1kaXYgPSBfX3Jhd19yZWFkbChTM0MyNDQwX0NBTURJVk4pOwpAQCAtMTA3LDE4ICsxMTIsMjQgQEAKIAl9CiAKIAloY2xrID0gZmNsayAvIGhkaXY7Ci0JcGNsayA9IGhjbGsgLyAoKGNsa2RpdiAmIFMzQzI0NDBfQ0xLRElWTl9QRElWTik/IDI6MSk7CisJcGNsayA9IGhjbGsgLyAoKGNsa2RpdiAmIFMzQzI0NDBfQ0xLRElWTl9QRElWTikgPyAyIDogMSk7CiAKIAkvKiBwcmludCBicmllZiBzdW1tYXJ5IG9mIGNsb2NrcywgZXRjICovCiAKIAlwcmludGsoIlMzQzI0NFg6IGNvcmUgJWxkLiUwM2xkIE1IeiwgbWVtb3J5ICVsZC4lMDNsZCBNSHosIHBlcmlwaGVyYWwgJWxkLiUwM2xkIE1IelxuIiwKIAkgICAgICAgcHJpbnRfbWh6KGZjbGspLCBwcmludF9taHooaGNsayksIHByaW50X21oeihwY2xrKSk7CiAKKwlzM2MyNHh4X3NldHVwX2Nsb2NrcyhmY2xrLCBoY2xrLCBwY2xrKTsKK30KKwordm9pZCBfX2luaXQgczNjMjQ0eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCkKK3sKIAkvKiBpbml0aWFsaXNlIHRoZSBjbG9ja3MgaGVyZSwgdG8gYWxsb3cgb3RoZXIgdGhpbmdzIGxpa2UgdGhlCiAJICogY29uc29sZSB0byB1c2UgdGhlbSwgYW5kIHRvIGFkZCBuZXcgb25lcyBhZnRlciB0aGUgaW5pdGlhbGlzYXRpb24KIAkgKi8KIAotCXMzYzI0eHhfc2V0dXBfY2xvY2tzKHh0YWwsIGZjbGssIGhjbGssIHBjbGspOworCXMzYzI0eHhfcmVnaXN0ZXJfYmFzZWNsb2Nrcyh4dGFsKTsKKwlzM2MyNDR4X3NldHVwX2Nsb2NrcygpOwogCXMzYzI0MTBfYmFzZWNsa19hZGQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHguaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LmgKaW5kZXggZjhlZDE3Ni4uNmFhYjVlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHguaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC5oCkBAIC0xMiw3ICsxMiw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDIpCiAKLWV4dGVybiB2b2lkIHMzYzI0NHhfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzM2MyNDR4X21hcF9pbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgczNjMjQ0eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NldHVwLWkyYy5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NldHVwLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmI3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc2V0dXAtaTJjLmMKQEAgLTAsMCArMSwyNSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NldHVwLWkyYy5jCisgKgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjRYWCBCYXNlIHNldHVwIGZvciBpMmMgZGV2aWNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKworI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CisKK3ZvaWQgczNjX2kyYzBfY2ZnX2dwaW8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUxNSwgUzNDMjQxMF9HUEUxNV9JSUNTREEpOworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUxNCwgUzNDMjQxMF9HUEUxNF9JSUNTQ0wpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NwaS1idXMwLWdwZTExXzEyXzEzLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc3BpLWJ1czAtZ3BlMTFfMTJfMTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQwM2NiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NwaS1idXMwLWdwZTExXzEyXzEzLmMKQEAgLTAsMCArMSwzNyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NwaS1idXMwLWdwZTExXzEyXzEzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0WFggU1BJIC0gZ3BpbyBjb25maWd1cmF0aW9uIGZvciBidXMgMCBvbiBncGUxMSwxMiwxMworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPG1hY2gvc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKwordm9pZCBzM2MyNHh4X3NwaV9ncGlvY2ZnX2J1czBfZ3BlMTFfMTJfMTMoc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnNwaSwKKwkJCQkJICBpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTEzLCBTM0MyNDEwX0dQRTEzX1NQSUNMSzApOworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTIsIFMzQzI0MTBfR1BFMTJfU1BJTU9TSTApOworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTEsIFMzQzI0MTBfR1BFMTFfU1BJTUlTTzApOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFMTEsIDApOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFMTMsIDApOworCX0gZWxzZSB7CisJCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUxMywgUzNDMjQxMF9HUElPX0lOUFVUKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTExLCBTM0MyNDEwX0dQSU9fSU5QVVQpOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFMTEsIDEpOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFMTIsIDEpOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFMTMsIDEpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zcGktYnVzMS1ncGc1XzZfNy5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NwaS1idXMxLWdwZzVfNl83LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjY2Q0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zcGktYnVzMS1ncGc1XzZfNy5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zcGktYnVzMC1ncGc1XzZfNy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNFhYIFNQSSAtIGdwaW8gY29uZmlndXJhdGlvbiBmb3IgYnVzIDEgb24gZ3BnNSw2LDcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxtYWNoL3NwaS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CisKK3ZvaWQgczNjMjR4eF9zcGlfZ3Bpb2NmZ19idXMxX2dwZzVfNl83KHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksCisJCQkJICAgICAgIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BHNywgUzNDMjQxMF9HUEc3X1NQSUNMSzEpOworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BHNiwgUzNDMjQxMF9HUEc2X1NQSU1PU0kxKTsKKwkJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRzUsIFMzQzI0MTBfR1BHNV9TUElNSVNPMSk7CisJCXMzYzI0MTBfZ3Bpb19wdWxsdXAoUzNDMjQxMF9HUEc1LCAwKTsKKwkJczNjMjQxMF9ncGlvX3B1bGx1cChTM0MyNDEwX0dQRzYsIDApOworCX0gZWxzZSB7CisJCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEc3LCBTM0MyNDEwX0dQSU9fSU5QVVQpOworCQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BHNSwgUzNDMjQxMF9HUElPX0lOUFVUKTsKKwkJczNjMjQxMF9ncGlvX3B1bGx1cChTM0MyNDEwX0dQRzUsIDEpOworCQlzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BHNiwgMSk7CisJCXMzYzI0MTBfZ3Bpb19wdWxsdXAoUzNDMjQxMF9HUEc3LCAxKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Mzc1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvS2NvbmZpZwpAQCAtMCwwICsxLDYyIEBACisjIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9LY29uZmlnCisjCisjIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisjIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworIwlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyCisKK2NvbmZpZyBQTEFUX1MzQzY0WFgKKwlib29sCisJZGVwZW5kcyBvbiBBUkNIX1MzQzY0WFgKKwlkZWZhdWx0IHkKKwlzZWxlY3QgQ1BVX1Y2CisJc2VsZWN0IFBMQVRfUzNDCisJc2VsZWN0IEFSTV9WSUMKKwlzZWxlY3QgTk9fSU9QT1JUCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IFMzQ19HUElPX1RSQUNLCisJc2VsZWN0IFMzQ19HUElPX1BVTExfVVBET1dOCisJc2VsZWN0IFMzQ19HUElPX0NGR19TM0MyNFhYCisJc2VsZWN0IFMzQ19HUElPX0NGR19TM0M2NFhYCisJaGVscAorCSAgQmFzZSBwbGF0Zm9ybSBjb2RlIGZvciBhbnkgU2Ftc3VuZyBTM0M2NFhYIGRldmljZQorCitpZiBQTEFUX1MzQzY0WFgKKworIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgc2hhcmVkIGJ5IGFsbCBTM0M2NFhYIGltcGxlbWVudGF0aW9ucworCitjb25maWcgQ1BVX1MzQzY0MDBfSU5JVAorCWJvb2wKKwloZWxwCisJICBDb21tb24gaW5pdGlhbGlzYXRpb24gY29kZSBmb3IgdGhlIFMzQzY0MDAgdGhhdCBpcyBzaGFyZWQKKwkgIGJ5IG90aGVyIENQVXMgaW4gdGhlIHNlcmllcywgc3VjaCBhcyB0aGUgUzNDNjQxMC4KKworY29uZmlnIENQVV9TM0M2NDAwX0NMT0NLCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBjbG9jayBzdXBwb3J0IGNvZGUgZm9yIHRoZSBTM0M2NDAwIHRoYXQgaXMgc2hhcmVkCisJICBieSBvdGhlciBDUFVzIGluIHRoZSBzZXJpZXMsIHN1Y2ggYXMgdGhlIFMzQzY0MTAuCisKKyMgcGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIHNldHVwCisKK2NvbmZpZyBTM0M2NFhYX1NFVFVQX0kyQzAKKwlib29sCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMC4KKworCSAgTm90ZSwgY3VycmVudGx5IHNpbmNlIGkyYzAgaXMgYWx3YXlzIGNvbXBpbGVkLCB0aGlzIHNldHVwIGhlbHBlcgorCSAgaXMgYWx3YXlzIGNvbXBpbGVkIHdpdGggaXQuCisKK2NvbmZpZyBTM0M2NFhYX1NFVFVQX0kyQzEKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMS4KKworY29uZmlnIFMzQzY0WFhfU0VUVVBfRkJfMjRCUFAKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFMzQzY0WFggd2l0aCBhbiAyNGJwcCBSR0IgZGlzcGxheSBoZWxwZXIuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2ZDc5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDMxIEBACisjIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9NYWtlZmlsZQorIworIyBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorIyBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIKKworb2JqLXkJCQkJOj0KK29iai1tCQkJCTo9CitvYmotbgkJCQk6PSBkdW1teS5vCitvYmotCQkJCTo9CisKKyMgQ29yZSBmaWxlcworCitvYmoteQkJCQkrPSBkZXYtdWFydC5vCitvYmoteQkJCQkrPSBjcHUubworb2JqLXkJCQkJKz0gaXJxLm8KK29iai15CQkJCSs9IGlycS1laW50Lm8KK29iai15CQkJCSs9IGNsb2NrLm8KK29iai15CQkJCSs9IGdwaW9saWIubworCisjIENQVSBzdXBwb3J0CisKK29iai0kKENPTkZJR19DUFVfUzNDNjQwMF9JTklUKQkrPSBzM2M2NDAwLWluaXQubworb2JqLSQoQ09ORklHX0NQVV9TM0M2NDAwX0NMT0NLKQkrPSBzM2M2NDAwLWNsb2NrLm8KKworIyBEZXZpY2Ugc2V0dXAKKworb2JqLSQoQ09ORklHX1MzQzY0WFhfU0VUVVBfSTJDMCkgKz0gc2V0dXAtaTJjMC5vCitvYmotJChDT05GSUdfUzNDNjRYWF9TRVRVUF9JMkMxKSArPSBzZXR1cC1pMmMxLm8KK29iai0kKENPTkZJR19TM0M2NFhYX1NFVFVQX0ZCXzI0QlBQKSArPSBzZXR1cC1mYi0yNGJwcC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9jbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmM5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvY2xvY2suYwpAQCAtMCwwICsxLDI4MSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2Nsb2NrLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0WFggQmFzZSBjbG9jayBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLXN5cy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorCitzdHJ1Y3QgY2xrIGNsa18yN20gPSB7CisJLm5hbWUJCT0gImNsa18yN20iLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAyNzAwMDAwMCwKK307CisKK3N0YXRpYyBpbnQgY2xrXzQ4bV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwkvKiBjYW4ndCByZWx5IG9uIGNsb2NrIGxvY2ssIHRoaXMgcmVnaXN0ZXIgaGFzIG90aGVyIHVzYWdlcyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFMzQzY0WFhfT1RIRVJTKTsKKwlpZiAoZW5hYmxlKQorCQl2YWwgfD0gUzNDNjRYWF9PVEhFUlNfVVNCTUFTSzsKKwllbHNlCisJCXZhbCAmPSB+UzNDNjRYWF9PVEhFUlNfVVNCTUFTSzsKKworCV9fcmF3X3dyaXRlbCh2YWwsIFMzQzY0WFhfT1RIRVJTKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNsayBjbGtfNDhtID0geworCS5uYW1lCQk9ICJjbGtfNDhtIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLmVuYWJsZQkJPSBjbGtfNDhtX2N0cmwsCit9OworCitzdGF0aWMgaW50IGlubGluZSBzM2M2NHh4X2dhdGUodm9pZCBfX2lvbWVtICpyZWcsCisJCQkJc3RydWN0IGNsayAqY2xrLAorCQkJCWludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IGN0cmxiaXQgPSBjbGstPmN0cmxiaXQ7CisJdTMyIGNvbjsKKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7CisKKwlpZiAoZW5hYmxlKQorCQljb24gfD0gY3RybGJpdDsKKwllbHNlCisJCWNvbiAmPSB+Y3RybGJpdDsKKworCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjNjR4eF9wY2xrX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzM2M2NHh4X2dhdGUoUzNDX1BDTEtfR0FURSwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IHMzYzY0eHhfaGNsa19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczNjNjR4eF9nYXRlKFMzQ19IQ0xLX0dBVEUsIGNsaywgZW5hYmxlKTsKK30KKworaW50IHMzYzY0eHhfc2Nsa19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczNjNjR4eF9nYXRlKFMzQ19TQ0xLX0dBVEUsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NfZGlzYWJsZVtdID0geworCXsKKwkJLm5hbWUJCT0gIm5hbmQiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCX0sIHsKKwkJLm5hbWUJCT0gImFkYyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1RTQURDLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX0lJQywKKwl9LCB7CisJCS5uYW1lCQk9ICJpaXMiLAorCQkuaWQJCT0gMCwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX0lJUzAsCisJfSwgeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLmlkCQk9IDEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAorCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19JSVMxLAorCX0sIHsKKwkJLm5hbWUJCT0gInNwaSIsCisJCS5pZAkJPSAwLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfU1BJMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJzcGkiLAorCQkuaWQJCT0gMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1NQSTEsCisJfSwgeworCQkubmFtZQkJPSAiNDhtIiwKKwkJLmlkCQk9IDAsCisJCS5wYXJlbnQJCT0gJmNsa180OG0sCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9TQ0xLX01NQzBfNDgsCisJfSwgeworCQkubmFtZQkJPSAiNDhtIiwKKwkJLmlkCQk9IDEsCisJCS5wYXJlbnQJCT0gJmNsa180OG0sCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9TQ0xLX01NQzFfNDgsCisJfSwgeworCQkubmFtZQkJPSAiNDhtIiwKKwkJLmlkCQk9IDIsCisJCS5wYXJlbnQJCT0gJmNsa180OG0sCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9TQ0xLX01NQzJfNDgsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7CisJeworCQkubmFtZQkJPSAibGNkIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX0hDTEtfTENELAorCX0sIHsKKwkJLm5hbWUJCT0gImdwaW8iLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfcGNsa19jdHJsLAorCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fUENMS19HUElPLAorCX0sIHsKKwkJLm5hbWUJCT0gInVzYi1ob3N0IiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1NDTEtfVUhPU1QsCisJfSwgeworCQkubmFtZQkJPSAiaHNtbWMiLAorCQkuaWQJCT0gMCwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjNjR4eF9oY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9IQ0xLX0hTTU1DMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJoc21tYyIsCisJCS5pZAkJPSAxLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X2hjbGtfY3RybCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX0hDTEtfSFNNTUMxLAorCX0sIHsKKwkJLm5hbWUJCT0gImhzbW1jIiwKKwkJLmlkCQk9IDIsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfaGNsa19jdHJsLAorCQkuY3RybGJpdAk9IFMzQ19DTEtDT05fSENMS19IU01NQzIsCisJfSwgeworCQkubmFtZQkJPSAidGltZXJzIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3BjbGtfY3RybCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfUFdNLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuaWQJCT0gMCwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1VBUlQwLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuaWQJCT0gMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1VBUlQxLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuaWQJCT0gMiwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1VBUlQyLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuaWQJCT0gMywKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1VBUlQzLAorCX0sIHsKKwkJLm5hbWUJCT0gInJ0YyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjNjR4eF9wY2xrX2N0cmwsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1JUQywKKwl9LCB7CisJCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5jdHJsYml0CT0gUzNDX0NMS0NPTl9QQ0xLX1dEVCwKKwl9LCB7CisJCS5uYW1lCQk9ICJhYzk3IiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmN0cmxiaXQJPSBTM0NfQ0xLQ09OX1BDTEtfQUM5NywKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc1tdIF9faW5pdGRhdGEgPSB7CisJJmNsa19leHQsCisJJmNsa19lcGxsLAorCSZjbGtfMjdtLAorCSZjbGtfNDhtLAorfTsKKwordm9pZCBzM2M2NHh4X3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsa3A7CisJaW50IHJldDsKKwlpbnQgcHRyOworCisJczNjMjR4eF9yZWdpc3Rlcl9jbG9ja3MoY2xrcywgQVJSQVlfU0laRShjbGtzKSk7CisKKwljbGtwID0gaW5pdF9jbG9ja3M7CisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKTsgcHRyKyssIGNsa3ArKykgeworCQlyZXQgPSBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKGNsa3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjbGtwLT5uYW1lLCByZXQpOworCQl9CisJfQorCisJY2xrcCA9IGluaXRfY2xvY2tzX2Rpc2FibGU7CisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX2Rpc2FibGUpOyBwdHIrKywgY2xrcCsrKSB7CisKKwkJcmV0ID0gczNjMjR4eF9yZWdpc3Rlcl9jbG9jayhjbGtwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNsb2NrICVzICglZClcbiIsCisJCQkgICAgICAgY2xrcC0+bmFtZSwgcmV0KTsKKwkJfQorCisJCShjbGtwLT5lbmFibGUpKGNsa3AsIDApOworCX0KKworCXMzY19wd21jbGtfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2NwdS5jIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZGUxODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvY3B1LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9jcHUuYworICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjRYWCBDUFUgU3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KKworLyogdGFibGUgb2Ygc3VwcG9ydGVkIENQVXMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zM2M2NDAwW10gPSAiUzNDNjQwMCI7CitzdGF0aWMgY29uc3QgY2hhciBuYW1lX3MzYzY0MTBbXSA9ICJTM0M2NDEwIjsKKworc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgY3B1X2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkuaWRjb2RlCQk9IDB4MzY0MDAwMDAsCisJCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLm1hcF9pbwkJPSBzM2M2NDAwX21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gczNjNjQwMF9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBzM2M2NDAwX2luaXRfdWFydHMsCisJCS5pbml0CQk9IHMzYzY0MDBfaW5pdCwKKwkJLm5hbWUJCT0gbmFtZV9zM2M2NDAwLAorCX0sIHsKKwkJLmlkY29kZQkJPSAweDM2NDEwMTAwLAorCQkuaWRtYXNrCQk9IDB4ZmZmZmZmMDAsCisJCS5tYXBfaW8JCT0gczNjNjQxMF9tYXBfaW8sCisJCS5pbml0X2Nsb2Nrcwk9IHMzYzY0MTBfaW5pdF9jbG9ja3MsCisJCS5pbml0X3VhcnRzCT0gczNjNjQxMF9pbml0X3VhcnRzLAorCQkuaW5pdAkJPSBzM2M2NDEwX2luaXQsCisJCS5uYW1lCQk9IG5hbWVfczNjNjQxMCwKKwl9LAorfTsKKworLyogbWluaW1hbCBJTyBtYXBwaW5nICovCisKKy8qIHNlZSBub3RlcyBvbiB1YXJ0IG1hcCBpbiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgKi8KKyNkZWZpbmUgVUFSVF9PRkZTIChTM0NfUEFfVUFSVCAmIDB4ZmZmZmYpCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgczNjX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9TWVMsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihTM0M2NFhYX1BBX1NZU0NPTiksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpKFMzQ19WQV9VQVJUICsgVUFSVF9PRkZTKSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFMzQ19QQV9VQVJUKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVklDMCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFMzQzY0WFhfUEFfVklDMCksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9WSUMxLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUzNDNjRYWF9QQV9WSUMxKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzNDX1ZBX1RJTUVSLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUzNDX1BBX1RJTUVSKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzNDNjRYWF9WQV9HUElPLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oUzNDNjRYWF9QQV9HUElPKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sCit9OworCisvKiByZWFkIGNwdSBpZGVudGlmaWNhdGlvbiBjb2RlICovCisKK3ZvaWQgX19pbml0IHMzYzY0eHhfaW5pdF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBpZGNvZGU7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBpbyBkZXNjcmlwdG9ycyB3ZSBuZWVkIGZvciBpbml0aWFsaXNhdGlvbiAqLworCWlvdGFibGVfaW5pdChzM2NfaW9kZXNjLCBBUlJBWV9TSVpFKHMzY19pb2Rlc2MpKTsKKwlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBzaXplKTsKKworCWlkY29kZSA9IF9fcmF3X3JlYWRsKFMzQ19WQV9TWVMgKyAweDExOCk7CisJczNjX2luaXRfY3B1KGlkY29kZSwgY3B1X2lkcywgQVJSQVlfU0laRShjcHVfaWRzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvZGV2LXVhcnQuYyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9kZXYtdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYzExYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvZGV2LXVhcnQuYwpAQCAtMCwwICsxLDE3NiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2Rldi11YXJ0LmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEJhc2UgUzNDNjRYWCBVQVJUIHJlc291cmNlIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorCisvKiBTZXJpYWwgcG9ydCByZWdpc3RyYXRpb25zICovCisKKy8qIDY0eHggdWFydHMgYXJlIGNsb3NlciB0b2dldGhlciAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzY0eHhfdWFydDBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFMzQ19QQV9VQVJUMCwKKwkJLmVuZAk9IFMzQ19QQV9VQVJUMCArIDB4MTAwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfUlgwLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfUlgwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfVFgwLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfVFgwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKworCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBJUlFfUzNDVUFSVF9FUlIwLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfRVJSMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2M2NHh4X3VhcnQxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0NfUEFfVUFSVDEsCisJCS5lbmQgICA9IFMzQ19QQV9VQVJUMSArIDB4MTAwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfUlgxLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfUlgxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfVFgxLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfVFgxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKworCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBJUlFfUzNDVUFSVF9FUlIxLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfRVJSMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjNnh4X3VhcnQyX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0NfUEFfVUFSVDIsCisJCS5lbmQgICA9IFMzQ19QQV9VQVJUMiArIDB4MTAwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfUlgyLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfUlgyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfVFgyLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfVFgyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKworCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBJUlFfUzNDVUFSVF9FUlIyLAorCQkuZW5kCT0gSVJRX1MzQ1VBUlRfRVJSMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjNjR4eF91YXJ0M19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDX1BBX1VBUlQzLAorCQkuZW5kICAgPSBTM0NfUEFfVUFSVDMgKyAweDEwMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9TM0NVQVJUX1JYMywKKwkJLmVuZAk9IElSUV9TM0NVQVJUX1JYMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IElSUV9TM0NVQVJUX1RYMywKKwkJLmVuZAk9IElSUV9TM0NVQVJUX1RYMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1MzQ1VBUlRfRVJSMywKKwkJLmVuZAk9IElSUV9TM0NVQVJUX0VSUjMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCisKK3N0cnVjdCBzM2MyNHh4X3VhcnRfcmVzb3VyY2VzIHMzYzY0eHhfdWFydF9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLnJlc291cmNlcwk9IHMzYzY0eHhfdWFydDBfcmVzb3VyY2UsCisJCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzY0eHhfdWFydDBfcmVzb3VyY2UpLAorCX0sCisJWzFdID0geworCQkucmVzb3VyY2VzCT0gczNjNjR4eF91YXJ0MV9yZXNvdXJjZSwKKwkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjNjR4eF91YXJ0MV9yZXNvdXJjZSksCisJfSwKKwlbMl0gPSB7CisJCS5yZXNvdXJjZXMJPSBzM2M2eHhfdWFydDJfcmVzb3VyY2UsCisJCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzZ4eF91YXJ0Ml9yZXNvdXJjZSksCisJfSwKKwlbM10gPSB7CisJCS5yZXNvdXJjZXMJPSBzM2M2NHh4X3VhcnQzX3Jlc291cmNlLAorCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2M2NHh4X3VhcnQzX3Jlc291cmNlKSwKKwl9LAorfTsKKworLyogdWFydCBkZXZpY2VzICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzI0eHhfdWFydF9kZXZpY2UwID0geworCS5pZAkJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjMjR4eF91YXJ0X2RldmljZTEgPSB7CisJLmlkCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2MyNHh4X3VhcnRfZGV2aWNlMiA9IHsKKwkuaWQJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzI0eHhfdWFydF9kZXZpY2UzID0geworCS5pZAkJPSAzLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X3NyY1s0XSA9IHsKKwkmczNjMjR4eF91YXJ0X2RldmljZTAsCisJJnMzYzI0eHhfdWFydF9kZXZpY2UxLAorCSZzM2MyNHh4X3VhcnRfZGV2aWNlMiwKKwkmczNjMjR4eF91YXJ0X2RldmljZTMsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3VhcnRfZGV2c1s0XSA9IHsKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9ncGlvbGliLmMgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvZ3Bpb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNjI5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvZ3Bpb2xpYi5jCkBAIC0wLDAgKzEsNDIwIEBACisvKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvZ3Bpb2xpYi5jCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjRYWCAtIEdQSU9saWIgc3VwcG9ydCAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tY29yZS5oPgorCisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1ncGlvLmg+CisKKy8qIEdQSU8gYmFuayBzdW1tYXJ5OgorICoKKyAqIEJhbmsJR1BJT3MJU3R5bGUJU2xwQ29uCUV4dEludCBHcm91cAorICogQQk4CTRCaXQJWWVzCTEKKyAqIEIJNwk0Qml0CVllcwkxCisgKiBDCTgJNEJpdAlZZXMJMgorICogRAk1CTRCaXQJWWVzCTMKKyAqIEUJNQk0Qml0CVllcwlOb25lCisgKiBGCTE2CTJCaXQJWWVzCTQgWzFdCisgKiBHCTcJNEJpdAlZZXMJNQorICogSAkxMAk0Qml0WzJdCVllcwk2CisgKiBJCTE2CTJCaXQJWWVzCU5vbmUKKyAqIEoJMTIJMkJpdAlZZXMJTm9uZQorICogSwkxNgk0Qml0WzJdCU5vCU5vbmUKKyAqIEwJMTUJNEJpdFsyXSBObwlOb25lCisgKiBNCTYJNEJpdAlObwlJUlFfRUlOVAorICogTgkxNgkyQml0CU5vCUlSUV9FSU5UCisgKiBPCTE2CTJCaXQJWWVzCTcKKyAqIFAJMTUJMkJpdAlZZXMJOAorICogUQk5CTJCaXQJWWVzCTkKKyAqCisgKiBbMV0gQkFOS0YgcGlucyAxNCwxNSBkbyBub3QgZm9ybSBwYXJ0IG9mIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcworICogWzJdIEJBTksgaGFzIHR3byBjb250cm9sIHJlZ2lzdGVycywgR1B4Q09OMCBhbmQgR1B4Q09OMQorICovCisKKyNkZWZpbmUgT0ZGX0dQQ09OCSgweDAwKQorI2RlZmluZSBPRkZfR1BEQVQJKDB4MDQpCisKKyNkZWZpbmUgY29uXzRiaXRfc2hpZnQoX19vZmYpICgoX19vZmYpICogNCkKKworI2lmIDEKKyNkZWZpbmUgZ3Bpb19kYmcoeC4uLikgZG8geyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBncGlvX2RiZyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyAjIyB4KQorI2VuZGlmCisKKy8qIFRoZSBzM2M2NHh4X2dwaW9saWJfNGJpdCByb3V0aW5lcyBhcmUgdG8gY29udHJvbCB0aGUgZ3BpbyBiYW5rcyB3aGVyZQorICogdGhlIGdwaW8gY29uZmlndXJhdGlvbiByZWdpc3RlciAoR1B4Q09OKSBoYXMgNCBiaXRzIHBlciBHUElPLCBhcyB0aGUKKyAqIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCA0IGJpdHMgcGVyIGdwaW8KKyAqCSAgICAgICAgZ3BpbyBuOiA0IGJpdHMgc3RhcnRpbmcgYXQgKDQqbikKKyAqCQkwMDAwID0gaW5wdXQsIDAwMDEgPSBvdXRwdXQsIG90aGVycyBtZWFuIHNwZWNpYWwtZnVuY3Rpb24KKyAqIGJhc2UgKyAweDA0OiBEYXRhIHJlZ2lzdGVyLCAxIGJpdCBwZXIgZ3BpbworICoJCWJpdCBuOiBkYXRhIGJpdCBuCisgKgorICogTm90ZSwgc2luY2UgdGhlIGRhdGEgcmVnaXN0ZXIgaXMgb25lIGJpdCBwZXIgZ3BpbyBhbmQgaXMgYXQgYmFzZSArIDB4NAorICogd2UgY2FuIHVzZSBzM2NfZ3Bpb2xpYl9nZXQgYW5kIHMzY19ncGlvbGliX3NldCB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mCisgKiB0aGUgb3V0cHV0LgorKi8KKworc3RhdGljIGludCBzM2M2NHh4X2dwaW9saWJfNGJpdF9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgY29uOworCisJY29uID0gX19yYXdfcmVhZGwoYmFzZSArIE9GRl9HUENPTik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyBPRkZfR1BDT04pOworCisJZ3Bpb19kYmcoIiVzOiAlcDogQ09OIG5vdyAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2M2NHh4X2dwaW9saWJfNGJpdF9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgY29uOworCXVuc2lnbmVkIGxvbmcgZGF0OworCisJY29uID0gX19yYXdfcmVhZGwoYmFzZSArIE9GRl9HUENPTik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCWNvbiB8PSAweDEgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KTsKKworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBPRkZfR1BEQVQpOworCWlmICh2YWx1ZSkKKwkJZGF0IHw9IDEgPDwgb2Zmc2V0OworCWVsc2UKKwkJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOworCisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIE9GRl9HUERBVCk7CisJX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIE9GRl9HUENPTik7CisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIE9GRl9HUERBVCk7CisKKwlncGlvX2RiZygiJXM6ICVwOiBDT04gJTA4bHgsIERBVCAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbiwgZGF0KTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgbmV4dCBzZXQgb2Ygcm91dGluZXMgYXJlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgR1BJTyBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlcnMgYXJlIDQgYml0cyBwZXIgR1BJTyBidXQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZWdpc3RlciAodGhlCisgKiBiYW5rIGhhcyBtb3JlIHRoYW4gOCBHUElPcy4KKyAqCisgKiBUaGlzIGNhc2UgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIDQgYml0IGNhc2UsIGJ1dCB0aGUgcmVnaXN0ZXJzIGFyZSBhcworICogZm9sbG93czoKKyAqCisgKiBiYXNlICsgMHgwMDogQ29udHJvbCByZWdpc3RlciwgNCBiaXRzIHBlciBncGlvIChsb3dlciA4IEdQSU9zKQorICoJICAgICAgICBncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQorICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgorICogYmFzZSArIDB4MDQ6IENvbnRyb2wgcmVnaXN0ZXIsIDQgYml0cyBwZXIgZ3BpbyAodXAgdG8gOCBhZGRpdGlvbnMgR1BJT3MpCisgKgkgICAgICAgIGdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCisgKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCisgKiBiYXNlICsgMHgwODogRGF0YSByZWdpc3RlciwgMSBiaXQgcGVyIGdwaW8KKyAqCQliaXQgbjogZGF0YSBiaXQgbgorICoKKyAqIFRvIGFsbG93IHVzIHRvIHVzZSB0aGUgczNjX2dwaW9saWJfZ2V0IGFuZCBzM2NfZ3Bpb2xpYl9zZXQgcm91dGluZXMgd2UKKyAqIHN0b3JlIHRoZSAnYmFzZSArIDB4NCcgYWRkcmVzcyBzbyB0aGF0IHRoZXNlIHJvdXRpbmVzIHNlZSB0aGUgZGF0YQorICogcmVnaXN0ZXIgYXQgb3VyY2hpcC0+YmFzZSArIDB4MDQuCisqLworCitzdGF0aWMgaW50IHMzYzY0eHhfZ3Bpb2xpYl80Yml0Ml9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKworCWlmIChvZmZzZXQgPiA3KQorCQlvZmZzZXQgLT0gODsKKwllbHNlCisJCXJlZ2NvbiAtPSA0OworCisJY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKKwljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnY29uKTsKKworCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbik7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHMzYzY0eHhfZ3Bpb2xpYl80Yml0Ml9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKwl1bnNpZ25lZCBsb25nIGRhdDsKKworCWlmIChvZmZzZXQgPiA3KQorCQlvZmZzZXQgLT0gODsKKwllbHNlCisJCXJlZ2NvbiAtPSA0OworCisJY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKKwljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KSk7CisJY29uIHw9IDB4MSA8PCBjb25fNGJpdF9zaGlmdChvZmZzZXQpOworCisJZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIE9GRl9HUERBVCk7CisJaWYgKHZhbHVlKQorCQlkYXQgfD0gMSA8PCBvZmZzZXQ7CisJZWxzZQorCQlkYXQgJj0gfigxIDw8IG9mZnNldCk7CisKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgT0ZGX0dQREFUKTsKKwlfX3Jhd193cml0ZWwoY29uLCByZWdjb24pOworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBPRkZfR1BEQVQpOworCisJZ3Bpb19kYmcoIiVzOiAlcDogQ09OICUwOGx4LCBEQVQgJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24sIGRhdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb180Yml0X2NmZ19ub2ludCA9IHsKKwkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzRiaXRfY2ZnX2VpbnQwMTExID0geworCS5jZmdfZWludAk9IDcsCisJLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAorCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAorCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb180Yml0X2NmZ19laW50MDAxMSA9IHsKKwkuY2ZnX2VpbnQJPSAzLAorCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKKwkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKKwkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBncGlvXzRiaXRbXSA9IHsKKwl7CisJCS5iYXNlCT0gUzNDNjRYWF9HUEFfQkFTRSwKKwkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEEoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fQV9OUiwKKwkJCS5sYWJlbAk9ICJHUEEiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQQl9CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQQigwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19CX05SLAorCQkJLmxhYmVsCT0gIkdQQiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BDX0JBU0UsCisJCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BDKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0NfTlIsCisJCQkubGFiZWwJPSAiR1BDIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDNjRYWF9HUERfQkFTRSwKKwkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEQoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fRF9OUiwKKwkJCS5sYWJlbAk9ICJHUEQiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQRV9CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfbm9pbnQsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRSgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19FX05SLAorCQkJLmxhYmVsCT0gIkdQRSIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BHX0JBU0UsCisJCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BHKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0dfTlIsCisJCQkubGFiZWwJPSAiR1BHIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDNjRYWF9HUE1fQkFTRSwKKwkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMDExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUE0oMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTV9OUiwKKwkJCS5sYWJlbAk9ICJHUE0iLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZ3Bpb180Yml0MltdID0geworCXsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQSF9CQVNFICsgMHg0LAorCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQSCgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19IX05SLAorCQkJLmxhYmVsCT0gIkdQSCIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BLX0JBU0UgKyAweDQsCisJCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19ub2ludCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BLKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0tfTlIsCisJCQkubGFiZWwJPSAiR1BLIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDNjRYWF9HUExfQkFTRSArIDB4NCwKKwkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMDExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEwoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTF9OUiwKKwkJCS5sYWJlbAk9ICJHUEwiLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzJiaXRfY2ZnX25vaW50ID0geworCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgsCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzJiaXRfY2ZnX2VpbnQxMCA9IHsKKwkuY2ZnX2VpbnQJPSAyLAorCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgsCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzJiaXRfY2ZnX2VpbnQxMSA9IHsKKwkuY2ZnX2VpbnQJPSAzLAorCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgsCisJLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCisJLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZ3Bpb18yYml0W10gPSB7CisJeworCQkuYmFzZQk9IFMzQzY0WFhfR1BGX0JBU0UsCisJCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19laW50MTEsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRigwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19GX05SLAorCQkJLmxhYmVsCT0gIkdQRiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzY0WFhfR1BJX0JBU0UsCisJCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19ub2ludCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BJKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0lfTlIsCisJCQkubGFiZWwJPSAiR1BJIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDNjRYWF9HUEpfQkFTRSwKKwkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX25vaW50LAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEooMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSl9OUiwKKwkJCS5sYWJlbAk9ICJHUEoiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQTl9CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDEwLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUE4oMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTl9OUiwKKwkJCS5sYWJlbAk9ICJHUE4iLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQT19CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUE8oMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fT19OUiwKKwkJCS5sYWJlbAk9ICJHUE8iLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQUF9CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUFAoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUF9OUiwKKwkJCS5sYWJlbAk9ICJHUFAiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQUV9CQVNFLAorCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUFEoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUV9OUiwKKwkJCS5sYWJlbAk9ICJHUFEiLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgX19pbml0IHZvaWQgczNjNjR4eF9ncGlvbGliX2FkZF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQoreworCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gczNjNjR4eF9ncGlvbGliXzRiaXRfaW5wdXQ7CisJY2hpcC0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gczNjNjR4eF9ncGlvbGliXzRiaXRfb3V0cHV0OworfQorCitzdGF0aWMgX19pbml0IHZvaWQgczNjNjR4eF9ncGlvbGliX2FkZF80Yml0MihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKK3sKKwljaGlwLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHMzYzY0eHhfZ3Bpb2xpYl80Yml0Ml9pbnB1dDsKKwljaGlwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzM2M2NHh4X2dwaW9saWJfNGJpdDJfb3V0cHV0OworfQorCitzdGF0aWMgX19pbml0IHZvaWQgczNjNjR4eF9ncGlvbGliX2FkZChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcHMsCisJCQkJICAgICAgIGludCBucl9jaGlwcywKKwkJCQkgICAgICAgdm9pZCAoKmZuKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqKSkKK3sKKwlmb3IgKDsgbnJfY2hpcHMgPiAwOyBucl9jaGlwcy0tLCBjaGlwcysrKSB7CisJCWlmIChmbikKKwkJCShmbikoY2hpcHMpOworCQlzM2NfZ3Bpb2xpYl9hZGQoY2hpcHMpOworCX0KK30KKworc3RhdGljIF9faW5pdCBpbnQgczNjNjR4eF9ncGlvbGliX2luaXQodm9pZCkKK3sKKwlzM2M2NHh4X2dwaW9saWJfYWRkKGdwaW9fNGJpdCwgQVJSQVlfU0laRShncGlvXzRiaXQpLAorCQkJICAgIHMzYzY0eHhfZ3Bpb2xpYl9hZGRfNGJpdCk7CisKKwlzM2M2NHh4X2dwaW9saWJfYWRkKGdwaW9fNGJpdDIsIEFSUkFZX1NJWkUoZ3Bpb180Yml0MiksCisJCQkgICAgczNjNjR4eF9ncGlvbGliX2FkZF80Yml0Mik7CisKKwlzM2M2NHh4X2dwaW9saWJfYWRkKGdwaW9fMmJpdCwgQVJSQVlfU0laRShncGlvXzJiaXQpLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHMzYzY0eHhfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWEuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWEwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstYS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWEuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgQSByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BBQ09OCQkJKFMzQzY0WFhfR1BBX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQQURBVAkJCShTM0M2NFhYX0dQQV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEFQVUQJCQkoUzNDNjRYWF9HUEFfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BBQ09OU0xQCQkoUzNDNjRYWF9HUEFfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BBUFVEU0xQCQkoUzNDNjRYWF9HUEFfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEFfQ09OTUFTSyhfX2dwaW8pCSgweGYgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BBX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUEFfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiA0KSkKKworI2RlZmluZSBTM0M2NFhYX0dQQTBfVUFSVF9SWEQwCQkoMHgwMiA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQQTBfRUlOVF9HMV8wCQkoMHgwNyA8PCAwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BBMV9VQVJUX1RYRDAJCSgweDAyIDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BBMV9FSU5UX0cxXzEJCSgweDA3IDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEEyX1VBUlRfbkNUUzAJCSgweDAyIDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BBMl9FSU5UX0cxXzIJCSgweDA3IDw8IDgpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEEzX1VBUlRfblJUUzAJCSgweDAyIDw8IDEyKQorI2RlZmluZSBTM0M2NFhYX0dQQTNfRUlOVF9HMV8zCQkoMHgwNyA8PCAxMikKKworI2RlZmluZSBTM0M2NFhYX0dQQTRfVUFSVF9SWEQxCQkoMHgwMiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEE0X0VJTlRfRzFfNAkJKDB4MDcgPDwgMTYpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEE1X1VBUlRfVFhEMQkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BBNV9FSU5UX0cxXzUJCSgweDA3IDw8IDIwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BBNl9VQVJUX25DVFMxCQkoMHgwMiA8PCAyNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEE2X0VJTlRfRzFfNgkJKDB4MDcgPDwgMjQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEE3X1VBUlRfblJUUzEJCSgweDAyIDw8IDI4KQorI2RlZmluZSBTM0M2NFhYX0dQQTdfRUlOVF9HMV83CQkoMHgwNyA8PCAyOCkKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstYi5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1iLmgKQEAgLTAsMCArMSw2MCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstYi5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIAlodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEdQSU8gQmFuayBCIHJlZ2lzdGVyIGFuZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNkZWZpbmUgUzNDNjRYWF9HUEJDT04JCQkoUzNDNjRYWF9HUEJfQkFTRSArIDB4MDApCisjZGVmaW5lIFMzQzY0WFhfR1BCREFUCQkJKFMzQzY0WFhfR1BCX0JBU0UgKyAweDA0KQorI2RlZmluZSBTM0M2NFhYX0dQQlBVRAkJCShTM0M2NFhYX0dQQl9CQVNFICsgMHgwOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEJDT05TTFAJCShTM0M2NFhYX0dQQl9CQVNFICsgMHgwYykKKyNkZWZpbmUgUzNDNjRYWF9HUEJQVURTTFAJCShTM0M2NFhYX0dQQl9CQVNFICsgMHgxMCkKKworI2RlZmluZSBTM0M2NFhYX0dQQl9DT05NQVNLKF9fZ3BpbykJKDB4ZiA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUEJfSU5QVVQoX19ncGlvKQkoMHgwIDw8ICgoX19ncGlvKSAqIDQpKQorI2RlZmluZSBTM0M2NFhYX0dQQl9PVVRQVVQoX19ncGlvKQkoMHgxIDw8ICgoX19ncGlvKSAqIDQpKQorCisjZGVmaW5lIFMzQzY0WFhfR1BCMF9VQVJUX1JYRDIJCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BCMF9FWFRETUFfUkVRCQkoMHgwMyA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQQjBfSXJEQV9SWEQJCSgweDA0IDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BCMF9BRERSX0NGMAkJKDB4MDUgPDwgMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEIwX0VJTlRfRzFfOAkJKDB4MDcgPDwgMCkKKworI2RlZmluZSBTM0M2NFhYX0dQQjFfVUFSVF9UWEQyCQkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQQjFfRVhURE1BX0FDSwkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEIxX0lyREFfVFhECQkoMHgwNCA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQQjFfQUREUl9DRjEJCSgweDA1IDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BCMV9FSU5UX0cxXzkJCSgweDA3IDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEIyX1VBUlRfUlhEMwkJKDB4MDIgPDwgOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEIyX0lyREFfUlhECQkoMHgwMyA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQQjJfRVhURE1BX1JFUQkJKDB4MDQgPDwgOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEIyX0FERFJfQ0YyCQkoMHgwNSA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQQjJfSTJDX1NDTDEJCSgweDA2IDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BCMl9FSU5UX0cxXzEwCQkoMHgwNyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BCM19VQVJUX1RYRDMJCSgweDAyIDw8IDEyKQorI2RlZmluZSBTM0M2NFhYX0dQQjNfSXJEQV9UWEQJCSgweDAzIDw8IDEyKQorI2RlZmluZSBTM0M2NFhYX0dQQjNfRVhURE1BX0FDSwkJKDB4MDQgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BCM19JMkNfU0RBMQkJKDB4MDYgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BCM19FSU5UX0cxXzExCQkoMHgwNyA8PCAxMikKKworI2RlZmluZSBTM0M2NFhYX0dQQjRfSXJEQV9TREJXCQkoMHgwMiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEI0X0NBTV9GSUVMRAkJKDB4MDMgPDwgMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BCNF9DRl9EQVRBX0RJUgkoMHgwNCA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEI0X0VJTlRfRzFfMTIJCSgweDA3IDw8IDE2KQorCisjZGVmaW5lIFMzQzY0WFhfR1BCNV9JMkNfU0NMMAkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BCNV9FSU5UX0cxXzEzCQkoMHgwNyA8PCAyMCkKKworI2RlZmluZSBTM0M2NFhYX0dQQjZfSTJDX1NEQTAJCSgweDAyIDw8IDI0KQorI2RlZmluZSBTM0M2NFhYX0dQQjZfRUlOVF9HMV8xNAkJKDB4MDcgPDwgMjQpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWMuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstYy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWMuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgQyByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BDQ09OCQkJKFMzQzY0WFhfR1BDX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQQ0RBVAkJCShTM0M2NFhYX0dQQ19CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUENQVUQJCQkoUzNDNjRYWF9HUENfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BDQ09OU0xQCQkoUzNDNjRYWF9HUENfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BDUFVEU0xQCQkoUzNDNjRYWF9HUENfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUENfQ09OTUFTSyhfX2dwaW8pCSgweGYgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BDX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUENfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiA0KSkKKworI2RlZmluZSBTM0M2NFhYX0dQQzBfU1BJX01JU08wCQkoMHgwMiA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQQzBfRUlOVF9HMl8wCQkoMHgwNyA8PCAwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BDMV9TUElfQ0xLTwkJKDB4MDIgPDwgNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEMxX0VJTlRfRzJfMQkJKDB4MDcgPDwgNCkKKworI2RlZmluZSBTM0M2NFhYX0dQQzJfU1BJX01PU0lPCQkoMHgwMiA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQQzJfRUlOVF9HMl8yCQkoMHgwNyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BDM19TUElfbkNTTwkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BDM19FSU5UX0cyXzMJCSgweDA3IDw8IDEyKQorCisjZGVmaW5lIFMzQzY0WFhfR1BDNF9TUElfTUlTTzEJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQQzRfTU1DMl9DTUQJCSgweDAzIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQQzRfSTJTMF9WNDBfRE8JKDB4MDUgPDwgMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BDNF9FSU5UX0cyXzQJCSgweDA3IDw8IDE2KQorCisjZGVmaW5lIFMzQzY0WFhfR1BDNV9TUElfQ0xLMQkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BDNV9NTUMyX0NMSwkJKDB4MDMgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BDNV9JMlMxX1Y0MF9ETwkoMHgwNSA8PCAyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEM1X0VJTlRfRzJfNQkJKDB4MDcgPDwgMjApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEM2X1NQSV9NT1NJMQkJKDB4MDIgPDwgMjQpCisjZGVmaW5lIFMzQzY0WFhfR1BDNl9FSU5UX0cyXzYJCSgweDA3IDw8IDI0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BDN19TUElfbkNTMQkJKDB4MDIgPDwgMjgpCisjZGVmaW5lIFMzQzY0WFhfR1BDN19JMlMyX1Y0MF9ETwkoMHgwNSA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEM3X0VJTlRfRzJfNwkJKDB4MDcgPDwgMjgpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWQuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU0YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstZC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWQuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgRCByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BEQ09OCQkJKFMzQzY0WFhfR1BEX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQRERBVAkJCShTM0M2NFhYX0dQRF9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUERQVUQJCQkoUzNDNjRYWF9HUERfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BEQ09OU0xQCQkoUzNDNjRYWF9HUERfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BEUFVEU0xQCQkoUzNDNjRYWF9HUERfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUERfQ09OTUFTSyhfX2dwaW8pCSgweGYgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BEX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUERfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiA0KSkKKworI2RlZmluZSBTM0M2NFhYX0dQRDBfUENNMF9TQ0xLCQkoMHgwMiA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQRDBfSTJTMF9DTEsJCSgweDAzIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BEMF9BQzk3X0JJVENMSwkoMHgwNCA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQRDBfRUlOVF9HM18wCQkoMHgwNyA8PCAwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BEMV9QQ00wX0VYVENMSwkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQRDFfSTJTMF9DRENMSwkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEQxX0FDOTdfblJFU0VUCSgweDA0IDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BEMV9FSU5UX0czXzEJCSgweDA3IDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEQyX1BDTTBfRlNZTkMJCSgweDAyIDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BEMl9JMlMwX0xSQ0xLCQkoMHgwMyA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQRDJfQUM5N19TWU5DCQkoMHgwNCA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQRDJfRUlOVF9HM18yCQkoMHgwNyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BEM19QQ00wX1NJTgkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BEM19JMlMwX0RJCQkoMHgwMyA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEQzX0FDOTdfU0RJCQkoMHgwNCA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEQzX0VJTlRfRzNfMwkJKDB4MDcgPDwgMTIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEQ0X1BDTTBfU09VVAkJKDB4MDIgPDwgMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BENF9JMlMwX0QwCQkoMHgwMyA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEQ0X0FDOTdfU0RPCQkoMHgwNCA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEQ0X0VJTlRfRzNfNAkJKDB4MDcgPDwgMTYpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWUuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNmM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWUuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgRSByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BFQ09OCQkJKFMzQzY0WFhfR1BFX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQRURBVAkJCShTM0M2NFhYX0dQRV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEVQVUQJCQkoUzNDNjRYWF9HUEVfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BFQ09OU0xQCQkoUzNDNjRYWF9HUEVfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BFUFVEU0xQCQkoUzNDNjRYWF9HUEVfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEVfQ09OTUFTSyhfX2dwaW8pCSgweGYgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BFX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUEVfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiA0KSkKKworI2RlZmluZSBTM0M2NFhYX0dQRTBfUENNMV9TQ0xLCQkoMHgwMiA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQRTBfSTJTMV9DTEsJCSgweDAzIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BFMF9BQzk3X0JJVENMSwkoMHgwNCA8PCAwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BFMV9QQ00xX0VYVENMSwkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQRTFfSTJTMV9DRENMSwkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEUxX0FDOTdfblJFU0VUCSgweDA0IDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEUyX1BDTTFfRlNZTkMJCSgweDAyIDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BFMl9JMlMxX0xSQ0xLCQkoMHgwMyA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQRTJfQUM5N19TWU5DCQkoMHgwNCA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BFM19QQ00xX1NJTgkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BFM19JMlMxX0RJCQkoMHgwMyA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEUzX0FDOTdfU0RJCQkoMHgwNCA8PCAxMikKKworI2RlZmluZSBTM0M2NFhYX0dQRTRfUENNMV9TT1VUCQkoMHgwMiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUEU0X0kyUzFfRDAJCSgweDAzIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQRTRfQUM5N19TRE8JCSgweDA0IDw8IDE2KQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1mLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYWZmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWYuaApAQCAtMCwwICsxLDcxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1mLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogR1BJTyBCYW5rIEYgcmVnaXN0ZXIgYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2RlZmluZSBTM0M2NFhYX0dQRkNPTgkJCShTM0M2NFhYX0dQRl9CQVNFICsgMHgwMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEZEQVQJCQkoUzNDNjRYWF9HUEZfQkFTRSArIDB4MDQpCisjZGVmaW5lIFMzQzY0WFhfR1BGUFVECQkJKFMzQzY0WFhfR1BGX0JBU0UgKyAweDA4KQorI2RlZmluZSBTM0M2NFhYX0dQRkNPTlNMUAkJKFMzQzY0WFhfR1BGX0JBU0UgKyAweDBjKQorI2RlZmluZSBTM0M2NFhYX0dQRlBVRFNMUAkJKFMzQzY0WFhfR1BGX0JBU0UgKyAweDEwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BGX0NPTk1BU0soX19ncGlvKQkoMHgzIDw8ICgoX19ncGlvKSAqIDIpKQorI2RlZmluZSBTM0M2NFhYX0dQRl9JTlBVVChfX2dwaW8pCSgweDAgPDwgKChfX2dwaW8pICogMikpCisjZGVmaW5lIFMzQzY0WFhfR1BGX09VVFBVVChfX2dwaW8pCSgweDEgPDwgKChfX2dwaW8pICogMikpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEYwX0NBTUlGX0NMSwkJKDB4MDIgPDwgMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEYwX0VJTlRfRzRfMAkJKDB4MDMgPDwgMCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjFfQ0FNSUZfSFJFRgkJKDB4MDIgPDwgMikKKyNkZWZpbmUgUzNDNjRYWF9HUEYxX0VJTlRfRzRfMQkJKDB4MDMgPDwgMikKKworI2RlZmluZSBTM0M2NFhYX0dQRjJfQ0FNSUZfUENMSwkJKDB4MDIgPDwgNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEYyX0VJTlRfRzRfMgkJKDB4MDMgPDwgNCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjNfQ0FNSUZfblJTVAkJKDB4MDIgPDwgNikKKyNkZWZpbmUgUzNDNjRYWF9HUEYzX0VJTlRfRzRfMwkJKDB4MDMgPDwgNikKKworI2RlZmluZSBTM0M2NFhYX0dQRjRfQ0FNSUZfVlNZTkMJKDB4MDIgPDwgOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEY0X0VJTlRfRzRfNAkJKDB4MDMgPDwgOCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjVfQ0FNSUZfWURBVEEwCSgweDAyIDw8IDEwKQorI2RlZmluZSBTM0M2NFhYX0dQRjVfRUlOVF9HNF81CQkoMHgwMyA8PCAxMCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjZfQ0FNSUZfWURBVEExCSgweDAyIDw8IDEyKQorI2RlZmluZSBTM0M2NFhYX0dQRjZfRUlOVF9HNF82CQkoMHgwMyA8PCAxMikKKworI2RlZmluZSBTM0M2NFhYX0dQRjdfQ0FNSUZfWURBVEEyCSgweDAyIDw8IDE0KQorI2RlZmluZSBTM0M2NFhYX0dQRjdfRUlOVF9HNF83CQkoMHgwMyA8PCAxNCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjhfQ0FNSUZfWURBVEEzCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQRjhfRUlOVF9HNF84CQkoMHgwMyA8PCAxNikKKworI2RlZmluZSBTM0M2NFhYX0dQRjlfQ0FNSUZfWURBVEE0CSgweDAyIDw8IDE4KQorI2RlZmluZSBTM0M2NFhYX0dQRjlfRUlOVF9HNF85CQkoMHgwMyA8PCAxOCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjEwX0NBTUlGX1lEQVRBNQkoMHgwMiA8PCAyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEYxMF9FSU5UX0c0XzEwCSgweDAzIDw8IDIwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BGMTFfQ0FNSUZfWURBVEE2CSgweDAyIDw8IDIyKQorI2RlZmluZSBTM0M2NFhYX0dQRjExX0VJTlRfRzRfMTEJKDB4MDMgPDwgMjIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEYxMl9DQU1JRl9ZREFUQTcJKDB4MDIgPDwgMjQpCisjZGVmaW5lIFMzQzY0WFhfR1BGMTJfRUlOVF9HNF8xMgkoMHgwMyA8PCAyNCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjEzX1BXTV9FQ0xLCQkoMHgwMiA8PCAyNikKKyNkZWZpbmUgUzNDNjRYWF9HUEYxM19FSU5UX0c0XzEzCSgweDAzIDw8IDI2KQorCisjZGVmaW5lIFMzQzY0WFhfR1BGMTRfUFdNX1RPVVQwCQkoMHgwMiA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEYxNF9DTEtPVVQwCQkoMHgwMyA8PCAyOCkKKworI2RlZmluZSBTM0M2NFhYX0dQRjE1X1BXTV9UT1VUMQkJKDB4MDIgPDwgMzApCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWcuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJiZDIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstZy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWcuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgRyByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BHQ09OCQkJKFMzQzY0WFhfR1BHX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQR0RBVAkJCShTM0M2NFhYX0dQR19CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEdQVUQJCQkoUzNDNjRYWF9HUEdfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BHQ09OU0xQCQkoUzNDNjRYWF9HUEdfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BHUFVEU0xQCQkoUzNDNjRYWF9HUEdfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEdfQ09OTUFTSyhfX2dwaW8pCSgweGYgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BHX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiA0KSkKKyNkZWZpbmUgUzNDNjRYWF9HUEdfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiA0KSkKKworI2RlZmluZSBTM0M2NFhYX0dQRzBfTU1DMF9DTEsJCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BHMF9FSU5UX0c1XzAJCSgweDA3IDw8IDApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEcxX01NQzBfQ01ECQkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQRzFfRUlOVF9HNV8xCQkoMHgwNyA8PCA0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BHMl9NTUMwX0RBVEEwCQkoMHgwMiA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQRzJfRUlOVF9HNV8yCQkoMHgwNyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BHM19NTUMwX0RBVEExCQkoMHgwMiA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEczX0VJTlRfRzVfMwkJKDB4MDcgPDwgMTIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEc0X01NQzBfREFUQTIJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQRzRfRUlOVF9HNV80CQkoMHgwNyA8PCAxNikKKworI2RlZmluZSBTM0M2NFhYX0dQRzVfTU1DMF9EQVRBMwkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BHNV9FSU5UX0c1XzUJCSgweDA3IDw8IDIwKQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1oLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NDk1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWguaApAQCAtMCwwICsxLDc0IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1oLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogR1BJTyBCYW5rIEggcmVnaXN0ZXIgYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2RlZmluZSBTM0M2NFhYX0dQSENPTjAJCQkoUzNDNjRYWF9HUEhfQkFTRSArIDB4MDApCisjZGVmaW5lIFMzQzY0WFhfR1BIQ09OMQkJCShTM0M2NFhYX0dQSF9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEhEQVQJCQkoUzNDNjRYWF9HUEhfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BIUFVECQkJKFMzQzY0WFhfR1BIX0JBU0UgKyAweDBjKQorI2RlZmluZSBTM0M2NFhYX0dQSENPTlNMUAkJKFMzQzY0WFhfR1BIX0JBU0UgKyAweDEwKQorI2RlZmluZSBTM0M2NFhYX0dQSFBVRFNMUAkJKFMzQzY0WFhfR1BIX0JBU0UgKyAweDE0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BIX0NPTk1BU0soX19ncGlvKQkoMHhmIDw8ICgoX19ncGlvKSAqIDQpKQorI2RlZmluZSBTM0M2NFhYX0dQSF9JTlBVVChfX2dwaW8pCSgweDAgPDwgKChfX2dwaW8pICogNCkpCisjZGVmaW5lIFMzQzY0WFhfR1BIX09VVFBVVChfX2dwaW8pCSgweDEgPDwgKChfX2dwaW8pICogNCkpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEgwX01NQzFfQ0xLCQkoMHgwMiA8PCAwKQorI2RlZmluZSBTM0M2NFhYX0dQSDBfS1BfQ09MMAkJKDB4MDQgPDwgMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEgwX0VJTlRfRzZfMAkJKDB4MDcgPDwgMCkKKworI2RlZmluZSBTM0M2NFhYX0dQSDFfTU1DMV9DTUQJCSgweDAyIDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BIMV9LUF9DT0wxCQkoMHgwNCA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQSDFfRUlOVF9HNl8xCQkoMHgwNyA8PCA0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BIMl9NTUMxX0RBVEEwCQkoMHgwMiA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQSDJfS1BfQ09MMgkJKDB4MDQgPDwgOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEgyX0VJTlRfRzZfMgkJKDB4MDcgPDwgOCkKKworI2RlZmluZSBTM0M2NFhYX0dQSDNfTU1DMV9EQVRBMQkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BIM19LUF9DT0wzCQkoMHgwNCA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEgzX0VJTlRfRzZfMwkJKDB4MDcgPDwgMTIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEg0X01NQzFfREFUQTIJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQSDRfS1BfQ09MNAkJKDB4MDQgPDwgMTYpCisjZGVmaW5lIFMzQzY0WFhfR1BINF9FSU5UX0c2XzQJCSgweDA3IDw8IDE2KQorCisjZGVmaW5lIFMzQzY0WFhfR1BINV9NTUMxX0RBVEEzCQkoMHgwMiA8PCAyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEg1X0tQX0NPTDUJCSgweDA0IDw8IDIwKQorI2RlZmluZSBTM0M2NFhYX0dQSDVfRUlOVF9HNl81CQkoMHgwNyA8PCAyMCkKKworI2RlZmluZSBTM0M2NFhYX0dQSDZfTU1DMV9EQVRBNAkJKDB4MDIgPDwgMjQpCisjZGVmaW5lIFMzQzY0WFhfR1BINl9NTUMyX0RBVEEwCQkoMHgwMyA8PCAyNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEg2X0tQX0NPTDYJCSgweDA0IDw8IDI0KQorI2RlZmluZSBTM0M2NFhYX0dQSDZfSTJTX1Y0MF9CQ0xLCSgweDA1IDw8IDI0KQorI2RlZmluZSBTM0M2NFhYX0dQSDZfQUREUl9DRjAJCSgweDA2IDw8IDI0KQorI2RlZmluZSBTM0M2NFhYX0dQSDZfRUlOVF9HNl82CQkoMHgwNyA8PCAyNCkKKworI2RlZmluZSBTM0M2NFhYX0dQSDdfTU1DMV9EQVRBNQkJKDB4MDIgPDwgMjgpCisjZGVmaW5lIFMzQzY0WFhfR1BIN19NTUMyX0RBVEExCQkoMHgwMyA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEg3X0tQX0NPTDcJCSgweDA0IDw8IDI4KQorI2RlZmluZSBTM0M2NFhYX0dQSDdfSTJTX1Y0MF9DRENMSwkoMHgwNSA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEg3X0FERFJfQ0YxCQkoMHgwNiA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEg3X0VJTlRfRzZfNwkJKDB4MDcgPDwgMjgpCisKKyNkZWZpbmUgUzNDNjRYWF9HUEg4X01NQzFfREFUQTYJCSgweDAyIDw8IDMyKQorI2RlZmluZSBTM0M2NFhYX0dQSDhfTU1DMl9EQVRBMgkJKDB4MDMgPDwgMzIpCisjZGVmaW5lIFMzQzY0WFhfR1BIOF9JMlNfVjQwX0xSQ0xLCSgweDA1IDw8IDMyKQorI2RlZmluZSBTM0M2NFhYX0dQSDhfQUREUl9DRjIJCSgweDA2IDw8IDMyKQorI2RlZmluZSBTM0M2NFhYX0dQSDhfRUlOVF9HNl84CQkoMHgwNyA8PCAzMikKKworI2RlZmluZSBTM0M2NFhYX0dQSDlfTU1DMV9EQVRBNwkJKDB4MDIgPDwgMzYpCisjZGVmaW5lIFMzQzY0WFhfR1BIOV9NTUMyX0RBVEEzCQkoMHgwMyA8PCAzNikKKyNkZWZpbmUgUzNDNjRYWF9HUEg5X0kyU19WNDBfREkJCSgweDA1IDw8IDM2KQorI2RlZmluZSBTM0M2NFhYX0dQSDlfRUlOVF9HNl85CQkoMHgwNyA8PCAzNikKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstaS5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWViZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1pLmgKQEAgLTAsMCArMSw0MCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstaS5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIAlodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEdQSU8gQmFuayBJIHJlZ2lzdGVyIGFuZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNkZWZpbmUgUzNDNjRYWF9HUElDT04JCQkoUzNDNjRYWF9HUElfQkFTRSArIDB4MDApCisjZGVmaW5lIFMzQzY0WFhfR1BJREFUCQkJKFMzQzY0WFhfR1BJX0JBU0UgKyAweDA0KQorI2RlZmluZSBTM0M2NFhYX0dQSVBVRAkJCShTM0M2NFhYX0dQSV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgUzNDNjRYWF9HUElDT05TTFAJCShTM0M2NFhYX0dQSV9CQVNFICsgMHgwYykKKyNkZWZpbmUgUzNDNjRYWF9HUElQVURTTFAJCShTM0M2NFhYX0dQSV9CQVNFICsgMHgxMCkKKworI2RlZmluZSBTM0M2NFhYX0dQSV9DT05NQVNLKF9fZ3BpbykJKDB4MyA8PCAoKF9fZ3BpbykgKiAyKSkKKyNkZWZpbmUgUzNDNjRYWF9HUElfSU5QVVQoX19ncGlvKQkoMHgwIDw8ICgoX19ncGlvKSAqIDIpKQorI2RlZmluZSBTM0M2NFhYX0dQSV9PVVRQVVQoX19ncGlvKQkoMHgxIDw8ICgoX19ncGlvKSAqIDIpKQorCisjZGVmaW5lIFMzQzY0WFhfR1BJMF9WRDAJCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BJMV9WRDEJCSgweDAyIDw8IDIpCisjZGVmaW5lIFMzQzY0WFhfR1BJMl9WRDIJCSgweDAyIDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BJM19WRDMJCSgweDAyIDw8IDYpCisjZGVmaW5lIFMzQzY0WFhfR1BJNF9WRDQJCSgweDAyIDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BJNV9WRDUJCSgweDAyIDw8IDEwKQorI2RlZmluZSBTM0M2NFhYX0dQSTZfVkQ2CQkoMHgwMiA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUEk3X1ZENwkJKDB4MDIgPDwgMTQpCisjZGVmaW5lIFMzQzY0WFhfR1BJOF9WRDgJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQSTlfVkQ5CQkoMHgwMiA8PCAxOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEkxMF9WRDEwCQkoMHgwMiA8PCAyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEkxMV9WRDExCQkoMHgwMiA8PCAyMikKKyNkZWZpbmUgUzNDNjRYWF9HUEkxMl9WRDEyCQkoMHgwMiA8PCAyNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEkxM19WRDEzCQkoMHgwMiA8PCAyNikKKyNkZWZpbmUgUzNDNjRYWF9HUEkxNF9WRDE0CQkoMHgwMiA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEkxNV9WRDE1CQkoMHgwMiA8PCAzMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWouaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWE5MDYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstai5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLWouaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgSiByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BKQ09OCQkJKFMzQzY0WFhfR1BKX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQSkRBVAkJCShTM0M2NFhYX0dQSl9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUEpQVUQJCQkoUzNDNjRYWF9HUEpfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BKQ09OU0xQCQkoUzNDNjRYWF9HUEpfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BKUFVEU0xQCQkoUzNDNjRYWF9HUEpfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUEpfQ09OTUFTSyhfX2dwaW8pCSgweDMgPDwgKChfX2dwaW8pICogMikpCisjZGVmaW5lIFMzQzY0WFhfR1BKX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiAyKSkKKyNkZWZpbmUgUzNDNjRYWF9HUEpfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiAyKSkKKworI2RlZmluZSBTM0M2NFhYX0dQSjBfVkQxNgkJKDB4MDIgPDwgMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEoxX1ZEMTcJCSgweDAyIDw8IDIpCisjZGVmaW5lIFMzQzY0WFhfR1BKMl9WRDE4CQkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQSjNfVkQxOQkJKDB4MDIgPDwgNikKKyNkZWZpbmUgUzNDNjRYWF9HUEo0X1ZEMjAJCSgweDAyIDw8IDgpCisjZGVmaW5lIFMzQzY0WFhfR1BKNV9WRDIxCQkoMHgwMiA8PCAxMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEo2X1ZEMjIJCSgweDAyIDw8IDEyKQorI2RlZmluZSBTM0M2NFhYX0dQSjdfVkQyMwkJKDB4MDIgPDwgMTQpCisjZGVmaW5lIFMzQzY0WFhfR1BKOF9MQ0RfSFNZTkMJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQSjlfTENEX1ZTWU5DCQkoMHgwMiA8PCAxOCkKKyNkZWZpbmUgUzNDNjRYWF9HUEoxMF9MQ0RfVkRFTgkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BKMTFfTENEX1ZDTEsJCSgweDAyIDw8IDIyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstbi5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OWU3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1uLmgKQEAgLTAsMCArMSw1NCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstbi5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIAlodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEdQSU8gQmFuayBOIHJlZ2lzdGVyIGFuZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNkZWZpbmUgUzNDNjRYWF9HUE5DT04JCQkoUzNDNjRYWF9HUE5fQkFTRSArIDB4MDApCisjZGVmaW5lIFMzQzY0WFhfR1BOREFUCQkJKFMzQzY0WFhfR1BOX0JBU0UgKyAweDA0KQorI2RlZmluZSBTM0M2NFhYX0dQTlBVRAkJCShTM0M2NFhYX0dQTl9CQVNFICsgMHgwOCkKKworI2RlZmluZSBTM0M2NFhYX0dQTl9DT05NQVNLKF9fZ3BpbykJKDB4MyA8PCAoKF9fZ3BpbykgKiAyKSkKKyNkZWZpbmUgUzNDNjRYWF9HUE5fSU5QVVQoX19ncGlvKQkoMHgwIDw8ICgoX19ncGlvKSAqIDIpKQorI2RlZmluZSBTM0M2NFhYX0dQTl9PVVRQVVQoX19ncGlvKQkoMHgxIDw8ICgoX19ncGlvKSAqIDIpKQorCisjZGVmaW5lIFMzQzY0WFhfR1BOMF9FSU5UMAkJKDB4MDIgPDwgMCkKKyNkZWZpbmUgUzNDNjRYWF9HUE4wX0tQX1JPVzAJCSgweDAzIDw8IDApCisKKyNkZWZpbmUgUzNDNjRYWF9HUE4xX0VJTlQxCQkoMHgwMiA8PCAyKQorI2RlZmluZSBTM0M2NFhYX0dQTjFfS1BfUk9XMQkJKDB4MDMgPDwgMikKKworI2RlZmluZSBTM0M2NFhYX0dQTjJfRUlOVDIJCSgweDAyIDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BOMl9LUF9ST1cyCQkoMHgwMyA8PCA0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BOM19FSU5UMwkJKDB4MDIgPDwgNikKKyNkZWZpbmUgUzNDNjRYWF9HUE4zX0tQX1JPVzMJCSgweDAzIDw8IDYpCisKKyNkZWZpbmUgUzNDNjRYWF9HUE40X0VJTlQ0CQkoMHgwMiA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQTjRfS1BfUk9XNAkJKDB4MDMgPDwgOCkKKworI2RlZmluZSBTM0M2NFhYX0dQTjVfRUlOVDUJCSgweDAyIDw8IDEwKQorI2RlZmluZSBTM0M2NFhYX0dQTjVfS1BfUk9XNQkJKDB4MDMgPDwgMTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUE42X0VJTlQ2CQkoMHgwMiA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUE42X0tQX1JPVzYJCSgweDAzIDw8IDEyKQorCisjZGVmaW5lIFMzQzY0WFhfR1BON19FSU5UNwkJKDB4MDIgPDwgMTQpCisjZGVmaW5lIFMzQzY0WFhfR1BON19LUF9ST1c3CQkoMHgwMyA8PCAxNCkKKworI2RlZmluZSBTM0M2NFhYX0dQTjhfRUlOVDgJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQTjlfRUlOVDkJCSgweDAyIDw8IDE4KQorI2RlZmluZSBTM0M2NFhYX0dQTjEwX0VJTlQxMAkJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BOMTFfRUlOVDExCQkoMHgwMiA8PCAyMikKKyNkZWZpbmUgUzNDNjRYWF9HUE4xMl9FSU5UMTIJCSgweDAyIDw8IDI0KQorI2RlZmluZSBTM0M2NFhYX0dQTjEzX0VJTlQxMwkJKDB4MDIgPDwgMjYpCisjZGVmaW5lIFMzQzY0WFhfR1BOMTRfRUlOVDE0CQkoMHgwMiA8PCAyOCkKKyNkZWZpbmUgUzNDNjRYWF9HUE4xNV9FSU5UMTUJCSgweDAyIDw8IDMwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstby5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWUxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1vLmgKQEAgLTAsMCArMSw3MCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstby5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIAlodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEdQSU8gQmFuayBPIHJlZ2lzdGVyIGFuZCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNkZWZpbmUgUzNDNjRYWF9HUE9DT04JCQkoUzNDNjRYWF9HUE9fQkFTRSArIDB4MDApCisjZGVmaW5lIFMzQzY0WFhfR1BPREFUCQkJKFMzQzY0WFhfR1BPX0JBU0UgKyAweDA0KQorI2RlZmluZSBTM0M2NFhYX0dQT1BVRAkJCShTM0M2NFhYX0dQT19CQVNFICsgMHgwOCkKKyNkZWZpbmUgUzNDNjRYWF9HUE9DT05TTFAJCShTM0M2NFhYX0dQT19CQVNFICsgMHgwYykKKyNkZWZpbmUgUzNDNjRYWF9HUE9QVURTTFAJCShTM0M2NFhYX0dQT19CQVNFICsgMHgxMCkKKworI2RlZmluZSBTM0M2NFhYX0dQT19DT05NQVNLKF9fZ3BpbykJKDB4MyA8PCAoKF9fZ3BpbykgKiAyKSkKKyNkZWZpbmUgUzNDNjRYWF9HUE9fSU5QVVQoX19ncGlvKQkoMHgwIDw8ICgoX19ncGlvKSAqIDIpKQorI2RlZmluZSBTM0M2NFhYX0dQT19PVVRQVVQoX19ncGlvKQkoMHgxIDw8ICgoX19ncGlvKSAqIDIpKQorCisjZGVmaW5lIFMzQzY0WFhfR1BPMF9NRU0wX25DUzIJCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BPMF9FSU5UX0c3XzAJCSgweDAzIDw8IDApCisKKyNkZWZpbmUgUzNDNjRYWF9HUE8xX01FTTBfbkNTMwkJKDB4MDIgPDwgMikKKyNkZWZpbmUgUzNDNjRYWF9HUE8xX0VJTlRfRzdfMQkJKDB4MDMgPDwgMikKKworI2RlZmluZSBTM0M2NFhYX0dQTzJfTUVNMF9uQ1M0CQkoMHgwMiA8PCA0KQorI2RlZmluZSBTM0M2NFhYX0dQTzJfRUlOVF9HN18yCQkoMHgwMyA8PCA0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BPM19NRU0wX25DUzUJCSgweDAyIDw8IDYpCisjZGVmaW5lIFMzQzY0WFhfR1BPM19FSU5UX0c3XzMJCSgweDAzIDw8IDYpCisKKyNkZWZpbmUgUzNDNjRYWF9HUE80X0VJTlRfRzdfNAkJKDB4MDMgPDwgOCkKKworI2RlZmluZSBTM0M2NFhYX0dQTzVfRUlOVF9HN181CQkoMHgwMyA8PCAxMCkKKworI2RlZmluZSBTM0M2NFhYX0dQTzZfTUVNMF9BRERSNgkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIFMzQzY0WFhfR1BPNl9FSU5UX0c3XzYJCSgweDAzIDw8IDEyKQorCisjZGVmaW5lIFMzQzY0WFhfR1BPN19NRU0wX0FERFI3CQkoMHgwMiA8PCAxNCkKKyNkZWZpbmUgUzNDNjRYWF9HUE83X0VJTlRfRzdfNwkJKDB4MDMgPDwgMTQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUE84X01FTTBfQUREUjgJCSgweDAyIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX0dQTzhfRUlOVF9HN184CQkoMHgwMyA8PCAxNikKKworI2RlZmluZSBTM0M2NFhYX0dQTzlfTUVNMF9BRERSOQkJKDB4MDIgPDwgMTgpCisjZGVmaW5lIFMzQzY0WFhfR1BPOV9FSU5UX0c3XzkJCSgweDAzIDw8IDE4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BPMTBfTUVNMF9BRERSMTAJKDB4MDIgPDwgMjApCisjZGVmaW5lIFMzQzY0WFhfR1BPMTBfRUlOVF9HN18xMAkoMHgwMyA8PCAyMCkKKworI2RlZmluZSBTM0M2NFhYX0dQTzExX01FTTBfQUREUjExCSgweDAyIDw8IDIyKQorI2RlZmluZSBTM0M2NFhYX0dQTzExX0VJTlRfRzdfMTEJKDB4MDMgPDwgMjIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUE8xMl9NRU0wX0FERFIxMgkoMHgwMiA8PCAyNCkKKyNkZWZpbmUgUzNDNjRYWF9HUE8xMl9FSU5UX0c3XzEyCSgweDAzIDw8IDI0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BPMTNfTUVNMF9BRERSMTMJKDB4MDIgPDwgMjYpCisjZGVmaW5lIFMzQzY0WFhfR1BPMTNfRUlOVF9HN18xMwkoMHgwMyA8PCAyNikKKworI2RlZmluZSBTM0M2NFhYX0dQTzE0X01FTTBfQUREUjE0CSgweDAyIDw8IDI4KQorI2RlZmluZSBTM0M2NFhYX0dQTzE0X0VJTlRfRzdfMTQJKDB4MDMgPDwgMjgpCisKKyNkZWZpbmUgUzNDNjRYWF9HUE8xNV9NRU0wX0FERFIxNQkoMHgwMiA8PCAzMCkKKyNkZWZpbmUgUzNDNjRYWF9HUE8xNV9FSU5UX0c3XzE1CSgweDAzIDw8IDMwKQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1wLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmMDA1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLXAuaApAQCAtMCwwICsxLDY5IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2dwaW8tYmFuay1wLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogR1BJTyBCYW5rIFAgcmVnaXN0ZXIgYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2RlZmluZSBTM0M2NFhYX0dQUENPTgkJCShTM0M2NFhYX0dQUF9CQVNFICsgMHgwMCkKKyNkZWZpbmUgUzNDNjRYWF9HUFBEQVQJCQkoUzNDNjRYWF9HUFBfQkFTRSArIDB4MDQpCisjZGVmaW5lIFMzQzY0WFhfR1BQUFVECQkJKFMzQzY0WFhfR1BQX0JBU0UgKyAweDA4KQorI2RlZmluZSBTM0M2NFhYX0dQUENPTlNMUAkJKFMzQzY0WFhfR1BQX0JBU0UgKyAweDBjKQorI2RlZmluZSBTM0M2NFhYX0dQUFBVRFNMUAkJKFMzQzY0WFhfR1BQX0JBU0UgKyAweDEwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BQX0NPTk1BU0soX19ncGlvKQkoMHgzIDw8ICgoX19ncGlvKSAqIDIpKQorI2RlZmluZSBTM0M2NFhYX0dQUF9JTlBVVChfX2dwaW8pCSgweDAgPDwgKChfX2dwaW8pICogMikpCisjZGVmaW5lIFMzQzY0WFhfR1BQX09VVFBVVChfX2dwaW8pCSgweDEgPDwgKChfX2dwaW8pICogMikpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFAwX01FTTBfQUREUlYJCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BQMF9FSU5UX0c4XzAJCSgweDAzIDw8IDApCisKKyNkZWZpbmUgUzNDNjRYWF9HUFAxX01FTTBfU01DTEsJCSgweDAyIDw8IDIpCisjZGVmaW5lIFMzQzY0WFhfR1BQMV9FSU5UX0c4XzEJCSgweDAzIDw8IDIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFAyX01FTTBfbldBSVQJCSgweDAyIDw8IDQpCisjZGVmaW5lIFMzQzY0WFhfR1BQMl9FSU5UX0c4XzIJCSgweDAzIDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFAzX01FTTBfUkRZMF9BTEUJKDB4MDIgPDwgNikKKyNkZWZpbmUgUzNDNjRYWF9HUFAzX0VJTlRfRzhfMwkJKDB4MDMgPDwgNikKKworI2RlZmluZSBTM0M2NFhYX0dQUDRfTUVNMF9SRFkxX0NMRQkoMHgwMiA8PCA4KQorI2RlZmluZSBTM0M2NFhYX0dQUDRfRUlOVF9HOF80CQkoMHgwMyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BQNV9NRU0wX0lOVHNtMF9GV0UJKDB4MDIgPDwgMTApCisjZGVmaW5lIFMzQzY0WFhfR1BQNV9FSU5UX0c4XzUJCSgweDAzIDw8IDEwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BQNl9NRU0wXyhudWxsKQkoMHgwMiA8PCAxMikKKyNkZWZpbmUgUzNDNjRYWF9HUFA2X0VJTlRfRzhfNgkJKDB4MDMgPDwgMTIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFA3X01FTTBfSU5Uc20xX0ZSRQkoMHgwMiA8PCAxNCkKKyNkZWZpbmUgUzNDNjRYWF9HUFA3X0VJTlRfRzhfNwkJKDB4MDMgPDwgMTQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFA4X01FTTBfUlBuX1JuQgkoMHgwMiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUFA4X0VJTlRfRzhfOAkJKDB4MDMgPDwgMTYpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFA5X01FTTBfQVRBX1JFU0VUCSgweDAyIDw8IDE4KQorI2RlZmluZSBTM0M2NFhYX0dQUDlfRUlOVF9HOF85CQkoMHgwMyA8PCAxOCkKKworI2RlZmluZSBTM0M2NFhYX0dQUDEwX01FTTBfQVRBX0lOUEFDSwkoMHgwMiA8PCAyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUFAxMF9FSU5UX0c4XzEwCSgweDAzIDw8IDIwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BQMTFfTUVNMF9BVEFfUkVHCSgweDAyIDw8IDIyKQorI2RlZmluZSBTM0M2NFhYX0dQUDExX0VJTlRfRzhfMTEJKDB4MDMgPDwgMjIpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFAxMl9NRU0wX0FUQV9XRQkoMHgwMiA8PCAyNCkKKyNkZWZpbmUgUzNDNjRYWF9HUFAxMl9FSU5UX0c4XzEyCSgweDAzIDw8IDI0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BQMTNfTUVNMF9BVEFfT0UJKDB4MDIgPDwgMjYpCisjZGVmaW5lIFMzQzY0WFhfR1BQMTNfRUlOVF9HOF8xMwkoMHgwMyA8PCAyNikKKworI2RlZmluZSBTM0M2NFhYX0dQUDE0X01FTTBfQVRBX0NECSgweDAyIDw8IDI4KQorI2RlZmluZSBTM0M2NFhYX0dQUDE0X0VJTlRfRzhfMTQJKDB4MDMgPDwgMjgpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLXEuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjVlNjBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9ncGlvLWJhbmstcS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvZ3Bpby1iYW5rLXEuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqIAlCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBHUElPIEJhbmsgUSByZWdpc3RlciBhbmQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjZGVmaW5lIFMzQzY0WFhfR1BRQ09OCQkJKFMzQzY0WFhfR1BRX0JBU0UgKyAweDAwKQorI2RlZmluZSBTM0M2NFhYX0dQUURBVAkJCShTM0M2NFhYX0dQUV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgUzNDNjRYWF9HUFFQVUQJCQkoUzNDNjRYWF9HUFFfQkFTRSArIDB4MDgpCisjZGVmaW5lIFMzQzY0WFhfR1BRQ09OU0xQCQkoUzNDNjRYWF9HUFFfQkFTRSArIDB4MGMpCisjZGVmaW5lIFMzQzY0WFhfR1BRUFVEU0xQCQkoUzNDNjRYWF9HUFFfQkFTRSArIDB4MTApCisKKyNkZWZpbmUgUzNDNjRYWF9HUFFfQ09OTUFTSyhfX2dwaW8pCSgweDMgPDwgKChfX2dwaW8pICogMikpCisjZGVmaW5lIFMzQzY0WFhfR1BRX0lOUFVUKF9fZ3BpbykJKDB4MCA8PCAoKF9fZ3BpbykgKiAyKSkKKyNkZWZpbmUgUzNDNjRYWF9HUFFfT1VUUFVUKF9fZ3BpbykJKDB4MSA8PCAoKF9fZ3BpbykgKiAyKSkKKworI2RlZmluZSBTM0M2NFhYX0dQUTBfTUVNMF9BRERSMThfUkFTCSgweDAyIDw8IDApCisjZGVmaW5lIFMzQzY0WFhfR1BRMF9FSU5UX0c5XzAJCSgweDAzIDw8IDApCisKKyNkZWZpbmUgUzNDNjRYWF9HUFExX01FTTBfQUREUjE5X0NBUwkoMHgwMiA8PCAyKQorI2RlZmluZSBTM0M2NFhYX0dQUTFfRUlOVF9HOV8xCQkoMHgwMyA8PCAyKQorCisjZGVmaW5lIFMzQzY0WFhfR1BRMl9FSU5UX0c5XzIJCSgweDAzIDw8IDQpCisKKyNkZWZpbmUgUzNDNjRYWF9HUFEzX0VJTlRfRzlfMwkJKDB4MDMgPDwgNikKKworI2RlZmluZSBTM0M2NFhYX0dQUTRfRUlOVF9HOV80CQkoMHgwMyA8PCA4KQorCisjZGVmaW5lIFMzQzY0WFhfR1BRNV9FSU5UX0c5XzUJCSgweDAzIDw8IDEwKQorCisjZGVmaW5lIFMzQzY0WFhfR1BRNl9FSU5UX0c5XzYJCSgweDAzIDw8IDEyKQorCisjZGVmaW5lIFMzQzY0WFhfR1BRN19NRU0wX0FERFIxN19XRU5ETUMJKDB4MDIgPDwgMTQpCisjZGVmaW5lIFMzQzY0WFhfR1BRN19FSU5UX0c5XzcJCSgweDAzIDw8IDE0KQorCisjZGVmaW5lIFMzQzY0WFhfR1BROF9NRU0wX0FERFIxNl9BUERNQwkoMHgwMiA8PCAxNikKKyNkZWZpbmUgUzNDNjRYWF9HUFE4X0VJTlRfRzlfOAkJKDB4MDMgPDwgMTYpCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9pcnFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlOGRkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCkBAIC0wLDAgKzEsMjAxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9tYWNoL2lycXMuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0WFggLSBDb21tb24gSVJRIHN1cHBvcnQKKyAqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfUzNDNjRYWF9JUlFTX0gKKyNkZWZpbmUgX19BU01fUExBVF9TM0M2NFhYX0lSUVNfSCBfX0ZJTEVfXworCisvKiB3ZSBrZWVwIHRoZSBmaXJzdCBzZXQgb2YgQ1BVIElSUXMgb3V0IG9mIHRoZSByYW5nZSBvZgorICogdGhlIElTQSBzcGFjZSwgc28gdGhhdCB0aGUgUEMxMDQgaGFzIHRoZW0gdG8gaXRzZWxmCisgKiBhbmQgd2UgZG9uJ3QgZW5kIHVwIGhhdmluZyB0byBkbyBob3JyaWJsZSB0aGluZ3MgdG8gdGhlCisgKiBzdGFuZGFyZCBJU0EgZHJpdmVycy4uLi4KKyAqCisgKiBub3RlLCBzaW5jZSB3ZSdyZSB1c2luZyB0aGUgVklDcywgb3VyIHN0YXJ0IG11c3QgYmUgYQorICogbXVsaXRwbGUgb2YgMzIgdG8gYWxsb3cgdGhlIGNvbW1vbiBjb2RlIHRvIHdvcmsKKyAqLworCisjZGVmaW5lIFMzQ19JUlFfT0ZGU0VUCSgzMikKKworI2RlZmluZSBTM0NfSVJRKHgpCSgoeCkgKyBTM0NfSVJRX09GRlNFVCkKKworI2RlZmluZSBTM0NfVklDMF9CQVNFCVMzQ19JUlEoMCkKKyNkZWZpbmUgUzNDX1ZJQzFfQkFTRQlTM0NfSVJRKDMyKQorCisvKiBVQVJUIGludGVycnVwdHMsIGVhY2ggVUFSVCBoYXMgNCBpbnR0ZXJ1cHRzIHBlciBjaGFubmVsIHNvCisgKiB1c2UgdGhlIHNwYWNlIGJldHdlZW4gdGhlIElTQSBhbmQgUzNDIG1haW4gaW50ZXJydXB0cy4gTm90ZSwgdGhlc2UKKyAqIGFyZSBub3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFMzQzI0WFggc2VyaWVzISAqLworCisjZGVmaW5lIElSUV9TM0NVQVJUX0JBU0UwCSgxNikKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfQkFTRTEJKDIwKQorI2RlZmluZSBJUlFfUzNDVUFSVF9CQVNFMgkoMjQpCisjZGVmaW5lIElSUV9TM0NVQVJUX0JBU0UzCSgyOCkKKworI2RlZmluZSBVQVJUX0lSUV9SWEQJCSgwKQorI2RlZmluZSBVQVJUX0lSUV9FUlIJCSgxKQorI2RlZmluZSBVQVJUX0lSUV9UWEQJCSgyKQorI2RlZmluZSBVQVJUX0lSUV9NT0RFTQkJKDMpCisKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfUlgwCQkoSVJRX1MzQ1VBUlRfQkFTRTAgKyBVQVJUX0lSUV9SWEQpCisjZGVmaW5lIElSUV9TM0NVQVJUX1RYMAkJKElSUV9TM0NVQVJUX0JBU0UwICsgVUFSVF9JUlFfVFhEKQorI2RlZmluZSBJUlFfUzNDVUFSVF9FUlIwCShJUlFfUzNDVUFSVF9CQVNFMCArIFVBUlRfSVJRX0VSUikKKworI2RlZmluZSBJUlFfUzNDVUFSVF9SWDEJCShJUlFfUzNDVUFSVF9CQVNFMSArIFVBUlRfSVJRX1JYRCkKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfVFgxCQkoSVJRX1MzQ1VBUlRfQkFTRTEgKyBVQVJUX0lSUV9UWEQpCisjZGVmaW5lIElSUV9TM0NVQVJUX0VSUjEJKElSUV9TM0NVQVJUX0JBU0UxICsgVUFSVF9JUlFfRVJSKQorCisjZGVmaW5lIElSUV9TM0NVQVJUX1JYMgkJKElSUV9TM0NVQVJUX0JBU0UyICsgVUFSVF9JUlFfUlhEKQorI2RlZmluZSBJUlFfUzNDVUFSVF9UWDIJCShJUlFfUzNDVUFSVF9CQVNFMiArIFVBUlRfSVJRX1RYRCkKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfRVJSMgkoSVJRX1MzQ1VBUlRfQkFTRTIgKyBVQVJUX0lSUV9FUlIpCisKKyNkZWZpbmUgSVJRX1MzQ1VBUlRfUlgzCQkoSVJRX1MzQ1VBUlRfQkFTRTMgKyBVQVJUX0lSUV9SWEQpCisjZGVmaW5lIElSUV9TM0NVQVJUX1RYMwkJKElSUV9TM0NVQVJUX0JBU0UzICsgVUFSVF9JUlFfVFhEKQorI2RlZmluZSBJUlFfUzNDVUFSVF9FUlIzCShJUlFfUzNDVUFSVF9CQVNFMyArIFVBUlRfSVJRX0VSUikKKworLyogVklDIGJhc2VkIElSUXMgKi8KKworI2RlZmluZSBTM0M2NFhYX0lSUV9WSUMwKHgpCShTM0NfVklDMF9CQVNFICsgKHgpKQorI2RlZmluZSBTM0M2NFhYX0lSUV9WSUMxKHgpCShTM0NfVklDMV9CQVNFICsgKHgpKQorCisvKiBWSUMwICovCisKKyNkZWZpbmUgSVJRX0VJTlQwXzMJCVMzQzY0WFhfSVJRX1ZJQzAoMCkKKyNkZWZpbmUgSVJRX0VJTlQ0XzExCQlTM0M2NFhYX0lSUV9WSUMwKDEpCisjZGVmaW5lIElSUV9SVENfVElDCQlTM0M2NFhYX0lSUV9WSUMwKDIpCisjZGVmaW5lIElSUV9DQU1JRl9DCQlTM0M2NFhYX0lSUV9WSUMwKDMpCisjZGVmaW5lIElSUV9DQU1JRl9QCQlTM0M2NFhYX0lSUV9WSUMwKDQpCisjZGVmaW5lIElSUV9DQU1JRl9NQwkJUzNDNjRYWF9JUlFfVklDMCg1KQorI2RlZmluZSBJUlFfUzNDNjQxMF9JSUMxCVMzQzY0WFhfSVJRX1ZJQzAoNSkKKyNkZWZpbmUgSVJRX1MzQzY0MTBfSUlTCQlTM0M2NFhYX0lSUV9WSUMwKDYpCisjZGVmaW5lIElSUV9TM0M2NDAwX0NBTUlGX01QCVMzQzY0WFhfSVJRX1ZJQzAoNikKKyNkZWZpbmUgSVJRX0NBTUlGX1dFX0MJCVMzQzY0WFhfSVJRX1ZJQzAoNykKKyNkZWZpbmUgSVJRX1MzQzY0MTBfRzNECQlTM0M2NFhYX0lSUV9WSUMwKDgpCisjZGVmaW5lIElSUV9TM0M2NDAwX0NBTUlGX1dFX1AJUzNDNjRYWF9JUlFfVklDMCg4KQorI2RlZmluZSBJUlFfUE9TVDAJCVMzQzY0WFhfSVJRX1ZJQzAoOSkKKyNkZWZpbmUgSVJRX1JPVEFUT1IJCVMzQzY0WFhfSVJRX1ZJQzAoMTApCisjZGVmaW5lIElSUV8yRAkJCVMzQzY0WFhfSVJRX1ZJQzAoMTEpCisjZGVmaW5lIElSUV9UVkVOQwkJUzNDNjRYWF9JUlFfVklDMCgxMikKKyNkZWZpbmUgSVJRX1NDQUxFUgkJUzNDNjRYWF9JUlFfVklDMCgxMykKKyNkZWZpbmUgSVJRX0JBVEYJCVMzQzY0WFhfSVJRX1ZJQzAoMTQpCisjZGVmaW5lIElSUV9KUEVHCQlTM0M2NFhYX0lSUV9WSUMwKDE1KQorI2RlZmluZSBJUlFfTUZDCQkJUzNDNjRYWF9JUlFfVklDMCgxNikKKyNkZWZpbmUgSVJRX1NETUEwCQlTM0M2NFhYX0lSUV9WSUMwKDE3KQorI2RlZmluZSBJUlFfU0RNQTEJCVMzQzY0WFhfSVJRX1ZJQzAoMTgpCisjZGVmaW5lIElSUV9BUk1fRE1BRVJSCQlTM0M2NFhYX0lSUV9WSUMwKDE5KQorI2RlZmluZSBJUlFfQVJNX0RNQQkJUzNDNjRYWF9JUlFfVklDMCgyMCkKKyNkZWZpbmUgSVJRX0FSTV9ETUFTCQlTM0M2NFhYX0lSUV9WSUMwKDIxKQorI2RlZmluZSBJUlFfS0VZUEFECQlTM0M2NFhYX0lSUV9WSUMwKDIyKQorI2RlZmluZSBJUlFfVElNRVIwX1ZJQwkJUzNDNjRYWF9JUlFfVklDMCgyMykKKyNkZWZpbmUgSVJRX1RJTUVSMV9WSUMJCVMzQzY0WFhfSVJRX1ZJQzAoMjQpCisjZGVmaW5lIElSUV9USU1FUjJfVklDCQlTM0M2NFhYX0lSUV9WSUMwKDI1KQorI2RlZmluZSBJUlFfV0RUCQkJUzNDNjRYWF9JUlFfVklDMCgyNikKKyNkZWZpbmUgSVJRX1RJTUVSM19WSUMJCVMzQzY0WFhfSVJRX1ZJQzAoMjcpCisjZGVmaW5lIElSUV9USU1FUjRfVklDCQlTM0M2NFhYX0lSUV9WSUMwKDI4KQorI2RlZmluZSBJUlFfTENEX0ZJRk8JCVMzQzY0WFhfSVJRX1ZJQzAoMjkpCisjZGVmaW5lIElSUV9MQ0RfVlNZTkMJCVMzQzY0WFhfSVJRX1ZJQzAoMzApCisjZGVmaW5lIElSUV9MQ0RfU1lTVEVNCQlTM0M2NFhYX0lSUV9WSUMwKDMxKQorCisvKiBWSUMxICovCisKKyNkZWZpbmUgSVJRX0VJTlQxMl8xOQkJUzNDNjRYWF9JUlFfVklDMSgwKQorI2RlZmluZSBJUlFfRUlOVDIwXzI3CQlTM0M2NFhYX0lSUV9WSUMxKDEpCisjZGVmaW5lIElSUV9QQ00wCQlTM0M2NFhYX0lSUV9WSUMxKDIpCisjZGVmaW5lIElSUV9QQ00xCQlTM0M2NFhYX0lSUV9WSUMxKDMpCisjZGVmaW5lIElSUV9BQzk3CQlTM0M2NFhYX0lSUV9WSUMxKDQpCisjZGVmaW5lIElSUV9VQVJUMAkJUzNDNjRYWF9JUlFfVklDMSg1KQorI2RlZmluZSBJUlFfVUFSVDEJCVMzQzY0WFhfSVJRX1ZJQzEoNikKKyNkZWZpbmUgSVJRX1VBUlQyCQlTM0M2NFhYX0lSUV9WSUMxKDcpCisjZGVmaW5lIElSUV9VQVJUMwkJUzNDNjRYWF9JUlFfVklDMSg4KQorI2RlZmluZSBJUlFfRE1BMAkJUzNDNjRYWF9JUlFfVklDMSg5KQorI2RlZmluZSBJUlFfRE1BMQkJUzNDNjRYWF9JUlFfVklDMSgxMCkKKyNkZWZpbmUgSVJRX09ORU5BTkQwCQlTM0M2NFhYX0lSUV9WSUMxKDExKQorI2RlZmluZSBJUlFfT05FTkFORDEJCVMzQzY0WFhfSVJRX1ZJQzEoMTIpCisjZGVmaW5lIElSUV9ORkMJCQlTM0M2NFhYX0lSUV9WSUMxKDEzKQorI2RlZmluZSBJUlFfQ0ZDT04JCVMzQzY0WFhfSVJRX1ZJQzEoMTQpCisjZGVmaW5lIElSUV9VSE9TVAkJUzNDNjRYWF9JUlFfVklDMSgxNSkKKyNkZWZpbmUgSVJRX1NQSTAJCVMzQzY0WFhfSVJRX1ZJQzEoMTYpCisjZGVmaW5lIElSUV9TUEkxCQlTM0M2NFhYX0lSUV9WSUMxKDE3KQorI2RlZmluZSBJUlFfSUlDCQkJUzNDNjRYWF9JUlFfVklDMSgxOCkKKyNkZWZpbmUgSVJRX0hTSXR4CQlTM0M2NFhYX0lSUV9WSUMxKDE5KQorI2RlZmluZSBJUlFfSFNJcngJCVMzQzY0WFhfSVJRX1ZJQzEoMjApCisjZGVmaW5lIElSUV9SRVNFUlZFRAkJUzNDNjRYWF9JUlFfVklDMSgyMSkKKyNkZWZpbmUgSVJRX01TTQkJCVMzQzY0WFhfSVJRX1ZJQzEoMjIpCisjZGVmaW5lIElSUV9IT1NUSUYJCVMzQzY0WFhfSVJRX1ZJQzEoMjMpCisjZGVmaW5lIElSUV9IU01NQzAJCVMzQzY0WFhfSVJRX1ZJQzEoMjQpCisjZGVmaW5lIElSUV9IU01NQzEJCVMzQzY0WFhfSVJRX1ZJQzEoMjUpCisjZGVmaW5lIElSUV9IU01NQzIJCUlSUV9TUEkxCS8qIHNoYXJlZCB3aXRoIFNQSTEgKi8KKyNkZWZpbmUgSVJRX09URwkJCVMzQzY0WFhfSVJRX1ZJQzEoMjYpCisjZGVmaW5lIElSUV9JUkRBCQlTM0M2NFhYX0lSUV9WSUMxKDI3KQorI2RlZmluZSBJUlFfUlRDX0FMQVJNCQlTM0M2NFhYX0lSUV9WSUMxKDI4KQorI2RlZmluZSBJUlFfU0VDCQkJUzNDNjRYWF9JUlFfVklDMSgyOSkKKyNkZWZpbmUgSVJRX1BFTkROCQlTM0M2NFhYX0lSUV9WSUMxKDMwKQorI2RlZmluZSBJUlFfVEMJCQlJUlFfUEVORE4KKyNkZWZpbmUgSVJRX0FEQwkJCVMzQzY0WFhfSVJRX1ZJQzEoMzEpCisKKyNkZWZpbmUgUzNDNjRYWF9USU1FUl9JUlEoeCkJUzNDX0lSUSg2NCArICh4KSkKKworI2RlZmluZSBJUlFfVElNRVIwCQlTM0M2NFhYX1RJTUVSX0lSUSgwKQorI2RlZmluZSBJUlFfVElNRVIxCQlTM0M2NFhYX1RJTUVSX0lSUSgxKQorI2RlZmluZSBJUlFfVElNRVIyCQlTM0M2NFhYX1RJTUVSX0lSUSgyKQorI2RlZmluZSBJUlFfVElNRVIzCQlTM0M2NFhYX1RJTUVSX0lSUSgzKQorI2RlZmluZSBJUlFfVElNRVI0CQlTM0M2NFhYX1RJTUVSX0lSUSg0KQorCisvKiBjb21wYXRpYmlsaXR5IGZvciBkZXZpY2UgZGVmaW5lcyAqLworCisjZGVmaW5lIElSUV9JSUMxCQlJUlFfUzNDNjQxMF9JSUMxCisKKy8qIFNpbmNlIHRoZSBJUlFfRUlOVCh4KSBhcmUgYSBsaW5lYXIgbWFwcGluZyBvbiBjdXJyZW50IHMzYzY0eHggc2VyaWVzCisgKiB3ZSBqdXN0IGRlZmluZWQgdGhlbSBhcyBhbiBJUlFfRUlOVCh4KSBtYWNybyBmcm9tIFMzQ19JUlFfRUlOVF9CQVNFCisgKiB3aGljaCB3ZSBwbGFjZSBhZnRlciB0aGUgcGFpciBvZiBWSUNzLiAqLworCisjZGVmaW5lIFMzQ19JUlFfRUlOVF9CQVNFCVMzQ19JUlEoNjQrNSkKKworI2RlZmluZSBTM0NfRUlOVCh4KQkJKCh4KSArIFMzQ19JUlFfRUlOVF9CQVNFKQorI2RlZmluZSBJUlFfRUlOVCh4KQkJUzNDX0VJTlQoeCkKKworLyogTmV4dCB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IGdyb3Vwcy4gVGhlc2UgYXJlIHNpbWlsYXIgdG8gdGhlIElSUV9FSU5UKHgpCisgKiB0aGF0IHRoZXkgYXJlIHNvdXJjZWQgZnJvbSB0aGUgR1BJTyBwaW5zIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHNjaGVtZSBmb3IKKyAqIHByaW9yaXR5IGFuZCBzb3VyY2UgaW5kaWNhdGlvbi4KKyAqCisgKiBUaGUgSVJRX0VJTlQoeCkgY2FuIGJlIHRob3VnaHQgb2YgYXMgJ2dyb3VwIDAnIG9mIHRoZSBhdmFpbGFibGUgR1BJTworICogaW50ZXJydXB0cywgYnV0IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhleSBhcmUga2VwdCBhcGFydCBmcm9tIHRoZXNlCisgKiBuZXh0IGludGVycnVwdHMuCisgKgorICogVXNlIElSUV9FSU5UX0dST1VQKGdyb3VwLCBvZmZzZXQpIHRvIGdldCB0aGUgbnVtYmVyIGZvciB1c2UgaW4gdGhlCisgKiBtYWNoaW5lIHNwZWNpZmljIHN1cHBvcnQgZmlsZXMuCisgKi8KKworI2RlZmluZSBJUlFfRUlOVF9HUk9VUDFfTlIJKDE1KQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDJfTlIJKDgpCisjZGVmaW5lIElSUV9FSU5UX0dST1VQM19OUgkoNSkKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVA0X05SCSgxNCkKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVA1X05SCSg3KQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDZfTlIJKDEwKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDdfTlIJKDE2KQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDhfTlIJKDE1KQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDlfTlIJKDkpCisKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVBfQkFTRQlTM0NfRUlOVCgyOCkKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVAxX0JBU0UJKElSUV9FSU5UX0dST1VQX0JBU0UgKyAweDAwKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDJfQkFTRQkoSVJRX0VJTlRfR1JPVVAxX0JBU0UgKyBJUlFfRUlOVF9HUk9VUDFfTlIpCisjZGVmaW5lIElSUV9FSU5UX0dST1VQM19CQVNFCShJUlFfRUlOVF9HUk9VUDJfQkFTRSArIElSUV9FSU5UX0dST1VQMl9OUikKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVA0X0JBU0UJKElSUV9FSU5UX0dST1VQM19CQVNFICsgSVJRX0VJTlRfR1JPVVAzX05SKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDVfQkFTRQkoSVJRX0VJTlRfR1JPVVA0X0JBU0UgKyBJUlFfRUlOVF9HUk9VUDRfTlIpCisjZGVmaW5lIElSUV9FSU5UX0dST1VQNl9CQVNFCShJUlFfRUlOVF9HUk9VUDVfQkFTRSArIElSUV9FSU5UX0dST1VQNV9OUikKKyNkZWZpbmUgSVJRX0VJTlRfR1JPVVA3X0JBU0UJKElSUV9FSU5UX0dST1VQNl9CQVNFICsgSVJRX0VJTlRfR1JPVVA2X05SKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUDhfQkFTRQkoSVJRX0VJTlRfR1JPVVA3X0JBU0UgKyBJUlFfRUlOVF9HUk9VUDdfTlIpCisjZGVmaW5lIElSUV9FSU5UX0dST1VQOV9CQVNFCShJUlFfRUlOVF9HUk9VUDhfQkFTRSArIElSUV9FSU5UX0dST1VQOF9OUikKKworI2RlZmluZSBJUlFfRUlOVF9HUk9VUChncm91cCwgbm8pCShJUlFfRUlOVF9HUk9VUCMjZ3JvdXAjI19fQkFTRSArICh4KSkKKworLyogU2V0IHRoZSBkZWZhdWx0IE5SX0lSUVMgKi8KKworI2RlZmluZSBOUl9JUlFTCShJUlFfRUlOVF9HUk9VUDlfQkFTRSArIElSUV9FSU5UX0dST1VQOV9OUiArIDEpCisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1MzQzY0WFhfSVJRU19IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcGxsLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3BsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmJkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3BsbC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0WFggUExMIGNvZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2RlZmluZSBTM0M2NDAwX1BMTF9NRElWX01BU0sJKCgxIDw8ICgyNS0xNisxKSkgLSAxKQorI2RlZmluZSBTM0M2NDAwX1BMTF9QRElWX01BU0sJKCgxIDw8ICgxMy04KzEpKSAtIDEpCisjZGVmaW5lIFMzQzY0MDBfUExMX1NESVZfTUFTSwkoKDEgPDwgKDItMCsxKSkgLSAxKQorI2RlZmluZSBTM0M2NDAwX1BMTF9NRElWX1NISUZUCSgxNikKKyNkZWZpbmUgUzNDNjQwMF9QTExfUERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUzNDNjQwMF9QTExfU0RJVl9TSElGVAkoMCkKKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjNjQwMF9nZXRfcGxsKHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKKwkJCQkJICAgIHUzMiBwbGxjb24pCit7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXY7CisJdTY0IGZ2Y28gPSBiYXNlY2xrOworCisJbWRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfTURJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfUERJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9QRElWX01BU0s7CisJc2RpdiA9IChwbGxjb24gPj4gUzNDNjQwMF9QTExfU0RJVl9TSElGVCkgJiBTM0M2NDAwX1BMTF9TRElWX01BU0s7CisKKwlmdmNvICo9IG1kaXY7CisJZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOworfQorCisjZGVmaW5lIFMzQzY0MDBfRVBMTF9NRElWX01BU0sJKCgxIDw8ICgyMy0xNikpIC0gMSkKKyNkZWZpbmUgUzNDNjQwMF9FUExMX1BESVZfTUFTSwkoKDEgPDwgKDEzLTgpKSAtIDEpCisjZGVmaW5lIFMzQzY0MDBfRVBMTF9TRElWX01BU0sJKCgxIDw8ICgyLTApKSAtIDEpCisjZGVmaW5lIFMzQzY0MDBfRVBMTF9NRElWX1NISUZUCSgxNikKKyNkZWZpbmUgUzNDNjQwMF9FUExMX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFMzQzY0MDBfRVBMTF9TRElWX1NISUZUCSgwKQorI2RlZmluZSBTM0M2NDAwX0VQTExfS0RJVl9NQVNLICAoMHhmZmZmKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjNjQwMF9nZXRfZXBsbCh1bnNpZ25lZCBsb25nIGJhc2VjbGspCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJdTMyIGVwbGwwID0gX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMCk7CisJdTMyIGVwbGwxID0gX19yYXdfcmVhZGwoUzNDX0VQTExfQ09OMSk7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXYsIGtkaXY7CisJdTY0IHRtcDsKKworCW1kaXYgPSAoZXBsbDAgPj4gUzNDNjQwMF9FUExMX01ESVZfU0hJRlQpICYgUzNDNjQwMF9FUExMX01ESVZfTUFTSzsKKwlwZGl2ID0gKGVwbGwwID4+IFMzQzY0MDBfRVBMTF9QRElWX1NISUZUKSAmIFMzQzY0MDBfRVBMTF9QRElWX01BU0s7CisJc2RpdiA9IChlcGxsMCA+PiBTM0M2NDAwX0VQTExfU0RJVl9TSElGVCkgJiBTM0M2NDAwX0VQTExfU0RJVl9NQVNLOworCWtkaXYgPSBlcGxsMSAmIFMzQzY0MDBfRVBMTF9LRElWX01BU0s7CisKKwkvKiBXZSBuZWVkIHRvIG11bHRpcGxlIGJhc2VjbGsgYnkgbWRpdiAodGhlIGludGVnZXIgcGFydCkgYW5kIGtkaXYKKwkgKiB3aGljaCBpcyBpbiAyXjE2dGhzLCBzbyBzaGlmdCBtZGl2IHVwIChkb2VzIG5vdCBvdmVyZmxvdykgYW5kCisJICogYWRkIGtkaXYgYmVmb3JlIG11bHRpcGx5aW5nLiBUaGUgdXNlIG9mIHRtcCBpcyB0byBhdm9pZCBhbnkKKwkgKiBvdmVyZmxvd3MgYmVmb3JlIHNoaWZ0aW5nIGJhYyBkb3duIGludG8gcmVzdWx0IHdoZW4gbXVsdGlwbGluZworCSAqIGJ5IHRoZSBtZGl2IGFuZCBrZGl2IHBhaXIuCisJICovCisKKwl0bXAgPSBiYXNlY2xrOworCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OworCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKKwlyZXN1bHQgPSB0bXAgPj4gMTY7CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTA4MmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9yZWdzLWNsb2NrLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1jbG9jay5oCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0M2NFhYIGNsb2NrIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19QTEFUX1JFR1NfQ0xPQ0tfSAorI2RlZmluZSBfX1BMQVRfUkVHU19DTE9DS19IIF9fRklMRV9fCisKKyNkZWZpbmUgUzNDX0NMS1JFRyh4KQkJKFMzQ19WQV9TWVMgKyAoeCkpCisKKyNkZWZpbmUgUzNDX0FQTExfTE9DSwkJUzNDX0NMS1JFRygweDAwKQorI2RlZmluZSBTM0NfTVBMTF9MT0NLCQlTM0NfQ0xLUkVHKDB4MDQpCisjZGVmaW5lIFMzQ19FUExMX0xPQ0sJCVMzQ19DTEtSRUcoMHgwOCkKKyNkZWZpbmUgUzNDX0FQTExfQ09OCQlTM0NfQ0xLUkVHKDB4MEMpCisjZGVmaW5lIFMzQ19NUExMX0NPTgkJUzNDX0NMS1JFRygweDEwKQorI2RlZmluZSBTM0NfRVBMTF9DT04wCQlTM0NfQ0xLUkVHKDB4MTQpCisjZGVmaW5lIFMzQ19FUExMX0NPTjEJCVMzQ19DTEtSRUcoMHgxOCkKKyNkZWZpbmUgUzNDX0NMS19TUkMJCVMzQ19DTEtSRUcoMHgxQykKKyNkZWZpbmUgUzNDX0NMS19ESVYwCQlTM0NfQ0xLUkVHKDB4MjApCisjZGVmaW5lIFMzQ19DTEtfRElWMQkJUzNDX0NMS1JFRygweDI0KQorI2RlZmluZSBTM0NfQ0xLX0RJVjIJCVMzQ19DTEtSRUcoMHgyOCkKKyNkZWZpbmUgUzNDX0NMS19PVVQJCVMzQ19DTEtSRUcoMHgyQykKKyNkZWZpbmUgUzNDX0hDTEtfR0FURQkJUzNDX0NMS1JFRygweDMwKQorI2RlZmluZSBTM0NfUENMS19HQVRFCQlTM0NfQ0xLUkVHKDB4MzQpCisjZGVmaW5lIFMzQ19TQ0xLX0dBVEUJCVMzQ19DTEtSRUcoMHgzOCkKKworLyogQ0xLRElWMCAqLworI2RlZmluZSBTM0M2NDAwX0NMS0RJVjBfTUZDX01BU0sJKDB4ZiA8PCAyOCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX01GQ19TSElGVAkoMjgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9KUEVHX01BU0sJKDB4ZiA8PCAyNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX0pQRUdfU0hJRlQJKDI0KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjBfQ0FNX01BU0sJKDB4ZiA8PCAyMCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX0NBTV9TSElGVAkoMjApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9TRUNVUklUWV9NQVNLCSgweDMgPDwgMTgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9TRUNVUklUWV9TSElGVAkoMTgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9QQ0xLX01BU0sJKDB4ZiA8PCAxMikKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX1BDTEtfU0hJRlQJKDEyKQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjBfSENMSzJfTUFTSwkoMHg3IDw8IDkpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9IQ0xLMl9TSElGVAkoOSkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX0hDTEtfTUFTSwkoMHgxIDw8IDgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9IQ0xLX1NISUZUCSg4KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjBfTVBMTF9NQVNLCSgweDEgPDwgNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYwX01QTExfU0hJRlQJKDQpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9BUk1fTUFTSwkoMHgzIDw8IDApCisjZGVmaW5lIFMzQzY0MTBfQ0xLRElWMF9BUk1fTUFTSwkoMHg3IDw8IDApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMF9BUk1fU0hJRlQJKDApCisKKy8qIENMS0RJVjEgKi8KKyNkZWZpbmUgUzNDNjQxMF9DTEtESVYxX0ZJTUNfTUFTSwkoMHhmIDw8IDI0KQorI2RlZmluZSBTM0M2NDEwX0NMS0RJVjFfRklNQ19TSElGVAkoMjQpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9VSE9TVF9NQVNLCSgweGYgPDwgMjApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9VSE9TVF9TSElGVAkoMjApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9TQ0FMRVJfTUFTSwkoMHhmIDw8IDE2KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjFfU0NBTEVSX1NISUZUCSgxNikKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYxX0xDRF9NQVNLCSgweGYgPDwgMTIpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9MQ0RfU0hJRlQJKDEyKQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjFfTU1DMl9NQVNLCSgweGYgPDwgOCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYxX01NQzJfU0hJRlQJKDgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9NTUMxX01BU0sJKDB4ZiA8PCA0KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjFfTU1DMV9TSElGVAkoNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYxX01NQzBfTUFTSwkoMHhmIDw8IDApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMV9NTUMwX1NISUZUCSgwKQorCisvKiBDTEtESVYyICovCisjZGVmaW5lIFMzQzY0MTBfQ0xLRElWMl9BVURJTzJfTUFTSwkoMHhmIDw8IDI0KQorI2RlZmluZSBTM0M2NDEwX0NMS0RJVjJfQVVESU8yX1NISUZUCSgyNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYyX0lSREFfTUFTSwkoMHhmIDw8IDIwKQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjJfSVJEQV9TSElGVAkoMjApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMl9VQVJUX01BU0sJKDB4ZiA8PCAxNikKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYyX1VBUlRfU0hJRlQJKDE2KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjJfQVVESU8xX01BU0sJKDB4ZiA8PCAxMikKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYyX0FVRElPMV9TSElGVAkoMTIpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMl9BVURJTzBfTUFTSwkoMHhmIDw8IDgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMl9BVURJTzBfU0hJRlQJKDgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMl9TUEkxX01BU0sJKDB4ZiA8PCA0KQorI2RlZmluZSBTM0M2NDAwX0NMS0RJVjJfU1BJMV9TSElGVAkoNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtESVYyX1NQSTBfTUFTSwkoMHhmIDw8IDApCisjZGVmaW5lIFMzQzY0MDBfQ0xLRElWMl9TUEkwX1NISUZUCSgwKQorCisvKiBIQ0xLIEdBVEUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19CVVMJKDE8PDMwKQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfU0VDVVIJKDE8PDI5KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfU0RNQTEJKDE8PDI4KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfU0RNQTIJKDE8PDI3KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfVUhPU1QJKDE8PDI2KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfSVJPTQkoMTw8MjUpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19ERFIxCSgxPDwyNCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX0REUjAJKDE8PDIzKQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfTUVNMQkoMTw8MjIpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19NRU0wCSgxPDwyMSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX1VTQgkoMTw8MjApCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19IU01NQzIJKDE8PDE5KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfSFNNTUMxCSgxPDwxOCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX0hTTU1DMAkoMTw8MTcpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19NRFAJKDE8PDE2KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfREhPU1QJKDE8PDE1KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfSUhPU1QJKDE8PDE0KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfRE1BMQkoMTw8MTMpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19ETUEwCSgxPDwxMikKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX0pQRUcJKDE8PDExKQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfQ0FNSUYJKDE8PDEwKQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfU0NBTEVSCSgxPDw5KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfMkQJKDE8PDgpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19UVgkoMTw8NykKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX1BPU1QwCSgxPDw1KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfUk9UCSgxPDw0KQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfTENECSgxPDwzKQorI2RlZmluZSBTM0NfQ0xLQ09OX0hDTEtfVFpJQwkoMTw8MikKKyNkZWZpbmUgUzNDX0NMS0NPTl9IQ0xLX0lOVEMJKDE8PDEpCisjZGVmaW5lIFMzQ19DTEtDT05fSENMS19NRkMJKDE8PDApCisKKy8qIFBDTEsgR0FURSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUzNDNjQxMF9DTEtDT05fUENMS19JMkMxCSgxPDwyNykKKyNkZWZpbmUgUzNDNjQxMF9DTEtDT05fUENMS19JSVMyCSgxPDwyNikKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX1NLRVkJCSgxPDwyNCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0NISVBJRAkJKDE8PDIzKQorI2RlZmluZSBTM0NfQ0xLQ09OX1BDTEtfU1BJMQkJKDE8PDIyKQorI2RlZmluZSBTM0NfQ0xLQ09OX1BDTEtfU1BJMAkJKDE8PDIxKQorI2RlZmluZSBTM0NfQ0xLQ09OX1BDTEtfSFNJUlgJCSgxPDwyMCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0hTSVRYCQkoMTw8MTkpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19HUElPCQkoMTw8MTgpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19JSUMJCSgxPDwxNykKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0lJUzEJCSgxPDwxNikKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0lJUzAJCSgxPDwxNSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0FDOTcJCSgxPDwxNCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX1RaUEMJCSgxPDwxMykKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX1RTQURDCQkoMTw8MTIpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19LRVlQQUQJCSgxPDwxMSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX0lSREEJCSgxPDwxMCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX1BDTTEJCSgxPDw5KQorI2RlZmluZSBTM0NfQ0xLQ09OX1BDTEtfUENNMAkJKDE8PDgpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19QV00JCSgxPDw3KQorI2RlZmluZSBTM0NfQ0xLQ09OX1BDTEtfUlRDCQkoMTw8NikKKyNkZWZpbmUgUzNDX0NMS0NPTl9QQ0xLX1dEVAkJKDE8PDUpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19VQVJUMwkJKDE8PDQpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19VQVJUMgkJKDE8PDMpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19VQVJUMQkJKDE8PDIpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19VQVJUMAkJKDE8PDEpCisjZGVmaW5lIFMzQ19DTEtDT05fUENMS19NRkMJCSgxPDwwKQorCisvKiBTQ0xLIEdBVEUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFMzQ19DTEtDT05fU0NMS19VSE9TVAkJKDE8PDMwKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMl80OAkJKDE8PDI5KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMV80OAkJKDE8PDI4KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMF80OAkJKDE8PDI3KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMgkJKDE8PDI2KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMQkJKDE8PDI1KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTU1DMAkJKDE8PDI0KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfU1BJMV80OCAJKDE8PDIzKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfU1BJMF80OCAJKDE8PDIyKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfU1BJMQkJKDE8PDIxKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfU1BJMAkJKDE8PDIwKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfREFDMjcJCSgxPDwxOSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX1RWMjcJCSgxPDwxOCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX1NDQUxFUjI3CSgxPDwxNykKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX1NDQUxFUgkJKDE8PDE2KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTENEMjcJCSgxPDwxNSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX0xDRAkJKDE8PDE0KQorI2RlZmluZSBTM0M2NDAwX0NMS0NPTl9TQ0xLX1BPU1QxXzI3CSgxPDwxMykKKyNkZWZpbmUgUzNDNjQxMF9DTEtDT05fRklNQwkJKDE8PDEzKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfUE9TVDBfMjcJKDE8PDEyKQorI2RlZmluZSBTM0M2NDAwX0NMS0NPTl9TQ0xLX1BPU1QxCSgxPDwxMSkKKyNkZWZpbmUgUzNDNjQxMF9DTEtDT05fU0NMS19BVURJTzIJKDE8PDExKQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfUE9TVDAJCSgxPDwxMCkKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX0FVRElPMQkJKDE8PDkpCisjZGVmaW5lIFMzQ19DTEtDT05fU0NMS19BVURJTzAJCSgxPDw4KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfU0VDVVIJCSgxPDw3KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfSVJEQQkJKDE8PDYpCisjZGVmaW5lIFMzQ19DTEtDT05fU0NMS19VQVJUCQkoMTw8NSkKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX09ORU5BTkQgCSgxPDw0KQorI2RlZmluZSBTM0NfQ0xLQ09OX1NDTEtfTUZDCQkoMTw8MykKKyNkZWZpbmUgUzNDX0NMS0NPTl9TQ0xLX0NBTQkJKDE8PDIpCisjZGVmaW5lIFMzQ19DTEtDT05fU0NMS19KUEVHCQkoMTw8MSkKKworLyogQ0xLU1JDICovCisKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfQVBMTF9NT1VUCSgxIDw8IDApCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX01QTExfTU9VVAkoMSA8PCAxKQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19FUExMX01PVVQJKDEgPDwgMikKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfQVBMTF9NT1VUX1NISUZUCSgwKQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19NUExMX01PVVRfU0hJRlQJKDEpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX0VQTExfTU9VVF9TSElGVAkoMikKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfTUZDCQkoMSA8PCA0KQorCisjZGVmaW5lIFMzQzY0MTBfQ0xLU1JDX1RWMjdfTUFTSwkoMHgxIDw8IDMxKQorI2RlZmluZSBTM0M2NDEwX0NMS1NSQ19UVjI3X1NISUZUCSgzMSkKKyNkZWZpbmUgUzNDNjQxMF9DTEtTUkNfREFDMjdfTUFTSwkoMHgxIDw8IDMwKQorI2RlZmluZSBTM0M2NDEwX0NMS1NSQ19EQUMyN19TSElGVAkoMzApCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX1NDQUxFUl9NQVNLCSgweDMgPDwgMjgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX1NDQUxFUl9TSElGVAkoMjgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX0xDRF9NQVNLCQkoMHgzIDw8IDI2KQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19MQ0RfU0hJRlQJKDI2KQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19JUkRBX01BU0sJKDB4MyA8PCAyNCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfSVJEQV9TSElGVAkoMjQpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX01NQzJfTUFTSwkoMHgzIDw8IDIyKQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19NTUMyX1NISUZUCSgyMikKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfTU1DMV9NQVNLCSgweDMgPDwgMjApCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX01NQzFfU0hJRlQJKDIwKQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19NTUMwX01BU0sJKDB4MyA8PCAxOCkKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfTU1DMF9TSElGVAkoMTgpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX1NQSTFfTUFTSwkoMHgzIDw8IDE2KQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19TUEkxX1NISUZUCSgxNikKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfU1BJMF9NQVNLCSgweDMgPDwgMTQpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX1NQSTBfU0hJRlQJKDE0KQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19VQVJUX01BU0sJKDB4MSA8PCAxMykKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfVUFSVF9TSElGVAkoMTMpCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX0FVRElPMV9NQVNLCSgweDcgPDwgMTApCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX0FVRElPMV9TSElGVAkoMTApCisjZGVmaW5lIFMzQzY0MDBfQ0xLU1JDX0FVRElPMF9NQVNLCSgweDcgPDwgNykKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfQVVESU8wX1NISUZUCSg3KQorI2RlZmluZSBTM0M2NDAwX0NMS1NSQ19VSE9TVF9NQVNLCSgweDMgPDwgNSkKKyNkZWZpbmUgUzNDNjQwMF9DTEtTUkNfVUhPU1RfU0hJRlQJKDUpCisKKworI2VuZGlmIC8qIF9QTEFUX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9yZWdzLWdwaW8uaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViODczZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1ncGlvLmgKQEAgLTAsMCArMSwzNSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0WFggLSBHUElPIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1MzQzY0WFhfUkVHU19HUElPX0gKKyNkZWZpbmUgX19BU01fUExBVF9TM0M2NFhYX1JFR1NfR1BJT19IIF9fRklMRV9fCisKKy8qIEJhc2UgYWRkcmVzc2VzIGZvciBlYWNoIG9mIHRoZSBiYW5rcyAqLworCisjZGVmaW5lIFMzQzY0WFhfR1BBX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDAwMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEJfQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwMDIwKQorI2RlZmluZSBTM0M2NFhYX0dQQ19CQVNFCShTM0M2NFhYX1ZBX0dQSU8gKyAweDAwNDApCisjZGVmaW5lIFMzQzY0WFhfR1BEX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDA2MCkKKyNkZWZpbmUgUzNDNjRYWF9HUEVfQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwMDgwKQorI2RlZmluZSBTM0M2NFhYX0dQRl9CQVNFCShTM0M2NFhYX1ZBX0dQSU8gKyAweDAwQTApCisjZGVmaW5lIFMzQzY0WFhfR1BHX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDBDMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEhfQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwMEUwKQorI2RlZmluZSBTM0M2NFhYX0dQSV9CQVNFCShTM0M2NFhYX1ZBX0dQSU8gKyAweDAxMDApCisjZGVmaW5lIFMzQzY0WFhfR1BKX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDEyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUEtfQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwODAwKQorI2RlZmluZSBTM0M2NFhYX0dQTF9CQVNFCShTM0M2NFhYX1ZBX0dQSU8gKyAweDA4MTApCisjZGVmaW5lIFMzQzY0WFhfR1BNX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDgyMCkKKyNkZWZpbmUgUzNDNjRYWF9HUE5fQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwODMwKQorI2RlZmluZSBTM0M2NFhYX0dQT19CQVNFCShTM0M2NFhYX1ZBX0dQSU8gKyAweDAxNDApCisjZGVmaW5lIFMzQzY0WFhfR1BQX0JBU0UJKFMzQzY0WFhfVkFfR1BJTyArIDB4MDE2MCkKKyNkZWZpbmUgUzNDNjRYWF9HUFFfQkFTRQkoUzNDNjRYWF9WQV9HUElPICsgMHgwMTgwKQorCisjZW5kaWYgLyogX19BU01fUExBVF9TM0M2NFhYX1JFR1NfR1BJT19IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zeXMuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkODI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9yZWdzLXN5cy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zeXMuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjRYWCBzeXN0ZW0gcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX1BMQVRfUkVHU19TWVNfSAorI2RlZmluZSBfX1BMQVRfUkVHU19TWVNfSCBfX0ZJTEVfXworCisjZGVmaW5lIFMzQ19TWVNSRUcoeCkJCShTM0NfVkFfU1lTICsgKHgpKQorCisjZGVmaW5lIFMzQzY0WFhfT1RIRVJTCQlTM0NfU1lTUkVHKDB4OTAwKQorCisjZGVmaW5lIFMzQzY0WFhfT1RIRVJTX1VTQk1BU0sJKDEgPDwgMTYpCisKKyNlbmRpZiAvKiBfUExBVF9SRUdTX1NZU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MDAuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvczNjNjQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWVhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MDAuaApAQCAtMCwwICsxLDM1IEBACisvKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MDAuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzY0MDAgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzNDNjQwMCByZWxhdGVkIFNvQ3MgKi8KKworZXh0ZXJuIHZvaWQgczNjNjQwMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CitleHRlcm4gdm9pZCBzM2M2NDAwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MDBfc2V0dXBfY2xvY2tzKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0NQVV9TM0M2NDAwCisKK2V4dGVybiAgaW50IHMzYzY0MDBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MDBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQwMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczNjNjQwMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczNjNjQwMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzY0MDBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzY0MDBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjNjQwMF9pbml0IE5VTEwKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvczNjNjQxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGNkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaApAQCAtMCwwICsxLDI5IEBACisvKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCAgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2M2NDEwIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKKworZXh0ZXJuICBpbnQgczNjNjQxMF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MTBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczNjNjQxMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczNjNjQxMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzY0MTBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzY0MTBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjNjQxMF9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2lycS1laW50LmMgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaXJxLWVpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdjYzAwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2lycS1laW50LmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9pcnEtZWludC5jCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjRYWCAtIEludGVycnVwdCBoYW5kbGluZyBmb3IgSVJRX0VJTlQoeCkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLWlycXR5cGUuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworLyogR1BJTyBpcyAweDdGMDA4eHh4LCAqLworI2RlZmluZSBTM0M2NFhYX0dQSU9SRUcoeCkJKFMzQzY0WFhfVkFfR1BJTyArICh4KSkKKworI2RlZmluZSBTM0M2NFhYX0VJTlQwQ09OMAlTM0M2NFhYX0dQSU9SRUcoMHg5MDApCisjZGVmaW5lIFMzQzY0WFhfRUlOVDBDT04xCVMzQzY0WFhfR1BJT1JFRygweDkwNCkKKyNkZWZpbmUgUzNDNjRYWF9FSU5UMEZMVENPTjAJUzNDNjRYWF9HUElPUkVHKDB4OTEwKQorI2RlZmluZSBTM0M2NFhYX0VJTlQwRkxUQ09OMQlTM0M2NFhYX0dQSU9SRUcoMHg5MTQpCisjZGVmaW5lIFMzQzY0WFhfRUlOVDBGTFRDT04yCVMzQzY0WFhfR1BJT1JFRygweDkxOCkKKyNkZWZpbmUgUzNDNjRYWF9FSU5UMEZMVENPTjMJUzNDNjRYWF9HUElPUkVHKDB4OTFDKQorCisjZGVmaW5lIFMzQzY0WFhfRUlOVDBNQVNLCVMzQzY0WFhfR1BJT1JFRygweDkyMCkKKyNkZWZpbmUgUzNDNjRYWF9FSU5UMFBFTkQJUzNDNjRYWF9HUElPUkVHKDB4OTI0KQorCisKKyNkZWZpbmUgZWludF9vZmZzZXQoaXJxKQkoKGlycSkgLSBJUlFfRUlOVCgwKSkKKyNkZWZpbmUgZWludF9pcnFfdG9fYml0KGlycSkJKDEgPDwgZWludF9vZmZzZXQoaXJxKSkKKworc3RhdGljIGlubGluZSB2b2lkIHMzY19pcnFfZWludF9tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2s7CisKKwltYXNrID0gX19yYXdfcmVhZGwoUzNDNjRYWF9FSU5UME1BU0spOworCW1hc2sgfD0gZWludF9pcnFfdG9fYml0KGlycSk7CisJX19yYXdfd3JpdGVsKG1hc2ssIFMzQzY0WFhfRUlOVDBNQVNLKTsKK30KKworc3RhdGljIHZvaWQgczNjX2lycV9laW50X3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBtYXNrOworCisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzY0WFhfRUlOVDBNQVNLKTsKKwltYXNrIHw9IGVpbnRfaXJxX3RvX2JpdChpcnEpOworCV9fcmF3X3dyaXRlbChtYXNrLCBTM0M2NFhYX0VJTlQwTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaXJxX2VpbnRfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJX19yYXdfd3JpdGVsKGVpbnRfaXJxX3RvX2JpdChpcnEpLCBTM0M2NFhYX0VJTlQwUEVORCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZWludF9tYXNrYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyogY29tcGlsZXIgc2hvdWxkIGluLWxpbmUgdGhlc2UgKi8KKwlzM2NfaXJxX2VpbnRfbWFzayhpcnEpOworCXMzY19pcnFfZWludF9hY2soaXJxKTsKK30KKworc3RhdGljIGludCBzM2NfaXJxX2VpbnRfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJaW50IG9mZnMgPSBlaW50X29mZnNldChpcnEpOworCWludCBzaGlmdDsKKwl1MzIgY3RybCwgbWFzazsKKwl1MzIgbmV3dmFsdWUgPSAwOworCXZvaWQgX19pb21lbSAqcmVnOworCisJaWYgKG9mZnMgPiAyNykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2ZmcyA8PSAxNSkKKwkJcmVnID0gUzNDNjRYWF9FSU5UMENPTjA7CisJZWxzZQorCQlyZWcgPSBTM0M2NFhYX0VJTlQwQ09OMTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJRX1RZUEVfTk9ORToKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gZWRnZSBzZXR0aW5nIVxuIik7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJbmV3dmFsdWUgPSBTM0MyNDEwX0VYVElOVF9SSVNFRURHRTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJbmV3dmFsdWUgPSBTM0MyNDEwX0VYVElOVF9GQUxMRURHRTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJbmV3dmFsdWUgPSBTM0MyNDEwX0VYVElOVF9CT1RIRURHRTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJbmV3dmFsdWUgPSBTM0MyNDEwX0VYVElOVF9MT1dMRVY7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQluZXd2YWx1ZSA9IFMzQzI0MTBfRVhUSU5UX0hJTEVWOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiTm8gc3VjaCBpcnEgdHlwZSAlZCIsIHR5cGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2hpZnQgPSAob2ZmcyAvIDIpICogNDsKKwltYXNrID0gMHg3IDw8IHNoaWZ0OworCisJY3RybCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJY3RybCAmPSB+bWFzazsKKwljdHJsIHw9IG5ld3ZhbHVlIDw8IHNoaWZ0OworCV9fcmF3X3dyaXRlbChjdHJsLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9laW50ID0geworCS5uYW1lCQk9ICJzM2MtZWludCIsCisJLm1hc2sJCT0gczNjX2lycV9laW50X21hc2ssCisJLnVubWFzawkJPSBzM2NfaXJxX2VpbnRfdW5tYXNrLAorCS5tYXNrX2Fjawk9IHMzY19pcnFfZWludF9tYXNrYWNrLAorCS5hY2sJCT0gczNjX2lycV9laW50X2FjaywKKwkuc2V0X3R5cGUJPSBzM2NfaXJxX2VpbnRfc2V0X3R5cGUsCit9OworCisvKiBzM2NfaXJxX2RlbXV4X2VpbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRlbXV4ZXMgdGhlIElSUSBmcm9tIHRoZSBncm91cDAgZXh0ZXJuYWwgaW50ZXJydXB0cywKKyAqIGZyb20gSVJRX0VJTlQoMCkgdG8gSVJRX0VJTlQoMjcpLiBJdCBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmVkIGludG8KKyAqIHRoZSBzcGVjaWZpYyBoYW5kbGVycyBzM2NfaXJxX2RlbXV4X2VpbnRYX1kuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaXJxX2RlbXV4X2VpbnQodW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kKQoreworCXUzMiBzdGF0dXMgPSBfX3Jhd19yZWFkbChTM0M2NFhYX0VJTlQwUEVORCk7CisJdTMyIG1hc2sgPSBfX3Jhd19yZWFkbChTM0M2NFhYX0VJTlQwTUFTSyk7CisJdW5zaWduZWQgaW50IGlycTsKKworCXN0YXR1cyAmPSB+bWFzazsKKwlzdGF0dXMgPj49IHN0YXJ0OworCXN0YXR1cyAmPSAoMSA8PCAoZW5kIC0gc3RhcnQgKyAxKSkgLSAxOworCisJZm9yIChpcnEgPSBJUlFfRUlOVChzdGFydCk7IGlycSA8PSBJUlFfRUlOVChlbmQpOyBpcnErKykgeworCQlpZiAoc3RhdHVzICYgMSkKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCisJCXN0YXR1cyA+Pj0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfZWludDBfMyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJczNjX2lycV9kZW11eF9laW50KDAsIDMpOworfQorCitzdGF0aWMgdm9pZCBzM2NfaXJxX2RlbXV4X2VpbnQ0XzExKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X2VpbnQoNCwgMTEpOworfQorCitzdGF0aWMgdm9pZCBzM2NfaXJxX2RlbXV4X2VpbnQxMl8xOSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJczNjX2lycV9kZW11eF9laW50KDEyLCAxOSk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfZWludDIwXzI3KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X2VpbnQoMjAsIDI3KTsKK30KKworaW50IF9faW5pdCBzM2M2NHh4X2luaXRfaXJxX2VpbnQodm9pZCkKK3sKKwlpbnQgaXJxOworCisJZm9yIChpcnEgPSBJUlFfRUlOVCgwKTsgaXJxIDw9IElSUV9FSU5UKDI3KTsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJnMzY19pcnFfZWludCk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0VJTlQwXzMsIHMzY19pcnFfZGVtdXhfZWludDBfMyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0VJTlQ0XzExLCBzM2NfaXJxX2RlbXV4X2VpbnQ0XzExKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfRUlOVDEyXzE5LCBzM2NfaXJxX2RlbXV4X2VpbnQxMl8xOSk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0VJTlQyMF8yNywgczNjX2lycV9kZW11eF9laW50MjBfMjcpOworCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoczNjNjR4eF9pbml0X2lycV9laW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pcnEuYyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRmMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2lycS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTM0M2NFhYIC0gSW50ZXJydXB0IGhhbmRsaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS92aWMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXRpbWVyLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworLyogVGltZXIgaW50ZXJydXB0IGhhbmRsaW5nICovCisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXIodW5zaWduZWQgaW50IGJhc2VfaXJxLCB1bnNpZ25lZCBpbnQgc3ViX2lycSkKK3sKKwlnZW5lcmljX2hhbmRsZV9pcnEoc3ViX2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXIwKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X3RpbWVyKGlycSwgSVJRX1RJTUVSMCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXIxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X3RpbWVyKGlycSwgSVJRX1RJTUVSMSk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXIyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X3RpbWVyKGlycSwgSVJRX1RJTUVSMik7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXIzKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X3RpbWVyKGlycSwgSVJRX1RJTUVSMyk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdGltZXI0KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzM2NfaXJxX2RlbXV4X3RpbWVyKGlycSwgSVJRX1RJTUVSNCk7Cit9CisKKy8qIFdlIGFzc3VtZSB0aGUgSVJRX1RJTUVSMC4uSVJRX1RJTUVSNCByYW5nZSBpcyBjb250aW51b3VzLiAqLworCitzdGF0aWMgdm9pZCBzM2NfaXJxX3RpbWVyX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgcmVnID0gX19yYXdfcmVhZGwoUzNDNjRYWF9USU5UX0NTVEFUKTsKKworCXJlZyAmPSAweDFmOyAgLyogbWFzayBvdXQgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJcmVnICY9IH4oMSA8PCAoaXJxIC0gSVJRX1RJTUVSMCkpOworCV9fcmF3X3dyaXRlbChyZWcsIFMzQzY0WFhfVElOVF9DU1RBVCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfdGltZXJfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIHJlZyA9IF9fcmF3X3JlYWRsKFMzQzY0WFhfVElOVF9DU1RBVCk7CisKKwlyZWcgJj0gMHgxZjsgIC8qIG1hc2sgb3V0IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXJlZyB8PSAxIDw8IChpcnEgLSBJUlFfVElNRVIwKTsKKwlfX3Jhd193cml0ZWwocmVnLCBTM0M2NFhYX1RJTlRfQ1NUQVQpOworfQorCitzdGF0aWMgdm9pZCBzM2NfaXJxX3RpbWVyX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiByZWcgPSBfX3Jhd19yZWFkbChTM0M2NFhYX1RJTlRfQ1NUQVQpOworCisJcmVnICY9IDB4MWY7CisJcmVnIHw9ICgxIDw8IDUpIDw8IChpcnEgLSBJUlFfVElNRVIwKTsKKwlfX3Jhd193cml0ZWwocmVnLCBTM0M2NFhYX1RJTlRfQ1NUQVQpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHMzY19pcnFfdGltZXIgPSB7CisJLm5hbWUJCT0gInMzYy10aW1lciIsCisJLm1hc2sJCT0gczNjX2lycV90aW1lcl9tYXNrLAorCS51bm1hc2sJCT0gczNjX2lycV90aW1lcl91bm1hc2ssCisJLmFjawkJPSBzM2NfaXJxX3RpbWVyX2FjaywKK307CisKK3N0cnVjdCB1YXJ0X2lycSB7CisJdm9pZCBfX2lvbWVtCSpyZWdzOworCXVuc2lnbmVkIGludAkgYmFzZV9pcnE7CisJdW5zaWduZWQgaW50CSBwYXJlbnRfaXJxOworfTsKKworLyogTm90ZSwgd2UgbWFrZSB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgcGFyZW50IElSUXMsIElSUV9VQVJUWzAuLjNdCisgKiBhcmUgY29uc2VjdXRpdmUgd2hlbiBsb29raW5nIHVwIHRoZSBpbnRlcnJ1cHQgaW4gdGhlIGRlbXV4IHJvdXRpbmVzLgorICovCitzdGF0aWMgc3RydWN0IHVhcnRfaXJxIHVhcnRfaXJxc1tdID0geworCVswXSA9IHsKKwkJLnJlZ3MJCT0gUzNDX1ZBX1VBUlQwLAorCQkuYmFzZV9pcnEJPSBJUlFfUzNDVUFSVF9CQVNFMCwKKwkJLnBhcmVudF9pcnEJPSBJUlFfVUFSVDAsCisJfSwKKwlbMV0gPSB7CisJCS5yZWdzCQk9IFMzQ19WQV9VQVJUMSwKKwkJLmJhc2VfaXJxCT0gSVJRX1MzQ1VBUlRfQkFTRTEsCisJCS5wYXJlbnRfaXJxCT0gSVJRX1VBUlQxLAorCX0sCisJWzJdID0geworCQkucmVncwkJPSBTM0NfVkFfVUFSVDIsCisJCS5iYXNlX2lycQk9IElSUV9TM0NVQVJUX0JBU0UyLAorCQkucGFyZW50X2lycQk9IElSUV9VQVJUMiwKKwl9LAorCVszXSA9IHsKKwkJLnJlZ3MJCT0gUzNDX1ZBX1VBUlQzLAorCQkuYmFzZV9pcnEJPSBJUlFfUzNDVUFSVF9CQVNFMywKKwkJLnBhcmVudF9pcnEJPSBJUlFfVUFSVDMsCisJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpzM2NfaXJxX3VhcnRfYmFzZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCB1YXJ0X2lycSAqdWlycSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJcmV0dXJuIHVpcnEtPnJlZ3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHMzY19pcnFfdWFydF9iaXQodW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxICYgMzsKK30KKworLyogVUFSVCBpbnRlcnJ1cHQgcmVnaXN0ZXJzLCBub3Qgd29ydGggYWRkaW5nIHRvIHNlcGVyYXRlIGluY2x1ZGUgaGVhZGVyICovCisjZGVmaW5lIFMzQzY0WFhfVUlOVFAJMHgzMAorI2RlZmluZSBTM0M2NFhYX1VJTlRTUAkweDM0CisjZGVmaW5lIFMzQzY0WFhfVUlOVE0JMHgzOAorCitzdGF0aWMgdm9pZCBzM2NfaXJxX3VhcnRfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXZvaWQgX19pb21lbSAqcmVncyA9IHMzY19pcnFfdWFydF9iYXNlKGlycSk7CisJdW5zaWduZWQgaW50IGJpdCA9IHMzY19pcnFfdWFydF9iaXQoaXJxKTsKKwl1MzIgcmVnOworCisJcmVnID0gX19yYXdfcmVhZGwocmVncyArIFMzQzY0WFhfVUlOVE0pOworCXJlZyB8PSAoMSA8PCBiaXQpOworCV9fcmF3X3dyaXRlbChyZWcsIHJlZ3MgKyBTM0M2NFhYX1VJTlRNKTsKK30KKworc3RhdGljIHZvaWQgczNjX2lycV91YXJ0X21hc2thY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBzM2NfaXJxX3VhcnRfYmFzZShpcnEpOworCXVuc2lnbmVkIGludCBiaXQgPSBzM2NfaXJxX3VhcnRfYml0KGlycSk7CisJdTMyIHJlZzsKKworCXJlZyA9IF9fcmF3X3JlYWRsKHJlZ3MgKyBTM0M2NFhYX1VJTlRNKTsKKwlyZWcgfD0gKDEgPDwgYml0KTsKKwlfX3Jhd193cml0ZWwocmVnLCByZWdzICsgUzNDNjRYWF9VSU5UTSk7CisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCByZWdzICsgUzNDNjRYWF9VSU5UUCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfdWFydF91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBzM2NfaXJxX3VhcnRfYmFzZShpcnEpOworCXVuc2lnbmVkIGludCBiaXQgPSBzM2NfaXJxX3VhcnRfYml0KGlycSk7CisJdTMyIHJlZzsKKworCXJlZyA9IF9fcmF3X3JlYWRsKHJlZ3MgKyBTM0M2NFhYX1VJTlRNKTsKKwlyZWcgJj0gfigxIDw8IGJpdCk7CisJX19yYXdfd3JpdGVsKHJlZywgcmVncyArIFMzQzY0WFhfVUlOVE0pOworfQorCitzdGF0aWMgdm9pZCBzM2NfaXJxX3VhcnRfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gczNjX2lycV91YXJ0X2Jhc2UoaXJxKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0gczNjX2lycV91YXJ0X2JpdChpcnEpOworCisJX19yYXdfd3JpdGVsKDEgPDwgYml0LCByZWdzICsgUzNDNjRYWF9VSU5UUCk7Cit9CisKK3N0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfdWFydCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHVhcnRfaXJxICp1aXJxID0gJnVhcnRfaXJxc1tpcnEgLSBJUlFfVUFSVDBdOworCXUzMiBwZW5kID0gX19yYXdfcmVhZGwodWlycS0+cmVncyArIFMzQzY0WFhfVUlOVFApOworCWludCBiYXNlID0gdWlycS0+YmFzZV9pcnE7CisKKwlpZiAocGVuZCAmICgxIDw8IDApKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoYmFzZSk7CisJaWYgKHBlbmQgJiAoMSA8PCAxKSkKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGJhc2UgKyAxKTsKKwlpZiAocGVuZCAmICgxIDw8IDIpKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoYmFzZSArIDIpOworCWlmIChwZW5kICYgKDEgPDwgMykpCisJCWdlbmVyaWNfaGFuZGxlX2lycShiYXNlICsgMyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV91YXJ0ID0geworCS5uYW1lCQk9ICJzM2MtdWFydCIsCisJLm1hc2sJCT0gczNjX2lycV91YXJ0X21hc2ssCisJLnVubWFzawkJPSBzM2NfaXJxX3VhcnRfdW5tYXNrLAorCS5tYXNrX2Fjawk9IHMzY19pcnFfdWFydF9tYXNrYWNrLAorCS5hY2sJCT0gczNjX2lycV91YXJ0X2FjaywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzM2M2NHh4X3VhcnRfaXJxKHN0cnVjdCB1YXJ0X2lycSAqdWlycSkKK3sKKwl2b2lkICpyZWdfYmFzZSA9IHVpcnEtPnJlZ3M7CisJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgb2ZmczsKKworCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIHN0YXJ0LiAqLworCV9fcmF3X3dyaXRlbCgweGYsIHJlZ19iYXNlICsgUzNDNjRYWF9VSU5UTSk7CisKKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgMzsgb2ZmcysrKSB7CisJCWlycSA9IHVpcnEtPmJhc2VfaXJxICsgb2ZmczsKKworCQlzZXRfaXJxX2NoaXAoaXJxLCAmczNjX2lycV91YXJ0KTsKKwkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCB1aXJxKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcih1aXJxLT5wYXJlbnRfaXJxLCBzM2NfaXJxX2RlbXV4X3VhcnQpOworfQorCit2b2lkIF9faW5pdCBzM2M2NHh4X2luaXRfaXJxKHUzMiB2aWMwX3ZhbGlkLCB1MzIgdmljMV92YWxpZCkKK3sKKwlpbnQgdWFydCwgaXJxOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbml0aWFsaXNpbmcgaW50ZXJydXB0c1xuIiwgX19mdW5jX18pOworCisJLyogaW5pdGlhbGlzZSB0aGUgcGFpciBvZiBWSUNzICovCisJdmljX2luaXQoUzNDX1ZBX1ZJQzAsIFMzQ19WSUMwX0JBU0UsIHZpYzBfdmFsaWQpOworCXZpY19pbml0KFMzQ19WQV9WSUMxLCBTM0NfVklDMV9CQVNFLCB2aWMxX3ZhbGlkKTsKKworCS8qIGFkZCB0aGUgdGltZXIgc3ViLWlycXMgKi8KKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9USU1FUjBfVklDLCBzM2NfaXJxX2RlbXV4X3RpbWVyMCk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1RJTUVSMV9WSUMsIHMzY19pcnFfZGVtdXhfdGltZXIxKTsKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfVElNRVIyX1ZJQywgczNjX2lycV9kZW11eF90aW1lcjIpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9USU1FUjNfVklDLCBzM2NfaXJxX2RlbXV4X3RpbWVyMyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1RJTUVSNF9WSUMsIHMzY19pcnFfZGVtdXhfdGltZXI0KTsKKworCWZvciAoaXJxID0gSVJRX1RJTUVSMDsgaXJxIDw9IElSUV9USU1FUjQ7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcChpcnEsICZzM2NfaXJxX3RpbWVyKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlmb3IgKHVhcnQgPSAwOyB1YXJ0IDwgQVJSQVlfU0laRSh1YXJ0X2lycXMpOyB1YXJ0KyspCisJCXMzYzY0eHhfdWFydF9pcnEoJnVhcnRfaXJxc1t1YXJ0XSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3MzYzY0MDAtY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zM2M2NDAwLWNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5YTBjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zM2M2NDAwLWNsb2NrLmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zM2M2NDAwLWNsb2NrLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFMzQzY0MDAgYmFzZWQgY29tbW9uIGNsb2NrIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisKKyNpbmNsdWRlIDxwbGF0L3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgorCisvKiBmaW5fYXBsbCwgZmluX21wbGwgYW5kIGZpbl9lcGxsIGFyZSBhbGwgdGhlIHNhbWUgY2xvY2ssIHdoaWNoIHdlIGNhbGwKKyAqIGV4dF94dGFsX211eCBmb3Igd2FudCBvZiBhbiBhY3R1YWwgbmFtZSBmcm9tIHRoZSBtYW51YWwuCisqLworCitzdHJ1Y3QgY2xrIGNsa19leHRfeHRhbF9tdXggPSB7CisJLm5hbWUJCT0gImV4dF94dGFsIiwKKwkuaWQJCT0gLTEsCit9OworCisjZGVmaW5lIGNsa19maW5fYXBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fbXBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fZXBsbCBjbGtfZXh0X3h0YWxfbXV4CisKKyNkZWZpbmUgY2xrX2ZvdXRfbXBsbAljbGtfbXBsbAorCitzdHJ1Y3QgY2xrX3NvdXJjZXMgeworCXVuc2lnbmVkIGludAlucl9zb3VyY2VzOworCXN0cnVjdCBjbGsJKipzb3VyY2VzOworfTsKKworc3RydWN0IGNsa3NyY19jbGsgeworCXN0cnVjdCBjbGsJCWNsazsKKwl1bnNpZ25lZCBpbnQJCW1hc2s7CisJdW5zaWduZWQgaW50CQlzaGlmdDsKKworCXN0cnVjdCBjbGtfc291cmNlcwkqc291cmNlczsKKworCXVuc2lnbmVkIGludAkJZGl2aWRlcl9zaGlmdDsKKwl2b2lkIF9faW9tZW0JCSpyZWdfZGl2aWRlcjsKK307CisKK3N0cnVjdCBjbGsgY2xrX2ZvdXRfYXBsbCA9IHsKKwkubmFtZQkJPSAiZm91dF9hcGxsIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrX3NyY19hcGxsX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX2Zpbl9hcGxsLAorCVsxXSA9ICZjbGtfZm91dF9hcGxsLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfc291cmNlcyBjbGtfc3JjX2FwbGwgPSB7CisJLnNvdXJjZXMJPSBjbGtfc3JjX2FwbGxfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrX3NyY19hcGxsX2xpc3QpLAorfTsKKworc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYXBsbCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9hcGxsIiwKKwkJLmlkCQk9IC0xLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX0FQTExfTU9VVF9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19BUExMX01PVVQsCisJLnNvdXJjZXMJPSAmY2xrX3NyY19hcGxsLAorfTsKKworc3RydWN0IGNsayBjbGtfZm91dF9lcGxsID0geworCS5uYW1lCQk9ICJmb3V0X2VwbGwiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfc3JjX2VwbGxfbGlzdFtdID0geworCVswXSA9ICZjbGtfZmluX2VwbGwsCisJWzFdID0gJmNsa19mb3V0X2VwbGwsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19zb3VyY2VzIGNsa19zcmNfZXBsbCA9IHsKKwkuc291cmNlcwk9IGNsa19zcmNfZXBsbF9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtfc3JjX2VwbGxfbGlzdCksCit9OworCitzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9lcGxsID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtb3V0X2VwbGwiLAorCQkuaWQJCT0gLTEsCisJfSwKKwkuc2hpZnQJCT0gUzNDNjQwMF9DTEtTUkNfRVBMTF9NT1VUX1NISUZULAorCS5tYXNrCQk9IFMzQzY0MDBfQ0xLU1JDX0VQTExfTU9VVCwKKwkuc291cmNlcwk9ICZjbGtfc3JjX2VwbGwsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrX3NyY19tcGxsX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX2Zpbl9tcGxsLAorCVsxXSA9ICZjbGtfZm91dF9tcGxsLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfc291cmNlcyBjbGtfc3JjX21wbGwgPSB7CisJLnNvdXJjZXMJPSBjbGtfc3JjX21wbGxfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrX3NyY19tcGxsX2xpc3QpLAorfTsKKworc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbCA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAibW91dF9tcGxsIiwKKwkJLmlkCQk9IC0xLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX01QTExfTU9VVF9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19NUExMX01PVVQsCisJLnNvdXJjZXMJPSAmY2xrX3NyY19tcGxsLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjNjR4eF9jbGtfZG91dG1wbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBhcmVudCBpcyAlbGRcbiIsIF9fZnVuY19fLCByYXRlKTsKKworCWlmIChfX3Jhd19yZWFkbChTM0NfQ0xLX0RJVjApICYgUzNDNjQwMF9DTEtESVYwX01QTExfTUFTSykKKwkJcmF0ZSAvPSAyOworCisJcmV0dXJuIHJhdGU7Cit9CisKK3N0cnVjdCBjbGsgY2xrX2RvdXRfbXBsbCA9IHsKKwkubmFtZQkJPSAiZG91dF9tcGxsIiwKKwkuaWQJCT0gLTEsCisJLnBhcmVudAkJPSAmY2xrX21vdXRfbXBsbC5jbGssCisJLmdldF9yYXRlCT0gczNjNjR4eF9jbGtfZG91dG1wbGxfZ2V0X3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3NwaV9tbWNfbGlzdFtdID0geworCSZjbGtfbW91dF9lcGxsLmNsaywKKwkmY2xrX2RvdXRfbXBsbCwKKwkmY2xrX2Zpbl9lcGxsLAorCSZjbGtfMjdtLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfc291cmNlcyBjbGtzZXRfc3BpX21tYyA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9zcGlfbW1jX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9zcGlfbW1jX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9pcmRhX2xpc3RbXSA9IHsKKwkmY2xrX21vdXRfZXBsbC5jbGssCisJJmNsa19kb3V0X21wbGwsCisJTlVMTCwKKwkmY2xrXzI3bSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3NvdXJjZXMgY2xrc2V0X2lyZGEgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfaXJkYV9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfaXJkYV9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfdWFydF9saXN0W10gPSB7CisJJmNsa19tb3V0X2VwbGwuY2xrLAorCSZjbGtfZG91dF9tcGxsLAorCU5VTEwsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfc291cmNlcyBjbGtzZXRfdWFydCA9IHsKKwkuc291cmNlcwk9IGNsa3NldF91YXJ0X2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF91YXJ0X2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF91aG9zdF9saXN0W10gPSB7CisJJmNsa19tb3V0X2VwbGwuY2xrLAorCSZjbGtfZG91dF9tcGxsLAorCSZjbGtfZmluX2VwbGwsCisJJmNsa180OG0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19zb3VyY2VzIGNsa3NldF91aG9zdCA9IHsKKwkuc291cmNlcwk9IGNsa3NldF91aG9zdF9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfdWhvc3RfbGlzdCksCit9OworCisKKy8qIFRoZSBwZXJpcGhlcmFsIGNsb2NrcyBhcmUgYWxsIGNvbnRyb2xsZWQgdmlhIGNsb2Nrc291cmNlIGZvbGxvd2VkCisgKiBieSBhbiBvcHRpb25hbCBkaXZpZGVyIGFuZCBnYXRlIHN0YWdlLiBXZSBjdXJyZW50bHkgcm9sbCB0aGlzIGludG8KKyAqIG9uZSBjbG9jayB3aGljaCBoaWRlcyB0aGUgaW50ZXJtZWRpYXRlIGNsb2NrIGZyb20gdGhlIG11eC4KKyAqCisgKiBOb3RlLCB0aGUgSlBFRyBjbG9jayBjYW4gb25seSBiZSBhbiBldmVuIGRpdmlkZXIuLi4KKyAqCisgKiBUaGUgc2NhbGVyIGFuZCBMQ0QgY2xvY2tzIGRlcGVuZCBvbiB0aGUgUzNDNjRYWCB2ZXJzaW9uLCBhbmQgYWxzbworICogaGF2ZSBhIGNvbW1vbiBwYXJlbnQgZGl2aXNvciBzbyBhcmUgbm90IGluY2x1ZGVkIGhlcmUuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2xrc3JjX2NsayAqdG9fY2xrc3JjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNsaywgc3RydWN0IGNsa3NyY19jbGssIGNsayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBjbGtzcmNfY2xrICpzY2xrID0gdG9fY2xrc3JjKGNsayk7CisJdW5zaWduZWQgbG9uZyByYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1MzIgY2xrZGl2ID0gX19yYXdfcmVhZGwoc2Nsay0+cmVnX2RpdmlkZXIpOworCisJY2xrZGl2ID4+PSBzY2xrLT5kaXZpZGVyX3NoaWZ0OworCWNsa2RpdiAmPSAweGY7CisJY2xrZGl2Kys7CisKKwlyYXRlIC89IGNsa2RpdjsKKwlyZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIGludCBzM2M2NHh4X3NldHJhdGVfY2xrc3JjKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXN0cnVjdCBjbGtzcmNfY2xrICpzY2xrID0gdG9fY2xrc3JjKGNsayk7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBzY2xrLT5yZWdfZGl2aWRlcjsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXUzMiB2YWw7CisKKwlyYXRlID0gY2xrX3JvdW5kX3JhdGUoY2xrLCByYXRlKTsKKwlkaXYgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gcmF0ZTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJdmFsICY9IH5zY2xrLT5tYXNrOworCXZhbCB8PSAocmF0ZSAtIDEpIDw8IHNjbGstPnNoaWZ0OworCV9fcmF3X3dyaXRlbCh2YWwsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2M2NHh4X3NldHBhcmVudF9jbGtzcmMoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJc3RydWN0IGNsa3NyY19jbGsgKnNjbGsgPSB0b19jbGtzcmMoY2xrKTsKKwlzdHJ1Y3QgY2xrX3NvdXJjZXMgKnNyY3MgPSBzY2xrLT5zb3VyY2VzOworCXUzMiBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0NfQ0xLX1NSQyk7CisJaW50IHNyY19uciA9IC0xOworCWludCBwdHI7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IHNyY3MtPm5yX3NvdXJjZXM7IHB0cisrKQorCQlpZiAoc3Jjcy0+c291cmNlc1twdHJdID09IHBhcmVudCkgeworCQkJc3JjX25yID0gcHRyOworCQkJYnJlYWs7CisJCX0KKworCWlmIChzcmNfbnIgPj0gMCkgeworCQljbGtzcmMgJj0gfnNjbGstPm1hc2s7CisJCWNsa3NyYyB8PSBzcmNfbnIgPDwgc2Nsay0+c2hpZnQ7CisKKwkJX19yYXdfd3JpdGVsKGNsa3NyYywgUzNDX0NMS19TUkMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjNjR4eF9yb3VuZHJhdGVfY2xrc3JjKHN0cnVjdCBjbGsgKmNsaywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCWludCBkaXY7CisKKwlpZiAocmF0ZSA+IHBhcmVudF9yYXRlKQorCQlyYXRlID0gcGFyZW50X3JhdGU7CisJZWxzZSB7CisJCWRpdiA9IHJhdGUgLyBwYXJlbnRfcmF0ZTsKKworCQlpZiAoZGl2ID09IDApCisJCQlkaXYgPSAxOworCQlpZiAoZGl2ID4gMTYpCisJCQlkaXYgPSAxNjsKKworCQlyYXRlID0gcGFyZW50X3JhdGUgLyBkaXY7CisJfQorCisJcmV0dXJuIHJhdGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW1jMCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW1jX2J1cyIsCisJCS5pZAkJPSAwLAorCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfTU1DMCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKKwkJLnNldF9wYXJlbnQJPSBzM2M2NHh4X3NldHBhcmVudF9jbGtzcmMsCisJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcmF0ZQk9IHMzYzY0eHhfc2V0cmF0ZV9jbGtzcmMsCisJCS5yb3VuZF9yYXRlCT0gczNjNjR4eF9yb3VuZHJhdGVfY2xrc3JjLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX01NQzBfU0hJRlQsCisJLm1hc2sJCT0gUzNDNjQwMF9DTEtTUkNfTU1DMF9NQVNLLAorCS5zb3VyY2VzCT0gJmNsa3NldF9zcGlfbW1jLAorCS5kaXZpZGVyX3NoaWZ0CT0gUzNDNjQwMF9DTEtESVYxX01NQzBfU0hJRlQsCisJLnJlZ19kaXZpZGVyCT0gUzNDX0NMS19ESVYxLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tbWMxID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtbWNfYnVzIiwKKwkJLmlkCQk9IDEsCisJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19NTUMxLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAorCQkuZ2V0X3JhdGUJPSBzM2M2NHh4X2dldHJhdGVfY2xrc3JjLAorCQkuc2V0X3JhdGUJPSBzM2M2NHh4X3NldHJhdGVfY2xrc3JjLAorCQkuc2V0X3BhcmVudAk9IHMzYzY0eHhfc2V0cGFyZW50X2Nsa3NyYywKKwkJLnJvdW5kX3JhdGUJPSBzM2M2NHh4X3JvdW5kcmF0ZV9jbGtzcmMsCisJfSwKKwkuc2hpZnQJCT0gUzNDNjQwMF9DTEtTUkNfTU1DMV9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19NTUMxX01BU0ssCisJLnNvdXJjZXMJPSAmY2xrc2V0X3NwaV9tbWMsCisJLmRpdmlkZXJfc2hpZnQJPSBTM0M2NDAwX0NMS0RJVjFfTU1DMV9TSElGVCwKKwkucmVnX2RpdmlkZXIJPSBTM0NfQ0xLX0RJVjEsCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21tYzIgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1tY19idXMiLAorCQkuaWQJCT0gMiwKKwkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX01NQzIsCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcmF0ZQk9IHMzYzY0eHhfc2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcGFyZW50CT0gczNjNjR4eF9zZXRwYXJlbnRfY2xrc3JjLAorCQkucm91bmRfcmF0ZQk9IHMzYzY0eHhfcm91bmRyYXRlX2Nsa3NyYywKKwl9LAorCS5zaGlmdAkJPSBTM0M2NDAwX0NMS1NSQ19NTUMyX1NISUZULAorCS5tYXNrCQk9IFMzQzY0MDBfQ0xLU1JDX01NQzJfTUFTSywKKwkuc291cmNlcwk9ICZjbGtzZXRfc3BpX21tYywKKwkuZGl2aWRlcl9zaGlmdAk9IFMzQzY0MDBfQ0xLRElWMV9NTUMyX1NISUZULAorCS5yZWdfZGl2aWRlcgk9IFMzQ19DTEtfRElWMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfdXNiaG9zdCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAidXNiLWhvc3QtYnVzIiwKKwkJLmlkCQk9IC0xLAorCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfVUhPU1QsCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5zZXRfcGFyZW50CT0gczNjNjR4eF9zZXRwYXJlbnRfY2xrc3JjLAorCQkuZ2V0X3JhdGUJPSBzM2M2NHh4X2dldHJhdGVfY2xrc3JjLAorCQkuc2V0X3JhdGUJPSBzM2M2NHh4X3NldHJhdGVfY2xrc3JjLAorCQkucm91bmRfcmF0ZQk9IHMzYzY0eHhfcm91bmRyYXRlX2Nsa3NyYywKKwl9LAorCS5zaGlmdAkJPSBTM0M2NDAwX0NMS1NSQ19VSE9TVF9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19VSE9TVF9NQVNLLAorCS5zb3VyY2VzCT0gJmNsa3NldF91aG9zdCwKKwkuZGl2aWRlcl9zaGlmdAk9IFMzQzY0MDBfQ0xLRElWMV9VSE9TVF9TSElGVCwKKwkucmVnX2RpdmlkZXIJPSBTM0NfQ0xLX0RJVjEsCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3VhcnRfdWNsazEgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInVjbGsxIiwKKwkJLmlkCQk9IC0xLAorCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfVUFSVCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKKwkJLnNldF9wYXJlbnQJPSBzM2M2NHh4X3NldHBhcmVudF9jbGtzcmMsCisJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcmF0ZQk9IHMzYzY0eHhfc2V0cmF0ZV9jbGtzcmMsCisJCS5yb3VuZF9yYXRlCT0gczNjNjR4eF9yb3VuZHJhdGVfY2xrc3JjLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX1VBUlRfU0hJRlQsCisJLm1hc2sJCT0gUzNDNjQwMF9DTEtTUkNfVUFSVF9NQVNLLAorCS5zb3VyY2VzCT0gJmNsa3NldF91YXJ0LAorCS5kaXZpZGVyX3NoaWZ0CT0gUzNDNjQwMF9DTEtESVYyX1VBUlRfU0hJRlQsCisJLnJlZ19kaXZpZGVyCT0gUzNDX0NMS19ESVYyLAorfTsKKworLyogV2hlcmUgZG9lcyBVQ0xLMCBjb21lIGZyb20/ICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc3BpMCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAic3BpLWJ1cyIsCisJCS5pZAkJPSAwLAorCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfU1BJMCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKKwkJLnNldF9wYXJlbnQJPSBzM2M2NHh4X3NldHBhcmVudF9jbGtzcmMsCisJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcmF0ZQk9IHMzYzY0eHhfc2V0cmF0ZV9jbGtzcmMsCisJCS5yb3VuZF9yYXRlCT0gczNjNjR4eF9yb3VuZHJhdGVfY2xrc3JjLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX1NQSTBfU0hJRlQsCisJLm1hc2sJCT0gUzNDNjQwMF9DTEtTUkNfU1BJMF9NQVNLLAorCS5zb3VyY2VzCT0gJmNsa3NldF9zcGlfbW1jLAorCS5kaXZpZGVyX3NoaWZ0CT0gUzNDNjQwMF9DTEtESVYyX1NQSTBfU0hJRlQsCisJLnJlZ19kaXZpZGVyCT0gUzNDX0NMS19ESVYyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zcGkxID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJzcGktYnVzIiwKKwkJLmlkCQk9IDEsCisJCS5jdHJsYml0ICAgICAgICA9IFMzQ19DTEtDT05fU0NMS19TUEkxLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAorCQkuc2V0X3BhcmVudAk9IHMzYzY0eHhfc2V0cGFyZW50X2Nsa3NyYywKKwkJLmdldF9yYXRlCT0gczNjNjR4eF9nZXRyYXRlX2Nsa3NyYywKKwkJLnNldF9yYXRlCT0gczNjNjR4eF9zZXRyYXRlX2Nsa3NyYywKKwkJLnJvdW5kX3JhdGUJPSBzM2M2NHh4X3JvdW5kcmF0ZV9jbGtzcmMsCisJfSwKKwkuc2hpZnQJCT0gUzNDNjQwMF9DTEtTUkNfU1BJMV9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19TUEkxX01BU0ssCisJLnNvdXJjZXMJPSAmY2xrc2V0X3NwaV9tbWMsCisJLmRpdmlkZXJfc2hpZnQJPSBTM0M2NDAwX0NMS0RJVjJfU1BJMV9TSElGVCwKKwkucmVnX2RpdmlkZXIJPSBTM0NfQ0xLX0RJVjIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfaWlzX2NkMCA9IHsKKwkubmFtZQkJPSAiaWlzX2NkY2xrMCIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2lpc19jZDEgPSB7CisJLm5hbWUJCT0gImlpc19jZGNsazEiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wY21fY2QgPSB7CisJLm5hbWUJCT0gInBjbV9jZGNsayIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9hdWRpbzBfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9lcGxsLmNsaywKKwlbMV0gPSAmY2xrX2RvdXRfbXBsbCwKKwlbMl0gPSAmY2xrX2Zpbl9lcGxsLAorCVszXSA9ICZjbGtfaWlzX2NkMCwKKwlbNF0gPSAmY2xrX3BjbV9jZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3NvdXJjZXMgY2xrc2V0X2F1ZGlvMCA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9hdWRpbzBfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X2F1ZGlvMF9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYXVkaW8wID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhdWRpby1idXMiLAorCQkuaWQJCT0gMCwKKwkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX0FVRElPMCwKKwkJLmVuYWJsZQkJPSBzM2M2NHh4X3NjbGtfY3RybCwKKwkJLnNldF9wYXJlbnQJPSBzM2M2NHh4X3NldHBhcmVudF9jbGtzcmMsCisJCS5nZXRfcmF0ZQk9IHMzYzY0eHhfZ2V0cmF0ZV9jbGtzcmMsCisJCS5zZXRfcmF0ZQk9IHMzYzY0eHhfc2V0cmF0ZV9jbGtzcmMsCisJCS5yb3VuZF9yYXRlCT0gczNjNjR4eF9yb3VuZHJhdGVfY2xrc3JjLAorCX0sCisJLnNoaWZ0CQk9IFMzQzY0MDBfQ0xLU1JDX0FVRElPMF9TSElGVCwKKwkubWFzawkJPSBTM0M2NDAwX0NMS1NSQ19BVURJTzBfTUFTSywKKwkuc291cmNlcwk9ICZjbGtzZXRfYXVkaW8wLAorCS5kaXZpZGVyX3NoaWZ0CT0gUzNDNjQwMF9DTEtESVYyX0FVRElPMF9TSElGVCwKKwkucmVnX2RpdmlkZXIJPSBTM0NfQ0xLX0RJVjIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X2F1ZGlvMV9saXN0W10gPSB7CisJWzBdID0gJmNsa19tb3V0X2VwbGwuY2xrLAorCVsxXSA9ICZjbGtfZG91dF9tcGxsLAorCVsyXSA9ICZjbGtfZmluX2VwbGwsCisJWzNdID0gJmNsa19paXNfY2QxLAorCVs0XSA9ICZjbGtfcGNtX2NkLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfc291cmNlcyBjbGtzZXRfYXVkaW8xID0geworCS5zb3VyY2VzCT0gY2xrc2V0X2F1ZGlvMV9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfYXVkaW8xX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hdWRpbzEgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImF1ZGlvLWJ1cyIsCisJCS5pZAkJPSAxLAorCQkuY3RybGJpdCAgICAgICAgPSBTM0NfQ0xLQ09OX1NDTEtfQVVESU8xLAorCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAorCQkuc2V0X3BhcmVudAk9IHMzYzY0eHhfc2V0cGFyZW50X2Nsa3NyYywKKwkJLmdldF9yYXRlCT0gczNjNjR4eF9nZXRyYXRlX2Nsa3NyYywKKwkJLnNldF9yYXRlCT0gczNjNjR4eF9zZXRyYXRlX2Nsa3NyYywKKwkJLnJvdW5kX3JhdGUJPSBzM2M2NHh4X3JvdW5kcmF0ZV9jbGtzcmMsCisJfSwKKwkuc2hpZnQJCT0gUzNDNjQwMF9DTEtTUkNfQVVESU8xX1NISUZULAorCS5tYXNrCQk9IFMzQzY0MDBfQ0xLU1JDX0FVRElPMV9NQVNLLAorCS5zb3VyY2VzCT0gJmNsa3NldF9hdWRpbzEsCisJLmRpdmlkZXJfc2hpZnQJPSBTM0M2NDAwX0NMS0RJVjJfQVVESU8xX1NISUZULAorCS5yZWdfZGl2aWRlcgk9IFMzQ19DTEtfRElWMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaXJkYSA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiaXJkYS1idXMiLAorCQkuaWQJCT0gMCwKKwkJLmN0cmxiaXQgICAgICAgID0gUzNDX0NMS0NPTl9TQ0xLX0lSREEsCisJCS5lbmFibGUJCT0gczNjNjR4eF9zY2xrX2N0cmwsCisJCS5zZXRfcGFyZW50CT0gczNjNjR4eF9zZXRwYXJlbnRfY2xrc3JjLAorCQkuZ2V0X3JhdGUJPSBzM2M2NHh4X2dldHJhdGVfY2xrc3JjLAorCQkuc2V0X3JhdGUJPSBzM2M2NHh4X3NldHJhdGVfY2xrc3JjLAorCQkucm91bmRfcmF0ZQk9IHMzYzY0eHhfcm91bmRyYXRlX2Nsa3NyYywKKwl9LAorCS5zaGlmdAkJPSBTM0M2NDAwX0NMS1NSQ19JUkRBX1NISUZULAorCS5tYXNrCQk9IFMzQzY0MDBfQ0xLU1JDX0lSREFfTUFTSywKKwkuc291cmNlcwk9ICZjbGtzZXRfaXJkYSwKKwkuZGl2aWRlcl9zaGlmdAk9IFMzQzY0MDBfQ0xLRElWMl9JUkRBX1NISUZULAorCS5yZWdfZGl2aWRlcgk9IFMzQ19DTEtfRElWMiwKK307CisKKy8qIENsb2NrIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICppbml0X3BhcmVudHNbXSA9IHsKKwkmY2xrX21vdXRfYXBsbCwKKwkmY2xrX21vdXRfZXBsbCwKKwkmY2xrX21vdXRfbXBsbCwKKwkmY2xrX21tYzAsCisJJmNsa19tbWMxLAorCSZjbGtfbW1jMiwKKwkmY2xrX3VzYmhvc3QsCisJJmNsa191YXJ0X3VjbGsxLAorCSZjbGtfc3BpMCwKKwkmY2xrX3NwaTEsCisJJmNsa19hdWRpbzAsCisJJmNsa19hdWRpbzEsCisJJmNsa19pcmRhLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjNjQwMF9zZXRfY2xrc3JjKHN0cnVjdCBjbGtzcmNfY2xrICpjbGspCit7CisJc3RydWN0IGNsa19zb3VyY2VzICpzcmNzID0gY2xrLT5zb3VyY2VzOworCXUzMiBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0NfQ0xLX1NSQyk7CisKKwljbGtzcmMgJj0gY2xrLT5tYXNrOworCWNsa3NyYyA+Pj0gY2xrLT5zaGlmdDsKKworCWlmIChjbGtzcmMgPiBzcmNzLT5ucl9zb3VyY2VzIHx8ICFzcmNzLT5zb3VyY2VzW2Nsa3NyY10pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIHNvdXJjZSAlZFxuIiwKKwkJICAgICAgIGNsay0+Y2xrLm5hbWUsIGNsa3NyYyk7CisJCXJldHVybjsKKwl9CisKKwljbGstPmNsay5wYXJlbnQgPSBzcmNzLT5zb3VyY2VzW2Nsa3NyY107CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogc291cmNlIGlzICVzICglZCksIHJhdGUgaXMgJWxkXG4iLAorCSAgICAgICBjbGstPmNsay5uYW1lLCBjbGstPmNsay5wYXJlbnQtPm5hbWUsIGNsa3NyYywKKwkgICAgICAgY2xrX2dldF9yYXRlKCZjbGstPmNsaykpOworfQorCisjZGVmaW5lIEdFVF9ESVYoY2xrLCBmaWVsZCkgKCgoKGNsaykgJiBmaWVsZCMjX01BU0spID4+IGZpZWxkIyNfU0hJRlQpICsgMSkKKwordm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBzM2M2NDAwX3NldHVwX2Nsb2Nrcyh2b2lkKQoreworCXN0cnVjdCBjbGsgKnh0YWxfY2xrOworCXVuc2lnbmVkIGxvbmcgeHRhbDsKKwl1bnNpZ25lZCBsb25nIGZjbGs7CisJdW5zaWduZWQgbG9uZyBoY2xrOworCXVuc2lnbmVkIGxvbmcgaGNsazI7CisJdW5zaWduZWQgbG9uZyBwY2xrOworCXVuc2lnbmVkIGxvbmcgZXBsbDsKKwl1bnNpZ25lZCBsb25nIGFwbGw7CisJdW5zaWduZWQgbG9uZyBtcGxsOworCXVuc2lnbmVkIGludCBwdHI7CisJdTMyIGNsa2RpdjA7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlZ2lzdGVyaW5nIGNsb2Nrc1xuIiwgX19mdW5jX18pOworCisJY2xrZGl2MCA9IF9fcmF3X3JlYWRsKFMzQ19DTEtfRElWMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjbGtkaXYwID0gJTA4eFxuIiwgX19mdW5jX18sIGNsa2RpdjApOworCisJeHRhbF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7CisJQlVHX09OKElTX0VSUih4dGFsX2NsaykpOworCisJeHRhbCA9IGNsa19nZXRfcmF0ZSh4dGFsX2Nsayk7CisJY2xrX3B1dCh4dGFsX2Nsayk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHh0YWwgaXMgJWxkXG4iLCBfX2Z1bmNfXywgeHRhbCk7CisKKwllcGxsID0gczNjNjQwMF9nZXRfZXBsbCh4dGFsKTsKKwltcGxsID0gczNjNjQwMF9nZXRfcGxsKHh0YWwsIF9fcmF3X3JlYWRsKFMzQ19NUExMX0NPTikpOworCWFwbGwgPSBzM2M2NDAwX2dldF9wbGwoeHRhbCwgX19yYXdfcmVhZGwoUzNDX0FQTExfQ09OKSk7CisKKwlmY2xrID0gbXBsbDsKKworCXByaW50ayhLRVJOX0lORk8gIlMzQzY0WFg6IFBMTCBzZXR0aW5ncywgQT0lbGQsIE09JWxkLCBFPSVsZFxuIiwKKwkgICAgICAgYXBsbCwgbXBsbCwgZXBsbCk7CisKKwloY2xrMiA9IG1wbGwgLyBHRVRfRElWKGNsa2RpdjAsIFMzQzY0MDBfQ0xLRElWMF9IQ0xLMik7CisJaGNsayA9IGhjbGsyIC8gR0VUX0RJVihjbGtkaXYwLCBTM0M2NDAwX0NMS0RJVjBfSENMSyk7CisJcGNsayA9IGhjbGsyIC8gR0VUX0RJVihjbGtkaXYwLCBTM0M2NDAwX0NMS0RJVjBfUENMSyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTM0M2NFhYOiBIQ0xLMj0lbGQsIEhDTEs9JWxkLCBQQ0xLPSVsZFxuIiwKKwkgICAgICAgaGNsazIsIGhjbGssIHBjbGspOworCisJY2xrX2ZvdXRfbXBsbC5yYXRlID0gbXBsbDsKKwljbGtfZm91dF9lcGxsLnJhdGUgPSBlcGxsOworCWNsa19mb3V0X2FwbGwucmF0ZSA9IGFwbGw7CisKKwljbGtfaC5yYXRlID0gaGNsazsKKwljbGtfcC5yYXRlID0gcGNsazsKKwljbGtfZi5yYXRlID0gZmNsazsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShpbml0X3BhcmVudHMpOyBwdHIrKykKKwkJczNjNjQwMF9zZXRfY2xrc3JjKGluaXRfcGFyZW50c1twdHJdKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbXSBfX2luaXRkYXRhID0geworCSZjbGtfZXh0X3h0YWxfbXV4LAorCSZjbGtfaWlzX2NkMCwKKwkmY2xrX2lpc19jZDEsCisJJmNsa19wY21fY2QsCisJJmNsa19tb3V0X2VwbGwuY2xrLAorCSZjbGtfZm91dF9lcGxsLAorCSZjbGtfbW91dF9tcGxsLmNsaywKKwkmY2xrX2RvdXRfbXBsbCwKKwkmY2xrX21tYzAuY2xrLAorCSZjbGtfbW1jMS5jbGssCisJJmNsa19tbWMyLmNsaywKKwkmY2xrX3VzYmhvc3QuY2xrLAorCSZjbGtfdWFydF91Y2xrMS5jbGssCisJJmNsa19zcGkwLmNsaywKKwkmY2xrX3NwaTEuY2xrLAorCSZjbGtfYXVkaW8wLmNsaywKKwkmY2xrX2F1ZGlvMS5jbGssCisJJmNsa19pcmRhLmNsaywKK307CisKK3ZvaWQgX19pbml0IHMzYzY0MDBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrcDsKKwlpbnQgcmV0OworCWludCBwdHI7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoY2xrcyk7IHB0cisrKSB7CisJCWNsa3AgPSBjbGtzW3B0cl07CisJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soY2xrcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjbG9jayAlcyAoJWQpXG4iLAorCQkJICAgICAgIGNsa3AtPm5hbWUsIHJldCk7CisJCX0KKwl9CisKKwljbGtfbXBsbC5wYXJlbnQgPSAmY2xrX21vdXRfbXBsbC5jbGs7CisJY2xrX2VwbGwucGFyZW50ID0gJmNsa19tb3V0X2VwbGwuY2xrOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3MzYzY0MDAtaW5pdC5jIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3MzYzY0MDAtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjhmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvczNjNjQwMC1pbml0LmMKQEAgLTAsMCArMSwyOSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3MzYzY0MDAtaW5pdC5jCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogUzNDNjQwMCAtIENQVSBpbml0aWFsaXNhdGlvbiAoY29tbW9uIHdpdGggb3RoZXIgUzNDNjRYWCBjaGlwcykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CisKKy8qIHVhcnQgcmVnaXN0cmF0aW9uIHByb2Nlc3MgKi8KKwordm9pZCBfX2luaXQgczNjNjQwMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubykKK3sKKwlzM2MyNHh4X2luaXRfdWFydGRldnMoInMzYzY0MDAtdWFydCIsIHMzYzY0eHhfdWFydF9yZXNvdXJjZXMsIGNmZywgbm8pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvc2V0dXAtZmItMjRicHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI4ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMKQEAgLTAsMCArMSwzNyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEJhc2UgUzNDNjRYWCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgMjRicHAgTENEIGZyYW1lYnVmZmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZmIuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorCitleHRlcm4gdm9pZCBzM2M2NHh4X2ZiX2dwaW9fc2V0dXBfMjRicHAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbzsKKworCWZvciAoZ3BpbyA9IFMzQzY0WFhfR1BJKDApOyBncGlvIDw9IFMzQzY0WFhfR1BJKDE1KTsgZ3BpbysrKSB7CisJCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMikpOworCQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfTk9ORSk7CisJfQorCisJZm9yIChncGlvID0gUzNDNjRYWF9HUEooMCk7IGdwaW8gPD0gUzNDNjRYWF9HUEooMTEpOyBncGlvKyspIHsKKwkJczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigyKSk7CisJCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvc2V0dXAtaTJjMC5jIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3NldHVwLWkyYzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ0ODA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L3NldHVwLWkyYzAuYwpAQCAtMCwwICsxLDMxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzY0eHgvc2V0dXAtaTJjMC5jCisgKgorICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBCYXNlIFMzQzY0WFggSTJDIGJ1cyAwIGdwaW8gY29uZmlndXJhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHBsYXRmb3JtX2RldmljZTsgLyogZG9uJ3QgbmVlZCB0aGUgY29udGVudHMgKi8KKworI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWJhbmstYi5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKwordm9pZCBzM2NfaTJjMF9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJczNjX2dwaW9fY2ZncGluKFMzQzY0WFhfR1BCKDUpLCBTM0M2NFhYX0dQQjVfSTJDX1NDTDApOworCXMzY19ncGlvX2NmZ3BpbihTM0M2NFhYX0dQQig2KSwgUzNDNjRYWF9HUEI2X0kyQ19TREEwKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKFMzQzY0WFhfR1BCKDUpLCBTM0NfR1BJT19QVUxMX1VQKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKFMzQzY0WFhfR1BCKDYpLCBTM0NfR1BJT19QVUxMX1VQKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zZXR1cC1pMmMxLmMgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvc2V0dXAtaTJjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTIyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvc2V0dXAtaTJjMS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjNjR4eC9zZXR1cC1pMmMxLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEJhc2UgUzNDNjRYWCBJMkMgYnVzIDEgZ3BpbyBjb25maWd1cmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOyAvKiBkb24ndCBuZWVkIHRoZSBjb250ZW50cyAqLworCisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tYmFuay1iLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorCit2b2lkIHMzY19pMmMxX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzM2NfZ3Bpb19jZmdwaW4oUzNDNjRYWF9HUEIoMiksIFMzQzY0WFhfR1BCMl9JMkNfU0NMMSk7CisJczNjX2dwaW9fY2ZncGluKFMzQzY0WFhfR1BCKDMpLCBTM0M2NFhYX0dQQjNfSTJDX1NEQTEpOworCXMzY19ncGlvX3NldHB1bGwoUzNDNjRYWF9HUEIoMiksIFMzQ19HUElPX1BVTExfVVApOworCXMzY19ncGlvX3NldHB1bGwoUzNDNjRYWF9HUEIoMyksIFMzQ19HUElPX1BVTExfVVApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggNDNhYTIwMi4uZmQyM2MwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCkBAIC0xMiw3ICsxMiw3IEBACiAjCiAjICAgaHR0cDovL3d3dy5hcm0ubGludXgub3JnLnVrL2RldmVsb3Blci9tYWNoaW5lcy8/YWN0aW9uPW5ldwogIwotIyBMYXN0IHVwZGF0ZTogVGh1IFNlcCAyNSAxMDoxMDo1MCAyMDA4CisjIExhc3QgdXBkYXRlOiBTdW4gTm92IDMwIDE2OjM5OjM2IDIwMDgKICMKICMgbWFjaGluZV9pc194eHgJQ09ORklHX3h4eHgJCU1BQ0hfVFlQRV94eHgJCW51bWJlcgogIwpAQCAtMTM4MCw3ICsxMzgwLDcgQEAKIG9saXA4CQkJTUFDSF9PTElQOAkJT0xJUDgJCQkxMzc4CiBnaGkyNzBoZwkJTUFDSF9HSEkyNzBIRwkJR0hJMjcwSEcJCTEzNzkKIGRhdmluY2lfZG02NDY3X2V2bQlNQUNIX0RBVklOQ0lfRE02NDY3X0VWTQlEQVZJTkNJX0RNNjQ2N19FVk0JMTM4MAotZGF2aW5jaV9kbTM1NV9ldm0JTUFDSF9EQVZJTkNJX0RNMzUwX0VWTQlEQVZJTkNJX0RNMzUwX0VWTQkxMzgxCitkYXZpbmNpX2RtMzU1X2V2bQlNQUNIX0RBVklOQ0lfRE0zNTVfRVZNCURBVklOQ0lfRE0zNTVfRVZNCTEzODEKIGJsYWNrcml2ZXIJCU1BQ0hfQkxBQ0tSSVZFUgkJQkxBQ0tSSVZFUgkJMTM4Mwogc2FuZGdhdGVfd3AJCU1BQ0hfU0FOREdBVEVXUAkJU0FOREdBVEVXUAkJMTM4NAogY2RvdGJ3c2cJCU1BQ0hfQ0RPVEJXU0cJCUNET1RCV1NHCQkxMzg1CkBAIC0xNzcxLDcgKzE3NzEsNyBAQAogYXQ1NzJkOTQwZGViCQlNQUNIX0FUNTcyRDk0MERFQglBVDU3MkQ5NDBERUIJCTE3ODAKIGRhdmluY2lfZGE4eHhfZXZtCU1BQ0hfREFWSU5DSV9EQThYWF9FVk0JREFWSU5DSV9EQThYWF9FVk0JMTc4MQogZXA5MzAyCQkJTUFDSF9FUDkzMDIJCUVQOTMwMgkJCTE3ODIKLWF0NTcyZDk0MGhmZWIJCU1BQ0hfQVQ1NzJEOTQwSEZFQglBVDU3MkQ5NDBIRkVCCQkxNzgzCithdDU3MmQ5NDBoZmVrCQlNQUNIX0FUNTcyRDk0MEhGRUIJQVQ1NzJEOTQwSEZFQgkJMTc4MwogY3lib29rMwkJCU1BQ0hfQ1lCT09LMwkJQ1lCT09LMwkJCTE3ODQKIHdkZzAwMgkJCU1BQ0hfV0RHMDAyCQlXREcwMDIJCQkxNzg1CiBzZzU2MGFkc2wJCU1BQ0hfU0c1NjBBRFNMCQlTRzU2MEFEU0wJCTE3ODYKQEAgLTE4OTksMyArMTg5OSw5OCBAQAogYXN1c3A1MzUJCU1BQ0hfQVNVU1A1MzUJCUFTVVNQNTM1CQkxOTA5CiBodGNyYXBoYWVsCQlNQUNIX0hUQ1JBUEhBRUwJCUhUQ1JBUEhBRUwJCTE5MTAKIHN5Z2RnMQkJCU1BQ0hfU1lHREcxCQlTWUdERzEJCQkxOTExCitzeWdkZzIJCQlNQUNIX1NZR0RHMgkJU1lHREcyCQkJMTkxMgorc2VvdWwJCQlNQUNIX1NFT1VMCQlTRU9VTAkJCTE5MTMKK3NhbGVybm8JCQlNQUNIX1NBTEVSTk8JCVNBTEVSTk8JCQkxOTE0Cit1Y25fczNjNjR4eAkJTUFDSF9VQ05fUzNDNjRYWAlVQ05fUzNDNjRYWAkJMTkxNQorbXNtNzIwMWEJCU1BQ0hfTVNNNzIwMUEJCU1TTTcyMDFBCQkxOTE2CitscHIxCQkJTUFDSF9MUFIxCQlMUFIxCQkJMTkxNworYXJtYWRpbGxvNTAwZngJCU1BQ0hfQVJNQURJTExPNTAwRlgJQVJNQURJTExPNTAwRlgJCTE5MTgKK2czZXZtCQkJTUFDSF9HM0VWTQkJRzNFVk0JCQkxOTE5Cit6M19kbTM1NQkJTUFDSF9aM19ETTM1NQkJWjNfRE0zNTUJCTE5MjAKK3c5MHA5MTBldmIJCU1BQ0hfVzkwUDkxMEVWQgkJVzkwUDkxMEVWQgkJMTkyMQordzkwcDkyMGV2YgkJTUFDSF9XOTBQOTIwRVZCCQlXOTBQOTIwRVZCCQkxOTIyCit3OTBwOTUwZXZiCQlNQUNIX1c5MFA5NTBFVkIJCVc5MFA5NTBFVkIJCTE5MjMKK3c5MG45NjBldmIJCU1BQ0hfVzkwTjk2MEVWQgkJVzkwTjk2MEVWQgkJMTkyNAorY2FtaGQJCQlNQUNIX0NBTUhECQlDQU1IRAkJCTE5MjUKK212YzEwMAkJCU1BQ0hfTVZDMTAwCQlNVkMxMDAJCQkxOTI2CitlbGVjdHJ1bV8yMDAJCU1BQ0hfRUxFQ1RSVU1fMjAwCUVMRUNUUlVNXzIwMAkJMTkyNworaHRjamFkZQkJCU1BQ0hfSFRDSkFERQkJSFRDSkFERQkJCTE5MjgKK21lbXBoaXMJCQlNQUNIX01FTVBISVMJCU1FTVBISVMJCQkxOTI5CitpbXgyN3NiYwkJTUFDSF9JTVgyN1NCQwkJSU1YMjdTQkMJCTE5MzAKK2xleHRhcgkJCU1BQ0hfTEVYVEFSCQlMRVhUQVIJCQkxOTMxCittdjg4ZjYyODFndHdfZ2UJCU1BQ0hfTVY4OEY2MjgxR1RXX0dFCU1WODhGNjI4MUdUV19HRQkJMTkzMgorbmNwCQkJTUFDSF9OQ1AJCU5DUAkJCTE5MzMKK3ozMmFuX3NlcmllcwkJTUFDSF9aMzJBTgkJWjMyQU4JCQkxOTM0Cit0bXFfY2FwZAkJTUFDSF9UTVFfQ0FQRAkJVE1RX0NBUEQJCTE5MzUKK29tYXAzX3dsCQlNQUNIX09NQVAzX1dMCQlPTUFQM19XTAkJMTkzNgorY2h1bWJ5CQkJTUFDSF9DSFVNQlkJCUNIVU1CWQkJCTE5MzcKK2F0c2FybTkJCQlNQUNIX0FUU0FSTTkJCUFUU0FSTTkJCQkxOTM4CitkYXZpbmNpX2RtMzY1X2V2bQlNQUNIX0RBVklOQ0lfRE0zNjVfRVZNCURBVklOQ0lfRE0zNjVfRVZNCTE5MzkKK2JhaGFtYXMJCQlNQUNIX0JBSEFNQVMJCUJBSEFNQVMJCQkxOTQwCitkYXMJCQlNQUNIX0RBUwkJREFTCQkJMTk0MQorbWluaWRhcwkJCU1BQ0hfTUlOSURBUwkJTUlOSURBUwkJCTE5NDIKK3ZrMTAwMAkJCU1BQ0hfVksxMDAwCQlWSzEwMDAJCQkxOTQzCitjZW50cm8JCQlNQUNIX0NFTlRSTwkJQ0VOVFJPCQkJMTk0NAorY3RlcmFfMmJheQkJTUFDSF9DVEVSQV8yQkFZCQlDVEVSQV8yQkFZCQkxOTQ1CitlZGdlY29ubmVjdAkJTUFDSF9FREdFQ09OTkVDVAlFREdFQ09OTkVDVAkJMTk0NgorbmQyNzAwMAkJCU1BQ0hfTkQyNzAwMAkJTkQyNzAwMAkJCTE5NDcKK2NvYnJhCQkJTUFDSF9HRU1BTFRPX0NPQlJBCUdFTUFMVE9fQ09CUkEJCTE5NDgKK2luZ2VsYWJzX2NvbWV0CQlNQUNIX0lOR0VMQUJTX0NPTUVUCUlOR0VMQUJTX0NPTUVUCQkxOTQ5Citwb2xsdXhfd2l6CQlNQUNIX1BPTExVWF9XSVoJCVBPTExVWF9XSVoJCTE5NTAKK2JsYWNrc3RvbmUJCU1BQ0hfQkxBQ0tTVE9ORQkJQkxBQ0tTVE9ORQkJMTk1MQordG9wYXoJCQlNQUNIX1RPUEFaCQlUT1BBWgkJCTE5NTIKK2FpeGxlCQkJTUFDSF9BSVhMRQkJQUlYTEUJCQkxOTUzCittdzk5OAkJCU1BQ0hfTVc5OTgJCU1XOTk4CQkJMTk1NAorbm9raWFfcng1MQkJTUFDSF9OT0tJQV9SWDUxCQlOT0tJQV9SWDUxCQkxOTU1Cit2c2M1NjA1ZXYJCU1BQ0hfVlNDNTYwNUVWCQlWU0M1NjA1RVYJCTE5NTYKK250OTg3MDBkawkJTUFDSF9OVDk4NzAwREsJCU5UOTg3MDBESwkJMTk1NworaWNvbnRhY3QJCU1BQ0hfSUNPTlRBQ1QJCUlDT05UQUNUCQkxOTU4Citzd2FyY29fZnJjcHUJCU1BQ0hfU1dBUkNPX0ZSQ1BVCVNXQVJDT19GUkNQVQkJMTk1OQorc3dhcmNvX3NjcHUJCU1BQ0hfU1dBUkNPX1NDUFUJU1dBUkNPX1NDUFUJCTE5NjAKK2Jib3hfcDE2CQlNQUNIX0JCT1hfUDE2CQlCQk9YX1AxNgkJMTk2MQorYnN0ZAkJCU1BQ0hfQlNURAkJQlNURAkJCTE5NjIKK3NiYzI0NDBpaQkJTUFDSF9TQkMyNDQwSUkJCVNCQzI0NDBJSQkJMTk2MworcGNtMDM0CQkJTUFDSF9QQ00wMzQJCVBDTTAzNAkJCTE5NjQKK25lc28JCQlNQUNIX05FU08JCU5FU08JCQkxOTY1Cit3bG54XzlnMjAJCU1BQ0hfV0xOWF85RzIwCQlXTE5YXzlHMjAJCTE5NjYKK29tYXBfem9vbTIJCU1BQ0hfT01BUF9aT09NMgkJT01BUF9aT09NMgkJMTk2NwordG90ZW1ub3ZhCQlNQUNIX1RPVEVNTk9WQQkJVE9URU1OT1ZBCQkxOTY4CitjNTAwMAkJCU1BQ0hfQzUwMDAJCUM1MDAwCQkJMTk2OQordW5pcG9fYXQ5MXNhbTkyNjMJTUFDSF9VTklQT19BVDkxU0FNOTI2MwlVTklQT19BVDkxU0FNOTI2MwkxOTcwCitldGhlcm51dDUJCU1BQ0hfRVRIRVJOVVQ1CQlFVEhFUk5VVDUJCTE5NzEKK2FybTExCQkJTUFDSF9BUk0xMQkJQVJNMTEJCQkxOTcyCitjcHVhdDkyNjAJCU1BQ0hfQ1BVQVQ5MjYwCQlDUFVBVDkyNjAJCTE5NzMKK2NwdXB4YTI1NQkJTUFDSF9DUFVQWEEyNTUJCUNQVVBYQTI1NQkJMTk3NAorY3B1aW14MjcJCU1BQ0hfQ1BVSU1YMjcJCUNQVUlNWDI3CQkxOTc1CitjaGVmbHV4CQkJTUFDSF9DSEVGTFVYCQlDSEVGTFVYCQkJMTk3NgorZWJfY3B1eDlrMgkJTUFDSF9FQl9DUFVYOUsyCQlFQl9DUFVYOUsyCQkxOTc3CitvcGNvdGVjCQkJTUFDSF9PUENPVEVDCQlPUENPVEVDCQkJMTk3OAoreXQJCQlNQUNIX1lUCQkJWVQJCQkxOTc5Cittb3RvcQkJCU1BQ0hfTU9UT1EJCU1PVE9RCQkJMTk4MAorYnNiMQkJCU1BQ0hfQlNCMQkJQlNCMQkJCTE5ODEKK2FjczVrCQkJTUFDSF9BQ1M1SwkJQUNTNUsJCQkxOTgyCittaWxhbgkJCU1BQ0hfTUlMQU4JCU1JTEFOCQkJMTk4MworcXVhcnR6djIJCU1BQ0hfUVVBUlRaVjIJCVFVQVJUWlYyCQkxOTg0Cityc3ZwCQkJTUFDSF9SU1ZQCQlSU1ZQCQkJMTk4NQorcm1wMjAwCQkJTUFDSF9STVAyMDAJCVJNUDIwMAkJCTE5ODYKK3NuYXBwZXJfOTI2MAkJTUFDSF9TTkFQUEVSXzkyNjAJU05BUFBFUl85MjYwCQkxOTg3Citkc20zMjAJCQlNQUNIX0RTTTMyMAkJRFNNMzIwCQkJMTk4OAorYWRzZ2NtCQkJTUFDSF9BRFNHQ00JCUFEU0dDTQkJCTE5ODkKK2FzZTJfNDAwCQlNQUNIX0FTRTJfNDAwCQlBU0UyXzQwMAkJMTk5MAorcGl6emEJCQlNQUNIX1BJWlpBCQlQSVpaQQkJCTE5OTEKK3Nwb3RfbmdwbAkJTUFDSF9TUE9UX05HUEwJCVNQT1RfTkdQTAkJMTk5MgorYXJtYXRhCQkJTUFDSF9BUk1BVEEJCUFSTUFUQQkJCTE5OTMKK2V4ZWRhCQkJTUFDSF9FWEVEQQkJRVhFREEJCQkxOTk0CitteDMxc2YwMDUJCU1BQ0hfTVgzMVNGMDA1CQlNWDMxU0YwMDUJCTE5OTUKK2Y1ZDgyMzFfNF92MgkJTUFDSF9GNUQ4MjMxXzRfVjIJRjVEODIzMV80X1YyCQkxOTk2CitxMjQ0MAkJCU1BQ0hfUTI0NDAJCVEyNDQwCQkJMTk5NworcXEyNDQwCQkJTUFDSF9RUTI0NDAJCVFRMjQ0MAkJCTE5OTgKK21pbmkyNDQwCQlNQUNIX01JTkkyNDQwCQlNSU5JMjQ0MAkJMTk5OQorY29saWJyaTMwMAkJTUFDSF9DT0xJQlJJMzAwCQlDT0xJQlJJMzAwCQkyMDAwCitqYWRlcwkJCU1BQ0hfSkFERVMJCUpBREVTCQkJMjAwMQorc3BhcmsJCQlNQUNIX1NQQVJLCQlTUEFSSwkJCTIwMDIKK2JlbnppbmEJCQlNQUNIX0JFTlpJTkEJCUJFTlpJTkEJCQkyMDAzCitibGF6ZQkJCU1BQ0hfQkxBWkUJCUJMQVpFCQkJMjAwNAorbGlua3N0YXRpb25fbHNfaGdsCU1BQ0hfTElOS1NUQVRJT05fTFNfSEdMCUxJTktTVEFUSU9OX0xTX0hHTAkyMDA1CitodGN2ZW51cwkJTUFDSF9IVENWRU5VUwkJSFRDVkVOVVMJCTIwMDYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnAuaCBiL2FyY2gvYXJtL3ZmcC92ZnAuaAppbmRleCBjODU4NjBiLi44ZGU4NmU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwLmgKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcC5oCkBAIC0zNzcsNiArMzc3LDYgQEAKIAl1MzIgZmxhZ3M7CiB9OwogCi0jaWZkZWYgQ09ORklHX1NNUAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfUE0pCiBleHRlcm4gdm9pZCB2ZnBfc2F2ZV9zdGF0ZSh2b2lkICpsb2NhdGlvbiwgdTMyIGZwZXhjKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcGh3LlMgYi9hcmNoL2FybS92ZnAvdmZwaHcuUwppbmRleCBhNjJkY2Y3Li5jOTJhMDhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwaHcuUworKysgYi9hcmNoL2FybS92ZnAvdmZwaHcuUwpAQCAtMTAxLDkgKzEwMSwxMiBAQAogCVZGUEZTVE1JQSByNCwgcjUJCUAgc2F2ZSB0aGUgd29ya2luZyByZWdpc3RlcnMKIAlWRlBGTVJYCXI1LCBGUFNDUgkJQCBjdXJyZW50IHN0YXR1cwogCXRzdAlyMSwgI0ZQRVhDX0VYCQlAIGlzIHRoZXJlIGFkZGl0aW9uYWwgc3RhdGUgdG8gc2F2ZT8KLQlWRlBGTVJYCXI2LCBGUElOU1QsIE5FCQlAIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCi0JdHN0bmUJcjEsICNGUEVYQ19GUDJWCQlAIGlzIHRoZXJlIGFuIEZQSU5TVDIgdG8gcmVhZD8KLQlWRlBGTVJYCXI4LCBGUElOU1QyLCBORQkJQCBGUElOU1QyIGlmIG5lZWRlZCAoYW5kIHByZXNlbnQpCisJYmVxCTFmCisJVkZQRk1SWAlyNiwgRlBJTlNUCQlAIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCisJdHN0CXIxLCAjRlBFWENfRlAyVgkJQCBpcyB0aGVyZSBhbiBGUElOU1QyIHRvIHJlYWQ/CisJYmVxCTFmCisJVkZQRk1SWAlyOCwgRlBJTlNUMgkJQCBGUElOU1QyIGlmIG5lZWRlZCAoYW5kIHByZXNlbnQpCisxOgogCXN0bWlhCXI0LCB7cjEsIHI1LCByNiwgcjh9CUAgc2F2ZSBGUEVYQywgRlBTQ1IsIEZQSU5TVCwgRlBJTlNUMgogCQkJCQlAIGFuZCBwb2ludCByNCBhdCB0aGUgd29yZCBhdCB0aGUKIAkJCQkJQCBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgZHVtcApAQCAtMTE3LDkgKzEyMCwxMiBAQAogCQkJCQlAIEZQRVhDIGlzIGluIGEgc2FmZSBzdGF0ZQogCWxkbWlhCXIxMCwge3IxLCByNSwgcjYsIHI4fQlAIGxvYWQgRlBFWEMsIEZQU0NSLCBGUElOU1QsIEZQSU5TVDIKIAl0c3QJcjEsICNGUEVYQ19FWAkJQCBpcyB0aGVyZSBhZGRpdGlvbmFsIHN0YXRlIHRvIHJlc3RvcmU/Ci0JVkZQRk1YUglGUElOU1QsIHI2LCBORQkJQCByZXN0b3JlIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCi0JdHN0bmUJcjEsICNGUEVYQ19GUDJWCQlAIGlzIHRoZXJlIGFuIEZQSU5TVDIgdG8gd3JpdGU/Ci0JVkZQRk1YUglGUElOU1QyLCByOCwgTkUJCUAgRlBJTlNUMiBpZiBuZWVkZWQgKGFuZCBwcmVzZW50KQorCWJlcQkxZgorCVZGUEZNWFIJRlBJTlNULCByNgkJQCByZXN0b3JlIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCisJdHN0CXIxLCAjRlBFWENfRlAyVgkJQCBpcyB0aGVyZSBhbiBGUElOU1QyIHRvIHdyaXRlPworCWJlcQkxZgorCVZGUEZNWFIJRlBJTlNUMiwgcjgJCUAgRlBJTlNUMiBpZiBuZWVkZWQgKGFuZCBwcmVzZW50KQorMToKIAlWRlBGTVhSCUZQU0NSLCByNQkJQCByZXN0b3JlIHN0YXR1cwogCiBjaGVja19mb3JfZXhjZXB0aW9uOgpAQCAtMTY2LDcgKzE3Miw3IEBACiAJCQkJCUAgcmV0cnkgdGhlIGZhdWx0ZWQgaW5zdHJ1Y3Rpb24KIEVORFBST0ModmZwX3N1cHBvcnRfZW50cnkpCiAKLSNpZmRlZiBDT05GSUdfU01QCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19QTSkKIEVOVFJZKHZmcF9zYXZlX3N0YXRlKQogCUAgU2F2ZSB0aGUgY3VycmVudCBWRlAgc3RhdGUKIAlAIHIwIC0gc2F2ZSBsb2NhdGlvbgpAQCAtMTc1LDkgKzE4MSwxMiBAQAogCVZGUEZTVE1JQSByMCwgcjIJCUAgc2F2ZSB0aGUgd29ya2luZyByZWdpc3RlcnMKIAlWRlBGTVJYCXIyLCBGUFNDUgkJQCBjdXJyZW50IHN0YXR1cwogCXRzdAlyMSwgI0ZQRVhDX0VYCQlAIGlzIHRoZXJlIGFkZGl0aW9uYWwgc3RhdGUgdG8gc2F2ZT8KLQlWRlBGTVJYCXIzLCBGUElOU1QsIE5FCQlAIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCi0JdHN0bmUJcjEsICNGUEVYQ19GUDJWCQlAIGlzIHRoZXJlIGFuIEZQSU5TVDIgdG8gcmVhZD8KLQlWRlBGTVJYCXIxMiwgRlBJTlNUMiwgTkUJQCBGUElOU1QyIGlmIG5lZWRlZCAoYW5kIHByZXNlbnQpCisJYmVxCTFmCisJVkZQRk1SWAlyMywgRlBJTlNUCQlAIEZQSU5TVCAob25seSBpZiBGUEVYQy5FWCBpcyBzZXQpCisJdHN0CXIxLCAjRlBFWENfRlAyVgkJQCBpcyB0aGVyZSBhbiBGUElOU1QyIHRvIHJlYWQ/CisJYmVxCTFmCisJVkZQRk1SWAlyMTIsIEZQSU5TVDIJCUAgRlBJTlNUMiBpZiBuZWVkZWQgKGFuZCBwcmVzZW50KQorMToKIAlzdG1pYQlyMCwge3IxLCByMiwgcjMsIHIxMn0JQCBzYXZlIEZQRVhDLCBGUFNDUiwgRlBJTlNULCBGUElOU1QyCiAJbW92CXBjLCBscgogRU5EUFJPQyh2ZnBfc2F2ZV9zdGF0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCBjMGQyYzliLi45ZjQ3NmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC0zMjIsNiArMzIyLDYxIEBACiAJc2V0X2NvcHJvX2FjY2VzcyhhY2Nlc3MgfCBDUEFDQ19GVUxMKDEwKSB8IENQQUNDX0ZVTEwoMTEpKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCitzdGF0aWMgaW50IHZmcF9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXUzMiBmcGV4YyA9IGZtcngoRlBFWEMpOworCisJLyogaWYgdmZwIGlzIG9uLCB0aGVuIHNhdmUgc3RhdGUgZm9yIHJlc3VtcHRpb24gKi8KKwlpZiAoZnBleGMgJiBGUEVYQ19FTikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNhdmluZyB2ZnAgc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJdmZwX3NhdmVfc3RhdGUoJnRpLT52ZnBzdGF0ZSwgZnBleGMpOworCisJCS8qIGRpc2FibGUsIGp1c3QgaW4gY2FzZSAqLworCQlmbXhyKEZQRVhDLCBmbXJ4KEZQRVhDKSAmIH5GUEVYQ19FTik7CisJfQorCisJLyogY2xlYXIgYW55IGluZm9ybWF0aW9uIHdlIGhhZCBhYm91dCBsYXN0IGNvbnRleHQgc3RhdGUgKi8KKwltZW1zZXQobGFzdF9WRlBfY29udGV4dCwgMCwgc2l6ZW9mKGxhc3RfVkZQX2NvbnRleHQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmcF9wbV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwkvKiBlbnN1cmUgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZmcCAqLworCXZmcF9lbmFibGUoTlVMTCk7CisKKwkvKiBhbmQgZGlzYWJsZSBpdCB0byBlbnN1cmUgdGhlIG5leHQgdXNhZ2UgcmVzdG9yZXMgdGhlIHN0YXRlICovCisJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHZmcF9wbV9zeXNjbGFzcyA9IHsKKwkubmFtZQkJPSAidmZwIiwKKwkuc3VzcGVuZAk9IHZmcF9wbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdmZwX3BtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSB2ZnBfcG1fc3lzZGV2ID0geworCS5jbHMJPSAmdmZwX3BtX3N5c2NsYXNzLAorfTsKKworc3RhdGljIHZvaWQgdmZwX3BtX2luaXQodm9pZCkKK3sKKwlzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnZmcF9wbV9zeXNjbGFzcyk7CisJc3lzZGV2X3JlZ2lzdGVyKCZ2ZnBfcG1fc3lzZGV2KTsKK30KKworCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHZmcF9wbV9pbml0KHZvaWQpIHsgfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKIC8qCkBAIC0zNjUsMTIgKzQyMCwyMiBAQAogCQl2ZnBfdmVjdG9yID0gdmZwX3N1cHBvcnRfZW50cnk7CiAKIAkJdGhyZWFkX3JlZ2lzdGVyX25vdGlmaWVyKCZ2ZnBfbm90aWZpZXJfYmxvY2spOworCQl2ZnBfcG1faW5pdCgpOwogCiAJCS8qCiAJCSAqIFdlIGRldGVjdGVkIFZGUCwgYW5kIHRoZSBzdXBwb3J0IGNvZGUgaXMKIAkJICogaW4gcGxhY2U7IHJlcG9ydCBWRlAgc3VwcG9ydCB0byB1c2Vyc3BhY2UuCiAJCSAqLwogCQllbGZfaHdjYXAgfD0gSFdDQVBfVkZQOworI2lmZGVmIENPTkZJR19ORU9OCisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFkdmFuY2VkIFNJTUQKKwkJICogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMsIGludGVnZXIgYW5kIHNpbmdsZQorCQkgKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KKwkJICovCisJCWlmICgoZm1yeChNVkZSMSkgJiAweDAwMGZmZjAwKSA9PSAweDAwMDExMTAwKQorCQkJZWxmX2h3Y2FwIHw9IEhXQ0FQX05FT047CisjZW5kaWYKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCmluZGV4IGY0ZTU1YmUuLmFmYWQ5ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCkBAIC0yMDgsNiArMjA4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBFUlJfVFlQRV9LRVJORUxfUEFOSUM6CiAJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIyNyw2ICsyMjgsNyBAQAogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG9yIGhhdmUgc3RvcHBlZCBsb2dnaW5nICovCiAJaWYgKGZhdGFsIHx8ICFsb2dnaW5nX2VuYWJsZWQpIHsKIAkJbG9nZ2luZ19lbmFibGVkID0gMDsKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI0OSwxMSArMjUxLDEzIEBACiAJCWVsc2UKIAkJCXJ0YXNfbG9nX3N0YXJ0ICs9IDE7CiAKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGFzX2xvZ193YWl0KTsKIAkJYnJlYWs7CiAJY2FzZSBFUlJfVFlQRV9LRVJORUxfUEFOSUM6CiAJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1fdmlydGlvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX3ZpcnRpby5oCmluZGV4IGMxMzU2OGIuLjA1MDM5MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1fdmlydGlvLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV92aXJ0aW8uaApAQCAtNTAsNiArNTAsMTAgQEAKICNkZWZpbmUgS1ZNX1MzOTBfVklSVElPX1JFU0VUCQkxCiAjZGVmaW5lIEtWTV9TMzkwX1ZJUlRJT19TRVRfU1RBVFVTCTIKIAorLyogVGhlIGFsaWdubWVudCB0byB1c2UgYmV0d2VlbiBjb25zdW1lciBhbmQgcHJvZHVjZXIgcGFydHMgb2YgdnJpbmcuCisgKiBUaGlzIGlzIHBhZ2VzaXplIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICovCisjZGVmaW5lIEtWTV9TMzkwX1ZJUlRJT19SSU5HX0FMSUdOCTQwOTYKKwogI2lmZGVmIF9fS0VSTkVMX18KIC8qIGVhcmx5IHZpcnRpbyBjb25zb2xlIHNldHVwICovCiAjaWZkZWYgQ09ORklHX1MzOTBfR1VFU1QKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IGVmMzYzNWIuLjA3Njc4MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJLyogbGV0cyBjaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZXBsYWNlIHRoZSBtbSAqLwogCXRhc2tfbG9jayh0c2spOwogCWlmICghdHNrLT5tbSB8fCBhdG9taWNfcmVhZCgmdHNrLT5tbS0+bW1fdXNlcnMpID4gMSB8fAotCSAgICB0c2stPm1tICE9IHRzay0+YWN0aXZlX21tIHx8IHRzay0+bW0tPmlvY3R4X2xpc3QpIHsKKwkgICAgdHNrLT5tbSAhPSB0c2stPmFjdGl2ZV9tbSB8fCAhaGxpc3RfZW1wdHkoJnRzay0+bW0tPmlvY3R4X2xpc3QpKSB7CiAJCXRhc2tfdW5sb2NrKHRzayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI3OSw3ICsyNzksNyBAQAogCS8qIE5vdyBsZXRzIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyBoYXBwZW5lZCAqLwogCXRhc2tfbG9jayh0c2spOwogCWlmICghdHNrLT5tbSB8fCBhdG9taWNfcmVhZCgmdHNrLT5tbS0+bW1fdXNlcnMpID4gMSB8fAotCSAgICB0c2stPm1tICE9IHRzay0+YWN0aXZlX21tIHx8IHRzay0+bW0tPmlvY3R4X2xpc3QpIHsKKwkgICAgdHNrLT5tbSAhPSB0c2stPmFjdGl2ZV9tbSB8fCAhaGxpc3RfZW1wdHkoJnRzay0+bW0tPmlvY3R4X2xpc3QpKSB7CiAJCW1tcHV0KG1tKTsKIAkJdGFza191bmxvY2sodHNrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggZTU5NDU1OS4uMGE5NGQ5YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtNCwyMSArNCwxMTYgQEAKIAogbWFpbm1lbnUgIkxpbnV4L1NQQVJDIEtlcm5lbCBDb25maWd1cmF0aW9uIgogCitjb25maWcgU1BBUkMKKwlib29sCisJZGVmYXVsdCB5CisJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgSEFWRV9BUkNIX0tHREIgaWYgIVNNUCB8fCBTUEFSQzY0CisJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKKwlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKKwlzZWxlY3QgUlRDX0NMQVNTCisJc2VsZWN0IFJUQ19EUlZfTTQ4VDU5CisKKyMgSWRlbnRpZnkgdGhpcyBhcyBhIFNwYXJjMzIgYnVpbGQKK2NvbmZpZyBTUEFSQzMyCisJYm9vbAorCWRlZmF1bHQgeSBpZiBBUkNIID0gInNwYXJjIgorCWhlbHAKKwkgIFNQQVJDIGlzIGEgZmFtaWx5IG9mIFJJU0MgbWljcm9wcm9jZXNzb3JzIGRlc2lnbmVkIGFuZCBtYXJrZXRlZCBieQorCSAgU3VuIE1pY3Jvc3lzdGVtcywgaW5jb3Jwb3JhdGVkLiAgVGhleSBhcmUgdmVyeSB3aWRlbHkgZm91bmQgaW4gU3VuCisJICB3b3Jrc3RhdGlvbnMgYW5kIGNsb25lcy4gVGhpcyBwb3J0IGNvdmVycyB0aGUgb3JpZ2luYWwgMzItYml0IFNQQVJDOworCSAgaXQgaXMgb2xkIGFuZCBzdGFibGUgYW5kIHVzdWFsbHkgY29uc2lkZXJlZCBvbmUgb2YgdGhlICJiaWcgdGhyZWUiCisJICBhbG9uZyB3aXRoIHRoZSBJbnRlbCBhbmQgQWxwaGEgcG9ydHMuICBUaGUgVWx0cmFMaW51eCBwcm9qZWN0CisJICBtYWludGFpbnMgYm90aCB0aGUgU1BBUkMzMiBhbmQgU1BBUkM2NCBwb3J0czsgaXRzIHdlYiBwYWdlIGlzCisJICBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cudWx0cmFsaW51eC5vcmcvPi4KKworY29uZmlnIFNQQVJDNjQKKwlib29sCisJZGVmYXVsdCB5IGlmIEFSQ0ggPSAic3BhcmM2NCIKKwlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKKwlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKKwlzZWxlY3QgSEFWRV9LUkVUUFJPQkVTCisJc2VsZWN0IEhBVkVfS1BST0JFUworCXNlbGVjdCBIQVZFX0xNQgorCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKKwlzZWxlY3QgUlRDX0RSVl9DTU9TCisJc2VsZWN0IFJUQ19EUlZfQlE0ODAyCisJc2VsZWN0IFJUQ19EUlZfU1VONFYKKwlzZWxlY3QgUlRDX0RSVl9TVEFSRklSRQorCitjb25maWcgQVJDSF9ERUZDT05GSUcKKwlzdHJpbmcKKwlkZWZhdWx0ICJhcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmMzMl9kZWZjb25maWciIGlmIFNQQVJDMzIKKwlkZWZhdWx0ICJhcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWciIGlmIFNQQVJDNjQKKworIyBDT05GSUdfQklUUyBjYW4gYmUgdXNlZCBhdCBzb3VyY2UgbGV2ZWwgdG8gZ2V0IDMyLzY0IGJpdHMKK2NvbmZpZyBCSVRTCisJaW50CisJZGVmYXVsdCAzMiBpZiBTUEFSQzMyCisJZGVmYXVsdCA2NCBpZiBTUEFSQzY0CisKK2NvbmZpZyA2NEJJVAorCWRlZl9ib29sIHkgaWYgU1BBUkM2NAorCitjb25maWcgR0VORVJJQ19USU1FCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBHRU5FUklDX0NNT1NfVVBEQVRFCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBJT01NVV9IRUxQRVIKKwlib29sCisJZGVmYXVsdCB5IGlmIFNQQVJDNjQKKworY29uZmlnIFFVSUNLTElTVAorCWJvb2wKKwlkZWZhdWx0IHkgaWYgU1BBUkM2NAorCitjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBMT0NLREVQX1NVUFBPUlQKKwlib29sCisJZGVmYXVsdCB5IGlmIFNQQVJDNjQKKworY29uZmlnIEhBVkVfTEFURU5DWVRPUF9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBBVURJVF9BUkNICisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKKwlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKKworY29uZmlnIEdFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUQorCWJvb2wKKwlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKKwogY29uZmlnIE1NVQogCWJvb2wKIAlkZWZhdWx0IHkKIAogY29uZmlnIEhJR0hNRU0KIAlib29sCi0JZGVmYXVsdCB5CisJZGVmYXVsdCB5IGlmIFNQQVJDMzIKIAogY29uZmlnIFpPTkVfRE1BCiAJYm9vbAotCWRlZmF1bHQgeQorCWRlZmF1bHQgeSBpZiBTUEFSQzMyCiAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCi0JZGVmYXVsdCB5CisJZGVmYXVsdCB5IGlmIFNQQVJDMzIKIAogY29uZmlnIEdFTkVSSUNfR1BJTwogCWJvb2wKQEAgLTMxLDE1ICsxMjYsMTEgQEAKIGNvbmZpZyBPRgogCWRlZl9ib29sIHkKIAotY29uZmlnIEhaCi0JaW50Ci0JZGVmYXVsdCAxMDAKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKIAotbWVudSAiR2VuZXJhbCBtYWNoaW5lIHNldHVwIgorbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgogCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCAoZG9lcyBub3Qgd29yayBvbiBzdW40L3N1bjRjKSIKQEAgLTY0LDgyICsxNTUsMjY5IEBACiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgogCiBjb25maWcgTlJfQ1BVUwotCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCi0JcmFuZ2UgMiAzMgorCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyIKIAlkZXBlbmRzIG9uIFNNUAotCWRlZmF1bHQgIjMyIgorCXJhbmdlIDIgMzIgaWYgU1BBUkMzMgorCXJhbmdlIDIgMTAyNCBpZiBTUEFSQzY0CisJZGVmYXVsdCAzMiBpZiBTUEFSQzMyCisJZGVmYXVsdCA2NCBpZiBTUEFSQzY0CiAKLWNvbmZpZyBTUEFSQworc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CisKK2NvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCisJYm9vbAorCWRlZmF1bHQgeSBpZiBTUEFSQzMyCisKK2NvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQorCWJvb2wKKwlkZWZhdWx0IHkgaWYgU1BBUkM2NAorCitjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCiAJYm9vbAogCWRlZmF1bHQgeQotCXNlbGVjdCBIQVZFX0lERQotCXNlbGVjdCBIQVZFX09QUk9GSUxFCi0Jc2VsZWN0IEhBVkVfQVJDSF9LR0RCIGlmICFTTVAKLQlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwotCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotCXNlbGVjdCBSVENfQ0xBU1MKLQlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKIAotIyBJZGVudGlmeSB0aGlzIGFzIGEgU3BhcmMzMiBidWlsZAotY29uZmlnIFNQQVJDMzIKK2NvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCisJZGVmYXVsdCB5IGlmICFVTFRSQV9IQVNfUE9QVUxBVElPTl9DT1VOVAorCitjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEVNVUxBVEVEX0NNUFhDSEcKKwlib29sCisJZGVmYXVsdCB5IGlmIFNQQVJDMzIKKwloZWxwCisJICBTcGFyYzMyIGRvZXMgbm90IGhhdmUgYSBDQVMgaW5zdHJ1Y3Rpb24gbGlrZSBzcGFyYzY0LiBjbXB4Y2hnKCkKKwkgIGlzIGVtdWxhdGVkLCBhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCBjb21wbGV0ZWx5IGF0b21pYy4KKworIyBNYWtlZmlsZSBoZWxwZXJzCitjb25maWcgU1BBUkMzMl9TTVAKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTUEFSQzMyICYmIFNNUAorCitjb25maWcgU1BBUkM2NF9TTVAKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFNNUAorCitjaG9pY2UKKwlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiIGlmIFNQQVJDNjQKKwlkZWZhdWx0IFNQQVJDNjRfUEFHRV9TSVpFXzhLQgorCitjb25maWcgU1BBUkM2NF9QQUdFX1NJWkVfOEtCCisJYm9vbCAiOEtCIgorCWhlbHAKKwkgIFRoaXMgbGV0cyB5b3Ugc2VsZWN0IHRoZSBwYWdlIHNpemUgb2YgdGhlIGtlcm5lbC4KKworCSAgOEtCIGFuZCA2NEtCIHdvcmsgcXVpdGUgd2VsbCwgc2luY2UgU1BBUkMgRUxGIHNlY3Rpb25zCisJICBwcm92aWRlIGZvciB1cCB0byA2NEtCIGFsaWdubWVudC4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbywgY2hvb3NlIDhLQi4KKworY29uZmlnIFNQQVJDNjRfUEFHRV9TSVpFXzY0S0IKKwlib29sICI2NEtCIgorCitlbmRjaG9pY2UKKworY29uZmlnIFNFQ0NPTVAKKwlib29sICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFBST0NfRlMKIAlkZWZhdWx0IHkKIAloZWxwCi0JICBTUEFSQyBpcyBhIGZhbWlseSBvZiBSSVNDIG1pY3JvcHJvY2Vzc29ycyBkZXNpZ25lZCBhbmQgbWFya2V0ZWQgYnkKLQkgIFN1biBNaWNyb3N5c3RlbXMsIGluY29ycG9yYXRlZC4gIFRoZXkgYXJlIHZlcnkgd2lkZWx5IGZvdW5kIGluIFN1bgotCSAgd29ya3N0YXRpb25zIGFuZCBjbG9uZXMuIFRoaXMgcG9ydCBjb3ZlcnMgdGhlIG9yaWdpbmFsIDMyLWJpdCBTUEFSQzsKLQkgIGl0IGlzIG9sZCBhbmQgc3RhYmxlIGFuZCB1c3VhbGx5IGNvbnNpZGVyZWQgb25lIG9mIHRoZSAiYmlnIHRocmVlIgotCSAgYWxvbmcgd2l0aCB0aGUgSW50ZWwgYW5kIEFscGhhIHBvcnRzLiAgVGhlIFVsdHJhTGludXggcHJvamVjdAotCSAgbWFpbnRhaW5zIGJvdGggdGhlIFNQQVJDMzIgYW5kIFNQQVJDNjQgcG9ydHM7IGl0cyB3ZWIgcGFnZSBpcwotCSAgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnVsdHJhbGludXgub3JnLz4uCisJICBUaGlzIGtlcm5lbCBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgbnVtYmVyIGNydW5jaGluZyBhcHBsaWNhdGlvbnMKKwkgIHRoYXQgbWF5IG5lZWQgdG8gY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUgZHVyaW5nIHRoZWlyCisJICBleGVjdXRpb24uIEJ5IHVzaW5nIHBpcGVzIG9yIG90aGVyIHRyYW5zcG9ydHMgbWFkZSBhdmFpbGFibGUgdG8KKwkgIHRoZSBwcm9jZXNzIGFzIGZpbGUgZGVzY3JpcHRvcnMgc3VwcG9ydGluZyB0aGUgcmVhZC93cml0ZQorCSAgc3lzY2FsbHMsIGl0J3MgcG9zc2libGUgdG8gaXNvbGF0ZSB0aG9zZSBhcHBsaWNhdGlvbnMgaW4KKwkgIHRoZWlyIG93biBhZGRyZXNzIHNwYWNlIHVzaW5nIHNlY2NvbXAuIE9uY2Ugc2VjY29tcCBpcworCSAgZW5hYmxlZCB2aWEgL3Byb2MvPHBpZD4vc2VjY29tcCwgaXQgY2Fubm90IGJlIGRpc2FibGVkCisJICBhbmQgdGhlIHRhc2sgaXMgb25seSBhbGxvd2VkIHRvIGV4ZWN1dGUgYSBmZXcgc2FmZSBzeXNjYWxscworCSAgZGVmaW5lZCBieSBlYWNoIHNlY2NvbXAgbW9kZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4gT25seSBlbWJlZGRlZCBzaG91bGQgc2F5IE4gaGVyZS4KKworY29uZmlnIEhPVFBMVUdfQ1BVCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIgorCWRlcGVuZHMgb24gU1BBUkM2NCAmJiBTTVAKKwlzZWxlY3QgSE9UUExVRworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZXhwZXJpbWVudCB3aXRoIHR1cm5pbmcgQ1BVcyBvZmYgYW5kIG9uLiAgQ1BVcworCSAgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjLgorCSAgU2F5IE4gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBDUFUgaG90cGx1Zy4KKworY29uZmlnIEdFTkVSSUNfSEFSRElSUVMKKwlib29sCisJZGVmYXVsdCB5IGlmIFNQQVJDNjQKKworc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgorCitpZiBTUEFSQzY0Citzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgorCitjb25maWcgVVMzX0ZSRVEKKwl0cmlzdGF0ZSAiVWx0cmFTUEFSQy1JSUkgQ1BVIEZyZXF1ZW5jeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBDUFVfRlJFUQorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFVsdHJhU1BBUkMtSUlJIHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgVVMyRV9GUkVRCisJdHJpc3RhdGUgIlVsdHJhU1BBUkMtSUllIENQVSBGcmVxdWVuY3kgZHJpdmVyIgorCWRlcGVuZHMgb24gQ1BVX0ZSRVEKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBVbHRyYVNQQVJDLUlJZSBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcT4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworZW5kaWYKKworY29uZmlnIFVTM19NQworCXRyaXN0YXRlICJVbHRyYVNQQVJDLUlJSSBNZW1vcnkgQ29udHJvbGxlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEFSQzY0CisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBhZGRzIGEgZHJpdmVyIGZvciB0aGUgVWx0cmFTUEFSQy1JSUkgbWVtb3J5IGNvbnRyb2xsZXIuCisJICBMb2FkaW5nIHRoaXMgZHJpdmVyIGFsbG93cyBleGFjdCBtbmVtb25pYyBzdHJpbmdzIHRvIGJlCisJICBwcmludGVkIGluIHRoZSBldmVudCBvZiBhIG1lbW9yeSBlcnJvciwgc28gdGhhdCB0aGUgZmF1bHR5IERJTU0KKwkgIG9uIHRoZSBtb3RoZXJib2FyZCBjYW4gYmUgbWF0Y2hlZCB0byB0aGUgZXJyb3IuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWSwgYXMgdGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdmVyeSB1c2VmdWwuCiAKICMgR2xvYmFsIHRoaW5ncyBhY3Jvc3MgYWxsIFN1biBtYWNoaW5lcy4KLWNvbmZpZyBJU0EKLQlib29sCi0JaGVscAotCSAgSVNBIGlzIGZvdW5kIG9uIEVzcHJlc3NvIG9ubHkgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5LgotCSAgU2F5IE4KLQotY29uZmlnIEVJU0EKLQlib29sCi0JaGVscAotCSAgRUlTQSBpcyBub3Qgc3VwcG9ydGVkLgotCSAgU2F5IE4KLQotY29uZmlnIE1DQQotCWJvb2wKLQloZWxwCi0JICBNQ0EgaXMgbm90IHN1cHBvcnRlZC4KLQkgIFNheSBOCi0KLWNvbmZpZyBQQ01DSUEKLQl0cmlzdGF0ZQotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYXR0YWNoIFBDTUNJQS0gb3IgUEMtY2FyZHMgdG8geW91ciBMaW51eAotCSAgY29tcHV0ZXIuICBUaGVzZSBhcmUgY3JlZGl0LWNhcmQgc2l6ZSBkZXZpY2VzIHN1Y2ggYXMgbmV0d29yayBjYXJkcywKLQkgIG1vZGVtcyBvciBoYXJkIGRyaXZlcyBvZnRlbiB1c2VkIHdpdGggbGFwdG9wcyBjb21wdXRlcnMuICBUaGVyZSBhcmUKLQkgIGFjdHVhbGx5IHR3byB2YXJpZXRpZXMgb2YgdGhlc2UgY2FyZHM6IHRoZSBvbGRlciAxNiBiaXQgUENNQ0lBIGNhcmRzCi0JICBhbmQgdGhlIG5ld2VyIDMyIGJpdCBDYXJkQnVzIGNhcmRzLiAgSWYgeW91IHdhbnQgdG8gdXNlIENhcmRCdXMKLQkgIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvICJDYXJkQnVzIHN1cHBvcnQiIGJlbG93LgotCi0JICBUbyB1c2UgeW91ciBQQy1jYXJkcywgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20gRGF2aWQKLQkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KLQkgIGZvciBsb2NhdGlvbikuICBQbGVhc2UgYWxzbyByZWFkIHRoZSBQQ01DSUEtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBwY21jaWFfY29yZSBhbmQgZHMuCi0KLWNvbmZpZyBTQlVTCitjb25maWcgR0VORVJJQ19MT0NLQlJFQUsKIAlib29sCiAJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFNNUCAmJiBQUkVFTVBUCiAKLWNvbmZpZyBTQlVTQ0hBUgotCWJvb2wKK2Nob2ljZQorCXByb21wdCAiU1BBUkM2NCBIdWdlIFRMQiBQYWdlIFNpemUiCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIEhVR0VUTEJfUEFHRQorCWRlZmF1bHQgSFVHRVRMQl9QQUdFX1NJWkVfNE1CCisKK2NvbmZpZyBIVUdFVExCX1BBR0VfU0laRV80TUIKKwlib29sICI0TUIiCisKK2NvbmZpZyBIVUdFVExCX1BBR0VfU0laRV81MTJLCisJYm9vbCAiNTEySyIKKworY29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0SworCWRlcGVuZHMgb24gIVNQQVJDNjRfUEFHRV9TSVpFXzY0S0IKKwlib29sICI2NEsiCisKK2VuZGNob2ljZQorCitjb25maWcgTlVNQQorCWJvb2wgIk5VTUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNQQVJDNjQgJiYgU01QCisKK2NvbmZpZyBOT0RFU19TSElGVAorCWludAorCWRlZmF1bHQgIjQiCisJZGVwZW5kcyBvbiBORUVEX01VTFRJUExFX05PREVTCisKKyMgU29tZSBOVU1BIG5vZGVzIGhhdmUgbWVtb3J5IHJhbmdlcyB0aGF0IHNwYW4KKyMgb3RoZXIgbm9kZXMuICBFdmVuIHRob3VnaCBhIHBmbiBpcyB2YWxpZCBhbmQKKyMgYmV0d2VlbiBhIG5vZGUncyBzdGFydCBhbmQgZW5kIHBmbnMsIGl0IG1heSBub3QKKyMgcmVzaWRlIG9uIHRoYXQgbm9kZS4gIFNlZSBtZW1tYXBfaW5pdF96b25lKCkKKyMgZm9yIGRldGFpbHMuCitjb25maWcgTk9ERVNfU1BBTl9PVEhFUl9OT0RFUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKKworY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisJZGVmX2Jvb2wgeSBpZiBTUEFSQzY0CisKK2NvbmZpZyBBUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwKKwlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCWRlZl9ib29sIHkgaWYgU1BBUkM2NAorCXNlbGVjdCBTUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKKwlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKKworc291cmNlICJtbS9LY29uZmlnIgorCitjb25maWcgU0NIRURfU01UCisJYm9vbCAiU01UIChIeXBlcnRocmVhZGluZykgc2NoZWR1bGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFNNUAogCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNNVCBzY2hlZHVsZXIgc3VwcG9ydCBpbXByb3ZlcyB0aGUgQ1BVIHNjaGVkdWxlcidzIGRlY2lzaW9uIG1ha2luZworCSAgd2hlbiBkZWFsaW5nIHdpdGggU1BBUkMgY3B1cyBhdCBhIGNvc3Qgb2Ygc2xpZ2h0bHkgaW5jcmVhc2VkIG92ZXJoZWFkCisJICBpbiBzb21lIHBsYWNlcy4gSWYgdW5zdXJlIHNheSBOIGhlcmUuCisKK2NvbmZpZyBTQ0hFRF9NQworCWJvb2wgIk11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFNNUAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQgaW1wcm92ZXMgdGhlIENQVSBzY2hlZHVsZXIncyBkZWNpc2lvbgorCSAgbWFraW5nIHdoZW4gZGVhbGluZyB3aXRoIG11bHRpLWNvcmUgQ1BVIGNoaXBzIGF0IGEgY29zdCBvZiBzbGlnaHRseQorCSAgaW5jcmVhc2VkIG92ZXJoZWFkIGluIHNvbWUgcGxhY2VzLiBJZiB1bnN1cmUgc2F5IE4gaGVyZS4KKworaWYgU1BBUkM2NAorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgorZW5kaWYKKworY29uZmlnIENNRExJTkVfQk9PTAorCWJvb2wgIkRlZmF1bHQgYm9vdGxvYWRlciBrZXJuZWwgYXJndW1lbnRzIgorCWRlcGVuZHMgb24gU1BBUkM2NAorCitjb25maWcgQ01ETElORQorCXN0cmluZyAiSW5pdGlhbCBrZXJuZWwgY29tbWFuZCBzdHJpbmciCisJZGVwZW5kcyBvbiBDTURMSU5FX0JPT0wKKwlkZWZhdWx0ICJjb25zb2xlPXR0eVMwLDk2MDAgcm9vdD0vZGV2L3NkYTEiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhc3MgZGVmYXVsdCBhcmd1bWVudHMgdG8KKwkgIHRoZSBrZXJuZWwuIFRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBib290bG9hZGVyLCBpZiB5b3UKKwkgIHVzZSBvbmUgKHN1Y2ggYXMgU0lMTykuIFRoaXMgaXMgbW9zdCB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYm9vdAorCSAgYSBrZXJuZWwgZnJvbSBURlRQLCBhbmQgd2FudCBkZWZhdWx0IG9wdGlvbnMgdG8gYmUgYXZhaWxhYmxlCisJICB3aXRoIGhhdmluZyB0aGVtIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisJICBOT1RFOiBUaGlzIG9wdGlvbiBXSUxMIG92ZXJyaWRlIHRoZSBQUk9NIGJvb3RhcmdzIHNldHRpbmchCisKK2NvbmZpZyBTVU5fUE0KKwlib29sCisJZGVmYXVsdCB5IGlmIFNQQVJDMzIKKwloZWxwCisJICBFbmFibGUgcG93ZXIgbWFuYWdlbWVudCBhbmQgQ1BVIHN0YW5kYnkgZmVhdHVyZXMgb24gc3VwcG9ydGVkCisJICBTUEFSQyBwbGF0Zm9ybXMuCisKK2NvbmZpZyBTUEFSQ19MRUQKKwl0cmlzdGF0ZSAiU3VuNG0gTEVEIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQQVJDMzIKKwloZWxwCisJICBUaGlzIGRyaXZlciB0b2dnbGVzIHRoZSBmcm9udC1wYW5lbCBMRUQgb24gc3VuNG0gc3lzdGVtcworCSAgaW4gYSB1c2VyLXNwZWNpZmlhYmxlIG1hbm5lci4gIEl0cyBzdGF0ZSBjYW4gYmUgcHJvYmVkCisJICBieSByZWFkaW5nIC9wcm9jL2xlZCBhbmQgaXRzIGJsaW5raW5nIG1vZGUgY2FuIGJlIGNoYW5nZWQKKwkgIHZpYSB3cml0ZXMgdG8gL3Byb2MvbGVkCiAKIGNvbmZpZyBTRVJJQUxfQ09OU09MRQogCWJvb2wKKwlkZXBlbmRzIG9uIFNQQVJDMzIKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSBzZXJpYWwgcG9ydCBhcyB0aGUKQEAgLTE2MSw3MSArNDM5LDY2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBTVU5fQVVYSU8KLQlib29sCi0JZGVmYXVsdCB5CitlbmRtZW51CiAKLWNvbmZpZyBTVU5fSU8KK21lbnUgIkJ1cyBvcHRpb25zIChQQ0kgZXRjLikiCitjb25maWcgSVNBCiAJYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCi0JYm9vbAotCi1jb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgR0VORVJJQ19IV0VJR0hUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIEVNVUxBVEVEX0NNUFhDSEcKLQlib29sCi0JZGVmYXVsdCB5CiAJaGVscAotCSAgU3BhcmMzMiBkb2VzIG5vdCBoYXZlIGEgQ0FTIGluc3RydWN0aW9uIGxpa2Ugc3BhcmM2NC4gY21weGNoZygpCi0JICBpcyBlbXVsYXRlZCwgYW5kIHRoZXJlZm9yZSBpdCBpcyBub3QgY29tcGxldGVseSBhdG9taWMuCisJICBJU0EgaXMgZm91bmQgb24gRXNwcmVzc28gb25seSBhbmQgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuCiAKLWNvbmZpZyBTVU5fUE0KK2NvbmZpZyBJU0FQTlAKKwlib29sCisJaGVscAorCSAgSVNBUE5QIGlzIG5vdCBzdXBwb3J0ZWQKKworY29uZmlnIEVJU0EKKwlib29sCisJaGVscAorCSAgRUlTQSBpcyBub3Qgc3VwcG9ydGVkLgorCitjb25maWcgTUNBCisJYm9vbAorCWhlbHAKKwkgIE1DQSBpcyBub3Qgc3VwcG9ydGVkLgorCitjb25maWcgU0JVUwogCWJvb2wKIAlkZWZhdWx0IHkKKworY29uZmlnIFNCVVNDSEFSCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgU1VOX0xET01TCisJYm9vbCAiU3VuIExvZ2ljYWwgRG9tYWlucyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1BBUkM2NAogCWhlbHAKLQkgIEVuYWJsZSBwb3dlciBtYW5hZ2VtZW50IGFuZCBDUFUgc3RhbmRieSBmZWF0dXJlcyBvbiBzdXBwb3J0ZWQKLQkgIFNQQVJDIHBsYXRmb3Jtcy4KKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgdG8gc3VwcG9ydCB2aXJ0dWFsIGRldmljZXMgdmlhCisJICBMb2dpY2FsIERvbWFpbnMuCiAKIGNvbmZpZyBQQ0kKIAlib29sICJTdXBwb3J0IGZvciBQQ0kgYW5kIFBTLzIga2V5Ym9hcmQvbW91c2UiCiAJaGVscAorCSAgRmluZCBvdXQgd2hldGhlciB5b3VyIHN5c3RlbSBpbmNsdWRlcyBhIFBDSSBidXMuIFBDSSBpcyB0aGUgbmFtZSBvZgorCSAgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCisJICB5b3VyIGJveC4gIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsIHdpbGwgaW5jbHVkZSBkcml2ZXJzIGFuZAorCSAgaW5mcmFzdHJ1Y3R1cmUgY29kZSB0byBzdXBwb3J0IFBDSSBidXMgZGV2aWNlcy4KKwogCSAgQ09ORklHX1BDSSBpcyBuZWVkZWQgZm9yIGFsbCBKYXZhU3RhdGlvbidzIChpbmNsdWRpbmcgTXJDb2ZmZWUpLAogCSAgQ1AtMTIwMCwgSmF2YUVuZ2luZS0xLCBDb3JvbmEsIFJlZCBPY3RvYmVyLCBhbmQgU2VyZW5nZXRpIFNHU0MuCiAJICBBbGwgb2YgdGhlc2UgcGxhdGZvcm1zIGFyZSBleHRyZW1lbHkgb2JzY3VyZSwgc28gc2F5IE4gaWYgdW5zdXJlLgogCitjb25maWcgUENJX0RPTUFJTlMKKwlkZWZfYm9vbCBQQ0kgaWYgU1BBUkM2NAorCiBjb25maWcgUENJX1NZU0NBTEwKIAlkZWZfYm9vbCBQQ0kKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCisKIGNvbmZpZyBTVU5fT1BFTlBST01GUwogCXRyaXN0YXRlICJPcGVucHJvbSB0cmVlIGFwcGVhcnMgaW4gL3Byb2Mvb3BlbnByb20iCiAJaGVscApAQCAtMjM5LDE3ICs1MTIsMzMgQEAKIAkgIE9ubHkgY2hvb3NlIE4gaWYgeW91IGtub3cgaW4gYWR2YW5jZSB0aGF0IHlvdSB3aWxsIG5vdCBuZWVkIHRvIG1vZGlmeQogCSAgT3BlblBST00gc2V0dGluZ3Mgb24gdGhlIHJ1bm5pbmcgc3lzdGVtLgogCi1jb25maWcgU1BBUkNfTEVECi0JdHJpc3RhdGUgIlN1bjRtIExFRCBkcml2ZXIiCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgdG9nZ2xlcyB0aGUgZnJvbnQtcGFuZWwgTEVEIG9uIHN1bjRtIHN5c3RlbXMKLQkgIGluIGEgdXNlci1zcGVjaWZpYWJsZSBtYW5uZXIuICBJdHMgc3RhdGUgY2FuIGJlIHByb2JlZAotCSAgYnkgcmVhZGluZyAvcHJvYy9sZWQgYW5kIGl0cyBibGlua2luZyBtb2RlIGNhbiBiZSBjaGFuZ2VkCi0JICB2aWEgd3JpdGVzIHRvIC9wcm9jL2xlZAorIyBNYWtlZmlsZSBoZWxwZXJzCitjb25maWcgU1BBUkMzMl9QQ0kKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTUEFSQzMyICYmIFBDSQorCitjb25maWcgU1BBUkM2NF9QQ0kKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFBDSQorCitlbmRtZW51CisKK21lbnUgIkV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIgogCiBzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgogCi1zb3VyY2UgIm1tL0tjb25maWciCitjb25maWcgQ09NUEFUCisJYm9vbAorCWRlcGVuZHMgb24gU1BBUkM2NAorCWRlZmF1bHQgeQorCXNlbGVjdCBDT01QQVRfQklORk1UX0VMRgorCitjb25maWcgU1lTVklQQ19DT01QQVQKKwlib29sCisJZGVwZW5kcyBvbiBDT01QQVQgJiYgU1lTVklQQworCWRlZmF1bHQgeQogCiBlbmRtZW51CiAKQEAgLTI1OSw0MCArNTQ4LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3NidXMvY2hhci9LY29uZmlnIgogCi0jIFRoaXMgb25lIG11c3QgYmUgYmVmb3JlIHRoZSBmaWxlc3lzdGVtIGNvbmZpZ3MuIC1EYXZlTQotCi1tZW51ICJVbml4OTggUFRZIHN1cHBvcnQiCi0KLWNvbmZpZyBVTklYOThfUFRZUwotCWJvb2wgIlVuaXg5OCBQVFkgc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBBIHBzZXVkbyB0ZXJtaW5hbCAoUFRZKSBpcyBhIHNvZnR3YXJlIGRldmljZSBjb25zaXN0aW5nIG9mIHR3bwotCSAgaGFsdmVzOiBhIG1hc3RlciBhbmQgYSBzbGF2ZS4gVGhlIHNsYXZlIGRldmljZSBiZWhhdmVzIGlkZW50aWNhbCB0bwotCSAgYSBwaHlzaWNhbCB0ZXJtaW5hbDsgdGhlIG1hc3RlciBkZXZpY2UgaXMgdXNlZCBieSBhIHByb2Nlc3MgdG8KLQkgIHJlYWQgZGF0YSBmcm9tIGFuZCB3cml0ZSBkYXRhIHRvIHRoZSBzbGF2ZSwgdGhlcmVieSBlbXVsYXRpbmcgYQotCSAgdGVybWluYWwuIFR5cGljYWwgcHJvZ3JhbXMgZm9yIHRoZSBtYXN0ZXIgc2lkZSBhcmUgdGVsbmV0IHNlcnZlcnMKLQkgIGFuZCB4dGVybXMuCi0KLQkgIExpbnV4IGhhcyB0cmFkaXRpb25hbGx5IHVzZWQgdGhlIEJTRC1saWtlIG5hbWVzIC9kZXYvcHR5eHggZm9yCi0JICBtYXN0ZXJzIGFuZCAvZGV2L3R0eXh4IGZvciBzbGF2ZXMgb2YgcHNldWRvIHRlcm1pbmFscy4gVGhpcyBzY2hlbWUKLQkgIGhhcyBhIG51bWJlciBvZiBwcm9ibGVtcy4gVGhlIEdOVSBDIGxpYnJhcnkgZ2xpYmMgMi4xIGFuZCBsYXRlciwKLQkgIGhvd2V2ZXIsIHN1cHBvcnRzIHRoZSBVbml4OTggbmFtaW5nIHN0YW5kYXJkOiBpbiBvcmRlciB0byBhY3F1aXJlIGEKLQkgIHBzZXVkbyB0ZXJtaW5hbCwgYSBwcm9jZXNzIG9wZW5zIC9kZXYvcHRteDsgdGhlIG51bWJlciBvZiB0aGUgcHNldWRvCi0JICB0ZXJtaW5hbCBpcyB0aGVuIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9jZXNzIGFuZCB0aGUgcHNldWRvCi0JICB0ZXJtaW5hbCBzbGF2ZSBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9wdHMvPG51bWJlcj4uIFdoYXQgd2FzCi0JICB0cmFkaXRpb25hbGx5IC9kZXYvdHR5cDIgd2lsbCB0aGVuIGJlIC9kZXYvcHRzLzIsIGZvciBleGFtcGxlLgotCi0JICBUaGUgZW50cmllcyBpbiAvZGV2L3B0cy8gYXJlIGNyZWF0ZWQgb24gdGhlIGZseSBieSBhIHZpcnR1YWwKLQkgIGZpbGUgc3lzdGVtOyB0aGVyZWZvcmUsIGlmIHlvdSBzYXkgWSBoZXJlIHlvdSBzaG91bGQgc2F5IFkgdG8KLQkgICIvZGV2L3B0cyBmaWxlIHN5c3RlbSBmb3IgVW5peDk4IFBUWXMiIGFzIHdlbGwuCi0KLQkgIElmIHlvdSB3YW50IHRvIHNheSBZIGhlcmUsIHlvdSBuZWVkIHRvIGhhdmUgdGhlIEMgbGlicmFyeSBnbGliYyAyLjEKLQkgIG9yIGxhdGVyIChlcXVhbCB0byBsaWJjLTYuMSwgY2hlY2sgd2l0aCAibHMgLWwgL2xpYi9saWJjLnNvLioiKS4KLQkgIFJlYWQgdGhlIGluc3RydWN0aW9ucyBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+IHBlcnRhaW5pbmcgdG8KLQkgIHBzZXVkbyB0ZXJtaW5hbHMuIEl0J3Mgc2FmZSB0byBzYXkgTi4KLQotZW5kbWVudQotCiBzb3VyY2UgImZzL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9zcGFyYy9LY29uZmlnLmRlYnVnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9zcGFyYy9LY29uZmlnLmRlYnVnCmluZGV4IDg3ZGQ0OTYuLmI4YTE1ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcuZGVidWcKQEAgLTE1LDQgKzE1LDMwIEBACiAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gc29tZXdoYXQuCiAKK2NvbmZpZyBERUJVR19EQ0ZMVVNICisJYm9vbCAiRC1jYWNoZSBmbHVzaCBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIERFQlVHX0tFUk5FTAorCitjb25maWcgU1RBQ0tfREVCVUcKKwlib29sICJTdGFjayBPdmVyZmxvdyBEZXRlY3Rpb24gU3VwcG9ydCIKKworY29uZmlnIERFQlVHX1BBR0VBTExPQworCWJvb2wgIkRlYnVnIHBhZ2UgbWVtb3J5IGFsbG9jYXRpb25zIgorCWRlcGVuZHMgb24gU1BBUkM2NCAmJiBERUJVR19LRVJORUwgJiYgIUhJQkVSTkFUSU9OCisJaGVscAorCSAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KKwkgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCisJICBvZiBtZW1vcnkgY29ycnVwdGlvbnMuCisKK2NvbmZpZyBNQ09VTlQKKwlib29sCisJZGVwZW5kcyBvbiBTUEFSQzY0CisJZGVwZW5kcyBvbiBTVEFDS19ERUJVRyB8fCBGVU5DVElPTl9UUkFDRVIKKwlkZWZhdWx0IHkKKworY29uZmlnIEZSQU1FX1BPSU5URVIKKwlib29sCisJZGVwZW5kcyBvbiBNQ09VTlQKKwlkZWZhdWx0IHkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvTWFrZWZpbGUKaW5kZXggOTU5Mjg4OS4uMjAwM2RlZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL01ha2VmaWxlCkBAIC0yLDE4ICsyLDMxIEBACiAjIHNwYXJjL01ha2VmaWxlCiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBmbGFncyBhbmQgZGVwZW5kZW5jaWVzIG9uIHRoZQotIyBTcGFyYy4KKyMgU3BhcmMgYW5kIHNwYXJjNjQuCiAjCi0jIENvcHlyaWdodCAoQykgMTk5NCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisjIENvcHlyaWdodCAoQykgMTk5NCwxOTk2LDE5OTggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorIyBDb3B5cmlnaHQgKEMpIDE5OTggSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCisKKyMgV2UgYXJlIG5vdCB5ZXQgY29uZmlndXJlZCAtIHNvIHRlc3Qgb24gYXJjaAoraWZlcSAoJChBUkNIKSxzcGFyYykKKyAgICAgICAgS0JVSUxEX0RFRkNPTkZJRyA6PSBzcGFyYzMyX2RlZmNvbmZpZworZWxzZQorICAgICAgICBLQlVJTERfREVGQ09ORklHIDo9IHNwYXJjNjRfZGVmY29uZmlnCitlbmRpZgorCitpZmVxICgkKENPTkZJR19TUEFSQzMyKSx5KQorIyMjIyMKKyMgc3BhcmMzMgogIwogCiAjCiAjIFVuY29tbWVudCB0aGUgZmlyc3QgS0JVSUxEX0NGTEFHUyBpZiB5b3UgYXJlIGRvaW5nIGtnZGIgc291cmNlIGxldmVsCiAjIGRlYnVnZ2luZyBvZiB0aGUga2VybmVsIHRvIGdldCB0aGUgcHJvcGVyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KIAotQVMgICAgICAgICAgICAgIDo9ICQoQVMpIC0zMgotTERGTEFHUwkJOj0gLW0gZWxmMzJfc3BhcmMKLUNIRUNLRkxBR1MJKz0gLURfX3NwYXJjX18KK0FTICAgICAgICAgICAgIDo9ICQoQVMpIC0zMgorTERGTEFHUyAgICAgICAgOj0gLW0gZWxmMzJfc3BhcmMKK0NIRUNLRkxBR1MgICAgICs9IC1EX19zcGFyY19fCitleHBvcnQgQklUUyAgICA6PSAzMgogCiAjS0JVSUxEX0NGTEFHUyArPSAtZyAtcGlwZSAtZmNhbGwtdXNlZC1nNSAtZmNhbGwtdXNlZC1nNwogS0JVSUxEX0NGTEFHUyArPSAtbTMyIC1waXBlIC1tbm8tZnB1IC1mY2FsbC11c2VkLWc1IC1mY2FsbC11c2VkLWc3CkBAIC0yNSwzOCArMzgsNjAgQEAKICMgIEFjdHVhbCBsaW5raW5nIGlzIGRvbmUgd2l0aCAibWFrZSBpbWFnZSIuCiBMREZMQUdTX3ZtbGludXggPSAtcgogCi1oZWFkLXkgOj0gYXJjaC9zcGFyYy9rZXJuZWwvaGVhZC5vIGFyY2gvc3BhcmMva2VybmVsL2luaXRfdGFzay5vCi1IRUFEX1kgOj0gJChoZWFkLXkpCisjIERlZmF1bHQgdGFyZ2V0CithbGw6IHpJbWFnZQogCi1jb3JlLXkgKz0gYXJjaC9zcGFyYy9rZXJuZWwvIGFyY2gvc3BhcmMvbW0vIGFyY2gvc3BhcmMvbWF0aC1lbXUvCi1saWJzLXkgKz0gYXJjaC9zcGFyYy9wcm9tLyBhcmNoL3NwYXJjL2xpYi8KKworZWxzZQorIyMjIyMKKyMgc3BhcmM2NAorIworCitDSEVDS0ZMQUdTICAgICAgKz0gLURfX3NwYXJjX18gLURfX3NwYXJjX3Y5X18gLURfX2FyY2g2NF9fIC1tNjQKKworIyBVbmRlZmluZSBzcGFyYyB3aGVuIHByb2Nlc3Npbmcgdm1saW51eC5sZHMgLSBpdCBpcyB1c2VkCisjIEFuZCB0ZWFjaCBDUFAgd2UgYXJlIGRvaW5nIDY0IGJpdCBidWlsZHMgKGZvciB0aGlzIGNhc2UpCitDUFBGTEFHU192bWxpbnV4LmxkcyArPSAtbTY0IC1Vc3BhcmMKK0xERkxBR1MgICAgICAgICAgICAgIDo9IC1tIGVsZjY0X3NwYXJjCitleHBvcnQgQklUUyAgICAgICAgICA6PSA2NAorCitLQlVJTERfQ0ZMQUdTICs9IC1tNjQgLXBpcGUgLW1uby1mcHUgLW1jcHU9dWx0cmFzcGFyYyAtbWNtb2RlbD1tZWRsb3cgICBcCisgICAgICAgICAgICAgICAgIC1mZml4ZWQtZzQgLWZmaXhlZC1nNSAtZmNhbGwtdXNlZC1nNyAtV25vLXNpZ24tY29tcGFyZSBcCisgICAgICAgICAgICAgICAgIC1XYSwtLXVuZGVjbGFyZWQtcmVncworS0JVSUxEX0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT11bHRyYXNwYXJjMykKK0tCVUlMRF9BRkxBR1MgKz0gLW02NCAtbWNwdT11bHRyYXNwYXJjIC1XYSwtLXVuZGVjbGFyZWQtcmVncworCitpZmVxICgkKENPTkZJR19NQ09VTlQpLHkpCisgIEtCVUlMRF9DRkxBR1MgKz0gLXBnCitlbmRpZgorCitlbmRpZgorCitoZWFkLXkgICAgICAgICAgICAgICAgIDo9IGFyY2gvc3BhcmMva2VybmVsL2hlYWRfJChCSVRTKS5vCitoZWFkLXkgICAgICAgICAgICAgICAgICs9IGFyY2gvc3BhcmMva2VybmVsL2luaXRfdGFzay5vCisKK2NvcmUteSAgICAgICAgICAgICAgICAgKz0gYXJjaC9zcGFyYy9rZXJuZWwvCitjb3JlLXkgICAgICAgICAgICAgICAgICs9IGFyY2gvc3BhcmMvbW0vIGFyY2gvc3BhcmMvbWF0aC1lbXUvCisKK2xpYnMteSAgICAgICAgICAgICAgICAgKz0gYXJjaC9zcGFyYy9wcm9tLworbGlicy15ICAgICAgICAgICAgICAgICArPSBhcmNoL3NwYXJjL2xpYi8KIAogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJKz0gYXJjaC9zcGFyYy9vcHJvZmlsZS8KIAogIyBFeHBvcnQgd2hhdCBpcyBuZWVkZWQgYnkgYXJjaC9zcGFyYy9ib290L01ha2VmaWxlCi0jIFJlbmFtaW5nIGlzIGRvbmUgdG8gYXZvaWQgY29uZnVzaW5nIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMgaW4gMi41LjQ1IChtdWx0eS0pCi1JTklUX1kJCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChpbml0LXkpKQotQ09SRV9ZCQk6PSAkKGNvcmUteSkKLUNPUkVfWQkJKz0ga2VybmVsLyBtbS8gZnMvIGlwYy8gc2VjdXJpdHkvIGNyeXB0by8gYmxvY2svCi1DT1JFX1kJCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChDT1JFX1kpKQotRFJJVkVSU19ZCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChkcml2ZXJzLXkpKQotTkVUX1kJCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChuZXQteSkpCi1MSUJTX1kxCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2xpYi5hLCAkKGxpYnMteSkpCi1MSUJTX1kyCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2J1aWx0LWluLm8sICQobGlicy15KSkKLUxJQlNfWQkJOj0gJChMSUJTX1kxKSAkKExJQlNfWTIpCitleHBvcnQgVk1MSU5VWF9JTklUIFZNTElOVVhfTUFJTgorVk1MSU5VWF9JTklUIDo9ICQoaGVhZC15KSAkKGluaXQteSkKK1ZNTElOVVhfTUFJTiA6PSAkKGNvcmUteSkga2VybmVsLyBtbS8gZnMvIGlwYy8gc2VjdXJpdHkvIGNyeXB0by8gYmxvY2svCitWTUxJTlVYX01BSU4gKz0gJChwYXRzdWJzdCAlLywgJS9saWIuYSwgJChsaWJzLXkpKSAkKGxpYnMteSkKK1ZNTElOVVhfTUFJTiArPSAkKGRyaXZlcnMteSkgJChuZXQteSkKIAogaWZkZWYgQ09ORklHX0tBTExTWU1TCi1rYWxsc3ltcy5vIDo9IC50bXBfa2FsbHN5bXMyLm8KK2V4cG9ydCBrYWxsc3ltcy5vIDo9IC50bXBfa2FsbHN5bXMyLm8KIGVuZGlmCiAKLWV4cG9ydCBJTklUX1kgQ09SRV9ZIERSSVZFUlNfWSBORVRfWSBMSUJTX1kgSEVBRF9ZIGthbGxzeW1zLm8KLQotIyBEZWZhdWx0IHRhcmdldAotYWxsOiB6SW1hZ2UKLQogYm9vdCA6PSBhcmNoL3NwYXJjL2Jvb3QKIAotaW1hZ2UgekltYWdlIHRmdHBib290LmltZzogdm1saW51eAoraW1hZ2UgekltYWdlIHRmdHBib290LmltZyB2bWxpbnV4LmFvdXQ6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAogYXJjaGNsZWFuOgpAQCAtNjUsMTEgKzEwMCwxNyBAQAogIyBUaGlzIGlzIHRoZSBpbWFnZSB1c2VkIGZvciBwYWNrYWdpbmcKIEtCVUlMRF9JTUFHRSA6PSAkKGJvb3QpL3pJbWFnZQogCi1DTEVBTl9GSUxFUyArPSBhcmNoLyQoQVJDSCkvYm9vdC9TeXN0ZW0ubWFwCi0KICMgRG9uJ3QgdXNlIHRhYnMgaW4gZWNobyBhcmd1bWVudHMuCitpZmVxICgkKEFSQ0gpLHNwYXJjKQogZGVmaW5lIGFyY2hoZWxwCiAgIGVjaG8gICcqIGltYWdlICAgICAgICAtIGtlcm5lbCBpbWFnZSAoJChib290KS9pbWFnZSknCiAgIGVjaG8gICcqIHpJbWFnZSAgICAgICAtIHN0cmlwcGVkIGtlcm5lbCBpbWFnZSAoJChib290KS96SW1hZ2UpJwogICBlY2hvICAnICB0ZnRwYm9vdC5pbWcgLSBpbWFnZSBwcmVwYXJlZCBmb3IgdGZ0cCcKIGVuZGVmCitlbHNlCitkZWZpbmUgYXJjaGhlbHAKKyAgZWNobyAgJyogdm1saW51eCAgICAgICAtIFN0YW5kYXJkIHNwYXJjNjQga2VybmVsJworICBlY2hvICAnICB2bWxpbnV4LmFvdXQgIC0gYS5vdXQga2VybmVsIGZvciBzcGFyYzY0JworICBlY2hvICAnICB0ZnRwYm9vdC5pbWcgLSBpbWFnZSBwcmVwYXJlZCBmb3IgdGZ0cCcKK2VuZGVmCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2Jvb3QvLmdpdGlnbm9yZSBiL2FyY2gvc3BhcmMvYm9vdC8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggNjAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9ib290Ly5naXRpZ25vcmUKcmVuYW1lIHRvIGFyY2gvc3BhcmMvYm9vdC8uZ2l0aWdub3JlCmluZGV4IDM2MzU2ZjkuLmZjNmYzOTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9ib290Ly5naXRpZ25vcmUKKysrIGIvYXJjaC9zcGFyYy9ib290Ly5naXRpZ25vcmUKQEAgLTEsNCArMSw4IEBACitidGZpeC5TCitidGZpeHVwcHJlcAogaW1hZ2UKK3pJbWFnZQogdGZ0cGJvb3QuaW1nCiB2bWxpbnV4LmFvdXQKIHBpZ2d5YmFjaworCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL2Jvb3QvTWFrZWZpbGUKaW5kZXggM2U3N2E5Zi4uOTYwNDFhOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMvYm9vdC9NYWtlZmlsZQpAQCAtNiwxMyArNiwxNiBAQAogUk9PVF9JTUcJOj0gL3Vzci9zcmMvcm9vdC5pbWcKIEVMRlRPQU9VVAk6PSBlbGZ0b2FvdXQKIAotaG9zdHByb2dzLXkJOj0gcGlnZ3liYWNrIGJ0Zml4dXBwcmVwCi10YXJnZXRzCQk6PSB0ZnRwYm9vdC5pbWcgYnRmaXgubyBidGZpeC5TIGltYWdlCitob3N0cHJvZ3MteQk6PSBwaWdneWJhY2tfMzIgcGlnZ3liYWNrXzY0IGJ0Zml4dXBwcmVwCit0YXJnZXRzCQk6PSB0ZnRwYm9vdC5pbWcgYnRmaXgubyBidGZpeC5TIGltYWdlIHpJbWFnZSB2bWxpbnV4LmFvdXQKK2NsZWFuLWZpbGVzCTo9IFN5c3RlbS5tYXAKIAogcXVpZXRfY21kX2VsZnRvYW91dAk9IEVMRlRPQU9VVCAkQAogICAgICAgY21kX2VsZnRvYW91dAk9ICQoRUxGVE9BT1VUKSAkKG9iaikvaW1hZ2UgLW8gJEAKKworaWZlcSAoJChDT05GSUdfU1BBUkMzMikseSkKIHF1aWV0X2NtZF9waWdneQkJPSBQSUdHWSAgICRACi0gICAgICBjbWRfcGlnZ3kJCT0gJChvYmopL3BpZ2d5YmFjayAkQCAkKG9iaikvU3lzdGVtLm1hcCAkKFJPT1RfSU1HKQorICAgICAgY21kX3BpZ2d5CQk9ICQob2JqKS9waWdneWJhY2tfMzIgJEAgJChvYmopL1N5c3RlbS5tYXAgJChST09UX0lNRykKIHF1aWV0X2NtZF9idGZpeAkJPSBCVEZJWCAgICRACiAgICAgICBjbWRfYnRmaXgJCT0gJChPQkpEVU1QKSAteCB2bWxpbnV4IHwgJChvYmopL2J0Zml4dXBwcmVwID4gJEAKIHF1aWV0X2NtZF9zeXNtYXAgICAgICAgID0gU1lTTUFQICAkKG9iaikvU3lzdGVtLm1hcApAQCAtMzcsOCArNDAsOCBAQAogCWVjaG8gJ2NtZF8kQCA6PSAkKGNtZF9pbWFnZSknID4gJChARCkvLiQoQEYpLmNtZAogZW5kZWYKIAotQlRPQkpTIDo9ICQoSEVBRF9ZKSAkKElOSVRfWSkKLUJUTElCUyA6PSAkKENPUkVfWSkgJChMSUJTX1kpICQoRFJJVkVSU19ZKSAkKE5FVF9ZKQorQlRPQkpTIDo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChWTUxJTlVYX0lOSVQpKQorQlRMSUJTIDo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChWTUxJTlVYX01BSU4pKQogTERGTEFHU19pbWFnZSA6PSAtVCBhcmNoL3NwYXJjL2tlcm5lbC92bWxpbnV4LmxkcyAkKEJUT0JKUykgXAogICAgICAgICAgICAgICAgICAgLS1zdGFydC1ncm91cCAkKEJUTElCUykgLS1lbmQtZ3JvdXAgXAogICAgICAgICAgICAgICAgICAgJChrYWxsc3ltcy5vKSAkKG9iaikvYnRmaXgubwpAQCAtNjEsMyArNjQsMjggQEAKIAogJChvYmopL2J0Zml4LlM6ICQob2JqKS9idGZpeHVwcHJlcCB2bWxpbnV4IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsYnRmaXgpCisKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1NQQVJDNjQpLHkpCitxdWlldF9jbWRfcGlnZ3kgICAgID0gUElHR1kgICAkQAorICAgICAgY21kX3BpZ2d5ICAgICA9ICQob2JqKS9waWdneWJhY2tfNjQgJEAgU3lzdGVtLm1hcCAkKFJPT1RfSU1HKQorcXVpZXRfY21kX3N0cmlwICAgICA9IFNUUklQICAgJEAKKyAgICAgIGNtZF9zdHJpcCAgICAgPSAkKFNUUklQKSAtUiAuY29tbWVudCAtUiAubm90ZSAtSyBzdW40dV9pbml0IC1LIF9lbmQgLUsgX3N0YXJ0IHZtbGludXggLW8gJEAKKworCisjIEFjdHVhbCBsaW5raW5nCiskKG9iaikvaW1hZ2U6IHZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxzdHJpcCkKKwlAZWNobyAnICBrZXJuZWw6ICRAIGlzIHJlYWR5JworCiskKG9iaikvdGZ0cGJvb3QuaW1nOiB2bWxpbnV4ICQob2JqKS9waWdneWJhY2tfNjQgU3lzdGVtLm1hcCAkKFJPT1RfSU1HKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGVsZnRvYW91dCkKKwkkKGNhbGwgaWZfY2hhbmdlZCxwaWdneSkKKwlAZWNobyAnICBrZXJuZWw6ICRAIGlzIHJlYWR5JworCiskKG9iaikvdm1saW51eC5hb3V0OiB2bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZWxmdG9hb3V0KQorCUBlY2hvICcgIGtlcm5lbDogJEAgaXMgcmVhZHknCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2Jvb3QvcGlnZ3liYWNrLmMgYi9hcmNoL3NwYXJjL2Jvb3QvcGlnZ3liYWNrXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvYm9vdC9waWdneWJhY2suYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9ib290L3BpZ2d5YmFja18zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvYm9vdC9waWdneWJhY2suYyBiL2FyY2gvc3BhcmMvYm9vdC9waWdneWJhY2tfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2Jvb3QvcGlnZ3liYWNrLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvYm9vdC9waWdneWJhY2tfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9kZWZjb25maWcgYi9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmMzMl9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvZGVmY29uZmlnCnJlbmFtZSB0byBhcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmMzMl9kZWZjb25maWcKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9kZWZjb25maWcgYi9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvc3BhcmMvY29uZmlncy9zcGFyYzY0X2RlZmNvbmZpZwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAyZDI3NjlkLi44OWMyNjBhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTUsOCArMTUsNiBAQAogaGVhZGVyLXkgKz0gc2lnbmFsXzY0LmgKIGhlYWRlci15ICs9IHN0YXRfMzIuaAogaGVhZGVyLXkgKz0gc3RhdF82NC5oCi1oZWFkZXIteSArPSB1bmlzdGRfMzIuaAotaGVhZGVyLXkgKz0gdW5pc3RkXzY0LmgKIAogaGVhZGVyLXkgKz0gYXBjLmgKIGhlYWRlci15ICs9IGFzaS5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2FzbS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUxZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hc20uaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIF9TUEFSQ19BU01fSAorI2RlZmluZSBfU1BBUkNfQVNNX0gKKworLyogTWFjcm9zIHRvIGFzc2lzdCB0aGUgc2hhcmluZyBvZiBhc3NlbWJsZXIgY29kZSBiZXR3ZWVuIDMyLWJpdCBhbmQKKyAqIDY0LWJpdCBzcGFyYy4KKyAqLworCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKyNkZWZpbmUgQlJBTkNIMzIoVFlQRSwgUFJFRElDVCwgREVTVCkgXAorCVRZUEUsUFJFRElDVAklaWNjLCBERVNUCisjZGVmaW5lIEJSQU5DSDMyX0FOTlVMKFRZUEUsIFBSRURJQ1QsIERFU1QpIFwKKwlUWVBFLGEsUFJFRElDVAklaWNjLCBERVNUCisjZGVmaW5lIEJSQU5DSF9SRUdfWkVSTyhQUkVESUNULCBSRUcsIERFU1QpIFwKKwlicnosUFJFRElDVAlSRUcsIERFU1QKKyNkZWZpbmUgQlJBTkNIX1JFR19aRVJPX0FOTlVMKFBSRURJQ1QsIFJFRywgREVTVCkgXAorCWJyeixhLFBSRURJQ1QJUkVHLCBERVNUCisjZGVmaW5lIEJSQU5DSF9SRUdfTk9UX1pFUk8oUFJFRElDVCwgUkVHLCBERVNUKSBcCisJYnJueixQUkVESUNUCVJFRywgREVTVAorI2RlZmluZSBCUkFOQ0hfUkVHX05PVF9aRVJPX0FOTlVMKFBSRURJQ1QsIFJFRywgREVTVCkgXAorCWJybnosYSxQUkVESUNUCVJFRywgREVTVAorI2Vsc2UKKyNkZWZpbmUgQlJBTkNIMzIoVFlQRSwgUFJFRElDVCwgREVTVCkgXAorCVRZUEUJCURFU1QKKyNkZWZpbmUgQlJBTkNIMzJfQU5OVUwoVFlQRSwgUFJFRElDVCwgREVTVCkgXAorCVRZUEUsYQkJREVTVAorI2RlZmluZSBCUkFOQ0hfUkVHX1pFUk8oUFJFRElDVCwgUkVHLCBERVNUKSBcCisJY21wCQlSRUcsIDA7IFwKKwliZQkJREVTVAorI2RlZmluZSBCUkFOQ0hfUkVHX1pFUk9fQU5OVUwoUFJFRElDVCwgUkVHLCBERVNUKSBcCisJY21wCQlSRUcsIDA7IFwKKwliZSxhCQlERVNUCisjZGVmaW5lIEJSQU5DSF9SRUdfTk9UX1pFUk8oUFJFRElDVCwgUkVHLCBERVNUKSBcCisJY21wCQlSRUcsIDA7IFwKKwlibmUJCURFU1QKKyNkZWZpbmUgQlJBTkNIX1JFR19OT1RfWkVST19BTk5VTChQUkVESUNULCBSRUcsIERFU1QpIFwKKwljbXAJCVJFRywgMDsgXAorCWJuZSxhCQlERVNUCisjZW5kaWYKKworI2VuZGlmIC8qIF9TUEFSQ19BU01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKaW5kZXggMmM3MWVjNGEuLjU5ODJjNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaApAQCAtMTEyLDE3ICsxMTIsMTAgQEAKICNkZWZpbmUgYXRvbWljNjRfaW5jX25vdF96ZXJvKHYpIGF0b21pYzY0X2FkZF91bmxlc3MoKHYpLCAxLCAwKQogCiAvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLwotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCW1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQoKTsKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkJbWVtYmFyX3N0b3JlbG9hZF9zdG9yZXN0b3JlKCk7Ci0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKQltZW1iYXJfc3RvcmVsb2FkX2xvYWRsb2FkKCk7Ci0jZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSgpOwotI2Vsc2UKICNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKLSNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljLmg+CiAjZW5kaWYgLyogIShfX0FSQ0hfU1BBUkM2NF9BVE9NSUNfXykgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYml0b3BzXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2JpdG9wc182NC5oCmluZGV4IGJiODdiODAuLmU3MmFjOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYml0b3BzXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9iaXRvcHNfNjQuaApAQCAtMjMsMTMgKzIzLDggQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9ub24tYXRvbWljLmg+CiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCW1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSgpCi0jZWxzZQogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKLSNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2Zmei5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9fX2Zmcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAppbmRleCAxMDlhZTI0Li5iYWZlNWE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaApAQCAtMjcxMyw2ICsyNzEzLDMwIEBACiAgKi8KICNkZWZpbmUgSFZfRkFTVF9TRVRfUEVSRlJFRwkJMHgxMDEKIAorI2RlZmluZSBIVl9OMl9QRVJGX1NQQVJDX0NUTAkJMHgwCisjZGVmaW5lIEhWX04yX1BFUkZfRFJBTV9DVEwwCQkweDEKKyNkZWZpbmUgSFZfTjJfUEVSRl9EUkFNX0NOVDAJCTB4MgorI2RlZmluZSBIVl9OMl9QRVJGX0RSQU1fQ1RMMQkJMHgzCisjZGVmaW5lIEhWX04yX1BFUkZfRFJBTV9DTlQxCQkweDQKKyNkZWZpbmUgSFZfTjJfUEVSRl9EUkFNX0NUTDIJCTB4NQorI2RlZmluZSBIVl9OMl9QRVJGX0RSQU1fQ05UMgkJMHg2CisjZGVmaW5lIEhWX04yX1BFUkZfRFJBTV9DVEwzCQkweDcKKyNkZWZpbmUgSFZfTjJfUEVSRl9EUkFNX0NOVDMJCTB4OAorCisjZGVmaW5lIEhWX0ZBU1RfTjJfR0VUX1BFUkZSRUcJCTB4MTA0CisjZGVmaW5lIEhWX0ZBU1RfTjJfU0VUX1BFUkZSRUcJCTB4MTA1CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBzdW40dl9uaWFnYXJhX2dldHBlcmYodW5zaWduZWQgbG9uZyByZWcsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnZhbCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzdW40dl9uaWFnYXJhX3NldHBlcmYodW5zaWduZWQgbG9uZyByZWcsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN1bjR2X25pYWdhcmEyX2dldHBlcmYodW5zaWduZWQgbG9uZyByZWcsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nICp2YWwpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3VuNHZfbmlhZ2FyYTJfc2V0cGVyZih1bnNpZ25lZCBsb25nIHJlZywKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFsKTsKKyNlbmRpZgorCiAvKiBNTVUgc3RhdGlzdGljcyBzZXJ2aWNlcy4KICAqCiAgKiBUaGUgaHlwZXJ2aXNvciBtYWludGFpbnMgTU1VIHN0YXRpc3RpY3MgYW5kIHByaXZpbGVnZWQgY29kZSBwcm92aWRlcwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxXzMyLmgKaW5kZXggZmUyMDVjYy4uZWE0MzA1NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycV8zMi5oCkBAIC0xMiw0ICsxMiw1IEBACiAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpCShpcnEpCiAKK2V4dGVybiB2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxXzY0LmgKaW5kZXggNzE2NzNlYy4uZDQ3ZDRhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycV82NC5oCkBAIC02Niw2ICs2Niw5IEBACiBleHRlcm4gdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCk7CiBleHRlcm4gdm9pZCBmaXh1cF9pcnFzKHZvaWQpOwogCitleHRlcm4gaW50IHJlZ2lzdGVyX3BlcmZjdHJfaW50cih2b2lkICgqaGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9wZXJmY3RyX2ludHIodm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopKTsKKwogc3RhdGljIGlubGluZSB2b2lkIHNldF9zb2Z0aW50KHVuc2lnbmVkIGxvbmcgYml0cykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3IJJTAsIDB4MCwgJSVzZXRfc29mdGludCIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3NfNjQuaAppbmRleCBiYjQyZTU5Li44YjQ5YmY5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFmbGFnc182NC5oCkBAIC0xMCw2ICsxMCw4IEBACiAjaWZuZGVmIF9BU01fSVJRRkxBR1NfSAogI2RlZmluZSBfQVNNX0lSUUZMQUdTX0gKIAorI2luY2x1ZGUgPGFzbS9waWwuaD4KKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKQEAgLTQwLDkgKzQyLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIndycHIJMTUsICUlcGlsIgorCQkid3JwcgklMCwgJSVwaWwiCiAJCTogLyogbm8gb3V0cHV0cyAqLwotCQk6IC8qIG5vIGlucHV0cyAqLworCQk6ICJpIiAoUElMX05PUk1BTF9NQVgpCiAJCTogIm1lbW9yeSIKIAkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggZTgyY2Y5YS4uZmY4ZTAyZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb2R1bGUuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0xLDggKzEsMjQgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX01PRFVMRV9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19NT0RVTEVfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL21vZHVsZV82NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vbW9kdWxlXzMyLmg+Ci0jZW5kaWYKLSNlbmRpZgorI2lmbmRlZiBfX1NQQVJDX01PRFVMRV9ICisjZGVmaW5lIF9fU1BBUkNfTU9EVUxFX0gKK3N0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYyB7IH07CisKKy8qCisgKiBVc2Ugc29tZSBwcmVwcm9jZXNzb3IgbWFnaWMgdG8gZGVmaW5lIHRoZSBjb3JyZWN0IHN5bWJvbAorICogZm9yIHNwYXJjMzIgYW5kIHNwYXJjNjQuCisgKiBFbGZfQWRkciBiZWNvbWVzIEVsZjMyX0FkZHIgZm9yIHNwYXJjMzIgYW5kIEVsZjY0X0FkZHIgZm9yIHNwYXJjNjQKKyAqLworI2RlZmluZSBfX19FTEYoYSwgYiwgYykgYSMjYiMjYworI2RlZmluZSBfX0VMRihhLCBiLCBjKSAgX19fRUxGKGEsIGIsIGMpCisjZGVmaW5lICBfRWxmKHQpICAgICAgICBfX0VMRihFbGYsIENPTkZJR19CSVRTLCB0KQorI2RlZmluZSAgX0VMRih0KSAgICAgICAgX19FTEYoRUxGLCBDT05GSUdfQklUUywgdCkKKworI2RlZmluZSBFbGZfU2hkciAgICAgX0VsZihfU2hkcikKKyNkZWZpbmUgRWxmX1N5bSAgICAgIF9FbGYoX1N5bSkKKyNkZWZpbmUgRWxmX0VoZHIgICAgIF9FbGYoX0VoZHIpCisjZGVmaW5lIEVsZl9SZWxhICAgICBfRWxmKF9SZWxhKQorI2RlZmluZSBFbGZfQWRkciAgICAgX0VsZihfQWRkcikKKworI2RlZmluZSBFTEZfUl9TWU0gICAgX0VMRihfUl9TWU0pCisjZGVmaW5lIEVMRl9SX1RZUEUgICBfRUxGKF9SX1RZUEUpCisKKyNlbmRpZiAvKiBfX1NQQVJDX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vZHVsZV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb2R1bGVfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkOWU2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vZHVsZV8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9BU01fU1BBUkNfTU9EVUxFX0gKLSNkZWZpbmUgX0FTTV9TUEFSQ19NT0RVTEVfSAotc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljIHsgfTsKLSNkZWZpbmUgRWxmX1NoZHIgRWxmMzJfU2hkcgotI2RlZmluZSBFbGZfU3ltIEVsZjMyX1N5bQotI2RlZmluZSBFbGZfRWhkciBFbGYzMl9FaGRyCi0jZW5kaWYgLyogX0FTTV9TUEFSQ19NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb2R1bGVfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW9kdWxlXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzdiYTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb2R1bGVfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NQQVJDNjRfTU9EVUxFX0gKLSNkZWZpbmUgX0FTTV9TUEFSQzY0X01PRFVMRV9ICi1zdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMgeyB9OwotI2RlZmluZSBFbGZfU2hkciBFbGY2NF9TaGRyCi0jZGVmaW5lIEVsZl9TeW0gRWxmNjRfU3ltCi0jZGVmaW5lIEVsZl9FaGRyIEVsZjY0X0VoZHIKLSNlbmRpZiAvKiBfQVNNX1NQQVJDNjRfTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fMzIuaAppbmRleCA4YjE2NDlmLi44NzVkYTM1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wZW5wcm9tXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbV8zMi5oCkBAIC0xNzAsOSArMTcwLDkgQEAKIHN0cnVjdCBsaW51eF9ub2Rlb3BzIHsKIAlpbnQgKCpub19uZXh0bm9kZSkoaW50IG5vZGUpOwogCWludCAoKm5vX2NoaWxkKShpbnQgbm9kZSk7Ci0JaW50ICgqbm9fcHJvcGxlbikoaW50IG5vZGUsIGNoYXIgKm5hbWUpOwotCWludCAoKm5vX2dldHByb3ApKGludCBub2RlLCBjaGFyICpuYW1lLCBjaGFyICp2YWwpOwotCWludCAoKm5vX3NldHByb3ApKGludCBub2RlLCBjaGFyICpuYW1lLCBjaGFyICp2YWwsIGludCBsZW4pOworCWludCAoKm5vX3Byb3BsZW4pKGludCBub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKKwlpbnQgKCpub19nZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsKTsKKwlpbnQgKCpub19zZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsLCBpbnQgbGVuKTsKIAljaGFyICogKCpub19uZXh0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUpOwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGxpYl8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGxpYl8zMi5oCmluZGV4IDY5OWRhMDUuLjczZDQ1NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BsaWJfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzMyLmgKQEAgLTEzNiw3ICsxMzYsNyBAQAogZXh0ZXJuIHZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgY2hhcmFjdGVyKTsKIAogLyogUHJvbSdzIGludGVybmFsIHJvdXRpbmVzLCBkb24ndCB1c2UgaW4ga2VybmVsL2Jvb3QgY29kZS4gKi8KLWV4dGVybiB2b2lkIHByb21fcHJpbnRmKGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiB2b2lkIHByb21fcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIHByb21fd3JpdGUoY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogLyogTXVsdGlwcm9jZXNzb3Igb3BlcmF0aW9ucy4uLiAqLwpAQCAtMTk5LDEyICsxOTksMTIgQEAKIC8qIEdldCB0aGUgbGVuZ3RoLCBhdCB0aGUgcGFzc2VkIG5vZGUsIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSB0eXBlLgogICogUmV0dXJucyAtMSBvbiBlcnJvciAoaWUuIG5vIHN1Y2ggcHJvcGVydHkgYXQgdGhpcyBub2RlKS4KICAqLwotZXh0ZXJuIGludCBwcm9tX2dldHByb3BsZW4oaW50IHRoaXNub2RlLCBjaGFyICpwcm9wZXJ0eSk7CitleHRlcm4gaW50IHByb21fZ2V0cHJvcGxlbihpbnQgdGhpc25vZGUsIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKIAogLyogRmV0Y2ggdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSB1c2luZyB0aGUgZ2l2ZW4gYnVmZmVyLiAgUmV0dXJucwogICogdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJvbSBwdXQgaW50byB5b3VyIGJ1ZmZlciBvciAtMSBvbiBlcnJvci4KICAqLwotZXh0ZXJuIGludCBfX211c3RfY2hlY2sgcHJvbV9nZXRwcm9wZXJ0eShpbnQgdGhpc25vZGUsIGNoYXIgKnByb3BlcnR5LAorZXh0ZXJuIGludCBfX211c3RfY2hlY2sgcHJvbV9nZXRwcm9wZXJ0eShpbnQgdGhpc25vZGUsIGNvbnN0IGNoYXIgKnByb3BlcnR5LAogCQkJCQkgY2hhciAqcHJvcF9idWZmZXIsIGludCBwcm9wYnVmX3NpemUpOwogCiAvKiBBY3F1aXJlIGFuIGludGVnZXIgcHJvcGVydHkuICovCkBAIC0yNDYsNyArMjQ2LDcgQEAKIC8qIFNldCB0aGUgaW5kaWNhdGVkIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBub2RlIHdpdGggdGhlIHBhc3NlZCB2YWx1ZS4KICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB5b3VyIHZhbHVlIHRoYXQgdGhlIHByb20gdG9vay4KICAqLwotZXh0ZXJuIGludCBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNoYXIgKnByb3BfbmFtZSwgY2hhciAqcHJvcF92YWx1ZSwKK2V4dGVybiBpbnQgcHJvbV9zZXRwcm9wKGludCBub2RlLCBjb25zdCBjaGFyICpwcm9wX25hbWUsIGNoYXIgKnByb3BfdmFsdWUsCiAJCQlpbnQgdmFsdWVfc2l6ZSk7CiAKIGV4dGVybiBpbnQgcHJvbV9wYXRodG9pbm9kZShjaGFyICpwYXRoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGlsLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BpbC5oCmluZGV4IDcxODE5YmIuLmQ1NzM4MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGlsLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9waWwuaApAQCAtMTAsNyArMTAsMTIgQEAKICAqCiAgKiBJbiBmYWN0IGFueSBYQ0FMTCB3aGljaCBoYXMgdG8gZXRyYXAvcnRyYXAgaGFzIGEgcHJvYmxlbSBiZWNhdXNlCiAgKiBpdCBpcyBkaWZmaWN1bHQgdG8gcHJldmVudCBydHJhcCBmcm9tIHJ1bm5pbmcgQkgncywgYW5kIHRoYXQgd291bGQKLSAqIG5lZWQgdG8gYmUgZG9uZSBpZiB0aGUgWENBTEwgYXJyaXZlZCB3aGlsZSAlcGlsPT0xNS4KKyAqIG5lZWQgdG8gYmUgZG9uZSBpZiB0aGUgWENBTEwgYXJyaXZlZCB3aGlsZSAlcGlsPT1QSUxfTk9STUFMX01BWC4KKyAqCisgKiBGaW5hbGx5LCBpbiBvcmRlciB0byBoYW5kbGUgcHJvZmlsaW5nIGV2ZW50cyBldmVuIHdoZW4gYQorICogbG9jYWxfaXJxX2Rpc2FibGUoKSBpcyBpbiBwcm9ncmVzcywgd2Ugb25seSBkaXNhYmxlIHVwIHRvIGxldmVsIDE0CisgKiBpbnRlcnJ1cHRzLiAgUHJvZmlsZSBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdHMgYXJyaXZlIGF0IGxldmVsCisgKiAxNS4KICAqLwogI2RlZmluZSBQSUxfU01QX0NBTExfRlVOQwkxCiAjZGVmaW5lIFBJTF9TTVBfUkVDRUlWRV9TSUdOQUwJMgpAQCAtMTgsNSArMjMsNyBAQAogI2RlZmluZSBQSUxfU01QX0NUWF9ORVdfVkVSU0lPTgk0CiAjZGVmaW5lIFBJTF9ERVZJQ0VfSVJRCQk1CiAjZGVmaW5lIFBJTF9TTVBfQ0FMTF9GVU5DX1NOR0wJNgorI2RlZmluZSBQSUxfTk9STUFMX01BWAkJMTQKKyNkZWZpbmUgUElMX05NSQkJCTE1CiAKICNlbmRpZiAvKiAhKF9TUEFSQzY0X1BJTF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCmluZGV4IGVjMjFhNDUuLmU1ODBmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKQEAgLTEsOCArMSwyNyBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU0NBVFRFUkxJU1RfSAotI2RlZmluZSBfX19BU01fU1BBUkNfU0NBVFRFUkxJU1RfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0XzY0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdF8zMi5oPgorI2lmbmRlZiBfU1BBUkNfU0NBVFRFUkxJU1RfSAorI2RlZmluZSBfU1BBUkNfU0NBVFRFUkxJU1RfSAorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworc3RydWN0IHNjYXR0ZXJsaXN0IHsKKyNpZmRlZiBDT05GSUdfREVCVUdfU0cKKwl1bnNpZ25lZCBsb25nCXNnX21hZ2ljOwogI2VuZGlmCi0jZW5kaWYKKwl1bnNpZ25lZCBsb25nCXBhZ2VfbGluazsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0OworCisJdW5zaWduZWQgaW50CWxlbmd0aDsKKworCWRtYV9hZGRyX3QJZG1hX2FkZHJlc3M7CisJX191MzIJCWRtYV9sZW5ndGg7Cit9OworCisjZGVmaW5lIHNnX2RtYV9hZGRyZXNzKHNnKQkoKHNnKS0+ZG1hX2FkZHJlc3MpCisjZGVmaW5lIHNnX2RtYV9sZW4oc2cpICAgICAJKChzZyktPmRtYV9sZW5ndGgpCisKKyNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQJKH4wVUwpCisKKyNkZWZpbmUgQVJDSF9IQVNfU0dfQ0hBSU4KKworI2VuZGlmIC8qICEoX1NQQVJDX1NDQVRURVJMSVNUX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0XzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0XzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjYwOWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdF8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkNfU0NBVFRFUkxJU1RfSAotI2RlZmluZSBfU1BBUkNfU0NBVFRFUkxJU1RfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IHNjYXR0ZXJsaXN0IHsKLSNpZmRlZiBDT05GSUdfREVCVUdfU0cKLQl1bnNpZ25lZCBsb25nIHNnX21hZ2ljOwotI2VuZGlmCi0JdW5zaWduZWQgbG9uZyBwYWdlX2xpbms7Ci0JdW5zaWduZWQgaW50IG9mZnNldDsKLQotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLQlfX3UzMiBkdm1hX2FkZHJlc3M7IC8qIEEgcGxhY2UgdG8gaGFuZyBob3N0LXNwZWNpZmljIGFkZHJlc3NlcyBhdC4gKi8KLQlfX3UzMiBkdm1hX2xlbmd0aDsKLX07Ci0KLSNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpICgoc2cpLT5kdm1hX2FkZHJlc3MpCi0jZGVmaW5lIHNnX2RtYV9sZW4oc2cpICAgICAoKHNnKS0+ZHZtYV9sZW5ndGgpCi0KLSNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQgKH4wVUwpCi0KLSNkZWZpbmUgQVJDSF9IQVNfU0dfQ0hBSU4KLQotI2VuZGlmIC8qICEoX1NQQVJDX1NDQVRURVJMSVNUX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0XzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYmQwNTguLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdF82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9TQ0FUVEVSTElTVF9ICi0jZGVmaW5lIF9TUEFSQzY0X1NDQVRURVJMSVNUX0gKLQotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLXN0cnVjdCBzY2F0dGVybGlzdCB7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1NHCi0JdW5zaWduZWQgbG9uZwlzZ19tYWdpYzsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcJcGFnZV9saW5rOwotCXVuc2lnbmVkIGludAlvZmZzZXQ7Ci0KLQl1bnNpZ25lZCBpbnQJbGVuZ3RoOwotCi0JZG1hX2FkZHJfdAlkbWFfYWRkcmVzczsKLQlfX3UzMgkJZG1hX2xlbmd0aDsKLX07Ci0KLSNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpCSgoc2cpLT5kbWFfYWRkcmVzcykKLSNkZWZpbmUgc2dfZG1hX2xlbihzZykgICAgIAkoKHNnKS0+ZG1hX2xlbmd0aCkKLQotI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRAkofjBVTCkKLQotI2RlZmluZSBBUkNIX0hBU19TR19DSEFJTgotCi0jZW5kaWYgLyogIShfU1BBUkM2NF9TQ0FUVEVSTElTVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCmluZGV4IGM3YzY5YjAuLjBiMDU1M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKQEAgLTEsOCArMSwxMCBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU0VDVElPTlNfSAotI2RlZmluZSBfX19BU01fU1BBUkNfU0VDVElPTlNfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zXzY0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9zZWN0aW9uc18zMi5oPgotI2VuZGlmCisjaWZuZGVmIF9fU1BBUkNfU0VDVElPTlNfSAorI2RlZmluZSBfX1NQQVJDX1NFQ1RJT05TX0gKKworLyogbm90aGluZyB0byBzZWUsIG1vdmUgYWxvbmcgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorCisvKiBzcGFyYyBlbnRyeSBwb2ludCAqLworZXh0ZXJuIGNoYXIgX3N0YXJ0W107CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zZWN0aW9uc18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zZWN0aW9uc18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODMyODQxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2VjdGlvbnNfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkNfU0VDVElPTlNfSAotI2RlZmluZSBfU1BBUkNfU0VDVElPTlNfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NlY3Rpb25zXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NlY3Rpb25zXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGI5ZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zZWN0aW9uc182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9TUEFSQzY0X1NFQ1RJT05TX0gKLSNkZWZpbmUgX1NQQVJDNjRfU0VDVElPTlNfSAotCi0vKiBub3RoaW5nIHRvIHNlZSwgbW92ZSBhbG9uZyAqLwotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+Ci0KLWV4dGVybiBjaGFyIF9zdGFydFtdOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpbmxvY2tfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpbmxvY2tfNjQuaAppbmRleCAxMjBjZmU0Li5jNGQyNzRkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NwaW5sb2NrXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGlubG9ja182NC5oCkBAIC0xMywxNyArMTMsMTIgQEAKICAqIGFuZCByZWJ1aWxkIHlvdXIga2VybmVsLgogICovCiAKLS8qIEFsbCBvZiB0aGVzZSBsb2NraW5nIHByaW1pdGl2ZXMgYXJlIGV4cGVjdGVkIHRvIHdvcmsgcHJvcGVybHkKLSAqIGV2ZW4gaW4gYW4gUk1PIG1lbW9yeSBtb2RlbCwgd2hpY2ggY3VycmVudGx5IGlzIHdoYXQgdGhlIGtlcm5lbAotICogcnVucyBpbi4KLSAqCi0gKiBUaGVyZSBpcyBhbm90aGVyIGlzc3VlLiAgQmVjYXVzZSB3ZSBwbGF5IGdhbWVzIHRvIHNhdmUgY3ljbGVzCi0gKiBpbiB0aGUgbm9uLWNvbnRlbnRpb24gY2FzZSwgd2UgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGFib3V0Ci0gKiBicmFuY2ggdGFyZ2V0cyBpbnRvIHRoZSAic3Bpbm5pbmciIGNvZGUuICBUaGV5IGxpdmUgaW4gdGhlaXIKLSAqIG93biBzZWN0aW9uLCBidXQgdGhlIG5ld2VyIFY5IGJyYW5jaGVzIGhhdmUgYSBzaG9ydGVyIHJhbmdlCi0gKiB0aGFuIHRoZSB0cmFkaXRpb25hbCAzMi1iaXQgc3BhcmMgYnJhbmNoIHZhcmlhbnRzLiAgVGhlIHJ1bGUKLSAqIGlzIHRoYXQgdGhlIGJyYW5jaGVzIHRoYXQgZ28gaW50byBhbmQgb3V0IG9mIHRoZSBzcGlubmVyIHNlY3Rpb25zCi0gKiBtdXN0IGJlIHByZS1WOSBicmFuY2hlcy4KKy8qIEJlY2F1c2Ugd2UgcGxheSBnYW1lcyB0byBzYXZlIGN5Y2xlcyBpbiB0aGUgbm9uLWNvbnRlbnRpb24gY2FzZSwgd2UKKyAqIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bCBhYm91dCBicmFuY2ggdGFyZ2V0cyBpbnRvIHRoZSAic3Bpbm5pbmciCisgKiBjb2RlLiAgVGhleSBsaXZlIGluIHRoZWlyIG93biBzZWN0aW9uLCBidXQgdGhlIG5ld2VyIFY5IGJyYW5jaGVzCisgKiBoYXZlIGEgc2hvcnRlciByYW5nZSB0aGFuIHRoZSB0cmFkaXRpb25hbCAzMi1iaXQgc3BhcmMgYnJhbmNoCisgKiB2YXJpYW50cy4gIFRoZSBydWxlIGlzIHRoYXQgdGhlIGJyYW5jaGVzIHRoYXQgZ28gaW50byBhbmQgb3V0IG9mCisgKiB0aGUgc3Bpbm5lciBzZWN0aW9ucyBtdXN0IGJlIHByZS1WOSBicmFuY2hlcy4KICAqLwogCiAjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKGxwKQkoKGxwKS0+bG9jayAhPSAwKQpAQCAtMzgsMTIgKzMzLDEwIEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIxOglsZHN0dWIJCVslMV0sICUwXG4iCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJybnoscG4JCSUwLCAyZlxuIgogIgkgbm9wXG4iCiAiCS5zdWJzZWN0aW9uCTJcbiIKICIyOglsZHViCQlbJTFdLCAlMFxuIgotIgltZW1iYXIJCSNMb2FkTG9hZFxuIgogIglicm56LHB0CQklMCwgMmJcbiIKICIJIG5vcFxuIgogIgliYSxhLHB0CQklJXhjYywgMWJcbiIKQEAgLTU5LDcgKzUyLDYgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogIglsZHN0dWIJCVslMV0sICUwXG4iCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgogCTogIj1yIiAocmVzdWx0KQogCTogInIiIChsb2NrKQogCTogIm1lbW9yeSIpOwpAQCAtNzAsNyArNjIsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJCSNTdG9yZVN0b3JlIHwgI0xvYWRTdG9yZVxuIgogIglzdGIJCSUlZzAsIFslMF0iCiAJOiAvKiBObyBvdXRwdXRzICovCiAJOiAiciIgKGxvY2spCkBAIC04MywxNCArNzQsMTIgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogIjE6CWxkc3R1YgkJWyUyXSwgJTBcbiIKLSIJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJYnJueixwbgkJJTAsIDJmXG4iCiAiCSBub3BcbiIKICIJLnN1YnNlY3Rpb24JMlxuIgogIjI6CXJkcHIJCSUlcGlsLCAlMVxuIgogIgl3cnByCQklMywgJSVwaWxcbiIKICIzOglsZHViCQlbJTJdLCAlMFxuIgotIgltZW1iYXIJCSNMb2FkTG9hZFxuIgogIglicm56LHB0CQklMCwgM2JcbiIKICIJIG5vcFxuIgogIgliYSxwdAkJJSV4Y2MsIDFiXG4iCkBAIC0xMTMsMTIgKzEwMiwxMCBAQAogIjQ6CSBhZGQJCSUwLCAxLCAlMVxuIgogIgljYXMJCVslMl0sICUwLCAlMVxuIgogIgljbXAJCSUwLCAlMVxuIgotIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JCSUlaWNjLCAxYlxuIgogIgkgbm9wXG4iCiAiCS5zdWJzZWN0aW9uCTJcbiIKICIyOglsZHN3CQlbJTJdLCAlMFxuIgotIgltZW1iYXIJCSNMb2FkTG9hZFxuIgogIglicmx6LHB0CQklMCwgMmJcbiIKICIJIG5vcFxuIgogIgliYSxhLHB0CQklJXhjYywgNGJcbiIKQEAgLTEzOSw3ICsxMjYsNiBAQAogIglhZGQJCSUwLCAxLCAlMVxuIgogIgljYXMJCVslMl0sICUwLCAlMVxuIgogIgljbXAJCSUwLCAlMVxuIgotIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JCSUlaWNjLCAxYlxuIgogIgkgbW92CQkxLCAlMFxuIgogIjI6IgpAQCAtMTU1LDcgKzE0MSw2IEBACiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCW1lbWJhcgkjU3RvcmVMb2FkIHwgI0xvYWRMb2FkXG4iCiAiMToJbGR1dwlbJTJdLCAlMFxuIgogIglzdWIJJTAsIDEsICUxXG4iCiAiCWNhcwlbJTJdLCAlMCwgJTFcbiIKQEAgLTE3OSwxMiArMTY0LDEwIEBACiAiNDoJIG9yCQklMCwgJTMsICUxXG4iCiAiCWNhcwkJWyUyXSwgJTAsICUxXG4iCiAiCWNtcAkJJTAsICUxXG4iCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJuZSxwbgkJJSVpY2MsIDFiXG4iCiAiCSBub3BcbiIKICIJLnN1YnNlY3Rpb24JMlxuIgogIjI6CWxkdXcJCVslMl0sICUwXG4iCi0iCW1lbWJhcgkJI0xvYWRMb2FkXG4iCiAiCWJybnoscHQJCSUwLCAyYlxuIgogIgkgbm9wXG4iCiAiCWJhLGEscHQJCSUleGNjLCA0YlxuIgpAQCAtMTk3LDcgKzE4MCw2IEBACiBzdGF0aWMgdm9pZCBpbmxpbmUgX193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpsb2NrKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJCSNMb2FkU3RvcmUgfCAjU3RvcmVTdG9yZVxuIgogIglzdHcJCSUlZzAsIFslMF0iCiAJOiAvKiBubyBvdXRwdXRzICovCiAJOiAiciIgKGxvY2spCkBAIC0yMTcsNyArMTk5LDYgQEAKICIJIG9yCQklMCwgJTQsICUxXG4iCiAiCWNhcwkJWyUzXSwgJTAsICUxXG4iCiAiCWNtcAkJJTAsICUxXG4iCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJuZSxwbgkJJSVpY2MsIDFiXG4iCiAiCSBub3BcbiIKICIJbW92CQkxLCAlMlxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGl0ZmlyZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGl0ZmlyZS5oCmluZGV4IDk4NWVhN2UuLmYwZDBjNDBjNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGl0ZmlyZS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpdGZpcmUuaApAQCAtNiw2ICs2LDggQEAKICNpZm5kZWYgX1NQQVJDNjRfU1BJVEZJUkVfSAogI2RlZmluZSBfU1BBUkM2NF9TUElURklSRV9ICiAKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogCiAvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIGFkZHJlc3NlcyBhcmUgYWNjZXNzaWJsZSB2aWEgQVNJX0RNTVUKQEAgLTMzOCw1ICszNDAsNSBAQAogfQogCiAjZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KKyNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLwogI2VuZGlmIC8qICEoX1NQQVJDNjRfU1BJVEZJUkVfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCmluZGV4IDg2MjNmYzQuLjc5YzFhZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaApAQCAtMTUsNiArMTUsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHByb2JlX2lycV9tYXNrKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXJldHVybiAwOworfQorCiAvKgogICogU3BhcmMgKGdlbmVyYWwpIENQVSB0eXBlcwogICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaAppbmRleCA4NzU5ZjJhLi42YzA3NzgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKQEAgLTU5LDIwICs1OSw5IEBACiAJCQkgICAgIDogOiA6ICJtZW1vcnkiKTsgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBtYigpCVwKLQltZW1iYXJfc2FmZSgiI0xvYWRMb2FkIHwgI0xvYWRTdG9yZSB8ICNTdG9yZVN0b3JlIHwgI1N0b3JlTG9hZCIpCi0jZGVmaW5lIHJtYigpCVwKLQltZW1iYXJfc2FmZSgiI0xvYWRMb2FkIikKLSNkZWZpbmUgd21iKCkJXAotCW1lbWJhcl9zYWZlKCIjU3RvcmVTdG9yZSIpCi0jZGVmaW5lIG1lbWJhcl9zdG9yZWxvYWQoKSBcCi0JbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQiKQotI2RlZmluZSBtZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKSBcCi0JbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZSIpCi0jZGVmaW5lIG1lbWJhcl9zdG9yZWxvYWRfbG9hZGxvYWQoKSBcCi0JbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQgfCAjTG9hZExvYWQiKQotI2RlZmluZSBtZW1iYXJfc3RvcmVzdG9yZV9sb2Fkc3RvcmUoKSBcCi0JbWVtYmFyX3NhZmUoIiNTdG9yZVN0b3JlIHwgI0xvYWRTdG9yZSIpCisjZGVmaW5lIG1iKCkJbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQiKQorI2RlZmluZSBybWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiJtZW1vcnkiKQorI2RlZmluZSB3bWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiJtZW1vcnkiKQogCiAjZW5kaWYKIApAQCAtODAsMjAgKzY5LDIwIEBACiAKICNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIHNldF9tYihfX3ZhciwgX192YWx1ZSkgXAotCWRvIHsgX192YXIgPSBfX3ZhbHVlOyBtZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKTsgfSB3aGlsZSgwKQorCWRvIHsgX192YXIgPSBfX3ZhbHVlOyBtZW1iYXJfc2FmZSgiI1N0b3JlTG9hZCIpOyB9IHdoaWxlKDApCiAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHNtcF9tYigpCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCXJtYigpCiAjZGVmaW5lIHNtcF93bWIoKQl3bWIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCiAjZWxzZQogI2RlZmluZSBzbXBfbWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiJtZW1vcnkiKQogI2RlZmluZSBzbXBfcm1iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6OjoibWVtb3J5IikKICNkZWZpbmUgc21wX3dtYigpCV9fYXNtX18gX192b2xhdGlsZV9fKCIiOjo6Im1lbW9yeSIpCi0jZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlKDApCisKICNkZWZpbmUgZmx1c2hpKGFkZHIpCV9fYXNtX18gX192b2xhdGlsZV9fICgiZmx1c2ggJTAiIDogOiAiciIgKGFkZHIpIDogIm1lbW9yeSIpCiAKICNkZWZpbmUgZmx1c2h3X2FsbCgpCV9fYXNtX18gX192b2xhdGlsZV9fKCJmbHVzaHciKQpAQCAtMTA3LDExICs5NiwxMiBAQAogICogYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYzpzbXBfcGVyY3B1X3RpbWVyX2ludGVycnVwdCgpCiAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqLwotI2RlZmluZSByZXNldF9waWMoKSAgICAJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImJhLHB0CSV4Y2MsIDk5ZlxuXHQiCQlcCisjZGVmaW5lIHdyaXRlX3BpYyhfX3ApICAJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYmEscHQJJSV4Y2MsIDk5ZlxuXHQiCQlcCiAJCQkgICAgICIuYWxpZ24JNjRcbiIJCQlcCi0JCQkgICI5OTp3cgklZzAsIDB4MCwgJXBpY1xuXHQiCVwKLQkJCSAgICAgInJkCSVwaWMsICVnMCIpCisJCQkgICI5OTp3cgklMCwgMHgwLCAlJXBpY1xuXHQiCVwKKwkJCSAgICAgInJkCSUlcGljLCAlJWcwIiA6IDogInIiIChfX3ApKQorI2RlZmluZSByZXNldF9waWMoKQl3cml0ZV9waWMoMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtMTcwLDYgKzE2MCw3IEBACiAJInN0YgklJW81LCBbJSVnNiArICU1XVxuXHQiCQkJCQlcCiAJInJkcHIJJSVjd3AsICUlbzVcblx0IgkJCQkJXAogCSJzdGIJJSVvNSwgWyUlZzYgKyAlOF1cblx0IgkJCQkJXAorCSJ3cnByCSUlZzAsIDE1LCAlJXBpbFxuXHQiCQkJCQlcCiAJIm1vdgklNCwgJSVnNlxuXHQiCQkJCQkJXAogCSJsZHViCVslNCArICU4XSwgJSVnMVxuXHQiCQkJCQlcCiAJIndycHIJJSVnMSwgJSVjd3Bcblx0IgkJCQkJXApAQCAtMTgwLDYgKzE3MSw3IEBACiAJImxkeAlbJSVzcCArIDIwNDcgKyAweDcwXSwgJSVpNlxuXHQiCQkJCVwKIAkibGR4CVslJXNwICsgMjA0NyArIDB4NzhdLCAlJWk3XG5cdCIJCQkJXAogCSJsZHgJWyUlZzYgKyAlOV0sICUlZzRcblx0IgkJCQkJXAorCSJ3cnByCSUlZzAsIDE0LCAlJXBpbFxuXHQiCQkJCQlcCiAJImJyeixwdCAlJW83LCBzd2l0Y2hfdG9fcGNcblx0IgkJCQkJXAogCSIgbW92CSUlZzcsICUwXG5cdCIJCQkJCQlcCiAJInNldGhpCSUlaGkocmV0X2Zyb21fc3lzY2FsbCksICUlZzFcblx0IgkJCVwKQEAgLTIwOSwxNCArMjAxLDEyIEBACiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgogIgltb3YJCSUwLCAlMVxuIgogIjE6CWxkdXcJCVslNF0sICUyXG4iCiAiCWNhcwkJWyU0XSwgJTIsICUwXG4iCiAiCWNtcAkJJTIsICUwXG4iCiAiCWJuZSxhLHBuCSUlaWNjLCAxYlxuIgogIgkgbW92CQklMSwgJTBcbiIKLSIJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKIAk6ICI9JnIiICh2YWwpLCAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKQogCTogIjAiICh2YWwpLCAiciIgKG0pCiAJOiAiY2MiLCAibWVtb3J5Iik7CkBAIC0yMjgsMTQgKzIxOCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAotIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjTG9hZExvYWRcbiIKICIJbW92CQklMCwgJTFcbiIKICIxOglsZHgJCVslNF0sICUyXG4iCiAiCWNhc3gJCVslNF0sICUyLCAlMFxuIgogIgljbXAJCSUyLCAlMFxuIgogIglibmUsYSxwbgklJXhjYywgMWJcbiIKICIJIG1vdgkJJTEsICUwXG4iCi0iCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAJOiAiPSZyIiAodmFsKSwgIj0mciIgKHRtcDEpLCAiPSZyIiAodG1wMikKIAk6ICIwIiAodmFsKSwgInIiIChtKQogCTogImNjIiwgIm1lbW9yeSIpOwpAQCAtMjcyLDkgKzI2MCw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY21weGNoZ191MzIodm9sYXRpbGUgaW50ICptLCBpbnQgb2xkLCBpbnQgbmV3KQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZFxuIgotCQkJICAgICAiY2FzIFslMl0sICUzLCAlMFxuXHQiCi0JCQkgICAgICJtZW1iYXIgI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgorCV9fYXNtX18gX192b2xhdGlsZV9fKCJjYXMgWyUyXSwgJTMsICUwIgogCQkJICAgICA6ICI9JnIiIChuZXcpCiAJCQkgICAgIDogIjAiIChuZXcpLCAiciIgKG0pLCAiciIgKG9sZCkKIAkJCSAgICAgOiAibWVtb3J5Iik7CkBAIC0yODUsOSArMjcxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogX19jbXB4Y2hnX3U2NCh2b2xhdGlsZSBsb25nICptLCB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBuZXcpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1lbWJhciAjU3RvcmVMb2FkIHwgI0xvYWRMb2FkXG4iCi0JCQkgICAgICJjYXN4IFslMl0sICUzLCAlMFxuXHQiCi0JCQkgICAgICJtZW1iYXIgI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgorCV9fYXNtX18gX192b2xhdGlsZV9fKCJjYXN4IFslMl0sICUzLCAlMCIKIAkJCSAgICAgOiAiPSZyIiAobmV3KQogCQkJICAgICA6ICIwIiAobmV3KSwgInIiIChtKSwgInIiIChvbGQpCiAJCQkgICAgIDogIm1lbW9yeSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90c2IuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHNiLmgKaW5kZXggNzZlNDI5OS4uODNjNTcxZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90c2IuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RzYi5oCkBAIC01MCw4ICs1MCw2IEBACiAjZGVmaW5lIFRTQl9UQUdfSU5WQUxJRF9CSVQJNDYKICNkZWZpbmUgVFNCX1RBR19JTlZBTElEX0hJR0gJKDEgPDwgKFRTQl9UQUdfSU5WQUxJRF9CSVQgLSAzMikpCiAKLSNkZWZpbmUgVFNCX01FTUJBUgltZW1iYXIJI1N0b3JlU3RvcmUKLQogLyogU29tZSBjcHVzIHN1cHBvcnQgcGh5c2ljYWwgYWRkcmVzcyBxdWFkIGxvYWRzLiAgV2Ugd2FudCB0byB1c2UKICAqIHRob3NlIGlmIHBvc3NpYmxlIHNvIHdlIGRvbid0IG5lZWQgdG8gaGFyZC1sb2NrIHRoZSBUU0IgbWFwcGluZwogICogaW50byB0aGUgVExCLiAgV2UgZW5jb2RlIHNvbWUgaW5zdHJ1Y3Rpb24gcGF0Y2hpbmcgaW4gb3JkZXIgdG8KQEAgLTEyOCwxMyArMTI2LDExIEBACiAJY21wCVJFRzEsIFJFRzI7CQlcCiAJYm5lLHBuCSVpY2MsIDk5YjsJCVwKIAkgbm9wOwkJCQlcCi0JVFNCX01FTUJBUgogCiAjZGVmaW5lIFRTQl9XUklURShUU0IsIFRURSwgVEFHKSBcCiAJYWRkCVRTQiwgMHg4LCBUU0I7ICAgXAogCVRTQl9TVE9SRShUU0IsIFRURSk7ICAgICBcCiAJc3ViCVRTQiwgMHg4LCBUU0I7ICAgXAotCVRTQl9NRU1CQVI7ICAgICAgICAgICAgICBcCiAJVFNCX1NUT1JFKFRTQiwgVEFHKTsKIAogI2RlZmluZSBLVFNCX0xPQURfUVVBRChUU0IsIFJFRykgXApAQCAtMTUzLDEzICsxNDksMTEgQEAKIAljbXAJUkVHMSwgUkVHMjsJCVwKIAlibmUscG4JJWljYywgOTliOwkJXAogCSBub3A7CQkJCVwKLQlUU0JfTUVNQkFSCiAKICNkZWZpbmUgS1RTQl9XUklURShUU0IsIFRURSwgVEFHKSBcCiAJYWRkCVRTQiwgMHg4LCBUU0I7ICAgXAogCXN0eGEJVFRFLCBbVFNCXSBBU0lfTjsgICAgIFwKIAlzdWIJVFNCLCAweDgsIFRTQjsgICBcCi0JVFNCX01FTUJBUjsgICAgICAgICAgICAgIFwKIAlzdHhhCVRBRywgW1RTQl0gQVNJX047CiAKIAkvKiBEbyBhIGtlcm5lbCBwYWdlIHRhYmxlIHdhbGsuICBMZWF2ZXMgcGh5c2ljYWwgUFRFIHBvaW50ZXIgaW4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHRhYmxlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3R0YWJsZS5oCmluZGV4IDU3MDhiYTIuLjQ4ZjI4MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHRhYmxlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90dGFibGUuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX1NQQVJDNjRfVFRBQkxFX0gKIAogI2luY2x1ZGUgPGFzbS91dHJhcC5oPgorI2luY2x1ZGUgPGFzbS9waWwuaD4KIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgpAQCAtMTIzLDcgKzEyNCw3IEBACiAKICNkZWZpbmUgVFJBUF9JUlEocm91dGluZSwgbGV2ZWwpCQkJXAogCXJkcHIJJXBpbCwgJWcyOwkJCQlcCi0Jd3JwcgklZzAsIDE1LCAlcGlsOwkJCQlcCisJd3JwcgklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsOwkJXAogCXNldGhpCSVoaSgxZi00KSwgJWc3OwkJCQlcCiAJYmEscHQJJXhjYywgZXRyYXBfaXJxOwkJCVwKIAkgb3IJJWc3LCAlbG8oMWYtNCksICVnNzsJCQlcCkBAIC0xNDMsNyArMTQ0LDcgQEAKIAogI2RlZmluZSBUUkFQX0lSUShyb3V0aW5lLCBsZXZlbCkJCQlcCiAJcmRwcgklcGlsLCAlZzI7CQkJCVwKLQl3cnByCSVnMCwgMTUsICVwaWw7CQkJCVwKKwl3cnByCSVnMCwgUElMX05PUk1BTF9NQVgsICVwaWw7CQlcCiAJYmEscHQJJXhjYywgZXRyYXBfaXJxOwkJCVwKIAkgcmQJJXBjLCAlZzc7CQkJCVwKIAltb3YJbGV2ZWwsICVvMDsJCQkJXApAQCAtMTUzLDYgKzE1NCwxNiBAQAogCiAjZW5kaWYKIAorI2RlZmluZSBUUkFQX05NSV9JUlEocm91dGluZSwgbGV2ZWwpCQkJXAorCXJkcHIJJXBpbCwgJWcyOwkJCQlcCisJd3JwcgklZzAsIFBJTF9OTUksICVwaWw7CQkJXAorCWJhLHB0CSV4Y2MsIGV0cmFwX2lycTsJCQlcCisJIHJkCSVwYywgJWc3OwkJCQlcCisJbW92CWxldmVsLCAlbzA7CQkJCVwKKwljYWxsCXJvdXRpbmU7CQkJCVwKKwkgYWRkCSVzcCwgUFRSRUdTX09GRiwgJW8xOwkJCVwKKwliYSxhLHB0CSV4Y2MsIHJ0cmFwX25taTsKKwogI2RlZmluZSBUUkFQX0lWRUMgVFJBUF9OT1NBVkUoZG9faXZlYykKIAogI2RlZmluZSBCVFJBUChsdmwpIFRSQVBfQVJHKGJhZF90cmFwLCBsdmwpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA0MjA3ZmIzNi4uMDMxZjAzOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0xLDggKzEsNDQ0IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19VTklTVERfSAotI2RlZmluZSBfX19BU01fU1BBUkNfVU5JU1REX0gKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS91bmlzdGRfNjQuaD4KKyNpZm5kZWYgX1NQQVJDX1VOSVNURF9ICisjZGVmaW5lIF9TUEFSQ19VTklTVERfSAorCisvKgorICogU3lzdGVtIGNhbGxzIHVuZGVyIHRoZSBTcGFyYy4KKyAqCisgKiBEb24ndCBiZSBzY2FyZWQgYnkgdGhlIHVnbHkgY2xvYmJlcnMsIGl0IGlzIHRoZSBvbmx5IHdheSBJIGNhbgorICogdGhpbmsgb2YgcmlnaHQgbm93IHRvIGZvcmNlIHRoZSBhcmd1bWVudHMgaW50byBmaXhlZCByZWdpc3RlcnMKKyAqIGJlZm9yZSB0aGUgdHJhcCBpbnRvIHRoZSBzeXN0ZW0gY2FsbCB3aXRoIGdjYyAnYXNtJyBzdGF0ZW1lbnRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKgorICogU3VuT1MgY29tcGF0aWJpbGl0eSBiYXNlZCB1cG9uIHByZWxpbWluYXJ5IHdvcmsgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkcmlhbiBNLiBSb2RyaWd1ZXogKGFkcmlhbkByZW11cy5ydXRnZXJzLmVkdSkKKyAqLworI2lmbmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjaWZuZGVmIF9fYXJjaDY0X18KKyNkZWZpbmUgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAgICAgIDAgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9leGl0ICAgICAgICAgICAgICAgICAxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mb3JrICAgICAgICAgICAgICAgICAyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9yZWFkICAgICAgICAgICAgICAgICAzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl93cml0ZSAgICAgICAgICAgICAgICA0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9vcGVuICAgICAgICAgICAgICAgICA1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jbG9zZSAgICAgICAgICAgICAgICA2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl93YWl0NCAgICAgICAgICAgICAgICA3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jcmVhdCAgICAgICAgICAgICAgICA4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9saW5rICAgICAgICAgICAgICAgICA5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl91bmxpbmsgICAgICAgICAgICAgIDEwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9leGVjdiAgICAgICAgICAgICAgIDExIC8qIFN1bk9TIFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jaGRpciAgICAgICAgICAgICAgIDEyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jaG93bgkJIDEzIC8qIENvbW1vbgkJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9ta25vZCAgICAgICAgICAgICAgIDE0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jaG1vZCAgICAgICAgICAgICAgIDE1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9sY2hvd24gICAgICAgICAgICAgIDE2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9icmsgICAgICAgICAgICAgICAgIDE3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9wZXJmY3RyICAgICAgICAgICAgIDE4IC8qIFBlcmZvcm1hbmNlIGNvdW50ZXIgb3BlcmF0aW9ucyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9sc2VlayAgICAgICAgICAgICAgIDE5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRwaWQgICAgICAgICAgICAgIDIwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9jYXBnZXQJCSAyMSAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLworI2RlZmluZSBfX05SX2NhcHNldAkJIDIyIC8qIExpbnV4IFNwZWNpZmljCQkJCSAgICovCisjZGVmaW5lIF9fTlJfc2V0dWlkICAgICAgICAgICAgICAyMyAvKiBJbXBsZW1lbnRlZCB2aWEgc2V0cmV1aWQgaW4gU3VuT1MgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0dWlkICAgICAgICAgICAgICAyNCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfdm1zcGxpY2UJICAgICAgICAgMjUgLyogRU5PU1lTIHVuZGVyIFN1bk9TCQkJICAgKi8KKyNkZWZpbmUgX19OUl9wdHJhY2UgICAgICAgICAgICAgIDI2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9hbGFybSAgICAgICAgICAgICAgIDI3IC8qIEltcGxlbWVudGVkIHZpYSBzZXRpdGltZXIgaW4gU3VuT1MgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zaWdhbHRzdGFjawkgMjggLyogQ29tbW9uCQkJCQkgICAqLworI2RlZmluZSBfX05SX3BhdXNlICAgICAgICAgICAgICAgMjkgLyogSXMgc2lnYmxvY2soMCktPnNpZ3BhdXNlKCkgaW4gU3VuT1MgICAgICAgICAqLworI2RlZmluZSBfX05SX3V0aW1lICAgICAgICAgICAgICAgMzAgLyogSW1wbGVtZW50ZWQgdmlhIHV0aW1lcygpIHVuZGVyIFN1bk9TICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9sY2hvd24zMiAgICAgICAgICAgIDMxIC8qIExpbnV4IHNwYXJjMzIgc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mY2hvd24zMiAgICAgICAgICAgIDMyIC8qIExpbnV4IHNwYXJjMzIgc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX2FjY2VzcyAgICAgICAgICAgICAgMzMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX25pY2UgICAgICAgICAgICAgICAgMzQgLyogSW1wbGVtZW50ZWQgdmlhIGdldC9zZXRwcmlvcml0eSgpIGluIFN1bk9TICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9jaG93bjMyICAgICAgICAgICAgIDM1IC8qIExpbnV4IHNwYXJjMzIgc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX3N5bmMgICAgICAgICAgICAgICAgMzYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2tpbGwgICAgICAgICAgICAgICAgMzcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N0YXQgICAgICAgICAgICAgICAgMzggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NlbmRmaWxlCQkgMzkgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9sc3RhdCAgICAgICAgICAgICAgIDQwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9kdXAgICAgICAgICAgICAgICAgIDQxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9waXBlICAgICAgICAgICAgICAgIDQyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl90aW1lcyAgICAgICAgICAgICAgIDQzIC8qIEltcGxlbWVudGVkIHZpYSBnZXRydXNhZ2UoKSBpbiBTdW5PUyAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfZ2V0dWlkMzIgICAgICAgICAgICA0NCAvKiBMaW51eCBzcGFyYzMyIHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYKKyNkZWZpbmUgX19OUl91bW91bnQyICAgICAgICAgICAgIDQ1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zZXRnaWQgICAgICAgICAgICAgIDQ2IC8qIEltcGxlbWVudGVkIHZpYSBzZXRyZWdpZCgpIGluIFN1bk9TICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRnaWQgICAgICAgICAgICAgIDQ3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zaWduYWwgICAgICAgICAgICAgIDQ4IC8qIEltcGxlbWVudGVkIHZpYSBzaWd2ZWMoKSBpbiBTdW5PUyAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRldWlkICAgICAgICAgICAgIDQ5IC8qIFN1bk9TIGNhbGxzIGdldHVpZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRlZ2lkICAgICAgICAgICAgIDUwIC8qIFN1bk9TIGNhbGxzIGdldGdpZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9hY2N0ICAgICAgICAgICAgICAgIDUxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfZ2V0Z2lkMzIgICAgICAgICAgICA1MyAvKiBMaW51eCBzcGFyYzMyIHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICovCiAjZWxzZQotI2luY2x1ZGUgPGFzbS91bmlzdGRfMzIuaD4KKyNkZWZpbmUgX19OUl9tZW1vcnlfb3JkZXJpbmcJIDUyIC8qIExpbnV4IFNwZWNpZmljCQkJCSAgICovCisjZW5kaWYKKyNkZWZpbmUgX19OUl9pb2N0bCAgICAgICAgICAgICAgIDU0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9yZWJvb3QgICAgICAgICAgICAgIDU1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfbW1hcDIJCSA1NiAvKiBMaW51eCBzcGFyYzMyIFNwZWNpZmljCQkJICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX3N5bWxpbmsgICAgICAgICAgICAgNTcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3JlYWRsaW5rICAgICAgICAgICAgNTggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2V4ZWN2ZSAgICAgICAgICAgICAgNTkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3VtYXNrICAgICAgICAgICAgICAgNjAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Nocm9vdCAgICAgICAgICAgICAgNjEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZzdGF0ICAgICAgICAgICAgICAgNjIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZzdGF0NjQJCSA2MyAvKiBMaW51eCBTcGVjaWZpYwkJCSAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRwYWdlc2l6ZSAgICAgICAgIDY0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9tc3luYyAgICAgICAgICAgICAgIDY1IC8qIENvbW1vbiBpbiBuZXdlciAxLjMueCByZXZzLi4uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl92Zm9yayAgICAgICAgICAgICAgIDY2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9wcmVhZDY0ICAgICAgICAgICAgIDY3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9wd3JpdGU2NCAgICAgICAgICAgIDY4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfZ2V0ZXVpZDMyICAgICAgICAgICA2OSAvKiBMaW51eCBzcGFyYzMyLCBzYnJrIHVuZGVyIFN1bk9TICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZDMyICAgICAgICAgICA3MCAvKiBMaW51eCBzcGFyYzMyLCBzc3RrIHVuZGVyIFN1bk9TICAgICAgICAgICAgICovCisjZW5kaWYKKyNkZWZpbmUgX19OUl9tbWFwICAgICAgICAgICAgICAgIDcxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQzMiAgICAgICAgICA3MiAvKiBMaW51eCBzcGFyYzMyLCB2YWR2aXNlIHVuZGVyIFN1bk9TICAgICAgICAgICovCisjZW5kaWYKKyNkZWZpbmUgX19OUl9tdW5tYXAgICAgICAgICAgICAgIDczIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9tcHJvdGVjdCAgICAgICAgICAgIDc0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9tYWR2aXNlICAgICAgICAgICAgIDc1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl92aGFuZ3VwICAgICAgICAgICAgIDc2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NAkJIDc3IC8qIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMJCQkgICAqLworI2VuZGlmCisjZGVmaW5lIF9fTlJfbWluY29yZSAgICAgICAgICAgICA3OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzICAgICAgICAgICA3OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzICAgICAgICAgICA4MCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0cGdycCAgICAgICAgICAgICA4MSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2RlZmluZSBfX05SX3NldGdyb3VwczMyICAgICAgICAgODIgLyogTGludXggc3BhcmMzMiwgc2V0cGdycCB1bmRlciBTdW5PUyAgICAgICAgICAqLworI2VuZGlmCisjZGVmaW5lIF9fTlJfc2V0aXRpbWVyICAgICAgICAgICA4MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2RlZmluZSBfX05SX2Z0cnVuY2F0ZTY0CSA4NCAvKiBMaW51eCBzcGFyYzMyIFNwZWNpZmljCQkJICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX3N3YXBvbiAgICAgICAgICAgICAgODUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldGl0aW1lciAgICAgICAgICAgODYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9zZXR1aWQzMiAgICAgICAgICAgIDg3IC8qIExpbnV4IHNwYXJjMzIsIGdldGhvc3RuYW1lIHVuZGVyIFN1bk9TICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX3NldGhvc3RuYW1lICAgICAgICAgODggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9zZXRnaWQzMiAgICAgICAgICAgIDg5IC8qIExpbnV4IHNwYXJjMzIsIGdldGR0YWJsZXNpemUgdW5kZXIgU3VuT1MgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX2R1cDIgICAgICAgICAgICAgICAgOTAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9zZXRmc3VpZDMyICAgICAgICAgIDkxIC8qIExpbnV4IHNwYXJjMzIsIGdldGRvcHQgdW5kZXIgU3VuT1MgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX2ZjbnRsICAgICAgICAgICAgICAgOTIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NlbGVjdCAgICAgICAgICAgICAgOTMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9zZXRmc2dpZDMyICAgICAgICAgIDk0IC8qIExpbnV4IHNwYXJjMzIsIHNldGRvcHQgdW5kZXIgU3VuT1MgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX2ZzeW5jICAgICAgICAgICAgICAgOTUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldHByaW9yaXR5ICAgICAgICAgOTYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NvY2tldCAgICAgICAgICAgICAgOTcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Nvbm5lY3QgICAgICAgICAgICAgOTggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2FjY2VwdCAgICAgICAgICAgICAgOTkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldHByaW9yaXR5ICAgICAgICAxMDAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3JldHVybiAgICAgICAxMDEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbiAgICAgICAxMDIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrICAgICAxMDMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcgICAgICAxMDQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdCAgICAxMDUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbyAgICAxMDYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3J0X3NpZ3N1c3BlbmQgICAgICAxMDcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQzMiAgICAgICAgMTA4IC8qIExpbnV4IFNwZWNpZmljLCBzaWd2ZWMgdW5kZXIgU3VuT1MJICAgKi8KKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQzMiAgICAgICAgMTA5IC8qIExpbnV4IFNwZWNpZmljLCBzaWdibG9jayB1bmRlciBTdW5PUwkgICAqLworI2RlZmluZSBfX05SX3NldHJlc2dpZDMyICAgICAgICAxMTAgLyogTGludXggU3BlY2lmaWMsIHNpZ3NldG1hc2sgdW5kZXIgU3VuT1MJICAgKi8KKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQzMiAgICAgICAgMTExIC8qIExpbnV4IFNwZWNpZmljLCBzaWdwYXVzZSB1bmRlciBTdW5PUwkgICAqLworI2RlZmluZSBfX05SX3NldHJlZ2lkMzIgICAgICAgICAxMTIgLyogTGludXggc3BhcmMzMiwgc2lnc3RhY2sgdW5kZXIgU3VuT1MgICAgICAgICAqLworI2Vsc2UKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQgICAgICAgICAgMTA4IC8qIExpbnV4IFNwZWNpZmljLCBzaWd2ZWMgdW5kZXIgU3VuT1MJICAgKi8KKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQgICAgICAgICAgMTA5IC8qIExpbnV4IFNwZWNpZmljLCBzaWdibG9jayB1bmRlciBTdW5PUwkgICAqLworI2RlZmluZSBfX05SX3NldHJlc2dpZCAgICAgICAgICAxMTAgLyogTGludXggU3BlY2lmaWMsIHNpZ3NldG1hc2sgdW5kZXIgU3VuT1MJICAgKi8KKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQgICAgICAgICAgMTExIC8qIExpbnV4IFNwZWNpZmljLCBzaWdwYXVzZSB1bmRlciBTdW5PUwkgICAqLworI2VuZGlmCisjZGVmaW5lIF9fTlJfcmVjdm1zZyAgICAgICAgICAgIDExMyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc2VuZG1zZyAgICAgICAgICAgIDExNCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2RlZmluZSBfX05SX2dldGdyb3VwczMyICAgICAgICAxMTUgLyogTGludXggc3BhcmMzMiwgdnRyYWNlIHVuZGVyIFN1bk9TICAgICAgICAgICAqLworI2VuZGlmCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5ICAgICAgIDExNiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlICAgICAgICAgIDExNyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0c29ja29wdCAgICAgICAgIDExOCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkxMTkgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9yZWFkdiAgICAgICAgICAgICAgMTIwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl93cml0ZXYgICAgICAgICAgICAgMTIxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkgICAgICAgMTIyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mY2hvd24gICAgICAgICAgICAgMTIzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mY2htb2QgICAgICAgICAgICAgMTI0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9yZWN2ZnJvbSAgICAgICAgICAgMTI1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zZXRyZXVpZCAgICAgICAgICAgMTI2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zZXRyZWdpZCAgICAgICAgICAgMTI3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9yZW5hbWUgICAgICAgICAgICAgMTI4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl90cnVuY2F0ZSAgICAgICAgICAgMTI5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUgICAgICAgICAgMTMwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mbG9jayAgICAgICAgICAgICAgMTMxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9sc3RhdDY0CQkxMzIgLyogTGludXggU3BlY2lmaWMJCQkgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc2VuZHRvICAgICAgICAgICAgIDEzMyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc2h1dGRvd24gICAgICAgICAgIDEzNCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc29ja2V0cGFpciAgICAgICAgIDEzNSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfbWtkaXIgICAgICAgICAgICAgIDEzNiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfcm1kaXIgICAgICAgICAgICAgIDEzNyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfdXRpbWVzICAgICAgICAgICAgIDEzOCAvKiBTdW5PUyBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc3RhdDY0CQkxMzkgLyogTGludXggU3BlY2lmaWMJCQkgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCAgICAgICAgIDE0MCAvKiBhZGp0aW1lIHVuZGVyIFN1bk9TICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUgICAgICAgIDE0MSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZnV0ZXggICAgICAgICAgICAgIDE0MiAvKiBnZXRob3N0aWQgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0dGlkICAgICAgICAgICAgIDE0MyAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfZ2V0cmxpbWl0CQkxNDQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldHJsaW1pdCAgICAgICAgICAxNDUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCTE0NiAvKiBMaW51eCBTcGVjaWZpYywga2lsbHBnIHVuZGVyIFN1bk9TICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfcHJjdGwJCTE0NyAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfcGNpY29uZmlnX3JlYWQJMTQ4IC8qIEVOT1NZUyB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9wY2ljb25maWdfd3JpdGUJMTQ5IC8qIEVOT1NZUyB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRzb2NrbmFtZSAgICAgICAgMTUwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQgICAgICAgMTUxIC8qIExpbnV4IHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaCAgMTUyIC8qIExpbnV4IHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9wb2xsICAgICAgICAgICAgICAgMTUzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkxNTQgLyogTGludXggc3BlY2lmaWMJCQkJICAgKi8KKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisjZGVmaW5lIF9fTlJfZmNudGw2NAkJMTU1IC8qIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2ggICAxNTYgLyogTGludXggc3BlY2lmaWMJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9zdGF0ZnMgICAgICAgICAgICAgMTU3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mc3RhdGZzICAgICAgICAgICAgMTU4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl91bW91bnQgICAgICAgICAgICAgMTU5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRfYWZmaW5pdHkgMTYwIC8qIExpbnV4IHNwZWNpZmljLCBhc3luY19kYWVtb24gdW5kZXIgU3VuT1MgICAgKi8KKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfYWZmaW5pdHkgMTYxIC8qIExpbnV4IHNwZWNpZmljLCBnZXRmaCB1bmRlciBTdW5PUyAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9nZXRkb21haW5uYW1lICAgICAgMTYyIC8qIFN1bk9TIFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lICAgICAgMTYzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2RlZmluZSBfX05SX3V0cmFwX2luc3RhbGwJMTY0IC8qIFNZU1YgQUJJL3Y5IHJlcXVpcmVkCQkJICAgKi8KKyNlbmRpZgorI2RlZmluZSBfX05SX3F1b3RhY3RsICAgICAgICAgICAxNjUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcyAgICAxNjYgLyogTGludXggc3BlY2lmaWMsIGV4cG9ydGZzIHVuZGVyIFN1bk9TICAgICAgICAqLworI2RlZmluZSBfX05SX21vdW50ICAgICAgICAgICAgICAxNjcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3VzdGF0ICAgICAgICAgICAgICAxNjggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldHhhdHRyICAgICAgICAgICAxNjkgLyogU3VuT1M6IHNlbXN5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xzZXR4YXR0ciAgICAgICAgICAxNzAgLyogU3VuT1M6IG1zZ3N5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZzZXR4YXR0ciAgICAgICAgICAxNzEgLyogU3VuT1M6IHNobXN5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldHhhdHRyICAgICAgICAgICAxNzIgLyogU3VuT1M6IGF1ZGl0c3lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xnZXR4YXR0ciAgICAgICAgICAxNzMgLyogU3VuT1M6IHJmc3N5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldGRlbnRzICAgICAgICAgICAxNzQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldHNpZCAgICAgICAgICAgICAxNzUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZjaGRpciAgICAgICAgICAgICAxNzYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZnZXR4YXR0ciAgICAgICAgICAxNzcgLyogU3VuT1M6IGZjaHJvb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xpc3R4YXR0ciAgICAgICAgICAxNzggLyogU3VuT1M6IHZwaXhzeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xsaXN0eGF0dHIgICAgICAgICAxNzkgLyogU3VuT1M6IGFpb3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIgICAgICAgICAxODAgLyogU3VuT1M6IGFpb3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyICAgICAgICAxODEgLyogU3VuT1M6IGFpb3dhaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0ciAgICAgICAxODIgLyogU3VuT1M6IGFpb2NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NpZ3BlbmRpbmcgICAgICAgICAxODMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxODQgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KKyNkZWZpbmUgX19OUl9zZXRwZ2lkICAgICAgICAgICAgMTg1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIgICAgICAgMTg2IC8qIFN1bk9TOiBwYXRoY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl90a2lsbCAgICAgICAgICAgICAgMTg3IC8qIFN1bk9TOiBmcGF0aGNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX19OUl9leGl0X2dyb3VwCQkxODggLyogTGludXggc3BlY2lmaWMsIHN5c2NvbmYgdW5kZWYgU3VuT1MgICAgICAgICAqLworI2RlZmluZSBfX05SX3VuYW1lICAgICAgICAgICAgICAxODkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2luaXRfbW9kdWxlICAgICAgICAxOTAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5ICAgICAgICAxOTEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMgICAxOTIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAgICAgICAxOTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAgICAgICAgICAxOTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQgICAgICAgICAxOTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19zZXQgICAgICAgICAxOTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldHBwaWQgICAgICAgICAgICAxOTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NpZ2FjdGlvbiAgICAgICAgICAxOTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NnZXRtYXNrICAgICAgICAgICAxOTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NzZXRtYXNrICAgICAgICAgICAyMDAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NpZ3N1c3BlbmQgICAgICAgICAyMDEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX29sZGxzdGF0ICAgICAgICAgICAyMDIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3VzZWxpYiAgICAgICAgICAgICAyMDMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3JlYWRkaXIgICAgICAgICAgICAyMDQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3JlYWRhaGVhZCAgICAgICAgICAyMDUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NvY2tldGNhbGwgICAgICAgICAyMDYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N5c2xvZyAgICAgICAgICAgICAyMDcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llICAgICAyMDggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZhZHZpc2U2NCAgICAgICAgICAyMDkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZhZHZpc2U2NF82NCAgICAgICAyMTAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3Rna2lsbCAgICAgICAgICAgICAyMTEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3dhaXRwaWQgICAgICAgICAgICAyMTIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N3YXBvZmYgICAgICAgICAgICAyMTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N5c2luZm8gICAgICAgICAgICAyMTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lwYyAgICAgICAgICAgICAgICAyMTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NpZ3JldHVybiAgICAgICAgICAyMTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Nsb25lICAgICAgICAgICAgICAyMTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19nZXQgICAgICAgICAyMTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2FkanRpbWV4ICAgICAgICAgICAyMTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrICAgICAgICAyMjAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUgICAgICAyMjEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUgICAgICAyMjIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcyAgICAyMjMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2dldHBnaWQgICAgICAgICAgICAyMjQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2JkZmx1c2ggICAgICAgICAgICAyMjUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N5c2ZzICAgICAgICAgICAgICAyMjYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsICAgICAgICAyMjcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldGZzdWlkICAgICAgICAgICAyMjggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3NldGZzZ2lkICAgICAgICAgICAyMjkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX19uZXdzZWxlY3QgICAgICAgICAyMzAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9fMzJiaXRfc3lzY2FsbF9udW1iZXJzX18KKyNkZWZpbmUgX19OUl90aW1lICAgICAgICAgICAgICAgMjMxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbHNlCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBfX05SX3RpbWUJCTIzMSAvKiBMaW51eCBzcGFyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZW5kaWYKICNlbmRpZgorI2RlZmluZSBfX05SX3NwbGljZSAgICAgICAgICAgICAyMzIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N0aW1lICAgICAgICAgICAgICAyMzMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX3N0YXRmczY0ICAgICAgICAgICAyMzQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2ZzdGF0ZnM2NCAgICAgICAgICAyMzUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX19sbHNlZWsgICAgICAgICAgICAyMzYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX21sb2NrICAgICAgICAgICAgICAyMzcKKyNkZWZpbmUgX19OUl9tdW5sb2NrICAgICAgICAgICAgMjM4CisjZGVmaW5lIF9fTlJfbWxvY2thbGwgICAgICAgICAgIDIzOQorI2RlZmluZSBfX05SX211bmxvY2thbGwgICAgICAgICAyNDAKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRwYXJhbSAgICAgMjQxCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0gICAgIDI0MgorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlciAyNDMKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIgMjQ0CisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQgICAgICAgIDI0NQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXggMjQ2CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAyNDcKKyNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwgIDI0OAorI2RlZmluZSBfX05SX25hbm9zbGVlcCAgICAgICAgICAyNDkKKyNkZWZpbmUgX19OUl9tcmVtYXAgICAgICAgICAgICAgMjUwCisjZGVmaW5lIF9fTlJfX3N5c2N0bCAgICAgICAgICAgIDI1MQorI2RlZmluZSBfX05SX2dldHNpZCAgICAgICAgICAgICAyNTIKKyNkZWZpbmUgX19OUl9mZGF0YXN5bmMgICAgICAgICAgMjUzCisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bCAgICAgICAgIDI1NAorI2RlZmluZSBfX05SX3N5bmNfZmlsZV9yYW5nZQkyNTUKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lCTI1NgorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUJMjU3CisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0cmVzCTI1OAorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcAkyNTkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eQkyNjAKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eQkyNjEKKyNkZWZpbmUgX19OUl90aW1lcl9zZXR0aW1lCTI2MgorI2RlZmluZSBfX05SX3RpbWVyX2dldHRpbWUJMjYzCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgkyNjQKKyNkZWZpbmUgX19OUl90aW1lcl9kZWxldGUJMjY1CisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlCTI2NgorLyogI2RlZmluZSBfX05SX3ZzZXJ2ZXIJCTI2NyBSZXNlcnZlZCBmb3IgVlNFUlZFUiAqLworI2RlZmluZSBfX05SX2lvX3NldHVwCQkyNjgKKyNkZWZpbmUgX19OUl9pb19kZXN0cm95CQkyNjkKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCTI3MAorI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJMjcxCisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzCTI3MgorI2RlZmluZSBfX05SX21xX29wZW4JCTI3MworI2RlZmluZSBfX05SX21xX3VubGluawkJMjc0CisjZGVmaW5lIF9fTlJfbXFfdGltZWRzZW5kCTI3NQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkyNzYKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkJCTI3NworI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJMjc4CisjZGVmaW5lIF9fTlJfd2FpdGlkCQkyNzkKKyNkZWZpbmUgX19OUl90ZWUJCTI4MAorI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4MQorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4MgorI2RlZmluZSBfX05SX2tleWN0bAkJMjgzCisjZGVmaW5lIF9fTlJfb3BlbmF0CQkyODQKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkyODUKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkyODYKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJMjg3CisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkyODgKKyNkZWZpbmUgX19OUl9mc3RhdGF0NjQJCTI4OQorI2RlZmluZSBfX05SX3VubGlua2F0CQkyOTAKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJMjkxCisjZGVmaW5lIF9fTlJfbGlua2F0CQkyOTIKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCTI5MworI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCTI5NAorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkyOTUKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTI5NgorI2RlZmluZSBfX05SX3BzZWxlY3Q2CQkyOTcKKyNkZWZpbmUgX19OUl9wcG9sbAkJMjk4CisjZGVmaW5lIF9fTlJfdW5zaGFyZQkJMjk5CisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CTMwMAorI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkzMDEKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTMwMgorI2RlZmluZSBfX05SX21iaW5kCQkzMDMKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTMwNAorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMzA1CisjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJMzA2CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzA3CisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMDgKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMDkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMxMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMTEKKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZQkzMTIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMTMKKyNkZWZpbmUgX19OUl9mYWxsb2NhdGUJCTMxNAorI2RlZmluZSBfX05SX3RpbWVyZmRfc2V0dGltZQkzMTUKKyNkZWZpbmUgX19OUl90aW1lcmZkX2dldHRpbWUJMzE2CisjZGVmaW5lIF9fTlJfc2lnbmFsZmQ0CQkzMTcKKyNkZWZpbmUgX19OUl9ldmVudGZkMgkJMzE4CisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlMQkzMTkKKyNkZWZpbmUgX19OUl9kdXAzCQkzMjAKKyNkZWZpbmUgX19OUl9waXBlMgkJMzIxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkzMjIKKyNkZWZpbmUgX19OUl9hY2NlcHQ0CQkzMjMKKworI2RlZmluZSBOUl9TWVNDQUxMUwkJMzI0CisKKyNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCisvKiBTcGFyYyAzMi1iaXQgb25seSBoYXMgdGhlICJzZXRyZXN1aWQzMiIsICJnZXRyZXN1aWQzMiIgdmFyaWFudHMsCisgKiBpdCBuZXZlciBoYWQgdGhlIHBsYWluIG9uZXMgYW5kIHRoZXJlIGlzIG5vIHZhbHVlIHRvIGFkZGluZyB0aG9zZQorICogb2xkIHZlcnNpb25zIGludG8gdGhlIHN5c2NhbGwgdGFibGUuCisgKi8KKyNkZWZpbmUgX19JR05PUkVfc2V0cmVzdWlkCisjZGVmaW5lIF9fSUdOT1JFX2dldHJlc3VpZAorI2RlZmluZSBfX0lHTk9SRV9zZXRyZXNnaWQKKyNkZWZpbmUgX19JR05PUkVfZ2V0cmVzZ2lkCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfV0FJVFBJRAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19MTFNFRUsKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05JQ0UKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKKyNpZm5kZWYgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1RJTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19SVF9TSUdTVVNQRU5ECisjZW5kaWYKKworLyoKKyAqICJDb25kaXRpb25hbCIgc3lzY2FsbHMKKyAqCisgKiBXaGF0IHdlIHdhbnQgaXMgX19hdHRyaWJ1dGVfXygod2VhayxhbGlhcygic3lzX25pX3N5c2NhbGwiKSkpLAorICogYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBhbGwgdG9vbGNoYWlucywgc28gd2UganVzdCBkbyBpdCBieSBoYW5kCisgKi8KKyNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9TUEFSQ19VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTNkMmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0jaWZuZGVmIF9TUEFSQ19VTklTVERfSAotI2RlZmluZSBfU1BBUkNfVU5JU1REX0gKLQotLyoKLSAqIFN5c3RlbSBjYWxscyB1bmRlciB0aGUgU3BhcmMuCi0gKgotICogRG9uJ3QgYmUgc2NhcmVkIGJ5IHRoZSB1Z2x5IGNsb2JiZXJzLCBpdCBpcyB0aGUgb25seSB3YXkgSSBjYW4KLSAqIHRoaW5rIG9mIHJpZ2h0IG5vdyB0byBmb3JjZSB0aGUgYXJndW1lbnRzIGludG8gZml4ZWQgcmVnaXN0ZXJzCi0gKiBiZWZvcmUgdGhlIHRyYXAgaW50byB0aGUgc3lzdGVtIGNhbGwgd2l0aCBnY2MgJ2FzbScgc3RhdGVtZW50cy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQotICoKLSAqIFN1bk9TIGNvbXBhdGliaWxpdHkgYmFzZWQgdXBvbiBwcmVsaW1pbmFyeSB3b3JrIHdoaWNoIGlzOgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBBZHJpYW4gTS4gUm9kcmlndWV6IChhZHJpYW5AcmVtdXMucnV0Z2Vycy5lZHUpCi0gKi8KLQotI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAgICAgIDAgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KLSNkZWZpbmUgX19OUl9leGl0ICAgICAgICAgICAgICAgICAxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mb3JrICAgICAgICAgICAgICAgICAyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWFkICAgICAgICAgICAgICAgICAzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl93cml0ZSAgICAgICAgICAgICAgICA0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9vcGVuICAgICAgICAgICAgICAgICA1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jbG9zZSAgICAgICAgICAgICAgICA2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl93YWl0NCAgICAgICAgICAgICAgICA3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jcmVhdCAgICAgICAgICAgICAgICA4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9saW5rICAgICAgICAgICAgICAgICA5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91bmxpbmsgICAgICAgICAgICAgIDEwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9leGVjdiAgICAgICAgICAgICAgIDExIC8qIFN1bk9TIFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jaGRpciAgICAgICAgICAgICAgIDEyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jaG93bgkJIDEzIC8qIENvbW1vbgkJCQkJICAgKi8KLSNkZWZpbmUgX19OUl9ta25vZCAgICAgICAgICAgICAgIDE0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jaG1vZCAgICAgICAgICAgICAgIDE1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sY2hvd24gICAgICAgICAgICAgIDE2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9icmsgICAgICAgICAgICAgICAgIDE3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wZXJmY3RyICAgICAgICAgICAgIDE4IC8qIFBlcmZvcm1hbmNlIGNvdW50ZXIgb3BlcmF0aW9ucyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sc2VlayAgICAgICAgICAgICAgIDE5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwaWQgICAgICAgICAgICAgIDIwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jYXBnZXQJCSAyMSAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLwotI2RlZmluZSBfX05SX2NhcHNldAkJIDIyIC8qIExpbnV4IFNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfc2V0dWlkICAgICAgICAgICAgICAyMyAvKiBJbXBsZW1lbnRlZCB2aWEgc2V0cmV1aWQgaW4gU3VuT1MgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0dWlkICAgICAgICAgICAgICAyNCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdm1zcGxpY2UJICAgICAgICAgMjUgLyogRU5PU1lTIHVuZGVyIFN1bk9TCQkJICAgKi8KLSNkZWZpbmUgX19OUl9wdHJhY2UgICAgICAgICAgICAgIDI2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9hbGFybSAgICAgICAgICAgICAgIDI3IC8qIEltcGxlbWVudGVkIHZpYSBzZXRpdGltZXIgaW4gU3VuT1MgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdhbHRzdGFjawkgMjggLyogQ29tbW9uCQkJCQkgICAqLwotI2RlZmluZSBfX05SX3BhdXNlICAgICAgICAgICAgICAgMjkgLyogSXMgc2lnYmxvY2soMCktPnNpZ3BhdXNlKCkgaW4gU3VuT1MgICAgICAgICAqLwotI2RlZmluZSBfX05SX3V0aW1lICAgICAgICAgICAgICAgMzAgLyogSW1wbGVtZW50ZWQgdmlhIHV0aW1lcygpIHVuZGVyIFN1bk9TICAgICAgICAqLwotI2RlZmluZSBfX05SX2xjaG93bjMyICAgICAgICAgICAgMzEgLyogTGludXggc3BhcmMzMiBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaG93bjMyICAgICAgICAgICAgMzIgLyogTGludXggc3BhcmMzMiBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2FjY2VzcyAgICAgICAgICAgICAgMzMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX25pY2UgICAgICAgICAgICAgICAgMzQgLyogSW1wbGVtZW50ZWQgdmlhIGdldC9zZXRwcmlvcml0eSgpIGluIFN1bk9TICAqLwotI2RlZmluZSBfX05SX2Nob3duMzIgICAgICAgICAgICAgMzUgLyogTGludXggc3BhcmMzMiBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N5bmMgICAgICAgICAgICAgICAgMzYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2tpbGwgICAgICAgICAgICAgICAgMzcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N0YXQgICAgICAgICAgICAgICAgMzggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NlbmRmaWxlCQkgMzkgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KLSNkZWZpbmUgX19OUl9sc3RhdCAgICAgICAgICAgICAgIDQwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9kdXAgICAgICAgICAgICAgICAgIDQxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9waXBlICAgICAgICAgICAgICAgIDQyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl90aW1lcyAgICAgICAgICAgICAgIDQzIC8qIEltcGxlbWVudGVkIHZpYSBnZXRydXNhZ2UoKSBpbiBTdW5PUyAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR1aWQzMiAgICAgICAgICAgIDQ0IC8qIExpbnV4IHNwYXJjMzIgc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91bW91bnQyICAgICAgICAgICAgIDQ1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRnaWQgICAgICAgICAgICAgIDQ2IC8qIEltcGxlbWVudGVkIHZpYSBzZXRyZWdpZCgpIGluIFN1bk9TICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRnaWQgICAgICAgICAgICAgIDQ3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWduYWwgICAgICAgICAgICAgIDQ4IC8qIEltcGxlbWVudGVkIHZpYSBzaWd2ZWMoKSBpbiBTdW5PUyAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRldWlkICAgICAgICAgICAgIDQ5IC8qIFN1bk9TIGNhbGxzIGdldHVpZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRlZ2lkICAgICAgICAgICAgIDUwIC8qIFN1bk9TIGNhbGxzIGdldGdpZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9hY2N0ICAgICAgICAgICAgICAgIDUxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9tZW1vcnlfb3JkZXJpbmcgIDUyICAgIExpbnV4IHNwYXJjNjQgc3BlY2lmaWMJCQkgICAqLwotI2RlZmluZSBfX05SX2dldGdpZDMyICAgICAgICAgICAgNTMgLyogTGludXggc3BhcmMzMiBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2lvY3RsICAgICAgICAgICAgICAgNTQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlYm9vdCAgICAgICAgICAgICAgNTUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21tYXAyCQkgNTYgLyogTGludXggc3BhcmMzMiBTcGVjaWZpYwkJCSAgICovCi0jZGVmaW5lIF9fTlJfc3ltbGluayAgICAgICAgICAgICA1NyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcmVhZGxpbmsgICAgICAgICAgICA1OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZXhlY3ZlICAgICAgICAgICAgICA1OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdW1hc2sgICAgICAgICAgICAgICA2MCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfY2hyb290ICAgICAgICAgICAgICA2MSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN0YXQgICAgICAgICAgICAgICA2MiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN0YXQ2NAkJIDYzIC8qIExpbnV4IFNwZWNpZmljCQkJICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHBhZ2VzaXplICAgICAgICAgNjQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21zeW5jICAgICAgICAgICAgICAgNjUgLyogQ29tbW9uIGluIG5ld2VyIDEuMy54IHJldnMuLi4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3Zmb3JrICAgICAgICAgICAgICAgNjYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3ByZWFkNjQgICAgICAgICAgICAgNjcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3B3cml0ZTY0ICAgICAgICAgICAgNjggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGV1aWQzMiAgICAgICAgICAgNjkgLyogTGludXggc3BhcmMzMiwgc2JyayB1bmRlciBTdW5PUyAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGVnaWQzMiAgICAgICAgICAgNzAgLyogTGludXggc3BhcmMzMiwgc3N0ayB1bmRlciBTdW5PUyAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21tYXAgICAgICAgICAgICAgICAgNzEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJldWlkMzIgICAgICAgICAgNzIgLyogTGludXggc3BhcmMzMiwgdmFkdmlzZSB1bmRlciBTdW5PUyAgICAgICAgICAqLwotI2RlZmluZSBfX05SX211bm1hcCAgICAgICAgICAgICAgNzMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21wcm90ZWN0ICAgICAgICAgICAgNzQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21hZHZpc2UgICAgICAgICAgICAgNzUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3ZoYW5ndXAgICAgICAgICAgICAgNzYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3RydW5jYXRlNjQJCSA3NyAvKiBMaW51eCBzcGFyYzMyIFNwZWNpZmljCQkJICAgKi8KLSNkZWZpbmUgX19OUl9taW5jb3JlICAgICAgICAgICAgIDc4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRncm91cHMgICAgICAgICAgIDc5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRncm91cHMgICAgICAgICAgIDgwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwZ3JwICAgICAgICAgICAgIDgxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRncm91cHMzMiAgICAgICAgIDgyIC8qIExpbnV4IHNwYXJjMzIsIHNldHBncnAgdW5kZXIgU3VuT1MgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRpdGltZXIgICAgICAgICAgIDgzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkgODQgLyogTGludXggc3BhcmMzMiBTcGVjaWZpYwkJCSAgICovCi0jZGVmaW5lIF9fTlJfc3dhcG9uICAgICAgICAgICAgICA4NSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0aXRpbWVyICAgICAgICAgICA4NiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0dWlkMzIgICAgICAgICAgICA4NyAvKiBMaW51eCBzcGFyYzMyLCBnZXRob3N0bmFtZSB1bmRlciBTdW5PUyAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUgICAgICAgICA4OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0Z2lkMzIgICAgICAgICAgICA4OSAvKiBMaW51eCBzcGFyYzMyLCBnZXRkdGFibGVzaXplIHVuZGVyIFN1bk9TICAgICovCi0jZGVmaW5lIF9fTlJfZHVwMiAgICAgICAgICAgICAgICA5MCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0ZnN1aWQzMiAgICAgICAgICA5MSAvKiBMaW51eCBzcGFyYzMyLCBnZXRkb3B0IHVuZGVyIFN1bk9TICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZmNudGwgICAgICAgICAgICAgICA5MiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2VsZWN0ICAgICAgICAgICAgICA5MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0ZnNnaWQzMiAgICAgICAgICA5NCAvKiBMaW51eCBzcGFyYzMyLCBzZXRkb3B0IHVuZGVyIFN1bk9TICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN5bmMgICAgICAgICAgICAgICA5NSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkgICAgICAgICA5NiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc29ja2V0ICAgICAgICAgICAgICA5NyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfY29ubmVjdCAgICAgICAgICAgICA5OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfYWNjZXB0ICAgICAgICAgICAgICA5OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkgICAgICAgIDEwMCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuICAgICAgIDEwMSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uICAgICAgIDEwMiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sgICAgIDEwMyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZyAgICAgIDEwNCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0ICAgIDEwNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvICAgIDEwNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZCAgICAgIDEwNyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0cmVzdWlkMzIgICAgICAgIDEwOCAvKiBMaW51eCBTcGVjaWZpYywgc2lndmVjIHVuZGVyIFN1bk9TCSAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cmVzdWlkMzIgICAgICAgIDEwOSAvKiBMaW51eCBTcGVjaWZpYywgc2lnYmxvY2sgdW5kZXIgU3VuT1MJICAgKi8KLSNkZWZpbmUgX19OUl9zZXRyZXNnaWQzMiAgICAgICAgMTEwIC8qIExpbnV4IFNwZWNpZmljLCBzaWdzZXRtYXNrIHVuZGVyIFN1bk9TCSAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkMzIgICAgICAgIDExMSAvKiBMaW51eCBTcGVjaWZpYywgc2lncGF1c2UgdW5kZXIgU3VuT1MJICAgKi8KLSNkZWZpbmUgX19OUl9zZXRyZWdpZDMyICAgICAgICAgMTEyIC8qIExpbnV4IHNwYXJjMzIsIHNpZ3N0YWNrIHVuZGVyIFN1bk9TICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWN2bXNnICAgICAgICAgICAgMTEzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZW5kbXNnICAgICAgICAgICAgMTE0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRncm91cHMzMiAgICAgICAgMTE1IC8qIExpbnV4IHNwYXJjMzIsIHZ0cmFjZSB1bmRlciBTdW5PUyAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkgICAgICAgMTE2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRydXNhZ2UgICAgICAgICAgMTE3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0ICAgICAgICAgMTE4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRjd2QJCTExOSAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLwotI2RlZmluZSBfX05SX3JlYWR2ICAgICAgICAgICAgICAxMjAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3dyaXRldiAgICAgICAgICAgICAxMjEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHRpbWVvZmRheSAgICAgICAxMjIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaG93biAgICAgICAgICAgICAxMjMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaG1vZCAgICAgICAgICAgICAxMjQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlY3Zmcm9tICAgICAgICAgICAxMjUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJldWlkICAgICAgICAgICAxMjYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJlZ2lkICAgICAgICAgICAxMjcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlbmFtZSAgICAgICAgICAgICAxMjggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3RydW5jYXRlICAgICAgICAgICAxMjkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Z0cnVuY2F0ZSAgICAgICAgICAxMzAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Zsb2NrICAgICAgICAgICAgICAxMzEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xzdGF0NjQJCTEzMiAvKiBMaW51eCBTcGVjaWZpYwkJCSAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZW5kdG8gICAgICAgICAgICAgMTMzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaHV0ZG93biAgICAgICAgICAgMTM0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zb2NrZXRwYWlyICAgICAgICAgMTM1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9ta2RpciAgICAgICAgICAgICAgMTM2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9ybWRpciAgICAgICAgICAgICAgMTM3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91dGltZXMgICAgICAgICAgICAgMTM4IC8qIFN1bk9TIFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zdGF0NjQJCTEzOSAvKiBMaW51eCBTcGVjaWZpYwkJCSAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZW5kZmlsZTY0ICAgICAgICAgMTQwIC8qIGFkanRpbWUgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwZWVybmFtZSAgICAgICAgMTQxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mdXRleCAgICAgICAgICAgICAgMTQyIC8qIGdldGhvc3RpZCB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR0aWQgICAgICAgICAgICAgMTQzIC8qIEVOT1NZUyB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRybGltaXQgICAgICAgICAgMTQ0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRybGltaXQgICAgICAgICAgMTQ1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9waXZvdF9yb290CQkxNDYgLyogTGludXggU3BlY2lmaWMsIGtpbGxwZyB1bmRlciBTdW5PUyAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3ByY3RsCQkxNDcgLyogRU5PU1lTIHVuZGVyIFN1bk9TICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3BjaWNvbmZpZ19yZWFkCTE0OCAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcGNpY29uZmlnX3dyaXRlCTE0OSAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0c29ja25hbWUgICAgICAgIDE1MCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0ICAgICAgIDE1MSAvKiBMaW51eCBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2ggIDE1MiAvKiBMaW51eCBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcG9sbCAgICAgICAgICAgICAgIDE1MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJMTU0IC8qIExpbnV4IHNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfZmNudGw2NAkJMTU1IC8qIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoICAgMTU2IC8qIExpbnV4IHNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfc3RhdGZzICAgICAgICAgICAgIDE1NyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN0YXRmcyAgICAgICAgICAgIDE1OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdW1vdW50ICAgICAgICAgICAgIDE1OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0X2FmZmluaXR5IDE2MCAvKiBMaW51eCBzcGVjaWZpYywgYXN5bmNfZGFlbW9uIHVuZGVyIFN1bk9TICAgICovCi0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X2FmZmluaXR5IDE2MSAvKiBMaW51eCBzcGVjaWZpYywgZ2V0ZmggdW5kZXIgU3VuT1MgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0ZG9tYWlubmFtZSAgICAgIDE2MiAvKiBTdW5PUyBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZSAgICAgIDE2MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfdXRyYXBfaW5zdGFsbCAgIDE2NCAgICBMaW51eCBzcGFyYzY0IHNwZWNpZmljCQkJICAgKi8KLSNkZWZpbmUgX19OUl9xdW90YWN0bCAgICAgICAgICAgMTY1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MgICAgMTY2IC8qIExpbnV4IHNwZWNpZmljLCBleHBvcnRmcyB1bmRlciBTdW5PUyAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tb3VudCAgICAgICAgICAgICAgMTY3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91c3RhdCAgICAgICAgICAgICAgMTY4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXR4YXR0ciAgICAgICAgICAgMTY5IC8qIFN1bk9TOiBzZW1zeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sc2V0eGF0dHIgICAgICAgICAgMTcwIC8qIFN1bk9TOiBtc2dzeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mc2V0eGF0dHIgICAgICAgICAgMTcxIC8qIFN1bk9TOiBzaG1zeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR4YXR0ciAgICAgICAgICAgMTcyIC8qIFN1bk9TOiBhdWRpdHN5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sZ2V0eGF0dHIgICAgICAgICAgMTczIC8qIFN1bk9TOiByZnNzeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRkZW50cyAgICAgICAgICAgMTc0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRzaWQgICAgICAgICAgICAgMTc1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mY2hkaXIgICAgICAgICAgICAgMTc2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mZ2V0eGF0dHIgICAgICAgICAgMTc3IC8qIFN1bk9TOiBmY2hyb290ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9saXN0eGF0dHIgICAgICAgICAgMTc4IC8qIFN1bk9TOiB2cGl4c3lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sbGlzdHhhdHRyICAgICAgICAgMTc5IC8qIFN1bk9TOiBhaW9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mbGlzdHhhdHRyICAgICAgICAgMTgwIC8qIFN1bk9TOiBhaW93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZW1vdmV4YXR0ciAgICAgICAgMTgxIC8qIFN1bk9TOiBhaW93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIgICAgICAgMTgyIC8qIFN1bk9TOiBhaW9jYW5jZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdwZW5kaW5nICAgICAgICAgMTgzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9xdWVyeV9tb2R1bGUJMTg0IC8qIExpbnV4IFNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfc2V0cGdpZCAgICAgICAgICAgIDE4NSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyICAgICAgIDE4NiAvKiBTdW5PUzogcGF0aGNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdGtpbGwgICAgICAgICAgICAgIDE4NyAvKiBTdW5PUzogZnBhdGhjb25mICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJMTg4IC8qIExpbnV4IHNwZWNpZmljLCBzeXNjb25mIHVuZGVmIFN1bk9TICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91bmFtZSAgICAgICAgICAgICAgMTg5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pbml0X21vZHVsZSAgICAgICAgMTkwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wZXJzb25hbGl0eSAgICAgICAgMTkxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZW1hcF9maWxlX3BhZ2VzICAgMTkyIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUgICAgICAgMTkzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9lcG9sbF9jdGwgICAgICAgICAgMTk0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9lcG9sbF93YWl0ICAgICAgICAgMTk1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pb3ByaW9fc2V0ICAgICAgICAgMTk2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwcGlkICAgICAgICAgICAgMTk3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdhY3Rpb24gICAgICAgICAgMTk4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZ2V0bWFzayAgICAgICAgICAgMTk5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zc2V0bWFzayAgICAgICAgICAgMjAwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdzdXNwZW5kICAgICAgICAgMjAxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9vbGRsc3RhdCAgICAgICAgICAgMjAyIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91c2VsaWIgICAgICAgICAgICAgMjAzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWFkZGlyICAgICAgICAgICAgMjA0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWFkYWhlYWQgICAgICAgICAgMjA1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zb2NrZXRjYWxsICAgICAgICAgMjA2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zeXNsb2cgICAgICAgICAgICAgMjA3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZSAgICAgMjA4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mYWR2aXNlNjQgICAgICAgICAgMjA5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mYWR2aXNlNjRfNjQgICAgICAgMjEwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl90Z2tpbGwgICAgICAgICAgICAgMjExIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl93YWl0cGlkICAgICAgICAgICAgMjEyIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zd2Fwb2ZmICAgICAgICAgICAgMjEzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zeXNpbmZvICAgICAgICAgICAgMjE0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pcGMgICAgICAgICAgICAgICAgMjE1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdyZXR1cm4gICAgICAgICAgMjE2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jbG9uZSAgICAgICAgICAgICAgMjE3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0ICAgICAgICAgMjE4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9hZGp0aW1leCAgICAgICAgICAgMjE5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zaWdwcm9jbWFzayAgICAgICAgMjIwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlICAgICAgMjIxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlICAgICAgMjIyIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRfa2VybmVsX3N5bXMgICAgMjIzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwZ2lkICAgICAgICAgICAgMjI0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9iZGZsdXNoICAgICAgICAgICAgMjI1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zeXNmcyAgICAgICAgICAgICAgMjI2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9hZnNfc3lzY2FsbCAgICAgICAgMjI3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRmc3VpZCAgICAgICAgICAgMjI4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZXRmc2dpZCAgICAgICAgICAgMjI5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9fbmV3c2VsZWN0ICAgICAgICAgMjMwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl90aW1lICAgICAgICAgICAgICAgMjMxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zcGxpY2UgICAgICAgICAgICAgMjMyIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zdGltZSAgICAgICAgICAgICAgMjMzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zdGF0ZnM2NCAgICAgICAgICAgMjM0IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mc3RhdGZzNjQgICAgICAgICAgMjM1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9fbGxzZWVrICAgICAgICAgICAgMjM2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tbG9jayAgICAgICAgICAgICAgMjM3Ci0jZGVmaW5lIF9fTlJfbXVubG9jayAgICAgICAgICAgIDIzOAotI2RlZmluZSBfX05SX21sb2NrYWxsICAgICAgICAgICAyMzkKLSNkZWZpbmUgX19OUl9tdW5sb2NrYWxsICAgICAgICAgMjQwCi0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0gICAgIDI0MQotI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtICAgICAyNDIKLSNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIgMjQzCi0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyIDI0NAotI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkICAgICAgICAyNDUKLSNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IDI0NgotI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4gMjQ3Ci0jZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsICAyNDgKLSNkZWZpbmUgX19OUl9uYW5vc2xlZXAgICAgICAgICAgMjQ5Ci0jZGVmaW5lIF9fTlJfbXJlbWFwICAgICAgICAgICAgIDI1MAotI2RlZmluZSBfX05SX19zeXNjdGwgICAgICAgICAgICAyNTEKLSNkZWZpbmUgX19OUl9nZXRzaWQgICAgICAgICAgICAgMjUyCi0jZGVmaW5lIF9fTlJfZmRhdGFzeW5jICAgICAgICAgIDI1MwotI2RlZmluZSBfX05SX25mc3NlcnZjdGwgICAgICAgICAyNTQKLSNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMjU1Ci0jZGVmaW5lIF9fTlJfY2xvY2tfc2V0dGltZQkyNTYKLSNkZWZpbmUgX19OUl9jbG9ja19nZXR0aW1lCTI1NwotI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcwkyNTgKLSNkZWZpbmUgX19OUl9jbG9ja19uYW5vc2xlZXAJMjU5Ci0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkJMjYwCi0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkJMjYxCi0jZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZQkyNjIKLSNkZWZpbmUgX19OUl90aW1lcl9nZXR0aW1lCTI2MwotI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4JMjY0Ci0jZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlCTI2NQotI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkyNjYKLS8qICNkZWZpbmUgX19OUl92c2VydmVyCQkyNjcgUmVzZXJ2ZWQgZm9yIFZTRVJWRVIgKi8KLSNkZWZpbmUgX19OUl9pb19zZXR1cAkJMjY4Ci0jZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJMjY5Ci0jZGVmaW5lIF9fTlJfaW9fc3VibWl0CQkyNzAKLSNkZWZpbmUgX19OUl9pb19jYW5jZWwJCTI3MQotI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkyNzIKLSNkZWZpbmUgX19OUl9tcV9vcGVuCQkyNzMKLSNkZWZpbmUgX19OUl9tcV91bmxpbmsJCTI3NAotI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZAkyNzUKLSNkZWZpbmUgX19OUl9tcV90aW1lZHJlY2VpdmUJMjc2Ci0jZGVmaW5lIF9fTlJfbXFfbm90aWZ5CQkyNzcKLSNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCTI3OAotI2RlZmluZSBfX05SX3dhaXRpZAkJMjc5Ci0jZGVmaW5lIF9fTlJfdGVlCQkyODAKLSNkZWZpbmUgX19OUl9hZGRfa2V5CQkyODEKLSNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyODIKLSNkZWZpbmUgX19OUl9rZXljdGwJCTI4MwotI2RlZmluZSBfX05SX29wZW5hdAkJMjg0Ci0jZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjg1Ci0jZGVmaW5lIF9fTlJfbWtub2RhdAkJMjg2Ci0jZGVmaW5lIF9fTlJfZmNob3duYXQJCTI4NwotI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjg4Ci0jZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkyODkKLSNkZWZpbmUgX19OUl91bmxpbmthdAkJMjkwCi0jZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTI5MQotI2RlZmluZSBfX05SX2xpbmthdAkJMjkyCi0jZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkyOTMKLSNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkyOTQKLSNkZWZpbmUgX19OUl9mY2htb2RhdAkJMjk1Ci0jZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkyOTYKLSNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMjk3Ci0jZGVmaW5lIF9fTlJfcHBvbGwJCTI5OAotI2RlZmluZSBfX05SX3Vuc2hhcmUJCTI5OQotI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMDAKLSNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzAxCi0jZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkzMDIKLSNkZWZpbmUgX19OUl9tYmluZAkJMzAzCi0jZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkzMDQKLSNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CTMwNQotI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCTMwNgotI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMwNwotI2RlZmluZSBfX05SX2dldGNwdQkJMzA4Ci0jZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzA5Ci0jZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMTAKLSNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzExCi0jZGVmaW5lIF9fTlJfdGltZXJmZF9jcmVhdGUJMzEyCi0jZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzEzCi0jZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkzMTQKLSNkZWZpbmUgX19OUl90aW1lcmZkX3NldHRpbWUJMzE1Ci0jZGVmaW5lIF9fTlJfdGltZXJmZF9nZXR0aW1lCTMxNgotI2RlZmluZSBfX05SX3NpZ25hbGZkNAkJMzE3Ci0jZGVmaW5lIF9fTlJfZXZlbnRmZDIJCTMxOAotI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZTEJMzE5Ci0jZGVmaW5lIF9fTlJfZHVwMwkJMzIwCi0jZGVmaW5lIF9fTlJfcGlwZTIJCTMyMQotI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdDEJMzIyCi0jZGVmaW5lIF9fTlJfYWNjZXB0NAkJMzIzCi0KLSNkZWZpbmUgTlJfU1lTQ0FMTFMJCTMyNAotCi0vKiBTcGFyYyAzMi1iaXQgb25seSBoYXMgdGhlICJzZXRyZXN1aWQzMiIsICJnZXRyZXN1aWQzMiIgdmFyaWFudHMsCi0gKiBpdCBuZXZlciBoYWQgdGhlIHBsYWluIG9uZXMgYW5kIHRoZXJlIGlzIG5vIHZhbHVlIHRvIGFkZGluZyB0aG9zZQotICogb2xkIHZlcnNpb25zIGludG8gdGhlIHN5c2NhbGwgdGFibGUuCi0gKi8KLSNkZWZpbmUgX19JR05PUkVfc2V0cmVzdWlkCi0jZGVmaW5lIF9fSUdOT1JFX2dldHJlc3VpZAotI2RlZmluZSBfX0lHTk9SRV9zZXRyZXNnaWQKLSNkZWZpbmUgX19JR05PUkVfZ2V0cmVzZ2lkCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCi0jZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NUQVQ2NAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVEhPU1ROQU1FCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19QQVVTRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0dFVE1BU0sKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR05BTAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1dBSVRQSUQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECi0KLS8qCi0gKiAiQ29uZGl0aW9uYWwiIHN5c2NhbGxzCi0gKgotICogV2hhdCB3ZSB3YW50IGlzIF9fYXR0cmlidXRlX18oKHdlYWssYWxpYXMoInN5c19uaV9zeXNjYWxsIikpKSwKLSAqIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gYWxsIHRvb2xjaGFpbnMsIHNvIHdlIGp1c3QgZG8gaXQgYnkgaGFuZAotICovCi0jZGVmaW5lIGNvbmRfc3lzY2FsbCh4KSBhc20oIi53ZWFrXHQiICN4ICJcblx0LnNldFx0IiAjeCAiLHN5c19uaV9zeXNjYWxsIikKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfU1BBUkNfVU5JU1REX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVkM2MwLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9VTklTVERfSAotI2RlZmluZSBfU1BBUkM2NF9VTklTVERfSAotCi0vKgotICogU3lzdGVtIGNhbGxzIHVuZGVyIHRoZSBTcGFyYy4KLSAqCi0gKiBEb24ndCBiZSBzY2FyZWQgYnkgdGhlIHVnbHkgY2xvYmJlcnMsIGl0IGlzIHRoZSBvbmx5IHdheSBJIGNhbgotICogdGhpbmsgb2YgcmlnaHQgbm93IHRvIGZvcmNlIHRoZSBhcmd1bWVudHMgaW50byBmaXhlZCByZWdpc3RlcnMKLSAqIGJlZm9yZSB0aGUgdHJhcCBpbnRvIHRoZSBzeXN0ZW0gY2FsbCB3aXRoIGdjYyAnYXNtJyBzdGF0ZW1lbnRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCi0gKgotICogU3VuT1MgY29tcGF0aWJpbGl0eSBiYXNlZCB1cG9uIHByZWxpbWluYXJ5IHdvcmsgd2hpY2ggaXM6Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IEFkcmlhbiBNLiBSb2RyaWd1ZXogKGFkcmlhbkByZW11cy5ydXRnZXJzLmVkdSkKLSAqLwotCi0jZGVmaW5lIF9fTlJfcmVzdGFydF9zeXNjYWxsICAgICAgMCAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLwotI2RlZmluZSBfX05SX2V4aXQgICAgICAgICAgICAgICAgIDEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZvcmsgICAgICAgICAgICAgICAgIDIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlYWQgICAgICAgICAgICAgICAgIDMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3dyaXRlICAgICAgICAgICAgICAgIDQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX29wZW4gICAgICAgICAgICAgICAgIDUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Nsb3NlICAgICAgICAgICAgICAgIDYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3dhaXQ0ICAgICAgICAgICAgICAgIDcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2NyZWF0ICAgICAgICAgICAgICAgIDggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xpbmsgICAgICAgICAgICAgICAgIDkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3VubGluayAgICAgICAgICAgICAgMTAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2V4ZWN2ICAgICAgICAgICAgICAgMTEgLyogU3VuT1MgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2NoZGlyICAgICAgICAgICAgICAgMTIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Nob3duCQkgMTMgLyogQ29tbW9uCQkJCQkgICAqLwotI2RlZmluZSBfX05SX21rbm9kICAgICAgICAgICAgICAgMTQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2NobW9kICAgICAgICAgICAgICAgMTUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xjaG93biAgICAgICAgICAgICAgMTYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2JyayAgICAgICAgICAgICAgICAgMTcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3BlcmZjdHIgICAgICAgICAgICAgMTggLyogUGVyZm9ybWFuY2UgY291bnRlciBvcGVyYXRpb25zICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xzZWVrICAgICAgICAgICAgICAgMTkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHBpZCAgICAgICAgICAgICAgMjAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2NhcGdldAkJIDIxIC8qIExpbnV4IFNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfY2Fwc2V0CQkgMjIgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KLSNkZWZpbmUgX19OUl9zZXR1aWQgICAgICAgICAgICAgIDIzIC8qIEltcGxlbWVudGVkIHZpYSBzZXRyZXVpZCBpbiBTdW5PUyAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR1aWQgICAgICAgICAgICAgIDI0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl92bXNwbGljZQkgICAgICAgICAyNSAvKiBFTk9TWVMgdW5kZXIgU3VuT1MJCQkgICAqLwotI2RlZmluZSBfX05SX3B0cmFjZSAgICAgICAgICAgICAgMjYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2FsYXJtICAgICAgICAgICAgICAgMjcgLyogSW1wbGVtZW50ZWQgdmlhIHNldGl0aW1lciBpbiBTdW5PUyAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCSAyOCAvKiBDb21tb24JCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfcGF1c2UgICAgICAgICAgICAgICAyOSAvKiBJcyBzaWdibG9jaygwKS0+c2lncGF1c2UoKSBpbiBTdW5PUyAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdXRpbWUgICAgICAgICAgICAgICAzMCAvKiBJbXBsZW1lbnRlZCB2aWEgdXRpbWVzKCkgdW5kZXIgU3VuT1MgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfbGNob3duMzIgICAgICAgICAzMSAgICBMaW51eCBzcGFyYzMyIHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfZmNob3duMzIgICAgICAgICAzMiAgICBMaW51eCBzcGFyYzMyIHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfYWNjZXNzICAgICAgICAgICAgICAzMyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfbmljZSAgICAgICAgICAgICAgICAzNCAvKiBJbXBsZW1lbnRlZCB2aWEgZ2V0L3NldHByaW9yaXR5KCkgaW4gU3VuT1MgICovCi0vKiAjZGVmaW5lIF9fTlJfY2hvd24zMiAgICAgICAgICAzNSAgICBMaW51eCBzcGFyYzMyIHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc3luYyAgICAgICAgICAgICAgICAzNiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfa2lsbCAgICAgICAgICAgICAgICAzNyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc3RhdCAgICAgICAgICAgICAgICAzOCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2VuZGZpbGUJCSAzOSAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLwotI2RlZmluZSBfX05SX2xzdGF0ICAgICAgICAgICAgICAgNDAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2R1cCAgICAgICAgICAgICAgICAgNDEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3BpcGUgICAgICAgICAgICAgICAgNDIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3RpbWVzICAgICAgICAgICAgICAgNDMgLyogSW1wbGVtZW50ZWQgdmlhIGdldHJ1c2FnZSgpIGluIFN1bk9TICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX2dldHVpZDMyICAgICAgICAgNDQgICAgTGludXggc3BhcmMzMiBzcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3Vtb3VudDIgICAgICAgICAgICAgNDUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldGdpZCAgICAgICAgICAgICAgNDYgLyogSW1wbGVtZW50ZWQgdmlhIHNldHJlZ2lkKCkgaW4gU3VuT1MgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGdpZCAgICAgICAgICAgICAgNDcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ25hbCAgICAgICAgICAgICAgNDggLyogSW1wbGVtZW50ZWQgdmlhIHNpZ3ZlYygpIGluIFN1bk9TICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGV1aWQgICAgICAgICAgICAgNDkgLyogU3VuT1MgY2FsbHMgZ2V0dWlkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGVnaWQgICAgICAgICAgICAgNTAgLyogU3VuT1MgY2FsbHMgZ2V0Z2lkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2FjY3QgICAgICAgICAgICAgICAgNTEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX21lbW9yeV9vcmRlcmluZwkgNTIgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KLS8qICNkZWZpbmUgX19OUl9nZXRnaWQzMiAgICAgICAgIDUzICAgIExpbnV4IHNwYXJjMzIgc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pb2N0bCAgICAgICAgICAgICAgIDU0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWJvb3QgICAgICAgICAgICAgIDU1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9tbWFwMgkJIDU2ICAgIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zeW1saW5rICAgICAgICAgICAgIDU3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWFkbGluayAgICAgICAgICAgIDU4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9leGVjdmUgICAgICAgICAgICAgIDU5IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl91bWFzayAgICAgICAgICAgICAgIDYwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9jaHJvb3QgICAgICAgICAgICAgIDYxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mc3RhdCAgICAgICAgICAgICAgIDYyIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mc3RhdDY0ICAgICAgICAgICAgIDYzIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRwYWdlc2l6ZSAgICAgICAgIDY0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tc3luYyAgICAgICAgICAgICAgIDY1IC8qIENvbW1vbiBpbiBuZXdlciAxLjMueCByZXZzLi4uICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl92Zm9yayAgICAgICAgICAgICAgIDY2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wcmVhZDY0ICAgICAgICAgICAgIDY3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wd3JpdGU2NCAgICAgICAgICAgIDY4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9nZXRldWlkMzIgICAgICAgIDY5ICAgIExpbnV4IHNwYXJjMzIsIHNicmsgdW5kZXIgU3VuT1MgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9nZXRlZ2lkMzIgICAgICAgIDcwICAgIExpbnV4IHNwYXJjMzIsIHNzdGsgdW5kZXIgU3VuT1MgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tbWFwICAgICAgICAgICAgICAgIDcxIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9zZXRyZXVpZDMyICAgICAgIDcyICAgIExpbnV4IHNwYXJjMzIsIHZhZHZpc2UgdW5kZXIgU3VuT1MgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tdW5tYXAgICAgICAgICAgICAgIDczIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tcHJvdGVjdCAgICAgICAgICAgIDc0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9tYWR2aXNlICAgICAgICAgICAgIDc1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl92aGFuZ3VwICAgICAgICAgICAgIDc2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl90cnVuY2F0ZTY0ICAgICAgIDc3ICAgIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMJCQkgICAqLwotI2RlZmluZSBfX05SX21pbmNvcmUgICAgICAgICAgICAgNzggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGdyb3VwcyAgICAgICAgICAgNzkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldGdyb3VwcyAgICAgICAgICAgODAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHBncnAgICAgICAgICAgICAgODEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX3NldGdyb3VwczMyICAgICAgODIgICAgTGludXggc3BhcmMzMiwgc2V0cGdycCB1bmRlciBTdW5PUyAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldGl0aW1lciAgICAgICAgICAgODMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX2Z0cnVuY2F0ZTY0ICAgICAgODQgICAgTGludXggc3BhcmMzMiBTcGVjaWZpYwkJCSAgICovCi0jZGVmaW5lIF9fTlJfc3dhcG9uICAgICAgICAgICAgICA4NSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0aXRpbWVyICAgICAgICAgICA4NiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfc2V0dWlkMzIgICAgICAgICA4NyAgICBMaW51eCBzcGFyYzMyLCBnZXRob3N0bmFtZSB1bmRlciBTdW5PUyAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUgICAgICAgICA4OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfc2V0Z2lkMzIgICAgICAgICA4OSAgICBMaW51eCBzcGFyYzMyLCBnZXRkdGFibGVzaXplIHVuZGVyIFN1bk9TICAgICovCi0jZGVmaW5lIF9fTlJfZHVwMiAgICAgICAgICAgICAgICA5MCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfc2V0ZnN1aWQzMiAgICAgICA5MSAgICBMaW51eCBzcGFyYzMyLCBnZXRkb3B0IHVuZGVyIFN1bk9TICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZmNudGwgICAgICAgICAgICAgICA5MiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2VsZWN0ICAgICAgICAgICAgICA5MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfc2V0ZnNnaWQzMiAgICAgICA5NCAgICBMaW51eCBzcGFyYzMyLCBzZXRkb3B0IHVuZGVyIFN1bk9TICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN5bmMgICAgICAgICAgICAgICA5NSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkgICAgICAgICA5NiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc29ja2V0ICAgICAgICAgICAgICA5NyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfY29ubmVjdCAgICAgICAgICAgICA5OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfYWNjZXB0ICAgICAgICAgICAgICA5OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkgICAgICAgIDEwMCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuICAgICAgIDEwMSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uICAgICAgIDEwMiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sgICAgIDEwMyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZyAgICAgIDEwNCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0ICAgIDEwNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvICAgIDEwNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZCAgICAgIDEwNyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0cmVzdWlkICAgICAgICAgIDEwOCAvKiBMaW51eCBTcGVjaWZpYywgc2lndmVjIHVuZGVyIFN1bk9TCSAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cmVzdWlkICAgICAgICAgIDEwOSAvKiBMaW51eCBTcGVjaWZpYywgc2lnYmxvY2sgdW5kZXIgU3VuT1MJICAgKi8KLSNkZWZpbmUgX19OUl9zZXRyZXNnaWQgICAgICAgICAgMTEwIC8qIExpbnV4IFNwZWNpZmljLCBzaWdzZXRtYXNrIHVuZGVyIFN1bk9TCSAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkICAgICAgICAgIDExMSAvKiBMaW51eCBTcGVjaWZpYywgc2lncGF1c2UgdW5kZXIgU3VuT1MJICAgKi8KLS8qICNkZWZpbmUgX19OUl9zZXRyZWdpZDMyICAgICAgIDc1ICAgIExpbnV4IHNwYXJjMzIsIHNpZ3N0YWNrIHVuZGVyIFN1bk9TICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9yZWN2bXNnICAgICAgICAgICAgMTEzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9zZW5kbXNnICAgICAgICAgICAgMTE0IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9nZXRncm91cHMzMiAgICAgMTE1ICAgIExpbnV4IHNwYXJjMzIsIHZ0cmFjZSB1bmRlciBTdW5PUyAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkgICAgICAgMTE2IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRydXNhZ2UgICAgICAgICAgMTE3IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0ICAgICAgICAgMTE4IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRjd2QJCTExOSAvKiBMaW51eCBTcGVjaWZpYwkJCQkgICAqLwotI2RlZmluZSBfX05SX3JlYWR2ICAgICAgICAgICAgICAxMjAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3dyaXRldiAgICAgICAgICAgICAxMjEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHRpbWVvZmRheSAgICAgICAxMjIgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaG93biAgICAgICAgICAgICAxMjMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaG1vZCAgICAgICAgICAgICAxMjQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlY3Zmcm9tICAgICAgICAgICAxMjUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJldWlkICAgICAgICAgICAxMjYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJlZ2lkICAgICAgICAgICAxMjcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlbmFtZSAgICAgICAgICAgICAxMjggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3RydW5jYXRlICAgICAgICAgICAxMjkgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Z0cnVuY2F0ZSAgICAgICAgICAxMzAgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Zsb2NrICAgICAgICAgICAgICAxMzEgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xzdGF0NjQJCTEzMiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2VuZHRvICAgICAgICAgICAgIDEzMyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2h1dGRvd24gICAgICAgICAgIDEzNCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc29ja2V0cGFpciAgICAgICAgIDEzNSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfbWtkaXIgICAgICAgICAgICAgIDEzNiAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcm1kaXIgICAgICAgICAgICAgIDEzNyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdXRpbWVzICAgICAgICAgICAgIDEzOCAvKiBTdW5PUyBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc3RhdDY0CQkxMzkgLyogTGludXggU3BlY2lmaWMJCQkgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCAgICAgICAgIDE0MCAvKiBhZGp0aW1lIHVuZGVyIFN1bk9TICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUgICAgICAgIDE0MSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnV0ZXggICAgICAgICAgICAgIDE0MiAvKiBnZXRob3N0aWQgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0dGlkICAgICAgICAgICAgIDE0MyAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0cmxpbWl0CQkxNDQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHJsaW1pdCAgICAgICAgICAxNDUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCTE0NiAvKiBMaW51eCBTcGVjaWZpYywga2lsbHBnIHVuZGVyIFN1bk9TICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcHJjdGwJCTE0NyAvKiBFTk9TWVMgdW5kZXIgU3VuT1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfcGNpY29uZmlnX3JlYWQJMTQ4IC8qIEVOT1NZUyB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wY2ljb25maWdfd3JpdGUJMTQ5IC8qIEVOT1NZUyB1bmRlciBTdW5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRzb2NrbmFtZSAgICAgICAgMTUwIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQgICAgICAgMTUxIC8qIExpbnV4IHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaCAgMTUyIC8qIExpbnV4IHNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9wb2xsICAgICAgICAgICAgICAgMTUzIC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkxNTQgLyogTGludXggc3BlY2lmaWMJCQkJICAgKi8KLS8qICNkZWZpbmUgX19OUl9mY250bDY0ICAgICAgICAgMTU1ICAgIExpbnV4IHNwYXJjMzIgU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoICAgMTU2IC8qIExpbnV4IHNwZWNpZmljCQkJCSAgICovCi0jZGVmaW5lIF9fTlJfc3RhdGZzICAgICAgICAgICAgIDE1NyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN0YXRmcyAgICAgICAgICAgIDE1OCAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdW1vdW50ICAgICAgICAgICAgIDE1OSAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0X2FmZmluaXR5IDE2MCAvKiBMaW51eCBzcGVjaWZpYywgYXN5bmNfZGFlbW9uIHVuZGVyIFN1bk9TICAgICovCi0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X2FmZmluaXR5IDE2MSAvKiBMaW51eCBzcGVjaWZpYywgZ2V0ZmggdW5kZXIgU3VuT1MgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZ2V0ZG9tYWlubmFtZSAgICAgIDE2MiAvKiBTdW5PUyBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZSAgICAgIDE2MyAvKiBDb21tb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfdXRyYXBfaW5zdGFsbAkxNjQgLyogU1lTViBBQkkvdjkgcmVxdWlyZWQJCQkgICAqLwotI2RlZmluZSBfX05SX3F1b3RhY3RsICAgICAgICAgICAxNjUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcyAgICAxNjYgLyogTGludXggc3BlY2lmaWMsIGV4cG9ydGZzIHVuZGVyIFN1bk9TICAgICAgICAqLwotI2RlZmluZSBfX05SX21vdW50ICAgICAgICAgICAgICAxNjcgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3VzdGF0ICAgICAgICAgICAgICAxNjggLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHhhdHRyICAgICAgICAgICAxNjkgLyogU3VuT1M6IHNlbXN5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xzZXR4YXR0ciAgICAgICAgICAxNzAgLyogU3VuT1M6IG1zZ3N5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZzZXR4YXR0ciAgICAgICAgICAxNzEgLyogU3VuT1M6IHNobXN5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHhhdHRyICAgICAgICAgICAxNzIgLyogU3VuT1M6IGF1ZGl0c3lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xnZXR4YXR0ciAgICAgICAgICAxNzMgLyogU3VuT1M6IHJmc3N5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldGRlbnRzICAgICAgICAgICAxNzQgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldHNpZCAgICAgICAgICAgICAxNzUgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZjaGRpciAgICAgICAgICAgICAxNzYgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZnZXR4YXR0ciAgICAgICAgICAxNzcgLyogU3VuT1M6IGZjaHJvb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xpc3R4YXR0ciAgICAgICAgICAxNzggLyogU3VuT1M6IHZwaXhzeXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xsaXN0eGF0dHIgICAgICAgICAxNzkgLyogU3VuT1M6IGFpb3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIgICAgICAgICAxODAgLyogU3VuT1M6IGFpb3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyICAgICAgICAxODEgLyogU3VuT1M6IGFpb3dhaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xyZW1vdmV4YXR0ciAgICAgICAxODIgLyogU3VuT1M6IGFpb2NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ3BlbmRpbmcgICAgICAgICAxODMgLyogQ29tbW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxODQgLyogTGludXggU3BlY2lmaWMJCQkJICAgKi8KLSNkZWZpbmUgX19OUl9zZXRwZ2lkICAgICAgICAgICAgMTg1IC8qIENvbW1vbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIgICAgICAgMTg2IC8qIFN1bk9TOiBwYXRoY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl90a2lsbCAgICAgICAgICAgICAgMTg3IC8qIFN1bk9TOiBmcGF0aGNvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19OUl9leGl0X2dyb3VwCQkxODggLyogTGludXggc3BlY2lmaWMsIHN5c2NvbmYgdW5kZWYgU3VuT1MgICAgICAgICAqLwotI2RlZmluZSBfX05SX3VuYW1lICAgICAgICAgICAgICAxODkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2luaXRfbW9kdWxlICAgICAgICAxOTAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5ICAgICAgICAxOTEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMgICAxOTIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAgICAgICAxOTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAgICAgICAgICAxOTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQgICAgICAgICAxOTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2lvcHJpb19zZXQgICAgICAgICAxOTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHBwaWQgICAgICAgICAgICAxOTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ2FjdGlvbiAgICAgICAgICAxOTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NnZXRtYXNrICAgICAgICAgICAxOTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NzZXRtYXNrICAgICAgICAgICAyMDAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ3N1c3BlbmQgICAgICAgICAyMDEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX29sZGxzdGF0ICAgICAgICAgICAyMDIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3VzZWxpYiAgICAgICAgICAgICAyMDMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlYWRkaXIgICAgICAgICAgICAyMDQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3JlYWRhaGVhZCAgICAgICAgICAyMDUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NvY2tldGNhbGwgICAgICAgICAyMDYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N5c2xvZyAgICAgICAgICAgICAyMDcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llICAgICAyMDggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZhZHZpc2U2NCAgICAgICAgICAyMDkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2ZhZHZpc2U2NF82NCAgICAgICAyMTAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3Rna2lsbCAgICAgICAgICAgICAyMTEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3dhaXRwaWQgICAgICAgICAgICAyMTIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N3YXBvZmYgICAgICAgICAgICAyMTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N5c2luZm8gICAgICAgICAgICAyMTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2lwYyAgICAgICAgICAgICAgICAyMTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ3JldHVybiAgICAgICAgICAyMTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Nsb25lICAgICAgICAgICAgICAyMTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2lvcHJpb19nZXQgICAgICAgICAyMTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2FkanRpbWV4ICAgICAgICAgICAyMTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrICAgICAgICAyMjAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUgICAgICAyMjEgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUgICAgICAyMjIgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcyAgICAyMjMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2dldHBnaWQgICAgICAgICAgICAyMjQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2JkZmx1c2ggICAgICAgICAgICAyMjUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3N5c2ZzICAgICAgICAgICAgICAyMjYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsICAgICAgICAyMjcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldGZzdWlkICAgICAgICAgICAyMjggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX3NldGZzZ2lkICAgICAgICAgICAyMjkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfX05SX19uZXdzZWxlY3QgICAgICAgICAyMzAgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgX19OUl90aW1lCQkyMzEgLyogTGludXggc3BhcmMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmCi0jZGVmaW5lIF9fTlJfc3BsaWNlICAgICAgICAgICAgIDIzMiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc3RpbWUgICAgICAgICAgICAgIDIzMyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfc3RhdGZzNjQgICAgICAgICAgIDIzNCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfZnN0YXRmczY0ICAgICAgICAgIDIzNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfX2xsc2VlayAgICAgICAgICAgIDIzNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIF9fTlJfbWxvY2sgICAgICAgICAgICAgIDIzNwotI2RlZmluZSBfX05SX211bmxvY2sgICAgICAgICAgICAyMzgKLSNkZWZpbmUgX19OUl9tbG9ja2FsbCAgICAgICAgICAgMjM5Ci0jZGVmaW5lIF9fTlJfbXVubG9ja2FsbCAgICAgICAgIDI0MAotI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtICAgICAyNDEKLSNkZWZpbmUgX19OUl9zY2hlZF9nZXRwYXJhbSAgICAgMjQyCi0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyIDI0MwotI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlciAyNDQKLSNkZWZpbmUgX19OUl9zY2hlZF95aWVsZCAgICAgICAgMjQ1Ci0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAyNDYKLSNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluIDI0NwotI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbCAgMjQ4Ci0jZGVmaW5lIF9fTlJfbmFub3NsZWVwICAgICAgICAgIDI0OQotI2RlZmluZSBfX05SX21yZW1hcCAgICAgICAgICAgICAyNTAKLSNkZWZpbmUgX19OUl9fc3lzY3RsICAgICAgICAgICAgMjUxCi0jZGVmaW5lIF9fTlJfZ2V0c2lkICAgICAgICAgICAgIDI1MgotI2RlZmluZSBfX05SX2ZkYXRhc3luYyAgICAgICAgICAyNTMKLSNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsICAgICAgICAgMjU0Ci0jZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTI1NQotI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUJMjU2Ci0jZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZQkyNTcKLSNkZWZpbmUgX19OUl9jbG9ja19nZXRyZXMJMjU4Ci0jZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwCTI1OQotI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5CTI2MAotI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5CTI2MQotI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUJMjYyCi0jZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZQkyNjMKLSNkZWZpbmUgX19OUl90aW1lcl9nZXRvdmVycnVuCTI2NAotI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZQkyNjUKLSNkZWZpbmUgX19OUl90aW1lcl9jcmVhdGUJMjY2Ci0vKiAjZGVmaW5lIF9fTlJfdnNlcnZlcgkJMjY3IFJlc2VydmVkIGZvciBWU0VSVkVSICovCi0jZGVmaW5lIF9fTlJfaW9fc2V0dXAJCTI2OAotI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCTI2OQotI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJMjcwCi0jZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkyNzEKLSNkZWZpbmUgX19OUl9pb19nZXRldmVudHMJMjcyCi0jZGVmaW5lIF9fTlJfbXFfb3BlbgkJMjczCi0jZGVmaW5lIF9fTlJfbXFfdW5saW5rCQkyNzQKLSNkZWZpbmUgX19OUl9tcV90aW1lZHNlbmQJMjc1Ci0jZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlCTI3NgotI2RlZmluZSBfX05SX21xX25vdGlmeQkJMjc3Ci0jZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0cgkyNzgKLSNkZWZpbmUgX19OUl93YWl0aWQJCTI3OQotI2RlZmluZSBfX05SX3RlZQkJMjgwCi0jZGVmaW5lIF9fTlJfYWRkX2tleQkJMjgxCi0jZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjgyCi0jZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODMKLSNkZWZpbmUgX19OUl9vcGVuYXQJCTI4NAotI2RlZmluZSBfX05SX21rZGlyYXQJCTI4NQotI2RlZmluZSBfX05SX21rbm9kYXQJCTI4NgotI2RlZmluZSBfX05SX2ZjaG93bmF0CQkyODcKLSNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCTI4OAotI2RlZmluZSBfX05SX2ZzdGF0YXQ2NAkJMjg5Ci0jZGVmaW5lIF9fTlJfdW5saW5rYXQJCTI5MAotI2RlZmluZSBfX05SX3JlbmFtZWF0CQkyOTEKLSNkZWZpbmUgX19OUl9saW5rYXQJCTI5MgotI2RlZmluZSBfX05SX3N5bWxpbmthdAkJMjkzCi0jZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJMjk0Ci0jZGVmaW5lIF9fTlJfZmNobW9kYXQJCTI5NQotI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJMjk2Ci0jZGVmaW5lIF9fTlJfcHNlbGVjdDYJCTI5NwotI2RlZmluZSBfX05SX3Bwb2xsCQkyOTgKLSNkZWZpbmUgX19OUl91bnNoYXJlCQkyOTkKLSNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzAwCi0jZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTMwMQotI2RlZmluZSBfX05SX21pZ3JhdGVfcGFnZXMJMzAyCi0jZGVmaW5lIF9fTlJfbWJpbmQJCTMwMwotI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJMzA0Ci0jZGVmaW5lIF9fTlJfc2V0X21lbXBvbGljeQkzMDUKLSNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkzMDYKLSNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMDcKLSNkZWZpbmUgX19OUl9nZXRjcHUJCTMwOAotI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMwOQotI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzEwCi0jZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMxMQotI2RlZmluZSBfX05SX3RpbWVyZmRfY3JlYXRlCTMxMgotI2RlZmluZSBfX05SX2V2ZW50ZmQJCTMxMwotI2RlZmluZSBfX05SX2ZhbGxvY2F0ZQkJMzE0Ci0jZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lCTMxNQotI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkzMTYKLSNkZWZpbmUgX19OUl9zaWduYWxmZDQJCTMxNwotI2RlZmluZSBfX05SX2V2ZW50ZmQyCQkzMTgKLSNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUxCTMxOQotI2RlZmluZSBfX05SX2R1cDMJCTMyMAotI2RlZmluZSBfX05SX3BpcGUyCQkzMjEKLSNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCTMyMgotI2RlZmluZSBfX05SX2FjY2VwdDQJCTMyMwotCi0jZGVmaW5lIE5SX1NZU0NBTExTCQkzMjQKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KLSNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0Ci0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSwotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCi0jZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1dBSVRQSUQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUUEdSUAotI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19OSUNFCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19PTERVTU9VTlQKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKLSNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCi0jZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECi0jZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUlRfU0lHU1VTUEVORAotCi0vKgotICogIkNvbmRpdGlvbmFsIiBzeXNjYWxscwotICoKLSAqIFdoYXQgd2Ugd2FudCBpcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSksCi0gKiBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGFsbCB0b29sY2hhaW5zLCBzbyB3ZSBqdXN0IGRvIGl0IGJ5IGhhbmQKLSAqLwotI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgYXNtKCIud2Vha1x0IiAjeCAiXG5cdC5zZXRcdCIgI3ggIixzeXNfbmlfc3lzY2FsbCIpCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX1NQQVJDNjRfVU5JU1REX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsLy5naXRpZ25vcmUgYi9hcmNoL3NwYXJjL2tlcm5lbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjY3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3ZtbGludXgubGRzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCmluZGV4IDJkNjU4MjAuLjUzYWRjYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL01ha2VmaWxlCkBAIC0yLDI1ICsyLDk4IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCi1leHRyYS15CQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKK2FzZmxhZ3MteSA6PSAtYW5zaQorY2NmbGFncy15IDo9IC1XZXJyb3IKIAotRVhUUkFfQUZMQUdTCTo9IC1hbnNpCitleHRyYS15ICAgICA6PSBoZWFkXyQoQklUUykubworZXh0cmEteSAgICAgKz0gaW5pdF90YXNrLm8KK2V4dHJhLXkgICAgICs9IHZtbGludXgubGRzCiAKLUlSUV9PQkpTIDo9IGlycS5vIHN1bjRtX2lycS5vIHN1bjRjX2lycS5vIHN1bjRkX2lycS5vCi1vYmoteSAgICA6PSBlbnRyeS5vIHdvZi5vIHd1Zi5vIGV0cmFwLm8gcnRyYXAubyB0cmFwcy5vICQoSVJRX09CSlMpIFwKLQkgICAgcHJvY2Vzcy5vIHNpZ25hbC5vIGlvcG9ydC5vIHNldHVwLm8gaWRwcm9tLm8gXAotCSAgICBzeXNfc3BhcmMubyBzeXN0YmxzLm8gXAotCSAgICB0aW1lLm8gd2luZG93cy5vIGNwdS5vIGRldmljZXMubyBcCi0JICAgIHRhZHBvbGUubyB0aWNrMTQubyBwdHJhY2UubyBcCi0JICAgIHVuYWxpZ25lZC5vIHVuYV9hc20ubyBtdWxkaXYubyBcCi0JICAgIHByb20ubyBvZl9kZXZpY2UubyBkZXZyZXMubyBkbWEubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gZW50cnkubyB3b2YubyB3dWYubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gZXRyYXBfMzIubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gcnRyYXBfMzIubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gdHJhcHNfJChCSVRTKS5vCiAKLWRldnJlcy15ID0gLi4vLi4vLi4va2VybmVsL2lycS9kZXZyZXMubworIyBJUlEKK29iai15ICAgICAgICAgICAgICAgICAgICs9IGlycV8kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IHN1bjRtX2lycS5vIHN1bjRjX2lycS5vIHN1bjRkX2lycS5vCiAKLW9iai0kKENPTkZJR19QQ0kpICs9IHBjaWMubwotb2JqLSQoQ09ORklHX1NNUCkgKz0gdHJhbXBvbGluZS5vIHNtcC5vIHN1bjRtX3NtcC5vIHN1bjRkX3NtcC5vCi1vYmotJChDT05GSUdfU1VOX0FVWElPKSArPSBhdXhpby5vCi1vYmotJChDT05GSUdfU1VOX1BNKSArPSBhcGMubyBwbWMubwotb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vIHNwYXJjX2tzeW1zLm8KLW9iai0kKENPTkZJR19TUEFSQ19MRUQpICs9IGxlZC5vCi1vYmotJChDT05GSUdfS0dEQikgKz0ga2dkYi5vCitvYmoteSAgICAgICAgICAgICAgICAgICArPSBwcm9jZXNzXyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gc2lnbmFsXyQoQklUUykubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gaW9wb3J0Lm8KK29iai15ICAgICAgICAgICAgICAgICAgICs9IHNldHVwXyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gaWRwcm9tLm8KK29iai15ICAgICAgICAgICAgICAgICAgICs9IHN5c19zcGFyY18kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IHN5c3RibHNfMzIubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gdGltZV8kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IHdpbmRvd3Mubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gY3B1Lm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IGRldmljZXMubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gdGFkcG9sZS5vCitvYmotJChDT05GSUdfU1BBUkMzMikgICArPSB0aWNrMTQubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gcHRyYWNlXyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gdW5hbGlnbmVkXyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gdW5hX2FzbV8kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IG11bGRpdi5vCitvYmoteSAgICAgICAgICAgICAgICAgICArPSBwcm9tX2NvbW1vbi5vCitvYmoteSAgICAgICAgICAgICAgICAgICArPSBwcm9tXyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gb2ZfZGV2aWNlXyQoQklUUykubworb2JqLSQoQ09ORklHX1NQQVJDNjQpICAgKz0gcHJvbV9pcnF0cmFucy5vCisKK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHJlYm9vdC5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSBzeXNmcy5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSBpb21tdS5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSBjZW50cmFsLm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHN0YXJmaXJlLm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHBvd2VyLm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHNidXMubworb2JqLSQoQ09ORklHX1NQQVJDNjQpICAgKz0gZWJ1cy5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSB2aXNlbXVsLm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IGh2YXBpLm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHNzdGF0ZS5vCitvYmotJChDT05GSUdfU1BBUkM2NCkgICArPSBtZGVzYy5vCisKKyMgc3BhcmMzMiBkbyBub3QgdXNlIEdFTkVSSUNfSEFSRElSUVMgYnV0IHVzZXMgdGhlIGdlbmVyaWMgZGV2cmVzIGltcGxlbWVudGF0aW9uCitvYmotJChDT05GSUdfU1BBUkMzMikgICAgICs9IGRldnJlcy5vCitkZXZyZXMteSAgICAgICAgICAgICAgICAgIDo9IC4uLy4uLy4uL2tlcm5lbC9pcnEvZGV2cmVzLm8KKworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgICArPSBkbWEubworCitvYmotJChDT05GSUdfU1BBUkMzMl9QQ0kpICs9IHBjaWMubworCitvYmotJChDT05GSUdfU01QKSAgICAgICAgICs9IHRyYW1wb2xpbmVfJChCSVRTKS5vIHNtcF8kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyX1NNUCkgKz0gc3VuNG1fc21wLm8gc3VuNGRfc21wLm8KK29iai0kKENPTkZJR19TUEFSQzY0X1NNUCkgKz0gaHZ0cmFtcC5vCisKK29iai15ICAgICAgICAgICAgICAgICAgICAgKz0gYXV4aW9fJChCSVRTKS5vCitvYmotJChDT05GSUdfU1VOX1BNKSAgICAgICs9IGFwYy5vIHBtYy5vCisKK29iai0kKENPTkZJR19NT0RVTEVTKSAgICAgKz0gbW9kdWxlLm8KK29iai0kKENPTkZJR19NT0RVTEVTKSAgICAgKz0gc3BhcmNfa3N5bXNfJChCSVRTKS5vCitvYmotJChDT05GSUdfU1BBUkNfTEVEKSAgICs9IGxlZC5vCitvYmotJChDT05GSUdfS0dEQikgICAgICAgICs9IGtnZGJfJChCSVRTKS5vCisKKworb2JqLSQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKSArPSBmdHJhY2UubworQ0ZMQUdTX1JFTU9WRV9mdHJhY2UubyA6PSAtcGcKKworb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpICAgICArPSBzdGFja3RyYWNlLm8KKyMgc3BhcmM2NCBQQ0kKK29iai0kKENPTkZJR19TUEFSQzY0X1BDSSkgICAgKz0gcGNpLm8gcGNpX2NvbW1vbi5vIHBzeWNob19jb21tb24ubworb2JqLSQoQ09ORklHX1NQQVJDNjRfUENJKSAgICArPSBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vCitvYmotJChDT05GSUdfU1BBUkM2NF9QQ0kpICAgICs9IHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCitvYmotJChDT05GSUdfUENJX01TSSkgICAgICAgICs9IHBjaV9tc2kubworCitvYmotJChDT05GSUdfQ09NUEFUKSAgICAgICAgICs9IHN5czMyLm8gc3lzX3NwYXJjMzIubyBzaWduYWwzMi5vCisKKyMgc3BhcmM2NCBjcHVmcmVxCitvYmotJChDT05GSUdfVVMzX0ZSRVEpICArPSB1czNfY3B1ZnJlcS5vCitvYmotJChDT05GSUdfVVMyRV9GUkVRKSArPSB1czJlX2NwdWZyZXEubworb2JqLSQoQ09ORklHX1VTM19NQykgICAgKz0gY2htYy5vCisKK29iai0kKENPTkZJR19LUFJPQkVTKSAgICs9IGtwcm9iZXMubworb2JqLSQoQ09ORklHX1NVTl9MRE9NUykgKz0gbGRjLm8gdmlvLm8gdmlvaHMubyBkcy5vCisKK29iai0kKENPTkZJR19BVURJVCkgICAgICs9IGF1ZGl0Lm8KK2F1ZGl0LS0kKENPTkZJR19BVURJVCkgIDo9IGNvbXBhdF9hdWRpdC5vCitvYmotJChDT05GSUdfQ09NUEFUKSAgICArPSAkKGF1ZGl0LS15KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYjViYjk5ZS4uNjhmN2UxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xNCwxNSArMTQsMjggQEAKIC8vICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tidWlsZC5oPgogCi1pbnQgZm9vKHZvaWQpCisjaWZkZWYgQ09ORklHX1NQQVJDMzIKK2ludCBzcGFyYzMyX2Zvbyh2b2lkKQogewotCURFRklORShBT0ZGX3Rhc2tfdGhyZWFkLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZCkpOwotCUJMQU5LKCk7CiAJREVGSU5FKEFPRkZfdGhyZWFkX2Zvcmtfa3BzciwKIAkJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBmb3JrX2twc3IpKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitpbnQgc3BhcmM2NF9mb28odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgZm9vKHZvaWQpCit7CisJQkxBTksoKTsKKwlERUZJTkUoQU9GRl90YXNrX3RocmVhZCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQpKTsKIAlCTEFOSygpOwogCURFRklORShBT0ZGX21tX2NvbnRleHQsIG9mZnNldG9mKHN0cnVjdCBtbV9zdHJ1Y3QsIGNvbnRleHQpKTsKIAogCS8qIERFRklORShOVU1fVVNFUl9TRUdNRU5UUywgVEFTS19TSVpFPj4yOCk7ICovCiAJcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXVkaXQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1ZGl0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvYXVkaXQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvYXVkaXQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW8uYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL2F1eGlvLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzY0LmMKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9hdXhpb182NC5jCmluZGV4IDg1OGJlZGEuLjhiNjczNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb182NC5jCkBAIC0yNyw3MyArMjcsNTUgQEAKIHN0YXRpYyBlbnVtIGF1eGlvX3R5cGUgYXV4aW9fZGV2dHlwZSA9IEFVWElPX1RZUEVfTk9ERVY7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGF1eGlvX2xvY2spOwogCi1zdGF0aWMgdm9pZCBfX2F1eGlvX3NidXNfc2V0KHU4IGJpdHNfb24sIHU4IGJpdHNfb2ZmKQorc3RhdGljIHZvaWQgX19hdXhpb19ybXcodTggYml0c19vbiwgdTggYml0c19vZmYsIGludCBlYnVzKQogewogCWlmIChhdXhpb19yZWdpc3RlcikgewotCQl1bnNpZ25lZCBjaGFyIHJlZ3ZhbDsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJdW5zaWduZWQgY2hhciBuZXd2YWw7CisJCXU4IHJlZ3ZhbCwgbmV3dmFsOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhdXhpb19sb2NrLCBmbGFncyk7CiAKLQkJcmVndmFsID0gIHNidXNfcmVhZGIoYXV4aW9fcmVnaXN0ZXIpOworCQlyZWd2YWwgPSAoZWJ1cyA/CisJCQkgICh1OCkgcmVhZGwoYXV4aW9fcmVnaXN0ZXIpIDoKKwkJCSAgc2J1c19yZWFkYihhdXhpb19yZWdpc3RlcikpOwogCQluZXd2YWwgPSAgcmVndmFsIHwgYml0c19vbjsKIAkJbmV3dmFsICY9IH5iaXRzX29mZjsKLQkJbmV3dmFsICY9IH5BVVhJT19BVVgxX01BU0s7Ci0JCXNidXNfd3JpdGViKG5ld3ZhbCwgYXV4aW9fcmVnaXN0ZXIpOworCQlpZiAoIWVidXMpCisJCQluZXd2YWwgJj0gfkFVWElPX0FVWDFfTUFTSzsKKwkJaWYgKGVidXMpCisJCQl3cml0ZWwoKHUzMikgbmV3dmFsLCBhdXhpb19yZWdpc3Rlcik7CisJCWVsc2UKKwkJCXNidXNfd3JpdGViKG5ld3ZhbCwgYXV4aW9fcmVnaXN0ZXIpOwogCQkKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXV4aW9fbG9jaywgZmxhZ3MpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19hdXhpb19lYnVzX3NldCh1OCBiaXRzX29uLCB1OCBiaXRzX29mZikKK3N0YXRpYyB2b2lkIF9fYXV4aW9fc2V0X2JpdCh1OCBiaXQsIGludCBvbiwgaW50IGVidXMpCiB7Ci0JaWYgKGF1eGlvX3JlZ2lzdGVyKSB7Ci0JCXVuc2lnbmVkIGNoYXIgcmVndmFsOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQl1bnNpZ25lZCBjaGFyIG5ld3ZhbDsKKwl1OCBiaXRzX29uID0gKGVidXMgPyBBVVhJT19QQ0lPX0xFRCA6IEFVWElPX0FVWDFfTEVEKTsKKwl1OCBiaXRzX29mZiA9IDA7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1eGlvX2xvY2ssIGZsYWdzKTsKLQotCQlyZWd2YWwgPSAgKHU4KXJlYWRsKGF1eGlvX3JlZ2lzdGVyKTsKLQkJbmV3dmFsID0gIHJlZ3ZhbCB8IGJpdHNfb247Ci0JCW5ld3ZhbCAmPSB+Yml0c19vZmY7Ci0JCXdyaXRlbCgodTMyKW5ld3ZhbCwgYXV4aW9fcmVnaXN0ZXIpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1eGlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoIW9uKSB7CisJCXU4IHRtcCA9IGJpdHNfb2ZmOworCQliaXRzX29mZiA9IGJpdHNfb247CisJCWJpdHNfb24gPSB0bXA7CiAJfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdXhpb19lYnVzX3NldF9sZWQoaW50IG9uKQotewotCShvbikgPyBfX2F1eGlvX2VidXNfc2V0KEFVWElPX1BDSU9fTEVELCAwKSA6Ci0JCV9fYXV4aW9fZWJ1c19zZXQoMCwgQVVYSU9fUENJT19MRUQpIDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYXV4aW9fc2J1c19zZXRfbGVkKGludCBvbikKLXsKLQkob24pID8gX19hdXhpb19zYnVzX3NldChBVVhJT19BVVgxX0xFRCwgMCkgOgotCQlfX2F1eGlvX3NidXNfc2V0KDAsIEFVWElPX0FVWDFfTEVEKSA7CisJX19hdXhpb19ybXcoYml0c19vbiwgYml0c19vZmYsIGVidXMpOwogfQogCiB2b2lkIGF1eGlvX3NldF9sZWQoaW50IG9uKQogewotCXN3aXRjaChhdXhpb19kZXZ0eXBlKSB7Ci0JY2FzZSBBVVhJT19UWVBFX1NCVVM6Ci0JCV9fYXV4aW9fc2J1c19zZXRfbGVkKG9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVhJT19UWVBFX0VCVVM6Ci0JCV9fYXV4aW9fZWJ1c19zZXRfbGVkKG9uKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCWludCBlYnVzID0gYXV4aW9fZGV2dHlwZSA9PSBBVVhJT19UWVBFX0VCVVM7CisJdTggYml0OworCisJYml0ID0gKGVidXMgPyBBVVhJT19QQ0lPX0xFRCA6IEFVWElPX0FVWDFfTEVEKTsKKwlfX2F1eGlvX3NldF9iaXQoYml0LCBvbiwgZWJ1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F1eGlvX3NidXNfc2V0X2x0ZShpbnQgb24pCitzdGF0aWMgdm9pZCBfX2F1eGlvX3NidXNfc2V0X2x0ZShpbnQgb24pCiB7Ci0JKG9uKSA/IF9fYXV4aW9fc2J1c19zZXQoQVVYSU9fQVVYMV9MVEUsIDApIDogCi0JCV9fYXV4aW9fc2J1c19zZXQoMCwgQVVYSU9fQVVYMV9MVEUpIDsKKwlfX2F1eGlvX3NldF9iaXQoQVVYSU9fQVVYMV9MVEUsIG9uLCAwKTsKIH0KIAogdm9pZCBhdXhpb19zZXRfbHRlKGludCBvbikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2VudHJhbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvY2VudHJhbC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2NoZXJycy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2hlcnJzLlMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9jaGVycnMuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvY2hlcnJzLlMKaW5kZXggODlhZmViZC4uNGVlMWFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaGVycnMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9jaGVycnMuUwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJLnR5cGUJCWRvX2NoZWV0YWhfcGx1c19kYXRhX3Bhcml0eSwjZnVuY3Rpb24KIGRvX2NoZWV0YWhfcGx1c19kYXRhX3Bhcml0eToKIAlyZHByCQklcGlsLCAlZzIKLQl3cnByCQklZzAsIDE1LCAlcGlsCisJd3JwcgkJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkudHlwZQkJZG9fY2hlZXRhaF9wbHVzX2luc25fcGFyaXR5LCNmdW5jdGlvbgogZG9fY2hlZXRhaF9wbHVzX2luc25fcGFyaXR5OgogCXJkcHIJCSVwaWwsICVnMgotCXdycHIJCSVnMCwgMTUsICVwaWwKKwl3cnByCQklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAJYmEscHQJCSV4Y2MsIGV0cmFwX2lycQogCSByZAkJJXBjLCAlZzcKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCS50eXBlCQljX2Zhc3RfZWNjLCNmdW5jdGlvbgogY19mYXN0X2VjYzoKIAlyZHByCQklcGlsLCAlZzIKLQl3cnByCQklZzAsIDE1LCAlcGlsCisJd3JwcgkJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCkBAIC01MjgsNyArNTI4LDcgQEAKIAkudHlwZQkJY19jZWUsI2Z1bmN0aW9uCiBjX2NlZToKIAlyZHByCQklcGlsLCAlZzIKLQl3cnByCQklZzAsIDE1LCAlcGlsCisJd3JwcgkJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCkBAIC01NjQsNyArNTY0LDcgQEAKIAkudHlwZQkJY19kZWZlcnJlZCwjZnVuY3Rpb24KIGNfZGVmZXJyZWQ6CiAJcmRwcgkJJXBpbCwgJWcyCi0Jd3JwcgkJJWcwLCAxNSwgJXBpbAorCXdycHIJCSVnMCwgUElMX05PUk1BTF9NQVgsICVwaWwKIAliYSxwdAkJJXhjYywgZXRyYXBfaXJxCiAJIHJkCQklcGMsICVnNwogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9jaG1jLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY29tcGF0X2F1ZGl0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9jb21wYXRfYXVkaXQuYwpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2NvbXBhdF9hdWRpdC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9jb21wYXRfYXVkaXQuYwppbmRleCBjODMxYjBhLi5kODY1NTc1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2NvbXBhdF9hdWRpdC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2NvbXBhdF9hdWRpdC5jCkBAIC0xLDQgKzEsNSBAQAotI2luY2x1ZGUgPGFzbS91bmlzdGRfMzIuaD4KKyNkZWZpbmUgX18zMmJpdF9zeXNjYWxsX251bWJlcnNfXworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogdW5zaWduZWQgc3BhcmMzMl9kaXJfY2xhc3NbXSA9IHsKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9kaXJfd3JpdGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NwdS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKaW5kZXggMWZjMTdmNS4uNmMyZGEyNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKworI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2hlYWQuaD4KQEAgLTE1LDE1MyArMTcsMzIyIEBACiAjaW5jbHVkZSA8YXNtL21idXMuaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgogCisjaW5jbHVkZSAia2VybmVsLmgiCisKIERFRklORV9QRVJfQ1BVKGNwdWluZm9fc3BhcmMsIF9fY3B1X2RhdGEpID0geyAwIH07CiAKLXN0cnVjdCBjcHVfaXVfaW5mbyB7Ci0gIGludCBwc3JfaW1wbDsKLSAgaW50IHBzcl92ZXJzOwotICBjaGFyKiBjcHVfbmFtZTsgICAvKiBzaG91bGQgYmUgZW5vdWdoIEkgaG9wZS4uLiAqLworc3RydWN0IGNwdV9pbmZvIHsKKwlpbnQgcHNyX3ZlcnM7CisJY29uc3QgY2hhciAqbmFtZTsKIH07CiAKLXN0cnVjdCBjcHVfZnBfaW5mbyB7Ci0gIGludCBwc3JfaW1wbDsKLSAgaW50IGZwX3ZlcnM7Ci0gIGNoYXIqIGZwX25hbWU7CitzdHJ1Y3QgZnB1X2luZm8geworCWludCBmcF92ZXJzOworCWNvbnN0IGNoYXIgKm5hbWU7CiB9OwogCisjZGVmaW5lIE5PQ1BVIDgKKyNkZWZpbmUgTk9GUFUgOAorCitzdHJ1Y3QgbWFudWZhY3R1cmVyX2luZm8geworCWludCBwc3JfaW1wbDsKKwlzdHJ1Y3QgY3B1X2luZm8gY3B1X2luZm9bTk9DUFVdOworCXN0cnVjdCBmcHVfaW5mbyBmcHVfaW5mb1tOT0ZQVV07Cit9OworCisjZGVmaW5lIENQVSh2ZXIsIF9uYW1lKSBcCit7IC5wc3JfdmVycyA9IHZlciwgLm5hbWUgPSBfbmFtZSB9CisKKyNkZWZpbmUgRlBVKHZlciwgX25hbWUpIFwKK3sgLmZwX3ZlcnMgPSB2ZXIsIC5uYW1lID0gX25hbWUgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hbnVmYWN0dXJlcl9pbmZvIF9faW5pdGNvbnN0IG1hbnVmYWN0dXJlcl9pbmZvW10gPSB7Cit7CisJMCwKKwkvKiBTdW40LzEwMCwgNC8yMDAsIFNMQyAqLworCS5jcHVfaW5mbyA9IHsKKwkJQ1BVKDAsICJGdWppdHN1ICBNQjg2OTAwLzFBIG9yIExTSSBMNjQ4MzEgU3BhcmNLSVQtNDAiKSwKKwkJLyogYm9ybmVkIFNUUDEwMTJQR0EgKi8KKwkJQ1BVKDQsICAiRnVqaXRzdSAgTUI4NjkwNCIpLAorCQlDUFUoNSwgIkZ1aml0c3UgVHVyYm9TcGFyYyBNQjg2OTA3IiksCisJCUNQVSgtMSwgTlVMTCkKKwl9LAorCS5mcHVfaW5mbyA9IHsKKwkJRlBVKDAsICJGdWppdHN1IE1CODY5MTAgb3IgV2VpdGVrIFdUTDExNjQvNSIpLAorCQlGUFUoMSwgIkZ1aml0c3UgTUI4NjkxMSBvciBXZWl0ZWsgV1RMMTE2NC81IG9yIExTSSBMNjQ4MzEiKSwKKwkJRlBVKDIsICJMU0kgTG9naWMgTDY0ODAyIG9yIFRleGFzIEluc3RydW1lbnRzIEFDVDg4NDciKSwKKwkJLyogU3BhcmNTdGF0aW9uIFNMQywgU3BhcmNTdGF0aW9uMSAqLworCQlGUFUoMywgIldlaXRlayBXVEwzMTcwLzIiKSwKKwkJLyogU1BBUkNzdGF0aW9uLTUgKi8KKwkJRlBVKDQsICJMc2kgTG9naWMvTWVpa28gTDY0ODA0IG9yIGNvbXBhdGlibGUiKSwKKwkJRlBVKC0xLCBOVUxMKQorCX0KK30seworCTEsCisJLmNwdV9pbmZvID0geworCQkvKiBTcGFyY1N0YXRpb24yLCBTcGFyY1NlcnZlciA0OTAgJiA2OTAgKi8KKwkJQ1BVKDAsICJMU0kgTG9naWMgQ29ycG9yYXRpb24gLSBMNjQ4MTEiKSwKKwkJLyogU3BhcmNTdGF0aW9uMiAqLworCQlDUFUoMSwgIkN5cHJlc3MvUk9TUyBDWTdDNjAxIiksCisJCS8qIEVtYmVkZGVkIGNvbnRyb2xsZXIgKi8KKwkJQ1BVKDMsICJDeXByZXNzL1JPU1MgQ1k3QzYxMSIpLAorCQkvKiBSb3NzIFRlY2hub2xvZ2llcyBIeXBlclNwYXJjICovCisJCUNQVSgweGYsICJST1NTIEh5cGVyU3BhcmMgUlQ2MjAiKSwKKwkJQ1BVKDB4ZSwgIlJPU1MgSHlwZXJTcGFyYyBSVDYyNSBvciBSVDYyNiIpLAorCQlDUFUoLTEsIE5VTEwpCisJfSwKKwkuZnB1X2luZm8gPSB7CisJCUZQVSgwLCAiUk9TUyBIeXBlclNwYXJjIGNvbWJpbmVkIElVL0ZQVSIpLAorCQlGUFUoMSwgIkxzaSBMb2dpYyBMNjQ4MTQiKSwKKwkJRlBVKDIsICJUZXhhcyBJbnN0cnVtZW50cyBUTVMzOTAtQzYwMkEiKSwKKwkJRlBVKDMsICJDeXByZXNzIENZN0M2MDIgRlBVIiksCisJCUZQVSgtMSwgTlVMTCkKKwl9Cit9LHsKKwkyLAorCS5jcHVfaW5mbyA9IHsKKwkJLyogRUNMIEltcGxlbWVudGF0aW9uLCBDUkFZIFMtTVAgU3VwZXJjb21wdXRlci4uLiBBSUVFRSEgKi8KKwkJLyogU29tZW9uZSBwbGVhc2Ugd3JpdGUgdGhlIGNvZGUgdG8gc3VwcG9ydCB0aGlzIGJlYXN0ISA7KSAqLworCQlDUFUoMCwgIkJpcG9sYXIgSW50ZWdyYXRlZCBUZWNobm9sb2d5IC0gQjUwMTAiKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJMywKKwkuY3B1X2luZm8gPSB7CisJCUNQVSgwLCAiTFNJIExvZ2ljIENvcnBvcmF0aW9uIC0gdW5rbm93bi10eXBlIiksCisJCUNQVSgtMSwgTlVMTCkKKwl9LAorCS5mcHVfaW5mbyA9IHsKKwkJRlBVKC0xLCBOVUxMKQorCX0KK30seworCTQsCisJLmNwdV9pbmZvID0geworCQlDUFUoMCwgIlRleGFzIEluc3RydW1lbnRzLCBJbmMuIC0gU3VwZXJTcGFyYy0oSUkpIiksCisJCS8qIFNwYXJjQ2xhc3NpYyAgLS0gIGJvcm5lZCBTVFAxMDEwVEFCLTUwKi8KKwkJQ1BVKDEsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIE1pY3JvU3BhcmMiKSwKKwkJQ1BVKDIsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIE1pY3JvU3BhcmMgSUkiKSwKKwkJQ1BVKDMsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIFN1cGVyU3BhcmMgNTEiKSwKKwkJQ1BVKDQsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIFN1cGVyU3BhcmMgNjEiKSwKKwkJQ1BVKDUsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIHVua25vd24iKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQkvKiBTdXBlclNwYXJjIDUwIG1vZHVsZSAqLworCQlGUFUoMCwgIlN1cGVyU3BhcmMgb24tY2hpcCBGUFUiKSwKKwkJLyogU3BhcmNDbGFzc2ljICovCisJCUZQVSg0LCAiVEkgTWljcm9TcGFyYyBvbiBjaGlwIEZQVSIpLAorCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJNSwKKwkuY3B1X2luZm8gPSB7CisJCUNQVSgwLCAiTWF0c3VzaGl0YSAtIE1OMTA1MDEiKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoMCwgIk1hdHN1c2hpdGEgTU4xMDUwMSIpLAorCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJNiwKKwkuY3B1X2luZm8gPSB7CisJCUNQVSgwLCAiUGhpbGlwcyBDb3Jwb3JhdGlvbiAtIHVua25vd24iKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJNywKKwkuY3B1X2luZm8gPSB7CisJCUNQVSgwLCAiSGFydmVzdCBWTFNJIERlc2lnbiBDZW50ZXIsIEluYy4gLSB1bmtub3duIiksCisJCUNQVSgtMSwgTlVMTCkKKwl9LAorCS5mcHVfaW5mbyA9IHsKKwkJRlBVKC0xLCBOVUxMKQorCX0KK30seworCTgsCisJLmNwdV9pbmZvID0geworCQlDUFUoMCwgIlN5c3RlbXMgYW5kIFByb2Nlc3NlcyBFbmdpbmVlcmluZyBDb3Jwb3JhdGlvbiAoU1BFQykiKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJOSwKKwkuY3B1X2luZm8gPSB7CisJCS8qIEdhbGxpdW0gYXJzZW5pZGUgMjAwTUh6LCBCT09PT0dPT09PTUlQUyEhISAqLworCQlDUFUoMCwgIkZ1aml0c3Ugb3IgV2VpdGVrIFBvd2VyLVVQIiksCisJCUNQVSgxLCAiRnVqaXRzdSBvciBXZWl0ZWsgUG93ZXItVVAiKSwKKwkJQ1BVKDIsICJGdWppdHN1IG9yIFdlaXRlayBQb3dlci1VUCIpLAorCQlDUFUoMywgIkZ1aml0c3Ugb3IgV2VpdGVrIFBvd2VyLVVQIiksCisJCUNQVSgtMSwgTlVMTCkKKwl9LAorCS5mcHVfaW5mbyA9IHsKKwkJRlBVKDMsICJGdWppdHN1IG9yIFdlaXRlayBvbi1jaGlwIEZQVSIpLAorCQlGUFUoLTEsIE5VTEwpCisJfQorfSx7CisJMHgxNywKKwkuY3B1X2luZm8gPSB7CisJCUNQVSgweDEwLCAiVEkgVWx0cmFTcGFyYyBJICAgKFNwaXRGaXJlKSIpLAorCQlDUFUoMHgxMSwgIlRJIFVsdHJhU3BhcmMgSUkgIChCbGFja0JpcmQpIiksCisJCUNQVSgweDEyLCAiVEkgVWx0cmFTcGFyYyBJSWkgKFNhYnJlKSIpLAorCQlDUFUoMHgxMywgIlRJIFVsdHJhU3BhcmMgSUllIChIdW1taW5nYmlyZCkiKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoMHgxMCwgIlVsdHJhU3BhcmMgSSBpbnRlZ3JhdGVkIEZQVSIpLAorCQlGUFUoMHgxMSwgIlVsdHJhU3BhcmMgSUkgaW50ZWdyYXRlZCBGUFUiKSwKKwkJRlBVKDB4MTIsICJVbHRyYVNwYXJjIElJaSBpbnRlZ3JhdGVkIEZQVSIpLAorCQlGUFUoMHgxMywgIlVsdHJhU3BhcmMgSUllIGludGVncmF0ZWQgRlBVIiksCisJCUZQVSgtMSwgTlVMTCkKKwl9Cit9LHsKKwkweDIyLAorCS5jcHVfaW5mbyA9IHsKKwkJQ1BVKDB4MTAsICJUSSBVbHRyYVNwYXJjIEkgICAoU3BpdEZpcmUpIiksCisJCUNQVSgtMSwgTlVMTCkKKwl9LAorCS5mcHVfaW5mbyA9IHsKKwkJRlBVKDB4MTAsICJVbHRyYVNwYXJjIEkgaW50ZWdyYXRlZCBGUFUiKSwKKwkJRlBVKC0xLCBOVUxMKQorCX0KK30seworCTB4M2UsCisJLmNwdV9pbmZvID0geworCQlDUFUoMHgxNCwgIlRJIFVsdHJhU3BhcmMgSUlJIChDaGVldGFoKSIpLAorCQlDUFUoMHgxNSwgIlRJIFVsdHJhU3BhcmMgSUlJKyAoQ2hlZXRhaCspIiksCisJCUNQVSgweDE2LCAiVEkgVWx0cmFTcGFyYyBJSUlpIChKYWxhcGVubykiKSwKKwkJQ1BVKDB4MTgsICJUSSBVbHRyYVNwYXJjIElWIChKYWd1YXIpIiksCisJCUNQVSgweDE5LCAiVEkgVWx0cmFTcGFyYyBJVisgKFBhbnRoZXIpIiksCisJCUNQVSgweDIyLCAiVEkgVWx0cmFTcGFyYyBJSUlpKyAoU2VycmFubykiKSwKKwkJQ1BVKC0xLCBOVUxMKQorCX0sCisJLmZwdV9pbmZvID0geworCQlGUFUoMHgxNCwgIlVsdHJhU3BhcmMgSUlJIGludGVncmF0ZWQgRlBVIiksCisJCUZQVSgweDE1LCAiVWx0cmFTcGFyYyBJSUkrIGludGVncmF0ZWQgRlBVIiksCisJCUZQVSgweDE2LCAiVWx0cmFTcGFyYyBJSUlpIGludGVncmF0ZWQgRlBVIiksCisJCUZQVSgweDE4LCAiVWx0cmFTcGFyYyBJViBpbnRlZ3JhdGVkIEZQVSIpLAorCQlGUFUoMHgxOSwgIlVsdHJhU3BhcmMgSVYrIGludGVncmF0ZWQgRlBVIiksCisJCUZQVSgweDIyLCAiVWx0cmFTcGFyYyBJSUlpKyBpbnRlZ3JhdGVkIEZQVSIpLAorCQlGUFUoLTEsIE5VTEwpCisJfQorfX07CisKIC8qIEluIG9yZGVyIHRvIGdldCB0aGUgZnB1IHR5cGUgY29ycmVjdCwgeW91IG5lZWQgdG8gdGFrZSB0aGUgSURQUk9NJ3MKICAqIG1hY2hpbmUgdHlwZSB2YWx1ZSBpbnRvIGNvbnNpZGVyYXRpb24gdG9vLiAgSSB3aWxsIGZpeCB0aGlzLgogICovCi1zdGF0aWMgc3RydWN0IGNwdV9mcF9pbmZvIGxpbnV4X3NwYXJjX2ZwdVtdID0gewotICB7IDAsIDAsICJGdWppdHN1IE1CODY5MTAgb3IgV2VpdGVrIFdUTDExNjQvNSJ9LAotICB7IDAsIDEsICJGdWppdHN1IE1CODY5MTEgb3IgV2VpdGVrIFdUTDExNjQvNSBvciBMU0kgTDY0ODMxIn0sCi0gIHsgMCwgMiwgIkxTSSBMb2dpYyBMNjQ4MDIgb3IgVGV4YXMgSW5zdHJ1bWVudHMgQUNUODg0NyJ9LAotICAvKiBTcGFyY1N0YXRpb24gU0xDLCBTcGFyY1N0YXRpb24xICovCi0gIHsgMCwgMywgIldlaXRlayBXVEwzMTcwLzIifSwKLSAgLyogU1BBUkNzdGF0aW9uLTUgKi8KLSAgeyAwLCA0LCAiTHNpIExvZ2ljL01laWtvIEw2NDgwNCBvciBjb21wYXRpYmxlIn0sCi0gIHsgMCwgNSwgInJlc2VydmVkIn0sCi0gIHsgMCwgNiwgInJlc2VydmVkIn0sCi0gIHsgMCwgNywgIk5vIEZQVSJ9LAotICB7IDEsIDAsICJST1NTIEh5cGVyU3BhcmMgY29tYmluZWQgSVUvRlBVIn0sCi0gIHsgMSwgMSwgIkxzaSBMb2dpYyBMNjQ4MTQifSwKLSAgeyAxLCAyLCAiVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzkwLUM2MDJBIn0sCi0gIHsgMSwgMywgIkN5cHJlc3MgQ1k3QzYwMiBGUFUifSwKLSAgeyAxLCA0LCAicmVzZXJ2ZWQifSwKLSAgeyAxLCA1LCAicmVzZXJ2ZWQifSwKLSAgeyAxLCA2LCAicmVzZXJ2ZWQifSwKLSAgeyAxLCA3LCAiTm8gRlBVIn0sCi0gIHsgMiwgMCwgIkJJVCBCNTAxMCBvciBCNTExMC8yMCBvciBCNTIxMCJ9LAotICB7IDIsIDEsICJyZXNlcnZlZCJ9LAotICB7IDIsIDIsICJyZXNlcnZlZCJ9LAotICB7IDIsIDMsICJyZXNlcnZlZCJ9LAotICB7IDIsIDQsICJyZXNlcnZlZCJ9LAotICB7IDIsIDUsICJyZXNlcnZlZCJ9LAotICB7IDIsIDYsICJyZXNlcnZlZCJ9LAotICB7IDIsIDcsICJObyBGUFUifSwKLSAgLyogU3VwZXJTcGFyYyA1MCBtb2R1bGUgKi8KLSAgeyA0LCAwLCAiU3VwZXJTcGFyYyBvbi1jaGlwIEZQVSJ9LAotICAvKiBTcGFyY0NsYXNzaWMgKi8KLSAgeyA0LCA0LCAiVEkgTWljcm9TcGFyYyBvbiBjaGlwIEZQVSJ9LAotICB7IDUsIDAsICJNYXRzdXNoaXRhIE1OMTA1MDEifSwKLSAgeyA1LCAxLCAicmVzZXJ2ZWQifSwKLSAgeyA1LCAyLCAicmVzZXJ2ZWQifSwKLSAgeyA1LCAzLCAicmVzZXJ2ZWQifSwKLSAgeyA1LCA0LCAicmVzZXJ2ZWQifSwKLSAgeyA1LCA1LCAicmVzZXJ2ZWQifSwKLSAgeyA1LCA2LCAicmVzZXJ2ZWQifSwKLSAgeyA1LCA3LCAiTm8gRlBVIn0sCi0gIHsgOSwgMywgIkZ1aml0c3Ugb3IgV2VpdGVrIG9uLWNoaXAgRlBVIn0sCi19OwogCi0jZGVmaW5lIE5TUEFSQ0ZQVSAgQVJSQVlfU0laRShsaW51eF9zcGFyY19mcHUpCi0KLXN0YXRpYyBzdHJ1Y3QgY3B1X2l1X2luZm8gbGludXhfc3BhcmNfY2hpcHNbXSA9IHsKLSAgLyogU3VuNC8xMDAsIDQvMjAwLCBTTEMgKi8KLSAgeyAwLCAwLCAiRnVqaXRzdSAgTUI4NjkwMC8xQSBvciBMU0kgTDY0ODMxIFNwYXJjS0lULTQwIn0sCi0gIC8qIGJvcm5lZCBTVFAxMDEyUEdBICovCi0gIHsgMCwgNCwgIkZ1aml0c3UgIE1CODY5MDQifSwKLSAgeyAwLCA1LCAiRnVqaXRzdSBUdXJib1NwYXJjIE1CODY5MDcifSwKLSAgLyogU3BhcmNTdGF0aW9uMiwgU3BhcmNTZXJ2ZXIgNDkwICYgNjkwICovCi0gIHsgMSwgMCwgIkxTSSBMb2dpYyBDb3Jwb3JhdGlvbiAtIEw2NDgxMSJ9LAotICAvKiBTcGFyY1N0YXRpb24yICovCi0gIHsgMSwgMSwgIkN5cHJlc3MvUk9TUyBDWTdDNjAxIn0sCi0gIC8qIEVtYmVkZGVkIGNvbnRyb2xsZXIgKi8KLSAgeyAxLCAzLCAiQ3lwcmVzcy9ST1NTIENZN0M2MTEifSwKLSAgLyogUm9zcyBUZWNobm9sb2dpZXMgSHlwZXJTcGFyYyAqLwotICB7IDEsIDB4ZiwgIlJPU1MgSHlwZXJTcGFyYyBSVDYyMCJ9LAotICB7IDEsIDB4ZSwgIlJPU1MgSHlwZXJTcGFyYyBSVDYyNSBvciBSVDYyNiJ9LAotICAvKiBFQ0wgSW1wbGVtZW50YXRpb24sIENSQVkgUy1NUCBTdXBlcmNvbXB1dGVyLi4uIEFJRUVFISAqLwotICAvKiBTb21lb25lIHBsZWFzZSB3cml0ZSB0aGUgY29kZSB0byBzdXBwb3J0IHRoaXMgYmVhc3QhIDspICovCi0gIHsgMiwgMCwgIkJpcG9sYXIgSW50ZWdyYXRlZCBUZWNobm9sb2d5IC0gQjUwMTAifSwKLSAgeyAzLCAwLCAiTFNJIExvZ2ljIENvcnBvcmF0aW9uIC0gdW5rbm93bi10eXBlIn0sCi0gIHsgNCwgMCwgIlRleGFzIEluc3RydW1lbnRzLCBJbmMuIC0gU3VwZXJTcGFyYy0oSUkpIn0sCi0gIC8qIFNwYXJjQ2xhc3NpYyAgLS0gIGJvcm5lZCBTVFAxMDEwVEFCLTUwKi8KLSAgeyA0LCAxLCAiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4gLSBNaWNyb1NwYXJjIn0sCi0gIHsgNCwgMiwgIlRleGFzIEluc3RydW1lbnRzLCBJbmMuIC0gTWljcm9TcGFyYyBJSSJ9LAotICB7IDQsIDMsICJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAtIFN1cGVyU3BhcmMgNTEifSwKLSAgeyA0LCA0LCAiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4gLSBTdXBlclNwYXJjIDYxIn0sCi0gIHsgNCwgNSwgIlRleGFzIEluc3RydW1lbnRzLCBJbmMuIC0gdW5rbm93biJ9LAotICB7IDUsIDAsICJNYXRzdXNoaXRhIC0gTU4xMDUwMSJ9LAotICB7IDYsIDAsICJQaGlsaXBzIENvcnBvcmF0aW9uIC0gdW5rbm93biJ9LAotICB7IDcsIDAsICJIYXJ2ZXN0IFZMU0kgRGVzaWduIENlbnRlciwgSW5jLiAtIHVua25vd24ifSwKLSAgLyogR2FsbGl1bSBhcnNlbmlkZSAyMDBNSHosIEJPT09PR09PT09NSVBTISEhICovCi0gIHsgOCwgMCwgIlN5c3RlbXMgYW5kIFByb2Nlc3NlcyBFbmdpbmVlcmluZyBDb3Jwb3JhdGlvbiAoU1BFQykifSwKLSAgeyA5LCAwLCAiRnVqaXRzdSBvciBXZWl0ZWsgUG93ZXItVVAifSwKLSAgeyA5LCAxLCAiRnVqaXRzdSBvciBXZWl0ZWsgUG93ZXItVVAifSwKLSAgeyA5LCAyLCAiRnVqaXRzdSBvciBXZWl0ZWsgUG93ZXItVVAifSwKLSAgeyA5LCAzLCAiRnVqaXRzdSBvciBXZWl0ZWsgUG93ZXItVVAifSwKLSAgeyAweGEsIDAsICJVTktOT1dOIENQVS1WRU5ET1IvVFlQRSJ9LAotICB7IDB4YiwgMCwgIlVOS05PV04gQ1BVLVZFTkRPUi9UWVBFIn0sCi0gIHsgMHhjLCAwLCAiVU5LTk9XTiBDUFUtVkVORE9SL1RZUEUifSwKLSAgeyAweGQsIDAsICJVTktOT1dOIENQVS1WRU5ET1IvVFlQRSJ9LAotICB7IDB4ZSwgMCwgIlVOS05PV04gQ1BVLVZFTkRPUi9UWVBFIn0sCi0gIHsgMHhmLCAwLCAiVU5LTk9XTiBDUFUtVkVORE9SL1RZUEUifSwKLX07Ci0KLSNkZWZpbmUgTlNQQVJDQ0hJUFMgIEFSUkFZX1NJWkUobGludXhfc3BhcmNfY2hpcHMpCi0KLWNoYXIgKnNwYXJjX2NwdV90eXBlOwotY2hhciAqc3BhcmNfZnB1X3R5cGU7Citjb25zdCBjaGFyICpzcGFyY19jcHVfdHlwZTsKK2NvbnN0IGNoYXIgKnNwYXJjX2ZwdV90eXBlOwogCiB1bnNpZ25lZCBpbnQgZnNyX3N0b3JhZ2U7CiAKK3N0YXRpYyB2b2lkIHNldF9jcHVfYW5kX2ZwdShpbnQgcHNyX2ltcGwsIGludCBwc3JfdmVycywgaW50IGZwdV92ZXJzKQoreworCXNwYXJjX2NwdV90eXBlID0gTlVMTDsKKwlzcGFyY19mcHVfdHlwZSA9IE5VTEw7CisJaWYgKHBzcl9pbXBsIDwgQVJSQVlfU0laRShtYW51ZmFjdHVyZXJfaW5mbykpCisJeworCQljb25zdCBzdHJ1Y3QgY3B1X2luZm8gKmNwdTsKKwkJY29uc3Qgc3RydWN0IGZwdV9pbmZvICpmcHU7CisKKwkJY3B1ID0gJm1hbnVmYWN0dXJlcl9pbmZvW3Bzcl9pbXBsXS5jcHVfaW5mb1swXTsKKwkJd2hpbGUgKGNwdS0+cHNyX3ZlcnMgIT0gLTEpCisJCXsKKwkJCWlmIChjcHUtPnBzcl92ZXJzID09IHBzcl92ZXJzKSB7CisJCQkJc3BhcmNfY3B1X3R5cGUgPSBjcHUtPm5hbWU7CisJCQkJc3BhcmNfZnB1X3R5cGUgPSAiTm8gRlBVIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwdSsrOworCQl9CisJCWZwdSA9ICAmbWFudWZhY3R1cmVyX2luZm9bcHNyX2ltcGxdLmZwdV9pbmZvWzBdOworCQl3aGlsZSAoZnB1LT5mcF92ZXJzICE9IC0xKQorCQl7CisJCQlpZiAoZnB1LT5mcF92ZXJzID09IGZwdV92ZXJzKSB7CisJCQkJc3BhcmNfZnB1X3R5cGUgPSBmcHUtPm5hbWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmcHUrKzsKKwkJfQorCX0KKwlpZiAoc3BhcmNfY3B1X3R5cGUgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVOiBVbmtub3duIGNoaXAsIGltcGxbMHgleF0gdmVyc1sweCV4XVxuIiwKKwkJICAgICAgIHBzcl9pbXBsLCBwc3JfdmVycyk7CisJCXNwYXJjX2NwdV90eXBlID0gIlVua25vd24gQ1BVIjsKKwl9CisJaWYgKHNwYXJjX2ZwdV90eXBlID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkZQVTogVW5rbm93biBjaGlwLCBpbXBsWzB4JXhdIHZlcnNbMHgleF1cbiIsCisJCSAgICAgICBwc3JfaW1wbCwgZnB1X3ZlcnMpOworCQlzcGFyY19mcHVfdHlwZSA9ICJVbmtub3duIEZQVSI7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NQQVJDMzIKIHZvaWQgX19jcHVpbml0IGNwdV9wcm9iZSh2b2lkKQogewogCWludCBwc3JfaW1wbCwgcHNyX3ZlcnMsIGZwdV92ZXJzOwotCWludCBpLCBwc3I7CisJaW50IHBzcjsKIAotCXBzcl9pbXBsID0gKChnZXRfcHNyKCk+PjI4KSYweGYpOwotCXBzcl92ZXJzID0gKChnZXRfcHNyKCk+PjI0KSYweGYpOworCXBzcl9pbXBsID0gKChnZXRfcHNyKCkgPj4gMjgpICYgMHhmKTsKKwlwc3JfdmVycyA9ICgoZ2V0X3BzcigpID4+IDI0KSAmIDB4Zik7CiAKIAlwc3IgPSBnZXRfcHNyKCk7CiAJcHV0X3Bzcihwc3IgfCBQU1JfRUYpOwotCWZwdV92ZXJzID0gKChnZXRfZnNyKCk+PjE3KSYweDcpOworCWZwdV92ZXJzID0gKChnZXRfZnNyKCkgPj4gMTcpICYgMHg3KTsKIAlwdXRfcHNyKHBzcik7CiAKLQlmb3IoaSA9IDA7IGk8TlNQQVJDQ0hJUFM7IGkrKykgewotCQlpZihsaW51eF9zcGFyY19jaGlwc1tpXS5wc3JfaW1wbCA9PSBwc3JfaW1wbCkKLQkJCWlmKGxpbnV4X3NwYXJjX2NoaXBzW2ldLnBzcl92ZXJzID09IHBzcl92ZXJzKSB7Ci0JCQkJc3BhcmNfY3B1X3R5cGUgPSBsaW51eF9zcGFyY19jaGlwc1tpXS5jcHVfbmFtZTsKLQkJCQlicmVhazsKLQkJCX0KLQl9CisJc2V0X2NwdV9hbmRfZnB1KHBzcl9pbXBsLCBwc3JfdmVycywgZnB1X3ZlcnMpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW40dl9jcHVfcHJvYmUodm9pZCkKK3sKKwlzd2l0Y2ggKHN1bjR2X2NoaXBfdHlwZSkgeworCWNhc2UgU1VONFZfQ0hJUF9OSUFHQVJBMToKKwkJc3BhcmNfY3B1X3R5cGUgPSAiVWx0cmFTcGFyYyBUMSAoTmlhZ2FyYSkiOworCQlzcGFyY19mcHVfdHlwZSA9ICJVbHRyYVNwYXJjIFQxIGludGVncmF0ZWQgRlBVIjsKKwkJYnJlYWs7CiAKLQlpZihpPT1OU1BBUkNDSElQUykKLQkJcHJpbnRrKCJERUJVRzogcHNyLmltcGwgPSAweCV4ICAgcHNyLnZlcnMgPSAweCV4XG4iLCBwc3JfaW1wbCwgCi0JCQkgICAgcHNyX3ZlcnMpOworCWNhc2UgU1VONFZfQ0hJUF9OSUFHQVJBMjoKKwkJc3BhcmNfY3B1X3R5cGUgPSAiVWx0cmFTcGFyYyBUMiAoTmlhZ2FyYTIpIjsKKwkJc3BhcmNfZnB1X3R5cGUgPSAiVWx0cmFTcGFyYyBUMiBpbnRlZ3JhdGVkIEZQVSI7CisJCWJyZWFrOwogCi0JZm9yKGkgPSAwOyBpPE5TUEFSQ0ZQVTsgaSsrKSB7Ci0JCWlmKGxpbnV4X3NwYXJjX2ZwdVtpXS5wc3JfaW1wbCA9PSBwc3JfaW1wbCkKLQkJCWlmKGxpbnV4X3NwYXJjX2ZwdVtpXS5mcF92ZXJzID09IGZwdV92ZXJzKSB7Ci0JCQkJc3BhcmNfZnB1X3R5cGUgPSBsaW51eF9zcGFyY19mcHVbaV0uZnBfbmFtZTsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0KLQlpZihpID09IE5TUEFSQ0ZQVSkgewotCQlwcmludGsoIkRFQlVHOiBwc3IuaW1wbCA9IDB4JXggIGZzci52ZXJzID0gMHgleFxuIiwgcHNyX2ltcGwsCi0JCQkgICAgZnB1X3ZlcnMpOwotCQlzcGFyY19mcHVfdHlwZSA9IGxpbnV4X3NwYXJjX2ZwdVszMV0uZnBfbmFtZTsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJDUFU6IFVua25vd24gc3VuNHYgY3B1IHR5cGUgWyVzXVxuIiwKKwkJICAgICAgIHByb21fY3B1X2NvbXBhdGlibGUpOworCQlzcGFyY19jcHVfdHlwZSA9ICJVbmtub3duIFNVTjRWIENQVSI7CisJCXNwYXJjX2ZwdV90eXBlID0gIlVua25vd24gU1VONFYgRlBVIjsKKwkJYnJlYWs7CiAJfQogfQorCitzdGF0aWMgaW50IF9faW5pdCBjcHVfdHlwZV9wcm9iZSh2b2lkKQoreworCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CisJCXN1bjR2X2NwdV9wcm9iZSgpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdmVyOworCQlpbnQgbWFudWYsIGltcGw7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkcHIgJSV2ZXIsICUwIiA6ICI9ciIgKHZlcikpOworCisJCW1hbnVmID0gKCh2ZXIgPj4gNDgpICYgMHhmZmZmKTsKKwkJaW1wbCA9ICgodmVyID4+IDMyKSAmIDB4ZmZmZik7CisJCXNldF9jcHVfYW5kX2ZwdShtYW51ZiwgaW1wbCwgaW1wbCk7CisJfQorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGNwdV90eXBlX3Byb2JlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZGV2aWNlcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZGV2aWNlcy5jCmluZGV4IGFkNjU2YjAuLmIxNzFhZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RldmljZXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9kZXZpY2VzLmMKQEAgLTEzMywxNCArMTMzLDEyIEBACiAjZW5kaWYgLyogIUNPTkZJR19TTVAgKi8KIAogCWNwdV9wcm9iZSgpOwotI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIAl7CiAJCWV4dGVybiB2b2lkIGF1eGlvX3Byb2JlKHZvaWQpOwogCQlleHRlcm4gdm9pZCBhdXhpb19wb3dlcl9wcm9iZSh2b2lkKTsKIAkJYXV4aW9fcHJvYmUoKTsKIAkJYXV4aW9fcG93ZXJfcHJvYmUoKTsKIAl9Ci0jZW5kaWYKIAljbG9ja19zdG9wX3Byb2JlKCk7CiAKIAlpZiAoQVJDSF9TVU40QykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2RzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvZHMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX21pc3MuUyBiL2FyY2gvc3BhcmMva2VybmVsL2R0bGJfbWlzcy5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfbWlzcy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9kdGxiX21pc3MuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX3Byb3QuUyBiL2FyY2gvc3BhcmMva2VybmVsL2R0bGJfcHJvdC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfcHJvdC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9kdGxiX3Byb3QuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuaCBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LmgKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5oCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5oCmluZGV4IDM0ZDdhYjUuLjRmNTNhMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5oCkBAIC01LDkgKzUsNDMgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2NwdV90eXBlOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2ZwdV90eXBlOworLyogaXJxICovCitleHRlcm4gdm9pZCBoYW5kbGVyX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKKyNpZmRlZiBDT05GSUdfU1BBUkMzMgorLyogdHJhcHMgKi8KK2V4dGVybiB2b2lkIGRvX2h3X2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB0eXBlKTsKK2V4dGVybiB2b2lkIGRvX2lsbGVnYWxfaW5zdHJ1Y3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnBjLCB1bnNpZ25lZCBsb25nIHBzcik7CisKK2V4dGVybiB2b2lkIGRvX3ByaXZfaW5zdHJ1Y3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnBjLCB1bnNpZ25lZCBsb25nIHBzcik7CitleHRlcm4gdm9pZCBkb19tZW1hY2Nlc3NfdW5hbGlnbmVkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwc3IpOworZXh0ZXJuIHZvaWQgZG9fZnBkX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5wYywgdW5zaWduZWQgbG9uZyBwc3IpOworZXh0ZXJuIHZvaWQgZG9fZnBlX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5wYywgdW5zaWduZWQgbG9uZyBwc3IpOworZXh0ZXJuIHZvaWQgaGFuZGxlX3RhZ19vdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKK2V4dGVybiB2b2lkIGhhbmRsZV93YXRjaHBvaW50KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9yZWdfYWNjZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9jcF9kaXNhYmxlZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5wYywgdW5zaWduZWQgbG9uZyBwc3IpOworZXh0ZXJuIHZvaWQgaGFuZGxlX2NwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKKworCisKKy8qIGVudHJ5LlMgKi8KK2V4dGVybiB2b2lkIGZwc2F2ZSh1bnNpZ25lZCBsb25nICpmcHJlZ3MsIHVuc2lnbmVkIGxvbmcgKmZzciwKKyAgICAgICAgICAgICAgICAgICB2b2lkICpmcHF1ZXVlLCB1bnNpZ25lZCBsb25nICpmcHFkZXB0aCk7CitleHRlcm4gdm9pZCBmcGxvYWQodW5zaWduZWQgbG9uZyAqZnByZWdzLCB1bnNpZ25lZCBsb25nICpmc3IpOworCisjZWxzZSAvKiBDT05GSUdfU1BBUkMzMiAqLwogZXh0ZXJuIHZvaWQgX19pbml0IHBlcl9jcHVfcGF0Y2godm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgc3VuNHZfcGF0Y2godm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgYm9vdF9jcHVfaWRfdG9vX2xhcmdlKGludCBjcHUpOwpAQCAtMTg4LDggKzIyMiw4IEBACiBleHRlcm4gc3RydWN0IGlub19idWNrZXQgKml2ZWN0b3JfdGFibGU7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpdmVjdG9yX3RhYmxlX3BhOwogCi1leHRlcm4gdm9pZCBoYW5kbGVyX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBpbml0X2lycXdvcmtfY3VyY3B1KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19jcHVpbml0IHN1bjR2X3JlZ2lzdGVyX21vbmRvX3F1ZXVlcyhpbnQgdGhpc19jcHUpOwogCisjZW5kaWYgLyogQ09ORklHX1NQQVJDMzIgKi8KICNlbmRpZiAvKiBfRU5UUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZXRyYXAuUyBiL2FyY2gvc3BhcmMva2VybmVsL2V0cmFwXzMyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL2V0cmFwLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2V0cmFwXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZXRyYXAuUyBiL2FyY2gvc3BhcmMva2VybmVsL2V0cmFwXzY0LlMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9ldHJhcC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9ldHJhcF82NC5TCmluZGV4IDI5Y2U0ODkuLjc4NmIxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZXRyYXAuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9ldHJhcF82NC5TCkBAIC0xNiw5ICsxNiw5IEBACiAjaW5jbHVkZSA8YXNtL21tdS5oPgogCiAjZGVmaW5lCQlUQVNLX1JFR09GRgkJKFRIUkVBRF9TSVpFLVRSQUNFUkVHX1NaLVNUQUNLRlJBTUVfU1opCi0jZGVmaW5lCQlFVFJBUF9QU1RBVEUxCQkoUFNUQVRFX1JNTyB8IFBTVEFURV9QUklWKQorI2RlZmluZQkJRVRSQVBfUFNUQVRFMQkJKFBTVEFURV9UU08gfCBQU1RBVEVfUFJJVikKICNkZWZpbmUJCUVUUkFQX1BTVEFURTIJCVwKLQkJKFBTVEFURV9STU8gfCBQU1RBVEVfUEVGIHwgUFNUQVRFX1BSSVYgfCBQU1RBVEVfSUUpCisJCShQU1RBVEVfVFNPIHwgUFNUQVRFX1BFRiB8IFBTVEFURV9QUklWIHwgUFNUQVRFX0lFKQogCiAvKgogICogT24gZW50cnksICVnNyBpcyByZXR1cm4gYWRkcmVzcyAtIDB4NC4KQEAgLTEzMCw3ICsxMzAsNyBAQAogCQlzdHgJJWc2LCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0c2XQogCQlzdHgJJWc3LCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0c3XQogCQlvcgklbDcsICVsMCwgJWw3Ci0JCXNldGhpCSVoaShUU1RBVEVfUk1PIHwgVFNUQVRFX1BFRiksICVsMAorCQlzZXRoaQklaGkoVFNUQVRFX1RTTyB8IFRTVEFURV9QRUYpLCAlbDAKIAkJb3IJJWw3LCAlbDAsICVsNwogCQl3cnByCSVsMiwgJXRucGMKIAkJd3JwcgklbDcsIChUU1RBVEVfUFJJViB8IFRTVEFURV9JRSksICV0c3RhdGUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZnB1X3RyYXBzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9mcHVfdHJhcHMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9mcHVfdHJhcHMuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvZnB1X3RyYXBzLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9mdHJhY2UuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9mdHJhY2UuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvZnRyYWNlLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZ2V0c2V0Y2MuUyBiL2FyY2gvc3BhcmMva2VybmVsL2dldHNldGNjLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvZ2V0c2V0Y2MuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvZ2V0c2V0Y2MuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvaGVhZF8zMi5TCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL2hlYWQuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvaGVhZF8zMi5TCmluZGV4IDUxYjQwNDIuLmYwYjRiNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTk5MCw3ICs5OTAsNyBAQAogCiAJCS8qIFplcm8gb3V0IG91ciBCU1Mgc2VjdGlvbi4gKi8KIAkJc2V0CV9fYnNzX3N0YXJ0ICwgJW8wCSEgRmlyc3QgYWRkcmVzcyBvZiBCU1MKLQkJc2V0CWVuZCAsICVvMQkJISBMYXN0IGFkZHJlc3Mgb2YgQlNTCisJCXNldAlfZW5kICwgJW8xCQkhIExhc3QgYWRkcmVzcyBvZiBCU1MKIAkJYWRkCSVvMCwgMHgxLCAlbzAKIDE6CQogCQlzdGIJJWcwLCBbJW8wXQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9oZWFkXzY0LlMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2hlYWRfNjQuUwppbmRleCAzNTMyMjZmLi44ZmZlZTcxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTcwNiw3ICs3MDYsNyBAQAogCWFuZG4JJWwwLCBQU1RBVEVfSUUsICVvMQogCXdycHIJJW8xLCAweDAsICVwc3RhdGUKIAlyZHByCSVwaWwsICVsMQotCXdycHIJJWcwLCAxNSwgJXBpbAorCXdycHIJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCiAJLyogTWFrZSB0aGUgZmlybXdhcmUgY2FsbCB0byBqdW1wIG92ZXIgdG8gdGhlIExpbnV4IHRyYXAgdGFibGUuICAqLwogCXNldGhpCSVoaShpc19zdW40diksICVvMApAQCAtODI1LDggKzgyNSw4IEBACiAJIHJlc3RvcmUKIHNwYXJjNjRfYm9vdF9lbmQ6CiAKLSNpbmNsdWRlICJldHJhcC5TIgotI2luY2x1ZGUgInJ0cmFwLlMiCisjaW5jbHVkZSAiZXRyYXBfNjQuUyIKKyNpbmNsdWRlICJydHJhcF82NC5TIgogI2luY2x1ZGUgIndpbmZpeHVwLlMiCiAjaW5jbHVkZSAiZnB1X3RyYXBzLlMiCiAjaW5jbHVkZSAiaXZlYy5TIgpAQCAtODgyLDcgKzg4Miw3IEBACiAKICEgMHgwMDAwMDAwMDAwNDI4MDAwCiAKLSNpbmNsdWRlICJzeXN0YmxzLlMiCisjaW5jbHVkZSAic3lzdGJsc182NC5TIgogCiAJLmRhdGEKIAkuYWxpZ24JOApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWxwZXJzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9oZWxwZXJzLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvaGVscGVycy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9oZWxwZXJzLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZhcGkuYyBiL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvaHZhcGkuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvaHZhcGkuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9odmNhbGxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmNhbGxzLlMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9odmNhbGxzLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2h2Y2FsbHMuUwppbmRleCBlMDY2MjY5Li44YTVmMzVmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2Y2FsbHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmNhbGxzLlMKQEAgLTc2NiwzICs3NjYsMzUgQEAKIAlyZXRsCiAJIG5vcAogRU5EUFJPQyhzdW40dl9tbXVfZGVtYXBfYWxsKQorCitFTlRSWShzdW40dl9uaWFnYXJhX2dldHBlcmYpCisJbW92CSVvMCwgJW80CisJbW92CUhWX0ZBU1RfR0VUX1BFUkZSRUcsICVvNQorCXRhCUhWX0ZBU1RfVFJBUAorCXN0eAklbzEsIFslbzRdCisJcmV0bAorCSBub3AKK0VORFBST0Moc3VuNHZfbmlhZ2FyYV9nZXRwZXJmKQorCitFTlRSWShzdW40dl9uaWFnYXJhX3NldHBlcmYpCisJbW92CUhWX0ZBU1RfU0VUX1BFUkZSRUcsICVvNQorCXRhCUhWX0ZBU1RfVFJBUAorCXJldGwKKwkgbm9wCitFTkRQUk9DKHN1bjR2X25pYWdhcmFfc2V0cGVyZikKKworRU5UUlkoc3VuNHZfbmlhZ2FyYTJfZ2V0cGVyZikKKwltb3YJJW8wLCAlbzQKKwltb3YJSFZfRkFTVF9OMl9HRVRfUEVSRlJFRywgJW81CisJdGEJSFZfRkFTVF9UUkFQCisJc3R4CSVvMSwgWyVvNF0KKwlyZXRsCisJIG5vcAorRU5EUFJPQyhzdW40dl9uaWFnYXJhMl9nZXRwZXJmKQorCitFTlRSWShzdW40dl9uaWFnYXJhMl9zZXRwZXJmKQorCW1vdglIVl9GQVNUX04yX1NFVF9QRVJGUkVHLCAlbzUKKwl0YQlIVl9GQVNUX1RSQVAKKwlyZXRsCisJIG5vcAorRU5EUFJPQyhzdW40dl9uaWFnYXJhMl9zZXRwZXJmKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9odnRyYW1wLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odnRyYW1wLlMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9odnRyYW1wLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2h2dHJhbXAuUwppbmRleCAwMjM2YzQzLi45MzY1NDMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9odnRyYW1wLlMKQEAgLTEsNiArMSw2IEBACiAvKiBodnRyYW1wLlM6IEh5cGVydmlzb3Igc3RhcnQtY3B1IHRyYW1wb2xpbmUgY29kZS4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vaGVhZC5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KKyNpbmNsdWRlIDxhc20vcGlsLmg+CiAKIAlfX0NQVUlOSVQKIAkuYWxpZ24JCTgKQEAgLTMyLDcgKzMzLDcgQEAKIAkgKi8KIGh2X2NwdV9zdGFydHVwOgogCVNFVF9HTCgwKQotCXdycHIJCSVnMCwgMTUsICVwaWwKKwl3cnByCQklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAJd3JwcgkJJWcwLCAwLCAlY2FucmVzdG9yZQogCXdycHIJCSVnMCwgMCwgJW90aGVyd2luCiAJd3JwcgkJJWcwLCA2LCAlY2Fuc2F2ZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwppbmRleCAyMjNhNjU4Li5jMTYxMzVlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwpAQCAtMTEsMzUgKzExLDM3IEBACiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+ICAvKiBGdW4gd2l0aCBTdW4gcmVsZWFzZWQgYXJjaGl0ZWN0dXJlcy4gKi8KIAogc3RydWN0IGlkcHJvbSAqaWRwcm9tOwogc3RhdGljIHN0cnVjdCBpZHByb20gaWRwcm9tX2J1ZmZlcjsKIAorI2lmZGVmIENPTkZJR19TUEFSQzMyCisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+ICAvKiBGdW4gd2l0aCBTdW4gcmVsZWFzZWQgYXJjaGl0ZWN0dXJlcy4gKi8KKwogLyogSGVyZSBpcyB0aGUgbWFzdGVyIHRhYmxlIG9mIFN1biBtYWNoaW5lcyB3aGljaCB1c2Ugc29tZSBpbXBsZW1lbnRhdGlvbgogICogb2YgdGhlIFNwYXJjIENQVSBhbmQgaGF2ZSBhIG1lYW5pbmdmdWwgSURQUk9NIG1hY2h0eXBlIHZhbHVlIHRoYXQgd2UKICAqIGtub3cgYWJvdXQuICBTZWUgYXNtLXNwYXJjL21hY2hpbmVzLmggZm9yIGVtcGlyaWNhbCBjb25zdGFudHMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgU3VuX01hY2hpbmVfTW9kZWxzIFN1bl9NYWNoaW5lc1tOVU1fU1VOX01BQ0hJTkVTXSA9IHsKIC8qIEZpcnN0LCBTdW40J3MgKi8KLXsgIlN1biA0LzEwMCBTZXJpZXMiLCAoU01fU1VONCB8IFNNXzRfMTEwKSB9LAoteyAiU3VuIDQvMjAwIFNlcmllcyIsIChTTV9TVU40IHwgU01fNF8yNjApIH0sCi17ICJTdW4gNC8zMDAgU2VyaWVzIiwgKFNNX1NVTjQgfCBTTV80XzMzMCkgfSwKLXsgIlN1biA0LzQwMCBTZXJpZXMiLCAoU01fU1VONCB8IFNNXzRfNDcwKSB9LAoreyAubmFtZSA9ICJTdW4gNC8xMDAgU2VyaWVzIiwgICAgICAgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40IHwgU01fNF8xMTApIH0sCit7IC5uYW1lID0gIlN1biA0LzIwMCBTZXJpZXMiLCAgICAgICAgLmlkX21hY2h0eXBlID0gKFNNX1NVTjQgfCBTTV80XzI2MCkgfSwKK3sgLm5hbWUgPSAiU3VuIDQvMzAwIFNlcmllcyIsICAgICAgICAuaWRfbWFjaHR5cGUgPSAoU01fU1VONCB8IFNNXzRfMzMwKSB9LAoreyAubmFtZSA9ICJTdW4gNC80MDAgU2VyaWVzIiwgICAgICAgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40IHwgU01fNF80NzApIH0sCiAvKiBOb3csIFN1bjRjJ3MgKi8KLXsgIlN1bjRjIFNwYXJjU3RhdGlvbiAxIiwgKFNNX1NVTjRDIHwgU01fNENfU1MxKSB9LAoteyAiU3VuNGMgU3BhcmNTdGF0aW9uIElQQyIsIChTTV9TVU40QyB8IFNNXzRDX0lQQykgfSwKLXsgIlN1bjRjIFNwYXJjU3RhdGlvbiAxKyIsIChTTV9TVU40QyB8IFNNXzRDX1NTMVBMVVMpIH0sCi17ICJTdW40YyBTcGFyY1N0YXRpb24gU0xDIiwgKFNNX1NVTjRDIHwgU01fNENfU0xDKSB9LAoteyAiU3VuNGMgU3BhcmNTdGF0aW9uIDIiLCAoU01fU1VONEMgfCBTTV80Q19TUzIpIH0sCi17ICJTdW40YyBTcGFyY1N0YXRpb24gRUxDIiwgKFNNX1NVTjRDIHwgU01fNENfRUxDKSB9LAoteyAiU3VuNGMgU3BhcmNTdGF0aW9uIElQWCIsIChTTV9TVU40QyB8IFNNXzRDX0lQWCkgfSwKK3sgLm5hbWUgPSAiU3VuNGMgU3BhcmNTdGF0aW9uIDEiLCAgICAuaWRfbWFjaHR5cGUgPSAoU01fU1VONEMgfCBTTV80Q19TUzEpIH0sCit7IC5uYW1lID0gIlN1bjRjIFNwYXJjU3RhdGlvbiBJUEMiLCAgLmlkX21hY2h0eXBlID0gKFNNX1NVTjRDIHwgU01fNENfSVBDKSB9LAoreyAubmFtZSA9ICJTdW40YyBTcGFyY1N0YXRpb24gMSsiLCAgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40QyB8IFNNXzRDX1NTMVBMVVMpIH0sCit7IC5uYW1lID0gIlN1bjRjIFNwYXJjU3RhdGlvbiBTTEMiLCAgLmlkX21hY2h0eXBlID0gKFNNX1NVTjRDIHwgU01fNENfU0xDKSB9LAoreyAubmFtZSA9ICJTdW40YyBTcGFyY1N0YXRpb24gMiIsICAgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40QyB8IFNNXzRDX1NTMikgfSwKK3sgLm5hbWUgPSAiU3VuNGMgU3BhcmNTdGF0aW9uIEVMQyIsICAuaWRfbWFjaHR5cGUgPSAoU01fU1VONEMgfCBTTV80Q19FTEMpIH0sCit7IC5uYW1lID0gIlN1bjRjIFNwYXJjU3RhdGlvbiBJUFgiLCAgLmlkX21hY2h0eXBlID0gKFNNX1NVTjRDIHwgU01fNENfSVBYKSB9LAogLyogRmluYWxseSwgZWFybHkgU3VuNG0ncyAqLwoteyAiU3VuNG0gU3BhcmNTeXN0ZW02MDAiLCAoU01fU1VONE0gfCBTTV80TV9TUzYwKSB9LAoteyAiU3VuNG0gU3BhcmNTdGF0aW9uMTAvMjAiLCAoU01fU1VONE0gfCBTTV80TV9TUzUwKSB9LAoteyAiU3VuNG0gU3BhcmNTdGF0aW9uNSIsIChTTV9TVU40TSB8IFNNXzRNX1NTNDApIH0sCit7IC5uYW1lID0gIlN1bjRtIFNwYXJjU3lzdGVtNjAwIiwgICAgLmlkX21hY2h0eXBlID0gKFNNX1NVTjRNIHwgU01fNE1fU1M2MCkgfSwKK3sgLm5hbWUgPSAiU3VuNG0gU3BhcmNTdGF0aW9uMTAvMjAiLCAuaWRfbWFjaHR5cGUgPSAoU01fU1VONE0gfCBTTV80TV9TUzUwKSB9LAoreyAubmFtZSA9ICJTdW40bSBTcGFyY1N0YXRpb241IiwgICAgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40TSB8IFNNXzRNX1NTNDApIH0sCiAvKiBPbmUgZW50cnkgZm9yIHRoZSBPQlAgYXJjaCdzIHdoaWNoIGFyZSBzdW40ZCwgc3VuNGUsIGFuZCBuZXdlciBzdW40bSdzICovCi17ICJTdW40TSBPQlAgYmFzZWQgc3lzdGVtIiwgKFNNX1NVTjRNX09CUCB8IDB4MCkgfSB9OworeyAubmFtZSA9ICJTdW40TSBPQlAgYmFzZWQgc3lzdGVtIiwgIC5pZF9tYWNodHlwZSA9IChTTV9TVU40TV9PQlAgfCAweDApIH0gfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGRpc3BsYXlfc3lzdGVtX3R5cGUodW5zaWduZWQgY2hhciBtYWNodHlwZSkKIHsKQEAgLTQ3LDIxICs0OSwyNSBAQAogCXJlZ2lzdGVyIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9TVU5fTUFDSElORVM7IGkrKykgewotCQlpZihTdW5fTWFjaGluZXNbaV0uaWRfbWFjaHR5cGUgPT0gbWFjaHR5cGUpIHsKKwkJaWYgKFN1bl9NYWNoaW5lc1tpXS5pZF9tYWNodHlwZSA9PSBtYWNodHlwZSkgewogCQkJaWYgKG1hY2h0eXBlICE9IChTTV9TVU40TV9PQlAgfCAweDAwKSB8fAogCQkJICAgIHByb21fZ2V0cHJvcGVydHkocHJvbV9yb290X25vZGUsICJiYW5uZXItbmFtZSIsCiAJCQkJCSAgICAgc3lzbmFtZSwgc2l6ZW9mKHN5c25hbWUpKSA8PSAwKQotCQkJCXByaW50aygiVFlQRTogJXNcbiIsIFN1bl9NYWNoaW5lc1tpXS5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJUWVBFOiAlc1xuIiwKKwkJCQkgICAgICAgU3VuX01hY2hpbmVzW2ldLm5hbWUpOwogCQkJZWxzZQotCQkJCXByaW50aygiVFlQRTogJXNcbiIsIHN5c25hbWUpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRZUEU6ICVzXG4iLCBzeXNuYW1lKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCXByb21fcHJpbnRmKCJJRFBST006IEJvZ3VzIGlkX21hY2h0eXBlIHZhbHVlLCAweCV4XG4iLCBtYWNodHlwZSk7Ci0JcHJvbV9oYWx0KCk7CisJcHJvbV9wcmludGYoIklEUFJPTTogV2FybmluZywgYm9ndXMgaWRfbWFjaHR5cGUgdmFsdWUsIDB4JXhcbiIsIG1hY2h0eXBlKTsKIH0KLQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBkaXNwbGF5X3N5c3RlbV90eXBlKHVuc2lnbmVkIGNoYXIgbWFjaHR5cGUpCit7Cit9CisjZW5kaWYKIC8qIENhbGN1bGF0ZSB0aGUgSURQUk9NIGNoZWNrc3VtICh4b3Igb2YgdGhlIGRhdGEgYnl0ZXMpLiAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbml0IGNhbGNfaWRwcm9tX2Nrc3VtKHN0cnVjdCBpZHByb20gKmlkcHJvbSkKIHsKQEAgLTgwLDIxICs4NiwxNCBAQAogCiAJaWRwcm9tID0gJmlkcHJvbV9idWZmZXI7CiAKLQlpZiAoaWRwcm9tLT5pZF9mb3JtYXQgIT0gMHgwMSkgIHsKLQkJcHJvbV9wcmludGYoIklEUFJPTTogVW5rbm93biBmb3JtYXQgdHlwZSFcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJaWYgKGlkcHJvbS0+aWRfZm9ybWF0ICE9IDB4MDEpCisJCXByb21fcHJpbnRmKCJJRFBST006IFdhcm5pbmcsIHVua25vd24gZm9ybWF0IHR5cGUhXG4iKTsKIAotCWlmIChpZHByb20tPmlkX2Nrc3VtICE9IGNhbGNfaWRwcm9tX2Nrc3VtKGlkcHJvbSkpIHsKLQkJcHJvbV9wcmludGYoIklEUFJPTTogQ2hlY2tzdW0gZmFpbHVyZSAobnZyYW09JXgsIGNhbGM9JXgpIVxuIiwKKwlpZiAoaWRwcm9tLT5pZF9ja3N1bSAhPSBjYWxjX2lkcHJvbV9ja3N1bShpZHByb20pKQorCQlwcm9tX3ByaW50ZigiSURQUk9NOiBXYXJuaW5nLCBjaGVja3N1bSBmYWlsdXJlIChudnJhbT0leCwgY2FsYz0leCkhXG4iLAogCQkJICAgIGlkcHJvbS0+aWRfY2tzdW0sIGNhbGNfaWRwcm9tX2Nrc3VtKGlkcHJvbSkpOwotCQlwcm9tX2hhbHQoKTsKLQl9CiAKIAlkaXNwbGF5X3N5c3RlbV90eXBlKGlkcHJvbS0+aWRfbWFjaHR5cGUpOwogCi0JcHJpbnRrKCJFdGhlcm5ldCBhZGRyZXNzOiAleDoleDoleDoleDoleDoleFxuIiwKLQkJICAgIGlkcHJvbS0+aWRfZXRoYWRkclswXSwgaWRwcm9tLT5pZF9ldGhhZGRyWzFdLAotCQkgICAgaWRwcm9tLT5pZF9ldGhhZGRyWzJdLCBpZHByb20tPmlkX2V0aGFkZHJbM10sCi0JCSAgICBpZHByb20tPmlkX2V0aGFkZHJbNF0sIGlkcHJvbS0+aWRfZXRoYWRkcls1XSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRXRoZXJuZXQgYWRkcmVzczogJXBNXG4iLCBpZHByb20tPmlkX2V0aGFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCA4ZTY0ZWJjLi42MjEyNmU0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMjMsNiArMjMsNSBAQAogICogaW4gZXRyYXAuUyB3aGljaCBhc3N1bWVzIGl0LgogICovCiB1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uICgiLnRleHRcIlxuXHQjIikpKQotCV9fYXR0cmlidXRlX18oKGFsaWduZWQgKFRIUkVBRF9TSVpFKSkpCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbiAoIi5kYXRhLmluaXRfdGFzayIpKSkKIAk9IHsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lvbW11LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2lvbW11LmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW9tbXVfY29tbW9uLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdV9jb21tb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdV9jb21tb24uaApyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXVfY29tbW9uLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKaW5kZXggNGYwMjViMy4uN2NlMTRmMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKQEAgLTU1Miw4ICs1NTIsOCBAQAogCS8qIElJZXAgaXMgd3JpdGUtdGhyb3VnaCwgbm90IGZsdXNoaW5nLiAqLwogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBuKSB7CiAJCUJVR19PTihwYWdlX2FkZHJlc3Moc2dfcGFnZShzZykpID09IE5VTEwpOwotCQlzZy0+ZHZtYV9hZGRyZXNzID0gdmlydF90b19waHlzKHNnX3ZpcnQoc2cpKTsKLQkJc2ctPmR2bWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKKwkJc2ctPmRtYV9hZGRyZXNzID0gdmlydF90b19waHlzKHNnX3ZpcnQoc2cpKTsKKwkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOwogCX0KIAlyZXR1cm4gbmVudHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL2lycS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwppbmRleCA5M2UxZDFjLi5mMzQ4OGM0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKKyNpbmNsdWRlICJrZXJuZWwuaCIKICNpbmNsdWRlICJpcnEuaCIKIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTU5MiwxOSArNTkzLDE5IEBACiAKIHZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcmV0dXJuIF9fZGlzYWJsZV9pcnEoaXJxKTsKKwlfX2Rpc2FibGVfaXJxKGlycSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxX25vc3luYyk7CiAKIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlyZXR1cm4gX19kaXNhYmxlX2lycShpcnEpOworCV9fZGlzYWJsZV9pcnEoaXJxKTsKIH0KIEVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOwogCiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlyZXR1cm4gX19lbmFibGVfaXJxKGlycSk7CisJX19lbmFibGVfaXJxKGlycSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZW5hYmxlX2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKaW5kZXggNTJmYzgzNi4uYTNlYTJiYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYwpAQCAtNzc1LDYgKzc3NSw2OSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgdW5oYW5kbGVkX3BlcmZfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgcGNyLCBwaWM7CisKKwlyZWFkX3BjcihwY3IpOworCXJlYWRfcGljKHBpYyk7CisKKwl3cml0ZV9wY3IoMCk7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiQ1BVICVkOiBHb3QgdW5leHBlY3RlZCBwZXJmIGNvdW50ZXIgSVJRLlxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiQ1BVICVkOiBQQ1JbJTAxNmx4XSBQSUNbJTAxNmx4XVxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBwY3IsIHBpYyk7Cit9CisKKy8qIEFsbW9zdCBhIGRpcmVjdCBjb3B5IG9mIHRoZSBwb3dlcnBjIFBNQyBjb2RlLiAgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGVyZl9pcnFfbG9jayk7CitzdGF0aWMgdm9pZCAqcGVyZl9pcnFfb3duZXJfY2FsbGVyOyAvKiBtb3N0bHkgZm9yIGRlYnVnZ2luZyAqLworc3RhdGljIHZvaWQgKCpwZXJmX2lycSkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpID0gdW5oYW5kbGVkX3BlcmZfaXJxOworCisvKiBJbnZva2VkIGZyb20gbGV2ZWwgMTUgUElMIGhhbmRsZXIgaW4gdHJhcCB0YWJsZS4gICovCit2b2lkIHBlcmZjdHJfaXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNsZWFyX3NvZnRpbnQoMSA8PCBpcnEpOworCXBlcmZfaXJxKHJlZ3MpOworfQorCitpbnQgcmVnaXN0ZXJfcGVyZmN0cl9pbnRyKHZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFoYW5kbGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmcGVyZl9pcnFfbG9jayk7CisJaWYgKHBlcmZfaXJxICE9IHVuaGFuZGxlZF9wZXJmX2lycSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWdpc3Rlcl9wZXJmY3RyX2ludHI6ICIKKwkJICAgICAgICJwZXJmIElSUSBidXN5IChyZXNlcnZlZCBieSBjYWxsZXIgJXApXG4iLAorCQkgICAgICAgcGVyZl9pcnFfb3duZXJfY2FsbGVyKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlwZXJmX2lycV9vd25lcl9jYWxsZXIgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJcGVyZl9pcnEgPSBoYW5kbGVyOworCisJcmV0ID0gMDsKK291dDoKKwlzcGluX3VubG9jaygmcGVyZl9pcnFfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfcGVyZmN0cl9pbnRyKTsKKwordm9pZCByZWxlYXNlX3BlcmZjdHJfaW50cih2b2lkICgqaGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikpCit7CisJc3Bpbl9sb2NrKCZwZXJmX2lycV9sb2NrKTsKKwlwZXJmX2lycV9vd25lcl9jYWxsZXIgPSBOVUxMOworCXBlcmZfaXJxID0gdW5oYW5kbGVkX3BlcmZfaXJxOworCXNwaW5fdW5sb2NrKCZwZXJmX2lycV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGVhc2VfcGVyZmN0cl9pbnRyKTsKKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogdm9pZCBmaXh1cF9pcnFzKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2l0bGJfbWlzcy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXRsYl9taXNzLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvaXRsYl9taXNzLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2l0bGJfbWlzcy5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2l2ZWMuUyBiL2FyY2gvc3BhcmMva2VybmVsL2l2ZWMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9pdmVjLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2l2ZWMuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva2VybmVsLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE5NzJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwva2VybmVsLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfX1NQQVJDX0tFUk5FTF9ICisjZGVmaW5lIF9fU1BBUkNfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBjcHUuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2NwdV90eXBlOworZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2ZwdV90eXBlOworCitleHRlcm4gdW5zaWduZWQgaW50IGZzcl9zdG9yYWdlOworCisjaWZkZWYgQ09ORklHX1NQQVJDMzIKKy8qIGNwdS5jICovCitleHRlcm4gdm9pZCBjcHVfcHJvYmUodm9pZCk7CisKKy8qIHRyYXBzXzMyLmMgKi8KK2V4dGVybiB2b2lkIGhhbmRsZV9od19kaXZ6ZXJvKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKKy8qIG11bGRpdi5jICovCitleHRlcm4gaW50IGRvX3VzZXJfbXVsZGl2IChzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nKTsKKworLyogaXJxXzMyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaXJxYWN0aW9uIHN0YXRpY19pcnFhY3Rpb25bXTsKK2V4dGVybiBpbnQgc3RhdGljX2lycV9jb3VudDsKK2V4dGVybiBzcGlubG9ja190IGlycV9hY3Rpb25fbG9jazsKKworZXh0ZXJuIHZvaWQgdW5leHBlY3RlZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisjZWxzZSAvKiBDT05GSUdfU1BBUkMzMiAqLworI2VuZGlmIC8qIENPTkZJR19TUEFSQzMyICovCisjZW5kaWYgLyogIShfX1NQQVJDX0tFUk5FTF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwva2dkYi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwva2dkYl8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9rZ2RiLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2tnZGJfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rZ2RiLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9rZ2RiXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwva2dkYi5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9rZ2RiXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2tzdGFjay5oIGIvYXJjaC9zcGFyYy9rZXJuZWwva3N0YWNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwva3N0YWNrLmgKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2tzdGFjay5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2t0bGIuUyBiL2FyY2gvc3BhcmMva2VybmVsL2t0bGIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9rdGxiLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL2t0bGIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL2xkYy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9sZGMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKaW5kZXggZGRlNTJiYy4uM2M1MzlhNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIAorI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9taXNjdHJhcC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWlzY3RyYXAuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9taXNjdHJhcC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9taXNjdHJhcC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCmluZGV4IDU5ODY4MmYuLjkwMjczNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogS2VybmVsIG1vZHVsZSBoZWxwIGZvciBzcGFyYzMyLgorLyogS2VybmVsIG1vZHVsZSBoZWxwIGZvciBzcGFyYzY0LgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSBSdXN0eSBSdXNzZWxsLgogICogQ29weXJpZ2h0IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlci4KQEAgLTExLDYgKzExLDQ4IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKK3N0YXRpYyB2b2lkICptb2R1bGVfbWFwKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJaWYgKCFzaXplIHx8IHNpemUgPiBNT0RVTEVTX0xFTikKKwkJcmV0dXJuIE5VTEw7CisKKwlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplLCBWTV9BTExPQywgTU9EVUxFU19WQUREUiwgTU9EVUxFU19FTkQpOworCWlmICghYXJlYSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gX192bWFsbG9jX2FyZWEoYXJlYSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwpOworfQorCitzdGF0aWMgY2hhciAqZG90MnVuZGVyc2NvcmUoY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gbmFtZTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCAqbW9kdWxlX21hcCh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIHZtYWxsb2Moc2l6ZSk7Cit9CisKKy8qIFJlcGxhY2UgcmVmZXJlbmNlcyB0byAuZnVuYyB3aXRoIF9GdW5jICovCitzdGF0aWMgY2hhciAqZG90MnVuZGVyc2NvcmUoY2hhciAqbmFtZSkKK3sKKwlpZiAobmFtZVswXSA9PSAnLicpIHsKKwkJbmFtZVswXSA9ICdfJzsKKyAgICAgICAgICAgICAgICBuYW1lWzFdID0gdG91cHBlcihuYW1lWzFdKTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYgLyogQ09ORklHX1NQQVJDNjQgKi8KIAogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKQEAgLTIwLDcgKzYyLDcgQEAKIAlpZiAoc2l6ZSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldCA9IHZtYWxsb2Moc2l6ZSk7CisJcmV0ID0gbW9kdWxlX21hcChzaXplKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gRVJSX1BUUigtRU5PTUVNKTsKIAllbHNlCkBAIC0zNywxNiArNzksMTQgQEAKICAgICAgICAgICAgdGFibGUgZW50cmllcy4gKi8KIH0KIAotLyogTWFrZSBnZW5lcmljIGNvZGUgaWdub3JlIFNUVF9SRUdJU1RFUiBkdW1teSB1bmRlZmluZWQgc3ltYm9scywKLSAqIGFuZCByZXBsYWNlIHJlZmVyZW5jZXMgdG8gLmZ1bmMgd2l0aCBfRnVuYwotICovCisvKiBNYWtlIGdlbmVyaWMgY29kZSBpZ25vcmUgU1RUX1JFR0lTVEVSIGR1bW15IHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KIGludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCiAJCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKIAkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCiAJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJdW5zaWduZWQgaW50IHN5bWlkeDsKLQlFbGYzMl9TeW0gKnN5bTsKKwlFbGZfU3ltICpzeW07CiAJY2hhciAqc3RydGFiOwogCWludCBpOwogCkBAIC01NiwyNiArOTYsMjMgQEAKIAkJCXJldHVybiAtRU5PRVhFQzsKIAkJfQogCX0KLQlzeW0gPSAoRWxmMzJfU3ltICopc2VjaGRyc1tzeW1pZHhdLnNoX2FkZHI7CisJc3ltID0gKEVsZl9TeW0gKilzZWNoZHJzW3N5bWlkeF0uc2hfYWRkcjsKIAlzdHJ0YWIgPSAoY2hhciAqKXNlY2hkcnNbc2VjaGRyc1tzeW1pZHhdLnNoX2xpbmtdLnNoX2FkZHI7CiAKIAlmb3IgKGkgPSAxOyBpIDwgc2VjaGRyc1tzeW1pZHhdLnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSk7IGkrKykgewogCQlpZiAoc3ltW2ldLnN0X3NobmR4ID09IFNITl9VTkRFRikgewotCQkJaWYgKEVMRjMyX1NUX1RZUEUoc3ltW2ldLnN0X2luZm8pID09IFNUVF9SRUdJU1RFUikKKwkJCWlmIChFTEZfU1RfVFlQRShzeW1baV0uc3RfaW5mbykgPT0gU1RUX1JFR0lTVEVSKSB7CiAJCQkJc3ltW2ldLnN0X3NobmR4ID0gU0hOX0FCUzsKLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQljaGFyICpuYW1lID0gc3RydGFiICsgc3ltW2ldLnN0X25hbWU7Ci0JCQkJaWYgKG5hbWVbMF0gPT0gJy4nKSB7Ci0JCQkJCW5hbWVbMF0gPSAnXyc7Ci0JCQkJCW5hbWVbMV0gPSB0b3VwcGVyKG5hbWVbMV0pOwotCQkJCX0KKwkJCQlkb3QydW5kZXJzY29yZShuYW1lKTsKIAkJCX0KIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IGFwcGx5X3JlbG9jYXRlKEVsZjMyX1NoZHIgKnNlY2hkcnMsCitpbnQgYXBwbHlfcmVsb2NhdGUoRWxmX1NoZHIgKnNlY2hkcnMsCiAJCSAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKIAkJICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAogCQkgICB1bnNpZ25lZCBpbnQgcmVsc2VjLApAQCAtODYsMzIgKzEyMyw2OCBAQAogCXJldHVybiAtRU5PRVhFQzsKIH0KIAotaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAoraW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGZfU2hkciAqc2VjaGRycywKIAkJICAgICAgIGNvbnN0IGNoYXIgKnN0cnRhYiwKIAkJICAgICAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKIAkJICAgICAgIHVuc2lnbmVkIGludCByZWxzZWMsCiAJCSAgICAgICBzdHJ1Y3QgbW9kdWxlICptZSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlFbGYzMl9SZWxhICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOwotCUVsZjMyX1N5bSAqc3ltOworCUVsZl9SZWxhICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOworCUVsZl9TeW0gKnN5bTsKIAl1OCAqbG9jYXRpb247CiAJdTMyICpsb2MzMjsKIAogCWZvciAoaSA9IDA7IGkgPCBzZWNoZHJzW3JlbHNlY10uc2hfc2l6ZSAvIHNpemVvZigqcmVsKTsgaSsrKSB7Ci0JCUVsZjMyX0FkZHIgdjsKKwkJRWxmX0FkZHIgdjsKIAogCQkvKiBUaGlzIGlzIHdoZXJlIHRvIG1ha2UgdGhlIGNoYW5nZSAqLwogCQlsb2NhdGlvbiA9ICh1OCAqKXNlY2hkcnNbc2VjaGRyc1tyZWxzZWNdLnNoX2luZm9dLnNoX2FkZHIKIAkJCSsgcmVsW2ldLnJfb2Zmc2V0OwogCQlsb2MzMiA9ICh1MzIgKikgbG9jYXRpb247CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCQlCVUdfT04oKCh1NjQpbG9jYXRpb24gPj4gKHU2NCkzMikgIT0gKHU2NCkwKTsKKyNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLworCiAJCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8uICBOb3RlIHRoYXQgYWxsCiAJCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCi0JCXN5bSA9IChFbGYzMl9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCi0JCQkrIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOworCQlzeW0gPSAoRWxmX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKKwkJCSsgRUxGX1JfU1lNKHJlbFtpXS5yX2luZm8pOwogCQl2ID0gc3ltLT5zdF92YWx1ZSArIHJlbFtpXS5yX2FkZGVuZDsKIAotCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgeworCQlzd2l0Y2ggKEVMRl9SX1RZUEUocmVsW2ldLnJfaW5mbykgJiAweGZmKSB7CisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwkJY2FzZSBSX1NQQVJDXzY0OgorCQkJbG9jYXRpb25bMF0gPSB2ID4+IDU2OworCQkJbG9jYXRpb25bMV0gPSB2ID4+IDQ4OworCQkJbG9jYXRpb25bMl0gPSB2ID4+IDQwOworCQkJbG9jYXRpb25bM10gPSB2ID4+IDMyOworCQkJbG9jYXRpb25bNF0gPSB2ID4+IDI0OworCQkJbG9jYXRpb25bNV0gPSB2ID4+IDE2OworCQkJbG9jYXRpb25bNl0gPSB2ID4+ICA4OworCQkJbG9jYXRpb25bN10gPSB2ID4+ICAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NQQVJDX0RJU1AzMjoKKwkJCXYgLT0gKEVsZl9BZGRyKSBsb2NhdGlvbjsKKwkJCSpsb2MzMiA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfU1BBUkNfV0RJU1AxOToKKwkJCXYgLT0gKEVsZl9BZGRyKSBsb2NhdGlvbjsKKwkJCSpsb2MzMiA9ICgqbG9jMzIgJiB+MHg3ZmZmZikgfAorCQkJCSgodiA+PiAyKSAmIDB4N2ZmZmYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NQQVJDX09MTzEwOgorCQkJKmxvYzMyID0gKCpsb2MzMiAmIH4weDFmZmYpIHwKKwkJCQkoKCh2ICYgMHgzZmYpICsKKwkJCQkgIChFTEZfUl9UWVBFKHJlbFtpXS5yX2luZm8pID4+IDgpKQorCQkJCSAmIDB4MWZmZik7CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLworCiAJCWNhc2UgUl9TUEFSQ18zMjoKIAkJY2FzZSBSX1NQQVJDX1VBMzI6CiAJCQlsb2NhdGlvblswXSA9IHYgPj4gMjQ7CkBAIC0xMjEsMTMgKzE5NCwxMyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JCQl2IC09IChFbGYzMl9BZGRyKSBsb2NhdGlvbjsKKwkJCXYgLT0gKEVsZl9BZGRyKSBsb2NhdGlvbjsKIAkJCSpsb2MzMiA9ICgqbG9jMzIgJiB+MHgzZmZmZmZmZikgfAogCQkJCSgodiA+PiAyKSAmIDB4M2ZmZmZmZmYpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JCQl2IC09IChFbGYzMl9BZGRyKSBsb2NhdGlvbjsKKwkJCXYgLT0gKEVsZl9BZGRyKSBsb2NhdGlvbjsKIAkJCSpsb2MzMiA9ICgqbG9jMzIgJiB+MHgzZmZmZmYpIHwKIAkJCQkoKHYgPj4gMikgJiAweDNmZmZmZik7CiAJCQlicmVhazsKQEAgLTE0NCwxOSArMjE3LDM4IEBACiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAleFxuIiwKIAkJCSAgICAgICBtZS0+bmFtZSwKLQkJCSAgICAgICAoaW50KSAoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pICYgMHhmZikpOworCQkJICAgICAgIChpbnQpIChFTEZfUl9UWVBFKHJlbFtpXS5yX2luZm8pICYgMHhmZikpOwogCQkJcmV0dXJuIC1FTk9FWEVDOwogCQl9OwogCX0KIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19TUEFSQzY0CiBpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCiAJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQogeworCS8qIENoZWV0YWgncyBJLWNhY2hlIGlzIGZ1bGx5IGNvaGVyZW50LiAgKi8KKwlpZiAodGxiX3R5cGUgPT0gc3BpdGZpcmUpIHsKKwkJdW5zaWduZWQgbG9uZyB2YTsKKworCQlmbHVzaHdfYWxsKCk7CisJCWZvciAodmEgPSAgMDsgdmEgPCAoUEFHRV9TSVpFIDw8IDEpOyB2YSArPSAzMikKKwkJCXNwaXRmaXJlX3B1dF9pY2FjaGVfdGFnKHZhLCAweDApOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZmx1c2ggJWc2Iik7CisJfQorCiAJcmV0dXJuIDA7CiB9CisjZWxzZQoraW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisgICAgICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19TUEFSQzY0ICovCiAKIHZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tdWxkaXYuYyBiL2FyY2gvc3BhcmMva2VybmVsL211bGRpdi5jCmluZGV4IGUzNTIyMzkuLmJhOTYwYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL211bGRpdi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL211bGRpdi5jCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNpbmNsdWRlICJrZXJuZWwuaCIKKwogLyogI2RlZmluZSBERUJVR19NVUxESVYgKi8KIAogc3RhdGljIGlubGluZSBpbnQgaGFzX2ltbTEzKGludCBpbnNuKQpAQCAtODgsOSArOTAsNiBAQAogCQlyZXR1cm4gKHB1dF91c2VyKHJlc3VsdCwgJndpbi0+bG9jYWxzW3JlZyAtIDE2XSkpOwogCX0KIH0KLQkJCi1leHRlcm4gdm9pZCBoYW5kbGVfaHdfZGl2emVybyAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBucGMsIHVuc2lnbmVkIGxvbmcgcHNyKTsKIAogLyogU2hvdWxkIHJldHVybiAwIGlmIG11bC9kaXYgZW11bGF0aW9uIHN1Y2NlZWRlZCBhbmQgU0lHSUxMIHNob3VsZAogICogbm90IGJlIGlzc3VlZC4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCmluZGV4IDBmNjE2YWUuLjQ2ZTIzMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKQEAgLTgxMSwyMCArODExLDIwIEBACiAKIAlpcnEgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7CiAJaWYgKGlycSkgewotCQltZW1jcHkob3AtPmlycXMsIGlycSwgbGVuKTsKIAkJb3AtPm51bV9pcnFzID0gbGVuIC8gNDsKKworCQkvKiBQcmV2ZW50IG92ZXJydW5uaW5nIHRoZSBvcC0+aXJxc1tdIGFycmF5LiAgKi8KKwkJaWYgKG9wLT5udW1faXJxcyA+IFBST01JTlRSX01BWCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtYW55IGlycXMgKCVkKSwgIgorCQkJICAgICAgICJsaW1pdGluZyB0byAlZC5cbiIsCisJCQkgICAgICAgZHAtPmZ1bGxfbmFtZSwgb3AtPm51bV9pcnFzLCBQUk9NSU5UUl9NQVgpOworCQkJb3AtPm51bV9pcnFzID0gUFJPTUlOVFJfTUFYOworCQl9CisJCW1lbWNweShvcC0+aXJxcywgaXJxLCBvcC0+bnVtX2lycXMgKiA0KTsKIAl9IGVsc2UgewogCQlvcC0+bnVtX2lycXMgPSAwOwogCX0KIAotCS8qIFByZXZlbnQgb3ZlcnJ1bm5pbmcgdGhlIG9wLT5pcnFzW10gYXJyYXkuICAqLwotCWlmIChvcC0+bnVtX2lycXMgPiBQUk9NSU5UUl9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtYW55IGlycXMgKCVkKSwgIgotCQkgICAgICAgImxpbWl0aW5nIHRvICVkLlxuIiwKLQkJICAgICAgIGRwLT5mdWxsX25hbWUsIG9wLT5udW1faXJxcywgUFJPTUlOVFJfTUFYKTsKLQkJb3AtPm51bV9pcnFzID0gUFJPTUlOVFJfTUFYOwotCX0KLQogCWJ1aWxkX2RldmljZV9yZXNvdXJjZXMob3AsIHBhcmVudCk7CiAJZm9yIChpID0gMDsgaSA8IG9wLT5udW1faXJxczsgaSsrKQogCQlvcC0+aXJxc1tpXSA9IGJ1aWxkX29uZV9kZXZpY2VfaXJxKG9wLCBwYXJlbnQsIG9wLT5pcnFzW2ldKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfZmlyZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3BjaV9maXJlLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaCBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9pbXBsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaApyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ltcGwuaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfbXNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX21zaS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuaCBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5oCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHZfYXNtLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHZfYXNtLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2X2FzbS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHZfYXNtLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCA0NjI1ODRlLi43NWVkOThiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC00MzYsNyArNDM2LDcgQEAKIAlyZXR1cm4gcGNpYzBfdXA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBkZXZfdG9fcG5vZGUoc3RydWN0IGxpbnV4X3BibV9pbmZvICpwYm0sIAorc3RhdGljIGludCBfX2RldmluaXQgcGRldl90b19wbm9kZShzdHJ1Y3QgbGludXhfcGJtX2luZm8gKnBibSwKIAkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyByZWdzW1BST01SRUdfTUFYXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKaW5kZXggMmFmY2ZhYi4uNWU0NTYzZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKQEAgLTI0LDMyICsyNCwzMiBAQAogICovCiAKICNkZWZpbmUgUE1DX09CUE5BTUUJIlNVTlcscG1jIgotI2RlZmluZSBQTUNfREVWTkFNRSAicG1jIgorI2RlZmluZSBQTUNfREVWTkFNRQkicG1jIgogCiAjZGVmaW5lIFBNQ19JRExFX1JFRwkweDAwCi0jZGVmaW5lIFBNQ19JRExFX09OCQkweDAxCisjZGVmaW5lIFBNQ19JRExFX09OCTB4MDEKIAogc3RhdGljIHU4IF9faW9tZW0gKnJlZ3M7CiAKICNkZWZpbmUgcG1jX3JlYWRiKG9mZnMpCQkoc2J1c19yZWFkYihyZWdzK29mZnMpKQotI2RlZmluZSBwbWNfd3JpdGViKHZhbCwgb2ZmcykgCShzYnVzX3dyaXRlYih2YWwsIHJlZ3Mrb2ZmcykpCisjZGVmaW5lIHBtY193cml0ZWIodmFsLCBvZmZzKQkoc2J1c193cml0ZWIodmFsLCByZWdzK29mZnMpKQogCi0vKiAKKy8qCiAgKiBDUFUgaWRsZSBjYWxsYmFjayBmdW5jdGlvbgogICogU2VlIC4uLi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKICAqLwotdm9pZCBwbWNfc3dpZnRfaWRsZSh2b2lkKQorc3RhdGljIHZvaWQgcG1jX3N3aWZ0X2lkbGUodm9pZCkKIHsKICNpZmRlZiBQTUNfREVCVUdfTEVECi0Jc2V0X2F1eGlvKDB4MDAsIEFVWElPX0xFRCk7IAorCXNldF9hdXhpbygweDAwLCBBVVhJT19MRUQpOwogI2VuZGlmCiAKIAlwbWNfd3JpdGViKHBtY19yZWFkYihQTUNfSURMRV9SRUcpIHwgUE1DX0lETEVfT04sIFBNQ19JRExFX1JFRyk7CiAKICNpZmRlZiBQTUNfREVCVUdfTEVECi0Jc2V0X2F1eGlvKEFVWElPX0xFRCwgMHgwMCk7IAorCXNldF9hdXhpbyhBVVhJT19MRUQsIDB4MDApOwogI2VuZGlmCi19IAorfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwbWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCkBAIC02Myw3ICs2Myw3IEBACiAKICNpZm5kZWYgUE1DX05PX0lETEUKIAkvKiBBc3NpZ24gcG93ZXIgbWFuYWdlbWVudCBJRExFIGhhbmRsZXIgKi8KLQlwbV9pZGxlID0gcG1jX3N3aWZ0X2lkbGU7CQorCXBtX2lkbGUgPSBwbWNfc3dpZnRfaWRsZTsKICNlbmRpZgogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBvd2VyIG1hbmFnZW1lbnQgaW5pdGlhbGl6ZWRcbiIsIFBNQ19ERVZOQU1FKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGU4YzQzZmYuLjY5ZDkzMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTE2OCwxMSArMTY4LDkgQEAKIAogdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQogewotI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIAlpZiAoYXV4aW9fcG93ZXJfcmVnaXN0ZXIgJiYKIAkgICAgKHN0cmNtcChvZl9jb25zb2xlX2RldmljZS0+dHlwZSwgInNlcmlhbCIpIHx8IHNjb25zX3B3cm9mZikpCiAJCSphdXhpb19wb3dlcl9yZWdpc3RlciB8PSBBVVhJT19QT1dFUl9PRkY7Ci0jZW5kaWYKIAltYWNoaW5lX2hhbHQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlNWVmYy4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoKLSAqIFByb2NlZHVyZXMgZm9yIGNyZWF0aW5nLCBhY2Nlc3NpbmcgYW5kIGludGVycHJldGluZyB0aGUgZGV2aWNlIHRyZWUuCi0gKgotICogUGF1bCBNYWNrZXJyYXMJQXVndXN0IDE5OTYuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNSBQYXVsIE1hY2tlcnJhcy4KLSAqIAotICogIEFkYXB0ZWQgZm9yIDY0Yml0IFBvd2VyUEMgYnkgRGF2ZSBFbmdlYnJldHNlbiBhbmQgUGV0ZXIgQmVyZ25lci4KLSAqICAgIHtlbmdlYnJldHxiZXJnbmVyfUB1cy5pYm0uY29tIAotICoKLSAqICBBZGFwdGVkIGZvciBzcGFyYzMyIGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0Ci0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLQotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CS8qIHRlbXBvcmFyeSB3aGlsZSBtZXJnaW5nICovCi0KLWV4dGVybiByd2xvY2tfdCBkZXZ0cmVlX2xvY2s7CS8qIHRlbXBvcmFyeSB3aGlsZSBtZXJnaW5nICovCi0KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUocGhhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCWZvciAobnAgPSBhbGxub2RlczsgbnAgIT0gMDsgbnAgPSBucC0+YWxsbmV4dCkKLQkJaWYgKG5wLT5ub2RlID09IGhhbmRsZSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIG5wOwotfQotRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfcGhhbmRsZSk7Ci0KLWludCBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGRlZikKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0JaW50IGxlbjsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBuYW1lLCAmbGVuKTsKLQlpZiAoIXByb3AgfHwgbGVuICE9IDQpCi0JCXJldHVybiBkZWY7Ci0KLQlyZXR1cm4gKihpbnQgKikgcHJvcC0+dmFsdWU7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2dldGludHByb3BfZGVmYXVsdCk7Ci0KLURFRklORV9NVVRFWChvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOwotRVhQT1JUX1NZTUJPTChvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOwotCi1pbnQgb2Zfc2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbCwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKipwcmV2cDsKLQl2b2lkICpuZXdfdmFsOwotCWludCBlcnI7Ci0KLQluZXdfdmFsID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICghbmV3X3ZhbCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1jcHkobmV3X3ZhbCwgdmFsLCBsZW4pOwotCi0JZXJyID0gLUVOT0RFVjsKLQotCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7Ci0JcHJldnAgPSAmZHAtPnByb3BlcnRpZXM7Ci0Jd2hpbGUgKCpwcmV2cCkgewotCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSAqcHJldnA7Ci0KLQkJaWYgKCFzdHJjYXNlY21wKHByb3AtPm5hbWUsIG5hbWUpKSB7Ci0JCQl2b2lkICpvbGRfdmFsID0gcHJvcC0+dmFsdWU7Ci0JCQlpbnQgcmV0OwotCi0JCQltdXRleF9sb2NrKCZvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOwotCQkJcmV0ID0gcHJvbV9zZXRwcm9wKGRwLT5ub2RlLCAoY2hhciAqKSBuYW1lLCB2YWwsIGxlbik7Ci0JCQltdXRleF91bmxvY2soJm9mX3NldF9wcm9wZXJ0eV9tdXRleCk7Ci0KLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlpZiAocmV0ID49IDApIHsKLQkJCQlwcm9wLT52YWx1ZSA9IG5ld192YWw7Ci0JCQkJcHJvcC0+bGVuZ3RoID0gbGVuOwotCi0JCQkJaWYgKE9GX0lTX0RZTkFNSUMocHJvcCkpCi0JCQkJCWtmcmVlKG9sZF92YWwpOwotCi0JCQkJT0ZfTUFSS19EWU5BTUlDKHByb3ApOwotCi0JCQkJZXJyID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXByZXZwID0gJigqcHJldnApLT5uZXh0OwotCX0KLQl3cml0ZV91bmxvY2soJmRldnRyZWVfbG9jayk7Ci0KLQkvKiBYWFggVXBhdGUgcHJvY2ZzIGlmIG5lY2Vzc2FyeS4uLiAqLwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wob2Zfc2V0X3Byb3BlcnR5KTsKLQotaW50IG9mX2ZpbmRfaW5fcHJvcGxpc3QoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqbWF0Y2gsIGludCBsZW4pCi17Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJaW50IGw7Ci0KLQkJaWYgKCFzdHJjbXAobGlzdCwgbWF0Y2gpKQotCQkJcmV0dXJuIDE7Ci0JCWwgPSBzdHJsZW4obGlzdCkgKyAxOwotCQlsaXN0ICs9IGw7Ci0JCWxlbiAtPSBsOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZmluZF9pbl9wcm9wbGlzdCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHJvbV9lYXJseV9hbGxvY2F0ZWQ7Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IHByb21fZWFybHlfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQotewotCXZvaWQgKnJldDsKLQotCXJldCA9IF9fYWxsb2NfYm9vdG1lbShzaXplLCBTTVBfQ0FDSEVfQllURVMsIDBVTCk7Ci0JaWYgKHJldCAhPSBOVUxMKQotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQotCXByb21fZWFybHlfYWxsb2NhdGVkICs9IHNpemU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGlzX3Jvb3Rfbm9kZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWlmICghZHApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIChkcC0+cGFyZW50ID09IE5VTEwpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGRlYWwgd2l0aCB0aGUgYmxhY2sgbWFnaWMgb2YgZnVsbHkgbmFtaW5nIGEKLSAqIG5vZGUuCi0gKgotICogQ2VydGFpbiB3ZWxsIGtub3duIG5hbWVkIG5vZGVzIGFyZSBqdXN0IHRoZSBzaW1wbGUgbmFtZSBzdHJpbmcuCi0gKgotICogQWN0dWFsIGRldmljZXMgaGF2ZSBhbiBhZGRyZXNzIHNwZWNpZmllciBhcHBlbmRlZCB0byB0aGUgYmFzZSBuYW1lCi0gKiBzdHJpbmcsIGxpa2UgdGhpcyAiZm9vQGFkZHIiLiAgVGhlICJhZGRyIiBjYW4gYmUgaW4gYW55IG51bWJlciBvZgotICogZm9ybWF0cywgYW5kIHRoZSBwbGF0Zm9ybSBwbHVzIHRoZSB0eXBlIG9mIHRoZSBub2RlIGRldGVybWluZSB0aGUKLSAqIGZvcm1hdCBhbmQgaG93IGl0IGlzIGNvbnN0cnVjdGVkLgotICoKLSAqIEZvciBjaGlsZHJlbiBvZiB0aGUgUk9PVCBub2RlLCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gaXMgZml4ZWQgYW5kCi0gKiBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgdGhpcyBpcyBhIHN1bjR1IG9yIHN1bjR2IHN5c3RlbS4KLSAqCi0gKiBGb3IgY2hpbGRyZW4gb2Ygb3RoZXIgbm9kZXMsIGl0IGlzIGJ1cyB0eXBlIHNwZWNpZmljLiAgU28KLSAqIHdlIHdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZGlzY292ZXIgYSAiZGV2aWNlX3R5cGUiIHByb3BlcnR5Ci0gKiB3ZSByZWNvZ25pemUgYW5kIHdlIGdvIGZyb20gdGhlcmUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzcGFyYzMyX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOwotCXN0cnVjdCBwcm9wZXJ0eSAqcnByb3A7Ci0KLQlycHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXJwcm9wKQotCQlyZXR1cm47Ci0KLQlyZWdzID0gcnByb3AtPnZhbHVlOwotCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKLQkJZHAtPm5hbWUsCi0JCXJlZ3MtPndoaWNoX2lvLCByZWdzLT5waHlzX2FkZHIpOwotfQotCi0vKiAibmFtZUBzbG90LG9mZnNldCIgICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQotewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcHJvcCkKLQkJcmV0dXJuOwotCi0JcmVncyA9IHByb3AtPnZhbHVlOwotCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKLQkJZHAtPm5hbWUsCi0JCXJlZ3MtPndoaWNoX2lvLAotCQlyZWdzLT5waHlzX2FkZHIpOwotfQotCi0vKiAibmFtZUBkZXZudW1bLGZ1bmNdIiAqLwotc3RhdGljIHZvaWQgX19pbml0IHBjaV9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQotewotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCXVuc2lnbmVkIGludCBkZXZmbjsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JaWYgKCFwcm9wKQotCQlyZXR1cm47Ci0KLQlyZWdzID0gcHJvcC0+dmFsdWU7Ci0JZGV2Zm4gPSAocmVncy0+cGh5c19oaSA+PiA4KSAmIDB4ZmY7Ci0JaWYgKGRldmZuICYgMHgwNykgewotCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCi0JCQlkcC0+bmFtZSwKLQkJCWRldmZuID4+IDMsCi0JCQlkZXZmbiAmIDB4MDcpOwotCX0gZWxzZSB7Ci0JCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4IiwKLQkJCWRwLT5uYW1lLAotCQkJZGV2Zm4gPj4gMyk7Ci0JfQotfQotCi0vKiAibmFtZUBhZGRyaGksYWRkcmxvIiAqLwotc3RhdGljIHZvaWQgX19pbml0IGVidXNfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKLXsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQotCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKLQkJZHAtPm5hbWUsCi0JCXJlZ3MtPndoaWNoX2lvLCByZWdzLT5waHlzX2FkZHIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgX19idWlsZF9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gZHAtPnBhcmVudDsKLQotCWlmIChwYXJlbnQgIT0gTlVMTCkgewotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2kiKSB8fAotCQkgICAgIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2lleCIpKQotCQkJcmV0dXJuIHBjaV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Ci0JCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInNidXMiKSkKLQkJCXJldHVybiBzYnVzX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAiZWJ1cyIpKQotCQkJcmV0dXJuIGVidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCi0JCS8qICJpc2EiIGlzIGhhbmRsZWQgd2l0aCBwbGF0Zm9ybSBuYW1pbmcgKi8KLQl9Ci0KLQkvKiBVc2UgcGxhdGZvcm0gbmFtaW5nIGNvbnZlbnRpb24uICAqLwotCXJldHVybiBzcGFyYzMyX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQljaGFyIHRtcF9idWZbNjRdLCAqbjsKLQotCXRtcF9idWZbMF0gPSAnXDAnOwotCV9fYnVpbGRfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCWlmICh0bXBfYnVmWzBdID09ICdcMCcpCi0JCXN0cmNweSh0bXBfYnVmLCBkcC0+bmFtZSk7Ci0KLQluID0gcHJvbV9lYXJseV9hbGxvYyhzdHJsZW4odG1wX2J1ZikgKyAxKTsKLQlzdHJjcHkobiwgdG1wX2J1Zik7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfZnVsbF9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0JaW50IGxlbiwgb3VybGVuLCBwbGVuOwotCWNoYXIgKm47Ci0KLQlwbGVuID0gc3RybGVuKGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7Ci0Jb3VybGVuID0gc3RybGVuKGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQlsZW4gPSBvdXJsZW4gKyBwbGVuICsgMjsKLQotCW4gPSBwcm9tX2Vhcmx5X2FsbG9jKGxlbik7Ci0Jc3RyY3B5KG4sIGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7Ci0JaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKLQkJc3RyY3B5KG4gKyBwbGVuLCAiLyIpOwotCQlwbGVuKys7Ci0JfQotCXN0cmNweShuICsgcGxlbiwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOwotCi1zdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX29uZV9wcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldiwgY2hhciAqc3BlY2lhbF9uYW1lLCB2b2lkICpzcGVjaWFsX3ZhbCwgaW50IHNwZWNpYWxfbGVuKQotewotCXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKnRtcCA9IE5VTEw7Ci0Jc3RydWN0IHByb3BlcnR5ICpwOwotCWludCBsZW47Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCWlmICh0bXApIHsKLQkJcCA9IHRtcDsKLQkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkgKyAzMik7Ci0JCXRtcCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9wZXJ0eSkgKyAzMik7Ci0JCXAtPnVuaXF1ZV9pZCA9IHVuaXF1ZV9pZCsrOwotCX0KLQotCXAtPm5hbWUgPSAoY2hhciAqKSAocCArIDEpOwotCWlmIChzcGVjaWFsX25hbWUpIHsKLQkJc3RyY3B5KHAtPm5hbWUsIHNwZWNpYWxfbmFtZSk7Ci0JCXAtPmxlbmd0aCA9IHNwZWNpYWxfbGVuOwotCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2Moc3BlY2lhbF9sZW4pOwotCQltZW1jcHkocC0+dmFsdWUsIHNwZWNpYWxfdmFsLCBzcGVjaWFsX2xlbik7Ci0JfSBlbHNlIHsKLQkJaWYgKHByZXYgPT0gTlVMTCkgewotCQkJbmFtZSA9IHByb21fZmlyc3Rwcm9wKG5vZGUsIE5VTEwpOwotCQl9IGVsc2UgewotCQkJbmFtZSA9IHByb21fbmV4dHByb3Aobm9kZSwgcHJldiwgTlVMTCk7Ci0JCX0KLQkJaWYgKHN0cmxlbihuYW1lKSA9PSAwKSB7Ci0JCQl0bXAgPSBwOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KHAtPm5hbWUsIG5hbWUpOwotCQlwLT5sZW5ndGggPSBwcm9tX2dldHByb3BsZW4obm9kZSwgcC0+bmFtZSk7Ci0JCWlmIChwLT5sZW5ndGggPD0gMCkgewotCQkJcC0+bGVuZ3RoID0gMDsKLQkJfSBlbHNlIHsKLQkJCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhwLT5sZW5ndGggKyAxKTsKLQkJCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgcC0+bmFtZSwgcC0+dmFsdWUsCi0JCQkJCSAgICAgICBwLT5sZW5ndGgpOwotCQkJaWYgKGxlbiA8PSAwKQotCQkJCXAtPmxlbmd0aCA9IDA7Ci0JCQkoKHVuc2lnbmVkIGNoYXIgKilwLT52YWx1ZSlbcC0+bGVuZ3RoXSA9ICdcMCc7Ci0JCX0KLQl9Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfcHJvcF9saXN0KHBoYW5kbGUgbm9kZSkKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKmhlYWQsICp0YWlsOwotCi0JaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMLAotCQkJCSAgICAgIi5ub2RlIiwgJm5vZGUsIHNpemVvZihub2RlKSk7Ci0KLQl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7Ci0JdGFpbCA9IHRhaWwtPm5leHQ7Ci0Jd2hpbGUodGFpbCkgewotCQl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgdGFpbC0+bmFtZSwKLQkJCQkJICAgIE5VTEwsIE5VTEwsIDApOwotCQl0YWlsID0gdGFpbC0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gaGVhZDsKLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXQgZ2V0X29uZV9wcm9wZXJ0eShwaGFuZGxlIG5vZGUsIGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqYnVmID0gIjxOVUxMPiI7Ci0JaW50IGxlbjsKLQotCWxlbiA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBuYW1lKTsKLQlpZiAobGVuID4gMCkgewotCQlidWYgPSBwcm9tX2Vhcmx5X2FsbG9jKGxlbik7Ci0JCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgbmFtZSwgYnVmLCBsZW4pOwotCX0KLQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgY3JlYXRlX25vZGUocGhhbmRsZSBub2RlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0KLQlpZiAoIW5vZGUpCi0JCXJldHVybiBOVUxMOwotCi0JZHAgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZigqZHApKTsKLQlkcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0KLQlrcmVmX2luaXQoJmRwLT5rcmVmKTsKLQotCWRwLT5uYW1lID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAibmFtZSIpOwotCWRwLT50eXBlID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiKTsKLQlkcC0+bm9kZSA9IG5vZGU7Ci0KLQkvKiBCdWlsZCBpbnRlcnJ1cHRzIGxhdGVyLi4uICovCi0KLQlkcC0+cHJvcGVydGllcyA9IGJ1aWxkX3Byb3BfbGlzdChub2RlKTsKLQotCXJldHVybiBkcDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdCBidWlsZF90cmVlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBwaGFuZGxlIG5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKipuZXh0cCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCi0JZHAgPSBjcmVhdGVfbm9kZShub2RlKTsKLQlpZiAoZHApIHsKLQkJKigqbmV4dHApID0gZHA7Ci0JCSpuZXh0cCA9ICZkcC0+YWxsbmV4dDsKLQotCQlkcC0+cGFyZW50ID0gcGFyZW50OwotCQlkcC0+cGF0aF9jb21wb25lbnRfbmFtZSA9IGJ1aWxkX3BhdGhfY29tcG9uZW50KGRwKTsKLQkJZHAtPmZ1bGxfbmFtZSA9IGJ1aWxkX2Z1bGxfbmFtZShkcCk7Ci0KLQkJZHAtPmNoaWxkID0gYnVpbGRfdHJlZShkcCwgcHJvbV9nZXRjaGlsZChub2RlKSwgbmV4dHApOwotCi0JCWRwLT5zaWJsaW5nID0gYnVpbGRfdHJlZShwYXJlbnQsIHByb21fZ2V0c2libGluZyhub2RlKSwgbmV4dHApOwotCX0KLQotCXJldHVybiBkcDsKLX0KLQotc3RydWN0IGRldmljZV9ub2RlICpvZl9jb25zb2xlX2RldmljZTsKLUVYUE9SVF9TWU1CT0wob2ZfY29uc29sZV9kZXZpY2UpOwotCi1jaGFyICpvZl9jb25zb2xlX3BhdGg7Ci1FWFBPUlRfU1lNQk9MKG9mX2NvbnNvbGVfcGF0aCk7Ci0KLWNoYXIgKm9mX2NvbnNvbGVfb3B0aW9uczsKLUVYUE9SVF9TWU1CT0wob2ZfY29uc29sZV9vcHRpb25zKTsKLQotZXh0ZXJuIHZvaWQgcmVzdG9yZV9jdXJyZW50KHZvaWQpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb2ZfY29uc29sZV9pbml0KHZvaWQpCi17Ci0JY2hhciAqbXNnID0gIk9GIHN0ZG91dCBkZXZpY2UgaXM6ICVzXG4iOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQljb25zdCBjaGFyICp0eXBlOwotCXBoYW5kbGUgbm9kZTsKLQlpbnQgc2tpcCwgdG1wLCBmZDsKLQotCW9mX2NvbnNvbGVfcGF0aCA9IHByb21fZWFybHlfYWxsb2MoMjU2KTsKLQotCXN3aXRjaCAocHJvbV92ZXJzKSB7Ci0JY2FzZSBQUk9NX1YwOgotCQlza2lwID0gMDsKLQkJc3dpdGNoICgqcm9tdmVjLT5wdl9zdGRvdXQpIHsKLQkJY2FzZSBQUk9NREVWX1NDUkVFTjoKLQkJCXR5cGUgPSAiZGlzcGxheSI7Ci0JCQlicmVhazsKLQotCQljYXNlIFBST01ERVZfVFRZQjoKLQkJCXNraXAgPSAxOwotCQkJLyogRkFMTFRIUlUgKi8KLQotCQljYXNlIFBST01ERVZfVFRZQToKLQkJCXR5cGUgPSAic2VyaWFsIjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcm9tX3ByaW50ZigiSW52YWxpZCBQUk9NX1YwIHN0ZG91dCB2YWx1ZSAldVxuIiwKLQkJCQkgICAgKnJvbXZlYy0+cHZfc3Rkb3V0KTsKLQkJCXByb21faGFsdCgpOwotCQl9Ci0KLQkJdG1wID0gc2tpcDsKLQkJZm9yX2VhY2hfbm9kZV9ieV90eXBlKGRwLCB0eXBlKSB7Ci0JCQlpZiAoIXRtcC0tKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICghZHApIHsKLQkJCXByb21fcHJpbnRmKCJDYW5ub3QgZmluZCBQUk9NX1YwIGNvbnNvbGUgbm9kZS5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KLQkJb2ZfY29uc29sZV9kZXZpY2UgPSBkcDsKLQotCQlzdHJjcHkob2ZfY29uc29sZV9wYXRoLCBkcC0+ZnVsbF9uYW1lKTsKLQkJaWYgKCFzdHJjbXAodHlwZSwgInNlcmlhbCIpKSB7Ci0JCQlzdHJjYXQob2ZfY29uc29sZV9wYXRoLAotCQkJICAgICAgIChza2lwID8gIjpiIiA6ICI6YSIpKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSBQUk9NX1YyOgotCWNhc2UgUFJPTV9WMzoKLQkJZmQgPSAqcm9tdmVjLT5wdl92MmJvb3RhcmdzLmZkX3N0ZG91dDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJvbV9sb2NrLCBmbGFncyk7Ci0JCW5vZGUgPSAoKnJvbXZlYy0+cHZfdjJkZXZvcHMudjJfaW5zdDJwa2cpKGZkKTsKLQkJcmVzdG9yZV9jdXJyZW50KCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwotCi0JCWlmICghbm9kZSkgewotCQkJcHJvbV9wcmludGYoIkNhbm5vdCByZXNvbHZlIHN0ZG91dCBub2RlIGZyb20gIgotCQkJCSAgICAiaW5zdGFuY2UgJTA4eC5cbiIsIGZkKTsKLQkJCXByb21faGFsdCgpOwotCQl9Ci0JCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUobm9kZSk7Ci0JCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOwotCi0JCWlmICghdHlwZSkgewotCQkJcHJvbV9wcmludGYoIkNvbnNvbGUgc3Rkb3V0IGxhY2tzICIKLQkJCQkgICAgImRldmljZV90eXBlIHByb3BlcnR5LlxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCi0JCWlmIChzdHJjbXAodHlwZSwgImRpc3BsYXkiKSAmJiBzdHJjbXAodHlwZSwgInNlcmlhbCIpKSB7Ci0JCQlwcm9tX3ByaW50ZigiQ29uc29sZSBkZXZpY2VfdHlwZSBpcyBuZWl0aGVyIGRpc3BsYXkgIgotCQkJCSAgICAibm9yIHNlcmlhbC5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KLQotCQlvZl9jb25zb2xlX2RldmljZSA9IGRwOwotCi0JCWlmIChwcm9tX3ZlcnMgPT0gUFJPTV9WMikgewotCQkJc3RyY3B5KG9mX2NvbnNvbGVfcGF0aCwgZHAtPmZ1bGxfbmFtZSk7Ci0JCQlzd2l0Y2ggKCpyb212ZWMtPnB2X3N0ZG91dCkgewotCQkJY2FzZSBQUk9NREVWX1RUWUE6Ci0JCQkJc3RyY2F0KG9mX2NvbnNvbGVfcGF0aCwgIjphIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBST01ERVZfVFRZQjoKLQkJCQlzdHJjYXQob2ZfY29uc29sZV9wYXRoLCAiOmIiKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbnN0IGNoYXIgKnBhdGg7Ci0KLQkJCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQkJCXBhdGggPSBvZl9nZXRfcHJvcGVydHkoZHAsICJzdGRvdXQtcGF0aCIsIE5VTEwpOwotCQkJaWYgKCFwYXRoKSB7Ci0JCQkJcHJvbV9wcmludGYoIk5vIHN0ZG91dC1wYXRoIGluIHJvb3Qgbm9kZS5cbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCQkJc3RyY3B5KG9mX2NvbnNvbGVfcGF0aCwgcGF0aCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0Jb2ZfY29uc29sZV9vcHRpb25zID0gc3RycmNocihvZl9jb25zb2xlX3BhdGgsICc6Jyk7Ci0JaWYgKG9mX2NvbnNvbGVfb3B0aW9ucykgewotCQlvZl9jb25zb2xlX29wdGlvbnMrKzsKLQkJaWYgKCpvZl9jb25zb2xlX29wdGlvbnMgPT0gJ1wwJykKLQkJCW9mX2NvbnNvbGVfb3B0aW9ucyA9IE5VTEw7Ci0JfQotCi0JcHJvbV9wcmludGYobXNnLCBvZl9jb25zb2xlX3BhdGgpOwotCXByaW50ayhtc2csIG9mX2NvbnNvbGVfcGF0aCk7Ci19Ci0KLXZvaWQgX19pbml0IHByb21fYnVpbGRfZGV2aWNldHJlZSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5leHRwOwotCi0JYWxsbm9kZXMgPSBjcmVhdGVfbm9kZShwcm9tX3Jvb3Rfbm9kZSk7Ci0JYWxsbm9kZXMtPnBhdGhfY29tcG9uZW50X25hbWUgPSAiIjsKLQlhbGxub2Rlcy0+ZnVsbF9uYW1lID0gIi8iOwotCi0JbmV4dHAgPSAmYWxsbm9kZXMtPmFsbG5leHQ7Ci0JYWxsbm9kZXMtPmNoaWxkID0gYnVpbGRfdHJlZShhbGxub2RlcywKLQkJCQkgICAgIHByb21fZ2V0Y2hpbGQoYWxsbm9kZXMtPm5vZGUpLAotCQkJCSAgICAgJm5leHRwKTsKLQlvZl9jb25zb2xlX2luaXQoKTsKLQotCXByaW50aygiUFJPTTogQnVpbHQgZGV2aWNlIHRyZWUgd2l0aCAldSBieXRlcyBvZiBtZW1vcnkuXG4iLAotCSAgICAgICBwcm9tX2Vhcmx5X2FsbG9jYXRlZCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwZjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9fUFJPTV9ICisjZGVmaW5lIF9fUFJPTV9ICisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsbG5vZGVzOwkvKiB0ZW1wb3Jhcnkgd2hpbGUgbWVyZ2luZyAqLworZXh0ZXJuIHJ3bG9ja190IGRldnRyZWVfbG9jazsJLyogdGVtcG9yYXJ5IHdoaWxlIG1lcmdpbmcgKi8KKworZXh0ZXJuIHZvaWQgKiBwcm9tX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gdm9pZCBpcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBwcm9tX3VuaXF1ZV9pZDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfcm9vdF9ub2RlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJaWYgKCFkcCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRwLT5wYXJlbnQgPT0gTlVMTCk7Cit9CisKK2V4dGVybiBjaGFyICpidWlsZF9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKTsKK2V4dGVybiB2b2lkIG9mX2NvbnNvbGVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9mX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgcHJvbV9lYXJseV9hbGxvY2F0ZWQ7CisKKyNlbmRpZiAvKiBfX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDNlODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzMyLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBQcm9jZWR1cmVzIGZvciBjcmVhdGluZywgYWNjZXNzaW5nIGFuZCBpbnRlcnByZXRpbmcgdGhlIGRldmljZSB0cmVlLgorICoKKyAqIFBhdWwgTWFja2VycmFzCUF1Z3VzdCAxOTk2LgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgUGF1bCBNYWNrZXJyYXMuCisgKiAKKyAqICBBZGFwdGVkIGZvciA2NGJpdCBQb3dlclBDIGJ5IERhdmUgRW5nZWJyZXRzZW4gYW5kIFBldGVyIEJlcmduZXIuCisgKiAgICB7ZW5nZWJyZXR8YmVyZ25lcn1AdXMuaWJtLmNvbSAKKyAqCisgKiAgQWRhcHRlZCBmb3Igc3BhcmMzMiBieSBEYXZpZCBTLiBNaWxsZXIgZGF2ZW1AZGF2ZW1sb2Z0Lm5ldAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisKKyNpbmNsdWRlICJwcm9tLmgiCisKK3ZvaWQgKiBfX2luaXQgcHJvbV9lYXJseV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX19hbGxvY19ib290bWVtKHNpemUsIFNNUF9DQUNIRV9CWVRFUywgMFVMKTsKKwlpZiAocmV0ICE9IE5VTEwpCisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCisJcHJvbV9lYXJseV9hbGxvY2F0ZWQgKz0gc2l6ZTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZGVhbCB3aXRoIHRoZSBibGFjayBtYWdpYyBvZiBmdWxseSBuYW1pbmcgYQorICogbm9kZS4KKyAqCisgKiBDZXJ0YWluIHdlbGwga25vd24gbmFtZWQgbm9kZXMgYXJlIGp1c3QgdGhlIHNpbXBsZSBuYW1lIHN0cmluZy4KKyAqCisgKiBBY3R1YWwgZGV2aWNlcyBoYXZlIGFuIGFkZHJlc3Mgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUKKyAqIHN0cmluZywgbGlrZSB0aGlzICJmb29AYWRkciIuICBUaGUgImFkZHIiIGNhbiBiZSBpbiBhbnkgbnVtYmVyIG9mCisgKiBmb3JtYXRzLCBhbmQgdGhlIHBsYXRmb3JtIHBsdXMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgZGV0ZXJtaW5lIHRoZQorICogZm9ybWF0IGFuZCBob3cgaXQgaXMgY29uc3RydWN0ZWQuCisgKgorICogRm9yIGNoaWxkcmVuIG9mIHRoZSBST09UIG5vZGUsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpcyBmaXhlZCBhbmQKKyAqIGRldGVybWluZWQgYnkgd2hldGhlciB0aGlzIGlzIGEgc3VuNHUgb3Igc3VuNHYgc3lzdGVtLgorICoKKyAqIEZvciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgaXQgaXMgYnVzIHR5cGUgc3BlY2lmaWMuICBTbworICogd2Ugd2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBkaXNjb3ZlciBhICJkZXZpY2VfdHlwZSIgcHJvcGVydHkKKyAqIHdlIHJlY29nbml6ZSBhbmQgd2UgZ28gZnJvbSB0aGVyZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNwYXJjMzJfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpycHJvcDsKKworCXJwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcnByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBycHJvcC0+dmFsdWU7CisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sIHJlZ3MtPnBoeXNfYWRkcik7Cit9CisKKy8qICJuYW1lQHNsb3Qsb2Zmc2V0IiAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzYnVzX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sCisJCXJlZ3MtPnBoeXNfYWRkcik7Cit9CisKKy8qICJuYW1lQGRldm51bVssZnVuY10iICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdW5zaWduZWQgaW50IGRldmZuOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwlkZXZmbiA9IChyZWdzLT5waHlzX2hpID4+IDgpICYgMHhmZjsKKwlpZiAoZGV2Zm4gJiAweDA3KSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJCWRwLT5uYW1lLAorCQkJZGV2Zm4gPj4gMywKKwkJCWRldmZuICYgMHgwNyk7CisJfSBlbHNlIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgiLAorCQkJZHAtPm5hbWUsCisJCQlkZXZmbiA+PiAzKTsKKwl9Cit9CisKKy8qICJuYW1lQGFkZHJoaSxhZGRybG8iICovCitzdGF0aWMgdm9pZCBfX2luaXQgZWJ1c19wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sIHJlZ3MtPnBoeXNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2J1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OworCisJaWYgKHBhcmVudCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaWV4IikpCisJCQlyZXR1cm4gcGNpX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAic2J1cyIpKQorCQkJcmV0dXJuIHNidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJlYnVzIikpCisJCQlyZXR1cm4gZWJ1c19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisKKwkJLyogImlzYSIgaXMgaGFuZGxlZCB3aXRoIHBsYXRmb3JtIG5hbWluZyAqLworCX0KKworCS8qIFVzZSBwbGF0Zm9ybSBuYW1pbmcgY29udmVudGlvbi4gICovCisJcmV0dXJuIHNwYXJjMzJfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworfQorCitjaGFyICogX19pbml0IGJ1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY2hhciB0bXBfYnVmWzY0XSwgKm47CisKKwl0bXBfYnVmWzBdID0gJ1wwJzsKKwlfX2J1aWxkX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwlpZiAodG1wX2J1ZlswXSA9PSAnXDAnKQorCQlzdHJjcHkodG1wX2J1ZiwgZHAtPm5hbWUpOworCisJbiA9IHByb21fZWFybHlfYWxsb2Moc3RybGVuKHRtcF9idWYpICsgMSk7CisJc3RyY3B5KG4sIHRtcF9idWYpOworCisJcmV0dXJuIG47Cit9CisKK2V4dGVybiB2b2lkIHJlc3RvcmVfY3VycmVudCh2b2lkKTsKKwordm9pZCBfX2luaXQgb2ZfY29uc29sZV9pbml0KHZvaWQpCit7CisJY2hhciAqbXNnID0gIk9GIHN0ZG91dCBkZXZpY2UgaXM6ICVzXG4iOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCBjaGFyICp0eXBlOworCXBoYW5kbGUgbm9kZTsKKwlpbnQgc2tpcCwgdG1wLCBmZDsKKworCW9mX2NvbnNvbGVfcGF0aCA9IHByb21fZWFybHlfYWxsb2MoMjU2KTsKKworCXN3aXRjaCAocHJvbV92ZXJzKSB7CisJY2FzZSBQUk9NX1YwOgorCQlza2lwID0gMDsKKwkJc3dpdGNoICgqcm9tdmVjLT5wdl9zdGRvdXQpIHsKKwkJY2FzZSBQUk9NREVWX1NDUkVFTjoKKwkJCXR5cGUgPSAiZGlzcGxheSI7CisJCQlicmVhazsKKworCQljYXNlIFBST01ERVZfVFRZQjoKKwkJCXNraXAgPSAxOworCQkJLyogRkFMTFRIUlUgKi8KKworCQljYXNlIFBST01ERVZfVFRZQToKKwkJCXR5cGUgPSAic2VyaWFsIjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcm9tX3ByaW50ZigiSW52YWxpZCBQUk9NX1YwIHN0ZG91dCB2YWx1ZSAldVxuIiwKKwkJCQkgICAgKnJvbXZlYy0+cHZfc3Rkb3V0KTsKKwkJCXByb21faGFsdCgpOworCQl9CisKKwkJdG1wID0gc2tpcDsKKwkJZm9yX2VhY2hfbm9kZV9ieV90eXBlKGRwLCB0eXBlKSB7CisJCQlpZiAoIXRtcC0tKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghZHApIHsKKwkJCXByb21fcHJpbnRmKCJDYW5ub3QgZmluZCBQUk9NX1YwIGNvbnNvbGUgbm9kZS5cbiIpOworCQkJcHJvbV9oYWx0KCk7CisJCX0KKwkJb2ZfY29uc29sZV9kZXZpY2UgPSBkcDsKKworCQlzdHJjcHkob2ZfY29uc29sZV9wYXRoLCBkcC0+ZnVsbF9uYW1lKTsKKwkJaWYgKCFzdHJjbXAodHlwZSwgInNlcmlhbCIpKSB7CisJCQlzdHJjYXQob2ZfY29uc29sZV9wYXRoLAorCQkJICAgICAgIChza2lwID8gIjpiIiA6ICI6YSIpKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJY2FzZSBQUk9NX1YyOgorCWNhc2UgUFJPTV9WMzoKKwkJZmQgPSAqcm9tdmVjLT5wdl92MmJvb3RhcmdzLmZkX3N0ZG91dDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJvbV9sb2NrLCBmbGFncyk7CisJCW5vZGUgPSAoKnJvbXZlYy0+cHZfdjJkZXZvcHMudjJfaW5zdDJwa2cpKGZkKTsKKwkJcmVzdG9yZV9jdXJyZW50KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOworCisJCWlmICghbm9kZSkgeworCQkJcHJvbV9wcmludGYoIkNhbm5vdCByZXNvbHZlIHN0ZG91dCBub2RlIGZyb20gIgorCQkJCSAgICAiaW5zdGFuY2UgJTA4eC5cbiIsIGZkKTsKKwkJCXByb21faGFsdCgpOworCQl9CisJCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUobm9kZSk7CisJCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOworCisJCWlmICghdHlwZSkgeworCQkJcHJvbV9wcmludGYoIkNvbnNvbGUgc3Rkb3V0IGxhY2tzICIKKwkJCQkgICAgImRldmljZV90eXBlIHByb3BlcnR5LlxuIik7CisJCQlwcm9tX2hhbHQoKTsKKwkJfQorCisJCWlmIChzdHJjbXAodHlwZSwgImRpc3BsYXkiKSAmJiBzdHJjbXAodHlwZSwgInNlcmlhbCIpKSB7CisJCQlwcm9tX3ByaW50ZigiQ29uc29sZSBkZXZpY2VfdHlwZSBpcyBuZWl0aGVyIGRpc3BsYXkgIgorCQkJCSAgICAibm9yIHNlcmlhbC5cbiIpOworCQkJcHJvbV9oYWx0KCk7CisJCX0KKworCQlvZl9jb25zb2xlX2RldmljZSA9IGRwOworCisJCWlmIChwcm9tX3ZlcnMgPT0gUFJPTV9WMikgeworCQkJc3RyY3B5KG9mX2NvbnNvbGVfcGF0aCwgZHAtPmZ1bGxfbmFtZSk7CisJCQlzd2l0Y2ggKCpyb212ZWMtPnB2X3N0ZG91dCkgeworCQkJY2FzZSBQUk9NREVWX1RUWUE6CisJCQkJc3RyY2F0KG9mX2NvbnNvbGVfcGF0aCwgIjphIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFBST01ERVZfVFRZQjoKKwkJCQlzdHJjYXQob2ZfY29uc29sZV9wYXRoLCAiOmIiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGg7CisKKwkJCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwkJCXBhdGggPSBvZl9nZXRfcHJvcGVydHkoZHAsICJzdGRvdXQtcGF0aCIsIE5VTEwpOworCQkJaWYgKCFwYXRoKSB7CisJCQkJcHJvbV9wcmludGYoIk5vIHN0ZG91dC1wYXRoIGluIHJvb3Qgbm9kZS5cbiIpOworCQkJCXByb21faGFsdCgpOworCQkJfQorCQkJc3RyY3B5KG9mX2NvbnNvbGVfcGF0aCwgcGF0aCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJb2ZfY29uc29sZV9vcHRpb25zID0gc3RycmNocihvZl9jb25zb2xlX3BhdGgsICc6Jyk7CisJaWYgKG9mX2NvbnNvbGVfb3B0aW9ucykgeworCQlvZl9jb25zb2xlX29wdGlvbnMrKzsKKwkJaWYgKCpvZl9jb25zb2xlX29wdGlvbnMgPT0gJ1wwJykKKwkJCW9mX2NvbnNvbGVfb3B0aW9ucyA9IE5VTEw7CisJfQorCisJcHJvbV9wcmludGYobXNnLCBvZl9jb25zb2xlX3BhdGgpOworCXByaW50ayhtc2csIG9mX2NvbnNvbGVfcGF0aCk7Cit9CisKK3ZvaWQgX19pbml0IG9mX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCkKK3sKK30KKwordm9pZCBfX2luaXQgaXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVjY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCkBAIC0wLDAgKzEsNTcxIEBACisvKgorICogUHJvY2VkdXJlcyBmb3IgY3JlYXRpbmcsIGFjY2Vzc2luZyBhbmQgaW50ZXJwcmV0aW5nIHRoZSBkZXZpY2UgdHJlZS4KKyAqCisgKiBQYXVsIE1hY2tlcnJhcwlBdWd1c3QgMTk5Ni4KKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA1IFBhdWwgTWFja2VycmFzLgorICogCisgKiAgQWRhcHRlZCBmb3IgNjRiaXQgUG93ZXJQQyBieSBEYXZlIEVuZ2VicmV0c2VuIGFuZCBQZXRlciBCZXJnbmVyLgorICogICAge2VuZ2VicmV0fGJlcmduZXJ9QHVzLmlibS5jb20gCisgKgorICogIEFkYXB0ZWQgZm9yIHNwYXJjNjQgYnkgRGF2aWQgUy4gTWlsbGVyIGRhdmVtQGRhdmVtbG9mdC5uZXQKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sbWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hc2kuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjaW5jbHVkZSAicHJvbS5oIgorCit2b2lkICogX19pbml0IHByb21fZWFybHlfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBsbWJfYWxsb2Moc2l6ZSwgU01QX0NBQ0hFX0JZVEVTKTsKKwl2b2lkICpyZXQ7CisKKwlpZiAoIXBhZGRyKSB7CisJCXByb21fcHJpbnRmKCJwcm9tX2Vhcmx5X2FsbG9jKCVsdSkgZmFpbGVkXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCisJcmV0ID0gX192YShwYWRkcik7CisJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJcHJvbV9lYXJseV9hbGxvY2F0ZWQgKz0gc2l6ZTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZGVhbCB3aXRoIHRoZSBibGFjayBtYWdpYyBvZiBmdWxseSBuYW1pbmcgYQorICogbm9kZS4KKyAqCisgKiBDZXJ0YWluIHdlbGwga25vd24gbmFtZWQgbm9kZXMgYXJlIGp1c3QgdGhlIHNpbXBsZSBuYW1lIHN0cmluZy4KKyAqCisgKiBBY3R1YWwgZGV2aWNlcyBoYXZlIGFuIGFkZHJlc3Mgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUKKyAqIHN0cmluZywgbGlrZSB0aGlzICJmb29AYWRkciIuICBUaGUgImFkZHIiIGNhbiBiZSBpbiBhbnkgbnVtYmVyIG9mCisgKiBmb3JtYXRzLCBhbmQgdGhlIHBsYXRmb3JtIHBsdXMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgZGV0ZXJtaW5lIHRoZQorICogZm9ybWF0IGFuZCBob3cgaXQgaXMgY29uc3RydWN0ZWQuCisgKgorICogRm9yIGNoaWxkcmVuIG9mIHRoZSBST09UIG5vZGUsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpcyBmaXhlZCBhbmQKKyAqIGRldGVybWluZWQgYnkgd2hldGhlciB0aGlzIGlzIGEgc3VuNHUgb3Igc3VuNHYgc3lzdGVtLgorICoKKyAqIEZvciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgaXQgaXMgYnVzIHR5cGUgc3BlY2lmaWMuICBTbworICogd2Ugd2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBkaXNjb3ZlciBhICJkZXZpY2VfdHlwZSIgcHJvcGVydHkKKyAqIHdlIHJlY29nbml6ZSBhbmQgd2UgZ28gZnJvbSB0aGVyZS4KKyAqCisgKiBBcyBhbiBleGFtcGxlLCB0aGUgYm9vdCBkZXZpY2Ugb24gbXkgd29ya3N0YXRpb24gaGFzIGEgZnVsbCBwYXRoOgorICoKKyAqCS9wY2lAMWUsNjAwMDAwL2lkZUBkL2Rpc2tAMCwwOmMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHN1bjR2X3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpycHJvcDsKKwl1MzIgaGlnaF9iaXRzLCBsb3dfYml0cywgdHlwZTsKKworCXJwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcnByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBycHJvcC0+dmFsdWU7CisJaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAorCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOworCQlyZXR1cm47CisJfQorCisJdHlwZSA9IHJlZ3MtPnBoeXNfYWRkciA+PiA2MFVMOworCWhpZ2hfYml0cyA9IChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmVUw7CisJbG93X2JpdHMgPSAocmVncy0+cGh5c19hZGRyICYgMHhmZmZmZmZmZlVMKTsKKworCWlmICh0eXBlID09IDAgfHwgdHlwZSA9PSA4KSB7CisJCWNvbnN0IGNoYXIgKnByZWZpeCA9ICh0eXBlID09IDApID8gIm0iIDogImkiOworCisJCWlmIChsb3dfYml0cykKKwkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgsJXgiLAorCQkJCWRwLT5uYW1lLCBwcmVmaXgsCisJCQkJaGlnaF9iaXRzLCBsb3dfYml0cyk7CisJCWVsc2UKKwkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgiLAorCQkJCWRwLT5uYW1lLAorCQkJCXByZWZpeCwKKwkJCQloaWdoX2JpdHMpOworCX0gZWxzZSBpZiAodHlwZSA9PSAxMikgeworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCisJCQlkcC0+bmFtZSwgaGlnaF9iaXRzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW40dV9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisJaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAorCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOworCQlyZXR1cm47CisJfQorCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1cGEtcG9ydGlkIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInBvcnRpZCIsIE5VTEwpOworCWlmIChwcm9wKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworCQlpZiAodGxiX3R5cGUgPj0gY2hlZXRhaCkKKwkJCW1hc2sgPSAweDdmZmZmZjsKKworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCisJCQlkcC0+bmFtZSwKKwkJCSoodTMyICopcHJvcC0+dmFsdWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyICYgbWFzaykpOworCX0KK30KKworLyogIm5hbWVAc2xvdCxvZmZzZXQiICAqLworc3RhdGljIHZvaWQgX19pbml0IHNidXNfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCisJCWRwLT5uYW1lLAorCQlyZWdzLT53aGljaF9pbywKKwkJcmVncy0+cGh5c19hZGRyKTsKK30KKworLyogIm5hbWVAZGV2bnVtWyxmdW5jXSIgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCWRldmZuID0gKHJlZ3MtPnBoeXNfaGkgPj4gOCkgJiAweGZmOworCWlmIChkZXZmbiAmIDB4MDcpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQlkZXZmbiA+PiAzLAorCQkJZGV2Zm4gJiAweDA3KTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCisJCQlkcC0+bmFtZSwKKwkJCWRldmZuID4+IDMpOworCX0KK30KKworLyogIm5hbWVAVVBBX1BPUlRJRCxvZmZzZXQiICovCitzdGF0aWMgdm9pZCBfX2luaXQgdXBhX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidXBhLXBvcnRpZCIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJKih1MzIgKikgcHJvcC0+dmFsdWUsCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKK30KKworLyogIm5hbWVAcmVnIiAqLworc3RhdGljIHZvaWQgX19pbml0IHZkZXZfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdTMyICpyZWdzOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4IiwgZHAtPm5hbWUsICpyZWdzKTsKK30KKworLyogIm5hbWVAYWRkcmhpLGFkZHJsbyIgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYnVzX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJZHAtPm5hbWUsCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCksCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKK30KKworLyogIm5hbWVAYnVzLGFkZHIiICovCitzdGF0aWMgdm9pZCBfX2luaXQgaTJjX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXUzMiAqcmVnczsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisKKwkvKiBUaGlzIGFjdHVhbGx5IGlzbid0IHJpZ2h0Li4uIHNob3VsZCBsb29rIGF0IHRoZSAjYWRkcmVzcy1jZWxscworCSAqIHByb3BlcnR5IG9mIHRoZSBpMmMgYnVzIG5vZGUgZXRjLiBldGMuCisJICovCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwgcmVnc1swXSwgcmVnc1sxXSk7Cit9CisKKy8qICJuYW1lQHJlZzBbLHJlZzFdIiAqLworc3RhdGljIHZvaWQgX19pbml0IHVzYl9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl1MzIgKnJlZ3M7CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCisJaWYgKHByb3AtPmxlbmd0aCA9PSBzaXplb2YodTMyKSB8fCByZWdzWzFdID09IDEpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgiLAorCQkJZHAtPm5hbWUsIHJlZ3NbMF0pOworCX0gZWxzZSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKKwl9Cit9CisKKy8qICJuYW1lQHJlZzByZWcxWyxyZWcycmVnM10iICovCitzdGF0aWMgdm9pZCBfX2luaXQgaWVlZTEzOTRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdTMyICpyZWdzOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCWlmIChyZWdzWzJdIHx8IHJlZ3NbM10pIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJTA4eCUwOHgsJTA0eCUwOHgiLAorCQkJZHAtPm5hbWUsIHJlZ3NbMF0sIHJlZ3NbMV0sIHJlZ3NbMl0sIHJlZ3NbM10pOworCX0gZWxzZSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCUwOHglMDh4IiwKKwkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2J1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OworCisJaWYgKHBhcmVudCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaWV4IikpIHsKKwkJCXBjaV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAic2J1cyIpKSB7CisJCQlzYnVzX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ1cGEiKSkgeworCQkJdXBhX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJlYnVzIikpIHsKKwkJCWVidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHBhcmVudC0+bmFtZSwgInVzYiIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+bmFtZSwgImh1YiIpKSB7CisJCQl1c2JfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImkyYyIpKSB7CisJCQlpMmNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImZpcmV3aXJlIikpIHsKKwkJCWllZWUxMzk0X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ2aXJ0dWFsLWRldmljZXMiKSkgeworCQkJdmRldl9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogImlzYSIgaXMgaGFuZGxlZCB3aXRoIHBsYXRmb3JtIG5hbWluZyAqLworCX0KKworCS8qIFVzZSBwbGF0Zm9ybSBuYW1pbmcgY29udmVudGlvbi4gICovCisJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKKwkJc3VuNHZfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJc3VuNHVfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCX0KK30KKworY2hhciAqIF9faW5pdCBidWlsZF9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWNoYXIgdG1wX2J1Zls2NF0sICpuOworCisJdG1wX2J1ZlswXSA9ICdcMCc7CisJX19idWlsZF9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJaWYgKHRtcF9idWZbMF0gPT0gJ1wwJykKKwkJc3RyY3B5KHRtcF9idWYsIGRwLT5uYW1lKTsKKworCW4gPSBwcm9tX2Vhcmx5X2FsbG9jKHN0cmxlbih0bXBfYnVmKSArIDEpOworCXN0cmNweShuLCB0bXBfYnVmKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X21pZF9wcm9wKHZvaWQpCit7CisJcmV0dXJuICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSA/ICJ1cGEtcG9ydGlkIiA6ICJwb3J0aWQiKTsKK30KKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfY3B1aWQoaW50IGNwdWlkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJY29uc3QgY2hhciAqbWlkX3Byb3AgPSBnZXRfbWlkX3Byb3AoKTsKKworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShkcCwgImNwdSIpIHsKKwkJaW50IGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCBtaWRfcHJvcCwgLTEpOworCQljb25zdCBjaGFyICp0aGlzX21pZF9wcm9wID0gbWlkX3Byb3A7CisKKwkJaWYgKGlkIDwgMCkgeworCQkJdGhpc19taWRfcHJvcCA9ICJjcHVpZCI7CisJCQlpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgdGhpc19taWRfcHJvcCwgLTEpOworCQl9CisKKwkJaWYgKGlkIDwgMCkgeworCQkJcHJvbV9wcmludGYoIk9GOiBTZXJpb3VzIHByb2JsZW0sIGNwdSBsYWNrcyAiCisJCQkJICAgICIlcyBwcm9wZXJ0eSIsIHRoaXNfbWlkX3Byb3ApOworCQkJcHJvbV9oYWx0KCk7CisJCX0KKwkJaWYgKGNwdWlkID09IGlkKQorCQkJcmV0dXJuIGRwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX2luaXQgb2ZfZmlsbF9pbl9jcHVfZGF0YSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJY29uc3QgY2hhciAqbWlkX3Byb3A7CisKKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikKKwkJcmV0dXJuOworCisJbWlkX3Byb3AgPSBnZXRfbWlkX3Byb3AoKTsKKwluY3B1c19wcm9iZWQgPSAwOworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShkcCwgImNwdSIpIHsKKwkJaW50IGNwdWlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCBtaWRfcHJvcCwgLTEpOworCQljb25zdCBjaGFyICp0aGlzX21pZF9wcm9wID0gbWlkX3Byb3A7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG9ydGlkX3BhcmVudDsKKwkJaW50IHBvcnRpZCA9IC0xOworCisJCXBvcnRpZF9wYXJlbnQgPSBOVUxMOworCQlpZiAoY3B1aWQgPCAwKSB7CisJCQl0aGlzX21pZF9wcm9wID0gImNwdWlkIjsKKwkJCWNwdWlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCB0aGlzX21pZF9wcm9wLCAtMSk7CisJCQlpZiAoY3B1aWQgPj0gMCkgeworCQkJCWludCBsaW1pdCA9IDI7CisKKwkJCQlwb3J0aWRfcGFyZW50ID0gZHA7CisJCQkJd2hpbGUgKGxpbWl0LS0pIHsKKwkJCQkJcG9ydGlkX3BhcmVudCA9IHBvcnRpZF9wYXJlbnQtPnBhcmVudDsKKwkJCQkJaWYgKCFwb3J0aWRfcGFyZW50KQorCQkJCQkJYnJlYWs7CisJCQkJCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChwb3J0aWRfcGFyZW50LAorCQkJCQkJCQkgICAgICAgInBvcnRpZCIsIC0xKTsKKwkJCQkJaWYgKHBvcnRpZCA+PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGNwdWlkIDwgMCkgeworCQkJcHJvbV9wcmludGYoIk9GOiBTZXJpb3VzIHByb2JsZW0sIGNwdSBsYWNrcyAiCisJCQkJICAgICIlcyBwcm9wZXJ0eSIsIHRoaXNfbWlkX3Byb3ApOworCQkJcHJvbV9oYWx0KCk7CisJCX0KKworCQluY3B1c19wcm9iZWQrKzsKKworI2lmZGVmIENPTkZJR19TTVAKKwkJaWYgKGNwdWlkID49IE5SX0NQVVMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklnbm9yaW5nIENQVSAlZCB3aGljaCBpcyAiCisJCQkgICAgICAgIj49IE5SX0NQVVMgKCVkKVxuIiwKKwkJCSAgICAgICBjcHVpZCwgTlJfQ1BVUyk7CisJCQljb250aW51ZTsKKwkJfQorI2Vsc2UKKwkJLyogT24gdW5pcHJvY2Vzc29yIHdlIG9ubHkgd2FudCB0aGUgdmFsdWVzIGZvciB0aGUKKwkJICogcmVhbCBwaHlzaWNhbCBjcHUgdGhlIGtlcm5lbCBib290ZWQgb250bywgaG93ZXZlcgorCQkgKiBjcHVfZGF0YSgpIG9ubHkgaGFzIG9uZSBlbnRyeSBhdCBpbmRleCAwLgorCQkgKi8KKwkJaWYgKGNwdWlkICE9IHJlYWxfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljb250aW51ZTsKKwkJY3B1aWQgPSAwOworI2VuZGlmCisKKwkJY3B1X2RhdGEoY3B1aWQpLmNsb2NrX3RpY2sgPQorCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiY2xvY2stZnJlcXVlbmN5IiwgMCk7CisKKwkJaWYgKHBvcnRpZF9wYXJlbnQpIHsKKwkJCWNwdV9kYXRhKGNwdWlkKS5kY2FjaGVfc2l6ZSA9CisJCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibDEtZGNhY2hlLXNpemUiLAorCQkJCQkJICAgICAgMTYgKiAxMDI0KTsKKwkJCWNwdV9kYXRhKGNwdWlkKS5kY2FjaGVfbGluZV9zaXplID0KKwkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJsMS1kY2FjaGUtbGluZS1zaXplIiwKKwkJCQkJCSAgICAgIDMyKTsKKwkJCWNwdV9kYXRhKGNwdWlkKS5pY2FjaGVfc2l6ZSA9CisJCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibDEtaWNhY2hlLXNpemUiLAorCQkJCQkJICAgICAgOCAqIDEwMjQpOworCQkJY3B1X2RhdGEoY3B1aWQpLmljYWNoZV9saW5lX3NpemUgPQorCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImwxLWljYWNoZS1saW5lLXNpemUiLAorCQkJCQkJICAgICAgMzIpOworCQkJY3B1X2RhdGEoY3B1aWQpLmVjYWNoZV9zaXplID0KKwkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJsMi1jYWNoZS1zaXplIiwgMCk7CisJCQljcHVfZGF0YShjcHVpZCkuZWNhY2hlX2xpbmVfc2l6ZSA9CisJCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibDItY2FjaGUtbGluZS1zaXplIiwgMCk7CisJCQlpZiAoIWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfc2l6ZSB8fAorCQkJICAgICFjcHVfZGF0YShjcHVpZCkuZWNhY2hlX2xpbmVfc2l6ZSkgeworCQkJCWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfc2l6ZSA9CisJCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChwb3J0aWRfcGFyZW50LAorCQkJCQkJCSAgICAgICJsMi1jYWNoZS1zaXplIiwKKwkJCQkJCQkgICAgICAoNCAqIDEwMjQgKiAxMDI0KSk7CisJCQkJY3B1X2RhdGEoY3B1aWQpLmVjYWNoZV9saW5lX3NpemUgPQorCQkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQocG9ydGlkX3BhcmVudCwKKwkJCQkJCQkgICAgICAibDItY2FjaGUtbGluZS1zaXplIiwgNjQpOworCQkJfQorCisJCQljcHVfZGF0YShjcHVpZCkuY29yZV9pZCA9IHBvcnRpZCArIDE7CisJCQljcHVfZGF0YShjcHVpZCkucHJvY19pZCA9IHBvcnRpZDsKKyNpZmRlZiBDT05GSUdfU01QCisJCQlzcGFyYzY0X211bHRpX2NvcmUgPSAxOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQljcHVfZGF0YShjcHVpZCkuZGNhY2hlX3NpemUgPQorCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRjYWNoZS1zaXplIiwgMTYgKiAxMDI0KTsKKwkJCWNwdV9kYXRhKGNwdWlkKS5kY2FjaGVfbGluZV9zaXplID0KKwkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJkY2FjaGUtbGluZS1zaXplIiwgMzIpOworCisJCQljcHVfZGF0YShjcHVpZCkuaWNhY2hlX3NpemUgPQorCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImljYWNoZS1zaXplIiwgMTYgKiAxMDI0KTsKKwkJCWNwdV9kYXRhKGNwdWlkKS5pY2FjaGVfbGluZV9zaXplID0KKwkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJpY2FjaGUtbGluZS1zaXplIiwgMzIpOworCisJCQljcHVfZGF0YShjcHVpZCkuZWNhY2hlX3NpemUgPQorCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImVjYWNoZS1zaXplIiwKKwkJCQkJCSAgICAgICg0ICogMTAyNCAqIDEwMjQpKTsKKwkJCWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfbGluZV9zaXplID0KKwkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJlY2FjaGUtbGluZS1zaXplIiwgNjQpOworCisJCQljcHVfZGF0YShjcHVpZCkuY29yZV9pZCA9IDA7CisJCQljcHVfZGF0YShjcHVpZCkucHJvY19pZCA9IC0xOworCQl9CisKKyNpZmRlZiBDT05GSUdfU01QCisJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7CisJCWNwdV9zZXQoY3B1aWQsIGNwdV9wb3NzaWJsZV9tYXApOworI2VuZGlmCisJfQorCisJc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcygpOworfQorCit2b2lkIF9faW5pdCBvZl9jb25zb2xlX2luaXQodm9pZCkKK3sKKwljaGFyICptc2cgPSAiT0Ygc3Rkb3V0IGRldmljZSBpczogJXNcbiI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwljb25zdCBjaGFyICp0eXBlOworCXBoYW5kbGUgbm9kZTsKKworCW9mX2NvbnNvbGVfcGF0aCA9IHByb21fZWFybHlfYWxsb2MoMjU2KTsKKwlpZiAocHJvbV9paGFuZGxlMnBhdGgocHJvbV9zdGRvdXQsIG9mX2NvbnNvbGVfcGF0aCwgMjU2KSA8IDApIHsKKwkJcHJvbV9wcmludGYoIkNhbm5vdCBvYnRhaW4gcGF0aCBvZiBzdGRvdXQuXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCW9mX2NvbnNvbGVfb3B0aW9ucyA9IHN0cnJjaHIob2ZfY29uc29sZV9wYXRoLCAnOicpOworCWlmIChvZl9jb25zb2xlX29wdGlvbnMpIHsKKwkJb2ZfY29uc29sZV9vcHRpb25zKys7CisJCWlmICgqb2ZfY29uc29sZV9vcHRpb25zID09ICdcMCcpCisJCQlvZl9jb25zb2xlX29wdGlvbnMgPSBOVUxMOworCX0KKworCW5vZGUgPSBwcm9tX2luc3QycGtnKHByb21fc3Rkb3V0KTsKKwlpZiAoIW5vZGUpIHsKKwkJcHJvbV9wcmludGYoIkNhbm5vdCByZXNvbHZlIHN0ZG91dCBub2RlIGZyb20gIgorCQkJICAgICJpbnN0YW5jZSAlMDh4LlxuIiwgcHJvbV9zdGRvdXQpOworCQlwcm9tX2hhbHQoKTsKKwl9CisKKwlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKG5vZGUpOworCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOworCWlmICghdHlwZSkgeworCQlwcm9tX3ByaW50ZigiQ29uc29sZSBzdGRvdXQgbGFja3MgZGV2aWNlX3R5cGUgcHJvcGVydHkuXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCisJaWYgKHN0cmNtcCh0eXBlLCAiZGlzcGxheSIpICYmIHN0cmNtcCh0eXBlLCAic2VyaWFsIikpIHsKKwkJcHJvbV9wcmludGYoIkNvbnNvbGUgZGV2aWNlX3R5cGUgaXMgbmVpdGhlciBkaXNwbGF5ICIKKwkJCSAgICAibm9yIHNlcmlhbC5cbiIpOworCQlwcm9tX2hhbHQoKTsKKwl9CisKKwlvZl9jb25zb2xlX2RldmljZSA9IGRwOworCisJcHJpbnRrKG1zZywgb2ZfY29uc29sZV9wYXRoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWFmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCkBAIC0wLDAgKzEsMzI2IEBACisvKiBwcm9tX2NvbW1vbi5jOiBPRiBkZXZpY2UgdHJlZSBzdXBwb3J0IGNvbW1vbiBjb2RlLgorICoKKyAqIFBhdWwgTWFja2VycmFzCUF1Z3VzdCAxOTk2LgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgUGF1bCBNYWNrZXJyYXMuCisgKgorICogIEFkYXB0ZWQgZm9yIDY0Yml0IFBvd2VyUEMgYnkgRGF2ZSBFbmdlYnJldHNlbiBhbmQgUGV0ZXIgQmVyZ25lci4KKyAqICAgIHtlbmdlYnJldHxiZXJnbmVyfUB1cy5pYm0uY29tCisgKgorICogIEFkYXB0ZWQgZm9yIHNwYXJjIGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKworI2luY2x1ZGUgInByb20uaCIKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9jb25zb2xlX2RldmljZTsKK0VYUE9SVF9TWU1CT0wob2ZfY29uc29sZV9kZXZpY2UpOworCitjaGFyICpvZl9jb25zb2xlX3BhdGg7CitFWFBPUlRfU1lNQk9MKG9mX2NvbnNvbGVfcGF0aCk7CisKK2NoYXIgKm9mX2NvbnNvbGVfb3B0aW9uczsKK0VYUE9SVF9TWU1CT0wob2ZfY29uc29sZV9vcHRpb25zKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yIChucCA9IGFsbG5vZGVzOyBucDsgbnAgPSBucC0+YWxsbmV4dCkKKwkJaWYgKG5wLT5ub2RlID09IGhhbmRsZSkKKwkJCWJyZWFrOworCisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfcGhhbmRsZSk7CisKK2ludCBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGRlZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IGxlbjsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBuYW1lLCAmbGVuKTsKKwlpZiAoIXByb3AgfHwgbGVuICE9IDQpCisJCXJldHVybiBkZWY7CisKKwlyZXR1cm4gKihpbnQgKikgcHJvcC0+dmFsdWU7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldGludHByb3BfZGVmYXVsdCk7CisKK0RFRklORV9NVVRFWChvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOworRVhQT1JUX1NZTUJPTChvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOworCitpbnQgb2Zfc2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcmV2cDsKKwl2b2lkICpuZXdfdmFsOworCWludCBlcnI7CisKKwluZXdfdmFsID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghbmV3X3ZhbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmV3X3ZhbCwgdmFsLCBsZW4pOworCisJZXJyID0gLUVOT0RFVjsKKworCXdyaXRlX2xvY2soJmRldnRyZWVfbG9jayk7CisJcHJldnAgPSAmZHAtPnByb3BlcnRpZXM7CisJd2hpbGUgKCpwcmV2cCkgeworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSAqcHJldnA7CisKKwkJaWYgKCFzdHJjYXNlY21wKHByb3AtPm5hbWUsIG5hbWUpKSB7CisJCQl2b2lkICpvbGRfdmFsID0gcHJvcC0+dmFsdWU7CisJCQlpbnQgcmV0OworCisJCQltdXRleF9sb2NrKCZvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOworCQkJcmV0ID0gcHJvbV9zZXRwcm9wKGRwLT5ub2RlLCBuYW1lLCB2YWwsIGxlbik7CisJCQltdXRleF91bmxvY2soJm9mX3NldF9wcm9wZXJ0eV9tdXRleCk7CisKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlpZiAocmV0ID49IDApIHsKKwkJCQlwcm9wLT52YWx1ZSA9IG5ld192YWw7CisJCQkJcHJvcC0+bGVuZ3RoID0gbGVuOworCisJCQkJaWYgKE9GX0lTX0RZTkFNSUMocHJvcCkpCisJCQkJCWtmcmVlKG9sZF92YWwpOworCisJCQkJT0ZfTUFSS19EWU5BTUlDKHByb3ApOworCisJCQkJZXJyID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXByZXZwID0gJigqcHJldnApLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2soJmRldnRyZWVfbG9jayk7CisKKwkvKiBYWFggVXBhdGUgcHJvY2ZzIGlmIG5lY2Vzc2FyeS4uLiAqLworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wob2Zfc2V0X3Byb3BlcnR5KTsKKworaW50IG9mX2ZpbmRfaW5fcHJvcGxpc3QoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqbWF0Y2gsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaW50IGw7CisKKwkJaWYgKCFzdHJjbXAobGlzdCwgbWF0Y2gpKQorCQkJcmV0dXJuIDE7CisJCWwgPSBzdHJsZW4obGlzdCkgKyAxOworCQlsaXN0ICs9IGw7CisJCWxlbiAtPSBsOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZmluZF9pbl9wcm9wbGlzdCk7CisKK3Vuc2lnbmVkIGludCBwcm9tX3VuaXF1ZV9pZDsKKworc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqIF9faW5pdCBidWlsZF9vbmVfcHJvcChwaGFuZGxlIG5vZGUsIGNoYXIgKnByZXYsCisJCQkJCSAgICAgICBjaGFyICpzcGVjaWFsX25hbWUsCisJCQkJCSAgICAgICB2b2lkICpzcGVjaWFsX3ZhbCwKKwkJCQkJICAgICAgIGludCBzcGVjaWFsX2xlbikKK3sKKwlzdGF0aWMgc3RydWN0IHByb3BlcnR5ICp0bXAgPSBOVUxMOworCXN0cnVjdCBwcm9wZXJ0eSAqcDsKKwljb25zdCBjaGFyICpuYW1lOworCisJaWYgKHRtcCkgeworCQlwID0gdG1wOworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSArIDMyKTsKKwkJdG1wID0gTlVMTDsKKwl9IGVsc2UgeworCQlwID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IHByb3BlcnR5KSArIDMyKTsKKwkJcC0+dW5pcXVlX2lkID0gcHJvbV91bmlxdWVfaWQrKzsKKwl9CisKKwlwLT5uYW1lID0gKGNoYXIgKikgKHAgKyAxKTsKKwlpZiAoc3BlY2lhbF9uYW1lKSB7CisJCXN0cmNweShwLT5uYW1lLCBzcGVjaWFsX25hbWUpOworCQlwLT5sZW5ndGggPSBzcGVjaWFsX2xlbjsKKwkJcC0+dmFsdWUgPSBwcm9tX2Vhcmx5X2FsbG9jKHNwZWNpYWxfbGVuKTsKKwkJbWVtY3B5KHAtPnZhbHVlLCBzcGVjaWFsX3ZhbCwgc3BlY2lhbF9sZW4pOworCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1NQQVJDMzIKKwkJaWYgKHByZXYgPT0gTlVMTCkgeworCQkJbmFtZSA9IHByb21fZmlyc3Rwcm9wKG5vZGUsIE5VTEwpOworCQl9IGVsc2UgeworCQkJbmFtZSA9IHByb21fbmV4dHByb3Aobm9kZSwgcHJldiwgTlVMTCk7CisJCX0KKyNlbHNlCisJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCXByb21fZmlyc3Rwcm9wKG5vZGUsIHAtPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJvbV9uZXh0cHJvcChub2RlLCBwcmV2LCBwLT5uYW1lKTsKKwkJfQorCQluYW1lID0gcC0+bmFtZTsKKyNlbmRpZgorCQlpZiAoc3RybGVuKG5hbWUpID09IDApIHsKKwkJCXRtcCA9IHA7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorI2lmZGVmIENPTkZJR19TUEFSQzMyCisJCXN0cmNweShwLT5uYW1lLCBuYW1lKTsKKyNlbmRpZgorCQlwLT5sZW5ndGggPSBwcm9tX2dldHByb3BsZW4obm9kZSwgcC0+bmFtZSk7CisJCWlmIChwLT5sZW5ndGggPD0gMCkgeworCQkJcC0+bGVuZ3RoID0gMDsKKwkJfSBlbHNlIHsKKwkJCWludCBsZW47CisKKwkJCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhwLT5sZW5ndGggKyAxKTsKKwkJCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgcC0+bmFtZSwgcC0+dmFsdWUsCisJCQkJCSAgICAgICBwLT5sZW5ndGgpOworCQkJaWYgKGxlbiA8PSAwKQorCQkJCXAtPmxlbmd0aCA9IDA7CisJCQkoKHVuc2lnbmVkIGNoYXIgKilwLT52YWx1ZSlbcC0+bGVuZ3RoXSA9ICdcMCc7CisJCX0KKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfcHJvcF9saXN0KHBoYW5kbGUgbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKmhlYWQsICp0YWlsOworCisJaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMLAorCQkJCSAgICAgIi5ub2RlIiwgJm5vZGUsIHNpemVvZihub2RlKSk7CisKKwl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CisJdGFpbCA9IHRhaWwtPm5leHQ7CisJd2hpbGUodGFpbCkgeworCQl0YWlsLT5uZXh0ID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgdGFpbC0+bmFtZSwKKwkJCQkJICAgIE5VTEwsIE5VTEwsIDApOworCQl0YWlsID0gdGFpbC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gaGVhZDsKK30KKworc3RhdGljIGNoYXIgKiBfX2luaXQgZ2V0X29uZV9wcm9wZXJ0eShwaGFuZGxlIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqYnVmID0gIjxOVUxMPiI7CisJaW50IGxlbjsKKworCWxlbiA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBuYW1lKTsKKwlpZiAobGVuID4gMCkgeworCQlidWYgPSBwcm9tX2Vhcmx5X2FsbG9jKGxlbik7CisJCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgbmFtZSwgYnVmLCBsZW4pOworCX0KKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgcHJvbV9jcmVhdGVfbm9kZShwaGFuZGxlIG5vZGUsCisJCQkJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKCpkcCkpOworCWRwLT51bmlxdWVfaWQgPSBwcm9tX3VuaXF1ZV9pZCsrOworCWRwLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlrcmVmX2luaXQoJmRwLT5rcmVmKTsKKworCWRwLT5uYW1lID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAibmFtZSIpOworCWRwLT50eXBlID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiKTsKKwlkcC0+bm9kZSA9IG5vZGU7CisKKwlkcC0+cHJvcGVydGllcyA9IGJ1aWxkX3Byb3BfbGlzdChub2RlKTsKKworCWlycV90cmFuc19pbml0KGRwKTsKKworCXJldHVybiBkcDsKK30KKworc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfZnVsbF9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJaW50IGxlbiwgb3VybGVuLCBwbGVuOworCWNoYXIgKm47CisKKwlwbGVuID0gc3RybGVuKGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7CisJb3VybGVuID0gc3RybGVuKGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwlsZW4gPSBvdXJsZW4gKyBwbGVuICsgMjsKKworCW4gPSBwcm9tX2Vhcmx5X2FsbG9jKGxlbik7CisJc3RyY3B5KG4sIGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7CisJaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwkJc3RyY3B5KG4gKyBwbGVuLCAiLyIpOworCQlwbGVuKys7CisJfQorCXN0cmNweShuICsgcGxlbiwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgcHJvbV9idWlsZF90cmVlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LAorCQkJCQkJICAgcGhhbmRsZSBub2RlLAorCQkJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICoqKm5leHRwKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmV0ID0gTlVMTCwgKnByZXZfc2libGluZyA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKworCXdoaWxlICgxKSB7CisJCWRwID0gcHJvbV9jcmVhdGVfbm9kZShub2RlLCBwYXJlbnQpOworCQlpZiAoIWRwKQorCQkJYnJlYWs7CisKKwkJaWYgKHByZXZfc2libGluZykKKwkJCXByZXZfc2libGluZy0+c2libGluZyA9IGRwOworCisJCWlmICghcmV0KQorCQkJcmV0ID0gZHA7CisJCXByZXZfc2libGluZyA9IGRwOworCisJCSooKm5leHRwKSA9IGRwOworCQkqbmV4dHAgPSAmZHAtPmFsbG5leHQ7CisKKwkJZHAtPnBhdGhfY29tcG9uZW50X25hbWUgPSBidWlsZF9wYXRoX2NvbXBvbmVudChkcCk7CisJCWRwLT5mdWxsX25hbWUgPSBidWlsZF9mdWxsX25hbWUoZHApOworCisJCWRwLT5jaGlsZCA9IHByb21fYnVpbGRfdHJlZShkcCwgcHJvbV9nZXRjaGlsZChub2RlKSwgbmV4dHApOworCisJCW5vZGUgPSBwcm9tX2dldHNpYmxpbmcobm9kZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgaW50IHByb21fZWFybHlfYWxsb2NhdGVkIF9faW5pdGRhdGE7CisKK3ZvaWQgX19pbml0IHByb21fYnVpbGRfZGV2aWNldHJlZSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5leHRwOworCisJYWxsbm9kZXMgPSBwcm9tX2NyZWF0ZV9ub2RlKHByb21fcm9vdF9ub2RlLCBOVUxMKTsKKwlhbGxub2Rlcy0+cGF0aF9jb21wb25lbnRfbmFtZSA9ICIiOworCWFsbG5vZGVzLT5mdWxsX25hbWUgPSAiLyI7CisKKwluZXh0cCA9ICZhbGxub2Rlcy0+YWxsbmV4dDsKKwlhbGxub2Rlcy0+Y2hpbGQgPSBwcm9tX2J1aWxkX3RyZWUoYWxsbm9kZXMsCisJCQkJCSAgcHJvbV9nZXRjaGlsZChhbGxub2Rlcy0+bm9kZSksCisJCQkJCSAgJm5leHRwKTsKKwlvZl9jb25zb2xlX2luaXQoKTsKKworCXByaW50aygiUFJPTTogQnVpbHQgZGV2aWNlIHRyZWUgd2l0aCAldSBieXRlcyBvZiBtZW1vcnkuXG4iLAorCSAgICAgICBwcm9tX2Vhcmx5X2FsbG9jYXRlZCk7CisKKwlvZl9maWxsX2luX2NwdV9kYXRhKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5NThjNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYwpAQCAtMCwwICsxLDg0MiBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CisKKyNpbmNsdWRlICJwcm9tLmgiCisKKyNpZmRlZiBDT05GSUdfUENJCisvKiBQU1lDSE8gaW50ZXJydXB0IG1hcHBpbmcgc3VwcG9ydC4gKi8KKyNkZWZpbmUgUFNZQ0hPX0lNQVBfQV9TTE9UMAkweDBjMDBVTAorI2RlZmluZSBQU1lDSE9fSU1BUF9CX1NMT1QwCTB4MGMyMFVMCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwc3ljaG9fcGNpc2xvdF9pbWFwX29mZnNldCh1bnNpZ25lZCBsb25nIGlubykKK3sKKwl1bnNpZ25lZCBpbnQgYnVzID0gIChpbm8gJiAweDEwKSA+PiA0OworCXVuc2lnbmVkIGludCBzbG90ID0gKGlubyAmIDB4MGMpID4+IDI7CisKKwlpZiAoYnVzID09IDApCisJCXJldHVybiBQU1lDSE9fSU1BUF9BX1NMT1QwICsgKHNsb3QgKiA4KTsKKwllbHNlCisJCXJldHVybiBQU1lDSE9fSU1BUF9CX1NMT1QwICsgKHNsb3QgKiA4KTsKK30KKworI2RlZmluZSBQU1lDSE9fT0JJT19JTUFQX0JBU0UJMHgxMDAwVUwKKworI2RlZmluZSBQU1lDSE9fT05CT0FSRF9JUlFfQkFTRQkJMHgyMAorI2RlZmluZSBwc3ljaG9fb25ib2FyZF9pbWFwX29mZnNldChfX2lubykgXAorCShQU1lDSE9fT0JJT19JTUFQX0JBU0UgKyAoKChfX2lubykgJiAweDFmKSA8PCAzKSkKKworI2RlZmluZSBQU1lDSE9fSUNMUl9BX1NMT1QwCTB4MTQwMFVMCisjZGVmaW5lIFBTWUNIT19JQ0xSX1NDU0kJMHgxODAwVUwKKworI2RlZmluZSBwc3ljaG9faWNscl9vZmZzZXQoaW5vKQkJCQkJICAgICAgXAorCSgoaW5vICYgMHgyMCkgPyAoUFNZQ0hPX0lDTFJfU0NTSSArICgoKGlubykgJiAweDFmKSA8PCAzKSkgOiAgXAorCQkJKFBTWUNIT19JQ0xSX0FfU0xPVDAgKyAoKChpbm8pICYgMHgxZik8PDMpKSkKKworc3RhdGljIHVuc2lnbmVkIGludCBwc3ljaG9faXJxX2J1aWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW5vLAorCQkJCSAgICAgdm9pZCAqX2RhdGEpCit7CisJdW5zaWduZWQgbG9uZyBjb250cm9sbGVyX3JlZ3MgPSAodW5zaWduZWQgbG9uZykgX2RhdGE7CisJdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOworCXVuc2lnbmVkIGxvbmcgaW1hcF9vZmYsIGljbHJfb2ZmOworCWludCBpbm9maXh1cCA9IDA7CisKKwlpbm8gJj0gMHgzZjsKKwlpZiAoaW5vIDwgUFNZQ0hPX09OQk9BUkRfSVJRX0JBU0UpIHsKKwkJLyogUENJIHNsb3QgKi8KKwkJaW1hcF9vZmYgPSBwc3ljaG9fcGNpc2xvdF9pbWFwX29mZnNldChpbm8pOworCX0gZWxzZSB7CisJCS8qIE9uYm9hcmQgZGV2aWNlICovCisJCWltYXBfb2ZmID0gcHN5Y2hvX29uYm9hcmRfaW1hcF9vZmZzZXQoaW5vKTsKKwl9CisKKwkvKiBOb3cgYnVpbGQgdGhlIElSUSBidWNrZXQuICovCisJaW1hcCA9IGNvbnRyb2xsZXJfcmVncyArIGltYXBfb2ZmOworCisJaWNscl9vZmYgPSBwc3ljaG9faWNscl9vZmZzZXQoaW5vKTsKKwlpY2xyID0gY29udHJvbGxlcl9yZWdzICsgaWNscl9vZmY7CisKKwlpZiAoKGlubyAmIDB4MjApID09IDApCisJCWlub2ZpeHVwID0gaW5vICYgMHgwMzsKKworCXJldHVybiBidWlsZF9pcnEoaW5vZml4dXAsIGljbHIsIGltYXApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisKKwlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CisJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gcHN5Y2hvX2lycV9idWlsZDsKKworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlkcC0+aXJxX3RyYW5zLT5kYXRhID0gKHZvaWQgKikgcmVnc1syXS5waHlzX2FkZHI7Cit9CisKKyNkZWZpbmUgc2FicmVfcmVhZChfX3JlZykgXAorKHsJdTY0IF9fcmV0OyBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEgWyUxXSAlMiwgJTAiIFwKKwkJCSAgICAgOiAiPXIiIChfX3JldCkgXAorCQkJICAgICA6ICJyIiAoX19yZWcpLCAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCisJCQkgICAgIDogIm1lbW9yeSIpOyBcCisJX19yZXQ7IFwKK30pCisKK3N0cnVjdCBzYWJyZV9pcnFfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBjb250cm9sbGVyX3JlZ3M7CisJdW5zaWduZWQgaW50IHBjaV9maXJzdF9idXNubzsKK307CisjZGVmaW5lIFNBQlJFX0NPTkZJR1NQQUNFCTB4MDAxMDAwMDAwVUwKKyNkZWZpbmUgU0FCUkVfV1JTWU5DCQkweDFjMjBVTAorCisjZGVmaW5lIFNBQlJFX0NPTkZJR19CQVNFKENPTkZJR19TUEFDRSkJXAorCShDT05GSUdfU1BBQ0UgfCAoMVVMIDw8IDI0KSkKKyNkZWZpbmUgU0FCUkVfQ09ORklHX0VOQ09ERShCVVMsIERFVkZOLCBSRUcpCVwKKwkoKCh1bnNpZ25lZCBsb25nKShCVVMpICAgPDwgMTYpIHwJXAorCSAoKHVuc2lnbmVkIGxvbmcpKERFVkZOKSA8PCA4KSAgfAlcCisJICgodW5zaWduZWQgbG9uZykoUkVHKSkpCisKKy8qIFdoZW4gYSBkZXZpY2UgbGl2ZXMgYmVoaW5kIGEgYnJpZGdlIGRlZXBlciBpbiB0aGUgUENJIGJ1cyB0b3BvbG9neQorICogdGhhbiBBUEIsIGEgc3BlY2lhbCBzZXF1ZW5jZSBtdXN0IHJ1biB0byBtYWtlIHN1cmUgYWxsIHBlbmRpbmcgRE1BCisgKiB0cmFuc2ZlcnMgYXQgdGhlIHRpbWUgb2YgSVJRIGRlbGl2ZXJ5IGFyZSB2aXNpYmxlIGluIHRoZSBjb2hlcmVuY3kKKyAqIGRvbWFpbiBieSB0aGUgY3B1LiAgVGhpcyBzZXF1ZW5jZSBpcyB0byBwZXJmb3JtIGEgcmVhZCBvbiB0aGUgZmFyCisgKiBzaWRlIG9mIHRoZSBub24tQVBCIGJyaWRnZSwgdGhlbiBwZXJmb3JtIGEgcmVhZCBvZiBTYWJyZSdzIERNQQorICogd3JpdGUtc3luYyByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgc2FicmVfd3N5bmNfaGFuZGxlcih1bnNpZ25lZCBpbnQgaW5vLCB2b2lkICpfYXJnMSwgdm9pZCAqX2FyZzIpCit7CisJdW5zaWduZWQgaW50IHBoeXNfaGkgPSAodW5zaWduZWQgaW50KSAodW5zaWduZWQgbG9uZykgX2FyZzE7CisJc3RydWN0IHNhYnJlX2lycV9kYXRhICppcnFfZGF0YSA9IF9hcmcyOworCXVuc2lnbmVkIGxvbmcgY29udHJvbGxlcl9yZWdzID0gaXJxX2RhdGEtPmNvbnRyb2xsZXJfcmVnczsKKwl1bnNpZ25lZCBsb25nIHN5bmNfcmVnID0gY29udHJvbGxlcl9yZWdzICsgU0FCUkVfV1JTWU5DOworCXVuc2lnbmVkIGxvbmcgY29uZmlnX3NwYWNlID0gY29udHJvbGxlcl9yZWdzICsgU0FCUkVfQ09ORklHU1BBQ0U7CisJdW5zaWduZWQgaW50IGJ1cywgZGV2Zm47CisJdTE2IF91bnVzZWQ7CisKKwljb25maWdfc3BhY2UgPSBTQUJSRV9DT05GSUdfQkFTRShjb25maWdfc3BhY2UpOworCisJYnVzID0gKHBoeXNfaGkgPj4gMTYpICYgMHhmZjsKKwlkZXZmbiA9IChwaHlzX2hpID4+IDgpICYgMHhmZjsKKworCWNvbmZpZ19zcGFjZSB8PSBTQUJSRV9DT05GSUdfRU5DT0RFKGJ1cywgZGV2Zm4sIDB4MDApOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1lbWJhciAjU3luY1xuXHQiCisJCQkgICAgICJsZHVoYSBbJTFdICUyLCAlMFxuXHQiCisJCQkgICAgICJtZW1iYXIgI1N5bmMiCisJCQkgICAgIDogIj1yIiAoX3VudXNlZCkKKwkJCSAgICAgOiAiciIgKCh1MTYgKikgY29uZmlnX3NwYWNlKSwKKwkJCSAgICAgICAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FX0wpCisJCQkgICAgIDogIm1lbW9yeSIpOworCisJc2FicmVfcmVhZChzeW5jX3JlZyk7Cit9CisKKyNkZWZpbmUgU0FCUkVfSU1BUF9BX1NMT1QwCTB4MGMwMFVMCisjZGVmaW5lIFNBQlJFX0lNQVBfQl9TTE9UMAkweDBjMjBVTAorI2RlZmluZSBTQUJSRV9JQ0xSX0FfU0xPVDAJMHgxNDAwVUwKKyNkZWZpbmUgU0FCUkVfSUNMUl9CX1NMT1QwCTB4MTQ4MFVMCisjZGVmaW5lIFNBQlJFX0lDTFJfU0NTSQkJMHgxODAwVUwKKyNkZWZpbmUgU0FCUkVfSUNMUl9FVEgJCTB4MTgwOFVMCisjZGVmaW5lIFNBQlJFX0lDTFJfQlBQCQkweDE4MTBVTAorI2RlZmluZSBTQUJSRV9JQ0xSX0FVX1JFQwkweDE4MThVTAorI2RlZmluZSBTQUJSRV9JQ0xSX0FVX1BMQVkJMHgxODIwVUwKKyNkZWZpbmUgU0FCUkVfSUNMUl9QRkFJTAkweDE4MjhVTAorI2RlZmluZSBTQUJSRV9JQ0xSX0tNUwkJMHgxODMwVUwKKyNkZWZpbmUgU0FCUkVfSUNMUl9GTFBZCQkweDE4MzhVTAorI2RlZmluZSBTQUJSRV9JQ0xSX1NIVwkJMHgxODQwVUwKKyNkZWZpbmUgU0FCUkVfSUNMUl9LQkQJCTB4MTg0OFVMCisjZGVmaW5lIFNBQlJFX0lDTFJfTVMJCTB4MTg1MFVMCisjZGVmaW5lIFNBQlJFX0lDTFJfU0VSCQkweDE4NThVTAorI2RlZmluZSBTQUJSRV9JQ0xSX1VFCQkweDE4NzBVTAorI2RlZmluZSBTQUJSRV9JQ0xSX0NFCQkweDE4NzhVTAorI2RlZmluZSBTQUJSRV9JQ0xSX1BDSUVSUgkweDE4ODBVTAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzYWJyZV9wY2lzbG90X2ltYXBfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXVuc2lnbmVkIGludCBidXMgPSAgKGlubyAmIDB4MTApID4+IDQ7CisJdW5zaWduZWQgaW50IHNsb3QgPSAoaW5vICYgMHgwYykgPj4gMjsKKworCWlmIChidXMgPT0gMCkKKwkJcmV0dXJuIFNBQlJFX0lNQVBfQV9TTE9UMCArIChzbG90ICogOCk7CisJZWxzZQorCQlyZXR1cm4gU0FCUkVfSU1BUF9CX1NMT1QwICsgKHNsb3QgKiA4KTsKK30KKworI2RlZmluZSBTQUJSRV9PQklPX0lNQVBfQkFTRQkweDEwMDBVTAorI2RlZmluZSBTQUJSRV9PTkJPQVJEX0lSUV9CQVNFCTB4MjAKKyNkZWZpbmUgc2FicmVfb25ib2FyZF9pbWFwX29mZnNldChfX2lubykgXAorCShTQUJSRV9PQklPX0lNQVBfQkFTRSArICgoKF9faW5vKSAmIDB4MWYpIDw8IDMpKQorCisjZGVmaW5lIHNhYnJlX2ljbHJfb2Zmc2V0KGlubykJCQkJCSAgICAgIFwKKwkoKGlubyAmIDB4MjApID8gKFNBQlJFX0lDTFJfU0NTSSArICgoKGlubykgJiAweDFmKSA8PCAzKSkgOiAgXAorCQkJKFNBQlJFX0lDTFJfQV9TTE9UMCArICgoKGlubykgJiAweDFmKTw8MykpKQorCitzdGF0aWMgaW50IHNhYnJlX2RldmljZV9uZWVkc193c3luYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gZHAtPnBhcmVudDsKKwljb25zdCBjaGFyICpwYXJlbnRfbW9kZWwsICpwYXJlbnRfY29tcGF0OworCisJLyogVGhpcyB0cmF2ZXJzYWwgdXAgdG93YXJkcyB0aGUgcm9vdCBpcyBtZWFudCB0bworCSAqIGhhbmRsZSB0d28gY2FzZXM6CisJICoKKwkgKiAxKSBub24tUENJIGJ1cyBzaXR0aW5nIHVuZGVyIFBDSSwgc3VjaCBhcyAnZWJ1cycKKwkgKiAyKSB0aGUgUENJIGNvbnRyb2xsZXIgaW50ZXJydXB0cyB0aGVtc2VsdmVzLCB3aGljaAorCSAqICAgIHdpbGwgdXNlIHRoZSBzYWJyZV9pcnFfYnVpbGQgYnV0IGRvIG5vdCBuZWVkCisJICogICAgdGhlIERNQSBzeW5jaHJvbml6YXRpb24gaGFuZGxpbmcKKwkgKi8KKwl3aGlsZSAocGFyZW50KSB7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpKQorCQkJYnJlYWs7CisJCXBhcmVudCA9IHBhcmVudC0+cGFyZW50OworCX0KKworCWlmICghcGFyZW50KQorCQlyZXR1cm4gMDsKKworCXBhcmVudF9tb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShwYXJlbnQsCisJCQkJICAgICAgICJtb2RlbCIsIE5VTEwpOworCWlmIChwYXJlbnRfbW9kZWwgJiYKKwkgICAgKCFzdHJjbXAocGFyZW50X21vZGVsLCAiU1VOVyxzYWJyZSIpIHx8CisJICAgICAhc3RyY21wKHBhcmVudF9tb2RlbCwgIlNVTlcsc2ltYmEiKSkpCisJCXJldHVybiAwOworCisJcGFyZW50X2NvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShwYXJlbnQsCisJCQkJCSJjb21wYXRpYmxlIiwgTlVMTCk7CisJaWYgKHBhcmVudF9jb21wYXQgJiYKKwkgICAgKCFzdHJjbXAocGFyZW50X2NvbXBhdCwgInBjaTEwOGUsYTAwMCIpIHx8CisJICAgICAhc3RyY21wKHBhcmVudF9jb21wYXQsICJwY2kxMDhlLGEwMDEiKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2FicmVfaXJxX2J1aWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCisJCQkJICAgIHVuc2lnbmVkIGludCBpbm8sCisJCQkJICAgIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBzYWJyZV9pcnFfZGF0YSAqaXJxX2RhdGEgPSBfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGNvbnRyb2xsZXJfcmVncyA9IGlycV9kYXRhLT5jb250cm9sbGVyX3JlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKKwl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CisJdW5zaWduZWQgbG9uZyBpbWFwX29mZiwgaWNscl9vZmY7CisJaW50IGlub2ZpeHVwID0gMDsKKwlpbnQgdmlydF9pcnE7CisKKwlpbm8gJj0gMHgzZjsKKwlpZiAoaW5vIDwgU0FCUkVfT05CT0FSRF9JUlFfQkFTRSkgeworCQkvKiBQQ0kgc2xvdCAqLworCQlpbWFwX29mZiA9IHNhYnJlX3BjaXNsb3RfaW1hcF9vZmZzZXQoaW5vKTsKKwl9IGVsc2UgeworCQkvKiBvbmJvYXJkIGRldmljZSAqLworCQlpbWFwX29mZiA9IHNhYnJlX29uYm9hcmRfaW1hcF9vZmZzZXQoaW5vKTsKKwl9CisKKwkvKiBOb3cgYnVpbGQgdGhlIElSUSBidWNrZXQuICovCisJaW1hcCA9IGNvbnRyb2xsZXJfcmVncyArIGltYXBfb2ZmOworCisJaWNscl9vZmYgPSBzYWJyZV9pY2xyX29mZnNldChpbm8pOworCWljbHIgPSBjb250cm9sbGVyX3JlZ3MgKyBpY2xyX29mZjsKKworCWlmICgoaW5vICYgMHgyMCkgPT0gMCkKKwkJaW5vZml4dXAgPSBpbm8gJiAweDAzOworCisJdmlydF9pcnEgPSBidWlsZF9pcnEoaW5vZml4dXAsIGljbHIsIGltYXApOworCisJLyogSWYgdGhlIHBhcmVudCBkZXZpY2UgaXMgYSBQQ0k8LT5QQ0kgYnJpZGdlIG90aGVyIHRoYW4KKwkgKiBBUEIsIHdlIGhhdmUgdG8gaW5zdGFsbCBhIHByZS1oYW5kbGVyIHRvIGVuc3VyZSB0aGF0CisJICogYWxsIHBlbmRpbmcgRE1BIGlzIGRyYWluZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorCSAqIGlzIHJ1bi4KKwkgKi8KKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKHJlZ3MgJiYgc2FicmVfZGV2aWNlX25lZWRzX3dzeW5jKGRwKSkgeworCQlpcnFfaW5zdGFsbF9wcmVfaGFuZGxlcih2aXJ0X2lycSwKKwkJCQkJc2FicmVfd3N5bmNfaGFuZGxlciwKKwkJCQkJKHZvaWQgKikgKGxvbmcpIHJlZ3MtPnBoeXNfaGksCisJCQkJCSh2b2lkICopIGlycV9kYXRhKTsKKwl9CisKKwlyZXR1cm4gdmlydF9pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBzYWJyZV9pcnFfZGF0YSAqaXJxX2RhdGE7CisJY29uc3QgdTMyICpidXNyYW5nZTsKKworCWRwLT5pcnFfdHJhbnMgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXIpKTsKKwlkcC0+aXJxX3RyYW5zLT5pcnFfYnVpbGQgPSBzYWJyZV9pcnFfYnVpbGQ7CisKKwlpcnFfZGF0YSA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWJyZV9pcnFfZGF0YSkpOworCisJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlycV9kYXRhLT5jb250cm9sbGVyX3JlZ3MgPSByZWdzWzBdLnBoeXNfYWRkcjsKKworCWJ1c3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYnVzLXJhbmdlIiwgTlVMTCk7CisJaXJxX2RhdGEtPnBjaV9maXJzdF9idXNubyA9IGJ1c3JhbmdlWzBdOworCisJZHAtPmlycV90cmFucy0+ZGF0YSA9IGlycV9kYXRhOworfQorCisvKiBTQ0hJWk8gaW50ZXJydXB0IG1hcHBpbmcgc3VwcG9ydC4gIFVubGlrZSBQc3ljaG8sIGZvciB0aGlzIGNvbnRyb2xsZXIgdGhlCisgKiBpbWFwL2ljbHIgcmVnaXN0ZXJzIGFyZSBwZXItUEJNLgorICovCisjZGVmaW5lIFNDSElaT19JTUFQX0JBU0UJMHgxMDAwVUwKKyNkZWZpbmUgU0NISVpPX0lDTFJfQkFTRQkweDE0MDBVTAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzY2hpem9faW1hcF9vZmZzZXQodW5zaWduZWQgbG9uZyBpbm8pCit7CisJcmV0dXJuIFNDSElaT19JTUFQX0JBU0UgKyAoaW5vICogOFVMKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NoaXpvX2ljbHJfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXJldHVybiBTQ0hJWk9fSUNMUl9CQVNFICsgKGlubyAqIDhVTCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNjaGl6b19pbm9fdG9faWNscih1bnNpZ25lZCBsb25nIHBibV9yZWdzLAorCQkJCQl1bnNpZ25lZCBpbnQgaW5vKQoreworCisJcmV0dXJuIHBibV9yZWdzICsgc2NoaXpvX2ljbHJfb2Zmc2V0KGlubyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNjaGl6b19pbm9fdG9faW1hcCh1bnNpZ25lZCBsb25nIHBibV9yZWdzLAorCQkJCQl1bnNpZ25lZCBpbnQgaW5vKQoreworCXJldHVybiBwYm1fcmVncyArIHNjaGl6b19pbWFwX29mZnNldChpbm8pOworfQorCisjZGVmaW5lIHNjaGl6b19yZWFkKF9fcmVnKSBcCisoewl1NjQgX19yZXQ7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YSBbJTFdICUyLCAlMCIgXAorCQkJICAgICA6ICI9ciIgKF9fcmV0KSBcCisJCQkgICAgIDogInIiIChfX3JlZyksICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpIFwKKwkJCSAgICAgOiAibWVtb3J5Iik7IFwKKwlfX3JldDsgXAorfSkKKyNkZWZpbmUgc2NoaXpvX3dyaXRlKF9fcmVnLCBfX3ZhbCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhICUwLCBbJTFdICUyIiBcCisJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLyBcCisJCQkgICAgIDogInIiIChfX3ZhbCksICJyIiAoX19yZWcpLCBcCisJCQkgICAgICAgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkgXAorCQkJICAgICA6ICJtZW1vcnkiKQorCitzdGF0aWMgdm9pZCB0b21hdGlsbG9fd3N5bmNfaGFuZGxlcih1bnNpZ25lZCBpbnQgaW5vLCB2b2lkICpfYXJnMSwgdm9pZCAqX2FyZzIpCit7CisJdW5zaWduZWQgbG9uZyBzeW5jX3JlZyA9ICh1bnNpZ25lZCBsb25nKSBfYXJnMjsKKwl1NjQgbWFzayA9IDFVTCA8PCAoaW5vICYgSU1BUF9JTk8pOworCXU2NCB2YWw7CisJaW50IGxpbWl0OworCisJc2NoaXpvX3dyaXRlKHN5bmNfcmVnLCBtYXNrKTsKKworCWxpbWl0ID0gMTAwMDAwOworCXZhbCA9IDA7CisJd2hpbGUgKC0tbGltaXQpIHsKKwkJdmFsID0gc2NoaXpvX3JlYWQoc3luY19yZWcpOworCQlpZiAoISh2YWwgJiBtYXNrKSkKKwkJCWJyZWFrOworCX0KKwlpZiAobGltaXQgPD0gMCkgeworCQlwcmludGsoInRvbWF0aWxsb193c3luY19oYW5kbGVyOiBETUEgd29uJ3Qgc3luYyBbJWx4OiVseF1cbiIsCisJCSAgICAgICB2YWwsIG1hc2spOworCX0KKworCWlmIChfYXJnMSkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBjYWNoZWxpbmVbNjRdCisJCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSk7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkICUlZnBycywgJTBcblx0IgorCQkJCSAgICAgIm9yICUwLCAlNCwgJTFcblx0IgorCQkJCSAgICAgIndyICUxLCAweDAsICUlZnByc1xuXHQiCisJCQkJICAgICAic3RkYSAlJWYwLCBbJTVdICU2XG5cdCIKKwkJCQkgICAgICJ3ciAlMCwgMHgwLCAlJWZwcnNcblx0IgorCQkJCSAgICAgIm1lbWJhciAjU3luYyIKKwkJCQkgICAgIDogIj0mciIgKG1hc2spLCAiPSZyIiAodmFsKQorCQkJCSAgICAgOiAiMCIgKG1hc2spLCAiMSIgKHZhbCksCisJCQkJICAgICAiaSIgKEZQUlNfRkVGKSwgInIiICgmY2FjaGVsaW5lWzBdKSwKKwkJCQkgICAgICJpIiAoQVNJX0JMS19DT01NSVRfUCkpOworCX0KK30KKworc3RydWN0IHNjaGl6b19pcnFfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBwYm1fcmVnczsKKwl1bnNpZ25lZCBsb25nIHN5bmNfcmVnOworCXUzMiBwb3J0aWQ7CisJaW50IGNoaXBfdmVyc2lvbjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2NoaXpvX2lycV9idWlsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGlubywKKwkJCQkgICAgIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBzY2hpem9faXJxX2RhdGEgKmlycV9kYXRhID0gX2RhdGE7CisJdW5zaWduZWQgbG9uZyBwYm1fcmVncyA9IGlycV9kYXRhLT5wYm1fcmVnczsKKwl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CisJaW50IGlnbl9maXh1cDsKKwlpbnQgdmlydF9pcnE7CisJaW50IGlzX3RvbWF0aWxsbzsKKworCWlubyAmPSAweDNmOworCisJLyogTm93IGJ1aWxkIHRoZSBJUlEgYnVja2V0LiAqLworCWltYXAgPSBzY2hpem9faW5vX3RvX2ltYXAocGJtX3JlZ3MsIGlubyk7CisJaWNsciA9IHNjaGl6b19pbm9fdG9faWNscihwYm1fcmVncywgaW5vKTsKKworCS8qIE9uIFNjaGl6bywgbm8gaW5vZml4dXAgb2NjdXJzLiAgVGhpcyBpcyBiZWNhdXNlIGVhY2gKKwkgKiBJTk8gaGFzIGl0J3Mgb3duIElNQVAgcmVnaXN0ZXIuICBPbiBQc3ljaG8gYW5kIFNhYnJlCisJICogdGhlcmUgaXMgb25seSBvbmUgSU1BUCByZWdpc3RlciBmb3IgZWFjaCBQQ0kgc2xvdCBldmVuCisJICogdGhvdWdoIGZvdXIgZGlmZmVyZW50IElOT3MgY2FuIGJlIGdlbmVyYXRlZCBieSBlYWNoCisJICogUENJIHNsb3QuCisJICoKKwkgKiBCdXQsIGZvciBKQlVTIHZhcmlhbnRzIChlc3NlbnRpYWxseSwgVG9tYXRpbGxvKSwgd2UgaGF2ZQorCSAqIHRvIGZpeHVwIHRoZSBsb3dlc3QgYml0IG9mIHRoZSBpbnRlcnJ1cHQgZ3JvdXAgbnVtYmVyLgorCSAqLworCWlnbl9maXh1cCA9IDA7CisKKwlpc190b21hdGlsbG8gPSAoaXJxX2RhdGEtPnN5bmNfcmVnICE9IDBVTCk7CisKKwlpZiAoaXNfdG9tYXRpbGxvKSB7CisJCWlmIChpcnFfZGF0YS0+cG9ydGlkICYgMSkKKwkJCWlnbl9maXh1cCA9ICgxIDw8IDYpOworCX0KKworCXZpcnRfaXJxID0gYnVpbGRfaXJxKGlnbl9maXh1cCwgaWNsciwgaW1hcCk7CisKKwlpZiAoaXNfdG9tYXRpbGxvKSB7CisJCWlycV9pbnN0YWxsX3ByZV9oYW5kbGVyKHZpcnRfaXJxLAorCQkJCQl0b21hdGlsbG9fd3N5bmNfaGFuZGxlciwKKwkJCQkJKChpcnFfZGF0YS0+Y2hpcF92ZXJzaW9uIDw9IDQpID8KKwkJCQkJICh2b2lkICopIDEgOiAodm9pZCAqKSAwKSwKKwkJCQkJKHZvaWQgKikgaXJxX2RhdGEtPnN5bmNfcmVnKTsKKwl9CisKKwlyZXR1cm4gdmlydF9pcnE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX3NjaGl6b19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAorCQkJCQkgICBpbnQgaXNfdG9tYXRpbGxvKQoreworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBzY2hpem9faXJxX2RhdGEgKmlycV9kYXRhOworCisJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOworCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHNjaGl6b19pcnFfYnVpbGQ7CisKKwlpcnFfZGF0YSA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2hpem9faXJxX2RhdGEpKTsKKworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlkcC0+aXJxX3RyYW5zLT5kYXRhID0gaXJxX2RhdGE7CisKKwlpcnFfZGF0YS0+cGJtX3JlZ3MgPSByZWdzWzBdLnBoeXNfYWRkcjsKKwlpZiAoaXNfdG9tYXRpbGxvKQorCQlpcnFfZGF0YS0+c3luY19yZWcgPSByZWdzWzNdLnBoeXNfYWRkciArIDB4MWExOFVMOworCWVsc2UKKwkJaXJxX2RhdGEtPnN5bmNfcmVnID0gMFVMOworCWlycV9kYXRhLT5wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJwb3J0aWQiLCAwKTsKKwlpcnFfZGF0YS0+Y2hpcF92ZXJzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAidmVyc2lvbiMiLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNjaGl6b19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCV9fc2NoaXpvX2lycV90cmFuc19pbml0KGRwLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRvbWF0aWxsb19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCV9fc2NoaXpvX2lycV90cmFuc19pbml0KGRwLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwY2lfc3VuNHZfaXJxX2J1aWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCisJCQkJCXVuc2lnbmVkIGludCBkZXZpbm8sCisJCQkJCXZvaWQgKl9kYXRhKQoreworCXUzMiBkZXZoYW5kbGUgPSAodTMyKSAodW5zaWduZWQgbG9uZykgX2RhdGE7CisKKwlyZXR1cm4gc3VuNHZfYnVpbGRfaXJxKGRldmhhbmRsZSwgZGV2aW5vKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9zdW40dl9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCisJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOworCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHBjaV9zdW40dl9pcnFfYnVpbGQ7CisKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJZHAtPmlycV90cmFucy0+ZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKQorCQkoKHJlZ3MtPnBoeXNfYWRkciA+PiAzMlVMKSAmIDB4MGZmZmZmZmYpOworfQorCitzdHJ1Y3QgZmlyZV9pcnFfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBwYm1fcmVnczsKKwl1MzIgcG9ydGlkOworfTsKKworI2RlZmluZSBGSVJFX0lNQVBfQkFTRQkweDAwMTAwMAorI2RlZmluZSBGSVJFX0lDTFJfQkFTRQkweDAwMTQwMAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaXJlX2ltYXBfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXJldHVybiBGSVJFX0lNQVBfQkFTRSArIChpbm8gKiA4VUwpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaXJlX2ljbHJfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXJldHVybiBGSVJFX0lDTFJfQkFTRSArIChpbm8gKiA4VUwpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaXJlX2lub190b19pY2xyKHVuc2lnbmVkIGxvbmcgcGJtX3JlZ3MsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5vKQoreworCXJldHVybiBwYm1fcmVncyArIGZpcmVfaWNscl9vZmZzZXQoaW5vKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlyZV9pbm9fdG9faW1hcCh1bnNpZ25lZCBsb25nIHBibV9yZWdzLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGlubykKK3sKKwlyZXR1cm4gcGJtX3JlZ3MgKyBmaXJlX2ltYXBfb2Zmc2V0KGlubyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmlyZV9pcnFfYnVpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKKwkJCQkJIHVuc2lnbmVkIGludCBpbm8sCisJCQkJCSB2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgZmlyZV9pcnFfZGF0YSAqaXJxX2RhdGEgPSBfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHBibV9yZWdzID0gaXJxX2RhdGEtPnBibV9yZWdzOworCXVuc2lnbmVkIGxvbmcgaW1hcCwgaWNscjsKKwl1bnNpZ25lZCBsb25nIGludF9jdHJscjsKKworCWlubyAmPSAweDNmOworCisJLyogTm93IGJ1aWxkIHRoZSBJUlEgYnVja2V0LiAqLworCWltYXAgPSBmaXJlX2lub190b19pbWFwKHBibV9yZWdzLCBpbm8pOworCWljbHIgPSBmaXJlX2lub190b19pY2xyKHBibV9yZWdzLCBpbm8pOworCisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBudW1iZXIuICAqLworCWludF9jdHJsciA9IDEgPDwgNjsKKwl1cGFfd3JpdGVxKGludF9jdHJsciwgaW1hcCk7CisKKwkvKiBUaGUgaW50ZXJydXB0IG1hcCByZWdpc3RlcnMgZG8gbm90IGhhdmUgYW4gSU5PIGZpZWxkCisJICogbGlrZSBvdGhlciBjaGlwcyBkby4gIFRoZXkgcmV0dXJuIHplcm8gaW4gdGhlIElOTworCSAqIGZpZWxkLCBhbmQgdGhlIGludGVycnVwdCBjb250cm9sbGVyIG51bWJlciBpcyBjb250cm9sbGVkCisJICogaW4gYml0cyA2IHRvIDkuICBTbyBpbiBvcmRlciBmb3IgYnVpbGRfaXJxKCkgdG8gZ2V0CisJICogdGhlIElOTyByaWdodCB3ZSBwYXNzIGl0IGluIGFzIHBhcnQgb2YgdGhlIGZpeHVwCisJICogd2hpY2ggd2lsbCBnZXQgYWRkZWQgdG8gdGhlIG1hcCByZWdpc3RlciB6ZXJvIHZhbHVlCisJICogcmVhZCBieSBidWlsZF9pcnEoKS4KKwkgKi8KKwlpbm8gfD0gKGlycV9kYXRhLT5wb3J0aWQgPDwgNik7CisJaW5vIC09IGludF9jdHJscjsKKwlyZXR1cm4gYnVpbGRfaXJxKGlubywgaWNsciwgaW1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBmaXJlX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IGZpcmVfaXJxX2RhdGEgKmlycV9kYXRhOworCisJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOworCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IGZpcmVfaXJxX2J1aWxkOworCisJaXJxX2RhdGEgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3QgZmlyZV9pcnFfZGF0YSkpOworCisJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSBpcnFfZGF0YTsKKworCWlycV9kYXRhLT5wYm1fcmVncyA9IHJlZ3NbMF0ucGh5c19hZGRyOworCWlycV9kYXRhLT5wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJwb3J0aWQiLCAwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDT05GSUdfU0JVUworLyogSU5PIG51bWJlciB0byBJTUFQIHJlZ2lzdGVyIG9mZnNldCBmb3IgU1lTSU8gZXh0ZXJuYWwgSVJRJ3MuCisgKiBUaGlzIHNob3VsZCBjb25mb3JtIHRvIGJvdGggU3VuZmlyZS9XaWxkZmlyZSBzZXJ2ZXIgYW5kIEZ1c2lvbgorICogZGVza3RvcCBkZXNpZ25zLgorICovCisjZGVmaW5lIFNZU0lPX0lNQVBfU0xPVDAJMHgyYzAwVUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9TTE9UMQkweDJjMDhVTAorI2RlZmluZSBTWVNJT19JTUFQX1NMT1QyCTB4MmMxMFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfU0xPVDMJMHgyYzE4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9TQ1NJCQkweDMwMDBVTAorI2RlZmluZSBTWVNJT19JTUFQX0VUSAkJMHgzMDA4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9CUFAJCTB4MzAxMFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfQVVESU8JMHgzMDE4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9QRkFJTAkweDMwMjBVTAorI2RlZmluZSBTWVNJT19JTUFQX0tNUwkJMHgzMDI4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9GTFBZCQkweDMwMzBVTAorI2RlZmluZSBTWVNJT19JTUFQX1NIVwkJMHgzMDM4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9LQkQJCTB4MzA0MFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfTVMJCTB4MzA0OFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfU0VSCQkweDMwNTBVTAorI2RlZmluZSBTWVNJT19JTUFQX1RJTTAJCTB4MzA2MFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfVElNMQkJMHgzMDY4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9VRQkJMHgzMDcwVUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9DRQkJMHgzMDc4VUwKKyNkZWZpbmUgU1lTSU9fSU1BUF9TQkVSUgkweDMwODBVTAorI2RlZmluZSBTWVNJT19JTUFQX1BNR01UCTB4MzA4OFVMCisjZGVmaW5lIFNZU0lPX0lNQVBfR0ZYCQkweDMwOTBVTAorI2RlZmluZSBTWVNJT19JTUFQX0VVUEEJCTB4MzA5OFVMCisKKyNkZWZpbmUgYm9nb24gICAgICgodW5zaWduZWQgbG9uZykgLTEpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzeXNpb19pcnFfb2Zmc2V0c1tdID0geworCS8qIFNCVVMgU2xvdCAwIC0tPiAzLCBsZXZlbCAxIC0tPiA3ICovCisJU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwKKwlTWVNJT19JTUFQX1NMT1QwLCBTWVNJT19JTUFQX1NMT1QwLCBTWVNJT19JTUFQX1NMT1QwLCBTWVNJT19JTUFQX1NMT1QwLAorCVNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsCisJU1lTSU9fSU1BUF9TTE9UMSwgU1lTSU9fSU1BUF9TTE9UMSwgU1lTSU9fSU1BUF9TTE9UMSwgU1lTSU9fSU1BUF9TTE9UMSwKKwlTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLAorCVNZU0lPX0lNQVBfU0xPVDIsIFNZU0lPX0lNQVBfU0xPVDIsIFNZU0lPX0lNQVBfU0xPVDIsIFNZU0lPX0lNQVBfU0xPVDIsCisJU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywKKwlTWVNJT19JTUFQX1NMT1QzLCBTWVNJT19JTUFQX1NMT1QzLCBTWVNJT19JTUFQX1NMT1QzLCBTWVNJT19JTUFQX1NMT1QzLAorCisJLyogT25ib2FyZCBkZXZpY2VzIChub3QgcmVsZXZhbnQvdXNlZCBvbiBTdW5GaXJlKS4gKi8KKwlTWVNJT19JTUFQX1NDU0ksCisJU1lTSU9fSU1BUF9FVEgsCisJU1lTSU9fSU1BUF9CUFAsCisJYm9nb24sCisJU1lTSU9fSU1BUF9BVURJTywKKwlTWVNJT19JTUFQX1BGQUlMLAorCWJvZ29uLAorCWJvZ29uLAorCVNZU0lPX0lNQVBfS01TLAorCVNZU0lPX0lNQVBfRkxQWSwKKwlTWVNJT19JTUFQX1NIVywKKwlTWVNJT19JTUFQX0tCRCwKKwlTWVNJT19JTUFQX01TLAorCVNZU0lPX0lNQVBfU0VSLAorCWJvZ29uLAorCWJvZ29uLAorCVNZU0lPX0lNQVBfVElNMCwKKwlTWVNJT19JTUFQX1RJTTEsCisJYm9nb24sCisJYm9nb24sCisJU1lTSU9fSU1BUF9VRSwKKwlTWVNJT19JTUFQX0NFLAorCVNZU0lPX0lNQVBfU0JFUlIsCisJU1lTSU9fSU1BUF9QTUdNVCwKKwlTWVNJT19JTUFQX0dGWCwKKwlTWVNJT19JTUFQX0VVUEEsCit9OworCisjdW5kZWYgYm9nb24KKworI2RlZmluZSBOVU1fU1lTSU9fT0ZGU0VUUyBBUlJBWV9TSVpFKHN5c2lvX2lycV9vZmZzZXRzKQorCisvKiBDb252ZXJ0IEludGVycnVwdCBNYXBwaW5nIHJlZ2lzdGVyIHBvaW50ZXIgdG8gYXNzb2NpYXRlZAorICogSW50ZXJydXB0IENsZWFyIHJlZ2lzdGVyIHBvaW50ZXIsIFNZU0lPIHNwZWNpZmljIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgU1lTSU9fSUNMUl9VTlVTRUQwCTB4MzQwMFVMCisjZGVmaW5lIFNZU0lPX0lDTFJfU0xPVDAJMHgzNDA4VUwKKyNkZWZpbmUgU1lTSU9fSUNMUl9TTE9UMQkweDM0NDhVTAorI2RlZmluZSBTWVNJT19JQ0xSX1NMT1QyCTB4MzQ4OFVMCisjZGVmaW5lIFNZU0lPX0lDTFJfU0xPVDMJMHgzNGM4VUwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN5c2lvX2ltYXBfdG9faWNscih1bnNpZ25lZCBsb25nIGltYXApCit7CisJdW5zaWduZWQgbG9uZyBkaWZmID0gU1lTSU9fSUNMUl9VTlVTRUQwIC0gU1lTSU9fSU1BUF9TTE9UMDsKKwlyZXR1cm4gaW1hcCArIGRpZmY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2J1c19vZl9idWlsZF9pcnEoc3RydWN0IGRldmljZV9ub2RlICpkcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5vLAorCQkJCSAgICAgIHZvaWQgKl9kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgX2RhdGE7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOworCXVuc2lnbmVkIGxvbmcgaW1hcCwgaWNscjsKKwlpbnQgc2J1c19zbG90ID0gMDsKKwlpbnQgc2J1c19sZXZlbCA9IDA7CisKKwlpbm8gJj0gMHgzZjsKKworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAocmVncykKKwkJc2J1c19zbG90ID0gcmVncy0+d2hpY2hfaW87CisKKwlpZiAoaW5vIDwgMHgyMCkKKwkJaW5vICs9IChzYnVzX3Nsb3QgKiA4KTsKKworCWltYXAgPSBzeXNpb19pcnFfb2Zmc2V0c1tpbm9dOworCWlmIChpbWFwID09ICgodW5zaWduZWQgbG9uZyktMSkpIHsKKwkJcHJvbV9wcmludGYoImdldF9pcnFfdHJhbnNsYXRpb25zOiBCYWQgU1lTSU8gSU5PWyV4XVxuIiwKKwkJCSAgICBpbm8pOworCQlwcm9tX2hhbHQoKTsKKwl9CisJaW1hcCArPSByZWdfYmFzZTsKKworCS8qIFNZU0lPIGluY29uc2lzdGVuY3kuICBGb3IgZXh0ZXJuYWwgU0xPVFMsIHdlIGhhdmUgdG8gc2VsZWN0CisJICogdGhlIHJpZ2h0IElDTFIgcmVnaXN0ZXIgYmFzZWQgdXBvbiB0aGUgbG93ZXIgU0JVUyBpcnEgbGV2ZWwKKwkgKiBiaXRzLgorCSAqLworCWlmIChpbm8gPj0gMHgyMCkgeworCQlpY2xyID0gc3lzaW9faW1hcF90b19pY2xyKGltYXApOworCX0gZWxzZSB7CisJCXNidXNfbGV2ZWwgPSBpbm8gJiAweDc7CisKKwkJc3dpdGNoKHNidXNfc2xvdCkgeworCQljYXNlIDA6CisJCQlpY2xyID0gcmVnX2Jhc2UgKyBTWVNJT19JQ0xSX1NMT1QwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWljbHIgPSByZWdfYmFzZSArIFNZU0lPX0lDTFJfU0xPVDE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWNsciA9IHJlZ19iYXNlICsgU1lTSU9fSUNMUl9TTE9UMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDM6CisJCQlpY2xyID0gcmVnX2Jhc2UgKyBTWVNJT19JQ0xSX1NMT1QzOworCQkJYnJlYWs7CisJCX07CisKKwkJaWNsciArPSAoKHVuc2lnbmVkIGxvbmcpc2J1c19sZXZlbCAtIDFVTCkgKiA4VUw7CisJfQorCXJldHVybiBidWlsZF9pcnEoc2J1c19sZXZlbCwgaWNsciwgaW1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisKKwlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CisJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gc2J1c19vZl9idWlsZF9pcnE7CisKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJZHAtPmlycV90cmFucy0+ZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSByZWdzLT5waHlzX2FkZHI7Cit9CisjZW5kaWYgLyogQ09ORklHX1NCVVMgKi8KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNlbnRyYWxfYnVpbGRfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGlubywKKwkJCQkgICAgICB2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNlbnRyYWxfZHAgPSBfZGF0YTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpjZW50cmFsX29wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShjZW50cmFsX2RwKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CisJdTMyIHRtcDsKKworCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZWVwcm9tIikpIHsKKwkJcmVzID0gJmNlbnRyYWxfb3AtPnJlc291cmNlWzVdOworCX0gZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgInpzIikpIHsKKwkJcmVzID0gJmNlbnRyYWxfb3AtPnJlc291cmNlWzRdOworCX0gZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgImNsb2NrLWJvYXJkIikpIHsKKwkJcmVzID0gJmNlbnRyYWxfb3AtPnJlc291cmNlWzNdOworCX0gZWxzZSB7CisJCXJldHVybiBpbm87CisJfQorCisJaW1hcCA9IHJlcy0+c3RhcnQgKyAweDAwVUw7CisJaWNsciA9IHJlcy0+c3RhcnQgKyAweDEwVUw7CisKKwkvKiBTZXQgdGhlIElOTyBzdGF0ZSB0byBpZGxlLCBhbmQgZGlzYWJsZS4gICovCisJdXBhX3dyaXRlbCgwLCBpY2xyKTsKKwl1cGFfcmVhZGwoaWNscik7CisKKwl0bXAgPSB1cGFfcmVhZGwoaW1hcCk7CisJdG1wICY9IH4weDgwMDAwMDAwOworCXVwYV93cml0ZWwodG1wLCBpbWFwKTsKKworCXJldHVybiBidWlsZF9pcnEoMCwgaWNsciwgaW1hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjZW50cmFsX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOworCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IGNlbnRyYWxfYnVpbGRfaXJxOworCisJZHAtPmlycV90cmFucy0+ZGF0YSA9IGRwOworfQorCitzdHJ1Y3QgaXJxX3RyYW5zIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCppbml0KShzdHJ1Y3QgZGV2aWNlX25vZGUgKik7Cit9OworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBpcnFfdHJhbnMgX19pbml0ZGF0YSBwY2lfaXJxX3RyYW5zX3RhYmxlW10gPSB7CisJeyAiU1VOVyxzYWJyZSIsIHNhYnJlX2lycV90cmFuc19pbml0IH0sCisJeyAicGNpMTA4ZSxhMDAwIiwgc2FicmVfaXJxX3RyYW5zX2luaXQgfSwKKwl7ICJwY2kxMDhlLGEwMDEiLCBzYWJyZV9pcnFfdHJhbnNfaW5pdCB9LAorCXsgIlNVTlcscHN5Y2hvIiwgcHN5Y2hvX2lycV90cmFuc19pbml0IH0sCisJeyAicGNpMTA4ZSw4MDAwIiwgcHN5Y2hvX2lycV90cmFuc19pbml0IH0sCisJeyAiU1VOVyxzY2hpem8iLCBzY2hpem9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJwY2kxMDhlLDgwMDEiLCBzY2hpem9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJTVU5XLHNjaGl6bysiLCBzY2hpem9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJwY2kxMDhlLDgwMDIiLCBzY2hpem9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJTVU5XLHRvbWF0aWxsbyIsIHRvbWF0aWxsb19pcnFfdHJhbnNfaW5pdCB9LAorCXsgInBjaTEwOGUsYTgwMSIsIHRvbWF0aWxsb19pcnFfdHJhbnNfaW5pdCB9LAorCXsgIlNVTlcsc3VuNHYtcGNpIiwgcGNpX3N1bjR2X2lycV90cmFuc19pbml0IH0sCisJeyAicGNpZXgxMDhlLDgwZjAiLCBmaXJlX2lycV90cmFuc19pbml0IH0sCit9OworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3VuNHZfdmRldl9pcnFfYnVpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKKwkJCQkJIHVuc2lnbmVkIGludCBkZXZpbm8sCisJCQkJCSB2b2lkICpfZGF0YSkKK3sKKwl1MzIgZGV2aGFuZGxlID0gKHUzMikgKHVuc2lnbmVkIGxvbmcpIF9kYXRhOworCisJcmV0dXJuIHN1bjR2X2J1aWxkX2lycShkZXZoYW5kbGUsIGRldmlubyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW40dl92ZGV2X2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisKKwlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CisJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gc3VuNHZfdmRldl9pcnFfYnVpbGQ7CisKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJZHAtPmlycV90cmFucy0+ZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKQorCQkoKHJlZ3MtPnBoeXNfYWRkciA+PiAzMlVMKSAmIDB4MGZmZmZmZmYpOworfQorCit2b2lkIF9faW5pdCBpcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwljb25zdCBjaGFyICptb2RlbDsKKwlpbnQgaTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKKwlpZiAoIW1vZGVsKQorCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImNvbXBhdGlibGUiLCBOVUxMKTsKKwlpZiAobW9kZWwpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpX2lycV90cmFuc190YWJsZSk7IGkrKykgeworCQkJc3RydWN0IGlycV90cmFucyAqdCA9ICZwY2lfaXJxX3RyYW5zX3RhYmxlW2ldOworCisJCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpIHsKKwkJCQl0LT5pbml0KGRwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0JVUworCWlmICghc3RyY21wKGRwLT5uYW1lLCAic2J1cyIpIHx8CisJICAgICFzdHJjbXAoZHAtPm5hbWUsICJzYmkiKSkgeworCQlzYnVzX2lycV90cmFuc19pbml0KGRwKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZmhjIikgJiYKKwkgICAgIXN0cmNtcChkcC0+cGFyZW50LT5uYW1lLCAiY2VudHJhbCIpKSB7CisJCWNlbnRyYWxfaXJxX3RyYW5zX2luaXQoZHApOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKGRwLT5uYW1lLCAidmlydHVhbC1kZXZpY2VzIikgfHwKKwkgICAgIXN0cmNtcChkcC0+bmFtZSwgIm5pdSIpKSB7CisJCXN1bjR2X3ZkZXZfaXJxX3RyYW5zX2luaXQoZHApOworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wc3ljaG9fY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3BzeWNob19jb21tb24uaApyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZV8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2UuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2VfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcmVib290LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9yZWJvb3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9yZWJvb3QuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3J0cmFwLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9ydHJhcF8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9ydHJhcC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9ydHJhcF8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9ydHJhcF82NC5TCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvcnRyYXAuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvcnRyYXBfNjQuUwppbmRleCA5N2E5OTNjLi5mZDNjZWU0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcnRyYXBfNjQuUwpAQCAtMTQsOSArMTQsOSBAQAogI2luY2x1ZGUgPGFzbS92aXNhc20uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLSNkZWZpbmUJCVJUUkFQX1BTVEFURQkJKFBTVEFURV9STU98UFNUQVRFX1BFRnxQU1RBVEVfUFJJVnxQU1RBVEVfSUUpCi0jZGVmaW5lCQlSVFJBUF9QU1RBVEVfSVJRT0ZGCShQU1RBVEVfUk1PfFBTVEFURV9QRUZ8UFNUQVRFX1BSSVYpCi0jZGVmaW5lCQlSVFJBUF9QU1RBVEVfQUdfSVJRT0ZGCShQU1RBVEVfUk1PfFBTVEFURV9QRUZ8UFNUQVRFX1BSSVZ8UFNUQVRFX0FHKQorI2RlZmluZQkJUlRSQVBfUFNUQVRFCQkoUFNUQVRFX1RTT3xQU1RBVEVfUEVGfFBTVEFURV9QUklWfFBTVEFURV9JRSkKKyNkZWZpbmUJCVJUUkFQX1BTVEFURV9JUlFPRkYJKFBTVEFURV9UU098UFNUQVRFX1BFRnxQU1RBVEVfUFJJVikKKyNkZWZpbmUJCVJUUkFQX1BTVEFURV9BR19JUlFPRkYJKFBTVEFURV9UU098UFNUQVRFX1BFRnxQU1RBVEVfUFJJVnxQU1RBVEVfQUcpCiAKIAkJLnRleHQKIAkJLmFsaWduCQkJMzIKQEAgLTEzMiw2ICsxMzIsMTggQEAKIAkJYmEscHQJCQkleGNjLCBfX2hhbmRsZV9zaWduYWxfY29udGludWUKIAkJIGFuZG4JCQklbDEsICVsNCwgJWwxCiAKKwkJLyogV2hlbiByZXR1cm5pbmcgZnJvbSBhIE5NSSAoJXBpbD09MTUpIGludGVycnVwdCB3ZSB3YW50IHRvCisJCSAqIGF2b2lkIHJ1bm5pbmcgc29mdGlycXMsIGRvaW5nIElSUSB0cmFjaW5nLCBwcmVlbXB0aW5nLCBldGMuCisJCSAqLworCQkuZ2xvYmwJCQlydHJhcF9ubWkKK3J0cmFwX25taToJbGR4CQkJWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UU1RBVEVdLCAlbDEKKwkJc2V0aGkJCQklaGkoMHhmIDw8IDIwKSwgJWw0CisJCWFuZAkJCSVsMSwgJWw0LCAlbDQKKwkJYW5kbgkJCSVsMSwgJWw0LCAlbDEKKwkJc3JsCQkJJWw0LCAyMCwgJWw0CisJCWJhLHB0CQkJJXhjYywgcnRyYXBfbm9faXJxX2VuYWJsZQorCQkgd3JwcgkJCSVsNCwgJXBpbAorCiAJCS5hbGlnbgkJCTY0CiAJCS5nbG9ibAkJCXJ0cmFwX2lycSwgcnRyYXAsIGlycXN6X3BhdGNobWUsIHJ0cmFwX3hjYWxsCiBydHJhcF9pcnE6CkBAIC0xNjEsOCArMTczLDggQEAKIAkJY2FsbAkJCXRyYWNlX2hhcmRpcnFzX29uCiAJCSBub3AKIAkJd3JwcgkJCSVsNCwgJXBpbAotcnRyYXBfbm9faXJxX2VuYWJsZToKICNlbmRpZgorcnRyYXBfbm9faXJxX2VuYWJsZToKIAkJYW5kY2MJCQklbDEsIFRTVEFURV9QUklWLCAlbDMKIAkJYm5lLHBuCQkJJWljYywgdG9fa2VybmVsCiAJCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDI0ZmUzMDcuLmM5NmM2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtNDYsNiArNDYsOCBAQAogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKKyNpbmNsdWRlICJrZXJuZWwuaCIKKwogc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvID0gewogCTAsIDAsCQkJLyogb3JpZy14LCBvcmlnLXkgKi8KIAkwLAkJCS8qIHVudXNlZCAqLwpAQCAtMzA4LDkgKzMxMCw2IEBACiAJc21wX3NldHVwX2NwdV9wb3NzaWJsZV9tYXAoKTsKIH0KIAotZXh0ZXJuIGNoYXIgKnNwYXJjX2NwdV90eXBlOwotZXh0ZXJuIGNoYXIgKnNwYXJjX2ZwdV90eXBlOwotCiBzdGF0aWMgaW50IG5jcHVzX3Byb2JlZDsKIAogc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpfX3VudXNlZCkKQEAgLTMyOCw4ICszMjcsOCBAQAogCQkgICAiQ1BVMENsa1Rja1x0OiAlbGRcbiIKICNlbmRpZgogCQkgICAsCi0JCSAgIHNwYXJjX2NwdV90eXBlID8gc3BhcmNfY3B1X3R5cGUgOiAidW5kZXRlcm1pbmVkIiwKLQkJICAgc3BhcmNfZnB1X3R5cGUgPyBzcGFyY19mcHVfdHlwZSA6ICJ1bmRldGVybWluZWQiLAorCQkgICBzcGFyY19jcHVfdHlwZSwKKwkJICAgc3BhcmNfZnB1X3R5cGUgLAogCQkgICByb212ZWMtPnB2X3JvbXZlcnMsCiAJCSAgIHByb21fcmV2LAogCQkgICByb212ZWMtPnB2X3ByaW50cmV2ID4+IDE2LApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggYzhiMDNhNC4uNTU1ZGI3NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiZW50cnkuaCIKKyNpbmNsdWRlICJrZXJuZWwuaCIKIAogLyogVXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3NlcyB0byBOYXRTZW1pIFNVUEVSIEkvTyBjaGlwIGNvbmZpZ3VyZQogICogb3BlcmF0aW9ucyBpbiBhc20vbnM4NzMwMy5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NpZ25hbDMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWwzMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3NpZ25hbDMyLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3NpZ25hbDMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL3NpZ25hbC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zaWduYWxfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NpZ25hbF82NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3NpZ25hbC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zaWduYWxfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9rZXJuZWwvc21wLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKaW5kZXggZjUwMGIwNi4uYmZlOTlkOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IE5VTV9JVEVSUzsgaSsrKSB7CiAJCXQwID0gdGlja19vcHMtPmdldF90aWNrKCk7CiAJCWdvW01BU1RFUl0gPSAxOwotCQltZW1iYXJfc3RvcmVsb2FkKCk7CisJCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIik7CiAJCXdoaWxlICghKHRtID0gZ29bU0xBVkVdKSkKIAkJCXJtYigpOwogCQlnb1tTTEFWRV0gPSAwOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAKIAkvKiBub3cgbGV0IHRoZSBjbGllbnQgcHJvY2VlZCBpbnRvIGhpcyBsb29wICovCiAJZ29bTUFTVEVSXSA9IDA7Ci0JbWVtYmFyX3N0b3JlbG9hZCgpOworCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXRjX3N5bmNfbG9jaywgZmxhZ3MpOwogCXsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQkJZ29bTUFTVEVSXSA9IDA7CiAJCQl3bWIoKTsKIAkJCWdvW1NMQVZFXSA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwotCQkJbWVtYmFyX3N0b3JlbG9hZCgpOworCQkJbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQiKTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpdGNfc3luY19sb2NrLCBmbGFncyk7CkBAIC03NzMsNyArNzczLDcgQEAKIAogCS8qIFNldHVwIHRoZSBpbml0aWFsIGNwdSBsaXN0LiAgKi8KIAljbnQgPSAwOwotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGksICptYXNrKSB7CisJZm9yX2VhY2hfY3B1KGksIG1hc2spIHsKIAkJaWYgKGkgPT0gdGhpc19jcHUgfHwgIWNwdV9vbmxpbmUoaSkpCiAJCQljb250aW51ZTsKIAkJY3B1X2xpc3RbY250KytdID0gaTsKQEAgLTExMjIsNyArMTEyMiw2IEBACiAJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwogI2VuZGlmCiAJCXBlbmd1aW5zX2FyZV9kb2luZ190aW1lID0gMTsKLQkJbWVtYmFyX3N0b3Jlc3RvcmVfbG9hZHN0b3JlKCk7CiAJCWF0b21pY19pbmMoJnNtcF9jYXB0dXJlX3JlZ2lzdHJ5KTsKIAkJc21wX2Nyb3NzX2NhbGwoJnhjYWxsX2NhcHR1cmUsIDAsIDAsIDApOwogCQl3aGlsZSAoYXRvbWljX3JlYWQoJnNtcF9jYXB0dXJlX3JlZ2lzdHJ5KSAhPSBuY3B1cykKQEAgLTExNDIsMTMgKzExNDEsMTMgQEAKIAkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAjZW5kaWYKIAkJcGVuZ3VpbnNfYXJlX2RvaW5nX3RpbWUgPSAwOwotCQltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKTsKKwkJbWVtYmFyX3NhZmUoIiNTdG9yZUxvYWQiKTsKIAkJYXRvbWljX2RlYygmc21wX2NhcHR1cmVfcmVnaXN0cnkpOwogCX0KIH0KIAotLyogSW1wcmlzb25lZCBwZW5ndWlucyBydW4gd2l0aCAlcGlsID09IDE1LCBidXQgUFNUQVRFX0lFIHNldCwgc28gdGhleQotICogY2FuIHNlcnZpY2UgdGxiIGZsdXNoIHhjYWxscy4uLgorLyogSW1wcmlzb25lZCBwZW5ndWlucyBydW4gd2l0aCAlcGlsID09IFBJTF9OT1JNQUxfTUFYLCBidXQgUFNUQVRFX0lFCisgKiBzZXQsIHNvIHRoZXkgY2FuIHNlcnZpY2UgdGxiIGZsdXNoIHhjYWxscy4uLgogICovCiBleHRlcm4gdm9pZCBwcm9tX3dvcmxkKGludCk7CiAKQEAgLTExNjEsNyArMTE2MCw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNodyIpOwogCXByb21fd29ybGQoMSk7CiAJYXRvbWljX2luYygmc21wX2NhcHR1cmVfcmVnaXN0cnkpOwotCW1lbWJhcl9zdG9yZWxvYWRfc3RvcmVzdG9yZSgpOworCW1lbWJhcl9zYWZlKCIjU3RvcmVMb2FkIik7CiAJd2hpbGUgKHBlbmd1aW5zX2FyZV9kb2luZ190aW1lKQogCQlybWIoKTsKIAlhdG9taWNfZGVjKCZzbXBfY2FwdHVyZV9yZWdpc3RyeSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc18zMi5jCmluZGV4IGIwZGZmZjguLmE0ZDQ1ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYwpAQCAtNjEsNyArNjEsNiBAQAogZXh0ZXJuIHZvaWQgKl9fYnplcm8odm9pZCAqLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgKl9fbWVtc2Nhbl96ZXJvKHZvaWQgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkICpfX21lbXNjYW5fZ2VuZXJpYyh2b2lkICosIGludCwgc2l6ZV90KTsKLWV4dGVybiBpbnQgX19tZW1jbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CiBleHRlcm4gaW50IF9fc3RybmNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKIAogZXh0ZXJuIGludCBfX2FzaHJkaTMoaW50LCBpbnQpOwpAQCAtMTIyLDEwICsxMjEsOCBAQAogRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CiBFWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKIEVYUE9SVF9TWU1CT0wocnRjX2xvY2spOwotI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIEVYUE9SVF9TWU1CT0woc2V0X2F1eGlvKTsKIEVYUE9SVF9TWU1CT0woZ2V0X2F1eGlvKTsKLSNlbmRpZgogRVhQT1JUX1NZTUJPTChpb19yZW1hcF9wZm5fcmFuZ2UpOwogCiAjaWZuZGVmIENPTkZJR19TTVAKQEAgLTIxMyw3ICsyMTAsNiBAQAogRVhQT1JUX1NZTUJPTChfX2J6ZXJvKTsKIEVYUE9SVF9TWU1CT0woX19tZW1zY2FuX3plcm8pOwogRVhQT1JUX1NZTUJPTChfX21lbXNjYW5fZ2VuZXJpYyk7Ci1FWFBPUlRfU1lNQk9MKF9fbWVtY21wKTsKIEVYUE9SVF9TWU1CT0woX19zdHJuY21wKTsKIEVYUE9SVF9TWU1CT0woX19tZW1tb3ZlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCmluZGV4IDMwYmJhOGIuLjAxMzMyMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgogI2luY2x1ZGUgPGFzbS9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogCiBzdHJ1Y3QgcG9sbCB7CiAJaW50IGZkOwpAQCAtNjEsNyArNjIsNiBAQAogZXh0ZXJuIHZvaWQgKl9fYnplcm8odm9pZCAqLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgKl9fbWVtc2Nhbl96ZXJvKHZvaWQgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkICpfX21lbXNjYW5fZ2VuZXJpYyh2b2lkICosIGludCwgc2l6ZV90KTsKLWV4dGVybiBpbnQgX19tZW1jbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CiBleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOwogZXh0ZXJuIHZvaWQgc3lzX3NpZ3N1c3BlbmQodm9pZCk7CiBleHRlcm4gaW50IGNvbXBhdF9zeXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1MzIgYXJnKTsKQEAgLTE0OCwxMCArMTQ4LDEzIEBACiBFWFBPUlRfU1lNQk9MKF9fZmx1c2hfZGNhY2hlX3JhbmdlKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NVTl9BVVhJTworRVhQT1JUX1NZTUJPTChzdW40dl9uaWFnYXJhX2dldHBlcmYpOworRVhQT1JUX1NZTUJPTChzdW40dl9uaWFnYXJhX3NldHBlcmYpOworRVhQT1JUX1NZTUJPTChzdW40dl9uaWFnYXJhMl9nZXRwZXJmKTsKK0VYUE9SVF9TWU1CT0woc3VuNHZfbmlhZ2FyYTJfc2V0cGVyZik7CisKIEVYUE9SVF9TWU1CT0woYXV4aW9fc2V0X2xlZCk7CiBFWFBPUlRfU1lNQk9MKGF1eGlvX3NldF9sdGUpOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKIEVYUE9SVF9TWU1CT0woc2J1c19zZXRfc2J1czY0KTsKICNlbmRpZgpAQCAtMTc3LDcgKzE4MCw2IEBACiBFWFBPUlRfU1lNQk9MKGlvX3JlbWFwX3Bmbl9yYW5nZSk7CiAKIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwotRVhQT1JUX1NZTUJPTChwdXRfZnNfc3RydWN0KTsKIAogLyogbWF0aC1lbXUgd2FudHMgdGhpcyAqLwogRVhQT1JUX1NZTUJPTChkaWVfaWZfa2VybmVsKTsKQEAgLTIxOSw3ICsyMjEsNiBAQAogRVhQT1JUX1NZTUJPTChfX2J6ZXJvKTsKIEVYUE9SVF9TWU1CT0woX19tZW1zY2FuX3plcm8pOwogRVhQT1JUX1NZTUJPTChfX21lbXNjYW5fZ2VuZXJpYyk7Ci1FWFBPUlRfU1lNQk9MKF9fbWVtY21wKTsKIEVYUE9SVF9TWU1CT0woX19tZW1zZXQpOwogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwaXRlcnJzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGl0ZXJycy5TCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BpdGVycnMuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc3BpdGVycnMuUwppbmRleCBlZjkwMmM2Li5jMzU3ZTQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwaXRlcnJzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BpdGVycnMuUwpAQCAtODAsNyArODAsNyBAQAogCWNtcAkJJWcyLCAxCiAJcmRwcgkJJXBpbCwgJWcyCiAJYmxldSxwdAkJJXhjYywgMWYKLQkgd3JwcgkJJWcwLCAxNSwgJXBpbAorCSB3cnByCQklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAKIAliYSxwdAkJJXhjYywgZXRyYXB0bDEKIAkgcmQJCSVwYywgJWc3CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NzdGF0ZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3N0YXRlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3N0YXRlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3NzdGF0ZS5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YWNrdHJhY2UuYwpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3N0YWNrdHJhY2UuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IDRlMjFkNGEuLmFjYjEyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtNywxNyArNywxOCBAQAogCiAjaW5jbHVkZSAia3N0YWNrLmgiCiAKLXZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQorc3RhdGljIHZvaWQgX19zYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCB0aHJlYWRfaW5mbyAqdHAsCisJCQkgICAgICAgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKKwkJCSAgICAgICBib29sIHNraXBfc2NoZWQpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0cCA9IHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCk7CiAJdW5zaWduZWQgbG9uZyBrc3AsIGZwOwogCi0Jc3RhY2tfdHJhY2VfZmx1c2goKTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92CSUlZnAsICUwIgotCQk6ICI9ciIgKGtzcCkKLQkpOworCWlmICh0cCA9PSBjdXJyZW50X3RocmVhZF9pbmZvKCkpIHsKKwkJc3RhY2tfdHJhY2VfZmx1c2goKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlJWZwLCAlMCIgOiAiPXIiIChrc3ApKTsKKwl9IGVsc2UgeworCQlrc3AgPSB0cC0+a3NwOworCX0KIAogCWZwID0ga3NwICsgU1RBQ0tfQklBUzsKIAlkbyB7CkBAIC00Myw4ICs0NCwyMSBAQAogCiAJCWlmICh0cmFjZS0+c2tpcCA+IDApCiAJCQl0cmFjZS0+c2tpcC0tOwotCQllbHNlCisJCWVsc2UgaWYgKCFza2lwX3NjaGVkIHx8ICFpbl9zY2hlZF9mdW5jdGlvbnMocGMpKQogCQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBwYzsKIAl9IHdoaWxlICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcyk7CiB9CisKK3ZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQoreworCV9fc2F2ZV9zdGFja190cmFjZShjdXJyZW50X3RocmVhZF9pbmZvKCksIHRyYWNlLCBmYWxzZSk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKKwordm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwID0gdGFza190aHJlYWRfaW5mbyh0c2spOworCisJX19zYXZlX3N0YWNrX3RyYWNlKHRwLCB0cmFjZSwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N0YXJmaXJlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFyZmlyZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3N0YXJmaXJlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRjX2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKaW5kZXggNWRjOGE1Ny4uYmMzYWRiZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKQEAgLTE2MCw2ICsxNjAsNyBAQAogCXN1bjRjX3RpbWVycyA9ICh2b2lkIF9faW9tZW0gKikgKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07CiAKIAlpcnEgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRyIiwgTlVMTCk7CisJb2Zfbm9kZV9wdXQoZHApOwogCWlmICghaXJxKSB7CiAJCXByb21fcHJpbnRmKCJzdW40Y19pbml0X3RpbWVyczogTm8gaW50ciBwcm9wZXJ0eVxuIik7CiAJCXByb21faGFsdCgpOwpAQCAtMjAwLDYgKzIwMSw3IEBACiAJfQogCiAJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImFkZHJlc3MiLCBOVUxMKTsKKwlvZl9ub2RlX3B1dChkcCk7CiAJaWYgKCFhZGRyKSB7CiAJCXByb21fcHJpbnRmKCJzdW40Y19pbml0X0lSUTogTm8gYWRkcmVzcyBwcm9wZXJ0eVxuIik7CiAJCXByb21faGFsdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwppbmRleCBkM2NiNzZjLi4zMzY5ZmVmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKKyNpbmNsdWRlICJrZXJuZWwuaCIKICNpbmNsdWRlICJpcnEuaCIKIAogLyogSWYgeW91IHRydXN0IGN1cnJlbnQgU0NTSSBsYXllciB0byBoYW5kbGUgZGlmZmVyZW50IFNDU0kgSVJRcywgZW5hYmxlIHRoaXMuIEkgZG9uJ3QgdHJ1c3QgaXQuLi4gLWpqICovCkBAIC01OCw3ICs1OSw2IEBACiAjZGVmaW5lIFRJTUVSX0lSUQkxMAogCiAjZGVmaW5lIE1BWF9TVEFUSUNfQUxMT0MJNAotZXh0ZXJuIHN0cnVjdCBpcnFhY3Rpb24gc3RhdGljX2lycWFjdGlvbltNQVhfU1RBVElDX0FMTE9DXTsKIGV4dGVybiBpbnQgc3RhdGljX2lycV9jb3VudDsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNidXNfdGlkWzMyXTsKIApAQCAtNTA4LDYgKzUwOCw3IEBACiAJICogYm9vdGJ1cy4KIAkgKi8KIAlyZWcgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlvZl9ub2RlX3B1dChkcCk7CiAJaWYgKCFyZWcpIHsKIAkJcHJvbV9wcmludGYoInN1bjRkX2luaXRfdGltZXJzOiBObyByZWcgcHJvcGVydHlcbiIpOwogCQlwcm9tX2hhbHQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1faXJxLmMKaW5kZXggZjEwMzE3MS4uMzAxODkyZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1faXJxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1faXJxLmMKQEAgLTM3NCw2ICszNzQsNyBAQAogCX0KIAogCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJhZGRyZXNzIiwgJmxlbik7CisJb2Zfbm9kZV9wdXQoZHApOwogCWlmICghYWRkcikgewogCQlwcmludGsoS0VSTl9FUlIgInN1bjRtX2luaXRfdGltZXJzOiBObyAnYWRkcmVzcycgcHJvcC5cbiIpOwogCQlyZXR1cm47CkBAIC00MzcsNiArNDM4LDcgQEAKIAl9CiAKIAlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYWRkcmVzcyIsICZsZW4pOworCW9mX25vZGVfcHV0KGRwKTsKIAlpZiAoIWFkZHIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzdW40bV9pbml0X0lSUTogTm8gJ2FkZHJlc3MnIHByb3AuXG4iKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl9pdmVjLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40dl9pdmVjLlMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl9pdmVjLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N1bjR2X2l2ZWMuUwppbmRleCBlMmY4ZTFiLi41NTliYzVlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N1bjR2X2l2ZWMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40dl9pdmVjLlMKQEAgLTE4Niw3ICsxODYsNyBAQAogCSAqIHdoZW4gaXQncyBkb25lLgogCSAqLwogCXJkcHIJJXBpbCwgJWcyCi0Jd3JwcgklZzAsIDE1LCAlcGlsCisJd3JwcgklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAJbW92CSVnMSwgJWc0CiAJYmEscHQJJXhjYywgZXRyYXBfaXJxCiAJIHJkCSVwYywgJWc3CkBAIC0yMTYsNyArMjE2LDcgQEAKIAltZW1iYXIJI1N5bmMKIAogCXJkcHIJJXBpbCwgJWcyCi0Jd3JwcgklZzAsIDE1LCAlcGlsCisJd3JwcgklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAJYmEscHQJJXhjYywgZXRyYXBfaXJxCiAJIHJkCSVwYywgJWc3CiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCkBAIC0yOTcsNyArMjk3LDcgQEAKIAkgKiB3aGVuIGl0J3MgZG9uZS4KIAkgKi8KIAlyZHByCSVwaWwsICVnMgotCXdycHIJJWcwLCAxNSwgJXBpbAorCXdycHIJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCW1vdgklZzEsICVnNAogCWJhLHB0CSV4Y2MsIGV0cmFwX2lycQogCSByZAklcGMsICVnNwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJbWVtYmFyCSNTeW5jCiAKIAlyZHByCSVwaWwsICVnMgotCXdycHIJJWcwLCAxNSwgJXBpbAorCXdycHIJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCWJhLHB0CSV4Y2MsIGV0cmFwX2lycQogCSByZAklcGMsICVnNwogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl90bGJfbWlzcy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNHZfdGxiX21pc3MuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl90bGJfbWlzcy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zdW40dl90bGJfbWlzcy5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXMzMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N5czMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY18zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNjYWxscy5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3N5c2NhbGxzLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c2ZzLmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zeXNmcy5jCmluZGV4IDg0ZTVjZTEuLmQyOGY0OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNmcy5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAorI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vc3BpdGZpcmUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5oCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMva2VybmVsL3RpbWUuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdGltZV8zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhbXBvbGluZS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhbXBvbGluZV8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3RyYW1wb2xpbmVfMzIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFtcG9saW5lLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lXzY0LlMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFtcG9saW5lLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3RyYW1wb2xpbmVfNjQuUwppbmRleCA4M2FiZDVhLi5kYTFiNzgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYW1wb2xpbmUuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFtcG9saW5lXzY0LlMKQEAgLTEwOSw3ICsxMDksNiBAQAogCSAqLwogCXNldGhpCQklaGkocHJvbV9lbnRyeV9sb2NrKSwgJWcyCiAxOglsZHN0dWIJCVslZzIgKyAlbG8ocHJvbV9lbnRyeV9sb2NrKV0sICVnMQotCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAJYnJueixwbgkJJWcxLCAxYgogCSBub3AKIApAQCAtMjE0LDcgKzIxMyw2IEBACiAKIAlzZXRoaQkJJWhpKHByb21fZW50cnlfbG9jayksICVnMgogCXN0YgkJJWcwLCBbJWcyICsgJWxvKHByb21fZW50cnlfbG9jayldCi0JbWVtYmFyCQkjU3RvcmVTdG9yZSB8ICNTdG9yZUxvYWQKIAogCWJhLHB0CQkleGNjLCBhZnRlcl9sb2NrX3RsYgogCSBub3AKQEAgLTMzMCw3ICszMjgsNiBAQAogCiAJc2V0aGkJCSVoaShwcm9tX2VudHJ5X2xvY2spLCAlZzIKIDE6CWxkc3R1YgkJWyVnMiArICVsbyhwcm9tX2VudHJ5X2xvY2spXSwgJWcxCi0JbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlicm56LHBuCQklZzEsIDFiCiAJIG5vcAogCkBAIC0zOTQsNyArMzkxLDYgQEAKIAogMzoJc2V0aGkJCSVoaShwcm9tX2VudHJ5X2xvY2spLCAlZzIKIAlzdGIJCSVnMCwgWyVnMiArICVsbyhwcm9tX2VudHJ5X2xvY2spXQotCW1lbWJhcgkJI1N0b3JlU3RvcmUgfCAjU3RvcmVMb2FkCiAKIAlsZHgJCVslbDBdLCAlZzYKIAlsZHgJCVslZzYgKyBUSV9UQVNLXSwgJWc0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDJiN2Q1MDYuLjcxNmYzOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtMjUsMzIgKzI1LDExIEBACiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCisjaW5jbHVkZSAiZW50cnkuaCIKKyNpbmNsdWRlICJrZXJuZWwuaCIKKwogLyogI2RlZmluZSBUUkFQX0RFQlVHICovCiAKLXN0cnVjdCB0cmFwX3RyYWNlX2VudHJ5IHsKLQl1bnNpZ25lZCBsb25nIHBjOwotCXVuc2lnbmVkIGxvbmcgdHlwZTsKLX07Ci0KLXZvaWQgc3lzY2FsbF90cmFjZV9lbnRyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoIiVzWyVkXTogIiwgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOwotCXByaW50aygic2NhbGw8JWQ+IChjb3VsZCBiZSAlZClcbiIsIChpbnQpIHJlZ3MtPnVfcmVnc1tVUkVHX0cxXSwKLQkgICAgICAgKGludCkgcmVncy0+dV9yZWdzW1VSRUdfSTBdKTsKLX0KLQotdm9pZCBzeXNjYWxsX3RyYWNlX2V4aXQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci19Ci0KLXZvaWQgc3VuNGRfbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXByaW50aygiQWllZWU6IHN1bjRkIE5NSSByZWNlaXZlZCFcbiIpOwotCXByaW50aygieW91IGxvc2UgYnVkZHkgYm95Li4uXG4iKTsKLQlzaG93X3JlZ3MocmVncyk7Ci0JcHJvbV9oYWx0KCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGluc3RydWN0aW9uX2R1bXAodW5zaWduZWQgbG9uZyAqcGMpCiB7CiAJaW50IGk7CkBAIC0xMzQsNyArMTEzLDYgQEAKIHZvaWQgZG9faWxsZWdhbF9pbnN0cnVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBucGMsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBwc3IpCiB7Ci0JZXh0ZXJuIGludCBkb191c2VyX211bGRpdiAoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZyk7CiAJc2lnaW5mb190IGluZm87CiAKIAlpZihwc3IgJiBQU1JfUFMpCkBAIC0xOTUsMTAgKzE3Myw2IEBACiAJc2VuZF9zaWdfaW5mbyhTSUdCVVMsICZpbmZvLCBjdXJyZW50KTsKIH0KIAotZXh0ZXJuIHZvaWQgZnBzYXZlKHVuc2lnbmVkIGxvbmcgKmZwcmVncywgdW5zaWduZWQgbG9uZyAqZnNyLAotCQkgICB2b2lkICpmcHF1ZXVlLCB1bnNpZ25lZCBsb25nICpmcHFkZXB0aCk7Ci1leHRlcm4gdm9pZCBmcGxvYWQodW5zaWduZWQgbG9uZyAqZnByZWdzLCB1bnNpZ25lZCBsb25nICpmc3IpOwotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbml0X2ZzciA9IDB4MFVMOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5pdF9mcmVnc1szMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgPQogICAgICAgICAgICAgICAgIHsgfjBVTCwgfjBVTCwgfjBVTCwgfjBVTCwgfjBVTCwgfjBVTCwgfjBVTCwgfjBVTCwKQEAgLTQ1Niw4ICs0MzAsNiBAQAogICogdXAgaGVyZSBzbyB0aGF0IHRpbWVyIGludGVycnVwdHMgd29yayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCiAgKi8KIAotZXh0ZXJuIHZvaWQgc3BhcmNfY3B1X3N0YXJ0dXAodm9pZCk7Ci0KIHZvaWQgdHJhcF9pbml0KHZvaWQpCiB7CiAJZXh0ZXJuIHZvaWQgdGhyZWFkX2luZm9fb2Zmc2V0c19hcmVfYm9saXhlZF9wZXRlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKaW5kZXggODFjY2QyMi4uNDYzOGFmMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTEzNzEsNyArMTM3MSw2IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEJWyUwXSAlMywgJSVnMFxuXHQiCiAJCQkgICAgICJsZHhhCVslMV0gJTMsICUlZzBcblx0IgogCQkJICAgICAiY2FzeGEJWyUyXSAlMywgJSVnMCwgJSVnMFxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG5cdCIKIAkJCSAgICAgImxkeGEJWyUwXSAlMywgJSVnMFxuXHQiCiAJCQkgICAgICJsZHhhCVslMV0gJTMsICUlZzBcblx0IgogCQkJICAgICAibWVtYmFyCSNTeW5jIgpAQCAtMTgzMyw3ICsxODMyLDcgQEAKIAl9CiB9CiAKLS8qIFdlIHJ1biB3aXRoICVwaWwgc2V0IHRvIDE1IGFuZCBQU1RBVEVfSUUgZW5hYmxlZCBpbiAlcHN0YXRlLgorLyogV2UgcnVuIHdpdGggJXBpbCBzZXQgdG8gUElMX05PUk1BTF9NQVggYW5kIFBTVEFURV9JRSBlbmFibGVkIGluICVwc3RhdGUuCiAgKiBMb2cgdGhlIGV2ZW50IGFuZCBjbGVhciB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgZW50cnkuCiAgKi8KIHZvaWQgc3VuNHZfcmVzdW1fZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQpAQCAtMTg4MSw3ICsxODgwLDcgQEAKIAlhdG9taWNfaW5jKCZzdW40dl9yZXN1bV9vZmxvd19jbnQpOwogfQogCi0vKiBXZSBydW4gd2l0aCAlcGlsIHNldCB0byAxNSBhbmQgUFNUQVRFX0lFIGVuYWJsZWQgaW4gJXBzdGF0ZS4KKy8qIFdlIHJ1biB3aXRoICVwaWwgc2V0IHRvIFBJTF9OT1JNQUxfTUFYIGFuZCBQU1RBVEVfSUUgZW5hYmxlZCBpbiAlcHN0YXRlLgogICogTG9nIHRoZSBldmVudCwgY2xlYXIgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGVudHJ5LCBhbmQgZGllLgogICovCiB2b2lkIHN1bjR2X25vbnJlc3VtX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHNiLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC90c2IuUwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3RzYi5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC90c2IuUwppbmRleCBjNDk5MjE0Li44YzkxZDliIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RzYi5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RzYi5TCkBAIC0zMTcsNyArMzE3LDcgQEAKIAlzcmx4CSVnMSwgMzIsICVvMwogCWFuZGNjCSVvMywgJWcyLCAlZzAKIAlibmUscG4JJWljYywgMWIKLQkgbWVtYmFyCSNMb2FkTG9hZAorCSBub3AKIAljbXAJJWcxLCAlbzEKIAltb3YJMSwgJW8zCiAJYm5lLHB0CSV4Y2MsIDJmCkBAIC0zMjcsNyArMzI3LDcgQEAKIAlibmUscG4JJXhjYywgMWIKIAkgbm9wCiAyOglyZXRsCi0JIFRTQl9NRU1CQVIKKwkgbm9wCiAJLnNpemUJdHNiX2ZsdXNoLCAuLXRzYl9mbHVzaAogCiAJLyogUmVsb2FkIE1NVSByZWxhdGVkIGNvbnRleHQgc3dpdGNoIHN0YXRlIGF0CkBAIC00NzgsNyArNDc4LDcgQEAKIAkgbm9wCiAKIAlyZXRsCi0JIFRTQl9NRU1CQVIKKwkgbm9wCiAJLnNpemUJCWNvcHlfdHNiLCAuLWNvcHlfdHNiCiAKIAkvKiBTZXQgdGhlIGludmFsaWQgYml0IGluIGFsbCBUU0IgZW50cmllcy4gICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3R0YWJsZS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHRhYmxlLlMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC90dGFibGUuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdHRhYmxlLlMKaW5kZXggMWFkZTNkNi4uZWE5MjU1MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90dGFibGUuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90dGFibGUuUwpAQCAtNjYsNyArNjYsNyBAQAogdGwwX2lycTc6CUJUUkFQKDB4NDcpIEJUUkFQKDB4NDgpIEJUUkFQKDB4NDkpCiB0bDBfaXJxMTA6CUJUUkFQKDB4NGEpIEJUUkFQKDB4NGIpIEJUUkFQKDB4NGMpIEJUUkFQKDB4NGQpCiB0bDBfaXJxMTQ6CVRSQVBfSVJRKHRpbWVyX2ludGVycnVwdCwgMTQpCi10bDBfaXJxMTU6CVRSQVBfSVJRKGhhbmRsZXJfaXJxLCAxNSkKK3RsMF9pcnExNToJVFJBUF9OTUlfSVJRKHBlcmZjdHJfaXJxLCAxNSkKIHRsMF9yZXN2MDUwOglCVFJBUCgweDUwKSBCVFJBUCgweDUxKSBCVFJBUCgweDUyKSBCVFJBUCgweDUzKSBCVFJBUCgweDU0KSBCVFJBUCgweDU1KQogdGwwX3Jlc3YwNTY6CUJUUkFQKDB4NTYpIEJUUkFQKDB4NTcpIEJUUkFQKDB4NTgpIEJUUkFQKDB4NTkpIEJUUkFQKDB4NWEpIEJUUkFQKDB4NWIpCiB0bDBfcmVzdjA1YzoJQlRSQVAoMHg1YykgQlRSQVAoMHg1ZCkgQlRSQVAoMHg1ZSkgQlRSQVAoMHg1ZikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYV9hc20uUyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYV9hc21fMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9rZXJuZWwvdW5hX2FzbS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC91bmFfYXNtXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdW5hX2FzbS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hX2FzbV82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3VuYV9hc20uUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdW5hX2FzbV82NC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC91bmFsaWduZWQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdXMyZV9jcHVmcmVxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91czJlX2NwdWZyZXEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC91czJlX2NwdWZyZXEuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdXMyZV9jcHVmcmVxLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdXMzX2NwdWZyZXEuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VzM19jcHVmcmVxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvdXMzX2NwdWZyZXEuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdXMzX2NwdWZyZXEuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC91dHJhcC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvdXRyYXAuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC91dHJhcC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2tlcm5lbC91dHJhcC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3Zpby5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlzZW11bC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQva2VybmVsL3Zpc2VtdWwuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA1YjdlNjlhLi43NjI2NzA4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEsMjcgKzEsNTYgQEAKLS8qIGxkIHNjcmlwdCB0byBtYWtlIFNwYXJjTGludXgga2VybmVsICovCisvKiBsZCBzY3JpcHQgZm9yIHNwYXJjMzIvc3BhcmM2NCBrZXJuZWwgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKyNpZmRlZiBDT05GSUdfU1BBUkMzMgorI2RlZmluZSBJTklUSUFMX0FERFJFU1MgIDB4MTAwMDAgKyBTSVpFT0ZfSEVBREVSUworI2RlZmluZSBURVhUU1RBUlQJMHhmMDAwNDAwMAorCisjZGVmaW5lIFNNUF9DQUNIRV9CWVRFU19TSElGVCA1CisKKyNlbHNlCisjZGVmaW5lIFNNUF9DQUNIRV9CWVRFU19TSElGVCA2CisjZGVmaW5lIElOSVRJQUxfQUREUkVTUyAweDQwMDAKKyNkZWZpbmUgVEVYVFNUQVJUICAgICAgMHgwMDAwMDAwMDAwNDA0MDAwCisKKyNlbmRpZgorCisjZGVmaW5lIFNNUF9DQUNIRV9CWVRFUyAoMSA8PCBTTVBfQ0FDSEVfQllURVNfU0hJRlQpCisKKyNpZmRlZiBDT05GSUdfU1BBUkMzMgogT1VUUFVUX0ZPUk1BVCgiZWxmMzItc3BhcmMiLCAiZWxmMzItc3BhcmMiLCAiZWxmMzItc3BhcmMiKQogT1VUUFVUX0FSQ0goc3BhcmMpCiBFTlRSWShfc3RhcnQpCiBqaWZmaWVzID0gamlmZmllc182NCArIDQ7CisjZWxzZQorLyogc3BhcmM2NCAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtc3BhcmMiLCAiZWxmNjQtc3BhcmMiLCAiZWxmNjQtc3BhcmMiKQorT1VUUFVUX0FSQ0goc3BhcmM6djlhKQorRU5UUlkoX3N0YXJ0KQoramlmZmllcyA9IGppZmZpZXNfNjQ7CisjZW5kaWYKKwogU0VDVElPTlMKIHsKLQkuID0gMHgxMDAwMCArIFNJWkVPRl9IRUFERVJTOwotCS50ZXh0IDB4ZjAwMDQwMDAgOgorCS8qIHN3YXBwZXJfbG93X3BtZF9kaXIgaXMgc3BhcmM2NCBvbmx5ICovCisJc3dhcHBlcl9sb3dfcG1kX2RpciA9IDB4MDAwMDAwMDAwMDQwMjAwMDsKKwkuID0gSU5JVElBTF9BRERSRVNTOworCS50ZXh0IFRFWFRTVEFSVCA6CiAJewogCQlfdGV4dCA9IC47CiAJCSooLnRleHQuaGVhZCkKIAkJVEVYVF9URVhUCiAJCVNDSEVEX1RFWFQKIAkJTE9DS19URVhUCisJCUtQUk9CRVNfVEVYVAogCQkqKC5nbnUud2FybmluZykKIAl9ID0gMAogCV9ldGV4dCA9IC47Ci0JUFJPVklERSAoZXRleHQgPSAuKTsKLQlST0RBVEEKKworCVJPX0RBVEEoUEFHRV9TSVpFKQogCS5kYXRhIDoJewogCQlEQVRBX0RBVEEKIAkJQ09OU1RSVUNUT1JTCkBAIC0yOSwyNSArNTgsMzggQEAKIAkuZGF0YTEgOiB7CiAJCSooLmRhdGExKQogCX0KKwkuID0gQUxJR04oU01QX0NBQ0hFX0JZVEVTKTsKKwkuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsKKwkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKKwl9CisJLiA9IEFMSUdOKFNNUF9DQUNIRV9CWVRFUyk7CisJLmRhdGEucmVhZF9tb3N0bHkgOiB7CisJCSooLmRhdGEucmVhZF9tb3N0bHkpCisJfQorCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAlfZWRhdGEgPSAuOwotCVBST1ZJREUgKGVkYXRhID0gLik7CiAKKwkvKiBpbml0X3Rhc2sgKi8KKwkuID0gQUxJR04oVEhSRUFEX1NJWkUpOworCS5kYXRhLmluaXRfdGFzayA6IHsKKwkJKiguZGF0YS5pbml0X3Rhc2spCisJfQogCS5maXh1cCA6IHsKIAkJX19zdGFydF9fX2ZpeHVwID0gLjsKIAkJKiguZml4dXApCiAJCV9fc3RvcF9fX2ZpeHVwID0gLjsKIAl9CisJLiA9IEFMSUdOKDE2KTsKIAlfX2V4X3RhYmxlIDogewogCQlfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwogCQkqKF9fZXhfdGFibGUpCiAJCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKIAl9Ci0KIAlOT1RFUwogCiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19pbml0X2JlZ2luID0gLjsKIAkuaW5pdC50ZXh0IDogeworCQlfX2luaXRfYmVnaW4gPSAuOwogCQlfc2luaXR0ZXh0ID0gLjsKIAkJSU5JVF9URVhUCiAJCV9laW5pdHRleHQgPSAuOwpAQCAtNjUsNyArMTA3LDcgQEAKIAkuaW5pdGNhbGwuaW5pdCA6IHsKIAkJX19pbml0Y2FsbF9zdGFydCA9IC47CiAJCUlOSVRDQUxMUwotCV9faW5pdGNhbGxfZW5kID0gLjsKKwkJX19pbml0Y2FsbF9lbmQgPSAuOwogCX0KIAkuY29uX2luaXRjYWxsLmluaXQgOiB7CiAJCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKQEAgLTc0LDM4ICsxMTYsNjEgQEAKIAl9CiAJU0VDVVJJVFlfSU5JVAogCisJLiA9IEFMSUdOKDQpOworCS50c2JfbGRxdWFkX3BoeXNfcGF0Y2ggOiB7CisJCV9fdHNiX2xkcXVhZF9waHlzX3BhdGNoID0gLjsKKwkJKigudHNiX2xkcXVhZF9waHlzX3BhdGNoKQorCQlfX3RzYl9sZHF1YWRfcGh5c19wYXRjaF9lbmQgPSAuOworCX0KKworCS50c2JfcGh5c19wYXRjaCA6IHsKKwkJX190c2JfcGh5c19wYXRjaCA9IC47CisJCSooLnRzYl9waHlzX3BhdGNoKQorCQlfX3RzYl9waHlzX3BhdGNoX2VuZCA9IC47CisJfQorCisJLmNwdWlkX3BhdGNoIDogeworCQlfX2NwdWlkX3BhdGNoID0gLjsKKwkJKiguY3B1aWRfcGF0Y2gpCisJCV9fY3B1aWRfcGF0Y2hfZW5kID0gLjsKKwl9CisKKwkuc3VuNHZfMWluc25fcGF0Y2ggOiB7CisJCV9fc3VuNHZfMWluc25fcGF0Y2ggPSAuOworCQkqKC5zdW40dl8xaW5zbl9wYXRjaCkKKwkJX19zdW40dl8xaW5zbl9wYXRjaF9lbmQgPSAuOworCX0KKwkuc3VuNHZfMmluc25fcGF0Y2ggOiB7CisJCV9fc3VuNHZfMmluc25fcGF0Y2ggPSAuOworCQkqKC5zdW40dl8yaW5zbl9wYXRjaCkKKwkJX19zdW40dl8yaW5zbl9wYXRjaF9lbmQgPSAuOworCX0KKwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCS5pbml0LnJhbWZzIDogewotCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKKwkJX19pbml0cmFtZnNfc3RhcnQgPSAuOwogCQkqKC5pbml0LnJhbWZzKQotCV9faW5pdHJhbWZzX2VuZCA9IC47CisJCV9faW5pdHJhbWZzX2VuZCA9IC47CiAJfQogI2VuZGlmCiAKIAlQRVJDUFUoUEFHRV9TSVpFKQorCiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19pbml0X2VuZCA9IC47Ci0JLiA9IEFMSUdOKDMyKTsKLQkuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsKLQkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKLQl9Ci0JLiA9IEFMSUdOKDMyKTsKLQkuZGF0YS5yZWFkX21vc3RseSA6IHsKLQkJKiguZGF0YS5yZWFkX21vc3RseSkKLQl9Ci0KIAlfX2Jzc19zdGFydCA9IC47CiAJLnNic3MgOiB7CiAJCSooLnNic3MpCi0JCSooLnNjb21tb24pIH0KKwkJKiguc2NvbW1vbikKKwl9CiAJLmJzcyA6IHsKIAkJKiguZHluYnNzKQogCQkqKC5ic3MpCiAJCSooQ09NTU9OKQogCX0KIAlfZW5kID0gLiA7Ci0JUFJPVklERSAoZW5kID0gLik7CisKIAkvRElTQ0FSRC8gOiB7CiAJCUVYSVRfVEVYVAogCQlFWElUX0RBVEEKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvd2luZml4dXAuUyBiL2FyY2gvc3BhcmMva2VybmVsL3dpbmZpeHVwLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9rZXJuZWwvd2luZml4dXAuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9rZXJuZWwvd2luZml4dXAuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9HRU5iemVyby5TIGIvYXJjaC9zcGFyYy9saWIvR0VOYnplcm8uUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9HRU5iemVyby5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9HRU5iemVyby5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL0dFTmNvcHlfZnJvbV91c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9HRU5jb3B5X2Zyb21fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL0dFTmNvcHlfZnJvbV91c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL0dFTmNvcHlfZnJvbV91c2VyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvR0VOY29weV90b191c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9HRU5jb3B5X3RvX3VzZXIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9HRU5jb3B5X3RvX3VzZXIuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvR0VOY29weV90b191c2VyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvR0VObWVtY3B5LlMgYi9hcmNoL3NwYXJjL2xpYi9HRU5tZW1jcHkuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9HRU5tZW1jcHkuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvR0VObWVtY3B5LlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvR0VOcGFnZS5TIGIvYXJjaC9zcGFyYy9saWIvR0VOcGFnZS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL0dFTnBhZ2UuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvR0VOcGFnZS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL0dFTnBhdGNoLlMgYi9hcmNoL3NwYXJjL2xpYi9HRU5wYXRjaC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL0dFTnBhdGNoLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL0dFTnBhdGNoLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKaW5kZXggNmUzMDNlMS4uMzc1MDE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKQEAgLTEsMTMgKzEsNDQgQEAKICMgTWFrZWZpbGUgZm9yIFNwYXJjIGxpYnJhcnkgZmlsZXMuLgogIwogCi1FWFRSQV9BRkxBR1MgOj0gLWFuc2kgLURTVF9ESVYwPTB4MDIKK2FzZmxhZ3MteSA6PSAtYW5zaSAtRFNUX0RJVjA9MHgwMgorY2NmbGFncy15IDo9IC1XZXJyb3IKIAotbGliLXkgOj0gbXVsLm8gcmVtLm8gc2Rpdi5vIHVkaXYubyB1bXVsLm8gdXJlbS5vIGFzaHJkaTMubyBtZW1jcHkubyBtZW1zZXQubyBcCi0gICAgICAgICBzdHJsZW4ubyBjaGVja3N1bS5vIGJsb2Nrb3BzLm8gbWVtc2Nhbi5vIG1lbWNtcC5vIHN0cm5jbXAubyBcCi0JIHN0cm5jcHlfZnJvbV91c2VyLm8gZGl2ZGkzLm8gdWRpdmRpMy5vIHN0cmxlbl91c2VyLm8gXAotCSBjb3B5X3VzZXIubyBsb2Nrcy5vIGF0b21pYy5vIFwKLQkgbHNocmRpMy5vIGFzaGxkaTMubyByd3NlbS5vIG11bGRpMy5vIGJpdGV4dC5vIFwKLQkgY21wZGkyLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBtdWwubyByZW0ubyBzZGl2Lm8gdWRpdi5vIHVtdWwubyB1cmVtLm8gYXNocmRpMy5vCitsaWItJChDT05GSUdfU1BBUkMzMikgKz0gbWVtY3B5Lm8gbWVtc2V0Lm8KK2xpYi15ICAgICAgICAgICAgICAgICArPSBzdHJsZW4ubworbGliLXkgICAgICAgICAgICAgICAgICs9IGNoZWNrc3VtXyQoQklUUykubworbGliLSQoQ09ORklHX1NQQVJDMzIpICs9IGJsb2Nrb3BzLm8KK2xpYi15ICAgICAgICAgICAgICAgICArPSBtZW1zY2FuXyQoQklUUykubyBtZW1jbXAubyBzdHJuY21wXyQoQklUUykubworbGliLXkgICAgICAgICAgICAgICAgICs9IHN0cm5jcHlfZnJvbV91c2VyXyQoQklUUykubyBzdHJsZW5fdXNlcl8kKEJJVFMpLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBkaXZkaTMubyB1ZGl2ZGkzLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBjb3B5X3VzZXIubyBsb2Nrcy5vCitsaWIteSAgICAgICAgICAgICAgICAgKz0gYXRvbWljXyQoQklUUykubworbGliLSQoQ09ORklHX1NQQVJDMzIpICs9IGxzaHJkaTMubyBhc2hsZGkzLm8KK2xpYi15ICAgICAgICAgICAgICAgICArPSByd3NlbV8kKEJJVFMpLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBtdWxkaTMubyBiaXRleHQubyBjbXBkaTIubwogCi1vYmoteSArPSBpb21hcC5vIGF0b21pYzMyLm8KK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBQZWVDZWVJLm8gY29weV9wYWdlLm8gY2xlYXJfcGFnZS5vIGJ6ZXJvLm8KK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBjc3VtX2NvcHkubyBjc3VtX2NvcHlfZnJvbV91c2VyLm8gY3N1bV9jb3B5X3RvX3VzZXIubworbGliLSQoQ09ORklHX1NQQVJDNjQpICs9IFZJU3NhdmUubworbGliLSQoQ09ORklHX1NQQVJDNjQpICs9IGJpdG9wcy5vCisKK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBVMW1lbWNweS5vIFUxY29weV9mcm9tX3VzZXIubyBVMWNvcHlfdG9fdXNlci5vCisKK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBVM21lbWNweS5vIFUzY29weV9mcm9tX3VzZXIubyBVM2NvcHlfdG9fdXNlci5vCitsaWItJChDT05GSUdfU1BBUkM2NCkgKz0gVTNwYXRjaC5vCisKK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBOR21lbWNweS5vIE5HY29weV9mcm9tX3VzZXIubyBOR2NvcHlfdG9fdXNlci5vCitsaWItJChDT05GSUdfU1BBUkM2NCkgKz0gTkdwYXRjaC5vIE5HcGFnZS5vIE5HYnplcm8ubworCitsaWItJChDT05GSUdfU1BBUkM2NCkgKz0gTkcybWVtY3B5Lm8gTkcyY29weV9mcm9tX3VzZXIubyBORzJjb3B5X3RvX3VzZXIubworbGliLSQoQ09ORklHX1NQQVJDNjQpICs9ICBORzJwYXRjaC5vIE5HMnBhZ2UubworCitsaWItJChDT05GSUdfU1BBUkM2NCkgKz0gR0VObWVtY3B5Lm8gR0VOY29weV9mcm9tX3VzZXIubyBHRU5jb3B5X3RvX3VzZXIubworbGliLSQoQ09ORklHX1NQQVJDNjQpICs9IEdFTnBhdGNoLm8gR0VOcGFnZS5vIEdFTmJ6ZXJvLm8KKworbGliLSQoQ09ORklHX1NQQVJDNjQpICs9IGNvcHlfaW5fdXNlci5vIHVzZXJfZml4dXAubyBtZW1tb3ZlLm8KK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBtY291bnQubyBpcGNzdW0ubyB4b3IubworCitvYmoteSAgICAgICAgICAgICAgICAgKz0gaW9tYXAubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICs9IGF0b21pYzMyLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvTkcyY29weV9mcm9tX3VzZXIuUyBiL2FyY2gvc3BhcmMvbGliL05HMmNvcHlfZnJvbV91c2VyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkcyY29weV9mcm9tX3VzZXIuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvTkcyY29weV9mcm9tX3VzZXIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9ORzJjb3B5X3RvX3VzZXIuUyBiL2FyY2gvc3BhcmMvbGliL05HMmNvcHlfdG9fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL05HMmNvcHlfdG9fdXNlci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9ORzJjb3B5X3RvX3VzZXIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9ORzJtZW1jcHkuUyBiL2FyY2gvc3BhcmMvbGliL05HMm1lbWNweS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL05HMm1lbWNweS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9ORzJtZW1jcHkuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9ORzJwYWdlLlMgYi9hcmNoL3NwYXJjL2xpYi9ORzJwYWdlLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkcycGFnZS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9ORzJwYWdlLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvTkcycGF0Y2guUyBiL2FyY2gvc3BhcmMvbGliL05HMnBhdGNoLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkcycGF0Y2guUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvTkcycGF0Y2guUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9OR2J6ZXJvLlMgYi9hcmNoL3NwYXJjL2xpYi9OR2J6ZXJvLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkdiemVyby5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9OR2J6ZXJvLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvTkdjb3B5X2Zyb21fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvTkdjb3B5X2Zyb21fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL05HY29weV9mcm9tX3VzZXIuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvTkdjb3B5X2Zyb21fdXNlci5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL05HY29weV90b191c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9OR2NvcHlfdG9fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL05HY29weV90b191c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL05HY29weV90b191c2VyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvTkdtZW1jcHkuUyBiL2FyY2gvc3BhcmMvbGliL05HbWVtY3B5LlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkdtZW1jcHkuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvTkdtZW1jcHkuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9OR3BhZ2UuUyBiL2FyY2gvc3BhcmMvbGliL05HcGFnZS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL05HcGFnZS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9OR3BhZ2UuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9OR3BhdGNoLlMgYi9hcmNoL3NwYXJjL2xpYi9OR3BhdGNoLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvTkdwYXRjaC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9OR3BhdGNoLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvUGVlQ2VlSS5jIGIvYXJjaC9zcGFyYy9saWIvUGVlQ2VlSS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL1BlZUNlZUkuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvUGVlQ2VlSS5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL1UxY29weV9mcm9tX3VzZXIuUyBiL2FyY2gvc3BhcmMvbGliL1UxY29weV9mcm9tX3VzZXIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9VMWNvcHlfZnJvbV91c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL1UxY29weV9mcm9tX3VzZXIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9VMWNvcHlfdG9fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvVTFjb3B5X3RvX3VzZXIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9VMWNvcHlfdG9fdXNlci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9VMWNvcHlfdG9fdXNlci5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMgYi9hcmNoL3NwYXJjL2xpYi9VMW1lbWNweS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL1UxbWVtY3B5LlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvVTNjb3B5X2Zyb21fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvVTNjb3B5X2Zyb21fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL1UzY29weV9mcm9tX3VzZXIuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvVTNjb3B5X2Zyb21fdXNlci5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL1UzY29weV90b191c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9VM2NvcHlfdG9fdXNlci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL1UzY29weV90b191c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL1UzY29weV90b191c2VyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvVTNtZW1jcHkuUyBiL2FyY2gvc3BhcmMvbGliL1UzbWVtY3B5LlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvVTNtZW1jcHkuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvVTNtZW1jcHkuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9VM3BhdGNoLlMgYi9hcmNoL3NwYXJjL2xpYi9VM3BhdGNoLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvVTNwYXRjaC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9VM3BhdGNoLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvVklTc2F2ZS5TIGIvYXJjaC9zcGFyYy9saWIvVklTc2F2ZS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvVklTc2F2ZS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9hdG9taWMuUyBiL2FyY2gvc3BhcmMvbGliL2F0b21pY18zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2xpYi9hdG9taWMuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvYXRvbWljXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvYXRvbWljLlMgYi9hcmNoL3NwYXJjL2xpYi9hdG9taWNfNjQuUwpzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9hdG9taWNfNjQuUwppbmRleCA3MGFjNDE4Li4wMjY4MjEwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TCisrKyBiL2FyY2gvc3BhcmMvbGliL2F0b21pY182NC5TCkBAIC00MywyOSArNDMsMTAgQEAKIDI6CUJBQ0tPRkZfU1BJTiglbzIsICVvMywgMWIpCiAJLnNpemUJYXRvbWljX3N1YiwgLi1hdG9taWNfc3ViCiAKLQkvKiBPbiBTTVAgd2UgbmVlZCB0byB1c2UgbWVtb3J5IGJhcnJpZXJzIHRvIGVuc3VyZQotCSAqIGNvcnJlY3QgbWVtb3J5IG9wZXJhdGlvbiBvcmRlcmluZywgbm9wIHRoZXNlIG91dAotCSAqIGZvciB1bmlwcm9jZXNzb3IuCi0JICovCi0jaWZkZWYgQ09ORklHX1NNUAotCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZDsKLSNkZWZpbmUgQVRPTUlDX1BPU1RfQkFSUklFUglcCi0JYmEscHQgJXhjYywgODBiOwlcCi0JbWVtYmFyICNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQotCi04MDoJcmV0bAotCSBub3AKLSNlbHNlCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgotI2RlZmluZSBBVE9NSUNfUE9TVF9CQVJSSUVSCi0jZW5kaWYKLQogCS5nbG9ibAlhdG9taWNfYWRkX3JldAogCS50eXBlCWF0b21pY19hZGRfcmV0LCNmdW5jdGlvbgogYXRvbWljX2FkZF9yZXQ6IC8qICVvMCA9IGluY3JlbWVudCwgJW8xID0gYXRvbWljX3B0ciAqLwogCUJBQ0tPRkZfU0VUVVAoJW8yKQotCUFUT01JQ19QUkVfQkFSUklFUgogMToJbGR1dwlbJW8xXSwgJWcxCiAJYWRkCSVnMSwgJW8wLCAlZzcKIAljYXMJWyVvMV0sICVnMSwgJWc3CkBAIC03Myw3ICs1NCw2IEBACiAJYm5lLHBuCSVpY2MsIDJmCiAJIGFkZAklZzcsICVvMCwgJWc3CiAJc3JhCSVnNywgMCwgJW8wCi0JQVRPTUlDX1BPU1RfQkFSUklFUgogCXJldGwKIAkgbm9wCiAyOglCQUNLT0ZGX1NQSU4oJW8yLCAlbzMsIDFiKQpAQCAtODMsNyArNjMsNiBAQAogCS50eXBlCWF0b21pY19zdWJfcmV0LCNmdW5jdGlvbgogYXRvbWljX3N1Yl9yZXQ6IC8qICVvMCA9IGRlY3JlbWVudCwgJW8xID0gYXRvbWljX3B0ciAqLwogCUJBQ0tPRkZfU0VUVVAoJW8yKQotCUFUT01JQ19QUkVfQkFSUklFUgogMToJbGR1dwlbJW8xXSwgJWcxCiAJc3ViCSVnMSwgJW8wLCAlZzcKIAljYXMJWyVvMV0sICVnMSwgJWc3CkBAIC05MSw3ICs3MCw2IEBACiAJYm5lLHBuCSVpY2MsIDJmCiAJIHN1YgklZzcsICVvMCwgJWc3CiAJc3JhCSVnNywgMCwgJW8wCi0JQVRPTUlDX1BPU1RfQkFSUklFUgogCXJldGwKIAkgbm9wCiAyOglCQUNLT0ZGX1NQSU4oJW8yLCAlbzMsIDFiKQpAQCAtMTMxLDcgKzEwOSw2IEBACiAJLnR5cGUJYXRvbWljNjRfYWRkX3JldCwjZnVuY3Rpb24KIGF0b21pYzY0X2FkZF9yZXQ6IC8qICVvMCA9IGluY3JlbWVudCwgJW8xID0gYXRvbWljX3B0ciAqLwogCUJBQ0tPRkZfU0VUVVAoJW8yKQotCUFUT01JQ19QUkVfQkFSUklFUgogMToJbGR4CVslbzFdLCAlZzEKIAlhZGQJJWcxLCAlbzAsICVnNwogCWNhc3gJWyVvMV0sICVnMSwgJWc3CkBAIC0xMzksNyArMTE2LDYgQEAKIAlibmUscG4JJXhjYywgMmYKIAkgYWRkCSVnNywgJW8wLCAlZzcKIAltb3YJJWc3LCAlbzAKLQlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAogCSBub3AKIDI6CUJBQ0tPRkZfU1BJTiglbzIsICVvMywgMWIpCkBAIC0xNDksNyArMTI1LDYgQEAKIAkudHlwZQlhdG9taWM2NF9zdWJfcmV0LCNmdW5jdGlvbgogYXRvbWljNjRfc3ViX3JldDogLyogJW8wID0gZGVjcmVtZW50LCAlbzEgPSBhdG9taWNfcHRyICovCiAJQkFDS09GRl9TRVRVUCglbzIpCi0JQVRPTUlDX1BSRV9CQVJSSUVSCiAxOglsZHgJWyVvMV0sICVnMQogCXN1YgklZzEsICVvMCwgJWc3CiAJY2FzeAlbJW8xXSwgJWcxLCAlZzcKQEAgLTE1Nyw3ICsxMzIsNiBAQAogCWJuZSxwbgkleGNjLCAyZgogCSBzdWIJJWc3LCAlbzAsICVnNwogCW1vdgklZzcsICVvMAotCUFUT01JQ19QT1NUX0JBUlJJRVIKIAlyZXRsCiAJIG5vcAogMjoJQkFDS09GRl9TUElOKCVvMiwgJW8zLCAxYikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvYml0b3BzLlMgYi9hcmNoL3NwYXJjL2xpYi9iaXRvcHMuUwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL2JpdG9wcy5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9iaXRvcHMuUwppbmRleCA2YjAxNWE2Li4yYjcyMjhjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2JpdG9wcy5TCisrKyBiL2FyY2gvc3BhcmMvbGliL2JpdG9wcy5TCkBAIC04LDI5ICs4LDEwIEBACiAKIAkudGV4dAogCi0JLyogT24gU01QIHdlIG5lZWQgdG8gdXNlIG1lbW9yeSBiYXJyaWVycyB0byBlbnN1cmUKLQkgKiBjb3JyZWN0IG1lbW9yeSBvcGVyYXRpb24gb3JkZXJpbmcsIG5vcCB0aGVzZSBvdXQKLQkgKiBmb3IgdW5pcHJvY2Vzc29yLgotCSAqLwotCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBCSVRPUF9QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZAotI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIJXAotCWJhLHB0CSV4Y2MsIDgwYjsJXAotCW1lbWJhciAjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKLQotODA6CXJldGwKLQkgbm9wCi0jZWxzZQotI2RlZmluZSBCSVRPUF9QUkVfQkFSUklFUgotI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIKLSNlbmRpZgotCiAJLmdsb2JsCXRlc3RfYW5kX3NldF9iaXQKIAkudHlwZQl0ZXN0X2FuZF9zZXRfYml0LCNmdW5jdGlvbgogdGVzdF9hbmRfc2V0X2JpdDoJLyogJW8wPW5yLCAlbzE9YWRkciAqLwogCUJBQ0tPRkZfU0VUVVAoJW8zKQotCUJJVE9QX1BSRV9CQVJSSUVSCiAJc3JseAklbzAsIDYsICVnMQogCW1vdgkxLCAlbzIKIAlzbGx4CSVnMSwgMywgJWczCkBAIC00NSw3ICsyNiw2IEBACiAJIGFuZAklZzcsICVvMiwgJWcyCiAJY2xyCSVvMAogCW1vdnJuZQklZzIsIDEsICVvMAotCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKIAkgbm9wCiAyOglCQUNLT0ZGX1NQSU4oJW8zLCAlbzQsIDFiKQpAQCAtNTUsNyArMzUsNiBAQAogCS50eXBlCXRlc3RfYW5kX2NsZWFyX2JpdCwjZnVuY3Rpb24KIHRlc3RfYW5kX2NsZWFyX2JpdDoJLyogJW8wPW5yLCAlbzE9YWRkciAqLwogCUJBQ0tPRkZfU0VUVVAoJW8zKQotCUJJVE9QX1BSRV9CQVJSSUVSCiAJc3JseAklbzAsIDYsICVnMQogCW1vdgkxLCAlbzIKIAlzbGx4CSVnMSwgMywgJWczCkBAIC03MCw3ICs0OSw2IEBACiAJIGFuZAklZzcsICVvMiwgJWcyCiAJY2xyCSVvMAogCW1vdnJuZQklZzIsIDEsICVvMAotCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKIAkgbm9wCiAyOglCQUNLT0ZGX1NQSU4oJW8zLCAlbzQsIDFiKQpAQCAtODAsNyArNTgsNiBAQAogCS50eXBlCXRlc3RfYW5kX2NoYW5nZV9iaXQsI2Z1bmN0aW9uCiB0ZXN0X2FuZF9jaGFuZ2VfYml0OgkvKiAlbzA9bnIsICVvMT1hZGRyICovCiAJQkFDS09GRl9TRVRVUCglbzMpCi0JQklUT1BfUFJFX0JBUlJJRVIKIAlzcmx4CSVvMCwgNiwgJWcxCiAJbW92CTEsICVvMgogCXNsbHgJJWcxLCAzLCAlZzMKQEAgLTk1LDcgKzcyLDYgQEAKIAkgYW5kCSVnNywgJW8yLCAlZzIKIAljbHIJJW8wCiAJbW92cm5lCSVnMiwgMSwgJW8wCi0JQklUT1BfUE9TVF9CQVJSSUVSCiAJcmV0bAogCSBub3AKIDI6CUJBQ0tPRkZfU1BJTiglbzMsICVvNCwgMWIpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2J6ZXJvLlMgYi9hcmNoL3NwYXJjL2xpYi9iemVyby5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL2J6ZXJvLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2J6ZXJvLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL2NoZWNrc3VtLlMgYi9hcmNoL3NwYXJjL2xpYi9jaGVja3N1bV8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2xpYi9jaGVja3N1bS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9jaGVja3N1bV8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2NoZWNrc3VtLlMgYi9hcmNoL3NwYXJjL2xpYi9jaGVja3N1bV82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL2NoZWNrc3VtLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2NoZWNrc3VtXzY0LlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvY2xlYXJfcGFnZS5TIGIvYXJjaC9zcGFyYy9saWIvY2xlYXJfcGFnZS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL2NsZWFyX3BhZ2UuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvY2xlYXJfcGFnZS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2NvcHlfaW5fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvY29weV9pbl91c2VyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvY29weV9pbl91c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2NvcHlfaW5fdXNlci5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9zcGFyYy9saWIvY29weV9wYWdlLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvY29weV9wYWdlLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2NvcHlfcGFnZS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2NzdW1fY29weS5TIGIvYXJjaC9zcGFyYy9saWIvY3N1bV9jb3B5LlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvY3N1bV9jb3B5LlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2NzdW1fY29weS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2NzdW1fY29weV9mcm9tX3VzZXIuUyBiL2FyY2gvc3BhcmMvbGliL2NzdW1fY29weV9mcm9tX3VzZXIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9jc3VtX2NvcHlfZnJvbV91c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2NzdW1fY29weV9mcm9tX3VzZXIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9jc3VtX2NvcHlfdG9fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvY3N1bV9jb3B5X3RvX3VzZXIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9jc3VtX2NvcHlfdG9fdXNlci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9jc3VtX2NvcHlfdG9fdXNlci5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2lwY3N1bS5TIGIvYXJjaC9zcGFyYy9saWIvaXBjc3VtLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvaXBjc3VtLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL2lwY3N1bS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL21jb3VudC5TIGIvYXJjaC9zcGFyYy9saWIvbWNvdW50LlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9saWIvbWNvdW50LlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL21jb3VudC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9tZW1jbXAuUyBiL2FyY2gvc3BhcmMvbGliL21lbWNtcC5TCmluZGV4IGNiNGJkYjAuLmVmYTEwNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbGliL21lbWNtcC5TCisrKyBiL2FyY2gvc3BhcmMvbGliL21lbWNtcC5TCkBAIC0xLDMxMiArMSwyNyBAQAorLyogU3BhcmMgb3B0aW1pemVkIG1lbWNtcCBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc20uaD4KKwogCS50ZXh0Ci0JLmFsaWduIDQKLQkuZ2xvYmFsIF9fbWVtY21wLCBtZW1jbXAKLV9fbWVtY21wOgotbWVtY21wOgotI2lmIDEKK0VOVFJZKG1lbWNtcCkKIAljbXAJJW8yLCAwCi0JYmxlCUwzCi0JIG1vdgkwLCAlZzMKLUw1OgotCWxkdWIJWyVvMF0sICVnMgorMToJQlJBTkNIMzIoYmUsIHBuLCAyZikKKwkgbm9wCisJbGR1YglbJW8wXSwgJWc3CiAJbGR1YglbJW8xXSwgJWczCi0Jc3ViCSVnMiwgJWczLCAlZzIKLQltb3YJJWcyLCAlZzMKLQlzbGwJJWcyLCAyNCwgJWcyCi0KLQljbXAJJWcyLCAwCi0JYm5lCUwzCi0JIGFkZAklbzAsIDEsICVvMAotCi0JYWRkCSVvMiwgLTEsICVvMgotCi0JY21wCSVvMiwgMAotCWJnCUw1Ci0JIGFkZAklbzEsIDEsICVvMQotTDM6Ci0Jc2xsCSVnMywgMjQsICVvMAotCXNyYQklbzAsIDI0LCAlbzAKLQotCXJldGwKLQkgbm9wCi0jZWxzZQotCXNhdmUJJXNwLCAtMTA0LCAlc3AKLQltb3YJJWkyLCAlbzQKLQltb3YJJWkwLCAlbzAKLQotCWNtcAklbzQsIDE1Ci0JYmxlCUw3MgotCSBtb3YJJWkxLCAlaTIKLQotCWFuZGNjCSVpMiwgMywgJWcwCi0JYmUJTDE2MQotCSBhbmRjYwklbzAsIDMsICVnMgotTDc1OgotCWxkdWIJWyVvMF0sICVnMwotCWxkdWIJWyVpMl0sICVnMgotCWFkZAklbzAsMSwgJW8wCi0KLQlzdWJjYwklZzMsICVnMiwgJWkwCi0JYm5lCUwxNTYKLQkgYWRkCSVpMiwgMSwgJWkyCi0KLQlhbmRjYwklaTIsIDMsICVnMAotCWJuZQlMNzUKLQkgYWRkCSVvNCwgLTEsICVvNAotCi0JYW5kY2MJJW8wLCAzLCAlZzIKLUwxNjE6Ci0JYm5lLGEJTDc4Ci0JIG1vdgklaTIsICVpMQotCi0JbW92CSVvMCwgJWk1Ci0JbW92CSVpMiwgJWkzCi0Jc3JsCSVvNCwgMiwgJWk0Ci0KLQljbXAJJWk0LCAwCi0JYmdlCUw5MwotCSBtb3YJJWk0LCAlZzIKLQotCWFkZCAlaTQsIDMsICVnMgotTDkzOgotCXNyYQklZzIsIDIsICVnMgotCXNsbAklZzIsIDIsICVnMgotCXN1YgklaTQsICVnMiwgJWcyCi0KLQljbXAJJWcyLCAxCi0JYmUsYQlMODgKLQkgYWRkCSVvMCwgNCwgJWk1Ci0KLQliZwlMOTQKLQkgY21wCSVnMiwgMgotCi0JY21wCSVnMiwgMAotCWJlLGEJTDg2Ci0JIGxkCVslbzBdLCAlZzMKLQotCWIJTDE2MgotCSBsZAlbJWk1XSwgJWczCi1MOTQ6Ci0JYmUJTDgxCi0JIGNtcAklZzIsIDMKLQotCWJlLGEJTDgzCi0JIGFkZAklbzAsIC00LCAlaTUKLQotCWIJTDE2MgotCSBsZAlbJWk1XSwgJWczCi1MODE6Ci0JYWRkCSVvMCwgLTgsICVpNQotCWxkCVslbzBdLCAlZzMKLQlhZGQJJWkyLCAtOCwgJWkzCi0JbGQJWyVpMl0sICVnMgotCi0JYglMODIKLQkgYWRkCSVpNCwgMiwgJWk0Ci1MODM6Ci0JbGQJWyVvMF0sICVnNAotCWFkZAklaTIsIC00LCAlaTMKLQlsZAlbJWkyXSwgJWcxCi0KLQliCUw4NAotCSBhZGQJJWk0LCAxLCAlaTQKLUw4NjoKLQliCUw4NwotCSBsZAlbJWkyXSwgJWcyCi1MODg6Ci0JYWRkCSVpMiwgNCwgJWkzCi0JbGQJWyVvMF0sICVnNAotCWFkZAklaTQsIC0xLCAlaTQKLQlsZAlbJWkyXSwgJWcxCi1MOTU6Ci0JbGQJWyVpNV0sICVnMwotTDE2MjoKLQljbXAJJWc0LCAlZzEKLQliZQlMODcKLQkgbGQJWyVpM10sICVnMgotCi0JY21wCSVnNCwgJWcxCi1MMTYzOgotCWJsZXUJTDExNAotCSBtb3YJLTEsICVpMAotCi0JYglMMTE0Ci0JIG1vdgkxLCAlaTAKLUw4NzoKLQlsZAlbJWk1ICsgNF0sICVnNAotCWNtcAklZzMsICVnMgotCWJuZQlMMTYzCi0JIGxkCVslaTMgKyA0XSwgJWcxCi1MODQ6Ci0JbGQJWyVpNSArIDhdLCAlZzMKLQotCWNtcAklZzQsICVnMQotCWJuZQlMMTYzCi0JIGxkCVslaTMgKyA4XSwgJWcyCi1MODI6Ci0JbGQJWyVpNSArIDEyXSwgJWc0Ci0JY21wCSVnMywgJWcyCi0JYm5lCUwxNjMKLQkgbGQJWyVpMyArIDEyXSwgJWcxCi0KLQlhZGQJJWk1LCAxNiwgJWk1Ci0KLQlhZGRjYwklaTQsIC00LCAlaTQKLQlibmUJTDk1Ci0JIGFkZAklaTMsIDE2LCAlaTMKLQotCWNtcAklZzQsICVnMQotCWJuZQlMMTYzCi0JIG5vcAotCi0JYglMMTE0Ci0JIG1vdgkwLCAlaTAKLUw3ODoKLQlzcmwJJW80LCAyLCAlaTAKLQlhbmQJJW8wLCAtNCwgJWkzCi0Jb3JjYwklaTAsICVnMCwgJWczCi0Jc2xsCSVnMiwgMywgJW83Ci0JbW92CTMyLCAlZzIKLQotCWJnZQlMMTI5Ci0JIHN1YgklZzIsICVvNywgJW8xCi0KLQlhZGQJJWkwLCAzLCAlZzMKLUwxMjk6Ci0Jc3JhCSVnMywgMiwgJWcyCi0Jc2xsCSVnMiwgMiwgJWcyCi0Jc3ViCSVpMCwgJWcyLCAlZzIKLQotCWNtcAklZzIsIDEKLQliZSxhCUwxMjQKLQkgbGQJWyVpM10sICVvMwotCi0JYmcJTDEzMAotCSBjbXAJJWcyLCAyCi0KLQljbXAJJWcyLCAwCi0JYmUsYQlMMTIyCi0JIGxkCVslaTNdLCAlbzIKLQotCWIJTDE2NAotCXNsbAklbzMsICVvNywgJWczCi1MMTMwOgotCWJlCUwxMTcKLQkgY21wCSVnMiwgMwotCi0JYmUsYQlMMTE5Ci0JIGxkCVslaTNdLCAlZzEKLQotCWIJTDE2NAotCSBzbGwJJW8zLCAlbzcsICVnMwotTDExNzoKLQlsZAlbJWkzXSwgJWc0Ci0JYWRkCSVpMiwgLTgsICVpMQotCWxkCVslaTMgKyA0XSwgJW8zCi0JYWRkCSVpMCwgMiwgJWkwCi0JbGQJWyVpMl0sICVpNAotCi0JYglMMTE4Ci0JIGFkZAklaTMsIC00LCAlaTMKLUwxMTk6Ci0JbGQJWyVpMyArIDRdLCAlZzQKLQlhZGQJJWkyLCAtNCwgJWkxCi0JbGQJWyVpMl0sICVpNQotCi0JYglMMTIwCi0JIGFkZAklaTAsIDEsICVpMAotTDEyMjoKLQlsZAlbJWkzICsgNF0sICVnMQotCWxkCVslaTJdLCAlaTQKLQotCWIJTDEyMwotCSBhZGQJJWkzLCA0LCAlaTMKLUwxMjQ6Ci0JYWRkCSVpMiwgNCwgJWkxCi0JbGQJWyVpMyArIDRdLCAlbzIKLQlhZGQJJWkwLCAtMSwgJWkwCi0JbGQJWyVpMl0sICVpNQotCWFkZAklaTMsIDgsICVpMwotTDEzMToKLQlzbGwJJW8zLCAlbzcsICVnMwotTDE2NDoKLQlzcmwJJW8yLCAlbzEsICVnMgotCWxkCVslaTNdLCAlZzEKLQlvcgklZzMsICVnMiwgJWczCi0KLQljbXAJJWczLCAlaTUKLQlibmUJTDE2MwotCSBsZAlbJWkxXSwgJWk0Ci1MMTIzOgotCXNsbAklbzIsICVvNywgJWczCi0Jc3JsCSVnMSwgJW8xLCAlZzIKLQlsZAlbJWkzICsgNF0sICVnNAotCW9yCSVnMywgJWcyLCAlZzMKLQotCWNtcAklZzMsICVpNAotCWJuZQlMMTYzCi0JIGxkCVslaTEgKyA0XSwgJWk1Ci1MMTIwOgotCXNsbAklZzEsICVvNywgJWczCi0Jc3JsCSVnNCwgJW8xLCAlZzIKLQlsZAlbJWkzICsgOF0sICVvMwotCW9yCSVnMywgJWcyLCAlZzMKLQotCWNtcAklZzMsICVpNQotCWJuZQlMMTYzCi0JIGxkCVslaTEgKyA4XSwgJWk0Ci1MMTE4OgotCXNsbAklZzQsICVvNywgJWczCi0Jc3JsCSVvMywgJW8xLCAlZzIKLQlsZAlbJWkzICsgMTJdLCAlbzIKLQlvcgklZzMsICVnMiwgJWczCi0KLQljbXAJJWczLCAlaTQKLQlibmUJTDE2MwotCSBsZAlbJWkxICsgMTJdLCAlaTUKLQotCWFkZAklaTMsIDE2LCAlaTMKLQlhZGRjYwklaTAsIC00LCAlaTAKLQlibmUJTDEzMQotCSBhZGQJJWkxLCAxNiwgJWkxCi0KLQlzbGwJJW8zLCAlbzcsICVnMwotCXNybAklbzIsICVvMSwgJWcyCi0Jb3IJJWczLCAlZzIsICVnMwotCi0JY21wCSVnMywgJWk1Ci0JYmUsYQlMMTE0Ci0JIG1vdgkwLCAlaTAKLQotCWIsYSBMMTYzCi1MMTE0OgotCWNtcAklaTAsIDAKLQlibmUJTDE1NgotCSBhbmQJJW80LCAtNCwgJWcyCi0KLQlhZGQJJW8wLCAlZzIsICVvMAotCWFkZAklaTIsICVnMiwgJWkyCi0JYW5kCSVvNCwgMywgJW80Ci1MNzI6Ci0JY21wCSVvNCwgMAotCWJlCUwxNTYKLQkgbW92CTAsICVpMAotCi0JbGR1YglbJW8wXSwgJWczCi1MMTY1OgotCWxkdWIJWyVpMl0sICVnMgorCXN1YgklbzIsIDEsICVvMgogCWFkZAklbzAsIDEsICVvMAotCi0Jc3ViY2MJJWczLCAlZzIsICVpMAotCWJuZQlMMTU2Ci0JIGFkZAklaTIsIDEsICVpMgotCi0JYWRkY2MJJW80LCAtMSwgJW80Ci0JYm5lLGEJTDE2NQotCSBsZHViCVslbzBdLCAlZzMKLQotCW1vdgkwLCAlaTAKLUwxNTY6Ci0JcmV0Ci0JcmVzdG9yZQotI2VuZGlmCisJYWRkCSVvMSwgMSwgJW8xCisJc3ViY2MJJWc3LCAlZzMsICVnMworCUJSQU5DSDMyKGJlLCBwdCwgMWIpCisJIGNtcAklbzIsIDAKKwlyZXRsCisJIG1vdgklZzMsICVvMAorMjoJcmV0bAorCSBtb3YJMCwgJW8wCitFTkRQUk9DKG1lbWNtcCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvbWVtbW92ZS5TIGIvYXJjaC9zcGFyYy9saWIvbWVtbW92ZS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL21lbW1vdmUuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvbWVtbW92ZS5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9tZW1zY2FuLlMgYi9hcmNoL3NwYXJjL2xpYi9tZW1zY2FuXzMyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvbGliL21lbXNjYW4uUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvbWVtc2Nhbl8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL21lbXNjYW4uUyBiL2FyY2gvc3BhcmMvbGliL21lbXNjYW5fNjQuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9tZW1zY2FuLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL21lbXNjYW5fNjQuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9saWIvcndzZW0uUyBiL2FyY2gvc3BhcmMvbGliL3J3c2VtXzMyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvbGliL3J3c2VtLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL3J3c2VtXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvcndzZW0uUyBiL2FyY2gvc3BhcmMvbGliL3J3c2VtXzY0LlMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9yd3NlbS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9yd3NlbV82NC5TCmluZGV4IDFhNGNjNTYuLjkxYTdkMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9saWIvcndzZW0uUworKysgYi9hcmNoL3NwYXJjL2xpYi9yd3NlbV82NC5TCkBAIC0xNyw3ICsxNyw2IEBACiAJYm5lLHBuCQklaWNjLCAxYgogCSBhZGQJCSVnNywgMSwgJWc3CiAJY21wCQklZzcsIDAKLQltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJsLHBuCQklaWNjLCAzZgogCSBub3AKIDI6CkBAIC00Miw3ICs0MSw2IEBACiAJY21wCQklZzEsICVnNwogCWJuZSxwbgkJJWljYywgMWIKIAkgbW92CQkxLCAlbzEKLQltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogMjoJcmV0bAogCSBtb3YJCSVvMSwgJW8wCiAJLnNpemUJCV9fZG93bl9yZWFkX3RyeWxvY2ssIC4tX19kb3duX3JlYWRfdHJ5bG9jawpAQCAtNTgsNyArNTYsNiBAQAogCWNtcAkJJWczLCAlZzcKIAlibmUscG4JCSVpY2MsIDFiCiAJIGNtcAkJJWc3LCAwCi0JbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlibmUscG4JCSVpY2MsIDNmCiAJIG5vcAogMjoJcmV0bApAQCAtODUsNyArODIsNiBAQAogCWNtcAkJJWczLCAlZzcKIAlibmUscG4JCSVpY2MsIDFiCiAJIG1vdgkJMSwgJW8xCi0JbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIDI6CXJldGwKIAkgbW92CQklbzEsICVvMAogCS5zaXplCQlfX2Rvd25fd3JpdGVfdHJ5bG9jaywgLi1fX2Rvd25fd3JpdGVfdHJ5bG9jawpAQCAtOTksNyArOTUsNiBAQAogCWNtcAkJJWcxLCAlZzcKIAlibmUscG4JCSVpY2MsIDFiCiAJIGNtcAkJJWc3LCAwCi0JbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlibCxwbgkJJWljYywgM2YKIAkgbm9wCiAyOglyZXRsCkBAIC0xMjksNyArMTI0LDYgQEAKIAlibmUscG4JCSVpY2MsIDFiCiAJIHN1YgkJJWc3LCAlZzEsICVnNwogCWNtcAkJJWc3LCAwCi0JbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlibCxwbgkJJWljYywgM2YKIAkgbm9wCiAyOgpAQCAtMTU1LDcgKzE0OSw2IEBACiAJYm5lLHBuCQklaWNjLCAxYgogCSBzdWIJCSVnNywgJWcxLCAlZzcKIAljbXAJCSVnNywgMAotCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAJYmwscG4JCSVpY2MsIDNmCiAJIG5vcAogMjoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL3N0cmxlbi5TIGIvYXJjaC9zcGFyYy9saWIvc3RybGVuLlMKaW5kZXggZWQ5YTc2My4uNTM2ZjgzNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvc3RybGVuLlMKKysrIGIvYXJjaC9zcGFyYy9saWIvc3RybGVuLlMKQEAgLTEsNTEgKzEsNDAgQEAKIC8qIHN0cmxlbi5TOiBTcGFyYyBvcHRpbWl6ZWQgc3RybGVuIGNvZGUKICAqIEhhbmQgb3B0aW1pemVkIGZyb20gR05VIGxpYmMncyBzdHJsZW4KICAqIENvcHlyaWdodCAoQykgMTk5MSwxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqIENvcHlyaWdodCAoQykgMTk5NiBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICogQ29weXJpZ2h0IChDKSAxOTk2LDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisKICNkZWZpbmUgTE9fTUFHSUMgMHgwMTAxMDEwMQogI2RlZmluZSBISV9NQUdJQyAweDgwODA4MDgwCiAKLTA6Ci0JbGR1YglbJW8wXSwgJW81Ci0JY21wCSVvNSwgMAotCWJlCTFmCi0JIGFkZAklbzAsIDEsICVvMAotCWFuZGNjCSVvMCwgMywgJWcwCi0JYmUJNGYKLQkgb3IJJW80LCAlbG8oSElfTUFHSUMpLCAlbzMKLQlsZHViCVslbzBdLCAlbzUKLQljbXAJJW81LCAwCi0JYmUJMmYKLQkgYWRkCSVvMCwgMSwgJW8wCi0JYW5kY2MJJW8wLCAzLCAlZzAKLQliZQk1ZgotCSBzZXRoaQklaGkoTE9fTUFHSUMpLCAlbzQKLQlsZHViCVslbzBdLCAlbzUKLQljbXAJJW81LCAwCi0JYmUJM2YKLQkgYWRkCSVvMCwgMSwgJW8wCi0JYgk4ZgotCSBvcgklbzQsICVsbyhMT19NQUdJQyksICVvMgotMToKLQlyZXRsCi0JIG1vdgkwLCAlbzAKLTI6Ci0JcmV0bAotCSBtb3YJMSwgJW8wCi0zOgotCXJldGwKLQkgbW92CTIsICVvMAotCi0JLmFsaWduIDQKLQkuZ2xvYmFsIHN0cmxlbgotc3RybGVuOgorCS50ZXh0CitFTlRSWShzdHJsZW4pCiAJbW92CSVvMCwgJW8xCiAJYW5kY2MJJW8wLCAzLCAlZzAKLQlibmUJMGIKKwlCUkFOQ0gzMihiZSwgcHQsIDlmKQogCSBzZXRoaQklaGkoSElfTUFHSUMpLCAlbzQKKwlsZHViCVslbzBdLCAlbzUKKwlCUkFOQ0hfUkVHX1pFUk8ocG4sICVvNSwgMTFmKQorCSBhZGQJJW8wLCAxLCAlbzAKKwlhbmRjYwklbzAsIDMsICVnMAorCUJSQU5DSDMyKGJlLCBwbiwgNGYpCisJIG9yCSVvNCwgJWxvKEhJX01BR0lDKSwgJW8zCisJbGR1YglbJW8wXSwgJW81CisJQlJBTkNIX1JFR19aRVJPKHBuLCAlbzUsIDEyZikKKwkgYWRkCSVvMCwgMSwgJW8wCisJYW5kY2MJJW8wLCAzLCAlZzAKKwlCUkFOQ0gzMihiZSwgcHQsIDVmKQorCSBzZXRoaQklaGkoTE9fTUFHSUMpLCAlbzQKKwlsZHViCVslbzBdLCAlbzUKKwlCUkFOQ0hfUkVHX1pFUk8ocG4sICVvNSwgMTNmKQorCSBhZGQJJW8wLCAxLCAlbzAKKwlCUkFOQ0gzMihiYSwgcHQsIDhmKQorCSBvcgklbzQsICVsbyhMT19NQUdJQyksICVvMgorOToKIAlvcgklbzQsICVsbyhISV9NQUdJQyksICVvMwogNDoKIAlzZXRoaQklaGkoTE9fTUFHSUMpLCAlbzQKQEAgLTU2LDI2ICs0NSwzNiBAQAogMjoKIAlzdWIJJW81LCAlbzIsICVvNAogCWFuZGNjCSVvNCwgJW8zLCAlZzAKLQliZQk4YgorCUJSQU5DSDMyKGJlLCBwdCwgOGIpCiAJIGFkZAklbzAsIDQsICVvMAogCiAJLyogQ2hlY2sgZXZlcnkgYnl0ZS4gKi8KLQlzcmwJJW81LCAyNCwgJWc1Ci0JYW5kY2MJJWc1LCAweGZmLCAlZzAKLQliZQkxZgorCXNybAklbzUsIDI0LCAlZzcKKwlhbmRjYwklZzcsIDB4ZmYsICVnMAorCUJSQU5DSDMyKGJlLCBwbiwgMWYpCiAJIGFkZAklbzAsIC00LCAlbzQKLQlzcmwJJW81LCAxNiwgJWc1Ci0JYW5kY2MJJWc1LCAweGZmLCAlZzAKLQliZQkxZgorCXNybAklbzUsIDE2LCAlZzcKKwlhbmRjYwklZzcsIDB4ZmYsICVnMAorCUJSQU5DSDMyKGJlLCBwbiwgMWYpCiAJIGFkZAklbzQsIDEsICVvNAotCXNybAklbzUsIDgsICVnNQotCWFuZGNjCSVnNSwgMHhmZiwgJWcwCi0JYmUJMWYKKwlzcmwJJW81LCA4LCAlZzcKKwlhbmRjYwklZzcsIDB4ZmYsICVnMAorCUJSQU5DSDMyKGJlLCBwbiwgMWYpCiAJIGFkZAklbzQsIDEsICVvNAogCWFuZGNjCSVvNSwgMHhmZiwgJWcwCi0JYm5lLGEJMmIKKwlCUkFOQ0gzMl9BTk5VTChibmUsIHB0LCAyYikKIAkgbGQJWyVvMF0sICVvNQogCWFkZAklbzQsIDEsICVvNAogMToKIAlyZXRsCiAJIHN1YgklbzQsICVvMSwgJW8wCisxMToKKwlyZXRsCisJIG1vdgkwLCAlbzAKKzEyOgorCXJldGwKKwkgbW92CTEsICVvMAorMTM6CisJcmV0bAorCSBtb3YJMiwgJW8wCitFTkRQUk9DKHN0cmxlbikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL3N0cmxlbl91c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9zdHJsZW5fdXNlcl8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL2xpYi9zdHJsZW5fdXNlci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9zdHJsZW5fdXNlcl8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL3N0cmxlbl91c2VyLlMgYi9hcmNoL3NwYXJjL2xpYi9zdHJsZW5fdXNlcl82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL3N0cmxlbl91c2VyLlMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL3N0cmxlbl91c2VyXzY0LlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL3N0cm5jbXAuUyBiL2FyY2gvc3BhcmMvbGliL3N0cm5jbXBfMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9saWIvc3RybmNtcC5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9zdHJuY21wXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvc3RybmNtcC5TIGIvYXJjaC9zcGFyYy9saWIvc3RybmNtcF82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL3N0cm5jbXAuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvc3RybmNtcF82NC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi9zdHJuY3B5X2Zyb21fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvc3RybmNweV9mcm9tX3VzZXJfMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9saWIvc3RybmNweV9mcm9tX3VzZXIuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9saWIvc3RybmNweV9mcm9tX3VzZXJfMzIuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9zdHJuY3B5X2Zyb21fdXNlci5TIGIvYXJjaC9zcGFyYy9saWIvc3RybmNweV9mcm9tX3VzZXJfNjQuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi9zdHJuY3B5X2Zyb21fdXNlci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi9zdHJuY3B5X2Zyb21fdXNlcl82NC5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL3VzZXJfZml4dXAuYyBiL2FyY2gvc3BhcmMvbGliL3VzZXJfZml4dXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2xpYi91c2VyX2ZpeHVwLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbGliL3VzZXJfZml4dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi94b3IuUyBiL2FyY2gvc3BhcmMvbGliL3hvci5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbGliL3hvci5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL2xpYi94b3IuUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvTWFrZWZpbGUKaW5kZXggODEzNjk4Ny4uYjkwODVlYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tYXRoLWVtdS9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL21hdGgtZW11L01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIEZQVSBpbnN0cnVjdGlvbiBlbXVsYXRpb24uCiAjCiAKLW9iai15ICAgIDo9IG1hdGgubworIyBzdXByZXNzIGFsbCB3YXJuaW5ncyAtIGFzIG1hdGguYyBwcm9kdWNlcyBhIGxvdCEKK2NjZmxhZ3MteSA6PSAtdwogCi1FWFRSQV9BRkxBR1MgOj0gLWFuc2kKLUVYVFJBX0NGTEFHUyA9IC1JLiAtSWluY2x1ZGUvbWF0aC1lbXUgLXcKK29iai15ICAgIDo9IG1hdGhfJChCSVRTKS5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21hdGgtZW11L2FzaGxkaTMuUyBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvYXNobGRpMy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMwZmY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvbWF0aC1lbXUvYXNobGRpMy5TCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIGFzaGxkaTMuUzoJTWF0aC1lbXUgY29kZSBjcmVhdGVzIGFsbCBraW5kcyBvZiByZWZlcmVuY2VzIHRvCi0gKiAgICAgICAgICAgICAgdGhpcyBsaXR0bGUgcm91dGluZSBvbiB0aGUgc3BhcmMgd2l0aCBnY2MuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsoampAdWx0cmEubGludXguY3opCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9jcHJlZml4Lmg+Ci0KLQkuZ2xvYmwgQ19MQUJFTChfX2FzaGxkaTMpCi1DX0xBQkVMKF9fYXNobGRpMyk6Ci0JdHN0CSVvMgotCWJlCTNmCi0JIG1vdgkzMiwgJWcyCi0KLQlzdWIJJWcyLCAlbzIsICVnMgotCi0JdHN0CSVnMgotCWJnCTFmCi0JIHNybAklbzEsICVnMiwgJWczCi0KLQljbHIJJW81Ci0JbmVnCSVnMgotCWJhCTJmCi0JIHNsbAklbzEsICVnMiwgJW80Ci0KLTE6Ci0Jc2xsCSVvMSwgJW8yLCAlbzUKLQlzcmwJJW8wLCAlbzIsICVnMgotCW9yCSVnMiwgJWczLCAlbzQKLTI6Ci0JbW92CSVvNCwgJW8wCi0JbW92CSVvNSwgJW8xCi0zOgotCWptcGwJJW83ICsgOCwgJWcwCi0JIG5vcApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoLmMgYi9hcmNoL3NwYXJjL21hdGgtZW11L21hdGhfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL21hdGgtZW11L21hdGguYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzMyLmMKaW5kZXggODYxM2IzZS4uZTEzZjY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzMyLmMKQEAgLTY5LDcgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzZnAtdXRpbC5oIgorI2luY2x1ZGUgInNmcC11dGlsXzMyLmgiCiAjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgogI2luY2x1ZGUgPG1hdGgtZW11L3NpbmdsZS5oPgogI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21hdGgtZW11L21hdGguYyBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF82NC5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9tYXRoLWVtdS9tYXRoLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbWF0aC1lbXUvbWF0aF82NC5jCmluZGV4IGFkZDA1M2UuLjY4NjNjOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zcGFyYy9tYXRoLWVtdS9tYXRoXzY0LmMKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNmcC11dGlsLmgiCisjaW5jbHVkZSAic2ZwLXV0aWxfNjQuaCIKICNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CiAjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CiAjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21hdGgtZW11L3NmcC11dGlsLmggYi9hcmNoL3NwYXJjL21hdGgtZW11L3NmcC11dGlsXzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvbWF0aC1lbXUvc2ZwLXV0aWwuaApyZW5hbWUgdG8gYXJjaC9zcGFyYy9tYXRoLWVtdS9zZnAtdXRpbF8zMi5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbWF0aC1lbXUvc2ZwLXV0aWwuaCBiL2FyY2gvc3BhcmMvbWF0aC1lbXUvc2ZwLXV0aWxfNjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L21hdGgtZW11L3NmcC11dGlsLmgKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbWF0aC1lbXUvc2ZwLXV0aWxfNjQuaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvbW0vTWFrZWZpbGUKaW5kZXggZWE4ODk1NS4uNjgxYWJlMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL21tL01ha2VmaWxlCkBAIC0xLDE3ICsxLDI1IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXggU3BhcmMtc3BlY2lmaWMgcGFydHMgb2YgdGhlIG1lbW9yeSBtYW5hZ2VyLgogIwogCi1FWFRSQV9BRkxBR1MgOj0gLWFuc2kKK2FzZmxhZ3MteSA6PSAtYW5zaQorY2NmbGFncy15IDo9IC1XZXJyb3IKIAotb2JqLXkJOj0gZmF1bHQubyBpbml0Lm8gbG9hZG1tdS5vIGdlbmVyaWMubyBleHRhYmxlLm8gYnRmaXh1cC5vIFwKLQkgICAgc3JtbXUubyBpb21tdS5vIGlvLXVuaXQubyBoeXBlcnNwYXJjLm8gdmlraW5nLm8gdHN1bmFtaS5vIHN3aWZ0Lm8KK29iai0kKENPTkZJR19TUEFSQzY0KSAgICs9IHVsdHJhLm8gdGxiLm8gdHNiLm8KK29iai15ICAgICAgICAgICAgICAgICAgICs9IGZhdWx0XyQoQklUUykubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gaW5pdF8kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IGxvYWRtbXUubworb2JqLXkgICAgICAgICAgICAgICAgICAgKz0gZ2VuZXJpY18kKEJJVFMpLm8KK29iai0kKENPTkZJR19TUEFSQzMyKSAgICs9IGV4dGFibGUubyBidGZpeHVwLm8gc3JtbXUubyBpb21tdS5vIGlvLXVuaXQubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICAgKz0gaHlwZXJzcGFyYy5vIHZpa2luZy5vIHRzdW5hbWkubyBzd2lmdC5vCiAKLWlmZGVmIENPTkZJR19ISUdITUVNCi1vYmoteQkrPSBoaWdobWVtLm8KLWVuZGlmCisjIE9ubHkgdXNlZCBieSBzcGFyYzY0CitvYmotJChDT05GSUdfSFVHRVRMQl9QQUdFKSArPSBodWdldGxicGFnZS5vCisKKyMgT25seSB1c2VkIGJ5IHNwYXJjMzIKK29iai0kKENPTkZJR19ISUdITUVNKSAgICs9IGhpZ2htZW0ubwogCiBpZmRlZiBDT05GSUdfU01QCi1vYmoteSAgICs9IG5vc3VuNGMubworb2JqLSQoQ09ORklHX1NQQVJDMzIpICs9IG5vc3VuNGMubwogZWxzZQotb2JqLXkgICArPSBzdW40Yy5vCitvYmotJChDT05GSUdfU1BBUkMzMikgKz0gc3VuNGMubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHQuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9tbS9mYXVsdC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbW0vZmF1bHQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2dlbmVyaWMuYyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY18zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL21tL2dlbmVyaWMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9nZW5lcmljLmMgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L21tL2dlbmVyaWMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS9nZW5lcmljXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvbW0vaHVnZXRsYnBhZ2UuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF8zMi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvbW0vaW5pdC5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL21tL2luaXRfMzIuYwppbmRleCA2NzdjMWUxLi5mZWM5MjYwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfMzIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KIAorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdmFjLW9wcy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC00OCw5ICs0OSw2IEBACiAKIHN0cnVjdCBwZ3RhYmxlX2NhY2hlX3N0cnVjdCBwZ3RfcXVpY2tsaXN0czsKIAotLyogUmVmZXJlbmNlcyB0byBzZWN0aW9uIGJvdW5kYXJpZXMgKi8KLWV4dGVybiBjaGFyIF9faW5pdF9iZWdpbiwgX19pbml0X2VuZCwgX3N0YXJ0LCBfZW5kLCBldGV4dCAsIGVkYXRhOwotCiAvKiBJbml0aWFsIHJhbWRpc2sgc2V0dXAgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgc3BhcmNfcmFtZGlza19pbWFnZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3BhcmNfcmFtZGlza19zaXplOwpAQCAtNDUwLDkgKzQ0OCw5IEBACiAJCiAJdG90YWxyYW1fcGFnZXMgKz0gdG90YWxoaWdoX3BhZ2VzOwogCi0JY29kZXBhZ2VzID0gKCgodW5zaWduZWQgbG9uZykgJmV0ZXh0KSAtICgodW5zaWduZWQgbG9uZykmX3N0YXJ0KSk7CisJY29kZXBhZ2VzID0gKCgodW5zaWduZWQgbG9uZykgJl9ldGV4dCkgLSAoKHVuc2lnbmVkIGxvbmcpJl9zdGFydCkpOwogCWNvZGVwYWdlcyA9IFBBR0VfQUxJR04oY29kZXBhZ2VzKSA+PiBQQUdFX1NISUZUOwotCWRhdGFwYWdlcyA9ICgoKHVuc2lnbmVkIGxvbmcpICZlZGF0YSkgLSAoKHVuc2lnbmVkIGxvbmcpJmV0ZXh0KSk7CisJZGF0YXBhZ2VzID0gKCgodW5zaWduZWQgbG9uZykgJl9lZGF0YSkgLSAoKHVuc2lnbmVkIGxvbmcpJl9ldGV4dCkpOwogCWRhdGFwYWdlcyA9IFBBR0VfQUxJR04oZGF0YXBhZ2VzKSA+PiBQQUdFX1NISUZUOwogCWluaXRwYWdlcyA9ICgoKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfZW5kKSAtICgodW5zaWduZWQgbG9uZykgJl9faW5pdF9iZWdpbikpOwogCWluaXRwYWdlcyA9IFBBR0VfQUxJR04oaW5pdHBhZ2VzKSA+PiBQQUdFX1NISUZUOwpAQCAtNDc2LDggKzQ3NCwxMCBAQAogdm9pZCBmcmVlX2luaXRtZW0gKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgZnJlZWQ7CiAKIAlhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfYmVnaW4pOworCWZyZWVkID0gKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKSAtIGFkZHI7CiAJZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpOyBhZGRyICs9IFBBR0VfU0laRSkgewogCQlzdHJ1Y3QgcGFnZSAqcDsKIApAQCAtNDkwLDggKzQ5MCw4IEBACiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJCW51bV9waHlzcGFnZXMrKzsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWRrIGZyZWVkXG4iLAotCQkoJl9faW5pdF9lbmQgLSAmX19pbml0X2JlZ2luKSA+PiAxMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkJZnJlZWQgPj4gMTApOwogfQogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L21tL2luaXQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKaW5kZXggMTg1ZjM0Ni4uNmVhNzNkYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2luaXQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0jaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgImluaXRfNjQuaCIKIAogdW5zaWduZWQgbG9uZyBrZXJuX2xpbmVhcl9wdGVfeG9yWzJdIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTIxNCw3ICsyMTQsNiBAQAogCQkJICAgICAib3IJJSVnMSwgJTAsICUlZzFcblx0IgogCQkJICAgICAiY2FzeAlbJTJdLCAlJWc3LCAlJWcxXG5cdCIKIAkJCSAgICAgImNtcAklJWc3LCAlJWcxXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcblx0IgogCQkJICAgICAiYm5lLHBuCSUleGNjLCAxYlxuXHQiCiAJCQkgICAgICIgbm9wIgogCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KQEAgLTIzNiw3ICsyMzUsNiBAQAogCQkJICAgICAiIGFuZG4JJSVnNywgJTEsICUlZzFcblx0IgogCQkJICAgICAiY2FzeAlbJTJdLCAlJWc3LCAlJWcxXG5cdCIKIAkJCSAgICAgImNtcAklJWc3LCAlJWcxXG5cdCIKLQkJCSAgICAgIm1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcblx0IgogCQkJICAgICAiYm5lLHBuCSUleGNjLCAxYlxuXHQiCiAJCQkgICAgICIgbm9wXG4iCiAJCQkgICAgICIyOiIKQEAgLTk1Niw3ICs5NTQsNyBAQAogCXJldHVybiBuaWQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhZGRfbm9kZV9yYW5nZXModm9pZCkKK3N0YXRpYyB2b2lkIGFkZF9ub2RlX3Jhbmdlcyh2b2lkKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5oIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9tbS9pbml0LmgKcmVuYW1lIHRvIGFyY2gvc3BhcmMvbW0vaW5pdF82NC5oCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYyBiL2FyY2gvc3BhcmMvbW0vaW8tdW5pdC5jCmluZGV4IGRhYWRmNWYuLjAwNWU3NTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW8tdW5pdC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW8tdW5pdC5jCkBAIC0xNTYsOCArMTU2LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW91bml0LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKHN6ICE9IDApIHsKIAkJLS1zejsKLQkJc2ctPmR2bWFfYWRkcmVzcyA9IGlvdW5pdF9nZXRfYXJlYShpb3VuaXQsICh1bnNpZ25lZCBsb25nKSBzZ192aXJ0KHNnKSwgc2ctPmxlbmd0aCk7Ci0JCXNnLT5kdm1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CisJCXNnLT5kbWFfYWRkcmVzcyA9IGlvdW5pdF9nZXRfYXJlYShpb3VuaXQsICh1bnNpZ25lZCBsb25nKSBzZ192aXJ0KHNnKSwgc2ctPmxlbmd0aCk7CisJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKIAkJc2cgPSBzZ19uZXh0KHNnKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW91bml0LT5sb2NrLCBmbGFncyk7CkBAIC0xODYsOCArMTg2LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW91bml0LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKHN6ICE9IDApIHsKIAkJLS1zejsKLQkJbGVuID0gKChzZy0+ZHZtYV9hZGRyZXNzICYgflBBR0VfTUFTSykgKyBzZy0+bGVuZ3RoICsgKFBBR0VfU0laRS0xKSkgPj4gUEFHRV9TSElGVDsKLQkJdmFkZHIgPSAoc2ctPmR2bWFfYWRkcmVzcyAtIElPVU5JVF9ETUFfQkFTRSkgPj4gUEFHRV9TSElGVDsKKwkJbGVuID0gKChzZy0+ZG1hX2FkZHJlc3MgJiB+UEFHRV9NQVNLKSArIHNnLT5sZW5ndGggKyAoUEFHRV9TSVpFLTEpKSA+PiBQQUdFX1NISUZUOworCQl2YWRkciA9IChzZy0+ZG1hX2FkZHJlc3MgLSBJT1VOSVRfRE1BX0JBU0UpID4+IFBBR0VfU0hJRlQ7CiAJCUlPRCgoImlvdW5pdF9yZWxlYXNlICUwOGx4LSUwOGx4XG4iLCAobG9uZyl2YWRkciwgKGxvbmcpbGVuK3ZhZGRyKSk7CiAJCWZvciAobGVuICs9IHZhZGRyOyB2YWRkciA8IGxlbjsgdmFkZHIrKykKIAkJCWNsZWFyX2JpdCh2YWRkciwgaW91bml0LT5ibWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW9tbXUuYyBiL2FyY2gvc3BhcmMvbW0vaW9tbXUuYwppbmRleCBlN2E0OTllLi5iMmU2ZTczIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pb21tdS5jCkBAIC0yNDUsOCArMjQ1LDggQEAKIAl3aGlsZSAoc3ogIT0gMCkgewogCQktLXN6OwogCQluID0gKHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0ICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQ7Ci0JCXNnLT5kdm1hX2FkZHJlc3MgPSBpb21tdV9nZXRfb25lKGRldiwgc2dfcGFnZShzZyksIG4pICsgc2ctPm9mZnNldDsKLQkJc2ctPmR2bWFfbGVuZ3RoID0gKF9fdTMyKSBzZy0+bGVuZ3RoOworCQlzZy0+ZG1hX2FkZHJlc3MgPSBpb21tdV9nZXRfb25lKGRldiwgc2dfcGFnZShzZyksIG4pICsgc2ctPm9mZnNldDsKKwkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOwogCQlzZyA9IHNnX25leHQoc2cpOwogCX0KIH0KQEAgLTI1OSw4ICsyNTksOCBAQAogCXdoaWxlIChzeiAhPSAwKSB7CiAJCS0tc3o7CiAJCW4gPSAoc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKLQkJc2ctPmR2bWFfYWRkcmVzcyA9IGlvbW11X2dldF9vbmUoZGV2LCBzZ19wYWdlKHNnKSwgbikgKyBzZy0+b2Zmc2V0OwotCQlzZy0+ZHZtYV9sZW5ndGggPSAoX191MzIpIHNnLT5sZW5ndGg7CisJCXNnLT5kbWFfYWRkcmVzcyA9IGlvbW11X2dldF9vbmUoZGV2LCBzZ19wYWdlKHNnKSwgbikgKyBzZy0+b2Zmc2V0OworCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogfQpAQCAtMjkwLDggKzI5MCw4IEBACiAJCQl9CiAJCX0KIAotCQlzZy0+ZHZtYV9hZGRyZXNzID0gaW9tbXVfZ2V0X29uZShkZXYsIHNnX3BhZ2Uoc2cpLCBuKSArIHNnLT5vZmZzZXQ7Ci0JCXNnLT5kdm1hX2xlbmd0aCA9IChfX3UzMikgc2ctPmxlbmd0aDsKKwkJc2ctPmRtYV9hZGRyZXNzID0gaW9tbXVfZ2V0X29uZShkZXYsIHNnX3BhZ2Uoc2cpLCBuKSArIHNnLT5vZmZzZXQ7CisJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKIAkJc2cgPSBzZ19uZXh0KHNnKTsKIAl9CiB9CkBAIC0zMzAsOCArMzMwLDggQEAKIAkJLS1zejsKIAogCQluID0gKHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0ICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQ7Ci0JCWlvbW11X3JlbGVhc2Vfb25lKGRldiwgc2ctPmR2bWFfYWRkcmVzcyAmIFBBR0VfTUFTSywgbik7Ci0JCXNnLT5kdm1hX2FkZHJlc3MgPSAweDIxMjEyMTIxOworCQlpb21tdV9yZWxlYXNlX29uZShkZXYsIHNnLT5kbWFfYWRkcmVzcyAmIFBBR0VfTUFTSywgbik7CisJCXNnLT5kbWFfYWRkcmVzcyA9IDB4MjEyMTIxMjE7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCmluZGV4IGRkOGFhMzYuLmZlN2VkMDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYworKysgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKQEAgLTEzMTIsMTAgKzEzMTIsOCBAQAogI2VuZGlmCiAJcG9rZV9zcm1tdSgpOwogCi0jaWZkZWYgQ09ORklHX1NVTl9JTwogCXNybW11X2FsbG9jYXRlX3B0YWJsZV9za2VsZXRvbihzcGFyY19pb21hcC5zdGFydCwgSU9CQVNFX0VORCk7CiAJc3JtbXVfYWxsb2NhdGVfcHRhYmxlX3NrZWxldG9uKERWTUFfVkFERFIsIERWTUFfRU5EKTsKLSNlbmRpZgogCiAJc3JtbXVfYWxsb2NhdGVfcHRhYmxlX3NrZWxldG9uKAogCQlfX2ZpeF90b192aXJ0KF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcyAtIDEpLCBGSVhBRERSX1RPUCk7CkBAIC0xOTE2LDE4ICsxOTE0LDYgQEAKIAltcmVnIHw9IFZJS0lOR19TQkVOQUJMRTsKIAltcmVnICY9IH4oVklLSU5HX0FDRU5BQkxFKTsKIAlzcm1tdV9zZXRfbW11cmVnKG1yZWcpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCS8qIEF2b2lkIHVubmVjZXNzYXJ5IGNyb3NzIGNhbGxzLiAqLwotCUJURklYVVBDT1BZX0NBTEwoZmx1c2hfY2FjaGVfYWxsLCBsb2NhbF9mbHVzaF9jYWNoZV9hbGwpOwotCUJURklYVVBDT1BZX0NBTEwoZmx1c2hfY2FjaGVfbW0sIGxvY2FsX2ZsdXNoX2NhY2hlX21tKTsKLQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX2NhY2hlX3JhbmdlLCBsb2NhbF9mbHVzaF9jYWNoZV9yYW5nZSk7Ci0JQlRGSVhVUENPUFlfQ0FMTChmbHVzaF9jYWNoZV9wYWdlLCBsb2NhbF9mbHVzaF9jYWNoZV9wYWdlKTsKLQlCVEZJWFVQQ09QWV9DQUxMKF9fZmx1c2hfcGFnZV90b19yYW0sIGxvY2FsX2ZsdXNoX3BhZ2VfdG9fcmFtKTsKLQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX3NpZ19pbnNucywgbG9jYWxfZmx1c2hfc2lnX2luc25zKTsKLQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX3BhZ2VfZm9yX2RtYSwgbG9jYWxfZmx1c2hfcGFnZV9mb3JfZG1hKTsKLQlidGZpeHVwKCk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdmlraW5nKHZvaWQpCkBAIC0yMjcyLDYgKzIyNTgsMTcgQEAKIAlCVEZJWFVQU0VUX0NBTEwoX19mbHVzaF9wYWdlX3RvX3JhbSwgc21wX2ZsdXNoX3BhZ2VfdG9fcmFtLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZmx1c2hfc2lnX2luc25zLCBzbXBfZmx1c2hfc2lnX2luc25zLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZmx1c2hfcGFnZV9mb3JfZG1hLCBzbXBfZmx1c2hfcGFnZV9mb3JfZG1hLCBCVEZJWFVQQ0FMTF9OT1JNKTsKKworCWlmIChwb2tlX3NybW11ID09IHBva2VfdmlraW5nKSB7CisJCS8qIEF2b2lkIHVubmVjZXNzYXJ5IGNyb3NzIGNhbGxzLiAqLworCQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX2NhY2hlX2FsbCwgbG9jYWxfZmx1c2hfY2FjaGVfYWxsKTsKKwkJQlRGSVhVUENPUFlfQ0FMTChmbHVzaF9jYWNoZV9tbSwgbG9jYWxfZmx1c2hfY2FjaGVfbW0pOworCQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX2NhY2hlX3JhbmdlLCBsb2NhbF9mbHVzaF9jYWNoZV9yYW5nZSk7CisJCUJURklYVVBDT1BZX0NBTEwoZmx1c2hfY2FjaGVfcGFnZSwgbG9jYWxfZmx1c2hfY2FjaGVfcGFnZSk7CisJCUJURklYVVBDT1BZX0NBTEwoX19mbHVzaF9wYWdlX3RvX3JhbSwgbG9jYWxfZmx1c2hfcGFnZV90b19yYW0pOworCQlCVEZJWFVQQ09QWV9DQUxMKGZsdXNoX3NpZ19pbnNucywgbG9jYWxfZmx1c2hfc2lnX2luc25zKTsKKwkJQlRGSVhVUENPUFlfQ0FMTChmbHVzaF9wYWdlX2Zvcl9kbWEsIGxvY2FsX2ZsdXNoX3BhZ2VfZm9yX2RtYSk7CisJfQogI2VuZGlmCiAKIAlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IGZlNjVhZWUuLjJmZmFjZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTI0MCw5ICsyNDEsNyBAQAogCiAJX3VudXNlZCA9IHN1bjRjX2dldF9jb250ZXh0KCk7CiAJc3VuNGNfc2V0X2NvbnRleHQoX3VudXNlZCk7Ci0jaWZkZWYgQ09ORklHX1NVTl9BVVhJTwogCV91bnVzZWQgPSBnZXRfYXV4aW8oKTsKLSNlbmRpZgogfQogCiAvKiBCb290dXAgdXRpbGl0eSBmdW5jdGlvbnMuICovCkBAIC0xMTI0LDggKzExMjMsOCBAQAogewogCXdoaWxlIChzeiAhPSAwKSB7CiAJCS0tc3o7Ci0JCXNnLT5kdm1hX2FkZHJlc3MgPSAoX191MzIpc3VuNGNfbG9ja2FyZWEoc2dfdmlydChzZyksIHNnLT5sZW5ndGgpOwotCQlzZy0+ZHZtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOworCQlzZy0+ZG1hX2FkZHJlc3MgPSAoX191MzIpc3VuNGNfbG9ja2FyZWEoc2dfdmlydChzZyksIHNnLT5sZW5ndGgpOworCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogfQpAQCAtMTE0MSw3ICsxMTQwLDcgQEAKIHsKIAl3aGlsZSAoc3ogIT0gMCkgewogCQktLXN6OwotCQlzdW40Y191bmxvY2thcmVhKChjaGFyICopc2ctPmR2bWFfYWRkcmVzcywgc2ctPmxlbmd0aCk7CisJCXN1bjRjX3VubG9ja2FyZWEoKGNoYXIgKilzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgpOwogCQlzZyA9IHNnX25leHQoc2cpOwogCX0KIH0KQEAgLTE5NTMsNyArMTk1Miw2IEBACiB9CiAKIGV4dGVybiB2b2lkIHNwYXJjX2NvbnRleHRfaW5pdChpbnQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW5kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYm9vdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcgKnBhZ2VzX2F2YWlsKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxhc3RfdmFsaWRfcGZuOwogCkBAIC0xOTY0LDcgKzE5NjIsNyBAQAogCWV4dGVybiBzdHJ1Y3QgcmVzb3VyY2Ugc3BhcmNfaW9tYXA7CiAJdW5zaWduZWQgbG9uZyBlbmRfcGZuLCBwYWdlc19hdmFpbDsKIAotCWtlcm5lbF9lbmQgPSAodW5zaWduZWQgbG9uZykgJmVuZDsKKwlrZXJuZWxfZW5kID0gKHVuc2lnbmVkIGxvbmcpICZfZW5kOwogCWtlcm5lbF9lbmQgPSBTVU40Q19SRUFMX1BHRElSX0FMSUdOKGtlcm5lbF9lbmQpOwogCiAJcGFnZXNfYXZhaWwgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL3RsYi5jIGIvYXJjaC9zcGFyYy9tbS90bGIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L21tL3RsYi5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL21tL3RsYi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdHNiLmMgYi9hcmNoL3NwYXJjL21tL3RzYi5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9tbS90c2IuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9tbS90c2IuYwppbmRleCA1ODdmOGVmLi4zNmEwODEzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vdHNiLmMKKysrIGIvYXJjaC9zcGFyYy9tbS90c2IuYwpAQCAtNDEsMTAgKzQxLDggQEAKIAkJCQkJICAgICAgS0VSTkVMX1RTQl9ORU5UUklFUyk7CiAJCXN0cnVjdCB0c2IgKmVudCA9ICZzd2FwcGVyX3RzYltoYXNoXTsKIAotCQlpZiAodGFnX2NvbXBhcmUoZW50LT50YWcsIHYpKSB7CisJCWlmICh0YWdfY29tcGFyZShlbnQtPnRhZywgdikpCiAJCQllbnQtPnRhZyA9ICgxVUwgPDwgVFNCX1RBR19JTlZBTElEX0JJVCk7Ci0JCQltZW1iYXJfc3RvcmVsb2FkX3N0b3Jlc3RvcmUoKTsKLQkJfQogCX0KIH0KIApAQCAtMjY3LDYgKzI2NSwxOCBAQAogCX0KIH0KIAoraW50IHN5c2N0bF90c2JfcmF0aW8gPSAtMjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHNiX3NpemVfdG9fcnNzX2xpbWl0KHVuc2lnbmVkIGxvbmcgbmV3X3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBudW1fZW50cyA9IChuZXdfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgdHNiKSk7CisKKwlpZiAoc3lzY3RsX3RzYl9yYXRpbyA8IDApCisJCXJldHVybiBudW1fZW50cyAtIChudW1fZW50cyA+PiAtc3lzY3RsX3RzYl9yYXRpbyk7CisJZWxzZQorCQlyZXR1cm4gbnVtX2VudHMgKyAobnVtX2VudHMgPj4gc3lzY3RsX3RzYl9yYXRpbyk7Cit9CisKIC8qIFdoZW4gdGhlIFJTUyBvZiBhbiBhZGRyZXNzIHNwYWNlIGV4Y2VlZHMgdHNiX3Jzc19saW1pdCBmb3IgYSBUU0IsCiAgKiBkb19zcGFyYzY0X2ZhdWx0KCkgaW52b2tlcyB0aGlzIHJvdXRpbmUgdG8gdHJ5IGFuZCBncm93IGl0LgogICoKQEAgLTI5NywxOSArMzA3LDE0IEBACiAKIAluZXdfY2FjaGVfaW5kZXggPSAwOwogCWZvciAobmV3X3NpemUgPSA4MTkyOyBuZXdfc2l6ZSA8IG1heF90c2Jfc2l6ZTsgbmV3X3NpemUgPDw9IDFVTCkgewotCQl1bnNpZ25lZCBsb25nIG5fZW50cmllcyA9IG5ld19zaXplIC8gc2l6ZW9mKHN0cnVjdCB0c2IpOwotCi0JCW5fZW50cmllcyA9IChuX2VudHJpZXMgKiAzKSAvIDQ7Ci0JCWlmIChuX2VudHJpZXMgPiByc3MpCisJCW5ld19yc3NfbGltaXQgPSB0c2Jfc2l6ZV90b19yc3NfbGltaXQobmV3X3NpemUpOworCQlpZiAobmV3X3Jzc19saW1pdCA+IHJzcykKIAkJCWJyZWFrOwotCiAJCW5ld19jYWNoZV9pbmRleCsrOwogCX0KIAogCWlmIChuZXdfc2l6ZSA9PSBtYXhfdHNiX3NpemUpCiAJCW5ld19yc3NfbGltaXQgPSB+MFVMOwotCWVsc2UKLQkJbmV3X3Jzc19saW1pdCA9ICgobmV3X3NpemUgLyBzaXplb2Yoc3RydWN0IHRzYikpICogMykgLyA0OwogCiByZXRyeV90c2JfYWxsb2M6CiAJZ2ZwX2ZsYWdzID0gR0ZQX0tFUk5FTDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TIGIvYXJjaC9zcGFyYy9tbS91bHRyYS5TCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9tbS91bHRyYS5TCnJlbmFtZSB0byBhcmNoL3NwYXJjL21tL3VsdHJhLlMKaW5kZXggODY3NzNlOC4uODBjNzg4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKKysrIGIvYXJjaC9zcGFyYy9tbS91bHRyYS5TCkBAIC0xMjUsNyArMTI1LDYgQEAKIAkuYWxpZ24JCTMyCiAJLmdsb2JsCQlfX2ZsdXNoX2ljYWNoZV9wYWdlCiBfX2ZsdXNoX2ljYWNoZV9wYWdlOgkvKiAlbzAgPSBwaHlzX3BhZ2UgKi8KLQltZW1iYXIJCSNTdG9yZVN0b3JlCiAJc3JseAkJJW8wLCBQQUdFX1NISUZULCAlbzAKIAlzZXRoaQkJJXVoaShQQUdFX09GRlNFVCksICVnMQogCXNsbHgJCSVvMCwgUEFHRV9TSElGVCwgJW8wCkBAIC00NjcsNyArNDY2LDcgQEAKIAkucHJldmlvdXMKIAogCXJkcHIJCSVwaWwsICVnMgotCXdycHIJCSVnMCwgMTUsICVwaWwKKwl3cnByCQklZzAsIFBJTF9OT1JNQUxfTUFYLCAlcGlsCiAJc2V0aGkJCSVoaSgxMDlmKSwgJWc3CiAJYixwdAkJJXhjYywgZXRyYXBfaXJxCiAxMDk6CSBvcgkJJWc3LCAlbG8oMTA5YiksICVnNwpAQCAtNTA3LDcgKzUwNiw2IEBACiAJc2xseAkJJWcyLCBUUkFQX0JMT0NLX1NaX1NISUZULCAlZzIKIAlhZGQJCSVnNywgJWcyLCAlZzcKIAlsZHgJCVslZzcgKyBUUkFQX1BFUl9DUFVfVEhSRUFEXSwgJWczCi0JbWVtYmFyCQkjU3RvcmVTdG9yZQogCXN0eAkJJWczLCBbJWcxICsgR1JfU05BUF9USFJFQURdCiAJcmV0cnkKIApAQCAtNjkwLDcgKzY4OCw3IEBACiAJLnByZXZpb3VzCiAKIAlyZHByCQklcGlsLCAlZzIKLQl3cnByCQklZzAsIDE1LCAlcGlsCisJd3JwcgkJJWcwLCBQSUxfTk9STUFMX01BWCwgJXBpbAogCXNldGhpCQklaGkoMTA5ZiksICVnNwogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIDEwOToJIG9yCQklZzcsICVsbygxMDliKSwgJWc3CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL29wcm9maWxlL2luaXQuYyBiL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jCmluZGV4IDE3YmI2MDMuLmQ2ZTE3MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jCisrKyBiL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jCkBAIC0xMiwxMiArMTIsMjM5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAgCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdGF0aWMgaW50IG5taV9lbmFibGVkOworCitzdHJ1Y3QgcGNyX29wcyB7CisJdTY0ICgqcmVhZCkodm9pZCk7CisJdm9pZCAoKndyaXRlKSh1NjQpOworfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNyX29wcyAqcGNyX29wczsKKworc3RhdGljIHU2NCBkaXJlY3RfcGNyX3JlYWQodm9pZCkKK3sKKwl1NjQgdmFsOworCisJcmVhZF9wY3IodmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBkaXJlY3RfcGNyX3dyaXRlKHU2NCB2YWwpCit7CisJd3JpdGVfcGNyKHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNyX29wcyBkaXJlY3RfcGNyX29wcyA9IHsKKwkucmVhZAk9IGRpcmVjdF9wY3JfcmVhZCwKKwkud3JpdGUJPSBkaXJlY3RfcGNyX3dyaXRlLAorfTsKKworc3RhdGljIHZvaWQgbjJfcGNyX3dyaXRlKHU2NCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQgPSBzdW40dl9uaWFnYXJhMl9zZXRwZXJmKEhWX04yX1BFUkZfU1BBUkNfQ1RMLCB2YWwpOworCWlmICh2YWwgIT0gSFZfRU9LKQorCQl3cml0ZV9wY3IodmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY3Jfb3BzIG4yX3Bjcl9vcHMgPSB7CisJLnJlYWQJPSBkaXJlY3RfcGNyX3JlYWQsCisJLndyaXRlCT0gbjJfcGNyX3dyaXRlLAorfTsKKworLyogSW4gb3JkZXIgdG8gY29tbW9uaXplIGFzIG11Y2ggb2YgdGhlIGltcGxlbWVudGF0aW9uIGFzCisgKiBwb3NzaWJsZSwgd2UgdXNlIFBJQ0ggYXMgb3VyIGNvdW50ZXIuICBNb3N0bHkgdGhpcyBpcworICogdG8gYWNjb21vZGF0ZSBOaWFnYXJhLTEgd2hpY2ggY2FuIG9ubHkgY291bnQgaW5zbiBjeWNsZXMKKyAqIGluIFBJQ0guCisgKi8KK3N0YXRpYyB1NjQgcGljbF92YWx1ZSh2b2lkKQoreworCXUzMiBkZWx0YSA9IGxvY2FsX2NwdV9kYXRhKCkuY2xvY2tfdGljayAvIEhaOworCisJcmV0dXJuICgodTY0KSgoMCAtIGRlbHRhKSAmIDB4ZmZmZmZmZmYpKSA8PCAzMjsKK30KKworI2RlZmluZSBQQ1JfUElDX1BSSVYJCTB4MDAwMDAwMDEgLyogUElDIGFjY2VzcyBpcyBwcml2aWxlZ2VkICovCisjZGVmaW5lIFBDUl9TVFJBQ0UJCTB4MDAwMDAwMDIgLyogVHJhY2Ugc3VwZXJ2aXNvciBldmVudHMgICovCisjZGVmaW5lIFBDUl9VVFJBQ0UJCTB4MDAwMDAwMDQgLyogVHJhY2UgdXNlciBldmVudHMgICAgICAgICovCisjZGVmaW5lIFBDUl9OMl9IVFJBQ0UJCTB4MDAwMDAwMDggLyogVHJhY2UgaHlwZXJ2aXNvciBldmVudHMgICovCisjZGVmaW5lIFBDUl9OMl9UT0VfT1YwCQkweDAwMDAwMDEwIC8qIFRyYXAgaWYgUElDIDAgb3ZlcmZsb3dzICAqLworI2RlZmluZSBQQ1JfTjJfVE9FX09WMQkJMHgwMDAwMDAyMCAvKiBUcmFwIGlmIFBJQyAxIG92ZXJmbG93cyAgKi8KKyNkZWZpbmUgUENSX04yX01BU0swCQkweDAwMDAzZmMwCisjZGVmaW5lIFBDUl9OMl9NQVNLMF9TSElGVAk2CisjZGVmaW5lIFBDUl9OMl9TTDAJCTB4MDAwM2MwMDAKKyNkZWZpbmUgUENSX04yX1NMMF9TSElGVAkxNAorI2RlZmluZSBQQ1JfTjJfT1YwCQkweDAwMDQwMDAwCisjZGVmaW5lIFBDUl9OMl9NQVNLMQkJMHgwN2Y4MDAwMAorI2RlZmluZSBQQ1JfTjJfTUFTSzFfU0hJRlQJMTkKKyNkZWZpbmUgUENSX04yX1NMMQkJMHg3ODAwMDAwMAorI2RlZmluZSBQQ1JfTjJfU0wxX1NISUZUCTI3CisjZGVmaW5lIFBDUl9OMl9PVjEJCTB4ODAwMDAwMDAKKworI2RlZmluZSBQQ1JfU1VONFVfRU5BQkxFCShQQ1JfUElDX1BSSVYgfCBQQ1JfU1RSQUNFIHwgUENSX1VUUkFDRSkKKyNkZWZpbmUgUENSX04yX0VOQUJMRQkJKFBDUl9QSUNfUFJJViB8IFBDUl9TVFJBQ0UgfCBQQ1JfVVRSQUNFIHwgXAorCQkJCSBQQ1JfTjJfVE9FX09WMSB8IFwKKwkJCQkgKDIgPDwgUENSX04yX1NMMV9TSElGVCkgfCBcCisJCQkJICgweGZmIDw8IFBDUl9OMl9NQVNLMV9TSElGVCkpCisKK3N0YXRpYyB1NjQgcGNyX2VuYWJsZSA9IFBDUl9TVU40VV9FTkFCTEU7CisKK3N0YXRpYyB2b2lkIG5taV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXBjcl9vcHMtPndyaXRlKFBDUl9QSUNfUFJJVik7CisKKwlpZiAobm1pX2VuYWJsZWQpIHsKKwkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCAwKTsKKworCQl3cml0ZV9waWMocGljbF92YWx1ZSgpKTsKKwkJcGNyX29wcy0+d3JpdGUocGNyX2VuYWJsZSk7CisJfQorfQorCisvKiBXZSBjb3VudCAiY2xvY2sgY3ljbGUiIGV2ZW50cyBpbiB0aGUgbG93ZXIgMzItYml0IFBJQy4KKyAqIFRoZW4gY29uZmlndXJlIGl0IHN1Y2ggdGhhdCBpdCBvdmVyZmxvd3MgZXZlcnkgSFosIGFuZCB0aHVzCisgKiBnZW5lcmF0ZXMgYSBsZXZlbCAxNSBpbnRlcnJ1cHQgYXQgdGhhdCBmcmVxdWVuY3kuCisgKi8KK3N0YXRpYyB2b2lkIGNwdV9ubWlfc3RhcnQodm9pZCAqX3VudXNlZCkKK3sKKwlwY3Jfb3BzLT53cml0ZShQQ1JfUElDX1BSSVYpOworCXdyaXRlX3BpYyhwaWNsX3ZhbHVlKCkpOworCisJcGNyX29wcy0+d3JpdGUocGNyX2VuYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9ubWlfc3RvcCh2b2lkICpfdW51c2VkKQoreworCXBjcl9vcHMtPndyaXRlKFBDUl9QSUNfUFJJVik7Cit9CisKK3N0YXRpYyBpbnQgbm1pX3N0YXJ0KHZvaWQpCit7CisJaW50IGVyciA9IHJlZ2lzdGVyX3BlcmZjdHJfaW50cihubWlfaGFuZGxlcik7CisKKwlpZiAoIWVycikgeworCQlubWlfZW5hYmxlZCA9IDE7CisJCXdtYigpOworCQllcnIgPSBvbl9lYWNoX2NwdShjcHVfbm1pX3N0YXJ0LCBOVUxMLCAxKTsKKwkJaWYgKGVycikgeworCQkJbm1pX2VuYWJsZWQgPSAwOworCQkJd21iKCk7CisJCQlvbl9lYWNoX2NwdShjcHVfbm1pX3N0b3AsIE5VTEwsIDEpOworCQkJcmVsZWFzZV9wZXJmY3RyX2ludHIobm1pX2hhbmRsZXIpOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbm1pX3N0b3Aodm9pZCkKK3sKKwlubWlfZW5hYmxlZCA9IDA7CisJd21iKCk7CisKKwlvbl9lYWNoX2NwdShjcHVfbm1pX3N0b3AsIE5VTEwsIDEpOworCXJlbGVhc2VfcGVyZmN0cl9pbnRyKG5taV9oYW5kbGVyKTsKKwlzeW5jaHJvbml6ZV9zY2hlZCgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2hzdmNfZ3JvdXA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2hzdmNfbWFqb3I7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJmX2hzdmNfbWlub3I7CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3BlcmZfaHN2Yyh2b2lkKQoreworCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CisJCXN3aXRjaCAoc3VuNHZfY2hpcF90eXBlKSB7CisJCWNhc2UgU1VONFZfQ0hJUF9OSUFHQVJBMToKKwkJCXBlcmZfaHN2Y19ncm91cCA9IEhWX0dSUF9OSUFHX1BFUkY7CisJCQlicmVhazsKKworCQljYXNlIFNVTjRWX0NISVBfTklBR0FSQTI6CisJCQlwZXJmX2hzdmNfZ3JvdXAgPSBIVl9HUlBfTjJfQ1BVOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKworCQlwZXJmX2hzdmNfbWFqb3IgPSAxOworCQlwZXJmX2hzdmNfbWlub3IgPSAwOworCQlpZiAoc3VuNHZfaHZhcGlfcmVnaXN0ZXIocGVyZl9oc3ZjX2dyb3VwLAorCQkJCQkgcGVyZl9oc3ZjX21ham9yLAorCQkJCQkgJnBlcmZfaHN2Y19taW5vcikpIHsKKwkJCXByaW50aygicGVyZm1vbjogQ291bGQgbm90IHJlZ2lzdGVyIE4yIGh2YXBpLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9wZXJmX2hzdmModm9pZCkKK3sKKwlpZiAodGxiX3R5cGUgIT0gaHlwZXJ2aXNvcikKKwkJcmV0dXJuOworCXN1bjR2X2h2YXBpX3VucmVnaXN0ZXIocGVyZl9oc3ZjX2dyb3VwKTsKK30KKworc3RhdGljIGludCBvcHJvZmlsZV9ubWlfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9wZXJmX2hzdmMoKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKHRsYl90eXBlKSB7CisJY2FzZSBoeXBlcnZpc29yOgorCQlwY3Jfb3BzID0gJm4yX3Bjcl9vcHM7CisJCXBjcl9lbmFibGUgPSBQQ1JfTjJfRU5BQkxFOworCQlicmVhazsKKworCWNhc2UgY2hlZXRhaDoKKwljYXNlIGNoZWV0YWhfcGx1czoKKwkJcGNyX29wcyA9ICZkaXJlY3RfcGNyX29wczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlvcHMtPmNyZWF0ZV9maWxlcyA9IE5VTEw7CisJb3BzLT5zZXR1cCA9IE5VTEw7CisJb3BzLT5zaHV0ZG93biA9IE5VTEw7CisJb3BzLT5zdGFydCA9IG5taV9zdGFydDsKKwlvcHMtPnN0b3AgPSBubWlfc3RvcDsKKwlvcHMtPmNwdV90eXBlID0gInRpbWVyIjsKKworCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiBVc2luZyBwZXJmY3RyIGJhc2VkIE5NSSB0aW1lciBpbnRlcnJ1cHQuXG4iKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKIGludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCiB7Ci0JcmV0dXJuIC1FTk9ERVY7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCXJldCA9IG9wcm9maWxlX25taV9pbml0KG9wcyk7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisjZW5kaWYKKworCXJldHVybiByZXQ7CiB9CiAKIAogdm9pZCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorCXVucmVnaXN0ZXJfcGVyZl9oc3ZjKCk7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvcHJvbS9NYWtlZmlsZQppbmRleCA4ZjdlMTg1Li4xYjhjMDczIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9wcm9tL01ha2VmaWxlCkBAIC0xLDYgKzEsMjEgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBTdW4gQm9vdCBQUk9NIGludGVyZmFjZSBsaWJyYXJ5IHVuZGVyCiAjIExpbnV4LgogIworYXNmbGFncyA6PSAtYW5zaQorY2NmbGFncyA6PSAtV2Vycm9yCiAKLWxpYi15IDo9IGJvb3RzdHIubyBkZXZtYXAubyBkZXZvcHMubyBpbml0Lm8gbWVtb3J5Lm8gbWlzYy5vIG1wLm8gXAotCSBwYWxsb2MubyByYW5nZXMubyBzZWdtZW50Lm8gY29uc29sZS5vIHByaW50Zi5vIHRyZWUubworbGliLXkgICAgICAgICAgICAgICAgIDo9IGJvb3RzdHJfJChCSVRTKS5vCitsaWItJChDT05GSUdfU1BBUkMzMikgKz0gZGV2bWFwLm8KK2xpYi15ICAgICAgICAgICAgICAgICArPSBkZXZvcHNfJChCSVRTKS5vCitsaWIteSAgICAgICAgICAgICAgICAgKz0gaW5pdF8kKEJJVFMpLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBtZW1vcnkubworbGliLXkgICAgICAgICAgICAgICAgICs9IG1pc2NfJChCSVRTKS5vCitsaWItJChDT05GSUdfU1BBUkMzMikgKz0gbXAubworbGliLSQoQ09ORklHX1NQQVJDMzIpICs9IHBhbGxvYy5vCitsaWItJChDT05GSUdfU1BBUkMzMikgKz0gcmFuZ2VzLm8KK2xpYi0kKENPTkZJR19TUEFSQzMyKSArPSBzZWdtZW50Lm8KK2xpYi15ICAgICAgICAgICAgICAgICArPSBjb25zb2xlXyQoQklUUykubworbGliLXkgICAgICAgICAgICAgICAgICs9IHByaW50Zi5vCitsaWIteSAgICAgICAgICAgICAgICAgKz0gdHJlZV8kKEJJVFMpLm8KK2xpYi0kKENPTkZJR19TUEFSQzY0KSArPSBwMTI3NS5vCitsaWItJChDT05GSUdfU1BBUkM2NCkgKz0gY2lmLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9ib290c3RyLmMgYi9hcmNoL3NwYXJjL3Byb20vYm9vdHN0cl8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjL3Byb20vYm9vdHN0ci5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL3Byb20vYm9vdHN0cl8zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9ib290c3RyLmMgYi9hcmNoL3NwYXJjL3Byb20vYm9vdHN0cl82NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvcHJvbS9ib290c3RyLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvcHJvbS9ib290c3RyXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL2NpZi5TIGIvYXJjaC9zcGFyYy9wcm9tL2NpZi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvcHJvbS9jaWYuUwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL2NpZi5TCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vY29uc29sZS5jIGIvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGUuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vY29uc29sZS5jIGIvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGVfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L3Byb20vY29uc29sZS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL3Byb20vY29uc29sZV82NC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vZGV2b3BzLmMgYi9hcmNoL3NwYXJjL3Byb20vZGV2b3BzXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvcHJvbS9kZXZvcHMuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL2Rldm9wc18zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9kZXZvcHMuYyBiL2FyY2gvc3BhcmMvcHJvbS9kZXZvcHNfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L3Byb20vZGV2b3BzLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvcHJvbS9kZXZvcHNfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2luaXQuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvcHJvbS9pbml0LmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL2luaXQuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9wcm9tL2luaXQuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL2luaXRfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL21pc2MuYyBiL2FyY2gvc3BhcmMvcHJvbS9taXNjXzMyLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYy9wcm9tL21pc2MuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL21pc2NfMzIuYwppbmRleCA0OWI1MDU3Li5jZjZjM2Y2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vbWlzYy5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9taXNjXzMyLmMKQEAgLTYxLDkgKzYxLDcgQEAKIAlyZXN0b3JlX2N1cnJlbnQoKTsKIAlpbnN0YWxsX2xpbnV4X3RpY2tlcigpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwotI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIAlzZXRfYXV4aW8oQVVYSU9fTEVELCAwKTsKLSNlbmRpZgogfQogCiAvKiBEcm9wIGludG8gdGhlIHByb20sIGJ1dCBjb21wbGV0ZWx5IHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYyBiL2FyY2gvc3BhcmMvcHJvbS9taXNjXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmM2NC9wcm9tL21pc2MuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYy9wcm9tL21pc2NfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYyBiL2FyY2gvc3BhcmMvcHJvbS9wMTI3NS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL3Byb20vcDEyNzUuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL3ByaW50Zi5jIGIvYXJjaC9zcGFyYy9wcm9tL3ByaW50Zi5jCmluZGV4IGEzNmFiOWMuLjY2MDk0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9wcmludGYuYworKysgYi9hcmNoL3NwYXJjL3Byb20vcHJpbnRmLmMKQEAgLTIsNiArMiw3IEBACiAgKiBwcmludGYuYzogIEludGVybmFsIHByb20gbGlicmFyeSBwcmludGYgZmFjaWxpdHkuCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NyBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICogQ29weXJpZ2h0IChjKSAyMDAyIFBldGUgWmFpdGNldiAoemFpdGNldkB5YWhvby5jb20pCiAgKgogICogV2UgdXNlZCB0byB3YXJuIGFsbCBvdmVyIHRoZSBjb2RlOiBETyBOT1QgVVNFIHByb21fcHJpbnRmKCksCkBAIC0xMyw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CkBAIC0zNCw3ICszNCw3IEBACiB9CiAKIHZvaWQKLXByb21fcHJpbnRmKGNoYXIgKmZtdCwgLi4uKQorcHJvbV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCWludCBpOwpAQCAtNDUsNCArNDUsMyBAQAogCiAJcHJvbV93cml0ZShwcGJ1ZiwgaSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHByb21fcHJpbnRmKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS90cmVlLmMgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGFyY2gvc3BhcmMvcHJvbS90cmVlLmMKcmVuYW1lIHRvIGFyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMKaW5kZXggZjIyOGZlMC4uNmQ4MTg3MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3RyZWUuYworKysgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCkBAIC04NSw3ICs4NSw3IEBACiAvKiBSZXR1cm4gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiBwcm9wZXJ0eSAncHJvcCcgYXQgbm9kZSAnbm9kZScuCiAgKiBSZXR1cm4gLTEgb24gZXJyb3IuCiAgKi8KLWludCBwcm9tX2dldHByb3BsZW4oaW50IG5vZGUsIGNoYXIgKnByb3ApCitpbnQgcHJvbV9nZXRwcm9wbGVuKGludCBub2RlLCBjb25zdCBjaGFyICpwcm9wKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogJ2J1ZmZlcicgd2hpY2ggaGFzIGEgc2l6ZSBvZiAnYnVmc2l6ZScuICBJZiB0aGUgYWNxdWlzaXRpb24KICAqIHdhcyBzdWNjZXNzZnVsIHRoZSBsZW5ndGggd2lsbCBiZSByZXR1cm5lZCwgZWxzZSAtMSBpcyByZXR1cm5lZC4KICAqLwotaW50IHByb21fZ2V0cHJvcGVydHkoaW50IG5vZGUsIGNoYXIgKnByb3AsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpCitpbnQgcHJvbV9nZXRwcm9wZXJ0eShpbnQgbm9kZSwgY29uc3QgY2hhciAqcHJvcCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmc2l6ZSkKIHsKIAlpbnQgcGxlbiwgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMDMsNyArMzAzLDcgQEAKIC8qIFNldCBwcm9wZXJ0eSAncG5hbWUnIGF0IG5vZGUgJ25vZGUnIHRvIHZhbHVlICd2YWx1ZScgd2hpY2ggaGFzIGEgbGVuZ3RoCiAgKiBvZiAnc2l6ZScgYnl0ZXMuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJvbSBhY2NlcHRlZC4KICAqLwotaW50IHByb21fc2V0cHJvcChpbnQgbm9kZSwgY2hhciAqcG5hbWUsIGNoYXIgKnZhbHVlLCBpbnQgc2l6ZSkKK2ludCBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnBuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfNjQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCnJlbmFtZSB0byBhcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk2ZTcwLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLSMgc3BhcmM2NCBjb25maWd1cmF0aW9uCi1tYWlubWVudSAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24gZm9yIDY0LWJpdCBTUEFSQyIKLQotY29uZmlnIFNQQVJDCi0JYm9vbAotCWRlZmF1bHQgeQotCXNlbGVjdCBIQVZFX09QUk9GSUxFCi0Jc2VsZWN0IEhBVkVfS1BST0JFUwotCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKLQotY29uZmlnIFNQQVJDNjQKLQlib29sCi0JZGVmYXVsdCB5Ci0Jc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCi0Jc2VsZWN0IEhBVkVfSURFCi0Jc2VsZWN0IEhBVkVfTE1CCi0Jc2VsZWN0IEhBVkVfQVJDSF9LR0RCCi0Jc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAotCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCi0Jc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0Jc2VsZWN0IFJUQ19DTEFTUwotCXNlbGVjdCBSVENfRFJWX000OFQ1OQotCXNlbGVjdCBSVENfRFJWX0NNT1MKLQlzZWxlY3QgUlRDX0RSVl9CUTQ4MDIKLQlzZWxlY3QgUlRDX0RSVl9TVU40VgotCXNlbGVjdCBSVENfRFJWX1NUQVJGSVJFCi0KLWNvbmZpZyBHRU5FUklDX1RJTUUKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBHRU5FUklDX0NNT1NfVVBEQVRFCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUwotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIEdFTkVSSUNfR1BJTwotCWJvb2wKLQloZWxwCi0JICBHZW5lcmljIEdQSU8gQVBJIHN1cHBvcnQKLQotY29uZmlnIDY0QklUCi0JZGVmX2Jvb2wgeQotCi1jb25maWcgTU1VCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgSU9NTVVfSEVMUEVSCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgUVVJQ0tMSVNUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgTE9DS0RFUF9TVVBQT1JUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBVURJVF9BUkNICi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyBBUkNIX05PX1ZJUlRfVE9fQlVTCi0JZGVmX2Jvb2wgeQotCi1jb25maWcgT0YKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKLQlib29sCi0JZGVmX2Jvb2wgeQotCi1zb3VyY2UgImluaXQvS2NvbmZpZyIKLXNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKLQotbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgotCi1jaG9pY2UKLQlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiCi0JZGVmYXVsdCBTUEFSQzY0X1BBR0VfU0laRV84S0IKLQotY29uZmlnIFNQQVJDNjRfUEFHRV9TSVpFXzhLQgotCWJvb2wgIjhLQiIKLQloZWxwCi0JICBUaGlzIGxldHMgeW91IHNlbGVjdCB0aGUgcGFnZSBzaXplIG9mIHRoZSBrZXJuZWwuCi0KLQkgIDhLQiBhbmQgNjRLQiB3b3JrIHF1aXRlIHdlbGwsIHNpbmNlIFNQQVJDIEVMRiBzZWN0aW9ucwotCSAgcHJvdmlkZSBmb3IgdXAgdG8gNjRLQiBhbGlnbm1lbnQuCi0KLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIGNob29zZSA4S0IuCi0KLWNvbmZpZyBTUEFSQzY0X1BBR0VfU0laRV82NEtCCi0JYm9vbCAiNjRLQiIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBTRUNDT01QCi0JYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgotCWRlcGVuZHMgb24gUFJPQ19GUwotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMga2VybmVsIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBudW1iZXIgY3J1bmNoaW5nIGFwcGxpY2F0aW9ucwotCSAgdGhhdCBtYXkgbmVlZCB0byBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSBkdXJpbmcgdGhlaXIKLQkgIGV4ZWN1dGlvbi4gQnkgdXNpbmcgcGlwZXMgb3Igb3RoZXIgdHJhbnNwb3J0cyBtYWRlIGF2YWlsYWJsZSB0bwotCSAgdGhlIHByb2Nlc3MgYXMgZmlsZSBkZXNjcmlwdG9ycyBzdXBwb3J0aW5nIHRoZSByZWFkL3dyaXRlCi0JICBzeXNjYWxscywgaXQncyBwb3NzaWJsZSB0byBpc29sYXRlIHRob3NlIGFwcGxpY2F0aW9ucyBpbgotCSAgdGhlaXIgb3duIGFkZHJlc3Mgc3BhY2UgdXNpbmcgc2VjY29tcC4gT25jZSBzZWNjb21wIGlzCi0JICBlbmFibGVkIHZpYSAvcHJvYy88cGlkPi9zZWNjb21wLCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQKLQkgIGFuZCB0aGUgdGFzayBpcyBvbmx5IGFsbG93ZWQgdG8gZXhlY3V0ZSBhIGZldyBzYWZlIHN5c2NhbGxzCi0JICBkZWZpbmVkIGJ5IGVhY2ggc2VjY29tcCBtb2RlLgotCi0JICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgotCi1zb3VyY2Uga2VybmVsL0tjb25maWcuaHoKLQotY29uZmlnIEhPVFBMVUdfQ1BVCi0JYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIgotCWRlcGVuZHMgb24gU01QCi0Jc2VsZWN0IEhPVFBMVUcKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGV4cGVyaW1lbnQgd2l0aCB0dXJuaW5nIENQVXMgb2ZmIGFuZCBvbi4gIENQVXMKLQkgIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Iy4KLQkgIFNheSBOIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgQ1BVIGhvdHBsdWcuCi0KLWNvbmZpZyBHRU5FUklDX0hBUkRJUlFTCi0JYm9vbAotCWRlZmF1bHQgeQotCi1zb3VyY2UgImtlcm5lbC90aW1lL0tjb25maWciCi0KLWNvbmZpZyBTTVAKLQlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCi0JICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgc2F5IE4uIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggbW9yZSB0aGFuCi0JICBvbmUgQ1BVLCBzYXkgWS4KLQotCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlIGFuZCBtdWx0aXByb2Nlc3NvcgotCSAgbWFjaGluZXMsIGJ1dCB3aWxsIHVzZSBvbmx5IG9uZSBDUFUgb2YgYSBtdWx0aXByb2Nlc3NvciBtYWNoaW5lLiBJZgotCSAgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlLXByb2Nlc3NvciBtYWNoaW5lcy4KLQkgIE9uIGEgc2luZ2xlLXByb2Nlc3NvciBtYWNoaW5lLCB0aGUga2VybmVsIHdpbGwgcnVuIGZhc3RlciBpZiB5b3Ugc2F5Ci0JICBOIGhlcmUuCi0KLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCi0KLWNvbmZpZyBOUl9DUFVTCi0JaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzICgyLTEwMjQpIgotCXJhbmdlIDIgMTAyNAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCAiNjQiCi0KLXNvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCi0KLWNvbmZpZyBVUzNfRlJFUQotCXRyaXN0YXRlICJVbHRyYVNQQVJDLUlJSSBDUFUgRnJlcXVlbmN5IGRyaXZlciIKLQlkZXBlbmRzIG9uIENQVV9GUkVRCi0Jc2VsZWN0IENQVV9GUkVRX1RBQkxFCi0JaGVscAotCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgVWx0cmFTUEFSQy1JSUkgcHJvY2Vzc29ycy4KLQotCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXE+LgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4uCi0KLWNvbmZpZyBVUzJFX0ZSRVEKLQl0cmlzdGF0ZSAiVWx0cmFTUEFSQy1JSWUgQ1BVIEZyZXF1ZW5jeSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBDUFVfRlJFUQotCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQotCWhlbHAKLQkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFVsdHJhU1BBUkMtSUllIHByb2Nlc3NvcnMuCi0KLQkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxPi4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBOLgotCi1jb25maWcgVVMzX01DCi0JdHJpc3RhdGUgIlVsdHJhU1BBUkMtSUlJIE1lbW9yeSBDb250cm9sbGVyIGRyaXZlciIKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGFkZHMgYSBkcml2ZXIgZm9yIHRoZSBVbHRyYVNQQVJDLUlJSSBtZW1vcnkgY29udHJvbGxlci4KLQkgIExvYWRpbmcgdGhpcyBkcml2ZXIgYWxsb3dzIGV4YWN0IG1uZW1vbmljIHN0cmluZ3MgdG8gYmUKLQkgIHByaW50ZWQgaW4gdGhlIGV2ZW50IG9mIGEgbWVtb3J5IGVycm9yLCBzbyB0aGF0IHRoZSBmYXVsdHkgRElNTQotCSAgb24gdGhlIG1vdGhlcmJvYXJkIGNhbiBiZSBtYXRjaGVkIHRvIHRoZSBlcnJvci4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZLCBhcyB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZSB2ZXJ5IHVzZWZ1bC4KLQotIyBHbG9iYWwgdGhpbmdzIGFjcm9zcyBhbGwgU3VuIG1hY2hpbmVzLgotY29uZmlnIEdFTkVSSUNfTE9DS0JSRUFLCi0JYm9vbAotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gU01QICYmIFBSRUVNUFQKLQotY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKLQlib29sCi0KLWNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIEdFTkVSSUNfRklORF9ORVhUX0JJVAotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIEdFTkVSSUNfSFdFSUdIVAotCWJvb2wKLQlkZWZhdWx0IHkgaWYgIVVMVFJBX0hBU19QT1BVTEFUSU9OX0NPVU5UCi0KLWNvbmZpZyBHRU5FUklDX0NBTElCUkFURV9ERUxBWQotCWJvb2wKLQlkZWZhdWx0IHkKLQotY2hvaWNlCi0JcHJvbXB0ICJTUEFSQzY0IEh1Z2UgVExCIFBhZ2UgU2l6ZSIKLQlkZXBlbmRzIG9uIEhVR0VUTEJfUEFHRQotCWRlZmF1bHQgSFVHRVRMQl9QQUdFX1NJWkVfNE1CCi0KLWNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV80TUIKLQlib29sICI0TUIiCi0KLWNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV81MTJLCi0JYm9vbCAiNTEySyIKLQotY29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0SwotCWRlcGVuZHMgb24gIVNQQVJDNjRfUEFHRV9TSVpFXzY0S0IKLQlib29sICI2NEsiCi0KLWVuZGNob2ljZQotCi1lbmRtZW51Ci0KLWNvbmZpZyBOVU1BCi0JYm9vbCAiTlVNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU01QCi0KLWNvbmZpZyBOT0RFU19TSElGVAotCWludAotCWRlZmF1bHQgIjQiCi0JZGVwZW5kcyBvbiBORUVEX01VTFRJUExFX05PREVTCi0KLSMgU29tZSBOVU1BIG5vZGVzIGhhdmUgbWVtb3J5IHJhbmdlcyB0aGF0IHNwYW4KLSMgb3RoZXIgbm9kZXMuICBFdmVuIHRob3VnaCBhIHBmbiBpcyB2YWxpZCBhbmQKLSMgYmV0d2VlbiBhIG5vZGUncyBzdGFydCBhbmQgZW5kIHBmbnMsIGl0IG1heSBub3QKLSMgcmVzaWRlIG9uIHRoYXQgbm9kZS4gIFNlZSBtZW1tYXBfaW5pdF96b25lKCkKLSMgZm9yIGRldGFpbHMuCi1jb25maWcgTk9ERVNfU1BBTl9PVEhFUl9OT0RFUwotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKLQotY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCi0JZGVmX2Jvb2wgeQotCi1jb25maWcgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCi0JZGVmX2Jvb2wgeQotCi1jb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCi0JZGVmX2Jvb2wgeQotCXNlbGVjdCBTUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUKLQotY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKLQlkZWZfYm9vbCB5Ci0KLXNvdXJjZSAibW0vS2NvbmZpZyIKLQotY29uZmlnIElTQQotCWJvb2wKLQotY29uZmlnIElTQVBOUAotCWJvb2wKLQotY29uZmlnIEVJU0EKLQlib29sCi0KLWNvbmZpZyBNQ0EKLQlib29sCi0KLWNvbmZpZyBQQ01DSUEKLQl0cmlzdGF0ZQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYXR0YWNoIFBDTUNJQS0gb3IgUEMtY2FyZHMgdG8geW91ciBMaW51eAotCSAgY29tcHV0ZXIuICBUaGVzZSBhcmUgY3JlZGl0LWNhcmQgc2l6ZSBkZXZpY2VzIHN1Y2ggYXMgbmV0d29yayBjYXJkcywKLQkgIG1vZGVtcyBvciBoYXJkIGRyaXZlcyBvZnRlbiB1c2VkIHdpdGggbGFwdG9wcyBjb21wdXRlcnMuICBUaGVyZSBhcmUKLQkgIGFjdHVhbGx5IHR3byB2YXJpZXRpZXMgb2YgdGhlc2UgY2FyZHM6IHRoZSBvbGRlciAxNiBiaXQgUENNQ0lBIGNhcmRzCi0JICBhbmQgdGhlIG5ld2VyIDMyIGJpdCBDYXJkQnVzIGNhcmRzLiAgSWYgeW91IHdhbnQgdG8gdXNlIENhcmRCdXMKLQkgIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvICJDYXJkQnVzIHN1cHBvcnQiIGJlbG93LgotCi0JICBUbyB1c2UgeW91ciBQQy1jYXJkcywgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20gRGF2aWQKLQkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KLQkgIGZvciBsb2NhdGlvbikuICBQbGVhc2UgYWxzbyByZWFkIHRoZSBQQ01DSUEtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBwY21jaWFfY29yZSBhbmQgZHMuCi0KLWNvbmZpZyBTQlVTCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgU0JVU0NIQVIKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBTVU5fQVVYSU8KLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBTVU5fSU8KLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBTVU5fTERPTVMKLQlib29sICJTdW4gTG9naWNhbCBEb21haW5zIHN1cHBvcnQiCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpcyB5b3Ugd2FudCB0byBzdXBwb3J0IHZpcnR1YWwgZGV2aWNlcyB2aWEKLQkgIExvZ2ljYWwgRG9tYWlucy4KLQotY29uZmlnIFBDSQotCWJvb2wgIlBDSSBzdXBwb3J0IgotCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TSQotCWhlbHAKLQkgIEZpbmQgb3V0IHdoZXRoZXIgeW91ciBzeXN0ZW0gaW5jbHVkZXMgYSBQQ0kgYnVzLiBQQ0kgaXMgdGhlIG5hbWUgb2YKLQkgIGEgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmIGluc2lkZQotCSAgeW91ciBib3guICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIGluY2x1ZGUgZHJpdmVycyBhbmQKLQkgIGluZnJhc3RydWN0dXJlIGNvZGUgdG8gc3VwcG9ydCBQQ0kgYnVzIGRldmljZXMuCi0KLWNvbmZpZyBQQ0lfRE9NQUlOUwotCWRlZl9ib29sIFBDSQotCi1jb25maWcgUENJX1NZU0NBTEwKLQlkZWZfYm9vbCBQQ0kKLQotc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgotCi1jb25maWcgU1VOX09QRU5QUk9NRlMKLQl0cmlzdGF0ZSAiT3BlbnByb20gdHJlZSBhcHBlYXJzIGluIC9wcm9jL29wZW5wcm9tIgotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSwgdGhlIE9wZW5QUk9NIGRldmljZSB0cmVlIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGEKLQkgIHZpcnR1YWwgZmlsZSBzeXN0ZW0sIHdoaWNoIHlvdSBjYW4gbW91bnQgdG8gL3Byb2Mvb3BlbnByb20gYnkgIm1vdW50Ci0JICAtdCBvcGVucHJvbWZzIG5vbmUgL3Byb2Mvb3BlbnByb20iLgotCi0JICBUbyBjb21waWxlIHRoZSAvcHJvYy9vcGVucHJvbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvcGVucHJvbWZzLiAgSWYgdW5zdXJlLCBjaG9vc2UgTS4KLQotbWVudSAiRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMiCi0KLXNvdXJjZSAiZnMvS2NvbmZpZy5iaW5mbXQiCi0KLWNvbmZpZyBDT01QQVQKLQlib29sCi0JZGVmYXVsdCB5Ci0Jc2VsZWN0IENPTVBBVF9CSU5GTVRfRUxGCi0KLWNvbmZpZyBTWVNWSVBDX0NPTVBBVAotCWJvb2wKLQlkZXBlbmRzIG9uIENPTVBBVCAmJiBTWVNWSVBDCi0JZGVmYXVsdCB5Ci0KLWVuZG1lbnUKLQotY29uZmlnIFNDSEVEX1NNVAotCWJvb2wgIlNNVCAoSHlwZXJ0aHJlYWRpbmcpIHNjaGVkdWxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU01UIHNjaGVkdWxlciBzdXBwb3J0IGltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24gbWFraW5nCi0JICB3aGVuIGRlYWxpbmcgd2l0aCBTUEFSQyBjcHVzIGF0IGEgY29zdCBvZiBzbGlnaHRseSBpbmNyZWFzZWQgb3ZlcmhlYWQKLQkgIGluIHNvbWUgcGxhY2VzLiBJZiB1bnN1cmUgc2F5IE4gaGVyZS4KLQotY29uZmlnIFNDSEVEX01DCi0JYm9vbCAiTXVsdGktY29yZSBzY2hlZHVsZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNNUAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIE11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQgaW1wcm92ZXMgdGhlIENQVSBzY2hlZHVsZXIncyBkZWNpc2lvbgotCSAgbWFraW5nIHdoZW4gZGVhbGluZyB3aXRoIG11bHRpLWNvcmUgQ1BVIGNoaXBzIGF0IGEgY29zdCBvZiBzbGlnaHRseQotCSAgaW5jcmVhc2VkIG92ZXJoZWFkIGluIHNvbWUgcGxhY2VzLiBJZiB1bnN1cmUgc2F5IE4gaGVyZS4KLQotc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgotCi1jb25maWcgQ01ETElORV9CT09MCi0JYm9vbCAiRGVmYXVsdCBib290bG9hZGVyIGtlcm5lbCBhcmd1bWVudHMiCi0KLWNvbmZpZyBDTURMSU5FCi0Jc3RyaW5nICJJbml0aWFsIGtlcm5lbCBjb21tYW5kIHN0cmluZyIKLQlkZXBlbmRzIG9uIENNRExJTkVfQk9PTAotCWRlZmF1bHQgImNvbnNvbGU9dHR5UzAsOTYwMCByb290PS9kZXYvc2RhMSIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcGFzcyBkZWZhdWx0IGFyZ3VtZW50cyB0bwotCSAgdGhlIGtlcm5lbC4gVGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGJvb3Rsb2FkZXIsIGlmIHlvdQotCSAgdXNlIG9uZSAoc3VjaCBhcyBTSUxPKS4gVGhpcyBpcyBtb3N0IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBib290Ci0JICBhIGtlcm5lbCBmcm9tIFRGVFAsIGFuZCB3YW50IGRlZmF1bHQgb3B0aW9ucyB0byBiZSBhdmFpbGFibGUKLQkgIHdpdGggaGF2aW5nIHRoZW0gcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLQkgIE5PVEU6IFRoaXMgb3B0aW9uIFdJTEwgb3ZlcnJpZGUgdGhlIFBST00gYm9vdGFyZ3Mgc2V0dGluZyEKLQotc291cmNlICJuZXQvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZyIKLQotc291cmNlICJmcy9LY29uZmlnIgotCi1zb3VyY2UgImFyY2gvc3BhcmM2NC9LY29uZmlnLmRlYnVnIgotCi1zb3VyY2UgInNlY3VyaXR5L0tjb25maWciCi0KLXNvdXJjZSAiY3J5cHRvL0tjb25maWciCi0KLXNvdXJjZSAibGliL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnLmRlYnVnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDA1MTVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnLmRlYnVnCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotbWVudSAiS2VybmVsIGhhY2tpbmciCi0KLWNvbmZpZyBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCi0JYm9vbAotCWRlZmF1bHQgeQotCi1zb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgotCi1jb25maWcgREVCVUdfU1RBQ0tfVVNBR0UKLQlib29sICJFbmFibGUgc3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCi0JaGVscAotCSAgRW5hYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgZnJlZSBzdGFjayB3aGljaCBlYWNoCi0JICB0YXNrIGhhcyBldmVyIGhhZCBhdmFpbGFibGUgaW4gdGhlIHN5c3JxLVQgYW5kIHN5c3JxLVAgZGVidWcgb3V0cHV0LgotCi0JICBUaGlzIG9wdGlvbiB3aWxsIHNsb3cgZG93biBwcm9jZXNzIGNyZWF0aW9uIHNvbWV3aGF0LgotCi1jb25maWcgREVCVUdfRENGTFVTSAotCWJvb2wgIkQtY2FjaGUgZmx1c2ggZGVidWdnaW5nIgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCi0KLWNvbmZpZyBTVEFDS19ERUJVRwotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCi0JYm9vbCAiU3RhY2sgT3ZlcmZsb3cgRGV0ZWN0aW9uIFN1cHBvcnQiCi0KLWNvbmZpZyBERUJVR19QQUdFQUxMT0MKLQlib29sICJEZWJ1ZyBwYWdlIG1lbW9yeSBhbGxvY2F0aW9ucyIKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhSElCRVJOQVRJT04KLQloZWxwCi0JICBVbm1hcCBwYWdlcyBmcm9tIHRoZSBrZXJuZWwgbGluZWFyIG1hcHBpbmcgYWZ0ZXIgZnJlZV9wYWdlcygpLgotCSAgVGhpcyByZXN1bHRzIGluIGEgbGFyZ2Ugc2xvd2Rvd24sIGJ1dCBoZWxwcyB0byBmaW5kIGNlcnRhaW4gdHlwZXMKLQkgIG9mIG1lbW9yeSBjb3JydXB0aW9ucy4KLQotY29uZmlnIE1DT1VOVAotCWJvb2wKLQlkZXBlbmRzIG9uIFNUQUNLX0RFQlVHIHx8IEZVTkNUSU9OX1RSQUNFUgotCWRlZmF1bHQgeQotCi1jb25maWcgRlJBTUVfUE9JTlRFUgotCWJvb2wKLQlkZXBlbmRzIG9uIE1DT1VOVAotCWRlZmF1bHQgeQotCi1lbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjE0YWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBzcGFyYzY0L01ha2VmaWxlCi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBmbGFncyBhbmQgZGVwZW5kZW5jaWVzIG9uIHRoZQotIyA2NC1iaXQgU3BhcmMuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5NiwxOTk4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSMgQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQotIwotCi1DSEVDS0ZMQUdTCSs9IC1EX19zcGFyY19fIC1EX19zcGFyY192OV9fIC1EX19hcmNoNjRfXyAtbTY0Ci0KLSMgVW5kZWZpbmUgc3BhcmMgd2hlbiBwcm9jZXNzaW5nIHZtbGludXgubGRzIC0gaXQgaXMgdXNlZAotIyBBbmQgdGVhY2ggQ1BQIHdlIGFyZSBkb2luZyA2NCBiaXQgYnVpbGRzIChmb3IgdGhpcyBjYXNlKQotQ1BQRkxBR1Nfdm1saW51eC5sZHMgKz0gLW02NCAtVXNwYXJjCi0KLUxERkxBR1MJCTo9IC1tIGVsZjY0X3NwYXJjCi0KLUtCVUlMRF9DRkxBR1MgKz0gLW02NCAtcGlwZSAtbW5vLWZwdSAtbWNwdT11bHRyYXNwYXJjIC1tY21vZGVsPW1lZGxvdyBcCi0JLWZmaXhlZC1nNCAtZmZpeGVkLWc1IC1mY2FsbC11c2VkLWc3IC1Xbm8tc2lnbi1jb21wYXJlIFwKLQktV2EsLS11bmRlY2xhcmVkLXJlZ3MKLUtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9dWx0cmFzcGFyYzMpCi1LQlVJTERfQUZMQUdTICs9IC1tNjQgLW1jcHU9dWx0cmFzcGFyYyAtV2EsLS11bmRlY2xhcmVkLXJlZ3MKLQotaWZlcSAoJChDT05GSUdfTUNPVU5UKSx5KQotICBLQlVJTERfQ0ZMQUdTICs9IC1wZwotZW5kaWYKLQotaGVhZC15IDo9IGFyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5vIGFyY2gvc3BhcmM2NC9rZXJuZWwvaW5pdF90YXNrLm8KLQotY29yZS15CQkJCSs9IGFyY2gvc3BhcmM2NC9rZXJuZWwvIGFyY2gvc3BhcmM2NC9tbS8KLWNvcmUteQkJCQkrPSBhcmNoL3NwYXJjNjQvbWF0aC1lbXUvCi1saWJzLXkJCQkJKz0gYXJjaC9zcGFyYzY0L3Byb20vIGFyY2gvc3BhcmM2NC9saWIvCi1kcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkrPSBhcmNoL3NwYXJjNjQvb3Byb2ZpbGUvCi0KLWJvb3QgOj0gYXJjaC9zcGFyYzY0L2Jvb3QKLQotaW1hZ2UgdGZ0cGJvb3QuaW1nIHZtbGludXguYW91dDogdm1saW51eAotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAotCi1hcmNoY2xlYW46Ci0JJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQotCi1kZWZpbmUgYXJjaGhlbHAKLSAgZWNobyAgJyogdm1saW51eCAgICAgICAtIFN0YW5kYXJkIHNwYXJjNjQga2VybmVsJwotICBlY2hvICAnICB2bWxpbnV4LmFvdXQgIC0gYS5vdXQga2VybmVsIGZvciBzcGFyYzY0JwotICBlY2hvICAnICB0ZnRwYm9vdC5pbWcgIC0gSW1hZ2UgcHJlcGFyZWQgZm9yIHRmdHAnCi1lbmRlZgotCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvYm9vdC9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9ib290L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU4YjUyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9ib290L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgdGhlIFNwYXJjNjQgYm9vdCBzdHVmZi4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSMgQ29weXJpZ2h0IChDKSAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0KLVJPT1RfSU1HCTo9IC91c3Ivc3JjL3Jvb3QuaW1nCi1FTEZUT0FPVVQJOj0gZWxmdG9hb3V0Ci0KLWhvc3Rwcm9ncy15CTo9IHBpZ2d5YmFjawotdGFyZ2V0cwkJOj0gaW1hZ2UgdGZ0cGJvb3QuaW1nIHZtbGludXguYW91dAotCi1xdWlldF9jbWRfZWxmdG9hb3V0ID0gRUxGMkFPVVQgJEAKLSAgICAgIGNtZF9lbGZ0b2FvdXQgPSAkKEVMRlRPQU9VVCkgdm1saW51eCAtbyAkQAotcXVpZXRfY21kX3BpZ2d5ICAgICA9IFBJR0dZICAgJEAKLSAgICAgIGNtZF9waWdneSAgICAgPSAkKG9iaikvcGlnZ3liYWNrICRAIFN5c3RlbS5tYXAgJChST09UX0lNRykKLXF1aWV0X2NtZF9zdHJpcCAgICAgPSBTVFJJUCAgICRACi0gICAgICBjbWRfc3RyaXAgICAgID0gJChTVFJJUCkgLVIgLmNvbW1lbnQgLVIgLm5vdGUgLUsgc3VuNHVfaW5pdCAtSyBfZW5kIC1LIF9zdGFydCB2bWxpbnV4IC1vICRACi0KLQotIyBBY3R1YWwgbGlua2luZwotJChvYmopL2ltYWdlOiB2bWxpbnV4IEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsc3RyaXApCi0JQGVjaG8gJyAga2VybmVsOiAkQCBpcyByZWFkeScKLQotJChvYmopL3RmdHBib290LmltZzogdm1saW51eCAkKG9iaikvcGlnZ3liYWNrIFN5c3RlbS5tYXAgJChST09UX0lNRykgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxlbGZ0b2FvdXQpCi0JJChjYWxsIGlmX2NoYW5nZWQscGlnZ3kpCi0JQGVjaG8gJyAga2VybmVsOiAkQCBpcyByZWFkeScKLQotJChvYmopL3ZtbGludXguYW91dDogdm1saW51eCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGVsZnRvYW91dCkKLQlAZWNobyAnICBrZXJuZWw6ICRAIGlzIHJlYWR5JwotCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlMGI5OC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KLSMKLQotRVhUUkFfQUZMQUdTIDo9IC1hbnNpCi1FWFRSQV9DRkxBR1MgOj0gLVdlcnJvcgotCi1DRkxBR1NfUkVNT1ZFX2Z0cmFjZS5vID0gLXBnCi0KLWV4dHJhLXkJCTo9IGhlYWQubyBpbml0X3Rhc2subyB2bWxpbnV4LmxkcwotCi1vYmoteQkJOj0gcHJvY2Vzcy5vIHNldHVwLm8gY3B1Lm8gaWRwcm9tLm8gcmVib290Lm8gXAotCQkgICB0cmFwcy5vIGF1eGlvLm8gdW5hX2FzbS5vIHN5c2ZzLm8gaW9tbXUubyBcCi0JCSAgIGlycS5vIHB0cmFjZS5vIHRpbWUubyBzeXNfc3BhcmMubyBzaWduYWwubyBcCi0JCSAgIHVuYWxpZ25lZC5vIGNlbnRyYWwubyBzdGFyZmlyZS5vIFwKLQkJICAgcG93ZXIubyBzYnVzLm8gc3BhcmM2NF9rc3ltcy5vIGVidXMubyBcCi0JCSAgIHZpc2VtdWwubyBwcm9tLm8gb2ZfZGV2aWNlLm8gaHZhcGkubyBzc3RhdGUubyBtZGVzYy5vCi0KLW9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkgKz0gZnRyYWNlLm8KLW9iai0kKENPTkZJR19TVEFDS1RSQUNFKSArPSBzdGFja3RyYWNlLm8KLW9iai0kKENPTkZJR19QQ0kpCSArPSBwY2kubyBwY2lfY29tbW9uLm8gcHN5Y2hvX2NvbW1vbi5vIFwKLQkJCSAgICBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vIFwKLQkJCSAgICBwY2lfc3VuNHYubyBwY2lfc3VuNHZfYXNtLm8gcGNpX2ZpcmUubwotb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IHBjaV9tc2kubwotb2JqLSQoQ09ORklHX1NNUCkJICs9IHNtcC5vIHRyYW1wb2xpbmUubyBodnRyYW1wLm8KLW9iai0kKENPTkZJR19DT01QQVQpICs9IHN5czMyLm8gc3lzX3NwYXJjMzIubyBzaWduYWwzMi5vCi1vYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8KLW9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwotb2JqLSQoQ09ORklHX1VTMkVfRlJFUSkgKz0gdXMyZV9jcHVmcmVxLm8KLW9iai0kKENPTkZJR19VUzNfTUMpICs9IGNobWMubwotb2JqLSQoQ09ORklHX0tQUk9CRVMpICs9IGtwcm9iZXMubwotb2JqLSQoQ09ORklHX1NVTl9MRE9NUykgKz0gbGRjLm8gdmlvLm8gdmlvaHMubyBkcy5vCi1vYmotJChDT05GSUdfQVVESVQpICs9IGF1ZGl0Lm8KLW9iai0kKENPTkZJR19BVURJVCkkKENPTkZJR19DT01QQVQpICs9IGNvbXBhdF9hdWRpdC5vCi1vYmoteSArPSAkKG9iai15eSkKLW9iai0kKENPTkZJR19LR0RCKSArPSBrZ2RiLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyNjMxMS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vKiBEdW1teSBhc20tb2Zmc2V0cy5jIGZpbGUuIFJlcXVpcmVkIGJ5IGtidWlsZCBhbmQgcmVhZHkgdG8gYmUgdXNlZCAtIGhpbnQhICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2NwdS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5YWM4My4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIGNwdS5jOiBEaW5reSByb3V0aW5lcyB0byBsb29rIGZvciB0aGUga2luZCBvZiBTcGFyYyBjcHUKLSAqICAgICAgICB3ZSBhcmUgb24uCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8YXNtL2FzaS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vZnB1bWFjcm8uaD4KLSNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgotI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotCi0jaW5jbHVkZSAiZW50cnkuaCIKLQotREVGSU5FX1BFUl9DUFUoY3B1aW5mb19zcGFyYywgX19jcHVfZGF0YSkgPSB7IDAgfTsKLQotc3RydWN0IGNwdV9jaGlwX2luZm8gewotCXVuc2lnbmVkIHNob3J0CW1hbnVmOwotCXVuc2lnbmVkIHNob3J0CWltcGw7Ci0JY29uc3QgY2hhcgkqY3B1X25hbWU7Ci0JY29uc3QgY2hhcgkqZnBfbmFtZTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2NoaXBfaW5mbyBjcHVfY2hpcHNbXSA9IHsKLQl7Ci0JCS5tYW51ZgkJPSAweDE3LAotCQkuaW1wbAkJPSAweDEwLAotCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJICAgKFNwaXRGaXJlKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSSBpbnRlZ3JhdGVkIEZQVSIsCi0JfSwKLQl7Ci0JCS5tYW51ZgkJPSAweDIyLAotCQkuaW1wbAkJPSAweDEwLAotCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJICAgKFNwaXRGaXJlKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSSBpbnRlZ3JhdGVkIEZQVSIsCi0JfSwKLQl7Ci0JCS5tYW51ZgkJPSAweDE3LAotCQkuaW1wbAkJPSAweDExLAotCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJSSAgKEJsYWNrQmlyZCkiLAotCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElJIGludGVncmF0ZWQgRlBVIiwKLQl9LAotCXsKLQkJLm1hbnVmCQk9IDB4MTcsCi0JCS5pbXBsCQk9IDB4MTIsCi0JCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElJaSAoU2FicmUpIiwKLQkJLmZwX25hbWUJPSAiVWx0cmFTcGFyYyBJSWkgaW50ZWdyYXRlZCBGUFUiLAotCX0sCi0JewotCQkubWFudWYJCT0gMHgxNywKLQkJLmltcGwJCT0gMHgxMywKLQkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSUllIChIdW1taW5nYmlyZCkiLAotCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElJZSBpbnRlZ3JhdGVkIEZQVSIsCi0JfSwKLQl7Ci0JCS5tYW51ZgkJPSAweDNlLAotCQkuaW1wbAkJPSAweDE0LAotCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJSUkgKENoZWV0YWgpIiwKLQkJLmZwX25hbWUJPSAiVWx0cmFTcGFyYyBJSUkgaW50ZWdyYXRlZCBGUFUiLAotCX0sCi0JewotCQkubWFudWYJCT0gMHgzZSwKLQkJLmltcGwJCT0gMHgxNSwKLQkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSUlJKyAoQ2hlZXRhaCspIiwKLQkJLmZwX25hbWUJPSAiVWx0cmFTcGFyYyBJSUkrIGludGVncmF0ZWQgRlBVIiwKLQl9LAotCXsKLQkJLm1hbnVmCQk9IDB4M2UsCi0JCS5pbXBsCQk9IDB4MTYsCi0JCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElJSWkgKEphbGFwZW5vKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSUlJaSBpbnRlZ3JhdGVkIEZQVSIsCi0JfSwKLQl7Ci0JCS5tYW51ZgkJPSAweDNlLAotCQkuaW1wbAkJPSAweDE4LAotCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJViAoSmFndWFyKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSVYgaW50ZWdyYXRlZCBGUFUiLAotCX0sCi0JewotCQkubWFudWYJCT0gMHgzZSwKLQkJLmltcGwJCT0gMHgxOSwKLQkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSVYrIChQYW50aGVyKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSVYrIGludGVncmF0ZWQgRlBVIiwKLQl9LAotCXsKLQkJLm1hbnVmCQk9IDB4M2UsCi0JCS5pbXBsCQk9IDB4MjIsCi0JCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElJSWkrIChTZXJyYW5vKSIsCi0JCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSUlJaSsgaW50ZWdyYXRlZCBGUFUiLAotCX0sCi19OwotCi0jZGVmaW5lIE5TUEFSQ0NISVBTIEFSUkFZX1NJWkUobGludXhfc3BhcmNfY2hpcHMpCi0KLWNvbnN0IGNoYXIgKnNwYXJjX2NwdV90eXBlOwotY29uc3QgY2hhciAqc3BhcmNfZnB1X3R5cGU7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzdW40dl9jcHVfcHJvYmUodm9pZCkKLXsKLQlzd2l0Y2ggKHN1bjR2X2NoaXBfdHlwZSkgewotCWNhc2UgU1VONFZfQ0hJUF9OSUFHQVJBMToKLQkJc3BhcmNfY3B1X3R5cGUgPSAiVWx0cmFTcGFyYyBUMSAoTmlhZ2FyYSkiOwotCQlzcGFyY19mcHVfdHlwZSA9ICJVbHRyYVNwYXJjIFQxIGludGVncmF0ZWQgRlBVIjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNVTjRWX0NISVBfTklBR0FSQTI6Ci0JCXNwYXJjX2NwdV90eXBlID0gIlVsdHJhU3BhcmMgVDIgKE5pYWdhcmEyKSI7Ci0JCXNwYXJjX2ZwdV90eXBlID0gIlVsdHJhU3BhcmMgVDIgaW50ZWdyYXRlZCBGUFUiOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVTogVW5rbm93biBzdW40diBjcHUgdHlwZSBbJXNdXG4iLAotCQkgICAgICAgcHJvbV9jcHVfY29tcGF0aWJsZSk7Ci0JCXNwYXJjX2NwdV90eXBlID0gIlVua25vd24gU1VONFYgQ1BVIjsKLQkJc3BhcmNfZnB1X3R5cGUgPSAiVW5rbm93biBTVU40ViBGUFUiOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2NoaXBfaW5mbyAqIF9faW5pdCBmaW5kX2NwdV9jaGlwKHVuc2lnbmVkIHNob3J0IG1hbnVmLAotCQkJCQkJCSB1bnNpZ25lZCBzaG9ydCBpbXBsKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3B1X2NoaXBzKTsgaSsrKSB7Ci0JCWNvbnN0IHN0cnVjdCBjcHVfY2hpcF9pbmZvICpwID0gJmNwdV9jaGlwc1tpXTsKLQotCQlpZiAocC0+bWFudWYgPT0gbWFudWYgJiYgcC0+aW1wbCA9PSBpbXBsKQotCQkJcmV0dXJuIHA7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjcHVfdHlwZV9wcm9iZSh2b2lkKQotewotCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7Ci0JCXN1bjR2X2NwdV9wcm9iZSgpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgdmVyLCBtYW51ZiwgaW1wbDsKLQkJY29uc3Qgc3RydWN0IGNwdV9jaGlwX2luZm8gKnA7Ci0JCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZHByICUldmVyLCAlMCIgOiAiPXIiICh2ZXIpKTsKLQkKLQkJbWFudWYgPSAoKHZlciA+PiA0OCkgJiAweGZmZmYpOwotCQlpbXBsID0gKCh2ZXIgPj4gMzIpICYgMHhmZmZmKTsKLQotCQlwID0gZmluZF9jcHVfY2hpcChtYW51ZiwgaW1wbCk7Ci0JCWlmIChwKSB7Ci0JCQlzcGFyY19jcHVfdHlwZSA9IHAtPmNwdV9uYW1lOwotCQkJc3BhcmNfZnB1X3R5cGUgPSBwLT5mcF9uYW1lOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICJDUFU6IFVua25vd24gY2hpcCwgbWFudWZbJWx4XSBpbXBsWyVseF1cbiIsCi0JCQkgICAgICAgbWFudWYsIGltcGwpOwotCQkJc3BhcmNfY3B1X3R5cGUgPSAiVW5rbm93biBDUFUiOwotCQkJc3BhcmNfZnB1X3R5cGUgPSAiVW5rbm93biBGUFUiOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKGNwdV90eXBlX3Byb2JlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaWRwcm9tLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lkcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJmZjgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaWRwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogaWRwcm9tLmM6IFJvdXRpbmVzIHRvIGxvYWQgdGhlIGlkcHJvbSBpbnRvIGtlcm5lbCBhZGRyZXNzZXMgYW5kCi0gKiAgICAgICAgICAgaW50ZXJwcmV0IHRoZSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4uCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0KLXN0cnVjdCBpZHByb20gKmlkcHJvbTsKLXN0YXRpYyBzdHJ1Y3QgaWRwcm9tIGlkcHJvbV9idWZmZXI7Ci0KLS8qIENhbGN1bGF0ZSB0aGUgSURQUk9NIGNoZWNrc3VtICh4b3Igb2YgdGhlIGRhdGEgYnl0ZXMpLiAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbml0IGNhbGNfaWRwcm9tX2Nrc3VtKHN0cnVjdCBpZHByb20gKmlkcHJvbSkKLXsKLQl1bnNpZ25lZCBjaGFyIGNrc3VtLCBpLCAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilpZHByb207Ci0KLQlmb3IgKGkgPSBja3N1bSA9IDA7IGkgPD0gMHgwRTsgaSsrKQotCQlja3N1bSBePSAqcHRyKys7Ci0KLQlyZXR1cm4gY2tzdW07Ci19Ci0KLS8qIENyZWF0ZSBhIGxvY2FsIElEUFJPTSBjb3B5IGFuZCB2ZXJpZnkgaW50ZWdyaXR5LiAqLwotdm9pZCBfX2luaXQgaWRwcm9tX2luaXQodm9pZCkKLXsKLQlwcm9tX2dldF9pZHByb20oKGNoYXIgKikgJmlkcHJvbV9idWZmZXIsIHNpemVvZihpZHByb21fYnVmZmVyKSk7Ci0KLQlpZHByb20gPSAmaWRwcm9tX2J1ZmZlcjsKLQotCWlmIChpZHByb20tPmlkX2Zvcm1hdCAhPSAweDAxKSAgewotCQlwcm9tX3ByaW50ZigiSURQUk9NOiBXYXJuaW5nLCB1bmtub3duIGZvcm1hdCB0eXBlIVxuIik7Ci0JfQotCi0JaWYgKGlkcHJvbS0+aWRfY2tzdW0gIT0gY2FsY19pZHByb21fY2tzdW0oaWRwcm9tKSkgewotCQlwcm9tX3ByaW50ZigiSURQUk9NOiBXYXJuaW5nLCBjaGVja3N1bSBmYWlsdXJlIChudnJhbT0leCwgY2FsYz0leCkhXG4iLAotCQkJICAgIGlkcHJvbS0+aWRfY2tzdW0sIGNhbGNfaWRwcm9tX2Nrc3VtKGlkcHJvbSkpOwotCX0KLQotCXByaW50aygiRXRoZXJuZXQgYWRkcmVzczogJXBNXG4iLCBpZHByb20tPmlkX2V0aGFkZHIpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pbml0X3Rhc2suYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW5pdF90YXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjMxMjMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pbml0X3Rhc2suYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KLQotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgZnNfc3RydWN0IGluaXRfZnMgPSBJTklUX0ZTOwotc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOwotc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKLXN0cnVjdCBtbV9zdHJ1Y3QgaW5pdF9tbSA9IElOSVRfTU0oaW5pdF9tbSk7Ci0KLUVYUE9SVF9TWU1CT0woaW5pdF9tbSk7Ci0KLS8qIC50ZXh0IHNlY3Rpb24gaW4gaGVhZC5TIGlzIGFsaWduZWQgYXQgMiBwYWdlIGJvdW5kYXJ5IGFuZCB0aGlzIGdldHMgbGlua2VkCi0gKiByaWdodCBhZnRlciB0aGF0IHNvIHRoYXQgdGhlIGluaXRfdGhyZWFkX3VuaW9uIGlzIGFsaWduZWQgcHJvcGVybHkgYXMgd2VsbC4KLSAqIFdlIHJlYWxseSBkb24ndCBuZWVkIHRoaXMgc3BlY2lhbCBhbGlnbm1lbnQgbGlrZSB0aGUgSW50ZWwgZG9lcywgYnV0Ci0gKiBJIGRvIGl0IGFueXdheXMgZm9yIGNvbXBsZXRlbmVzcy4KLSAqLwotX19hc21fXyAoIi50ZXh0Iik7Ci11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gPSB7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwotCi0vKgotICogSW5pdGlhbCB0YXNrIHN0cnVjdHVyZS4KLSAqCi0gKiBBbGwgb3RoZXIgdGFzayBzdHJ1Y3RzIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHNsYWJzIGluIGZvcmsuYwotICovCi1FWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7Ci0KLV9fYXNtX18oIi5kYXRhIik7Ci1zdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL21vZHVsZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9tb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4NDg0Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL21vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIEtlcm5lbCBtb2R1bGUgaGVscCBmb3Igc3BhcmM2NC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgUnVzdHkgUnVzc2VsbC4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBEYXZpZCBTLiBNaWxsZXIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgotCi1zdGF0aWMgdm9pZCAqbW9kdWxlX21hcCh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQotCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwotCWlmICghc2l6ZSB8fCBzaXplID4gTU9EVUxFU19MRU4pCi0JCXJldHVybiBOVUxMOwotCi0JYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fQUxMT0MsIE1PRFVMRVNfVkFERFIsIE1PRFVMRVNfRU5EKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKLX0KLQotdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpyZXQ7Ci0KLQkvKiBXZSBoYW5kbGUgdGhlIHplcm8gY2FzZSBmaW5lLCB1bmxpa2Ugdm1hbGxvYyAqLwotCWlmIChzaXplID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JcmV0ID0gbW9kdWxlX21hcChzaXplKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gRVJSX1BUUigtRU5PTUVNKTsKLQllbHNlCi0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfY29yZV9hbGxvYy9tb2R1bGVfaW5pdF9hbGxvYyAqLwotdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCi17Ci0JdmZyZWUobW9kdWxlX3JlZ2lvbik7Ci0JLyogRklYTUU6IElmIG1vZHVsZV9yZWdpb24gPT0gbW9kLT5pbml0X3JlZ2lvbiwgdHJpbSBleGNlcHRpb24KLSAgICAgICAgICAgdGFibGUgZW50cmllcy4gKi8KLX0KLQotLyogTWFrZSBnZW5lcmljIGNvZGUgaWdub3JlIFNUVF9SRUdJU1RFUiBkdW1teSB1bmRlZmluZWQgc3ltYm9scy4gICovCi1pbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGZfRWhkciAqaGRyLAotCQkJICAgICAgRWxmX1NoZHIgKnNlY2hkcnMsCi0JCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAotCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXVuc2lnbmVkIGludCBzeW1pZHg7Ci0JRWxmNjRfU3ltICpzeW07Ci0JY29uc3QgY2hhciAqc3RydGFiOwotCWludCBpOwotCi0JZm9yIChzeW1pZHggPSAwOyBzZWNoZHJzW3N5bWlkeF0uc2hfdHlwZSAhPSBTSFRfU1lNVEFCOyBzeW1pZHgrKykgewotCQlpZiAoc3ltaWR4ID09IGhkci0+ZV9zaG51bS0xKSB7Ci0JCQlwcmludGsoIiVzOiBubyBzeW10YWIgZm91bmQuXG4iLCBtb2QtPm5hbWUpOwotCQkJcmV0dXJuIC1FTk9FWEVDOwotCQl9Ci0JfQotCXN5bSA9IChFbGY2NF9TeW0gKilzZWNoZHJzW3N5bWlkeF0uc2hfYWRkcjsKLQlzdHJ0YWIgPSAoY2hhciAqKXNlY2hkcnNbc2VjaGRyc1tzeW1pZHhdLnNoX2xpbmtdLnNoX2FkZHI7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgc2VjaGRyc1tzeW1pZHhdLnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSk7IGkrKykgewotCQlpZiAoc3ltW2ldLnN0X3NobmR4ID09IFNITl9VTkRFRiAmJgotCQkgICAgRUxGNjRfU1RfVFlQRShzeW1baV0uc3RfaW5mbykgPT0gU1RUX1JFR0lTVEVSKQotCQkJc3ltW2ldLnN0X3NobmR4ID0gU0hOX0FCUzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhcHBseV9yZWxvY2F0ZShFbGY2NF9TaGRyICpzZWNoZHJzLAotCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCi0JCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKLQkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IG5vbi1BREQgUkVMT0NBVElPTiB1bnN1cHBvcnRlZFxuIiwKLQkgICAgICAgbWUtPm5hbWUpOwotCXJldHVybiAtRU5PRVhFQzsKLX0KLQotaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGY2NF9TaGRyICpzZWNoZHJzLAotCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAotCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAotCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKLQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1lKQotewotCXVuc2lnbmVkIGludCBpOwotCUVsZjY0X1JlbGEgKnJlbCA9ICh2b2lkICopc2VjaGRyc1tyZWxzZWNdLnNoX2FkZHI7Ci0JRWxmNjRfU3ltICpzeW07Ci0JdTggKmxvY2F0aW9uOwotCXUzMiAqbG9jMzI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2VjaGRyc1tyZWxzZWNdLnNoX3NpemUgLyBzaXplb2YoKnJlbCk7IGkrKykgewotCQlFbGY2NF9BZGRyIHY7Ci0KLQkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KLQkJbG9jYXRpb24gPSAodTggKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCi0JCQkrIHJlbFtpXS5yX29mZnNldDsKLQkJbG9jMzIgPSAodTMyICopIGxvY2F0aW9uOwotCi0JCUJVR19PTigoKHU2NClsb2NhdGlvbiA+PiAodTY0KTMyKSAhPSAodTY0KTApOwotCi0JCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8uICBOb3RlIHRoYXQgYWxsCi0JCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gICovCi0JCXN5bSA9IChFbGY2NF9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCi0JCQkrIEVMRjY0X1JfU1lNKHJlbFtpXS5yX2luZm8pOwotCQl2ID0gc3ltLT5zdF92YWx1ZSArIHJlbFtpXS5yX2FkZGVuZDsKLQotCQlzd2l0Y2ggKEVMRjY0X1JfVFlQRShyZWxbaV0ucl9pbmZvKSAmIDB4ZmYpIHsKLQkJY2FzZSBSX1NQQVJDXzY0OgotCQkJbG9jYXRpb25bMF0gPSB2ID4+IDU2OwotCQkJbG9jYXRpb25bMV0gPSB2ID4+IDQ4OwotCQkJbG9jYXRpb25bMl0gPSB2ID4+IDQwOwotCQkJbG9jYXRpb25bM10gPSB2ID4+IDMyOwotCQkJbG9jYXRpb25bNF0gPSB2ID4+IDI0OwotCQkJbG9jYXRpb25bNV0gPSB2ID4+IDE2OwotCQkJbG9jYXRpb25bNl0gPSB2ID4+ICA4OwotCQkJbG9jYXRpb25bN10gPSB2ID4+ICAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDXzMyOgotCQkJbG9jYXRpb25bMF0gPSB2ID4+IDI0OwotCQkJbG9jYXRpb25bMV0gPSB2ID4+IDE2OwotCQkJbG9jYXRpb25bMl0gPSB2ID4+ICA4OwotCQkJbG9jYXRpb25bM10gPSB2ID4+ICAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0RJU1AzMjoKLQkJCXYgLT0gKEVsZjY0X0FkZHIpIGxvY2F0aW9uOwotCQkJKmxvYzMyID0gdjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCQkJdiAtPSAoRWxmNjRfQWRkcikgbG9jYXRpb247Ci0JCQkqbG9jMzIgPSAoKmxvYzMyICYgfjB4M2ZmZmZmZmYpIHwKLQkJCQkoKHYgPj4gMikgJiAweDNmZmZmZmZmKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCQkJdiAtPSAoRWxmNjRfQWRkcikgbG9jYXRpb247Ci0JCQkqbG9jMzIgPSAoKmxvYzMyICYgfjB4M2ZmZmZmKSB8Ci0JCQkJKCh2ID4+IDIpICYgMHgzZmZmZmYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JCQl2IC09IChFbGY2NF9BZGRyKSBsb2NhdGlvbjsKLQkJCSpsb2MzMiA9ICgqbG9jMzIgJiB+MHg3ZmZmZikgfAotCQkJCSgodiA+PiAyKSAmIDB4N2ZmZmYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0xPMTA6Ci0JCQkqbG9jMzIgPSAoKmxvYzMyICYgfjB4M2ZmKSB8ICh2ICYgMHgzZmYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0hJMjI6Ci0JCQkqbG9jMzIgPSAoKmxvYzMyICYgfjB4M2ZmZmZmKSB8Ci0JCQkJKCh2ID4+IDEwKSAmIDB4M2ZmZmZmKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkJCSpsb2MzMiA9ICgqbG9jMzIgJiB+MHgxZmZmKSB8Ci0JCQkJKCgodiAmIDB4M2ZmKSArCi0JCQkJICAoRUxGNjRfUl9UWVBFKHJlbFtpXS5yX2luZm8pID4+IDgpKQotCQkJCSAmIDB4MWZmZik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXhcbiIsCi0JCQkgICAgICAgbWUtPm5hbWUsCi0JCQkgICAgICAgKGludCkgKEVMRjY0X1JfVFlQRShyZWxbaV0ucl9pbmZvKSAmIDB4ZmYpKTsKLQkJCXJldHVybiAtRU5PRVhFQzsKLQkJfTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKLQkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAotCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCi17Ci0JLyogQ2hlZXRhaCdzIEktY2FjaGUgaXMgZnVsbHkgY29oZXJlbnQuICAqLwotCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewotCQl1bnNpZ25lZCBsb25nIHZhOwotCi0JCWZsdXNod19hbGwoKTsKLQkJZm9yICh2YSA9ICAwOyB2YSA8IChQQUdFX1NJWkUgPDwgMSk7IHZhICs9IDMyKQotCQkJc3BpdGZpcmVfcHV0X2ljYWNoZV90YWcodmEsIDB4MCk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJmbHVzaCAlZzYiKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmE4MmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg0ICswLDAgQEAKLS8qCi0gKiBQcm9jZWR1cmVzIGZvciBjcmVhdGluZywgYWNjZXNzaW5nIGFuZCBpbnRlcnByZXRpbmcgdGhlIGRldmljZSB0cmVlLgotICoKLSAqIFBhdWwgTWFja2VycmFzCUF1Z3VzdCAxOTk2LgotICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgUGF1bCBNYWNrZXJyYXMuCi0gKiAKLSAqICBBZGFwdGVkIGZvciA2NGJpdCBQb3dlclBDIGJ5IERhdmUgRW5nZWJyZXRzZW4gYW5kIFBldGVyIEJlcmduZXIuCi0gKiAgICB7ZW5nZWJyZXR8YmVyZ25lcn1AdXMuaWJtLmNvbSAKLSAqCi0gKiAgQWRhcHRlZCBmb3Igc3BhcmM2NCBieSBEYXZpZCBTLiBNaWxsZXIgZGF2ZW1AZGF2ZW1sb2Z0Lm5ldAotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xtYi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2FzaS5oPgotI2luY2x1ZGUgPGFzbS91cGEuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsbG5vZGVzOwkvKiB0ZW1wb3Jhcnkgd2hpbGUgbWVyZ2luZyAqLwotCi1leHRlcm4gcndsb2NrX3QgZGV2dHJlZV9sb2NrOwkvKiB0ZW1wb3Jhcnkgd2hpbGUgbWVyZ2luZyAqLwotCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUgaGFuZGxlKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlmb3IgKG5wID0gYWxsbm9kZXM7IG5wOyBucCA9IG5wLT5hbGxuZXh0KQotCQlpZiAobnAtPm5vZGUgPT0gaGFuZGxlKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gbnA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKTsKLQotaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQlpbnQgbGVuOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIG5hbWUsICZsZW4pOwotCWlmICghcHJvcCB8fCBsZW4gIT0gNCkKLQkJcmV0dXJuIGRlZjsKLQotCXJldHVybiAqKGludCAqKSBwcm9wLT52YWx1ZTsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0aW50cHJvcF9kZWZhdWx0KTsKLQotREVGSU5FX01VVEVYKG9mX3NldF9wcm9wZXJ0eV9tdXRleCk7Ci1FWFBPUlRfU1lNQk9MKG9mX3NldF9wcm9wZXJ0eV9tdXRleCk7Ci0KLWludCBvZl9zZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsLCBpbnQgbGVuKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqKnByZXZwOwotCXZvaWQgKm5ld192YWw7Ci0JaW50IGVycjsKLQotCW5ld192YWwgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfdmFsKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbWNweShuZXdfdmFsLCB2YWwsIGxlbik7Ci0KLQllcnIgPSAtRU5PREVWOwotCi0Jd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKLQlwcmV2cCA9ICZkcC0+cHJvcGVydGllczsKLQl3aGlsZSAoKnByZXZwKSB7Ci0JCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9ICpwcmV2cDsKLQotCQlpZiAoIXN0cmNhc2VjbXAocHJvcC0+bmFtZSwgbmFtZSkpIHsKLQkJCXZvaWQgKm9sZF92YWwgPSBwcm9wLT52YWx1ZTsKLQkJCWludCByZXQ7Ci0KLQkJCW11dGV4X2xvY2soJm9mX3NldF9wcm9wZXJ0eV9tdXRleCk7Ci0JCQlyZXQgPSBwcm9tX3NldHByb3AoZHAtPm5vZGUsIG5hbWUsIHZhbCwgbGVuKTsKLQkJCW11dGV4X3VubG9jaygmb2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKLQotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWlmIChyZXQgPj0gMCkgewotCQkJCXByb3AtPnZhbHVlID0gbmV3X3ZhbDsKLQkJCQlwcm9wLT5sZW5ndGggPSBsZW47Ci0KLQkJCQlpZiAoT0ZfSVNfRFlOQU1JQyhwcm9wKSkKLQkJCQkJa2ZyZWUob2xkX3ZhbCk7Ci0KLQkJCQlPRl9NQVJLX0RZTkFNSUMocHJvcCk7Ci0KLQkJCQllcnIgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcHJldnAgPSAmKCpwcmV2cCktPm5leHQ7Ci0JfQotCXdyaXRlX3VubG9jaygmZGV2dHJlZV9sb2NrKTsKLQotCS8qIFhYWCBVcGF0ZSBwcm9jZnMgaWYgbmVjZXNzYXJ5Li4uICovCi0KLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTChvZl9zZXRfcHJvcGVydHkpOwotCi1pbnQgb2ZfZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbikKLXsKLQl3aGlsZSAobGVuID4gMCkgewotCQlpbnQgbDsKLQotCQlpZiAoIXN0cmNtcChsaXN0LCBtYXRjaCkpCi0JCQlyZXR1cm4gMTsKLQkJbCA9IHN0cmxlbihsaXN0KSArIDE7Ci0JCWxpc3QgKz0gbDsKLQkJbGVuIC09IGw7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChvZl9maW5kX2luX3Byb3BsaXN0KTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBwcm9tX2Vhcmx5X2FsbG9jYXRlZCBfX2luaXRkYXRhOwotCi1zdGF0aWMgdm9pZCAqIF9faW5pdCBwcm9tX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gbG1iX2FsbG9jKHNpemUsIFNNUF9DQUNIRV9CWVRFUyk7Ci0Jdm9pZCAqcmV0OwotCi0JaWYgKCFwYWRkcikgewotCQlwcm9tX3ByaW50ZigicHJvbV9lYXJseV9hbGxvYyglbHUpIGZhaWxlZFxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KLQotCXJldCA9IF9fdmEocGFkZHIpOwotCW1lbXNldChyZXQsIDAsIHNpemUpOwotCXByb21fZWFybHlfYWxsb2NhdGVkICs9IHNpemU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWZkZWYgQ09ORklHX1BDSQotLyogUFNZQ0hPIGludGVycnVwdCBtYXBwaW5nIHN1cHBvcnQuICovCi0jZGVmaW5lIFBTWUNIT19JTUFQX0FfU0xPVDAJMHgwYzAwVUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfQl9TTE9UMAkweDBjMjBVTAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHN5Y2hvX3BjaXNsb3RfaW1hcF9vZmZzZXQodW5zaWduZWQgbG9uZyBpbm8pCi17Ci0JdW5zaWduZWQgaW50IGJ1cyA9ICAoaW5vICYgMHgxMCkgPj4gNDsKLQl1bnNpZ25lZCBpbnQgc2xvdCA9IChpbm8gJiAweDBjKSA+PiAyOwotCi0JaWYgKGJ1cyA9PSAwKQotCQlyZXR1cm4gUFNZQ0hPX0lNQVBfQV9TTE9UMCArIChzbG90ICogOCk7Ci0JZWxzZQotCQlyZXR1cm4gUFNZQ0hPX0lNQVBfQl9TTE9UMCArIChzbG90ICogOCk7Ci19Ci0KLSNkZWZpbmUgUFNZQ0hPX09CSU9fSU1BUF9CQVNFCTB4MTAwMFVMCi0KLSNkZWZpbmUgUFNZQ0hPX09OQk9BUkRfSVJRX0JBU0UJCTB4MjAKLSNkZWZpbmUgcHN5Y2hvX29uYm9hcmRfaW1hcF9vZmZzZXQoX19pbm8pIFwKLQkoUFNZQ0hPX09CSU9fSU1BUF9CQVNFICsgKCgoX19pbm8pICYgMHgxZikgPDwgMykpCi0KLSNkZWZpbmUgUFNZQ0hPX0lDTFJfQV9TTE9UMAkweDE0MDBVTAotI2RlZmluZSBQU1lDSE9fSUNMUl9TQ1NJCTB4MTgwMFVMCi0KLSNkZWZpbmUgcHN5Y2hvX2ljbHJfb2Zmc2V0KGlubykJCQkJCSAgICAgIFwKLQkoKGlubyAmIDB4MjApID8gKFBTWUNIT19JQ0xSX1NDU0kgKyAoKChpbm8pICYgMHgxZikgPDwgMykpIDogIFwKLQkJCShQU1lDSE9fSUNMUl9BX1NMT1QwICsgKCgoaW5vKSAmIDB4MWYpPDwzKSkpCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcHN5Y2hvX2lycV9idWlsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IGlubywKLQkJCQkgICAgIHZvaWQgKl9kYXRhKQotewotCXVuc2lnbmVkIGxvbmcgY29udHJvbGxlcl9yZWdzID0gKHVuc2lnbmVkIGxvbmcpIF9kYXRhOwotCXVuc2lnbmVkIGxvbmcgaW1hcCwgaWNscjsKLQl1bnNpZ25lZCBsb25nIGltYXBfb2ZmLCBpY2xyX29mZjsKLQlpbnQgaW5vZml4dXAgPSAwOwotCi0JaW5vICY9IDB4M2Y7Ci0JaWYgKGlubyA8IFBTWUNIT19PTkJPQVJEX0lSUV9CQVNFKSB7Ci0JCS8qIFBDSSBzbG90ICovCi0JCWltYXBfb2ZmID0gcHN5Y2hvX3BjaXNsb3RfaW1hcF9vZmZzZXQoaW5vKTsKLQl9IGVsc2UgewotCQkvKiBPbmJvYXJkIGRldmljZSAqLwotCQlpbWFwX29mZiA9IHBzeWNob19vbmJvYXJkX2ltYXBfb2Zmc2V0KGlubyk7Ci0JfQotCi0JLyogTm93IGJ1aWxkIHRoZSBJUlEgYnVja2V0LiAqLwotCWltYXAgPSBjb250cm9sbGVyX3JlZ3MgKyBpbWFwX29mZjsKLQotCWljbHJfb2ZmID0gcHN5Y2hvX2ljbHJfb2Zmc2V0KGlubyk7Ci0JaWNsciA9IGNvbnRyb2xsZXJfcmVncyArIGljbHJfb2ZmOwotCi0JaWYgKChpbm8gJiAweDIwKSA9PSAwKQotCQlpbm9maXh1cCA9IGlubyAmIDB4MDM7Ci0KLQlyZXR1cm4gYnVpbGRfaXJxKGlub2ZpeHVwLCBpY2xyLCBpbWFwKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHBzeWNob19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwotCi0JZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwotCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHBzeWNob19pcnFfYnVpbGQ7Ci0KLQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JZHAtPmlycV90cmFucy0+ZGF0YSA9ICh2b2lkICopIHJlZ3NbMl0ucGh5c19hZGRyOwotfQotCi0jZGVmaW5lIHNhYnJlX3JlYWQoX19yZWcpIFwKLSh7CXU2NCBfX3JldDsgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHhhIFslMV0gJTIsICUwIiBcCi0JCQkgICAgIDogIj1yIiAoX19yZXQpIFwKLQkJCSAgICAgOiAiciIgKF9fcmVnKSwgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkgXAotCQkJICAgICA6ICJtZW1vcnkiKTsgXAotCV9fcmV0OyBcCi19KQotCi1zdHJ1Y3Qgc2FicmVfaXJxX2RhdGEgewotCXVuc2lnbmVkIGxvbmcgY29udHJvbGxlcl9yZWdzOwotCXVuc2lnbmVkIGludCBwY2lfZmlyc3RfYnVzbm87Ci19OwotI2RlZmluZSBTQUJSRV9DT05GSUdTUEFDRQkweDAwMTAwMDAwMFVMCi0jZGVmaW5lIFNBQlJFX1dSU1lOQwkJMHgxYzIwVUwKLQotI2RlZmluZSBTQUJSRV9DT05GSUdfQkFTRShDT05GSUdfU1BBQ0UpCVwKLQkoQ09ORklHX1NQQUNFIHwgKDFVTCA8PCAyNCkpCi0jZGVmaW5lIFNBQlJFX0NPTkZJR19FTkNPREUoQlVTLCBERVZGTiwgUkVHKQlcCi0JKCgodW5zaWduZWQgbG9uZykoQlVTKSAgIDw8IDE2KSB8CVwKLQkgKCh1bnNpZ25lZCBsb25nKShERVZGTikgPDwgOCkgIHwJXAotCSAoKHVuc2lnbmVkIGxvbmcpKFJFRykpKQotCi0vKiBXaGVuIGEgZGV2aWNlIGxpdmVzIGJlaGluZCBhIGJyaWRnZSBkZWVwZXIgaW4gdGhlIFBDSSBidXMgdG9wb2xvZ3kKLSAqIHRoYW4gQVBCLCBhIHNwZWNpYWwgc2VxdWVuY2UgbXVzdCBydW4gdG8gbWFrZSBzdXJlIGFsbCBwZW5kaW5nIERNQQotICogdHJhbnNmZXJzIGF0IHRoZSB0aW1lIG9mIElSUSBkZWxpdmVyeSBhcmUgdmlzaWJsZSBpbiB0aGUgY29oZXJlbmN5Ci0gKiBkb21haW4gYnkgdGhlIGNwdS4gIFRoaXMgc2VxdWVuY2UgaXMgdG8gcGVyZm9ybSBhIHJlYWQgb24gdGhlIGZhcgotICogc2lkZSBvZiB0aGUgbm9uLUFQQiBicmlkZ2UsIHRoZW4gcGVyZm9ybSBhIHJlYWQgb2YgU2FicmUncyBETUEKLSAqIHdyaXRlLXN5bmMgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHNhYnJlX3dzeW5jX2hhbmRsZXIodW5zaWduZWQgaW50IGlubywgdm9pZCAqX2FyZzEsIHZvaWQgKl9hcmcyKQotewotCXVuc2lnbmVkIGludCBwaHlzX2hpID0gKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGxvbmcpIF9hcmcxOwotCXN0cnVjdCBzYWJyZV9pcnFfZGF0YSAqaXJxX2RhdGEgPSBfYXJnMjsKLQl1bnNpZ25lZCBsb25nIGNvbnRyb2xsZXJfcmVncyA9IGlycV9kYXRhLT5jb250cm9sbGVyX3JlZ3M7Ci0JdW5zaWduZWQgbG9uZyBzeW5jX3JlZyA9IGNvbnRyb2xsZXJfcmVncyArIFNBQlJFX1dSU1lOQzsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZ19zcGFjZSA9IGNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0NPTkZJR1NQQUNFOwotCXVuc2lnbmVkIGludCBidXMsIGRldmZuOwotCXUxNiBfdW51c2VkOwotCi0JY29uZmlnX3NwYWNlID0gU0FCUkVfQ09ORklHX0JBU0UoY29uZmlnX3NwYWNlKTsKLQotCWJ1cyA9IChwaHlzX2hpID4+IDE2KSAmIDB4ZmY7Ci0JZGV2Zm4gPSAocGh5c19oaSA+PiA4KSAmIDB4ZmY7Ci0KLQljb25maWdfc3BhY2UgfD0gU0FCUkVfQ09ORklHX0VOQ09ERShidXMsIGRldmZuLCAweDAwKTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtZW1iYXIgI1N5bmNcblx0IgotCQkJICAgICAibGR1aGEgWyUxXSAlMiwgJTBcblx0IgotCQkJICAgICAibWVtYmFyICNTeW5jIgotCQkJICAgICA6ICI9ciIgKF91bnVzZWQpCi0JCQkgICAgIDogInIiICgodTE2ICopIGNvbmZpZ19zcGFjZSksCi0JCQkgICAgICAgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRV9MKQotCQkJICAgICA6ICJtZW1vcnkiKTsKLQotCXNhYnJlX3JlYWQoc3luY19yZWcpOwotfQotCi0jZGVmaW5lIFNBQlJFX0lNQVBfQV9TTE9UMAkweDBjMDBVTAotI2RlZmluZSBTQUJSRV9JTUFQX0JfU0xPVDAJMHgwYzIwVUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9BX1NMT1QwCTB4MTQwMFVMCi0jZGVmaW5lIFNBQlJFX0lDTFJfQl9TTE9UMAkweDE0ODBVTAotI2RlZmluZSBTQUJSRV9JQ0xSX1NDU0kJCTB4MTgwMFVMCi0jZGVmaW5lIFNBQlJFX0lDTFJfRVRICQkweDE4MDhVTAotI2RlZmluZSBTQUJSRV9JQ0xSX0JQUAkJMHgxODEwVUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9BVV9SRUMJMHgxODE4VUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9BVV9QTEFZCTB4MTgyMFVMCi0jZGVmaW5lIFNBQlJFX0lDTFJfUEZBSUwJMHgxODI4VUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9LTVMJCTB4MTgzMFVMCi0jZGVmaW5lIFNBQlJFX0lDTFJfRkxQWQkJMHgxODM4VUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9TSFcJCTB4MTg0MFVMCi0jZGVmaW5lIFNBQlJFX0lDTFJfS0JECQkweDE4NDhVTAotI2RlZmluZSBTQUJSRV9JQ0xSX01TCQkweDE4NTBVTAotI2RlZmluZSBTQUJSRV9JQ0xSX1NFUgkJMHgxODU4VUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9VRQkJMHgxODcwVUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9DRQkJMHgxODc4VUwKLSNkZWZpbmUgU0FCUkVfSUNMUl9QQ0lFUlIJMHgxODgwVUwKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2FicmVfcGNpc2xvdF9pbWFwX29mZnNldCh1bnNpZ25lZCBsb25nIGlubykKLXsKLQl1bnNpZ25lZCBpbnQgYnVzID0gIChpbm8gJiAweDEwKSA+PiA0OwotCXVuc2lnbmVkIGludCBzbG90ID0gKGlubyAmIDB4MGMpID4+IDI7Ci0KLQlpZiAoYnVzID09IDApCi0JCXJldHVybiBTQUJSRV9JTUFQX0FfU0xPVDAgKyAoc2xvdCAqIDgpOwotCWVsc2UKLQkJcmV0dXJuIFNBQlJFX0lNQVBfQl9TTE9UMCArIChzbG90ICogOCk7Ci19Ci0KLSNkZWZpbmUgU0FCUkVfT0JJT19JTUFQX0JBU0UJMHgxMDAwVUwKLSNkZWZpbmUgU0FCUkVfT05CT0FSRF9JUlFfQkFTRQkweDIwCi0jZGVmaW5lIHNhYnJlX29uYm9hcmRfaW1hcF9vZmZzZXQoX19pbm8pIFwKLQkoU0FCUkVfT0JJT19JTUFQX0JBU0UgKyAoKChfX2lubykgJiAweDFmKSA8PCAzKSkKLQotI2RlZmluZSBzYWJyZV9pY2xyX29mZnNldChpbm8pCQkJCQkgICAgICBcCi0JKChpbm8gJiAweDIwKSA/IChTQUJSRV9JQ0xSX1NDU0kgKyAoKChpbm8pICYgMHgxZikgPDwgMykpIDogIFwKLQkJCShTQUJSRV9JQ0xSX0FfU0xPVDAgKyAoKChpbm8pICYgMHgxZik8PDMpKSkKLQotc3RhdGljIGludCBzYWJyZV9kZXZpY2VfbmVlZHNfd3N5bmMoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IGRwLT5wYXJlbnQ7Ci0JY29uc3QgY2hhciAqcGFyZW50X21vZGVsLCAqcGFyZW50X2NvbXBhdDsKLQotCS8qIFRoaXMgdHJhdmVyc2FsIHVwIHRvd2FyZHMgdGhlIHJvb3QgaXMgbWVhbnQgdG8KLQkgKiBoYW5kbGUgdHdvIGNhc2VzOgotCSAqCi0JICogMSkgbm9uLVBDSSBidXMgc2l0dGluZyB1bmRlciBQQ0ksIHN1Y2ggYXMgJ2VidXMnCi0JICogMikgdGhlIFBDSSBjb250cm9sbGVyIGludGVycnVwdHMgdGhlbXNlbHZlcywgd2hpY2gKLQkgKiAgICB3aWxsIHVzZSB0aGUgc2FicmVfaXJxX2J1aWxkIGJ1dCBkbyBub3QgbmVlZAotCSAqICAgIHRoZSBETUEgc3luY2hyb25pemF0aW9uIGhhbmRsaW5nCi0JICovCi0Jd2hpbGUgKHBhcmVudCkgewotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2kiKSkKLQkJCWJyZWFrOwotCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKLQl9Ci0KLQlpZiAoIXBhcmVudCkKLQkJcmV0dXJuIDA7Ci0KLQlwYXJlbnRfbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LAotCQkJCSAgICAgICAibW9kZWwiLCBOVUxMKTsKLQlpZiAocGFyZW50X21vZGVsICYmCi0JICAgICghc3RyY21wKHBhcmVudF9tb2RlbCwgIlNVTlcsc2FicmUiKSB8fAotCSAgICAgIXN0cmNtcChwYXJlbnRfbW9kZWwsICJTVU5XLHNpbWJhIikpKQotCQlyZXR1cm4gMDsKLQotCXBhcmVudF9jb21wYXQgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LAotCQkJCQkiY29tcGF0aWJsZSIsIE5VTEwpOwotCWlmIChwYXJlbnRfY29tcGF0ICYmCi0JICAgICghc3RyY21wKHBhcmVudF9jb21wYXQsICJwY2kxMDhlLGEwMDAiKSB8fAotCSAgICAgIXN0cmNtcChwYXJlbnRfY29tcGF0LCAicGNpMTA4ZSxhMDAxIikpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNhYnJlX2lycV9idWlsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgaW5vLAotCQkJCSAgICB2b2lkICpfZGF0YSkKLXsKLQlzdHJ1Y3Qgc2FicmVfaXJxX2RhdGEgKmlycV9kYXRhID0gX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBjb250cm9sbGVyX3JlZ3MgPSBpcnFfZGF0YS0+Y29udHJvbGxlcl9yZWdzOwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwotCXVuc2lnbmVkIGxvbmcgaW1hcF9vZmYsIGljbHJfb2ZmOwotCWludCBpbm9maXh1cCA9IDA7Ci0JaW50IHZpcnRfaXJxOwotCi0JaW5vICY9IDB4M2Y7Ci0JaWYgKGlubyA8IFNBQlJFX09OQk9BUkRfSVJRX0JBU0UpIHsKLQkJLyogUENJIHNsb3QgKi8KLQkJaW1hcF9vZmYgPSBzYWJyZV9wY2lzbG90X2ltYXBfb2Zmc2V0KGlubyk7Ci0JfSBlbHNlIHsKLQkJLyogb25ib2FyZCBkZXZpY2UgKi8KLQkJaW1hcF9vZmYgPSBzYWJyZV9vbmJvYXJkX2ltYXBfb2Zmc2V0KGlubyk7Ci0JfQotCi0JLyogTm93IGJ1aWxkIHRoZSBJUlEgYnVja2V0LiAqLwotCWltYXAgPSBjb250cm9sbGVyX3JlZ3MgKyBpbWFwX29mZjsKLQotCWljbHJfb2ZmID0gc2FicmVfaWNscl9vZmZzZXQoaW5vKTsKLQlpY2xyID0gY29udHJvbGxlcl9yZWdzICsgaWNscl9vZmY7Ci0KLQlpZiAoKGlubyAmIDB4MjApID09IDApCi0JCWlub2ZpeHVwID0gaW5vICYgMHgwMzsKLQotCXZpcnRfaXJxID0gYnVpbGRfaXJxKGlub2ZpeHVwLCBpY2xyLCBpbWFwKTsKLQotCS8qIElmIHRoZSBwYXJlbnQgZGV2aWNlIGlzIGEgUENJPC0+UENJIGJyaWRnZSBvdGhlciB0aGFuCi0JICogQVBCLCB3ZSBoYXZlIHRvIGluc3RhbGwgYSBwcmUtaGFuZGxlciB0byBlbnN1cmUgdGhhdAotCSAqIGFsbCBwZW5kaW5nIERNQSBpcyBkcmFpbmVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKLQkgKiBpcyBydW4uCi0JICovCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmIChyZWdzICYmIHNhYnJlX2RldmljZV9uZWVkc193c3luYyhkcCkpIHsKLQkJaXJxX2luc3RhbGxfcHJlX2hhbmRsZXIodmlydF9pcnEsCi0JCQkJCXNhYnJlX3dzeW5jX2hhbmRsZXIsCi0JCQkJCSh2b2lkICopIChsb25nKSByZWdzLT5waHlzX2hpLAotCQkJCQkodm9pZCAqKSBpcnFfZGF0YSk7Ci0JfQotCi0JcmV0dXJuIHZpcnRfaXJxOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfaXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3Qgc2FicmVfaXJxX2RhdGEgKmlycV9kYXRhOwotCWNvbnN0IHUzMiAqYnVzcmFuZ2U7Ci0KLQlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7Ci0JZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gc2FicmVfaXJxX2J1aWxkOwotCi0JaXJxX2RhdGEgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgc2FicmVfaXJxX2RhdGEpKTsKLQotCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpcnFfZGF0YS0+Y29udHJvbGxlcl9yZWdzID0gcmVnc1swXS5waHlzX2FkZHI7Ci0KLQlidXNyYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImJ1cy1yYW5nZSIsIE5VTEwpOwotCWlycV9kYXRhLT5wY2lfZmlyc3RfYnVzbm8gPSBidXNyYW5nZVswXTsKLQotCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSBpcnFfZGF0YTsKLX0KLQotLyogU0NISVpPIGludGVycnVwdCBtYXBwaW5nIHN1cHBvcnQuICBVbmxpa2UgUHN5Y2hvLCBmb3IgdGhpcyBjb250cm9sbGVyIHRoZQotICogaW1hcC9pY2xyIHJlZ2lzdGVycyBhcmUgcGVyLVBCTS4KLSAqLwotI2RlZmluZSBTQ0hJWk9fSU1BUF9CQVNFCTB4MTAwMFVMCi0jZGVmaW5lIFNDSElaT19JQ0xSX0JBU0UJMHgxNDAwVUwKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NoaXpvX2ltYXBfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5vKQotewotCXJldHVybiBTQ0hJWk9fSU1BUF9CQVNFICsgKGlubyAqIDhVTCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNjaGl6b19pY2xyX29mZnNldCh1bnNpZ25lZCBsb25nIGlubykKLXsKLQlyZXR1cm4gU0NISVpPX0lDTFJfQkFTRSArIChpbm8gKiA4VUwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzY2hpem9faW5vX3RvX2ljbHIodW5zaWduZWQgbG9uZyBwYm1fcmVncywKLQkJCQkJdW5zaWduZWQgaW50IGlubykKLXsKLQotCXJldHVybiBwYm1fcmVncyArIHNjaGl6b19pY2xyX29mZnNldChpbm8pOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzY2hpem9faW5vX3RvX2ltYXAodW5zaWduZWQgbG9uZyBwYm1fcmVncywKLQkJCQkJdW5zaWduZWQgaW50IGlubykKLXsKLQlyZXR1cm4gcGJtX3JlZ3MgKyBzY2hpem9faW1hcF9vZmZzZXQoaW5vKTsKLX0KLQotI2RlZmluZSBzY2hpem9fcmVhZChfX3JlZykgXAotKHsJdTY0IF9fcmV0OyBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEgWyUxXSAlMiwgJTAiIFwKLQkJCSAgICAgOiAiPXIiIChfX3JldCkgXAotCQkJICAgICA6ICJyIiAoX19yZWcpLCAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCi0JCQkgICAgIDogIm1lbW9yeSIpOyBcCi0JX19yZXQ7IFwKLX0pCi0jZGVmaW5lIHNjaGl6b193cml0ZShfX3JlZywgX192YWwpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YSAlMCwgWyUxXSAlMiIgXAotCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8gXAotCQkJICAgICA6ICJyIiAoX192YWwpLCAiciIgKF9fcmVnKSwgXAotCQkJICAgICAgICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpIFwKLQkJCSAgICAgOiAibWVtb3J5IikKLQotc3RhdGljIHZvaWQgdG9tYXRpbGxvX3dzeW5jX2hhbmRsZXIodW5zaWduZWQgaW50IGlubywgdm9pZCAqX2FyZzEsIHZvaWQgKl9hcmcyKQotewotCXVuc2lnbmVkIGxvbmcgc3luY19yZWcgPSAodW5zaWduZWQgbG9uZykgX2FyZzI7Ci0JdTY0IG1hc2sgPSAxVUwgPDwgKGlubyAmIElNQVBfSU5PKTsKLQl1NjQgdmFsOwotCWludCBsaW1pdDsKLQotCXNjaGl6b193cml0ZShzeW5jX3JlZywgbWFzayk7Ci0KLQlsaW1pdCA9IDEwMDAwMDsKLQl2YWwgPSAwOwotCXdoaWxlICgtLWxpbWl0KSB7Ci0JCXZhbCA9IHNjaGl6b19yZWFkKHN5bmNfcmVnKTsKLQkJaWYgKCEodmFsICYgbWFzaykpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGxpbWl0IDw9IDApIHsKLQkJcHJpbnRrKCJ0b21hdGlsbG9fd3N5bmNfaGFuZGxlcjogRE1BIHdvbid0IHN5bmMgWyVseDolbHhdXG4iLAotCQkgICAgICAgdmFsLCBtYXNrKTsKLQl9Ci0KLQlpZiAoX2FyZzEpIHsKLQkJc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FjaGVsaW5lWzY0XQotCQkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDY0KSkpOwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZCAlJWZwcnMsICUwXG5cdCIKLQkJCQkgICAgICJvciAlMCwgJTQsICUxXG5cdCIKLQkJCQkgICAgICJ3ciAlMSwgMHgwLCAlJWZwcnNcblx0IgotCQkJCSAgICAgInN0ZGEgJSVmMCwgWyU1XSAlNlxuXHQiCi0JCQkJICAgICAid3IgJTAsIDB4MCwgJSVmcHJzXG5cdCIKLQkJCQkgICAgICJtZW1iYXIgI1N5bmMiCi0JCQkJICAgICA6ICI9JnIiIChtYXNrKSwgIj0mciIgKHZhbCkKLQkJCQkgICAgIDogIjAiIChtYXNrKSwgIjEiICh2YWwpLAotCQkJCSAgICAgImkiIChGUFJTX0ZFRiksICJyIiAoJmNhY2hlbGluZVswXSksCi0JCQkJICAgICAiaSIgKEFTSV9CTEtfQ09NTUlUX1ApKTsKLQl9Ci19Ci0KLXN0cnVjdCBzY2hpem9faXJxX2RhdGEgewotCXVuc2lnbmVkIGxvbmcgcGJtX3JlZ3M7Ci0JdW5zaWduZWQgbG9uZyBzeW5jX3JlZzsKLQl1MzIgcG9ydGlkOwotCWludCBjaGlwX3ZlcnNpb247Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNjaGl6b19pcnFfYnVpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBpbm8sCi0JCQkJICAgICB2b2lkICpfZGF0YSkKLXsKLQlzdHJ1Y3Qgc2NoaXpvX2lycV9kYXRhICppcnFfZGF0YSA9IF9kYXRhOwotCXVuc2lnbmVkIGxvbmcgcGJtX3JlZ3MgPSBpcnFfZGF0YS0+cGJtX3JlZ3M7Ci0JdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwotCWludCBpZ25fZml4dXA7Ci0JaW50IHZpcnRfaXJxOwotCWludCBpc190b21hdGlsbG87Ci0KLQlpbm8gJj0gMHgzZjsKLQotCS8qIE5vdyBidWlsZCB0aGUgSVJRIGJ1Y2tldC4gKi8KLQlpbWFwID0gc2NoaXpvX2lub190b19pbWFwKHBibV9yZWdzLCBpbm8pOwotCWljbHIgPSBzY2hpem9faW5vX3RvX2ljbHIocGJtX3JlZ3MsIGlubyk7Ci0KLQkvKiBPbiBTY2hpem8sIG5vIGlub2ZpeHVwIG9jY3Vycy4gIFRoaXMgaXMgYmVjYXVzZSBlYWNoCi0JICogSU5PIGhhcyBpdCdzIG93biBJTUFQIHJlZ2lzdGVyLiAgT24gUHN5Y2hvIGFuZCBTYWJyZQotCSAqIHRoZXJlIGlzIG9ubHkgb25lIElNQVAgcmVnaXN0ZXIgZm9yIGVhY2ggUENJIHNsb3QgZXZlbgotCSAqIHRob3VnaCBmb3VyIGRpZmZlcmVudCBJTk9zIGNhbiBiZSBnZW5lcmF0ZWQgYnkgZWFjaAotCSAqIFBDSSBzbG90LgotCSAqCi0JICogQnV0LCBmb3IgSkJVUyB2YXJpYW50cyAoZXNzZW50aWFsbHksIFRvbWF0aWxsbyksIHdlIGhhdmUKLQkgKiB0byBmaXh1cCB0aGUgbG93ZXN0IGJpdCBvZiB0aGUgaW50ZXJydXB0IGdyb3VwIG51bWJlci4KLQkgKi8KLQlpZ25fZml4dXAgPSAwOwotCi0JaXNfdG9tYXRpbGxvID0gKGlycV9kYXRhLT5zeW5jX3JlZyAhPSAwVUwpOwotCi0JaWYgKGlzX3RvbWF0aWxsbykgewotCQlpZiAoaXJxX2RhdGEtPnBvcnRpZCAmIDEpCi0JCQlpZ25fZml4dXAgPSAoMSA8PCA2KTsKLQl9Ci0KLQl2aXJ0X2lycSA9IGJ1aWxkX2lycShpZ25fZml4dXAsIGljbHIsIGltYXApOwotCi0JaWYgKGlzX3RvbWF0aWxsbykgewotCQlpcnFfaW5zdGFsbF9wcmVfaGFuZGxlcih2aXJ0X2lycSwKLQkJCQkJdG9tYXRpbGxvX3dzeW5jX2hhbmRsZXIsCi0JCQkJCSgoaXJxX2RhdGEtPmNoaXBfdmVyc2lvbiA8PSA0KSA/Ci0JCQkJCSAodm9pZCAqKSAxIDogKHZvaWQgKikgMCksCi0JCQkJCSh2b2lkICopIGlycV9kYXRhLT5zeW5jX3JlZyk7Ci0JfQotCi0JcmV0dXJuIHZpcnRfaXJxOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgX19zY2hpem9faXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKLQkJCQkJICAgaW50IGlzX3RvbWF0aWxsbykKLXsKLQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3Qgc2NoaXpvX2lycV9kYXRhICppcnFfZGF0YTsKLQotCWRwLT5pcnFfdHJhbnMgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXIpKTsKLQlkcC0+aXJxX3RyYW5zLT5pcnFfYnVpbGQgPSBzY2hpem9faXJxX2J1aWxkOwotCi0JaXJxX2RhdGEgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoaXpvX2lycV9kYXRhKSk7Ci0KLQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JZHAtPmlycV90cmFucy0+ZGF0YSA9IGlycV9kYXRhOwotCi0JaXJxX2RhdGEtPnBibV9yZWdzID0gcmVnc1swXS5waHlzX2FkZHI7Ci0JaWYgKGlzX3RvbWF0aWxsbykKLQkJaXJxX2RhdGEtPnN5bmNfcmVnID0gcmVnc1szXS5waHlzX2FkZHIgKyAweDFhMThVTDsKLQllbHNlCi0JCWlycV9kYXRhLT5zeW5jX3JlZyA9IDBVTDsKLQlpcnFfZGF0YS0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgMCk7Ci0JaXJxX2RhdGEtPmNoaXBfdmVyc2lvbiA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInZlcnNpb24jIiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9faXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlfX3NjaGl6b19pcnFfdHJhbnNfaW5pdChkcCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlfX3NjaGl6b19pcnFfdHJhbnNfaW5pdChkcCwgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGNpX3N1bjR2X2lycV9idWlsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAotCQkJCQl1bnNpZ25lZCBpbnQgZGV2aW5vLAotCQkJCQl2b2lkICpfZGF0YSkKLXsKLQl1MzIgZGV2aGFuZGxlID0gKHUzMikgKHVuc2lnbmVkIGxvbmcpIF9kYXRhOwotCi0JcmV0dXJuIHN1bjR2X2J1aWxkX2lycShkZXZoYW5kbGUsIGRldmlubyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfc3VuNHZfaXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQotCWRwLT5pcnFfdHJhbnMgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXIpKTsKLQlkcC0+aXJxX3RyYW5zLT5pcnFfYnVpbGQgPSBwY2lfc3VuNHZfaXJxX2J1aWxkOwotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykKLQkJKChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmKTsKLX0KLQotc3RydWN0IGZpcmVfaXJxX2RhdGEgewotCXVuc2lnbmVkIGxvbmcgcGJtX3JlZ3M7Ci0JdTMyIHBvcnRpZDsKLX07Ci0KLSNkZWZpbmUgRklSRV9JTUFQX0JBU0UJMHgwMDEwMDAKLSNkZWZpbmUgRklSRV9JQ0xSX0JBU0UJMHgwMDE0MDAKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlyZV9pbWFwX29mZnNldCh1bnNpZ25lZCBsb25nIGlubykKLXsKLQlyZXR1cm4gRklSRV9JTUFQX0JBU0UgKyAoaW5vICogOFVMKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlyZV9pY2xyX29mZnNldCh1bnNpZ25lZCBsb25nIGlubykKLXsKLQlyZXR1cm4gRklSRV9JQ0xSX0JBU0UgKyAoaW5vICogOFVMKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlyZV9pbm9fdG9faWNscih1bnNpZ25lZCBsb25nIHBibV9yZWdzLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGlubykKLXsKLQlyZXR1cm4gcGJtX3JlZ3MgKyBmaXJlX2ljbHJfb2Zmc2V0KGlubyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpcmVfaW5vX3RvX2ltYXAodW5zaWduZWQgbG9uZyBwYm1fcmVncywKLQkJCQkJICAgIHVuc2lnbmVkIGludCBpbm8pCi17Ci0JcmV0dXJuIHBibV9yZWdzICsgZmlyZV9pbWFwX29mZnNldChpbm8pOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpcmVfaXJxX2J1aWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCi0JCQkJCSB1bnNpZ25lZCBpbnQgaW5vLAotCQkJCQkgdm9pZCAqX2RhdGEpCi17Ci0Jc3RydWN0IGZpcmVfaXJxX2RhdGEgKmlycV9kYXRhID0gX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBwYm1fcmVncyA9IGlycV9kYXRhLT5wYm1fcmVnczsKLQl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7Ci0JdW5zaWduZWQgbG9uZyBpbnRfY3RybHI7Ci0KLQlpbm8gJj0gMHgzZjsKLQotCS8qIE5vdyBidWlsZCB0aGUgSVJRIGJ1Y2tldC4gKi8KLQlpbWFwID0gZmlyZV9pbm9fdG9faW1hcChwYm1fcmVncywgaW5vKTsKLQlpY2xyID0gZmlyZV9pbm9fdG9faWNscihwYm1fcmVncywgaW5vKTsKLQotCS8qIFNldCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgbnVtYmVyLiAgKi8KLQlpbnRfY3RybHIgPSAxIDw8IDY7Ci0JdXBhX3dyaXRlcShpbnRfY3RybHIsIGltYXApOwotCi0JLyogVGhlIGludGVycnVwdCBtYXAgcmVnaXN0ZXJzIGRvIG5vdCBoYXZlIGFuIElOTyBmaWVsZAotCSAqIGxpa2Ugb3RoZXIgY2hpcHMgZG8uICBUaGV5IHJldHVybiB6ZXJvIGluIHRoZSBJTk8KLQkgKiBmaWVsZCwgYW5kIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBudW1iZXIgaXMgY29udHJvbGxlZAotCSAqIGluIGJpdHMgNiB0byA5LiAgU28gaW4gb3JkZXIgZm9yIGJ1aWxkX2lycSgpIHRvIGdldAotCSAqIHRoZSBJTk8gcmlnaHQgd2UgcGFzcyBpdCBpbiBhcyBwYXJ0IG9mIHRoZSBmaXh1cAotCSAqIHdoaWNoIHdpbGwgZ2V0IGFkZGVkIHRvIHRoZSBtYXAgcmVnaXN0ZXIgemVybyB2YWx1ZQotCSAqIHJlYWQgYnkgYnVpbGRfaXJxKCkuCi0JICovCi0JaW5vIHw9IChpcnFfZGF0YS0+cG9ydGlkIDw8IDYpOwotCWlubyAtPSBpbnRfY3RybHI7Ci0JcmV0dXJuIGJ1aWxkX2lycShpbm8sIGljbHIsIGltYXApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlyZV9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwotCXN0cnVjdCBmaXJlX2lycV9kYXRhICppcnFfZGF0YTsKLQotCWRwLT5pcnFfdHJhbnMgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXIpKTsKLQlkcC0+aXJxX3RyYW5zLT5pcnFfYnVpbGQgPSBmaXJlX2lycV9idWlsZDsKLQotCWlycV9kYXRhID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IGZpcmVfaXJxX2RhdGEpKTsKLQotCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlkcC0+aXJxX3RyYW5zLT5kYXRhID0gaXJxX2RhdGE7Ci0KLQlpcnFfZGF0YS0+cGJtX3JlZ3MgPSByZWdzWzBdLnBoeXNfYWRkcjsKLQlpcnFfZGF0YS0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgMCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCi0jaWZkZWYgQ09ORklHX1NCVVMKLS8qIElOTyBudW1iZXIgdG8gSU1BUCByZWdpc3RlciBvZmZzZXQgZm9yIFNZU0lPIGV4dGVybmFsIElSUSdzLgotICogVGhpcyBzaG91bGQgY29uZm9ybSB0byBib3RoIFN1bmZpcmUvV2lsZGZpcmUgc2VydmVyIGFuZCBGdXNpb24KLSAqIGRlc2t0b3AgZGVzaWducy4KLSAqLwotI2RlZmluZSBTWVNJT19JTUFQX1NMT1QwCTB4MmMwMFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfU0xPVDEJMHgyYzA4VUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9TTE9UMgkweDJjMTBVTAotI2RlZmluZSBTWVNJT19JTUFQX1NMT1QzCTB4MmMxOFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfU0NTSQkJMHgzMDAwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9FVEgJCTB4MzAwOFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfQlBQCQkweDMwMTBVTAotI2RlZmluZSBTWVNJT19JTUFQX0FVRElPCTB4MzAxOFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfUEZBSUwJMHgzMDIwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9LTVMJCTB4MzAyOFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfRkxQWQkJMHgzMDMwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9TSFcJCTB4MzAzOFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfS0JECQkweDMwNDBVTAotI2RlZmluZSBTWVNJT19JTUFQX01TCQkweDMwNDhVTAotI2RlZmluZSBTWVNJT19JTUFQX1NFUgkJMHgzMDUwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9USU0wCQkweDMwNjBVTAotI2RlZmluZSBTWVNJT19JTUFQX1RJTTEJCTB4MzA2OFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfVUUJCTB4MzA3MFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfQ0UJCTB4MzA3OFVMCi0jZGVmaW5lIFNZU0lPX0lNQVBfU0JFUlIJMHgzMDgwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9QTUdNVAkweDMwODhVTAotI2RlZmluZSBTWVNJT19JTUFQX0dGWAkJMHgzMDkwVUwKLSNkZWZpbmUgU1lTSU9fSU1BUF9FVVBBCQkweDMwOThVTAotCi0jZGVmaW5lIGJvZ29uICAgICAoKHVuc2lnbmVkIGxvbmcpIC0xKQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3lzaW9faXJxX29mZnNldHNbXSA9IHsKLQkvKiBTQlVTIFNsb3QgMCAtLT4gMywgbGV2ZWwgMSAtLT4gNyAqLwotCVNZU0lPX0lNQVBfU0xPVDAsIFNZU0lPX0lNQVBfU0xPVDAsIFNZU0lPX0lNQVBfU0xPVDAsIFNZU0lPX0lNQVBfU0xPVDAsCi0JU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwgU1lTSU9fSU1BUF9TTE9UMCwKLQlTWVNJT19JTUFQX1NMT1QxLCBTWVNJT19JTUFQX1NMT1QxLCBTWVNJT19JTUFQX1NMT1QxLCBTWVNJT19JTUFQX1NMT1QxLAotCVNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsIFNZU0lPX0lNQVBfU0xPVDEsCi0JU1lTSU9fSU1BUF9TTE9UMiwgU1lTSU9fSU1BUF9TTE9UMiwgU1lTSU9fSU1BUF9TTE9UMiwgU1lTSU9fSU1BUF9TTE9UMiwKLQlTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLCBTWVNJT19JTUFQX1NMT1QyLAotCVNZU0lPX0lNQVBfU0xPVDMsIFNZU0lPX0lNQVBfU0xPVDMsIFNZU0lPX0lNQVBfU0xPVDMsIFNZU0lPX0lNQVBfU0xPVDMsCi0JU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywgU1lTSU9fSU1BUF9TTE9UMywKLQotCS8qIE9uYm9hcmQgZGV2aWNlcyAobm90IHJlbGV2YW50L3VzZWQgb24gU3VuRmlyZSkuICovCi0JU1lTSU9fSU1BUF9TQ1NJLAotCVNZU0lPX0lNQVBfRVRILAotCVNZU0lPX0lNQVBfQlBQLAotCWJvZ29uLAotCVNZU0lPX0lNQVBfQVVESU8sCi0JU1lTSU9fSU1BUF9QRkFJTCwKLQlib2dvbiwKLQlib2dvbiwKLQlTWVNJT19JTUFQX0tNUywKLQlTWVNJT19JTUFQX0ZMUFksCi0JU1lTSU9fSU1BUF9TSFcsCi0JU1lTSU9fSU1BUF9LQkQsCi0JU1lTSU9fSU1BUF9NUywKLQlTWVNJT19JTUFQX1NFUiwKLQlib2dvbiwKLQlib2dvbiwKLQlTWVNJT19JTUFQX1RJTTAsCi0JU1lTSU9fSU1BUF9USU0xLAotCWJvZ29uLAotCWJvZ29uLAotCVNZU0lPX0lNQVBfVUUsCi0JU1lTSU9fSU1BUF9DRSwKLQlTWVNJT19JTUFQX1NCRVJSLAotCVNZU0lPX0lNQVBfUE1HTVQsCi0JU1lTSU9fSU1BUF9HRlgsCi0JU1lTSU9fSU1BUF9FVVBBLAotfTsKLQotI3VuZGVmIGJvZ29uCi0KLSNkZWZpbmUgTlVNX1NZU0lPX09GRlNFVFMgQVJSQVlfU0laRShzeXNpb19pcnFfb2Zmc2V0cykKLQotLyogQ29udmVydCBJbnRlcnJ1cHQgTWFwcGluZyByZWdpc3RlciBwb2ludGVyIHRvIGFzc29jaWF0ZWQKLSAqIEludGVycnVwdCBDbGVhciByZWdpc3RlciBwb2ludGVyLCBTWVNJTyBzcGVjaWZpYyB2ZXJzaW9uLgotICovCi0jZGVmaW5lIFNZU0lPX0lDTFJfVU5VU0VEMAkweDM0MDBVTAotI2RlZmluZSBTWVNJT19JQ0xSX1NMT1QwCTB4MzQwOFVMCi0jZGVmaW5lIFNZU0lPX0lDTFJfU0xPVDEJMHgzNDQ4VUwKLSNkZWZpbmUgU1lTSU9fSUNMUl9TTE9UMgkweDM0ODhVTAotI2RlZmluZSBTWVNJT19JQ0xSX1NMT1QzCTB4MzRjOFVMCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzeXNpb19pbWFwX3RvX2ljbHIodW5zaWduZWQgbG9uZyBpbWFwKQotewotCXVuc2lnbmVkIGxvbmcgZGlmZiA9IFNZU0lPX0lDTFJfVU5VU0VEMCAtIFNZU0lPX0lNQVBfU0xPVDA7Ci0JcmV0dXJuIGltYXAgKyBkaWZmOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNidXNfb2ZfYnVpbGRfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGlubywKLQkJCQkgICAgICB2b2lkICpfZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIF9kYXRhOwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKLQl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7Ci0JaW50IHNidXNfc2xvdCA9IDA7Ci0JaW50IHNidXNfbGV2ZWwgPSAwOwotCi0JaW5vICY9IDB4M2Y7Ci0KLQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JaWYgKHJlZ3MpCi0JCXNidXNfc2xvdCA9IHJlZ3MtPndoaWNoX2lvOwotCi0JaWYgKGlubyA8IDB4MjApCi0JCWlubyArPSAoc2J1c19zbG90ICogOCk7Ci0KLQlpbWFwID0gc3lzaW9faXJxX29mZnNldHNbaW5vXTsKLQlpZiAoaW1hcCA9PSAoKHVuc2lnbmVkIGxvbmcpLTEpKSB7Ci0JCXByb21fcHJpbnRmKCJnZXRfaXJxX3RyYW5zbGF0aW9uczogQmFkIFNZU0lPIElOT1sleF1cbiIsCi0JCQkgICAgaW5vKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCWltYXAgKz0gcmVnX2Jhc2U7Ci0KLQkvKiBTWVNJTyBpbmNvbnNpc3RlbmN5LiAgRm9yIGV4dGVybmFsIFNMT1RTLCB3ZSBoYXZlIHRvIHNlbGVjdAotCSAqIHRoZSByaWdodCBJQ0xSIHJlZ2lzdGVyIGJhc2VkIHVwb24gdGhlIGxvd2VyIFNCVVMgaXJxIGxldmVsCi0JICogYml0cy4KLQkgKi8KLQlpZiAoaW5vID49IDB4MjApIHsKLQkJaWNsciA9IHN5c2lvX2ltYXBfdG9faWNscihpbWFwKTsKLQl9IGVsc2UgewotCQlzYnVzX2xldmVsID0gaW5vICYgMHg3OwotCi0JCXN3aXRjaChzYnVzX3Nsb3QpIHsKLQkJY2FzZSAwOgotCQkJaWNsciA9IHJlZ19iYXNlICsgU1lTSU9fSUNMUl9TTE9UMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlpY2xyID0gcmVnX2Jhc2UgKyBTWVNJT19JQ0xSX1NMT1QxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWljbHIgPSByZWdfYmFzZSArIFNZU0lPX0lDTFJfU0xPVDI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSAzOgotCQkJaWNsciA9IHJlZ19iYXNlICsgU1lTSU9fSUNMUl9TTE9UMzsKLQkJCWJyZWFrOwotCQl9OwotCi0JCWljbHIgKz0gKCh1bnNpZ25lZCBsb25nKXNidXNfbGV2ZWwgLSAxVUwpICogOFVMOwotCX0KLQlyZXR1cm4gYnVpbGRfaXJxKHNidXNfbGV2ZWwsIGljbHIsIGltYXApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwotCi0JZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwotCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHNidXNfb2ZfYnVpbGRfaXJxOwotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcmVncy0+cGh5c19hZGRyOwotfQotI2VuZGlmIC8qIENPTkZJR19TQlVTICovCi0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjZW50cmFsX2J1aWxkX2lycShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBpbm8sCi0JCQkJICAgICAgdm9pZCAqX2RhdGEpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjZW50cmFsX2RwID0gX2RhdGE7Ci0Jc3RydWN0IG9mX2RldmljZSAqY2VudHJhbF9vcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoY2VudHJhbF9kcCk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwotCXUzMiB0bXA7Ci0KLQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImVlcHJvbSIpKSB7Ci0JCXJlcyA9ICZjZW50cmFsX29wLT5yZXNvdXJjZVs1XTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJ6cyIpKSB7Ci0JCXJlcyA9ICZjZW50cmFsX29wLT5yZXNvdXJjZVs0XTsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJjbG9jay1ib2FyZCIpKSB7Ci0JCXJlcyA9ICZjZW50cmFsX29wLT5yZXNvdXJjZVszXTsKLQl9IGVsc2UgewotCQlyZXR1cm4gaW5vOwotCX0KLQotCWltYXAgPSByZXMtPnN0YXJ0ICsgMHgwMFVMOwotCWljbHIgPSByZXMtPnN0YXJ0ICsgMHgxMFVMOwotCi0JLyogU2V0IHRoZSBJTk8gc3RhdGUgdG8gaWRsZSwgYW5kIGRpc2FibGUuICAqLwotCXVwYV93cml0ZWwoMCwgaWNscik7Ci0JdXBhX3JlYWRsKGljbHIpOwotCi0JdG1wID0gdXBhX3JlYWRsKGltYXApOwotCXRtcCAmPSB+MHg4MDAwMDAwMDsKLQl1cGFfd3JpdGVsKHRtcCwgaW1hcCk7Ci0KLQlyZXR1cm4gYnVpbGRfaXJxKDAsIGljbHIsIGltYXApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2VudHJhbF9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWRwLT5pcnFfdHJhbnMgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXIpKTsKLQlkcC0+aXJxX3RyYW5zLT5pcnFfYnVpbGQgPSBjZW50cmFsX2J1aWxkX2lycTsKLQotCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSBkcDsKLX0KLQotc3RydWN0IGlycV90cmFucyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl2b2lkICgqaW5pdCkoc3RydWN0IGRldmljZV9ub2RlICopOwotfTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBzdHJ1Y3QgaXJxX3RyYW5zIF9faW5pdGRhdGEgcGNpX2lycV90cmFuc190YWJsZVtdID0gewotCXsgIlNVTlcsc2FicmUiLCBzYWJyZV9pcnFfdHJhbnNfaW5pdCB9LAotCXsgInBjaTEwOGUsYTAwMCIsIHNhYnJlX2lycV90cmFuc19pbml0IH0sCi0JeyAicGNpMTA4ZSxhMDAxIiwgc2FicmVfaXJxX3RyYW5zX2luaXQgfSwKLQl7ICJTVU5XLHBzeWNobyIsIHBzeWNob19pcnFfdHJhbnNfaW5pdCB9LAotCXsgInBjaTEwOGUsODAwMCIsIHBzeWNob19pcnFfdHJhbnNfaW5pdCB9LAotCXsgIlNVTlcsc2NoaXpvIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAicGNpMTA4ZSw4MDAxIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAiU1VOVyxzY2hpem8rIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAicGNpMTA4ZSw4MDAyIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAiU1VOVyx0b21hdGlsbG8iLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKLQl7ICJwY2kxMDhlLGE4MDEiLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKLQl7ICJTVU5XLHN1bjR2LXBjaSIsIHBjaV9zdW40dl9pcnFfdHJhbnNfaW5pdCB9LAotCXsgInBjaWV4MTA4ZSw4MGYwIiwgZmlyZV9pcnFfdHJhbnNfaW5pdCB9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1bjR2X3ZkZXZfaXJxX2J1aWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCi0JCQkJCSB1bnNpZ25lZCBpbnQgZGV2aW5vLAotCQkJCQkgdm9pZCAqX2RhdGEpCi17Ci0JdTMyIGRldmhhbmRsZSA9ICh1MzIpICh1bnNpZ25lZCBsb25nKSBfZGF0YTsKLQotCXJldHVybiBzdW40dl9idWlsZF9pcnEoZGV2aGFuZGxlLCBkZXZpbm8pOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3VuNHZfdmRldl9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQotewotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwotCi0JZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwotCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHN1bjR2X3ZkZXZfaXJxX2J1aWxkOwotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykKLQkJKChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGlycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0jaWZkZWYgQ09ORklHX1BDSQotCWNvbnN0IGNoYXIgKm1vZGVsOwotCWludCBpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUENJCi0JbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOwotCWlmICghbW9kZWwpCi0JCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiY29tcGF0aWJsZSIsIE5VTEwpOwotCWlmIChtb2RlbCkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2lfaXJxX3RyYW5zX3RhYmxlKTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgaXJxX3RyYW5zICp0ID0gJnBjaV9pcnFfdHJhbnNfdGFibGVbaV07Ci0KLQkJCWlmICghc3RyY21wKG1vZGVsLCB0LT5uYW1lKSkgewotCQkJCXQtPmluaXQoZHApOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19TQlVTCi0JaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJzYnVzIikgfHwKLQkgICAgIXN0cmNtcChkcC0+bmFtZSwgInNiaSIpKSB7Ci0JCXNidXNfaXJxX3RyYW5zX2luaXQoZHApOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJmaGMiKSAmJgotCSAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJjZW50cmFsIikpIHsKLQkJY2VudHJhbF9pcnFfdHJhbnNfaW5pdChkcCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJ2aXJ0dWFsLWRldmljZXMiKSB8fAotCSAgICAhc3RyY21wKGRwLT5uYW1lLCAibml1IikpIHsKLQkJc3VuNHZfdmRldl9pcnFfdHJhbnNfaW5pdChkcCk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaXNfcm9vdF9ub2RlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0JaWYgKCFkcCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKGRwLT5wYXJlbnQgPT0gTlVMTCk7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZGVhbCB3aXRoIHRoZSBibGFjayBtYWdpYyBvZiBmdWxseSBuYW1pbmcgYQotICogbm9kZS4KLSAqCi0gKiBDZXJ0YWluIHdlbGwga25vd24gbmFtZWQgbm9kZXMgYXJlIGp1c3QgdGhlIHNpbXBsZSBuYW1lIHN0cmluZy4KLSAqCi0gKiBBY3R1YWwgZGV2aWNlcyBoYXZlIGFuIGFkZHJlc3Mgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUKLSAqIHN0cmluZywgbGlrZSB0aGlzICJmb29AYWRkciIuICBUaGUgImFkZHIiIGNhbiBiZSBpbiBhbnkgbnVtYmVyIG9mCi0gKiBmb3JtYXRzLCBhbmQgdGhlIHBsYXRmb3JtIHBsdXMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgZGV0ZXJtaW5lIHRoZQotICogZm9ybWF0IGFuZCBob3cgaXQgaXMgY29uc3RydWN0ZWQuCi0gKgotICogRm9yIGNoaWxkcmVuIG9mIHRoZSBST09UIG5vZGUsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpcyBmaXhlZCBhbmQKLSAqIGRldGVybWluZWQgYnkgd2hldGhlciB0aGlzIGlzIGEgc3VuNHUgb3Igc3VuNHYgc3lzdGVtLgotICoKLSAqIEZvciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgaXQgaXMgYnVzIHR5cGUgc3BlY2lmaWMuICBTbwotICogd2Ugd2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBkaXNjb3ZlciBhICJkZXZpY2VfdHlwZSIgcHJvcGVydHkKLSAqIHdlIHJlY29nbml6ZSBhbmQgd2UgZ28gZnJvbSB0aGVyZS4KLSAqCi0gKiBBcyBhbiBleGFtcGxlLCB0aGUgYm9vdCBkZXZpY2Ugb24gbXkgd29ya3N0YXRpb24gaGFzIGEgZnVsbCBwYXRoOgotICoKLSAqCS9wY2lAMWUsNjAwMDAwL2lkZUBkL2Rpc2tAMCwwOmMKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHN1bjR2X3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpycHJvcDsKLQl1MzIgaGlnaF9iaXRzLCBsb3dfYml0cywgdHlwZTsKLQotCXJwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcnByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBycHJvcC0+dmFsdWU7Ci0JaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKLQkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAotCQkJZHAtPm5hbWUsCi0JCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAotCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOwotCQlyZXR1cm47Ci0JfQotCi0JdHlwZSA9IHJlZ3MtPnBoeXNfYWRkciA+PiA2MFVMOwotCWhpZ2hfYml0cyA9IChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmVUw7Ci0JbG93X2JpdHMgPSAocmVncy0+cGh5c19hZGRyICYgMHhmZmZmZmZmZlVMKTsKLQotCWlmICh0eXBlID09IDAgfHwgdHlwZSA9PSA4KSB7Ci0JCWNvbnN0IGNoYXIgKnByZWZpeCA9ICh0eXBlID09IDApID8gIm0iIDogImkiOwotCi0JCWlmIChsb3dfYml0cykKLQkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgsJXgiLAotCQkJCWRwLT5uYW1lLCBwcmVmaXgsCi0JCQkJaGlnaF9iaXRzLCBsb3dfYml0cyk7Ci0JCWVsc2UKLQkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgiLAotCQkJCWRwLT5uYW1lLAotCQkJCXByZWZpeCwKLQkJCQloaWdoX2JpdHMpOwotCX0gZWxzZSBpZiAodHlwZSA9PSAxMikgewotCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCi0JCQlkcC0+bmFtZSwgaGlnaF9iaXRzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzdW40dV9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQotewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JaWYgKCFwcm9wKQotCQlyZXR1cm47Ci0KLQlyZWdzID0gcHJvcC0+dmFsdWU7Ci0JaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKLQkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAotCQkJZHAtPm5hbWUsCi0JCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAotCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1cGEtcG9ydGlkIiwgTlVMTCk7Ci0JaWYgKCFwcm9wKQotCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInBvcnRpZCIsIE5VTEwpOwotCWlmIChwcm9wKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotCQlpZiAodGxiX3R5cGUgPj0gY2hlZXRhaCkKLQkJCW1hc2sgPSAweDdmZmZmZjsKLQotCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCi0JCQlkcC0+bmFtZSwKLQkJCSoodTMyICopcHJvcC0+dmFsdWUsCi0JCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyICYgbWFzaykpOwotCX0KLX0KLQotLyogIm5hbWVAc2xvdCxvZmZzZXQiICAqLwotc3RhdGljIHZvaWQgX19pbml0IHNidXNfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKLXsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCi0JCWRwLT5uYW1lLAotCQlyZWdzLT53aGljaF9pbywKLQkJcmVncy0+cGh5c19hZGRyKTsKLX0KLQotLyogIm5hbWVAZGV2bnVtWyxmdW5jXSIgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKLXsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpyZWdzOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQl1bnNpZ25lZCBpbnQgZGV2Zm47Ci0KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcHJvcCkKLQkJcmV0dXJuOwotCi0JcmVncyA9IHByb3AtPnZhbHVlOwotCWRldmZuID0gKHJlZ3MtPnBoeXNfaGkgPj4gOCkgJiAweGZmOwotCWlmIChkZXZmbiAmIDB4MDcpIHsKLQkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAotCQkJZHAtPm5hbWUsCi0JCQlkZXZmbiA+PiAzLAotCQkJZGV2Zm4gJiAweDA3KTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCi0JCQlkcC0+bmFtZSwKLQkJCWRldmZuID4+IDMpOwotCX0KLX0KLQotLyogIm5hbWVAVVBBX1BPUlRJRCxvZmZzZXQiICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdXBhX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidXBhLXBvcnRpZCIsIE5VTEwpOwotCWlmICghcHJvcCkKLQkJcmV0dXJuOwotCi0Jc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAotCQlkcC0+bmFtZSwKLQkJKih1MzIgKikgcHJvcC0+dmFsdWUsCi0JCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKLX0KLQotLyogIm5hbWVAcmVnIiAqLwotc3RhdGljIHZvaWQgX19pbml0IHZkZXZfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0JdTMyICpyZWdzOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQotCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4IiwgZHAtPm5hbWUsICpyZWdzKTsKLX0KLQotLyogIm5hbWVAYWRkcmhpLGFkZHJsbyIgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlYnVzX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQotCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKLQkJZHAtPm5hbWUsCi0JCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCksCi0JCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKLX0KLQotLyogIm5hbWVAYnVzLGFkZHIiICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaTJjX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCXUzMiAqcmVnczsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JaWYgKCFwcm9wKQotCQlyZXR1cm47Ci0KLQlyZWdzID0gcHJvcC0+dmFsdWU7Ci0KLQkvKiBUaGlzIGFjdHVhbGx5IGlzbid0IHJpZ2h0Li4uIHNob3VsZCBsb29rIGF0IHRoZSAjYWRkcmVzcy1jZWxscwotCSAqIHByb3BlcnR5IG9mIHRoZSBpMmMgYnVzIG5vZGUgZXRjLiBldGMuCi0JICovCi0Jc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAotCQlkcC0+bmFtZSwgcmVnc1swXSwgcmVnc1sxXSk7Ci19Ci0KLS8qICJuYW1lQHJlZzBbLHJlZzFdIiAqLwotc3RhdGljIHZvaWQgX19pbml0IHVzYl9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQl1MzIgKnJlZ3M7Ci0KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcHJvcCkKLQkJcmV0dXJuOwotCi0JcmVncyA9IHByb3AtPnZhbHVlOwotCi0JaWYgKHByb3AtPmxlbmd0aCA9PSBzaXplb2YodTMyKSB8fCByZWdzWzFdID09IDEpIHsKLQkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgiLAotCQkJZHAtPm5hbWUsIHJlZ3NbMF0pOwotCX0gZWxzZSB7Ci0JCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKLQkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKLQl9Ci19Ci0KLS8qICJuYW1lQHJlZzByZWcxWyxyZWcycmVnM10iICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaWVlZTEzOTRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0JdTMyICpyZWdzOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybjsKLQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQotCWlmIChyZWdzWzJdIHx8IHJlZ3NbM10pIHsKLQkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJTA4eCUwOHgsJTA0eCUwOHgiLAotCQkJZHAtPm5hbWUsIHJlZ3NbMF0sIHJlZ3NbMV0sIHJlZ3NbMl0sIHJlZ3NbM10pOwotCX0gZWxzZSB7Ci0JCXNwcmludGYodG1wX2J1ZiwgIiVzQCUwOHglMDh4IiwKLQkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBfX2J1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OwotCi0JaWYgKHBhcmVudCAhPSBOVUxMKSB7Ci0JCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpIHx8Ci0JCSAgICAhc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaWV4IikpIHsKLQkJCXBjaV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAic2J1cyIpKSB7Ci0JCQlzYnVzX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ1cGEiKSkgewotCQkJdXBhX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJlYnVzIikpIHsKLQkJCWVidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghc3RyY21wKHBhcmVudC0+bmFtZSwgInVzYiIpIHx8Ci0JCSAgICAhc3RyY21wKHBhcmVudC0+bmFtZSwgImh1YiIpKSB7Ci0JCQl1c2JfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImkyYyIpKSB7Ci0JCQlpMmNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImZpcmV3aXJlIikpIHsKLQkJCWllZWUxMzk0X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ2aXJ0dWFsLWRldmljZXMiKSkgewotCQkJdmRldl9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogImlzYSIgaXMgaGFuZGxlZCB3aXRoIHBsYXRmb3JtIG5hbWluZyAqLwotCX0KLQotCS8qIFVzZSBwbGF0Zm9ybSBuYW1pbmcgY29udmVudGlvbi4gICovCi0JaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKLQkJc3VuNHZfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJc3VuNHVfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCX0KLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQljaGFyIHRtcF9idWZbNjRdLCAqbjsKLQotCXRtcF9idWZbMF0gPSAnXDAnOwotCV9fYnVpbGRfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCWlmICh0bXBfYnVmWzBdID09ICdcMCcpCi0JCXN0cmNweSh0bXBfYnVmLCBkcC0+bmFtZSk7Ci0KLQluID0gcHJvbV9lYXJseV9hbGxvYyhzdHJsZW4odG1wX2J1ZikgKyAxKTsKLQlzdHJjcHkobiwgdG1wX2J1Zik7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfZnVsbF9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0JaW50IGxlbiwgb3VybGVuLCBwbGVuOwotCWNoYXIgKm47Ci0KLQlwbGVuID0gc3RybGVuKGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7Ci0Jb3VybGVuID0gc3RybGVuKGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQlsZW4gPSBvdXJsZW4gKyBwbGVuICsgMjsKLQotCW4gPSBwcm9tX2Vhcmx5X2FsbG9jKGxlbik7Ci0Jc3RyY3B5KG4sIGRwLT5wYXJlbnQtPmZ1bGxfbmFtZSk7Ci0JaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKLQkJc3RyY3B5KG4gKyBwbGVuLCAiLyIpOwotCQlwbGVuKys7Ci0JfQotCXN0cmNweShuICsgcGxlbiwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOwotCi1zdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX29uZV9wcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldiwgY2hhciAqc3BlY2lhbF9uYW1lLCB2b2lkICpzcGVjaWFsX3ZhbCwgaW50IHNwZWNpYWxfbGVuKQotewotCXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKnRtcCA9IE5VTEw7Ci0Jc3RydWN0IHByb3BlcnR5ICpwOwotCi0JaWYgKHRtcCkgewotCQlwID0gdG1wOwotCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSArIDMyKTsKLQkJdG1wID0gTlVMTDsKLQl9IGVsc2UgewotCQlwID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IHByb3BlcnR5KSArIDMyKTsKLQkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JfQotCi0JcC0+bmFtZSA9IChjaGFyICopIChwICsgMSk7Ci0JaWYgKHNwZWNpYWxfbmFtZSkgewotCQlzdHJjcHkocC0+bmFtZSwgc3BlY2lhbF9uYW1lKTsKLQkJcC0+bGVuZ3RoID0gc3BlY2lhbF9sZW47Ci0JCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhzcGVjaWFsX2xlbik7Ci0JCW1lbWNweShwLT52YWx1ZSwgc3BlY2lhbF92YWwsIHNwZWNpYWxfbGVuKTsKLQl9IGVsc2UgewotCQlpZiAocHJldiA9PSBOVUxMKSB7Ci0JCQlwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByb21fbmV4dHByb3Aobm9kZSwgcHJldiwgcC0+bmFtZSk7Ci0JCX0KLQkJaWYgKHN0cmxlbihwLT5uYW1lKSA9PSAwKSB7Ci0JCQl0bXAgPSBwOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcC0+bGVuZ3RoID0gcHJvbV9nZXRwcm9wbGVuKG5vZGUsIHAtPm5hbWUpOwotCQlpZiAocC0+bGVuZ3RoIDw9IDApIHsKLQkJCXAtPmxlbmd0aCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2MocC0+bGVuZ3RoICsgMSk7Ci0JCQlwcm9tX2dldHByb3BlcnR5KG5vZGUsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5sZW5ndGgpOwotCQkJKCh1bnNpZ25lZCBjaGFyICopcC0+dmFsdWUpW3AtPmxlbmd0aF0gPSAnXDAnOwotCQl9Ci0JfQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX3Byb3BfbGlzdChwaGFuZGxlIG5vZGUpCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpoZWFkLCAqdGFpbDsKLQotCWhlYWQgPSB0YWlsID0gYnVpbGRfb25lX3Byb3Aobm9kZSwgTlVMTCwKLQkJCQkgICAgICIubm9kZSIsICZub2RlLCBzaXplb2Yobm9kZSkpOwotCi0JdGFpbC0+bmV4dCA9IGJ1aWxkX29uZV9wcm9wKG5vZGUsIE5VTEwsIE5VTEwsIE5VTEwsIDApOwotCXRhaWwgPSB0YWlsLT5uZXh0OwotCXdoaWxlKHRhaWwpIHsKLQkJdGFpbC0+bmV4dCA9IGJ1aWxkX29uZV9wcm9wKG5vZGUsIHRhaWwtPm5hbWUsCi0JCQkJCSAgICBOVUxMLCBOVUxMLCAwKTsKLQkJdGFpbCA9IHRhaWwtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIGhlYWQ7Ci19Ci0KLXN0YXRpYyBjaGFyICogX19pbml0IGdldF9vbmVfcHJvcGVydHkocGhhbmRsZSBub2RlLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNoYXIgKmJ1ZiA9ICI8TlVMTD4iOwotCWludCBsZW47Ci0KLQlsZW4gPSBwcm9tX2dldHByb3BsZW4obm9kZSwgbmFtZSk7Ci0JaWYgKGxlbiA+IDApIHsKLQkJYnVmID0gcHJvbV9lYXJseV9hbGxvYyhsZW4pOwotCQlwcm9tX2dldHByb3BlcnR5KG5vZGUsIG5hbWUsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogX19pbml0IGNyZWF0ZV9ub2RlKHBoYW5kbGUgbm9kZSwgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcDsKLQotCWlmICghbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKCpkcCkpOwotCWRwLT51bmlxdWVfaWQgPSB1bmlxdWVfaWQrKzsKLQlkcC0+cGFyZW50ID0gcGFyZW50OwotCi0Ja3JlZl9pbml0KCZkcC0+a3JlZik7Ci0KLQlkcC0+bmFtZSA9IGdldF9vbmVfcHJvcGVydHkobm9kZSwgIm5hbWUiKTsKLQlkcC0+dHlwZSA9IGdldF9vbmVfcHJvcGVydHkobm9kZSwgImRldmljZV90eXBlIik7Ci0JZHAtPm5vZGUgPSBub2RlOwotCi0JZHAtPnByb3BlcnRpZXMgPSBidWlsZF9wcm9wX2xpc3Qobm9kZSk7Ci0KLQlpcnFfdHJhbnNfaW5pdChkcCk7Ci0KLQlyZXR1cm4gZHA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgYnVpbGRfdHJlZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgcGhhbmRsZSBub2RlLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKioqbmV4dHApCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpyZXQgPSBOVUxMLCAqcHJldl9zaWJsaW5nID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCi0Jd2hpbGUgKDEpIHsKLQkJZHAgPSBjcmVhdGVfbm9kZShub2RlLCBwYXJlbnQpOwotCQlpZiAoIWRwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHByZXZfc2libGluZykKLQkJCXByZXZfc2libGluZy0+c2libGluZyA9IGRwOwotCi0JCWlmICghcmV0KQotCQkJcmV0ID0gZHA7Ci0JCXByZXZfc2libGluZyA9IGRwOwotCi0JCSooKm5leHRwKSA9IGRwOwotCQkqbmV4dHAgPSAmZHAtPmFsbG5leHQ7Ci0KLQkJZHAtPnBhdGhfY29tcG9uZW50X25hbWUgPSBidWlsZF9wYXRoX2NvbXBvbmVudChkcCk7Ci0JCWRwLT5mdWxsX25hbWUgPSBidWlsZF9mdWxsX25hbWUoZHApOwotCi0JCWRwLT5jaGlsZCA9IGJ1aWxkX3RyZWUoZHAsIHByb21fZ2V0Y2hpbGQobm9kZSksIG5leHRwKTsKLQotCQlub2RlID0gcHJvbV9nZXRzaWJsaW5nKG5vZGUpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfbWlkX3Byb3Aodm9pZCkKLXsKLQlyZXR1cm4gKHRsYl90eXBlID09IHNwaXRmaXJlID8gInVwYS1wb3J0aWQiIDogInBvcnRpZCIpOwotfQotCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9jcHVpZChpbnQgY3B1aWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcDsKLQljb25zdCBjaGFyICptaWRfcHJvcCA9IGdldF9taWRfcHJvcCgpOwotCi0JZm9yX2VhY2hfbm9kZV9ieV90eXBlKGRwLCAiY3B1IikgewotCQlpbnQgaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsIG1pZF9wcm9wLCAtMSk7Ci0JCWNvbnN0IGNoYXIgKnRoaXNfbWlkX3Byb3AgPSBtaWRfcHJvcDsKLQotCQlpZiAoaWQgPCAwKSB7Ci0JCQl0aGlzX21pZF9wcm9wID0gImNwdWlkIjsKLQkJCWlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCB0aGlzX21pZF9wcm9wLCAtMSk7Ci0JCX0KLQotCQlpZiAoaWQgPCAwKSB7Ci0JCQlwcm9tX3ByaW50ZigiT0Y6IFNlcmlvdXMgcHJvYmxlbSwgY3B1IGxhY2tzICIKLQkJCQkgICAgIiVzIHByb3BlcnR5IiwgdGhpc19taWRfcHJvcCk7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCQlpZiAoY3B1aWQgPT0gaWQpCi0JCQlyZXR1cm4gZHA7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb2ZfZmlsbF9pbl9jcHVfZGF0YSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0JY29uc3QgY2hhciAqbWlkX3Byb3AgPSBnZXRfbWlkX3Byb3AoKTsKLQotCW5jcHVzX3Byb2JlZCA9IDA7Ci0JZm9yX2VhY2hfbm9kZV9ieV90eXBlKGRwLCAiY3B1IikgewotCQlpbnQgY3B1aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsIG1pZF9wcm9wLCAtMSk7Ci0JCWNvbnN0IGNoYXIgKnRoaXNfbWlkX3Byb3AgPSBtaWRfcHJvcDsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwb3J0aWRfcGFyZW50OwotCQlpbnQgcG9ydGlkID0gLTE7Ci0KLQkJcG9ydGlkX3BhcmVudCA9IE5VTEw7Ci0JCWlmIChjcHVpZCA8IDApIHsKLQkJCXRoaXNfbWlkX3Byb3AgPSAiY3B1aWQiOwotCQkJY3B1aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsIHRoaXNfbWlkX3Byb3AsIC0xKTsKLQkJCWlmIChjcHVpZCA+PSAwKSB7Ci0JCQkJaW50IGxpbWl0ID0gMjsKLQotCQkJCXBvcnRpZF9wYXJlbnQgPSBkcDsKLQkJCQl3aGlsZSAobGltaXQtLSkgewotCQkJCQlwb3J0aWRfcGFyZW50ID0gcG9ydGlkX3BhcmVudC0+cGFyZW50OwotCQkJCQlpZiAoIXBvcnRpZF9wYXJlbnQpCi0JCQkJCQlicmVhazsKLQkJCQkJcG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHBvcnRpZF9wYXJlbnQsCi0JCQkJCQkJCSAgICAgICAicG9ydGlkIiwgLTEpOwotCQkJCQlpZiAocG9ydGlkID49IDApCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3B1aWQgPCAwKSB7Ci0JCQlwcm9tX3ByaW50ZigiT0Y6IFNlcmlvdXMgcHJvYmxlbSwgY3B1IGxhY2tzICIKLQkJCQkgICAgIiVzIHByb3BlcnR5IiwgdGhpc19taWRfcHJvcCk7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCi0JCW5jcHVzX3Byb2JlZCsrOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCQlpZiAoY3B1aWQgPj0gTlJfQ1BVUykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSWdub3JpbmcgQ1BVICVkIHdoaWNoIGlzICIKLQkJCSAgICAgICAiPj0gTlJfQ1BVUyAoJWQpXG4iLAotCQkJICAgICAgIGNwdWlkLCBOUl9DUFVTKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZWxzZQotCQkvKiBPbiB1bmlwcm9jZXNzb3Igd2Ugb25seSB3YW50IHRoZSB2YWx1ZXMgZm9yIHRoZQotCQkgKiByZWFsIHBoeXNpY2FsIGNwdSB0aGUga2VybmVsIGJvb3RlZCBvbnRvLCBob3dldmVyCi0JCSAqIGNwdV9kYXRhKCkgb25seSBoYXMgb25lIGVudHJ5IGF0IGluZGV4IDAuCi0JCSAqLwotCQlpZiAoY3B1aWQgIT0gcmVhbF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCWNvbnRpbnVlOwotCQljcHVpZCA9IDA7Ci0jZW5kaWYKLQotCQljcHVfZGF0YShjcHVpZCkuY2xvY2tfdGljayA9Ci0JCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLCAwKTsKLQotCQlpZiAocG9ydGlkX3BhcmVudCkgewotCQkJY3B1X2RhdGEoY3B1aWQpLmRjYWNoZV9zaXplID0KLQkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJsMS1kY2FjaGUtc2l6ZSIsCi0JCQkJCQkgICAgICAxNiAqIDEwMjQpOwotCQkJY3B1X2RhdGEoY3B1aWQpLmRjYWNoZV9saW5lX3NpemUgPQotCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImwxLWRjYWNoZS1saW5lLXNpemUiLAotCQkJCQkJICAgICAgMzIpOwotCQkJY3B1X2RhdGEoY3B1aWQpLmljYWNoZV9zaXplID0KLQkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJsMS1pY2FjaGUtc2l6ZSIsCi0JCQkJCQkgICAgICA4ICogMTAyNCk7Ci0JCQljcHVfZGF0YShjcHVpZCkuaWNhY2hlX2xpbmVfc2l6ZSA9Ci0JCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibDEtaWNhY2hlLWxpbmUtc2l6ZSIsCi0JCQkJCQkgICAgICAzMik7Ci0JCQljcHVfZGF0YShjcHVpZCkuZWNhY2hlX3NpemUgPQotCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImwyLWNhY2hlLXNpemUiLCAwKTsKLQkJCWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfbGluZV9zaXplID0KLQkJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJsMi1jYWNoZS1saW5lLXNpemUiLCAwKTsKLQkJCWlmICghY3B1X2RhdGEoY3B1aWQpLmVjYWNoZV9zaXplIHx8Ci0JCQkgICAgIWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfbGluZV9zaXplKSB7Ci0JCQkJY3B1X2RhdGEoY3B1aWQpLmVjYWNoZV9zaXplID0KLQkJCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHBvcnRpZF9wYXJlbnQsCi0JCQkJCQkJICAgICAgImwyLWNhY2hlLXNpemUiLAotCQkJCQkJCSAgICAgICg0ICogMTAyNCAqIDEwMjQpKTsKLQkJCQljcHVfZGF0YShjcHVpZCkuZWNhY2hlX2xpbmVfc2l6ZSA9Ci0JCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChwb3J0aWRfcGFyZW50LAotCQkJCQkJCSAgICAgICJsMi1jYWNoZS1saW5lLXNpemUiLCA2NCk7Ci0JCQl9Ci0KLQkJCWNwdV9kYXRhKGNwdWlkKS5jb3JlX2lkID0gcG9ydGlkICsgMTsKLQkJCWNwdV9kYXRhKGNwdWlkKS5wcm9jX2lkID0gcG9ydGlkOwotI2lmZGVmIENPTkZJR19TTVAKLQkJCXNwYXJjNjRfbXVsdGlfY29yZSA9IDE7Ci0jZW5kaWYKLQkJfSBlbHNlIHsKLQkJCWNwdV9kYXRhKGNwdWlkKS5kY2FjaGVfc2l6ZSA9Ci0JCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZGNhY2hlLXNpemUiLCAxNiAqIDEwMjQpOwotCQkJY3B1X2RhdGEoY3B1aWQpLmRjYWNoZV9saW5lX3NpemUgPQotCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRjYWNoZS1saW5lLXNpemUiLCAzMik7Ci0KLQkJCWNwdV9kYXRhKGNwdWlkKS5pY2FjaGVfc2l6ZSA9Ci0JCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiaWNhY2hlLXNpemUiLCAxNiAqIDEwMjQpOwotCQkJY3B1X2RhdGEoY3B1aWQpLmljYWNoZV9saW5lX3NpemUgPQotCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImljYWNoZS1saW5lLXNpemUiLCAzMik7Ci0KLQkJCWNwdV9kYXRhKGNwdWlkKS5lY2FjaGVfc2l6ZSA9Ci0JCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZWNhY2hlLXNpemUiLAotCQkJCQkJICAgICAgKDQgKiAxMDI0ICogMTAyNCkpOwotCQkJY3B1X2RhdGEoY3B1aWQpLmVjYWNoZV9saW5lX3NpemUgPQotCQkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImVjYWNoZS1saW5lLXNpemUiLCA2NCk7Ci0KLQkJCWNwdV9kYXRhKGNwdWlkKS5jb3JlX2lkID0gMDsKLQkJCWNwdV9kYXRhKGNwdWlkKS5wcm9jX2lkID0gLTE7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TTVAKLQkJY3B1X3NldChjcHVpZCwgY3B1X3ByZXNlbnRfbWFwKTsKLQkJY3B1X3NldChjcHVpZCwgY3B1X3Bvc3NpYmxlX21hcCk7Ci0jZW5kaWYKLQl9Ci0KLQlzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCk7Ci19Ci0KLXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfY29uc29sZV9kZXZpY2U7Ci1FWFBPUlRfU1lNQk9MKG9mX2NvbnNvbGVfZGV2aWNlKTsKLQotY2hhciAqb2ZfY29uc29sZV9wYXRoOwotRVhQT1JUX1NZTUJPTChvZl9jb25zb2xlX3BhdGgpOwotCi1jaGFyICpvZl9jb25zb2xlX29wdGlvbnM7Ci1FWFBPUlRfU1lNQk9MKG9mX2NvbnNvbGVfb3B0aW9ucyk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvZl9jb25zb2xlX2luaXQodm9pZCkKLXsKLQljaGFyICptc2cgPSAiT0Ygc3Rkb3V0IGRldmljZSBpczogJXNcbiI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcDsKLQljb25zdCBjaGFyICp0eXBlOwotCXBoYW5kbGUgbm9kZTsKLQotCW9mX2NvbnNvbGVfcGF0aCA9IHByb21fZWFybHlfYWxsb2MoMjU2KTsKLQlpZiAocHJvbV9paGFuZGxlMnBhdGgocHJvbV9zdGRvdXQsIG9mX2NvbnNvbGVfcGF0aCwgMjU2KSA8IDApIHsKLQkJcHJvbV9wcmludGYoIkNhbm5vdCBvYnRhaW4gcGF0aCBvZiBzdGRvdXQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCW9mX2NvbnNvbGVfb3B0aW9ucyA9IHN0cnJjaHIob2ZfY29uc29sZV9wYXRoLCAnOicpOwotCWlmIChvZl9jb25zb2xlX29wdGlvbnMpIHsKLQkJb2ZfY29uc29sZV9vcHRpb25zKys7Ci0JCWlmICgqb2ZfY29uc29sZV9vcHRpb25zID09ICdcMCcpCi0JCQlvZl9jb25zb2xlX29wdGlvbnMgPSBOVUxMOwotCX0KLQotCW5vZGUgPSBwcm9tX2luc3QycGtnKHByb21fc3Rkb3V0KTsKLQlpZiAoIW5vZGUpIHsKLQkJcHJvbV9wcmludGYoIkNhbm5vdCByZXNvbHZlIHN0ZG91dCBub2RlIGZyb20gIgotCQkJICAgICJpbnN0YW5jZSAlMDh4LlxuIiwgcHJvbV9zdGRvdXQpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0KLQlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKG5vZGUpOwotCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOwotCWlmICghdHlwZSkgewotCQlwcm9tX3ByaW50ZigiQ29uc29sZSBzdGRvdXQgbGFja3MgZGV2aWNlX3R5cGUgcHJvcGVydHkuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JaWYgKHN0cmNtcCh0eXBlLCAiZGlzcGxheSIpICYmIHN0cmNtcCh0eXBlLCAic2VyaWFsIikpIHsKLQkJcHJvbV9wcmludGYoIkNvbnNvbGUgZGV2aWNlX3R5cGUgaXMgbmVpdGhlciBkaXNwbGF5ICIKLQkJCSAgICAibm9yIHNlcmlhbC5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0KLQlvZl9jb25zb2xlX2RldmljZSA9IGRwOwotCi0JcHJpbnRrKG1zZywgb2ZfY29uc29sZV9wYXRoKTsKLX0KLQotdm9pZCBfX2luaXQgcHJvbV9idWlsZF9kZXZpY2V0cmVlKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICoqbmV4dHA7Ci0KLQlhbGxub2RlcyA9IGNyZWF0ZV9ub2RlKHByb21fcm9vdF9ub2RlLCBOVUxMKTsKLQlhbGxub2Rlcy0+cGF0aF9jb21wb25lbnRfbmFtZSA9ICIiOwotCWFsbG5vZGVzLT5mdWxsX25hbWUgPSAiLyI7Ci0KLQluZXh0cCA9ICZhbGxub2Rlcy0+YWxsbmV4dDsKLQlhbGxub2Rlcy0+Y2hpbGQgPSBidWlsZF90cmVlKGFsbG5vZGVzLAotCQkJCSAgICAgcHJvbV9nZXRjaGlsZChhbGxub2Rlcy0+bm9kZSksCi0JCQkJICAgICAmbmV4dHApOwotCW9mX2NvbnNvbGVfaW5pdCgpOwotCi0JcHJpbnRrKCJQUk9NOiBCdWlsdCBkZXZpY2UgdHJlZSB3aXRoICV1IGJ5dGVzIG9mIG1lbW9yeS5cbiIsCi0JICAgICAgIHByb21fZWFybHlfYWxsb2NhdGVkKTsKLQotCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKQotCQlvZl9maWxsX2luX2NwdV9kYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjgwOTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qIGxkIHNjcmlwdCB0byBtYWtlIFVsdHJhTGludXgga2VybmVsICovCi0KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+Ci0KLU9VVFBVVF9GT1JNQVQoImVsZjY0LXNwYXJjIiwgImVsZjY0LXNwYXJjIiwgImVsZjY0LXNwYXJjIikKLU9VVFBVVF9BUkNIKHNwYXJjOnY5YSkKLUVOVFJZKF9zdGFydCkKLQotamlmZmllcyA9IGppZmZpZXNfNjQ7Ci1TRUNUSU9OUwotewotCXN3YXBwZXJfbG93X3BtZF9kaXIgPSAweDAwMDAwMDAwMDA0MDIwMDA7Ci0JLiA9IDB4NDAwMDsKLQkudGV4dCAweDAwMDAwMDAwMDA0MDQwMDAgOiB7Ci0JCV90ZXh0ID0gLjsKLQkJVEVYVF9URVhUCi0JCVNDSEVEX1RFWFQKLQkJTE9DS19URVhUCi0JCUtQUk9CRVNfVEVYVAotCQkqKC5nbnUud2FybmluZykKLQl9ID0gMAotCV9ldGV4dCA9IC47Ci0JUFJPVklERSAoZXRleHQgPSAuKTsKLQotCVJPX0RBVEEoUEFHRV9TSVpFKQotCS5kYXRhIDogewotCQlEQVRBX0RBVEEKLQkJQ09OU1RSVUNUT1JTCi0JfQotCS5kYXRhMSA6IHsKLQkJKiguZGF0YTEpCi0JfQotCS4gPSBBTElHTig2NCk7Ci0JLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0JfQotCS4gPSBBTElHTig2NCk7Ci0JLmRhdGEucmVhZF9tb3N0bHkgOiB7Ci0JCSooLmRhdGEucmVhZF9tb3N0bHkpCi0JfQotCV9lZGF0YSA9IC47Ci0JUFJPVklERSAoZWRhdGEgPSAuKTsKLQkuZml4dXAgOiB7Ci0JCSooLmZpeHVwKQotCX0KLQkuID0gQUxJR04oMTYpOwotCV9fZXhfdGFibGUgOiB7Ci0JCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JCSooX19leF90YWJsZSkKLQkJX19zdG9wX19fZXhfdGFibGUgPSAuOwotCX0KLQlOT1RFUwotCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmluaXQudGV4dCA6IHsKLQkJX19pbml0X2JlZ2luID0gLjsKLQkJX3Npbml0dGV4dCA9IC47Ci0JCUlOSVRfVEVYVAotCQlfZWluaXR0ZXh0ID0gLjsKLQl9Ci0JLmluaXQuZGF0YSA6IHsKLQkJSU5JVF9EQVRBCi0JfQotCS4gPSBBTElHTigxNik7Ci0JLmluaXQuc2V0dXAgOiB7Ci0JCV9fc2V0dXBfc3RhcnQgPSAuOwotCQkqKC5pbml0LnNldHVwKQotCQlfX3NldHVwX2VuZCA9IC47Ci0JfQotCS5pbml0Y2FsbC5pbml0IDogewotCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJSU5JVENBTExTCi0JCV9faW5pdGNhbGxfZW5kID0gLjsKLQl9Ci0JLmNvbl9pbml0Y2FsbC5pbml0IDogewotCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47Ci0JCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwotCX0KLQlTRUNVUklUWV9JTklUCi0KLQkuID0gQUxJR04oNCk7Ci0JLnRzYl9sZHF1YWRfcGh5c19wYXRjaCA6IHsKLQkJX190c2JfbGRxdWFkX3BoeXNfcGF0Y2ggPSAuOwotCQkqKC50c2JfbGRxdWFkX3BoeXNfcGF0Y2gpCi0JCV9fdHNiX2xkcXVhZF9waHlzX3BhdGNoX2VuZCA9IC47Ci0JfQotCi0JLnRzYl9waHlzX3BhdGNoIDogewotCQlfX3RzYl9waHlzX3BhdGNoID0gLjsKLQkJKigudHNiX3BoeXNfcGF0Y2gpCi0JCV9fdHNiX3BoeXNfcGF0Y2hfZW5kID0gLjsKLQl9Ci0KLQkuY3B1aWRfcGF0Y2ggOiB7Ci0JCV9fY3B1aWRfcGF0Y2ggPSAuOwotCQkqKC5jcHVpZF9wYXRjaCkKLQkJX19jcHVpZF9wYXRjaF9lbmQgPSAuOwotCX0KLQotCS5zdW40dl8xaW5zbl9wYXRjaCA6IHsKLQkJX19zdW40dl8xaW5zbl9wYXRjaCA9IC47Ci0JCSooLnN1bjR2XzFpbnNuX3BhdGNoKQotCQlfX3N1bjR2XzFpbnNuX3BhdGNoX2VuZCA9IC47Ci0JfQotCS5zdW40dl8yaW5zbl9wYXRjaCA6IHsKLQkJX19zdW40dl8yaW5zbl9wYXRjaCA9IC47Ci0JCSooLnN1bjR2XzJpbnNuX3BhdGNoKQotCQlfX3N1bjR2XzJpbnNuX3BhdGNoX2VuZCA9IC47Ci0JfQotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmluaXQucmFtZnMgOiB7Ci0JCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5yYW1mcykKLQkJX19pbml0cmFtZnNfZW5kID0gLjsKLQl9Ci0jZW5kaWYKLQotCVBFUkNQVShQQUdFX1NJWkUpCi0KLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX2luaXRfZW5kID0gLjsKLQlfX2Jzc19zdGFydCA9IC47Ci0JLnNic3MgOiB7Ci0JCSooLnNic3MpCi0JCSooLnNjb21tb24pCi0JfQotCS5ic3MgOiB7Ci0JCSooLmR5bmJzcykKLQkJKiguYnNzKQotCQkqKENPTU1PTikKLQl9Ci0JX2VuZCA9IC4gOwotCVBST1ZJREUgKGVuZCA9IC4pOwotCi0JL0RJU0NBUkQvIDogewotCQlFWElUX1RFWFQKLQkJRVhJVF9EQVRBCi0JCSooLmV4aXRjYWxsLmV4aXQpCi0JfQotCi0JU1RBQlNfREVCVUcKLQlEV0FSRl9ERUJVRwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTVlMTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIFNwYXJjNjQgbGlicmFyeSBmaWxlcy4uCi0jCi0KLUVYVFJBX0FGTEFHUyA6PSAtYW5zaQotRVhUUkFfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotbGliLXkgOj0gUGVlQ2VlSS5vIGNvcHlfcGFnZS5vIGNsZWFyX3BhZ2UubyBzdHJsZW4ubyBzdHJuY21wLm8gXAotCSBtZW1zY2FuLm8gc3RybmNweV9mcm9tX3VzZXIubyBzdHJsZW5fdXNlci5vIG1lbWNtcC5vIGNoZWNrc3VtLm8gXAotCSBiemVyby5vIGNzdW1fY29weS5vIGNzdW1fY29weV9mcm9tX3VzZXIubyBjc3VtX2NvcHlfdG9fdXNlci5vIFwKLQkgVklTc2F2ZS5vIGF0b21pYy5vIGJpdG9wcy5vIFwKLQkgVTFtZW1jcHkubyBVMWNvcHlfZnJvbV91c2VyLm8gVTFjb3B5X3RvX3VzZXIubyBcCi0JIFUzbWVtY3B5Lm8gVTNjb3B5X2Zyb21fdXNlci5vIFUzY29weV90b191c2VyLm8gVTNwYXRjaC5vIFwKLQkgTkdtZW1jcHkubyBOR2NvcHlfZnJvbV91c2VyLm8gTkdjb3B5X3RvX3VzZXIubyBOR3BhdGNoLm8gXAotCSBOR3BhZ2UubyBOR2J6ZXJvLm8gXAotCSBORzJtZW1jcHkubyBORzJjb3B5X2Zyb21fdXNlci5vIE5HMmNvcHlfdG9fdXNlci5vIE5HMnBhdGNoLm8gXAotCSBORzJwYWdlLm8gXAotCSBHRU5tZW1jcHkubyBHRU5jb3B5X2Zyb21fdXNlci5vIEdFTmNvcHlfdG9fdXNlci5vIEdFTnBhdGNoLm8gXAotCSBHRU5wYWdlLm8gR0VOYnplcm8ubyBcCi0JIGNvcHlfaW5fdXNlci5vIHVzZXJfZml4dXAubyBtZW1tb3ZlLm8gXAotCSBtY291bnQubyBpcGNzdW0ubyByd3NlbS5vIHhvci5vCi0KLW9iai15ICs9IGlvbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvaW9tYXAuYyBiL2FyY2gvc3BhcmM2NC9saWIvaW9tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMGViYi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2lvbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogSW1wbGVtZW50IHRoZSBzcGFyYzY0IGlvbWFwIGludGVyZmFjZXMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKiBDcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhbiBJTyBwb3J0IHJhbmdlICovCi12b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikgKHVuc2lnbmVkIGxvbmcpIHBvcnQ7Ci19Ci0KLXZvaWQgaW9wb3J0X3VubWFwKHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi19Ci1FWFBPUlRfU1lNQk9MKGlvcG9ydF9tYXApOwotRVhQT1JUX1NZTUJPTChpb3BvcnRfdW5tYXApOwotCi0vKiBDcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhIFBDSSBCQVIgKG1lbW9yeSBvciBJTykgKi8KLXZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuKQotewotCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhcik7Ci0JcmVzb3VyY2Vfc2l6ZV90IGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBiYXIpOwotCi0JaWYgKCFsZW4gfHwgIXN0YXJ0KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWF4bGVuICYmIGxlbiA+IG1heGxlbikKLQkJbGVuID0gbWF4bGVuOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCXJldHVybiBpb3BvcnRfbWFwKHN0YXJ0LCBsZW4pOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7Ci0JCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfQ0FDSEVBQkxFKQotCQkJcmV0dXJuIGlvcmVtYXAoc3RhcnQsIGxlbik7Ci0JCXJldHVybiBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7Ci0JfQotCS8qIFdoYXQ/ICovCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgcGNpX2lvdW5tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCBfX2lvbWVtICogYWRkcikKLXsKLQkvKiBub3RoaW5nIHRvIGRvICovCi19Ci1FWFBPUlRfU1lNQk9MKHBjaV9pb21hcCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9pb3VubWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvbWVtY21wLlMgYi9hcmNoL3NwYXJjNjQvbGliL21lbWNtcC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZkYWE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9saWIvbWVtY21wLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogU3BhcmM2NCBvcHRpbWl6ZWQgbWVtY21wIGNvZGUuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQotICovCi0KLQkudGV4dAotCS5hbGlnbgkzMgotCS5nbG9ibAlfX21lbWNtcCwgbWVtY21wCi1fX21lbWNtcDoKLW1lbWNtcDoKLQljbXAJJW8yLCAwCQkhIElFVTEJR3JvdXAKLWxvb3A6CWJlLHBuCSVpY2MsIHJldF8wCSEgQ1RJCi0JIG5vcAkJCSEgSUVVMAotCWxkdWIJWyVvMF0sICVnNwkhIExTVQlHcm91cAotCWxkdWIJWyVvMV0sICVnMwkhIExTVQlHcm91cAotCXN1YgklbzIsIDEsICVvMgkhIElFVTAKLQlhZGQJJW8wLCAxLCAlbzAJISBJRVUxCi0JYWRkCSVvMSwgMSwgJW8xCSEgSUVVMAlHcm91cAotCXN1YmNjCSVnNywgJWczLCAlZzMJISBJRVUxCUdyb3VwCi0JYmUscHQJJWljYywgbG9vcAkhIENUSQotCSBjbXAJJW8yLCAwCQkhIElFVTEJR3JvdXAKLQotcmV0X24wOglyZXRsCi0JIG1vdgklZzMsICVvMAotcmV0XzA6CXJldGwKLQkgbW92CTAsICVvMApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9zdHJsZW4uUyBiL2FyY2gvc3BhcmM2NC9saWIvc3RybGVuLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmExOTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9zdHJsZW4uUworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIHN0cmxlbi5TOiBTcGFyYzY0IG9wdGltaXplZCBzdHJsZW4gY29kZQotICogSGFuZCBvcHRpbWl6ZWQgZnJvbSBHTlUgbGliYydzIHN0cmxlbgotICogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0gKi8KLQotI2RlZmluZSBMT19NQUdJQyAweDAxMDEwMTAxCi0jZGVmaW5lIEhJX01BR0lDIDB4ODA4MDgwODAKLQotCS5hbGlnbgkzMgotCS5nbG9ibAlzdHJsZW4KLQkudHlwZQlzdHJsZW4sI2Z1bmN0aW9uCi1zdHJsZW46Ci0JbW92CSVvMCwgJW8xCi0JYW5kY2MJJW8wLCAzLCAlZzAKLQliZSxwdAklaWNjLCA5ZgotCSBzZXRoaQklaGkoSElfTUFHSUMpLCAlbzQKLQlsZHViCVslbzBdLCAlbzUKLQlicnoscG4JJW81LCAxMWYKLQkgYWRkCSVvMCwgMSwgJW8wCi0JYW5kY2MJJW8wLCAzLCAlZzAKLQliZSxwbgklaWNjLCA0ZgotCSBvcgklbzQsICVsbyhISV9NQUdJQyksICVvMwotCWxkdWIJWyVvMF0sICVvNQotCWJyeixwbgklbzUsIDEyZgotCSBhZGQJJW8wLCAxLCAlbzAKLQlhbmRjYwklbzAsIDMsICVnMAotCWJlLHB0CSVpY2MsIDVmCi0JIHNldGhpCSVoaShMT19NQUdJQyksICVvNAotCWxkdWIJWyVvMF0sICVvNQotCWJyeixwbgklbzUsIDEzZgotCSBhZGQJJW8wLCAxLCAlbzAKLQliYSxwdAklaWNjLCA4ZgotCSBvcgklbzQsICVsbyhMT19NQUdJQyksICVvMgotOToKLQlvcgklbzQsICVsbyhISV9NQUdJQyksICVvMwotNDoKLQlzZXRoaQklaGkoTE9fTUFHSUMpLCAlbzQKLTU6Ci0Jb3IJJW80LCAlbG8oTE9fTUFHSUMpLCAlbzIKLTg6Ci0JbGQJWyVvMF0sICVvNQotMjoKLQlzdWIJJW81LCAlbzIsICVvNAotCWFuZGNjCSVvNCwgJW8zLCAlZzAKLQliZSxwdAklaWNjLCA4YgotCSBhZGQJJW8wLCA0LCAlbzAKLQotCS8qIENoZWNrIGV2ZXJ5IGJ5dGUuICovCi0Jc3JsCSVvNSwgMjQsICVnNwotCWFuZGNjCSVnNywgMHhmZiwgJWcwCi0JYmUscG4JJWljYywgMWYKLQkgYWRkCSVvMCwgLTQsICVvNAotCXNybAklbzUsIDE2LCAlZzcKLQlhbmRjYwklZzcsIDB4ZmYsICVnMAotCWJlLHBuCSVpY2MsIDFmCi0JIGFkZAklbzQsIDEsICVvNAotCXNybAklbzUsIDgsICVnNwotCWFuZGNjCSVnNywgMHhmZiwgJWcwCi0JYmUscG4JJWljYywgMWYKLQkgYWRkCSVvNCwgMSwgJW80Ci0JYW5kY2MJJW81LCAweGZmLCAlZzAKLQlibmUsYSxwdCAlaWNjLCAyYgotCSBsZAlbJW8wXSwgJW81Ci0JYWRkCSVvNCwgMSwgJW80Ci0xOgotCXJldGwKLQkgc3ViCSVvNCwgJW8xLCAlbzAKLTExOgotCXJldGwKLQkgbW92CTAsICVvMAotMTI6Ci0JcmV0bAotCSBtb3YJMSwgJW8wCi0xMzoKLQlyZXRsCi0JIG1vdgkyLCAlbzAKLQotCS5zaXplCXN0cmxlbiwgLi1zdHJsZW4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9tYXRoLWVtdS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1Y2I5Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvbWF0aC1lbXUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBGUFUgaW5zdHJ1Y3Rpb24gZW11bGF0aW9uLgotIwotCi1vYmoteSAgICA6PSBtYXRoLm8KLQotRVhUUkFfQ0ZMQUdTID0gLUlpbmNsdWRlL21hdGgtZW11IC13CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQvbW0vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDA0YzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYzY0L21tL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIE1ha2VmaWxlIGZvciB0aGUgbGludXggU3BhcmM2NC1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZXIuCi0jCi0KLUVYVFJBX0FGTEFHUyA6PSAtYW5zaQotRVhUUkFfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotb2JqLXkgICAgOj0gdWx0cmEubyB0bGIubyB0c2IubyBmYXVsdC5vIGluaXQubyBnZW5lcmljLm8KLQotb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkgKz0gaHVnZXRsYnBhZ2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L29wcm9maWxlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZlY2ExLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9vcHJvZmlsZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotb2JqLSQoQ09ORklHX09QUk9GSUxFKSArPSBvcHJvZmlsZS5vCi0KLURSSVZFUl9PQkpTID0gJChhZGRwcmVmaXggLi4vLi4vLi4vZHJpdmVycy9vcHJvZmlsZS8sIFwKLQkJb3Byb2YubyBjcHVfYnVmZmVyLm8gYnVmZmVyX3N5bmMubyBcCi0JCWV2ZW50X2J1ZmZlci5vIG9wcm9maWxlX2ZpbGVzLm8gXAotCQlvcHJvZmlsZWZzLm8gb3Byb2ZpbGVfc3RhdHMubyBcCi0JCXRpbWVyX2ludC5vICkKLQotb3Byb2ZpbGUteQkJCQk6PSAkKERSSVZFUl9PQkpTKSBpbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9vcHJvZmlsZS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvb3Byb2ZpbGUvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JiNjAzLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9vcHJvZmlsZS9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioKLSAqIEBmaWxlIGluaXQuYwotICoKLSAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycwotICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKLSAqCi0gKiBAYXV0aG9yIEpvaG4gTGV2b24gPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotIAotaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotCi12b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQvcHJvbS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5NDQ4My4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgdGhlIFN1biBCb290IFBST00gaW50ZXJmYWNlIGxpYnJhcnkgdW5kZXIKLSMgTGludXguCi0jCi0KLUVYVFJBX0FGTEFHUyA6PSAtYW5zaQotRVhUUkFfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotbGliLXkgICA6PSBib290c3RyLm8gZGV2b3BzLm8gaW5pdC5vIG1pc2MubyBcCi0JICAgdHJlZS5vIGNvbnNvbGUubyBwcmludGYubyBwMTI3NS5vIGNpZi5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9wcmludGYuYyBiL2FyY2gvc3BhcmM2NC9wcm9tL3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA5NDNlLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIHByaW50Zi5jOiAgSW50ZXJuYWwgcHJvbSBsaWJyYXJ5IHByaW50ZiBmYWNpbGl0eS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICogQ29weXJpZ2h0IChDKSAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgUGV0ZSBaYWl0Y2V2ICh6YWl0Y2V2QHlhaG9vLmNvbSkKLSAqCi0gKiBXZSB1c2VkIHRvIHdhcm4gYWxsIG92ZXIgdGhlIGNvZGU6IERPIE5PVCBVU0UgcHJvbV9wcmludGYoKSwKLSAqIGFuZCB5ZXQgcGVvcGxlIGRvLiBBbnRvbidzIGJhbmtpbmcgY29kZSB3YXMgb3V0cHV0dGluZyBiYW5rcwotICogd2l0aCBwcm9tX3ByaW50ZiBmb3IgbW9zdCBvZiB0aGUgMi40IGxpZmV0aW1lLiBTaW5jZSBhbiBlZmZlY3RpdmUKLSAqIHN0aWNrIGlzIG5vdCBhdmFpbGFibGUsIHdlIGRlcGxveWVkIGEgY2Fycm90OiBhbiBlYXJseSBwcmludGsKLSAqIHRocm91Z2ggUFJPTSBieSBtZWFucyBvZiAtcCBib290IG9wdGlvbi4gVGhpcyBvdWdodCB0byBmaXggaXQuCi0gKiBVU0UgcHJpbnRrOyBpZiB5b3UgbmVlZCwgZGVwbG95IC1wLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotCi1zdGF0aWMgY2hhciBwcGJ1ZlsxMDI0XTsKLQotdm9pZAotcHJvbV93cml0ZShjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBuKQotewotCWNoYXIgY2g7Ci0KLQl3aGlsZSAobiAhPSAwKSB7Ci0JCS0tbjsKLQkJaWYgKChjaCA9ICpidWYrKykgPT0gJ1xuJykKLQkJCXByb21fcHV0Y2hhcignXHInKTsKLQkJcHJvbV9wdXRjaGFyKGNoKTsKLQl9Ci19Ci0KLXZvaWQKLXByb21fcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQlpbnQgaTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JaSA9IHZzY25wcmludGYocHBidWYsIHNpemVvZihwcGJ1ZiksIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcHJvbV93cml0ZShwcGJ1ZiwgaSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCA3NTMzNDZlLi5hZTVmOTRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTExLDIxICsxMSwyMSBAQAogZXh0ZXJuIHZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKTsKIGV4dGVybiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKTsKIAotI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKSBkbyB7IHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7IFwKKyNkZWZpbmUgcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAogCQkJCSAgICAgKGZsYWdzKSA9IGdldF9zaWduYWxzKCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAorI2RlZmluZSByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAogCQkJCSAgICAgIHNldF9zaWduYWxzKGZsYWdzKTsgfSB3aGlsZSgwKQogCi0jZGVmaW5lIGxvY2FsX2lycV9zYXZlKGZsYWdzKSBkbyB7IGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKSBkbyB7IHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfbG9jYWxfaXJxX2Rpc2FibGUoKTsgfSB3aGlsZSgwKQogCi0jZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKSB1bmJsb2NrX3NpZ25hbHMoKQotI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZSgpIGJsb2NrX3NpZ25hbHMoKQorI2RlZmluZSByYXdfbG9jYWxfaXJxX2VuYWJsZSgpIHVuYmxvY2tfc2lnbmFscygpCisjZGVmaW5lIHJhd19sb2NhbF9pcnFfZGlzYWJsZSgpIGJsb2NrX3NpZ25hbHMoKQogCiAjZGVmaW5lIGlycXNfZGlzYWJsZWQoKSAgICAgICAgICAgICAgICAgXAogKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsgICAgICAgICAgICBcCi0gICAgICAgIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyAgICAgICAgXAorICAgICAgICByYXdfbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7ICAgICAgICBcCiAgICAgICAgIChmbGFncyA9PSAwKTsgICAgICAgICAgICAgICAgICAgXAogfSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggOThhMGVkNS4uMGY0NGFkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC0yNDcsNiArMjQ3LDI4IEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gWDg2X1ZPWUFHRVIKIAorY29uZmlnIFNQQVJTRV9JUlEKKwlib29sICJTdXBwb3J0IHNwYXJzZSBpcnEgbnVtYmVyaW5nIgorCWRlcGVuZHMgb24gUENJX01TSSB8fCBIVF9JUlEKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3BhcnNlIGlycXMuIFRoaXMgaXMgdXNlZnVsIGZvciBkaXN0cm8KKwkgIGtlcm5lbHMgdGhhdCB3YW50IHRvIGRlZmluZSBhIGhpZ2ggQ09ORklHX05SX0NQVVMgdmFsdWUgYnV0IHN0aWxsCisJICB3YW50IHRvIGhhdmUgbG93IGtlcm5lbCBtZW1vcnkgZm9vdHByaW50IG9uIHNtYWxsZXIgbWFjaGluZXMuCisKKwkgICggU3BhcnNlIElSUXMgY2FuIGFsc28gYmUgYmVuZWZpY2lhbCBvbiBOVU1BIGJveGVzLCBhcyB0aGV5IHNwcmVhZAorCSAgICBvdXQgdGhlIGlycV9kZXNjW10gYXJyYXkgaW4gYSBtb3JlIE5VTUEtZnJpZW5kbHkgd2F5LiApCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCisKK2NvbmZpZyBOVU1BX01JR1JBVEVfSVJRX0RFU0MKKwlib29sICJNb3ZlIGlycSBkZXNjIHdoZW4gY2hhbmdpbmcgaXJxIHNtcF9hZmZpbml0eSIKKwlkZXBlbmRzIG9uIFNQQVJTRV9JUlEgJiYgTlVNQQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBtb3ZpbmcgaXJxX2Rlc2MgdG8gY3B1L25vZGUgdGhhdCBpcnEgd2lsbCB1c2UgaGFuZGxlZC4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKwogY29uZmlnIFg4Nl9GSU5EX1NNUF9DT05GSUcKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBYODZfTVBQQVJTRSB8fCBYODZfVk9ZQUdFUgpAQCAtNDc5LDcgKzUwMSw3IEBACiAgICAgICAgICBUaGUgSFBFVCBwcm92aWRlcyBhIHN0YWJsZSB0aW1lIGJhc2Ugb24gU01QCiAgICAgICAgICBzeXN0ZW1zLCB1bmxpa2UgdGhlIFRTQywgYnV0IGl0IGlzIG1vcmUgZXhwZW5zaXZlIHRvIGFjY2VzcywKICAgICAgICAgIGFzIGl0IGlzIG9mZi1jaGlwLiAgWW91IGNhbiBmaW5kIHRoZSBIUEVUIHNwZWMgYXQKLSAgICAgICAgIDxodHRwOi8vd3d3LmludGVsLmNvbS9oYXJkd2FyZWRlc2lnbi9ocGV0c3BlYy5odG0+LgorICAgICAgICAgPGh0dHA6Ly93d3cuaW50ZWwuY29tL2hhcmR3YXJlZGVzaWduL2hwZXRzcGVjXzEucGRmPi4KIAogICAgICAgICAgWW91IGNhbiBzYWZlbHkgY2hvb3NlIFkgaGVyZS4gIEhvd2V2ZXIsIEhQRVQgd2lsbCBvbmx5IGJlCiAgICAgICAgICBhY3RpdmF0ZWQgaWYgdGhlIHBsYXRmb3JtIGFuZCB0aGUgQklPUyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IGRjMjJjMDcuLjQwMzUzNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtNjUsNyArNjUsNyBAQAogCQlyZXR1cm4gZG1hX29wczsKIAllbHNlCiAJCXJldHVybiBkZXYtPmFyY2hkYXRhLmRtYV9vcHM7Ci0jZW5kaWYgLyogX0FTTV9YODZfRE1BX01BUFBJTkdfSCAqLworI2VuZGlmCiB9CiAKIC8qIE1ha2Ugc3VyZSB3ZSBrZWVwIHRoZSBzYW1lIGJlaGF2aW91ciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oCmluZGV4IGU0NzVlMDAuLjdhMWY0NGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvX2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb19hcGljLmgKQEAgLTE5OCwxNyArMTk4LDE0IEBACiBleHRlcm4gdm9pZCByZWluaXRfaW50cl9yZW1hcHBlZF9JT19BUElDKGludCk7CiAjZW5kaWYKIAotZXh0ZXJuIGludCBwcm9iZV9ucl9pcnFzKHZvaWQpOworZXh0ZXJuIHZvaWQgcHJvYmVfbnJfaXJxc19nc2kodm9pZCk7CiAKICNlbHNlICAvKiAhQ09ORklHX1g4Nl9JT19BUElDICovCiAjZGVmaW5lIGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzIDAKIHN0YXRpYyBjb25zdCBpbnQgdGltZXJfdGhyb3VnaF84MjU5ID0gMDsKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb2FwaWNfaW5pdF9tYXBwaW5ncyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2FwaWNfaW5pdF9tYXBwaW5ncyh2b2lkKQl7IH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJvYmVfbnJfaXJxcyh2b2lkKQotewotCXJldHVybiBOUl9JUlFTOwotfQorc3RhdGljIGlubGluZSB2b2lkIHByb2JlX25yX2lycXNfZ3NpKHZvaWQpCXsgfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9JT19BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbW11LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb21tdS5oCmluZGV4IDI5NWIxMzEuLmE2ZWU5ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbW11LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9tbXUuaApAQCAtNyw4ICs3LDYgQEAKIGV4dGVybiBpbnQgZm9yY2VfaW9tbXUsIG5vX2lvbW11OwogZXh0ZXJuIGludCBpb21tdV9kZXRlY3RlZDsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9tbXVfbnJfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7Ci0KIC8qIDEwIHNlY29uZHMgKi8KICNkZWZpbmUgRE1BUl9PUEVSQVRJT05fVElNRU9VVCAoKGN5Y2xlc190KSB0c2Nfa2h6KjEwKjEwMDApCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCmluZGV4IDAwMDVhZGIuLmY3ZmY2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaApAQCAtMTAxLDEyICsxMDEsMjMgQEAKICNkZWZpbmUgTEFTVF9WTTg2X0lSUQkJMTUKICNkZWZpbmUgaW52YWxpZF92bTg2X2lycShpcnEpCSgoaXJxKSA8IDMgfHwgKGlycSkgPiAxNSkKIAorI2RlZmluZSBOUl9JUlFTX0xFR0FDWQkJMTYKKwogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2X1ZPWUFHRVIpCisKKyNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKICMgaWYgTlJfQ1BVUyA8IE1BWF9JT19BUElDUwogIyAgZGVmaW5lIE5SX0lSUVMgKE5SX1ZFQ1RPUlMgKyAoMzIgKiBOUl9DUFVTKSkKICMgZWxzZQogIyAgZGVmaW5lIE5SX0lSUVMgKE5SX1ZFQ1RPUlMgKyAoMzIgKiBNQVhfSU9fQVBJQ1MpKQogIyBlbmRpZgorI2Vsc2UKKyMgaWYgKDggKiBOUl9DUFVTKSA+ICgzMiAqIE1BWF9JT19BUElDUykKKyMgIGRlZmluZSBOUl9JUlFTIChOUl9WRUNUT1JTICsgKDggKiBOUl9DUFVTKSkKKyMgZWxzZQorIyAgZGVmaW5lIE5SX0lSUVMgKE5SX1ZFQ1RPUlMgKyAoMzIgKiBNQVhfSU9fQVBJQ1MpKQorIyBlbmRpZgorI2VuZGlmCiAKICNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl9WT1lBR0VSKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDY0Nzc4MTIuLjY2ODM0YzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCkBAIC04NCw2ICs4NCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfcXVpcmtzKHZvaWQpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBjaV9pb21tdV9hbGxvYyh2b2lkKTsKKwogI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV82NC5oCmluZGV4IGQwMmQ5MzYuLjRkYTIwNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV82NC5oCkBAIC0yMyw3ICsyMyw2IEBACiAJCQkgICAgICAgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKTsKIAogZXh0ZXJuIHZvaWQgZG1hMzJfcmVzZXJ2ZV9ib290bWVtKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGNpX2lvbW11X2FsbG9jKHZvaWQpOwogCiAvKiBUaGUgUENJIGFkZHJlc3Mgc3BhY2UgZG9lcyBlcXVhbCB0aGUgcGh5c2ljYWwgbWVtb3J5CiAgKiBhZGRyZXNzIHNwYWNlLiAgVGhlIG5ldHdvcmtpbmcgYW5kIGJsb2NrIGRldmljZSBsYXllcnMgdXNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNTgwYzNlZS4uNDM0MDA1NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTU3LDYgKzE1Nyw3IEBACiAJaW50IF9fcmV0X2d1OwkJCQkJCQlcCiAJdW5zaWduZWQgbG9uZyBfX3ZhbF9ndTsJCQkJCQlcCiAJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCQlcCisJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJCVwKIAljYXNlIDE6CQkJCQkJCQlcCiAJCV9fZ2V0X3VzZXJfeCgxLCBfX3JldF9ndSwgX192YWxfZ3UsIHB0cik7CQlcCkBAIC0yNDEsNiArMjQyLDcgQEAKIAlpbnQgX19yZXRfcHU7CQkJCQkJXAogCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbDsJCQkJXAogCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQlcCisJbWlnaHRfZmF1bHQoKTsJCQkJCQlcCiAJX19wdV92YWwgPSB4OwkJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZigqKHB0cikpKSB7CQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaAppbmRleCBkMDk1YTNhLi41ZTA2MjU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc18zMi5oCkBAIC04Miw4ICs4Miw4IEBACiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLSAgICAgICBtaWdodF9zbGVlcCgpOwotICAgICAgIHJldHVybiBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbik7CisJbWlnaHRfZmF1bHQoKTsKKwlyZXR1cm4gX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKQEAgLTEzNyw3ICsxMzcsNyBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCW1pZ2h0X3NsZWVwKCk7CisJbWlnaHRfZmF1bHQoKTsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKIAkJdW5zaWduZWQgbG9uZyByZXQ7CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXJfbm9jYWNoZSh2b2lkICp0bywKIAkJCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCW1pZ2h0X3NsZWVwKCk7CisJbWlnaHRfZmF1bHQoKTsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKIAkJdW5zaWduZWQgbG9uZyByZXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAppbmRleCBmOGNmZDAwLi44NDIxMGM0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCkBAIC0yOSw2ICsyOSw4IEBACiBpbnQgX19jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIHNpemUpCiB7CiAJaW50IHJldCA9IDA7CisKKwltaWdodF9mYXVsdCgpOwogCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCiAJCXJldHVybiBjb3B5X3VzZXJfZ2VuZXJpYyhkc3QsIChfX2ZvcmNlIHZvaWQgKilzcmMsIHNpemUpOwogCXN3aXRjaCAoc2l6ZSkgewpAQCAtNzEsNiArNzMsOCBAQAogaW50IF9fY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgc2l6ZSkKIHsKIAlpbnQgcmV0ID0gMDsKKworCW1pZ2h0X2ZhdWx0KCk7CiAJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkKIAkJcmV0dXJuIGNvcHlfdXNlcl9nZW5lcmljKChfX2ZvcmNlIHZvaWQgKilkc3QsIHNyYywgc2l6ZSk7CiAJc3dpdGNoIChzaXplKSB7CkBAIC0xMTMsNiArMTE3LDggQEAKIGludCBfX2NvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKQogewogCWludCByZXQgPSAwOworCisJbWlnaHRfZmF1bHQoKTsKIAlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQogCQlyZXR1cm4gY29weV91c2VyX2dlbmVyaWMoKF9fZm9yY2Ugdm9pZCAqKWRzdCwKIAkJCQkJIChfX2ZvcmNlIHZvaWQgKilzcmMsIHNpemUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCmluZGV4IDg4ZGQ3NjguLmQzNjRkZjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTEwOSw2ICsxMDksOCBAQAogCiBvYmotJChDT05GSUdfWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTikgKz0gY2hlY2subwogCitvYmotJChDT05GSUdfU1dJT1RMQikJCQkrPSBwY2ktc3dpb3RsYl82NC5vICMgTkIgcmVuYW1lIHdpdGhvdXQgXzY0CisKICMjIwogIyA2NCBiaXQgc3BlY2lmaWMgZmlsZXMKIGlmZXEgKCQoQ09ORklHX1g4Nl82NCkseSkKQEAgLTEyMiw3ICsxMjQsNiBAQAogICAgICAgICBvYmotJChDT05GSUdfR0FSVF9JT01NVSkJKz0gcGNpLWdhcnRfNjQubyBhcGVydHVyZV82NC5vCiAgICAgICAgIG9iai0kKENPTkZJR19DQUxHQVJZX0lPTU1VKQkrPSBwY2ktY2FsZ2FyeV82NC5vIHRjZV82NC5vCiAgICAgICAgIG9iai0kKENPTkZJR19BTURfSU9NTVUpCQkrPSBhbWRfaW9tbXVfaW5pdC5vIGFtZF9pb21tdS5vCi0gICAgICAgIG9iai0kKENPTkZJR19TV0lPVExCKQkJKz0gcGNpLXN3aW90bGJfNjQubwogCiAgICAgICAgIG9iai0kKENPTkZJR19QQ0lfTU1DT05GSUcpCSs9IG1tY29uZi1mYW0xMGhfNjQubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDNmMGEzZWQuLjg0NWVhMDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtODEzLDcgKzgxMyw3IEBACiAKIG91dF9ub2hwZXQ6CiAJaHBldF9jbGVhcl9tYXBwaW5nKCk7Ci0JYm9vdF9ocGV0X2Rpc2FibGUgPSAxOworCWhwZXRfYWRkcmVzcyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgzNiwxMCArODM2LDExIEBACiAKIAkJaHBldF9hZGRyZXNzID0gZm9yY2VfaHBldF9hZGRyZXNzOwogCQlocGV0X2VuYWJsZSgpOwotCQlpZiAoIWhwZXRfdmlydF9hZGRyZXNzKQotCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJaWYgKCFocGV0X3ZpcnRfYWRkcmVzcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlocGV0X3Jlc2VydmVfcGxhdGZvcm1fdGltZXJzKGhwZXRfcmVhZGwoSFBFVF9JRCkpOwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDY3OWU3YmIuLmY2ZWE5NGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lvX2FwaWMuYwpAQCAtMTA4LDU1ICsxMDgsNiBAQAogZWFybHlfcGFyYW0oIm5vYXBpYyIsIHBhcnNlX25vYXBpYyk7CiAKIHN0cnVjdCBpcnFfcGluX2xpc3Q7Ci1zdHJ1Y3QgaXJxX2NmZyB7Ci0JdW5zaWduZWQgaW50IGlycTsKLQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICppcnFfMl9waW47Ci0JY3B1bWFza190IGRvbWFpbjsKLQljcHVtYXNrX3Qgb2xkX2RvbWFpbjsKLQl1bnNpZ25lZCBtb3ZlX2NsZWFudXBfY291bnQ7Ci0JdTggdmVjdG9yOwotCXU4IG1vdmVfaW5fcHJvZ3Jlc3MgOiAxOwotfTsKLQotLyogaXJxX2NmZyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NmZyBpcnFfY2ZneFtOUl9JUlFTXSA9IHsKLQlbMF0gID0geyAuaXJxID0gIDAsIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlEwX1ZFQ1RPUiwgIH0sCi0JWzFdICA9IHsgLmlycSA9ICAxLCAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMV9WRUNUT1IsICB9LAotCVsyXSAgPSB7IC5pcnEgPSAgMiwgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTJfVkVDVE9SLCAgfSwKLQlbM10gID0geyAuaXJxID0gIDMsIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlEzX1ZFQ1RPUiwgIH0sCi0JWzRdICA9IHsgLmlycSA9ICA0LCAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRNF9WRUNUT1IsICB9LAotCVs1XSAgPSB7IC5pcnEgPSAgNSwgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTVfVkVDVE9SLCAgfSwKLQlbNl0gID0geyAuaXJxID0gIDYsIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlE2X1ZFQ1RPUiwgIH0sCi0JWzddICA9IHsgLmlycSA9ICA3LCAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRN19WRUNUT1IsICB9LAotCVs4XSAgPSB7IC5pcnEgPSAgOCwgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUThfVkVDVE9SLCAgfSwKLQlbOV0gID0geyAuaXJxID0gIDksIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlE5X1ZFQ1RPUiwgIH0sCi0JWzEwXSA9IHsgLmlycSA9IDEwLCAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMTBfVkVDVE9SLCB9LAotCVsxMV0gPSB7IC5pcnEgPSAxMSwgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTExX1ZFQ1RPUiwgfSwKLQlbMTJdID0geyAuaXJxID0gMTIsIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlExMl9WRUNUT1IsIH0sCi0JWzEzXSA9IHsgLmlycSA9IDEzLCAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMTNfVkVDVE9SLCB9LAotCVsxNF0gPSB7IC5pcnEgPSAxNCwgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTE0X1ZFQ1RPUiwgfSwKLQlbMTVdID0geyAuaXJxID0gMTUsIC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlExNV9WRUNUT1IsIH0sCi19OwotCi0jZGVmaW5lIGZvcl9lYWNoX2lycV9jZmcoaXJxLCBjZmcpCQlcCi0JZm9yIChpcnEgPSAwLCBjZmcgPSBpcnFfY2ZneDsgaXJxIDwgbnJfaXJxczsgaXJxKyssIGNmZysrKQotCi1zdGF0aWMgc3RydWN0IGlycV9jZmcgKmlycV9jZmcodW5zaWduZWQgaW50IGlycSkKLXsKLQlyZXR1cm4gaXJxIDwgbnJfaXJxcyA/IGlycV9jZmd4ICsgaXJxIDogTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2ZnICppcnFfY2ZnX2FsbG9jKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JcmV0dXJuIGlycV9jZmcoaXJxKTsKLX0KLQotLyoKLSAqIFJvdWdoIGVzdGltYXRpb24gb2YgaG93IG1hbnkgc2hhcmVkIElSUXMgdGhlcmUgYXJlLCBjYW4gYmUgY2hhbmdlZAotICogYW55dGltZS4KLSAqLwotI2RlZmluZSBNQVhfUExVU19TSEFSRURfSVJRUyBOUl9JUlFTCi0jZGVmaW5lIFBJTl9NQVBfU0laRSAoTUFYX1BMVVNfU0hBUkVEX0lSUVMgKyBOUl9JUlFTKQogCiAvKgogICogVGhpcyBpcyBwZXJmb3JtYW5jZS1jcml0aWNhbCwgd2Ugd2FudCB0byBkbyBpdCBPKDEpCkBAIC0xNzAsMzIgKzEyMSwyNDAgQEAKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpuZXh0OwogfTsKIAotc3RhdGljIHN0cnVjdCBpcnFfcGluX2xpc3QgaXJxXzJfcGluX2hlYWRbUElOX01BUF9TSVpFXTsKLXN0YXRpYyBzdHJ1Y3QgaXJxX3Bpbl9saXN0ICppcnFfMl9waW5fcHRyOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaXJxXzJfcGluX2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGludCBjcHUpCiB7Ci0Jc3RydWN0IGlycV9waW5fbGlzdCAqcGluID0gaXJxXzJfcGluX2hlYWQ7Ci0JaW50IGk7CisJc3RydWN0IGlycV9waW5fbGlzdCAqcGluOworCWludCBub2RlOwogCi0JZm9yIChpID0gMTsgaSA8IFBJTl9NQVBfU0laRTsgaSsrKQotCQlwaW5baS0xXS5uZXh0ID0gJnBpbltpXTsKKwlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKIAotCWlycV8yX3Bpbl9wdHIgPSAmcGluWzBdOwotfQorCXBpbiA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKnBpbiksIEdGUF9BVE9NSUMsIG5vZGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGlycV8yX3BpbiBvbiBjcHUgJWQgbm9kZSAlZFxuIiwgY3B1LCBub2RlKTsKIAotc3RhdGljIHN0cnVjdCBpcnFfcGluX2xpc3QgKmdldF9vbmVfZnJlZV9pcnFfMl9waW4odm9pZCkKLXsKLQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpwaW4gPSBpcnFfMl9waW5fcHRyOwotCi0JaWYgKCFwaW4pCi0JCXBhbmljKCJjYW4gbm90IGdldCBtb3JlIGlycV8yX3BpblxuIik7Ci0KLQlpcnFfMl9waW5fcHRyID0gcGluLT5uZXh0OwotCXBpbi0+bmV4dCA9IE5VTEw7CiAJcmV0dXJuIHBpbjsKIH0KIAorc3RydWN0IGlycV9jZmcgeworCXN0cnVjdCBpcnFfcGluX2xpc3QgKmlycV8yX3BpbjsKKwljcHVtYXNrX3QgZG9tYWluOworCWNwdW1hc2tfdCBvbGRfZG9tYWluOworCXVuc2lnbmVkIG1vdmVfY2xlYW51cF9jb3VudDsKKwl1OCB2ZWN0b3I7CisJdTggbW92ZV9pbl9wcm9ncmVzcyA6IDE7CisjaWZkZWYgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQworCXU4IG1vdmVfZGVzY19wZW5kaW5nIDogMTsKKyNlbmRpZgorfTsKKworLyogaXJxX2NmZyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KKyNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQorc3RhdGljIHN0cnVjdCBpcnFfY2ZnIGlycV9jZmd4W10gPSB7CisjZWxzZQorc3RhdGljIHN0cnVjdCBpcnFfY2ZnIGlycV9jZmd4W05SX0lSUVNdID0geworI2VuZGlmCisJWzBdICA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTBfVkVDVE9SLCAgfSwKKwlbMV0gID0geyAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMV9WRUNUT1IsICB9LAorCVsyXSAgPSB7IC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlEyX1ZFQ1RPUiwgIH0sCisJWzNdICA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTNfVkVDVE9SLCAgfSwKKwlbNF0gID0geyAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRNF9WRUNUT1IsICB9LAorCVs1XSAgPSB7IC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlE1X1ZFQ1RPUiwgIH0sCisJWzZdICA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTZfVkVDVE9SLCAgfSwKKwlbN10gID0geyAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRN19WRUNUT1IsICB9LAorCVs4XSAgPSB7IC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlE4X1ZFQ1RPUiwgIH0sCisJWzldICA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTlfVkVDVE9SLCAgfSwKKwlbMTBdID0geyAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMTBfVkVDVE9SLCB9LAorCVsxMV0gPSB7IC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlExMV9WRUNUT1IsIH0sCisJWzEyXSA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTEyX1ZFQ1RPUiwgfSwKKwlbMTNdID0geyAuZG9tYWluID0gQ1BVX01BU0tfQUxMLCAudmVjdG9yID0gSVJRMTNfVkVDVE9SLCB9LAorCVsxNF0gPSB7IC5kb21haW4gPSBDUFVfTUFTS19BTEwsIC52ZWN0b3IgPSBJUlExNF9WRUNUT1IsIH0sCisJWzE1XSA9IHsgLmRvbWFpbiA9IENQVV9NQVNLX0FMTCwgLnZlY3RvciA9IElSUTE1X1ZFQ1RPUiwgfSwKK307CisKK3ZvaWQgX19pbml0IGFyY2hfZWFybHlfaXJxX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlpbnQgY291bnQ7CisJaW50IGk7CisKKwljZmcgPSBpcnFfY2ZneDsKKwljb3VudCA9IEFSUkFZX1NJWkUoaXJxX2NmZ3gpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZGVzYyA9IGlycV90b19kZXNjKGkpOworCQlkZXNjLT5jaGlwX2RhdGEgPSAmY2ZnW2ldOworCX0KK30KKworI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCitzdGF0aWMgc3RydWN0IGlycV9jZmcgKmlycV9jZmcodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gTlVMTDsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwlpZiAoZGVzYykKKwkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCisJcmV0dXJuIGNmZzsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2ZnICpnZXRfb25lX2ZyZWVfaXJxX2NmZyhpbnQgY3B1KQoreworCXN0cnVjdCBpcnFfY2ZnICpjZmc7CisJaW50IG5vZGU7CisKKwlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKworCWNmZyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmNmZyksIEdGUF9BVE9NSUMsIG5vZGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGlycV9jZmcgb24gY3B1ICVkIG5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CisKKwlyZXR1cm4gY2ZnOworfQorCit2b2lkIGFyY2hfaW5pdF9jaGlwX2RhdGEoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQoreworCXN0cnVjdCBpcnFfY2ZnICpjZmc7CisKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJaWYgKCFjZmcpIHsKKwkJZGVzYy0+Y2hpcF9kYXRhID0gZ2V0X29uZV9mcmVlX2lycV9jZmcoY3B1KTsKKwkJaWYgKCFkZXNjLT5jaGlwX2RhdGEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBpcnFfY2ZnXG4iKTsKKwkJCUJVR19PTigxKTsKKwkJfQorCX0KK30KKworI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKKworc3RhdGljIHZvaWQKK2luaXRfY29weV9pcnFfMl9waW4oc3RydWN0IGlycV9jZmcgKm9sZF9jZmcsIHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBjcHUpCit7CisJc3RydWN0IGlycV9waW5fbGlzdCAqb2xkX2VudHJ5LCAqaGVhZCwgKnRhaWwsICplbnRyeTsKKworCWNmZy0+aXJxXzJfcGluID0gTlVMTDsKKwlvbGRfZW50cnkgPSBvbGRfY2ZnLT5pcnFfMl9waW47CisJaWYgKCFvbGRfZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbihjcHUpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT5hcGljCT0gb2xkX2VudHJ5LT5hcGljOworCWVudHJ5LT5waW4JPSBvbGRfZW50cnktPnBpbjsKKwloZWFkCQk9IGVudHJ5OworCXRhaWwJCT0gZW50cnk7CisJb2xkX2VudHJ5CT0gb2xkX2VudHJ5LT5uZXh0OworCXdoaWxlIChvbGRfZW50cnkpIHsKKwkJZW50cnkgPSBnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGNwdSk7CisJCWlmICghZW50cnkpIHsKKwkJCWVudHJ5ID0gaGVhZDsKKwkJCXdoaWxlIChlbnRyeSkgeworCQkJCWhlYWQgPSBlbnRyeS0+bmV4dDsKKwkJCQlrZnJlZShlbnRyeSk7CisJCQkJZW50cnkgPSBoZWFkOworCQkJfQorCQkJLyogc3RpbGwgdXNlIHRoZSBvbGQgb25lICovCisJCQlyZXR1cm47CisJCX0KKwkJZW50cnktPmFwaWMJPSBvbGRfZW50cnktPmFwaWM7CisJCWVudHJ5LT5waW4JPSBvbGRfZW50cnktPnBpbjsKKwkJdGFpbC0+bmV4dAk9IGVudHJ5OworCQl0YWlsCQk9IGVudHJ5OworCQlvbGRfZW50cnkJPSBvbGRfZW50cnktPm5leHQ7CisJfQorCisJdGFpbC0+bmV4dCA9IE5VTEw7CisJY2ZnLT5pcnFfMl9waW4gPSBoZWFkOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2lycV8yX3BpbihzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZywgc3RydWN0IGlycV9jZmcgKmNmZykKK3sKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSwgKm5leHQ7CisKKwlpZiAob2xkX2NmZy0+aXJxXzJfcGluID09IGNmZy0+aXJxXzJfcGluKQorCQlyZXR1cm47CisKKwllbnRyeSA9IG9sZF9jZmctPmlycV8yX3BpbjsKKworCXdoaWxlIChlbnRyeSkgeworCQluZXh0ID0gZW50cnktPm5leHQ7CisJCWtmcmVlKGVudHJ5KTsKKwkJZW50cnkgPSBuZXh0OworCX0KKwlvbGRfY2ZnLT5pcnFfMl9waW4gPSBOVUxMOworfQorCit2b2lkIGFyY2hfaW5pdF9jb3B5X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAorCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCit7CisJc3RydWN0IGlycV9jZmcgKmNmZzsKKwlzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZzsKKworCWNmZyA9IGdldF9vbmVfZnJlZV9pcnFfY2ZnKGNwdSk7CisKKwlpZiAoIWNmZykKKwkJcmV0dXJuOworCisJZGVzYy0+Y2hpcF9kYXRhID0gY2ZnOworCisJb2xkX2NmZyA9IG9sZF9kZXNjLT5jaGlwX2RhdGE7CisKKwltZW1jcHkoY2ZnLCBvbGRfY2ZnLCBzaXplb2Yoc3RydWN0IGlycV9jZmcpKTsKKworCWluaXRfY29weV9pcnFfMl9waW4ob2xkX2NmZywgY2ZnLCBjcHUpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2lycV9jZmcoc3RydWN0IGlycV9jZmcgKm9sZF9jZmcpCit7CisJa2ZyZWUob2xkX2NmZyk7Cit9CisKK3ZvaWQgYXJjaF9mcmVlX2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9jZmcgKm9sZF9jZmcsICpjZmc7CisKKwlvbGRfY2ZnID0gb2xkX2Rlc2MtPmNoaXBfZGF0YTsKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisKKwlpZiAob2xkX2NmZyA9PSBjZmcpCisJCXJldHVybjsKKworCWlmIChvbGRfY2ZnKSB7CisJCWZyZWVfaXJxXzJfcGluKG9sZF9jZmcsIGNmZyk7CisJCWZyZWVfaXJxX2NmZyhvbGRfY2ZnKTsKKwkJb2xkX2Rlc2MtPmNoaXBfZGF0YSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKworCWlmICghY2ZnLT5tb3ZlX2luX3Byb2dyZXNzKSB7CisJCS8qIGl0IG1lYW5zIHRoYXQgZG9tYWluIGlzIG5vdCBjaGFuZ2VkICovCisJCWlmICghY3B1c19pbnRlcnNlY3RzKGRlc2MtPmFmZmluaXR5LCBtYXNrKSkKKwkJCWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcgPSAxOworCX0KK30KKyNlbmRpZgorCisjZWxzZQorc3RhdGljIHN0cnVjdCBpcnFfY2ZnICppcnFfY2ZnKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIGlycSA8IG5yX2lycXMgPyBpcnFfY2ZneCArIGlycSA6IE5VTEw7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY3B1bWFza190IG1hc2spCit7Cit9CisjZW5kaWYKKwogc3RydWN0IGlvX2FwaWMgewogCXVuc2lnbmVkIGludCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOwpAQCAtMjM3LDExICszOTYsMTAgQEAKIAl3cml0ZWwodmFsdWUsICZpb19hcGljLT5kYXRhKTsKIH0KIAotc3RhdGljIGJvb2wgaW9fYXBpY19sZXZlbF9hY2tfcGVuZGluZyh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIGJvb2wgaW9fYXBpY19sZXZlbF9hY2tfcGVuZGluZyhzdHJ1Y3QgaXJxX2NmZyAqY2ZnKQogewogCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9jZmcoaXJxKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCWVudHJ5ID0gY2ZnLT5pcnFfMl9waW47CkBAIC0zMjMsMTMgKzQ4MSwxMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgX190YXJnZXRfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGRlc3QsIHU4IHZlY3RvcikKK3N0YXRpYyB2b2lkIF9fdGFyZ2V0X0lPX0FQSUNfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBkZXN0LCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnKQogewogCWludCBhcGljLCBwaW47Ci0Jc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKKwl1OCB2ZWN0b3IgPSBjZmctPnZlY3RvcjsKIAotCWNmZyA9IGlycV9jZmcoaXJxKTsKIAllbnRyeSA9IGNmZy0+aXJxXzJfcGluOwogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgaW50IHJlZzsKQEAgLTM1OSwyNCArNTE2LDI3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKTsKK3N0YXRpYyBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSwgc3RydWN0IGlycV9jZmcgKmNmZywgY3B1bWFza190IG1hc2spOwogCi1zdGF0aWMgdm9pZCBzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3N0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBjcHVtYXNrX3QgbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGRlc3Q7CiAJY3B1bWFza190IHRtcDsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IGlycTsKIAogCWNwdXNfYW5kKHRtcCwgbWFzaywgY3B1X29ubGluZV9tYXApOwogCWlmIChjcHVzX2VtcHR5KHRtcCkpCiAJCXJldHVybjsKIAotCWNmZyA9IGlycV9jZmcoaXJxKTsKLQlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBtYXNrKSkKKwlpcnEgPSBkZXNjLT5pcnE7CisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIGNmZywgbWFzaykpCiAJCXJldHVybjsKIAorCXNldF9leHRyYV9tb3ZlX2Rlc2MoZGVzYywgbWFzayk7CisKIAljcHVzX2FuZCh0bXAsIGNmZy0+ZG9tYWluLCBtYXNrKTsKIAlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKHRtcCk7CiAJLyoKQEAgLTM4NCwxMiArNTQ0LDIwIEBACiAJICovCiAJZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7CiAKLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlfX3RhcmdldF9JT19BUElDX2lycShpcnEsIGRlc3QsIGNmZy0+dmVjdG9yKTsKKwlfX3RhcmdldF9JT19BUElDX2lycShpcnEsIGRlc3QsIGNmZyk7CiAJZGVzYy0+YWZmaW5pdHkgPSBtYXNrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiB9CisKK3N0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhkZXNjLCBtYXNrKTsKK30KICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIC8qCkBAIC0zOTcsMTYgKzU2NSwxOCBAQAogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCiAgKiBmYXN0IGluIHRoZSBjb21tb24gY2FzZSwgYW5kIGZhc3QgZm9yIHNoYXJlZCBJU0Etc3BhY2UgSVJRcy4KICAqLwotc3RhdGljIHZvaWQgYWRkX3Bpbl90b19pcnEodW5zaWduZWQgaW50IGlycSwgaW50IGFwaWMsIGludCBwaW4pCitzdGF0aWMgdm9pZCBhZGRfcGluX3RvX2lycV9jcHUoc3RydWN0IGlycV9jZmcgKmNmZywgaW50IGNwdSwgaW50IGFwaWMsIGludCBwaW4pCiB7Ci0Jc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKIAotCS8qIGZpcnN0IHRpbWUgdG8gcmVmZXIgaXJxX2NmZywgc28gd2l0aCBuZXcgKi8KLQljZmcgPSBpcnFfY2ZnX2FsbG9jKGlycSk7CiAJZW50cnkgPSBjZmctPmlycV8yX3BpbjsKIAlpZiAoIWVudHJ5KSB7Ci0JCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbigpOworCQllbnRyeSA9IGdldF9vbmVfZnJlZV9pcnFfMl9waW4oY3B1KTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jIGlycV8yX3BpbiB0byBhZGQgJWQgLSAlZFxuIiwKKwkJCQkJYXBpYywgcGluKTsKKwkJCXJldHVybjsKKwkJfQogCQljZmctPmlycV8yX3BpbiA9IGVudHJ5OwogCQllbnRyeS0+YXBpYyA9IGFwaWM7CiAJCWVudHJ5LT5waW4gPSBwaW47CkBAIC00MjEsNyArNTkxLDcgQEAKIAkJZW50cnkgPSBlbnRyeS0+bmV4dDsKIAl9CiAKLQllbnRyeS0+bmV4dCA9IGdldF9vbmVfZnJlZV9pcnFfMl9waW4oKTsKKwllbnRyeS0+bmV4dCA9IGdldF9vbmVfZnJlZV9pcnFfMl9waW4oY3B1KTsKIAllbnRyeSA9IGVudHJ5LT5uZXh0OwogCWVudHJ5LT5hcGljID0gYXBpYzsKIAllbnRyeS0+cGluID0gcGluOwpAQCAtNDMwLDExICs2MDAsMTAgQEAKIC8qCiAgKiBSZXJvdXRlIGFuIElSUSB0byBhIGRpZmZlcmVudCBwaW4uCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZXBsYWNlX3Bpbl9hdF9pcnEodW5zaWduZWQgaW50IGlycSwKK3N0YXRpYyB2b2lkIF9faW5pdCByZXBsYWNlX3Bpbl9hdF9pcnFfY3B1KHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBjcHUsCiAJCQkJICAgICAgaW50IG9sZGFwaWMsIGludCBvbGRwaW4sCiAJCQkJICAgICAgaW50IG5ld2FwaWMsIGludCBuZXdwaW4pCiB7Ci0Jc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9jZmcoaXJxKTsKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGNmZy0+aXJxXzJfcGluOwogCWludCByZXBsYWNlZCA9IDA7CiAKQEAgLTQ1MSwxOCArNjIwLDE2IEBACiAKIAkvKiB3aHk/IGNhbGwgcmVwbGFjZSBiZWZvcmUgYWRkPyAqLwogCWlmICghcmVwbGFjZWQpCi0JCWFkZF9waW5fdG9faXJxKGlycSwgbmV3YXBpYywgbmV3cGluKTsKKwkJYWRkX3Bpbl90b19pcnFfY3B1KGNmZywgY3B1LCBuZXdhcGljLCBuZXdwaW4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnlfaXJxKHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnlfaXJxKHN0cnVjdCBpcnFfY2ZnICpjZmcsCiAJCQkJaW50IG1hc2tfYW5kLCBpbnQgbWFza19vciwKIAkJCQl2b2lkICgqZmluYWwpKHN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5KSkKIHsKIAlpbnQgcGluOwotCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnk7CiAKLQljZmcgPSBpcnFfY2ZnKGlycSk7CiAJZm9yIChlbnRyeSA9IGNmZy0+aXJxXzJfcGluOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CiAJCXVuc2lnbmVkIGludCByZWc7CiAJCXBpbiA9IGVudHJ5LT5waW47CkBAIC00NzUsOSArNjQyLDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fdW5tYXNrX0lPX0FQSUNfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBfX3VubWFza19JT19BUElDX2lycShzdHJ1Y3QgaXJxX2NmZyAqY2ZnKQogewotCWlvX2FwaWNfbW9kaWZ5X2lycShpcnEsIH5JT19BUElDX1JFRElSX01BU0tFRCwgMCwgTlVMTCk7CisJaW9fYXBpY19tb2RpZnlfaXJxKGNmZywgfklPX0FQSUNfUkVESVJfTUFTS0VELCAwLCBOVUxMKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTQ5Miw0NyArNjU5LDY0IEBACiAJcmVhZGwoJmlvX2FwaWMtPmRhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBfX21hc2tfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIF9fbWFza19JT19BUElDX2lycShzdHJ1Y3QgaXJxX2NmZyAqY2ZnKQogewotCWlvX2FwaWNfbW9kaWZ5X2lycShpcnEsIH4wLCBJT19BUElDX1JFRElSX01BU0tFRCwgJmlvX2FwaWNfc3luYyk7CisJaW9fYXBpY19tb2RpZnlfaXJxKGNmZywgfjAsIElPX0FQSUNfUkVESVJfTUFTS0VELCAmaW9fYXBpY19zeW5jKTsKIH0KICNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KLXN0YXRpYyB2b2lkIF9fbWFza19JT19BUElDX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgX19tYXNrX0lPX0FQSUNfaXJxKHN0cnVjdCBpcnFfY2ZnICpjZmcpCiB7Ci0JaW9fYXBpY19tb2RpZnlfaXJxKGlycSwgfjAsIElPX0FQSUNfUkVESVJfTUFTS0VELCBOVUxMKTsKKwlpb19hcGljX21vZGlmeV9pcnEoY2ZnLCB+MCwgSU9fQVBJQ19SRURJUl9NQVNLRUQsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCBfX21hc2tfYW5kX2VkZ2VfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIF9fbWFza19hbmRfZWRnZV9JT19BUElDX2lycShzdHJ1Y3QgaXJxX2NmZyAqY2ZnKQogewotCWlvX2FwaWNfbW9kaWZ5X2lycShpcnEsIH5JT19BUElDX1JFRElSX0xFVkVMX1RSSUdHRVIsCisJaW9fYXBpY19tb2RpZnlfaXJxKGNmZywgfklPX0FQSUNfUkVESVJfTEVWRUxfVFJJR0dFUiwKIAkJCUlPX0FQSUNfUkVESVJfTUFTS0VELCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBfX3VubWFza19hbmRfbGV2ZWxfSU9fQVBJQ19pcnEoc3RydWN0IGlycV9jZmcgKmNmZykKIHsKLQlpb19hcGljX21vZGlmeV9pcnEoaXJxLCB+SU9fQVBJQ19SRURJUl9NQVNLRUQsCisJaW9fYXBpY19tb2RpZnlfaXJxKGNmZywgfklPX0FQSUNfUkVESVJfTUFTS0VELAogCQkJSU9fQVBJQ19SRURJUl9MRVZFTF9UUklHR0VSLCBOVUxMKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCiAKLXN0YXRpYyB2b2lkIG1hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXNrX0lPX0FQSUNfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjKQogeworCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCUJVR19PTighY2ZnKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCV9fbWFza19JT19BUElDX2lycShpcnEpOworCV9fbWFza19JT19BUElDX2lycShjZmcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHVubWFza19JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHVubWFza19JT19BUElDX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlfX3VubWFza19JT19BUElDX2lycShpcnEpOworCV9fdW5tYXNrX0lPX0FQSUNfaXJxKGNmZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgbWFza19JT19BUElDX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisKKwltYXNrX0lPX0FQSUNfaXJxX2Rlc2MoZGVzYyk7Cit9CitzdGF0aWMgdm9pZCB1bm1hc2tfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJdW5tYXNrX0lPX0FQSUNfaXJxX2Rlc2MoZGVzYyk7Cit9CisKIHN0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUNfcGluKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcGluKQogewogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OwpAQCAtODA5LDcgKzk5Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgRUlTQV9FTENSKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaWYgKGlycSA8IDE2KSB7CisJaWYgKGlycSA8IE5SX0lSUVNfTEVHQUNZKSB7CiAJCXVuc2lnbmVkIGludCBwb3J0ID0gMHg0ZDAgKyAoaXJxID4+IDMpOwogCQlyZXR1cm4gKGluYihwb3J0KSA+PiAoaXJxICYgNykpICYgMTsKIAl9CkBAIC0xMDM0LDcgKzEyMTgsNyBAQAogCXNwaW5fdW5sb2NrKCZ2ZWN0b3JfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgX19hc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3N0YXRpYyBpbnQgX19hc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBjcHVtYXNrX3QgbWFzaykKIHsKIAkvKgogCSAqIE5PVEUhIFRoZSBsb2NhbCBBUElDIGlzbid0IHZlcnkgZ29vZCBhdCBoYW5kbGluZwpAQCAtMTA1MCwxNiArMTIzNCwxMyBAQAogCXN0YXRpYyBpbnQgY3VycmVudF92ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SLCBjdXJyZW50X29mZnNldCA9IDA7CiAJdW5zaWduZWQgaW50IG9sZF92ZWN0b3I7CiAJaW50IGNwdTsKLQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwotCi0JY2ZnID0gaXJxX2NmZyhpcnEpOwotCi0JLyogT25seSB0cnkgYW5kIGFsbG9jYXRlIGlycXMgb24gY3B1cyB0aGF0IGFyZSBwcmVzZW50ICovCi0JY3B1c19hbmQobWFzaywgbWFzaywgY3B1X29ubGluZV9tYXApOwogCiAJaWYgKChjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpIHx8IGNmZy0+bW92ZV9jbGVhbnVwX2NvdW50KQogCQlyZXR1cm4gLUVCVVNZOwogCisJLyogT25seSB0cnkgYW5kIGFsbG9jYXRlIGlycXMgb24gY3B1cyB0aGF0IGFyZSBwcmVzZW50ICovCisJY3B1c19hbmQobWFzaywgbWFzaywgY3B1X29ubGluZV9tYXApOworCiAJb2xkX3ZlY3RvciA9IGNmZy0+dmVjdG9yOwogCWlmIChvbGRfdmVjdG9yKSB7CiAJCWNwdW1hc2tfdCB0bXA7CkBAIC0xMTEzLDI0ICsxMjk0LDIyIEBACiAJcmV0dXJuIC1FTk9TUEM7CiB9CiAKLXN0YXRpYyBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSwgY3B1bWFza190IG1hc2spCitzdGF0aWMgaW50IGFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEsIHN0cnVjdCBpcnFfY2ZnICpjZmcsIGNwdW1hc2tfdCBtYXNrKQogewogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwotCWVyciA9IF9fYXNzaWduX2lycV92ZWN0b3IoaXJxLCBtYXNrKTsKKwllcnIgPSBfX2Fzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY2xlYXJfaXJxX3ZlY3RvcihpbnQgaXJxKQorc3RhdGljIHZvaWQgX19jbGVhcl9pcnFfdmVjdG9yKGludCBpcnEsIHN0cnVjdCBpcnFfY2ZnICpjZmcpCiB7Ci0Jc3RydWN0IGlycV9jZmcgKmNmZzsKIAljcHVtYXNrX3QgbWFzazsKIAlpbnQgY3B1LCB2ZWN0b3I7CiAKLQljZmcgPSBpcnFfY2ZnKGlycSk7CiAJQlVHX09OKCFjZmctPnZlY3Rvcik7CiAKIAl2ZWN0b3IgPSBjZmctPnZlY3RvcjsKQEAgLTExNjIsOSArMTM0MSwxMyBAQAogCS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB2ZWN0b3JfbG9jayBoZWxkICovCiAJaW50IGlycSwgdmVjdG9yOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJLyogTWFyayB0aGUgaW51c2UgdmVjdG9ycyAqLwotCWZvcl9lYWNoX2lycV9jZmcoaXJxLCBjZmcpIHsKKwlmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpIHsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAkJaWYgKCFjcHVfaXNzZXQoY3B1LCBjZmctPmRvbWFpbikpCiAJCQljb250aW51ZTsKIAkJdmVjdG9yID0gY2ZnLT52ZWN0b3I7CkBAIC0xMjE1LDExICsxMzk4LDggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpb2FwaWNfcmVnaXN0ZXJfaW50cihpbnQgaXJxLCB1bnNpZ25lZCBsb25nIHRyaWdnZXIpCitzdGF0aWMgdm9pZCBpb2FwaWNfcmVnaXN0ZXJfaW50cihpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGxvbmcgdHJpZ2dlcikKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7Ci0KLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAogCWlmICgodHJpZ2dlciA9PSBJT0FQSUNfQVVUTyAmJiBJT19BUElDX2lycV90cmlnZ2VyKGlycSkpIHx8CiAJICAgIHRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQpAQCAtMTMxMSw3ICsxNDkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfSU9fQVBJQ19pcnEoaW50IGFwaWMsIGludCBwaW4sIHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgdm9pZCBzZXR1cF9JT19BUElDX2lycShpbnQgYXBpYywgaW50IHBpbiwgdW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLAogCQkJICAgICAgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwpAQCAtMTMyMSwxMCArMTUwMSwxMCBAQAogCWlmICghSU9fQVBJQ19JUlEoaXJxKSkKIAkJcmV0dXJuOwogCi0JY2ZnID0gaXJxX2NmZyhpcnEpOworCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAogCW1hc2sgPSBUQVJHRVRfQ1BVUzsKLQlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBtYXNrKSkKKwlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQogCQlyZXR1cm47CiAKIAljcHVzX2FuZChtYXNrLCBjZmctPmRvbWFpbiwgbWFzayk7CkBAIC0xMzQxLDEyICsxNTIxLDEyIEBACiAJCQkgICAgICAgY2ZnLT52ZWN0b3IpKSB7CiAJCXByaW50aygiRmFpbGVkIHRvIHNldHVwIGlvYXBpYyBlbnRyeSBmb3IgaW9hcGljICAlZCwgcGluICVkXG4iLAogCQkgICAgICAgbXBfaW9hcGljc1thcGljXS5tcF9hcGljaWQsIHBpbik7Ci0JCV9fY2xlYXJfaXJxX3ZlY3RvcihpcnEpOworCQlfX2NsZWFyX2lycV92ZWN0b3IoaXJxLCBjZmcpOwogCQlyZXR1cm47CiAJfQogCi0JaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCB0cmlnZ2VyKTsKLQlpZiAoaXJxIDwgMTYpCisJaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCBkZXNjLCB0cmlnZ2VyKTsKKwlpZiAoaXJxIDwgTlJfSVJRU19MRUdBQ1kpCiAJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CiAKIAlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CkBAIC0xMzU2LDYgKzE1MzYsOSBAQAogewogCWludCBhcGljLCBwaW4sIGlkeCwgaXJxOwogCWludCBub3Rjb24gPSAwOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCWludCBjcHUgPSBib290X2NwdV9pZDsKIAogCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9ERUJVRyAiaW5pdCBJT19BUElDIElSUXNcbiIpOwogCkBAIC0xMzg3LDkgKzE1NzAsMTUgQEAKIAkJCWlmIChtdWx0aV90aW1lcl9jaGVjayhhcGljLCBpcnEpKQogCQkJCWNvbnRpbnVlOwogI2VuZGlmCi0JCQlhZGRfcGluX3RvX2lycShpcnEsIGFwaWMsIHBpbik7CisJCQlkZXNjID0gaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KGlycSwgY3B1KTsKKwkJCWlmICghZGVzYykgeworCQkJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjIGZvciAlZFxuIiwgaXJxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKwkJCWFkZF9waW5fdG9faXJxX2NwdShjZmcsIGNwdSwgYXBpYywgcGluKTsKIAotCQkJc2V0dXBfSU9fQVBJQ19pcnEoYXBpYywgcGluLCBpcnEsCisJCQlzZXR1cF9JT19BUElDX2lycShhcGljLCBwaW4sIGlycSwgZGVzYywKIAkJCQkJaXJxX3RyaWdnZXIoaWR4KSwgaXJxX3BvbGFyaXR5KGlkeCkpOwogCQl9CiAJfQpAQCAtMTQ0OCw2ICsxNjM3LDcgQEAKIAl1bmlvbiBJT19BUElDX3JlZ18wMyByZWdfMDM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCiAJaWYgKGFwaWNfdmVyYm9zaXR5ID09IEFQSUNfUVVJRVQpCkBAIC0xNTM3LDggKzE3MjcsMTMgQEAKIAl9CiAJfQogCXByaW50ayhLRVJOX0RFQlVHICJJUlEgdG8gcGluIG1hcHBpbmdzOlxuIik7Ci0JZm9yX2VhY2hfaXJxX2NmZyhpcnEsIGNmZykgewotCQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGNmZy0+aXJxXzJfcGluOworCWZvcl9lYWNoX2lycV9kZXNjKGlycSwgZGVzYykgeworCQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKKworCQlpZiAoIWRlc2MpCisJCQljb250aW51ZTsKKwkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCQllbnRyeSA9IGNmZy0+aXJxXzJfcGluOwogCQlpZiAoIWVudHJ5KQogCQkJY29udGludWU7CiAJCXByaW50ayhLRVJOX0RFQlVHICJJUlElZCAiLCBpcnEpOwpAQCAtMjAyMiwxNCArMjIxNywxNiBAQAogewogCWludCB3YXNfcGVuZGluZyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JaWYgKGlycSA8IDE2KSB7CisJaWYgKGlycSA8IE5SX0lSUVNfTEVHQUNZKSB7CiAJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CiAJCWlmIChpODI1OUFfaXJxX3BlbmRpbmcoaXJxKSkKIAkJCXdhc19wZW5kaW5nID0gMTsKIAl9Ci0JX191bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwljZmcgPSBpcnFfY2ZnKGlycSk7CisJX191bm1hc2tfSU9fQVBJQ19pcnEoY2ZnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHdhc19wZW5kaW5nOwpAQCAtMjA5MiwzNSArMjI4OSwzNyBAQAogICogYXMgc2ltcGxlIGFzIGVkZ2UgdHJpZ2dlcmVkIG1pZ3JhdGlvbiBhbmQgd2UgY2FuIGRvIHRoZSBpcnEgbWlncmF0aW9uCiAgKiB3aXRoIGEgc2ltcGxlIGF0b21pYyB1cGRhdGUgdG8gSU8tQVBJQyBSVEUuCiAgKi8KLXN0YXRpYyB2b2lkIG1pZ3JhdGVfaW9hcGljX2lycShpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3N0YXRpYyB2b2lkIG1pZ3JhdGVfaW9hcGljX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY3B1bWFza190IG1hc2spCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJY3B1bWFza190IHRtcCwgY2xlYW51cF9tYXNrOwogCXN0cnVjdCBpcnRlIGlydGU7CiAJaW50IG1vZGlmeV9pb2FwaWNfcnRlOwogCXVuc2lnbmVkIGludCBkZXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGlycTsKIAogCWNwdXNfYW5kKHRtcCwgbWFzaywgY3B1X29ubGluZV9tYXApOwogCWlmIChjcHVzX2VtcHR5KHRtcCkpCiAJCXJldHVybjsKIAorCWlycSA9IGRlc2MtPmlycTsKIAlpZiAoZ2V0X2lydGUoaXJxLCAmaXJ0ZSkpCiAJCXJldHVybjsKIAotCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIG1hc2spKQorCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKwlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQogCQlyZXR1cm47CiAKLQljZmcgPSBpcnFfY2ZnKGlycSk7CisJc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKKwogCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIG1hc2spOwogCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKIAotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCW1vZGlmeV9pb2FwaWNfcnRlID0gZGVzYy0+c3RhdHVzICYgSVJRX0xFVkVMOwogCWlmIChtb2RpZnlfaW9hcGljX3J0ZSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkJX190YXJnZXRfSU9fQVBJQ19pcnEoaXJxLCBkZXN0LCBjZmctPnZlY3Rvcik7CisJCV9fdGFyZ2V0X0lPX0FQSUNfaXJxKGlycSwgZGVzdCwgY2ZnKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTIxNDIsMTQgKzIzNDEsMTQgQEAKIAlkZXNjLT5hZmZpbml0eSA9IG1hc2s7CiB9CiAKLXN0YXRpYyBpbnQgbWlncmF0ZV9pcnFfcmVtYXBwZWRfbGV2ZWwoaW50IGlycSkKK3N0YXRpYyBpbnQgbWlncmF0ZV9pcnFfcmVtYXBwZWRfbGV2ZWxfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IHJldCA9IC0xOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAotCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwltYXNrX0lPX0FQSUNfaXJxX2Rlc2MoZGVzYyk7CiAKLQlpZiAoaW9fYXBpY19sZXZlbF9hY2tfcGVuZGluZyhpcnEpKSB7CisJaWYgKGlvX2FwaWNfbGV2ZWxfYWNrX3BlbmRpbmcoY2ZnKSkgewogCQkvKgogCQkgKiBJbnRlcnJ1cHQgaW4gcHJvZ3Jlc3MuIE1pZ3JhdGluZyBpcnEgbm93IHdpbGwgY2hhbmdlIHRoZQogCQkgKiB2ZWN0b3IgaW5mb3JtYXRpb24gaW4gdGhlIElPLUFQSUMgUlRFIGFuZCB0aGF0IHdpbGwgY29uZnVzZQpAQCAtMjE2MSwxNCArMjM2MCwxNSBAQAogCX0KIAogCS8qIGV2ZXJ0aGluZyBpcyBjbGVhci4gd2UgaGF2ZSByaWdodCBvZiB3YXkgKi8KLQltaWdyYXRlX2lvYXBpY19pcnEoaXJxLCBkZXNjLT5wZW5kaW5nX21hc2spOworCW1pZ3JhdGVfaW9hcGljX2lycV9kZXNjKGRlc2MsIGRlc2MtPnBlbmRpbmdfbWFzayk7CiAKIAlyZXQgPSAwOwogCWRlc2MtPnN0YXR1cyAmPSB+SVJRX01PVkVfUEVORElORzsKIAljcHVzX2NsZWFyKGRlc2MtPnBlbmRpbmdfbWFzayk7CiAKIHVubWFzazoKLQl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwl1bm1hc2tfSU9fQVBJQ19pcnFfZGVzYyhkZXNjKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNzgsNiArMjM3OCw5IEBACiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfTU9WRV9QRU5ESU5HKSB7CiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMTk4LDE4ICsyNDAxLDIyIEBACiAvKgogICogTWlncmF0ZXMgdGhlIElSUSBkZXN0aW5hdGlvbiBpbiB0aGUgcHJvY2VzcyBjb250ZXh0LgogICovCitzdGF0aWMgdm9pZCBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY3B1bWFza190IG1hc2spCit7CisJaWYgKGRlc2MtPnN0YXR1cyAmIElSUV9MRVZFTCkgeworCQlkZXNjLT5zdGF0dXMgfD0gSVJRX01PVkVfUEVORElORzsKKwkJZGVzYy0+cGVuZGluZ19tYXNrID0gbWFzazsKKwkJbWlncmF0ZV9pcnFfcmVtYXBwZWRfbGV2ZWxfZGVzYyhkZXNjKTsKKwkJcmV0dXJuOworCX0KKworCW1pZ3JhdGVfaW9hcGljX2lycV9kZXNjKGRlc2MsIG1hc2spOworfQogc3RhdGljIHZvaWQgc2V0X2lyX2lvYXBpY19hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAotCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfTEVWRUwpIHsKLQkJZGVzYy0+c3RhdHVzIHw9IElSUV9NT1ZFX1BFTkRJTkc7Ci0JCWRlc2MtPnBlbmRpbmdfbWFzayA9IG1hc2s7Ci0JCW1pZ3JhdGVfaXJxX3JlbWFwcGVkX2xldmVsKGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQltaWdyYXRlX2lvYXBpY19pcnEoaXJxLCBtYXNrKTsKKwlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwogfQogI2VuZGlmCiAKQEAgLTIyMjgsNiArMjQzNSw5IEBACiAJCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJCWlycSA9IF9fZ2V0X2NwdV92YXIodmVjdG9yX2lycSlbdmVjdG9yXTsKIAorCQlpZiAoaXJxID09IC0xKQorCQkJY29udGludWU7CisKIAkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJCWlmICghZGVzYykKIAkJCWNvbnRpbnVlOwpAQCAtMjI0OSwxOSArMjQ1OSw0MCBAQAogCWlycV9leGl0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlycV9jb21wbGV0ZV9tb3ZlKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBpcnFfY29tcGxldGVfbW92ZShzdHJ1Y3QgaXJxX2Rlc2MgKipkZXNjcCkKIHsKLQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZyhpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9ICpkZXNjcDsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCXVuc2lnbmVkIHZlY3RvciwgbWU7CiAKLQlpZiAobGlrZWx5KCFjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpKQorCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9pbl9wcm9ncmVzcykpIHsKKyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDCisJCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcpKQorCQkJcmV0dXJuOworCisJCS8qIGRvbWFpbiBoYXMgbm90IGNoYW5nZWQsIGJ1dCBhZmZpbml0eSBkaWQgKi8KKwkJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCWlmIChjcHVfaXNzZXQobWUsIGRlc2MtPmFmZmluaXR5KSkgeworCQkJKmRlc2NwID0gZGVzYyA9IG1vdmVfaXJxX2Rlc2MoZGVzYywgbWUpOworCQkJLyogZ2V0IHRoZSBuZXcgb25lICovCisJCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJCQljZmctPm1vdmVfZGVzY19wZW5kaW5nID0gMDsKKwkJfQorI2VuZGlmCiAJCXJldHVybjsKKwl9CiAKIAl2ZWN0b3IgPSB+Z2V0X2lycV9yZWdzKCktPm9yaWdfYXg7CiAJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaWYgKCh2ZWN0b3IgPT0gY2ZnLT52ZWN0b3IpICYmIGNwdV9pc3NldChtZSwgY2ZnLT5kb21haW4pKSB7CiAJCWNwdW1hc2tfdCBjbGVhbnVwX21hc2s7CiAKKyNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDCisJCSpkZXNjcCA9IGRlc2MgPSBtb3ZlX2lycV9kZXNjKGRlc2MsIG1lKTsKKwkJLyogZ2V0IHRoZSBuZXcgb25lICovCisJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKyNlbmRpZgorCiAJCWNwdXNfYW5kKGNsZWFudXBfbWFzaywgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hcCk7CiAJCWNmZy0+bW92ZV9jbGVhbnVwX2NvdW50ID0gY3B1c193ZWlnaHQoY2xlYW51cF9tYXNrKTsKIAkJc2VuZF9JUElfbWFzayhjbGVhbnVwX21hc2ssIElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SKTsKQEAgLTIyNjksOCArMjUwMCw5IEBACiAJfQogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfY29tcGxldGVfbW92ZSh1bnNpZ25lZCBpbnQgaXJxKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGlycV9jb21wbGV0ZV9tb3ZlKHN0cnVjdCBpcnFfZGVzYyAqKmRlc2NwKSB7fQogI2VuZGlmCisKICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogc3RhdGljIHZvaWQgYWNrX3gyYXBpY19sZXZlbCh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtMjI4MSwxMSArMjUxMywxNCBAQAogewogCWFja194MkFQSUNfaXJxKCk7CiB9CisKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBhY2tfYXBpY19lZGdlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaXJxX2NvbXBsZXRlX21vdmUoaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaXJxX2NvbXBsZXRlX21vdmUoJmRlc2MpOwogCW1vdmVfbmF0aXZlX2lycShpcnEpOwogCWFja19BUElDX2lycSgpOwogfQpAQCAtMjI5NCwxOCArMjUyOSwyMSBAQAogCiBzdGF0aWMgdm9pZCBhY2tfYXBpY19sZXZlbCh1bnNpZ25lZCBpbnQgaXJxKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJdW5zaWduZWQgbG9uZyB2OwogCWludCBpOwogI2VuZGlmCisJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlpbnQgZG9fdW5tYXNrX2lycSA9IDA7CiAKLQlpcnFfY29tcGxldGVfbW92ZShpcnEpOworCWlycV9jb21wbGV0ZV9tb3ZlKCZkZXNjKTsKICNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQogCS8qIElmIHdlIGFyZSBtb3ZpbmcgdGhlIGlycSB3ZSBuZWVkIHRvIG1hc2sgaXQgKi8KLQlpZiAodW5saWtlbHkoaXJxX3RvX2Rlc2MoaXJxKS0+c3RhdHVzICYgSVJRX01PVkVfUEVORElORykpIHsKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgSVJRX01PVkVfUEVORElORykpIHsKIAkJZG9fdW5tYXNrX2lycSA9IDE7Ci0JCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwkJbWFza19JT19BUElDX2lycV9kZXNjKGRlc2MpOwogCX0KICNlbmRpZgogCkBAIC0yMzI5LDcgKzI1NjcsOCBAQAogCSogb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0IGVzY2FwaW5nIG1lYW53aGlsZS4KIAkqIFRoZSBpZGVhIGlzIGZyb20gTWFuZnJlZCBTcHJhdWwuICAtLW1hY3JvCiAJKi8KLQlpID0gaXJxX2NmZyhpcnEpLT52ZWN0b3I7CisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCWkgPSBjZmctPnZlY3RvcjsKIAogCXYgPSBhcGljX3JlYWQoQVBJQ19UTVIgKyAoKGkgJiB+MHgxZikgPj4gMSkpOwogI2VuZGlmCkBAIC0yMzY4LDE3ICsyNjA3LDE4IEBACiAJCSAqIGFjY3VyYXRlIGFuZCBpcyBjYXVzaW5nIHByb2JsZW1zIHRoZW4gaXQgaXMgYSBoYXJkd2FyZSBidWcKIAkJICogYW5kIHlvdSBjYW4gZ28gdGFsayB0byB0aGUgY2hpcHNldCB2ZW5kb3IgYWJvdXQgaXQuCiAJCSAqLwotCQlpZiAoIWlvX2FwaWNfbGV2ZWxfYWNrX3BlbmRpbmcoaXJxKSkKKwkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCQlpZiAoIWlvX2FwaWNfbGV2ZWxfYWNrX3BlbmRpbmcoY2ZnKSkKIAkJCW1vdmVfbWFza2VkX2lycShpcnEpOwotCQl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwkJdW5tYXNrX0lPX0FQSUNfaXJxX2Rlc2MoZGVzYyk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWlmICghKHYgJiAoMSA8PCAoaSAmIDB4MWYpKSkpIHsKIAkJYXRvbWljX2luYygmaXJxX21pc19jb3VudCk7CiAJCXNwaW5fbG9jaygmaW9hcGljX2xvY2spOwotCQlfX21hc2tfYW5kX2VkZ2VfSU9fQVBJQ19pcnEoaXJxKTsKLQkJX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxKGlycSk7CisJCV9fbWFza19hbmRfZWRnZV9JT19BUElDX2lycShjZmcpOworCQlfX3VubWFza19hbmRfbGV2ZWxfSU9fQVBJQ19pcnEoY2ZnKTsKIAkJc3Bpbl91bmxvY2soJmlvYXBpY19sb2NrKTsKIAl9CiAjZW5kaWYKQEAgLTI0MjksMjAgKzI2NjksMjIgQEAKIAkgKiBBbHNvLCB3ZSd2ZSBnb3QgdG8gYmUgY2FyZWZ1bCBub3QgdG8gdHJhc2ggZ2F0ZQogCSAqIDB4ODAsIGJlY2F1c2UgaW50IDB4ODAgaXMgaG0sIGtpbmQgb2YgaW1wb3J0YW50aXNoLiA7KQogCSAqLwotCWZvcl9lYWNoX2lycV9jZmcoaXJxLCBjZmcpIHsKLQkJaWYgKElPX0FQSUNfSVJRKGlycSkgJiYgIWNmZy0+dmVjdG9yKSB7CisJZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCisJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKwkJaWYgKElPX0FQSUNfSVJRKGlycSkgJiYgY2ZnICYmICFjZmctPnZlY3RvcikgewogCQkJLyoKIAkJCSAqIEhtbS4uIFdlIGRvbid0IGhhdmUgYW4gZW50cnkgZm9yIHRoaXMsCiAJCQkgKiBzbyBkZWZhdWx0IHRvIGFuIG9sZC1mYXNoaW9uZWQgODI1OQogCQkJICogaW50ZXJydXB0IGlmIHdlIGNhbi4uCiAJCQkgKi8KLQkJCWlmIChpcnEgPCAxNikKKwkJCWlmIChpcnEgPCBOUl9JUlFTX0xFR0FDWSkKIAkJCQltYWtlXzgyNTlBX2lycShpcnEpOwotCQkJZWxzZSB7Ci0JCQkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJCQllbHNlCiAJCQkJLyogU3RyYW5nZS4gT2gsIHdlbGwuLiAqLwogCQkJCWRlc2MtPmNoaXAgPSAmbm9faXJxX2NoaXA7Ci0JCQl9CiAJCX0KIAl9CiB9CkBAIC0yNDY3LDcgKzI3MDksNyBAQAogCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFja19sYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhY2tfbGFwaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJYWNrX0FQSUNfaXJxKCk7CiB9CkBAIC0yNDc5LDExICsyNzIxLDggQEAKIAkuYWNrCQk9IGFja19sYXBpY19pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBsYXBpY19yZWdpc3Rlcl9pbnRyKGludCBpcnEpCitzdGF0aWMgdm9pZCBsYXBpY19yZWdpc3Rlcl9pbnRyKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7Ci0KLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlkZXNjLT5zdGF0dXMgJj0gfklSUV9MRVZFTDsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZsYXBpY19jaGlwLCBoYW5kbGVfZWRnZV9pcnEsCiAJCQkJICAgICAgImVkZ2UiKTsKQEAgLTI1ODcsNyArMjgyNiw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfdGltZXIodm9pZCkKIHsKLQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZygwKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYygwKTsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCWludCBjcHUgPSBib290X2NwdV9pZDsKIAlpbnQgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZlcjsKQEAgLTI2MDIsNyArMjg0Myw3IEBACiAJICogZ2V0L3NldCB0aGUgdGltZXIgSVJRIHZlY3RvcjoKIAkgKi8KIAlkaXNhYmxlXzgyNTlBX2lycSgwKTsKLQlhc3NpZ25faXJxX3ZlY3RvcigwLCBUQVJHRVRfQ1BVUyk7CisJYXNzaWduX2lycV92ZWN0b3IoMCwgY2ZnLCBUQVJHRVRfQ1BVUyk7CiAKIAkvKgogCSAqIEFzIElSUTAgaXMgdG8gYmUgZW5hYmxlZCBpbiB0aGUgODI1OUEsIHRoZSB2aXJ0dWFsCkBAIC0yNjUzLDEwICsyODk0LDEwIEBACiAJCSAqIE9rLCBkb2VzIElSUTAgdGhyb3VnaCB0aGUgSU9BUElDIHdvcms/CiAJCSAqLwogCQlpZiAobm9fcGluMSkgewotCQkJYWRkX3Bpbl90b19pcnEoMCwgYXBpYzEsIHBpbjEpOworCQkJYWRkX3Bpbl90b19pcnFfY3B1KGNmZywgY3B1LCBhcGljMSwgcGluMSk7CiAJCQlzZXR1cF90aW1lcl9JUlEwX3BpbihhcGljMSwgcGluMSwgY2ZnLT52ZWN0b3IpOwogCQl9Ci0JCXVubWFza19JT19BUElDX2lycSgwKTsKKwkJdW5tYXNrX0lPX0FQSUNfaXJxX2Rlc2MoZGVzYyk7CiAJCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgewogCQkJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgewogCQkJCXNldHVwX25taSgpOwpAQCAtMjY4Miw5ICsyOTIzLDkgQEAKIAkJLyoKIAkJICogbGVnYWN5IGRldmljZXMgc2hvdWxkIGJlIGNvbm5lY3RlZCB0byBJTyBBUElDICMwCiAJCSAqLwotCQlyZXBsYWNlX3Bpbl9hdF9pcnEoMCwgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yKTsKKwkJcmVwbGFjZV9waW5fYXRfaXJxX2NwdShjZmcsIGNwdSwgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yKTsKIAkJc2V0dXBfdGltZXJfSVJRMF9waW4oYXBpYzIsIHBpbjIsIGNmZy0+dmVjdG9yKTsKLQkJdW5tYXNrX0lPX0FQSUNfaXJxKDApOworCQl1bm1hc2tfSU9fQVBJQ19pcnFfZGVzYyhkZXNjKTsKIAkJZW5hYmxlXzgyNTlBX2lycSgwKTsKIAkJaWYgKHRpbWVyX2lycV93b3JrcygpKSB7CiAJCQlhcGljX3ByaW50ayhBUElDX1FVSUVULCBLRVJOX0lORk8gIi4uLi4uLi4gd29ya3MuXG4iKTsKQEAgLTI3MTYsNyArMjk1Nyw3IEBACiAJYXBpY19wcmludGsoQVBJQ19RVUlFVCwgS0VSTl9JTkZPCiAJCSAgICAiLi4udHJ5aW5nIHRvIHNldCB1cCB0aW1lciBhcyBWaXJ0dWFsIFdpcmUgSVJRLi4uXG4iKTsKIAotCWxhcGljX3JlZ2lzdGVyX2ludHIoMCk7CisJbGFwaWNfcmVnaXN0ZXJfaW50cigwLCBkZXNjKTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19ETV9GSVhFRCB8IGNmZy0+dmVjdG9yKTsJLyogRml4ZWQgbW9kZSAqLwogCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAKQEAgLTI5MDEsMjIgKzMxNDIsMjYgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXVuc2lnbmVkIGludCBuZXc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnX25ldzsKLQotCWlycV93YW50ID0gbnJfaXJxcyAtIDE7CisJc3RydWN0IGlycV9jZmcgKmNmZ19uZXcgPSBOVUxMOworCWludCBjcHUgPSBib290X2NwdV9pZDsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2NfbmV3ID0gTlVMTDsKIAogCWlycSA9IDA7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7Ci0JZm9yIChuZXcgPSBpcnFfd2FudDsgbmV3ID4gMDsgbmV3LS0pIHsKKwlmb3IgKG5ldyA9IGlycV93YW50OyBuZXcgPCBOUl9JUlFTOyBuZXcrKykgewogCQlpZiAocGxhdGZvcm1fbGVnYWN5X2lycShuZXcpKQogCQkJY29udGludWU7Ci0JCWNmZ19uZXcgPSBpcnFfY2ZnKG5ldyk7Ci0JCWlmIChjZmdfbmV3ICYmIGNmZ19uZXctPnZlY3RvciAhPSAwKQorCisJCWRlc2NfbmV3ID0gaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KG5ldywgY3B1KTsKKwkJaWYgKCFkZXNjX25ldykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY2FuIG5vdCBnZXQgaXJxX2Rlc2MgZm9yICVkXG4iLCBuZXcpOwogCQkJY29udGludWU7Ci0JCS8qIGNoZWNrIGlmIG5lZWQgdG8gY3JlYXRlIG9uZSAqLwotCQlpZiAoIWNmZ19uZXcpCi0JCQljZmdfbmV3ID0gaXJxX2NmZ19hbGxvYyhuZXcpOwotCQlpZiAoX19hc3NpZ25faXJxX3ZlY3RvcihuZXcsIFRBUkdFVF9DUFVTKSA9PSAwKQorCQl9CisJCWNmZ19uZXcgPSBkZXNjX25ldy0+Y2hpcF9kYXRhOworCisJCWlmIChjZmdfbmV3LT52ZWN0b3IgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoX19hc3NpZ25faXJxX3ZlY3RvcihuZXcsIGNmZ19uZXcsIFRBUkdFVF9DUFVTKSA9PSAwKQogCQkJaXJxID0gbmV3OwogCQlicmVhazsKIAl9CkBAIC0yOTI0LDE1ICszMTY5LDIxIEBACiAKIAlpZiAoaXJxID4gMCkgewogCQlkeW5hbWljX2lycV9pbml0KGlycSk7CisJCS8qIHJlc3RvcmUgaXQsIGluIGNhc2UgZHluYW1pY19pcnFfaW5pdCBjbGVhciBpdCAqLworCQlpZiAoZGVzY19uZXcpCisJCQlkZXNjX25ldy0+Y2hpcF9kYXRhID0gY2ZnX25ldzsKIAl9CiAJcmV0dXJuIGlycTsKIH0KIAorc3RhdGljIGludCBucl9pcnFzX2dzaSA9IE5SX0lSUVNfTEVHQUNZOwogaW50IGNyZWF0ZV9pcnEodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxX3dhbnQ7CiAJaW50IGlycTsKIAotCWlycSA9IGNyZWF0ZV9pcnFfbnIobnJfaXJxcyAtIDEpOworCWlycV93YW50ID0gbnJfaXJxc19nc2k7CisJaXJxID0gY3JlYXRlX2lycV9ucihpcnFfd2FudCk7CiAKIAlpZiAoaXJxID09IDApCiAJCWlycSA9IC0xOwpAQCAtMjk0MywxNCArMzE5NCwyMiBAQAogdm9pZCBkZXN0cm95X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlycV9jZmcgKmNmZzsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKKwkvKiBzdG9yZSBpdCwgaW4gY2FzZSBkeW5hbWljX2lycV9jbGVhbnVwIGNsZWFyIGl0ICovCisJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCWR5bmFtaWNfaXJxX2NsZWFudXAoaXJxKTsKKwkvKiBjb25uZWN0IGJhY2sgaXJxX2NmZyAqLworCWlmIChkZXNjKQorCQlkZXNjLT5jaGlwX2RhdGEgPSBjZmc7CiAKICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogCWZyZWVfaXJ0ZShpcnEpOwogI2VuZGlmCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7Ci0JX19jbGVhcl9pcnFfdmVjdG9yKGlycSk7CisJX19jbGVhcl9pcnFfdmVjdG9yKGlycSwgY2ZnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yOTY1LDEyICszMjI0LDEyIEBACiAJdW5zaWduZWQgZGVzdDsKIAljcHVtYXNrX3QgdG1wOwogCisJY2ZnID0gaXJxX2NmZyhpcnEpOwogCXRtcCA9IFRBUkdFVF9DUFVTOwotCWVyciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgdG1wKTsKKwllcnIgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEsIGNmZywgdG1wKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JY2ZnID0gaXJxX2NmZyhpcnEpOwogCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIHRtcCk7CiAJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCkBAIC0zMDI4LDM1ICszMjg3LDM1IEBACiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCiB7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCXN0cnVjdCBtc2lfbXNnIG1zZzsKIAl1bnNpZ25lZCBpbnQgZGVzdDsKIAljcHVtYXNrX3QgdG1wOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAogCWNwdXNfYW5kKHRtcCwgbWFzaywgY3B1X29ubGluZV9tYXApOwogCWlmIChjcHVzX2VtcHR5KHRtcCkpCiAJCXJldHVybjsKIAotCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIG1hc2spKQorCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKwlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQogCQlyZXR1cm47CiAKLQljZmcgPSBpcnFfY2ZnKGlycSk7CisJc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKKwogCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIG1hc2spOwogCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKIAotCXJlYWRfbXNpX21zZyhpcnEsICZtc2cpOworCXJlYWRfbXNpX21zZ19kZXNjKGRlc2MsICZtc2cpOwogCiAJbXNnLmRhdGEgJj0gfk1TSV9EQVRBX1ZFQ1RPUl9NQVNLOwogCW1zZy5kYXRhIHw9IE1TSV9EQVRBX1ZFQ1RPUihjZmctPnZlY3Rvcik7CiAJbXNnLmFkZHJlc3NfbG8gJj0gfk1TSV9BRERSX0RFU1RfSURfTUFTSzsKIAltc2cuYWRkcmVzc19sbyB8PSBNU0lfQUREUl9ERVNUX0lEKGRlc3QpOwogCi0Jd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCXdyaXRlX21zaV9tc2dfZGVzYyhkZXNjLCAmbXNnKTsKIAlkZXNjLT5hZmZpbml0eSA9IG1hc2s7CiB9Ci0KICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogLyoKICAqIE1pZ3JhdGUgdGhlIE1TSSBpcnEgdG8gYW5vdGhlciBjcHVtYXNrLiBUaGlzIG1pZ3JhdGlvbiBpcwpAQCAtMzA2NCwxMSArMzMyMywxMSBAQAogICovCiBzdGF0aWMgdm9pZCBpcl9zZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKIHsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJdW5zaWduZWQgaW50IGRlc3Q7CiAJY3B1bWFza190IHRtcCwgY2xlYW51cF9tYXNrOwogCXN0cnVjdCBpcnRlIGlydGU7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJY3B1c19hbmQodG1wLCBtYXNrLCBjcHVfb25saW5lX21hcCk7CiAJaWYgKGNwdXNfZW1wdHkodG1wKSkKQEAgLTMwNzcsMTAgKzMzMzYsMTIgQEAKIAlpZiAoZ2V0X2lydGUoaXJxLCAmaXJ0ZSkpCiAJCXJldHVybjsKIAotCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIG1hc2spKQorCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKKwlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQogCQlyZXR1cm47CiAKLQljZmcgPSBpcnFfY2ZnKGlycSk7CisJc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKKwogCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIG1hc2spOwogCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKIApAQCAtMzEwNCw5ICszMzY1LDkgQEAKIAkJY2ZnLT5tb3ZlX2luX3Byb2dyZXNzID0gMDsKIAl9CiAKLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlkZXNjLT5hZmZpbml0eSA9IG1hc2s7CiB9CisKICNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzE2NSw3ICszNDI2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHNldHVwX21zaV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaV9kZXNjICpkZXNjLCBpbnQgaXJxKQorc3RhdGljIGludCBzZXR1cF9tc2lfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqbXNpZGVzYywgaW50IGlycSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtc2lfbXNnIG1zZzsKQEAgLTMxNzQsNyArMzQzNSw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlzZXRfaXJxX21zaShpcnEsIGRlc2MpOworCXNldF9pcnFfbXNpKGlycSwgbXNpZGVzYyk7CiAJd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwogCiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKQEAgLTMxOTQsMjYgKzM0NTUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBidWlsZF9pcnFfZm9yX3BjaV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCi0JaXJxID0gZGV2LT5idXMtPm51bWJlcjsKLQlpcnEgPDw9IDg7Ci0JaXJxIHw9IGRldi0+ZGV2Zm47Ci0JaXJxIDw8PSAxMjsKLQotCXJldHVybiBpcnE7Ci19Ci0KLWludCBhcmNoX3NldHVwX21zaV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaV9kZXNjICpkZXNjKQoraW50IGFyY2hfc2V0dXBfbXNpX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpX2Rlc2MgKm1zaWRlc2MpCiB7CiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBpcnFfd2FudDsKIAotCWlycV93YW50ID0gYnVpbGRfaXJxX2Zvcl9wY2lfZGV2KGRldikgKyAweDEwMDsKLQorCWlycV93YW50ID0gbnJfaXJxc19nc2k7CiAJaXJxID0gY3JlYXRlX2lycV9ucihpcnFfd2FudCk7CiAJaWYgKGlycSA9PSAwKQogCQlyZXR1cm4gLTE7CkBAIC0zMjI3LDcgKzM0NzUsNyBAQAogCQlnb3RvIGVycm9yOwogbm9faXI6CiAjZW5kaWYKLQlyZXQgPSBzZXR1cF9tc2lfaXJxKGRldiwgZGVzYywgaXJxKTsKKwlyZXQgPSBzZXR1cF9tc2lfaXJxKGRldiwgbXNpZGVzYywgaXJxKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXN0cm95X2lycShpcnEpOwogCQlyZXR1cm4gcmV0OwpAQCAtMzI0NSw3ICszNDkzLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCByZXQsIHN1Yl9oYW5kbGU7Ci0Jc3RydWN0IG1zaV9kZXNjICpkZXNjOworCXN0cnVjdCBtc2lfZGVzYyAqbXNpZGVzYzsKIAl1bnNpZ25lZCBpbnQgaXJxX3dhbnQ7CiAKICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUApAQCAtMzI1MywxMCArMzUwMSwxMSBAQAogCWludCBpbmRleCA9IDA7CiAjZW5kaWYKIAotCWlycV93YW50ID0gYnVpbGRfaXJxX2Zvcl9wY2lfZGV2KGRldikgKyAweDEwMDsKKwlpcnFfd2FudCA9IG5yX2lycXNfZ3NpOwogCXN1Yl9oYW5kbGUgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKLQkJaXJxID0gY3JlYXRlX2lycV9ucihpcnFfd2FudC0tKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1zaWRlc2MsICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCWlycSA9IGNyZWF0ZV9pcnFfbnIoaXJxX3dhbnQpOworCQlpcnFfd2FudCsrOwogCQlpZiAoaXJxID09IDApCiAJCQlyZXR1cm4gLTE7CiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKQEAgLTMyODgsNyArMzUzNyw3IEBACiAJCX0KIG5vX2lyOgogI2VuZGlmCi0JCXJldCA9IHNldHVwX21zaV9pcnEoZGV2LCBkZXNjLCBpcnEpOworCQlyZXQgPSBzZXR1cF9tc2lfaXJxKGRldiwgbXNpZGVzYywgaXJxKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycm9yOwogCQlzdWJfaGFuZGxlKys7CkBAIC0zMzA5LDIwICszNTU4LDIyIEBACiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgZG1hcl9tc2lfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdW5zaWduZWQgaW50IGRlc3Q7CiAJY3B1bWFza190IHRtcDsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAKIAljcHVzX2FuZCh0bXAsIG1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKIAlpZiAoY3B1c19lbXB0eSh0bXApKQogCQlyZXR1cm47CiAKLQlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBtYXNrKSkKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKSkKIAkJcmV0dXJuOwogCi0JY2ZnID0gaXJxX2NmZyhpcnEpOworCXNldF9leHRyYV9tb3ZlX2Rlc2MoZGVzYywgbWFzayk7CisKIAljcHVzX2FuZCh0bXAsIGNmZy0+ZG9tYWluLCBtYXNrKTsKIAlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKHRtcCk7CiAKQEAgLTMzMzQsOSArMzU4NSw5IEBACiAJbXNnLmFkZHJlc3NfbG8gfD0gTVNJX0FERFJfREVTVF9JRChkZXN0KTsKIAogCWRtYXJfbXNpX3dyaXRlKGlycSwgJm1zZyk7Ci0JZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJZGVzYy0+YWZmaW5pdHkgPSBtYXNrOwogfQorCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBzdHJ1Y3QgaXJxX2NoaXAgZG1hcl9tc2lfdHlwZSA9IHsKQEAgLTMzNzAsOCArMzYyMSw4IEBACiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgaHBldF9tc2lfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJc3RydWN0IG1zaV9tc2cgbXNnOwogCXVuc2lnbmVkIGludCBkZXN0OwogCWNwdW1hc2tfdCB0bXA7CkBAIC0zMzgwLDEwICszNjMxLDEyIEBACiAJaWYgKGNwdXNfZW1wdHkodG1wKSkKIAkJcmV0dXJuOwogCi0JaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgbWFzaykpCisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIGNmZywgbWFzaykpCiAJCXJldHVybjsKIAotCWNmZyA9IGlycV9jZmcoaXJxKTsKKwlzZXRfZXh0cmFfbW92ZV9kZXNjKGRlc2MsIG1hc2spOworCiAJY3B1c19hbmQodG1wLCBjZmctPmRvbWFpbiwgbWFzayk7CiAJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCkBAIC0zMzk1LDkgKzM2NDgsOSBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAlocGV0X21zaV93cml0ZShpcnEsICZtc2cpOwotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCWRlc2MtPmFmZmluaXR5ID0gbWFzazsKIH0KKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RydWN0IGlycV9jaGlwIGhwZXRfbXNpX3R5cGUgPSB7CkBAIC0zNDUyLDI2ICszNzA1LDI4IEBACiAKIHN0YXRpYyB2b2lkIHNldF9odF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCiB7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCXVuc2lnbmVkIGludCBkZXN0OwogCWNwdW1hc2tfdCB0bXA7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJY3B1c19hbmQodG1wLCBtYXNrLCBjcHVfb25saW5lX21hcCk7CiAJaWYgKGNwdXNfZW1wdHkodG1wKSkKIAkJcmV0dXJuOwogCi0JaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgbWFzaykpCisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCWlmIChhc3NpZ25faXJxX3ZlY3RvcihpcnEsIGNmZywgbWFzaykpCiAJCXJldHVybjsKIAotCWNmZyA9IGlycV9jZmcoaXJxKTsKKwlzZXRfZXh0cmFfbW92ZV9kZXNjKGRlc2MsIG1hc2spOworCiAJY3B1c19hbmQodG1wLCBjZmctPmRvbWFpbiwgbWFzayk7CiAJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCiAJdGFyZ2V0X2h0X2lycShpcnEsIGRlc3QsIGNmZy0+dmVjdG9yKTsKLQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlkZXNjLT5hZmZpbml0eSA9IG1hc2s7CiB9CisKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGh0X2lycV9jaGlwID0gewpAQCAtMzQ5MSwxMyArMzc0NiwxMyBAQAogCWludCBlcnI7CiAJY3B1bWFza190IHRtcDsKIAorCWNmZyA9IGlycV9jZmcoaXJxKTsKIAl0bXAgPSBUQVJHRVRfQ1BVUzsKLQllcnIgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEsIHRtcCk7CisJZXJyID0gYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIHRtcCk7CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IGh0X2lycV9tc2cgbXNnOwogCQl1bnNpZ25lZCBkZXN0OwogCi0JCWNmZyA9IGlycV9jZmcoaXJxKTsKIAkJY3B1c19hbmQodG1wLCBjZmctPmRvbWFpbiwgdG1wKTsKIAkJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCkBAIC0zNTQzLDcgKzM3OTgsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCWVyciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgKmVsaWdpYmxlX2NwdSk7CisJY2ZnID0gaXJxX2NmZyhpcnEpOworCisJZXJyID0gYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsICplbGlnaWJsZV9jcHUpOwogCWlmIChlcnIgIT0gMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzU1Miw4ICszODA5LDYgQEAKIAkJCQkgICAgICBpcnFfbmFtZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAotCWNmZyA9IGlycV9jZmcoaXJxKTsKLQogCW1tcl92YWx1ZSA9IDA7CiAJZW50cnkgPSAoc3RydWN0IHV2X0lPX0FQSUNfcm91dGVfZW50cnkgKikmbW1yX3ZhbHVlOwogCUJVR19PTihzaXplb2Yoc3RydWN0IHV2X0lPX0FQSUNfcm91dGVfZW50cnkpICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CkBAIC0zNjA1LDkgKzM4NjAsMTYgQEAKIAlyZXR1cm4gcmVnXzAxLmJpdHMuZW50cmllczsKIH0KIAotaW50IF9faW5pdCBwcm9iZV9ucl9pcnFzKHZvaWQpCit2b2lkIF9faW5pdCBwcm9iZV9ucl9pcnFzX2dzaSh2b2lkKQogewotCXJldHVybiBOUl9JUlFTOworCWludCBpZHg7CisJaW50IG5yID0gMDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnJfaW9hcGljczsgaWR4KyspCisJCW5yICs9IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMoaWR4KSArIDE7CisKKwlpZiAobnIgPiBucl9pcnFzX2dzaSkKKwkJbnJfaXJxc19nc2kgPSBucjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3MDYsMTkgKzM5NjgsMzEgQEAKIAogaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nIChpbnQgaW9hcGljLCBpbnQgcGluLCBpbnQgaXJxLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCWludCBjcHUgPSBib290X2NwdV9pZDsKKwogCWlmICghSU9fQVBJQ19JUlEoaXJxKSkgewogCQlhcGljX3ByaW50ayhBUElDX1FVSUVULEtFUk5fRVJSICJJT0FQSUNbJWRdOiBJbnZhbGlkIHJlZmVyZW5jZSB0byBJUlEgMFxuIiwKIAkJCWlvYXBpYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19jcHUoaXJxLCBjcHUpOworCWlmICghZGVzYykgeworCQlwcmludGsoS0VSTl9JTkZPICJjYW4gbm90IGdldCBpcnFfZGVzYyAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyoKIAkgKiBJUlFzIDwgMTYgYXJlIGFscmVhZHkgaW4gdGhlIGlycV8yX3BpbltdIG1hcAogCSAqLwotCWlmIChpcnEgPj0gMTYpCi0JCWFkZF9waW5fdG9faXJxKGlycSwgaW9hcGljLCBwaW4pOworCWlmIChpcnEgPj0gTlJfSVJRU19MRUdBQ1kpIHsKKwkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCQlhZGRfcGluX3RvX2lycV9jcHUoY2ZnLCBjcHUsIGlvYXBpYywgcGluKTsKKwl9CiAKLQlzZXR1cF9JT19BUElDX2lycShpb2FwaWMsIHBpbiwgaXJxLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CisJc2V0dXBfSU9fQVBJQ19pcnEoaW9hcGljLCBwaW4sIGlycSwgZGVzYywgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNzcyLDkgKzQwNDYsMTAgQEAKIAkJCSAqIHdoZW4geW91IGhhdmUgdG9vIG1hbnkgZGV2aWNlcywgYmVjYXVzZSBhdCB0aGF0IHRpbWUgb25seSBib290CiAJCQkgKiBjcHUgaXMgb25saW5lLgogCQkJICovCi0JCQljZmcgPSBpcnFfY2ZnKGlycSk7CisJCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwkJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAkJCWlmICghY2ZnLT52ZWN0b3IpIHsKLQkJCQlzZXR1cF9JT19BUElDX2lycShpb2FwaWMsIHBpbiwgaXJxLAorCQkJCXNldHVwX0lPX0FQSUNfaXJxKGlvYXBpYywgcGluLCBpcnEsIGRlc2MsCiAJCQkJCQkgIGlycV90cmlnZ2VyKGlycV9lbnRyeSksCiAJCQkJCQkgIGlycV9wb2xhcml0eShpcnFfZW50cnkpKTsKIAkJCQljb250aW51ZTsKQEAgLTM3ODQsNyArNDA1OSw2IEBACiAJCQkvKgogCQkJICogSG9ub3VyIGFmZmluaXRpZXMgd2hpY2ggaGF2ZSBiZWVuIHNldCBpbiBlYXJseSBib290CiAJCQkgKi8KLQkJCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCQkJaWYgKGRlc2MtPnN0YXR1cyAmCiAJCQkgICAgKElSUV9OT19CQUxBTkNJTkcgfCBJUlFfQUZGSU5JVFlfU0VUKSkKIAkJCQltYXNrID0gZGVzYy0+YWZmaW5pdHk7CkBAIC0zNzkzLDEwICs0MDY3LDEwIEBACiAKICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogCQkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCi0JCQkJc2V0X2lyX2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBtYXNrKTsKKwkJCQlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwogCQkJZWxzZQogI2VuZGlmCi0JCQkJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBtYXNrKTsKKwkJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwogCQl9CiAKIAl9CkBAIC0zODQ1LDcgKzQxMTksNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqaW9hcGljX3JlczsKIAlpbnQgaTsKIAotCWlycV8yX3Bpbl9pbml0KCk7CiAJaW9hcGljX3JlcyA9IGlvYXBpY19zZXR1cF9yZXNvdXJjZXMoKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CiAJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggZDFkNGRjNS4uM2YxZDlkMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtMTE4LDYgKzExOCw5IEBACiAJfQogCiAJZGVzYyA9IGlycV90b19kZXNjKGkpOworCWlmICghZGVzYykKKwkJcmV0dXJuIDA7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogI2lmbmRlZiBDT05GSUdfU01QCiAJYW55X2NvdW50ID0ga3N0YXRfaXJxcyhpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYwppbmRleCBhNTEzODI2Li4xMTlmYzljIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCkBAIC0yNDIsNiArMjQyLDggQEAKIAlmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpIHsKIAkJY3B1bWFza190IG1hc2s7CiAKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CiAJCWlmIChpcnEgPT0gMikKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKaW5kZXggMWRmODY5ZS4uYTE3NGEyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYwpAQCAtOTEsNiArOTEsOCBAQAogCQlpbnQgYnJlYWtfYWZmaW5pdHkgPSAwOwogCQlpbnQgc2V0X2FmZmluaXR5ID0gMTsKIAorCQlpZiAoIWRlc2MpCisJCQljb250aW51ZTsKIAkJaWYgKGlycSA9PSAyKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF8zMi5jCmluZGV4IDYwN2RiNjMuLjIwMzM4NGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYwpAQCAtNjgsOCArNjgsNyBAQAogCS8qCiAJICogMTYgb2xkLXN0eWxlIElOVEEtY3ljbGUgaW50ZXJydXB0czoKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkvKiBmaXJzdCB0aW1lIGNhbGwgdGhpcyBpcnFfZGVzYyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTX0xFR0FDWTsgaSsrKSB7CiAJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGkpOwogCiAJCWRlc2MtPnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCmluZGV4IDg2NzBiM2MuLjYxOTBlNmVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMKQEAgLTc2LDggKzc2LDcgQEAKIAlpbml0X2JzcF9BUElDKCk7CiAJaW5pdF84MjU5QSgwKTsKIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCS8qIGZpcnN0IHRpbWUgY2FsbCB0aGlzIGlycV9kZXNjICovCisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVNfTEVHQUNZOyBpKyspIHsKIAkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CiAKIAkJZGVzYy0+c3RhdHVzID0gSVJRX0RJU0FCTEVEOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggN2EzZGZjZS4uMTlhMTA0NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0xMDEsMTEgKzEwMSwxNSBAQAogCWRtYTMyX2Jvb3RtZW1fcHRyID0gTlVMTDsKIAlkbWEzMl9ib290bWVtX3NpemUgPSAwOwogfQorI2VuZGlmCiAKIHZvaWQgX19pbml0IHBjaV9pb21tdV9hbGxvYyh2b2lkKQogeworI2lmZGVmIENPTkZJR19YODZfNjQKIAkvKiBmcmVlIHRoZSByYW5nZSBzbyBpb21tdSBjb3VsZCBnZXQgc29tZSByYW5nZSBsZXNzIHRoYW4gNEcgKi8KIAlkbWEzMl9mcmVlX2Jvb3RtZW0oKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBUaGUgb3JkZXIgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGltcG9ydGFudCBmb3IKIAkgKiBmYWxsLWJhY2svZmFpbC1vdmVyIHJlYXNvbnMKQEAgLTEyMSwxNSArMTI1LDYgQEAKIAlwY2lfc3dpb3RsYl9pbml0KCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgaW9tbXVfbnJfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSByb3VuZHVwKChhZGRyICYgflBBR0VfTUFTSykgKyBsZW4sIFBBR0VfU0laRSk7Ci0KLQlyZXR1cm4gc2l6ZSA+PiBQQUdFX1NISUZUOwotfQotRVhQT1JUX1NZTUJPTChpb21tdV9ucl9wYWdlcyk7Ci0jZW5kaWYKLQogdm9pZCAqZG1hX2dlbmVyaWNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgZG1hX2FkZHJfdCAqZG1hX2FkZHIsIGdmcF90IGZsYWcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYl82NC5jCmluZGV4IDNjNTM5ZDEuLjI0MmMzNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYl82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYl82NC5jCkBAIC0zLDYgKzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CkBAIC0xMSw2ICsxMywzMSBAQAogCiBpbnQgc3dpb3RsYiBfX3JlYWRfbW9zdGx5OwogCit2b2lkICpzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKQoreworCXJldHVybiBhbGxvY19ib290bWVtX2xvd19wYWdlcyhzaXplKTsKK30KKwordm9pZCAqc3dpb3RsYl9hbGxvYyh1bnNpZ25lZCBvcmRlciwgdW5zaWduZWQgbG9uZyBuc2xhYnMpCit7CisJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLCBvcmRlcik7Cit9CisKK2RtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2J1cyhwaHlzX2FkZHJfdCBwYWRkcikKK3sKKwlyZXR1cm4gcGFkZHI7Cit9CisKK3BoeXNfYWRkcl90IHN3aW90bGJfYnVzX3RvX3BoeXMoZG1hX2FkZHJfdCBiYWRkcikKK3sKKwlyZXR1cm4gYmFkZHI7Cit9CisKK2ludCBfX3dlYWsgc3dpb3RsYl9hcmNoX3JhbmdlX25lZWRzX21hcHBpbmcodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGRtYV9hZGRyX3QKIHN3aW90bGJfbWFwX3NpbmdsZV9waHlzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUsCiAJCQlpbnQgZGlyZWN0aW9uKQpAQCAtNTAsOCArNzcsMTAgQEAKIHZvaWQgX19pbml0IHBjaV9zd2lvdGxiX2luaXQodm9pZCkKIHsKIAkvKiBkb24ndCBpbml0aWFsaXplIHN3aW90bGIgaWYgaW9tbXU9b2ZmIChub19pb21tdT0xKSAqLworI2lmZGVmIENPTkZJR19YODZfNjQKIAlpZiAoIWlvbW11X2RldGVjdGVkICYmICFub19pb21tdSAmJiBtYXhfcGZuID4gTUFYX0RNQTMyX1BGTikKIAkgICAgICAgc3dpb3RsYiA9IDE7CisjZW5kaWYKIAlpZiAoc3dpb3RsYl9mb3JjZSkKIAkJc3dpb3RsYiA9IDE7CiAJaWYgKHN3aW90bGIpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYwppbmRleCA2NzQ2NWVkLi4zMDk5NDllIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCkBAIC0xNjgsNiArMTY4LDggQEAKIAkJCSBpY2hfZm9yY2VfZW5hYmxlX2hwZXQpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8xLAogCQkJIGljaF9mb3JjZV9lbmFibGVfaHBldCk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQsCisJCQkgaWNoX2ZvcmNlX2VuYWJsZV9ocGV0KTsKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNywKIAkJCSBpY2hfZm9yY2VfZW5hYmxlX2hwZXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IDA4ZTAyZTguLmFlMGQ4MDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC05NTMsNyArOTUzLDcgQEAKIAlpb2FwaWNfaW5pdF9tYXBwaW5ncygpOwogCiAJLyogbmVlZCB0byB3YWl0IGZvciBpb19hcGljIGlzIG1hcHBlZCAqLwotCW5yX2lycXMgPSBwcm9iZV9ucl9pcnFzKCk7CisJcHJvYmVfbnJfaXJxc19nc2koKTsKIAogCWt2bV9ndWVzdF9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xndWVzdC9pMzg2X2hlYWQuUyBiL2FyY2gveDg2L2xndWVzdC9pMzg2X2hlYWQuUwppbmRleCA1YzdjZWYzLi4xMGI5YmQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9sZ3Vlc3QvaTM4Nl9oZWFkLlMKKysrIGIvYXJjaC94ODYvbGd1ZXN0L2kzODZfaGVhZC5TCkBAIC0zMCwyMSArMzAsNiBAQAogCW1vdmwgJGxndWVzdF9kYXRhIC0gX19QQUdFX09GRlNFVCwgJWVkeAogCWludCAkTEdVRVNUX1RSQVBfRU5UUlkKIAotCS8qIFRoZSBIb3N0IHB1dCB0aGUgdG9wbGV2ZWwgcGFnZXRhYmxlIGluIGxndWVzdF9kYXRhLnBnZGlyLiAgVGhlIG1vdnNsCi0JICogaW5zdHJ1Y3Rpb24gdXNlcyAlZXNpIGltcGxpY2l0bHkgYXMgdGhlIHNvdXJjZSBmb3IgdGhlIGNvcHkgd2UncmUKLQkgKiBhYm91dCB0byBkby4gKi8KLQltb3ZsIGxndWVzdF9kYXRhIC0gX19QQUdFX09GRlNFVCArIExHVUVTVF9EQVRBX3BnZGlyLCAlZXNpCi0KLQkvKiBDb3B5IGZpcnN0IDMyIGVudHJpZXMgb2YgcGFnZSBkaXJlY3RvcnkgdG8gX19QQUdFX09GRlNFVCBlbnRyaWVzLgotCSAqIFRoaXMgbWVhbnMgdGhlIGZpcnN0IDEyOE0gb2Yga2VybmVsIG1lbW9yeSB3aWxsIGJlIG1hcHBlZCBhdAotCSAqIFBBR0VfT0ZGU0VUIHdoZXJlIHRoZSBrZXJuZWwgZXhwZWN0cyB0byBydW4uICBUaGlzIHdpbGwgZ2V0IGl0IGZhcgotCSAqIGVub3VnaCB0aHJvdWdoIGJvb3QgdG8gc3dpdGNoIHRvIGl0cyBvd24gcGFnZXRhYmxlcy4gKi8KLQltb3ZsICQzMiwgJWVjeAotCW1vdmwgJWVzaSwgJWVkaQotCWFkZGwgJCgoX19QQUdFX09GRlNFVCA+PiAyMikgKiA0KSwgJWVkaQotCXJlcAotCW1vdnNsCi0KIAkvKiBTZXQgdXAgdGhlIGluaXRpYWwgc3RhY2sgc28gd2UgY2FuIHJ1biBDIGNvZGUuICovCiAJbW92bCAkKGluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFKSwlZXNwCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi91c2VyY29weV8zMi5jIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKaW5kZXggOWU2ODA3NS4uNGEyMGIyZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKKysrIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKQEAgLTM5LDcgKzM5LDcgQEAKICNkZWZpbmUgX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcykJCQkgICBcCiBkbyB7CQkJCQkJCQkJICAgXAogCWludCBfX2QwLCBfX2QxLCBfX2QyOwkJCQkJCSAgIFwKLQltaWdodF9zbGVlcCgpOwkJCQkJCQkgICBcCisJbWlnaHRfZmF1bHQoKTsJCQkJCQkJICAgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCSAgIFwKIAkJIgl0ZXN0bCAlMSwlMVxuIgkJCQkJICAgXAogCQkiCWp6IDJmXG4iCQkJCQkgICBcCkBAIC0xMjYsNyArMTI2LDcgQEAKICNkZWZpbmUgX19kb19jbGVhcl91c2VyKGFkZHIsc2l6ZSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaW50IF9fZDA7CQkJCQkJCVwKLQltaWdodF9zbGVlcCgpOwkJCQkJCQlcCisJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKIAkJIjA6CXJlcDsgc3Rvc2xcbiIJCQkJCVwKIAkJIgltb3ZsICUyLCUwXG4iCQkJCQlcCkBAIC0xNTUsNyArMTU1LDcgQEAKIHVuc2lnbmVkIGxvbmcKIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JbWlnaHRfc2xlZXAoKTsKKwltaWdodF9mYXVsdCgpOwogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCiAJCV9fZG9fY2xlYXJfdXNlcih0bywgbik7CiAJcmV0dXJuIG47CkBAIC0xOTcsNyArMTk3LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSAtX19hZGRyX29rKHMpOwogCXVuc2lnbmVkIGxvbmcgcmVzLCB0bXA7CiAKLQltaWdodF9zbGVlcCgpOworCW1pZ2h0X2ZhdWx0KCk7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIgl0ZXN0bCAlMCwgJTBcbiIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi91c2VyY29weV82NC5jIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzY0LmMKaW5kZXggZjRkZjZlNy4uNjRkNmM4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3VzZXJjb3B5XzY0LmMKKysrIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzY0LmMKQEAgLTE1LDcgKzE1LDcgQEAKICNkZWZpbmUgX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3Qsc3JjLGNvdW50LHJlcykJCQkgICBcCiBkbyB7CQkJCQkJCQkJICAgXAogCWxvbmcgX19kMCwgX19kMSwgX19kMjsJCQkJCQkgICBcCi0JbWlnaHRfc2xlZXAoKTsJCQkJCQkJICAgXAorCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJCSAgIFwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkgICBcCiAJCSIJdGVzdHEgJTEsJTFcbiIJCQkJCSAgIFwKIAkJIglqeiAyZlxuIgkJCQkJICAgXApAQCAtNjQsNyArNjQsNyBAQAogdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlsb25nIF9fZDA7Ci0JbWlnaHRfc2xlZXAoKTsKKwltaWdodF9mYXVsdCgpOwogCS8qIG5vIG1lbW9yeSBjb25zdHJhaW50IGJlY2F1c2UgaXQgZG9lc24ndCBjaGFuZ2UgYW55IG1lbW9yeSBnY2Mga25vd3MKIAkgICBhYm91dCAqLwogCWFzbSB2b2xhdGlsZSgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfMzIuYyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwppbmRleCA4MDBlMWQ5Li44NjU1YjViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgpAQCAtOTY3LDYgKzk2OCw4IEBACiAJaW50IGNvZGVzaXplLCByZXNlcnZlZHBhZ2VzLCBkYXRhc2l6ZSwgaW5pdHNpemU7CiAJaW50IHRtcDsKIAorCXBjaV9pb21tdV9hbGxvYygpOworCiAjaWZkZWYgQ09ORklHX0ZMQVRNRU0KIAlCVUdfT04oIW1lbV9tYXApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IDUwOTUxMzcuLjk4NjU4ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC02NSwxMSArNjUsMTMgQEAKICNkZWZpbmUgSUJTX0ZFVENIX0JFR0lOIDMKICNkZWZpbmUgSUJTX09QX0JFR0lOICAgIDQKIAotLyogVGhlIGZ1bmN0aW9uIGludGVyZmFjZSBuZWVkcyB0byBiZSBmaXhlZCwgc29tZXRoaW5nIGxpa2UgYWRkCi0gICBkYXRhLiBTaG91bGQgdGhlbiBiZSBhZGRlZCB0byBsaW51eC9vcHJvZmlsZS5oLiAqLworLyoKKyAqIFRoZSBmdW5jdGlvbiBpbnRlcmZhY2UgbmVlZHMgdG8gYmUgZml4ZWQsIHNvbWV0aGluZyBsaWtlIGFkZAorICogZGF0YS4gU2hvdWxkIHRoZW4gYmUgYWRkZWQgdG8gbGludXgvb3Byb2ZpbGUuaC4KKyAqLwogZXh0ZXJuIHZvaWQKLW9wcm9maWxlX2FkZF9pYnNfc2FtcGxlKHN0cnVjdCBwdF9yZWdzICpjb25zdCByZWdzLAotCQkJdW5zaWduZWQgaW50ICpjb25zdCBpYnNfc2FtcGxlLCBpbnQgaWJzX2NvZGUpOworb3Byb2ZpbGVfYWRkX2lic19zYW1wbGUoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkJdW5zaWduZWQgaW50ICogY29uc3QgaWJzX3NhbXBsZSwgaW50IGlic19jb2RlKTsKIAogc3RydWN0IGlic19mZXRjaF9zYW1wbGUgewogCS8qIE1TUkMwMDFfMTAzMSBJQlMgRmV0Y2ggTGluZWFyIEFkZHJlc3MgUmVnaXN0ZXIgKi8KQEAgLTEwNCwxMSArMTA2LDYgQEAKIAl1bnNpZ25lZCBpbnQgaWJzX2RjX3BoeXNfaGlnaDsKIH07CiAKLS8qCi0gKiB1bml0aWFsaXplIHRoZSBBUElDIGZvciB0aGUgSUJTIGludGVycnVwdHMgaWYgbmVlZGVkIG9uIEFNRCBGYW1pbHkxMGgrCi0qLwotc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKTsKLQogc3RhdGljIGludCBpYnNfYWxsb3dlZDsJLyogQU1EIEZhbWlseTEwaCBhbmQgbGF0ZXIgKi8KIAogc3RydWN0IG9wX2lic19jb25maWcgewpAQCAtMjIzLDcgKzIyMCw3IEBACiAJCQkJCQkodW5zaWduZWQgaW50ICopJmlic19mZXRjaCwKIAkJCQkJCUlCU19GRVRDSF9CRUdJTik7CiAKLQkJCS8qcmVlbmFibGUgdGhlIElSUSAqLworCQkJLyogcmVlbmFibGUgdGhlIElSUSAqLwogCQkJcmRtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOwogCQkJaGlnaCAmPSB+SUJTX0ZFVENIX0hJR0hfVkFMSURfQklUOwogCQkJaGlnaCB8PSBJQlNfRkVUQ0hfSElHSF9FTkFCTEU7CkBAIC0zMzEsOCArMzI4LDEwIEBACiAJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKIAlpbnQgaTsKIAotCS8qIFN1YnRsZTogc3RvcCBvbiBhbGwgY291bnRlcnMgdG8gYXZvaWQgcmFjZSB3aXRoCi0JICogc2V0dGluZyBvdXIgcG0gY2FsbGJhY2sgKi8KKwkvKgorCSAqIFN1YnRsZTogc3RvcCBvbiBhbGwgY291bnRlcnMgdG8gYXZvaWQgcmFjZSB3aXRoIHNldHRpbmcgb3VyCisJICogcG0gY2FsbGJhY2sKKwkgKi8KIAlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUyA7ICsraSkgewogCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQogCQkJY29udGludWU7CkBAIC0zNDMsMTMgKzM0MiwxNSBAQAogCiAjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUwogCWlmIChpYnNfYWxsb3dlZCAmJiBpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpIHsKLQkJbG93ID0gMDsJCS8qIGNsZWFyIG1heCBjb3VudCBhbmQgZW5hYmxlICovCisJCS8qIGNsZWFyIG1heCBjb3VudCBhbmQgZW5hYmxlICovCisJCWxvdyA9IDA7CiAJCWhpZ2ggPSAwOwogCQl3cm1zcihNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGxvdywgaGlnaCk7CiAJfQogCiAJaWYgKGlic19hbGxvd2VkICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgewotCQlsb3cgPSAwOwkJLyogY2xlYXIgbWF4IGNvdW50IGFuZCBlbmFibGUgKi8KKwkJLyogY2xlYXIgbWF4IGNvdW50IGFuZCBlbmFibGUgKi8KKwkJbG93ID0gMDsKIAkJaGlnaCA9IDA7CiAJCXdybXNyKE1TUl9BTUQ2NF9JQlNPUENUTCwgbG93LCBoaWdoKTsKIAl9CkBAIC0zNzAsMTggKzM3MSw3IEBACiAJfQogfQogCi0jaWZuZGVmIENPTkZJR19PUFJPRklMRV9JQlMKLQotLyogbm8gSUJTIHN1cHBvcnQgKi8KLQotc3RhdGljIGludCBvcF9hbWRfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvcF9hbWRfZXhpdCh2b2lkKSB7fQotCi0jZWxzZQorI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKIAogc3RhdGljIHU4IGlic19laWx2dF9vZmY7CiAKQEAgLTM5NSw3ICszODUsNyBAQAogCXNldHVwX0FQSUNfZWlsdnRfaWJzKDAsIEFQSUNfRUlMVlRfTVNHX0ZJWCwgMSk7CiB9CiAKLXN0YXRpYyBpbnQgcGZtX2FtZDY0X3NldHVwX2VpbHZ0KHZvaWQpCitzdGF0aWMgaW50IGluaXRfaWJzX25taSh2b2lkKQogewogI2RlZmluZSBJQlNDVExfTFZUT0ZGU0VUVkFMCQkoMSA8PCA4KQogI2RlZmluZSBJQlNDVEwJCQkJMHgxY2MKQEAgLTQ0MywxOCArNDMzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBpbml0aWFsaXplIHRoZSBBUElDIGZvciB0aGUgSUJTIGludGVycnVwdHMKLSAqIGlmIGF2YWlsYWJsZSAoQU1EIEZhbWlseTEwaCByZXYgQjAgYW5kIGxhdGVyKQotICovCi1zdGF0aWMgdm9pZCBzZXR1cF9pYnModm9pZCkKKy8qIHVuaW5pdGlhbGl6ZSB0aGUgQVBJQyBmb3IgdGhlIElCUyBpbnRlcnJ1cHRzIGlmIG5lZWRlZCAqLworc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKQoreworCWlmIChpYnNfYWxsb3dlZCkKKwkJb25fZWFjaF9jcHUoYXBpY19jbGVhcl9pYnNfbm1pX3Blcl9jcHUsIE5VTEwsIDEpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBBUElDIGZvciB0aGUgSUJTIGludGVycnVwdHMgaWYgYXZhaWxhYmxlICovCitzdGF0aWMgdm9pZCBpYnNfaW5pdCh2b2lkKQogewogCWlic19hbGxvd2VkID0gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0lCUyk7CiAKIAlpZiAoIWlic19hbGxvd2VkKQogCQlyZXR1cm47CiAKLQlpZiAocGZtX2FtZDY0X3NldHVwX2VpbHZ0KCkpIHsKKwlpZiAoaW5pdF9pYnNfbm1pKCkpIHsKIAkJaWJzX2FsbG93ZWQgPSAwOwogCQlyZXR1cm47CiAJfQpAQCAtNDYyLDE0ICs0NTYsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogQU1EIElCUyBkZXRlY3RlZFxuIik7CiB9CiAKLQotLyoKLSAqIHVuaXRpYWxpemUgdGhlIEFQSUMgZm9yIHRoZSBJQlMgaW50ZXJydXB0cyBpZiBuZWVkZWQgb24gQU1EIEZhbWlseTEwaAotICogcmV2IEIwIGFuZCBsYXRlciAqLwotc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKQorc3RhdGljIHZvaWQgaWJzX2V4aXQodm9pZCkKIHsKLQlpZiAoaWJzX2FsbG93ZWQpCi0JCW9uX2VhY2hfY3B1KGFwaWNfY2xlYXJfaWJzX25taV9wZXJfY3B1LCBOVUxMLCAxKTsKKwlpZiAoIWlic19hbGxvd2VkKQorCQlyZXR1cm47CisKKwljbGVhcl9pYnNfbm1pKCk7CiB9CiAKIHN0YXRpYyBpbnQgKCpjcmVhdGVfYXJjaF9maWxlcykoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqcm9vdCk7CkBAIC01MTksNyArNTExLDcgQEAKIAogc3RhdGljIGludCBvcF9hbWRfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQogewotCXNldHVwX2licygpOworCWlic19pbml0KCk7CiAJY3JlYXRlX2FyY2hfZmlsZXMgPSBvcHMtPmNyZWF0ZV9maWxlczsKIAlvcHMtPmNyZWF0ZV9maWxlcyA9IHNldHVwX2lic19maWxlczsKIAlyZXR1cm4gMDsKQEAgLTUyNywxMCArNTE5LDIxIEBACiAKIHN0YXRpYyB2b2lkIG9wX2FtZF9leGl0KHZvaWQpCiB7Ci0JY2xlYXJfaWJzX25taSgpOworCWlic19leGl0KCk7CiB9CiAKLSNlbmRpZgorI2Vsc2UKKworLyogbm8gSUJTIHN1cHBvcnQgKi8KKworc3RhdGljIGludCBvcF9hbWRfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvcF9hbWRfZXhpdCh2b2lkKSB7fQorCisjZW5kaWYgLyogQ09ORklHX09QUk9GSUxFX0lCUyAqLwogCiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfYW1kX3NwZWMgPSB7CiAJLmluaXQJCQk9IG9wX2FtZF9pbml0LApkaWZmIC0tZ2l0IGEvYmxvY2svS2NvbmZpZyBiL2Jsb2NrL0tjb25maWcKaW5kZXggMjkwYjIxOS4uYWMwOTU2ZiAxMDA2NDQKLS0tIGEvYmxvY2svS2NvbmZpZworKysgYi9ibG9jay9LY29uZmlnCkBAIC0yNCwyMSArMjQsMTcgQEAKIGlmIEJMT0NLCiAKIGNvbmZpZyBMQkQKLQlib29sICJTdXBwb3J0IGZvciBMYXJnZSBCbG9jayBEZXZpY2VzIgorCWJvb2wgIlN1cHBvcnQgZm9yIGxhcmdlIGJsb2NrIGRldmljZXMgYW5kIGZpbGVzIgogCWRlcGVuZHMgb24gITY0QklUCiAJaGVscAotCSAgRW5hYmxlIGJsb2NrIGRldmljZXMgb2Ygc2l6ZSAyVEIgYW5kIGxhcmdlci4KKwkgIEVuYWJsZSBibG9jayBkZXZpY2VzIG9yIGZpbGVzIG9mIHNpemUgMlRCIGFuZCBsYXJnZXIuCiAKIAkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIGZ1bGwgY2FwYWNpdHkgb2YgbGFyZ2UKIAkgICgyVEIrKSBibG9jayBkZXZpY2VzLCBpbmNsdWRpbmcgUkFJRCwgZGlzaywgTmV0d29yayBCbG9jayBEZXZpY2UsCiAJICBMb2dpY2FsIFZvbHVtZSBNYW5hZ2VyIChMVk0pIGFuZCBsb29wYmFjay4KLQotCSAgRm9yIGV4YW1wbGUsIFJBSUQgZGV2aWNlcyBhcmUgZnJlcXVlbnRseSBiaWdnZXIgdGhhbiB0aGUgY2FwYWNpdHkKLQkgIG9mIHRoZSBsYXJnZXN0IGluZGl2aWR1YWwgaGFyZCBkcml2ZS4KLQotCSAgVGhpcyBvcHRpb24gaXMgbm90IHJlcXVpcmVkIGlmIHlvdSBoYXZlIGluZGl2aWR1YWwgZGlzayBkcml2ZXMKLQkgIHdoaWNoIHRvdGFsIDJUQisgYW5kIHlvdSBhcmUgbm90IGFnZ3JlZ2F0aW5nIHRoZSBjYXBhY2l0eSBpbnRvCi0JICBhIGxhcmdlIGJsb2NrIGRldmljZSAoZS5nLiB1c2luZyBSQUlEIG9yIExWTSkuCisJCisJICBUaGlzIG9wdGlvbiBhbHNvIGVuYWJsZXMgc3VwcG9ydCBmb3Igc2luZ2xlIGZpbGVzIGxhcmdlciB0aGFuCisJICAyVEIuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKQEAgLTU4LDE1ICs1NCw2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBMU0YKLQlib29sICJTdXBwb3J0IGZvciBMYXJnZSBTaW5nbGUgRmlsZXMiCi0JZGVwZW5kcyBvbiAhNjRCSVQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gaGFuZGxlIHZlcnkgbGFyZ2UgZmlsZXMgKDJUQgotCSAgYW5kIGxhcmdlciksIG90aGVyd2lzZSBzYXkgTi4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KLQogY29uZmlnIEJMS19ERVZfQlNHCiAJYm9vbCAiQmxvY2sgbGF5ZXIgU0cgc3VwcG9ydCB2NCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDcxZjBhYmIuLjYzMWY2ZjQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTEzMzksMTIgKzEzMzksMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhc19leGl0X3F1ZXVlKGVsZXZhdG9yX3QgKmUpCitzdGF0aWMgdm9pZCBhc19leGl0X3F1ZXVlKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSkKIHsKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQgPSBlLT5lbGV2YXRvcl9kYXRhOwogCiAJZGVsX3RpbWVyX3N5bmMoJmFkLT5hbnRpY190aW1lcik7Ci0Ja2Jsb2NrZF9mbHVzaF93b3JrKCZhZC0+YW50aWNfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmYWQtPmFudGljX3dvcmspOwogCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZhZC0+Zmlmb19saXN0W1JFUV9TWU5DXSkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmYWQtPmZpZm9fbGlzdFtSRVFfQVNZTkNdKSk7CkBAIC0xNDA5LDcgKzE0MDksNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgZXN0X3RpbWVfc2hvdyhlbGV2YXRvcl90ICplLCBjaGFyICpwYWdlKQorc3RhdGljIHNzaXplX3QgZXN0X3RpbWVfc2hvdyhzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUsIGNoYXIgKnBhZ2UpCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gZS0+ZWxldmF0b3JfZGF0YTsKIAlpbnQgcG9zID0gMDsKQEAgLTE0MjcsNyArMTQyNyw3IEBACiB9CiAKICNkZWZpbmUgU0hPV19GVU5DVElPTihfX0ZVTkMsIF9fVkFSKQkJCQlcCi1zdGF0aWMgc3NpemVfdCBfX0ZVTkMoZWxldmF0b3JfdCAqZSwgY2hhciAqcGFnZSkJCVwKK3N0YXRpYyBzc2l6ZV90IF9fRlVOQyhzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUsIGNoYXIgKnBhZ2UpCVwKIHsJCQkJCQkJCVwKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQgPSBlLT5lbGV2YXRvcl9kYXRhOwkJCVwKIAlyZXR1cm4gYXNfdmFyX3Nob3coamlmZmllc190b19tc2VjcygoX19WQVIpKSwgKHBhZ2UpKTsJXApAQCAtMTQ0MCw3ICsxNDQwLDcgQEAKICN1bmRlZiBTSE9XX0ZVTkNUSU9OCiAKICNkZWZpbmUgU1RPUkVfRlVOQ1RJT04oX19GVU5DLCBfX1BUUiwgTUlOLCBNQVgpCQkJCVwKLXN0YXRpYyBzc2l6ZV90IF9fRlVOQyhlbGV2YXRvcl90ICplLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCVwKK3N0YXRpYyBzc2l6ZV90IF9fRlVOQyhzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBjb3VudCkJXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQgPSBlLT5lbGV2YXRvcl9kYXRhOwkJCQlcCiAJaW50IHJldCA9IGFzX3Zhcl9zdG9yZShfX1BUUiwgKHBhZ2UpLCBjb3VudCk7CQkJXApkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWJhcnJpZXIuYyBiL2Jsb2NrL2Jsay1iYXJyaWVyLmMKaW5kZXggNmU3MmQ2Ni4uOGViYTRlNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWJhcnJpZXIuYworKysgYi9ibG9jay9ibGstYmFycmllci5jCkBAIC0yNCw4ICsyNCw4IEBACiBpbnQgYmxrX3F1ZXVlX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIG9yZGVyZWQsCiAJCSAgICAgIHByZXBhcmVfZmx1c2hfZm4gKnByZXBhcmVfZmx1c2hfZm4pCiB7Ci0JaWYgKG9yZGVyZWQgJiAoUVVFVUVfT1JERVJFRF9QUkVGTFVTSCB8IFFVRVVFX09SREVSRURfUE9TVEZMVVNIKSAmJgotCSAgICBwcmVwYXJlX2ZsdXNoX2ZuID09IE5VTEwpIHsKKwlpZiAoIXByZXBhcmVfZmx1c2hfZm4gJiYgKG9yZGVyZWQgJiAoUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSCB8CisJCQkJCSAgICAgUVVFVUVfT1JERVJFRF9ET19QT1NURkxVU0gpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwcmVwYXJlX2ZsdXNoX2ZuIHJlcXVpcmVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTg4LDcgKzg4LDcgQEAKIAkJcmV0dXJuIFFVRVVFX09SRFNFUV9ET05FOwogfQogCi12b2lkIGJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgc2VxLCBpbnQgZXJyb3IpCitib29sIGJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgc2VxLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCkBAIC05OSw3ICs5OSw3IEBACiAJcS0+b3Jkc2VxIHw9IHNlcTsKIAogCWlmIChibGtfb3JkZXJlZF9jdXJfc2VxKHEpICE9IFFVRVVFX09SRFNFUV9ET05FKQotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAogCS8qCiAJICogT2theSwgc2VxdWVuY2UgY29tcGxldGUuCkBAIC0xMDksNiArMTA5LDggQEAKIAogCWlmIChfX2Jsa19lbmRfcmVxdWVzdChycSwgcS0+b3JkZXJyLCBibGtfcnFfYnl0ZXMocnEpKSkKIAkJQlVHKCk7CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgcHJlX2ZsdXNoX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcikKQEAgLTEzNCw3ICsxMzYsNyBAQAogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlycV9lbmRfaW9fZm4gKmVuZF9pbzsKIAotCWlmICh3aGljaCA9PSBRVUVVRV9PUkRFUkVEX1BSRUZMVVNIKSB7CisJaWYgKHdoaWNoID09IFFVRVVFX09SREVSRURfRE9fUFJFRkxVU0gpIHsKIAkJcnEgPSAmcS0+cHJlX2ZsdXNoX3JxOwogCQllbmRfaW8gPSBwcmVfZmx1c2hfZW5kX2lvOwogCX0gZWxzZSB7CkBAIC0xNTEsODAgKzE1MywxMTAgQEAKIAllbHZfaW5zZXJ0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfRlJPTlQpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0ICpzdGFydF9vcmRlcmVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAotCQkJCQkgICAgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGlubGluZSBib29sIHN0YXJ0X29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcnFwKQogeworCXN0cnVjdCByZXF1ZXN0ICpycSA9ICpycXA7CisJdW5zaWduZWQgc2tpcCA9IDA7CisKIAlxLT5vcmRlcnIgPSAwOwogCXEtPm9yZGVyZWQgPSBxLT5uZXh0X29yZGVyZWQ7CiAJcS0+b3Jkc2VxIHw9IFFVRVVFX09SRFNFUV9TVEFSVEVEOwogCiAJLyoKLQkgKiBQcmVwIHByb3h5IGJhcnJpZXIgcmVxdWVzdC4KKwkgKiBGb3IgYW4gZW1wdHkgYmFycmllciwgdGhlcmUncyBubyBhY3R1YWwgQkFSIHJlcXVlc3QsIHdoaWNoCisJICogaW4gdHVybiBtYWtlcyBQT1NURkxVU0ggdW5uZWNlc3NhcnkuICBNYXNrIHRoZW0gb2ZmLgogCSAqLworCWlmICghcnEtPmhhcmRfbnJfc2VjdG9ycykgeworCQlxLT5vcmRlcmVkICY9IH4oUVVFVUVfT1JERVJFRF9ET19CQVIgfAorCQkJCVFVRVVFX09SREVSRURfRE9fUE9TVEZMVVNIKTsKKwkJLyoKKwkJICogRW1wdHkgYmFycmllciBvbiBhIHdyaXRlLXRocm91Z2ggZGV2aWNlIHcvIG9yZGVyZWQKKwkJICogdGFnIGhhcyBubyBjb21tYW5kIHRvIGlzc3VlIGFuZCB3aXRob3V0IGFueSBjb21tYW5kCisJCSAqIHRvIGlzc3VlLCBvcmRlcmluZyBieSB0YWcgY2FuJ3QgYmUgdXNlZC4gIERyYWluCisJCSAqIGluc3RlYWQuCisJCSAqLworCQlpZiAoKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX0JZX1RBRykgJiYKKwkJICAgICEocS0+b3JkZXJlZCAmIFFVRVVFX09SREVSRURfRE9fUFJFRkxVU0gpKSB7CisJCQlxLT5vcmRlcmVkICY9IH5RVUVVRV9PUkRFUkVEX0JZX1RBRzsKKwkJCXEtPm9yZGVyZWQgfD0gUVVFVUVfT1JERVJFRF9CWV9EUkFJTjsKKwkJfQorCX0KKworCS8qIHN0YXNoIGF3YXkgdGhlIG9yaWdpbmFsIHJlcXVlc3QgKi8KIAllbHZfZGVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKIAlxLT5vcmlnX2Jhcl9ycSA9IHJxOwotCXJxID0gJnEtPmJhcl9ycTsKLQlibGtfcnFfaW5pdChxLCBycSk7Ci0JaWYgKGJpb19kYXRhX2RpcihxLT5vcmlnX2Jhcl9ycS0+YmlvKSA9PSBXUklURSkKLQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUlc7Ci0JaWYgKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX0ZVQSkKLQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfRlVBOwotCWluaXRfcmVxdWVzdF9mcm9tX2JpbyhycSwgcS0+b3JpZ19iYXJfcnEtPmJpbyk7Ci0JcnEtPmVuZF9pbyA9IGJhcl9lbmRfaW87CisJcnEgPSBOVUxMOwogCiAJLyoKIAkgKiBRdWV1ZSBvcmRlcmVkIHNlcXVlbmNlLiAgQXMgd2Ugc3RhY2sgdGhlbSBhdCB0aGUgaGVhZCwgd2UKIAkgKiBuZWVkIHRvIHF1ZXVlIGluIHJldmVyc2Ugb3JkZXIuICBOb3RlIHRoYXQgd2UgcmVseSBvbiB0aGF0CiAJICogbm8gZnMgcmVxdWVzdCB1c2VzIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCBhbmQgdGh1cyBubyBmcwotCSAqIHJlcXVlc3QgZ2V0cyBpbmJldHdlZW4gb3JkZXJlZCBzZXF1ZW5jZS4gSWYgdGhpcyByZXF1ZXN0IGlzCi0JICogYW4gZW1wdHkgYmFycmllciwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhIHBvc3RmbHVzaCBldmVyIHNpbmNlCi0JICogdGhlcmUgd2lsbCBiZSBubyBkYXRhIHdyaXR0ZW4gYmV0d2VlbiB0aGUgcHJlIGFuZCBwb3N0IGZsdXNoLgotCSAqIEhlbmNlIGEgc2luZ2xlIGZsdXNoIHdpbGwgc3VmZmljZS4KKwkgKiByZXF1ZXN0IGdldHMgaW5iZXR3ZWVuIG9yZGVyZWQgc2VxdWVuY2UuCiAJICovCi0JaWYgKChxLT5vcmRlcmVkICYgUVVFVUVfT1JERVJFRF9QT1NURkxVU0gpICYmICFibGtfZW1wdHlfYmFycmllcihycSkpCi0JCXF1ZXVlX2ZsdXNoKHEsIFFVRVVFX09SREVSRURfUE9TVEZMVVNIKTsKLQllbHNlCi0JCXEtPm9yZHNlcSB8PSBRVUVVRV9PUkRTRVFfUE9TVEZMVVNIOworCWlmIChxLT5vcmRlcmVkICYgUVVFVUVfT1JERVJFRF9ET19QT1NURkxVU0gpIHsKKwkJcXVldWVfZmx1c2gocSwgUVVFVUVfT1JERVJFRF9ET19QT1NURkxVU0gpOworCQlycSA9ICZxLT5wb3N0X2ZsdXNoX3JxOworCX0gZWxzZQorCQlza2lwIHw9IFFVRVVFX09SRFNFUV9QT1NURkxVU0g7CiAKLQllbHZfaW5zZXJ0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfRlJPTlQpOworCWlmIChxLT5vcmRlcmVkICYgUVVFVUVfT1JERVJFRF9ET19CQVIpIHsKKwkJcnEgPSAmcS0+YmFyX3JxOwogCi0JaWYgKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX1BSRUZMVVNIKSB7Ci0JCXF1ZXVlX2ZsdXNoKHEsIFFVRVVFX09SREVSRURfUFJFRkxVU0gpOworCQkvKiBpbml0aWFsaXplIHByb3h5IHJlcXVlc3QgYW5kIHF1ZXVlIGl0ICovCisJCWJsa19ycV9pbml0KHEsIHJxKTsKKwkJaWYgKGJpb19kYXRhX2RpcihxLT5vcmlnX2Jhcl9ycS0+YmlvKSA9PSBXUklURSkKKwkJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1JXOworCQlpZiAocS0+b3JkZXJlZCAmIFFVRVVFX09SREVSRURfRE9fRlVBKQorCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfRlVBOworCQlpbml0X3JlcXVlc3RfZnJvbV9iaW8ocnEsIHEtPm9yaWdfYmFyX3JxLT5iaW8pOworCQlycS0+ZW5kX2lvID0gYmFyX2VuZF9pbzsKKworCQllbHZfaW5zZXJ0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfRlJPTlQpOworCX0gZWxzZQorCQlza2lwIHw9IFFVRVVFX09SRFNFUV9CQVI7CisKKwlpZiAocS0+b3JkZXJlZCAmIFFVRVVFX09SREVSRURfRE9fUFJFRkxVU0gpIHsKKwkJcXVldWVfZmx1c2gocSwgUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSCk7CiAJCXJxID0gJnEtPnByZV9mbHVzaF9ycTsKIAl9IGVsc2UKLQkJcS0+b3Jkc2VxIHw9IFFVRVVFX09SRFNFUV9QUkVGTFVTSDsKKwkJc2tpcCB8PSBRVUVVRV9PUkRTRVFfUFJFRkxVU0g7CiAKLQlpZiAoKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX1RBRykgfHwgcS0+aW5fZmxpZ2h0ID09IDApCi0JCXEtPm9yZHNlcSB8PSBRVUVVRV9PUkRTRVFfRFJBSU47Ci0JZWxzZQorCWlmICgocS0+b3JkZXJlZCAmIFFVRVVFX09SREVSRURfQllfRFJBSU4pICYmIHEtPmluX2ZsaWdodCkKIAkJcnEgPSBOVUxMOworCWVsc2UKKwkJc2tpcCB8PSBRVUVVRV9PUkRTRVFfRFJBSU47CiAKLQlyZXR1cm4gcnE7CisJKnJxcCA9IHJxOworCisJLyoKKwkgKiBDb21wbGV0ZSBza2lwcGVkIHNlcXVlbmNlcy4gIElmIHdob2xlIHNlcXVlbmNlIGlzIGNvbXBsZXRlLAorCSAqIHJldHVybiBmYWxzZSB0byB0ZWxsIGVsZXZhdG9yIHRoYXQgdGhpcyByZXF1ZXN0IGlzIGdvbmUuCisJICovCisJcmV0dXJuICFibGtfb3JkZXJlZF9jb21wbGV0ZV9zZXEocSwgc2tpcCwgMCk7CiB9CiAKLWludCBibGtfZG9fb3JkZXJlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKipycXApCitib29sIGJsa19kb19vcmRlcmVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqKnJxcCkKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSAqcnFwOwogCWNvbnN0IGludCBpc19iYXJyaWVyID0gYmxrX2ZzX3JlcXVlc3QocnEpICYmIGJsa19iYXJyaWVyX3JxKHJxKTsKIAogCWlmICghcS0+b3Jkc2VxKSB7CiAJCWlmICghaXNfYmFycmllcikKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAKLQkJaWYgKHEtPm5leHRfb3JkZXJlZCAhPSBRVUVVRV9PUkRFUkVEX05PTkUpIHsKLQkJCSpycXAgPSBzdGFydF9vcmRlcmVkKHEsIHJxKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgeworCQlpZiAocS0+bmV4dF9vcmRlcmVkICE9IFFVRVVFX09SREVSRURfTk9ORSkKKwkJCXJldHVybiBzdGFydF9vcmRlcmVkKHEsIHJxcCk7CisJCWVsc2UgewogCQkJLyoKLQkJCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBxdWV1ZSBzd2l0Y2hlcyB0bwotCQkJICogT1JERVJFRF9OT05FIHdoaWxlIHRoaXMgcmVxdWVzdCBpcyBvbiBpdC4KKwkJCSAqIFF1ZXVlIG9yZGVyaW5nIG5vdCBzdXBwb3J0ZWQuICBUZXJtaW5hdGUKKwkJCSAqIHdpdGggcHJlanVkaWNlLgogCQkJICovCiAJCQllbHZfZGVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKIAkJCWlmIChfX2Jsa19lbmRfcmVxdWVzdChycSwgLUVPUE5PVFNVUFAsCiAJCQkJCSAgICAgIGJsa19ycV9ieXRlcyhycSkpKQogCQkJCUJVRygpOwogCQkJKnJxcCA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KIApAQCAtMjM1LDkgKzI2Nyw5IEBACiAJLyogU3BlY2lhbCByZXF1ZXN0cyBhcmUgbm90IHN1YmplY3QgdG8gb3JkZXJpbmcgcnVsZXMuICovCiAJaWYgKCFibGtfZnNfcmVxdWVzdChycSkgJiYKIAkgICAgcnEgIT0gJnEtPnByZV9mbHVzaF9ycSAmJiBycSAhPSAmcS0+cG9zdF9mbHVzaF9ycSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCi0JaWYgKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX1RBRykgeworCWlmIChxLT5vcmRlcmVkICYgUVVFVUVfT1JERVJFRF9CWV9UQUcpIHsKIAkJLyogT3JkZXJlZCBieSB0YWcuICBCbG9ja2luZyB0aGUgbmV4dCBiYXJyaWVyIGlzIGVub3VnaC4gKi8KIAkJaWYgKGlzX2JhcnJpZXIgJiYgcnEgIT0gJnEtPmJhcl9ycSkKIAkJCSpycXAgPSBOVUxMOwpAQCAtMjQ4LDcgKzI4MCw3IEBACiAJCQkqcnFwID0gTlVMTDsKIAl9CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgYmlvX2VuZF9lbXB0eV9iYXJyaWVyKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDU2MWU4YTEuLmE4MjRlNDkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMTUzLDYgKzE1Myw5IEBACiAJCQluYnl0ZXMgPSBiaW8tPmJpX3NpemU7CiAJCX0KIAorCQlpZiAodW5saWtlbHkocnEtPmNtZF9mbGFncyAmIFJFUV9RVUlFVCkpCisJCQlzZXRfYml0KEJJT19RVUlFVCwgJmJpby0+YmlfZmxhZ3MpOworCiAJCWJpby0+Ymlfc2l6ZSAtPSBuYnl0ZXM7CiAJCWJpby0+Ymlfc2VjdG9yICs9IChuYnl0ZXMgPj4gOSk7CiAKQEAgLTI2NSw4ICsyNjgsNyBAQAogewogCWlmICh1bmxpa2VseShibGtfcXVldWVfc3RvcHBlZChxKSkpCiAJCXJldHVybjsKLQotCWlmICghYmxrX3JlbW92ZV9wbHVnKHEpKQorCWlmICghYmxrX3JlbW92ZV9wbHVnKHEpICYmICFibGtfcXVldWVfbm9ucm90KHEpKQogCQlyZXR1cm47CiAKIAlxLT5yZXF1ZXN0X2ZuKHEpOwpAQCAtNDA0LDcgKzQwNiw4IEBACiB2b2lkIGJsa19zeW5jX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWRlbF90aW1lcl9zeW5jKCZxLT51bnBsdWdfdGltZXIpOwotCWtibG9ja2RfZmx1c2hfd29yaygmcS0+dW5wbHVnX3dvcmspOworCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lb3V0KTsKKwljYW5jZWxfd29ya19zeW5jKCZxLT51bnBsdWdfd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19zeW5jX3F1ZXVlKTsKIApAQCAtMTEzNSw3ICsxMTM4LDcgQEAKIHN0YXRpYyBpbnQgX19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwotCWludCBlbF9yZXQsIG5yX3NlY3RvcnMsIGJhcnJpZXIsIGRpc2NhcmQsIGVycjsKKwlpbnQgZWxfcmV0LCBucl9zZWN0b3JzOwogCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByaW8gPSBiaW9fcHJpbyhiaW8pOwogCWNvbnN0IGludCBzeW5jID0gYmlvX3N5bmMoYmlvKTsKIAlpbnQgcndfZmxhZ3M7CkBAIC0xMTQ5LDIyICsxMTUyLDkgQEAKIAkgKi8KIAlibGtfcXVldWVfYm91bmNlKHEsICZiaW8pOwogCi0JYmFycmllciA9IGJpb19iYXJyaWVyKGJpbyk7Ci0JaWYgKHVubGlrZWx5KGJhcnJpZXIpICYmIGJpb19oYXNfZGF0YShiaW8pICYmCi0JICAgIChxLT5uZXh0X29yZGVyZWQgPT0gUVVFVUVfT1JERVJFRF9OT05FKSkgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBlbmRfaW87Ci0JfQotCi0JZGlzY2FyZCA9IGJpb19kaXNjYXJkKGJpbyk7Ci0JaWYgKHVubGlrZWx5KGRpc2NhcmQpICYmICFxLT5wcmVwYXJlX2Rpc2NhcmRfZm4pIHsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gZW5kX2lvOwotCX0KLQogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKLQlpZiAodW5saWtlbHkoYmFycmllcikgfHwgZWx2X3F1ZXVlX2VtcHR5KHEpKQorCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pKSB8fCBlbHZfcXVldWVfZW1wdHkocSkpCiAJCWdvdG8gZ2V0X3JxOwogCiAJZWxfcmV0ID0gZWx2X21lcmdlKHEsICZyZXEsIGJpbyk7CkBAIC0xMjUwLDE4ICsxMjQwLDE0IEBACiAJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpIHx8CiAJICAgIGJpb19mbGFnZ2VkKGJpbywgQklPX0NQVV9BRkZJTkUpKQogCQlyZXEtPmNwdSA9IGJsa19jcHVfdG9fZ3JvdXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpZiAoZWx2X3F1ZXVlX2VtcHR5KHEpKQorCWlmICghYmxrX3F1ZXVlX25vbnJvdChxKSAmJiBlbHZfcXVldWVfZW1wdHkocSkpCiAJCWJsa19wbHVnX2RldmljZShxKTsKIAlhZGRfcmVxdWVzdChxLCByZXEpOwogb3V0OgotCWlmIChzeW5jKQorCWlmIChzeW5jIHx8IGJsa19xdWV1ZV9ub25yb3QocSkpCiAJCV9fZ2VuZXJpY191bnBsdWdfZGV2aWNlKHEpOwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlyZXR1cm4gMDsKLQotZW5kX2lvOgotCWJpb19lbmRpbyhiaW8sIGVycik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDE0LDE1ICsxNDAwLDEzIEBACiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAogCQlxID0gYmRldl9nZXRfcXVldWUoYmlvLT5iaV9iZGV2KTsKLQkJaWYgKCFxKSB7CisJCWlmICh1bmxpa2VseSghcSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJnZW5lcmljX21ha2VfcmVxdWVzdDogVHJ5aW5nIHRvIGFjY2VzcyAiCiAJCQkJIm5vbmV4aXN0ZW50IGJsb2NrLWRldmljZSAlcyAoJUx1KVxuIiwKIAkJCQliZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAogCQkJCShsb25nIGxvbmcpIGJpby0+Ymlfc2VjdG9yKTsKLWVuZF9pbzoKLQkJCWJpb19lbmRpbyhiaW8sIGVycik7Ci0JCQlicmVhazsKKwkJCWdvdG8gZW5kX2lvOwogCQl9CiAKIAkJaWYgKHVubGlrZWx5KG5yX3NlY3RvcnMgPiBxLT5tYXhfaHdfc2VjdG9ycykpIHsKQEAgLTE0NTksMTQgKzE0NDMsMTkgQEAKIAogCQlpZiAoYmlvX2NoZWNrX2VvZChiaW8sIG5yX3NlY3RvcnMpKQogCQkJZ290byBlbmRfaW87Ci0JCWlmICgoYmlvX2VtcHR5X2JhcnJpZXIoYmlvKSAmJiAhcS0+cHJlcGFyZV9mbHVzaF9mbikgfHwKLQkJICAgIChiaW9fZGlzY2FyZChiaW8pICYmICFxLT5wcmVwYXJlX2Rpc2NhcmRfZm4pKSB7CisKKwkJaWYgKGJpb19kaXNjYXJkKGJpbykgJiYgIXEtPnByZXBhcmVfZGlzY2FyZF9mbikgewogCQkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCQlnb3RvIGVuZF9pbzsKIAkJfQogCiAJCXJldCA9IHEtPm1ha2VfcmVxdWVzdF9mbihxLCBiaW8pOwogCX0gd2hpbGUgKHJldCk7CisKKwlyZXR1cm47CisKK2VuZF9pbzoKKwliaW9fZW5kaW8oYmlvLCBlcnIpOwogfQogCiAvKgpAQCAtMTcxNiwxNCArMTcwNSw2IEBACiAJd2hpbGUgKChiaW8gPSByZXEtPmJpbykgIT0gTlVMTCkgewogCQlpbnQgbmJ5dGVzOwogCi0JCS8qCi0JCSAqIEZvciBhbiBlbXB0eSBiYXJyaWVyIHJlcXVlc3QsIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG11c3QKLQkJICogc3RvcmUgYSBwb3RlbnRpYWwgZXJyb3IgbG9jYXRpb24gaW4gLT5zZWN0b3IuIFdlIHBhc3MKLQkJICogdGhhdCBiYWNrIHVwIGluIC0+Ymlfc2VjdG9yLgotCQkgKi8KLQkJaWYgKGJsa19lbXB0eV9iYXJyaWVyKHJlcSkpCi0JCQliaW8tPmJpX3NlY3RvciA9IHJlcS0+c2VjdG9yOwotCiAJCWlmIChucl9ieXRlcyA+PSBiaW8tPmJpX3NpemUpIHsKIAkJCXJlcS0+YmlvID0gYmlvLT5iaV9uZXh0OwogCQkJbmJ5dGVzID0gYmlvLT5iaV9zaXplOwpAQCAtMjE0MywxMiArMjEyNCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGtibG9ja2Rfc2NoZWR1bGVfd29yayk7CiAKLXZvaWQga2Jsb2NrZF9mbHVzaF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQljYW5jZWxfd29ya19zeW5jKHdvcmspOwotfQotRVhQT1JUX1NZTUJPTChrYmxvY2tkX2ZsdXNoX3dvcmspOwotCiBpbnQgX19pbml0IGJsa19kZXZfaW5pdCh2b2lkKQogewogCWtibG9ja2Rfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgia2Jsb2NrZCIpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXNldHRpbmdzLmMgYi9ibG9jay9ibGstc2V0dGluZ3MuYwppbmRleCBhZmE1NWUxLi41OWZkMDVkIDEwMDY0NAotLS0gYS9ibG9jay9ibGstc2V0dGluZ3MuYworKysgYi9ibG9jay9ibGstc2V0dGluZ3MuYwpAQCAtMzE5LDkgKzMxOSw5IEBACiAJdC0+bWF4X2h3X3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X2h3X3NlY3RvcnMsIGItPm1heF9od19zZWN0b3JzKTsKIAl0LT5zZWdfYm91bmRhcnlfbWFzayA9IG1pbl9ub3RfemVybyh0LT5zZWdfYm91bmRhcnlfbWFzaywgYi0+c2VnX2JvdW5kYXJ5X21hc2spOwogCi0JdC0+bWF4X3BoeXNfc2VnbWVudHMgPSBtaW4odC0+bWF4X3BoeXNfc2VnbWVudHMsIGItPm1heF9waHlzX3NlZ21lbnRzKTsKLQl0LT5tYXhfaHdfc2VnbWVudHMgPSBtaW4odC0+bWF4X2h3X3NlZ21lbnRzLCBiLT5tYXhfaHdfc2VnbWVudHMpOwotCXQtPm1heF9zZWdtZW50X3NpemUgPSBtaW4odC0+bWF4X3NlZ21lbnRfc2l6ZSwgYi0+bWF4X3NlZ21lbnRfc2l6ZSk7CisJdC0+bWF4X3BoeXNfc2VnbWVudHMgPSBtaW5fbm90X3plcm8odC0+bWF4X3BoeXNfc2VnbWVudHMsIGItPm1heF9waHlzX3NlZ21lbnRzKTsKKwl0LT5tYXhfaHdfc2VnbWVudHMgPSBtaW5fbm90X3plcm8odC0+bWF4X2h3X3NlZ21lbnRzLCBiLT5tYXhfaHdfc2VnbWVudHMpOworCXQtPm1heF9zZWdtZW50X3NpemUgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlZ21lbnRfc2l6ZSwgYi0+bWF4X3NlZ21lbnRfc2l6ZSk7CiAJdC0+aGFyZHNlY3Rfc2l6ZSA9IG1heCh0LT5oYXJkc2VjdF9zaXplLCBiLT5oYXJkc2VjdF9zaXplKTsKIAlpZiAoIXQtPnF1ZXVlX2xvY2spCiAJCVdBUk5fT05fT05DRSgxKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMgYi9ibG9jay9ibGstc29mdGlycS5jCmluZGV4IGU2NjBkMjYuLmNlMGVmYzYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKKysrIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa19jb21wbGV0ZV9yZXF1ZXN0KTsKIAotX19pbml0IGludCBibGtfc29mdGlycV9pbml0KHZvaWQpCitzdGF0aWMgX19pbml0IGludCBibGtfc29mdGlycV9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zeXNmcy5jIGIvYmxvY2svYmxrLXN5c2ZzLmMKaW5kZXggMjFlMjc1ZC4uYTI5Y2I3OCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXN5c2ZzLmMKKysrIGIvYmxvY2svYmxrLXN5c2ZzLmMKQEAgLTg4LDkgKzg4LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJhX2tiOwogCXNzaXplX3QgcmV0ID0gcXVldWVfdmFyX3N0b3JlKCZyYV9rYiwgcGFnZSwgY291bnQpOwogCi0Jc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlxLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gcmFfa2IgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSAxMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNywxMCArMTE1LDcgQEAKIAogCWlmIChtYXhfc2VjdG9yc19rYiA+IG1heF9od19zZWN0b3JzX2tiIHx8IG1heF9zZWN0b3JzX2tiIDwgcGFnZV9rYikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JLyoKLQkgKiBUYWtlIHRoZSBxdWV1ZSBsb2NrIHRvIHVwZGF0ZSB0aGUgcmVhZGFoZWFkIGFuZCBtYXhfc2VjdG9ycwotCSAqIHZhbHVlcyBzeW5jaHJvbm91c2x5OgotCSAqLworCiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlxLT5tYXhfc2VjdG9ycyA9IG1heF9zZWN0b3JzX2tiIDw8IDE7CiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRhZy5jIGIvYmxvY2svYmxrLXRhZy5jCmluZGV4IGMwZDQxOWUuLjNjNTE4ZTMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10YWcuYworKysgYi9ibG9jay9ibGstdGFnLmMKQEAgLTE1OCw3ICsxNTgsNiBAQAogLyoqCiAgKiBibGtfaW5pdF90YWdzIC0gaW5pdGlhbGl6ZSB0aGUgdGFnIGluZm8gZm9yIGFuIGV4dGVybmFsIHRhZyBtYXAKICAqIEBkZXB0aDoJdGhlIG1heGltdW0gcXVldWUgZGVwdGggc3VwcG9ydGVkCi0gKiBAdGFnczogdGhlIHRhZyB0byB1c2UKICAqKi8KIHN0cnVjdCBibGtfcXVldWVfdGFnICpibGtfaW5pdF90YWdzKGludCBkZXB0aCkKIHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10aW1lb3V0LmMgYi9ibG9jay9ibGstdGltZW91dC5jCmluZGV4IDY5MTg1ZWEuLmEwOTUzNTMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10aW1lb3V0LmMKKysrIGIvYmxvY2svYmxrLXRpbWVvdXQuYwpAQCAtNzMsMTEgKzczLDcgQEAKICAqLwogdm9pZCBibGtfZGVsZXRlX3RpbWVyKHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7Ci0KIAlsaXN0X2RlbF9pbml0KCZyZXEtPnRpbWVvdXRfbGlzdCk7Ci0JaWYgKGxpc3RfZW1wdHkoJnEtPnRpbWVvdXRfbGlzdCkpCi0JCWRlbF90aW1lcigmcS0+dGltZW91dCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19ycV90aW1lZF9vdXQoc3RydWN0IHJlcXVlc3QgKnJlcSkKQEAgLTExMSw3ICsxMDcsNyBAQAogdm9pZCBibGtfcnFfdGltZWRfb3V0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuaW5pdGlhbGl6ZWRfdmFyKG5leHQpLCBuZXh0X3NldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbmV4dCA9IDA7CiAJc3RydWN0IHJlcXVlc3QgKnJxLCAqdG1wOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwpAQCAtMTI2LDE1ICsxMjIsMTggQEAKIAkJCWlmIChibGtfbWFya19ycV9jb21wbGV0ZShycSkpCiAJCQkJY29udGludWU7CiAJCQlibGtfcnFfdGltZWRfb3V0KHJxKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghbmV4dCB8fCB0aW1lX2FmdGVyKG5leHQsIHJxLT5kZWFkbGluZSkpCisJCQkJbmV4dCA9IHJxLT5kZWFkbGluZTsKIAkJfQotCQlpZiAoIW5leHRfc2V0KSB7Ci0JCQluZXh0ID0gcnEtPmRlYWRsaW5lOwotCQkJbmV4dF9zZXQgPSAxOwotCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIobmV4dCwgcnEtPmRlYWRsaW5lKSkKLQkJCW5leHQgPSBycS0+ZGVhZGxpbmU7CiAJfQogCi0JaWYgKG5leHRfc2V0ICYmICFsaXN0X2VtcHR5KCZxLT50aW1lb3V0X2xpc3QpKQorCS8qCisJICogbmV4dCBjYW4gbmV2ZXIgYmUgMCBoZXJlIHdpdGggdGhlIGxpc3Qgbm9uLWVtcHR5LCBzaW5jZSB3ZSBhbHdheXMKKwkgKiBidW1wIC0+ZGVhZGxpbmUgdG8gMSBzbyB3ZSBjYW4gZGV0ZWN0IGlmIHRoZSB0aW1lciB3YXMgZXZlciBhZGRlZAorCSAqIG9yIG5vdC4gU2VlIGNvbW1lbnQgaW4gYmxrX2FkZF90aW1lcigpCisJICovCisJaWYgKG5leHQpCiAJCW1vZF90aW1lcigmcS0+dGltZW91dCwgcm91bmRfamlmZmllc191cChuZXh0KSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDZhMDYyZWUuLmU4NTI1ZmEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTEzNiwxMiArMTEzNiw4IEBACiAJCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKIAkJCW1heF9kaXNwYXRjaCA9IDE7CiAKLQkJaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gbWF4X2Rpc3BhdGNoKSB7Ci0JCQlpZiAoY2ZxZC0+YnVzeV9xdWV1ZXMgPiAxKQotCQkJCWJyZWFrOwotCQkJaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gNCAqIG1heF9kaXNwYXRjaCkKLQkJCQlicmVhazsKLQkJfQorCQlpZiAoY2ZxcS0+ZGlzcGF0Y2hlZCA+PSBtYXhfZGlzcGF0Y2ggJiYgY2ZxZC0+YnVzeV9xdWV1ZXMgPiAxKQorCQkJYnJlYWs7CiAKIAkJaWYgKGNmcWQtPnN5bmNfZmxpZ2h0ICYmICFjZnFfY2ZxcV9zeW5jKGNmcXEpKQogCQkJYnJlYWs7CkBAIC0xMzE4LDcgKzEzMTQsMTUgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCV9fY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoY2ZxZCwgY2ljKTsKKworCQkvKgorCQkgKiBFbnN1cmUgd2UgZ2V0IGEgZnJlc2ggY29weSBvZiB0aGUgLT5rZXkgdG8gcHJldmVudAorCQkgKiByYWNlIGJldHdlZW4gZXhpdGluZyB0YXNrIGFuZCBxdWV1ZQorCQkgKi8KKwkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7CisJCWlmIChjaWMtPmtleSkKKwkJCV9fY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoY2ZxZCwgY2ljKTsKKwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAl9CiB9CkBAIC0yMTYwLDcgKzIxNjQsNyBAQAogc3RhdGljIHZvaWQgY2ZxX3NodXRkb3duX3RpbWVyX3dxKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKIAlkZWxfdGltZXJfc3luYygmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7Ci0Ja2Jsb2NrZF9mbHVzaF93b3JrKCZjZnFkLT51bnBsdWdfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmY2ZxZC0+dW5wbHVnX3dvcmspOwogfQogCiBzdGF0aWMgdm9pZCBjZnFfcHV0X2FzeW5jX3F1ZXVlcyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCkBAIC0yMTc4LDcgKzIxODIsNyBAQAogCQljZnFfcHV0X3F1ZXVlKGNmcWQtPmFzeW5jX2lkbGVfY2ZxcSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNmcV9leGl0X3F1ZXVlKGVsZXZhdG9yX3QgKmUpCitzdGF0aWMgdm9pZCBjZnFfZXhpdF9xdWV1ZShzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gZS0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNmcWQtPnF1ZXVlOwpAQCAtMjI4OCw3ICsyMjkyLDcgQEAKIH0KIAogI2RlZmluZSBTSE9XX0ZVTkNUSU9OKF9fRlVOQywgX19WQVIsIF9fQ09OVikJCQkJXAotc3RhdGljIHNzaXplX3QgX19GVU5DKGVsZXZhdG9yX3QgKmUsIGNoYXIgKnBhZ2UpCQkJXAorc3RhdGljIHNzaXplX3QgX19GVU5DKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSwgY2hhciAqcGFnZSkJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gZS0+ZWxldmF0b3JfZGF0YTsJCQlcCiAJdW5zaWduZWQgaW50IF9fZGF0YSA9IF9fVkFSOwkJCQkJXApAQCAtMjMwOCw3ICsyMzEyLDcgQEAKICN1bmRlZiBTSE9XX0ZVTkNUSU9OCiAKICNkZWZpbmUgU1RPUkVfRlVOQ1RJT04oX19GVU5DLCBfX1BUUiwgTUlOLCBNQVgsIF9fQ09OVikJCQlcCi1zdGF0aWMgc3NpemVfdCBfX0ZVTkMoZWxldmF0b3JfdCAqZSwgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQlcCitzdGF0aWMgc3NpemVfdCBfX0ZVTkMoc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gZS0+ZWxldmF0b3JfZGF0YTsJCQlcCiAJdW5zaWduZWQgaW50IF9fZGF0YTsJCQkJCQlcCmRpZmYgLS1naXQgYS9ibG9jay9jb21wYXRfaW9jdGwuYyBiL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCmluZGV4IDY3ZWI5M2MuLmY4NzYxNWQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCisrKyBiL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCkBAIC03NzQsOSArNzc0LDcgQEAKIAkJYmRpID0gYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKGJkZXYpOwogCQlpZiAoYmRpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT1RUWTsKLQkJbG9ja19rZXJuZWwoKTsKIAkJYmRpLT5yYV9wYWdlcyA9IChhcmcgKiA1MTIpIC8gUEFHRV9DQUNIRV9TSVpFOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAwOwogCWNhc2UgQkxLR0VUU0laRToKIAkJc2l6ZSA9IGJkZXYtPmJkX2lub2RlLT5pX3NpemU7CmRpZmYgLS1naXQgYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggZmQzMTExNy4uYzRkOTkxZCAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJCSYmIGxpc3RfZW1wdHkoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogfQogCi1zdGF0aWMgdm9pZCBkZWFkbGluZV9leGl0X3F1ZXVlKGVsZXZhdG9yX3QgKmUpCitzdGF0aWMgdm9pZCBkZWFkbGluZV9leGl0X3F1ZXVlKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSkKIHsKIAlzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQgPSBlLT5lbGV2YXRvcl9kYXRhOwogCkBAIC0zODcsNyArMzg3LDcgQEAKIH0KIAogI2RlZmluZSBTSE9XX0ZVTkNUSU9OKF9fRlVOQywgX19WQVIsIF9fQ09OVikJCQkJXAotc3RhdGljIHNzaXplX3QgX19GVU5DKGVsZXZhdG9yX3QgKmUsIGNoYXIgKnBhZ2UpCQkJXAorc3RhdGljIHNzaXplX3QgX19GVU5DKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSwgY2hhciAqcGFnZSkJCVwKIHsJCQkJCQkJCQlcCiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkID0gZS0+ZWxldmF0b3JfZGF0YTsJCQlcCiAJaW50IF9fZGF0YSA9IF9fVkFSOwkJCQkJCVwKQEAgLTQwMyw3ICs0MDMsNyBAQAogI3VuZGVmIFNIT1dfRlVOQ1RJT04KIAogI2RlZmluZSBTVE9SRV9GVU5DVElPTihfX0ZVTkMsIF9fUFRSLCBNSU4sIE1BWCwgX19DT05WKQkJCVwKLXN0YXRpYyBzc2l6ZV90IF9fRlVOQyhlbGV2YXRvcl90ICplLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCVwKK3N0YXRpYyBzc2l6ZV90IF9fRlVOQyhzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBjb3VudCkJXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQgPSBlLT5lbGV2YXRvcl9kYXRhOwkJCVwKIAlpbnQgX19kYXRhOwkJCQkJCQlcCmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCA4NjgzNmRkLi45ODI1OWVkIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTY1LDcgKzY1LDcgQEAKIHN0YXRpYyBpbnQgZWx2X2lvc2NoZWRfYWxsb3dfbWVyZ2Uoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBycS0+cTsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9hbGxvd19tZXJnZV9mbikKIAkJcmV0dXJuIGUtPm9wcy0+ZWxldmF0b3JfYWxsb3dfbWVyZ2VfZm4ocSwgcnEsIGJpbyk7CkBAIC0yMDgsMTMgKzIwOCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBlbHZfa3R5cGU7CiAKLXN0YXRpYyBlbGV2YXRvcl90ICplbGV2YXRvcl9hbGxvYyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKK3N0YXRpYyBzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmVsZXZhdG9yX2FsbG9jKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJCSAgc3RydWN0IGVsZXZhdG9yX3R5cGUgKmUpCiB7Ci0JZWxldmF0b3JfdCAqZXE7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplcTsKIAlpbnQgaTsKIAotCWVxID0ga21hbGxvY19ub2RlKHNpemVvZihlbGV2YXRvcl90KSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOworCWVxID0ga21hbGxvY19ub2RlKHNpemVvZigqZXEpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKHVubGlrZWx5KCFlcSkpCiAJCWdvdG8gZXJyOwogCkBAIC0yNDAsOCArMjQwLDkgQEAKIAogc3RhdGljIHZvaWQgZWxldmF0b3JfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQllbGV2YXRvcl90ICplID0gY29udGFpbmVyX29mKGtvYmosIGVsZXZhdG9yX3QsIGtvYmopOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZTsKIAorCWUgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGVsZXZhdG9yX3F1ZXVlLCBrb2JqKTsKIAllbGV2YXRvcl9wdXQoZS0+ZWxldmF0b3JfdHlwZSk7CiAJa2ZyZWUoZS0+aGFzaCk7CiAJa2ZyZWUoZSk7CkBAIC0yOTcsNyArMjk4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZWxldmF0b3JfaW5pdCk7CiAKLXZvaWQgZWxldmF0b3JfZXhpdChlbGV2YXRvcl90ICplKQordm9pZCBlbGV2YXRvcl9leGl0KHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSkKIHsKIAltdXRleF9sb2NrKCZlLT5zeXNmc19sb2NrKTsKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9leGl0X2ZuKQpAQCAtMzExLDcgKzMxMiw3IEBACiAKIHN0YXRpYyB2b2lkIGVsdl9hY3RpdmF0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikKIAkJZS0+b3BzLT5lbGV2YXRvcl9hY3RpdmF0ZV9yZXFfZm4ocSwgcnEpOwpAQCAtMzE5LDcgKzMyMCw3IEBACiAKIHN0YXRpYyB2b2lkIGVsdl9kZWFjdGl2YXRlX3JxKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCiAJaWYgKGUtPm9wcy0+ZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4pCiAJCWUtPm9wcy0+ZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4ocSwgcnEpOwpAQCAtMzM4LDcgKzMzOSw3IEBACiAKIHN0YXRpYyB2b2lkIGVsdl9ycWhhc2hfYWRkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCiAJQlVHX09OKEVMVl9PTl9IQVNIKHJxKSk7CiAJaGxpc3RfYWRkX2hlYWQoJnJxLT5oYXNoLCAmZS0+aGFzaFtFTFZfSEFTSF9GTihycV9oYXNoX2tleShycSkpXSk7CkBAIC0zNTIsNyArMzUzLDcgQEAKIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICplbHZfcnFoYXNoX2ZpbmQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHNlY3Rvcl90IG9mZnNldCkKIHsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhhc2hfbGlzdCA9ICZlLT5oYXNoW0VMVl9IQVNIX0ZOKG9mZnNldCldOwogCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKm5leHQ7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwpAQCAtNDk0LDcgKzQ5NSw3IEBACiAKIGludCBlbHZfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCXN0cnVjdCByZXF1ZXN0ICpfX3JxOwogCWludCByZXQ7CiAKQEAgLTUyOSw3ICs1MzAsNyBAQAogCiB2b2lkIGVsdl9tZXJnZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdHlwZSkKIHsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9tZXJnZWRfZm4pCiAJCWUtPm9wcy0+ZWxldmF0b3JfbWVyZ2VkX2ZuKHEsIHJxLCB0eXBlKTsKQEAgLTU0Myw3ICs1NDQsNyBAQAogdm9pZCBlbHZfbWVyZ2VfcmVxdWVzdHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCSAgICAgc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCiAJaWYgKGUtPm9wcy0+ZWxldmF0b3JfbWVyZ2VfcmVxX2ZuKQogCQllLT5vcHMtPmVsZXZhdG9yX21lcmdlX3JlcV9mbihxLCBycSwgbmV4dCk7CkBAIC03NTUsMTQgKzc1Niw2IEBACiAJaW50IHJldDsKIAogCXdoaWxlICgocnEgPSBfX2Vsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKLQkJLyoKLQkJICogS2lsbCB0aGUgZW1wdHkgYmFycmllciBwbGFjZSBob2xkZXIsIHRoZSBkcml2ZXIgbXVzdAotCQkgKiBub3QgZXZlciBzZWUgaXQuCi0JCSAqLwotCQlpZiAoYmxrX2VtcHR5X2JhcnJpZXIocnEpKSB7Ci0JCQlfX2Jsa19lbmRfcmVxdWVzdChycSwgMCwgYmxrX3JxX2J5dGVzKHJxKSk7Ci0JCQljb250aW51ZTsKLQkJfQogCQlpZiAoIShycS0+Y21kX2ZsYWdzICYgUkVRX1NUQVJURUQpKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZGV2aWNlIGRyaXZlcgpAQCAtODU0LDcgKzg0Nyw3IEBACiAKIGludCBlbHZfcXVldWVfZW1wdHkoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZV9oZWFkKSkKIAkJcmV0dXJuIDA7CkBAIC04NjgsNyArODYxLDcgQEAKIAogc3RydWN0IHJlcXVlc3QgKmVsdl9sYXR0ZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX2xhdHRlcl9yZXFfZm4pCiAJCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX2xhdHRlcl9yZXFfZm4ocSwgcnEpOwpAQCAtODc3LDcgKzg3MCw3IEBACiAKIHN0cnVjdCByZXF1ZXN0ICplbHZfZm9ybWVyX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9mb3JtZXJfcmVxX2ZuKQogCQlyZXR1cm4gZS0+b3BzLT5lbGV2YXRvcl9mb3JtZXJfcmVxX2ZuKHEsIHJxKTsKQEAgLTg4Niw3ICs4NzksNyBAQAogCiBpbnQgZWx2X3NldF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGdmcF90IGdmcF9tYXNrKQogewotCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX3NldF9yZXFfZm4pCiAJCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX3NldF9yZXFfZm4ocSwgcnEsIGdmcF9tYXNrKTsKQEAgLTg5Nyw3ICs4OTAsNyBAQAogCiB2b2lkIGVsdl9wdXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX3B1dF9yZXFfZm4pCiAJCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihycSk7CkBAIC05MDUsNyArODk4LDcgQEAKIAogaW50IGVsdl9tYXlfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBydykKIHsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9tYXlfcXVldWVfZm4pCiAJCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX21heV9xdWV1ZV9mbihxLCBydyk7CkBAIC05MjgsNyArOTIxLDcgQEAKIAogdm9pZCBlbHZfY29tcGxldGVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CisJc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplID0gcS0+ZWxldmF0b3I7CiAKIAkvKgogCSAqIHJlcXVlc3QgaXMgcmVsZWFzZWQgZnJvbSB0aGUgZHJpdmVyLCBpbyBtdXN0IGJlIGRvbmUKQEAgLTk0NCwxMCArOTM3LDE0IEBACiAJICogZHJhaW5lZCBmb3IgZmx1c2ggc2VxdWVuY2UuCiAJICovCiAJaWYgKHVubGlrZWx5KHEtPm9yZHNlcSkpIHsKLQkJc3RydWN0IHJlcXVlc3QgKmZpcnN0X3JxID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOwotCQlpZiAocS0+aW5fZmxpZ2h0ID09IDAgJiYKKwkJc3RydWN0IHJlcXVlc3QgKm5leHQgPSBOVUxMOworCisJCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWVfaGVhZCkpCisJCQluZXh0ID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOworCisJCWlmICghcS0+aW5fZmxpZ2h0ICYmCiAJCSAgICBibGtfb3JkZXJlZF9jdXJfc2VxKHEpID09IFFVRVVFX09SRFNFUV9EUkFJTiAmJgotCQkgICAgYmxrX29yZGVyZWRfcmVxX3NlcShmaXJzdF9ycSkgPiBRVUVVRV9PUkRTRVFfRFJBSU4pIHsKKwkJICAgICghbmV4dCB8fCBibGtfb3JkZXJlZF9yZXFfc2VxKG5leHQpID4gUVVFVUVfT1JEU0VRX0RSQUlOKSkgewogCQkJYmxrX29yZGVyZWRfY29tcGxldGVfc2VxKHEsIFFVRVVFX09SRFNFUV9EUkFJTiwgMCk7CiAJCQlibGtfc3RhcnRfcXVldWVpbmcocSk7CiAJCX0KQEAgLTk1OSwxMyArOTU2LDE0IEBACiBzdGF0aWMgc3NpemVfdAogZWx2X2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqcGFnZSkKIHsKLQllbGV2YXRvcl90ICplID0gY29udGFpbmVyX29mKGtvYmosIGVsZXZhdG9yX3QsIGtvYmopOwogCXN0cnVjdCBlbHZfZnNfZW50cnkgKmVudHJ5ID0gdG9fZWx2KGF0dHIpOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZTsKIAlzc2l6ZV90IGVycm9yOwogCiAJaWYgKCFlbnRyeS0+c2hvdykKIAkJcmV0dXJuIC1FSU87CiAKKwllID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSwga29iaik7CiAJbXV0ZXhfbG9jaygmZS0+c3lzZnNfbG9jayk7CiAJZXJyb3IgPSBlLT5vcHMgPyBlbnRyeS0+c2hvdyhlLCBwYWdlKSA6IC1FTk9FTlQ7CiAJbXV0ZXhfdW5sb2NrKCZlLT5zeXNmc19sb2NrKTsKQEAgLTk3NiwxMyArOTc0LDE0IEBACiBlbHZfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKIAkgICAgICAgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGxlbmd0aCkKIHsKLQllbGV2YXRvcl90ICplID0gY29udGFpbmVyX29mKGtvYmosIGVsZXZhdG9yX3QsIGtvYmopOwogCXN0cnVjdCBlbHZfZnNfZW50cnkgKmVudHJ5ID0gdG9fZWx2KGF0dHIpOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZTsKIAlzc2l6ZV90IGVycm9yOwogCiAJaWYgKCFlbnRyeS0+c3RvcmUpCiAJCXJldHVybiAtRUlPOwogCisJZSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZWxldmF0b3JfcXVldWUsIGtvYmopOwogCW11dGV4X2xvY2soJmUtPnN5c2ZzX2xvY2spOwogCWVycm9yID0gZS0+b3BzID8gZW50cnktPnN0b3JlKGUsIHBhZ2UsIGxlbmd0aCkgOiAtRU5PRU5UOwogCW11dGV4X3VubG9jaygmZS0+c3lzZnNfbG9jayk7CkBAIC0xMDAxLDcgKzEwMDAsNyBAQAogCiBpbnQgZWx2X3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKIAlpbnQgZXJyb3I7CiAKIAllcnJvciA9IGtvYmplY3RfYWRkKCZlLT5rb2JqLCAmcS0+a29iaiwgIiVzIiwgImlvc2NoZWQiKTsKQEAgLTEwMTksNyArMTAxOCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgdm9pZCBfX2Vsdl91bnJlZ2lzdGVyX3F1ZXVlKGVsZXZhdG9yX3QgKmUpCitzdGF0aWMgdm9pZCBfX2Vsdl91bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSkKIHsKIAlrb2JqZWN0X3VldmVudCgmZS0+a29iaiwgS09CSl9SRU1PVkUpOwogCWtvYmplY3RfZGVsKCZlLT5rb2JqKTsKQEAgLTEwODIsNyArMTA4MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZWxldmF0b3Jfc3dpdGNoKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqbmV3X2UpCiB7Ci0JZWxldmF0b3JfdCAqb2xkX2VsZXZhdG9yLCAqZTsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKm9sZF9lbGV2YXRvciwgKmU7CiAJdm9pZCAqZGF0YTsKIAogCS8qCkBAIC0xMTg4LDcgKzExODcsNyBAQAogCiBzc2l6ZV90IGVsdl9pb3NjaGVkX3Nob3coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUpCiB7Ci0JZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOworCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwogCXN0cnVjdCBlbGV2YXRvcl90eXBlICplbHYgPSBlLT5lbGV2YXRvcl90eXBlOwogCXN0cnVjdCBlbGV2YXRvcl90eXBlICpfX2U7CiAJaW50IGxlbiA9IDA7CmRpZmYgLS1naXQgYS9ibG9jay9nZW5oZC5jIGIvYmxvY2svZ2VuaGQuYwppbmRleCAyZjdmZWRhLi5kODRhN2RmIDEwMDY0NAotLS0gYS9ibG9jay9nZW5oZC5jCisrKyBiL2Jsb2NrL2dlbmhkLmMKQEAgLTE4MSw2ICsxODEsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRpc2tfcGFydF9pdGVyX2V4aXQpOwogCitzdGF0aWMgaW5saW5lIGludCBzZWN0b3JfaW5fcGFydChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0LCBzZWN0b3JfdCBzZWN0b3IpCit7CisJcmV0dXJuIHBhcnQtPnN0YXJ0X3NlY3QgPD0gc2VjdG9yICYmCisJCXNlY3RvciA8IHBhcnQtPnN0YXJ0X3NlY3QgKyBwYXJ0LT5ucl9zZWN0czsKK30KKwogLyoqCiAgKiBkaXNrX21hcF9zZWN0b3JfcmN1IC0gbWFwIHNlY3RvciB0byBwYXJ0aXRpb24KICAqIEBkaXNrOiBnZW5kaXNrIG9mIGludGVyZXN0CkBAIC0xOTksMTYgKzIwNSwyMiBAQAogc3RydWN0IGhkX3N0cnVjdCAqZGlza19tYXBfc2VjdG9yX3JjdShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc2VjdG9yX3Qgc2VjdG9yKQogewogCXN0cnVjdCBkaXNrX3BhcnRfdGJsICpwdGJsOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAJaW50IGk7CiAKIAlwdGJsID0gcmN1X2RlcmVmZXJlbmNlKGRpc2stPnBhcnRfdGJsKTsKIAotCWZvciAoaSA9IDE7IGkgPCBwdGJsLT5sZW47IGkrKykgewotCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gcmN1X2RlcmVmZXJlbmNlKHB0YmwtPnBhcnRbaV0pOworCXBhcnQgPSByY3VfZGVyZWZlcmVuY2UocHRibC0+bGFzdF9sb29rdXApOworCWlmIChwYXJ0ICYmIHNlY3Rvcl9pbl9wYXJ0KHBhcnQsIHNlY3RvcikpCisJCXJldHVybiBwYXJ0OwogCi0JCWlmIChwYXJ0ICYmIHBhcnQtPnN0YXJ0X3NlY3QgPD0gc2VjdG9yICYmCi0JCSAgICBzZWN0b3IgPCBwYXJ0LT5zdGFydF9zZWN0ICsgcGFydC0+bnJfc2VjdHMpCisJZm9yIChpID0gMTsgaSA8IHB0YmwtPmxlbjsgaSsrKSB7CisJCXBhcnQgPSByY3VfZGVyZWZlcmVuY2UocHRibC0+cGFydFtpXSk7CisKKwkJaWYgKHBhcnQgJiYgc2VjdG9yX2luX3BhcnQocGFydCwgc2VjdG9yKSkgeworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHB0YmwtPmxhc3RfbG9va3VwLCBwYXJ0KTsKIAkJCXJldHVybiBwYXJ0OworCQl9CiAJfQogCXJldHVybiAmZGlzay0+cGFydDA7CiB9CkBAIC04ODgsOCArOTAwLDExIEBACiAJc3RydWN0IGRpc2tfcGFydF90YmwgKm9sZF9wdGJsID0gZGlzay0+cGFydF90Ymw7CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIoZGlzay0+cGFydF90YmwsIG5ld19wdGJsKTsKLQlpZiAob2xkX3B0YmwpCisKKwlpZiAob2xkX3B0YmwpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG9sZF9wdGJsLT5sYXN0X2xvb2t1cCwgTlVMTCk7CiAJCWNhbGxfcmN1KCZvbGRfcHRibC0+cmN1X2hlYWQsIGRpc2tfZnJlZV9wdGJsX3JjdV9jYik7CisJfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IGQwMzk4NWIuLjBmMjJlNjIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtMzIzLDkgKzMyMyw3IEBACiAJCWJkaSA9IGJsa19nZXRfYmFja2luZ19kZXZfaW5mbyhiZGV2KTsKIAkJaWYgKGJkaSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9UVFk7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCWJkaS0+cmFfcGFnZXMgPSAoYXJnICogNTEyKSAvIFBBR0VfQ0FDSEVfU0laRTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gMDsKIAljYXNlIEJMS0JTWlNFVDoKIAkJLyogc2V0IHRoZSBsb2dpY2FsIGJsb2NrIHNpemUgKi8KZGlmZiAtLWdpdCBhL2Jsb2NrL25vb3AtaW9zY2hlZC5jIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKaW5kZXggYzIzZTAyOS4uM2EwZDM2OSAxMDA2NDQKLS0tIGEvYmxvY2svbm9vcC1pb3NjaGVkLmMKKysrIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlyZXR1cm4gbmQ7CiB9CiAKLXN0YXRpYyB2b2lkIG5vb3BfZXhpdF9xdWV1ZShlbGV2YXRvcl90ICplKQorc3RhdGljIHZvaWQgbm9vcF9leGl0X3F1ZXVlKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSkKIHsKIAlzdHJ1Y3Qgbm9vcF9kYXRhICpuZCA9IGUtPmVsZXZhdG9yX2RhdGE7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL3Njc2lfaW9jdGwuYyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwppbmRleCBkMGJiOTJjLi5lZTljNjdkIDEwMDY0NAotLS0gYS9ibG9jay9zY3NpX2lvY3RsLmMKKysrIGIvYmxvY2svc2NzaV9pb2N0bC5jCkBAIC02MCw3ICs2MCw3IEBACiAKIHN0YXRpYyBpbnQgc2dfZ2V0X3RpbWVvdXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0JcmV0dXJuIHEtPnNnX3RpbWVvdXQgLyAoSFogLyBVU0VSX0haKTsKKwlyZXR1cm4gamlmZmllc190b19jbG9ja190KHEtPnNnX3RpbWVvdXQpOwogfQogCiBzdGF0aWMgaW50IHNnX3NldF90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgX191c2VyICpwKQpAQCAtNjgsNyArNjgsNyBAQAogCWludCB0aW1lb3V0LCBlcnIgPSBnZXRfdXNlcih0aW1lb3V0LCBwKTsKIAogCWlmICghZXJyKQotCQlxLT5zZ190aW1lb3V0ID0gdGltZW91dCAqIChIWiAvIFVTRVJfSFopOworCQlxLT5zZ190aW1lb3V0ID0gY2xvY2tfdF90b19qaWZmaWVzKHRpbWVvdXQpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCBhNjdiOGU3Li42NTY0NDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0xMTE5LDE0ICsxMTE5LDE0IEBACiAKIAkvKiB0dXJuIG9uIExFRHMgKi8KIAlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRU0pIHsKLQkJYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgRURHRSkgewogCQkJZW1wID0gJnBwLT5lbV9wcml2W2xpbmstPnBtcF07CiAJCQlhaGNpX3RyYW5zbWl0X2xlZF9tZXNzYWdlKGFwLCBlbXAtPmxlZF9zdGF0ZSwgNCk7CiAJCX0KIAl9CiAKIAlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU1dfQUNUSVZJVFkpCi0JCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApCisJCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKQogCQkJYWhjaV9pbml0X3N3X2FjdGl2aXR5KGxpbmspOwogCiB9CkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCXN0cnVjdCBhaGNpX2VtX3ByaXYgKmVtcDsKIAlpbnQgcmMgPSAwOwogCi0JYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CiAJCWVtcCA9ICZwcC0+ZW1fcHJpdltsaW5rLT5wbXBdOwogCQlyYyArPSBzcHJpbnRmKGJ1ZiwgIiVseFxuIiwgZW1wLT5sZWRfc3RhdGUpOwogCX0KQEAgLTE5NDEsNyArMTk0MSw3IEBACiAJdTMyIHNlcnJvcjsKIAogCS8qIGRldGVybWluZSBhY3RpdmUgbGluayAqLwotCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApCisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpCiAJCWlmIChhdGFfbGlua19hY3RpdmUobGluaykpCiAJCQlicmVhazsKIAlpZiAoIWxpbmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwppbmRleCA1YzMzNzY3Li5kYzQ4YTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKQEAgLTU3LDEwICs1Nyw3IEBACiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NFTkFURUspCiAJCWRtYV9lbmFibGVkID0gMHhGRjsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKLQkJCWNvbnRpbnVlOwotCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgKi8KIAkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7CiAJCWRldi0+ZG1hX21vZGUgPSBYRkVSX01XX0RNQV8wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggYzExOTM2ZS4uNWZkZjE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xMDcyLDIwICsxMDcyLDEzIEBACiAJICogbWF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZG1pX3N5c3RlbV9pZC5tYXRjaGVzIGlzCiAJICogbGltaXRlZCB0byBmb3VyIGVudHJpZXMuCiAJICovCi0JaWYgKGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1NZU19WRU5ET1IpICYmCi0JICAgIGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfTkFNRSkgJiYKLQkgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9WRVJTSU9OKSAmJgotCSAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX1NFUklBTCkgJiYKLQkgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfVkVORE9SKSAmJgotCSAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9OQU1FKSAmJgotCSAgICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9WRVJTSU9OKSAmJgotCSAgICAhc3RyY21wKGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1NZU19WRU5ET1IpLCAiVE9TSElCQSIpICYmCi0JICAgICFzdHJjbXAoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKSwgIjAwMDAwMCIpICYmCi0JICAgICFzdHJjbXAoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9WRVJTSU9OKSwgIjAwMDAwMCIpICYmCi0JICAgICFzdHJjbXAoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9TRVJJQUwpLCAiMDAwMDAwIikgJiYKLQkgICAgIXN0cmNtcChkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9WRU5ET1IpLCAiVE9TSElCQSIpICYmCi0JICAgICFzdHJjbXAoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSksICJQb3J0YWJsZSBQQyIpICYmCi0JICAgICFzdHJjbXAoZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfVkVSU0lPTiksICJWZXJzaW9uIEEwIikpCisJaWYgKGRtaV9tYXRjaChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSAmJgorCSAgICBkbWlfbWF0Y2goRE1JX1BST0RVQ1RfTkFNRSwgIjAwMDAwMCIpICYmCisJICAgIGRtaV9tYXRjaChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMDAwMDAwIikgJiYKKwkgICAgZG1pX21hdGNoKERNSV9QUk9EVUNUX1NFUklBTCwgIjAwMDAwMCIpICYmCisJICAgIGRtaV9tYXRjaChETUlfQk9BUkRfVkVORE9SLCAiVE9TSElCQSIpICYmCisJICAgIGRtaV9tYXRjaChETUlfQk9BUkRfTkFNRSwgIlBvcnRhYmxlIFBDIikgJiYKKwkgICAgZG1pX21hdGNoKERNSV9CT0FSRF9WRVJTSU9OLCAiVmVyc2lvbiBBMCIpKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKaW5kZXggYzAxMjMwNy4uZWYwMmU0ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtODksNyArODksNyBAQAogCiAJCWFwLT5saW5rLmRldmljZS0+YWNwaV9oYW5kbGUgPSBOVUxMOwogCi0JCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKKwkJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJCWFjcGlfaW50ZWdlciBhZHIgPSBTQVRBX0FEUihhcC0+cG9ydF9ubywgbGluay0+cG1wKTsKIAogCQkJbGluay0+ZGV2aWNlLT5hY3BpX2hhbmRsZSA9CkBAIC0xMjksOCArMTI5LDggQEAKIAkJc3RydWN0IGF0YV9saW5rICp0bGluazsKIAkJc3RydWN0IGF0YV9kZXZpY2UgKnRkZXY7CiAKLQkJYXRhX3BvcnRfZm9yX2VhY2hfbGluayh0bGluaywgYXApCi0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYodGRldiwgdGxpbmspCisJCWF0YV9mb3JfZWFjaF9saW5rKHRsaW5rLCBhcCwgRURHRSkKKwkJCWF0YV9mb3JfZWFjaF9kZXYodGRldiwgdGxpbmssIEFMTCkKIAkJCQl0ZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfREVUQUNIOwogCX0KIApAQCAtNTg4LDEyICs1ODgsOSBAQAogewogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmspIHsKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBFTkFCTEVEKSB7CiAJCXVuc2lnbmVkIGxvbmcgeGZlcl9tYXNrLCB1ZG1hX21hc2s7CiAKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKLQkJCWNvbnRpbnVlOwotCiAJCXhmZXJfbWFzayA9IGF0YV9hY3BpX2d0bV94ZmVybWFzayhkZXYsIGd0bSk7CiAJCWF0YV91bnBhY2tfeGZlcm1hc2soeGZlcl9tYXNrLCBOVUxMLCBOVUxMLCAmdWRtYV9tYXNrKTsKIApAQCAtODkzLDcgKzg5MCw3IEBACiAJCSAqIHVzZSB2YWx1ZXMgc2V0IGJ5IF9TVE0uICBDYWNoZSBfR1RGIHJlc3VsdCBhbmQKIAkJICogc2NoZWR1bGUgX0dURi4KIAkJICovCi0JCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykgeworCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBBTEwpIHsKIAkJCWF0YV9hY3BpX2NsZWFyX2d0ZihkZXYpOwogCQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpICYmCiAJCQkgICAgYXRhX2Rldl9nZXRfR1RGKGRldiwgTlVMTCkgPj0gMCkKQEAgLTkwNCw3ICs5MDEsNyBAQAogCQkgKiB0aGVyZSdzIG5vIHJlYXNvbiB0byBldmFsdWF0ZSBJREUgX0dURiBlYXJseQogCQkgKiB3aXRob3V0IF9TVE0uICBDbGVhciBjYWNoZSBhbmQgc2NoZWR1bGUgX0dURi4KIAkJICovCi0JCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykgeworCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBBTEwpIHsKIAkJCWF0YV9hY3BpX2NsZWFyX2d0ZihkZXYpOwogCQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKQogCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0FDUElfUEVORElORzsKQEAgLTkzMiw4ICs5MjksOCBAQAogCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikKIAkJYWNwaV9idXNfc2V0X3Bvd2VyKGFwLT5hY3BpX2hhbmRsZSwgQUNQSV9TVEFURV9EMCk7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmspIHsKLQkJaWYgKGRldi0+YWNwaV9oYW5kbGUgJiYgYXRhX2Rldl9lbmFibGVkKGRldikpCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkgeworCQlpZiAoZGV2LT5hY3BpX2hhbmRsZSkKIAkJCWFjcGlfYnVzX3NldF9wb3dlcihkZXYtPmFjcGlfaGFuZGxlLAogCQkJCXN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OID8KIAkJCQkJQUNQSV9TVEFURV9EMCA6IEFDUElfU1RBVEVfRDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggYmM2Njk1ZS4uZmVjY2E0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC0xNjMsNDMgKzE2MywxMTkgQEAKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIAogCi0vKgotICogSXRlcmF0b3IgaGVscGVycy4gIERvbid0IHVzZSBkaXJlY3RseS4KKy8qKgorICoJYXRhX2xpbmtfbmV4dCAtIGxpbmsgaXRlcmF0aW9uIGhlbHBlcgorICoJQGxpbms6IHRoZSBwcmV2aW91cyBsaW5rLCBOVUxMIHRvIHN0YXJ0CisgKglAYXA6IEFUQSBwb3J0IGNvbnRhaW5pbmcgbGlua3MgdG8gaXRlcmF0ZQorICoJQG1vZGU6IGl0ZXJhdGlvbiBtb2RlLCBvbmUgb2YgQVRBX0xJVEVSXyoKICAqCi0gKiBMT0NLSU5HOgotICogSG9zdCBsb2NrIG9yIEVIIGNvbnRleHQuCisgKglMT0NLSU5HOgorICoJSG9zdCBsb2NrIG9yIEVIIGNvbnRleHQuCisgKgorICoJUkVUVVJOUzoKKyAqCVBvaW50ZXIgdG8gdGhlIG5leHQgbGluay4KICAqLwotc3RydWN0IGF0YV9saW5rICpfX2F0YV9wb3J0X25leHRfbGluayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCSAgICAgIHN0cnVjdCBhdGFfbGluayAqbGluaywgYm9vbCBkZXZfb25seSkKK3N0cnVjdCBhdGFfbGluayAqYXRhX2xpbmtfbmV4dChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkgICAgICAgZW51bSBhdGFfbGlua19pdGVyX21vZGUgbW9kZSkKIHsKLQkvKiBOVUxMIGxpbmsgaW5kaWNhdGVzIHN0YXJ0IG9mIGl0ZXJhdGlvbiAqLwotCWlmICghbGluaykgewotCQlpZiAoZGV2X29ubHkgJiYgc2F0YV9wbXBfYXR0YWNoZWQoYXApKQotCQkJcmV0dXJuIGFwLT5wbXBfbGluazsKLQkJcmV0dXJuICZhcC0+bGluazsKLQl9CisJQlVHX09OKG1vZGUgIT0gQVRBX0xJVEVSX0VER0UgJiYKKwkgICAgICAgbW9kZSAhPSBBVEFfTElURVJfUE1QX0ZJUlNUICYmIG1vZGUgIT0gQVRBX0xJVEVSX0hPU1RfRklSU1QpOwogCi0JLyogd2UganVzdCBpdGVyYXRlZCBvdmVyIHRoZSBob3N0IG1hc3RlciBsaW5rLCB3aGF0J3MgbmV4dD8gKi8KLQlpZiAobGluayA9PSAmYXAtPmxpbmspIHsKLQkJaWYgKCFzYXRhX3BtcF9hdHRhY2hlZChhcCkpIHsKLQkJCWlmICh1bmxpa2VseShhcC0+c2xhdmVfbGluaykgJiYgIWRldl9vbmx5KQorCS8qIE5VTEwgbGluayBpbmRpY2F0ZXMgc3RhcnQgb2YgaXRlcmF0aW9uICovCisJaWYgKCFsaW5rKQorCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBBVEFfTElURVJfRURHRToKKwkJY2FzZSBBVEFfTElURVJfUE1QX0ZJUlNUOgorCQkJaWYgKHNhdGFfcG1wX2F0dGFjaGVkKGFwKSkKKwkJCQlyZXR1cm4gYXAtPnBtcF9saW5rOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgQVRBX0xJVEVSX0hPU1RfRklSU1Q6CisJCQlyZXR1cm4gJmFwLT5saW5rOworCQl9CisKKwkvKiB3ZSBqdXN0IGl0ZXJhdGVkIG92ZXIgdGhlIGhvc3QgbGluaywgd2hhdCdzIG5leHQ/ICovCisJaWYgKGxpbmsgPT0gJmFwLT5saW5rKQorCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBBVEFfTElURVJfSE9TVF9GSVJTVDoKKwkJCWlmIChzYXRhX3BtcF9hdHRhY2hlZChhcCkpCisJCQkJcmV0dXJuIGFwLT5wbXBfbGluazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFUQV9MSVRFUl9QTVBfRklSU1Q6CisJCQlpZiAodW5saWtlbHkoYXAtPnNsYXZlX2xpbmspKQogCQkJCXJldHVybiBhcC0+c2xhdmVfbGluazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFUQV9MSVRFUl9FREdFOgogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcmV0dXJuIGFwLT5wbXBfbGluazsKLQl9CiAKIAkvKiBzbGF2ZV9saW5rIGV4Y2x1ZGVzIFBNUCAqLwogCWlmICh1bmxpa2VseShsaW5rID09IGFwLT5zbGF2ZV9saW5rKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQkvKiBpdGVyYXRlIHRvIHRoZSBuZXh0IFBNUCBsaW5rICovCisJLyogd2Ugd2VyZSBvdmVyIGEgUE1QIGxpbmsgKi8KIAlpZiAoKytsaW5rIDwgYXAtPnBtcF9saW5rICsgYXAtPm5yX3BtcF9saW5rcykKIAkJcmV0dXJuIGxpbms7CisKKwlpZiAobW9kZSA9PSBBVEFfTElURVJfUE1QX0ZJUlNUKQorCQlyZXR1cm4gJmFwLT5saW5rOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgorICoJYXRhX2Rldl9uZXh0IC0gZGV2aWNlIGl0ZXJhdGlvbiBoZWxwZXIKKyAqCUBkZXY6IHRoZSBwcmV2aW91cyBkZXZpY2UsIE5VTEwgdG8gc3RhcnQKKyAqCUBsaW5rOiBBVEEgbGluayBjb250YWluaW5nIGRldmljZXMgdG8gaXRlcmF0ZQorICoJQG1vZGU6IGl0ZXJhdGlvbiBtb2RlLCBvbmUgb2YgQVRBX0RJVEVSXyoKKyAqCisgKglMT0NLSU5HOgorICoJSG9zdCBsb2NrIG9yIEVIIGNvbnRleHQuCisgKgorICoJUkVUVVJOUzoKKyAqCVBvaW50ZXIgdG8gdGhlIG5leHQgZGV2aWNlLgorICovCitzdHJ1Y3QgYXRhX2RldmljZSAqYXRhX2Rldl9uZXh0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCQllbnVtIGF0YV9kZXZfaXRlcl9tb2RlIG1vZGUpCit7CisJQlVHX09OKG1vZGUgIT0gQVRBX0RJVEVSX0VOQUJMRUQgJiYgbW9kZSAhPSBBVEFfRElURVJfRU5BQkxFRF9SRVZFUlNFICYmCisJICAgICAgIG1vZGUgIT0gQVRBX0RJVEVSX0FMTCAmJiBtb2RlICE9IEFUQV9ESVRFUl9BTExfUkVWRVJTRSk7CisKKwkvKiBOVUxMIGRldiBpbmRpY2F0ZXMgc3RhcnQgb2YgaXRlcmF0aW9uICovCisJaWYgKCFkZXYpCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIEFUQV9ESVRFUl9FTkFCTEVEOgorCQljYXNlIEFUQV9ESVRFUl9BTEw6CisJCQlkZXYgPSBsaW5rLT5kZXZpY2U7CisJCQlnb3RvIGNoZWNrOworCQljYXNlIEFUQV9ESVRFUl9FTkFCTEVEX1JFVkVSU0U6CisJCWNhc2UgQVRBX0RJVEVSX0FMTF9SRVZFUlNFOgorCQkJZGV2ID0gbGluay0+ZGV2aWNlICsgYXRhX2xpbmtfbWF4X2RldmljZXMobGluaykgLSAxOworCQkJZ290byBjaGVjazsKKwkJfQorCisgbmV4dDoKKwkvKiBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQVRBX0RJVEVSX0VOQUJMRUQ6CisJY2FzZSBBVEFfRElURVJfQUxMOgorCQlpZiAoKytkZXYgPCBsaW5rLT5kZXZpY2UgKyBhdGFfbGlua19tYXhfZGV2aWNlcyhsaW5rKSkKKwkJCWdvdG8gY2hlY2s7CisJCXJldHVybiBOVUxMOworCWNhc2UgQVRBX0RJVEVSX0VOQUJMRURfUkVWRVJTRToKKwljYXNlIEFUQV9ESVRFUl9BTExfUkVWRVJTRToKKwkJaWYgKC0tZGV2ID49IGxpbmstPmRldmljZSkKKwkJCWdvdG8gY2hlY2s7CisJCXJldHVybiBOVUxMOworCX0KKworIGNoZWNrOgorCWlmICgobW9kZSA9PSBBVEFfRElURVJfRU5BQkxFRCB8fCBtb2RlID09IEFUQV9ESVRFUl9FTkFCTEVEX1JFVkVSU0UpICYmCisJICAgICFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKKwkJZ290byBuZXh0OworCXJldHVybiBkZXY7Cit9CisKKy8qKgogICoJYXRhX2Rldl9waHlzX2xpbmsgLSBmaW5kIHBoeXNpY2FsIGxpbmsgZm9yIGEgZGV2aWNlCiAgKglAZGV2OiBBVEEgZGV2aWNlIHRvIGxvb2sgdXAgcGh5c2ljYWwgbGluayBmb3IKICAqCkBAIC0xMTA3LDggKzExODMsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgewogCQlhcCA9IGhvc3QtPnBvcnRzW2ldOwotCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7Ci0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKQorCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgRURHRSkgeworCQkJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkKIAkJCQlhdGFfZGV2X2Rpc2FibGVfcG0oZGV2KTsKIAkJfQogCX0KQEAgLTI1OTQsMTEgKzI2NzAsMTEgQEAKIAogCWF0YV9wb3J0X3Byb2JlKGFwKTsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBBTEwpCiAJCXRyaWVzW2Rldi0+ZGV2bm9dID0gQVRBX1BST0JFX01BWF9UUklFUzsKIAogIHJldHJ5OgotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmssIEFMTCkgewogCQkvKiBJZiB3ZSBpc3N1ZSBhbiBTUlNUIHRoZW4gYW4gQVRBIGRyaXZlIChub3QgQVRBUEkpCiAJCSAqIG1heSBjaGFuZ2UgY29uZmlndXJhdGlvbiBhbmQgYmUgaW4gUElPMCB0aW1pbmcuIElmCiAJCSAqIHdlIGRvIGEgaGFyZCByZXNldCAob3IgYXJlIGNvbWluZyBmcm9tIHBvd2VyIG9uKQpAQCAtMjYyMCw3ICsyNjk2LDcgQEAKIAkvKiByZXNldCBhbmQgZGV0ZXJtaW5lIGRldmljZSBjbGFzc2VzICovCiAJYXAtPm9wcy0+cGh5X3Jlc2V0KGFwKTsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmssIEFMTCkgewogCQlpZiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkgJiYKIAkJICAgIGRldi0+Y2xhc3MgIT0gQVRBX0RFVl9VTktOT1dOKQogCQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IGRldi0+Y2xhc3M7CkBAIC0yNjM2LDcgKzI3MTIsNyBAQAogCSAgIHNwZWNpZmljIHNlcXVlbmNlIGJhc3MtYWNrd2FyZHMgc28gdGhhdCBQRElBRy0gaXMgcmVsZWFzZWQgYnkKIAkgICB0aGUgc2xhdmUgZGV2aWNlICovCiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXZfcmV2ZXJzZShkZXYsICZhcC0+bGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmssIEFMTF9SRVZFUlNFKSB7CiAJCWlmICh0cmllc1tkZXYtPmRldm5vXSkKIAkJCWRldi0+Y2xhc3MgPSBjbGFzc2VzW2Rldi0+ZGV2bm9dOwogCkBAIC0yNjUzLDI0ICsyNzI5LDE5IEBACiAJaWYgKGFwLT5vcHMtPmNhYmxlX2RldGVjdCkKIAkJYXAtPmNibCA9IGFwLT5vcHMtPmNhYmxlX2RldGVjdChhcCk7CiAKLQkvKiBXZSBtYXkgaGF2ZSBTQVRBIGJyaWRnZSBnbHVlIGhpZGluZyBoZXJlIGlycmVzcGVjdGl2ZSBvZiB0aGUKLQkgICByZXBvcnRlZCBjYWJsZSB0eXBlcyBhbmQgc2Vuc2VkIHR5cGVzICovCi0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rKSB7Ci0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCi0JCQljb250aW51ZTsKLQkJLyogU0FUQSBkcml2ZXMgaW5kaWNhdGUgd2UgaGF2ZSBhIGJyaWRnZS4gV2UgZG9uJ3Qga25vdyB3aGljaAotCQkgICBlbmQgb2YgdGhlIGxpbmsgdGhlIGJyaWRnZSBpcyB3aGljaCBpcyBhIHByb2JsZW0gKi8KKwkvKiBXZSBtYXkgaGF2ZSBTQVRBIGJyaWRnZSBnbHVlIGhpZGluZyBoZXJlIGlycmVzcGVjdGl2ZSBvZgorCSAqIHRoZSByZXBvcnRlZCBjYWJsZSB0eXBlcyBhbmQgc2Vuc2VkIHR5cGVzLiAgV2hlbiBTQVRBCisJICogZHJpdmVzIGluZGljYXRlIHdlIGhhdmUgYSBicmlkZ2UsIHdlIGRvbid0IGtub3cgd2hpY2ggZW5kCisJICogb2YgdGhlIGxpbmsgdGhlIGJyaWRnZSBpcyB3aGljaCBpcyBhIHByb2JsZW0uCisJICovCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKIAkJaWYgKGF0YV9pZF9pc19zYXRhKGRldi0+aWQpKQogCQkJYXAtPmNibCA9IEFUQV9DQkxfU0FUQTsKLQl9CiAKIAkvKiBBZnRlciB0aGUgaWRlbnRpZnkgc2VxdWVuY2Ugd2UgY2FuIG5vdyBzZXQgdXAgdGhlIGRldmljZXMuIFdlIGRvCiAJICAgdGhpcyBpbiB0aGUgbm9ybWFsIG9yZGVyIHNvIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBnZXQgY29uZnVzZWQgKi8KIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykgewotCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKQotCQkJY29udGludWU7Ci0KKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBFTkFCTEVEKSB7CiAJCWFwLT5saW5rLmVoX2NvbnRleHQuaS5mbGFncyB8PSBBVEFfRUhJX1BSSU5USU5GTzsKIAkJcmMgPSBhdGFfZGV2X2NvbmZpZ3VyZShkZXYpOwogCQlhcC0+bGluay5laF9jb250ZXh0LmkuZmxhZ3MgJj0gfkFUQV9FSElfUFJJTlRJTkZPOwpAQCAtMjY4Myw5ICsyNzU0LDggQEAKIAlpZiAocmMpCiAJCWdvdG8gZmFpbDsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykKLQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKQotCQkJcmV0dXJuIDA7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgRU5BQkxFRCkKKwkJcmV0dXJuIDA7CiAKIAkvKiBubyBkZXZpY2UgcHJlc2VudCwgZGlzYWJsZSBwb3J0ICovCiAJYXRhX3BvcnRfZGlzYWJsZShhcCk7CkBAIC0zMzMxLDEzICszNDAxLDEwIEBACiAJaW50IHJjID0gMCwgdXNlZF9kbWEgPSAwLCBmb3VuZCA9IDA7CiAKIAkvKiBzdGVwIDE6IGNhbGN1bGF0ZSB4ZmVyX21hc2sgKi8KLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJdW5zaWduZWQgbG9uZyBwaW9fbWFzaywgZG1hX21hc2s7CiAJCXVuc2lnbmVkIGludCBtb2RlX21hc2s7CiAKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKLQkJCWNvbnRpbnVlOwotCiAJCW1vZGVfbWFzayA9IEFUQV9ETUFfTUFTS19BVEE7CiAJCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBUEkpCiAJCQltb2RlX21hc2sgPSBBVEFfRE1BX01BU0tfQVRBUEk7CkBAIC0zMzY2LDEwICszNDMzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBzdGVwIDI6IGFsd2F5cyBzZXQgaG9zdCBQSU8gdGltaW5ncyAqLwotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKLQkJCWNvbnRpbnVlOwotCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJaWYgKGRldi0+cGlvX21vZGUgPT0gMHhmZikgewogCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJubyBQSU8gc3VwcG9ydFxuIik7CiAJCQlyYyA9IC1FSU5WQUw7CkBAIC0zMzgzLDggKzM0NDcsOCBAQAogCX0KIAogCS8qIHN0ZXAgMzogc2V0IGhvc3QgRE1BIHRpbWluZ3MgKi8KLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7Ci0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgIWF0YV9kbWFfZW5hYmxlZChkZXYpKQorCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CisJCWlmICghYXRhX2RtYV9lbmFibGVkKGRldikpCiAJCQljb250aW51ZTsKIAogCQlkZXYtPnhmZXJfbW9kZSA9IGRldi0+ZG1hX21vZGU7CkBAIC0zMzk0LDExICszNDU4LDcgQEAKIAl9CiAKIAkvKiBzdGVwIDQ6IHVwZGF0ZSBkZXZpY2VzJyB4ZmVyIG1vZGUgKi8KLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7Ci0JCS8qIGRvbid0IHVwZGF0ZSBzdXNwZW5kZWQgZGV2aWNlcycgeGZlciBtb2RlICovCi0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCi0JCQljb250aW51ZTsKLQorCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CiAJCXJjID0gYXRhX2Rldl9zZXRfbW9kZShkZXYpOwogCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKQEAgLTQwNDgsNiArNDEwOCw3IEBACiAJeyAiTWF4dG9yIDdWMzAwRjAiLAkiVkExMTE2MzAiLAlBVEFfSE9SS0FHRV9OT05DUSB9LAogCXsgIlNUMzgwODE3QVMiLAkJIjMuNDIiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfSwKIAl7ICJTVDMxNjAwMjNBUyIsCSIzLjQyIiwJCUFUQV9IT1JLQUdFX05PTkNRIH0sCisJeyAiT0NaIENPUkVfU1NEIiwJIjAyLjEwMTA0IiwJQVRBX0hPUktBR0VfTk9OQ1EgfSwKIAogCS8qIFNlYWdhdGUgTkNRICsgRkxVU0ggQ0FDSEUgZmlybXdhcmUgYnVnICovCiAJeyAiU1QzMTUwMDM0MUFTIiwJIlNEMTUiLAkJQVRBX0hPUktBR0VfTk9OQ1EgfApAQCAtNDI2Myw5ICs0MzI0LDkgQEAKIAkgKiAtIGlmIHlvdSBoYXZlIGEgbm9uIGRldGVjdCBjYXBhYmxlIGRyaXZlIHlvdSBkb24ndCB3YW50IGl0CiAJICogICB0byBjb2xvdXIgdGhlIGNob2ljZQogCSAqLwotCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKLQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgewotCQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpICYmICFhdGFfaXNfNDB3aXJlKGRldikpCisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKKwkJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKKwkJCWlmICghYXRhX2lzXzQwd2lyZShkZXYpKQogCQkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDY3Miw3ICs0NzMzLDYgQEAKIC8qKgogICoJYXRhX3FjX25ld19pbml0IC0gUmVxdWVzdCBhbiBhdmFpbGFibGUgQVRBIGNvbW1hbmQsIGFuZCBpbml0aWFsaXplIGl0CiAgKglAZGV2OiBEZXZpY2UgZnJvbSB3aG9tIHdlIHJlcXVlc3QgYW4gYXZhaWxhYmxlIGNvbW1hbmQgc3RydWN0dXJlCi0gKglAdGFnOiBjb21tYW5kIHRhZwogICoKICAqCUxPQ0tJTkc6CiAgKglOb25lLgpAQCAtNTIxOCw3ICs1Mjc4LDcgQEAKIAkJfQogCiAJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX1BNX1BFTkRJTkc7Ci0JCV9fYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgSE9TVF9GSVJTVCkgewogCQkJbGluay0+ZWhfaW5mby5hY3Rpb24gfD0gYWN0aW9uOwogCQkJbGluay0+ZWhfaW5mby5mbGFncyB8PSBlaGlfZmxhZ3M7CiAJCX0KQEAgLTYwNDcsOCArNjEwNyw2IEBACiBzdGF0aWMgdm9pZCBhdGFfcG9ydF9kZXRhY2goc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdGFfbGluayAqbGluazsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCiAJaWYgKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQogCQlnb3RvIHNraXBfZWg7CkBAIC02MDU2LDI4ICs2MTE0LDE1IEBACiAJLyogdGVsbCBFSCB3ZSdyZSBsZWF2aW5nICYgZmx1c2ggRUggKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwogCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX1VOTE9BRElORzsKKwlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCisJLyogd2FpdCB0aWxsIEVIIGNvbW1pdHMgc3VpY2lkZSAqLwogCWF0YV9wb3J0X3dhaXRfZWgoYXApOwogCi0JLyogRUggaXMgbm93IGd1YXJhbnRlZWQgdG8gc2VlIFVOTE9BRElORyAtIEVIIGNvbnRleHQgYmVsb25ncwotCSAqIHRvIHVzLiAgUmVzdG9yZSBTQ29udHJvbCBhbmQgZGlzYWJsZSBhbGwgZXhpc3RpbmcgZGV2aWNlcy4KLQkgKi8KLQlfX2F0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKLQkJc2F0YV9zY3Jfd3JpdGUobGluaywgU0NSX0NPTlRST0wsIGxpbmstPnNhdmVkX3Njb250cm9sICYgMHhmZjApOwotCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKQotCQkJYXRhX2Rldl9kaXNhYmxlKGRldik7Ci0JfQorCS8qIGl0IGJldHRlciBiZSBkZWFkIG5vdyAqLworCVdBUk5fT04oIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX1VOTE9BREVEKSk7CiAKLQkvKiBGaW5hbCBmcmVlemUgJiBFSC4gIEFsbCBpbi1mbGlnaHQgY29tbWFuZHMgYXJlIGFib3J0ZWQuICBFSAotCSAqIHdpbGwgYmUgc2tpcHBlZCBhbmQgcmV0cmlhbHMgd2lsbCBiZSB0ZXJtaW5hdGVkIHdpdGggYmFkCi0JICogdGFyZ2V0LgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0JYXRhX3BvcnRfZnJlZXplKGFwKTsJLyogd29uJ3QgYmUgdGhhd2VkICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwotCi0JYXRhX3BvcnRfd2FpdF9laChhcCk7CiAJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmYXAtPmhvdHBsdWdfdGFzayk7CiAKICBza2lwX2VoOgpAQCAtNjUyOCw3ICs2NTczLDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfcG9ydF9vcHMpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2R1bW15X3BvcnRfb3BzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kdW1teV9wb3J0X2luZm8pOwotRVhQT1JUX1NZTUJPTF9HUEwoX19hdGFfcG9ydF9uZXh0X2xpbmspOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2xpbmtfbmV4dCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X25leHQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9iaW9zX3BhcmFtKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X2luaXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2hvc3RfYWxsb2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCAzMmRhOWE5Li44MTQ3YTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtNDIyLDcgKzQyMiw3IEBACiAKIAlpZiAoIWRldikgewogCQllaGktPmFjdGlvbiAmPSB+YWN0aW9uOwotCQlhdGFfbGlua19mb3JfZWFjaF9kZXYodGRldiwgbGluaykKKwkJYXRhX2Zvcl9lYWNoX2Rldih0ZGV2LCBsaW5rLCBBTEwpCiAJCQllaGktPmRldl9hY3Rpb25bdGRldi0+ZGV2bm9dICY9IH5hY3Rpb247CiAJfSBlbHNlIHsKIAkJLyogZG9lc24ndCBtYWtlIHNlbnNlIGZvciBwb3J0LXdpZGUgRUggYWN0aW9ucyAqLwpAQCAtNDMwLDcgKzQzMCw3IEBACiAKIAkJLyogYnJlYWsgZWhpLT5hY3Rpb24gaW50byBlaGktPmRldl9hY3Rpb24gKi8KIAkJaWYgKGVoaS0+YWN0aW9uICYgYWN0aW9uKSB7Ci0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYodGRldiwgbGluaykKKwkJCWF0YV9mb3JfZWFjaF9kZXYodGRldiwgbGluaywgQUxMKQogCQkJCWVoaS0+ZGV2X2FjdGlvblt0ZGV2LT5kZXZub10gfD0KIAkJCQkJZWhpLT5hY3Rpb24gJiBhY3Rpb247CiAJCQllaGktPmFjdGlvbiAmPSB+YWN0aW9uOwpAQCAtNDkxLDYgKzQ5MSwzMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGF0YV9laF91bmxvYWQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUmVzdG9yZSBTQ29udHJvbCBJUE0gYW5kIFNQRCBmb3IgdGhlIG5leHQgZHJpdmVyIGFuZAorCSAqIGRpc2FibGUgYXR0YWNoZWQgZGV2aWNlcy4KKwkgKi8KKwlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgUE1QX0ZJUlNUKSB7CisJCXNhdGFfc2NyX3dyaXRlKGxpbmssIFNDUl9DT05UUk9MLCBsaW5rLT5zYXZlZF9zY29udHJvbCAmIDB4ZmYwKTsKKwkJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkKKwkJCWF0YV9kZXZfZGlzYWJsZShkZXYpOworCX0KKworCS8qIGZyZWV6ZSBhbmQgc2V0IFVOTE9BREVEICovCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCWF0YV9wb3J0X2ZyZWV6ZShhcCk7CQkJLyogd29uJ3QgYmUgdGhhd2VkICovCisJYXAtPnBmbGFncyAmPSB+QVRBX1BGTEFHX0VIX1BFTkRJTkc7CS8qIGNsZWFyIHBlbmRpbmcgZnJvbSBmcmVlemUgKi8KKwlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19VTkxPQURFRDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKK30KKwogLyoqCiAgKglhdGFfc2NzaV9lcnJvciAtIFNDU0kgbGF5ZXIgZXJyb3IgaGFuZGxlciBjYWxsYmFjawogICoJQGhvc3Q6IFNDU0kgaG9zdCBvbiB3aGljaCBlcnJvciBvY2N1cnJlZApAQCAtNTkyLDcgKzYxNyw3IEBACiAJCS8qIGZldGNoICYgY2xlYXIgRUggaW5mbyAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwogCi0JCV9fYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgSE9TVF9GSVJTVCkgewogCQkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKIAkJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKQEAgLTYwMCwxMiArNjI1LDkgQEAKIAkJCWxpbmstPmVoX2NvbnRleHQuaSA9IGxpbmstPmVoX2luZm87CiAJCQltZW1zZXQoJmxpbmstPmVoX2luZm8sIDAsIHNpemVvZihsaW5rLT5laF9pbmZvKSk7CiAKLQkJCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKKwkJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CiAJCQkJaW50IGRldm5vID0gZGV2LT5kZXZubzsKIAotCQkJCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCi0JCQkJCWNvbnRpbnVlOwotCiAJCQkJZWhjLT5zYXZlZF94ZmVyX21vZGVbZGV2bm9dID0gZGV2LT54ZmVyX21vZGU7CiAJCQkJaWYgKGF0YV9uY3FfZW5hYmxlZChkZXYpKQogCQkJCQllaGMtPnNhdmVkX25jcV9lbmFibGVkIHw9IDEgPDwgZGV2bm87CkBAIC02MjEsOCArNjQzLDEzIEBACiAJCS8qIGludm9rZSBFSCwgc2tpcCBpZiB1bmxvYWRpbmcgb3Igc3VzcGVuZGVkICovCiAJCWlmICghKGFwLT5wZmxhZ3MgJiAoQVRBX1BGTEFHX1VOTE9BRElORyB8IEFUQV9QRkxBR19TVVNQRU5ERUQpKSkKIAkJCWFwLT5vcHMtPmVycm9yX2hhbmRsZXIoYXApOwotCQllbHNlCisJCWVsc2UgeworCQkJLyogaWYgdW5sb2FkaW5nLCBjb21tZW5jZSBzdWljaWRlICovCisJCQlpZiAoKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfVU5MT0FESU5HKSAmJgorCQkJICAgICEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19VTkxPQURFRCkpCisJCQkJYXRhX2VoX3VubG9hZChhcCk7CiAJCQlhdGFfZWhfZmluaXNoKGFwKTsKKwkJfQogCiAJCS8qIHByb2Nlc3MgcG9ydCBzdXNwZW5kIHJlcXVlc3QgKi8KIAkJYXRhX2VoX2hhbmRsZV9wb3J0X3N1c3BlbmQoYXApOwpAQCAtNjQ0LDcgKzY3MSw3IEBACiAJCX0KIAogCQkvKiB0aGlzIHJ1biBpcyBjb21wbGV0ZSwgbWFrZSBzdXJlIEVIIGluZm8gaXMgY2xlYXIgKi8KLQkJX19hdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKQorCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgSE9TVF9GSVJTVCkKIAkJCW1lbXNldCgmbGluay0+ZWhfaW5mbywgMCwgc2l6ZW9mKGxpbmstPmVoX2luZm8pKTsKIAogCQkvKiBDbGVhciBob3N0X2VoX3NjaGVkdWxlZCB3aGlsZSBob2xkaW5nIGFwLT5sb2NrIHN1Y2gKQEAgLTEwMjUsNyArMTA1Miw3IEBACiAJCXN0cnVjdCBhdGFfbGluayAqbGluazsKIAogCQkvKiBjaGVjayBhbmQgbm90aWZ5IEFUQVBJIEFOICovCi0JCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKKwkJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJCWlmICghKHNudGYgJiAoMSA8PCBsaW5rLT5wbXApKSkKIAkJCQljb250aW51ZTsKIApAQCAtMjAwNSw3ICsyMDMyLDcgQEAKIHsKIAlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CiAKLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKQorCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKQogCQlhdGFfZWhfbGlua19hdXRvcHN5KGxpbmspOwogCiAJLyogSGFuZGxlIHRoZSBmcmlnZ2luZyBzbGF2ZSBsaW5rLiAgQXV0b3BzeSBpcyBkb25lIHNpbWlsYXJseQpAQCAtMjIxOSw3ICsyMjQ2LDcgQEAKIHsKIAlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CiAKLQlfX2F0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApCisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEhPU1RfRklSU1QpCiAJCWF0YV9laF9saW5rX3JlcG9ydChsaW5rKTsKIH0KIApAQCAtMjIzMCw3ICsyMjU3LDcgQEAKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCiAJaWYgKGNsZWFyX2NsYXNzZXMpCi0JCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspCisJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpCiAJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9VTktOT1dOOwogCiAJcmV0dXJuIHJlc2V0KGxpbmssIGNsYXNzZXMsIGRlYWRsaW5lKTsKQEAgLTIyOTQsNyArMjMyMSw3IEBACiAKIAlhdGFfZWhfYWJvdXRfdG9fZG8obGluaywgTlVMTCwgQVRBX0VIX1JFU0VUKTsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCS8qIElmIHdlIGlzc3VlIGFuIFNSU1QgdGhlbiBhbiBBVEEgZHJpdmUgKG5vdCBBVEFQSSkKIAkJICogbWF5IGNoYW5nZSBjb25maWd1cmF0aW9uIGFuZCBiZSBpbiBQSU8wIHRpbWluZy4gSWYKIAkJICogd2UgZG8gYSBoYXJkIHJlc2V0IChvciBhcmUgY29taW5nIGZyb20gcG93ZXIgb24pCkBAIC0yMzU1LDcgKzIzODIsNyBAQAogCQkJCQkJInBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIik7CiAJCQkJZWhjLT5pLmFjdGlvbiAmPSB+QVRBX0VIX1JFU0VUOwogCi0JCQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKKwkJCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKQogCQkJCQljbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9OT05FOwogCiAJCQkJcmMgPSAwOwpAQCAtMjM2OSw3ICsyMzk2LDcgQEAKIAkJICogYmFuZyBjbGFzc2VzIGFuZCByZXR1cm4uCiAJCSAqLwogCQlpZiAocmVzZXQgJiYgIShlaGMtPmkuYWN0aW9uICYgQVRBX0VIX1JFU0VUKSkgewotCQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKKwkJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpCiAJCQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IEFUQV9ERVZfTk9ORTsKIAkJCXJjID0gMDsKIAkJCWdvdG8gb3V0OwpAQCAtMjQ1NCw3ICsyNDgxLDcgQEAKIAkvKgogCSAqIFBvc3QtcmVzZXQgcHJvY2Vzc2luZwogCSAqLwotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCS8qIEFmdGVyIHRoZSByZXNldCwgdGhlIGRldmljZSBzdGF0ZSBpcyBQSU8gMCBhbmQgdGhlCiAJCSAqIGNvbnRyb2xsZXIgc3RhdGUgaXMgdW5kZWZpbmVkLiAgUmVzZXQgYWxzbyB3YWtlcyB1cAogCQkgKiBkcml2ZXMgZnJvbSBzbGVlcGluZyBtb2RlLgpAQCAtMjUxMCw3ICsyNTM3LDcgQEAKIAkgKiBjYW4gYmUgcmVsaWFibHkgZGV0ZWN0ZWQgYW5kIHJldHJpZWQuCiAJICovCiAJbnJfdW5rbm93biA9IDA7Ci0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpIHsKIAkJLyogY29udmVydCBhbGwgQVRBX0RFVl9VTktOT1dOIHRvIEFUQV9ERVZfTk9ORSAqLwogCQlpZiAoY2xhc3Nlc1tkZXYtPmRldm5vXSA9PSBBVEFfREVWX1VOS05PV04pIHsKIAkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CkBAIC0yNjE5LDggKzI2NDYsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAlJTklUX0NPTVBMRVRJT04oYXAtPnBhcmtfcmVxX3BlbmRpbmcpOwotCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKLQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CisJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpIHsKIAkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmxpbmstPmVoX2luZm87CiAKIAkJCWxpbmstPmVoX2NvbnRleHQuaS5kZXZfYWN0aW9uW2Rldi0+ZGV2bm9dIHw9CkBAIC0yNjc1LDcgKzI3MDIsNyBAQAogCSAqIGJlIGRvbmUgYmFja3dhcmRzIHN1Y2ggdGhhdCBQRElBRy0gaXMgcmVsZWFzZWQgYnkgdGhlIHNsYXZlCiAJICogZGV2aWNlIGJlZm9yZSB0aGUgbWFzdGVyIGRldmljZSBpcyBpZGVudGlmaWVkLgogCSAqLwotCWF0YV9saW5rX2Zvcl9lYWNoX2Rldl9yZXZlcnNlKGRldiwgbGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTExfUkVWRVJTRSkgewogCQl1bnNpZ25lZCBpbnQgYWN0aW9uID0gYXRhX2VoX2Rldl9hY3Rpb24oZGV2KTsKIAkJdW5zaWduZWQgaW50IHJlYWRpZF9mbGFncyA9IDA7CiAKQEAgLTI3NDQsNyArMjc3MSw3IEBACiAJLyogQ29uZmlndXJlIG5ldyBkZXZpY2VzIGZvcndhcmQgc3VjaCB0aGF0IHVzZXIgZG9lc24ndCBzZWUKIAkgKiBkZXZpY2UgZGV0ZWN0aW9uIG1lc3NhZ2VzIGJhY2t3YXJkcy4KIAkgKi8KLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewogCQlpZiAoIShuZXdfbWFzayAmICgxIDw8IGRldi0+ZGV2bm8pKSB8fAogCQkgICAgZGV2LT5jbGFzcyA9PSBBVEFfREVWX1BNUCkKIAkJCWNvbnRpbnVlOwpAQCAtMjc5MywxMCArMjgyMCw3IEBACiAJaW50IHJjOwogCiAJLyogaWYgZGF0YSB0cmFuc2ZlciBpcyB2ZXJpZmllZCwgY2xlYXIgRFVCSU9VU19YRkVSIG9uIGVyaW5nIHRvcCAqLwotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKLQkJCWNvbnRpbnVlOwotCisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJaWYgKCEoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19EVUJJT1VTX1hGRVIpKSB7CiAJCQlzdHJ1Y3QgYXRhX2VyaW5nX2VudHJ5ICplbnQ7CiAKQEAgLTI4MTMsMTQgKzI4MzcsMTEgQEAKIAkJcmMgPSBhdGFfZG9fc2V0X21vZGUobGluaywgcl9mYWlsZWRfZGV2KTsKIAogCS8qIGlmIHRyYW5zZmVyIG1vZGUgaGFzIGNoYW5nZWQsIHNldCBEVUJJT1VTX1hGRVIgb24gZGV2aWNlICovCi0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CiAJCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmxpbmstPmVoX2NvbnRleHQ7CiAJCXU4IHNhdmVkX3hmZXJfbW9kZSA9IGVoYy0+c2F2ZWRfeGZlcl9tb2RlW2Rldi0+ZGV2bm9dOwogCQl1OCBzYXZlZF9uY3EgPSAhIShlaGMtPnNhdmVkX25jcV9lbmFibGVkICYgKDEgPDwgZGV2LT5kZXZubykpOwogCi0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCi0JCQljb250aW51ZTsKLQogCQlpZiAoZGV2LT54ZmVyX21vZGUgIT0gc2F2ZWRfeGZlcl9tb2RlIHx8CiAJCSAgICBhdGFfbmNxX2VuYWJsZWQoZGV2KSAhPSBzYXZlZF9uY3EpCiAJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19EVUJJT1VTX1hGRVI7CkBAIC0yODgxLDkgKzI5MDIsOCBAQAogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAJaW50IGNudCA9IDA7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKQotCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpCi0JCQljbnQrKzsKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgRU5BQkxFRCkKKwkJY250Kys7CiAJcmV0dXJuIGNudDsKIH0KIApAQCAtMjg5Miw3ICsyOTEyLDcgQEAKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCWludCBjbnQgPSAwOwogCi0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKQogCQlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX1VOS05PV04pCiAJCQljbnQrKzsKIAlyZXR1cm4gY250OwpAQCAtMjkxOCw3ICsyOTM4LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBza2lwIGlmIGNsYXNzIGNvZGVzIGZvciBhbGwgdmFjYW50IHNsb3RzIGFyZSBBVEFfREVWX05PTkUgKi8KLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewogCQlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX1VOS05PV04gJiYKIAkJICAgIGVoYy0+Y2xhc3Nlc1tkZXYtPmRldm5vXSAhPSBBVEFfREVWX05PTkUpCiAJCQlyZXR1cm4gMDsKQEAgLTMwMjYsNyArMzA0Niw3IEBACiAJRFBSSU5USygiRU5URVJcbiIpOwogCiAJLyogcHJlcCBmb3IgcmVjb3ZlcnkgKi8KLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKIAogCQkvKiByZS1lbmFibGUgbGluaz8gKi8KQEAgLTMwMzgsNyArMzA1OCw3IEBACiAJCQlhdGFfZWhfZG9uZShsaW5rLCBOVUxMLCBBVEFfRUhfRU5BQkxFX0xJTkspOwogCQl9CiAKLQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCQlpZiAobGluay0+ZmxhZ3MgJiBBVEFfTEZMQUdfTk9fUkVUUlkpCiAJCQkJZWhjLT50cmllc1tkZXYtPmRldm5vXSA9IDE7CiAJCQllbHNlCkBAIC0zMDY4LDE5ICszMDg4LDE5IEBACiAJCWdvdG8gb3V0OwogCiAJLyogcHJlcCBmb3IgRUggKi8KLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKIAogCQkvKiBza2lwIEVIIGlmIHBvc3NpYmxlLiAqLwogCQlpZiAoYXRhX2VoX3NraXBfcmVjb3ZlcnkobGluaykpCiAJCQllaGMtPmkuYWN0aW9uID0gMDsKIAotCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKQorCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKQogCQkJZWhjLT5jbGFzc2VzW2Rldi0+ZGV2bm9dID0gQVRBX0RFVl9VTktOT1dOOwogCX0KIAogCS8qIHJlc2V0ICovCi0JYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CiAJCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmxpbmstPmVoX2NvbnRleHQ7CiAKIAkJaWYgKCEoZWhjLT5pLmFjdGlvbiAmIEFUQV9FSF9SRVNFVCkpCkBAIC0zMTA1LDggKzMxMjUsOCBAQAogCQlhdGFfZWhfcHVsbF9wYXJrX2FjdGlvbihhcCk7CiAKIAkJZGVhZGxpbmUgPSBqaWZmaWVzOwotCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7Ci0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CisJCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCQkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKIAkJCQl1bnNpZ25lZCBsb25nIHRtcDsKIApAQCAtMzEzNCw4ICszMTU0LDggQEAKIAkJZGVhZGxpbmUgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFwLT5wYXJrX3JlcV9wZW5kaW5nLAogCQkJCQkJICAgICAgIGRlYWRsaW5lIC0gbm93KTsKIAl9IHdoaWxlIChkZWFkbGluZSk7Ci0JYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgewotCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKKwkJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewogCQkJaWYgKCEobGluay0+ZWhfY29udGV4dC51bmxvYWRlZF9tYXNrICYKIAkJCSAgICAgICgxIDw8IGRldi0+ZGV2bm8pKSkKIAkJCQljb250aW51ZTsKQEAgLTMxNDYsNyArMzE2Niw3IEBACiAJfQogCiAJLyogdGhlIHJlc3QgKi8KLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKIAogCQkvKiByZXZhbGlkYXRlIGV4aXN0aW5nIGRldmljZXMgYW5kIGF0dGFjaCBuZXcgb25lcyAqLwpAQCAtMzE3Miw3ICszMTkyLDcgQEAKIAkJICogZGlzcnVwdGluZyB0aGUgY3VycmVudCB1c2VycyBvZiB0aGUgZGV2aWNlLgogCQkgKi8KIAkJaWYgKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfRElEX1JFU0VUKSB7Ci0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgQUxMKSB7CiAJCQkJaWYgKGRldi0+Y2xhc3MgIT0gQVRBX0RFVl9BVEFQSSkKIAkJCQkJY29udGludWU7CiAJCQkJcmMgPSBhdGFwaV9laF9jbGVhcl91YShkZXYpOwpAQCAtMzE4Myw3ICszMjAzLDcgQEAKIAogCQkvKiBjb25maWd1cmUgbGluayBwb3dlciBzYXZpbmcgKi8KIAkJaWYgKGVoYy0+aS5hY3Rpb24gJiBBVEFfRUhfTFBNKQotCQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKKwkJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBBTEwpCiAJCQkJYXRhX2Rldl9lbmFibGVfcG0oZGV2LCBhcC0+cG1fcG9saWN5KTsKIAogCQkvKiB0aGlzIGxpbmsgaXMgb2theSBub3cgKi8KQEAgLTMyODgsNyArMzMwOCw3IEBACiAJcmMgPSBhdGFfZWhfcmVjb3ZlcihhcCwgcHJlcmVzZXQsIHNvZnRyZXNldCwgaGFyZHJlc2V0LCBwb3N0cmVzZXQsCiAJCQkgICAgTlVMTCk7CiAJaWYgKHJjKSB7Ci0JCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaykKKwkJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgQUxMKQogCQkJYXRhX2Rldl9kaXNhYmxlKGRldik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMKaW5kZXggYjY1ZGIzMC4uOThjYTA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXBtcC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1wbXAuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIAlpZiAodmVuZG9yID09IDB4MTA5NSAmJiBkZXZpZCA9PSAweDM3MjYpIHsKIAkJLyogc2lsMzcyNiBxdWlya3MgKi8KLQkJYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgeworCQlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgRURHRSkgewogCQkJLyogQ2xhc3MgY29kZSByZXBvcnQgaXMgdW5yZWxpYWJsZSBhbmQgU1JTVAogCQkJICogdGltZXMgb3V0IHVuZGVyIGNlcnRhaW4gY29uZmlndXJhdGlvbnMuCiAJCQkgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogCQl9CiAJfSBlbHNlIGlmICh2ZW5kb3IgPT0gMHgxMDk1ICYmIGRldmlkID09IDB4NDcyMykgewogCQkvKiBzaWw0NzIzIHF1aXJrcyAqLwotCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CiAJCQkvKiBjbGFzcyBjb2RlIHJlcG9ydCBpcyB1bnJlbGlhYmxlICovCiAJCQlpZiAobGluay0+cG1wIDwgMikKIAkJCQlsaW5rLT5mbGFncyB8PSBBVEFfTEZMQUdfQVNTVU1FX0FUQTsKQEAgLTM0OCw3ICszNDgsNyBAQAogCQl9CiAJfSBlbHNlIGlmICh2ZW5kb3IgPT0gMHgxMDk1ICYmIGRldmlkID09IDB4NDcyNikgewogCQkvKiBzaWw0NzI2IHF1aXJrcyAqLwotCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CiAJCQkvKiBDbGFzcyBjb2RlIHJlcG9ydCBpcyB1bnJlbGlhYmxlIGFuZCBTUlNUCiAJCQkgKiB0aW1lcyBvdXQgdW5kZXIgY2VydGFpbiBjb25maWd1cmF0aW9ucy4KIAkJCSAqIENvbmZpZyBkZXZpY2UgY2FuIGJlIGF0IHBvcnQgMCBvciA1IGFuZApAQCAtNDUwLDcgKzQ1MCw3IEBACiAJaWYgKGFwLT5vcHMtPnBtcF9hdHRhY2gpCiAJCWFwLT5vcHMtPnBtcF9hdHRhY2goYXApOwogCi0JYXRhX3BvcnRfZm9yX2VhY2hfbGluayh0bGluaywgYXApCisJYXRhX2Zvcl9lYWNoX2xpbmsodGxpbmssIGFwLCBFREdFKQogCQlzYXRhX2xpbmtfaW5pdF9zcGQodGxpbmspOwogCiAJYXRhX2FjcGlfYXNzb2NpYXRlX3NhdGFfcG9ydChhcCk7CkBAIC00ODcsNyArNDg3LDcgQEAKIAlpZiAoYXAtPm9wcy0+cG1wX2RldGFjaCkKIAkJYXAtPm9wcy0+cG1wX2RldGFjaChhcCk7CiAKLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKHRsaW5rLCBhcCkKKwlhdGFfZm9yX2VhY2hfbGluayh0bGluaywgYXAsIEVER0UpCiAJCWF0YV9laF9kZXRhY2hfZGV2KHRsaW5rLT5kZXZpY2UpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKQEAgLTcwMCw3ICs3MDAsNyBAQAogCQl9CiAKIAkJLyogUE1QIGlzIHJlc2V0LCBTRXJyb3JzIGNhbm5vdCBiZSB0cnVzdGVkLCBzY2FuIGFsbCAqLwotCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKHRsaW5rLCBhcCkgeworCQlhdGFfZm9yX2VhY2hfbGluayh0bGluaywgYXAsIEVER0UpIHsKIAkJCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJnRsaW5rLT5laF9jb250ZXh0OwogCiAJCQllaGMtPmkucHJvYmVfbWFzayB8PSBBVEFfQUxMX0RFVklDRVM7CkBAIC03NjgsNyArNzY4LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAKLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJaWYgKCEobGluay0+ZmxhZ3MgJiBBVEFfTEZMQUdfRElTQUJMRUQpKQogCQkJY29udGludWU7CiAKQEAgLTg1Miw3ICs4NTIsNyBAQAogCWludCBjbnQsIHJjOwogCiAJcG1wX3RyaWVzID0gQVRBX0VIX1BNUF9UUklFUzsKLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKQorCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKQogCQlsaW5rX3RyaWVzW2xpbmstPnBtcF0gPSBBVEFfRUhfUE1QX0xJTktfVFJJRVM7CiAKICByZXRyeToKQEAgLTg2MSw3ICs4NjEsNyBAQAogCQlyYyA9IGF0YV9laF9yZWNvdmVyKGFwLCBvcHMtPnByZXJlc2V0LCBvcHMtPnNvZnRyZXNldCwKIAkJCQkgICAgb3BzLT5oYXJkcmVzZXQsIG9wcy0+cG9zdHJlc2V0LCBOVUxMKTsKIAkJaWYgKHJjKSB7Ci0JCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCAmYXAtPmxpbmspCisJCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBBTEwpCiAJCQkJYXRhX2Rldl9kaXNhYmxlKGRldik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KQEAgLTg3MCw3ICs4NzAsNyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJLyogbmV3IFBNUCBvbmxpbmUgKi8KLQkJYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkKKwkJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpCiAJCQlsaW5rX3RyaWVzW2xpbmstPnBtcF0gPSBBVEFfRUhfUE1QX0xJTktfVFJJRVM7CiAKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC05NDIsNyArOTQyLDcgQEAKIAl9CiAKIAljbnQgPSAwOwotCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKKwlhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgRURHRSkgewogCQlpZiAoIShnc2NyX2Vycm9yICYgKDEgPDwgbGluay0+cG1wKSkpCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggNDdjN2FmYy4uNDA0MGQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkvKiBHb29kIHZhbHVlcyBmb3IgdGltZW91dCBhbmQgcmV0cmllcz8gIFZhbHVlcyBiZWxvdwogCSAgIGZyb20gc2NzaV9pb2N0bF9zZW5kX2NvbW1hbmQoKSBmb3IgZGVmYXVsdCBjYXNlLi4uICovCiAJY21kX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZShzY3NpZGV2LCBzY3NpX2NtZCwgZGF0YV9kaXIsIGFyZ2J1ZiwgYXJnc2l6ZSwKLQkJCQkgIHNlbnNlYnVmLCAoMTAqSFopLCA1LCAwKTsKKwkJCQkgIHNlbnNlYnVmLCAoMTAqSFopLCA1LCAwLCBOVUxMKTsKIAogCWlmIChkcml2ZXJfYnl0ZShjbWRfcmVzdWx0KSA9PSBEUklWRVJfU0VOU0UpIHsvKiBzZW5zZSBkYXRhIGF2YWlsYWJsZSAqLwogCQl1OCAqZGVzYyA9IHNlbnNlYnVmICsgODsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCS8qIEdvb2QgdmFsdWVzIGZvciB0aW1lb3V0IGFuZCByZXRyaWVzPyAgVmFsdWVzIGJlbG93CiAJICAgZnJvbSBzY3NpX2lvY3RsX3NlbmRfY29tbWFuZCgpIGZvciBkZWZhdWx0IGNhc2UuLi4gKi8KIAljbWRfcmVzdWx0ID0gc2NzaV9leGVjdXRlKHNjc2lkZXYsIHNjc2lfY21kLCBETUFfTk9ORSwgTlVMTCwgMCwKLQkJCQlzZW5zZWJ1ZiwgKDEwKkhaKSwgNSwgMCk7CisJCQkJc2Vuc2VidWYsICgxMCpIWiksIDUsIDAsIE5VTEwpOwogCiAJaWYgKGRyaXZlcl9ieXRlKGNtZF9yZXN1bHQpID09IERSSVZFUl9TRU5TRSkgey8qIHNlbnNlIGRhdGEgYXZhaWxhYmxlICovCiAJCXU4ICpkZXNjID0gc2Vuc2VidWYgKyA4OwpAQCAtMzIyOSwxMiArMzIyOSwxMiBAQAogCQlyZXR1cm47CiAKICByZXBlYXQ6Ci0JYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgewotCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKKwkJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKIAkJCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAkJCWludCBjaGFubmVsID0gMCwgaWQgPSAwOwogCi0JCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpIHx8IGRldi0+c2RldikKKwkJCWlmIChkZXYtPnNkZXYpCiAJCQkJY29udGludWU7CiAKIAkJCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKQpAQCAtMzI1NSw5ICszMjU1LDkgQEAKIAkgKiBmYWlsdXJlIG9jY3VycmVkLCBzY2FuIHdvdWxkIGhhdmUgZmFpbGVkIHNpbGVudGx5LiAgQ2hlY2sKIAkgKiB3aGV0aGVyIGFsbCBkZXZpY2VzIGFyZSBhdHRhY2hlZC4KIAkgKi8KLQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7Ci0JCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiAhZGV2LT5zZGV2KQorCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CisJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CisJCQlpZiAoIWRldi0+c2RldikKIAkJCQlnb3RvIGV4aXRfbG9vcDsKIAkJfQogCX0KQEAgLTMzODEsNyArMzM4MSw3IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWlmICghKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfREVUQUNIRUQpKQpAQCAtMzQ5Niw3ICszNDk2LDcgQEAKIAlpZiAoZGV2bm8gPT0gU0NBTl9XSUxEX0NBUkQpIHsKIAkJc3RydWN0IGF0YV9saW5rICpsaW5rOwogCi0JCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKKwkJYXRhX2Zvcl9lYWNoX2xpbmsobGluaywgYXAsIEVER0UpIHsKIAkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmxpbmstPmVoX2luZm87CiAJCQllaGktPnByb2JlX21hc2sgfD0gQVRBX0FMTF9ERVZJQ0VTOwogCQkJZWhpLT5hY3Rpb24gfD0gQVRBX0VIX1JFU0VUOwpAQCAtMzU0NCwxMSArMzU0NCwxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAotCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKLQkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCWF0YV9mb3JfZWFjaF9saW5rKGxpbmssIGFwLCBFREdFKSB7CisJCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CiAJCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBkZXYtPnNkZXY7CiAKLQkJCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgIXNkZXYpCisJCQlpZiAoIXNkZXYpCiAJCQkJY29udGludWU7CiAJCQlpZiAoc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKQogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9iZjU0eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9iZjU0eC5jCmluZGV4IDEyNjY5MjQuLjEwNTBmZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYmY1NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2JmNTR4LmMKQEAgLTM1Niw3ICszNTYsNiBAQAogICoJYmZpbl9zZXRfZG1hbW9kZSAtIEluaXRpYWxpemUgaG9zdCBjb250cm9sbGVyIFBBVEEgRE1BIHRpbWluZ3MKICAqCUBhcDogUG9ydCB3aG9zZSB0aW1pbmdzIHdlIGFyZSBjb25maWd1cmluZwogICoJQGFkZXY6IHVtCi0gKglAdWRtYTogdWRtYSBtb2RlLCAwIC0gNgogICoKICAqCVNldCBVRE1BIG1vZGUgZm9yIGRldmljZS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwppbmRleCA4NjBlZGU1Li5mODI4YTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKQEAgLTQ2NSwyNCArNDY1LDIyIEBACiB7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7Ci0JCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLwotCQkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7Ci0JCQlkZXYtPmRtYV9tb2RlID0gWEZFUl9NV19ETUFfMDsKLQkJCS8qIFdlIGRvIG5lZWQgdGhlIHJpZ2h0IG1vZGUgaW5mb3JtYXRpb24gZm9yIERNQSBvciBQSU8KLQkJCSAgIGFuZCB0aGlzIGNvbWVzIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmbGFncyAqLwotCQkJaWYgKGF0YV9pZF9oYXNfZG1hKGRldi0+aWQpKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBETUFcbiIpOwotCQkJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9NV19ETUFfMDsKLQkJCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfTVdETUE7Ci0JCQkJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX1BJTzsKLQkJCX0gZWxzZSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU9cbiIpOwotCQkJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKLQkJCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwotCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKLQkJCX0KKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgRU5BQkxFRCkgeworCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLworCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKKwkJZGV2LT5kbWFfbW9kZSA9IFhGRVJfTVdfRE1BXzA7CisJCS8qIFdlIGRvIG5lZWQgdGhlIHJpZ2h0IG1vZGUgaW5mb3JtYXRpb24gZm9yIERNQSBvciBQSU8KKwkJICAgYW5kIHRoaXMgY29tZXMgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGZsYWdzICovCisJCWlmIChhdGFfaWRfaGFzX2RtYShkZXYtPmlkKSkgeworCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBETUFcbiIpOworCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX01XX0RNQV8wOworCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX01XRE1BOworCQkJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX1BJTzsKKwkJfSBlbHNlIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKKwkJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKKwkJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87CisJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87CiAJCX0KIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYwppbmRleCAyMDE0MjUzLi5iMTczYzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMKQEAgLTMwLDE0ICszMCwxMiBAQAogewogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7Ci0JCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSkgewotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU8wXG4iKTsKLQkJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwotCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwotCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKLQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKLQkJfQorCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPMFxuIik7CisJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOworCQlkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7CisJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87CisJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwppbmRleCA5MzBjMjIwLi42YzFkNzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKQEAgLTE5NCwxNSArMTk0LDEyIEBACiB7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCQkJCSJjb25maWd1cmVkIGZvciBQSU9cbiIpOwotCQkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7Ci0JCQlkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7Ci0JCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwotCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOwotCQl9CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU9cbiIpOworCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKKwkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOworCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOworCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjQxLDcgKzYzOCw2IEBACiAgKglxZGk2NTgwZHBfc2V0X3Bpb21vZGUJCS0JUElPIHNldHVwIGZvciBkdWFsIGNoYW5uZWwKICAqCUBhcDogUG9ydAogICoJQGFkZXY6IERldmljZQotICoJQGlycTogaW50ZXJydXB0IGxpbmUKICAqCiAgKglJbiBkdWFsIGNoYW5uZWwgbW9kZSB0aGUgNjU4MCBoYXMgb25lIGNsb2NrIHBlciBjaGFubmVsIGFuZCB3ZSBoYXZlCiAgKgl0byBzb2Z0d2FyZSBjbG9ja3N3aXRjaCBpbiBxY19pc3N1ZS4KQEAgLTEwMjgsNyArMTAyNCw3IEBACiAJLyogTm90aGluZyBmb3VuZCBtZWFucyB3ZSBkcm9wIHRoZSBwb3J0IGFzIGl0cyBwcm9iYWJseSBub3QgdGhlcmUgKi8KIAogCXJldCA9IC1FTk9ERVY7Ci0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsICZhcC0+bGluaywgQUxMKSB7CiAJCWlmICghYXRhX2Rldl9hYnNlbnQoZGV2KSkgewogCQkJbGVnYWN5X2hvc3RbcHJvYmUtPnNsb3RdID0gaG9zdDsKIAkJCWxkLT5wbGF0Zm9ybV9kZXYgPSBwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwppbmRleCBjMGRiYzQ2Li4yYzFhOTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwpAQCAtMTE2LDcgKzExNiw2IEBACiAgKglvbGRwaWl4X3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBETUEgdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCiAgKglAYWRldjogRGV2aWNlIHRvIHByb2dyYW0KLSAqCUBpc2ljaDogVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGFuIElDSCBhbmQgaGFzIElPQ0ZHIHJlZ2lzdGVycwogICoKICAqCVNldCBNV0RNQSBtb2RlIGZvciBkZXZpY2UsIGluIGhvc3QgY29udHJvbGxlciBQQ0kgY29uZmlnIHNwYWNlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYwppbmRleCAwZTFjMmMxLi5lOTRlZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCkBAIC0yODEsNyArMjgxLDYgQEAKICAqCXBkYzIwMjd4X3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHRvIGNvbmZpZ3VyZQogICoJQGFkZXY6IHVtCi0gKglAcGlvOiBQSU8gbW9kZSwgMCAtIDQKICAqCiAgKglTZXQgUElPIG1vZGUgZm9yIGRldmljZS4KICAqCkBAIC0zMjYsNyArMzI1LDYgQEAKICAqCXBkYzIwMjd4X3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBVRE1BIHRpbWluZ3MKICAqCUBhcDogUG9ydCB0byBjb25maWd1cmUKICAqCUBhZGV2OiB1bQotICoJQHVkbWE6IHVkbWEgbW9kZSwgWEZFUl9VRE1BXzAgdG8gWEZFUl9VRE1BXzYKICAqCiAgKglTZXQgVURNQSBtb2RlIGZvciBkZXZpY2UuCiAgKgpAQCAtNDA2LDIzICs0MDQsMjAgQEAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7Ci0JCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSkgeworCWF0YV9mb3JfZWFjaF9kZXYoZGV2LCBsaW5rLCBFTkFCTEVEKSB7CisJCXBkYzIwMjd4X3NldF9waW9tb2RlKGFwLCBkZXYpOwogCi0JCQlwZGMyMDI3eF9zZXRfcGlvbW9kZShhcCwgZGV2KTsKKwkJLyoKKwkJICogRW5hYmxlIHByZWZldGNoIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydCBQSU8gb25seS4KKwkJICovCisJCWlmIChkZXYtPnhmZXJfc2hpZnQgPT0gQVRBX1NISUZUX1BJTykgeworCQkJdTMyIGN0Y3IxID0gaW9yZWFkMzIoZGV2X21taW8oYXAsIGRldiwgUERDX0NUQ1IxKSk7CisJCQljdGNyMSB8PSAoMSA8PCAyNSk7CisJCQlpb3dyaXRlMzIoY3RjcjEsIGRldl9tbWlvKGFwLCBkZXYsIFBEQ19DVENSMSkpOwogCi0JCQkvKgotCQkJICogRW5hYmxlIHByZWZldGNoIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydCBQSU8gb25seS4KLQkJCSAqLwotCQkJaWYgKGRldi0+eGZlcl9zaGlmdCA9PSBBVEFfU0hJRlRfUElPKSB7Ci0JCQkJdTMyIGN0Y3IxID0gaW9yZWFkMzIoZGV2X21taW8oYXAsIGRldiwgUERDX0NUQ1IxKSk7Ci0JCQkJY3RjcjEgfD0gKDEgPDwgMjUpOwotCQkJCWlvd3JpdGUzMihjdGNyMSwgZGV2X21taW8oYXAsIGRldiwgUERDX0NUQ1IxKSk7Ci0KLQkJCQlQRFBSSU5USygiVHVybiBvbiBwcmVmZXRjaFxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXBkYzIwMjd4X3NldF9kbWFtb2RlKGFwLCBkZXYpOwotCQkJfQorCQkJUERQUklOVEsoIlR1cm4gb24gcHJlZmV0Y2hcbiIpOworCQl9IGVsc2UgeworCQkJcGRjMjAyN3hfc2V0X2RtYW1vZGUoYXAsIGRldik7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKaW5kZXggNzdlNGUzYi4uNmFmYTA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwpAQCAtMzQsMTQgKzM0LDEyIEBACiB7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7Ci0JCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLwotCQkJZGV2LT5waW9fbW9kZSA9IGRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKLQkJCWRldi0+eGZlcl9zaGlmdCA9IEFUQV9TSElGVF9QSU87Ci0JCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87Ci0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNvbmZpZ3VyZWQgZm9yIFBJT1xuIik7Ci0JCX0KKwlhdGFfZm9yX2VhY2hfZGV2KGRldiwgbGluaywgRU5BQkxFRCkgeworCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLworCQlkZXYtPnBpb19tb2RlID0gZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOworCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOworCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19QSU87CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCmluZGV4IDBiMGFhNDUuLjY5NWQ0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jCkBAIC04MSw3ICs4MSw2IEBACiAgKglyYWRpc3lzX3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBETUEgdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCiAgKglAYWRldjogRGV2aWNlIHRvIHByb2dyYW0KLSAqCUBpc2ljaDogVHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGFuIElDSCBhbmQgaGFzIElPQ0ZHIHJlZ2lzdGVycwogICoKICAqCVNldCBNV0RNQSBtb2RlIGZvciBkZXZpY2UsIGluIGhvc3QgY29udHJvbGxlciBQQ0kgY29uZmlnIHNwYWNlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCmluZGV4IDdkZmQxZjMuLjQ2ZDZiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwpAQCAtMzgsMTUgKzM4LDEzIEBACiB7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAotCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKLQkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7Ci0JCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLwotCQkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7Ci0JCQlkZXYtPnhmZXJfbW9kZSA9IFhGRVJfUElPXzA7Ci0JCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOwotCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOwotCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU9cbiIpOwotCQl9CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEVOQUJMRUQpIHsKKwkJLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgKi8KKwkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7CisJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKKwkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKKwkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNvbmZpZ3VyZWQgZm9yIFBJT1xuIik7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKaW5kZXggY2YzNzA3ZS4uZDQ0N2YxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCkBAIC0yMTAsNyArMjEwLDYgQEAKICAqCXNjY19zZXRfZG1hbW9kZSAtIEluaXRpYWxpemUgaG9zdCBjb250cm9sbGVyIFBBVEEgRE1BIHRpbWluZ3MKICAqCUBhcDogUG9ydCB3aG9zZSB0aW1pbmdzIHdlIGFyZSBjb25maWd1cmluZwogICoJQGFkZXY6IHVtCi0gKglAdWRtYTogdWRtYSBtb2RlLCAwIC0gNgogICoKICAqCVNldCBVRE1BIG1vZGUgZm9yIGRldmljZS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKaW5kZXggNzJlNDFjOS4uOGQyZmQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwpAQCAtMTM4LDcgKzEzOCw2IEBACiAvKioKICAqCXNlcnZlcndvcmtzX2NhYmxlX2RldGVjdAktCWNhYmxlIGRldGVjdGlvbgogICoJQGFwOiBBVEEgcG9ydAotICoJQGRlYWRsaW5lOiBkZWFkbGluZSBqaWZmaWVzIGZvciB0aGUgb3BlcmF0aW9uCiAgKgogICoJUGVyZm9ybSBjYWJsZSBkZXRlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgYW5kIHN1YnZlbmRvcgogICoJaWRlbnRpZmljYXRpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwppbmRleCBlNGJlNTVlLi4yN2NlYjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKQEAgLTExMiw3ICsxMTIsNiBAQAogLyoqCiAgKglzaXNfNjZfY2FibGVfZGV0ZWN0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgogICoJQGFwOiBQb3J0Ci0gKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KICAqCiAgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBvbiB0aGUgVURNQTY2LCBVRE1BMTAwIGFuZCBlYXJseSBVRE1BMTMzCiAgKglTaVMgSURFIGNvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCmluZGV4IDJiMjRhZTUuLjg2OTE4NjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCkBAIC0xODM2LDcgKzE4MzYsNiBAQAogLyoqCiAgKiAgICAgIG12X2Vycl9pbnRyIC0gSGFuZGxlIGVycm9yIGludGVycnVwdHMgb24gdGhlIHBvcnQKICAqICAgICAgQGFwOiBBVEEgY2hhbm5lbCB0byBtYW5pcHVsYXRlCi0gKiAgICAgIEBxYzogYWZmZWN0ZWQgY29tbWFuZCAobm9uLU5DUSksIG9yIE5VTEwKICAqCiAgKiAgICAgIE1vc3QgY2FzZXMgcmVxdWlyZSBhIGZ1bGwgcmVzZXQgb2YgdGhlIGNoaXAncyBzdGF0ZSBtYWNoaW5lLAogICogICAgICB3aGljaCBhbHNvIHBlcmZvcm1zIGEgQ09NUkVTRVQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCAwMzFkN2I3Li41NjRjMTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTQ2LDcgKzQ2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkic2F0YV9zaWwiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIyLjMiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIyLjQiCisKKyNkZWZpbmUgU0lMX0RNQV9CT1VOREFSWQkweDdmZmZmZmZmVUwKIAogZW51bSB7CiAJU0lMX01NSU9fQkFSCQk9IDUsCkBAIC0xMTgsNiArMTIwLDEwIEBACiBzdGF0aWMgaW50IHNpbF9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKIHN0YXRpYyBpbnQgc2lsX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBzaWxfc2V0X21vZGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkKTsKK3N0YXRpYyB2b2lkIHNpbF9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgc2lsX2JtZG1hX3NldHVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgc2lsX2JtZG1hX3N0YXJ0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgc2lsX2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdm9pZCBzaWxfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgc2lsX3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKQEAgLTE2NywxMyArMTczLDIyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzaWxfc2h0ID0gewotCUFUQV9CTURNQV9TSFQoRFJWX05BTUUpLAorCUFUQV9CQVNFX1NIVChEUlZfTkFNRSksCisJLyoqIFRoZXNlIGNvbnRyb2xsZXJzIHN1cHBvcnQgTGFyZ2UgQmxvY2sgVHJhbnNmZXIgd2hpY2ggYWxsb3dzCisJICAgIHRyYW5zZmVyIGNodW5rcyB1cCB0byAyR0IgYW5kIHdoaWNoIGNyb3NzIDY0S0IgYm91bmRhcmllcywKKwkgICAgdGhlcmVmb3JlIHRoZSBETUEgbGltaXRzIGFyZSBtb3JlIHJlbGF4ZWQgdGhhbiBzdGFuZGFyZCBBVEEgU0ZGLiAqLworCS5kbWFfYm91bmRhcnkJCT0gU0lMX0RNQV9CT1VOREFSWSwKKwkuc2dfdGFibGVzaXplCQk9IEFUQV9NQVhfUFJECiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2lsX29wcyA9IHsKIAkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKIAkuZGV2X2NvbmZpZwkJPSBzaWxfZGV2X2NvbmZpZywKIAkuc2V0X21vZGUJCT0gc2lsX3NldF9tb2RlLAorCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gc2lsX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gc2lsX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IHNpbF9ibWRtYV9zdG9wLAorCS5xY19wcmVwCQk9IHNpbF9xY19wcmVwLAogCS5mcmVlemUJCQk9IHNpbF9mcmVlemUsCiAJLnRoYXcJCQk9IHNpbF90aGF3LAogCS5zY3JfcmVhZAkJPSBzaWxfc2NyX3JlYWQsCkBAIC0yNDksNiArMjY0LDgzIEBACiBNT0RVTEVfUEFSTV9ERVNDKHNsb3dfZG93biwgIlNsZWRnZWhhbW1lciB1c2VkIHRvIHdvcmsgYXJvdW5kIHJhbmRvbSBwcm9ibGVtcywgYnkgbGltaXRpbmcgY29tbWFuZHMgdG8gMTUgc2VjdG9ycyAoMD1vZmYsIDE9b24pIik7CiAKIAorc3RhdGljIHZvaWQgc2lsX2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gYXAtPmhvc3QtPmlvbWFwW1NJTF9NTUlPX0JBUl07CisJdm9pZCBfX2lvbWVtICpibWRtYTIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFthcC0+cG9ydF9ub10uYm1kbWEyOworCisJLyogY2xlYXIgc3RhcnQvc3RvcCBiaXQgLSBjYW4gc2FmZWx5IGFsd2F5cyB3cml0ZSAwICovCisJaW93cml0ZTgoMCwgYm1kbWEyKTsKKworCS8qIG9uZS1QSU8tY3ljbGUgZ3VhcmFudGVlZCB3YWl0LCBwZXIgc3BlYywgZm9yIEhETUExOjAgdHJhbnNpdGlvbiAqLworCWF0YV9zZmZfZG1hX3BhdXNlKGFwKTsKK30KKworc3RhdGljIHZvaWQgc2lsX2JtZG1hX3NldHVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl2b2lkIF9faW9tZW0gKmJtZG1hID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCisJLyogbG9hZCBQUkQgdGFibGUgYWRkci4gKi8KKwlpb3dyaXRlMzIoYXAtPnByZF9kbWEsIGJtZG1hICsgQVRBX0RNQV9UQUJMRV9PRlMpOworCisJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KKwlhcC0+b3BzLT5zZmZfZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKK30KKworc3RhdGljIHZvaWQgc2lsX2JtZG1hX3N0YXJ0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJdW5zaWduZWQgaW50IHJ3ID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGFwLT5ob3N0LT5pb21hcFtTSUxfTU1JT19CQVJdOworCXZvaWQgX19pb21lbSAqYm1kbWEyID0gbW1pb19iYXNlICsgc2lsX3BvcnRbYXAtPnBvcnRfbm9dLmJtZG1hMjsKKwl1OCBkbWFjdGwgPSBBVEFfRE1BX1NUQVJUOworCisJLyogc2V0IHRyYW5zZmVyIGRpcmVjdGlvbiwgc3RhcnQgaG9zdCBETUEgdHJhbnNhY3Rpb24KKwkgICBOb3RlOiBGb3IgTGFyZ2UgQmxvY2sgVHJhbnNmZXIgdG8gd29yaywgdGhlIERNQSBtdXN0IGJlIHN0YXJ0ZWQKKwkgICB1c2luZyB0aGUgYm1kbWEyIHJlZ2lzdGVyLiAqLworCWlmICghcncpCisJCWRtYWN0bCB8PSBBVEFfRE1BX1dSOworCWlvd3JpdGU4KGRtYWN0bCwgYm1kbWEyKTsKK30KKworLyogVGhlIHdheSBHb2QgaW50ZW5kZWQgUENJIElERSBzY2F0dGVyL2dhdGhlciBsaXN0cyB0byBsb29rIGFuZCBiZWhhdmUuLi4gKi8KK3N0YXRpYyB2b2lkIHNpbF9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfcHJkICpwcmQsICpsYXN0X3ByZCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHNpOworCisJcHJkID0gJmFwLT5wcmRbMF07CisJZm9yX2VhY2hfc2cocWMtPnNnLCBzZywgcWMtPm5fZWxlbSwgc2kpIHsKKwkJLyogTm90ZSBoL3cgZG9lc24ndCBzdXBwb3J0IDY0LWJpdCwgc28gd2UgdW5jb25kaXRpb25hbGx5CisJCSAqIHRydW5jYXRlIGRtYV9hZGRyX3QgdG8gdTMyLgorCQkgKi8KKwkJdTMyIGFkZHIgPSAodTMyKSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCXUzMiBzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKworCQlwcmQtPmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJcHJkLT5mbGFnc19sZW4gPSBjcHVfdG9fbGUzMihzZ19sZW4pOworCQlWUFJJTlRLKCJQUkRbJXVdID0gKDB4JVgsIDB4JVgpXG4iLCBwaSwgYWRkciwgc2dfbGVuKTsKKworCQlsYXN0X3ByZCA9IHByZDsKKwkJcHJkKys7CisJfQorCisJaWYgKGxpa2VseShsYXN0X3ByZCkpCisJCWxhc3RfcHJkLT5mbGFnc19sZW4gfD0gY3B1X3RvX2xlMzIoQVRBX1BSRF9FT1QpOworfQorCitzdGF0aWMgdm9pZCBzaWxfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKSkKKwkJcmV0dXJuOworCisJc2lsX2ZpbGxfc2cocWMpOworfQorCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzaWxfZ2V0X2RldmljZV9jYWNoZV9saW5lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXU4IGNhY2hlX2xpbmUgPSAwOwpAQCAtMjc4LDcgKzM3MCw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIEFMTCkgewogCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKQogCQkJZGV2X21vZGVbZGV2LT5kZXZub10gPSAwOwkvKiBQSU8wLzEvMiAqLwogCQllbHNlIGlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCA5ZjdjNTQzLi4wMWU2OTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAogc3RhdGljIGludCBjY2lzc19yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIHN0YXRpYyBpbnQgcmVidWlsZF9sdW5fdGFibGUoY3Rscl9pbmZvX3QgKmgsIGludCBmaXJzdF90aW1lKTsKLXN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LAorc3RhdGljIGludCBkZXJlZ2lzdGVyX2Rpc2soY3Rscl9pbmZvX3QgKmgsIGludCBkcnZfaW5kZXgsCiAJCQkgICBpbnQgY2xlYXJfYWxsKTsKIAogc3RhdGljIHZvaWQgY2Npc3NfcmVhZF9jYXBhY2l0eShpbnQgY3RsciwgaW50IGxvZ3ZvbCwgaW50IHdpdGhpcnEsCkBAIC0yMTUsMzEgKzIxNSwxNyBAQAogLyoKICAqIEVucXVldWluZyBhbmQgZGVxdWV1aW5nIGZ1bmN0aW9ucyBmb3IgY21kbGlzdHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKENvbW1hbmRMaXN0X3N0cnVjdCAqKlFwdHIsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKHN0cnVjdCBobGlzdF9oZWFkICpsaXN0LCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpCiB7Ci0JaWYgKCpRcHRyID09IE5VTEwpIHsKLQkJKlFwdHIgPSBjOwotCQljLT5uZXh0ID0gYy0+cHJldiA9IGM7Ci0JfSBlbHNlIHsKLQkJYy0+cHJldiA9ICgqUXB0ciktPnByZXY7Ci0JCWMtPm5leHQgPSAoKlFwdHIpOwotCQkoKlFwdHIpLT5wcmV2LT5uZXh0ID0gYzsKLQkJKCpRcHRyKS0+cHJldiA9IGM7Ci0JfQorCWhsaXN0X2FkZF9oZWFkKCZjLT5saXN0LCBsaXN0KTsKIH0KIAotc3RhdGljIGlubGluZSBDb21tYW5kTGlzdF9zdHJ1Y3QgKnJlbW92ZVEoQ29tbWFuZExpc3Rfc3RydWN0ICoqUXB0ciwKLQkJCQkJICBDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlUShDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpCiB7Ci0JaWYgKGMgJiYgYy0+bmV4dCAhPSBjKSB7Ci0JCWlmICgqUXB0ciA9PSBjKQotCQkJKlFwdHIgPSBjLT5uZXh0OwotCQljLT5wcmV2LT5uZXh0ID0gYy0+bmV4dDsKLQkJYy0+bmV4dC0+cHJldiA9IGMtPnByZXY7Ci0JfSBlbHNlIHsKLQkJKlFwdHIgPSBOVUxMOwotCX0KLQlyZXR1cm4gYzsKKwlpZiAoV0FSTl9PTihobGlzdF91bmhhc2hlZCgmYy0+bGlzdCkpKQorCQlyZXR1cm47CisKKwlobGlzdF9kZWxfaW5pdCgmYy0+bGlzdCk7CiB9CiAKICNpbmNsdWRlICJjY2lzc19zY3NpLmMiCQkvKiBGb3IgU0NTSSB0YXBlIHN1cHBvcnQgKi8KQEAgLTUwNiw2ICs0OTIsNyBAQAogCQljLT5jbWRpbmRleCA9IGk7CiAJfQogCisJSU5JVF9ITElTVF9OT0RFKCZjLT5saXN0KTsKIAljLT5idXNhZGRyID0gKF9fdTMyKSBjbWRfZG1hX2hhbmRsZTsKIAl0ZW1wNjQudmFsID0gKF9fdTY0KSBlcnJfZG1hX2hhbmRsZTsKIAljLT5FcnJEZXNjLkFkZHIubG93ZXIgPSB0ZW1wNjQudmFsMzIubG93ZXI7CkBAIC0xNDkyLDggKzE0NzksNyBAQAogCQkgKiB3aGljaCBrZWVwcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZnJvbSBzdGFydGluZwogCQkgKiB0aGUgcXVldWUuCiAJCSAqLwotCQlyZXQgPSBkZXJlZ2lzdGVyX2Rpc2soaC0+Z2VuZGlza1tkcnZfaW5kZXhdLAotCQkJCSAgICAgICZoLT5kcnZbZHJ2X2luZGV4XSwgMCk7CisJCXJldCA9IGRlcmVnaXN0ZXJfZGlzayhoLCBkcnZfaW5kZXgsIDApOwogCQloLT5kcnZbZHJ2X2luZGV4XS5idXN5X2NvbmZpZ3VyaW5nID0gMDsKIAl9CiAKQEAgLTE3MTEsOCArMTY5Nyw3IEBACiAJCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CiAJCQloLT5kcnZbaV0uYnVzeV9jb25maWd1cmluZyA9IDE7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKLQkJCXJldHVybl9jb2RlID0gZGVyZWdpc3Rlcl9kaXNrKGgtPmdlbmRpc2tbaV0sCi0JCQkJJmgtPmRydltpXSwgMSk7CisJCQlyZXR1cm5fY29kZSA9IGRlcmVnaXN0ZXJfZGlzayhoLCBpLCAxKTsKIAkJCWgtPmRydltpXS5idXN5X2NvbmZpZ3VyaW5nID0gMDsKIAkJfQogCX0KQEAgLTE3ODIsMTUgKzE3NjcsMTkgQEAKICAqICAgICAgICAgICAgIHRoZSBoaWdoZXN0X2x1biBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQgYW5kIHRoZSBMdW5JRAogICogICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBjbGVhcmVkLgogKi8KLXN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LAorc3RhdGljIGludCBkZXJlZ2lzdGVyX2Rpc2soY3Rscl9pbmZvX3QgKmgsIGludCBkcnZfaW5kZXgsCiAJCQkgICBpbnQgY2xlYXJfYWxsKQogewogCWludCBpOwotCWN0bHJfaW5mb190ICpoID0gZ2V0X2hvc3QoZGlzayk7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydjsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCWRydiA9ICZoLT5kcnZbZHJ2X2luZGV4XTsKKwlkaXNrID0gaC0+Z2VuZGlza1tkcnZfaW5kZXhdOworCiAJLyogbWFrZSBzdXJlIGxvZ2ljYWwgdm9sdW1lIGlzIE5PVCBpcyB1c2UgKi8KIAlpZiAoY2xlYXJfYWxsIHx8IChoLT5nZW5kaXNrWzBdID09IGRpc2spKSB7CiAJCWlmIChkcnYtPnVzYWdlX2NvdW50ID4gMSkKQEAgLTI1NDgsNyArMjUzNyw4IEBACiB7CiAJQ29tbWFuZExpc3Rfc3RydWN0ICpjOwogCi0Jd2hpbGUgKChjID0gaC0+cmVxUSkgIT0gTlVMTCkgeworCXdoaWxlICghaGxpc3RfZW1wdHkoJmgtPnJlcVEpKSB7CisJCWMgPSBobGlzdF9lbnRyeShoLT5yZXFRLmZpcnN0LCBDb21tYW5kTGlzdF9zdHJ1Y3QsIGxpc3QpOwogCQkvKiBjYW4ndCBkbyBhbnl0aGluZyBpZiBmaWZvIGlzIGZ1bGwgKi8KIAkJaWYgKChoLT5hY2Nlc3MuZmlmb19mdWxsKGgpKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGZpZm8gZnVsbFxuIik7CkBAIC0yNTU2LDE0ICsyNTQ2LDE0IEBACiAJCX0KIAogCQkvKiBHZXQgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIFJlcXVlc3QgUSAqLwotCQlyZW1vdmVRKCYoaC0+cmVxUSksIGMpOworCQlyZW1vdmVRKGMpOwogCQloLT5RZGVwdGgtLTsKIAogCQkvKiBUZWxsIHRoZSBjb250cm9sbGVyIGV4ZWN1dGUgY29tbWFuZCAqLwogCQloLT5hY2Nlc3Muc3VibWl0X2NvbW1hbmQoaCwgYyk7CiAKIAkJLyogUHV0IGpvYiBvbnRvIHRoZSBjb21wbGV0ZWQgUSAqLwotCQlhZGRRKCYoaC0+Y21wUSksIGMpOworCQlhZGRRKCZoLT5jbXBRLCBjKTsKIAl9CiB9CiAKQEAgLTI1NzYsNyArMjU2Niw3IEBACiAJbWVtc2V0KGMtPmVycl9pbmZvLCAwLCBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCkpOwogCiAJLyogYWRkIGl0IHRvIHNvZnR3YXJlIHF1ZXVlIGFuZCB0aGVuIHNlbmQgaXQgdG8gdGhlIGNvbnRyb2xsZXIgKi8KLQlhZGRRKCYoaC0+cmVxUSksIGMpOworCWFkZFEoJmgtPnJlcVEsIGMpOwogCWgtPlFkZXB0aCsrOwogCWlmIChoLT5RZGVwdGggPiBoLT5tYXhRc2luY2Vpbml0KQogCQloLT5tYXhRc2luY2Vpbml0ID0gaC0+UWRlcHRoOwpAQCAtMjg5Nyw3ICsyODg3LDcgQEAKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKLQlhZGRRKCYoaC0+cmVxUSksIGMpOworCWFkZFEoJmgtPnJlcVEsIGMpOwogCWgtPlFkZXB0aCsrOwogCWlmIChoLT5RZGVwdGggPiBoLT5tYXhRc2luY2Vpbml0KQogCQloLT5tYXhRc2luY2Vpbml0ID0gaC0+UWRlcHRoOwpAQCAtMjk4NSwxNiArMjk3NSwxMiBAQAogCQkJCWEgPSBjLT5idXNhZGRyOwogCiAJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CisKIAkJCQlhICY9IH4zOwotCQkJCWlmICgoYyA9IGgtPmNtcFEpID09IE5VTEwpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkgICAgICAgImNjaXNzOiBDb21wbGV0aW9uIG9mICUwOHggaWdub3JlZFxuIiwKLQkJCQkJICAgICAgIGExKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXdoaWxlIChjLT5idXNhZGRyICE9IGEpIHsKLQkJCQkJYyA9IGMtPm5leHQ7Ci0JCQkJCWlmIChjID09IGgtPmNtcFEpCisJCQkJYyA9IE5VTEw7CisJCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoYywgdG1wLCAmaC0+Y21wUSwgbGlzdCkgeworCQkJCQlpZiAoYy0+YnVzYWRkciA9PSBhKQogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMzAwMiw4ICsyOTg4LDggQEAKIAkJCSAqIElmIHdlJ3ZlIGZvdW5kIHRoZSBjb21tYW5kLCB0YWtlIGl0IG9mZiB0aGUKIAkJCSAqIGNvbXBsZXRpb24gUSBhbmQgZnJlZSBpdAogCQkJICovCi0JCQlpZiAoYy0+YnVzYWRkciA9PSBhKSB7Ci0JCQkJcmVtb3ZlUSgmaC0+Y21wUSwgYyk7CisJCQlpZiAoYyAmJiBjLT5idXNhZGRyID09IGEpIHsKKwkJCQlyZW1vdmVRKGMpOwogCQkJCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfUldSRVEpIHsKIAkJCQkJY29tcGxldGVfY29tbWFuZChoLCBjLCAwKTsKIAkJCQl9IGVsc2UgaWYgKGMtPmNtZF90eXBlID09IENNRF9JT0NUTF9QRU5EKSB7CkBAIC0zNDIzLDYgKzM0MDksOCBAQAogCQlyZXR1cm4gLTE7CiAKIAloYmFbaV0tPmJ1c3lfaW5pdGlhbGl6aW5nID0gMTsKKwlJTklUX0hMSVNUX0hFQUQoJmhiYVtpXS0+Y21wUSk7CisJSU5JVF9ITElTVF9IRUFEKCZoYmFbaV0tPnJlcVEpOwogCiAJaWYgKGNjaXNzX3BjaV9pbml0KGhiYVtpXSwgcGRldikgIT0gMCkKIAkJZ290byBjbGVhbjE7CkBAIC0zNzMwLDE1ICszNzE4LDE3IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKGgtPnBkZXYpOwkvKiBNYWtlIHN1cmUgaXQgaXMgcmVhbGx5IGRlYWQuICovCiAKIAkvKiBtb3ZlIGV2ZXJ5dGhpbmcgb2ZmIHRoZSByZXF1ZXN0IHF1ZXVlIG9udG8gdGhlIGNvbXBsZXRlZCBxdWV1ZSAqLwotCXdoaWxlICgoYyA9IGgtPnJlcVEpICE9IE5VTEwpIHsKLQkJcmVtb3ZlUSgmKGgtPnJlcVEpLCBjKTsKKwl3aGlsZSAoIWhsaXN0X2VtcHR5KCZoLT5yZXFRKSkgeworCQljID0gaGxpc3RfZW50cnkoaC0+cmVxUS5maXJzdCwgQ29tbWFuZExpc3Rfc3RydWN0LCBsaXN0KTsKKwkJcmVtb3ZlUShjKTsKIAkJaC0+UWRlcHRoLS07Ci0JCWFkZFEoJihoLT5jbXBRKSwgYyk7CisJCWFkZFEoJmgtPmNtcFEsIGMpOwogCX0KIAogCS8qIE5vdywgZmFpbCBldmVyeXRoaW5nIG9uIHRoZSBjb21wbGV0ZWQgcXVldWUgd2l0aCBhIEhXIGVycm9yICovCi0Jd2hpbGUgKChjID0gaC0+Y21wUSkgIT0gTlVMTCkgewotCQlyZW1vdmVRKCZoLT5jbXBRLCBjKTsKKwl3aGlsZSAoIWhsaXN0X2VtcHR5KCZoLT5jbXBRKSkgeworCQljID0gaGxpc3RfZW50cnkoaC0+Y21wUS5maXJzdCwgQ29tbWFuZExpc3Rfc3RydWN0LCBsaXN0KTsKKwkJcmVtb3ZlUShjKTsKIAkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPSBDTURfSEFSRFdBUkVfRVJSOwogCQlpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX1JXUkVRKSB7CiAJCQljb21wbGV0ZV9jb21tYW5kKGgsIGMsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5oIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCmluZGV4IDI0YTdlZmEuLjE1ZTJiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKQEAgLTg5LDggKzg5LDggQEAKIAlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3M7CiAKIAkvKiBxdWV1ZSBhbmQgcXVldWUgSW5mbyAqLyAKLQlDb21tYW5kTGlzdF9zdHJ1Y3QgKnJlcVE7Ci0JQ29tbWFuZExpc3Rfc3RydWN0ICAqY21wUTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCByZXFROworCXN0cnVjdCBobGlzdF9oZWFkIGNtcFE7CiAJdW5zaWduZWQgaW50IFFkZXB0aDsKIAl1bnNpZ25lZCBpbnQgbWF4UXNpbmNlaW5pdDsKIAl1bnNpZ25lZCBpbnQgbWF4U0c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oIGIvZHJpdmVycy9ibG9jay9jY2lzc19jbWQuaAppbmRleCA0M2JmNTU5Li4yNGUyMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmgKQEAgLTI2NSw4ICsyNjUsNyBAQAogICBpbnQJCQkgICBjdGxyOwogICBpbnQJCQkgICBjbWRfdHlwZTsgCiAgIGxvbmcJCQkgICBjbWRpbmRleDsKLSAgc3RydWN0IF9Db21tYW5kTGlzdF9zdHJ1Y3QgKnByZXY7Ci0gIHN0cnVjdCBfQ29tbWFuZExpc3Rfc3RydWN0ICpuZXh0OworICBzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwogICBzdHJ1Y3QgcmVxdWVzdCAqCSAgIHJxOwogICBzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdGluZzsKICAgaW50CSByZXRyeV9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggZmIwNmVkNi4uZWRiYWFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTYyNCwyMCArNjI0LDM4IEBACiB9CiAKIC8qCisgKiBIZWxwZXIgdG8gZmx1c2ggdGhlIElPcyBpbiBsb29wLCBidXQga2VlcGluZyBsb29wIHRocmVhZCBydW5uaW5nCisgKi8KK3N0YXRpYyBpbnQgbG9vcF9mbHVzaChzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvKQoreworCS8qIGxvb3Agbm90IHlldCBjb25maWd1cmVkLCBubyBydW5uaW5nIHRocmVhZCwgbm90aGluZyB0byBmbHVzaCAqLworCWlmICghbG8tPmxvX3RocmVhZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbG9vcF9zd2l0Y2gobG8sIE5VTEwpOworfQorCisvKgogICogRG8gdGhlIGFjdHVhbCBzd2l0Y2g7IGNhbGxlZCBmcm9tIHRoZSBCSU8gY29tcGxldGlvbiByb3V0aW5lCiAgKi8KIHN0YXRpYyB2b2lkIGRvX2xvb3Bfc3dpdGNoKHN0cnVjdCBsb29wX2RldmljZSAqbG8sIHN0cnVjdCBzd2l0Y2hfcmVxdWVzdCAqcCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHAtPmZpbGU7CiAJc3RydWN0IGZpbGUgKm9sZF9maWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAorCS8qIGlmIG5vIG5ldyBmaWxlLCBvbmx5IGZsdXNoIG9mIHF1ZXVlZCBiaW9zIHJlcXVlc3RlZCAqLworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG9sZF9maWxlLT5mX21hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2spOwogCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBmaWxlOwogCWxvLT5sb19ibG9ja3NpemUgPSBTX0lTQkxLKG1hcHBpbmctPmhvc3QtPmlfbW9kZSkgPwogCQltYXBwaW5nLT5ob3N0LT5pX2JkZXYtPmJkX2Jsb2NrX3NpemUgOiBQQUdFX1NJWkU7CiAJbG8tPm9sZF9nZnBfbWFzayA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZyk7CiAJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgbG8tPm9sZF9nZnBfbWFzayAmIH4oX19HRlBfSU98X19HRlBfRlMpKTsKK291dDoKIAljb21wbGV0ZSgmcC0+d2FpdCk7CiB9CiAKQEAgLTkwMSw2ICs5MTksNyBAQAogCiAJa3RocmVhZF9zdG9wKGxvLT5sb190aHJlYWQpOwogCisJbG8tPmxvX3F1ZXVlLT51bnBsdWdfZm4gPSBOVUxMOwogCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBOVUxMOwogCiAJbG9vcF9yZWxlYXNlX3hmZXIobG8pOwpAQCAtMTM0NSwxMSArMTM2NCwyNSBAQAogCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKLQktLWxvLT5sb19yZWZjbnQ7CiAKLQlpZiAoKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX0FVVE9DTEVBUikgJiYgIWxvLT5sb19yZWZjbnQpCisJaWYgKC0tbG8tPmxvX3JlZmNudCkKKwkJZ290byBvdXQ7CisKKwlpZiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfQVVUT0NMRUFSKSB7CisJCS8qCisJCSAqIEluIGF1dG9jbGVhciBtb2RlLCBzdG9wIHRoZSBsb29wIHRocmVhZAorCQkgKiBhbmQgcmVtb3ZlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgbGFzdCBjbG9zZS4KKwkJICovCiAJCWxvb3BfY2xyX2ZkKGxvLCBOVUxMKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPdGhlcndpc2Uga2VlcCB0aHJlYWQgKGlmIHJ1bm5pbmcpIGFuZCBjb25maWcsCisJCSAqIGJ1dCBmbHVzaCBwb3NzaWJsZSBvbmdvaW5nIGJpb3MgaW4gdGhyZWFkLgorCQkgKi8KKwkJbG9vcF9mbHVzaChsbyk7CisJfQogCitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggZDNhOTFjYS4uN2JjYzFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC03MjIsNyArNzIyLDYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBuYmRzX21heDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzaygxIDw8IHBhcnRfc2hpZnQpOwotCQllbGV2YXRvcl90ICpvbGRfZTsKIAkJaWYgKCFkaXNrKQogCQkJZ290byBvdXQ7CiAJCW5iZF9kZXZbaV0uZGlzayA9IGRpc2s7CkBAIC03MzYsMTEgKzczNSwxMCBAQAogCQkJcHV0X2Rpc2soZGlzayk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlvbGRfZSA9IGRpc2stPnF1ZXVlLT5lbGV2YXRvcjsKLQkJaWYgKGVsZXZhdG9yX2luaXQoZGlzay0+cXVldWUsICJkZWFkbGluZSIpID09IDAgfHwKLQkJCWVsZXZhdG9yX2luaXQoZGlzay0+cXVldWUsICJub29wIikgPT0gMCkgewotCQkJCWVsZXZhdG9yX2V4aXQob2xkX2UpOwotCQl9CisJCS8qCisJCSAqIFRlbGwgdGhlIGJsb2NrIGxheWVyIHRoYXQgd2UgYXJlIG5vdCBhIHJvdGF0aW9uYWwgZGV2aWNlCisJCSAqLworCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgZGlzay0+cXVldWUpOwogCX0KIAogCWlmIChyZWdpc3Rlcl9ibGtkZXYoTkJEX01BSk9SLCAibmJkIikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKaW5kZXggODVkNzlhMC4uNWQzNDc2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKQEAgLTYsNyArNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2Jsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKLSNkZWZpbmUgVklSVElPX01BWF9TRwkoMytNQVhfUEhZU19TRUdNRU5UUykKICNkZWZpbmUgUEFSVF9CSVRTIDQKIAogc3RhdGljIGludCBtYWpvciwgaW5kZXg7CkBAIC0yNiw4ICsyNSwxMSBAQAogCiAJbWVtcG9vbF90ICpwb29sOwogCisJLyogV2hhdCBob3N0IHRlbGxzIHVzLCBwbHVzIDIgZm9yIGhlYWRlciAmIHRhaWxlci4gKi8KKwl1bnNpZ25lZCBpbnQgc2dfZWxlbXM7CisKIAkvKiBTY2F0dGVybGlzdDogY2FuIGJlIHRvbyBiaWcgZm9yIHN0YWNrLiAqLwotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1tWSVJUSU9fTUFYX1NHXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbLypzZ19lbGVtcyovXTsKIH07CiAKIHN0cnVjdCB2aXJ0YmxrX3JlcQpAQCAtOTcsOCArOTksNiBAQAogCWlmIChibGtfYmFycmllcl9ycSh2YnItPnJlcSkpCiAJCXZici0+b3V0X2hkci50eXBlIHw9IFZJUlRJT19CTEtfVF9CQVJSSUVSOwogCi0JLyogVGhpcyBpbml0IGNvdWxkIGJlIGRvbmUgYXQgdmJsayBjcmVhdGlvbiB0aW1lICovCi0Jc2dfaW5pdF90YWJsZSh2YmxrLT5zZywgVklSVElPX01BWF9TRyk7CiAJc2dfc2V0X2J1ZigmdmJsay0+c2dbMF0sICZ2YnItPm91dF9oZHIsIHNpemVvZih2YnItPm91dF9oZHIpKTsKIAludW0gPSBibGtfcnFfbWFwX3NnKHEsIHZici0+cmVxLCB2YmxrLT5zZysxKTsKIAlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1tudW0rMV0sICZ2YnItPnN0YXR1cywgc2l6ZW9mKHZici0+c3RhdHVzKSk7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAogCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewogCQl2YmxrID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCUJVR19PTihyZXEtPm5yX3BoeXNfc2VnbWVudHMgPiBBUlJBWV9TSVpFKHZibGstPnNnKSk7CisJCUJVR19PTihyZXEtPm5yX3BoeXNfc2VnbWVudHMgKyAyID4gdmJsay0+c2dfZWxlbXMpOwogCiAJCS8qIElmIHRoaXMgcmVxdWVzdCBmYWlscywgc3RvcCBxdWV1ZSBhbmQgd2FpdCBmb3Igc29tZXRoaW5nIHRvCiAJCSAgIGZpbmlzaCB0byByZXN0YXJ0IGl0LiAqLwpAQCAtMTk2LDEyICsxOTYsMjIgQEAKIAlpbnQgZXJyOwogCXU2NCBjYXA7CiAJdTMyIHY7Ci0JdTMyIGJsa19zaXplOworCXUzMiBibGtfc2l6ZSwgc2dfZWxlbXM7CiAKIAlpZiAoaW5kZXhfdG9fbWlub3IoaW5kZXgpID49IDEgPDwgTUlOT1JCSVRTKQogCQlyZXR1cm4gLUVOT1NQQzsKIAotCXZkZXYtPnByaXYgPSB2YmxrID0ga21hbGxvYyhzaXplb2YoKnZibGspLCBHRlBfS0VSTkVMKTsKKwkvKiBXZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgc2VnbWVudHMgYmVmb3JlIHdlIGFsbG9jYXRlLiAqLworCWVyciA9IHZpcnRpb19jb25maWdfdmFsKHZkZXYsIFZJUlRJT19CTEtfRl9TRUdfTUFYLAorCQkJCW9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fYmxrX2NvbmZpZywgc2VnX21heCksCisJCQkJJnNnX2VsZW1zKTsKKwlpZiAoZXJyKQorCQlzZ19lbGVtcyA9IDE7CisKKwkvKiBXZSBuZWVkIGFuIGV4dHJhIHNnIGVsZW1lbnRzIGF0IGhlYWQgYW5kIHRhaWwuICovCisJc2dfZWxlbXMgKz0gMjsKKwl2ZGV2LT5wcml2ID0gdmJsayA9IGttYWxsb2Moc2l6ZW9mKCp2YmxrKSArCisJCQkJICAgIHNpemVvZih2YmxrLT5zZ1swXSkgKiBzZ19lbGVtcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2YmxrKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMjEwLDYgKzIyMCw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJnZibGstPnJlcXMpOwogCXNwaW5fbG9ja19pbml0KCZ2YmxrLT5sb2NrKTsKIAl2YmxrLT52ZGV2ID0gdmRldjsKKwl2YmxrLT5zZ19lbGVtcyA9IHNnX2VsZW1zOworCXNnX2luaXRfdGFibGUodmJsay0+c2csIHZibGstPnNnX2VsZW1zKTsKIAogCS8qIFdlIGV4cGVjdCBvbmUgdmlydHF1ZXVlLCBmb3Igb3V0cHV0LiAqLwogCXZibGstPnZxID0gdmRldi0+Y29uZmlnLT5maW5kX3ZxKHZkZXYsIDAsIGJsa19kb25lKTsKQEAgLTIzNyw2ICsyNDksOCBAQAogCQlnb3RvIG91dF9wdXRfZGlzazsKIAl9CiAKKwlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1ZJUlQsIHZibGstPmRpc2stPnF1ZXVlKTsKKwogCWlmIChpbmRleCA8IDI2KSB7CiAJCXNwcmludGYodmJsay0+ZGlzay0+ZGlza19uYW1lLCAidmQlYyIsICdhJyArIGluZGV4ICUgMjYpOwogCX0gZWxzZSBpZiAoaW5kZXggPCAoMjYgKyAxKSAqIDI2KSB7CkBAIC0yNzcsNiArMjkxLDEzIEBACiAJfQogCXNldF9jYXBhY2l0eSh2YmxrLT5kaXNrLCBjYXApOwogCisJLyogV2UgY2FuIGhhbmRsZSB3aGF0ZXZlciB0aGUgaG9zdCB0b2xkIHVzIHRvIGhhbmRsZS4gKi8KKwlibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHModmJsay0+ZGlzay0+cXVldWUsIHZibGstPnNnX2VsZW1zLTIpOworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHModmJsay0+ZGlzay0+cXVldWUsIHZibGstPnNnX2VsZW1zLTIpOworCisJLyogTm8gcmVhbCBzZWN0b3IgbGltaXQuICovCisJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHZibGstPmRpc2stPnF1ZXVlLCAtMVUpOworCiAJLyogSG9zdCBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IG1heGltdW0gc2VnbWVudCBzaXplIGFuZCBudW1iZXIgb2YKIAkgKiBzZWdtZW50cy4gKi8KIAllcnIgPSB2aXJ0aW9fY29uZmlnX3ZhbCh2ZGV2LCBWSVJUSU9fQkxLX0ZfU0laRV9NQVgsCkBAIC0yODQsMTIgKzMwNSw4IEBACiAJCQkJJnYpOwogCWlmICghZXJyKQogCQlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZSh2YmxrLT5kaXNrLT5xdWV1ZSwgdik7Ci0KLQllcnIgPSB2aXJ0aW9fY29uZmlnX3ZhbCh2ZGV2LCBWSVJUSU9fQkxLX0ZfU0VHX01BWCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcsIHNlZ19tYXgpLAotCQkJCSZ2KTsKLQlpZiAoIWVycikKLQkJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyh2YmxrLT5kaXNrLT5xdWV1ZSwgdik7CisJZWxzZQorCQlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZSh2YmxrLT5kaXNrLT5xdWV1ZSwgLTFVKTsKIAogCS8qIEhvc3QgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUgZGV2aWNlICovCiAJZXJyID0gdmlydGlvX2NvbmZpZ192YWwodmRldiwgVklSVElPX0JMS19GX0JMS19TSVpFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggMmQxOWYwYy4uOTE4ZWY3MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtMzM4LDE4ICszMzgsMTIgQEAKIHN0YXRpYyBpbnQgeGx2YmRfaW5pdF9ibGtfcXVldWUoc3RydWN0IGdlbmRpc2sgKmdkLCB1MTYgc2VjdG9yX3NpemUpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxOwotCWVsZXZhdG9yX3QgKm9sZF9lOwogCiAJcnEgPSBibGtfaW5pdF9xdWV1ZShkb19ibGtpZl9yZXF1ZXN0LCAmYmxraWZfaW9fbG9jayk7CiAJaWYgKHJxID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCW9sZF9lID0gcnEtPmVsZXZhdG9yOwotCWlmIChJU19FUlJfVkFMVUUoZWxldmF0b3JfaW5pdChycSwgIm5vb3AiKSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJibGtmcm9udDogU3dpdGNoIGVsZXZhdG9yIGZhaWxlZCwgdXNlIGRlZmF1bHRcbiIpOwotCWVsc2UKLQkJZWxldmF0b3JfZXhpdChvbGRfZSk7CisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19WSVJULCBycSk7CiAKIAkvKiBIYXJkIHNlY3RvciBzaXplIGFuZCBtYXggc2VjdG9ycyBpbXBlcnNvbmF0ZSB0aGUgZXF1aXYuIGhhcmR3YXJlLiAqLwogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHJxLCBzZWN0b3Jfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggN2QyZTkxYy4uY2NlYWNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMTcxMiwyOSArMTcxMiwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2ZF9yZWFkX3BoeXNpY2FsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBkdmRfc3RydWN0ICpzKQorc3RhdGljIGludCBkdmRfcmVhZF9waHlzaWNhbChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcywKKwkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyMV0sICpiYXNlOwogCXN0cnVjdCBkdmRfbGF5ZXIgKmxheWVyOwotCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CiAJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOwogCWludCByZXQsIGxheWVyX251bSA9IHMtPnBoeXNpY2FsLmxheWVyX251bTsKIAogCWlmIChsYXllcl9udW0gPj0gRFZEX0xBWUVSUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpbml0X2Nkcm9tX2NvbW1hbmQoJmNnYywgYnVmLCBzaXplb2YoYnVmKSwgQ0dDX0RBVEFfUkVBRCk7Ci0JY2djLmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKLQljZ2MuY21kWzZdID0gbGF5ZXJfbnVtOwotCWNnYy5jbWRbN10gPSBzLT50eXBlOwotCWNnYy5jbWRbOV0gPSBjZ2MuYnVmbGVuICYgMHhmZjsKKwlpbml0X2Nkcm9tX2NvbW1hbmQoY2djLCBidWYsIHNpemVvZihidWYpLCBDR0NfREFUQV9SRUFEKTsKKwljZ2MtPmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKKwljZ2MtPmNtZFs2XSA9IGxheWVyX251bTsKKwljZ2MtPmNtZFs3XSA9IHMtPnR5cGU7CisJY2djLT5jbWRbOV0gPSBjZ2MtPmJ1ZmxlbiAmIDB4ZmY7CiAKIAkvKgogCSAqIHJlZnJhaW4gZnJvbSByZXBvcnRpbmcgZXJyb3JzIG9uIG5vbi1leGlzdGluZyBsYXllcnMgKG1haW5seSkKIAkgKi8KLQljZ2MucXVpZXQgPSAxOworCWNnYy0+cXVpZXQgPSAxOwogCi0JaWYgKChyZXQgPSBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgJmNnYykpKQorCXJldCA9IGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCBjZ2MpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAliYXNlID0gJmJ1Zls0XTsKQEAgLTE3NjIsMjEgKzE3NjMsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdmRfcmVhZF9jb3B5cmlnaHQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGR2ZF9zdHJ1Y3QgKnMpCitzdGF0aWMgaW50IGR2ZF9yZWFkX2NvcHlyaWdodChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcywKKwkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKIHsKIAlpbnQgcmV0OwogCXVfY2hhciBidWZbOF07Ci0Jc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKIAlzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyAqY2RvID0gY2RpLT5vcHM7CiAKLQlpbml0X2Nkcm9tX2NvbW1hbmQoJmNnYywgYnVmLCBzaXplb2YoYnVmKSwgQ0dDX0RBVEFfUkVBRCk7Ci0JY2djLmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKLQljZ2MuY21kWzZdID0gcy0+Y29weXJpZ2h0LmxheWVyX251bTsKLQljZ2MuY21kWzddID0gcy0+dHlwZTsKLQljZ2MuY21kWzhdID0gY2djLmJ1ZmxlbiA+PiA4OwotCWNnYy5jbWRbOV0gPSBjZ2MuYnVmbGVuICYgMHhmZjsKKwlpbml0X2Nkcm9tX2NvbW1hbmQoY2djLCBidWYsIHNpemVvZihidWYpLCBDR0NfREFUQV9SRUFEKTsKKwljZ2MtPmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKKwljZ2MtPmNtZFs2XSA9IHMtPmNvcHlyaWdodC5sYXllcl9udW07CisJY2djLT5jbWRbN10gPSBzLT50eXBlOworCWNnYy0+Y21kWzhdID0gY2djLT5idWZsZW4gPj4gODsKKwljZ2MtPmNtZFs5XSA9IGNnYy0+YnVmbGVuICYgMHhmZjsKIAotCWlmICgocmV0ID0gY2RvLT5nZW5lcmljX3BhY2tldChjZGksICZjZ2MpKSkKKwlyZXQgPSBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgY2djKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcy0+Y29weXJpZ2h0LmNwc3QgPSBidWZbNF07CkBAIC0xNzg1LDc5ICsxNzg3LDg5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZkX3JlYWRfZGlzY2tleShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcykKK3N0YXRpYyBpbnQgZHZkX3JlYWRfZGlzY2tleShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcywKKwkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKIHsKIAlpbnQgcmV0LCBzaXplOwogCXVfY2hhciAqYnVmOwotCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CiAJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOwogCiAJc2l6ZSA9IHNpemVvZihzLT5kaXNja2V5LnZhbHVlKSArIDQ7CiAKLQlpZiAoKGJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbml0X2Nkcm9tX2NvbW1hbmQoJmNnYywgYnVmLCBzaXplLCBDR0NfREFUQV9SRUFEKTsKLQljZ2MuY21kWzBdID0gR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFOwotCWNnYy5jbWRbN10gPSBzLT50eXBlOwotCWNnYy5jbWRbOF0gPSBzaXplID4+IDg7Ci0JY2djLmNtZFs5XSA9IHNpemUgJiAweGZmOwotCWNnYy5jbWRbMTBdID0gcy0+ZGlzY2tleS5hZ2lkIDw8IDY7CisJaW5pdF9jZHJvbV9jb21tYW5kKGNnYywgYnVmLCBzaXplLCBDR0NfREFUQV9SRUFEKTsKKwljZ2MtPmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKKwljZ2MtPmNtZFs3XSA9IHMtPnR5cGU7CisJY2djLT5jbWRbOF0gPSBzaXplID4+IDg7CisJY2djLT5jbWRbOV0gPSBzaXplICYgMHhmZjsKKwljZ2MtPmNtZFsxMF0gPSBzLT5kaXNja2V5LmFnaWQgPDwgNjsKIAotCWlmICghKHJldCA9IGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCAmY2djKSkpCisJcmV0ID0gY2RvLT5nZW5lcmljX3BhY2tldChjZGksIGNnYyk7CisJaWYgKCFyZXQpCiAJCW1lbWNweShzLT5kaXNja2V5LnZhbHVlLCAmYnVmWzRdLCBzaXplb2Yocy0+ZGlzY2tleS52YWx1ZSkpOwogCiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGR2ZF9yZWFkX2JjYShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcykKK3N0YXRpYyBpbnQgZHZkX3JlYWRfYmNhKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBkdmRfc3RydWN0ICpzLAorCQkJc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MpCiB7Ci0JaW50IHJldDsKLQl1X2NoYXIgYnVmWzQgKyAxODhdOwotCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisJaW50IHJldCwgc2l6ZSA9IDQgKyAxODg7CisJdV9jaGFyICpidWY7CiAJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOwogCi0JaW5pdF9jZHJvbV9jb21tYW5kKCZjZ2MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIENHQ19EQVRBX1JFQUQpOwotCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX0RWRF9TVFJVQ1RVUkU7Ci0JY2djLmNtZFs3XSA9IHMtPnR5cGU7Ci0JY2djLmNtZFs5XSA9IGNnYy5idWZsZW4gJiAweGZmOworCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKChyZXQgPSBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgJmNnYykpKQotCQlyZXR1cm4gcmV0OworCWluaXRfY2Ryb21fY29tbWFuZChjZ2MsIGJ1Ziwgc2l6ZSwgQ0dDX0RBVEFfUkVBRCk7CisJY2djLT5jbWRbMF0gPSBHUENNRF9SRUFEX0RWRF9TVFJVQ1RVUkU7CisJY2djLT5jbWRbN10gPSBzLT50eXBlOworCWNnYy0+Y21kWzldID0gY2djLT5idWZsZW4gJiAweGZmOworCisJcmV0ID0gY2RvLT5nZW5lcmljX3BhY2tldChjZGksIGNnYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAlzLT5iY2EubGVuID0gYnVmWzBdIDw8IDggfCBidWZbMV07CiAJaWYgKHMtPmJjYS5sZW4gPCAxMiB8fCBzLT5iY2EubGVuID4gMTg4KSB7CiAJCWNkaW5mbyhDRF9XQVJOSU5HLCAiUmVjZWl2ZWQgaW52YWxpZCBCQ0EgbGVuZ3RoICglZClcbiIsIHMtPmJjYS5sZW4pOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQogCW1lbWNweShzLT5iY2EudmFsdWUsICZidWZbNF0sIHMtPmJjYS5sZW4pOwotCi0JcmV0dXJuIDA7CisJcmV0ID0gMDsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZHZkX3JlYWRfbWFudWZhY3Qoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGR2ZF9zdHJ1Y3QgKnMpCitzdGF0aWMgaW50IGR2ZF9yZWFkX21hbnVmYWN0KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBkdmRfc3RydWN0ICpzLAorCQkJCXN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQogewogCWludCByZXQgPSAwLCBzaXplOwogCXVfY2hhciAqYnVmOwotCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CiAJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOwogCiAJc2l6ZSA9IHNpemVvZihzLT5tYW51ZmFjdC52YWx1ZSkgKyA0OwogCi0JaWYgKChidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5pdF9jZHJvbV9jb21tYW5kKCZjZ2MsIGJ1Ziwgc2l6ZSwgQ0dDX0RBVEFfUkVBRCk7Ci0JY2djLmNtZFswXSA9IEdQQ01EX1JFQURfRFZEX1NUUlVDVFVSRTsKLQljZ2MuY21kWzddID0gcy0+dHlwZTsKLQljZ2MuY21kWzhdID0gc2l6ZSA+PiA4OwotCWNnYy5jbWRbOV0gPSBzaXplICYgMHhmZjsKKwlpbml0X2Nkcm9tX2NvbW1hbmQoY2djLCBidWYsIHNpemUsIENHQ19EQVRBX1JFQUQpOworCWNnYy0+Y21kWzBdID0gR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFOworCWNnYy0+Y21kWzddID0gcy0+dHlwZTsKKwljZ2MtPmNtZFs4XSA9IHNpemUgPj4gODsKKwljZ2MtPmNtZFs5XSA9IHNpemUgJiAweGZmOwogCi0JaWYgKChyZXQgPSBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgJmNnYykpKSB7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCXJldCA9IGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCBjZ2MpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJcy0+bWFudWZhY3QubGVuID0gYnVmWzBdIDw8IDggfCBidWZbMV07CiAJaWYgKHMtPm1hbnVmYWN0LmxlbiA8IDAgfHwgcy0+bWFudWZhY3QubGVuID4gMjA0OCkgewpAQCAtMTg2OCwyNyArMTg4MCwyOSBAQAogCQltZW1jcHkocy0+bWFudWZhY3QudmFsdWUsICZidWZbNF0sIHMtPm1hbnVmYWN0Lmxlbik7CiAJfQogCitvdXQ6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGR2ZF9yZWFkX3N0cnVjdChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZHZkX3N0cnVjdCAqcykKK3N0YXRpYyBpbnQgZHZkX3JlYWRfc3RydWN0KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBkdmRfc3RydWN0ICpzLAorCQkJCXN0cnVjdCBwYWNrZXRfY29tbWFuZCAqY2djKQogewogCXN3aXRjaCAocy0+dHlwZSkgewogCWNhc2UgRFZEX1NUUlVDVF9QSFlTSUNBTDoKLQkJcmV0dXJuIGR2ZF9yZWFkX3BoeXNpY2FsKGNkaSwgcyk7CisJCXJldHVybiBkdmRfcmVhZF9waHlzaWNhbChjZGksIHMsIGNnYyk7CiAKIAljYXNlIERWRF9TVFJVQ1RfQ09QWVJJR0hUOgotCQlyZXR1cm4gZHZkX3JlYWRfY29weXJpZ2h0KGNkaSwgcyk7CisJCXJldHVybiBkdmRfcmVhZF9jb3B5cmlnaHQoY2RpLCBzLCBjZ2MpOwogCiAJY2FzZSBEVkRfU1RSVUNUX0RJU0NLRVk6Ci0JCXJldHVybiBkdmRfcmVhZF9kaXNja2V5KGNkaSwgcyk7CisJCXJldHVybiBkdmRfcmVhZF9kaXNja2V5KGNkaSwgcywgY2djKTsKIAogCWNhc2UgRFZEX1NUUlVDVF9CQ0E6Ci0JCXJldHVybiBkdmRfcmVhZF9iY2EoY2RpLCBzKTsKKwkJcmV0dXJuIGR2ZF9yZWFkX2JjYShjZGksIHMsIGNnYyk7CiAKIAljYXNlIERWRF9TVFJVQ1RfTUFOVUZBQ1Q6Ci0JCXJldHVybiBkdmRfcmVhZF9tYW51ZmFjdChjZGksIHMpOworCQlyZXR1cm4gZHZkX3JlYWRfbWFudWZhY3QoY2RpLCBzLCBjZ2MpOwogCQkKIAlkZWZhdWx0OgogCQljZGluZm8oQ0RfV0FSTklORywgIjogSW52YWxpZCBEVkQgc3RydWN0dXJlIHJlYWQgcmVxdWVzdGVkICglZClcbiIsCkBAIC0yNzg3LDE0ICsyODAxLDMyNCBAQAogCXJldHVybiBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgJmNnYyk7CiB9CiAKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2Nkcm9tX3JlYWRfZGF0YShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkJdm9pZCBfX3VzZXIgKmFyZywKKwkJCQkJc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MsCisJCQkJCWludCBjbWQpCit7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CisJc3RydWN0IGNkcm9tX21zZiBtc2Y7CisJaW50IGJsb2Nrc2l6ZSA9IDAsIGZvcm1hdCA9IDAsIGxiYTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENEUk9NUkVBRFJBVzoKKwkJYmxvY2tzaXplID0gQ0RfRlJBTUVTSVpFX1JBVzsKKwkJYnJlYWs7CisJY2FzZSBDRFJPTVJFQURNT0RFMToKKwkJYmxvY2tzaXplID0gQ0RfRlJBTUVTSVpFOworCQlmb3JtYXQgPSAyOworCQlicmVhazsKKwljYXNlIENEUk9NUkVBRE1PREUyOgorCQlibG9ja3NpemUgPSBDRF9GUkFNRVNJWkVfUkFXMDsKKwkJYnJlYWs7CisJfQorCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX21zZiwgbXNmKTsKKwlsYmEgPSBtc2ZfdG9fbGJhKG1zZi5jZG1zZl9taW4wLCBtc2YuY2Rtc2Zfc2VjMCwgbXNmLmNkbXNmX2ZyYW1lMCk7CisJLyogRklYTUU6IHdlIG5lZWQgdXBwZXIgYm91bmQgY2hlY2tpbmcsIHRvbyEhICovCisJaWYgKGxiYSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJY2djLT5idWZmZXIgPSBrbWFsbG9jKGJsb2Nrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNnYy0+YnVmZmVyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCZzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7CisJY2djLT5zZW5zZSA9ICZzZW5zZTsKKwljZ2MtPmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfUkVBRDsKKwlyZXQgPSBjZHJvbV9yZWFkX2Jsb2NrKGNkaSwgY2djLCBsYmEsIDEsIGZvcm1hdCwgYmxvY2tzaXplKTsKKwlpZiAocmV0ICYmIHNlbnNlLnNlbnNlX2tleSA9PSAweDA1ICYmCisJCSAgIHNlbnNlLmFzYyA9PSAweDIwICYmCisJCSAgIHNlbnNlLmFzY3EgPT0gMHgwMCkgeworCQkvKgorCQkgKiBTQ1NJLUlJIGRldmljZXMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0CisJCSAqIFJFQURfQ0QsIHNvIGxldCdzIHRyeSBzd2l0Y2hpbmcgYmxvY2sgc2l6ZQorCQkgKi8KKwkJLyogRklYTUU6IHN3aXRjaCBiYWNrIGFnYWluLi4uICovCisJCXJldCA9IGNkcm9tX3N3aXRjaF9ibG9ja3NpemUoY2RpLCBibG9ja3NpemUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCWNnYy0+c2Vuc2UgPSBOVUxMOworCQlyZXQgPSBjZHJvbV9yZWFkX2NkKGNkaSwgY2djLCBsYmEsIGJsb2Nrc2l6ZSwgMSk7CisJCXJldCB8PSBjZHJvbV9zd2l0Y2hfYmxvY2tzaXplKGNkaSwgYmxvY2tzaXplKTsKKwl9CisJaWYgKCFyZXQgJiYgY29weV90b191c2VyKGFyZywgY2djLT5idWZmZXIsIGJsb2Nrc2l6ZSkpCisJCXJldCA9IC1FRkFVTFQ7CitvdXQ6CisJa2ZyZWUoY2djLT5idWZmZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2Nkcm9tX3JlYWRfYXVkaW8oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCQkJCXZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmE7CisJaW50IGxiYTsKKworCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8sIHJhKTsKKworCWlmIChyYS5hZGRyX2Zvcm1hdCA9PSBDRFJPTV9NU0YpCisJCWxiYSA9IG1zZl90b19sYmEocmEuYWRkci5tc2YubWludXRlLAorCQkJCSByYS5hZGRyLm1zZi5zZWNvbmQsCisJCQkJIHJhLmFkZHIubXNmLmZyYW1lKTsKKwllbHNlIGlmIChyYS5hZGRyX2Zvcm1hdCA9PSBDRFJPTV9MQkEpCisJCWxiYSA9IHJhLmFkZHIubGJhOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGSVhNRTogd2UgbmVlZCB1cHBlciBib3VuZCBjaGVja2luZywgdG9vISEgKi8KKwlpZiAobGJhIDwgMCB8fCByYS5uZnJhbWVzIDw9IDAgfHwgcmEubmZyYW1lcyA+IENEX0ZSQU1FUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY2Ryb21fcmVhZF9jZGRhKGNkaSwgcmEuYnVmLCBsYmEsIHJhLm5mcmFtZXMpOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IG1tY19pb2N0bF9jZHJvbV9zdWJjaGFubmVsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IGNkcm9tX3N1YmNobmwgcTsKKwl1X2NoYXIgcmVxdWVzdGVkLCBiYWNrOworCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX3N1YmNobmwsIHEpOworCXJlcXVlc3RlZCA9IHEuY2RzY19mb3JtYXQ7CisJaWYgKCEoKHJlcXVlc3RlZCA9PSBDRFJPTV9NU0YpIHx8CisJICAgICAgKHJlcXVlc3RlZCA9PSBDRFJPTV9MQkEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcS5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKKwlyZXQgPSBjZHJvbV9yZWFkX3N1YmNoYW5uZWwoY2RpLCAmcSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwliYWNrID0gcS5jZHNjX2Zvcm1hdDsgLyogbG9jYWwgY29weSAqLworCXNhbml0aXplX2Zvcm1hdCgmcS5jZHNjX2Fic2FkZHIsICZiYWNrLCByZXF1ZXN0ZWQpOworCXNhbml0aXplX2Zvcm1hdCgmcS5jZHNjX3JlbGFkZHIsICZxLmNkc2NfZm9ybWF0LCByZXF1ZXN0ZWQpOworCUlPQ1RMX09VVChhcmcsIHN0cnVjdCBjZHJvbV9zdWJjaG5sLCBxKTsKKwkvKiBjZGluZm8oQ0RfRE9fSU9DVEwsICJDRFJPTVNVQkNITkwgc3VjY2Vzc2Z1bFxuIik7ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2Nkcm9tX3BsYXlfbXNmKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCQl2b2lkIF9fdXNlciAqYXJnLAorCQkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKK3sKKwlzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyAqY2RvID0gY2RpLT5vcHM7CisJc3RydWN0IGNkcm9tX21zZiBtc2Y7CisJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01QTEFZTVNGXG4iKTsKKwlJT0NUTF9JTihhcmcsIHN0cnVjdCBjZHJvbV9tc2YsIG1zZik7CisJY2djLT5jbWRbMF0gPSBHUENNRF9QTEFZX0FVRElPX01TRjsKKwljZ2MtPmNtZFszXSA9IG1zZi5jZG1zZl9taW4wOworCWNnYy0+Y21kWzRdID0gbXNmLmNkbXNmX3NlYzA7CisJY2djLT5jbWRbNV0gPSBtc2YuY2Rtc2ZfZnJhbWUwOworCWNnYy0+Y21kWzZdID0gbXNmLmNkbXNmX21pbjE7CisJY2djLT5jbWRbN10gPSBtc2YuY2Rtc2Zfc2VjMTsKKwljZ2MtPmNtZFs4XSA9IG1zZi5jZG1zZl9mcmFtZTE7CisJY2djLT5kYXRhX2RpcmVjdGlvbiA9IENHQ19EQVRBX05PTkU7CisJcmV0dXJuIGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCBjZ2MpOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IG1tY19pb2N0bF9jZHJvbV9wbGF5X2JsayhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkJdm9pZCBfX3VzZXIgKmFyZywKKwkJCQkJc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MpCit7CisJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOworCXN0cnVjdCBjZHJvbV9ibGsgYmxrOworCWNkaW5mbyhDRF9ET19JT0NUTCwgImVudGVyaW5nIENEUk9NUExBWUJMS1xuIik7CisJSU9DVExfSU4oYXJnLCBzdHJ1Y3QgY2Ryb21fYmxrLCBibGspOworCWNnYy0+Y21kWzBdID0gR1BDTURfUExBWV9BVURJT18xMDsKKwljZ2MtPmNtZFsyXSA9IChibGsuZnJvbSA+PiAyNCkgJiAweGZmOworCWNnYy0+Y21kWzNdID0gKGJsay5mcm9tID4+IDE2KSAmIDB4ZmY7CisJY2djLT5jbWRbNF0gPSAoYmxrLmZyb20gPj4gIDgpICYgMHhmZjsKKwljZ2MtPmNtZFs1XSA9IGJsay5mcm9tICYgMHhmZjsKKwljZ2MtPmNtZFs3XSA9IChibGsubGVuID4+IDgpICYgMHhmZjsKKwljZ2MtPmNtZFs4XSA9IGJsay5sZW4gJiAweGZmOworCWNnYy0+ZGF0YV9kaXJlY3Rpb24gPSBDR0NfREFUQV9OT05FOworCXJldHVybiBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgY2djKTsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBtbWNfaW9jdGxfY2Ryb21fdm9sdW1lKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCQl2b2lkIF9fdXNlciAqYXJnLAorCQkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYywKKwkJCQkJdW5zaWduZWQgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2xjdHJsOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzMyXTsKKwljaGFyIG1hc2tbc2l6ZW9mKGJ1ZmZlcildOworCXVuc2lnbmVkIHNob3J0IG9mZnNldDsKKwlpbnQgcmV0OworCisJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01WT0xVTUVcbiIpOworCisJSU9DVExfSU4oYXJnLCBzdHJ1Y3QgY2Ryb21fdm9sY3RybCwgdm9sY3RybCk7CisKKwljZ2MtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwljZ2MtPmJ1ZmxlbiA9IDI0OworCXJldCA9IGNkcm9tX21vZGVfc2Vuc2UoY2RpLCBjZ2MsIEdQTU9ERV9BVURJT19DVExfUEFHRSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkJCisJLyogb3JpZ2luYWxseSB0aGUgY29kZSBkZXBlbmRlZCBvbiBidWZmZXJbMV0gdG8gZGV0ZXJtaW5lCisJICAgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRyYW5zZmVyLiBidWZmZXJbMV0gaXMKKwkgICB1bmZvcnR1bmF0ZWx5IGFtYmlnaW91cyBhbmQgdGhlIG9ubHkgcmVsaWFibGUgd2F5IHNlZW0KKwkgICB0byBiZSB0byBzaW1wbHkgc2tpcCBvdmVyIHRoZSBibG9jayBkZXNjcmlwdG9yLi4uICovCisJb2Zmc2V0ID0gOCArIGJlMTZfdG9fY3B1KCooX19iZTE2ICopKGJ1ZmZlciArIDYpKTsKKworCWlmIChvZmZzZXQgKyAxNiA+IHNpemVvZihidWZmZXIpKQorCQlyZXR1cm4gLUUyQklHOworCisJaWYgKG9mZnNldCArIDE2ID4gY2djLT5idWZsZW4pIHsKKwkJY2djLT5idWZsZW4gPSBvZmZzZXQgKyAxNjsKKwkJcmV0ID0gY2Ryb21fbW9kZV9zZW5zZShjZGksIGNnYywKKwkJCQkJR1BNT0RFX0FVRElPX0NUTF9QQUdFLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKChidWZmZXJbb2Zmc2V0XSAmIDB4M2YpICE9IEdQTU9ERV9BVURJT19DVExfUEFHRSB8fAorCQkJYnVmZmVyW29mZnNldCArIDFdIDwgMTQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbm93IHdlIGhhdmUgdGhlIGN1cnJlbnQgdm9sdW1lIHNldHRpbmdzLiBpZiBpdCB3YXMgb25seQorCSAgIGEgQ0RST01WT0xSRUFELCByZXR1cm4gdGhlc2UgdmFsdWVzICovCisJaWYgKGNtZCA9PSBDRFJPTVZPTFJFQUQpIHsKKwkJdm9sY3RybC5jaGFubmVsMCA9IGJ1ZmZlcltvZmZzZXQrOV07CisJCXZvbGN0cmwuY2hhbm5lbDEgPSBidWZmZXJbb2Zmc2V0KzExXTsKKwkJdm9sY3RybC5jaGFubmVsMiA9IGJ1ZmZlcltvZmZzZXQrMTNdOworCQl2b2xjdHJsLmNoYW5uZWwzID0gYnVmZmVyW29mZnNldCsxNV07CisJCUlPQ1RMX09VVChhcmcsIHN0cnVjdCBjZHJvbV92b2xjdHJsLCB2b2xjdHJsKTsKKwkJcmV0dXJuIDA7CisJfQorCQkKKwkvKiBnZXQgdGhlIHZvbHVtZSBtYXNrICovCisJY2djLT5idWZmZXIgPSBtYXNrOworCXJldCA9IGNkcm9tX21vZGVfc2Vuc2UoY2RpLCBjZ2MsIEdQTU9ERV9BVURJT19DVExfUEFHRSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWJ1ZmZlcltvZmZzZXQgKyA5XSAgPSB2b2xjdHJsLmNoYW5uZWwwICYgbWFza1tvZmZzZXQgKyA5XTsKKwlidWZmZXJbb2Zmc2V0ICsgMTFdID0gdm9sY3RybC5jaGFubmVsMSAmIG1hc2tbb2Zmc2V0ICsgMTFdOworCWJ1ZmZlcltvZmZzZXQgKyAxM10gPSB2b2xjdHJsLmNoYW5uZWwyICYgbWFza1tvZmZzZXQgKyAxM107CisJYnVmZmVyW29mZnNldCArIDE1XSA9IHZvbGN0cmwuY2hhbm5lbDMgJiBtYXNrW29mZnNldCArIDE1XTsKKworCS8qIHNldCB2b2x1bWUgKi8KKwljZ2MtPmJ1ZmZlciA9IGJ1ZmZlciArIG9mZnNldCAtIDg7CisJbWVtc2V0KGNnYy0+YnVmZmVyLCAwLCA4KTsKKwlyZXR1cm4gY2Ryb21fbW9kZV9zZWxlY3QoY2RpLCBjZ2MpOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IG1tY19pb2N0bF9jZHJvbV9zdGFydF9zdG9wKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYywKKwkJCQkJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyAqY2RvID0gY2RpLT5vcHM7CisJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01TVEFSVC9DRFJPTVNUT1BcbiIpOworCWNnYy0+Y21kWzBdID0gR1BDTURfU1RBUlRfU1RPUF9VTklUOworCWNnYy0+Y21kWzFdID0gMTsKKwljZ2MtPmNtZFs0XSA9IChjbWQgPT0gQ0RST01TVEFSVCkgPyAxIDogMDsKKwljZ2MtPmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKKwlyZXR1cm4gY2RvLT5nZW5lcmljX3BhY2tldChjZGksIGNnYyk7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2Nkcm9tX3BhdXNlX3Jlc3VtZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkJc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MsCisJCQkJCWludCBjbWQpCit7CisJc3RydWN0IGNkcm9tX2RldmljZV9vcHMgKmNkbyA9IGNkaS0+b3BzOworCWNkaW5mbyhDRF9ET19JT0NUTCwgImVudGVyaW5nIENEUk9NUEFVU0UvQ0RST01SRVNVTUVcbiIpOworCWNnYy0+Y21kWzBdID0gR1BDTURfUEFVU0VfUkVTVU1FOworCWNnYy0+Y21kWzhdID0gKGNtZCA9PSBDRFJPTVJFU1VNRSkgPyAxIDogMDsKKwljZ2MtPmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKKwlyZXR1cm4gY2RvLT5nZW5lcmljX3BhY2tldChjZGksIGNnYyk7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2R2ZF9yZWFkX3N0cnVjdChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkJCXZvaWQgX191c2VyICphcmcsCisJCQkJCQlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKK3sKKwlpbnQgcmV0OworCWR2ZF9zdHJ1Y3QgKnM7CisJaW50IHNpemUgPSBzaXplb2YoZHZkX3N0cnVjdCk7CisKKwlpZiAoIUNEUk9NX0NBTihDRENfRFZEKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlzID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpCisJCXJldHVybiAtRU5PTUVNOworCisJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgRFZEX1JFQURfU1RSVUNUXG4iKTsKKwlpZiAoY29weV9mcm9tX3VzZXIocywgYXJnLCBzaXplKSkgeworCQlrZnJlZShzKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0ID0gZHZkX3JlYWRfc3RydWN0KGNkaSwgcywgY2djKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBzLCBzaXplKSkKKwkJcmV0ID0gLUVGQVVMVDsKK291dDoKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IG1tY19pb2N0bF9kdmRfYXV0aChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkJdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmV0OworCWR2ZF9hdXRoaW5mbyBhaTsKKwlpZiAoIUNEUk9NX0NBTihDRENfRFZEKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgRFZEX0FVVEhcbiIpOworCUlPQ1RMX0lOKGFyZywgZHZkX2F1dGhpbmZvLCBhaSk7CisJcmV0ID0gZHZkX2RvX2F1dGgoY2RpLCAmYWkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJSU9DVExfT1VUKGFyZywgZHZkX2F1dGhpbmZvLCBhaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbW1jX2lvY3RsX2Nkcm9tX25leHRfd3JpdGFibGUoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCQkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWludCByZXQ7CisJbG9uZyBuZXh0ID0gMDsKKwljZGluZm8oQ0RfRE9fSU9DVEwsICJlbnRlcmluZyBDRFJPTV9ORVhUX1dSSVRBQkxFXG4iKTsKKwlyZXQgPSBjZHJvbV9nZXRfbmV4dF93cml0YWJsZShjZGksICZuZXh0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCUlPQ1RMX09VVChhcmcsIGxvbmcsIG5leHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IG1tY19pb2N0bF9jZHJvbV9sYXN0X3dyaXR0ZW4oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCQkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWludCByZXQ7CisJbG9uZyBsYXN0ID0gMDsKKwljZGluZm8oQ0RfRE9fSU9DVEwsICJlbnRlcmluZyBDRFJPTV9MQVNUX1dSSVRURU5cbiIpOworCXJldCA9IGNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oY2RpLCAmbGFzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlJT0NUTF9PVVQoYXJnLCBsb25nLCBsYXN0KTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtbWNfaW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17CQkKLQlzdHJ1Y3QgY2Ryb21fZGV2aWNlX29wcyAqY2RvID0gY2RpLT5vcHM7Cit7CiAJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKLQlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlclszMl07Ci0JaW50IHJldCA9IDA7CisJdm9pZCBfX3VzZXIgKnVzZXJwdHIgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKGNnYykpOwogCkBAIC0yODAzLDI1NSArMzEyNywzNCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDRFJPTVJFQURSQVc6CiAJY2FzZSBDRFJPTVJFQURNT0RFMToKLQljYXNlIENEUk9NUkVBRE1PREUyOiB7Ci0JCXN0cnVjdCBjZHJvbV9tc2YgbXNmOwotCQlpbnQgYmxvY2tzaXplID0gMCwgZm9ybWF0ID0gMCwgbGJhOwotCQkKLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBDRFJPTVJFQURSQVc6Ci0JCQlibG9ja3NpemUgPSBDRF9GUkFNRVNJWkVfUkFXOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0RST01SRUFETU9ERTE6Ci0JCQlibG9ja3NpemUgPSBDRF9GUkFNRVNJWkU7Ci0JCQlmb3JtYXQgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0RST01SRUFETU9ERTI6Ci0JCQlibG9ja3NpemUgPSBDRF9GUkFNRVNJWkVfUkFXMDsKLQkJCWJyZWFrOwotCQl9Ci0JCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX21zZiwgbXNmKTsKLQkJbGJhID0gbXNmX3RvX2xiYShtc2YuY2Rtc2ZfbWluMCxtc2YuY2Rtc2Zfc2VjMCxtc2YuY2Rtc2ZfZnJhbWUwKTsKLQkJLyogRklYTUU6IHdlIG5lZWQgdXBwZXIgYm91bmQgY2hlY2tpbmcsIHRvbyEhICovCi0JCWlmIChsYmEgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNnYy5idWZmZXIgPSBrbWFsbG9jKGJsb2Nrc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjZ2MuYnVmZmVyID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJbWVtc2V0KCZzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7Ci0JCWNnYy5zZW5zZSA9ICZzZW5zZTsKLQkJY2djLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfUkVBRDsKLQkJcmV0ID0gY2Ryb21fcmVhZF9ibG9jayhjZGksICZjZ2MsIGxiYSwgMSwgZm9ybWF0LCBibG9ja3NpemUpOwotCQlpZiAocmV0ICYmIHNlbnNlLnNlbnNlX2tleT09MHgwNSAmJiBzZW5zZS5hc2M9PTB4MjAgJiYgc2Vuc2UuYXNjcT09MHgwMCkgewotCQkJLyoKLQkJCSAqIFNDU0ktSUkgZGV2aWNlcyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQKLQkJCSAqIFJFQURfQ0QsIHNvIGxldCdzIHRyeSBzd2l0Y2hpbmcgYmxvY2sgc2l6ZQotCQkJICovCi0JCQkvKiBGSVhNRTogc3dpdGNoIGJhY2sgYWdhaW4uLi4gKi8KLQkJCWlmICgocmV0ID0gY2Ryb21fc3dpdGNoX2Jsb2Nrc2l6ZShjZGksIGJsb2Nrc2l6ZSkpKSB7Ci0JCQkJa2ZyZWUoY2djLmJ1ZmZlcik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJCWNnYy5zZW5zZSA9IE5VTEw7Ci0JCQlyZXQgPSBjZHJvbV9yZWFkX2NkKGNkaSwgJmNnYywgbGJhLCBibG9ja3NpemUsIDEpOwotCQkJcmV0IHw9IGNkcm9tX3N3aXRjaF9ibG9ja3NpemUoY2RpLCBibG9ja3NpemUpOwotCQl9Ci0JCWlmICghcmV0ICYmIGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsIGNnYy5idWZmZXIsIGJsb2Nrc2l6ZSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlrZnJlZShjZ2MuYnVmZmVyKTsKLQkJcmV0dXJuIHJldDsKLQkJfQotCWNhc2UgQ0RST01SRUFEQVVESU86IHsKLQkJc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmE7Ci0JCWludCBsYmE7Ci0KLQkJSU9DVExfSU4oYXJnLCBzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbywgcmEpOwotCi0JCWlmIChyYS5hZGRyX2Zvcm1hdCA9PSBDRFJPTV9NU0YpCi0JCQlsYmEgPSBtc2ZfdG9fbGJhKHJhLmFkZHIubXNmLm1pbnV0ZSwKLQkJCQkJIHJhLmFkZHIubXNmLnNlY29uZCwKLQkJCQkJIHJhLmFkZHIubXNmLmZyYW1lKTsKLQkJZWxzZSBpZiAocmEuYWRkcl9mb3JtYXQgPT0gQ0RST01fTEJBKQotCQkJbGJhID0gcmEuYWRkci5sYmE7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIEZJWE1FOiB3ZSBuZWVkIHVwcGVyIGJvdW5kIGNoZWNraW5nLCB0b28hISAqLwotCQlpZiAobGJhIDwgMCB8fCByYS5uZnJhbWVzIDw9IDAgfHwgcmEubmZyYW1lcyA+IENEX0ZSQU1FUykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldHVybiBjZHJvbV9yZWFkX2NkZGEoY2RpLCByYS5idWYsIGxiYSwgcmEubmZyYW1lcyk7Ci0JCX0KLQljYXNlIENEUk9NU1VCQ0hOTDogewotCQlzdHJ1Y3QgY2Ryb21fc3ViY2hubCBxOwotCQl1X2NoYXIgcmVxdWVzdGVkLCBiYWNrOwotCQlJT0NUTF9JTihhcmcsIHN0cnVjdCBjZHJvbV9zdWJjaG5sLCBxKTsKLQkJcmVxdWVzdGVkID0gcS5jZHNjX2Zvcm1hdDsKLQkJaWYgKCEoKHJlcXVlc3RlZCA9PSBDRFJPTV9NU0YpIHx8Ci0JCSAgICAgIChyZXF1ZXN0ZWQgPT0gQ0RST01fTEJBKSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcS5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKLQkJaWYgKChyZXQgPSBjZHJvbV9yZWFkX3N1YmNoYW5uZWwoY2RpLCAmcSwgMCkpKQotCQkJcmV0dXJuIHJldDsKLQkJYmFjayA9IHEuY2RzY19mb3JtYXQ7IC8qIGxvY2FsIGNvcHkgKi8KLQkJc2FuaXRpemVfZm9ybWF0KCZxLmNkc2NfYWJzYWRkciwgJmJhY2ssIHJlcXVlc3RlZCk7Ci0JCXNhbml0aXplX2Zvcm1hdCgmcS5jZHNjX3JlbGFkZHIsICZxLmNkc2NfZm9ybWF0LCByZXF1ZXN0ZWQpOwotCQlJT0NUTF9PVVQoYXJnLCBzdHJ1Y3QgY2Ryb21fc3ViY2hubCwgcSk7Ci0JCS8qIGNkaW5mbyhDRF9ET19JT0NUTCwgIkNEUk9NU1VCQ0hOTCBzdWNjZXNzZnVsXG4iKTsgKi8gCi0JCXJldHVybiAwOwotCQl9Ci0JY2FzZSBDRFJPTVBMQVlNU0Y6IHsKLQkJc3RydWN0IGNkcm9tX21zZiBtc2Y7Ci0JCWNkaW5mbyhDRF9ET19JT0NUTCwgImVudGVyaW5nIENEUk9NUExBWU1TRlxuIik7Ci0JCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX21zZiwgbXNmKTsKLQkJY2djLmNtZFswXSA9IEdQQ01EX1BMQVlfQVVESU9fTVNGOwotCQljZ2MuY21kWzNdID0gbXNmLmNkbXNmX21pbjA7Ci0JCWNnYy5jbWRbNF0gPSBtc2YuY2Rtc2Zfc2VjMDsKLQkJY2djLmNtZFs1XSA9IG1zZi5jZG1zZl9mcmFtZTA7Ci0JCWNnYy5jbWRbNl0gPSBtc2YuY2Rtc2ZfbWluMTsKLQkJY2djLmNtZFs3XSA9IG1zZi5jZG1zZl9zZWMxOwotCQljZ2MuY21kWzhdID0gbXNmLmNkbXNmX2ZyYW1lMTsKLQkJY2djLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKLQkJcmV0dXJuIGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCAmY2djKTsKLQkJfQotCWNhc2UgQ0RST01QTEFZQkxLOiB7Ci0JCXN0cnVjdCBjZHJvbV9ibGsgYmxrOwotCQljZGluZm8oQ0RfRE9fSU9DVEwsICJlbnRlcmluZyBDRFJPTVBMQVlCTEtcbiIpOwotCQlJT0NUTF9JTihhcmcsIHN0cnVjdCBjZHJvbV9ibGssIGJsayk7Ci0JCWNnYy5jbWRbMF0gPSBHUENNRF9QTEFZX0FVRElPXzEwOwotCQljZ2MuY21kWzJdID0gKGJsay5mcm9tID4+IDI0KSAmIDB4ZmY7Ci0JCWNnYy5jbWRbM10gPSAoYmxrLmZyb20gPj4gMTYpICYgMHhmZjsKLQkJY2djLmNtZFs0XSA9IChibGsuZnJvbSA+PiAgOCkgJiAweGZmOwotCQljZ2MuY21kWzVdID0gYmxrLmZyb20gJiAweGZmOwotCQljZ2MuY21kWzddID0gKGJsay5sZW4gPj4gOCkgJiAweGZmOwotCQljZ2MuY21kWzhdID0gYmxrLmxlbiAmIDB4ZmY7Ci0JCWNnYy5kYXRhX2RpcmVjdGlvbiA9IENHQ19EQVRBX05PTkU7Ci0JCXJldHVybiBjZG8tPmdlbmVyaWNfcGFja2V0KGNkaSwgJmNnYyk7Ci0JCX0KKwljYXNlIENEUk9NUkVBRE1PREUyOgorCQlyZXR1cm4gbW1jX2lvY3RsX2Nkcm9tX3JlYWRfZGF0YShjZGksIHVzZXJwdHIsICZjZ2MsIGNtZCk7CisJY2FzZSBDRFJPTVJFQURBVURJTzoKKwkJcmV0dXJuIG1tY19pb2N0bF9jZHJvbV9yZWFkX2F1ZGlvKGNkaSwgdXNlcnB0cik7CisJY2FzZSBDRFJPTVNVQkNITkw6CisJCXJldHVybiBtbWNfaW9jdGxfY2Ryb21fc3ViY2hhbm5lbChjZGksIHVzZXJwdHIpOworCWNhc2UgQ0RST01QTEFZTVNGOgorCQlyZXR1cm4gbW1jX2lvY3RsX2Nkcm9tX3BsYXlfbXNmKGNkaSwgdXNlcnB0ciwgJmNnYyk7CisJY2FzZSBDRFJPTVBMQVlCTEs6CisJCXJldHVybiBtbWNfaW9jdGxfY2Ryb21fcGxheV9ibGsoY2RpLCB1c2VycHRyLCAmY2djKTsKIAljYXNlIENEUk9NVk9MQ1RSTDoKLQljYXNlIENEUk9NVk9MUkVBRDogewotCQlzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2xjdHJsOwotCQljaGFyIG1hc2tbc2l6ZW9mKGJ1ZmZlcildOwotCQl1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0KLQkJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01WT0xVTUVcbiIpOwotCi0JCUlPQ1RMX0lOKGFyZywgc3RydWN0IGNkcm9tX3ZvbGN0cmwsIHZvbGN0cmwpOwotCi0JCWNnYy5idWZmZXIgPSBidWZmZXI7Ci0JCWNnYy5idWZsZW4gPSAyNDsKLQkJaWYgKChyZXQgPSBjZHJvbV9tb2RlX3NlbnNlKGNkaSwgJmNnYywgR1BNT0RFX0FVRElPX0NUTF9QQUdFLCAwKSkpCi0JCSAgICByZXR1cm4gcmV0OwotCQkKLQkJLyogb3JpZ2luYWxseSB0aGUgY29kZSBkZXBlbmRlZCBvbiBidWZmZXJbMV0gdG8gZGV0ZXJtaW5lCi0JCSAgIGhvdyBtdWNoIGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0cmFuc2Zlci4gYnVmZmVyWzFdIGlzCi0JCSAgIHVuZm9ydHVuYXRlbHkgYW1iaWdpb3VzIGFuZCB0aGUgb25seSByZWxpYWJsZSB3YXkgc2VlbQotCQkgICB0byBiZSB0byBzaW1wbHkgc2tpcCBvdmVyIHRoZSBibG9jayBkZXNjcmlwdG9yLi4uICovCi0JCW9mZnNldCA9IDggKyBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZmZXIrNikpOwotCi0JCWlmIChvZmZzZXQgKyAxNiA+IHNpemVvZihidWZmZXIpKQotCQkJcmV0dXJuIC1FMkJJRzsKLQotCQlpZiAob2Zmc2V0ICsgMTYgPiBjZ2MuYnVmbGVuKSB7Ci0JCQljZ2MuYnVmbGVuID0gb2Zmc2V0KzE2OwotCQkJcmV0ID0gY2Ryb21fbW9kZV9zZW5zZShjZGksICZjZ2MsCi0JCQkJCQlHUE1PREVfQVVESU9fQ1RMX1BBR0UsIDApOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmICgoYnVmZmVyW29mZnNldF0gJiAweDNmKSAhPSBHUE1PREVfQVVESU9fQ1RMX1BBR0UgfHwKLQkJCQlidWZmZXJbb2Zmc2V0KzFdIDwgMTQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKiBub3cgd2UgaGF2ZSB0aGUgY3VycmVudCB2b2x1bWUgc2V0dGluZ3MuIGlmIGl0IHdhcyBvbmx5Ci0JCSAgIGEgQ0RST01WT0xSRUFELCByZXR1cm4gdGhlc2UgdmFsdWVzICovCi0JCWlmIChjbWQgPT0gQ0RST01WT0xSRUFEKSB7Ci0JCQl2b2xjdHJsLmNoYW5uZWwwID0gYnVmZmVyW29mZnNldCs5XTsKLQkJCXZvbGN0cmwuY2hhbm5lbDEgPSBidWZmZXJbb2Zmc2V0KzExXTsKLQkJCXZvbGN0cmwuY2hhbm5lbDIgPSBidWZmZXJbb2Zmc2V0KzEzXTsKLQkJCXZvbGN0cmwuY2hhbm5lbDMgPSBidWZmZXJbb2Zmc2V0KzE1XTsKLQkJCUlPQ1RMX09VVChhcmcsIHN0cnVjdCBjZHJvbV92b2xjdHJsLCB2b2xjdHJsKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCQotCQkvKiBnZXQgdGhlIHZvbHVtZSBtYXNrICovCi0JCWNnYy5idWZmZXIgPSBtYXNrOwotCQlpZiAoKHJldCA9IGNkcm9tX21vZGVfc2Vuc2UoY2RpLCAmY2djLCAKLQkJCQlHUE1PREVfQVVESU9fQ1RMX1BBR0UsIDEpKSkKLQkJCXJldHVybiByZXQ7Ci0KLQkJYnVmZmVyW29mZnNldCs5XSA9IHZvbGN0cmwuY2hhbm5lbDAgJiBtYXNrW29mZnNldCs5XTsKLQkJYnVmZmVyW29mZnNldCsxMV0gPSB2b2xjdHJsLmNoYW5uZWwxICYgbWFza1tvZmZzZXQrMTFdOwotCQlidWZmZXJbb2Zmc2V0KzEzXSA9IHZvbGN0cmwuY2hhbm5lbDIgJiBtYXNrW29mZnNldCsxM107Ci0JCWJ1ZmZlcltvZmZzZXQrMTVdID0gdm9sY3RybC5jaGFubmVsMyAmIG1hc2tbb2Zmc2V0KzE1XTsKLQotCQkvKiBzZXQgdm9sdW1lICovCi0JCWNnYy5idWZmZXIgPSBidWZmZXIgKyBvZmZzZXQgLSA4OwotCQltZW1zZXQoY2djLmJ1ZmZlciwgMCwgOCk7Ci0JCXJldHVybiBjZHJvbV9tb2RlX3NlbGVjdChjZGksICZjZ2MpOwotCQl9Ci0KKwljYXNlIENEUk9NVk9MUkVBRDoKKwkJcmV0dXJuIG1tY19pb2N0bF9jZHJvbV92b2x1bWUoY2RpLCB1c2VycHRyLCAmY2djLCBjbWQpOwogCWNhc2UgQ0RST01TVEFSVDoKLQljYXNlIENEUk9NU1RPUDogewotCQljZGluZm8oQ0RfRE9fSU9DVEwsICJlbnRlcmluZyBDRFJPTVNUQVJUL0NEUk9NU1RPUFxuIik7IAotCQljZ2MuY21kWzBdID0gR1BDTURfU1RBUlRfU1RPUF9VTklUOwotCQljZ2MuY21kWzFdID0gMTsKLQkJY2djLmNtZFs0XSA9IChjbWQgPT0gQ0RST01TVEFSVCkgPyAxIDogMDsKLQkJY2djLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKLQkJcmV0dXJuIGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCAmY2djKTsKLQkJfQotCisJY2FzZSBDRFJPTVNUT1A6CisJCXJldHVybiBtbWNfaW9jdGxfY2Ryb21fc3RhcnRfc3RvcChjZGksICZjZ2MsIGNtZCk7CiAJY2FzZSBDRFJPTVBBVVNFOgotCWNhc2UgQ0RST01SRVNVTUU6IHsKLQkJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01QQVVTRS9DRFJPTVJFU1VNRVxuIik7IAotCQljZ2MuY21kWzBdID0gR1BDTURfUEFVU0VfUkVTVU1FOwotCQljZ2MuY21kWzhdID0gKGNtZCA9PSBDRFJPTVJFU1VNRSkgPyAxIDogMDsKLQkJY2djLmRhdGFfZGlyZWN0aW9uID0gQ0dDX0RBVEFfTk9ORTsKLQkJcmV0dXJuIGNkby0+Z2VuZXJpY19wYWNrZXQoY2RpLCAmY2djKTsKLQkJfQotCi0JY2FzZSBEVkRfUkVBRF9TVFJVQ1Q6IHsKLQkJZHZkX3N0cnVjdCAqczsKLQkJaW50IHNpemUgPSBzaXplb2YoZHZkX3N0cnVjdCk7Ci0JCWlmICghQ0RST01fQ0FOKENEQ19EVkQpKQotCQkJcmV0dXJuIC1FTk9TWVM7Ci0JCWlmICgocyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgRFZEX1JFQURfU1RSVUNUXG4iKTsgCi0JCWlmIChjb3B5X2Zyb21fdXNlcihzLCAoZHZkX3N0cnVjdCBfX3VzZXIgKilhcmcsIHNpemUpKSB7Ci0JCQlrZnJlZShzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmICgocmV0ID0gZHZkX3JlYWRfc3RydWN0KGNkaSwgcykpKSB7Ci0JCQlrZnJlZShzKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigoZHZkX3N0cnVjdCBfX3VzZXIgKilhcmcsIHMsIHNpemUpKQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJa2ZyZWUocyk7Ci0JCXJldHVybiByZXQ7Ci0JCX0KLQotCWNhc2UgRFZEX0FVVEg6IHsKLQkJZHZkX2F1dGhpbmZvIGFpOwotCQlpZiAoIUNEUk9NX0NBTihDRENfRFZEKSkKLQkJCXJldHVybiAtRU5PU1lTOwotCQljZGluZm8oQ0RfRE9fSU9DVEwsICJlbnRlcmluZyBEVkRfQVVUSFxuIik7IAotCQlJT0NUTF9JTihhcmcsIGR2ZF9hdXRoaW5mbywgYWkpOwotCQlpZiAoKHJldCA9IGR2ZF9kb19hdXRoIChjZGksICZhaSkpKQotCQkJcmV0dXJuIHJldDsKLQkJSU9DVExfT1VUKGFyZywgZHZkX2F1dGhpbmZvLCBhaSk7Ci0JCXJldHVybiAwOwotCQl9Ci0KLQljYXNlIENEUk9NX05FWFRfV1JJVEFCTEU6IHsKLQkJbG9uZyBuZXh0ID0gMDsKLQkJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgQ0RST01fTkVYVF9XUklUQUJMRVxuIik7IAotCQlpZiAoKHJldCA9IGNkcm9tX2dldF9uZXh0X3dyaXRhYmxlKGNkaSwgJm5leHQpKSkKLQkJCXJldHVybiByZXQ7Ci0JCUlPQ1RMX09VVChhcmcsIGxvbmcsIG5leHQpOwotCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgQ0RST01fTEFTVF9XUklUVEVOOiB7Ci0JCWxvbmcgbGFzdCA9IDA7Ci0JCWNkaW5mbyhDRF9ET19JT0NUTCwgImVudGVyaW5nIENEUk9NX0xBU1RfV1JJVFRFTlxuIik7IAotCQlpZiAoKHJldCA9IGNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oY2RpLCAmbGFzdCkpKQotCQkJcmV0dXJuIHJldDsKLQkJSU9DVExfT1VUKGFyZywgbG9uZywgbGFzdCk7Ci0JCXJldHVybiAwOwotCQl9Ci0JfSAvKiBzd2l0Y2ggKi8KKwljYXNlIENEUk9NUkVTVU1FOgorCQlyZXR1cm4gbW1jX2lvY3RsX2Nkcm9tX3BhdXNlX3Jlc3VtZShjZGksICZjZ2MsIGNtZCk7CisJY2FzZSBEVkRfUkVBRF9TVFJVQ1Q6CisJCXJldHVybiBtbWNfaW9jdGxfZHZkX3JlYWRfc3RydWN0KGNkaSwgdXNlcnB0ciwgJmNnYyk7CisJY2FzZSBEVkRfQVVUSDoKKwkJcmV0dXJuIG1tY19pb2N0bF9kdmRfYXV0aChjZGksIHVzZXJwdHIpOworCWNhc2UgQ0RST01fTkVYVF9XUklUQUJMRToKKwkJcmV0dXJuIG1tY19pb2N0bF9jZHJvbV9uZXh0X3dyaXRhYmxlKGNkaSwgdXNlcnB0cik7CisJY2FzZSBDRFJPTV9MQVNUX1dSSVRURU46CisJCXJldHVybiBtbWNfaW9jdGxfY2Ryb21fbGFzdF93cml0dGVuKGNkaSwgdXNlcnB0cik7CisJfQogCiAJcmV0dXJuIC1FTk9UVFk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwppbmRleCA5Y2Y2ZTliLi5jNzcxNDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKQEAgLTQwLDYgKzQwLDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSUcgICAgICAgICAgMHgyRTEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRzQ1X0hCICAgICAgICAgIDB4MkUyMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9JRyAgICAgICAgICAweDJFMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEIgICAgICAgICAgMHgyRTMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0lHICAgICAgICAgIDB4MkUzMgogCiAvKiBjb3ZlciA5MTUgYW5kIDk0NSB2YXJpYW50cyAqLwogI2RlZmluZSBJU19JOTE1IChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0U3MjIxX0hCIHx8IFwKQEAgLTYzLDcgKzY1LDggQEAKICNkZWZpbmUgSVNfRzRYIChhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRF9FX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSEIgfHwgXAogCQlhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiB8fCBcCi0JCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfR000NV9IQikKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCIHx8IFwKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEIpCiAKIGV4dGVybiBpbnQgYWdwX21lbW9yeV9yZXNlcnZlZDsKIApAQCAtMTE5Niw2ICsxMTk5LDcgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSEI6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1E0NV9IQjoKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRzQ1X0hCOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEI6CiAJCSpndHRfb2Zmc2V0ID0gKmd0dF9zaXplID0gTUIoMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMTU2LDEzICsyMTYwLDE1IEBACiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1EzM19IQiwgUENJX0RFVklDRV9JRF9JTlRFTF9RMzNfSUcsIDAsICJRMzMiLAogCQlOVUxMLCAmaW50ZWxfZzMzX2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0dNNDVfSUcsIDAsCi0JICAgICJNb2JpbGUgSW50ZWw/IEdNNDUgRXhwcmVzcyIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAorCSAgICAiTW9iaWxlIEludGVswq4gR000NSBFeHByZXNzIiwgTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRF9FX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lHRF9FX0lHLCAwLAogCSAgICAiSW50ZWwgSW50ZWdyYXRlZCBHcmFwaGljcyBEZXZpY2UiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1E0NV9JRywgMCwKIAkgICAgIlE0NS9RNDMiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQ1X0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9JRywgMCwKIAkgICAgIkc0NS9HNDMiLCBOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQxX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0c0MV9JRywgMCwKKwkgICAgIkc0MSIsIE5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAogCXsgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9CiB9OwogCkBAIC0yMzYwLDYgKzIzNjYsNyBAQAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfSUdEX0VfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0c0NV9IQiksCisJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSEIpLAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RzMTYyMC5jIGIvZHJpdmVycy9jaGFyL2RzMTYyMC5jCmluZGV4IDc0ZTljZDguLjYxZjAxNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kczE2MjAuYworKysgYi9kcml2ZXJzL2NoYXIvZHMxNjIwLmMKQEAgLTQzLDUyICs0Myw1MSBAQAogICogIGNoYW5jZSB0aGF0IHRoZSBXYXZlQXJ0aXN0IGRyaXZlciBjb3VsZCB0b3VjaCB0aGVzZSBiaXRzIHRvCiAgKiAgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWFrZXIuCiAgKi8KLWV4dGVybiBzcGlubG9ja190IGdwaW9fbG9jazsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzdGVtX3JldjsKIAogc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2NsayhpbnQgY2xrKQogewotCWdwaW9fbW9kaWZ5X29wKEdQSU9fRFNDTEssIGNsayA/IEdQSU9fRFNDTEsgOiAwKTsKKwlud19ncGlvX21vZGlmeV9vcChHUElPX0RTQ0xLLCBjbGsgPyBHUElPX0RTQ0xLIDogMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXR3aW5kZXJfZHMxNjIwX3NldF9kYXRhKGludCBkYXQpCiB7Ci0JZ3Bpb19tb2RpZnlfb3AoR1BJT19EQVRBLCBkYXQgPyBHUElPX0RBVEEgOiAwKTsKKwlud19ncGlvX21vZGlmeV9vcChHUElPX0RBVEEsIGRhdCA/IEdQSU9fREFUQSA6IDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBuZXR3aW5kZXJfZHMxNjIwX2dldF9kYXRhKHZvaWQpCiB7Ci0JcmV0dXJuIGdwaW9fcmVhZCgpICYgR1BJT19EQVRBOworCXJldHVybiBud19ncGlvX3JlYWQoKSAmIEdQSU9fREFUQTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG5ldHdpbmRlcl9kczE2MjBfc2V0X2RhdGFfZGlyKGludCBkaXIpCiB7Ci0JZ3Bpb19tb2RpZnlfaW8oR1BJT19EQVRBLCBkaXIgPyBHUElPX0RBVEEgOiAwKTsKKwlud19ncGlvX21vZGlmeV9pbyhHUElPX0RBVEEsIGRpciA/IEdQSU9fREFUQSA6IDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX2RzMTYyMF9yZXNldCh2b2lkKQogewotCWNwbGRfbW9kaWZ5KENQTERfRFNfRU5BQkxFLCAwKTsKLQljcGxkX21vZGlmeShDUExEX0RTX0VOQUJMRSwgQ1BMRF9EU19FTkFCTEUpOworCW53X2NwbGRfbW9kaWZ5KENQTERfRFNfRU5BQkxFLCAwKTsKKwlud19jcGxkX21vZGlmeShDUExEX0RTX0VOQUJMRSwgQ1BMRF9EU19FTkFCTEUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX2xvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgKmZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbndfZ3Bpb19sb2NrLCAqZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX3VubG9jayh1bnNpZ25lZCBsb25nICpmbGFncykKIHsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssICpmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbndfZ3Bpb19sb2NrLCAqZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmV0d2luZGVyX3NldF9mYW4oaW50IGkpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQlncGlvX21vZGlmeV9vcChHUElPX0ZBTiwgaSA/IEdQSU9fRkFOIDogMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOworCW53X2dwaW9fbW9kaWZ5X29wKEdQSU9fRkFOLCBpID8gR1BJT19GQU4gOiAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZud19ncGlvX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmV0d2luZGVyX2dldF9mYW4odm9pZCkKQEAgLTk2LDcgKzk1LDcgQEAKIAlpZiAoKHN5c3RlbV9yZXYgJiAweGYwMDApID09IDB4NDAwMCkKIAkJcmV0dXJuIEZBTl9BTFdBWVNfT047CiAKLQlyZXR1cm4gKGdwaW9fcmVhZCgpICYgR1BJT19GQU4pID8gRkFOX09OIDogRkFOX09GRjsKKwlyZXR1cm4gKG53X2dwaW9fcmVhZCgpICYgR1BJT19GQU4pID8gRkFOX09OIDogRkFOX09GRjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IDUzZmRjN2YuLjMyYjhiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIFRoZSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciBkcml2ZXIuCiAgKiBUaGlzIGRyaXZlciBpcyBjbG9zZWx5IG1vZGVsbGVkIGFmdGVyIHRoZSBydGMuYyBkcml2ZXIuCi0gKiBodHRwOi8vd3d3LmludGVsLmNvbS9oYXJkd2FyZWRlc2lnbi9ocGV0c3BlYy5odG0KKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2hhcmR3YXJlZGVzaWduL2hwZXRzcGVjXzEucGRmCiAgKi8KICNkZWZpbmUJSFBFVF9VU0VSX0ZSRVEJKDY0KQogI2RlZmluZQlIUEVUX0RSSUZUCSg1MDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCmluZGV4IGZiNTdmNjcuLjA1ODdiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCkBAIC02OTUsNiArNjk1LDcgQEAKIAlocC0+d3MgPSB3czsKIAlzY2hlZHVsZV93b3JrKCZocC0+dHR5X3Jlc2l6ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChodmNfcmVzaXplKTsKIAogLyoKICAqIFRoaXMga3RocmVhZCBpcyBlaXRoZXIgcG9sbGluZyBvciBpbnRlcnJ1cHQgZHJpdmVuLiAgVGhpcyBpcyBkZXRlcm1pbmVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbndmbGFzaC5jIGIvZHJpdmVycy9jaGFyL253Zmxhc2guYwppbmRleCAwMDZiZTkyLi44YzdkZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbndmbGFzaC5jCisrKyBiL2RyaXZlcnMvY2hhci9ud2ZsYXNoLmMKQEAgLTU4LDggKzU4LDYgQEAKIHN0YXRpYyBpbnQgZ2JGbGFzaFNpemUgPSBLRkxBU0hfU0laRTsKIHN0YXRpYyBERUZJTkVfTVVURVgobndmbGFzaF9tdXRleCk7CiAKLWV4dGVybiBzcGlubG9ja190IGdwaW9fbG9jazsKLQogc3RhdGljIGludCBnZXRfZmxhc2hfaWQodm9pZCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgYzEsIGMyOwpAQCAtNjE2LDkgKzYxNCw5IEBACiAJICogd2Ugd2FudCB0byB3cml0ZSBhIGJpdCBwYXR0ZXJuIFhYWDEgdG8gWGlsaW54IHRvIGVuYWJsZQogCSAqIHRoZSB3cml0ZSBnYXRlLCB3aGljaCB3aWxsIGJlIG9wZW4gZm9yIGFib3V0IHRoZSBuZXh0IDJtcy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0JY3BsZF9tb2RpZnkoMSwgMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOworCW53X2NwbGRfbW9kaWZ5KENQTERfRkxBU0hfV1JfRU5BQkxFLCBDUExEX0ZMQVNIX1dSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbndfZ3Bpb19sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIGxldCB0aGUgSVNBIGJ1cyB0byBjYXRjaCBvbi4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IDY3NTA3NmYuLmQyNjg5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW5kb20uYworKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTU1OCwyMyArNTU4LDkgQEAKIAl1bnNpZ25lZCBkb250X2NvdW50X2VudHJvcHk6MTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqaXJxX3RpbWVyX3N0YXRlW05SX0lSUVNdOwotCi1zdGF0aWMgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKmdldF90aW1lcl9yYW5kX3N0YXRlKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSA+PSBucl9pcnFzKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBpcnFfdGltZXJfc3RhdGVbaXJxXTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3RpbWVyX3JhbmRfc3RhdGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlKQotewotCWlmIChpcnEgPj0gbnJfaXJxcykKLQkJcmV0dXJuOwotCi0JaXJxX3RpbWVyX3N0YXRlW2lycV0gPSBzdGF0ZTsKLX0KKyNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKK3N0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICppcnFfdGltZXJfc3RhdGVbTlJfSVJRU107CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlIGlucHV0X3RpbWVyX3N0YXRlOwogCkBAIC05MzMsOCArOTE5LDEwIEBACiB7CiAJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlOwogCisjaWZuZGVmIENPTkZJR19TUEFSU0VfSVJRCiAJaWYgKGlycSA+PSBucl9pcnFzKQogCQlyZXR1cm47CisjZW5kaWYKIAogCXN0YXRlID0gZ2V0X3RpbWVyX3JhbmRfc3RhdGUoaXJxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCAzZmIwZDJjLi5mZjZmNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtMTM4LDEyICsxMzgsMzMgQEAKIH0KIAogLyoKKyAqIHZpcnRpbyBjb25zb2xlIGNvbmZpZ3VyYXRpb24uIFRoaXMgc3VwcG9ydHM6CisgKiAtIGNvbnNvbGUgcmVzaXplCisgKi8KK3N0YXRpYyB2b2lkIHZpcnRjb25zX2FwcGx5X2NvbmZpZyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3aW5zaXplIHdzOworCisJaWYgKHZpcnRpb19oYXNfZmVhdHVyZShkZXYsIFZJUlRJT19DT05TT0xFX0ZfU0laRSkpIHsKKwkJZGV2LT5jb25maWctPmdldChkZXYsCisJCQkJIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fY29uc29sZV9jb25maWcsIGNvbHMpLAorCQkJCSAmd3Mud3NfY29sLCBzaXplb2YodTE2KSk7CisJCWRldi0+Y29uZmlnLT5nZXQoZGV2LAorCQkJCSBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29uZmlnLCByb3dzKSwKKwkJCQkgJndzLndzX3Jvdywgc2l6ZW9mKHUxNikpOworCQlodmNfcmVzaXplKGh2Yywgd3MpOworCX0KK30KKworLyoKICAqIHdlIHN1cHBvcnQgb25seSBvbmUgY29uc29sZSwgdGhlIGh2YyBzdHJ1Y3QgaXMgYSBnbG9iYWwgdmFyCi0gKiBUaGVyZSBpcyBubyBuZWVkIHRvIGRvIGFueXRoaW5nCisgKiBXZSBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gYXQgdGhpcyBwb2ludCwgc2luY2Ugd2Ugbm93IGhhdmUgYSB0dHkKICAqLwogc3RhdGljIGludCBub3RpZmllcl9hZGRfdmlvKHN0cnVjdCBodmNfc3RydWN0ICpocCwgaW50IGRhdGEpCiB7CiAJaHAtPmlycV9yZXF1ZXN0ZWQgPSAxOworCXZpcnRjb25zX2FwcGx5X2NvbmZpZyh2ZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMzQsMTEgKzI1NSwxOCBAQAogCXsgMCB9LAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBmZWF0dXJlc1tdID0geworCVZJUlRJT19DT05TT0xFX0ZfU0laRSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2RyaXZlciB2aXJ0aW9fY29uc29sZSA9IHsKKwkuZmVhdHVyZV90YWJsZSA9IGZlYXR1cmVzLAorCS5mZWF0dXJlX3RhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGZlYXR1cmVzKSwKIAkuZHJpdmVyLm5hbWUgPQlLQlVJTERfTU9ETkFNRSwKIAkuZHJpdmVyLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLmlkX3RhYmxlID0JaWRfdGFibGUsCiAJLnByb2JlID0JdmlydGNvbnNfcHJvYmUsCisJLmNvbmZpZ19jaGFuZ2VkID0gdmlydGNvbnNfYXBwbHlfY29uZmlnLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwppbmRleCBjMjAxNzEwLi5lMTEyOWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtNTcsMTEgKzU3LDYgQEAKIAlyZXR1cm4gdjI7CiB9CiAKLXN0YXRpYyBjeWNsZV90IGFjcGlfcG1fcmVhZF9zbG93KHZvaWQpCi17Ci0JcmV0dXJuIChjeWNsZV90KWFjcGlfcG1fcmVhZF92ZXJpZmllZCgpOwotfQotCiBzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWQodm9pZCkKIHsKIAlyZXR1cm4gKGN5Y2xlX3QpcmVhZF9wbXRtcigpOwpAQCAtODgsNiArODMsMTEgQEAKIH0KIF9fc2V0dXAoImFjcGlfcG1fZ29vZCIsIGFjcGlfcG1fZ29vZF9zZXR1cCk7CiAKK3N0YXRpYyBjeWNsZV90IGFjcGlfcG1fcmVhZF9zbG93KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KWFjcGlfcG1fcmVhZF92ZXJpZmllZCgpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wbV9uZWVkX3dvcmthcm91bmQodm9pZCkKIHsKIAljbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQgPSBhY3BpX3BtX3JlYWRfc2xvdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwppbmRleCA0YTU5N2Q4Li43OGI5ODlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCkBAIC01ODIsMyArNTgyLDE5IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkbWlfd2Fsayk7CisKKy8qKgorICogZG1pX21hdGNoIC0gY29tcGFyZSBhIHN0cmluZyB0byB0aGUgZG1pIGZpZWxkIChpZiBleGlzdHMpCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgZXF1YWxzIHRvIHRoZSBzdHIgKGluY2x1ZGluZyBOVUxMKS4KKyAqLworYm9vbCBkbWlfbWF0Y2goZW51bSBkbWlfZmllbGQgZiwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKmluZm8gPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKGYpOworCisJaWYgKGluZm8gPT0gTlVMTCB8fCBzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIGluZm8gPT0gc3RyOworCisJcmV0dXJuICFzdHJjbXAoaW5mbywgc3RyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtaV9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCmluZGV4IGE4YjMzYzIuLjUxMzBiNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCkBAIC03LDYgKzcsOCBAQAogbWVudWNvbmZpZyBEUk0KIAl0cmlzdGF0ZSAiRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VyIChYRnJlZTg2IDQuMS4wIGFuZCBoaWdoZXIgRFJJIHN1cHBvcnQpIgogCWRlcGVuZHMgb24gKEFHUCB8fCBBR1A9bikgJiYgUENJICYmICFFTVVMQVRFRF9DTVBYQ0hHICYmIE1NVQorCXNlbGVjdCBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKIAloZWxwCiAJICBLZXJuZWwtbGV2ZWwgc3VwcG9ydCBmb3IgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUgKERSSSkKIAkgIGludHJvZHVjZWQgaW4gWEZyZWU4NiA0LjAuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgbmVlZCB0byBzZWxlY3QKQEAgLTY1LDYgKzY3LDEwIEBACiAJICB3aWxsIGxvYWQgdGhlIGNvcnJlY3Qgb25lLgogCiBjb25maWcgRFJNX0k5MTUKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJZGVwZW5kcyBvbiBGQgogCXRyaXN0YXRlICJpOTE1IGRyaXZlciIKIAloZWxwCiAJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBzeXN0ZW0gdGhhdCBoYXMgSW50ZWwgODMwTSwgODQ1RywKQEAgLTc2LDYgKzgyLDE3IEBACiAKIGVuZGNob2ljZQogCitjb25maWcgRFJNX0k5MTVfS01TCisJYm9vbCAiRW5hYmxlIG1vZGVzZXR0aW5nIG9uIGludGVsIGJ5IGRlZmF1bHQiCisJZGVwZW5kcyBvbiBEUk1fSTkxNQorCWhlbHAKKwlDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQga2VybmVsIG1vZGVzZXR0aW5nIGVuYWJsZWQgYnkgZGVmYXVsdCwKKwlhbmQgeW91IGhhdmUgYSBuZXcgZW5vdWdoIHVzZXJzcGFjZSB0byBzdXBwb3J0IHRoaXMuIFJ1bm5pbmcgb2xkCisJdXNlcnNwYWNlcyB3aXRoIHRoaXMgZW5hYmxlZCB3aWxsIGNhdXNlIHBhaW4uICBOb3RlIHRoYXQgdGhpcyBjYXVzZXMKKwl0aGUgZHJpdmVyIHRvIGJpbmQgdG8gUENJIGRldmljZXMsIHdoaWNoIHByZWNsdWRlcyBsb2FkaW5nIHRoaW5ncworCWxpa2UgaW50ZWxmYi4KKworCiBjb25maWcgRFJNX01HQQogCXRyaXN0YXRlICJNYXRyb3ggZzIwMC9nNDAwIgogCWRlcGVuZHMgb24gRFJNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggNzRkYTk5NC4uMzAwMjJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtOSw3ICs5LDggQEAKIAkJZHJtX2Rydi5vIGRybV9mb3BzLm8gZHJtX2dlbS5vIGRybV9pb2N0bC5vIGRybV9pcnEubyBcCiAJCWRybV9sb2NrLm8gZHJtX21lbW9yeS5vIGRybV9wcm9jLm8gZHJtX3N0dWIubyBkcm1fdm0ubyBcCiAJCWRybV9hZ3BzdXBwb3J0Lm8gZHJtX3NjYXR0ZXIubyBhdGlfcGNpZ2FydC5vIGRybV9wY2kubyBcCi0JCWRybV9zeXNmcy5vIGRybV9oYXNodGFiLm8gZHJtX3NtYW4ubyBkcm1fbW0ubworCQlkcm1fc3lzZnMubyBkcm1faGFzaHRhYi5vIGRybV9zbWFuLm8gZHJtX21tLm8gXAorCQlkcm1fY3J0Yy5vIGRybV9jcnRjX2hlbHBlci5vIGRybV9tb2Rlcy5vIGRybV9lZGlkLm8KIAogZHJtLSQoQ09ORklHX0NPTVBBVCkgKz0gZHJtX2lvYzMyLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdXRoLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F1dGguYwppbmRleCBhNzM0NjI3Li5jYTdhOWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F1dGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F1dGguYwpAQCAtNDUsMTQgKzQ1LDE1IEBACiAgKiB0aGUgb25lIHdpdGggbWF0Y2hpbmcgbWFnaWMgbnVtYmVyLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKICAqIGxvY2suCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZHJtX2ZpbGUgKmRybV9maW5kX2ZpbGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQorc3RhdGljIHN0cnVjdCBkcm1fZmlsZSAqZHJtX2ZpbmRfZmlsZShzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKIAlzdHJ1Y3QgZHJtX2ZpbGUgKnJldHZhbCA9IE5VTEw7CiAJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQ7CiAJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1hc3Rlci0+bWlub3ItPmRldjsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoIWRybV9odF9maW5kX2l0ZW0oJmRldi0+bWFnaWNsaXN0LCAodW5zaWduZWQgbG9uZyltYWdpYywgJmhhc2gpKSB7CisJaWYgKCFkcm1faHRfZmluZF9pdGVtKCZtYXN0ZXItPm1hZ2ljbGlzdCwgKHVuc2lnbmVkIGxvbmcpbWFnaWMsICZoYXNoKSkgewogCQlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFnaWNfZW50cnksIGhhc2hfaXRlbSk7CiAJCXJldHZhbCA9IHB0LT5wcml2OwogCX0KQEAgLTcxLDExICs3MiwxMSBAQAogICogYXNzb2NpYXRlZCB0aGUgbWFnaWMgbnVtYmVyIGhhc2gga2V5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCwgd2hpbGUgaG9sZGluZwogICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgogICovCi1zdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIHByaXYsCitzdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGRybV9maWxlICpwcml2LAogCQkJIGRybV9tYWdpY190IG1hZ2ljKQogewogCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKmVudHJ5OwotCisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1hc3Rlci0+bWlub3ItPmRldjsKIAlEUk1fREVCVUcoIiVkXG4iLCBtYWdpYyk7CiAKIAllbnRyeSA9IGRybV9hbGxvYyhzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9NQUdJQyk7CkBAIC04MywxMSArODQsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CiAJZW50cnktPnByaXYgPSBwcml2OwotCiAJZW50cnktPmhhc2hfaXRlbS5rZXkgPSAodW5zaWduZWQgbG9uZyltYWdpYzsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZHJtX2h0X2luc2VydF9pdGVtKCZkZXYtPm1hZ2ljbGlzdCwgJmVudHJ5LT5oYXNoX2l0ZW0pOwotCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5oZWFkLCAmZGV2LT5tYWdpY2ZyZWUpOworCWRybV9odF9pbnNlcnRfaXRlbSgmbWFzdGVyLT5tYWdpY2xpc3QsICZlbnRyeS0+aGFzaF9pdGVtKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+aGVhZCwgJm1hc3Rlci0+bWFnaWNmcmVlKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwpAQCAtMTAyLDIwICsxMDIsMjEgQEAKICAqIFNlYXJjaGVzIGFuZCB1bmxpbmtzIHRoZSBlbnRyeSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3Qgd2l0aCB0aGUgbWFnaWMKICAqIG51bWJlciBoYXNoIGtleSwgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXN0YXRpYyBpbnQgZHJtX3JlbW92ZV9tYWdpYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgaW50IGRybV9yZW1vdmVfbWFnaWMoc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciwgZHJtX21hZ2ljX3QgbWFnaWMpCiB7CiAJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQ7CiAJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1hc3Rlci0+bWlub3ItPmRldjsKIAogCURSTV9ERUJVRygiJWRcbiIsIG1hZ2ljKTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmZGV2LT5tYWdpY2xpc3QsICh1bnNpZ25lZCBsb25nKW1hZ2ljLCAmaGFzaCkpIHsKKwlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmbWFzdGVyLT5tYWdpY2xpc3QsICh1bnNpZ25lZCBsb25nKW1hZ2ljLCAmaGFzaCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlwdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFnaWNfZW50cnksIGhhc2hfaXRlbSk7Ci0JZHJtX2h0X3JlbW92ZV9pdGVtKCZkZXYtPm1hZ2ljbGlzdCwgaGFzaCk7CisJZHJtX2h0X3JlbW92ZV9pdGVtKCZtYXN0ZXItPm1hZ2ljbGlzdCwgaGFzaCk7CiAJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtMTUzLDkgKzE1NCw5IEBACiAJCQkJKytzZXF1ZW5jZTsJLyogcmVzZXJ2ZSAwICovCiAJCQlhdXRoLT5tYWdpYyA9IHNlcXVlbmNlKys7CiAJCQlzcGluX3VubG9jaygmbG9jayk7Ci0JCX0gd2hpbGUgKGRybV9maW5kX2ZpbGUoZGV2LCBhdXRoLT5tYWdpYykpOworCQl9IHdoaWxlIChkcm1fZmluZF9maWxlKGZpbGVfcHJpdi0+bWFzdGVyLCBhdXRoLT5tYWdpYykpOwogCQlmaWxlX3ByaXYtPm1hZ2ljID0gYXV0aC0+bWFnaWM7Ci0JCWRybV9hZGRfbWFnaWMoZGV2LCBmaWxlX3ByaXYsIGF1dGgtPm1hZ2ljKTsKKwkJZHJtX2FkZF9tYWdpYyhmaWxlX3ByaXYtPm1hc3RlciwgZmlsZV9wcml2LCBhdXRoLT5tYWdpYyk7CiAJfQogCiAJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC0+bWFnaWMpOwpAQCAtMTgxLDkgKzE4Miw5IEBACiAJc3RydWN0IGRybV9maWxlICpmaWxlOwogCiAJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC0+bWFnaWMpOwotCWlmICgoZmlsZSA9IGRybV9maW5kX2ZpbGUoZGV2LCBhdXRoLT5tYWdpYykpKSB7CisJaWYgKChmaWxlID0gZHJtX2ZpbmRfZmlsZShmaWxlX3ByaXYtPm1hc3RlciwgYXV0aC0+bWFnaWMpKSkgewogCQlmaWxlLT5hdXRoZW50aWNhdGVkID0gMTsKLQkJZHJtX3JlbW92ZV9tYWdpYyhkZXYsIGF1dGgtPm1hZ2ljKTsKKwkJZHJtX3JlbW92ZV9tYWdpYyhmaWxlX3ByaXYtPm1hc3RlciwgYXV0aC0+bWFnaWMpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCmluZGV4IGJkZTY0YjguLjcyYzY2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCkBAIC01NCw5ICs1NCw5IEBACiB7CiAJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewotCQlpZiAoZW50cnktPm1hcCAmJiBtYXAtPnR5cGUgPT0gZW50cnktPm1hcC0+dHlwZSAmJgorCQlpZiAoZW50cnktPm1hcCAmJiAoZW50cnktPm1hc3RlciA9PSBkZXYtPnByaW1hcnktPm1hc3RlcikgJiYgKG1hcC0+dHlwZSA9PSBlbnRyeS0+bWFwLT50eXBlKSAmJgogCQkgICAgKChlbnRyeS0+bWFwLT5vZmZzZXQgPT0gbWFwLT5vZmZzZXQpIHx8Ci0JCSAgICAgKG1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJiBtYXAtPmZsYWdzPT1fRFJNX0NPTlRBSU5TX0xPQ0spKSkgeworCQkgICAgICgobWFwLT50eXBlID09IF9EUk1fU0hNKSAmJiAobWFwLT5mbGFncyZfRFJNX0NPTlRBSU5TX0xPQ0spKSkpIHsKIAkJCXJldHVybiBlbnRyeTsKIAkJfQogCX0KQEAgLTIxMCwxMiArMjEwLDEyIEBACiAJCW1hcC0+b2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpbWFwLT5oYW5kbGU7CiAJCWlmIChtYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSB7CiAJCQkvKiBQcmV2ZW50IGEgMm5kIFggU2VydmVyIGZyb20gY3JlYXRpbmcgYSAybmQgbG9jayAqLwotCQkJaWYgKGRldi0+bG9jay5od19sb2NrICE9IE5VTEwpIHsKKwkJCWlmIChkZXYtPnByaW1hcnktPm1hc3Rlci0+bG9jay5od19sb2NrICE9IE5VTEwpIHsKIAkJCQl2ZnJlZShtYXAtPmhhbmRsZSk7CiAJCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KLQkJCWRldi0+c2lnZGF0YS5sb2NrID0gZGV2LT5sb2NrLmh3X2xvY2sgPSBtYXAtPmhhbmRsZTsJLyogUG9pbnRlciB0byBsb2NrICovCisJCQlkZXYtPnNpZ2RhdGEubG9jayA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5sb2NrLmh3X2xvY2sgPSBtYXAtPmhhbmRsZTsJLyogUG9pbnRlciB0byBsb2NrICovCiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBfRFJNX0FHUDogewpAQCAtMjYyLDYgKzI2Miw5IEBACiAJCURSTV9ERUJVRygiQUdQIG9mZnNldCA9IDB4JTA4bHgsIHNpemUgPSAweCUwOGx4XG4iLCBtYXAtPm9mZnNldCwgbWFwLT5zaXplKTsKIAogCQlicmVhazsKKwljYXNlIF9EUk1fR0VNOgorCQlEUk1fRVJST1IoInRyaWVkIHRvIHJtbWFwIEdFTSBvYmplY3RcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgogCQlpZiAoIWRldi0+c2cpIHsKQEAgLTMxOSw2ICszMjIsNyBAQAogCWxpc3QtPnVzZXJfdG9rZW4gPSBsaXN0LT5oYXNoLmtleSA8PCBQQUdFX1NISUZUOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCisJbGlzdC0+bWFzdGVyID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXI7CiAJKm1hcGxpc3QgPSBsaXN0OwogCXJldHVybiAwOwogCX0KQEAgLTM0NSw3ICszNDksNyBAQAogCXN0cnVjdCBkcm1fbWFwX2xpc3QgKm1hcGxpc3Q7CiAJaW50IGVycjsKIAotCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgbWFwLT50eXBlID09IF9EUk1fQUdQKSkKKwlpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG1hcC0+dHlwZSA9PSBfRFJNX0FHUCB8fCBtYXAtPnR5cGUgPT0gX0RSTV9TSE0pKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJZXJyID0gZHJtX2FkZG1hcF9jb3JlKGRldiwgbWFwLT5vZmZzZXQsIG1hcC0+c2l6ZSwgbWFwLT50eXBlLApAQCAtMzgwLDEwICszODQsMTIgQEAKIAlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3QgPSBOVUxMLCAqbGlzdF90OwogCWRybV9kbWFfaGFuZGxlX3QgZG1haDsKIAlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7CiAKIAkvKiBGaW5kIHRoZSBsaXN0IGVudHJ5IGZvciB0aGUgbWFwIGFuZCByZW1vdmUgaXQgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9saXN0LCBsaXN0X3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkgeworCQkJbWFzdGVyID0gcl9saXN0LT5tYXN0ZXI7CiAJCQlsaXN0X2RlbCgmcl9saXN0LT5oZWFkKTsKIAkJCWRybV9odF9yZW1vdmVfa2V5KCZkZXYtPm1hcF9oYXNoLAogCQkJCQkgIHJfbGlzdC0+dXNlcl90b2tlbiA+PiBQQUdFX1NISUZUKTsKQEAgLTQwOSw2ICs0MTUsMTMgQEAKIAkJYnJlYWs7CiAJY2FzZSBfRFJNX1NITToKIAkJdmZyZWUobWFwLT5oYW5kbGUpOworCQlpZiAobWFzdGVyKSB7CisJCQlpZiAoZGV2LT5zaWdkYXRhLmxvY2sgPT0gbWFzdGVyLT5sb2NrLmh3X2xvY2spCisJCQkJZGV2LT5zaWdkYXRhLmxvY2sgPSBOVUxMOworCQkJbWFzdGVyLT5sb2NrLmh3X2xvY2sgPSBOVUxMOyAgIC8qIFNITSByZW1vdmVkICovCisJCQltYXN0ZXItPmxvY2suZmlsZV9wcml2ID0gTlVMTDsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWFzdGVyLT5sb2NrLmxvY2tfcXVldWUpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgX0RSTV9BR1A6CiAJY2FzZSBfRFJNX1NDQVRURVJfR0FUSEVSOgpAQCAtNDE5LDExICs0MzIsMTUgQEAKIAkJZG1haC5zaXplID0gbWFwLT5zaXplOwogCQlfX2RybV9wY2lfZnJlZShkZXYsICZkbWFoKTsKIAkJYnJlYWs7CisJY2FzZSBfRFJNX0dFTToKKwkJRFJNX0VSUk9SKCJ0cmllZCB0byBybW1hcCBHRU0gb2JqZWN0XG4iKTsKKwkJYnJlYWs7CiAJfQogCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX01BUFMpOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRybV9ybW1hcF9sb2NrZWQpOwogCiBpbnQgZHJtX3JtbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NvbnRleHQuYwppbmRleCBkNTA1ZjY5Li44MDllYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NvbnRleHQuYwpAQCAtMjU2LDEyICsyNTYsMTMgQEAKICAqIGhhcmR3YXJlIGxvY2sgaXMgaGVsZCwgY2xlYXJzIHRoZSBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcgYW5kIHdha2VzIHVwCiAgKiBkcm1fZGV2aWNlOjpjb250ZXh0X3dhaXQuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbmV3KQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIGludCBuZXcpCiB7CiAJZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7CS8qIFBSRS9QT1NUOiBUaGlzIGlzIHRoZSBfb25seV8gd3JpdGVyLiAqLwogCWRldi0+bGFzdF9zd2l0Y2ggPSBqaWZmaWVzOwogCi0JaWYgKCFfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykpIHsKKwlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmh3X2xvY2stPmxvY2spKSB7CiAJCURSTV9FUlJPUigiTG9jayBpc24ndCBoZWxkIGFmdGVyIGNvbnRleHQgc3dpdGNoXG4iKTsKIAl9CiAKQEAgLTQyMCw3ICs0MjEsNyBAQAogCXN0cnVjdCBkcm1fY3R4ICpjdHggPSBkYXRhOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LT5oYW5kbGUpOwotCWRybV9jb250ZXh0X3N3aXRjaF9jb21wbGV0ZShkZXYsIGN0eC0+aGFuZGxlKTsKKwlkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZGV2LCBmaWxlX3ByaXYsIGN0eC0+aGFuZGxlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQyLDkgKzQ0Myw2IEBACiAJc3RydWN0IGRybV9jdHggKmN0eCA9IGRhdGE7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBjdHgtPmhhbmRsZSk7Ci0JaWYgKGN0eC0+aGFuZGxlID09IERSTV9LRVJORUxfQ09OVEVYVCArIDEpIHsKLQkJZmlsZV9wcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9IDE7Ci0JfQogCWlmIChjdHgtPmhhbmRsZSAhPSBEUk1fS0VSTkVMX0NPTlRFWFQpIHsKIAkJaWYgKGRldi0+ZHJpdmVyLT5jb250ZXh0X2R0b3IpCiAJCQlkZXYtPmRyaXZlci0+Y29udGV4dF9kdG9yKGRldiwgY3R4LT5oYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTAsMCArMSwyNDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNyBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0IEluYy4KKyAqCisgKiBEUk0gY29yZSBDUlRDIHJlbGF0ZWQgZnVuY3Rpb25zCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAorICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgICBLZWl0aCBQYWNrYXJkCisgKglFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICogICAgICBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqICAgICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorCitzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IHsKKwlpbnQgdHlwZTsKKwljaGFyICpuYW1lOworfTsKKworLyogQXZvaWQgYm9pbGVycGxhdGUuICBJJ20gdGlyZWQgb2YgdHlwaW5nLiAqLworI2RlZmluZSBEUk1fRU5VTV9OQU1FX0ZOKGZubmFtZSwgbGlzdCkJCQkJXAorCWNoYXIgKmZubmFtZShpbnQgdmFsKQkJCQkJXAorCXsJCQkJCQkJXAorCQlpbnQgaTsJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpc3QpOyBpKyspIHsJXAorCQkJaWYgKGxpc3RbaV0udHlwZSA9PSB2YWwpCQlcCisJCQkJcmV0dXJuIGxpc3RbaV0ubmFtZTsJCVwKKwkJfQkJCQkJCVwKKwkJcmV0dXJuICIodW5rbm93bikiOwkJCQlcCisJfQorCisvKgorICogR2xvYmFsIHByb3BlcnRpZXMKKyAqLworc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2RwbXNfZW51bV9saXN0W10gPQorewl7IERSTV9NT0RFX0RQTVNfT04sICJPbiIgfSwKKwl7IERSTV9NT0RFX0RQTVNfU1RBTkRCWSwgIlN0YW5kYnkiIH0sCisJeyBEUk1fTU9ERV9EUE1TX1NVU1BFTkQsICJTdXNwZW5kIiB9LAorCXsgRFJNX01PREVfRFBNU19PRkYsICJPZmYiIH0KK307CisKK0RSTV9FTlVNX05BTUVfRk4oZHJtX2dldF9kcG1zX25hbWUsIGRybV9kcG1zX2VudW1fbGlzdCkKKworLyoKKyAqIE9wdGlvbmFsIHByb3BlcnRpZXMKKyAqLworc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX3NjYWxpbmdfbW9kZV9lbnVtX2xpc3RbXSA9Cit7CisJeyBEUk1fTU9ERV9TQ0FMRV9OT05fR1BVLCAiTm9uLUdQVSIgfSwKKwl7IERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4sICJGdWxsc2NyZWVuIiB9LAorCXsgRFJNX01PREVfU0NBTEVfTk9fU0NBTEUsICJObyBzY2FsZSIgfSwKKwl7IERSTV9NT0RFX1NDQUxFX0FTUEVDVCwgIkFzcGVjdCIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IGRybV9kaXRoZXJpbmdfbW9kZV9lbnVtX2xpc3RbXSA9Cit7CisJeyBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGLCAiT2ZmIiB9LAorCXsgRFJNX01PREVfRElUSEVSSU5HX09OLCAiT24iIH0sCit9OworCisvKgorICogTm9uLWdsb2JhbCBwcm9wZXJ0aWVzLCBidXQgInJlcXVpcmVkIiBmb3IgY2VydGFpbiBjb25uZWN0b3JzLgorICovCitzdGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fZHZpX2lfc2VsZWN0X2VudW1fbGlzdFtdID0KK3sKKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9BdXRvbWF0aWMsICJBdXRvbWF0aWMiIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklELCAgICAgICJEVkktRCIgICAgIH0sIC8qIERWSS1JICAqLworCXsgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEsICAgICAgIkRWSS1BIiAgICAgfSwgLyogRFZJLUkgICovCit9OworCitEUk1fRU5VTV9OQU1FX0ZOKGRybV9nZXRfZHZpX2lfc2VsZWN0X25hbWUsIGRybV9kdmlfaV9zZWxlY3RfZW51bV9saXN0KQorCitzdGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fZHZpX2lfc3ViY29ubmVjdG9yX2VudW1fbGlzdFtdID0KK3sKKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duLCAgICJVbmtub3duIiAgIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9EVklELCAgICAgICJEVkktRCIgICAgIH0sIC8qIERWSS1JICAqLworCXsgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUEsICAgICAgIkRWSS1BIiAgICAgfSwgLyogRFZJLUkgICovCit9OworCitEUk1fRU5VTV9OQU1FX0ZOKGRybV9nZXRfZHZpX2lfc3ViY29ubmVjdG9yX25hbWUsCisJCSBkcm1fZHZpX2lfc3ViY29ubmVjdG9yX2VudW1fbGlzdCkKKworc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX3R2X3NlbGVjdF9lbnVtX2xpc3RbXSA9Cit7CisJeyBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQXV0b21hdGljLCAiQXV0b21hdGljIiB9LCAvKiBEVkktSSBhbmQgVFYtb3V0ICovCisJeyBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlLCAiQ29tcG9zaXRlIiB9LCAvKiBUVi1vdXQgKi8KKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU8sICAgICJTVklERU8iICAgIH0sIC8qIFRWLW91dCAqLworCXsgRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvbmVudCwgIkNvbXBvbmVudCIgfSwgLyogVFYtb3V0ICovCit9OworCitEUk1fRU5VTV9OQU1FX0ZOKGRybV9nZXRfdHZfc2VsZWN0X25hbWUsIGRybV90dl9zZWxlY3RfZW51bV9saXN0KQorCitzdGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fdHZfc3ViY29ubmVjdG9yX2VudW1fbGlzdFtdID0KK3sKKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duLCAgICJVbmtub3duIiAgIH0sIC8qIERWSS1JIGFuZCBUVi1vdXQgKi8KKwl7IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGUsICJDb21wb3NpdGUiIH0sIC8qIFRWLW91dCAqLworCXsgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTywgICAgIlNWSURFTyIgICAgfSwgLyogVFYtb3V0ICovCisJeyBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9uZW50LCAiQ29tcG9uZW50IiB9LCAvKiBUVi1vdXQgKi8KK307CisKK0RSTV9FTlVNX05BTUVfRk4oZHJtX2dldF90dl9zdWJjb25uZWN0b3JfbmFtZSwKKwkJIGRybV90dl9zdWJjb25uZWN0b3JfZW51bV9saXN0KQorCitzdHJ1Y3QgZHJtX2Nvbm5fcHJvcF9lbnVtX2xpc3QgeworCWludCB0eXBlOworCWNoYXIgKm5hbWU7CisJaW50IGNvdW50OworfTsKKworLyoKKyAqIENvbm5lY3RvciBhbmQgZW5jb2RlciB0eXBlcy4KKyAqLworc3RhdGljIHN0cnVjdCBkcm1fY29ubl9wcm9wX2VudW1fbGlzdCBkcm1fY29ubmVjdG9yX2VudW1fbGlzdFtdID0KK3sJeyBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93biwgIlVua25vd24iLCAwIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfVkdBLCAiVkdBIiwgMCB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0RWSUksICJEVkktSSIsIDAgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklELCAiRFZJLUQiLCAwIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfRFZJQSwgIkRWSS1BIiwgMCB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZSwgIkNvbXBvc2l0ZSIsIDAgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU8sICJTVklERU8iLCAwIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUywgIkxWRFMiLCAwIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9uZW50LCAiQ29tcG9uZW50IiwgMCB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU4sICI5LXBpbiBESU4iLCAwIH0sCisJeyBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQsICJEaXNwbGF5UG9ydCIsIDAgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSwgIkhETUkgVHlwZSBBIiwgMCB9LAorCXsgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCLCAiSERNSSBUeXBlIEIiLCAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBkcm1fZW5jb2Rlcl9lbnVtX2xpc3RbXSA9Cit7CXsgRFJNX01PREVfRU5DT0RFUl9OT05FLCAiTm9uZSIgfSwKKwl7IERSTV9NT0RFX0VOQ09ERVJfREFDLCAiREFDIiB9LAorCXsgRFJNX01PREVfRU5DT0RFUl9UTURTLCAiVE1EUyIgfSwKKwl7IERSTV9NT0RFX0VOQ09ERVJfTFZEUywgIkxWRFMiIH0sCisJeyBEUk1fTU9ERV9FTkNPREVSX1RWREFDLCAiVFYiIH0sCit9OworCitjaGFyICpkcm1fZ2V0X2VuY29kZXJfbmFtZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCXNucHJpbnRmKGJ1ZiwgMzIsICIlcy0lZCIsCisJCSBkcm1fZW5jb2Rlcl9lbnVtX2xpc3RbZW5jb2Rlci0+ZW5jb2Rlcl90eXBlXS5uYW1lLAorCQkgZW5jb2Rlci0+YmFzZS5pZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqZHJtX2dldF9jb25uZWN0b3JfbmFtZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKwlzbnByaW50ZihidWYsIDMyLCAiJXMtJWQiLAorCQkgZHJtX2Nvbm5lY3Rvcl9lbnVtX2xpc3RbY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV0ubmFtZSwKKwkJIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGVfaWQpOworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfY29ubmVjdG9yX25hbWUpOworCitjaGFyICpkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cykKK3sKKwlpZiAoc3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkKQorCQlyZXR1cm4gImNvbm5lY3RlZCI7CisJZWxzZSBpZiAoc3RhdHVzID09IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkKQorCQlyZXR1cm4gImRpc2Nvbm5lY3RlZCI7CisJZWxzZQorCQlyZXR1cm4gInVua25vd24iOworfQorCisvKioKKyAqIGRybV9tb2RlX29iamVjdF9nZXQgLSBhbGxvY2F0ZSBhIG5ldyBpZGVudGlmaWVyCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAcHRyOiBvYmplY3QgcG9pbnRlciwgdXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSUQKKyAqIEB0eXBlOiBvYmplY3QgdHlwZQorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIERSTSBtb2RlX2NvbmZpZyBsb2NrLgorICoKKyAqIENyZWF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGJhc2VkIG9uIEBwdHIgaW4gQGRldidzIGlkZW50aWZpZXIgc3BhY2UuICBVc2VkCisgKiBmb3IgdHJhY2tpbmcgbW9kZXMsIENSVENzIGFuZCBjb25uZWN0b3JzLgorICoKKyAqIFJFVFVSTlM6CisgKiBOZXcgdW5pcXVlIChyZWxhdGl2ZSB0byBvdGhlciBvYmplY3RzIGluIEBkZXYpIGludGVnZXIgaWRlbnRpZmllciBmb3IgdGhlCisgKiBvYmplY3QuCisgKi8KK3N0YXRpYyBpbnQgZHJtX21vZGVfb2JqZWN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iaiwgdWludDMyX3Qgb2JqX3R5cGUpCit7CisJaW50IG5ld19pZCA9IDA7CisJaW50IHJldDsKKworCVdBUk4oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCksCisJICAgICAiJXMgY2FsbGVkIHcvbyBtb2RlX2NvbmZpZyBsb2NrXG4iLCBfX0ZVTkNUSU9OX18pOworYWdhaW46CisJaWYgKGlkcl9wcmVfZ2V0KCZkZXYtPm1vZGVfY29uZmlnLmNydGNfaWRyLCBHRlBfS0VSTkVMKSA9PSAwKSB7CisJCURSTV9FUlJPUigiUmFuIG91dCBtZW1vcnkgZ2V0dGluZyBhIG1vZGUgbnVtYmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmRldi0+bW9kZV9jb25maWcuY3J0Y19pZHIsIG9iaiwgMSwgJm5ld19pZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlnb3RvIGFnYWluOworCisJb2JqLT5pZCA9IG5ld19pZDsKKwlvYmotPnR5cGUgPSBvYmpfdHlwZTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9vYmplY3RfcHV0IC0gZnJlZSBhbiBpZGVudGlmZXIKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBpZDogSUQgdG8gZnJlZQorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIERSTSBtb2RlX2NvbmZpZyBsb2NrLgorICoKKyAqIEZyZWUgQGlkIGZyb20gQGRldidzIHVuaXF1ZSBpZGVudGlmaWVyIHBvb2wuCisgKi8KK3N0YXRpYyB2b2lkIGRybV9tb2RlX29iamVjdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmplY3QpCit7CisJaWRyX3JlbW92ZSgmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2lkciwgb2JqZWN0LT5pZCk7Cit9CisKK3ZvaWQgKmRybV9tb2RlX29iamVjdF9maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGlkLCB1aW50MzJfdCB0eXBlKQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKworCW9iaiA9IGlkcl9maW5kKCZkZXYtPm1vZGVfY29uZmlnLmNydGNfaWRyLCBpZCk7CisJaWYgKCFvYmogfHwgKG9iai0+dHlwZSAhPSB0eXBlKSB8fCAob2JqLT5pZCAhPSBpZCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIG9iajsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfb2JqZWN0X2ZpbmQpOworCisvKioKKyAqIGRybV9jcnRjX2Zyb21fZmIgLSBmaW5kIHRoZSBDUlRDIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYW4gZmIKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBmYjogZnJhbWVidWZmZXIgaW4gcXVlc3Rpb24KKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBtb2RlX2NvbmZpZyBsb2NrLgorICoKKyAqIEZpbmQgQ1JUQyBpbiB0aGUgbW9kZV9jb25maWcgc3RydWN0dXJlIHRoYXQgbWF0Y2hlcyBAZmIuCisgKgorICogUkVUVVJOUzoKKyAqIFBvaW50ZXIgdG8gdGhlIENSVEMgb3IgTlVMTCBpZiBpdCB3YXNuJ3QgZm91bmQuCisgKi8KK3N0cnVjdCBkcm1fY3J0YyAqZHJtX2NydGNfZnJvbV9mYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNydGMtPmZiID09IGZiKQorCQkJcmV0dXJuIGNydGM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGRybV9mcmFtZWJ1ZmZlcl9pbml0IC0gaW5pdGlhbGl6ZSBhIGZyYW1lYnVmZmVyCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBBbGxvY2F0ZXMgYW4gSUQgZm9yIHRoZSBmcmFtZWJ1ZmZlcidzIHBhcmVudCBtb2RlIG9iamVjdCwgc2V0cyBpdHMgbW9kZQorICogZnVuY3Rpb25zICYgZGV2aWNlIGZpbGUgYW5kIGFkZHMgaXQgdG8gdGhlIG1hc3RlciBmZCBsaXN0LgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZmFsdXJlLgorICovCitpbnQgZHJtX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyAqZnVuY3MpCit7CisJaW50IHJldDsKKworCXJldCA9IGRybV9tb2RlX29iamVjdF9nZXQoZGV2LCAmZmItPmJhc2UsIERSTV9NT0RFX09CSkVDVF9GQik7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWZiLT5kZXYgPSBkZXY7CisJZmItPmZ1bmNzID0gZnVuY3M7CisJZGV2LT5tb2RlX2NvbmZpZy5udW1fZmIrKzsKKwlsaXN0X2FkZCgmZmItPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLmZiX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9mcmFtZWJ1ZmZlcl9pbml0KTsKKworLyoqCisgKiBkcm1fZnJhbWVidWZmZXJfY2xlYW51cCAtIHJlbW92ZSBhIGZyYW1lYnVmZmVyIG9iamVjdAorICogQGZiOiBmcmFtZWJ1ZmZlciB0byByZW1vdmUKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBtb2RlIGNvbmZpZyBsb2NrLgorICoKKyAqIFNjYW5zIGFsbCB0aGUgQ1JUQ3MgaW4gQGRldidzIG1vZGVfY29uZmlnLiAgSWYgdGhleSdyZSB1c2luZyBAZmIsIHJlbW92ZXMKKyAqIGl0LCBzZXR0aW5nIGl0IHRvIE5VTEwuCisgKi8KK3ZvaWQgZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZiLT5kZXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCisJLyogcmVtb3ZlIGZyb20gYW55IENSVEMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAoY3J0Yy0+ZmIgPT0gZmIpCisJCQljcnRjLT5mYiA9IE5VTEw7CisJfQorCisJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZmYi0+YmFzZSk7CisJbGlzdF9kZWwoJmZiLT5oZWFkKTsKKwlkZXYtPm1vZGVfY29uZmlnLm51bV9mYi0tOworfQorRVhQT1JUX1NZTUJPTChkcm1fZnJhbWVidWZmZXJfY2xlYW51cCk7CisKKy8qKgorICogZHJtX2NydGNfaW5pdCAtIEluaXRpYWxpc2UgYSBuZXcgQ1JUQyBvYmplY3QKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiBDUlRDIG9iamVjdCB0byBpbml0CisgKiBAZnVuY3M6IGNhbGxiYWNrcyBmb3IgdGhlIG5ldyBDUlRDCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBJbml0cyBhIG5ldyBvYmplY3QgY3JlYXRlZCBhcyBiYXNlIHBhcnQgb2YgYW4gZHJpdmVyIGNydGMgb2JqZWN0LgorICovCit2b2lkIGRybV9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgKmZ1bmNzKQoreworCWNydGMtPmRldiA9IGRldjsKKwljcnRjLT5mdW5jcyA9IGZ1bmNzOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVfb2JqZWN0X2dldChkZXYsICZjcnRjLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisKKwlsaXN0X2FkZF90YWlsKCZjcnRjLT5oZWFkLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QpOworCWRldi0+bW9kZV9jb25maWcubnVtX2NydGMrKzsKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChkcm1fY3J0Y19pbml0KTsKKworLyoqCisgKiBkcm1fY3J0Y19jbGVhbnVwIC0gQ2xlYW5zIHVwIHRoZSBjb3JlIGNydGMgdXNhZ2UuCisgKiBAY3J0YzogQ1JUQyB0byBjbGVhbnVwCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBDbGVhbnVwIEBjcnRjLiBSZW1vdmVzIGZyb20gZHJtIG1vZGVzZXR0aW5nIHNwYWNlCisgKiBkb2VzIE5PVCBmcmVlIG9iamVjdCwgY2FsbGVyIGRvZXMgdGhhdC4KKyAqLwordm9pZCBkcm1fY3J0Y19jbGVhbnVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCisJaWYgKGNydGMtPmdhbW1hX3N0b3JlKSB7CisJCWtmcmVlKGNydGMtPmdhbW1hX3N0b3JlKTsKKwkJY3J0Yy0+Z2FtbWFfc3RvcmUgPSBOVUxMOworCX0KKworCWRybV9tb2RlX29iamVjdF9wdXQoZGV2LCAmY3J0Yy0+YmFzZSk7CisJbGlzdF9kZWwoJmNydGMtPmhlYWQpOworCWRldi0+bW9kZV9jb25maWcubnVtX2NydGMtLTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfY2xlYW51cCk7CisKKy8qKgorICogZHJtX21vZGVfcHJvYmVkX2FkZCAtIGFkZCBhIG1vZGUgdG8gYSBjb25uZWN0b3IncyBwcm9iZWQgbW9kZSBsaXN0CisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdGhlIG5ldyBtb2RlCisgKiBAbW9kZTogbW9kZSBkYXRhCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBBZGQgQG1vZGUgdG8gQGNvbm5lY3RvcidzIG1vZGUgbGlzdCBmb3IgbGF0ZXIgdXNlLgorICovCit2b2lkIGRybV9tb2RlX3Byb2JlZF9hZGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlsaXN0X2FkZCgmbW9kZS0+aGVhZCwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfcHJvYmVkX2FkZCk7CisKKy8qKgorICogZHJtX21vZGVfcmVtb3ZlIC0gcmVtb3ZlIGFuZCBmcmVlIGEgbW9kZQorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIGxpc3QgdG8gbW9kaWZ5CisgKiBAbW9kZTogbW9kZSB0byByZW1vdmUKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBtb2RlIGNvbmZpZyBsb2NrLgorICoKKyAqIFJlbW92ZSBAbW9kZSBmcm9tIEBjb25uZWN0b3IncyBtb2RlIGxpc3QsIHRoZW4gZnJlZSBpdC4KKyAqLwordm9pZCBkcm1fbW9kZV9yZW1vdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlsaXN0X2RlbCgmbW9kZS0+aGVhZCk7CisJa2ZyZWUobW9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX3JlbW92ZSk7CisKKy8qKgorICogZHJtX2Nvbm5lY3Rvcl9pbml0IC0gSW5pdCBhIHByZWFsbG9jYXRlZCBjb25uZWN0b3IKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjb25uZWN0b3I6IHRoZSBjb25uZWN0b3IgdG8gaW5pdAorICogQGZ1bmNzOiBjYWxsYmFja3MgZm9yIHRoaXMgY29ubmVjdG9yCisgKiBAbmFtZTogdXNlciB2aXNpYmxlIG5hbWUgb2YgdGhlIGNvbm5lY3RvcgorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIEBkZXYncyBtb2RlX2NvbmZpZyBsb2NrLgorICoKKyAqIEluaXRpYWxpc2VzIGEgcHJlYWxsb2NhdGVkIGNvbm5lY3Rvci4gQ29ubmVjdG9ycyBzaG91bGQgYmUKKyAqIHN1YmNsYXNzZWQgYXMgcGFydCBvZiBkcml2ZXIgY29ubmVjdG9yIG9iamVjdHMuCisgKi8KK3ZvaWQgZHJtX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyAqZnVuY3MsCisJCSAgICAgaW50IGNvbm5lY3Rvcl90eXBlKQoreworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJY29ubmVjdG9yLT5kZXYgPSBkZXY7CisJY29ubmVjdG9yLT5mdW5jcyA9IGZ1bmNzOworCWRybV9tb2RlX29iamVjdF9nZXQoZGV2LCAmY29ubmVjdG9yLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKKwljb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID0gY29ubmVjdG9yX3R5cGU7CisJY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZV9pZCA9CisJCSsrZHJtX2Nvbm5lY3Rvcl9lbnVtX2xpc3RbY29ubmVjdG9yX3R5cGVdLmNvdW50OyAvKiBUT0RPICovCisJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rvci0+dXNlcl9tb2Rlcyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29ubmVjdG9yLT5tb2Rlcyk7CisJY29ubmVjdG9yLT5lZGlkX2Jsb2JfcHRyID0gTlVMTDsKKworCWxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rvci0+aGVhZCwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QpOworCWRldi0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3RvcisrOworCisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCSAgICAgIGRldi0+bW9kZV9jb25maWcuZWRpZF9wcm9wZXJ0eSwgMCk7CisKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJICAgICAgZGV2LT5tb2RlX2NvbmZpZy5kcG1zX3Byb3BlcnR5LCAwKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jb25uZWN0b3JfaW5pdCk7CisKKy8qKgorICogZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwIC0gY2xlYW5zIHVwIGFuIGluaXRpYWxpc2VkIGNvbm5lY3RvcgorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHRvIGNsZWFudXAKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBAZGV2J3MgbW9kZV9jb25maWcgbG9jay4KKyAqCisgKiBDbGVhbnMgdXAgdGhlIGNvbm5lY3RvciBidXQgZG9lc24ndCBmcmVlIHRoZSBvYmplY3QuCisgKi8KK3ZvaWQgZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0LCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsIGhlYWQpCisJCWRybV9tb2RlX3JlbW92ZShjb25uZWN0b3IsIG1vZGUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZGUsIHQsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKQorCQlkcm1fbW9kZV9yZW1vdmUoY29ubmVjdG9yLCBtb2RlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0LCAmY29ubmVjdG9yLT51c2VyX21vZGVzLCBoZWFkKQorCQlkcm1fbW9kZV9yZW1vdmUoY29ubmVjdG9yLCBtb2RlKTsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9tb2RlX29iamVjdF9wdXQoZGV2LCAmY29ubmVjdG9yLT5iYXNlKTsKKwlsaXN0X2RlbCgmY29ubmVjdG9yLT5oZWFkKTsKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChkcm1fY29ubmVjdG9yX2NsZWFudXApOworCit2b2lkIGRybV9lbmNvZGVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgKmZ1bmNzLAorCQkgICAgICBpbnQgZW5jb2Rlcl90eXBlKQoreworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJZW5jb2Rlci0+ZGV2ID0gZGV2OworCisJZHJtX21vZGVfb2JqZWN0X2dldChkZXYsICZlbmNvZGVyLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUik7CisJZW5jb2Rlci0+ZW5jb2Rlcl90eXBlID0gZW5jb2Rlcl90eXBlOworCWVuY29kZXItPmZ1bmNzID0gZnVuY3M7CisKKwlsaXN0X2FkZF90YWlsKCZlbmNvZGVyLT5oZWFkLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QpOworCWRldi0+bW9kZV9jb25maWcubnVtX2VuY29kZXIrKzsKKworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9lbmNvZGVyX2luaXQpOworCit2b2lkIGRybV9lbmNvZGVyX2NsZWFudXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZlbmNvZGVyLT5iYXNlKTsKKwlsaXN0X2RlbCgmZW5jb2Rlci0+aGVhZCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2VuY29kZXJfY2xlYW51cCk7CisKKy8qKgorICogZHJtX21vZGVfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IGRpc3BsYXkgbW9kZQorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIERSTSBtb2RlX2NvbmZpZyBsb2NrLgorICoKKyAqIENyZWF0ZSBhIG5ldyBkcm1fZGlzcGxheV9tb2RlLCBnaXZlIGl0IGFuIElELCBhbmQgcmV0dXJuIGl0LgorICoKKyAqIFJFVFVSTlM6CisgKiBQb2ludGVyIHRvIG5ldyBtb2RlIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IuCisgKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbm1vZGU7CisKKwlubW9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFubW9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkcm1fbW9kZV9vYmplY3RfZ2V0KGRldiwgJm5tb2RlLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfTU9ERSk7CisJcmV0dXJuIG5tb2RlOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9jcmVhdGUpOworCisvKioKKyAqIGRybV9tb2RlX2Rlc3Ryb3kgLSByZW1vdmUgYSBtb2RlCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAbW9kZTogbW9kZSB0byByZW1vdmUKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBtb2RlIGNvbmZpZyBsb2NrLgorICoKKyAqIEZyZWUgQG1vZGUncyB1bmlxdWUgaWRlbnRpZmllciwgdGhlbiBmcmVlIGl0LgorICovCit2b2lkIGRybV9tb2RlX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZtb2RlLT5iYXNlKTsKKworCWtmcmVlKG1vZGUpOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9kZXN0cm95KTsKKworc3RhdGljIGludCBkcm1fbW9kZV9jcmVhdGVfc3RhbmRhcmRfY29ubmVjdG9yX3Byb3BlcnRpZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICplZGlkOworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmRwbXM7CisJaW50IGk7CisKKwkvKgorCSAqIFN0YW5kYXJkIHByb3BlcnRpZXMgKGFwcGx5IHRvIGFsbCBjb25uZWN0b3JzKQorCSAqLworCWVkaWQgPSBkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9CTE9CIHwKKwkJCQkgICBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSwKKwkJCQkgICAiRURJRCIsIDApOworCWRldi0+bW9kZV9jb25maWcuZWRpZF9wcm9wZXJ0eSA9IGVkaWQ7CisKKwlkcG1zID0gZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSwKKwkJCQkgICAiRFBNUyIsIEFSUkFZX1NJWkUoZHJtX2RwbXNfZW51bV9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJtX2RwbXNfZW51bV9saXN0KTsgaSsrKQorCQlkcm1fcHJvcGVydHlfYWRkX2VudW0oZHBtcywgaSwgZHJtX2RwbXNfZW51bV9saXN0W2ldLnR5cGUsCisJCQkJICAgICAgZHJtX2RwbXNfZW51bV9saXN0W2ldLm5hbWUpOworCWRldi0+bW9kZV9jb25maWcuZHBtc19wcm9wZXJ0eSA9IGRwbXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9jcmVhdGVfZHZpX2lfcHJvcGVydGllcyAtIGNyZWF0ZSBEVkktSSBzcGVjaWZpYyBjb25uZWN0b3IgcHJvcGVydGllcworICogQGRldjogRFJNIGRldmljZQorICoKKyAqIENhbGxlZCBieSBhIGRyaXZlciB0aGUgZmlyc3QgdGltZSBhIERWSS1JIGNvbm5lY3RvciBpcyBtYWRlLgorICovCitpbnQgZHJtX21vZGVfY3JlYXRlX2R2aV9pX3Byb3BlcnRpZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkdmlfaV9zZWxlY3RvcjsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkdmlfaV9zdWJjb25uZWN0b3I7CisJaW50IGk7CisKKwlpZiAoZGV2LT5tb2RlX2NvbmZpZy5kdmlfaV9zZWxlY3Rfc3ViY29ubmVjdG9yX3Byb3BlcnR5KQorCQlyZXR1cm4gMDsKKworCWR2aV9pX3NlbGVjdG9yID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSwKKwkJCQkgICAgInNlbGVjdCBzdWJjb25uZWN0b3IiLAorCQkJCSAgICBBUlJBWV9TSVpFKGRybV9kdmlfaV9zZWxlY3RfZW51bV9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJtX2R2aV9pX3NlbGVjdF9lbnVtX2xpc3QpOyBpKyspCisJCWRybV9wcm9wZXJ0eV9hZGRfZW51bShkdmlfaV9zZWxlY3RvciwgaSwKKwkJCQkgICAgICBkcm1fZHZpX2lfc2VsZWN0X2VudW1fbGlzdFtpXS50eXBlLAorCQkJCSAgICAgIGRybV9kdmlfaV9zZWxlY3RfZW51bV9saXN0W2ldLm5hbWUpOworCWRldi0+bW9kZV9jb25maWcuZHZpX2lfc2VsZWN0X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSA9IGR2aV9pX3NlbGVjdG9yOworCisJZHZpX2lfc3ViY29ubmVjdG9yID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSB8CisJCQkJICAgIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFLAorCQkJCSAgICAic3ViY29ubmVjdG9yIiwKKwkJCQkgICAgQVJSQVlfU0laRShkcm1fZHZpX2lfc3ViY29ubmVjdG9yX2VudW1fbGlzdCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRybV9kdmlfaV9zdWJjb25uZWN0b3JfZW51bV9saXN0KTsgaSsrKQorCQlkcm1fcHJvcGVydHlfYWRkX2VudW0oZHZpX2lfc3ViY29ubmVjdG9yLCBpLAorCQkJCSAgICAgIGRybV9kdmlfaV9zdWJjb25uZWN0b3JfZW51bV9saXN0W2ldLnR5cGUsCisJCQkJICAgICAgZHJtX2R2aV9pX3N1YmNvbm5lY3Rvcl9lbnVtX2xpc3RbaV0ubmFtZSk7CisJZGV2LT5tb2RlX2NvbmZpZy5kdmlfaV9zdWJjb25uZWN0b3JfcHJvcGVydHkgPSBkdmlfaV9zdWJjb25uZWN0b3I7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY3JlYXRlX2R2aV9pX3Byb3BlcnRpZXMpOworCisvKioKKyAqIGRybV9jcmVhdGVfdHZfcHJvcGVydGllcyAtIGNyZWF0ZSBUViBzcGVjaWZpYyBjb25uZWN0b3IgcHJvcGVydGllcworICogQGRldjogRFJNIGRldmljZQorICogQG51bV9tb2RlczogbnVtYmVyIG9mIGRpZmZlcmVudCBUViBmb3JtYXRzIChtb2Rlcykgc3VwcG9ydGVkCisgKiBAbW9kZXM6IGFycmF5IG9mIHBvaW50ZXJzIHRvIHN0cmluZ3MgY29udGFpbmluZyBuYW1lIG9mIGVhY2ggZm9ybWF0CisgKgorICogQ2FsbGVkIGJ5IGEgZHJpdmVyJ3MgVFYgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgdGhpcyBmdW5jdGlvbiBjcmVhdGVzCisgKiB0aGUgVFYgc3BlY2lmaWMgY29ubmVjdG9yIHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4gZGV2aWNlLiAgQ2FsbGVyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBhIGxpc3Qgb2YgZm9ybWF0IG5hbWVzIGFuZCBwYXNzaW5nIHRoZW0gdG8KKyAqIHRoaXMgcm91dGluZS4KKyAqLworaW50IGRybV9tb2RlX2NyZWF0ZV90dl9wcm9wZXJ0aWVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBudW1fbW9kZXMsCisJCQkJICBjaGFyICptb2Rlc1tdKQoreworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X3NlbGVjdG9yOworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X3N1YmNvbm5lY3RvcjsKKwlpbnQgaTsKKworCWlmIChkZXYtPm1vZGVfY29uZmlnLnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBCYXNpYyBjb25uZWN0b3IgcHJvcGVydGllcworCSAqLworCXR2X3NlbGVjdG9yID0gZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfRU5VTSwKKwkJCQkJICAic2VsZWN0IHN1YmNvbm5lY3RvciIsCisJCQkJCSAgQVJSQVlfU0laRShkcm1fdHZfc2VsZWN0X2VudW1fbGlzdCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRybV90dl9zZWxlY3RfZW51bV9saXN0KTsgaSsrKQorCQlkcm1fcHJvcGVydHlfYWRkX2VudW0odHZfc2VsZWN0b3IsIGksCisJCQkJICAgICAgZHJtX3R2X3NlbGVjdF9lbnVtX2xpc3RbaV0udHlwZSwKKwkJCQkgICAgICBkcm1fdHZfc2VsZWN0X2VudW1fbGlzdFtpXS5uYW1lKTsKKwlkZXYtPm1vZGVfY29uZmlnLnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHkgPSB0dl9zZWxlY3RvcjsKKworCXR2X3N1YmNvbm5lY3RvciA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0gfAorCQkJCSAgICBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSwgInN1YmNvbm5lY3RvciIsCisJCQkJICAgIEFSUkFZX1NJWkUoZHJtX3R2X3N1YmNvbm5lY3Rvcl9lbnVtX2xpc3QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcm1fdHZfc3ViY29ubmVjdG9yX2VudW1fbGlzdCk7IGkrKykKKwkJZHJtX3Byb3BlcnR5X2FkZF9lbnVtKHR2X3N1YmNvbm5lY3RvciwgaSwKKwkJCQkgICAgICBkcm1fdHZfc3ViY29ubmVjdG9yX2VudW1fbGlzdFtpXS50eXBlLAorCQkJCSAgICAgIGRybV90dl9zdWJjb25uZWN0b3JfZW51bV9saXN0W2ldLm5hbWUpOworCWRldi0+bW9kZV9jb25maWcudHZfc3ViY29ubmVjdG9yX3Byb3BlcnR5ID0gdHZfc3ViY29ubmVjdG9yOworCisJLyoKKwkgKiBPdGhlciwgVFYgc3BlY2lmaWMgcHJvcGVydGllczogbWFyZ2lucyAmIFRWIG1vZGVzLgorCSAqLworCWRldi0+bW9kZV9jb25maWcudHZfbGVmdF9tYXJnaW5fcHJvcGVydHkgPQorCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9SQU5HRSwKKwkJCQkgICAgImxlZnQgbWFyZ2luIiwgMik7CisJZGV2LT5tb2RlX2NvbmZpZy50dl9sZWZ0X21hcmdpbl9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLnR2X2xlZnRfbWFyZ2luX3Byb3BlcnR5LT52YWx1ZXNbMV0gPSAxMDA7CisKKwlkZXYtPm1vZGVfY29uZmlnLnR2X3JpZ2h0X21hcmdpbl9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCSAgICAicmlnaHQgbWFyZ2luIiwgMik7CisJZGV2LT5tb2RlX2NvbmZpZy50dl9yaWdodF9tYXJnaW5fcHJvcGVydHktPnZhbHVlc1swXSA9IDA7CisJZGV2LT5tb2RlX2NvbmZpZy50dl9yaWdodF9tYXJnaW5fcHJvcGVydHktPnZhbHVlc1sxXSA9IDEwMDsKKworCWRldi0+bW9kZV9jb25maWcudHZfdG9wX21hcmdpbl9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCSAgICAidG9wIG1hcmdpbiIsIDIpOworCWRldi0+bW9kZV9jb25maWcudHZfdG9wX21hcmdpbl9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLnR2X3RvcF9tYXJnaW5fcHJvcGVydHktPnZhbHVlc1sxXSA9IDEwMDsKKworCWRldi0+bW9kZV9jb25maWcudHZfYm90dG9tX21hcmdpbl9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX1JBTkdFLAorCQkJCSAgICAiYm90dG9tIG1hcmdpbiIsIDIpOworCWRldi0+bW9kZV9jb25maWcudHZfYm90dG9tX21hcmdpbl9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLnR2X2JvdHRvbV9tYXJnaW5fcHJvcGVydHktPnZhbHVlc1sxXSA9IDEwMDsKKworCWRldi0+bW9kZV9jb25maWcudHZfbW9kZV9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGUoZGV2LCBEUk1fTU9ERV9QUk9QX0VOVU0sCisJCQkJICAgICJtb2RlIiwgbnVtX21vZGVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspCisJCWRybV9wcm9wZXJ0eV9hZGRfZW51bShkZXYtPm1vZGVfY29uZmlnLnR2X21vZGVfcHJvcGVydHksIGksCisJCQkJICAgICAgaSwgbW9kZXNbaV0pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2NyZWF0ZV90dl9wcm9wZXJ0aWVzKTsKKworLyoqCisgKiBkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5IC0gY3JlYXRlIHNjYWxpbmcgbW9kZSBwcm9wZXJ0eQorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIENhbGxlZCBieSBhIGRyaXZlciB0aGUgZmlyc3QgdGltZSBpdCdzIG5lZWRlZCwgbXVzdCBiZSBhdHRhY2hlZCB0byBkZXNpcmVkCisgKiBjb25uZWN0b3JzLgorICovCitpbnQgZHJtX21vZGVfY3JlYXRlX3NjYWxpbmdfbW9kZV9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnNjYWxpbmdfbW9kZTsKKwlpbnQgaTsKKworCWlmIChkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSkKKwkJcmV0dXJuIDA7CisKKwlzY2FsaW5nX21vZGUgPQorCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9FTlVNLCAic2NhbGluZyBtb2RlIiwKKwkJCQkgICAgQVJSQVlfU0laRShkcm1fc2NhbGluZ19tb2RlX2VudW1fbGlzdCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRybV9zY2FsaW5nX21vZGVfZW51bV9saXN0KTsgaSsrKQorCQlkcm1fcHJvcGVydHlfYWRkX2VudW0oc2NhbGluZ19tb2RlLCBpLAorCQkJCSAgICAgIGRybV9zY2FsaW5nX21vZGVfZW51bV9saXN0W2ldLnR5cGUsCisJCQkJICAgICAgZHJtX3NjYWxpbmdfbW9kZV9lbnVtX2xpc3RbaV0ubmFtZSk7CisKKwlkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSA9IHNjYWxpbmdfbW9kZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KTsKKworLyoqCisgKiBkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5IC0gY3JlYXRlIGRpdGhlcmluZyBwcm9wZXJ0eQorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIENhbGxlZCBieSBhIGRyaXZlciB0aGUgZmlyc3QgdGltZSBpdCdzIG5lZWRlZCwgbXVzdCBiZSBhdHRhY2hlZCB0byBkZXNpcmVkCisgKiBjb25uZWN0b3JzLgorICovCitpbnQgZHJtX21vZGVfY3JlYXRlX2RpdGhlcmluZ19wcm9wZXJ0eShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmRpdGhlcmluZ19tb2RlOworCWludCBpOworCisJaWYgKGRldi0+bW9kZV9jb25maWcuZGl0aGVyaW5nX21vZGVfcHJvcGVydHkpCisJCXJldHVybiAwOworCisJZGl0aGVyaW5nX21vZGUgPQorCQlkcm1fcHJvcGVydHlfY3JlYXRlKGRldiwgRFJNX01PREVfUFJPUF9FTlVNLCAiZGl0aGVyaW5nIiwKKwkJCQkgICAgQVJSQVlfU0laRShkcm1fZGl0aGVyaW5nX21vZGVfZW51bV9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJtX2RpdGhlcmluZ19tb2RlX2VudW1fbGlzdCk7IGkrKykKKwkJZHJtX3Byb3BlcnR5X2FkZF9lbnVtKGRpdGhlcmluZ19tb2RlLCBpLAorCQkJCSAgICAgIGRybV9kaXRoZXJpbmdfbW9kZV9lbnVtX2xpc3RbaV0udHlwZSwKKwkJCQkgICAgICBkcm1fZGl0aGVyaW5nX21vZGVfZW51bV9saXN0W2ldLm5hbWUpOworCWRldi0+bW9kZV9jb25maWcuZGl0aGVyaW5nX21vZGVfcHJvcGVydHkgPSBkaXRoZXJpbmdfbW9kZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5KTsKKworLyoqCisgKiBkcm1fbW9kZV9jb25maWdfaW5pdCAtIGluaXRpYWxpemUgRFJNIG1vZGVfY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqCisgKiBMT0NLSU5HOgorICogTm9uZSwgc2hvdWxkIGhhcHBlbiBzaW5nbGUgdGhyZWFkZWQgYXQgaW5pdCB0aW1lLgorICoKKyAqIEluaXRpYWxpemUgQGRldidzIG1vZGVfY29uZmlnIHN0cnVjdHVyZSwgdXNlZCBmb3IgdHJhY2tpbmcgdGhlIGdyYXBoaWNzCisgKiBjb25maWd1cmF0aW9uIG9mIEBkZXYuCisgKi8KK3ZvaWQgZHJtX21vZGVfY29uZmlnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwltdXRleF9pbml0KCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5mYl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5mYl9rZXJuZWxfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5wcm9wZXJ0eV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5tb2RlX2NvbmZpZy5wcm9wZXJ0eV9ibG9iX2xpc3QpOworCWlkcl9pbml0KCZkZXYtPm1vZGVfY29uZmlnLmNydGNfaWRyKTsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWRybV9tb2RlX2NyZWF0ZV9zdGFuZGFyZF9jb25uZWN0b3JfcHJvcGVydGllcyhkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwkvKiBKdXN0IHRvIGJlIHN1cmUgKi8KKwlkZXYtPm1vZGVfY29uZmlnLm51bV9mYiA9IDA7CisJZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm51bV9lbmNvZGVyID0gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY29uZmlnX2luaXQpOworCitpbnQgZHJtX21vZGVfZ3JvdXBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgKmdyb3VwKQoreworCXVpbnQzMl90IHRvdGFsX29iamVjdHMgPSAwOworCisJdG90YWxfb2JqZWN0cyArPSBkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjOworCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yOworCXRvdGFsX29iamVjdHMgKz0gZGV2LT5tb2RlX2NvbmZpZy5udW1fZW5jb2RlcjsKKworCWlmICh0b3RhbF9vYmplY3RzID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZ3JvdXAtPmlkX2xpc3QgPSBremFsbG9jKHRvdGFsX29iamVjdHMgKiBzaXplb2YodWludDMyX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdyb3VwLT5pZF9saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdyb3VwLT5udW1fY3J0Y3MgPSAwOworCWdyb3VwLT5udW1fY29ubmVjdG9ycyA9IDA7CisJZ3JvdXAtPm51bV9lbmNvZGVycyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fbW9kZV9ncm91cF9pbml0X2xlZ2FjeV9ncm91cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9tb2RlX2dyb3VwICpncm91cCkKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gZHJtX21vZGVfZ3JvdXBfaW5pdChkZXYsIGdyb3VwKSkpCisJCXJldHVybiByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkKKwkJZ3JvdXAtPmlkX2xpc3RbZ3JvdXAtPm51bV9jcnRjcysrXSA9IGNydGMtPmJhc2UuaWQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkKKwkJZ3JvdXAtPmlkX2xpc3RbZ3JvdXAtPm51bV9jcnRjcyArIGdyb3VwLT5udW1fZW5jb2RlcnMrK10gPQorCQllbmNvZGVyLT5iYXNlLmlkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQorCQlncm91cC0+aWRfbGlzdFtncm91cC0+bnVtX2NydGNzICsgZ3JvdXAtPm51bV9lbmNvZGVycyArCisJCQkgICAgICAgZ3JvdXAtPm51bV9jb25uZWN0b3JzKytdID0gY29ubmVjdG9yLT5iYXNlLmlkOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZHJtX21vZGVfY29uZmlnX2NsZWFudXAgLSBmcmVlIHVwIERSTSBtb2RlX2NvbmZpZyBpbmZvCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBGcmVlIHVwIGFsbCB0aGUgY29ubmVjdG9ycyBhbmQgQ1JUQ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRFJNIGRldmljZSwgdGhlbgorICogZnJlZSB1cCB0aGUgZnJhbWVidWZmZXJzIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBvYmplY3RzLgorICoKKyAqIEZJWE1FOiBjbGVhbnVwIGFueSBkYW5nbGluZyB1c2VyIGJ1ZmZlciBvYmplY3RzIHRvbworICovCit2b2lkIGRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgKm90OworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YywgKmN0OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgKmVuY3Q7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsICpmYnQ7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksICpwdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbmNvZGVyLCBlbmN0LCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsCisJCQkJIGhlYWQpIHsKKwkJZW5jb2Rlci0+ZnVuY3MtPmRlc3Ryb3koZW5jb2Rlcik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm5lY3Rvciwgb3QsCisJCQkJICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHJvcGVydHksIHB0LCAmZGV2LT5tb2RlX2NvbmZpZy5wcm9wZXJ0eV9saXN0LAorCQkJCSBoZWFkKSB7CisJCWRybV9wcm9wZXJ0eV9kZXN0cm95KGRldiwgcHJvcGVydHkpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmYiwgZmJ0LCAmZGV2LT5tb2RlX2NvbmZpZy5mYl9saXN0LCBoZWFkKSB7CisJCWZiLT5mdW5jcy0+ZGVzdHJveShmYik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNydGMsIGN0LCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJY3J0Yy0+ZnVuY3MtPmRlc3Ryb3koY3J0Yyk7CisJfQorCit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKTsKKworLyoqCisgKiBkcm1fY3J0Y19jb252ZXJ0X3RvX3Vtb2RlIC0gY29udmVydCBhIGRybV9kaXNwbGF5X21vZGUgaW50byBhIG1vZGVpbmZvCisgKiBAb3V0OiBkcm1fbW9kZV9tb2RlaW5mbyBzdHJ1Y3QgdG8gcmV0dXJuIHRvIHRoZSB1c2VyCisgKiBAaW46IGRybV9kaXNwbGF5X21vZGUgdG8gdXNlCisgKgorICogTE9DS0lORzoKKyAqIE5vbmUuCisgKgorICogQ29udmVydCBhIGRybV9kaXNwbGF5X21vZGUgaW50byBhIGRybV9tb2RlX21vZGVpbmZvIHN0cnVjdHVyZSB0byByZXR1cm4gdG8KKyAqIHRoZSB1c2VyLgorICovCit2b2lkIGRybV9jcnRjX2NvbnZlcnRfdG9fdW1vZGUoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvICpvdXQsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmluKQoreworCW91dC0+Y2xvY2sgPSBpbi0+Y2xvY2s7CisJb3V0LT5oZGlzcGxheSA9IGluLT5oZGlzcGxheTsKKwlvdXQtPmhzeW5jX3N0YXJ0ID0gaW4tPmhzeW5jX3N0YXJ0OworCW91dC0+aHN5bmNfZW5kID0gaW4tPmhzeW5jX2VuZDsKKwlvdXQtPmh0b3RhbCA9IGluLT5odG90YWw7CisJb3V0LT5oc2tldyA9IGluLT5oc2tldzsKKwlvdXQtPnZkaXNwbGF5ID0gaW4tPnZkaXNwbGF5OworCW91dC0+dnN5bmNfc3RhcnQgPSBpbi0+dnN5bmNfc3RhcnQ7CisJb3V0LT52c3luY19lbmQgPSBpbi0+dnN5bmNfZW5kOworCW91dC0+dnRvdGFsID0gaW4tPnZ0b3RhbDsKKwlvdXQtPnZzY2FuID0gaW4tPnZzY2FuOworCW91dC0+dnJlZnJlc2ggPSBpbi0+dnJlZnJlc2g7CisJb3V0LT5mbGFncyA9IGluLT5mbGFnczsKKwlvdXQtPnR5cGUgPSBpbi0+dHlwZTsKKwlzdHJuY3B5KG91dC0+bmFtZSwgaW4tPm5hbWUsIERSTV9ESVNQTEFZX01PREVfTEVOKTsKKwlvdXQtPm5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU4tMV0gPSAwOworfQorCisvKioKKyAqIGRybV9jcnRjX2NvbnZlcnRfdG9fdW1vZGUgLSBjb252ZXJ0IGEgbW9kZWluZm8gaW50byBhIGRybV9kaXNwbGF5X21vZGUKKyAqIEBvdXQ6IGRybV9kaXNwbGF5X21vZGUgdG8gcmV0dXJuIHRvIHRoZSB1c2VyCisgKiBAaW46IGRybV9tb2RlX21vZGVpbmZvIHRvIHVzZQorICoKKyAqIExPQ0tJTkc6CisgKiBOb25lLgorICoKKyAqIENvbnZlcnQgYSBkcm1fbW9kZV9tb2RlaW5mbyBpbnRvIGEgZHJtX2Rpc3BsYXlfbW9kZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRvCisgKiB0aGUgY2FsbGVyLgorICovCit2b2lkIGRybV9jcnRjX2NvbnZlcnRfdW1vZGUoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm91dCwKKwkJCSAgICBzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gKmluKQoreworCW91dC0+Y2xvY2sgPSBpbi0+Y2xvY2s7CisJb3V0LT5oZGlzcGxheSA9IGluLT5oZGlzcGxheTsKKwlvdXQtPmhzeW5jX3N0YXJ0ID0gaW4tPmhzeW5jX3N0YXJ0OworCW91dC0+aHN5bmNfZW5kID0gaW4tPmhzeW5jX2VuZDsKKwlvdXQtPmh0b3RhbCA9IGluLT5odG90YWw7CisJb3V0LT5oc2tldyA9IGluLT5oc2tldzsKKwlvdXQtPnZkaXNwbGF5ID0gaW4tPnZkaXNwbGF5OworCW91dC0+dnN5bmNfc3RhcnQgPSBpbi0+dnN5bmNfc3RhcnQ7CisJb3V0LT52c3luY19lbmQgPSBpbi0+dnN5bmNfZW5kOworCW91dC0+dnRvdGFsID0gaW4tPnZ0b3RhbDsKKwlvdXQtPnZzY2FuID0gaW4tPnZzY2FuOworCW91dC0+dnJlZnJlc2ggPSBpbi0+dnJlZnJlc2g7CisJb3V0LT5mbGFncyA9IGluLT5mbGFnczsKKwlvdXQtPnR5cGUgPSBpbi0+dHlwZTsKKwlzdHJuY3B5KG91dC0+bmFtZSwgaW4tPm5hbWUsIERSTV9ESVNQTEFZX01PREVfTEVOKTsKKwlvdXQtPm5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU4tMV0gPSAwOworfQorCisvKioKKyAqIGRybV9tb2RlX2dldHJlc291cmNlcyAtIGdldCBncmFwaGljcyBjb25maWd1cmF0aW9uCisgKiBAaW5vZGU6IGlub2RlIGZyb20gdGhlIGlvY3RsCisgKiBAZmlscDogZmlsZSAqIGZyb20gdGhlIGlvY3RsCisgKiBAY21kOiBjbWQgZnJvbSBpb2N0bAorICogQGFyZzogYXJnIGZyb20gaW9jdGwKKyAqCisgKiBMT0NLSU5HOgorICogVGFrZXMgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBDb25zdHJ1Y3QgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzIGFuZCByZXR1cm4KKyAqIHRoZW0gdG8gdGhlIHVzZXIsIGluY2x1ZGluZyBDUlRDLCBjb25uZWN0b3IgYW5kIGZyYW1lYnVmZmVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogQ2FsbGVkIGJ5IHRoZSB1c2VyIHZpYSBpb2N0bC4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgZHJtX21vZGVfZ2V0cmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9jYXJkX3JlcyAqY2FyZF9yZXMgPSBkYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY29ubmVjdG9yX2NvdW50ID0gMDsKKwlpbnQgY3J0Y19jb3VudCA9IDA7CisJaW50IGZiX2NvdW50ID0gMDsKKwlpbnQgZW5jb2Rlcl9jb3VudCA9IDA7CisJaW50IGNvcGllZCA9IDAsIGk7CisJdWludDMyX3QgX191c2VyICpmYl9pZDsKKwl1aW50MzJfdCBfX3VzZXIgKmNydGNfaWQ7CisJdWludDMyX3QgX191c2VyICpjb25uZWN0b3JfaWQ7CisJdWludDMyX3QgX191c2VyICplbmNvZGVyX2lkOworCXN0cnVjdCBkcm1fbW9kZV9ncm91cCAqbW9kZV9ncm91cDsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJLyoKKwkgKiBGb3IgdGhlIG5vbi1jb250cm9sIG5vZGVzIHdlIG5lZWQgdG8gbGltaXQgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzCisJICogYnkgSURzIGluIHRoZSBncm91cCBsaXN0IGZvciB0aGlzIG5vZGUKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKGxoLCAmZmlsZV9wcml2LT5mYnMpCisJCWZiX2NvdW50Kys7CisKKwltb2RlX2dyb3VwID0gJmZpbGVfcHJpdi0+bWFzdGVyLT5taW5vci0+bW9kZV9ncm91cDsKKwlpZiAoZmlsZV9wcml2LT5tYXN0ZXItPm1pbm9yLT50eXBlID09IERSTV9NSU5PUl9DT05UUk9MKSB7CisKKwkJbGlzdF9mb3JfZWFjaChsaCwgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0KQorCQkJY3J0Y19jb3VudCsrOworCisJCWxpc3RfZm9yX2VhY2gobGgsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0KQorCQkJY29ubmVjdG9yX2NvdW50Kys7CisKKwkJbGlzdF9mb3JfZWFjaChsaCwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0KQorCQkJZW5jb2Rlcl9jb3VudCsrOworCX0gZWxzZSB7CisKKwkJY3J0Y19jb3VudCA9IG1vZGVfZ3JvdXAtPm51bV9jcnRjczsKKwkJY29ubmVjdG9yX2NvdW50ID0gbW9kZV9ncm91cC0+bnVtX2Nvbm5lY3RvcnM7CisJCWVuY29kZXJfY291bnQgPSBtb2RlX2dyb3VwLT5udW1fZW5jb2RlcnM7CisJfQorCisJY2FyZF9yZXMtPm1heF9oZWlnaHQgPSBkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQ7CisJY2FyZF9yZXMtPm1pbl9oZWlnaHQgPSBkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQ7CisJY2FyZF9yZXMtPm1heF93aWR0aCA9IGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoOworCWNhcmRfcmVzLT5taW5fd2lkdGggPSBkZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0aDsKKworCS8qIGhhbmRsZSB0aGlzIGluIDQgcGFydHMgKi8KKwkvKiBGQnMgKi8KKwlpZiAoY2FyZF9yZXMtPmNvdW50X2ZicyA+PSBmYl9jb3VudCkgeworCQljb3BpZWQgPSAwOworCQlmYl9pZCA9ICh1aW50MzJfdCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljYXJkX3Jlcy0+ZmJfaWRfcHRyOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiLCAmZmlsZV9wcml2LT5mYnMsIGhlYWQpIHsKKwkJCWlmIChwdXRfdXNlcihmYi0+YmFzZS5pZCwgZmJfaWQgKyBjb3BpZWQpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvcGllZCsrOworCQl9CisJfQorCWNhcmRfcmVzLT5jb3VudF9mYnMgPSBmYl9jb3VudDsKKworCS8qIENSVENzICovCisJaWYgKGNhcmRfcmVzLT5jb3VudF9jcnRjcyA+PSBjcnRjX2NvdW50KSB7CisJCWNvcGllZCA9IDA7CisJCWNydGNfaWQgPSAodWludDMyX3QgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY2FyZF9yZXMtPmNydGNfaWRfcHRyOworCQlpZiAoZmlsZV9wcml2LT5tYXN0ZXItPm1pbm9yLT50eXBlID09IERSTV9NSU5PUl9DT05UUk9MKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKKwkJCQkJICAgIGhlYWQpIHsKKwkJCQlEUk1fREVCVUcoIkNSVEMgSUQgaXMgJWRcbiIsIGNydGMtPmJhc2UuaWQpOworCQkJCWlmIChwdXRfdXNlcihjcnRjLT5iYXNlLmlkLCBjcnRjX2lkICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbW9kZV9ncm91cC0+bnVtX2NydGNzOyBpKyspIHsKKwkJCQlpZiAocHV0X3VzZXIobW9kZV9ncm91cC0+aWRfbGlzdFtpXSwKKwkJCQkJICAgICBjcnRjX2lkICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0KKwl9CisJY2FyZF9yZXMtPmNvdW50X2NydGNzID0gY3J0Y19jb3VudDsKKworCS8qIEVuY29kZXJzICovCisJaWYgKGNhcmRfcmVzLT5jb3VudF9lbmNvZGVycyA+PSBlbmNvZGVyX2NvdW50KSB7CisJCWNvcGllZCA9IDA7CisJCWVuY29kZXJfaWQgPSAodWludDMyX3QgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY2FyZF9yZXMtPmVuY29kZXJfaWRfcHRyOworCQlpZiAoZmlsZV9wcml2LT5tYXN0ZXItPm1pbm9yLT50eXBlID09IERSTV9NSU5PUl9DT05UUk9MKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsCisJCQkJCSAgICAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsCisJCQkJCSAgICBoZWFkKSB7CisJCQkJRFJNX0RFQlVHKCJFTkNPREVSIElEIGlzICVkXG4iLAorCQkJCQkgIGVuY29kZXItPmJhc2UuaWQpOworCQkJCWlmIChwdXRfdXNlcihlbmNvZGVyLT5iYXNlLmlkLCBlbmNvZGVyX2lkICsKKwkJCQkJICAgICBjb3BpZWQpKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQljb3BpZWQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IG1vZGVfZ3JvdXAtPm51bV9jcnRjczsgaSA8IG1vZGVfZ3JvdXAtPm51bV9jcnRjcyArIG1vZGVfZ3JvdXAtPm51bV9lbmNvZGVyczsgaSsrKSB7CisJCQkJaWYgKHB1dF91c2VyKG1vZGVfZ3JvdXAtPmlkX2xpc3RbaV0sCisJCQkJCSAgICAgZW5jb2Rlcl9pZCArIGNvcGllZCkpIHsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWNvcGllZCsrOworCQkJfQorCisJCX0KKwl9CisJY2FyZF9yZXMtPmNvdW50X2VuY29kZXJzID0gZW5jb2Rlcl9jb3VudDsKKworCS8qIENvbm5lY3RvcnMgKi8KKwlpZiAoY2FyZF9yZXMtPmNvdW50X2Nvbm5lY3RvcnMgPj0gY29ubmVjdG9yX2NvdW50KSB7CisJCWNvcGllZCA9IDA7CisJCWNvbm5lY3Rvcl9pZCA9ICh1aW50MzJfdCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljYXJkX3Jlcy0+Y29ubmVjdG9yX2lkX3B0cjsKKwkJaWYgKGZpbGVfcHJpdi0+bWFzdGVyLT5taW5vci0+dHlwZSA9PSBEUk1fTUlOT1JfQ09OVFJPTCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsCisJCQkJCSAgICAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwKKwkJCQkJICAgIGhlYWQpIHsKKwkJCQlEUk1fREVCVUcoIkNPTk5FQ1RPUiBJRCBpcyAlZFxuIiwKKwkJCQkJICBjb25uZWN0b3ItPmJhc2UuaWQpOworCQkJCWlmIChwdXRfdXNlcihjb25uZWN0b3ItPmJhc2UuaWQsCisJCQkJCSAgICAgY29ubmVjdG9yX2lkICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnQgc3RhcnQgPSBtb2RlX2dyb3VwLT5udW1fY3J0Y3MgKworCQkJCW1vZGVfZ3JvdXAtPm51bV9lbmNvZGVyczsKKwkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBtb2RlX2dyb3VwLT5udW1fY29ubmVjdG9yczsgaSsrKSB7CisJCQkJaWYgKHB1dF91c2VyKG1vZGVfZ3JvdXAtPmlkX2xpc3RbaV0sCisJCQkJCSAgICAgY29ubmVjdG9yX2lkICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0KKwl9CisJY2FyZF9yZXMtPmNvdW50X2Nvbm5lY3RvcnMgPSBjb25uZWN0b3JfY291bnQ7CisKKwlEUk1fREVCVUcoIkNvdW50ZWQgJWQgJWQgJWRcbiIsIGNhcmRfcmVzLT5jb3VudF9jcnRjcywKKwkJICBjYXJkX3Jlcy0+Y291bnRfY29ubmVjdG9ycywgY2FyZF9yZXMtPmNvdW50X2VuY29kZXJzKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9nZXRjcnRjIC0gZ2V0IENSVEMgY29uZmlndXJhdGlvbgorICogQGlub2RlOiBpbm9kZSBmcm9tIHRoZSBpb2N0bAorICogQGZpbHA6IGZpbGUgKiBmcm9tIHRoZSBpb2N0bAorICogQGNtZDogY21kIGZyb20gaW9jdGwKKyAqIEBhcmc6IGFyZyBmcm9tIGlvY3RsCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlcj8gKEZJWE1FKQorICoKKyAqIENvbnN0cnVjdCBhIENSVEMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRvIHRoZSB1c2VyLgorICoKKyAqIENhbGxlZCBieSB0aGUgdXNlciB2aWEgaW9jdGwuCisgKgorICogUkVUVVJOUzoKKyAqIFplcm8gb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9tb2RlX2dldGNydGMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3J0YyAqY3J0Y19yZXNwID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfcmVzcC0+Y3J0Y19pZCwKKwkJCQkgICBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOworCisJY3J0Y19yZXNwLT54ID0gY3J0Yy0+eDsKKwljcnRjX3Jlc3AtPnkgPSBjcnRjLT55OworCWNydGNfcmVzcC0+Z2FtbWFfc2l6ZSA9IGNydGMtPmdhbW1hX3NpemU7CisJaWYgKGNydGMtPmZiKQorCQljcnRjX3Jlc3AtPmZiX2lkID0gY3J0Yy0+ZmItPmJhc2UuaWQ7CisJZWxzZQorCQljcnRjX3Jlc3AtPmZiX2lkID0gMDsKKworCWlmIChjcnRjLT5lbmFibGVkKSB7CisKKwkJZHJtX2NydGNfY29udmVydF90b191bW9kZSgmY3J0Y19yZXNwLT5tb2RlLCAmY3J0Yy0+bW9kZSk7CisJCWNydGNfcmVzcC0+bW9kZV92YWxpZCA9IDE7CisKKwl9IGVsc2UgeworCQljcnRjX3Jlc3AtPm1vZGVfdmFsaWQgPSAwOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9nZXRjb25uZWN0b3IgLSBnZXQgY29ubmVjdG9yIGNvbmZpZ3VyYXRpb24KKyAqIEBpbm9kZTogaW5vZGUgZnJvbSB0aGUgaW9jdGwKKyAqIEBmaWxwOiBmaWxlICogZnJvbSB0aGUgaW9jdGwKKyAqIEBjbWQ6IGNtZCBmcm9tIGlvY3RsCisgKiBAYXJnOiBhcmcgZnJvbSBpb2N0bAorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXI/IChGSVhNRSkKKyAqCisgKiBDb25zdHJ1Y3QgYSBjb25uZWN0b3IgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRvIHRoZSB1c2VyLgorICoKKyAqIENhbGxlZCBieSB0aGUgdXNlciB2aWEgaW9jdGwuCisgKgorICogUkVUVVJOUzoKKyAqIFplcm8gb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9tb2RlX2dldGNvbm5lY3RvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvciAqb3V0X3Jlc3AgPSBkYXRhOworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCWludCBtb2RlX2NvdW50ID0gMDsKKwlpbnQgcHJvcHNfY291bnQgPSAwOworCWludCBlbmNvZGVyc19jb3VudCA9IDA7CisJaW50IHJldCA9IDA7CisJaW50IGNvcGllZCA9IDA7CisJaW50IGk7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHVfbW9kZTsKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gX191c2VyICptb2RlX3B0cjsKKwl1aW50MzJfdCBfX3VzZXIgKnByb3BfcHRyOworCXVpbnQ2NF90IF9fdXNlciAqcHJvcF92YWx1ZXM7CisJdWludDMyX3QgX191c2VyICplbmNvZGVyX3B0cjsKKworCW1lbXNldCgmdV9tb2RlLCAwLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX21vZGVpbmZvKSk7CisKKwlEUk1fREVCVUcoImNvbm5lY3RvciBpZCAlZDpcbiIsIG91dF9yZXNwLT5jb25uZWN0b3JfaWQpOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIG91dF9yZXNwLT5jb25uZWN0b3JfaWQsCisJCQkJICAgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWNvbm5lY3RvciA9IG9ial90b19jb25uZWN0b3Iob2JqKTsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9QUk9QRVJUWTsgaSsrKSB7CisJCWlmIChjb25uZWN0b3ItPnByb3BlcnR5X2lkc1tpXSAhPSAwKSB7CisJCQlwcm9wc19jb3VudCsrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVI7IGkrKykgeworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyX2lkc1tpXSAhPSAwKSB7CisJCQllbmNvZGVyc19jb3VudCsrOworCQl9CisJfQorCisJaWYgKG91dF9yZXNwLT5jb3VudF9tb2RlcyA9PSAwKSB7CisJCWNvbm5lY3Rvci0+ZnVuY3MtPmZpbGxfbW9kZXMoY29ubmVjdG9yLAorCQkJCQkgICAgIGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoLAorCQkJCQkgICAgIGRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCk7CisJfQorCisJLyogZGVsYXllZCBzbyB3ZSBnZXQgbW9kZXMgcmVnYXJkbGVzcyBvZiBwcmUtZmlsbF9tb2RlcyBzdGF0ZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpCisJCW1vZGVfY291bnQrKzsKKworCW91dF9yZXNwLT5jb25uZWN0b3JfaWQgPSBjb25uZWN0b3ItPmJhc2UuaWQ7CisJb3V0X3Jlc3AtPmNvbm5lY3Rvcl90eXBlID0gY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZTsKKwlvdXRfcmVzcC0+Y29ubmVjdG9yX3R5cGVfaWQgPSBjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlX2lkOworCW91dF9yZXNwLT5tbV93aWR0aCA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tOworCW91dF9yZXNwLT5tbV9oZWlnaHQgPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5oZWlnaHRfbW07CisJb3V0X3Jlc3AtPnN1YnBpeGVsID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uc3VicGl4ZWxfb3JkZXI7CisJb3V0X3Jlc3AtPmNvbm5lY3Rpb24gPSBjb25uZWN0b3ItPnN0YXR1czsKKwlpZiAoY29ubmVjdG9yLT5lbmNvZGVyKQorCQlvdXRfcmVzcC0+ZW5jb2Rlcl9pZCA9IGNvbm5lY3Rvci0+ZW5jb2Rlci0+YmFzZS5pZDsKKwllbHNlCisJCW91dF9yZXNwLT5lbmNvZGVyX2lkID0gMDsKKworCS8qCisJICogVGhpcyBpb2N0bCBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHNwYWNlIGlzCisJICogbmVlZGVkLCBhbmQgdGhlIDJuZCB0aW1lIHRvIGZpbGwgaXQuCisJICovCisJaWYgKChvdXRfcmVzcC0+Y291bnRfbW9kZXMgPj0gbW9kZV9jb3VudCkgJiYgbW9kZV9jb3VudCkgeworCQljb3BpZWQgPSAwOworCQltb2RlX3B0ciA9IChzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gKikodW5zaWduZWQgbG9uZylvdXRfcmVzcC0+bW9kZXNfcHRyOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0b3ItPm1vZGVzLCBoZWFkKSB7CisJCQlkcm1fY3J0Y19jb252ZXJ0X3RvX3Vtb2RlKCZ1X21vZGUsIG1vZGUpOworCQkJaWYgKGNvcHlfdG9fdXNlcihtb2RlX3B0ciArIGNvcGllZCwKKwkJCQkJICZ1X21vZGUsIHNpemVvZih1X21vZGUpKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb3BpZWQrKzsKKwkJfQorCX0KKwlvdXRfcmVzcC0+Y291bnRfbW9kZXMgPSBtb2RlX2NvdW50OworCisJaWYgKChvdXRfcmVzcC0+Y291bnRfcHJvcHMgPj0gcHJvcHNfY291bnQpICYmIHByb3BzX2NvdW50KSB7CisJCWNvcGllZCA9IDA7CisJCXByb3BfcHRyID0gKHVpbnQzMl90ICopKHVuc2lnbmVkIGxvbmcpKG91dF9yZXNwLT5wcm9wc19wdHIpOworCQlwcm9wX3ZhbHVlcyA9ICh1aW50NjRfdCAqKSh1bnNpZ25lZCBsb25nKShvdXRfcmVzcC0+cHJvcF92YWx1ZXNfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZOyBpKyspIHsKKwkJCWlmIChjb25uZWN0b3ItPnByb3BlcnR5X2lkc1tpXSAhPSAwKSB7CisJCQkJaWYgKHB1dF91c2VyKGNvbm5lY3Rvci0+cHJvcGVydHlfaWRzW2ldLAorCQkJCQkgICAgIHByb3BfcHRyICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlpZiAocHV0X3VzZXIoY29ubmVjdG9yLT5wcm9wZXJ0eV92YWx1ZXNbaV0sCisJCQkJCSAgICAgcHJvcF92YWx1ZXMgKyBjb3BpZWQpKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQljb3BpZWQrKzsKKwkJCX0KKwkJfQorCX0KKwlvdXRfcmVzcC0+Y291bnRfcHJvcHMgPSBwcm9wc19jb3VudDsKKworCWlmICgob3V0X3Jlc3AtPmNvdW50X2VuY29kZXJzID49IGVuY29kZXJzX2NvdW50KSAmJiBlbmNvZGVyc19jb3VudCkgeworCQljb3BpZWQgPSAwOworCQllbmNvZGVyX3B0ciA9ICh1aW50MzJfdCAqKSh1bnNpZ25lZCBsb25nKShvdXRfcmVzcC0+ZW5jb2RlcnNfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVI7IGkrKykgeworCQkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV0gIT0gMCkgeworCQkJCWlmIChwdXRfdXNlcihjb25uZWN0b3ItPmVuY29kZXJfaWRzW2ldLAorCQkJCQkgICAgIGVuY29kZXJfcHRyICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0KKwl9CisJb3V0X3Jlc3AtPmNvdW50X2VuY29kZXJzID0gZW5jb2RlcnNfY291bnQ7CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkcm1fbW9kZV9nZXRlbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgKmVuY19yZXNwID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBlbmNfcmVzcC0+ZW5jb2Rlcl9pZCwKKwkJCQkgICBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUik7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWVuY29kZXIgPSBvYmpfdG9fZW5jb2RlcihvYmopOworCisJaWYgKGVuY29kZXItPmNydGMpCisJCWVuY19yZXNwLT5jcnRjX2lkID0gZW5jb2Rlci0+Y3J0Yy0+YmFzZS5pZDsKKwllbHNlCisJCWVuY19yZXNwLT5jcnRjX2lkID0gMDsKKwllbmNfcmVzcC0+ZW5jb2Rlcl90eXBlID0gZW5jb2Rlci0+ZW5jb2Rlcl90eXBlOworCWVuY19yZXNwLT5lbmNvZGVyX2lkID0gZW5jb2Rlci0+YmFzZS5pZDsKKwllbmNfcmVzcC0+cG9zc2libGVfY3J0Y3MgPSBlbmNvZGVyLT5wb3NzaWJsZV9jcnRjczsKKwllbmNfcmVzcC0+cG9zc2libGVfY2xvbmVzID0gZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRybV9tb2RlX3NldGNydGMgLSBzZXQgQ1JUQyBjb25maWd1cmF0aW9uCisgKiBAaW5vZGU6IGlub2RlIGZyb20gdGhlIGlvY3RsCisgKiBAZmlscDogZmlsZSAqIGZyb20gdGhlIGlvY3RsCisgKiBAY21kOiBjbWQgZnJvbSBpb2N0bAorICogQGFyZzogYXJnIGZyb20gaW9jdGwKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyPyAoRklYTUUpCisgKgorICogQnVpbGQgYSBuZXcgQ1JUQyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHVzZXIgcmVxdWVzdC4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIHVzZXIgdmlhIGlvY3RsLgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fbW9kZV9zZXRjcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9tb2RlX2NydGMgKmNydGNfcmVxID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9jcnRjICpjcnRjLCAqY3J0Y2ZiOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9yX3NldCA9IE5VTEwsICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBOVUxMOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21vZGVfc2V0IHNldDsKKwl1aW50MzJfdCBfX3VzZXIgKnNldF9jb25uZWN0b3JzX3B0cjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgY3J0Y19yZXEtPmNydGNfaWQsCisJCQkJICAgRFJNX01PREVfT0JKRUNUX0NSVEMpOworCWlmICghb2JqKSB7CisJCURSTV9ERUJVRygiVW5rbm93biBDUlRDIElEICVkXG4iLCBjcnRjX3JlcS0+Y3J0Y19pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwljcnRjID0gb2JqX3RvX2NydGMob2JqKTsKKworCWlmIChjcnRjX3JlcS0+bW9kZV92YWxpZCkgeworCQkvKiBJZiB3ZSBoYXZlIGEgbW9kZSB3ZSBuZWVkIGEgZnJhbWVidWZmZXIuICovCisJCS8qIElmIHdlIHBhc3MgLTEsIHNldCB0aGUgbW9kZSB3aXRoIHRoZSBjdXJyZW50bHkgYm91bmQgZmIgKi8KKwkJaWYgKGNydGNfcmVxLT5mYl9pZCA9PSAtMSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjZmIsCisJCQkJCSAgICAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJCQlpZiAoY3J0Y2ZiID09IGNydGMpIHsKKwkJCQkJRFJNX0RFQlVHKCJVc2luZyBjdXJyZW50IGZiIGZvciBzZXRtb2RlXG4iKTsKKwkJCQkJZmIgPSBjcnRjLT5mYjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfcmVxLT5mYl9pZCwKKwkJCQkJCSAgIERSTV9NT0RFX09CSkVDVF9GQik7CisJCQlpZiAoIW9iaikgeworCQkJCURSTV9ERUJVRygiVW5rbm93biBGQiBJRCVkXG4iLCBjcnRjX3JlcS0+ZmJfaWQpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmYiA9IG9ial90b19mYihvYmopOworCQl9CisKKwkJbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShkZXYpOworCQlkcm1fY3J0Y19jb252ZXJ0X3Vtb2RlKG1vZGUsICZjcnRjX3JlcS0+bW9kZSk7CisJCWRybV9tb2RlX3NldF9jcnRjaW5mbyhtb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKKwl9CisKKwlpZiAoY3J0Y19yZXEtPmNvdW50X2Nvbm5lY3RvcnMgPT0gMCAmJiBtb2RlKSB7CisJCURSTV9ERUJVRygiQ291bnQgY29ubmVjdG9ycyBpcyAwIGJ1dCBtb2RlIHNldFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjcnRjX3JlcS0+Y291bnRfY29ubmVjdG9ycyA+IDAgJiYgIW1vZGUgJiYgIWZiKSB7CisJCURSTV9ERUJVRygiQ291bnQgY29ubmVjdG9ycyBpcyAlZCBidXQgbm8gbW9kZSBvciBmYiBzZXRcbiIsCisJCQkgIGNydGNfcmVxLT5jb3VudF9jb25uZWN0b3JzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNydGNfcmVxLT5jb3VudF9jb25uZWN0b3JzID4gMCkgeworCQl1MzIgb3V0X2lkOworCisJCS8qIEF2b2lkIHVuYm91bmRlZCBrZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwkJaWYgKGNydGNfcmVxLT5jb3VudF9jb25uZWN0b3JzID4gY29uZmlnLT5udW1fY29ubmVjdG9yKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQljb25uZWN0b3Jfc2V0ID0ga21hbGxvYyhjcnRjX3JlcS0+Y291bnRfY29ubmVjdG9ycyAqCisJCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghY29ubmVjdG9yX3NldCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGNydGNfcmVxLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJCXNldF9jb25uZWN0b3JzX3B0ciA9ICh1aW50MzJfdCAqKSh1bnNpZ25lZCBsb25nKWNydGNfcmVxLT5zZXRfY29ubmVjdG9yc19wdHI7CisJCQlpZiAoZ2V0X3VzZXIob3V0X2lkLCAmc2V0X2Nvbm5lY3RvcnNfcHRyW2ldKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgb3V0X2lkLAorCQkJCQkJICAgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisJCQlpZiAoIW9iaikgeworCQkJCURSTV9ERUJVRygiQ29ubmVjdG9yIGlkICVkIHVua25vd25cbiIsIG91dF9pZCk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbm5lY3RvciA9IG9ial90b19jb25uZWN0b3Iob2JqKTsKKworCQkJY29ubmVjdG9yX3NldFtpXSA9IGNvbm5lY3RvcjsKKwkJfQorCX0KKworCXNldC5jcnRjID0gY3J0YzsKKwlzZXQueCA9IGNydGNfcmVxLT54OworCXNldC55ID0gY3J0Y19yZXEtPnk7CisJc2V0Lm1vZGUgPSBtb2RlOworCXNldC5jb25uZWN0b3JzID0gY29ubmVjdG9yX3NldDsKKwlzZXQubnVtX2Nvbm5lY3RvcnMgPSBjcnRjX3JlcS0+Y291bnRfY29ubmVjdG9yczsKKwlzZXQuZmIgPWZiOworCXJldCA9IGNydGMtPmZ1bmNzLT5zZXRfY29uZmlnKCZzZXQpOworCitvdXQ6CisJa2ZyZWUoY29ubmVjdG9yX3NldCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZHJtX21vZGVfY3Vyc29yX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQl2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3Vyc29yICpyZXEgPSBkYXRhOworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlpZiAoIXJlcS0+ZmxhZ3MpIHsKKwkJRFJNX0VSUk9SKCJubyBvcGVyYXRpb24gc2V0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCByZXEtPmNydGNfaWQsIERSTV9NT0RFX09CSkVDVF9DUlRDKTsKKwlpZiAoIW9iaikgeworCQlEUk1fREVCVUcoIlVua25vd24gQ1JUQyBJRCAlZFxuIiwgcmVxLT5jcnRjX2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOworCisJaWYgKHJlcS0+ZmxhZ3MgJiBEUk1fTU9ERV9DVVJTT1JfQk8pIHsKKwkJaWYgKCFjcnRjLT5mdW5jcy0+Y3Vyc29yX3NldCkgeworCQkJRFJNX0VSUk9SKCJjcnRjIGRvZXMgbm90IHN1cHBvcnQgY3Vyc29yXG4iKTsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIFR1cm5zIG9mZiB0aGUgY3Vyc29yIGlmIGhhbmRsZSBpcyAwICovCisJCXJldCA9IGNydGMtPmZ1bmNzLT5jdXJzb3Jfc2V0KGNydGMsIGZpbGVfcHJpdiwgcmVxLT5oYW5kbGUsCisJCQkJCSAgICAgIHJlcS0+d2lkdGgsIHJlcS0+aGVpZ2h0KTsKKwl9CisKKwlpZiAocmVxLT5mbGFncyAmIERSTV9NT0RFX0NVUlNPUl9NT1ZFKSB7CisJCWlmIChjcnRjLT5mdW5jcy0+Y3Vyc29yX21vdmUpIHsKKwkJCXJldCA9IGNydGMtPmZ1bmNzLT5jdXJzb3JfbW92ZShjcnRjLCByZXEtPngsIHJlcS0+eSk7CisJCX0gZWxzZSB7CisJCQlEUk1fRVJST1IoImNydGMgZG9lcyBub3Qgc3VwcG9ydCBjdXJzb3JcbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9hZGRmYiAtIGFkZCBhbiBGQiB0byB0aGUgZ3JhcGhpY3MgY29uZmlndXJhdGlvbgorICogQGlub2RlOiBpbm9kZSBmcm9tIHRoZSBpb2N0bAorICogQGZpbHA6IGZpbGUgKiBmcm9tIHRoZSBpb2N0bAorICogQGNtZDogY21kIGZyb20gaW9jdGwKKyAqIEBhcmc6IGFyZyBmcm9tIGlvY3RsCisgKgorICogTE9DS0lORzoKKyAqIFRha2VzIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogQWRkIGEgbmV3IEZCIHRvIHRoZSBzcGVjaWZpZWQgQ1JUQywgZ2l2ZW4gYSB1c2VyIHJlcXVlc3QuCisgKgorICogQ2FsbGVkIGJ5IHRoZSB1c2VyIHZpYSBpb2N0bC4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgZHJtX21vZGVfYWRkZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqciA9IGRhdGE7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKGNvbmZpZy0+bWluX3dpZHRoID4gci0+d2lkdGgpIHx8IChyLT53aWR0aCA+IGNvbmZpZy0+bWF4X3dpZHRoKSkgeworCQlEUk1fRVJST1IoIm1vZGUgbmV3IGZyYW1lYnVmZmVyIHdpZHRoIG5vdCB3aXRoaW4gbGltaXRzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoY29uZmlnLT5taW5faGVpZ2h0ID4gci0+aGVpZ2h0KSB8fCAoci0+aGVpZ2h0ID4gY29uZmlnLT5tYXhfaGVpZ2h0KSkgeworCQlEUk1fRVJST1IoIm1vZGUgbmV3IGZyYW1lYnVmZmVyIGhlaWdodCBub3Qgd2l0aGluIGxpbWl0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJLyogVE9ETyBjaGVjayBidWZmZXIgaXMgc3VmZmljZW50bHkgbGFyZ2UgKi8KKwkvKiBUT0RPIHNldHVwIGRlc3RydWN0b3IgY2FsbGJhY2sgKi8KKworCWZiID0gZGV2LT5tb2RlX2NvbmZpZy5mdW5jcy0+ZmJfY3JlYXRlKGRldiwgZmlsZV9wcml2LCByKTsKKwlpZiAoIWZiKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGNyZWF0ZSBmcmFtZWJ1ZmZlclxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXItPmZiX2lkID0gZmItPmJhc2UuaWQ7CisJbGlzdF9hZGQoJmZiLT5maWxwX2hlYWQsICZmaWxlX3ByaXYtPmZicyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJtX21vZGVfcm1mYiAtIHJlbW92ZSBhbiBGQiBmcm9tIHRoZSBjb25maWd1cmF0aW9uCisgKiBAaW5vZGU6IGlub2RlIGZyb20gdGhlIGlvY3RsCisgKiBAZmlscDogZmlsZSAqIGZyb20gdGhlIGlvY3RsCisgKiBAY21kOiBjbWQgZnJvbSBpb2N0bAorICogQGFyZzogYXJnIGZyb20gaW9jdGwKKyAqCisgKiBMT0NLSU5HOgorICogVGFrZXMgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKiBSZW1vdmUgdGhlIEZCIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIHVzZXIgdmlhIGlvY3RsLgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fbW9kZV9ybWZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IE5VTEw7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmJsID0gTlVMTDsKKwl1aW50MzJfdCAqaWQgPSBkYXRhOworCWludCByZXQgPSAwOworCWludCBmb3VuZCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsICppZCwgRFJNX01PREVfT0JKRUNUX0ZCKTsKKwkvKiBUT0RPIGNoZWNrIHRoYXQgd2UgcmVhbHkgZ2V0IGEgZnJhbWVidWZmZXIgYmFjay4gKi8KKwlpZiAoIW9iaikgeworCQlEUk1fRVJST1IoIm1vZGUgaW52YWxpZCBmcmFtZWJ1ZmZlciBpZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlmYiA9IG9ial90b19mYihvYmopOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYmwsICZmaWxlX3ByaXYtPmZicywgZmlscF9oZWFkKQorCQlpZiAoZmIgPT0gZmJsKQorCQkJZm91bmQgPSAxOworCisJaWYgKCFmb3VuZCkgeworCQlEUk1fRVJST1IoInRyaWVkIHRvIHJlbW92ZSBhIGZiIHRoYXQgd2UgZGlkbid0IG93blxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRPRE8gcmVsZWFzZSBhbGwgY3J0YyBjb25uZWN0ZWQgdG8gdGhlIGZyYW1lYnVmZmVyICovCisJLyogVE9ETyB1bmhvY2sgdGhlIGRlc3RydWN0b3IgZnJvbSB0aGUgYnVmZmVyIG9iamVjdCAqLworCisJbGlzdF9kZWwoJmZiLT5maWxwX2hlYWQpOworCWZiLT5mdW5jcy0+ZGVzdHJveShmYik7CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJtX21vZGVfZ2V0ZmIgLSBnZXQgRkIgaW5mbworICogQGlub2RlOiBpbm9kZSBmcm9tIHRoZSBpb2N0bAorICogQGZpbHA6IGZpbGUgKiBmcm9tIHRoZSBpb2N0bAorICogQGNtZDogY21kIGZyb20gaW9jdGwKKyAqIEBhcmc6IGFyZyBmcm9tIGlvY3RsCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlcj8gKEZJWE1FKQorICoKKyAqIExvb2t1cCB0aGUgRkIgZ2l2ZW4gaXRzIElEIGFuZCByZXR1cm4gaW5mbyBhYm91dCBpdC4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIHVzZXIgdmlhIGlvY3RsLgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1fbW9kZV9nZXRmYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICpyID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIHItPmZiX2lkLCBEUk1fTU9ERV9PQkpFQ1RfRkIpOworCWlmICghb2JqKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBmcmFtZWJ1ZmZlciBpZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlmYiA9IG9ial90b19mYihvYmopOworCisJci0+aGVpZ2h0ID0gZmItPmhlaWdodDsKKwlyLT53aWR0aCA9IGZiLT53aWR0aDsKKwlyLT5kZXB0aCA9IGZiLT5kZXB0aDsKKwlyLT5icHAgPSBmYi0+Yml0c19wZXJfcGl4ZWw7CisJci0+cGl0Y2ggPSBmYi0+cGl0Y2g7CisJZmItPmZ1bmNzLT5jcmVhdGVfaGFuZGxlKGZiLCBmaWxlX3ByaXYsICZyLT5oYW5kbGUpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRybV9mYl9yZWxlYXNlIC0gcmVtb3ZlIGFuZCBmcmVlIHRoZSBGQnMgb24gdGhpcyBmaWxlCisgKiBAZmlscDogZmlsZSAqIGZyb20gdGhlIGlvY3RsCisgKgorICogTE9DS0lORzoKKyAqIFRha2VzIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogRGVzdHJveSBhbGwgdGhlIEZCcyBhc3NvY2lhdGVkIHdpdGggQGZpbHAuCisgKgorICogQ2FsbGVkIGJ5IHRoZSB1c2VyIHZpYSBpb2N0bC4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlLgorICovCit2b2lkIGRybV9mYl9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+bWlub3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgKnRmYjsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmYiwgdGZiLCAmcHJpdi0+ZmJzLCBmaWxwX2hlYWQpIHsKKwkJbGlzdF9kZWwoJmZiLT5maWxwX2hlYWQpOworCQlmYi0+ZnVuY3MtPmRlc3Ryb3koZmIpOworCX0KKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworfQorCisvKioKKyAqIGRybV9tb2RlX2F0dGFjaG1vZGUgLSBhZGQgYSBtb2RlIHRvIHRoZSB1c2VyIG1vZGUgbGlzdAorICogQGRldjogRFJNIGRldmljZQorICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHRvIGFkZCB0aGUgbW9kZSB0bworICogQG1vZGU6IG1vZGUgdG8gYWRkCisgKgorICogQWRkIEBtb2RlIHRvIEBjb25uZWN0b3IncyB1c2VyIG1vZGUgbGlzdC4KKyAqLworc3RhdGljIGludCBkcm1fbW9kZV9hdHRhY2htb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWxpc3RfYWRkX3RhaWwoJm1vZGUtPmhlYWQsICZjb25uZWN0b3ItPnVzZXJfbW9kZXMpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkcm1fbW9kZV9hdHRhY2htb2RlX2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWludCByZXQgPSAwOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkdXBfbW9kZTsKKwlpbnQgbmVlZF9kdXAgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoIWNvbm5lY3Rvci0+ZW5jb2RlcikKKwkJCWJyZWFrOworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IGNydGMpIHsKKwkJCWlmIChuZWVkX2R1cCkKKwkJCQlkdXBfbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIG1vZGUpOworCQkJZWxzZQorCQkJCWR1cF9tb2RlID0gbW9kZTsKKwkJCXJldCA9IGRybV9tb2RlX2F0dGFjaG1vZGUoZGV2LCBjb25uZWN0b3IsIGR1cF9tb2RlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCW5lZWRfZHVwID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfYXR0YWNobW9kZV9jcnRjKTsKKworc3RhdGljIGludCBkcm1fbW9kZV9kZXRhY2htb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpbnQgZm91bmQgPSAwOworCWludCByZXQgPSAwOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptYXRjaF9tb2RlLCAqdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtYXRjaF9tb2RlLCB0LCAmY29ubmVjdG9yLT51c2VyX21vZGVzLCBoZWFkKSB7CisJCWlmIChkcm1fbW9kZV9lcXVhbChtYXRjaF9tb2RlLCBtb2RlKSkgeworCQkJbGlzdF9kZWwoJm1hdGNoX21vZGUtPmhlYWQpOworCQkJZHJtX21vZGVfZGVzdHJveShkZXYsIG1hdGNoX21vZGUpOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGRybV9tb2RlX2RldGFjaG1vZGVfY3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWRybV9tb2RlX2RldGFjaG1vZGUoZGV2LCBjb25uZWN0b3IsIG1vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfZGV0YWNobW9kZV9jcnRjKTsKKworLyoqCisgKiBkcm1fZmJfYXR0YWNobW9kZSAtIEF0dGFjaCBhIHVzZXIgbW9kZSB0byBhbiBjb25uZWN0b3IKKyAqIEBpbm9kZTogaW5vZGUgZnJvbSB0aGUgaW9jdGwKKyAqIEBmaWxwOiBmaWxlICogZnJvbSB0aGUgaW9jdGwKKyAqIEBjbWQ6IGNtZCBmcm9tIGlvY3RsCisgKiBAYXJnOiBhcmcgZnJvbSBpb2N0bAorICoKKyAqIFRoaXMgYXR0YWNoZXMgYSB1c2VyIHNwZWNpZmllZCBtb2RlIHRvIGFuIGNvbm5lY3Rvci4KKyAqIENhbGxlZCBieSB0aGUgdXNlciB2aWEgaW9jdGwuCisgKgorICogUkVUVVJOUzoKKyAqIFplcm8gb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9tb2RlX2F0dGFjaG1vZGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCAqbW9kZV9jbWQgPSBkYXRhOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyAqdW1vZGUgPSAmbW9kZV9jbWQtPm1vZGU7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgbW9kZV9jbWQtPmNvbm5lY3Rvcl9pZCwgRFJNX01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWNvbm5lY3RvciA9IG9ial90b19jb25uZWN0b3Iob2JqKTsKKworCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoZGV2KTsKKwlpZiAoIW1vZGUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZHJtX2NydGNfY29udmVydF91bW9kZShtb2RlLCB1bW9kZSk7CisKKwlyZXQgPSBkcm1fbW9kZV9hdHRhY2htb2RlKGRldiwgY29ubmVjdG9yLCBtb2RlKTsKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBkcm1fZmJfZGV0YWNobW9kZSAtIERldGFjaCBhIHVzZXIgc3BlY2lmaWVkIG1vZGUgZnJvbSBhbiBjb25uZWN0b3IKKyAqIEBpbm9kZTogaW5vZGUgZnJvbSB0aGUgaW9jdGwKKyAqIEBmaWxwOiBmaWxlICogZnJvbSB0aGUgaW9jdGwKKyAqIEBjbWQ6IGNtZCBmcm9tIGlvY3RsCisgKiBAYXJnOiBhcmcgZnJvbSBpb2N0bAorICoKKyAqIENhbGxlZCBieSB0aGUgdXNlciB2aWEgaW9jdGwuCisgKgorICogUkVUVVJOUzoKKyAqIFplcm8gb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9tb2RlX2RldGFjaG1vZGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX21vZGVfbW9kZV9jbWQgKm1vZGVfY21kID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvICp1bW9kZSA9ICZtb2RlX2NtZC0+bW9kZTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBtb2RlX2NtZC0+Y29ubmVjdG9yX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKKwlpZiAoIW9iaikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJY29ubmVjdG9yID0gb2JqX3RvX2Nvbm5lY3RvcihvYmopOworCisJZHJtX2NydGNfY29udmVydF91bW9kZSgmbW9kZSwgdW1vZGUpOworCXJldCA9IGRybV9tb2RlX2RldGFjaG1vZGUoZGV2LCBjb25uZWN0b3IsICZtb2RlKTsKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBkcm1fcHJvcGVydHkgKmRybV9wcm9wZXJ0eV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZsYWdzLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IG51bV92YWx1ZXMpCit7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHkgPSBOVUxMOworCisJcHJvcGVydHkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX3Byb3BlcnR5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wZXJ0eSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobnVtX3ZhbHVlcykgeworCQlwcm9wZXJ0eS0+dmFsdWVzID0ga3phbGxvYyhzaXplb2YodWludDY0X3QpKm51bV92YWx1ZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXByb3BlcnR5LT52YWx1ZXMpCisJCQlnb3RvIGZhaWw7CisJfQorCisJZHJtX21vZGVfb2JqZWN0X2dldChkZXYsICZwcm9wZXJ0eS0+YmFzZSwgRFJNX01PREVfT0JKRUNUX1BST1BFUlRZKTsKKwlwcm9wZXJ0eS0+ZmxhZ3MgPSBmbGFnczsKKwlwcm9wZXJ0eS0+bnVtX3ZhbHVlcyA9IG51bV92YWx1ZXM7CisJSU5JVF9MSVNUX0hFQUQoJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCk7CisKKwlpZiAobmFtZSkKKwkJc3RybmNweShwcm9wZXJ0eS0+bmFtZSwgbmFtZSwgRFJNX1BST1BfTkFNRV9MRU4pOworCisJbGlzdF9hZGRfdGFpbCgmcHJvcGVydHktPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLnByb3BlcnR5X2xpc3QpOworCXJldHVybiBwcm9wZXJ0eTsKK2ZhaWw6CisJa2ZyZWUocHJvcGVydHkpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fcHJvcGVydHlfY3JlYXRlKTsKKworaW50IGRybV9wcm9wZXJ0eV9hZGRfZW51bShzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwgaW50IGluZGV4LAorCQkJICB1aW50NjRfdCB2YWx1ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5X2VudW0gKnByb3BfZW51bTsKKworCWlmICghKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfRU5VTSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFsaXN0X2VtcHR5KCZwcm9wZXJ0eS0+ZW51bV9ibG9iX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocHJvcF9lbnVtLCAmcHJvcGVydHktPmVudW1fYmxvYl9saXN0LCBoZWFkKSB7CisJCQlpZiAocHJvcF9lbnVtLT52YWx1ZSA9PSB2YWx1ZSkgeworCQkJCXN0cm5jcHkocHJvcF9lbnVtLT5uYW1lLCBuYW1lLCBEUk1fUFJPUF9OQU1FX0xFTik7CisJCQkJcHJvcF9lbnVtLT5uYW1lW0RSTV9QUk9QX05BTUVfTEVOLTFdID0gJ1wwJzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCXByb3BfZW51bSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fcHJvcGVydHlfZW51bSksIEdGUF9LRVJORUwpOworCWlmICghcHJvcF9lbnVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cm5jcHkocHJvcF9lbnVtLT5uYW1lLCBuYW1lLCBEUk1fUFJPUF9OQU1FX0xFTik7CisJcHJvcF9lbnVtLT5uYW1lW0RSTV9QUk9QX05BTUVfTEVOLTFdID0gJ1wwJzsKKwlwcm9wX2VudW0tPnZhbHVlID0gdmFsdWU7CisKKwlwcm9wZXJ0eS0+dmFsdWVzW2luZGV4XSA9IHZhbHVlOworCWxpc3RfYWRkX3RhaWwoJnByb3BfZW51bS0+aGVhZCwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wcm9wZXJ0eV9hZGRfZW51bSk7CisKK3ZvaWQgZHJtX3Byb3BlcnR5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHkpCit7CisJc3RydWN0IGRybV9wcm9wZXJ0eV9lbnVtICpwcm9wX2VudW0sICpwdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcm9wX2VudW0sIHB0LCAmcHJvcGVydHktPmVudW1fYmxvYl9saXN0LCBoZWFkKSB7CisJCWxpc3RfZGVsKCZwcm9wX2VudW0tPmhlYWQpOworCQlrZnJlZShwcm9wX2VudW0pOworCX0KKworCWlmIChwcm9wZXJ0eS0+bnVtX3ZhbHVlcykKKwkJa2ZyZWUocHJvcGVydHktPnZhbHVlcyk7CisJZHJtX21vZGVfb2JqZWN0X3B1dChkZXYsICZwcm9wZXJ0eS0+YmFzZSk7CisJbGlzdF9kZWwoJnByb3BlcnR5LT5oZWFkKTsKKwlrZnJlZShwcm9wZXJ0eSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9wcm9wZXJ0eV9kZXN0cm95KTsKKworaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksIHVpbnQ2NF90IGluaXRfdmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZOyBpKyspIHsKKwkJaWYgKGNvbm5lY3Rvci0+cHJvcGVydHlfaWRzW2ldID09IDApIHsKKwkJCWNvbm5lY3Rvci0+cHJvcGVydHlfaWRzW2ldID0gcHJvcGVydHktPmJhc2UuaWQ7CisJCQljb25uZWN0b3ItPnByb3BlcnR5X3ZhbHVlc1tpXSA9IGluaXRfdmFsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBEUk1fQ09OTkVDVE9SX01BWF9QUk9QRVJUWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KTsKKworaW50IGRybV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwgdWludDY0X3QgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX0NPTk5FQ1RPUl9NQVhfUFJPUEVSVFk7IGkrKykgeworCQlpZiAoY29ubmVjdG9yLT5wcm9wZXJ0eV9pZHNbaV0gPT0gcHJvcGVydHktPmJhc2UuaWQpIHsKKwkJCWNvbm5lY3Rvci0+cHJvcGVydHlfdmFsdWVzW2ldID0gdmFsdWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUpOworCitpbnQgZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9nZXRfdmFsdWUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LCB1aW50NjRfdCAqdmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZOyBpKyspIHsKKwkJaWYgKGNvbm5lY3Rvci0+cHJvcGVydHlfaWRzW2ldID09IHByb3BlcnR5LT5iYXNlLmlkKSB7CisJCQkqdmFsID0gY29ubmVjdG9yLT5wcm9wZXJ0eV92YWx1ZXNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9nZXRfdmFsdWUpOworCitpbnQgZHJtX21vZGVfZ2V0cHJvcGVydHlfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSAqb3V0X3Jlc3AgPSBkYXRhOworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5OworCWludCBlbnVtX2NvdW50ID0gMDsKKwlpbnQgYmxvYl9jb3VudCA9IDA7CisJaW50IHZhbHVlX2NvdW50ID0gMDsKKwlpbnQgcmV0ID0gMCwgaTsKKwlpbnQgY29waWVkOworCXN0cnVjdCBkcm1fcHJvcGVydHlfZW51bSAqcHJvcF9lbnVtOworCXN0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtIF9fdXNlciAqZW51bV9wdHI7CisJc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpwcm9wX2Jsb2I7CisJdWludDMyX3QgKmJsb2JfaWRfcHRyOworCXVpbnQ2NF90IF9fdXNlciAqdmFsdWVzX3B0cjsKKwl1aW50MzJfdCBfX3VzZXIgKmJsb2JfbGVuZ3RoX3B0cjsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgb3V0X3Jlc3AtPnByb3BfaWQsIERSTV9NT0RFX09CSkVDVF9QUk9QRVJUWSk7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlwcm9wZXJ0eSA9IG9ial90b19wcm9wZXJ0eShvYmopOworCisJaWYgKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfRU5VTSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3BfZW51bSwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCwgaGVhZCkKKwkJCWVudW1fY291bnQrKzsKKwl9IGVsc2UgaWYgKHByb3BlcnR5LT5mbGFncyAmIERSTV9NT0RFX1BST1BfQkxPQikgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3BfYmxvYiwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCwgaGVhZCkKKwkJCWJsb2JfY291bnQrKzsKKwl9CisKKwl2YWx1ZV9jb3VudCA9IHByb3BlcnR5LT5udW1fdmFsdWVzOworCisJc3RybmNweShvdXRfcmVzcC0+bmFtZSwgcHJvcGVydHktPm5hbWUsIERSTV9QUk9QX05BTUVfTEVOKTsKKwlvdXRfcmVzcC0+bmFtZVtEUk1fUFJPUF9OQU1FX0xFTi0xXSA9IDA7CisJb3V0X3Jlc3AtPmZsYWdzID0gcHJvcGVydHktPmZsYWdzOworCisJaWYgKChvdXRfcmVzcC0+Y291bnRfdmFsdWVzID49IHZhbHVlX2NvdW50KSAmJiB2YWx1ZV9jb3VudCkgeworCQl2YWx1ZXNfcHRyID0gKHVpbnQ2NF90ICopKHVuc2lnbmVkIGxvbmcpb3V0X3Jlc3AtPnZhbHVlc19wdHI7CisJCWZvciAoaSA9IDA7IGkgPCB2YWx1ZV9jb3VudDsgaSsrKSB7CisJCQlpZiAoY29weV90b191c2VyKHZhbHVlc19wdHIgKyBpLCAmcHJvcGVydHktPnZhbHVlc1tpXSwgc2l6ZW9mKHVpbnQ2NF90KSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCX0KKwlvdXRfcmVzcC0+Y291bnRfdmFsdWVzID0gdmFsdWVfY291bnQ7CisKKwlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9FTlVNKSB7CisJCWlmICgob3V0X3Jlc3AtPmNvdW50X2VudW1fYmxvYnMgPj0gZW51bV9jb3VudCkgJiYgZW51bV9jb3VudCkgeworCQkJY29waWVkID0gMDsKKwkJCWVudW1fcHRyID0gKHN0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtICopKHVuc2lnbmVkIGxvbmcpb3V0X3Jlc3AtPmVudW1fYmxvYl9wdHI7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3BfZW51bSwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCwgaGVhZCkgeworCisJCQkJaWYgKGNvcHlfdG9fdXNlcigmZW51bV9wdHJbY29waWVkXS52YWx1ZSwgJnByb3BfZW51bS0+dmFsdWUsIHNpemVvZih1aW50NjRfdCkpKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisKKwkJCQlpZiAoY29weV90b191c2VyKCZlbnVtX3B0cltjb3BpZWRdLm5hbWUsCisJCQkJCQkgJnByb3BfZW51bS0+bmFtZSwgRFJNX1BST1BfTkFNRV9MRU4pKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQkJY29waWVkKys7CisJCQl9CisJCX0KKwkJb3V0X3Jlc3AtPmNvdW50X2VudW1fYmxvYnMgPSBlbnVtX2NvdW50OworCX0KKworCWlmIChwcm9wZXJ0eS0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0JMT0IpIHsKKwkJaWYgKChvdXRfcmVzcC0+Y291bnRfZW51bV9ibG9icyA+PSBibG9iX2NvdW50KSAmJiBibG9iX2NvdW50KSB7CisJCQljb3BpZWQgPSAwOworCQkJYmxvYl9pZF9wdHIgPSAodWludDMyX3QgKikodW5zaWduZWQgbG9uZylvdXRfcmVzcC0+ZW51bV9ibG9iX3B0cjsKKwkJCWJsb2JfbGVuZ3RoX3B0ciA9ICh1aW50MzJfdCAqKSh1bnNpZ25lZCBsb25nKW91dF9yZXNwLT52YWx1ZXNfcHRyOworCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3BfYmxvYiwgJnByb3BlcnR5LT5lbnVtX2Jsb2JfbGlzdCwgaGVhZCkgeworCQkJCWlmIChwdXRfdXNlcihwcm9wX2Jsb2ItPmJhc2UuaWQsIGJsb2JfaWRfcHRyICsgY29waWVkKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCisJCQkJaWYgKHB1dF91c2VyKHByb3BfYmxvYi0+bGVuZ3RoLCBibG9iX2xlbmd0aF9wdHIgKyBjb3BpZWQpKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisKKwkJCQljb3BpZWQrKzsKKwkJCX0KKwkJfQorCQlvdXRfcmVzcC0+Y291bnRfZW51bV9ibG9icyA9IGJsb2JfY291bnQ7CisJfQorZG9uZToKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX3Byb3BlcnR5X2Jsb2IgKmRybV9wcm9wZXJ0eV9jcmVhdGVfYmxvYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbGVuZ3RoLAorCQkJCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5X2Jsb2IgKmJsb2I7CisKKwlpZiAoIWxlbmd0aCB8fCAhZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9iID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iKStsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghYmxvYikKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9iLT5kYXRhID0gKHZvaWQgKikoKGNoYXIgKilibG9iICsgc2l6ZW9mKHN0cnVjdCBkcm1fcHJvcGVydHlfYmxvYikpOworCWJsb2ItPmxlbmd0aCA9IGxlbmd0aDsKKworCW1lbWNweShibG9iLT5kYXRhLCBkYXRhLCBsZW5ndGgpOworCisJZHJtX21vZGVfb2JqZWN0X2dldChkZXYsICZibG9iLT5iYXNlLCBEUk1fTU9ERV9PQkpFQ1RfQkxPQik7CisKKwlsaXN0X2FkZF90YWlsKCZibG9iLT5oZWFkLCAmZGV2LT5tb2RlX2NvbmZpZy5wcm9wZXJ0eV9ibG9iX2xpc3QpOworCXJldHVybiBibG9iOworfQorCitzdGF0aWMgdm9pZCBkcm1fcHJvcGVydHlfZGVzdHJveV9ibG9iKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iICpibG9iKQoreworCWRybV9tb2RlX29iamVjdF9wdXQoZGV2LCAmYmxvYi0+YmFzZSk7CisJbGlzdF9kZWwoJmJsb2ItPmhlYWQpOworCWtmcmVlKGJsb2IpOworfQorCitpbnQgZHJtX21vZGVfZ2V0YmxvYl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1fbW9kZV9nZXRfYmxvYiAqb3V0X3Jlc3AgPSBkYXRhOworCXN0cnVjdCBkcm1fcHJvcGVydHlfYmxvYiAqYmxvYjsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICpibG9iX3B0cjsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCW9iaiA9IGRybV9tb2RlX29iamVjdF9maW5kKGRldiwgb3V0X3Jlc3AtPmJsb2JfaWQsIERSTV9NT0RFX09CSkVDVF9CTE9CKTsKKwlpZiAoIW9iaikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWJsb2IgPSBvYmpfdG9fYmxvYihvYmopOworCisJaWYgKG91dF9yZXNwLT5sZW5ndGggPT0gYmxvYi0+bGVuZ3RoKSB7CisJCWJsb2JfcHRyID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylvdXRfcmVzcC0+ZGF0YTsKKwkJaWYgKGNvcHlfdG9fdXNlcihibG9iX3B0ciwgYmxvYi0+ZGF0YSwgYmxvYi0+bGVuZ3RoKSl7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBkb25lOworCQl9CisJfQorCW91dF9yZXNwLT5sZW5ndGggPSBibG9iLT5sZW5ndGg7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgICBzdHJ1Y3QgZWRpZCAqZWRpZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY29ubmVjdG9yLT5lZGlkX2Jsb2JfcHRyKQorCQlkcm1fcHJvcGVydHlfZGVzdHJveV9ibG9iKGRldiwgY29ubmVjdG9yLT5lZGlkX2Jsb2JfcHRyKTsKKworCS8qIERlbGV0ZSBlZGlkLCB3aGVuIHRoZXJlIGlzIG5vbmUuICovCisJaWYgKCFlZGlkKSB7CisJCWNvbm5lY3Rvci0+ZWRpZF9ibG9iX3B0ciA9IE5VTEw7CisJCXJldCA9IGRybV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKGNvbm5lY3RvciwgZGV2LT5tb2RlX2NvbmZpZy5lZGlkX3Byb3BlcnR5LCAwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljb25uZWN0b3ItPmVkaWRfYmxvYl9wdHIgPSBkcm1fcHJvcGVydHlfY3JlYXRlX2Jsb2IoY29ubmVjdG9yLT5kZXYsIDEyOCwgZWRpZCk7CisKKwlyZXQgPSBkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQkJCSAgICAgICBkZXYtPm1vZGVfY29uZmlnLmVkaWRfcHJvcGVydHksCisJCQkJCSAgICAgICBjb25uZWN0b3ItPmVkaWRfYmxvYl9wdHItPmJhc2UuaWQpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KTsKKworaW50IGRybV9tb2RlX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9tb2RlX2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkgKm91dF9yZXNwID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHk7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBvdXRfcmVzcC0+Y29ubmVjdG9yX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ09OTkVDVE9SKTsKKwlpZiAoIW9iaikgeworCQlnb3RvIG91dDsKKwl9CisJY29ubmVjdG9yID0gb2JqX3RvX2Nvbm5lY3RvcihvYmopOworCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZOyBpKyspIHsKKwkJaWYgKGNvbm5lY3Rvci0+cHJvcGVydHlfaWRzW2ldID09IG91dF9yZXNwLT5wcm9wX2lkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gRFJNX0NPTk5FQ1RPUl9NQVhfUFJPUEVSVFkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBvdXRfcmVzcC0+cHJvcF9pZCwgRFJNX01PREVfT0JKRUNUX1BST1BFUlRZKTsKKwlpZiAoIW9iaikgeworCQlnb3RvIG91dDsKKwl9CisJcHJvcGVydHkgPSBvYmpfdG9fcHJvcGVydHkob2JqKTsKKworCWlmIChwcm9wZXJ0eS0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSkKKwkJZ290byBvdXQ7CisKKwlpZiAocHJvcGVydHktPmZsYWdzICYgRFJNX01PREVfUFJPUF9SQU5HRSkgeworCQlpZiAob3V0X3Jlc3AtPnZhbHVlIDwgcHJvcGVydHktPnZhbHVlc1swXSkKKwkJCWdvdG8gb3V0OworCisJCWlmIChvdXRfcmVzcC0+dmFsdWUgPiBwcm9wZXJ0eS0+dmFsdWVzWzFdKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJaW50IGZvdW5kID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHByb3BlcnR5LT5udW1fdmFsdWVzOyBpKyspIHsKKwkJCWlmIChwcm9wZXJ0eS0+dmFsdWVzW2ldID09IG91dF9yZXNwLT52YWx1ZSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChjb25uZWN0b3ItPmZ1bmNzLT5zZXRfcHJvcGVydHkpCisJCXJldCA9IGNvbm5lY3Rvci0+ZnVuY3MtPnNldF9wcm9wZXJ0eShjb25uZWN0b3IsIHByb3BlcnR5LCBvdXRfcmVzcC0+dmFsdWUpOworCisJLyogc3RvcmUgdGhlIHByb3BlcnR5IHZhbHVlIGlmIHN1Y2Nlc2Z1bCAqLworCWlmICghcmV0KQorCQlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsIHByb3BlcnR5LCBvdXRfcmVzcC0+dmFsdWUpOworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV0gPT0gMCkgeworCQkJY29ubmVjdG9yLT5lbmNvZGVyX2lkc1tpXSA9IGVuY29kZXItPmJhc2UuaWQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKTsKKwordm9pZCBkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV0gPT0gZW5jb2Rlci0+YmFzZS5pZCkgeworCQkJY29ubmVjdG9yLT5lbmNvZGVyX2lkc1tpXSA9IDA7CisJCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIpCisJCQkJY29ubmVjdG9yLT5lbmNvZGVyID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9jb25uZWN0b3JfZGV0YWNoX2VuY29kZXIpOworCitib29sIGRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgaW50IGdhbW1hX3NpemUpCit7CisJY3J0Yy0+Z2FtbWFfc2l6ZSA9IGdhbW1hX3NpemU7CisKKwljcnRjLT5nYW1tYV9zdG9yZSA9IGt6YWxsb2MoZ2FtbWFfc2l6ZSAqIHNpemVvZih1aW50MTZfdCkgKiAzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNydGMtPmdhbW1hX3N0b3JlKSB7CisJCWNydGMtPmdhbW1hX3NpemUgPSAwOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUpOworCitpbnQgZHJtX21vZGVfZ2FtbWFfc2V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCAqY3J0Y19sdXQgPSBkYXRhOworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJdm9pZCAqcl9iYXNlLCAqZ19iYXNlLCAqYl9iYXNlOworCWludCBzaXplOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBjcnRjX2x1dC0+Y3J0Y19pZCwgRFJNX01PREVfT0JKRUNUX0NSVEMpOworCWlmICghb2JqKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwljcnRjID0gb2JqX3RvX2NydGMob2JqKTsKKworCS8qIG1lbWNweSBpbnRvIGdhbW1hIHN0b3JlICovCisJaWYgKGNydGNfbHV0LT5nYW1tYV9zaXplICE9IGNydGMtPmdhbW1hX3NpemUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2l6ZSA9IGNydGNfbHV0LT5nYW1tYV9zaXplICogKHNpemVvZih1aW50MTZfdCkpOworCXJfYmFzZSA9IGNydGMtPmdhbW1hX3N0b3JlOworCWlmIChjb3B5X2Zyb21fdXNlcihyX2Jhc2UsICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNydGNfbHV0LT5yZWQsIHNpemUpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWdfYmFzZSA9IHJfYmFzZSArIHNpemU7CisJaWYgKGNvcHlfZnJvbV91c2VyKGdfYmFzZSwgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY3J0Y19sdXQtPmdyZWVuLCBzaXplKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwliX2Jhc2UgPSBnX2Jhc2UgKyBzaXplOworCWlmIChjb3B5X2Zyb21fdXNlcihiX2Jhc2UsICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNydGNfbHV0LT5ibHVlLCBzaXplKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwljcnRjLT5mdW5jcy0+Z2FtbWFfc2V0KGNydGMsIHJfYmFzZSwgZ19iYXNlLCBiX2Jhc2UsIGNydGMtPmdhbW1hX3NpemUpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBkcm1fbW9kZV9nYW1tYV9nZXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9tb2RlX2NydGNfbHV0ICpjcnRjX2x1dCA9IGRhdGE7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwl2b2lkICpyX2Jhc2UsICpnX2Jhc2UsICpiX2Jhc2U7CisJaW50IHNpemU7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGNydGNfbHV0LT5jcnRjX2lkLCBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyk7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWNydGMgPSBvYmpfdG9fY3J0YyhvYmopOworCisJLyogbWVtY3B5IGludG8gZ2FtbWEgc3RvcmUgKi8KKwlpZiAoY3J0Y19sdXQtPmdhbW1hX3NpemUgIT0gY3J0Yy0+Z2FtbWFfc2l6ZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzaXplID0gY3J0Y19sdXQtPmdhbW1hX3NpemUgKiAoc2l6ZW9mKHVpbnQxNl90KSk7CisJcl9iYXNlID0gY3J0Yy0+Z2FtbWFfc3RvcmU7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljcnRjX2x1dC0+cmVkLCByX2Jhc2UsIHNpemUpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWdfYmFzZSA9IHJfYmFzZSArIHNpemU7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljcnRjX2x1dC0+Z3JlZW4sIGdfYmFzZSwgc2l6ZSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJYl9iYXNlID0gZ19iYXNlICsgc2l6ZTsKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNydGNfbHV0LT5ibHVlLCBiX2Jhc2UsIHNpemUpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhOTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYwpAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKgorICogRFJNIGNvcmUgQ1JUQyByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgICAgS2VpdGggUGFja2FyZAorICoJRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqICAgICAgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiAgICAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKy8qCisgKiBEZXRhaWxlZCBtb2RlIGluZm8gZm9yIDgwMHg2MDBANjBIegorICovCitzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgc3RkX21vZGVbXSA9IHsKKwl7IERSTV9NT0RFKCI4MDB4NjAwIiwgRFJNX01PREVfVFlQRV9ERUZBVUxULCA0MDAwMCwgODAwLCA4NDAsCisJCSAgIDk2OCwgMTA1NiwgMCwgNjAwLCA2MDEsIDYwNSwgNjI4LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorfTsKKworLyoqCisgKiBkcm1faGVscGVyX3Byb2JlX2Nvbm5lY3Rvcl9tb2RlcyAtIGdldCBjb21wbGV0ZSBzZXQgb2YgZGlzcGxheSBtb2RlcworICogQGRldjogRFJNIGRldmljZQorICogQG1heFg6IG1heCB3aWR0aCBmb3IgbW9kZXMKKyAqIEBtYXhZOiBtYXggaGVpZ2h0IGZvciBtb2RlcworICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogQmFzZWQgb24gQGRldidzIG1vZGVfY29uZmlnIGxheW91dCwgc2NhbiBhbGwgdGhlIGNvbm5lY3RvcnMgYW5kIHRyeSB0byBkZXRlY3QKKyAqIG1vZGVzIG9uIHRoZW0uICBNb2RlcyB3aWxsIGZpcnN0IGJlIGFkZGVkIHRvIHRoZSBjb25uZWN0b3IncyBwcm9iZWRfbW9kZXMKKyAqIGxpc3QsIHRoZW4gY3VsbGVkIChiYXNlZCBvbiB2YWxpZGl0eSBhbmQgdGhlIEBtYXhYLCBAbWF4WSBwYXJhbWV0ZXJzKSBhbmQKKyAqIHB1dCBpbnRvIHRoZSBub3JtYWwgbW9kZXMgbGlzdC4KKyAqCisgKiBJbnRlbmRlZCB0byBiZSB1c2VkIGVpdGhlciBhdCBib290dXAgdGltZSBvciB3aGVuIG1ham9yIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZC4KKyAqCisgKiBGSVhNRTogdGFrZSBpbnRvIGFjY291bnQgbW9uaXRvciBsaW1pdHMKKyAqLwordm9pZCBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICAgICB1aW50MzJfdCBtYXhYLCB1aW50MzJfdCBtYXhZKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwgKnQ7CisJc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzICpjb25uZWN0b3JfZnVuY3MgPQorCQljb25uZWN0b3ItPmhlbHBlcl9wcml2YXRlOworCWludCByZXQ7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCS8qIHNldCBhbGwgbW9kZXMgdG8gdGhlIHVudmVyaWZpZWQgc3RhdGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgdCwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpCisJCW1vZGUtPnN0YXR1cyA9IE1PREVfVU5WRVJJRklFRDsKKworCWNvbm5lY3Rvci0+c3RhdHVzID0gY29ubmVjdG9yLT5mdW5jcy0+ZGV0ZWN0KGNvbm5lY3Rvcik7CisKKwlpZiAoY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpIHsKKwkJRFJNX0RFQlVHKCIlcyBpcyBkaXNjb25uZWN0ZWRcbiIsCisJCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCS8qIFRPRE8gc2V0IEVESUQgdG8gTlVMTCAqLworCQlyZXR1cm47CisJfQorCisJcmV0ID0gKCpjb25uZWN0b3JfZnVuY3MtPmdldF9tb2RlcykoY29ubmVjdG9yKTsKKworCWlmIChyZXQpIHsKKwkJZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKGNvbm5lY3Rvcik7CisJfQorCisJaWYgKG1heFggJiYgbWF4WSkKKwkJZHJtX21vZGVfdmFsaWRhdGVfc2l6ZShkZXYsICZjb25uZWN0b3ItPm1vZGVzLCBtYXhYLAorCQkJCSAgICAgICBtYXhZLCAwKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgdCwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJaWYgKG1vZGUtPnN0YXR1cyA9PSBNT0RFX09LKQorCQkJbW9kZS0+c3RhdHVzID0gY29ubmVjdG9yX2Z1bmNzLT5tb2RlX3ZhbGlkKGNvbm5lY3RvciwKKwkJCQkJCQkJICAgbW9kZSk7CisJfQorCisKKwlkcm1fbW9kZV9wcnVuZV9pbnZhbGlkKGRldiwgJmNvbm5lY3Rvci0+bW9kZXMsIHRydWUpOworCisJaWYgKGxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzdGRtb2RlOworCisJCURSTV9ERUJVRygiTm8gdmFsaWQgbW9kZXMgb24gJXNcbiIsCisJCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisKKwkJLyogU2hvdWxkIHdlIGRvIHRoaXMgaGVyZSA/Pz8KKwkJICogV2hlbiBubyB2YWxpZCBFRElEIG1vZGVzIGFyZSBhdmFpbGFibGUgd2UgZW5kIHVwCisJCSAqIGhlcmUgYW5kIGJhaWxlZCBpbiB0aGUgcGFzdCwgbm93IHdlIGFkZCBhIHN0YW5kYXJkCisJCSAqIDY0MHg0ODBANjBIeiBtb2RlIGFuZCBjYXJyeSBvbi4KKwkJICovCisJCXN0ZG1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmc3RkX21vZGVbMF0pOworCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3Rvciwgc3RkbW9kZSk7CisJCWRybV9tb2RlX2xpc3RfY29uY2F0KCZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywKKwkJCQkgICAgICZjb25uZWN0b3ItPm1vZGVzKTsKKworCQlEUk1fREVCVUcoIkFkZGluZyBzdGFuZGFyZCA2NDB4NDgwIEAgNjBIeiB0byAlc1xuIiwKKwkJCSAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwl9CisKKwlkcm1fbW9kZV9zb3J0KCZjb25uZWN0b3ItPm1vZGVzKTsKKworCURSTV9ERUJVRygiUHJvYmVkIG1vZGVzIGZvciAlc1xuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgdCwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJbW9kZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKKworCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7CisJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMpOworCit2b2lkIGRybV9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IG1heFgsCisJCQkJICAgICAgdWludDMyX3QgbWF4WSkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlcyhjb25uZWN0b3IsIG1heFgsIG1heFkpOworCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9wcm9iZV9jb25uZWN0b3JfbW9kZXMpOworCisKKy8qKgorICogZHJtX2hlbHBlcl9jcnRjX2luX3VzZSAtIGNoZWNrIGlmIGEgZ2l2ZW4gQ1JUQyBpcyBpbiBhIG1vZGVfY29uZmlnCisgKiBAY3J0YzogQ1JUQyB0byBjaGVjaworICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogV2FsayBAY3J0YydzIERSTSBkZXZpY2UncyBtb2RlX2NvbmZpZyBhbmQgc2VlIGlmIGl0J3MgaW4gdXNlLgorICoKKyAqIFJFVFVSTlM6CisgKiBUcnVlIGlmIEBjcnRjIGlzIHBhcnQgb2YgdGhlIG1vZGVfY29uZmlnLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgZHJtX2hlbHBlcl9jcnRjX2luX3VzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJLyogRklYTUU6IExvY2tpbmcgYXJvdW5kIGxpc3QgYWNjZXNzPyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKQorCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX2NydGNfaW5fdXNlKTsKKworLyoqCisgKiBkcm1fZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zIC0gZGlzYWJsZSB1bnVzZWQgb2JqZWN0cworICogQGRldjogRFJNIGRldmljZQorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogSWYgYW4gY29ubmVjdG9yIG9yIENSVEMgaXNuJ3QgcGFydCBvZiBAZGV2J3MgbW9kZV9jb25maWcsIGl0IGNhbiBiZSBkaXNhYmxlZAorICogYnkgY2FsbGluZyBpdHMgZHBtcyBmdW5jdGlvbiwgd2hpY2ggc2hvdWxkIHBvd2VyIGl0IG9mZi4KKyAqLwordm9pZCBkcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJaWYgKCFlbmNvZGVyLT5jcnRjKQorCQkJKCplbmNvZGVyX2Z1bmNzLT5kcG1zKShlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCQljcnRjLT5lbmFibGVkID0gZHJtX2hlbHBlcl9jcnRjX2luX3VzZShjcnRjKTsKKwkJaWYgKCFjcnRjLT5lbmFibGVkKSB7CisJCQljcnRjX2Z1bmNzLT5kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKwkJCWNydGMtPmZiID0gTlVMTDsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMpOworCitzdGF0aWMgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9oYXNfcHJlZmVycmVkX21vZGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgeworCQlpZiAoZHJtX21vZGVfd2lkdGgobW9kZSkgPiB3aWR0aCB8fAorCQkgICAgZHJtX21vZGVfaGVpZ2h0KG1vZGUpID4gaGVpZ2h0KQorCQkJY29udGludWU7CisJCWlmIChtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpCisJCQlyZXR1cm4gbW9kZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGRybV9jb25uZWN0b3JfZW5hYmxlZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIHN0cmljdCkKK3sKKwlib29sIGVuYWJsZTsKKworCWlmIChzdHJpY3QpIHsKKwkJZW5hYmxlID0gY29ubmVjdG9yLT5zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfSBlbHNlIHsKKwkJZW5hYmxlID0gY29ubmVjdG9yLT5zdGF0dXMgIT0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJfQorCXJldHVybiBlbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9lbmFibGVfY29ubmVjdG9ycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sICplbmFibGVkKQoreworCWJvb2wgYW55X2VuYWJsZWQgPSBmYWxzZTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWludCBpID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQllbmFibGVkW2ldID0gZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKGNvbm5lY3RvciwgdHJ1ZSk7CisJCWFueV9lbmFibGVkIHw9IGVuYWJsZWRbaV07CisJCWkrKzsKKwl9CisKKwlpZiAoYW55X2VuYWJsZWQpCisJCXJldHVybjsKKworCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQllbmFibGVkW2ldID0gZHJtX2Nvbm5lY3Rvcl9lbmFibGVkKGNvbm5lY3RvciwgZmFsc2UpOworCQlpKys7CisJfQorfQorCitzdGF0aWMgYm9vbCBkcm1fdGFyZ2V0X3ByZWZlcnJlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAorCQkJCSBib29sICplbmFibGVkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKworCQlpZiAoZW5hYmxlZFtpXSA9PSBmYWxzZSkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKworCQltb2Rlc1tpXSA9IGRybV9oYXNfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLCB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYgKCFtb2Rlc1tpXSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2Rlc1tpXSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpCisJCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBkcm1fcGlja19jcnRjcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZHJtX2NydGMgKipiZXN0X2NydGNzLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzLAorCQkJICBpbnQgbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCBjLCBvOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzICpjb25uZWN0b3JfZnVuY3M7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY3J0YyAqYmVzdF9jcnRjOworCWludCBteV9zY29yZSwgYmVzdF9zY29yZSwgc2NvcmU7CisJc3RydWN0IGRybV9jcnRjICoqY3J0Y3MsICpjcnRjOworCisJaWYgKG4gPT0gZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yKQorCQlyZXR1cm4gMDsKKwljID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGMgPT0gbikKKwkJCWJyZWFrOworCQljKys7CisJfQorCisJYmVzdF9jcnRjc1tuXSA9IE5VTEw7CisJYmVzdF9jcnRjID0gTlVMTDsKKwliZXN0X3Njb3JlID0gZHJtX3BpY2tfY3J0Y3MoZGV2LCBiZXN0X2NydGNzLCBtb2RlcywgbisxLCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAobW9kZXNbbl0gPT0gTlVMTCkKKwkJcmV0dXJuIGJlc3Rfc2NvcmU7CisKKwljcnRjcyA9IGttYWxsb2MoZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yICoKKwkJCXNpemVvZihzdHJ1Y3QgZHJtX2NydGMgKiksIEdGUF9LRVJORUwpOworCWlmICghY3J0Y3MpCisJCXJldHVybiBiZXN0X3Njb3JlOworCisJbXlfc2NvcmUgPSAxOworCWlmIChjb25uZWN0b3ItPnN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKKwkJbXlfc2NvcmUrKzsKKwlpZiAoZHJtX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpKQorCQlteV9zY29yZSsrOworCisJY29ubmVjdG9yX2Z1bmNzID0gY29ubmVjdG9yLT5oZWxwZXJfcHJpdmF0ZTsKKwllbmNvZGVyID0gY29ubmVjdG9yX2Z1bmNzLT5iZXN0X2VuY29kZXIoY29ubmVjdG9yKTsKKwlpZiAoIWVuY29kZXIpCisJCWdvdG8gb3V0OworCisJY29ubmVjdG9yLT5lbmNvZGVyID0gZW5jb2RlcjsKKworCS8qIHNlbGVjdCBhIGNydGMgZm9yIHRoaXMgY29ubmVjdG9yIGFuZCB0aGVuIGF0dGVtcHQgdG8gY29uZmlndXJlCisJICAgcmVtYWluaW5nIGNvbm5lY3RvcnMgKi8KKwljID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCisJCWlmICgoY29ubmVjdG9yLT5lbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyAmICgxIDw8IGMpKSA9PSAwKSB7CisJCQljKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAobyA9IDA7IG8gPCBuOyBvKyspCisJCQlpZiAoYmVzdF9jcnRjc1tvXSA9PSBjcnRjKQorCQkJCWJyZWFrOworCisJCWlmIChvIDwgbikgeworCQkJLyogaWdub3JlIGNsb25pbmcgZm9yIG5vdyAqLworCQkJYysrOworCQkJY29udGludWU7CisJCX0KKworCQljcnRjc1tuXSA9IGNydGM7CisJCW1lbWNweShjcnRjcywgYmVzdF9jcnRjcywgbiAqIHNpemVvZihzdHJ1Y3QgZHJtX2NydGMgKikpOworCQlzY29yZSA9IG15X3Njb3JlICsgZHJtX3BpY2tfY3J0Y3MoZGV2LCBjcnRjcywgbW9kZXMsIG4gKyAxLAorCQkJCQkJICB3aWR0aCwgaGVpZ2h0KTsKKwkJaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworCQkJYmVzdF9jcnRjID0gY3J0YzsKKwkJCWJlc3Rfc2NvcmUgPSBzY29yZTsKKwkJCW1lbWNweShiZXN0X2NydGNzLCBjcnRjcywKKwkJCSAgICAgICBkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHJtX2NydGMgKikpOworCQl9CisJCWMrKzsKKwl9CitvdXQ6CisJa2ZyZWUoY3J0Y3MpOworCXJldHVybiBiZXN0X3Njb3JlOworfQorCitzdGF0aWMgdm9pZCBkcm1fc2V0dXBfY3J0Y3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKipjcnRjczsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqKm1vZGVzOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCWJvb2wgKmVuYWJsZWQ7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGksIHJldDsKKworCXdpZHRoID0gZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGg7CisJaGVpZ2h0ID0gZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0OworCisJLyogY2xlYW4gb3V0IGFsbCB0aGUgZW5jb2Rlci9jcnRjIGNvbWJvcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCWVuY29kZXItPmNydGMgPSBOVUxMOworCX0KKworCWNydGNzID0ga2NhbGxvYyhkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IsCisJCQlzaXplb2Yoc3RydWN0IGRybV9jcnRjICopLCBHRlBfS0VSTkVMKTsKKwltb2RlcyA9IGtjYWxsb2MoZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yLAorCQkJc2l6ZW9mKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICopLCBHRlBfS0VSTkVMKTsKKwllbmFibGVkID0ga2NhbGxvYyhkZXYtPm1vZGVfY29uZmlnLm51bV9jb25uZWN0b3IsCisJCQkgIHNpemVvZihib29sKSwgR0ZQX0tFUk5FTCk7CisKKwlkcm1fZW5hYmxlX2Nvbm5lY3RvcnMoZGV2LCBlbmFibGVkKTsKKworCXJldCA9IGRybV90YXJnZXRfcHJlZmVycmVkKGRldiwgbW9kZXMsIGVuYWJsZWQsIHdpZHRoLCBoZWlnaHQpOworCWlmICghcmV0KQorCQlEUk1fRVJST1IoIlVuYWJsZSB0byBmaW5kIGluaXRpYWwgbW9kZXNcbiIpOworCisJZHJtX3BpY2tfY3J0Y3MoZGV2LCBjcnRjcywgbW9kZXMsIDAsIHdpZHRoLCBoZWlnaHQpOworCisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gbW9kZXNbaV07CisJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGNydGNzW2ldOworCisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgPT0gTlVMTCkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobW9kZSAmJiBjcnRjKSB7CisJCQljcnRjLT5kZXNpcmVkX21vZGUgPSBtb2RlOworCQkJY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID0gY3J0YzsKKwkJfSBlbHNlCisJCQljb25uZWN0b3ItPmVuY29kZXItPmNydGMgPSBOVUxMOworCQlpKys7CisJfQorCisJa2ZyZWUoY3J0Y3MpOworCWtmcmVlKG1vZGVzKTsKKwlrZnJlZShlbmFibGVkKTsKK30KKy8qKgorICogZHJtX2NydGNfc2V0X21vZGUgLSBzZXQgYSBtb2RlCisgKiBAY3J0YzogQ1JUQyB0byBwcm9ncmFtCisgKiBAbW9kZTogbW9kZSB0byB1c2UKKyAqIEB4OiB3aWR0aCBvZiBtb2RlCisgKiBAeTogaGVpZ2h0IG9mIG1vZGUKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBtb2RlIGNvbmZpZyBsb2NrLgorICoKKyAqIFRyeSB0byBzZXQgQG1vZGUgb24gQGNydGMuICBHaXZlIEBjcnRjIGFuZCBpdHMgYXNzb2NpYXRlZCBjb25uZWN0b3JzIGEgY2hhbmNlCisgKiB0byBmaXh1cCBvciByZWplY3QgdGhlIG1vZGUgcHJpb3IgdG8gdHJ5aW5nIHRvIHNldCBpdC4KKyAqCisgKiBSRVRVUk5TOgorICogVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIGRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICAgIGludCB4LCBpbnQgeSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlLCBzYXZlZF9tb2RlOworCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzOworCWludCBzYXZlZF94LCBzYXZlZF95OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlib29sIHJldCA9IHRydWU7CisKKwlhZGp1c3RlZF9tb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgbW9kZSk7CisKKwljcnRjLT5lbmFibGVkID0gZHJtX2hlbHBlcl9jcnRjX2luX3VzZShjcnRjKTsKKworCWlmICghY3J0Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuIHRydWU7CisKKwlzYXZlZF9tb2RlID0gY3J0Yy0+bW9kZTsKKwlzYXZlZF94ID0gY3J0Yy0+eDsKKwlzYXZlZF95ID0gY3J0Yy0+eTsKKworCS8qIFVwZGF0ZSBjcnRjIHZhbHVlcyB1cCBmcm9udCBzbyB0aGUgZHJpdmVyIGNhbiByZWx5IG9uIHRoZW0gZm9yIG1vZGUKKwkgKiBzZXR0aW5nLgorCSAqLworCWNydGMtPm1vZGUgPSAqbW9kZTsKKwljcnRjLT54ID0geDsKKwljcnRjLT55ID0geTsKKworCWlmIChkcm1fbW9kZV9lcXVhbCgmc2F2ZWRfbW9kZSwgJmNydGMtPm1vZGUpKSB7CisJCWlmIChzYXZlZF94ICE9IGNydGMtPnggfHwgc2F2ZWRfeSAhPSBjcnRjLT55KSB7CisJCQljcnRjX2Z1bmNzLT5tb2RlX3NldF9iYXNlKGNydGMsIGNydGMtPngsIGNydGMtPnksCisJCQkJCQkgIG9sZF9mYik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwkvKiBQYXNzIG91ciBtb2RlIHRvIHRoZSBjb25uZWN0b3JzIGFuZCB0aGUgQ1JUQyB0byBnaXZlIHRoZW0gYSBjaGFuY2UgdG8KKwkgKiBhZGp1c3QgaXQgYWNjb3JkaW5nIHRvIGxpbWl0YXRpb25zIG9yIGNvbm5lY3RvciBwcm9wZXJ0aWVzLCBhbmQgYWxzbworCSAqIGEgY2hhbmNlIHRvIHJlamVjdCB0aGUgbW9kZSBlbnRpcmVseS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCisJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCisJCQljb250aW51ZTsKKwkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCQlpZiAoIShyZXQgPSBlbmNvZGVyX2Z1bmNzLT5tb2RlX2ZpeHVwKGVuY29kZXIsIG1vZGUsCisJCQkJCQkgICAgICBhZGp1c3RlZF9tb2RlKSkpIHsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmICghKHJldCA9IGNydGNfZnVuY3MtPm1vZGVfZml4dXAoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSkpKSB7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBQcmVwYXJlIHRoZSBlbmNvZGVycyBhbmQgQ1JUQ3MgYmVmb3JlIHNldHRpbmcgdGhlIG1vZGUuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKworCQlpZiAoZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJLyogRGlzYWJsZSB0aGUgZW5jb2RlcnMgYXMgdGhlIGZpcnN0IHRoaW5nIHdlIGRvLiAqLworCQllbmNvZGVyX2Z1bmNzLT5wcmVwYXJlKGVuY29kZXIpOworCX0KKworCWNydGNfZnVuY3MtPnByZXBhcmUoY3J0Yyk7CisKKwkvKiBTZXQgdXAgdGhlIERQTEwgYW5kIGFueSBlbmNvZGVycyBzdGF0ZSB0aGF0IG5lZWRzIHRvIGFkanVzdCBvciBkZXBlbmQKKwkgKiBvbiB0aGUgRFBMTC4KKwkgKi8KKwljcnRjX2Z1bmNzLT5tb2RlX3NldChjcnRjLCBtb2RlLCBhZGp1c3RlZF9tb2RlLCB4LCB5LCBvbGRfZmIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKworCQlpZiAoZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJRFJNX0lORk8oIiVzOiBzZXQgbW9kZSAlcyAleFxuIiwgZHJtX2dldF9lbmNvZGVyX25hbWUoZW5jb2RlciksCisJCQkgbW9kZS0+bmFtZSwgbW9kZS0+YmFzZS5pZCk7CisJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJZW5jb2Rlcl9mdW5jcy0+bW9kZV9zZXQoZW5jb2RlciwgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7CisJfQorCisJLyogTm93IGVuYWJsZSB0aGUgY2xvY2tzLCBwbGFuZSwgcGlwZSwgYW5kIGNvbm5lY3RvcnMgdGhhdCB3ZSBzZXQgdXAuICovCisJY3J0Y19mdW5jcy0+Y29tbWl0KGNydGMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKworCQlpZiAoZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCQllbmNvZGVyX2Z1bmNzLT5jb21taXQoZW5jb2Rlcik7CisKKwl9CisKKwkvKiBYWFggZnJlZSBhZGp1c3RlZG1vZGUgKi8KKwlkcm1fbW9kZV9kZXN0cm95KGRldiwgYWRqdXN0ZWRfbW9kZSk7CisJLyogRklYTUU6IGFkZCBzdWJwaXhlbCBvcmRlciAqLworZG9uZToKKwlpZiAoIXJldCkgeworCQljcnRjLT5tb2RlID0gc2F2ZWRfbW9kZTsKKwkJY3J0Yy0+eCA9IHNhdmVkX3g7CisJCWNydGMtPnkgPSBzYXZlZF95OworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZSk7CisKKworLyoqCisgKiBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZyAtIHNldCBhIG5ldyBjb25maWcgZnJvbSB1c2Vyc3BhY2UKKyAqIEBjcnRjOiBDUlRDIHRvIHNldHVwCisgKiBAY3J0Y19pbmZvOiB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24KKyAqIEBuZXdfbW9kZTogbmV3IG1vZGUgdG8gc2V0CisgKiBAY29ubmVjdG9yX3NldDogc2V0IG9mIGNvbm5lY3RvcnMgZm9yIHRoZSBuZXcgY29uZmlnCisgKiBAZmI6IG5ldyBmcmFtZWJ1ZmZlcgorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogU2V0dXAgYSBuZXcgY29uZmlndXJhdGlvbiwgcHJvdmlkZWQgYnkgdGhlIHVzZXIgaW4gQGNydGNfaW5mbywgYW5kIGVuYWJsZQorICogaXQuCisgKgorICogUkVUVVJOUzoKKyAqIFplcm8uIChGSVhNRSkKKyAqLworaW50IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnKHN0cnVjdCBkcm1fbW9kZV9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBkcm1fY3J0YyAqKnNhdmVfY3J0Y3MsICpuZXdfY3J0YzsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKipzYXZlX2VuY29kZXJzLCAqbmV3X2VuY29kZXI7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiOworCWJvb2wgc2F2ZV9lbmFibGVkOworCWJvb2wgY2hhbmdlZCA9IGZhbHNlOworCWJvb2wgZmxpcF9vcl9tb3ZlID0gZmFsc2U7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgY291bnQgPSAwLCBybywgZmFpbCA9IDA7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jczsKKwlpbnQgcmV0ID0gMDsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICghc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2V0LT5jcnRjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2V0LT5jcnRjLT5oZWxwZXJfcHJpdmF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcnRjX2Z1bmNzID0gc2V0LT5jcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKworCURSTV9ERUJVRygiY3J0YzogJXAgJWQgZmI6ICVwIGNvbm5lY3RvcnM6ICVwIG51bV9jb25uZWN0b3JzOiAlZCAoeCwgeSkgKCVpLCAlaSlcbiIsCisJCSAgc2V0LT5jcnRjLCBzZXQtPmNydGMtPmJhc2UuaWQsIHNldC0+ZmIsIHNldC0+Y29ubmVjdG9ycywKKwkJICAoaW50KXNldC0+bnVtX2Nvbm5lY3RvcnMsIHNldC0+eCwgc2V0LT55KTsKKworCWRldiA9IHNldC0+Y3J0Yy0+ZGV2OworCisJLyogc2F2ZSBwcmV2aW91cyBjb25maWcgKi8KKwlzYXZlX2VuYWJsZWQgPSBzZXQtPmNydGMtPmVuYWJsZWQ7CisKKwkvKiB0aGlzIGlzIG1lYW50IHRvIGJlIG51bV9jb25uZWN0b3Igbm90IG51bV9jcnRjICovCisJc2F2ZV9jcnRjcyA9IGt6YWxsb2MoZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkcm1fY3J0YyAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXZlX2NydGNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhdmVfZW5jb2RlcnMgPSBremFsbG9jKGRldi0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3RvciAqCisJCQkJc2l6ZW9mKHN0cnVjdCBkcm1fZW5jb2RlcnMgKiksIEdGUF9LRVJORUwpOworCWlmICghc2F2ZV9lbmNvZGVycykgeworCQlrZnJlZShzYXZlX2NydGNzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hlY2sgaGVyZSBpZiB0aGUgZmIgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMKKwkgKiBhbmQgdGhlbiBqdXN0IGZsaXBfb3JfbW92ZSBpdCAqLworCWlmIChzZXQtPmNydGMtPmZiICE9IHNldC0+ZmIpIHsKKwkJLyogaWYgd2UgaGF2ZSBubyBmYiB0aGVuIGl0cyBhIGNoYW5nZSBub3QgYSBmbGlwICovCisJCWlmIChzZXQtPmNydGMtPmZiID09IE5VTEwpCisJCQljaGFuZ2VkID0gdHJ1ZTsKKwkJZWxzZQorCQkJZmxpcF9vcl9tb3ZlID0gdHJ1ZTsKKwl9CisKKwlpZiAoc2V0LT54ICE9IHNldC0+Y3J0Yy0+eCB8fCBzZXQtPnkgIT0gc2V0LT5jcnRjLT55KQorCQlmbGlwX29yX21vdmUgPSB0cnVlOworCisJaWYgKHNldC0+bW9kZSAmJiAhZHJtX21vZGVfZXF1YWwoc2V0LT5tb2RlLCAmc2V0LT5jcnRjLT5tb2RlKSkgeworCQlEUk1fREVCVUcoIm1vZGVzIGFyZSBkaWZmZXJlbnRcbiIpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKCZzZXQtPmNydGMtPm1vZGUpOworCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHNldC0+bW9kZSk7CisJCWNoYW5nZWQgPSB0cnVlOworCX0KKworCS8qIGEpIHRyYXZlcnNlIHBhc3NlZCBpbiBjb25uZWN0b3IgbGlzdCBhbmQgZ2V0IGVuY29kZXJzIGZvciB0aGVtICovCisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgKmNvbm5lY3Rvcl9mdW5jcyA9CisJCQljb25uZWN0b3ItPmhlbHBlcl9wcml2YXRlOworCQlzYXZlX2VuY29kZXJzW2NvdW50KytdID0gY29ubmVjdG9yLT5lbmNvZGVyOworCQluZXdfZW5jb2RlciA9IGNvbm5lY3Rvci0+ZW5jb2RlcjsKKwkJZm9yIChybyA9IDA7IHJvIDwgc2V0LT5udW1fY29ubmVjdG9yczsgcm8rKykgeworCQkJaWYgKHNldC0+Y29ubmVjdG9yc1tyb10gPT0gY29ubmVjdG9yKSB7CisJCQkJbmV3X2VuY29kZXIgPSBjb25uZWN0b3JfZnVuY3MtPmJlc3RfZW5jb2Rlcihjb25uZWN0b3IpOworCQkJCS8qIGlmIHdlIGNhbid0IGdldCBhbiBlbmNvZGVyIGZvciBhIGNvbm5lY3RvcgorCQkJCSAgIHdlIGFyZSBzZXR0aW5nIG5vdyAtIHRoZW4gZmFpbCAqLworCQkJCWlmIChuZXdfZW5jb2RlciA9PSBOVUxMKQorCQkJCQkvKiBkb24ndCBicmVhayBzbyBmYWlsIHBhdGggd29ya3MgY29ycmVjdCAqLworCQkJCQlmYWlsID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChuZXdfZW5jb2RlciAhPSBjb25uZWN0b3ItPmVuY29kZXIpIHsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQkJY29ubmVjdG9yLT5lbmNvZGVyID0gbmV3X2VuY29kZXI7CisJCX0KKwl9CisKKwlpZiAoZmFpbCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfbm9fZW5jb2RlcjsKKwl9CisKKwljb3VudCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmICghY29ubmVjdG9yLT5lbmNvZGVyKQorCQkJY29udGludWU7CisKKwkJc2F2ZV9jcnRjc1tjb3VudCsrXSA9IGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YzsKKworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IHNldC0+Y3J0YykKKwkJCW5ld19jcnRjID0gTlVMTDsKKwkJZWxzZQorCQkJbmV3X2NydGMgPSBjb25uZWN0b3ItPmVuY29kZXItPmNydGM7CisKKwkJZm9yIChybyA9IDA7IHJvIDwgc2V0LT5udW1fY29ubmVjdG9yczsgcm8rKykgeworCQkJaWYgKHNldC0+Y29ubmVjdG9yc1tyb10gPT0gY29ubmVjdG9yKQorCQkJCW5ld19jcnRjID0gc2V0LT5jcnRjOworCQl9CisJCWlmIChuZXdfY3J0YyAhPSBjb25uZWN0b3ItPmVuY29kZXItPmNydGMpIHsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQkJY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID0gbmV3X2NydGM7CisJCX0KKwl9CisKKwkvKiBtb2RlX3NldF9iYXNlIGlzIG5vdCBhIHJlcXVpcmVkIGZ1bmN0aW9uICovCisJaWYgKGZsaXBfb3JfbW92ZSAmJiAhY3J0Y19mdW5jcy0+bW9kZV9zZXRfYmFzZSkKKwkJY2hhbmdlZCA9IHRydWU7CisKKwlpZiAoY2hhbmdlZCkgeworCQlvbGRfZmIgPSBzZXQtPmNydGMtPmZiOworCQlzZXQtPmNydGMtPmZiID0gc2V0LT5mYjsKKwkJc2V0LT5jcnRjLT5lbmFibGVkID0gKHNldC0+bW9kZSAhPSBOVUxMKTsKKwkJaWYgKHNldC0+bW9kZSAhPSBOVUxMKSB7CisJCQlEUk1fREVCVUcoImF0dGVtcHRpbmcgdG8gc2V0IG1vZGUgZnJvbSB1c2Vyc3BhY2VcbiIpOworCQkJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShzZXQtPm1vZGUpOworCQkJaWYgKCFkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoc2V0LT5jcnRjLCBzZXQtPm1vZGUsCisJCQkJCQkgICAgICBzZXQtPngsIHNldC0+eSwKKwkJCQkJCSAgICAgIG9sZF9mYikpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZmFpbF9zZXRfbW9kZTsKKwkJCX0KKwkJCS8qIFRPRE8gYXJlIHRoZXNlIG5lZWRlZD8gKi8KKwkJCXNldC0+Y3J0Yy0+ZGVzaXJlZF94ID0gc2V0LT54OworCQkJc2V0LT5jcnRjLT5kZXNpcmVkX3kgPSBzZXQtPnk7CisJCQlzZXQtPmNydGMtPmRlc2lyZWRfbW9kZSA9IHNldC0+bW9kZTsKKwkJfQorCQlkcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhkZXYpOworCX0gZWxzZSBpZiAoZmxpcF9vcl9tb3ZlKSB7CisJCW9sZF9mYiA9IHNldC0+Y3J0Yy0+ZmI7CisJCWlmIChzZXQtPmNydGMtPmZiICE9IHNldC0+ZmIpCisJCQlzZXQtPmNydGMtPmZiID0gc2V0LT5mYjsKKwkJY3J0Y19mdW5jcy0+bW9kZV9zZXRfYmFzZShzZXQtPmNydGMsIHNldC0+eCwgc2V0LT55LCBvbGRfZmIpOworCX0KKworCWtmcmVlKHNhdmVfZW5jb2RlcnMpOworCWtmcmVlKHNhdmVfY3J0Y3MpOworCXJldHVybiAwOworCitmYWlsX3NldF9tb2RlOgorCXNldC0+Y3J0Yy0+ZW5hYmxlZCA9IHNhdmVfZW5hYmxlZDsKKwljb3VudCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKQorCQljb25uZWN0b3ItPmVuY29kZXItPmNydGMgPSBzYXZlX2NydGNzW2NvdW50KytdOworZmFpbF9ub19lbmNvZGVyOgorCWtmcmVlKHNhdmVfY3J0Y3MpOworCWNvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJY29ubmVjdG9yLT5lbmNvZGVyID0gc2F2ZV9lbmNvZGVyc1tjb3VudCsrXTsKKwl9CisJa2ZyZWUoc2F2ZV9lbmNvZGVycyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcpOworCitib29sIGRybV9oZWxwZXJfcGx1Z2dlZF9ldmVudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCURSTV9ERUJVRygiXG4iKTsKKworCWRybV9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKGRldiwgZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGgsCisJCQkJCSBkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQpOworCisJZHJtX3NldHVwX2NydGNzKGRldik7CisKKwkvKiBhbGVydCB0aGUgZHJpdmVyIGZiIGxheWVyICovCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcy0+ZmJfY2hhbmdlZChkZXYpOworCisJLyogRklYTUU6IHNlbmQgaG90cGx1ZyBldmVudCAqLworCXJldHVybiB0cnVlOworfQorLyoqCisgKiBkcm1faW5pdGlhbF9jb25maWcgLSBzZXR1cCBhIHNhbmUgaW5pdGlhbCBjb25uZWN0b3IgY29uZmlndXJhdGlvbgorICogQGRldjogRFJNIGRldmljZQorICogQGNhbl9ncm93OiB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgZ3Jvd2FibGUKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVkIGF0IGluaXQgdGltZSwgbXVzdCB0YWtlIG1vZGUgY29uZmlnIGxvY2suCisgKgorICogU2NhbiB0aGUgQ1JUQ3MgYW5kIGNvbm5lY3RvcnMgYW5kIHRyeSB0byBwdXQgdG9nZXRoZXIgYW4gaW5pdGlhbCBzZXR1cC4KKyAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgYSBjbG9uZWQgY29uZmlndXJhdGlvbiBhY3Jvc3MgYWxsIGhlYWRzIHdpdGgKKyAqIGEgbmV3IGZyYW1lYnVmZmVyIG9iamVjdCBhcyB0aGUgYmFja2luZyBzdG9yZS4KKyAqCisgKiBSRVRVUk5TOgorICogWmVybyBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIG5vbnplcm8gb3RoZXJ3aXNlLgorICovCitib29sIGRybV9oZWxwZXJfaW5pdGlhbF9jb25maWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBjYW5fZ3JvdykKK3sKKwlpbnQgcmV0ID0gZmFsc2U7CisKKwlkcm1faGVscGVyX3BsdWdnZWRfZXZlbnQoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX2luaXRpYWxfY29uZmlnKTsKKworLyoqCisgKiBkcm1faG90cGx1Z19zdGFnZV90d28KKyAqIEBkZXYgRFJNIGRldmljZQorICogQGNvbm5lY3RvciBob3RwbHVnZWQgY29ubmVjdG9yCisgKgorICogTE9DS0lORy4KKyAqIENhbGxlciBtdXN0IGhvbGQgbW9kZSBjb25maWcgbG9jaywgZnVuY3Rpb24gbWlnaHQgZ3JhYiBzdHJ1Y3QgbG9jay4KKyAqCisgKiBTdGFnZSB0d28gb2YgYSBob3RwbHVnLgorICoKKyAqIFJFVFVSTlM6CisgKiBaZXJvIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkcm1faGVscGVyX2hvdHBsdWdfc3RhZ2VfdHdvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX2hlbHBlcl9wbHVnZ2VkX2V2ZW50KGRldik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9ob3RwbHVnX3N0YWdlX3R3byk7CisKK2ludCBkcm1faGVscGVyX21vZGVfZmlsbF9mYl9zdHJ1Y3Qoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCit7CisJZmItPndpZHRoID0gbW9kZV9jbWQtPndpZHRoOworCWZiLT5oZWlnaHQgPSBtb2RlX2NtZC0+aGVpZ2h0OworCWZiLT5waXRjaCA9IG1vZGVfY21kLT5waXRjaDsKKwlmYi0+Yml0c19wZXJfcGl4ZWwgPSBtb2RlX2NtZC0+YnBwOworCWZiLT5kZXB0aCA9IG1vZGVfY21kLT5kZXB0aDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX21vZGVfZmlsbF9mYl9zdHJ1Y3QpOworCitpbnQgZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKworCQlpZiAoIWNydGMtPmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoY3J0YywgJmNydGMtPm1vZGUsCisJCQkJCSAgICAgICBjcnRjLT54LCBjcnRjLT55LCBjcnRjLT5mYik7CisKKwkJaWYgKHJldCA9PSBmYWxzZSkKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCBtb2RlIG9uIGNydGMgJXBcbiIsIGNydGMpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwppbmRleCA5OTYwOTdhLi5mZWJiNTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKQEAgLTc0LDYgKzc0LDkgQEAKIAlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYLCBkcm1fc2V0c2FyZWFjdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCwgZHJtX2dldHNhcmVhY3R4LCBEUk1fQVVUSCksCiAKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9TRVRfTUFTVEVSLCBkcm1fc2V0bWFzdGVyX2lvY3RsLCBEUk1fUk9PVF9PTkxZKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9EUk9QX01BU1RFUiwgZHJtX2Ryb3BtYXN0ZXJfaW9jdGwsIERSTV9ST09UX09OTFkpLAorCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfQUREX0NUWCwgZHJtX2FkZGN0eCwgRFJNX0FVVEh8RFJNX1JPT1RfT05MWSksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfUk1fQ1RYLCBkcm1fcm1jdHgsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9EX0NUWCwgZHJtX21vZGN0eCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKQEAgLTEyMyw2ICsxMjYsMjMgQEAKIAlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9HRU1fQ0xPU0UsIGRybV9nZW1fY2xvc2VfaW9jdGwsIDApLAogCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX0dFTV9GTElOSywgZHJtX2dlbV9mbGlua19pb2N0bCwgRFJNX0FVVEgpLAogCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX0dFTV9PUEVOLCBkcm1fZ2VtX29wZW5faW9jdGwsIERSTV9BVVRIKSwKKworCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfR0VUUkVTT1VSQ0VTLCBkcm1fbW9kZV9nZXRyZXNvdXJjZXMsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAorCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfR0VUQ1JUQywgZHJtX21vZGVfZ2V0Y3J0YywgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9TRVRDUlRDLCBkcm1fbW9kZV9zZXRjcnRjLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX0NVUlNPUiwgZHJtX21vZGVfY3Vyc29yX2lvY3RsLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX0dFVEdBTU1BLCBkcm1fbW9kZV9nYW1tYV9nZXRfaW9jdGwsIERSTV9NQVNURVIpLAorCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfU0VUR0FNTUEsIGRybV9tb2RlX2dhbW1hX3NldF9pb2N0bCwgRFJNX01BU1RFUiksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9HRVRFTkNPREVSLCBkcm1fbW9kZV9nZXRlbmNvZGVyLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX0dFVENPTk5FQ1RPUiwgZHJtX21vZGVfZ2V0Y29ubmVjdG9yLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX0FUVEFDSE1PREUsIGRybV9tb2RlX2F0dGFjaG1vZGVfaW9jdGwsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAorCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfREVUQUNITU9ERSwgZHJtX21vZGVfZGV0YWNobW9kZV9pb2N0bCwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9HRVRQUk9QRVJUWSwgZHJtX21vZGVfZ2V0cHJvcGVydHlfaW9jdGwsIERSTV9NQVNURVIgfCBEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9TRVRQUk9QRVJUWSwgZHJtX21vZGVfY29ubmVjdG9yX3Byb3BlcnR5X3NldF9pb2N0bCwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9HRVRQUk9QQkxPQiwgZHJtX21vZGVfZ2V0YmxvYl9pb2N0bCwgRFJNX01BU1RFUnxEUk1fQ09OVFJPTF9BTExPVyksCisJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERV9HRVRGQiwgZHJtX21vZGVfZ2V0ZmIsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAorCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX01PREVfQURERkIsIGRybV9tb2RlX2FkZGZiLCBEUk1fTUFTVEVSfERSTV9DT05UUk9MX0FMTE9XKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9NT0RFX1JNRkIsIGRybV9tb2RlX3JtZmIsIERSTV9NQVNURVJ8RFJNX0NPTlRST0xfQUxMT1cpLAogfTsKIAogI2RlZmluZSBEUk1fQ09SRV9JT0NUTF9DT1VOVAlBUlJBWV9TSVpFKCBkcm1faW9jdGxzICkKQEAgLTEzOCw4ICsxNTgsNiBAQAogICovCiBpbnQgZHJtX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpwdCwgKm5leHQ7Ci0Jc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0LCAqbGlzdF90OwogCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICp2bWEsICp2bWFfdGVtcDsKIAlpbnQgaTsKIApAQCAtMTQ5LDEzICsxNjcsNyBAQAogCQlkZXYtPmRyaXZlci0+bGFzdGNsb3NlKGRldik7CiAJRFJNX0RFQlVHKCJkcml2ZXIgbGFzdGNsb3NlIGNvbXBsZXRlZFxuIik7CiAKLQlpZiAoZGV2LT51bmlxdWUpIHsKLQkJZHJtX2ZyZWUoZGV2LT51bmlxdWUsIHN0cmxlbihkZXYtPnVuaXF1ZSkgKyAxLCBEUk1fTUVNX0RSSVZFUik7Ci0JCWRldi0+dW5pcXVlID0gTlVMTDsKLQkJZGV2LT51bmlxdWVfbGVuID0gMDsKLQl9Ci0KLQlpZiAoZGV2LT5pcnFfZW5hYmxlZCkKKwlpZiAoZGV2LT5pcnFfZW5hYmxlZCAmJiAhZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTE2NCwxOCArMTc2LDkgQEAKIAlkcm1fZHJhd2FibGVfZnJlZV9hbGwoZGV2KTsKIAlkZWxfdGltZXIoJmRldi0+dGltZXIpOwogCi0JLyogQ2xlYXIgcGlkIGxpc3QgKi8KLQlpZiAoZGV2LT5tYWdpY2ZyZWUubmV4dCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIG5leHQsICZkZXYtPm1hZ2ljZnJlZSwgaGVhZCkgewotCQkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKLQkJCWRybV9odF9yZW1vdmVfaXRlbSgmZGV2LT5tYWdpY2xpc3QsICZwdC0+aGFzaF9pdGVtKTsKLQkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9NQUdJQyk7Ci0JCX0KLQkJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYWdpY2xpc3QpOwotCX0KLQogCS8qIENsZWFyIEFHUCBpbmZvcm1hdGlvbiAqLwotCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3ApIHsKKwlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwICYmCisJICAgICFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CiAJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnksICp0ZW1wZTsKIAogCQkvKiBSZW1vdmUgQUdQIHJlc291cmNlcywgYnV0IGxlYXZlIGRldi0+YWdwCkBAIC0xOTQsNyArMTk3LDggQEAKIAkJZGV2LT5hZ3AtPmFjcXVpcmVkID0gMDsKIAkJZGV2LT5hZ3AtPmVuYWJsZWQgPSAwOwogCX0KLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykgJiYgZGV2LT5zZykgeworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSAmJiBkZXYtPnNnICYmCisJICAgICFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CiAJCWRybV9zZ19jbGVhbnVwKGRldi0+c2cpOwogCQlkZXYtPnNnID0gTlVMTDsKIAl9CkBAIC0yMDUsMTMgKzIwOSw2IEBACiAJCWRybV9mcmVlKHZtYSwgc2l6ZW9mKCp2bWEpLCBEUk1fTUVNX1ZNQVMpOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyX2xpc3QsIGxpc3RfdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewotCQlpZiAoIShyX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0RSSVZFUikpIHsKLQkJCWRybV9ybW1hcF9sb2NrZWQoZGV2LCByX2xpc3QtPm1hcCk7Ci0JCQlyX2xpc3QgPSBOVUxMOwotCQl9Ci0JfQotCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSAmJiBkZXYtPnF1ZXVlbGlzdCkgewogCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xdWV1ZV9jb3VudDsgaSsrKSB7CiAJCQlpZiAoZGV2LT5xdWV1ZWxpc3RbaV0pIHsKQEAgLTIyOCwxNCArMjI1LDExIEBACiAJfQogCWRldi0+cXVldWVfY291bnQgPSAwOwogCi0JaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSAmJgorCSAgICAhZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJZHJtX2RtYV90YWtlZG93bihkZXYpOwogCi0JaWYgKGRldi0+bG9jay5od19sb2NrKSB7Ci0JCWRldi0+c2lnZGF0YS5sb2NrID0gZGV2LT5sb2NrLmh3X2xvY2sgPSBOVUxMOwkvKiBTSE0gcmVtb3ZlZCAqLwotCQlkZXYtPmxvY2suZmlsZV9wcml2ID0gTlVMTDsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPmxvY2subG9ja19xdWV1ZSk7Ci0JfQorCWRldi0+ZGV2X21hcHBpbmcgPSBOVUxMOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJRFJNX0RFQlVHKCJsYXN0Y2xvc2UgY29tcGxldGVkXG4iKTsKQEAgLTI2Myw2ICsyNTcsOCBAQAogCiAJRFJNX0RFQlVHKCJcbiIpOwogCisJSU5JVF9MSVNUX0hFQUQoJmRyaXZlci0+ZGV2aWNlX2xpc3QpOworCiAJZm9yIChpID0gMDsgZHJpdmVyLT5wY2lfZHJpdmVyLmlkX3RhYmxlW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKIAkJcGlkID0gKHN0cnVjdCBwY2lfZGV2aWNlX2lkICopJmRyaXZlci0+cGNpX2RyaXZlci5pZF90YWJsZVtpXTsKIApAQCAtMzI5LDM1ICszMjUsMjQgQEAKIAlkcm1faHRfcmVtb3ZlKCZkZXYtPm1hcF9oYXNoKTsKIAlkcm1fY3R4Yml0bWFwX2NsZWFudXAoZGV2KTsKIAorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlkcm1fcHV0X21pbm9yKCZkZXYtPmNvbnRyb2wpOworCisJaWYgKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKQorCQlkcm1fZ2VtX2Rlc3Ryb3koZGV2KTsKKwogCWRybV9wdXRfbWlub3IoJmRldi0+cHJpbWFyeSk7CiAJaWYgKGRybV9wdXRfZGV2KGRldikpCiAJCURSTV9FUlJPUigiQ2Fubm90IHVubG9hZCBtb2R1bGVcbiIpOwogfQogCi1zdGF0aWMgaW50IGRybV9taW5vcnNfY2xlYW51cChpbnQgaWQsIHZvaWQgKnB0ciwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZHJtX21pbm9yICptaW5vciA9IHB0cjsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwotCXN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIgPSBkYXRhOwotCi0JZGV2ID0gbWlub3ItPmRldjsKLQlpZiAobWlub3ItPmRldi0+ZHJpdmVyICE9IGRyaXZlcikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobWlub3ItPnR5cGUgIT0gRFJNX01JTk9SX0xFR0FDWSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2KQotCQlwY2lfZGV2X3B1dChkZXYtPnBkZXYpOwotCWRybV9jbGVhbnVwKGRldik7Ci0JcmV0dXJuIDE7Ci19Ci0KIHZvaWQgZHJtX2V4aXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCAqdG1wOwogCURSTV9ERUJVRygiXG4iKTsKIAotCWlkcl9mb3JfZWFjaCgmZHJtX21pbm9yc19pZHIsICZkcm1fbWlub3JzX2NsZWFudXAsIGRyaXZlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmZHJpdmVyLT5kZXZpY2VfbGlzdCwgZHJpdmVyX2l0ZW0pCisJCWRybV9jbGVhbnVwKGRldik7CiAKIAlEUk1fSU5GTygiTW9kdWxlIHVubG9hZGVkXG4iKTsKIH0KQEAgLTUwMyw3ICs0ODgsNyBAQAogCQlyZXRjb2RlID0gLUVJTlZBTDsKIAl9IGVsc2UgaWYgKCgoaW9jdGwtPmZsYWdzICYgRFJNX1JPT1RfT05MWSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHx8CiAJCSAgICgoaW9jdGwtPmZsYWdzICYgRFJNX0FVVEgpICYmICFmaWxlX3ByaXYtPmF1dGhlbnRpY2F0ZWQpIHx8Ci0JCSAgICgoaW9jdGwtPmZsYWdzICYgRFJNX01BU1RFUikgJiYgIWZpbGVfcHJpdi0+bWFzdGVyKSkgeworCQkgICAoKGlvY3RsLT5mbGFncyAmIERSTV9NQVNURVIpICYmICFmaWxlX3ByaXYtPmlzX21hc3RlcikpIHsKIAkJcmV0Y29kZSA9IC1FQUNDRVM7CiAJfSBlbHNlIHsKIAkJaWYgKGNtZCAmIChJT0NfSU4gfCBJT0NfT1VUKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJiMGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKQEAgLTAsMCArMSw3MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTHVjIFZlcmhhZWdlbiAocXVpcmtzIGxpc3QpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogRERDIHByb2Jpbmcgcm91dGluZXMgKGRybV9kZGNfcmVhZCAmIGRybV9kb19wcm9iZV9kZGNfZWRpZCkgb3JpZ2luYWxseSBmcm9tCisgKiBGQiBsYXllci4KKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2IERlbm5pcyBNdW5zaWUgPGRtdW5zaWVAY2Vjcm9waWEuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2VkaWQuaCIKKworLyoKKyAqIFRPRE86CisgKiAgIC0gc3VwcG9ydCBFRElEIDEuNCAoaW5jbC4gQ0UgYmxvY2tzKQorICovCisKKy8qCisgKiBFRElEIGJsb2NrcyBvdXQgaW4gdGhlIHdpbGQgaGF2ZSBhIHZhcmlldHkgb2YgYnVncywgdHJ5IHRvIGNvbGxlY3QKKyAqIHRoZW0gaGVyZSAobm90ZSB0aGF0IHVzZXJzcGFjZSBtYXkgd29yayBhcm91bmQgYnJva2VuIG1vbml0b3JzIGZpcnN0LAorICogYnV0IGZpeGVzIHNob3VsZCBtYWtlIHRoZWlyIHdheSBoZXJlIHNvIHRoYXQgdGhlIGtlcm5lbCAianVzdCB3b3JrcyIKKyAqIG9uIGFzIG1hbnkgZGlzcGxheXMgYXMgcG9zc2libGUpLgorICovCisKKy8qIEZpcnN0IGRldGFpbGVkIG1vZGUgd3JvbmcsIHVzZSBsYXJnZXN0IDYwSHogbW9kZSAqLworI2RlZmluZSBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MAkJKDEgPDwgMCkKKy8qIFJlcG9ydGVkIDEzNU1IeiBwaXhlbCBjbG9jayBpcyB0b28gaGlnaCwgbmVlZHMgYWRqdXN0bWVudCAqLworI2RlZmluZSBFRElEX1FVSVJLXzEzNV9DTE9DS19UT09fSElHSAkJKDEgPDwgMSkKKy8qIFByZWZlciB0aGUgbGFyZ2VzdCBtb2RlIGF0IDc1IEh6ICovCisjZGVmaW5lIEVESURfUVVJUktfUFJFRkVSX0xBUkdFXzc1CQkoMSA8PCAyKQorLyogRGV0YWlsIHRpbWluZyBpcyBpbiBjbSBub3QgbW0gKi8KKyNkZWZpbmUgRURJRF9RVUlSS19ERVRBSUxFRF9JTl9DTQkJKDEgPDwgMykKKy8qIERldGFpbGVkIHRpbWluZyBkZXNjcmlwdG9ycyBoYXZlIGJvZ3VzIHNpemUgdmFsdWVzLCBzbyBqdXN0IHRha2UgdGhlCisgKiBtYXhpbXVtIHNpemUgYW5kIHVzZSB0aGF0LgorICovCisjZGVmaW5lIEVESURfUVVJUktfREVUQUlMRURfVVNFX01BWElNVU1fU0laRQkoMSA8PCA0KQorLyogTW9uaXRvciBmb3Jnb3QgdG8gc2V0IHRoZSBmaXJzdCBkZXRhaWxlZCBpcyBwcmVmZXJyZWQgYml0LiAqLworI2RlZmluZSBFRElEX1FVSVJLX0ZJUlNUX0RFVEFJTEVEX1BSRUZFUlJFRAkoMSA8PCA1KQorLyogdXNlICtoc3luYyArdnN5bmMgZm9yIGRldGFpbGVkIG1vZGUgKi8KKyNkZWZpbmUgRURJRF9RVUlSS19ERVRBSUxFRF9TWU5DX1BQCQkoMSA8PCA2KQorCitzdGF0aWMgc3RydWN0IGVkaWRfcXVpcmsgeworCWNoYXIgKnZlbmRvcjsKKwlpbnQgcHJvZHVjdF9pZDsKKwl1MzIgcXVpcmtzOworfSBlZGlkX3F1aXJrX2xpc3RbXSA9IHsKKwkvKiBBY2VyIEFMMTcwNiAqLworCXsgIkFDUiIsIDQ0MzU4LCBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MCB9LAorCS8qIEFjZXIgRjUxICovCisJeyAiQVBJIiwgMHg3NjAyLCBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MCB9LAorCS8qIFVua25vd24gQWNlciAqLworCXsgIkFDUiIsIDI0MjMsIEVESURfUVVJUktfRklSU1RfREVUQUlMRURfUFJFRkVSUkVEIH0sCisKKwkvKiBCZWxpbmVhIDEwIDE1IDU1ICovCisJeyAiTUFYIiwgMTUxNiwgRURJRF9RVUlSS19QUkVGRVJfTEFSR0VfNjAgfSwKKwl7ICJNQVgiLCAweDc3ZSwgRURJRF9RVUlSS19QUkVGRVJfTEFSR0VfNjAgfSwKKworCS8qIEVudmlzaW9uIFBlcmlwaGVyYWxzLCBJbmMuIEVOLTcxMDBlICovCisJeyAiRVBJIiwgNTkyNjQsIEVESURfUVVJUktfMTM1X0NMT0NLX1RPT19ISUdIIH0sCisKKwkvKiBGdW5haSBFbGVjdHJvbmljcyBQTTM2QiAqLworCXsgIkZDTSIsIDEzNjAwLCBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV83NSB8CisJICBFRElEX1FVSVJLX0RFVEFJTEVEX0lOX0NNIH0sCisKKwkvKiBMRyBQaGlsaXBzIExDRCBMUDE1NFcwMS1BNSAqLworCXsgIkxQTCIsIDAsIEVESURfUVVJUktfREVUQUlMRURfVVNFX01BWElNVU1fU0laRSB9LAorCXsgIkxQTCIsIDB4MmEwMCwgRURJRF9RVUlSS19ERVRBSUxFRF9VU0VfTUFYSU1VTV9TSVpFIH0sCisKKwkvKiBQaGlsaXBzIDEwN3A1IENSVCAqLworCXsgIlBITCIsIDU3MzY0LCBFRElEX1FVSVJLX0ZJUlNUX0RFVEFJTEVEX1BSRUZFUlJFRCB9LAorCisJLyogUHJvdmlldyBBWTc2NUMgKi8KKwl7ICJQVFMiLCA3NjUsIEVESURfUVVJUktfRklSU1RfREVUQUlMRURfUFJFRkVSUkVEIH0sCisKKwkvKiBTYW1zdW5nIFN5bmNNYXN0ZXIgMjA1QlcuICBOb3RlOiBpcm9ueSAqLworCXsgIlNBTSIsIDU0MSwgRURJRF9RVUlSS19ERVRBSUxFRF9TWU5DX1BQIH0sCisJLyogU2Ftc3VuZyBTeW5jTWFzdGVyIDIyWzUtNl1CVyAqLworCXsgIlNBTSIsIDU5NiwgRURJRF9RVUlSS19QUkVGRVJfTEFSR0VfNjAgfSwKKwl7ICJTQU0iLCA2MzgsIEVESURfUVVJUktfUFJFRkVSX0xBUkdFXzYwIH0sCit9OworCisKKy8qIFZhbGlkIEVESUQgaGVhZGVyIGhhcyB0aGVzZSBieXRlcyAqLworc3RhdGljIHU4IGVkaWRfaGVhZGVyW10gPSB7IDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAgfTsKKworLyoqCisgKiBlZGlkX2lzX3ZhbGlkIC0gc2FuaXR5IGNoZWNrIEVESUQgZGF0YQorICogQGVkaWQ6IEVESUQgZGF0YQorICoKKyAqIFNhbml0eSBjaGVjayB0aGUgRURJRCBibG9jayBieSBsb29raW5nIGF0IHRoZSBoZWFkZXIsIHRoZSB2ZXJzaW9uIG51bWJlcgorICogYW5kIHRoZSBjaGVja3N1bS4gIFJldHVybiAwIGlmIHRoZSBFRElEIGRvZXNuJ3QgY2hlY2sgb3V0LCBvciAxIGlmIGl0J3MKKyAqIHZhbGlkLgorICovCitzdGF0aWMgYm9vbCBlZGlkX2lzX3ZhbGlkKHN0cnVjdCBlZGlkICplZGlkKQoreworCWludCBpOworCXU4IGNzdW0gPSAwOworCXU4ICpyYXdfZWRpZCA9ICh1OCAqKWVkaWQ7CisKKwlpZiAobWVtY21wKGVkaWQtPmhlYWRlciwgZWRpZF9oZWFkZXIsIHNpemVvZihlZGlkX2hlYWRlcikpKQorCQlnb3RvIGJhZDsKKwlpZiAoZWRpZC0+dmVyc2lvbiAhPSAxKSB7CisJCURSTV9FUlJPUigiRURJRCBoYXMgbWFqb3IgdmVyc2lvbiAlZCwgaW5zdGVhZCBvZiAxXG4iLCBlZGlkLT52ZXJzaW9uKTsKKwkJZ290byBiYWQ7CisJfQorCWlmIChlZGlkLT5yZXZpc2lvbiA8PSAwIHx8IGVkaWQtPnJldmlzaW9uID4gMykgeworCQlEUk1fRVJST1IoIkVESUQgaGFzIG1pbm9yIHZlcnNpb24gJWQsIHdoaWNoIGlzIG5vdCBiZXR3ZWVuIDAtM1xuIiwgZWRpZC0+cmV2aXNpb24pOworCQlnb3RvIGJhZDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRURJRF9MRU5HVEg7IGkrKykKKwkJY3N1bSArPSByYXdfZWRpZFtpXTsKKwlpZiAoY3N1bSkgeworCQlEUk1fRVJST1IoIkVESUQgY2hlY2tzdW0gaXMgaW52YWxpZCwgcmVtYWluZGVyIGlzICVkXG4iLCBjc3VtKTsKKwkJZ290byBiYWQ7CisJfQorCisJcmV0dXJuIDE7CisKK2JhZDoKKwlpZiAocmF3X2VkaWQpIHsKKwkJRFJNX0VSUk9SKCJSYXcgRURJRDpcbiIpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcyhLRVJOX0VSUiwgRFVNUF9QUkVGSVhfTk9ORSwgcmF3X2VkaWQsIEVESURfTEVOR1RIKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlZGlkX3ZlbmRvciAtIG1hdGNoIGEgc3RyaW5nIGFnYWluc3QgRURJRCdzIG9iZnVzY2F0ZWQgdmVuZG9yIGZpZWxkCisgKiBAZWRpZDogRURJRCB0byBtYXRjaAorICogQHZlbmRvcjogdmVuZG9yIHN0cmluZworICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAdmVuZG9yIGlzIGluIEBlZGlkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgZWRpZF92ZW5kb3Ioc3RydWN0IGVkaWQgKmVkaWQsIGNoYXIgKnZlbmRvcikKK3sKKwljaGFyIGVkaWRfdmVuZG9yWzNdOworCisJZWRpZF92ZW5kb3JbMF0gPSAoKGVkaWQtPm1mZ19pZFswXSAmIDB4N2MpID4+IDIpICsgJ0AnOworCWVkaWRfdmVuZG9yWzFdID0gKCgoZWRpZC0+bWZnX2lkWzBdICYgMHgzKSA8PCAzKSB8CisJCQkgICgoZWRpZC0+bWZnX2lkWzFdICYgMHhlMCkgPj4gNSkpICsgJ0AnOworCWVkaWRfdmVuZG9yWzJdID0gKGVkaWQtPm1mZ19pZFsyXSAmIDB4MWYpICsgJ0AnOworCisJcmV0dXJuICFzdHJuY21wKGVkaWRfdmVuZG9yLCB2ZW5kb3IsIDMpOworfQorCisvKioKKyAqIGVkaWRfZ2V0X3F1aXJrcyAtIHJldHVybiBxdWlyayBmbGFncyBmb3IgYSBnaXZlbiBFRElECisgKiBAZWRpZDogRURJRCB0byBwcm9jZXNzCisgKgorICogVGhpcyB0ZWxscyBzdWJzZXF1ZW50IHJvdXRpbmVzIHdoYXQgZml4ZXMgdGhleSBuZWVkIHRvIGFwcGx5LgorICovCitzdGF0aWMgdTMyIGVkaWRfZ2V0X3F1aXJrcyhzdHJ1Y3QgZWRpZCAqZWRpZCkKK3sKKwlzdHJ1Y3QgZWRpZF9xdWlyayAqcXVpcms7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlZGlkX3F1aXJrX2xpc3QpOyBpKyspIHsKKwkJcXVpcmsgPSAmZWRpZF9xdWlya19saXN0W2ldOworCisJCWlmIChlZGlkX3ZlbmRvcihlZGlkLCBxdWlyay0+dmVuZG9yKSAmJgorCQkgICAgKEVESURfUFJPRFVDVF9JRChlZGlkKSA9PSBxdWlyay0+cHJvZHVjdF9pZCkpCisJCQlyZXR1cm4gcXVpcmstPnF1aXJrczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNT0RFX1NJWkUobSkgKChtKS0+aGRpc3BsYXkgKiAobSktPnZkaXNwbGF5KQorI2RlZmluZSBNT0RFX1JFRlJFU0hfRElGRihtLHIpIChhYnMoKG0pLT52cmVmcmVzaCAtIHRhcmdldF9yZWZyZXNoKSkKKworCisvKioKKyAqIGVkaWRfZml4dXBfcHJlZmVycmVkIC0gc2V0IHByZWZlcnJlZCBtb2RlcyBiYXNlZCBvbiBxdWlyayBsaXN0CisgKiBAY29ubmVjdG9yOiBoYXMgbW9kZSBsaXN0IHRvIGZpeCB1cAorICogQHF1aXJrczogcXVpcmtzIGxpc3QKKyAqCisgKiBXYWxrIHRoZSBtb2RlIGxpc3QgZm9yIEBjb25uZWN0b3IsIGNsZWFyaW5nIHRoZSBwcmVmZXJyZWQgc3RhdHVzCisgKiBvbiBleGlzdGluZyBtb2RlcyBhbmQgc2V0dGluZyBpdCBhbmV3IGZvciB0aGUgcmlnaHQgbW9kZSBhbGEgQHF1aXJrcy4KKyAqLworc3RhdGljIHZvaWQgZWRpZF9maXh1cF9wcmVmZXJyZWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgdTMyIHF1aXJrcykKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqdCwgKmN1cl9tb2RlLCAqcHJlZmVycmVkX21vZGU7CisJaW50IHRhcmdldF9yZWZyZXNoID0gMDsKKworCWlmIChsaXN0X2VtcHR5KCZjb25uZWN0b3ItPnByb2JlZF9tb2RlcykpCisJCXJldHVybjsKKworCWlmIChxdWlya3MgJiBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV82MCkKKwkJdGFyZ2V0X3JlZnJlc2ggPSA2MDsKKwlpZiAocXVpcmtzICYgRURJRF9RVUlSS19QUkVGRVJfTEFSR0VfNzUpCisJCXRhcmdldF9yZWZyZXNoID0gNzU7CisKKwlwcmVmZXJyZWRfbW9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLAorCQkJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlLCBoZWFkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJfbW9kZSwgdCwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCWN1cl9tb2RlLT50eXBlICY9IH5EUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKworCQlpZiAoY3VyX21vZGUgPT0gcHJlZmVycmVkX21vZGUpCisJCQljb250aW51ZTsKKworCQkvKiBMYXJnZXN0IG1vZGUgaXMgcHJlZmVycmVkICovCisJCWlmIChNT0RFX1NJWkUoY3VyX21vZGUpID4gTU9ERV9TSVpFKHByZWZlcnJlZF9tb2RlKSkKKwkJCXByZWZlcnJlZF9tb2RlID0gY3VyX21vZGU7CisKKwkJLyogQXQgYSBnaXZlbiBzaXplLCB0cnkgdG8gZ2V0IGNsb3Nlc3QgdG8gdGFyZ2V0IHJlZnJlc2ggKi8KKwkJaWYgKChNT0RFX1NJWkUoY3VyX21vZGUpID09IE1PREVfU0laRShwcmVmZXJyZWRfbW9kZSkpICYmCisJCSAgICBNT0RFX1JFRlJFU0hfRElGRihjdXJfbW9kZSwgdGFyZ2V0X3JlZnJlc2gpIDwKKwkJICAgIE1PREVfUkVGUkVTSF9ESUZGKHByZWZlcnJlZF9tb2RlLCB0YXJnZXRfcmVmcmVzaCkpIHsKKwkJCXByZWZlcnJlZF9tb2RlID0gY3VyX21vZGU7CisJCX0KKwl9CisKKwlwcmVmZXJyZWRfbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKK30KKworLyoqCisgKiBkcm1fbW9kZV9zdGQgLSBjb252ZXJ0IHN0YW5kYXJkIG1vZGUgaW5mbyAod2lkdGgsIGhlaWdodCwgcmVmcmVzaCkgaW50byBtb2RlCisgKiBAdDogc3RhbmRhcmQgdGltaW5nIHBhcmFtcworICoKKyAqIFRha2UgdGhlIHN0YW5kYXJkIHRpbWluZyBwYXJhbXMgKGluIHRoaXMgY2FzZSB3aWR0aCwgYXNwZWN0LCBhbmQgcmVmcmVzaCkKKyAqIGFuZCBjb252ZXJ0IHRoZW0gaW50byBhIHJlYWwgbW9kZSB1c2luZyBDVlQuCisgKgorICogUHVudHMgZm9yIG5vdywgYnV0IHNob3VsZCBldmVudHVhbGx5IHVzZSB0aGUgRkIgbGF5ZXIncyBDVlQgYmFzZWQgbW9kZQorICogZ2VuZXJhdGlvbiBjb2RlLgorICovCitzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGVfc3RkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IHN0ZF90aW1pbmcgKnQpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJaW50IGhzaXplID0gdC0+aHNpemUgKiA4ICsgMjQ4LCB2c2l6ZTsKKworCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoZGV2KTsKKwlpZiAoIW1vZGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKHQtPmFzcGVjdF9yYXRpbyA9PSAwKQorCQl2c2l6ZSA9IChoc2l6ZSAqIDEwKSAvIDE2OworCWVsc2UgaWYgKHQtPmFzcGVjdF9yYXRpbyA9PSAxKQorCQl2c2l6ZSA9IChoc2l6ZSAqIDMpIC8gNDsKKwllbHNlIGlmICh0LT5hc3BlY3RfcmF0aW8gPT0gMikKKwkJdnNpemUgPSAoaHNpemUgKiA0KSAvIDU7CisJZWxzZQorCQl2c2l6ZSA9IChoc2l6ZSAqIDkpIC8gMTY7CisKKwlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKKworCXJldHVybiBtb2RlOworfQorCisvKioKKyAqIGRybV9tb2RlX2RldGFpbGVkIC0gY3JlYXRlIGEgbmV3IG1vZGUgZnJvbSBhbiBFRElEIGRldGFpbGVkIHRpbWluZyBzZWN0aW9uCisgKiBAZGV2OiBEUk0gZGV2aWNlIChuZWVkZWQgdG8gY3JlYXRlIG5ldyBtb2RlKQorICogQGVkaWQ6IEVESUQgYmxvY2sKKyAqIEB0aW1pbmc6IEVESUQgZGV0YWlsZWQgdGltaW5nIGluZm8KKyAqIEBxdWlya3M6IHF1aXJrcyB0byBhcHBseQorICoKKyAqIEFuIEVESUQgZGV0YWlsZWQgdGltaW5nIGJsb2NrIGNvbnRhaW5zIGVub3VnaCBpbmZvIGZvciB1cyB0byBjcmVhdGUgYW5kCisgKiByZXR1cm4gYSBuZXcgc3RydWN0IGRybV9kaXNwbGF5X21vZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZHJtX21vZGVfZGV0YWlsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgc3RydWN0IGVkaWQgKmVkaWQsCisJCQkJCQkgIHN0cnVjdCBkZXRhaWxlZF90aW1pbmcgKnRpbWluZywKKwkJCQkJCSAgdTMyIHF1aXJrcykKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlzdHJ1Y3QgZGV0YWlsZWRfcGl4ZWxfdGltaW5nICpwdCA9ICZ0aW1pbmctPmRhdGEucGl4ZWxfZGF0YTsKKworCWlmIChwdC0+c3RlcmVvKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0ZXJlbyBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFwdC0+c2VwYXJhdGVfc3luYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbnRlZ3JhdGVkIHN5bmMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoZGV2KTsKKwlpZiAoIW1vZGUpCisJCXJldHVybiBOVUxMOworCisJbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfRFJJVkVSOworCisJaWYgKHF1aXJrcyAmIEVESURfUVVJUktfMTM1X0NMT0NLX1RPT19ISUdIKQorCQl0aW1pbmctPnBpeGVsX2Nsb2NrID0gMTA4ODsKKworCW1vZGUtPmNsb2NrID0gdGltaW5nLT5waXhlbF9jbG9jayAqIDEwOworCisJbW9kZS0+aGRpc3BsYXkgPSAocHQtPmhhY3RpdmVfaGkgPDwgOCkgfCBwdC0+aGFjdGl2ZV9sbzsKKwltb2RlLT5oc3luY19zdGFydCA9IG1vZGUtPmhkaXNwbGF5ICsgKChwdC0+aHN5bmNfb2Zmc2V0X2hpIDw8IDgpIHwKKwkJCQkJICAgICAgcHQtPmhzeW5jX29mZnNldF9sbyk7CisJbW9kZS0+aHN5bmNfZW5kID0gbW9kZS0+aHN5bmNfc3RhcnQgKworCQkoKHB0LT5oc3luY19wdWxzZV93aWR0aF9oaSA8PCA4KSB8CisJCSBwdC0+aHN5bmNfcHVsc2Vfd2lkdGhfbG8pOworCW1vZGUtPmh0b3RhbCA9IG1vZGUtPmhkaXNwbGF5ICsgKChwdC0+aGJsYW5rX2hpIDw8IDgpIHwgcHQtPmhibGFua19sbyk7CisKKwltb2RlLT52ZGlzcGxheSA9IChwdC0+dmFjdGl2ZV9oaSA8PCA4KSB8IHB0LT52YWN0aXZlX2xvOworCW1vZGUtPnZzeW5jX3N0YXJ0ID0gbW9kZS0+dmRpc3BsYXkgKyAoKHB0LT52c3luY19vZmZzZXRfaGkgPDwgOCkgfAorCQkJCQkgICAgICBwdC0+dnN5bmNfb2Zmc2V0X2xvKTsKKwltb2RlLT52c3luY19lbmQgPSBtb2RlLT52c3luY19zdGFydCArCisJCSgocHQtPnZzeW5jX3B1bHNlX3dpZHRoX2hpIDw8IDgpIHwKKwkJIHB0LT52c3luY19wdWxzZV93aWR0aF9sbyk7CisJbW9kZS0+dnRvdGFsID0gbW9kZS0+dmRpc3BsYXkgKyAoKHB0LT52YmxhbmtfaGkgPDwgOCkgfCBwdC0+dmJsYW5rX2xvKTsKKworCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOworCisJaWYgKHB0LT5pbnRlcmxhY2VkKQorCQltb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRTsKKworCWlmIChxdWlya3MgJiBFRElEX1FVSVJLX0RFVEFJTEVEX1NZTkNfUFApIHsKKwkJcHQtPmhzeW5jX3Bvc2l0aXZlID0gMTsKKwkJcHQtPnZzeW5jX3Bvc2l0aXZlID0gMTsKKwl9CisKKwltb2RlLT5mbGFncyB8PSBwdC0+aHN5bmNfcG9zaXRpdmUgPyBEUk1fTU9ERV9GTEFHX1BIU1lOQyA6IERSTV9NT0RFX0ZMQUdfTkhTWU5DOworCW1vZGUtPmZsYWdzIHw9IHB0LT52c3luY19wb3NpdGl2ZSA/IERSTV9NT0RFX0ZMQUdfUFZTWU5DIDogRFJNX01PREVfRkxBR19OVlNZTkM7CisKKwltb2RlLT53aWR0aF9tbSA9IHB0LT53aWR0aF9tbV9sbyB8IChwdC0+d2lkdGhfbW1faGkgPDwgOCk7CisJbW9kZS0+aGVpZ2h0X21tID0gcHQtPmhlaWdodF9tbV9sbyB8IChwdC0+aGVpZ2h0X21tX2hpIDw8IDgpOworCisJaWYgKHF1aXJrcyAmIEVESURfUVVJUktfREVUQUlMRURfSU5fQ00pIHsKKwkJbW9kZS0+d2lkdGhfbW0gKj0gMTA7CisJCW1vZGUtPmhlaWdodF9tbSAqPSAxMDsKKwl9CisKKwlpZiAocXVpcmtzICYgRURJRF9RVUlSS19ERVRBSUxFRF9VU0VfTUFYSU1VTV9TSVpFKSB7CisJCW1vZGUtPndpZHRoX21tID0gZWRpZC0+d2lkdGhfY20gKiAxMDsKKwkJbW9kZS0+aGVpZ2h0X21tID0gZWRpZC0+aGVpZ2h0X2NtICogMTA7CisJfQorCisJcmV0dXJuIG1vZGU7Cit9CisKKy8qCisgKiBEZXRhaWxlZCBtb2RlIGluZm8gZm9yIHRoZSBFRElEICJlc3RhYmxpc2hlZCBtb2RlcyIgZGF0YSB0byB1c2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBlZGlkX2VzdF9tb2Rlc1tdID0geworCXsgRFJNX01PREUoIjgwMHg2MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNDAwMDAsIDgwMCwgODQwLAorCQkgICA5NjgsIDEwNTYsIDAsIDYwMCwgNjAxLCA2MDUsIDYyOCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwgLyogODAweDYwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiODAweDYwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAzNjAwMCwgODAwLCA4MjQsCisJCSAgIDg5NiwgMTAyNCwgMCwgNjAwLCA2MDEsIDYwMywgIDYyNSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwgLyogODAweDYwMEA1Nkh6ICovCisJeyBEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAzMTUwMCwgNjQwLCA2NTYsCisJCSAgIDcyMCwgODQwLCAwLCA0ODAsIDQ4MSwgNDg0LCA1MDAsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sIC8qIDY0MHg0ODBANzVIeiAqLworCXsgRFJNX01PREUoIjY0MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMzE1MDAsIDY0MCwgNjY0LAorCQkgICA3MDQsICA4MzIsIDAsIDQ4MCwgNDg5LCA0OTEsIDUyMCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwgLyogNjQweDQ4MEA3Mkh6ICovCisJeyBEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAzMDI0MCwgNjQwLCA3MDQsCisJCSAgIDc2OCwgIDg2NCwgMCwgNDgwLCA0ODMsIDQ4NiwgNTI1LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LCAvKiA2NDB4NDgwQDY3SHogKi8KKwl7IERSTV9NT0RFKCI2NDB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI1MjAwLCA2NDAsIDY1NiwKKwkJICAgNzUyLCA4MDAsIDAsIDQ4MCwgNDkwLCA0OTIsIDUyNSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwgLyogNjQweDQ4MEA2MEh6ICovCisJeyBEUk1fTU9ERSgiNzIweDQwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAzNTUwMCwgNzIwLCA3MzgsCisJCSAgIDg0NiwgOTAwLCAwLCA0MDAsIDQyMSwgNDIzLCAgNDQ5LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LCAvKiA3MjB4NDAwQDg4SHogKi8KKwl7IERSTV9NT0RFKCI3MjB4NDAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI4MzIwLCA3MjAsIDczOCwKKwkJICAgODQ2LCAgOTAwLCAwLCA0MDAsIDQxMiwgNDE0LCA0NDksIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sIC8qIDcyMHg0MDBANzBIeiAqLworCXsgRFJNX01PREUoIjEyODB4MTAyNCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMzUwMDAsIDEyODAsIDEyOTYsCisJCSAgIDE0NDAsIDE2ODgsIDAsIDEwMjQsIDEwMjUsIDEwMjgsIDEwNjYsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sIC8qIDEyODB4MTAyNEA3NUh6ICovCisJeyBEUk1fTU9ERSgiMTAyNHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzg4MDAsIDEwMjQsIDEwNDAsCisJCSAgIDExMzYsIDEzMTIsIDAsICA3NjgsIDc2OSwgNzcyLCA4MDAsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sIC8qIDEwMjR4NzY4QDc1SHogKi8KKwl7IERSTV9NT0RFKCIxMDI0eDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NTAwMCwgMTAyNCwgMTA0OCwKKwkJICAgMTE4NCwgMTMyOCwgMCwgIDc2OCwgNzcxLCA3NzcsIDgwNiwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwgLyogMTAyNHg3NjhANzBIeiAqLworCXsgRFJNX01PREUoIjEwMjR4NzY4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDY1MDAwLCAxMDI0LCAxMDQ4LAorCQkgICAxMTg0LCAxMzQ0LCAwLCAgNzY4LCA3NzEsIDc3NywgODA2LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LCAvKiAxMDI0eDc2OEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTAyNHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiw0NDkwMCwgMTAyNCwgMTAzMiwKKwkJICAgMTIwOCwgMTI2NCwgMCwgNzY4LCA3NjgsIDc3NiwgODE3LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DIHwgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIH0sIC8qIDEwMjR4NzY4QDQzSHogKi8KKwl7IERSTV9NT0RFKCI4MzJ4NjI0IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDU3Mjg0LCA4MzIsIDg2NCwKKwkJICAgOTI4LCAxMTUyLCAwLCA2MjQsIDYyNSwgNjI4LCA2NjcsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sIC8qIDgzMng2MjRANzVIeiAqLworCXsgRFJNX01PREUoIjgwMHg2MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNDk1MDAsIDgwMCwgODE2LAorCQkgICA4OTYsIDEwNTYsIDAsIDYwMCwgNjAxLCA2MDQsICA2MjUsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sIC8qIDgwMHg2MDBANzVIeiAqLworCXsgRFJNX01PREUoIjgwMHg2MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNTAwMDAsIDgwMCwgODU2LAorCQkgICA5NzYsIDEwNDAsIDAsIDYwMCwgNjM3LCA2NDMsIDY2NiwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwgLyogODAweDYwMEA3Mkh6ICovCisJeyBEUk1fTU9ERSgiMTE1Mng4NjQiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxMTUyLCAxMjE2LAorCQkgICAxMzQ0LCAxNjAwLCAwLCAgODY0LCA4NjUsIDg2OCwgOTAwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LCAvKiAxMTUyeDg2NEA3NUh6ICovCit9OworCisjZGVmaW5lIEVESURfRVNUX1RJTUlOR1MgMTYKKyNkZWZpbmUgRURJRF9TVERfVElNSU5HUyA4CisjZGVmaW5lIEVESURfREVUQUlMRURfVElNSU5HUyA0CisKKy8qKgorICogYWRkX2VzdGFibGlzaGVkX21vZGVzIC0gZ2V0IGVzdC4gbW9kZXMgZnJvbSBFRElEIGFuZCBhZGQgdGhlbQorICogQGVkaWQ6IEVESUQgYmxvY2sgdG8gc2NhbgorICoKKyAqIEVhY2ggRURJRCBibG9jayBjb250YWlucyBhIGJpdG1hcCBvZiB0aGUgc3VwcG9ydGVkICJlc3RhYmxpc2hlZCBtb2RlcyIgbGlzdAorICogKGRlZmluZWQgYWJvdmUpLiAgVGVhc2UgdGhlbSBvdXQgYW5kIGFkZCB0aGVtIHRvIHRoZSBnbG9iYWwgbW9kZXMgbGlzdC4KKyAqLworc3RhdGljIGludCBhZGRfZXN0YWJsaXNoZWRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZXN0X2JpdHMgPSBlZGlkLT5lc3RhYmxpc2hlZF90aW1pbmdzLnQxIHwKKwkJKGVkaWQtPmVzdGFibGlzaGVkX3RpbWluZ3MudDIgPDwgOCkgfAorCQkoKGVkaWQtPmVzdGFibGlzaGVkX3RpbWluZ3MubWZnX3JzdmQgJiAweDgwKSA8PCA5KTsKKwlpbnQgaSwgbW9kZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8PSBFRElEX0VTVF9USU1JTkdTOyBpKyspCisJCWlmIChlc3RfYml0cyAmICgxPDxpKSkgeworCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5ld21vZGU7CisJCQluZXdtb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgJmVkaWRfZXN0X21vZGVzW2ldKTsKKwkJCWlmIChuZXdtb2RlKSB7CisJCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG5ld21vZGUpOworCQkJCW1vZGVzKys7CisJCQl9CisJCX0KKworCXJldHVybiBtb2RlczsKK30KKworLyoqCisgKiBhZGRfc3RhbmRhcmRfbW9kZXMgLSBnZXQgc3RkLiBtb2RlcyBmcm9tIEVESUQgYW5kIGFkZCB0aGVtCisgKiBAZWRpZDogRURJRCBibG9jayB0byBzY2FuCisgKgorICogU3RhbmRhcmQgbW9kZXMgY2FuIGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIENWVCBzdGFuZGFyZC4gIEdyYWIgdGhlbSBmcm9tCisgKiBAZWRpZCwgY2FsY3VsYXRlIHRoZW0sIGFuZCBhZGQgdGhlbSB0byB0aGUgbGlzdC4KKyAqLworc3RhdGljIGludCBhZGRfc3RhbmRhcmRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCWludCBpLCBtb2RlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRURJRF9TVERfVElNSU5HUzsgaSsrKSB7CisJCXN0cnVjdCBzdGRfdGltaW5nICp0ID0gJmVkaWQtPnN0YW5kYXJkX3RpbWluZ3NbaV07CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuZXdtb2RlOworCisJCS8qIElmIHN0ZCB0aW1pbmdzIGJ5dGVzIGFyZSAxLCAxIGl0J3MgZW1wdHkgKi8KKwkJaWYgKHQtPmhzaXplID09IDEgJiYgKHQtPmFzcGVjdF9yYXRpbyB8IHQtPnZmcmVxKSA9PSAxKQorCQkJY29udGludWU7CisKKwkJbmV3bW9kZSA9IGRybV9tb2RlX3N0ZChkZXYsICZlZGlkLT5zdGFuZGFyZF90aW1pbmdzW2ldKTsKKwkJaWYgKG5ld21vZGUpIHsKKwkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKKwkJCW1vZGVzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbW9kZXM7Cit9CisKKy8qKgorICogYWRkX2RldGFpbGVkX21vZGVzIC0gZ2V0IGRldGFpbGVkIG1vZGUgaW5mbyBmcm9tIEVESUQgZGF0YQorICogQGNvbm5lY3RvcjogYXR0YWNoZWQgY29ubmVjdG9yCisgKiBAZWRpZDogRURJRCBibG9jayB0byBzY2FuCisgKiBAcXVpcmtzOiBxdWlya3MgdG8gYXBwbHkKKyAqCisgKiBTb21lIG9mIHRoZSBkZXRhaWxlZCB0aW1pbmcgc2VjdGlvbnMgbWF5IGNvbnRhaW4gbW9kZSBpbmZvcm1hdGlvbi4gIEdyYWIKKyAqIGl0IGFuZCBhZGQgaXQgdG8gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgYWRkX2RldGFpbGVkX2luZm8oc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgc3RydWN0IGVkaWQgKmVkaWQsIHUzMiBxdWlya3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCWludCBpLCBqLCBtb2RlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRURJRF9ERVRBSUxFRF9USU1JTkdTOyBpKyspIHsKKwkJc3RydWN0IGRldGFpbGVkX3RpbWluZyAqdGltaW5nID0gJmVkaWQtPmRldGFpbGVkX3RpbWluZ3NbaV07CisJCXN0cnVjdCBkZXRhaWxlZF9ub25fcGl4ZWwgKmRhdGEgPSAmdGltaW5nLT5kYXRhLm90aGVyX2RhdGE7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuZXdtb2RlOworCisJCS8qIEVESUQgdXAgdG8gYW5kIGluY2x1ZGluZyAxLjIgbWF5IHB1dCBtb25pdG9yIGluZm8gaGVyZSAqLworCQlpZiAoZWRpZC0+dmVyc2lvbiA9PSAxICYmIGVkaWQtPnJldmlzaW9uIDwgMykKKwkJCWNvbnRpbnVlOworCisJCS8qIERldGFpbGVkIG1vZGUgdGltaW5nICovCisJCWlmICh0aW1pbmctPnBpeGVsX2Nsb2NrKSB7CisJCQluZXdtb2RlID0gZHJtX21vZGVfZGV0YWlsZWQoZGV2LCBlZGlkLCB0aW1pbmcsIHF1aXJrcyk7CisJCQlpZiAoIW5ld21vZGUpCisJCQkJY29udGludWU7CisKKwkJCS8qIEZpcnN0IGRldGFpbGVkIG1vZGUgaXMgcHJlZmVycmVkICovCisJCQlpZiAoaSA9PSAwICYmIGVkaWQtPnByZWZlcnJlZF90aW1pbmcpCisJCQkJbmV3bW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBuZXdtb2RlKTsKKworCQkJbW9kZXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogT3RoZXIgdGltaW5nIG9yIGluZm8gKi8KKwkJc3dpdGNoIChkYXRhLT50eXBlKSB7CisJCWNhc2UgRURJRF9ERVRBSUxfTU9OSVRPUl9TRVJJQUw6CisJCQlicmVhazsKKwkJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX1NUUklORzoKKwkJCWJyZWFrOworCQljYXNlIEVESURfREVUQUlMX01PTklUT1JfUkFOR0U6CisJCQkvKiBHZXQgbW9uaXRvciByYW5nZSBkYXRhICovCisJCQlicmVhazsKKwkJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX05BTUU6CisJCQlicmVhazsKKwkJY2FzZSBFRElEX0RFVEFJTF9NT05JVE9SX0NQREFUQToKKwkJCWJyZWFrOworCQljYXNlIEVESURfREVUQUlMX1NURF9NT0RFUzoKKwkJCS8qIEZpdmUgbW9kZXMgcGVyIGRldGFpbGVkIHNlY3Rpb24gKi8KKwkJCWZvciAoaiA9IDA7IGogPCA1OyBpKyspIHsKKwkJCQlzdHJ1Y3Qgc3RkX3RpbWluZyAqc3RkOworCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuZXdtb2RlOworCisJCQkJc3RkID0gJmRhdGEtPmRhdGEudGltaW5nc1tqXTsKKwkJCQluZXdtb2RlID0gZHJtX21vZGVfc3RkKGRldiwgc3RkKTsKKwkJCQlpZiAobmV3bW9kZSkgeworCQkJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbmV3bW9kZSk7CisJCQkJCW1vZGVzKys7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBtb2RlczsKK30KKworI2RlZmluZSBERENfQUREUiAweDUwCisKK3Vuc2lnbmVkIGNoYXIgKmRybV9kb19wcm9iZV9kZGNfZWRpZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhciBzdGFydCA9IDB4MDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gRERDX0FERFIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gJnN0YXJ0LAorCQl9LCB7CisJCQkuYWRkcgk9IEREQ19BRERSLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gRURJRF9MRU5HVEgsCisJCQkuYnVmCT0gYnVmLAorCQl9CisJfTsKKworCWlmICghYnVmKSB7CisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFRElEICIKKwkJCSAiYmxvY2suXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAyKSA9PSAyKQorCQlyZXR1cm4gYnVmOworCisJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgInVuYWJsZSB0byByZWFkIEVESUQgYmxvY2suXG4iKTsKKwlrZnJlZShidWYpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fZG9fcHJvYmVfZGRjX2VkaWQpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZHJtX2RkY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFsZ29fZGF0YSA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKKwl1bnNpZ25lZCBjaGFyICplZGlkID0gTlVMTDsKKwlpbnQgaSwgajsKKworCWFsZ29fZGF0YS0+c2V0c2NsKGFsZ29fZGF0YS0+ZGF0YSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisJCS8qIEZvciBzb21lIG9sZCBtb25pdG9ycyB3ZSBuZWVkIHRoZQorCQkgKiBmb2xsb3dpbmcgcHJvY2VzcyB0byBpbml0aWFsaXplL3N0b3AgRERDCisJCSAqLworCQlhbGdvX2RhdGEtPnNldHNkYShhbGdvX2RhdGEtPmRhdGEsIDEpOworCQltc2xlZXAoMTMpOworCisJCWFsZ29fZGF0YS0+c2V0c2NsKGFsZ29fZGF0YS0+ZGF0YSwgMSk7CisJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKwkJCW1zbGVlcCgxMCk7CisJCQlpZiAoYWxnb19kYXRhLT5nZXRzY2woYWxnb19kYXRhLT5kYXRhKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSA1KQorCQkJY29udGludWU7CisKKwkJYWxnb19kYXRhLT5zZXRzZGEoYWxnb19kYXRhLT5kYXRhLCAwKTsKKwkJbXNsZWVwKDE1KTsKKwkJYWxnb19kYXRhLT5zZXRzY2woYWxnb19kYXRhLT5kYXRhLCAwKTsKKwkJbXNsZWVwKDE1KTsKKwkJYWxnb19kYXRhLT5zZXRzZGEoYWxnb19kYXRhLT5kYXRhLCAxKTsKKwkJbXNsZWVwKDE1KTsKKworCQkvKiBEbyB0aGUgcmVhbCB3b3JrICovCisJCWVkaWQgPSBkcm1fZG9fcHJvYmVfZGRjX2VkaWQoYWRhcHRlcik7CisJCWFsZ29fZGF0YS0+c2V0c2RhKGFsZ29fZGF0YS0+ZGF0YSwgMCk7CisJCWFsZ29fZGF0YS0+c2V0c2NsKGFsZ29fZGF0YS0+ZGF0YSwgMCk7CisJCW1zbGVlcCgxNSk7CisKKwkJYWxnb19kYXRhLT5zZXRzY2woYWxnb19kYXRhLT5kYXRhLCAxKTsKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspIHsKKwkJCW1zbGVlcCgxMCk7CisJCQlpZiAoYWxnb19kYXRhLT5nZXRzY2woYWxnb19kYXRhLT5kYXRhKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWFsZ29fZGF0YS0+c2V0c2RhKGFsZ29fZGF0YS0+ZGF0YSwgMSk7CisJCW1zbGVlcCgxNSk7CisJCWFsZ29fZGF0YS0+c2V0c2NsKGFsZ29fZGF0YS0+ZGF0YSwgMCk7CisJCWFsZ29fZGF0YS0+c2V0c2RhKGFsZ29fZGF0YS0+ZGF0YSwgMCk7CisJCWlmIChlZGlkKQorCQkJYnJlYWs7CisJfQorCS8qIFJlbGVhc2UgdGhlIEREQyBsaW5lcyB3aGVuIGRvbmUgb3IgdGhlIEFwcGxlIENpbmVtYSBIRCBkaXNwbGF5CisJICogd2lsbCBzd2l0Y2ggb2ZmCisJICovCisJYWxnb19kYXRhLT5zZXRzZGEoYWxnb19kYXRhLT5kYXRhLCAxKTsKKwlhbGdvX2RhdGEtPnNldHNjbChhbGdvX2RhdGEtPmRhdGEsIDEpOworCisJcmV0dXJuIGVkaWQ7Cit9CisKKy8qKgorICogZHJtX2dldF9lZGlkIC0gZ2V0IEVESUQgZGF0YSwgaWYgYXZhaWxhYmxlCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3Igd2UncmUgcHJvYmluZworICogQGFkYXB0ZXI6IGkyYyBhZGFwdGVyIHRvIHVzZSBmb3IgRERDCisgKgorICogUG9rZSB0aGUgZ2l2ZW4gY29ubmVjdG9yJ3MgaTJjIGNoYW5uZWwgdG8gZ3JhYiBFRElEIGRhdGEgaWYgcG9zc2libGUuCisgKgorICogUmV0dXJuIGVkaWQgZGF0YSBvciBOVUxMIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55LgorICovCitzdHJ1Y3QgZWRpZCAqZHJtX2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZWRpZCAqZWRpZDsKKworCWVkaWQgPSAoc3RydWN0IGVkaWQgKilkcm1fZGRjX3JlYWQoYWRhcHRlcik7CisJaWYgKCFlZGlkKSB7CisJCWRldl93YXJuKCZjb25uZWN0b3ItPmRldi0+cGRldi0+ZGV2LCAiJXM6IG5vIEVESUQgZGF0YVxuIiwKKwkJCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFlZGlkX2lzX3ZhbGlkKGVkaWQpKSB7CisJCWRldl93YXJuKCZjb25uZWN0b3ItPmRldi0+cGRldi0+ZGV2LCAiJXM6IEVESUQgaW52YWxpZC5cbiIsCisJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJa2ZyZWUoZWRpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnJhd19lZGlkID0gKGNoYXIgKillZGlkOworCisJcmV0dXJuIGVkaWQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfZWRpZCk7CisKKy8qKgorICogZHJtX2FkZF9lZGlkX21vZGVzIC0gYWRkIG1vZGVzIGZyb20gRURJRCBkYXRhLCBpZiBhdmFpbGFibGUKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB3ZSdyZSBwcm9iaW5nCisgKiBAZWRpZDogZWRpZCBkYXRhCisgKgorICogQWRkIHRoZSBzcGVjaWZpZWQgbW9kZXMgdG8gdGhlIGNvbm5lY3RvcidzIG1vZGUgbGlzdC4KKyAqCisgKiBSZXR1cm4gbnVtYmVyIG9mIG1vZGVzIGFkZGVkIG9yIDAgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkuCisgKi8KK2ludCBkcm1fYWRkX2VkaWRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpCit7CisJaW50IG51bV9tb2RlcyA9IDA7CisJdTMyIHF1aXJrczsKKworCWlmIChlZGlkID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghZWRpZF9pc192YWxpZChlZGlkKSkgeworCQlkZXZfd2FybigmY29ubmVjdG9yLT5kZXYtPnBkZXYtPmRldiwgIiVzOiBFRElEIGludmFsaWQuXG4iLAorCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisJCXJldHVybiAwOworCX0KKworCXF1aXJrcyA9IGVkaWRfZ2V0X3F1aXJrcyhlZGlkKTsKKworCW51bV9tb2RlcyArPSBhZGRfZXN0YWJsaXNoZWRfbW9kZXMoY29ubmVjdG9yLCBlZGlkKTsKKwludW1fbW9kZXMgKz0gYWRkX3N0YW5kYXJkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7CisJbnVtX21vZGVzICs9IGFkZF9kZXRhaWxlZF9pbmZvKGNvbm5lY3RvciwgZWRpZCwgcXVpcmtzKTsKKworCWlmIChxdWlya3MgJiAoRURJRF9RVUlSS19QUkVGRVJfTEFSR0VfNjAgfCBFRElEX1FVSVJLX1BSRUZFUl9MQVJHRV83NSkpCisJCWVkaWRfZml4dXBfcHJlZmVycmVkKGNvbm5lY3RvciwgcXVpcmtzKTsKKworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnNlcnJhdGlvbl92c3luYyA9IGVkaWQtPnNlcnJhdGlvbl92c3luYzsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zeW5jX29uX2dyZWVuID0gZWRpZC0+c3luY19vbl9ncmVlbjsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5jb21wb3NpdGVfc3luYyA9IGVkaWQtPmNvbXBvc2l0ZV9zeW5jOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnNlcGFyYXRlX3N5bmNzID0gZWRpZC0+c2VwYXJhdGVfc3luY3M7CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYmxhbmtfdG9fYmxhY2sgPSBlZGlkLT5ibGFua190b19ibGFjazsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby52aWRlb19sZXZlbCA9IGVkaWQtPnZpZGVvX2xldmVsOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmRpZ2l0YWwgPSBlZGlkLT5kaWdpdGFsOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tID0gZWRpZC0+d2lkdGhfY20gKiAxMDsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5oZWlnaHRfbW0gPSBlZGlkLT5oZWlnaHRfY20gKiAxMDsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5nYW1tYSA9IGVkaWQtPmdhbW1hOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmd0Zl9zdXBwb3J0ZWQgPSBlZGlkLT5kZWZhdWx0X2d0ZjsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdGFuZGFyZF9jb2xvciA9IGVkaWQtPnN0YW5kYXJkX2NvbG9yOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmRpc3BsYXlfdHlwZSA9IGVkaWQtPmRpc3BsYXlfdHlwZTsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5hY3RpdmVfb2ZmX3N1cHBvcnRlZCA9IGVkaWQtPnBtX2FjdGl2ZV9vZmY7CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uc3VzcGVuZF9zdXBwb3J0ZWQgPSBlZGlkLT5wbV9zdXNwZW5kOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnN0YW5kYnlfc3VwcG9ydGVkID0gZWRpZC0+cG1fc3RhbmRieTsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5nYW1tYSA9IGVkaWQtPmdhbW1hOworCisJcmV0dXJuIG51bV9tb2RlczsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2FkZF9lZGlkX21vZGVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggNzhlZWVkNS4uMzczM2UzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTM1LDcgKzM1LDYgQEAKICAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgotI2luY2x1ZGUgImRybV9zYXJlYS5oIgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCkBAIC00NCwxMCArNDMsOCBAQAogCiBzdGF0aWMgaW50IGRybV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fbG9jYWxfbWFwX3QgKm1hcDsKIAlpbnQgaTsKIAlpbnQgcmV0OwotCXUzMiBzYXJlYXBhZ2U7CiAKIAlpZiAoZGV2LT5kcml2ZXItPmZpcnN0b3BlbikgewogCQlyZXQgPSBkZXYtPmRyaXZlci0+Zmlyc3RvcGVuKGRldik7CkBAIC01NSwyMCArNTIsMTQgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2LT5tYWdpY2ZyZWUubmV4dCA9IE5VTEw7Ci0KLQkvKiBwcmVidWlsZCB0aGUgU0FSRUEgKi8KLQlzYXJlYXBhZ2UgPSBtYXhfdCh1bnNpZ25lZCwgU0FSRUFfTUFYLCBQQUdFX1NJWkUpOwotCWkgPSBkcm1fYWRkbWFwKGRldiwgMCwgc2FyZWFwYWdlLCBfRFJNX1NITSwgX0RSTV9DT05UQUlOU19MT0NLLCAmbWFwKTsKLQlpZiAoaSAhPSAwKQotCQlyZXR1cm4gaTsKLQogCWF0b21pY19zZXQoJmRldi0+aW9jdGxfY291bnQsIDApOwogCWF0b21pY19zZXQoJmRldi0+dm1hX2NvdW50LCAwKTsKLQlkZXYtPmJ1Zl91c2UgPSAwOwotCWF0b21pY19zZXQoJmRldi0+YnVmX2FsbG9jLCAwKTsKIAotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkgeworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSAmJgorCSAgICAhZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlkZXYtPmJ1Zl91c2UgPSAwOworCQlhdG9taWNfc2V0KCZkZXYtPmJ1Zl9hbGxvYywgMCk7CisKIAkJaSA9IGRybV9kbWFfc2V0dXAoZGV2KTsKIAkJaWYgKGkgPCAwKQogCQkJcmV0dXJuIGk7CkBAIC03NywxNiArNjgsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXYtPmNvdW50cyk7IGkrKykKIAkJYXRvbWljX3NldCgmZGV2LT5jb3VudHNbaV0sIDApOwogCi0JZHJtX2h0X2NyZWF0ZSgmZGV2LT5tYWdpY2xpc3QsIERSTV9NQUdJQ19IQVNIX09SREVSKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5tYWdpY2ZyZWUpOwotCiAJZGV2LT5zaWdkYXRhLmxvY2sgPSBOVUxMOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+bG9jay5sb2NrX3F1ZXVlKTsKKwogCWRldi0+cXVldWVfY291bnQgPSAwOwogCWRldi0+cXVldWVfcmVzZXJ2ZWQgPSAwOwogCWRldi0+cXVldWVfc2xvdHMgPSAwOwogCWRldi0+cXVldWVsaXN0ID0gTlVMTDsKLQlkZXYtPmlycV9lbmFibGVkID0gMDsKIAlkZXYtPmNvbnRleHRfZmxhZyA9IDA7CiAJZGV2LT5pbnRlcnJ1cHRfZmxhZyA9IDA7CiAJZGV2LT5kbWFfZmxhZyA9IDA7CkBAIC0xNDcsMTAgKzEzNCwyMCBAQAogCQlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CiAJCWlmICghZGV2LT5vcGVuX2NvdW50KyspIHsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOwotCQkJcmV0dXJuIGRybV9zZXR1cChkZXYpOworCQkJcmV0Y29kZSA9IGRybV9zZXR1cChkZXYpOworCQkJZ290byBvdXQ7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmRldi0+Y291bnRfbG9jayk7CiAJfQorb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAobWlub3ItPnR5cGUgPT0gRFJNX01JTk9SX0xFR0FDWSkgeworCQlCVUdfT04oKGRldi0+ZGV2X21hcHBpbmcgIT0gTlVMTCkgJiYKKwkJCShkZXYtPmRldl9tYXBwaW5nICE9IGlub2RlLT5pX21hcHBpbmcpKTsKKwkJaWYgKGRldi0+ZGV2X21hcHBpbmcgPT0gTlVMTCkKKwkJCWRldi0+ZGV2X21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCX0KKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiByZXRjb2RlOwogfQpAQCAtMjU1LDYgKzI1Miw3IEBACiAJcHJpdi0+bG9ja19jb3VudCA9IDA7CiAKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bGhlYWQpOworCUlOSVRfTElTVF9IRUFEKCZwcml2LT5mYnMpOwogCiAJaWYgKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKQogCQlkcm1fZ2VtX29wZW4oZGV2LCBwcml2KTsKQEAgLTI2NSwxMCArMjYzLDQyIEBACiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAobGlzdF9lbXB0eSgmZGV2LT5maWxlbGlzdCkpCi0JCXByaXYtPm1hc3RlciA9IDE7CiAKKwkvKiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG1hc3RlciBtYWtlIHRoaXMgZmQgaXQgKi8KKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKCFwcml2LT5taW5vci0+bWFzdGVyKSB7CisJCS8qIGNyZWF0ZSBhIG5ldyBtYXN0ZXIgKi8KKwkJcHJpdi0+bWlub3ItPm1hc3RlciA9IGRybV9tYXN0ZXJfY3JlYXRlKHByaXYtPm1pbm9yKTsKKwkJaWYgKCFwcml2LT5taW5vci0+bWFzdGVyKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCXByaXYtPmlzX21hc3RlciA9IDE7CisJCS8qIHRha2UgYW5vdGhlciByZWZlcmVuY2UgZm9yIHRoZSBjb3B5IGluIHRoZSBsb2NhbCBmaWxlIHByaXYgKi8KKwkJcHJpdi0+bWFzdGVyID0gZHJtX21hc3Rlcl9nZXQocHJpdi0+bWlub3ItPm1hc3Rlcik7CisKKwkJcHJpdi0+YXV0aGVudGljYXRlZCA9IDE7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWlmIChkZXYtPmRyaXZlci0+bWFzdGVyX2NyZWF0ZSkgeworCQkJcmV0ID0gZGV2LT5kcml2ZXItPm1hc3Rlcl9jcmVhdGUoZGV2LCBwcml2LT5tYXN0ZXIpOworCQkJaWYgKHJldCkgeworCQkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCQkvKiBkcm9wIGJvdGggcmVmZXJlbmNlcyBpZiB0aGlzIGZhaWxzICovCisJCQkJZHJtX21hc3Rlcl9wdXQoJnByaXYtPm1pbm9yLT5tYXN0ZXIpOworCQkJCWRybV9tYXN0ZXJfcHV0KCZwcml2LT5tYXN0ZXIpOworCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG1hc3RlciAqLworCQlwcml2LT5tYXN0ZXIgPSBkcm1fbWFzdGVyX2dldChwcml2LT5taW5vci0+bWFzdGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWxpc3RfYWRkKCZwcml2LT5saGVhZCwgJmRldi0+ZmlsZWxpc3QpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCkBAIC0zMTQsNiArMzQ0LDc0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYXN5bmMpOwogCisvKgorICogUmVjbGFpbSBsb2NrZWQgYnVmZmVyczsgbm90ZSB0aGF0IHRoaXMgbWF5IGJlIGEgYmFkIGlkZWEgaWYgdGhlIGN1cnJlbnQKKyAqIGNvbnRleHQgZG9lc24ndCBoYXZlIHRoZSBodyBsb2NrLi4uCisgKi8KK3N0YXRpYyB2b2lkIGRybV9yZWNsYWltX2xvY2tlZF9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmKQoreworCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2ID0gZi0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRybV9pX2hhdmVfaHdfbG9jayhkZXYsIGZpbGVfcHJpdikpIHsKKwkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQoZGV2LCBmaWxlX3ByaXYpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgX2VuZCA9IGppZmZpZXMgKyAzICogRFJNX0haOworCQlpbnQgbG9ja2VkID0gMDsKKworCQlkcm1faWRsZWxvY2tfdGFrZSgmZmlsZV9wcml2LT5tYXN0ZXItPmxvY2spOworCisJCS8qCisJCSAqIFdhaXQgZm9yIGEgd2hpbGUuCisJCSAqLworCQlkbyB7CisJCQlzcGluX2xvY2tfYmgoJmZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLnNwaW5sb2NrKTsKKwkJCWxvY2tlZCA9IGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmlkbGVfaGFzX2xvY2s7CisJCQlzcGluX3VubG9ja19iaCgmZmlsZV9wcml2LT5tYXN0ZXItPmxvY2suc3BpbmxvY2spOworCQkJaWYgKGxvY2tlZCkKKwkJCQlicmVhazsKKwkJCXNjaGVkdWxlKCk7CisJCX0gd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIF9lbmQpKTsKKworCQlpZiAoIWxvY2tlZCkgeworCQkJRFJNX0VSUk9SKCJyZWNsYWltX2J1ZmZlcnNfbG9ja2VkKCkgZGVhZGxvY2suIFBsZWFzZSByZXdvcmsgdGhpc1xuIgorCQkJCSAgIlx0ZHJpdmVyIHRvIHVzZSByZWNsYWltX2J1ZmZlcnNfaWRsZWxvY2tlZCgpIGluc3RlYWQuXG4iCisJCQkJICAiXHRJIHdpbGwgZ28gb24gcmVjbGFpbWluZyB0aGUgYnVmZmVycyBhbnl3YXkuXG4iKTsKKwkJfQorCisJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRldiwgZmlsZV9wcml2KTsKKwkJZHJtX2lkbGVsb2NrX3JlbGVhc2UoJmZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZCAmJgorCSAgICBmaWxlX3ByaXYtPm1hc3Rlci0+bG9jay5od19sb2NrKQorCQlkcm1fcmVjbGFpbV9sb2NrZWRfYnVmZmVycyhkZXYsIGZpbHApOworCisJaWYgKGRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfaWRsZWxvY2tlZCAmJgorCSAgICBmaWxlX3ByaXYtPm1hc3Rlci0+bG9jay5od19sb2NrKSB7CisJCWRybV9pZGxlbG9ja190YWtlKCZmaWxlX3ByaXYtPm1hc3Rlci0+bG9jayk7CisJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfaWRsZWxvY2tlZChkZXYsIGZpbGVfcHJpdik7CisJCWRybV9pZGxlbG9ja19yZWxlYXNlKCZmaWxlX3ByaXYtPm1hc3Rlci0+bG9jayk7CisJfQorCisKKwlpZiAoZHJtX2lfaGF2ZV9od19sb2NrKGRldiwgZmlsZV9wcml2KSkgeworCQlEUk1fREVCVUcoIkZpbGUgJXAgcmVsZWFzZWQsIGZyZWVpbmcgbG9jayBmb3IgY29udGV4dCAlZFxuIiwKKwkJCSAgZmlscCwgX0RSTV9MT0NLSU5HX0NPTlRFWFQoZmlsZV9wcml2LT5tYXN0ZXItPmxvY2suaHdfbG9jay0+bG9jaykpOworCQlkcm1fbG9ja19mcmVlKCZmaWxlX3ByaXYtPm1hc3Rlci0+bG9jaywKKwkJCSAgICAgIF9EUk1fTE9DS0lOR19DT05URVhUKGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmh3X2xvY2stPmxvY2spKTsKKwl9CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkgJiYKKwkgICAgIWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKSB7CisJCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnMoZGV2LCBmaWxlX3ByaXYpOworCX0KK30KKwogLyoqCiAgKiBSZWxlYXNlIGZpbGUuCiAgKgpAQCAtMzQ4LDYwICs0NDYsOSBAQAogCQkgIChsb25nKW9sZF9lbmNvZGVfZGV2KGZpbGVfcHJpdi0+bWlub3ItPmRldmljZSksCiAJCSAgZGV2LT5vcGVuX2NvdW50KTsKIAotCWlmIChkZXYtPmRyaXZlci0+cmVjbGFpbV9idWZmZXJzX2xvY2tlZCAmJiBkZXYtPmxvY2suaHdfbG9jaykgewotCQlpZiAoZHJtX2lfaGF2ZV9od19sb2NrKGRldiwgZmlsZV9wcml2KSkgewotCQkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQoZGV2LCBmaWxlX3ByaXYpOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgbG9uZyBlbmR0aW1lID0gamlmZmllcyArIDMgKiBEUk1fSFo7Ci0JCQlpbnQgbG9ja2VkID0gMDsKLQotCQkJZHJtX2lkbGVsb2NrX3Rha2UoJmRldi0+bG9jayk7Ci0KLQkJCS8qCi0JCQkgKiBXYWl0IGZvciBhIHdoaWxlLgotCQkJICovCi0KLQkJCWRvewotCQkJCXNwaW5fbG9ja19iaCgmZGV2LT5sb2NrLnNwaW5sb2NrKTsKLQkJCQlsb2NrZWQgPSBkZXYtPmxvY2suaWRsZV9oYXNfbG9jazsKLQkJCQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrLnNwaW5sb2NrKTsKLQkJCQlpZiAobG9ja2VkKQotCQkJCQlicmVhazsKLQkJCQlzY2hlZHVsZSgpOwotCQkJfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kdGltZSkpOwotCi0JCQlpZiAoIWxvY2tlZCkgewotCQkJCURSTV9FUlJPUigicmVjbGFpbV9idWZmZXJzX2xvY2tlZCgpIGRlYWRsb2NrLiBQbGVhc2UgcmV3b3JrIHRoaXNcbiIKLQkJCQkJICAiXHRkcml2ZXIgdG8gdXNlIHJlY2xhaW1fYnVmZmVyc19pZGxlbG9ja2VkKCkgaW5zdGVhZC5cbiIKLQkJCQkJICAiXHRJIHdpbGwgZ28gb24gcmVjbGFpbWluZyB0aGUgYnVmZmVycyBhbnl3YXkuXG4iKTsKLQkJCX0KLQotCQkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQoZGV2LCBmaWxlX3ByaXYpOwotCQkJZHJtX2lkbGVsb2NrX3JlbGVhc2UoJmRldi0+bG9jayk7Ci0JCX0KLQl9Ci0KLQlpZiAoZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19pZGxlbG9ja2VkICYmIGRldi0+bG9jay5od19sb2NrKSB7Ci0KLQkJZHJtX2lkbGVsb2NrX3Rha2UoJmRldi0+bG9jayk7Ci0JCWRldi0+ZHJpdmVyLT5yZWNsYWltX2J1ZmZlcnNfaWRsZWxvY2tlZChkZXYsIGZpbGVfcHJpdik7Ci0JCWRybV9pZGxlbG9ja19yZWxlYXNlKCZkZXYtPmxvY2spOwotCi0JfQotCi0JaWYgKGRybV9pX2hhdmVfaHdfbG9jayhkZXYsIGZpbGVfcHJpdikpIHsKLQkJRFJNX0RFQlVHKCJGaWxlICVwIHJlbGVhc2VkLCBmcmVlaW5nIGxvY2sgZm9yIGNvbnRleHQgJWRcbiIsCi0JCQkgIGZpbHAsIF9EUk1fTE9DS0lOR19DT05URVhUKGRldi0+bG9jay5od19sb2NrLT5sb2NrKSk7Ci0KLQkJZHJtX2xvY2tfZnJlZSgmZGV2LT5sb2NrLAotCQkJICAgICAgX0RSTV9MT0NLSU5HX0NPTlRFWFQoZGV2LT5sb2NrLmh3X2xvY2stPmxvY2spKTsKLQl9Ci0KLQotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSAmJgotCSAgICAhZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVyc19sb2NrZWQpIHsKLQkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVycyhkZXYsIGZpbGVfcHJpdik7Ci0JfQorCS8qIGlmIHRoZSBtYXN0ZXIgaGFzIGdvbmUgYXdheSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBsb2NrICovCisJaWYgKGZpbGVfcHJpdi0+bWlub3ItPm1hc3RlcikKKwkJZHJtX21hc3Rlcl9yZWxlYXNlKGRldiwgZmlscCk7CiAKIAlpZiAoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pCiAJCWRybV9nZW1fcmVsZWFzZShkZXYsIGZpbGVfcHJpdik7CkBAIC00MjgsMTIgKzQ3NSwyNCBAQAogCW11dGV4X3VubG9jaygmZGV2LT5jdHhsaXN0X211dGV4KTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoZmlsZV9wcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9PSAxKSB7Ci0JCXN0cnVjdCBkcm1fZmlsZSAqdGVtcDsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXAsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkKLQkJCXRlbXAtPmF1dGhlbnRpY2F0ZWQgPSAwOworCWlmIChmaWxlX3ByaXYtPmlzX21hc3RlcikgeworCQlzdHJ1Y3QgZHJtX2ZpbGUgKnRlbXA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcCwgJmRldi0+ZmlsZWxpc3QsIGxoZWFkKSB7CisJCQlpZiAoKHRlbXAtPm1hc3RlciA9PSBmaWxlX3ByaXYtPm1hc3RlcikgJiYKKwkJCSAgICAodGVtcCAhPSBmaWxlX3ByaXYpKQorCQkJCXRlbXAtPmF1dGhlbnRpY2F0ZWQgPSAwOworCQl9CisKKwkJaWYgKGZpbGVfcHJpdi0+bWlub3ItPm1hc3RlciA9PSBmaWxlX3ByaXYtPm1hc3RlcikgeworCQkJLyogZHJvcCB0aGUgcmVmZXJlbmNlIGhlbGQgbXkgdGhlIG1pbm9yICovCisJCQlkcm1fbWFzdGVyX3B1dCgmZmlsZV9wcml2LT5taW5vci0+bWFzdGVyKTsKKwkJfQogCX0KKworCS8qIGRyb3AgdGhlIHJlZmVyZW5jZSBoZWxkIG15IHRoZSBmaWxlIHByaXYgKi8KKwlkcm1fbWFzdGVyX3B1dCgmZmlsZV9wcml2LT5tYXN0ZXIpOworCWZpbGVfcHJpdi0+aXNfbWFzdGVyID0gMDsKIAlsaXN0X2RlbCgmZmlsZV9wcml2LT5saGVhZCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTQ0OCw5ICs1MDcsOSBAQAogCWF0b21pY19pbmMoJmRldi0+Y291bnRzW19EUk1fU1RBVF9DTE9TRVNdKTsKIAlzcGluX2xvY2soJmRldi0+Y291bnRfbG9jayk7CiAJaWYgKCEtLWRldi0+b3Blbl9jb3VudCkgewotCQlpZiAoYXRvbWljX3JlYWQoJmRldi0+aW9jdGxfY291bnQpIHx8IGRldi0+YmxvY2tlZCkgewotCQkJRFJNX0VSUk9SKCJEZXZpY2UgYnVzeTogJWQgJWRcbiIsCi0JCQkJICBhdG9taWNfcmVhZCgmZGV2LT5pb2N0bF9jb3VudCksIGRldi0+YmxvY2tlZCk7CisJCWlmIChhdG9taWNfcmVhZCgmZGV2LT5pb2N0bF9jb3VudCkpIHsKKwkJCURSTV9FUlJPUigiRGV2aWNlIGJ1c3k6ICVkXG4iLAorCQkJCSAgYXRvbWljX3JlYWQoJmRldi0+aW9jdGxfY291bnQpKTsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPmNvdW50X2xvY2spOwogCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCmluZGV4IGNjZDFhZmQuLjlkYTU4MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwpAQCAtNjQsNiArNjQsMTMgQEAKICAqIHVwIGF0IGEgbGF0ZXIgZGF0ZSwgYW5kIGFzIG91ciBpbnRlcmZhY2Ugd2l0aCBzaG1mcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24uCiAgKi8KIAorLyoKKyAqIFdlIG1ha2UgdXAgb2Zmc2V0cyBmb3IgYnVmZmVyIG9iamVjdHMgc28gd2UgY2FuIHJlY29nbml6ZSB0aGVtIGF0CisgKiBtbWFwIHRpbWUuCisgKi8KKyNkZWZpbmUgRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU1RBUlQgKCgweEZGRkZGRkZGVUwgPj4gUEFHRV9TSElGVCkgKyAxKQorI2RlZmluZSBEUk1fRklMRV9QQUdFX09GRlNFVF9TSVpFICgoMHhGRkZGRkZGRlVMID4+IFBBR0VfU0hJRlQpICogMTYpCisKIC8qKgogICogSW5pdGlhbGl6ZSB0aGUgR0VNIGRldmljZSBmaWVsZHMKICAqLwpAQCAtNzEsNiArNzgsOCBAQAogaW50CiBkcm1fZ2VtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW07CisKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5vYmplY3RfbmFtZV9sb2NrKTsKIAlpZHJfaW5pdCgmZGV2LT5vYmplY3RfbmFtZV9pZHIpOwogCWF0b21pY19zZXQoJmRldi0+b2JqZWN0X2NvdW50LCAwKTsKQEAgLTc5LDkgKzg4LDQxIEBACiAJYXRvbWljX3NldCgmZGV2LT5waW5fbWVtb3J5LCAwKTsKIAlhdG9taWNfc2V0KCZkZXYtPmd0dF9jb3VudCwgMCk7CiAJYXRvbWljX3NldCgmZGV2LT5ndHRfbWVtb3J5LCAwKTsKKworCW1tID0gZHJtX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRybV9nZW1fbW0pLCBEUk1fTUVNX01NKTsKKwlpZiAoIW1tKSB7CisJCURSTV9FUlJPUigib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+bW1fcHJpdmF0ZSA9IG1tOworCisJaWYgKGRybV9odF9jcmVhdGUoJm1tLT5vZmZzZXRfaGFzaCwgMTkpKSB7CisJCWRybV9mcmVlKG1tLCBzaXplb2Yoc3RydWN0IGRybV9nZW1fbW0pLCBEUk1fTUVNX01NKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGRybV9tbV9pbml0KCZtbS0+b2Zmc2V0X21hbmFnZXIsIERSTV9GSUxFX1BBR0VfT0ZGU0VUX1NUQVJULAorCQkJRFJNX0ZJTEVfUEFHRV9PRkZTRVRfU0laRSkpIHsKKwkJZHJtX2ZyZWUobW0sIHNpemVvZihzdHJ1Y3QgZHJtX2dlbV9tbSksIERSTV9NRU1fTU0pOworCQlkcm1faHRfcmVtb3ZlKCZtbS0+b2Zmc2V0X2hhc2gpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAordm9pZAorZHJtX2dlbV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOworCisJZHJtX21tX3Rha2Vkb3duKCZtbS0+b2Zmc2V0X21hbmFnZXIpOworCWRybV9odF9yZW1vdmUoJm1tLT5vZmZzZXRfaGFzaCk7CisJZHJtX2ZyZWUobW0sIHNpemVvZihzdHJ1Y3QgZHJtX2dlbV9tbSksIERSTV9NRU1fTU0pOworCWRldi0+bW1fcHJpdmF0ZSA9IE5VTEw7Cit9CisKIC8qKgogICogQWxsb2NhdGUgYSBHRU0gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aXRoIHNobWZzIGJhY2tpbmcgc3RvcmUKICAqLwpAQCAtNDE5LDMgKzQ2MCw3MyBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2VtX29iamVjdF9oYW5kbGVfZnJlZSk7CiAKKy8qKgorICogZHJtX2dlbV9tbWFwIC0gbWVtb3J5IG1hcCByb3V0aW5lIGZvciBHRU0gb2JqZWN0cworICogQGZpbHA6IERSTSBmaWxlIHBvaW50ZXIKKyAqIEB2bWE6IFZNQSBmb3IgdGhlIGFyZWEgdG8gYmUgbWFwcGVkCisgKgorICogSWYgYSBkcml2ZXIgc3VwcG9ydHMgR0VNIG9iamVjdCBtYXBwaW5nLCBtbWFwIGNhbGxzIG9uIHRoZSBEUk0gZmlsZQorICogZGVzY3JpcHRvciB3aWxsIGVuZCB1cCBoZXJlLgorICoKKyAqIElmIHdlIGZpbmQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHBhc3NlZCBpbiAodm1hLT52bV9wZ29mZiB3aWxsCisgKiBjb250YWluIHRoZSBmYWtlIG9mZnNldCB3ZSBjcmVhdGVkIHdoZW4gdGhlIEdUVCBtYXAgaW9jdGwgd2FzIGNhbGxlZCBvbgorICogdGhlIG9iamVjdCksIHdlIHNldCB1cCB0aGUgZHJpdmVyIGZhdWx0IGhhbmRsZXIgc28gdGhhdCBhbnkgYWNjZXNzZXMKKyAqIHRvIHRoZSBvYmplY3QgY2FuIGJlIHRyYXBwZWQsIHRvIHBlcmZvcm0gbWlncmF0aW9uLCBHVFQgYmluZGluZywgc3VyZmFjZQorICogcmVnaXN0ZXIgYWxsb2NhdGlvbiwgb3IgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4KKyAqLworaW50IGRybV9nZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5taW5vci0+ZGV2OworCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKKwl1bnNpZ25lZCBsb25nIHByb3Q7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmbW0tPm9mZnNldF9oYXNoLCB2bWEtPnZtX3Bnb2ZmLCAmaGFzaCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiBkcm1fbW1hcChmaWxwLCB2bWEpOworCX0KKworCW1hcCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhhc2gpLT5tYXA7CisJaWYgKCFtYXAgfHwKKwkgICAgKChtYXAtPmZsYWdzICYgX0RSTV9SRVNUUklDVEVEKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkpIHsKKwkJcmV0ID0gIC1FUEVSTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIENoZWNrIGZvciB2YWxpZCBzaXplLiAqLworCWlmIChtYXAtPnNpemUgPCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW9iaiA9IG1hcC0+aGFuZGxlOworCWlmICghb2JqLT5kZXYtPmRyaXZlci0+Z2VtX3ZtX29wcykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRCB8IFZNX0lPIHwgVk1fUEZOTUFQIHwgVk1fRE9OVEVYUEFORDsKKwl2bWEtPnZtX29wcyA9IG9iai0+ZGV2LT5kcml2ZXItPmdlbV92bV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBtYXAtPmhhbmRsZTsKKwkvKiBGSVhNRTogdXNlIHBncHJvdF93cml0ZWNvbWJpbmUgd2hlbiBhdmFpbGFibGUgKi8KKwlwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisjaWZkZWYgQ09ORklHX1g4NgorCXByb3QgfD0gX1BBR0VfQ0FDSEVfV0M7CisjZW5kaWYKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHByb3QpOworCisJdm1hLT52bV9maWxlID0gZmlscDsJLyogTmVlZGVkIGZvciBkcm1fdm1fb3BlbigpICovCisJZHJtX3ZtX29wZW5fbG9ja2VkKHZtYSk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2VtX21tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9oYXNodGFiLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2hhc2h0YWIuYwppbmRleCAzMzE2MDY3Li5hZjUzOWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2hhc2h0YWIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2hhc2h0YWIuYwpAQCAtMTI3LDYgKzEyNyw3IEBACiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1faHRfaW5zZXJ0X2l0ZW0pOwogCiAvKgogICogSnVzdCBpbnNlcnQgYW4gaXRlbSBhbmQgcmV0dXJuIGFueSAiYml0cyIgYml0IGtleSB0aGF0IGhhc24ndCBiZWVuCkBAIC0xODgsNiArMTg5LDcgQEAKIAlodC0+ZmlsbC0tOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1faHRfcmVtb3ZlX2l0ZW0pOwogCiB2b2lkIGRybV9odF9yZW1vdmUoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2N0bC5jCmluZGV4IDE2ODI5ZmIuLjFmYWQ3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jdGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvY3RsLmMKQEAgLTUzLDEyICs1MywxMyBAQAogCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fdW5pcXVlICp1ID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyID0gZmlsZV9wcml2LT5tYXN0ZXI7CiAKLQlpZiAodS0+dW5pcXVlX2xlbiA+PSBkZXYtPnVuaXF1ZV9sZW4pIHsKLQkJaWYgKGNvcHlfdG9fdXNlcih1LT51bmlxdWUsIGRldi0+dW5pcXVlLCBkZXYtPnVuaXF1ZV9sZW4pKQorCWlmICh1LT51bmlxdWVfbGVuID49IG1hc3Rlci0+dW5pcXVlX2xlbikgeworCQlpZiAoY29weV90b191c2VyKHUtPnVuaXF1ZSwgbWFzdGVyLT51bmlxdWUsIG1hc3Rlci0+dW5pcXVlX2xlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JdS0+dW5pcXVlX2xlbiA9IGRldi0+dW5pcXVlX2xlbjsKKwl1LT51bmlxdWVfbGVuID0gbWFzdGVyLT51bmlxdWVfbGVuOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MSwzNiArODIsMzggQEAKIAkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX3VuaXF1ZSAqdSA9IGRhdGE7CisJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciA9IGZpbGVfcHJpdi0+bWFzdGVyOwogCWludCBkb21haW4sIGJ1cywgc2xvdCwgZnVuYywgcmV0OwogCi0JaWYgKGRldi0+dW5pcXVlX2xlbiB8fCBkZXYtPnVuaXF1ZSkKKwlpZiAobWFzdGVyLT51bmlxdWVfbGVuIHx8IG1hc3Rlci0+dW5pcXVlKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKCF1LT51bmlxdWVfbGVuIHx8IHUtPnVuaXF1ZV9sZW4gPiAxMDI0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRldi0+dW5pcXVlX2xlbiA9IHUtPnVuaXF1ZV9sZW47Ci0JZGV2LT51bmlxdWUgPSBkcm1fYWxsb2ModS0+dW5pcXVlX2xlbiArIDEsIERSTV9NRU1fRFJJVkVSKTsKLQlpZiAoIWRldi0+dW5pcXVlKQorCW1hc3Rlci0+dW5pcXVlX2xlbiA9IHUtPnVuaXF1ZV9sZW47CisJbWFzdGVyLT51bmlxdWVfc2l6ZSA9IHUtPnVuaXF1ZV9sZW4gKyAxOworCW1hc3Rlci0+dW5pcXVlID0gZHJtX2FsbG9jKG1hc3Rlci0+dW5pcXVlX3NpemUsIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoIW1hc3Rlci0+dW5pcXVlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT51bmlxdWUsIHUtPnVuaXF1ZSwgZGV2LT51bmlxdWVfbGVuKSkKKwlpZiAoY29weV9mcm9tX3VzZXIobWFzdGVyLT51bmlxdWUsIHUtPnVuaXF1ZSwgbWFzdGVyLT51bmlxdWVfbGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkZXYtPnVuaXF1ZVtkZXYtPnVuaXF1ZV9sZW5dID0gJ1wwJzsKKwltYXN0ZXItPnVuaXF1ZVttYXN0ZXItPnVuaXF1ZV9sZW5dID0gJ1wwJzsKIAogCWRldi0+ZGV2bmFtZSA9CiAJICAgIGRybV9hbGxvYyhzdHJsZW4oZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSkgKwotCQkgICAgICBzdHJsZW4oZGV2LT51bmlxdWUpICsgMiwgRFJNX01FTV9EUklWRVIpOworCQkgICAgICBzdHJsZW4obWFzdGVyLT51bmlxdWUpICsgMiwgRFJNX01FTV9EUklWRVIpOwogCWlmICghZGV2LT5kZXZuYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwcmludGYoZGV2LT5kZXZuYW1lLCAiJXNAJXMiLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lLAotCQlkZXYtPnVuaXF1ZSk7CisJCW1hc3Rlci0+dW5pcXVlKTsKIAogCS8qIFJldHVybiBlcnJvciBpZiB0aGUgYnVzaWQgc3VibWl0dGVkIGRvZXNuJ3QgbWF0Y2ggdGhlIGRldmljZSdzIGFjdHVhbAogCSAqIGJ1c2lkLgogCSAqLwotCXJldCA9IHNzY2FuZihkZXYtPnVuaXF1ZSwgIlBDSTolZDolZDolZCIsICZidXMsICZzbG90LCAmZnVuYyk7CisJcmV0ID0gc3NjYW5mKG1hc3Rlci0+dW5pcXVlLCAiUENJOiVkOiVkOiVkIiwgJmJ1cywgJnNsb3QsICZmdW5jKTsKIAlpZiAocmV0ICE9IDMpCiAJCXJldHVybiAtRUlOVkFMOwogCWRvbWFpbiA9IGJ1cyA+PiA4OwpAQCAtMTI1LDM0ICsxMjgsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcm1fc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIGludCBkcm1fc2V0X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogeworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIgPSBmaWxlX3ByaXYtPm1hc3RlcjsKIAlpbnQgbGVuOwogCi0JaWYgKGRldi0+dW5pcXVlICE9IE5VTEwpCi0JCXJldHVybiAwOworCWlmIChtYXN0ZXItPnVuaXF1ZSAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JZGV2LT51bmlxdWVfbGVuID0gNDA7Ci0JZGV2LT51bmlxdWUgPSBkcm1fYWxsb2MoZGV2LT51bmlxdWVfbGVuICsgMSwgRFJNX01FTV9EUklWRVIpOwotCWlmIChkZXYtPnVuaXF1ZSA9PSBOVUxMKQorCW1hc3Rlci0+dW5pcXVlX2xlbiA9IDQwOworCW1hc3Rlci0+dW5pcXVlX3NpemUgPSBtYXN0ZXItPnVuaXF1ZV9sZW47CisJbWFzdGVyLT51bmlxdWUgPSBkcm1fYWxsb2MobWFzdGVyLT51bmlxdWVfc2l6ZSwgRFJNX01FTV9EUklWRVIpOworCWlmIChtYXN0ZXItPnVuaXF1ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWxlbiA9IHNucHJpbnRmKGRldi0+dW5pcXVlLCBkZXYtPnVuaXF1ZV9sZW4sICJwY2k6JTA0eDolMDJ4OiUwMnguJWQiLAotCQkgICAgICAgZHJtX2dldF9wY2lfZG9tYWluKGRldiksIGRldi0+cGRldi0+YnVzLT5udW1iZXIsCisJbGVuID0gc25wcmludGYobWFzdGVyLT51bmlxdWUsIG1hc3Rlci0+dW5pcXVlX2xlbiwgInBjaTolMDR4OiUwMng6JTAyeC4lZCIsCisJCSAgICAgICBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSwKKwkJICAgICAgIGRldi0+cGRldi0+YnVzLT5udW1iZXIsCiAJCSAgICAgICBQQ0lfU0xPVChkZXYtPnBkZXYtPmRldmZuKSwKIAkJICAgICAgIFBDSV9GVU5DKGRldi0+cGRldi0+ZGV2Zm4pKTsKLQotCWlmIChsZW4gPiBkZXYtPnVuaXF1ZV9sZW4pCi0JCURSTV9FUlJPUigiVW5pcXVlIGJ1ZmZlciBvdmVyZmxvd2VkXG4iKTsKKwlpZiAobGVuID49IG1hc3Rlci0+dW5pcXVlX2xlbikKKwkJRFJNX0VSUk9SKCJidWZmZXIgb3ZlcmZsb3ciKTsKKwllbHNlCisJCW1hc3Rlci0+dW5pcXVlX2xlbiA9IGxlbjsKIAogCWRldi0+ZGV2bmFtZSA9Ci0JICAgIGRybV9hbGxvYyhzdHJsZW4oZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSkgKyBkZXYtPnVuaXF1ZV9sZW4gKworCSAgICBkcm1fYWxsb2Moc3RybGVuKGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUpICsgbWFzdGVyLT51bmlxdWVfbGVuICsKIAkJICAgICAgMiwgRFJNX01FTV9EUklWRVIpOwogCWlmIChkZXYtPmRldm5hbWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcHJpbnRmKGRldi0+ZGV2bmFtZSwgIiVzQCVzIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSwKLQkJZGV2LT51bmlxdWUpOworCQltYXN0ZXItPnVuaXF1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3Niw3ICsyODMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmNvdW50ZXJzOyBpKyspIHsKIAkJaWYgKGRldi0+dHlwZXNbaV0gPT0gX0RSTV9TVEFUX0xPQ0spCiAJCQlzdGF0cy0+ZGF0YVtpXS52YWx1ZSA9Ci0JCQkgICAgKGRldi0+bG9jay5od19sb2NrID8gZGV2LT5sb2NrLmh3X2xvY2stPmxvY2sgOiAwKTsKKwkJCSAgICAoZmlsZV9wcml2LT5tYXN0ZXItPmxvY2suaHdfbG9jayA/IGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmh3X2xvY2stPmxvY2sgOiAwKTsKIAkJZWxzZQogCQkJc3RhdHMtPmRhdGFbaV0udmFsdWUgPSBhdG9taWNfcmVhZCgmZGV2LT5jb3VudHNbaV0pOwogCQlzdGF0cy0+ZGF0YVtpXS50eXBlID0gZGV2LT50eXBlc1tpXTsKQEAgLTMxOCw3ICszMjUsNyBAQAogCQkJLyoKIAkJCSAqIFZlcnNpb24gMS4xIGluY2x1ZGVzIHR5aW5nIG9mIERSTSB0byBzcGVjaWZpYyBkZXZpY2UKIAkJCSAqLwotCQkJZHJtX3NldF9idXNpZChkZXYpOworCQkJZHJtX3NldF9idXNpZChkZXYsIGZpbGVfcHJpdik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCmluZGV4IDFlNzg3ZjguLjcyNGU1MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwpAQCAtMTE2LDYgKzExNiw5IEBACiAJCSBkZXYtPm51bV9jcnRjcywgRFJNX01FTV9EUklWRVIpOwogCWRybV9mcmVlKGRldi0+bGFzdF92YmxhbmssIHNpemVvZigqZGV2LT5sYXN0X3ZibGFuaykgKiBkZXYtPm51bV9jcnRjcywKIAkJIERSTV9NRU1fRFJJVkVSKTsKKwlkcm1fZnJlZShkZXYtPmxhc3RfdmJsYW5rX3dhaXQsCisJCSBzaXplb2YoKmRldi0+bGFzdF92Ymxhbmtfd2FpdCkgKiBkZXYtPm51bV9jcnRjcywKKwkJIERSTV9NRU1fRFJJVkVSKTsKIAlkcm1fZnJlZShkZXYtPnZibGFua19pbm1vZGVzZXQsIHNpemVvZigqZGV2LT52YmxhbmtfaW5tb2Rlc2V0KSAqCiAJCSBkZXYtPm51bV9jcnRjcywgRFJNX01FTV9EUklWRVIpOwogCkBAIC0xNjEsNiArMTY0LDExIEBACiAJaWYgKCFkZXYtPmxhc3RfdmJsYW5rKQogCQlnb3RvIGVycjsKIAorCWRldi0+bGFzdF92Ymxhbmtfd2FpdCA9IGRybV9jYWxsb2MobnVtX2NydGNzLCBzaXplb2YodTMyKSwKKwkJCQkJICAgRFJNX01FTV9EUklWRVIpOworCWlmICghZGV2LT5sYXN0X3ZibGFua193YWl0KQorCQlnb3RvIGVycjsKKwogCWRldi0+dmJsYW5rX2lubW9kZXNldCA9IGRybV9jYWxsb2MobnVtX2NydGNzLCBzaXplb2YoaW50KSwKIAkJCQkJIERSTV9NRU1fRFJJVkVSKTsKIAlpZiAoIWRldi0+dmJsYW5rX2lubW9kZXNldCkKQEAgLTMwNSw2ICszMTMsOCBAQAogCWNhc2UgRFJNX0lOU1RfSEFORExFUjoKIAkJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJCXJldHVybiAwOworCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJCXJldHVybiAwOwogCQlpZiAoZGV2LT5pZl92ZXJzaW9uIDwgRFJNX0lGX1ZFUlNJT04oMSwgMikgJiYKIAkJICAgIGN0bC0+aXJxICE9IGRldi0+cGRldi0+aXJxKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTIsNiArMzIyLDggQEAKIAljYXNlIERSTV9VTklOU1RfSEFORExFUjoKIAkJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJCXJldHVybiAwOworCQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJCXJldHVybiAwOwogCQlyZXR1cm4gZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyNyw2ICs0MzksNDUgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19wdXQpOwogCiAvKioKKyAqIGRybV92YmxhbmtfcHJlX21vZGVzZXQgLSBhY2NvdW50IGZvciB2YmxhbmtzIGFjcm9zcyBtb2RlIHNldHMKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiBDUlRDIGluIHF1ZXN0aW9uCisgKiBAcG9zdDogcG9zdCBvciBwcmUgbW9kZSBzZXQ/CisgKgorICogQWNjb3VudCBmb3IgdmJsYW5rIGV2ZW50cyBhY3Jvc3MgbW9kZSBzZXR0aW5nIGV2ZW50cywgd2hpY2ggd2lsbCBsaWtlbHkKKyAqIHJlc2V0IHRoZSBoYXJkd2FyZSBmcmFtZSBjb3VudGVyLgorICovCit2b2lkIGRybV92YmxhbmtfcHJlX21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJLyoKKwkgKiBUbyBhdm9pZCBhbGwgdGhlIHByb2JsZW1zIHRoYXQgbWlnaHQgaGFwcGVuIGlmIGludGVycnVwdHMKKwkgKiB3ZXJlIGVuYWJsZWQvZGlzYWJsZWQgYXJvdW5kIG9yIGJldHdlZW4gdGhlc2UgY2FsbHMsIHdlIGp1c3QKKwkgKiBoYXZlIHRoZSBrZXJuZWwgdGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgQ1JUQyAoanVzdCBvbmNlIHRob3VnaAorCSAqIHRvIGF2b2lkIGNvcnJ1cHRpbmcgdGhlIGNvdW50IGlmIG11bHRpcGxlLCBtaXNtYXRjaCBjYWxscyBvY2N1ciksCisJICogc28gdGhhdCBpbnRlcnJ1cHRzIHJlbWFpbiBlbmFibGVkIGluIHRoZSBpbnRlcmltLgorCSAqLworCWlmICghZGV2LT52YmxhbmtfaW5tb2Rlc2V0W2NydGNdKSB7CisJCWRldi0+dmJsYW5rX2lubW9kZXNldFtjcnRjXSA9IDE7CisJCWRybV92YmxhbmtfZ2V0KGRldiwgY3J0Yyk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KTsKKwordm9pZCBkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJaWYgKGRldi0+dmJsYW5rX2lubW9kZXNldFtjcnRjXSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCQlkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSAxOworCQlkZXYtPnZibGFua19pbm1vZGVzZXRbY3J0Y10gPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJCWRybV92YmxhbmtfcHV0KGRldiwgY3J0Yyk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldCk7CisKKy8qKgogICogZHJtX21vZGVzZXRfY3RsIC0gaGFuZGxlIHZibGFuayBldmVudCBjb3VudGVyIGNoYW5nZXMgYWNyb3NzIG1vZGUgc3dpdGNoCiAgKiBARFJNX0lPQ1RMX0FSR1M6IHN0YW5kYXJkIGlvY3RsIGFyZ3VtZW50cwogICoKQEAgLTQ0MSw3ICs0OTIsNiBAQAogCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9tb2Rlc2V0X2N0bCAqbW9kZXNldCA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAlpbnQgY3J0YywgcmV0ID0gMDsKIAogCS8qIElmIGRybV92YmxhbmtfaW5pdCgpIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQsIGp1c3Qgbm8tb3AgKi8KQEAgLTQ1NCwyOCArNTA0LDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qCi0JICogVG8gYXZvaWQgYWxsIHRoZSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGhhcHBlbiBpZiBpbnRlcnJ1cHRzCi0JICogd2VyZSBlbmFibGVkL2Rpc2FibGVkIGFyb3VuZCBvciBiZXR3ZWVuIHRoZXNlIGNhbGxzLCB3ZSBqdXN0Ci0JICogaGF2ZSB0aGUga2VybmVsIHRha2UgYSByZWZlcmVuY2Ugb24gdGhlIENSVEMgKGp1c3Qgb25jZSB0aG91Z2gKLQkgKiB0byBhdm9pZCBjb3JydXB0aW5nIHRoZSBjb3VudCBpZiBtdWx0aXBsZSwgbWlzbWF0Y2ggY2FsbHMgb2NjdXIpLAotCSAqIHNvIHRoYXQgaW50ZXJydXB0cyByZW1haW4gZW5hYmxlZCBpbiB0aGUgaW50ZXJpbS4KLQkgKi8KIAlzd2l0Y2ggKG1vZGVzZXQtPmNtZCkgewogCWNhc2UgX0RSTV9QUkVfTU9ERVNFVDoKLQkJaWYgKCFkZXYtPnZibGFua19pbm1vZGVzZXRbY3J0Y10pIHsKLQkJCWRldi0+dmJsYW5rX2lubW9kZXNldFtjcnRjXSA9IDE7Ci0JCQlkcm1fdmJsYW5rX2dldChkZXYsIGNydGMpOwotCQl9CisJCWRybV92YmxhbmtfcHJlX21vZGVzZXQoZGV2LCBjcnRjKTsKIAkJYnJlYWs7CiAJY2FzZSBfRFJNX1BPU1RfTU9ERVNFVDoKLQkJaWYgKGRldi0+dmJsYW5rX2lubW9kZXNldFtjcnRjXSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKLQkJCWRldi0+dmJsYW5rX2Rpc2FibGVfYWxsb3dlZCA9IDE7Ci0JCQlkZXYtPnZibGFua19pbm1vZGVzZXRbY3J0Y10gPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotCQkJZHJtX3ZibGFua19wdXQoZGV2LCBjcnRjKTsKLQkJfQorCQlkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChkZXYsIGNydGMpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNjE2LDYgKzY1MCw3IEBACiAJfSBlbHNlIHsKIAkJRFJNX0RFQlVHKCJ3YWl0aW5nIG9uIHZibGFuayBjb3VudCAlZCwgY3J0YyAlZFxuIiwKIAkJCSAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSwgY3J0Yyk7CisJCWRldi0+bGFzdF92Ymxhbmtfd2FpdFtjcnRjXSA9IHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2U7CiAJCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxfcXVldWVbY3J0Y10sIDMgKiBEUk1fSFosCiAJCQkgICAgKChkcm1fdmJsYW5rX2NvdW50KGRldiwgY3J0YykKIAkJCSAgICAgIC0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbG9jay5jCmluZGV4IDFjZmE3MjAuLjQ2ZTdiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbG9jay5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbG9jay5jCkBAIC01Miw2ICs1Miw3IEBACiB7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwogCXN0cnVjdCBkcm1fbG9jayAqbG9jayA9IGRhdGE7CisJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciA9IGZpbGVfcHJpdi0+bWFzdGVyOwogCWludCByZXQgPSAwOwogCiAJKytmaWxlX3ByaXYtPmxvY2tfY291bnQ7CkBAIC02NCwyNiArNjUsMjcgQEAKIAogCURSTV9ERUJVRygiJWQgKHBpZCAlZCkgcmVxdWVzdHMgbG9jayAoMHglMDh4KSwgZmxhZ3MgPSAweCUwOHhcbiIsCiAJCSAgbG9jay0+Y29udGV4dCwgdGFza19waWRfbnIoY3VycmVudCksCi0JCSAgZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssIGxvY2stPmZsYWdzKTsKKwkJICBtYXN0ZXItPmxvY2suaHdfbG9jay0+bG9jaywgbG9jay0+ZmxhZ3MpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRE1BX1FVRVVFKSkKIAkJaWYgKGxvY2stPmNvbnRleHQgPCAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhZGRfd2FpdF9xdWV1ZSgmZGV2LT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSk7Ci0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2suc3BpbmxvY2spOwotCWRldi0+bG9jay51c2VyX3dhaXRlcnMrKzsKLQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrLnNwaW5sb2NrKTsKKwlhZGRfd2FpdF9xdWV1ZSgmbWFzdGVyLT5sb2NrLmxvY2tfcXVldWUsICZlbnRyeSk7CisJc3Bpbl9sb2NrX2JoKCZtYXN0ZXItPmxvY2suc3BpbmxvY2spOworCW1hc3Rlci0+bG9jay51c2VyX3dhaXRlcnMrKzsKKwlzcGluX3VubG9ja19iaCgmbWFzdGVyLT5sb2NrLnNwaW5sb2NrKTsKKwogCWZvciAoOzspIHsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoIWRldi0+bG9jay5od19sb2NrKSB7CisJCWlmICghbWFzdGVyLT5sb2NrLmh3X2xvY2spIHsKIAkJCS8qIERldmljZSBoYXMgYmVlbiB1bnJlZ2lzdGVyZWQgKi8KIAkJCXJldCA9IC1FSU5UUjsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChkcm1fbG9ja190YWtlKCZkZXYtPmxvY2ssIGxvY2stPmNvbnRleHQpKSB7Ci0JCQlkZXYtPmxvY2suZmlsZV9wcml2ID0gZmlsZV9wcml2OwotCQkJZGV2LT5sb2NrLmxvY2tfdGltZSA9IGppZmZpZXM7CisJCWlmIChkcm1fbG9ja190YWtlKCZtYXN0ZXItPmxvY2ssIGxvY2stPmNvbnRleHQpKSB7CisJCQltYXN0ZXItPmxvY2suZmlsZV9wcml2ID0gZmlsZV9wcml2OworCQkJbWFzdGVyLT5sb2NrLmxvY2tfdGltZSA9IGppZmZpZXM7CiAJCQlhdG9taWNfaW5jKCZkZXYtPmNvdW50c1tfRFJNX1NUQVRfTE9DS1NdKTsKIAkJCWJyZWFrOwkvKiBHb3QgbG9jayAqLwogCQl9CkBAIC05NSwxMSArOTcsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXNwaW5fbG9ja19iaCgmZGV2LT5sb2NrLnNwaW5sb2NrKTsKLQlkZXYtPmxvY2sudXNlcl93YWl0ZXJzLS07Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+bG9jay5zcGlubG9jayk7CisJc3Bpbl9sb2NrX2JoKCZtYXN0ZXItPmxvY2suc3BpbmxvY2spOworCW1hc3Rlci0+bG9jay51c2VyX3dhaXRlcnMtLTsKKwlzcGluX3VubG9ja19iaCgmbWFzdGVyLT5sb2NrLnNwaW5sb2NrKTsKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmRldi0+bG9jay5sb2NrX3F1ZXVlLCAmZW50cnkpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZtYXN0ZXItPmxvY2subG9ja19xdWV1ZSwgJmVudHJ5KTsKIAogCURSTV9ERUJVRygiJWQgJXNcbiIsIGxvY2stPmNvbnRleHQsCiAJCSAgcmV0ID8gImludGVycnVwdGVkIiA6ICJoYXMgbG9jayIpOwpAQCAtMTA4LDE0ICsxMTAsMTQgQEAKIAkvKiBkb24ndCBzZXQgdGhlIGJsb2NrIGFsbCBzaWduYWxzIG9uIHRoZSBtYXN0ZXIgcHJvY2VzcyBmb3Igbm93IAogCSAqIHJlYWxseSBwcm9iYWJseSBub3QgdGhlIGNvcnJlY3QgYW5zd2VyIGJ1dCBsZXRzIHVzIGRlYnVnIHhrYgogIAkgKiB4c2VydmVyIGZvciBub3cgKi8KLQlpZiAoIWZpbGVfcHJpdi0+bWFzdGVyKSB7CisJaWYgKCFmaWxlX3ByaXYtPmlzX21hc3RlcikgewogCQlzaWdlbXB0eXNldCgmZGV2LT5zaWdtYXNrKTsKIAkJc2lnYWRkc2V0KCZkZXYtPnNpZ21hc2ssIFNJR1NUT1ApOwogCQlzaWdhZGRzZXQoJmRldi0+c2lnbWFzaywgU0lHVFNUUCk7CiAJCXNpZ2FkZHNldCgmZGV2LT5zaWdtYXNrLCBTSUdUVElOKTsKIAkJc2lnYWRkc2V0KCZkZXYtPnNpZ21hc2ssIFNJR1RUT1UpOwogCQlkZXYtPnNpZ2RhdGEuY29udGV4dCA9IGxvY2stPmNvbnRleHQ7Ci0JCWRldi0+c2lnZGF0YS5sb2NrID0gZGV2LT5sb2NrLmh3X2xvY2s7CisJCWRldi0+c2lnZGF0YS5sb2NrID0gbWFzdGVyLT5sb2NrLmh3X2xvY2s7CiAJCWJsb2NrX2FsbF9zaWduYWxzKGRybV9ub3RpZmllciwgJmRldi0+c2lnZGF0YSwgJmRldi0+c2lnbWFzayk7CiAJfQogCkBAIC0xNTQsNiArMTU2LDcgQEAKIGludCBkcm1fdW5sb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fbG9jayAqbG9jayA9IGRhdGE7CisJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlciA9IGZpbGVfcHJpdi0+bWFzdGVyOwogCiAJaWYgKGxvY2stPmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CiAJCURSTV9FUlJPUigiUHJvY2VzcyAlZCB1c2luZyBrZXJuZWwgY29udGV4dCAlZFxuIiwKQEAgLTE2OSw3ICsxNzIsNyBAQAogCWlmIChkZXYtPmRyaXZlci0+a2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaykKIAkJZGV2LT5kcml2ZXItPmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2soZGV2KTsKIAllbHNlIHsKLQkJaWYgKGRybV9sb2NrX2ZyZWUoJmRldi0+bG9jayxsb2NrLT5jb250ZXh0KSkgeworCQlpZiAoZHJtX2xvY2tfZnJlZSgmbWFzdGVyLT5sb2NrLCBsb2NrLT5jb250ZXh0KSkgewogCQkJLyogRklYTUU6IFNob3VsZCByZWFsbHkgYmFpbCBvdXQgaGVyZS4gKi8KIAkJfQogCX0KQEAgLTM3OSw5ICszODIsMTAgQEAKIAogaW50IGRybV9pX2hhdmVfaHdfbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlyZXR1cm4gKGZpbGVfcHJpdi0+bG9ja19jb3VudCAmJiBkZXYtPmxvY2suaHdfbG9jayAmJgotCQlfRFJNX0xPQ0tfSVNfSEVMRChkZXYtPmxvY2suaHdfbG9jay0+bG9jaykgJiYKLQkJZGV2LT5sb2NrLmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpOworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIgPSBmaWxlX3ByaXYtPm1hc3RlcjsKKwlyZXR1cm4gKGZpbGVfcHJpdi0+bG9ja19jb3VudCAmJiBtYXN0ZXItPmxvY2suaHdfbG9jayAmJgorCQlfRFJNX0xPQ0tfSVNfSEVMRChtYXN0ZXItPmxvY2suaHdfbG9jay0+bG9jaykgJiYKKwkJbWFzdGVyLT5sb2NrLmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpOwogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9pX2hhdmVfaHdfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKaW5kZXggMjE3YWQ3ZC4uMzY3YzU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwpAQCAtMjk2LDMgKzI5Niw0IEBACiAKIAlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fTU0pOwogfQorRVhQT1JUX1NZTUJPTChkcm1fbW1fdGFrZWRvd24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjgwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKQEAgLTAsMCArMSw1NzYgQEAKKy8qCisgKiBUaGUgbGlzdF9zb3J0IGZ1bmN0aW9uIGlzIChwcmVzdW1hYmx5KSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIChzZWUgdGhlCisgKiB0b3AgbGV2ZWwgIkNPUFlJTkciIGZpbGUgZm9yIGRldGFpbHMpLgorICoKKyAqIFRoZSByZW1haW5kZXIgb2YgdGhpcyBmaWxlIGlzOgorICoKKyAqIENvcHlyaWdodCDCqSAxOTk3LTIwMDMgYnkgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDcgRGF2ZSBBaXJsaWUKKyAqIENvcHlyaWdodCDCqSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyKHMpCisgKiBhbmQgYXV0aG9yKHMpIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlCisgKiB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIGNvcHlyaWdodCBob2xkZXIocykgYW5kIGF1dGhvcihzKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorCisvKioKKyAqIGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUgLSBkZWJ1ZyBwcmludCBhIG1vZGUKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBtb2RlOiBtb2RlIHRvIHByaW50CisgKgorICogTE9DS0lORzoKKyAqIE5vbmUuCisgKgorICogRGVzY3JpYmUgQG1vZGUgdXNpbmcgRFJNX0RFQlVHLgorICovCit2b2lkIGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJRFJNX0RFQlVHKCJNb2RlbGluZSAlZDpcIiVzXCIgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleCAweCV4XG4iLAorCQkgIG1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUsIG1vZGUtPnZyZWZyZXNoLCBtb2RlLT5jbG9jaywKKwkJICBtb2RlLT5oZGlzcGxheSwgbW9kZS0+aHN5bmNfc3RhcnQsCisJCSAgbW9kZS0+aHN5bmNfZW5kLCBtb2RlLT5odG90YWwsCisJCSAgbW9kZS0+dmRpc3BsYXksIG1vZGUtPnZzeW5jX3N0YXJ0LAorCQkgIG1vZGUtPnZzeW5jX2VuZCwgbW9kZS0+dnRvdGFsLCBtb2RlLT50eXBlLCBtb2RlLT5mbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUpOworCisvKioKKyAqIGRybV9tb2RlX3NldF9uYW1lIC0gc2V0IHRoZSBuYW1lIG9uIGEgbW9kZQorICogQG1vZGU6IG5hbWUgd2lsbCBiZSBzZXQgaW4gdGhpcyBtb2RlCisgKgorICogTE9DS0lORzoKKyAqIE5vbmUuCisgKgorICogU2V0IHRoZSBuYW1lIG9mIEBtb2RlIHRvIGEgc3RhbmRhcmQgZm9ybWF0LgorICovCit2b2lkIGRybV9tb2RlX3NldF9uYW1lKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXNucHJpbnRmKG1vZGUtPm5hbWUsIERSTV9ESVNQTEFZX01PREVfTEVOLCAiJWR4JWQiLCBtb2RlLT5oZGlzcGxheSwKKwkJIG1vZGUtPnZkaXNwbGF5KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfc2V0X25hbWUpOworCisvKioKKyAqIGRybV9tb2RlX2xpc3RfY29uY2F0IC0gbW92ZSBtb2RlcyBmcm9tIG9uZSBsaXN0IHRvIGFub3RoZXIKKyAqIEBoZWFkOiBzb3VyY2UgbGlzdAorICogQG5ldzogZHN0IGxpc3QKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgZW5zdXJlIGJvdGggbGlzdHMgYXJlIGxvY2tlZC4KKyAqCisgKiBNb3ZlIGFsbCB0aGUgbW9kZXMgZnJvbSBAaGVhZCB0byBAbmV3LgorICovCit2b2lkIGRybV9tb2RlX2xpc3RfY29uY2F0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKm5ldykKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsIGhlYWQpIHsKKwkJbGlzdF9tb3ZlX3RhaWwoZW50cnksIG5ldyk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9saXN0X2NvbmNhdCk7CisKKy8qKgorICogZHJtX21vZGVfd2lkdGggLSBnZXQgdGhlIHdpZHRoIG9mIGEgbW9kZQorICogQG1vZGU6IG1vZGUKKyAqCisgKiBMT0NLSU5HOgorICogTm9uZS4KKyAqCisgKiBSZXR1cm4gQG1vZGUncyB3aWR0aCAoaGRpc3BsYXkpIHZhbHVlLgorICoKKyAqIEZJWE1FOiBpcyB0aGlzIG5lZWRlZD8KKyAqCisgKiBSRVRVUk5TOgorICogQG1vZGUtPmhkaXNwbGF5CisgKi8KK2ludCBkcm1fbW9kZV93aWR0aChzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlyZXR1cm4gbW9kZS0+aGRpc3BsYXk7CisKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfd2lkdGgpOworCisvKioKKyAqIGRybV9tb2RlX2hlaWdodCAtIGdldCB0aGUgaGVpZ2h0IG9mIGEgbW9kZQorICogQG1vZGU6IG1vZGUKKyAqCisgKiBMT0NLSU5HOgorICogTm9uZS4KKyAqCisgKiBSZXR1cm4gQG1vZGUncyBoZWlnaHQgKHZkaXNwbGF5KSB2YWx1ZS4KKyAqCisgKiBGSVhNRTogaXMgdGhpcyBuZWVkZWQ/CisgKgorICogUkVUVVJOUzoKKyAqIEBtb2RlLT52ZGlzcGxheQorICovCitpbnQgZHJtX21vZGVfaGVpZ2h0KHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXJldHVybiBtb2RlLT52ZGlzcGxheTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfaGVpZ2h0KTsKKworLyoqCisgKiBkcm1fbW9kZV92cmVmcmVzaCAtIGdldCB0aGUgdnJlZnJlc2ggb2YgYSBtb2RlCisgKiBAbW9kZTogbW9kZQorICoKKyAqIExPQ0tJTkc6CisgKiBOb25lLgorICoKKyAqIFJldHVybiBAbW9kZSdzIHZyZWZyZXNoIHJhdGUgb3IgY2FsY3VsYXRlIGl0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBGSVhNRTogd2h5IGlzIHRoaXMgbmVlZGVkPyAgc2hvdWxkbid0IHZyZWZyZXNoIGJlIHNldCBhbHJlYWR5PworICoKKyAqIFJFVFVSTlM6CisgKiBWZXJ0aWNhbCByZWZyZXNoIHJhdGUgb2YgQG1vZGUgeCAxMDAwLiBGb3IgcHJlY2lzaW9uIHJlYXNvbnMuCisgKi8KK2ludCBkcm1fbW9kZV92cmVmcmVzaChzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpbnQgcmVmcmVzaCA9IDA7CisJdW5zaWduZWQgaW50IGNhbGNfdmFsOworCisJaWYgKG1vZGUtPnZyZWZyZXNoID4gMCkKKwkJcmVmcmVzaCA9IG1vZGUtPnZyZWZyZXNoOworCWVsc2UgaWYgKG1vZGUtPmh0b3RhbCA+IDAgJiYgbW9kZS0+dnRvdGFsID4gMCkgeworCQkvKiB3b3JrIG91dCB2cmVmcmVzaCB0aGUgdmFsdWUgd2lsbCBiZSB4MTAwMCAqLworCQljYWxjX3ZhbCA9IChtb2RlLT5jbG9jayAqIDEwMDApOworCisJCWNhbGNfdmFsIC89IG1vZGUtPmh0b3RhbDsKKwkJY2FsY192YWwgKj0gMTAwMDsKKwkJY2FsY192YWwgLz0gbW9kZS0+dnRvdGFsOworCisJCXJlZnJlc2ggPSBjYWxjX3ZhbDsKKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQlyZWZyZXNoICo9IDI7CisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKKwkJCXJlZnJlc2ggLz0gMjsKKwkJaWYgKG1vZGUtPnZzY2FuID4gMSkKKwkJCXJlZnJlc2ggLz0gbW9kZS0+dnNjYW47CisJfQorCXJldHVybiByZWZyZXNoOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV92cmVmcmVzaCk7CisKKy8qKgorICogZHJtX21vZGVfc2V0X2NydGNpbmZvIC0gc2V0IENSVEMgbW9kZXNldHRpbmcgcGFyYW1ldGVycworICogQHA6IG1vZGUKKyAqIEBhZGp1c3RfZmxhZ3M6IHVudXNlZD8gKEZJWE1FKQorICoKKyAqIExPQ0tJTkc6CisgKiBOb25lLgorICoKKyAqIFNldHVwIHRoZSBDUlRDIG1vZGVzZXR0aW5nIHBhcmFtZXRlcnMgZm9yIEBwLCBhZGp1c3RpbmcgaWYgbmVjZXNzYXJ5LgorICovCit2b2lkIGRybV9tb2RlX3NldF9jcnRjaW5mbyhzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcCwgaW50IGFkanVzdF9mbGFncykKK3sKKwlpZiAoKHAgPT0gTlVMTCkgfHwgKChwLT50eXBlICYgRFJNX01PREVfVFlQRV9DUlRDX0MpID09IERSTV9NT0RFX1RZUEVfQlVJTFRJTikpCisJCXJldHVybjsKKworCXAtPmNydGNfaGRpc3BsYXkgPSBwLT5oZGlzcGxheTsKKwlwLT5jcnRjX2hzeW5jX3N0YXJ0ID0gcC0+aHN5bmNfc3RhcnQ7CisJcC0+Y3J0Y19oc3luY19lbmQgPSBwLT5oc3luY19lbmQ7CisJcC0+Y3J0Y19odG90YWwgPSBwLT5odG90YWw7CisJcC0+Y3J0Y19oc2tldyA9IHAtPmhza2V3OworCXAtPmNydGNfdmRpc3BsYXkgPSBwLT52ZGlzcGxheTsKKwlwLT5jcnRjX3ZzeW5jX3N0YXJ0ID0gcC0+dnN5bmNfc3RhcnQ7CisJcC0+Y3J0Y192c3luY19lbmQgPSBwLT52c3luY19lbmQ7CisJcC0+Y3J0Y192dG90YWwgPSBwLT52dG90YWw7CisKKwlpZiAocC0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgeworCQlpZiAoYWRqdXN0X2ZsYWdzICYgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVikgeworCQkJcC0+Y3J0Y192ZGlzcGxheSAvPSAyOworCQkJcC0+Y3J0Y192c3luY19zdGFydCAvPSAyOworCQkJcC0+Y3J0Y192c3luY19lbmQgLz0gMjsKKwkJCXAtPmNydGNfdnRvdGFsIC89IDI7CisJCX0KKworCQlwLT5jcnRjX3Z0b3RhbCB8PSAxOworCX0KKworCWlmIChwLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikgeworCQlwLT5jcnRjX3ZkaXNwbGF5ICo9IDI7CisJCXAtPmNydGNfdnN5bmNfc3RhcnQgKj0gMjsKKwkJcC0+Y3J0Y192c3luY19lbmQgKj0gMjsKKwkJcC0+Y3J0Y192dG90YWwgKj0gMjsKKwl9CisKKwlpZiAocC0+dnNjYW4gPiAxKSB7CisJCXAtPmNydGNfdmRpc3BsYXkgKj0gcC0+dnNjYW47CisJCXAtPmNydGNfdnN5bmNfc3RhcnQgKj0gcC0+dnNjYW47CisJCXAtPmNydGNfdnN5bmNfZW5kICo9IHAtPnZzY2FuOworCQlwLT5jcnRjX3Z0b3RhbCAqPSBwLT52c2NhbjsKKwl9CisKKwlwLT5jcnRjX3ZibGFua19zdGFydCA9IG1pbihwLT5jcnRjX3ZzeW5jX3N0YXJ0LCBwLT5jcnRjX3ZkaXNwbGF5KTsKKwlwLT5jcnRjX3ZibGFua19lbmQgPSBtYXgocC0+Y3J0Y192c3luY19lbmQsIHAtPmNydGNfdnRvdGFsKTsKKwlwLT5jcnRjX2hibGFua19zdGFydCA9IG1pbihwLT5jcnRjX2hzeW5jX3N0YXJ0LCBwLT5jcnRjX2hkaXNwbGF5KTsKKwlwLT5jcnRjX2hibGFua19lbmQgPSBtYXgocC0+Y3J0Y19oc3luY19lbmQsIHAtPmNydGNfaHRvdGFsKTsKKworCXAtPmNydGNfaGFkanVzdGVkID0gZmFsc2U7CisJcC0+Y3J0Y192YWRqdXN0ZWQgPSBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfc2V0X2NydGNpbmZvKTsKKworCisvKioKKyAqIGRybV9tb2RlX2R1cGxpY2F0ZSAtIGFsbG9jYXRlIGFuZCBkdXBsaWNhdGUgYW4gZXhpc3RpbmcgbW9kZQorICogQG06IG1vZGUgdG8gZHVwbGljYXRlCisgKgorICogTE9DS0lORzoKKyAqIE5vbmUuCisgKgorICogSnVzdCBhbGxvY2F0ZSBhIG5ldyBtb2RlLCBjb3B5IHRoZSBleGlzdGluZyBtb2RlIGludG8gaXQsIGFuZCByZXR1cm4KKyAqIGEgcG9pbnRlciB0byBpdC4gIFVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2YgZXN0YWJsaXNoZWQgbW9kZXMuCisgKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9kdXBsaWNhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpubW9kZTsKKwlpbnQgbmV3X2lkOworCisJbm1vZGUgPSBkcm1fbW9kZV9jcmVhdGUoZGV2KTsKKwlpZiAoIW5tb2RlKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld19pZCA9IG5tb2RlLT5iYXNlLmlkOworCSpubW9kZSA9ICptb2RlOworCW5tb2RlLT5iYXNlLmlkID0gbmV3X2lkOworCUlOSVRfTElTVF9IRUFEKCZubW9kZS0+aGVhZCk7CisJcmV0dXJuIG5tb2RlOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV9kdXBsaWNhdGUpOworCisvKioKKyAqIGRybV9tb2RlX2VxdWFsIC0gdGVzdCBtb2RlcyBmb3IgZXF1YWxpdHkKKyAqIEBtb2RlMTogZmlyc3QgbW9kZQorICogQG1vZGUyOiBzZWNvbmQgbW9kZQorICoKKyAqIExPQ0tJTkc6CisgKiBOb25lLgorICoKKyAqIENoZWNrIHRvIHNlZSBpZiBAbW9kZTEgYW5kIEBtb2RlMiBhcmUgZXF1aXZhbGVudC4KKyAqCisgKiBSRVRVUk5TOgorICogVHJ1ZSBpZiB0aGUgbW9kZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgZHJtX21vZGVfZXF1YWwoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUxLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTIpCit7CisJLyogZG8gY2xvY2sgY2hlY2sgY29udmVydCB0byBQSUNPUyBzbyBmYiBtb2RlcyBnZXQgbWF0Y2hlZAorCSAqIHRoZSBzYW1lICovCisJaWYgKG1vZGUxLT5jbG9jayAmJiBtb2RlMi0+Y2xvY2spIHsKKwkJaWYgKEtIWjJQSUNPUyhtb2RlMS0+Y2xvY2spICE9IEtIWjJQSUNPUyhtb2RlMi0+Y2xvY2spKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAobW9kZTEtPmNsb2NrICE9IG1vZGUyLT5jbG9jaykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG1vZGUxLT5oZGlzcGxheSA9PSBtb2RlMi0+aGRpc3BsYXkgJiYKKwkgICAgbW9kZTEtPmhzeW5jX3N0YXJ0ID09IG1vZGUyLT5oc3luY19zdGFydCAmJgorCSAgICBtb2RlMS0+aHN5bmNfZW5kID09IG1vZGUyLT5oc3luY19lbmQgJiYKKwkgICAgbW9kZTEtPmh0b3RhbCA9PSBtb2RlMi0+aHRvdGFsICYmCisJICAgIG1vZGUxLT5oc2tldyA9PSBtb2RlMi0+aHNrZXcgJiYKKwkgICAgbW9kZTEtPnZkaXNwbGF5ID09IG1vZGUyLT52ZGlzcGxheSAmJgorCSAgICBtb2RlMS0+dnN5bmNfc3RhcnQgPT0gbW9kZTItPnZzeW5jX3N0YXJ0ICYmCisJICAgIG1vZGUxLT52c3luY19lbmQgPT0gbW9kZTItPnZzeW5jX2VuZCAmJgorCSAgICBtb2RlMS0+dnRvdGFsID09IG1vZGUyLT52dG90YWwgJiYKKwkgICAgbW9kZTEtPnZzY2FuID09IG1vZGUyLT52c2NhbiAmJgorCSAgICBtb2RlMS0+ZmxhZ3MgPT0gbW9kZTItPmZsYWdzKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfZXF1YWwpOworCisvKioKKyAqIGRybV9tb2RlX3ZhbGlkYXRlX3NpemUgLSBtYWtlIHN1cmUgbW9kZXMgYWRoZXJlIHRvIHNpemUgY29uc3RyYWludHMKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBtb2RlX2xpc3Q6IGxpc3Qgb2YgbW9kZXMgdG8gY2hlY2sKKyAqIEBtYXhYOiBtYXhpbXVtIHdpZHRoCisgKiBAbWF4WTogbWF4aW11bSBoZWlnaHQKKyAqIEBtYXhQaXRjaDogbWF4IHBpdGNoCisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgYSBsb2NrIHByb3RlY3RpbmcgQG1vZGVfbGlzdC4KKyAqCisgKiBUaGUgRFJNIGRldmljZSAoQGRldikgaGFzIHNpemUgYW5kIHBpdGNoIGxpbWl0cy4gIEhlcmUgd2UgdmFsaWRhdGUgdGhlCisgKiBtb2RlcyB3ZSBwcm9iZWQgZm9yIEBkZXYgYWdhaW5zdCB0aG9zZSBsaW1pdHMgYW5kIHNldCB0aGVpciBzdGF0dXMgYXMKKyAqIG5lY2Vzc2FyeS4KKyAqLwordm9pZCBkcm1fbW9kZV92YWxpZGF0ZV9zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqbW9kZV9saXN0LAorCQkJICAgIGludCBtYXhYLCBpbnQgbWF4WSwgaW50IG1heFBpdGNoKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCBtb2RlX2xpc3QsIGhlYWQpIHsKKwkJaWYgKG1heFBpdGNoID4gMCAmJiBtb2RlLT5oZGlzcGxheSA+IG1heFBpdGNoKQorCQkJbW9kZS0+c3RhdHVzID0gTU9ERV9CQURfV0lEVEg7CisKKwkJaWYgKG1heFggPiAwICYmIG1vZGUtPmhkaXNwbGF5ID4gbWF4WCkKKwkJCW1vZGUtPnN0YXR1cyA9IE1PREVfVklSVFVBTF9YOworCisJCWlmIChtYXhZID4gMCAmJiBtb2RlLT52ZGlzcGxheSA+IG1heFkpCisJCQltb2RlLT5zdGF0dXMgPSBNT0RFX1ZJUlRVQUxfWTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX3ZhbGlkYXRlX3NpemUpOworCisvKioKKyAqIGRybV9tb2RlX3ZhbGlkYXRlX2Nsb2NrcyAtIHZhbGlkYXRlIG1vZGVzIGFnYWluc3QgY2xvY2sgbGltaXRzCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAbW9kZV9saXN0OiBsaXN0IG9mIG1vZGVzIHRvIGNoZWNrCisgKiBAbWluOiBtaW5pbXVtIGNsb2NrIHJhdGUgYXJyYXkKKyAqIEBtYXg6IG1heGltdW0gY2xvY2sgcmF0ZSBhcnJheQorICogQG5fcmFuZ2VzOiBudW1iZXIgb2YgY2xvY2sgcmFuZ2VzIChzaXplIG9mIGFycmF5cykKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBhIGxvY2sgcHJvdGVjdGluZyBAbW9kZV9saXN0LgorICoKKyAqIFNvbWUgY29kZSBtYXkgbmVlZCB0byBjaGVjayBhIG1vZGUgbGlzdCBhZ2FpbnN0IHRoZSBjbG9jayBsaW1pdHMgb2YgdGhlCisgKiBkZXZpY2UgaW4gcXVlc3Rpb24uICBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBtb2RlIGxpc3QsIHRlc3RpbmcgdG8gbWFrZQorICogc3VyZSBlYWNoIG1vZGUgZmFsbHMgd2l0aGluIGEgZ2l2ZW4gcmFuZ2UgKGRlZmluZWQgYnkgQG1pbiBhbmQgQG1heAorICogYXJyYXlzKSBhbmQgc2V0cyBAbW9kZS0+c3RhdHVzIGFzIG5lZWRlZC4KKyAqLwordm9pZCBkcm1fbW9kZV92YWxpZGF0ZV9jbG9ja3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm1vZGVfbGlzdCwKKwkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50IG5fcmFuZ2VzKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCBtb2RlX2xpc3QsIGhlYWQpIHsKKwkJYm9vbCBnb29kID0gZmFsc2U7CisJCWZvciAoaSA9IDA7IGkgPCBuX3JhbmdlczsgaSsrKSB7CisJCQlpZiAobW9kZS0+Y2xvY2sgPj0gbWluW2ldICYmIG1vZGUtPmNsb2NrIDw9IG1heFtpXSkgeworCQkJCWdvb2QgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZ29vZCkKKwkJCW1vZGUtPnN0YXR1cyA9IE1PREVfQ0xPQ0tfUkFOR0U7CisJfQorfQorRVhQT1JUX1NZTUJPTChkcm1fbW9kZV92YWxpZGF0ZV9jbG9ja3MpOworCisvKioKKyAqIGRybV9tb2RlX3BydW5lX2ludmFsaWQgLSByZW1vdmUgaW52YWxpZCBtb2RlcyBmcm9tIG1vZGUgbGlzdAorICogQGRldjogRFJNIGRldmljZQorICogQG1vZGVfbGlzdDogbGlzdCBvZiBtb2RlcyB0byBjaGVjaworICogQHZlcmJvc2U6IGJlIHZlcmJvc2UgYWJvdXQgaXQKKyAqCisgKiBMT0NLSU5HOgorICogQ2FsbGVyIG11c3QgaG9sZCBhIGxvY2sgcHJvdGVjdGluZyBAbW9kZV9saXN0LgorICoKKyAqIE9uY2UgbW9kZSBsaXN0IGdlbmVyYXRpb24gaXMgY29tcGxldGUsIGEgY2FsbGVyIGNhbiB1c2UgdGhpcyByb3V0aW5lIHRvCisgKiByZW1vdmUgaW52YWxpZCBtb2RlcyBmcm9tIGEgbW9kZSBsaXN0LiAgSWYgYW55IG9mIHRoZSBtb2RlcyBoYXZlIGEKKyAqIHN0YXR1cyBvdGhlciB0aGFuICVNT0RFX09LLCB0aGV5IGFyZSByZW1vdmVkIGZyb20gQG1vZGVfbGlzdCBhbmQgZnJlZWQuCisgKi8KK3ZvaWQgZHJtX21vZGVfcHJ1bmVfaW52YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKm1vZGVfbGlzdCwgYm9vbCB2ZXJib3NlKQoreworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCB0LCBtb2RlX2xpc3QsIGhlYWQpIHsKKwkJaWYgKG1vZGUtPnN0YXR1cyAhPSBNT0RFX09LKSB7CisJCQlsaXN0X2RlbCgmbW9kZS0+aGVhZCk7CisJCQlpZiAodmVyYm9zZSkgeworCQkJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CisJCQkJRFJNX0RFQlVHKCJOb3QgdXNpbmcgJXMgbW9kZSAlZFxuIiwgbW9kZS0+bmFtZSwgbW9kZS0+c3RhdHVzKTsKKwkJCX0KKwkJCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBtb2RlKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfcHJ1bmVfaW52YWxpZCk7CisKKy8qKgorICogZHJtX21vZGVfY29tcGFyZSAtIGNvbXBhcmUgbW9kZXMgZm9yIGZhdm9yYWJpbGl0eQorICogQGxoX2E6IGxpc3RfaGVhZCBmb3IgZmlyc3QgbW9kZQorICogQGxoX2I6IGxpc3RfaGVhZCBmb3Igc2Vjb25kIG1vZGUKKyAqCisgKiBMT0NLSU5HOgorICogTm9uZS4KKyAqCisgKiBDb21wYXJlIHR3byBtb2RlcywgZ2l2ZW4gYnkgQGxoX2EgYW5kIEBsaF9iLCByZXR1cm5pbmcgYSB2YWx1ZSBpbmRpY2F0aW5nCisgKiB3aGljaCBpcyBiZXR0ZXIuCisgKgorICogUkVUVVJOUzoKKyAqIE5lZ2F0aXZlIGlmIEBsaF9hIGlzIGJldHRlciB0aGFuIEBsaF9iLCB6ZXJvIGlmIHRoZXkncmUgZXF1aXZhbGVudCwgb3IKKyAqIHBvc2l0aXZlIGlmIEBsaF9iIGlzIGJldHRlciB0aGFuIEBsaF9hLgorICovCitzdGF0aWMgaW50IGRybV9tb2RlX2NvbXBhcmUoc3RydWN0IGxpc3RfaGVhZCAqbGhfYSwgc3RydWN0IGxpc3RfaGVhZCAqbGhfYikKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYSA9IGxpc3RfZW50cnkobGhfYSwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGhlYWQpOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpiID0gbGlzdF9lbnRyeShsaF9iLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwgaGVhZCk7CisJaW50IGRpZmY7CisKKwlkaWZmID0gKChiLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpICE9IDApIC0KKwkJKChhLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpICE9IDApOworCWlmIChkaWZmKQorCQlyZXR1cm4gZGlmZjsKKwlkaWZmID0gYi0+aGRpc3BsYXkgKiBiLT52ZGlzcGxheSAtIGEtPmhkaXNwbGF5ICogYS0+dmRpc3BsYXk7CisJaWYgKGRpZmYpCisJCXJldHVybiBkaWZmOworCWRpZmYgPSBiLT5jbG9jayAtIGEtPmNsb2NrOworCXJldHVybiBkaWZmOworfQorCisvKiBGSVhNRTogd2hhdCB3ZSBkb24ndCBoYXZlIGEgbGlzdCBzb3J0IGZ1bmN0aW9uPyAqLworLyogbGlzdCBzb3J0IGZyb20gTWFyayBKIFJvYmVydHMgKG1qckB6bmV4Lm9yZykgKi8KK3ZvaWQgbGlzdF9zb3J0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJICAgICAgIGludCAoKmNtcCkoc3RydWN0IGxpc3RfaGVhZCAqYSwgc3RydWN0IGxpc3RfaGVhZCAqYikpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEsICplLCAqbGlzdCwgKnRhaWwsICpvbGRoZWFkOworCWludCBpbnNpemUsIG5tZXJnZXMsIHBzaXplLCBxc2l6ZSwgaTsKKworCWxpc3QgPSBoZWFkLT5uZXh0OworCWxpc3RfZGVsKGhlYWQpOworCWluc2l6ZSA9IDE7CisJZm9yICg7OykgeworCQlwID0gb2xkaGVhZCA9IGxpc3Q7CisJCWxpc3QgPSB0YWlsID0gTlVMTDsKKwkJbm1lcmdlcyA9IDA7CisKKwkJd2hpbGUgKHApIHsKKwkJCW5tZXJnZXMrKzsKKwkJCXEgPSBwOworCQkJcHNpemUgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGluc2l6ZTsgaSsrKSB7CisJCQkJcHNpemUrKzsKKwkJCQlxID0gcS0+bmV4dCA9PSBvbGRoZWFkID8gTlVMTCA6IHEtPm5leHQ7CisJCQkJaWYgKCFxKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcXNpemUgPSBpbnNpemU7CisJCQl3aGlsZSAocHNpemUgPiAwIHx8IChxc2l6ZSA+IDAgJiYgcSkpIHsKKwkJCQlpZiAoIXBzaXplKSB7CisJCQkJCWUgPSBxOworCQkJCQlxID0gcS0+bmV4dDsKKwkJCQkJcXNpemUtLTsKKwkJCQkJaWYgKHEgPT0gb2xkaGVhZCkKKwkJCQkJCXEgPSBOVUxMOworCQkJCX0gZWxzZSBpZiAoIXFzaXplIHx8ICFxKSB7CisJCQkJCWUgPSBwOworCQkJCQlwID0gcC0+bmV4dDsKKwkJCQkJcHNpemUtLTsKKwkJCQkJaWYgKHAgPT0gb2xkaGVhZCkKKwkJCQkJCXAgPSBOVUxMOworCQkJCX0gZWxzZSBpZiAoY21wKHAsIHEpIDw9IDApIHsKKwkJCQkJZSA9IHA7CisJCQkJCXAgPSBwLT5uZXh0OworCQkJCQlwc2l6ZS0tOworCQkJCQlpZiAocCA9PSBvbGRoZWFkKQorCQkJCQkJcCA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJZSA9IHE7CisJCQkJCXEgPSBxLT5uZXh0OworCQkJCQlxc2l6ZS0tOworCQkJCQlpZiAocSA9PSBvbGRoZWFkKQorCQkJCQkJcSA9IE5VTEw7CisJCQkJfQorCQkJCWlmICh0YWlsKQorCQkJCQl0YWlsLT5uZXh0ID0gZTsKKwkJCQllbHNlCisJCQkJCWxpc3QgPSBlOworCQkJCWUtPnByZXYgPSB0YWlsOworCQkJCXRhaWwgPSBlOworCQkJfQorCQkJcCA9IHE7CisJCX0KKworCQl0YWlsLT5uZXh0ID0gbGlzdDsKKwkJbGlzdC0+cHJldiA9IHRhaWw7CisKKwkJaWYgKG5tZXJnZXMgPD0gMSkKKwkJCWJyZWFrOworCisJCWluc2l6ZSAqPSAyOworCX0KKworCWhlYWQtPm5leHQgPSBsaXN0OworCWhlYWQtPnByZXYgPSBsaXN0LT5wcmV2OworCWxpc3QtPnByZXYtPm5leHQgPSBoZWFkOworCWxpc3QtPnByZXYgPSBoZWFkOworfQorCisvKioKKyAqIGRybV9tb2RlX3NvcnQgLSBzb3J0IG1vZGUgbGlzdAorICogQG1vZGVfbGlzdDogbGlzdCB0byBzb3J0CisgKgorICogTE9DS0lORzoKKyAqIENhbGxlciBtdXN0IGhvbGQgYSBsb2NrIHByb3RlY3RpbmcgQG1vZGVfbGlzdC4KKyAqCisgKiBTb3J0IEBtb2RlX2xpc3QgYnkgZmF2b3JhYmlsaXR5LCBwdXR0aW5nIGdvb2QgbW9kZXMgZmlyc3QuCisgKi8KK3ZvaWQgZHJtX21vZGVfc29ydChzdHJ1Y3QgbGlzdF9oZWFkICptb2RlX2xpc3QpCit7CisJbGlzdF9zb3J0KG1vZGVfbGlzdCwgZHJtX21vZGVfY29tcGFyZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9tb2RlX3NvcnQpOworCisvKioKKyAqIGRybV9tb2RlX2Nvbm5lY3Rvcl9saXN0X3VwZGF0ZSAtIHVwZGF0ZSB0aGUgbW9kZSBsaXN0IGZvciB0aGUgY29ubmVjdG9yCisgKiBAY29ubmVjdG9yOiB0aGUgY29ubmVjdG9yIHRvIHVwZGF0ZQorICoKKyAqIExPQ0tJTkc6CisgKiBDYWxsZXIgbXVzdCBob2xkIGEgbG9jayBwcm90ZWN0aW5nIEBtb2RlX2xpc3QuCisgKgorICogVGhpcyBtb3ZlcyB0aGUgbW9kZXMgZnJvbSB0aGUgQGNvbm5lY3RvciBwcm9iZWRfbW9kZXMgbGlzdAorICogdG8gdGhlIGFjdHVhbCBtb2RlIGxpc3QuIEl0IGNvbXBhcmVzIHRoZSBwcm9iZWQgbW9kZSBhZ2FpbnN0IHRoZSBjdXJyZW50CisgKiBsaXN0IGFuZCBvbmx5IGFkZHMgZGlmZmVyZW50IG1vZGVzLiBBbGwgbW9kZXMgdW52ZXJpZmllZCBhZnRlciB0aGlzIHBvaW50CisgKiB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIHBydW5lIGludmFsaWQgbW9kZXMuCisgKi8KK3ZvaWQgZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBtb2RlLCAqcHQ7CisJaW50IGZvdW5kX2l0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBtb2RlLCBwdCwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLAorCQkJCSBoZWFkKSB7CisJCWZvdW5kX2l0ID0gMDsKKwkJLyogZ28gdGhyb3VnaCBjdXJyZW50IG1vZGVzIGNoZWNraW5nIGZvciB0aGUgbmV3IHByb2JlZCBtb2RlICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJCWlmIChkcm1fbW9kZV9lcXVhbChwbW9kZSwgbW9kZSkpIHsKKwkJCQlmb3VuZF9pdCA9IDE7CisJCQkJLyogaWYgZXF1YWwgZGVsZXRlIHRoZSBwcm9iZWQgbW9kZSAqLworCQkJCW1vZGUtPnN0YXR1cyA9IHBtb2RlLT5zdGF0dXM7CisJCQkJbGlzdF9kZWwoJnBtb2RlLT5oZWFkKTsKKwkJCQlkcm1fbW9kZV9kZXN0cm95KGNvbm5lY3Rvci0+ZGV2LCBwbW9kZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kX2l0KSB7CisJCQlsaXN0X21vdmVfdGFpbCgmcG1vZGUtPmhlYWQsICZjb25uZWN0b3ItPm1vZGVzKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0woZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKaW5kZXggYWU3M2I3Zi4uOGRmODQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKQEAgLTQ5LDYgKzQ5LDggQEAKIAkJCSAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IGRybV9idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBkcm1fdmJsYW5rX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IGRybV9nZW1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IGRybV9nZW1fb2JqZWN0X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKQEAgLTcyLDYgKzc0LDcgQEAKIAl7ImNsaWVudHMiLCBkcm1fY2xpZW50c19pbmZvLCAwfSwKIAl7InF1ZXVlcyIsIGRybV9xdWV1ZXNfaW5mbywgMH0sCiAJeyJidWZzIiwgZHJtX2J1ZnNfaW5mbywgMH0sCisJeyJ2YmxhbmsiLCBkcm1fdmJsYW5rX2luZm8sIDB9LAogCXsiZ2VtX25hbWVzIiwgZHJtX2dlbV9uYW1lX2luZm8sIERSSVZFUl9HRU19LAogCXsiZ2VtX29iamVjdHMiLCBkcm1fZ2VtX29iamVjdF9pbmZvLCBEUklWRVJfR0VNfSwKICNpZiBEUk1fREVCVUdfQ09ERQpAQCAtMTk1LDYgKzE5OCw3IEBACiAJCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRybV9taW5vciAqbWlub3IgPSAoc3RydWN0IGRybV9taW5vciAqKSBkYXRhOworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIgPSBtaW5vci0+bWFzdGVyOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OwogCWludCBsZW4gPSAwOwogCkBAIC0yMDMsMTMgKzIwNywxNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIDA7CisKIAkqc3RhcnQgPSAmYnVmW29mZnNldF07CiAJKmVvZiA9IDA7CiAKLQlpZiAoZGV2LT51bmlxdWUpIHsKKwlpZiAobWFzdGVyLT51bmlxdWUpIHsKIAkJRFJNX1BST0NfUFJJTlQoIiVzICVzICVzXG4iLAogCQkJICAgICAgIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsCi0JCQkgICAgICAgcGNpX25hbWUoZGV2LT5wZGV2KSwgZGV2LT51bmlxdWUpOworCQkJICAgICAgIHBjaV9uYW1lKGRldi0+cGRldiksIG1hc3Rlci0+dW5pcXVlKTsKIAl9IGVsc2UgewogCQlEUk1fUFJPQ19QUklOVCgiJXMgJXNcbiIsIGRldi0+ZHJpdmVyLT5wY2lfZHJpdmVyLm5hbWUsCiAJCQkgICAgICAgcGNpX25hbWUoZGV2LT5wZGV2KSk7CkBAIC00NTQsNiArNDYxLDY2IEBACiB9CiAKIC8qKgorICogQ2FsbGVkIHdoZW4gIi9wcm9jL2RyaS8uLi4vdmJsYW5rIiBpcyByZWFkLgorICoKKyAqIFxwYXJhbSBidWYgb3V0cHV0IGJ1ZmZlci4KKyAqIFxwYXJhbSBzdGFydCBzdGFydCBvZiBvdXRwdXQgZGF0YS4KKyAqIFxwYXJhbSBvZmZzZXQgcmVxdWVzdGVkIHN0YXJ0IG9mZnNldC4KKyAqIFxwYXJhbSByZXF1ZXN0IHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuCisgKiBccGFyYW0gZW9mIHdoZXRoZXIgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybi4KKyAqIFxwYXJhbSBkYXRhIHByaXZhdGUgZGF0YS4KKyAqIFxyZXR1cm4gbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgZHJtX192YmxhbmtfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9taW5vciAqbWlub3IgPSAoc3RydWN0IGRybV9taW5vciAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OworCWludCBsZW4gPSAwOworCWludCBjcnRjOworCisJaWYgKG9mZnNldCA+IERSTV9QUk9DX0xJTUlUKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSAmYnVmW29mZnNldF07CisJKmVvZiA9IDA7CisKKwlmb3IgKGNydGMgPSAwOyBjcnRjIDwgZGV2LT5udW1fY3J0Y3M7IGNydGMrKykgeworCQlEUk1fUFJPQ19QUklOVCgiQ1JUQyAlZCBlbmFibGU6ICAgICAlZFxuIiwKKwkJCSAgICAgICBjcnRjLCBhdG9taWNfcmVhZCgmZGV2LT52YmxhbmtfcmVmY291bnRbY3J0Y10pKTsKKwkJRFJNX1BST0NfUFJJTlQoIkNSVEMgJWQgY291bnRlcjogICAgJWRcbiIsCisJCQkgICAgICAgY3J0YywgZHJtX3ZibGFua19jb3VudChkZXYsIGNydGMpKTsKKwkJRFJNX1BST0NfUFJJTlQoIkNSVEMgJWQgbGFzdCB3YWl0OiAgJWRcbiIsCisJCQkgICAgICAgY3J0YywgZGV2LT5sYXN0X3ZibGFua193YWl0W2NydGNdKTsKKwkJRFJNX1BST0NfUFJJTlQoIkNSVEMgJWQgaW4gbW9kZXNldDogJWRcbiIsCisJCQkgICAgICAgY3J0YywgZGV2LT52YmxhbmtfaW5tb2Rlc2V0W2NydGNdKTsKKwl9CisKKwlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkKKwkJcmV0dXJuIHJlcXVlc3Q7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbiAtIG9mZnNldDsKK30KKworLyoqCisgKiBTaW1wbHkgY2FsbHMgX3ZibGFua19pbmZvKCkgd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCisgKi8KK3N0YXRpYyBpbnQgZHJtX3ZibGFua19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAorCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yID0gKHN0cnVjdCBkcm1fbWlub3IgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbWlub3ItPmRldjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldCA9IGRybV9fdmJsYW5rX2luZm8oYnVmLCBzdGFydCwgb2Zmc2V0LCByZXF1ZXN0LCBlb2YsIGRhdGEpOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogQ2FsbGVkIHdoZW4gIi9wcm9jL2RyaS8uLi4vY2xpZW50cyIgaXMgcmVhZC4KICAqCiAgKiBccGFyYW0gYnVmIG91dHB1dCBidWZmZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jCmluZGV4IDY2Yzk2ZWMuLjVjYTEzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3R1Yi5jCkBAIC01Nyw2ICs1NywxNCBAQAogCWludCByZXQ7CiAJaW50IGJhc2UgPSAwLCBsaW1pdCA9IDYzOwogCisJaWYgKHR5cGUgPT0gRFJNX01JTk9SX0NPTlRST0wpIHsKKyAgICAgICAgICAgICAgICBiYXNlICs9IDY0OworICAgICAgICAgICAgICAgIGxpbWl0ID0gYmFzZSArIDEyNzsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IERSTV9NSU5PUl9SRU5ERVIpIHsKKyAgICAgICAgICAgICAgICBiYXNlICs9IDEyODsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGJhc2UgKyAyNTU7CisgICAgICAgIH0KKwogYWdhaW46CiAJaWYgKGlkcl9wcmVfZ2V0KCZkcm1fbWlub3JzX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgewogCQlEUk1fRVJST1IoIk91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIGRyYXdhYmxlIGlkclxuIik7CkBAIC03OSw2ICs4NywxMDQgQEAKIAlyZXR1cm4gbmV3X2lkOwogfQogCitzdHJ1Y3QgZHJtX21hc3RlciAqZHJtX21hc3Rlcl9jcmVhdGUoc3RydWN0IGRybV9taW5vciAqbWlub3IpCit7CisJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCptYXN0ZXIpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiBOVUxMOworCisJa3JlZl9pbml0KCZtYXN0ZXItPnJlZmNvdW50KTsKKwlzcGluX2xvY2tfaW5pdCgmbWFzdGVyLT5sb2NrLnNwaW5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtYXN0ZXItPmxvY2subG9ja19xdWV1ZSk7CisJZHJtX2h0X2NyZWF0ZSgmbWFzdGVyLT5tYWdpY2xpc3QsIERSTV9NQUdJQ19IQVNIX09SREVSKTsKKwlJTklUX0xJU1RfSEVBRCgmbWFzdGVyLT5tYWdpY2ZyZWUpOworCW1hc3Rlci0+bWlub3IgPSBtaW5vcjsKKworCWxpc3RfYWRkX3RhaWwoJm1hc3Rlci0+aGVhZCwgJm1pbm9yLT5tYXN0ZXJfbGlzdCk7CisKKwlyZXR1cm4gbWFzdGVyOworfQorCitzdHJ1Y3QgZHJtX21hc3RlciAqZHJtX21hc3Rlcl9nZXQoc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlrcmVmX2dldCgmbWFzdGVyLT5yZWZjb3VudCk7CisJcmV0dXJuIG1hc3RlcjsKK30KKworc3RhdGljIHZvaWQgZHJtX21hc3Rlcl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRybV9tYXN0ZXIsIHJlZmNvdW50KTsKKwlzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5ICpwdCwgKm5leHQ7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1hc3Rlci0+bWlub3ItPmRldjsKKworCWxpc3RfZGVsKCZtYXN0ZXItPmhlYWQpOworCisJaWYgKGRldi0+ZHJpdmVyLT5tYXN0ZXJfZGVzdHJveSkKKwkJZGV2LT5kcml2ZXItPm1hc3Rlcl9kZXN0cm95KGRldiwgbWFzdGVyKTsKKworCWlmIChtYXN0ZXItPnVuaXF1ZSkgeworCQlkcm1fZnJlZShtYXN0ZXItPnVuaXF1ZSwgbWFzdGVyLT51bmlxdWVfc2l6ZSwgRFJNX01FTV9EUklWRVIpOworCQltYXN0ZXItPnVuaXF1ZSA9IE5VTEw7CisJCW1hc3Rlci0+dW5pcXVlX2xlbiA9IDA7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCBuZXh0LCAmbWFzdGVyLT5tYWdpY2ZyZWUsIGhlYWQpIHsKKwkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKKwkJZHJtX2h0X3JlbW92ZV9pdGVtKCZtYXN0ZXItPm1hZ2ljbGlzdCwgJnB0LT5oYXNoX2l0ZW0pOworCQlkcm1fZnJlZShwdCwgc2l6ZW9mKCpwdCksIERSTV9NRU1fTUFHSUMpOworCX0KKworCWRybV9odF9yZW1vdmUoJm1hc3Rlci0+bWFnaWNsaXN0KTsKKworCWlmIChtYXN0ZXItPmxvY2suaHdfbG9jaykgeworCQlpZiAoZGV2LT5zaWdkYXRhLmxvY2sgPT0gbWFzdGVyLT5sb2NrLmh3X2xvY2spCisJCQlkZXYtPnNpZ2RhdGEubG9jayA9IE5VTEw7CisJCW1hc3Rlci0+bG9jay5od19sb2NrID0gTlVMTDsKKwkJbWFzdGVyLT5sb2NrLmZpbGVfcHJpdiA9IE5VTEw7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWFzdGVyLT5sb2NrLmxvY2tfcXVldWUpOworCX0KKworCWRybV9mcmVlKG1hc3Rlciwgc2l6ZW9mKCptYXN0ZXIpLCBEUk1fTUVNX0RSSVZFUik7Cit9CisKK3ZvaWQgZHJtX21hc3Rlcl9wdXQoc3RydWN0IGRybV9tYXN0ZXIgKiptYXN0ZXIpCit7CisJa3JlZl9wdXQoJigqbWFzdGVyKS0+cmVmY291bnQsIGRybV9tYXN0ZXJfZGVzdHJveSk7CisJKm1hc3RlciA9IE5VTEw7Cit9CisKK2ludCBkcm1fc2V0bWFzdGVyX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlpZiAoZmlsZV9wcml2LT5taW5vci0+bWFzdGVyICYmIGZpbGVfcHJpdi0+bWlub3ItPm1hc3RlciAhPSBmaWxlX3ByaXYtPm1hc3RlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWZpbGVfcHJpdi0+bWFzdGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmlsZV9wcml2LT5taW5vci0+bWFzdGVyICYmCisJICAgIGZpbGVfcHJpdi0+bWlub3ItPm1hc3RlciAhPSBmaWxlX3ByaXYtPm1hc3RlcikgeworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWZpbGVfcHJpdi0+bWlub3ItPm1hc3RlciA9IGRybV9tYXN0ZXJfZ2V0KGZpbGVfcHJpdi0+bWFzdGVyKTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZHJtX2Ryb3BtYXN0ZXJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlpZiAoIWZpbGVfcHJpdi0+bWFzdGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX21hc3Rlcl9wdXQoJmZpbGVfcHJpdi0+bWlub3ItPm1hc3Rlcik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHJtX2ZpbGxfaW5fZGV2KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCQkgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQpAQCAtOTIsNyArMTk4LDYgQEAKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvdW50X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRyd19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrLnNwaW5sb2NrKTsKIAlpbml0X3RpbWVyKCZkZXYtPnRpbWVyKTsKIAltdXRleF9pbml0KCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZGV2LT5jdHhsaXN0X211dGV4KTsKQEAgLTE0MCw5ICsyNDUsNiBAQAogCQl9CiAJfQogCi0JaWYgKGRldi0+ZHJpdmVyLT5sb2FkKQotCQlpZiAoKHJldGNvZGUgPSBkZXYtPmRyaXZlci0+bG9hZChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKLQkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOwogCiAJcmV0Y29kZSA9IGRybV9jdHhiaXRtYXBfaW5pdChkZXYpOwogCWlmIChyZXRjb2RlKSB7CkBAIC0yMDAsNiArMzAyLDcgQEAKIAluZXdfbWlub3ItPmRldmljZSA9IE1LREVWKERSTV9NQUpPUiwgbWlub3JfaWQpOwogCW5ld19taW5vci0+ZGV2ID0gZGV2OwogCW5ld19taW5vci0+aW5kZXggPSBtaW5vcl9pZDsKKwlJTklUX0xJU1RfSEVBRCgmbmV3X21pbm9yLT5tYXN0ZXJfbGlzdCk7CiAKIAlpZHJfcmVwbGFjZSgmZHJtX21pbm9yc19pZHIsIG5ld19taW5vciwgbWlub3JfaWQpOwogCkBAIC0yNjcsOCArMzcwLDMwIEBACiAJCXByaW50ayhLRVJOX0VSUiAiRFJNOiBGaWxsX2luX2RldiBmYWlsZWQuXG4iKTsKIAkJZ290byBlcnJfZzI7CiAJfQorCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcmV0ID0gZHJtX2dldF9taW5vcihkZXYsICZkZXYtPmNvbnRyb2wsIERSTV9NSU5PUl9DT05UUk9MKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2cyOworCX0KKwogCWlmICgocmV0ID0gZHJtX2dldF9taW5vcihkZXYsICZkZXYtPnByaW1hcnksIERSTV9NSU5PUl9MRUdBQ1kpKSkKLQkJZ290byBlcnJfZzI7CisJCWdvdG8gZXJyX2czOworCisJaWYgKGRldi0+ZHJpdmVyLT5sb2FkKSB7CisJCXJldCA9IGRldi0+ZHJpdmVyLT5sb2FkKGRldiwgZW50LT5kcml2ZXJfZGF0YSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nMzsKKwl9CisKKyAgICAgICAgLyogc2V0dXAgdGhlIGdyb3VwaW5nIGZvciB0aGUgbGVnYWN5IG91dHB1dCAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCXJldCA9IGRybV9tb2RlX2dyb3VwX2luaXRfbGVnYWN5X2dyb3VwKGRldiwgJmRldi0+cHJpbWFyeS0+bW9kZV9ncm91cCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9nMzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRyaXZlcl9pdGVtLCAmZHJpdmVyLT5kZXZpY2VfbGlzdCk7CiAKIAlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWRcbiIsCiAJCSBkcml2ZXItPm5hbWUsIGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3IsIGRyaXZlci0+cGF0Y2hsZXZlbCwKQEAgLTI3Niw2ICs0MDEsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycl9nMzoKKwlkcm1fcHV0X21pbm9yKCZkZXYtPnByaW1hcnkpOwogZXJyX2cyOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIGVycl9nMToKQEAgLTI5NywxMSArNDI0LDYgQEAKIHsKIAlEUk1fREVCVUcoInJlbGVhc2UgcHJpbWFyeSAlc1xuIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSk7CiAKLQlpZiAoZGV2LT51bmlxdWUpIHsKLQkJZHJtX2ZyZWUoZGV2LT51bmlxdWUsIHN0cmxlbihkZXYtPnVuaXF1ZSkgKyAxLCBEUk1fTUVNX0RSSVZFUik7Ci0JCWRldi0+dW5pcXVlID0gTlVMTDsKLQkJZGV2LT51bmlxdWVfbGVuID0gMDsKLQl9CiAJaWYgKGRldi0+ZGV2bmFtZSkgewogCQlkcm1fZnJlZShkZXYtPmRldm5hbWUsIHN0cmxlbihkZXYtPmRldm5hbWUpICsgMSwKIAkJCSBEUk1fTUVNX0RSSVZFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggMTYxMWI5Yi4uNjVkNzJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImRybVAuaCIKIAogI2RlZmluZSB0b19kcm1fbWlub3IoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkcm1fbWlub3IsIGtkZXYpCisjZGVmaW5lIHRvX2RybV9jb25uZWN0b3IoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkcm1fY29ubmVjdG9yLCBrZGV2KQogCiAvKioKICAqIGRybV9zeXNmc19zdXNwZW5kIC0gRFJNIGNsYXNzIHN1c3BlbmQgaG9vawpAQCAtMzQsNyArMzUsNyBAQAogCXN0cnVjdCBkcm1fbWlub3IgKmRybV9taW5vciA9IHRvX2RybV9taW5vcihkZXYpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2ID0gZHJtX21pbm9yLT5kZXY7CiAKLQlpZiAoZHJtX2Rldi0+ZHJpdmVyLT5zdXNwZW5kKQorCWlmIChkcm1fbWlub3ItPnR5cGUgPT0gRFJNX01JTk9SX0xFR0FDWSAmJiBkcm1fZGV2LT5kcml2ZXItPnN1c3BlbmQpCiAJCXJldHVybiBkcm1fZGV2LT5kcml2ZXItPnN1c3BlbmQoZHJtX2Rldiwgc3RhdGUpOwogCiAJcmV0dXJuIDA7CkBAIC01Miw3ICs1Myw3IEBACiAJc3RydWN0IGRybV9taW5vciAqZHJtX21pbm9yID0gdG9fZHJtX21pbm9yKGRldik7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSBkcm1fbWlub3ItPmRldjsKIAotCWlmIChkcm1fZGV2LT5kcml2ZXItPnJlc3VtZSkKKwlpZiAoZHJtX21pbm9yLT50eXBlID09IERSTV9NSU5PUl9MRUdBQ1kgJiYgZHJtX2Rldi0+ZHJpdmVyLT5yZXN1bWUpCiAJCXJldHVybiBkcm1fZGV2LT5kcml2ZXItPnJlc3VtZShkcm1fZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTQ0LDYgKzE0NSwzMjMgQEAKIAlyZXR1cm47CiB9CiAKKy8qCisgKiBDb25uZWN0b3IgcHJvcGVydGllcworICovCitzdGF0aWMgc3NpemVfdCBzdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9fZHJtX2Nvbm5lY3RvcihkZXZpY2UpOworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gY29ubmVjdG9yLT5mdW5jcy0+ZGV0ZWN0KGNvbm5lY3Rvcik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMiLAorCQkJZHJtX2dldF9jb25uZWN0b3Jfc3RhdHVzX25hbWUoc3RhdHVzKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRwbXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9fZHJtX2Nvbm5lY3RvcihkZXZpY2UpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwl1aW50NjRfdCBkcG1zX3N0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9nZXRfdmFsdWUoY29ubmVjdG9yLAorCQkJCQkgICAgZGV2LT5tb2RlX2NvbmZpZy5kcG1zX3Byb3BlcnR5LAorCQkJCQkgICAgJmRwbXNfc3RhdHVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzIiwKKwkJCWRybV9nZXRfZHBtc19uYW1lKChpbnQpZHBtc19zdGF0dXMpKTsKK30KKworc3RhdGljIHNzaXplX3QgZW5hYmxlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9fZHJtX2Nvbm5lY3RvcihkZXZpY2UpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCBjb25uZWN0b3ItPmVuY29kZXIgPyAiZW5hYmxlZCIgOgorCQkJImRpc2FibGVkIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVkaWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqY29ubmVjdG9yX2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gdG9fZHJtX2Nvbm5lY3Rvcihjb25uZWN0b3JfZGV2KTsKKwl1bnNpZ25lZCBjaGFyICplZGlkOworCXNpemVfdCBzaXplOworCisJaWYgKCFjb25uZWN0b3ItPmVkaWRfYmxvYl9wdHIpCisJCXJldHVybiAwOworCisJZWRpZCA9IGNvbm5lY3Rvci0+ZWRpZF9ibG9iX3B0ci0+ZGF0YTsKKwlzaXplID0gY29ubmVjdG9yLT5lZGlkX2Jsb2JfcHRyLT5sZW5ndGg7CisJaWYgKCFlZGlkKQorCQlyZXR1cm4gMDsKKworCWlmIChvZmYgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2ZmICsgY291bnQgPiBzaXplKQorCQljb3VudCA9IHNpemUgLSBvZmY7CisJbWVtY3B5KGJ1ZiwgZWRpZCArIG9mZiwgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBtb2Rlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19kcm1fY29ubmVjdG9yKGRldmljZSk7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJaW50IHdyaXR0ZW4gPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkgeworCQl3cml0dGVuICs9IHNucHJpbnRmKGJ1ZiArIHdyaXR0ZW4sIFBBR0VfU0laRSAtIHdyaXR0ZW4sICIlc1xuIiwKKwkJCQkgICAgbW9kZS0+bmFtZSk7CisJfQorCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN1YmNvbm5lY3Rvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19kcm1fY29ubmVjdG9yKGRldmljZSk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3AgPSBOVUxMOworCXVpbnQ2NF90IHN1YmNvbm5lY3RvcjsKKwlpbnQgaXNfdHYgPSAwOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpIHsKKwkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKKwkJCXByb3AgPSBkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGU6CisJCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTzoKKwkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9uZW50OgorCQkJcHJvcCA9IGRldi0+bW9kZV9jb25maWcudHZfc3ViY29ubmVjdG9yX3Byb3BlcnR5OworCQkJaXNfdHYgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIldyb25nIGNvbm5lY3RvciB0eXBlIGZvciB0aGlzIHByb3BlcnR5XG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCWlmICghcHJvcCkgeworCQlEUk1fRVJST1IoIlVuYWJsZSB0byBmaW5kIHN1YmNvbm5lY3RvciBwcm9wZXJ0eVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGRybV9jb25uZWN0b3JfcHJvcGVydHlfZ2V0X3ZhbHVlKGNvbm5lY3RvciwgcHJvcCwgJnN1YmNvbm5lY3Rvcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyIsIGlzX3R2ID8KKwkJCWRybV9nZXRfdHZfc3ViY29ubmVjdG9yX25hbWUoKGludClzdWJjb25uZWN0b3IpIDoKKwkJCWRybV9nZXRfZHZpX2lfc3ViY29ubmVjdG9yX25hbWUoKGludClzdWJjb25uZWN0b3IpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2VsZWN0X3N1YmNvbm5lY3Rvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSB0b19kcm1fY29ubmVjdG9yKGRldmljZSk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3AgPSBOVUxMOworCXVpbnQ2NF90IHN1YmNvbm5lY3RvcjsKKwlpbnQgaXNfdHYgPSAwOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpIHsKKwkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKKwkJCXByb3AgPSBkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHk7CisJCQlicmVhazsKKwkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOgorCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86CisJCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudDoKKwkJCXByb3AgPSBkZXYtPm1vZGVfY29uZmlnLnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHk7CisJCQlpc190diA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiV3JvbmcgY29ubmVjdG9yIHR5cGUgZm9yIHRoaXMgcHJvcGVydHlcbiIpOworCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwcm9wKSB7CisJCURSTV9FUlJPUigiVW5hYmxlIHRvIGZpbmQgc2VsZWN0IHN1YmNvbm5lY3RvciBwcm9wZXJ0eVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGRybV9jb25uZWN0b3JfcHJvcGVydHlfZ2V0X3ZhbHVlKGNvbm5lY3RvciwgcHJvcCwgJnN1YmNvbm5lY3Rvcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyIsIGlzX3R2ID8KKwkJCWRybV9nZXRfdHZfc2VsZWN0X25hbWUoKGludClzdWJjb25uZWN0b3IpIDoKKwkJCWRybV9nZXRfZHZpX2lfc2VsZWN0X25hbWUoKGludClzdWJjb25uZWN0b3IpKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGNvbm5lY3Rvcl9hdHRyc1tdID0geworCV9fQVRUUl9STyhzdGF0dXMpLAorCV9fQVRUUl9STyhlbmFibGVkKSwKKwlfX0FUVFJfUk8oZHBtcyksCisJX19BVFRSX1JPKG1vZGVzKSwKK307CisKKy8qIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIGZvciBib3RoIERWSS1JIGNvbm5lY3RvcnMgYW5kIGFsbCB0eXBlcyBvZiB0di1vdXQuICovCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgY29ubmVjdG9yX2F0dHJzX29wdDFbXSA9IHsKKwlfX0FUVFJfUk8oc3ViY29ubmVjdG9yKSwKKwlfX0FUVFJfUk8oc2VsZWN0X3N1YmNvbm5lY3RvciksCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZWRpZF9hdHRyID0geworCS5hdHRyLm5hbWUgPSAiZWRpZCIsCisJLnNpemUgPSAxMjgsCisJLnJlYWQgPSBlZGlkX3Nob3csCit9OworCisvKioKKyAqIGRybV9zeXNmc19jb25uZWN0b3JfYWRkIC0gYWRkIGFuIGNvbm5lY3RvciB0byBzeXNmcworICogQGNvbm5lY3RvcjogY29ubmVjdG9yIHRvIGFkZAorICoKKyAqIENyZWF0ZSBhbiBjb25uZWN0b3IgZGV2aWNlIGluIHN5c2ZzLCBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIGNvbm5lY3RvcgorICogcHJvcGVydGllcyAoc28gZmFyLCBjb25uZWN0aW9uIHN0YXR1cywgZHBtcywgbW9kZSBsaXN0ICYgZWRpZCkgYW5kCisgKiBnZW5lcmF0ZSBhIGhvdHBsdWcgZXZlbnQgc28gdXNlcnNwYWNlIGtub3dzIHRoZXJlJ3MgYSBuZXcgY29ubmVjdG9yCisgKiBhdmFpbGFibGUuCisgKgorICogTm90ZToKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgKm9uY2UqIGZvciBlYWNoIERSTSBtaW5vciByZWdpc3RlcmVkLgorICogQSBzZWNvbmQgY2FsbCBmb3IgYW4gYWxyZWFkeSByZWdpc3RlcmVkIGRldmljZSB3aWxsIHRyaWdnZXIgdGhlIEJVR19PTgorICogYmVsb3cuCisgKi8KK2ludCBkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlpbnQgcmV0ID0gMCwgaSwgajsKKworCS8qIFdlIHNob3VsZG4ndCBnZXQgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBjb25uZWN0b3IgKi8KKwlCVUdfT04oZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmNvbm5lY3Rvci0+a2RldikpOworCisJY29ubmVjdG9yLT5rZGV2LnBhcmVudCA9ICZkZXYtPnByaW1hcnktPmtkZXY7CisJY29ubmVjdG9yLT5rZGV2LmNsYXNzID0gZHJtX2NsYXNzOworCWNvbm5lY3Rvci0+a2Rldi5yZWxlYXNlID0gZHJtX3N5c2ZzX2RldmljZV9yZWxlYXNlOworCisJRFJNX0RFQlVHKCJhZGRpbmcgXCIlc1wiIHRvIHN5c2ZzXG4iLAorCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisKKwlzbnByaW50Zihjb25uZWN0b3ItPmtkZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNhcmQlZC0lcyIsCisJCSBkZXYtPnByaW1hcnktPmluZGV4LCBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCXJldCA9IGRldmljZV9yZWdpc3RlcigmY29ubmVjdG9yLT5rZGV2KTsKKworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgY29ubmVjdG9yIGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFN0YW5kYXJkIGF0dHJpYnV0ZXMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbm5lY3Rvcl9hdHRycyk7IGkrKykgeworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNvbm5lY3Rvci0+a2RldiwgJmNvbm5lY3Rvcl9hdHRyc1tpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXRfZmlsZXM7CisJfQorCisJLyogT3B0aW9uYWwgYXR0cmlidXRlcyAqLworCS8qCisJICogSW4gdGhlIGxvbmcgcnVuIGl0IG1heWJlIGEgZ29vZCBpZGVhIHRvIG1ha2Ugb25lIHNldCBvZgorCSAqIG9wdGlvbmFscyBwZXIgY29ubmVjdG9yIHR5cGUuCisJICovCisJc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7CisJCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUk6CisJCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZToKKwkJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPOgorCQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb25lbnQ6CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb25uZWN0b3JfYXR0cnNfb3B0MSk7IGkrKykgeworCQkJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmY29ubmVjdG9yLT5rZGV2LCAmY29ubmVjdG9yX2F0dHJzX29wdDFbaV0pOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gZXJyX291dF9maWxlczsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZjb25uZWN0b3ItPmtkZXYua29iaiwgJmVkaWRfYXR0cik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X2ZpbGVzOworCisJLyogTGV0IHVzZXJzcGFjZSBrbm93IHdlIGhhdmUgYSBuZXcgY29ubmVjdG9yICovCisJZHJtX3N5c2ZzX2hvdHBsdWdfZXZlbnQoZGV2KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZpbGVzOgorCWlmIChpID4gMCkKKwkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZSgmY29ubmVjdG9yLT5rZGV2LAorCQkJCQkgICAmY29ubmVjdG9yX2F0dHJzW2ldKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmY29ubmVjdG9yLT5rZGV2KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9zeXNmc19jb25uZWN0b3JfYWRkKTsKKworLyoqCisgKiBkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZSAtIHJlbW92ZSBhbiBjb25uZWN0b3IgZGV2aWNlIGZyb20gc3lzZnMKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciB0byByZW1vdmUKKyAqCisgKiBSZW1vdmUgQGNvbm5lY3RvciBhbmQgaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlcyBmcm9tIHN5c2ZzLiAgTm90ZSB0aGF0CisgKiB0aGUgZGV2aWNlIG1vZGVsIGNvcmUgd2lsbCB0YWtlIGNhcmUgb2Ygc2VuZGluZyB0aGUgInJlbW92ZSIgdWV2ZW50CisgKiBhdCB0aGlzIHRpbWUsIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gaXQuCisgKgorICogTm90ZToKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIGNvbm5lY3RvciB3YXMgcHJldmlvdXNseQorICogc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQuICBJZiBAY29ubmVjdG9yIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgeWV0LAorICogeW91J2xsIGxpa2VseSBzZWUgYSBwYW5pYyBzb21ld2hlcmUgZGVlcCBpbiBzeXNmcyBjb2RlIHdoZW4gY2FsbGVkLgorICovCit2b2lkIGRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJaW50IGk7CisKKwlEUk1fREVCVUcoInJlbW92aW5nIFwiJXNcIiBmcm9tIHN5c2ZzXG4iLAorCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb25uZWN0b3JfYXR0cnMpOyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmY29ubmVjdG9yLT5rZGV2LCAmY29ubmVjdG9yX2F0dHJzW2ldKTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmNvbm5lY3Rvci0+a2Rldi5rb2JqLCAmZWRpZF9hdHRyKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmY29ubmVjdG9yLT5rZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUpOworCisvKioKKyAqIGRybV9zeXNmc19ob3RwbHVnX2V2ZW50IC0gZ2VuZXJhdGUgYSBEUk0gdWV2ZW50CisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogU2VuZCBhIHVldmVudCBmb3IgdGhlIERSTSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IEBkZXYuICBDdXJyZW50bHkgd2Ugb25seQorICogc2V0IEhPVFBMVUc9MSBpbiB0aGUgdWV2ZW50IGVudmlyb25tZW50LCBidXQgdGhpcyBjb3VsZCBiZSBleHBhbmRlZCB0bworICogZGVhbCB3aXRoIG90aGVyIHR5cGVzIG9mIGV2ZW50cy4KKyAqLwordm9pZCBkcm1fc3lzZnNfaG90cGx1Z19ldmVudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWNoYXIgKmV2ZW50X3N0cmluZyA9ICJIT1RQTFVHPTEiOworCWNoYXIgKmVudnBbXSA9IHsgZXZlbnRfc3RyaW5nLCBOVUxMIH07CisKKwlEUk1fREVCVUcoImdlbmVyYXRpbmcgaG90cGx1ZyBldmVudFxuIik7CisKKwlrb2JqZWN0X3VldmVudF9lbnYoJmRldi0+cHJpbWFyeS0+a2Rldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7Cit9CisKIC8qKgogICogZHJtX3N5c2ZzX2RldmljZV9hZGQgLSBhZGRzIGEgY2xhc3MgZGV2aWNlIHRvIHN5c2ZzIGZvciBhIGNoYXJhY3RlciBkcml2ZXIKICAqIEBkZXY6IERSTSBkZXZpY2UgdG8gYmUgYWRkZWQKQEAgLTE2Myw3ICs0ODEsMTIgQEAKIAltaW5vci0+a2Rldi5jbGFzcyA9IGRybV9jbGFzczsKIAltaW5vci0+a2Rldi5yZWxlYXNlID0gZHJtX3N5c2ZzX2RldmljZV9yZWxlYXNlOwogCW1pbm9yLT5rZGV2LmRldnQgPSBtaW5vci0+ZGV2aWNlOwotCW1pbm9yX3N0ciA9ICJjYXJkJWQiOworCWlmIChtaW5vci0+dHlwZSA9PSBEUk1fTUlOT1JfQ09OVFJPTCkKKwkJbWlub3Jfc3RyID0gImNvbnRyb2xEJWQiOworICAgICAgICBlbHNlIGlmIChtaW5vci0+dHlwZSA9PSBEUk1fTUlOT1JfUkVOREVSKQorICAgICAgICAgICAgICAgIG1pbm9yX3N0ciA9ICJyZW5kZXJEJWQiOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWlub3Jfc3RyID0gImNhcmQlZCI7CiAKIAlzbnByaW50ZihtaW5vci0+a2Rldi5idXNfaWQsIEJVU19JRF9TSVpFLCBtaW5vcl9zdHIsIG1pbm9yLT5pbmRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYwppbmRleCBjMjM0YzZmLi4zZmZhZTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV92bS5jCkBAIC0yNjcsNiArMjY3LDkgQEAKIAkJCQlkbWFoLnNpemUgPSBtYXAtPnNpemU7CiAJCQkJX19kcm1fcGNpX2ZyZWUoZGV2LCAmZG1haCk7CiAJCQkJYnJlYWs7CisJCQljYXNlIF9EUk1fR0VNOgorCQkJCURSTV9FUlJPUigidHJpZWQgdG8gcm1tYXAgR0VNIG9iamVjdFxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJfQpAQCAtMzk5LDcgKzQwMiw3IEBACiAgKiBDcmVhdGUgYSBuZXcgZHJtX3ZtYV9lbnRyeSBzdHJ1Y3R1cmUgYXMgdGhlIFxwIHZtYSBwcml2YXRlIGRhdGEgZW50cnkgYW5kCiAgKiBhZGQgaXQgdG8gZHJtX2RldmljZTo6dm1hbGlzdC4KICAqLwotc3RhdGljIHZvaWQgZHJtX3ZtX29wZW5fbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQordm9pZCBkcm1fdm1fb3Blbl9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPm1pbm9yLT5kZXY7CkBAIC01NDAsNyArNTQzLDcgQEAKICAqIGFjY29yZGluZyB0byB0aGUgbWFwcGluZyB0eXBlIGFuZCByZW1hcHMgdGhlIHBhZ2VzLiBGaW5hbGx5IHNldHMgdGhlIGZpbGUKICAqIHBvaW50ZXIgYW5kIGNhbGxzIHZtX29wZW4oKS4KICAqLwotc3RhdGljIGludCBkcm1fbW1hcF9sb2NrZWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoraW50IGRybV9tbWFwX2xvY2tlZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5taW5vci0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCBkOGZiNWQ4Li5kZDU3YTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtOCw3ICs4LDIyIEBACiAJICBpOTE1X2dlbS5vIFwKIAkgIGk5MTVfZ2VtX2RlYnVnLm8gXAogCSAgaTkxNV9nZW1fcHJvYy5vIFwKLQkgIGk5MTVfZ2VtX3RpbGluZy5vCisJICBpOTE1X2dlbV90aWxpbmcubyBcCisJICBpbnRlbF9kaXNwbGF5Lm8gXAorCSAgaW50ZWxfY3J0Lm8gXAorCSAgaW50ZWxfbHZkcy5vIFwKKwkgIGludGVsX2Jpb3MubyBcCisJICBpbnRlbF9zZHZvLm8gXAorCSAgaW50ZWxfbW9kZXMubyBcCisJICBpbnRlbF9pMmMubyBcCisJICBpbnRlbF9mYi5vIFwKKwkgIGludGVsX3R2Lm8gXAorCSAgaW50ZWxfZHZvLm8gXAorCSAgZHZvX2NoN3h4eC5vIFwKKwkgIGR2b19jaDcwMTcubyBcCisJICBkdm9faXZjaC5vIFwKKwkgIGR2b190ZnA0MTAubyBcCisJICBkdm9fc2lsMTY0Lm8KIAogaTkxNS0kKENPTkZJR19BQ1BJKQkrPSBpOTE1X29wcmVnaW9uLm8KIGk5MTUtJChDT05GSUdfQ09NUEFUKSAgICs9IGk5MTVfaW9jMzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQ3YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBFcmljIEFuaG9sdAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfSU5URUxfRFZPX0gKKyNkZWZpbmUgX0lOVEVMX0RWT19ICisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX2NydGMuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKworc3RydWN0IGludGVsX2R2b19kZXZpY2UgeworCWNoYXIgKm5hbWU7CisJaW50IHR5cGU7CisJLyogRFZPQS9CL0Mgb3V0cHV0IHJlZ2lzdGVyICovCisJdTMyIGR2b19yZWc7CisJLyogR1BJTyByZWdpc3RlciB1c2VkIGZvciBpMmMgYnVzIHRvIGNvbnRyb2wgdGhpcyBkZXZpY2UgKi8KKwl1MzIgZ3BpbzsKKwlpbnQgc2xhdmVfYWRkcjsKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY19idXM7CisKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZHZvX2Rldl9vcHMgKmRldl9vcHM7CisJdm9pZCAqZGV2X3ByaXY7CisKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKKwlib29sIHBhbmVsX3dhbnRzX2RpdGhlcjsKK307CisKK3N0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyB7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBkZXZpY2UgYXQgc3RhcnR1cCB0aW1lLgorCSAqIFJldHVybnMgTlVMTCBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2wgKCppbml0KShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLAorCQkgICAgIHN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzKTsKKworCS8qCisJICogQ2FsbGVkIHRvIGFsbG93IHRoZSBvdXRwdXQgYSBjaGFuY2UgdG8gY3JlYXRlIHByb3BlcnRpZXMgYWZ0ZXIgdGhlCisJICogUmFuZFIgb2JqZWN0cyBoYXZlIGJlZW4gY3JlYXRlZC4KKwkgKi8KKwl2b2lkICgqY3JlYXRlX3Jlc291cmNlcykoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7CisKKwkvKgorCSAqIFR1cm4gb24vb2ZmIG91dHB1dCBvciBzZXQgaW50ZXJtZWRpYXRlIHBvd2VyIGxldmVscyBpZiBhdmFpbGFibGUuCisJICoKKwkgKiBVbnN1cHBvcnRlZCBpbnRlcm1lZGlhdGUgbW9kZXMgZHJvcCB0byB0aGUgbG93ZXIgcG93ZXIgc2V0dGluZy4KKwkgKiBJZiB0aGUgIG1vZGUgaXMgRFBNU01vZGVPZmYsIHRoZSBvdXRwdXQgbXVzdCBiZSBkaXNhYmxlZCwKKwkgKiBhcyB0aGUgRFBMTCBtYXkgYmUgZGlzYWJsZWQgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwl2b2lkICgqZHBtcykoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IG1vZGUpOworCisJLyoKKwkgKiBTYXZlcyB0aGUgb3V0cHV0J3Mgc3RhdGUgZm9yIHJlc3RvcmF0aW9uIG9uIFZUIHN3aXRjaC4KKwkgKi8KKwl2b2lkICgqc2F2ZSkoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7CisKKwkvKgorCSAqIFJlc3RvcmUncyB0aGUgb3V0cHV0J3Mgc3RhdGUgYXQgVlQgc3dpdGNoLgorCSAqLworCXZvaWQgKCpyZXN0b3JlKShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKTsKKworCS8qCisJICogQ2FsbGJhY2sgZm9yIHRlc3RpbmcgYSB2aWRlbyBtb2RlIGZvciBhIGdpdmVuIG91dHB1dC4KKwkgKgorCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgY2hlY2sgZm9yIGNhc2VzIHdoZXJlIGEgbW9kZSBjYW4ndAorCSAqIGJlIHN1cHBvcnRlZCBvbiB0aGUgb3V0cHV0IHNwZWNpZmljYWxseSwgYW5kIG5vdCByZXByZXNlbnQKKwkgKiBnZW5lcmljIENSVEMgbGltaXRhdGlvbnMuCisJICoKKwkgKiBccmV0dXJuIE1PREVfT0sgaWYgdGhlIG1vZGUgaXMgdmFsaWQsIG9yIGFub3RoZXIgTU9ERV8qIG90aGVyd2lzZS4KKwkgKi8KKwlpbnQgKCptb2RlX3ZhbGlkKShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CisKKwkvKgorCSAqIENhbGxiYWNrIHRvIGFkanVzdCB0aGUgbW9kZSB0byBiZSBzZXQgaW4gdGhlIENSVEMuCisJICoKKwkgKiBUaGlzIGFsbG93cyBhbiBvdXRwdXQgdG8gYWRqdXN0IHRoZSBjbG9jayBvciBldmVuIHRoZSBlbnRpcmUgc2V0IG9mCisJICogdGltaW5ncywgd2hpY2ggaXMgdXNlZCBmb3IgcGFuZWxzIHdpdGggZml4ZWQgdGltaW5ncyBvciBmb3IKKwkgKiBidXNlcyB3aXRoIGNsb2NrIGxpbWl0YXRpb25zLgorCSAqLworCWJvb2wgKCptb2RlX2ZpeHVwKShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLAorCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSk7CisKKwkvKgorCSAqIENhbGxiYWNrIGZvciBwcmVwYXJpbmcgbW9kZSBjaGFuZ2VzIG9uIGFuIG91dHB1dAorCSAqLworCXZvaWQgKCpwcmVwYXJlKShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKTsKKworCS8qCisJICogQ2FsbGJhY2sgZm9yIGNvbW1pdHRpbmcgbW9kZSBjaGFuZ2VzIG9uIGFuIG91dHB1dAorCSAqLworCXZvaWQgKCpjb21taXQpKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pOworCisJLyoKKwkgKiBDYWxsYmFjayBmb3Igc2V0dGluZyB1cCBhIHZpZGVvIG1vZGUgYWZ0ZXIgZml4dXBzIGhhdmUgYmVlbiBtYWRlLgorCSAqCisJICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGlsZSB0aGUgb3V0cHV0IGlzIGRpc2FibGVkLiAgVGhlIGRwbXMgY2FsbGJhY2sKKwkgKiBtdXN0IGJlIGFsbCB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgb3V0cHV0LCB0byB0dXJuIHRoZSBvdXRwdXQgb24KKwkgKiBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKwkgKi8KKwl2b2lkICgqbW9kZV9zZXQpKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOworCisJLyoKKwkgKiBQcm9iZSBmb3IgYSBjb25uZWN0ZWQgb3V0cHV0LCBhbmQgcmV0dXJuIGRldGVjdF9zdGF0dXMuCisJICovCisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyAoKmRldGVjdCkoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7CisKKwkvKioKKwkgKiBRdWVyeSB0aGUgZGV2aWNlIGZvciB0aGUgbW9kZXMgaXQgcHJvdmlkZXMuCisJICoKKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvIHVwZGF0ZSBNb25JbmZvLCBtbV93aWR0aCwgYW5kIG1tX2hlaWdodC4KKwkgKgorCSAqIFxyZXR1cm4gc2luZ2x5LWxpbmtlZCBsaXN0IG9mIG1vZGVzIG9yIE5VTEwgaWYgbm8gbW9kZXMgZm91bmQuCisJICovCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKigqZ2V0X21vZGVzKShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKTsKKworCS8qKgorCSAqIENsZWFuIHVwIGRyaXZlci1zcGVjaWZpYyBiaXRzIG9mIHRoZSBvdXRwdXQKKwkgKi8KKwl2b2lkICgqZGVzdHJveSkgKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pOworCisJLyoqCisJICogRGVidWdnaW5nIGhvb2sgdG8gZHVtcCBkZXZpY2UgcmVnaXN0ZXJzIHRvIGxvZyBmaWxlCisJICovCisJdm9pZCAoKmR1bXBfcmVncykoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7Cit9OworCitleHRlcm4gc3RydWN0IGludGVsX2R2b19kZXZfb3BzIHNpbDE2NF9vcHM7CitleHRlcm4gc3RydWN0IGludGVsX2R2b19kZXZfb3BzIGNoN3h4eF9vcHM7CitleHRlcm4gc3RydWN0IGludGVsX2R2b19kZXZfb3BzIGl2Y2hfb3BzOworZXh0ZXJuIHN0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyB0ZnA0MTBfb3BzOworZXh0ZXJuIHN0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyBjaDcwMTdfb3BzOworCisjZW5kaWYgLyogX0lOVEVMX0RWT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkNGI0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaW5jbHVkZSAiZHZvLmgiCisKKyNkZWZpbmUgQ0g3MDE3X1RWX0RJU1BMQVlfTU9ERQkJMHgwMAorI2RlZmluZSBDSDcwMTdfRkxJQ0tFUl9GSUxURVIJCTB4MDEKKyNkZWZpbmUgQ0g3MDE3X1ZJREVPX0JBTkRXSURUSAkJMHgwMgorI2RlZmluZSBDSDcwMTdfVEVYVF9FTkhBTkNFTUVOVAkJMHgwMworI2RlZmluZSBDSDcwMTdfU1RBUlRfQUNUSVZFX1ZJREVPCTB4MDQKKyNkZWZpbmUgQ0g3MDE3X0hPUklaT05UQUxfUE9TSVRJT04JMHgwNQorI2RlZmluZSBDSDcwMTdfVkVSVElDQUxfUE9TSVRJT04JMHgwNgorI2RlZmluZSBDSDcwMTdfQkxBQ0tfTEVWRUwJCTB4MDcKKyNkZWZpbmUgQ0g3MDE3X0NPTlRSQVNUX0VOSEFOQ0VNRU5UCTB4MDgKKyNkZWZpbmUgQ0g3MDE3X1RWX1BMTAkJCTB4MDkKKyNkZWZpbmUgQ0g3MDE3X1RWX1BMTF9NCQkJMHgwYQorI2RlZmluZSBDSDcwMTdfVFZfUExMX04JCQkweDBiCisjZGVmaW5lIENINzAxN19TVUJfQ0FSUklFUl8wCQkweDBjCisjZGVmaW5lIENINzAxN19DSVZfQ09OVFJPTAkJMHgxMAorI2RlZmluZSBDSDcwMTdfQ0lWXzAJCQkweDExCisjZGVmaW5lIENINzAxN19DSFJPTUFfQk9PU1QJCTB4MTQKKyNkZWZpbmUgQ0g3MDE3X0NMT0NLX01PREUJCTB4MWMKKyNkZWZpbmUgQ0g3MDE3X0lOUFVUX0NMT0NLCQkweDFkCisjZGVmaW5lIENINzAxN19HUElPX0NPTlRST0wJCTB4MWUKKyNkZWZpbmUgQ0g3MDE3X0lOUFVUX0RBVEFfRk9STUFUCTB4MWYKKyNkZWZpbmUgQ0g3MDE3X0NPTk5FQ1RJT05fREVURUNUCTB4MjAKKyNkZWZpbmUgQ0g3MDE3X0RBQ19DT05UUk9MCQkweDIxCisjZGVmaW5lIENINzAxN19CVUZGRVJFRF9DTE9DS19PVVRQVVQJMHgyMgorI2RlZmluZSBDSDcwMTdfREVGRUFUX1ZTWU5DCQkweDQ3CisjZGVmaW5lIENINzAxN19URVNUX1BBVFRFUk4JCTB4NDgKKworI2RlZmluZSBDSDcwMTdfUE9XRVJfTUFOQUdFTUVOVAkJMHg0OQorLyoqIEVuYWJsZXMgdGhlIFRWIG91dHB1dCBwYXRoLiAqLworI2RlZmluZSBDSDcwMTdfVFZfRU4JCQkoMSA8PCAwKQorI2RlZmluZSBDSDcwMTdfREFDMF9QT1dFUl9ET1dOCQkoMSA8PCAxKQorI2RlZmluZSBDSDcwMTdfREFDMV9QT1dFUl9ET1dOCQkoMSA8PCAyKQorI2RlZmluZSBDSDcwMTdfREFDMl9QT1dFUl9ET1dOCQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMTdfREFDM19QT1dFUl9ET1dOCQkoMSA8PCA0KQorLyoqIFBvd2VycyBkb3duIHRoZSBUViBvdXQgYmxvY2ssIGFuZCBEQUMwLTMgKi8KKyNkZWZpbmUgQ0g3MDE3X1RWX1BPV0VSX0RPV05fRU4JCSgxIDw8IDUpCisKKyNkZWZpbmUgQ0g3MDE3X1ZFUlNJT05fSUQJCTB4NGEKKworI2RlZmluZSBDSDcwMTdfREVWSUNFX0lECQkweDRiCisjZGVmaW5lIENINzAxN19ERVZJQ0VfSURfVkFMVUUJCTB4MWIKKyNkZWZpbmUgQ0g3MDE4X0RFVklDRV9JRF9WQUxVRQkJMHgxYQorI2RlZmluZSBDSDcwMTlfREVWSUNFX0lEX1ZBTFVFCQkweDE5CisKKyNkZWZpbmUgQ0g3MDE3X1hDTEtfRDJfQURKVVNUCQkweDUzCisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfQ09FRkZfMAkweDU1CisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfQ09FRkZfMQkweDU2CisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfQ09FRkZfMgkweDU3CisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfQ09FRkZfMwkweDU4CisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfQ09FRkZfNAkweDU5CisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfVkVSVElDQUxfSU5DXzAJMHg1YQorI2RlZmluZSBDSDcwMTdfVVBfU0NBTEVSX1ZFUlRJQ0FMX0lOQ18xCTB4NWIKKyNkZWZpbmUgQ0g3MDE3X0dQSU9fSU5WRVJUCQkweDVjCisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfSE9SSVpPTlRBTF9JTkNfMAkweDVkCisjZGVmaW5lIENINzAxN19VUF9TQ0FMRVJfSE9SSVpPTlRBTF9JTkNfMQkweDVlCisKKyNkZWZpbmUgQ0g3MDE3X0hPUklaT05UQUxfQUNUSVZFX1BJWEVMX0lOUFVUCTB4NWYKKy8qKjwgTG93IGJpdHMgb2YgaG9yaXpvbnRhbCBhY3RpdmUgcGl4ZWwgaW5wdXQgKi8KKworI2RlZmluZSBDSDcwMTdfQUNUSVZFX0lOUFVUX0xJTkVfT1VUUFVUCTB4NjAKKy8qKiBIaWdoIGJpdHMgb2YgaG9yaXpvbnRhbCBhY3RpdmUgcGl4ZWwgaW5wdXQgKi8KKyNkZWZpbmUgQ0g3MDE3X0xWRFNfSEFQX0lOUFVUX01BU0sJKDB4NyA8PCAwKQorLyoqIEhpZ2ggYml0cyBvZiB2ZXJ0aWNhbCBhY3RpdmUgbGluZSBvdXRwdXQgKi8KKyNkZWZpbmUgQ0g3MDE3X0xWRFNfVkFMX0hJR0hfTUFTSwkoMHg3IDw8IDMpCisKKyNkZWZpbmUgQ0g3MDE3X1ZFUlRJQ0FMX0FDVElWRV9MSU5FX09VVFBVVAkweDYxCisvKio8IExvdyBiaXRzIG9mIHZlcnRpY2FsIGFjdGl2ZSBsaW5lIG91dHB1dCAqLworCisjZGVmaW5lIENINzAxN19IT1JJWk9OVEFMX0FDVElWRV9QSVhFTF9PVVRQVVQJMHg2MgorLyoqPCBMb3cgYml0cyBvZiBob3Jpem9udGFsIGFjdGl2ZSBwaXhlbCBvdXRwdXQgKi8KKworI2RlZmluZSBDSDcwMTdfTFZEU19QT1dFUl9ET1dOCQkweDYzCisvKiogSGlnaCBiaXRzIG9mIGhvcml6b250YWwgYWN0aXZlIHBpeGVsIG91dHB1dCAqLworI2RlZmluZSBDSDcwMTdfTFZEU19IQVBfSElHSF9NQVNLCSgweDcgPDwgMCkKKy8qKiBFbmFibGVzIHRoZSBMVkRTIHBvd2VyIGRvd24gc3RhdGUgdHJhbnNpdGlvbiAqLworI2RlZmluZSBDSDcwMTdfTFZEU19QT1dFUl9ET1dOX0VOCSgxIDw8IDYpCisvKiogRW5hYmxlcyB0aGUgTFZEUyB1cHNjYWxlciAqLworI2RlZmluZSBDSDcwMTdfTFZEU19VUFNDQUxFUl9FTgkJKDEgPDwgNykKKyNkZWZpbmUgQ0g3MDE3X0xWRFNfUE9XRVJfRE9XTl9ERUZBVUxUX1JFU0VSVkVEIDB4MDgKKworI2RlZmluZSBDSDcwMTdfTFZEU19FTkNPRElORwkJMHg2NAorI2RlZmluZSBDSDcwMTdfTFZEU19ESVRIRVJfMkQJCSgxIDw8IDIpCisjZGVmaW5lIENINzAxN19MVkRTX0RJVEhFUl9ESVMJCSgxIDw8IDMpCisjZGVmaW5lIENINzAxN19MVkRTX0RVQUxfQ0hBTk5FTF9FTgkoMSA8PCA0KQorI2RlZmluZSBDSDcwMTdfTFZEU18yNF9CSVQJCSgxIDw8IDUpCisKKyNkZWZpbmUgQ0g3MDE3X0xWRFNfRU5DT0RJTkdfMgkJMHg2NQorCisjZGVmaW5lIENINzAxN19MVkRTX1BMTF9DT05UUk9MCQkweDY2CisvKiogRW5hYmxlcyB0aGUgTFZEUyBwYW5lbCBvdXRwdXQgcGF0aCAqLworI2RlZmluZSBDSDcwMTdfTFZEU19QQU5FTgkJKDEgPDwgMCkKKy8qKiBFbmFibGVzIHRoZSBMVkRTIHBhbmVsIGJhY2tsaWdodCAqLworI2RlZmluZSBDSDcwMTdfTFZEU19CS0xFTgkJKDEgPDwgMykKKworI2RlZmluZSBDSDcwMTdfUE9XRVJfU0VRVUVOQ0lOR19UMQkweDY3CisjZGVmaW5lIENINzAxN19QT1dFUl9TRVFVRU5DSU5HX1QyCTB4NjgKKyNkZWZpbmUgQ0g3MDE3X1BPV0VSX1NFUVVFTkNJTkdfVDMJMHg2OQorI2RlZmluZSBDSDcwMTdfUE9XRVJfU0VRVUVOQ0lOR19UNAkweDZhCisjZGVmaW5lIENINzAxN19QT1dFUl9TRVFVRU5DSU5HX1Q1CTB4NmIKKyNkZWZpbmUgQ0g3MDE3X0dQSU9fRFJJVkVSX1RZUEUJCTB4NmMKKyNkZWZpbmUgQ0g3MDE3X0dQSU9fREFUQQkJMHg2ZAorI2RlZmluZSBDSDcwMTdfR1BJT19ESVJFQ1RJT05fQ09OVFJPTAkweDZlCisKKyNkZWZpbmUgQ0g3MDE3X0xWRFNfUExMX0ZFRURCQUNLX0RJVgkweDcxCisjIGRlZmluZSBDSDcwMTdfTFZEU19QTExfRkVFRF9CQUNLX0RJVklERVJfU0hJRlQgNAorIyBkZWZpbmUgQ0g3MDE3X0xWRFNfUExMX0ZFRURfRk9SV0FSRF9ESVZJREVSX1NISUZUIDAKKyMgZGVmaW5lIENINzAxN19MVkRTX1BMTF9GRUVEQkFDS19ERUZBVUxUX1JFU0VSVkVEIDB4ODAKKworI2RlZmluZSBDSDcwMTdfTFZEU19QTExfVkNPX0NPTlRST0wJMHg3MgorIyBkZWZpbmUgQ0g3MDE3X0xWRFNfUExMX1ZDT19ERUZBVUxUX1JFU0VSVkVEIDB4ODAKKyMgZGVmaW5lIENINzAxN19MVkRTX1BMTF9WQ09fU0hJRlQJNAorIyBkZWZpbmUgQ0g3MDE3X0xWRFNfUExMX1BPU1RfU0NBTEVfRElWX1NISUZUIDAKKworI2RlZmluZSBDSDcwMTdfT1VUUFVUU19FTkFCTEUJCTB4NzMKKyMgZGVmaW5lIENINzAxN19DSEFSR0VfUFVNUF9MT1cJCTB4MAorIyBkZWZpbmUgQ0g3MDE3X0NIQVJHRV9QVU1QX0hJR0gJMHgzCisjIGRlZmluZSBDSDcwMTdfTFZEU19DSEFOTkVMX0EJCSgxIDw8IDMpCisjIGRlZmluZSBDSDcwMTdfTFZEU19DSEFOTkVMX0IJCSgxIDw8IDQpCisjIGRlZmluZSBDSDcwMTdfVFZfREFDX0EJCSgxIDw8IDUpCisjIGRlZmluZSBDSDcwMTdfVFZfREFDX0IJCSgxIDw8IDYpCisjIGRlZmluZSBDSDcwMTdfRERDX1NFTEVDVF9EQzIJCSgxIDw8IDcpCisKKyNkZWZpbmUgQ0g3MDE3X0xWRFNfT1VUUFVUX0FNUExJVFVERQkweDc0CisjZGVmaW5lIENINzAxN19MVkRTX1BMTF9FTUlfUkVEVUNUSU9OCTB4NzUKKyNkZWZpbmUgQ0g3MDE3X0xWRFNfUE9XRVJfRE9XTl9GTElDS0VSCTB4NzYKKworI2RlZmluZSBDSDcwMTdfTFZEU19DT05UUk9MXzIJCTB4NzgKKyMgZGVmaW5lIENINzAxN19MT09QX0ZJTFRFUl9TSElGVAk1CisjIGRlZmluZSBDSDcwMTdfUEhBU0VfREVURUNUT1JfU0hJRlQJMAorCisjZGVmaW5lIENINzAxN19CQU5HX0xJTUlUX0NPTlRST0wJMHg3ZgorCitzdHJ1Y3QgY2g3MDE3X3ByaXYgeworCXVpbnQ4X3Qgc2F2ZV9oYXBpOworCXVpbnQ4X3Qgc2F2ZV92YWxpOworCXVpbnQ4X3Qgc2F2ZV92YWxvOworCXVpbnQ4X3Qgc2F2ZV9haWxvOworCXVpbnQ4X3Qgc2F2ZV9sdmRzX3BsbF92Y287CisJdWludDhfdCBzYXZlX2ZlZWRiYWNrX2RpdjsKKwl1aW50OF90IHNhdmVfbHZkc19jb250cm9sXzI7CisJdWludDhfdCBzYXZlX291dHB1dHNfZW5hYmxlOworCXVpbnQ4X3Qgc2F2ZV9sdmRzX3Bvd2VyX2Rvd247CisJdWludDhfdCBzYXZlX3Bvd2VyX21hbmFnZW1lbnQ7Cit9OworCitzdGF0aWMgdm9pZCBjaDcwMTdfZHVtcF9yZWdzKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pOworc3RhdGljIHZvaWQgY2g3MDE3X2RwbXMoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IG1vZGUpOworCitzdGF0aWMgYm9vbCBjaDcwMTdfcmVhZChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkciwgdWludDhfdCAqdmFsKQoreworCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzID0gZHZvLT5pMmNfYnVzOworCXU4IG91dF9idWZbMl07CisJdTggaW5fYnVmWzJdOworCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBvdXRfYnVmLAorCQl9LAorCQl7CisJCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gaW5fYnVmLAorCQl9CisJfTsKKworCW91dF9idWZbMF0gPSBhZGRyOworCW91dF9idWZbMV0gPSAwOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjYnVzLT5hZGFwdGVyLCBtc2dzLCAyKSA9PSAyKSB7CisJCSp2YWw9IGluX2J1ZlswXTsKKwkJcmV0dXJuIHRydWU7CisJfTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2g3MDE3X3dyaXRlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBhZGRyLCB1aW50OF90IHZhbCkKK3sKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY2J1cyA9IGR2by0+aTJjX2J1czsKKwl1aW50OF90IG91dF9idWZbMl07CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJLmZsYWdzID0gMCwKKwkJLmxlbiA9IDIsCisJCS5idWYgPSBvdXRfYnVmLAorCX07CisKKwlvdXRfYnVmWzBdID0gYWRkcjsKKwlvdXRfYnVmWzFdID0gdmFsOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjYnVzLT5hZGFwdGVyLCAmbXNnLCAxKSA9PSAxKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqIFByb2JlcyBmb3IgYSBDSDcwMTcgb24gdGhlIGdpdmVuIGJ1cyBhbmQgc2xhdmUgYWRkcmVzcy4gKi8KK3N0YXRpYyBib29sIGNoNzAxN19pbml0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY2J1cykKK3sKKwlzdHJ1Y3QgY2g3MDE3X3ByaXYgKnByaXY7CisJdWludDhfdCB2YWw7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoNzAxN19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJZHZvLT5pMmNfYnVzID0gaTJjYnVzOworCWR2by0+aTJjX2J1cy0+c2xhdmVfYWRkciA9IGR2by0+c2xhdmVfYWRkcjsKKwlkdm8tPmRldl9wcml2ID0gcHJpdjsKKworCWlmICghY2g3MDE3X3JlYWQoZHZvLCBDSDcwMTdfREVWSUNFX0lELCAmdmFsKSkKKwkJZ290byBmYWlsOworCisJaWYgKHZhbCAhPSBDSDcwMTdfREVWSUNFX0lEX1ZBTFVFICYmCisJICAgIHZhbCAhPSBDSDcwMThfREVWSUNFX0lEX1ZBTFVFICYmCisJICAgIHZhbCAhPSBDSDcwMTlfREVWSUNFX0lEX1ZBTFVFKSB7CisJCURSTV9ERUJVRygiY2g3MDF4IG5vdCBkZXRlY3RlZCwgZ290ICVkOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJCSAgdmFsLCBpMmNidXMtPmFkYXB0ZXIubmFtZSxpMmNidXMtPnNsYXZlX2FkZHIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7CitmYWlsOgorCWtmcmVlKHByaXYpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY2g3MDE3X2RldGVjdChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247Cit9CisKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cyBjaDcwMTdfbW9kZV92YWxpZChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLAorCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpZiAobW9kZS0+Y2xvY2sgPiAxNjAwMDApCisJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CisKKwlyZXR1cm4gTU9ERV9PSzsKK30KKworc3RhdGljIHZvaWQgY2g3MDE3X21vZGVfc2V0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJdWludDhfdCBsdmRzX3BsbF9mZWVkYmFja19kaXYsIGx2ZHNfcGxsX3Zjb19jb250cm9sOworCXVpbnQ4X3Qgb3V0cHV0c19lbmFibGUsIGx2ZHNfY29udHJvbF8yLCBsdmRzX3Bvd2VyX2Rvd247CisJdWludDhfdCBob3Jpem9udGFsX2FjdGl2ZV9waXhlbF9pbnB1dDsKKwl1aW50OF90IGhvcml6b250YWxfYWN0aXZlX3BpeGVsX291dHB1dCwgdmVydGljYWxfYWN0aXZlX2xpbmVfb3V0cHV0OworCXVpbnQ4X3QgYWN0aXZlX2lucHV0X2xpbmVfb3V0cHV0OworCisJRFJNX0RFQlVHKCJSZWdpc3RlcnMgYmVmb3JlIG1vZGUgc2V0dGluZ1xuIik7CisJY2g3MDE3X2R1bXBfcmVncyhkdm8pOworCisJLyogTFZEUyBQTEwgc2V0dGluZ3MgZnJvbSBwYWdlIDc1IG9mIDcwMTctNzAxN2RzLnBkZiovCisJaWYgKG1vZGUtPmNsb2NrIDwgMTAwMDAwKSB7CisJCW91dHB1dHNfZW5hYmxlID0gQ0g3MDE3X0xWRFNfQ0hBTk5FTF9BIHwgQ0g3MDE3X0NIQVJHRV9QVU1QX0xPVzsKKwkJbHZkc19wbGxfZmVlZGJhY2tfZGl2ID0gQ0g3MDE3X0xWRFNfUExMX0ZFRURCQUNLX0RFRkFVTFRfUkVTRVJWRUQgfAorCQkJKDIgPDwgQ0g3MDE3X0xWRFNfUExMX0ZFRURfQkFDS19ESVZJREVSX1NISUZUKSB8CisJCQkoMTMgPDwgQ0g3MDE3X0xWRFNfUExMX0ZFRURfRk9SV0FSRF9ESVZJREVSX1NISUZUKTsKKwkJbHZkc19wbGxfdmNvX2NvbnRyb2wgPSBDSDcwMTdfTFZEU19QTExfVkNPX0RFRkFVTFRfUkVTRVJWRUQgfAorCQkJKDIgPDwgQ0g3MDE3X0xWRFNfUExMX1ZDT19TSElGVCkgfAorCQkJKDMgPDwgQ0g3MDE3X0xWRFNfUExMX1BPU1RfU0NBTEVfRElWX1NISUZUKTsKKwkJbHZkc19jb250cm9sXzIgPSAoMSA8PCBDSDcwMTdfTE9PUF9GSUxURVJfU0hJRlQpIHwKKwkJCSgwIDw8IENINzAxN19QSEFTRV9ERVRFQ1RPUl9TSElGVCk7CisJfSBlbHNlIHsKKwkJb3V0cHV0c19lbmFibGUgPSBDSDcwMTdfTFZEU19DSEFOTkVMX0EgfCBDSDcwMTdfQ0hBUkdFX1BVTVBfSElHSDsKKwkJbHZkc19wbGxfZmVlZGJhY2tfZGl2ID0gQ0g3MDE3X0xWRFNfUExMX0ZFRURCQUNLX0RFRkFVTFRfUkVTRVJWRUQgfAorCQkJKDIgPDwgQ0g3MDE3X0xWRFNfUExMX0ZFRURfQkFDS19ESVZJREVSX1NISUZUKSB8CisJCQkoMyA8PCBDSDcwMTdfTFZEU19QTExfRkVFRF9GT1JXQVJEX0RJVklERVJfU0hJRlQpOworCQlsdmRzX3BsbF9mZWVkYmFja19kaXYgPSAzNTsKKwkJbHZkc19jb250cm9sXzIgPSAoMyA8PCBDSDcwMTdfTE9PUF9GSUxURVJfU0hJRlQpIHwKKwkJCSgwIDw8IENINzAxN19QSEFTRV9ERVRFQ1RPUl9TSElGVCk7CisJCWlmICgxKSB7IC8qIFhYWDogZHVhbCBjaGFubmVsIHBhbmVsIGRldGVjdGlvbi4gIEFzc3VtZSB5ZXMgZm9yIG5vdy4gKi8KKwkJCW91dHB1dHNfZW5hYmxlIHw9IENINzAxN19MVkRTX0NIQU5ORUxfQjsKKwkJCWx2ZHNfcGxsX3Zjb19jb250cm9sID0gQ0g3MDE3X0xWRFNfUExMX1ZDT19ERUZBVUxUX1JFU0VSVkVEIHwKKwkJCQkoMiA8PCBDSDcwMTdfTFZEU19QTExfVkNPX1NISUZUKSB8CisJCQkJKDEzIDw8IENINzAxN19MVkRTX1BMTF9QT1NUX1NDQUxFX0RJVl9TSElGVCk7CisJCX0gZWxzZSB7CisJCQlsdmRzX3BsbF92Y29fY29udHJvbCA9IENINzAxN19MVkRTX1BMTF9WQ09fREVGQVVMVF9SRVNFUlZFRCB8CisJCQkJKDEgPDwgQ0g3MDE3X0xWRFNfUExMX1ZDT19TSElGVCkgfAorCQkJCSgxMyA8PCBDSDcwMTdfTFZEU19QTExfUE9TVF9TQ0FMRV9ESVZfU0hJRlQpOworCQl9CisJfQorCisJaG9yaXpvbnRhbF9hY3RpdmVfcGl4ZWxfaW5wdXQgPSBtb2RlLT5oZGlzcGxheSAmIDB4MDBmZjsKKworCXZlcnRpY2FsX2FjdGl2ZV9saW5lX291dHB1dCA9IG1vZGUtPnZkaXNwbGF5ICYgMHgwMGZmOworCWhvcml6b250YWxfYWN0aXZlX3BpeGVsX291dHB1dCA9IG1vZGUtPmhkaXNwbGF5ICYgMHgwMGZmOworCisJYWN0aXZlX2lucHV0X2xpbmVfb3V0cHV0ID0gKChtb2RlLT5oZGlzcGxheSAmIDB4MDcwMCkgPj4gOCkgfAorCQkJCSAgICgoKG1vZGUtPnZkaXNwbGF5ICYgMHgwNzAwKSA+PiA4KSA8PCAzKTsKKworCWx2ZHNfcG93ZXJfZG93biA9IENINzAxN19MVkRTX1BPV0VSX0RPV05fREVGQVVMVF9SRVNFUlZFRCB8CisJCQkgIChtb2RlLT5oZGlzcGxheSAmIDB4MDcwMCkgPj4gODsKKworCWNoNzAxN19kcG1zKGR2bywgRFJNX01PREVfRFBNU19PRkYpOworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19IT1JJWk9OVEFMX0FDVElWRV9QSVhFTF9JTlBVVCwKKwkJCWhvcml6b250YWxfYWN0aXZlX3BpeGVsX2lucHV0KTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfSE9SSVpPTlRBTF9BQ1RJVkVfUElYRUxfT1VUUFVULAorCQkJaG9yaXpvbnRhbF9hY3RpdmVfcGl4ZWxfb3V0cHV0KTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfVkVSVElDQUxfQUNUSVZFX0xJTkVfT1VUUFVULAorCQkJdmVydGljYWxfYWN0aXZlX2xpbmVfb3V0cHV0KTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfQUNUSVZFX0lOUFVUX0xJTkVfT1VUUFVULAorCQkJYWN0aXZlX2lucHV0X2xpbmVfb3V0cHV0KTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfTFZEU19QTExfVkNPX0NPTlRST0wsIGx2ZHNfcGxsX3Zjb19jb250cm9sKTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfTFZEU19QTExfRkVFREJBQ0tfRElWLCBsdmRzX3BsbF9mZWVkYmFja19kaXYpOworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19MVkRTX0NPTlRST0xfMiwgbHZkc19jb250cm9sXzIpOworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19PVVRQVVRTX0VOQUJMRSwgb3V0cHV0c19lbmFibGUpOworCisJLyogVHVybiB0aGUgTFZEUyBiYWNrIG9uIHdpdGggbmV3IHNldHRpbmdzLiAqLworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19MVkRTX1BPV0VSX0RPV04sIGx2ZHNfcG93ZXJfZG93bik7CisKKwlEUk1fREVCVUcoIlJlZ2lzdGVycyBhZnRlciBtb2RlIHNldHRpbmdcbiIpOworCWNoNzAxN19kdW1wX3JlZ3MoZHZvKTsKK30KKworLyogc2V0IHRoZSBDSDcwMTcgcG93ZXIgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGNoNzAxN19kcG1zKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBtb2RlKQoreworCXVpbnQ4X3QgdmFsOworCisJY2g3MDE3X3JlYWQoZHZvLCBDSDcwMTdfTFZEU19QT1dFUl9ET1dOLCAmdmFsKTsKKworCS8qIFR1cm4gb2ZmIFRWL1ZHQSwgYW5kIG5ldmVyIHR1cm4gaXQgb24gc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBpdC4gKi8KKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfUE9XRVJfTUFOQUdFTUVOVCwKKwkJCUNINzAxN19EQUMwX1BPV0VSX0RPV04gfAorCQkJQ0g3MDE3X0RBQzFfUE9XRVJfRE9XTiB8CisJCQlDSDcwMTdfREFDMl9QT1dFUl9ET1dOIHwKKwkJCUNINzAxN19EQUMzX1BPV0VSX0RPV04gfAorCQkJQ0g3MDE3X1RWX1BPV0VSX0RPV05fRU4pOworCisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgeworCQkvKiBUdXJuIG9uIHRoZSBMVkRTICovCisJCWNoNzAxN193cml0ZShkdm8sIENINzAxN19MVkRTX1BPV0VSX0RPV04sCisJCQkgICAgIHZhbCAmIH5DSDcwMTdfTFZEU19QT1dFUl9ET1dOX0VOKTsKKwl9IGVsc2UgeworCQkvKiBUdXJuIG9mZiB0aGUgTFZEUyAqLworCQljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfTFZEU19QT1dFUl9ET1dOLAorCQkJICAgICB2YWwgfCBDSDcwMTdfTFZEU19QT1dFUl9ET1dOX0VOKTsKKwl9CisKKwkvKiBYWFg6IFNob3VsZCBhY3R1YWxseSB3YWl0IGZvciB1cGRhdGUgcG93ZXIgc3RhdHVzIHNvbWVob3cgKi8KKwl1ZGVsYXkoMjAwMDApOworfQorCitzdGF0aWMgdm9pZCBjaDcwMTdfZHVtcF9yZWdzKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJdWludDhfdCB2YWw7CisKKyNkZWZpbmUgRFVNUChyZWcpCQkJCQlcCitkbyB7CQkJCQkJCVwKKwljaDcwMTdfcmVhZChkdm8sIHJlZywgJnZhbCk7CQkJXAorCURSTV9ERUJVRygjcmVnICI6ICUwMnhcbiIsIHZhbCk7CQlcCit9IHdoaWxlICgwKQorCisJRFVNUChDSDcwMTdfSE9SSVpPTlRBTF9BQ1RJVkVfUElYRUxfSU5QVVQpOworCURVTVAoQ0g3MDE3X0hPUklaT05UQUxfQUNUSVZFX1BJWEVMX09VVFBVVCk7CisJRFVNUChDSDcwMTdfVkVSVElDQUxfQUNUSVZFX0xJTkVfT1VUUFVUKTsKKwlEVU1QKENINzAxN19BQ1RJVkVfSU5QVVRfTElORV9PVVRQVVQpOworCURVTVAoQ0g3MDE3X0xWRFNfUExMX1ZDT19DT05UUk9MKTsKKwlEVU1QKENINzAxN19MVkRTX1BMTF9GRUVEQkFDS19ESVYpOworCURVTVAoQ0g3MDE3X0xWRFNfQ09OVFJPTF8yKTsKKwlEVU1QKENINzAxN19PVVRQVVRTX0VOQUJMRSk7CisJRFVNUChDSDcwMTdfTFZEU19QT1dFUl9ET1dOKTsKK30KKworc3RhdGljIHZvaWQgY2g3MDE3X3NhdmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3QgY2g3MDE3X3ByaXYgKnByaXYgPSBkdm8tPmRldl9wcml2OworCisJY2g3MDE3X3JlYWQoZHZvLCBDSDcwMTdfSE9SSVpPTlRBTF9BQ1RJVkVfUElYRUxfSU5QVVQsICZwcml2LT5zYXZlX2hhcGkpOworCWNoNzAxN19yZWFkKGR2bywgQ0g3MDE3X1ZFUlRJQ0FMX0FDVElWRV9MSU5FX09VVFBVVCwgJnByaXYtPnNhdmVfdmFsbyk7CisJY2g3MDE3X3JlYWQoZHZvLCBDSDcwMTdfQUNUSVZFX0lOUFVUX0xJTkVfT1VUUFVULCAmcHJpdi0+c2F2ZV9haWxvKTsKKwljaDcwMTdfcmVhZChkdm8sIENINzAxN19MVkRTX1BMTF9WQ09fQ09OVFJPTCwgJnByaXYtPnNhdmVfbHZkc19wbGxfdmNvKTsKKwljaDcwMTdfcmVhZChkdm8sIENINzAxN19MVkRTX1BMTF9GRUVEQkFDS19ESVYsICZwcml2LT5zYXZlX2ZlZWRiYWNrX2Rpdik7CisJY2g3MDE3X3JlYWQoZHZvLCBDSDcwMTdfTFZEU19DT05UUk9MXzIsICZwcml2LT5zYXZlX2x2ZHNfY29udHJvbF8yKTsKKwljaDcwMTdfcmVhZChkdm8sIENINzAxN19PVVRQVVRTX0VOQUJMRSwgJnByaXYtPnNhdmVfb3V0cHV0c19lbmFibGUpOworCWNoNzAxN19yZWFkKGR2bywgQ0g3MDE3X0xWRFNfUE9XRVJfRE9XTiwgJnByaXYtPnNhdmVfbHZkc19wb3dlcl9kb3duKTsKKwljaDcwMTdfcmVhZChkdm8sIENINzAxN19QT1dFUl9NQU5BR0VNRU5ULCAmcHJpdi0+c2F2ZV9wb3dlcl9tYW5hZ2VtZW50KTsKK30KKworc3RhdGljIHZvaWQgY2g3MDE3X3Jlc3RvcmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3QgY2g3MDE3X3ByaXYgKnByaXYgPSBkdm8tPmRldl9wcml2OworCisJLyogUG93ZXIgZG93biBiZWZvcmUgY2hhbmdpbmcgbW9kZSAqLworCWNoNzAxN19kcG1zKGR2bywgRFJNX01PREVfRFBNU19PRkYpOworCisJY2g3MDE3X3dyaXRlKGR2bywgQ0g3MDE3X0hPUklaT05UQUxfQUNUSVZFX1BJWEVMX0lOUFVULCBwcml2LT5zYXZlX2hhcGkpOworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19WRVJUSUNBTF9BQ1RJVkVfTElORV9PVVRQVVQsIHByaXYtPnNhdmVfdmFsbyk7CisJY2g3MDE3X3dyaXRlKGR2bywgQ0g3MDE3X0FDVElWRV9JTlBVVF9MSU5FX09VVFBVVCwgcHJpdi0+c2F2ZV9haWxvKTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfTFZEU19QTExfVkNPX0NPTlRST0wsIHByaXYtPnNhdmVfbHZkc19wbGxfdmNvKTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfTFZEU19QTExfRkVFREJBQ0tfRElWLCBwcml2LT5zYXZlX2ZlZWRiYWNrX2Rpdik7CisJY2g3MDE3X3dyaXRlKGR2bywgQ0g3MDE3X0xWRFNfQ09OVFJPTF8yLCBwcml2LT5zYXZlX2x2ZHNfY29udHJvbF8yKTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfT1VUUFVUU19FTkFCTEUsIHByaXYtPnNhdmVfb3V0cHV0c19lbmFibGUpOworCWNoNzAxN193cml0ZShkdm8sIENINzAxN19MVkRTX1BPV0VSX0RPV04sIHByaXYtPnNhdmVfbHZkc19wb3dlcl9kb3duKTsKKwljaDcwMTdfd3JpdGUoZHZvLCBDSDcwMTdfUE9XRVJfTUFOQUdFTUVOVCwgcHJpdi0+c2F2ZV9wb3dlcl9tYW5hZ2VtZW50KTsKK30KKworc3RhdGljIHZvaWQgY2g3MDE3X2Rlc3Ryb3koc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3QgY2g3MDE3X3ByaXYgKnByaXYgPSBkdm8tPmRldl9wcml2OworCisJaWYgKHByaXYpIHsKKwkJa2ZyZWUocHJpdik7CisJCWR2by0+ZGV2X3ByaXYgPSBOVUxMOworCX0KK30KKworc3RydWN0IGludGVsX2R2b19kZXZfb3BzIGNoNzAxN19vcHMgPSB7CisJLmluaXQgPSBjaDcwMTdfaW5pdCwKKwkuZGV0ZWN0ID0gY2g3MDE3X2RldGVjdCwKKwkubW9kZV92YWxpZCA9IGNoNzAxN19tb2RlX3ZhbGlkLAorCS5tb2RlX3NldCA9IGNoNzAxN19tb2RlX3NldCwKKwkuZHBtcyA9IGNoNzAxN19kcG1zLAorCS5kdW1wX3JlZ3MgPSBjaDcwMTdfZHVtcF9yZWdzLAorCS5zYXZlID0gY2g3MDE3X3NhdmUsCisJLnJlc3RvcmUgPSBjaDcwMTdfcmVzdG9yZSwKKwkuZGVzdHJveSA9IGNoNzAxN19kZXN0cm95LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZkOTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IMKpIDIwMDYgRGF2ZSBBaXJsaWUKKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKK2NvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKK29mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKK0FOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1NPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImR2by5oIgorCisjZGVmaW5lIENIN3h4eF9SRUdfVklECQkweDRhCisjZGVmaW5lIENIN3h4eF9SRUdfRElECQkweDRiCisKKyNkZWZpbmUgQ0g3MDExX1ZJRAkJMHg4MyAvKiA3MDEwIGFzIHdlbGwgKi8KKyNkZWZpbmUgQ0g3MDA5QV9WSUQJCTB4ODQKKyNkZWZpbmUgQ0g3MDA5Ql9WSUQJCTB4ODUKKyNkZWZpbmUgQ0g3MzAxX1ZJRAkJMHg5NQorCisjZGVmaW5lIENIN3h4eF9WSUQJCTB4ODQKKyNkZWZpbmUgQ0g3eHh4X0RJRAkJMHgxNworCisjZGVmaW5lIENIN3h4eF9OVU1fUkVHUwkJMHg0YworCisjZGVmaW5lIENIN3h4eF9DTQkJMHgxYworI2RlZmluZSBDSDd4eHhfQ01fWENNCQkoMTw8MCkKKyNkZWZpbmUgQ0g3eHh4X0NNX01DUAkJKDE8PDIpCisjZGVmaW5lIENIN3h4eF9JTlBVVF9DTE9DSwkweDFkCisjZGVmaW5lIENIN3h4eF9HUElPCQkweDFlCisjZGVmaW5lIENIN3h4eF9HUElPX0hQSVIJKDE8PDMpCisjZGVmaW5lIENIN3h4eF9JREYJCTB4MWYKKworI2RlZmluZSBDSDd4eHhfSURGX0hTUAkJKDE8PDMpCisjZGVmaW5lIENIN3h4eF9JREZfVlNQCQkoMTw8NCkKKworI2RlZmluZSBDSDd4eHhfQ09OTkVDVElPTl9ERVRFQ1QgMHgyMAorI2RlZmluZSBDSDd4eHhfQ0RFVF9EVkkJCSgxPDw1KQorCisjZGVmaW5lIENINzMwMV9EQUNfQ05UTAkJMHgyMQorI2RlZmluZSBDSDczMDFfSE9UUExVRwkJMHgyMworI2RlZmluZSBDSDd4eHhfVENUTAkJMHgzMQorI2RlZmluZSBDSDd4eHhfVFZDTwkJMHgzMgorI2RlZmluZSBDSDd4eHhfVFBDUAkJMHgzMworI2RlZmluZSBDSDd4eHhfVFBECQkweDM0CisjZGVmaW5lIENIN3h4eF9UUFZUCQkweDM1CisjZGVmaW5lIENIN3h4eF9UTFBGCQkweDM2CisjZGVmaW5lIENIN3h4eF9UQ1QJCTB4MzcKKyNkZWZpbmUgQ0g3MzAxX1RFU1RfUEFUVEVSTgkweDQ4CisKKyNkZWZpbmUgQ0g3eHh4X1BNCQkweDQ5CisjZGVmaW5lIENIN3h4eF9QTV9GUEQJCSgxPDwwKQorI2RlZmluZSBDSDczMDFfUE1fREFDUEQwCSgxPDwxKQorI2RlZmluZSBDSDczMDFfUE1fREFDUEQxCSgxPDwyKQorI2RlZmluZSBDSDczMDFfUE1fREFDUEQyCSgxPDwzKQorI2RlZmluZSBDSDd4eHhfUE1fRFZJTAkJKDE8PDYpCisjZGVmaW5lIENIN3h4eF9QTV9EVklQCQkoMTw8NykKKworI2RlZmluZSBDSDczMDFfU1lOQ19QT0xBUklUWQkweDU2CisjZGVmaW5lIENINzMwMV9TWU5DX1JHQl9ZVVYJKDE8PDApCisjZGVmaW5lIENINzMwMV9TWU5DX1BPTF9EVkkJKDE8PDUpCisKKy8qKiBAZmlsZQorICogZHJpdmVyIGZvciB0aGUgQ2hyb250ZWwgN3h4eCBEVkkgY2hpcCBvdmVyIERWTy4KKyAqLworCitzdGF0aWMgc3RydWN0IGNoN3h4eF9pZF9zdHJ1Y3QgeworCXVpbnQ4X3QgdmlkOworCWNoYXIgKm5hbWU7Cit9IGNoN3h4eF9pZHNbXSA9IHsKKwl7IENINzAxMV9WSUQsICJDSDcwMTEiIH0sCisJeyBDSDcwMDlBX1ZJRCwgIkNINzAwOUEiIH0sCisJeyBDSDcwMDlCX1ZJRCwgIkNINzAwOUIiIH0sCisJeyBDSDczMDFfVklELCAiQ0g3MzAxIiB9LAorfTsKKworc3RydWN0IGNoN3h4eF9yZWdfc3RhdGUgeworICAgIHVpbnQ4X3QgcmVnc1tDSDd4eHhfTlVNX1JFR1NdOworfTsKKworc3RydWN0IGNoN3h4eF9wcml2IHsKKwlib29sIHF1aWV0OworCisJc3RydWN0IGNoN3h4eF9yZWdfc3RhdGUgc2F2ZV9yZWc7CisJc3RydWN0IGNoN3h4eF9yZWdfc3RhdGUgbW9kZV9yZWc7CisJdWludDhfdCBzYXZlX1RDVEwsIHNhdmVfVFBDUCwgc2F2ZV9UUEQsIHNhdmVfVFBWVDsKKwl1aW50OF90IHNhdmVfVExQRiwgc2F2ZV9UQ1QsIHNhdmVfUE0sIHNhdmVfSURGOworfTsKKworc3RhdGljIHZvaWQgY2g3eHh4X3NhdmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7CisKK3N0YXRpYyBjaGFyICpjaDd4eHhfZ2V0X2lkKHVpbnQ4X3QgdmlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2g3eHh4X2lkcyk7IGkrKykgeworCQlpZiAoY2g3eHh4X2lkc1tpXS52aWQgPT0gdmlkKQorCQkJcmV0dXJuIGNoN3h4eF9pZHNbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqIFJlYWRzIGFuIDggYml0IHJlZ2lzdGVyICovCitzdGF0aWMgYm9vbCBjaDd4eHhfcmVhZGIoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IGFkZHIsIHVpbnQ4X3QgKmNoKQoreworCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4PSBkdm8tPmRldl9wcml2OworCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzID0gZHZvLT5pMmNfYnVzOworCXU4IG91dF9idWZbMl07CisJdTggaW5fYnVmWzJdOworCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBvdXRfYnVmLAorCQl9LAorCQl7CisJCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gaW5fYnVmLAorCQl9CisJfTsKKworCW91dF9idWZbMF0gPSBhZGRyOworCW91dF9idWZbMV0gPSAwOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjYnVzLT5hZGFwdGVyLCBtc2dzLCAyKSA9PSAyKSB7CisJCSpjaCA9IGluX2J1ZlswXTsKKwkJcmV0dXJuIHRydWU7CisJfTsKKworCWlmICghY2g3eHh4LT5xdWlldCkgeworCQlEUk1fREVCVUcoIlVuYWJsZSB0byByZWFkIHJlZ2lzdGVyIDB4JTAyeCBmcm9tICVzOiUwMnguXG4iLAorCQkJICBhZGRyLCBpMmNidXMtPmFkYXB0ZXIubmFtZSwgaTJjYnVzLT5zbGF2ZV9hZGRyKTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKiogV3JpdGVzIGFuIDggYml0IHJlZ2lzdGVyICovCitzdGF0aWMgYm9vbCBjaDd4eHhfd3JpdGViKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBhZGRyLCB1aW50OF90IGNoKQoreworCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4ID0gZHZvLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY2J1cyA9IGR2by0+aTJjX2J1czsKKwl1aW50OF90IG91dF9idWZbMl07CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IGkyY2J1cy0+c2xhdmVfYWRkciwKKwkJLmZsYWdzID0gMCwKKwkJLmxlbiA9IDIsCisJCS5idWYgPSBvdXRfYnVmLAorCX07CisKKwlvdXRfYnVmWzBdID0gYWRkcjsKKwlvdXRfYnVmWzFdID0gY2g7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZpMmNidXMtPmFkYXB0ZXIsICZtc2csIDEpID09IDEpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFjaDd4eHgtPnF1aWV0KSB7CisJCURSTV9ERUJVRygiVW5hYmxlIHRvIHdyaXRlIHJlZ2lzdGVyIDB4JTAyeCB0byAlczolZC5cbiIsCisJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2g3eHh4X2luaXQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzKQoreworCS8qIHRoaXMgd2lsbCBkZXRlY3QgdGhlIENIN3h4eCBjaGlwIG9uIHRoZSBzcGVjaWZpZWQgaTJjIGJ1cyAqLworCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4OworCXVpbnQ4X3QgdmVuZG9yLCBkZXZpY2U7CisJY2hhciAqbmFtZTsKKworCWNoN3h4eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaDd4eHhfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChjaDd4eHggPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJZHZvLT5pMmNfYnVzID0gaTJjYnVzOworCWR2by0+aTJjX2J1cy0+c2xhdmVfYWRkciA9IGR2by0+c2xhdmVfYWRkcjsKKwlkdm8tPmRldl9wcml2ID0gY2g3eHh4OworCWNoN3h4eC0+cXVpZXQgPSB0cnVlOworCisJaWYgKCFjaDd4eHhfcmVhZGIoZHZvLCBDSDd4eHhfUkVHX1ZJRCwgJnZlbmRvcikpCisJCWdvdG8gb3V0OworCisJbmFtZSA9IGNoN3h4eF9nZXRfaWQodmVuZG9yKTsKKwlpZiAoIW5hbWUpIHsKKwkJRFJNX0RFQlVHKCJjaDd4eHggbm90IGRldGVjdGVkOyBnb3QgMHglMDJ4IGZyb20gJXMgc2xhdmUgJWQuXG4iLAorCQkJICB2ZW5kb3IsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCQlnb3RvIG91dDsKKwl9CisKKworCWlmICghY2g3eHh4X3JlYWRiKGR2bywgQ0g3eHh4X1JFR19ESUQsICZkZXZpY2UpKQorCQlnb3RvIG91dDsKKworCWlmIChkZXZpY2UgIT0gQ0g3eHh4X0RJRCkgeworCQlEUk1fREVCVUcoImNoN3h4eCBub3QgZGV0ZWN0ZWQ7IGdvdCAweCUwMnggZnJvbSAlcyBzbGF2ZSAlZC5cbiIsCisJCQkgIHZlbmRvciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGkyY2J1cy0+c2xhdmVfYWRkcik7CisJCWdvdG8gb3V0OworCX0KKworCWNoN3h4eC0+cXVpZXQgPSBmYWxzZTsKKwlEUk1fREVCVUcoIkRldGVjdGVkICVzIGNoaXBzZXQsIHZlbmRvci9kZXZpY2UgSUQgMHglMDJ4LzB4JTAyeFxuIiwKKwkJICBuYW1lLCB2ZW5kb3IsIGRldmljZSk7CisJcmV0dXJuIHRydWU7CitvdXQ6CisJa2ZyZWUoY2g3eHh4KTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGNoN3h4eF9kZXRlY3Qoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwl1aW50OF90IGNkZXQsIG9yaWdfcG0sIHBtOworCisJY2g3eHh4X3JlYWRiKGR2bywgQ0g3eHh4X1BNLCAmb3JpZ19wbSk7CisKKwlwbSA9IG9yaWdfcG07CisJcG0gJj0gfkNIN3h4eF9QTV9GUEQ7CisJcG0gfD0gQ0g3eHh4X1BNX0RWSUwgfCBDSDd4eHhfUE1fRFZJUDsKKworCWNoN3h4eF93cml0ZWIoZHZvLCBDSDd4eHhfUE0sIHBtKTsKKworCWNoN3h4eF9yZWFkYihkdm8sIENIN3h4eF9DT05ORUNUSU9OX0RFVEVDVCwgJmNkZXQpOworCisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9QTSwgb3JpZ19wbSk7CisKKwlpZiAoY2RldCAmIENIN3h4eF9DREVUX0RWSSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIGNoN3h4eF9tb2RlX3ZhbGlkKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCWlmIChtb2RlLT5jbG9jayA+IDE2NTAwMCkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgdm9pZCBjaDd4eHhfbW9kZV9zZXQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwl1aW50OF90IHR2Y28sIHRwY3AsIHRwZCwgdGxwZiwgaWRmOworCisJaWYgKG1vZGUtPmNsb2NrIDw9IDY1MDAwKSB7CisJCXR2Y28gPSAweDIzOworCQl0cGNwID0gMHgwODsKKwkJdHBkID0gMHgxNjsKKwkJdGxwZiA9IDB4NjA7CisJfSBlbHNlIHsKKwkJdHZjbyA9IDB4MmQ7CisJCXRwY3AgPSAweDA2OworCQl0cGQgPSAweDI2OworCQl0bHBmID0gMHhhMDsKKwl9CisKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RDVEwsIDB4MDApOworCWNoN3h4eF93cml0ZWIoZHZvLCBDSDd4eHhfVFZDTywgdHZjbyk7CisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9UUENQLCB0cGNwKTsKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RQRCwgdHBkKTsKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RQVlQsIDB4MzApOworCWNoN3h4eF93cml0ZWIoZHZvLCBDSDd4eHhfVExQRiwgdGxwZik7CisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9UQ1QsIDB4MDApOworCisJY2g3eHh4X3JlYWRiKGR2bywgQ0g3eHh4X0lERiwgJmlkZik7CisKKwlpZGYgJj0gfihDSDd4eHhfSURGX0hTUCB8IENIN3h4eF9JREZfVlNQKTsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykKKwkJaWRmIHw9IENIN3h4eF9JREZfSFNQOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCWlkZiB8PSBDSDd4eHhfSURGX0hTUDsKKworCWNoN3h4eF93cml0ZWIoZHZvLCBDSDd4eHhfSURGLCBpZGYpOworfQorCisvKiBzZXQgdGhlIENIN3h4eCBwb3dlciBzdGF0ZSAqLworc3RhdGljIHZvaWQgY2g3eHh4X2RwbXMoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9QTSwgQ0g3eHh4X1BNX0RWSUwgfCBDSDd4eHhfUE1fRFZJUCk7CisJZWxzZQorCQljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1BNLCBDSDd4eHhfUE1fRlBEKTsKK30KKworc3RhdGljIHZvaWQgY2g3eHh4X2R1bXBfcmVncyhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4ID0gZHZvLT5kZXZfcHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDSDd4eHhfTlVNX1JFR1M7IGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwICkKKwkJCURSTV9ERUJVRygiXG4gJTAyWDogIiwgaSk7CisJCURSTV9ERUJVRygiJTAyWCAiLCBjaDd4eHgtPm1vZGVfcmVnLnJlZ3NbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgY2g3eHh4X3NhdmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3QgY2g3eHh4X3ByaXYgKmNoN3h4eD0gZHZvLT5kZXZfcHJpdjsKKworCWNoN3h4eF9yZWFkYihkdm8sIENIN3h4eF9UQ1RMLCAmY2g3eHh4LT5zYXZlX1RDVEwpOworCWNoN3h4eF9yZWFkYihkdm8sIENIN3h4eF9UUENQLCAmY2g3eHh4LT5zYXZlX1RQQ1ApOworCWNoN3h4eF9yZWFkYihkdm8sIENIN3h4eF9UUEQsICZjaDd4eHgtPnNhdmVfVFBEKTsKKwljaDd4eHhfcmVhZGIoZHZvLCBDSDd4eHhfVFBWVCwgJmNoN3h4eC0+c2F2ZV9UUFZUKTsKKwljaDd4eHhfcmVhZGIoZHZvLCBDSDd4eHhfVExQRiwgJmNoN3h4eC0+c2F2ZV9UTFBGKTsKKwljaDd4eHhfcmVhZGIoZHZvLCBDSDd4eHhfUE0sICZjaDd4eHgtPnNhdmVfUE0pOworCWNoN3h4eF9yZWFkYihkdm8sIENIN3h4eF9JREYsICZjaDd4eHgtPnNhdmVfSURGKTsKK30KKworc3RhdGljIHZvaWQgY2g3eHh4X3Jlc3RvcmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3QgY2g3eHh4X3ByaXYgKmNoN3h4eCA9IGR2by0+ZGV2X3ByaXY7CisKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RDVEwsIGNoN3h4eC0+c2F2ZV9UQ1RMKTsKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RQQ1AsIGNoN3h4eC0+c2F2ZV9UUENQKTsKKwljaDd4eHhfd3JpdGViKGR2bywgQ0g3eHh4X1RQRCwgY2g3eHh4LT5zYXZlX1RQRCk7CisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9UUFZULCBjaDd4eHgtPnNhdmVfVFBWVCk7CisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9UTFBGLCBjaDd4eHgtPnNhdmVfVExQRik7CisJY2g3eHh4X3dyaXRlYihkdm8sIENIN3h4eF9JREYsIGNoN3h4eC0+c2F2ZV9JREYpOworCWNoN3h4eF93cml0ZWIoZHZvLCBDSDd4eHhfUE0sIGNoN3h4eC0+c2F2ZV9QTSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoN3h4eF9kZXN0cm95KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJc3RydWN0IGNoN3h4eF9wcml2ICpjaDd4eHggPSBkdm8tPmRldl9wcml2OworCisJaWYgKGNoN3h4eCkgeworCQlrZnJlZShjaDd4eHgpOworCQlkdm8tPmRldl9wcml2ID0gTlVMTDsKKwl9Cit9CisKK3N0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyBjaDd4eHhfb3BzID0geworCS5pbml0ID0gY2g3eHh4X2luaXQsCisJLmRldGVjdCA9IGNoN3h4eF9kZXRlY3QsCisJLm1vZGVfdmFsaWQgPSBjaDd4eHhfbW9kZV92YWxpZCwKKwkubW9kZV9zZXQgPSBjaDd4eHhfbW9kZV9zZXQsCisJLmRwbXMgPSBjaDd4eHhfZHBtcywKKwkuZHVtcF9yZWdzID0gY2g3eHh4X2R1bXBfcmVncywKKwkuc2F2ZSA9IGNoN3h4eF9zYXZlLAorCS5yZXN0b3JlID0gY2g3eHh4X3Jlc3RvcmUsCisJLmRlc3Ryb3kgPSBjaDd4eHhfZGVzdHJveSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhkMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYwpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaW5jbHVkZSAiZHZvLmgiCisKKy8qCisgKiByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIGk4MjgwN2FhLgorICoKKyAqIERvY3VtZW50YXRpb24gb24gdGhpcyBjaGlwc2V0IGNhbiBiZSBmb3VuZCBpbiBkYXRhc2hlZXQgIzI5MDY5MDAxIGF0CisgKiBpbnRlbC5jb20uCisgKi8KKworLyoKKyAqIFZDSCBSZXZpc2lvbiAmIEdNQnVzIEJhc2UgQWRkcgorICovCisjZGVmaW5lIFZSMDAJCTB4MDAKKyMgZGVmaW5lIFZSMDBfQkFTRV9BRERSRVNTX01BU0sJCTB4MDA3ZgorCisvKgorICogRnVuY3Rpb25hbGl0eSBFbmFibGUKKyAqLworI2RlZmluZSBWUjAxCQkweDAxCisKKy8qCisgKiBFbmFibGUgdGhlIHBhbmVsIGZpdHRlcgorICovCisjIGRlZmluZSBWUjAxX1BBTkVMX0ZJVF9FTkFCTEUJCSgxIDw8IDMpCisvKgorICogRW5hYmxlcyB0aGUgTENEIGRpc3BsYXkuCisgKgorICogVGhpcyBtdXN0IG5vdCBiZSBzZXQgd2hpbGUgVlIwMV9EVk9fQllQQVNTX0VOQUJMRSBpcyBzZXQuCisgKi8KKyMgZGVmaW5lIFZSMDFfTENEX0VOQUJMRQkJKDEgPDwgMikKKy8qKiBFbmFibGVzIHRoZSBEVk8gcmVwZWF0ZXIuICovCisjIGRlZmluZSBWUjAxX0RWT19CWVBBU1NfRU5BQkxFCQkoMSA8PCAxKQorLyoqIEVuYWJsZXMgdGhlIERWTyBjbG9jayAqLworIyBkZWZpbmUgVlIwMV9EVk9fRU5BQkxFCQkoMSA8PCAwKQorCisvKgorICogTENEIEludGVyZmFjZSBGb3JtYXQKKyAqLworI2RlZmluZSBWUjEwCQkweDEwCisvKiogRW5hYmxlcyBMVkRTIG91dHB1dCBpbnN0ZWFkIG9mIENNT1MgKi8KKyMgZGVmaW5lIFZSMTBfTFZEU19FTkFCTEUJCSgxIDw8IDQpCisvKiogRW5hYmxlcyAxOC1iaXQgTFZEUyBvdXRwdXQuICovCisjIGRlZmluZSBWUjEwX0lOVEVSRkFDRV8xWDE4CQkoMCA8PCAyKQorLyoqIEVuYWJsZXMgMjQtYml0IExWRFMgb3IgQ01PUyBvdXRwdXQgKi8KKyMgZGVmaW5lIFZSMTBfSU5URVJGQUNFXzFYMjQJCSgxIDw8IDIpCisvKiogRW5hYmxlcyAyeDE4LWJpdCBMVkRTIG9yIENNT1Mgb3V0cHV0LiAqLworIyBkZWZpbmUgVlIxMF9JTlRFUkZBQ0VfMlgxOAkJKDIgPDwgMikKKy8qKiBFbmFibGVzIDJ4MjQtYml0IExWRFMgb3V0cHV0ICovCisjIGRlZmluZSBWUjEwX0lOVEVSRkFDRV8yWDI0CQkoMyA8PCAyKQorCisvKgorICogVlIyMCBMQ0QgSG9yaXpvbnRhbCBEaXNwbGF5IFNpemUKKyAqLworI2RlZmluZSBWUjIwCTB4MjAKKworLyoKKyAqIExDRCBWZXJ0aWNhbCBEaXNwbGF5IFNpemUKKyAqLworI2RlZmluZSBWUjIxCTB4MjAKKworLyoKKyAqIFBhbmVsIHBvd2VyIGRvd24gc3RhdHVzCisgKi8KKyNkZWZpbmUgVlIzMAkJMHgzMAorLyoqIFJlYWQgb25seSBiaXQgaW5kaWNhdGluZyB0aGF0IHRoZSBwYW5lbCBpcyBub3QgaW4gYSBzYWZlIHBvd2Vyb2ZmIHN0YXRlLiAqLworIyBkZWZpbmUgVlIzMF9QQU5FTF9PTgkJCSgxIDw8IDE1KQorCisjZGVmaW5lIFZSNDAJCTB4NDAKKyMgZGVmaW5lIFZSNDBfU1RBTExfRU5BQkxFCQkoMSA8PCAxMykKKyMgZGVmaW5lIFZSNDBfVkVSVElDQUxfSU5URVJQX0VOQUJMRQkoMSA8PCAxMikKKyMgZGVmaW5lIFZSNDBfRU5IQU5DRURfUEFORUxfRklUVElORwkoMSA8PCAxMSkKKyMgZGVmaW5lIFZSNDBfSE9SSVpPTlRBTF9JTlRFUlBfRU5BQkxFCSgxIDw8IDEwKQorIyBkZWZpbmUgVlI0MF9BVVRPX1JBVElPX0VOQUJMRQkJKDEgPDwgOSkKKyMgZGVmaW5lIFZSNDBfQ0xPQ0tfR0FUSU5HX0VOQUJMRQkoMSA8PCA4KQorCisvKgorICogUGFuZWwgRml0dGluZyBWZXJ0aWNhbCBSYXRpbworICogKCgoaW1hZ2VfaGVpZ2h0IC0gMSkgPDwgMTYpIC8gKChwYW5lbF9oZWlnaHQgLSAxKSkpID4+IDIKKyAqLworI2RlZmluZSBWUjQxCQkweDQxCisKKy8qCisgKiBQYW5lbCBGaXR0aW5nIEhvcml6b250YWwgUmF0aW8KKyAqICgoKGltYWdlX3dpZHRoIC0gMSkgPDwgMTYpIC8gKChwYW5lbF93aWR0aCAtIDEpKSkgPj4gMgorICovCisjZGVmaW5lIFZSNDIJCTB4NDIKKworLyoKKyAqIEhvcml6b250YWwgSW1hZ2UgU2l6ZQorICovCisjZGVmaW5lIFZSNDMJCTB4NDMKKworLyogVlI4MCBHUElPIDAKKyAqLworI2RlZmluZSBWUjgwCSAgICAweDgwCisjZGVmaW5lIFZSODEJICAgIDB4ODEKKyNkZWZpbmUgVlI4MgkgICAgMHg4MgorI2RlZmluZSBWUjgzCSAgICAweDgzCisjZGVmaW5lIFZSODQJICAgIDB4ODQKKyNkZWZpbmUgVlI4NQkgICAgMHg4NQorI2RlZmluZSBWUjg2CSAgICAweDg2CisjZGVmaW5lIFZSODcJICAgIDB4ODcKKworLyogVlI4OCBHUElPIDgKKyAqLworI2RlZmluZSBWUjg4CSAgICAweDg4CisKKy8qIEdyYXBoaWNzIEJJT1Mgc2NyYXRjaCAwCisgKi8KKyNkZWZpbmUgVlI4RQkgICAgMHg4RQorIyBkZWZpbmUgVlI4RV9QQU5FTF9UWVBFX01BU0sJCSgweGYgPDwgMCkKKyMgZGVmaW5lIFZSOEVfUEFORUxfSU5URVJGQUNFX0NNT1MJKDAgPDwgNCkKKyMgZGVmaW5lIFZSOEVfUEFORUxfSU5URVJGQUNFX0xWRFMJKDEgPDwgNCkKKyMgZGVmaW5lIFZSOEVfRk9SQ0VfREVGQVVMVF9QQU5FTAkoMSA8PCA1KQorCisvKiBHcmFwaGljcyBCSU9TIHNjcmF0Y2ggMQorICovCisjZGVmaW5lIFZSOEYJICAgIDB4OEYKKyMgZGVmaW5lIFZSOEZfVkNIX1BSRVNFTlQJCSgxIDw8IDApCisjIGRlZmluZSBWUjhGX0RJU1BMQVlfQ09OTgkJKDEgPDwgMSkKKyMgZGVmaW5lIFZSOEZfUE9XRVJfTUFTSwkJKDB4M2MpCisjIGRlZmluZSBWUjhGX1BPV0VSX1BPUwkJCSgyKQorCisKK3N0cnVjdCBpdmNoX3ByaXYgeworCWJvb2wgcXVpZXQ7CisKKwl1aW50MTZfdCB3aWR0aCwgaGVpZ2h0OworCisJdWludDE2X3Qgc2F2ZV9WUjAxOworCXVpbnQxNl90IHNhdmVfVlI0MDsKK307CisKKworc3RhdGljIHZvaWQgaXZjaF9kdW1wX3JlZ3Moc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byk7CisKKy8qKgorICogUmVhZHMgYSByZWdpc3RlciBvbiB0aGUgaXZjaC4KKyAqCisgKiBFYWNoIG9mIHRoZSAyNTYgcmVnaXN0ZXJzIGFyZSAxNiBiaXRzIGxvbmcuCisgKi8KK3N0YXRpYyBib29sIGl2Y2hfcmVhZChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkciwgdWludDE2X3QgKmRhdGEpCit7CisJc3RydWN0IGl2Y2hfcHJpdiAqcHJpdiA9IGR2by0+ZGV2X3ByaXY7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBkdm8tPmkyY19idXM7CisJdTggb3V0X2J1ZlsxXTsKKwl1OCBpbl9idWZbMl07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gMCwKKwkJfSwKKwkJeworCQkJLmFkZHIgPSAwLAorCQkJLmZsYWdzID0gSTJDX01fTk9TVEFSVCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQgfCBJMkNfTV9OT1NUQVJULAorCQkJLmxlbiA9IDIsCisJCQkuYnVmID0gaW5fYnVmLAorCQl9CisJfTsKKworCW91dF9idWZbMF0gPSBhZGRyOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjYnVzLT5hZGFwdGVyLCBtc2dzLCAzKSA9PSAzKSB7CisJCSpkYXRhID0gKGluX2J1ZlsxXSA8PCA4KSB8IGluX2J1ZlswXTsKKwkJcmV0dXJuIHRydWU7CisJfTsKKworCWlmICghcHJpdi0+cXVpZXQpIHsKKwkJRFJNX0RFQlVHKCJVbmFibGUgdG8gcmVhZCByZWdpc3RlciAweCUwMnggZnJvbSAlczolMDJ4LlxuIiwKKwkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGkyY2J1cy0+c2xhdmVfYWRkcik7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqIFdyaXRlcyBhIDE2LWJpdCByZWdpc3RlciBvbiB0aGUgaXZjaCAqLworc3RhdGljIGJvb2wgaXZjaF93cml0ZShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkciwgdWludDE2X3QgZGF0YSkKK3sKKwlzdHJ1Y3QgaXZjaF9wcml2ICpwcml2ID0gZHZvLT5kZXZfcHJpdjsKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY2J1cyA9IGR2by0+aTJjX2J1czsKKwl1OCBvdXRfYnVmWzNdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBpMmNidXMtPnNsYXZlX2FkZHIsCisJCS5mbGFncyA9IDAsCisJCS5sZW4gPSAzLAorCQkuYnVmID0gb3V0X2J1ZiwKKwl9OworCisJb3V0X2J1ZlswXSA9IGFkZHI7CisJb3V0X2J1ZlsxXSA9IGRhdGEgJiAweGZmOworCW91dF9idWZbMl0gPSBkYXRhID4+IDg7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZpMmNidXMtPmFkYXB0ZXIsICZtc2csIDEpID09IDEpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFwcml2LT5xdWlldCkgeworCQlEUk1fREVCVUcoIlVuYWJsZSB0byB3cml0ZSByZWdpc3RlciAweCUwMnggdG8gJXM6JWQuXG4iLAorCQkJICBhZGRyLCBpMmNidXMtPmFkYXB0ZXIubmFtZSwgaTJjYnVzLT5zbGF2ZV9hZGRyKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBQcm9iZXMgdGhlIGdpdmVuIGJ1cyBhbmQgc2xhdmUgYWRkcmVzcyBmb3IgYW4gaXZjaCAqLworc3RhdGljIGJvb2wgaXZjaF9pbml0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCSAgICAgIHN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzKQoreworCXN0cnVjdCBpdmNoX3ByaXYgKnByaXY7CisJdWludDE2X3QgdGVtcDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXZjaF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJZHZvLT5pMmNfYnVzID0gaTJjYnVzOworCWR2by0+aTJjX2J1cy0+c2xhdmVfYWRkciA9IGR2by0+c2xhdmVfYWRkcjsKKwlkdm8tPmRldl9wcml2ID0gcHJpdjsKKwlwcml2LT5xdWlldCA9IHRydWU7CisKKwlpZiAoIWl2Y2hfcmVhZChkdm8sIFZSMDAsICZ0ZW1wKSkKKwkJZ290byBvdXQ7CisJcHJpdi0+cXVpZXQgPSBmYWxzZTsKKworCS8qIFNpbmNlIHRoZSBpZGVudGlmaWNhdGlvbiBiaXRzIGFyZSBwcm9iYWJseSB6ZXJvZXMsIHdoaWNoIGRvZXNuJ3Qgc2VlbQorCSAqIHZlcnkgdW5pcXVlLCBjaGVjayB0aGF0IHRoZSB2YWx1ZSBpbiB0aGUgYmFzZSBhZGRyZXNzIGZpZWxkIG1hdGNoZXMKKwkgKiB0aGUgYWRkcmVzcyBpdCdzIHJlc3BvbmRpbmcgb24uCisJICovCisJaWYgKCh0ZW1wICYgVlIwMF9CQVNFX0FERFJFU1NfTUFTSykgIT0gZHZvLT5zbGF2ZV9hZGRyKSB7CisJCURSTV9ERUJVRygiaXZjaCBkZXRlY3QgZmFpbGVkIGR1ZSB0byBhZGRyZXNzIG1pc21hdGNoICIKKwkJCSAgIiglZCB2cyAlZClcbiIsCisJCQkgICh0ZW1wICYgVlIwMF9CQVNFX0FERFJFU1NfTUFTSyksIGR2by0+c2xhdmVfYWRkcik7CisJCWdvdG8gb3V0OworCX0KKworCWl2Y2hfcmVhZChkdm8sIFZSMjAsICZwcml2LT53aWR0aCk7CisJaXZjaF9yZWFkKGR2bywgVlIyMSwgJnByaXYtPmhlaWdodCk7CisKKwlyZXR1cm4gdHJ1ZTsKKworb3V0OgorCWtmcmVlKHByaXYpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaXZjaF9kZXRlY3Qoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cyBpdmNoX21vZGVfdmFsaWQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCWlmIChtb2RlLT5jbG9jayA+IDExMjAwMCkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCXJldHVybiBNT0RFX09LOworfQorCisvKiogU2V0cyB0aGUgcG93ZXIgc3RhdGUgb2YgdGhlIHBhbmVsIGNvbm5lY3RlZCB0byB0aGUgaXZjaCAqLworc3RhdGljIHZvaWQgaXZjaF9kcG1zKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBtb2RlKQoreworCWludCBpOworCXVpbnQxNl90IHZyMDEsIHZyMzAsIGJhY2tsaWdodDsKKworCS8qIFNldCB0aGUgbmV3IHBvd2VyIHN0YXRlIG9mIHRoZSBwYW5lbC4gKi8KKwlpZiAoIWl2Y2hfcmVhZChkdm8sIFZSMDEsICZ2cjAxKSkKKwkJcmV0dXJuOworCisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJYmFja2xpZ2h0ID0gMTsKKwllbHNlCisJCWJhY2tsaWdodCA9IDA7CisJaXZjaF93cml0ZShkdm8sIFZSODAsIGJhY2tsaWdodCk7CisKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQorCQl2cjAxIHw9IFZSMDFfTENEX0VOQUJMRSB8IFZSMDFfRFZPX0VOQUJMRTsKKwllbHNlCisJCXZyMDEgJj0gfihWUjAxX0xDRF9FTkFCTEUgfCBWUjAxX0RWT19FTkFCTEUpOworCisJaXZjaF93cml0ZShkdm8sIFZSMDEsIHZyMDEpOworCisJLyogV2FpdCBmb3IgdGhlIHBhbmVsIHRvIG1ha2UgaXRzIHN0YXRlIHRyYW5zaXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKCFpdmNoX3JlYWQoZHZvLCBWUjMwLCAmdnIzMCkpCisJCQlicmVhazsKKworCQlpZiAoKCh2cjMwICYgVlIzMF9QQU5FTF9PTikgIT0gMCkgPT0gKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMDApOworCX0KKwkvKiB3YWl0IHNvbWUgbW9yZTsgdmNoIG1heSBmYWlsIHRvIHJlc3luYyBzb21ldGltZXMgd2l0aG91dCB0aGlzICovCisJdWRlbGF5KDE2ICogMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGl2Y2hfbW9kZV9zZXQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXVpbnQxNl90IHZyNDAgPSAwOworCXVpbnQxNl90IHZyMDE7CisKKwl2cjAxID0gMDsKKwl2cjQwID0gKFZSNDBfU1RBTExfRU5BQkxFIHwgVlI0MF9WRVJUSUNBTF9JTlRFUlBfRU5BQkxFIHwKKwkJVlI0MF9IT1JJWk9OVEFMX0lOVEVSUF9FTkFCTEUpOworCisJaWYgKG1vZGUtPmhkaXNwbGF5ICE9IGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IHx8CisJICAgIG1vZGUtPnZkaXNwbGF5ICE9IGFkanVzdGVkX21vZGUtPnZkaXNwbGF5KSB7CisJCXVpbnQxNl90IHhfcmF0aW8sIHlfcmF0aW87CisKKwkJdnIwMSB8PSBWUjAxX1BBTkVMX0ZJVF9FTkFCTEU7CisJCXZyNDAgfD0gVlI0MF9DTE9DS19HQVRJTkdfRU5BQkxFOworCQl4X3JhdGlvID0gKCgobW9kZS0+aGRpc3BsYXkgLSAxKSA8PCAxNikgLworCQkJICAgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC0gMSkpID4+IDI7CisJCXlfcmF0aW8gPSAoKChtb2RlLT52ZGlzcGxheSAtIDEpIDw8IDE2KSAvCisJCQkgICAoYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgLSAxKSkgPj4gMjsKKwkJaXZjaF93cml0ZSAoZHZvLCBWUjQyLCB4X3JhdGlvKTsKKwkJaXZjaF93cml0ZSAoZHZvLCBWUjQxLCB5X3JhdGlvKTsKKwl9IGVsc2UgeworCQl2cjAxICY9IH5WUjAxX1BBTkVMX0ZJVF9FTkFCTEU7CisJCXZyNDAgJj0gflZSNDBfQ0xPQ0tfR0FUSU5HX0VOQUJMRTsKKwl9CisJdnI0MCAmPSB+VlI0MF9BVVRPX1JBVElPX0VOQUJMRTsKKworCWl2Y2hfd3JpdGUoZHZvLCBWUjAxLCB2cjAxKTsKKwlpdmNoX3dyaXRlKGR2bywgVlI0MCwgdnI0MCk7CisKKwlpdmNoX2R1bXBfcmVncyhkdm8pOworfQorCitzdGF0aWMgdm9pZCBpdmNoX2R1bXBfcmVncyhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXVpbnQxNl90IHZhbDsKKworCWl2Y2hfcmVhZChkdm8sIFZSMDAsICZ2YWwpOworCURSTV9ERUJVRygiVlIwMDogMHglMDR4XG4iLCB2YWwpOworCWl2Y2hfcmVhZChkdm8sIFZSMDEsICZ2YWwpOworCURSTV9ERUJVRygiVlIwMTogMHglMDR4XG4iLCB2YWwpOworCWl2Y2hfcmVhZChkdm8sIFZSMzAsICZ2YWwpOworCURSTV9ERUJVRygiVlIzMDogMHglMDR4XG4iLCB2YWwpOworCWl2Y2hfcmVhZChkdm8sIFZSNDAsICZ2YWwpOworCURSTV9ERUJVRygiVlI0MDogMHglMDR4XG4iLCB2YWwpOworCisJLyogR1BJTyByZWdpc3RlcnMgKi8KKwlpdmNoX3JlYWQoZHZvLCBWUjgwLCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODA6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjgxLCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODE6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjgyLCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODI6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjgzLCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODM6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjg0LCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODQ6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjg1LCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODU6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjg2LCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODY6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjg3LCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODc6IDB4JTA0eFxuIiwgdmFsKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjg4LCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSODg6IDB4JTA0eFxuIiwgdmFsKTsKKworCS8qIFNjcmF0Y2ggcmVnaXN0ZXIgMCAtIEFJTSBQYW5lbCB0eXBlICovCisJaXZjaF9yZWFkKGR2bywgVlI4RSwgJnZhbCk7CisJRFJNX0RFQlVHKCJWUjhFOiAweCUwNHhcbiIsIHZhbCk7CisKKwkvKiBTY3JhdGNoIHJlZ2lzdGVyIDEgLSBTdGF0dXMgcmVnaXN0ZXIgKi8KKwlpdmNoX3JlYWQoZHZvLCBWUjhGLCAmdmFsKTsKKwlEUk1fREVCVUcoIlZSOEY6IDB4JTA0eFxuIiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgaXZjaF9zYXZlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJc3RydWN0IGl2Y2hfcHJpdiAqcHJpdiA9IGR2by0+ZGV2X3ByaXY7CisKKwlpdmNoX3JlYWQoZHZvLCBWUjAxLCAmcHJpdi0+c2F2ZV9WUjAxKTsKKwlpdmNoX3JlYWQoZHZvLCBWUjQwLCAmcHJpdi0+c2F2ZV9WUjQwKTsKK30KKworc3RhdGljIHZvaWQgaXZjaF9yZXN0b3JlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJc3RydWN0IGl2Y2hfcHJpdiAqcHJpdiA9IGR2by0+ZGV2X3ByaXY7CisKKwlpdmNoX3dyaXRlKGR2bywgVlIwMSwgcHJpdi0+c2F2ZV9WUjAxKTsKKwlpdmNoX3dyaXRlKGR2bywgVlI0MCwgcHJpdi0+c2F2ZV9WUjQwKTsKK30KKworc3RhdGljIHZvaWQgaXZjaF9kZXN0cm95KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJc3RydWN0IGl2Y2hfcHJpdiAqcHJpdiA9IGR2by0+ZGV2X3ByaXY7CisKKwlpZiAocHJpdikgeworCQlrZnJlZShwcml2KTsKKwkJZHZvLT5kZXZfcHJpdiA9IE5VTEw7CisJfQorfQorCitzdHJ1Y3QgaW50ZWxfZHZvX2Rldl9vcHMgaXZjaF9vcHM9IHsKKwkuaW5pdCA9IGl2Y2hfaW5pdCwKKwkuZHBtcyA9IGl2Y2hfZHBtcywKKwkuc2F2ZSA9IGl2Y2hfc2F2ZSwKKwkucmVzdG9yZSA9IGl2Y2hfcmVzdG9yZSwKKwkubW9kZV92YWxpZCA9IGl2Y2hfbW9kZV92YWxpZCwKKwkubW9kZV9zZXQgPSBpdmNoX21vZGVfc2V0LAorCS5kZXRlY3QgPSBpdmNoX2RldGVjdCwKKwkuZHVtcF9yZWdzID0gaXZjaF9kdW1wX3JlZ3MsCisJLmRlc3Ryb3kgPSBpdmNoX2Rlc3Ryb3ksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2E0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgwqkgMjAwNiBEYXZlIEFpcmxpZQorCitBbGwgUmlnaHRzIFJlc2VydmVkLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCituZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZHZvLmgiCisKKyNkZWZpbmUgU0lMMTY0X1ZJRCAweDAwMDEKKyNkZWZpbmUgU0lMMTY0X0RJRCAweDAwMDYKKworI2RlZmluZSBTSUwxNjRfVklEX0xPIDB4MDAKKyNkZWZpbmUgU0lMMTY0X1ZJRF9ISSAweDAxCisjZGVmaW5lIFNJTDE2NF9ESURfTE8gMHgwMgorI2RlZmluZSBTSUwxNjRfRElEX0hJIDB4MDMKKyNkZWZpbmUgU0lMMTY0X1JFViAgICAweDA0CisjZGVmaW5lIFNJTDE2NF9SU1ZEICAgMHgwNQorI2RlZmluZSBTSUwxNjRfRlJFUV9MTyAweDA2CisjZGVmaW5lIFNJTDE2NF9GUkVRX0hJIDB4MDcKKworI2RlZmluZSBTSUwxNjRfUkVHOCAweDA4CisjZGVmaW5lIFNJTDE2NF84X1ZFTiAoMTw8NSkKKyNkZWZpbmUgU0lMMTY0XzhfSEVOICgxPDw0KQorI2RlZmluZSBTSUwxNjRfOF9EU0VMICgxPDwzKQorI2RlZmluZSBTSUwxNjRfOF9CU0VMICgxPDwyKQorI2RlZmluZSBTSUwxNjRfOF9FREdFICgxPDwxKQorI2RlZmluZSBTSUwxNjRfOF9QRCAgICgxPDwwKQorCisjZGVmaW5lIFNJTDE2NF9SRUc5IDB4MDkKKyNkZWZpbmUgU0lMMTY0XzlfVkxPVyAoMTw8NykKKyNkZWZpbmUgU0lMMTY0XzlfTVNFTF9NQVNLICgweDc8PDQpCisjZGVmaW5lIFNJTDE2NF85X1RTRUwgKDE8PDMpCisjZGVmaW5lIFNJTDE2NF85X1JTRU4gKDE8PDIpCisjZGVmaW5lIFNJTDE2NF85X0hUUExHICgxPDwxKQorI2RlZmluZSBTSUwxNjRfOV9NREkgKDE8PDApCisKKyNkZWZpbmUgU0lMMTY0X1JFR0MgMHgwYworCitzdHJ1Y3Qgc2lsMTY0X3NhdmVfcmVjIHsKKwl1aW50OF90IHJlZzg7CisJdWludDhfdCByZWc5OworCXVpbnQ4X3QgcmVnYzsKK307CisKK3N0cnVjdCBzaWwxNjRfcHJpdiB7CisJLy9JMkNEZXZSZWMgZDsKKwlib29sIHF1aWV0OworCXN0cnVjdCBzaWwxNjRfc2F2ZV9yZWMgc2F2ZV9yZWdzOworCXN0cnVjdCBzaWwxNjRfc2F2ZV9yZWMgbW9kZV9yZWdzOworfTsKKworI2RlZmluZSBTSUxQVFIoZCkgKChTSUwxNjRQdHIpKGQtPkRyaXZlclByaXZhdGUucHRyKSkKKworc3RhdGljIGJvb2wgc2lsMTY0X3JlYWRiKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBhZGRyLCB1aW50OF90ICpjaCkKK3sKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnNpbCA9IGR2by0+ZGV2X3ByaXY7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBkdm8tPmkyY19idXM7CisJdTggb3V0X2J1ZlsyXTsKKwl1OCBpbl9idWZbMl07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBpbl9idWYsCisJCX0KKwl9OworCisJb3V0X2J1ZlswXSA9IGFkZHI7CisJb3V0X2J1ZlsxXSA9IDA7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZpMmNidXMtPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpIHsKKwkJKmNoID0gaW5fYnVmWzBdOworCQlyZXR1cm4gdHJ1ZTsKKwl9OworCisJaWYgKCFzaWwtPnF1aWV0KSB7CisJCURSTV9ERUJVRygiVW5hYmxlIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4IGZyb20gJXM6JTAyeC5cbiIsCisJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHNpbDE2NF93cml0ZWIoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IGFkZHIsIHVpbnQ4X3QgY2gpCit7CisJc3RydWN0IHNpbDE2NF9wcml2ICpzaWw9IGR2by0+ZGV2X3ByaXY7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBkdm8tPmkyY19idXM7CisJdWludDhfdCBvdXRfYnVmWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBpMmNidXMtPnNsYXZlX2FkZHIsCisJCS5mbGFncyA9IDAsCisJCS5sZW4gPSAyLAorCQkuYnVmID0gb3V0X2J1ZiwKKwl9OworCisJb3V0X2J1ZlswXSA9IGFkZHI7CisJb3V0X2J1ZlsxXSA9IGNoOworCisJaWYgKGkyY190cmFuc2ZlcigmaTJjYnVzLT5hZGFwdGVyLCAmbXNnLCAxKSA9PSAxKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghc2lsLT5xdWlldCkgeworCQlEUk1fREVCVUcoIlVuYWJsZSB0byB3cml0ZSByZWdpc3RlciAweCUwMnggdG8gJXM6JWQuXG4iLAorCQkJICBhZGRyLCBpMmNidXMtPmFkYXB0ZXIubmFtZSwgaTJjYnVzLT5zbGF2ZV9hZGRyKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIFNpbGljb24gSW1hZ2UgMTY0IGRyaXZlciBmb3IgY2hpcCBvbiBpMmMgYnVzICovCitzdGF0aWMgYm9vbCBzaWwxNjRfaW5pdChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLAorCQkJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMpCit7CisJLyogdGhpcyB3aWxsIGRldGVjdCB0aGUgU0lMMTY0IGNoaXAgb24gdGhlIHNwZWNpZmllZCBpMmMgYnVzICovCisJc3RydWN0IHNpbDE2NF9wcml2ICpzaWw7CisJdW5zaWduZWQgY2hhciBjaDsKKworCXNpbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaWwxNjRfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChzaWwgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJZHZvLT5pMmNfYnVzID0gaTJjYnVzOworCWR2by0+aTJjX2J1cy0+c2xhdmVfYWRkciA9IGR2by0+c2xhdmVfYWRkcjsKKwlkdm8tPmRldl9wcml2ID0gc2lsOworCXNpbC0+cXVpZXQgPSB0cnVlOworCisJaWYgKCFzaWwxNjRfcmVhZGIoZHZvLCBTSUwxNjRfVklEX0xPLCAmY2gpKQorCQlnb3RvIG91dDsKKworCWlmIChjaCAhPSAoU0lMMTY0X1ZJRCAmIDB4ZmYpKSB7CisJCURSTV9ERUJVRygic2lsMTY0IG5vdCBkZXRlY3RlZCBnb3QgJWQ6IGZyb20gJXMgU2xhdmUgJWQuXG4iLAorCQkJICBjaCwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGkyY2J1cy0+c2xhdmVfYWRkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X0RJRF9MTywgJmNoKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoY2ggIT0gKFNJTDE2NF9ESUQgJiAweGZmKSkgeworCQlEUk1fREVCVUcoInNpbDE2NCBub3QgZGV0ZWN0ZWQgZ290ICVkOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJCSAgY2gsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCQlnb3RvIG91dDsKKwl9CisJc2lsLT5xdWlldCA9IGZhbHNlOworCisJRFJNX0RFQlVHKCJpbml0IHNpbDE2NCBkdm8gY29udHJvbGxlciBzdWNjZXNzZnVsbHkhXG4iKTsKKwlyZXR1cm4gdHJ1ZTsKKworb3V0OgorCWtmcmVlKHNpbCk7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzaWwxNjRfZGV0ZWN0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJdWludDhfdCByZWc5OworCisJc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X1JFRzksICZyZWc5KTsKKworCWlmIChyZWc5ICYgU0lMMTY0XzlfSFRQTEcpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwllbHNlCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIHNpbDE2NF9tb2RlX3ZhbGlkKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgdm9pZCBzaWwxNjRfbW9kZV9zZXQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwkvKiBBcyBsb25nIGFzIHRoZSBiYXNpY3MgYXJlIHNldCB1cCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjbG9jaworCSAqIGRlcGVuZGVuY2llcyBpbiB0aGUgbW9kZSBzZXR1cCwgd2UgY2FuIGp1c3QgbGVhdmUgdGhlCisJICogcmVnaXN0ZXJzIGFsb25lIGFuZCBldmVyeXRoaW5nIHdpbGwgd29yayBmaW5lLgorCSAqLworCS8qIHJlY29tbWVuZGVkIHByb2dyYW1taW5nIHNlcXVlbmNlIGZyb20gZG9jICovCisJLypzaWwxNjRfd3JpdGViKHNpbCwgMHgwOCwgMHgzMCk7CisJICBzaWwxNjRfd3JpdGViKHNpbCwgMHgwOSwgMHgwMCk7CisJICBzaWwxNjRfd3JpdGViKHNpbCwgMHgwYSwgMHg5MCk7CisJICBzaWwxNjRfd3JpdGViKHNpbCwgMHgwYywgMHg4OSk7CisJICBzaWwxNjRfd3JpdGViKHNpbCwgMHgwOCwgMHgzMSk7Ki8KKwkvKiBkb24ndCBkbyBtdWNoICovCisJcmV0dXJuOworfQorCisvKiBzZXQgdGhlIFNJTDE2NCBwb3dlciBzdGF0ZSAqLworc3RhdGljIHZvaWQgc2lsMTY0X2RwbXMoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IG1vZGUpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJcmV0ID0gc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X1JFRzgsICZjaCk7CisJaWYgKHJldCA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJY2ggfD0gU0lMMTY0XzhfUEQ7CisJZWxzZQorCQljaCAmPSB+U0lMMTY0XzhfUEQ7CisKKwlzaWwxNjRfd3JpdGViKGR2bywgU0lMMTY0X1JFRzgsIGNoKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNpbDE2NF9kdW1wX3JlZ3Moc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwl1aW50OF90IHZhbDsKKworCXNpbDE2NF9yZWFkYihkdm8sIFNJTDE2NF9GUkVRX0xPLCAmdmFsKTsKKwlEUk1fREVCVUcoIlNJTDE2NF9GUkVRX0xPOiAweCUwMnhcbiIsIHZhbCk7CisJc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X0ZSRVFfSEksICZ2YWwpOworCURSTV9ERUJVRygiU0lMMTY0X0ZSRVFfSEk6IDB4JTAyeFxuIiwgdmFsKTsKKwlzaWwxNjRfcmVhZGIoZHZvLCBTSUwxNjRfUkVHOCwgJnZhbCk7CisJRFJNX0RFQlVHKCJTSUwxNjRfUkVHODogMHglMDJ4XG4iLCB2YWwpOworCXNpbDE2NF9yZWFkYihkdm8sIFNJTDE2NF9SRUc5LCAmdmFsKTsKKwlEUk1fREVCVUcoIlNJTDE2NF9SRUc5OiAweCUwMnhcbiIsIHZhbCk7CisJc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X1JFR0MsICZ2YWwpOworCURSTV9ERUJVRygiU0lMMTY0X1JFR0M6IDB4JTAyeFxuIiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2lsMTY0X3NhdmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnNpbD0gZHZvLT5kZXZfcHJpdjsKKworCWlmICghc2lsMTY0X3JlYWRiKGR2bywgU0lMMTY0X1JFRzgsICZzaWwtPnNhdmVfcmVncy5yZWc4KSkKKwkJcmV0dXJuOworCisJaWYgKCFzaWwxNjRfcmVhZGIoZHZvLCBTSUwxNjRfUkVHOSwgJnNpbC0+c2F2ZV9yZWdzLnJlZzkpKQorCQlyZXR1cm47CisKKwlpZiAoIXNpbDE2NF9yZWFkYihkdm8sIFNJTDE2NF9SRUdDLCAmc2lsLT5zYXZlX3JlZ3MucmVnYykpCisJCXJldHVybjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2lsMTY0X3Jlc3RvcmUoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bykKK3sKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnNpbCA9IGR2by0+ZGV2X3ByaXY7CisKKwkvKiBSZXN0b3JlIGl0IHBvd2VyZWQgZG93biBpbml0aWFsbHkgKi8KKwlzaWwxNjRfd3JpdGViKGR2bywgU0lMMTY0X1JFRzgsIHNpbC0+c2F2ZV9yZWdzLnJlZzggJiB+MHgxKTsKKworCXNpbDE2NF93cml0ZWIoZHZvLCBTSUwxNjRfUkVHOSwgc2lsLT5zYXZlX3JlZ3MucmVnOSk7CisJc2lsMTY0X3dyaXRlYihkdm8sIFNJTDE2NF9SRUdDLCBzaWwtPnNhdmVfcmVncy5yZWdjKTsKKwlzaWwxNjRfd3JpdGViKGR2bywgU0lMMTY0X1JFRzgsIHNpbC0+c2F2ZV9yZWdzLnJlZzgpOworfQorCitzdGF0aWMgdm9pZCBzaWwxNjRfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXN0cnVjdCBzaWwxNjRfcHJpdiAqc2lsID0gZHZvLT5kZXZfcHJpdjsKKworCWlmIChzaWwpIHsKKwkJa2ZyZWUoc2lsKTsKKwkJZHZvLT5kZXZfcHJpdiA9IE5VTEw7CisJfQorfQorCitzdHJ1Y3QgaW50ZWxfZHZvX2Rldl9vcHMgc2lsMTY0X29wcyA9IHsKKwkuaW5pdCA9IHNpbDE2NF9pbml0LAorCS5kZXRlY3QgPSBzaWwxNjRfZGV0ZWN0LAorCS5tb2RlX3ZhbGlkID0gc2lsMTY0X21vZGVfdmFsaWQsCisJLm1vZGVfc2V0ID0gc2lsMTY0X21vZGVfc2V0LAorCS5kcG1zID0gc2lsMTY0X2RwbXMsCisJLmR1bXBfcmVncyA9IHNpbDE2NF9kdW1wX3JlZ3MsCisJLnNhdmUgPSBzaWwxNjRfc2F2ZSwKKwkucmVzdG9yZSA9IHNpbDE2NF9yZXN0b3JlLAorCS5kZXN0cm95ID0gc2lsMTY0X2Rlc3Ryb3ksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2ZkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNyBEYXZlIE11ZWxsZXIKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIERhdmUgTXVlbGxlciA8ZGF2ZS5tdWVsbGVyQGdteC5jaD4KKyAqCisgKi8KKworI2luY2x1ZGUgImR2by5oIgorCisvKiByZWdpc3RlciBkZWZpbml0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIFRGUDQxMCBkYXRhIHNoZWV0ICovCisjZGVmaW5lIFRGUDQxMF9WSUQJCTB4MDE0QworI2RlZmluZSBURlA0MTBfRElECQkweDA0MTAKKworI2RlZmluZSBURlA0MTBfVklEX0xPCQkweDAwCisjZGVmaW5lIFRGUDQxMF9WSURfSEkJCTB4MDEKKyNkZWZpbmUgVEZQNDEwX0RJRF9MTwkJMHgwMgorI2RlZmluZSBURlA0MTBfRElEX0hJCQkweDAzCisjZGVmaW5lIFRGUDQxMF9SRVYJCTB4MDQKKworI2RlZmluZSBURlA0MTBfQ1RMXzEJCTB4MDgKKyNkZWZpbmUgVEZQNDEwX0NUTF8xX1RESVMJKDE8PDYpCisjZGVmaW5lIFRGUDQxMF9DVExfMV9WRU4JKDE8PDUpCisjZGVmaW5lIFRGUDQxMF9DVExfMV9IRU4JKDE8PDQpCisjZGVmaW5lIFRGUDQxMF9DVExfMV9EU0VMCSgxPDwzKQorI2RlZmluZSBURlA0MTBfQ1RMXzFfQlNFTAkoMTw8MikKKyNkZWZpbmUgVEZQNDEwX0NUTF8xX0VER0UJKDE8PDEpCisjZGVmaW5lIFRGUDQxMF9DVExfMV9QRAkJKDE8PDApCisKKyNkZWZpbmUgVEZQNDEwX0NUTF8yCQkweDA5CisjZGVmaW5lIFRGUDQxMF9DVExfMl9WTE9XCSgxPDw3KQorI2RlZmluZSBURlA0MTBfQ1RMXzJfTVNFTF9NQVNLCSgweDc8PDQpCisjZGVmaW5lIFRGUDQxMF9DVExfMl9NU0VMCSgxPDw0KQorI2RlZmluZSBURlA0MTBfQ1RMXzJfVFNFTAkoMTw8MykKKyNkZWZpbmUgVEZQNDEwX0NUTF8yX1JTRU4JKDE8PDIpCisjZGVmaW5lIFRGUDQxMF9DVExfMl9IVFBMRwkoMTw8MSkKKyNkZWZpbmUgVEZQNDEwX0NUTF8yX01ESQkoMTw8MCkKKworI2RlZmluZSBURlA0MTBfQ1RMXzMJCTB4MEEKKyNkZWZpbmUgVEZQNDEwX0NUTF8zX0RLX01BU0sgCSgweDc8PDUpCisjZGVmaW5lIFRGUDQxMF9DVExfM19ESwkJKDE8PDUpCisjZGVmaW5lIFRGUDQxMF9DVExfM19ES0VOCSgxPDw0KQorI2RlZmluZSBURlA0MTBfQ1RMXzNfQ1RMX01BU0sJKDB4Nzw8MSkKKyNkZWZpbmUgVEZQNDEwX0NUTF8zX0NUTAkoMTw8MSkKKworI2RlZmluZSBURlA0MTBfVVNFUkNGRwkJMHgwQgorCisjZGVmaW5lIFRGUDQxMF9ERV9ETFkJCTB4MzIKKworI2RlZmluZSBURlA0MTBfREVfQ1RMCQkweDMzCisjZGVmaW5lIFRGUDQxMF9ERV9DVExfREVHRU4JKDE8PDYpCisjZGVmaW5lIFRGUDQxMF9ERV9DVExfVlNQT0wJKDE8PDUpCisjZGVmaW5lIFRGUDQxMF9ERV9DVExfSFNQT0wJKDE8PDQpCisjZGVmaW5lIFRGUDQxMF9ERV9DVExfREVETFk4CSgxPDwwKQorCisjZGVmaW5lIFRGUDQxMF9ERV9UT1AJCTB4MzQKKworI2RlZmluZSBURlA0MTBfREVfQ05UX0xPCTB4MzYKKyNkZWZpbmUgVEZQNDEwX0RFX0NOVF9ISQkweDM3CisKKyNkZWZpbmUgVEZQNDEwX0RFX0xJTl9MTwkweDM4CisjZGVmaW5lIFRGUDQxMF9ERV9MSU5fSEkJMHgzOQorCisjZGVmaW5lIFRGUDQxMF9IX1JFU19MTwkJMHgzQQorI2RlZmluZSBURlA0MTBfSF9SRVNfSEkJCTB4M0IKKworI2RlZmluZSBURlA0MTBfVl9SRVNfTE8JCTB4M0MKKyNkZWZpbmUgVEZQNDEwX1ZfUkVTX0hJCQkweDNECisKK3N0cnVjdCB0ZnA0MTBfc2F2ZV9yZWMgeworCXVpbnQ4X3QgY3RsMTsKKwl1aW50OF90IGN0bDI7Cit9OworCitzdHJ1Y3QgdGZwNDEwX3ByaXYgeworCWJvb2wgcXVpZXQ7CisKKwlzdHJ1Y3QgdGZwNDEwX3NhdmVfcmVjIHNhdmVkX3JlZzsKKwlzdHJ1Y3QgdGZwNDEwX3NhdmVfcmVjIG1vZGVfcmVnOworfTsKKworc3RhdGljIGJvb2wgdGZwNDEwX3JlYWRiKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sIGludCBhZGRyLCB1aW50OF90ICpjaCkKK3sKKwlzdHJ1Y3QgdGZwNDEwX3ByaXYgKnRmcCA9IGR2by0+ZGV2X3ByaXY7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBkdm8tPmkyY19idXM7CisJdTggb3V0X2J1ZlsyXTsKKwl1OCBpbl9idWZbMl07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0sCisJCXsKKwkJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBpbl9idWYsCisJCX0KKwl9OworCisJb3V0X2J1ZlswXSA9IGFkZHI7CisJb3V0X2J1ZlsxXSA9IDA7CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZpMmNidXMtPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpIHsKKwkJKmNoID0gaW5fYnVmWzBdOworCQlyZXR1cm4gdHJ1ZTsKKwl9OworCisJaWYgKCF0ZnAtPnF1aWV0KSB7CisJCURSTV9ERUJVRygiVW5hYmxlIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4IGZyb20gJXM6JTAyeC5cbiIsCisJCQkgIGFkZHIsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHRmcDQxMF93cml0ZWIoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IGFkZHIsIHVpbnQ4X3QgY2gpCit7CisJc3RydWN0IHRmcDQxMF9wcml2ICp0ZnAgPSBkdm8tPmRldl9wcml2OworCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqaTJjYnVzID0gZHZvLT5pMmNfYnVzOworCXVpbnQ4X3Qgb3V0X2J1ZlsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gaTJjYnVzLT5zbGF2ZV9hZGRyLAorCQkuZmxhZ3MgPSAwLAorCQkubGVuID0gMiwKKwkJLmJ1ZiA9IG91dF9idWYsCisJfTsKKworCW91dF9idWZbMF0gPSBhZGRyOworCW91dF9idWZbMV0gPSBjaDsKKworCWlmIChpMmNfdHJhbnNmZXIoJmkyY2J1cy0+YWRhcHRlciwgJm1zZywgMSkgPT0gMSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIXRmcC0+cXVpZXQpIHsKKwkJRFJNX0RFQlVHKCJVbmFibGUgdG8gd3JpdGUgcmVnaXN0ZXIgMHglMDJ4IHRvICVzOiVkLlxuIiwKKwkJCSAgYWRkciwgaTJjYnVzLT5hZGFwdGVyLm5hbWUsIGkyY2J1cy0+c2xhdmVfYWRkcik7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHRmcDQxMF9nZXRpZChzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkcikKK3sKKwl1aW50OF90IGNoMSwgY2gyOworCisJaWYgKHRmcDQxMF9yZWFkYihkdm8sIGFkZHIrMCwgJmNoMSkgJiYKKwkgICAgdGZwNDEwX3JlYWRiKGR2bywgYWRkcisxLCAmY2gyKSkKKwkJcmV0dXJuICgoY2gyIDw8IDgpICYgMHhGRjAwKSB8IChjaDEgJiAweDAwRkYpOworCisJcmV0dXJuIC0xOworfQorCisvKiBUaSBURlA0MTAgZHJpdmVyIGZvciBjaGlwIG9uIGkyYyBidXMgKi8KK3N0YXRpYyBib29sIHRmcDQxMF9pbml0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY2J1cykKK3sKKwkvKiB0aGlzIHdpbGwgZGV0ZWN0IHRoZSB0ZnA0MTAgY2hpcCBvbiB0aGUgc3BlY2lmaWVkIGkyYyBidXMgKi8KKwlzdHJ1Y3QgdGZwNDEwX3ByaXYgKnRmcDsKKwlpbnQgaWQ7CisKKwl0ZnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGZwNDEwX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGZwID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWR2by0+aTJjX2J1cyA9IGkyY2J1czsKKwlkdm8tPmkyY19idXMtPnNsYXZlX2FkZHIgPSBkdm8tPnNsYXZlX2FkZHI7CisJZHZvLT5kZXZfcHJpdiA9IHRmcDsKKwl0ZnAtPnF1aWV0ID0gdHJ1ZTsKKworCWlmICgoaWQgPSB0ZnA0MTBfZ2V0aWQoZHZvLCBURlA0MTBfVklEX0xPKSkgIT0gVEZQNDEwX1ZJRCkgeworCQlEUk1fREVCVUcoInRmcDQxMCBub3QgZGV0ZWN0ZWQgZ290IFZJRCAlWDogZnJvbSAlcyBTbGF2ZSAlZC5cbiIsCisJCQkgIGlkLCBpMmNidXMtPmFkYXB0ZXIubmFtZSwgaTJjYnVzLT5zbGF2ZV9hZGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChpZCA9IHRmcDQxMF9nZXRpZChkdm8sIFRGUDQxMF9ESURfTE8pKSAhPSBURlA0MTBfRElEKSB7CisJCURSTV9ERUJVRygidGZwNDEwIG5vdCBkZXRlY3RlZCBnb3QgRElEICVYOiBmcm9tICVzIFNsYXZlICVkLlxuIiwKKwkJCSAgaWQsIGkyY2J1cy0+YWRhcHRlci5uYW1lLCBpMmNidXMtPnNsYXZlX2FkZHIpOworCQlnb3RvIG91dDsKKwl9CisJdGZwLT5xdWlldCA9IGZhbHNlOworCXJldHVybiB0cnVlOworb3V0OgorCWtmcmVlKHRmcCk7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyB0ZnA0MTBfZGV0ZWN0KHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyByZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwl1aW50OF90IGN0bDI7CisKKwlpZiAodGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0NUTF8yLCAmY3RsMikpIHsKKwkJaWYgKGN0bDIgJiBURlA0MTBfQ1RMXzJfSFRQTEcpCisJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJZWxzZQorCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIHRmcDQxMF9tb2RlX3ZhbGlkKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8sCisJCQkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgdm9pZCB0ZnA0MTBfbW9kZV9zZXQoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKyAgICAvKiBBcyBsb25nIGFzIHRoZSBiYXNpY3MgYXJlIHNldCB1cCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjbG9jayBkZXBlbmRlbmNpZXMKKyAgICAgKiBpbiB0aGUgbW9kZSBzZXR1cCwgd2UgY2FuIGp1c3QgbGVhdmUgdGhlIHJlZ2lzdGVycyBhbG9uZSBhbmQgZXZlcnl0aGluZworICAgICAqIHdpbGwgd29yayBmaW5lLgorICAgICAqLworICAgIC8qIGRvbid0IGRvIG11Y2ggKi8KKyAgICByZXR1cm47Cit9CisKKy8qIHNldCB0aGUgdGZwNDEwIHBvd2VyIHN0YXRlICovCitzdGF0aWMgdm9pZCB0ZnA0MTBfZHBtcyhzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgbW9kZSkKK3sKKwl1aW50OF90IGN0bDE7CisKKwlpZiAoIXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9DVExfMSwgJmN0bDEpKQorCQlyZXR1cm47CisKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQorCQljdGwxIHw9IFRGUDQxMF9DVExfMV9QRDsKKwllbHNlCisJCWN0bDEgJj0gflRGUDQxMF9DVExfMV9QRDsKKworCXRmcDQxMF93cml0ZWIoZHZvLCBURlA0MTBfQ1RMXzEsIGN0bDEpOworfQorCitzdGF0aWMgdm9pZCB0ZnA0MTBfZHVtcF9yZWdzKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJdWludDhfdCB2YWwsIHZhbDI7CisKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfUkVWLCAmdmFsKTsKKwlEUk1fREVCVUcoIlRGUDQxMF9SRVY6IDB4JTAyWFxuIiwgdmFsKTsKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfQ1RMXzEsICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0NUTDE6IDB4JTAyWFxuIiwgdmFsKTsKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfQ1RMXzIsICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0NUTDI6IDB4JTAyWFxuIiwgdmFsKTsKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfQ1RMXzMsICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0NUTDM6IDB4JTAyWFxuIiwgdmFsKTsKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfVVNFUkNGRywgJnZhbCk7CisJRFJNX0RFQlVHKCJURlA0MTBfVVNFUkNGRzogMHglMDJYXG4iLCB2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9ETFksICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0RFX0RMWTogMHglMDJYXG4iLCB2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9DVEwsICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0RFX0NUTDogMHglMDJYXG4iLCB2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9UT1AsICZ2YWwpOworCURSTV9ERUJVRygiVEZQNDEwX0RFX1RPUDogMHglMDJYXG4iLCB2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9DTlRfTE8sICZ2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9ERV9DTlRfSEksICZ2YWwyKTsKKwlEUk1fREVCVUcoIlRGUDQxMF9ERV9DTlQ6IDB4JTAyWCUwMlhcbiIsIHZhbDIsIHZhbCk7CisJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0RFX0xJTl9MTywgJnZhbCk7CisJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX0RFX0xJTl9ISSwgJnZhbDIpOworCURSTV9ERUJVRygiVEZQNDEwX0RFX0xJTjogMHglMDJYJTAyWFxuIiwgdmFsMiwgdmFsKTsKKwl0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfSF9SRVNfTE8sICZ2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9IX1JFU19ISSwgJnZhbDIpOworCURSTV9ERUJVRygiVEZQNDEwX0hfUkVTOiAweCUwMlglMDJYXG4iLCB2YWwyLCB2YWwpOworCXRmcDQxMF9yZWFkYihkdm8sIFRGUDQxMF9WX1JFU19MTywgJnZhbCk7CisJdGZwNDEwX3JlYWRiKGR2bywgVEZQNDEwX1ZfUkVTX0hJLCAmdmFsMik7CisJRFJNX0RFQlVHKCJURlA0MTBfVl9SRVM6IDB4JTAyWCUwMlhcbiIsIHZhbDIsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHRmcDQxMF9zYXZlKHN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8pCit7CisJc3RydWN0IHRmcDQxMF9wcml2ICp0ZnAgPSBkdm8tPmRldl9wcml2OworCisJaWYgKCF0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfQ1RMXzEsICZ0ZnAtPnNhdmVkX3JlZy5jdGwxKSkKKwkJcmV0dXJuOworCisJaWYgKCF0ZnA0MTBfcmVhZGIoZHZvLCBURlA0MTBfQ1RMXzIsICZ0ZnAtPnNhdmVkX3JlZy5jdGwyKSkKKwkJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0ZnA0MTBfcmVzdG9yZShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXN0cnVjdCB0ZnA0MTBfcHJpdiAqdGZwID0gZHZvLT5kZXZfcHJpdjsKKworCS8qIFJlc3RvcmUgaXQgcG93ZXJlZCBkb3duIGluaXRpYWxseSAqLworCXRmcDQxMF93cml0ZWIoZHZvLCBURlA0MTBfQ1RMXzEsIHRmcC0+c2F2ZWRfcmVnLmN0bDEgJiB+MHgxKTsKKworCXRmcDQxMF93cml0ZWIoZHZvLCBURlA0MTBfQ1RMXzIsIHRmcC0+c2F2ZWRfcmVnLmN0bDIpOworCXRmcDQxMF93cml0ZWIoZHZvLCBURlA0MTBfQ1RMXzEsIHRmcC0+c2F2ZWRfcmVnLmN0bDEpOworfQorCitzdGF0aWMgdm9pZCB0ZnA0MTBfZGVzdHJveShzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvKQoreworCXN0cnVjdCB0ZnA0MTBfcHJpdiAqdGZwID0gZHZvLT5kZXZfcHJpdjsKKworCWlmICh0ZnApIHsKKwkJa2ZyZWUodGZwKTsKKwkJZHZvLT5kZXZfcHJpdiA9IE5VTEw7CisJfQorfQorCitzdHJ1Y3QgaW50ZWxfZHZvX2Rldl9vcHMgdGZwNDEwX29wcyA9IHsKKwkuaW5pdCA9IHRmcDQxMF9pbml0LAorCS5kZXRlY3QgPSB0ZnA0MTBfZGV0ZWN0LAorCS5tb2RlX3ZhbGlkID0gdGZwNDEwX21vZGVfdmFsaWQsCisJLm1vZGVfc2V0ID0gdGZwNDEwX21vZGVfc2V0LAorCS5kcG1zID0gdGZwNDEwX2RwbXMsCisJLmR1bXBfcmVncyA9IHRmcDQxMF9kdW1wX3JlZ3MsCisJLnNhdmUgPSB0ZnA0MTBfc2F2ZSwKKwkucmVzdG9yZSA9IHRmcDQxMF9yZXN0b3JlLAorCS5kZXN0cm95ID0gdGZwNDEwX2Rlc3Ryb3ksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKaW5kZXggYWZhOGExMi4uM2Q3MDgyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCkBAIC0yOCw2ICsyOCw4IEBACiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogCkBAIC0zOSw2ICs0MSw3IEBACiBpbnQgaTkxNV93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CiAJdTMyIGFjdGhkX3JlZyA9IElTX0k5NjVHKGRldikgPyBBQ1RIRF9JOTY1IDogQUNUSEQ7CiAJdTMyIGxhc3RfYWN0aGQgPSBJOTE1X1JFQUQoYWN0aGRfcmVnKTsKQEAgLTU1LDggKzU4LDggQEAKIAkJaWYgKHJpbmctPnNwYWNlID49IG4pCiAJCQlyZXR1cm4gMDsKIAotCQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYpCi0JCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9XQUlUOworCQlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCisJCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9XQUlUOwogCiAJCWlmIChyaW5nLT5oZWFkICE9IGxhc3RfaGVhZCkKIAkJCWkgPSAwOwpAQCAtMTIxLDE2ICsxMjQsMjggQEAKIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7CiAJZHJtX2k5MTVfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwogCisJLyoKKwkgKiBXZSBzaG91bGQgbmV2ZXIgbG9zZSBjb250ZXh0IG9uIHRoZSByaW5nIHdpdGggbW9kZXNldHRpbmcKKwkgKiBhcyB3ZSBkb24ndCBleHBvc2UgaXQgdG8gdXNlcnNwYWNlCisJICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybjsKKwogCXJpbmctPmhlYWQgPSBJOTE1X1JFQUQoUFJCMF9IRUFEKSAmIEhFQURfQUREUjsKIAlyaW5nLT50YWlsID0gSTkxNV9SRUFEKFBSQjBfVEFJTCkgJiBUQUlMX0FERFI7CiAJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKIAlpZiAocmluZy0+c3BhY2UgPCAwKQogCQlyaW5nLT5zcGFjZSArPSByaW5nLT5TaXplOwogCi0JaWYgKHJpbmctPmhlYWQgPT0gcmluZy0+dGFpbCAmJiBkZXZfcHJpdi0+c2FyZWFfcHJpdikKLQkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKKwlpZiAoIWRldi0+cHJpbWFyeS0+bWFzdGVyKQorCQlyZXR1cm47CisKKwltYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlpZiAocmluZy0+aGVhZCA9PSByaW5nLT50YWlsICYmIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyB8PSBJOTE1X0JPWF9SSU5HX0VNUFRZOwogfQogCiBzdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCkBAIC0xNTQsMjUgKzE2OSwxMyBAQAogCWlmIChJOTE1X05FRURfR0ZYX0hXUyhkZXYpKQogCQlpOTE1X2ZyZWVfaHdzKGRldik7CiAKLQlkZXZfcHJpdi0+c2FyZWEgPSBOVUxMOwotCWRldl9wcml2LT5zYXJlYV9wcml2ID0gTlVMTDsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGk5MTVfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k5MTVfaW5pdF90ICogaW5pdCkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwotCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7Ci0JCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIHNhcmVhIVxuIik7Ci0JCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X3ByaXYtPnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQotCSAgICAoKHU4ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAKIAlpZiAoaW5pdC0+cmluZ19zaXplICE9IDApIHsKIAkJaWYgKGRldl9wcml2LT5yaW5nLnJpbmdfb2JqICE9IE5VTEwpIHsKQEAgLTIwNyw3ICsyMTAsOCBAQAogCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OwogCWRldl9wcml2LT5mcm9udF9vZmZzZXQgPSBpbml0LT5mcm9udF9vZmZzZXQ7CiAJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7Ci0JZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gMDsKIAogCS8qIEFsbG93IGhhcmR3YXJlIGJhdGNoYnVmZmVycyB1bmxlc3MgdG9sZCBvdGhlcndpc2UuCiAJICovCkBAIC0yMjIsMTEgKzIyNiw2IEBACiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoIWRldl9wcml2LT5zYXJlYSkgewotCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAoZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZSA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCiAJCQkgICIgcmluZyBidWZmZXJcbiIpOwpAQCAtNDM1LDEzICs0MzQsMTQgQEAKIHN0YXRpYyB2b2lkIGk5MTVfZW1pdF9icmVhZGNydW1iKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlSSU5HX0xPQ0FMUzsKIAogCWRldl9wcml2LT5jb3VudGVyKys7CiAJaWYgKGRldl9wcml2LT5jb3VudGVyID4gMHg3RkZGRkZGRlVMKQogCQlkZXZfcHJpdi0+Y291bnRlciA9IDA7Ci0JaWYgKGRldl9wcml2LT5zYXJlYV9wcml2KQotCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXI7CisJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXI7CiAKIAlCRUdJTl9MUF9SSU5HKDQpOwogCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKQEAgLTUzNywxNSArNTM3LDE3IEBACiBzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0KKwkJZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OwogCVJJTkdfTE9DQUxTOwogCi0JaWYgKCFkZXZfcHJpdi0+c2FyZWFfcHJpdikKKwlpZiAoIW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKIAkJICBfX2Z1bmNfXywKIAkJICBkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAotCQkgIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UpOworCQkgIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UpOwogCiAJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKQEAgLTU3Miw3ICs1NzQsNyBAQAogCU9VVF9SSU5HKDApOwogCUFEVkFOQ0VfTFBfUklORygpOwogCi0JZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyKys7CisJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyKys7CiAKIAlCRUdJTl9MUF9SSU5HKDQpOwogCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKQEAgLTU4MSw3ICs1ODMsNyBAQAogCU9VVF9SSU5HKDApOwogCUFEVkFOQ0VfTFBfUklORygpOwogCi0JZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMSw4ICs2MTMsOSBAQAogCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pOTE1X3NhcmVhX3QgKikKLQkgICAgZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJICAgIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKmJhdGNoID0gZGF0YTsKIAlpbnQgcmV0OwogCkBAIC02NDQsOCArNjQ3LDkgQEAKIAkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OwogCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQotCSAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwkgICAgbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX2k5MTVfY21kYnVmZmVyX3QgKmNtZGJ1ZiA9IGRhdGE7CiAJaW50IHJldDsKIApAQCAtNzc0LDYgKzc3OCwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlXQVJOKDEsICJ0cmllZCB0byBzZXQgc3RhdHVzIHBhZ2Ugd2hlbiBtb2RlIHNldHRpbmcgYWN0aXZlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcHJpbnRrKEtFUk5fREVCVUcgInNldCBzdGF0dXMgcGFnZSBhZGRyIDB4JTA4eFxuIiwgKHUzMilod3MtPmFkZHIpOwogCiAJZGV2X3ByaXYtPnN0YXR1c19nZnhfYWRkciA9IGh3cy0+YWRkciAmICgweDFmZmZmPDwxMik7CkBAIC04MDIsNiArODExLDIxNCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGk5MTVfcHJvYmVfYWdwIC0gZ2V0IEFHUCBib290dXAgY29uZmlndXJhdGlvbgorICogQHBkZXY6IFBDSSBkZXZpY2UKKyAqIEBhcGVydHVyZV9zaXplOiByZXR1cm5zIEFHUCBhcGVydHVyZSBjb25maWd1cmVkIHNpemUKKyAqIEBwcmVhbGxvY2F0ZWRfc2l6ZTogcmV0dXJucyBzaXplIG9mIEJJT1MgcHJlYWxsb2NhdGVkIEFHUCBzcGFjZQorICoKKyAqIFNpbmNlIEludGVsIGludGVncmF0ZWQgZ3JhcGhpY3MgYXJlIFVNQSwgdGhlIEJJT1MgaGFzIHRvIHNldCBhc2lkZQorICogc29tZSBSQU0gZm9yIHRoZSBmcmFtZWJ1ZmZlciBhdCBlYXJseSBib290LiAgVGhpcyBjb2RlIGZpZ3VyZXMgb3V0CisgKiBob3cgbXVjaCB3YXMgc2V0IGFzaWRlIHNvIHdlIGNhbiB1c2UgaXQgZm9yIG91ciBvd24gcHVycG9zZXMuCisgKi8KK3N0YXRpYyBpbnQgaTkxNV9wcm9iZV9hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAqYXBlcnR1cmVfc2l6ZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqcHJlYWxsb2NhdGVkX3NpemUpCit7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZV9kZXY7CisJdTE2IHRtcCA9IDA7CisJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKKworCWJyaWRnZV9kZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7CisJaWYgKCFicmlkZ2VfZGV2KSB7CisJCURSTV9FUlJPUigiYnJpZGdlIGRldmljZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogR2V0IHRoZSBmYiBhcGVydHVyZSBzaXplIGFuZCAic3RvbGVuIiBtZW1vcnkgYW1vdW50LiAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZV9kZXYsIElOVEVMX0dNQ0hfQ1RSTCwgJnRtcCk7CisJcGNpX2Rldl9wdXQoYnJpZGdlX2Rldik7CisKKwkqYXBlcnR1cmVfc2l6ZSA9IDEwMjQgKiAxMDI0OworCSpwcmVhbGxvY2F0ZWRfc2l6ZSA9IDEwMjQgKiAxMDI0OworCisJc3dpdGNoIChkZXYtPnBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9DR0M6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19JRzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NTVHTV9JRzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NjVfSUc6CisJCWlmICgodG1wICYgSU5URUxfR01DSF9NRU1fTUFTSykgPT0gSU5URUxfR01DSF9NRU1fNjRNKQorCQkJKmFwZXJ0dXJlX3NpemUgKj0gNjQ7CisJCWVsc2UKKwkJCSphcGVydHVyZV9zaXplICo9IDEyODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogOXh4IHN1cHBvcnRzIGxhcmdlIHNpemVzLCBqdXN0IGxvb2sgYXQgdGhlIGxlbmd0aCAqLworCQkqYXBlcnR1cmVfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAyKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBTb21lIG9mIHRoZSBwcmVhbGxvY2F0ZWQgc3BhY2UgaXMgdGFrZW4gYnkgdGhlIEdUVAorCSAqIGFuZCBwb3B1cC4gIEdUVCBpcyAxSyBwZXIgTUIgb2YgYXBlcnR1cmUgc2l6ZSwgYW5kIHBvcHVwIGlzIDRLLgorCSAqLworCWlmIChJU19HNFgoZGV2KSkKKwkJb3ZlcmhlYWQgPSA0MDk2OworCWVsc2UKKwkJb3ZlcmhlYWQgPSAoKmFwZXJ0dXJlX3NpemUgLyAxMDI0KSArIDQwOTY7CisKKwlzd2l0Y2ggKHRtcCAmIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLKSB7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzFNOgorCQlicmVhazsgLyogMU0gYWxyZWFkeSAqLworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl80TToKKwkJKnByZWFsbG9jYXRlZF9zaXplICo9IDQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl84TToKKwkJKnByZWFsbG9jYXRlZF9zaXplICo9IDg7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xNk06CisJCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKKwkJKnByZWFsbG9jYXRlZF9zaXplICo9IDMyOworCQlicmVhazsKKwljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzQ4TToKKwkJKnByZWFsbG9jYXRlZF9zaXplICo9IDQ4OworCQlicmVhazsKKwljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzY0TToKKwkJKnByZWFsbG9jYXRlZF9zaXplICo9IDY0OworCQlicmVhazsKKwljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19ESVNBQkxFRDoKKwkJRFJNX0VSUk9SKCJ2aWRlbyBtZW1vcnkgaXMgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJ1bmV4cGVjdGVkIEdNQ0hfR01TIHZhbHVlOiAweCUwMnhcbiIsCisJCQl0bXAgJiBJTlRFTF84NTVfR01DSF9HTVNfTUFTSyk7CisJCXJldHVybiAtMTsKKwl9CisJKnByZWFsbG9jYXRlZF9zaXplIC09IG92ZXJoZWFkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNV9sb2FkX21vZGVzZXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBhZ3Bfc2l6ZSwgcHJlYWxsb2Nfc2l6ZTsKKwlpbnQgZmJfYmFyID0gSVNfSTlYWChkZXYpID8gMiA6IDA7CisJaW50IHJldCA9IDA7CisKKwlkZXYtPmRldm5hbWUgPSBrc3RyZHVwKERSSVZFUl9OQU1FLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+ZGV2bmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgZmJfYmFyKSAmCisJCTB4ZmYwMDAwMDA7CisKKwlEUk1fREVCVUcoIioqKiBmYiBiYXNlIDB4JTA4bHhcbiIsIGRldi0+bW9kZV9jb25maWcuZmJfYmFzZSk7CisKKwlpZiAoSVNfTU9CSUxFKGRldikgfHwgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTk2NUcoZGV2KSAmJiAhSVNfRzMzKGRldikpKQorCQlkZXZfcHJpdi0+Y3Vyc29yX25lZWRzX3BoeXNpY2FsID0gdHJ1ZTsKKwllbHNlCisJCWRldl9wcml2LT5jdXJzb3JfbmVlZHNfcGh5c2ljYWwgPSBmYWxzZTsKKworCXJldCA9IGk5MTVfcHJvYmVfYWdwKGRldiwgJmFncF9zaXplLCAmcHJlYWxsb2Nfc2l6ZSk7CisJaWYgKHJldCkKKwkJZ290byBrZnJlZV9kZXZuYW1lOworCisJLyogQmFzaWMgbWVtcmFuZ2UgYWxsb2NhdG9yIGZvciBzdG9sZW4gc3BhY2UgKGFrYSB2cmFtKSAqLworCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+dnJhbSwgMCwgcHJlYWxsb2Nfc2l6ZSk7CisKKwkvKiBMZXQgR0VNIE1hbmFnZSBmcm9tIGVuZCBvZiBwcmVhbGxvYyBzcGFjZSB0byBlbmQgb2YgYXBlcnR1cmUgKi8KKwlpOTE1X2dlbV9kb19pbml0KGRldiwgcHJlYWxsb2Nfc2l6ZSwgYWdwX3NpemUpOworCisJcmV0ID0gaTkxNV9nZW1faW5pdF9yaW5nYnVmZmVyKGRldik7CisJaWYgKHJldCkKKwkJZ290byBrZnJlZV9kZXZuYW1lOworCisgICAgICAgIGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyA9CisJCWlvX21hcHBpbmdfY3JlYXRlX3djKGRldi0+YWdwLT5iYXNlLAorCQkJCSAgICAgZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSAqIDEwMjQqMTAyNCk7CisKKwkvKiBBbGxvdyBoYXJkd2FyZSBiYXRjaGJ1ZmZlcnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLgorCSAqLworCWRldl9wcml2LT5hbGxvd19iYXRjaGJ1ZmZlciA9IDE7CisKKwlyZXQgPSBpbnRlbF9pbml0X2Jpb3MoZGV2KTsKKwlpZiAocmV0KQorCQlEUk1fSU5GTygiZmFpbGVkIHRvIGZpbmQgVkJJT1MgdGFibGVzXG4iKTsKKworCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZGVzdHJveV9yaW5nYnVmZmVyOworCisJLyogRklYTUU6IHJlLWFkZCBob3RwbHVnIHN1cHBvcnQgKi8KKyNpZiAwCisJcmV0ID0gZHJtX2hvdHBsdWdfaW5pdChkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZGVzdHJveV9yaW5nYnVmZmVyOworI2VuZGlmCisKKwkvKiBBbHdheXMgc2FmZSBpbiB0aGUgbW9kZSBzZXR0aW5nIGNhc2UuICovCisJLyogRklYTUU6IGRvIHByZS9wb3N0LW1vZGUgc2V0IHN0dWZmIGluIGNvcmUgS01TIGNvZGUgKi8KKwlkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSAxOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSBzdGF0dXMgcGFnZSBJUlEgbG9jYXRpb24uCisJICovCisKKwlJOTE1X1dSSVRFKElOU1RQTSwgKDEgPDwgNSkgfCAoMSA8PCAyMSkpOworCisJaW50ZWxfbW9kZXNldF9pbml0KGRldik7CisKKwlkcm1faGVscGVyX2luaXRpYWxfY29uZmlnKGRldiwgZmFsc2UpOworCisJcmV0dXJuIDA7CisKK2Rlc3Ryb3lfcmluZ2J1ZmZlcjoKKwlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKK2tmcmVlX2Rldm5hbWU6CisJa2ZyZWUoZGV2LT5kZXZuYW1lKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaTkxNV9tYXN0ZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKKworCW1hc3Rlcl9wcml2ID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKm1hc3Rlcl9wcml2KSwgRFJNX01FTV9EUklWRVIpOworCWlmICghbWFzdGVyX3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFzdGVyLT5kcml2ZXJfcHJpdiA9IG1hc3Rlcl9wcml2OworCXJldHVybiAwOworfQorCit2b2lkIGk5MTVfbWFzdGVyX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gbWFzdGVyLT5kcml2ZXJfcHJpdjsKKworCWlmICghbWFzdGVyX3ByaXYpCisJCXJldHVybjsKKworCWRybV9mcmVlKG1hc3Rlcl9wcml2LCBzaXplb2YoKm1hc3Rlcl9wcml2KSwgRFJNX01FTV9EUklWRVIpOworCisJbWFzdGVyLT5kcml2ZXJfcHJpdiA9IE5VTEw7Cit9CisKKy8qKgorICogaTkxNV9kcml2ZXJfbG9hZCAtIHNldHVwIGNoaXAgYW5kIGNyZWF0ZSBhbiBpbml0aWFsIGNvbmZpZworICogQGRldjogRFJNIGRldmljZQorICogQGZsYWdzOiBzdGFydHVwIGZsYWdzCisgKgorICogVGhlIGRyaXZlciBsb2FkIHJvdXRpbmUgaGFzIHRvIGRvIHNldmVyYWwgdGhpbmdzOgorICogICAtIGRyaXZlIG91dHB1dCBkaXNjb3ZlcnkgdmlhIGludGVsX21vZGVzZXRfaW5pdCgpCisgKiAgIC0gaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IG1hbmFnZXIKKyAqICAgLSBhbGxvY2F0ZSBpbml0aWFsIGNvbmZpZyBtZW1vcnkKKyAqICAgLSBzZXR1cCB0aGUgRFJNIGZyYW1lYnVmZmVyIHdpdGggdGhlIGFsbG9jYXRlZCBtZW1vcnkKKyAqLwogaW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODI5LDYgKzEwNDYsMTEgQEAKIAlzaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCBtbWlvX2Jhcik7CiAKIAlkZXZfcHJpdi0+cmVncyA9IGlvcmVtYXAoYmFzZSwgc2l6ZSk7CisJaWYgKCFkZXZfcHJpdi0+cmVncykgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmcmVlX3ByaXY7CisJfQogCiAjaWZkZWYgQ09ORklHX0hJR0hNRU02NEcKIAkvKiBkb24ndCBlbmFibGUgR0VNIG9uIFBBRSAtIG5lZWRzIGFncCArIHNldF9tZW1vcnlfKiBpbnRlcmZhY2UgZml4ZXMgKi8KQEAgLTg0NCw3ICsxMDY2LDcgQEAKIAlpZiAoIUk5MTVfTkVFRF9HRlhfSFdTKGRldikpIHsKIAkJcmV0ID0gaTkxNV9pbml0X3BoeXNfaHdzKGRldik7CiAJCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dF9ybW1hcDsKIAl9CiAKIAkvKiBPbiB0aGUgOTQ1Ry9HTSwgdGhlIGNoaXBzZXQgcmVwb3J0cyB0aGUgTVNJIGNhcGFiaWxpdHkgb24gdGhlCkBAIC04NjQsNiArMTA4Niw3IEBACiAJaW50ZWxfb3ByZWdpb25faW5pdChkZXYpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT51c2VyX2lycV9sb2NrKTsKKwlkZXZfcHJpdi0+dXNlcl9pcnFfcmVmY291bnQgPSAwOwogCiAJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgSTkxNV9OVU1fUElQRSk7CiAKQEAgLTg3Miw2ICsxMDk1LDIwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBtb2Rlc2V0XG4iKTsKKwkJCWdvdG8gb3V0X3JtbWFwOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ybW1hcDoKKwlpb3VubWFwKGRldl9wcml2LT5yZWdzKTsKK2ZyZWVfcHJpdjoKKwlkcm1fZnJlZShkZXZfcHJpdiwgc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlKSwgRFJNX01FTV9EUklWRVIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg3OSwxNiArMTExNiwyOSBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlpb19tYXBwaW5nX2ZyZWUoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nKTsKKwkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKKwl9CisKIAlpZiAoZGV2LT5wZGV2LT5tc2lfZW5hYmxlZCkKIAkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CiAKLQlpOTE1X2ZyZWVfaHdzKGRldik7Ci0KIAlpZiAoZGV2X3ByaXYtPnJlZ3MgIT0gTlVMTCkKIAkJaW91bm1hcChkZXZfcHJpdi0+cmVncyk7CiAKIAlpbnRlbF9vcHJlZ2lvbl9mcmVlKGRldik7CiAKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlpbnRlbF9tb2Rlc2V0X2NsZWFudXAoZGV2KTsKKworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJZHJtX21tX3Rha2Vkb3duKCZkZXZfcHJpdi0+dnJhbSk7CisJCWk5MTVfZ2VtX2xhc3RjbG9zZShkZXYpOworCX0KKwogCWRybV9mcmVlKGRldi0+ZGV2X3ByaXZhdGUsIHNpemVvZihkcm1faTkxNV9wcml2YXRlX3QpLAogCQkgRFJNX01FTV9EUklWRVIpOwogCkBAIC05MTQsMTIgKzExNjQsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UgLSBjbGVhbiB1cCBhZnRlciBhbGwgRFJNIGNsaWVudHMgaGF2ZSBleGl0ZWQKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqCisgKiBUYWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgYWZ0ZXIgYWxsIERSTSBjbGllbnRzIGhhdmUgZXhpdGVkLiAgSW4gdGhlCisgKiBtb2RlIHNldHRpbmcgY2FzZSwgd2Ugd2FudCB0byByZXN0b3JlIHRoZSBrZXJuZWwncyBpbml0aWFsIG1vZGUgKGp1c3QKKyAqIGluIGNhc2UgdGhlIGxhc3QgY2xpZW50IGxlZnQgdXMgaW4gYSBiYWQgc3RhdGUpLgorICoKKyAqIEFkZGl0aW9uYWxseSwgaW4gdGhlIG5vbi1tb2RlIHNldHRpbmcgY2FzZSwgd2UnbGwgdGVhciBkb3duIHRoZSBBR1AKKyAqIGFuZCBETUEgc3RydWN0dXJlcywgc2luY2UgdGhlIGtlcm5lbCB3b24ndCBiZSB1c2luZyB0aGVtLCBhbmQgY2xlYQorICogdXAgYW55IEdFTSBzdGF0ZS4KKyAqLwogdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoIWRldl9wcml2KQorCWlmICghZGV2X3ByaXYgfHwgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlpbnRlbGZiX3Jlc3RvcmUoKTsKIAkJcmV0dXJuOworCX0KIAogCWk5MTVfZ2VtX2xhc3RjbG9zZShkZXYpOwogCkBAIC05MzIsNyArMTE5Niw4IEBACiB2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpOTE1X21lbV9yZWxlYXNlKGRldiwgZmlsZV9wcml2LCBkZXZfcHJpdi0+YWdwX2hlYXApOworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJaTkxNV9tZW1fcmVsZWFzZShkZXYsIGZpbGVfcHJpdiwgZGV2X3ByaXYtPmFncF9oZWFwKTsKIH0KIAogdm9pZCBpOTE1X2RyaXZlcl9wb3N0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC05NzIsNiArMTIzNyw3IEBACiAJRFJNX0lPQ1RMX0RFRihEUk1fSTkxNV9HRU1fUFJFQUQsIGk5MTVfZ2VtX3ByZWFkX2lvY3RsLCAwKSwKIAlEUk1fSU9DVExfREVGKERSTV9JOTE1X0dFTV9QV1JJVEUsIGk5MTVfZ2VtX3B3cml0ZV9pb2N0bCwgMCksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSTkxNV9HRU1fTU1BUCwgaTkxNV9nZW1fbW1hcF9pb2N0bCwgMCksCisJRFJNX0lPQ1RMX0RFRihEUk1fSTkxNV9HRU1fTU1BUF9HVFQsIGk5MTVfZ2VtX21tYXBfZ3R0X2lvY3RsLCAwKSwKIAlEUk1fSU9DVExfREVGKERSTV9JOTE1X0dFTV9TRVRfRE9NQUlOLCBpOTE1X2dlbV9zZXRfZG9tYWluX2lvY3RsLCAwKSwKIAlEUk1fSU9DVExfREVGKERSTV9JOTE1X0dFTV9TV19GSU5JU0gsIGk5MTVfZ2VtX3N3X2ZpbmlzaF9pb2N0bCwgMCksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSTkxNV9HRU1fU0VUX1RJTElORywgaTkxNV9nZW1fc2V0X3RpbGluZywgMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCBhODBlYWQyLi5mOGIzZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTMzLDExICszMywyMiBAQAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IGk5MTVfbW9kZXNldCA9IC0xOworbW9kdWxlX3BhcmFtX25hbWVkKG1vZGVzZXQsIGk5MTVfbW9kZXNldCwgaW50LCAwNDAwKTsKKwordW5zaWduZWQgaW50IGk5MTVfZmJwZXJjcnRjID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZChmYnBlcmNydGMsIGk5MTVfZmJwZXJjcnRjLCBpbnQsIDA0MDApOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJaTkxNV9QQ0lfSURTCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfRFJNX0k5MTVfS01TKQorTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaWlkbGlzdCk7CisjZW5kaWYKKwogc3RhdGljIGludCBpOTE1X3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04MSw2ICs5MiwxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGk5MTVfZ2VtX3ZtX29wcyA9IHsKKwkuZmF1bHQgPSBpOTE1X2dlbV9mYXVsdCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CiAJLyogZG9uJ3QgdXNlIG10cnIncyBoZXJlLCB0aGUgWHNlcnZlciBvciB1c2VyIHNwYWNlIGFwcCBzaG91bGQKIAkgKiBkZWFsIHdpdGggdGhlbSBmb3IgaW50ZWwgaGFyZHdhcmUuCkBAIC0xMDcsMTcgKzEyMiwyMCBAQAogCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCiAJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCiAJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLm1hc3Rlcl9jcmVhdGUgPSBpOTE1X21hc3Rlcl9jcmVhdGUsCisJLm1hc3Rlcl9kZXN0cm95ID0gaTkxNV9tYXN0ZXJfZGVzdHJveSwKIAkucHJvY19pbml0ID0gaTkxNV9nZW1fcHJvY19pbml0LAogCS5wcm9jX2NsZWFudXAgPSBpOTE1X2dlbV9wcm9jX2NsZWFudXAsCiAJLmdlbV9pbml0X29iamVjdCA9IGk5MTVfZ2VtX2luaXRfb2JqZWN0LAogCS5nZW1fZnJlZV9vYmplY3QgPSBpOTE1X2dlbV9mcmVlX29iamVjdCwKKwkuZ2VtX3ZtX29wcyA9ICZpOTE1X2dlbV92bV9vcHMsCiAJLmlvY3RscyA9IGk5MTVfaW9jdGxzLAogCS5mb3BzID0gewogCQkgLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCSAub3BlbiA9IGRybV9vcGVuLAogCQkgLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKIAkJIC5pb2N0bCA9IGRybV9pb2N0bCwKLQkJIC5tbWFwID0gZHJtX21tYXAsCisJCSAubW1hcCA9IGRybV9nZW1fbW1hcCwKIAkJIC5wb2xsID0gZHJtX3BvbGwsCiAJCSAuZmFzeW5jID0gZHJtX2Zhc3luYywKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0xNDEsNiArMTU5LDI4IEBACiBzdGF0aWMgaW50IF9faW5pdCBpOTE1X2luaXQodm9pZCkKIHsKIAlkcml2ZXIubnVtX2lvY3RscyA9IGk5MTVfbWF4X2lvY3RsOworCisJLyoKKwkgKiBJZiBDT05GSUdfRFJNX0k5MTVfS01TIGlzIHNldCwgZGVmYXVsdCB0byBLTVMgdW5sZXNzCisJICogZXhwbGljaXRseSBkaXNhYmxlZCB3aXRoIHRoZSBtb2R1bGUgcGFyYXJtZXRlci4KKwkgKgorCSAqIE90aGVyd2lzZSwganVzdCBmb2xsb3cgdGhlIHBhcmFtZXRlciAoZGVmYXVsdGluZyB0byBvZmYpLgorCSAqCisJICogQWxsb3cgb3B0aW9uYWwgdmdhX3RleHRfbW9kZV9mb3JjZSBib290IG9wdGlvbiB0byBvdmVycmlkZQorCSAqIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0RSTV9JOTE1X0tNUykKKwlpZiAoaTkxNV9tb2Rlc2V0ICE9IDApCisJCWRyaXZlci5kcml2ZXJfZmVhdHVyZXMgfD0gRFJJVkVSX01PREVTRVQ7CisjZW5kaWYKKwlpZiAoaTkxNV9tb2Rlc2V0ID09IDEpCisJCWRyaXZlci5kcml2ZXJfZmVhdHVyZXMgfD0gRFJJVkVSX01PREVTRVQ7CisKKyNpZmRlZiBDT05GSUdfVkdBX0NPTlNPTEUKKwlpZiAodmdhY29uX3RleHRfZm9yY2UoKSAmJiBpOTE1X21vZGVzZXQgPT0gLTEpCisJCWRyaXZlci5kcml2ZXJfZmVhdHVyZXMgJj0gfkRSSVZFUl9NT0RFU0VUOworI2VuZGlmCisKIAlyZXR1cm4gZHJtX2luaXQoJmRyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IGIzY2M0NzMuLjQ3NTZlNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtMzEsNiArMzEsNyBAQAogI2RlZmluZSBfSTkxNV9EUlZfSF8KIAogI2luY2x1ZGUgImk5MTVfcmVnLmgiCisjaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgogI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KIAogLyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgpAQCAtMTAzLDE1ICsxMDQsMjMgQEAKIAlpbnQgZW5hYmxlZDsKIH07CiAKK3N0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSB7CisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhICpzYXJlYV9wcml2OworfTsKKyNkZWZpbmUgSTkxNV9GRU5DRV9SRUdfTk9ORSAtMQorCitzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnIHsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKK307CisKIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAKIAlpbnQgaGFzX2dlbTsKIAogCXZvaWQgX19pb21lbSAqcmVnczsKLQlkcm1fbG9jYWxfbWFwX3QgKnNhcmVhOwogCi0JZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdjsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90IHJpbmc7CiAKIAlkcm1fZG1hX2hhbmRsZV90ICpzdGF0dXNfcGFnZV9kbWFoOwpAQCAtMTQ0LDggKzE1MywzMCBAQAogCXVuc2lnbmVkIGludCBzcjAxLCBhZHBhLCBwcGNyLCBkdm9iLCBkdm9jLCBsdmRzOwogCWludCB2YmxhbmtfcGlwZTsKIAorCWJvb2wgY3Vyc29yX25lZWRzX3BoeXNpY2FsOworCisJc3RydWN0IGRybV9tbSB2cmFtOworCisJaW50IGlycV9lbmFibGVkOworCiAJc3RydWN0IGludGVsX29wcmVnaW9uIG9wcmVnaW9uOwogCisJLyogTFZEUyBpbmZvICovCisJaW50IGJhY2tsaWdodF9kdXR5X2N5Y2xlOyAgLyogcmVzdG9yZSBiYWNrbGlnaHQgdG8gdGhpcyB2YWx1ZSAqLworCWJvb2wgcGFuZWxfd2FudHNfZGl0aGVyOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp2YnRfbW9kZTsgLyogaWYgYW55ICovCisKKwkvKiBGZWF0dXJlIGJpdHMgZnJvbSB0aGUgVkJJT1MgKi8KKwl1bnNpZ25lZCBpbnQgaW50X3R2X3N1cHBvcnQ6MTsKKwl1bnNpZ25lZCBpbnQgbHZkc19kaXRoZXI6MTsKKwl1bnNpZ25lZCBpbnQgbHZkc192YnQ6MTsKKwl1bnNpZ25lZCBpbnQgaW50X2NydF9zdXBwb3J0OjE7CisKKwlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnIGZlbmNlX3JlZ3NbMTZdOyAvKiBhc3N1bWUgOTY1ICovCisJaW50IGZlbmNlX3JlZ19zdGFydDsgLyogNCBpZiB1c2VybGFuZCBoYXNuJ3QgaW9jdGwnZCB1cyB5ZXQgKi8KKwlpbnQgbnVtX2ZlbmNlX3JlZ3M7IC8qIDggb24gcHJlLTk2NSwgMTYgb3RoZXJ3aXNlICovCisKIAkvKiBSZWdpc3RlciBzdGF0ZSAqLwogCXU4IHNhdmVMQkI7CiAJdTMyIHNhdmVEU1BBQ05UUjsKQEAgLTM2NCw2ICszOTUsMjEgQEAKIAkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGd0dF9zcGFjZS0+c3RhcnQKIAkgKi8KIAl1aW50MzJfdCBndHRfb2Zmc2V0OworCS8qKgorCSAqIFJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIG9iamVjdAorCSAqLworCXVpbnQzMl90IGd0dF9hbGlnbm1lbnQ7CisJLyoqCisJICogRmFrZSBvZmZzZXQgZm9yIHVzZSBieSBtbWFwKDIpCisJICovCisJdWludDY0X3QgbW1hcF9vZmZzZXQ7CisKKwkvKioKKwkgKiBGZW5jZSByZWdpc3RlciBiaXRzIChpZiBhbnkpIGZvciB0aGlzIG9iamVjdC4gIFdpbGwgYmUgc2V0CisJICogYXMgbmVlZGVkIHdoZW4gbWFwcGVkIGludG8gdGhlIEdUVC4KKwkgKiBQcm90ZWN0ZWQgYnkgZGV2LT5zdHJ1Y3RfbXV0ZXguCisJICovCisJaW50IGZlbmNlX3JlZzsKIAogCS8qKiBCb29sZWFuIHdoZXRoZXIgdGhpcyBvYmplY3QgaGFzIGEgdmFsaWQgZ3R0IG9mZnNldC4gKi8KIAlpbnQgZ3R0X2JvdW5kOwpAQCAtMzc2LDYgKzQyMiw3IEBACiAKIAkvKiogQ3VycmVudCB0aWxpbmcgbW9kZSBmb3IgdGhlIG9iamVjdC4gKi8KIAl1aW50MzJfdCB0aWxpbmdfbW9kZTsKKwl1aW50MzJfdCBzdHJpZGU7CiAKIAkvKiogQUdQIG1hcHBpbmcgdHlwZSAoQUdQX1VTRVJfTUVNT1JZIG9yIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlkgKi8KIAl1aW50MzJfdCBhZ3BfdHlwZTsKQEAgLTM4NSw2ICs0MzIsMTAgQEAKIAkgKiBmbGFncyB3aGljaCBpbmRpdmlkdWFsIHBhZ2VzIGFyZSB2YWxpZC4KIAkgKi8KIAl1aW50OF90ICpwYWdlX2NwdV92YWxpZDsKKworCS8qKiBVc2VyIHNwYWNlIHBpbiBjb3VudCBhbmQgZmlscCBvd25pbmcgdGhlIHBpbiAqLworCXVpbnQzMl90IHVzZXJfcGluX2NvdW50OworCXN0cnVjdCBkcm1fZmlsZSAqcGluX2ZpbHA7CiB9OwogCiAvKioKQEAgLTQxNCw4ICs0NjUsMTkgQEAKIAl9IG1tOwogfTsKIAorZW51bSBpbnRlbF9jaGlwX2ZhbWlseSB7CisJQ0hJUF9JOFhYID0gMHgwMSwKKwlDSElQX0k5WFggPSAweDAyLAorCUNISVBfSTkxNSA9IDB4MDQsCisJQ0hJUF9JOTY1ID0gMHgwOCwKK307CisKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgaTkxNV9pb2N0bHNbXTsKIGV4dGVybiBpbnQgaTkxNV9tYXhfaW9jdGw7CitleHRlcm4gdW5zaWduZWQgaW50IGk5MTVfZmJwZXJjcnRjOworCitleHRlcm4gaW50IGk5MTVfbWFzdGVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKK2V4dGVybiB2b2lkIGk5MTVfbWFzdGVyX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CiAKIAkJCQkvKiBpOTE1X2RtYS5jICovCiBleHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwpAQCAtNDQxLDYgKzUwMyw3IEBACiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogdm9pZCBpOTE1X3VzZXJfaXJxX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV91c2VyX2lycV9wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKQEAgLTQ4Nyw2ICs1NTAsOCBAQAogCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBpbnQgaTkxNV9nZW1fbW1hcF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworaW50IGk5MTVfZ2VtX21tYXBfZ3R0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBpbnQgaTkxNV9nZW1fc2V0X2RvbWFpbl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogaW50IGk5MTVfZ2VtX3N3X2ZpbmlzaF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtNTIzLDYgKzU4OCwxNiBAQAogdm9pZCBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIGk5MTVfZ2VtX3JldGlyZV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkJICAgICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywKKwkJCSAgICAgICB1aW50MzJfdCB3cml0ZV9kb21haW4pOworaW50IGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGVuZCk7CitpbnQgaTkxNV9nZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKK2ludCBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICAgICAgaW50IHdyaXRlKTsKIAogLyogaTkxNV9nZW1fdGlsaW5nLmMgKi8KIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC01NjEsNiArNjM2LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgb3ByZWdpb25fZW5hYmxlX2FzbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikgeyByZXR1cm47IH0KICNlbmRpZgogCisvKiBtb2Rlc2V0dGluZyAqLworZXh0ZXJuIHZvaWQgaW50ZWxfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfbW9kZXNldF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiAvKioKICAqIExvY2sgdGVzdCBmb3Igd2hlbiBpdCdzIGp1c3QgZm9yIHN5bmNocm9uaXphdGlvbiBvZiByaW5nIGFjY2Vzcy4KICAqCkBAIC01NzgsNiArNjU3LDEzIEBACiAjZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsIHZhbCkJd3JpdGVsKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKICNkZWZpbmUgSTkxNV9SRUFEOChyZWcpCQlyZWFkYihkZXZfcHJpdi0+cmVncyArIChyZWcpKQogI2RlZmluZSBJOTE1X1dSSVRFOChyZWcsIHZhbCkJd3JpdGViKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKKyNpZmRlZiB3cml0ZXEKKyNkZWZpbmUgSTkxNV9XUklURTY0KHJlZywgdmFsKQl3cml0ZXEodmFsLCBkZXZfcHJpdi0+cmVncyArIChyZWcpKQorI2Vsc2UKKyNkZWZpbmUgSTkxNV9XUklURTY0KHJlZywgdmFsKQkod3JpdGVsKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSksIFwKKwkJCQkgd3JpdGVsKHVwcGVyXzMyX2JpdHModmFsKSwgZGV2X3ByaXYtPnJlZ3MgKyBcCisJCQkJCShyZWcpICsgNCkpCisjZW5kaWYKIAogI2RlZmluZSBJOTE1X1ZFUkJPU0UgMAogCkBAIC02NjAsNyArNzQ2LDggQEAKIAogI2RlZmluZSBJU19HNFgoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyRTAyIHx8IFwKIAkJICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJFMTIgfHwgXAotCQkgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkUyMikKKwkJICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJFMjIgfHwgXAorCQkgICAgIElTX0dNNDUoZGV2KSkKIAogI2RlZmluZSBJU19HMzMoZGV2KSAgICAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyOUMyIHx8CVwKIAkJCShkZXYpLT5wY2lfZGV2aWNlID09IDB4MjlCMiB8fAlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCAyNGZlOGMxLi5jYzJjYTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjZGVmaW5lIEk5MTVfR0VNX0dQVV9ET01BSU5TCSh+KEk5MTVfR0VNX0RPTUFJTl9DUFUgfCBJOTE1X0dFTV9ET01BSU5fR1RUKSkKIApAQCAtNDAsOCArNDEsNiBAQAogc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJCSAgICAgaW50IHdyaXRlKTsKIHN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAogCQkJCQkgICAgIGludCB3cml0ZSk7CiBzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfY3B1X3JlYWRfZG9tYWluX3JhbmdlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLApAQCAtNTEsMzQgKzUwLDQzIEBACiBzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZV9saXN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKIHN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mcmVlX3BhZ2VfbGlzdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiBzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKKwkJCQkJICAgdW5zaWduZWQgYWxpZ25tZW50KTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgaW50IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2dlbV9kb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoc3RhcnQgPj0gZW5kIHx8CisJICAgIChzdGFydCAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCB8fAorCSAgICAoZW5kICYgKFBBR0VfU0laRSAtIDEpKSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLCBzdGFydCwKKwkJICAgIGVuZCAtIHN0YXJ0KTsKKworCWRldi0+Z3R0X3RvdGFsID0gKHVpbnQzMl90KSAoZW5kIC0gc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CiAKIGludAogaTkxNV9nZW1faW5pdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9pbml0ICphcmdzID0gZGF0YTsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JaWYgKGFyZ3MtPmd0dF9zdGFydCA+PSBhcmdzLT5ndHRfZW5kIHx8Ci0JICAgIChhcmdzLT5ndHRfc3RhcnQgJiAoUEFHRV9TSVpFIC0gMSkpICE9IDAgfHwKLQkgICAgKGFyZ3MtPmd0dF9lbmQgJiAoUEFHRV9TSVpFIC0gMSkpICE9IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLCBhcmdzLT5ndHRfc3RhcnQsCi0JICAgIGFyZ3MtPmd0dF9lbmQgLSBhcmdzLT5ndHRfc3RhcnQpOwotCi0JZGV2LT5ndHRfdG90YWwgPSAodWludDMyX3QpIChhcmdzLT5ndHRfZW5kIC0gYXJncy0+Z3R0X3N0YXJ0KTsKLQorCXJldCA9IGk5MTVfZ2VtX2RvX2luaXQoZGV2LCBhcmdzLT5ndHRfc3RhcnQsIGFyZ3MtPmd0dF9lbmQpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogaW50CkBAIC01MjksNiArNTM3LDI1MiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGk5MTVfZ2VtX2ZhdWx0IC0gZmF1bHQgYSBwYWdlIGludG8gdGhlIEdUVAorICogdm1hOiBWTUEgaW4gcXVlc3Rpb24KKyAqIHZtZjogZmF1bHQgaW5mbworICoKKyAqIFRoZSBmYXVsdCBoYW5kbGVyIGlzIHNldCB1cCBieSBkcm1fZ2VtX21tYXAoKSB3aGVuIGEgb2JqZWN0IGlzIEdUVCBtYXBwZWQKKyAqIGZyb20gdXNlcnNwYWNlLiAgVGhlIGZhdWx0IGhhbmRsZXIgdGFrZXMgY2FyZSBvZiBiaW5kaW5nIHRoZSBvYmplY3QgdG8KKyAqIHRoZSBHVFQgKGlmIG5lZWRlZCksIGFsbG9jYXRpbmcgYW5kIHByb2dyYW1taW5nIGEgZmVuY2UgcmVnaXN0ZXIgKGFnYWluLAorICogb25seSBpZiBuZWVkZWQgYmFzZWQgb24gd2hldGhlciB0aGUgb2xkIHJlZyBpcyBzdGlsbCB2YWxpZCBvciB0aGUgb2JqZWN0CisgKiBpcyB0aWxlZCkgYW5kIGluc2VydGluZyBhIG5ldyBQVEUgaW50byB0aGUgZmF1bHRpbmcgcHJvY2Vzcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGZhdWx0aW5nIHByb2Nlc3MgbWF5IGludm9sdmUgZXZpY3RpbmcgZXhpc3Rpbmcgb2JqZWN0cworICogZnJvbSB0aGUgR1RUIGFuZC9vciBmZW5jZSByZWdpc3RlcnMgdG8gbWFrZSByb29tLiAgU28gcGVyZm9ybWFuY2UgbWF5CisgKiBzdWZmZXIgaWYgdGhlIEdUVCB3b3JraW5nIHNldCBpcyBsYXJnZSBvciB0aGVyZSBhcmUgZmV3IGZlbmNlIHJlZ2lzdGVycworICogbGVmdC4KKyAqLworaW50IGk5MTVfZ2VtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK3sKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJcGdvZmZfdCBwYWdlX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFdlIGRvbid0IHVzZSB2bWYtPnBnb2ZmIHNpbmNlIHRoYXQgaGFzIHRoZSBmYWtlIG9mZnNldCAqLworCXBhZ2Vfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4KKwkJUEFHRV9TSElGVDsKKworCS8qIE5vdyBiaW5kIGl0IGludG8gdGhlIEdUVCBpZiBuZWVkZWQgKi8KKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKCFvYmpfcHJpdi0+Z3R0X3NwYWNlKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIG9ial9wcml2LT5ndHRfYWxpZ25tZW50KTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCQl9CisJCWxpc3RfYWRkKCZvYmpfcHJpdi0+bGlzdCwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKKwl9CisKKwkvKiBOZWVkIGEgbmV3IGZlbmNlIHJlZ2lzdGVyPyAqLworCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnID09IEk5MTVfRkVOQ0VfUkVHX05PTkUgJiYKKwkgICAgb2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCisJCWk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKG9iaik7CisKKwlwZm4gPSAoKGRldi0+YWdwLT5iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQpID4+IFBBR0VfU0hJRlQpICsKKwkJcGFnZV9vZmZzZXQ7CisKKwkvKiBGaW5hbGx5LCByZW1hcCBpdCB1c2luZyB0aGUgbmV3IEdUVCBvZmZzZXQgKi8KKwlyZXQgPSB2bV9pbnNlcnRfcGZuKHZtYSwgKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MsIHBmbik7CisKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAtRU5PTUVNOgorCWNhc2UgLUVBR0FJTjoKKwkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKwljYXNlIC1FRkFVTFQ6CisJY2FzZSAtRUJVU1k6CisJCURSTV9FUlJPUigiY2FuJ3QgaW5zZXJ0IHBmbj8/ICBmYXVsdCBvciBidXN5Li4uXG4iKTsKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOworCX0KK30KKworLyoqCisgKiBpOTE1X2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQgLSBjcmVhdGUgYSBmYWtlIG1tYXAgb2Zmc2V0IGZvciBhbiBvYmplY3QKKyAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgorICoKKyAqIEdFTSBtZW1vcnkgbWFwcGluZyB3b3JrcyBieSBoYW5kaW5nIGJhY2sgdG8gdXNlcnNwYWNlIGEgZmFrZSBtbWFwIG9mZnNldAorICogaXQgY2FuIHVzZSBpbiBhIHN1YnNlcXVlbnQgbW1hcCgyKSBjYWxsLiAgVGhlIERSTSBjb3JlIGNvZGUgdGhlbiBsb29rcworICogdXAgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgb2Zmc2V0IGFuZCBzZXRzIHVwIHRoZSB2YXJpb3VzIG1lbW9yeSBtYXBwaW5nCisgKiBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYW5kIGF0dGFjaGVzIGEgZmFrZSBvZmZzZXQgZm9yIEBvYmouCisgKi8KK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBvYmplY3QgdXAgZm9yIG1tYXAnaW5nICovCisJbGlzdCA9ICZvYmotPm1hcF9saXN0OworCWxpc3QtPm1hcCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkcm1fbWFwX2xpc3QpLAorCQkJICAgICAgIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoIWxpc3QtPm1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXAgPSBsaXN0LT5tYXA7CisJbWFwLT50eXBlID0gX0RSTV9HRU07CisJbWFwLT5zaXplID0gb2JqLT5zaXplOworCW1hcC0+aGFuZGxlID0gb2JqOworCisJLyogR2V0IGEgRFJNIEdFTSBtbWFwIG9mZnNldCBhbGxvY2F0ZWQuLi4gKi8KKwlsaXN0LT5maWxlX29mZnNldF9ub2RlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZtbS0+b2Zmc2V0X21hbmFnZXIsCisJCQkJCQkgICAgb2JqLT5zaXplIC8gUEFHRV9TSVpFLCAwLCAwKTsKKwlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2Zmc2V0IGZvciBibyAlZFxuIiwgb2JqLT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9saXN0OworCX0KKworCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fZ2V0X2Jsb2NrKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUsCisJCQkJCQkgIG9iai0+c2l6ZSAvIFBBR0VfU0laRSwgMCk7CisJaWYgKCFsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfbGlzdDsKKwl9CisKKwlsaXN0LT5oYXNoLmtleSA9IGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUtPnN0YXJ0OworCWlmIChkcm1faHRfaW5zZXJ0X2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFkZCB0byBtYXAgaGFzaFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfbW07CisJfQorCisJLyogQnkgbm93IHdlIHNob3VsZCBiZSBhbGwgc2V0LCBhbnkgZHJtX21tYXAgcmVxdWVzdCBvbiB0aGUgb2Zmc2V0CisJICogYmVsb3cgd2lsbCBnZXQgdG8gb3VyIG1tYXAgJiBmYXVsdCBoYW5kbGVyICovCisJb2JqX3ByaXYtPm1tYXBfb2Zmc2V0ID0gKCh1aW50NjRfdCkgbGlzdC0+aGFzaC5rZXkpIDw8IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfbW06CisJZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKK291dF9mcmVlX2xpc3Q6CisJZHJtX2ZyZWUobGlzdC0+bWFwLCBzaXplb2Yoc3RydWN0IGRybV9tYXBfbGlzdCksIERSTV9NRU1fRFJJVkVSKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQgLSByZXR1cm4gcmVxdWlyZWQgR1RUIGFsaWdubWVudCBmb3IgYW4gb2JqZWN0CisgKiBAb2JqOiBvYmplY3QgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gdGhlIHJlcXVpcmVkIEdUVCBhbGlnbm1lbnQgZm9yIGFuIG9iamVjdCwgdGFraW5nIGludG8gYWNjb3VudAorICogcG90ZW50aWFsIGZlbmNlIHJlZ2lzdGVyIG1hcHBpbmcgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdWludDMyX3QKK2k5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOworCWludCBzdGFydCwgaTsKKworCS8qCisJICogTWluaW11bSBhbGlnbm1lbnQgaXMgNGsgKEdUVCBwYWdlIHNpemUpLCBidXQgbWlnaHQgYmUgZ3JlYXRlcgorCSAqIGlmIGEgZmVuY2UgcmVnaXN0ZXIgaXMgbmVlZGVkIGZvciB0aGUgb2JqZWN0LgorCSAqLworCWlmIChJU19JOTY1RyhkZXYpIHx8IG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCQlyZXR1cm4gNDA5NjsKKworCS8qCisJICogUHJldmlvdXMgY2hpcHMgbmVlZCB0byBiZSBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdAorCSAqIGZlbmNlIHJlZ2lzdGVyIHRoYXQgY2FuIGNvbnRhaW4gdGhlIG9iamVjdC4KKwkgKi8KKwlpZiAoSVNfSTlYWChkZXYpKQorCQlzdGFydCA9IDEwMjQqMTAyNDsKKwllbHNlCisJCXN0YXJ0ID0gNTEyKjEwMjQ7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IG9iai0+c2l6ZTsgaSA8PD0gMSkKKwkJOworCisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogaTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwgLSBwcmVwYXJlIGFuIG9iamVjdCBmb3IgR1RUIG1tYXAnaW5nCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAZGF0YTogR1RUIG1hcHBpbmcgaW9jdGwgZGF0YQorICogQGZpbGVfcHJpdjogR0VNIG9iamVjdCBpbmZvCisgKgorICogU2ltcGx5IHJldHVybnMgdGhlIGZha2Ugb2Zmc2V0IHRvIHVzZXJzcGFjZSBzbyBpdCBjYW4gbW1hcCBpdC4KKyAqIFRoZSBtbWFwIGNhbGwgd2lsbCBlbmQgdXAgaW4gZHJtX2dlbV9tbWFwKCksIHdoaWNoIHdpbGwgc2V0IHRoaW5ncworICogdXAgc28gd2UgY2FuIGdldCBmYXVsdHMgaW4gdGhlIGhhbmRsZXIgYWJvdmUuCisgKgorICogVGhlIGZhdWx0IGhhbmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYmluZGluZyB0aGUgb2JqZWN0IGludG8gdGhlIEdUVAorICogKHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gZXZpY3RlZCB0byBtYWtlIHJvb20gZm9yIHNvbWV0aGluZyksIGFsbG9jYXRpbmcKKyAqIGEgZmVuY2UgcmVnaXN0ZXIsIGFuZCBtYXBwaW5nIHRoZSBhcHByb3ByaWF0ZSBhcGVydHVyZSBhZGRyZXNzIGludG8KKyAqIHVzZXJzcGFjZS4KKyAqLworaW50CitpOTE1X2dlbV9tbWFwX2d0dF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwX2d0dCAqYXJncyA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJaW50IHJldDsKKworCWlmICghKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJaWYgKG9iaiA9PSBOVUxMKQorCQlyZXR1cm4gLUVCQURGOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOworCisJaWYgKCFvYmpfcHJpdi0+bW1hcF9vZmZzZXQpIHsKKwkJcmV0ID0gaTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWFyZ3MtPm9mZnNldCA9IG9ial9wcml2LT5tbWFwX29mZnNldDsKKworCW9ial9wcml2LT5ndHRfYWxpZ25tZW50ID0gaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQob2JqKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgYWxpZ25tZW50IGlzIGNvcnJlY3QgZm9yIGZlbmNlIHJlZ3MgZXRjICovCisJaWYgKG9ial9wcml2LT5hZ3BfbWVtICYmCisJICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmpfcHJpdi0+Z3R0X2FsaWdubWVudCAtIDEpKSkgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBQdWxsIGl0IGludG8gdGhlIEdUVCBzbyB0aGF0IHdlIGhhdmUgYSBwYWdlIGxpc3QgKG1ha2VzIHRoZQorCSAqIGluaXRpYWwgZmF1bHQgZmFzdGVyIGFuZCBhbnkgc3Vic2VxdWVudCBmbHVzaGluZyBwb3NzaWJsZSkuCisJICovCisJaWYgKCFvYmpfcHJpdi0+YWdwX21lbSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBvYmpfcHJpdi0+Z3R0X2FsaWdubWVudCk7CisJCWlmIChyZXQpIHsKKwkJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbGlzdF9hZGQoJm9ial9wcml2LT5saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOworCX0KKworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQKIGk5MTVfZ2VtX29iamVjdF9mcmVlX3BhZ2VfbGlzdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKQEAgLTcyNiw2ICs5ODAsNyBAQAogCQkgKi8KIAkJaWYgKG9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubyAhPSByZXF1ZXN0LT5zZXFubykKIAkJCXJldHVybjsKKwogI2lmIFdBVENIX0xSVQogCQlEUk1fSU5GTygiJXM6IHJldGlyZSAlZCBtb3ZlcyB0byBpbmFjdGl2ZSBsaXN0ICVwXG4iLAogCQkJIF9fZnVuY19fLCByZXF1ZXN0LT5zZXFubywgb2JqKTsKQEAgLTk1Niw2ICsxMjExLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlsb2ZmX3Qgb2Zmc2V0OwogCWludCByZXQgPSAwOwogCiAjaWYgV0FUQ0hfQlVGCkBAIC05OTEsNiArMTI0NywxNCBAQAogCiAJQlVHX09OKG9ial9wcml2LT5hY3RpdmUpOwogCisJLyogYmxvdyBhd2F5IG1hcHBpbmdzIGlmIG1hcHBlZCB0aHJvdWdoIEdUVCAqLworCW9mZnNldCA9ICgobG9mZl90KSBvYmotPm1hcF9saXN0Lmhhc2gua2V5KSA8PCBQQUdFX1NISUZUOworCWlmIChkZXYtPmRldl9tYXBwaW5nKQorCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGRldi0+ZGV2X21hcHBpbmcsIG9mZnNldCwgb2JqLT5zaXplLCAxKTsKKworCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpCisJCWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhvYmopOworCiAJaTkxNV9nZW1fb2JqZWN0X2ZyZWVfcGFnZV9saXN0KG9iaik7CiAKIAlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSkgewpAQCAtMTE0OSw2ICsxNDEzLDIwNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpOTY1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcpCit7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSByZWctPm9iajsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlpbnQgcmVnbnVtID0gb2JqX3ByaXYtPmZlbmNlX3JlZzsKKwl1aW50NjRfdCB2YWw7CisKKwl2YWwgPSAodWludDY0X3QpKChvYmpfcHJpdi0+Z3R0X29mZnNldCArIG9iai0+c2l6ZSAtIDQwOTYpICYKKwkJICAgIDB4ZmZmZmYwMDApIDw8IDMyOworCXZhbCB8PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmIDB4ZmZmZmYwMDA7CisJdmFsIHw9ICgob2JqX3ByaXYtPnN0cmlkZSAvIDEyOCkgLSAxKSA8PCBJOTY1X0ZFTkNFX1BJVENIX1NISUZUOworCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkKKwkJdmFsIHw9IDEgPDwgSTk2NV9GRU5DRV9USUxJTkdfWV9TSElGVDsKKwl2YWwgfD0gSTk2NV9GRU5DRV9SRUdfVkFMSUQ7CisKKwlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgKHJlZ251bSAqIDgpLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBpOTE1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcpCit7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSByZWctPm9iajsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlpbnQgcmVnbnVtID0gb2JqX3ByaXYtPmZlbmNlX3JlZzsKKwl1aW50MzJfdCB2YWw7CisJdWludDMyX3QgcGl0Y2hfdmFsOworCisJaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8CisJICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKKwkJV0FSTigxLCAiJXM6IG9iamVjdCBub3QgMU0gb3Igc2l6ZSBhbGlnbmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZICYmIChJU19JOTQ1RyhkZXYpIHx8CisJCQkJCQkgICAgICAgSVNfSTk0NUdNKGRldikgfHwKKwkJCQkJCSAgICAgICBJU19HMzMoZGV2KSkpCisJCXBpdGNoX3ZhbCA9IChvYmpfcHJpdi0+c3RyaWRlIC8gMTI4KSAtIDE7CisJZWxzZQorCQlwaXRjaF92YWwgPSAob2JqX3ByaXYtPnN0cmlkZSAvIDUxMikgLSAxOworCisJdmFsID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCQl2YWwgfD0gMSA8PCBJODMwX0ZFTkNFX1RJTElOR19ZX1NISUZUOworCXZhbCB8PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyhvYmotPnNpemUpOworCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9TSElGVDsKKwl2YWwgfD0gSTgzMF9GRU5DRV9SRUdfVkFMSUQ7CisKKwlJOTE1X1dSSVRFKEZFTkNFX1JFR184MzBfMCArIChyZWdudW0gKiA0KSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgaTgzMF93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnKQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJaW50IHJlZ251bSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJdWludDMyX3QgdmFsOworCXVpbnQzMl90IHBpdGNoX3ZhbDsKKworCWlmICgob2JqX3ByaXYtPmd0dF9vZmZzZXQgJiB+STkxNV9GRU5DRV9TVEFSVF9NQVNLKSB8fAorCSAgICAob2JqX3ByaXYtPmd0dF9vZmZzZXQgJiAob2JqLT5zaXplIC0gMSkpKSB7CisJCVdBUk4oMSwgIiVzOiBvYmplY3Qgbm90IDFNIG9yIHNpemUgYWxpZ25lZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCXBpdGNoX3ZhbCA9IChvYmpfcHJpdi0+c3RyaWRlIC8gMTI4KSAtIDE7CisKKwl2YWwgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCisJCXZhbCB8PSAxIDw8IEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQ7CisJdmFsIHw9IEk4MzBfRkVOQ0VfU0laRV9CSVRTKG9iai0+c2l6ZSk7CisJdmFsIHw9IHBpdGNoX3ZhbCA8PCBJODMwX0ZFTkNFX1BJVENIX1NISUZUOworCXZhbCB8PSBJODMwX0ZFTkNFX1JFR19WQUxJRDsKKworCUk5MTVfV1JJVEUoRkVOQ0VfUkVHXzgzMF8wICsgKHJlZ251bSAqIDQpLCB2YWwpOworCit9CisKKy8qKgorICogaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcgLSBzZXQgdXAgYSBmZW5jZSByZWcgZm9yIGFuIG9iamVjdAorICogQG9iajogb2JqZWN0IHRvIG1hcCB0aHJvdWdoIGEgZmVuY2UgcmVnCisgKgorICogV2hlbiBtYXBwaW5nIG9iamVjdHMgdGhyb3VnaCB0aGUgR1RULCB1c2Vyc3BhY2Ugd2FudHMgdG8gYmUgYWJsZSB0byB3cml0ZQorICogdG8gdGhlbSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBzd2l6emxpbmcgaWYgdGhlIG9iamVjdCBpcyB0aWxlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBmZW5jZSByZWdzIGxvb2tpbmcgZm9yIGEgZnJlZSBvbmUgZm9yIEBvYmosCisgKiBzdGVhbGluZyBvbmUgaWYgaXQgY2FuJ3QgZmluZCBhbnkuCisgKgorICogSXQgdGhlbiBzZXRzIHVwIHRoZSByZWcgYmFzZWQgb24gdGhlIG9iamVjdCdzIHByb3BlcnRpZXM6IGFkZHJlc3MsIHBpdGNoCisgKiBhbmQgdGlsaW5nIGZvcm1hdC4KKyAqLworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0gTlVMTDsKKwlpbnQgaSwgcmV0OworCisJc3dpdGNoIChvYmpfcHJpdi0+dGlsaW5nX21vZGUpIHsKKwljYXNlIEk5MTVfVElMSU5HX05PTkU6CisJCVdBUk4oMSwgImFsbG9jYXRpbmcgYSBmZW5jZSBmb3Igbm9uLXRpbGVkIG9iamVjdD9cbiIpOworCQlicmVhazsKKwljYXNlIEk5MTVfVElMSU5HX1g6CisJCVdBUk4ob2JqX3ByaXYtPnN0cmlkZSAmICg1MTIgLSAxKSwKKwkJICAgICAib2JqZWN0IGlzIFggdGlsZWQgYnV0IGhhcyBub24tNTEyQiBwaXRjaFxuIik7CisJCWJyZWFrOworCWNhc2UgSTkxNV9USUxJTkdfWToKKwkJV0FSTihvYmpfcHJpdi0+c3RyaWRlICYgKDEyOCAtIDEpLAorCQkgICAgICJvYmplY3QgaXMgWSB0aWxlZCBidXQgaGFzIG5vbi0xMjhCIHBpdGNoXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogRmlyc3QgdHJ5IHRvIGZpbmQgYSBmcmVlIHJlZyAqLworCWZvciAoaSA9IGRldl9wcml2LT5mZW5jZV9yZWdfc3RhcnQ7IGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3M7IGkrKykgeworCQlyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV07CisJCWlmICghcmVnLT5vYmopCisJCQlicmVhazsKKwl9CisKKwkvKiBOb25lIGF2YWlsYWJsZSwgdHJ5IHRvIHN0ZWFsIG9uZSBvciB3YWl0IGZvciBhIHVzZXIgdG8gZmluaXNoICovCisJaWYgKGkgPT0gZGV2X3ByaXYtPm51bV9mZW5jZV9yZWdzKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvbGRfb2JqX3ByaXYgPSBOVUxMOworCQlsb2ZmX3Qgb2Zmc2V0OworCit0cnlfYWdhaW46CisJCS8qIENvdWxkIHRyeSB0byB1c2UgTFJVIGhlcmUgaW5zdGVhZC4uLiAqLworCQlmb3IgKGkgPSBkZXZfcHJpdi0+ZmVuY2VfcmVnX3N0YXJ0OworCQkgICAgIGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3M7IGkrKykgeworCQkJcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW2ldOworCQkJb2xkX29ial9wcml2ID0gcmVnLT5vYmotPmRyaXZlcl9wcml2YXRlOworCQkJaWYgKCFvbGRfb2JqX3ByaXYtPnBpbl9jb3VudCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIE5vdyB0aGluZ3MgZ2V0IHVnbHkuLi4gd2UgaGF2ZSB0byB3YWl0IGZvciBvbmUgb2YgdGhlCisJCSAqIG9iamVjdHMgdG8gZmluaXNoIGJlZm9yZSB0cnlpbmcgYWdhaW4uCisJCSAqLworCQlpZiAoaSA9PSBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3MpIHsKKwkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhyZWctPm9iaik7CisJCQlpZiAocmV0KSB7CisJCQkJV0FSTihyZXQsICJ3YWl0X3JlbmRlcmluZyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWdvdG8gdHJ5X2FnYWluOworCQl9CisKKwkJLyoKKwkJICogWmFwIHRoaXMgdmlydHVhbCBtYXBwaW5nIHNvIHdlIGNhbiBzZXQgdXAgYSBmZW5jZSBhZ2FpbgorCQkgKiBmb3IgdGhpcyBvYmplY3QgbmV4dCB0aW1lIHdlIG5lZWQgaXQuCisJCSAqLworCQlvZmZzZXQgPSAoKGxvZmZfdCkgcmVnLT5vYmotPm1hcF9saXN0Lmhhc2gua2V5KSA8PCBQQUdFX1NISUZUOworCQlpZiAoZGV2LT5kZXZfbWFwcGluZykKKwkJCXVubWFwX21hcHBpbmdfcmFuZ2UoZGV2LT5kZXZfbWFwcGluZywgb2Zmc2V0LAorCQkJCQkgICAgcmVnLT5vYmotPnNpemUsIDEpOworCQlvbGRfb2JqX3ByaXYtPmZlbmNlX3JlZyA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7CisJfQorCisJb2JqX3ByaXYtPmZlbmNlX3JlZyA9IGk7CisJcmVnLT5vYmogPSBvYmo7CisKKwlpZiAoSVNfSTk2NUcoZGV2KSkKKwkJaTk2NV93cml0ZV9mZW5jZV9yZWcocmVnKTsKKwllbHNlIGlmIChJU19JOVhYKGRldikpCisJCWk5MTVfd3JpdGVfZmVuY2VfcmVnKHJlZyk7CisJZWxzZQorCQlpODMwX3dyaXRlX2ZlbmNlX3JlZyhyZWcpOworfQorCisvKioKKyAqIGk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyAtIGNsZWFyIG91dCBmZW5jZSByZWdpc3RlciBpbmZvCisgKiBAb2JqOiBvYmplY3QgdG8gY2xlYXIKKyAqCisgKiBaZXJvZXMgb3V0IHRoZSBmZW5jZSByZWdpc3RlciBpdHNlbGYgYW5kIGNsZWFycyBvdXQgdGhlIGFzc29jaWF0ZWQKKyAqIGRhdGEgc3RydWN0dXJlcyBpbiBkZXZfcHJpdiBhbmQgb2JqX3ByaXYuCisgKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisKKwlpZiAoSVNfSTk2NUcoZGV2KSkKKwkJSTkxNV9XUklURTY0KEZFTkNFX1JFR185NjVfMCArIChvYmpfcHJpdi0+ZmVuY2VfcmVnICogOCksIDApOworCWVsc2UKKwkJSTkxNV9XUklURShGRU5DRV9SRUdfODMwXzAgKyAob2JqX3ByaXYtPmZlbmNlX3JlZyAqIDQpLCAwKTsKKworCWRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddLm9iaiA9IE5VTEw7CisJb2JqX3ByaXYtPmZlbmNlX3JlZyA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7Cit9CisKIC8qKgogICogRmluZHMgZnJlZSBzcGFjZSBpbiB0aGUgR1RUIGFwZXJ0dXJlIGFuZCBiaW5kcyB0aGUgb2JqZWN0IHRoZXJlLgogICovCkBAIC0xMzA3LDcgKzE3NjksNyBAQAogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoZW4gdGhlIG1vdmUgaXMgY29tcGxldGUsIGluY2x1ZGluZyB3YWl0aW5nIG9uCiAgKiBmbHVzaGVzIHRvIG9jY3VyLgogICovCi1zdGF0aWMgaW50CitpbnQKIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IHdyaXRlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CkBAIC0yMDI5LDEzICsyNDkxLDE1IEBACiAKIAkJLyogZXJyb3Igb3RoZXIgdGhhbiBHVFQgZnVsbCwgb3Igd2UndmUgYWxyZWFkeSB0cmllZCBhZ2FpbiAqLwogCQlpZiAocmV0ICE9IC1FTk9NRU0gfHwgcGluX3RyaWVzID49IDEpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIHBpbiBidWZmZXJzICVkXG4iLCByZXQpOworCQkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcGluIGJ1ZmZlcnMgJWRcbiIsIHJldCk7CiAJCQlnb3RvIGVycjsKIAkJfQogCiAJCS8qIHVucGluIGFsbCBvZiBvdXIgYnVmZmVycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgcGlubmVkOyBpKyspCiAJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqZWN0X2xpc3RbaV0pOworCQlwaW5uZWQgPSAwOwogCiAJCS8qIGV2aWN0IGV2ZXJ5b25lIHdlIGNhbiBmcm9tIHRoZSBhcGVydHVyZSAqLwogCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKGRldik7CkBAIC0yMTQ5LDEzICsyNjEzLDEyIEBACiAJCQkgICJiYWNrIHRvIHVzZXIgKCVkKVxuIiwKIAkJCSAgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKIGVycjoKLQlpZiAob2JqZWN0X2xpc3QgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcGlubmVkOyBpKyspCi0JCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqZWN0X2xpc3RbaV0pOworCWZvciAoaSA9IDA7IGkgPCBwaW5uZWQ7IGkrKykKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iamVjdF9saXN0W2ldKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspCi0JCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmplY3RfbGlzdFtpXSk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqZWN0X2xpc3RbaV0pOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIHByZV9tdXRleF9lcnI6CkBAIC0yMTc4LDcgKzI2NDEsOCBAQAogCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpIHsKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgYWxpZ25tZW50KTsKIAkJaWYgKHJldCAhPSAwKSB7Ci0JCQlEUk1fRVJST1IoIkZhaWx1cmUgdG8gYmluZDogJWQiLCByZXQpOworCQkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQkJRFJNX0VSUk9SKCJGYWlsdXJlIHRvIGJpbmQ6ICVkIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC0yMjQ5LDExICsyNzEzLDIyIEBACiAJfQogCW9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBhcmdzLT5hbGlnbm1lbnQpOwotCWlmIChyZXQgIT0gMCkgewotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWlmIChvYmpfcHJpdi0+cGluX2ZpbHAgIT0gTlVMTCAmJiBvYmpfcHJpdi0+cGluX2ZpbHAgIT0gZmlsZV9wcml2KSB7CisJCURSTV9FUlJPUigiQWxyZWFkeSBwaW5uZWQgaW4gaTkxNV9nZW1fcGluX2lvY3RsKCk6ICVkXG4iLAorCQkJICBhcmdzLT5oYW5kbGUpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2JqX3ByaXYtPnVzZXJfcGluX2NvdW50Kys7CisJb2JqX3ByaXYtPnBpbl9maWxwID0gZmlsZV9wcml2OworCWlmIChvYmpfcHJpdi0+dXNlcl9waW5fY291bnQgPT0gMSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYXJncy0+YWxpZ25tZW50KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJLyogWFhYIC0gZmx1c2ggdGhlIENQVSBjYWNoZXMgZm9yIHBpbm5lZCBvYmplY3RzCkBAIC0yMjczLDYgKzI3NDgsNyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcGluICphcmdzID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTIyODQsNyArMjc2MCwxOSBAQAogCQlyZXR1cm4gLUVCQURGOwogCX0KIAotCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCW9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwlpZiAob2JqX3ByaXYtPnBpbl9maWxwICE9IGZpbGVfcHJpdikgeworCQlEUk1fRVJST1IoIk5vdCBwaW5uZWQgYnkgY2FsbGVyIGluIGk5MTVfZ2VtX3Bpbl9pb2N0bCgpOiAlZFxuIiwKKwkJCSAgYXJncy0+aGFuZGxlKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlvYmpfcHJpdi0+dXNlcl9waW5fY291bnQtLTsKKwlpZiAob2JqX3ByaXYtPnVzZXJfcGluX2NvdW50ID09IDApIHsKKwkJb2JqX3ByaXYtPnBpbl9maWxwID0gTlVMTDsKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CisJfQogCiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTIzNTEsMTIgKzI4MzksMTggQEAKIAogCW9iai0+ZHJpdmVyX3ByaXZhdGUgPSBvYmpfcHJpdjsKIAlvYmpfcHJpdi0+b2JqID0gb2JqOworCW9ial9wcml2LT5mZW5jZV9yZWcgPSBJOTE1X0ZFTkNFX1JFR19OT05FOwogCUlOSVRfTElTVF9IRUFEKCZvYmpfcHJpdi0+bGlzdCk7CisKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSBvYmotPmRyaXZlcl9wcml2YXRlOwogCiAJd2hpbGUgKG9ial9wcml2LT5waW5fY291bnQgPiAwKQpAQCAtMjM2NCw2ICsyODU4LDIwIEBACiAKIAlpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAKKwlsaXN0ID0gJm9iai0+bWFwX2xpc3Q7CisJZHJtX2h0X3JlbW92ZV9pdGVtKCZtbS0+b2Zmc2V0X2hhc2gsICZsaXN0LT5oYXNoKTsKKworCWlmIChsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7CisJCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7CisJCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBOVUxMOworCX0KKworCW1hcCA9IGxpc3QtPm1hcDsKKwlpZiAobWFwKSB7CisJCWRybV9mcmVlKG1hcCwgc2l6ZW9mKCptYXApLCBEUk1fTUVNX0RSSVZFUik7CisJCWxpc3QtPm1hcCA9IE5VTEw7CisJfQorCiAJZHJtX2ZyZWUob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkLCAxLCBEUk1fTUVNX0RSSVZFUik7CiAJZHJtX2ZyZWUob2JqLT5kcml2ZXJfcHJpdmF0ZSwgMSwgRFJNX01FTV9EUklWRVIpOwogfQpAQCAtMjQzMiw4ICsyOTQwLDcgQEAKIAkgKi8KIAlpOTE1X2dlbV9mbHVzaChkZXYsIH4oSTkxNV9HRU1fRE9NQUlOX0NQVXxJOTE1X0dFTV9ET01BSU5fR1RUKSwKIAkJICAgICAgIH4oSTkxNV9HRU1fRE9NQUlOX0NQVXxJOTE1X0dFTV9ET01BSU5fR1RUKSk7Ci0Jc2Vxbm8gPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgfihJOTE1X0dFTV9ET01BSU5fQ1BVIHwKLQkJCQkJSTkxNV9HRU1fRE9NQUlOX0dUVCkpOworCXNlcW5vID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKIAogCWlmIChzZXFubyA9PSAwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMjU2MCwxMiArMzA2NywxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50CitpbnQKIGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJmRldl9wcml2LT5yaW5nOwogCWludCByZXQ7CiAJdTMyIGhlYWQ7CiAKQEAgLTI1ODcsMjQgKzMwOTUsMjQgQEAKIAl9CiAKIAkvKiBTZXQgdXAgdGhlIGtlcm5lbCBtYXBwaW5nIGZvciB0aGUgcmluZy4gKi8KLQlkZXZfcHJpdi0+cmluZy5TaXplID0gb2JqLT5zaXplOwotCWRldl9wcml2LT5yaW5nLnRhaWxfbWFzayA9IG9iai0+c2l6ZSAtIDE7CisJcmluZy0+U2l6ZSA9IG9iai0+c2l6ZTsKKwlyaW5nLT50YWlsX21hc2sgPSBvYmotPnNpemUgLSAxOwogCi0JZGV2X3ByaXYtPnJpbmcubWFwLm9mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JZGV2X3ByaXYtPnJpbmcubWFwLnNpemUgPSBvYmotPnNpemU7Ci0JZGV2X3ByaXYtPnJpbmcubWFwLnR5cGUgPSAwOwotCWRldl9wcml2LT5yaW5nLm1hcC5mbGFncyA9IDA7Ci0JZGV2X3ByaXYtPnJpbmcubWFwLm10cnIgPSAwOworCXJpbmctPm1hcC5vZmZzZXQgPSBkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0OworCXJpbmctPm1hcC5zaXplID0gb2JqLT5zaXplOworCXJpbmctPm1hcC50eXBlID0gMDsKKwlyaW5nLT5tYXAuZmxhZ3MgPSAwOworCXJpbmctPm1hcC5tdHJyID0gMDsKIAotCWRybV9jb3JlX2lvcmVtYXBfd2MoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKLQlpZiAoZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZSA9PSBOVUxMKSB7CisJZHJtX2NvcmVfaW9yZW1hcF93YygmcmluZy0+bWFwLCBkZXYpOworCWlmIChyaW5nLT5tYXAuaGFuZGxlID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbWFwIHJpbmdidWZmZXIuXG4iKTsKIAkJbWVtc2V0KCZkZXZfcHJpdi0+cmluZywgMCwgc2l6ZW9mKGRldl9wcml2LT5yaW5nKSk7CiAJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlkZXZfcHJpdi0+cmluZy5yaW5nX29iaiA9IG9iajsKLQlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZTsKKwlyaW5nLT5yaW5nX29iaiA9IG9iajsKKwlyaW5nLT52aXJ0dWFsX3N0YXJ0ID0gcmluZy0+bWFwLmhhbmRsZTsKIAogCS8qIFN0b3AgdGhlIHJpbmcgaWYgaXQncyBydW5uaW5nLiAqLwogCUk5MTVfV1JJVEUoUFJCMF9DVEwsIDApOwpAQCAtMjY1MiwxMiArMzE2MCwyMCBAQAogCX0KIAogCS8qIFVwZGF0ZSBvdXIgY2FjaGUgb2YgdGhlIHJpbmcgc3RhdGUgKi8KLQlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOworCWVsc2UgeworCQlyaW5nLT5oZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7CisJCXJpbmctPnRhaWwgPSBJOTE1X1JFQUQoUFJCMF9UQUlMKSAmIFRBSUxfQUREUjsKKwkJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKKwkJaWYgKHJpbmctPnNwYWNlIDwgMCkKKwkJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI2OTUsNiArMzIxMSw5IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldDsKIAorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlyZXR1cm4gMDsKKwogCWlmIChkZXZfcHJpdi0+bW0ud2VkZ2VkKSB7CiAJCURSTV9FUlJPUigiUmVlbmFibGluZyB3ZWRnZWQgaGFyZHdhcmUsIGdvb2QgbHVja1xuIik7CiAJCWRldl9wcml2LT5tbS53ZWRnZWQgPSAwOwpAQCAtMjcyOCw2ICszMjQ3LDkgQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0OwogCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybiAwOworCiAJcmV0ID0gaTkxNV9nZW1faWRsZShkZXYpOwogCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAKQEAgLTI3NTgsNSArMzI4MCwxMyBAQAogCQkJICBpOTE1X2dlbV9yZXRpcmVfd29ya19oYW5kbGVyKTsKIAlkZXZfcHJpdi0+bW0ubmV4dF9nZW1fc2Vxbm8gPSAxOwogCisJLyogT2xkIFggZHJpdmVycyB3aWxsIHRha2UgMC0yIGZvciBmcm9udCwgYmFjaywgZGVwdGggYnVmZmVycyAqLworCWRldl9wcml2LT5mZW5jZV9yZWdfc3RhcnQgPSAzOworCisJaWYgKElTX0k5NjVHKGRldikpCisJCWRldl9wcml2LT5udW1fZmVuY2VfcmVncyA9IDE2OworCWVsc2UKKwkJZGV2X3ByaXYtPm51bV9mZW5jZV9yZWdzID0gODsKKwogCWk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9wcm9jLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9wcm9jLmMKaW5kZXggZThkNWFiZS4uNGQxYjlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fcHJvYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3Byb2MuYwpAQCAtMjUwLDYgKzI1MCwzOSBAQAogCXJldHVybiBsZW4gLSBvZmZzZXQ7CiB9CiAKK3N0YXRpYyBpbnQgaTkxNV9od3NfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX21pbm9yICptaW5vciA9IChzdHJ1Y3QgZHJtX21pbm9yICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG1pbm9yLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGxlbiA9IDAsIGk7CisJdm9sYXRpbGUgdTMyICpod3M7CisKKwlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCWh3cyA9ICh2b2xhdGlsZSB1MzIgKilkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CisJaWYgKGh3cyA9PSBOVUxMKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc3RhcnQgPSAmYnVmW29mZnNldF07CisJKmVvZiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQwOTYgLyBzaXplb2YodTMyKSAvIDQ7IGkgKz0gNCkgeworCQlEUk1fUFJPQ19QUklOVCgiMHglMDh4OiAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCisJCQkgICAgICAgaSAqIDQsCisJCQkgICAgICAgaHdzW2ldLCBod3NbaSArIDFdLCBod3NbaSArIDJdLCBod3NbaSArIDNdKTsKKwl9CisJaWYgKGxlbiA+IHJlcXVlc3QgKyBvZmZzZXQpCisJCXJldHVybiByZXF1ZXN0OworCSplb2YgPSAxOworCXJldHVybiBsZW4gLSBvZmZzZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHJtX3Byb2NfbGlzdCB7CiAJLyoqIGZpbGUgbmFtZSAqLwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yNjIsNiArMjk1LDcgQEAKIAl7Imk5MTVfZ2VtX3JlcXVlc3QiLCBpOTE1X2dlbV9yZXF1ZXN0X2luZm99LAogCXsiaTkxNV9nZW1fc2Vxbm8iLCBpOTE1X2dlbV9zZXFub19pbmZvfSwKIAl7Imk5MTVfZ2VtX2ludGVycnVwdCIsIGk5MTVfaW50ZXJydXB0X2luZm99LAorCXsiaTkxNV9nZW1faHdzIiwgaTkxNV9od3NfaW5mb30sCiB9OwogCiAjZGVmaW5lIEk5MTVfR0VNX1BST0NfRU5UUklFUyBBUlJBWV9TSVpFKGk5MTVfZ2VtX3Byb2NfbGlzdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKaW5kZXggYThjYjY5NC4uMjQxZjM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKQEAgLTIwOCw2ICsyMDgsNyBAQAogCQl9CiAJfQogCW9ial9wcml2LT50aWxpbmdfbW9kZSA9IGFyZ3MtPnRpbGluZ19tb2RlOworCW9ial9wcml2LT5zdHJpZGUgPSBhcmdzLT5zdHJpZGU7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggNjliOWE0Mi4uMGNhZGFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImludGVsX2Rydi5oIgogCiAjZGVmaW5lIE1BWF9OT1BJRCAoKHUzMil+MCkKIApAQCAtNTEsNiArNTIsMTUgQEAKICNkZWZpbmUgSTkxNV9JTlRFUlJVUFRfRU5BQkxFX01BU0sgKEk5MTVfSU5URVJSVVBUX0VOQUJMRV9GSVggfCBcCiAJCQkJICAgIEk5MTVfSU5URVJSVVBUX0VOQUJMRV9WQVIpCiAKKyNkZWZpbmUgSTkxNV9QSVBFX1ZCTEFOS19TVEFUVVMJKFBJUEVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9TVEFUVVMgfFwKKwkJCQkgUElQRV9WQkxBTktfSU5URVJSVVBUX1NUQVRVUykKKworI2RlZmluZSBJOTE1X1BJUEVfVkJMQU5LX0VOQUJMRQkoUElQRV9TVEFSVF9WQkxBTktfSU5URVJSVVBUX0VOQUJMRSB8XAorCQkJCSBQSVBFX1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFKQorCisjZGVmaW5lIERSTV9JOTE1X1ZCTEFOS19QSVBFX0FMTAkoRFJNX0k5MTVfVkJMQU5LX1BJUEVfQSB8IFwKKwkJCQkJIERSTV9JOTE1X1ZCTEFOS19QSVBFX0IpCisKIHZvaWQKIGk5MTVfZW5hYmxlX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKQEAgLTE2OCw2ICsxNzgsNyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKIAl1MzIgaWlyLCBuZXdfaWlyOwogCXUzMiBwaXBlYV9zdGF0cywgcGlwZWJfc3RhdHM7CiAJdTMyIHZibGFua19zdGF0dXM7CkBAIC0yMDAsNiArMjExLDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CiAJCXBpcGVhX3N0YXRzID0gSTkxNV9SRUFEKFBJUEVBU1RBVCk7CiAJCXBpcGViX3N0YXRzID0gSTkxNV9SRUFEKFBJUEVCU1RBVCk7CisKIAkJLyoKIAkJICogQ2xlYXIgdGhlIFBJUEUoQXxCKVNUQVQgcmVncyBiZWZvcmUgdGhlIElJUgogCQkgKi8KQEAgLTIyMiw5ICsyMzQsMTIgQEAKIAkJSTkxNV9XUklURShJSVIsIGlpcik7CiAJCW5ld19paXIgPSBJOTE1X1JFQUQoSUlSKTsgLyogRmx1c2ggcG9zdGVkIHdyaXRlcyAqLwogCi0JCWlmIChkZXZfcHJpdi0+c2FyZWFfcHJpdikKLQkJCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0KLQkJCQlSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpOworCQlpZiAoZGV2LT5wcmltYXJ5LT5tYXN0ZXIpIHsKKwkJCW1hc3Rlcl9wcml2ID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OworCQkJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQkJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoID0KKwkJCQkJUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KTsKKwkJfQogCiAJCWlmIChpaXIgJiBJOTE1X1VTRVJfSU5URVJSVVBUKSB7CiAJCQlkZXZfcHJpdi0+bW0uaXJxX2dlbV9zZXFubyA9IGk5MTVfZ2V0X2dlbV9zZXFubyhkZXYpOwpAQCAtMjY5LDYgKzI4NCw3IEBACiBzdGF0aWMgaW50IGk5MTVfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlSSU5HX0xPQ0FMUzsKIAogCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOwpAQCAtMjc4LDggKzI5NCw4IEBACiAJZGV2X3ByaXYtPmNvdW50ZXIrKzsKIAlpZiAoZGV2X3ByaXYtPmNvdW50ZXIgPiAweDdGRkZGRkZGVUwpCiAJCWRldl9wcml2LT5jb3VudGVyID0gMTsKLQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYpCi0JCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcjsKKwlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCisJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcjsKIAogCUJFR0lOX0xQX1JJTkcoNCk7CiAJT1VUX1JJTkcoTUlfU1RPUkVfRFdPUkRfSU5ERVgpOwpAQCAtMzE3LDIxICszMzMsMjAgQEAKIHN0YXRpYyBpbnQgaTkxNV93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAJaW50IHJldCA9IDA7CiAKIAlEUk1fREVCVUcoImlycV9ucj0lZCBicmVhZGNydW1iPSVkXG4iLCBpcnFfbnIsCiAJCSAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSk7CiAKIAlpZiAoUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpIHsKLQkJaWYgKGRldl9wcml2LT5zYXJlYV9wcml2KSB7Ci0JCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9Ci0JCQkJUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KTsKLQkJfQorCQlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCisJCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IFJFQURfQlJFQURDUlVNQihkZXZfcHJpdik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChkZXZfcHJpdi0+c2FyZWFfcHJpdikKLQkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfV0FJVDsKKwlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCisJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1dBSVQ7CiAKIAlpOTE1X3VzZXJfaXJxX2dldChkZXYpOwogCURSTV9XQUlUX09OKHJldCwgZGV2X3ByaXYtPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKQEAgLTM0MywxMCArMzU4LDYgQEAKIAkJCSAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSwgKGludClkZXZfcHJpdi0+Y291bnRlcik7CiAJfQogCi0JaWYgKGRldl9wcml2LT5zYXJlYV9wcml2KQotCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9Ci0JCQlSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDI3LDYgKzQzOCwxNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKK3ZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJb3ByZWdpb25fZW5hYmxlX2FzbGUoZGV2KTsKKwlkZXZfcHJpdi0+aXJxX2VuYWJsZWQgPSAxOworfQorCisKIC8qIFNldCB0aGUgdmJsYW5rIG1vbml0b3IgcGlwZQogICovCiBpbnQgaTkxNV92YmxhbmtfcGlwZV9zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTQ4Nyw2ICs1MDYsOCBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKKwlhdG9taWNfc2V0KCZkZXZfcHJpdi0+aXJxX3JlY2VpdmVkLCAwKTsKKwogCUk5MTVfV1JJVEUoSFdTVEFNLCAweGVmZmUpOwogCUk5MTVfV1JJVEUoUElQRUFTVEFULCAwKTsKIAlJOTE1X1dSSVRFKFBJUEVCU1RBVCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9tZW0uYwppbmRleCA2MTI2YTYwLi45NmUyNzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X21lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfbWVtLmMKQEAgLTQ2LDcgKzQ2LDggQEAKIHN0YXRpYyB2b2lkIG1hcmtfYmxvY2soc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBpbl91c2UpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CisJZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2OwogCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiAqbGlzdDsKIAl1bnNpZ25lZCBzaGlmdCwgbnI7CiAJdW5zaWduZWQgc3RhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X29wcmVnaW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X29wcmVnaW9uLmMKaW5kZXggMTNhZTczMS4uZmYwMTI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9vcHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfb3ByZWdpb24uYwpAQCAtMjU3LDggKzI1Nyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfb3ByZWdpb24gKnN5c3RlbV9vcHJlZ2lvbjsKIAotaW50IGludGVsX29wcmVnaW9uX3ZpZGVvX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgICAgIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGludGVsX29wcmVnaW9uX3ZpZGVvX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJLyogVGhlIG9ubHkgdmlkZW8gZXZlbnRzIHJlbGV2YW50IHRvIG9wcmVnaW9uIGFyZSAweDgwLiBUaGVzZSBpbmRpY2F0ZQogCSAgIGVpdGhlciBhIGRvY2tpbmcgZXZlbnQsIGxpZCBzd2l0Y2ggb3IgZGlzcGxheSBzd2l0Y2ggcmVxdWVzdC4gSW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDlkMjRhYWUuLjQ3ZTZiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtMTc1LDkgKzE3NSwyNiBAQAogI2RlZmluZSAgIERJU1BMQVlfUExBTkVfQiAgICAgICAgICAgKDE8PDIwKQogCiAvKgorICogRmVuY2UgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgRkVOQ0VfUkVHXzgzMF8wCQkJMHgyMDAwCisjZGVmaW5lICAgSTgzMF9GRU5DRV9TVEFSVF9NQVNLCQkweDA3ZjgwMDAwCisjZGVmaW5lICAgSTgzMF9GRU5DRV9USUxJTkdfWV9TSElGVAkxMgorI2RlZmluZSAgIEk4MzBfRkVOQ0VfU0laRV9CSVRTKHNpemUpCSgoZ2V0X29yZGVyKHNpemUgPj4gMTkpIC0gMSkgPDwgOCkKKyNkZWZpbmUgICBJODMwX0ZFTkNFX1BJVENIX1NISUZUCTQKKyNkZWZpbmUgICBJODMwX0ZFTkNFX1JFR19WQUxJRAkJKDE8PDApCisKKyNkZWZpbmUgICBJOTE1X0ZFTkNFX1NUQVJUX01BU0sJCTB4MGZmMDAwMDAKKyNkZWZpbmUgICBJOTE1X0ZFTkNFX1NJWkVfQklUUyhzaXplKQkoKGdldF9vcmRlcihzaXplID4+IDIwKSAtIDEpIDw8IDgpCisKKyNkZWZpbmUgRkVOQ0VfUkVHXzk2NV8wCQkJMHgwMzAwMAorI2RlZmluZSAgIEk5NjVfRkVOQ0VfUElUQ0hfU0hJRlQJMgorI2RlZmluZSAgIEk5NjVfRkVOQ0VfVElMSU5HX1lfU0hJRlQJMQorI2RlZmluZSAgIEk5NjVfRkVOQ0VfUkVHX1ZBTElECQkoMTw8MCkKKworLyoKICAqIEluc3RydWN0aW9uIGFuZCBpbnRlcnJ1cHQgY29udHJvbCByZWdzCiAgKi8KLQogI2RlZmluZSBQUkIwX1RBSUwJMHgwMjAzMAogI2RlZmluZSBQUkIwX0hFQUQJMHgwMjAzNAogI2RlZmluZSBQUkIwX1NUQVJUCTB4MDIwMzgKQEAgLTI0NSw2ICsyNjIsNyBAQAogI2RlZmluZSAgIENNMF9SQ19PUF9GTFVTSF9ESVNBQkxFICgxPDwwKQogI2RlZmluZSBHRlhfRkxTSF9DTlRMCTB4MDIxNzAgLyogOTE1KyBvbmx5ICovCiAKKwogLyoKICAqIEZyYW1lYnVmZmVyIGNvbXByZXNzaW9uICg5MTUrIG9ubHkpCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E4MmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImludGVsX2Jpb3MuaCIKKworCitzdGF0aWMgdm9pZCAqCitmaW5kX3NlY3Rpb24oc3RydWN0IGJkYl9oZWFkZXIgKmJkYiwgaW50IHNlY3Rpb25faWQpCit7CisJdTggKmJhc2UgPSAodTggKiliZGI7CisJaW50IGluZGV4ID0gMDsKKwl1MTYgdG90YWwsIGN1cnJlbnRfc2l6ZTsKKwl1OCBjdXJyZW50X2lkOworCisJLyogc2tpcCB0byBmaXJzdCBzZWN0aW9uICovCisJaW5kZXggKz0gYmRiLT5oZWFkZXJfc2l6ZTsKKwl0b3RhbCA9IGJkYi0+YmRiX3NpemU7CisKKwkvKiB3YWxrIHRoZSBzZWN0aW9ucyBsb29raW5nIGZvciBzZWN0aW9uX2lkICovCisJd2hpbGUgKGluZGV4IDwgdG90YWwpIHsKKwkJY3VycmVudF9pZCA9ICooYmFzZSArIGluZGV4KTsKKwkJaW5kZXgrKzsKKwkJY3VycmVudF9zaXplID0gKigodTE2ICopKGJhc2UgKyBpbmRleCkpOworCQlpbmRleCArPSAyOworCQlpZiAoY3VycmVudF9pZCA9PSBzZWN0aW9uX2lkKQorCQkJcmV0dXJuIGJhc2UgKyBpbmRleDsKKwkJaW5kZXggKz0gY3VycmVudF9zaXplOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBUcnkgdG8gZmluZCBwYW5lbCBkYXRhICovCitzdGF0aWMgdm9pZAorcGFyc2VfcGFuZWxfZGF0YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCit7CisJc3RydWN0IGJkYl9sdmRzX29wdGlvbnMgKmx2ZHNfb3B0aW9uczsKKwlzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGEgKmx2ZHNfbGZwX2RhdGE7CisJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICpkdm9fdGltaW5nOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOworCisJLyogRGVmYXVsdHMgaWYgd2UgY2FuJ3QgZmluZCBWQlQgaW5mbyAqLworCWRldl9wcml2LT5sdmRzX2RpdGhlciA9IDA7CisJZGV2X3ByaXYtPmx2ZHNfdmJ0ID0gMDsKKworCWx2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9MVkRTX09QVElPTlMpOworCWlmICghbHZkc19vcHRpb25zKQorCQlyZXR1cm47CisKKwlkZXZfcHJpdi0+bHZkc19kaXRoZXIgPSBsdmRzX29wdGlvbnMtPnBpeGVsX2RpdGhlcjsKKwlpZiAobHZkc19vcHRpb25zLT5wYW5lbF90eXBlID09IDB4ZmYpCisJCXJldHVybjsKKworCWx2ZHNfbGZwX2RhdGEgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQSk7CisJaWYgKCFsdmRzX2xmcF9kYXRhKQorCQlyZXR1cm47CisKKwlkZXZfcHJpdi0+bHZkc192YnQgPSAxOworCisJZW50cnkgPSAmbHZkc19sZnBfZGF0YS0+ZGF0YVtsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGVdOworCWR2b190aW1pbmcgPSAmZW50cnktPmR2b190aW1pbmc7CisKKwlwYW5lbF9maXhlZF9tb2RlID0gZHJtX2NhbGxvYygxLCBzaXplb2YoKnBhbmVsX2ZpeGVkX21vZGUpLAorCQkJCSAgICAgIERSTV9NRU1fRFJJVkVSKTsKKworCXBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ID0gKGR2b190aW1pbmctPmhhY3RpdmVfaGkgPDwgOCkgfAorCQlkdm9fdGltaW5nLT5oYWN0aXZlX2xvOworCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgKworCQkoKGR2b190aW1pbmctPmhzeW5jX29mZl9oaSA8PCA4KSB8IGR2b190aW1pbmctPmhzeW5jX29mZl9sbyk7CisJcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kID0gcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfc3RhcnQgKworCQlkdm9fdGltaW5nLT5oc3luY19wdWxzZV93aWR0aDsKKwlwYW5lbF9maXhlZF9tb2RlLT5odG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSArCisJCSgoZHZvX3RpbWluZy0+aGJsYW5rX2hpIDw8IDgpIHwgZHZvX3RpbWluZy0+aGJsYW5rX2xvKTsKKworCXBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ID0gKGR2b190aW1pbmctPnZhY3RpdmVfaGkgPDwgOCkgfAorCQlkdm9fdGltaW5nLT52YWN0aXZlX2xvOworCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgKworCQlkdm9fdGltaW5nLT52c3luY19vZmY7CisJcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kID0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQgKworCQlkdm9fdGltaW5nLT52c3luY19wdWxzZV93aWR0aDsKKwlwYW5lbF9maXhlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSArCisJCSgoZHZvX3RpbWluZy0+dmJsYW5rX2hpIDw8IDgpIHwgZHZvX3RpbWluZy0+dmJsYW5rX2xvKTsKKwlwYW5lbF9maXhlZF9tb2RlLT5jbG9jayA9IGR2b190aW1pbmctPmNsb2NrICogMTA7CisJcGFuZWxfZml4ZWRfbW9kZS0+dHlwZSA9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCisJZHJtX21vZGVfc2V0X25hbWUocGFuZWxfZml4ZWRfbW9kZSk7CisKKwlkZXZfcHJpdi0+dmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOworCisJRFJNX0RFQlVHKCJGb3VuZCBwYW5lbCBtb2RlIGluIEJJT1MgVkJUIHRhYmxlczpcbiIpOworCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUocGFuZWxfZml4ZWRfbW9kZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJICAgICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCit7CisJc3RydWN0IGJkYl9nZW5lcmFsX2ZlYXR1cmVzICpnZW5lcmFsOworCisJLyogU2V0IHNlbnNpYmxlIGRlZmF1bHRzIGluIGNhc2Ugd2UgY2FuJ3QgZmluZCB0aGUgZ2VuZXJhbCBibG9jayAqLworCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IDE7CisJZGV2X3ByaXYtPmludF9jcnRfc3VwcG9ydCA9IDE7CisKKwlnZW5lcmFsID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0dFTkVSQUxfRkVBVFVSRVMpOworCWlmIChnZW5lcmFsKSB7CisJCWRldl9wcml2LT5pbnRfdHZfc3VwcG9ydCA9IGdlbmVyYWwtPmludF90dl9zdXBwb3J0OworCQlkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X2NydF9zdXBwb3J0OworCX0KK30KKworLyoqCisgKiBpbnRlbF9pbml0X2Jpb3MgLSBpbml0aWFsaXplIFZCSU9TIHNldHRpbmdzICYgZmluZCBWQlQKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqCisgKiBMb2FkcyB0aGUgVmlkZW8gQklPUyBhbmQgY2hlY2tzIHRoYXQgdGhlIFZCVCBleGlzdHMuICBTZXRzIHNjcmF0Y2ggcmVnaXN0ZXJzCisgKiB0byBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKgorICogVkJUIGV4aXN0ZW5jZSBpcyBhIHNhbml0eSBjaGVjayB0aGF0IGlzIHJlbGllZCBvbiBieSBvdGhlciBpODMwX2Jpb3MuYyBjb2RlLgorICogTm90ZSB0aGF0IGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgYSBCSU9TIGNhbGwgdG8gZ2V0IHRoZSBWQlQsIGFzIEJJT1NlcyBtYXkKKyAqIGZlZWQgYW4gdXBkYXRlZCBWQlQgYmFjayB0aHJvdWdoIHRoYXQsIGNvbXBhcmVkIHRvIHdoYXQgd2UnbGwgZmV0Y2ggdXNpbmcKKyAqIHRoaXMgbWV0aG9kIG9mIGdyb3BpbmcgYXJvdW5kIGluIHRoZSBCSU9TIGRhdGEuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KKyAqLworYm9vbAoraW50ZWxfaW5pdF9iaW9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlzdHJ1Y3QgdmJ0X2hlYWRlciAqdmJ0ID0gTlVMTDsKKwlzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiOworCXU4IF9faW9tZW0gKmJpb3M7CisJc2l6ZV90IHNpemU7CisJaW50IGk7CisKKwliaW9zID0gcGNpX21hcF9yb20ocGRldiwgJnNpemUpOworCWlmICghYmlvcykKKwkJcmV0dXJuIC0xOworCisJLyogU2NvdXIgbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBWQlQgc2lnbmF0dXJlICovCisJZm9yIChpID0gMDsgaSArIDQgPCBzaXplOyBpKyspIHsKKwkJaWYgKCFtZW1jbXAoYmlvcyArIGksICIkVkJUIiwgNCkpIHsKKwkJCXZidCA9IChzdHJ1Y3QgdmJ0X2hlYWRlciAqKShiaW9zICsgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghdmJ0KSB7CisJCURSTV9FUlJPUigiVkJUIHNpZ25hdHVyZSBtaXNzaW5nXG4iKTsKKwkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKShiaW9zICsgaSArIHZidC0+YmRiX29mZnNldCk7CisKKwkvKiBHcmFiIHVzZWZ1bCBnZW5lcmFsIGRlZmluaXRpb25zICovCisJcGFyc2VfZ2VuZXJhbF9mZWF0dXJlcyhkZXZfcHJpdiwgYmRiKTsKKwlwYXJzZV9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOworCisJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTcxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisjaWZuZGVmIF9JODMwX0JJT1NfSF8KKyNkZWZpbmUgX0k4MzBfQklPU19IXworCisjaW5jbHVkZSAiZHJtUC5oIgorCitzdHJ1Y3QgdmJ0X2hlYWRlciB7CisJdTggc2lnbmF0dXJlWzIwXTsJCS8qKjwgQWx3YXlzIHN0YXJ0cyB3aXRoICdWQlQkJyAqLworCXUxNiB2ZXJzaW9uOwkJCS8qKjwgZGVjaW1hbCAqLworCXUxNiBoZWFkZXJfc2l6ZTsJCS8qKjwgaW4gYnl0ZXMgKi8KKwl1MTYgdmJ0X3NpemU7CQkJLyoqPCBpbiBieXRlcyAqLworCXU4IHZidF9jaGVja3N1bTsKKwl1OCByZXNlcnZlZDA7CisJdTMyIGJkYl9vZmZzZXQ7CQkJLyoqPCBmcm9tIGJlZ2lubmluZyBvZiBWQlQgKi8KKwl1MzIgYWltX29mZnNldFs0XTsJCS8qKjwgZnJvbSBiZWdpbm5pbmcgb2YgVkJUICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYmRiX2hlYWRlciB7CisJdTggc2lnbmF0dXJlWzE2XTsJCS8qKjwgQWx3YXlzICdCSU9TX0RBVEFfQkxPQ0snICovCisJdTE2IHZlcnNpb247CQkJLyoqPCBkZWNpbWFsICovCisJdTE2IGhlYWRlcl9zaXplOwkJLyoqPCBpbiBieXRlcyAqLworCXUxNiBiZGJfc2l6ZTsJCQkvKio8IGluIGJ5dGVzICovCit9OworCisvKiBzdHJpY3RseSBzcGVha2luZywgdGhpcyBpcyBhICJza2lwIiBibG9jaywgYnV0IGl0IGhhcyBpbnRlcmVzdGluZyBpbmZvICovCitzdHJ1Y3QgdmJpb3NfZGF0YSB7CisJdTggdHlwZTsgLyogMCA9PSBkZXNrdG9wLCAxID09IG1vYmlsZSAqLworCXU4IHJlbHN0YWdlOworCXU4IGNoaXBzZXQ7CisJdTggbHZkc19wcmVzZW50OjE7CisJdTggdHZfcHJlc2VudDoxOworCXU4IHJzdmQyOjY7IC8qIGZpbmlzaCBieXRlICovCisJdTggcnN2ZDNbNF07CisJdTggc2lnbm9uWzE1NV07CisJdTggY29weXJpZ2h0WzYxXTsKKwl1MTYgY29kZV9zZWdtZW50OworCXU4IGRvc19ib290X21vZGU7CisJdTggYmFuZHdpZHRoX3BlcmNlbnQ7CisJdTggcnN2ZDQ7IC8qIHBvcHVwIG1lbW9yeSBzaXplICovCisJdTggcmVzaXplX3BjaV9iaW9zOworCXU4IHJzdmQ1OyAvKiBpcyBjcnQgYWxyZWFkeSBvbiBkZGMyICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgQklPUyBkYXRhIGJsb2NrcyAoQkRCcyksIGVhY2ggYmxvY2sgaGFzCisgKiBhbiBJRCBhbmQgc2l6ZSBpbiB0aGUgZmlyc3QgMyBieXRlcyAoSUQgaW4gZmlyc3QsIHNpemUgaW4gbmV4dCAyKS4KKyAqIEtub3duIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3cuCisgKi8KKyNkZWZpbmUgQkRCX0dFTkVSQUxfRkVBVFVSRVMJICAxCisjZGVmaW5lIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TCSAgMgorI2RlZmluZSBCREJfT0xEX1RPR0dMRV9MSVNUCSAgMworI2RlZmluZSBCREJfTU9ERV9TVVBQT1JUX0xJU1QJICA0CisjZGVmaW5lIEJEQl9HRU5FUklDX01PREVfVEFCTEUJICA1CisjZGVmaW5lIEJEQl9FWFRfTU1JT19SRUdTCSAgNgorI2RlZmluZSBCREJfU1dGX0lPCQkgIDcKKyNkZWZpbmUgQkRCX1NXRl9NTUlPCQkgIDgKKyNkZWZpbmUgQkRCX0RPVF9DTE9DS19UQUJMRQkgIDkKKyNkZWZpbmUgQkRCX01PREVfUkVNT1ZBTF9UQUJMRQkgMTAKKyNkZWZpbmUgQkRCX0NISUxEX0RFVklDRV9UQUJMRQkgMTEKKyNkZWZpbmUgQkRCX0RSSVZFUl9GRUFUVVJFUwkgMTIKKyNkZWZpbmUgQkRCX0RSSVZFUl9QRVJTSVNURU5DRQkgMTMKKyNkZWZpbmUgQkRCX0VYVF9UQUJMRV9QVFJTCSAxNAorI2RlZmluZSBCREJfRE9UX0NMT0NLX09WRVJSSURFCSAxNQorI2RlZmluZSBCREJfRElTUExBWV9TRUxFQ1QJIDE2CisvKiAxNyByc3ZkICovCisjZGVmaW5lIEJEQl9EUklWRVJfUk9UQVRJT04JIDE4CisjZGVmaW5lIEJEQl9ESVNQTEFZX1JFTU9WRQkgMTkKKyNkZWZpbmUgQkRCX09FTV9DVVNUT00JCSAyMAorI2RlZmluZSBCREJfRUZQX0xJU1QJCSAyMSAvKiB3b3JrYXJvdW5kcyBmb3IgVkdBIGhzeW5jL3ZzeW5jICovCisjZGVmaW5lIEJEQl9TRFZPX0xWRFNfT1BUSU9OUwkgMjIKKyNkZWZpbmUgQkRCX1NEVk9fUEFORUxfRFREUwkgMjMKKyNkZWZpbmUgQkRCX1NEVk9fTFZEU19QTlBfSURTCSAyNAorI2RlZmluZSBCREJfU0RWT19MVkRTX1BPV0VSX1NFUQkgMjUKKyNkZWZpbmUgQkRCX1RWX09QVElPTlMJCSAyNgorI2RlZmluZSBCREJfTFZEU19PUFRJT05TCSA0MAorI2RlZmluZSBCREJfTFZEU19MRlBfREFUQV9QVFJTCSA0MQorI2RlZmluZSBCREJfTFZEU19MRlBfREFUQQkgNDIKKyNkZWZpbmUgQkRCX0xWRFNfQkFDS0xJR0hUCSA0MworI2RlZmluZSBCREJfTFZEU19QT1dFUgkJIDQ0CisjZGVmaW5lIEJEQl9TS0lQCQkyNTQgLyogVkJJT1MgcHJpdmF0ZSBibG9jaywgaWdub3JlICovCisKK3N0cnVjdCBiZGJfZ2VuZXJhbF9mZWF0dXJlcyB7CisgICAgICAgIC8qIGJpdHMgMSAqLworCXU4IHBhbmVsX2ZpdHRpbmc6MjsKKwl1OCBmbGV4YWltOjE7CisJdTggbXNnX2VuYWJsZToxOworCXU4IGNsZWFyX3NjcmVlbjozOworCXU4IGNvbG9yX2ZsaXA6MTsKKworICAgICAgICAvKiBiaXRzIDIgKi8KKwl1OCBkb3dubG9hZF9leHRfdmJ0OjE7CisJdTggZW5hYmxlX3NzYzoxOworCXU4IHNzY19mcmVxOjE7CisJdTggZW5hYmxlX2xmcF9vbl9vdmVycmlkZToxOworCXU4IGRpc2FibGVfc3NjX2RkdDoxOworCXU4IHJzdmQ4OjM7IC8qIGZpbmlzaCBieXRlICovCisKKyAgICAgICAgLyogYml0cyAzICovCisJdTggZGlzYWJsZV9zbW9vdGhfdmlzaW9uOjE7CisJdTggc2luZ2xlX2R2aToxOworCXU4IHJzdmQ5OjY7IC8qIGZpbmlzaCBieXRlICovCisKKyAgICAgICAgLyogYml0cyA0ICovCisJdTggbGVnYWN5X21vbml0b3JfZGV0ZWN0OworCisgICAgICAgIC8qIGJpdHMgNSAqLworCXU4IGludF9jcnRfc3VwcG9ydDoxOworCXU4IGludF90dl9zdXBwb3J0OjE7CisJdTggcnN2ZDExOjY7IC8qIGZpbmlzaCBieXRlICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgeworCS8qIEREQyBHUElPICovCisJdTggY3J0X2RkY19nbWJ1c19waW47CisKKwkvKiBEUE1TIGJpdHMgKi8KKwl1OCBkcG1zX2FjcGk6MTsKKwl1OCBza2lwX2Jvb3RfY3J0X2RldGVjdDoxOworCXU4IGRwbXNfYWltOjE7CisJdTggcnN2ZDE6NTsgLyogZmluaXNoIGJ5dGUgKi8KKworCS8qIGJvb3QgZGV2aWNlIGJpdHMgKi8KKwl1OCBib290X2Rpc3BsYXlbMl07CisJdTggY2hpbGRfZGV2X3NpemU7CisKKwkvKiBkZXZpY2UgaW5mbyAqLworCXU4IHR2X29yX2x2ZHNfaW5mb1szM107CisJdTggZGV2MVszM107CisJdTggZGV2MlszM107CisJdTggZGV2M1szM107CisJdTggZGV2NFszM107CisJLyogbWF5IGJlIGFub3RoZXIgZGV2aWNlIGJsb2NrIGhlcmUgb24gc29tZSBwbGF0Zm9ybXMgKi8KK307CisKK3N0cnVjdCBiZGJfbHZkc19vcHRpb25zIHsKKwl1OCBwYW5lbF90eXBlOworCXU4IHJzdmQxOworCS8qIExWRFMgY2FwYWJpbGl0aWVzLCBzdG9yZWQgaW4gYSBkd29yZCAqLworCXU4IHJzdmQyOjE7CisJdTggbHZkc19lZGlkOjE7CisJdTggcGl4ZWxfZGl0aGVyOjE7CisJdTggcGZpdF9yYXRpb19hdXRvOjE7CisJdTggcGZpdF9nZnhfbW9kZV9lbmhhbmNlZDoxOworCXU4IHBmaXRfdGV4dF9tb2RlX2VuaGFuY2VkOjE7CisJdTggcGZpdF9tb2RlOjI7CisJdTggcnN2ZDQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBMRlAgcG9pbnRlciB0YWJsZSBjb250YWlucyBlbnRyaWVzIHRvIHRoZSBzdHJ1Y3QgYmVsb3cgKi8KK3N0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9wdHIgeworCXUxNiBmcF90aW1pbmdfb2Zmc2V0OyAvKiBvZmZzZXRzIGFyZSBmcm9tIHN0YXJ0IG9mIGJkYiAqLworCXU4IGZwX3RhYmxlX3NpemU7CisJdTE2IGR2b190aW1pbmdfb2Zmc2V0OworCXU4IGR2b190YWJsZV9zaXplOworCXUxNiBwYW5lbF9wbnBfaWRfb2Zmc2V0OworCXU4IHBucF90YWJsZV9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0cnMgeworCXU4IGx2ZHNfZW50cmllczsgLyogZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbHZkc19kYXRhX3B0ciBzdHJ1Y3RzICovCisJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX3B0ciBwdHJbMTZdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogTEZQIGRhdGEgaGFzIDMgYmxvY2tzIHBlciBlbnRyeSAqLworc3RydWN0IGx2ZHNfZnBfdGltaW5nIHsKKwl1MTYgeF9yZXM7CisJdTE2IHlfcmVzOworCXUzMiBsdmRzX3JlZzsKKwl1MzIgbHZkc19yZWdfdmFsOworCXUzMiBwcF9vbl9yZWc7CisJdTMyIHBwX29uX3JlZ192YWw7CisJdTMyIHBwX29mZl9yZWc7CisJdTMyIHBwX29mZl9yZWdfdmFsOworCXUzMiBwcF9jeWNsZV9yZWc7CisJdTMyIHBwX2N5Y2xlX3JlZ192YWw7CisJdTMyIHBmaXRfcmVnOworCXUzMiBwZml0X3JlZ192YWw7CisJdTE2IHRlcm1pbmF0b3I7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbHZkc19kdm9fdGltaW5nIHsKKwl1MTYgY2xvY2s7CQkvKio8IEluIDEwa2h6ICovCisJdTggaGFjdGl2ZV9sbzsKKwl1OCBoYmxhbmtfbG87CisJdTggaGJsYW5rX2hpOjQ7CisJdTggaGFjdGl2ZV9oaTo0OworCXU4IHZhY3RpdmVfbG87CisJdTggdmJsYW5rX2xvOworCXU4IHZibGFua19oaTo0OworCXU4IHZhY3RpdmVfaGk6NDsKKwl1OCBoc3luY19vZmZfbG87CisJdTggaHN5bmNfcHVsc2Vfd2lkdGg7CisJdTggdnN5bmNfcHVsc2Vfd2lkdGg6NDsKKwl1OCB2c3luY19vZmY6NDsKKwl1OCByc3ZkMDo2OworCXU4IGhzeW5jX29mZl9oaToyOworCXU4IGhfaW1hZ2U7CisJdTggdl9pbWFnZTsKKwl1OCBtYXhfaHY7CisJdTggaF9ib3JkZXI7CisJdTggdl9ib3JkZXI7CisJdTggcnN2ZDE6MzsKKwl1OCBkaWdpdGFsOjI7CisJdTggdnN5bmNfcG9zaXRpdmU6MTsKKwl1OCBoc3luY19wb3NpdGl2ZToxOworCXU4IHJzdmQyOjE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbHZkc19wbnBfaWQgeworCXUxNiBtZmdfbmFtZTsKKwl1MTYgcHJvZHVjdF9jb2RlOworCXUzMiBzZXJpYWw7CisJdTggbWZnX3dlZWs7CisJdTggbWZnX3llYXI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgeworCXN0cnVjdCBsdmRzX2ZwX3RpbWluZyBmcF90aW1pbmc7CisJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyBkdm9fdGltaW5nOworCXN0cnVjdCBsdmRzX3BucF9pZCBwbnBfaWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGEgeworCXN0cnVjdCBiZGJfbHZkc19sZnBfZGF0YV9lbnRyeSBkYXRhWzE2XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBhaW1kYl9oZWFkZXIgeworCWNoYXIgc2lnbmF0dXJlWzE2XTsKKwljaGFyIG9lbV9kZXZpY2VbMjBdOworCXUxNiBhaW1kYl92ZXJzaW9uOworCXUxNiBhaW1kYl9oZWFkZXJfc2l6ZTsKKwl1MTYgYWltZGJfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBhaW1kYl9ibG9jayB7CisJdTggYWltZGJfaWQ7CisJdTE2IGFpbWRiX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdmNoX3BhbmVsX2RhdGEgeworCXUxNiBmcF90aW1pbmdfb2Zmc2V0OworCXU4IGZwX3RpbWluZ19zaXplOworCXUxNiBkdm9fdGltaW5nX29mZnNldDsKKwl1OCBkdm9fdGltaW5nX3NpemU7CisJdTE2IHRleHRfZml0dGluZ19vZmZzZXQ7CisJdTggdGV4dF9maXR0aW5nX3NpemU7CisJdTE2IGdyYXBoaWNzX2ZpdHRpbmdfb2Zmc2V0OworCXU4IGdyYXBoaWNzX2ZpdHRpbmdfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB2Y2hfYmRiXzIyIHsKKwlzdHJ1Y3QgYWltZGJfYmxvY2sgYWltZGJfYmxvY2s7CisJc3RydWN0IHZjaF9wYW5lbF9kYXRhIHBhbmVsc1sxNl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitib29sIGludGVsX2luaXRfYmlvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworLyoKKyAqIERyaXZlcjwtPlZCSU9TIGludGVyYWN0aW9uIG9jY3VycyB0aHJvdWdoIHNjcmF0Y2ggYml0cyBpbgorICogR1IxOCAmIFNXRiouCisgKi8KKworLyogR1IxOCBiaXRzIGFyZSBzZXQgb24gZGlzcGxheSBzd2l0Y2ggYW5kIGhvdGtleSBldmVudHMgKi8KKyNkZWZpbmUgR1IxOF9EUklWRVJfU1dJVENIX0VOCSgxPDw3KSAvKiAwOiBWQklPUyBjb250cm9sLCAxOiBkcml2ZXIgY29udHJvbCAqLworI2RlZmluZSBHUjE4X0hPVEtFWV9NQVNLCTB4NzggLyogU2VlIGFsc28gU1dGNCAxNTowICovCisjZGVmaW5lICAgR1IxOF9IS19OT05FCQkoMHgwPDwzKQorI2RlZmluZSAgIEdSMThfSEtfTEZQX1NUUkVUQ0gJKDB4MTw8MykKKyNkZWZpbmUgICBHUjE4X0hLX1RPR0dMRV9ESVNQCSgweDI8PDMpCisjZGVmaW5lICAgR1IxOF9IS19ESVNQX1NXSVRDSAkoMHg0PDwzKSAvKiBzZWUgU1dGMTQgMTU6MCBmb3Igd2hhdCB0byBlbmFibGUgKi8KKyNkZWZpbmUgICBHUjE4X0hLX1BPUFVQX0RJU0FCTEVEICgweDY8PDMpCisjZGVmaW5lICAgR1IxOF9IS19QT1BVUF9FTkFCTEVECSgweDc8PDMpCisjZGVmaW5lICAgR1IxOF9IS19QRklUCQkoMHg4PDwzKQorI2RlZmluZSAgIEdSMThfSEtfQVBNX0NIQU5HRQkoMHhhPDwzKQorI2RlZmluZSAgIEdSMThfSEtfTVVMVElQTEUJKDB4Yzw8MykKKyNkZWZpbmUgR1IxOF9VU0VSX0lOVF9FTgkoMTw8MikKKyNkZWZpbmUgR1IxOF9BMDAwMF9GTFVTSF9FTgkoMTw8MSkKKyNkZWZpbmUgR1IxOF9TTU1fRU4JCSgxPDwwKQorCisvKiBTZXQgYnkgZHJpdmVyLCBjbGVhcmVkIGJ5IFZCSU9TICovCisjZGVmaW5lIFNXRjAwX1lSRVNfU0hJRlQJMTYKKyNkZWZpbmUgU1dGMDBfWFJFU19TSElGVAkwCisjZGVmaW5lIFNXRjAwX1JFU19NQVNLCQkweGZmZmYKKworLyogU2V0IGJ5IFZCSU9TIGF0IGJvb3QgdGltZSBhbmQgZHJpdmVyIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgU1dGMDFfVFYyX0ZPUk1BVF9TSElGVAk4CisjZGVmaW5lIFNXRjAxX1RWMV9GT1JNQVRfU0hJRlQJMAorI2RlZmluZSBTV0YwMV9UVl9GT1JNQVRfTUFTSwkweGZmZmYKKworI2RlZmluZSBTV0YxMF9WQklPU19CTENfSTJDX0VOCSgxPDwyOSkKKyNkZWZpbmUgU1dGMTBfR1RUX09WRVJSSURFX0VOCSgxPDwyOCkKKyNkZWZpbmUgU1dGMTBfTEZQX0RQTVNfT1ZSCSgxPDwyNykgLyogb3ZlcnJpZGUgRFBNUyBvbiBkaXNwbGF5IHN3aXRjaCAqLworI2RlZmluZSBTV0YxMF9BQ1RJVkVfVE9HR0xFX0xJU1RfTUFTSyAoNzw8MjQpCisjZGVmaW5lICAgU1dGMTBfT0xEX1RPR0dMRQkweDAKKyNkZWZpbmUgICBTV0YxMF9UT0dHTEVfTElTVF8xCTB4MQorI2RlZmluZSAgIFNXRjEwX1RPR0dMRV9MSVNUXzIJMHgyCisjZGVmaW5lICAgU1dGMTBfVE9HR0xFX0xJU1RfMwkweDMKKyNkZWZpbmUgICBTV0YxMF9UT0dHTEVfTElTVF80CTB4NAorI2RlZmluZSBTV0YxMF9QQU5OSU5HX0VOCSgxPDwyMykKKyNkZWZpbmUgU1dGMTBfRFJJVkVSX0xPQURFRAkoMTw8MjIpCisjZGVmaW5lIFNXRjEwX0VYVEVOREVEX0RFU0tUT1AJKDE8PDIxKQorI2RlZmluZSBTV0YxMF9FWENMVVNJVkVfTU9ERQkoMTw8MjApCisjZGVmaW5lIFNXRjEwX09WRVJMQVlfRU4JKDE8PDE5KQorI2RlZmluZSBTV0YxMF9QTEFORUJfSE9MRE9GRgkoMTw8MTgpCisjZGVmaW5lIFNXRjEwX1BMQU5FQV9IT0xET0ZGCSgxPDwxNykKKyNkZWZpbmUgU1dGMTBfVkdBX0hPTERPRkYJKDE8PDE2KQorI2RlZmluZSBTV0YxMF9BQ1RJVkVfRElTUF9NQVNLCTB4ZmZmZgorI2RlZmluZSAgIFNXRjEwX1BJUEVCX0xGUDIJKDE8PDE1KQorI2RlZmluZSAgIFNXRjEwX1BJUEVCX0VGUDIJKDE8PDE0KQorI2RlZmluZSAgIFNXRjEwX1BJUEVCX1RWMgkoMTw8MTMpCisjZGVmaW5lICAgU1dGMTBfUElQRUJfQ1JUMgkoMTw8MTIpCisjZGVmaW5lICAgU1dGMTBfUElQRUJfTEZQCSgxPDwxMSkKKyNkZWZpbmUgICBTV0YxMF9QSVBFQl9FRlAJKDE8PDEwKQorI2RlZmluZSAgIFNXRjEwX1BJUEVCX1RWCSgxPDw5KQorI2RlZmluZSAgIFNXRjEwX1BJUEVCX0NSVAkoMTw8OCkKKyNkZWZpbmUgICBTV0YxMF9QSVBFQV9MRlAyCSgxPDw3KQorI2RlZmluZSAgIFNXRjEwX1BJUEVBX0VGUDIJKDE8PDYpCisjZGVmaW5lICAgU1dGMTBfUElQRUFfVFYyCSgxPDw1KQorI2RlZmluZSAgIFNXRjEwX1BJUEVBX0NSVDIJKDE8PDQpCisjZGVmaW5lICAgU1dGMTBfUElQRUFfTEZQCSgxPDwzKQorI2RlZmluZSAgIFNXRjEwX1BJUEVBX0VGUAkoMTw8MikKKyNkZWZpbmUgICBTV0YxMF9QSVBFQV9UVgkoMTw8MSkKKyNkZWZpbmUgICBTV0YxMF9QSVBFQV9DUlQJKDE8PDApCisKKyNkZWZpbmUgU1dGMTFfTUVNT1JZX1NJWkVfU0hJRlQJMTYKKyNkZWZpbmUgU1dGMTFfU1ZfVEVTVF9FTgkoMTw8MTUpCisjZGVmaW5lIFNXRjExX0lTX0FHUAkJKDE8PDE0KQorI2RlZmluZSBTV0YxMV9ESVNQTEFZX0hPTERPRkYJKDE8PDEzKQorI2RlZmluZSBTV0YxMV9EUE1TX1JFRFVDRUQJKDE8PDEyKQorI2RlZmluZSBTV0YxMV9JU19WQkVfTU9ERQkoMTw8MTEpCisjZGVmaW5lIFNXRjExX1BJUEVCX0FDQ0VTUwkoMTw8MTApIC8qIDAgaGVyZSBtZWFucyBwaXBlIGEgKi8KKyNkZWZpbmUgU1dGMTFfRFBNU19NQVNLCQkweDA3CisjZGVmaW5lICAgU1dGMTFfRFBNU19PRkYJKDE8PDIpCisjZGVmaW5lICAgU1dGMTFfRFBNU19TVVNQRU5ECSgxPDwxKQorI2RlZmluZSAgIFNXRjExX0RQTVNfU1RBTkRCWQkoMTw8MCkKKyNkZWZpbmUgICBTV0YxMV9EUE1TX09OCQkwCisKKyNkZWZpbmUgU1dGMTRfR0ZYX1BGSVRfRU4JKDE8PDMxKQorI2RlZmluZSBTV0YxNF9URVhUX1BGSVRfRU4JKDE8PDMwKQorI2RlZmluZSBTV0YxNF9MSURfU1RBVFVTX0NMT1NFRAkoMTw8MjkpIC8qIDAgaGVyZSBtZWFucyBvcGVuICovCisjZGVmaW5lIFNXRjE0X1BPUFVQX0VOCQkoMTw8MjgpCisjZGVmaW5lIFNXRjE0X0RJU1BMQVlfSE9MRE9GRgkoMTw8MjcpCisjZGVmaW5lIFNXRjE0X0RJU1BfREVURUNUX0VOCSgxPDwyNikKKyNkZWZpbmUgU1dGMTRfRE9DS0lOR19TVEFUVVNfRE9DS0VEICgxPDwyNSkgLyogMCBoZXJlIG1lYW5zIHVuZG9ja2VkICovCisjZGVmaW5lIFNXRjE0X0RSSVZFUl9TVEFUVVMJKDE8PDI0KQorI2RlZmluZSBTV0YxNF9PU19UWVBFX1dJTjlYCSgxPDwyMykKKyNkZWZpbmUgU1dGMTRfT1NfVFlQRV9XSU5OVAkoMTw8MjIpCisvKiAyMToxOSByc3ZkICovCisjZGVmaW5lIFNXRjE0X1BNX1RZUEVfTUFTSwkweDAwMDcwMDAwCisjZGVmaW5lICAgU1dGMTRfUE1fQUNQSV9WSURFTwkoMHg0IDw8IDE2KQorI2RlZmluZSAgIFNXRjE0X1BNX0FDUEkJCSgweDMgPDwgMTYpCisjZGVmaW5lICAgU1dGMTRfUE1fQVBNXzEyCSgweDIgPDwgMTYpCisjZGVmaW5lICAgU1dGMTRfUE1fQVBNXzExCSgweDEgPDwgMTYpCisjZGVmaW5lIFNXRjE0X0hLX1JFUVVFU1RfTUFTSwkweDAwMDBmZmZmIC8qIHNlZSBHUjE4IDY6MyBmb3IgZXZlbnQgdHlwZSAqLworICAgICAgICAgIC8qIGlmIEdSMTggaW5kaWNhdGVzIGEgZGlzcGxheSBzd2l0Y2ggKi8KKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9MRlAyX0VOICgxPDwxNSkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9FRlAyX0VOICgxPDwxNCkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9UVjJfRU4gICgxPDwxMykKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9DUlQyX0VOICgxPDwxMikKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9MRlBfRU4gICgxPDwxMSkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9FRlBfRU4gICgxPDwxMCkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQl9UVl9FTiAgICgxPDw5KQorI2RlZmluZSAgIFNXRjE0X0RTX1BJUEVCX0NSVF9FTiAgKDE8PDgpCisjZGVmaW5lICAgU1dGMTRfRFNfUElQRUFfTEZQMl9FTiAoMTw8NykKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQV9FRlAyX0VOICgxPDw2KQorI2RlZmluZSAgIFNXRjE0X0RTX1BJUEVBX1RWMl9FTiAgKDE8PDUpCisjZGVmaW5lICAgU1dGMTRfRFNfUElQRUFfQ1JUMl9FTiAoMTw8NCkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQV9MRlBfRU4gICgxPDwzKQorI2RlZmluZSAgIFNXRjE0X0RTX1BJUEVBX0VGUF9FTiAgKDE8PDIpCisjZGVmaW5lICAgU1dGMTRfRFNfUElQRUFfVFZfRU4gICAoMTw8MSkKKyNkZWZpbmUgICBTV0YxNF9EU19QSVBFQV9DUlRfRU4gICgxPDwwKQorICAgICAgICAgIC8qIGlmIEdSMTggaW5kaWNhdGVzIGEgcGFuZWwgZml0dGluZyByZXF1ZXN0ICovCisjZGVmaW5lICAgU1dGMTRfUEZJVF9FTgkJKDE8PDApIC8qIDAgbWVhbnMgZGlzYWJsZSAqLworICAgICAgICAgIC8qIGlmIEdSMTggaW5kaWNhdGVzIGFuIEFQTSBjaGFuZ2UgcmVxdWVzdCAqLworI2RlZmluZSAgIFNXRjE0X0FQTV9ISUJFUk5BVEUJMHg0CisjZGVmaW5lICAgU1dGMTRfQVBNX1NVU1BFTkQJMHgzCisjZGVmaW5lICAgU1dGMTRfQVBNX1NUQU5EQlkJMHgxCisjZGVmaW5lICAgU1dGMTRfQVBNX1JFU1RPUkUJMHgwCisKKyNlbmRpZiAvKiBfSTgzMF9CSU9TX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWVkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgImludGVsX2Rydi5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworc3RhdGljIHZvaWQgaW50ZWxfY3J0X2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHRlbXA7CisKKwl0ZW1wID0gSTkxNV9SRUFEKEFEUEEpOworCXRlbXAgJj0gfihBRFBBX0hTWU5DX0NOVExfRElTQUJMRSB8IEFEUEFfVlNZTkNfQ05UTF9ESVNBQkxFKTsKKwl0ZW1wICY9IH5BRFBBX0RBQ19FTkFCTEU7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJdGVtcCB8PSBBRFBBX0RBQ19FTkFCTEU7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCQl0ZW1wIHw9IEFEUEFfREFDX0VOQUJMRSB8IEFEUEFfSFNZTkNfQ05UTF9ESVNBQkxFOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJdGVtcCB8PSBBRFBBX0RBQ19FTkFCTEUgfCBBRFBBX1ZTWU5DX0NOVExfRElTQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJdGVtcCB8PSBBRFBBX0hTWU5DX0NOVExfRElTQUJMRSB8IEFEUEFfVlNZTkNfQ05UTF9ESVNBQkxFOworCQlicmVhazsKKwl9CisKKwlJOTE1X1dSSVRFKEFEUEEsIHRlbXApOworfQorCitzdGF0aWMgaW50IGludGVsX2NydF9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZXR1cm4gTU9ERV9OT19EQkxFU0NBTjsKKworCWlmIChtb2RlLT5jbG9jayA+IDQwMDAwMCB8fCBtb2RlLT5jbG9jayA8IDI1MDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19SQU5HRTsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9jcnRfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfY3J0X21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZW5jb2Rlci0+Y3J0YzsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgZHBsbF9tZF9yZWc7CisJdTMyIGFkcGEsIGRwbGxfbWQ7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKQorCQlkcGxsX21kX3JlZyA9IERQTExfQV9NRDsKKwllbHNlCisJCWRwbGxfbWRfcmVnID0gRFBMTF9CX01EOworCisJLyoKKwkgKiBEaXNhYmxlIHNlcGFyYXRlIG1vZGUgbXVsdGlwbGllciB1c2VkIHdoZW4gY2xvbmluZyBTRFZPIHRvIENSVAorCSAqIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGFkanVzdGVkIHdoZW4gd2UgcmVhbGx5IGFyZSBjbG9uaW5nCisJICovCisJaWYgKElTX0k5NjVHKGRldikpIHsKKwkJZHBsbF9tZCA9IEk5MTVfUkVBRChkcGxsX21kX3JlZyk7CisJCUk5MTVfV1JJVEUoZHBsbF9tZF9yZWcsCisJCQkgICBkcGxsX21kICYgfkRQTExfTURfVURJX01VTFRJUExJRVJfTUFTSyk7CisJfQorCisJYWRwYSA9IDA7CisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCWFkcGEgfD0gQURQQV9IU1lOQ19BQ1RJVkVfSElHSDsKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJYWRwYSB8PSBBRFBBX1ZTWU5DX0FDVElWRV9ISUdIOworCisJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMCkKKwkJYWRwYSB8PSBBRFBBX1BJUEVfQV9TRUxFQ1Q7CisJZWxzZQorCQlhZHBhIHw9IEFEUEFfUElQRV9CX1NFTEVDVDsKKworCUk5MTVfV1JJVEUoQURQQSwgYWRwYSk7Cit9CisKKy8qKgorICogVXNlcyBDUlRfSE9UUExVR19FTiBhbmQgQ1JUX0hPVFBMVUdfU1RBVCB0byBkZXRlY3QgQ1JUIHByZXNlbmNlLgorICoKKyAqIE5vdCBmb3IgaTkxNUcvaTkxNUdNCisgKgorICogXHJldHVybiB0cnVlIGlmIENSVCBpcyBjb25uZWN0ZWQuCisgKiBccmV0dXJuIGZhbHNlIGlmIENSVCBpcyBkaXNjb25uZWN0ZWQuCisgKi8KK3N0YXRpYyBib29sIGludGVsX2NydF9kZXRlY3RfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiB0ZW1wOworCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisKKwl0ZW1wID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19FTik7CisKKwlJOTE1X1dSSVRFKFBPUlRfSE9UUExVR19FTiwKKwkJICAgdGVtcCB8IENSVF9IT1RQTFVHX0ZPUkNFX0RFVEVDVCB8ICgxIDw8IDUpKTsKKworCWRvIHsKKwkJaWYgKCEoSTkxNV9SRUFEKFBPUlRfSE9UUExVR19FTikgJiBDUlRfSE9UUExVR19GT1JDRV9ERVRFQ1QpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCWlmICgoSTkxNV9SRUFEKFBPUlRfSE9UUExVR19TVEFUKSAmIENSVF9IT1RQTFVHX01PTklUT1JfTUFTSykgPT0KKwkgICAgQ1JUX0hPVFBMVUdfTU9OSVRPUl9DT0xPUikKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGludGVsX2NydF9kZXRlY3RfZGRjKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwkvKiBDUlQgc2hvdWxkIGFsd2F5cyBiZSBhdCAwLCBidXQgY2hlY2sgYW55d2F5ICovCisJaWYgKGludGVsX291dHB1dC0+dHlwZSAhPSBJTlRFTF9PVVRQVVRfQU5BTE9HKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gaW50ZWxfZGRjX3Byb2JlKGludGVsX291dHB1dCk7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGludGVsX2NydF9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlpZiAoSVNfSTlYWChkZXYpICYmICFJU19JOTE1RyhkZXYpICYmICFJU19JOTE1R00oZGV2KSkgeworCQlpZiAoaW50ZWxfY3J0X2RldGVjdF9ob3RwbHVnKGNvbm5lY3RvcikpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWVsc2UKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwl9CisKKwlpZiAoaW50ZWxfY3J0X2RldGVjdF9kZGMoY29ubmVjdG9yKSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCisJLyogVE9ETyB1c2UgbG9hZCBkZXRlY3QgKi8KKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJaW50ZWxfaTJjX2Rlc3Ryb3koaW50ZWxfb3V0cHV0LT5kZGNfYnVzKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworCWtmcmVlKGNvbm5lY3Rvcik7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfY3J0X2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXJldHVybiBpbnRlbF9kZGNfZ2V0X21vZGVzKGludGVsX291dHB1dCk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfY3J0X3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkJICB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlpZiAocHJvcGVydHkgPT0gZGV2LT5tb2RlX2NvbmZpZy5kcG1zX3Byb3BlcnR5ICYmIGNvbm5lY3Rvci0+ZW5jb2RlcikKKwkJaW50ZWxfY3J0X2RwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCAodWludDMyX3QpKHZhbHVlICYgMHhmKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJvdXRpbmVzIGZvciBjb250cm9sbGluZyBzdHVmZiBvbiB0aGUgYW5hbG9nIHBvcnQKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbnRlbF9jcnRfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gaW50ZWxfY3J0X2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9jcnRfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IGludGVsX2VuY29kZXJfcHJlcGFyZSwKKwkuY29tbWl0ID0gaW50ZWxfZW5jb2Rlcl9jb21taXQsCisJLm1vZGVfc2V0ID0gaW50ZWxfY3J0X21vZGVfc2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGludGVsX2NydF9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRldGVjdCA9IGludGVsX2NydF9kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLmRlc3Ryb3kgPSBpbnRlbF9jcnRfZGVzdHJveSwKKwkuc2V0X3Byb3BlcnR5ID0gaW50ZWxfY3J0X3NldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgaW50ZWxfY3J0X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLm1vZGVfdmFsaWQgPSBpbnRlbF9jcnRfbW9kZV92YWxpZCwKKwkuZ2V0X21vZGVzID0gaW50ZWxfY3J0X2dldF9tb2RlcywKKwkuYmVzdF9lbmNvZGVyID0gaW50ZWxfYmVzdF9lbmNvZGVyLAorfTsKKworc3RhdGljIHZvaWQgaW50ZWxfY3J0X2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGludGVsX2NydF9lbmNfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBpbnRlbF9jcnRfZW5jX2Rlc3Ryb3ksCit9OworCit2b2lkIGludGVsX2NydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQ7CisKKwlpbnRlbF9vdXRwdXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnRlbF9vdXRwdXQpCisJCXJldHVybjsKKworCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgJmludGVsX291dHB1dC0+YmFzZSwKKwkJCSAgICZpbnRlbF9jcnRfY29ubmVjdG9yX2Z1bmNzLCBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF9jcnRfZW5jX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW50ZWxfb3V0cHV0LT5iYXNlLAorCQkJCQkgICZpbnRlbF9vdXRwdXQtPmVuYyk7CisKKwkvKiBTZXQgdXAgdGhlIEREQyBidXMuICovCisJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIEdQSU9BLCAiQ1JURERDX0EiKTsKKwlpZiAoIWludGVsX291dHB1dC0+ZGRjX2J1cykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5wZGV2LT5kZXYsICJEREMgYnVzIHJlZ2lzdHJhdGlvbiAiCisJCQkgICAiZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbnRlbF9vdXRwdXQtPnR5cGUgPSBJTlRFTF9PVVRQVVRfQU5BTE9HOworCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSAwOworCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gMDsKKworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmludGVsX291dHB1dC0+ZW5jLCAmaW50ZWxfY3J0X2hlbHBlcl9mdW5jcyk7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmludGVsX2NydF9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKworCWRybV9zeXNmc19jb25uZWN0b3JfYWRkKGNvbm5lY3Rvcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMWM4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMCwwICsxLDE2MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKglFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKK2Jvb2wgaW50ZWxfcGlwZV9oYXNfdHlwZSAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgdHlwZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBnaXZlbiB2YWx1ZXMgKi8KKyAgICBpbnQgbjsKKyAgICBpbnQgbTEsIG0yOworICAgIGludCBwMSwgcDI7CisgICAgLyogZGVyaXZlZCB2YWx1ZXMgKi8KKyAgICBpbnQJZG90OworICAgIGludAl2Y287CisgICAgaW50CW07CisgICAgaW50CXA7Cit9IGludGVsX2Nsb2NrX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJbWluLCBtYXg7Cit9IGludGVsX3JhbmdlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJZG90X2xpbWl0OworICAgIGludAlwMl9zbG93LCBwMl9mYXN0OworfSBpbnRlbF9wMl90OworCisjZGVmaW5lIElOVEVMX1AyX05VTQkJICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ZWxfcmFuZ2VfdCAgIGRvdCwgdmNvLCBuLCBtLCBtMSwgbTIsIHAsIHAxOworICAgIGludGVsX3AyX3QJICAgIHAyOworfSBpbnRlbF9saW1pdF90OworCisjZGVmaW5lIEk4WFhfRE9UX01JTgkJICAyNTAwMAorI2RlZmluZSBJOFhYX0RPVF9NQVgJCSAzNTAwMDAKKyNkZWZpbmUgSThYWF9WQ09fTUlOCQkgOTMwMDAwCisjZGVmaW5lIEk4WFhfVkNPX01BWAkJMTQwMDAwMAorI2RlZmluZSBJOFhYX05fTUlOCQkgICAgICAzCisjZGVmaW5lIEk4WFhfTl9NQVgJCSAgICAgMTYKKyNkZWZpbmUgSThYWF9NX01JTgkJICAgICA5NgorI2RlZmluZSBJOFhYX01fTUFYCQkgICAgMTQwCisjZGVmaW5lIEk4WFhfTTFfTUlOCQkgICAgIDE4CisjZGVmaW5lIEk4WFhfTTFfTUFYCQkgICAgIDI2CisjZGVmaW5lIEk4WFhfTTJfTUlOCQkgICAgICA2CisjZGVmaW5lIEk4WFhfTTJfTUFYCQkgICAgIDE2CisjZGVmaW5lIEk4WFhfUF9NSU4JCSAgICAgIDQKKyNkZWZpbmUgSThYWF9QX01BWAkJICAgIDEyOAorI2RlZmluZSBJOFhYX1AxX01JTgkJICAgICAgMgorI2RlZmluZSBJOFhYX1AxX01BWAkJICAgICAzMworI2RlZmluZSBJOFhYX1AxX0xWRFNfTUlOCSAgICAgIDEKKyNkZWZpbmUgSThYWF9QMV9MVkRTX01BWAkgICAgICA2CisjZGVmaW5lIEk4WFhfUDJfU0xPVwkJICAgICAgNAorI2RlZmluZSBJOFhYX1AyX0ZBU1QJCSAgICAgIDIKKyNkZWZpbmUgSThYWF9QMl9MVkRTX1NMT1cJICAgICAgMTQKKyNkZWZpbmUgSThYWF9QMl9MVkRTX0ZBU1QJICAgICAgMTQgLyogTm8gZmFzdCBvcHRpb24gKi8KKyNkZWZpbmUgSThYWF9QMl9TTE9XX0xJTUlUCSAxNjUwMDAKKworI2RlZmluZSBJOVhYX0RPVF9NSU4JCSAgMjAwMDAKKyNkZWZpbmUgSTlYWF9ET1RfTUFYCQkgNDAwMDAwCisjZGVmaW5lIEk5WFhfVkNPX01JTgkJMTQwMDAwMAorI2RlZmluZSBJOVhYX1ZDT19NQVgJCTI4MDAwMDAKKyNkZWZpbmUgSTlYWF9OX01JTgkJICAgICAgMworI2RlZmluZSBJOVhYX05fTUFYCQkgICAgICA4CisjZGVmaW5lIEk5WFhfTV9NSU4JCSAgICAgNzAKKyNkZWZpbmUgSTlYWF9NX01BWAkJICAgIDEyMAorI2RlZmluZSBJOVhYX00xX01JTgkJICAgICAxMAorI2RlZmluZSBJOVhYX00xX01BWAkJICAgICAyMAorI2RlZmluZSBJOVhYX00yX01JTgkJICAgICAgNQorI2RlZmluZSBJOVhYX00yX01BWAkJICAgICAgOQorI2RlZmluZSBJOVhYX1BfU0RWT19EQUNfTUlOCSAgICAgIDUKKyNkZWZpbmUgSTlYWF9QX1NEVk9fREFDX01BWAkgICAgIDgwCisjZGVmaW5lIEk5WFhfUF9MVkRTX01JTgkJICAgICAgNworI2RlZmluZSBJOVhYX1BfTFZEU19NQVgJCSAgICAgOTgKKyNkZWZpbmUgSTlYWF9QMV9NSU4JCSAgICAgIDEKKyNkZWZpbmUgSTlYWF9QMV9NQVgJCSAgICAgIDgKKyNkZWZpbmUgSTlYWF9QMl9TRFZPX0RBQ19TTE9XCQkgICAgIDEwCisjZGVmaW5lIEk5WFhfUDJfU0RWT19EQUNfRkFTVAkJICAgICAgNQorI2RlZmluZSBJOVhYX1AyX1NEVk9fREFDX1NMT1dfTElNSVQJIDIwMDAwMAorI2RlZmluZSBJOVhYX1AyX0xWRFNfU0xPVwkJICAgICAxNAorI2RlZmluZSBJOVhYX1AyX0xWRFNfRkFTVAkJICAgICAgNworI2RlZmluZSBJOVhYX1AyX0xWRFNfU0xPV19MSU1JVAkJIDExMjAwMAorCisjZGVmaW5lIElOVEVMX0xJTUlUX0k4WFhfRFZPX0RBQyAgICAwCisjZGVmaW5lIElOVEVMX0xJTUlUX0k4WFhfTFZEUwkgICAgMQorI2RlZmluZSBJTlRFTF9MSU1JVF9JOVhYX1NEVk9fREFDICAgMgorI2RlZmluZSBJTlRFTF9MSU1JVF9JOVhYX0xWRFMJICAgIDMKKworc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzW10gPSB7CisgICAgeyAvKiBJTlRFTF9MSU1JVF9JOFhYX0RWT19EQUMgKi8KKyAgICAgICAgLmRvdCA9IHsgLm1pbiA9IEk4WFhfRE9UX01JTiwJCS5tYXggPSBJOFhYX0RPVF9NQVggfSwKKyAgICAgICAgLnZjbyA9IHsgLm1pbiA9IEk4WFhfVkNPX01JTiwJCS5tYXggPSBJOFhYX1ZDT19NQVggfSwKKyAgICAgICAgLm4gICA9IHsgLm1pbiA9IEk4WFhfTl9NSU4sCQkubWF4ID0gSThYWF9OX01BWCB9LAorICAgICAgICAubSAgID0geyAubWluID0gSThYWF9NX01JTiwJCS5tYXggPSBJOFhYX01fTUFYIH0sCisgICAgICAgIC5tMSAgPSB7IC5taW4gPSBJOFhYX00xX01JTiwJCS5tYXggPSBJOFhYX00xX01BWCB9LAorICAgICAgICAubTIgID0geyAubWluID0gSThYWF9NMl9NSU4sCQkubWF4ID0gSThYWF9NMl9NQVggfSwKKyAgICAgICAgLnAgICA9IHsgLm1pbiA9IEk4WFhfUF9NSU4sCQkubWF4ID0gSThYWF9QX01BWCB9LAorICAgICAgICAucDEgID0geyAubWluID0gSThYWF9QMV9NSU4sCQkubWF4ID0gSThYWF9QMV9NQVggfSwKKwkucDIgID0geyAuZG90X2xpbWl0ID0gSThYWF9QMl9TTE9XX0xJTUlULAorCQkgLnAyX3Nsb3cgPSBJOFhYX1AyX1NMT1csCS5wMl9mYXN0ID0gSThYWF9QMl9GQVNUIH0sCisgICAgfSwKKyAgICB7IC8qIElOVEVMX0xJTUlUX0k4WFhfTFZEUyAqLworICAgICAgICAuZG90ID0geyAubWluID0gSThYWF9ET1RfTUlOLAkJLm1heCA9IEk4WFhfRE9UX01BWCB9LAorICAgICAgICAudmNvID0geyAubWluID0gSThYWF9WQ09fTUlOLAkJLm1heCA9IEk4WFhfVkNPX01BWCB9LAorICAgICAgICAubiAgID0geyAubWluID0gSThYWF9OX01JTiwJCS5tYXggPSBJOFhYX05fTUFYIH0sCisgICAgICAgIC5tICAgPSB7IC5taW4gPSBJOFhYX01fTUlOLAkJLm1heCA9IEk4WFhfTV9NQVggfSwKKyAgICAgICAgLm0xICA9IHsgLm1pbiA9IEk4WFhfTTFfTUlOLAkJLm1heCA9IEk4WFhfTTFfTUFYIH0sCisgICAgICAgIC5tMiAgPSB7IC5taW4gPSBJOFhYX00yX01JTiwJCS5tYXggPSBJOFhYX00yX01BWCB9LAorICAgICAgICAucCAgID0geyAubWluID0gSThYWF9QX01JTiwJCS5tYXggPSBJOFhYX1BfTUFYIH0sCisgICAgICAgIC5wMSAgPSB7IC5taW4gPSBJOFhYX1AxX0xWRFNfTUlOLAkubWF4ID0gSThYWF9QMV9MVkRTX01BWCB9LAorCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJOFhYX1AyX1NMT1dfTElNSVQsCisJCSAucDJfc2xvdyA9IEk4WFhfUDJfTFZEU19TTE9XLAkucDJfZmFzdCA9IEk4WFhfUDJfTFZEU19GQVNUIH0sCisgICAgfSwKKyAgICB7IC8qIElOVEVMX0xJTUlUX0k5WFhfU0RWT19EQUMgKi8KKyAgICAgICAgLmRvdCA9IHsgLm1pbiA9IEk5WFhfRE9UX01JTiwJCS5tYXggPSBJOVhYX0RPVF9NQVggfSwKKyAgICAgICAgLnZjbyA9IHsgLm1pbiA9IEk5WFhfVkNPX01JTiwJCS5tYXggPSBJOVhYX1ZDT19NQVggfSwKKyAgICAgICAgLm4gICA9IHsgLm1pbiA9IEk5WFhfTl9NSU4sCQkubWF4ID0gSTlYWF9OX01BWCB9LAorICAgICAgICAubSAgID0geyAubWluID0gSTlYWF9NX01JTiwJCS5tYXggPSBJOVhYX01fTUFYIH0sCisgICAgICAgIC5tMSAgPSB7IC5taW4gPSBJOVhYX00xX01JTiwJCS5tYXggPSBJOVhYX00xX01BWCB9LAorICAgICAgICAubTIgID0geyAubWluID0gSTlYWF9NMl9NSU4sCQkubWF4ID0gSTlYWF9NMl9NQVggfSwKKyAgICAgICAgLnAgICA9IHsgLm1pbiA9IEk5WFhfUF9TRFZPX0RBQ19NSU4sCS5tYXggPSBJOVhYX1BfU0RWT19EQUNfTUFYIH0sCisgICAgICAgIC5wMSAgPSB7IC5taW4gPSBJOVhYX1AxX01JTiwJCS5tYXggPSBJOVhYX1AxX01BWCB9LAorCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJOVhYX1AyX1NEVk9fREFDX1NMT1dfTElNSVQsCisJCSAucDJfc2xvdyA9IEk5WFhfUDJfU0RWT19EQUNfU0xPVywJLnAyX2Zhc3QgPSBJOVhYX1AyX1NEVk9fREFDX0ZBU1QgfSwKKyAgICB9LAorICAgIHsgLyogSU5URUxfTElNSVRfSTlYWF9MVkRTICovCisgICAgICAgIC5kb3QgPSB7IC5taW4gPSBJOVhYX0RPVF9NSU4sCQkubWF4ID0gSTlYWF9ET1RfTUFYIH0sCisgICAgICAgIC52Y28gPSB7IC5taW4gPSBJOVhYX1ZDT19NSU4sCQkubWF4ID0gSTlYWF9WQ09fTUFYIH0sCisgICAgICAgIC5uICAgPSB7IC5taW4gPSBJOVhYX05fTUlOLAkJLm1heCA9IEk5WFhfTl9NQVggfSwKKyAgICAgICAgLm0gICA9IHsgLm1pbiA9IEk5WFhfTV9NSU4sCQkubWF4ID0gSTlYWF9NX01BWCB9LAorICAgICAgICAubTEgID0geyAubWluID0gSTlYWF9NMV9NSU4sCQkubWF4ID0gSTlYWF9NMV9NQVggfSwKKyAgICAgICAgLm0yICA9IHsgLm1pbiA9IEk5WFhfTTJfTUlOLAkJLm1heCA9IEk5WFhfTTJfTUFYIH0sCisgICAgICAgIC5wICAgPSB7IC5taW4gPSBJOVhYX1BfTFZEU19NSU4sCS5tYXggPSBJOVhYX1BfTFZEU19NQVggfSwKKyAgICAgICAgLnAxICA9IHsgLm1pbiA9IEk5WFhfUDFfTUlOLAkJLm1heCA9IEk5WFhfUDFfTUFYIH0sCisJLyogVGhlIHNpbmdsZS1jaGFubmVsIHJhbmdlIGlzIDI1LTExMk1oeiwgYW5kIGR1YWwtY2hhbm5lbAorCSAqIGlzIDgwLTIyNE1oei4gIFByZWZlciBzaW5nbGUgY2hhbm5lbCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCSAqLworCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJOVhYX1AyX0xWRFNfU0xPV19MSU1JVCwKKwkJIC5wMl9zbG93ID0gSTlYWF9QMl9MVkRTX1NMT1csCS5wMl9mYXN0ID0gSTlYWF9QMl9MVkRTX0ZBU1QgfSwKKyAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgKmludGVsX2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0OworCisJaWYgKElTX0k5WFgoZGV2KSkgeworCQlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykpCisJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNbSU5URUxfTElNSVRfSTlYWF9MVkRTXTsKKwkJZWxzZQorCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzW0lOVEVMX0xJTUlUX0k5WFhfU0RWT19EQUNdOworCX0gZWxzZSB7CisJCWlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9MVkRTKSkKKwkJCWxpbWl0ID0gJmludGVsX2xpbWl0c1tJTlRFTF9MSU1JVF9JOFhYX0xWRFNdOworCQllbHNlCisJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNbSU5URUxfTElNSVRfSThYWF9EVk9fREFDXTsKKwl9CisJcmV0dXJuIGxpbWl0OworfQorCisvKiogRGVyaXZlIHRoZSBwaXhlbCBjbG9jayBmb3IgdGhlIGdpdmVuIHJlZmNsayBhbmQgZGl2aXNvcnMgZm9yIDh4eCBjaGlwcy4gKi8KKworc3RhdGljIHZvaWQgaTh4eF9jbG9jayhpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpjbG9jaykKK3sKKwljbG9jay0+bSA9IDUgKiAoY2xvY2stPm0xICsgMikgKyAoY2xvY2stPm0yICsgMik7CisJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9jay0+cDI7CisJY2xvY2stPnZjbyA9IHJlZmNsayAqIGNsb2NrLT5tIC8gKGNsb2NrLT5uICsgMik7CisJY2xvY2stPmRvdCA9IGNsb2NrLT52Y28gLyBjbG9jay0+cDsKK30KKworLyoqIERlcml2ZSB0aGUgcGl4ZWwgY2xvY2sgZm9yIHRoZSBnaXZlbiByZWZjbGsgYW5kIGRpdmlzb3JzIGZvciA5eHggY2hpcHMuICovCisKK3N0YXRpYyB2b2lkIGk5eHhfY2xvY2soaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCit7CisJY2xvY2stPm0gPSA1ICogKGNsb2NrLT5tMSArIDIpICsgKGNsb2NrLT5tMiArIDIpOworCWNsb2NrLT5wID0gY2xvY2stPnAxICogY2xvY2stPnAyOworCWNsb2NrLT52Y28gPSByZWZjbGsgKiBjbG9jay0+bSAvIChjbG9jay0+biArIDIpOworCWNsb2NrLT5kb3QgPSBjbG9jay0+dmNvIC8gY2xvY2stPnA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2Nsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZWZjbGssCisJCQlpbnRlbF9jbG9ja190ICpjbG9jaykKK3sKKwlpZiAoSVNfSTlYWChkZXYpKQorCQlpOXh4X2Nsb2NrIChyZWZjbGssIGNsb2NrKTsKKwllbHNlCisJCWk4eHhfY2xvY2sgKHJlZmNsaywgY2xvY2spOworfQorCisvKioKKyAqIFJldHVybnMgd2hldGhlciBhbnkgb3V0cHV0IG9uIHRoZSBzcGVjaWZpZWQgcGlwZSBpcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKKyAqLworYm9vbCBpbnRlbF9waXBlX2hhc190eXBlIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB0eXBlKQoreworICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisgICAgc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqbW9kZV9jb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKKyAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqbF9lbnRyeTsKKworICAgIGxpc3RfZm9yX2VhY2hfZW50cnkobF9lbnRyeSwgJm1vZGVfY29uZmlnLT5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCSAgICBpZiAobF9lbnRyeS0+ZW5jb2RlciAmJgorCSAgICAgICAgbF9lbnRyeS0+ZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKSB7CisJCSAgICBzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQobF9lbnRyeSk7CisJCSAgICBpZiAoaW50ZWxfb3V0cHV0LT50eXBlID09IHR5cGUpCisJCQkgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjZGVmaW5lIElOVEVMUGxsSW52YWxpZChzKSAgIHsgLyogRXJyb3JGIChzKSAqLzsgcmV0dXJuIGZhbHNlOyB9CisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc2V0IG9mIGRpdmlzb3JzIGFyZSB2YWxpZCBmb3IgYSBnaXZlbiByZWZjbGsgd2l0aAorICogdGhlIGdpdmVuIGNvbm5lY3RvcnMuCisgKi8KKworc3RhdGljIGJvb2wgaW50ZWxfUExMX2lzX3ZhbGlkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCit7CisJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQgPSBpbnRlbF9saW1pdCAoY3J0Yyk7CisKKwlpZiAoY2xvY2stPnAxICA8IGxpbWl0LT5wMS5taW4gIHx8IGxpbWl0LT5wMS5tYXggIDwgY2xvY2stPnAxKQorCQlJTlRFTFBsbEludmFsaWQgKCJwMSBvdXQgb2YgcmFuZ2VcbiIpOworCWlmIChjbG9jay0+cCAgIDwgbGltaXQtPnAubWluICAgfHwgbGltaXQtPnAubWF4ICAgPCBjbG9jay0+cCkKKwkJSU5URUxQbGxJbnZhbGlkICgicCBvdXQgb2YgcmFuZ2VcbiIpOworCWlmIChjbG9jay0+bTIgIDwgbGltaXQtPm0yLm1pbiAgfHwgbGltaXQtPm0yLm1heCAgPCBjbG9jay0+bTIpCisJCUlOVEVMUGxsSW52YWxpZCAoIm0yIG91dCBvZiByYW5nZVxuIik7CisJaWYgKGNsb2NrLT5tMSAgPCBsaW1pdC0+bTEubWluICB8fCBsaW1pdC0+bTEubWF4ICA8IGNsb2NrLT5tMSkKKwkJSU5URUxQbGxJbnZhbGlkICgibTEgb3V0IG9mIHJhbmdlXG4iKTsKKwlpZiAoY2xvY2stPm0xIDw9IGNsb2NrLT5tMikKKwkJSU5URUxQbGxJbnZhbGlkICgibTEgPD0gbTJcbiIpOworCWlmIChjbG9jay0+bSAgIDwgbGltaXQtPm0ubWluICAgfHwgbGltaXQtPm0ubWF4ICAgPCBjbG9jay0+bSkKKwkJSU5URUxQbGxJbnZhbGlkICgibSBvdXQgb2YgcmFuZ2VcbiIpOworCWlmIChjbG9jay0+biAgIDwgbGltaXQtPm4ubWluICAgfHwgbGltaXQtPm4ubWF4ICAgPCBjbG9jay0+bikKKwkJSU5URUxQbGxJbnZhbGlkICgibiBvdXQgb2YgcmFuZ2VcbiIpOworCWlmIChjbG9jay0+dmNvIDwgbGltaXQtPnZjby5taW4gfHwgbGltaXQtPnZjby5tYXggPCBjbG9jay0+dmNvKQorCQlJTlRFTFBsbEludmFsaWQgKCJ2Y28gb3V0IG9mIHJhbmdlXG4iKTsKKwkvKiBYWFg6IFdlIG1heSBuZWVkIHRvIGJlIGNoZWNraW5nICJEb3QgY2xvY2siIGRlcGVuZGluZyBvbiB0aGUgbXVsdGlwbGllciwKKwkgKiBjb25uZWN0b3IsIGV0Yy4sIHJhdGhlciB0aGFuIGp1c3QgYSBzaW5nbGUgcmFuZ2UuCisJICovCisJaWYgKGNsb2NrLT5kb3QgPCBsaW1pdC0+ZG90Lm1pbiB8fCBsaW1pdC0+ZG90Lm1heCA8IGNsb2NrLT5kb3QpCisJCUlOVEVMUGxsSW52YWxpZCAoImRvdCBvdXQgb2YgcmFuZ2VcbiIpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHNldCBvZiBkaXZpc29ycyBmb3IgdGhlIGRlc2lyZWQgdGFyZ2V0IGNsb2NrIHdpdGggdGhlIGdpdmVuCisgKiByZWZjbGssIG9yIEZBTFNFLiAgVGhlIHJldHVybmVkIHZhbHVlcyByZXByZXNlbnQgdGhlIGNsb2NrIGVxdWF0aW9uOgorICogcmVmbGNrICogKDUgKiAobTEgKyAyKSArIChtMiArIDIpKSAvIChuICsgMikgLyBwMSAvIHAyLgorICovCitzdGF0aWMgYm9vbCBpbnRlbF9maW5kX2Jlc3RfUExMKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHRhcmdldCwKKwkJCQlpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnRlbF9jbG9ja190IGNsb2NrOworCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0ID0gaW50ZWxfbGltaXQoY3J0Yyk7CisJaW50IGVyciA9IHRhcmdldDsKKworCWlmIChJU19JOVhYKGRldikgJiYgaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykgJiYKKwkgICAgKEk5MTVfUkVBRChMVkRTKSAmIExWRFNfUE9SVF9FTikgIT0gMCkgeworCQkvKgorCQkgKiBGb3IgTFZEUywgaWYgdGhlIHBhbmVsIGlzIG9uLCBqdXN0IHJlbHkgb24gaXRzIGN1cnJlbnQKKwkJICogc2V0dGluZ3MgZm9yIGR1YWwtY2hhbm5lbC4gIFdlIGhhdmVuJ3QgZmlndXJlZCBvdXQgaG93IHRvCisJCSAqIHJlbGlhYmx5IHNldCB1cCBkaWZmZXJlbnQgc2luZ2xlL2R1YWwgY2hhbm5lbCBzdGF0ZSwgaWYgd2UKKwkJICogZXZlbiBjYW4uCisJCSAqLworCQlpZiAoKEk5MTVfUkVBRChMVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PQorCQkgICAgTFZEU19DTEtCX1BPV0VSX1VQKQorCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfZmFzdDsKKwkJZWxzZQorCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfc2xvdzsKKwl9IGVsc2UgeworCQlpZiAodGFyZ2V0IDwgbGltaXQtPnAyLmRvdF9saW1pdCkKKwkJCWNsb2NrLnAyID0gbGltaXQtPnAyLnAyX3Nsb3c7CisJCWVsc2UKKwkJCWNsb2NrLnAyID0gbGltaXQtPnAyLnAyX2Zhc3Q7CisJfQorCisJbWVtc2V0IChiZXN0X2Nsb2NrLCAwLCBzaXplb2YgKCpiZXN0X2Nsb2NrKSk7CisKKwlmb3IgKGNsb2NrLm0xID0gbGltaXQtPm0xLm1pbjsgY2xvY2subTEgPD0gbGltaXQtPm0xLm1heDsgY2xvY2subTErKykgeworCQlmb3IgKGNsb2NrLm0yID0gbGltaXQtPm0yLm1pbjsgY2xvY2subTIgPCBjbG9jay5tMSAmJgorCQkJICAgICBjbG9jay5tMiA8PSBsaW1pdC0+bTIubWF4OyBjbG9jay5tMisrKSB7CisJCQlmb3IgKGNsb2NrLm4gPSBsaW1pdC0+bi5taW47IGNsb2NrLm4gPD0gbGltaXQtPm4ubWF4OworCQkJICAgICBjbG9jay5uKyspIHsKKwkJCQlmb3IgKGNsb2NrLnAxID0gbGltaXQtPnAxLm1pbjsKKwkJCQkgICAgIGNsb2NrLnAxIDw9IGxpbWl0LT5wMS5tYXg7IGNsb2NrLnAxKyspIHsKKwkJCQkJaW50IHRoaXNfZXJyOworCisJCQkJCWludGVsX2Nsb2NrKGRldiwgcmVmY2xrLCAmY2xvY2spOworCisJCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGNydGMsICZjbG9jaykpCisJCQkJCQljb250aW51ZTsKKworCQkJCQl0aGlzX2VyciA9IGFicyhjbG9jay5kb3QgLSB0YXJnZXQpOworCQkJCQlpZiAodGhpc19lcnIgPCBlcnIpIHsKKwkJCQkJCSpiZXN0X2Nsb2NrID0gY2xvY2s7CisJCQkJCQllcnIgPSB0aGlzX2VycjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoZXJyICE9IHRhcmdldCk7Cit9CisKK3ZvaWQKK2ludGVsX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCS8qIFdhaXQgZm9yIDIwbXMsIGkuZS4gb25lIGN5Y2xlIGF0IDUwaHouICovCisJdWRlbGF5KDIwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX3BpcGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1bnNpZ25lZCBsb25nIFN0YXJ0LCBPZmZzZXQ7CisJaW50IGRzcGJhc2UgPSAocGlwZSA9PSAwID8gRFNQQUFERFIgOiBEU1BCQUREUik7CisJaW50IGRzcHN1cmYgPSAocGlwZSA9PSAwID8gRFNQQVNVUkYgOiBEU1BCU1VSRik7CisJaW50IGRzcHN0cmlkZSA9IChwaXBlID09IDApID8gRFNQQVNUUklERSA6IERTUEJTVFJJREU7CisJaW50IGRzcGNudHJfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOworCXUzMiBkc3BjbnRyLCBhbGlnbm1lbnQ7CisKKwkvKiBubyBmYiBib3VuZCAqLworCWlmICghY3J0Yy0+ZmIpIHsKKwkJRFJNX0RFQlVHKCJObyBGQiBib3VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwlvYmogPSBpbnRlbF9mYi0+b2JqOworCW9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKworCXN3aXRjaCAob2JqX3ByaXYtPnRpbGluZ19tb2RlKSB7CisJY2FzZSBJOTE1X1RJTElOR19OT05FOgorCQlhbGlnbm1lbnQgPSA2NCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSTkxNV9USUxJTkdfWDoKKwkJaWYgKElTX0k5WFgoZGV2KSkKKwkJCWFsaWdubWVudCA9IDEwMjQgKiAxMDI0OworCQllbHNlCisJCQlhbGlnbm1lbnQgPSA1MTIgKiAxMDI0OworCQlicmVhazsKKwljYXNlIEk5MTVfVElMSU5HX1k6CisJCS8qIEZJWE1FOiBJcyB0aGlzIHRydWU/ICovCisJCURSTV9FUlJPUigiWSB0aWxlZCBub3QgYWxsb3dlZCBmb3Igc2NhbiBvdXQgYnVmZmVyc1xuIik7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X3BpbihpbnRlbF9mYi0+b2JqLCBhbGlnbm1lbnQpKQorCQlyZXR1cm47CisKKwlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oaW50ZWxfZmItPm9iaiwgMSk7CisKKwlTdGFydCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCU9mZnNldCA9IHkgKiBjcnRjLT5mYi0+cGl0Y2ggKyB4ICogKGNydGMtPmZiLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCisJSTkxNV9XUklURShkc3BzdHJpZGUsIGNydGMtPmZiLT5waXRjaCk7CisKKwlkc3BjbnRyID0gSTkxNV9SRUFEKGRzcGNudHJfcmVnKTsKKwlzd2l0Y2ggKGNydGMtPmZiLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJZHNwY250ciB8PSBESVNQUExBTkVfOEJQUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJaWYgKGNydGMtPmZiLT5kZXB0aCA9PSAxNSkKKwkJCWRzcGNudHIgfD0gRElTUFBMQU5FXzE1XzE2QlBQOworCQllbHNlCisJCQlkc3BjbnRyIHw9IERJU1BQTEFORV8xNkJQUDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQlkc3BjbnRyIHw9IERJU1BQTEFORV8zMkJQUF9OT19BTFBIQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmtub3duIGNvbG9yIGRlcHRoXG4iKTsKKwkJcmV0dXJuOworCX0KKwlJOTE1X1dSSVRFKGRzcGNudHJfcmVnLCBkc3BjbnRyKTsKKworCURSTV9ERUJVRygiV3JpdGluZyBiYXNlICUwOGxYICUwOGxYICVkICVkXG4iLCBTdGFydCwgT2Zmc2V0LCB4LCB5KTsKKwlpZiAoSVNfSTk2NUcoZGV2KSkgeworCQlJOTE1X1dSSVRFKGRzcGJhc2UsIE9mZnNldCk7CisJCUk5MTVfUkVBRChkc3BiYXNlKTsKKwkJSTkxNV9XUklURShkc3BzdXJmLCBTdGFydCk7CisJCUk5MTVfUkVBRChkc3BzdXJmKTsKKwl9IGVsc2UgeworCQlJOTE1X1dSSVRFKGRzcGJhc2UsIFN0YXJ0ICsgT2Zmc2V0KTsKKwkJSTkxNV9SRUFEKGRzcGJhc2UpOworCX0KKworCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJaWYgKG9sZF9mYikgeworCQlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKG9sZF9mYik7CisJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9mYi0+b2JqKTsKKwl9CisKKwlpZiAoIWRldi0+cHJpbWFyeS0+bWFzdGVyKQorCQlyZXR1cm47CisKKwltYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlpZiAoIW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHBpcGUpIHsKKwljYXNlIDA6CisJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQV94ID0geDsKKwkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBpcGVBX3kgPSB5OworCQlicmVhazsKKwljYXNlIDE6CisJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQl94ID0geDsKKwkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBpcGVCX3kgPSB5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwaXBlICVkIGluIFNBUkVBXG4iLCBwaXBlKTsKKwkJYnJlYWs7CisJfQorfQorCisKKworLyoqCisgKiBTZXRzIHRoZSBwb3dlciBtYW5hZ2VtZW50IG1vZGUgb2YgdGhlIHBpcGUgYW5kIHBsYW5lLgorICoKKyAqIFRoaXMgY29kZSBzaG91bGQgcHJvYmFibHkgZ3JvdyBzdXBwb3J0IGZvciB0dXJuaW5nIHRoZSBjdXJzb3Igb2ZmIGFuZCBiYWNrCisgKiBvbiBhcHByb3ByaWF0ZWx5IGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UncmUgdHVybmluZyB0aGUgcGlwZSBvZmYvb24uCisgKi8KK3N0YXRpYyB2b2lkIGludGVsX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CisJaW50IGRwbGxfcmVnID0gKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExMX0I7CisJaW50IGRzcGNudHJfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBQ05UUiA6IERTUEJDTlRSOworCWludCBkc3BiYXNlX3JlZyA9IChwaXBlID09IDApID8gRFNQQUFERFIgOiBEU1BCQUREUjsKKwlpbnQgcGlwZWNvbmZfcmVnID0gKHBpcGUgPT0gMCkgPyBQSVBFQUNPTkYgOiBQSVBFQkNPTkY7CisJdTMyIHRlbXA7CisJYm9vbCBlbmFibGVkOworCisJLyogWFhYOiBXaGVuIG91ciBvdXRwdXRzIGFyZSBhbGwgdW5hd2FyZSBvZiBEUE1TIG1vZGVzIG90aGVyIHRoYW4gb2ZmCisJICogYW5kIG9uLCB3ZSBzaG91bGQgbWFwIHRob3NlIG1vZGVzIHRvIERSTV9NT0RFX0RQTVNfT0ZGIGluIHRoZSBDUlRDLgorCSAqLworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJLyogRW5hYmxlIHRoZSBEUExMICovCisJCXRlbXAgPSBJOTE1X1JFQUQoZHBsbF9yZWcpOworCQlpZiAoKHRlbXAgJiBEUExMX1ZDT19FTkFCTEUpID09IDApIHsKKwkJCUk5MTVfV1JJVEUoZHBsbF9yZWcsIHRlbXApOworCQkJSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwkJCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLworCQkJdWRlbGF5KDE1MCk7CisJCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCB0ZW1wIHwgRFBMTF9WQ09fRU5BQkxFKTsKKwkJCUk5MTVfUkVBRChkcGxsX3JlZyk7CisJCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KKwkJCXVkZWxheSgxNTApOworCQkJSTkxNV9XUklURShkcGxsX3JlZywgdGVtcCB8IERQTExfVkNPX0VOQUJMRSk7CisJCQlJOTE1X1JFQUQoZHBsbF9yZWcpOworCQkJLyogV2FpdCBmb3IgdGhlIGNsb2NrcyB0byBzdGFiaWxpemUuICovCisJCQl1ZGVsYXkoMTUwKTsKKwkJfQorCisJCS8qIEVuYWJsZSB0aGUgcGlwZSAqLworCQl0ZW1wID0gSTkxNV9SRUFEKHBpcGVjb25mX3JlZyk7CisJCWlmICgodGVtcCAmIFBJUEVBQ09ORl9FTkFCTEUpID09IDApCisJCQlJOTE1X1dSSVRFKHBpcGVjb25mX3JlZywgdGVtcCB8IFBJUEVBQ09ORl9FTkFCTEUpOworCisJCS8qIEVuYWJsZSB0aGUgcGxhbmUgKi8KKwkJdGVtcCA9IEk5MTVfUkVBRChkc3BjbnRyX3JlZyk7CisJCWlmICgodGVtcCAmIERJU1BMQVlfUExBTkVfRU5BQkxFKSA9PSAwKSB7CisJCQlJOTE1X1dSSVRFKGRzcGNudHJfcmVnLCB0ZW1wIHwgRElTUExBWV9QTEFORV9FTkFCTEUpOworCQkJLyogRmx1c2ggdGhlIHBsYW5lIGNoYW5nZXMgKi8KKwkJCUk5MTVfV1JJVEUoZHNwYmFzZV9yZWcsIEk5MTVfUkVBRChkc3BiYXNlX3JlZykpOworCQl9CisKKwkJaW50ZWxfY3J0Y19sb2FkX2x1dChjcnRjKTsKKworCQkvKiBHaXZlIHRoZSBvdmVybGF5IHNjYWxlciBhIGNoYW5jZSB0byBlbmFibGUgaWYgaXQncyBvbiB0aGlzIHBpcGUgKi8KKwkJLy9pbnRlbF9jcnRjX2RwbXNfdmlkZW8oY3J0YywgdHJ1ZSk7IFRPRE8KKwlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQkvKiBHaXZlIHRoZSBvdmVybGF5IHNjYWxlciBhIGNoYW5jZSB0byBkaXNhYmxlIGlmIGl0J3Mgb24gdGhpcyBwaXBlICovCisJCS8vaW50ZWxfY3J0Y19kcG1zX3ZpZGVvKGNydGMsIEZBTFNFKTsgVE9ETworCisJCS8qIERpc2FibGUgdGhlIFZHQSBwbGFuZSB0aGF0IHdlIG5ldmVyIHVzZSAqLworCQlJOTE1X1dSSVRFKFZHQUNOVFJMLCBWR0FfRElTUF9ESVNBQkxFKTsKKworCQkvKiBEaXNhYmxlIGRpc3BsYXkgcGxhbmUgKi8KKwkJdGVtcCA9IEk5MTVfUkVBRChkc3BjbnRyX3JlZyk7CisJCWlmICgodGVtcCAmIERJU1BMQVlfUExBTkVfRU5BQkxFKSAhPSAwKSB7CisJCQlJOTE1X1dSSVRFKGRzcGNudHJfcmVnLCB0ZW1wICYgfkRJU1BMQVlfUExBTkVfRU5BQkxFKTsKKwkJCS8qIEZsdXNoIHRoZSBwbGFuZSBjaGFuZ2VzICovCisJCQlJOTE1X1dSSVRFKGRzcGJhc2VfcmVnLCBJOTE1X1JFQUQoZHNwYmFzZV9yZWcpKTsKKwkJCUk5MTVfUkVBRChkc3BiYXNlX3JlZyk7CisJCX0KKworCQlpZiAoIUlTX0k5WFgoZGV2KSkgeworCQkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVjdCAqLworCQkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisJCX0KKworCQkvKiBOZXh0LCBkaXNhYmxlIGRpc3BsYXkgcGlwZXMgKi8KKwkJdGVtcCA9IEk5MTVfUkVBRChwaXBlY29uZl9yZWcpOworCQlpZiAoKHRlbXAgJiBQSVBFQUNPTkZfRU5BQkxFKSAhPSAwKSB7CisJCQlJOTE1X1dSSVRFKHBpcGVjb25mX3JlZywgdGVtcCAmIH5QSVBFQUNPTkZfRU5BQkxFKTsKKwkJCUk5MTVfUkVBRChwaXBlY29uZl9yZWcpOworCQl9CisKKwkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVjdC4gKi8KKwkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisKKwkJdGVtcCA9IEk5MTVfUkVBRChkcGxsX3JlZyk7CisJCWlmICgodGVtcCAmIERQTExfVkNPX0VOQUJMRSkgIT0gMCkgeworCQkJSTkxNV9XUklURShkcGxsX3JlZywgdGVtcCAmIH5EUExMX1ZDT19FTkFCTEUpOworCQkJSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwkJfQorCisJCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gdHVybiBvZmYuICovCisJCXVkZWxheSgxNTApOworCQlicmVhazsKKwl9CisKKwlpZiAoIWRldi0+cHJpbWFyeS0+bWFzdGVyKQorCQlyZXR1cm47CisKKwltYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlpZiAoIW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQlyZXR1cm47CisKKwllbmFibGVkID0gY3J0Yy0+ZW5hYmxlZCAmJiBtb2RlICE9IERSTV9NT0RFX0RQTVNfT0ZGOworCisJc3dpdGNoIChwaXBlKSB7CisJY2FzZSAwOgorCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGlwZUFfdyA9IGVuYWJsZWQgPyBjcnRjLT5tb2RlLmhkaXNwbGF5IDogMDsKKwkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBpcGVBX2ggPSBlbmFibGVkID8gY3J0Yy0+bW9kZS52ZGlzcGxheSA6IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBpcGVCX3cgPSBlbmFibGVkID8gY3J0Yy0+bW9kZS5oZGlzcGxheSA6IDA7CisJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQl9oID0gZW5hYmxlZCA/IGNydGMtPm1vZGUudmRpc3BsYXkgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwaXBlICVkIGluIFNBUkVBXG4iLCBwaXBlKTsKKwkJYnJlYWs7CisJfQorCisJaW50ZWxfY3J0Yy0+ZHBtc19tb2RlID0gbW9kZTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfY3J0Y19wcmVwYXJlIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCWNydGNfZnVuY3MtPmRwbXMoY3J0YywgRFJNX01PREVfRFBNU19PRkYpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2NvbW1pdCAoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKwljcnRjX2Z1bmNzLT5kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT04pOworfQorCit2b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZSAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkvKiBsdmRzIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgcHJlcGFyZSBzZWUgaW50ZWxfbHZkc19wcmVwYXJlICovCisJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7Cit9CisKK3ZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJLyogbHZkcyBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGNvbW1pdCBzZWUgaW50ZWxfbHZkc19jb21taXQgKi8KKwllbmNvZGVyX2Z1bmNzLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKiogUmV0dXJucyB0aGUgY29yZSBkaXNwbGF5IGNsb2NrIHNwZWVkIGZvciBpODMwIC0gaTk0NSAqLworc3RhdGljIGludCBpbnRlbF9nZXRfY29yZV9jbG9ja19zcGVlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCisJLyogQ29yZSBjbG9jayB2YWx1ZXMgdGFrZW4gZnJvbSB0aGUgcHVibGlzaGVkIGRhdGFzaGVldHMuCisJICogVGhlIDgzMCBtYXkgZ28gdXAgdG8gMTY2IE1oeiwgd2hpY2ggd2Ugc2hvdWxkIGNoZWNrLgorCSAqLworCWlmIChJU19JOTQ1RyhkZXYpKQorCQlyZXR1cm4gNDAwMDAwOworCWVsc2UgaWYgKElTX0k5MTVHKGRldikpCisJCXJldHVybiAzMzMwMDA7CisJZWxzZSBpZiAoSVNfSTk0NUdNKGRldikgfHwgSVNfODQ1RyhkZXYpKQorCQlyZXR1cm4gMjAwMDAwOworCWVsc2UgaWYgKElTX0k5MTVHTShkZXYpKSB7CisJCXUxNiBnY2ZnYyA9IDA7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LT5wZGV2LCBHQ0ZHQywgJmdjZmdjKTsKKworCQlpZiAoZ2NmZ2MgJiBHQ19MT1dfRlJFUVVFTkNZX0VOQUJMRSkKKwkJCXJldHVybiAxMzMwMDA7CisJCWVsc2UgeworCQkJc3dpdGNoIChnY2ZnYyAmIEdDX0RJU1BMQVlfQ0xPQ0tfTUFTSykgeworCQkJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzMzM19NSFo6CisJCQkJcmV0dXJuIDMzMzAwMDsKKwkJCWRlZmF1bHQ6CisJCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTkwXzIwMF9NSFo6CisJCQkJcmV0dXJuIDE5MDAwMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoSVNfSTg2NUcoZGV2KSkKKwkJcmV0dXJuIDI2NjAwMDsKKwllbHNlIGlmIChJU19JODU1KGRldikpIHsKKwkJdTE2IGhwbGxjYyA9IDA7CisJCS8qIEFzc3VtZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBpbiB0aGUgaGlnaCBzcGVlZCBzdGF0ZS4gIFRoaXMKKwkJICogc2hvdWxkIGJlIHRoZSBkZWZhdWx0LgorCQkgKi8KKwkJc3dpdGNoIChocGxsY2MgJiBHQ19DTE9DS19DT05UUk9MX01BU0spIHsKKwkJY2FzZSBHQ19DTE9DS18xMzNfMjAwOgorCQljYXNlIEdDX0NMT0NLXzEwMF8yMDA6CisJCQlyZXR1cm4gMjAwMDAwOworCQljYXNlIEdDX0NMT0NLXzE2Nl8yNTA6CisJCQlyZXR1cm4gMjUwMDAwOworCQljYXNlIEdDX0NMT0NLXzEwMF8xMzM6CisJCQlyZXR1cm4gMTMzMDAwOworCQl9CisJfSBlbHNlIC8qIDg1MiwgODMwICovCisJCXJldHVybiAxMzMwMDA7CisKKwlyZXR1cm4gMDsgLyogU2lsZW5jZSBnY2Mgd2FybmluZyAqLworfQorCisKKy8qKgorICogUmV0dXJuIHRoZSBwaXBlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHBhbmVsIGZpdHRlciwKKyAqIG9yIC0xIGlmIHRoZSBwYW5lbCBmaXR0ZXIgaXMgbm90IHByZXNlbnQgb3Igbm90IGluIHVzZQorICovCitzdGF0aWMgaW50IGludGVsX3BhbmVsX2ZpdHRlcl9waXBlIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyICBwZml0X2NvbnRyb2w7CisKKwkvKiBpODMwIGRvZXNuJ3QgaGF2ZSBhIHBhbmVsIGZpdHRlciAqLworCWlmIChJU19JODMwKGRldikpCisJCXJldHVybiAtMTsKKworCXBmaXRfY29udHJvbCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOworCisJLyogU2VlIGlmIHRoZSBwYW5lbCBmaXR0ZXIgaXMgaW4gdXNlICovCisJaWYgKChwZml0X2NvbnRyb2wgJiBQRklUX0VOQUJMRSkgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogOTY1IGNhbiBwbGFjZSBwYW5lbCBmaXR0ZXIgb24gZWl0aGVyIHBpcGUgKi8KKwlpZiAoSVNfSTk2NUcoZGV2KSkKKwkJcmV0dXJuIChwZml0X2NvbnRyb2wgPj4gMjkpICYgMHgzOworCisJLyogb2xkZXIgY2hpcHMgY2FuIG9ubHkgdXNlIHBpcGUgMSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwKKwkJCQlpbnQgeCwgaW50IHksCisJCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCWludCBmcF9yZWcgPSAocGlwZSA9PSAwKSA/IEZQQTAgOiBGUEIwOworCWludCBkcGxsX3JlZyA9IChwaXBlID09IDApID8gRFBMTF9BIDogRFBMTF9COworCWludCBkcGxsX21kX3JlZyA9IChpbnRlbF9jcnRjLT5waXBlID09IDApID8gRFBMTF9BX01EIDogRFBMTF9CX01EOworCWludCBkc3BjbnRyX3JlZyA9IChwaXBlID09IDApID8gRFNQQUNOVFIgOiBEU1BCQ05UUjsKKwlpbnQgcGlwZWNvbmZfcmVnID0gKHBpcGUgPT0gMCkgPyBQSVBFQUNPTkYgOiBQSVBFQkNPTkY7CisJaW50IGh0b3RfcmVnID0gKHBpcGUgPT0gMCkgPyBIVE9UQUxfQSA6IEhUT1RBTF9COworCWludCBoYmxhbmtfcmVnID0gKHBpcGUgPT0gMCkgPyBIQkxBTktfQSA6IEhCTEFOS19COworCWludCBoc3luY19yZWcgPSAocGlwZSA9PSAwKSA/IEhTWU5DX0EgOiBIU1lOQ19COworCWludCB2dG90X3JlZyA9IChwaXBlID09IDApID8gVlRPVEFMX0EgOiBWVE9UQUxfQjsKKwlpbnQgdmJsYW5rX3JlZyA9IChwaXBlID09IDApID8gVkJMQU5LX0EgOiBWQkxBTktfQjsKKwlpbnQgdnN5bmNfcmVnID0gKHBpcGUgPT0gMCkgPyBWU1lOQ19BIDogVlNZTkNfQjsKKwlpbnQgZHNwc2l6ZV9yZWcgPSAocGlwZSA9PSAwKSA/IERTUEFTSVpFIDogRFNQQlNJWkU7CisJaW50IGRzcHBvc19yZWcgPSAocGlwZSA9PSAwKSA/IERTUEFQT1MgOiBEU1BCUE9TOworCWludCBwaXBlc3JjX3JlZyA9IChwaXBlID09IDApID8gUElQRUFTUkMgOiBQSVBFQlNSQzsKKwlpbnQgcmVmY2xrOworCWludGVsX2Nsb2NrX3QgY2xvY2s7CisJdTMyIGRwbGwgPSAwLCBmcCA9IDAsIGRzcGNudHIsIHBpcGVjb25mOworCWJvb2wgb2ssIGlzX3Nkdm8gPSBmYWxzZSwgaXNfZHZvID0gZmFsc2U7CisJYm9vbCBpc19jcnQgPSBmYWxzZSwgaXNfbHZkcyA9IGZhbHNlLCBpc190diA9IGZhbHNlOworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKm1vZGVfY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCWRybV92YmxhbmtfcHJlX21vZGVzZXQoZGV2LCBwaXBlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmbW9kZV9jb25maWctPmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJCWlmICghY29ubmVjdG9yLT5lbmNvZGVyIHx8IGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChpbnRlbF9vdXRwdXQtPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfTFZEUzoKKwkJCWlzX2x2ZHMgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CisJCQlpc19zZHZvID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9EVk86CisJCQlpc19kdm8gPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX1RWT1VUOgorCQkJaXNfdHYgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX0FOQUxPRzoKKwkJCWlzX2NydCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJU19JOVhYKGRldikpIHsKKwkJcmVmY2xrID0gOTYwMDA7CisJfSBlbHNlIHsKKwkJcmVmY2xrID0gNDgwMDA7CisJfQorCisJb2sgPSBpbnRlbF9maW5kX2Jlc3RfUExMKGNydGMsIGFkanVzdGVkX21vZGUtPmNsb2NrLCByZWZjbGssICZjbG9jayk7CisJaWYgKCFvaykgeworCQlEUk1fRVJST1IoIkNvdWxkbid0IGZpbmQgUExMIHNldHRpbmdzIGZvciBtb2RlIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmcCA9IGNsb2NrLm4gPDwgMTYgfCBjbG9jay5tMSA8PCA4IHwgY2xvY2subTI7CisKKwlkcGxsID0gRFBMTF9WR0FfTU9ERV9ESVM7CisJaWYgKElTX0k5WFgoZGV2KSkgeworCQlpZiAoaXNfbHZkcykKKwkJCWRwbGwgfD0gRFBMTEJfTU9ERV9MVkRTOworCQllbHNlCisJCQlkcGxsIHw9IERQTExCX01PREVfREFDX1NFUklBTDsKKwkJaWYgKGlzX3Nkdm8pIHsKKwkJCWRwbGwgfD0gRFBMTF9EVk9fSElHSF9TUEVFRDsKKwkJCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpKSB7CisJCQkJaW50IHNkdm9fcGl4ZWxfbXVsdGlwbHkgPSBhZGp1c3RlZF9tb2RlLT5jbG9jayAvIG1vZGUtPmNsb2NrOworCQkJCWRwbGwgfD0gKHNkdm9fcGl4ZWxfbXVsdGlwbHkgLSAxKSA8PCBTRFZPX01VTFRJUExJRVJfU0hJRlRfSElSRVM7CisJCQl9CisJCX0KKworCQkvKiBjb21wdXRlIGJpdG1hc2sgZnJvbSBwMSB2YWx1ZSAqLworCQlkcGxsIHw9ICgxIDw8IChjbG9jay5wMSAtIDEpKSA8PCAxNjsKKwkJc3dpdGNoIChjbG9jay5wMikgeworCQljYXNlIDU6CisJCQlkcGxsIHw9IERQTExfREFDX1NFUklBTF9QMl9DTE9DS19ESVZfNTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlkcGxsIHw9IERQTExCX0xWRFNfUDJfQ0xPQ0tfRElWXzc7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWRwbGwgfD0gRFBMTF9EQUNfU0VSSUFMX1AyX0NMT0NLX0RJVl8xMDsKKwkJCWJyZWFrOworCQljYXNlIDE0OgorCQkJZHBsbCB8PSBEUExMQl9MVkRTX1AyX0NMT0NLX0RJVl8xNDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChJU19JOTY1RyhkZXYpKQorCQkJZHBsbCB8PSAoNiA8PCBQTExfTE9BRF9QVUxTRV9QSEFTRV9TSElGVCk7CisJfSBlbHNlIHsKKwkJaWYgKGlzX2x2ZHMpIHsKKwkJCWRwbGwgfD0gKDEgPDwgKGNsb2NrLnAxIC0gMSkpIDw8IERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY2xvY2sucDEgPT0gMikKKwkJCQlkcGxsIHw9IFBMTF9QMV9ESVZJREVfQllfVFdPOworCQkJZWxzZQorCQkJCWRwbGwgfD0gKGNsb2NrLnAxIC0gMikgPDwgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVDsKKwkJCWlmIChjbG9jay5wMiA9PSA0KQorCQkJCWRwbGwgfD0gUExMX1AyX0RJVklERV9CWV80OworCQl9CisJfQorCisJaWYgKGlzX3R2KSB7CisJCS8qIFhYWDoganVzdCBtYXRjaGluZyBCSU9TIGZvciBub3cgKi8KKy8qCWRwbGwgfD0gUExMX1JFRl9JTlBVVF9UVkNMS0lOQkM7ICovCisJCWRwbGwgfD0gMzsKKwl9CisJZWxzZQorCQlkcGxsIHw9IFBMTF9SRUZfSU5QVVRfRFJFRkNMSzsKKworCS8qIHNldHVwIHBpcGVjb25mICovCisJcGlwZWNvbmYgPSBJOTE1X1JFQUQocGlwZWNvbmZfcmVnKTsKKworCS8qIFNldCB1cCB0aGUgZGlzcGxheSBwbGFuZSByZWdpc3RlciAqLworCWRzcGNudHIgPSBESVNQUExBTkVfR0FNTUFfRU5BQkxFOworCisJaWYgKHBpcGUgPT0gMCkKKwkJZHNwY250ciB8PSBESVNQUExBTkVfU0VMX1BJUEVfQTsKKwllbHNlCisJCWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0I7CisKKwlpZiAocGlwZSA9PSAwICYmICFJU19JOTY1RyhkZXYpKSB7CisJCS8qIEVuYWJsZSBwaXhlbCBkb3VibGluZyB3aGVuIHRoZSBkb3QgY2xvY2sgaXMgPiA5MCUgb2YgdGhlIChkaXNwbGF5KQorCQkgKiBjb3JlIHNwZWVkLgorCQkgKgorCQkgKiBYWFg6IE5vIGRvdWJsZS13aWRlIG9uIDkxNUdNIHBpcGUgQi4gSXMgdGhhdCB0aGUgb25seSByZWFzb24gZm9yIHRoZQorCQkgKiBwaXBlID09IDAgY2hlY2s/CisJCSAqLworCQlpZiAobW9kZS0+Y2xvY2sgPiBpbnRlbF9nZXRfY29yZV9jbG9ja19zcGVlZChkZXYpICogOSAvIDEwKQorCQkJcGlwZWNvbmYgfD0gUElQRUFDT05GX0RPVUJMRV9XSURFOworCQllbHNlCisJCQlwaXBlY29uZiAmPSB+UElQRUFDT05GX0RPVUJMRV9XSURFOworCX0KKworCWRzcGNudHIgfD0gRElTUExBWV9QTEFORV9FTkFCTEU7CisJcGlwZWNvbmYgfD0gUElQRUFDT05GX0VOQUJMRTsKKwlkcGxsIHw9IERQTExfVkNPX0VOQUJMRTsKKworCisJLyogRGlzYWJsZSB0aGUgcGFuZWwgZml0dGVyIGlmIGl0IHdhcyBvbiBvdXIgcGlwZSAqLworCWlmIChpbnRlbF9wYW5lbF9maXR0ZXJfcGlwZShkZXYpID09IHBpcGUpCisJCUk5MTVfV1JJVEUoUEZJVF9DT05UUk9MLCAwKTsKKworCURSTV9ERUJVRygiTW9kZSBmb3IgcGlwZSAlYzpcbiIsIHBpcGUgPT0gMCA/ICdBJyA6ICdCJyk7CisJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShtb2RlKTsKKworCisJaWYgKGRwbGwgJiBEUExMX1ZDT19FTkFCTEUpIHsKKwkJSTkxNV9XUklURShmcF9yZWcsIGZwKTsKKwkJSTkxNV9XUklURShkcGxsX3JlZywgZHBsbCAmIH5EUExMX1ZDT19FTkFCTEUpOworCQlJOTE1X1JFQUQoZHBsbF9yZWcpOworCQl1ZGVsYXkoMTUwKTsKKwl9CisKKwkvKiBUaGUgTFZEUyBwaW4gcGFpciBuZWVkcyB0byBiZSBvbiBiZWZvcmUgdGhlIERQTExzIGFyZSBlbmFibGVkLgorCSAqIFRoaXMgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBnZW5lcmFsIHJ1bGUgdGhhdCBtb2RlX3NldCBkb2Vzbid0IHR1cm4KKwkgKiB0aGluZ3Mgb24uCisJICovCisJaWYgKGlzX2x2ZHMpIHsKKwkJdTMyIGx2ZHMgPSBJOTE1X1JFQUQoTFZEUyk7CisKKwkJbHZkcyB8PSBMVkRTX1BPUlRfRU4gfCBMVkRTX0EwQTJfQ0xLQV9QT1dFUl9VUCB8IExWRFNfUElQRUJfU0VMRUNUOworCQkvKiBTZXQgdGhlIEIwLUIzIGRhdGEgcGFpcnMgY29ycmVzcG9uZGluZyB0byB3aGV0aGVyIHdlJ3JlIGdvaW5nIHRvCisJCSAqIHNldCB0aGUgRFBMTHMgZm9yIGR1YWwtY2hhbm5lbCBtb2RlIG9yIG5vdC4KKwkJICovCisJCWlmIChjbG9jay5wMiA9PSA3KQorCQkJbHZkcyB8PSBMVkRTX0IwQjNfUE9XRVJfVVAgfCBMVkRTX0NMS0JfUE9XRVJfVVA7CisJCWVsc2UKKwkJCWx2ZHMgJj0gfihMVkRTX0IwQjNfUE9XRVJfVVAgfCBMVkRTX0NMS0JfUE9XRVJfVVApOworCisJCS8qIEl0IHdvdWxkIGJlIG5pY2UgdG8gc2V0IDI0IHZzIDE4LWJpdCBtb2RlIChMVkRTX0EzX1BPV0VSX1VQKQorCQkgKiBhcHByb3ByaWF0ZWx5IGhlcmUsIGJ1dCB3ZSBuZWVkIHRvIGxvb2sgbW9yZSB0aG9yb3VnaGx5IGludG8gaG93CisJCSAqIHBhbmVscyBiZWhhdmUgaW4gdGhlIHR3byBtb2Rlcy4KKwkJICovCisKKwkJSTkxNV9XUklURShMVkRTLCBsdmRzKTsKKwkJSTkxNV9SRUFEKExWRFMpOworCX0KKworCUk5MTVfV1JJVEUoZnBfcmVnLCBmcCk7CisJSTkxNV9XUklURShkcGxsX3JlZywgZHBsbCk7CisJSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KKwl1ZGVsYXkoMTUwKTsKKworCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCWludCBzZHZvX3BpeGVsX211bHRpcGx5ID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgLyBtb2RlLT5jbG9jazsKKwkJSTkxNV9XUklURShkcGxsX21kX3JlZywgKDAgPDwgRFBMTF9NRF9VRElfRElWSURFUl9TSElGVCkgfAorCQkJICAgKChzZHZvX3BpeGVsX211bHRpcGx5IC0gMSkgPDwgRFBMTF9NRF9VRElfTVVMVElQTElFUl9TSElGVCkpOworCX0gZWxzZSB7CisJCS8qIHdyaXRlIGl0IGFnYWluIC0tIHRoZSBCSU9TIGRvZXMsIGFmdGVyIGFsbCAqLworCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsKTsKKwl9CisJSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KKwl1ZGVsYXkoMTUwKTsKKworCUk5MTVfV1JJVEUoaHRvdF9yZWcsIChhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNwbGF5IC0gMSkgfAorCQkgICAoKGFkanVzdGVkX21vZGUtPmNydGNfaHRvdGFsIC0gMSkgPDwgMTYpKTsKKwlJOTE1X1dSSVRFKGhibGFua19yZWcsIChhZGp1c3RlZF9tb2RlLT5jcnRjX2hibGFua19zdGFydCAtIDEpIHwKKwkJICAgKChhZGp1c3RlZF9tb2RlLT5jcnRjX2hibGFua19lbmQgLSAxKSA8PCAxNikpOworCUk5MTVfV1JJVEUoaHN5bmNfcmVnLCAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oc3luY19zdGFydCAtIDEpIHwKKwkJICAgKChhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX2VuZCAtIDEpIDw8IDE2KSk7CisJSTkxNV9XUklURSh2dG90X3JlZywgKGFkanVzdGVkX21vZGUtPmNydGNfdmRpc3BsYXkgLSAxKSB8CisJCSAgICgoYWRqdXN0ZWRfbW9kZS0+Y3J0Y192dG90YWwgLSAxKSA8PCAxNikpOworCUk5MTVfV1JJVEUodmJsYW5rX3JlZywgKGFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX3N0YXJ0IC0gMSkgfAorCQkgICAoKGFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX2VuZCAtIDEpIDw8IDE2KSk7CisJSTkxNV9XUklURSh2c3luY19yZWcsIChhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0IC0gMSkgfAorCQkgICAoKGFkanVzdGVkX21vZGUtPmNydGNfdnN5bmNfZW5kIC0gMSkgPDwgMTYpKTsKKwkvKiBwaXBlc3JjIGFuZCBkc3BzaXplIGNvbnRyb2wgdGhlIHNpemUgdGhhdCBpcyBzY2FsZWQgZnJvbSwgd2hpY2ggc2hvdWxkCisJICogYWx3YXlzIGJlIHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNpemUuCisJICovCisJSTkxNV9XUklURShkc3BzaXplX3JlZywgKChtb2RlLT52ZGlzcGxheSAtIDEpIDw8IDE2KSB8IChtb2RlLT5oZGlzcGxheSAtIDEpKTsKKwlJOTE1X1dSSVRFKGRzcHBvc19yZWcsIDApOworCUk5MTVfV1JJVEUocGlwZXNyY19yZWcsICgobW9kZS0+aGRpc3BsYXkgLSAxKSA8PCAxNikgfCAobW9kZS0+dmRpc3BsYXkgLSAxKSk7CisJSTkxNV9XUklURShwaXBlY29uZl9yZWcsIHBpcGVjb25mKTsKKwlJOTE1X1JFQUQocGlwZWNvbmZfcmVnKTsKKworCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJSTkxNV9XUklURShkc3BjbnRyX3JlZywgZHNwY250cik7CisKKwkvKiBGbHVzaCB0aGUgcGxhbmUgY2hhbmdlcyAqLworCWludGVsX3BpcGVfc2V0X2Jhc2UoY3J0YywgeCwgeSwgb2xkX2ZiKTsKKworCWRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgcGlwZSk7Cit9CisKKy8qKiBMb2FkcyB0aGUgcGFsZXR0ZS9nYW1tYSB1bml0IGZvciB0aGUgQ1JUQyB3aXRoIHRoZSBwcmVwYXJlZCB2YWx1ZXMgKi8KK3ZvaWQgaW50ZWxfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGFscmVnID0gKGludGVsX2NydGMtPnBpcGUgPT0gMCkgPyBQQUxFVFRFX0EgOiBQQUxFVFRFX0I7CisJaW50IGk7CisKKwkvKiBUaGUgY2xvY2tzIGhhdmUgdG8gYmUgb24gdG8gbG9hZCB0aGUgcGFsZXR0ZS4gKi8KKwlpZiAoIWNydGMtPmVuYWJsZWQpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlJOTE1X1dSSVRFKHBhbHJlZyArIDQgKiBpLAorCQkJICAgKGludGVsX2NydGMtPmx1dF9yW2ldIDw8IDE2KSB8CisJCQkgICAoaW50ZWxfY3J0Yy0+bHV0X2dbaV0gPDwgOCkgfAorCQkJICAgaW50ZWxfY3J0Yy0+bHV0X2JbaV0pOworCX0KK30KKworc3RhdGljIGludCBpbnRlbF9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgdWludDMyX3QgaGFuZGxlLAorCQkJCSB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCXVpbnQzMl90IGNvbnRyb2wgPSAocGlwZSA9PSAwKSA/IENVUkFDTlRSIDogQ1VSQkNOVFI7CisJdWludDMyX3QgYmFzZSA9IChwaXBlID09IDApID8gQ1VSQUJBU0UgOiBDVVJCQkFTRTsKKwl1aW50MzJfdCB0ZW1wOworCXNpemVfdCBhZGRyOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vyc29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisJaWYgKCFoYW5kbGUpIHsKKwkJRFJNX0RFQlVHKCJjdXJzb3Igb2ZmXG4iKTsKKwkJLyogdHVybiBvZiB0aGUgY3Vyc29yICovCisJCXRlbXAgPSAwOworCQl0ZW1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7CisKKwkJSTkxNV9XUklURShjb250cm9sLCB0ZW1wKTsKKwkJSTkxNV9XUklURShiYXNlLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCA2NHg2NCBjdXJzb3JzICovCisJaWYgKHdpZHRoICE9IDY0IHx8IGhlaWdodCAhPSA2NCkgeworCQlEUk1fRVJST1IoIndlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgNjR4NjQgY3Vyc29yc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJvID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBoYW5kbGUpOworCWlmICghYm8pCisJCXJldHVybiAtRU5PRU5UOworCisJb2JqX3ByaXYgPSBiby0+ZHJpdmVyX3ByaXZhdGU7CisKKwlpZiAoYm8tPnNpemUgPCB3aWR0aCAqIGhlaWdodCAqIDQpIHsKKwkJRFJNX0VSUk9SKCJidWZmZXIgaXMgdG8gc21hbGxcbiIpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShibyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChkZXZfcHJpdi0+Y3Vyc29yX25lZWRzX3BoeXNpY2FsKSB7CisJCWFkZHIgPSBkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0OworCX0gZWxzZSB7CisJCWFkZHIgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwl9CisKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYWRkciA9IGFkZHI7CisJdGVtcCA9IDA7CisJLyogc2V0IHRoZSBwaXBlIGZvciB0aGUgY3Vyc29yICovCisJdGVtcCB8PSAocGlwZSA8PCAyOCk7CisJdGVtcCB8PSBDVVJTT1JfTU9ERV82NF9BUkdCX0FYIHwgTUNVUlNPUl9HQU1NQV9FTkFCTEU7CisKKwlJOTE1X1dSSVRFKGNvbnRyb2wsIHRlbXApOworCUk5MTVfV1JJVEUoYmFzZSwgYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9jcnRjX2N1cnNvcl9tb3ZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCXVpbnQzMl90IHRlbXAgPSAwOworCXVpbnQzMl90IGFkZGVyOworCisJaWYgKHggPCAwKSB7CisJCXRlbXAgfD0gKENVUlNPUl9QT1NfU0lHTiA8PCBDVVJTT1JfWF9TSElGVCk7CisJCXggPSAteDsKKwl9CisJaWYgKHkgPCAwKSB7CisJCXRlbXAgfD0gKENVUlNPUl9QT1NfU0lHTiA8PCBDVVJTT1JfWV9TSElGVCk7CisJCXkgPSAteTsKKwl9CisKKwl0ZW1wIHw9ICgoeCAmIENVUlNPUl9QT1NfTUFTSykgPDwgQ1VSU09SX1hfU0hJRlQpOworCXRlbXAgfD0gKCh5ICYgQ1VSU09SX1BPU19NQVNLKSA8PCBDVVJTT1JfWV9TSElGVCk7CisKKwlhZGRlciA9IGludGVsX2NydGMtPmN1cnNvcl9hZGRyOworCUk5MTVfV1JJVEUoKHBpcGUgPT0gMCkgPyBDVVJBUE9TIDogQ1VSQlBPUywgdGVtcCk7CisJSTkxNV9XUklURSgocGlwZSA9PSAwKSA/IENVUkFCQVNFIDogQ1VSQkJBU0UsIGFkZGVyKTsKKworCXJldHVybiAwOworfQorCisvKiogU2V0cyB0aGUgY29sb3IgcmFtcHMgb24gYmVoYWxmIG9mIFJhbmRSICovCit2b2lkIGludGVsX2NydGNfZmJfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2IHJlZCwgdTE2IGdyZWVuLAorCQkJCSB1MTYgYmx1ZSwgaW50IHJlZ25vKQoreworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKworCWludGVsX2NydGMtPmx1dF9yW3JlZ25vXSA9IHJlZCA+PiA4OworCWludGVsX2NydGMtPmx1dF9nW3JlZ25vXSA9IGdyZWVuID4+IDg7CisJaW50ZWxfY3J0Yy0+bHV0X2JbcmVnbm9dID0gYmx1ZSA+PiA4OworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAorCQkJCSB1MTYgKmJsdWUsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCWludCBpOworCisJaWYgKHNpemUgIT0gMjU2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaW50ZWxfY3J0Yy0+bHV0X3JbaV0gPSByZWRbaV0gPj4gODsKKwkJaW50ZWxfY3J0Yy0+bHV0X2dbaV0gPSBncmVlbltpXSA+PiA4OworCQlpbnRlbF9jcnRjLT5sdXRfYltpXSA9IGJsdWVbaV0gPj4gODsKKwl9CisKKwlpbnRlbF9jcnRjX2xvYWRfbHV0KGNydGMpOworfQorCisvKioKKyAqIEdldCBhIHBpcGUgd2l0aCBhIHNpbXBsZSBtb2RlIHNldCBvbiBpdCBmb3IgZG9pbmcgbG9hZC1iYXNlZCBtb25pdG9yCisgKiBkZXRlY3Rpb24uCisgKgorICogSXQgd2lsbCBiZSB1cCB0byB0aGUgbG9hZC1kZXRlY3QgY29kZSB0byBhZGp1c3QgdGhlIHBpcGUgYXMgYXBwcm9wcmlhdGUgZm9yCisgKiBpdHMgcmVxdWlyZW1lbnRzLiAgVGhlIHBpcGUgd2lsbCBiZSBjb25uZWN0ZWQgdG8gbm8gb3RoZXIgb3V0cHV0cy4KKyAqCisgKiBDdXJyZW50bHkgdGhpcyBjb2RlIHdpbGwgb25seSBzdWNjZWVkIGlmIHRoZXJlIGlzIGEgcGlwZSB3aXRoIG5vIG91dHB1dHMKKyAqIGNvbmZpZ3VyZWQgZm9yIGl0LiAgSW4gdGhlIGZ1dHVyZSwgaXQgY291bGQgY2hvb3NlIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUKKyAqIHNvbWUgb3V0cHV0cyB0byBmcmVlIHVwIGEgcGlwZSBmb3IgaXRzIHVzZS4KKyAqCisgKiBccmV0dXJuIGNydGMsIG9yIE5VTEwgaWYgbm8gcGlwZXMgYXJlIGF2YWlsYWJsZS4KKyAqLworCisvKiBWRVNBIDY0MHg0ODB4NzJIeiBtb2RlIHRvIHNldCBvbiB0aGUgcGlwZSAqLworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGxvYWRfZGV0ZWN0X21vZGUgPSB7CisJRFJNX01PREUoIjY0MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RFRkFVTFQsIDMxNTAwLCA2NDAsIDY2NCwKKwkJIDcwNCwgODMyLCAwLCA0ODAsIDQ4OSwgNDkxLCA1MjAsIDAsIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpLAorfTsKKworc3RydWN0IGRybV9jcnRjICppbnRlbF9nZXRfbG9hZF9kZXRlY3RfcGlwZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkJICAgIGludCAqZHBtc19tb2RlKQoreworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOworCXN0cnVjdCBkcm1fY3J0YyAqcG9zc2libGVfY3J0YzsKKwlzdHJ1Y3QgZHJtX2NydGMgKnN1cHBvcnRlZF9jcnRjID1OVUxMOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZpbnRlbF9vdXRwdXQtPmVuYzsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgKmNydGNfZnVuY3M7CisJaW50IGkgPSAtMTsKKworCS8qCisJICogQWxnb3JpdGhtIGdldHMgYSBsaXR0bGUgbWVzc3k6CisJICogICAtIGlmIHRoZSBjb25uZWN0b3IgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY3J0YywgdXNlIGl0IChidXQgbWFrZQorCSAqICAgICBzdXJlIGl0J3Mgb24gZmlyc3QpCisJICogICAtIHRyeSB0byBmaW5kIHRoZSBmaXJzdCB1bnVzZWQgY3J0YyB0aGF0IGNhbiBkcml2ZSB0aGlzIGNvbm5lY3RvciwKKwkgKiAgICAgYW5kIHVzZSB0aGF0IGlmIHdlIGZpbmQgb25lCisJICogICAtIGlmIHRoZXJlIGFyZSBubyB1bnVzZWQgY3J0Y3MgYXZhaWxhYmxlLCB0cnkgdG8gdXNlIHRoZSBmaXJzdAorCSAqICAgICBvbmUgd2UgZm91bmQgdGhhdCBzdXBwb3J0cyB0aGUgY29ubmVjdG9yCisJICovCisKKwkvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgQ1JUQyBmb3IgdGhpcyBjb25uZWN0b3IgKi8KKwlpZiAoZW5jb2Rlci0+Y3J0YykgeworCQljcnRjID0gZW5jb2Rlci0+Y3J0YzsKKwkJLyogTWFrZSBzdXJlIHRoZSBjcnRjIGFuZCBjb25uZWN0b3IgYXJlIHJ1bm5pbmcgKi8KKwkJaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJCSpkcG1zX21vZGUgPSBpbnRlbF9jcnRjLT5kcG1zX21vZGU7CisJCWlmIChpbnRlbF9jcnRjLT5kcG1zX21vZGUgIT0gRFJNX01PREVfRFBNU19PTikgeworCQkJY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCQkJY3J0Y19mdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKKwkJCWVuY29kZXJfZnVuY3MtPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisJCX0KKwkJcmV0dXJuIGNydGM7CisJfQorCisJLyogRmluZCBhbiB1bnVzZWQgb25lIChpZiBwb3NzaWJsZSkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvc3NpYmxlX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpKys7CisJCWlmICghKGVuY29kZXItPnBvc3NpYmxlX2NydGNzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWlmICghcG9zc2libGVfY3J0Yy0+ZW5hYmxlZCkgeworCQkJY3J0YyA9IHBvc3NpYmxlX2NydGM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN1cHBvcnRlZF9jcnRjKQorCQkJc3VwcG9ydGVkX2NydGMgPSBwb3NzaWJsZV9jcnRjOworCX0KKworCS8qCisJICogSWYgd2UgZGlkbid0IGZpbmQgYW4gdW51c2VkIENSVEMsIGRvbid0IHVzZSBhbnkuCisJICovCisJaWYgKCFjcnRjKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWVuY29kZXItPmNydGMgPSBjcnRjOworCWludGVsX291dHB1dC0+bG9hZF9kZXRlY3RfdGVtcCA9IHRydWU7CisKKwlpbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwkqZHBtc19tb2RlID0gaW50ZWxfY3J0Yy0+ZHBtc19tb2RlOworCisJaWYgKCFjcnRjLT5lbmFibGVkKSB7CisJCWlmICghbW9kZSkKKwkJCW1vZGUgPSAmbG9hZF9kZXRlY3RfbW9kZTsKKwkJZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKGNydGMsIG1vZGUsIDAsIDAsIGNydGMtPmZiKTsKKwl9IGVsc2UgeworCQlpZiAoaW50ZWxfY3J0Yy0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJCWNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKwkJCWNydGNfZnVuY3MtPmRwbXMoY3J0YywgRFJNX01PREVfRFBNU19PTik7CisJCX0KKworCQkvKiBBZGQgdGhpcyBjb25uZWN0b3IgdG8gdGhlIGNydGMgKi8KKwkJZW5jb2Rlcl9mdW5jcy0+bW9kZV9zZXQoZW5jb2RlciwgJmNydGMtPm1vZGUsICZjcnRjLT5tb2RlKTsKKwkJZW5jb2Rlcl9mdW5jcy0+Y29tbWl0KGVuY29kZXIpOworCX0KKwkvKiBsZXQgdGhlIGNvbm5lY3RvciBnZXQgdGhyb3VnaCBvbmUgZnVsbCBjeWNsZSBiZWZvcmUgdGVzdGluZyAqLworCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJcmV0dXJuIGNydGM7Cit9CisKK3ZvaWQgaW50ZWxfcmVsZWFzZV9sb2FkX2RldGVjdF9waXBlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwgaW50IGRwbXNfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW50ZWxfb3V0cHV0LT5lbmM7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRjX2Z1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CisKKwlpZiAoaW50ZWxfb3V0cHV0LT5sb2FkX2RldGVjdF90ZW1wKSB7CisJCWVuY29kZXItPmNydGMgPSBOVUxMOworCQlpbnRlbF9vdXRwdXQtPmxvYWRfZGV0ZWN0X3RlbXAgPSBmYWxzZTsKKwkJY3J0Yy0+ZW5hYmxlZCA9IGRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0Yyk7CisJCWRybV9oZWxwZXJfZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zKGRldik7CisJfQorCisJLyogU3dpdGNoIGNydGMgYW5kIG91dHB1dCBiYWNrIG9mZiBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoY3J0Yy0+ZW5hYmxlZCAmJiBkcG1zX21vZGUgIT0gRFJNX01PREVfRFBNU19PTikgeworCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKQorCQkJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBkcG1zX21vZGUpOworCQljcnRjX2Z1bmNzLT5kcG1zKGNydGMsIGRwbXNfbW9kZSk7CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSBjbG9jayBvZiB0aGUgY3VycmVudGx5IHByb2dyYW1tZWQgbW9kZSBvZiB0aGUgZ2l2ZW4gcGlwZS4gKi8KK3N0YXRpYyBpbnQgaW50ZWxfY3J0Y19jbG9ja19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgZHBsbCA9IEk5MTVfUkVBRCgocGlwZSA9PSAwKSA/IERQTExfQSA6IERQTExfQik7CisJdTMyIGZwOworCWludGVsX2Nsb2NrX3QgY2xvY2s7CisKKwlpZiAoKGRwbGwgJiBESVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTEpID09IDApCisJCWZwID0gSTkxNV9SRUFEKChwaXBlID09IDApID8gRlBBMCA6IEZQQjApOworCWVsc2UKKwkJZnAgPSBJOTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBGUEExIDogRlBCMSk7CisKKwljbG9jay5tMSA9IChmcCAmIEZQX00xX0RJVl9NQVNLKSA+PiBGUF9NMV9ESVZfU0hJRlQ7CisJY2xvY2subTIgPSAoZnAgJiBGUF9NMl9ESVZfTUFTSykgPj4gRlBfTTJfRElWX1NISUZUOworCWNsb2NrLm4gPSAoZnAgJiBGUF9OX0RJVl9NQVNLKSA+PiBGUF9OX0RJVl9TSElGVDsKKwlpZiAoSVNfSTlYWChkZXYpKSB7CisJCWNsb2NrLnAxID0gZmZzKChkcGxsICYgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLKSA+PgorCQkJICAgICAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQpOworCisJCXN3aXRjaCAoZHBsbCAmIERQTExfTU9ERV9NQVNLKSB7CisJCWNhc2UgRFBMTEJfTU9ERV9EQUNfU0VSSUFMOgorCQkJY2xvY2sucDIgPSBkcGxsICYgRFBMTF9EQUNfU0VSSUFMX1AyX0NMT0NLX0RJVl81ID8KKwkJCQk1IDogMTA7CisJCQlicmVhazsKKwkJY2FzZSBEUExMQl9NT0RFX0xWRFM6CisJCQljbG9jay5wMiA9IGRwbGwgJiBEUExMQl9MVkRTX1AyX0NMT0NLX0RJVl83ID8KKwkJCQk3IDogMTQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9ERUJVRygiVW5rbm93biBEUExMIG1vZGUgJTA4eCBpbiBwcm9ncmFtbWVkICIKKwkJCQkgICJtb2RlXG4iLCAoaW50KShkcGxsICYgRFBMTF9NT0RFX01BU0spKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogWFhYOiBIYW5kbGUgdGhlIDEwME1oeiByZWZjbGsgKi8KKwkJaTl4eF9jbG9jayg5NjAwMCwgJmNsb2NrKTsKKwl9IGVsc2UgeworCQlib29sIGlzX2x2ZHMgPSAocGlwZSA9PSAxKSAmJiAoSTkxNV9SRUFEKExWRFMpICYgTFZEU19QT1JUX0VOKTsKKworCQlpZiAoaXNfbHZkcykgeworCQkJY2xvY2sucDEgPSBmZnMoKGRwbGwgJiBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSTgzMF9MVkRTKSA+PgorCQkJCSAgICAgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUKTsKKwkJCWNsb2NrLnAyID0gMTQ7CisKKwkJCWlmICgoZHBsbCAmIFBMTF9SRUZfSU5QVVRfTUFTSykgPT0KKwkJCSAgICBQTExCX1JFRl9JTlBVVF9TUFJFQURTUEVDVFJVTUlOKSB7CisJCQkJLyogWFhYOiBtaWdodCBub3QgYmUgNjZNSHogKi8KKwkJCQlpOHh4X2Nsb2NrKDY2MDAwLCAmY2xvY2spOworCQkJfSBlbHNlCisJCQkJaTh4eF9jbG9jayg0ODAwMCwgJmNsb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkcGxsICYgUExMX1AxX0RJVklERV9CWV9UV08pCisJCQkJY2xvY2sucDEgPSAyOworCQkJZWxzZSB7CisJCQkJY2xvY2sucDEgPSAoKGRwbGwgJiBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSTgzMCkgPj4KKwkJCQkJICAgIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQpICsgMjsKKwkJCX0KKwkJCWlmIChkcGxsICYgUExMX1AyX0RJVklERV9CWV80KQorCQkJCWNsb2NrLnAyID0gNDsKKwkJCWVsc2UKKwkJCQljbG9jay5wMiA9IDI7CisKKwkJCWk4eHhfY2xvY2soNDgwMDAsICZjbG9jayk7CisJCX0KKwl9CisKKwkvKiBYWFg6IEl0IHdvdWxkIGJlIG5pY2UgdG8gdmFsaWRhdGUgdGhlIGNsb2NrcywgYnV0IHdlIGNhbid0IHJldXNlCisJICogaTgzMFBsbElzVmFsaWQoKSBiZWNhdXNlIGl0IHJlbGllcyBvbiB0aGUgeGY4Nl9jb25maWcgY29ubmVjdG9yCisJICogY29uZmlndXJhdGlvbiBiZWluZyBhY2N1cmF0ZSwgd2hpY2ggaXQgaXNuJ3QgbmVjZXNzYXJpbHkuCisJICovCisKKwlyZXR1cm4gY2xvY2suZG90OworfQorCisvKiogUmV0dXJucyB0aGUgY3VycmVudGx5IHByb2dyYW1tZWQgbW9kZSBvZiB0aGUgZ2l2ZW4gcGlwZS4gKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICppbnRlbF9jcnRjX21vZGVfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlpbnQgaHRvdCA9IEk5MTVfUkVBRCgocGlwZSA9PSAwKSA/IEhUT1RBTF9BIDogSFRPVEFMX0IpOworCWludCBoc3luYyA9IEk5MTVfUkVBRCgocGlwZSA9PSAwKSA/IEhTWU5DX0EgOiBIU1lOQ19CKTsKKwlpbnQgdnRvdCA9IEk5MTVfUkVBRCgocGlwZSA9PSAwKSA/IFZUT1RBTF9BIDogVlRPVEFMX0IpOworCWludCB2c3luYyA9IEk5MTVfUkVBRCgocGlwZSA9PSAwKSA/IFZTWU5DX0EgOiBWU1lOQ19CKTsKKworCW1vZGUgPSBremFsbG9jKHNpemVvZigqbW9kZSksIEdGUF9LRVJORUwpOworCWlmICghbW9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwltb2RlLT5jbG9jayA9IGludGVsX2NydGNfY2xvY2tfZ2V0KGRldiwgY3J0Yyk7CisJbW9kZS0+aGRpc3BsYXkgPSAoaHRvdCAmIDB4ZmZmZikgKyAxOworCW1vZGUtPmh0b3RhbCA9ICgoaHRvdCAmIDB4ZmZmZjAwMDApID4+IDE2KSArIDE7CisJbW9kZS0+aHN5bmNfc3RhcnQgPSAoaHN5bmMgJiAweGZmZmYpICsgMTsKKwltb2RlLT5oc3luY19lbmQgPSAoKGhzeW5jICYgMHhmZmZmMDAwMCkgPj4gMTYpICsgMTsKKwltb2RlLT52ZGlzcGxheSA9ICh2dG90ICYgMHhmZmZmKSArIDE7CisJbW9kZS0+dnRvdGFsID0gKCh2dG90ICYgMHhmZmZmMDAwMCkgPj4gMTYpICsgMTsKKwltb2RlLT52c3luY19zdGFydCA9ICh2c3luYyAmIDB4ZmZmZikgKyAxOworCW1vZGUtPnZzeW5jX2VuZCA9ICgodnN5bmMgJiAweGZmZmYwMDAwKSA+PiAxNikgKyAxOworCisJZHJtX21vZGVfc2V0X25hbWUobW9kZSk7CisJZHJtX21vZGVfc2V0X2NydGNpbmZvKG1vZGUsIDApOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCisJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKKwlrZnJlZShpbnRlbF9jcnRjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgaW50ZWxfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gaW50ZWxfY3J0Y19kcG1zLAorCS5tb2RlX2ZpeHVwID0gaW50ZWxfY3J0Y19tb2RlX2ZpeHVwLAorCS5tb2RlX3NldCA9IGludGVsX2NydGNfbW9kZV9zZXQsCisJLm1vZGVfc2V0X2Jhc2UgPSBpbnRlbF9waXBlX3NldF9iYXNlLAorCS5wcmVwYXJlID0gaW50ZWxfY3J0Y19wcmVwYXJlLAorCS5jb21taXQgPSBpbnRlbF9jcnRjX2NvbW1pdCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgaW50ZWxfY3J0Y19mdW5jcyA9IHsKKwkuY3Vyc29yX3NldCA9IGludGVsX2NydGNfY3Vyc29yX3NldCwKKwkuY3Vyc29yX21vdmUgPSBpbnRlbF9jcnRjX2N1cnNvcl9tb3ZlLAorCS5nYW1tYV9zZXQgPSBpbnRlbF9jcnRjX2dhbW1hX3NldCwKKwkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gaW50ZWxfY3J0Y19kZXN0cm95LAorfTsKKworCitzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCit7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CisJaW50IGk7CisKKwlpbnRlbF9jcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX2NydGMpICsgKElOVEVMRkJfQ09OTl9MSU1JVCAqIHNpemVvZihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKSksIEdGUF9LRVJORUwpOworCWlmIChpbnRlbF9jcnRjID09IE5VTEwpCisJCXJldHVybjsKKworCWRybV9jcnRjX2luaXQoZGV2LCAmaW50ZWxfY3J0Yy0+YmFzZSwgJmludGVsX2NydGNfZnVuY3MpOworCisJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZSgmaW50ZWxfY3J0Yy0+YmFzZSwgMjU2KTsKKwlpbnRlbF9jcnRjLT5waXBlID0gcGlwZTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaW50ZWxfY3J0Yy0+bHV0X3JbaV0gPSBpOworCQlpbnRlbF9jcnRjLT5sdXRfZ1tpXSA9IGk7CisJCWludGVsX2NydGMtPmx1dF9iW2ldID0gaTsKKwl9CisKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYWRkciA9IDA7CisJaW50ZWxfY3J0Yy0+ZHBtc19tb2RlID0gRFJNX01PREVfRFBNU19PRkY7CisJZHJtX2NydGNfaGVscGVyX2FkZCgmaW50ZWxfY3J0Yy0+YmFzZSwgJmludGVsX2hlbHBlcl9mdW5jcyk7CisKKwlpbnRlbF9jcnRjLT5tb2RlX3NldC5jcnRjID0gJmludGVsX2NydGMtPmJhc2U7CisJaW50ZWxfY3J0Yy0+bW9kZV9zZXQuY29ubmVjdG9ycyA9IChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqKikoaW50ZWxfY3J0YyArIDEpOworCWludGVsX2NydGMtPm1vZGVfc2V0Lm51bV9jb25uZWN0b3JzID0gMDsKKworCWlmIChpOTE1X2ZicGVyY3J0YykgeworCisKKworCX0KK30KKworc3RydWN0IGRybV9jcnRjICppbnRlbF9nZXRfY3J0Y19mcm9tX3BpcGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwkJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gcGlwZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gY3J0YzsKK30KKworc3RhdGljIGludCBpbnRlbF9jb25uZWN0b3JfY2xvbmVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB0eXBlX21hc2spCit7CisJaW50IGluZGV4X21hc2sgPSAwOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IGVudHJ5ID0gMDsKKworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJCWlmICh0eXBlX21hc2sgJiAoMSA8PCBpbnRlbF9vdXRwdXQtPnR5cGUpKQorCQkJaW5kZXhfbWFzayB8PSAoMSA8PCBlbnRyeSk7CisJCWVudHJ5Kys7CisJfQorCXJldHVybiBpbmRleF9tYXNrOworfQorCisKK3N0YXRpYyB2b2lkIGludGVsX3NldHVwX291dHB1dHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJaW50ZWxfY3J0X2luaXQoZGV2KTsKKworCS8qIFNldCB1cCBpbnRlZ3JhdGVkIExWRFMgKi8KKwlpZiAoSVNfTU9CSUxFKGRldikgJiYgIUlTX0k4MzAoZGV2KSkKKwkJaW50ZWxfbHZkc19pbml0KGRldik7CisKKwlpZiAoSVNfSTlYWChkZXYpKSB7CisJCWludGVsX3Nkdm9faW5pdChkZXYsIFNEVk9CKTsKKwkJaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0MpOworCX0gZWxzZQorCQlpbnRlbF9kdm9faW5pdChkZXYpOworCisJaWYgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTkxNUcoZGV2KSkKKwkJaW50ZWxfdHZfaW5pdChkZXYpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW50ZWxfb3V0cHV0LT5lbmM7CisJCWludCBjcnRjX21hc2sgPSAwLCBjbG9uZV9tYXNrID0gMDsKKworCQkvKiB2YWxpZCBjcnRjcyAqLworCQlzd2l0Y2goaW50ZWxfb3V0cHV0LT50eXBlKSB7CisJCWNhc2UgSU5URUxfT1VUUFVUX0RWTzoKKwkJY2FzZSBJTlRFTF9PVVRQVVRfU0RWTzoKKwkJCWNydGNfbWFzayA9ICgoMSA8PCAwKXwKKwkJCQkgICAgICgxIDw8IDEpKTsKKwkJCWNsb25lX21hc2sgPSAoKDEgPDwgSU5URUxfT1VUUFVUX0FOQUxPRykgfAorCQkJCSAgICAgICgxIDw8IElOVEVMX09VVFBVVF9EVk8pIHwKKwkJCQkgICAgICAoMSA8PCBJTlRFTF9PVVRQVVRfU0RWTykpOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX0FOQUxPRzoKKwkJCWNydGNfbWFzayA9ICgoMSA8PCAwKXwKKwkJCQkgICAgICgxIDw8IDEpKTsKKwkJCWNsb25lX21hc2sgPSAoKDEgPDwgSU5URUxfT1VUUFVUX0FOQUxPRykgfAorCQkJCSAgICAgICgxIDw8IElOVEVMX09VVFBVVF9EVk8pIHwKKwkJCQkgICAgICAoMSA8PCBJTlRFTF9PVVRQVVRfU0RWTykpOworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CisJCQljcnRjX21hc2sgPSAoMSA8PCAxKTsKKwkJCWNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9PVVRQVVRfTFZEUyk7CisJCQlicmVhazsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfVFZPVVQ6CisJCQljcnRjX21hc2sgPSAoKDEgPDwgMCkgfAorCQkJCSAgICAgKDEgPDwgMSkpOworCQkJY2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX09VVFBVVF9UVk9VVCk7CisJCQlicmVhazsKKwkJfQorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGNydGNfbWFzazsKKwkJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gaW50ZWxfY29ubmVjdG9yX2Nsb25lcyhkZXYsIGNsb25lX21hc2spOworCX0KK30KKworc3RhdGljIHZvaWQgaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQoreworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGZiLT5kZXY7CisKKwlpZiAoZmItPmZiZGV2KQorCQlpbnRlbGZiX3JlbW92ZShkZXYsIGZiKTsKKworCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoaW50ZWxfZmItPm9iaik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlrZnJlZShpbnRlbF9mYik7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJCQl1bnNpZ25lZCBpbnQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqZWN0ID0gaW50ZWxfZmItPm9iajsKKworCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBvYmplY3QsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIGludGVsX2ZiX2Z1bmNzID0geworCS5kZXN0cm95ID0gaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95LAorCS5jcmVhdGVfaGFuZGxlID0gaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlLAorfTsKKworaW50IGludGVsX2ZyYW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCwKKwkJCSAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqKmZiLAorCQkJICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCWludCByZXQ7CisKKwlpbnRlbF9mYiA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlbF9mYiksIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfZmIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmaW50ZWxfZmItPmJhc2UsICZpbnRlbF9mYl9mdW5jcyk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZyYW1lYnVmZmVyIGluaXQgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRybV9oZWxwZXJfbW9kZV9maWxsX2ZiX3N0cnVjdCgmaW50ZWxfZmItPmJhc2UsIG1vZGVfY21kKTsKKworCWludGVsX2ZiLT5vYmogPSBvYmo7CisKKwkqZmIgPSAmaW50ZWxfZmItPmJhc2U7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqCitpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxwLAorCQkJICAgICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCit7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJaW50IHJldDsKKworCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbHAsIG1vZGVfY21kLT5oYW5kbGUpOworCWlmICghb2JqKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGludGVsX2ZyYW1lYnVmZmVyX2NyZWF0ZShkZXYsIG1vZGVfY21kLCAmZmIsIG9iaik7CisJaWYgKHJldCkgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZmI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIGludGVsX21vZGVfZnVuY3MgPSB7CisJLmZiX2NyZWF0ZSA9IGludGVsX3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlLAorCS5mYl9jaGFuZ2VkID0gaW50ZWxmYl9wcm9iZSwKK307CisKK3ZvaWQgaW50ZWxfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IG51bV9waXBlOworCWludCBpOworCisJZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKKworCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOworCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICh2b2lkICopJmludGVsX21vZGVfZnVuY3M7CisKKwlpZiAoSVNfSTk2NUcoZGV2KSkgeworCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDgxOTI7CisJCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDgxOTI7CisJfSBlbHNlIHsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSAyMDQ4OworCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSAyMDQ4OworCX0KKworCS8qIHNldCBtZW1vcnkgYmFzZSAqLworCWlmIChJU19JOVhYKGRldikpCisJCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDIpOworCWVsc2UKKwkJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CisKKwlpZiAoSVNfTU9CSUxFKGRldikgfHwgSVNfSTlYWChkZXYpKQorCQludW1fcGlwZSA9IDI7CisJZWxzZQorCQludW1fcGlwZSA9IDE7CisJRFJNX0RFQlVHKCIlZCBkaXNwbGF5IHBpcGUlcyBhdmFpbGFibGUuXG4iLAorCQkgIG51bV9waXBlLCBudW1fcGlwZSA+IDEgPyAicyIgOiAiIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BpcGU7IGkrKykgeworCQlpbnRlbF9jcnRjX2luaXQoZGV2LCBpKTsKKwl9CisKKwlpbnRlbF9zZXR1cF9vdXRwdXRzKGRldik7Cit9CisKK3ZvaWQgaW50ZWxfbW9kZXNldF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKK30KKworCisvKiBjdXJyZW50IGludGVsIGRyaXZlciBkb2Vzbid0IHRha2UgYWR2YW50YWdlIG9mIGVuY29kZXJzCisgICBhbHdheXMgZ2l2ZSBiYWNrIHRoZSBlbmNvZGVyIGZvciB0aGUgY29ubmVjdG9yCisqLworc3RydWN0IGRybV9lbmNvZGVyICppbnRlbF9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCXJldHVybiAmaW50ZWxfb3V0cHV0LT5lbmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2VkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX19JTlRFTF9EUlZfSF9fCisjZGVmaW5lIF9fSU5URUxfRFJWX0hfXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSAiZHJtX2NydGMuaCIKKworI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorLyoKKyAqIERpc3BsYXkgcmVsYXRlZCBzdHVmZgorICovCisKKy8qIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGFuIEl4eHggRFZPICovCisvKiBUaGUgaTgzMC0+aTg2NSB1c2UgbXVsdGlwbGUgRFZPcyB3aXRoIG11bHRpcGxlIGkyY3MgKi8KKy8qIHRoZSBpOTE1LCBpOTQ1IGhhdmUgYSBzaW5nbGUgc0RWTyBpMmMgYnVzIC0gd2hpY2ggaXMgZGlmZmVyZW50ICovCisjZGVmaW5lIE1BWF9PVVRQVVRTIDYKKy8qIG1heGltdW0gY29ubmVjdG9ycyBwZXIgY3J0Y3MgaW4gdGhlIG1vZGUgc2V0ICovCisjZGVmaW5lIElOVEVMRkJfQ09OTl9MSU1JVCA0CisKKyNkZWZpbmUgSU5URUxfSTJDX0JVU19EVk8gMQorI2RlZmluZSBJTlRFTF9JMkNfQlVTX1NEVk8gMgorCisvKiB0aGVzZSBhcmUgb3V0cHV0cyBmcm9tIHRoZSBjaGlwIC0gaW50ZWdyYXRlZCBvbmx5CisgICBleHRlcm5hbCBjaGlwcyBhcmUgdmlhIERWTyBvciBTRFZPIG91dHB1dCAqLworI2RlZmluZSBJTlRFTF9PVVRQVVRfVU5VU0VEIDAKKyNkZWZpbmUgSU5URUxfT1VUUFVUX0FOQUxPRyAxCisjZGVmaW5lIElOVEVMX09VVFBVVF9EVk8gMgorI2RlZmluZSBJTlRFTF9PVVRQVVRfU0RWTyAzCisjZGVmaW5lIElOVEVMX09VVFBVVF9MVkRTIDQKKyNkZWZpbmUgSU5URUxfT1VUUFVUX1RWT1VUIDUKKworI2RlZmluZSBJTlRFTF9EVk9fQ0hJUF9OT05FIDAKKyNkZWZpbmUgSU5URUxfRFZPX0NISVBfTFZEUyAxCisjZGVmaW5lIElOVEVMX0RWT19DSElQX1RNRFMgMgorI2RlZmluZSBJTlRFTF9EVk9fQ0hJUF9UVk9VVCA0CisKK3N0cnVjdCBpbnRlbF9pMmNfY2hhbiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXY7IC8qIGZvciBnZXR0aW5nIGF0IGRldi4gcHJpdmF0ZSAobW1pbyBldGMuKSAqLworCXUzMiByZWc7IC8qIEdQSU8gcmVnICovCisJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGFsZ287CisgICAgICAgIHU4IHNsYXZlX2FkZHI7Cit9OworCitzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgeworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgYmFzZTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKK307CisKKworc3RydWN0IGludGVsX291dHB1dCB7CisJc3RydWN0IGRybV9jb25uZWN0b3IgYmFzZTsKKworCXN0cnVjdCBkcm1fZW5jb2RlciBlbmM7CisJaW50IHR5cGU7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNfYnVzOyAvKiBmb3IgY29udHJvbCBmdW5jdGlvbnMgKi8KKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmRkY19idXM7IC8qIGZvciBEREMgb25seSBzdHVmZiAqLworCWJvb2wgbG9hZF9kZXRlY3RfdGVtcDsKKwl2b2lkICpkZXZfcHJpdjsKK307CisKK3N0cnVjdCBpbnRlbF9jcnRjIHsKKwlzdHJ1Y3QgZHJtX2NydGMgYmFzZTsKKwlpbnQgcGlwZTsKKwlpbnQgcGxhbmU7CisJdWludDMyX3QgY3Vyc29yX2FkZHI7CisJdTggbHV0X3JbMjU2XSwgbHV0X2dbMjU2XSwgbHV0X2JbMjU2XTsKKwlpbnQgZHBtc19tb2RlOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqZmJkZXZfZmI7CisJLyogYSBtb2RlX3NldCBmb3IgZmJkZXYgdXNlcnMgb24gdGhpcyBjcnRjICovCisJc3RydWN0IGRybV9tb2RlX3NldCBtb2RlX3NldDsKK307CisKKyNkZWZpbmUgdG9faW50ZWxfY3J0Yyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGludGVsX2NydGMsIGJhc2UpCisjZGVmaW5lIHRvX2ludGVsX291dHB1dCh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGludGVsX291dHB1dCwgYmFzZSkKKyNkZWZpbmUgZW5jX3RvX2ludGVsX291dHB1dCh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGludGVsX291dHB1dCwgZW5jKQorI2RlZmluZSB0b19pbnRlbF9mcmFtZWJ1ZmZlcih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyLCBiYXNlKQorCitzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmludGVsX2kyY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgdTMyIHJlZywKKwkJCQkJY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGludGVsX2kyY19kZXN0cm95KHN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqY2hhbik7CitpbnQgaW50ZWxfZGRjX2dldF9tb2RlcyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpOworZXh0ZXJuIGJvb2wgaW50ZWxfZGRjX3Byb2JlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCk7CisKK2V4dGVybiB2b2lkIGludGVsX2NydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfc2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfZGV2aWNlKTsKK2V4dGVybiB2b2lkIGludGVsX2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfdHZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX2x2ZHNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9wcmVwYXJlIChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CisKK2V4dGVybiBzdHJ1Y3QgZHJtX2VuY29kZXIgKmludGVsX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKworZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICppbnRlbF9jcnRjX21vZGVfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgICAgc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK2V4dGVybiB2b2lkIGludGVsX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgZHJtX2NydGMgKmludGVsX2dldF9jcnRjX2Zyb21fcGlwZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSk7CitleHRlcm4gc3RydWN0IGRybV9jcnRjICppbnRlbF9nZXRfbG9hZF9kZXRlY3RfcGlwZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkJCSAgIGludCAqZHBtc19tb2RlKTsKK2V4dGVybiB2b2lkIGludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3RfcGlwZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCSAgIGludCBkcG1zX21vZGUpOworCitleHRlcm4gc3RydWN0IGRybV9jb25uZWN0b3IqIGludGVsX3Nkdm9fZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc2R2b0IpOworZXh0ZXJuIGludCBpbnRlbF9zZHZvX3N1cHBvcnRzX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gdm9pZCBpbnRlbF9zZHZvX3NldF9ob3RwbHVnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBlbmFibGUpOworZXh0ZXJuIGludCBpbnRlbGZiX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBpbnRlbGZiX3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7CitleHRlcm4gaW50IGludGVsZmJfcmVzaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitleHRlcm4gdm9pZCBpbnRlbGZiX3Jlc3RvcmUodm9pZCk7CitleHRlcm4gdm9pZCBpbnRlbF9jcnRjX2ZiX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiByZWQsIHUxNiBncmVlbiwKKwkJCQkgICAgdTE2IGJsdWUsIGludCByZWdubyk7CisKK2V4dGVybiBpbnQgaW50ZWxfZnJhbWVidWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoqZmIsCisJCQkJICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKKyNlbmRpZiAvKiBfX0lOVEVMX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4ZDZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDYgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKglFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICovCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImR2by5oIgorCisjZGVmaW5lIFNJTDE2NF9BRERSCTB4MzgKKyNkZWZpbmUgQ0g3eHh4X0FERFIJMHg3NgorI2RlZmluZSBURlA0MTBfQUREUgkweDM4CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSBpbnRlbF9kdm9fZGV2aWNlc1tdID0geworCXsKKwkJLnR5cGUgPSBJTlRFTF9EVk9fQ0hJUF9UTURTLAorCQkubmFtZSA9ICJzaWwxNjQiLAorCQkuZHZvX3JlZyA9IERWT0MsCisJCS5zbGF2ZV9hZGRyID0gU0lMMTY0X0FERFIsCisJCS5kZXZfb3BzID0gJnNpbDE2NF9vcHMsCisJfSwKKwl7CisJCS50eXBlID0gSU5URUxfRFZPX0NISVBfVE1EUywKKwkJLm5hbWUgPSAiY2g3eHh4IiwKKwkJLmR2b19yZWcgPSBEVk9DLAorCQkuc2xhdmVfYWRkciA9IENIN3h4eF9BRERSLAorCQkuZGV2X29wcyA9ICZjaDd4eHhfb3BzLAorCX0sCisJeworCQkudHlwZSA9IElOVEVMX0RWT19DSElQX0xWRFMsCisJCS5uYW1lID0gIml2Y2giLAorCQkuZHZvX3JlZyA9IERWT0EsCisJCS5zbGF2ZV9hZGRyID0gMHgwMiwgLyogTWlnaHQgYWxzbyBiZSAweDQ0LCAweDg0LCAweGM0ICovCisJCS5kZXZfb3BzID0gJml2Y2hfb3BzLAorCX0sCisJeworCQkudHlwZSA9IElOVEVMX0RWT19DSElQX1RNRFMsCisJCS5uYW1lID0gInRmcDQxMCIsCisJCS5kdm9fcmVnID0gRFZPQywKKwkJLnNsYXZlX2FkZHIgPSBURlA0MTBfQUREUiwKKwkJLmRldl9vcHMgPSAmdGZwNDEwX29wcywKKwl9LAorCXsKKwkJLnR5cGUgPSBJTlRFTF9EVk9fQ0hJUF9MVkRTLAorCQkubmFtZSA9ICJjaDcwMTciLAorCQkuZHZvX3JlZyA9IERWT0MsCisJCS5zbGF2ZV9hZGRyID0gMHg3NSwKKwkJLmdwaW8gPSBHUElPRSwKKwkJLmRldl9vcHMgPSAmY2g3MDE3X29wcywKKwl9Cit9OworCitzdGF0aWMgdm9pZCBpbnRlbF9kdm9fZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gZW5jX3RvX2ludGVsX291dHB1dChlbmNvZGVyKTsKKwlzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgZHZvX3JlZyA9IGR2by0+ZHZvX3JlZzsKKwl1MzIgdGVtcCA9IEk5MTVfUkVBRChkdm9fcmVnKTsKKworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJSTkxNV9XUklURShkdm9fcmVnLCB0ZW1wIHwgRFZPX0VOQUJMRSk7CisJCUk5MTVfUkVBRChkdm9fcmVnKTsKKwkJZHZvLT5kZXZfb3BzLT5kcG1zKGR2bywgbW9kZSk7CisJfSBlbHNlIHsKKwkJZHZvLT5kZXZfb3BzLT5kcG1zKGR2bywgbW9kZSk7CisJCUk5MTVfV1JJVEUoZHZvX3JlZywgdGVtcCAmIH5EVk9fRU5BQkxFKTsKKwkJSTkxNV9SRUFEKGR2b19yZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgaW50ZWxfZHZvX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwkvKiBFYWNoIG91dHB1dCBzaG91bGQgcHJvYmFibHkganVzdCBzYXZlIHRoZSByZWdpc3RlcnMgaXQgdG91Y2hlcywKKwkgKiBidXQgZm9yIG5vdywgdXNlIG1vcmUgb3ZlcmtpbGwuCisJICovCisJZGV2X3ByaXYtPnNhdmVEVk9BID0gSTkxNV9SRUFEKERWT0EpOworCWRldl9wcml2LT5zYXZlRFZPQiA9IEk5MTVfUkVBRChEVk9CKTsKKwlkZXZfcHJpdi0+c2F2ZURWT0MgPSBJOTE1X1JFQUQoRFZPQyk7CisKKwlkdm8tPmRldl9vcHMtPnNhdmUoZHZvKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfZHZvX3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwlkdm8tPmRldl9vcHMtPnJlc3RvcmUoZHZvKTsKKworCUk5MTVfV1JJVEUoRFZPQSwgZGV2X3ByaXYtPnNhdmVEVk9BKTsKKwlJOTE1X1dSSVRFKERWT0IsIGRldl9wcml2LT5zYXZlRFZPQik7CisJSTkxNV9XUklURShEVk9DLCBkZXZfcHJpdi0+c2F2ZURWT0MpOworfQorCitzdGF0aWMgaW50IGludGVsX2R2b19tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCXJldHVybiBNT0RFX05PX0RCTEVTQ0FOOworCisJLyogWFhYOiBWYWxpZGF0ZSBjbG9jayByYW5nZSAqLworCisJaWYgKGR2by0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQlpZiAobW9kZS0+aGRpc3BsYXkgPiBkdm8tPnBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5KQorCQkJcmV0dXJuIE1PREVfUEFORUw7CisJCWlmIChtb2RlLT52ZGlzcGxheSA+IGR2by0+cGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkpCisJCQlyZXR1cm4gTU9ERV9QQU5FTDsKKwl9CisKKwlyZXR1cm4gZHZvLT5kZXZfb3BzLT5tb2RlX3ZhbGlkKGR2bywgbW9kZSk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX2R2b19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwkvKiBJZiB3ZSBoYXZlIHRpbWluZ3MgZnJvbSB0aGUgQklPUyBmb3IgdGhlIHBhbmVsLCBwdXQgdGhlbSBpbgorCSAqIHRvIHRoZSBhZGp1c3RlZCBtb2RlLiAgVGhlIENSVEMgd2lsbCBiZSBzZXQgdXAgZm9yIHRoaXMgbW9kZSwKKwkgKiB3aXRoIHRoZSBwYW5lbCBzY2FsaW5nIHNldCB1cCB0byBzb3VyY2UgZnJvbSB0aGUgSC9WRGlzcGxheQorCSAqIG9mIHRoZSBvcmlnaW5hbCBtb2RlLgorCSAqLworCWlmIChkdm8tPnBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCkgeworI2RlZmluZSBDKHgpIGFkanVzdGVkX21vZGUtPnggPSBkdm8tPnBhbmVsX2ZpeGVkX21vZGUtPngKKwkJQyhoZGlzcGxheSk7CisJCUMoaHN5bmNfc3RhcnQpOworCQlDKGhzeW5jX2VuZCk7CisJCUMoaHRvdGFsKTsKKwkJQyh2ZGlzcGxheSk7CisJCUModnN5bmNfc3RhcnQpOworCQlDKHZzeW5jX2VuZCk7CisJCUModnRvdGFsKTsKKwkJQyhjbG9jayk7CisJCWRybV9tb2RlX3NldF9jcnRjaW5mbyhhZGp1c3RlZF9tb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKKyN1bmRlZiBDCisJfQorCisJaWYgKGR2by0+ZGV2X29wcy0+bW9kZV9maXh1cCkKKwkJcmV0dXJuIGR2by0+ZGV2X29wcy0+bW9kZV9maXh1cChkdm8sIG1vZGUsIGFkanVzdGVkX21vZGUpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2R2b19tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSBlbmNfdG9faW50ZWxfb3V0cHV0KGVuY29kZXIpOworCXN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8gPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgZHZvX3ZhbDsKKwl1MzIgZHZvX3JlZyA9IGR2by0+ZHZvX3JlZywgZHZvX3NyY2RpbV9yZWc7CisJaW50IGRwbGxfcmVnID0gKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExMX0I7CisKKwlzd2l0Y2ggKGR2b19yZWcpIHsKKwljYXNlIERWT0E6CisJZGVmYXVsdDoKKwkJZHZvX3NyY2RpbV9yZWcgPSBEVk9BX1NSQ0RJTTsKKwkJYnJlYWs7CisJY2FzZSBEVk9COgorCQlkdm9fc3JjZGltX3JlZyA9IERWT0JfU1JDRElNOworCQlicmVhazsKKwljYXNlIERWT0M6CisJCWR2b19zcmNkaW1fcmVnID0gRFZPQ19TUkNESU07CisJCWJyZWFrOworCX0KKworCWR2by0+ZGV2X29wcy0+bW9kZV9zZXQoZHZvLCBtb2RlLCBhZGp1c3RlZF9tb2RlKTsKKworCS8qIFNhdmUgdGhlIGRhdGEgb3JkZXIsIHNpbmNlIEkgZG9uJ3Qga25vdyB3aGF0IGl0IHNob3VsZCBiZSBzZXQgdG8uICovCisJZHZvX3ZhbCA9IEk5MTVfUkVBRChkdm9fcmVnKSAmCisJCSAgKERWT19QUkVTRVJWRV9NQVNLIHwgRFZPX0RBVEFfT1JERVJfR0JSRyk7CisJZHZvX3ZhbCB8PSBEVk9fREFUQV9PUkRFUl9GUCB8IERWT19CT1JERVJfRU5BQkxFIHwKKwkJICAgRFZPX0JMQU5LX0FDVElWRV9ISUdIOworCisJaWYgKHBpcGUgPT0gMSkKKwkJZHZvX3ZhbCB8PSBEVk9fUElQRV9CX1NFTEVDVDsKKwlkdm9fdmFsIHw9IERWT19QSVBFX1NUQUxMOworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQlkdm9fdmFsIHw9IERWT19IU1lOQ19BQ1RJVkVfSElHSDsKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJZHZvX3ZhbCB8PSBEVk9fVlNZTkNfQUNUSVZFX0hJR0g7CisKKwlJOTE1X1dSSVRFKGRwbGxfcmVnLCBJOTE1X1JFQUQoZHBsbF9yZWcpIHwgRFBMTF9EVk9fSElHSF9TUEVFRCk7CisKKwkvKkk5MTVfV1JJVEUoRFZPQl9TUkNESU0sCisJICAoYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgPDwgRFZPX1NSQ0RJTV9IT1JJWk9OVEFMX1NISUZUKSB8CisJICAoYWRqdXN0ZWRfbW9kZS0+VkRpc3BsYXkgPDwgRFZPX1NSQ0RJTV9WRVJUSUNBTF9TSElGVCkpOyovCisJSTkxNV9XUklURShkdm9fc3JjZGltX3JlZywKKwkJICAgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IDw8IERWT19TUkNESU1fSE9SSVpPTlRBTF9TSElGVCkgfAorCQkgICAoYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgPDwgRFZPX1NSQ0RJTV9WRVJUSUNBTF9TSElGVCkpOworCS8qSTkxNV9XUklURShEVk9CLCBkdm9fdmFsKTsqLworCUk5MTVfV1JJVEUoZHZvX3JlZywgZHZvX3ZhbCk7Cit9CisKKy8qKgorICogRGV0ZWN0IHRoZSBvdXRwdXQgY29ubmVjdGlvbiBvbiBvdXIgRFZPIGRldmljZS4KKyAqCisgKiBVbmltcGxlbWVudGVkLgorICovCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbnRlbF9kdm9fZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwlyZXR1cm4gZHZvLT5kZXZfb3BzLT5kZXRlY3QoZHZvKTsKK30KKworc3RhdGljIGludCBpbnRlbF9kdm9fZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwkvKiBXZSBzaG91bGQgcHJvYmFibHkgaGF2ZSBhbiBpMmMgZHJpdmVyIGdldF9tb2RlcyBmdW5jdGlvbiBmb3IgdGhvc2UKKwkgKiBkZXZpY2VzIHdoaWNoIHdpbGwgaGF2ZSBhIGZpeGVkIHNldCBvZiBtb2RlcyBkZXRlcm1pbmVkIGJ5IHRoZSBjaGlwCisJICogKFRWLW91dCwgZm9yIGV4YW1wbGUpLCBidXQgZm9yIG5vdyB3aXRoIGp1c3QgVE1EUyBhbmQgTFZEUywKKwkgKiB0aGF0J3Mgbm90IHRoZSBjYXNlLgorCSAqLworCWludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzKSkKKwkJcmV0dXJuIDE7CisKKworCWlmIChkdm8tPnBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShjb25uZWN0b3ItPmRldiwgZHZvLT5wYW5lbF9maXhlZF9tb2RlKTsKKwkJaWYgKG1vZGUpIHsKKwkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9kdm9fZGVzdHJveSAoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKworCWlmIChkdm8pIHsKKwkJaWYgKGR2by0+ZGV2X29wcy0+ZGVzdHJveSkKKwkJCWR2by0+ZGV2X29wcy0+ZGVzdHJveShkdm8pOworCQlpZiAoZHZvLT5wYW5lbF9maXhlZF9tb2RlKQorCQkJa2ZyZWUoZHZvLT5wYW5lbF9maXhlZF9tb2RlKTsKKwkJLyogbm8gbmVlZCwgaW4gaTgzMF9kdm9pY2VzW10gbm93ICovCisJCS8va2ZyZWUoZHZvKTsKKwl9CisJaWYgKGludGVsX291dHB1dC0+aTJjX2J1cykKKwkJaW50ZWxfaTJjX2Rlc3Ryb3koaW50ZWxfb3V0cHV0LT5pMmNfYnVzKTsKKwlpZiAoaW50ZWxfb3V0cHV0LT5kZGNfYnVzKQorCQlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmRkY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoaW50ZWxfb3V0cHV0KTsKK30KKworI2lmZGVmIFJBTkRSX0dFVF9DUlRDX0lOVEVSRkFDRQorc3RhdGljIHN0cnVjdCBkcm1fY3J0YyAqaW50ZWxfZHZvX2dldF9jcnRjKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2byA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJaW50IHBpcGUgPSAhIShJOTE1X1JFQUQoZHZvLT5kdm9fcmVnKSAmIFNEVk9fUElQRV9CX1NFTEVDVCk7CisKKwlyZXR1cm4gaW50ZWxfcGlwZV90b19jcnRjKHBTY3JuLCBwaXBlKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbnRlbF9kdm9faGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gaW50ZWxfZHZvX2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9kdm9fbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IGludGVsX2VuY29kZXJfcHJlcGFyZSwKKwkubW9kZV9zZXQgPSBpbnRlbF9kdm9fbW9kZV9zZXQsCisJLmNvbW1pdCA9IGludGVsX2VuY29kZXJfY29tbWl0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGludGVsX2R2b19jb25uZWN0b3JfZnVuY3MgPSB7CisJLnNhdmUgPSBpbnRlbF9kdm9fc2F2ZSwKKwkucmVzdG9yZSA9IGludGVsX2R2b19yZXN0b3JlLAorCS5kZXRlY3QgPSBpbnRlbF9kdm9fZGV0ZWN0LAorCS5kZXN0cm95ID0gaW50ZWxfZHZvX2Rlc3Ryb3ksCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGludGVsX2R2b19jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0geworCS5tb2RlX3ZhbGlkID0gaW50ZWxfZHZvX21vZGVfdmFsaWQsCisJLmdldF9tb2RlcyA9IGludGVsX2R2b19nZXRfbW9kZXMsCisJLmJlc3RfZW5jb2RlciA9IGludGVsX2Jlc3RfZW5jb2RlciwKK307CisKK3N0YXRpYyB2b2lkIGludGVsX2R2b19lbmNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbnRlbF9kdm9fZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gaW50ZWxfZHZvX2VuY19kZXN0cm95LAorfTsKKworCisvKioKKyAqIEF0dGVtcHRzIHRvIGdldCBhIGZpeGVkIHBhbmVsIHRpbWluZyBmb3IgTFZEUyAoY3VycmVudGx5IG9ubHkgdGhlIGk4MzApLgorICoKKyAqIE90aGVyIGNoaXBzIHdpdGggRFZPIExWRFMgd2lsbCBuZWVkIHRvIGV4dGVuZCB0aGlzIHRvIGRlYWwgd2l0aCB0aGUgTFZEUworICogY2hpcCBiZWluZyBvbiBEVk9CL0MgYW5kIGhhdmluZyBtdWx0aXBsZSBwaXBlcy4KKyAqLworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoKK2ludGVsX2R2b19nZXRfY3VycmVudF9tb2RlIChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm8gPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCXVpbnQzMl90IGR2b19yZWcgPSBkdm8tPmR2b19yZWc7CisJdWludDMyX3QgZHZvX3ZhbCA9IEk5MTVfUkVBRChkdm9fcmVnKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IE5VTEw7CisKKwkvKiBJZiB0aGUgRFZPIHBvcnQgaXMgYWN0aXZlLCB0aGF0J2xsIGJlIHRoZSBMVkRTLCBzbyB3ZSBjYW4gcHVsbCBvdXQKKwkgKiBpdHMgdGltaW5ncyB0byBnZXQgaG93IHRoZSBCSU9TIHNldCB1cCB0aGUgcGFuZWwuCisJICovCisJaWYgKGR2b192YWwgJiBEVk9fRU5BQkxFKSB7CisJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwkJaW50IHBpcGUgPSAoZHZvX3ZhbCAmIERWT19QSVBFX0JfU0VMRUNUKSA/IDEgOiAwOworCisJCWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mcm9tX3BpcGUoZGV2LCBwaXBlKTsKKwkJaWYgKGNydGMpIHsKKwkJCW1vZGUgPSBpbnRlbF9jcnRjX21vZGVfZ2V0KGRldiwgY3J0Yyk7CisKKwkJCWlmIChtb2RlKSB7CisJCQkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJCQlpZiAoZHZvX3ZhbCAmIERWT19IU1lOQ19BQ1RJVkVfSElHSCkKKwkJCQkJbW9kZS0+ZmxhZ3MgfD0gRFJNX01PREVfRkxBR19QSFNZTkM7CisJCQkJaWYgKGR2b192YWwgJiBEVk9fVlNZTkNfQUNUSVZFX0hJR0gpCisJCQkJCW1vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfUFZTWU5DOworCQkJfQorCQl9CisJfQorCXJldHVybiBtb2RlOworfQorCit2b2lkIGludGVsX2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OworCXN0cnVjdCBpbnRlbF9kdm9fZGV2aWNlICpkdm87CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBpOworCWludCBncGlvX2luaXRlZCA9IDA7CisJaW50IGVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfTk9ORTsKKwlpbnRlbF9vdXRwdXQgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IGludGVsX291dHB1dCksIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfb3V0cHV0KQorCQlyZXR1cm47CisKKwkvKiBTZXQgdXAgdGhlIEREQyBidXMgKi8KKwlpbnRlbF9vdXRwdXQtPmRkY19idXMgPSBpbnRlbF9pMmNfY3JlYXRlKGRldiwgR1BJT0QsICJEVk9ERENfRCIpOworCWlmICghaW50ZWxfb3V0cHV0LT5kZGNfYnVzKQorCQlnb3RvIGZyZWVfaW50ZWw7CisKKwkvKiBOb3csIHRyeSB0byBmaW5kIGEgY29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGludGVsX2R2b19kZXZpY2VzKTsgaSsrKSB7CisJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOworCQlpbnQgZ3BpbzsKKworCQlkdm8gPSAmaW50ZWxfZHZvX2RldmljZXNbaV07CisKKwkJLyogQWxsb3cgdGhlIEkyQyBkcml2ZXIgaW5mbyB0byBzcGVjaWZ5IHRoZSBHUElPIHRvIGJlIHVzZWQgaW4KKwkJICogc3BlY2lhbCBjYXNlcywgYnV0IG90aGVyd2lzZSBkZWZhdWx0IHRvIHdoYXQncyBkZWZpbmVkCisJCSAqIGluIHRoZSBzcGVjLgorCQkgKi8KKwkJaWYgKGR2by0+Z3BpbyAhPSAwKQorCQkJZ3BpbyA9IGR2by0+Z3BpbzsKKwkJZWxzZSBpZiAoZHZvLT50eXBlID09IElOVEVMX0RWT19DSElQX0xWRFMpCisJCQlncGlvID0gR1BJT0I7CisJCWVsc2UKKwkJCWdwaW8gPSBHUElPRTsKKworCQkvKiBTZXQgdXAgdGhlIEkyQyBidXMgbmVjZXNzYXJ5IGZvciB0aGUgY2hpcCB3ZSdyZSBwcm9iaW5nLgorCQkgKiBJdCBhcHBlYXJzIHRoYXQgZXZlcnl0aGluZyBpcyBvbiBHUElPRSBleGNlcHQgZm9yIHBhbmVscworCQkgKiBvbiBpODMwIGxhcHRvcHMsIHdoaWNoIGFyZSBvbiBHUElPQiAoRFZPQSkuCisJCSAqLworCQlpZiAoZ3Bpb19pbml0ZWQgIT0gZ3BpbykgeworCQkJaWYgKGkyY2J1cyAhPSBOVUxMKQorCQkJCWludGVsX2kyY19kZXN0cm95KGkyY2J1cyk7CisJCQlpZiAoIShpMmNidXMgPSBpbnRlbF9pMmNfY3JlYXRlKGRldiwgZ3BpbywKKwkJCQlncGlvID09IEdQSU9CID8gIkRWT0kyQ19CIiA6ICJEVk9JMkNfRSIpKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZ3Bpb19pbml0ZWQgPSBncGlvOworCQl9CisKKwkJaWYgKGR2by0+ZGV2X29wcyE9IE5VTEwpCisJCQlyZXQgPSBkdm8tPmRldl9vcHMtPmluaXQoZHZvLCBpMmNidXMpOworCQllbHNlCisJCQlyZXQgPSBmYWxzZTsKKworCQlpZiAoIXJldCkKKwkJCWNvbnRpbnVlOworCisJCWludGVsX291dHB1dC0+dHlwZSA9IElOVEVMX09VVFBVVF9EVk87CisJCXN3aXRjaCAoZHZvLT50eXBlKSB7CisJCWNhc2UgSU5URUxfRFZPX0NISVBfVE1EUzoKKwkJCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwKKwkJCQkJICAgJmludGVsX2R2b19jb25uZWN0b3JfZnVuY3MsCisJCQkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKTsKKwkJCWVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKKwkJCWJyZWFrOworCQljYXNlIElOVEVMX0RWT19DSElQX0xWRFM6CisJCQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsCisJCQkJCSAgICZpbnRlbF9kdm9fY29ubmVjdG9yX2Z1bmNzLAorCQkJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyk7CisJCQllbmNvZGVyX3R5cGUgPSBEUk1fTU9ERV9FTkNPREVSX0xWRFM7CisJCQlicmVhazsKKwkJfQorCisJCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsCisJCQkJCSAmaW50ZWxfZHZvX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlciA9IFN1YlBpeGVsSG9yaXpvbnRhbFJHQjsKKwkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IGZhbHNlOworCQljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOworCisJCWludGVsX291dHB1dC0+ZGV2X3ByaXYgPSBkdm87CisJCWludGVsX291dHB1dC0+aTJjX2J1cyA9IGkyY2J1czsKKworCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgJmludGVsX291dHB1dC0+ZW5jLAorCQkJCSAmaW50ZWxfZHZvX2VuY19mdW5jcywgZW5jb2Rlcl90eXBlKTsKKwkJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmaW50ZWxfb3V0cHV0LT5lbmMsCisJCQkJICAgICAgICZpbnRlbF9kdm9faGVscGVyX2Z1bmNzKTsKKworCQlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmludGVsX291dHB1dC0+YmFzZSwKKwkJCQkJCSAgJmludGVsX291dHB1dC0+ZW5jKTsKKwkJaWYgKGR2by0+dHlwZSA9PSBJTlRFTF9EVk9fQ0hJUF9MVkRTKSB7CisJCQkvKiBGb3Igb3VyIExWRFMgY2hpcHNldHMsIHdlIHNob3VsZCBob3BlZnVsbHkgYmUgYWJsZQorCQkJICogdG8gZGlnIHRoZSBmaXhlZCBwYW5lbCBtb2RlIG91dCBvZiB0aGUgQklPUyBkYXRhLgorCQkJICogSG93ZXZlciwgaXQncyBpbiBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgQklPUworCQkJICogZGF0YSBvbiBjaGlwc2V0cyB3aXRoIGludGVncmF0ZWQgTFZEUyAoc3RvcmVkIGluIEFJTQorCQkJICogaGVhZGVycywgbGlrZWx5KSwgc28gZm9yIG5vdywganVzdCBnZXQgdGhlIGN1cnJlbnQKKwkJCSAqIG1vZGUgYmVpbmcgb3V0cHV0IHRocm91Z2ggRFZPLgorCQkJICovCisJCQlkdm8tPnBhbmVsX2ZpeGVkX21vZGUgPQorCQkJCWludGVsX2R2b19nZXRfY3VycmVudF9tb2RlKGNvbm5lY3Rvcik7CisJCQlkdm8tPnBhbmVsX3dhbnRzX2RpdGhlciA9IHRydWU7CisJCX0KKworCQlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCQlyZXR1cm47CisJfQorCisJaW50ZWxfaTJjX2Rlc3Ryb3koaW50ZWxfb3V0cHV0LT5kZGNfYnVzKTsKKwkvKiBEaWRuJ3QgZmluZCBhIGNoaXAsIHNvIHRlYXIgZG93bi4gKi8KKwlpZiAoaTJjYnVzICE9IE5VTEwpCisJCWludGVsX2kyY19kZXN0cm95KGkyY2J1cyk7CitmcmVlX2ludGVsOgorCWtmcmVlKGludGVsX291dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQxMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwpAQCAtMCwwICsxLDkyNSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IERhdmlkIEFpcmxpZQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgIERhdmlkIEFpcmxpZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorI2luY2x1ZGUgImludGVsX2Rydi5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworc3RydWN0IGludGVsZmJfcGFyIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpvdXJfbW9kZTsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCWludCBjcnRjX2NvdW50OworCS8qIGNydGMgY3VycmVudGx5IGJvdW5kIHRvIHRoaXMgKi8KKwl1aW50MzJfdCBjcnRjX2lkc1syXTsKK307CisKK3N0YXRpYyBpbnQgaW50ZWxmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJCQl1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCisJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaW50ZWxmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCQlzdHJ1Y3QgZHJtX21vZGVfc2V0ICptb2Rlc2V0ID0gJmludGVsX2NydGMtPm1vZGVfc2V0OworCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IG1vZGVzZXQtPmZiOworCisJCWZvciAoaSA9IDA7IGkgPCBwYXItPmNydGNfY291bnQ7IGkrKykKKwkJCWlmIChjcnRjLT5iYXNlLmlkID09IHBhci0+Y3J0Y19pZHNbaV0pCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gcGFyLT5jcnRjX2NvdW50KQorCQkJY29udGludWU7CisKKworCQlpZiAocmVnbm8gPiAyNTUpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoZmItPmRlcHRoID09IDgpIHsKKwkJCWludGVsX2NydGNfZmJfZ2FtbWFfc2V0KGNydGMsIHJlZCwgZ3JlZW4sIGJsdWUsIHJlZ25vKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHJlZ25vIDwgMTYpIHsKKwkJCXN3aXRjaCAoZmItPmRlcHRoKSB7CisJCQljYXNlIDE1OgorCQkJCWZiLT5wc2V1ZG9fcGFsZXR0ZVtyZWdub10gPSAoKHJlZCAmIDB4ZjgwMCkgPj4gMSkgfAorCQkJCQkoKGdyZWVuICYgMHhmODAwKSA+PiAgNikgfAorCQkJCQkoKGJsdWUgJiAweGY4MDApID4+IDExKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTY6CisJCQkJZmItPnBzZXVkb19wYWxldHRlW3JlZ25vXSA9IChyZWQgJiAweGY4MDApIHwKKwkJCQkJKChncmVlbiAmIDB4ZmMwMCkgPj4gIDUpIHwKKwkJCQkJKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpOworCQkJCWJyZWFrOworCQkJY2FzZSAyNDoKKwkJCWNhc2UgMzI6CisJCQkJZmItPnBzZXVkb19wYWxldHRlW3JlZ25vXSA9ICgocmVkICYgMHhmZjAwKSA8PCA4KSB8CisJCQkJCShncmVlbiAmIDB4ZmYwMCkgfAorCQkJCQkoKGJsdWUgICYgMHhmZjAwKSA+PiA4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbGZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCXN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBpbnRlbGZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSBwYXItPmludGVsX2ZiOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gJmludGVsX2ZiLT5iYXNlOworCWludCBkZXB0aDsKKworCWlmICh2YXItPnBpeGNsb2NrID09IC0xIHx8ICF2YXItPnBpeGNsb2NrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5lZWQgdG8gcmVzaXplIHRoZSBmYiBvYmplY3QgISEhICovCisJaWYgKHZhci0+eHJlcyA+IGZiLT53aWR0aCB8fCB2YXItPnlyZXMgPiBmYi0+aGVpZ2h0KSB7CisJCURSTV9FUlJPUigiUmVxdWVzdGVkIHdpZHRoL2hlaWdodCBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBmYiBvYmplY3QgJWR4JWQgPiAlZHglZFxuIix2YXItPnhyZXMsdmFyLT55cmVzLGZiLT53aWR0aCxmYi0+aGVpZ2h0KTsKKwkJRFJNX0VSUk9SKCJOZWVkIHJlc2l6aW5nIGNvZGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxNjoKKwkJZGVwdGggPSAodmFyLT5ncmVlbi5sZW5ndGggPT0gNikgPyAxNiA6IDE1OworCQlicmVhazsKKwljYXNlIDMyOgorCQlkZXB0aCA9ICh2YXItPnRyYW5zcC5sZW5ndGggPiAwKSA/IDMyIDogMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRlcHRoID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChkZXB0aCkgeworCWNhc2UgODoKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNTsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDE7CisJCXZhci0+dHJhbnNwLm9mZnNldCA9IDE1OworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA2OworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CisJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXZhci0+cmVkLm9mZnNldCA9IDE2OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgd2lsbCBsZXQgZmJjb24gZG8gdGhlIG1vZGUgaW5pdCAqLworLyogRklYTUU6IHRha2UgbW9kZSBjb25maWcgbG9jaz8gKi8KK3N0YXRpYyBpbnQgaW50ZWxmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBpbnRlbGZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CisJaW50IGk7CisKKwlEUk1fREVCVUcoIiVkICVkXG4iLCB2YXItPnhyZXMsIHZhci0+cGl4Y2xvY2spOworCisJaWYgKHZhci0+cGl4Y2xvY2sgIT0gLTEpIHsKKworCQlEUk1fRVJST1IoIlBJWEVMIENMQ09LIFNFVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwkJaW50IHJldDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQkJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcGFyLT5jcnRjX2NvdW50OyBpKyspCisJCQkJaWYgKGNydGMtPmJhc2UuaWQgPT0gcGFyLT5jcnRjX2lkc1tpXSkKKwkJCQkJYnJlYWs7CisKKwkJCWlmIChpID09IHBhci0+Y3J0Y19jb3VudCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGNydGMtPmZiID09IGludGVsX2NydGMtPm1vZGVfc2V0LmZiKSB7CisJCQkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCQkJcmV0ID0gY3J0Yy0+ZnVuY3MtPnNldF9jb25maWcoJmludGVsX2NydGMtPm1vZGVfc2V0KTsKKwkJCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGludGVsZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGludGVsZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQ7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOworCWludCByZXQgPSAwOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBhci0+Y3J0Y19jb3VudDsgaSsrKQorCQkJaWYgKGNydGMtPmJhc2UuaWQgPT0gcGFyLT5jcnRjX2lkc1tpXSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBwYXItPmNydGNfY291bnQpCisJCQljb250aW51ZTsKKworCQlpbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwkJbW9kZXNldCA9ICZpbnRlbF9jcnRjLT5tb2RlX3NldDsKKworCQltb2Rlc2V0LT54ID0gdmFyLT54b2Zmc2V0OworCQltb2Rlc2V0LT55ID0gdmFyLT55b2Zmc2V0OworCisJCWlmIChtb2Rlc2V0LT5udW1fY29ubmVjdG9ycykgeworCQkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCQlyZXQgPSBjcnRjLT5mdW5jcy0+c2V0X2NvbmZpZyhtb2Rlc2V0KTsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCQlpZiAoIXJldCkgeworCQkJCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCQkJCWluZm8tPnZhci55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxmYl9vbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaW50ZWxmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlpbnQgaTsKKworCS8qCisJICogRm9yIGVhY2ggQ1JUQyBpbiB0aGlzIGZiLCBmaW5kIGFsbCBhc3NvY2lhdGVkIGVuY29kZXJzCisJICogYW5kIHR1cm4gdGhlbSBvZmYsIHRoZW4gdHVybiBvZmYgdGhlIENSVEMuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCisJCWZvciAoaSA9IDA7IGkgPCBwYXItPmNydGNfY291bnQ7IGkrKykKKwkJCWlmIChjcnRjLT5iYXNlLmlkID09IHBhci0+Y3J0Y19pZHNbaV0pCisJCQkJYnJlYWs7CisKKwkJY3J0Y19mdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCQkvKiBGb3VuZCBhIENSVEMgb24gdGhpcyBmYiwgbm93IGZpbmQgZW5jb2RlcnMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJCWlmIChlbmNvZGVyLT5jcnRjID09IGNydGMpIHsKKwkJCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzOworCQkJCWVuY29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJCQllbmNvZGVyX2Z1bmNzLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnRlbGZiX29mZihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGRwbXNfbW9kZSkKK3sKKwlzdHJ1Y3QgaW50ZWxmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlpbnQgaTsKKworCS8qCisJICogRm9yIGVhY2ggQ1JUQyBpbiB0aGlzIGZiLCBmaW5kIGFsbCBhc3NvY2lhdGVkIGVuY29kZXJzCisJICogYW5kIHR1cm4gdGhlbSBvZmYsIHRoZW4gdHVybiBvZmYgdGhlIENSVEMuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCisJCWZvciAoaSA9IDA7IGkgPCBwYXItPmNydGNfY291bnQ7IGkrKykKKwkJCWlmIChjcnRjLT5iYXNlLmlkID09IHBhci0+Y3J0Y19pZHNbaV0pCisJCQkJYnJlYWs7CisKKwkJLyogRm91bmQgYSBDUlRDIG9uIHRoaXMgZmIsIG5vdyBmaW5kIGVuY29kZXJzICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSBjcnRjKSB7CisJCQkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jczsKKwkJCQllbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJCQkJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBkcG1zX21vZGUpOworCQkJfQorCQl9CisJCWlmIChkcG1zX21vZGUgPT0gRFJNX01PREVfRFBNU19PRkYpCisJCQljcnRjX2Z1bmNzLT5kcG1zKGNydGMsIGRwbXNfbW9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IGludGVsZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzd2l0Y2ggKGJsYW5rKSB7CisJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgorCQlpbnRlbGZiX29uKGluZm8pOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX05PUk1BTDoKKwkJaW50ZWxmYl9vZmYoaW5mbywgRFJNX01PREVfRFBNU19TVEFOREJZKTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQlpbnRlbGZiX29mZihpbmZvLCBEUk1fTU9ERV9EUE1TX1NUQU5EQlkpOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJCWludGVsZmJfb2ZmKGluZm8sIERSTV9NT0RFX0RQTVNfU1VTUEVORCk7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCQlpbnRlbGZiX29mZihpbmZvLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmYl9vcHMgaW50ZWxmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9IGludGVsZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gaW50ZWxmYl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcgPSBpbnRlbGZiX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAorCS5mYl9wYW5fZGlzcGxheSA9IGludGVsZmJfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rID0gaW50ZWxmYl9ibGFuaywKK307CisKKy8qKgorICogQ3VycmV0bHkgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBvbGQgZnJhbWVidWZmZXIgaXMgcmV1c2VkLgorICoKKyAqIExPQ0tJTkcKKyAqIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgbW9kZSBjb25maWcgbG9jay4KKyAqCisgKi8KK2ludCBpbnRlbGZiX3Jlc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBjcnRjLT5kZXNpcmVkX21vZGU7CisKKwlmYiA9IGNydGMtPmZiOworCWlmICghZmIpCisJCXJldHVybiAxOworCisJaW5mbyA9IGZiLT5mYmRldjsKKwlpZiAoIWluZm8pCisJCXJldHVybiAxOworCisJaWYgKCFtb2RlKQorCQlyZXR1cm4gMTsKKworCWluZm8tPnZhci54cmVzID0gbW9kZS0+aGRpc3BsYXk7CisJaW5mby0+dmFyLnJpZ2h0X21hcmdpbiA9IG1vZGUtPmhzeW5jX3N0YXJ0IC0gbW9kZS0+aGRpc3BsYXk7CisJaW5mby0+dmFyLmhzeW5jX2xlbiA9IG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0OworCWluZm8tPnZhci5sZWZ0X21hcmdpbiA9IG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX2VuZDsKKwlpbmZvLT52YXIueXJlcyA9IG1vZGUtPnZkaXNwbGF5OworCWluZm8tPnZhci5sb3dlcl9tYXJnaW4gPSBtb2RlLT52c3luY19zdGFydCAtIG1vZGUtPnZkaXNwbGF5OworCWluZm8tPnZhci52c3luY19sZW4gPSBtb2RlLT52c3luY19lbmQgLSBtb2RlLT52c3luY19zdGFydDsKKwlpbmZvLT52YXIudXBwZXJfbWFyZ2luID0gbW9kZS0+dnRvdGFsIC0gbW9kZS0+dnN5bmNfZW5kOworCWluZm8tPnZhci5waXhjbG9jayA9IDEwMDAwMDAwIC8gbW9kZS0+aHRvdGFsICogMTAwMCAvIG1vZGUtPnZ0b3RhbCAqIDEwMDsKKwkvKiBhdm9pZCBvdmVyZmxvdyAqLworCWluZm8tPnZhci5waXhjbG9jayA9IGluZm8tPnZhci5waXhjbG9jayAqIDEwMDAgLyBtb2RlLT52cmVmcmVzaDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbnRlbGZiX3Jlc2l6ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX21vZGVfc2V0IGtlcm5lbGZiX21vZGU7CisKK3N0YXRpYyBpbnQgaW50ZWxmYl9wYW5pYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sIHVuc2lnbmVkIGxvbmcgdW51bnNlZCwKKwkJCSB2b2lkICpwYW5pY19zdHIpCit7CisJRFJNX0VSUk9SKCJwYW5pYyBvY2N1cnJlZCwgc3dpdGNoaW5nIGJhY2sgdG8gdGV4dCBjb25zb2xlXG4iKTsKKworCWludGVsZmJfcmVzdG9yZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhbmljZWQgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpbnRlbGZiX3BhbmljLAorfTsKKworc3RhdGljIGludCBpbnRlbGZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBmYl93aWR0aCwKKwkJCSAgdWludDMyX3QgZmJfaGVpZ2h0LCB1aW50MzJfdCBzdXJmYWNlX3dpZHRoLAorCQkJICB1aW50MzJfdCBzdXJmYWNlX2hlaWdodCwKKwkJCSAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICoqaW50ZWxfZmJfcCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW50ZWxmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgbW9kZV9jbWQ7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpmYm8gPSBOVUxMOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmZGV2LT5wZGV2LT5kZXY7CisJaW50IHNpemUsIHJldCwgbW1pb19iYXIgPSBJU19JOVhYKGRldikgPyAwIDogMTsKKworCW1vZGVfY21kLndpZHRoID0gc3VyZmFjZV93aWR0aDsKKwltb2RlX2NtZC5oZWlnaHQgPSBzdXJmYWNlX2hlaWdodDsKKworCW1vZGVfY21kLmJwcCA9IDMyOworCW1vZGVfY21kLnBpdGNoID0gQUxJR04obW9kZV9jbWQud2lkdGggKiAoKG1vZGVfY21kLmJwcCArIDEpIC8gOCksIDY0KTsKKwltb2RlX2NtZC5kZXB0aCA9IDI0OworCisJc2l6ZSA9IG1vZGVfY21kLnBpdGNoICogbW9kZV9jbWQuaGVpZ2h0OworCXNpemUgPSBBTElHTihzaXplLCBQQUdFX1NJWkUpOworCWZibyA9IGRybV9nZW1fb2JqZWN0X2FsbG9jKGRldiwgc2l6ZSk7CisJaWYgKCFmYm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJb2JqX3ByaXYgPSBmYm8tPmRyaXZlcl9wcml2YXRlOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihmYm8sIFBBR0VfU0laRSk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gZmI6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF91bnJlZjsKKwl9CisKKwkvKiBGbHVzaCBldmVyeXRoaW5nIG91dCwgd2UnbGwgYmUgZG9pbmcgR1RUIG9ubHkgZnJvbSBub3cgb24gKi8KKwlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oZmJvLCAxKTsKKworCXJldCA9IGludGVsX2ZyYW1lYnVmZmVyX2NyZWF0ZShkZXYsICZtb2RlX2NtZCwgJmZiLCBmYm8pOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZmIuXG4iKTsKKwkJZ290byBvdXRfdW5yZWY7CisJfQorCisJbGlzdF9hZGQoJmZiLT5maWxwX2hlYWQsICZkZXYtPm1vZGVfY29uZmlnLmZiX2tlcm5lbF9saXN0KTsKKworCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOworCSppbnRlbF9mYl9wID0gaW50ZWxfZmI7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbGZiX3BhciksIGRldmljZSk7CisJaWYgKCFpbmZvKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VucmVmOworCX0KKworCXBhciA9IGluZm8tPnBhcjsKKworCXN0cmNweShpbmZvLT5maXguaWQsICJpbnRlbGRybWZiIik7CisJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJaW5mby0+Zml4LnR5cGVfYXV4ID0gMDsKKwlpbmZvLT5maXgueHBhbnN0ZXAgPSAxOyAvKiBkb2luZyBpdCBpbiBodyAqLworCWluZm8tPmZpeC55cGFuc3RlcCA9IDE7IC8qIGRvaW5nIGl0IGluIGh3ICovCisJaW5mby0+Zml4Lnl3cmFwc3RlcCA9IDA7CisJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfSTgzMDsKKwlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKKworCWluZm8tPmZib3BzID0gJmludGVsZmJfb3BzOworCisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gZmItPnBpdGNoOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJaW5mby0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKKworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfd2MoZGV2LT5hZ3AtPmJhc2UgKyBvYmpfcHJpdi0+Z3R0X29mZnNldCwKKwkJCQkgICAgICAgc2l6ZSk7CisJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgeworCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIG91dF91bnJlZjsKKwl9CisJaW5mby0+c2NyZWVuX3NpemUgPSBzaXplOworCisvLwltZW1zZXQoaW5mby0+c2NyZWVuX2Jhc2UsIDAsIHNpemUpOworCisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYi0+cHNldWRvX3BhbGV0dGU7CisJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGZiLT53aWR0aDsKKwlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gZmItPmhlaWdodDsKKwlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPSBmYi0+Yml0c19wZXJfcGl4ZWw7CisJaW5mby0+dmFyLnhvZmZzZXQgPSAwOworCWluZm8tPnZhci55b2Zmc2V0ID0gMDsKKwlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CisJaW5mby0+dmFyLmhlaWdodCA9IC0xOworCWluZm8tPnZhci53aWR0aCA9IC0xOworCisJaW5mby0+dmFyLnhyZXMgPSBmYl93aWR0aDsKKwlpbmZvLT52YXIueXJlcyA9IGZiX2hlaWdodDsKKworCS8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkbid0IGV4cG9zZSBtbWlvIHNwYWNlIGF0IGFsbCAqLworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgbW1pb19iYXIpOworCWluZm8tPmZpeC5tbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBtbWlvX2Jhcik7CisKKwlpbmZvLT5waXhtYXAuc2l6ZSA9IDY0KjEwMjQ7CisJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CisJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOworCWluZm8tPnBpeG1hcC5mbGFncyA9IEZCX1BJWE1BUF9TWVNURU07CisJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSAxOworCisJc3dpdGNoKGZiLT5kZXB0aCkgeworCWNhc2UgODoKKwkJaW5mby0+dmFyLnJlZC5vZmZzZXQgPSAwOworCQlpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0ID0gMDsKKwkJaW5mby0+dmFyLmJsdWUub2Zmc2V0ID0gMDsKKwkJaW5mby0+dmFyLnJlZC5sZW5ndGggPSA4OyAvKiA4Yml0IERBQyAqLworCQlpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0gODsKKwkJaW5mby0+dmFyLmJsdWUubGVuZ3RoID0gODsKKwkJaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQgPSAwOworCQlpbmZvLT52YXIudHJhbnNwLmxlbmd0aCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWluZm8tPnZhci5yZWQub2Zmc2V0ID0gMTA7CisJCWluZm8tPnZhci5ncmVlbi5vZmZzZXQgPSA1OworCQlpbmZvLT52YXIuYmx1ZS5vZmZzZXQgPSAwOworCQlpbmZvLT52YXIucmVkLmxlbmd0aCA9IDU7CisJCWluZm8tPnZhci5ncmVlbi5sZW5ndGggPSA1OworCQlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA1OworCQlpbmZvLT52YXIudHJhbnNwLm9mZnNldCA9IDE1OworCQlpbmZvLT52YXIudHJhbnNwLmxlbmd0aCA9IDE7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWluZm8tPnZhci5yZWQub2Zmc2V0ID0gMTE7CisJCWluZm8tPnZhci5ncmVlbi5vZmZzZXQgPSA1OworCQlpbmZvLT52YXIuYmx1ZS5vZmZzZXQgPSAwOworCQlpbmZvLT52YXIucmVkLmxlbmd0aCA9IDU7CisJCWluZm8tPnZhci5ncmVlbi5sZW5ndGggPSA2OworCQlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA1OworCQlpbmZvLT52YXIudHJhbnNwLm9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWluZm8tPnZhci5yZWQub2Zmc2V0ID0gMTY7CisJCWluZm8tPnZhci5ncmVlbi5vZmZzZXQgPSA4OworCQlpbmZvLT52YXIuYmx1ZS5vZmZzZXQgPSAwOworCQlpbmZvLT52YXIucmVkLmxlbmd0aCA9IDg7CisJCWluZm8tPnZhci5ncmVlbi5sZW5ndGggPSA4OworCQlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA4OworCQlpbmZvLT52YXIudHJhbnNwLm9mZnNldCA9IDA7CisJCWluZm8tPnZhci50cmFuc3AubGVuZ3RoID0gMDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJaW5mby0+dmFyLnJlZC5vZmZzZXQgPSAxNjsKKwkJaW5mby0+dmFyLmdyZWVuLm9mZnNldCA9IDg7CisJCWluZm8tPnZhci5ibHVlLm9mZnNldCA9IDA7CisJCWluZm8tPnZhci5yZWQubGVuZ3RoID0gODsKKwkJaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9IDg7CisJCWluZm8tPnZhci5ibHVlLmxlbmd0aCA9IDg7CisJCWluZm8tPnZhci50cmFuc3Aub2Zmc2V0ID0gMjQ7CisJCWluZm8tPnZhci50cmFuc3AubGVuZ3RoID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZmItPmZiZGV2ID0gaW5mbzsKKworCXBhci0+aW50ZWxfZmIgPSBpbnRlbF9mYjsKKwlwYXItPmRldiA9IGRldjsKKworCS8qIFRvIGFsbG93IHJlc2l6ZWluZyB3aXRob3V0IHN3YXBwaW5nIGJ1ZmZlcnMgKi8KKwlwcmludGsoImFsbG9jYXRlZCAlZHglZCBmYjogMHglMDh4LCBibyAlcFxuIiwgaW50ZWxfZmItPmJhc2Uud2lkdGgsCisJICAgICAgIGludGVsX2ZiLT5iYXNlLmhlaWdodCwgb2JqX3ByaXYtPmd0dF9vZmZzZXQsIGZibyk7CisKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gMDsKKworb3V0X3VucmVmOgorCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGZibyk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbGZiX211bHRpX2ZiX3Byb2JlX2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGludGVsZmJfcGFyICpwYXI7CisJc3RydWN0IGRybV9tb2RlX3NldCAqbW9kZXNldDsKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgbmV3X2ZiID0gMDsKKwlpbnQgcmV0LCBpLCBjb25uX2NvdW50OworCisJaWYgKCFkcm1faGVscGVyX2NydGNfaW5fdXNlKGNydGMpKQorCQlyZXR1cm4gMDsKKworCWlmICghY3J0Yy0+ZGVzaXJlZF9tb2RlKQorCQlyZXR1cm4gMDsKKworCXdpZHRoID0gY3J0Yy0+ZGVzaXJlZF9tb2RlLT5oZGlzcGxheTsKKwloZWlnaHQgPSBjcnRjLT5kZXNpcmVkX21vZGUtPnZkaXNwbGF5OworCisJLyogaXMgdGhlcmUgYW4gZmIgYm91bmQgdG8gdGhpcyBjcnRjIGFscmVhZHkgKi8KKwlpZiAoIWludGVsX2NydGMtPm1vZGVfc2V0LmZiKSB7CisJCXJldCA9IGludGVsZmJfY3JlYXRlKGRldiwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCwgJmludGVsX2ZiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluZXdfZmIgPSAxOworCX0gZWxzZSB7CisJCWZiID0gaW50ZWxfY3J0Yy0+bW9kZV9zZXQuZmI7CisJCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOworCQlpZiAoKGludGVsX2ZiLT5iYXNlLndpZHRoIDwgd2lkdGgpIHx8IChpbnRlbF9mYi0+YmFzZS5oZWlnaHQgPCBoZWlnaHQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mbyA9IGludGVsX2ZiLT5iYXNlLmZiZGV2OworCXBhciA9IGluZm8tPnBhcjsKKworCW1vZGVzZXQgPSAmaW50ZWxfY3J0Yy0+bW9kZV9zZXQ7CisJbW9kZXNldC0+ZmIgPSAmaW50ZWxfZmItPmJhc2U7CisJY29ubl9jb3VudCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIpCisJCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IG1vZGVzZXQtPmNydGMpIHsKKwkJCQltb2Rlc2V0LT5jb25uZWN0b3JzW2Nvbm5fY291bnRdID0gY29ubmVjdG9yOworCQkJCWNvbm5fY291bnQrKzsKKwkJCQlpZiAoY29ubl9jb3VudCA+IElOVEVMRkJfQ09OTl9MSU1JVCkKKwkJCQkJQlVHKCk7CisJCQl9CisJfQorCisJZm9yIChpID0gY29ubl9jb3VudDsgaSA8IElOVEVMRkJfQ09OTl9MSU1JVDsgaSsrKQorCQltb2Rlc2V0LT5jb25uZWN0b3JzW2ldID0gTlVMTDsKKworCXBhci0+Y3J0Y19pZHNbMF0gPSBjcnRjLT5iYXNlLmlkOworCisJbW9kZXNldC0+bnVtX2Nvbm5lY3RvcnMgPSBjb25uX2NvdW50OworCWlmIChtb2Rlc2V0LT5tb2RlICE9IG1vZGVzZXQtPmNydGMtPmRlc2lyZWRfbW9kZSkKKwkJbW9kZXNldC0+bW9kZSA9IG1vZGVzZXQtPmNydGMtPmRlc2lyZWRfbW9kZTsKKworCXBhci0+Y3J0Y19jb3VudCA9IDE7CisKKwlpZiAobmV3X2ZiKSB7CisJCWluZm8tPnZhci5waXhjbG9jayA9IC0xOworCQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlCisJCWludGVsZmJfc2V0X3BhcihpbmZvKTsKKworCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsIGluZm8tPm5vZGUsCisJICAgICAgIGluZm8tPmZpeC5pZCk7CisKKwkvKiBTd2l0Y2ggYmFjayB0byBrZXJuZWwgY29uc29sZSBvbiBwYW5pYyAqLworCWtlcm5lbGZiX21vZGUgPSAqbW9kZXNldDsKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY2VkKTsKKwlwcmludGsoS0VSTl9JTkZPICJyZWdpc3RlcmVkIHBhbmljIG5vdGlmaWVyXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsZmJfbXVsdGlfZmJfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlpbnQgcmV0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXJldCA9IGludGVsZmJfbXVsdGlfZmJfcHJvYmVfY3J0YyhkZXYsIGNydGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbnRlbGZiX3NpbmdsZV9mYl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXVuc2lnbmVkIGludCBmYl93aWR0aCA9ICh1bnNpZ25lZCktMSwgZmJfaGVpZ2h0ID0gKHVuc2lnbmVkKS0xOworCXVuc2lnbmVkIGludCBzdXJmYWNlX3dpZHRoID0gMCwgc3VyZmFjZV9oZWlnaHQgPSAwOworCWludCBuZXdfZmIgPSAwOworCWludCBjcnRjX2NvdW50ID0gMDsKKwlpbnQgcmV0LCBpLCBjb25uX2NvdW50ID0gMDsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBpbnRlbGZiX3BhciAqcGFyOworCXN0cnVjdCBkcm1fbW9kZV9zZXQgKm1vZGVzZXQgPSBOVUxMOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJLyogR2V0IGEgY291bnQgb2YgY3J0Y3Mgbm93IGluIHVzZSBhbmQgbmV3IG1pbi9tYXhlcyB3aWR0aC9oZWlnaHRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKCFkcm1faGVscGVyX2NydGNfaW5fdXNlKGNydGMpKQorCQkJY29udGludWU7CisKKwkJY3J0Y19jb3VudCsrOworCQlpZiAoIWNydGMtPmRlc2lyZWRfbW9kZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNtYWxsZXN0IG1vZGUgZGV0ZXJtaW5lcyBjb25zb2xlIHNpemUuLi4gKi8KKwkJaWYgKGNydGMtPmRlc2lyZWRfbW9kZS0+aGRpc3BsYXkgPCBmYl93aWR0aCkKKwkJCWZiX3dpZHRoID0gY3J0Yy0+ZGVzaXJlZF9tb2RlLT5oZGlzcGxheTsKKworCQlpZiAoY3J0Yy0+ZGVzaXJlZF9tb2RlLT52ZGlzcGxheSA8IGZiX2hlaWdodCkKKwkJCWZiX2hlaWdodCA9IGNydGMtPmRlc2lyZWRfbW9kZS0+dmRpc3BsYXk7CisKKwkJLyogLi4uIGJ1dCBsYXJnZXN0IGZvciBtZW1vcnkgYWxsb2NhdGlvbiBkaW1lbnNpb25zICovCisJCWlmIChjcnRjLT5kZXNpcmVkX21vZGUtPmhkaXNwbGF5ID4gc3VyZmFjZV93aWR0aCkKKwkJCXN1cmZhY2Vfd2lkdGggPSBjcnRjLT5kZXNpcmVkX21vZGUtPmhkaXNwbGF5OworCisJCWlmIChjcnRjLT5kZXNpcmVkX21vZGUtPnZkaXNwbGF5ID4gc3VyZmFjZV9oZWlnaHQpCisJCQlzdXJmYWNlX2hlaWdodCA9IGNydGMtPmRlc2lyZWRfbW9kZS0+dmRpc3BsYXk7CisJfQorCisJaWYgKGNydGNfY291bnQgPT0gMCB8fCBmYl93aWR0aCA9PSAtMSB8fCBmYl9oZWlnaHQgPT0gLTEpIHsKKwkJLyogaG1tIGV2ZXJ5b25lIHdlbnQgYXdheSAtIGFzc3VtZSBWR0EgY2FibGUganVzdCBmZWxsIG91dAorCQkgICBhbmQgd2lsbCBjb21lIGJhY2sgbGF0ZXIuICovCisJCURSTV9ERUJVRygibm8gQ1JUQ3MgYXZhaWxhYmxlP1xuIik7CisJCXJldHVybiAwOworCX0KKworLy9mYWlsCisJLyogRmluZCB0aGUgZmIgZm9yIG91ciBuZXcgY29uZmlnICovCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+bW9kZV9jb25maWcuZmJfa2VybmVsX2xpc3QpKSB7CisJCURSTV9ERUJVRygiY3JlYXRpbmcgbmV3IGZiIChjb25zb2xlIHNpemUgJWR4JWQsICIKKwkJCSAgImJ1ZmZlciBzaXplICVkeCVkKVxuIiwgZmJfd2lkdGgsIGZiX2hlaWdodCwKKwkJCSAgc3VyZmFjZV93aWR0aCwgc3VyZmFjZV9oZWlnaHQpOworCQlyZXQgPSBpbnRlbGZiX2NyZWF0ZShkZXYsIGZiX3dpZHRoLCBmYl9oZWlnaHQsIHN1cmZhY2Vfd2lkdGgsCisJCQkJICAgICBzdXJmYWNlX2hlaWdodCwgJmludGVsX2ZiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluZXdfZmIgPSAxOworCX0gZWxzZSB7CisJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCisJCWZiID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2LT5tb2RlX2NvbmZpZy5mYl9rZXJuZWxfbGlzdCwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyLCBmaWxwX2hlYWQpOworCQlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKKworCQkvKiBpZiBzb21lb25lIGhvdHBsdWdzIHNvbWV0aGluZyBiaWdnZXIgdGhhbiB3ZSBoYXZlIGFscmVhZHkKKwkJICogYWxsb2NhdGVkLCB3ZSBhcmUgcHduZWQuICBBcyByZWFsbHkgd2UgY2FuJ3QgcmVzaXplIGFuCisJCSAqIGZiZGV2IHRoYXQgaXMgaW4gdGhlIHdpbGQgY3VycmVudGx5IGR1ZSB0byBmYmRldiBub3QgcmVhbGx5CisJCSAqIGJlaW5nIGRlc2lnbmVkIGZvciB0aGUgbG93ZXIgbGF5ZXJzIG1vdmluZyBzdHVmZiBhcm91bmQKKwkJICogdW5kZXIgaXQuCisJCSAqIC0gc28gaW4gdGhlIGdyYW5kIHN0eWxlIG9mIHRoaW5ncyAtIHB1bnQuCisJCSAqLworCQlpZiAoKGZiLT53aWR0aCA8IHN1cmZhY2Vfd2lkdGgpIHx8CisJCSAgICAoZmItPmhlaWdodCA8IHN1cmZhY2VfaGVpZ2h0KSkgeworCQkJRFJNX0VSUk9SKCJmYiBub3QgbGFyZ2UgZW5vdWdoIGZvciBjb25zb2xlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorLy8gZmFpbAorCisJaW5mbyA9IGludGVsX2ZiLT5iYXNlLmZiZGV2OworCXBhciA9IGluZm8tPnBhcjsKKworCWNydGNfY291bnQgPSAwOworCS8qCisJICogRm9yIGVhY2ggQ1JUQywgc2V0IHVwIHRoZSBjb25uZWN0b3IgbGlzdCBmb3IgdGhlIENSVEMncyBtb2RlCisJICogc2V0IGNvbmZpZ3VyYXRpb24uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCisJCW1vZGVzZXQgPSAmaW50ZWxfY3J0Yy0+bW9kZV9zZXQ7CisJCW1vZGVzZXQtPmZiID0gJmludGVsX2ZiLT5iYXNlOworCQljb25uX2NvdW50ID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LAorCQkJCSAgICBoZWFkKSB7CisJCQlpZiAoIWNvbm5lY3Rvci0+ZW5jb2RlcikKKwkJCQljb250aW51ZTsKKworCQkJaWYoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IG1vZGVzZXQtPmNydGMpIHsKKwkJCQltb2Rlc2V0LT5jb25uZWN0b3JzW2Nvbm5fY291bnQrK10gPSBjb25uZWN0b3I7CisJCQkJaWYgKGNvbm5fY291bnQgPiBJTlRFTEZCX0NPTk5fTElNSVQpCisJCQkJCUJVRygpOworCQkJfQorCQl9CisKKwkJLyogWmVybyBvdXQgcmVtYWluaW5nIGNvbm5lY3RvciBwb2ludGVycyAqLworCQlmb3IgKGkgPSBjb25uX2NvdW50OyBpIDwgSU5URUxGQl9DT05OX0xJTUlUOyBpKyspCisJCQltb2Rlc2V0LT5jb25uZWN0b3JzW2ldID0gTlVMTDsKKworCQlwYXItPmNydGNfaWRzW2NydGNfY291bnQrK10gPSBjcnRjLT5iYXNlLmlkOworCisJCW1vZGVzZXQtPm51bV9jb25uZWN0b3JzID0gY29ubl9jb3VudDsKKwkJaWYgKG1vZGVzZXQtPm1vZGUgIT0gbW9kZXNldC0+Y3J0Yy0+ZGVzaXJlZF9tb2RlKQorCQkJbW9kZXNldC0+bW9kZSA9IG1vZGVzZXQtPmNydGMtPmRlc2lyZWRfbW9kZTsKKwl9CisJcGFyLT5jcnRjX2NvdW50ID0gY3J0Y19jb3VudDsKKworCWlmIChuZXdfZmIpIHsKKwkJaW5mby0+dmFyLnBpeGNsb2NrID0gLTE7CisJCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UKKwkJaW50ZWxmYl9zZXRfcGFyKGluZm8pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwgaW5mby0+bm9kZSwKKwkgICAgICAgaW5mby0+Zml4LmlkKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIGtlcm5lbCBjb25zb2xlIG9uIHBhbmljICovCisJa2VybmVsZmJfbW9kZSA9ICptb2Rlc2V0OworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljZWQpOworCXByaW50ayhLRVJOX0lORk8gInJlZ2lzdGVyZWQgcGFuaWMgbm90aWZpZXJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50ZWxmYl9yZXN0b3JlIC0gcmVzdG9yZSB0aGUgZnJhbWVidWZmZXIgY29uc29sZSAoa2VybmVsKSBjb25maWcKKyAqCisgKiBSZXN0b3JlJ3MgdGhlIGtlcm5lbCdzIGZiY29uIG1vZGUsIHVzZWQgZm9yIGxhc3RjbG9zZSAmIHBhbmljIHBhdGhzLgorICovCit2b2lkIGludGVsZmJfcmVzdG9yZSh2b2lkKQoreworCWRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnKCZrZXJuZWxmYl9tb2RlKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxmYl9zeXNycShpbnQgZHVtbXkxLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqZHVtbXkzKQoreworICAgICAgICBpbnRlbGZiX3Jlc3RvcmUoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfaW50ZWxmYl9yZXN0b3JlX29wID0geworICAgICAgICAuaGFuZGxlciA9IGludGVsZmJfc3lzcnEsCisgICAgICAgIC5oZWxwX21zZyA9ICJmb3JjZSBmYiIsCisgICAgICAgIC5hY3Rpb25fbXNnID0gImZvcmNlIHJlc3RvcmUgb2YgZmIgY29uc29sZSIsCit9OworCitpbnQgaW50ZWxmYl9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwkvKiBzb21ldGhpbmcgaGFzIGNoYW5nZWQgaW4gdGhlIGxvd2VyIGxldmVscyBvZiBoZWxsIC0gZGVhbCB3aXRoIGl0CisJICAgaGVyZSAqLworCisJLyogdHdvIG1vZGVzIDogYSkgMSBmYiB0byBydWxlIGFsbCBjcnRjcy4KKwkgICAgICAgICAgICAgICBiKSBvbmUgZmIgcGVyIGNydGMuCisJICAgdHdvIGFjdGlvbnMgMSkgbmV3IGNvbm5lY3RlZCBkZXZpY2UKKwkgICAgICAgICAgICAgICAyKSBkZXZpY2UgcmVtb3ZlZC4KKwkgICBjYXNlIGEvMSA6IGlmIHRoZSBmYiBzdXJmYWNlIGlzbid0IGJpZyBlbm91Z2ggLSByZXNpemUgdGhlIHN1cmZhY2UgZmIuCisJICAgICAgICAgICAgICBpZiB0aGUgZmIgc2l6ZSBpc24ndCBiaWcgZW5vdWdoIC0gcmVzaXplIGZiIGludG8gc3VyZmFjZS4KKwkJICAgICAgaWYgZXZlcnl0aGluZyBiaWcgZW5vdWdoIGNvbmZpZ3VyZSB0aGUgbmV3IGNydGMvZXRjLgorCSAgIGNhc2UgYS8yIDogdW5kbyB0aGUgY29uZmlndXJhdGlvbgorCSAgICAgICAgICAgICAgcG9zc2libHkgcmVzaXplIGRvd24gdGhlIGZiIHRvIGZpdCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgIGNhc2UgYi8xIDogc2VlIGlmIGl0IGlzIG9uIGEgbmV3IGNydGMgLSBzZXR1cCBhIG5ldyBmYiBhbmQgYWRkIGl0LgorCSAgIGNhc2UgYi8yIDogdGVhcmRvd24gdGhlIG5ldyBmYi4KKwkqLworCisJLyogbW9kZSBhIGZpcnN0ICovCisJLyogc2VhcmNoIGZvciBhbiBmYiAqLworCWlmIChpOTE1X2ZicGVyY3J0YyA9PSAxKSB7CisJCXJldCA9IGludGVsZmJfbXVsdGlfZmJfcHJvYmUoZGV2KTsKKwl9IGVsc2UgeworCQlyZXQgPSBpbnRlbGZiX3NpbmdsZV9mYl9wcm9iZShkZXYpOworCX0KKworCXJlZ2lzdGVyX3N5c3JxX2tleSgnZycsICZzeXNycV9pbnRlbGZiX3Jlc3RvcmVfb3ApOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaW50ZWxmYl9wcm9iZSk7CisKK2ludCBpbnRlbGZiX3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKworCWlmICghZmIpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5mbyA9IGZiLT5mYmRldjsKKworCWlmIChpbmZvKSB7CisJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCX0KKworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcGFuaWNlZCk7CisJbWVtc2V0KCZrZXJuZWxmYl9tb2RlLCAwLCBzaXplb2Yoc3RydWN0IGRybV9tb2RlX3NldCkpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbnRlbGZiX3JlbW92ZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWEyZjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCisvKgorICogSW50ZWwgR1BJTyBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBJMkNfUklTRUZBTExfVElNRSAyMAorCitzdGF0aWMgaW50IGdldF9jbG9jayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqY2hhbiA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZHJtX2Rldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHZhbDsKKworCXZhbCA9IEk5MTVfUkVBRChjaGFuLT5yZWcpOworCXJldHVybiAoKHZhbCAmIEdQSU9fQ0xPQ0tfVkFMX0lOKSAhPSAwKTsKK30KKworc3RhdGljIGludCBnZXRfZGF0YSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbnRlbF9pMmNfY2hhbiAqY2hhbiA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZHJtX2Rldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHZhbDsKKworCXZhbCA9IEk5MTVfUkVBRChjaGFuLT5yZWcpOworCXJldHVybiAoKHZhbCAmIEdQSU9fREFUQV9WQUxfSU4pICE9IDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfY2xvY2sodm9pZCAqZGF0YSwgaW50IHN0YXRlX2hpZ2gpCit7CisJc3RydWN0IGludGVsX2kyY19jaGFuICpjaGFuID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZHJtX2RldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kcm1fZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcmVzZXJ2ZWQgPSAwLCBjbG9ja19iaXRzOworCisJLyogT24gbW9zdCBjaGlwcywgdGhlc2UgYml0cyBtdXN0IGJlIHByZXNlcnZlZCBpbiBzb2Z0d2FyZS4gKi8KKwlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpKQorCQlyZXNlcnZlZCA9IEk5MTVfUkVBRChjaGFuLT5yZWcpICYgKEdQSU9fREFUQV9QVUxMVVBfRElTQUJMRSB8CisJCQkJCQkgICBHUElPX0NMT0NLX1BVTExVUF9ESVNBQkxFKTsKKworCWlmIChzdGF0ZV9oaWdoKQorCQljbG9ja19iaXRzID0gR1BJT19DTE9DS19ESVJfSU4gfCBHUElPX0NMT0NLX0RJUl9NQVNLOworCWVsc2UKKwkJY2xvY2tfYml0cyA9IEdQSU9fQ0xPQ0tfRElSX09VVCB8IEdQSU9fQ0xPQ0tfRElSX01BU0sgfAorCQkJR1BJT19DTE9DS19WQUxfTUFTSzsKKwlJOTE1X1dSSVRFKGNoYW4tPnJlZywgcmVzZXJ2ZWQgfCBjbG9ja19iaXRzKTsKKwl1ZGVsYXkoSTJDX1JJU0VGQUxMX1RJTUUpOyAvKiB3YWl0IGZvciB0aGUgbGluZSB0byBjaGFuZ2Ugc3RhdGUgKi8KK30KKworc3RhdGljIHZvaWQgc2V0X2RhdGEodm9pZCAqZGF0YSwgaW50IHN0YXRlX2hpZ2gpCit7CisJc3RydWN0IGludGVsX2kyY19jaGFuICpjaGFuID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZHJtX2RldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kcm1fZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgcmVzZXJ2ZWQgPSAwLCBkYXRhX2JpdHM7CisKKwkvKiBPbiBtb3N0IGNoaXBzLCB0aGVzZSBiaXRzIG11c3QgYmUgcHJlc2VydmVkIGluIHNvZnR3YXJlLiAqLworCWlmICghSVNfSTgzMChkZXYpICYmICFJU184NDVHKGRldikpCisJCXJlc2VydmVkID0gSTkxNV9SRUFEKGNoYW4tPnJlZykgJiAoR1BJT19EQVRBX1BVTExVUF9ESVNBQkxFIHwKKwkJCQkJCSAgIEdQSU9fQ0xPQ0tfUFVMTFVQX0RJU0FCTEUpOworCisJaWYgKHN0YXRlX2hpZ2gpCisJCWRhdGFfYml0cyA9IEdQSU9fREFUQV9ESVJfSU4gfCBHUElPX0RBVEFfRElSX01BU0s7CisJZWxzZQorCQlkYXRhX2JpdHMgPSBHUElPX0RBVEFfRElSX09VVCB8IEdQSU9fREFUQV9ESVJfTUFTSyB8CisJCQlHUElPX0RBVEFfVkFMX01BU0s7CisKKwlJOTE1X1dSSVRFKGNoYW4tPnJlZywgcmVzZXJ2ZWQgfCBkYXRhX2JpdHMpOworCXVkZWxheShJMkNfUklTRUZBTExfVElNRSk7IC8qIHdhaXQgZm9yIHRoZSBsaW5lIHRvIGNoYW5nZSBzdGF0ZSAqLworfQorCisvKioKKyAqIGludGVsX2kyY19jcmVhdGUgLSBpbnN0YW50aWF0ZSBhbiBJbnRlbCBpMmMgYnVzIHVzaW5nIHRoZSBzcGVjaWZpZWQgR1BJTyByZWcKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBvdXRwdXQ6IGRyaXZlciBzcGVjaWZpYyBvdXRwdXQgZGV2aWNlCisgKiBAcmVnOiBHUElPIHJlZyB0byB1c2UKKyAqIEBuYW1lOiBuYW1lIGZvciB0aGlzIGJ1cworICoKKyAqIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIG5ldyBpMmMgYnVzIHdpdGggdGhlIExpbnV4IGkyYyBsYXllciwgZm9yIHVzZQorICogaW4gb3V0cHV0IHByb2JpbmcgYW5kIGNvbnRyb2wgKGUuZy4gRERDIG9yIFNEVk8gY29udHJvbCBmdW5jdGlvbnMpLgorICoKKyAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgQHJlZyBpbmNsdWRlOgorICogICAlR1BJT0EKKyAqICAgJUdQSU9CCisgKiAgICVHUElPQworICogICAlR1BJT0QKKyAqICAgJUdQSU9FCisgKiAgICVHUElPRgorICogICAlR1BJT0cKKyAqICAgJUdQSU9ICisgKiBzZWUgUFJNIGZvciBkZXRhaWxzIG9uIGhvdyB0aGVzZSBkaWZmZXJlbnQgYnVzc2VzIGFyZSB1c2VkLgorICovCitzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmludGVsX2kyY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgdTMyIHJlZywKKwkJCQkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmNoYW47CisKKwljaGFuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX2kyY19jaGFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuKQorCQlnb3RvIG91dF9mcmVlOworCisJY2hhbi0+ZHJtX2RldiA9IGRldjsKKwljaGFuLT5yZWcgPSByZWc7CisJc25wcmludGYoY2hhbi0+YWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLCAiaW50ZWwgZHJtICVzIiwgbmFtZSk7CisJY2hhbi0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOworI2lmbmRlZiBJMkNfSFdfQl9JTlRFTEZCCisjZGVmaW5lIEkyQ19IV19CX0lOVEVMRkIgSTJDX0hXX0JfSTgxMAorI2VuZGlmCisJY2hhbi0+YWRhcHRlci5pZCA9IEkyQ19IV19CX0lOVEVMRkI7CisJY2hhbi0+YWRhcHRlci5hbGdvX2RhdGEJPSAmY2hhbi0+YWxnbzsKKwljaGFuLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5wZGV2LT5kZXY7CisJY2hhbi0+YWxnby5zZXRzZGEgPSBzZXRfZGF0YTsKKwljaGFuLT5hbGdvLnNldHNjbCA9IHNldF9jbG9jazsKKwljaGFuLT5hbGdvLmdldHNkYSA9IGdldF9kYXRhOworCWNoYW4tPmFsZ28uZ2V0c2NsID0gZ2V0X2Nsb2NrOworCWNoYW4tPmFsZ28udWRlbGF5ID0gMjA7CisJY2hhbi0+YWxnby50aW1lb3V0ID0gdXNlY3NfdG9famlmZmllcygyMjAwKTsKKwljaGFuLT5hbGdvLmRhdGEgPSBjaGFuOworCisJaTJjX3NldF9hZGFwZGF0YSgmY2hhbi0+YWRhcHRlciwgY2hhbik7CisKKwlpZihpMmNfYml0X2FkZF9idXMoJmNoYW4tPmFkYXB0ZXIpKQorCQlnb3RvIG91dF9mcmVlOworCisJLyogSkpKOiAgcmFpc2UgU0NMIGFuZCBTREE/ICovCisJc2V0X2RhdGEoY2hhbiwgMSk7CisJc2V0X2Nsb2NrKGNoYW4sIDEpOworCXVkZWxheSgyMCk7CisKKwlyZXR1cm4gY2hhbjsKKworb3V0X2ZyZWU6CisJa2ZyZWUoY2hhbik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaW50ZWxfaTJjX2Rlc3Ryb3kgLSB1bnJlZ2lzdGVyIGFuZCBmcmVlIGkyYyBidXMgcmVzb3VyY2VzCisgKiBAb3V0cHV0OiBjaGFubmVsIHRvIGZyZWUKKyAqCisgKiBVbnJlZ2lzdGVyIHRoZSBhZGFwdGVyIGZyb20gdGhlIGkyYyBsYXllciwgdGhlbiBmcmVlIHRoZSBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgaW50ZWxfaTJjX2Rlc3Ryb3koc3RydWN0IGludGVsX2kyY19jaGFuICpjaGFuKQoreworCWlmICghY2hhbikKKwkJcmV0dXJuOworCisJaTJjX2RlbF9hZGFwdGVyKCZjaGFuLT5hZGFwdGVyKTsKKwlrZnJlZShjaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2VjZmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC0wLDAgKzEsNTI1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICoJRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqICAgICAgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiAgICAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX2VkaWQuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisKKy8qKgorICogU2V0cyB0aGUgYmFja2xpZ2h0IGxldmVsLgorICoKKyAqIFxwYXJhbSBsZXZlbCBiYWNrbGlnaHQgbGV2ZWwsIGZyb20gMCB0byBpbnRlbF9sdmRzX2dldF9tYXhfYmFja2xpZ2h0KCkuCisgKi8KK3N0YXRpYyB2b2lkIGludGVsX2x2ZHNfc2V0X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgYmxjX3B3bV9jdGw7CisKKwlibGNfcHdtX2N0bCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCkgJiB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKKwlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCAoYmxjX3B3bV9jdGwgfAorCQkJCSAobGV2ZWwgPDwgQkFDS0xJR0hUX0RVVFlfQ1lDTEVfU0hJRlQpKSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbWF4aW11bSBsZXZlbCBvZiB0aGUgYmFja2xpZ2h0IGR1dHkgY3ljbGUgZmllbGQuCisgKi8KK3N0YXRpYyB1MzIgaW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gKChJOTE1X1JFQUQoQkxDX1BXTV9DVEwpICYgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9NQVNLKSA+PgorCQlCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX1NISUZUKSAqIDI7Cit9CisKKy8qKgorICogU2V0cyB0aGUgcG93ZXIgc3RhdGUgZm9yIHRoZSBwYW5lbC4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfbHZkc19zZXRfcG93ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBvbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBwcF9zdGF0dXM7CisKKwlpZiAob24pIHsKKwkJSTkxNV9XUklURShQUF9DT05UUk9MLCBJOTE1X1JFQUQoUFBfQ09OVFJPTCkgfAorCQkJICAgUE9XRVJfVEFSR0VUX09OKTsKKwkJZG8geworCQkJcHBfc3RhdHVzID0gSTkxNV9SRUFEKFBQX1NUQVRVUyk7CisJCX0gd2hpbGUgKChwcF9zdGF0dXMgJiBQUF9PTikgPT0gMCk7CisKKwkJaW50ZWxfbHZkc19zZXRfYmFja2xpZ2h0KGRldiwgZGV2X3ByaXYtPmJhY2tsaWdodF9kdXR5X2N5Y2xlKTsKKwl9IGVsc2UgeworCQlpbnRlbF9sdmRzX3NldF9iYWNrbGlnaHQoZGV2LCAwKTsKKworCQlJOTE1X1dSSVRFKFBQX0NPTlRST0wsIEk5MTVfUkVBRChQUF9DT05UUk9MKSAmCisJCQkgICB+UE9XRVJfVEFSR0VUX09OKTsKKwkJZG8geworCQkJcHBfc3RhdHVzID0gSTkxNV9SRUFEKFBQX1NUQVRVUyk7CisJCX0gd2hpbGUgKHBwX3N0YXR1cyAmIFBQX09OKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2x2ZHNfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQorCQlpbnRlbF9sdmRzX3NldF9wb3dlcihkZXYsIHRydWUpOworCWVsc2UKKwkJaW50ZWxfbHZkc19zZXRfcG93ZXIoZGV2LCBmYWxzZSk7CisKKwkvKiBYWFg6IFdlIG5ldmVyIHBvd2VyIGRvd24gdGhlIExWRFMgcGFpcnMuICovCit9CisKK3N0YXRpYyB2b2lkIGludGVsX2x2ZHNfc2F2ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPnNhdmVQUF9PTiA9IEk5MTVfUkVBRChQUF9PTl9ERUxBWVMpOworCWRldl9wcml2LT5zYXZlUFBfT0ZGID0gSTkxNV9SRUFEKFBQX09GRl9ERUxBWVMpOworCWRldl9wcml2LT5zYXZlUFBfQ09OVFJPTCA9IEk5MTVfUkVBRChQUF9DT05UUk9MKTsKKwlkZXZfcHJpdi0+c2F2ZVBQX0RJVklTT1IgPSBJOTE1X1JFQUQoUFBfRElWSVNPUik7CisJZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7CisJZGV2X3ByaXYtPmJhY2tsaWdodF9kdXR5X2N5Y2xlID0gKGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgJgorCQkJCSAgICAgICBCQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLKTsKKworCS8qCisJICogSWYgdGhlIGxpZ2h0IGlzIG9mZiBhdCBzZXJ2ZXIgc3RhcnR1cCwganVzdCBtYWtlIGl0IGZ1bGwgYnJpZ2h0bmVzcworCSAqLworCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2R1dHlfY3ljbGUgPT0gMCkKKwkJZGV2X3ByaXYtPmJhY2tsaWdodF9kdXR5X2N5Y2xlID0KKwkJCWludGVsX2x2ZHNfZ2V0X21heF9iYWNrbGlnaHQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfbHZkc19yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMKTsKKwlJOTE1X1dSSVRFKFBQX09OX0RFTEFZUywgZGV2X3ByaXYtPnNhdmVQUF9PTik7CisJSTkxNV9XUklURShQUF9PRkZfREVMQVlTLCBkZXZfcHJpdi0+c2F2ZVBQX09GRik7CisJSTkxNV9XUklURShQUF9ESVZJU09SLCBkZXZfcHJpdi0+c2F2ZVBQX0RJVklTT1IpOworCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MKTsKKwlpZiAoZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MICYgUE9XRVJfVEFSR0VUX09OKQorCQlpbnRlbF9sdmRzX3NldF9wb3dlcihkZXYsIHRydWUpOworCWVsc2UKKwkJaW50ZWxfbHZkc19zZXRfcG93ZXIoZGV2LCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfbHZkc19tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpmaXhlZF9tb2RlID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGU7CisKKwlpZiAoZml4ZWRfbW9kZSkJeworCQlpZiAobW9kZS0+aGRpc3BsYXkgPiBmaXhlZF9tb2RlLT5oZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX1BBTkVMOworCQlpZiAobW9kZS0+dmRpc3BsYXkgPiBmaXhlZF9tb2RlLT52ZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX1BBTkVMOworCX0KKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9sdmRzX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqdG1wX2VuY29kZXI7CisKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuISEgKi8KKwlpZiAoIUlTX0k5NjVHKGRldikgJiYgaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3VwcG9ydCBMVkRTIG9uIHBpcGUgQVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuISEgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9lbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJaWYgKHRtcF9lbmNvZGVyICE9IGVuY29kZXIgJiYgdG1wX2VuY29kZXItPmNydGMgPT0gZW5jb2Rlci0+Y3J0YykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBlbmFibGUgTFZEUyBhbmQgYW5vdGhlciAiCisJCQkgICAgICAgImVuY29kZXIgb24gdGhlIHNhbWUgcGlwZVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgdGltaW5ncyBmcm9tIHRoZSBCSU9TIGZvciB0aGUgcGFuZWwsIHB1dCB0aGVtIGluCisJICogdG8gdGhlIGFkanVzdGVkIG1vZGUuICBUaGUgQ1JUQyB3aWxsIGJlIHNldCB1cCBmb3IgdGhpcyBtb2RlLAorCSAqIHdpdGggdGhlIHBhbmVsIHNjYWxpbmcgc2V0IHVwIHRvIHNvdXJjZSBmcm9tIHRoZSBIL1ZEaXNwbGF5CisJICogb2YgdGhlIG9yaWdpbmFsIG1vZGUuCisJICovCisJaWYgKGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlICE9IE5VTEwpIHsKKwkJYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgPSBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXk7CisJCWFkanVzdGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0KKwkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydDsKKwkJYWRqdXN0ZWRfbW9kZS0+aHN5bmNfZW5kID0KKwkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQ7CisJCWFkanVzdGVkX21vZGUtPmh0b3RhbCA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5odG90YWw7CisJCWFkanVzdGVkX21vZGUtPnZkaXNwbGF5ID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5OworCQlhZGp1c3RlZF9tb2RlLT52c3luY19zdGFydCA9CisJCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfc3RhcnQ7CisJCWFkanVzdGVkX21vZGUtPnZzeW5jX2VuZCA9CisJCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kOworCQlhZGp1c3RlZF9tb2RlLT52dG90YWwgPSBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsOworCQlhZGp1c3RlZF9tb2RlLT5jbG9jayA9IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5jbG9jazsKKwkJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIENSVENfSU5URVJMQUNFX0hBTFZFX1YpOworCX0KKworCS8qCisJICogWFhYOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHN1cHBvcnQgbG93ZXIgcmVmcmVzaCByYXRlcyBvbiB0aGUKKwkgKiBwYW5lbHMgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uLCBhbmQgcGVyaGFwcyBtYXRjaCB0aGUKKwkgKiB1c2VyJ3MgcmVxdWVzdGVkIHJlZnJlc2ggcmF0ZS4KKwkgKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9sdmRzX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DVEwpOworCWRldl9wcml2LT5iYWNrbGlnaHRfZHV0eV9jeWNsZSA9IChkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMICYKKwkJCQkgICAgICAgQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSyk7CisKKwlpbnRlbF9sdmRzX3NldF9wb3dlcihkZXYsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfbHZkc19jb21taXQoIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmJhY2tsaWdodF9kdXR5X2N5Y2xlID09IDApCisJCWRldl9wcml2LT5iYWNrbGlnaHRfZHV0eV9jeWNsZSA9CisJCQlpbnRlbF9sdmRzX2dldF9tYXhfYmFja2xpZ2h0KGRldik7CisKKwlpbnRlbF9sdmRzX3NldF9wb3dlcihkZXYsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9sdmRzX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOworCXUzMiBwZml0X2NvbnRyb2w7CisKKwkvKgorCSAqIFRoZSBMVkRTIHBpbiBwYWlyIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gdHVybmVkIG9uIGluIHRoZQorCSAqIGludGVsX2NydGNfbW9kZV9zZXQgc2luY2UgaXQgaGFzIGEgbGFyZ2UgaW1wYWN0IG9uIHRoZSBEUExMCisJICogc2V0dGluZ3MuCisJICovCisKKwkvKgorCSAqIEVuYWJsZSBhdXRvbWF0aWMgcGFuZWwgc2NhbGluZyBzbyB0aGF0IG5vbi1uYXRpdmUgbW9kZXMgZmlsbCB0aGUKKwkgKiBzY3JlZW4uICBTaG91bGQgYmUgZW5hYmxlZCBiZWZvcmUgdGhlIHBpcGUgaXMgZW5hYmxlZCwgYWNjb3JkaW5nIHRvCisJICogcmVnaXN0ZXIgZGVzY3JpcHRpb24gYW5kIFBSTS4KKwkgKi8KKwlpZiAobW9kZS0+aGRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgfHwKKwkgICAgbW9kZS0+dmRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkpCisJCXBmaXRfY29udHJvbCA9IChQRklUX0VOQUJMRSB8IFZFUlRfQVVUT19TQ0FMRSB8CisJCQkJSE9SSVpfQVVUT19TQ0FMRSB8IFZFUlRfSU5URVJQX0JJTElORUFSIHwKKwkJCQlIT1JJWl9JTlRFUlBfQklMSU5FQVIpOworCWVsc2UKKwkJcGZpdF9jb250cm9sID0gMDsKKworCWlmICghSVNfSTk2NUcoZGV2KSkgeworCQlpZiAoZGV2X3ByaXYtPnBhbmVsX3dhbnRzX2RpdGhlcikKKwkJCXBmaXRfY29udHJvbCB8PSBQQU5FTF84VE82X0RJVEhFUl9FTkFCTEU7CisJfQorCWVsc2UKKwkJcGZpdF9jb250cm9sIHw9IGludGVsX2NydGMtPnBpcGUgPDwgUEZJVF9QSVBFX1NISUZUOworCisJSTkxNV9XUklURShQRklUX0NPTlRST0wsIHBmaXRfY29udHJvbCk7Cit9CisKKy8qKgorICogRGV0ZWN0IHRoZSBMVkRTIGNvbm5lY3Rpb24uCisgKgorICogVGhpcyBhbHdheXMgcmV0dXJucyBDT05ORUNUT1JfU1RBVFVTX0NPTk5FQ1RFRC4gIFRoaXMgY29ubmVjdG9yIHNob3VsZCBvbmx5IGhhdmUKKyAqIGJlZW4gc2V0IHVwIGlmIHRoZSBMVkRTIHdhcyBhY3R1YWxseSBjb25uZWN0ZWQgYW55d2F5LgorICovCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBpbnRlbF9sdmRzX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgRERDIG1vZGVzIGlmIGF2YWlsYWJsZSwgb3IgdGhlIEJJT1MgZml4ZWQgbW9kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfbHZkc19nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBEaWRuJ3QgZ2V0IGFuIEVESUQsIHNvCisJICogU2V0IHdpZGUgc3luYyByYW5nZXMgc28gd2UgZ2V0IGFsbCBtb2RlcworCSAqIGhhbmRlZCB0byB2YWxpZF9tb2RlIGZvciBjaGVja2luZworCSAqLworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm1pbl92ZnJlcSA9IDA7CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ubWF4X3ZmcmVxID0gMjAwOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm1pbl9oZnJlcSA9IDA7CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ubWF4X2hmcmVxID0gMjAwOworCisJaWYgKGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlICE9IE5VTEwpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlKTsKKwkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGludGVsX2x2ZHNfZGVzdHJveSAtIHVucmVnaXN0ZXIgYW5kIGZyZWUgTFZEUyBzdHJ1Y3R1cmVzCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3IgdG8gZnJlZQorICoKKyAqIFVucmVnaXN0ZXIgdGhlIEREQyBidXMgZm9yIHRoaXMgY29ubmVjdG9yIHRoZW4gZnJlZSB0aGUgZHJpdmVyIHByaXZhdGUKKyAqIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfbHZkc19kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpZiAoaW50ZWxfb3V0cHV0LT5kZGNfYnVzKQorCQlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmRkY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW50ZWxfbHZkc19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBpbnRlbF9sdmRzX2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9sdmRzX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBpbnRlbF9sdmRzX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gaW50ZWxfbHZkc19tb2RlX3NldCwKKwkuY29tbWl0ID0gaW50ZWxfbHZkc19jb21taXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGludGVsX2x2ZHNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2V0X21vZGVzID0gaW50ZWxfbHZkc19nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSBpbnRlbF9sdmRzX21vZGVfdmFsaWQsCisJLmJlc3RfZW5jb2RlciA9IGludGVsX2Jlc3RfZW5jb2RlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF9sdmRzX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuc2F2ZSA9IGludGVsX2x2ZHNfc2F2ZSwKKwkucmVzdG9yZSA9IGludGVsX2x2ZHNfcmVzdG9yZSwKKwkuZGV0ZWN0ID0gaW50ZWxfbHZkc19kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLmRlc3Ryb3kgPSBpbnRlbF9sdmRzX2Rlc3Ryb3ksCit9OworCisKK3N0YXRpYyB2b2lkIGludGVsX2x2ZHNfZW5jX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW50ZWxfbHZkc19lbmNfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBpbnRlbF9sdmRzX2VuY19kZXN0cm95LAorfTsKKworCisKKy8qKgorICogaW50ZWxfbHZkc19pbml0IC0gc2V0dXAgTFZEUyBjb25uZWN0b3JzIG9uIHRoaXMgZGV2aWNlCisgKiBAZGV2OiBkcm0gZGV2aWNlCisgKgorICogQ3JlYXRlIHRoZSBjb25uZWN0b3IsIHJlZ2lzdGVyIHRoZSBMVkRTIEREQyBidXMsIGFuZCB0cnkgdG8gZmlndXJlIG91dCB3aGF0CisgKiBtb2RlcyB3ZSBjYW4gZGlzcGxheSBvbiB0aGUgTFZEUyBwYW5lbCAoaWYgcHJlc2VudCkuCisgKi8KK3ZvaWQgaW50ZWxfbHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQ7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnNjYW47IC8qICptb2RlcywgKmJpb3NfbW9kZTsgKi8KKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJdTMyIGx2ZHM7CisJaW50IHBpcGU7CisKKwlpbnRlbF9vdXRwdXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnRlbF9vdXRwdXQpIHsKKwkJcmV0dXJuOworCX0KKworCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CisJZW5jb2RlciA9ICZpbnRlbF9vdXRwdXQtPmVuYzsKKwlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5iYXNlLCAmaW50ZWxfbHZkc19jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyk7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgJmludGVsX291dHB1dC0+ZW5jLCAmaW50ZWxfbHZkc19lbmNfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmaW50ZWxfb3V0cHV0LT5iYXNlLCAmaW50ZWxfb3V0cHV0LT5lbmMpOworCWludGVsX291dHB1dC0+dHlwZSA9IElOVEVMX09VVFBVVF9MVkRTOworCisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmaW50ZWxfbHZkc19oZWxwZXJfZnVuY3MpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF9sdmRzX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnN1YnBpeGVsX29yZGVyID0gU3ViUGl4ZWxIb3Jpem9udGFsUkdCOworCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IGZhbHNlOworCisKKwkvKgorCSAqIExWRFMgZGlzY292ZXJ5OgorCSAqIDEpIGNoZWNrIGZvciBFRElEIG9uIEREQworCSAqIDIpIGNoZWNrIGZvciBWQlQgZGF0YQorCSAqIDMpIGNoZWNrIHRvIHNlZSBpZiBMVkRTIGlzIGFscmVhZHkgb24KKwkgKiAgICBpZiBub25lIG9mIHRoZSBhYm92ZSwgbm8gcGFuZWwKKwkgKiA0KSBtYWtlIHN1cmUgbGlkIGlzIG9wZW4KKwkgKiAgICBpZiBjbG9zZWQsIGFjdCBsaWtlIGl0J3Mgbm90IHRoZXJlIGZvciBub3cKKwkgKi8KKworCS8qIFNldCB1cCB0aGUgRERDIGJ1cy4gKi8KKwlpbnRlbF9vdXRwdXQtPmRkY19idXMgPSBpbnRlbF9pMmNfY3JlYXRlKGRldiwgR1BJT0MsICJMVkRTRERDX0MiKTsKKwlpZiAoIWludGVsX291dHB1dC0+ZGRjX2J1cykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5wZGV2LT5kZXYsICJEREMgYnVzIHJlZ2lzdHJhdGlvbiAiCisJCQkgICAiZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBnZXQgdGhlIGZpeGVkIHBhbmVsIG1vZGUgZnJvbSBEREMuICBBc3N1bWUgdGhhdCB0aGUKKwkgKiBwcmVmZXJyZWQgbW9kZSBpcyB0aGUgcmlnaHQgb25lLgorCSAqLworCWludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NhbiwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCQlpZiAoc2Nhbi0+dHlwZSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEKSB7CisJCQlkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSA9CisJCQkJZHJtX21vZGVfZHVwbGljYXRlKGRldiwgc2Nhbik7CisJCQltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCQkJZ290byBvdXQ7IC8qIEZJWE1FOiBjaGVjayBmb3IgcXVpcmtzICovCisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwl9CisKKwkvKiBGYWlsZWQgdG8gZ2V0IEVESUQsIHdoYXQgYWJvdXQgVkJUPyAqLworCWlmIChkZXZfcHJpdi0+dmJ0X21vZGUpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlID0KKwkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT52YnRfbW9kZSk7CisJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IEVESUQsIHRyeSBjaGVja2luZyBpZiB0aGUgcGFuZWwgaXMgYWxyZWFkeSB0dXJuZWQKKwkgKiBvbi4gIElmIHNvLCBhc3N1bWUgdGhhdCB3aGF0ZXZlciBpcyBjdXJyZW50bHkgcHJvZ3JhbW1lZCBpcyB0aGUKKwkgKiBjb3JyZWN0IG1vZGUuCisJICovCisJbHZkcyA9IEk5MTVfUkVBRChMVkRTKTsKKwlwaXBlID0gKGx2ZHMgJiBMVkRTX1BJUEVCX1NFTEVDVCkgPyAxIDogMDsKKwljcnRjID0gaW50ZWxfZ2V0X2NydGNfZnJvbV9waXBlKGRldiwgcGlwZSk7CisKKwlpZiAoY3J0YyAmJiAobHZkcyAmIExWRFNfUE9SVF9FTikpIHsKKwkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgPSBpbnRlbF9jcnRjX21vZGVfZ2V0KGRldiwgY3J0Yyk7CisJCWlmIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnR5cGUgfD0KKwkJCQlEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJCWdvdG8gb3V0OyAvKiBGSVhNRTogY2hlY2sgZm9yIHF1aXJrcyAqLworCQl9CisJfQorCisJLyogSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIG1vZGUgYWZ0ZXIgYWxsIHRoYXQsIGdpdmUgdXAuICovCisJaWYgKCFkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkKKwkJZ290byBmYWlsZWQ7CisKKwkvKiBGSVhNRTogZGV0ZWN0IGFvcGVuICYgbWFjIG1pbmkgdHlwZSBzdHVmZiBhdXRvbWF0aWNhbGx5PyAqLworCS8qCisJICogQmxhY2tsaXN0IG1hY2hpbmVzIHdpdGggQklPU2VzIHRoYXQgbGlzdCBhbiBMVkRTIHBhbmVsIHdpdGhvdXQKKwkgKiBhY3R1YWxseSBoYXZpbmcgb25lLgorCSAqLworCWlmIChJU19JOTQ1R00oZGV2KSkgeworCQkvKiBhb3BlbiBtaW5pIHBjICovCisJCWlmIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHhhMGEwKQorCQkJZ290byBmYWlsZWQ7CisKKwkJaWYgKChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHg4MDg2KSAmJgorCQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDcyNzApKSB7CisJCQkvKiBJdCdzIGEgTWFjIE1pbmkgb3IgTWFjYm9vayBQcm8uCisJCQkgKgorCQkJICogQXBwbGUgaGFyZHdhcmUgaXMgb3V0IHRvIGdldCB1cy4gIFRoZSBtYWNib29rIHBybworCQkJICogaGFzIGEgcmVhbCBMVkRTIHBhbmVsLCBidXQgdGhlIG1hYyBtaW5pIGRvZXMgbm90LAorCQkJICogYW5kIHRoZXkgaGF2ZSB0aGUgc2FtZSBkZXZpY2UgSURzLiAgV2UnbGwKKwkJCSAqIGRpc3Rpbmd1aXNoIGJ5IHBhbmVsIHNpemUsIG9uIHRoZSBhc3N1bXB0aW9uCisJCQkgKiB0aGF0IEFwcGxlIGlzbid0IGFib3V0IHRvIG1ha2UgYW55IG1hY2hpbmVzIHdpdGggYW4KKwkJCSAqIDgwMHg2MDAgZGlzcGxheS4KKwkJCSAqLworCisJCQlpZiAoZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCAmJgorCQkJICAgIGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSA9PSA4MDAgJiYKKwkJCSAgICBkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgPT0gNjAwKSB7CisJCQkJRFJNX0RFQlVHKCJTdXNwZWN0ZWQgTWFjIE1pbmksIGlnbm9yaW5nIHRoZSBMVkRTXG4iKTsKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCX0KKwkJfQorCX0KKworCitvdXQ6CisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKKwlyZXR1cm47CisKK2ZhaWxlZDoKKwlEUk1fREVCVUcoIk5vIExWRFMgbW9kZXMgZm91bmQsIGRpc2FibGluZy5cbiIpOworCWlmIChpbnRlbF9vdXRwdXQtPmRkY19idXMpCisJCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+ZGRjX2J1cyk7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjAxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisKKy8qKgorICogaW50ZWxfZGRjX3Byb2JlCisgKgorICovCitib29sIGludGVsX2RkY19wcm9iZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpCit7CisJdTggb3V0X2J1ZltdID0geyAweDAsIDB4MH07CisJdTggYnVmWzJdOworCWludCByZXQ7CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkciA9IDB4NTAsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gb3V0X2J1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIgPSAweDUwLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZpbnRlbF9vdXRwdXQtPmRkY19idXMtPmFkYXB0ZXIsIG1zZ3MsIDIpOworCWlmIChyZXQgPT0gMikKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogaW50ZWxfZGRjX2dldF9tb2RlcyAtIGdldCBtb2RlbGlzdCBmcm9tIG1vbml0b3IKKyAqIEBjb25uZWN0b3I6IERSTSBjb25uZWN0b3IgZGV2aWNlIHRvIHVzZQorICoKKyAqIEZldGNoIHRoZSBFRElEIGluZm9ybWF0aW9uIGZyb20gQGNvbm5lY3RvciB1c2luZyB0aGUgRERDIGJ1cy4KKyAqLworaW50IGludGVsX2RkY19nZXRfbW9kZXMoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0KQoreworCXN0cnVjdCBlZGlkICplZGlkOworCWludCByZXQgPSAwOworCisJZWRpZCA9IGRybV9nZXRfZWRpZCgmaW50ZWxfb3V0cHV0LT5iYXNlLAorCQkJICAgICZpbnRlbF9vdXRwdXQtPmRkY19idXMtPmFkYXB0ZXIpOworCWlmIChlZGlkKSB7CisJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eSgmaW50ZWxfb3V0cHV0LT5iYXNlLAorCQkJCQkJCWVkaWQpOworCQlyZXQgPSBkcm1fYWRkX2VkaWRfbW9kZXMoJmludGVsX291dHB1dC0+YmFzZSwgZWRpZCk7CisJCWtmcmVlKGVkaWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiYWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMCwwICsxLDExMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICoJRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImludGVsX3Nkdm9fcmVncy5oIgorCisjdW5kZWYgU0RWT19ERUJVRworCitzdHJ1Y3QgaW50ZWxfc2R2b19wcml2IHsKKwlzdHJ1Y3QgaW50ZWxfaTJjX2NoYW4gKmkyY19idXM7CisJaW50IHNsYXZlYWRkcjsKKwlpbnQgb3V0cHV0X2RldmljZTsKKworCXUxNiBhY3RpdmVfb3V0cHV0czsKKworCXN0cnVjdCBpbnRlbF9zZHZvX2NhcHMgY2FwczsKKwlpbnQgcGl4ZWxfY2xvY2tfbWluLCBwaXhlbF9jbG9ja19tYXg7CisKKwlpbnQgc2F2ZV9zZHZvX211bHQ7CisJdTE2IHNhdmVfYWN0aXZlX291dHB1dHM7CisJc3RydWN0IGludGVsX3Nkdm9fZHRkIHNhdmVfaW5wdXRfZHRkXzEsIHNhdmVfaW5wdXRfZHRkXzI7CisJc3RydWN0IGludGVsX3Nkdm9fZHRkIHNhdmVfb3V0cHV0X2R0ZFsxNl07CisJdTMyIHNhdmVfU0RWT1g7Cit9OworCisvKioKKyAqIFdyaXRlcyB0aGUgU0RWT0Igb3IgU0RWT0Mgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGJ1dCBhbHdheXMgd3JpdGVzIGJvdGgKKyAqIFNEVk9CIGFuZCBTRFZPQyB0byB3b3JrIGFyb3VuZCBhcHBhcmVudCBoYXJkd2FyZSBpc3N1ZXMgKGFjY29yZGluZyB0bworICogY29tbWVudHMgaW4gdGhlIEJJT1MpLgorICovCitzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX3dyaXRlX3Nkdm94KHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfb3V0cHV0LT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgICAqc2R2b19wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgYnZhbCA9IHZhbCwgY3ZhbCA9IHZhbDsKKwlpbnQgaTsKKworCWlmIChzZHZvX3ByaXYtPm91dHB1dF9kZXZpY2UgPT0gU0RWT0IpIHsKKwkJY3ZhbCA9IEk5MTVfUkVBRChTRFZPQyk7CisJfSBlbHNlIHsKKwkJYnZhbCA9IEk5MTVfUkVBRChTRFZPQik7CisJfQorCS8qCisJICogV3JpdGUgdGhlIHJlZ2lzdGVycyB0d2ljZSBmb3IgbHVjay4gU29tZXRpbWVzLAorCSAqIHdyaXRpbmcgdGhlbSBvbmx5IG9uY2UgZG9lc24ndCBhcHBlYXIgdG8gJ3N0aWNrJy4KKwkgKiBUaGUgQklPUyBkb2VzIHRoaXMgdG9vLiBZYXksIG1hZ2ljCisJICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwl7CisJCUk5MTVfV1JJVEUoU0RWT0IsIGJ2YWwpOworCQlJOTE1X1JFQUQoU0RWT0IpOworCQlJOTE1X1dSSVRFKFNEVk9DLCBjdmFsKTsKKwkJSTkxNV9SRUFEKFNEVk9DKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fcmVhZF9ieXRlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwgdTggYWRkciwKKwkJCQkgdTggKmNoKQoreworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJdTggb3V0X2J1ZlsyXTsKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIgPSBzZHZvX3ByaXYtPmkyY19idXMtPnNsYXZlX2FkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gb3V0X2J1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIgPSBzZHZvX3ByaXYtPmkyY19idXMtPnNsYXZlX2FkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisKKwlvdXRfYnVmWzBdID0gYWRkcjsKKwlvdXRfYnVmWzFdID0gMDsKKworCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKCZzZHZvX3ByaXYtPmkyY19idXMtPmFkYXB0ZXIsIG1zZ3MsIDIpKSA9PSAyKQorCXsKKwkJKmNoID0gYnVmWzBdOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlEUk1fREVCVUcoImkyYyB0cmFuc2ZlciByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fd3JpdGVfYnl0ZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIGludCBhZGRyLAorCQkJCSAgdTggY2gpCit7CisJdTggb3V0X2J1ZlsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gaW50ZWxfb3V0cHV0LT5pMmNfYnVzLT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAyLAorCQkJLmJ1ZiA9IG91dF9idWYsCisJCX0KKwl9OworCisJb3V0X2J1ZlswXSA9IGFkZHI7CisJb3V0X2J1ZlsxXSA9IGNoOworCisJaWYgKGkyY190cmFuc2ZlcigmaW50ZWxfb3V0cHV0LT5pMmNfYnVzLT5hZGFwdGVyLCBtc2dzLCAxKSA9PSAxKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBTRFZPX0NNRF9OQU1FX0VOVFJZKGNtZCkge2NtZCwgI2NtZH0KKy8qKiBNYXBwaW5nIG9mIGNvbW1hbmQgbnVtYmVycyB0byBuYW1lcywgZm9yIGRlYnVnIG91dHB1dCAqLworY29uc3Qgc3RhdGljIHN0cnVjdCBfc2R2b19jbWRfbmFtZSB7CisgICAgdTggY21kOworICAgIGNoYXIgKm5hbWU7Cit9IHNkdm9fY21kX25hbWVzW10gPSB7CisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9SRVNFVCksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfREVWSUNFX0NBUFMpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZJUk1XQVJFX1JFViksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFJBSU5FRF9JTlBVVFMpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FDVElWRV9PVVRQVVRTKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BQ1RJVkVfT1VUUFVUUyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5fT1VUX01BUCksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSU5fT1VUX01BUCksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVRUQUNIRURfRElTUExBWVMpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hPVF9QTFVHX1NVUFBPUlQpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0FDVElWRV9IT1RfUExVRyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQUNUSVZFX0hPVF9QTFVHKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlRFUlJVUFRfRVZFTlRfU09VUkNFKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UQVJHRVRfSU5QVVQpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RBUkdFVF9PVVRQVVQpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09VVFBVVF9USU1JTkdTX1BBUlQxKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMiksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDEpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQyKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0NSRUFURV9QUkVGRVJSRURfSU5QVVRfVElNSU5HKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQxKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQyKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9QSVhFTF9DTE9DS19SQU5HRSksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1VUUFVUX1BJWEVMX0NMT0NLX1JBTkdFKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfQ0xPQ0tfUkFURV9NVUxUUyksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQ0xPQ0tfUkFURV9NVUxUKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DTE9DS19SQVRFX01VTFQpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9UVl9GT1JNQVRTKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9GT1JNQVQpLAorICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RWX0ZPUk1BVCksCisgICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVFZfUkVTT0xVVElPTl9TVVBQT1JUKSwKKyAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT05UUk9MX0JVU19TV0lUQ0gpLAorfTsKKworI2RlZmluZSBTRFZPX05BTUUoZGV2X3ByaXYpICgoZGV2X3ByaXYpLT5vdXRwdXRfZGV2aWNlID09IFNEVk9CID8gIlNEVk9CIiA6ICJTRFZPQyIpCisjZGVmaW5lIFNEVk9fUFJJVihvdXRwdXQpICAgKChzdHJ1Y3QgaW50ZWxfc2R2b19wcml2ICopIChvdXRwdXQpLT5kZXZfcHJpdikKKworI2lmZGVmIFNEVk9fREVCVUcKK3N0YXRpYyB2b2lkIGludGVsX3Nkdm9fZGVidWdfd3JpdGUoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LCB1OCBjbWQsCisJCQkJICAgdm9pZCAqYXJncywgaW50IGFyZ3NfbGVuKQoreworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJaW50IGk7CisKKwlEUk1fREVCVUcoIiVzOiBXOiAlMDJYICIsIFNEVk9fTkFNRShzZHZvX3ByaXYpLCBjbWQpOworCWZvciAoaSA9IDA7IGkgPCBhcmdzX2xlbjsgaSsrKQorCQlwcmludGsoIiUwMlggIiwgKCh1OCAqKWFyZ3MpW2ldKTsKKwlmb3IgKDsgaSA8IDg7IGkrKykKKwkJcHJpbnRrKCIgICAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNkdm9fY21kX25hbWVzKSAvIHNpemVvZihzZHZvX2NtZF9uYW1lc1swXSk7IGkrKykgeworCQlpZiAoY21kID09IHNkdm9fY21kX25hbWVzW2ldLmNtZCkgeworCQkJcHJpbnRrKCIoJXMpIiwgc2R2b19jbWRfbmFtZXNbaV0ubmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBzaXplb2Yoc2R2b19jbWRfbmFtZXMpLyBzaXplb2Yoc2R2b19jbWRfbmFtZXNbMF0pKQorCQlwcmludGsoIiglMDJYKSIsY21kKTsKKwlwcmludGsoIlxuIik7Cit9CisjZWxzZQorI2RlZmluZSBpbnRlbF9zZHZvX2RlYnVnX3dyaXRlKG8sIGMsIGEsIGwpCisjZW5kaWYKKworc3RhdGljIHZvaWQgaW50ZWxfc2R2b193cml0ZV9jbWQoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LCB1OCBjbWQsCisJCQkJIHZvaWQgKmFyZ3MsIGludCBhcmdzX2xlbikKK3sKKwlpbnQgaTsKKworCWludGVsX3Nkdm9fZGVidWdfd3JpdGUoaW50ZWxfb3V0cHV0LCBjbWQsIGFyZ3MsIGFyZ3NfbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdzX2xlbjsgaSsrKSB7CisJCWludGVsX3Nkdm9fd3JpdGVfYnl0ZShpbnRlbF9vdXRwdXQsIFNEVk9fSTJDX0FSR18wIC0gaSwKKwkJCQkgICAgICAoKHU4KilhcmdzKVtpXSk7CisJfQorCisJaW50ZWxfc2R2b193cml0ZV9ieXRlKGludGVsX291dHB1dCwgU0RWT19JMkNfT1BDT0RFLCBjbWQpOworfQorCisjaWZkZWYgU0RWT19ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9zdGF0dXNfbmFtZXNbXSA9IHsKKwkiUG93ZXIgb24iLAorCSJTdWNjZXNzIiwKKwkiTm90IHN1cHBvcnRlZCIsCisJIkludmFsaWQgYXJnIiwKKwkiUGVuZGluZyIsCisJIlRhcmdldCBub3Qgc3BlY2lmaWVkIiwKKwkiU2NhbGluZyBub3Qgc3VwcG9ydGVkIgorfTsKKworc3RhdGljIHZvaWQgaW50ZWxfc2R2b19kZWJ1Z19yZXNwb25zZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJICAgICAgdm9pZCAqcmVzcG9uc2UsIGludCByZXNwb25zZV9sZW4sCisJCQkJICAgICAgdTggc3RhdHVzKQoreworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwlEUk1fREVCVUcoIiVzOiBSOiAiLCBTRFZPX05BTUUoc2R2b19wcml2KSk7CisJZm9yIChpID0gMDsgaSA8IHJlc3BvbnNlX2xlbjsgaSsrKQorCQlwcmludGsoIiUwMlggIiwgKCh1OCAqKXJlc3BvbnNlKVtpXSk7CisJZm9yICg7IGkgPCA4OyBpKyspCisJCXByaW50aygiICAgIik7CisJaWYgKHN0YXR1cyA8PSBTRFZPX0NNRF9TVEFUVVNfU0NBTElOR19OT1RfU1VQUCkKKwkJcHJpbnRrKCIoJXMpIiwgY21kX3N0YXR1c19uYW1lc1tzdGF0dXNdKTsKKwllbHNlCisJCXByaW50aygiKD8/PyAlZCkiLCBzdGF0dXMpOworCXByaW50aygiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGludGVsX3Nkdm9fZGVidWdfcmVzcG9uc2UobywgciwgbCwgcykKKyNlbmRpZgorCitzdGF0aWMgdTggaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKKwkJCQkgICB2b2lkICpyZXNwb25zZSwgaW50IHJlc3BvbnNlX2xlbikKK3sKKwlpbnQgaTsKKwl1OCBzdGF0dXM7CisJdTggcmV0cnkgPSA1MDsKKworCXdoaWxlIChyZXRyeS0tKSB7CisJCS8qIFJlYWQgdGhlIGNvbW1hbmQgcmVzcG9uc2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IHJlc3BvbnNlX2xlbjsgaSsrKSB7CisJCQlpbnRlbF9zZHZvX3JlYWRfYnl0ZShpbnRlbF9vdXRwdXQsCisJCQkJCSAgICAgU0RWT19JMkNfUkVUVVJOXzAgKyBpLAorCQkJCQkgICAgICYoKHU4ICopcmVzcG9uc2UpW2ldKTsKKwkJfQorCisJCS8qIHJlYWQgdGhlIHJldHVybiBzdGF0dXMgKi8KKwkJaW50ZWxfc2R2b19yZWFkX2J5dGUoaW50ZWxfb3V0cHV0LCBTRFZPX0kyQ19DTURfU1RBVFVTLAorCQkJCSAgICAgJnN0YXR1cyk7CisKKwkJaW50ZWxfc2R2b19kZWJ1Z19yZXNwb25zZShpbnRlbF9vdXRwdXQsIHJlc3BvbnNlLCByZXNwb25zZV9sZW4sCisJCQkJCSAgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAhPSBTRFZPX0NNRF9TVEFUVVNfUEVORElORykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJbWRlbGF5KDUwKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGludGVsX3Nkdm9fZ2V0X3BpeGVsX211bHRpcGxpZXIoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKG1vZGUtPmNsb2NrID49IDEwMDAwMCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAobW9kZS0+Y2xvY2sgPj0gNTAwMDApCisJCXJldHVybiAyOworCWVsc2UKKwkJcmV0dXJuIDQ7Cit9CisKKy8qKgorICogRG9uJ3QgY2hlY2sgc3RhdHVzIGNvZGUgZnJvbSB0aGlzIGFzIGl0IHN3aXRjaGVzIHRoZSBidXMgYmFjayB0byB0aGUKKyAqIFNEVk8gY2hpcHMgd2hpY2ggZGVmZWF0cyB0aGUgcHVycG9zZSBvZiBkb2luZyBhIGJ1cyBzd2l0Y2ggaW4gdGhlIGZpcnN0CisgKiBwbGFjZS4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfc2R2b19zZXRfY29udHJvbF9idXNfc3dpdGNoKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKKwkJCQkJICAgICAgdTggdGFyZ2V0KQoreworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfU0VUX0NPTlRST0xfQlVTX1NXSVRDSCwgJnRhcmdldCwgMSk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dChzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIGJvb2wgdGFyZ2V0XzAsIGJvb2wgdGFyZ2V0XzEpCit7CisJc3RydWN0IGludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dF9hcmdzIHRhcmdldHMgPSB7MH07CisJdTggc3RhdHVzOworCisJaWYgKHRhcmdldF8wICYmIHRhcmdldF8xKQorCQlyZXR1cm4gU0RWT19DTURfU1RBVFVTX05PVFNVUFA7CisKKwlpZiAodGFyZ2V0XzEpCisJCXRhcmdldHMudGFyZ2V0XzEgPSAxOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9TRVRfVEFSR0VUX0lOUFVULCAmdGFyZ2V0cywKKwkJCSAgICAgc2l6ZW9mKHRhcmdldHMpKTsKKworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIE5VTEwsIDApOworCisJcmV0dXJuIChzdGF0dXMgPT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpOworfQorCisvKioKKyAqIFJldHVybiB3aGV0aGVyIGVhY2ggaW5wdXQgaXMgdHJhaW5lZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1ha2luZyBhbiBhc3N1bXB0aW9uIGFib3V0IHRoZSBsYXlvdXQgb2YgdGhlIHJlc3BvbnNlLAorICogd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZG9jcy4KKyAqLworc3RhdGljIGJvb2wgaW50ZWxfc2R2b19nZXRfdHJhaW5lZF9pbnB1dHMoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LCBib29sICppbnB1dF8xLCBib29sICppbnB1dF8yKQoreworCXN0cnVjdCBpbnRlbF9zZHZvX2dldF90cmFpbmVkX2lucHV0c19yZXNwb25zZSByZXNwb25zZTsKKwl1OCBzdGF0dXM7CisKKwlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIFNEVk9fQ01EX0dFVF9UUkFJTkVEX0lOUFVUUywgTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqaW5wdXRfMSA9IHJlc3BvbnNlLmlucHV0MF90cmFpbmVkOworCSppbnB1dF8yID0gcmVzcG9uc2UuaW5wdXQxX3RyYWluZWQ7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fZ2V0X2FjdGl2ZV9vdXRwdXRzKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKKwkJCQkJICB1MTYgKm91dHB1dHMpCit7CisJdTggc3RhdHVzOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9HRVRfQUNUSVZFX09VVFBVVFMsIE5VTEwsIDApOworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIG91dHB1dHMsIHNpemVvZigqb3V0cHV0cykpOworCisJcmV0dXJuIChzdGF0dXMgPT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9zZHZvX3NldF9hY3RpdmVfb3V0cHV0cyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCSAgdTE2IG91dHB1dHMpCit7CisJdTggc3RhdHVzOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9TRVRfQUNUSVZFX09VVFBVVFMsICZvdXRwdXRzLAorCQkJICAgICBzaXplb2Yob3V0cHV0cykpOworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIE5VTEwsIDApOworCXJldHVybiAoc3RhdHVzID09IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKTsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfc2R2b19zZXRfZW5jb2Rlcl9wb3dlcl9zdGF0ZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCSAgICAgICBpbnQgbW9kZSkKK3sKKwl1OCBzdGF0dXMsIHN0YXRlID0gU0RWT19FTkNPREVSX1NUQVRFX09OOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQlzdGF0ZSA9IFNEVk9fRU5DT0RFUl9TVEFURV9PTjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCXN0YXRlID0gU0RWT19FTkNPREVSX1NUQVRFX1NUQU5EQlk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQlzdGF0ZSA9IFNEVk9fRU5DT0RFUl9TVEFURV9TVVNQRU5EOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQlzdGF0ZSA9IFNEVk9fRU5DT0RFUl9TVEFURV9PRkY7CisJCWJyZWFrOworCX0KKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfU0VUX0VOQ09ERVJfUE9XRVJfU1RBVEUsICZzdGF0ZSwKKwkJCSAgICAgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgTlVMTCwgMCk7CisKKwlyZXR1cm4gKHN0YXR1cyA9PSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fZ2V0X2lucHV0X3BpeGVsX2Nsb2NrX3JhbmdlKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKKwkJCQkJCSAgIGludCAqY2xvY2tfbWluLAorCQkJCQkJICAgaW50ICpjbG9ja19tYXgpCit7CisJc3RydWN0IGludGVsX3Nkdm9fcGl4ZWxfY2xvY2tfcmFuZ2UgY2xvY2tzOworCXU4IHN0YXR1czsKKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfR0VUX0lOUFVUX1BJWEVMX0NMT0NLX1JBTkdFLAorCQkJICAgICBOVUxMLCAwKTsKKworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsICZjbG9ja3MsIHNpemVvZihjbG9ja3MpKTsKKworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENvbnZlcnQgdGhlIHZhbHVlcyBmcm9tIHVuaXRzIG9mIDEwIGtIeiB0byBrSHouICovCisJKmNsb2NrX21pbiA9IGNsb2Nrcy5taW4gKiAxMDsKKwkqY2xvY2tfbWF4ID0gY2xvY2tzLm1heCAqIDEwOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fc2V0X3RhcmdldF9vdXRwdXQoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LAorCQkJCQkgdTE2IG91dHB1dHMpCit7CisJdTggc3RhdHVzOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9TRVRfVEFSR0VUX09VVFBVVCwgJm91dHB1dHMsCisJCQkgICAgIHNpemVvZihvdXRwdXRzKSk7CisKKwlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LCBOVUxMLCAwKTsKKwlyZXR1cm4gKHN0YXR1cyA9PSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fZ2V0X3RpbWluZyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIHU4IGNtZCwKKwkJCQkgIHN0cnVjdCBpbnRlbF9zZHZvX2R0ZCAqZHRkKQoreworCXU4IHN0YXR1czsKKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgY21kLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LCAmZHRkLT5wYXJ0MSwKKwkJCQkJICBzaXplb2YoZHRkLT5wYXJ0MSkpOworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgY21kICsgMSwgTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJmR0ZC0+cGFydDIsCisJCQkJCSAgc2l6ZW9mKGR0ZC0+cGFydDIpKTsKKwlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfc2R2b19nZXRfaW5wdXRfdGltaW5nKHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCwKKwkJCQkJIHN0cnVjdCBpbnRlbF9zZHZvX2R0ZCAqZHRkKQoreworCXJldHVybiBpbnRlbF9zZHZvX2dldF90aW1pbmcoaW50ZWxfb3V0cHV0LAorCQkJCSAgICAgU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEsIGR0ZCk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fZ2V0X291dHB1dF90aW1pbmcoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LAorCQkJCQkgc3RydWN0IGludGVsX3Nkdm9fZHRkICpkdGQpCit7CisJcmV0dXJuIGludGVsX3Nkdm9fZ2V0X3RpbWluZyhpbnRlbF9vdXRwdXQsCisJCQkJICAgICBTRFZPX0NNRF9HRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDEsIGR0ZCk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fc2V0X3RpbWluZyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIHU4IGNtZCwKKwkJCQkgIHN0cnVjdCBpbnRlbF9zZHZvX2R0ZCAqZHRkKQoreworCXU4IHN0YXR1czsKKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgY21kLCAmZHRkLT5wYXJ0MSwgc2l6ZW9mKGR0ZC0+cGFydDEpKTsKKwlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LCBOVUxMLCAwKTsKKwlpZiAoc3RhdHVzICE9IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIGNtZCArIDEsICZkdGQtPnBhcnQyLCBzaXplb2YoZHRkLT5wYXJ0MikpOworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIE5VTEwsIDApOworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9zZHZvX3NldF9pbnB1dF90aW1pbmcoc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0LAorCQkJCQkgc3RydWN0IGludGVsX3Nkdm9fZHRkICpkdGQpCit7CisJcmV0dXJuIGludGVsX3Nkdm9fc2V0X3RpbWluZyhpbnRlbF9vdXRwdXQsCisJCQkJICAgICBTRFZPX0NNRF9TRVRfSU5QVVRfVElNSU5HU19QQVJUMSwgZHRkKTsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfc2R2b19zZXRfb3V0cHV0X3RpbWluZyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsCisJCQkJCSBzdHJ1Y3QgaW50ZWxfc2R2b19kdGQgKmR0ZCkKK3sKKwlyZXR1cm4gaW50ZWxfc2R2b19zZXRfdGltaW5nKGludGVsX291dHB1dCwKKwkJCQkgICAgIFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMSwgZHRkKTsKK30KKworCitzdGF0aWMgaW50IGludGVsX3Nkdm9fZ2V0X2Nsb2NrX3JhdGVfbXVsdChzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpCit7CisJdTggcmVzcG9uc2UsIHN0YXR1czsKKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfR0VUX0NMT0NLX1JBVEVfTVVMVCwgTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCAxKTsKKworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJRFJNX0RFQlVHKCJDb3VsZG4ndCBnZXQgU0RWTyBjbG9jayByYXRlIG11bHRpcGxpZXJcbiIpOworCQlyZXR1cm4gU0RWT19DTE9DS19SQVRFX01VTFRfMVg7CisJfSBlbHNlIHsKKwkJRFJNX0RFQlVHKCJDdXJyZW50IGNsb2NrIHJhdGUgbXVsdGlwbGllcjogJWRcbiIsIHJlc3BvbnNlKTsKKwl9CisKKwlyZXR1cm4gcmVzcG9uc2U7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fc2V0X2Nsb2NrX3JhdGVfbXVsdChzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIHU4IHZhbCkKK3sKKwl1OCBzdGF0dXM7CisKKwlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIFNEVk9fQ01EX1NFVF9DTE9DS19SQVRFX01VTFQsICZ2YWwsIDEpOworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIE5VTEwsIDApOworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9zZHZvX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwkvKiBNYWtlIHRoZSBDUlRDIGNvZGUgZmFjdG9yIGluIHRoZSBTRFZPIHBpeGVsIG11bHRpcGxpZXIuICBUaGUgU0RWTworCSAqIGRldmljZSB3aWxsIGJlIHRvbGQgb2YgdGhlIG11bHRpcGxpZXIgZHVyaW5nIG1vZGVfc2V0LgorCSAqLworCWFkanVzdGVkX21vZGUtPmNsb2NrICo9IGludGVsX3Nkdm9fZ2V0X3BpeGVsX211bHRpcGxpZXIobW9kZSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3Nkdm9fbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSBlbmNfdG9faW50ZWxfb3V0cHV0KGVuY29kZXIpOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJdTE2IHdpZHRoLCBoZWlnaHQ7CisJdTE2IGhfYmxhbmtfbGVuLCBoX3N5bmNfbGVuLCB2X2JsYW5rX2xlbiwgdl9zeW5jX2xlbjsKKwl1MTYgaF9zeW5jX29mZnNldCwgdl9zeW5jX29mZnNldDsKKwl1MzIgc2R2b3g7CisJc3RydWN0IGludGVsX3Nkdm9fZHRkIG91dHB1dF9kdGQ7CisJaW50IHNkdm9fcGl4ZWxfbXVsdGlwbHk7CisKKwlpZiAoIW1vZGUpCisJCXJldHVybjsKKworCXdpZHRoID0gbW9kZS0+Y3J0Y19oZGlzcGxheTsKKwloZWlnaHQgPSBtb2RlLT5jcnRjX3ZkaXNwbGF5OworCisJLyogZG8gc29tZSBtb2RlIHRyYW5zbGF0aW9ucyAqLworCWhfYmxhbmtfbGVuID0gbW9kZS0+Y3J0Y19oYmxhbmtfZW5kIC0gbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQ7CisJaF9zeW5jX2xlbiA9IG1vZGUtPmNydGNfaHN5bmNfZW5kIC0gbW9kZS0+Y3J0Y19oc3luY19zdGFydDsKKworCXZfYmxhbmtfbGVuID0gbW9kZS0+Y3J0Y192YmxhbmtfZW5kIC0gbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQ7CisJdl9zeW5jX2xlbiA9IG1vZGUtPmNydGNfdnN5bmNfZW5kIC0gbW9kZS0+Y3J0Y192c3luY19zdGFydDsKKworCWhfc3luY19vZmZzZXQgPSBtb2RlLT5jcnRjX2hzeW5jX3N0YXJ0IC0gbW9kZS0+Y3J0Y19oYmxhbmtfc3RhcnQ7CisJdl9zeW5jX29mZnNldCA9IG1vZGUtPmNydGNfdnN5bmNfc3RhcnQgLSBtb2RlLT5jcnRjX3ZibGFua19zdGFydDsKKworCW91dHB1dF9kdGQucGFydDEuY2xvY2sgPSBtb2RlLT5jbG9jayAvIDEwOworCW91dHB1dF9kdGQucGFydDEuaF9hY3RpdmUgPSB3aWR0aCAmIDB4ZmY7CisJb3V0cHV0X2R0ZC5wYXJ0MS5oX2JsYW5rID0gaF9ibGFua19sZW4gJiAweGZmOworCW91dHB1dF9kdGQucGFydDEuaF9oaWdoID0gKCgod2lkdGggPj4gOCkgJiAweGYpIDw8IDQpIHwKKwkJKChoX2JsYW5rX2xlbiA+PiA4KSAmIDB4Zik7CisJb3V0cHV0X2R0ZC5wYXJ0MS52X2FjdGl2ZSA9IGhlaWdodCAmIDB4ZmY7CisJb3V0cHV0X2R0ZC5wYXJ0MS52X2JsYW5rID0gdl9ibGFua19sZW4gJiAweGZmOworCW91dHB1dF9kdGQucGFydDEudl9oaWdoID0gKCgoaGVpZ2h0ID4+IDgpICYgMHhmKSA8PCA0KSB8CisJCSgodl9ibGFua19sZW4gPj4gOCkgJiAweGYpOworCisJb3V0cHV0X2R0ZC5wYXJ0Mi5oX3N5bmNfb2ZmID0gaF9zeW5jX29mZnNldDsKKwlvdXRwdXRfZHRkLnBhcnQyLmhfc3luY193aWR0aCA9IGhfc3luY19sZW4gJiAweGZmOworCW91dHB1dF9kdGQucGFydDIudl9zeW5jX29mZl93aWR0aCA9ICh2X3N5bmNfb2Zmc2V0ICYgMHhmKSA8PCA0IHwKKwkJKHZfc3luY19sZW4gJiAweGYpOworCW91dHB1dF9kdGQucGFydDIuc3luY19vZmZfd2lkdGhfaGlnaCA9ICgoaF9zeW5jX29mZnNldCAmIDB4MzAwKSA+PiAyKSB8CisJCSgoaF9zeW5jX2xlbiAmIDB4MzAwKSA+PiA0KSB8ICgodl9zeW5jX29mZnNldCAmIDB4MzApID4+IDIpIHwKKwkJKCh2X3N5bmNfbGVuICYgMHgzMCkgPj4gNCk7CisKKwlvdXRwdXRfZHRkLnBhcnQyLmR0ZF9mbGFncyA9IDB4MTg7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCW91dHB1dF9kdGQucGFydDIuZHRkX2ZsYWdzIHw9IDB4MjsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJb3V0cHV0X2R0ZC5wYXJ0Mi5kdGRfZmxhZ3MgfD0gMHg0OworCisJb3V0cHV0X2R0ZC5wYXJ0Mi5zZHZvX2ZsYWdzID0gMDsKKwlvdXRwdXRfZHRkLnBhcnQyLnZfc3luY19vZmZfaGlnaCA9IHZfc3luY19vZmZzZXQgJiAweGMwOworCW91dHB1dF9kdGQucGFydDIucmVzZXJ2ZWQgPSAwOworCisJLyogU2V0IHRoZSBvdXRwdXQgdGltaW5nIHRvIHRoZSBzY3JlZW4gKi8KKwlpbnRlbF9zZHZvX3NldF90YXJnZXRfb3V0cHV0KGludGVsX291dHB1dCwgc2R2b19wcml2LT5hY3RpdmVfb3V0cHV0cyk7CisJaW50ZWxfc2R2b19zZXRfb3V0cHV0X3RpbWluZyhpbnRlbF9vdXRwdXQsICZvdXRwdXRfZHRkKTsKKworCS8qIFNldCB0aGUgaW5wdXQgdGltaW5nIHRvIHRoZSBzY3JlZW4uIEFzc3VtZSBhbHdheXMgaW5wdXQgMC4gKi8KKwlpbnRlbF9zZHZvX3NldF90YXJnZXRfaW5wdXQoaW50ZWxfb3V0cHV0LCB0cnVlLCBmYWxzZSk7CisKKwkvKiBXZSB3b3VsZCBsaWtlIHRvIHVzZSBpODMwX3Nkdm9fY3JlYXRlX3ByZWZlcnJlZF9pbnB1dF90aW1pbmcoKSB0bworCSAqIHByb3ZpZGUgdGhlIGRldmljZSB3aXRoIGEgdGltaW5nIGl0IGNhbiBzdXBwb3J0LCBpZiBpdCBzdXBwb3J0cyB0aGF0CisJICogZmVhdHVyZS4gIEhvd2V2ZXIsIHByZXN1bWFibHkgd2Ugd291bGQgbmVlZCB0byBhZGp1c3QgdGhlIENSVEMgdG8KKwkgKiBvdXRwdXQgdGhlIHByZWZlcnJlZCB0aW1pbmcsIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgY3VycmVudGx5LgorCSAqLworCWludGVsX3Nkdm9fc2V0X2lucHV0X3RpbWluZyhpbnRlbF9vdXRwdXQsICZvdXRwdXRfZHRkKTsKKworCXN3aXRjaCAoaW50ZWxfc2R2b19nZXRfcGl4ZWxfbXVsdGlwbGllcihtb2RlKSkgeworCWNhc2UgMToKKwkJaW50ZWxfc2R2b19zZXRfY2xvY2tfcmF0ZV9tdWx0KGludGVsX291dHB1dCwKKwkJCQkJICAgICAgIFNEVk9fQ0xPQ0tfUkFURV9NVUxUXzFYKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbnRlbF9zZHZvX3NldF9jbG9ja19yYXRlX211bHQoaW50ZWxfb3V0cHV0LAorCQkJCQkgICAgICAgU0RWT19DTE9DS19SQVRFX01VTFRfMlgpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWludGVsX3Nkdm9fc2V0X2Nsb2NrX3JhdGVfbXVsdChpbnRlbF9vdXRwdXQsCisJCQkJCSAgICAgICBTRFZPX0NMT0NLX1JBVEVfTVVMVF80WCk7CisJCWJyZWFrOworCX0KKworCS8qIFNldCB0aGUgU0RWTyBjb250cm9sIHJlZ3MuICovCisgICAgICAgIGlmICgwLypJU19JOTY1R00oZGV2KSovKSB7CisgICAgICAgICAgICAgICAgc2R2b3ggPSBTRFZPX0JPUkRFUl9FTkFCTEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2R2b3ggPSBJOTE1X1JFQUQoc2R2b19wcml2LT5vdXRwdXRfZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNkdm9fcHJpdi0+b3V0cHV0X2RldmljZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0RWT0I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZHZveCAmPSBTRFZPQl9QUkVTRVJWRV9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRFZPQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNkdm94ICY9IFNEVk9DX1BSRVNFUlZFX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2R2b3ggfD0gKDkgPDwgMTkpIHwgU0RWT19CT1JERVJfRU5BQkxFOworICAgICAgICB9CisJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMSkKKwkJc2R2b3ggfD0gU0RWT19QSVBFX0JfU0VMRUNUOworCisJc2R2b19waXhlbF9tdWx0aXBseSA9IGludGVsX3Nkdm9fZ2V0X3BpeGVsX211bHRpcGxpZXIobW9kZSk7CisJaWYgKElTX0k5NjVHKGRldikpIHsKKwkJLyogZG9uZSBpbiBjcnRjX21vZGVfc2V0IGFzIHRoZSBkcGxsX21kIHJlZyBtdXN0IGJlIHdyaXR0ZW4KKwkJICAgZWFybHkgKi8KKwl9IGVsc2UgaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikpIHsKKwkJLyogZG9uZSBpbiBjcnRjX21vZGVfc2V0IGFzIGl0IGxpdmVzIGluc2lkZSB0aGUKKwkJICAgZHBsbCByZWdpc3RlciAqLworCX0gZWxzZSB7CisJCXNkdm94IHw9IChzZHZvX3BpeGVsX211bHRpcGx5IC0gMSkgPDwgU0RWT19QT1JUX01VTFRJUExZX1NISUZUOworCX0KKworCWludGVsX3Nkdm9fd3JpdGVfc2R2b3goaW50ZWxfb3V0cHV0LCBzZHZveCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3Nkdm9fZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSBlbmNfdG9faW50ZWxfb3V0cHV0KGVuY29kZXIpOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJdTMyIHRlbXA7CisKKwlpZiAobW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCWludGVsX3Nkdm9fc2V0X2FjdGl2ZV9vdXRwdXRzKGludGVsX291dHB1dCwgMCk7CisJCWlmICgwKQorCQkJaW50ZWxfc2R2b19zZXRfZW5jb2Rlcl9wb3dlcl9zdGF0ZShpbnRlbF9vdXRwdXQsIG1vZGUpOworCisJCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT0ZGKSB7CisJCQl0ZW1wID0gSTkxNV9SRUFEKHNkdm9fcHJpdi0+b3V0cHV0X2RldmljZSk7CisJCQlpZiAoKHRlbXAgJiBTRFZPX0VOQUJMRSkgIT0gMCkgeworCQkJCWludGVsX3Nkdm9fd3JpdGVfc2R2b3goaW50ZWxfb3V0cHV0LCB0ZW1wICYgflNEVk9fRU5BQkxFKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWJvb2wgaW5wdXQxLCBpbnB1dDI7CisJCWludCBpOworCQl1OCBzdGF0dXM7CisKKwkJdGVtcCA9IEk5MTVfUkVBRChzZHZvX3ByaXYtPm91dHB1dF9kZXZpY2UpOworCQlpZiAoKHRlbXAgJiBTRFZPX0VOQUJMRSkgPT0gMCkKKwkJCWludGVsX3Nkdm9fd3JpdGVfc2R2b3goaW50ZWxfb3V0cHV0LCB0ZW1wIHwgU0RWT19FTkFCTEUpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkgIGludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJCXN0YXR1cyA9IGludGVsX3Nkdm9fZ2V0X3RyYWluZWRfaW5wdXRzKGludGVsX291dHB1dCwgJmlucHV0MSwKKwkJCQkJCSAgICAgICAmaW5wdXQyKTsKKworCisJCS8qIFdhcm4gaWYgdGhlIGRldmljZSByZXBvcnRlZCBmYWlsdXJlIHRvIHN5bmMuCisJCSAqIEEgbG90IG9mIFNEVk8gZGV2aWNlcyBmYWlsIHRvIG5vdGlmeSBvZiBzeW5jLCBidXQgaXQncworCQkgKiBhIGdpdmVuIGl0IHRoZSBzdGF0dXMgaXMgYSBzdWNjZXNzLCB3ZSBzdWNjZWVkZWQuCisJCSAqLworCQlpZiAoc3RhdHVzID09IFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTICYmICFpbnB1dDEpIHsKKwkJCURSTV9ERUJVRygiRmlyc3QgJXMgb3V0cHV0IHJlcG9ydGVkIGZhaWx1cmUgdG8gc3luY1xuIiwKKwkJCQkgICBTRFZPX05BTUUoc2R2b19wcml2KSk7CisJCX0KKworCQlpZiAoMCkKKwkJCWludGVsX3Nkdm9fc2V0X2VuY29kZXJfcG93ZXJfc3RhdGUoaW50ZWxfb3V0cHV0LCBtb2RlKTsKKwkJaW50ZWxfc2R2b19zZXRfYWN0aXZlX291dHB1dHMoaW50ZWxfb3V0cHV0LCBzZHZvX3ByaXYtPmFjdGl2ZV9vdXRwdXRzKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfc2R2b19wcml2ICpzZHZvX3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCWludCBvOworCisJc2R2b19wcml2LT5zYXZlX3Nkdm9fbXVsdCA9IGludGVsX3Nkdm9fZ2V0X2Nsb2NrX3JhdGVfbXVsdChpbnRlbF9vdXRwdXQpOworCWludGVsX3Nkdm9fZ2V0X2FjdGl2ZV9vdXRwdXRzKGludGVsX291dHB1dCwgJnNkdm9fcHJpdi0+c2F2ZV9hY3RpdmVfb3V0cHV0cyk7CisKKwlpZiAoc2R2b19wcml2LT5jYXBzLnNkdm9faW5wdXRzX21hc2sgJiAweDEpIHsKKwkJaW50ZWxfc2R2b19zZXRfdGFyZ2V0X2lucHV0KGludGVsX291dHB1dCwgdHJ1ZSwgZmFsc2UpOworCQlpbnRlbF9zZHZvX2dldF9pbnB1dF90aW1pbmcoaW50ZWxfb3V0cHV0LAorCQkJCQkgICAgJnNkdm9fcHJpdi0+c2F2ZV9pbnB1dF9kdGRfMSk7CisJfQorCisJaWYgKHNkdm9fcHJpdi0+Y2Fwcy5zZHZvX2lucHV0c19tYXNrICYgMHgyKSB7CisJCWludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dChpbnRlbF9vdXRwdXQsIGZhbHNlLCB0cnVlKTsKKwkJaW50ZWxfc2R2b19nZXRfaW5wdXRfdGltaW5nKGludGVsX291dHB1dCwKKwkJCQkJICAgICZzZHZvX3ByaXYtPnNhdmVfaW5wdXRfZHRkXzIpOworCX0KKworCWZvciAobyA9IFNEVk9fT1VUUFVUX0ZJUlNUOyBvIDw9IFNEVk9fT1VUUFVUX0xBU1Q7IG8rKykKKwl7CisJICAgICAgICB1MTYgIHRoaXNfb3V0cHV0ID0gKDEgPDwgbyk7CisJCWlmIChzZHZvX3ByaXYtPmNhcHMub3V0cHV0X2ZsYWdzICYgdGhpc19vdXRwdXQpCisJCXsKKwkJCWludGVsX3Nkdm9fc2V0X3RhcmdldF9vdXRwdXQoaW50ZWxfb3V0cHV0LCB0aGlzX291dHB1dCk7CisJCQlpbnRlbF9zZHZvX2dldF9vdXRwdXRfdGltaW5nKGludGVsX291dHB1dCwKKwkJCQkJCSAgICAgJnNkdm9fcHJpdi0+c2F2ZV9vdXRwdXRfZHRkW29dKTsKKwkJfQorCX0KKworCXNkdm9fcHJpdi0+c2F2ZV9TRFZPWCA9IEk5MTVfUkVBRChzZHZvX3ByaXYtPm91dHB1dF9kZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfc2R2b19wcml2ICpzZHZvX3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCWludCBvOworCWludCBpOworCWJvb2wgaW5wdXQxLCBpbnB1dDI7CisJdTggc3RhdHVzOworCisJaW50ZWxfc2R2b19zZXRfYWN0aXZlX291dHB1dHMoaW50ZWxfb3V0cHV0LCAwKTsKKworCWZvciAobyA9IFNEVk9fT1VUUFVUX0ZJUlNUOyBvIDw9IFNEVk9fT1VUUFVUX0xBU1Q7IG8rKykKKwl7CisJCXUxNiAgdGhpc19vdXRwdXQgPSAoMSA8PCBvKTsKKwkJaWYgKHNkdm9fcHJpdi0+Y2Fwcy5vdXRwdXRfZmxhZ3MgJiB0aGlzX291dHB1dCkgeworCQkJaW50ZWxfc2R2b19zZXRfdGFyZ2V0X291dHB1dChpbnRlbF9vdXRwdXQsIHRoaXNfb3V0cHV0KTsKKwkJCWludGVsX3Nkdm9fc2V0X291dHB1dF90aW1pbmcoaW50ZWxfb3V0cHV0LCAmc2R2b19wcml2LT5zYXZlX291dHB1dF9kdGRbb10pOworCQl9CisJfQorCisJaWYgKHNkdm9fcHJpdi0+Y2Fwcy5zZHZvX2lucHV0c19tYXNrICYgMHgxKSB7CisJCWludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dChpbnRlbF9vdXRwdXQsIHRydWUsIGZhbHNlKTsKKwkJaW50ZWxfc2R2b19zZXRfaW5wdXRfdGltaW5nKGludGVsX291dHB1dCwgJnNkdm9fcHJpdi0+c2F2ZV9pbnB1dF9kdGRfMSk7CisJfQorCisJaWYgKHNkdm9fcHJpdi0+Y2Fwcy5zZHZvX2lucHV0c19tYXNrICYgMHgyKSB7CisJCWludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dChpbnRlbF9vdXRwdXQsIGZhbHNlLCB0cnVlKTsKKwkJaW50ZWxfc2R2b19zZXRfaW5wdXRfdGltaW5nKGludGVsX291dHB1dCwgJnNkdm9fcHJpdi0+c2F2ZV9pbnB1dF9kdGRfMik7CisJfQorCisJaW50ZWxfc2R2b19zZXRfY2xvY2tfcmF0ZV9tdWx0KGludGVsX291dHB1dCwgc2R2b19wcml2LT5zYXZlX3Nkdm9fbXVsdCk7CisKKwlJOTE1X1dSSVRFKHNkdm9fcHJpdi0+b3V0cHV0X2RldmljZSwgc2R2b19wcml2LT5zYXZlX1NEVk9YKTsKKworCWlmIChzZHZvX3ByaXYtPnNhdmVfU0RWT1ggJiBTRFZPX0VOQUJMRSkKKwl7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKKwkJc3RhdHVzID0gaW50ZWxfc2R2b19nZXRfdHJhaW5lZF9pbnB1dHMoaW50ZWxfb3V0cHV0LCAmaW5wdXQxLCAmaW5wdXQyKTsKKwkJaWYgKHN0YXR1cyA9PSBTRFZPX0NNRF9TVEFUVVNfU1VDQ0VTUyAmJiAhaW5wdXQxKQorCQkJRFJNX0RFQlVHKCJGaXJzdCAlcyBvdXRwdXQgcmVwb3J0ZWQgZmFpbHVyZSB0byBzeW5jXG4iLAorCQkJCSAgIFNEVk9fTkFNRShzZHZvX3ByaXYpKTsKKwl9CisKKwlpbnRlbF9zZHZvX3NldF9hY3RpdmVfb3V0cHV0cyhpbnRlbF9vdXRwdXQsIHNkdm9fcHJpdi0+c2F2ZV9hY3RpdmVfb3V0cHV0cyk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfc2R2b19tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKnNkdm9fcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCXJldHVybiBNT0RFX05PX0RCTEVTQ0FOOworCisJaWYgKHNkdm9fcHJpdi0+cGl4ZWxfY2xvY2tfbWluID4gbW9kZS0+Y2xvY2spCisJCXJldHVybiBNT0RFX0NMT0NLX0xPVzsKKworCWlmIChzZHZvX3ByaXYtPnBpeGVsX2Nsb2NrX21heCA8IG1vZGUtPmNsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCisJcmV0dXJuIE1PREVfT0s7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3Nkdm9fZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQsIHN0cnVjdCBpbnRlbF9zZHZvX2NhcHMgKmNhcHMpCit7CisJdTggc3RhdHVzOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9HRVRfREVWSUNFX0NBUFMsIE5VTEwsIDApOworCXN0YXR1cyA9IGludGVsX3Nkdm9fcmVhZF9yZXNwb25zZShpbnRlbF9vdXRwdXQsIGNhcHMsIHNpemVvZigqY2FwcykpOworCWlmIChzdGF0dXMgIT0gU0RWT19DTURfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciogaW50ZWxfc2R2b19maW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBzZHZvQikKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppb3V0ID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfc2R2b19wcml2ICpzZHZvOworCisJLyogZmluZCB0aGUgc2R2byBjb25uZWN0b3IgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaW91dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJCWlmIChpb3V0LT50eXBlICE9IElOVEVMX09VVFBVVF9TRFZPKQorCQkJY29udGludWU7CisKKwkJc2R2byA9IGlvdXQtPmRldl9wcml2OworCisJCWlmIChzZHZvLT5vdXRwdXRfZGV2aWNlID09IFNEVk9CICYmIHNkdm9CKQorCQkJcmV0dXJuIGNvbm5lY3RvcjsKKworCQlpZiAoc2R2by0+b3V0cHV0X2RldmljZSA9PSBTRFZPQyAmJiAhc2R2b0IpCisJCQlyZXR1cm4gY29ubmVjdG9yOworCisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBpbnRlbF9zZHZvX3N1cHBvcnRzX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwl1OCByZXNwb25zZVsyXTsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICghY29ubmVjdG9yKQorCQlyZXR1cm4gMDsKKworCWludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9HRVRfSE9UX1BMVUdfU1VQUE9SVCwgTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCAyKTsKKworCWlmIChyZXNwb25zZVswXSAhPTApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaW50ZWxfc2R2b19zZXRfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgb24pCit7CisJdTggcmVzcG9uc2VbMl07CisJdTggc3RhdHVzOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9HRVRfQUNUSVZFX0hPVF9QTFVHLCBOVUxMLCAwKTsKKwlpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LCAmcmVzcG9uc2UsIDIpOworCisJaWYgKG9uKSB7CisJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfR0VUX0hPVF9QTFVHX1NVUFBPUlQsIE5VTEwsIDApOworCQlzdGF0dXMgPSBpbnRlbF9zZHZvX3JlYWRfcmVzcG9uc2UoaW50ZWxfb3V0cHV0LCAmcmVzcG9uc2UsIDIpOworCisJCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfU0VUX0FDVElWRV9IT1RfUExVRywgJnJlc3BvbnNlLCAyKTsKKwl9IGVsc2UgeworCQlyZXNwb25zZVswXSA9IDA7CisJCXJlc3BvbnNlWzFdID0gMDsKKwkJaW50ZWxfc2R2b193cml0ZV9jbWQoaW50ZWxfb3V0cHV0LCBTRFZPX0NNRF9TRVRfQUNUSVZFX0hPVF9QTFVHLCAmcmVzcG9uc2UsIDIpOworCX0KKworCWludGVsX3Nkdm9fd3JpdGVfY21kKGludGVsX291dHB1dCwgU0RWT19DTURfR0VUX0FDVElWRV9IT1RfUExVRywgTlVMTCwgMCk7CisJaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCAyKTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaW50ZWxfc2R2b19kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwl1OCByZXNwb25zZVsyXTsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpbnRlbF9zZHZvX3dyaXRlX2NtZChpbnRlbF9vdXRwdXQsIFNEVk9fQ01EX0dFVF9BVFRBQ0hFRF9ESVNQTEFZUywgTlVMTCwgMCk7CisJc3RhdHVzID0gaW50ZWxfc2R2b19yZWFkX3Jlc3BvbnNlKGludGVsX291dHB1dCwgJnJlc3BvbnNlLCAyKTsKKworCURSTV9ERUJVRygiU0RWTyByZXNwb25zZSAlZCAlZFxuIiwgcmVzcG9uc2VbMF0sIHJlc3BvbnNlWzFdKTsKKwlpZiAoKHJlc3BvbnNlWzBdICE9IDApIHx8IChyZXNwb25zZVsxXSAhPSAwKSkKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCWVsc2UKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitzdGF0aWMgaW50IGludGVsX3Nkdm9fZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwkvKiBzZXQgdGhlIGJ1cyBzd2l0Y2ggYW5kIGdldCB0aGUgbW9kZXMgKi8KKwlpbnRlbF9zZHZvX3NldF9jb250cm9sX2J1c19zd2l0Y2goaW50ZWxfb3V0cHV0LCBTRFZPX0NPTlRST0xfQlVTX0REQzIpOworCWludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKKworCWlmIChsaXN0X2VtcHR5KCZjb25uZWN0b3ItPnByb2JlZF9tb2RlcykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9zZHZvX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCWlmIChpbnRlbF9vdXRwdXQtPmkyY19idXMpCisJCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+aTJjX2J1cyk7CisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShpbnRlbF9vdXRwdXQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBpbnRlbF9zZHZvX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGludGVsX3Nkdm9fZHBtcywKKwkubW9kZV9maXh1cCA9IGludGVsX3Nkdm9fbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IGludGVsX2VuY29kZXJfcHJlcGFyZSwKKwkubW9kZV9zZXQgPSBpbnRlbF9zZHZvX21vZGVfc2V0LAorCS5jb21taXQgPSBpbnRlbF9lbmNvZGVyX2NvbW1pdCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF9zZHZvX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuc2F2ZSA9IGludGVsX3Nkdm9fc2F2ZSwKKwkucmVzdG9yZSA9IGludGVsX3Nkdm9fcmVzdG9yZSwKKwkuZGV0ZWN0ID0gaW50ZWxfc2R2b19kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCisJLmRlc3Ryb3kgPSBpbnRlbF9zZHZvX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGludGVsX3Nkdm9fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2V0X21vZGVzID0gaW50ZWxfc2R2b19nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSBpbnRlbF9zZHZvX21vZGVfdmFsaWQsCisJLmJlc3RfZW5jb2RlciA9IGludGVsX2Jlc3RfZW5jb2RlciwKK307CisKK3N0YXRpYyB2b2lkIGludGVsX3Nkdm9fZW5jX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgaW50ZWxfc2R2b19lbmNfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBpbnRlbF9zZHZvX2VuY19kZXN0cm95LAorfTsKKworCit2b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dDsKKwlzdHJ1Y3QgaW50ZWxfc2R2b19wcml2ICpzZHZvX3ByaXY7CisJc3RydWN0IGludGVsX2kyY19jaGFuICppMmNidXMgPSBOVUxMOworCWludCBjb25uZWN0b3JfdHlwZTsKKwl1OCBjaFsweDQwXTsKKwlpbnQgaTsKKwlpbnQgZW5jb2Rlcl90eXBlLCBvdXRwdXRfaWQ7CisKKwlpbnRlbF9vdXRwdXQgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KStzaXplb2Yoc3RydWN0IGludGVsX3Nkdm9fcHJpdiksIDEsIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfb3V0cHV0KSB7CisJCXJldHVybjsKKwl9CisKKwljb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOworCisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLCAmaW50ZWxfc2R2b19jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bik7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmludGVsX3Nkdm9fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisJc2R2b19wcml2ID0gKHN0cnVjdCBpbnRlbF9zZHZvX3ByaXYgKikoaW50ZWxfb3V0cHV0ICsgMSk7CisJaW50ZWxfb3V0cHV0LT50eXBlID0gSU5URUxfT1VUUFVUX1NEVk87CisKKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CisKKwkvKiBzZXR1cCB0aGUgRERDIGJ1cy4gKi8KKwlpZiAob3V0cHV0X2RldmljZSA9PSBTRFZPQikKKwkJaTJjYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIEdQSU9FLCAiU0RWT0NUUkxfRSBmb3IgU0RWT0IiKTsKKwllbHNlCisJCWkyY2J1cyA9IGludGVsX2kyY19jcmVhdGUoZGV2LCBHUElPRSwgIlNEVk9DVFJMX0UgZm9yIFNEVk9DIik7CisKKwlpZiAoIWkyY2J1cykKKwkJZ290byBlcnJfY29ubmVjdG9yOworCisJc2R2b19wcml2LT5pMmNfYnVzID0gaTJjYnVzOworCisJaWYgKG91dHB1dF9kZXZpY2UgPT0gU0RWT0IpIHsKKwkJb3V0cHV0X2lkID0gMTsKKwkJc2R2b19wcml2LT5pMmNfYnVzLT5zbGF2ZV9hZGRyID0gMHgzODsKKwl9IGVsc2UgeworCQlvdXRwdXRfaWQgPSAyOworCQlzZHZvX3ByaXYtPmkyY19idXMtPnNsYXZlX2FkZHIgPSAweDM5OworCX0KKworCXNkdm9fcHJpdi0+b3V0cHV0X2RldmljZSA9IG91dHB1dF9kZXZpY2U7CisJaW50ZWxfb3V0cHV0LT5pMmNfYnVzID0gaTJjYnVzOworCWludGVsX291dHB1dC0+ZGV2X3ByaXYgPSBzZHZvX3ByaXY7CisKKworCS8qIFJlYWQgdGhlIHJlZ3MgdG8gdGVzdCBpZiB3ZSBjYW4gdGFsayB0byB0aGUgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQlpZiAoIWludGVsX3Nkdm9fcmVhZF9ieXRlKGludGVsX291dHB1dCwgaSwgJmNoW2ldKSkgeworCQkJRFJNX0RFQlVHKCJObyBTRFZPIGRldmljZSBmb3VuZCBvbiBTRFZPJWNcbiIsCisJCQkJICBvdXRwdXRfZGV2aWNlID09IFNEVk9CID8gJ0InIDogJ0MnKTsKKwkJCWdvdG8gZXJyX2kyYzsKKwkJfQorCX0KKworCWludGVsX3Nkdm9fZ2V0X2NhcGFiaWxpdGllcyhpbnRlbF9vdXRwdXQsICZzZHZvX3ByaXYtPmNhcHMpOworCisJbWVtc2V0KCZzZHZvX3ByaXYtPmFjdGl2ZV9vdXRwdXRzLCAwLCBzaXplb2Yoc2R2b19wcml2LT5hY3RpdmVfb3V0cHV0cykpOworCisJLyogVE9ETywgQ1ZCUywgU1ZJRCwgWVBSUEIgJiBTQ0FSVCBvdXRwdXRzLiAqLworCWlmIChzZHZvX3ByaXYtPmNhcHMub3V0cHV0X2ZsYWdzICYgU0RWT19PVVRQVVRfUkdCMCkKKwl7CisJCXNkdm9fcHJpdi0+YWN0aXZlX291dHB1dHMgPSBTRFZPX09VVFBVVF9SR0IwOworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlciA9IFN1YlBpeGVsSG9yaXpvbnRhbFJHQjsKKwkJZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9EQUM7CisJCWNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwl9CisJZWxzZSBpZiAoc2R2b19wcml2LT5jYXBzLm91dHB1dF9mbGFncyAmIFNEVk9fT1VUUFVUX1JHQjEpCisJeworCQlzZHZvX3ByaXYtPmFjdGl2ZV9vdXRwdXRzID0gU0RWT19PVVRQVVRfUkdCMTsKKwkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbEhvcml6b250YWxSR0I7CisJCWVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfREFDOworCQljb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7CisJfQorCWVsc2UgaWYgKHNkdm9fcHJpdi0+Y2Fwcy5vdXRwdXRfZmxhZ3MgJiBTRFZPX09VVFBVVF9UTURTMCkKKwl7CisJCXNkdm9fcHJpdi0+YWN0aXZlX291dHB1dHMgPSBTRFZPX09VVFBVVF9UTURTMDsKKwkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbEhvcml6b250YWxSR0I7CisJCWVuY29kZXJfdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKKwkJY29ubmVjdG9yX3R5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDsKKwl9CisJZWxzZSBpZiAoc2R2b19wcml2LT5jYXBzLm91dHB1dF9mbGFncyAmIFNEVk9fT1VUUFVUX1RNRFMxKQorCXsKKwkJc2R2b19wcml2LT5hY3RpdmVfb3V0cHV0cyA9IFNEVk9fT1VUUFVUX1RNRFMxOworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlciA9IFN1YlBpeGVsSG9yaXpvbnRhbFJHQjsKKwkJZW5jb2Rlcl90eXBlID0gRFJNX01PREVfRU5DT0RFUl9UTURTOworCQljb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOworCX0KKwllbHNlCisJeworCQl1bnNpZ25lZCBjaGFyIGJ5dGVzWzJdOworCisJCW1lbWNweSAoYnl0ZXMsICZzZHZvX3ByaXYtPmNhcHMub3V0cHV0X2ZsYWdzLCAyKTsKKwkJRFJNX0RFQlVHKCIlczogTm8gYWN0aXZlIFJHQiBvciBUTURTIG91dHB1dHMgKDB4JTAyeCUwMngpXG4iLAorCQkJICBTRFZPX05BTUUoc2R2b19wcml2KSwKKwkJCSAgYnl0ZXNbMF0sIGJ5dGVzWzFdKTsKKwkJZ290byBlcnJfaTJjOworCX0KKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF9zZHZvX2VuY19mdW5jcywgZW5jb2Rlcl90eXBlKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKCZpbnRlbF9vdXRwdXQtPmVuYywgJmludGVsX3Nkdm9faGVscGVyX2Z1bmNzKTsKKwljb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID0gY29ubmVjdG9yX3R5cGU7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmludGVsX291dHB1dC0+YmFzZSwgJmludGVsX291dHB1dC0+ZW5jKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCisJLyogU2V0IHRoZSBpbnB1dCB0aW1pbmcgdG8gdGhlIHNjcmVlbi4gQXNzdW1lIGFsd2F5cyBpbnB1dCAwLiAqLworCWludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dChpbnRlbF9vdXRwdXQsIHRydWUsIGZhbHNlKTsKKworCWludGVsX3Nkdm9fZ2V0X2lucHV0X3BpeGVsX2Nsb2NrX3JhbmdlKGludGVsX291dHB1dCwKKwkJCQkJICAgICAgICZzZHZvX3ByaXYtPnBpeGVsX2Nsb2NrX21pbiwKKwkJCQkJICAgICAgICZzZHZvX3ByaXYtPnBpeGVsX2Nsb2NrX21heCk7CisKKworCURSTV9ERUJVRygiJXMgZGV2aWNlIFZJRC9ESUQ6ICUwMlg6JTAyWC4lMDJYLCAiCisJCSAgImNsb2NrIHJhbmdlICVkTUh6IC0gJWRNSHosICIKKwkJICAiaW5wdXQgMTogJWMsIGlucHV0IDI6ICVjLCAiCisJCSAgIm91dHB1dCAxOiAlYywgb3V0cHV0IDI6ICVjXG4iLAorCQkgIFNEVk9fTkFNRShzZHZvX3ByaXYpLAorCQkgIHNkdm9fcHJpdi0+Y2Fwcy52ZW5kb3JfaWQsIHNkdm9fcHJpdi0+Y2Fwcy5kZXZpY2VfaWQsCisJCSAgc2R2b19wcml2LT5jYXBzLmRldmljZV9yZXZfaWQsCisJCSAgc2R2b19wcml2LT5waXhlbF9jbG9ja19taW4gLyAxMDAwLAorCQkgIHNkdm9fcHJpdi0+cGl4ZWxfY2xvY2tfbWF4IC8gMTAwMCwKKwkJICAoc2R2b19wcml2LT5jYXBzLnNkdm9faW5wdXRzX21hc2sgJiAweDEpID8gJ1knIDogJ04nLAorCQkgIChzZHZvX3ByaXYtPmNhcHMuc2R2b19pbnB1dHNfbWFzayAmIDB4MikgPyAnWScgOiAnTicsCisJCSAgLyogY2hlY2sgY3VycmVudGx5IHN1cHBvcnRlZCBvdXRwdXRzICovCisJCSAgc2R2b19wcml2LT5jYXBzLm91dHB1dF9mbGFncyAmCisJCQkoU0RWT19PVVRQVVRfVE1EUzAgfCBTRFZPX09VVFBVVF9SR0IwKSA/ICdZJyA6ICdOJywKKwkJICBzZHZvX3ByaXYtPmNhcHMub3V0cHV0X2ZsYWdzICYKKwkJCShTRFZPX09VVFBVVF9UTURTMSB8IFNEVk9fT1VUUFVUX1JHQjEpID8gJ1knIDogJ04nKTsKKworCWludGVsX291dHB1dC0+ZGRjX2J1cyA9IGkyY2J1czsKKworCXJldHVybjsKKworZXJyX2kyYzoKKwlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmkyY19idXMpOworZXJyX2Nvbm5lY3RvcjoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShpbnRlbF9vdXRwdXQpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFhNDNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2b19yZWdzLmgKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgqSAyMDA2LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKi8KKworLyoqCisgKiBAZmlsZSBTRFZPIGNvbW1hbmQgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMuCisgKi8KKworI2RlZmluZSBTRFZPX09VVFBVVF9GSVJTVCAgICgwKQorI2RlZmluZSBTRFZPX09VVFBVVF9UTURTMCAgICgxIDw8IDApCisjZGVmaW5lIFNEVk9fT1VUUFVUX1JHQjAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU0RWT19PVVRQVVRfQ1ZCUzAgICAoMSA8PCAyKQorI2RlZmluZSBTRFZPX09VVFBVVF9TVklEMCAgICgxIDw8IDMpCisjZGVmaW5lIFNEVk9fT1VUUFVUX1lQUlBCMCAgKDEgPDwgNCkKKyNkZWZpbmUgU0RWT19PVVRQVVRfU0NBUlQwICAoMSA8PCA1KQorI2RlZmluZSBTRFZPX09VVFBVVF9MVkRTMCAgICgxIDw8IDYpCisjZGVmaW5lIFNEVk9fT1VUUFVUX1RNRFMxICAgKDEgPDwgOCkKKyNkZWZpbmUgU0RWT19PVVRQVVRfUkdCMSAgICAoMSA8PCA5KQorI2RlZmluZSBTRFZPX09VVFBVVF9DVkJTMSAgICgxIDw8IDEwKQorI2RlZmluZSBTRFZPX09VVFBVVF9TVklEMSAgICgxIDw8IDExKQorI2RlZmluZSBTRFZPX09VVFBVVF9ZUFJQQjEgICgxIDw8IDEyKQorI2RlZmluZSBTRFZPX09VVFBVVF9TQ0FSVDEgICgxIDw8IDEzKQorI2RlZmluZSBTRFZPX09VVFBVVF9MVkRTMSAgICgxIDw8IDE0KQorI2RlZmluZSBTRFZPX09VVFBVVF9MQVNUICAgICgxNCkKKworc3RydWN0IGludGVsX3Nkdm9fY2FwcyB7CisgICAgdTggdmVuZG9yX2lkOworICAgIHU4IGRldmljZV9pZDsKKyAgICB1OCBkZXZpY2VfcmV2X2lkOworICAgIHU4IHNkdm9fdmVyc2lvbl9tYWpvcjsKKyAgICB1OCBzZHZvX3ZlcnNpb25fbWlub3I7CisgICAgdW5zaWduZWQgaW50IHNkdm9faW5wdXRzX21hc2s6MjsKKyAgICB1bnNpZ25lZCBpbnQgc21vb3RoX3NjYWxpbmc6MTsKKyAgICB1bnNpZ25lZCBpbnQgc2hhcnBfc2NhbGluZzoxOworICAgIHVuc2lnbmVkIGludCB1cF9zY2FsaW5nOjE7CisgICAgdW5zaWduZWQgaW50IGRvd25fc2NhbGluZzoxOworICAgIHVuc2lnbmVkIGludCBzdGFsbF9zdXBwb3J0OjE7CisgICAgdW5zaWduZWQgaW50IHBhZDoxOworICAgIHUxNiBvdXRwdXRfZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiogVGhpcyBtYXRjaGVzIHRoZSBFRElEIERURCBzdHJ1Y3R1cmUsIG1vcmUgb3IgbGVzcyAqLworc3RydWN0IGludGVsX3Nkdm9fZHRkIHsKKyAgICBzdHJ1Y3QgeworCXUxNiBjbG9jazsJCS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCisJdTggaF9hY3RpdmU7CQkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLworCXU4IGhfYmxhbms7CQkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLworCXU4IGhfaGlnaDsJCS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggaF9hY3RpdmUsIGhfYmxhbmsgKi8KKwl1OCB2X2FjdGl2ZTsJCS8qKjwgbG93ZXIgOCBiaXRzIChsaW5lcykgKi8KKwl1OCB2X2JsYW5rOwkJLyoqPCBsb3dlciA4IGJpdHMgKGxpbmVzKSAqLworCXU4IHZfaGlnaDsJCS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggdl9hY3RpdmUsIHZfYmxhbmsgKi8KKyAgICB9IHBhcnQxOworCisgICAgc3RydWN0IHsKKwl1OCBoX3N5bmNfb2ZmOwkvKio8IGxvd2VyIDggYml0cywgZnJvbSBoYmxhbmsgc3RhcnQgKi8KKwl1OCBoX3N5bmNfd2lkdGg7CS8qKjwgbG93ZXIgOCBiaXRzIChwaXhlbHMpICovCisJLyoqIGxvd2VyIDQgYml0cyBlYWNoIHZzeW5jIG9mZnNldCwgdnN5bmMgd2lkdGggKi8KKwl1OCB2X3N5bmNfb2ZmX3dpZHRoOworCS8qKgorCSAqIDIgaGlnaCBiaXRzIG9mIGhzeW5jIG9mZnNldCwgMiBoaWdoIGJpdHMgb2YgaHN5bmMgd2lkdGgsCisJICogYml0cyA0LTUgb2YgdnN5bmMgb2Zmc2V0LCBhbmQgMiBoaWdoIGJpdHMgb2YgdnN5bmMgd2lkdGguCisJICovCisJdTggc3luY19vZmZfd2lkdGhfaGlnaDsKKwl1OCBkdGRfZmxhZ3M7CisJdTggc2R2b19mbGFnczsKKwkvKiogYml0cyA2LTcgb2YgdnN5bmMgb2Zmc2V0IGF0IGJpdHMgNi03ICovCisJdTggdl9zeW5jX29mZl9oaWdoOworCXU4IHJlc2VydmVkOworICAgIH0gcGFydDI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaW50ZWxfc2R2b19waXhlbF9jbG9ja19yYW5nZSB7CisgICAgdTE2IG1pbjsJCQkvKio8IHBpeGVsIGNsb2NrLCBpbiAxMGtIeiB1bml0cyAqLworICAgIHUxNiBtYXg7CQkJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpbnRlbF9zZHZvX3ByZWZlcnJlZF9pbnB1dF90aW1pbmdfYXJncyB7CisgICAgdTE2IGNsb2NrOworICAgIHUxNiB3aWR0aDsKKyAgICB1MTYgaGVpZ2h0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogSTJDIHJlZ2lzdGVycyBmb3IgU0RWTyAqLworI2RlZmluZSBTRFZPX0kyQ19BUkdfMAkJCQkweDA3CisjZGVmaW5lIFNEVk9fSTJDX0FSR18xCQkJCTB4MDYKKyNkZWZpbmUgU0RWT19JMkNfQVJHXzIJCQkJMHgwNQorI2RlZmluZSBTRFZPX0kyQ19BUkdfMwkJCQkweDA0CisjZGVmaW5lIFNEVk9fSTJDX0FSR180CQkJCTB4MDMKKyNkZWZpbmUgU0RWT19JMkNfQVJHXzUJCQkJMHgwMgorI2RlZmluZSBTRFZPX0kyQ19BUkdfNgkJCQkweDAxCisjZGVmaW5lIFNEVk9fSTJDX0FSR183CQkJCTB4MDAKKyNkZWZpbmUgU0RWT19JMkNfT1BDT0RFCQkJCTB4MDgKKyNkZWZpbmUgU0RWT19JMkNfQ01EX1NUQVRVUwkJCTB4MDkKKyNkZWZpbmUgU0RWT19JMkNfUkVUVVJOXzAJCQkweDBhCisjZGVmaW5lIFNEVk9fSTJDX1JFVFVSTl8xCQkJMHgwYgorI2RlZmluZSBTRFZPX0kyQ19SRVRVUk5fMgkJCTB4MGMKKyNkZWZpbmUgU0RWT19JMkNfUkVUVVJOXzMJCQkweDBkCisjZGVmaW5lIFNEVk9fSTJDX1JFVFVSTl80CQkJMHgwZQorI2RlZmluZSBTRFZPX0kyQ19SRVRVUk5fNQkJCTB4MGYKKyNkZWZpbmUgU0RWT19JMkNfUkVUVVJOXzYJCQkweDEwCisjZGVmaW5lIFNEVk9fSTJDX1JFVFVSTl83CQkJMHgxMQorI2RlZmluZSBTRFZPX0kyQ19WRU5ET1JfQkVHSU4JCQkweDIwCisKKy8qIFN0YXR1cyByZXN1bHRzICovCisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19QT1dFUl9PTgkJMHgwCisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19TVUNDRVNTCQkJMHgxCisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19OT1RTVVBQCQkJMHgyCisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19JTlZBTElEX0FSRwkJMHgzCisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19QRU5ESU5HCQkJMHg0CisjZGVmaW5lIFNEVk9fQ01EX1NUQVRVU19UQVJHRVRfTk9UX1NQRUNJRklFRAkweDUKKyNkZWZpbmUgU0RWT19DTURfU1RBVFVTX1NDQUxJTkdfTk9UX1NVUFAJMHg2CisKKy8qIFNEVk8gY29tbWFuZHMsIGFyZ3VtZW50L3Jlc3VsdCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBTRFZPX0NNRF9SRVNFVAkJCQkJMHgwMQorCisvKiogUmV0dXJucyBhIHN0cnVjdCBpbnRlbF9zZHZvX2NhcHMgKi8KKyNkZWZpbmUgU0RWT19DTURfR0VUX0RFVklDRV9DQVBTCQkJMHgwMgorCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9GSVJNV0FSRV9SRVYJCQkweDg2CisjIGRlZmluZSBTRFZPX0RFVklDRV9GSVJNV0FSRV9NSU5PUgkJCVNEVk9fSTJDX1JFVFVSTl8wCisjIGRlZmluZSBTRFZPX0RFVklDRV9GSVJNV0FSRV9NQUpPUgkJCVNEVk9fSTJDX1JFVFVSTl8xCisjIGRlZmluZSBTRFZPX0RFVklDRV9GSVJNV0FSRV9QQVRDSAkJCVNEVk9fSTJDX1JFVFVSTl8yCisKKy8qKgorICogUmVwb3J0cyB3aGljaCBpbnB1dHMgYXJlIHRyYWluZWQgKG1hbmFnZWQgdG8gc3luYykuCisgKgorICogRGV2aWNlcyBtdXN0IGhhdmUgdHJhaW5lZCB3aXRoaW4gMiB2c3luY3Mgb2YgYSBtb2RlIGNoYW5nZS4KKyAqLworI2RlZmluZSBTRFZPX0NNRF9HRVRfVFJBSU5FRF9JTlBVVFMJCQkweDAzCitzdHJ1Y3QgaW50ZWxfc2R2b19nZXRfdHJhaW5lZF9pbnB1dHNfcmVzcG9uc2UgeworICAgIHVuc2lnbmVkIGludCBpbnB1dDBfdHJhaW5lZDoxOworICAgIHVuc2lnbmVkIGludCBpbnB1dDFfdHJhaW5lZDoxOworICAgIHVuc2lnbmVkIGludCBwYWQ6NjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKiBSZXR1cm5zIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzIG9mIGFjdGl2ZSBvdXRwdXRzLiAqLworI2RlZmluZSBTRFZPX0NNRF9HRVRfQUNUSVZFX09VVFBVVFMJCQkweDA0CisKKy8qKgorICogU2V0cyB0aGUgY3VycmVudCBzZXQgb2YgYWN0aXZlIG91dHB1dHMuCisgKgorICogVGFrZXMgYSBzdHJ1Y3QgaW50ZWxfc2R2b19vdXRwdXRfZmxhZ3MuICBNdXN0IGJlIHByZWNlZGVkIGJ5IGEgU0VUX0lOX09VVF9NQVAKKyAqIG9uIG11bHRpLW91dHB1dCBkZXZpY2VzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX1NFVF9BQ1RJVkVfT1VUUFVUUwkJCTB4MDUKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgU0RWTyBpbnB1dHMgdG8gb3V0cHV0cyBvbiB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnMgdHdvIHN0cnVjdCBpbnRlbF9zZHZvX291dHB1dF9mbGFncyBzdHJ1Y3R1cmVzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9JTl9PVVRfTUFQCQkJCTB4MDYKKworLyoqCisgKiBTZXRzIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgU0RWTyBpbnB1dHMgdG8gb3V0cHV0cyBvbiB0aGUgZGV2aWNlLgorICoKKyAqIFRha2VzIHR3byBzdHJ1Y3QgaTM4MF9zZHZvX291dHB1dF9mbGFncyBzdHJ1Y3R1cmVzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX1NFVF9JTl9PVVRfTUFQCQkJCTB4MDcKKworLyoqCisgKiBSZXR1cm5zIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzIG9mIGF0dGFjaGVkIGRpc3BsYXlzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9BVFRBQ0hFRF9ESVNQTEFZUwkJCTB4MGIKKworLyoqCisgKiBSZXR1cm5zIGEgc3RydWN0IGludGVsX3Nkdm9fb3VwdHV0X2ZsYWdzIG9mIGRpc3BsYXlzIHN1cHBvcnRpbmcgaG90IHBsdWdnaW5nLgorICovCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9IT1RfUExVR19TVVBQT1JUCQkJMHgwYworCisvKioKKyAqIFRha2VzIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX1NFVF9BQ1RJVkVfSE9UX1BMVUcJCQkweDBkCisKKy8qKgorICogUmV0dXJucyBhIHN0cnVjdCBpbnRlbF9zZHZvX291dHB1dF9mbGFncyBvZiBkaXNwbGF5cyB3aXRoIGhvdCBwbHVnCisgKiBpbnRlcnJ1cHRzIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgU0RWT19DTURfR0VUX0FDVElWRV9IT1RfUExVRwkJCTB4MGUKKworI2RlZmluZSBTRFZPX0NNRF9HRVRfSU5URVJSVVBUX0VWRU5UX1NPVVJDRQkJMHgwZgorc3RydWN0IGludGVsX3Nkdm9fZ2V0X2ludGVycnVwdF9ldmVudF9zb3VyY2VfcmVzcG9uc2UgeworICAgIHUxNiBpbnRlcnJ1cHRfc3RhdHVzOworICAgIHVuc2lnbmVkIGludCBhbWJpZW50X2xpZ2h0X2ludGVycnVwdDoxOworICAgIHVuc2lnbmVkIGludCBwYWQ6NzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgorICogU2VsZWN0cyB3aGljaCBpbnB1dCBpcyBhZmZlY3RlZCBieSBmdXR1cmUgaW5wdXQgY29tbWFuZHMuCisgKgorICogQ29tbWFuZHMgYWZmZWN0ZWQgaW5jbHVkZSBTRVRfSU5QVVRfVElNSU5HU19QQVJUWzEyXSwKKyAqIEdFVF9JTlBVVF9USU1JTkdTX1BBUlRbMTJdLCBHRVRfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR1NfUEFSVFsxMl0sCisgKiBHRVRfSU5QVVRfUElYRUxfQ0xPQ0tfUkFOR0UsIGFuZCBDUkVBVEVfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR1MuCisgKi8KKyNkZWZpbmUgU0RWT19DTURfU0VUX1RBUkdFVF9JTlBVVAkJCTB4MTAKK3N0cnVjdCBpbnRlbF9zZHZvX3NldF90YXJnZXRfaW5wdXRfYXJncyB7CisgICAgdW5zaWduZWQgaW50IHRhcmdldF8xOjE7CisgICAgdW5zaWduZWQgaW50IHBhZDo3OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBUYWtlcyBhIHN0cnVjdCBpbnRlbF9zZHZvX291dHB1dF9mbGFncyBvZiB3aGljaCBvdXRwdXRzIGFyZSB0YXJnZXR0ZWQgYnkKKyAqIGZ1dHVyZSBvdXRwdXQgY29tbWFuZHMuCisgKgorICogQWZmZWN0ZWQgY29tbWFuZHMgaW5jbHVlIFNFVF9PVVRQVVRfVElNSU5HU19QQVJUWzEyXSwKKyAqIEdFVF9PVVRQVVRfVElNSU5HU19QQVJUWzEyXSwgYW5kIEdFVF9PVVRQVVRfUElYRUxfQ0xPQ0tfUkFOR0UuCisgKi8KKyNkZWZpbmUgU0RWT19DTURfU0VUX1RBUkdFVF9PVVRQVVQJCQkweDExCisKKyNkZWZpbmUgU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEJCTB4MTIKKyNkZWZpbmUgU0RWT19DTURfR0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIJCTB4MTMKKyNkZWZpbmUgU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDEJCTB4MTQKKyNkZWZpbmUgU0RWT19DTURfU0VUX0lOUFVUX1RJTUlOR1NfUEFSVDIJCTB4MTUKKyNkZWZpbmUgU0RWT19DTURfU0VUX09VVFBVVF9USU1JTkdTX1BBUlQxCQkweDE2CisjZGVmaW5lIFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMgkJMHgxNworI2RlZmluZSBTRFZPX0NNRF9HRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDEJCTB4MTgKKyNkZWZpbmUgU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQyCQkweDE5CisvKiBQYXJ0IDEgKi8KKyMgZGVmaW5lIFNEVk9fRFREX0NMT0NLX0xPVwkJCQlTRFZPX0kyQ19BUkdfMAorIyBkZWZpbmUgU0RWT19EVERfQ0xPQ0tfSElHSAkJCQlTRFZPX0kyQ19BUkdfMQorIyBkZWZpbmUgU0RWT19EVERfSF9BQ1RJVkUJCQkJU0RWT19JMkNfQVJHXzIKKyMgZGVmaW5lIFNEVk9fRFREX0hfQkxBTksJCQkJU0RWT19JMkNfQVJHXzMKKyMgZGVmaW5lIFNEVk9fRFREX0hfSElHSAkJCQlTRFZPX0kyQ19BUkdfNAorIyBkZWZpbmUgU0RWT19EVERfVl9BQ1RJVkUJCQkJU0RWT19JMkNfQVJHXzUKKyMgZGVmaW5lIFNEVk9fRFREX1ZfQkxBTksJCQkJU0RWT19JMkNfQVJHXzYKKyMgZGVmaW5lIFNEVk9fRFREX1ZfSElHSAkJCQlTRFZPX0kyQ19BUkdfNworLyogUGFydCAyICovCisjIGRlZmluZSBTRFZPX0RURF9IU1lOQ19PRkYJCQkJU0RWT19JMkNfQVJHXzAKKyMgZGVmaW5lIFNEVk9fRFREX0hTWU5DX1dJRFRICQkJCVNEVk9fSTJDX0FSR18xCisjIGRlZmluZSBTRFZPX0RURF9WU1lOQ19PRkZfV0lEVEgJCQlTRFZPX0kyQ19BUkdfMgorIyBkZWZpbmUgU0RWT19EVERfU1lOQ19PRkZfV0lEVEhfSElHSAkJCVNEVk9fSTJDX0FSR18zCisjIGRlZmluZSBTRFZPX0RURF9EVERfRkxBR1MJCQkJU0RWT19JMkNfQVJHXzQKKyMgZGVmaW5lIFNEVk9fRFREX0RURF9GTEFHX0lOVEVSTEFDRUQJCQkJKDEgPDwgNykKKyMgZGVmaW5lIFNEVk9fRFREX0RURF9GTEFHX1NURVJFT19NQVNLCQkJCSgzIDw8IDUpCisjIGRlZmluZSBTRFZPX0RURF9EVERfRkxBR19JTlBVVF9NQVNLCQkJCSgzIDw8IDMpCisjIGRlZmluZSBTRFZPX0RURF9EVERfRkxBR19TWU5DX01BU0sJCQkJKDMgPDwgMSkKKyMgZGVmaW5lIFNEVk9fRFREX1NEVk9fRkxBUwkJCQlTRFZPX0kyQ19BUkdfNQorIyBkZWZpbmUgU0RWT19EVERfU0RWT19GTEFHX1NUQUxMCQkJCSgxIDw8IDcpCisjIGRlZmluZSBTRFZPX0RURF9TRFZPX0ZMQUdfQ0VOVEVSRUQJCQkJKDAgPDwgNikKKyMgZGVmaW5lIFNEVk9fRFREX1NEVk9fRkxBR19VUFBFUl9MRUZUCQkJCSgxIDw8IDYpCisjIGRlZmluZSBTRFZPX0RURF9TRFZPX0ZMQUdfU0NBTElOR19NQVNLCQkJKDMgPDwgNCkKKyMgZGVmaW5lIFNEVk9fRFREX1NEVk9fRkxBR19TQ0FMSU5HX05PTkUJCQkoMCA8PCA0KQorIyBkZWZpbmUgU0RWT19EVERfU0RWT19GTEFHX1NDQUxJTkdfU0hBUlAJCQkoMSA8PCA0KQorIyBkZWZpbmUgU0RWT19EVERfU0RWT19GTEFHX1NDQUxJTkdfU01PT1RICQkJKDIgPDwgNCkKKyMgZGVmaW5lIFNEVk9fRFREX1ZTWU5DX09GRl9ISUdICQkJU0RWT19JMkNfQVJHXzYKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBEVEQgYmFzZWQgb24gdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCBmbGFncy4KKyAqCisgKiBUaGlzIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IGFueSBkZXZpY2Ugc3VwcG9ydGluZyBzY2FsaW5nIG9yIGludGVybGFjZWQKKyAqIG1vZGVzLgorICovCisjZGVmaW5lIFNEVk9fQ01EX0NSRUFURV9QUkVGRVJSRURfSU5QVVRfVElNSU5HCQkweDFhCisjIGRlZmluZSBTRFZPX1BSRUZFUlJFRF9JTlBVVF9USU1JTkdfQ0xPQ0tfTE9XCQlTRFZPX0kyQ19BUkdfMAorIyBkZWZpbmUgU0RWT19QUkVGRVJSRURfSU5QVVRfVElNSU5HX0NMT0NLX0hJR0gJCVNEVk9fSTJDX0FSR18xCisjIGRlZmluZSBTRFZPX1BSRUZFUlJFRF9JTlBVVF9USU1JTkdfV0lEVEhfTE9XCQlTRFZPX0kyQ19BUkdfMgorIyBkZWZpbmUgU0RWT19QUkVGRVJSRURfSU5QVVRfVElNSU5HX1dJRFRIX0hJR0gJCVNEVk9fSTJDX0FSR18zCisjIGRlZmluZSBTRFZPX1BSRUZFUlJFRF9JTlBVVF9USU1JTkdfSEVJR0hUX0xPVwkJU0RWT19JMkNfQVJHXzQKKyMgZGVmaW5lIFNEVk9fUFJFRkVSUkVEX0lOUFVUX1RJTUlOR19IRUlHSFRfSElHSAlTRFZPX0kyQ19BUkdfNQorIyBkZWZpbmUgU0RWT19QUkVGRVJSRURfSU5QVVRfVElNSU5HX0ZMQUdTCQlTRFZPX0kyQ19BUkdfNgorIyBkZWZpbmUgU0RWT19QUkVGRVJSRURfSU5QVVRfVElNSU5HX0ZMQUdTX0lOVEVSTEFDRUQJCSgxIDw8IDApCisjIGRlZmluZSBTRFZPX1BSRUZFUlJFRF9JTlBVVF9USU1JTkdfRkxBR1NfU0NBTEVECQkoMSA8PCAxKQorCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9QUkVGRVJSRURfSU5QVVRfVElNSU5HX1BBUlQxCTB4MWIKKyNkZWZpbmUgU0RWT19DTURfR0VUX1BSRUZFUlJFRF9JTlBVVF9USU1JTkdfUEFSVDIJMHgxYworCisvKiogUmV0dXJucyBhIHN0cnVjdCBpbnRlbF9zZHZvX3BpeGVsX2Nsb2NrX3JhbmdlICovCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9JTlBVVF9QSVhFTF9DTE9DS19SQU5HRQkJMHgxZAorLyoqIFJldHVybnMgYSBzdHJ1Y3QgaW50ZWxfc2R2b19waXhlbF9jbG9ja19yYW5nZSAqLworI2RlZmluZSBTRFZPX0NNRF9HRVRfT1VUUFVUX1BJWEVMX0NMT0NLX1JBTkdFCQkweDFlCisKKy8qKiBSZXR1cm5zIGEgYnl0ZSBiaXRmaWVsZCBjb250YWluaW5nIFNEVk9fQ0xPQ0tfUkFURV9NVUxUXyogZmxhZ3MgKi8KKyNkZWZpbmUgU0RWT19DTURfR0VUX1NVUFBPUlRFRF9DTE9DS19SQVRFX01VTFRTCQkweDFmCisKKy8qKiBSZXR1cm5zIGEgYnl0ZSBjb250YWluaW5nIGEgU0RWT19DTE9DS19SQVRFX01VTFRfKiBmbGFnICovCisjZGVmaW5lIFNEVk9fQ01EX0dFVF9DTE9DS19SQVRFX01VTFQJCQkweDIwCisvKiogVGFrZXMgYSBieXRlIGNvbnRhaW5pbmcgYSBTRFZPX0NMT0NLX1JBVEVfTVVMVF8qIGZsYWcgKi8KKyNkZWZpbmUgU0RWT19DTURfU0VUX0NMT0NLX1JBVEVfTVVMVAkJCTB4MjEKKyMgZGVmaW5lIFNEVk9fQ0xPQ0tfUkFURV9NVUxUXzFYCQkJCSgxIDw8IDApCisjIGRlZmluZSBTRFZPX0NMT0NLX1JBVEVfTVVMVF8yWAkJCQkoMSA8PCAxKQorIyBkZWZpbmUgU0RWT19DTE9DS19SQVRFX01VTFRfNFgJCQkJKDEgPDwgMykKKworI2RlZmluZSBTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX1RWX0ZPUk1BVFMJCTB4MjcKKworI2RlZmluZSBTRFZPX0NNRF9HRVRfVFZfRk9STUFUCQkJCTB4MjgKKworI2RlZmluZSBTRFZPX0NNRF9TRVRfVFZfRk9STUFUCQkJCTB4MjkKKworI2RlZmluZSBTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX1BPV0VSX1NUQVRFUwkJMHgyYQorI2RlZmluZSBTRFZPX0NNRF9HRVRfRU5DT0RFUl9QT1dFUl9TVEFURQkJMHgyYgorI2RlZmluZSBTRFZPX0NNRF9TRVRfRU5DT0RFUl9QT1dFUl9TVEFURQkJMHgyYworIyBkZWZpbmUgU0RWT19FTkNPREVSX1NUQVRFX09OCQkJCQkoMSA8PCAwKQorIyBkZWZpbmUgU0RWT19FTkNPREVSX1NUQVRFX1NUQU5EQlkJCQkJKDEgPDwgMSkKKyMgZGVmaW5lIFNEVk9fRU5DT0RFUl9TVEFURV9TVVNQRU5ECQkJCSgxIDw8IDIpCisjIGRlZmluZSBTRFZPX0VOQ09ERVJfU1RBVEVfT0ZGCQkJCQkoMSA8PCAzKQorCisjZGVmaW5lIFNEVk9fQ01EX1NFVF9UVl9SRVNPTFVUSU9OX1NVUFBPUlQJCTB4OTMKKworI2RlZmluZSBTRFZPX0NNRF9TRVRfQ09OVFJPTF9CVVNfU1dJVENICQkJMHg3YQorIyBkZWZpbmUgU0RWT19DT05UUk9MX0JVU19QUk9NCQkJCTB4MAorIyBkZWZpbmUgU0RWT19DT05UUk9MX0JVU19EREMxCQkJCTB4MQorIyBkZWZpbmUgU0RWT19DT05UUk9MX0JVU19EREMyCQkJCTB4MgorIyBkZWZpbmUgU0RWT19DT05UUk9MX0JVU19EREMzCQkJCTB4MwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMzVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKQEAgLTAsMCArMSwxNzI1IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoKKyAqLworCisvKiogQGZpbGUKKyAqIEludGVncmF0ZWQgVFYtb3V0IHN1cHBvcnQgZm9yIHRoZSA5MTVHTSBhbmQgOTQ1R00uCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Yy5oIgorI2luY2x1ZGUgImRybV9lZGlkLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCitlbnVtIHR2X21hcmdpbiB7CisJVFZfTUFSR0lOX0xFRlQsIFRWX01BUkdJTl9UT1AsCisJVFZfTUFSR0lOX1JJR0hULCBUVl9NQVJHSU5fQk9UVE9NCit9OworCisvKiogUHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIHRoZSBpbnRlZ3JhdGVkIFRWIHN1cHBvcnQgKi8KK3N0cnVjdCBpbnRlbF90dl9wcml2IHsKKwlpbnQgdHlwZTsKKwljaGFyICp0dl9mb3JtYXQ7CisJaW50IG1hcmdpbls0XTsKKwl1MzIgc2F2ZV9UVl9IX0NUTF8xOworCXUzMiBzYXZlX1RWX0hfQ1RMXzI7CisJdTMyIHNhdmVfVFZfSF9DVExfMzsKKwl1MzIgc2F2ZV9UVl9WX0NUTF8xOworCXUzMiBzYXZlX1RWX1ZfQ1RMXzI7CisJdTMyIHNhdmVfVFZfVl9DVExfMzsKKwl1MzIgc2F2ZV9UVl9WX0NUTF80OworCXUzMiBzYXZlX1RWX1ZfQ1RMXzU7CisJdTMyIHNhdmVfVFZfVl9DVExfNjsKKwl1MzIgc2F2ZV9UVl9WX0NUTF83OworCXUzMiBzYXZlX1RWX1NDX0NUTF8xLCBzYXZlX1RWX1NDX0NUTF8yLCBzYXZlX1RWX1NDX0NUTF8zOworCisJdTMyIHNhdmVfVFZfQ1NDX1k7CisJdTMyIHNhdmVfVFZfQ1NDX1kyOworCXUzMiBzYXZlX1RWX0NTQ19VOworCXUzMiBzYXZlX1RWX0NTQ19VMjsKKwl1MzIgc2F2ZV9UVl9DU0NfVjsKKwl1MzIgc2F2ZV9UVl9DU0NfVjI7CisJdTMyIHNhdmVfVFZfQ0xSX0tOT0JTOworCXUzMiBzYXZlX1RWX0NMUl9MRVZFTDsKKwl1MzIgc2F2ZV9UVl9XSU5fUE9TOworCXUzMiBzYXZlX1RWX1dJTl9TSVpFOworCXUzMiBzYXZlX1RWX0ZJTFRFUl9DVExfMTsKKwl1MzIgc2F2ZV9UVl9GSUxURVJfQ1RMXzI7CisJdTMyIHNhdmVfVFZfRklMVEVSX0NUTF8zOworCisJdTMyIHNhdmVfVFZfSF9MVU1BWzYwXTsKKwl1MzIgc2F2ZV9UVl9IX0NIUk9NQVs2MF07CisJdTMyIHNhdmVfVFZfVl9MVU1BWzQzXTsKKwl1MzIgc2F2ZV9UVl9WX0NIUk9NQVs0M107CisKKwl1MzIgc2F2ZV9UVl9EQUM7CisJdTMyIHNhdmVfVFZfQ1RMOworfTsKKworc3RydWN0IHZpZGVvX2xldmVscyB7CisJaW50IGJsYW5rLCBibGFjaywgYnVyc3Q7Cit9OworCitzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiB7CisJdTE2IHJ5LCBneSwgYnksIGF5OworCXUxNiBydSwgZ3UsIGJ1LCBhdTsKKwl1MTYgcnYsIGd2LCBidiwgYXY7Cit9OworCitzdGF0aWMgY29uc3QgdTMyIGZpbHRlcl90YWJsZVtdID0geworCTB4QjE0MDMwMDAsIDB4MkUyMDM1MDAsIDB4MzUwMDJFMjAsIDB4MzAwMEIxNDAsCisJMHgzNUEwQjE2MCwgMHgyREMwMkU4MCwgMHhCMTQwMzQ4MCwgMHhCMTYwMzAwMCwKKwkweDJFQTAzNjQwLCAweDM0MDAyRDgwLCAweDMwMDBCMTIwLCAweDM2RTBCMTYwLAorCTB4MkQyMDJFRjAsIDB4QjEyMDMzODAsIDB4QjE2MDMwMDAsIDB4MkYzMDM3ODAsCisJMHgzMzAwMkNDMCwgMHgzMDAwQjEwMCwgMHgzODIwQjE2MCwgMHgyQzgwMkY1MCwKKwkweEIxMDAzMkEwLCAweEIxNjAzMDAwLCAweDJGOTAzOEMwLCAweDMyMjAyQzIwLAorCTB4MzAwMEIwRTAsIDB4Mzk4MEIxNjAsIDB4MkJDMDJGQzAsIDB4QjBFMDMxQzAsCisJMHhCMTYwMzAwMCwgMHgyRkYwM0EyMCwgMHgzMTYwMkI2MCwgMHhCMDIwQjBDMCwKKwkweDNBRTBCMTYwLCAweDJCMDAxODEwLCAweEIwQzAzMTIwLCAweEIxNDBCMDIwLAorCTB4MTgyODNCQTAsIDB4MzBDMDJBODAsIDB4QjAyMEIwQTAsIDB4M0M2MEIxNDAsCisJMHgyQTIwMTgzOCwgMHhCMEEwMzA4MCwgMHhCMTIwQjAyMCwgMHgxODM4M0QyMCwKKwkweDMwNDAyOUMwLCAweEIwNDBCMDgwLCAweDNERTBCMTAwLCAweDI5NjAxODQ4LAorCTB4QjA4MDMwMDAsIDB4QjEwMEIwNDAsIDB4MTg0ODNFQzAsIDB4QjA0MDI5MDAsCisJMHhCMDQwQjA2MCwgMHgzRjgwQjBDMCwgMHgyODgwMTg1OCwgMHhCMDYwQjA4MCwKKwkweEIwQTBCMDYwLCAweDE4NjAyODIwLCAweEIwQTAyODIwLCAweDAwMDBCMDYwLAorCTB4QjE0MDMwMDAsIDB4MkUyMDM1MDAsIDB4MzUwMDJFMjAsIDB4MzAwMEIxNDAsCisJMHgzNUEwQjE2MCwgMHgyREMwMkU4MCwgMHhCMTQwMzQ4MCwgMHhCMTYwMzAwMCwKKwkweDJFQTAzNjQwLCAweDM0MDAyRDgwLCAweDMwMDBCMTIwLCAweDM2RTBCMTYwLAorCTB4MkQyMDJFRjAsIDB4QjEyMDMzODAsIDB4QjE2MDMwMDAsIDB4MkYzMDM3ODAsCisJMHgzMzAwMkNDMCwgMHgzMDAwQjEwMCwgMHgzODIwQjE2MCwgMHgyQzgwMkY1MCwKKwkweEIxMDAzMkEwLCAweEIxNjAzMDAwLCAweDJGOTAzOEMwLCAweDMyMjAyQzIwLAorCTB4MzAwMEIwRTAsIDB4Mzk4MEIxNjAsIDB4MkJDMDJGQzAsIDB4QjBFMDMxQzAsCisJMHhCMTYwMzAwMCwgMHgyRkYwM0EyMCwgMHgzMTYwMkI2MCwgMHhCMDIwQjBDMCwKKwkweDNBRTBCMTYwLCAweDJCMDAxODEwLCAweEIwQzAzMTIwLCAweEIxNDBCMDIwLAorCTB4MTgyODNCQTAsIDB4MzBDMDJBODAsIDB4QjAyMEIwQTAsIDB4M0M2MEIxNDAsCisJMHgyQTIwMTgzOCwgMHhCMEEwMzA4MCwgMHhCMTIwQjAyMCwgMHgxODM4M0QyMCwKKwkweDMwNDAyOUMwLCAweEIwNDBCMDgwLCAweDNERTBCMTAwLCAweDI5NjAxODQ4LAorCTB4QjA4MDMwMDAsIDB4QjEwMEIwNDAsIDB4MTg0ODNFQzAsIDB4QjA0MDI5MDAsCisJMHhCMDQwQjA2MCwgMHgzRjgwQjBDMCwgMHgyODgwMTg1OCwgMHhCMDYwQjA4MCwKKwkweEIwQTBCMDYwLCAweDE4NjAyODIwLCAweEIwQTAyODIwLCAweDAwMDBCMDYwLAorCTB4MzY0MDMwMDAsIDB4MkQwMDJDQzAsIDB4MzAwMDM2NDAsIDB4MkQwMDM2QzAsCisJMHgzNUMwMkNDMCwgMHgzNzQwMzAwMCwgMHgyQzgwMkQ0MCwgMHgzMDAwMzU0MCwKKwkweDJEODAzN0MwLCAweDM0QzAyQzQwLCAweDM4NDAzMDAwLCAweDJCQzAyRTAwLAorCTB4MzAwMDM0NDAsIDB4MkUyMDM4QzAsIDB4MzQwMDJCODAsIDB4Mzk4MDMwMDAsCisJMHgyQjQwMkU0MCwgMHgzMDAwMzM4MCwgMHgyRTYwM0EwMCwgMHgzMzQwMkIwMCwKKwkweDNBODAzMDQwLCAweDJBODAyRUEwLCAweDMwNDAzMzAwLCAweDJFQzAzQjQwLAorCTB4MzI4MDJBNDAsIDB4M0MwMDMwNDAsIDB4MkEwMDJFQzAsIDB4MzA4MDMyNDAsCisJMHgyRUMwM0M4MCwgMHgzMjAwMjlDMCwgMHgzRDQwMzA4MCwgMHgyOTQwMkYwMCwKKwkweDMwODAzMUMwLCAweDJGMjAzREMwLCAweDMxODAyOTAwLCAweDNFODAzMEMwLAorCTB4Mjg4MDJGNDAsIDB4MzBDMDMxNDAsIDB4MkYyMDNGNDAsIDB4MzE0MDI4NDAsCisJMHgyODAwMzEwMCwgMHgyODAwMkYwMCwgMHgwMDAwMzEwMCwgMHgzNjQwMzAwMCwKKwkweDJEMDAyQ0MwLCAweDMwMDAzNjQwLCAweDJEMDAzNkMwLAorCTB4MzVDMDJDQzAsIDB4Mzc0MDMwMDAsIDB4MkM4MDJENDAsIDB4MzAwMDM1NDAsCisJMHgyRDgwMzdDMCwgMHgzNEMwMkM0MCwgMHgzODQwMzAwMCwgMHgyQkMwMkUwMCwKKwkweDMwMDAzNDQwLCAweDJFMjAzOEMwLCAweDM0MDAyQjgwLCAweDM5ODAzMDAwLAorCTB4MkI0MDJFNDAsIDB4MzAwMDMzODAsIDB4MkU2MDNBMDAsIDB4MzM0MDJCMDAsCisJMHgzQTgwMzA0MCwgMHgyQTgwMkVBMCwgMHgzMDQwMzMwMCwgMHgyRUMwM0I0MCwKKwkweDMyODAyQTQwLCAweDNDMDAzMDQwLCAweDJBMDAyRUMwLCAweDMwODAzMjQwLAorCTB4MkVDMDNDODAsIDB4MzIwMDI5QzAsIDB4M0Q0MDMwODAsIDB4Mjk0MDJGMDAsCisJMHgzMDgwMzFDMCwgMHgyRjIwM0RDMCwgMHgzMTgwMjkwMCwgMHgzRTgwMzBDMCwKKwkweDI4ODAyRjQwLCAweDMwQzAzMTQwLCAweDJGMjAzRjQwLCAweDMxNDAyODQwLAorCTB4MjgwMDMxMDAsIDB4MjgwMDJGMDAsIDB4MDAwMDMxMDAsCit9OworCisvKgorICogQ29sb3IgY29udmVyc2lvbiB2YWx1ZXMgaGF2ZSAzIHNlcGFyYXRlIGZpeGVkIHBvaW50IGZvcm1hdHM6CisgKgorICogMTAgYml0IGZpZWxkcyAoYXksIGF1KQorICogICAxLjkgZml4ZWQgcG9pbnQgKGIuYmJiYmJiYmJiKQorICogMTEgYml0IGZpZWxkcyAocnksIGJ5LCBydSwgZ3UsIGd2KQorICogICBleHAubWFudGlzc2EgKGVlLm1tbW1tbW1tbSkKKyAqICAgZWUgPSAwMCA9IDEwXi0xICgwLm1tbW1tbW1tbSkKKyAqICAgZWUgPSAwMSA9IDEwXi0yICgwLjBtbW1tbW1tbW0pCisgKiAgIGVlID0gMTAgPSAxMF4tMyAoMC4wMG1tbW1tbW1tbSkKKyAqICAgZWUgPSAxMSA9IDEwXi00ICgwLjAwMG1tbW1tbW1tbSkKKyAqIDEyIGJpdCBmaWVsZHMgKGd5LCBydiwgYnUpCisgKiAgIGV4cC5tYW50aXNzYSAoZWVlLm1tbW1tbW1tbSkKKyAqICAgZWVlID0gMDAwID0gMTBeLTEgKDAubW1tbW1tbW1tKQorICogICBlZWUgPSAwMDEgPSAxMF4tMiAoMC4wbW1tbW1tbW1tKQorICogICBlZWUgPSAwMTAgPSAxMF4tMyAoMC4wMG1tbW1tbW1tbSkKKyAqICAgZWVlID0gMDExID0gMTBeLTQgKDAuMDAwbW1tbW1tbW1tKQorICogICBlZWUgPSAxMDAgPSByZXNlcnZlZAorICogICBlZWUgPSAxMDEgPSByZXNlcnZlZAorICogICBlZWUgPSAxMTAgPSByZXNlcnZlZAorICogICBlZWUgPSAxMTEgPSAxMF4wIChtLm1tbW1tbW1tKSAob25seSB1c2FibGUgZm9yIDEuMCByZXByZXNlbnRhdGlvbikKKyAqCisgKiBTYXR1cmF0aW9uIGFuZCBjb250cmFzdCBhcmUgOCBiaXRzLCB3aXRoIHRoZWlyIG93biByZXByZXNlbnRhdGlvbjoKKyAqIDggYml0IGZpZWxkIChzYXR1cmF0aW9uLCBjb250cmFzdCkKKyAqICAgZXhwLm1hbnRpc3NhIChlZS5tbW1tbW0pCisgKiAgIGVlID0gMDAgPSAxMF4tMSAoMC5tbW1tbW0pCisgKiAgIGVlID0gMDEgPSAxMF4wIChtLm1tbW1tKQorICogICBlZSA9IDEwID0gMTBeMSAobW0ubW1tbSkKKyAqICAgZWUgPSAxMSA9IDEwXjIgKG1tbS5tbW0pCisgKgorICogU2ltcGxlIGNvbnZlcnNpb24gZnVuY3Rpb246CisgKgorICogc3RhdGljIHUzMgorICogZmxvYXRfdG9fY3NjXzExKGZsb2F0IGYpCisgKiB7CisgKiAgICAgdTMyIGV4cDsKKyAqICAgICB1MzIgbWFudDsKKyAqICAgICB1MzIgcmV0OworICoKKyAqICAgICBpZiAoZiA8IDApCisgKiAgICAgICAgIGYgPSAtZjsKKyAqCisgKiAgICAgaWYgKGYgPj0gMSkgeworICogICAgICAgICBleHAgPSAweDc7CisgKiAJICAgbWFudCA9IDEgPDwgODsKKyAqICAgICB9IGVsc2UgeworICogICAgICAgICBmb3IgKGV4cCA9IDA7IGV4cCA8IDMgJiYgZiA8IDAuNTsgZXhwKyspCisgKiAJICAgICAgIGYgKj0gMi4wOworICogICAgICAgICBtYW50ID0gKGYgKiAoMSA8PCA5KSArIDAuNSk7CisgKiAgICAgICAgIGlmIChtYW50ID49ICgxIDw8IDkpKQorICogICAgICAgICAgICAgbWFudCA9ICgxIDw8IDkpIC0gMTsKKyAqICAgICB9CisgKiAgICAgcmV0ID0gKGV4cCA8PCA5KSB8IG1hbnQ7CisgKiAgICAgcmV0dXJuIHJldDsKKyAqIH0KKyAqLworCisvKgorICogQmVob2xkLCBtYWdpYyBudW1iZXJzISAgSWYgd2UgcGxhbnQgdGhlbSB0aGV5IG1pZ2h0IGdyb3cgYSBiaWcKKyAqIHMtdmlkZW8gY2FibGUgdG8gdGhlIHNreS4uLiBvciBzb21ldGhpbmcuCisgKgorICogUHJlLWNvbnZlcnRlZCB0byBhcHByb3ByaWF0ZSBoZXggdmFsdWUuCisgKi8KKworLyoKKyAqIFBBTCAmIE5UU0MgdmFsdWVzIGZvciBjb21wb3NpdGUgJiBzLXZpZGVvIGNvbm5lY3Rpb25zCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiBudHNjX21fY3NjX2NvbXBvc2l0ZSA9IHsKKwkucnkgPSAweDAzMzIsIC5neSA9IDB4MDEyZCwgLmJ5ID0gMHgwN2QzLCAuYXkgPSAweDAxMDQsCisJLnJ1ID0gMHgwNzMzLCAuZ3UgPSAweDA1MmQsIC5idSA9IDB4MDVjNywgLmF1ID0gMHgwZjAwLAorCS5ydiA9IDB4MDM0MCwgLmd2ID0gMHgwMzBjLCAuYnYgPSAweDA2ZDAsIC5hdiA9IDB4MGYwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzIG50c2NfbV9sZXZlbHNfY29tcG9zaXRlID0geworCS5ibGFuayA9IDIyNSwgLmJsYWNrID0gMjY3LCAuYnVyc3QgPSAxMTMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gbnRzY19tX2NzY19zdmlkZW8gPSB7CisJLnJ5ID0gMHgwMzMyLCAuZ3kgPSAweDAxMmQsIC5ieSA9IDB4MDdkMywgLmF5ID0gMHgwMTM0LAorCS5ydSA9IDB4MDc2YSwgLmd1ID0gMHgwNTY0LCAuYnUgPSAweDAzMGQsIC5hdSA9IDB4MGYwMCwKKwkucnYgPSAweDAzN2EsIC5ndiA9IDB4MDMzZCwgLmJ2ID0gMHgwNmY2LCAuYXYgPSAweDBmMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpZGVvX2xldmVscyBudHNjX21fbGV2ZWxzX3N2aWRlbyA9IHsKKwkuYmxhbmsgPSAyNjYsIC5ibGFjayA9IDMxNiwgLmJ1cnN0ID0gMTMzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uIG50c2Nfal9jc2NfY29tcG9zaXRlID0geworCS5yeSA9IDB4MDMzMiwgLmd5ID0gMHgwMTJkLCAuYnkgPSAweDA3ZDMsIC5heSA9IDB4MDExOSwKKwkucnUgPSAweDA3NGMsIC5ndSA9IDB4MDU0NiwgLmJ1ID0gMHgwNWVjLCAuYXUgPSAweDBmMDAsCisJLnJ2ID0gMHgwMzVhLCAuZ3YgPSAweDAzMjIsIC5idiA9IDB4MDZlMSwgLmF2ID0gMHgwZjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19sZXZlbHMgbnRzY19qX2xldmVsc19jb21wb3NpdGUgPSB7CisJLmJsYW5rID0gMjI1LCAuYmxhY2sgPSAyMjUsIC5idXJzdCA9IDExMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiBudHNjX2pfY3NjX3N2aWRlbyA9IHsKKwkucnkgPSAweDAzMzIsIC5neSA9IDB4MDEyZCwgLmJ5ID0gMHgwN2QzLCAuYXkgPSAweDAxNGMsCisJLnJ1ID0gMHgwNzg4LCAuZ3UgPSAweDA1ODEsIC5idSA9IDB4MDMyMiwgLmF1ID0gMHgwZjAwLAorCS5ydiA9IDB4MDM5OSwgLmd2ID0gMHgwMzU2LCAuYnYgPSAweDA3MGEsIC5hdiA9IDB4MGYwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzIG50c2Nfal9sZXZlbHNfc3ZpZGVvID0geworCS5ibGFuayA9IDI2NiwgLmJsYWNrID0gMjY2LCAuYnVyc3QgPSAxMzMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gcGFsX2NzY19jb21wb3NpdGUgPSB7CisJLnJ5ID0gMHgwMzMyLCAuZ3kgPSAweDAxMmQsIC5ieSA9IDB4MDdkMywgLmF5ID0gMHgwMTEzLAorCS5ydSA9IDB4MDc0NSwgLmd1ID0gMHgwNTNmLCAuYnUgPSAweDA1ZTEsIC5hdSA9IDB4MGYwMCwKKwkucnYgPSAweDAzNTMsIC5ndiA9IDB4MDMxYywgLmJ2ID0gMHgwNmRjLCAuYXYgPSAweDBmMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpZGVvX2xldmVscyBwYWxfbGV2ZWxzX2NvbXBvc2l0ZSA9IHsKKwkuYmxhbmsgPSAyMzcsIC5ibGFjayA9IDIzNywgLmJ1cnN0ID0gMTE4LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uIHBhbF9jc2Nfc3ZpZGVvID0geworCS5yeSA9IDB4MDMzMiwgLmd5ID0gMHgwMTJkLCAuYnkgPSAweDA3ZDMsIC5heSA9IDB4MDE0NSwKKwkucnUgPSAweDA3ODAsIC5ndSA9IDB4MDU3OSwgLmJ1ID0gMHgwMzFjLCAuYXUgPSAweDBmMDAsCisJLnJ2ID0gMHgwMzkwLCAuZ3YgPSAweDAzNGYsIC5idiA9IDB4MDcwNSwgLmF2ID0gMHgwZjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19sZXZlbHMgcGFsX2xldmVsc19zdmlkZW8gPSB7CisJLmJsYW5rID0gMjgwLCAuYmxhY2sgPSAyODAsIC5idXJzdCA9IDEzOSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiBwYWxfbV9jc2NfY29tcG9zaXRlID0geworCS5yeSA9IDB4MDMzMiwgLmd5ID0gMHgwMTJkLCAuYnkgPSAweDA3ZDMsIC5heSA9IDB4MDEwNCwKKwkucnUgPSAweDA3MzMsIC5ndSA9IDB4MDUyZCwgLmJ1ID0gMHgwNWM3LCAuYXUgPSAweDBmMDAsCisJLnJ2ID0gMHgwMzQwLCAuZ3YgPSAweDAzMGMsIC5idiA9IDB4MDZkMCwgLmF2ID0gMHgwZjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19sZXZlbHMgcGFsX21fbGV2ZWxzX2NvbXBvc2l0ZSA9IHsKKwkuYmxhbmsgPSAyMjUsIC5ibGFjayA9IDI2NywgLmJ1cnN0ID0gMTEzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uIHBhbF9tX2NzY19zdmlkZW8gPSB7CisJLnJ5ID0gMHgwMzMyLCAuZ3kgPSAweDAxMmQsIC5ieSA9IDB4MDdkMywgLmF5ID0gMHgwMTM0LAorCS5ydSA9IDB4MDc2YSwgLmd1ID0gMHgwNTY0LCAuYnUgPSAweDAzMGQsIC5hdSA9IDB4MGYwMCwKKwkucnYgPSAweDAzN2EsIC5ndiA9IDB4MDMzZCwgLmJ2ID0gMHgwNmY2LCAuYXYgPSAweDBmMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZpZGVvX2xldmVscyBwYWxfbV9sZXZlbHNfc3ZpZGVvID0geworCS5ibGFuayA9IDI2NiwgLmJsYWNrID0gMzE2LCAuYnVyc3QgPSAxMzMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gcGFsX25fY3NjX2NvbXBvc2l0ZSA9IHsKKwkucnkgPSAweDAzMzIsIC5neSA9IDB4MDEyZCwgLmJ5ID0gMHgwN2QzLCAuYXkgPSAweDAxMDQsCisJLnJ1ID0gMHgwNzMzLCAuZ3UgPSAweDA1MmQsIC5idSA9IDB4MDVjNywgLmF1ID0gMHgwZjAwLAorCS5ydiA9IDB4MDM0MCwgLmd2ID0gMHgwMzBjLCAuYnYgPSAweDA2ZDAsIC5hdiA9IDB4MGYwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzIHBhbF9uX2xldmVsc19jb21wb3NpdGUgPSB7CisJLmJsYW5rID0gMjI1LCAuYmxhY2sgPSAyNjcsIC5idXJzdCA9IDExOCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiBwYWxfbl9jc2Nfc3ZpZGVvID0geworCS5yeSA9IDB4MDMzMiwgLmd5ID0gMHgwMTJkLCAuYnkgPSAweDA3ZDMsIC5heSA9IDB4MDEzNCwKKwkucnUgPSAweDA3NmEsIC5ndSA9IDB4MDU2NCwgLmJ1ID0gMHgwMzBkLCAuYXUgPSAweDBmMDAsCisJLnJ2ID0gMHgwMzdhLCAuZ3YgPSAweDAzM2QsIC5idiA9IDB4MDZmNiwgLmF2ID0gMHgwZjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aWRlb19sZXZlbHMgcGFsX25fbGV2ZWxzX3N2aWRlbyA9IHsKKwkuYmxhbmsgPSAyNjYsIC5ibGFjayA9IDMxNiwgLmJ1cnN0ID0gMTM5LAorfTsKKworLyoKKyAqIENvbXBvbmVudCBjb25uZWN0aW9ucworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gc2R0dl9jc2NfeXBycGIgPSB7CisJLnJ5ID0gMHgwMzMyLCAuZ3kgPSAweDAxMmQsIC5ieSA9IDB4MDdkMywgLmF5ID0gMHgwMTQ2LAorCS5ydSA9IDB4MDU1OSwgLmd1ID0gMHgwMzUzLCAuYnUgPSAweDAxMDAsIC5hdSA9IDB4MGYwMCwKKwkucnYgPSAweDAxMDAsIC5ndiA9IDB4MDNhZCwgLmJ2ID0gMHgwNzRkLCAuYXYgPSAweDBmMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZlcnNpb24gc2R0dl9jc2NfcmdiID0geworCS5yeSA9IDB4MDAwMCwgLmd5ID0gMHgwZjAwLCAuYnkgPSAweDAwMDAsIC5heSA9IDB4MDE2NiwKKwkucnUgPSAweDAwMDAsIC5ndSA9IDB4MDAwMCwgLmJ1ID0gMHgwZjAwLCAuYXUgPSAweDAxNjYsCisJLnJ2ID0gMHgwZjAwLCAuZ3YgPSAweDAwMDAsIC5idiA9IDB4MDAwMCwgLmF2ID0gMHgwMTY2LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uIGhkdHZfY3NjX3lwcnBiID0geworCS5yeSA9IDB4MDViMywgLmd5ID0gMHgwMTZlLCAuYnkgPSAweDA3MjgsIC5heSA9IDB4MDE0NiwKKwkucnUgPSAweDA3ZDUsIC5ndSA9IDB4MDM4YiwgLmJ1ID0gMHgwMTAwLCAuYXUgPSAweDBmMDAsCisJLnJ2ID0gMHgwMTAwLCAuZ3YgPSAweDAzZDEsIC5idiA9IDB4MDZiYywgLmF2ID0gMHgwZjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uIGhkdHZfY3NjX3JnYiA9IHsKKwkucnkgPSAweDAwMDAsIC5neSA9IDB4MGYwMCwgLmJ5ID0gMHgwMDAwLCAuYXkgPSAweDAxNjYsCisJLnJ1ID0gMHgwMDAwLCAuZ3UgPSAweDAwMDAsIC5idSA9IDB4MGYwMCwgLmF1ID0gMHgwMTY2LAorCS5ydiA9IDB4MGYwMCwgLmd2ID0gMHgwMDAwLCAuYnYgPSAweDAwMDAsIC5hdiA9IDB4MDE2NiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzIGNvbXBvbmVudF9sZXZlbHMgPSB7CisJLmJsYW5rID0gMjc5LCAuYmxhY2sgPSAyNzksIC5idXJzdCA9IDAsCit9OworCisKK3N0cnVjdCB0dl9tb2RlIHsKKwljaGFyICpuYW1lOworCWludCBjbG9jazsKKwlpbnQgcmVmcmVzaDsgLyogaW4gbWlsbGloZXJ0eiAoZm9yIHByZWNpc2lvbikgKi8KKwl1MzIgb3ZlcnNhbXBsZTsKKwlpbnQgaHN5bmNfZW5kLCBoYmxhbmtfc3RhcnQsIGhibGFua19lbmQsIGh0b3RhbDsKKwlib29sIHByb2dyZXNzaXZlLCB0cmlsZXZlbF9zeW5jLCBjb21wb25lbnRfb25seTsKKwlpbnQgdnN5bmNfc3RhcnRfZjEsIHZzeW5jX3N0YXJ0X2YyLCB2c3luY19sZW47CisJYm9vbCB2ZXFfZW5hOworCWludCB2ZXFfc3RhcnRfZjEsIHZlcV9zdGFydF9mMiwgdmVxX2xlbjsKKwlpbnQgdmlfZW5kX2YxLCB2aV9lbmRfZjIsIG5icl9lbmQ7CisJYm9vbCBidXJzdF9lbmE7CisJaW50IGhidXJzdF9zdGFydCwgaGJ1cnN0X2xlbjsKKwlpbnQgdmJ1cnN0X3N0YXJ0X2YxLCB2YnVyc3RfZW5kX2YxOworCWludCB2YnVyc3Rfc3RhcnRfZjIsIHZidXJzdF9lbmRfZjI7CisJaW50IHZidXJzdF9zdGFydF9mMywgdmJ1cnN0X2VuZF9mMzsKKwlpbnQgdmJ1cnN0X3N0YXJ0X2Y0LCB2YnVyc3RfZW5kX2Y0OworCS8qCisJICogc3ViY2FycmllciBwcm9ncmFtbWluZworCSAqLworCWludCBkZGEyX3NpemUsIGRkYTNfc2l6ZSwgZGRhMV9pbmMsIGRkYTJfaW5jLCBkZGEzX2luYzsKKwl1MzIgc2NfcmVzZXQ7CisJYm9vbCBwYWxfYnVyc3Q7CisJLyoKKwkgKiBibGFuay9ibGFjayBsZXZlbHMKKwkgKi8KKwljb25zdCBzdHJ1Y3QgdmlkZW9fbGV2ZWxzICpjb21wb3NpdGVfbGV2ZWxzLCAqc3ZpZGVvX2xldmVsczsKKwljb25zdCBzdHJ1Y3QgY29sb3JfY29udmVyc2lvbiAqY29tcG9zaXRlX2NvbG9yLCAqc3ZpZGVvX2NvbG9yOworCWNvbnN0IHUzMiAqZmlsdGVyX3RhYmxlOworCWludCBtYXhfc3JjdzsKK307CisKKworLyoKKyAqIFN1YiBjYXJyaWVyIEREQQorICoKKyAqICBJIHRoaW5rIHRoaXMgd29ya3MgYXMgZm9sbG93czoKKyAqCisgKiAgc3ViY2FycmllciBmcmVxID0gcGl4ZWxfY2xvY2sgKiAoZGRhMV9pbmMgKyBkZGEyX2luYyAvIGRkYTJfc2l6ZSkgLyA0MDk2CisgKgorICogUHJlc3VtYWJseSwgd2hlbiBkZGEzIGlzIGFkZGVkIGluLCBpdCBnZXRzIHRvIGFkanVzdCB0aGUgZGRhMl9pbmMgdmFsdWUKKyAqCisgKiBTbywKKyAqICBkZGExX2lkZWFsID0gc3ViY2Fycmllci9waXhlbCAqIDQwOTYKKyAqICBkZGExX2luYyA9IGZsb29yIChkZGExX2lkZWFsKQorICogIGRkYTIgPSBkZGExX2lkZWFsIC0gZGRhMV9pbmMKKyAqCisgKiAgdGhlbiBwaWNrIGEgcmF0aW8gZm9yIGRkYTIgdGhhdCBnaXZlcyB0aGUgY2xvc2VzdCBhcHByb3hpbWF0aW9uLiBJZgorICogIHlvdSBjYW4ndCBnZXQgY2xvc2UgZW5vdWdoLCB5b3UgY2FuIHBsYXkgd2l0aCBkZGEzIGFzIHdlbGwuIFRoaXMKKyAqICBzZWVtcyBsaWtlbHkgdG8gaGFwcGVuIHdoZW4gZGRhMiBpcyBzbWFsbCBhcyB0aGUganVtcHMgd291bGQgYmUgbGFyZ2VyCisgKgorICogVG8gaW52ZXJ0IHRoaXMsCisgKgorICogIHBpeGVsX2Nsb2NrID0gc3ViY2FycmllciAqIDQwOTYgLyAoZGRhMV9pbmMgKyBkZGEyX2luYyAvIGRkYTJfc2l6ZSkKKyAqCisgKiBUaGUgY29uc3RhbnRzIGJlbG93IHdlcmUgYWxsIGNvbXB1dGVkIHVzaW5nIGEgMTA3LjUyME1IeiBjbG9jaworICovCisKKy8qKgorICogUmVnaXN0ZXIgcHJvZ3JhbW1pbmcgdmFsdWVzIGZvciBUViBtb2Rlcy4KKyAqCisgKiBUaGVzZSB2YWx1ZXMgYWNjb3VudCBmb3IgLTFzIHJlcXVpcmVkLgorICovCisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgdHZfbW9kZSB0dl9tb2Rlc1tdID0geworCXsKKwkJLm5hbWUJCT0gIk5UU0MtTSIsCisJCS5jbG9jawkJPSAxMDc1MjAsCisJCS5yZWZyZXNoCT0gMjk5NzAsCisJCS5vdmVyc2FtcGxlCT0gVFZfT1ZFUlNBTVBMRV84WCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMCwKKwkJLyogNTI1IExpbmVzLCA2MCBGaWVsZHMsIDE1LjczNEtIeiBsaW5lLCBTdWItQ2FycmllciAzLjU4ME1IeiAqLworCisJCS5oc3luY19lbmQJPSA2NCwJCSAgICAuaGJsYW5rX2VuZAkJPSAxMjQsCisJCS5oYmxhbmtfc3RhcnQJPSA4MzYsCQkgICAgLmh0b3RhbAkJPSA4NTcsCisKKwkJLnByb2dyZXNzaXZlCT0gZmFsc2UsCSAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisJCS52c3luY19zdGFydF9mMQk9IDYsCQkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKKwkJLnZzeW5jX2xlbgk9IDYsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCisKKwkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCisJCS5uYnJfZW5kCT0gMjQwLAorCisJCS5idXJzdF9lbmEJPSB0cnVlLAorCQkuaGJ1cnN0X3N0YXJ0CT0gNzIsCQkgICAgLmhidXJzdF9sZW4JCT0gMzQsCisJCS52YnVyc3Rfc3RhcnRfZjEgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YxCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2YyID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjIJPSAyNDAsCisJCS52YnVyc3Rfc3RhcnRfZjMgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YzCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2Y0ID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjQJPSAyNDAsCisKKwkJLyogZGVzaXJlZCAzLjU4MDAwMDAgYWN0dWFsIDMuNTgwMDAwMCBjbG9jayAxMDcuNTIgKi8KKwkJLmRkYTFfaW5jCT0gICAgMTM2LAorCQkuZGRhMl9pbmMJPSAgIDc2MjQsCSAgICAuZGRhMl9zaXplCQk9ICAyMDAxMywKKwkJLmRkYTNfaW5jCT0gICAgICAwLAkgICAgLmRkYTNfc2l6ZQkJPSAgICAgIDAsCisJCS5zY19yZXNldAk9IFRWX1NDX1JFU0VUX0VWRVJZXzQsCisJCS5wYWxfYnVyc3QJPSBmYWxzZSwKKworCQkuY29tcG9zaXRlX2xldmVscyA9ICZudHNjX21fbGV2ZWxzX2NvbXBvc2l0ZSwKKwkJLmNvbXBvc2l0ZV9jb2xvciA9ICZudHNjX21fY3NjX2NvbXBvc2l0ZSwKKwkJLnN2aWRlb19sZXZlbHMgID0gJm50c2NfbV9sZXZlbHNfc3ZpZGVvLAorCQkuc3ZpZGVvX2NvbG9yID0gJm50c2NfbV9jc2Nfc3ZpZGVvLAorCisJCS5maWx0ZXJfdGFibGUgPSBmaWx0ZXJfdGFibGUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJOVFNDLTQ0MyIsCisJCS5jbG9jawkJPSAxMDc1MjAsCisJCS5yZWZyZXNoCT0gMjk5NzAsCisJCS5vdmVyc2FtcGxlCT0gVFZfT1ZFUlNBTVBMRV84WCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMCwKKwkJLyogNTI1IExpbmVzLCA2MCBGaWVsZHMsIDE1LjczNEtIeiBsaW5lLCBTdWItQ2FycmllciA0LjQzTUh6ICovCisJCS5oc3luY19lbmQJPSA2NCwJCSAgICAuaGJsYW5rX2VuZAkJPSAxMjQsCisJCS5oYmxhbmtfc3RhcnQJPSA4MzYsCQkgICAgLmh0b3RhbAkJPSA4NTcsCisKKwkJLnByb2dyZXNzaXZlCT0gZmFsc2UsCSAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisJCS52c3luY19zdGFydF9mMSA9IDYsCQkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKKwkJLnZzeW5jX2xlbgk9IDYsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCisKKwkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCisJCS5uYnJfZW5kCT0gMjQwLAorCisJCS5idXJzdF9lbmEJPSA4LAorCQkuaGJ1cnN0X3N0YXJ0CT0gNzIsCQkgICAgLmhidXJzdF9sZW4JCT0gMzQsCisJCS52YnVyc3Rfc3RhcnRfZjEgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YxCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2YyID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjIJPSAyNDAsCisJCS52YnVyc3Rfc3RhcnRfZjMgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YzCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2Y0ID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjQJPSAyNDAsCisKKwkJLyogZGVzaXJlZCA0LjQzMzYxODAgYWN0dWFsIDQuNDMzNjE4MCBjbG9jayAxMDcuNTIgKi8KKwkJLmRkYTFfaW5jICAgICAgID0gICAgMTY4LAorCQkuZGRhMl9pbmMgICAgICAgPSAgMTg1NTcsICAgICAgIC5kZGEyX3NpemUgICAgICA9ICAyMDYyNSwKKwkJLmRkYTNfaW5jICAgICAgID0gICAgICAwLCAgICAgICAuZGRhM19zaXplICAgICAgPSAgICAgIDAsCisJCS5zY19yZXNldCAgID0gVFZfU0NfUkVTRVRfRVZFUllfOCwKKwkJLnBhbF9idXJzdCAgPSB0cnVlLAorCisJCS5jb21wb3NpdGVfbGV2ZWxzID0gJm50c2NfbV9sZXZlbHNfY29tcG9zaXRlLAorCQkuY29tcG9zaXRlX2NvbG9yID0gJm50c2NfbV9jc2NfY29tcG9zaXRlLAorCQkuc3ZpZGVvX2xldmVscyAgPSAmbnRzY19tX2xldmVsc19zdmlkZW8sCisJCS5zdmlkZW9fY29sb3IgPSAmbnRzY19tX2NzY19zdmlkZW8sCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIk5UU0MtSiIsCisJCS5jbG9jawkJPSAxMDc1MjAsCisJCS5yZWZyZXNoCT0gMjk5NzAsCisJCS5vdmVyc2FtcGxlCT0gVFZfT1ZFUlNBTVBMRV84WCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMCwKKworCQkvKiA1MjUgTGluZXMsIDYwIEZpZWxkcywgMTUuNzM0S0h6IGxpbmUsIFN1Yi1DYXJyaWVyIDMuNTgwTUh6ICovCisJCS5oc3luY19lbmQJPSA2NCwJCSAgICAuaGJsYW5rX2VuZAkJPSAxMjQsCisJCS5oYmxhbmtfc3RhcnQgPSA4MzYsCSAgICAuaHRvdGFsCQk9IDg1NywKKworCQkucHJvZ3Jlc3NpdmUJPSBmYWxzZSwgICAgLnRyaWxldmVsX3N5bmMgPSBmYWxzZSwKKworCQkudnN5bmNfc3RhcnRfZjEJPSA2LAkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKKwkJLnZzeW5jX2xlbgk9IDYsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9zdGFydF9mMiA9IDEsCSAgICAudmVxX2xlbgkJPSAxOCwKKworCQkudmlfZW5kX2YxCT0gMjAsCQkgICAgLnZpX2VuZF9mMgkJPSAyMSwKKwkJLm5icl9lbmQJPSAyNDAsCisKKwkJLmJ1cnN0X2VuYQk9IHRydWUsCisJCS5oYnVyc3Rfc3RhcnQJPSA3MiwJCSAgICAuaGJ1cnN0X2xlbgkJPSAzNCwKKwkJLnZidXJzdF9zdGFydF9mMSA9IDksCQkgICAgLnZidXJzdF9lbmRfZjEJPSAyNDAsCisJCS52YnVyc3Rfc3RhcnRfZjIgPSAxMCwJCSAgICAudmJ1cnN0X2VuZF9mMgk9IDI0MCwKKwkJLnZidXJzdF9zdGFydF9mMyA9IDksCQkgICAgLnZidXJzdF9lbmRfZjMJPSAyNDAsCisJCS52YnVyc3Rfc3RhcnRfZjQgPSAxMCwJCSAgICAudmJ1cnN0X2VuZF9mNAk9IDI0MCwKKworCQkvKiBkZXNpcmVkIDMuNTgwMDAwMCBhY3R1YWwgMy41ODAwMDAwIGNsb2NrIDEwNy41MiAqLworCQkuZGRhMV9pbmMJPSAgICAxMzYsCisJCS5kZGEyX2luYwk9ICAgNzYyNCwJICAgIC5kZGEyX3NpemUJCT0gIDIwMDEzLAorCQkuZGRhM19pbmMJPSAgICAgIDAsCSAgICAuZGRhM19zaXplCQk9ICAgICAgMCwKKwkJLnNjX3Jlc2V0CT0gVFZfU0NfUkVTRVRfRVZFUllfNCwKKwkJLnBhbF9idXJzdAk9IGZhbHNlLAorCisJCS5jb21wb3NpdGVfbGV2ZWxzID0gJm50c2Nfal9sZXZlbHNfY29tcG9zaXRlLAorCQkuY29tcG9zaXRlX2NvbG9yID0gJm50c2Nfal9jc2NfY29tcG9zaXRlLAorCQkuc3ZpZGVvX2xldmVscyAgPSAmbnRzY19qX2xldmVsc19zdmlkZW8sCisJCS5zdmlkZW9fY29sb3IgPSAmbnRzY19qX2NzY19zdmlkZW8sCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIlBBTC1NIiwKKwkJLmNsb2NrCQk9IDEwNzUyMCwKKwkJLnJlZnJlc2gJPSAyOTk3MCwKKwkJLm92ZXJzYW1wbGUJPSBUVl9PVkVSU0FNUExFXzhYLAorCQkuY29tcG9uZW50X29ubHkgPSAwLAorCisJCS8qIDUyNSBMaW5lcywgNjAgRmllbGRzLCAxNS43MzRLSHogbGluZSwgU3ViLUNhcnJpZXIgMy41ODBNSHogKi8KKwkJLmhzeW5jX2VuZAk9IDY0LAkJICAuaGJsYW5rX2VuZAkJPSAxMjQsCisJCS5oYmxhbmtfc3RhcnQgPSA4MzYsCSAgLmh0b3RhbAkJPSA4NTcsCisKKwkJLnByb2dyZXNzaXZlCT0gZmFsc2UsCSAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisJCS52c3luY19zdGFydF9mMQk9IDYsCQkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKKwkJLnZzeW5jX2xlbgk9IDYsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCisKKwkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCisJCS5uYnJfZW5kCT0gMjQwLAorCisJCS5idXJzdF9lbmEJPSB0cnVlLAorCQkuaGJ1cnN0X3N0YXJ0CT0gNzIsCQkgICAgLmhidXJzdF9sZW4JCT0gMzQsCisJCS52YnVyc3Rfc3RhcnRfZjEgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YxCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2YyID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjIJPSAyNDAsCisJCS52YnVyc3Rfc3RhcnRfZjMgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YzCT0gMjQwLAorCQkudmJ1cnN0X3N0YXJ0X2Y0ID0gMTAsCQkgICAgLnZidXJzdF9lbmRfZjQJPSAyNDAsCisKKwkJLyogZGVzaXJlZCAzLjU4MDAwMDAgYWN0dWFsIDMuNTgwMDAwMCBjbG9jayAxMDcuNTIgKi8KKwkJLmRkYTFfaW5jCT0gICAgMTM2LAorCQkuZGRhMl9pbmMJPSAgICA3NjI0LAkgICAgLmRkYTJfc2l6ZQkJPSAgMjAwMTMsCisJCS5kZGEzX2luYwk9ICAgICAgMCwJICAgIC5kZGEzX3NpemUJCT0gICAgICAwLAorCQkuc2NfcmVzZXQJPSBUVl9TQ19SRVNFVF9FVkVSWV80LAorCQkucGFsX2J1cnN0ICA9IGZhbHNlLAorCisJCS5jb21wb3NpdGVfbGV2ZWxzID0gJnBhbF9tX2xldmVsc19jb21wb3NpdGUsCisJCS5jb21wb3NpdGVfY29sb3IgPSAmcGFsX21fY3NjX2NvbXBvc2l0ZSwKKwkJLnN2aWRlb19sZXZlbHMgID0gJnBhbF9tX2xldmVsc19zdmlkZW8sCisJCS5zdmlkZW9fY29sb3IgPSAmcGFsX21fY3NjX3N2aWRlbywKKworCQkuZmlsdGVyX3RhYmxlID0gZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkvKiA2MjUgTGluZXMsIDUwIEZpZWxkcywgMTUuNjI1S0h6IGxpbmUsIFN1Yi1DYXJyaWVyIDQuNDM0TUh6ICovCisJCS5uYW1lCSAgICA9ICJQQUwtTiIsCisJCS5jbG9jawkJPSAxMDc1MjAsCisJCS5yZWZyZXNoCT0gMjUwMDAsCisJCS5vdmVyc2FtcGxlCT0gVFZfT1ZFUlNBTVBMRV84WCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMCwKKworCQkuaHN5bmNfZW5kCT0gNjQsCQkgICAgLmhibGFua19lbmQJCT0gMTI4LAorCQkuaGJsYW5rX3N0YXJ0ID0gODQ0LAkgICAgLmh0b3RhbAkJPSA4NjMsCisKKwkJLnByb2dyZXNzaXZlICA9IGZhbHNlLCAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisKKwkJLnZzeW5jX3N0YXJ0X2YxCT0gNiwJICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKKwkJLnZzeW5jX2xlbgk9IDYsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCisKKwkJLnZpX2VuZF9mMQk9IDI0LAkJICAgIC52aV9lbmRfZjIJCT0gMjUsCisJCS5uYnJfZW5kCT0gMjg2LAorCisJCS5idXJzdF9lbmEJPSB0cnVlLAorCQkuaGJ1cnN0X3N0YXJ0ID0gNzMsCSAgICAJICAgIC5oYnVyc3RfbGVuCQk9IDM0LAorCQkudmJ1cnN0X3N0YXJ0X2YxID0gOCwJICAgIC52YnVyc3RfZW5kX2YxCT0gMjg1LAorCQkudmJ1cnN0X3N0YXJ0X2YyID0gOCwJICAgIC52YnVyc3RfZW5kX2YyCT0gMjg2LAorCQkudmJ1cnN0X3N0YXJ0X2YzID0gOSwJICAgIC52YnVyc3RfZW5kX2YzCT0gMjg2LAorCQkudmJ1cnN0X3N0YXJ0X2Y0ID0gOSwJICAgIC52YnVyc3RfZW5kX2Y0CT0gMjg1LAorCisKKwkJLyogZGVzaXJlZCA0LjQzMzYxODAgYWN0dWFsIDQuNDMzNjE4MCBjbG9jayAxMDcuNTIgKi8KKwkJLmRkYTFfaW5jICAgICAgID0gICAgMTY4LAorCQkuZGRhMl9pbmMgICAgICAgPSAgMTg1NTcsICAgICAgIC5kZGEyX3NpemUgICAgICA9ICAyMDYyNSwKKwkJLmRkYTNfaW5jICAgICAgID0gICAgICAwLCAgICAgICAuZGRhM19zaXplICAgICAgPSAgICAgIDAsCisJCS5zY19yZXNldCAgID0gVFZfU0NfUkVTRVRfRVZFUllfOCwKKwkJLnBhbF9idXJzdCAgPSB0cnVlLAorCisJCS5jb21wb3NpdGVfbGV2ZWxzID0gJnBhbF9uX2xldmVsc19jb21wb3NpdGUsCisJCS5jb21wb3NpdGVfY29sb3IgPSAmcGFsX25fY3NjX2NvbXBvc2l0ZSwKKwkJLnN2aWRlb19sZXZlbHMgID0gJnBhbF9uX2xldmVsc19zdmlkZW8sCisJCS5zdmlkZW9fY29sb3IgPSAmcGFsX25fY3NjX3N2aWRlbywKKworCQkuZmlsdGVyX3RhYmxlID0gZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkvKiA2MjUgTGluZXMsIDUwIEZpZWxkcywgMTUuNjI1S0h6IGxpbmUsIFN1Yi1DYXJyaWVyIDQuNDM0TUh6ICovCisJCS5uYW1lCSAgICA9ICJQQUwiLAorCQkuY2xvY2sJCT0gMTA3NTIwLAorCQkucmVmcmVzaAk9IDI1MDAwLAorCQkub3ZlcnNhbXBsZQk9IFRWX09WRVJTQU1QTEVfOFgsCisJCS5jb21wb25lbnRfb25seSA9IDAsCisKKwkJLmhzeW5jX2VuZAk9IDY0LAkJICAgIC5oYmxhbmtfZW5kCQk9IDEyOCwKKwkJLmhibGFua19zdGFydAk9IDg0NCwJICAgIC5odG90YWwJCT0gODYzLAorCisJCS5wcm9ncmVzc2l2ZQk9IGZhbHNlLCAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisJCS52c3luY19zdGFydF9mMQk9IDUsCSAgICAudnN5bmNfc3RhcnRfZjIJPSA2LAorCQkudnN5bmNfbGVuCT0gNSwKKworCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSAwLAorCQkudmVxX3N0YXJ0X2YyCT0gMSwJICAgIC52ZXFfbGVuCQk9IDE1LAorCisJCS52aV9lbmRfZjEJPSAyNCwJCSAgICAudmlfZW5kX2YyCQk9IDI1LAorCQkubmJyX2VuZAk9IDI4NiwKKworCQkuYnVyc3RfZW5hCT0gdHJ1ZSwKKwkJLmhidXJzdF9zdGFydAk9IDczLAkJICAgIC5oYnVyc3RfbGVuCQk9IDMyLAorCQkudmJ1cnN0X3N0YXJ0X2YxID0gOCwJCSAgICAudmJ1cnN0X2VuZF9mMQk9IDI4NSwKKwkJLnZidXJzdF9zdGFydF9mMiA9IDgsCQkgICAgLnZidXJzdF9lbmRfZjIJPSAyODYsCisJCS52YnVyc3Rfc3RhcnRfZjMgPSA5LAkJICAgIC52YnVyc3RfZW5kX2YzCT0gMjg2LAorCQkudmJ1cnN0X3N0YXJ0X2Y0ID0gOSwJCSAgICAudmJ1cnN0X2VuZF9mNAk9IDI4NSwKKworCQkvKiBkZXNpcmVkIDQuNDMzNjE4MCBhY3R1YWwgNC40MzM2MTgwIGNsb2NrIDEwNy41MiAqLworCQkuZGRhMV9pbmMgICAgICAgPSAgICAxNjgsCisJCS5kZGEyX2luYyAgICAgICA9ICAxODU1NywgICAgICAgLmRkYTJfc2l6ZSAgICAgID0gIDIwNjI1LAorCQkuZGRhM19pbmMgICAgICAgPSAgICAgIDAsICAgICAgIC5kZGEzX3NpemUgICAgICA9ICAgICAgMCwKKwkJLnNjX3Jlc2V0ICAgPSBUVl9TQ19SRVNFVF9FVkVSWV84LAorCQkucGFsX2J1cnN0ICA9IHRydWUsCisKKwkJLmNvbXBvc2l0ZV9sZXZlbHMgPSAmcGFsX2xldmVsc19jb21wb3NpdGUsCisJCS5jb21wb3NpdGVfY29sb3IgPSAmcGFsX2NzY19jb21wb3NpdGUsCisJCS5zdmlkZW9fbGV2ZWxzICA9ICZwYWxfbGV2ZWxzX3N2aWRlbywKKwkJLnN2aWRlb19jb2xvciA9ICZwYWxfY3NjX3N2aWRlbywKKworCQkuZmlsdGVyX3RhYmxlID0gZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICI0ODBwQDU5Ljk0SHoiLAorCQkuY2xvY2sgCT0gMTA3NTIwLAorCQkucmVmcmVzaAk9IDU5OTQwLAorCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzRYLAorCQkuY29tcG9uZW50X29ubHkgPSAxLAorCisJCS5oc3luY19lbmQgICAgICA9IDY0LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAxMjIsCisJCS5oYmxhbmtfc3RhcnQgICA9IDg0MiwgICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSA4NTcsCisKKwkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAorCisJCS52c3luY19zdGFydF9mMSA9IDEyLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMiwKKwkJLnZzeW5jX2xlbiAgICAgID0gMTIsCisKKwkJLnZlcV9lbmEgICAgICAgID0gZmFsc2UsCisKKwkJLnZpX2VuZF9mMSAgICAgID0gNDQsICAgICAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgICA9IDQ0LAorCQkubmJyX2VuZCAgICAgICAgPSA0OTYsCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAiNDgwcEA2MEh6IiwKKwkJLmNsb2NrIAk9IDEwNzUyMCwKKwkJLnJlZnJlc2gJPSA2MDAwMCwKKwkJLm92ZXJzYW1wbGUgICAgID0gVFZfT1ZFUlNBTVBMRV80WCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMSwKKworCQkuaHN5bmNfZW5kICAgICAgPSA2NCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMTIyLAorCQkuaGJsYW5rX3N0YXJ0ICAgPSA4NDIsICAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gODU2LAorCisJCS5wcm9ncmVzc2l2ZSAgICA9IHRydWUsLnRyaWxldmVsX3N5bmMgPSBmYWxzZSwKKworCQkudnN5bmNfc3RhcnRfZjEgPSAxMiwgICAgICAgICAgICAgICAudnN5bmNfc3RhcnRfZjIgICAgID0gMTIsCisJCS52c3luY19sZW4gICAgICA9IDEyLAorCisJCS52ZXFfZW5hICAgICAgICA9IGZhbHNlLAorCisJCS52aV9lbmRfZjEgICAgICA9IDQ0LCAgICAgICAgICAgICAgIC52aV9lbmRfZjIgICAgICAgICAgPSA0NCwKKwkJLm5icl9lbmQgICAgICAgID0gNDk2LAorCisJCS5idXJzdF9lbmEgICAgICA9IGZhbHNlLAorCisJCS5maWx0ZXJfdGFibGUgPSBmaWx0ZXJfdGFibGUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgID0gIjU3NnAiLAorCQkuY2xvY2sgCT0gMTA3NTIwLAorCQkucmVmcmVzaAk9IDUwMDAwLAorCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzRYLAorCQkuY29tcG9uZW50X29ubHkgPSAxLAorCisJCS5oc3luY19lbmQgICAgICA9IDY0LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAxMzksCisJCS5oYmxhbmtfc3RhcnQgICA9IDg1OSwgICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSA4NjMsCisKKwkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwJCS50cmlsZXZlbF9zeW5jID0gZmFsc2UsCisKKwkJLnZzeW5jX3N0YXJ0X2YxID0gMTAsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDEwLAorCQkudnN5bmNfbGVuICAgICAgPSAxMCwKKworCQkudmVxX2VuYSAgICAgICAgPSBmYWxzZSwKKworCQkudmlfZW5kX2YxICAgICAgPSA0OCwgICAgICAgICAgICAgICAudmlfZW5kX2YyICAgICAgICAgID0gNDgsCisJCS5uYnJfZW5kICAgICAgICA9IDU3NSwKKworCQkuYnVyc3RfZW5hICAgICAgPSBmYWxzZSwKKworCQkuZmlsdGVyX3RhYmxlID0gZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICI3MjBwQDYwSHoiLAorCQkuY2xvY2sJCT0gMTQ4ODAwLAorCQkucmVmcmVzaAk9IDYwMDAwLAorCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzJYLAorCQkuY29tcG9uZW50X29ubHkgPSAxLAorCisJCS5oc3luY19lbmQgICAgICA9IDgwLCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAzMDAsCisJCS5oYmxhbmtfc3RhcnQgICA9IDE1ODAsICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSAxNjQ5LAorCisJCS5wcm9ncmVzc2l2ZSAgICA9IHRydWUsIAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCisJCS52c3luY19zdGFydF9mMSA9IDEwLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMCwKKwkJLnZzeW5jX2xlbiAgICAgID0gMTAsCisKKwkJLnZlcV9lbmEgICAgICAgID0gZmFsc2UsCisKKwkJLnZpX2VuZF9mMSAgICAgID0gMjksICAgICAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgICA9IDI5LAorCQkubmJyX2VuZCAgICAgICAgPSA3MTksCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAiNzIwcEA1OS45NEh6IiwKKwkJLmNsb2NrCQk9IDE0ODgwMCwKKwkJLnJlZnJlc2gJPSA1OTk0MCwKKwkJLm92ZXJzYW1wbGUgICAgID0gVFZfT1ZFUlNBTVBMRV8yWCwKKwkJLmNvbXBvbmVudF9vbmx5ID0gMSwKKworCQkuaHN5bmNfZW5kICAgICAgPSA4MCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMzAwLAorCQkuaGJsYW5rX3N0YXJ0ICAgPSAxNTgwLCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMTY1MSwKKworCQkucHJvZ3Jlc3NpdmUgICAgPSB0cnVlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKworCQkudnN5bmNfc3RhcnRfZjEgPSAxMCwgICAgICAgICAgICAgICAudnN5bmNfc3RhcnRfZjIgICAgID0gMTAsCisJCS52c3luY19sZW4gICAgICA9IDEwLAorCisJCS52ZXFfZW5hICAgICAgICA9IGZhbHNlLAorCisJCS52aV9lbmRfZjEgICAgICA9IDI5LCAgICAgICAgICAgICAgIC52aV9lbmRfZjIgICAgICAgICAgPSAyOSwKKwkJLm5icl9lbmQgICAgICAgID0gNzE5LAorCisJCS5idXJzdF9lbmEgICAgICA9IGZhbHNlLAorCisJCS5maWx0ZXJfdGFibGUgPSBmaWx0ZXJfdGFibGUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgID0gIjcyMHBANTBIeiIsCisJCS5jbG9jawkJPSAxNDg4MDAsCisJCS5yZWZyZXNoCT0gNTAwMDAsCisJCS5vdmVyc2FtcGxlICAgICA9IFRWX09WRVJTQU1QTEVfMlgsCisJCS5jb21wb25lbnRfb25seSA9IDEsCisKKwkJLmhzeW5jX2VuZCAgICAgID0gODAsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDMwMCwKKwkJLmhibGFua19zdGFydCAgID0gMTU4MCwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDE5NzksCisKKwkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwgCSAgICAgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCisJCS52c3luY19zdGFydF9mMSA9IDEwLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMCwKKwkJLnZzeW5jX2xlbiAgICAgID0gMTAsCisKKwkJLnZlcV9lbmEgICAgICAgID0gZmFsc2UsCisKKwkJLnZpX2VuZF9mMSAgICAgID0gMjksICAgICAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgICA9IDI5LAorCQkubmJyX2VuZCAgICAgICAgPSA3MTksCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwkJLm1heF9zcmN3ID0gODAwCisJfSwKKwl7CisJCS5uYW1lICAgICAgID0gIjEwODBpQDUwSHoiLAorCQkuY2xvY2sJCT0gMTQ4ODAwLAorCQkucmVmcmVzaAk9IDI1MDAwLAorCQkub3ZlcnNhbXBsZSAgICAgPSBUVl9PVkVSU0FNUExFXzJYLAorCQkuY29tcG9uZW50X29ubHkgPSAxLAorCisJCS5oc3luY19lbmQgICAgICA9IDg4LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAyMzUsCisJCS5oYmxhbmtfc3RhcnQgICA9IDIxNTUsICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSAyNjM5LAorCisJCS5wcm9ncmVzc2l2ZSAgICA9IGZhbHNlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKworCQkudnN5bmNfc3RhcnRfZjEgPSA0LCAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDUsCisJCS52c3luY19sZW4gICAgICA9IDEwLAorCisJCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDQsCisJCS52ZXFfc3RhcnRfZjIgICA9IDQsCSAgICAudmVxX2xlbgkJPSAxMCwKKworCisJCS52aV9lbmRfZjEgICAgICA9IDIxLCAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgICA9IDIyLAorCQkubmJyX2VuZCAgICAgICAgPSA1MzksCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAiMTA4MGlANjBIeiIsCisJCS5jbG9jawkJPSAxNDg4MDAsCisJCS5yZWZyZXNoCT0gMzAwMDAsCisJCS5vdmVyc2FtcGxlICAgICA9IFRWX09WRVJTQU1QTEVfMlgsCisJCS5jb21wb25lbnRfb25seSA9IDEsCisKKwkJLmhzeW5jX2VuZCAgICAgID0gODgsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDIzNSwKKwkJLmhibGFua19zdGFydCAgID0gMjE1NSwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDIxOTksCisKKwkJLnByb2dyZXNzaXZlICAgID0gZmFsc2UsIAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCisJCS52c3luY19zdGFydF9mMSA9IDQsICAgICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgICA9IDUsCisJCS52c3luY19sZW4gICAgICA9IDEwLAorCisJCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDQsCisJCS52ZXFfc3RhcnRfZjIJPSA0LAkJICAgIC52ZXFfbGVuCQk9IDEwLAorCisKKwkJLnZpX2VuZF9mMSAgICAgID0gMjEsICAgICAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgICA9IDIyLAorCQkubmJyX2VuZCAgICAgICAgPSA1MzksCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgPSAiMTA4MGlANTkuOTRIeiIsCisJCS5jbG9jawkJPSAxNDg4MDAsCisJCS5yZWZyZXNoCT0gMjk5NzAsCisJCS5vdmVyc2FtcGxlICAgICA9IFRWX09WRVJTQU1QTEVfMlgsCisJCS5jb21wb25lbnRfb25seSA9IDEsCisKKwkJLmhzeW5jX2VuZCAgICAgID0gODgsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDIzNSwKKwkJLmhibGFua19zdGFydCAgID0gMjE1NSwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDIyMDAsCisKKwkJLnByb2dyZXNzaXZlICAgID0gZmFsc2UsIAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCisJCS52c3luY19zdGFydF9mMSA9IDQsICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgID0gNSwKKwkJLnZzeW5jX2xlbiAgICAgID0gMTAsCisKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSA0LAorCQkudmVxX3N0YXJ0X2YyID0gNCwJICAgIAkgICAgLnZlcV9sZW4gPSAxMCwKKworCisJCS52aV9lbmRfZjEgICAgICA9IDIxLCAgICAgICAgICAgLnZpX2VuZF9mMiAgICAgICAgIAk9IDIyLAorCQkubmJyX2VuZCAgICAgICAgPSA1MzksCisKKwkJLmJ1cnN0X2VuYSAgICAgID0gZmFsc2UsCisKKwkJLmZpbHRlcl90YWJsZSA9IGZpbHRlcl90YWJsZSwKKwl9LAorfTsKKworI2RlZmluZSBOVU1fVFZfTU9ERVMgc2l6ZW9mKHR2X21vZGVzKSAvIHNpemVvZiAodHZfbW9kZXNbMF0pCisKK3N0YXRpYyB2b2lkCitpbnRlbF90dl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIERSTV9NT0RFX0RQTVNfT046CisJCUk5MTVfV1JJVEUoVFZfQ1RMLCBJOTE1X1JFQUQoVFZfQ1RMKSB8IFRWX0VOQ19FTkFCTEUpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQlJOTE1X1dSSVRFKFRWX0NUTCwgSTkxNV9SRUFEKFRWX0NUTCkgJiB+VFZfRU5DX0VOQUJMRSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2ludGVsX3R2X3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfdHZfcHJpdiAqdHZfcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJaW50IGk7CisKKwl0dl9wcml2LT5zYXZlX1RWX0hfQ1RMXzEgPSBJOTE1X1JFQUQoVFZfSF9DVExfMSk7CisJdHZfcHJpdi0+c2F2ZV9UVl9IX0NUTF8yID0gSTkxNV9SRUFEKFRWX0hfQ1RMXzIpOworCXR2X3ByaXYtPnNhdmVfVFZfSF9DVExfMyA9IEk5MTVfUkVBRChUVl9IX0NUTF8zKTsKKwl0dl9wcml2LT5zYXZlX1RWX1ZfQ1RMXzEgPSBJOTE1X1JFQUQoVFZfVl9DVExfMSk7CisJdHZfcHJpdi0+c2F2ZV9UVl9WX0NUTF8yID0gSTkxNV9SRUFEKFRWX1ZfQ1RMXzIpOworCXR2X3ByaXYtPnNhdmVfVFZfVl9DVExfMyA9IEk5MTVfUkVBRChUVl9WX0NUTF8zKTsKKwl0dl9wcml2LT5zYXZlX1RWX1ZfQ1RMXzQgPSBJOTE1X1JFQUQoVFZfVl9DVExfNCk7CisJdHZfcHJpdi0+c2F2ZV9UVl9WX0NUTF81ID0gSTkxNV9SRUFEKFRWX1ZfQ1RMXzUpOworCXR2X3ByaXYtPnNhdmVfVFZfVl9DVExfNiA9IEk5MTVfUkVBRChUVl9WX0NUTF82KTsKKwl0dl9wcml2LT5zYXZlX1RWX1ZfQ1RMXzcgPSBJOTE1X1JFQUQoVFZfVl9DVExfNyk7CisJdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMSA9IEk5MTVfUkVBRChUVl9TQ19DVExfMSk7CisJdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMiA9IEk5MTVfUkVBRChUVl9TQ19DVExfMik7CisJdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMyA9IEk5MTVfUkVBRChUVl9TQ19DVExfMyk7CisKKwl0dl9wcml2LT5zYXZlX1RWX0NTQ19ZID0gSTkxNV9SRUFEKFRWX0NTQ19ZKTsKKwl0dl9wcml2LT5zYXZlX1RWX0NTQ19ZMiA9IEk5MTVfUkVBRChUVl9DU0NfWTIpOworCXR2X3ByaXYtPnNhdmVfVFZfQ1NDX1UgPSBJOTE1X1JFQUQoVFZfQ1NDX1UpOworCXR2X3ByaXYtPnNhdmVfVFZfQ1NDX1UyID0gSTkxNV9SRUFEKFRWX0NTQ19VMik7CisJdHZfcHJpdi0+c2F2ZV9UVl9DU0NfViA9IEk5MTVfUkVBRChUVl9DU0NfVik7CisJdHZfcHJpdi0+c2F2ZV9UVl9DU0NfVjIgPSBJOTE1X1JFQUQoVFZfQ1NDX1YyKTsKKwl0dl9wcml2LT5zYXZlX1RWX0NMUl9LTk9CUyA9IEk5MTVfUkVBRChUVl9DTFJfS05PQlMpOworCXR2X3ByaXYtPnNhdmVfVFZfQ0xSX0xFVkVMID0gSTkxNV9SRUFEKFRWX0NMUl9MRVZFTCk7CisJdHZfcHJpdi0+c2F2ZV9UVl9XSU5fUE9TID0gSTkxNV9SRUFEKFRWX1dJTl9QT1MpOworCXR2X3ByaXYtPnNhdmVfVFZfV0lOX1NJWkUgPSBJOTE1X1JFQUQoVFZfV0lOX1NJWkUpOworCXR2X3ByaXYtPnNhdmVfVFZfRklMVEVSX0NUTF8xID0gSTkxNV9SRUFEKFRWX0ZJTFRFUl9DVExfMSk7CisJdHZfcHJpdi0+c2F2ZV9UVl9GSUxURVJfQ1RMXzIgPSBJOTE1X1JFQUQoVFZfRklMVEVSX0NUTF8yKTsKKwl0dl9wcml2LT5zYXZlX1RWX0ZJTFRFUl9DVExfMyA9IEk5MTVfUkVBRChUVl9GSUxURVJfQ1RMXzMpOworCisJZm9yIChpID0gMDsgaSA8IDYwOyBpKyspCisJCXR2X3ByaXYtPnNhdmVfVFZfSF9MVU1BW2ldID0gSTkxNV9SRUFEKFRWX0hfTFVNQV8wICsgKGkgPDwyKSk7CisJZm9yIChpID0gMDsgaSA8IDYwOyBpKyspCisJCXR2X3ByaXYtPnNhdmVfVFZfSF9DSFJPTUFbaV0gPSBJOTE1X1JFQUQoVFZfSF9DSFJPTUFfMCArIChpIDw8MikpOworCWZvciAoaSA9IDA7IGkgPCA0MzsgaSsrKQorCQl0dl9wcml2LT5zYXZlX1RWX1ZfTFVNQVtpXSA9IEk5MTVfUkVBRChUVl9WX0xVTUFfMCArIChpIDw8MikpOworCWZvciAoaSA9IDA7IGkgPCA0MzsgaSsrKQorCQl0dl9wcml2LT5zYXZlX1RWX1ZfQ0hST01BW2ldID0gSTkxNV9SRUFEKFRWX1ZfQ0hST01BXzAgKyAoaSA8PDIpKTsKKworCXR2X3ByaXYtPnNhdmVfVFZfREFDID0gSTkxNV9SRUFEKFRWX0RBQyk7CisJdHZfcHJpdi0+c2F2ZV9UVl9DVEwgPSBJOTE1X1JFQUQoVFZfQ1RMKTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX3R2X3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfdHZfcHJpdiAqdHZfcHJpdiA9IGludGVsX291dHB1dC0+ZGV2X3ByaXY7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOworCWludCBpOworCisJLyogRklYTUU6IE5vIENSVEM/ICovCisJaWYgKCFjcnRjKQorCQlyZXR1cm47CisKKwlpbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKKwlJOTE1X1dSSVRFKFRWX0hfQ1RMXzEsIHR2X3ByaXYtPnNhdmVfVFZfSF9DVExfMSk7CisJSTkxNV9XUklURShUVl9IX0NUTF8yLCB0dl9wcml2LT5zYXZlX1RWX0hfQ1RMXzIpOworCUk5MTVfV1JJVEUoVFZfSF9DVExfMywgdHZfcHJpdi0+c2F2ZV9UVl9IX0NUTF8zKTsKKwlJOTE1X1dSSVRFKFRWX1ZfQ1RMXzEsIHR2X3ByaXYtPnNhdmVfVFZfVl9DVExfMSk7CisJSTkxNV9XUklURShUVl9WX0NUTF8yLCB0dl9wcml2LT5zYXZlX1RWX1ZfQ1RMXzIpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfMywgdHZfcHJpdi0+c2F2ZV9UVl9WX0NUTF8zKTsKKwlJOTE1X1dSSVRFKFRWX1ZfQ1RMXzQsIHR2X3ByaXYtPnNhdmVfVFZfVl9DVExfNCk7CisJSTkxNV9XUklURShUVl9WX0NUTF81LCB0dl9wcml2LT5zYXZlX1RWX1ZfQ1RMXzUpOworCUk5MTVfV1JJVEUoVFZfVl9DVExfNiwgdHZfcHJpdi0+c2F2ZV9UVl9WX0NUTF82KTsKKwlJOTE1X1dSSVRFKFRWX1ZfQ1RMXzcsIHR2X3ByaXYtPnNhdmVfVFZfVl9DVExfNyk7CisJSTkxNV9XUklURShUVl9TQ19DVExfMSwgdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMSk7CisJSTkxNV9XUklURShUVl9TQ19DVExfMiwgdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMik7CisJSTkxNV9XUklURShUVl9TQ19DVExfMywgdHZfcHJpdi0+c2F2ZV9UVl9TQ19DVExfMyk7CisKKwlJOTE1X1dSSVRFKFRWX0NTQ19ZLCB0dl9wcml2LT5zYXZlX1RWX0NTQ19ZKTsKKwlJOTE1X1dSSVRFKFRWX0NTQ19ZMiwgdHZfcHJpdi0+c2F2ZV9UVl9DU0NfWTIpOworCUk5MTVfV1JJVEUoVFZfQ1NDX1UsIHR2X3ByaXYtPnNhdmVfVFZfQ1NDX1UpOworCUk5MTVfV1JJVEUoVFZfQ1NDX1UyLCB0dl9wcml2LT5zYXZlX1RWX0NTQ19VMik7CisJSTkxNV9XUklURShUVl9DU0NfViwgdHZfcHJpdi0+c2F2ZV9UVl9DU0NfVik7CisJSTkxNV9XUklURShUVl9DU0NfVjIsIHR2X3ByaXYtPnNhdmVfVFZfQ1NDX1YyKTsKKwlJOTE1X1dSSVRFKFRWX0NMUl9LTk9CUywgdHZfcHJpdi0+c2F2ZV9UVl9DTFJfS05PQlMpOworCUk5MTVfV1JJVEUoVFZfQ0xSX0xFVkVMLCB0dl9wcml2LT5zYXZlX1RWX0NMUl9MRVZFTCk7CisKKwl7CisJCWludCBwaXBlY29uZl9yZWcgPSAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSA/CisJCQlQSVBFQUNPTkYgOiBQSVBFQkNPTkY7CisJCWludCBkc3BjbnRyX3JlZyA9IChpbnRlbF9jcnRjLT5wbGFuZSA9PSAwKSA/CisJCQlEU1BBQ05UUiA6IERTUEJDTlRSOworCQlpbnQgcGlwZWNvbmYgPSBJOTE1X1JFQUQocGlwZWNvbmZfcmVnKTsKKwkJaW50IGRzcGNudHIgPSBJOTE1X1JFQUQoZHNwY250cl9yZWcpOworCQlpbnQgZHNwYmFzZV9yZWcgPSAoaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCkgPworCQkJRFNQQUFERFIgOiBEU1BCQUREUjsKKwkJLyogUGlwZSBtdXN0IGJlIG9mZiBoZXJlICovCisJCUk5MTVfV1JJVEUoZHNwY250cl9yZWcsIGRzcGNudHIgJiB+RElTUExBWV9QTEFORV9FTkFCTEUpOworCQkvKiBGbHVzaCB0aGUgcGxhbmUgY2hhbmdlcyAqLworCQlJOTE1X1dSSVRFKGRzcGJhc2VfcmVnLCBJOTE1X1JFQUQoZHNwYmFzZV9yZWcpKTsKKworCQlpZiAoIUlTX0k5WFgoZGV2KSkgeworCQkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVjdCAqLworCQkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisJCX0KKworCQlJOTE1X1dSSVRFKHBpcGVjb25mX3JlZywgcGlwZWNvbmYgJiB+UElQRUFDT05GX0VOQUJMRSk7CisJCS8qIFdhaXQgZm9yIHZibGFuayBmb3IgdGhlIGRpc2FibGUgdG8gdGFrZSBlZmZlY3QuICovCisJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJCS8qIEZpbHRlciBjdGwgbXVzdCBiZSBzZXQgYmVmb3JlIFRWX1dJTl9TSVpFICovCisJCUk5MTVfV1JJVEUoVFZfRklMVEVSX0NUTF8xLCB0dl9wcml2LT5zYXZlX1RWX0ZJTFRFUl9DVExfMSk7CisJCUk5MTVfV1JJVEUoVFZfRklMVEVSX0NUTF8yLCB0dl9wcml2LT5zYXZlX1RWX0ZJTFRFUl9DVExfMik7CisJCUk5MTVfV1JJVEUoVFZfRklMVEVSX0NUTF8zLCB0dl9wcml2LT5zYXZlX1RWX0ZJTFRFUl9DVExfMyk7CisJCUk5MTVfV1JJVEUoVFZfV0lOX1BPUywgdHZfcHJpdi0+c2F2ZV9UVl9XSU5fUE9TKTsKKwkJSTkxNV9XUklURShUVl9XSU5fU0laRSwgdHZfcHJpdi0+c2F2ZV9UVl9XSU5fU0laRSk7CisJCUk5MTVfV1JJVEUocGlwZWNvbmZfcmVnLCBwaXBlY29uZik7CisJCUk5MTVfV1JJVEUoZHNwY250cl9yZWcsIGRzcGNudHIpOworCQkvKiBGbHVzaCB0aGUgcGxhbmUgY2hhbmdlcyAqLworCQlJOTE1X1dSSVRFKGRzcGJhc2VfcmVnLCBJOTE1X1JFQUQoZHNwYmFzZV9yZWcpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykKKwkJSTkxNV9XUklURShUVl9IX0xVTUFfMCArIChpIDw8MiksIHR2X3ByaXYtPnNhdmVfVFZfSF9MVU1BW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykKKwkJSTkxNV9XUklURShUVl9IX0NIUk9NQV8wICsgKGkgPDwyKSwgdHZfcHJpdi0+c2F2ZV9UVl9IX0NIUk9NQVtpXSk7CisJZm9yIChpID0gMDsgaSA8IDQzOyBpKyspCisJCUk5MTVfV1JJVEUoVFZfVl9MVU1BXzAgKyAoaSA8PDIpLCB0dl9wcml2LT5zYXZlX1RWX1ZfTFVNQVtpXSk7CisJZm9yIChpID0gMDsgaSA8IDQzOyBpKyspCisJCUk5MTVfV1JJVEUoVFZfVl9DSFJPTUFfMCArIChpIDw8MiksIHR2X3ByaXYtPnNhdmVfVFZfVl9DSFJPTUFbaV0pOworCisJSTkxNV9XUklURShUVl9EQUMsIHR2X3ByaXYtPnNhdmVfVFZfREFDKTsKKwlJOTE1X1dSSVRFKFRWX0NUTCwgdHZfcHJpdi0+c2F2ZV9UVl9DVEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR2X21vZGUgKgoraW50ZWxfdHZfbW9kZV9sb29rdXAgKGNoYXIgKnR2X2Zvcm1hdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZfbW9kZXMpIC8gc2l6ZW9mICh0dl9tb2Rlc1swXSk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgdHZfbW9kZSAqdHZfbW9kZSA9ICZ0dl9tb2Rlc1tpXTsKKworCQlpZiAoIXN0cmNtcCh0dl9mb3JtYXQsIHR2X21vZGUtPm5hbWUpKQorCQkJcmV0dXJuIHR2X21vZGU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR2X21vZGUgKgoraW50ZWxfdHZfbW9kZV9maW5kIChzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpCit7CisJc3RydWN0IGludGVsX3R2X3ByaXYgKnR2X3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCisJcmV0dXJuIGludGVsX3R2X21vZGVfbG9va3VwKHR2X3ByaXYtPnR2X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cworaW50ZWxfdHZfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwljb25zdCBzdHJ1Y3QgdHZfbW9kZSAqdHZfbW9kZSA9IGludGVsX3R2X21vZGVfZmluZChpbnRlbF9vdXRwdXQpOworCisJLyogRW5zdXJlIFRWIHJlZnJlc2ggaXMgY2xvc2UgdG8gZGVzaXJlZCByZWZyZXNoICovCisJaWYgKHR2X21vZGUgJiYgYWJzKHR2X21vZGUtPnJlZnJlc2ggLSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKSkgPCAxKQorCQlyZXR1cm4gTU9ERV9PSzsKKwlyZXR1cm4gTU9ERV9DTE9DS19SQU5HRTsKK30KKworCitzdGF0aWMgYm9vbAoraW50ZWxfdHZfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpkcm1fY29uZmlnID0gJmRldi0+bW9kZV9jb25maWc7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gZW5jX3RvX2ludGVsX291dHB1dChlbmNvZGVyKTsKKwljb25zdCBzdHJ1Y3QgdHZfbW9kZSAqdHZfbW9kZSA9IGludGVsX3R2X21vZGVfZmluZCAoaW50ZWxfb3V0cHV0KTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKm90aGVyX2VuY29kZXI7CisKKwlpZiAoIXR2X21vZGUpCisJCXJldHVybiBmYWxzZTsKKworCS8qIEZJWE1FOiBsb2NrIGVuY29kZXIgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkob3RoZXJfZW5jb2RlciwgJmRybV9jb25maWctPmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlpZiAob3RoZXJfZW5jb2RlciAhPSBlbmNvZGVyICYmCisJCSAgICBvdGhlcl9lbmNvZGVyLT5jcnRjID09IGVuY29kZXItPmNydGMpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPSB0dl9tb2RlLT5jbG9jazsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX3R2X21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX3R2X3ByaXYgKnR2X3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0gaW50ZWxfdHZfbW9kZV9maW5kKGludGVsX291dHB1dCk7CisJdTMyIHR2X2N0bDsKKwl1MzIgaGN0bDEsIGhjdGwyLCBoY3RsMzsKKwl1MzIgdmN0bDEsIHZjdGwyLCB2Y3RsMywgdmN0bDQsIHZjdGw1LCB2Y3RsNiwgdmN0bDc7CisJdTMyIHNjY3RsMSwgc2NjdGwyLCBzY2N0bDM7CisJaW50IGksIGo7CisJY29uc3Qgc3RydWN0IHZpZGVvX2xldmVscyAqdmlkZW9fbGV2ZWxzOworCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252ZXJzaW9uICpjb2xvcl9jb252ZXJzaW9uOworCWJvb2wgYnVyc3RfZW5hOworCisJaWYgKCF0dl9tb2RlKQorCQlyZXR1cm47CS8qIGNhbid0IGhhcHBlbiAobW9kZV9wcmVwYXJlIHByZXZlbnRzIHRoaXMpICovCisKKwl0dl9jdGwgPSAwOworCisJc3dpdGNoICh0dl9wcml2LT50eXBlKSB7CisJZGVmYXVsdDoKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvc2l0ZToKKwkJdHZfY3RsIHw9IFRWX0VOQ19PVVRQVVRfQ09NUE9TSVRFOworCQl2aWRlb19sZXZlbHMgPSB0dl9tb2RlLT5jb21wb3NpdGVfbGV2ZWxzOworCQljb2xvcl9jb252ZXJzaW9uID0gdHZfbW9kZS0+Y29tcG9zaXRlX2NvbG9yOworCQlidXJzdF9lbmEgPSB0dl9tb2RlLT5idXJzdF9lbmE7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudDoKKwkJdHZfY3RsIHw9IFRWX0VOQ19PVVRQVVRfQ09NUE9ORU5UOworCQl2aWRlb19sZXZlbHMgPSAmY29tcG9uZW50X2xldmVsczsKKwkJaWYgKHR2X21vZGUtPmJ1cnN0X2VuYSkKKwkJCWNvbG9yX2NvbnZlcnNpb24gPSAmc2R0dl9jc2NfeXBycGI7CisJCWVsc2UKKwkJCWNvbG9yX2NvbnZlcnNpb24gPSAmaGR0dl9jc2NfeXBycGI7CisJCWJ1cnN0X2VuYSA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU86CisJCXR2X2N0bCB8PSBUVl9FTkNfT1VUUFVUX1NWSURFTzsKKwkJdmlkZW9fbGV2ZWxzID0gdHZfbW9kZS0+c3ZpZGVvX2xldmVsczsKKwkJY29sb3JfY29udmVyc2lvbiA9IHR2X21vZGUtPnN2aWRlb19jb2xvcjsKKwkJYnVyc3RfZW5hID0gdHZfbW9kZS0+YnVyc3RfZW5hOworCQlicmVhazsKKwl9CisJaGN0bDEgPSAodHZfbW9kZS0+aHN5bmNfZW5kIDw8IFRWX0hTWU5DX0VORF9TSElGVCkgfAorCQkodHZfbW9kZS0+aHRvdGFsIDw8IFRWX0hUT1RBTF9TSElGVCk7CisKKwloY3RsMiA9ICh0dl9tb2RlLT5oYnVyc3Rfc3RhcnQgPDwgMTYpIHwKKwkJKHR2X21vZGUtPmhidXJzdF9sZW4gPDwgVFZfSEJVUlNUX0xFTl9TSElGVCk7CisKKwlpZiAoYnVyc3RfZW5hKQorCQloY3RsMiB8PSBUVl9CVVJTVF9FTkE7CisKKwloY3RsMyA9ICh0dl9tb2RlLT5oYmxhbmtfc3RhcnQgPDwgVFZfSEJMQU5LX1NUQVJUX1NISUZUKSB8CisJCSh0dl9tb2RlLT5oYmxhbmtfZW5kIDw8IFRWX0hCTEFOS19FTkRfU0hJRlQpOworCisJdmN0bDEgPSAodHZfbW9kZS0+bmJyX2VuZCA8PCBUVl9OQlJfRU5EX1NISUZUKSB8CisJCSh0dl9tb2RlLT52aV9lbmRfZjEgPDwgVFZfVklfRU5EX0YxX1NISUZUKSB8CisJCSh0dl9tb2RlLT52aV9lbmRfZjIgPDwgVFZfVklfRU5EX0YyX1NISUZUKTsKKworCXZjdGwyID0gKHR2X21vZGUtPnZzeW5jX2xlbiA8PCBUVl9WU1lOQ19MRU5fU0hJRlQpIHwKKwkJKHR2X21vZGUtPnZzeW5jX3N0YXJ0X2YxIDw8IFRWX1ZTWU5DX1NUQVJUX0YxX1NISUZUKSB8CisJCSh0dl9tb2RlLT52c3luY19zdGFydF9mMiA8PCBUVl9WU1lOQ19TVEFSVF9GMl9TSElGVCk7CisKKwl2Y3RsMyA9ICh0dl9tb2RlLT52ZXFfbGVuIDw8IFRWX1ZFUV9MRU5fU0hJRlQpIHwKKwkJKHR2X21vZGUtPnZlcV9zdGFydF9mMSA8PCBUVl9WRVFfU1RBUlRfRjFfU0hJRlQpIHwKKwkJKHR2X21vZGUtPnZlcV9zdGFydF9mMiA8PCBUVl9WRVFfU1RBUlRfRjJfU0hJRlQpOworCisJaWYgKHR2X21vZGUtPnZlcV9lbmEpCisJCXZjdGwzIHw9IFRWX0VRVUFMX0VOQTsKKworCXZjdGw0ID0gKHR2X21vZGUtPnZidXJzdF9zdGFydF9mMSA8PCBUVl9WQlVSU1RfU1RBUlRfRjFfU0hJRlQpIHwKKwkJKHR2X21vZGUtPnZidXJzdF9lbmRfZjEgPDwgVFZfVkJVUlNUX0VORF9GMV9TSElGVCk7CisKKwl2Y3RsNSA9ICh0dl9tb2RlLT52YnVyc3Rfc3RhcnRfZjIgPDwgVFZfVkJVUlNUX1NUQVJUX0YyX1NISUZUKSB8CisJCSh0dl9tb2RlLT52YnVyc3RfZW5kX2YyIDw8IFRWX1ZCVVJTVF9FTkRfRjJfU0hJRlQpOworCisJdmN0bDYgPSAodHZfbW9kZS0+dmJ1cnN0X3N0YXJ0X2YzIDw8IFRWX1ZCVVJTVF9TVEFSVF9GM19TSElGVCkgfAorCQkodHZfbW9kZS0+dmJ1cnN0X2VuZF9mMyA8PCBUVl9WQlVSU1RfRU5EX0YzX1NISUZUKTsKKworCXZjdGw3ID0gKHR2X21vZGUtPnZidXJzdF9zdGFydF9mNCA8PCBUVl9WQlVSU1RfU1RBUlRfRjRfU0hJRlQpIHwKKwkJKHR2X21vZGUtPnZidXJzdF9lbmRfZjQgPDwgVFZfVkJVUlNUX0VORF9GNF9TSElGVCk7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQl0dl9jdGwgfD0gVFZfRU5DX1BJUEVCX1NFTEVDVDsKKwl0dl9jdGwgfD0gdHZfbW9kZS0+b3ZlcnNhbXBsZTsKKworCWlmICh0dl9tb2RlLT5wcm9ncmVzc2l2ZSkKKwkJdHZfY3RsIHw9IFRWX1BST0dSRVNTSVZFOworCWlmICh0dl9tb2RlLT50cmlsZXZlbF9zeW5jKQorCQl0dl9jdGwgfD0gVFZfVFJJTEVWRUxfU1lOQzsKKwlpZiAodHZfbW9kZS0+cGFsX2J1cnN0KQorCQl0dl9jdGwgfD0gVFZfUEFMX0JVUlNUOworCXNjY3RsMSA9IDA7CisJLyogZGRhMSBpbXBsaWVzIHZhbGlkIHZpZGVvIGxldmVscyAqLworCWlmICh0dl9tb2RlLT5kZGExX2luYykgeworCQlzY2N0bDEgfD0gVFZfU0NfRERBMV9FTjsKKwkJc2NjdGwxIHw9IHZpZGVvX2xldmVscy0+YnVyc3QgPDwgVFZfQlVSU1RfTEVWRUxfU0hJRlQ7CisJfQorCisJaWYgKHR2X21vZGUtPmRkYTJfaW5jKQorCQlzY2N0bDEgfD0gVFZfU0NfRERBMl9FTjsKKworCWlmICh0dl9tb2RlLT5kZGEzX2luYykKKwkJc2NjdGwxIHw9IFRWX1NDX0REQTNfRU47CisKKwlzY2N0bDEgfD0gdHZfbW9kZS0+c2NfcmVzZXQ7CisJc2NjdGwxIHw9IHR2X21vZGUtPmRkYTFfaW5jIDw8IFRWX1NDRERBMV9JTkNfU0hJRlQ7CisKKwlzY2N0bDIgPSB0dl9tb2RlLT5kZGEyX3NpemUgPDwgVFZfU0NEREEyX1NJWkVfU0hJRlQgfAorCQl0dl9tb2RlLT5kZGEyX2luYyA8PCBUVl9TQ0REQTJfSU5DX1NISUZUOworCisJc2NjdGwzID0gdHZfbW9kZS0+ZGRhM19zaXplIDw8IFRWX1NDRERBM19TSVpFX1NISUZUIHwKKwkJdHZfbW9kZS0+ZGRhM19pbmMgPDwgVFZfU0NEREEzX0lOQ19TSElGVDsKKworCS8qIEVuYWJsZSB0d28gZml4ZXMgZm9yIHRoZSBjaGlwcyB0aGF0IG5lZWQgdGhlbS4gKi8KKwlpZiAoZGV2LT5wY2lfZGV2aWNlIDwgMHgyNzcyKQorCQl0dl9jdGwgfD0gVFZfRU5DX0MwX0ZJWCB8IFRWX0VOQ19TRFBfRklYOworCisJSTkxNV9XUklURShUVl9IX0NUTF8xLCBoY3RsMSk7CisJSTkxNV9XUklURShUVl9IX0NUTF8yLCBoY3RsMik7CisJSTkxNV9XUklURShUVl9IX0NUTF8zLCBoY3RsMyk7CisJSTkxNV9XUklURShUVl9WX0NUTF8xLCB2Y3RsMSk7CisJSTkxNV9XUklURShUVl9WX0NUTF8yLCB2Y3RsMik7CisJSTkxNV9XUklURShUVl9WX0NUTF8zLCB2Y3RsMyk7CisJSTkxNV9XUklURShUVl9WX0NUTF80LCB2Y3RsNCk7CisJSTkxNV9XUklURShUVl9WX0NUTF81LCB2Y3RsNSk7CisJSTkxNV9XUklURShUVl9WX0NUTF82LCB2Y3RsNik7CisJSTkxNV9XUklURShUVl9WX0NUTF83LCB2Y3RsNyk7CisJSTkxNV9XUklURShUVl9TQ19DVExfMSwgc2NjdGwxKTsKKwlJOTE1X1dSSVRFKFRWX1NDX0NUTF8yLCBzY2N0bDIpOworCUk5MTVfV1JJVEUoVFZfU0NfQ1RMXzMsIHNjY3RsMyk7CisKKwlpZiAoY29sb3JfY29udmVyc2lvbikgeworCQlJOTE1X1dSSVRFKFRWX0NTQ19ZLCAoY29sb3JfY29udmVyc2lvbi0+cnkgPDwgMTYpIHwKKwkJCSAgIGNvbG9yX2NvbnZlcnNpb24tPmd5KTsKKwkJSTkxNV9XUklURShUVl9DU0NfWTIsKGNvbG9yX2NvbnZlcnNpb24tPmJ5IDw8IDE2KSB8CisJCQkgICBjb2xvcl9jb252ZXJzaW9uLT5heSk7CisJCUk5MTVfV1JJVEUoVFZfQ1NDX1UsIChjb2xvcl9jb252ZXJzaW9uLT5ydSA8PCAxNikgfAorCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3UpOworCQlJOTE1X1dSSVRFKFRWX0NTQ19VMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ1IDw8IDE2KSB8CisJCQkgICBjb2xvcl9jb252ZXJzaW9uLT5hdSk7CisJCUk5MTVfV1JJVEUoVFZfQ1NDX1YsIChjb2xvcl9jb252ZXJzaW9uLT5ydiA8PCAxNikgfAorCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3YpOworCQlJOTE1X1dSSVRFKFRWX0NTQ19WMiwgKGNvbG9yX2NvbnZlcnNpb24tPmJ2IDw8IDE2KSB8CisJCQkgICBjb2xvcl9jb252ZXJzaW9uLT5hdik7CisJfQorCisJSTkxNV9XUklURShUVl9DTFJfS05PQlMsIDB4MDA2MDYwMDApOworCWlmICh2aWRlb19sZXZlbHMpCisJCUk5MTVfV1JJVEUoVFZfQ0xSX0xFVkVMLAorCQkJICAgKCh2aWRlb19sZXZlbHMtPmJsYWNrIDw8IFRWX0JMQUNLX0xFVkVMX1NISUZUKSB8CisJCQkgICAgKHZpZGVvX2xldmVscy0+YmxhbmsgPDwgVFZfQkxBTktfTEVWRUxfU0hJRlQpKSk7CisJeworCQlpbnQgcGlwZWNvbmZfcmVnID0gKGludGVsX2NydGMtPnBpcGUgPT0gMCkgPworCQkJUElQRUFDT05GIDogUElQRUJDT05GOworCQlpbnQgZHNwY250cl9yZWcgPSAoaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCkgPworCQkJRFNQQUNOVFIgOiBEU1BCQ05UUjsKKwkJaW50IHBpcGVjb25mID0gSTkxNV9SRUFEKHBpcGVjb25mX3JlZyk7CisJCWludCBkc3BjbnRyID0gSTkxNV9SRUFEKGRzcGNudHJfcmVnKTsKKwkJaW50IGRzcGJhc2VfcmVnID0gKGludGVsX2NydGMtPnBsYW5lID09IDApID8KKwkJCURTUEFBRERSIDogRFNQQkFERFI7CisJCWludCB4cG9zID0gMHgwLCB5cG9zID0gMHgwOworCQl1bnNpZ25lZCBpbnQgeHNpemUsIHlzaXplOworCQkvKiBQaXBlIG11c3QgYmUgb2ZmIGhlcmUgKi8KKwkJSTkxNV9XUklURShkc3BjbnRyX3JlZywgZHNwY250ciAmIH5ESVNQTEFZX1BMQU5FX0VOQUJMRSk7CisJCS8qIEZsdXNoIHRoZSBwbGFuZSBjaGFuZ2VzICovCisJCUk5MTVfV1JJVEUoZHNwYmFzZV9yZWcsIEk5MTVfUkVBRChkc3BiYXNlX3JlZykpOworCisJCS8qIFdhaXQgZm9yIHZibGFuayBmb3IgdGhlIGRpc2FibGUgdG8gdGFrZSBlZmZlY3QgKi8KKwkJaWYgKCFJU19JOVhYKGRldikpCisJCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKKworCQlJOTE1X1dSSVRFKHBpcGVjb25mX3JlZywgcGlwZWNvbmYgJiB+UElQRUFDT05GX0VOQUJMRSk7CisJCS8qIFdhaXQgZm9yIHZibGFuayBmb3IgdGhlIGRpc2FibGUgdG8gdGFrZSBlZmZlY3QuICovCisJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJCS8qIEZpbHRlciBjdGwgbXVzdCBiZSBzZXQgYmVmb3JlIFRWX1dJTl9TSVpFICovCisJCUk5MTVfV1JJVEUoVFZfRklMVEVSX0NUTF8xLCBUVl9BVVRPX1NDQUxFKTsKKwkJeHNpemUgPSB0dl9tb2RlLT5oYmxhbmtfc3RhcnQgLSB0dl9tb2RlLT5oYmxhbmtfZW5kOworCQlpZiAodHZfbW9kZS0+cHJvZ3Jlc3NpdmUpCisJCQl5c2l6ZSA9IHR2X21vZGUtPm5icl9lbmQgKyAxOworCQllbHNlCisJCQl5c2l6ZSA9IDIqdHZfbW9kZS0+bmJyX2VuZCArIDE7CisKKwkJeHBvcyArPSB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX0xFRlRdOworCQl5cG9zICs9IHR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fVE9QXTsKKwkJeHNpemUgLT0gKHR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fTEVGVF0gKworCQkJICB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1JJR0hUXSk7CisJCXlzaXplIC09ICh0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1RPUF0gKworCQkJICB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX0JPVFRPTV0pOworCQlJOTE1X1dSSVRFKFRWX1dJTl9QT1MsICh4cG9zPDwxNil8eXBvcyk7CisJCUk5MTVfV1JJVEUoVFZfV0lOX1NJWkUsICh4c2l6ZTw8MTYpfHlzaXplKTsKKworCQlJOTE1X1dSSVRFKHBpcGVjb25mX3JlZywgcGlwZWNvbmYpOworCQlJOTE1X1dSSVRFKGRzcGNudHJfcmVnLCBkc3BjbnRyKTsKKwkJLyogRmx1c2ggdGhlIHBsYW5lIGNoYW5nZXMgKi8KKwkJSTkxNV9XUklURShkc3BiYXNlX3JlZywgSTkxNV9SRUFEKGRzcGJhc2VfcmVnKSk7CisJfQorCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDYwOyBpKyspCisJCUk5MTVfV1JJVEUoVFZfSF9MVU1BXzAgKyAoaTw8MiksIHR2X21vZGUtPmZpbHRlcl90YWJsZVtqKytdKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykKKwkJSTkxNV9XUklURShUVl9IX0NIUk9NQV8wICsgKGk8PDIpLCB0dl9tb2RlLT5maWx0ZXJfdGFibGVbaisrXSk7CisJZm9yIChpID0gMDsgaSA8IDQzOyBpKyspCisJCUk5MTVfV1JJVEUoVFZfVl9MVU1BXzAgKyAoaTw8MiksIHR2X21vZGUtPmZpbHRlcl90YWJsZVtqKytdKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDM7IGkrKykKKwkJSTkxNV9XUklURShUVl9WX0NIUk9NQV8wICsgKGk8PDIpLCB0dl9tb2RlLT5maWx0ZXJfdGFibGVbaisrXSk7CisJSTkxNV9XUklURShUVl9EQUMsIDApOworCUk5MTVfV1JJVEUoVFZfQ1RMLCB0dl9jdGwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgcmVwb3J0ZWRfbW9kZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gIk5UU0MgNDgwaSIsCisJCS5jbG9jayA9IDEwNzUyMCwKKwkJLmhkaXNwbGF5ID0gMTI4MCwKKwkJLmhzeW5jX3N0YXJ0ID0gMTM2OCwKKwkJLmhzeW5jX2VuZCA9IDE0OTYsCisJCS5odG90YWwgPSAxNzEyLAorCisJCS52ZGlzcGxheSA9IDEwMjQsCisJCS52c3luY19zdGFydCA9IDEwMjcsCisJCS52c3luY19lbmQgPSAxMDM0LAorCQkudnRvdGFsID0gMTEwNCwKKwkJLnR5cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiwKKwl9LAorfTsKKworLyoqCisgKiBEZXRlY3RzIFRWIHByZXNlbmNlIGJ5IGNoZWNraW5nIGZvciBsb2FkLgorICoKKyAqIFJlcXVpcmVzIHRoYXQgdGhlIGN1cnJlbnQgcGlwZSdzIERQTEwgaXMgYWN0aXZlLgorCisgKiBccmV0dXJuIHRydWUgaWYgVFYgaXMgY29ubmVjdGVkLgorICogXHJldHVybiBmYWxzZSBpZiBUViBpcyBkaXNjb25uZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK2ludGVsX3R2X2RldGVjdF90eXBlIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCkKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW50ZWxfb3V0cHV0LT5lbmM7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJdTMyIHR2X2N0bCwgc2F2ZV90dl9jdGw7CisJdTMyIHR2X2RhYywgc2F2ZV90dl9kYWM7CisJaW50IHR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjsKKworCXR2X2RhYyA9IEk5MTVfUkVBRChUVl9EQUMpOworCisJLyogRGlzYWJsZSBUViBpbnRlcnJ1cHRzIGFyb3VuZCBsb2FkIGRldGVjdCBvciB3ZSdsbCByZWN1cnNlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLCBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRSB8CisJCQkgICAgICBQSVBFX0hPVFBMVUdfVFZfSU5URVJSVVBUX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKworCS8qCisJICogRGV0ZWN0IFRWIGJ5IHBvbGxpbmcpCisJICovCisJaWYgKGludGVsX291dHB1dC0+bG9hZF9kZXRlY3RfdGVtcCkgeworCQkvKiBUViBub3QgY3VycmVudGx5IHJ1bm5pbmcsIHByb2QgaXQgd2l0aCBkZXN0cnVjdGl2ZSBkZXRlY3QgKi8KKwkJc2F2ZV90dl9kYWMgPSB0dl9kYWM7CisJCXR2X2N0bCA9IEk5MTVfUkVBRChUVl9DVEwpOworCQlzYXZlX3R2X2N0bCA9IHR2X2N0bDsKKwkJdHZfY3RsICY9IH5UVl9FTkNfRU5BQkxFOworCQl0dl9jdGwgJj0gflRWX1RFU1RfTU9ERV9NQVNLOworCQl0dl9jdGwgfD0gVFZfVEVTVF9NT0RFX01PTklUT1JfREVURUNUOworCQl0dl9kYWMgJj0gflRWREFDX1NFTlNFX01BU0s7CisJCXR2X2RhYyB8PSAoVFZEQUNfU1RBVEVfQ0hHX0VOIHwKKwkJCSAgIFRWREFDX0FfU0VOU0VfQ1RMIHwKKwkJCSAgIFRWREFDX0JfU0VOU0VfQ1RMIHwKKwkJCSAgIFRWREFDX0NfU0VOU0VfQ1RMIHwKKwkJCSAgIERBQ19DVExfT1ZFUlJJREUgfAorCQkJICAgREFDX0FfMF83X1YgfAorCQkJICAgREFDX0JfMF83X1YgfAorCQkJICAgREFDX0NfMF83X1YpOworCQlJOTE1X1dSSVRFKFRWX0NUTCwgdHZfY3RsKTsKKwkJSTkxNV9XUklURShUVl9EQUMsIHR2X2RhYyk7CisJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCQl0dl9kYWMgPSBJOTE1X1JFQUQoVFZfREFDKTsKKwkJSTkxNV9XUklURShUVl9EQUMsIHNhdmVfdHZfZGFjKTsKKwkJSTkxNV9XUklURShUVl9DVEwsIHNhdmVfdHZfY3RsKTsKKwl9CisJLyoKKwkgKiAgQSBCIEMKKwkgKiAgMCAxIDEgQ29tcG9zaXRlCisJICogIDEgMCBYIHN2aWRlbworCSAqICAwIDAgMCBDb21wb25lbnQKKwkgKi8KKwlpZiAoKHR2X2RhYyAmIFRWREFDX1NFTlNFX01BU0spID09IChUVkRBQ19CX1NFTlNFIHwgVFZEQUNfQ19TRU5TRSkpIHsKKwkJRFJNX0RFQlVHKCJEZXRlY3RlZCBDb21wb3NpdGUgVFYgY29ubmVjdGlvblxuIik7CisJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOworCX0gZWxzZSBpZiAoKHR2X2RhYyAmIChUVkRBQ19BX1NFTlNFfFRWREFDX0JfU0VOU0UpKSA9PSBUVkRBQ19BX1NFTlNFKSB7CisJCURSTV9ERUJVRygiRGV0ZWN0ZWQgUy1WaWRlbyBUViBjb25uZWN0aW9uXG4iKTsKKwkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9TVklERU87CisJfSBlbHNlIGlmICgodHZfZGFjICYgVFZEQUNfU0VOU0VfTUFTSykgPT0gMCkgeworCQlEUk1fREVCVUcoIkRldGVjdGVkIENvbXBvbmVudCBUViBjb25uZWN0aW9uXG4iKTsKKwkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb25lbnQ7CisJfSBlbHNlIHsKKwkJRFJNX0RFQlVHKCJObyBUViBjb25uZWN0aW9uIGRldGVjdGVkXG4iKTsKKwkJdHlwZSA9IC0xOworCX0KKworCS8qIFJlc3RvcmUgaW50ZXJydXB0IGNvbmZpZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLCBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRSB8CisJCQkgICAgIFBJUEVfSE9UUExVR19UVl9JTlRFUlJVUFRfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCisJcmV0dXJuIHR5cGU7Cit9CisKKy8qKgorICogRGV0ZWN0IHRoZSBUViBjb25uZWN0aW9uLgorICoKKyAqIEN1cnJlbnRseSB0aGlzIGFsd2F5cyByZXR1cm5zIENPTk5FQ1RPUl9TVEFUVVNfVU5LTk9XTiwgYXMgd2UgbmVlZCB0byBiZSBzdXJlCisgKiB3ZSBoYXZlIGEgcGlwZSBwcm9ncmFtbWVkIGluIG9yZGVyIHRvIHByb2JlIHRoZSBUVi4KKyAqLworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2ludGVsX3R2X2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBtb2RlOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF90dl9wcml2ICp0dl9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSAmaW50ZWxfb3V0cHV0LT5lbmM7CisJaW50IGRwbXNfbW9kZTsKKwlpbnQgdHlwZSA9IHR2X3ByaXYtPnR5cGU7CisKKwltb2RlID0gcmVwb3J0ZWRfbW9kZXNbMF07CisJZHJtX21vZGVfc2V0X2NydGNpbmZvKCZtb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKKworCWlmIChlbmNvZGVyLT5jcnRjKSB7CisJCXR5cGUgPSBpbnRlbF90dl9kZXRlY3RfdHlwZShlbmNvZGVyLT5jcnRjLCBpbnRlbF9vdXRwdXQpOworCX0gZWxzZSB7CisJCWNydGMgPSBpbnRlbF9nZXRfbG9hZF9kZXRlY3RfcGlwZShpbnRlbF9vdXRwdXQsICZtb2RlLCAmZHBtc19tb2RlKTsKKwkJaWYgKGNydGMpIHsKKwkJCXR5cGUgPSBpbnRlbF90dl9kZXRlY3RfdHlwZShjcnRjLCBpbnRlbF9vdXRwdXQpOworCQkJaW50ZWxfcmVsZWFzZV9sb2FkX2RldGVjdF9waXBlKGludGVsX291dHB1dCwgZHBtc19tb2RlKTsKKwkJfSBlbHNlCisJCQl0eXBlID0gLTE7CisJfQorCisJaWYgKHR5cGUgPCAwKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfcmVzIHsKKwljaGFyICpuYW1lOworCWludCB3LCBoOworfSBpbnB1dF9yZXNfdGFibGVbXSA9Cit7CisJeyI2NDB4NDgwIiwgNjQwLCA0ODB9LAorCXsiODAweDYwMCIsIDgwMCwgNjAwfSwKKwl7IjEwMjR4NzY4IiwgMTAyNCwgNzY4fSwKKwl7IjEyODB4MTAyNCIsIDEyODAsIDEwMjR9LAorCXsiODQ4eDQ4MCIsIDg0OCwgNDgwfSwKKwl7IjEyODB4NzIwIiwgMTI4MCwgNzIwfSwKKwl7IjE5MjB4MTA4MCIsIDE5MjAsIDEwODB9LAorfTsKKworLyoqCisgKiBTdHViIGdldF9tb2RlcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIHNob3VsZCBwcm9iYWJseSByZXR1cm4gYSBzZXQgb2YgZml4ZWQgbW9kZXMsIHVubGVzcyB3ZSBjYW4gZmlndXJlIG91dAorICogaG93IHRvIHByb2JlIG1vZGVzIG9mZiBvZiBUViBjb25uZWN0aW9ucy4KKyAqLworCitzdGF0aWMgaW50CitpbnRlbF90dl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZV9wdHI7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJY29uc3Qgc3RydWN0IHR2X21vZGUgKnR2X21vZGUgPSBpbnRlbF90dl9tb2RlX2ZpbmQoaW50ZWxfb3V0cHV0KTsKKwlpbnQgajsKKworCWZvciAoaiA9IDA7IGogPCBzaXplb2YoaW5wdXRfcmVzX3RhYmxlKSAvIHNpemVvZihpbnB1dF9yZXNfdGFibGVbMF0pOworCSAgICAgaisrKSB7CisJCXN0cnVjdCBpbnB1dF9yZXMgKmlucHV0ID0gJmlucHV0X3Jlc190YWJsZVtqXTsKKwkJdW5zaWduZWQgaW50IGhhY3RpdmVfcyA9IGlucHV0LT53OworCQl1bnNpZ25lZCBpbnQgdmFjdGl2ZV9zID0gaW5wdXQtPmg7CisKKwkJaWYgKHR2X21vZGUtPm1heF9zcmN3ICYmIGlucHV0LT53ID4gdHZfbW9kZS0+bWF4X3NyY3cpCisJCQljb250aW51ZTsKKworCQlpZiAoaW5wdXQtPncgPiAxMDI0ICYmICghdHZfbW9kZS0+cHJvZ3Jlc3NpdmUKKwkJCQkJJiYgIXR2X21vZGUtPmNvbXBvbmVudF9vbmx5KSkKKwkJCWNvbnRpbnVlOworCisJCW1vZGVfcHRyID0gZHJtX2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRybV9kaXNwbGF5X21vZGUpLAorCQkJCSAgICAgIERSTV9NRU1fRFJJVkVSKTsKKwkJc3RybmNweShtb2RlX3B0ci0+bmFtZSwgaW5wdXQtPm5hbWUsIERSTV9ESVNQTEFZX01PREVfTEVOKTsKKworCQltb2RlX3B0ci0+aGRpc3BsYXkgPSBoYWN0aXZlX3M7CisJCW1vZGVfcHRyLT5oc3luY19zdGFydCA9IGhhY3RpdmVfcyArIDE7CisJCW1vZGVfcHRyLT5oc3luY19lbmQgPSBoYWN0aXZlX3MgKyA2NDsKKwkJaWYgKG1vZGVfcHRyLT5oc3luY19lbmQgPD0gbW9kZV9wdHItPmhzeW5jX3N0YXJ0KQorCQkJbW9kZV9wdHItPmhzeW5jX2VuZCA9IG1vZGVfcHRyLT5oc3luY19zdGFydCArIDE7CisJCW1vZGVfcHRyLT5odG90YWwgPSBoYWN0aXZlX3MgKyA5NjsKKworCQltb2RlX3B0ci0+dmRpc3BsYXkgPSB2YWN0aXZlX3M7CisJCW1vZGVfcHRyLT52c3luY19zdGFydCA9IHZhY3RpdmVfcyArIDE7CisJCW1vZGVfcHRyLT52c3luY19lbmQgPSB2YWN0aXZlX3MgKyAzMjsKKwkJaWYgKG1vZGVfcHRyLT52c3luY19lbmQgPD0gbW9kZV9wdHItPnZzeW5jX3N0YXJ0KQorCQkJbW9kZV9wdHItPnZzeW5jX2VuZCA9IG1vZGVfcHRyLT52c3luY19zdGFydCAgKyAxOworCQltb2RlX3B0ci0+dnRvdGFsID0gdmFjdGl2ZV9zICsgMzM7CisKKwkJbW9kZV9wdHItPmNsb2NrID0gKGludCkgKHR2X21vZGUtPnJlZnJlc2ggKgorCQkJCQkgbW9kZV9wdHItPnZ0b3RhbCAqCisJCQkJCSBtb2RlX3B0ci0+aHRvdGFsIC8gMTAwMCkgLyAxMDAwOworCisJCW1vZGVfcHRyLT50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVI7CisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlX3B0cik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF90dl9kZXN0cm95IChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlkcm1fZnJlZShpbnRlbF9vdXRwdXQsIHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KSArIHNpemVvZihzdHJ1Y3QgaW50ZWxfdHZfcHJpdiksCisJCSBEUk1fTUVNX0RSSVZFUik7Cit9CisKKworc3RhdGljIGludAoraW50ZWxfdHZfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkgICAgICB1aW50NjRfdCB2YWwpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IHRvX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBpbnRlbF90dl9wcml2ICp0dl9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRybV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKGNvbm5lY3RvciwgcHJvcGVydHksIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHByb3BlcnR5ID09IGRldi0+bW9kZV9jb25maWcudHZfbGVmdF9tYXJnaW5fcHJvcGVydHkpCisJCXR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fTEVGVF0gPSB2YWw7CisJZWxzZSBpZiAocHJvcGVydHkgPT0gZGV2LT5tb2RlX2NvbmZpZy50dl9yaWdodF9tYXJnaW5fcHJvcGVydHkpCisJCXR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fUklHSFRdID0gdmFsOworCWVsc2UgaWYgKHByb3BlcnR5ID09IGRldi0+bW9kZV9jb25maWcudHZfdG9wX21hcmdpbl9wcm9wZXJ0eSkKKwkJdHZfcHJpdi0+bWFyZ2luW1RWX01BUkdJTl9UT1BdID0gdmFsOworCWVsc2UgaWYgKHByb3BlcnR5ID09IGRldi0+bW9kZV9jb25maWcudHZfYm90dG9tX21hcmdpbl9wcm9wZXJ0eSkKKwkJdHZfcHJpdi0+bWFyZ2luW1RWX01BUkdJTl9CT1RUT01dID0gdmFsOworCWVsc2UgaWYgKHByb3BlcnR5ID09IGRldi0+bW9kZV9jb25maWcudHZfbW9kZV9wcm9wZXJ0eSkgeworCQlpZiAodmFsID49IE5VTV9UVl9NT0RFUykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXR2X3ByaXYtPnR2X2Zvcm1hdCA9IHR2X21vZGVzW3ZhbF0ubmFtZTsKKwkJaW50ZWxfdHZfbW9kZV9zZXQoJmludGVsX291dHB1dC0+ZW5jLCBOVUxMLCBOVUxMKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpbnRlbF90dl9tb2RlX3NldCgmaW50ZWxfb3V0cHV0LT5lbmMsIE5VTEwsIE5VTEwpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGludGVsX3R2X2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGludGVsX3R2X2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF90dl9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gaW50ZWxfZW5jb2Rlcl9wcmVwYXJlLAorCS5tb2RlX3NldCA9IGludGVsX3R2X21vZGVfc2V0LAorCS5jb21taXQgPSBpbnRlbF9lbmNvZGVyX2NvbW1pdCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF90dl9jb25uZWN0b3JfZnVuY3MgPSB7CisJLnNhdmUgPSBpbnRlbF90dl9zYXZlLAorCS5yZXN0b3JlID0gaW50ZWxfdHZfcmVzdG9yZSwKKwkuZGV0ZWN0ID0gaW50ZWxfdHZfZGV0ZWN0LAorCS5kZXN0cm95ID0gaW50ZWxfdHZfZGVzdHJveSwKKwkuc2V0X3Byb3BlcnR5ID0gaW50ZWxfdHZfc2V0X3Byb3BlcnR5LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbnRlbF90dl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0geworCS5tb2RlX3ZhbGlkID0gaW50ZWxfdHZfbW9kZV92YWxpZCwKKwkuZ2V0X21vZGVzID0gaW50ZWxfdHZfZ2V0X21vZGVzLAorCS5iZXN0X2VuY29kZXIgPSBpbnRlbF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgdm9pZCBpbnRlbF90dl9lbmNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBpbnRlbF90dl9lbmNfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBpbnRlbF90dl9lbmNfZGVzdHJveSwKK307CisKKwordm9pZAoraW50ZWxfdHZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQ7CisJc3RydWN0IGludGVsX3R2X3ByaXYgKnR2X3ByaXY7CisJdTMyIHR2X2RhY19vbiwgdHZfZGFjX29mZiwgc2F2ZV90dl9kYWM7CisJY2hhciAqKnR2X2Zvcm1hdF9uYW1lczsKKwlpbnQgaSwgaW5pdGlhbF9tb2RlID0gMDsKKworCWlmICgoSTkxNV9SRUFEKFRWX0NUTCkgJiBUVl9GVVNFX1NUQVRFX01BU0spID09IFRWX0ZVU0VfU1RBVEVfRElTQUJMRUQpCisJCXJldHVybjsKKworCS8qIEV2ZW4gaWYgd2UgaGF2ZSBhbiBlbmNvZGVyIHdlIG1heSBub3QgaGF2ZSBhIGNvbm5lY3RvciAqLworCWlmICghZGV2X3ByaXYtPmludF90dl9zdXBwb3J0KQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayB0aGUgVFYgb3V0cHV0IGJ5IGNoZWNraW5nIHRvIHNlZSBpZiB0aGUKKwkgKiBEQUMgcmVnaXN0ZXIgaG9sZHMgYSB2YWx1ZQorCSAqLworCXNhdmVfdHZfZGFjID0gSTkxNV9SRUFEKFRWX0RBQyk7CisKKwlJOTE1X1dSSVRFKFRWX0RBQywgc2F2ZV90dl9kYWMgfCBUVkRBQ19TVEFURV9DSEdfRU4pOworCXR2X2RhY19vbiA9IEk5MTVfUkVBRChUVl9EQUMpOworCisJSTkxNV9XUklURShUVl9EQUMsIHNhdmVfdHZfZGFjICYgflRWREFDX1NUQVRFX0NIR19FTik7CisJdHZfZGFjX29mZiA9IEk5MTVfUkVBRChUVl9EQUMpOworCisJSTkxNV9XUklURShUVl9EQUMsIHNhdmVfdHZfZGFjKTsKKworCS8qCisJICogSWYgdGhlIHJlZ2lzdGVyIGRvZXMgbm90IGhvbGQgdGhlIHN0YXRlIGNoYW5nZSBlbmFibGUKKwkgKiBiaXQsIChlaXRoZXIgYXMgYSAwIG9yIGEgMSksIGFzc3VtZSBpdCBkb2Vzbid0IHJlYWxseQorCSAqIGV4aXN0CisJICovCisJaWYgKCh0dl9kYWNfb24gJiBUVkRBQ19TVEFURV9DSEdfRU4pID09IDAgfHwKKwkgICAgKHR2X2RhY19vZmYgJiBUVkRBQ19TVEFURV9DSEdfRU4pICE9IDApCisJCXJldHVybjsKKworCWludGVsX291dHB1dCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpbnRlbF9vdXRwdXQpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaW50ZWxfdHZfcHJpdiksIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoIWludGVsX291dHB1dCkgeworCQlyZXR1cm47CisJfQorCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CisKKwlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZpbnRlbF90dl9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPKTsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF90dl9lbmNfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9UVkRBQyk7CisKKwlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoJmludGVsX291dHB1dC0+YmFzZSwgJmludGVsX291dHB1dC0+ZW5jKTsKKwl0dl9wcml2ID0gKHN0cnVjdCBpbnRlbF90dl9wcml2ICopKGludGVsX291dHB1dCArIDEpOworCWludGVsX291dHB1dC0+dHlwZSA9IElOVEVMX09VVFBVVF9UVk9VVDsKKwlpbnRlbF9vdXRwdXQtPmVuYy5wb3NzaWJsZV9jcnRjcyA9ICgoMSA8PCAwKSB8ICgxIDw8IDEpKTsKKwlpbnRlbF9vdXRwdXQtPmVuYy5wb3NzaWJsZV9jbG9uZXMgPSAoMSA8PCBJTlRFTF9PVVRQVVRfVFZPVVQpOworCWludGVsX291dHB1dC0+ZGV2X3ByaXYgPSB0dl9wcml2OworCXR2X3ByaXYtPnR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjsKKworCS8qIEJJT1MgbWFyZ2luIHZhbHVlcyAqLworCXR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fTEVGVF0gPSA1NDsKKwl0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1RPUF0gPSAzNjsKKwl0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1JJR0hUXSA9IDQ2OworCXR2X3ByaXYtPm1hcmdpbltUVl9NQVJHSU5fQk9UVE9NXSA9IDM3OworCisJdHZfcHJpdi0+dHZfZm9ybWF0ID0ga3N0cmR1cCh0dl9tb2Rlc1tpbml0aWFsX21vZGVdLm5hbWUsIEdGUF9LRVJORUwpOworCisJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF90dl9oZWxwZXJfZnVuY3MpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF90dl9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gZmFsc2U7CisJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSBmYWxzZTsKKworCS8qIENyZWF0ZSBUViBwcm9wZXJ0aWVzIHRoZW4gYXR0YWNoIGN1cnJlbnQgdmFsdWVzICovCisJdHZfZm9ybWF0X25hbWVzID0gZHJtX2FsbG9jKHNpemVvZihjaGFyICopICogTlVNX1RWX01PREVTLAorCQkJCSAgICBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCF0dl9mb3JtYXRfbmFtZXMpCisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFZfTU9ERVM7IGkrKykKKwkJdHZfZm9ybWF0X25hbWVzW2ldID0gdHZfbW9kZXNbaV0ubmFtZTsKKwlkcm1fbW9kZV9jcmVhdGVfdHZfcHJvcGVydGllcyhkZXYsIE5VTV9UVl9NT0RFUywgdHZfZm9ybWF0X25hbWVzKTsKKworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgZGV2LT5tb2RlX2NvbmZpZy50dl9tb2RlX3Byb3BlcnR5LAorCQkJCSAgIGluaXRpYWxfbW9kZSk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCSAgIGRldi0+bW9kZV9jb25maWcudHZfbGVmdF9tYXJnaW5fcHJvcGVydHksCisJCQkJICAgdHZfcHJpdi0+bWFyZ2luW1RWX01BUkdJTl9MRUZUXSk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCSAgIGRldi0+bW9kZV9jb25maWcudHZfdG9wX21hcmdpbl9wcm9wZXJ0eSwKKwkJCQkgICB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1RPUF0pOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkgICBkZXYtPm1vZGVfY29uZmlnLnR2X3JpZ2h0X21hcmdpbl9wcm9wZXJ0eSwKKwkJCQkgICB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX1JJR0hUXSk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCSAgIGRldi0+bW9kZV9jb25maWcudHZfYm90dG9tX21hcmdpbl9wcm9wZXJ0eSwKKwkJCQkgICB0dl9wcml2LT5tYXJnaW5bVFZfTUFSR0lOX0JPVFRPTV0pOworb3V0OgorCWRybV9zeXNmc19jb25uZWN0b3JfYWRkKGNvbm5lY3Rvcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMKaW5kZXggNGIyN2Q5YS4uY2FjZTM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwX2NtZGJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMF9jbWRidWYuYwpAQCAtODYwLDEyICs4NjAsMTIgQEAKICAqIFRoZSBhY3R1YWwgYWdlIGVtaXQgaXMgZG9uZSBieSByMzAwX2RvX2NwX2NtZGJ1Ziwgd2hpY2ggaXMgd2h5IHlvdSBtdXN0CiAgKiBiZSBjYXJlZnVsIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAqLwotc3RhdGljIHZvaWQgcjMwMF9kaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCitzdGF0aWMgdm9pZCByMzAwX2Rpc2NhcmRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBkcm1fYnVmICpidWYpCiB7Ci0JZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OwogCi0JYnVmX3ByaXYtPmFnZSA9ICsrZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisJYnVmX3ByaXYtPmFnZSA9ICsrbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CiAJYnVmLT5wZW5kaW5nID0gMTsKIAlidWYtPnVzZWQgPSAwOwogfQpAQCAtMTAyNyw2ICsxMDI3LDcgQEAKIAkJICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBmaWxlX3ByaXYtPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gTlVMTDsKIAlpbnQgZW1pdF9kaXNwYXRjaF9hZ2UgPSAwOwpAQCAtMTEzNCw3ICsxMTM1LDcgQEAKIAkJCX0KIAogCQkJZW1pdF9kaXNwYXRjaF9hZ2UgPSAxOwotCQkJcjMwMF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CisJCQlyMzAwX2Rpc2NhcmRfYnVmZmVyKGRldiwgZmlsZV9wcml2LT5tYXN0ZXIsIGJ1Zik7CiAJCQlicmVhazsKIAogCQljYXNlIFIzMDBfQ01EX1dBSVQ6CkBAIC0xMTg5LDcgKzExOTAsNyBAQAogCiAJCS8qIEVtaXQgdGhlIHZlcnRleCBidWZmZXIgYWdlICovCiAJCUJFR0lOX1JJTkcoMik7Ci0JCVJBREVPTl9ESVNQQVRDSF9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2gpOworCQlSQURFT05fRElTUEFUQ0hfQUdFKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYwppbmRleCBkY2ViYjRiLi42MzIxMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgogI2luY2x1ZGUgInIzMDBfcmVnLmgiCkBAIC02NjcsMTUgKzY2OCwxNCBAQAogCQlSQURFT05fV1JJVEUoUkFERU9OX0JVU19DTlRMLCB0bXApOwogCX0gLyogUENJRSBjYXJkcyBhcHBlYXJzIHRvIG5vdCBuZWVkIHRoaXMgKi8KIAotCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lID0gZGV2X3ByaXYtPnNjcmF0Y2hbMF0gPSAwOwotCVJBREVPTl9XUklURShSQURFT05fTEFTVF9GUkFNRV9SRUcsIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKTsKKwlkZXZfcHJpdi0+c2NyYXRjaFswXSA9IDA7CisJUkFERU9OX1dSSVRFKFJBREVPTl9MQVNUX0ZSQU1FX1JFRywgMCk7CiAKLQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IGRldl9wcml2LT5zY3JhdGNoWzFdID0gMDsKLQlSQURFT05fV1JJVEUoUkFERU9OX0xBU1RfRElTUEFUQ0hfUkVHLAotCQkgICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoKTsKKwlkZXZfcHJpdi0+c2NyYXRjaFsxXSA9IDA7CisJUkFERU9OX1dSSVRFKFJBREVPTl9MQVNUX0RJU1BBVENIX1JFRywgMCk7CiAKLQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhciA9IGRldl9wcml2LT5zY3JhdGNoWzJdID0gMDsKLQlSQURFT05fV1JJVEUoUkFERU9OX0xBU1RfQ0xFQVJfUkVHLCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhcik7CisJZGV2X3ByaXYtPnNjcmF0Y2hbMl0gPSAwOworCVJBREVPTl9XUklURShSQURFT05fTEFTVF9DTEVBUl9SRUcsIDApOwogCiAJcmFkZW9uX2RvX3dhaXRfZm9yX2lkbGUoZGV2X3ByaXYpOwogCkBAIC04NzEsOSArODcxLDExIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X2NwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X2NwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9yYWRlb25faW5pdF90ICppbml0LAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAogCURSTV9ERUJVRygiXG4iKTsKIApAQCAtOTk4LDggKzEwMDAsOCBAQAogCWRldl9wcml2LT5idWZmZXJzX29mZnNldCA9IGluaXQtPmJ1ZmZlcnNfb2Zmc2V0OwogCWRldl9wcml2LT5nYXJ0X3RleHR1cmVzX29mZnNldCA9IGluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OwogCi0JZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7Ci0JaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwltYXN0ZXJfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKKwlpZiAoIW1hc3Rlcl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAzNSwxMCArMTAzNyw2IEBACiAJCX0KIAl9CiAKLQlkZXZfcHJpdi0+c2FyZWFfcHJpdiA9Ci0JICAgIChkcm1fcmFkZW9uX3NhcmVhX3QgKikgKCh1OCAqKSBkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZSArCi0JCQkJICAgIGluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KTsKLQogI2lmIF9fT1NfSEFTX0FHUAogCWlmIChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCWRybV9jb3JlX2lvcmVtYXAoZGV2X3ByaXYtPmNwX3JpbmcsIGRldik7CkBAIC0xMzI5LDcgKzEzMjcsNyBAQAogCWNhc2UgUkFERU9OX0lOSVRfQ1A6CiAJY2FzZSBSQURFT05fSU5JVF9SMjAwX0NQOgogCWNhc2UgUkFERU9OX0lOSVRfUjMwMF9DUDoKLQkJcmV0dXJuIHJhZGVvbl9kb19pbml0X2NwKGRldiwgaW5pdCk7CisJCXJldHVybiByYWRlb25fZG9faW5pdF9jcChkZXYsIGluaXQsIGZpbGVfcHJpdik7CiAJY2FzZSBSQURFT05fQ0xFQU5VUF9DUDoKIAkJcmV0dXJuIHJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CiAJfQpAQCAtMTc2OCw2ICsxNzY2LDUxIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJhZGVvbl9tYXN0ZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGRybV9yYWRlb25fbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2OworCXVuc2lnbmVkIGxvbmcgc2FyZWFwYWdlOworCWludCByZXQ7CisKKwltYXN0ZXJfcHJpdiA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCptYXN0ZXJfcHJpdiksIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoIW1hc3Rlcl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHByZWJ1aWxkIHRoZSBTQVJFQSAqLworCXNhcmVhcGFnZSA9IG1heF90KHVuc2lnbmVkIGxvbmcsIFNBUkVBX01BWCwgUEFHRV9TSVpFKTsKKwlyZXQgPSBkcm1fYWRkbWFwKGRldiwgMCwgc2FyZWFwYWdlLCBfRFJNX1NITSwgX0RSTV9DT05UQUlOU19MT0NLfF9EUk1fRFJJVkVSLAorCQkJICZtYXN0ZXJfcHJpdi0+c2FyZWEpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJTQVJFQSBzZXR1cCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdiA9IG1hc3Rlcl9wcml2LT5zYXJlYS0+aGFuZGxlICsgc2l6ZW9mKHN0cnVjdCBkcm1fc2FyZWEpOworCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gMDsKKworCW1hc3Rlci0+ZHJpdmVyX3ByaXYgPSBtYXN0ZXJfcHJpdjsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByYWRlb25fbWFzdGVyX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OworCisJaWYgKCFtYXN0ZXJfcHJpdikKKwkJcmV0dXJuOworCisJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2ICYmCisJICAgIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlICE9IDApCisJCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKGRldiwgbWFzdGVyKTsKKworCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2ID0gTlVMTDsKKwlpZiAobWFzdGVyX3ByaXYtPnNhcmVhKQorCQlkcm1fcm1tYXBfbG9ja2VkKGRldiwgbWFzdGVyX3ByaXYtPnNhcmVhKTsKKworCWRybV9mcmVlKG1hc3Rlcl9wcml2LCBzaXplb2YoKm1hc3Rlcl9wcml2KSwgRFJNX01FTV9EUklWRVIpOworCisJbWFzdGVyLT5kcml2ZXJfcHJpdiA9IE5VTEw7Cit9CisKIC8qIENyZWF0ZSBtYXBwaW5ncyBmb3IgcmVnaXN0ZXJzIGFuZCBmcmFtZWJ1ZmZlciBzbyB1c2VybGFuZCBkb2Vzbid0IG5lY2Vzc2FyaWx5CiAgKiBoYXZlIHRvIGZpbmQgdGhlbS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwppbmRleCA3MWFmNzQ2Li5mZWYyMDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYwpAQCAtOTYsNiArOTYsOCBAQAogCS5lbmFibGVfdmJsYW5rID0gcmFkZW9uX2VuYWJsZV92YmxhbmssCiAJLmRpc2FibGVfdmJsYW5rID0gcmFkZW9uX2Rpc2FibGVfdmJsYW5rLAogCS5kcmlfbGlicmFyeV9uYW1lID0gZHJpX2xpYnJhcnlfbmFtZSwKKwkubWFzdGVyX2NyZWF0ZSA9IHJhZGVvbl9tYXN0ZXJfY3JlYXRlLAorCS5tYXN0ZXJfZGVzdHJveSA9IHJhZGVvbl9tYXN0ZXJfZGVzdHJveSwKIAkuaXJxX3ByZWluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKIAkuaXJxX3VuaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKaW5kZXggM2JiYjg3MS4uNDkwYmM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmgKQEAgLTIyNiw5ICsyMjYsMTMgQEAKICNkZWZpbmUgUkFERU9OX0ZMVVNIX0VNSVRFRAkoMSA8IDApCiAjZGVmaW5lIFJBREVPTl9QVVJHRV9FTUlURUQJKDEgPCAxKQogCitzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSB7CisJZHJtX2xvY2FsX21hcF90ICpzYXJlYTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7Cit9OworCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ByaXZhdGUgewogCWRybV9yYWRlb25fcmluZ19idWZmZXJfdCByaW5nOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdjsKIAogCXUzMiBmYl9sb2NhdGlvbjsKIAl1MzIgZmJfc2l6ZTsKQEAgLTQwOSw2ICs0MTMsOSBAQAogZXh0ZXJuIGxvbmcgcmFkZW9uX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiAKK2V4dGVybiBpbnQgcmFkZW9uX21hc3Rlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CitleHRlcm4gdm9pZCByYWRlb25fbWFzdGVyX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CitleHRlcm4gdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKIC8qIHIzMDBfY21kYnVmLmMgKi8KIGV4dGVybiB2b2lkIHIzMDBfaW5pdF9yZWdfZmxhZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKQEAgLTEzMzUsOCArMTM0Miw5IEBACiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CQlcCitkbyB7CQkJCQkJCQlcCisJc3RydWN0IGRybV9yYWRlb25fbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gZmlsZV9wcml2LT5tYXN0ZXItPmRyaXZlcl9wcml2OwlcCisJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXY7CVwKIAlpZiAoIHNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPj0gUkFERU9OX01BWF9WQl9BR0UgKSB7CQlcCiAJCWludCBfX3JldCA9IHJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOwkJXAogCQlpZiAoIF9fcmV0ICkgcmV0dXJuIF9fcmV0OwkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYwppbmRleCA1ZDcxNTNmLi5lZjk0MGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKQEAgLTc0MiwxMyArNzQyLDE0IEBACiAgKi8KIAogc3RhdGljIHZvaWQgcmFkZW9uX2NsZWFyX2JveChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJICAgICBzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYsCiAJCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgciwgaW50IGcsIGludCBiKQogewogCXUzMiBjb2xvcjsKIAlSSU5HX0xPQ0FMUzsKIAotCXggKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOwotCXkgKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOworCXggKz0gbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOworCXkgKz0gbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOwogCiAJc3dpdGNoIChkZXZfcHJpdi0+Y29sb3JfZm10KSB7CiAJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NToKQEAgLTc3Niw3ICs3NzcsNyBAQAogCQkgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAogCQkgUkFERU9OX1JPUDNfUCB8IFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyk7CiAKLQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPT0gMSkgeworCWlmIChtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9PSAxKSB7CiAJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwogCX0gZWxzZSB7CiAJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CkBAIC03OTAsNyArNzkxLDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYpCiB7CiAJLyogQ29sbGFwc2UgdmFyaW91cyB0aGluZ3MgaW50byBhIHdhaXQgZmxhZyAtLSB0cnlpbmcgdG8KIAkgKiBndWVzcyBpZiB1c2Vyc3Bhc2Ugc2xlcHQgLS0gYmV0dGVyIGp1c3QgdG8gaGF2ZSB0aGVtIHRlbGwgdXMuCkBAIC04MDcsMTIgKzgwOCwxMiBAQAogCS8qIFB1cnBsZSBib3ggZm9yIHBhZ2UgZmxpcHBpbmcKIAkgKi8KIAlpZiAoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9GTElQKQotCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSk7CisJCXJhZGVvbl9jbGVhcl9ib3goZGV2X3ByaXYsIG1hc3Rlcl9wcml2LCA0LCA0LCA4LCA4LCAyNTUsIDAsIDI1NSk7CiAKIAkvKiBSZWQgYm94IGlmIHdlIGhhdmUgdG8gd2FpdCBmb3IgaWRsZSBhdCBhbnkgcG9pbnQKIAkgKi8KIAlpZiAoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9XQUlUX0lETEUpCi0JCXJhZGVvbl9jbGVhcl9ib3goZGV2X3ByaXYsIDE2LCA0LCA4LCA4LCAyNTUsIDAsIDApOworCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCBtYXN0ZXJfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCk7CiAKIAkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PwogCSAqLwpAQCAtODIwLDEyICs4MjEsMTIgQEAKIAkvKiBZZWxsb3cgYm94IGZvciB0ZXh0dXJlIHN3YXBzCiAJICovCiAJaWYgKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEKQotCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA0MCwgNCwgOCwgOCwgMjU1LCAyNTUsIDApOworCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCBtYXN0ZXJfcHJpdiwgNDAsIDQsIDgsIDgsIDI1NSwgMjU1LCAwKTsKIAogCS8qIEdyZWVuIGJveCBpZiBoYXJkd2FyZSBuZXZlciBpZGxlcyAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKQogCSAqLwogCWlmICghKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRE1BX0lETEUpKQotCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwKTsKKwkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgbWFzdGVyX3ByaXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDApOwogCiAJLyogRHJhdyBiYXJzIGluZGljYXRpbmcgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCiAJICogKG5vdCBhIGdyZWF0IG1lYXN1cmUsIGVhc2lseSBjb25mdXNlZCkKQEAgLTgzNCw3ICs4MzUsNyBAQAogCQlpZiAoZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzID4gMTAwKQogCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzID0gMTAwOwogCi0JCXJhZGVvbl9jbGVhcl9ib3goZGV2X3ByaXYsIDQsIDE2LAorCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCBtYXN0ZXJfcHJpdiwgNCwgMTYsCiAJCQkJIGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcywgNCwKIAkJCQkgMTk2LCAxMjgsIDEyOCk7CiAJfQpAQCAtODQ4LDExICs4NDksMTMgQEAKICAqLwogCiBzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLAogCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICogY2xlYXIsCiAJCQkJICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqIGRlcHRoX2JveGVzKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CisJc3RydWN0IGRybV9yYWRlb25fbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gbWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgKmRlcHRoX2NsZWFyID0gJmRldl9wcml2LT5kZXB0aF9jbGVhcjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKQEAgLTg2NCw3ICs4NjcsNyBAQAogCiAJZGV2X3ByaXYtPnN0YXRzLmNsZWFycysrOwogCi0JaWYgKGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID09IDEpIHsKKwlpZiAoc2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9PSAxKSB7CiAJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKIAogCQlmbGFncyAmPSB+KFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKTsKQEAgLTg5MCw3ICs4OTMsNyBAQAogCiAJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCiAJCSAqLwotCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKwkJc2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CiAJCQlpbnQgeCA9IHBib3hbaV0ueDE7CkBAIC05NjcsNyArOTcwLDcgQEAKIAkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KIAkJICogd2UgaGF2ZW4ndCB0b3VjaGVkIGFueSAibm9ybWFsIiBzdGF0ZSAtIHN0aWxsIG5lZWQgdGhpcz8KIAkJICovCi0JCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCQlzYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwogCiAJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgUkFERU9OX0hBU19ISUVSWikKIAkJICAgICYmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopKSB7CkBAIC0xMjE0LDcgKzEyMTcsNyBAQAogCiAJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCiAJCSAqLwotCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKKwkJc2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CiAKQEAgLTEyODUsNyArMTI4OCw3IEBACiAKIAkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KIAkJICovCi0JCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCQlzYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwogCiAJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKIApAQCAtMTMyOCwyMCArMTMzMSwyMSBAQAogCSAqIHdhaXQgb24gdGhpcyB2YWx1ZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUgY2xlYXIgaW9jdGwuICBXZQogCSAqIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBjYXJkJ3Mgc28gZGFtbmVkIGZhc3QuLi4KIAkgKi8KLQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhcisrOworCXNhcmVhX3ByaXYtPmxhc3RfY2xlYXIrKzsKIAogCUJFR0lOX1JJTkcoNCk7CiAKLQlSQURFT05fQ0xFQVJfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKTsKKwlSQURFT05fQ0xFQVJfQUdFKHNhcmVhX3ByaXYtPmxhc3RfY2xlYXIpOwogCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKIAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBpOwpAQCAtMTM1MSw3ICsxMzU1LDcgQEAKIAkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgogCSAqLwogCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpCi0JCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyhkZXZfcHJpdik7CisJCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyhkZXZfcHJpdiwgbWFzdGVyX3ByaXYpOwogCiAJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYml0Ymx0LgogCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KQEAgLTEzODUsNyArMTM4OSw3IEBACiAJCS8qIE1ha2UgdGhpcyB3b3JrIGV2ZW4gaWYgZnJvbnQgJiBiYWNrIGFyZSBmbGlwcGVkOgogCQkgKi8KIAkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU1JDX1BJVENIX09GRlNFVCwgMSkpOwotCQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPT0gMCkgeworCQlpZiAoc2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9PSAwKSB7CiAJCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOwogCQkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCk7CiAJCX0gZWxzZSB7CkBAIC0xNDA1LDMxICsxNDA5LDMyIEBACiAJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQogCSAqIHBlcmZvcm1pbmcgdGhlIHN3YXBidWZmZXIgaW9jdGwuCiAJICovCi0JZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKKwlzYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CiAKIAlCRUdJTl9SSU5HKDQpOwogCi0JUkFERU9OX0ZSQU1FX0FHRShkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSk7CisJUkFERU9OX0ZSQU1FX0FHRShzYXJlYV9wcml2LT5sYXN0X2ZyYW1lKTsKIAlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CiAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCit2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXIpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX3NhcmVhICpzYXJlYSA9IChzdHJ1Y3QgZHJtX3NhcmVhICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlOwotCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPT0gMSkKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OworCXN0cnVjdCBkcm1fc2FyZWEgKnNhcmVhID0gKHN0cnVjdCBkcm1fc2FyZWEgKiltYXN0ZXJfcHJpdi0+c2FyZWEtPmhhbmRsZTsKKwlpbnQgb2Zmc2V0ID0gKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID09IDEpCiAJICAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKIAlSSU5HX0xPQ0FMUzsKIAlEUk1fREVCVUcoInBmQ3VycmVudFBhZ2U9JWRcbiIsCi0JCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOworCQkgIG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlKTsKIAogCS8qIERvIHNvbWUgdHJpdmlhbCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLi4uCiAJICovCiAJaWYgKGRldl9wcml2LT5kb19ib3hlcykgewogCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9GTElQOwotCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOworCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYsIG1hc3Rlcl9wcml2KTsKIAl9CiAKIAkvKiBVcGRhdGUgdGhlIGZyYW1lIG9mZnNldHMgZm9yIGJvdGggQ1JUQ3MKQEAgLTE0NDEsNyArMTQ0Niw3IEBACiAJCSAgICAgKChzYXJlYS0+ZnJhbWUueSAqIGRldl9wcml2LT5mcm9udF9waXRjaCArCiAJCSAgICAgICBzYXJlYS0+ZnJhbWUueCAqIChkZXZfcHJpdi0+Y29sb3JfZm10IC0gMikpICYgfjcpCiAJCSAgICAgKyBvZmZzZXQpOwotCU9VVF9SSU5HX1JFRyhSQURFT05fQ1JUQzJfT0ZGU0VULCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3J0YzJfYmFzZQorCU9VVF9SSU5HX1JFRyhSQURFT05fQ1JUQzJfT0ZGU0VULCBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+Y3J0YzJfYmFzZQogCQkgICAgICsgb2Zmc2V0KTsKIAogCUFEVkFOQ0VfUklORygpOwpAQCAtMTQ1MCwxMyArMTQ1NSwxMyBAQAogCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKIAkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgogCSAqLwotCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7Ci0JZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPQotCQkxIC0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2U7CisJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKKwltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9CisJCTEgLSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZTsKIAogCUJFR0lOX1JJTkcoMik7CiAKLQlSQURFT05fRlJBTUVfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKTsKKwlSQURFT05fRlJBTUVfQUdFKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKTsKIAogCUFEVkFOQ0VfUklORygpOwogfQpAQCAtMTQ5NCwxMSArMTQ5OSwxMyBAQAogfSBkcm1fcmFkZW9uX3RjbF9wcmltX3Q7CiAKIHN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsCiAJCQkJICAgICAgZHJtX3JhZGVvbl90Y2xfcHJpbV90ICogcHJpbSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBidWYtPm9mZnNldCArIHByaW0tPnN0YXJ0OwogCWludCBudW12ZXJ0cyA9IChpbnQpcHJpbS0+bnVtdmVydHM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwpAQCAtMTUzOSwxMyArMTU0NiwxNCBAQAogCX0gd2hpbGUgKGkgPCBuYm94KTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgZHJtX2J1ZiAqYnVmKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9yYWRlb25fbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gbWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKIAotCWJ1Zl9wcml2LT5hZ2UgPSArK2Rldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoOworCWJ1Zl9wcml2LT5hZ2UgPSArK21hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2Rpc3BhdGNoOwogCiAJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KIAlCRUdJTl9SSU5HKDIpOwpAQCAtMTU5MCwxMiArMTU5OCwxNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyLAogCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGVsdF9idWYsCiAJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlzdHJ1Y3QgZHJtX3JhZGVvbl9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBtYXN0ZXItPmRyaXZlcl9wcml2OworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2OwogCWludCBvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIHByaW0tPm9mZnNldDsKIAl1MzIgKmRhdGE7CiAJaW50IGR3b3JkczsKQEAgLTE4NzAsNyArMTg4MCw3IEBACiAJCUFEVkFOQ0VfUklORygpOwogCQlDT01NSVRfUklORygpOwogCi0JCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBidWYpOwogCiAJCS8qIFVwZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgbmV4dCB0aW1lICovCiAJCWltYWdlLT55ICs9IGhlaWdodDsKQEAgLTIxMTAsNyArMjEyMCw4IEBACiBzdGF0aWMgaW50IHJhZGVvbl9jcF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcmFkZW9uX2NsZWFyX3QgKmNsZWFyID0gZGF0YTsKIAlkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCBkZXB0aF9ib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0yMTI2LDcgKzIxMzcsNyBAQAogCQkJICAgICAgIHNhcmVhX3ByaXYtPm5ib3ggKiBzaXplb2YoZGVwdGhfYm94ZXNbMF0pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoZGV2LCBjbGVhciwgZGVwdGhfYm94ZXMpOworCXJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhcihkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBjbGVhciwgZGVwdGhfYm94ZXMpOwogCiAJQ09NTUlUX1JJTkcoKTsKIAlyZXR1cm4gMDsKQEAgLTIxMzQsOSArMjE0NSwxMCBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9yYWRlb25fbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gbWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlSSU5HX0xPQ0FMUzsKIAogCURSTV9ERUJVRygiXG4iKTsKQEAgLTIxNTMsOCArMjE2NSw4IEBACiAKIAlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDE7CiAKLQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgIT0gMSkKLQkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSAwOworCWlmIChtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSAhPSAxKQorCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxNzIsOSArMjE4NCw5IEBACiAJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKIAogCWlmICghZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpCi0JCXJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKGRldik7CisJCXJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKGRldiwgZmlsZV9wcml2LT5tYXN0ZXIpOwogCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZGV2KTsKKwlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkZXYsIGZpbGVfcHJpdi0+bWFzdGVyKTsKIAogCUNPTU1JVF9SSU5HKCk7CiAJcmV0dXJuIDA7CkBAIC0yMTgzLDcgKzIxOTUsOSBAQAogc3RhdGljIGludCByYWRlb25fY3Bfc3dhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdjsKKwogCURSTV9ERUJVRygiXG4iKTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CkBAIC0yMTkzLDggKzIyMDcsOCBAQAogCWlmIChzYXJlYV9wcml2LT5uYm94ID4gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUykKIAkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CiAKLQlyYWRlb25fY3BfZGlzcGF0Y2hfc3dhcChkZXYpOwotCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCXJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKGRldiwgZmlsZV9wcml2LT5tYXN0ZXIpOworCXNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwpAQCAtMjIwMyw3ICsyMjE3LDggQEAKIHN0YXRpYyBpbnQgcmFkZW9uX2NwX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25fdmVydGV4X3QgKnZlcnRleCA9IGRhdGE7CkBAIC0yMjExLDYgKzIyMjYsOCBAQAogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAorCXNhcmVhX3ByaXYgPSBtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdjsKKwogCURSTV9ERUJVRygicGlkPSVkIGluZGV4PSVkIGNvdW50PSVkIGRpc2NhcmQ9JWRcbiIsCiAJCSAgRFJNX0NVUlJFTlRQSUQsIHZlcnRleC0+aWR4LCB2ZXJ0ZXgtPmNvdW50LCB2ZXJ0ZXgtPmRpc2NhcmQpOwogCkBAIC0yMjYzLDEzICsyMjgwLDEzIEBACiAJCXByaW0uZmluaXNoID0gdmVydGV4LT5jb3VudDsJLyogdW51c2VkICovCiAJCXByaW0ucHJpbSA9IHZlcnRleC0+cHJpbTsKIAkJcHJpbS5udW12ZXJ0cyA9IHZlcnRleC0+Y291bnQ7Ci0JCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwkJcHJpbS52Y19mb3JtYXQgPSBzYXJlYV9wcml2LT52Y19mb3JtYXQ7CiAKLQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkZXYsIGJ1ZiwgJnByaW0pOworCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRldiwgZmlsZV9wcml2LCBidWYsICZwcmltKTsKIAl9CiAKIAlpZiAodmVydGV4LT5kaXNjYXJkKSB7Ci0JCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBidWYpOwogCX0KIAogCUNPTU1JVF9SSU5HKCk7CkBAIC0yMjc5LDcgKzIyOTYsOCBAQAogc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25faW5kaWNlc190ICplbHRzID0gZGF0YTsKQEAgLTIyODgsNiArMjMwNiw4IEBACiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCisJc2FyZWFfcHJpdiA9IG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2OworCiAJRFJNX0RFQlVHKCJwaWQ9JWQgaW5kZXg9JWQgc3RhcnQ9JWQgZW5kPSVkIGRpc2NhcmQ9JWRcbiIsCiAJCSAgRFJNX0NVUlJFTlRQSUQsIGVsdHMtPmlkeCwgZWx0cy0+c3RhcnQsIGVsdHMtPmVuZCwKIAkJICBlbHRzLT5kaXNjYXJkKTsKQEAgLTIzNTMsMTEgKzIzNzMsMTEgQEAKIAlwcmltLnByaW0gPSBlbHRzLT5wcmltOwogCXByaW0ub2Zmc2V0ID0gMDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZG1hIGJ1ZmZlcnMgKi8KIAlwcmltLm51bXZlcnRzID0gUkFERU9OX01BWF9WQl9WRVJUUzsJLyogZHVoICovCi0JcHJpbS52Y19mb3JtYXQgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dmNfZm9ybWF0OworCXByaW0udmNfZm9ybWF0ID0gc2FyZWFfcHJpdi0+dmNfZm9ybWF0OwogCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZGV2LCBidWYsICZwcmltKTsKKwlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBidWYsICZwcmltKTsKIAlpZiAoZWx0cy0+ZGlzY2FyZCkgewotCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBmaWxlX3ByaXYtPm1hc3RlciwgYnVmKTsKIAl9CiAKIAlDT01NSVRfUklORygpOwpAQCAtMjQ2OCw3ICsyNDg4LDcgQEAKIAkgKi8KIAlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoZGV2LCBidWYsIGluZGlyZWN0LT5zdGFydCwgaW5kaXJlY3QtPmVuZCk7CiAJaWYgKGluZGlyZWN0LT5kaXNjYXJkKSB7Ci0JCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBidWYpOwogCX0KIAogCUNPTU1JVF9SSU5HKCk7CkBAIC0yNDc4LDcgKzI0OTgsOCBAQAogc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25fdmVydGV4Ml90ICp2ZXJ0ZXggPSBkYXRhOwpAQCAtMjQ4Nyw2ICsyNTA4LDggQEAKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKKwlzYXJlYV9wcml2ID0gbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXY7CisKIAlEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAogCQkgIERSTV9DVVJSRU5UUElELCB2ZXJ0ZXgtPmlkeCwgdmVydGV4LT5kaXNjYXJkKTsKIApAQCAtMjU0NywxMiArMjU3MCwxMiBAQAogCQkJdGNscHJpbS5vZmZzZXQgPSBwcmltLm51bXZlcnRzICogNjQ7CiAJCQl0Y2xwcmltLm51bXZlcnRzID0gUkFERU9OX01BWF9WQl9WRVJUUzsJLyogZHVoICovCiAKLQkJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKGRldiwgYnVmLCAmdGNscHJpbSk7CisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGZpbGVfcHJpdi0+bWFzdGVyLCBidWYsICZ0Y2xwcmltKTsKIAkJfSBlbHNlIHsKIAkJCXRjbHByaW0ubnVtdmVydHMgPSBwcmltLm51bXZlcnRzOwogCQkJdGNscHJpbS5vZmZzZXQgPSAwOwkvKiBub3QgdXNlZCAqLwogCi0JCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRldiwgYnVmLCAmdGNscHJpbSk7CisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRldiwgZmlsZV9wcml2LCBidWYsICZ0Y2xwcmltKTsKIAkJfQogCiAJCWlmIChzYXJlYV9wcml2LT5uYm94ID09IDEpCkBAIC0yNTYwLDcgKzI1ODMsNyBAQAogCX0KIAogCWlmICh2ZXJ0ZXgtPmRpc2NhcmQpIHsKLQkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgZmlsZV9wcml2LT5tYXN0ZXIsIGJ1Zik7CiAJfQogCiAJQ09NTUlUX1JJTkcoKTsKQEAgLTI5MDksNyArMjkzMiw3IEBACiAJCQkJZ290byBlcnI7CiAJCQl9CiAKLQkJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CisJCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBmaWxlX3ByaXYtPm1hc3RlciwgYnVmKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzOgpAQCAtMzAyMCw3ICszMDQzLDcgQEAKIAkJICovCiAJY2FzZSBSQURFT05fUEFSQU1fU0FSRUFfSEFORExFOgogCQkvKiBUaGUgbG9jayBpcyB0aGUgZmlyc3QgZHdvcmQgaW4gdGhlIHNhcmVhLiAqLwotCQl2YWx1ZSA9IChsb25nKWRldi0+bG9jay5od19sb2NrOworCQkvKiBubyB1c2VycyBvZiB0aGlzIHBhcmFtZXRlciAqLwogCQlicmVhazsKICNlbmRpZgogCWNhc2UgUkFERU9OX1BBUkFNX0dBUlRfVEVYX0hBTkRMRToKQEAgLTMwNjQsNiArMzA4Nyw3IEBACiBzdGF0aWMgaW50IHJhZGVvbl9jcF9zZXRwYXJhbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fcmFkZW9uX21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGZpbGVfcHJpdi0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAlkcm1fcmFkZW9uX3NldHBhcmFtX3QgKnNwID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwogCkBAIC0zMDc4LDEyICszMTAyLDE0IEBACiAJCQlEUk1fREVCVUcoImNvbG9yIHRpbGluZyBkaXNhYmxlZFxuIik7CiAJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CiAJCQlkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgJj0gflJBREVPTl9EU1RfVElMRV9NQUNSTzsKLQkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDA7CisJCQlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCisJCQkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnRpbGluZ19lbmFibGVkID0gMDsKIAkJfSBlbHNlIGlmIChzcC0+dmFsdWUgPT0gMSkgewogCQkJRFJNX0RFQlVHKCJjb2xvciB0aWxpbmcgZW5hYmxlZFxuIik7CiAJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKIAkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87Ci0JCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAxOworCQkJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQorCQkJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDE7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTjoKQEAgLTMxMjksMTQgKzMxNTUsNiBAQAogCiB2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKLQkJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCQlpZiAoZGV2X3ByaXYtPnNhcmVhX3ByaXYgJiYKLQkJICAgIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlICE9IDApCi0JCQlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkZXYpOwotCX0KLQogCXJhZGVvbl9kb19yZWxlYXNlKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IDkwNmY5YjkuLjU4N2Y1YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAlzbnByaW50ZihpMmMtPmFkYXAubmFtZSwgc2l6ZW9mKGkyYy0+YWRhcC5uYW1lKSwgInB4YV9pMmMtaTJjLiV1IiwKIAkJIGkyYy0+YWRhcC5ucik7CiAKLQlpMmMtPmNsayA9IGNsa19nZXQoJmRldi0+ZGV2LCAiSTJDQ0xLIik7CisJaTJjLT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihpMmMtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihpMmMtPmNsayk7CiAJCWdvdG8gZWNsazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggYjc0MzRkMi4uYzM5MDc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTQwLDggKzQwLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL2lpYy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgogCiAvKiBpMmMgY29udHJvbGxlciBzdGF0ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCBlNjg1N2UwLi5jOWYyMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTYyLDYgKzYyLDkgQEAKIGNvbmZpZyBJREVfQVRBUEkKIAlib29sCiAKK2NvbmZpZyBJREVfTEVHQUNZCisJYm9vbAorCiBjb25maWcgQkxLX0RFVl9JREVfU0FUQQogCWJvb2wgIlN1cHBvcnQgZm9yIFNBVEEgKGRlcHJlY2F0ZWQ7IGNvbmZsaWN0cyB3aXRoIGxpYmF0YSBTQVRBIGRyaXZlcikiCiAJZGVmYXVsdCBuCkBAIC03MjQsNyArNzI3LDcgQEAKIAogY29uZmlnIElERV9BUk0KIAl0cmlzdGF0ZSAiQVJNIElERSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJNICYmIChBUkNIX0NMUFM3NTAwIHx8IEFSQ0hfUlBDIHx8IEFSQ0hfU0hBUkspCisJZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfUlBDIHx8IEFSQ0hfU0hBUkspCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBCTEtfREVWX0lERV9JQ1NJREUKQEAgLTg1Niw2ICs4NTksNyBAQAogY29uZmlnIEJMS19ERVZfQUxJMTRYWAogCXRyaXN0YXRlICJBTEkgTTE0eHggc3VwcG9ydCIKIAlzZWxlY3QgSURFX1RJTUlOR1MKKwlzZWxlY3QgSURFX0xFR0FDWQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImFsaTE0eHgucHJvYmUiIGtlcm5lbAogCSAgYm9vdCBwYXJhbWV0ZXIuICBJdCBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBzZWNvbmRhcnkgSURFIGludGVyZmFjZQpAQCAtODY2LDYgKzg3MCw3IEBACiAKIGNvbmZpZyBCTEtfREVWX0RUQzIyNzgKIAl0cmlzdGF0ZSAiRFRDLTIyNzggc3VwcG9ydCIKKwlzZWxlY3QgSURFX0xFR0FDWQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImR0YzIyNzgucHJvYmUiIGtlcm5lbAogCSAgYm9vdCBwYXJhbWV0ZXIuIEl0IGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHNlY29uZGFyeSBJREUgaW50ZXJmYWNlCkBAIC04NzYsNiArODgxLDcgQEAKIGNvbmZpZyBCTEtfREVWX0hUNjU2MEIKIAl0cmlzdGF0ZSAiSG9sdGVrIEhUNjU2MEIgc3VwcG9ydCIKIAlzZWxlY3QgSURFX1RJTUlOR1MKKwlzZWxlY3QgSURFX0xFR0FDWQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGlzIGVuYWJsZWQgYXQgcnVudGltZSB1c2luZyB0aGUgImh0NjU2MGIucHJvYmUiIGtlcm5lbAogCSAgYm9vdCBwYXJhbWV0ZXIuIEl0IGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHNlY29uZGFyeSBJREUgaW50ZXJmYWNlCkBAIC04ODYsNiArODkyLDcgQEAKIGNvbmZpZyBCTEtfREVWX1FENjVYWAogCXRyaXN0YXRlICJRREkgUUQ2NXh4IHN1cHBvcnQiCiAJc2VsZWN0IElERV9USU1JTkdTCisJc2VsZWN0IElERV9MRUdBQ1kKIAloZWxwCiAJICBUaGlzIGRyaXZlciBpcyBlbmFibGVkIGF0IHJ1bnRpbWUgdXNpbmcgdGhlICJxZDY1eHgucHJvYmUiIGtlcm5lbAogCSAgYm9vdCBwYXJhbWV0ZXIuICBJdCBwZXJtaXRzIGZhc3RlciBJL08gc3BlZWRzIHRvIGJlIHNldC4gIFNlZSB0aGUKQEAgLTg5NCw2ICs5MDEsNyBAQAogCiBjb25maWcgQkxLX0RFVl9VTUM4NjcyCiAJdHJpc3RhdGUgIlVNQy04NjcyIHN1cHBvcnQiCisJc2VsZWN0IElERV9MRUdBQ1kKIAloZWxwCiAJICBUaGlzIGRyaXZlciBpcyBlbmFibGVkIGF0IHJ1bnRpbWUgdXNpbmcgdGhlICJ1bWM4NjcyLnByb2JlIiBrZXJuZWwKIAkgIGJvb3QgcGFyYW1ldGVyLiBJdCBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBzZWNvbmRhcnkgSURFIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvTWFrZWZpbGUgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQppbmRleCA3ODE4ZDQwLi4xNzdlM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIEVYVFJBX0NGTEFHUwkJCQkrPSAtSWRyaXZlcnMvaWRlCiAKIGlkZS1jb3JlLXkgKz0gaWRlLm8gaWRlLWlvY3Rscy5vIGlkZS1pby5vIGlkZS1pb3BzLm8gaWRlLWxpYi5vIGlkZS1wcm9iZS5vIFwKLQkgICAgICBpZGUtdGFza2ZpbGUubyBpZGUtcGFyay5vIGlkZS1waW8tYmxhY2tsaXN0Lm8KKwkgICAgICBpZGUtdGFza2ZpbGUubyBpZGUtcG0ubyBpZGUtcGFyay5vIGlkZS1waW8tYmxhY2tsaXN0Lm8KIAogIyBjb3JlIElERSBjb2RlCiBpZGUtY29yZS0kKENPTkZJR19JREVfVElNSU5HUykJCSs9IGlkZS10aW1pbmdzLm8KQEAgLTE1LDYgKzE1LDcgQEAKIGlkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfSURFRE1BX1NGRikJKz0gaWRlLWRtYS1zZmYubwogaWRlLWNvcmUtJChDT05GSUdfSURFX1BST0NfRlMpCQkrPSBpZGUtcHJvYy5vCiBpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERUFDUEkpCSs9IGlkZS1hY3BpLm8KK2lkZS1jb3JlLSQoQ09ORklHX0lERV9MRUdBQ1kpCQkrPSBpZGUtbGVnYWN5Lm8KIAogb2JqLSQoQ09ORklHX0lERSkJCQkrPSBpZGUtY29yZS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKaW5kZXggOTM1Mzg1Yy4uMzYyM2JmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY21kNjR4LmMKKysrIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKQEAgLTQyNCwxMCArNDI0LDEwIEBACiAJCS5uYW1lCQk9IERSVl9OQU1FLAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2NtZDY0eCwKIAkJLmVuYWJsZWJpdHMJPSB7ezB4NTEsMHgwNCwweDA0fSwgezB4NTEsMHgwOCwweDA4fX0sCi0JCS5jaGlwc2V0CT0gaWRlX2NtZDY0NiwKIAkJLnBvcnRfb3BzCT0gJmNtZDY0eF9wb3J0X29wcywKIAkJLmRtYV9vcHMJPSAmY21kNjQ4X2RtYV9vcHMsCi0JCS5ob3N0X2ZsYWdzCT0gSURFX0hGTEFHX0FCVVNFX1BSRUZFVENILAorCQkuaG9zdF9mbGFncwk9IElERV9IRkxBR19TRVJJQUxJWkUgfAorCQkJCSAgSURFX0hGTEFHX0FCVVNFX1BSRUZFVENILAogCQkucGlvX21hc2sJPSBBVEFfUElPNSwKIAkJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUEyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKaW5kZXggNTI5N2YwNy4uZDM3YmFmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYworKysgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCkBAIC0yOTIsNyArMjkyLDYgQEAKIAkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2N5ODJjNjkzLAogCS5wb3J0X29wcwk9ICZjeTgyYzY5M19wb3J0X29wcywKLQkuY2hpcHNldAk9IGlkZV9jeTgyYzY5MywKIAkuaG9zdF9mbGFncwk9IElERV9IRkxBR19TSU5HTEUsCiAJLnBpb19tYXNrCT0gQVRBX1BJTzQsCiAJLnN3ZG1hX21hc2sJPSBBVEFfU1dETUEyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvZ2F5bGUuYyBiL2RyaXZlcnMvaWRlL2dheWxlLmMKaW5kZXggNjkxNTA2OC4uNTliZDBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvZ2F5bGUuYworKysgYi9kcml2ZXJzL2lkZS9nYXlsZS5jCkBAIC0xMTcsNiArMTE3LDEwIEBACiAJaHctPmNoaXBzZXQgPSBpZGVfZ2VuZXJpYzsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGdheWxlX3BvcnRfaW5mbyA9IHsKKwkuaG9zdF9mbGFncwkJPSBJREVfSEZMQUdfU0VSSUFMSVpFIHwgSURFX0hGTEFHX05PX0RNQSwKK307CisKICAgICAvKgogICAgICAqICBQcm9iZSBmb3IgYSBHYXlsZSBJREUgaW50ZXJmYWNlIChhbmQgb3B0aW9uYWxseSBmb3IgYW4gSURFIGRvdWJsZXIpCiAgICAgICovCkBAIC0xNzgsNyArMTgyLDcgQEAKIAlod3NbaV0gPSAmaHdbaV07CiAgICAgfQogCi0gICAgcmMgPSBpZGVfaG9zdF9hZGQoTlVMTCwgaHdzLCBOVUxMKTsKKyAgICByYyA9IGlkZV9ob3N0X2FkZCgmZ2F5bGVfcG9ydF9pbmZvLCBod3MsIE5VTEwpOwogICAgIGlmIChyYykKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzX3N0YXJ0LCByZXNfbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2hwdDM2Ni5jIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKaW5kZXggZjVhZmQ0Ni4uYjE4ZTEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaHB0MzY2LmMKKysrIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKQEAgLTEzNSw3ICsxMzUsNiBAQAogLyogdmFyaW91cyB0dW5pbmcgcGFyYW1ldGVycyAqLwogI2RlZmluZSBIUFRfUkVTRVRfU1RBVEVfRU5HSU5FCiAjdW5kZWYJSFBUX0RFTEFZX0lOVEVSUlVQVAotI2RlZmluZSBIUFRfU0VSSUFMSVpFX0lPCTAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnF1aXJrX2RyaXZlc1tdID0gewogCSJRVUFOVFVNIEZJUkVCQUxMbGN0MDggMDgiLApAQCAtMTI4OCw3ICsxMjg3LDYgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7Ci0JaW50IHNlcmlhbGl6ZQkJPSBIUFRfU0VSSUFMSVpFX0lPOwogCXU4ICBjaGlwX3R5cGUJCT0gaW5mby0+Y2hpcF90eXBlOwogCiAJLyogQ2FjaGUgdGhlIGNoYW5uZWwncyBNSVNDLiBjb250cm9sIHJlZ2lzdGVycycgb2Zmc2V0ICovCkBAIC0xMzA1LDEzICsxMzAzLDkgQEAKIAkJICogQ2xvY2sgaXMgc2hhcmVkIGJldHdlZW4gdGhlIGNoYW5uZWxzLAogCQkgKiBzbyB3ZSdsbCBoYXZlIHRvIHNlcmlhbGl6ZSB0aGVtLi4uIDotKAogCQkgKi8KLQkJc2VyaWFsaXplID0gMTsKKwkJaHdpZi0+aG9zdC0+aG9zdF9mbGFncyB8PSBJREVfSEZMQUdfU0VSSUFMSVpFOwogCQlod2lmLT5yd19kaXNrID0gJmhwdDN4eG5fcndfZGlzazsKIAl9Ci0KLQkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoaXMgZGV2aWNlIGlmIG5lZWRlZCAqLwotCWlmIChzZXJpYWxpemUgJiYgaHdpZi0+bWF0ZSkKLQkJaHdpZi0+c2VyaWFsaXplZCA9IGh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSAxOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X2RtYV9ocHQzNjYoaWRlX2h3aWZfdCAqaHdpZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCmluZGV4IDI0NGE4YTAuLmZkNGEzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwpAQCAtNjE1LDEwICs2MTUsMTAgQEAKIAlpbl9wYXJhbXNbMF0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgR1RNX2J1ZmZlcik7CiAJaW5fcGFyYW1zWzBdLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopJmh3aWYtPmFjcGlkYXRhLT5ndG07CiAJaW5fcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwotCWluX3BhcmFtc1sxXS5idWZmZXIubGVuZ3RoID0gc2l6ZW9mKEFUQV9JRF9XT1JEUyAqIDIpOworCWluX3BhcmFtc1sxXS5idWZmZXIubGVuZ3RoID0gQVRBX0lEX1dPUkRTICogMjsKIAlpbl9wYXJhbXNbMV0uYnVmZmVyLnBvaW50ZXIgPSAodTggKikmbWFzdGVyLT5pZGJ1ZmY7CiAJaW5fcGFyYW1zWzJdLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwotCWluX3BhcmFtc1syXS5idWZmZXIubGVuZ3RoID0gc2l6ZW9mKEFUQV9JRF9XT1JEUyAqIDIpOworCWluX3BhcmFtc1syXS5idWZmZXIubGVuZ3RoID0gQVRBX0lEX1dPUkRTICogMjsKIAlpbl9wYXJhbXNbMl0uYnVmZmVyLnBvaW50ZXIgPSAodTggKikmc2xhdmUtPmlkYnVmZjsKIAkvKiBPdXRwdXQgYnVmZmVyOiBfU1RNIGhhcyBubyBvdXRwdXQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCA0MmFiNmQ4Li41ZGFhNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtMjYyLDcgKzI2Miw2IEBACiAJCXN0cnVjdCByZXF1ZXN0ICpmYWlsZWQgPSAoc3RydWN0IHJlcXVlc3QgKikgcnEtPmJ1ZmZlcjsKIAkJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJCXZvaWQgKnNlbnNlID0gJmluZm8tPnNlbnNlX2RhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJaWYgKGZhaWxlZCkgewogCQkJaWYgKGZhaWxlZC0+c2Vuc2UpIHsKQEAgLTI3OCwxMSArMjc3LDkgQEAKIAkJCQkJCWZhaWxlZC0+aGFyZF9ucl9zZWN0b3JzKSkKIAkJCQkJQlVHKCk7CiAJCQl9IGVsc2UgewotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQkJCWlmIChfX2Jsa19lbmRfcmVxdWVzdChmYWlsZWQsIC1FSU8sCi0JCQkJCQkgICAgICBmYWlsZWQtPmRhdGFfbGVuKSkKKwkJCQlpZiAoYmxrX2VuZF9yZXF1ZXN0KGZhaWxlZCwgLUVJTywKKwkJCQkJCSAgICBmYWlsZWQtPmRhdGFfbGVuKSkKIAkJCQkJQlVHKCk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKIAkJCX0KIAkJfSBlbHNlCiAJCQljZHJvbV9hbmFseXplX3NlbnNlX2RhdGEoZHJpdmUsIE5VTEwsIHNlbnNlKTsKQEAgLTMxNyw3ICszMTQsOCBAQAogc3RhdGljIGludCBjZHJvbV9kZWNvZGVfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGdvb2Rfc3RhdCwgaW50ICpzdGF0X3JldCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CiAJaW50IHN0YXQsIGVyciwgc2Vuc2Vfa2V5OwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyAqLwpAQCAtNDI2LDE2ICs0MjQsMTcgQEAKIAkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBpbmZvLT53cml0ZV90aW1lb3V0KSkKIAkJCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwogCQkJCWVsc2UgeworCQkJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJCQkvKgogCQkJCQkgKiB0YWtlIGEgYnJlYXRoZXIgcmVseWluZyBvbiB0aGUgdW5wbHVnCiAJCQkJCSAqIHRpbWVyIHRvIGtpY2sgdXMgYWdhaW4KIAkJCQkJICovCi0JCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQkJCQlibGtfcGx1Z19kZXZpY2UoZHJpdmUtPnF1ZXVlKTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssCi0JCQkJCQkJCWZsYWdzKTsKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQkJCQlibGtfcGx1Z19kZXZpY2UocSk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCiAJCQkJCXJldHVybiAxOwogCQkJCX0KIAkJCX0KQEAgLTUwNCwxMiArNTAzLDE0IEBACiAKIGVuZF9yZXF1ZXN0OgogCWlmIChzdGF0ICYgQVRBX0VSUikgeworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKLQkJSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJaHdncm91cC0+cnEgPSBOVUxMOwogCiAJCWNkcm9tX3F1ZXVlX3JlcXVlc3Rfc2Vuc2UoZHJpdmUsIHJxLT5zZW5zZSwgcnEpOwogCX0gZWxzZQpAQCAtNzczLDUyICs3NzQsNiBAQAogCXJldHVybiBjZHJvbV90cmFuc2Zlcl9wYWNrZXRfY29tbWFuZChkcml2ZSwgcnEsIGNkcm9tX25ld3BjX2ludHIpOwogfQogCi0jZGVmaW5lIElERUNEX1NFRUtfVEhSRVNIT0xECSgxMDAwKQkJCS8qIDEwMDAgYmxvY2tzICovCi0jZGVmaW5lIElERUNEX1NFRUtfVElNRVIJKDUgKiBXQUlUX01JTl9TTEVFUCkJLyogMTAwIG1zICovCi0jZGVmaW5lIElERUNEX1NFRUtfVElNRU9VVAkoMiAqIFdBSVRfQ01EKQkJLyogMjAgc2VjICovCi0KLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fc2Vla19pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlpbnQgc3RhdDsKLQlzdGF0aWMgaW50IHJldHJ5ID0gMTA7Ci0KLQlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjZHJvbV9kZWNvZGVfc3RhdHVzKGRyaXZlLCAwLCAmc3RhdCkpCi0JCXJldHVybiBpZGVfc3RvcHBlZDsKLQotCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfU0VFS0lORzsKLQotCWlmIChyZXRyeSAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGluZm8tPnN0YXJ0X3NlZWsgKyBJREVDRF9TRUVLX1RJTUVSKSkgewotCQlpZiAoLS1yZXRyeSA9PSAwKQotCQkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RTQ19PVkVSTEFQOwotCX0KLQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZV9jZF9wcmVwYXJlX3NlZWtfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlzZWN0b3JfdCBmcmFtZSA9IHJxLT5zZWN0b3I7Ci0KLQlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKLQotCXNlY3Rvcl9kaXYoZnJhbWUsIHF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUyk7Ci0KLQltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOwotCXJxLT5jbWRbMF0gPSBHUENNRF9TRUVLOwotCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIoZnJhbWUpLCAodW5zaWduZWQgaW50ICopICZycS0+Y21kWzJdKTsKLQotCXJxLT50aW1lb3V0ID0gQVRBUElfV0FJVF9QQzsKLX0KLQotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9zdGFydF9zZWVrX2NvbnRpbnVhdGlvbihpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXAtPnJxOwotCi0JcmV0dXJuIGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGRyaXZlLCBycSwgJmNkcm9tX3NlZWtfaW50cik7Ci19Ci0KIC8qCiAgKiBGaXggdXAgYSBwb3NzaWJseSBwYXJ0aWFsbHktcHJvY2Vzc2VkIHJlcXVlc3Qgc28gdGhhdCB3ZSBjYW4gc3RhcnQgaXQgb3ZlcgogICogZW50aXJlbHksIG9yIGV2ZW4gcHV0IGl0IGJhY2sgb24gdGhlIHJlcXVlc3QgcXVldWUuCkBAIC05NTAsNyArOTA1LDggQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fbmV3cGNfaW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2dyb3VwLT5ycTsKIAl4ZmVyX2Z1bmNfdCAqeGZlcmZ1bmM7CiAJaWRlX2V4cGlyeV90ICpleHBpcnkgPSBOVUxMOwogCWludCBkbWFfZXJyb3IgPSAwLCBkbWEsIHN0YXQsIHRoaXNsZW4sIHVwdG9kYXRlID0gMDsKQEAgLTExNDgsMTcgKzExMDQsMTUgQEAKIAogZW5kX3JlcXVlc3Q6CiAJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgZGxlbiA9IHJxLT5kYXRhX2xlbjsKIAogCQlpZiAoZG1hKQogCQkJcnEtPmRhdGFfbGVuID0gMDsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQkJaWYgKF9fYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCBkbGVuKSkKKwkJaWYgKGJsa19lbmRfcmVxdWVzdChycSwgMCwgZGxlbikpCiAJCQlCVUcoKTsKLQkJSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCQlod2dyb3VwLT5ycSA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJaWYgKCF1cHRvZGF0ZSkKIAkJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX0ZBSUxFRDsKQEAgLTEyNjAsNyArMTIxNCw2IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9jZF9kb19yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJCQlzZWN0b3JfdCBibG9jaykKIHsKLQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlpZGVfaGFuZGxlcl90ICpmbjsKIAlpbnQgeGZlcmxlbjsKIApAQCAtMTI3MCw0NCArMTIyMywxNCBAQAogCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrKTsKIAogCWlmIChibGtfZnNfcmVxdWVzdChycSkpIHsKLQkJaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19TRUVLSU5HKSB7Ci0JCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JCQl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBqaWZmaWVzIC0gaW5mby0+c3RhcnRfc2VlazsKLQkJCWludCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKKwkJeGZlcmxlbiA9IDMyNzY4OworCQlmbiA9IGNkcm9tX3N0YXJ0X3J3X2NvbnQ7CiAKLQkJCWlmICgoc3RhdCAmIEFUQV9EU0MpICE9IEFUQV9EU0MpIHsKLQkJCQlpZiAoZWxhcHNlZCA8IElERUNEX1NFRUtfVElNRU9VVCkgewotCQkJCQlpZGVfc3RhbGxfcXVldWUoZHJpdmUsCi0JCQkJCQkJSURFQ0RfU0VFS19USU1FUik7Ci0JCQkJCXJldHVybiBpZGVfc3RvcHBlZDsKLQkJCQl9Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IERTQyB0aW1lb3V0XG4iLAotCQkJCQkJZHJpdmUtPm5hbWUpOwotCQkJfQotCQkJZHJpdmUtPmF0YXBpX2ZsYWdzICY9IH5JREVfQUZMQUdfU0VFS0lORzsKLQkJfQotCQlpZiAocnFfZGF0YV9kaXIocnEpID09IFJFQUQgJiYKLQkJICAgIElERV9MQVJHRV9TRUVLKGluZm8tPmxhc3RfYmxvY2ssIGJsb2NrLAotCQkJICAgIElERUNEX1NFRUtfVEhSRVNIT0xEKSAmJgotCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfRFNDX09WRVJMQVApKSB7Ci0JCQl4ZmVybGVuID0gMDsKLQkJCWZuID0gY2Ryb21fc3RhcnRfc2Vla19jb250aW51YXRpb247CisJCWlmIChjZHJvbV9zdGFydF9ydyhkcml2ZSwgcnEpID09IGlkZV9zdG9wcGVkKQorCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCi0JCQlkcml2ZS0+ZG1hID0gMDsKLQkJCWluZm8tPnN0YXJ0X3NlZWsgPSBqaWZmaWVzOwotCi0JCQlpZGVfY2RfcHJlcGFyZV9zZWVrX3JlcXVlc3QoZHJpdmUsIHJxKTsKLQkJfSBlbHNlIHsKLQkJCXhmZXJsZW4gPSAzMjc2ODsKLQkJCWZuID0gY2Ryb21fc3RhcnRfcndfY29udDsKLQotCQkJaWYgKGNkcm9tX3N0YXJ0X3J3KGRyaXZlLCBycSkgPT0gaWRlX3N0b3BwZWQpCi0JCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwotCi0JCQlpZiAoaWRlX2NkX3ByZXBhcmVfcndfcmVxdWVzdChkcml2ZSwgcnEpID09IGlkZV9zdG9wcGVkKQotCQkJCXJldHVybiBpZGVfc3RvcHBlZDsKLQkJfQotCQlpbmZvLT5sYXN0X2Jsb2NrID0gYmxvY2s7CisJCWlmIChpZGVfY2RfcHJlcGFyZV9yd19yZXF1ZXN0KGRyaXZlLCBycSkgPT0gaWRlX3N0b3BwZWQpCisJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfSBlbHNlIGlmIChibGtfc2Vuc2VfcmVxdWVzdChycSkgfHwgYmxrX3BjX3JlcXVlc3QocnEpIHx8CiAJCSAgIHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfUEMpIHsKIAkJeGZlcmxlbiA9IHJxLT5kYXRhX2xlbjsKQEAgLTE5MDgsMTMgKzE4MzEsNiBAQAogCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9CiB9OwogCi1pZGVfZGV2c2V0X3J3X2ZsYWcoZHNjX292ZXJsYXAsIElERV9ERkxBR19EU0NfT1ZFUkxBUCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0IGlkZWNkX3NldHRpbmdzW10gPSB7Ci0JSURFX1BST0NfREVWU0VUKGRzY19vdmVybGFwLCAwLCAxKSwKLQl7IDAgfSwKLX07Ci0KIHN0YXRpYyBpZGVfcHJvY19lbnRyeV90ICppZGVfY2RfcHJvY19lbnRyaWVzKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlyZXR1cm4gaWRlY2RfcHJvYzsKQEAgLTE5MjIsNyArMTgzOCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0ICppZGVfY2RfcHJvY19kZXZzZXRzKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlyZXR1cm4gaWRlY2Rfc2V0dGluZ3M7CisJcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKIApAQCAtMjAyMiwxMSArMTkzOCw2IEBACiAJLyogc2V0IGNvcnJlY3QgYmxvY2sgc2l6ZSAqLwogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGRyaXZlLT5xdWV1ZSwgQ0RfRlJBTUVTSVpFKTsKIAotCWlmIChkcml2ZS0+bmV4dCAhPSBkcml2ZSkKLQkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfRFNDX09WRVJMQVA7Ci0JZWxzZQotCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7Ci0KIAlpZiAoaWRlX2Nkcm9tX3JlZ2lzdGVyKGRyaXZlLCBuc2xvdHMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggdGhlIgogCQkJCSIgY2Ryb20gZHJpdmVyLlxuIiwgZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKQEAgLTIwNjMsNyArMTk3NCw2IEBACiAJa2ZyZWUoaW5mby0+dG9jKTsKIAlpZiAoZGV2aW5mby0+aGFuZGxlID09IGRyaXZlKQogCQl1bnJlZ2lzdGVyX2Nkcm9tKGRldmluZm8pOwotCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19EU0NfT1ZFUkxBUDsKIAlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWJsa19xdWV1ZV9wcmVwX3JxKGRyaXZlLT5xdWV1ZSwgTlVMTCk7CiAJZy0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5oIGIvZHJpdmVycy9pZGUvaWRlLWNkLmgKaW5kZXggNTg4MmI5YS4uZDVjZTMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmgKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmgKQEAgLTg4LDggKzg4LDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZV9kYXRhOwogCiAJc3RydWN0IHJlcXVlc3QgcmVxdWVzdF9zZW5zZV9yZXF1ZXN0OwotCXVuc2lnbmVkIGxvbmcgbGFzdF9ibG9jazsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3NlZWs7CiAKIAl1OCBtYXhfc3BlZWQ7CQkvKiBNYXggc3BlZWQgb2YgdGhlIGRyaXZlLiAqLwogCXU4IGN1cnJlbnRfc3BlZWQ7CS8qIEN1cnJlbnQgc3BlZWQgb2YgdGhlIGRyaXZlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKaW5kZXggY2FjNDMxZi4uZjZkMmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCkBAIC05OCwxMCArOTgsMTAgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJX19sZTMyICp0YWJsZSA9IChfX2xlMzIgKilod2lmLT5kbWF0YWJsZV9jcHU7Ci0JdW5zaWduZWQgaW50IGlzX3RybTI5MAk9IChod2lmLT5jaGlwc2V0ID09IGlkZV90cm0yOTApID8gMSA6IDA7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXU4IGlzX3RybTI5MCA9ICEhKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfVFJNMjkwKTsKIAogCWh3aWYtPnNnX25lbnRzID0gaWRlX2J1aWxkX3NnbGlzdChkcml2ZSwgcnEpOwogCWlmIChod2lmLT5zZ19uZW50cyA9PSAwKQpAQCAtMTc2LDE1ICsxNzYsMTAgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7Ci0JdW5zaWduZWQgaW50IHJlYWRpbmc7CisJdW5zaWduZWQgaW50IHJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPyAwIDogQVRBX0RNQV9XUjsKIAl1OCBtbWlvID0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKIAl1OCBkbWFfc3RhdDsKIAotCWlmIChycV9kYXRhX2RpcihycSkpCi0JCXJlYWRpbmcgPSAwOwotCWVsc2UKLQkJcmVhZGluZyA9IDEgPDwgMzsKLQogCS8qIGZhbGwgYmFjayB0byBwaW8hICovCiAJaWYgKCFpZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUsIHJxKSkgewogCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CkBAIC0yMDksMTAgKzIwNCwxMSBAQAogCiAJLyogY2xlYXIgSU5UUiAmIEVSUk9SIGZsYWdzICovCiAJaWYgKG1taW8pCi0JCXdyaXRlYihkbWFfc3RhdCB8IDYsCisJCXdyaXRlYihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAogCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7CiAJZWxzZQotCQlvdXRiKGRtYV9zdGF0IHwgNiwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisJCW91dGIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKKwkJICAgICBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAxOwogCXJldHVybiAwOwpAQCAtMjQ2LDE0ICsyNDIsMTMgQEAKIAogCWh3aWYtPmh3Z3JvdXAtPmV4cGlyeSA9IE5VTEw7CS8qIG9uZSBmcmVlIHJpZGUgZm9yIG5vdyAqLwogCi0JLyogMSBkbWFpbmcsIDIgZXJyb3IsIDQgaW50ciAqLwotCWlmIChkbWFfc3RhdCAmIDIpCS8qIEVSUk9SICovCisJaWYgKGRtYV9zdGF0ICYgQVRBX0RNQV9FUlIpCS8qIEVSUk9SICovCiAJCXJldHVybiAtMTsKIAotCWlmIChkbWFfc3RhdCAmIDEpCS8qIERNQWluZyAqLworCWlmIChkbWFfc3RhdCAmIEFUQV9ETUFfQUNUSVZFKQkvKiBETUFpbmcgKi8KIAkJcmV0dXJuIFdBSVRfQ01EOwogCi0JaWYgKGRtYV9zdGF0ICYgNCkJLyogR290IGFuIEludGVycnVwdCAqLworCWlmIChkbWFfc3RhdCAmIEFUQV9ETUFfSU5UUikJLyogR290IGFuIEludGVycnVwdCAqLwogCQlyZXR1cm4gV0FJVF9DTUQ7CiAKIAlyZXR1cm4gMDsJLyogU3RhdHVzIGlzIHVua25vd24gLS0gcmVzZXQgdGhlIGJ1cyAqLwpAQCAtMjc5LDEyICsyNzQsMTEgQEAKIAkgKi8KIAlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSB7CiAJCWRtYV9jbWQgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKLQkJLyogc3RhcnQgRE1BICovCi0JCXdyaXRlYihkbWFfY21kIHwgMSwKKwkJd3JpdGViKGRtYV9jbWQgfCBBVEFfRE1BX1NUQVJULAogCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7CiAJfSBlbHNlIHsKIAkJZG1hX2NtZCA9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKLQkJb3V0YihkbWFfY21kIHwgMSwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CisJCW91dGIoZG1hX2NtZCB8IEFUQV9ETUFfU1RBUlQsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCX0KIAogCXdtYigpOwpAQCAtMjk2LDE5ICsyOTAsMTggQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7Ci0JdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKKwl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwLCBtYXNrOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAKKwkvKiBzdG9wIERNQSAqLwogCWlmIChtbWlvKSB7Ci0JCS8qIGdldCBETUEgY29tbWFuZCBtb2RlICovCiAJCWRtYV9jbWQgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKLQkJLyogc3RvcCBETUEgKi8KLQkJd3JpdGViKGRtYV9jbWQgJiB+MSwKKwkJd3JpdGViKGRtYV9jbWQgJiB+QVRBX0RNQV9TVEFSVCwKIAkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOwogCX0gZWxzZSB7CiAJCWRtYV9jbWQgPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7Ci0JCW91dGIoZG1hX2NtZCAmIH4xLCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKKwkJb3V0YihkbWFfY21kICYgfkFUQV9ETUFfU1RBUlQsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCX0KIAogCS8qIGdldCBETUEgc3RhdHVzICovCkBAIC0zMTYsMTYgKzMwOSwyMSBAQAogCiAJaWYgKG1taW8pCiAJCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLwotCQl3cml0ZWIoZG1hX3N0YXQgfCA2LAorCQl3cml0ZWIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKIAkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwogCWVsc2UKLQkJb3V0YihkbWFfc3RhdCB8IDYsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOworCQlvdXRiKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCisJCSAgICAgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CiAKIAkvKiBwdXJnZSBETUEgbWFwcGluZ3MgKi8KIAlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7Ci0JLyogdmVyaWZ5IGdvb2QgRE1BIHN0YXR1cyAqLwogCXdtYigpOwotCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0ID8gKDB4MTAgfCBkbWFfc3RhdCkgOiAwOworCisJLyogdmVyaWZ5IGdvb2QgRE1BIHN0YXR1cyAqLworCW1hc2sgPSBBVEFfRE1BX0FDVElWRSB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSOworCWlmICgoZG1hX3N0YXQgJiBtYXNrKSAhPSBBVEFfRE1BX0lOVFIpCisJCXJldHVybiAweDEwIHwgZG1hX3N0YXQ7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX2VuZCk7CiAKQEAgLTMzNSwxMSArMzMzLDcgQEAKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CiAKLQkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCi0JaWYgKChkbWFfc3RhdCAmIDQpID09IDQpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIChkbWFfc3RhdCAmIEFUQV9ETUFfSU5UUikgPyAxIDogMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfdGVzdF9pcnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IGNjMzVkNmQuLmVjYWNjMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCkBAIC04NCwxMSArODQsMTEgQEAKIAkJaWRlX2RtYV9vbihkcml2ZSk7CiAJfQogCi0JaWYgKCFfX2Jsa19lbmRfcmVxdWVzdChycSwgZXJyb3IsIG5yX2J5dGVzKSkgewotCQlpZiAoZGVxdWV1ZSkKLQkJCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisJaWYgKCFibGtfZW5kX3JlcXVlc3QocnEsIGVycm9yLCBucl9ieXRlcykpCiAJCXJldCA9IDA7Ci0JfQorCisJaWYgKHJldCA9PSAwICYmIGRlcXVldWUpCisJCWRyaXZlLT5od2lmLT5od2dyb3VwLT5ycSA9IE5VTEw7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA3LDE2ICsxMDcsNyBAQAogaW50IGlkZV9lbmRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKQogewogCXVuc2lnbmVkIGludCBucl9ieXRlcyA9IG5yX3NlY3RvcnMgPDwgOTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMTsKLQotCS8qCi0JICogcm9vbSBmb3IgbG9ja2luZyBpbXByb3ZlbWVudHMgaGVyZSwgdGhlIGNhbGxzIGJlbG93IGRvbid0Ci0JICogbmVlZCB0aGUgcXVldWUgbG9jayBoZWxkIGF0IGFsbAotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCXJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKIAogCWlmICghbnJfYnl0ZXMpIHsKIAkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkKQEAgLTEyNSwxMDUgKzExNiwxMCBAQAogCQkJbnJfYnl0ZXMgPSBycS0+aGFyZF9jdXJfc2VjdG9ycyA8PCA5OwogCX0KIAotCXJldCA9IF9faWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCBycSwgdXB0b2RhdGUsIG5yX2J5dGVzLCAxKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gX19pZGVfZW5kX3JlcXVlc3QoZHJpdmUsIHJxLCB1cHRvZGF0ZSwgbnJfYnl0ZXMsIDEpOwogfQogRVhQT1JUX1NZTUJPTChpZGVfZW5kX3JlcXVlc3QpOwogCi1zdGF0aWMgdm9pZCBpZGVfY29tcGxldGVfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSAqcG0gPSBycS0+ZGF0YTsKLQotI2lmZGVmIERFQlVHX1BNCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbXBsZXRlX3Bvd2VyX3N0ZXAoc3RlcDogJWQpXG4iLAotCQlkcml2ZS0+bmFtZSwgcG0tPnBtX3N0ZXApOwotI2VuZGlmCi0JaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChwbS0+cG1fc3RlcCkgewotCWNhc2UgSURFX1BNX0ZMVVNIX0NBQ0hFOgkvKiBTdXNwZW5kIHN0ZXAgMSAoZmx1c2ggY2FjaGUpICovCi0JCWlmIChwbS0+cG1fc3RhdGUgPT0gUE1fRVZFTlRfRlJFRVpFKQotCQkJcG0tPnBtX3N0ZXAgPSBJREVfUE1fQ09NUExFVEVEOwotCQllbHNlCi0JCQlwbS0+cG1fc3RlcCA9IElERV9QTV9TVEFOREJZOwotCQlicmVhazsKLQljYXNlIElERV9QTV9TVEFOREJZOgkJLyogU3VzcGVuZCBzdGVwIDIgKHN0YW5kYnkpICovCi0JCXBtLT5wbV9zdGVwID0gSURFX1BNX0NPTVBMRVRFRDsKLQkJYnJlYWs7Ci0JY2FzZSBJREVfUE1fUkVTVE9SRV9QSU86CS8qIFJlc3VtZSBzdGVwIDEgKHJlc3RvcmUgUElPKSAqLwotCQlwbS0+cG1fc3RlcCA9IElERV9QTV9JRExFOwotCQlicmVhazsKLQljYXNlIElERV9QTV9JRExFOgkJLyogUmVzdW1lIHN0ZXAgMiAoaWRsZSkqLwotCQlwbS0+cG1fc3RlcCA9IElERV9QTV9SRVNUT1JFX0RNQTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9zdGFydF9wb3dlcl9zdGVwKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOwotCWlkZV90YXNrX3QgKmFyZ3MgPSBycS0+c3BlY2lhbDsKLQotCW1lbXNldChhcmdzLCAwLCBzaXplb2YoKmFyZ3MpKTsKLQotCXN3aXRjaCAocG0tPnBtX3N0ZXApIHsKLQljYXNlIElERV9QTV9GTFVTSF9DQUNIRToJLyogU3VzcGVuZCBzdGVwIDEgKGZsdXNoIGNhY2hlKSAqLwotCQlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQotCQkJYnJlYWs7Ci0JCS8qIE5vdCBzdXBwb3J0ZWQ/IFN3aXRjaCB0byBuZXh0IHN0ZXAgbm93LiAqLwotCQlpZiAoYXRhX2lkX2ZsdXNoX2VuYWJsZWQoZHJpdmUtPmlkKSA9PSAwIHx8Ci0JCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19XQ0FDSEUpID09IDApIHsKLQkJCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSk7Ci0JCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0JCX0KLQkJaWYgKGF0YV9pZF9mbHVzaF9leHRfZW5hYmxlZChkcml2ZS0+aWQpKQotCQkJYXJncy0+dGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0hfRVhUOwotCQllbHNlCi0JCQlhcmdzLT50Zi5jb21tYW5kID0gQVRBX0NNRF9GTFVTSDsKLQkJZ290byBvdXRfZG9fdGY7Ci0JY2FzZSBJREVfUE1fU1RBTkRCWToJCS8qIFN1c3BlbmQgc3RlcCAyIChzdGFuZGJ5KSAqLwotCQlhcmdzLT50Zi5jb21tYW5kID0gQVRBX0NNRF9TVEFOREJZTk9XMTsKLQkJZ290byBvdXRfZG9fdGY7Ci0JY2FzZSBJREVfUE1fUkVTVE9SRV9QSU86CS8qIFJlc3VtZSBzdGVwIDEgKHJlc3RvcmUgUElPKSAqLwotCQlpZGVfc2V0X21heF9waW8oZHJpdmUpOwotCQkvKgotCQkgKiBza2lwIElERV9QTV9JRExFIGZvciBBVEFQSSBkZXZpY2VzCi0JCSAqLwotCQlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQotCQkJcG0tPnBtX3N0ZXAgPSBJREVfUE1fUkVTVE9SRV9ETUE7Ci0JCWVsc2UKLQkJCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSk7Ci0JCXJldHVybiBpZGVfc3RvcHBlZDsKLQljYXNlIElERV9QTV9JRExFOgkJLyogUmVzdW1lIHN0ZXAgMiAoaWRsZSkgKi8KLQkJYXJncy0+dGYuY29tbWFuZCA9IEFUQV9DTURfSURMRUlNTUVESUFURTsKLQkJZ290byBvdXRfZG9fdGY7Ci0JY2FzZSBJREVfUE1fUkVTVE9SRV9ETUE6CS8qIFJlc3VtZSBzdGVwIDMgKHJlc3RvcmUgRE1BKSAqLwotCQkvKgotCQkgKiBSaWdodCBub3csIGFsbCB3ZSBkbyBpcyBjYWxsIGlkZV9zZXRfZG1hKGRyaXZlKSwKLQkJICogd2UgY291bGQgYmUgc21hcnRlciBhbmQgY2hlY2sgZm9yIGN1cnJlbnQgeGZlcl9zcGVlZAotCQkgKiBpbiBzdHJ1Y3QgZHJpdmUgZXRjLi4uCi0JCSAqLwotCQlpZiAoZHJpdmUtPmh3aWYtPmRtYV9vcHMgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQkvKgotCQkgKiBUT0RPOiByZXNwZWN0IElERV9ERkxBR19VU0lOR19ETUEKLQkJICovCi0JCWlkZV9zZXRfZG1hKGRyaXZlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcG0tPnBtX3N0ZXAgPSBJREVfUE1fQ09NUExFVEVEOwotCXJldHVybiBpZGVfc3RvcHBlZDsKLQotb3V0X2RvX3RmOgotCWFyZ3MtPnRmX2ZsYWdzCSA9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7Ci0JYXJncy0+ZGF0YV9waGFzZSA9IFRBU0tGSUxFX05PX0RBVEE7Ci0JcmV0dXJuIGRvX3J3X3Rhc2tmaWxlKGRyaXZlLCBhcmdzKTsKLX0KLQogLyoqCiAgKglpZGVfZW5kX2RlcXVldWVkX3JlcXVlc3QJLQljb21wbGV0ZSBhbiBJREUgSS9PCiAgKglAZHJpdmU6IElERSBkZXZpY2UgZm9yIHRoZSBJL08KQEAgLTI0Miw0OCArMTM4LDEyIEBACiBpbnQgaWRlX2VuZF9kZXF1ZXVlZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJICAgICBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwogCUJVR19PTighYmxrX3JxX3N0YXJ0ZWQocnEpKTsKLQlyZXQgPSBfX2lkZV9lbmRfcmVxdWVzdChkcml2ZSwgcnEsIHVwdG9kYXRlLCBucl9zZWN0b3JzIDw8IDksIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBfX2lkZV9lbmRfcmVxdWVzdChkcml2ZSwgcnEsIHVwdG9kYXRlLCBucl9zZWN0b3JzIDw8IDksIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2VuZF9kZXF1ZXVlZF9yZXF1ZXN0KTsKIAotCi0vKioKLSAqCWlkZV9jb21wbGV0ZV9wbV9yZXF1ZXN0IC0gZW5kIHRoZSBjdXJyZW50IFBvd2VyIE1hbmFnZW1lbnQgcmVxdWVzdAotICoJQGRyaXZlOiB0YXJnZXQgZHJpdmUKLSAqCUBycTogcmVxdWVzdAotICoKLSAqCVRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBjdXJyZW50IFBNIHJlcXVlc3QgYW5kIHN0b3BzIHRoZSBxdWV1ZQotICoJaWYgbmVjZXNzYXJ5LgotICovCi1zdGF0aWMgdm9pZCBpZGVfY29tcGxldGVfcG1fcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmZGVmIERFQlVHX1BNCi0JcHJpbnRrKCIlczogY29tcGxldGluZyBQTSByZXF1ZXN0LCAlc1xuIiwgZHJpdmUtPm5hbWUsCi0JICAgICAgIGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpID8gInN1c3BlbmQiIDogInJlc3VtZSIpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpKSB7Ci0JCWJsa19zdG9wX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7Ci0JfSBlbHNlIHsKLQkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0JMT0NLRUQ7Ci0JCWJsa19zdGFydF9xdWV1ZShkcml2ZS0+cXVldWUpOwotCX0KLQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOwotCWlmIChfX2Jsa19lbmRfcmVxdWVzdChycSwgMCwgMCkpCi0JCUJVRygpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Ci19Ci0KIC8qKgogICoJaWRlX2VuZF9kcml2ZV9jbWQJLQllbmQgYW4gZXhwbGljaXQgZHJpdmUgY29tbWFuZAogICoJQGRyaXZlOiBjb21tYW5kIApAQCAtMzAwLDE5ICsxNjAsMTIgQEAKICAKIHZvaWQgaWRlX2VuZF9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3RhdCwgdTggZXJyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CiAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0FUQV9UQVNLRklMRSkgewogCQlpZGVfdGFza190ICp0YXNrID0gKGlkZV90YXNrX3QgKilycS0+c3BlY2lhbDsKIAotCQlpZiAocnEtPmVycm9ycyA9PSAwKQotCQkJcnEtPmVycm9ycyA9ICFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCk7Ci0KIAkJaWYgKHRhc2spIHsKIAkJCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJnRhc2stPnRmOwogCkBAIC0zMzMsMTUgKzE4NiwxNCBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JSFdHUk9VUChkcml2ZSktPnJxID0gTlVMTDsKLQlycS0+ZXJyb3JzID0gZXJyOwotCWlmICh1bmxpa2VseShfX2Jsa19lbmRfcmVxdWVzdChycSwgKHJxLT5lcnJvcnMgPyAtRUlPIDogMCksCi0JCQkJICAgICAgIGJsa19ycV9ieXRlcyhycSkpKSkKLQkJQlVHKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKLX0KKwlod2dyb3VwLT5ycSA9IE5VTEw7CiAKKwlycS0+ZXJyb3JzID0gZXJyOworCisJaWYgKHVubGlrZWx5KGJsa19lbmRfcmVxdWVzdChycSwgKHJxLT5lcnJvcnMgPyAtRUlPIDogMCksCisJCQkJICAgICBibGtfcnFfYnl0ZXMocnEpKSkpCisJCUJVRygpOworfQogRVhQT1JUX1NZTUJPTChpZGVfZW5kX2RyaXZlX2NtZCk7CiAKIHN0YXRpYyB2b2lkIGlkZV9raWxsX3JxKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQpAQCAtNzIwLDQwICs1NzIsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaWRlX2NoZWNrX3BtX3N0YXRlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOwotCi0JaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpICYmCi0JICAgIHBtLT5wbV9zdGVwID09IElERV9QTV9TVEFSVF9TVVNQRU5EKQotCQkvKiBNYXJrIGRyaXZlIGJsb2NrZWQgd2hlbiBzdGFydGluZyB0aGUgc3VzcGVuZCBzZXF1ZW5jZS4gKi8KLQkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfQkxPQ0tFRDsKLQllbHNlIGlmIChibGtfcG1fcmVzdW1lX3JlcXVlc3QocnEpICYmCi0JCSBwbS0+cG1fc3RlcCA9PSBJREVfUE1fU1RBUlRfUkVTVU1FKSB7Ci0JCS8qIAotCQkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gb24gd2FrZXVwIGlzIHRvIHdhaXQgZm9yIEJTWSBiaXQgdG8KLQkJICogZ28gYXdheSAod2l0aCBhIGxvb29uZyB0aW1lb3V0KSBhcyBhIGRyaXZlIG9uIHRoaXMgaHdpZiBtYXkKLQkJICoganVzdCBiZSBQT1NUaW5nIGl0c2VsZi4KLQkJICogV2UgZG8gdGhhdCBiZWZvcmUgZXZlbiBzZWxlY3RpbmcgYXMgdGhlICJvdGhlciIgZGV2aWNlIG9uCi0JCSAqIHRoZSBidXMgbWF5IGJlIGJyb2tlbiBlbm91Z2ggdG8gd2FsayBvbiBvdXIgdG9lcyBhdCB0aGlzCi0JCSAqIHBvaW50LgotCQkgKi8KLQkJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCQlpbnQgcmM7Ci0jaWZkZWYgREVCVUdfUE0KLQkJcHJpbnRrKCIlczogV2FrZXVwIHJlcXVlc3QgaW5pdGVkLCB3YWl0aW5nIGZvciAhQlNZLi4uXG4iLCBkcml2ZS0+bmFtZSk7Ci0jZW5kaWYKLQkJcmMgPSBpZGVfd2FpdF9ub3RfYnVzeShod2lmLCAzNTAwMCk7Ci0JCWlmIChyYykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBidXMgbm90IHJlYWR5IG9uIHdha2V1cFxuIiwgZHJpdmUtPm5hbWUpOwotCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOwotCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7Ci0JCXJjID0gaWRlX3dhaXRfbm90X2J1c3koaHdpZiwgMTAwMDAwKTsKLQkJaWYgKHJjKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKLQl9Ci19Ci0KIC8qKgogICoJc3RhcnRfcmVxdWVzdAktCXN0YXJ0IG9mIEkvTyBhbmQgY29tbWFuZCBpc3N1aW5nIGZvciBJREUKICAqCkBAIC05MjcsNyArNzQ1LDcgQEAKIAogLyoKICAqIElzc3VlIGEgbmV3IHJlcXVlc3QgdG8gYSBkcml2ZSBmcm9tIGh3Z3JvdXAKLSAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIHNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgLi4pOworICogQ2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IGRvbmUgc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIC4uKTsKICAqCiAgKiBBIGh3Z3JvdXAgaXMgYSBzZXJpYWxpemVkIGdyb3VwIG9mIElERSBpbnRlcmZhY2VzLiAgVXN1YWxseSB0aGVyZSBpcwogICogZXhhY3RseSBvbmUgaHdpZiAoaW50ZXJmYWNlKSBwZXIgaHdncm91cCwgYnV0IGJ1Z2d5IGNvbnRyb2xsZXJzIChlZy4gQ01ENjQwKQpAQCAtOTM5LDcgKzc1Nyw3IEBACiAgKiBwb3NzaWJseSBhbG9uZyB3aXRoIG1hbnkgb3RoZXIgZGV2aWNlcy4gIFRoaXMgaXMgZXNwZWNpYWxseSBjb21tb24gaW4KICAqIFBDSS1iYXNlZCBzeXN0ZW1zIHdpdGggb2ZmLWJvYXJkIElERSBjb250cm9sbGVyIGNhcmRzLgogICoKLSAqIFRoZSBJREUgZHJpdmVyIHVzZXMgdGhlIHNpbmdsZSBnbG9iYWwgaWRlX2xvY2sgc3BpbmxvY2sgdG8gcHJvdGVjdAorICogVGhlIElERSBkcml2ZXIgdXNlcyBhIHBlci1od2dyb3VwIHNwaW5sb2NrIHRvIHByb3RlY3QKICAqIGFjY2VzcyB0byB0aGUgcmVxdWVzdCBxdWV1ZXMsIGFuZCB0byBwcm90ZWN0IHRoZSBod2dyb3VwLT5idXN5IGZsYWcuCiAgKgogICogVGhlIGZpcnN0IHRocmVhZCBpbnRvIHRoZSBkcml2ZXIgZm9yIGEgcGFydGljdWxhciBod2dyb3VwIHNldHMgdGhlCkBAIC05NTUsNyArNzczLDcgQEAKICAqIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZS4gIElmIG5vIG1vcmUgd29yayByZW1haW5zLAogICogdGhlIGRyaXZlciB3aWxsIGNsZWFyIHRoZSBod2dyb3VwLT5idXN5IGZsYWcgYW5kIGV4aXQuCiAgKgotICogVGhlIGlkZV9sb2NrIChzcGlubG9jaykgaXMgdXNlZCB0byBwcm90ZWN0IGFsbCBhY2Nlc3MgdG8gdGhlCisgKiBUaGUgcGVyLWh3Z3JvdXAgc3BpbmxvY2sgaXMgdXNlZCB0byBwcm90ZWN0IGFsbCBhY2Nlc3MgdG8gdGhlCiAgKiBod2dyb3VwLT5idXN5IGZsYWcsIGJ1dCBpcyBvdGhlcndpc2Ugbm90IG5lZWRlZCBmb3IgbW9zdCBwcm9jZXNzaW5nIGluCiAgKiB0aGUgZHJpdmVyLiAgVGhpcyBtYWtlcyB0aGUgZHJpdmVyIG11Y2ggbW9yZSBmcmllbmRsaWVyIHRvIHNoYXJlZCBJUlFzCiAgKiB0aGFuIHByZXZpb3VzIGRlc2lnbnMsIHdoaWxlIHJlbWFpbmluZyAxMDAlICg/KSBTTVAgc2FmZSBhbmQgY2FwYWJsZS4KQEAgLTk2OCw3ICs3ODYsNyBAQAogCWlkZV9zdGFydHN0b3BfdAlzdGFydHN0b3A7CiAJaW50ICAgICAgICAgICAgIGxvb3BzID0gMDsKIAotCS8qIGNhbGxlciBtdXN0IG93biBpZGVfbG9jayAqLworCS8qIGNhbGxlciBtdXN0IG93biBod2dyb3VwLT5sb2NrICovCiAJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJd2hpbGUgKCFod2dyb3VwLT5idXN5KSB7CkBAIC0xMDIzLDEyICs4NDEsMTIgQEAKIAkJfQogCWFnYWluOgogCQlod2lmID0gSFdJRihkcml2ZSk7Ci0JCWlmIChod2dyb3VwLT5od2lmLT5zaGFyaW5nX2lycSAmJiBod2lmICE9IGh3Z3JvdXAtPmh3aWYpIHsKKwkJaWYgKGh3aWYgIT0gaHdncm91cC0+aHdpZikgewogCQkJLyoKIAkJCSAqIHNldCBuSUVOIGZvciBwcmV2aW91cyBod2lmLCBkcml2ZXMgaW4gdGhlCiAJCQkgKiBxdWlya19saXN0IG1heSBub3QgbGlrZSBpbnRyIHNldHVwcy9jbGVhbnVwcwogCQkJICovCi0JCQlpZiAoZHJpdmUtPnF1aXJrX2xpc3QgIT0gMSkKKwkJCWlmIChkcml2ZS0+cXVpcmtfbGlzdCA9PSAwKQogCQkJCWh3aWYtPnRwX29wcy0+c2V0X2lycShod2lmLCAwKTsKIAkJfQogCQlod2dyb3VwLT5od2lmID0gaHdpZjsKQEAgLTEwMzYsMTEgKzg1NCw2IEBACiAJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfihJREVfREZMQUdfU0xFRVBJTkcgfCBJREVfREZMQUdfUEFSS0VEKTsKIAkJZHJpdmUtPnNlcnZpY2Vfc3RhcnQgPSBqaWZmaWVzOwogCi0JCWlmIChibGtfcXVldWVfcGx1Z2dlZChkcml2ZS0+cXVldWUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlkZTogaHVoPyBxdWV1ZSB3YXMgcGx1Z2dlZCFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQogCQkvKgogCQkgKiB3ZSBrbm93IHRoYXQgdGhlIHF1ZXVlIGlzbid0IGVtcHR5LCBidXQgdGhpcyBjYW4gaGFwcGVuCiAJCSAqIGlmIHRoZSBxLT5wcmVwX3JxX2ZuKCkgZGVjaWRlcyB0byBraWxsIGEgcmVxdWVzdApAQCAtMTA5MCwxMSArOTAzLDExIEBACiAJCSAqLwogCQlpZiAobWFza2VkX2lycSAhPSBJREVfTk9fSVJRICYmIGh3aWYtPmlycSAhPSBtYXNrZWRfaXJxKQogCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGh3aWYtPmlycSk7Ci0JCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZod2dyb3VwLT5sb2NrKTsKIAkJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAJCQkvKiBhbGxvdyBvdGhlciBJUlFzIHdoaWxlIHdlIHN0YXJ0IHRoaXMgcmVxdWVzdCAqLwogCQlzdGFydHN0b3AgPSBzdGFydF9yZXF1ZXN0KGRyaXZlLCBycSk7Ci0JCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJCWlmIChtYXNrZWRfaXJxICE9IElERV9OT19JUlEgJiYgaHdpZi0+aXJxICE9IG1hc2tlZF9pcnEpCiAJCQllbmFibGVfaXJxKGh3aWYtPmlycSk7CiAJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpCkBAIC0xMTkyLDcgKzEwMDUsNyBAQAogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwl3YWl0ID0gLTE7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwpIHx8CiAJICAgIChod2dyb3VwLT5yZXFfZ2VuICE9IGh3Z3JvdXAtPnJlcV9nZW5fdGltZXIpKSB7CkBAIC0xMjI1LDcgKzEwMzgsNyBAQAogCQkJCQlod2dyb3VwLT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyB3YWl0OwogCQkJCQlod2dyb3VwLT5yZXFfZ2VuX3RpbWVyID0gaHdncm91cC0+cmVxX2dlbjsKIAkJCQkJYWRkX3RpbWVyKCZod2dyb3VwLT50aW1lcik7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KQEAgLTEyMzUsNyArMTA0OCw3IEBACiAJCQkgKiB0aGUgaGFuZGxlcigpIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvCiAJCQkgKiBnbG9iYWxseSBtYXNrIHRoZSBzcGVjaWZpYyBJUlE6CiAJCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJCQlzcGluX3VubG9jaygmaHdncm91cC0+bG9jayk7CiAJCQlod2lmICA9IEhXSUYoZHJpdmUpOwogCQkJLyogZGlzYWJsZV9pcnFfbm9zeW5jID8/ICovCiAJCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOwpAQCAtMTI1OSwxNCArMTA3MiwxNCBAQAogCQkJCQkJICBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpKTsKIAkJCX0KIAkJCWRyaXZlLT5zZXJ2aWNlX3RpbWUgPSBqaWZmaWVzIC0gZHJpdmUtPnNlcnZpY2Vfc3RhcnQ7Ci0JCQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAkJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKIAkJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpCiAJCQkJaHdncm91cC0+YnVzeSA9IDA7CiAJCX0KIAl9CiAJaWRlX2RvX3JlcXVlc3QoaHdncm91cCwgSURFX05PX0lSUSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMTM1OSwxOCArMTE3MiwxNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IChpZGVfaHdncm91cF90ICopZGV2X2lkOwotCWlkZV9od2lmX3QgKmh3aWY7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGh3Z3JvdXAtPmh3aWY7CiAJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWlkZV9oYW5kbGVyX3QgKmhhbmRsZXI7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKKwlpcnFyZXR1cm5fdCBpcnFfcmV0ID0gSVJRX05PTkU7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQlod2lmID0gaHdncm91cC0+aHdpZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCFpZGVfYWNrX2ludHIoaHdpZikpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KKwlpZiAoIWlkZV9hY2tfaW50cihod2lmKSkKKwkJZ290byBvdXQ7CiAKIAlpZiAoKGhhbmRsZXIgPSBod2dyb3VwLT5oYW5kbGVyKSA9PSBOVUxMIHx8IGh3Z3JvdXAtPnBvbGxpbmcpIHsKIAkJLyoKQEAgLTE0MDYsOSArMTIxNyw5IEBACiAJCQkodm9pZClod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERVBDSSAqLwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKKwkJZ290byBvdXQ7CiAJfQorCiAJZHJpdmUgPSBod2dyb3VwLT5kcml2ZTsKIAlpZiAoIWRyaXZlKSB7CiAJCS8qCkBAIC0xNDE3LDEwICsxMjI4LDEwIEBACiAJCSAqCiAJCSAqIFtOb3RlIC0gdGhpcyBjYW4gb2NjdXIgaWYgdGhlIGRyaXZlIGlzIGhvdCB1bnBsdWdnZWRdCiAJCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCWdvdG8gb3V0X2hhbmRsZWQ7CiAJfQotCWlmICghZHJpdmVfaXNfcmVhZHkoZHJpdmUpKSB7CisKKwlpZiAoIWRyaXZlX2lzX3JlYWR5KGRyaXZlKSkKIAkJLyoKIAkJICogVGhpcyBoYXBwZW5zIHJlZ3VsYXJseSB3aGVuIHdlIHNoYXJlIGEgUENJIElSUSB3aXRoCiAJCSAqIGFub3RoZXIgZGV2aWNlLiAgVW5mb3J0dW5hdGVseSwgaXQgY2FuIGFsc28gaGFwcGVuCkBAIC0xNDI4LDkgKzEyMzksOCBAQAogCQkgKiB0aGVpciBzdGF0dXMgcmVnaXN0ZXIgaXMgdXAgdG8gZGF0ZS4gIEhvcGVmdWxseSB3ZSBoYXZlCiAJCSAqIGVub3VnaCBhZHZhbmNlIG92ZXJoZWFkIHRoYXQgdGhlIGxhdHRlciBpc24ndCBhIHByb2JsZW0uCiAJCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQorCQlnb3RvIG91dDsKKwogCWlmICghaHdncm91cC0+YnVzeSkgewogCQlod2dyb3VwLT5idXN5ID0gMTsJLyogcGFyYW5vaWEgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogaWRlX2ludHI6IGh3Z3JvdXAtPmJ1c3kgd2FzIDAgPz9cbiIsIGRyaXZlLT5uYW1lKTsKQEAgLTE0MzgsNyArMTI0OCw3IEBACiAJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7CiAJaHdncm91cC0+cmVxX2dlbisrOwogCWRlbF90aW1lcigmaHdncm91cC0+dGltZXIpOwotCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJc3Bpbl91bmxvY2soJmh3Z3JvdXAtPmxvY2spOwogCiAJaWYgKGh3aWYtPnBvcnRfb3BzICYmIGh3aWYtPnBvcnRfb3BzLT5jbGVhcl9pcnEpCiAJCWh3aWYtPnBvcnRfb3BzLT5jbGVhcl9pcnEoZHJpdmUpOwpAQCAtMTQ0OSw3ICsxMjU5LDcgQEAKIAkvKiBzZXJ2aWNlIHRoaXMgaW50ZXJydXB0LCBtYXkgc2V0IGhhbmRsZXIgZm9yIG5leHQgaW50ZXJydXB0ICovCiAJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJLyoKIAkgKiBOb3RlIHRoYXQgaGFuZGxlcigpIG1heSBoYXZlIHNldCB0aGluZ3MgdXAgZm9yIGFub3RoZXIKIAkgKiBpbnRlcnJ1cHQgdG8gb2NjdXIgc29vbiwgYnV0IGl0IGNhbm5vdCBoYXBwZW4gdW50aWwKQEAgLTE0NjcsOCArMTI3NywxMSBAQAogCQkJCSJvbiBleGl0XG4iLCBkcml2ZS0+bmFtZSk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CitvdXRfaGFuZGxlZDoKKwlpcnFfcmV0ID0gSVJRX0hBTkRMRUQ7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBpcnFfcmV0OwogfQogCiAvKioKQEAgLTE0ODgsMTYgKzEzMDEsMTcgQEAKIAogdm9pZCBpZGVfZG9fZHJpdmVfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogeworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwogCWh3Z3JvdXAtPnJxID0gTlVMTDsKLQlfX2Vsdl9hZGRfcmVxdWVzdChkcml2ZS0+cXVldWUsIHJxLCBFTEVWQVRPUl9JTlNFUlRfRlJPTlQsIDApOwotCWJsa19zdGFydF9xdWV1ZWluZyhkcml2ZS0+cXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7Ci19CiAKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJX19lbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCwgMCk7CisJYmxrX3N0YXJ0X3F1ZXVlaW5nKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworfQogRVhQT1JUX1NZTUJPTChpZGVfZG9fZHJpdmVfY21kKTsKIAogdm9pZCBpZGVfcGt0Y21kX3RmX2xvYWQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1MzIgdGZfZmxhZ3MsIHUxNiBiY291bnQsIHU4IGRtYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pb2N0bHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb2N0bHMuYwppbmRleCBmY2RlMTZiLi4yODIzMmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jCkBAIC0xOSw3ICsxOSw2IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpZGVfaW9jdGxfZGV2c2V0ICpzKQogewogCWNvbnN0IHN0cnVjdCBpZGVfZGV2c2V0ICpkczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAtRU9QTk9UU1VQUDsKIAogCWZvciAoOyAoZHMgPSBzLT5zZXR0aW5nKTsgcysrKSB7CkBAIC0zMyw5ICszMiw3IEBACiAKIHJlYWRfdmFsOgogCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CiAJZXJyID0gZHMtPmdldChkcml2ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJmlkZV9zZXR0aW5nX210eCk7CiAJcmV0dXJuIGVyciA+PSAwID8gcHV0X3VzZXIoZXJyLCAobG9uZyBfX3VzZXIgKilhcmcpIDogZXJyOwogCkBAIC05OCw3ICs5NSw3IEBACiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoKChhcmcgPj4gSURFX05JQ0VfRFNDX09WRVJMQVApICYgMSkgJiYKLQkgICAgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzayB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX2Zsb3BweSB8fAorCSAgICAoZHJpdmUtPm1lZGlhICE9IGlkZV90YXBlIHx8CiAJICAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TQ1NJKSkpCiAJCXJldHVybiAtRVBFUk07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCmluZGV4IGM0MWMzYjkuLmFkOGJkNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpAQCAtODM1LDEwICs4MzUsMTIgQEAKIHZvaWQgaWRlX3NldF9oYW5kbGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsCiAJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSkKIHsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiAJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGhhbmRsZXIsIHRpbWVvdXQsIGV4cGlyeSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaWRlX3NldF9oYW5kbGVyKTsKQEAgLTg2MCwxMCArODYyLDExIEBACiB2b2lkIGlkZV9leGVjdXRlX2NvbW1hbmQoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQsIGlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsCiAJCQkgdW5zaWduZWQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwgZXhwaXJ5KTsKIAlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBjbWQpOwogCS8qCkBAIC04NzMsMTkgKzg3NiwyMCBAQAogCSAqIEZJWE1FOiB3ZSBjb3VsZCBza2lwIHRoaXMgZGVsYXkgd2l0aCBjYXJlIG9uIG5vbiBzaGFyZWQgZGV2aWNlcwogCSAqLwogCW5kZWxheSg0MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChpZGVfZXhlY3V0ZV9jb21tYW5kKTsKIAogdm9pZCBpZGVfZXhlY3V0ZV9wa3RfY21kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiAJaHdpZi0+dHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgQVRBX0NNRF9QQUNLRVQpOwogCW5kZWxheSg0MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2V4ZWN1dGVfcGt0X2NtZCk7CiAKQEAgLTEwNzYsMjIgKzEwODAsMTYgQEAKICAqLwogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBkb19yZXNldDEgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGRvX25vdF90cnlfYXRhcGkpCiB7Ci0JdW5zaWduZWQgaW50IHVuaXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKLQlpZGVfaHdpZl90ICpod2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXA7Ci0Jc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHM7Ci0JY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wczsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CisJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7CisJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lb3V0OworCXVuc2lnbmVkIGludCB1bml0OwogCURFRklORV9XQUlUKHdhaXQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JaHdpZiA9IEhXSUYoZHJpdmUpOwotCWh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKLQotCWlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwotCi0JdHBfb3BzID0gaHdpZi0+dHBfb3BzOworCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBXZSBtdXN0IG5vdCByZXNldCB3aXRoIHJ1bm5pbmcgaGFuZGxlcnMgKi8KIAlCVUdfT04oaHdncm91cC0+aGFuZGxlciAhPSBOVUxMKTsKQEAgLTExMDYsNyArMTEwNCw3IEBACiAJCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKIAkJaHdncm91cC0+cG9sbGluZyA9IDE7CiAJCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmYXRhcGlfcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJfQogCkBAIC0xMTI5LDkgKzExMjcsOSBAQAogCQlpZiAodGltZV9iZWZvcmVfZXEodGltZW91dCwgbm93KSkKIAkJCWJyZWFrOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHRpbWVvdXQgLSBub3cpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAl9IHdoaWxlICh0aW1lb3V0KTsKIAlmaW5pc2hfd2FpdCgmaWRlX3Bhcmtfd3EsICZ3YWl0KTsKIApAQCAtMTE0Myw3ICsxMTQxLDcgQEAKIAkJcHJlX3Jlc2V0KCZod2lmLT5kcml2ZXNbdW5pdF0pOwogCiAJaWYgKGlvX3BvcnRzLT5jdGxfYWRkciA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAkJaWRlX2NvbXBsZXRlX2RyaXZlX3Jlc2V0KGRyaXZlLCAtRU5YSU8pOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQpAQCAtMTE3OSw3ICsxMTc3LDcgQEAKIAlpZiAocG9ydF9vcHMgJiYgcG9ydF9vcHMtPnJlc2V0cHJvYykKIAkJcG9ydF9vcHMtPnJlc2V0cHJvYyhkcml2ZSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1sZWdhY3kuYyBiL2RyaXZlcnMvaWRlL2lkZS1sZWdhY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVkY2JmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxlZ2FjeS5jCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKworc3RhdGljIHZvaWQgaWRlX2xlZ2FjeV9pbml0X29uZShod19yZWdzX3QgKipod3MsIGh3X3JlZ3NfdCAqaHcsCisJCQkJdTggcG9ydF9ubywgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKmQsCisJCQkJdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlLCBjdGw7CisJaW50IGlycTsKKworCWlmIChwb3J0X25vID09IDApIHsKKwkJYmFzZSA9IDB4MWYwOworCQljdGwgID0gMHgzZjY7CisJCWlycSAgPSAxNDsKKwl9IGVsc2UgeworCQliYXNlID0gMHgxNzA7CisJCWN0bCAgPSAweDM3NjsKKwkJaXJxICA9IDE1OworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgOCwgZC0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSS9PIHJlc291cmNlIDB4JWxYLTB4JWxYIG5vdCBmcmVlLlxuIiwKKwkJCQlkLT5uYW1lLCBiYXNlLCBiYXNlICsgNyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGN0bCwgMSwgZC0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSS9PIHJlc291cmNlIDB4JWxYIG5vdCBmcmVlLlxuIiwKKwkJCQlkLT5uYW1lLCBjdGwpOworCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA4KTsKKwkJcmV0dXJuOworCX0KKworCWlkZV9zdGRfaW5pdF9wb3J0cyhodywgYmFzZSwgY3RsKTsKKwlody0+aXJxID0gaXJxOworCWh3LT5jaGlwc2V0ID0gZC0+Y2hpcHNldDsKKwlody0+Y29uZmlnID0gY29uZmlnOworCisJaHdzW3BvcnRfbm9dID0gaHc7Cit9CisKK2ludCBpZGVfbGVnYWN5X2RldmljZV9hZGQoY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKmQsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCWh3X3JlZ3NfdCBod1syXSwgKmh3c1tdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKwltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKworCWlmICgoZC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19RRF8yTkRfUE9SVCkgPT0gMCkKKwkJaWRlX2xlZ2FjeV9pbml0X29uZShod3MsICZod1swXSwgMCwgZCwgY29uZmlnKTsKKwlpZGVfbGVnYWN5X2luaXRfb25lKGh3cywgJmh3WzFdLCAxLCBkLCBjb25maWcpOworCisJaWYgKGh3c1swXSA9PSBOVUxMICYmIGh3c1sxXSA9PSBOVUxMICYmCisJICAgIChkLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NJTkdMRSkpCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0dXJuIGlkZV9ob3N0X2FkZChkLCBod3MsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2xlZ2FjeV9kZXZpY2VfYWRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwppbmRleCA5ZmM0Y2ZiLi45ZjZlMzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCkBAIC00Myw3ICs0Myw2IEBACiAKIAlyZXR1cm4gczsKIH0KLQogRVhQT1JUX1NZTUJPTChpZGVfeGZlcl92ZXJib3NlKTsKIAogLyoqCkBAIC04Nyw3ICs4Niw3IEBACiAgKglUaGlzIGlzIHVzZWQgYnkgbW9zdCBjaGlwc2V0IHN1cHBvcnQgbW9kdWxlcyB3aGVuICJhdXRvLXR1bmluZyIuCiAgKi8KIAotdTggaWRlX2dldF9iZXN0X3Bpb19tb2RlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkLCB1OCBtYXhfbW9kZSkKK3U4IGlkZV9nZXRfYmVzdF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkLCB1OCBtYXhfbW9kZSkKIHsKIAl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWludCBwaW9fbW9kZSA9IC0xLCBvdmVycmlkZGVuID0gMDsKQEAgLTEzMSw3ICsxMzAsNiBAQAogCiAJcmV0dXJuIHBpb19tb2RlOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZ2V0X2Jlc3RfcGlvX21vZGUpOwogCiAvKiByZXFfcGlvID09ICIyNTUiIGZvciBhdXRvLXR1bmUgKi8KQEAgLTE2Miw3ICsxNjAsNiBAQAogCiAJKHZvaWQpaWRlX3NldF9waW9fbW9kZShkcml2ZSwgWEZFUl9QSU9fMCArIHBpbyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9zZXRfcGlvKTsKIAogLyoqCkBAIC0xNzMsNyArMTcwLDcgQEAKICAqCUVuYWJsZSBvciBkaXNhYmxlIGJvdW5jZSBidWZmZXJpbmcgZm9yIHRoZSBkZXZpY2UuIERyaXZlcyBtb3ZlCiAgKgliZXR3ZWVuIFBJTyBhbmQgRE1BIGFuZCB0aGF0IGNoYW5nZXMgdGhlIHJ1bGVzIHdlIG5lZWQuCiAgKi8KLSAKKwogdm9pZCBpZGVfdG9nZ2xlX2JvdW5jZShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBvbikKIHsKIAl1NjQgYWRkciA9IEJMS19CT1VOQ0VfSElHSDsJLyogZG1hNjRfYWRkcl90ICovCkBAIC0yNDMsMTQgKzI0MCwxMyBAQAogCQlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgbW9kZSk7CiAJfQogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfc2V0X2RtYV9tb2RlKTsKIAogLyoqCiAgKglpZGVfc2V0X3hmZXJfcmF0ZQktCXNldCB0cmFuc2ZlciByYXRlCiAgKglAZHJpdmU6IGRyaXZlIHRvIHNldAogICoJQHJhdGU6IHNwZWVkIHRvIGF0dGVtcHQgdG8gc2V0Ci0gKgkKKyAqCiAgKglHZW5lcmFsIGhlbHBlciBmb3Igc2V0dGluZyB0aGUgc3BlZWQgb2YgYW4gSURFIGRldmljZS4gVGhpcwogICoJZnVuY3Rpb24ga25vd3MgYWJvdXQgdXNlciBlbmZvcmNlZCBsaW1pdHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbgogICoJd2hpY2ggLT5zZXRfcGlvX21vZGUvLT5zZXRfZG1hX21vZGUgZG9lcyBub3QuCkBAIC0yNzcsMjEgKzI3MywxNiBAQAogCiBzdGF0aWMgdm9pZCBpZGVfZHVtcF9vcGNvZGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CiAJaWRlX3Rhc2tfdCAqdGFzayA9IE5VTEw7CiAKLQlzcGluX2xvY2soJmlkZV9sb2NrKTsKLQlycSA9IE5VTEw7Ci0JaWYgKEhXR1JPVVAoZHJpdmUpKQotCQlycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQlzcGluX3VubG9jaygmaWRlX2xvY2spOwogCWlmICghcnEpCiAJCXJldHVybjsKIAogCWlmIChycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfQVRBX1RBU0tGSUxFKQogCQl0YXNrID0gcnEtPnNwZWNpYWw7CiAKLQlwcmludGsoImlkZTogZmFpbGVkIG9wY29kZSB3YXM6ICIpOworCXByaW50ayhLRVJOX0VSUiAiaWRlOiBmYWlsZWQgb3Bjb2RlIHdhczogIik7CiAJaWYgKHRhc2sgPT0gTlVMTCkKIAkJcHJpbnRrKEtFUk5fQ09OVCAidW5rbm93blxuIik7CiAJZWxzZQpAQCAtMzI5LDQ0ICszMjAsNTUgQEAKIAlkcml2ZS0+aHdpZi0+dHBfb3BzLT50Zl9yZWFkKGRyaXZlLCAmdGFzayk7CiAKIAlpZiAobGJhNDggfHwgKHRmLT5kZXZpY2UgJiBBVEFfTEJBKSkKLQkJcHJpbnRrKCIsIExCQXNlY3Q9JWxsdSIsCisJCXByaW50ayhLRVJOX0NPTlQgIiwgTEJBc2VjdD0lbGx1IiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWRlX2dldF9sYmFfYWRkcih0ZiwgbGJhNDgpKTsKIAllbHNlCi0JCXByaW50aygiLCBDSFM9JWQvJWQvJWQiLCAodGYtPmxiYWggPDwgOCkgKyB0Zi0+bGJhbSwKLQkJCQkJIHRmLT5kZXZpY2UgJiAweGYsIHRmLT5sYmFsKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiLCBDSFM9JWQvJWQvJWQiLCAodGYtPmxiYWggPDwgOCkgKyB0Zi0+bGJhbSwKKwkJCXRmLT5kZXZpY2UgJiAweGYsIHRmLT5sYmFsKTsKIH0KIAogc3RhdGljIHZvaWQgaWRlX2R1bXBfYXRhX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggZXJyKQogewotCXByaW50aygieyAiKTsKLQlpZiAoZXJyICYgQVRBX0FCT1JURUQpCXByaW50aygiRHJpdmVTdGF0dXNFcnJvciAiKTsKKwlwcmludGsoS0VSTl9FUlIgInsgIik7CisJaWYgKGVyciAmIEFUQV9BQk9SVEVEKQorCQlwcmludGsoS0VSTl9DT05UICJEcml2ZVN0YXR1c0Vycm9yICIpOwogCWlmIChlcnIgJiBBVEFfSUNSQykKLQkJcHJpbnRrKChlcnIgJiBBVEFfQUJPUlRFRCkgPyAiQmFkQ1JDICIgOiAiQmFkU2VjdG9yICIpOwotCWlmIChlcnIgJiBBVEFfVU5DKQlwcmludGsoIlVuY29ycmVjdGFibGVFcnJvciAiKTsKLQlpZiAoZXJyICYgQVRBX0lETkYpCXByaW50aygiU2VjdG9ySWROb3RGb3VuZCAiKTsKLQlpZiAoZXJyICYgQVRBX1RSSzBORikJcHJpbnRrKCJUcmFja1plcm9Ob3RGb3VuZCAiKTsKLQlpZiAoZXJyICYgQVRBX0FNTkYpCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKLQlwcmludGsoIn0iKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiJXMiLAorCQkJKGVyciAmIEFUQV9BQk9SVEVEKSA/ICJCYWRDUkMgIiA6ICJCYWRTZWN0b3IgIik7CisJaWYgKGVyciAmIEFUQV9VTkMpCisJCXByaW50ayhLRVJOX0NPTlQgIlVuY29ycmVjdGFibGVFcnJvciAiKTsKKwlpZiAoZXJyICYgQVRBX0lETkYpCisJCXByaW50ayhLRVJOX0NPTlQgIlNlY3RvcklkTm90Rm91bmQgIik7CisJaWYgKGVyciAmIEFUQV9UUkswTkYpCisJCXByaW50ayhLRVJOX0NPTlQgIlRyYWNrWmVyb05vdEZvdW5kICIpOworCWlmIChlcnIgJiBBVEFfQU1ORikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQWRkck1hcmtOb3RGb3VuZCAiKTsKKwlwcmludGsoS0VSTl9DT05UICJ9Iik7CiAJaWYgKChlcnIgJiAoQVRBX0JCSyB8IEFUQV9BQk9SVEVEKSkgPT0gQVRBX0JCSyB8fAogCSAgICAoZXJyICYgKEFUQV9VTkMgfCBBVEFfSURORiB8IEFUQV9BTU5GKSkpIHsKIAkJaWRlX2R1bXBfc2VjdG9yKGRyaXZlKTsKIAkJaWYgKEhXR1JPVVAoZHJpdmUpICYmIEhXR1JPVVAoZHJpdmUpLT5ycSkKLQkJCXByaW50aygiLCBzZWN0b3I9JWxsdSIsCisJCQlwcmludGsoS0VSTl9DT05UICIsIHNlY3Rvcj0lbGx1IiwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKUhXR1JPVVAoZHJpdmUpLT5ycS0+c2VjdG9yKTsKIAl9Ci0JcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV9kdW1wX2F0YXBpX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggZXJyKQogewotCXByaW50aygieyAiKTsKLQlpZiAoZXJyICYgQVRBUElfSUxJKQlwcmludGsoIklsbGVnYWxMZW5ndGhJbmRpY2F0aW9uICIpOwotCWlmIChlcnIgJiBBVEFQSV9FT00pCXByaW50aygiRW5kT2ZNZWRpYSAiKTsKLQlpZiAoZXJyICYgQVRBX0FCT1JURUQpCXByaW50aygiQWJvcnRlZENvbW1hbmQgIik7Ci0JaWYgKGVyciAmIEFUQV9NQ1IpCXByaW50aygiTWVkaWFDaGFuZ2VSZXF1ZXN0ZWQgIik7Ci0JaWYgKGVyciAmIEFUQVBJX0xGUykJcHJpbnRrKCJMYXN0RmFpbGVkU2Vuc2U9MHglMDJ4ICIsCi0JCQkJICAgICAgIChlcnIgJiBBVEFQSV9MRlMpID4+IDQpOwotCXByaW50aygifVxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJ7ICIpOworCWlmIChlcnIgJiBBVEFQSV9JTEkpCisJCXByaW50ayhLRVJOX0NPTlQgIklsbGVnYWxMZW5ndGhJbmRpY2F0aW9uICIpOworCWlmIChlcnIgJiBBVEFQSV9FT00pCisJCXByaW50ayhLRVJOX0NPTlQgIkVuZE9mTWVkaWEgIik7CisJaWYgKGVyciAmIEFUQV9BQk9SVEVEKQorCQlwcmludGsoS0VSTl9DT05UICJBYm9ydGVkQ29tbWFuZCAiKTsKKwlpZiAoZXJyICYgQVRBX01DUikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTWVkaWFDaGFuZ2VSZXF1ZXN0ZWQgIik7CisJaWYgKGVyciAmIEFUQVBJX0xGUykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTGFzdEZhaWxlZFNlbnNlPTB4JTAyeCAiLAorCQkJKGVyciAmIEFUQVBJX0xGUykgPj4gNCk7CisJcHJpbnRrKEtFUk5fQ09OVCAifVxuIik7CiB9CiAKIC8qKgpAQCAtMzgyLDM0ICszODQsMzcgQEAKIAogdTggaWRlX2R1bXBfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggZXJyID0gMDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCB7ICIsIGRyaXZlLT5uYW1lLCBtc2csIHN0YXQpOworCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBzdGF0dXM9MHglMDJ4IHsgIiwgZHJpdmUtPm5hbWUsIG1zZywgc3RhdCk7CiAJaWYgKHN0YXQgJiBBVEFfQlVTWSkKLQkJcHJpbnRrKCJCdXN5ICIpOworCQlwcmludGsoS0VSTl9DT05UICJCdXN5ICIpOwogCWVsc2UgewotCQlpZiAoc3RhdCAmIEFUQV9EUkRZKQlwcmludGsoIkRyaXZlUmVhZHkgIik7Ci0JCWlmIChzdGF0ICYgQVRBX0RGKQlwcmludGsoIkRldmljZUZhdWx0ICIpOwotCQlpZiAoc3RhdCAmIEFUQV9EU0MpCXByaW50aygiU2Vla0NvbXBsZXRlICIpOwotCQlpZiAoc3RhdCAmIEFUQV9EUlEpCXByaW50aygiRGF0YVJlcXVlc3QgIik7Ci0JCWlmIChzdGF0ICYgQVRBX0NPUlIpCXByaW50aygiQ29ycmVjdGVkRXJyb3IgIik7Ci0JCWlmIChzdGF0ICYgQVRBX0lEWCkJcHJpbnRrKCJJbmRleCAiKTsKLQkJaWYgKHN0YXQgJiBBVEFfRVJSKQlwcmludGsoIkVycm9yICIpOworCQlpZiAoc3RhdCAmIEFUQV9EUkRZKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiRHJpdmVSZWFkeSAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfREYpCisJCQlwcmludGsoS0VSTl9DT05UICJEZXZpY2VGYXVsdCAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfRFNDKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiU2Vla0NvbXBsZXRlICIpOworCQlpZiAoc3RhdCAmIEFUQV9EUlEpCisJCQlwcmludGsoS0VSTl9DT05UICJEYXRhUmVxdWVzdCAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfQ09SUikKKwkJCXByaW50ayhLRVJOX0NPTlQgIkNvcnJlY3RlZEVycm9yICIpOworCQlpZiAoc3RhdCAmIEFUQV9JRFgpCisJCQlwcmludGsoS0VSTl9DT05UICJJbmRleCAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfRVJSKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiRXJyb3IgIik7CiAJfQotCXByaW50aygifVxuIik7CisJcHJpbnRrKEtFUk5fQ09OVCAifVxuIik7CiAJaWYgKChzdGF0ICYgKEFUQV9CVVNZIHwgQVRBX0VSUikpID09IEFUQV9FUlIpIHsKIAkJZXJyID0gaWRlX3JlYWRfZXJyb3IoZHJpdmUpOwotCQlwcmludGsoIiVzOiAlczogZXJyb3I9MHglMDJ4ICIsIGRyaXZlLT5uYW1lLCBtc2csIGVycik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBlcnJvcj0weCUwMnggIiwgZHJpdmUtPm5hbWUsIG1zZywgZXJyKTsKIAkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKIAkJCWlkZV9kdW1wX2F0YV9lcnJvcihkcml2ZSwgZXJyKTsKIAkJZWxzZQogCQkJaWRlX2R1bXBfYXRhcGlfZXJyb3IoZHJpdmUsIGVycik7CiAJfQogCWlkZV9kdW1wX29wY29kZShkcml2ZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiBlcnI7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaWRlX2R1bXBfc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMgYi9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCmluZGV4IDAzYjAwZTUuLjYzZDAxYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpAQCAtNywxNyArNywxNiBAQAogCiBzdGF0aWMgdm9pZCBpc3N1ZV9wYXJrX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCByYzsKIAogCXRpbWVvdXQgKz0gamlmZmllczsKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEKSB7Ci0JCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKLQkJaW50IHJlc2V0X3RpbWVyOworCQlpbnQgcmVzZXRfdGltZXIgPSB0aW1lX2JlZm9yZSh0aW1lb3V0LCBkcml2ZS0+c2xlZXApOwogCi0JCXJlc2V0X3RpbWVyID0gdGltZV9iZWZvcmUodGltZW91dCwgZHJpdmUtPnNsZWVwKTsKIAkJZHJpdmUtPnNsZWVwID0gdGltZW91dDsKIAkJd2FrZV91cF9hbGwoJmlkZV9wYXJrX3dxKTsKIAkJaWYgKHJlc2V0X3RpbWVyICYmIGh3Z3JvdXAtPnNsZWVwaW5nICYmCkBAIC0yNiwxMCArMjUsMTAgQEAKIAkJCWh3Z3JvdXAtPmJ1c3kgPSAwOwogCQkJYmxrX3N0YXJ0X3F1ZXVlaW5nKHEpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwogCQlyZXR1cm47CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAKIAlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBfX0dGUF9XQUlUKTsKIAlycS0+Y21kWzBdID0gUkVRX1BBUktfSEVBRFM7CkBAIC02MiwyMCArNjEsMjEgQEAKIAkJICAgICAgY2hhciAqYnVmKQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBub3c7CiAJdW5zaWduZWQgaW50IG1zZWNzOwogCiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9fVU5MT0FEKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJbm93ID0gamlmZmllczsKIAlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQgJiYKIAkgICAgdGltZV9hZnRlcihkcml2ZS0+c2xlZXAsIG5vdykpCiAJCW1zZWNzID0gamlmZmllc190b19tc2Vjcyhkcml2ZS0+c2xlZXAgLSBub3cpOwogCWVsc2UKIAkJbXNlY3MgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLCBtc2Vjcyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcG0uYyBiL2RyaXZlcnMvaWRlL2lkZS1wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwpAQCAtMCwwICsxLDIzNSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisKK2ludCBnZW5lcmljX2lkZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YSwgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07CisJaWRlX3Rhc2tfdCBhcmdzOworCWludCByZXQ7CisKKwkvKiBjYWxsIEFDUEkgX0dUTSBvbmx5IG9uY2UgKi8KKwlpZiAoKGRyaXZlLT5kbiAmIDEpID09IDAgfHwgcGFpciA9PSBOVUxMKQorCQlpZGVfYWNwaV9nZXRfdGltaW5nKGh3aWYpOworCisJbWVtc2V0KCZycXBtLCAwLCBzaXplb2YocnFwbSkpOworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlycSA9IGJsa19nZXRfcmVxdWVzdChkcml2ZS0+cXVldWUsIFJFQUQsIF9fR0ZQX1dBSVQpOworCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX1BNX1NVU1BFTkQ7CisJcnEtPnNwZWNpYWwgPSAmYXJnczsKKwlycS0+ZGF0YSA9ICZycXBtOworCXJxcG0ucG1fc3RlcCA9IElERV9QTV9TVEFSVF9TVVNQRU5EOworCWlmIChtZXNnLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCisJCW1lc2cuZXZlbnQgPSBQTV9FVkVOVF9GUkVFWkU7CisJcnFwbS5wbV9zdGF0ZSA9IG1lc2cuZXZlbnQ7CisKKwlyZXQgPSBibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIE5VTEwsIHJxLCAwKTsKKwlibGtfcHV0X3JlcXVlc3QocnEpOworCisJLyogY2FsbCBBQ1BJIF9QUzMgb25seSBhZnRlciBib3RoIGRldmljZXMgYXJlIHN1c3BlbmRlZCAqLworCWlmIChyZXQgPT0gMCAmJiAoKGRyaXZlLT5kbiAmIDEpIHx8IHBhaXIgPT0gTlVMTCkpCisJCWlkZV9hY3BpX3NldF9zdGF0ZShod2lmLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBnZW5lcmljX2lkZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGEsICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOworCWlkZV90YXNrX3QgYXJnczsKKwlpbnQgZXJyOworCisJLyogY2FsbCBBQ1BJIF9QUzAgLyBfU1RNIG9ubHkgb25jZSAqLworCWlmICgoZHJpdmUtPmRuICYgMSkgPT0gMCB8fCBwYWlyID09IE5VTEwpIHsKKwkJaWRlX2FjcGlfc2V0X3N0YXRlKGh3aWYsIDEpOworCQlpZGVfYWNwaV9wdXNoX3RpbWluZyhod2lmKTsKKwl9CisKKwlpZGVfYWNwaV9leGVjX3Rmcyhkcml2ZSk7CisKKwltZW1zZXQoJnJxcG0sIDAsIHNpemVvZihycXBtKSk7CisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfUE1fUkVTVU1FOworCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1BSRUVNUFQ7CisJcnEtPnNwZWNpYWwgPSAmYXJnczsKKwlycS0+ZGF0YSA9ICZycXBtOworCXJxcG0ucG1fc3RlcCA9IElERV9QTV9TVEFSVF9SRVNVTUU7CisJcnFwbS5wbV9zdGF0ZSA9IFBNX0VWRU5UX09OOworCisJZXJyID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMSk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKworCWlmIChlcnIgPT0gMCAmJiBkZXYtPmRyaXZlcikgeworCQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJCWlmIChkcnYtPnJlc3VtZSkKKwkJCWRydi0+cmVzdW1lKGRyaXZlKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOworCisjaWZkZWYgREVCVUdfUE0KKwlwcmludGsoS0VSTl9JTkZPICIlczogY29tcGxldGVfcG93ZXJfc3RlcChzdGVwOiAlZClcbiIsCisJCWRyaXZlLT5uYW1lLCBwbS0+cG1fc3RlcCk7CisjZW5kaWYKKwlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHBtLT5wbV9zdGVwKSB7CisJY2FzZSBJREVfUE1fRkxVU0hfQ0FDSEU6CS8qIFN1c3BlbmQgc3RlcCAxIChmbHVzaCBjYWNoZSkgKi8KKwkJaWYgKHBtLT5wbV9zdGF0ZSA9PSBQTV9FVkVOVF9GUkVFWkUpCisJCQlwbS0+cG1fc3RlcCA9IElERV9QTV9DT01QTEVURUQ7CisJCWVsc2UKKwkJCXBtLT5wbV9zdGVwID0gSURFX1BNX1NUQU5EQlk7CisJCWJyZWFrOworCWNhc2UgSURFX1BNX1NUQU5EQlk6CQkvKiBTdXNwZW5kIHN0ZXAgMiAoc3RhbmRieSkgKi8KKwkJcG0tPnBtX3N0ZXAgPSBJREVfUE1fQ09NUExFVEVEOworCQlicmVhazsKKwljYXNlIElERV9QTV9SRVNUT1JFX1BJTzoJLyogUmVzdW1lIHN0ZXAgMSAocmVzdG9yZSBQSU8pICovCisJCXBtLT5wbV9zdGVwID0gSURFX1BNX0lETEU7CisJCWJyZWFrOworCWNhc2UgSURFX1BNX0lETEU6CQkvKiBSZXN1bWUgc3RlcCAyIChpZGxlKSovCisJCXBtLT5wbV9zdGVwID0gSURFX1BNX1JFU1RPUkVfRE1BOworCQlicmVhazsKKwl9Cit9CisKK2lkZV9zdGFydHN0b3BfdCBpZGVfc3RhcnRfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSAqcG0gPSBycS0+ZGF0YTsKKwlpZGVfdGFza190ICphcmdzID0gcnEtPnNwZWNpYWw7CisKKwltZW1zZXQoYXJncywgMCwgc2l6ZW9mKCphcmdzKSk7CisKKwlzd2l0Y2ggKHBtLT5wbV9zdGVwKSB7CisJY2FzZSBJREVfUE1fRkxVU0hfQ0FDSEU6CS8qIFN1c3BlbmQgc3RlcCAxIChmbHVzaCBjYWNoZSkgKi8KKwkJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJCWJyZWFrOworCQkvKiBOb3Qgc3VwcG9ydGVkPyBTd2l0Y2ggdG8gbmV4dCBzdGVwIG5vdy4gKi8KKwkJaWYgKGF0YV9pZF9mbHVzaF9lbmFibGVkKGRyaXZlLT5pZCkgPT0gMCB8fAorCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfV0NBQ0hFKSA9PSAwKSB7CisJCQlpZGVfY29tcGxldGVfcG93ZXJfc3RlcChkcml2ZSwgcnEpOworCQkJcmV0dXJuIGlkZV9zdG9wcGVkOworCQl9CisJCWlmIChhdGFfaWRfZmx1c2hfZXh0X2VuYWJsZWQoZHJpdmUtPmlkKSkKKwkJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIX0VYVDsKKwkJZWxzZQorCQkJYXJncy0+dGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CisJCWdvdG8gb3V0X2RvX3RmOworCWNhc2UgSURFX1BNX1NUQU5EQlk6CQkvKiBTdXNwZW5kIHN0ZXAgMiAoc3RhbmRieSkgKi8KKwkJYXJncy0+dGYuY29tbWFuZCA9IEFUQV9DTURfU1RBTkRCWU5PVzE7CisJCWdvdG8gb3V0X2RvX3RmOworCWNhc2UgSURFX1BNX1JFU1RPUkVfUElPOgkvKiBSZXN1bWUgc3RlcCAxIChyZXN0b3JlIFBJTykgKi8KKwkJaWRlX3NldF9tYXhfcGlvKGRyaXZlKTsKKwkJLyoKKwkJICogc2tpcCBJREVfUE1fSURMRSBmb3IgQVRBUEkgZGV2aWNlcworCQkgKi8KKwkJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKKwkJCXBtLT5wbV9zdGVwID0gSURFX1BNX1JFU1RPUkVfRE1BOworCQllbHNlCisJCQlpZGVfY29tcGxldGVfcG93ZXJfc3RlcChkcml2ZSwgcnEpOworCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CisJY2FzZSBJREVfUE1fSURMRToJCS8qIFJlc3VtZSBzdGVwIDIgKGlkbGUpICovCisJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0lETEVJTU1FRElBVEU7CisJCWdvdG8gb3V0X2RvX3RmOworCWNhc2UgSURFX1BNX1JFU1RPUkVfRE1BOgkvKiBSZXN1bWUgc3RlcCAzIChyZXN0b3JlIERNQSkgKi8KKwkJLyoKKwkJICogUmlnaHQgbm93LCBhbGwgd2UgZG8gaXMgY2FsbCBpZGVfc2V0X2RtYShkcml2ZSksCisJCSAqIHdlIGNvdWxkIGJlIHNtYXJ0ZXIgYW5kIGNoZWNrIGZvciBjdXJyZW50IHhmZXJfc3BlZWQKKwkJICogaW4gc3RydWN0IGRyaXZlIGV0Yy4uLgorCQkgKi8KKwkJaWYgKGRyaXZlLT5od2lmLT5kbWFfb3BzID09IE5VTEwpCisJCQlicmVhazsKKwkJLyoKKwkJICogVE9ETzogcmVzcGVjdCBJREVfREZMQUdfVVNJTkdfRE1BCisJCSAqLworCQlpZGVfc2V0X2RtYShkcml2ZSk7CisJCWJyZWFrOworCX0KKworCXBtLT5wbV9zdGVwID0gSURFX1BNX0NPTVBMRVRFRDsKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7CisKK291dF9kb190ZjoKKwlhcmdzLT50Zl9mbGFncwkgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOworCWFyZ3MtPmRhdGFfcGhhc2UgPSBUQVNLRklMRV9OT19EQVRBOworCXJldHVybiBkb19yd190YXNrZmlsZShkcml2ZSwgYXJncyk7Cit9CisKKy8qKgorICoJaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QgLSBlbmQgdGhlIGN1cnJlbnQgUG93ZXIgTWFuYWdlbWVudCByZXF1ZXN0CisgKglAZHJpdmU6IHRhcmdldCBkcml2ZQorICoJQHJxOiByZXF1ZXN0CisgKgorICoJVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIGN1cnJlbnQgUE0gcmVxdWVzdCBhbmQgc3RvcHMgdGhlIHF1ZXVlCisgKglpZiBuZWNlc3NhcnkuCisgKi8KK3ZvaWQgaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX1BNCisJcHJpbnRrKCIlczogY29tcGxldGluZyBQTSByZXF1ZXN0LCAlc1xuIiwgZHJpdmUtPm5hbWUsCisJICAgICAgIGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpID8gInN1c3BlbmQiIDogInJlc3VtZSIpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWlmIChibGtfcG1fc3VzcGVuZF9yZXF1ZXN0KHJxKSkgeworCQlibGtfc3RvcF9xdWV1ZShxKTsKKwl9IGVsc2UgeworCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfQkxPQ0tFRDsKKwkJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWRyaXZlLT5od2lmLT5od2dyb3VwLT5ycSA9IE5VTEw7CisKKwlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCAwKSkKKwkJQlVHKCk7Cit9CisKK3ZvaWQgaWRlX2NoZWNrX3BtX3N0YXRlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOworCisJaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpICYmCisJICAgIHBtLT5wbV9zdGVwID09IElERV9QTV9TVEFSVF9TVVNQRU5EKQorCQkvKiBNYXJrIGRyaXZlIGJsb2NrZWQgd2hlbiBzdGFydGluZyB0aGUgc3VzcGVuZCBzZXF1ZW5jZS4gKi8KKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfQkxPQ0tFRDsKKwllbHNlIGlmIChibGtfcG1fcmVzdW1lX3JlcXVlc3QocnEpICYmCisJCSBwbS0+cG1fc3RlcCA9PSBJREVfUE1fU1RBUlRfUkVTVU1FKSB7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBvbiB3YWtldXAgaXMgdG8gd2FpdCBmb3IgQlNZIGJpdCB0bworCQkgKiBnbyBhd2F5ICh3aXRoIGEgbG9vb25nIHRpbWVvdXQpIGFzIGEgZHJpdmUgb24gdGhpcyBod2lmIG1heQorCQkgKiBqdXN0IGJlIFBPU1RpbmcgaXRzZWxmLgorCQkgKiBXZSBkbyB0aGF0IGJlZm9yZSBldmVuIHNlbGVjdGluZyBhcyB0aGUgIm90aGVyIiBkZXZpY2Ugb24KKwkJICogdGhlIGJ1cyBtYXkgYmUgYnJva2VuIGVub3VnaCB0byB3YWxrIG9uIG91ciB0b2VzIGF0IHRoaXMKKwkJICogcG9pbnQuCisJCSAqLworCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJCWludCByYzsKKyNpZmRlZiBERUJVR19QTQorCQlwcmludGsoIiVzOiBXYWtldXAgcmVxdWVzdCBpbml0ZWQsIHdhaXRpbmcgZm9yICFCU1kuLi5cbiIsIGRyaXZlLT5uYW1lKTsKKyNlbmRpZgorCQlyYyA9IGlkZV93YWl0X25vdF9idXN5KGh3aWYsIDM1MDAwKTsKKwkJaWYgKHJjKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJ1cyBub3QgcmVhZHkgb24gd2FrZXVwXG4iLCBkcml2ZS0+bmFtZSk7CisJCVNFTEVDVF9EUklWRShkcml2ZSk7CisJCWh3aWYtPnRwX29wcy0+c2V0X2lycShod2lmLCAxKTsKKwkJcmMgPSBpZGVfd2FpdF9ub3RfYnVzeShod2lmLCAxMDAwMDApOworCQlpZiAocmMpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmUgbm90IHJlYWR5IG9uIHdha2V1cFxuIiwgZHJpdmUtPm5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKaW5kZXggYzU1YmRiZC4uYTY0ZWMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKQEAgLTExMCwyMCArMTEwLDIyIEBACiAgKglyZWFkIGFuZCBwYXJzZSB0aGUgcmVzdWx0cy4gVGhpcyBmdW5jdGlvbiBpcyBydW4gd2l0aAogICoJaW50ZXJydXB0cyBkaXNhYmxlZC4gCiAgKi8KLSAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCisKK3N0YXRpYyB2b2lkIGRvX2lkZW50aWZ5KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKIAl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWNoYXIgKm0gPSAoY2hhciAqKSZpZFtBVEFfSURfUFJPRF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgYnN3YXAgPSAxLCBpc19jZmE7CiAKKwkvKiBsb2NhbCBDUFUgb25seTsgc29tZSBzeXN0ZW1zIG5lZWQgdGhpcyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkvKiByZWFkIDUxMiBieXRlcyBvZiBpZCBpbmZvICovCiAJaHdpZi0+dHBfb3BzLT5pbnB1dF9kYXRhKGRyaXZlLCBOVUxMLCBpZCwgU0VDVE9SX1NJWkUpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0lEX1JFQUQ7Ci0KLQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAjaWZkZWYgREVCVUcKIAlwcmludGsoS0VSTl9JTkZPICIlczogZHVtcGluZyBpZGVudGlmeSBkYXRhXG4iLCBkcml2ZS0+bmFtZSk7CiAJaWRlX2R1bXBfaWRlbnRpZnkoKHU4ICopaWQpOwpAQCAtMzA2LDE3ICszMDgsMTIgQEAKIAlzID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmIChPS19TVEFUKHMsIEFUQV9EUlEsIEJBRF9SX1NUQVQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyogbG9jYWwgQ1BVIG9ubHk7IHNvbWUgc3lzdGVtcyBuZWVkIHRoaXMgKi8KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkvKiBkcml2ZSByZXR1cm5lZCBJRCAqLwogCQlkb19pZGVudGlmeShkcml2ZSwgY21kKTsKIAkJLyogZHJpdmUgcmVzcG9uZGVkIHdpdGggSUQgKi8KIAkJcmMgPSAwOwogCQkvKiBjbGVhciBkcml2ZSBJUlEgKi8KIAkJKHZvaWQpdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0gZWxzZSB7CiAJCS8qIGRyaXZlIHJlZnVzZWQgSUQgKi8KIAkJcmMgPSAyOwpAQCAtNTU0LDggKzU1MSw4IEBACiAgKgkJCTEgIGRldmljZSB3YXMgZm91bmQKICAqCQkJICAgKG5vdGU6IElERV9ERkxBR19QUkVTRU5UIG1pZ2h0IHN0aWxsIGJlIG5vdCBzZXQpCiAgKi8KLSAKLXN0YXRpYyBpbmxpbmUgdTggcHJvYmVfZm9yX2RyaXZlIChpZGVfZHJpdmVfdCAqZHJpdmUpCisKK3N0YXRpYyB1OCBwcm9iZV9mb3JfZHJpdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWNoYXIgKm07CiAKQEAgLTY0Miw3ICs2MzksNyBAQAogCWludCByZXQ7CiAKIAkvKiByZWdpc3RlciB3aXRoIGdsb2JhbCBkZXZpY2UgdHJlZSAqLwotCXN0cmxjcHkoaHdpZi0+Z2VuZGV2LmJ1c19pZCxod2lmLT5uYW1lLEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoJmh3aWYtPmdlbmRldiwgaHdpZi0+bmFtZSk7CiAJaHdpZi0+Z2VuZGV2LmRyaXZlcl9kYXRhID0gaHdpZjsKIAlpZiAoaHdpZi0+Z2VuZGV2LnBhcmVudCA9PSBOVUxMKSB7CiAJCWlmIChod2lmLT5kZXYpCkBAIC04NjQsMzEgKzg2MSw2IEBACiB9CiAKIC8qCi0gKiBzYXZlX21hdGNoKCkgaXMgdXNlZCB0byBzaW1wbGlmeSBsb2dpYyBpbiBpbml0X2lycSgpIGJlbG93LgotICoKLSAqIEEgbG9vcGhvbGUgaGVyZSBpcyB0aGF0IHdlIG1heSBub3Qga25vdyBhYm91dCBhIHBhcnRpY3VsYXIKLSAqIGh3aWYncyBpcnEgdW50aWwgYWZ0ZXIgdGhhdCBod2lmIGlzIGFjdHVhbGx5IHByb2JlZC9pbml0aWFsaXplZC4uCi0gKiBUaGlzIGNvdWxkIGJlIGEgcHJvYmxlbSBmb3IgdGhlIGNhc2Ugd2hlcmUgYW4gaHdpZiBpcyBvbiBhCi0gKiBkdWFsIGludGVyZmFjZSB0aGF0IHJlcXVpcmVzIHNlcmlhbGl6YXRpb24gKGVnLiBjbWQ2NDApIGFuZCBhbm90aGVyCi0gKiBod2lmIHVzaW5nIG9uZSBvZiB0aGUgc2FtZSBpcnFzIGlzIGluaXRpYWxpemVkIGJlZm9yZWhhbmQuCi0gKgotICogVGhpcyByb3V0aW5lIGRldGVjdHMgYW5kIHJlcG9ydHMgc3VjaCBzaXR1YXRpb25zLCBidXQgZG9lcyBub3QgZml4IHRoZW0uCi0gKi8KLXN0YXRpYyB2b2lkIHNhdmVfbWF0Y2goaWRlX2h3aWZfdCAqaHdpZiwgaWRlX2h3aWZfdCAqbmV3LCBpZGVfaHdpZl90ICoqbWF0Y2gpCi17Ci0JaWRlX2h3aWZfdCAqbSA9ICptYXRjaDsKLQotCWlmIChtICYmIG0tPmh3Z3JvdXAgJiYgbS0+aHdncm91cCAhPSBuZXctPmh3Z3JvdXApIHsKLQkJaWYgKCFuZXctPmh3Z3JvdXApCi0JCQlyZXR1cm47Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwb3RlbnRpYWwgSVJRIHByb2JsZW0gd2l0aCAlcyBhbmQgJXNcbiIsCi0JCQlod2lmLT5uYW1lLCBuZXctPm5hbWUsIG0tPm5hbWUpOwotCX0KLQlpZiAoIW0gfHwgbS0+aXJxICE9IGh3aWYtPmlycSkgLyogZG9uJ3QgdW5kbyBhIHByaW9yIHBlcmZlY3QgbWF0Y2ggKi8KLQkJKm1hdGNoID0gbmV3OwotfQotCi0vKgogICogaW5pdCByZXF1ZXN0IHF1ZXVlCiAgKi8KIHN0YXRpYyBpbnQgaWRlX2luaXRfcXVldWUoaWRlX2RyaXZlX3QgKmRyaXZlKQpAQCAtOTA2LDcgKzg3OCw4IEBACiAJICoJZG8gbm90LgogCSAqLwogCi0JcSA9IGJsa19pbml0X3F1ZXVlX25vZGUoZG9faWRlX3JlcXVlc3QsICZpZGVfbG9jaywgaHdpZl90b19ub2RlKGh3aWYpKTsKKwlxID0gYmxrX2luaXRfcXVldWVfbm9kZShkb19pZGVfcmVxdWVzdCwgJmh3aWYtPmh3Z3JvdXAtPmxvY2ssCisJCQkJaHdpZl90b19ub2RlKGh3aWYpKTsKIAlpZiAoIXEpCiAJCXJldHVybiAxOwogCkBAIC05NDcsNyArOTIwLDcgQEAKIHsKIAlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJaWYgKCFod2dyb3VwLT5kcml2ZSkgewogCQkvKiBmaXJzdCBkcml2ZSBmb3IgaHdncm91cC4gKi8KIAkJZHJpdmUtPm5leHQgPSBkcml2ZTsKQEAgLTk1Nyw3ICs5MzAsNyBAQAogCQlkcml2ZS0+bmV4dCA9IGh3Z3JvdXAtPmRyaXZlLT5uZXh0OwogCQlod2dyb3VwLT5kcml2ZS0+bmV4dCA9IGRyaXZlOwogCX0KLQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwogfQogCiAvKgpAQCAtMTAwMiw3ICs5NzUsNyBAQAogCiAJaWRlX3BvcnRzW2h3aWYtPmluZGV4XSA9IE5VTEw7CiAKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJLyoKIAkgKiBSZW1vdmUgdXMgZnJvbSB0aGUgaHdncm91cCwgYW5kIGZyZWUKIAkgKiB0aGUgaHdncm91cCBpZiB3ZSB3ZXJlIHRoZSBvbmx5IG1lbWJlcgpAQCAtMTAzMCw3ICsxMDAzLDcgQEAKIAkJfQogCQlCVUdfT04oaHdncm91cC0+aHdpZiA9PSBod2lmKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIH0KIAogLyoKQEAgLTEwNTEsMjcgKzEwMjQsMTMgQEAKIAltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7CiAJaHdpZi0+aHdncm91cCA9IE5VTEw7CiAKLQkvKgotCSAqIEdyb3VwIHVwIHdpdGggYW55IG90aGVyIGh3aWZzIHRoYXQgc2hhcmUgb3VyIGlycShzKS4KLQkgKi8KIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfSFdJRlM7IGluZGV4KyspIHsKIAkJaWRlX2h3aWZfdCAqaCA9IGlkZV9wb3J0c1tpbmRleF07CiAKIAkJaWYgKGggJiYgaC0+aHdncm91cCkgeyAgLyogc2NhbiBvbmx5IGluaXRpYWxpemVkIHBvcnRzICovCi0JCQlpZiAoaHdpZi0+aXJxID09IGgtPmlycSkgewotCQkJCWh3aWYtPnNoYXJpbmdfaXJxID0gaC0+c2hhcmluZ19pcnEgPSAxOwotCQkJCWlmIChod2lmLT5jaGlwc2V0ICE9IGlkZV9wY2kgfHwKLQkJCQkgICAgaC0+Y2hpcHNldCAhPSBpZGVfcGNpKSB7Ci0JCQkJCXNhdmVfbWF0Y2goaHdpZiwgaCwgJm1hdGNoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaHdpZi0+c2VyaWFsaXplZCkgewotCQkJCWlmIChod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmlycSA9PSBoLT5pcnEpCi0JCQkJCXNhdmVfbWF0Y2goaHdpZiwgaCwgJm1hdGNoKTsKLQkJCX0KLQkJCWlmIChoLT5zZXJpYWxpemVkKSB7Ci0JCQkJaWYgKGgtPm1hdGUgJiYgaHdpZi0+aXJxID09IGgtPm1hdGUtPmlycSkKLQkJCQkJc2F2ZV9tYXRjaChod2lmLCBoLCAmbWF0Y2gpOworCQkJaWYgKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7CisJCQkJaWYgKGh3aWYtPmhvc3QgPT0gaC0+aG9zdCkKKwkJCQkJbWF0Y2ggPSBoOwogCQkJfQogCQl9CiAJfQpAQCAtMTA5MiwxNyArMTA1MSwxOSBAQAogCQkgKiBsaW5rZWQgbGlzdCwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBod2lmIHRoYXQgb3ducwogCQkgKiBod2dyb3VwLT5oYW5kbGVyIC0gZG8gbm90IGNoYW5nZSB0aGF0LgogCQkgKi8KLQkJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAkJaHdpZi0+bmV4dCA9IGh3Z3JvdXAtPmh3aWYtPm5leHQ7CiAJCWh3Z3JvdXAtPmh3aWYtPm5leHQgPSBod2lmOwogCQlCVUdfT04oaHdpZi0+bmV4dCA9PSBod2lmKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJfSBlbHNlIHsKIAkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmh3Z3JvdXApLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCiAJCQkJICAgICAgIGh3aWZfdG9fbm9kZShod2lmKSk7CiAJCWlmIChod2dyb3VwID09IE5VTEwpCiAJCQlnb3RvIG91dF91cDsKIAorCQlzcGluX2xvY2tfaW5pdCgmaHdncm91cC0+bG9jayk7CisKIAkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7CiAJCWh3Z3JvdXAtPmh3aWYgPSBod2lmLT5uZXh0ID0gaHdpZjsKIApAQCAtMTEyMiw4ICsxMDgzLDcgQEAKIAkJc2EgPSBJUlFGX1NIQVJFRDsKICNlbmRpZiAvKiBfX21jNjgwMDBfXyAqLwogCi0JCWlmIChod2lmLT5jaGlwc2V0ID09IGlkZV9wY2kgfHwgaHdpZi0+Y2hpcHNldCA9PSBpZGVfY21kNjQ2IHx8Ci0JCSAgICBod2lmLT5jaGlwc2V0ID09IGlkZV9hbGkxNHh4KQorCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGNpKQogCQkJc2EgPSBJUlFGX1NIQVJFRDsKIAogCQlpZiAoaW9fcG9ydHMtPmN0bF9hZGRyKQpAQCAtMTE1MCw4ICsxMTEwLDcgQEAKIAkJaW9fcG9ydHMtPmRhdGFfYWRkciwgaHdpZi0+aXJxKTsKICNlbmRpZiAvKiBfX21jNjgwMDBfXyAqLwogCWlmIChtYXRjaCkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiICglc2VkIHdpdGggJXMpIiwKLQkJCWh3aWYtPnNoYXJpbmdfaXJxID8gInNoYXIiIDogInNlcmlhbGl6IiwgbWF0Y2gtPm5hbWUpOworCQlwcmludGsoS0VSTl9DT05UICIgKHNlcmlhbGl6ZWQgd2l0aCAlcykiLCBtYXRjaC0+bmFtZSk7CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwpAQCAtMTI2MywyMCArMTIyMiwyMSBAQAogc3RhdGljIHZvaWQgZHJpdmVfcmVsZWFzZV9kZXYgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBjb250YWluZXJfb2YoZGV2LCBpZGVfZHJpdmVfdCwgZ2VuZGV2KTsKKwlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CiAKIAlpZGVfcHJvY191bnJlZ2lzdGVyX2RldmljZShkcml2ZSk7CiAKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CiAJaWRlX3JlbW92ZV9kcml2ZV9mcm9tX2h3Z3JvdXAoZHJpdmUpOwogCWtmcmVlKGRyaXZlLT5pZCk7CiAJZHJpdmUtPmlkID0gTlVMTDsKIAlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfUFJFU0VOVDsKIAkvKiBNZXNzZWQgdXAgbG9ja2luZyAuLi4gKi8KLQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwogCWJsa19jbGVhbnVwX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwogCWRyaXZlLT5xdWV1ZSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAogCWNvbXBsZXRlKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKIH0KQEAgLTEzNTIsNyArMTMxMiw3IEBACiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJc25wcmludGYoZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXUuJXUiLCBod2lmLT5pbmRleCwgaSk7CisJCWRldl9zZXRfbmFtZShkZXYsICIldS4ldSIsIGh3aWYtPmluZGV4LCBpKTsKIAkJZGV2LT5wYXJlbnQgPSAmaHdpZi0+Z2VuZGV2OwogCQlkZXYtPmJ1cyA9ICZpZGVfYnVzX3R5cGU7CiAJCWRldi0+ZHJpdmVyX2RhdGEgPSBkcml2ZTsKQEAgLTE0MzYsMTMgKzEzOTYsMTEgQEAKIAl9CiAKIAlpZiAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB8fAotCSAgICAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFX0RNQSkgJiYgaHdpZi0+ZG1hX2Jhc2UpKSB7Ci0JCWlmIChod2lmLT5tYXRlKQotCQkJaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IGh3aWYtPnNlcmlhbGl6ZWQgPSAxOwotCX0KKwkgICAgKChkLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRV9ETUEpICYmIGh3aWYtPmRtYV9iYXNlKSkKKwkJaHdpZi0+aG9zdC0+aG9zdF9mbGFncyB8PSBJREVfSEZMQUdfU0VSSUFMSVpFOwogCi0JaWYgKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfUlFTSVpFXzI1NikKLQkJaHdpZi0+cnFzaXplID0gMjU2OworCWlmIChkLT5tYXhfc2VjdG9ycykKKwkJaHdpZi0+cnFzaXplID0gZC0+bWF4X3NlY3RvcnM7CiAKIAkvKiBjYWxsIGNoaXBzZXQgc3BlY2lmaWMgcm91dGluZSBmb3IgZWFjaCBlbmFibGVkIHBvcnQgKi8KIAlpZiAoZC0+aW5pdF9od2lmKQpAQCAtMTc5NCw1OSArMTc1MiwzIEBACiAJaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BvcnRfc2Nhbik7Ci0KLXN0YXRpYyB2b2lkIGlkZV9sZWdhY3lfaW5pdF9vbmUoaHdfcmVnc190ICoqaHdzLCBod19yZWdzX3QgKmh3LAotCQkJCXU4IHBvcnRfbm8sIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLAotCQkJCXVuc2lnbmVkIGxvbmcgY29uZmlnKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZSwgY3RsOwotCWludCBpcnE7Ci0KLQlpZiAocG9ydF9ubyA9PSAwKSB7Ci0JCWJhc2UgPSAweDFmMDsKLQkJY3RsICA9IDB4M2Y2OwotCQlpcnEgID0gMTQ7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IDB4MTcwOwotCQljdGwgID0gMHgzNzY7Ci0JCWlycSAgPSAxNTsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDgsIGQtPm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEkvTyByZXNvdXJjZSAweCVsWC0weCVsWCBub3QgZnJlZS5cbiIsCi0JCQkJZC0+bmFtZSwgYmFzZSwgYmFzZSArIDcpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihjdGwsIDEsIGQtPm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEkvTyByZXNvdXJjZSAweCVsWCBub3QgZnJlZS5cbiIsCi0JCQkJZC0+bmFtZSwgY3RsKTsKLQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgOCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZGVfc3RkX2luaXRfcG9ydHMoaHcsIGJhc2UsIGN0bCk7Ci0JaHctPmlycSA9IGlycTsKLQlody0+Y2hpcHNldCA9IGQtPmNoaXBzZXQ7Ci0JaHctPmNvbmZpZyA9IGNvbmZpZzsKLQotCWh3c1twb3J0X25vXSA9IGh3OwotfQotCi1pbnQgaWRlX2xlZ2FjeV9kZXZpY2VfYWRkKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLCB1bnNpZ25lZCBsb25nIGNvbmZpZykKLXsKLQlod19yZWdzX3QgaHdbMl0sICpod3NbXSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OwotCi0JbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7Ci0KLQlpZiAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfUURfMk5EX1BPUlQpID09IDApCi0JCWlkZV9sZWdhY3lfaW5pdF9vbmUoaHdzLCAmaHdbMF0sIDAsIGQsIGNvbmZpZyk7Ci0JaWRlX2xlZ2FjeV9pbml0X29uZShod3MsICZod1sxXSwgMSwgZCwgY29uZmlnKTsKLQotCWlmIChod3NbMF0gPT0gTlVMTCAmJiBod3NbMV0gPT0gTlVMTCAmJgotCSAgICAoZC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TSU5HTEUpKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCXJldHVybiBpZGVfaG9zdF9hZGQoZCwgaHdzLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9sZWdhY3lfZGV2aWNlX2FkZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2MuYwppbmRleCBmM2NkZGQxLi5hMTRlMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKQEAgLTQ2LDEwICs0Niw2IEBACiAJY2FzZSBpZGVfcWQ2NXh4OgluYW1lID0gInFkNjV4eCI7CWJyZWFrOwogCWNhc2UgaWRlX3VtYzg2NzI6CW5hbWUgPSAidW1jODY3MiI7CWJyZWFrOwogCWNhc2UgaWRlX2h0NjU2MGI6CW5hbWUgPSAiaHQ2NTYwYiI7CWJyZWFrOwotCWNhc2UgaWRlX3J6MTAwMDoJbmFtZSA9ICJyejEwMDAiOwlicmVhazsKLQljYXNlIGlkZV90cm0yOTA6CW5hbWUgPSAidHJtMjkwIjsJYnJlYWs7Ci0JY2FzZSBpZGVfY21kNjQ2OgluYW1lID0gImNtZDY0NiI7CWJyZWFrOwotCWNhc2UgaWRlX2N5ODJjNjkzOgluYW1lID0gImN5ODJjNjkzIjsJYnJlYWs7CiAJY2FzZSBpZGVfNGRyaXZlczoJbmFtZSA9ICI0ZHJpdmVzIjsJYnJlYWs7CiAJY2FzZSBpZGVfcG1hYzoJCW5hbWUgPSAibWFjLWlvIjsJYnJlYWs7CiAJY2FzZSBpZGVfYXUxeHh4OgluYW1lID0gImF1MXh4eCI7CWJyZWFrOwpAQCAtMTU1LDEzICsxNTEsOCBAQAogCWNvbnN0IHN0cnVjdCBpZGVfZGV2c2V0ICpkcyA9IHNldHRpbmctPnNldHRpbmc7CiAJaW50IHZhbCA9IC1FSU5WQUw7CiAKLQlpZiAoZHMtPmdldCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCWlmIChkcy0+Z2V0KQogCQl2YWwgPSBkcy0+Z2V0KGRyaXZlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQl9CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtNTgzLDMxICs1NzQsMTkgQEAKICAqCUNsZWFuIHVwIHRoZSBkcml2ZXIgc3BlY2lmaWMgL3Byb2MgZmlsZXMgYW5kIElERSBzZXR0aW5ncwogICoJZm9yIGEgZ2l2ZW4gZHJpdmUuCiAgKgotICoJVGFrZXMgaWRlX3NldHRpbmdfbXR4IGFuZCBpZGVfbG9jay4KLSAqCUNhbGxlciBtdXN0IGhvbGQgbm9uZSBvZiB0aGUgbG9ja3MuCisgKglUYWtlcyBpZGVfc2V0dGluZ19tdHguCiAgKi8KIAogdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlpZGVfcmVtb3ZlX3Byb2NfZW50cmllcyhkcml2ZS0+cHJvYywgZHJpdmVyLT5wcm9jX2VudHJpZXMoZHJpdmUpKTsKIAogCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CiAJLyoKLQkgKiBpZGVfc2V0dGluZ19tdHggcHJvdGVjdHMgdGhlIHNldHRpbmdzIGxpc3QKLQkgKiBpZGVfbG9jayBwcm90ZWN0cyB0aGUgdXNlIG9mIHNldHRpbmdzCi0JICoKLQkgKiBzbyB3ZSBuZWVkIHRvIGhvbGQgYm90aCwgaWRlX3NldHRpbmdzX3NlbSBiZWNhdXNlIHdlIHdhbnQgdG8KLQkgKiBtb2RpZnkgdGhlIHNldHRpbmdzIGxpc3QsIGFuZCBpZGVfbG9jayBiZWNhdXNlIHdlIGNhbm5vdCB0YWtlCi0JICogYSBzZXR0aW5nIG91dCB0aGF0IGlzIGJlaW5nIHVzZWQuCi0JICoKLQkgKiBPVE9IIGJvdGggaWRlX3tyZWFkLHdyaXRlfV9zZXR0aW5nIGFyZSBvbmx5IGV2ZXIgdXNlZCB1bmRlcgotCSAqIGlkZV9zZXR0aW5nX210eC4KKwkgKiBpZGVfc2V0dGluZ19tdHggcHJvdGVjdHMgYm90aCB0aGUgc2V0dGluZ3MgbGlzdCBhbmQgdGhlIHVzZQorCSAqIG9mIHNldHRpbmdzICh3ZSBjYW5ub3QgdGFrZSBhIHNldHRpbmcgb3V0IHRoYXQgaXMgYmVpbmcgdXNlZCkuCiAJICovCiAJZHJpdmUtPnNldHRpbmdzID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwogCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKIH0KIEVYUE9SVF9TWU1CT0woaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCAwNGY4ZjEzLi5mMGYwOWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUuYwpAQCAtNzQsOSArNzQsNiBAQAogCiBERUZJTkVfTVVURVgoaWRlX2NmZ19tdHgpOwogCi1fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soaWRlX2xvY2spOwotRVhQT1JUX1NZTUJPTChpZGVfbG9jayk7Ci0KIHN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKik7CiAKIC8qCkBAIC0xMzAsNyArMTI3LDYgQEAKIAl9CiB9CiAKLS8qIENhbGxlZCB3aXRoIGlkZV9sb2NrIGhlbGQuICovCiBzdGF0aWMgdm9pZCBfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewogCWludCBpOwpAQCAtMTM5LDEwICsxMzUsOCBAQAogCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwogCiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKLQkJCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOwogCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmRyaXZlLT5nZW5kZXYpOwogCQkJd2FpdF9mb3JfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7Ci0JCQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CiAJCX0KIAl9CiB9CkBAIC0xNTAsMTEgKzE0NCw5IEBACiB2b2lkIGlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewogCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CiAJX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJaHdpZi0+cHJlc2VudCA9IDA7CiAJaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMpOwpAQCAtMTkyLDEyICsxODQsMTAgQEAKIAogCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKIAotCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKIAlpZiAoaHdpZi0+cHJlc2VudCkgewogCQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKIAkJaHdpZi0+cHJlc2VudCA9IDA7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOwogCiAJaWRlX3Byb2NfdW5yZWdpc3Rlcl9wb3J0KGh3aWYpOwogCkBAIC0zNDAsNiArMzMwLDcgQEAKIHN0YXRpYyBpbnQgc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKIAogCWlmIChhcmcgPCAwIHx8IGFyZyA+IDI1NSkKQEAgLTM1NCw5ICszNDUsOSBAQAogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJLyogdGFrZSBsb2NrIGZvciBJREVfREZMQUdfW05PX11VTk1BU0svW05PX11JT18zMkJJVCAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CiAJCX0gZWxzZQogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKIAl9IGVsc2UgewpAQCAtMzk3LDgwICszODgsNiBAQAogaWRlX2V4dF9kZXZzZXRfcndfc3luYyh1c2luZ19kbWEsIHVzaW5nX2RtYSk7CiBfX0lERV9ERVZTRVQocGlvX21vZGUsIERTX1NZTkMsIE5VTEwsIHNldF9waW9fbW9kZSk7CiAKLXN0YXRpYyBpbnQgZ2VuZXJpY19pZGVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGEsICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOwotCWlkZV90YXNrX3QgYXJnczsKLQlpbnQgcmV0OwotCi0JLyogY2FsbCBBQ1BJIF9HVE0gb25seSBvbmNlICovCi0JaWYgKChkcml2ZS0+ZG4gJiAxKSA9PSAwIHx8IHBhaXIgPT0gTlVMTCkKLQkJaWRlX2FjcGlfZ2V0X3RpbWluZyhod2lmKTsKLQotCW1lbXNldCgmcnFwbSwgMCwgc2l6ZW9mKHJxcG0pKTsKLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0JcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9QTV9TVVNQRU5EOwotCXJxLT5zcGVjaWFsID0gJmFyZ3M7Ci0JcnEtPmRhdGEgPSAmcnFwbTsKLQlycXBtLnBtX3N0ZXAgPSBJREVfUE1fU1RBUlRfU1VTUEVORDsKLQlpZiAobWVzZy5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQotCQltZXNnLmV2ZW50ID0gUE1fRVZFTlRfRlJFRVpFOwotCXJxcG0ucG1fc3RhdGUgPSBtZXNnLmV2ZW50OwotCi0JcmV0ID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMCk7Ci0JYmxrX3B1dF9yZXF1ZXN0KHJxKTsKLQotCS8qIGNhbGwgQUNQSSBfUFMzIG9ubHkgYWZ0ZXIgYm90aCBkZXZpY2VzIGFyZSBzdXNwZW5kZWQgKi8KLQlpZiAocmV0ID09IDAgJiYgKChkcml2ZS0+ZG4gJiAxKSB8fCBwYWlyID09IE5VTEwpKQotCQlpZGVfYWNwaV9zZXRfc3RhdGUoaHdpZiwgMCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YSwgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxOwotCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07Ci0JaWRlX3Rhc2tfdCBhcmdzOwotCWludCBlcnI7Ci0KLQkvKiBjYWxsIEFDUEkgX1BTMCAvIF9TVE0gb25seSBvbmNlICovCi0JaWYgKChkcml2ZS0+ZG4gJiAxKSA9PSAwIHx8IHBhaXIgPT0gTlVMTCkgewotCQlpZGVfYWNwaV9zZXRfc3RhdGUoaHdpZiwgMSk7Ci0JCWlkZV9hY3BpX3B1c2hfdGltaW5nKGh3aWYpOwotCX0KLQotCWlkZV9hY3BpX2V4ZWNfdGZzKGRyaXZlKTsKLQotCW1lbXNldCgmcnFwbSwgMCwgc2l6ZW9mKHJxcG0pKTsKLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0JcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9QTV9SRVNVTUU7Ci0JcnEtPmNtZF9mbGFncyB8PSBSRVFfUFJFRU1QVDsKLQlycS0+c3BlY2lhbCA9ICZhcmdzOwotCXJxLT5kYXRhID0gJnJxcG07Ci0JcnFwbS5wbV9zdGVwID0gSURFX1BNX1NUQVJUX1JFU1VNRTsKLQlycXBtLnBtX3N0YXRlID0gUE1fRVZFTlRfT047Ci0KLQllcnIgPSBibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIE5VTEwsIHJxLCAxKTsKLQlibGtfcHV0X3JlcXVlc3QocnEpOwotCi0JaWYgKGVyciA9PSAwICYmIGRldi0+ZHJpdmVyKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQkJaWYgKGRydi0+cmVzdW1lKQotCQkJZHJ2LT5yZXN1bWUoZHJpdmUpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KIC8qKgogICogaWRlX2RldmljZV9nZXQJLQlnZXQgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gYSBpZGVfZHJpdmVfdAogICogQGRyaXZlOglkZXZpY2UgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGVfYXJtLmMgYi9kcml2ZXJzL2lkZS9pZGVfYXJtLmMKaW5kZXggZjcyOGYyOS4uYmRjYWM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlX2FybS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZV9hcm0uYwpAQCAtMTUsMTUgKzE1LDggQEAKIAogI2RlZmluZSBEUlZfTkFNRSAiaWRlX2FybSIKIAotI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCi0jIGluY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSMKLSMgZGVmaW5lIElERV9BUk1fSU8JKElTQVNMT1RfSU8gKyAweDFmMCkKLSMgZGVmaW5lIElERV9BUk1fSVJRCUlSUV9JU0FfMTQKLSNlbHNlCi0jIGRlZmluZSBJREVfQVJNX0lPCTB4MWYwCi0jIGRlZmluZSBJREVfQVJNX0lSUQlJUlFfSEFSRERJU0sKLSNlbmRpZgorI2RlZmluZSBJREVfQVJNX0lPCTB4MWYwCisjZGVmaW5lIElERV9BUk1fSVJRCUlSUV9IQVJERElTSwogCiBzdGF0aWMgaW50IF9faW5pdCBpZGVfYXJtX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKaW5kZXggNzk5NTU3Yy4uNjI0ZTYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMKQEAgLTM1MCwxNiArMzUwLDE3IEBACiAJLmRtYV90aW1lb3V0CQk9IHBkYzIwMnh4X2RtYV90aW1lb3V0LAogfTsKIAotI2RlZmluZSBERUNMQVJFX1BEQzIwMjZYX0RFVih1ZG1hLCBleHRyYV9mbGFncykgXAorI2RlZmluZSBERUNMQVJFX1BEQzIwMjZYX0RFVih1ZG1hLCBzZWN0b3JzKSBcCiAJeyBcCiAJCS5uYW1lCQk9IERSVl9OQU1FLCBcCiAJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfcGRjMjAyeHgsIFwKIAkJLnBvcnRfb3BzCT0gJnBkYzIwMjZ4X3BvcnRfb3BzLCBcCiAJCS5kbWFfb3BzCT0gJnBkYzIwMjZ4X2RtYV9vcHMsIFwKLQkJLmhvc3RfZmxhZ3MJPSBJREVfSEZMQUdTX1BEQzIwMlhYIHwgZXh0cmFfZmxhZ3MsIFwKKwkJLmhvc3RfZmxhZ3MJPSBJREVfSEZMQUdTX1BEQzIwMlhYLCBcCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LCBcCiAJCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwgXAogCQkudWRtYV9tYXNrCT0gdWRtYSwgXAorCQkubWF4X3NlY3RvcnMJPSBzZWN0b3JzLCBcCiAJfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gcGRjMjAyeHhfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0gewpAQCAtMzc2LDggKzM3Nyw4IEBACiAKIAkvKiAxOiBQREMyMDI2ezIsM30gKi8KIAlERUNMQVJFX1BEQzIwMjZYX0RFVihBVEFfVURNQTQsIDApLAotCS8qIDI6IFBEQzIwMjZ7NSw3fSAqLwotCURFQ0xBUkVfUERDMjAyNlhfREVWKEFUQV9VRE1BNSwgSURFX0hGTEFHX1JRU0laRV8yNTYpLAorCS8qIDI6IFBEQzIwMjZ7NSw3fTogVURNQTUsIGxpbWl0IExCQTQ4IHJlcXVlc3RzIHRvIDI1NiBzZWN0b3JzICovCisJREVDTEFSRV9QREMyMDI2WF9ERVYoQVRBX1VETUE1LCAyNTYpLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9yejEwMDAuYyBiL2RyaXZlcnMvaWRlL3J6MTAwMC5jCmluZGV4IDdkYWYwMTMuLmE2NDE0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3J6MTAwMC5jCisrKyBiL2RyaXZlcnMvaWRlL3J6MTAwMC5jCkBAIC0yMiwzNCArMjIsNDggQEAKIAogI2RlZmluZSBEUlZfTkFNRSAicnoxMDAwIgogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3J6MTAwMCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ6MTAwMF9kaXNhYmxlX3JlYWRhaGVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTE2IHJlZzsKIAogCWlmICghcGNpX3JlYWRfY29uZmlnX3dvcmQgKGRldiwgMHg0MCwgJnJlZykgJiYKIAkgICAgIXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NDAsIHJlZyAmIDB4ZGZmZikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRpc2FibGVkIGNoaXBzZXQgcmVhZC1haGVhZCAiCi0JCQkiKGJ1Z2d5IFJaMTAwMC9SWjEwMDEpXG4iLCBod2lmLT5uYW1lKTsKKwkJCSIoYnVnZ3kgUloxMDAwL1JaMTAwMSlcbiIsIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gMDsKIAl9IGVsc2UgewotCQlpZiAoaHdpZi0+bWF0ZSkKLQkJCWh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSBod2lmLT5zZXJpYWxpemVkID0gMTsKLQkJaHdpZi0+aG9zdF9mbGFncyB8PSBJREVfSEZMQUdfTk9fVU5NQVNLX0lSUVM7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXJpYWxpemVkLCBkaXNhYmxlZCB1bm1hc2tpbmcgIgotCQkJIihidWdneSBSWjEwMDAvUloxMDAxKVxuIiwgaHdpZi0+bmFtZSk7CisJCQkiKGJ1Z2d5IFJaMTAwMC9SWjEwMDEpXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuIDE7CiAJfQogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gcnoxMDAwX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZQkJPSBEUlZfTkFNRSwKLQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3J6MTAwMCwKLQkuY2hpcHNldAk9IGlkZV9yejEwMDAsCiAJLmhvc3RfZmxhZ3MJPSBJREVfSEZMQUdfTk9fRE1BLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgcnoxMDAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9pbml0X29uZShkZXYsICZyejEwMDBfY2hpcHNldCwgTlVMTCk7CisJc3RydWN0IGlkZV9wb3J0X2luZm8gZCA9IHJ6MTAwMF9jaGlwc2V0OworCWludCByYzsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChyejEwMDBfZGlzYWJsZV9yZWFkYWhlYWQoZGV2KSkgeworCQlkLmhvc3RfZmxhZ3MgfD0gSURFX0hGTEFHX1NFUklBTElaRTsKKwkJZC5ob3N0X2ZsYWdzIHw9IElERV9IRkxBR19OT19VTk1BU0tfSVJRUzsKKwl9CisKKwlyZXR1cm4gaWRlX3BjaV9pbml0X29uZShkZXYsICZkLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgcnoxMDAwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlkZV9wY2lfcmVtb3ZlKGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCByejEwMDBfcGNpX3RibFtdID0gewpAQCAtNjMsNyArNzcsNyBAQAogCS5uYW1lCQk9ICJSWjEwMDBfSURFIiwKIAkuaWRfdGFibGUJPSByejEwMDBfcGNpX3RibCwKIAkucHJvYmUJCT0gcnoxMDAwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnJlbW92ZQkJPSByejEwMDBfcmVtb3ZlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcnoxMDAwX2lkZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90cm0yOTAuYyBiL2RyaXZlcnMvaWRlL3RybTI5MC5jCmluZGV4IDc1ZWE2MTUuLjJhNWVhOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3RybTI5MC5jCisrKyBiL2RyaXZlcnMvaWRlL3RybTI5MC5jCkBAIC0zMjgsMTAgKzMyOCwxMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIHRybTI5MF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmluaXRfaHdpZgk9IGluaXRfaHdpZl90cm0yOTAsCi0JLmNoaXBzZXQJPSBpZGVfdHJtMjkwLAogCS5wb3J0X29wcwk9ICZ0cm0yOTBfcG9ydF9vcHMsCiAJLmRtYV9vcHMJPSAmdHJtMjkwX2RtYV9vcHMsCi0JLmhvc3RfZmxhZ3MJPSBJREVfSEZMQUdfTk9fQVRBUElfRE1BIHwKKwkuaG9zdF9mbGFncwk9IElERV9IRkxBR19UUk0yOTAgfAorCQkJICBJREVfSEZMQUdfTk9fQVRBUElfRE1BIHwKICNpZiAwIC8qIHBsYXkgaXQgc2FmZSBmb3Igbm93ICovCiAJCQkgIElERV9IRkxBR19UUlVTVF9CSU9TX0ZPUl9ETUEgfAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90eDQ5MzhpZGUuYyBiL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCmluZGV4IDkxMjAwNjMuLjEzYjYzZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAogCXdoaWxlIChjb3VudC0tKQogCQkqcHRyKysgPSBjcHVfdG9fbGUxNihfX3Jhd19yZWFkdygodm9pZCBfX2lvbWVtICopcG9ydCkpOwotCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylidWYsIGNvdW50ICogMik7CisJX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWJ1Ziwgcm91bmR1cChsZW4sIDIpKTsKIH0KIAogc3RhdGljIHZvaWQgdHg0OTM4aWRlX291dHB1dF9kYXRhX3N3YXAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJX19yYXdfd3JpdGV3KGxlMTZfdG9fY3B1KCpwdHIpLCAodm9pZCBfX2lvbWVtICopcG9ydCk7CiAJCXB0cisrOwogCX0KLQlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYnVmLCBjb3VudCAqIDIpOworCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylidWYsIHJvdW5kdXAobGVuLCAyKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyB0eDQ5MzhpZGVfdHBfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwppbmRleCBiYWZiN2QxLi45N2NkOWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYworKysgYi9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYwpAQCAtMjU5LDYgKzI1OSwxMiBAQAogCQkJYmNvdW50ID0gMHgxMDAwMCAtIChjdXJfYWRkciAmIDB4ZmZmZik7CiAJCQlpZiAoYmNvdW50ID4gY3VyX2xlbikKIAkJCQliY291bnQgPSBjdXJfbGVuOworCQkJLyoKKwkJCSAqIFRoaXMgd29ya2Fyb3VuZCBmb3IgemVybyBjb3VudCBzZWVtcyByZXF1aXJlZC4KKwkJCSAqIChzdGFuZGFyZCBpZGVfYnVpbGRfZG1hdGFibGUgZG8gaXQgdG9vKQorCQkJICovCisJCQlpZiAoKGJjb3VudCAmIDB4ZmZmZikgPT0gMHgwMDAwKQorCQkJCWJjb3VudCA9IDB4ODAwMDsKIAkJCSp0YWJsZSsrID0gYmNvdW50ICYgMHhmZmZmOwogCQkJKnRhYmxlKysgPSBjdXJfYWRkcjsKIAkJCWN1cl9hZGRyICs9IGJjb3VudDsKQEAgLTU1OCw3ICs1NjQsNyBAQAogCiAJd2hpbGUgKGNvdW50LS0pCiAJCSpwdHIrKyA9IGNwdV90b19sZTE2KF9fcmF3X3JlYWR3KCh2b2lkIF9faW9tZW0gKilwb3J0KSk7Ci0JX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWJ1ZiwgY291bnQgKiAyKTsKKwlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYnVmLCByb3VuZHVwKGxlbiwgMikpOwogfQogCiBzdGF0aWMgdm9pZCB0eDQ5MzlpZGVfb3V0cHV0X2RhdGFfc3dhcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKQEAgLTU3Miw3ICs1NzgsNyBAQAogCQlfX3Jhd193cml0ZXcobGUxNl90b19jcHUoKnB0ciksICh2b2lkIF9faW9tZW0gKilwb3J0KTsKIAkJcHRyKys7CiAJfQotCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylidWYsIGNvdW50ICogMik7CisJX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWJ1Ziwgcm91bmR1cChsZW4sIDIpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzIHR4NDkzOWlkZV90cF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS91bWM4NjcyLmMgYi9kcml2ZXJzL2lkZS91bWM4NjcyLmMKaW5kZXggMWRhMDc2ZS4uZTI5OTc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdW1jODY3Mi5jCisrKyBiL2RyaXZlcnMvaWRlL3VtYzg2NzIuYwpAQCAtMTA3LDE4ICsxMDcsMjEgQEAKIHN0YXRpYyB2b2lkIHVtY19zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWRlX2h3Z3JvdXBfdCAqbWF0ZV9od2dyb3VwID0gaHdpZi0+bWF0ZSA/IGh3aWYtPm1hdGUtPmh3Z3JvdXAgOiBOVUxMOworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCiAJcHJpbnRrKCIlczogc2V0dGluZyB1bWM4NjcyIHRvIFBJTyBtb2RlJWQgKHNwZWVkICVkKVxuIiwKIAkJZHJpdmUtPm5hbWUsIHBpbywgcGlvX3RvX3VtY1twaW9dKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQlpZiAoaHdpZi0+bWF0ZSAmJiBod2lmLT5tYXRlLT5od2dyb3VwLT5oYW5kbGVyKSB7CisJaWYgKG1hdGVfaHdncm91cCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hdGVfaHdncm91cC0+bG9jaywgZmxhZ3MpOworCWlmIChtYXRlX2h3Z3JvdXAgJiYgbWF0ZV9od2dyb3VwLT5oYW5kbGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW1jODY3Mjogb3RoZXIgaW50ZXJmYWNlIGlzIGJ1c3k6IGV4aXRpbmcgdHVuZV91bWMoKVxuIik7CiAJfSBlbHNlIHsKIAkJY3VycmVudF9zcGVlZHNbZHJpdmUtPm5hbWVbMl0gLSAnYSddID0gcGlvX3RvX3VtY1twaW9dOwogCQl1bWNfc2V0X3NwZWVkcyhjdXJyZW50X3NwZWVkcyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJaWYgKG1hdGVfaHdncm91cCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWF0ZV9od2dyb3VwLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHVtYzg2NzJfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCmluZGV4IGE1ZGM3OGEuLmRkMGRiNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnCkBAIC0zNyw2ICszNyw3IEBACiBjb25maWcgSU5GSU5JQkFORF9BRERSX1RSQU5TCiAJYm9vbAogCWRlcGVuZHMgb24gSU5FVAorCWRlcGVuZHMgb24gIShJTkZJTklCQU5EID0geSAmJiBJUFY2ID0gbSkKIAlkZWZhdWx0IHkKIAogc291cmNlICJkcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwppbmRleCBkOThiMDViLi5jZTUxMWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCkBAIC0xMjgsNiArMTI4LDggQEAKIAkJcmV0ID0gcmRtYV9jb3B5X2FkZHIoZGV2X2FkZHIsIGRldiwgTlVMTCk7CiAJCWRldl9wdXQoZGV2KTsKIAkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIAljYXNlIEFGX0lORVQ2OgogCQlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpIHsKIAkJCWlmIChpcHY2X2Noa19hZGRyKCZpbml0X25ldCwKQEAgLTEzOCw4ICsxNDAsNyBAQAogCQkJfQogCQl9CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworI2VuZGlmCiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xNzksMTAgKzE4MCwxMSBAQAogewogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aSBmbDsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YgZmwpOwotCWlmIChkc3RfaW4tPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSAgeworCisJc3dpdGNoIChkc3RfaW4tPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKIAkJZmwubmxfdS5pcDRfdS5kYWRkciA9CiAJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBkc3RfaW4pLT5zaW5fYWRkci5zX2FkZHI7CiAKQEAgLTE5MSw4ICsxOTMsMTMgQEAKIAogCQluZWlnaF9ldmVudF9zZW5kKHJ0LT51LmRzdC5uZWlnaGJvdXIsIE5VTEwpOwogCQlpcF9ydF9wdXQocnQpOworCQlicmVhazsKIAotCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwl7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwogCQlmbC5ubF91LmlwNl91LmRhZGRyID0KIAkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKSBkc3RfaW4pLT5zaW42X2FkZHI7CiAKQEAgLTIwMiw2ICsyMDksOSBAQAogCiAJCW5laWdoX2V2ZW50X3NlbmQoZHN0LT5uZWlnaGJvdXIsIE5VTEwpOwogCQlkc3RfcmVsZWFzZShkc3QpOworCQlicmVhazsKKwl9CisjZW5kaWYKIAl9CiB9CiAKQEAgLTI1NCw2ICsyNjQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIHN0YXRpYyBpbnQgYWRkcjZfcmVzb2x2ZV9yZW1vdGUoc3RydWN0IHNvY2thZGRyX2luNiAqc3JjX2luLAogCQkJICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmRzdF9pbiwKIAkJCSAgICAgICBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqYWRkcikKQEAgLTI4Miw2ICsyOTMsMTQgQEAKIAlkc3RfcmVsZWFzZShkc3QpOwogCXJldHVybiByZXQ7CiB9CisjZWxzZQorc3RhdGljIGludCBhZGRyNl9yZXNvbHZlX3JlbW90ZShzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzcmNfaW4sCisJCQkgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqZHN0X2luLAorCQkJICAgICAgIHN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyKQoreworCXJldHVybiAtRUFERFJOT1RBVkFJTDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IGFkZHJfcmVzb2x2ZV9yZW1vdGUoc3RydWN0IHNvY2thZGRyICpzcmNfaW4sCiAJCQkJc3RydWN0IHNvY2thZGRyICpkc3RfaW4sCkBAIC0zNDAsNyArMzU5LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCByZXQ7CiAKLQlpZiAoZHN0X2luLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCXN3aXRjaCAoZHN0X2luLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJewogCQlfX2JlMzIgc3JjX2lwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc3JjX2luKS0+c2luX2FkZHIuc19hZGRyOwogCQlfX2JlMzIgZHN0X2lwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgZHN0X2luKS0+c2luX2FkZHIuc19hZGRyOwogCkBAIC0zNjIsNyArMzgzLDEyIEBACiAJCQkJbWVtY3B5KGFkZHItPmRzdF9kZXZfYWRkciwgZGV2LT5kZXZfYWRkciwgTUFYX0FERFJfTEVOKTsKIAkJfQogCQlkZXZfcHV0KGRldik7Ci0JfSBlbHNlIHsKKwkJYnJlYWs7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwl7CiAJCXN0cnVjdCBpbjZfYWRkciAqYTsKIAogCQlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpCkBAIC0zOTAsNiArNDE2LDEzIEBACiAJCQlpZiAoIXJldCkKIAkJCQltZW1jcHkoYWRkci0+ZHN0X2Rldl9hZGRyLCBkZXYtPmRldl9hZGRyLCBNQVhfQUREUl9MRU4pOwogCQl9CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVBRERSTk9UQVZBSUw7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCA4NDE1ZWNjLi5hM2M1YWYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCkBAIC02OTksNyArNjk5LDcgQEAKIAkJfQogCiAJCXdjLT5zbGlkCSAgID0gYmUxNl90b19jcHUoY3FlLT5ybGlkKTsKLQkJd2MtPnNsCQkgICA9IGJlMTZfdG9fY3B1KGNxZS0+c2xfdmlkID4+IDEyKTsKKwkJd2MtPnNsCQkgICA9IGJlMTZfdG9fY3B1KGNxZS0+c2xfdmlkKSA+PiAxMjsKIAkJZ19tbHBhdGhfcnFwbgkgICA9IGJlMzJfdG9fY3B1KGNxZS0+Z19tbHBhdGhfcnFwbik7CiAJCXdjLT5zcmNfcXAJICAgPSBnX21scGF0aF9ycXBuICYgMHhmZmZmZmY7CiAJCXdjLT5kbGlkX3BhdGhfYml0cyA9IChnX21scGF0aF9ycXBuID4+IDI0KSAmIDB4N2Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwppbmRleCAxZTViNjQ0Li4xMjg3NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKQEAgLTExOSw2ICsxMTksMTQgQEAKIAlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgcmMpOwogfQogCitzdGF0aWMgaW50IGlzY3NpX2lzZXJfcGR1X2FsbG9jKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCB1aW50OF90IG9wY29kZSkKK3sKKwlzdHJ1Y3QgaXNjc2lfaXNlcl90YXNrICppc2VyX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCisJdGFzay0+aGRyID0gKHN0cnVjdCBpc2NzaV9oZHIgKikmaXNlcl90YXNrLT5kZXNjLmlzY3NpX2hlYWRlcjsKKwl0YXNrLT5oZHJfbWF4ID0gc2l6ZW9mKGlzZXJfdGFzay0+ZGVzYy5pc2NzaV9oZWFkZXIpOworCXJldHVybiAwOworfQogCiAvKioKICAqIGlzY3NpX2lzZXJfdGFza19pbml0IC0gSW5pdGlhbGl6ZSB0YXNrCkBAIC0xODAsMjUgKzE4OCwyNiBAQAogaXNjc2lfaXNlcl90YXNrX3htaXRfdW5zb2xfZGF0YShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKIAkJCQkgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IGlzY3NpX2RhdGEgIGhkcjsKKwlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydCA9ICZ0YXNrLT51bnNvbF9yMnQ7CisJc3RydWN0IGlzY3NpX2RhdGEgaGRyOwogCWludCBlcnJvciA9IDA7CiAKIAkvKiBTZW5kIGRhdGEtb3V0IFBEVXMgd2hpbGUgdGhlcmUncyBzdGlsbCB1bnNvbGljaXRlZCBkYXRhIHRvIHNlbmQgKi8KLQl3aGlsZSAodGFzay0+dW5zb2xfY291bnQgPiAwKSB7Ci0JCWlzY3NpX3ByZXBfdW5zb2xpY2l0X2RhdGFfcGR1KHRhc2ssICZoZHIpOworCXdoaWxlIChpc2NzaV90YXNrX2hhc191bnNvbF9kYXRhKHRhc2spKSB7CisJCWlzY3NpX3ByZXBfZGF0YV9vdXRfcGR1KHRhc2ssIHIydCwgJmhkcik7CiAJCWRlYnVnX3Njc2koIlNlbmRpbmcgZGF0YS1vdXQ6IGl0dCAweCV4LCBkYXRhIGNvdW50ICVkXG4iLAotCQkJICAgaGRyLml0dCwgdGFzay0+ZGF0YV9jb3VudCk7CisJCQkgICBoZHIuaXR0LCByMnQtPmRhdGFfY291bnQpOwogCiAJCS8qIHRoZSBidWZmZXIgZGVzY3JpcHRpb24gaGFzIGJlZW4gcGFzc2VkIHdpdGggdGhlIGNvbW1hbmQgKi8KIAkJLyogU2VuZCB0aGUgY29tbWFuZCAqLwogCQllcnJvciA9IGlzZXJfc2VuZF9kYXRhX291dChjb25uLCB0YXNrLCAmaGRyKTsKIAkJaWYgKGVycm9yKSB7Ci0JCQl0YXNrLT51bnNvbF9kYXRhc24tLTsKKwkJCXIydC0+ZGF0YXNuLS07CiAJCQlnb3RvIGlzY3NpX2lzZXJfdGFza194bWl0X3Vuc29sX2RhdGFfZXhpdDsKIAkJfQotCQl0YXNrLT51bnNvbF9jb3VudCAtPSB0YXNrLT5kYXRhX2NvdW50OworCQlyMnQtPnNlbnQgKz0gcjJ0LT5kYXRhX2NvdW50OwogCQlkZWJ1Z19zY3NpKCJOZWVkIHRvIHNlbmQgJWQgbW9yZSBhcyBkYXRhLW91dCBQRFVzXG4iLAotCQkJICAgdGFzay0+dW5zb2xfY291bnQpOworCQkJICAgcjJ0LT5kYXRhX2xlbmd0aCAtIHIydC0+c2VudCk7CiAJfQogCiBpc2NzaV9pc2VyX3Rhc2tfeG1pdF91bnNvbF9kYXRhX2V4aXQ6CkBAIC0yMjAsNyArMjI5LDcgQEAKIAogCQlkZWJ1Z19zY3NpKCJjbWQgW2l0dCAleCB0b3RhbCAlZCBpbW0gJWQgdW5zb2xfZGF0YSAlZFxuIiwKIAkJCSAgIHRhc2stPml0dCwgc2NzaV9idWZmbGVuKHRhc2stPnNjKSwKLQkJCSAgIHRhc2stPmltbV9jb3VudCwgdGFzay0+dW5zb2xfY291bnQpOworCQkJICAgdGFzay0+aW1tX2NvdW50LCB0YXNrLT51bnNvbF9yMnQuZGF0YV9sZW5ndGgpOwogCX0KIAogCWRlYnVnX3Njc2koInRhc2sgZGVxIFtjaWQgJWQgaXR0IDB4JXhdXG4iLApAQCAtMjM1LDcgKzI0NCw3IEBACiAJfQogCiAJLyogU2VuZCB1bnNvbGljaXRlZCBkYXRhLW91dCBQRFUocykgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKHRhc2stPnVuc29sX2NvdW50KQorCWlmIChpc2NzaV90YXNrX2hhc191bnNvbF9kYXRhKHRhc2spKQogCQllcnJvciA9IGlzY3NpX2lzZXJfdGFza194bWl0X3Vuc29sX2RhdGEoY29ubiwgdGFzayk7CiAKICBpc2NzaV9pc2VyX3Rhc2tfeG1pdF9leGl0OgpAQCAtMjQ0LDEzICsyNTMsMTUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB2b2lkCi1pc2NzaV9pc2VyX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCitzdGF0aWMgdm9pZCBpc2NzaV9pc2VyX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgaXNjc2lfaXNlcl90YXNrICppc2VyX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwogCi0JLyogbWdtdCB0YXNrcyBkbyBub3QgbmVlZCBzcGVjaWFsIGNsZWFudXAgKi8KLQlpZiAoIXRhc2stPnNjKQorCS8qCisJICogbWdtdCB0YXNrcyBkbyBub3QgbmVlZCBzcGVjaWFsIGNsZWFudXAgYW5kIHdlIGRvIG5vdAorCSAqIGFsbG9jYXRlIGFueXRoaW5nIGluIHRoZSBpbml0IHRhc2sgY2FsbG91dAorCSAqLworCWlmICghdGFzay0+c2MgfHwgdGFzay0+c3RhdGUgPT0gSVNDU0lfVEFTS19QRU5ESU5HKQogCQlyZXR1cm47CiAKIAlpZiAoaXNlcl90YXNrLT5zdGF0dXMgPT0gSVNFUl9UQVNLX1NUQVRVU19TVEFSVEVEKSB7CkBAIC0zOTEsOSArNDAyLDYgQEAKIAlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uOwogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwotCWludCBpOwotCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOwotCXN0cnVjdCBpc2NzaV9pc2VyX3Rhc2sgKmlzZXJfdGFzazsKIAlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uOwogCiAJc2hvc3QgPSBpc2NzaV9ob3N0X2FsbG9jKCZpc2NzaV9pc2VyX3NodCwgMCwgSVNDU0lfTUFYX0NNRF9QRVJfTFVOKTsKQEAgLTQzMCwxMyArNDM4LDYgQEAKIAlzZXNzaW9uID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CiAKIAlzaG9zdC0+Y2FuX3F1ZXVlID0gc2Vzc2lvbi0+c2NzaV9jbWRzX21heDsKLQkvKiBsaWJpc2NzaSBzZXR1cCBpdHRzLCBkYXRhIGFuZCBwb29sIHNvIGp1c3Qgc2V0IGRlc2MgZmllbGRzICovCi0JZm9yIChpID0gMDsgaSA8IHNlc3Npb24tPmNtZHNfbWF4OyBpKyspIHsKLQkJdGFzayA9IHNlc3Npb24tPmNtZHNbaV07Ci0JCWlzZXJfdGFzayA9IHRhc2stPmRkX2RhdGE7Ci0JCXRhc2stPmhkciA9IChzdHJ1Y3QgaXNjc2lfY21kICopJmlzZXJfdGFzay0+ZGVzYy5pc2NzaV9oZWFkZXI7Ci0JCXRhc2stPmhkcl9tYXggPSBzaXplb2YoaXNlcl90YXNrLT5kZXNjLmlzY3NpX2hlYWRlcik7Ci0JfQogCXJldHVybiBjbHNfc2Vzc2lvbjsKIAogcmVtb3ZlX2hvc3Q6CkBAIC02NTIsNiArNjUzLDcgQEAKIAkuaW5pdF90YXNrCQk9IGlzY3NpX2lzZXJfdGFza19pbml0LAogCS54bWl0X3Rhc2sJCT0gaXNjc2lfaXNlcl90YXNrX3htaXQsCiAJLmNsZWFudXBfdGFzawkJPSBpc2NzaV9pc2VyX2NsZWFudXBfdGFzaywKKwkuYWxsb2NfcGR1CQk9IGlzY3NpX2lzZXJfcGR1X2FsbG9jLAogCS8qIHJlY292ZXJ5ICovCiAJLnNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQgPSBpc2NzaV9zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCmluZGV4IGVkMWFmZjIuLmUyMDljYjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYwpAQCAtMzUzLDggKzM1Myw3IEBACiAJdW5zaWduZWQgbG9uZyBlZHRsOwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhX2J1ZjsKLQotCXN0cnVjdCBpc2NzaV9jbWQgKmhkciA9ICB0YXNrLT5oZHI7CisJc3RydWN0IGlzY3NpX2NtZCAqaGRyID0gIChzdHJ1Y3QgaXNjc2lfY21kICopdGFzay0+aGRyOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjICA9ICB0YXNrLT5zYzsKIAogCWlmICghaXNlcl9jb25uX3N0YXRlX2NvbXAoaXNlcl9jb25uLT5pYl9jb25uLCBJU0VSX0NPTk5fVVApKSB7CkBAIC0zOTMsNyArMzkyLDcgQEAKIAkJZXJyID0gaXNlcl9wcmVwYXJlX3dyaXRlX2NtZCh0YXNrLAogCQkJCQkgICAgIHRhc2stPmltbV9jb3VudCwKIAkJCQkgICAgICAgICAgICAgdGFzay0+aW1tX2NvdW50ICsKLQkJCQkJICAgICB0YXNrLT51bnNvbF9jb3VudCwKKwkJCQkJICAgICB0YXNrLT51bnNvbF9yMnQuZGF0YV9sZW5ndGgsCiAJCQkJCSAgICAgZWR0bCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIHNlbmRfY29tbWFuZF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwppbmRleCA2OWU2NzRlLi5kYjIyZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2twLT5yb3dzOyBpKyspCi0JCQlkaXNhYmxlX2lycShPTUFQX0dQSU9fSVJRKHJvd19ncGlvc1tpXSkpOworCQkJZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEocm93X2dwaW9zW2ldKSk7CiAJfSBlbHNlCiAJCS8qIGRpc2FibGUga2V5Ym9hcmQgaW50ZXJydXB0IGFuZCBzY2hlZHVsZSBmb3IgaGFuZGxpbmcgKi8KIAkJb21hcF93cml0ZXcoMSwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19LQkRfTUFTS0lUKTsKQEAgLTIyNCw3ICsyMjQsNyBAQAogCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJCWludCBpOwogCQkJZm9yIChpID0gMDsgaSA8IG9tYXBfa3BfZGF0YS0+cm93czsgaSsrKQotCQkJCWVuYWJsZV9pcnEoT01BUF9HUElPX0lSUShyb3dfZ3Bpb3NbaV0pKTsKKwkJCQllbmFibGVfaXJxKGdwaW9fdG9faXJxKHJvd19ncGlvc1tpXSkpOwogCQl9IGVsc2UgewogCQkJb21hcF93cml0ZXcoMCwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19LQkRfTUFTS0lUKTsKIAkJCWtwX2N1cl9ncm91cCA9IC0xOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCW9tYXBfd3JpdGV3KDAsIE9NQVBfTVBVSU9fQkFTRSArIE9NQVBfTVBVSU9fS0JEX01BU0tJVCk7CiAJfSBlbHNlIHsKIAkJZm9yIChpcnFfaWR4ID0gMDsgaXJxX2lkeCA8IG9tYXBfa3AtPnJvd3M7IGlycV9pZHgrKykgewotCQkJaWYgKHJlcXVlc3RfaXJxKE9NQVBfR1BJT19JUlEocm93X2dwaW9zW2lycV9pZHhdKSwKKwkJCWlmIChyZXF1ZXN0X2lycShncGlvX3RvX2lycShyb3dfZ3Bpb3NbaXJxX2lkeF0pLAogCQkJCQlvbWFwX2twX2ludGVycnVwdCwKIAkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkJCSJvbWFwLWtleXBhZCIsIG9tYXBfa3ApIDwgMCkKQEAgLTQzOCw3ICs0MzgsNyBAQAogCQkJZ3Bpb19mcmVlKGNvbF9ncGlvc1tpXSk7CiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2twLT5yb3dzOyBpKyspIHsKIAkJCWdwaW9fZnJlZShyb3dfZ3Bpb3NbaV0pOwotCQkJZnJlZV9pcnEoT01BUF9HUElPX0lSUShyb3dfZ3Bpb3NbaV0pLCAwKTsKKwkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHJvd19ncGlvc1tpXSksIDApOwogCQl9CiAJfSBlbHNlIHsKIAkJb21hcF93cml0ZXcoMSwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19LQkRfTUFTS0lUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKaW5kZXggNmQzMGM2ZC4uMGQyZmM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5cGFkLmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQlnb3RvIGZhaWxlZF9mcmVlX21lbTsKIAl9CiAKLQlrZXlwYWQtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIktCRENMSyIpOworCWtleXBhZC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGtleXBhZC0+Y2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGtleXBhZCBjbG9ja1xuIik7CiAJCWVycm9yID0gUFRSX0VSUihrZXlwYWQtPmNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKaW5kZXggMjdkNzBkMy4uZGEzYzNhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZwpAQCAtNzksNyArNzksNyBAQAogCiBjb25maWcgU0VSSU9fUlBDS0JECiAJdHJpc3RhdGUgIkFjb3JuIFJpc2NQQyBrZXlib2FyZCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gQVJDSF9BQ09STiB8fCBBUkNIX0NMUFM3NTAwCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGUgQWNvcm4gUmlzY1BDIGFuZCB3YW50IHRvIHVzZSBhbiBBVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwppbmRleCBiOWI3ZmM2Li5lMWVjZTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJc3RydWN0IGFkczc4NDYJKnRzID0gY29udGFpbmVyX29mKGhhbmRsZSwgc3RydWN0IGFkczc4NDYsIHRpbWVyKTsKIAlpbnQJCXN0YXR1cyA9IDA7CiAKLQlzcGluX2xvY2tfaXJxKCZ0cy0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cy0+bG9jayk7CiAKIAlpZiAodW5saWtlbHkoIWdldF9wZW5kb3duX3N0YXRlKHRzKSB8fAogCQkgICAgIGRldmljZV9zdXNwZW5kZWQoJnRzLT5zcGktPmRldikpKSB7CkBAIC03MjgsNyArNzI4LDcgQEAKIAkJCWRldl9lcnIoJnRzLT5zcGktPmRldiwgInNwaV9hc3luYyAtLT4gJWRcbiIsIHN0YXR1cyk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxKCZ0cy0+bG9jayk7CisJc3Bpbl91bmxvY2soJnRzLT5sb2NrKTsKIAlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWFpbnN0b25lLXdtOTd4eC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMKaW5kZXggYmE2NDg3NS4uMWQxMWUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtYWM5Ny5oPgogCiAjZGVmaW5lIFZFUlNJT04JCSIwLjEzIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZy5oIGIvZHJpdmVycy9sZ3Vlc3QvbGcuaAppbmRleCA1ZmFlZmVhLi5mMmM2NDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9sZy5oCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xnLmgKQEAgLTE2NCw3ICsxNjQsNyBAQAogdm9pZCBjb3B5X2dkdF90bHMoY29uc3Qgc3RydWN0IGxnX2NwdSAqY3B1LCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCk7CiAKIC8qIHBhZ2VfdGFibGVzLmM6ICovCi1pbnQgaW5pdF9ndWVzdF9wYWdldGFibGUoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIGxvbmcgcGd0YWJsZSk7CitpbnQgaW5pdF9ndWVzdF9wYWdldGFibGUoc3RydWN0IGxndWVzdCAqbGcpOwogdm9pZCBmcmVlX2d1ZXN0X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZyk7CiB2b2lkIGd1ZXN0X25ld19wYWdldGFibGUoc3RydWN0IGxnX2NwdSAqY3B1LCB1bnNpZ25lZCBsb25nIHBndGFibGUpOwogdm9pZCBndWVzdF9zZXRfcG1kKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBsb25nIGdwZ2RpciwgdTMyIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCmluZGV4IGE2NjFiYmQuLjkxNWRhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgcGFnZXMgdGhlIHJpbmcgd2lsbCB0YWtlLCBhbmQgbWFwIHRoYXQgbWVtb3J5ICovCiAJbHZxLT5wYWdlcyA9IGxndWVzdF9tYXAoKHVuc2lnbmVkIGxvbmcpbHZxLT5jb25maWcucGZuIDw8IFBBR0VfU0hJRlQsCiAJCQkJRElWX1JPVU5EX1VQKHZyaW5nX3NpemUobHZxLT5jb25maWcubnVtLAotCQkJCQkJCVBBR0VfU0laRSksCisJCQkJCQkJTEdVRVNUX1ZSSU5HX0FMSUdOKSwKIAkJCQkJICAgICBQQUdFX1NJWkUpKTsKIAlpZiAoIWx2cS0+cGFnZXMpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTI1OSw4ICsyNTksOCBAQAogCiAJLyogT0ssIHRlbGwgdmlydGlvX3JpbmcuYyB0byBzZXQgdXAgYSB2aXJ0cXVldWUgbm93IHdlIGtub3cgaXRzIHNpemUKIAkgKiBhbmQgd2UndmUgZ290IGEgcG9pbnRlciB0byBpdHMgcGFnZXMuICovCi0JdnEgPSB2cmluZ19uZXdfdmlydHF1ZXVlKGx2cS0+Y29uZmlnLm51bSwgdmRldiwgbHZxLT5wYWdlcywKLQkJCQkgbGdfbm90aWZ5LCBjYWxsYmFjayk7CisJdnEgPSB2cmluZ19uZXdfdmlydHF1ZXVlKGx2cS0+Y29uZmlnLm51bSwgTEdVRVNUX1ZSSU5HX0FMSUdOLAorCQkJCSB2ZGV2LCBsdnEtPnBhZ2VzLCBsZ19ub3RpZnksIGNhbGxiYWNrKTsKIAlpZiAoIXZxKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gdW5tYXA7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAkgKiB0aGUgaW50ZXJydXB0IGFzIGEgc291cmNlIG9mIHJhbmRvbW5lc3M6IGl0J2QgYmUgbmljZSB0byBoYXZlIHRoYXQKIAkgKiBiYWNrLi4gKi8KIAllcnIgPSByZXF1ZXN0X2lycShsdnEtPmNvbmZpZy5pcnEsIHZyaW5nX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkgIHZkZXYtPmRldi5idXNfaWQsIHZxKTsKKwkJCSAgZGV2X25hbWUoJnZkZXYtPmRldiksIHZxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGRlc3Ryb3lfdnJpbmc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCmluZGV4IGU3M2EwMDAuLjM0YmMwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qTDowMjAgVGhlIGluaXRpYWxpemF0aW9uIHdyaXRlIHN1cHBsaWVzIDQgcG9pbnRlciBzaXplZCAoMzIgb3IgNjQgYml0KQorLypMOjAyMCBUaGUgaW5pdGlhbGl6YXRpb24gd3JpdGUgc3VwcGxpZXMgMyBwb2ludGVyIHNpemVkICgzMiBvciA2NCBiaXQpCiAgKiB2YWx1ZXMgKGluIGFkZGl0aW9uIHRvIHRoZSBMSFJFUV9JTklUSUFMSVpFIHZhbHVlKS4gIFRoZXNlIGFyZToKICAqCiAgKiBiYXNlOiBUaGUgc3RhcnQgb2YgdGhlIEd1ZXN0LXBoeXNpY2FsIG1lbW9yeSBpbnNpZGUgdGhlIExhdW5jaGVyIG1lbW9yeS4KQEAgLTE1NSw5ICsxNTUsNiBAQAogICogYWxsb3dlZCB0byBhY2Nlc3MuICBUaGUgR3Vlc3QgbWVtb3J5IGxpdmVzIGluc2lkZSB0aGUgTGF1bmNoZXIsIHNvIGl0IHNldHMKICAqIHRoaXMgdG8gZW5zdXJlIHRoZSBHdWVzdCBjYW4gb25seSByZWFjaCBpdHMgb3duIG1lbW9yeS4KICAqCi0gKiBwZ2RpcjogVGhlIChHdWVzdC1waHlzaWNhbCkgYWRkcmVzcyBvZiB0aGUgdG9wIG9mIHRoZSBpbml0aWFsIEd1ZXN0Ci0gKiBwYWdldGFibGVzICh3aGljaCBhcmUgc2V0IHVwIGJ5IHRoZSBMYXVuY2hlcikuCi0gKgogICogc3RhcnQ6IFRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlICgiZWlwIiBpbiB4ODYtc3BlYWspLgogICovCiBzdGF0aWMgaW50IGluaXRpYWxpemUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICppbnB1dCkKQEAgLTE2Niw3ICsxNjMsNyBAQAogCSAqIEd1ZXN0LiAqLwogCXN0cnVjdCBsZ3Vlc3QgKmxnOwogCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBhcmdzWzRdOworCXVuc2lnbmVkIGxvbmcgYXJnc1szXTsKIAogCS8qIFdlIGdyYWIgdGhlIEJpZyBMZ3Vlc3QgbG9jaywgd2hpY2ggcHJvdGVjdHMgYWdhaW5zdCBtdWx0aXBsZQogCSAqIHNpbXVsdGFuZW91cyBpbml0aWFsaXphdGlvbnMuICovCkBAIC0xOTIsMTQgKzE4OSwxNCBAQAogCWxnLT5tZW1fYmFzZSA9ICh2b2lkIF9fdXNlciAqKWFyZ3NbMF07CiAJbGctPnBmbl9saW1pdCA9IGFyZ3NbMV07CiAKLQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBjcHUgKGNwdSAwKSBhbmQgaXQgd2lsbCBzdGFydCBib290aW5nIGF0IGFyZ3NbM10gKi8KLQllcnIgPSBsZ19jcHVfc3RhcnQoJmxnLT5jcHVzWzBdLCAwLCBhcmdzWzNdKTsKKwkvKiBUaGlzIGlzIHRoZSBmaXJzdCBjcHUgKGNwdSAwKSBhbmQgaXQgd2lsbCBzdGFydCBib290aW5nIGF0IGFyZ3NbMl0gKi8KKwllcnIgPSBsZ19jcHVfc3RhcnQoJmxnLT5jcHVzWzBdLCAwLCBhcmdzWzJdKTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlbGVhc2VfZ3Vlc3Q7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBHdWVzdCdzIHNoYWRvdyBwYWdlIHRhYmxlcywgdXNpbmcgdGhlIHRvcGxldmVsCiAJICogYWRkcmVzcyB0aGUgTGF1bmNoZXIgZ2F2ZSB1cy4gIFRoaXMgYWxsb2NhdGVzIG1lbW9yeSwgc28gY2FuIGZhaWwuICovCi0JZXJyID0gaW5pdF9ndWVzdF9wYWdldGFibGUobGcsIGFyZ3NbMl0pOworCWVyciA9IGluaXRfZ3Vlc3RfcGFnZXRhYmxlKGxnKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfcmVnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvcGFnZV90YWJsZXMuYyBiL2RyaXZlcnMvbGd1ZXN0L3BhZ2VfdGFibGVzLmMKaW5kZXggODFkMGM2MC4uNTc2YTgzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvcGFnZV90YWJsZXMuYworKysgYi9kcml2ZXJzL2xndWVzdC9wYWdlX3RhYmxlcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CiAjaW5jbHVkZSAibGcuaCIKIAogLypNOjAwOCBXZSBob2xkIHJlZmVyZW5jZSB0byBwYWdlcywgd2hpY2ggcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIHN3YXBwZWQuCkBAIC01ODEsMTUgKzU4Miw4MiBAQAogCQlyZWxlYXNlX3BnZChsZywgbGctPnBnZGlyc1twZ2Rpcl0ucGdkaXIgKyBpZHgpOwogfQogCisvKiBPbmNlIHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IHdlIGhhdmUgd2UgY2FuIGNvbnN0cnVjdCBzaW1wbGUgaWRlbnRpdHkKKyAqICh3aGljaCBzZXQgdmlydHVhbCA9PSBwaHlzaWNhbCkgYW5kIGxpbmVhciBtYXBwaW5ncworICogd2hpY2ggd2lsbCBnZXQgdGhlIEd1ZXN0IGZhciBlbm91Z2ggaW50byB0aGUgYm9vdCB0byBjcmVhdGUgaXRzIG93bi4KKyAqCisgKiBXZSBsYXkgdGhlbSBvdXQgb2YgdGhlIHdheSwganVzdCBiZWxvdyB0aGUgaW5pdHJkICh3aGljaCBpcyB3aHkgd2UgbmVlZCB0bworICoga25vdyBpdHMgc2l6ZSBoZXJlKS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldHVwX3BhZ2V0YWJsZXMoc3RydWN0IGxndWVzdCAqbGcsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBtZW0sCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZSkKK3sKKwlwZ2RfdCBfX3VzZXIgKnBnZGlyOworCXB0ZV90IF9fdXNlciAqbGluZWFyOworCXVuc2lnbmVkIGludCBtYXBwZWRfcGFnZXMsIGksIGxpbmVhcl9wYWdlcywgcGh5c19saW5lYXI7CisJdW5zaWduZWQgbG9uZyBtZW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKWxnLT5tZW1fYmFzZTsKKworCS8qIFdlIGhhdmUgbWFwcGVkX3BhZ2VzIGZyYW1lcyB0byBtYXAsIHNvIHdlIG5lZWQKKwkgKiBsaW5lYXJfcGFnZXMgcGFnZSB0YWJsZXMgdG8gbWFwIHRoZW0uICovCisJbWFwcGVkX3BhZ2VzID0gbWVtIC8gUEFHRV9TSVpFOworCWxpbmVhcl9wYWdlcyA9IChtYXBwZWRfcGFnZXMgKyBQVFJTX1BFUl9QVEUgLSAxKSAvIFBUUlNfUEVSX1BURTsKKworCS8qIFdlIHB1dCB0aGUgdG9wbGV2ZWwgcGFnZSBkaXJlY3RvcnkgcGFnZSBhdCB0aGUgdG9wIG9mIG1lbW9yeS4gKi8KKwlwZ2RpciA9IChwZ2RfdCAqKShtZW0gKyBtZW1fYmFzZSAtIGluaXRyZF9zaXplIC0gUEFHRV9TSVpFKTsKKworCS8qIE5vdyB3ZSB1c2UgdGhlIG5leHQgbGluZWFyX3BhZ2VzIHBhZ2VzIGFzIHB0ZSBwYWdlcyAqLworCWxpbmVhciA9ICh2b2lkICopcGdkaXIgLSBsaW5lYXJfcGFnZXMgKiBQQUdFX1NJWkU7CisKKwkvKiBMaW5lYXIgbWFwcGluZyBpcyBlYXN5OiBwdXQgZXZlcnkgcGFnZSdzIGFkZHJlc3MgaW50byB0aGUKKwkgKiBtYXBwaW5nIGluIG9yZGVyLiAqLworCWZvciAoaSA9IDA7IGkgPCBtYXBwZWRfcGFnZXM7IGkrKykgeworCQlwdGVfdCBwdGU7CisJCXB0ZSA9IHBmbl9wdGUoaSwgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVHxfUEFHRV9SV3xfUEFHRV9VU0VSKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoJmxpbmVhcltpXSwgJnB0ZSwgc2l6ZW9mKHB0ZSkpICE9IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBUaGUgdG9wIGxldmVsIHBvaW50cyB0byB0aGUgbGluZWFyIHBhZ2UgdGFibGUgcGFnZXMgYWJvdmUuCisJICogV2Ugc2V0dXAgdGhlIGlkZW50aXR5IGFuZCBsaW5lYXIgbWFwcGluZ3MgaGVyZS4gKi8KKwlwaHlzX2xpbmVhciA9ICh1bnNpZ25lZCBsb25nKWxpbmVhciAtIG1lbV9iYXNlOworCWZvciAoaSA9IDA7IGkgPCBtYXBwZWRfcGFnZXM7IGkgKz0gUFRSU19QRVJfUFRFKSB7CisJCXBnZF90IHBnZDsKKwkJcGdkID0gX19wZ2QoKHBoeXNfbGluZWFyICsgaSAqIHNpemVvZihwdGVfdCkpIHwKKwkJCSAgICAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfVVNFUikpOworCisJCWlmIChjb3B5X3RvX3VzZXIoJnBnZGlyW2kgLyBQVFJTX1BFUl9QVEVdLCAmcGdkLCBzaXplb2YocGdkKSkKKwkJICAgIHx8IGNvcHlfdG9fdXNlcigmcGdkaXJbcGdkX2luZGV4KFBBR0VfT0ZGU0VUKQorCQkJCQkgICArIGkgLyBQVFJTX1BFUl9QVEVdLAorCQkJCSAgICAmcGdkLCBzaXplb2YocGdkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBXZSByZXR1cm4gdGhlIHRvcCBsZXZlbCAoZ3Vlc3QtcGh5c2ljYWwpIGFkZHJlc3M6IHJlbWVtYmVyIHdoZXJlCisJICogdGhpcyBpcy4gKi8KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGdkaXIgLSBtZW1fYmFzZTsKK30KKwogLypIOjUwMCAodmlpKSBTZXR0aW5nIHVwIHRoZSBwYWdlIHRhYmxlcyBpbml0aWFsbHkuCiAgKgogICogV2hlbiBhIEd1ZXN0IGlzIGZpcnN0IGNyZWF0ZWQsIHRoZSBMYXVuY2hlciB0ZWxscyB1cyB3aGVyZSB0aGUgdG9wbGV2ZWwgb2YKICAqIGl0cyBmaXJzdCBwYWdlIHRhYmxlIGlzLiAgV2Ugc2V0IHNvbWUgdGhpbmdzIHVwIGhlcmU6ICovCi1pbnQgaW5pdF9ndWVzdF9wYWdldGFibGUoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIGxvbmcgcGd0YWJsZSkKK2ludCBpbml0X2d1ZXN0X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKKwl1NjQgbWVtOworCXUzMiBpbml0cmRfc2l6ZTsKKwlzdHJ1Y3QgYm9vdF9wYXJhbXMgX191c2VyICpib290ID0gKHN0cnVjdCBib290X3BhcmFtcyAqKWxnLT5tZW1fYmFzZTsKKworCS8qIEdldCB0aGUgR3Vlc3QgbWVtb3J5IHNpemUgYW5kIHRoZSByYW1kaXNrIHNpemUgZnJvbSB0aGUgYm9vdCBoZWFkZXIKKwkgKiBsb2NhdGVkIGF0IGxnLT5tZW1fYmFzZSAoR3Vlc3QgYWRkcmVzcyAwKS4gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJm1lbSwgJmJvb3QtPmU4MjBfbWFwWzBdLnNpemUsIHNpemVvZihtZW0pKQorCSAgICB8fCBnZXRfdXNlcihpbml0cmRfc2l6ZSwgJmJvb3QtPmhkci5yYW1kaXNrX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwogCS8qIFdlIHN0YXJ0IG9uIHRoZSBmaXJzdCBzaGFkb3cgcGFnZSB0YWJsZSwgYW5kIGdpdmUgaXQgYSBibGFuayBQR0QKIAkgKiBwYWdlLiAqLwotCWxnLT5wZ2RpcnNbMF0uZ3BnZGlyID0gcGd0YWJsZTsKKwlsZy0+cGdkaXJzWzBdLmdwZ2RpciA9IHNldHVwX3BhZ2V0YWJsZXMobGcsIG1lbSwgaW5pdHJkX3NpemUpOworCWlmIChJU19FUlJfVkFMVUUobGctPnBnZGlyc1swXS5ncGdkaXIpKQorCQlyZXR1cm4gbGctPnBnZGlyc1swXS5ncGdkaXI7CiAJbGctPnBnZGlyc1swXS5wZ2RpciA9IChwZ2RfdCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWxnLT5wZ2RpcnNbMF0ucGdkaXIpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IGNlMjZjODQuLjMzMjY3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTEwNjAsNyArMTA2MCw3IEBACiAJCWdvdG8gYmFkX3BhZ2VfcG9vbDsKIAl9CiAKLQljYy0+YnMgPSBiaW9zZXRfY3JlYXRlKE1JTl9JT1MsIE1JTl9JT1MpOworCWNjLT5icyA9IGJpb3NldF9jcmVhdGUoTUlOX0lPUywgMCk7CiAJaWYgKCFjYy0+YnMpIHsKIAkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBjcnlwdCBiaW9zZXQiOwogCQlnb3RvIGJhZF9iczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCAyZmQ2ZDQ0Li5hMzQzMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC01Niw3ICs1Niw3IEBACiAJaWYgKCFjbGllbnQtPnBvb2wpCiAJCWdvdG8gYmFkOwogCi0JY2xpZW50LT5iaW9zID0gYmlvc2V0X2NyZWF0ZSgxNiwgMTYpOworCWNsaWVudC0+YmlvcyA9IGJpb3NldF9jcmVhdGUoMTYsIDApOwogCWlmICghY2xpZW50LT5iaW9zKQogCQlnb3RvIGJhZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IDM0MzA5NGMuLjQyMWM5ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAJaWYgKCFtZC0+dGlvX3Bvb2wpCiAJCWdvdG8gYmFkX3Rpb19wb29sOwogCi0JbWQtPmJzID0gYmlvc2V0X2NyZWF0ZSgxNiwgMTYpOworCW1kLT5icyA9IGJpb3NldF9jcmVhdGUoMTYsIDApOwogCWlmICghbWQtPmJzKQogCQlnb3RvIGJhZF9ub19iaW9zZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwppbmRleCA0OTUyYWViLi5kODIyOWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCkBAIC0yMzkxLDYgKzIzOTEsNjcgQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19wb3dlcmNvbG9yX3JlYWxfYW5nZWwpOwogCisvKiBLd29ybGQgUGx1cyBUViBBbmFsb2cgTGl0ZSBQQ0kgSVIKKyAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgorICovCitJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19rd29ybGRfcGx1c190dl9hbmFsb2dbSVJfS0VZVEFCX1NJWkVdID0geworCVsweDBjXSA9IEtFWV9QUk9HMSwJCS8qIEt3b3JsZCBrZXkgKi8KKwlbMHgxNl0gPSBLRVlfQ0xPU0VDRCwJCS8qIC0+ICkgKi8KKwlbMHgxZF0gPSBLRVlfUE9XRVIyLAorCisJWzB4MDBdID0gS0VZXzEsCisJWzB4MDFdID0gS0VZXzIsCisJWzB4MDJdID0gS0VZXzMsCQkJLyogVHdvIGtleXMgaGF2ZSB0aGUgc2FtZSBjb2RlOiAzIGFuZCBsZWZ0ICovCisJWzB4MDNdID0gS0VZXzQsCQkJLyogVHdvIGtleXMgaGF2ZSB0aGUgc2FtZSBjb2RlOiAzIGFuZCByaWdodCAqLworCVsweDA0XSA9IEtFWV81LAorCVsweDA1XSA9IEtFWV82LAorCVsweDA2XSA9IEtFWV83LAorCVsweDA3XSA9IEtFWV84LAorCVsweDA4XSA9IEtFWV85LAorCVsweDBhXSA9IEtFWV8wLAorCisJWzB4MDldID0gS0VZX0FHQUlOLAorCVsweDE0XSA9IEtFWV9NVVRFLAorCisJWzB4MjBdID0gS0VZX1VQLAorCVsweDIxXSA9IEtFWV9ET1dOLAorCVsweDBiXSA9IEtFWV9FTlRFUiwKKworCVsweDEwXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MTFdID0gS0VZX0NIQU5ORUxET1dOLAorCisJLyogQ291bGRuJ3QgbWFwIGtleSBsZWZ0L2tleSByaWdodCBzaW5jZSB0aG9zZQorCSAgIGNvbmZsaWN0IHdpdGggJzMnIGFuZCAnNCcgc2NhbmNvZGVzCisJICAgSSBkdW5ubyB3aGF0IHRoZSBvcmlnaW5hbCBkcml2ZXIgZG9lcworCSAqLworCisJWzB4MTNdID0gS0VZX1ZPTFVNRVVQLAorCVsweDEyXSA9IEtFWV9WT0xVTUVET1dOLAorCisJLyogVGhlIGxvd2VyIHBhcnQgb2YgdGhlIElSCisJICAgVGhlcmUgYXJlIHNldmVyYWwgZHVwbGljYXRlZCBrZXljb2RlcyB0aGVyZS4KKwkgICBNb3N0IG9mIHRoZW0gY29uZmxpY3Qgd2l0aCBkaWdpdHMuCisJICAgQWRkIG1hcHBpbmdzIGp1c3QgdG8gdGhlIHVudXNlZCBzY2FuY29kZXMuCisJICAgU29tZWhvdywgdGhlIG9yaWdpbmFsIGRyaXZlciBoYXMgYSB3YXkgdG8ga25vdywKKwkgICBidXQgdGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgb24gc29tZSBHUElPLgorCSAgIEFsc28sIGl0IGlzIG5vdCByZWxhdGVkIHRvIHRoZSB0aW1lIGJldHdlZW4ga2V5dXAKKwkgICBhbmQga2V5ZG93bi4KKwkgKi8KKwlbMHgxOV0gPSBLRVlfUEFVU0UsCQkvKiBUaW1lc2hpZnQgKi8KKwlbMHgxYV0gPSBLRVlfU1RPUCwKKwlbMHgxYl0gPSBLRVlfUkVDT1JELAorCisJWzB4MjJdID0gS0VZX1RFWFQsCisKKwlbMHgxNV0gPSBLRVlfQVVESU8sCQkvKiAoKCopKSAqLworCVsweDBmXSA9IEtFWV9aT09NLAorCVsweDFjXSA9IEtFWV9TSFVGRkxFLAkJLyogc25hcHNob3QgKi8KKworCVsweDE4XSA9IEtFWV9SRUQsCQkvKiBCICovCisJWzB4MjNdID0gS0VZX0dSRUVOLAkJLyogQyAqLworfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2t3b3JsZF9wbHVzX3R2X2FuYWxvZyk7CisKIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJtZWRpYV9hMTZkW0lSX0tFWVRBQl9TSVpFXSA9IHsKIAlbMHgyMF0gPSBLRVlfTElTVCwKIAlbMHgwMF0gPSBLRVlfUE9XRVIsCkBAIC0yNTExLDMgKzI1NzIsMzUgQEAKIAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3JlYWxfYXVkaW9fMjIwXzMyX2tleXMpOworCisvKiBBVEkgVFYgV29uZGVyIEhEIDYwMCBVU0IKKyAgIERldmluIEhlaXRtdWVsbGVyIDxkZXZpbi5oZWl0bXVlbGxlckBnbWFpbC5jb20+CisgKi8KK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F0aV90dl93b25kZXJfaGRfNjAwW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbMHgwMF0gPSBLRVlfUkVDT1JELAkJLyogUm93IDEgKi8KKwlbMHgwMV0gPSBLRVlfUExBWVBBVVNFLAorCVsweDAyXSA9IEtFWV9TVE9QLAorCVsweDAzXSA9IEtFWV9QT1dFUiwKKwlbMHgwNF0gPSBLRVlfUFJFVklPVVMsCS8qIFJvdyAyICovCisJWzB4MDVdID0gS0VZX1JFV0lORCwKKwlbMHgwNl0gPSBLRVlfRk9SV0FSRCwKKwlbMHgwN10gPSBLRVlfTkVYVCwKKwlbMHgwOF0gPSBLRVlfRVBHLAkJLyogUm93IDMgKi8KKwlbMHgwOV0gPSBLRVlfSE9NRSwKKwlbMHgwYV0gPSBLRVlfTUVOVSwKKwlbMHgwYl0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDBjXSA9IEtFWV9CQUNLLAkJLyogUm93IDQgKi8KKwlbMHgwZF0gPSBLRVlfVVAsCisJWzB4MGVdID0gS0VZX0lORk8sCisJWzB4MGZdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDEwXSA9IEtFWV9MRUZULAkJLyogUm93IDUgKi8KKwlbMHgxMV0gPSBLRVlfU0VMRUNULAorCVsweDEyXSA9IEtFWV9SSUdIVCwKKwlbMHgxM10gPSBLRVlfVk9MVU1FVVAsCisJWzB4MTRdID0gS0VZX0xBU1QsCQkvKiBSb3cgNiAqLworCVsweDE1XSA9IEtFWV9ET1dOLAorCVsweDE2XSA9IEtFWV9NVVRFLAorCVsweDE3XSA9IEtFWV9WT0xVTUVET1dOLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfYXRpX3R2X3dvbmRlcl9oZF82MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCAxMjdiMDUyLi43ZDg0NGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAvKgogCURFQl9FRSgoImlub2RlOiVwLCBmaWxlOiVwLCBjbWQ6JWQsIGFyZzolbGlcbiIsaW5vZGUsIGZpbGUsIGNtZCwgYXJnKSk7CiAqLwotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHNhYTcxNDZfdmlkZW9fZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgc2FhNzE0Nl92aWRlb19kb19pb2N0bCk7CiB9CiAKIHN0YXRpYyBpbnQgZm9wc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKaW5kZXggZmUwYmQ1NS4uMTAxYjAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYwpAQCAtODM0LDcgKzgzNCw3IEBACiAgKiBjb3B5aW5nIGlzIGRvbmUgYWxyZWFkeSwgYXJnIGlzIGEga2VybmVsIHBvaW50ZXIuCiAgKi8KIAotc3RhdGljIGludCBfX3NhYTcxNDZfdmlkZW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK2ludCBzYWE3MTQ2X3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHNhYTcxNDZfZmggKmZoICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CkBAIC0xMjE2LDE3ICsxMjE2LDExIEBACiAjZW5kaWYKIAlkZWZhdWx0OgogCQlyZXR1cm4gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoZmlsZSwgY21kLCBhcmcsCi0JCQkJCQkgIF9fc2FhNzE0Nl92aWRlb19kb19pb2N0bCk7CisJCQkJCQkgIHNhYTcxNDZfdmlkZW9fZG9faW9jdGwpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHNhYTcxNDZfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gX19zYWE3MTQ2X3ZpZGVvX2RvX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA1cy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKaW5kZXggYTg4NzgyNC4uMzE1MjJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKQEAgLTM1OTgsNyArMzU5OCw3IEBACiAJCTc2LCA3NywgOTEsIDEzNCwgMTM1LCAxMzcsIDE0NywKIAkJMTU2LCAxNjYsIDE2NywgMTY4LCAyNSB9OwogCi0JKmNvdW50ID0gc2l6ZW9mKFJlZ0FkZHIpIC8gc2l6ZW9mKHU4KTsKKwkqY291bnQgPSBBUlJBWV9TSVpFKFJlZ0FkZHIpOwogCiAJc3RhdHVzICs9IE1YTF9CbG9ja0luaXQoZmUpOwogCkBAIC0zNjMwLDcgKzM2MzAsNyBAQAogCSovCiAjZW5kaWYKIAotCSpjb3VudCA9IHNpemVvZihSZWdBZGRyKSAvIHNpemVvZih1OCk7CisJKmNvdW50ID0gQVJSQVlfU0laRShSZWdBZGRyKTsKIAogCWZvciAoaSA9IDAgOyBpIDwgKmNvdW50OyBpKyspIHsKIAkJUmVnTnVtW2ldID0gUmVnQWRkcltpXTsKQEAgLTM2NDgsNyArMzY0OCw3IEBACiAKIAl1OCBSZWdBZGRyW10gPSB7NDMsIDEzNn07CiAKLQkqY291bnQgPSBzaXplb2YoUmVnQWRkcikgLyBzaXplb2YodTgpOworCSpjb3VudCA9IEFSUkFZX1NJWkUoUmVnQWRkcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKIAkJUmVnTnVtW2ldID0gUmVnQWRkcltpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jCmluZGV4IDRhNzRmNjUuLmY0ZDkzMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyN3guYwpAQCAtODAsMTAgKzgwLDExIEBACiAJCW1vZGUgPSAieHgiOwogCX0KIAotCWlmIChwYXJhbXMtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykKKwlpZiAocGFyYW1zLT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsKIAkJcHJpdi0+c2dJRiA9IDg4OyAvKiBpZiBmcmVxdWVuY3kgaXMgNS41IE1IeiAqLwotCi0JZHByaW50aygic2V0dGluZyB0ZGE4Mjd4IHRvIHN5c3RlbSAlc1xuIiwgbW9kZSk7CisJCWRwcmludGsoInNldHRpbmcgdGRhODI3eCB0byByYWRpbyBGTVxuIik7CisJfSBlbHNlCisJCWRwcmludGsoInNldHRpbmcgdGRhODI3eCB0byBzeXN0ZW0gJXNcbiIsIG1vZGUpOwogfQogCiAKQEAgLTE5OSw3ICsyMDAsNyBAQAogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKLQlwcml2LT5mcmVxdWVuY3kgPSB0dW5lcl9mcmVxIC0gaWZfZnJlcTsgLy8gRklYTUUKKwlwcml2LT5mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKIAlwcml2LT5iYW5kd2lkdGggPSAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgPyBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggOiAwOwogCiAJcmV0dXJuIDA7CkBAIC0zMDQsNyArMzA1LDcgQEAKIAlyZWcyWzFdID0gMHgwODsgICAvKiBWc3luYyBlbiAqLwogCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKLQlwcml2LT5mcmVxdWVuY3kgPSBmcmVxICogNjI1MDA7CisJcHJpdi0+ZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5MSw3ICs1OTIsNyBAQAogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKLQlwcml2LT5mcmVxdWVuY3kgPSB0dW5lcl9mcmVxIC0gaWZfZnJlcTsgLy8gRklYTUUKKwlwcml2LT5mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKIAlwcml2LT5iYW5kd2lkdGggPSAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgPyBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggOiAwOwogCiAJcmV0dXJuIDA7CkBAIC02OTEsNyArNjkyLDcgQEAKIAl0dW5lcl9yZWdbMV0gPSAweDE5ICsgKHByaXYtPmxwc2VsIDw8IDEpOwogCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKLQlwcml2LT5mcmVxdWVuY3kgPSBmcmVxICogNjI1MDA7CisJcHJpdi0+ZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCmluZGV4IGMxMTJiZGQuLjBlZTc5ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYwpAQCAtMzIsNiArMzIsOSBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImVuYWJsZSB2ZXJib3NlIGRlYnVnIG1lc3NhZ2VzIik7CiAKK3N0YXRpYyBpbnQgZGVlbXBoYXNpc181MDsKK01PRFVMRV9QQVJNX0RFU0MoZGVlbXBoYXNpc181MCwgIjAgLSA3NXVzIGRlZW1waGFzaXM7IDEgLSA1MHVzIGRlZW1waGFzaXMiKTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdHJ1Y3QgdGRhODI5MF9wcml2IHsKQEAgLTEzOSw5ICsxNDIsMzQgQEAKIAkJbW9kZSA9ICJ4eCI7CiAJfQogCi0JdHVuZXJfZGJnKCJzZXR0aW5nIHRkYTgyOXggdG8gc3lzdGVtICVzXG4iLCBtb2RlKTsKKwlpZiAocGFyYW1zLT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsKKwkJcHJpdi0+dGRhODI5MF9lYXN5X21vZGUgPSAweDAxOwkJLyogU3RhcnQgd2l0aCBNTiB2YWx1ZXMgKi8KKwkJdHVuZXJfZGJnKCJzZXR0aW5nIHRvIHJhZGlvIEZNXG4iKTsKKwl9IGVsc2UgeworCQl0dW5lcl9kYmcoInNldHRpbmcgdGRhODI5eCB0byBzeXN0ZW0gJXNcbiIsIG1vZGUpOworCX0KIH0KIAorc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIHNlcVsyXTsKK30gZm1fbW9kZVtdID0geworCXsgeyAweDAxLCAweDgxfSB9LAkvKiBQdXQgZGV2aWNlIGludG8gZXhwZXJ0IG1vZGUgKi8KKwl7IHsgMHgwMywgMHg0OH0gfSwJLyogRGlzYWJsZSBOT1RDSCBhbmQgVklERU8gZmlsdGVycyAqLworCXsgeyAweDA0LCAweDA0fSB9LAkvKiBEaXNhYmxlIGNvbG9yIGNhcnJpZXIgZmlsdGVyIChTU0lGKSAqLworCXsgeyAweDA1LCAweDA0fSB9LAkvKiBBREMgaGVhZHJvb20gKi8KKwl7IHsgMHgwNiwgMHgxMH0gfSwJLyogZ3JvdXAgZGVsYXkgZmxhdCAqLworCisJeyB7IDB4MDcsIDB4MDB9IH0sCS8qIHVzZSB0aGUgc2FtZSByYWRpbyBEVE8gdmFsdWVzIGFzIGEgdGRhODI5NSAqLworCXsgeyAweDA4LCAweDAwfSB9LAorCXsgeyAweDA5LCAweDgwfSB9LAorCXsgeyAweDBhLCAweGRhfSB9LAorCXsgeyAweDBiLCAweDRifSB9LAorCXsgeyAweDBjLCAweDY4fSB9LAorCisJeyB7IDB4MGQsIDB4MDB9IH0sCS8qIFBMTCBvZmYsIG5vIHZpZGVvIGNhcnJpZXIgZGV0ZWN0ICovCisJeyB7IDB4MTQsIDB4MDB9IH0sCS8qIGRpc2FibGUgYXV0byBtdXRlIGlmIG5vIHZpZGVvICovCit9OworCiBzdGF0aWMgdm9pZCB0ZGE4MjkwX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJCQkgICAgICAgc3RydWN0IGFuYWxvZ19wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CkBAIC0xNzgsMTUgKzIwNiwzMCBAQAogCXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcywgc29mdF9yZXNldCwgMik7CiAJbXNsZWVwKDEpOwogCi0JZXhwZXJ0X21vZGVbMV0gPSBwcml2LT50ZGE4MjkwX2Vhc3lfbW9kZSArIDB4ODA7Ci0JdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBleHBlcnRfbW9kZSwgMik7Ci0JdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBnYWluc2V0X29mZiwgMik7Ci0JdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBpZl9hZ2Nfc3BkLCAyKTsKLQlpZiAocHJpdi0+dGRhODI5MF9lYXN5X21vZGUgJiAweDYwKQotCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGFkY19oZWFkXzksIDIpOwotCWVsc2UKLQkJdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBhZGNfaGVhZF82LCAyKTsKLQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIHBsbF9id19ub20sIDIpOworCWlmIChwYXJhbXMtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgY2hhciBkZWVtcGhhc2lzW10gID0geyAweDEzLCAxIH07CisKKwkJLyogRklYTUU6IGFsbG93IHVzaW5nIGEgZGlmZmVyZW50IGRlZW1waGFzaXMgKi8KKworCQlpZiAoZGVlbXBoYXNpc181MCkKKwkJCWRlZW1waGFzaXNbMV0gPSAyOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZtX21vZGUpOyBpKyspCisJCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGZtX21vZGVbaV0uc2VxLCAyKTsKKworCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGRlZW1waGFzaXMsIDIpOworCX0gZWxzZSB7CisJCWV4cGVydF9tb2RlWzFdID0gcHJpdi0+dGRhODI5MF9lYXN5X21vZGUgKyAweDgwOworCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGV4cGVydF9tb2RlLCAyKTsKKwkJdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBnYWluc2V0X29mZiwgMik7CisJCXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcywgaWZfYWdjX3NwZCwgMik7CisJCWlmIChwcml2LT50ZGE4MjkwX2Vhc3lfbW9kZSAmIDB4NjApCisJCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGFkY19oZWFkXzksIDIpOworCQllbHNlCisJCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGFkY19oZWFkXzYsIDIpOworCQl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIHBsbF9id19ub20sIDIpOworCX0KIAogCXRkYTgyOTBfaTJjX2JyaWRnZShmZSwgMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE5ODg3LmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhOTg4Ny5jCmluZGV4IGZmMTc4OGMuLjU0NGNkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE5ODg3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTk4ODcuYwpAQCAtMTgwLDExICsxODAsMTAgQEAKIAl9LHsKIAkJLnN0ZCAgID0gVjRMMl9TVERfU0VDQU1fQiB8IFY0TDJfU1REX1NFQ0FNX0cgfCBWNEwyX1NURF9TRUNBTV9ILAogCQkubmFtZSAgPSAiU0VDQU0tQkdIIiwKLQkJLmIgICAgID0gKCBjUG9zaXRpdmVBbVRWICB8CisJCS5iICAgICA9ICggY05lZ2F0aXZlRm1UViAgfAogCQkJICAgY1FTUyAgICAgICAgICAgKSwKIAkJLmMgICAgID0gKCBjVG9wRGVmYXVsdCksCi0JCS5lICAgICA9ICggY0dhdGluZ18zNgkgIHwKLQkJCSAgIGNBdWRpb0lGXzVfNSAgIHwKKwkJLmUgICAgID0gKCBjQXVkaW9JRl81XzUgICB8CiAJCQkgICBjVmlkZW9JRl8zOF85MCApLAogCX0sewogCQkuc3RkICAgPSBWNEwyX1NURF9TRUNBTV9MLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5jCmluZGV4IGI2NWU2ODAuLjFhZGNlOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmMKQEAgLTI4LDYgKzI4LDEyIEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIHZlcmJvc2UgZGVidWcgbWVzc2FnZXMiKTsKIAorc3RhdGljIGludCBub19wb3dlcm9mZjsKK21vZHVsZV9wYXJhbShub19wb3dlcm9mZiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIwIChkZWZhdWx0KSBwb3dlcnMgZGV2aWNlIG9mZiB3aGVuIG5vdCB1c2VkLlxuIgorCSIxIGtlZXAgZGV2aWNlIGVuZXJnaXplZCBhbmQgd2l0aCB0dW5lciByZWFkeSBhbGwgdGhlIHRpbWVzLlxuIgorCSIgIEZhc3RlciwgYnV0IGNvbnN1bWVzIG1vcmUgcG93ZXIgYW5kIGtlZXBzIHRoZSBkZXZpY2UgaG90dGVyXG4iKTsKKwogc3RhdGljIGNoYXIgYXVkaW9fc3RkWzhdOwogbW9kdWxlX3BhcmFtX3N0cmluZyhhdWRpb19zdGQsIGF1ZGlvX3N0ZCwgc2l6ZW9mKGF1ZGlvX3N0ZCksIDApOwogTU9EVUxFX1BBUk1fREVTQyhhdWRpb19zdGQsCkBAIC0xMDkxLDYgKzEwOTcsMzQgQEAKIAkJCQlUX0RJR0lUQUxfVFYsIHR5cGUsIDAsIGRlbW9kKTsKIH0KIAorc3RhdGljIGludCB4YzIwMjhfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHhjMjAyOF9kYXRhICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJjID0gMDsKKworCS8qIEF2b2lkIGZpcm13YXJlIHJlbG9hZCBvbiBzbG93IGRldmljZXMgKi8KKwlpZiAobm9fcG93ZXJvZmYpCisJCXJldHVybiAwOworCisJdHVuZXJfZGJnKCJQdXR0aW5nIHhjMjAyOC8zMDI4IGludG8gcG93ZXJvZmYgbW9kZS5cbiIpOworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJdHVuZXJfZGJnKCJQcmludGluZyBzbGVlcCBzdGFjayB0cmFjZTpcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAocHJpdi0+ZmlybV92ZXJzaW9uIDwgMHgwMjAyKQorCQlyYyA9IHNlbmRfc2VxKHByaXYsIHsweDAwLCAweDA4LCAweDAwLCAweDAwfSk7CisJZWxzZQorCQlyYyA9IHNlbmRfc2VxKHByaXYsIHsweDgwLCAweDA4LCAweDAwLCAweDAwfSk7CisKKwlwcml2LT5jdXJfZncudHlwZSA9IDA7CS8qIG5lZWQgZmlybXdhcmUgcmVsb2FkICovCisKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIHJjOworfQogCiBzdGF0aWMgaW50IHhjMjAyOF9kdmJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKQEAgLTExNzEsNiArMTIwNSw3IEBACiAJLmdldF9mcmVxdWVuY3kgICAgID0geGMyMDI4X2dldF9mcmVxdWVuY3ksCiAJLmdldF9yZl9zdHJlbmd0aCAgID0geGMyMDI4X3NpZ25hbCwKIAkuc2V0X3BhcmFtcyAgICAgICAgPSB4YzIwMjhfc2V0X3BhcmFtcywKKwkuc2xlZXAgICAgICAgICAgICAgPSB4YzIwMjhfc2xlZXAsCiB9OwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzIwMjhfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jCmluZGV4IGUxMmQxM2UuLjQ5M2NlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmMKQEAgLTM2LDEwICszNiw2IEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CiAKLXN0YXRpYyBpbnQgeGM1MDAwX2xvYWRfZndfb25fYXR0YWNoOwotbW9kdWxlX3BhcmFtX25hbWVkKGluaXRfZncsIHhjNTAwMF9sb2FkX2Z3X29uX2F0dGFjaCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaW5pdF9mdywgIkxvYWQgZmlybXdhcmUgZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbi4iKTsKLQogc3RhdGljIERFRklORV9NVVRFWCh4YzUwMDBfbGlzdF9tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0KTsKIApAQCAtMTAxNyw5ICsxMDEzLDYgQEAKIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmeGM1MDAwX3R1bmVyX29wcywKIAkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CiAKLQlpZiAoeGM1MDAwX2xvYWRfZndfb25fYXR0YWNoKQotCQl4YzUwMDBfaW5pdChmZSk7Ci0KIAlyZXR1cm4gZmU7CiBmYWlsOgogCW11dGV4X3VubG9jaygmeGM1MDAwX2xpc3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKaW5kZXggMGJjZDg1Mi4uNDBlYmRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCkBAIC0yLDYgKzIsMTkgQEAKICMgRFZCIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKK2NvbmZpZyBEVkJfRFlOQU1JQ19NSU5PUlMKKwlib29sICJEeW5hbWljIERWQiBtaW5vciBhbGxvY2F0aW9uIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIERWQiBzdWJzeXN0ZW0gd2lsbCB1c2UgZHluYW1pYyBtaW5vcgorCSAgYWxsb2NhdGlvbiBmb3IgYW55IGRldmljZSB0aGF0IHVzZXMgdGhlIERWQiBtYWpvciBudW1iZXIuCisJICBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBoYXZlIG1vcmUgdGhhbiA0IG9mIGEgc2luZ2xlIHR5cGUKKwkgIG9mIGRldmljZSAobGlrZSBkZW11eGVzIGFuZCBmcm9udGVuZHMpIHBlciBhZGFwdGVyLCBidXQgdWRldgorCSAgd2lsbCBiZSByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGRldmljZSBub2Rlcy4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgdGhpcywgc2F5IE4gaGVyZS4KKwogbWVudWNvbmZpZyBEVkJfQ0FQVFVSRV9EUklWRVJTCiAJYm9vbCAiRFZCL0FUU0MgYWRhcHRlcnMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCmluZGV4IGIzNDMwMWQuLmE4YzYyNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKQEAgLTE0LDYgKzE0LDcgQEAKIAlzZWxlY3QgRFZCX0lTTDY0MjEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0NYMjQxMjMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfU0lNUExFIGlmICFNRURJQV9UVU5FUl9DVVNUT01JWkUKKwlzZWxlY3QgRFZCX1RVTkVSX0NYMjQxMTMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgZGlnaXRhbCBUViByZWNlaXZlciBjaGlwIG1hZGUgYnkgQjJDMiBJbmMuIGluY2x1ZGVkIGluCiAJICBUZWNobmlzYXRzIFBDSSBjYXJkcyBhbmQgVVNCIGJveGVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L2RtMTEwNS5jCmluZGV4IGEyMWNlOWUuLmY0OGY3M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9kbTExMDUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvZG0xMTA1LmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNjgsNyArMzY3LDcgQEAKIHsKIAlkbTExMDVkdmItPnRzX2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRtMTEwNWR2Yi0+cGRldiwgNipETTExMDVfRE1BX0JZVEVTLCAmZG0xMTA1ZHZiLT5kbWFfYWRkcik7CiAKLQlyZXR1cm4gcGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRtMTEwNWR2Yi0+cGRldiwgZG0xMTA1ZHZiLT5kbWFfYWRkcik7CisJcmV0dXJuICFkbTExMDVkdmItPnRzX2J1ZjsKIH0KIAogc3RhdGljIHZvaWQgZG0xMTA1ZHZiX2RtYV91bm1hcChzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IDdhNDIxZTkuLjE3MWY5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RlcF9zaXplOwogCWludCBxdWFsaXR5OwogCXVuc2lnbmVkIGludCBjaGVja193cmFwcGVkOworCWVudW0gZHZiZmVfc2VhcmNoIGFsZ29fc3RhdHVzOwogfTsKIAogc3RhdGljIHZvaWQgZHZiX2Zyb250ZW5kX3dha2V1cChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CkBAIC01MTYsNiArNTE3LDggQEAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlmZV9zdGF0dXNfdCBzOworCWVudW0gZHZiZmVfYWxnbyBhbGdvOworCiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXM7CiAKIAlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwpAQCAtNTYyLDIzICs1NjUsODAgQEAKIAogCQkvKiBkbyBhbiBpdGVyYXRpb24gb2YgdGhlIHR1bmluZyBsb29wICovCiAJCWlmIChmZS0+b3BzLmdldF9mcm9udGVuZF9hbGdvKSB7Ci0JCQlpZiAoZmUtPm9wcy5nZXRfZnJvbnRlbmRfYWxnbyhmZSkgPT0gRkVfQUxHT19IVykgewotCQkJCS8qIGhhdmUgd2UgYmVlbiBhc2tlZCB0byByZXR1bmU/ICovCi0JCQkJcGFyYW1zID0gTlVMTDsKKwkJCWFsZ28gPSBmZS0+b3BzLmdldF9mcm9udGVuZF9hbGdvKGZlKTsKKwkJCXN3aXRjaCAoYWxnbykgeworCQkJY2FzZSBEVkJGRV9BTEdPX0hXOgorCQkJCWRwcmludGsoIiVzOiBGcm9udGVuZCBBTEdPID0gRFZCRkVfQUxHT19IV1xuIiwgX19mdW5jX18pOworCQkJCXBhcmFtcyA9IE5VTEw7IC8qIGhhdmUgd2UgYmVlbiBhc2tlZCB0byBSRVRVTkUgPyAqLworCiAJCQkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgeworCQkJCQlkcHJpbnRrKCIlczogUmV0dW5lIHJlcXVlc3RlZCwgRkVTVEFURV9SRVRVTkVcbiIsIF9fZnVuY19fKTsKIAkJCQkJcGFyYW1zID0gJmZlcHJpdi0+cGFyYW1ldGVyczsKIAkJCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfVFVORUQ7CiAJCQkJfQogCi0JCQkJZmUtPm9wcy50dW5lKGZlLCBwYXJhbXMsIGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzLCAmZmVwcml2LT5kZWxheSwgJnMpOwotCQkJCWlmIChzICE9IGZlcHJpdi0+c3RhdHVzKSB7CisJCQkJaWYgKGZlLT5vcHMudHVuZSkKKwkJCQkJZmUtPm9wcy50dW5lKGZlLCBwYXJhbXMsIGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzLCAmZmVwcml2LT5kZWxheSwgJnMpOworCisJCQkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMgJiYgIShmZXByaXYtPnR1bmVfbW9kZV9mbGFncyAmIEZFX1RVTkVfTU9ERV9PTkVTSE9UKSkgeworCQkJCQlkcHJpbnRrKCIlczogc3RhdGUgY2hhbmdlZCwgYWRkaW5nIGN1cnJlbnQgc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJCQkJZHZiX2Zyb250ZW5kX2FkZF9ldmVudChmZSwgcyk7CiAJCQkJCWZlcHJpdi0+c3RhdHVzID0gczsKIAkJCQl9Ci0JCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJCWNhc2UgRFZCRkVfQUxHT19TVzoKKwkJCQlkcHJpbnRrKCIlczogRnJvbnRlbmQgQUxHTyA9IERWQkZFX0FMR09fU1dcbiIsIF9fZnVuY19fKTsKIAkJCQlkdmJfZnJvbnRlbmRfc3d6aWd6YWcoZmUpOwotCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJCWNhc2UgRFZCRkVfQUxHT19DVVNUT006CisJCQkJcGFyYW1zID0gTlVMTDsgLyogaGF2ZSB3ZSBiZWVuIGFza2VkIHRvIFJFVFVORSA/CSovCisJCQkJZHByaW50aygiJXM6IEZyb250ZW5kIEFMR08gPSBEVkJGRV9BTEdPX0NVU1RPTSwgc3RhdGU9JWRcbiIsIF9fZnVuY19fLCBmZXByaXYtPnN0YXRlKTsKKwkJCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfUkVUVU5FKSB7CisJCQkJCWRwcmludGsoIiVzOiBSZXR1bmUgcmVxdWVzdGVkLCBGRVNUQVRfUkVUVU5FXG4iLCBfX2Z1bmNfXyk7CisJCQkJCXBhcmFtcyA9ICZmZXByaXYtPnBhcmFtZXRlcnM7CisJCQkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOworCQkJCX0KKwkJCQkvKiBDYXNlIHdoZXJlIHdlIGFyZSBnb2luZyB0byBzZWFyY2ggZm9yIGEgY2FycmllcgorCQkJCSAqIFVzZXIgYXNrZWQgdXMgdG8gcmV0dW5lIGFnYWluIGZvciBzb21lIHJlYXNvbiwgcG9zc2libHkKKwkJCQkgKiByZXF1ZXN0aW5nIGEgc2VhcmNoIHdpdGggYSBuZXcgc2V0IG9mIHBhcmFtZXRlcnMKKwkJCQkgKi8KKwkJCQlpZiAoZmVwcml2LT5hbGdvX3N0YXR1cyAmIERWQkZFX0FMR09fU0VBUkNIX0FHQUlOKSB7CisJCQkJCWlmIChmZS0+b3BzLnNlYXJjaCkgeworCQkJCQkJZmVwcml2LT5hbGdvX3N0YXR1cyA9IGZlLT5vcHMuc2VhcmNoKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKKwkJCQkJCS8qIFdlIGRpZCBkbyBhIHNlYXJjaCBhcyB3YXMgcmVxdWVzdGVkLCB0aGUgZmxhZ3MgYXJlCisJCQkJCQkgKiBub3cgdW5zZXQgYXMgd2VsbCBhbmQgaGFzIHRoZSBmbGFncyB3cnQgdG8gc2VhcmNoLgorCQkJCQkJICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQlmZXByaXYtPmFsZ29fc3RhdHVzICY9IH5EVkJGRV9BTEdPX1NFQVJDSF9BR0FJTjsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBUcmFjayB0aGUgY2FycmllciBpZiB0aGUgc2VhcmNoIHdhcyBzdWNjZXNzZnVsICovCisJCQkJaWYgKGZlcHJpdi0+YWxnb19zdGF0dXMgPT0gRFZCRkVfQUxHT19TRUFSQ0hfU1VDQ0VTUykgeworCQkJCQlpZiAoZmUtPm9wcy50cmFjaykKKwkJCQkJCWZlLT5vcHMudHJhY2soZmUsICZmZXByaXYtPnBhcmFtZXRlcnMpOworCQkJCX0gZWxzZSB7CisJCQkJCWZlcHJpdi0+YWxnb19zdGF0dXMgfD0gRFZCRkVfQUxHT19TRUFSQ0hfQUdBSU47CisJCQkJCWZlcHJpdi0+ZGVsYXkgPSBIWiAvIDI7CisJCQkJfQorCQkJCWZlLT5vcHMucmVhZF9zdGF0dXMoZmUsICZzKTsKKwkJCQlpZiAocyAhPSBmZXByaXYtPnN0YXR1cykgeworCQkJCQlkdmJfZnJvbnRlbmRfYWRkX2V2ZW50KGZlLCBzKTsgLyogdXBkYXRlIGV2ZW50IGxpc3QgKi8KKwkJCQkJZmVwcml2LT5zdGF0dXMgPSBzOworCQkJCQlpZiAoIShzICYgRkVfSEFTX0xPQ0spKSB7CisJCQkJCQlmZXByaXYtPmRlbGF5ID0gSFogLyAxMDsKKwkJCQkJCWZlcHJpdi0+YWxnb19zdGF0dXMgfD0gRFZCRkVfQUxHT19TRUFSQ0hfQUdBSU47CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmZXByaXYtPmRlbGF5ID0gNjAgKiBIWjsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZHByaW50aygiJXM6IFVOREVGSU5FRCBBTEdPICFcbiIsIF9fZnVuY19fKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZyhmZSk7CisJCX0KIAl9CiAKIAlpZiAoZHZiX3Bvd2VyZG93bl9vbl9zbGVlcCkgewpAQCAtMTIyNiw2ICsxMjg2LDkgQEAKIAkJZHByaW50aygiJXMoKSBGaW5hbGlzZWQgcHJvcGVydHkgY2FjaGVcbiIsIF9fZnVuY19fKTsKIAkJZHR2X3Byb3BlcnR5X2NhY2hlX3N1Ym1pdChmZSk7CiAKKwkJLyogUmVxdWVzdCB0aGUgc2VhcmNoIGFsZ29yaXRobSB0byBzZWFyY2ggKi8KKwkJZmVwcml2LT5hbGdvX3N0YXR1cyB8PSBEVkJGRV9BTEdPX1NFQVJDSF9BR0FJTjsKKwogCQlyIHw9IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koaW5vZGUsIGZpbGUsIEZFX1NFVF9GUk9OVEVORCwKIAkJCSZmZXByaXYtPnBhcmFtZXRlcnMpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKaW5kZXggZGI0YTYzYi4uZTE3NmRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmgKQEAgLTY5LDYgKzY5LDEyNSBAQAogCXU2NCBzdGQ7CiB9OwogCitlbnVtIGR2YmZlX21vZGNvZCB7CisJRFZCRkVfTU9EQ09EX0RVTU1ZX1BMRlJBTUUJPSAwLAorCURWQkZFX01PRENPRF9RUFNLXzFfNCwKKwlEVkJGRV9NT0RDT0RfUVBTS18xXzMsCisJRFZCRkVfTU9EQ09EX1FQU0tfMl81LAorCURWQkZFX01PRENPRF9RUFNLXzFfMiwKKwlEVkJGRV9NT0RDT0RfUVBTS18zXzUsCisJRFZCRkVfTU9EQ09EX1FQU0tfMl8zLAorCURWQkZFX01PRENPRF9RUFNLXzNfNCwKKwlEVkJGRV9NT0RDT0RfUVBTS180XzUsCisJRFZCRkVfTU9EQ09EX1FQU0tfNV82LAorCURWQkZFX01PRENPRF9RUFNLXzhfOSwKKwlEVkJGRV9NT0RDT0RfUVBTS185XzEwLAorCURWQkZFX01PRENPRF84UFNLXzNfNSwKKwlEVkJGRV9NT0RDT0RfOFBTS18yXzMsCisJRFZCRkVfTU9EQ09EXzhQU0tfM180LAorCURWQkZFX01PRENPRF84UFNLXzVfNiwKKwlEVkJGRV9NT0RDT0RfOFBTS184XzksCisJRFZCRkVfTU9EQ09EXzhQU0tfOV8xMCwKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzJfMywKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzNfNCwKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzRfNSwKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzVfNiwKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzhfOSwKKwlEVkJGRV9NT0RDT0RfMTZBUFNLXzlfMTAsCisJRFZCRkVfTU9EQ09EXzMyQVBTS18zXzQsCisJRFZCRkVfTU9EQ09EXzMyQVBTS180XzUsCisJRFZCRkVfTU9EQ09EXzMyQVBTS181XzYsCisJRFZCRkVfTU9EQ09EXzMyQVBTS184XzksCisJRFZCRkVfTU9EQ09EXzMyQVBTS185XzEwLAorCURWQkZFX01PRENPRF9SRVNFUlZFRF8xLAorCURWQkZFX01PRENPRF9CUFNLXzFfMywKKwlEVkJGRV9NT0RDT0RfQlBTS18xXzQsCisJRFZCRkVfTU9EQ09EX1JFU0VSVkVEXzIKK307CisKK2VudW0gdHVuZXJfcGFyYW0geworCURWQkZFX1RVTkVSX0ZSRVFVRU5DWQkJPSAoMSA8PCAgMCksCisJRFZCRkVfVFVORVJfVFVORVJTVEVQCQk9ICgxIDw8ICAxKSwKKwlEVkJGRV9UVU5FUl9JRkZSRVEJCT0gKDEgPDwgIDIpLAorCURWQkZFX1RVTkVSX0JBTkRXSURUSAkJPSAoMSA8PCAgMyksCisJRFZCRkVfVFVORVJfUkVGQ0xPQ0sJCT0gKDEgPDwgIDQpLAorCURWQkZFX1RVTkVSX0lRU0VOU0UJCT0gKDEgPDwgIDUpLAorCURWQkZFX1RVTkVSX0RVTU1ZCQk9ICgxIDw8IDMxKQorfTsKKworLyoKKyAqIEFMR09fSFc6IChIYXJkd2FyZSBBbGdvcml0aG0pCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXZpY2VzIHRoYXQgc3VwcG9ydCB0aGlzIGFsZ29yaXRobSBkbyBldmVyeXRoaW5nIGluIGhhcmR3YXJlCisgKiBhbmQgbm8gc29mdHdhcmUgc3VwcG9ydCBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoZW0uCisgKiBSZXF1ZXN0aW5nIHRoZXNlIGRldmljZXMgdG8gTE9DSyBpcyB0aGUgb25seSB0aGluZyByZXF1aXJlZCwKKyAqIGRldmljZSBpcyBzdXBwb3NlZCB0byBkbyBldmVyeXRoaW5nIGluIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBBTEdPX1NXOiAoU29mdHdhcmUgQWxnb3JpdGhtKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlc2UgYXJlIGR1bWIgZGV2aWNlcywgdGhhdCByZXF1aXJlIHNvZnR3YXJlIHRvIGRvIGV2ZXJ5dGhpbmcKKyAqCisgKiBBTEdPX0NVU1RPTTogKEN1c3RvbWl6YWJsZSBBZ29yaXRobSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERldmljZXMgaGF2aW5nIHRoaXMgYWxnb3JpdGhtIGNhbiBiZSBjdXN0b21pemVkIHRvIGhhdmUgc3BlY2lmaWMKKyAqIGFsZ29yaXRobXMgaW4gdGhlIGZyb250ZW5kIGRyaXZlciwgcmF0aGVyIHRoYW4gc2ltcGx5IGRvaW5nIGEKKyAqIHNvZnR3YXJlIHppZy16YWcuIEluIHRoaXMgY2FzZSB0aGUgemlnemFnIG1heWJlIGhhcmR3YXJlIGFzc2lzdGVkCisgKiBvciBpdCBtYXliZSBjb21wbGV0ZWx5IGRvbmUgaW4gaGFyZHdhcmUuIEluIGFsbCBjYXNlcywgdXNhZ2Ugb2YKKyAqIHRoaXMgYWxnb3JpdGhtLCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzZWFyY2ggYW5kIHRyYWNrCisgKiBjYWxsYmFja3MsIHV0aWxpemVzIHRoZSBkcml2ZXIgc3BlY2lmaWMgYWxnb3JpdGhtLgorICoKKyAqIEFMR09fUkVDT1ZFUlk6IChSZWNvdmVyeSBBbGdvcml0aG0pCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGVzZSBkZXZpY2VzIGhhdmUgQVVUTyByZWNvdmVyeSBjYXBhYmlsaXRpZXMgZnJvbSBMT0NLIGZhaWx1cmUKKyAqLworZW51bSBkdmJmZV9hbGdvIHsKKwlEVkJGRV9BTEdPX0hXCQkJPSAoMSA8PCAgMCksCisJRFZCRkVfQUxHT19TVwkJCT0gKDEgPDwgIDEpLAorCURWQkZFX0FMR09fQ1VTVE9NCQk9ICgxIDw8ICAyKSwKKwlEVkJGRV9BTEdPX1JFQ09WRVJZCQk9ICgxIDw8IDMxKQorfTsKKworc3RydWN0IHR1bmVyX3N0YXRlIHsKKwl1MzIgZnJlcXVlbmN5OworCXUzMiB0dW5lcnN0ZXA7CisJdTMyIGlmcmVxOworCXUzMiBiYW5kd2lkdGg7CisJdTMyIGlxc2Vuc2U7CisJdTMyIHJlZmNsb2NrOworfTsKKworLyoKKyAqIHNlYXJjaCBjYWxsYmFjayBwb3NzaWJsZSByZXR1cm4gc3RhdHVzCisgKgorICogRFZCRkVfQUxHT19TRUFSQ0hfU1VDQ0VTUworICogVGhlIGZyb250ZW5kIHNlYXJjaCBhbGdvcml0aG0gY29tcGxldGVkIGFuZCByZXR1cm5lZCBzdWNjZXNmdWxseQorICoKKyAqIERWQkZFX0FMR09fU0VBUkNIX0FTTEVFUAorICogVGhlIGZyb250ZW5kIHNlYXJjaCBhbGdvcml0aG0gaXMgc2xlZXBpbmcKKyAqCisgKiBEVkJGRV9BTEdPX1NFQVJDSF9GQUlMRUQKKyAqIFRoZSBmcm9udGVuZCBzZWFyY2ggZm9yIGEgc2lnbmFsIGZhaWxlZAorICoKKyAqIERWQkZFX0FMR09fU0VBUkNIX0lOVkFMSUQKKyAqIFRoZSBmcm9udGVuZCBzZWFyY2ggYWxnb3JpdGggd2FzIHByb2JhYmx5IHN1cHBsaWVkIHdpdGggaW52YWxpZAorICogcGFyYW1ldGVycyBhbmQgdGhlIHNlYXJjaCBpcyBhbiBpbnZhbGlkIG9uZQorICoKKyAqIERWQkZFX0FMR09fU0VBUkNIX0VSUk9SCisgKiBUaGUgZnJvbnRlbmQgc2VhcmNoIGFsZ29yaXRobSBmYWlsZWQgZHVlIHRvIHNvbWUgZXJyb3IKKyAqCisgKiBEVkJGRV9BTEdPX1NFQVJDSF9BR0FJTgorICogVGhlIGZyb250ZW5kIHNlYXJjaCBhbGdvcml0aG0gd2FzIHJlcXVlc3RlZCB0byBzZWFyY2ggYWdhaW4KKyAqLworZW51bSBkdmJmZV9zZWFyY2ggeworCURWQkZFX0FMR09fU0VBUkNIX1NVQ0NFU1MJPSAoMSA8PCAgMCksCisJRFZCRkVfQUxHT19TRUFSQ0hfQVNMRUVQCT0gKDEgPDwgIDEpLAorCURWQkZFX0FMR09fU0VBUkNIX0ZBSUxFRAk9ICgxIDw8ICAyKSwKKwlEVkJGRV9BTEdPX1NFQVJDSF9JTlZBTElECT0gKDEgPDwgIDMpLAorCURWQkZFX0FMR09fU0VBUkNIX0FHQUlOCQk9ICgxIDw8ICA0KSwKKwlEVkJGRV9BTEdPX1NFQVJDSF9FUlJPUgkJPSAoMSA8PCAzMSksCit9OworCisKIHN0cnVjdCBkdmJfdHVuZXJfb3BzIHsKIAogCXN0cnVjdCBkdmJfdHVuZXJfaW5mbyBpbmZvOwpAQCAtOTksNiArMjE4LDEzIEBACiAJICogdHVuZXJzIHdoaWNoIHJlcXVpcmUgc29waGlzdGljYXRlZCB0dW5pbmcgbG9vcHMsIGNvbnRyb2xsaW5nIGVhY2ggcGFyYW1ldGVyIHNlcGVyYXRlbHkuICovCiAJaW50ICgqc2V0X2ZyZXF1ZW5jeSkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBmcmVxdWVuY3kpOwogCWludCAoKnNldF9iYW5kd2lkdGgpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgYmFuZHdpZHRoKTsKKworCS8qCisJICogVGhlc2UgYXJlIHByb3ZpZGVkIHNlcGVyYXRlbHkgZnJvbSBzZXRfcGFyYW1zIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgc2lsaWNvbgorCSAqIHR1bmVycyB3aGljaCByZXF1aXJlIHNvcGhpc3RpY2F0ZWQgdHVuaW5nIGxvb3BzLCBjb250cm9sbGluZyBlYWNoIHBhcmFtZXRlciBzZXBlcmF0ZWx5LgorCSAqLworCWludCAoKnNldF9zdGF0ZSkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGVudW0gdHVuZXJfcGFyYW0gcGFyYW0sIHN0cnVjdCB0dW5lcl9zdGF0ZSAqc3RhdGUpOworCWludCAoKmdldF9zdGF0ZSkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGVudW0gdHVuZXJfcGFyYW0gcGFyYW0sIHN0cnVjdCB0dW5lcl9zdGF0ZSAqc3RhdGUpOwogfTsKIAogc3RydWN0IGFuYWxvZ19kZW1vZF9pbmZvIHsKQEAgLTE0Miw3ICsyNjgsNyBAQAogCQkgICAgdW5zaWduZWQgaW50ICpkZWxheSwKIAkJICAgIGZlX3N0YXR1c190ICpzdGF0dXMpOwogCS8qIGdldCBmcm9udGVuZCB0dW5pbmcgYWxnb3JpdGhtIGZyb20gdGhlIG1vZHVsZSAqLwotCWludCAoKmdldF9mcm9udGVuZF9hbGdvKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CisJZW51bSBkdmJmZV9hbGdvICgqZ2V0X2Zyb250ZW5kX2FsZ28pKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKIAogCS8qIHRoZXNlIHR3byBhcmUgb25seSB1c2VkIGZvciB0aGUgc3d6aWd6YWcgY29kZSAqLwogCWludCAoKnNldF9mcm9udGVuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKQEAgLTE2Nyw2ICsyOTMsMTIgQEAKIAlpbnQgKCppMmNfZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSk7CiAJaW50ICgqdHNfYnVzX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgYWNxdWlyZSk7CiAKKwkvKiBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciBkZXZpY2VzIHRoYXQgaW1wbGVtZW50IHRoZWlyIG93bgorCSAqIHR1bmluZyBhbGdvcml0aG1zLCByYXRoZXIgdGhhbiBhIHNpbXBsZSBzd3ppZ3phZworCSAqLworCWVudW0gZHZiZmVfc2VhcmNoICgqc2VhcmNoKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKTsKKwlpbnQgKCp0cmFjaykoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCk7CisKIAlzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0dW5lcl9vcHM7CiAJc3RydWN0IGFuYWxvZ19kZW1vZF9vcHMgYW5hbG9nX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwppbmRleCBhMTEzNzQ0Li42YzU3MWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwpAQCAtNTAsMzMgKzUwLDI3IEBACiAJIm5ldCIsICJvc2QiCiB9OwogCisjaWZkZWYgQ09ORklHX0RWQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBNQVhfRFZCX01JTk9SUwkJMjU2CisjZGVmaW5lIERWQl9NQVhfSURTCQlNQVhfRFZCX01JTk9SUworI2Vsc2UKICNkZWZpbmUgRFZCX01BWF9JRFMJCTQKICNkZWZpbmUgbnVtczJtaW5vcihudW0sdHlwZSxpZCkJKChudW0gPDwgNikgfCAoaWQgPDwgNCkgfCB0eXBlKQogI2RlZmluZSBNQVhfRFZCX01JTk9SUwkJKERWQl9NQVhfQURBUFRFUlMqNjQpCisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqZHZiX2NsYXNzOwogCi1zdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UqIGR2YmRldl9maW5kX2RldmljZSAoaW50IG1pbm9yKQotewotCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmR2Yl9hZGFwdGVyX2xpc3QsIGxpc3RfaGVhZCkgewotCQlzdHJ1Y3QgZHZiX2RldmljZSAqZGV2OwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmFkYXAtPmRldmljZV9saXN0LCBsaXN0X2hlYWQpCi0JCQlpZiAobnVtczJtaW5vcihhZGFwLT5udW0sIGRldi0+dHlwZSwgZGV2LT5pZCkgPT0gbWlub3IpCi0JCQkJcmV0dXJuIGRldjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQorc3RhdGljIHN0cnVjdCBkdmJfZGV2aWNlICpkdmJfbWlub3JzW01BWF9EVkJfTUlOT1JTXTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKG1pbm9yX3J3c2VtKTsKIAogc3RhdGljIGludCBkdmJfZGV2aWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKIAogCWxvY2tfa2VybmVsKCk7Ci0JZHZiZGV2ID0gZHZiZGV2X2ZpbmRfZGV2aWNlIChpbWlub3IoaW5vZGUpKTsKKwlkb3duX3JlYWQoJm1pbm9yX3J3c2VtKTsKKwlkdmJkZXYgPSBkdmJfbWlub3JzW2ltaW5vcihpbm9kZSldOwogCiAJaWYgKGR2YmRldiAmJiBkdmJkZXYtPmZvcHMpIHsKIAkJaW50IGVyciA9IDA7CkBAIC05Miw5ICs4NiwxMSBAQAogCQkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKIAkJfQogCQlmb3BzX3B1dChvbGRfZm9wcyk7CisJCXVwX3JlYWQoJm1pbm9yX3J3c2VtKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KKwl1cF9yZWFkKCZtaW5vcl9yd3NlbSk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAtRU5PREVWOwogfQpAQCAtMTkyLDYgKzE4OCw3IEBACiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpkdmJkZXZmb3BzOwogCXN0cnVjdCBkZXZpY2UgKmNsc2RldjsKKwlpbnQgbWlub3I7CiAJaW50IGlkOwogCiAJbXV0ZXhfbG9jaygmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOwpAQCAtMjMxLDExICsyMjgsMzEgQEAKIAogCWxpc3RfYWRkX3RhaWwgKCZkdmJkZXYtPmxpc3RfaGVhZCwgJmFkYXAtPmRldmljZV9saXN0KTsKIAorCWRvd25fd3JpdGUoJm1pbm9yX3J3c2VtKTsKKyNpZmRlZiBDT05GSUdfRFZCX0RZTkFNSUNfTUlOT1JTCisJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgTUFYX0RWQl9NSU5PUlM7IG1pbm9yKyspCisJCWlmIChkdmJfbWlub3JzW21pbm9yXSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwlpZiAobWlub3IgPT0gTUFYX0RWQl9NSU5PUlMpIHsKKwkJa2ZyZWUoZHZiZGV2Zm9wcyk7CisJCWtmcmVlKGR2YmRldik7CisJCW11dGV4X3VubG9jaygmZHZiZGV2X3JlZ2lzdGVyX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZWxzZQorCW1pbm9yID0gbnVtczJtaW5vcihhZGFwLT5udW0sIHR5cGUsIGlkKTsKKyNlbmRpZgorCisJZHZiZGV2LT5taW5vciA9IG1pbm9yOworCWR2Yl9taW5vcnNbbWlub3JdID0gZHZiZGV2OworCXVwX3dyaXRlKCZtaW5vcl9yd3NlbSk7CisKIAltdXRleF91bmxvY2soJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKIAogCWNsc2RldiA9IGRldmljZV9jcmVhdGUoZHZiX2NsYXNzLCBhZGFwLT5kZXZpY2UsCi0JCQkgICAgICAgTUtERVYoRFZCX01BSk9SLCBudW1zMm1pbm9yKGFkYXAtPm51bSwgdHlwZSwgaWQpKSwKLQkJCSAgICAgICBOVUxMLCAiZHZiJWQuJXMlZCIsIGFkYXAtPm51bSwgZG5hbWVzW3R5cGVdLCBpZCk7CisJCQkgICAgICAgTUtERVYoRFZCX01BSk9SLCBtaW5vciksCisJCQkgICAgICAgZHZiZGV2LCAiZHZiJWQuJXMlZCIsIGFkYXAtPm51bSwgZG5hbWVzW3R5cGVdLCBpZCk7CiAJaWYgKElTX0VSUihjbHNkZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGR2YiVkLiVzJWQgKCVsZClcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgYWRhcC0+bnVtLCBkbmFtZXNbdHlwZV0sIGlkLCBQVFJfRVJSKGNsc2RldikpOwpAQCAtMjQzLDggKzI2MCw3IEBACiAJfQogCiAJZHByaW50ayhLRVJOX0RFQlVHICJEVkI6IHJlZ2lzdGVyIGFkYXB0ZXIlZC8lcyVkIEAgbWlub3I6ICVpICgweCUwMngpXG4iLAotCQlhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQsIG51bXMybWlub3IoYWRhcC0+bnVtLCB0eXBlLCBpZCksCi0JCW51bXMybWlub3IoYWRhcC0+bnVtLCB0eXBlLCBpZCkpOworCQlhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQsIG1pbm9yLCBtaW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1Niw4ICsyNzIsMTEgQEAKIAlpZiAoIWR2YmRldikKIAkJcmV0dXJuOwogCi0JZGV2aWNlX2Rlc3Ryb3koZHZiX2NsYXNzLCBNS0RFVihEVkJfTUFKT1IsIG51bXMybWlub3IoZHZiZGV2LT5hZGFwdGVyLT5udW0sCi0JCSAgICAgICBkdmJkZXYtPnR5cGUsIGR2YmRldi0+aWQpKSk7CisJZG93bl93cml0ZSgmbWlub3JfcndzZW0pOworCWR2Yl9taW5vcnNbZHZiZGV2LT5taW5vcl0gPSBOVUxMOworCXVwX3dyaXRlKCZtaW5vcl9yd3NlbSk7CisKKwlkZXZpY2VfZGVzdHJveShkdmJfY2xhc3MsIE1LREVWKERWQl9NQUpPUiwgZHZiZGV2LT5taW5vcikpOwogCiAJbGlzdF9kZWwgKCZkdmJkZXYtPmxpc3RfaGVhZCk7CiAJa2ZyZWUgKGR2YmRldi0+Zm9wcyk7CkBAIC00MTMsNiArNDMyLDE1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBkdmJfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWFkZF91ZXZlbnRfdmFyKGVudiwgIkRWQl9ERVZJQ0VfTlVNPSVkIiwgZHZiZGV2LT5pZCk7CisJYWRkX3VldmVudF92YXIoZW52LCAiRFZCX0FEQVBURVJfTlVNPSVkIiwgZHZiZGV2LT5hZGFwdGVyLT5udW0pOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2R2YmRldih2b2lkKQogewogCWludCByZXR2YWw7CkBAIC00MzQsNiArNDYyLDcgQEAKIAkJcmV0dmFsID0gUFRSX0VSUihkdmJfY2xhc3MpOwogCQlnb3RvIGVycm9yOwogCX0KKwlkdmJfY2xhc3MtPmRldl91ZXZlbnQgPSBkdmJfdWV2ZW50OwogCXJldHVybiAwOwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKaW5kZXggNTc0ZTMzNi4uZGNhNDljZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmgKQEAgLTc0LDYgKzc0LDcgQEAKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOwogCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcHRlcjsKIAlpbnQgdHlwZTsKKwlpbnQgbWlub3I7CiAJdTMyIGlkOwogCiAJLyogaW4gdGhlb3J5LCAndXNlcnMnIGNhbiB2YW5pc2ggbm93LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKaW5kZXggZTlhYjAyNC4uZTFlOWFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCkBAIC03MzMsOSArNzMzLDE5IEBACiAJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZV9zaXplID0KIAkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X2lyX3RhYmxlX215Z2ljdHYpOwogCQkJCWJyZWFrOworCQkJY2FzZSBBRjkwMTVfUkVNT1RFX0RJR0lUVFJBREVfRFZCX1Q6CisJCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0ucmNfa2V5X21hcCA9CisJCQkJICBhZjkwMTVfcmNfa2V5c19kaWdpdHRyYWRlOworCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9yY19rZXlzX2RpZ2l0dHJhZGUpOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGUgPQorCQkJCSAgYWY5MDE1X2lyX3RhYmxlX2RpZ2l0dHJhZGU7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZV9zaXplID0KKwkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X2lyX3RhYmxlX2RpZ2l0dHJhZGUpOworCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewotCQkJc3dpdGNoICh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSB7CisJCQlzd2l0Y2ggKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpKSB7CiAJCQljYXNlIFVTQl9WSURfTEVBRFRFSzoKIAkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0KIAkJCQkgIGFmOTAxNV9yY19rZXlzX2xlYWR0ZWs7CkBAIC03NDgsNyArNzU4LDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgVVNCX1ZJRF9WSVNJT05QTFVTOgogCQkJCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PQotCQkJCVVTQl9QSURfQVpVUkVXQVZFX0FEX1RVNzAwKSB7CisJCQkJY3B1X3RvX2xlMTYoVVNCX1BJRF9BWlVSRVdBVkVfQURfVFU3MDApKSB7CiAJCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQogCQkJCQkgIGFmOTAxNV9yY19rZXlzX3R3aW5oYW47CiAJCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CkBAIC04MDAsNiArODEwLDE2IEBACiAJCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfaXJfdGFibGVfbXNpKTsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9WSURfQVZFUk1FRElBOgorCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQorCQkJCSAgYWY5MDE1X3JjX2tleXNfYXZlcm1lZGlhOworCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9yY19rZXlzX2F2ZXJtZWRpYSk7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9CisJCQkJICBhZjkwMTVfaXJfdGFibGVfYXZlcm1lZGlhOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9hdmVybWVkaWEpOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQpAQCAtMTE5MSw2ICsxMjExLDcgQEAKIAl7VVNCX0RFVklDRShVU0JfVklEX1RFTEVTVEFSLCAgVVNCX1BJRF9URUxFU1RBUl9TVEFSU1RJQ0tfMil9LAogCXtVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9BMzA5KX0sCiAvKiAxNSAqL3tVU0JfREVWSUNFKFVTQl9WSURfTVNJXzIsICAgICBVU0JfUElEX01TSV9ESUdJX1ZPWF9NSU5JX0lJSSl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX0tXT1JMRF8zOTVVKX0sCiAJezB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhZjkwMTVfdXNiX3RhYmxlKTsKQEAgLTEzNDMsNyArMTM2NCw3IEBACiAKIAkJLmkyY19hbGdvID0gJmFmOTAxNV9pMmNfYWxnbywKIAotCQkubnVtX2RldmljZV9kZXNjcyA9IDYsCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gNywKIAkJLmRldmljZXMgPSB7CiAJCQl7CiAJCQkJLm5hbWUgPSAiWHRlbnNpb25zIFhELTM4MCIsCkBAIC0xMzc1LDYgKzEzOTYsMTIgQEAKIAkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMTVdLCBOVUxMfSwKIAkJCQkud2FybV9pZHMgPSB7TlVMTH0sCiAJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIktXb3JsZCBVU0IgRFZCLVQgVFYgU3RpY2sgSUkgIiBcCisJCQkJCSIoVlMtRFZCLVQgMzk1VSkiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVsxNl0sIE5VTEx9LAorCQkJCS53YXJtX2lkcyA9IHtOVUxMfSwKKwkJCX0sCiAJCX0KIAl9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKaW5kZXggNmMzYzk3Mi4uMjFjNzc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCkBAIC0xMjMsNiArMTIzLDcgQEAKIAlBRjkwMTVfUkVNT1RFX0FfTElOS19EVFVfTSwKIAlBRjkwMTVfUkVNT1RFX01TSV9ESUdJVk9YX01JTklfSUlfVjMsCiAJQUY5MDE1X1JFTU9URV9NWUdJQ1RWX1U3MTgsCisJQUY5MDE1X1JFTU9URV9ESUdJVFRSQURFX0RWQl9ULAogfTsKIAogLyogTGVhZHRlayBXaW5GYXN0IERUViBEb25nbGUgR29sZCAqLwpAQCAtNTIwLDQgKzUyMSwxNDMgQEAKIAkweDg2LCAweDZiLCAweDIzLCAweGRjLCAweDQ1LCAweDA3LCAweDAwLAogfTsKIAorLyogQXZlck1lZGlhIFZvbGFyIFggKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgYWY5MDE1X3JjX2tleXNfYXZlcm1lZGlhW10gPSB7CisJeyAweDA1LCAweDNkLCBLRVlfUFJPRzEgfSwgICAgICAgLyogU09VUkNFICovCisJeyAweDA1LCAweDEyLCBLRVlfUE9XRVIgfSwgICAgICAgLyogUE9XRVIgKi8KKwl7IDB4MDUsIDB4MWUsIEtFWV8xIH0sICAgICAgICAgICAvKiAxICovCisJeyAweDA1LCAweDFmLCBLRVlfMiB9LCAgICAgICAgICAgLyogMiAqLworCXsgMHgwNSwgMHgyMCwgS0VZXzMgfSwgICAgICAgICAgIC8qIDMgKi8KKwl7IDB4MDUsIDB4MjEsIEtFWV80IH0sICAgICAgICAgICAvKiA0ICovCisJeyAweDA1LCAweDIyLCBLRVlfNSB9LCAgICAgICAgICAgLyogNSAqLworCXsgMHgwNSwgMHgyMywgS0VZXzYgfSwgICAgICAgICAgIC8qIDYgKi8KKwl7IDB4MDUsIDB4MjQsIEtFWV83IH0sICAgICAgICAgICAvKiA3ICovCisJeyAweDA1LCAweDI1LCBLRVlfOCB9LCAgICAgICAgICAgLyogOCAqLworCXsgMHgwNSwgMHgyNiwgS0VZXzkgfSwgICAgICAgICAgIC8qIDkgKi8KKwl7IDB4MDUsIDB4M2YsIEtFWV9MRUZUIH0sICAgICAgICAvKiBMIC8gRElTUExBWSAqLworCXsgMHgwNSwgMHgyNywgS0VZXzAgfSwgICAgICAgICAgIC8qIDAgKi8KKwl7IDB4MDUsIDB4MGYsIEtFWV9SSUdIVCB9LCAgICAgICAvKiBSIC8gQ0ggUlROICovCisJeyAweDA1LCAweDE4LCBLRVlfUFJPRzIgfSwgICAgICAgLyogU05BUCBTSE9UICovCisJeyAweDA1LCAweDFjLCBLRVlfUFJPRzMgfSwgICAgICAgLyogMTYtQ0ggUFJFViAqLworCXsgMHgwNSwgMHgyZCwgS0VZX1ZPTFVNRURPV04gfSwgIC8qIFZPTCBET1dOICovCisJeyAweDA1LCAweDNlLCBLRVlfWk9PTSB9LCAgICAgICAgLyogRlVMTCBTQ1JFRU4gKi8KKwl7IDB4MDUsIDB4MmUsIEtFWV9WT0xVTUVVUCB9LCAgICAvKiBWT0wgVVAgKi8KKwl7IDB4MDUsIDB4MTAsIEtFWV9NVVRFIH0sICAgICAgICAvKiBNVVRFICovCisJeyAweDA1LCAweDA0LCBLRVlfQVVESU8gfSwgICAgICAgLyogQVVESU8gKi8KKwl7IDB4MDUsIDB4MTUsIEtFWV9SRUNPUkQgfSwgICAgICAvKiBSRUNPUkQgKi8KKwl7IDB4MDUsIDB4MTEsIEtFWV9QTEFZIH0sICAgICAgICAvKiBQTEFZICovCisJeyAweDA1LCAweDE2LCBLRVlfU1RPUCB9LCAgICAgICAgLyogU1RPUCAqLworCXsgMHgwNSwgMHgwYywgS0VZX1BMQVlQQVVTRSB9LCAgIC8qIFRJTUVTSElGVCAvIFBBVVNFICovCisJeyAweDA1LCAweDA1LCBLRVlfQkFDSyB9LCAgICAgICAgLyogPDwgLyBSRUQgKi8KKwl7IDB4MDUsIDB4MDksIEtFWV9GT1JXQVJEIH0sICAgICAvKiA+PiAvIFlFTExPVyAqLworCXsgMHgwNSwgMHgxNywgS0VZX1RFWFQgfSwgICAgICAgIC8qIFRFTEVURVhUICovCisJeyAweDA1LCAweDBhLCBLRVlfRVBHIH0sICAgICAgICAgLyogRVBHICovCisJeyAweDA1LCAweDEzLCBLRVlfTUVOVSB9LCAgICAgICAgLyogTUVOVSAqLworCisJeyAweDA1LCAweDBlLCBLRVlfQ0hBTk5FTFVQIH0sICAgLyogQ0ggVVAgKi8KKwl7IDB4MDUsIDB4MGQsIEtFWV9DSEFOTkVMRE9XTiB9LCAvKiBDSCBET1dOICovCisJeyAweDA1LCAweDE5LCBLRVlfRklSU1QgfSwgICAgICAgLyogfDw8IC8gR1JFRU4gKi8KKwl7IDB4MDUsIDB4MDgsIEtFWV9MQVNUIH0sICAgICAgICAvKiA+PnwgLyBCTFVFICovCit9OworCitzdGF0aWMgdTggYWY5MDE1X2lyX3RhYmxlX2F2ZXJtZWRpYVtdID0geworCTB4MDIsIDB4ZmQsIDB4MDAsIDB4ZmYsIDB4MTIsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgwMSwgMHhmZSwgMHgzZCwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDAzLCAweGZjLCAweDE3LCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MDQsIDB4ZmIsIDB4MGEsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgwNSwgMHhmYSwgMHgxZSwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDA2LCAweGY5LCAweDFmLCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MDcsIDB4ZjgsIDB4MjAsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgwOSwgMHhmNiwgMHgyMSwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDBhLCAweGY1LCAweDIyLCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MGIsIDB4ZjQsIDB4MjMsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgwZCwgMHhmMiwgMHgyNCwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDBlLCAweGYxLCAweDI1LCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MGYsIDB4ZjAsIDB4MjYsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxMSwgMHhlZSwgMHgyNywgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDA4LCAweGY3LCAweDA0LCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MGMsIDB4ZjMsIDB4M2UsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxMCwgMHhlZiwgMHgxYywgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDEyLCAweGVkLCAweDNmLCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MTMsIDB4ZWMsIDB4MGYsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxNCwgMHhlYiwgMHgxMCwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDE1LCAweGVhLCAweDEzLCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MTcsIDB4ZTgsIDB4MTgsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxOCwgMHhlNywgMHgxMSwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDE5LCAweGU2LCAweDE1LCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MWEsIDB4ZTUsIDB4MGMsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxYiwgMHhlNCwgMHgxNiwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDFjLCAweGUzLCAweDA5LCAweDA1LCAweDAwLAorCTB4MDIsIDB4ZmQsIDB4MWQsIDB4ZTIsIDB4MDUsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHhmZCwgMHgxZSwgMHhlMSwgMHgyZCwgMHgwNSwgMHgwMCwKKwkweDAyLCAweGZkLCAweDFmLCAweGUwLCAweDJlLCAweDA1LCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDAsIDB4ZmYsIDB4MDgsIDB4MDUsIDB4MDAsCisJMHgwMywgMHhmYywgMHgwMSwgMHhmZSwgMHgxOSwgMHgwNSwgMHgwMCwKKwkweDAzLCAweGZjLCAweDAyLCAweGZkLCAweDBkLCAweDA1LCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDMsIDB4ZmMsIDB4MGUsIDB4MDUsIDB4MDAsCit9OworCisvKiBEaWdpdHRyYWRlIERWQi1UIFVTQiBTdGljayAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBhZjkwMTVfcmNfa2V5c19kaWdpdHRyYWRlW10gPSB7CisJeyAweDAxLCAweDBmLCBLRVlfTEFTVCB9LAkvKiBSRVRVUk4gKi8KKwl7IDB4MDUsIDB4MTcsIEtFWV9URVhUIH0sCS8qIFRFTEVURVhUICovCisJeyAweDAxLCAweDA4LCBLRVlfRVBHIH0sCS8qIEVQRyAqLworCXsgMHgwNSwgMHgxMywgS0VZX1BPV0VSIH0sCS8qIFBPV0VSICovCisJeyAweDAxLCAweDA5LCBLRVlfWk9PTSB9LAkvKiBGVUxMU0NSRUVOICovCisJeyAweDAwLCAweDQwLCBLRVlfQVVESU8gfSwJLyogRFVBTCBTT1VORCAqLworCXsgMHgwMCwgMHgyYywgS0VZX1BSSU5UIH0sCS8qIFNOQVBTSE9UICovCisJeyAweDA1LCAweDE2LCBLRVlfU1VCVElUTEUgfSwJLyogU1VCVElUTEUgKi8KKwl7IDB4MDAsIDB4NTIsIEtFWV9DSEFOTkVMVVAgfSwJLyogQ0ggVXAgKi8KKwl7IDB4MDAsIDB4NTEsIEtFWV9DSEFOTkVMRE9XTiB9LC8qIENoIERuICovCisJeyAweDAwLCAweDU3LCBLRVlfVk9MVU1FVVAgfSwJLyogVm9sIFVwICovCisJeyAweDAwLCAweDU2LCBLRVlfVk9MVU1FRE9XTiB9LAkvKiBWb2wgRG4gKi8KKwl7IDB4MDEsIDB4MTAsIEtFWV9NVVRFIH0sCS8qIE1VVEUgKi8KKwl7IDB4MDAsIDB4MjcsIEtFWV8wIH0sCisJeyAweDAwLCAweDFlLCBLRVlfMSB9LAorCXsgMHgwMCwgMHgxZiwgS0VZXzIgfSwKKwl7IDB4MDAsIDB4MjAsIEtFWV8zIH0sCisJeyAweDAwLCAweDIxLCBLRVlfNCB9LAorCXsgMHgwMCwgMHgyMiwgS0VZXzUgfSwKKwl7IDB4MDAsIDB4MjMsIEtFWV82IH0sCisJeyAweDAwLCAweDI0LCBLRVlfNyB9LAorCXsgMHgwMCwgMHgyNSwgS0VZXzggfSwKKwl7IDB4MDAsIDB4MjYsIEtFWV85IH0sCisJeyAweDAxLCAweDE3LCBLRVlfUExBWVBBVVNFIH0sCS8qIFRJTUVTSElGVCAqLworCXsgMHgwMSwgMHgxNSwgS0VZX1JFQ09SRCB9LAkvKiBSRUNPUkQgKi8KKwl7IDB4MDMsIDB4MTMsIEtFWV9QTEFZIH0sCS8qIFBMQVkgKi8KKwl7IDB4MDEsIDB4MTYsIEtFWV9TVE9QIH0sCS8qIFNUT1AgKi8KKwl7IDB4MDEsIDB4MTMsIEtFWV9QQVVTRSB9LAkvKiBQQVVTRSAqLworfTsKKworc3RhdGljIHU4IGFmOTAxNV9pcl90YWJsZV9kaWdpdHRyYWRlW10gPSB7CisJMHgwMCwgMHhmZiwgMHgwNiwgMHhmOSwgMHgxMywgMHgwNSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDRkLCAweGIyLCAweDE3LCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MWYsIDB4ZTAsIDB4MmMsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwYSwgMHhmNSwgMHgxNSwgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDBlLCAweGYxLCAweDE2LCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MDksIDB4ZjYsIDB4MDksIDB4MDEsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwMSwgMHhmZSwgMHgwOCwgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDA1LCAweGZhLCAweDEwLCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MDIsIDB4ZmQsIDB4NTYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg0MCwgMHhiZiwgMHg1NywgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDE5LCAweGU2LCAweDUyLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTcsIDB4ZTgsIDB4NTEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxMCwgMHhlZiwgMHgwZiwgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDU0LCAweGFiLCAweDI3LCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MWIsIDB4ZTQsIDB4MWUsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxMSwgMHhlZSwgMHgxZiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDE1LCAweGVhLCAweDIwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTIsIDB4ZWQsIDB4MjEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxNiwgMHhlOSwgMHgyMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDRjLCAweGIzLCAweDIzLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NDgsIDB4YjcsIDB4MjQsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwNCwgMHhmYiwgMHgyNSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDI2LCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MWUsIDB4ZTEsIDB4MTMsIDB4MDMsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxYSwgMHhlNSwgMHgxMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDAzLCAweGZjLCAweDE3LCAweDA1LCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MGQsIDB4ZjIsIDB4MTYsIDB4MDUsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxZCwgMHhlMiwgMHg0MCwgMHgwMCwgMHgwMCwKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKaW5kZXggY2QyZWRiYy4uNTAxN2YwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlpbnQgbnVtKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0JaW50IHJldCwgaW5jLCBpID0gMDsKKwlpbnQgcmV0ID0gMCwgaW5jLCBpID0gMDsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYwppbmRleCAzYWM5Zjc0Li44MGUzN2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jCkBAIC0zMiw3ICszMiw2IEBACiAKIC8qIGRlYnVnICovCiBpbnQgZHZiX3VzYl9jaW5lcmd5dDJfZGVidWc7Ci1pbnQgZGlzYWJsZV9yZW1vdGU7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHZiX3VzYl9jaW5lcmd5dDJfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLCB4ZmVyPTIsIHJjPTQgIgpAQCAtNDUsNyArNDQsNyBAQAogfTsKIAogLyogV2UgYXJlIG1pc3NpbmcgYSByZWxlYXNlIGhvb2sgd2l0aCB1c2JfZGV2aWNlIGRhdGEgKi8KLXN0cnVjdCBkdmJfdXNiX2RldmljZSAqY2luZXJneXQyX3VzYl9kZXZpY2U7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlICpjaW5lcmd5dDJfdXNiX2RldmljZTsKIAogc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGNpbmVyZ3l0Ml9wcm9wZXJ0aWVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDIuaAppbmRleCAxMWQ3OWViLi44NGVmZTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLmgKQEAgLTcwLDExICs3MCwxMSBAQAogCXVpbnQ4X3QgYmFuZHdpZHRoOwogCXVpbnQxNl90IHRwczsKIAl1aW50OF90IGZsYWdzOwotCXVpbnQxNl90IGdhaW47CisJX19sZTE2IGdhaW47CiAJdWludDhfdCBzbnI7Ci0JdWludDMyX3Qgdml0ZXJiaV9lcnJvcl9yYXRlOworCV9fbGUzMiB2aXRlcmJpX2Vycm9yX3JhdGU7CiAJdWludDMyX3QgcnNfZXJyb3JfcmF0ZTsKLQl1aW50MzJfdCB1bmNvcnJlY3RlZF9ibG9ja19jb3VudDsKKwlfX2xlMzIgdW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7CiAJdWludDhfdCBsb2NrX2JpdHM7CiAJdWludDhfdCBwcmV2X2xvY2tfYml0czsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC04Miw5ICs4Miw5IEBACiAKIHN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyB7CiAJdWludDhfdCBjbWQ7Ci0JdWludDMyX3QgZnJlcTsKKwlfX2xlMzIgZnJlcTsKIAl1aW50OF90IGJhbmR3aWR0aDsKLQl1aW50MTZfdCB0cHM7CisJX19sZTE2IHRwczsKIAl1aW50OF90IGZsYWdzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IDczODBiOTQuLmE0ZmNhM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTk2LDYgKzk2LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9DT0xECQkJMHgwZmEwCiAjZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfV0FSTQkJCTB4MGZhMQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVCQkJCTB4ZTM5OQorI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTVVCQkJCTB4ZTM5NgogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9QQzE2MF8yVAkJCQkweGMxNjAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9DT0xECQkJMHgxN2RlCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fV0FSTQkJCTB4MTdkZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMKaW5kZXggNjI4NmZiYi4uYzY1ZjI3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5jCkBAIC05LDcgKzksNiBAQAogKgogKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KICovCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgImR3MjEwMi5oIgogI2luY2x1ZGUgInNpMjF4eC5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKQEAgLTI3LDYgKzI2LDEwIEBACiAjZGVmaW5lIFVTQl9QSURfRFcyMTA0IDB4MjEwNAogI2VuZGlmCiAKKyNpZm5kZWYgVVNCX1BJRF9DSU5FUkdZX1MKKyNkZWZpbmUgVVNCX1BJRF9DSU5FUkdZX1MgMHgwMDY0CisjZW5kaWYKKwogI2RlZmluZSBEVzIxMFhfUkVBRF9NU0cgMAogI2RlZmluZSBEVzIxMFhfV1JJVEVfTVNHIDEKIApAQCAtNTc4LDYgKzU4MSw3IEBACiAJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9DWVBSRVNTLCAweDIxMDEpfSwKIAl7VVNCX0RFVklDRShVU0JfVklEX0NZUFJFU1MsIDB4MjEwNCl9LAogCXtVU0JfREVWSUNFKDB4OTAyMiwgMHhkNjUwKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9URVJSQVRFQywgVVNCX1BJRF9DSU5FUkdZX1MpfSwKIAl7IH0KIH07CiAKQEAgLTY0Nyw2ICs2NTEsNyBAQAogCQkJZHcyMTB4X29wX3J3KGRldiwgMHhiZiwgMHgwMDQwLCAwLCAmcmVzZXQsIDAsCiAJCQkJCURXMjEwWF9XUklURV9NU0cpOwogCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9DSU5FUkdZX1M6CiAJCWNhc2UgVVNCX1BJRF9EVzIxMDI6CiAJCQlkdzIxMHhfb3BfcncoZGV2LCAweGJmLCAweDAwNDAsIDAsICZyZXNldCwgMCwKIAkJCQkJRFcyMTBYX1dSSVRFX01TRyk7CkBAIC02NTUsNyArNjYwLDcgQEAKIAkJCS8qIGNoZWNrIFNUVjAyOTkgZnJvbnRlbmQgICovCiAJCQlkdzIxMHhfb3BfcncoZGV2LCAweGI1LCAwLCAwLCAmcmVzZXQxNlswXSwgMiwKIAkJCQkJRFcyMTBYX1JFQURfTVNHKTsKLQkJCWlmIChyZXNldDE2WzBdID09IDB4YTEpIHsKKwkJCWlmICgocmVzZXQxNlswXSA9PSAweGExKSB8fCAocmVzZXQxNlswXSA9PSAweDgwKSkgewogCQkJCWR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID0gJmR3MjEwMl9pMmNfYWxnbzsKIAkJCQlkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSAmZHcyMTAyX3R1bmVyX2F0dGFjaDsKIAkJCQlicmVhazsKQEAgLTcyNiw3ICs3MzEsNyBAQAogCQkJfSwKIAkJfQogCX0sCi0JLm51bV9kZXZpY2VfZGVzY3MgPSAyLAorCS5udW1fZGV2aWNlX2Rlc2NzID0gMywKIAkuZGV2aWNlcyA9IHsKIAkJeyJEVkJXb3JsZCBEVkItUyAyMTAyIFVTQjIuMCIsCiAJCQl7JmR3MjEwMl90YWJsZVswXSwgTlVMTH0sCkBAIC03MzYsNiArNzQxLDEwIEBACiAJCQl7JmR3MjEwMl90YWJsZVsxXSwgTlVMTH0sCiAJCQl7TlVMTH0sCiAJCX0sCisJCXsiVGVycmFUZWMgQ2luZXJneSBTIFVTQiIsCisJCQl7JmR3MjEwMl90YWJsZVs0XSwgTlVMTH0sCisJCQl7TlVMTH0sCisJCX0sCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMKaW5kZXggMjYyYTg1OC4uMjBlYWRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCkBAIC0yNSw2ICsyNSwyMCBAQAogCXVuc2lnbmVkIGxvbmcgc3RhdHVzX2NoZWNrX2ludGVydmFsOwogfTsKIAorc3RhdGljIGludCBncDhwc2tfdHVuZWRfdG9fRENJSShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHN0YXR1czsKKwlncDhwc2tfdXNiX2luX29wKHN0LT5kLCBHRVRfOFBTS19DT05GSUcsIDAsIDAsICZzdGF0dXMsIDEpOworCXJldHVybiBzdGF0dXMgJiBibURDdHVuZWQ7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX3NldF90dW5lcl9tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXJldHVybiBncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCwgU0VUXzhQU0tfQ09ORklHLCBtb2RlLCAwLCBOVUxMLCAwKTsKK30KKwogc3RhdGljIGludCBncDhwc2tfZmVfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdCkKIHsKIAl1OCBidWZbNl07CkBAIC05OSwzOSArMTEzLDExNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdwOHBza19mZV9zZXRfcHJvcGVydHkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwKQoreworCWRlYl9mZSgiJXMoLi4pXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCit7CisJZGViX2ZlKCIlcyguLilcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgaW50IGdwOHBza19mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKIHsKIAlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOwogCXU4IGNtZFsxMF07CiAJdTMyIGZyZXEgPSBmZXAtPmZyZXF1ZW5jeSAqIDEwMDA7CisJaW50IGdwX3Byb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdShzdGF0ZS0+ZC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisJZGViX2ZlKCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAljbWRbNF0gPSBmcmVxICAgICAgICAgJiAweGZmOwogCWNtZFs1XSA9IChmcmVxID4+IDgpICAmIDB4ZmY7CiAJY21kWzZdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKIAljbWRbN10gPSAoZnJlcSA+PiAyNCkgJiAweGZmOwogCi0Jc3dpdGNoKGZlLT5vcHMuaW5mby50eXBlKSB7Ci0JY2FzZSBGRV9RUFNLOgotCQljbWRbMF0gPSAgZmVwLT51LnFwc2suc3ltYm9sX3JhdGUgICAgICAgICYgMHhmZjsKLQkJY21kWzFdID0gKGZlcC0+dS5xcHNrLnN5bWJvbF9yYXRlID4+ICA4KSAmIDB4ZmY7Ci0JCWNtZFsyXSA9IChmZXAtPnUucXBzay5zeW1ib2xfcmF0ZSA+PiAxNikgJiAweGZmOwotCQljbWRbM10gPSAoZmVwLT51LnFwc2suc3ltYm9sX3JhdGUgPj4gMjQpICYgMHhmZjsKLQkJY21kWzhdID0gQURWX01PRF9EVkJfUVBTSzsKLQkJY21kWzldID0gMHgwMzsgLypBRFZfTU9EX0ZFQ19YWFgqLworCXN3aXRjaCAoYy0+ZGVsaXZlcnlfc3lzdGVtKSB7CisJY2FzZSBTWVNfRFZCUzoKKwkJLyogT25seSBRUFNLIGlzIHN1cHBvcnRlZCBmb3IgRFZCLVMgKi8KKwkJaWYgKGMtPm1vZHVsYXRpb24gIT0gUVBTSykgeworCQkJZGViX2ZlKCIlczogdW5zdXBwb3J0ZWQgbW9kdWxhdGlvbiBzZWxlY3RlZCAoJWQpXG4iLAorCQkJCV9fZnVuY19fLCBjLT5tb2R1bGF0aW9uKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCQljLT5mZWNfaW5uZXIgPSBGRUNfQVVUTzsKIAkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCWRlYl9mZSgiJXM6IERWQi1TMiBkZWxpdmVyeSBzeXN0ZW0gc2VsZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgotCQkvLyBvdGhlciBtb2RlcyBhcmUgdW5zdXBvcnRlZCByaWdodCBub3cKLQkJY21kWzBdID0gMDsKLQkJY21kWzFdID0gMDsKLQkJY21kWzJdID0gMDsKLQkJY21kWzNdID0gMDsKLQkJY21kWzhdID0gMDsKLQkJY21kWzldID0gMDsKLQkJYnJlYWs7CisJCWRlYl9mZSgiJXM6IHVuc3VwcG9ydGVkIGRlbGl2ZXJ5IHN5c3RlbSBzZWxlY3RlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIGMtPmRlbGl2ZXJ5X3N5c3RlbSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCxUVU5FXzhQU0ssMCwwLGNtZCwxMCk7CisJY21kWzBdID0gIGMtPnN5bWJvbF9yYXRlICAgICAgICAmIDB4ZmY7CisJY21kWzFdID0gKGMtPnN5bWJvbF9yYXRlID4+ICA4KSAmIDB4ZmY7CisJY21kWzJdID0gKGMtPnN5bWJvbF9yYXRlID4+IDE2KSAmIDB4ZmY7CisJY21kWzNdID0gKGMtPnN5bWJvbF9yYXRlID4+IDI0KSAmIDB4ZmY7CisJc3dpdGNoIChjLT5tb2R1bGF0aW9uKSB7CisJY2FzZSBRUFNLOgorCQlpZiAoZ3BfcHJvZHVjdF9pZCA9PSBVU0JfUElEX0dFTlBJWF84UFNLX1JFVl8xX1dBUk0pCisJCQlpZiAoZ3A4cHNrX3R1bmVkX3RvX0RDSUkoZmUpKQorCQkJCWdwOHBza19iY200NTAwX3JlbG9hZChzdGF0ZS0+ZCk7CisJCXN3aXRjaCAoYy0+ZmVjX2lubmVyKSB7CisJCWNhc2UgRkVDXzFfMjoKKwkJCWNtZFs5XSA9IDA7IGJyZWFrOworCQljYXNlIEZFQ18yXzM6CisJCQljbWRbOV0gPSAxOyBicmVhazsKKwkJY2FzZSBGRUNfM180OgorCQkJY21kWzldID0gMjsgYnJlYWs7CisJCWNhc2UgRkVDXzVfNjoKKwkJCWNtZFs5XSA9IDM7IGJyZWFrOworCQljYXNlIEZFQ183Xzg6CisJCQljbWRbOV0gPSA0OyBicmVhazsKKwkJY2FzZSBGRUNfQVVUTzoKKwkJCWNtZFs5XSA9IDU7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJY21kWzldID0gNTsgYnJlYWs7CisJCX0KKwkJY21kWzhdID0gQURWX01PRF9EVkJfUVBTSzsKKwkJYnJlYWs7CisJY2FzZSBQU0tfODogLyogUFNLXzggaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBETiAqLworCQljbWRbOF0gPSBBRFZfTU9EX1RVUkJPXzhQU0s7CisJCXN3aXRjaCAoYy0+ZmVjX2lubmVyKSB7CisJCWNhc2UgRkVDXzJfMzoKKwkJCWNtZFs5XSA9IDA7IGJyZWFrOworCQljYXNlIEZFQ18zXzQ6CisJCQljbWRbOV0gPSAxOyBicmVhazsKKwkJY2FzZSBGRUNfM181OgorCQkJY21kWzldID0gMjsgYnJlYWs7CisJCWNhc2UgRkVDXzVfNjoKKwkJCWNtZFs5XSA9IDM7IGJyZWFrOworCQljYXNlIEZFQ184Xzk6CisJCQljbWRbOV0gPSA0OyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNtZFs5XSA9IDA7IGJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OiAvKiBRQU1fMTYgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBETiAqLworCQljbWRbOF0gPSBBRFZfTU9EX1RVUkJPXzE2UUFNOworCQljbWRbOV0gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBVbmtub3duIG1vZHVsYXRpb24gKi8KKwkJZGViX2ZlKCIlczogdW5zdXBwb3J0ZWQgbW9kdWxhdGlvbiBzZWxlY3RlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIGMtPm1vZHVsYXRpb24pOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGdwX3Byb2R1Y3RfaWQgPT0gVVNCX1BJRF9HRU5QSVhfOFBTS19SRVZfMV9XQVJNKQorCQlncDhwc2tfc2V0X3R1bmVyX21vZGUoZmUsIDApOworCWdwOHBza191c2Jfb3V0X29wKHN0YXRlLT5kLCBUVU5FXzhQU0ssIDAsIDAsIGNtZCwgMTApOwogCiAJc3RhdGUtPmxvY2sgPSAwOwogCXN0YXRlLT5uZXh0X3N0YXR1c19jaGVjayA9IGppZmZpZXM7CkBAIC0xNDAsMTMgKzIyOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ3A4cHNrX2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQotewotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJICAgIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKm0pCiB7CkBAIC0yNjEsOSArMzQzLDEzIEBACiAJCS5zeW1ib2xfcmF0ZV9tYXggICAgICAgID0gNDUwMDAwMDAsCiAJCS5zeW1ib2xfcmF0ZV90b2xlcmFuY2UgID0gNTAwLCAgLyogcHBtICovCiAJCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPIHwKLQkJCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAotCQkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAotCQkJCUZFX0NBTl9RUFNLCisJCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkJRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzdfOCB8IEZFX0NBTl9GRUNfQVVUTyB8CisJCQkvKgorCQkJICogRkVfQ0FOX1FBTV8xNiBpcyBmb3IgY29tcGF0aWJpbGl0eQorCQkJICogKE15dGggaW5jb3JyZWN0bHkgZGV0ZWN0cyBUdXJiby1RUFNLIGFzIHBsYWluIFFBTS0xNikKKwkJCSAqLworCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2CiAJfSwKIAogCS5yZWxlYXNlID0gZ3A4cHNrX2ZlX3JlbGVhc2UsCkBAIC0yNzEsOCArMzU3LDEwIEBACiAJLmluaXQgPSBOVUxMLAogCS5zbGVlcCA9IE5VTEwsCiAKKwkuc2V0X3Byb3BlcnR5ID0gZ3A4cHNrX2ZlX3NldF9wcm9wZXJ0eSwKKwkuZ2V0X3Byb3BlcnR5ID0gZ3A4cHNrX2ZlX2dldF9wcm9wZXJ0eSwKIAkuc2V0X2Zyb250ZW5kID0gZ3A4cHNrX2ZlX3NldF9mcm9udGVuZCwKLQkuZ2V0X2Zyb250ZW5kID0gZ3A4cHNrX2ZlX2dldF9mcm9udGVuZCwKKwogCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGdwOHBza19mZV9nZXRfdHVuZV9zZXR0aW5ncywKIAogCS5yZWFkX3N0YXR1cyA9IGdwOHBza19mZV9yZWFkX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCmluZGV4IGQ5NjVhOTIuLmMxZGE5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwpAQCAtMTc0LDYgKzE3NCwyMiBAQAogCXJldHVybiAwOwogfQogCitpbnQgZ3A4cHNrX2JjbTQ1MDBfcmVsb2FkKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBidWY7CisJaW50IGdwX3Byb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdShkLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJLyogVHVybiBvZmYgOHBzayBwb3dlciAqLworCWlmIChncDhwc2tfdXNiX2luX29wKGQsIEJPT1RfOFBTSywgMCwgMCwgJmJ1ZiwgMSkpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFR1cm4gT24gOHBzayBwb3dlciAqLworCWlmIChncDhwc2tfdXNiX2luX29wKGQsIEJPT1RfOFBTSywgMSwgMCwgJmJ1ZiwgMSkpCisJCXJldHVybiAtRUlOVkFMOworCS8qIGxvYWQgQkNNNDUwMCBmaXJtd2FyZSAqLworCWlmIChncF9wcm9kdWN0X2lkID09IFVTQl9QSURfR0VOUElYXzhQU0tfUkVWXzFfV0FSTSkKKwkJaWYgKGdwOHBza19sb2FkX2JjbTQ1MDBmdyhkKSkKKwkJCXJldHVybiBFSU5WQUw7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgZ3A4cHNrX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCBvbm9mZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCmluZGV4IGU1Y2Q4MTQuLmU4M2E1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suaApAQCAtOTIsNSArOTIsNiBAQAogZXh0ZXJuIGludCBncDhwc2tfdXNiX2luX29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKTsKIGV4dGVybiBpbnQgZ3A4cHNrX3VzYl9vdXRfb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCByZXEsIHUxNiB2YWx1ZSwKIAkJCSAgICAgdTE2IGluZGV4LCB1OCAqYiwgaW50IGJsZW4pOworZXh0ZXJuIGludCBncDhwc2tfYmNtNDUwMF9yZWxvYWQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCmluZGV4IGRhOTNiOWUuLjlkYTJjYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCkBAIC0xNTYsNyArMTU2LDggQEAKIAkJCQlzdHJlYW0tPnByb3BzLnUuYnVsay5idWZmZXJzaXplLAogCQkJCXVzYl91cmJfY29tcGxldGUsIHN0cmVhbSk7CiAKLQkJc3RyZWFtLT51cmJfbGlzdFtpXS0+dHJhbnNmZXJfZmxhZ3MgPSAwOworCQlzdHJlYW0tPnVyYl9saXN0W2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQlzdHJlYW0tPnVyYl9saXN0W2ldLT50cmFuc2Zlcl9kbWEgPSBzdHJlYW0tPmRtYV9hZGRyW2ldOwogCQlzdHJlYW0tPnVyYnNfaW5pdGlhbGl6ZWQrKzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDk2YjkzZTIuLjAwMjY5NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC0xMiw2ICsxMiwyNSBAQAogCiAJICBJZiB1bnN1cmUgc2F5IE4uCiAKK2NvbW1lbnQgIk11bHRpc3RhbmRhcmQgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKworY29uZmlnIERWQl9TVEIwODk5CisJdHJpc3RhdGUgIlNUQjA4OTkgYmFzZWQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgRFZCLVMvUzIvRFNTIE11bHRpc3RhbmRhcmQgZGVtb2R1bGF0b3IuIFNheSBZIHdoZW4geW91IHdhbnQKKwkgIHRvIHN1cHBvcnQgdGhpcyBkZW1vZHVsYXRvciBiYXNlZCBmcm9udGVuZHMKKworY29uZmlnIERWQl9TVEI2MTAwCisJdHJpc3RhdGUgIlNUQjYxMDAgYmFzZWQgdHVuZXJzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIFNpbGljb24gdHVuZXIgZnJvbSBTVCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNUQjA4OTkKKwkgIGRlbW9kdWxhdG9yLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0dW5lci4KKwogY29tbWVudCAiRFZCLVMgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtNzgsNiArOTcsMTMgQEAKIAloZWxwCiAJICBBIERWQi1TIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfVERBODI2MQorCXRyaXN0YXRlICJQaGlsaXBzIFREQTgyNjEgYmFzZWQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgRFZCLVMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogY29uZmlnIERWQl9WRVMxWDkzCiAJdHJpc3RhdGUgIlZMU0kgVkVTMTg5MyBvciBWRVMxOTkzIGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCkBAIC05Miw2ICsxMTgsMTQgQEAKIAloZWxwCiAJICBBIERWQi1TIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfVFVORVJfQ1gyNDExMworCXRyaXN0YXRlICJDb25leGFudCBDWDI0MTEzL0NYMjQxMjggdHVuZXIgZm9yIERWQi1TL0RTUyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCisKIGNvbmZpZyBEVkJfVERBODI2WAogCXRyaXN0YXRlICJQaGlsaXBzIFREQTgyNlggc2lsaWNvbiB0dW5lciIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQwpAQCAtMzQ1LDYgKzM3OSwxNCBAQAogCSAgQW4gQVRTQyA4VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50CiAJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiAKK2NvbmZpZyBEVkJfTEdEVDMzMDQKKwl0cmlzdGF0ZSAiTEcgRWxlY3Ryb25pY3MgTEdEVDMzMDQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEFuIEFUU0MgOFZTQiBhbmQgUUFNNjQvMjU2IHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudAorCSAgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCiBjb25maWcgRFZCX1M1SDE0MDkKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTNUgxNDA5IGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCkBAIC0zNjksNiArNDExLDE3IEBACiAJICBBbiBBVFNDIDhWU0IgYW5kIFFBTTY0LzI1NiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQKIAkgIHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorY29tbWVudCAiSVNEQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKworY29uZmlnIERWQl9TOTIxCisJdHJpc3RhdGUgIlNoYXJwIFM5MjEgdHVuZXIiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEFOIElTREItVCBEUVBTSywgUVBTSywgMTZRQU0gYW5kIDY0UUFNIDFzZWcgdHVuZXIgbW9kdWxlLgorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRpZ2l0YWwgdGVycmVzdHJpYWwgb25seSB0dW5lcnMvUExMIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IGFiYTc5ZjQuLmFmN2JkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTUsOCArNSwxMyBAQAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCiAKK3M5MjEtb2JqcyA6PSBzOTIxX21vZHVsZS5vIHM5MjFfY29yZS5vCitzdGIwODk5LW9ianMgPSBzdGIwODk5X2Rydi5vIHN0YjA4OTlfYWxnby5vCisKIG9iai0kKENPTkZJR19EVkJfUExMKSArPSBkdmItcGxsLm8KIG9iai0kKENPTkZJR19EVkJfU1RWMDI5OSkgKz0gc3R2MDI5OS5vCitvYmotJChDT05GSUdfRFZCX1NUQjA4OTkpICs9IHN0YjA4OTkubworb2JqLSQoQ09ORklHX0RWQl9TVEI2MTAwKSArPSBzdGI2MTAwLm8KIG9iai0kKENPTkZJR19EVkJfU1A4ODcwKSArPSBzcDg4NzAubwogb2JqLSQoQ09ORklHX0RWQl9DWDIyNzAwKSArPSBjeDIyNzAwLm8KIG9iai0kKENPTkZJR19EVkJfQ1gyNDExMCkgKz0gY3gyNDExMC5vCkBAIC0zNSwxOCArNDAsMjEgQEAKIG9iai0kKENPTkZJR19EVkJfQkNNMzUxMCkgKz0gYmNtMzUxMC5vCiBvYmotJChDT05GSUdfRFZCX1M1SDE0MjApICs9IHM1aDE0MjAubwogb2JqLSQoQ09ORklHX0RWQl9MR0RUMzMwWCkgKz0gbGdkdDMzMHgubworb2JqLSQoQ09ORklHX0RWQl9MR0RUMzMwNCkgKz0gbGdkdDMzMDQubwogb2JqLSQoQ09ORklHX0RWQl9DWDI0MTIzKSArPSBjeDI0MTIzLm8KIG9iai0kKENPTkZJR19EVkJfTE5CUDIxKSArPSBsbmJwMjEubwogb2JqLSQoQ09ORklHX0RWQl9JU0w2NDA1KSArPSBpc2w2NDA1Lm8KIG9iai0kKENPTkZJR19EVkJfSVNMNjQyMSkgKz0gaXNsNjQyMS5vCiBvYmotJChDT05GSUdfRFZCX1REQTEwMDg2KSArPSB0ZGExMDA4Ni5vCiBvYmotJChDT05GSUdfRFZCX1REQTgyNlgpICs9IHRkYTgyNngubworb2JqLSQoQ09ORklHX0RWQl9UREE4MjYxKSArPSB0ZGE4MjYxLm8KIG9iai0kKENPTkZJR19EVkJfVFVORVJfRElCMDA3MCkgKz0gZGliMDA3MC5vCiBvYmotJChDT05GSUdfRFZCX1RVQTYxMDApICs9IHR1YTYxMDAubwogb2JqLSQoQ09ORklHX0RWQl9TNUgxNDA5KSArPSBzNWgxNDA5Lm8KIG9iai0kKENPTkZJR19EVkJfVFVORVJfSVREMTAwMCkgKz0gaXRkMTAwMC5vCiBvYmotJChDT05GSUdfRFZCX0FVODUyMikgKz0gYXU4NTIyLm8KIG9iai0kKENPTkZJR19EVkJfVERBMTAwNDgpICs9IHRkYTEwMDQ4Lm8KK29iai0kKENPTkZJR19EVkJfVFVORVJfQ1gyNDExMykgKz0gY3gyNDExMy5vCiBvYmotJChDT05GSUdfRFZCX1M1SDE0MTEpICs9IHM1aDE0MTEubwogb2JqLSQoQ09ORklHX0RWQl9MR1M4R0w1KSArPSBsZ3M4Z2w1Lm8KIG9iai0kKENPTkZJR19EVkJfRFVNTVlfRkUpICs9IGR2Yl9kdW1teV9mZS5vCkBAIC01NSwzICs2Myw1IEBACiBvYmotJChDT05GSUdfRFZCX1NJMjFYWCkgKz0gc2kyMXh4Lm8KIG9iai0kKENPTkZJR19EVkJfU1RWMDI4OCkgKz0gc3R2MDI4OC5vCiBvYmotJChDT05GSUdfRFZCX1NUQjYwMDApICs9IHN0YjYwMDAubworb2JqLSQoQ09ORklHX0RWQl9TOTIxKSArPSBzOTIxLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5jCmluZGV4IDY5MmI2OGEuLmIyYjUwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmMKQEAgLTIyMywxMiArMjIzLDEyIEBACiAJaW50IHJldCA9IDA7CiAJdTggaSA9IDA7CiAJdTggYnVmWzI0XTsKLQl1MzIgbnNfY29lZmYxXzIwNDhudTsKLQl1MzIgbnNfY29lZmYxXzgxOTFudTsKLQl1MzIgbnNfY29lZmYxXzgxOTJudTsKLQl1MzIgbnNfY29lZmYxXzgxOTNudTsKLQl1MzIgbnNfY29lZmYyXzJrOwotCXUzMiBuc19jb2VmZjJfOGs7CisJdTMyIHVuaW5pdGlhbGl6ZWRfdmFyKG5zX2NvZWZmMV8yMDQ4bnUpOworCXUzMiB1bmluaXRpYWxpemVkX3Zhcihuc19jb2VmZjFfODE5MW51KTsKKwl1MzIgdW5pbml0aWFsaXplZF92YXIobnNfY29lZmYxXzgxOTJudSk7CisJdTMyIHVuaW5pdGlhbGl6ZWRfdmFyKG5zX2NvZWZmMV84MTkzbnUpOworCXUzMiB1bmluaXRpYWxpemVkX3Zhcihuc19jb2VmZjJfMmspOworCXUzMiB1bmluaXRpYWxpemVkX3Zhcihuc19jb2VmZjJfOGspOwogCiAJZGViX2luZm8oIiVzOiBhZGNfY2xvY2s6JWQgYnc6JWRcbiIsIF9fZnVuY19fLAogCQlzdGF0ZS0+Y29uZmlnLmFkY19jbG9jaywgYncpOwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIAlpbnQgcmV0OwogCXU4IGJ1ZlszXSwgaSwgbGVuOwogCXUzMiBxdWFudCA9IDA7Ci0Jc3RydWN0IHNucl90YWJsZSAqc25yX3RhYmxlOworCXN0cnVjdCBzbnJfdGFibGUgKnVuaW5pdGlhbGl6ZWRfdmFyKHNucl90YWJsZSk7CiAKIAkvKiBjaGVjayBpZiBxdWFudGl6ZXIgcmVhZHkgKGZvciBzbnIpICovCiAJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDJlMSwgMywgMSwgJmJ1ZlswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU3YjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYwpAQCAtMCwwICsxLDYxNiBAQAorLyoKKyAqICBEcml2ZXIgZm9yIENvbmV4YW50IENYMjQxMTMvQ1gyNDEyOCBUdW5lciAoU2F0ZWxsaXRlKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctOCBQYXRyaWNrIEJvZXR0Y2hlciA8cGJAbGludXh0di5vcmc+CisgKgorICogIERldmVsb3BlZCBmb3IgQkJUSSAvIFRlY2huaXNhdAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiY3gyNDExMy5oIgorCitzdGF0aWMgaW50IGRlYnVnOworCisjZGVmaW5lIGluZm8oYXJncy4uLikgZG8geyBwcmludGsoS0VSTl9JTkZPICJDWDI0MTEzOiAiIGFyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBlcnIoYXJncy4uLikgIGRvIHsgcHJpbnRrKEtFUk5fRVJSICAiQ1gyNDExMzogIiBhcmdzKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnKSB7IFwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDWDI0MTEzOiAlczogIiwgX19mdW5jX18pOyBcCisJCQlwcmludGsoYXJncyk7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworc3RydWN0IGN4MjQxMTNfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCWNvbnN0IHN0cnVjdCBjeDI0MTEzX2NvbmZpZyAqY29uZmlnOworCisjZGVmaW5lIFJFVl9DWDI0MTEzIDB4MjMKKwl1OCByZXY7CisJdTggdmVyOworCisJdTggaWNwX21vZGU6MTsKKworI2RlZmluZSBJQ1BfTEVWRUwxIDAKKyNkZWZpbmUgSUNQX0xFVkVMMiAxCisjZGVmaW5lIElDUF9MRVZFTDMgMgorI2RlZmluZSBJQ1BfTEVWRUw0IDMKKwl1OCBpY3BfbWFuOjI7CisJdTggaWNwX2F1dG9fbG93OjI7CisJdTggaWNwX2F1dG9fbWxvdzoyOworCXU4IGljcF9hdXRvX21oaToyOworCXU4IGljcF9hdXRvX2hpOjI7CisJdTggaWNwX2RpZzsKKworI2RlZmluZSBMTkFfTUlOX0dBSU4gMAorI2RlZmluZSBMTkFfTUlEX0dBSU4gMQorI2RlZmluZSBMTkFfTUFYX0dBSU4gMgorCXU4IGxuYV9nYWluOjI7CisKKwl1OCBhY3Bfb246MTsKKworCXU4IHZjb19tb2RlOjI7CisJdTggdmNvX3NoaWZ0OjE7CisjZGVmaW5lIFZDT0JBTkRTRUxfNiAweDgwCisjZGVmaW5lIFZDT0JBTkRTRUxfNSAweDAxCisjZGVmaW5lIFZDT0JBTkRTRUxfNCAweDAyCisjZGVmaW5lIFZDT0JBTkRTRUxfMyAweDA0CisjZGVmaW5lIFZDT0JBTkRTRUxfMiAweDA4CisjZGVmaW5lIFZDT0JBTkRTRUxfMSAweDEwCisJdTggdmNvX2JhbmQ7CisKKyNkZWZpbmUgVkNPRElWNCA0CisjZGVmaW5lIFZDT0RJVjIgMgorCXU4IHZjb2RpdjsKKworCXU4IGJzX2RlbGF5OjQ7CisJdTE2IGJzX2ZyZXFjbnQ6MTM7CisJdTE2IGJzX3JkaXY7CisJdTggcHJlc2NhbGVyX21vZGU6MTsKKworCXU4IHJmdmdhX2JpYXNfY3RybDsKKworCXMxNiB0dW5lcl9nYWluX3RocmVzOworCXU4ICBnYWluX2xldmVsOworCisJdTMyIGZyZXF1ZW5jeTsKKworCXU4IHJlZmRpdjsKKworCXU4IEZ3aW5kb3dfZW5hYmxlZDsKK307CisKK3N0YXRpYyBpbnQgY3gyNDExM193cml0ZXJlZyhzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUsIGludCByZWcsIGludCBkYXRhKQoreworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+aTJjX2FkZHIsCisJCS5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSAyIH07CisJaW50IGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKKwlpZiAoZXJyICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3cml0ZXJlZyBlcnJvcihlcnIgPT0gJWksIHJlZyA9PSAweCUwMngsIgorCQkJICIgZGF0YSA9PSAweCUwMngpXG4iLCBfX2Z1bmNfXywgZXJyLCByZWcsIGRhdGEpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfcmVhZHJlZyhzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCXU4IGI7CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5pMmNfYWRkciwKKwkJCS5mbGFncyA9IDAsIC5idWYgPSAmcmVnLCAubGVuID0gMSB9LAorCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+aTJjX2FkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9ICZiLCAubGVuID0gMSB9CisJfTsKKworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCisJaWYgKHJldCAhPSAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVnPTB4JXggKGVycm9yPSVkKVxuIiwKKwkJCV9fZnVuY19fLCByZWcsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyB2b2lkIGN4MjQxMTNfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlKQoreworCXU4IHI7CisKKwlyID0gY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDEwKSAmIDB4ODI7CisJciB8PSBzdGF0ZS0+aWNwX21vZGU7CisJciB8PSBzdGF0ZS0+aWNwX21hbiA8PCA0OworCXIgfD0gc3RhdGUtPmljcF9kaWcgPDwgMjsKKwlyIHw9IHN0YXRlLT5wcmVzY2FsZXJfbW9kZSA8PCA1OworCWN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MTAsIHIpOworCisJciA9IChzdGF0ZS0+aWNwX2F1dG9fbG93ICA8PCAwKSB8IChzdGF0ZS0+aWNwX2F1dG9fbWxvdyA8PCAyKQorCQl8IChzdGF0ZS0+aWNwX2F1dG9fbWhpIDw8IDQpIHwgKHN0YXRlLT5pY3BfYXV0b19oaSA8PCA2KTsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDExLCByKTsKKworCWlmIChzdGF0ZS0+cmV2ID09IFJFVl9DWDI0MTEzKSB7CisJCXIgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MjApICYgMHhlYzsKKwkJciB8PSBzdGF0ZS0+bG5hX2dhaW47CisJCXIgfD0gc3RhdGUtPnJmdmdhX2JpYXNfY3RybCA8PCA0OworCQljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDIwLCByKTsKKwl9CisKKwlyID0gY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDEyKSAmIDB4MDM7CisJciB8PSBzdGF0ZS0+YWNwX29uIDw8IDI7CisJciB8PSBzdGF0ZS0+YnNfZGVsYXkgPDwgNDsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDEyLCByKTsKKworCXIgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MTgpICYgMHg0MDsKKwlyIHw9IHN0YXRlLT52Y29fc2hpZnQ7CisJaWYgKHN0YXRlLT52Y29fYmFuZCA9PSBWQ09CQU5EU0VMXzYpCisJCXIgfD0gKDEgPDwgNyk7CisJZWxzZQorCQlyIHw9IChzdGF0ZS0+dmNvX2JhbmQgPDwgMSk7CisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxOCwgcik7CisKKwlyICA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxNCkgJiAweDIwOworCXIgfD0gKHN0YXRlLT52Y29fbW9kZSA8PCA2KSB8ICgoc3RhdGUtPmJzX2ZyZXFjbnQgPj4gOCkgJiAweDFmKTsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDE0LCByKTsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDE1LCAoc3RhdGUtPmJzX2ZyZXFjbnQgICAgICAgICYgMHhmZikpOworCisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxNiwgKHN0YXRlLT5ic19yZGl2ID4+IDQpICYgMHhmZik7CisJciA9IChjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MTcpICYgMHgwZikgfAorCQkoKHN0YXRlLT5ic19yZGl2ICYgMHgwZikgPDwgNCk7CisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxNywgcik7Cit9CisKKyNkZWZpbmUgVkdBXzAgMHgwMAorI2RlZmluZSBWR0FfMSAweDA0CisjZGVmaW5lIFZHQV8yIDB4MDIKKyNkZWZpbmUgVkdBXzMgMHgwNgorI2RlZmluZSBWR0FfNCAweDAxCisjZGVmaW5lIFZHQV81IDB4MDUKKyNkZWZpbmUgVkdBXzYgMHgwMworI2RlZmluZSBWR0FfNyAweDA3CisKKyNkZWZpbmUgUkZWR0FfMCAweDAwCisjZGVmaW5lIFJGVkdBXzEgMHgwMQorI2RlZmluZSBSRlZHQV8yIDB4MDIKKyNkZWZpbmUgUkZWR0FfMyAweDAzCisKK3N0YXRpYyBpbnQgY3gyNDExM19zZXRfZ2Fpbl9zZXR0aW5ncyhzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUsCisJCXMxNiBwb3dlcl9lc3RpbWF0aW9uKQoreworCXU4IGFtcG91dCA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxZCkgJiAweGYwLAorCSAgIHZnYSAgICA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxZikgJiAweDNmLAorCSAgIHJmdmdhICA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgyMCkgJiAweGYzOworCXU4IGdhaW5fbGV2ZWwgPSBwb3dlcl9lc3RpbWF0aW9uID49IHN0YXRlLT50dW5lcl9nYWluX3RocmVzOworCisJZHByaW50aygicG93ZXIgZXN0aW1hdGlvbjogJWQsIHRocmVzOiAlZCwgZ2Fpbl9sZXZlbDogJWQvJWRcbiIsCisJCQlwb3dlcl9lc3RpbWF0aW9uLCBzdGF0ZS0+dHVuZXJfZ2Fpbl90aHJlcywKKwkJCXN0YXRlLT5nYWluX2xldmVsLCBnYWluX2xldmVsKTsKKworCWlmIChnYWluX2xldmVsID09IHN0YXRlLT5nYWluX2xldmVsKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyB0byBiZSBkb25lICovCisKKwlhbXBvdXQgfD0gMHhmOworCisJaWYgKGdhaW5fbGV2ZWwpIHsKKwkJcmZ2Z2EgfD0gUkZWR0FfMCA8PCAyOworCQl2Z2EgICB8PSAoVkdBXzcgPDwgMykgfCBWR0FfNzsKKwl9IGVsc2UgeworCQlyZnZnYSB8PSBSRlZHQV8yIDw8IDI7CisJCXZnYSAgfD0gKFZHQV82IDw8IDMpIHwgVkdBXzI7CisJfQorCXN0YXRlLT5nYWluX2xldmVsID0gZ2Fpbl9sZXZlbDsKKworCWN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MWQsIGFtcG91dCk7CisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxZiwgdmdhKTsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDIwLCByZnZnYSk7CisKKwlyZXR1cm4gMTsgLyogZGlkIHNvbWV0aGluZyAqLworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfc2V0X0ZyZWYoc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlLCB1OCBoaWdoKQoreworCXU4IHh0YWwgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MDIpOworCWlmIChzdGF0ZS0+cmV2ID09IDB4NDMgJiYgc3RhdGUtPnZjb2RpdiA9PSBWQ09ESVY0KQorCQloaWdoID0gMTsKKworCXh0YWwgJj0gfjB4MjsKKwlpZiAoaGlnaCkKKwkJeHRhbCB8PSBoaWdoIDw8IDE7CisJcmV0dXJuIGN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MDIsIHh0YWwpOworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfZW5hYmxlKHN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSwgdTggZW5hYmxlKQoreworCXU4IHIyMSA9IChjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MjEpICYgMHhjMCkgfCBlbmFibGU7CisJaWYgKHN0YXRlLT5yZXYgPT0gUkVWX0NYMjQxMTMpCisJCXIyMSB8PSAoMSA8PCAxKTsKKwlyZXR1cm4gY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgyMSwgcjIxKTsKK30KKworc3RhdGljIGludCBjeDI0MTEzX3NldF9iYW5kd2lkdGgoc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlLCB1MzIgYmFuZHdpZHRoX2toeikKK3sKKwl1OCByOworCisJaWYgKGJhbmR3aWR0aF9raHogPD0gMTkwMDApCisJCXIgPSAweDAzIDw8IDY7CisJZWxzZSBpZiAoYmFuZHdpZHRoX2toeiA8PSAyNTAwMCkKKwkJciA9IDB4MDIgPDwgNjsKKwllbHNlCisJCXIgPSAweDAxIDw8IDY7CisKKwlkcHJpbnRrKCJiYW5kd2lkdGggdG8gYmUgc2V0OiAlZFxuIiwgYmFuZHdpZHRoX2toeik7CisJYmFuZHdpZHRoX2toeiAqPSAxMDsKKwliYW5kd2lkdGhfa2h6IC09IDEwMDAwOworCWJhbmR3aWR0aF9raHogLz0gMTAwMDsKKwliYW5kd2lkdGhfa2h6ICs9IDU7CisJYmFuZHdpZHRoX2toeiAvPSAxMDsKKworCWRwcmludGsoImJhbmR3aWR0aDogJWQgJWRcbiIsIHIgPj4gNiwgYmFuZHdpZHRoX2toeik7CisKKwlyIHw9IGJhbmR3aWR0aF9raHogJiAweDNmOworCisJcmV0dXJuIGN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MWUsIHIpOworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfc2V0X2Nsa19pbnZlcnNpb24oc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlLCB1OCBvbikKK3sKKwl1OCByID0gKGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxMCkgJiAweDdmKSB8ICgob24gJiAweDEpIDw8IDcpOworCXJldHVybiBjeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDEwLCByKTsKK30KKworc3RhdGljIGludCBjeDI0MTEzX2dldF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqc3RhdHVzKQoreworCXN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCXU4IHIgPSAoY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDEwKSAmIDB4MDIpID4+IDE7CisJaWYgKHIpCisJCSpzdGF0dXMgfD0gVFVORVJfU1RBVFVTX0xPQ0tFRDsKKwlkcHJpbnRrKCJQTEwgbG9ja2VkOiAlZFxuIiwgcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBjeDI0MTEzX3NldF9yZWZfZGl2KHN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSwgdTggcmVmZGl2KQoreworCWlmIChzdGF0ZS0+cmV2ID09IDB4NDMgJiYgc3RhdGUtPnZjb2RpdiA9PSBWQ09ESVY0KQorCQlyZWZkaXYgPSAyOworCXJldHVybiBzdGF0ZS0+cmVmZGl2ID0gcmVmZGl2OworfQorCitzdGF0aWMgdm9pZCBjeDI0MTEzX2NhbGNfcGxsX25mKHN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSwgdTE2ICpuLCBzMzIgKmYpCit7CisJczMyIE47CisJczY0IEY7CisJdTggUiwgcjsKKwl1OCB2Y29kaXY7CisJdTggZmFjdG9yOworCXMzMiBmcmVxX2h6ID0gc3RhdGUtPmZyZXF1ZW5jeSAqIDEwMDA7CisKKwlpZiAoc3RhdGUtPmNvbmZpZy0+eHRhbF9raHogPCAyMDAwMCkKKwkJZmFjdG9yID0gMTsKKwllbHNlCisJCWZhY3RvciA9IDI7CisKKwlpZiAoc3RhdGUtPnJldiA9PSBSRVZfQ1gyNDExMykgeworCQlpZiAoc3RhdGUtPmZyZXF1ZW5jeSA+PSAxMTAwMDAwKQorCQkJdmNvZGl2ID0gVkNPRElWMjsKKwkJZWxzZQorCQkJdmNvZGl2ID0gVkNPRElWNDsKKwl9IGVsc2UgeworCQlpZiAoc3RhdGUtPmZyZXF1ZW5jeSA+PSAxMTY1MDAwKQorCQkJdmNvZGl2ID0gVkNPRElWMjsKKwkJZWxzZQorCQkJdmNvZGl2ID0gVkNPRElWNDsKKwl9CisJc3RhdGUtPnZjb2RpdiA9IHZjb2RpdjsKKworCWRwcmludGsoImNhbGN1bGF0aW5nIE4vRiBmb3IgJWRIeiB3aXRoIHZjb2RpdiAlZFxuIiwgZnJlcV9oeiwgdmNvZGl2KTsKKwlSID0gMDsKKwlkbyB7CisJCVIgPSBjeDI0MTEzX3NldF9yZWZfZGl2KHN0YXRlLCBSICsgMSk7CisKKwkJLyogY2FsY3VsYXRlIHR1bmVyIFBMTCBzZXR0aW5nczogKi8KKwkJTiA9ICAoZnJlcV9oeiAvIDEwMCAqIHZjb2RpdikgKiBSOworCQlOIC89IChzdGF0ZS0+Y29uZmlnLT54dGFsX2toeikgKiBmYWN0b3IgKiAyOworCQlOICs9IDU7ICAgICAvKiBGb3Igcm91bmQgdXAuICovCisJCU4gLz0gMTA7CisJCU4gLT0gMzI7CisJfSB3aGlsZSAoTiA8IDYgJiYgUiA8IDMpOworCisJaWYgKE4gPCA2KSB7CisJCWVycigic3RyYW5nZSBmcmVxdWVuY3k6IE4gPCA2XG4iKTsKKwkJcmV0dXJuOworCX0KKwlGID0gZnJlcV9oejsKKwlGICo9ICh1NjQpIChSICogdmNvZGl2ICogMjYyMTQ0KTsKKwlkcHJpbnRrKCIxIE46ICVkLCBGOiAlbGxkLCBSOiAlZFxuIiwgTiwgKGxvbmcgbG9uZylGLCBSKTsKKwlkb19kaXYoRiwgc3RhdGUtPmNvbmZpZy0+eHRhbF9raHoqMTAwMCAqIGZhY3RvciAqIDIpOworCWRwcmludGsoIjIgTjogJWQsIEY6ICVsbGQsIFI6ICVkXG4iLCBOLCAobG9uZyBsb25nKUYsIFIpOworCUYgLT0gKE4gKyAzMikgKiAyNjIxNDQ7CisKKwlkcHJpbnRrKCIzIE46ICVkLCBGOiAlbGxkLCBSOiAlZFxuIiwgTiwgKGxvbmcgbG9uZylGLCBSKTsKKworCWlmIChzdGF0ZS0+RndpbmRvd19lbmFibGVkKSB7CisJCWlmIChGID4gKDI2MjE0NCAvIDIgLSAxNjM4KSkKKwkJCUYgPSAyNjIxNDQgLyAyIC0gMTYzODsKKwkJaWYgKEYgPCAoLTI2MjE0NCAvIDIgKyAxNjM4KSkKKwkJCUYgPSAtMjYyMTQ0IC8gMiArIDE2Mzg7CisJCWlmICgoRiA8IDMyNzcgJiYgRiA+IDApIHx8IChGID4gLTMyNzcgJiYgRiA8IDApKSB7CisJCQlGID0gMDsKKwkJCXIgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MTApOworCQkJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxMCwgciB8ICgxIDw8IDYpKTsKKwkJfQorCX0KKwlkcHJpbnRrKCI0IE46ICVkLCBGOiAlbGxkLCBSOiAlZFxuIiwgTiwgKGxvbmcgbG9uZylGLCBSKTsKKworCSpuID0gKHUxNikgTjsKKwkqZiA9IChzMzIpIEY7Cit9CisKKworc3RhdGljIHZvaWQgY3gyNDExM19zZXRfbmZyKHN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSwgdTE2IG4sIHMzMiBmLCB1OCByKQoreworCXU4IHJlZzsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDE5LCAobiA+PiAxKSAmIDB4ZmYpOworCisJcmVnID0gKChuICYgMHgxKSA8PCA3KSB8ICgoZiA+PiAxMSkgJiAweDdmKTsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDFhLCByZWcpOworCisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxYiwgKGYgPj4gMykgJiAweGZmKTsKKworCXJlZyA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxYykgJiAweDFmOworCWN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MWMsIHJlZyB8ICgoZiAmIDB4NykgPDwgNSkpOworCisJY3gyNDExM19zZXRfRnJlZihzdGF0ZSwgciAtIDEpOworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUsIHUzMiBmcmVxdWVuY3kpCit7CisJdTggciA9IDE7IC8qIG9yIDIgKi8KKwl1MTYgbiA9IDY7CisJczMyIGYgPSAwOworCisJciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxNCk7CisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxNCwgciAmIDB4M2YpOworCisJciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxMCk7CisJY3gyNDExM193cml0ZXJlZyhzdGF0ZSwgMHgxMCwgciAmIDB4YmYpOworCisJc3RhdGUtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKworCWRwcmludGsoInR1bmluZyB0byBmcmVxdWVuY3k6ICVkXG4iLCBmcmVxdWVuY3kpOworCisJY3gyNDExM19jYWxjX3BsbF9uZihzdGF0ZSwgJm4sICZmKTsKKwljeDI0MTEzX3NldF9uZnIoc3RhdGUsIG4sIGYsIHN0YXRlLT5yZWZkaXYpOworCisJciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgxOCkgJiAweGJmOworCWlmIChzdGF0ZS0+dmNvZGl2ICE9IFZDT0RJVjIpCisJCXIgfD0gMSA8PCA2OworCWN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MTgsIHIpOworCisJLyogVGhlIG5lZWQgZm9yIHRoaXMgc2xlZXAgaXMgbm90IGNsZWFyLiBCdXQgaGVscHMgaW4gc29tZSBjYXNlcyAqLworCW1zbGVlcCg1KTsKKworCXIgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MWMpICYgMHhlZjsKKwljeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDFjLCByIHwgKDEgPDwgNCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTNfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJc3RhdGUtPnR1bmVyX2dhaW5fdGhyZXMgPSAtNTA7CisJc3RhdGUtPmdhaW5fbGV2ZWwgPSAyNTU7IC8qIHRvIGZvcmNlIGEgZ2Fpbi1zZXR0aW5nIGluaXRpYWxpemF0aW9uICovCisJc3RhdGUtPmljcF9tb2RlID0gMDsKKworCWlmIChzdGF0ZS0+Y29uZmlnLT54dGFsX2toeiA8IDExMDAwKSB7CisJCXN0YXRlLT5pY3BfYXV0b19oaSAgPSBJQ1BfTEVWRUw0OworCQlzdGF0ZS0+aWNwX2F1dG9fbWhpICA9IElDUF9MRVZFTDQ7CisJCXN0YXRlLT5pY3BfYXV0b19tbG93ID0gSUNQX0xFVkVMMzsKKwkJc3RhdGUtPmljcF9hdXRvX2xvdyA9IElDUF9MRVZFTDM7CisJfSBlbHNlIHsKKwkJc3RhdGUtPmljcF9hdXRvX2hpICA9IElDUF9MRVZFTDQ7CisJCXN0YXRlLT5pY3BfYXV0b19taGkgID0gSUNQX0xFVkVMNDsKKwkJc3RhdGUtPmljcF9hdXRvX21sb3cgPSBJQ1BfTEVWRUwzOworCQlzdGF0ZS0+aWNwX2F1dG9fbG93ID0gSUNQX0xFVkVMMjsKKwl9CisKKwlzdGF0ZS0+aWNwX2RpZyA9IElDUF9MRVZFTDM7CisJc3RhdGUtPmljcF9tYW4gPSBJQ1BfTEVWRUwxOworCXN0YXRlLT5hY3Bfb24gID0gMTsKKwlzdGF0ZS0+dmNvX21vZGUgPSAwOworCXN0YXRlLT52Y29fc2hpZnQgPSAwOworCXN0YXRlLT52Y29fYmFuZCA9IFZDT0JBTkRTRUxfMTsKKwlzdGF0ZS0+YnNfZGVsYXkgPSA4OworCXN0YXRlLT5ic19mcmVxY250ID0gMHgwZmZmOworCXN0YXRlLT5ic19yZGl2ID0gMHgwZmZmOworCXN0YXRlLT5wcmVzY2FsZXJfbW9kZSA9IDA7CisJc3RhdGUtPmxuYV9nYWluID0gTE5BX01BWF9HQUlOOworCXN0YXRlLT5yZnZnYV9iaWFzX2N0cmwgPSAxOworCXN0YXRlLT5Gd2luZG93X2VuYWJsZWQgPSAxOworCisJY3gyNDExM19zZXRfRnJlZihzdGF0ZSwgMCk7CisJY3gyNDExM19lbmFibGUoc3RhdGUsIDB4M2QpOworCWN4MjQxMTNfc2V0X3BhcmFtZXRlcnMoc3RhdGUpOworCisJY3gyNDExM19zZXRfZ2Fpbl9zZXR0aW5ncyhzdGF0ZSwgLTMwKTsKKworCWN4MjQxMTNfc2V0X2JhbmR3aWR0aChzdGF0ZSwgMTgwMjUpOworCWN4MjQxMTNfc2V0X2Nsa19pbnZlcnNpb24oc3RhdGUsIDEpOworCisJaWYgKHN0YXRlLT5jb25maWctPnh0YWxfa2h6ID49IDQwMDAwKQorCQlyZXQgPSBjeDI0MTEzX3dyaXRlcmVnKHN0YXRlLCAweDAyLAorCQkJKGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgwMikgJiAweGZiKSB8ICgxIDw8IDIpKTsKKwllbHNlCisJCXJldCA9IGN4MjQxMTNfd3JpdGVyZWcoc3RhdGUsIDB4MDIsCisJCQkoY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDAyKSAmIDB4ZmIpIHwgKDAgPDwgMikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjeDI0MTEzX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwkvKiBmb3IgYSBST0xMLU9GRiBmYWN0b3Igb2YgMC4zNSwgMC4yOiA2MDAsIDAuMjU6IDYyNSAqLworCXUzMiByb2xsX29mZiA9IDY3NTsKKwl1MzIgYnc7CisKKwlidyAgPSAoKHAtPnUucXBzay5zeW1ib2xfcmF0ZS8xMDApICogcm9sbF9vZmYpIC8gMTAwMDsKKwlidyArPSAoMTAwMDAwMDAvMTAwKSArIDU7CisJYncgLz0gMTA7CisJYncgKz0gMTAwMDsKKwljeDI0MTEzX3NldF9iYW5kd2lkdGgoc3RhdGUsIGJ3KTsKKworCWN4MjQxMTNfc2V0X2ZyZXF1ZW5jeShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKKwltc2xlZXAoNSk7CisJcmV0dXJuIGN4MjQxMTNfZ2V0X3N0YXR1cyhmZSwgJmJ3KTsKK30KKworc3RhdGljIHM4IGN4MjQxMTNfYWdjX3RhYmxlWzJdWzEwXSA9IHsKKwl7LTU0LCAtNDEsIC0zNSwgLTMwLCAtMjUsIC0yMSwgLTE2LCAtMTAsICAtNiwgIC0yfSwKKwl7LTM5LCAtMzUsIC0zMCwgLTI1LCAtMTksIC0xNSwgLTExLCAgLTUsICAgMSwgICA5fSwKK307CisKK3ZvaWQgY3gyNDExM19hZ2NfY2FsbGJhY2soc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJczE2IHMsIGk7CisJaWYgKCFmZS0+b3BzLnJlYWRfc2lnbmFsX3N0cmVuZ3RoKQorCQlyZXR1cm47CisKKwlkbyB7CisJCS8qIHRoaXMgb25seSB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IENYMjQxMjMgaW1wbGVtZW50YXRpb24gKi8KKwkJZmUtPm9wcy5yZWFkX3NpZ25hbF9zdHJlbmd0aChmZSwgKHUxNiAqKSAmcyk7CisJCXMgPj49IDg7CisJCWRwcmludGsoInNpZ25hbCBzdHJlbmd0aDogJWRcbiIsIHMpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGN4MjQxMTNfYWdjX3RhYmxlWzBdKTsgaSsrKQorCQkJaWYgKGN4MjQxMTNfYWdjX3RhYmxlW3N0YXRlLT5nYWluX2xldmVsXVtpXSA+IHMpCisJCQkJYnJlYWs7CisJCXMgPSAtMjUgLSBpKjU7CisJfSB3aGlsZSAoY3gyNDExM19zZXRfZ2Fpbl9zZXR0aW5ncyhzdGF0ZSwgcykpOworfQorRVhQT1JUX1NZTUJPTChjeDI0MTEzX2FnY19jYWxsYmFjayk7CisKK3N0YXRpYyBpbnQgY3gyNDExM19nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgY3gyNDExM19zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwkqZnJlcXVlbmN5ID0gc3RhdGUtPmZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTEzX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGN4MjQxMTNfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJZHByaW50aygiXG4iKTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl90dW5lcl9vcHMgY3gyNDExM190dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJDb25leGFudCBDWDI0MTEzIiwKKwkJLmZyZXF1ZW5jeV9taW4gID0gOTUwMDAwLAorCQkuZnJlcXVlbmN5X21heCAgPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAxMjUsCisJfSwKKworCS5yZWxlYXNlICAgICAgID0gY3gyNDExM19yZWxlYXNlLAorCisJLmluaXQgICAgICAgICAgPSBjeDI0MTEzX2luaXQsCisJLnNsZWVwICAgICAgICAgPSBOVUxMLAorCisJLnNldF9wYXJhbXMgICAgPSBjeDI0MTEzX3NldF9wYXJhbXMsCisJLmdldF9mcmVxdWVuY3kgPSBjeDI0MTEzX2dldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGggPSBOVUxMLAorCS5nZXRfc3RhdHVzICAgID0gY3gyNDExM19nZXRfc3RhdHVzLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqY3gyNDExM19hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCWNvbnN0IHN0cnVjdCBjeDI0MTEzX2NvbmZpZyAqY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXN0cnVjdCBjeDI0MTEzX3N0YXRlICpzdGF0ZSA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDI0MTEzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaW50IHJjOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCWVycigiVW5hYmxlIHRvIGttYWxsb2NcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHNldHVwIHRoZSBzdGF0ZSAqLworCXN0YXRlLT5jb25maWcgPSBjb25maWc7CisJc3RhdGUtPmkyYyA9IGkyYzsKKworCWluZm8oInRyeWluZyB0byBkZXRlY3QgbXlzZWxmXG4iKTsKKworCS8qIG1ha2luZyBhIGR1bW15IHJlYWQsIGJlY2F1c2Ugb2Ygc29tZSBleHBlY3RlZCB0cm91YmxlcworCSAqIGFmdGVyIHBvd2VyIG9uICovCisJY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDAwKTsKKworCXJjID0gY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWluZm8oIkNYMjQxMTMgbm90IGZvdW5kLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXN0YXRlLT5yZXYgPSByYzsKKworCXN3aXRjaCAocmMpIHsKKwljYXNlIDB4NDM6CisJCWluZm8oImRldGVjdGVkIENYMjQxMTMgdmFyaWFudFxuIik7CisJCWJyZWFrOworCWNhc2UgUkVWX0NYMjQxMTM6CisJCWluZm8oInN1Y2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKKwkJZ290byBlcnJvcjsKKwl9CisJc3RhdGUtPnZlciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgwMSk7CisJaW5mbygidmVyc2lvbjogJXhcbiIsIHN0YXRlLT52ZXIpOworCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZjeDI0MTEzX3R1bmVyX29wcywKKwkJCXNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCWZlLT50dW5lcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuIGZlOworCitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woY3gyNDExM19hdHRhY2gpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiQWN0aXZhdGVzIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDowKSIpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGJAbGludXh0di5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRWQiBGcm9udGVuZCBtb2R1bGUgZm9yIENvbmV4YW50IENYMjQxMTMvQ1gyNDEyOGhhcmR3YXJlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5oCmluZGV4IDVhYjNkZDEuLjVkZTBmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuaApAQCAtMTYsNyArMTYsNyBAQAogICoKICAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuPQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKICNpZm5kZWYgQ1gyNDExM19ICkBAIC0zMCw5ICszMCwxMyBAQAogCXUzMiB4dGFsX2toejsKIH07CiAKLS8qIFRPRE86ICNpZiBkZWZpbmVkKENPTkZJR19EVkJfVFVORVJfQ1gyNDExMykgfHwgXAotICogKGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9DWDI0MTEzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKSAqLworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9DWDI0MTEzKSB8fCBcCisJKGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9DWDI0MTEzX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmN4MjQxMTNfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKKwljb25zdCBzdHJ1Y3QgY3gyNDExM19jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOwogCitleHRlcm4gdm9pZCBjeDI0MTEzX2FnY19jYWxsYmFjayhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CisjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpjeDI0MTEzX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAljb25zdCBzdHJ1Y3QgY3gyNDExM19jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCiB7CkBAIC00NCw1ICs0OCw2IEBACiB7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiB9CisjZW5kaWYKIAogI2VuZGlmIC8qIENYMjQxMTNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKaW5kZXggYjE0NGIzMC4uOWI2Yzg5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICNkZWZpbmUgQ1gyNDExNl9IQVNfU1lOQ0xPQ0sgKDB4MDgpCiAjZGVmaW5lIENYMjQxMTZfSEFTX1VOS05PV04xICgweDEwKQogI2RlZmluZSBDWDI0MTE2X0hBU19VTktOT1dOMiAoMHgyMCkKLSNkZWZpbmUgQ1gyNDExNl9TVEFUVVNfTUFTSyAgKDB4M2YpCisjZGVmaW5lIENYMjQxMTZfU1RBVFVTX01BU0sgICgweDBmKQogI2RlZmluZSBDWDI0MTE2X1NJR05BTF9NQVNLICAoMHhjMCkKIAogI2RlZmluZSBDWDI0MTE2X0RJU0VRQ19UT05FT0ZGICAgKDApICAgIC8qIHRvbmVidXJzdCBuZXZlciBzZW50ICovCkBAIC0xNjAsNiArMTYwLDcgQEAKIAlmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247CiAJZmVfY29kZV9yYXRlX3QgZmVjOwogCisJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsc3lzOwogCWZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOwogCWZlX3BpbG90X3QgcGlsb3Q7CiAJZmVfcm9sbG9mZl90IHJvbGxvZmY7CkBAIC00MTEsMTQgKzQxMiwxNSBAQAogfTsKIAogc3RhdGljIGludCBjeDI0MTE2X2xvb2t1cF9mZWNtb2Qoc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlLAotCWZlX21vZHVsYXRpb25fdCBtLCBmZV9jb2RlX3JhdGVfdCBmKQorCWZlX2RlbGl2ZXJ5X3N5c3RlbV90IGQsIGZlX21vZHVsYXRpb25fdCBtLCBmZV9jb2RlX3JhdGVfdCBmKQogewogCWludCBpLCByZXQgPSAtRU9QTk9UU1VQUDsKIAogCWRwcmludGsoIiVzKDB4JTAyeCwweCUwMngpXG4iLCBfX2Z1bmNfXywgbSwgZik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShDWDI0MTE2X01PREZFQ19NT0RFUyk7IGkrKykgewotCQlpZiAoKG0gPT0gQ1gyNDExNl9NT0RGRUNfTU9ERVNbaV0ubW9kdWxhdGlvbikgJiYKKwkJaWYgKChkID09IENYMjQxMTZfTU9ERkVDX01PREVTW2ldLmRlbGl2ZXJ5X3N5c3RlbSkgJiYKKwkJCShtID09IENYMjQxMTZfTU9ERkVDX01PREVTW2ldLm1vZHVsYXRpb24pICYmCiAJCQkoZiA9PSBDWDI0MTE2X01PREZFQ19NT0RFU1tpXS5mZWMpKSB7CiAJCQkJcmV0ID0gaTsKIAkJCQlicmVhazsKQEAgLTQyOSwxMyArNDMxLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgY3gyNDExNl9zZXRfZmVjKHN0cnVjdCBjeDI0MTE2X3N0YXRlICpzdGF0ZSwKLQlmZV9tb2R1bGF0aW9uX3QgbW9kLCBmZV9jb2RlX3JhdGVfdCBmZWMpCisJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsc3lzLCBmZV9tb2R1bGF0aW9uX3QgbW9kLCBmZV9jb2RlX3JhdGVfdCBmZWMpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlkcHJpbnRrKCIlcygweCUwMngsMHglMDJ4KVxuIiwgX19mdW5jX18sIG1vZCwgZmVjKTsKIAotCXJldCA9IGN4MjQxMTZfbG9va3VwX2ZlY21vZChzdGF0ZSwgbW9kLCBmZWMpOworCXJldCA9IGN4MjQxMTZfbG9va3VwX2ZlY21vZChzdGF0ZSwgZGVsc3lzLCBtb2QsIGZlYyk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTY3OSw3ICs2ODEsOCBAQAogewogCXN0cnVjdCBjeDI0MTE2X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JaW50IGxvY2sgPSBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX1NTVEFUVVMpOworCWludCBsb2NrID0gY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19TU1RBVFVTKSAmCisJCUNYMjQxMTZfU1RBVFVTX01BU0s7CiAKIAlkcHJpbnRrKCIlczogc3RhdHVzID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgbG9jayk7CiAKQEAgLTEyMDUsNyArMTIwOCw3IEBACiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAJc3RydWN0IGN4MjQxMTZfY21kIGNtZDsKIAlmZV9zdGF0dXNfdCB0dW5lcnN0YXQ7Ci0JaW50IGksIHN0YXR1cywgcmV0LCByZXR1bmU7CisJaW50IGksIHN0YXR1cywgcmV0LCByZXR1bmUgPSAxOwogCiAJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOwogCkBAIC0xMjIyLDcgKzEyMjUsNiBAQAogCiAJCS8qIFBpbG90IGRvZXNuJ3QgZXhpc3QgaW4gRFZCLVMsIHR1cm4gYml0IG9mZiAqLwogCQlzdGF0ZS0+ZG54dC5waWxvdF92YWwgPSBDWDI0MTE2X1BJTE9UX09GRjsKLQkJcmV0dW5lID0gMTsKIAogCQkvKiBEVkItUyBvbmx5IHN1cHBvcnRzIDAuMzUgKi8KIAkJaWYgKGMtPnJvbGxvZmYgIT0gUk9MTE9GRl8zNSkgewpAQCAtMTI1MCw3ICsxMjUyLDcgQEAKIAkJY2FzZSBQSUxPVF9BVVRPOgkvKiBOb3Qgc3VwcG9ydGVkIGJ1dCBlbXVsYXRlZCAqLwogCQkJc3RhdGUtPmRueHQucGlsb3RfdmFsID0gKGMtPm1vZHVsYXRpb24gPT0gUVBTSykKIAkJCQk/IENYMjQxMTZfUElMT1RfT0ZGIDogQ1gyNDExNl9QSUxPVF9PTjsKLQkJCXJldHVuZSA9IDI7CisJCQlyZXR1bmUrKzsKIAkJCWJyZWFrOwogCQljYXNlIFBJTE9UX09GRjoKIAkJCXN0YXRlLT5kbnh0LnBpbG90X3ZhbCA9IENYMjQxMTZfUElMT1RfT0ZGOwpAQCAtMTI4Nyw2ICsxMjg5LDcgQEAKIAkJCV9fZnVuY19fLCBjLT5kZWxpdmVyeV9zeXN0ZW0pOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQorCXN0YXRlLT5kbnh0LmRlbHN5cyA9IGMtPmRlbGl2ZXJ5X3N5c3RlbTsKIAlzdGF0ZS0+ZG54dC5tb2R1bGF0aW9uID0gYy0+bW9kdWxhdGlvbjsKIAlzdGF0ZS0+ZG54dC5mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CiAJc3RhdGUtPmRueHQucGlsb3QgPSBjLT5waWxvdDsKQEAgLTEyOTcsNyArMTMwMCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBGRUNfTk9ORS9BVVRPIGZvciBEVkItUzIgaXMgbm90IHN1cHBvcnRlZCBhbmQgZGV0ZWN0ZWQgaGVyZSAqLwotCXJldCA9IGN4MjQxMTZfc2V0X2ZlYyhzdGF0ZSwgYy0+bW9kdWxhdGlvbiwgYy0+ZmVjX2lubmVyKTsKKwlyZXQgPSBjeDI0MTE2X3NldF9mZWMoc3RhdGUsIGMtPmRlbGl2ZXJ5X3N5c3RlbSwgYy0+bW9kdWxhdGlvbiwgYy0+ZmVjX2lubmVyKTsKIAlpZiAocmV0ICE9ICAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMzA4LDYgKzEzMTEsNyBAQAogCS8qIGRpc2NhcmQgdGhlICdjdXJyZW50JyB0dW5pbmcgcGFyYW1ldGVycyBhbmQgcHJlcGFyZSB0byB0dW5lICovCiAJY3gyNDExNl9jbG9uZV9wYXJhbXMoZmUpOwogCisJZHByaW50aygiJXM6ICAgZGVsc3lzICAgICAgPSAlZFxuIiwgX19mdW5jX18sIHN0YXRlLT5kY3VyLmRlbHN5cyk7CiAJZHByaW50aygiJXM6ICAgbW9kdWxhdGlvbiAgPSAlZFxuIiwgX19mdW5jX18sIHN0YXRlLT5kY3VyLm1vZHVsYXRpb24pOwogCWRwcmludGsoIiVzOiAgIGZyZXF1ZW5jeSAgID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZGN1ci5mcmVxdWVuY3kpOwogCWRwcmludGsoIiVzOiAgIHBpbG90ICAgICAgID0gJWQgKHZhbCA9IDB4JTAyeClcbiIsIF9fZnVuY19fLApAQCAtMTQyNyw2ICsxNDMxLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBjeDI0MTE2X3R1bmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLAorCXVuc2lnbmVkIGludCBtb2RlX2ZsYWdzLCB1bnNpZ25lZCBpbnQgKmRlbGF5LCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCSpkZWxheSA9IEhaIC8gNTsKKwlpZiAocGFyYW1zKSB7CisJCWludCByZXQgPSBjeDI0MTE2X3NldF9mcm9udGVuZChmZSwgcGFyYW1zKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiBjeDI0MTE2X3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfZ2V0X2FsZ28oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIERWQkZFX0FMR09fSFc7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeDI0MTE2X29wcyA9IHsKIAogCS5pbmZvID0gewpAQCAtMTQ1OCw2ICsxNDc5LDggQEAKIAkuc2V0X3ZvbHRhZ2UgPSBjeDI0MTE2X3NldF92b2x0YWdlLAogCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gY3gyNDExNl9zZW5kX2Rpc2VxY19tc2csCiAJLmRpc2VxY19zZW5kX2J1cnN0ID0gY3gyNDExNl9kaXNlcWNfc2VuZF9idXJzdCwKKwkuZ2V0X2Zyb250ZW5kX2FsZ28gPSBjeDI0MTE2X2dldF9hbGdvLAorCS50dW5lID0gY3gyNDExNl90dW5lLAogCiAJLnNldF9wcm9wZXJ0eSA9IGN4MjQxMTZfc2V0X3Byb3BlcnR5LAogCS5nZXRfcHJvcGVydHkgPSBjeDI0MTE2X2dldF9wcm9wZXJ0eSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmgKaW5kZXggM2U4MTI2OC4uYWFiODExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmgKQEAgLTY2LDcgKzY2LDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotZXh0ZXJuIGludCBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmMsCitzdGF0aWMgaW5saW5lCitpbnQgZGliNzAwMHBfaTJjX2VudW1lcmF0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAogCQkJCSAgICBpbnQgbm9fb2ZfZGVtb2RzLCB1OCBkZWZhdWx0X2FkZHIsCiAJCQkJICAgIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgY2ZnW10pCiB7CkBAIC03NCwxMyArNzUsMTUgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggbnVtLCB1OCBkaXIsIHU4IHZhbCkKK3N0YXRpYyBpbmxpbmUKK2ludCBkaWI3MDAwcF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggbnVtLCB1OCBkaXIsIHU4IHZhbCkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfd2JkX3JlZihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2IHZhbHVlKQorc3RhdGljIGlubGluZQoraW50IGRpYjcwMDBwX3NldF93YmRfcmVmKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgdmFsdWUpCiB7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4Mzk3eEQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5jCmluZGV4IGI5Y2E1YzguLmVjNGUwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5jCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIEZfU0VUXzBENGgJMgogCiBlbnVtIGZ3X2l4IHsKLSNkZWZpbmUgX0ZXX0VOVFJZKGEsIGIpCQliCisjZGVmaW5lIF9GV19FTlRSWShhLCBiLCBjKQliCiAjaW5jbHVkZSAiZHJ4Mzk3eERfZncuaCIKIH07CiAKQEAgLTcyLDExICs3MiwxMSBAQAogCWludCByZWZjbnQ7CiAJY29uc3QgdTggKmRhdGFbQVJSQVlfU0laRShibG9iX25hbWUpXTsKIH0gZndbXSA9IHsKLSNkZWZpbmUgX0ZXX0VOVFJZKGEsIGIpCQl7CQkJXAotCQkJLm5hbWUJPSBhLAkJCVwKLQkJCS5maWxlCT0gMCwJCQlcCi0JCQkubG9jawk9IFJXX0xPQ0tfVU5MT0NLRUQsCVwKLQkJCS5yZWZjbnQgPSAwLAkJCVwKKyNkZWZpbmUgX0ZXX0VOVFJZKGEsIGIsIGMpCXsJCQkJCVwKKwkJCS5uYW1lCT0gYSwJCQkJCVwKKwkJCS5maWxlCT0gMCwJCQkJCVwKKwkJCS5sb2NrCT0gX19SV19MT0NLX1VOTE9DS0VEKGZ3W2NdLmxvY2spLAlcCisJCQkucmVmY250ID0gMCwJCQkJCVwKIAkJCS5kYXRhCT0geyB9CQl9CiAjaW5jbHVkZSAiZHJ4Mzk3eERfZncuaCIKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4Mzk3eERfZncuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RF9mdy5oCmluZGV4IDAxZGUwMmEuLmM4YjQ0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RF9mdy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RF9mdy5oCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIAogI2lmZGVmIF9GV19FTlRSWQotCV9GV19FTlRSWSgiZHJ4Mzk3eEQuQTIuZnciLAlEUlhEX0ZXX0EyID0gMAkJKSwKLQlfRldfRU5UUlkoImRyeDM5N3hELkIxLmZ3IiwJRFJYRF9GV19CMQkJKSwKKwlfRldfRU5UUlkoImRyeDM5N3hELkEyLmZ3IiwJRFJYRF9GV19BMiA9IDAsCURSWERfRldfQTIJKSwKKwlfRldfRU5UUlkoImRyeDM5N3hELkIxLmZ3IiwJRFJYRF9GV19CMSwJRFJYRF9GV19CMQkpLAogI3VuZGVmIF9GV19FTlRSWQogI2VuZGlmIC8qIF9GV19FTlRSWSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCBlYTA1ODE1Li45ZjYzNDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCS5jb3VudCA9IDQsCiAJLmVudHJpZXMgPSB7CiAJCXsgMTI1MDAwMCwgNTAwLCAweGM0LCAweDAwfSwKLQkJeyAxNTUwMDAwLCA1MDAsIDB4YzQsIDB4NDB9LAorCQl7IDE0NTAwMDAsIDUwMCwgMHhjNCwgMHg0MH0sCiAJCXsgMjA1MDAwMCwgNTAwLCAweGM0LCAweDgwfSwKIAkJeyAyMTUwMDAwLCA1MDAsIDB4YzQsIDB4YzB9LAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWFjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDQuYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIERyaXZlciBmb3IgTEcgQVRTQyBsZ2R0MzMwNCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQHN1bmR0ZWsuZGU+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImxnZHQzMzA0LmgiCisKK3N0YXRpYyAgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsImxnZHQzMzA0IGRlYnVnZ2luZyAoZGVmYXVsdCBvZmYpIik7CisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIGlmIChkZWJ1ZykgZG8ge1wKKwkJCXByaW50aygibGdkdDMzMDQgZGVidWc6ICIgZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCitzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCWZlX21vZHVsYXRpb25fdCBjdXJyZW50X21vZHVsYXRpb247CisJX191MzIgc25yOworCV9fdTMyIGN1cnJlbnRfZnJlcXVlbmN5OworCV9fdTggYWRkcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKK307CisKK3N0YXRpYyBpbnQgaTJjX3dyaXRlX2RlbW9kX2J5dGVzIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgX191OCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBsZ2R0MzMwNF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBpMmNtc2dzID0geworCQkuYWRkciA9IHN0YXRlLT5hZGRyLAorCQkuZmxhZ3MgPSAwLAorCQkubGVuID0gMywKKwkJLmJ1ZiA9IGJ1ZgorCX07CisJaW50IGk7CisJaW50IGVycjsKKworCWZvciAoaT0wOyBpPGxlbi0xOyBpKz0zKXsKKwkJaWYoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmaTJjbXNncywgMSkpPDApIHsKKwkJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZWxzZQorCQkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCWkyY21zZ3MuYnVmICs9IDM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzA0X2kyY19yZWFkX3JlZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGkyY19tc2cgaTJjbXNnc1syXTsKKwlpbnQgcmV0OworCV9fdTggYnVmOworCisJX191OCByZWdidWZbMl0gPSB7IHJlZz4+OCwgcmVnJjB4ZmYgfTsKKworCWkyY21zZ3NbMF0uYWRkciA9IHN0YXRlLT5hZGRyOworCWkyY21zZ3NbMF0uZmxhZ3MgPSAwOworCWkyY21zZ3NbMF0ubGVuID0gMjsKKwlpMmNtc2dzWzBdLmJ1ZiA9IHJlZ2J1ZjsKKworCWkyY21zZ3NbMV0uYWRkciA9IHN0YXRlLT5hZGRyOworCWkyY21zZ3NbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwlpMmNtc2dzWzFdLmxlbiA9IDE7CisJaTJjbXNnc1sxXS5idWYgPSAmYnVmOworCisJaWYoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBpMmNtc2dzLCAyKSk8MCkgeworCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDRfaTJjX3dyaXRlX3JlZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJY2hhciBidWZmZXJbM10gPSB7IHJlZz4+OCwgcmVnJjB4ZmYsIHZhbCB9OworCWludCByZXQ7CisKKwlzdHJ1Y3QgaTJjX21zZyBpMmNtc2dzID0geworCQkuYWRkciA9IHN0YXRlLT5hZGRyLAorCQkuZmxhZ3MgPSAwLAorCQkubGVuID0gMywKKwkJLmJ1Zj1idWZmZXIKKwl9OworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmaTJjbXNncywgMSk7CisJaWYgKHJldCAhPSAxKSB7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsZ2R0MzMwNF9zb2Z0X1Jlc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWxnZHQzMzA0X2kyY193cml0ZV9yZWcoZmUsIDB4MDAwMiwgMHg5YSk7CisJbGdkdDMzMDRfaTJjX3dyaXRlX3JlZyhmZSwgMHgwMDAyLCAweDliKTsKKwltZGVsYXkoMjAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwNF9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbSkgeworCWludCBlcnIgPSAwOworCisJc3RhdGljIF9fdTggbGdkdDMzMDRfdnNiOF9kYXRhW10gPSB7CisJCS8qIDE2Yml0ICAsIDhiaXQgKi8KKwkJLyogcmVncyAgICwgdmFsICAqLworCQkweDAwLCAweDAwLCAweDAyLAorCQkweDAwLCAweDAwLCAweDEzLAorCQkweDAwLCAweDBkLCAweDAyLAorCQkweDAwLCAweDBlLCAweDAyLAorCQkweDAwLCAweDEyLCAweDMyLAorCQkweDAwLCAweDEzLCAweGM0LAorCQkweDAxLCAweDEyLCAweDE3LAorCQkweDAxLCAweDEzLCAweDE1LAorCQkweDAxLCAweDE0LCAweDE4LAorCQkweDAxLCAweDE1LCAweGZmLAorCQkweDAxLCAweDE2LCAweDJjLAorCQkweDAyLCAweDE0LCAweDY3LAorCQkweDAyLCAweDI0LCAweDhkLAorCQkweDA0LCAweDI3LCAweDEyLAorCQkweDA0LCAweDI4LCAweDRmLAorCQkweDAzLCAweDA4LCAweDgwLAorCQkweDAzLCAweDA5LCAweDAwLAorCQkweDAzLCAweDBkLCAweDAwLAorCQkweDAzLCAweDBlLCAweDFjLAorCQkweDAzLCAweDE0LCAweGUxLAorCQkweDA1LCAweDBlLCAweDViLAorCX07CisKKwkvKiBub3QgeWV0IHRlc3RlZCAuLiAqLworCXN0YXRpYyBfX3U4IGxnZHQzMzA0X3FhbTY0X2RhdGFbXSA9IHsKKwkJLyogMTZiaXQgICwgOGJpdCAqLworCQkvKiByZWdzICAgLCB2YWwgICovCisJCTB4MDAsIDB4MDAsIDB4MTgsCisJCTB4MDAsIDB4MGQsIDB4MDIsCisJCS8vMHgwMCwgMHgwZSwgMHgwMiwKKwkJMHgwMCwgMHgxMiwgMHgyYSwKKwkJMHgwMCwgMHgxMywgMHgwMCwKKwkJMHgwMywgMHgxNCwgMHhlMywKKwkJMHgwMywgMHgwZSwgMHgxYywKKwkJMHgwMywgMHgwOCwgMHg2NiwKKwkJMHgwMywgMHgwOSwgMHg2NiwKKwkJMHgwMywgMHgwYSwgMHgwOCwKKwkJMHgwMywgMHgwYiwgMHg5YiwKKwkJMHgwNSwgMHgwZSwgMHg1YiwKKwl9OworCisKKwkvKiB0ZXN0ZWQgd2l0aCBLV29ybGQgYTM0MCAqLworCXN0YXRpYyBfX3U4IGxnZHQzMzA0X3FhbTI1Nl9kYXRhW10gPSB7CisJCS8qIDE2Yml0ICAsIDhiaXQgKi8KKwkJLyogcmVncyAgICwgdmFsICAqLworCQkweDAwLCAweDAwLCAweDAxLCAgLy8weDE5LAorCQkweDAwLCAweDEyLCAweDJhLAorCQkweDAwLCAweDEzLCAweDgwLAorCQkweDAwLCAweDBkLCAweDAyLAorCQkweDAzLCAweDE0LCAweGUzLAorCisJCTB4MDMsIDB4MGUsIDB4MWMsCisJCTB4MDMsIDB4MDgsIDB4NjYsCisJCTB4MDMsIDB4MDksIDB4NjYsCisJCTB4MDMsIDB4MGEsIDB4MDgsCisJCTB4MDMsIDB4MGIsIDB4OWIsCisKKwkJMHgwMywgMHgwZCwgMHgxNCwKKwkJLy8weDA1LCAweDBlLCAweDViLAorCQkweDAxLCAweDA2LCAweDRhLAorCQkweDAxLCAweDA3LCAweDNkLAorCQkweDAxLCAweDA4LCAweDcwLAorCQkweDAxLCAweDA5LCAweGEzLAorCisJCTB4MDUsIDB4MDQsIDB4ZmQsCisKKwkJMHgwMCwgMHgwZCwgMHg4MiwKKworCQkweDA1LCAweDBlLCAweDViLAorCisJCTB4MDUsIDB4MGUsIDB4NWIsCisKKwkJMHgwMCwgMHgwMiwgMHg5YSwKKworCQkweDAwLCAweDAyLCAweDliLAorCisJCTB4MDAsIDB4MDAsIDB4MDEsCisJCTB4MDAsIDB4MTIsIDB4MmEsCisJCTB4MDAsIDB4MTMsIDB4ODAsCisJCTB4MDAsIDB4MGQsIDB4MDIsCisJCTB4MDMsIDB4MTQsIDB4ZTMsCisKKwkJMHgwMywgMHgwZSwgMHgxYywKKwkJMHgwMywgMHgwOCwgMHg2NiwKKwkJMHgwMywgMHgwOSwgMHg2NiwKKwkJMHgwMywgMHgwYSwgMHgwOCwKKwkJMHgwMywgMHgwYiwgMHg5YiwKKworCQkweDAzLCAweDBkLCAweDE0LAorCQkweDAxLCAweDA2LCAweDRhLAorCQkweDAxLCAweDA3LCAweDNkLAorCQkweDAxLCAweDA4LCAweDcwLAorCQkweDAxLCAweDA5LCAweGEzLAorCisJCTB4MDUsIDB4MDQsIDB4ZmQsCisKKwkJMHgwMCwgMHgwZCwgMHg4MiwKKworCQkweDA1LCAweDBlLCAweDViLAorCX07CisKKwlzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaWYgKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gIT0gcGFyYW0tPnUudnNiLm1vZHVsYXRpb24pIHsKKwkJc3dpdGNoKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJCWNhc2UgVlNCXzg6CisJCQllcnIgPSBpMmNfd3JpdGVfZGVtb2RfYnl0ZXMoZmUsIGxnZHQzMzA0X3ZzYjhfZGF0YSwKKwkJCQkJc2l6ZW9mKGxnZHQzMzA0X3ZzYjhfZGF0YSkpOworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzY0OgorCQkJZXJyID0gaTJjX3dyaXRlX2RlbW9kX2J5dGVzKGZlLCBsZ2R0MzMwNF9xYW02NF9kYXRhLAorCQkJCQlzaXplb2YobGdkdDMzMDRfcWFtNjRfZGF0YSkpOworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzI1NjoKKwkJCWVyciA9IGkyY193cml0ZV9kZW1vZF9ieXRlcyhmZSwgbGdkdDMzMDRfcWFtMjU2X2RhdGEsCisJCQkJCXNpemVvZihsZ2R0MzMwNF9xYW0yNTZfZGF0YSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlcnIpIHsKKwkJCXByaW50aygiJXMgZXJyb3Igc2V0dGluZyBtb2R1bGF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UgeworCQkJc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uOworCQl9CisJfQorCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7CisKKwlsZ2R0MzMwNF9zb2Z0X1Jlc2V0KGZlKTsKKworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpCisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzA0X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwNF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkgeworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGdkdDMzMDRfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IGxnZHQzMzA0X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByMDExZDsKKwlpbnQgcWFtX2xjazsKKworCSpzdGF0dXMgPSAwOworCWRwcmludGsoImxnZHQgcmVhZCBzdGF0dXNcbiIpOworCisJcjAxMWQgPSBsZ2R0MzMwNF9pMmNfcmVhZF9yZWcoZmUsIDB4MDExZCk7CisKKwlkcHJpbnRrKCIlMDJ4XG4iLCByMDExZCk7CisKKwlzd2l0Y2goc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbikgeworCWNhc2UgVlNCXzg6CisJCWlmIChyMDExZCAmIDB4ODApIHsKKwkJCWRwcmludGsoIlZTQiBMb2NrZWRcbiIpOworCQkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0xPQ0s7CisJCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCQkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCWNhc2UgUUFNXzI1NjoKKwkJcWFtX2xjayA9IHIwMTFkICYgMHg3OworCQlzd2l0Y2gocWFtX2xjaykgeworCQkJY2FzZSAweDA6IGRwcmludGsoIlVubG9ja1xuIik7CisJCQkJICBicmVhazsKKwkJCWNhc2UgMHg0OiBkcHJpbnRrKCIxc3QgTG9jayBpbiBhY3F1aXNpdGlvbiBzdGF0ZVxuIik7CisJCQkJICBicmVhazsKKwkJCWNhc2UgMHg2OiBkcHJpbnRrKCIybmQgTG9jayBpbiBhY3F1aXNpdGlvbiBzdGF0ZVxuIik7CisJCQkJICBicmVhazsKKwkJCWNhc2UgMHg3OiBkcHJpbnRrKCJGaW5hbCBMb2NrIGluIGdvb2QgcmVjZXB0aW9uIHN0YXRlXG4iKTsKKwkJCQkgICpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCQkJICAqc3RhdHVzIHw9IEZFX0hBU19MT0NLOworCQkJCSAgKnN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKKwkJCQkgICpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKKwkJCQkgIGJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiJXMgdW5oYW5kbGVkIG1vZHVsYXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwNF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgX191MzIgKmJlcikKK3sKKwlkcHJpbnRrKCJyZWFkIGJlclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDRfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIF9fdTE2ICpzbnIpCit7CisJZHByaW50aygicmVhZCBzbnJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzA0X3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIF9fdTMyICp1Y2Jsb2NrcykKK3sKKwlkcHJpbnRrKCJyZWFkIHVjYmxvY2tzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGdkdDMzMDRfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwNF9zdGF0ZSAqKWZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRlbW9kX2xnZHQzMzA0PXsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiTEcgMzMwNCIsCisJCS50eXBlID0gRkVfQVRTQywKKwkJLmZyZXF1ZW5jeV9taW4gPSA1NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggPSA4NTgwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSA2MjUwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiA9IDUwNTY5NDEsCisJCS5zeW1ib2xfcmF0ZV9tYXggPSAxMDc2MjAwMCwKKwkJLmNhcHMgPSBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FBTV8yNTYgfCBGRV9DQU5fOFZTQgorCX0sCisJLmluaXQgPSBsZ2R0MzMwNF9pbml0LAorCS5zbGVlcCA9IGxnZHQzMzA0X3NsZWVwLAorCS5zZXRfZnJvbnRlbmQgPSBsZ2R0MzMwNF9zZXRfcGFyYW1ldGVycywKKwkucmVhZF9zbnIgPSBsZ2R0MzMwNF9yZWFkX3NuciwKKwkucmVhZF9iZXIgPSBsZ2R0MzMwNF9yZWFkX2JlciwKKwkucmVhZF9zdGF0dXMgPSBsZ2R0MzMwNF9yZWFkX3N0YXR1cywKKwkucmVhZF91Y2Jsb2NrcyA9IGxnZHQzMzA0X3JlYWRfdWNibG9ja3MsCisJLnJlbGVhc2UgPSBsZ2R0MzMwNF9yZWxlYXNlLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogbGdkdDMzMDRfYXR0YWNoKGNvbnN0IHN0cnVjdCBsZ2R0MzMwNF9jb25maWcgKmNvbmZpZywKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisKKwlzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUgKnN0YXRlOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxnZHQzMzA0X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJbWVtc2V0KHN0YXRlLCAweDAsIHNpemVvZihzdHJ1Y3QgbGdkdDMzMDRfc3RhdGUpKTsKKwlzdGF0ZS0+YWRkciA9IGNvbmZpZy0+aTJjX2FkZHJlc3M7CisJc3RhdGUtPmkyYyA9IGkyYzsKKworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmRlbW9kX2xnZHQzMzA0LCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChsZ2R0MzMwNF9hdHRhY2gpOworTU9EVUxFX0FVVEhPUigiTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGVtcGlhdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxHRSBMR0RUMzMwNCBEVkItVCBkZW1vZHVsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzA0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0MDlmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBEVkItVCBsZ2R0MzMwNCBkZW1vZHVsYXRvcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS49CisgKi8KKworI2lmbmRlZiBMR0RUMzMwNF9ICisjZGVmaW5lIExHRFQzMzA0X0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgbGdkdDMzMDRfY29uZmlnCit7CisJLyogZGVtb2R1bGF0b3IncyBJMkMgYWRkcmVzcyAqLworCXU4IGkyY19hZGRyZXNzOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9MR0RUMzMwNCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9MR0RUMzMwNF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBsZ2R0MzMwNF9hdHRhY2goY29uc3Qgc3RydWN0IGxnZHQzMzA0X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBsZ2R0MzMwNF9hdHRhY2goY29uc3Qgc3RydWN0IGxnZHQzMzA0X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfRFZCX0xHRFQgKi8KKworI2VuZGlmIC8qIExHRFQzMzA0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDExLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQxMS5jCmluZGV4IDQwNjQ0YWEuLjY2ZTJkZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDExLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MTEuYwpAQCAtODc0LDYgKzg3NCw5IEBACiAJLyogTm90ZTogTGVhdmluZyB0aGUgSTJDIGdhdGUgb3BlbiBoZXJlLiAqLwogCXM1aDE0MTFfd3JpdGVyZWcoc3RhdGUsIFM1SDE0MTFfSTJDX1RPUF9BRERSLCAweGY1LCAxKTsKIAorCS8qIFB1dCB0aGUgZGV2aWNlIGludG8gbG93LXBvd2VyIG1vZGUgdW50aWwgZmlyc3QgdXNlICovCisJczVoMTQxMV9zZXRfcG93ZXJzdGF0ZSgmc3RhdGUtPmZyb250ZW5kLCAxKTsKKwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zOTIxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zOTIxX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRiNTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfY29yZS5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogRHJpdmVyIGZvciBTaGFycCBzOTIxIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAc3VuZHRlay5kZT4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJzOTIxX2NvcmUuaCIKKworc3RhdGljIGludCBzOTIxX2lzZGJfaW5pdChzdHJ1Y3QgczkyMV9pc2RiX3QgKmRldik7CitzdGF0aWMgaW50IHM5MjFfaXNkYl9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgczkyMV9pc2RiX3QgKmRldiwgc3RydWN0IHM5MjFfaXNkYl90X3RyYW5zbWlzc2lvbl9tb2RlX3BhcmFtcyAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgczkyMV9pc2RiX3R1bmUoc3RydWN0IHM5MjFfaXNkYl90ICpkZXYsIHN0cnVjdCBzOTIxX2lzZGJfdF90dW5lX3BhcmFtcyAqcGFyYW1zKTsKK3N0YXRpYyBpbnQgczkyMV9pc2RiX2dldF9zdGF0dXMoc3RydWN0IHM5MjFfaXNkYl90ICpkZXYsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgdTggaW5pdF90YWJsZVtdPXsgMHgwMSwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMywgMHg0MCwgMHgwNCwgMHgwMSwKKwkJCSAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA4LCAweDAwLAorCQkJIDB4MDksIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGIsIDB4NWEsIDB4MGMsIDB4MDAsCisJCQkgMHgwZCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgxMywgMHgxYiwgMHgxNCwgMHg4MCwKKwkJCSAweDE1LCAweDQwLCAweDE3LCAweDcwLCAweDE4LCAweDAxLCAweDE5LCAweDEyLAorCQkJIDB4MWEsIDB4MDEsIDB4MWIsIDB4MTIsIDB4MWMsIDB4YTAsIDB4MWQsIDB4MDAsCisJCQkgMHgxZSwgMHgwYSwgMHgxZiwgMHgwOCwgMHgyMCwgMHg0MCwgMHgyMSwgMHhmZiwKKwkJCSAweDIyLCAweDRjLCAweDIzLCAweDRlLCAweDI0LCAweDRjLCAweDI1LCAweDAwLAorCQkJIDB4MjYsIDB4MDAsIDB4MjcsIDB4ZjQsIDB4MjgsIDB4NjAsIDB4MjksIDB4ODgsCisJCQkgMHgyYSwgMHg0MCwgMHgyYiwgMHg0MCwgMHgyYywgMHhmZiwgMHgyZCwgMHgwMCwKKwkJCSAweDJlLCAweGZmLCAweDJmLCAweDAwLCAweDMwLCAweDIwLCAweDMxLCAweDA2LAorCQkJIDB4MzIsIDB4MGMsIDB4MzQsIDB4MGYsIDB4MzcsIDB4ZmUsIDB4MzgsIDB4MDAsCisJCQkgMHgzOSwgMHg2MywgMHgzYSwgMHgxMCwgMHgzYiwgMHgxMCwgMHg0NywgMHgwMCwKKwkJCSAweDQ5LCAweGU1LCAweDRiLCAweDAwLCAweDUwLCAweGMwLCAweDUyLCAweDIwLAorCQkJIDB4NTQsIDB4NWEsIDB4NTUsIDB4NWIsIDB4NTYsIDB4NDAsIDB4NTcsIDB4NzAsCisJCQkgMHg1YywgMHg1MCwgMHg1ZCwgMHgwMCwgMHg2MiwgMHgxNywgMHg2MywgMHgyZiwKKwkJCSAweDY0LCAweDZmLCAweDY4LCAweDAwLCAweDY5LCAweDg5LCAweDZhLCAweDAwLAorCQkJIDB4NmIsIDB4MDAsIDB4NmMsIDB4MDAsIDB4NmQsIDB4MDAsIDB4NmUsIDB4MDAsCisJCQkgMHg3MCwgMHgwMCwgMHg3MSwgMHgwMCwgMHg3NSwgMHgwMCwgMHg3NiwgMHgzMCwKKwkJCSAweDc3LCAweDAxLCAweGFmLCAweDAwLCAweGIwLCAweGEwLCAweGIyLCAweDNkLAorCQkJIDB4YjMsIDB4MjUsIDB4YjQsIDB4OGIsIDB4YjUsIDB4NGIsIDB4YjYsIDB4M2YsCisJCQkgMHhiNywgMHhmZiwgMHhiOCwgMHhmZiwgMHhiOSwgMHhmYywgMHhiYSwgMHgwMCwKKwkJCSAweGJiLCAweDAwLCAweGJjLCAweDAwLCAweGQwLCAweDMwLCAweGU0LCAweDg0LAorCQkJIDB4ZjAsIDB4NDgsIDB4ZjEsIDB4MTksIDB4ZjIsIDB4NWEsIDB4ZjMsIDB4OGUsCisJCQkgMHhmNCwgMHgyZCwgMHhmNSwgMHgwNywgMHhmNiwgMHg1YSwgMHhmNywgMHhiYSwKKwkJCSAweGY4LCAweGQ3IH07CisKK3N0YXRpYyB1OCBjX3RhYmxlW109eyAweDU4LCAweDhhLCAweDdiLCAweDU5LCAweDhjLCAweDdiLCAweDVhLCAweDhlLCAweDViLAorCQkgICAgICAweDViLCAweDkwLCAweDViLCAweDVjLCAweDkyLCAweDViLCAweDVkLCAweDk0LCAweDViLAorCQkgICAgICAweDVlLCAweDk2LCAweDViLCAweDVmLCAweDk4LCAweDNiLCAweDYwLCAweDlhLCAweDNiLAorCQkgICAgICAweDYxLCAweDljLCAweDNiLCAweDYyLCAweDllLCAweDNiLCAweDYzLCAweGEwLCAweDNiLAorCQkgICAgICAweDY0LCAweGEyLCAweDFiLCAweDY1LCAweGE0LCAweDFiLCAweDY2LCAweGE2LCAweDFiLAorCQkgICAgICAweDY3LCAweGE4LCAweDFiLCAweDY4LCAweGFhLCAweDFiLCAweDY5LCAweGFjLCAweDFiLAorCQkgICAgICAweDZhLCAweGFlLCAweDFiLCAweDZiLCAweGIwLCAweDFiLCAweDZjLCAweGIyLCAweDFiLAorCQkgICAgICAweDZkLCAweGI0LCAweGZiLCAweDZlLCAweGI2LCAweGZiLCAweDZmLCAweGI4LCAweGZiLAorCQkgICAgICAweDcwLCAweGJhLCAweGZiLCAweDcxLCAweGJjLCAweGRiLCAweDcyLCAweGJlLCAweGRiLAorCQkgICAgICAweDczLCAweGMwLCAweGRiLCAweDc0LCAweGMyLCAweGRiLCAweDc1LCAweGM0LCAweGRiLAorCQkgICAgICAweDc2LCAweGM2LCAweGRiLCAweDc3LCAweGM4LCAweGJiLCAweDc4LCAweGNhLCAweGJiLAorCQkgICAgICAweDc5LCAweGNjLCAweGJiLCAweDdhLCAweGNlLCAweGJiLCAweDdiLCAweGQwLCAweGJiLAorCQkgICAgICAweDdjLCAweGQyLCAweGJiLCAweDdkLCAweGQ0LCAweGJiLCAweDdlLCAweGQ2LCAweGJiLAorCQkgICAgICAweDdmLCAweGQ4LCAweGJiLCAweDgwLCAweGRhLCAweDliLCAweDgxLCAweGRjLCAweDliLAorCQkgICAgICAweDgyLCAweGRlLCAweDliLCAweDgzLCAweGUwLCAweDliLCAweDg0LCAweGUyLCAweDliLAorCQkgICAgICAweDg1LCAweGU0LCAweDliLCAweDg2LCAweGU2LCAweDliLCAweDg3LCAweGU4LCAweDliLAorCQkgICAgICAweDg4LCAweGVhLCAweDliLCAweDg5LCAweGVjLCAweDliIH07CisKK2ludCBzOTIxX2lzZGJfY21kKHN0cnVjdCBzOTIxX2lzZGJfdCAqZGV2LCB1MzIgY21kLCB2b2lkICpkYXRhKSB7CisJc3dpdGNoKGNtZCkgeworCWNhc2UgSVNEQl9UX0NNRF9JTklUOgorCQlzOTIxX2lzZGJfaW5pdChkZXYpOworCQlicmVhazsKKwljYXNlIElTREJfVF9DTURfU0VUX1BBUkFNOgorCQlzOTIxX2lzZGJfc2V0X3BhcmFtZXRlcnMoZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBJU0RCX1RfQ01EX1RVTkU6CisJCXM5MjFfaXNkYl90dW5lKGRldiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgSVNEQl9UX0NNRF9HRVRfU1RBVFVTOgorCQlzOTIxX2lzZGJfZ2V0X3N0YXR1cyhkZXYsIGRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoInVuaGFuZGxlZCBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM5MjFfaXNkYl9pbml0KHN0cnVjdCBzOTIxX2lzZGJfdCAqZGV2KSB7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHJldDsKKwlwcmludGsoImlzZGJfaW5pdFxuIik7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0X3RhYmxlKTsgaSs9MikgeworCQlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCBpbml0X3RhYmxlW2ldLCBpbml0X3RhYmxlW2krMV0pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByaW50aygiaTJjIHdyaXRlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM5MjFfaXNkYl9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgczkyMV9pc2RiX3QgKmRldiwgc3RydWN0IHM5MjFfaXNkYl90X3RyYW5zbWlzc2lvbl9tb2RlX3BhcmFtcyAqcGFyYW1zKSB7CisKKwlpbnQgcmV0OworCS8qIGF1dG8gaXMgc3VmZmljaWVudCBmb3Igbm93LCBsYXRlcm9uIHRoaXMgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBhbiBleHRyYSBpbnRlcmZhY2UgKi8KKworCisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGIwLCAweGEwKTsgLy9tb2RfYjIpOworCXJldCA9IGRldi0+aTJjX3dyaXRlKGRldi0+cHJpdl9kZXYsIDB4YjIsIDB4M2QpOyAvL21vZF9iMik7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGIzLCAweDI1KTsgLy9tb2RfYjMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRldi0+aTJjX3dyaXRlKGRldi0+cHJpdl9kZXYsIDB4YjQsIDB4OGIpOyAvL21vZF9iNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHhiNSwgMHg0Yik7IC8vbW9kX2I1KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGI2LCAweDNmKTsgLy9tb2RfYjYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRldi0+aTJjX3dyaXRlKGRldi0+cHJpdl9kZXYsIDB4YjcsIDB4M2YpOyAvL21vZF9iNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIEVfT0s7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9pc2RiX3R1bmUoc3RydWN0IHM5MjFfaXNkYl90ICpkZXYsIHN0cnVjdCBzOTIxX2lzZGJfdF90dW5lX3BhcmFtcyAqcGFyYW1zKSB7CisKKwlpbnQgcmV0OworCWludCBpbmRleDsKKworCWluZGV4ID0gKHBhcmFtcy0+ZnJlcXVlbmN5IC0gNDczMTQzMDAwKS82MDAwMDAwOworCisJaWYgKGluZGV4ID4gNDgpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHg0NywgMHg2MCk7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweDY4LCAweDAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweDY5LCAweDg5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGYwLCAweDQ4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGYxLCAweDE5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGYyLCBjX3RhYmxlW2luZGV4KjNdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXYtPmkyY193cml0ZShkZXYtPnByaXZfZGV2LCAweGYzLCBjX3RhYmxlW2luZGV4KjMrMV0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRldi0+aTJjX3dyaXRlKGRldi0+cHJpdl9kZXYsIDB4ZjQsIGNfdGFibGVbaW5kZXgqMysyXSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHhmNSwgMHhhZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHhmNiwgMHhiNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHhmNywgMHhiYSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHhmOCwgMHhkNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHg2OCwgMHgwYSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHg2OSwgMHgwOSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5pMmNfd3JpdGUoZGV2LT5wcml2X2RldiwgMHgwMSwgMHg0MCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9pc2RiX2dldF9zdGF0dXMoc3RydWN0IHM5MjFfaXNkYl90ICpkZXYsIHZvaWQgKmRhdGEpIHsKKwl1bnNpZ25lZCBpbnQgKnJldCA9ICh1bnNpZ25lZCBpbnQqKWRhdGE7CisJdTggaWZhZ2NfZHQ7CisJdTggcmZhZ2NfZHQ7CisKKwltZGVsYXkoMTApOworCWlmYWdjX2R0ID0gZGV2LT5pMmNfcmVhZChkZXYtPnByaXZfZGV2LCAweDgxKTsKKwlyZmFnY19kdCA9IGRldi0+aTJjX3JlYWQoZGV2LT5wcml2X2RldiwgMHg4Mik7CisJaWYgKHJmYWdjX2R0ID09IDB4NDApIHsKKwkJKnJldCA9IDE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfY29yZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmYxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9jb3JlLmgKQEAgLTAsMCArMSwxMTQgQEAKKyNpZm5kZWYgX1M5MjFfQ09SRV9ICisjZGVmaW5lIF9TOTIxX0NPUkVfSAorLy8jZGVmaW5lIHU4IHVuc2lnbmVkIGludAorLy8jZGVmaW5lIHUzMiB1bnNpZ25lZCBpbnQKKworCisKKy8vI2RlZmluZSBFSU5WQUwgLTEKKyNkZWZpbmUgRV9PSyAwCisKK3N0cnVjdCBzOTIxX2lzZGJfdCB7CisJdm9pZCAqcHJpdl9kZXY7CisJaW50ICgqaTJjX3dyaXRlKSh2b2lkICpkZXYsIHU4IHJlZywgdTggdmFsKTsKKwlpbnQgKCppMmNfcmVhZCkodm9pZCAqZGV2LCB1OCByZWcpOworfTsKKworI2RlZmluZSBJU0RCX1RfQ01EX0lOSVQgICAgICAgMAorI2RlZmluZSBJU0RCX1RfQ01EX1NFVF9QQVJBTSAgMQorI2RlZmluZSBJU0RCX1RfQ01EX1RVTkUgICAgICAgMgorI2RlZmluZSBJU0RCX1RfQ01EX0dFVF9TVEFUVVMgMworCitzdHJ1Y3QgczkyMV9pc2RiX3RfdHVuZV9wYXJhbXMgeworCXUzMiBmcmVxdWVuY3k7Cit9OworCitzdHJ1Y3QgczkyMV9pc2RiX3Rfc3RhdHVzIHsKK307CisKK3N0cnVjdCBzOTIxX2lzZGJfdF90cmFuc21pc3Npb25fbW9kZV9wYXJhbXMgeworCXU4IG1vZGU7CisJdTggbGF5ZXJfYV9tb2RlOworI2RlZmluZSBJU0RCX1RfTEFfTU9ERV8xIDAKKyNkZWZpbmUgSVNEQl9UX0xBX01PREVfMiAxCisjZGVmaW5lIElTREJfVF9MQV9NT0RFXzMgMgorCXU4IGxheWVyX2FfY2Fycmllcl9tb2R1bGF0aW9uOworI2RlZmluZSBJU0RCX1RfTEFfQ01fRFFQU0sgMAorI2RlZmluZSBJU0RCX1RfTEFfQ01fUVBTSyAgMQorI2RlZmluZSBJU0RCX1RfTEFfQ01fMTZRQU0gMgorI2RlZmluZSBJU0RCX1RfTEFfQ01fNjRRQU0gMworI2RlZmluZSBJU0RCX1RfTEFfQ01fTk9MQVlFUiA0CisJdTggbGF5ZXJfYV9jb2RlX3JhdGU7CisjZGVmaW5lIElTREJfVF9MQV9DUl8xXzIgICAwCisjZGVmaW5lIElTREJfVF9MQV9DUl8yXzMgICAxCisjZGVmaW5lIElTREJfVF9MQV9DUl8zXzQgICAyCisjZGVmaW5lIElTREJfVF9MQV9DUl81XzYgICA0CisjZGVmaW5lIElTREJfVF9MQV9DUl83XzggICA4CisjZGVmaW5lIElTREJfVF9MQV9DUl9OT0xBWUVSICAgMTYKKwl1OCBsYXllcl9hX3RpbWVfaW50ZXJsZWF2ZTsKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzAgIDAKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzEgIDEKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzIgIDIKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzQgIDQKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzggIDgKKyNkZWZpbmUgSVNEQl9UX0xBX1RJXzE2IDE2CisjZGVmaW5lIElTREJfVF9MQV9USV8zMiAzMgorCXU4IGxheWVyX2FfbnNlZzsKKworCXU4IGxheWVyX2JfbW9kZTsKKyNkZWZpbmUgSVNEQl9UX0xCX01PREVfMSAwCisjZGVmaW5lIElTREJfVF9MQl9NT0RFXzIgMQorI2RlZmluZSBJU0RCX1RfTEJfTU9ERV8zIDIKKwl1OCBsYXllcl9iX2NhcnJpZXJfbW9kdWxhdGlvbjsKKyNkZWZpbmUgSVNEQl9UX0xCX0NNX0RRUFNLIDAKKyNkZWZpbmUgSVNEQl9UX0xCX0NNX1FQU0sgIDEKKyNkZWZpbmUgSVNEQl9UX0xCX0NNXzE2UUFNIDIKKyNkZWZpbmUgSVNEQl9UX0xCX0NNXzY0UUFNIDMKKyNkZWZpbmUgSVNEQl9UX0xCX0NNX05PTEFZRVIgNAorCXU4IGxheWVyX2JfY29kZV9yYXRlOworI2RlZmluZSBJU0RCX1RfTEJfQ1JfMV8yICAgMAorI2RlZmluZSBJU0RCX1RfTEJfQ1JfMl8zICAgMQorI2RlZmluZSBJU0RCX1RfTEJfQ1JfM180ICAgMgorI2RlZmluZSBJU0RCX1RfTEJfQ1JfNV82ICAgNAorI2RlZmluZSBJU0RCX1RfTEJfQ1JfN184ICAgOAorI2RlZmluZSBJU0RCX1RfTEJfQ1JfTk9MQVlFUiAgIDE2CisJdTggbGF5ZXJfYl90aW1lX2ludGVybGVhdmU7CisjZGVmaW5lIElTREJfVF9MQl9USV8wICAwCisjZGVmaW5lIElTREJfVF9MQl9USV8xICAxCisjZGVmaW5lIElTREJfVF9MQl9USV8yICAyCisjZGVmaW5lIElTREJfVF9MQl9USV80ICA0CisjZGVmaW5lIElTREJfVF9MQl9USV84ICA4CisjZGVmaW5lIElTREJfVF9MQl9USV8xNiAxNgorI2RlZmluZSBJU0RCX1RfTEJfVElfMzIgMzIKKwl1OCBsYXllcl9iX25zZWc7CisKKwl1OCBsYXllcl9jX21vZGU7CisjZGVmaW5lIElTREJfVF9MQ19NT0RFXzEgMAorI2RlZmluZSBJU0RCX1RfTENfTU9ERV8yIDEKKyNkZWZpbmUgSVNEQl9UX0xDX01PREVfMyAyCisJdTggbGF5ZXJfY19jYXJyaWVyX21vZHVsYXRpb247CisjZGVmaW5lIElTREJfVF9MQ19DTV9EUVBTSyAwCisjZGVmaW5lIElTREJfVF9MQ19DTV9RUFNLICAxCisjZGVmaW5lIElTREJfVF9MQ19DTV8xNlFBTSAyCisjZGVmaW5lIElTREJfVF9MQ19DTV82NFFBTSAzCisjZGVmaW5lIElTREJfVF9MQ19DTV9OT0xBWUVSIDQKKwl1OCBsYXllcl9jX2NvZGVfcmF0ZTsKKyNkZWZpbmUgSVNEQl9UX0xDX0NSXzFfMiAgIDAKKyNkZWZpbmUgSVNEQl9UX0xDX0NSXzJfMyAgIDEKKyNkZWZpbmUgSVNEQl9UX0xDX0NSXzNfNCAgIDIKKyNkZWZpbmUgSVNEQl9UX0xDX0NSXzVfNiAgIDQKKyNkZWZpbmUgSVNEQl9UX0xDX0NSXzdfOCAgIDgKKyNkZWZpbmUgSVNEQl9UX0xDX0NSX05PTEFZRVIgICAxNgorCXU4IGxheWVyX2NfdGltZV9pbnRlcmxlYXZlOworI2RlZmluZSBJU0RCX1RfTENfVElfMCAgMAorI2RlZmluZSBJU0RCX1RfTENfVElfMSAgMQorI2RlZmluZSBJU0RCX1RfTENfVElfMiAgMgorI2RlZmluZSBJU0RCX1RfTENfVElfNCAgNAorI2RlZmluZSBJU0RCX1RfTENfVElfOCAgOAorI2RlZmluZSBJU0RCX1RfTENfVElfMTYgMTYKKyNkZWZpbmUgSVNEQl9UX0xDX1RJXzMyIDMyCisJdTggbGF5ZXJfY19uc2VnOworfTsKKworaW50IHM5MjFfaXNkYl9jbWQoc3RydWN0IHM5MjFfaXNkYl90ICpkZXYsIHUzMiBjbWQsIHZvaWQgKmRhdGEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zOTIxX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYmI5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIERyaXZlciBmb3IgU2hhcnAgczkyMSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQHN1bmR0ZWsuZGU+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiczkyMV9tb2R1bGUuaCIKKyNpbmNsdWRlICJzOTIxX2NvcmUuaCIKKworc3RhdGljICB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiczkyMSBkZWJ1Z2dpbmcgKGRlZmF1bHQgb2ZmKSIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBpZiAoZGVidWcpIGRvIHtcCisJCQlwcmludGsoInM5MjEgZGVidWc6ICIgZm10LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCitzdHJ1Y3QgczkyMV9zdGF0ZQoreworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisJZmVfbW9kdWxhdGlvbl90IGN1cnJlbnRfbW9kdWxhdGlvbjsKKwlfX3UzMiBzbnI7CisJX191MzIgY3VycmVudF9mcmVxdWVuY3k7CisJX191OCBhZGRyOworCXN0cnVjdCBzOTIxX2lzZGJfdCBkZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Cit9OworCitzdGF0aWMgaW50IHM5MjFfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW0pIHsKKwlzdHJ1Y3QgczkyMV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHM5MjFfc3RhdGUgKilmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgczkyMV9pc2RiX3RfdHJhbnNtaXNzaW9uX21vZGVfcGFyYW1zIHBhcmFtczsKKwlzdHJ1Y3QgczkyMV9pc2RiX3RfdHVuZV9wYXJhbXMgdHVuZV9wYXJhbXM7CisKKwl0dW5lX3BhcmFtcy5mcmVxdWVuY3kgPSBwYXJhbS0+ZnJlcXVlbmN5OworCXM5MjFfaXNkYl9jbWQoJnN0YXRlLT5kZXYsIElTREJfVF9DTURfU0VUX1BBUkFNLCAmcGFyYW1zKTsKKwlzOTIxX2lzZGJfY21kKCZzdGF0ZS0+ZGV2LCBJU0RCX1RfQ01EX1RVTkUsICZ0dW5lX3BhcmFtcyk7CisJbWRlbGF5KDEwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKSB7CisJcHJpbnRrKCJzOTIxIGluaXRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM5MjFfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpIHsKKwlwcmludGsoInM5MjEgc2xlZXBcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM5MjFfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IHM5MjFfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzOTIxX3N0YXRlICopZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdW5zaWduZWQgaW50IHJldDsKKwltZGVsYXkoNSk7CisJczkyMV9pc2RiX2NtZCgmc3RhdGUtPmRldiwgSVNEQl9UX0NNRF9HRVRfU1RBVFVTLCAmcmV0KTsKKwkqc3RhdHVzID0gMDsKKworCXByaW50aygic3RhdHVzOiAlMDJ4XG4iLCByZXQpOworCWlmIChyZXQgPT0gMSkgeworCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOworCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLOworCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgX191MzIgKmJlcikKK3sKKwlkcHJpbnRrKCJyZWFkIGJlclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgX191MTYgKnNucikKK3sKKwlkcHJpbnRrKCJyZWFkIHNuclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBfX3UzMiAqdWNibG9ja3MpCit7CisJZHByaW50aygicmVhZCB1Y2Jsb2Nrc1xuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM5MjFfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgczkyMV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHM5MjFfc3RhdGUgKilmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkZW1vZF9zOTIxPXsKKwkuaW5mbyA9IHsKKwkJLm5hbWUJCQk9ICJTSEFSUCBTOTIxIiwKKwkJLnR5cGUJCQk9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluCQk9IDQ3MzE0MzAwMCwKKwkJLmZyZXF1ZW5jeV9tYXgJCT0gNzY3MTQzMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gICA2MDAwMDAwLAorCQkuZnJlcXVlbmN5X3RvbGVyYW5jZQk9IDAsCisJCS5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8CisJCQlGRV9DQU5fRkVDXzNfNCB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAorCQkJRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJCUZFX0NBTl9RUFNLIHwgRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CisJCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUiB8CisJCQlGRV9DQU5fTVVURV9UUworCX0sCisJLmluaXQgPSBzOTIxX2luaXQsCisJLnNsZWVwID0gczkyMV9zbGVlcCwKKwkuc2V0X2Zyb250ZW5kID0gczkyMV9zZXRfcGFyYW1ldGVycywKKwkucmVhZF9zbnIgPSBzOTIxX3JlYWRfc25yLAorCS5yZWFkX2JlciA9IHM5MjFfcmVhZF9iZXIsCisJLnJlYWRfc3RhdHVzID0gczkyMV9yZWFkX3N0YXR1cywKKwkucmVhZF91Y2Jsb2NrcyA9IHM5MjFfcmVhZF91Y2Jsb2NrcywKKwkucmVsZWFzZSA9IHM5MjFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgczkyMV93cml0ZSh2b2lkICpkZXYsIHU4IHJlZywgdTggdmFsKSB7CisJc3RydWN0IHM5MjFfc3RhdGUgKnN0YXRlID0gZGV2OworCWNoYXIgYnVmWzJdPXtyZWcsdmFsfTsKKwlpbnQgZXJyOworCXN0cnVjdCBpMmNfbXNnIGkyY21zZ3MgPSB7CisJCS5hZGRyID0gc3RhdGUtPmFkZHIsCisJCS5mbGFncyA9IDAsCisJCS5sZW4gPSAyLAorCQkuYnVmID0gYnVmCisJfTsKKworCWlmKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJmkyY21zZ3MsIDEpKTwwKSB7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZWxzZQorCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczkyMV9yZWFkKHZvaWQgKmRldiwgdTggcmVnKSB7CisJc3RydWN0IHM5MjFfc3RhdGUgKnN0YXRlID0gZGV2OworCXU4IGIxOworCWludCByZXQ7CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geyB7IC5hZGRyID0gc3RhdGUtPmFkZHIsCisJCQkJICAgIC5mbGFncyA9IDAsCisJCQkJICAgIC5idWYgPSAmcmVnLCAubGVuID0gMSB9LAorCQkJCSAgeyAuYWRkciA9IHN0YXRlLT5hZGRyLAorCQkJCSAgICAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAgLmJ1ZiA9ICZiMSwgLmxlbiA9IDEgfSB9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBiMTsKK30KKworc3RydWN0IGR2Yl9mcm9udGVuZCogczkyMV9hdHRhY2goY29uc3Qgc3RydWN0IHM5MjFfY29uZmlnICpjb25maWcsCisJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCisJc3RydWN0IHM5MjFfc3RhdGUgKnN0YXRlOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHM5MjFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwltZW1zZXQoc3RhdGUsIDB4MCwgc2l6ZW9mKHN0cnVjdCBzOTIxX3N0YXRlKSk7CisKKwlzdGF0ZS0+YWRkciA9IGNvbmZpZy0+aTJjX2FkZHJlc3M7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwlzdGF0ZS0+ZGV2LmkyY193cml0ZSA9ICZzOTIxX3dyaXRlOworCXN0YXRlLT5kZXYuaTJjX3JlYWQgPSAmczkyMV9yZWFkOworCXN0YXRlLT5kZXYucHJpdl9kZXYgPSBzdGF0ZTsKKworCXM5MjFfaXNkYl9jbWQoJnN0YXRlLT5kZXYsIElTREJfVF9DTURfSU5JVCwgTlVMTCk7CisKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkZW1vZF9zOTIxLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChzOTIxX2F0dGFjaCk7CitNT0RVTEVfQVVUSE9SKCJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZW1waWF0ZWNoLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2hhcnAgUzkyMSBJU0RCLVQgMVNlZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczkyMV9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY2MDQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIERWQi1UIHM5MjEgZGVtb2R1bGF0b3IKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBzdW5kdGVrLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLj0KKyAqLworCisjaWZuZGVmIFM5MjFfTU9EVUxFX0gKKyNkZWZpbmUgUzkyMV9NT0RVTEVfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSAiczkyMV9jb3JlLmgiCisKK2ludCBzOTIxX2lzZGJfaW5pdChzdHJ1Y3QgczkyMV9pc2RiX3QgKmRldik7CitpbnQgczkyMV9pc2RiX2NtZChzdHJ1Y3QgczkyMV9pc2RiX3QgKmRldiwgdTMyIGNtZCwgdm9pZCAqZGF0YSk7CisKK3N0cnVjdCBzOTIxX2NvbmZpZworeworCS8qIGRlbW9kdWxhdG9yJ3MgSTJDIGFkZHJlc3MgKi8KKwl1OCBpMmNfYWRkcmVzczsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfUzkyMSkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TOTIxX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHM5MjFfYXR0YWNoKGNvbnN0IHN0cnVjdCBzOTIxX2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzOTIxX2F0dGFjaChjb25zdCBzdHJ1Y3QgczkyMV9jb25maWcgKmNvbmZpZywKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9TOTIxICovCisKKyNlbmRpZiAvKiBTOTIxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zaTIxeHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zaTIxeHguYwppbmRleCAzZGRiZTY5Li4wYmQxNmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc2kyMXh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NpMjF4eC5jCkBAIC04LDcgKzgsNiBAQAogKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDliN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKQEAgLTAsMCArMSwxNTE5IEBACisvKgorCVNUQjA4OTkgTXVsdGlzdGFuZGFyZCBGcm9udGVuZCBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSAic3RiMDg5OV9kcnYuaCIKKyNpbmNsdWRlICJzdGIwODk5X3ByaXYuaCIKKyNpbmNsdWRlICJzdGIwODk5X3JlZy5oIgorCitpbmxpbmUgdTMyIHN0YjA4OTlfZG9fZGl2KHU2NCBuLCB1MzIgZCkKK3sKKwkvKiB3cmFwIGRvX2RpdigpIGZvciBlYXNlIG9mIHVzZSAqLworCisJZG9fZGl2KG4sIGQpOworCXJldHVybiBuOworfQorCisvKgorICogc3RiMDg5OV9jYWxjX3NyYXRlCisgKiBDb21wdXRlIHN5bWJvbCByYXRlCisgKi8KK3N0YXRpYyB1MzIgc3RiMDg5OV9jYWxjX3NyYXRlKHUzMiBtYXN0ZXJfY2xrLCB1OCAqc2ZyKQoreworCXU2NCB0bXA7CisKKwkvKiBzcmF0ZSA9IChTRlIgKiBtYXN0ZXJfY2xrKSA+PiAyMCAqLworCisJLyogc2ZyIGlzIG9mIHNpemUgMjAgYml0LCBzdG9yZWQgd2l0aCBhbiBvZmZzZXQgb2YgNCBiaXQgKi8KKwl0bXAgPSAoKCh1MzIpc2ZyWzBdKSA8PCAxNikgfCAoKCh1MzIpc2ZyWzFdKSA8PCA4KSB8IHNmclsyXTsKKwl0bXAgJj0gfjB4ZjsKKwl0bXAgKj0gbWFzdGVyX2NsazsKKwl0bXAgPj49IDI0OworCisJcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIHN0YjA4OTlfZ2V0X3NyYXRlCisgKiBHZXQgdGhlIGN1cnJlbnQgc3ltYm9sIHJhdGUKKyAqLwordTMyIHN0YjA4OTlfZ2V0X3NyYXRlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCXU4IHNmclszXTsKKworCXN0YjA4OTlfcmVhZF9yZWdzKHN0YXRlLCBTVEIwODk5X1NGUkgsIHNmciwgMyk7CisKKwlyZXR1cm4gc3RiMDg5OV9jYWxjX3NyYXRlKGludGVybmFsLT5tYXN0ZXJfY2xrLCBzZnIpOworfQorCisvKgorICogc3RiMDg5OV9zZXRfc3JhdGUKKyAqIFNldCBzeW1ib2wgZnJlcXVlbmN5CisgKiBNYXN0ZXJDbG9jazogbWFzdGVyIGNsb2NrIGZyZXF1ZW5jeSAoaHopCisgKiBTeW1ib2xSYXRlOiBzeW1ib2wgcmF0ZSAoYmF1ZHMpCisgKiByZXR1cm4gc3ltYm9sIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdTMyIHN0YjA4OTlfc2V0X3NyYXRlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdTMyIG1hc3Rlcl9jbGssIHUzMiBzcmF0ZSkKK3sKKwl1MzIgdG1wOworCXU4IHNmclszXTsKKworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0+Iik7CisJLyoKKwkgKiBpbiBvcmRlciB0byBoYXZlIHRoZSBtYXhpbXVtIHByZWNpc2lvbiwgdGhlIHN5bWJvbCByYXRlIGVudGVyZWQgaW50bworCSAqIHRoZSBjaGlwIGlzIGNvbXB1dGVkIGFzIHRoZSBjbG9zZXN0IHZhbHVlIG9mIHRoZSAidHJ1ZSB2YWx1ZSIuCisJICogSW4gdGhpcyBwdXJwb3NlLCB0aGUgc3ltYm9sIHJhdGUgdmFsdWUgaXMgcm91bmRlZCAoMSBpcyBhZGRlZCBvbiB0aGUgYml0CisJICogYmVsb3cgdGhlIExTQiApCisJICoKKwkgKiBzcmF0ZSA9IChTRlIgKiBtYXN0ZXJfY2xrKSA+PiAyMAorCSAqICAgICAgPD0+CisJICogICBTRlIgPSBzcmF0ZSA8PCAyMCAvIG1hc3Rlcl9jbGsKKwkgKgorCSAqIHJvdW5kZWQ6CisJICogICBTRlIgPSAoc3JhdGUgPDwgMjEgKyBtYXN0ZXJfY2xrKSAvICgyICogbWFzdGVyX2NsaykKKwkgKgorCSAqIHN0b3JlZCBhcyAyMCBiaXQgbnVtYmVyIHdpdGggYW4gb2Zmc2V0IG9mIDQgYml0OgorCSAqICAgc2ZyID0gU0ZSIDw8IDQ7CisJICovCisKKwl0bXAgPSBzdGIwODk5X2RvX2RpdigoKCh1NjQpc3JhdGUpIDw8IDIxKSArIG1hc3Rlcl9jbGssIDIgKiBtYXN0ZXJfY2xrKTsKKwl0bXAgPDw9IDQ7CisKKwlzZnJbMF0gPSB0bXAgPj4gMTY7CisJc2ZyWzFdID0gdG1wID4+ICA4OworCXNmclsyXSA9IHRtcDsKKworCXN0YjA4OTlfd3JpdGVfcmVncyhzdGF0ZSwgU1RCMDg5OV9TRlJILCBzZnIsIDMpOworCisJcmV0dXJuIHNyYXRlOworfQorCisvKgorICogc3RiMDg5OV9jYWxjX2Rlcm90X3RpbWUKKyAqIENvbXB1dGUgdGhlIGFtb3VudCBvZiB0aW1lIG5lZWRlZCBieSB0aGUgZGVyb3RhdG9yIHRvIGxvY2sKKyAqIFN5bWJvbFJhdGU6IFN5bWJvbCByYXRlCisgKiByZXR1cm46IGRlcm90YXRvciB0aW1lIGNvbnN0YW50IChtcykKKyAqLworc3RhdGljIGxvbmcgc3RiMDg5OV9jYWxjX2Rlcm90X3RpbWUobG9uZyBzcmF0ZSkKK3sKKwlpZiAoc3JhdGUgPiAwKQorCQlyZXR1cm4gKDEwMDAwMCAvIChzcmF0ZSAvIDEwMDApKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogc3RiMDg5OV9jYXJyX3dpZHRoCisgKiBDb21wdXRlIHRoZSB3aWR0aCBvZiB0aGUgY2FycmllcgorICogcmV0dXJuOiB3aWR0aCBvZiBjYXJyaWVyIChrSHogb3IgTWh6KQorICovCitsb25nIHN0YjA4OTlfY2Fycl93aWR0aChzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKKworCXJldHVybiAoaW50ZXJuYWwtPnNyYXRlICsgKGludGVybmFsLT5zcmF0ZSAqIGludGVybmFsLT5yb2xsb2ZmKSAvIDEwMCk7Cit9CisKKy8qCisgKiBzdGIwODk5X2ZpcnN0X3N1YnJhbmdlCisgKiBDb21wdXRlIHRoZSBmaXJzdCBzdWJyYW5nZSBvZiB0aGUgc2VhcmNoCisgKi8KK3N0YXRpYyB2b2lkIHN0YjA4OTlfZmlyc3Rfc3VicmFuZ2Uoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbAk9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICpwYXJhbXMJCT0gJnN0YXRlLT5wYXJhbXM7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcJCT0gIHN0YXRlLT5jb25maWc7CisKKwlpbnQgcmFuZ2UgPSAwOworCXUzMiBiYW5kd2lkdGggPSAwOworCisJaWYgKGNvbmZpZy0+dHVuZXJfZ2V0X2JhbmR3aWR0aCkgeworCQlzdGIwODk5X2kyY19nYXRlX2N0cmwoJnN0YXRlLT5mcm9udGVuZCwgMSk7CisJCWNvbmZpZy0+dHVuZXJfZ2V0X2JhbmR3aWR0aCgmc3RhdGUtPmZyb250ZW5kLCAmYmFuZHdpZHRoKTsKKwkJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDApOworCQlyYW5nZSA9IGJhbmR3aWR0aCAtIHN0YjA4OTlfY2Fycl93aWR0aChzdGF0ZSkgLyAyOworCX0KKworCWlmIChyYW5nZSA+IDApCisJCWludGVybmFsLT5zdWJfcmFuZ2UgPSBNSU4oaW50ZXJuYWwtPnNyY2hfcmFuZ2UsIHJhbmdlKTsKKwllbHNlCisJCWludGVybmFsLT5zdWJfcmFuZ2UgPSAwOworCisJaW50ZXJuYWwtPmZyZXEgPSBwYXJhbXMtPmZyZXE7CisJaW50ZXJuYWwtPnR1bmVyX29mZnN0ID0gMEw7CisJaW50ZXJuYWwtPnN1Yl9kaXIgPSAxOworfQorCisvKgorICogc3RiMDg5OV9jaGVja190bWcKKyAqIGNoZWNrIGZvciB0aW1pbmcgbG9jaworICogaW50ZXJuYWwuVHRpbWluZzogdGltZSB0byB3YWl0IGZvciBsb29wIGxvY2sKKyAqLworc3RhdGljIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9jaGVja190bWcoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJaW50IGxvY2s7CisJdTggcmVnOworCXM4IHRpbWluZzsKKworCW1zbGVlcChpbnRlcm5hbC0+dF9kZXJvdCk7CisKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9SVEYsIDB4ZjIpOworCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfVExJUik7CisJbG9jayA9IFNUQjA4OTlfR0VURklFTEQoVExJUl9UTUdfTE9DS19JTkQsIHJlZyk7CisJdGltaW5nID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9SVEYpOworCisJaWYgKGxvY2sgPj0gNDIpIHsKKwkJaWYgKChsb2NrID4gNDgpICYmIChBQlModGltaW5nKSA+PSAxMTApKSB7CisJCQlpbnRlcm5hbC0+c3RhdHVzID0gQU5BTE9HQ0FSUklFUjsKKwkJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0+QU5BTE9HIENhcnJpZXIgISIpOworCQl9IGVsc2UgeworCQkJaW50ZXJuYWwtPnN0YXR1cyA9IFRJTUlOR09LOworCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tPlRJTUlORyBPSyAhIik7CisJCX0KKwl9IGVsc2UgeworCQlpbnRlcm5hbC0+c3RhdHVzID0gTk9USU1JTkc7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0+Tk8gVElNSU5HICEiKTsKKwl9CisJcmV0dXJuIGludGVybmFsLT5zdGF0dXM7Cit9CisKKy8qCisgKiBzdGIwODk5X3NlYXJjaF90bWcKKyAqIHBlcmZvcm0gYSBmcy8yIHppZy16YWcgdG8gZmluZCB0aW1pbmcKKyAqLworc3RhdGljIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9zZWFyY2hfdG1nKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCXN0cnVjdCBzdGIwODk5X3BhcmFtcyAqcGFyYW1zID0gJnN0YXRlLT5wYXJhbXM7CisKKwlzaG9ydCBpbnQgZGVyb3Rfc3RlcCwgZGVyb3RfZnJlcSA9IDAsIGRlcm90X2xpbWl0LCBuZXh0X2xvb3AgPSAzOworCWludCBpbmRleCA9IDA7CisJdTggY2ZyWzJdOworCisJaW50ZXJuYWwtPnN0YXR1cyA9IE5PVElNSU5HOworCisJLyogdGltaW5nIGxvb3AgY29tcHV0YXRpb24gJiBzeW1ib2wgcmF0ZSBvcHRpbWlzYXRpb24JKi8KKwlkZXJvdF9saW1pdCA9IChpbnRlcm5hbC0+c3ViX3JhbmdlIC8gMkwpIC8gaW50ZXJuYWwtPm1jbGs7CisJZGVyb3Rfc3RlcCA9IChwYXJhbXMtPnNyYXRlIC8gMkwpIC8gaW50ZXJuYWwtPm1jbGs7CisKKwl3aGlsZSAoKHN0YjA4OTlfY2hlY2tfdG1nKHN0YXRlKSAhPSBUSU1JTkdPSykgJiYgbmV4dF9sb29wKSB7CisJCWluZGV4Kys7CisJCWRlcm90X2ZyZXEgKz0gaW5kZXggKiBpbnRlcm5hbC0+ZGlyZWN0aW9uICogZGVyb3Rfc3RlcDsJLyogbmV4dCBkZXJvdCB6aWcgemFnIHBvc2l0aW9uCSovCisKKwkJaWYgKEFCUyhkZXJvdF9mcmVxKSA+IGRlcm90X2xpbWl0KQorCQkJbmV4dF9sb29wLS07CisKKwkJaWYgKG5leHRfbG9vcCkgeworCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ0ZSTSwgY2ZyWzBdLCBNU0Ioc3RhdGUtPmNvbmZpZy0+aW52ZXJzaW9uICogZGVyb3RfZnJlcSkpOworCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ0ZSTCwgY2ZyWzFdLCBMU0Ioc3RhdGUtPmNvbmZpZy0+aW52ZXJzaW9uICogZGVyb3RfZnJlcSkpOworCQkJc3RiMDg5OV93cml0ZV9yZWdzKHN0YXRlLCBTVEIwODk5X0NGUk0sIGNmciwgMik7IC8qIGRlcm90YXRvciBmcmVxdWVuY3kJCSovCisJCX0KKwkJaW50ZXJuYWwtPmRpcmVjdGlvbiA9IC1pbnRlcm5hbC0+ZGlyZWN0aW9uOwkvKiBDaGFuZ2UgemlnemFnIGRpcmVjdGlvbgkJKi8KKwl9CisKKwlpZiAoaW50ZXJuYWwtPnN0YXR1cyA9PSBUSU1JTkdPSykgeworCQlzdGIwODk5X3JlYWRfcmVncyhzdGF0ZSwgU1RCMDg5OV9DRlJNLCBjZnIsIDIpOyAvKiBnZXQgZGVyb3RhdG9yIGZyZXF1ZW5jeQkJKi8KKwkJaW50ZXJuYWwtPmRlcm90X2ZyZXEgPSBzdGF0ZS0+Y29uZmlnLT5pbnZlcnNpb24gKiBNQUtFV09SRDE2KGNmclswXSwgY2ZyWzFdKTsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tPlRJTUlORyBPSyAhIERlcm90IEZyZXEgPSAlZCIsIGludGVybmFsLT5kZXJvdF9mcmVxKTsKKwl9CisKKwlyZXR1cm4gaW50ZXJuYWwtPnN0YXR1czsKK30KKworLyoKKyAqIHN0YjA4OTlfY2hlY2tfY2FycmllcgorICogQ2hlY2sgZm9yIGNhcnJpZXIgZm91bmQKKyAqLworc3RhdGljIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9jaGVja19jYXJyaWVyKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCXU4IHJlZzsKKworCW1zbGVlcChpbnRlcm5hbC0+dF9kZXJvdCk7IC8qIHdhaXQgZm9yIGRlcm90YXRvciBvawkqLworCisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQpOworCVNUQjA4OTlfU0VURklFTERfVkFMKENGRF9PTiwgcmVnLCAxKTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQsIHJlZyk7CisKKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RTVEFUVVMpOworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0+IFNUQjA4OTlfRFNUQVRVUz1bMHglMDJ4XSIsIHJlZyk7CisJaWYgKFNUQjA4OTlfR0VURklFTEQoQ0FSUklFUl9GT1VORCwgcmVnKSkgeworCQlpbnRlcm5hbC0+c3RhdHVzID0gQ0FSUklFUk9LOworCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIi0tLS0tLS0tLS0tLS0+IENBUlJJRVJPSyAhIik7CisJfSBlbHNlIHsKKwkJaW50ZXJuYWwtPnN0YXR1cyA9IE5PQ0FSUklFUjsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tLS0tLS0tPiBOT0NBUlJJRVIgISIpOworCX0KKworCXJldHVybiBpbnRlcm5hbC0+c3RhdHVzOworfQorCisvKgorICogc3RiMDg5OV9zZWFyY2hfY2FycmllcgorICogU2VhcmNoIGZvciBhIFFQU0sgY2FycmllciB3aXRoIHRoZSBkZXJvdGF0b3IKKyAqLworc3RhdGljIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9zZWFyY2hfY2FycmllcihzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKKworCXNob3J0IGludCBkZXJvdF9mcmVxID0gMCwgbGFzdF9kZXJvdF9mcmVxID0gMCwgZGVyb3RfbGltaXQsIG5leHRfbG9vcCA9IDM7CisJaW50IGluZGV4ID0gMDsKKwl1OCBjZnJbMl07CisJdTggcmVnOworCisJaW50ZXJuYWwtPnN0YXR1cyA9IE5PQ0FSUklFUjsKKwlkZXJvdF9saW1pdCA9IChpbnRlcm5hbC0+c3ViX3JhbmdlIC8gMkwpIC8gaW50ZXJuYWwtPm1jbGs7CisJZGVyb3RfZnJlcSA9IGludGVybmFsLT5kZXJvdF9mcmVxOworCisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQpOworCVNUQjA4OTlfU0VURklFTERfVkFMKENGRF9PTiwgcmVnLCAxKTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQsIHJlZyk7CisKKwlkbyB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiRGVyb3QgRnJlcT0lZCwgbWNsaz0lZCIsIGRlcm90X2ZyZXEsIGludGVybmFsLT5tY2xrKTsKKwkJaWYgKHN0YjA4OTlfY2hlY2tfY2FycmllcihzdGF0ZSkgPT0gTk9DQVJSSUVSKSB7CisJCQlpbmRleCsrOworCQkJbGFzdF9kZXJvdF9mcmVxID0gZGVyb3RfZnJlcTsKKwkJCWRlcm90X2ZyZXEgKz0gaW5kZXggKiBpbnRlcm5hbC0+ZGlyZWN0aW9uICogaW50ZXJuYWwtPmRlcm90X3N0ZXA7IC8qIG5leHQgemlnIHphZyBkZXJvdGF0b3IgcG9zaXRpb24gKi8KKworCQkJaWYoQUJTKGRlcm90X2ZyZXEpID4gZGVyb3RfbGltaXQpCisJCQkJbmV4dF9sb29wLS07CisKKwkJCWlmIChuZXh0X2xvb3ApIHsKKwkJCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0NGRCk7CisJCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ0ZEX09OLCByZWcsIDEpOworCQkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0NGRCwgcmVnKTsKKworCQkJCVNUQjA4OTlfU0VURklFTERfVkFMKENGUk0sIGNmclswXSwgTVNCKHN0YXRlLT5jb25maWctPmludmVyc2lvbiAqIGRlcm90X2ZyZXEpKTsKKwkJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDRlJMLCBjZnJbMV0sIExTQihzdGF0ZS0+Y29uZmlnLT5pbnZlcnNpb24gKiBkZXJvdF9mcmVxKSk7CisJCQkJc3RiMDg5OV93cml0ZV9yZWdzKHN0YXRlLCBTVEIwODk5X0NGUk0sIGNmciwgMik7IC8qIGRlcm90YXRvciBmcmVxdWVuY3kJKi8KKwkJCX0KKwkJfQorCisJCWludGVybmFsLT5kaXJlY3Rpb24gPSAtaW50ZXJuYWwtPmRpcmVjdGlvbjsgLyogQ2hhbmdlIHppZ3phZyBkaXJlY3Rpb24gKi8KKwl9IHdoaWxlICgoaW50ZXJuYWwtPnN0YXR1cyAhPSBDQVJSSUVST0spICYmIG5leHRfbG9vcCk7CisKKwlpZiAoaW50ZXJuYWwtPnN0YXR1cyA9PSBDQVJSSUVST0spIHsKKwkJc3RiMDg5OV9yZWFkX3JlZ3Moc3RhdGUsIFNUQjA4OTlfQ0ZSTSwgY2ZyLCAyKTsgLyogZ2V0IGRlcm90YXRvciBmcmVxdWVuY3kgKi8KKwkJaW50ZXJuYWwtPmRlcm90X2ZyZXEgPSBzdGF0ZS0+Y29uZmlnLT5pbnZlcnNpb24gKiBNQUtFV09SRDE2KGNmclswXSwgY2ZyWzFdKTsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tPiBDQVJSSUVSIE9LICEsIERlcm90IEZyZXE9JWQiLCBpbnRlcm5hbC0+ZGVyb3RfZnJlcSk7CisJfSBlbHNlIHsKKwkJaW50ZXJuYWwtPmRlcm90X2ZyZXEgPSBsYXN0X2Rlcm90X2ZyZXE7CisJfQorCisJcmV0dXJuIGludGVybmFsLT5zdGF0dXM7Cit9CisKKy8qCisgKiBzdGIwODk5X2NoZWNrX2RhdGEKKyAqIENoZWNrIGZvciBkYXRhIGZvdW5kCisgKi8KK3N0YXRpYyBlbnVtIHN0YjA4OTlfc3RhdHVzIHN0YjA4OTlfY2hlY2tfZGF0YShzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3RiMDg5OV9wYXJhbXMgKnBhcmFtcyA9ICZzdGF0ZS0+cGFyYW1zOworCisJaW50IGxvY2sgPSAwLCBpbmRleCA9IDAsIGRhdGFUaW1lID0gNTAwLCBsb29wOworCXU4IHJlZzsKKworCWludGVybmFsLT5zdGF0dXMgPSBOT0RBVEE7CisKKwkvKiBSRVNFVCBGRUMJKi8KKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUyk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRlJFU0FDUywgcmVnLCAxKTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMsIHJlZyk7CisJbXNsZWVwKDEpOworCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfVFNUUkVTKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChGUkVTQUNTLCByZWcsIDApOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUywgcmVnKTsKKworCWlmIChwYXJhbXMtPnNyYXRlIDw9IDIwMDAwMDApCisJCWRhdGFUaW1lID0gMjAwMDsKKwllbHNlIGlmIChwYXJhbXMtPnNyYXRlIDw9IDUwMDAwMDApCisJCWRhdGFUaW1lID0gMTUwMDsKKwllbHNlIGlmIChwYXJhbXMtPnNyYXRlIDw9IDE1MDAwMDAwKQorCQlkYXRhVGltZSA9IDEwMDA7CisJZWxzZQorCQlkYXRhVGltZSA9IDUwMDsKKworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RTVEFUVVMyLCAweDAwKTsgLyogZm9yY2Ugc2VhcmNoIGxvb3AJKi8KKwl3aGlsZSAoMSkgeworCQkvKiBXQVJOSU5HISBWSVQgTE9DS0VEIGhhcyB0byBiZSB0ZXN0ZWQgYmVmb3JlIFZJVF9FTkRfTE9PT1AJKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9WU1RBVFVTKTsKKwkJbG9jayA9IFNUQjA4OTlfR0VURklFTEQoVlNUQVRVU19MT0NLRURWSVQsIHJlZyk7CisJCWxvb3AgPSBTVEIwODk5X0dFVEZJRUxEKFZTVEFUVVNfRU5EX0xPT1BWSVQsIHJlZyk7CisKKwkJaWYgKGxvY2sgfHwgbG9vcCB8fCAoaW5kZXggPiBkYXRhVGltZSkpCisJCQlicmVhazsKKwkJaW5kZXgrKzsKKwl9CisKKwlpZiAobG9jaykgewkvKiBEQVRBIExPQ0sgaW5kaWNhdG9yCSovCisJCWludGVybmFsLT5zdGF0dXMgPSBEQVRBT0s7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tLS0tLS0+IERBVEEgT0sgISIpOworCX0KKworCXJldHVybiBpbnRlcm5hbC0+c3RhdHVzOworfQorCisvKgorICogc3RiMDg5OV9zZWFyY2hfZGF0YQorICogU2VhcmNoIGZvciBhIFFQU0sgY2FycmllciB3aXRoIHRoZSBkZXJvdGF0b3IKKyAqLworc3RhdGljIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9zZWFyY2hfZGF0YShzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc2hvcnQgaW50IGRlcm90X2ZyZXEsIGRlcm90X3N0ZXAsIGRlcm90X2xpbWl0LCBuZXh0X2xvb3AgPSAzOworCXU4IGNmclsyXTsKKwl1OCByZWc7CisJaW50IGluZGV4ID0gMTsKKworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICpwYXJhbXMgPSAmc3RhdGUtPnBhcmFtczsKKworCWRlcm90X3N0ZXAgPSAocGFyYW1zLT5zcmF0ZSAvIDRMKSAvIGludGVybmFsLT5tY2xrOworCWRlcm90X2xpbWl0ID0gKGludGVybmFsLT5zdWJfcmFuZ2UgLyAyTCkgLyBpbnRlcm5hbC0+bWNsazsKKwlkZXJvdF9mcmVxID0gaW50ZXJuYWwtPmRlcm90X2ZyZXE7CisKKwlkbyB7CisJCWlmICgoaW50ZXJuYWwtPnN0YXR1cyAhPSBDQVJSSUVST0spIHx8IChzdGIwODk5X2NoZWNrX2RhdGEoc3RhdGUpICE9IERBVEFPSykpIHsKKworCQkJZGVyb3RfZnJlcSArPSBpbmRleCAqIGludGVybmFsLT5kaXJlY3Rpb24gKiBkZXJvdF9zdGVwOwkvKiBuZXh0IHppZyB6YWcgZGVyb3RhdG9yIHBvc2l0aW9uICovCisJCQlpZiAoQUJTKGRlcm90X2ZyZXEpID4gZGVyb3RfbGltaXQpCisJCQkJbmV4dF9sb29wLS07CisKKwkJCWlmIChuZXh0X2xvb3ApIHsKKwkJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRlcm90IGZyZXE9JWQsIG1jbGs9JWQiLCBkZXJvdF9mcmVxLCBpbnRlcm5hbC0+bWNsayk7CisJCQkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQpOworCQkJCVNUQjA4OTlfU0VURklFTERfVkFMKENGRF9PTiwgcmVnLCAxKTsKKwkJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQsIHJlZyk7CisKKwkJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDRlJNLCBjZnJbMF0sIE1TQihzdGF0ZS0+Y29uZmlnLT5pbnZlcnNpb24gKiBkZXJvdF9mcmVxKSk7CisJCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ0ZSTCwgY2ZyWzFdLCBMU0Ioc3RhdGUtPmNvbmZpZy0+aW52ZXJzaW9uICogZGVyb3RfZnJlcSkpOworCQkJCXN0YjA4OTlfd3JpdGVfcmVncyhzdGF0ZSwgU1RCMDg5OV9DRlJNLCBjZnIsIDIpOyAvKiBkZXJvdGF0b3IgZnJlcXVlbmN5CSovCisKKwkJCQlzdGIwODk5X2NoZWNrX2NhcnJpZXIoc3RhdGUpOworCQkJCWluZGV4Kys7CisJCQl9CisJCX0KKwkJaW50ZXJuYWwtPmRpcmVjdGlvbiA9IC1pbnRlcm5hbC0+ZGlyZWN0aW9uOyAvKiBjaGFuZ2UgemlnIHphZyBkaXJlY3Rpb24gKi8KKwl9IHdoaWxlICgoaW50ZXJuYWwtPnN0YXR1cyAhPSBEQVRBT0spICYmIG5leHRfbG9vcCk7CisKKwlpZiAoaW50ZXJuYWwtPnN0YXR1cyA9PSBEQVRBT0spIHsKKwkJc3RiMDg5OV9yZWFkX3JlZ3Moc3RhdGUsIFNUQjA4OTlfQ0ZSTSwgY2ZyLCAyKTsgLyogZ2V0IGRlcm90YXRvciBmcmVxdWVuY3kgKi8KKwkJaW50ZXJuYWwtPmRlcm90X2ZyZXEgPSBzdGF0ZS0+Y29uZmlnLT5pbnZlcnNpb24gKiBNQUtFV09SRDE2KGNmclswXSwgY2ZyWzFdKTsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0+IERBVEFPSyAhIERlcm90IEZyZXE9JWQiLCBpbnRlcm5hbC0+ZGVyb3RfZnJlcSk7CisJfQorCisJcmV0dXJuIGludGVybmFsLT5zdGF0dXM7Cit9CisKKy8qCisgKiBzdGIwODk5X2NoZWNrX3JhbmdlCisgKiBjaGVjayBpZiB0aGUgZm91bmQgZnJlcXVlbmN5IGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlCisgKi8KK3N0YXRpYyBlbnVtIHN0YjA4OTlfc3RhdHVzIHN0YjA4OTlfY2hlY2tfcmFuZ2Uoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICpwYXJhbXMgPSAmc3RhdGUtPnBhcmFtczsKKworCWludCByYW5nZV9vZmZzdCwgdHBfZnJlcTsKKworCXJhbmdlX29mZnN0ID0gaW50ZXJuYWwtPnNyY2hfcmFuZ2UgLyAyMDAwOworCXRwX2ZyZXEgPSBpbnRlcm5hbC0+ZnJlcSArIChpbnRlcm5hbC0+ZGVyb3RfZnJlcSAqIGludGVybmFsLT5tY2xrKSAvIDEwMDA7CisKKwlpZiAoKHRwX2ZyZXEgPj0gcGFyYW1zLT5mcmVxIC0gcmFuZ2Vfb2Zmc3QpICYmICh0cF9mcmVxIDw9IHBhcmFtcy0+ZnJlcSArIHJhbmdlX29mZnN0KSkgeworCQlpbnRlcm5hbC0+c3RhdHVzID0gUkFOR0VPSzsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tPiBSQU5HRU9LICEiKTsKKwl9IGVsc2UgeworCQlpbnRlcm5hbC0+c3RhdHVzID0gT1VUT0ZSQU5HRTsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tPiBPVVQgT0YgUkFOR0UgISIpOworCX0KKworCXJldHVybiBpbnRlcm5hbC0+c3RhdHVzOworfQorCisvKgorICogTmV4dFN1YlJhbmdlCisgKiBDb21wdXRlIHRoZSBuZXh0IHN1YnJhbmdlIG9mIHRoZSBzZWFyY2gKKyAqLworc3RhdGljIHZvaWQgbmV4dF9zdWJfcmFuZ2Uoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICpwYXJhbXMgPSAmc3RhdGUtPnBhcmFtczsKKworCWxvbmcgb2xkX3N1Yl9yYW5nZTsKKworCWlmIChpbnRlcm5hbC0+c3ViX2RpciA+IDApIHsKKwkJb2xkX3N1Yl9yYW5nZSA9IGludGVybmFsLT5zdWJfcmFuZ2U7CisJCWludGVybmFsLT5zdWJfcmFuZ2UgPSBNSU4oKGludGVybmFsLT5zcmNoX3JhbmdlIC8gMikgLQorCQkJCQkgIChpbnRlcm5hbC0+dHVuZXJfb2Zmc3QgKyBpbnRlcm5hbC0+c3ViX3JhbmdlIC8gMiksCisJCQkJCSAgIGludGVybmFsLT5zdWJfcmFuZ2UpOworCisJCWlmIChpbnRlcm5hbC0+c3ViX3JhbmdlIDwgMCkKKwkJCWludGVybmFsLT5zdWJfcmFuZ2UgPSAwOworCisJCWludGVybmFsLT50dW5lcl9vZmZzdCArPSAob2xkX3N1Yl9yYW5nZSArIGludGVybmFsLT5zdWJfcmFuZ2UpIC8gMjsKKwl9CisKKwlpbnRlcm5hbC0+ZnJlcSA9IHBhcmFtcy0+ZnJlcSArIChpbnRlcm5hbC0+c3ViX2RpciAqIGludGVybmFsLT50dW5lcl9vZmZzdCkgLyAxMDAwOworCWludGVybmFsLT5zdWJfZGlyID0gLWludGVybmFsLT5zdWJfZGlyOworfQorCisvKgorICogc3RiMDg5OV9kdmJzX2FsZ28KKyAqIFNlYXJjaCBmb3IgYSBzaWduYWwsIHRpbWluZywgY2FycmllciBhbmQgZGF0YSBmb3IgYQorICogZ2l2ZW4gZnJlcXVlbmN5IGluIGEgZ2l2ZW4gcmFuZ2UKKyAqLworZW51bSBzdGIwODk5X3N0YXR1cyBzdGIwODk5X2R2YnNfYWxnbyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICpwYXJhbXMJCT0gJnN0YXRlLT5wYXJhbXM7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsCT0gJnN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3RiMDg5OV9jb25maWcgKmNvbmZpZwkJPSBzdGF0ZS0+Y29uZmlnOworCisJdTggYmNsYywgcmVnOworCXU4IGNmclsyXTsKKwl1OCBlcV9jb25zdFsxMF07CisJczMyIGNsbkkgPSAzOworCXUzMiBiYW5kd2lkdGggPSAwOworCisJLyogQkVUQSB2YWx1ZXMgcmF0ZWQgQCA5OU1IegkqLworCXMzMiBiZXRhVGFiWzVdWzRdID0geworCSAgICAgICAvKiAgNSAgIDEwICAgMjAgICAzME1CcHMgKi8KKwkJeyAzNywgIDM0LCAgMzIsICAzMSB9LCAvKiBRUFNLIDEvMgkqLworCQl7IDM3LCAgMzUsICAzMywgIDMxIH0sIC8qIFFQU0sgMi8zCSovCisJCXsgMzcsICAzNSwgIDMzLCAgMzEgfSwgLyogUVBTSyAzLzQJKi8KKwkJeyAzNywgIDM2LCAgMzMsCSAzMiB9LCAvKiBRUFNLIDUvNgkqLworCQl7IDM3LCAgMzYsICAzMywJIDMyIH0gIC8qIFFQU0sgNy84CSovCisJfTsKKworCWludGVybmFsLT5kaXJlY3Rpb24gPSAxOworCisJc3RiMDg5OV9zZXRfc3JhdGUoc3RhdGUsIGludGVybmFsLT5tYXN0ZXJfY2xrLCBwYXJhbXMtPnNyYXRlKTsKKwkvKiBDYXJyaWVyIGxvb3Agb3B0aW1pemF0aW9uIHZlcnN1cyBzeW1ib2wgcmF0ZSBmb3IgYWNxdWlzaXRpb24qLworCWlmIChwYXJhbXMtPnNyYXRlIDw9IDUwMDAwMDApIHsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQUNMQywgMHg4OSk7CisJCWJjbGMgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChCRVRBLCBiY2xjLCAweDFjKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQkNMQywgYmNsYyk7CisJCWNsbkkgPSAwOworCX0gZWxzZSBpZiAocGFyYW1zLT5zcmF0ZSA8PSAxNTAwMDAwMCkgeworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9BQ0xDLCAweGM5KTsKKwkJYmNsYyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfQkNMQyk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEJFVEEsIGJjbGMsIDB4MjIpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9CQ0xDLCBiY2xjKTsKKwkJY2xuSSA9IDE7CisJfSBlbHNlIGlmKHBhcmFtcy0+c3JhdGUgPD0gMjUwMDAwMDApIHsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQUNMQywgMHg4OSk7CisJCWJjbGMgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChCRVRBLCBiY2xjLCAweDI3KTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQkNMQywgYmNsYyk7CisJCWNsbkkgPSAyOworCX0gZWxzZSB7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0FDTEMsIDB4YzgpOworCQliY2xjID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9CQ0xDKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQkVUQSwgYmNsYywgMHgyOSk7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMsIGJjbGMpOworCQljbG5JID0gMzsKKwl9CisKKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIlNldCB0aGUgdGltaW5nIGxvb3AgdG8gYWNxdWlzaXRpb24iKTsKKwkvKiBTZXQgdGhlIHRpbWluZyBsb29wIHRvIGFjcXVpc2l0aW9uCSovCisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfUlRDLCAweDQ2KTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQsIDB4ZWUpOworCisJLyogISEgV0FSTklORyAhIQorCSAqIERvIG5vdCByZWFkIGFueSBzdGF0dXMgdmFyaWFibGVzIHdoaWxlIGFjcXVpc2l0aW9uLAorCSAqIElmIGFueSBuZWVkZWQsIHJlYWQgYmVmb3JlIHRoZSBhY3F1aXNpdGlvbiBzdGFydHMKKwkgKiBxdWVyeWluZyBzdGF0dXMgd2hpbGUgYWNxdWlyaW5nIGNhdXNlcyB0aGUKKwkgKiBhY3F1aXNpdGlvbiB0byBnbyBiYWQgYW5kIGhlbmNlIG5vIGxvY2tzLgorCSAqLworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiRGVyb3QgUGVyY2VudD0lZCBTcmF0ZT0lZCBtY2xrPSVkIiwKKwkJaW50ZXJuYWwtPmRlcm90X3BlcmNlbnQsIHBhcmFtcy0+c3JhdGUsIGludGVybmFsLT5tY2xrKTsKKworCS8qIEluaXRpYWwgY2FsY3VsYXRpb25zCSovCisJaW50ZXJuYWwtPmRlcm90X3N0ZXAgPSBpbnRlcm5hbC0+ZGVyb3RfcGVyY2VudCAqIChwYXJhbXMtPnNyYXRlIC8gMTAwMEwpIC8gaW50ZXJuYWwtPm1jbGs7IC8qIERlcm90U3RlcC8xMDAwICogRnN5bWJvbAkqLworCWludGVybmFsLT50X2Rlcm90ID0gc3RiMDg5OV9jYWxjX2Rlcm90X3RpbWUocGFyYW1zLT5zcmF0ZSk7CisJaW50ZXJuYWwtPnRfZGF0YSA9IDUwMDsKKworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiUkVTRVQgc3RyZWFtIG1lcmdlciIpOworCS8qIFJFU0VUIFN0cmVhbSBtZXJnZXIJKi8KKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUyk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRlJFU1JTLCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUywgcmVnKTsKKworCS8qCisJICogU2V0IEtESVZJREVSIHRvIGFuIGludGVybWVkaWF0ZSB2YWx1ZSBiZXR3ZWVuCisJICogMS8yIGFuZCA3LzggZm9yIGFjcXVpc2l0aW9uCisJICovCisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9ERU1BUFZJVCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoREVNQVBWSVRfS0RJVklERVIsIHJlZywgNjApOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RFTUFQVklULCByZWcpOworCisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRVFPTiwgMHgwMSk7IC8qIEVxdWFsaXplciBPRkYgd2hpbGUgYWNxdWlyaW5nICovCisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVklUU1lOQywgMHgxOSk7CisKKwlzdGIwODk5X2ZpcnN0X3N1YnJhbmdlKHN0YXRlKTsKKwlkbyB7CisJCS8qIEluaXRpYWxpc2F0aW9ucyAqLworCQljZnJbMF0gPSBjZnJbMV0gPSAwOworCQlzdGIwODk5X3dyaXRlX3JlZ3Moc3RhdGUsIFNUQjA4OTlfQ0ZSTSwgY2ZyLCAyKTsgLyogUkVTRVQgZGVyb3RhdG9yIGZyZXF1ZW5jeQkqLworCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1JURiwgMCk7CisJCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfQ0ZEKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ0ZEX09OLCByZWcsIDEpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQsIHJlZyk7CisKKwkJaW50ZXJuYWwtPmRlcm90X2ZyZXEgPSAwOworCQlpbnRlcm5hbC0+c3RhdHVzID0gTk9BR0MxOworCisJCS8qIGVuYWJsZSB0dW5lciBJL08gKi8KKwkJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDEpOworCisJCS8qIE1vdmUgdHVuZXIgdG8gZnJlcXVlbmN5ICovCisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiVHVuZXIgc2V0IGZyZXF1ZW5jeSIpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+dHVuZXJfc2V0X2ZyZXF1ZW5jeSkKKwkJCXN0YXRlLT5jb25maWctPnR1bmVyX3NldF9mcmVxdWVuY3koJnN0YXRlLT5mcm9udGVuZCwgaW50ZXJuYWwtPmZyZXEpOworCisJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9nZXRfZnJlcXVlbmN5KQorCQkJc3RhdGUtPmNvbmZpZy0+dHVuZXJfZ2V0X2ZyZXF1ZW5jeSgmc3RhdGUtPmZyb250ZW5kLCAmaW50ZXJuYWwtPmZyZXEpOworCisJCW1zbGVlcChpbnRlcm5hbC0+dF9hZ2MxICsgaW50ZXJuYWwtPnRfYWdjMiArIGludGVybmFsLT50X2Rlcm90KTsgLyogQUdDMSwgQUdDMiBhbmQgdGltaW5nIGxvb3AJKi8KKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJjdXJyZW50IGRlcm90IGZyZXE9JWQiLCBpbnRlcm5hbC0+ZGVyb3RfZnJlcSk7CisJCWludGVybmFsLT5zdGF0dXMgPSBBR0MxT0s7CisKKwkJLyogVGhlcmUgaXMgc2lnbmFsIGluIHRoZSBiYW5kCSovCisJCWlmIChjb25maWctPnR1bmVyX2dldF9iYW5kd2lkdGgpCisJCQljb25maWctPnR1bmVyX2dldF9iYW5kd2lkdGgoJnN0YXRlLT5mcm9udGVuZCwgJmJhbmR3aWR0aCk7CisKKwkJLyogZGlzYWJsZSB0dW5lciBJL08gKi8KKwkJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDApOworCisJCWlmIChwYXJhbXMtPnNyYXRlIDw9IGJhbmR3aWR0aCAvIDIpCisJCQlzdGIwODk5X3NlYXJjaF90bWcoc3RhdGUpOyAvKiBGb3IgbG93IHJhdGVzIChTQ1BDKQkqLworCQllbHNlCisJCQlzdGIwODk5X2NoZWNrX3RtZyhzdGF0ZSk7IC8qIEZvciBoaWdoIHJhdGVzIChNQ1BDKQkqLworCisJCWlmIChpbnRlcm5hbC0+c3RhdHVzID09IFRJTUlOR09LKSB7CisJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwKKwkJCQkiVElNSU5HIE9LICEgRGVyb3QgZnJlcT0lZCwgbWNsaz0lZCIsCisJCQkJaW50ZXJuYWwtPmRlcm90X2ZyZXEsIGludGVybmFsLT5tY2xrKTsKKworCQkJaWYgKHN0YjA4OTlfc2VhcmNoX2NhcnJpZXIoc3RhdGUpID09IENBUlJJRVJPSykgewkvKiBTZWFyY2ggZm9yIGNhcnJpZXIJKi8KKwkJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwKKwkJCQkJIkNBUlJJRVIgT0sgISBEZXJvdCBmcmVxPSVkLCBtY2xrPSVkIiwKKwkJCQkJaW50ZXJuYWwtPmRlcm90X2ZyZXEsIGludGVybmFsLT5tY2xrKTsKKworCQkJCWlmIChzdGIwODk5X3NlYXJjaF9kYXRhKHN0YXRlKSA9PSBEQVRBT0spIHsJLyogQ2hlY2sgZm9yIGRhdGEJKi8KKwkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCQkiREFUQSBPSyAhIERlcm90IGZyZXE9JWQsIG1jbGs9JWQiLAorCQkJCQkJaW50ZXJuYWwtPmRlcm90X2ZyZXEsIGludGVybmFsLT5tY2xrKTsKKworCQkJCQlpZiAoc3RiMDg5OV9jaGVja19yYW5nZShzdGF0ZSkgPT0gUkFOR0VPSykgeworCQkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCQkJIlJBTkdFIE9LICEgZGVyb3QgZnJlcT0lZCwgbWNsaz0lZCIsCisJCQkJCQkJaW50ZXJuYWwtPmRlcm90X2ZyZXEsIGludGVybmFsLT5tY2xrKTsKKworCQkJCQkJaW50ZXJuYWwtPmZyZXEgPSBwYXJhbXMtPmZyZXEgKyAoKGludGVybmFsLT5kZXJvdF9mcmVxICogaW50ZXJuYWwtPm1jbGspIC8gMTAwMCk7CisJCQkJCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1BMUEFSTSk7CisJCQkJCQlpbnRlcm5hbC0+ZmVjcmF0ZSA9IFNUQjA4OTlfR0VURklFTEQoVklUQ1VSUFVOLCByZWcpOworCQkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCQkJImZyZXE9JWQsIGludGVybmFsIHJlc3VsdGFudCBmcmVxPSVkIiwKKwkJCQkJCQlwYXJhbXMtPmZyZXEsIGludGVybmFsLT5mcmVxKTsKKworCQkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCQkJImludGVybmFsIHB1bmN0dXJlIHJhdGU9JWQiLAorCQkJCQkJCWludGVybmFsLT5mZWNyYXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaW50ZXJuYWwtPnN0YXR1cyAhPSBSQU5HRU9LKQorCQkJbmV4dF9zdWJfcmFuZ2Uoc3RhdGUpOworCisJfSB3aGlsZSAoaW50ZXJuYWwtPnN1Yl9yYW5nZSAmJiBpbnRlcm5hbC0+c3RhdHVzICE9IFJBTkdFT0spOworCisJLyogU2V0IHRoZSB0aW1pbmcgbG9vcCB0byB0cmFja2luZwkqLworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1JUQywgMHgzMyk7CisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQ0ZELCAweGY3KTsKKwkvKiBpZiBsb2NrZWQgYW5kIHJhbmdlIG9rLCBzZXQgS2RpdgkqLworCWlmIChpbnRlcm5hbC0+c3RhdHVzID09IFJBTkdFT0spIHsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJMb2NrZWQgJiBSYW5nZSBPSyAhIik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0VRT04sIDB4NDEpOwkJLyogRXF1YWxpemVyIE9GRiB3aGlsZSBhY3F1aXJpbmcJKi8KKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVklUU1lOQywgMHgzOSk7CS8qIFNOIHRvIGInMTEgZm9yIGFjcXVpc2l0aW9uCQkqLworCisJCS8qCisJCSAqIENhcnJpZXIgbG9vcCBvcHRpbWl6YXRpb24gdmVyc3VzCisJCSAqIHN5bWJvbCBSYXRlL1B1bmN0dXJlIFJhdGUgZm9yIFRyYWNraW5nCisJCSAqLworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMpOworCQlzd2l0Y2ggKGludGVybmFsLT5mZWNyYXRlKSB7CisJCWNhc2UgU1RCMDg5OV9GRUNfMV8yOgkJLyogMTMJKi8KKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RFTUFQVklULCAweDFhKTsKKwkJCVNUQjA4OTlfU0VURklFTERfVkFMKEJFVEEsIHJlZywgYmV0YVRhYlswXVtjbG5JXSk7CisJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9CQ0xDLCByZWcpOworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9GRUNfMl8zOgkJLyogMTgJKi8KKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RFTUFQVklULCA0NCk7CisJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChCRVRBLCByZWcsIGJldGFUYWJbMV1bY2xuSV0pOworCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQkNMQywgcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFNUQjA4OTlfRkVDXzNfNDoJCS8qIDIxCSovCisJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9ERU1BUFZJVCwgNjApOworCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQkVUQSwgcmVnLCBiZXRhVGFiWzJdW2NsbkldKTsKKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMsIHJlZyk7CisJCQlicmVhazsKKwkJY2FzZSBTVEIwODk5X0ZFQ181XzY6CQkvKiAyNAkqLworCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfREVNQVBWSVQsIDc1KTsKKwkJCVNUQjA4OTlfU0VURklFTERfVkFMKEJFVEEsIHJlZywgYmV0YVRhYlszXVtjbG5JXSk7CisJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9CQ0xDLCByZWcpOworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9GRUNfNl83OgkJLyogMjUJKi8KKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RFTUFQVklULCA4OCk7CisJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9BQ0xDLCAweDg4KTsKKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0JDTEMsIDB4OWEpOworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9GRUNfN184OgkJLyogMjYJKi8KKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RFTUFQVklULCA5NCk7CisJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChCRVRBLCByZWcsIGJldGFUYWJbNF1bY2xuSV0pOworCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQkNMQywgcmVnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJVbnN1cHBvcnRlZCBQdW5jdHVyZSBSYXRlIik7CisJCQlicmVhazsKKwkJfQorCQkvKiByZWxlYXNlIHN0cmVhbSBtZXJnZXIgUkVTRVQJKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChGUkVTUlMsIHJlZywgMCk7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUywgcmVnKTsKKworCQkvKiBkaXNhYmxlIGNhcnJpZXIgZGV0ZWN0b3IJKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkQpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDRkRfT04sIHJlZywgMCk7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0NGRCwgcmVnKTsKKworCQlzdGIwODk5X3JlYWRfcmVncyhzdGF0ZSwgU1RCMDg5OV9FUVVBSTEsIGVxX2NvbnN0LCAxMCk7CisJfQorCisJcmV0dXJuIGludGVybmFsLT5zdGF0dXM7Cit9CisKKy8qCisgKiBzdGIwODk5X2R2YnMyX2NvbmZpZ191d3AKKyAqIENvbmZpZ3VyZSBVV1Agc3RhdGUgbWFjaGluZQorICovCitzdGF0aWMgdm9pZCBzdGIwODk5X2R2YnMyX2NvbmZpZ191d3Aoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCXUzMiB1d3AxLCB1d3AyLCB1d3AzLCByZWc7CisKKwl1d3AxID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgVVdQX0NOVFJMMSk7CisJdXdwMiA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIFVXUF9DTlRSTDIpOworCXV3cDMgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBVV1BfQ05UUkwzKTsKKworCVNUQjA4OTlfU0VURklFTERfVkFMKFVXUF9FU04wX0FWRSwgdXdwMSwgY29uZmlnLT5lc25vX2F2ZSk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoVVdQX0VTTjBfUVVBTlQsIHV3cDEsIGNvbmZpZy0+ZXNub19xdWFudCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoVVdQX1RIX1NPRiwgdXdwMSwgY29uZmlnLT51d3BfdGhyZXNob2xkX3NvZik7CisKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChGRV9DT0FSU0VfVFJLLCB1d3AyLCBpbnRlcm5hbC0+YXZfZnJhbWVfY29hcnNlKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChGRV9GSU5FX1RSSywgdXdwMiwgaW50ZXJuYWwtPmF2X2ZyYW1lX2ZpbmUpOworCVNUQjA4OTlfU0VURklFTERfVkFMKFVXUF9NSVNTX1RILCB1d3AyLCBjb25maWctPm1pc3NfdGhyZXNob2xkKTsKKworCVNUQjA4OTlfU0VURklFTERfVkFMKFVXUF9USF9BQ1EsIHV3cDMsIGNvbmZpZy0+dXdwX3RocmVzaG9sZF9hY3EpOworCVNUQjA4OTlfU0VURklFTERfVkFMKFVXUF9USF9UUkFDSywgdXdwMywgY29uZmlnLT51d3BfdGhyZXNob2xkX3RyYWNrKTsKKworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX1VXUF9DTlRSTDEsIFNUQjA4OTlfT0ZGMF9VV1BfQ05UUkwxLCB1d3AxKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9VV1BfQ05UUkwyLCBTVEIwODk5X09GRjBfVVdQX0NOVFJMMiwgdXdwMik7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMywgU1RCMDg5OV9PRkYwX1VXUF9DTlRSTDMsIHV3cDMpOworCisJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgU09GX1NSQ0hfVE8pOworCVNUQjA4OTlfU0VURklFTERfVkFMKFNPRl9TRUFSQ0hfVElNRU9VVCwgcmVnLCBjb25maWctPnNvZl9zZWFyY2hfdGltZW91dCk7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfU09GX1NSQ0hfVE8sIFNUQjA4OTlfT0ZGMF9TT0ZfU1JDSF9UTywgcmVnKTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfY29uZmlnX2NzbV9hdXRvCisgKiBTZXQgQ1NNIHRvIEFVVE8gbW9kZQorICovCitzdGF0aWMgdm9pZCBzdGIwODk5X2R2YnMyX2NvbmZpZ19jc21fYXV0byhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIENTTV9DTlRSTDEpOworCVNUQjA4OTlfU0VURklFTERfVkFMKENTTV9BVVRPX1BBUkFNLCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDEsIFNUQjA4OTlfT0ZGMF9DU01fQ05UUkwxLCByZWcpOworfQorCitsb25nIExvZzJJbnQoaW50IG51bWJlcikKK3sKKwlpbnQgaTsKKworCWkgPSAwOworCXdoaWxlICgoMSA8PCBpKSA8PSBBQlMobnVtYmVyKSkKKwkJaSsrOworCisJaWYgKG51bWJlciA9PSAwKQorCQlpID0gMTsKKworCXJldHVybiBpIC0gMTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfY2FsY19zcmF0ZQorICogY29tcHV0ZSBCVFJfTk9NX0ZSRVEgZm9yIHRoZSBzeW1ib2wgcmF0ZQorICovCitzdGF0aWMgdTMyIHN0YjA4OTlfZHZiczJfY2FsY19zcmF0ZShzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsCT0gJnN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3RiMDg5OV9jb25maWcgKmNvbmZpZwkJPSBzdGF0ZS0+Y29uZmlnOworCisJdTMyIGRlY19yYXRpbywgZGVjX3JhdGUsIGRlY2ltLCByZW1haW4sIGludHZhbCwgYnRyX25vbV9mcmVxOworCXUzMiBtYXN0ZXJfY2xrLCBzcmF0ZTsKKworCWRlY19yYXRpbyA9IChpbnRlcm5hbC0+bWFzdGVyX2NsayAqIDIpIC8gKDUgKiBpbnRlcm5hbC0+c3JhdGUpOworCWRlY19yYXRpbyA9IChkZWNfcmF0aW8gPT0gMCkgPyAxIDogZGVjX3JhdGlvOworCWRlY19yYXRlID0gTG9nMkludChkZWNfcmF0aW8pOworCWRlY2ltID0gMSA8PCBkZWNfcmF0ZTsKKwltYXN0ZXJfY2xrID0gaW50ZXJuYWwtPm1hc3Rlcl9jbGsgLyAxMDAwOworCXNyYXRlID0gaW50ZXJuYWwtPnNyYXRlIC8gMTAwMDsKKworCWlmIChkZWNpbSA8PSA0KSB7CisJCWludHZhbCA9IChkZWNpbSAqICgxIDw8IChjb25maWctPmJ0cl9uY29fYml0cyAtIDEpKSkgLyBtYXN0ZXJfY2xrOworCQlyZW1haW4gPSAoZGVjaW0gKiAoMSA8PCAoY29uZmlnLT5idHJfbmNvX2JpdHMgLSAxKSkpICUgbWFzdGVyX2NsazsKKwl9IGVsc2UgeworCQlpbnR2YWwgPSAoMSA8PCAoY29uZmlnLT5idHJfbmNvX2JpdHMgLSAxKSkgLyAobWFzdGVyX2NsayAvIDEwMCkgKiBkZWNpbSAvIDEwMDsKKwkJcmVtYWluID0gKGRlY2ltICogKDEgPDwgKGNvbmZpZy0+YnRyX25jb19iaXRzIC0gMSkpKSAlIG1hc3Rlcl9jbGs7CisJfQorCWJ0cl9ub21fZnJlcSA9IChpbnR2YWwgKiBzcmF0ZSkgKyAoKHJlbWFpbiAqIHNyYXRlKSAvIG1hc3Rlcl9jbGspOworCisJcmV0dXJuIGJ0cl9ub21fZnJlcTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfY2FsY19kZXYKKyAqIGNvbXB1dGUgdGhlIGNvcnJlY3Rpb24gdG8gYmUgYXBwbGllZCB0byBzeW1ib2wgcmF0ZQorICovCitzdGF0aWMgdTMyIHN0YjA4OTlfZHZiczJfY2FsY19kZXYoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJdTMyIGRlY19yYXRpbywgY29ycmVjdGlvbiwgbWFzdGVyX2Nsaywgc3JhdGU7CisKKwlkZWNfcmF0aW8gPSAoaW50ZXJuYWwtPm1hc3Rlcl9jbGsgKiAyKSAvICg1ICogaW50ZXJuYWwtPnNyYXRlKTsKKwlkZWNfcmF0aW8gPSAoZGVjX3JhdGlvID09IDApID8gMSA6IGRlY19yYXRpbzsKKworCW1hc3Rlcl9jbGsgPSBpbnRlcm5hbC0+bWFzdGVyX2NsayAvIDEwMDA7CS8qIGZvciBpbnRlZ2VyIENhY3VsYXRpb24qLworCXNyYXRlID0gaW50ZXJuYWwtPnNyYXRlIC8gMTAwMDsJLyogZm9yIGludGVnZXIgQ2FjdWxhdGlvbiovCisJY29ycmVjdGlvbiA9ICg1MTIgKiBtYXN0ZXJfY2xrKSAvICgyICogZGVjX3JhdGlvICogc3JhdGUpOworCisJcmV0dXJuCWNvcnJlY3Rpb247Cit9CisKKy8qCisgKiBzdGIwODk5X2R2YnMyX3NldF9zcmF0ZQorICogU2V0IERWQlMyIHN5bWJvbCByYXRlCisgKi8KK3N0YXRpYyB2b2lkIHN0YjA4OTlfZHZiczJfc2V0X3NyYXRlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCisJdTMyIGRlY19yYXRpbywgZGVjX3JhdGUsIHdpbl9zZWwsIGRlY2ltLCBmX3N5bSwgYnRyX25vbV9mcmVxOworCXUzMiBjb3JyZWN0aW9uLCBmcmVxX2FkaiwgYmFuZF9saW0sIGRlY2ltX2NudHJsLCByZWc7CisJdTggYW50aV9hbGlhczsKKworCS8qc2V0IGRlY2ltYXRpb24gdG8gMSovCisJZGVjX3JhdGlvID0gKGludGVybmFsLT5tYXN0ZXJfY2xrICogMikgLyAoNSAqIGludGVybmFsLT5zcmF0ZSk7CisJZGVjX3JhdGlvID0gKGRlY19yYXRpbyA9PSAwKSA/IDEgOiBkZWNfcmF0aW87CisJZGVjX3JhdGUgPSBMb2cySW50KGRlY19yYXRpbyk7CisKKwl3aW5fc2VsID0gMDsKKwlpZiAoZGVjX3JhdGUgPj0gNSkKKwkJd2luX3NlbCA9IGRlY19yYXRlIC0gNDsKKworCWRlY2ltID0gKDEgPDwgZGVjX3JhdGUpOworCS8qIChGU2FtcC9Gc3ltYm9sICoxMDApIGZvciBpbnRlZ2VyIENhY3VsYXRpb24gKi8KKwlmX3N5bSA9IGludGVybmFsLT5tYXN0ZXJfY2xrIC8gKChkZWNpbSAqIGludGVybmFsLT5zcmF0ZSkgLyAxMDAwKTsKKworCWlmIChmX3N5bSA8PSAyMjUwKQkvKiBkb24ndCBiYW5kIGxpbWl0IHNpZ25hbCBnb2luZyBpbnRvIGJ0ciBibG9jayovCisJCWJhbmRfbGltID0gMTsKKwllbHNlCisJCWJhbmRfbGltID0gMDsJLyogYmFuZCBsaW1pdCBzaWduYWwgZ29pbmcgaW50byBidHIgYmxvY2sqLworCisJZGVjaW1fY250cmwgPSAoKHdpbl9zZWwgPDwgMykgJiAweDE4KSArICgoYmFuZF9saW0gPDwgNSkgJiAweDIwKSArIChkZWNfcmF0ZSAmIDB4Nyk7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfREVDSU1fQ05UUkwsIFNUQjA4OTlfT0ZGMF9ERUNJTV9DTlRSTCwgZGVjaW1fY250cmwpOworCisJaWYgKGZfc3ltIDw9IDM0NTApCisJCWFudGlfYWxpYXMgPSAwOworCWVsc2UgaWYgKGZfc3ltIDw9IDQyNTApCisJCWFudGlfYWxpYXMgPSAxOworCWVsc2UKKwkJYW50aV9hbGlhcyA9IDI7CisKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9BTlRJX0FMSUFTX1NFTCwgU1RCMDg5OV9PRkYwX0FOVElfQUxJQVNfU0VMLCBhbnRpX2FsaWFzKTsKKwlidHJfbm9tX2ZyZXEgPSBzdGIwODk5X2R2YnMyX2NhbGNfc3JhdGUoc3RhdGUpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0JUUl9OT01fRlJFUSwgU1RCMDg5OV9PRkYwX0JUUl9OT01fRlJFUSwgYnRyX25vbV9mcmVxKTsKKworCWNvcnJlY3Rpb24gPSBzdGIwODk5X2R2YnMyX2NhbGNfZGV2KHN0YXRlKTsKKwlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBCVFJfQ05UUkwpOworCVNUQjA4OTlfU0VURklFTERfVkFMKEJUUl9GUkVRX0NPUlIsIHJlZywgY29ycmVjdGlvbik7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQlRSX0NOVFJMLCBTVEIwODk5X09GRjBfQlRSX0NOVFJMLCByZWcpOworCisJLyogc2NhbGUgVVdQK0NTTSBmcmVxdWVuY3kgdG8gc2FtcGxlIHJhdGUqLworCWZyZXFfYWRqID0gIGludGVybmFsLT5zcmF0ZSAvIChpbnRlcm5hbC0+bWFzdGVyX2NsayAvIDQwOTYpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0ZSRVFfQURKX1NDQUxFLCBTVEIwODk5X09GRjBfRlJFUV9BREpfU0NBTEUsIGZyZXFfYWRqKTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfc2V0X2J0cl9sb29wYncKKyAqIHNldCBiaXQgdGltaW5nIGxvb3AgYmFuZHdpZHRoIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc3ltYm9sIHJhdGUKKyAqLworc3RhdGljIHZvaWQgc3RiMDg5OV9kdmJzMl9zZXRfYnRyX2xvb3BidyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsCT0gJnN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3RiMDg5OV9jb25maWcgKmNvbmZpZwkJPSBzdGF0ZS0+Y29uZmlnOworCisJdTMyIHN5bV9wZWFrID0gMjMsIHpldGEgPSA3MDcsIGxvb3Bid19wZXJjZW50ID0gNjA7CisJczMyIGRlY19yYXRpbywgZGVjX3JhdGUsIGtfYnRyMV9yc2hmdCwga19idHIxLCBrX2J0cjBfcnNoZnQ7CisJczMyIGtfYnRyMCwga19idHIyX3JzaGZ0LCBrX2RpcmVjdF9zaGlmdCwga19pbmRpcmVjdF9zaGlmdDsKKwl1MzIgZGVjaW0sIEssIHduLCBrX2RpcmVjdCwga19pbmRpcmVjdDsKKwl1MzIgcmVnOworCisJZGVjX3JhdGlvID0gKGludGVybmFsLT5tYXN0ZXJfY2xrICogMikgLyAoNSAqIGludGVybmFsLT5zcmF0ZSk7CisJZGVjX3JhdGlvID0gKGRlY19yYXRpbyA9PSAwKSA/IDEgOiBkZWNfcmF0aW87CisJZGVjX3JhdGUgPSBMb2cySW50KGRlY19yYXRpbyk7CisJZGVjaW0gPSAoMSA8PCBkZWNfcmF0ZSk7CisKKwlzeW1fcGVhayAqPSA1NzYwMDA7CisJSyA9ICgxIDw8IGNvbmZpZy0+YnRyX25jb19iaXRzKSAvIChpbnRlcm5hbC0+bWFzdGVyX2NsayAvIDEwMDApOworCUsgKj0gKGludGVybmFsLT5zcmF0ZSAvIDEwMDAwMDApICogZGVjaW07IC8qaz1rIDEwXi04Ki8KKworCWlmIChLICE9IDApIHsKKwkJSyA9IHN5bV9wZWFrIC8gSzsKKwkJd24gPSAoNCAqIHpldGEgKiB6ZXRhKSArIDEwMDAwMDA7CisJCXduID0gKDIgKiAobG9vcGJ3X3BlcmNlbnQgKiAxMDAwKSAqIDQwICogemV0YSkgL3duOyAgLyp3biA9d24gMTBeLTgqLworCisJCWtfaW5kaXJlY3QgPSAod24gKiB3bikgLyBLOworCQlrX2luZGlyZWN0ID0ga19pbmRpcmVjdDsJICAvKmtpbmRpcmVjdCA9IGtpbmRpcmVjdCAxMF4tNiovCisJCWtfZGlyZWN0ICAgPSAoMiAqIHduICogemV0YSkgLyBLOwkvKmtEaXJlY3QgPSBrRGlyZWN0IDEwXi0yKi8KKwkJa19kaXJlY3QgICo9IDEwMDsKKworCQlrX2RpcmVjdF9zaGlmdCA9IExvZzJJbnQoa19kaXJlY3QpIC0gTG9nMkludCgxMDAwMCkgLSAyOworCQlrX2J0cjFfcnNoZnQgPSAoLTEgKiBrX2RpcmVjdF9zaGlmdCkgKyBjb25maWctPmJ0cl9nYWluX3NoaWZ0X29mZnNldDsKKwkJa19idHIxID0ga19kaXJlY3QgLyAoMSA8PCBrX2RpcmVjdF9zaGlmdCk7CisJCWtfYnRyMSAvPSAxMDAwMDsKKworCQlrX2luZGlyZWN0X3NoaWZ0ID0gTG9nMkludChrX2luZGlyZWN0ICsgMTUpIC0gMjAgLyotIDIqLzsKKwkJa19idHIwX3JzaGZ0ID0gKC0xICoga19pbmRpcmVjdF9zaGlmdCkgKyBjb25maWctPmJ0cl9nYWluX3NoaWZ0X29mZnNldDsKKwkJa19idHIwID0ga19pbmRpcmVjdCAqICgxIDw8ICgta19pbmRpcmVjdF9zaGlmdCkpOworCQlrX2J0cjAgLz0gMTAwMDAwMDsKKworCQlrX2J0cjJfcnNoZnQgPSAwOworCQlpZiAoa19idHIwX3JzaGZ0ID4gMTUpIHsKKwkJCWtfYnRyMl9yc2hmdCA9IGtfYnRyMF9yc2hmdCAtIDE1OworCQkJa19idHIwX3JzaGZ0ID0gMTU7CisJCX0KKwkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQlRSX0xPT1BfR0FJTik7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEtCVFIwX1JTSEZULCByZWcsIGtfYnRyMF9yc2hmdCk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEtCVFIwLCByZWcsIGtfYnRyMCk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEtCVFIxX1JTSEZULCByZWcsIGtfYnRyMV9yc2hmdCk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEtCVFIxLCByZWcsIGtfYnRyMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEtCVFIyX1JTSEZULCByZWcsIGtfYnRyMl9yc2hmdCk7CisJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0JUUl9MT09QX0dBSU4sIFNUQjA4OTlfT0ZGMF9CVFJfTE9PUF9HQUlOLCByZWcpOworCX0gZWxzZQorCQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9CVFJfTE9PUF9HQUlOLCBTVEIwODk5X09GRjBfQlRSX0xPT1BfR0FJTiwgMHhjNGM0Zik7Cit9CisKKy8qCisgKiBzdGIwODk5X2R2YnMyX3NldF9jYXJyX2ZyZXEKKyAqIHNldCBub21pbmFsIGZyZXF1ZW5jeSBmb3IgY2FycmllciBzZWFyY2gKKyAqLworc3RhdGljIHZvaWQgc3RiMDg5OV9kdmJzMl9zZXRfY2Fycl9mcmVxKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgczMyIGNhcnJfZnJlcSwgdTMyIG1hc3Rlcl9jbGspCit7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCXMzMiBjcmxfbm9tX2ZyZXE7CisJdTMyIHJlZzsKKworCWNybF9ub21fZnJlcSA9ICgxIDw8IGNvbmZpZy0+Y3JsX25jb19iaXRzKSAvIG1hc3Rlcl9jbGs7CisJY3JsX25vbV9mcmVxICo9IGNhcnJfZnJlcTsKKwlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDUkxfTk9NX0ZSRVEpOworCVNUQjA4OTlfU0VURklFTERfVkFMKENSTF9OT01fRlJFUSwgcmVnLCBjcmxfbm9tX2ZyZXEpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NSTF9OT01fRlJFUSwgU1RCMDg5OV9PRkYwX0NSTF9OT01fRlJFUSwgcmVnKTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfaW5pdF9jYWxjCisgKiBJbml0aWFsaXplIERWQlMyIFVXUCwgQ1NNLCBjYXJyaWVyIGFuZCB0aW1pbmcgbG9vcHMKKyAqLworc3RhdGljIHZvaWQgc3RiMDg5OV9kdmJzMl9pbml0X2NhbGMoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJczMyIHN0ZXBzLCBzdGVwX3NpemU7CisJdTMyIHJhbmdlLCByZWc7CisKKwkvKiBjb25maWcgdXdwIGFuZCBjc20gKi8KKwlzdGIwODk5X2R2YnMyX2NvbmZpZ191d3Aoc3RhdGUpOworCXN0YjA4OTlfZHZiczJfY29uZmlnX2NzbV9hdXRvKHN0YXRlKTsKKworCS8qIGluaXRpYWxpemUgQlRSCSovCisJc3RiMDg5OV9kdmJzMl9zZXRfc3JhdGUoc3RhdGUpOworCXN0YjA4OTlfZHZiczJfc2V0X2J0cl9sb29wYncoc3RhdGUpOworCisJaWYgKGludGVybmFsLT5zcmF0ZSAvIDEwMDAwMDAgPj0gMTUpCisJCXN0ZXBfc2l6ZSA9ICgxIDw8IDE3KSAvIDU7CisJZWxzZSBpZiAoaW50ZXJuYWwtPnNyYXRlIC8gMTAwMDAwMCA+PSAxMCkKKwkJc3RlcF9zaXplID0gKDEgPDwgMTcpIC8gNzsKKwllbHNlIGlmIChpbnRlcm5hbC0+c3JhdGUgLyAxMDAwMDAwID49IDUpCisJCXN0ZXBfc2l6ZSA9ICgxIDw8IDE3KSAvIDEwOworCWVsc2UKKwkJc3RlcF9zaXplID0gKDEgPDwgMTcpIC8gNDsKKworCXJhbmdlID0gaW50ZXJuYWwtPnNyY2hfcmFuZ2UgLyAxMDAwMDAwOworCXN0ZXBzID0gKDEwICogcmFuZ2UgKiAoMSA8PCAxNykpIC8gKHN0ZXBfc2l6ZSAqIChpbnRlcm5hbC0+c3JhdGUgLyAxMDAwMDAwKSk7CisJc3RlcHMgPSAoc3RlcHMgKyA2KSAvIDEwOworCXN0ZXBzID0gKHN0ZXBzID09IDApID8gMSA6IHN0ZXBzOworCWlmIChzdGVwcyAlIDIgPT0gMCkKKwkJc3RiMDg5OV9kdmJzMl9zZXRfY2Fycl9mcmVxKHN0YXRlLCBpbnRlcm5hbC0+Y2VudGVyX2ZyZXEgLQorCQkJCQkgICAoaW50ZXJuYWwtPnN0ZXBfc2l6ZSAqIChpbnRlcm5hbC0+c3JhdGUgLyAyMDAwMDAwMCkpLAorCQkJCQkgICAoaW50ZXJuYWwtPm1hc3Rlcl9jbGspIC8gMTAwMDAwMCk7CisJZWxzZQorCQlzdGIwODk5X2R2YnMyX3NldF9jYXJyX2ZyZXEoc3RhdGUsIGludGVybmFsLT5jZW50ZXJfZnJlcSwgKGludGVybmFsLT5tYXN0ZXJfY2xrKSAvIDEwMDAwMDApOworCisJLypTZXQgQ2FycmllciBTZWFyY2ggcGFyYW1zICh6aWd6YWcsIG51bSBzdGVwcyBhbmQgZnJlcSBzdGVwIHNpemUqLworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIEFDUV9DTlRSTDIpOworCVNUQjA4OTlfU0VURklFTERfVkFMKFpJR1pBRywgcmVnLCAxKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChOVU1fU1RFUFMsIHJlZywgc3RlcHMpOworCVNUQjA4OTlfU0VURklFTERfVkFMKEZSRVFfU1RFUFNJWkUsIHJlZywgc3RlcF9zaXplKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9BQ1FfQ05UUkwyLCBTVEIwODk5X09GRjBfQUNRX0NOVFJMMiwgcmVnKTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfYnRyX2luaXQKKyAqIGluaXRpYWxpemUgdGhlIHRpbWluZyBsb29wCisgKi8KK3N0YXRpYyB2b2lkIHN0YjA4OTlfZHZiczJfYnRyX2luaXQoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXUzMiByZWc7CisKKwkvKiBzZXQgZW5hYmxlIEJUUiBsb29wYmFjawkqLworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIEJUUl9DTlRSTCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoSU5UUlBfUEhTX1NFTlNFLCByZWcsIDEpOworCVNUQjA4OTlfU0VURklFTERfVkFMKEJUUl9FUlJfRU5BLCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0JUUl9DTlRSTCwgU1RCMDg5OV9PRkYwX0JUUl9DTlRSTCwgcmVnKTsKKworCS8qIGZpeCBidHIgZnJlcSBhY2N1bSBhdCAwCSovCisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQlRSX0ZSRVFfSU5JVCwgU1RCMDg5OV9PRkYwX0JUUl9GUkVRX0lOSVQsIDB4MTAwMDAwMDApOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0JUUl9GUkVRX0lOSVQsIFNUQjA4OTlfT0ZGMF9CVFJfRlJFUV9JTklULCAweDAwMDAwMDAwKTsKKworCS8qIGZpeCBidHIgZnJlcSBhY2N1bSBhdCAwCSovCisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQlRSX1BIU19JTklULCBTVEIwODk5X09GRjBfQlRSX1BIU19JTklULCAweDEwMDAwMDAwKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9CVFJfUEhTX0lOSVQsIFNUQjA4OTlfT0ZGMF9CVFJfUEhTX0lOSVQsIDB4MDAwMDAwMDApOworfQorCisvKgorICogc3RiMDg5OV9kdmJzMl9yZWFjcXVpcmUKKyAqIHRyaWdnZXIgYSBEVkItUzIgYWNxdWlzaXRpb24KKyAqLworc3RhdGljIHZvaWQgc3RiMDg5OV9kdmJzMl9yZWFjcXVpcmUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXUzMiByZWcgPSAwOworCisJLyogZGVtb2Qgc29mdCByZXNldAkqLworCVNUQjA4OTlfU0VURklFTERfVkFMKERWQlMyX1JFU0VULCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX1JFU0VUX0NOVFJMLCBTVEIwODk5X09GRjBfUkVTRVRfQ05UUkwsIHJlZyk7CisKKwkvKlJlc2V0IFRpbWluZyBMb29wCSovCisJc3RiMDg5OV9kdmJzMl9idHJfaW5pdChzdGF0ZSk7CisKKwkvKiByZXNldCBDYXJyaWVyIGxvb3AJKi8KKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9DUkxfRlJFUV9JTklULCBTVEIwODk5X09GRjBfQ1JMX0ZSRVFfSU5JVCwgKDEgPDwgMzApKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9DUkxfRlJFUV9JTklULCBTVEIwODk5X09GRjBfQ1JMX0ZSRVFfSU5JVCwgMCk7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1JMX0xPT1BfR0FJTiwgU1RCMDg5OV9PRkYwX0NSTF9MT09QX0dBSU4sIDApOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NSTF9QSFNfSU5JVCwgU1RCMDg5OV9PRkYwX0NSTF9QSFNfSU5JVCwgKDEgPDwgMzApKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9DUkxfUEhTX0lOSVQsIFNUQjA4OTlfT0ZGMF9DUkxfUEhTX0lOSVQsIDApOworCisJLypyZWxlYXNlIGRlbW9kIHNvZnQgcmVzZXQJKi8KKwlyZWcgPSAwOworCVNUQjA4OTlfU0VURklFTERfVkFMKERWQlMyX1JFU0VULCByZWcsIDApOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX1JFU0VUX0NOVFJMLCBTVEIwODk5X09GRjBfUkVTRVRfQ05UUkwsIHJlZyk7CisKKwkvKiBzdGFydCBhY3F1aXNpdGlvbiBwcm9jZXNzCSovCisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQUNRVUlSRV9UUklHLCBTVEIwODk5X09GRjBfQUNRVUlSRV9UUklHLCAxKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9MT0NLX0xPU1QsIFNUQjA4OTlfT0ZGMF9MT0NLX0xPU1QsIDApOworCisJLyogZXF1YWxpemVyIEluaXQJKi8KKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9FUVVBTElaRVJfSU5JVCwgU1RCMDg5OV9PRkYwX0VRVUFMSVpFUl9JTklULCAxKTsKKworCS8qU3RhcnQgZXF1aWxpemVyCSovCisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfRVFVQUxJWkVSX0lOSVQsIFNUQjA4OTlfT0ZGMF9FUVVBTElaRVJfSU5JVCwgMCk7CisKKwlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBFUV9DTlRSTCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRVFfU0hJRlQsIHJlZywgMCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRVFfRElTQUJMRV9VUERBVEUsIHJlZywgMCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRVFfREVMQVksIHJlZywgMHgwNSk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRVFfQURBUFRfTU9ERSwgcmVnLCAweDAxKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9FUV9DTlRSTCwgU1RCMDg5OV9PRkYwX0VRX0NOVFJMLCByZWcpOworCisJLyogUkVTRVQgUGFja2V0IGRlbGluZWF0b3IJKi8KKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9QREVMQ1RSTCwgMHg0YSk7Cit9CisKKy8qCisgKiBzdGIwODk5X2R2YnMyX2dldF9kbWRfc3RhdHVzCisgKiBnZXQgRFZCLVMyIERlbW9kIExPQ0sgc3RhdHVzCisgKi8KK3N0YXRpYyBlbnVtIHN0YjA4OTlfc3RhdHVzIHN0YjA4OTlfZHZiczJfZ2V0X2RtZF9zdGF0dXMoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgdGltZSA9IC0xMCwgbG9jayA9IDAsIHV3cCwgY3NtOworCXUzMiByZWc7CisKKwlkbyB7CisJCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIERNRF9TVEFUVVMpOworCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRNRF9TVEFUVVM9WzB4JTAyeF0iLCByZWcpOworCQlpZiAoU1RCMDg5OV9HRVRGSUVMRChJRl9BR0NfTE9DSywgcmVnKSkKKwkJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tLT5JRiBBR0MgTE9DS0VEICEiKTsKKwkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgRE1EX1NUQVQyKTsKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tLS0tLT5ETUQgU1RBVDI9WzB4JTAyeF0iLCByZWcpOworCQl1d3AgPSBTVEIwODk5X0dFVEZJRUxEKFVXUF9MT0NLLCByZWcpOworCQljc20gPSBTVEIwODk5X0dFVEZJRUxEKENTTV9MT0NLLCByZWcpOworCQlpZiAodXdwICYmIGNzbSkKKwkJCWxvY2sgPSAxOworCisJCXRpbWUgKz0gMTA7CisJCW1zbGVlcCgxMCk7CisKKwl9IHdoaWxlICgoIWxvY2spICYmICh0aW1lIDw9IHRpbWVvdXQpKTsKKworCWlmIChsb2NrKSB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tLS0tLT4gRFZCLVMyIExPQ0sgISIpOworCQlyZXR1cm4gRFZCUzJfREVNT0RfTE9DSzsKKwl9IGVsc2UgeworCQlyZXR1cm4gRFZCUzJfREVNT0RfTk9MT0NLOworCX0KK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfZ2V0X2RhdGFfbG9jaworICogZ2V0IEZFQyBzdGF0dXMKKyAqLworc3RhdGljIGludCBzdGIwODk5X2R2YnMyX2dldF9kYXRhX2xvY2soc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgdGltZSA9IDAsIGxvY2sgPSAwOworCXU4IHJlZzsKKworCXdoaWxlICgoIWxvY2spICYmICh0aW1lIDwgdGltZW91dCkpIHsKKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9DRkdQREVMU1RBVFVTMSk7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tPiBDRkdQREVMU1RBVFVTPVsweCUwMnhdIiwgcmVnKTsKKwkJbG9jayA9IFNUQjA4OTlfR0VURklFTEQoQ0ZHUERFTFNUQVRVU19MT0NLLCByZWcpOworCQl0aW1lKys7CisJfQorCisJcmV0dXJuIGxvY2s7Cit9CisKKy8qCisgKiBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzCisgKiBnZXQgRFZCLVMyIEZFQyBMT0NLIHN0YXR1cworICovCitzdGF0aWMgZW51bSBzdGIwODk5X3N0YXR1cyBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgaW50IHRpbWVvdXQpCit7CisJaW50IHRpbWUgPSAwLCBMb2NrZWQ7CisKKwlkbyB7CisJCUxvY2tlZCA9IHN0YjA4OTlfZHZiczJfZ2V0X2RhdGFfbG9jayhzdGF0ZSwgMSk7CisJCXRpbWUrKzsKKwkJbXNsZWVwKDEpOworCisJfSB3aGlsZSAoKCFMb2NrZWQpICYmICh0aW1lIDwgdGltZW91dCkpOworCisJaWYgKExvY2tlZCkgeworCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIi0tLS0tLS0tLS0+RFZCLVMyIEZFQyBMT0NLICEiKTsKKwkJcmV0dXJuIERWQlMyX0ZFQ19MT0NLOworCX0gZWxzZSB7CisJCXJldHVybiBEVkJTMl9GRUNfTk9MT0NLOworCX0KK30KKworCisvKgorICogc3RiMDg5OV9kdmJzMl9pbml0X2NzbQorICogc2V0IHBhcmFtZXRlcnMgZm9yIG1hbnVhbCBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHN0YjA4OTlfZHZiczJfaW5pdF9jc20oc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCBpbnQgcGlsb3RzLCBlbnVtIHN0YjA4OTlfbW9kY29kIG1vZGNvZCkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCisJczMyIGR2dF90YmwgPSAxLCB0d29fcGFzcyA9IDAsIGFnY19nYWluID0gNiwgYWdjX3NoaWZ0ID0gMCwgbG9vcF9zaGlmdCA9IDAsIHBoc19kaWZmX3RociA9IDB4ODA7CisJczMyIGdhbW1hX2FjcSwgZ2FtbWFfcmhvX2FjcSwgZ2FtbWFfdHJrLCBnYW1tYV9yaG9fdHJrLCBsb2NrX2NvdW50X3RocjsKKwl1MzIgY3NtMSwgY3NtMiwgY3NtMywgY3NtNDsKKworCWlmICgoKGludGVybmFsLT5tYXN0ZXJfY2xrIC8gaW50ZXJuYWwtPnNyYXRlKSA8PSA0KSAmJiAobW9kY29kIDw9IDExKSAmJiAocGlsb3RzID09IDEpKSB7CisJCXN3aXRjaCAobW9kY29kKSB7CisJCWNhc2UgU1RCMDg5OV9RUFNLXzEyOgorCQkJZ2FtbWFfYWNxCQk9IDI1OworCQkJZ2FtbWFfcmhvX2FjcQkJPSAyNzAwOworCQkJZ2FtbWFfdHJrCQk9IDEyOworCQkJZ2FtbWFfcmhvX3RyawkJPSAxODA7CisJCQlsb2NrX2NvdW50X3RocgkJPSA4OworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9RUFNLXzM1OgorCQkJZ2FtbWFfYWNxCQk9IDM4OworCQkJZ2FtbWFfcmhvX2FjcQkJPSA3MTgyOworCQkJZ2FtbWFfdHJrCQk9IDE0OworCQkJZ2FtbWFfcmhvX3RyawkJPSAzMDg7CisJCQlsb2NrX2NvdW50X3RocgkJPSA4OworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9RUFNLXzIzOgorCQkJZ2FtbWFfYWNxCQk9IDQyOworCQkJZ2FtbWFfcmhvX2FjcQkJPSA5NDA4OworCQkJZ2FtbWFfdHJrCQk9IDE3OworCQkJZ2FtbWFfcmhvX3RyawkJPSA0NzY7CisJCQlsb2NrX2NvdW50X3RocgkJPSA4OworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9RUFNLXzM0OgorCQkJZ2FtbWFfYWNxCQk9IDUzOworCQkJZ2FtbWFfcmhvX2FjcQkJPSAxNjY0MjsKKwkJCWdhbW1hX3RyawkJPSAxOTsKKwkJCWdhbW1hX3Job190cmsJCT0gNjQ2OworCQkJbG9ja19jb3VudF90aHIJCT0gODsKKwkJCWJyZWFrOworCQljYXNlIFNUQjA4OTlfUVBTS180NToKKwkJCWdhbW1hX2FjcQkJPSA1MzsKKwkJCWdhbW1hX3Job19hY3EJCT0gMTcxMTk7CisJCQlnYW1tYV90cmsJCT0gMjI7CisJCQlnYW1tYV9yaG9fdHJrCQk9IDg4MDsKKwkJCWxvY2tfY291bnRfdGhyCQk9IDg7CisJCQlicmVhazsKKwkJY2FzZSBTVEIwODk5X1FQU0tfNTY6CisJCQlnYW1tYV9hY3EJCT0gNTU7CisJCQlnYW1tYV9yaG9fYWNxCQk9IDE5MjUwOworCQkJZ2FtbWFfdHJrCQk9IDIzOworCQkJZ2FtbWFfcmhvX3RyawkJPSA5ODk7CisJCQlsb2NrX2NvdW50X3RocgkJPSA4OworCQkJYnJlYWs7CisJCWNhc2UgU1RCMDg5OV9RUFNLXzg5OgorCQkJZ2FtbWFfYWNxCQk9IDYwOworCQkJZ2FtbWFfcmhvX2FjcQkJPSAyNDI0MDsKKwkJCWdhbW1hX3RyawkJPSAyNDsKKwkJCWdhbW1hX3Job190cmsJCT0gMTE3NjsKKwkJCWxvY2tfY291bnRfdGhyCQk9IDg7CisJCQlicmVhazsKKwkJY2FzZSBTVEIwODk5X1FQU0tfOTEwOgorCQkJZ2FtbWFfYWNxCQk9IDY2OworCQkJZ2FtbWFfcmhvX2FjcQkJPSAyOTYzNDsKKwkJCWdhbW1hX3RyawkJPSAyNDsKKwkJCWdhbW1hX3Job190cmsJCT0gMTE3NjsKKwkJCWxvY2tfY291bnRfdGhyCQk9IDg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdhbW1hX2FjcQkJPSA2NjsKKwkJCWdhbW1hX3Job19hY3EJCT0gMjk2MzQ7CisJCQlnYW1tYV90cmsJCT0gMjQ7CisJCQlnYW1tYV9yaG9fdHJrCQk9IDExNzY7CisJCQlsb2NrX2NvdW50X3RocgkJPSA4OworCQkJYnJlYWs7CisJCX0KKworCQljc20xID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQ1NNX0NOVFJMMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKENTTV9BVVRPX1BBUkFNLCBjc20xLCAwKTsKKwkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMSwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEsIGNzbTEpOworCisJCWNzbTEgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDU01fQ05UUkwxKTsKKwkJY3NtMiA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIENTTV9DTlRSTDIpOworCQljc20zID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQ1NNX0NOVFJMMyk7CisJCWNzbTQgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDU01fQ05UUkw0KTsKKworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDU01fRFZUX1RBQkxFLCBjc20xLCBkdnRfdGJsKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX1RXT19QQVNTLCBjc20xLCB0d29fcGFzcyk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKENTTV9BR0NfR0FJTiwgY3NtMSwgYWdjX2dhaW4pOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDU01fQUdDX1NISUZULCBjc20xLCBhZ2Nfc2hpZnQpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChGRV9MT09QX1NISUZULCBjc20xLCBsb29wX3NoaWZ0KTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX0dBTU1BX0FDUSwgY3NtMiwgZ2FtbWFfYWNxKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX0dBTU1BX1JIT0FDUSwgY3NtMiwgZ2FtbWFfcmhvX2FjcSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKENTTV9HQU1NQV9UUkFDSywgY3NtMywgZ2FtbWFfdHJrKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX0dBTU1BX1JIT1RSQUNLLCBjc20zLCBnYW1tYV9yaG9fdHJrKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX0xPQ0tDT1VOVF9USFJFU0gsIGNzbTQsIGxvY2tfY291bnRfdGhyKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoQ1NNX1BIQVNFRElGRl9USFJFU0gsIGNzbTQsIHBoc19kaWZmX3Rocik7CisKKwkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMSwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEsIGNzbTEpOworCQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9DU01fQ05UUkwyLCBTVEIwODk5X09GRjBfQ1NNX0NOVFJMMiwgY3NtMik7CisJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDMsIFNUQjA4OTlfT0ZGMF9DU01fQ05UUkwzLCBjc20zKTsKKwkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMNCwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDQsIGNzbTQpOworCX0KK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfZ2V0X3NyYXRlCisgKiBnZXQgRFZCLVMyIFN5bWJvbCBSYXRlCisgKi8KK3N0YXRpYyB1MzIgc3RiMDg5OV9kdmJzMl9nZXRfc3JhdGUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCisJdTMyIGJUck5vbUZyZXEsIHNyYXRlLCBkZWNpbVJhdGUsIGludHZhbDEsIGludHZhbDIsIHJlZzsKKwlpbnQgZGl2MSwgZGl2MiwgcmVtMSwgcmVtMjsKKworCWRpdjEgPSBjb25maWctPmJ0cl9uY29fYml0cyAvIDI7CisJZGl2MiA9IGNvbmZpZy0+YnRyX25jb19iaXRzIC0gZGl2MSAtIDE7CisKKwliVHJOb21GcmVxID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQlRSX05PTV9GUkVRKTsKKworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIERFQ0lNX0NOVFJMKTsKKwlkZWNpbVJhdGUgPSBTVEIwODk5X0dFVEZJRUxEKERFQ0lNX1JBVEUsIHJlZyk7CisJZGVjaW1SYXRlID0gKDEgPDwgZGVjaW1SYXRlKTsKKworCWludHZhbDEgPSBpbnRlcm5hbC0+bWFzdGVyX2NsayAvICgxIDw8IGRpdjEpOworCWludHZhbDIgPSBiVHJOb21GcmVxIC8gKDEgPDwgZGl2Mik7CisKKwlyZW0xID0gaW50ZXJuYWwtPm1hc3Rlcl9jbGsgJSAoMSA8PCBkaXYxKTsKKwlyZW0yID0gYlRyTm9tRnJlcSAlICgxIDw8IGRpdjIpOworCS8qIG9ubHkgZm9yIGludGVnZXIgY2FsY3VsYXRpb24JKi8KKwlzcmF0ZSA9IChpbnR2YWwxICogaW50dmFsMikgKyAoKGludHZhbDEgKiByZW0yKSAvICgxIDw8IGRpdjIpKSArICgoaW50dmFsMiAqIHJlbTEpIC8gKDEgPDwgZGl2MSkpOworCXNyYXRlIC89IGRlY2ltUmF0ZTsJLypzeW1icmF0ZSA9IChidHJub21mcmVxX3JlZ2lzdGVyX3ZhbCpNYXN0ZXJDbG9jaykvMl4oMjcrZGVjaW1fcmF0ZV9maWVsZCkgKi8KKworCXJldHVybglzcmF0ZTsKK30KKworLyoKKyAqIHN0YjA4OTlfZHZiczJfYWxnbworICogU2VhcmNoIGZvciBzaWduYWwsIHRpbWluZywgY2FycmllciBhbmQgZGF0YSBmb3IgYSBnaXZlbgorICogZnJlcXVlbmN5IGluIGEgZ2l2ZW4gcmFuZ2UKKyAqLworZW51bSBzdGIwODk5X3N0YXR1cyBzdGIwODk5X2R2YnMyX2FsZ28oc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJZW51bSBzdGIwODk5X21vZGNvZCBtb2Rjb2Q7CisKKwlzMzIgb2Zmc2V0ZnJlcSwgc2VhcmNoVGltZSwgRmVjTG9ja1RpbWUsIHBpbG90cywgaXFTcGVjdHJ1bTsKKwlpbnQgaSA9IDA7CisJdTMyIHJlZywgY3NtMTsKKworCWlmIChpbnRlcm5hbC0+c3JhdGUgPD0gMjAwMDAwMCkgeworCQlzZWFyY2hUaW1lCT0gNTAwMDsJLyogNTAwMCBtcyBtYXggdGltZSB0byBsb2NrIFVXUCBhbmQgQ1NNLCBTWU1CIDw9IDJNYnMJCSovCisJCUZlY0xvY2tUaW1lCT0gMzUwOwkvKiAzNTAgIG1zIG1heCB0aW1lIHRvIGxvY2sgRkVDLCBTWU1CIDw9IDJNYnMJCQkqLworCX0gZWxzZSBpZiAoaW50ZXJuYWwtPnNyYXRlIDw9IDUwMDAwMDApIHsKKwkJc2VhcmNoVGltZQk9IDI1MDA7CS8qIDI1MDAgbXMgbWF4IHRpbWUgdG8gbG9jayBVV1AgYW5kIENTTSwgMk1icyA8IFNZTUIgPD0gNU1icwkqLworCQlGZWNMb2NrVGltZQk9IDE3MDsJLyogMTcwICBtcyBtYXggdGltZSB0byBsb2NrIEZFQywgMk1iczwgU1lNQiA8PSA1TWJzCQkqLworCX0gZWxzZSBpZiAoaW50ZXJuYWwtPnNyYXRlIDw9IDEwMDAwMDAwKSB7CisJCXNlYXJjaFRpbWUJPSAxNTAwOwkvKiAxNTAwIG1zIG1heCB0aW1lIHRvIGxvY2sgVVdQIGFuZCBDU00sIDVNYnMgPFNZTUIgPD0gMTBNYnMJKi8KKwkJRmVjTG9ja1RpbWUJPSA4MDsJLyogODAgIG1zIG1heCB0aW1lIHRvIGxvY2sgRkVDLCA1TWJzPCBTWU1CIDw9IDEwTWJzCQkqLworCX0gZWxzZSBpZiAoaW50ZXJuYWwtPnNyYXRlIDw9IDE1MDAwMDAwKSB7CisJCXNlYXJjaFRpbWUJPSA1MDA7CS8qIDUwMCBtcyBtYXggdGltZSB0byBsb2NrIFVXUCBhbmQgQ1NNLCAxME1icyA8U1lNQiA8PSAxNU1icwkqLworCQlGZWNMb2NrVGltZQk9IDUwOwkvKiA1MCAgbXMgbWF4IHRpbWUgdG8gbG9jayBGRUMsIDEwTWJzPCBTWU1CIDw9IDE1TWJzCQkqLworCX0gZWxzZSBpZiAoaW50ZXJuYWwtPnNyYXRlIDw9IDIwMDAwMDAwKSB7CisJCXNlYXJjaFRpbWUJPSAzMDA7CS8qIDMwMCBtcyBtYXggdGltZSB0byBsb2NrIFVXUCBhbmQgQ1NNLCAxNU1icyA8IFNZTUIgPD0gMjBNYnMJKi8KKwkJRmVjTG9ja1RpbWUJPSAzMDsJLyogNTAgIG1zIG1heCB0aW1lIHRvIGxvY2sgRkVDLCAxNU1iczwgU1lNQiA8PSAyME1icwkJKi8KKwl9IGVsc2UgaWYgKGludGVybmFsLT5zcmF0ZSA8PSAyNTAwMDAwMCkgeworCQlzZWFyY2hUaW1lCT0gMjUwOwkvKiAyNTAgbXMgbWF4IHRpbWUgdG8gbG9jayBVV1AgYW5kIENTTSwgMjAgTWJzIDwgU1lNQiA8PSAyNU1icwkqLworCQlGZWNMb2NrVGltZQk9IDI1OwkvKiAyNSBtcyBtYXggdGltZSB0byBsb2NrIEZFQywgMjBNYnM8IFNZTUIgPD0gMjVNYnMJCSovCisJfSBlbHNlIHsKKwkJc2VhcmNoVGltZQk9IDE1MDsJLyogMTUwIG1zIG1heCB0aW1lIHRvIGxvY2sgVVdQIGFuZCBDU00sIFNZTUIgPiAyNU1icwkJKi8KKwkJRmVjTG9ja1RpbWUJPSAyMDsJLyogMjAgbXMgbWF4IHRpbWUgdG8gbG9jayBGRUMsIDIwTWJzPCBTWU1CIDw9IDI1TWJzCQkqLworCX0KKworCS8qIE1haW50YWluIFN0cmVhbSBNZXJnZXIgaW4gcmVzZXQgZHVyaW5nIGFjcXVpc2l0aW9uCSovCisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMpOworCVNUQjA4OTlfU0VURklFTERfVkFMKEZSRVNSUywgcmVnLCAxKTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMsIHJlZyk7CisKKwkvKiBlbmFibGUgdHVuZXIgSS9PICovCisJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDEpOworCisJLyogTW92ZSB0dW5lciB0byBmcmVxdWVuY3kJKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+dHVuZXJfc2V0X2ZyZXF1ZW5jeSkKKwkJc3RhdGUtPmNvbmZpZy0+dHVuZXJfc2V0X2ZyZXF1ZW5jeSgmc3RhdGUtPmZyb250ZW5kLCBpbnRlcm5hbC0+ZnJlcSk7CisJaWYgKHN0YXRlLT5jb25maWctPnR1bmVyX2dldF9mcmVxdWVuY3kpCisJCXN0YXRlLT5jb25maWctPnR1bmVyX2dldF9mcmVxdWVuY3koJnN0YXRlLT5mcm9udGVuZCwgJmludGVybmFsLT5mcmVxKTsKKworCS8qIGRpc2FibGUgdHVuZXIgSS9PICovCisJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDApOworCisJLyogU2V0IElGIEFHQyB0byBhY3F1aXNpdGlvbgkqLworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIElGX0FHQ19DTlRSTCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoSUZfTE9PUF9HQUlOLCByZWcsICA0KTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChJRl9BR0NfUkVGLCByZWcsIDMyKTsKKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9JRl9BR0NfQ05UUkwsIFNUQjA4OTlfT0ZGMF9JRl9BR0NfQ05UUkwsIHJlZyk7CisKKwlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBJRl9BR0NfQ05UUkwyKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChJRl9BR0NfRFVNUF9QRVIsIHJlZywgMCk7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfSUZfQUdDX0NOVFJMMiwgU1RCMDg5OV9PRkYwX0lGX0FHQ19DTlRSTDIsIHJlZyk7CisKKwkvKiBJbml0aWFsaXNhdGlvbgkqLworCXN0YjA4OTlfZHZiczJfaW5pdF9jYWxjKHN0YXRlKTsKKworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIERNRF9DTlRSTDIpOworCXN3aXRjaCAoaW50ZXJuYWwtPmludmVyc2lvbikgeworCWNhc2UgSVFfU1dBUF9PRkY6CisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNQRUNUUlVNX0lOVkVSVCwgcmVnLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJUV9TV0FQX09OOgorCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTUEVDVFJVTV9JTlZFUlQsIHJlZywgMSk7CisJCWJyZWFrOworCWNhc2UgSVFfU1dBUF9BVVRPOgkvKiB1c2UgbGFzdCBzdWNjZXNzZnVsIHNlYXJjaCBmaXJzdAkqLworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTUEVDVFJVTV9JTlZFUlQsIHJlZywgMSk7CisJCWJyZWFrOworCX0KKwlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9ETURfQ05UUkwyLCBTVEIwODk5X09GRjBfRE1EX0NOVFJMMiwgcmVnKTsKKwlzdGIwODk5X2R2YnMyX3JlYWNxdWlyZShzdGF0ZSk7CisKKwkvKiBXYWl0IGZvciBkZW1vZCBsb2NrIChVV1AgYW5kIENTTSkJKi8KKwlpbnRlcm5hbC0+c3RhdHVzID0gc3RiMDg5OV9kdmJzMl9nZXRfZG1kX3N0YXR1cyhzdGF0ZSwgc2VhcmNoVGltZSk7CisKKwlpZiAoaW50ZXJuYWwtPnN0YXR1cyA9PSBEVkJTMl9ERU1PRF9MT0NLKSB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tPiBEVkItUzIgREVNT0QgTE9DSyAhIik7CisJCWkgPSAwOworCQkvKiBEZW1vZCBMb2NrZWQsIGNoZWNrIEZFQyBzdGF0dXMJKi8KKwkJaW50ZXJuYWwtPnN0YXR1cyA9IHN0YjA4OTlfZHZiczJfZ2V0X2ZlY19zdGF0dXMoc3RhdGUsIEZlY0xvY2tUaW1lKTsKKworCQkvKklmIGZhbHNlIGxvY2sgKFVXUCBhbmQgQ1NNIExvY2tlZCBidXQgbm8gRkVDKSB0cnkgMyB0aW1lIG1heCovCisJCXdoaWxlICgoaW50ZXJuYWwtPnN0YXR1cyAhPSBEVkJTMl9GRUNfTE9DSykgJiYgKGkgPCAzKSkgeworCQkJLyoJUmVhZCB0aGUgZnJlcXVlbmN5IG9mZnNldCovCisJCQlvZmZzZXRmcmVxID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQ1JMX0ZSRVEpOworCisJCQkvKiBTZXQgdGhlIE5vbWluYWwgZnJlcXVlbmN5IHRvIHRoZSBmb3VuZCBmcmVxdWVuY3kgb2Zmc2V0IGZvciB0aGUgbmV4dCByZWFjcXVpcmUqLworCQkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgQ1JMX05PTV9GUkVRKTsKKwkJCVNUQjA4OTlfU0VURklFTERfVkFMKENSTF9OT01fRlJFUSwgcmVnLCBvZmZzZXRmcmVxKTsKKwkJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NSTF9OT01fRlJFUSwgU1RCMDg5OV9PRkYwX0NSTF9OT01fRlJFUSwgcmVnKTsKKwkJCXN0YjA4OTlfZHZiczJfcmVhY3F1aXJlKHN0YXRlKTsKKwkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0YXRlLCBzZWFyY2hUaW1lKTsKKwkJCWkrKzsKKwkJfQorCX0KKworCWlmIChpbnRlcm5hbC0+c3RhdHVzICE9IERWQlMyX0ZFQ19MT0NLKSB7CisJCWlmIChpbnRlcm5hbC0+aW52ZXJzaW9uID09IElRX1NXQVBfQVVUTykgeworCQkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgRE1EX0NOVFJMMik7CisJCQlpcVNwZWN0cnVtID0gU1RCMDg5OV9HRVRGSUVMRChTUEVDVFJVTV9JTlZFUlQsIHJlZyk7CisJCQkvKiBJUSBTcGVjdHJ1bSBJbnZlcnNpb24JKi8KKwkJCVNUQjA4OTlfU0VURklFTERfVkFMKFNQRUNUUlVNX0lOVkVSVCwgcmVnLCAhaXFTcGVjdHJ1bSk7CisJCQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9ETURfQ05UUkwyLCBTVEIwODk5X09GRjBfRE1EX0NOVFJMMiwgcmVnKTsKKwkJCS8qIHN0YXJ0IGFjcXVpc3Rpb24gcHJvY2VzcwkqLworCQkJc3RiMDg5OV9kdmJzMl9yZWFjcXVpcmUoc3RhdGUpOworCisJCQkvKiBXYWl0IGZvciBkZW1vZCBsb2NrIChVV1AgYW5kIENTTSkJKi8KKwkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9kbWRfc3RhdHVzKHN0YXRlLCBzZWFyY2hUaW1lKTsKKwkJCWlmIChpbnRlcm5hbC0+c3RhdHVzID09IERWQlMyX0RFTU9EX0xPQ0spIHsKKwkJCQlpID0gMDsKKwkJCQkvKiBEZW1vZCBMb2NrZWQsIGNoZWNrIEZFQwkqLworCQkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0YXRlLCBGZWNMb2NrVGltZSk7CisJCQkJLyp0cnkgdGhyaWNlIGZvciBmYWxzZSBsb2NrcywgKFVXUCBhbmQgQ1NNIExvY2tlZCBidXQgbm8gRkVDKQkqLworCQkJCXdoaWxlICgoaW50ZXJuYWwtPnN0YXR1cyAhPSBEVkJTMl9GRUNfTE9DSykgJiYgKGkgPCAzKSkgeworCQkJCQkvKglSZWFkIHRoZSBmcmVxdWVuY3kgb2Zmc2V0Ki8KKwkJCQkJb2Zmc2V0ZnJlcSA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIENSTF9GUkVRKTsKKworCQkJCQkvKiBTZXQgdGhlIE5vbWluYWwgZnJlcXVlbmN5IHRvIHRoZSBmb3VuZCBmcmVxdWVuY3kgb2Zmc2V0IGZvciB0aGUgbmV4dCByZWFjcXVpcmUqLworCQkJCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDUkxfTk9NX0ZSRVEpOworCQkJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDUkxfTk9NX0ZSRVEsIHJlZywgb2Zmc2V0ZnJlcSk7CisJCQkJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NSTF9OT01fRlJFUSwgU1RCMDg5OV9PRkYwX0NSTF9OT01fRlJFUSwgcmVnKTsKKworCQkJCQlzdGIwODk5X2R2YnMyX3JlYWNxdWlyZShzdGF0ZSk7CisJCQkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0YXRlLCBzZWFyY2hUaW1lKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKy8qCisJCQlpZiAocFBhcmFtcy0+RFZCUzJTdGF0ZSA9PSBGRV9EVkJTMl9GRUNfTE9DS0VEKQorCQkJCXBQYXJhbXMtPklRTG9ja2VkID0gIWlxU3BlY3RydW07CisqLworCQl9CisJfQorCWlmIChpbnRlcm5hbC0+c3RhdHVzID09IERWQlMyX0ZFQ19MT0NLKSB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiLS0tLS0tLS0tLS0tLS0tLT4gRFZCLVMyIEZFQyBMb2NrICEiKTsKKwkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgVVdQX1NUQVQyKTsKKwkJbW9kY29kID0gU1RCMDg5OV9HRVRGSUVMRChVV1BfREVDT0RFX01PRCwgcmVnKSA+PiAyOworCQlwaWxvdHMgPSBTVEIwODk5X0dFVEZJRUxEKFVXUF9ERUNPREVfTU9ELCByZWcpICYgMHgwMTsKKworCQlpZiAoKCgoMTAgKiBpbnRlcm5hbC0+bWFzdGVyX2NsaykgLyAoaW50ZXJuYWwtPnNyYXRlIC8gMTApKSA8PSA0MTApICYmCisJCSAgICAgIChJTlJBTkdFKFNUQjA4OTlfUVBTS18yMywgbW9kY29kLCBTVEIwODk5X1FQU0tfOTEwKSkgJiYKKwkJICAgICAgKHBpbG90cyA9PSAxKSkgeworCisJCQlzdGIwODk5X2R2YnMyX2luaXRfY3NtKHN0YXRlLCBwaWxvdHMsIG1vZGNvZCk7CisJCQkvKiBXYWl0IGZvciBVV1AsQ1NNIGFuZCBkYXRhIExPQ0sgMjBtcyBtYXgJKi8KKwkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0YXRlLCBGZWNMb2NrVGltZSk7CisKKwkJCWkgPSAwOworCQkJd2hpbGUgKChpbnRlcm5hbC0+c3RhdHVzICE9IERWQlMyX0ZFQ19MT0NLKSAmJiAoaSA8IDMpKSB7CisJCQkJY3NtMSA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIENTTV9DTlRSTDEpOworCQkJCVNUQjA4OTlfU0VURklFTERfVkFMKENTTV9UV09fUEFTUywgY3NtMSwgMSk7CisJCQkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMSwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEsIGNzbTEpOworCQkJCWNzbTEgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDU01fQ05UUkwxKTsKKwkJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChDU01fVFdPX1BBU1MsIGNzbTEsIDApOworCQkJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDEsIFNUQjA4OTlfT0ZGMF9DU01fQ05UUkwxLCBjc20xKTsKKworCQkJCWludGVybmFsLT5zdGF0dXMgPSBzdGIwODk5X2R2YnMyX2dldF9mZWNfc3RhdHVzKHN0YXRlLCBGZWNMb2NrVGltZSk7CisJCQkJaSsrOworCQkJfQorCQl9CisKKwkJaWYgKCgoKDEwICogaW50ZXJuYWwtPm1hc3Rlcl9jbGspIC8gKGludGVybmFsLT5zcmF0ZSAvIDEwKSkgPD0gNDEwKSAmJgorCQkgICAgICAoSU5SQU5HRShTVEIwODk5X1FQU0tfMTIsIG1vZGNvZCwgU1RCMDg5OV9RUFNLXzM1KSkgJiYKKwkJICAgICAgKHBpbG90cyA9PSAxKSkgeworCisJCQkvKiBFcXVhbGl6ZXIgRGlzYWJsZSB1cGRhdGUJICovCisJCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBFUV9DTlRSTCk7CisJCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChFUV9ESVNBQkxFX1VQREFURSwgcmVnLCAxKTsKKwkJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0VRX0NOVFJMLCBTVEIwODk5X09GRjBfRVFfQ05UUkwsIHJlZyk7CisJCX0KKworCQkvKiBzbG93IGRvd24gdGhlIEVxdWFsaXplciBvbmNlIGxvY2tlZAkqLworCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBFUV9DTlRSTCk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEVRX1NISUZULCByZWcsIDB4MDIpOworCQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9FUV9DTlRSTCwgU1RCMDg5OV9PRkYwX0VRX0NOVFJMLCByZWcpOworCisJCS8qIFN0b3JlIHNpZ25hbCBwYXJhbWV0ZXJzCSovCisJCW9mZnNldGZyZXEgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBDUkxfRlJFUSk7CisKKwkJb2Zmc2V0ZnJlcSA9IG9mZnNldGZyZXEgLyAoKDEgPDwgMzApIC8gMTAwMCk7CisJCW9mZnNldGZyZXEgKj0gKGludGVybmFsLT5tYXN0ZXJfY2xrIC8gMTAwMDAwMCk7CisJCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIERNRF9DTlRSTDIpOworCQlpZiAoU1RCMDg5OV9HRVRGSUVMRChTUEVDVFJVTV9JTlZFUlQsIHJlZykpCisJCQlvZmZzZXRmcmVxICo9IC0xOworCisJCWludGVybmFsLT5mcmVxID0gaW50ZXJuYWwtPmZyZXEgLSBvZmZzZXRmcmVxOworCQlpbnRlcm5hbC0+c3JhdGUgPSBzdGIwODk5X2R2YnMyX2dldF9zcmF0ZShzdGF0ZSk7CisKKwkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgVVdQX1NUQVQyKTsKKwkJaW50ZXJuYWwtPm1vZGNvZCA9IFNUQjA4OTlfR0VURklFTEQoVVdQX0RFQ09ERV9NT0QsIHJlZykgPj4gMjsKKwkJaW50ZXJuYWwtPnBpbG90cyA9IFNUQjA4OTlfR0VURklFTEQoVVdQX0RFQ09ERV9NT0QsIHJlZykgJiAweDAxOworCQlpbnRlcm5hbC0+ZnJhbWVfbGVuZ3RoID0gKFNUQjA4OTlfR0VURklFTEQoVVdQX0RFQ09ERV9NT0QsIHJlZykgPj4gMSkgJiAweDAxOworCisJCSAvKiBTZXQgSUYgQUdDIHRvIHRyYWNraW5nCSovCisJCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIElGX0FHQ19DTlRSTCk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKElGX0xPT1BfR0FJTiwgcmVnLCAgMyk7CisKKwkJLyogaWYgUVBTSyAxLzIsUVBTSyAzLzUgb3IgUVBTSyAyLzMgc2V0IElGIEFHQyByZWZlcmVuY2UgdG8gMTYgb3RoZXJ3aXNlIDMyKi8KKwkJaWYgKElOUkFOR0UoU1RCMDg5OV9RUFNLXzEyLCBpbnRlcm5hbC0+bW9kY29kLCBTVEIwODk5X1FQU0tfMjMpKQorCQkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoSUZfQUdDX1JFRiwgcmVnLCAxNik7CisKKwkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfSUZfQUdDX0NOVFJMLCBTVEIwODk5X09GRjBfSUZfQUdDX0NOVFJMLCByZWcpOworCisJCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIElGX0FHQ19DTlRSTDIpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChJRl9BR0NfRFVNUF9QRVIsIHJlZywgNyk7CisJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwgU1RCMDg5OV9CQVNFX0lGX0FHQ19DTlRSTDIsIFNUQjA4OTlfT0ZGMF9JRl9BR0NfQ05UUkwyLCByZWcpOworCX0KKworCS8qIFJlbGVhc2UgU3RyZWFtIE1lcmdlciBSZXNldAkJKi8KKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUyk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRlJFU1JTLCByZWcsIDApOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUywgcmVnKTsKKworCXJldHVybiBpbnRlcm5hbC0+c3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfY2ZnLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY3OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfY2ZnLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qCisJU1RCMDg5OSBNdWx0aXN0YW5kYXJkIEZyb250ZW5kIGRyaXZlcgorCUNvcHlyaWdodCAoQykgTWFudSBBYnJhaGFtIChhYnJhaGFtLm1hbnVAZ21haWwuY29tKQorCisJQ29weXJpZ2h0IChDKSBTVCBNaWNyb2VsZWN0cm9uaWNzCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX19TVEIwODk5X0NGR19ICisjZGVmaW5lIF9fU1RCMDg5OV9DRkdfSAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczJfcmVnICBzdGIwODk5X3MyX2luaXRfMltdID0geworCisJeyBTVEIwODk5X09GRjBfRE1EX1NUQVRVUwksIFNUQjA4OTlfQkFTRV9ETURfU1RBVFVTCSwgMHgwMDAwMDEwMyB9LAkvKiBETURTVEFUVVMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9DUkxfRlJFUQkJLCBTVEIwODk5X0JBU0VfQ1JMX0ZSRVEJCSwgMHgzZWQxZGE1NiB9LAkvKiBDUkxGUkVRCSovCisJeyBTVEIwODk5X09GRjBfQlRSX0ZSRVEJCSwgU1RCMDg5OV9CQVNFX0JUUl9GUkVRCQksIDB4MDAwMDQwMDAgfSwJLyogQlRSRlJFUQkqLworCXsgU1RCMDg5OV9PRkYwX0lGX0FHQ19HQUlOCSwgU1RCMDg5OV9CQVNFX0lGX0FHQ19HQUlOCSwgMHgwMDAwMmFkZSB9LAkvKiBJRkFHQ0dBSU4JKi8KKwl7IFNUQjA4OTlfT0ZGMF9CQl9BR0NfR0FJTgksIFNUQjA4OTlfQkFTRV9CQl9BR0NfR0FJTgksIDB4MDAwMDAxYmMgfSwJLyogQkJBR0NHQUlOCSovCisJeyBTVEIwODk5X09GRjBfRENfT0ZGU0VUCSwgU1RCMDg5OV9CQVNFX0RDX09GRlNFVAksIDB4MDAwMDAyMDAgfSwJLyogRENPRkZTRVQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9ETURfQ05UUkwJLCBTVEIwODk5X0JBU0VfRE1EX0NOVFJMCSwgMHgwMDAwMDAwZiB9LAkvKiBETURDTlRSTAkqLworCisJeyBTVEIwODk5X09GRjBfSUZfQUdDX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0lGX0FHQ19DTlRSTAksIDB4MDNmYjRhMjAgfSwJLyogSUZBR0NDTlRSTAkqLworCXsgU1RCMDg5OV9PRkYwX0JCX0FHQ19DTlRSTAksIFNUQjA4OTlfQkFTRV9CQl9BR0NfQ05UUkwJLCAweDAwMjAwYzk3IH0sCS8qIEJCQUdDQ05UUkwJKi8KKworCXsgU1RCMDg5OV9PRkYwX0NSTF9DTlRSTAksIFNUQjA4OTlfQkFTRV9DUkxfQ05UUkwJLCAweDAwMDAwMDE2IH0sCS8qIENSTENOVFJMCSovCisJeyBTVEIwODk5X09GRjBfQ1JMX1BIU19JTklUCSwgU1RCMDg5OV9CQVNFX0NSTF9QSFNfSU5JVAksIDB4MDAwMDAwMDAgfSwJLyogQ1JMUEhTSU5JVAkqLworCXsgU1RCMDg5OV9PRkYwX0NSTF9GUkVRX0lOSVQJLCBTVEIwODk5X0JBU0VfQ1JMX0ZSRVFfSU5JVAksIDB4MDAwMDAwMDAgfSwJLyogQ1JMRlJFUUlOSVQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9DUkxfTE9PUF9HQUlOCSwgU1RCMDg5OV9CQVNFX0NSTF9MT09QX0dBSU4JLCAweDAwMDAwMDAwIH0sCS8qIENSTExPT1BHQUlOCSovCisJeyBTVEIwODk5X09GRjBfQ1JMX05PTV9GUkVRCSwgU1RCMDg5OV9CQVNFX0NSTF9OT01fRlJFUQksIDB4M2VkMDk3YjYgfSwJLyogQ1JMTk9NRlJFUQkqLworCXsgU1RCMDg5OV9PRkYwX0NSTF9TV1BfUkFURQksIFNUQjA4OTlfQkFTRV9DUkxfU1dQX1JBVEUJLCAweDAwMDAwMDAwIH0sCS8qIENSTFNXUFJBVEUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9DUkxfTUFYX1NXUAksIFNUQjA4OTlfQkFTRV9DUkxfTUFYX1NXUAksIDB4MDAwMDAwMDAgfSwJLyogQ1JMTUFYU1dQCSovCisJeyBTVEIwODk5X09GRjBfQ1JMX0xLX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0NSTF9MS19DTlRSTAksIDB4MGY2Y2RjMDEgfSwJLyogQ1JMTEtDTlRSTAkqLworCXsgU1RCMDg5OV9PRkYwX0RFQ0lNX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0RFQ0lNX0NOVFJMCSwgMHgwMDAwMDAwMCB9LAkvKiBERUNJTUNOVFJMCSovCisJeyBTVEIwODk5X09GRjBfQlRSX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0JUUl9DTlRSTAksIDB4MDAwMDM5OTMgfSwJLyogQlRSQ05UUkwJKi8KKwl7IFNUQjA4OTlfT0ZGMF9CVFJfTE9PUF9HQUlOCSwgU1RCMDg5OV9CQVNFX0JUUl9MT09QX0dBSU4JLCAweDAwMGQzYzZmIH0sCS8qIEJUUkxPT1BHQUlOCSovCisJeyBTVEIwODk5X09GRjBfQlRSX1BIU19JTklUCSwgU1RCMDg5OV9CQVNFX0JUUl9QSFNfSU5JVAksIDB4MDAwMDAwMDAgfSwJLyogQlRSUEhTSU5JVAkqLworCXsgU1RCMDg5OV9PRkYwX0JUUl9GUkVRX0lOSVQJLCBTVEIwODk5X0JBU0VfQlRSX0ZSRVFfSU5JVAksIDB4MDAwMDAwMDAgfSwJLyogQlRSRlJFUUlOSVQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9CVFJfTk9NX0ZSRVEJLCBTVEIwODk5X0JBU0VfQlRSX05PTV9GUkVRCSwgMHgwMjM4ZTM4ZSB9LAkvKiBCVFJOT01GUkVRCSovCisJeyBTVEIwODk5X09GRjBfQlRSX0xLX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0JUUl9MS19DTlRSTAksIDB4MDAwMDAwMDAgfSwJLyogQlRSTEtDTlRSTAkqLworCXsgU1RCMDg5OV9PRkYwX0RFQ05fQ05UUkwJLCBTVEIwODk5X0JBU0VfREVDTl9DTlRSTAksIDB4MDAwMDAwMDAgfSwJLyogREVDTkNOVFJMCSovCisJeyBTVEIwODk5X09GRjBfVFBfQ05UUkwJCSwgU1RCMDg5OV9CQVNFX1RQX0NOVFJMCQksIDB4MDAwMDAwMDAgfSwJLyogVFBDTlRSTAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRl9TVEFUVVMJLCBTVEIwODk5X0JBU0VfVFBfQlVGX1NUQVRVUwksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZTVEFUVVMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9EQ19FU1RJTQkJLCBTVEIwODk5X0JBU0VfRENfRVNUSU0JCSwgMHgwMDAwMDAwMCB9LAkvKiBEQ0VTVElNCSovCisJeyBTVEIwODk5X09GRjBfRkxMX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0ZMTF9DTlRSTAksIDB4MDAwMDAwMDAgfSwJLyogRkxMQ05UUkwJKi8KKwl7IFNUQjA4OTlfT0ZGMF9GTExfRlJFUV9XRAksIFNUQjA4OTlfQkFTRV9GTExfRlJFUV9XRAksIDB4NDAwNzAwMDAgfSwJLyogRkxMRlJFUVdECSovCisJeyBTVEIwODk5X09GRjBfQU5USV9BTElBU19TRUwJLCBTVEIwODk5X0JBU0VfQU5USV9BTElBU19TRUwJLCAweDAwMDAwMDAxIH0sCS8qIEFOVElBTElBU1NFTCAqLworCXsgU1RCMDg5OV9PRkYwX1JSQ19BTFBIQQksIFNUQjA4OTlfQkFTRV9SUkNfQUxQSEEJLCAweDAwMDAwMDAyIH0sCS8qIFJSQ0FMUEhBCSovCisJeyBTVEIwODk5X09GRjBfRENfQURBUFRfTFNIRlQJLCBTVEIwODk5X0JBU0VfRENfQURBUFRfTFNIRlQJLCAweDAwMDAwMDAwIH0sCS8qIERDQURBUFRJU0hGVCAqLworCXsgU1RCMDg5OV9PRkYwX0lNQl9PRkZTRVQJLCBTVEIwODk5X0JBU0VfSU1CX09GRlNFVAksIDB4MDAwMGZlMDEgfSwJLyogSU1CT0ZGU0VUCSovCisJeyBTVEIwODk5X09GRjBfSU1CX0VTVElNQVRFCSwgU1RCMDg5OV9CQVNFX0lNQl9FU1RJTUFURQksIDB4MDAwMDAwMDAgfSwJLyogSU1CRVNUSU1BVEUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9JTUJfQ05UUkwJLCBTVEIwODk5X0JBU0VfSU1CX0NOVFJMCSwgMHgwMDAwMDAwMSB9LAkvKiBJTUJDTlRSTAkqLworCXsgU1RCMDg5OV9PRkYwX0lGX0FHQ19DTlRSTDIJLCBTVEIwODk5X0JBU0VfSUZfQUdDX0NOVFJMMgksIDB4MDAwMDUwMDcgfSwJLyogSUZBR0NDTlRSTDIJKi8KKwl7IFNUQjA4OTlfT0ZGMF9ETURfQ05UUkwyCSwgU1RCMDg5OV9CQVNFX0RNRF9DTlRSTDIJLCAweDAwMDAwMDAyIH0sCS8qIERNRENOVFJMMgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUgksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxCSwgMHgwMDAwMDAwMCB9LAkvKiBUUEJVRkZFUjEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjIJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSMgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMwksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZGRVIzCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0CSwgMHgwMDAwMDAwMCB9LAkvKiBUUEJVRkZFUjQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjUJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSNQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNgksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZGRVI2CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNwksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI3CSwgMHgwMDAwMDAwMCB9LAkvKiBUUEJVRkZFUjcJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI4CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjgJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSOAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjkJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSOQksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZGRVI5CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTAJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTAJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSMTAJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxMQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxMQksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZGRVIxMQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjEyCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjEyCSwgMHgwMDAwMDAwMCB9LAkvKiBUUEJVRkZFUjEyCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTMJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTMJLCAweDAwMDAwMDAwIH0sCS8qIFRQQlVGRkVSMTMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxNAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxNAksIDB4MDAwMDAwMDAgfSwJLyogVFBCVUZGRVIxNAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjE1CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjE1CSwgMHgwMDAwMDAwMCB9LAkvKiBUUEJVRkZFUjE1CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTYJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTYJLCAweDAwMDBmZjAwIH0sCS8qIFRQQlVGRkVSMTYJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxNwksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxNwksIDB4MDAwMDAxMDAgfSwJLyogVFBCVUZGRVIxNwkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjE4CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjE4CSwgMHgwMDAwZmUwMSB9LAkvKiBUUEJVRkZFUjE4CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTkJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTkJLCAweDAwMDAwNGZlIH0sCS8qIFRQQlVGRkVSMTkJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyMAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyMAksIDB4MDAwMGNmZTcgfSwJLyogVFBCVUZGRVIyMAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjIxCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjIxCSwgMHgwMDAwYmVjNiB9LAkvKiBUUEJVRkZFUjIxCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjIJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjIJLCAweDAwMDBjMmJmIH0sCS8qIFRQQlVGRkVSMjIJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyMwksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyMwksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVIyMwkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjI0CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjI0CSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjI0CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjUJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjUJLCAweDAwMDBjMWMxIH0sCS8qIFRQQlVGRkVSMjUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyNgksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyNgksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVIyNgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjI3CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjI3CSwgMHgwMDAwYzFjMCB9LAkvKiBUUEJVRkZFUjI3CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjgJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjgJLCAweDAwMDBjMGMwIH0sCS8qIFRQQlVGRkVSMjgJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyOQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyOQksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVIyOQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMwCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjMwCSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjMwCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzEJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzEJLCAweDAwMDBjMGMxIH0sCS8qIFRQQlVGRkVSMzEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzMgksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzMgksIDB4MDAwMGMwYzEgfSwJLyogVFBCVUZGRVIzMgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMzCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjMzCSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjMzCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzQJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzQJLCAweDAwMDBjMWMxIH0sCS8qIFRQQlVGRkVSMzQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzNQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzNQksIDB4MDAwMGMwYzEgfSwJLyogVFBCVUZGRVIzNQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjM2CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjM2CSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjM2CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzcJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzcJLCAweDAwMDBjMGMxIH0sCS8qIFRQQlVGRkVSMzcJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzOAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzOAksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVIzOAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjM5CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjM5CSwgMHgwMDAwYzBjMCB9LAkvKiBUUEJVRkZFUjM5CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDAJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDAJLCAweDAwMDBjMWMwIH0sCS8qIFRQQlVGRkVSNDAJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0MQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0MQksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVI0MQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQyCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQyCSwgMHgwMDAwYzBjMCB9LAkvKiBUUEJVRkZFUjQyCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDMJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDMJLCAweDAwMDBjMWMwIH0sCS8qIFRQQlVGRkVSNDMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0NAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0NAksIDB4MDAwMGMwYzEgfSwJLyogVFBCVUZGRVI0NAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQ1CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQ1CSwgMHgwMDAwYzFiZSB9LAkvKiBUUEJVRkZFUjQ1CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDYJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDYJLCAweDAwMDBjMWM5IH0sCS8qIFRQQlVGRkVSNDYJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0NwksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0NwksIDB4MDAwMGMwZGEgfSwJLyogVFBCVUZGRVI0NwkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQ4CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQ4CSwgMHgwMDAwYzBiYSB9LAkvKiBUUEJVRkZFUjQ4CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDkJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDkJLCAweDAwMDBjMWM0IH0sCS8qIFRQQlVGRkVSNDkJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1MAksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1MAksIDB4MDAwMGMxYmYgfSwJLyogVFBCVUZGRVI1MAkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjUxCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjUxCSwgMHgwMDAwYzBjMSB9LAkvKiBUUEJVRkZFUjUxCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTIJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTIJLCAweDAwMDBjMWMwIH0sCS8qIFRQQlVGRkVSNTIJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1MwksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1MwksIDB4MDAwMGMwYzEgfSwJLyogVFBCVUZGRVI1MwkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjU0CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjU0CSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjU0CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTUJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTUJLCAweDAwMDBjMWMxIH0sCS8qIFRQQlVGRkVSNTUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1NgksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1NgksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVI1NgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjU3CSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjU3CSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjU3CSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTgJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTgJLCAweDAwMDBjMWMxIH0sCS8qIFRQQlVGRkVSNTgJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1OQksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1OQksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVI1OQkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYwCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjYwCSwgMHgwMDAwYzFjMSB9LAkvKiBUUEJVRkZFUjYwCSovCisJeyBTVEIwODk5X09GRjBfVFBfQlVGRkVSNjEJLCBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNjEJLCAweDAwMDBjMWMxIH0sCS8qIFRQQlVGRkVSNjEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI2MgksIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI2MgksIDB4MDAwMGMxYzEgfSwJLyogVFBCVUZGRVI2MgkqLworCXsgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYzCSwgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjYzCSwgMHgwMDAwYzFjMCB9LAkvKiBUUEJVRkZFUjYzCSovCisJeyBTVEIwODk5X09GRjBfUkVTRVRfQ05UUkwJLCBTVEIwODk5X0JBU0VfUkVTRVRfQ05UUkwJLCAweDAwMDAwMDAxIH0sCS8qIFJFU0VUQ05UUkwJKi8KKwl7IFNUQjA4OTlfT0ZGMF9BQ01fRU5BQkxFCSwgU1RCMDg5OV9CQVNFX0FDTV9FTkFCTEUJLCAweDAwMDA1NjU0IH0sCS8qIEFDTUVOQUJMRQkqLworCXsgU1RCMDg5OV9PRkYwX0RFU0NSX0NOVFJMCSwgU1RCMDg5OV9CQVNFX0RFU0NSX0NOVFJMCSwgMHgwMDAwMDAwMCB9LAkvKiBERVNDUkNOVFJMCSovCisJeyBTVEIwODk5X09GRjBfQ1NNX0NOVFJMMQksIFNUQjA4OTlfQkFTRV9DU01fQ05UUkwxCSwgMHgwMDAyMDAxOSB9LAkvKiBDU01DTlRSTDEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9DU01fQ05UUkwyCSwgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDIJLCAweDAwNGIzMjM3IH0sCS8qIENTTUNOVFJMMgkqLworCXsgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDMJLCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMwksIDB4MDAwM2RkMTcgfSwJLyogQ1NNQ05UUkwzCSovCisJeyBTVEIwODk5X09GRjBfQ1NNX0NOVFJMNAksIFNUQjA4OTlfQkFTRV9DU01fQ05UUkw0CSwgMHgwMDAwODAwOCB9LAkvKiBDU01DTlRSTDQJKi8KKwl7IFNUQjA4OTlfT0ZGMF9VV1BfQ05UUkwxCSwgU1RCMDg5OV9CQVNFX1VXUF9DTlRSTDEJLCAweDAwMmEzMTA2IH0sCS8qIFVXUENOVFJMMQkqLworCXsgU1RCMDg5OV9PRkYwX1VXUF9DTlRSTDIJLCBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMgksIDB4MDAwNjE0MGEgfSwJLyogVVdQQ05UUkwyCSovCisJeyBTVEIwODk5X09GRjBfVVdQX1NUQVQxCSwgU1RCMDg5OV9CQVNFX1VXUF9TVEFUMQksIDB4MDAwMDgwMDAgfSwJLyogVVdQU1RBVDEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9VV1BfU1RBVDIJLCBTVEIwODk5X0JBU0VfVVdQX1NUQVQyCSwgMHgwMDAwMDAwMCB9LAkvKiBVV1BTVEFUMgkqLworCXsgU1RCMDg5OV9PRkYwX0RNRF9TVEFUMgksIFNUQjA4OTlfQkFTRV9ETURfU1RBVDIJLCAweDAwMDAwMDAwIH0sCS8qIERNRFNUQVQyCSovCisJeyBTVEIwODk5X09GRjBfRlJFUV9BREpfU0NBTEUJLCBTVEIwODk5X0JBU0VfRlJFUV9BREpfU0NBTEUJLCAweDAwMDAwNDcxIH0sCS8qIEZSRVFBREpTQ0FMRSAqLworCXsgU1RCMDg5OV9PRkYwX1VXUF9DTlRSTDMJLCBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMwksIDB4MDE3YjA0NjUgfSwJLyogVVdQQ05UUkwzCSovCisJeyBTVEIwODk5X09GRjBfU1lNX0NMS19TRUwJLCBTVEIwODk5X0JBU0VfU1lNX0NMS19TRUwJLCAweDAwMDAwMDAyIH0sCS8qIFNZTUNMS1NFTAkqLworCXsgU1RCMDg5OV9PRkYwX1NPRl9TUkNIX1RPCSwgU1RCMDg5OV9CQVNFX1NPRl9TUkNIX1RPCSwgMHgwMDE5NjQ2NCB9LAkvKiBTT0ZTUkNIVE8JKi8KKwl7IFNUQjA4OTlfT0ZGMF9BQ1FfQ05UUkwxCSwgU1RCMDg5OV9CQVNFX0FDUV9DTlRSTDEJLCAweDAwMDAwNjAzIH0sCS8qIEFDUUNOVFJMMQkqLworCXsgU1RCMDg5OV9PRkYwX0FDUV9DTlRSTDIJLCBTVEIwODk5X0JBU0VfQUNRX0NOVFJMMgksIDB4MDIwNDY2NjYgfSwJLyogQUNRQ05UUkwyCSovCisJeyBTVEIwODk5X09GRjBfQUNRX0NOVFJMMwksIFNUQjA4OTlfQkFTRV9BQ1FfQ05UUkwzCSwgMHgxMDA0NjU4MyB9LAkvKiBBQ1FDTlRSTDMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9GRV9TRVRUTEUJLCBTVEIwODk5X0JBU0VfRkVfU0VUVExFCSwgMHgwMDAxMDQwNCB9LAkvKiBGRVNFVFRMRQkqLworCXsgU1RCMDg5OV9PRkYwX0FDX0RXRUxMCQksIFNUQjA4OTlfQkFTRV9BQ19EV0VMTAkJLCAweDAwMDJhYThhIH0sCS8qIEFDRFdFTEwJKi8KKwl7IFNUQjA4OTlfT0ZGMF9BQ1FVSVJFX1RSSUcJLCBTVEIwODk5X0JBU0VfQUNRVUlSRV9UUklHCSwgMHgwMDAwMDAwMCB9LAkvKiBBQ1FVSVJFVFJJRwkqLworCXsgU1RCMDg5OV9PRkYwX0xPQ0tfTE9TVAksIFNUQjA4OTlfQkFTRV9MT0NLX0xPU1QJLCAweDAwMDAwMDAxIH0sCS8qIExPQ0tMT1NUCSovCisJeyBTVEIwODk5X09GRjBfQUNRX1NUQVQxCSwgU1RCMDg5OV9CQVNFX0FDUV9TVEFUMQksIDB4MDAwMDA1MDAgfSwJLyogQUNRU1RBVDEJKi8KKwl7IFNUQjA4OTlfT0ZGMF9BQ1FfVElNRU9VVAksIFNUQjA4OTlfQkFTRV9BQ1FfVElNRU9VVAksIDB4MDAyOGEwYTAgfSwJLyogQUNRVElNRU9VVAkqLworCXsgU1RCMDg5OV9PRkYwX0FDUV9USU1FCQksIFNUQjA4OTlfQkFTRV9BQ1FfVElNRQkJLCAweDAwMDAwMDAwIH0sCS8qIEFDUVRJTUUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9GSU5BTF9BR0NfQ05UUkwJLCBTVEIwODk5X0JBU0VfRklOQUxfQUdDX0NOVFJMCSwgMHgwMDgwMGMxNyB9LAkvKiBGSU5BTEFHQ0NOVFJMKi8KKwl7IFNUQjA4OTlfT0ZGMF9GSU5BTF9BR0NfR0FJTgksIFNUQjA4OTlfQkFTRV9GSU5BTF9BR0NfR0FJTgksIDB4MDAwMDAwMDAgfSwJLyogRklOQUxBR0NDR0FJTiovCisJeyBTVEIwODk5X09GRjBfRVFVQUxJWkVSX0lOSVQJLCBTVEIwODk5X0JBU0VfRVFVQUxJWkVSX0lOSVQJLCAweDAwMDAwMDAwIH0sCS8qIEVRVUlMSVpFUklOSVQqLworCXsgU1RCMDg5OV9PRkYwX0VRX0NOVFJMCQksIFNUQjA4OTlfQkFTRV9FUV9DTlRSTAkJLCAweDAwMDU0ODAyIH0sCS8qIEVRQ05UTAkqLworCXsgU1RCMDg5OV9PRkYwX0VRX0lfSU5JVF9DT0VGRl8wLCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGMCAqLworCXsgU1RCMDg5OV9PRkYxX0VRX0lfSU5JVF9DT0VGRl8xLCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGMSAqLworCXsgU1RCMDg5OV9PRkYyX0VRX0lfSU5JVF9DT0VGRl8yLCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGMiAqLworCXsgU1RCMDg5OV9PRkYzX0VRX0lfSU5JVF9DT0VGRl8zLCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGMyAqLworCXsgU1RCMDg5OV9PRkY0X0VRX0lfSU5JVF9DT0VGRl80LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGNCAqLworCXsgU1RCMDg5OV9PRkY1X0VRX0lfSU5JVF9DT0VGRl81LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDA0MDAgfSwJLyogRVFJSU5JVENPRUZGNSAqLworCXsgU1RCMDg5OV9PRkY2X0VRX0lfSU5JVF9DT0VGRl82LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGNiAqLworCXsgU1RCMDg5OV9PRkY3X0VRX0lfSU5JVF9DT0VGRl83LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGNyAqLworCXsgU1RCMDg5OV9PRkY4X0VRX0lfSU5JVF9DT0VGRl84LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGOCAqLworCXsgU1RCMDg5OV9PRkY5X0VRX0lfSU5JVF9DT0VGRl85LCBTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGOSAqLworCXsgU1RCMDg5OV9PRkZhX0VRX0lfSU5JVF9DT0VGRl8xMCxTVEIwODk5X0JBU0VfRVFfSV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFJSU5JVENPRUZGMTAqLworCXsgU1RCMDg5OV9PRkYwX0VRX1FfSU5JVF9DT0VGRl8wLCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGMCAqLworCXsgU1RCMDg5OV9PRkYxX0VRX1FfSU5JVF9DT0VGRl8xLCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGMSAqLworCXsgU1RCMDg5OV9PRkYyX0VRX1FfSU5JVF9DT0VGRl8yLCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGMiAqLworCXsgU1RCMDg5OV9PRkYzX0VRX1FfSU5JVF9DT0VGRl8zLCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGMyAqLworCXsgU1RCMDg5OV9PRkY0X0VRX1FfSU5JVF9DT0VGRl80LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGNCAqLworCXsgU1RCMDg5OV9PRkY1X0VRX1FfSU5JVF9DT0VGRl81LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGNSAqLworCXsgU1RCMDg5OV9PRkY2X0VRX1FfSU5JVF9DT0VGRl82LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGNiAqLworCXsgU1RCMDg5OV9PRkY3X0VRX1FfSU5JVF9DT0VGRl83LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGNyAqLworCXsgU1RCMDg5OV9PRkY4X0VRX1FfSU5JVF9DT0VGRl84LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGOCAqLworCXsgU1RCMDg5OV9PRkY5X0VRX1FfSU5JVF9DT0VGRl85LCBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGOSAqLworCXsgU1RCMDg5OV9PRkZhX0VRX1FfSU5JVF9DT0VGRl8xMCxTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04sIDB4MDAwMDAwMDAgfSwJLyogRVFRSU5JVENPRUZGMTAqLworCXsgU1RCMDg5OV9PRkYwX0VRX0lfT1VUX0NPRUZGXzAJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUMCAqLworCXsgU1RCMDg5OV9PRkYxX0VRX0lfT1VUX0NPRUZGXzEJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUMSAqLworCXsgU1RCMDg5OV9PRkYyX0VRX0lfT1VUX0NPRUZGXzIJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUMiAqLworCXsgU1RCMDg5OV9PRkYzX0VRX0lfT1VUX0NPRUZGXzMJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUMyAqLworCXsgU1RCMDg5OV9PRkY0X0VRX0lfT1VUX0NPRUZGXzQJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUNCAqLworCXsgU1RCMDg5OV9PRkY1X0VRX0lfT1VUX0NPRUZGXzUJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUNSAqLworCXsgU1RCMDg5OV9PRkY2X0VRX0lfT1VUX0NPRUZGXzYJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUNiAqLworCXsgU1RCMDg5OV9PRkY3X0VRX0lfT1VUX0NPRUZGXzcJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUNyAqLworCXsgU1RCMDg5OV9PRkY4X0VRX0lfT1VUX0NPRUZGXzgJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUOCAqLworCXsgU1RCMDg5OV9PRkY5X0VRX0lfT1VUX0NPRUZGXzkJLCBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgksIDB4MDAwMDAwMDAgfSwgLyogRVFJQ09FRkZTT1VUOSAqLworCXsgU1RCMDg5OV9PRkZhX0VRX0lfT1VUX0NPRUZGXzEwLFNUQjA4OTlfQkFTRV9FUV9JX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LCAvKiBFUUlDT0VGRlNPVVQxMCovCisJeyBTVEIwODk5X09GRjBfRVFfUV9PVVRfQ09FRkZfMAksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQwICovCisJeyBTVEIwODk5X09GRjFfRVFfUV9PVVRfQ09FRkZfMQksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQxICovCisJeyBTVEIwODk5X09GRjJfRVFfUV9PVVRfQ09FRkZfMgksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQyICovCisJeyBTVEIwODk5X09GRjNfRVFfUV9PVVRfQ09FRkZfMwksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQzICovCisJeyBTVEIwODk5X09GRjRfRVFfUV9PVVRfQ09FRkZfNAksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ0ICovCisJeyBTVEIwODk5X09GRjVfRVFfUV9PVVRfQ09FRkZfNQksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ1ICovCisJeyBTVEIwODk5X09GRjZfRVFfUV9PVVRfQ09FRkZfNiAsIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ2ICovCisJeyBTVEIwODk5X09GRjdfRVFfUV9PVVRfQ09FRkZfNwksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ3ICovCisJeyBTVEIwODk5X09GRjhfRVFfUV9PVVRfQ09FRkZfOAksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ4ICovCisJeyBTVEIwODk5X09GRjlfRVFfUV9PVVRfQ09FRkZfOQksIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQ5ICovCisJeyBTVEIwODk5X09GRmFfRVFfUV9PVVRfQ09FRkZfMTAsIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCSwgMHgwMDAwMDAwMCB9LAkvKiBFUVFDT0VGRlNPVVQxMCovCisJeyAweGZmZmYJCQksIDB4ZmZmZmZmZmYJCQksIDB4ZmZmZmZmZmYgfSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczJfcmVnIHN0YjA4OTlfczJfaW5pdF80W10gPSB7CisJeyBTVEIwODk5X09GRjBfQkxPQ0tfTE5HVEgJLCBTVEIwODk5X0JBU0VfQkxPQ0tfTE5HVEgJLCAweDAwMDAwMDA4IH0sCS8qIEJMT0NLTE5HVEgJKi8KKwl7IFNUQjA4OTlfT0ZGMF9ST1dfU1RSCQksIFNUQjA4OTlfQkFTRV9ST1dfU1RSCQksIDB4MDAwMDAwYjQgfSwJLyogUk9XU1RSCSovCisJeyBTVEIwODk5X09GRjBfQk5fRU5EX0FERFIJLCBTVEIwODk5X0JBU0VfQk5fRU5EX0FERFIJLCAweDAwMDAwNGI1IH0sCS8qIEJOQU5EQUREUgkqLworCXsgU1RCMDg5OV9PRkYwX0NOX0VORF9BRERSCSwgU1RCMDg5OV9CQVNFX0NOX0VORF9BRERSCSwgMHgwMDAwMGI0YiB9LAkvKiBDTkFOREFERFIJKi8KKwl7IFNUQjA4OTlfT0ZGMF9JTkZPX0xFTkdUSAksIFNUQjA4OTlfQkFTRV9JTkZPX0xFTkdUSAksIDB4MDAwMDAwNzggfSwJLyogSU5GT0xFTkdUSAkqLworCXsgU1RCMDg5OV9PRkYwX0JPVF9BRERSCQksIFNUQjA4OTlfQkFTRV9CT1RfQUREUgkJLCAweDAwMDAwMWUwIH0sCS8qIEJPVF9BRERSCSovCisJeyBTVEIwODk5X09GRjBfQkNIX0JMS19MTgksIFNUQjA4OTlfQkFTRV9CQ0hfQkxLX0xOCSwgMHgwMDAwYThjMCB9LAkvKiBCQ0hCTEtMTgkqLworCXsgU1RCMDg5OV9PRkYwX0JDSF9UCQksIFNUQjA4OTlfQkFTRV9CQ0hfVAkJLCAweDAwMDAwMDBjIH0sCS8qIEJDSFQJCSovCisJeyBTVEIwODk5X09GRjBfQ05GR19NT0RFCSwgU1RCMDg5OV9CQVNFX0NORkdfTU9ERQksIDB4MDAwMDAwMDEgfSwJLyogQ05GR01PREUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9MRFBDX1NUQVQJLCBTVEIwODk5X0JBU0VfTERQQ19TVEFUCSwgMHgwMDAwMDAwZCB9LAkvKiBMRFBDU1RBVAkqLworCXsgU1RCMDg5OV9PRkYwX0lURVJfU0NBTEUJLCBTVEIwODk5X0JBU0VfSVRFUl9TQ0FMRQksIDB4MDAwMDAwNDAgfSwJLyogSVRFUlNDQUxFCSovCisJeyBTVEIwODk5X09GRjBfSU5QVVRfTU9ERQksIFNUQjA4OTlfQkFTRV9JTlBVVF9NT0RFCSwgMHgwMDAwMDAwMCB9LAkvKiBJTlBVVE1PREUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9MRFBDREVDUlNUCSwgU1RCMDg5OV9CQVNFX0xEUENERUNSU1QJLCAweDAwMDAwMDAwIH0sCS8qIExEUENERUNSU1QJKi8KKwl7IFNUQjA4OTlfT0ZGMF9DTEtfUEVSX0JZVEVfUlcJLCBTVEIwODk5X0JBU0VfQ0xLX1BFUl9CWVRFX1JXCSwgMHgwMDAwMDAwOCB9LAkvKiBDTEtQRVJCWVRFCSovCisJeyBTVEIwODk5X09GRjBfQkNIX0VSUk9SUwksIFNUQjA4OTlfQkFTRV9CQ0hfRVJST1JTCSwgMHgwMDAwMDAwMCB9LAkvKiBCQ0hFUlJPUlMJKi8KKwl7IFNUQjA4OTlfT0ZGMF9MRFBDX0VSUk9SUwksIFNUQjA4OTlfQkFTRV9MRFBDX0VSUk9SUwksIDB4MDAwMDAwMDAgfSwJLyogTERQQ0VSUk9SUwkqLworCXsgU1RCMDg5OV9PRkYwX0JDSF9NT0RFCQksIFNUQjA4OTlfQkFTRV9CQ0hfTU9ERQkJLCAweDAwMDAwMDAwIH0sCS8qIEJDSE1PREUJKi8KKwl7IFNUQjA4OTlfT0ZGMF9FUlJfQUNDX1BFUgksIFNUQjA4OTlfQkFTRV9FUlJfQUNDX1BFUgksIDB4MDAwMDAwMDggfSwJLyogRVJSQUNDUEVSCSovCisJeyBTVEIwODk5X09GRjBfQkNIX0VSUl9BQ0MJLCBTVEIwODk5X0JBU0VfQkNIX0VSUl9BQ0MJLCAweDAwMDAwMDAwIH0sCS8qIEJDSEVSUkFDQwkqLworCXsgU1RCMDg5OV9PRkYwX0ZFQ19UUF9TRUwJLCBTVEIwODk5X0JBU0VfRkVDX1RQX1NFTAksIDB4MDAwMDAwMDAgfSwJLyogRkVDVFBTRUwJKi8KKwl7IDB4ZmZmZgkJCSwgMHhmZmZmZmZmZgkJCSwgMHhmZmZmZmZmZiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGIwODk5X3MxX3JlZyBzdGIwODk5X3MxX2luaXRfNVtdID0geworCXsgU1RCMDg5OV9UU1RDSwkJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVFJFUwksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUT1VUCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RJTgkJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVFNZUwksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUQ0hJUAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNURlJFRQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUSTJDCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9CSVRTUEVFRE0JLCAweDAwIH0sCisJeyBTVEIwODk5X0JJVFNQRUVETAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVEJVU0JJVAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNURElTCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RESVNSWAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUSkVUT04JLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVERDQURKCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RBR0MxCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RBR0MxTgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUUE9MWVBICSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RSCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUQUdDMgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUQ1RMMQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUQ1RMMgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUQ1RMMwksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUREVNQVAJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVERFTUFQMgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUREVNTU9OCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RSQVRFCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RTRUxPVVQJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTWU5DCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNURVJSCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RSQU0xCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RWU0VMT1VUCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RGT1JDRUlOCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1RSUzEJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVFJTMgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNUUlMzCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9HSE9TVFJFRwksIDB4ODEgfSwKKwl7IDB4ZmZmZgkJLCAweGZmIH0sCit9OworCisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfRVNOT19BVkUJCQkzCisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfRVNOT19RVUFOVAkJMzIKKyNkZWZpbmUgU1RCMDg5OV9EVkJTMl9BVkZSQU1FU19DT0FSU0UJCTEwCisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfQVZGUkFNRVNfRklORQkJMjAKKyNkZWZpbmUgU1RCMDg5OV9EVkJTMl9NSVNTX1RIUkVTSE9MRAkJNgorI2RlZmluZSBTVEIwODk5X0RWQlMyX1VXUF9USFJFU0hPTERfQUNRCQkxMTI1CisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfVVdQX1RIUkVTSE9MRF9UUkFDSwk3NTgKKyNkZWZpbmUgU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1NPRgkJMTM1MAorI2RlZmluZSBTVEIwODk5X0RWQlMyX1NPRl9TRUFSQ0hfVElNRU9VVAkxNjY0MTAwCisKKyNkZWZpbmUgU1RCMDg5OV9EVkJTMl9CVFJfTkNPX0JJVFMJCTI4CisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfQlRSX0dBSU5fU0hJRlRfT0ZGU0VUCTE1CisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfQ1JMX05DT19CSVRTCQkzMAorI2RlZmluZSBTVEIwODk5X0RWQlMyX0xEUENfTUFYX0lURVIJCTcwCisKKyNlbmRpZiAvL19fU1RCMDg5OV9DRkdfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg4MjAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKQEAgLTAsMCArMSwxNjg0IEBACisvKgorCVNUQjA4OTkgTXVsdGlzdGFuZGFyZCBGcm9udGVuZCBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJzdGIwODk5X2Rydi5oIgorI2luY2x1ZGUgInN0YjA4OTlfcHJpdi5oIgorI2luY2x1ZGUgInN0YjA4OTlfcmVnLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZSA9IDA7Ly8xOworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7CisKKy8qIEMvTiBpbiBkQi8xMCwgTklSTS9OSVJMICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfdGFiIHN0YjA4OTlfY25fdGFiW10gPSB7CisJeyAyMDAsCTI2MDAgfSwKKwl7IDE5MCwJMjcwMCB9LAorCXsgMTgwLAkyODYwIH0sCisJeyAxNzAsCTMwMjAgfSwKKwl7IDE2MCwJMzIxMCB9LAorCXsgMTUwLAkzNDQwIH0sCisJeyAxNDAsCTM3MTAgfSwKKwl7IDEzMCwJNDAxMCB9LAorCXsgMTIwLAk0MzYwIH0sCisJeyAxMTAsCTQ3NDAgfSwKKwl7IDEwMCwJNTE5MCB9LAorCXsgOTAsCTU2NzAgfSwKKwl7IDgwLAk2MjAwIH0sCisJeyA3MCwJNjc3MCB9LAorCXsgNjAsCTczNjAgfSwKKwl7IDUwLAk3OTcwIH0sCisJeyA0MCwJODI1MCB9LAorCXsgMzAsCTkwMDAgfSwKKwl7IDIwLAk5NDUwIH0sCisJeyAxNSwJOTYwMCB9LAorfTsKKworLyogRFZCLVMgQUdDSVFfVkFMVUUgdnMuIHNpZ25hbCBsZXZlbCBpbiBkQm0vMTAuCisgKiBBcyBtZWFzdXJlZCwgY29ubmVjdGVkIHRvIGEgbW9kdWxhdG9yLgorICogLTguMCB0byAtNTAuMCBkQm0gZGlyZWN0bHkgY29ubmVjdGVkLAorICogLTUyLjAgdG8gLTc0Ljggd2l0aCBleHRyYSBhdHRlbnVhdGlvbi4KKyAqIEN1dC1vZmYgdG8gQUdDSVFfVkFMVUUgPSAweDgwIGJlbG93IC03NC44ZEJtLgorICogQ3J1ZGUgbGluZWFyIGV4dHJhcG9sYXRpb24gYmVsb3cgLTg0LjhkQm0gYW5kIGFib3ZlIC04LjBkQm0uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9kdmJzcmZfdGFiW10gPSB7CisJeyAtOTUwLAktMTI4IH0sCisJeyAtNzQ4LAkgLTk0IH0sCisJeyAtNzQ1LAkgLTkyIH0sCisJeyAtNzM1LAkgLTkwIH0sCisJeyAtNzIwLAkgLTg3IH0sCisJeyAtNjcwLAkgLTc3IH0sCisJeyAtNjQwLAkgLTcwIH0sCisJeyAtNjEwLAkgLTYyIH0sCisJeyAtNjAwLAkgLTYwIH0sCisJeyAtNTkwLAkgLTU2IH0sCisJeyAtNTYwLAkgLTQxIH0sCisJeyAtNTQwLAkgLTI1IH0sCisJeyAtNTMwLAkgLTE3IH0sCisJeyAtNTIwLAkgLTExIH0sCisJeyAtNTAwLAkgICAxIH0sCisJeyAtNDkwLAkgICA2IH0sCisJeyAtNDgwLAkgIDEwIH0sCisJeyAtNDQwLAkgIDIyIH0sCisJeyAtNDIwLAkgIDI3IH0sCisJeyAtNDAwLAkgIDMxIH0sCisJeyAtMzgwLAkgIDM0IH0sCisJeyAtMzQwLAkgIDQwIH0sCisJeyAtMzIwLAkgIDQzIH0sCisJeyAtMjgwLAkgIDQ4IH0sCisJeyAtMjUwLAkgIDUyIH0sCisJeyAtMjMwLAkgIDU1IH0sCisJeyAtMTgwLAkgIDYxIH0sCisJeyAtMTQwLAkgIDY2IH0sCisJeyAgLTkwLAkgIDczIH0sCisJeyAgLTgwLAkgIDc0IH0sCisJeyAgNTAwLAkgMTI3IH0KK307CisKKy8qIERWQi1TMiBJRl9BR0NfR0FJTiB2cy4gc2lnbmFsIGxldmVsIGluIGRCbS8xMC4KKyAqIEFzIG1lYXN1cmVkLCBjb25uZWN0ZWQgdG8gYSBtb2R1bGF0b3IuCisgKiAtOC4wIHRvIC01MC4xIGRCbSBkaXJlY3RseSBjb25uZWN0ZWQsCisgKiAtNTMuMCB0byAtNzYuNiB3aXRoIGV4dHJhIGF0dGVudWF0aW9uLgorICogQ3V0LW9mZiB0byBJRl9BR0NfR0FJTiA9IDB4M2ZmZiBiZWxvdyAtNzYuNmRCbS4KKyAqIENydWRlIGxpbmVhciBleHRyYXBvbGF0aW9uIGJlbG93IC03Ni42ZEJtIGFuZCBhYm92ZSAtOC4wZEJtLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfdGFiIHN0YjA4OTlfZHZiczJyZl90YWJbXSA9IHsKKwl7ICA3MDAsCSAgICAwIH0sCisJeyAgLTgwLAkgMzIxNyB9LAorCXsgLTE1MCwJIDM4OTMgfSwKKwl7IC0xOTAsCSA0MjE3IH0sCisJeyAtMjQwLAkgNDYyMSB9LAorCXsgLTI4MCwJIDQ5NDUgfSwKKwl7IC0zMjAsCSA1MjczIH0sCisJeyAtMzUwLAkgNTU0NSB9LAorCXsgLTM3MCwJIDU3NDEgfSwKKwl7IC00MTAsCSA2MTQ3IH0sCisJeyAtNDUwLAkgNjY3MSB9LAorCXsgLTQ5MCwJIDc0MTMgfSwKKwl7IC01MDEsCSA3NjY1IH0sCisJeyAtNTMwLAkgODc2NyB9LAorCXsgLTU2MCwJMTAyMTkgfSwKKwl7IC01ODAsCTEwOTM5IH0sCisJeyAtNTkwLAkxMTUxOCB9LAorCXsgLTYwMCwJMTE3MjMgfSwKKwl7IC02NTAsCTEyNjU5IH0sCisJeyAtNjkwLAkxMzIxOSB9LAorCXsgLTczMCwJMTM2NDUgfSwKKwl7IC03NTAsCTEzOTA5IH0sCisJeyAtNzY2LAkxNDE1MyB9LAorCXsgLTk5OSwJMTYzODMgfQorfTsKKworLyogRFZCLVMyIEVzL04wIHF1YW50IGluIGRCLzEwMCB2cyByZWFkIHZhbHVlICogMTAwKi8KK3N0cnVjdCBzdGIwODk5X3RhYiBzdGIwODk5X3F1YW50X3RhYltdID0geworCXsgICAgMCwJICAgIDAgfSwKKwl7ICAgIDAsCSAgMTAwIH0sCisJeyAgNjAwLAkgIDIwMCB9LAorCXsgIDk1MCwJICAyOTkgfSwKKwl7IDEyMDAsCSAgMzk4IH0sCisJeyAxNDAwLAkgIDUwMSB9LAorCXsgMTU2MCwJICA2MDMgfSwKKwl7IDE2OTAsCSAgNzAwIH0sCisJeyAxODEwLAkgIDgwNCB9LAorCXsgMTkxMCwJICA5MDIgfSwKKwl7IDIwMDAsCSAxMDAwIH0sCisJeyAyMDgwLAkgMTA5NiB9LAorCXsgMjE2MCwJIDEyMDIgfSwKKwl7IDIyMzAsCSAxMzAzIH0sCisJeyAyMzUwLAkgMTQ5NiB9LAorCXsgMjQxMCwJIDE2MDMgfSwKKwl7IDI0NjAsCSAxNjk4IH0sCisJeyAyNTEwLAkgMTc5OSB9LAorCXsgMjYwMCwJIDE5OTUgfSwKKwl7IDI2NTAsCSAyMTEzIH0sCisJeyAyNjkwLCAgMjIxMyB9LAorCXsgMjcyMCwJIDIyOTEgfSwKKwl7IDI3NjAsCSAyMzk5IH0sCisJeyAyODAwLAkgMjUxMiB9LAorCXsgMjg2MCwJIDI2OTIgfSwKKwl7IDI5MzAsCSAyOTE3IH0sCisJeyAyOTYwLAkgMzAyMCB9LAorCXsgMzAxMCwJIDMxOTkgfSwKKwl7IDMwNDAsCSAzMzExIH0sCisJeyAzMDYwLAkgMzM4OCB9LAorCXsgMzEyMCwJIDM2MzEgfSwKKwl7IDMxOTAsCSAzOTM2IH0sCisJeyAzNDAwLAkgNTAxMiB9LAorCXsgMzYxMCwJIDYzODMgfSwKKwl7IDM4MDAsCSA3OTQzIH0sCisJeyA0MjEwLAkxMjczNSB9LAorCXsgNDUwMCwJMTc3ODMgfSwKKwl7IDQ2OTAsCTIyMTMxIH0sCisJeyA0ODEwLAkyNTQxMCB9Cit9OworCisvKiBEVkItUzIgRXMvTjAgZXN0aW1hdGUgaW4gZEIvMTAwIHZzIHJlYWQgdmFsdWUgKi8KK3N0cnVjdCBzdGIwODk5X3RhYiBzdGIwODk5X2VzdF90YWJbXSA9IHsKKwl7ICAgIDAsCSAgICAgMCB9LAorCXsgICAgMCwJICAgICAxIH0sCisJeyAgMzAxLAkgICAgIDIgfSwKKwl7IDEyMDQsCSAgICAxNiB9LAorCXsgMTgwNiwJICAgIDY0IH0sCisJeyAyNDA4LAkgICAyNTYgfSwKKwl7IDI3MDksCSAgIDUxMiB9LAorCXsgMzAxMCwJICAxMDIzIH0sCisJeyAzMzExLAkgIDIwNDYgfSwKKwl7IDM2MTIsCSAgNDA5MyB9LAorCXsgMzgyMywJICA2NjUzIH0sCisJeyAzOTEzLAkgIDgxODUgfSwKKwl7IDQwMTAsCSAxMDIzMyB9LAorCXsgNDEwNywJIDEyNzk0IH0sCisJeyA0MjE0LAkgMTYzNjggfSwKKwl7IDQyNjYsCSAxODQ1MCB9LAorCXsgNDMxMSwJIDIwNDY0IH0sCisJeyA0MzUzLAkgMjI1NDIgfSwKKwl7IDQzOTEsCSAyNDYwNCB9LAorCXsgNDQyNSwJIDI2NjA3IH0sCisJeyA0NDU3LAkgMjg2NDIgfSwKKwl7IDQ0ODcsCSAzMDY5MCB9LAorCXsgNDUxNSwJIDMyNzM0IH0sCisJeyA0NjEyLAkgNDA5MjYgfSwKKwl7IDQ2OTIsCSA0OTIwNCB9LAorCXsgNDgxNiwJIDY1NDY0IH0sCisJeyA0OTEzLAkgODE4NDYgfSwKKwl7IDQ5OTMsCSA5ODQwMSB9LAorCXsgNTA2MCwJMTE0ODE1IH0sCisJeyA1MTE4LAkxMzEyMjAgfSwKKwl7IDUyMDAsCTE1ODQ4OSB9LAorCXsgNTMwMCwJMTk5NTI2IH0sCisJeyA1NDAwLAkyNTExODkgfSwKKwl7IDU1MDAsCTMxNjIyOCB9LAorCXsgNTYwMCwJMzk4MTA3IH0sCisJeyA1NzIwLAk1MjQ4MDcgfSwKKwl7IDU3MjEsCTUyNjAxNyB9LAorfTsKKworaW50IF9zdGIwODk5X3JlYWRfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgcmV0OworCisJdTggYjBbXSA9IHsgcmVnID4+IDgsIHJlZyAmIDB4ZmYgfTsKKwl1OCBidWY7CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5idWYJPSBiMCwKKwkJCS5sZW4JPSAyCisJCX0seworCQkJLmFkZHIJPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkuYnVmCT0gJmJ1ZiwKKwkJCS5sZW4JPSAxCisJCX0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfRVJST1IsIDEsCisJCQkJIlJlYWQgZXJyb3IsIFJlZz1bMHglMDJ4XSwgU3RhdHVzPSVkIiwKKwkJCQlyZWcsIHJldCk7CisKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRVJFTU9URUlPOworCX0KKwlpZiAodW5saWtlbHkoKnN0YXRlLT52ZXJib3NlID49IEZFX0RFQlVHUkVHKSkKKwkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfRVJST1IsIDEsICJSZWc9WzB4JTAyeF0sIGRhdGE9JTAyeCIsCisJCQlyZWcsIGJ1Zik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludClidWY7Cit9CisKK2ludCBzdGIwODk5X3JlYWRfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gX3N0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIHJlZyk7CisJLyoKKwkgKiBCdWcgSUQgOToKKwkgKiBhY2Nlc3MgdG8gMHhmMnh4LzB4ZjZ4eAorCSAqIG11c3QgYmUgZm9sbG93ZWQgYnkgcmVhZCBmcm9tIDB4ZjJmZi8weGY2ZmYuCisJICovCisJaWYgKChyZWcgIT0gMHhmMmZmKSAmJiAocmVnICE9IDB4ZjZmZikgJiYKKwkgICAgKCgocmVnICYgMHhmZjAwKSA9PSAweGYyMDApIHx8ICgocmVnICYgMHhmZjAwKSA9PSAweGY2MDApKSkKKwkJX3N0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIChyZWcgfCAweDAwZmYpKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3UzMiBfc3RiMDg5OV9yZWFkX3MycmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwKKwkJCXUzMiBzdGIwODk5X2kyY2RldiwKKwkJCXUzMiBzdGIwODk5X2Jhc2VfYWRkciwKKwkJCXUxNiBzdGIwODk5X3JlZ19vZmZzZXQpCit7CisJaW50IHN0YXR1czsKKwl1MzIgZGF0YTsKKwl1OCBidWZbN10gPSB7IDAgfTsKKwl1MTYgdG1wYWRkcjsKKworCXU4IGJ1Zl8wW10gPSB7CisJCUdFVEJZVEUoc3RiMDg5OV9pMmNkZXYsIEJZVEUxKSwJCS8qIDB4ZjMJUzIgQmFzZSBBZGRyZXNzIChNU0IpCSovCisJCUdFVEJZVEUoc3RiMDg5OV9pMmNkZXYsIEJZVEUwKSwJCS8qIDB4ZmMJUzIgQmFzZSBBZGRyZXNzIChMU0IpCSovCisJCUdFVEJZVEUoc3RiMDg5OV9iYXNlX2FkZHIsIEJZVEUwKSwJLyogMHgwMAlCYXNlIEFkZHJlc3MgKExTQikJKi8KKwkJR0VUQllURShzdGIwODk5X2Jhc2VfYWRkciwgQllURTEpLAkvKiAweDA0CUJhc2UgQWRkcmVzcyAoTFNCKQkqLworCQlHRVRCWVRFKHN0YjA4OTlfYmFzZV9hZGRyLCBCWVRFMiksCS8qIDB4MDAJQmFzZSBBZGRyZXNzIChNU0IpCSovCisJCUdFVEJZVEUoc3RiMDg5OV9iYXNlX2FkZHIsIEJZVEUzKSwJLyogMHgwMAlCYXNlIEFkZHJlc3MgKE1TQikJKi8KKwl9OworCXU4IGJ1Zl8xW10gPSB7CisJCTB4MDAsCS8qIDB4ZjMJUmVnIE9mZnNldAkqLworCQkweDAwLAkvKiAweDQ0CVJlZyBPZmZzZXQJKi8KKwl9OworCisJc3RydWN0IGkyY19tc2cgbXNnXzAgPSB7CisJCS5hZGRyCT0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzCT0gMCwKKwkJLmJ1Zgk9IGJ1Zl8wLAorCQkubGVuCT0gNgorCX07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dfMSA9IHsKKwkJLmFkZHIJPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MJPSAwLAorCQkuYnVmCT0gYnVmXzEsCisJCS5sZW4JPSAyCisJfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ19yID0geworCQkuYWRkcgk9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCS5mbGFncwk9IEkyQ19NX1JELAorCQkuYnVmCT0gYnVmLAorCQkubGVuCT0gNAorCX07CisKKwl0bXBhZGRyID0gc3RiMDg5OV9yZWdfb2Zmc2V0ICYgMHhmZjAwOworCWlmICghKHN0YjA4OTlfcmVnX29mZnNldCAmIDB4OCkpCisJCXRtcGFkZHIgPSBzdGIwODk5X3JlZ19vZmZzZXQgfCAweDIwOworCisJYnVmXzFbMF0gPSBHRVRCWVRFKHRtcGFkZHIsIEJZVEUxKTsKKwlidWZfMVsxXSA9IEdFVEJZVEUodG1wYWRkciwgQllURTApOworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dfMCwgMSk7CisJaWYgKHN0YXR1cyA8IDEpIHsKKwkJaWYgKHN0YXR1cyAhPSAtRVJFU1RBUlRTWVMpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzIEVSUigxKSwgRGV2aWNlPVsweCUwNHhdLCBCYXNlIGFkZHJlc3M9WzB4JTA4eF0sIE9mZnNldD1bMHglMDR4XSwgU3RhdHVzPSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBzdGIwODk5X2kyY2Rldiwgc3RiMDg5OV9iYXNlX2FkZHIsIHN0YjA4OTlfcmVnX29mZnNldCwgc3RhdHVzKTsKKworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBEdW1teQkqLworCXN0YXR1cyA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnXzEsIDEpOworCWlmIChzdGF0dXMgPCAxKQorCQlnb3RvIGVycjsKKworCXN0YXR1cyA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnX3IsIDEpOworCWlmIChzdGF0dXMgPCAxKQorCQlnb3RvIGVycjsKKworCWJ1Zl8xWzBdID0gR0VUQllURShzdGIwODk5X3JlZ19vZmZzZXQsIEJZVEUxKTsKKwlidWZfMVsxXSA9IEdFVEJZVEUoc3RiMDg5OV9yZWdfb2Zmc2V0LCBCWVRFMCk7CisKKwkvKiBBY3R1YWwJKi8KKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ18xLCAxKTsKKwlpZiAoc3RhdHVzIDwgMSkgeworCQlpZiAoc3RhdHVzICE9IC1FUkVTVEFSVFNZUykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgRVJSKDIpLCBEZXZpY2U9WzB4JTA0eF0sIEJhc2UgYWRkcmVzcz1bMHglMDh4XSwgT2Zmc2V0PVsweCUwNHhdLCBTdGF0dXM9JWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHN0YjA4OTlfaTJjZGV2LCBzdGIwODk5X2Jhc2VfYWRkciwgc3RiMDg5OV9yZWdfb2Zmc2V0LCBzdGF0dXMpOworCQlnb3RvIGVycjsKKwl9CisKKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ19yLCAxKTsKKwlpZiAoc3RhdHVzIDwgMSkgeworCQlpZiAoc3RhdHVzICE9IC1FUkVTVEFSVFNZUykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgRVJSKDMpLCBEZXZpY2U9WzB4JTA0eF0sIEJhc2UgYWRkcmVzcz1bMHglMDh4XSwgT2Zmc2V0PVsweCUwNHhdLCBTdGF0dXM9JWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHN0YjA4OTlfaTJjZGV2LCBzdGIwODk5X2Jhc2VfYWRkciwgc3RiMDg5OV9yZWdfb2Zmc2V0LCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzIDwgMCA/IHN0YXR1cyA6IC1FUkVNT1RFSU87CisJfQorCisJZGF0YSA9IE1BS0VXT1JEMzIoYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdKTsKKwlpZiAodW5saWtlbHkoKnN0YXRlLT52ZXJib3NlID49IEZFX0RFQlVHUkVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIERldmljZT1bMHglMDR4XSwgQmFzZSBhZGRyZXNzPVsweCUwOHhdLCBPZmZzZXQ9WzB4JTA0eF0sIERhdGE9WzB4JTA4eF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RiMDg5OV9pMmNkZXYsIHN0YjA4OTlfYmFzZV9hZGRyLCBzdGIwODk5X3JlZ19vZmZzZXQsIGRhdGEpOworCisJcmV0dXJuIGRhdGE7CisKK2VycjoKKwlyZXR1cm4gc3RhdHVzIDwgMCA/IHN0YXR1cyA6IC1FUkVNT1RFSU87Cit9CisKK2ludCBzdGIwODk5X3dyaXRlX3MycmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwKKwkJCXUzMiBzdGIwODk5X2kyY2RldiwKKwkJCXUzMiBzdGIwODk5X2Jhc2VfYWRkciwKKwkJCXUxNiBzdGIwODk5X3JlZ19vZmZzZXQsCisJCQl1MzIgc3RiMDg5OV9kYXRhKQoreworCWludCBzdGF0dXM7CisKKwkvKiBCYXNlIEFkZHJlc3MgU2V0dXAJKi8KKwl1OCBidWZfMFtdID0geworCQlHRVRCWVRFKHN0YjA4OTlfaTJjZGV2LCBCWVRFMSksCQkvKiAweGYzCVMyIEJhc2UgQWRkcmVzcyAoTVNCKQkqLworCQlHRVRCWVRFKHN0YjA4OTlfaTJjZGV2LCBCWVRFMCksCQkvKiAweGZjCVMyIEJhc2UgQWRkcmVzcyAoTFNCKQkqLworCQlHRVRCWVRFKHN0YjA4OTlfYmFzZV9hZGRyLCBCWVRFMCksCS8qIDB4MDAJQmFzZSBBZGRyZXNzIChMU0IpCSovCisJCUdFVEJZVEUoc3RiMDg5OV9iYXNlX2FkZHIsIEJZVEUxKSwJLyogMHgwNAlCYXNlIEFkZHJlc3MgKExTQikJKi8KKwkJR0VUQllURShzdGIwODk5X2Jhc2VfYWRkciwgQllURTIpLAkvKiAweDAwCUJhc2UgQWRkcmVzcyAoTVNCKQkqLworCQlHRVRCWVRFKHN0YjA4OTlfYmFzZV9hZGRyLCBCWVRFMyksCS8qIDB4MDAJQmFzZSBBZGRyZXNzIChNU0IpCSovCisJfTsKKwl1OCBidWZfMVtdID0geworCQkweDAwLAkvKiAweGYzCVJlZyBPZmZzZXQJKi8KKwkJMHgwMCwJLyogMHg0NAlSZWcgT2Zmc2V0CSovCisJCTB4MDAsCS8qIGRhdGEJCQkqLworCQkweDAwLAkvKiBkYXRhCQkJKi8KKwkJMHgwMCwJLyogZGF0YQkJCSovCisJCTB4MDAsCS8qIGRhdGEJCQkqLworCX07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dfMCA9IHsKKwkJLmFkZHIJPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MJPSAwLAorCQkuYnVmCT0gYnVmXzAsCisJCS5sZW4JPSA2CisJfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ18xID0geworCQkuYWRkcgk9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCS5mbGFncwk9IDAsCisJCS5idWYJPSBidWZfMSwKKwkJLmxlbgk9IDYKKwl9OworCisJYnVmXzFbMF0gPSBHRVRCWVRFKHN0YjA4OTlfcmVnX29mZnNldCwgQllURTEpOworCWJ1Zl8xWzFdID0gR0VUQllURShzdGIwODk5X3JlZ19vZmZzZXQsIEJZVEUwKTsKKwlidWZfMVsyXSA9IEdFVEJZVEUoc3RiMDg5OV9kYXRhLCBCWVRFMCk7CisJYnVmXzFbM10gPSBHRVRCWVRFKHN0YjA4OTlfZGF0YSwgQllURTEpOworCWJ1Zl8xWzRdID0gR0VUQllURShzdGIwODk5X2RhdGEsIEJZVEUyKTsKKwlidWZfMVs1XSA9IEdFVEJZVEUoc3RiMDg5OV9kYXRhLCBCWVRFMyk7CisKKwlpZiAodW5saWtlbHkoKnN0YXRlLT52ZXJib3NlID49IEZFX0RFQlVHUkVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIERldmljZT1bMHglMDR4XSwgQmFzZSBBZGRyZXNzPVsweCUwOHhdLCBPZmZzZXQ9WzB4JTA0eF0sIERhdGE9WzB4JTA4eF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RiMDg5OV9pMmNkZXYsIHN0YjA4OTlfYmFzZV9hZGRyLCBzdGIwODk5X3JlZ19vZmZzZXQsIHN0YjA4OTlfZGF0YSk7CisKKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZ18wLCAxKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzIDwgMSkpIHsKKwkJaWYgKHN0YXR1cyAhPSAtRVJFU1RBUlRTWVMpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzIEVSUiAoMSksIERldmljZT1bMHglMDR4XSwgQmFzZSBBZGRyZXNzPVsweCUwOHhdLCBPZmZzZXQ9WzB4JTA0eF0sIERhdGE9WzB4JTA4eF0sIHN0YXR1cz0lZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgc3RiMDg5OV9pMmNkZXYsIHN0YjA4OTlfYmFzZV9hZGRyLCBzdGIwODk5X3JlZ19vZmZzZXQsIHN0YjA4OTlfZGF0YSwgc3RhdHVzKTsKKwkJZ290byBlcnI7CisJfQorCXN0YXR1cyA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnXzEsIDEpOworCWlmICh1bmxpa2VseShzdGF0dXMgPCAxKSkgeworCQlpZiAoc3RhdHVzICE9IC1FUkVTVEFSVFNZUykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgRVJSICgyKSwgRGV2aWNlPVsweCUwNHhdLCBCYXNlIEFkZHJlc3M9WzB4JTA4eF0sIE9mZnNldD1bMHglMDR4XSwgRGF0YT1bMHglMDh4XSwgc3RhdHVzPSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBzdGIwODk5X2kyY2Rldiwgc3RiMDg5OV9iYXNlX2FkZHIsIHN0YjA4OTlfcmVnX29mZnNldCwgc3RiMDg5OV9kYXRhLCBzdGF0dXMpOworCisJCXJldHVybiBzdGF0dXMgPCAwID8gc3RhdHVzIDogLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiBzdGF0dXMgPCAwID8gc3RhdHVzIDogLUVSRU1PVEVJTzsKK30KKworaW50IHN0YjA4OTlfcmVhZF9yZWdzKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZywgdTggKmJ1ZiwgdTMyIGNvdW50KQoreworCWludCBzdGF0dXM7CisKKwl1OCBiMFtdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiB9OworCisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncwk9IDAsCisJCQkuYnVmCT0gYjAsCisJCQkubGVuCT0gMgorCQl9LHsKKwkJCS5hZGRyCT0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJCS5sZW4JPSBjb3VudAorCQl9CisJfTsKKworCXN0YXR1cyA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlpZiAoc3RhdHVzICE9IC1FUkVTVEFSVFNZUykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMgUmVhZCBlcnJvciwgUmVnPVsweCUwNHhdLCBDb3VudD0ldSwgU3RhdHVzPSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZWcsIGNvdW50LCBzdGF0dXMpOworCQlnb3RvIGVycjsKKwl9CisJLyoKKwkgKiBCdWcgSUQgOToKKwkgKiBhY2Nlc3MgdG8gMHhmMnh4LzB4ZjZ4eAorCSAqIG11c3QgYmUgZm9sbG93ZWQgYnkgcmVhZCBmcm9tIDB4ZjJmZi8weGY2ZmYuCisJICovCisJaWYgKChyZWcgIT0gMHhmMmZmKSAmJiAocmVnICE9IDB4ZjZmZikgJiYKKwkgICAgKCgocmVnICYgMHhmZjAwKSA9PSAweGYyMDApIHx8ICgocmVnICYgMHhmZjAwKSA9PSAweGY2MDApKSkKKwkJX3N0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIChyZWcgfCAweDAwZmYpKTsKKworCWlmICh1bmxpa2VseSgqc3RhdGUtPnZlcmJvc2UgPj0gRkVfREVCVUdSRUcpKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyBbMHglMDR4XToiLCBfX2Z1bmNfXywgcmVnKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXByaW50aygiICUwMngiLCBidWZbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gc3RhdHVzIDwgMCA/IHN0YXR1cyA6IC1FUkVNT1RFSU87Cit9CisKK2ludCBzdGIwODk5X3dyaXRlX3JlZ3Moc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcmVnLCB1OCAqZGF0YSwgdTMyIGNvdW50KQoreworCWludCByZXQ7CisJdTggYnVmWzIgKyBjb3VudF07CisJc3RydWN0IGkyY19tc2cgaTJjX21zZyA9IHsKKwkJLmFkZHIJPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MJPSAwLAorCQkuYnVmCT0gYnVmLAorCQkubGVuCT0gMiArIGNvdW50CisJfTsKKworCWJ1ZlswXSA9IHJlZyA+PiA4OworCWJ1ZlsxXSA9IHJlZyAmIDB4ZmY7CisJbWVtY3B5KCZidWZbMl0sIGRhdGEsIGNvdW50KTsKKworCWlmICh1bmxpa2VseSgqc3RhdGUtPnZlcmJvc2UgPj0gRkVfREVCVUdSRUcpKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyBbMHglMDR4XToiLCBfX2Z1bmNfXywgcmVnKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZpMmNfbXNnLCAxKTsKKworCS8qCisJICogQnVnIElEIDk6CisJICogYWNjZXNzIHRvIDB4ZjJ4eC8weGY2eHgKKwkgKiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHJlYWQgZnJvbSAweGYyZmYvMHhmNmZmLgorCSAqLworCWlmICgoKChyZWcgJiAweGZmMDApID09IDB4ZjIwMCkgfHwgKChyZWcgJiAweGZmMDApID09IDB4ZjYwMCkpKQorCQlzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCAocmVnIHwgMHgwMGZmKSk7CisKKwlpZiAocmV0ICE9IDEpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgIlJlZz1bMHglMDR4XSwgRGF0YT1bMHglMDJ4IC4uLl0sIENvdW50PSV1LCBTdGF0dXM9JWQiLAorCQkJCXJlZywgZGF0YVswXSwgY291bnQsIHJldCk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHN0YjA4OTlfd3JpdGVfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZywgdTggZGF0YSkKK3sKKwlyZXR1cm4gc3RiMDg5OV93cml0ZV9yZWdzKHN0YXRlLCByZWcsICZkYXRhLCAxKTsKK30KKworLyoKKyAqIHN0YjA4OTlfZ2V0X21jbGsKKyAqIEdldCBTVEIwODk5IG1hc3RlciBjbG9jayBmcmVxdWVuY3kKKyAqIEV4dENsazogZXh0ZXJuYWwgY2xvY2sgZnJlcXVlbmN5IChIeikKKyAqLworc3RhdGljIHUzMiBzdGIwODk5X2dldF9tY2xrKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwl1MzIgbWNsayA9IDAsIGRpdiA9IDA7CisKKwlkaXYgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X05DT0FSU0UpOworCW1jbGsgPSAoZGl2ICsgMSkgKiBzdGF0ZS0+Y29uZmlnLT54dGFsX2ZyZXEgLyA2OworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiZGl2PSVkLCBtY2xrPSVkIiwgZGl2LCBtY2xrKTsKKworCXJldHVybiBtY2xrOworfQorCisvKgorICogc3RiMDg5OV9zZXRfbWNsaworICogU2V0IFNUQjA4OTkgbWFzdGVyIENsb2NrIGZyZXF1ZW5jeQorICogTWNsazogZGVtb2R1bGF0b3IgbWFzdGVyIGNsb2NrCisgKiBFeHRDbGs6IGV4dGVybmFsIGNsb2NrIGZyZXF1ZW5jeSAoSHopCisgKi8KK3N0YXRpYyB2b2lkIHN0YjA4OTlfc2V0X21jbGsoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCB1MzIgTWNsaykKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCXU4IG1kaXYgPSAwOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJzdGF0ZS0+Y29uZmlnPSVwIiwgc3RhdGUtPmNvbmZpZyk7CisJbWRpdiA9ICgoNiAqIE1jbGspIC8gc3RhdGUtPmNvbmZpZy0+eHRhbF9mcmVxKSAtIDE7CisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJtZGl2PSVkIiwgbWRpdik7CisKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9OQ09BUlNFLCBtZGl2KTsKKwlpbnRlcm5hbC0+bWFzdGVyX2NsayA9IHN0YjA4OTlfZ2V0X21jbGsoc3RhdGUpOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJNYXN0ZXJDTE9DSz0lZCIsIGludGVybmFsLT5tYXN0ZXJfY2xrKTsKK30KKworc3RhdGljIGludCBzdGIwODk5X3Bvc3Rwcm9jKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdTggY3RsLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzdGIwODk5X2NvbmZpZyAqY29uZmlnCQk9IHN0YXRlLT5jb25maWc7CisJY29uc3Qgc3RydWN0IHN0YjA4OTlfcG9zdHByb2MgKnBvc3Rwcm9jCT0gY29uZmlnLT5wb3N0cHJvYzsKKworCS8qIHBvc3QgcHJvY2VzcyBldmVudCAqLworCWlmIChwb3N0cHJvYykgeworCQlpZiAoZW5hYmxlKSB7CisJCQlpZiAocG9zdHByb2NbY3RsXS5sZXZlbCA9PSBTVEIwODk5X0dQSU9QVUxMVVApCisJCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIHBvc3Rwcm9jW2N0bF0uZ3BpbywgMHgwMik7CisJCQllbHNlCisJCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIHBvc3Rwcm9jW2N0bF0uZ3BpbywgMHg4Mik7CisJCX0gZWxzZSB7CisJCQlpZiAocG9zdHByb2NbY3RsXS5sZXZlbCA9PSBTVEIwODk5X0dQSU9QVUxMVVApCisJCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIHBvc3Rwcm9jW2N0bF0uZ3BpbywgMHg4Mik7CisJCQllbHNlCisJCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIHBvc3Rwcm9jW2N0bF0uZ3BpbywgMHgwMik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0YjA4OTlfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiUmVsZWFzZSBGcm9udGVuZCIpOworCS8qIHBvc3QgcHJvY2VzcyBldmVudCAqLworCXN0YjA4OTlfcG9zdHByb2Moc3RhdGUsIFNUQjA4OTlfUE9TVFBST0NfR1BJT19QT1dFUiwgMCk7CisJa2ZyZWUoc3RhdGUpOworfQorCisvKgorICogc3RiMDg5OV9nZXRfYWxwaGEKKyAqIHJldHVybjogcm9sbG9mZgorICovCitzdGF0aWMgaW50IHN0YjA4OTlfZ2V0X2FscGhhKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBtb2RlX2NvZWZmOworCisJbW9kZV9jb2VmZiA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfREVNT0QpOworCisJaWYgKFNUQjA4OTlfR0VURklFTEQoTU9ERUNPRUZGLCBtb2RlX2NvZWZmKSA9PSAxKQorCQlyZXR1cm4gMjA7CisJZWxzZQorCQlyZXR1cm4gMzU7Cit9CisKKy8qCisgKiBzdGIwODk5X2luaXRfY2FsYworICovCitzdGF0aWMgdm9pZCBzdGIwODk5X2luaXRfY2FsYyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKKwlpbnQgbWFzdGVyX2NsazsKKwl1OCBhZ2NbMl07CisJdTggYWdjMWNuOworCXUzMiByZWc7CisKKwkvKiBSZWFkIHJlZ2lzdGVycyAoaW4gYnVyc3QgbW9kZSkJKi8KKwlhZ2MxY24gPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0FHQzFDTik7CisJc3RiMDg5OV9yZWFkX3JlZ3Moc3RhdGUsIFNUQjA4OTlfQUdDMVJFRiwgYWdjLCAyKTsgLyogQUdDMVIgYW5kIEFHQzJPCSovCisKKwkvKiBJbml0aWFsIGNhbGN1bGF0aW9ucwkqLworCW1hc3Rlcl9jbGsJCQk9IHN0YjA4OTlfZ2V0X21jbGsoc3RhdGUpOworCWludGVybmFsLT50X2FnYzEJCT0gMDsKKwlpbnRlcm5hbC0+dF9hZ2MyCQk9IDA7CisJaW50ZXJuYWwtPm1hc3Rlcl9jbGsJCT0gbWFzdGVyX2NsazsKKwlpbnRlcm5hbC0+bWNsawkJCT0gbWFzdGVyX2NsayAvIDY1NTM2TDsKKwlpbnRlcm5hbC0+cm9sbG9mZgkJPSBzdGIwODk5X2dldF9hbHBoYShzdGF0ZSk7CisKKwkvKiBEVkJTMiBJbml0aWFsIGNhbGN1bGF0aW9ucwkqLworCS8qIFNldCBBR0MgdmFsdWUgdG8gdGhlIG1pZGRsZQkqLworCWludGVybmFsLT5hZ2NfZ2FpbgkJPSA4MTU0OworCXJlZyA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyREVNT0QsIElGX0FHQ19DTlRSTCk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoSUZfR0FJTl9JTklULCByZWcsIGludGVybmFsLT5hZ2NfZ2Fpbik7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfSUZfQUdDX0NOVFJMLCBTVEIwODk5X09GRjBfSUZfQUdDX0NOVFJMLCByZWcpOworCisJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgUlJDX0FMUEhBKTsKKwlpbnRlcm5hbC0+cnJjX2FscGhhCQk9IFNUQjA4OTlfR0VURklFTEQoUlJDX0FMUEhBLCByZWcpOworCisJaW50ZXJuYWwtPmNlbnRlcl9mcmVxCQk9IDA7CisJaW50ZXJuYWwtPmF2X2ZyYW1lX2NvYXJzZQk9IDEwOworCWludGVybmFsLT5hdl9mcmFtZV9maW5lCQk9IDIwOworCWludGVybmFsLT5zdGVwX3NpemUJCT0gMjsKKy8qCisJaWYgKChwUGFyYW1zLT5TcGVjdHJhbEludiA9PSBGRV9JUV9OT1JNQUwpIHx8IChwUGFyYW1zLT5TcGVjdHJhbEludiA9PSBGRV9JUV9BVVRPKSkKKwkJcFBhcmFtcy0+SVFMb2NrZWQgPSAwOworCWVsc2UKKwkJcFBhcmFtcy0+SVFMb2NrZWQgPSAxOworKi8KK30KKworc3RhdGljIGludCBzdGIwODk5X3dhaXRfZGlzZXFjX2ZpZm9fZW1wdHkoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwl1OCByZWcgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUgKDEpIHsKKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNTVEFUVVMpOworCQlpZiAoIVNUQjA4OTlfR0VURklFTEQoRklGT0ZVTEwsIHJlZykpCisJCQlicmVhazsKKwkJaWYgKChqaWZmaWVzIC0gc3RhcnQpID4gdGltZW91dCkgeworCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfRVJST1IsIDEsICJ0aW1lZCBvdXQgISEiKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiMDg5OV9zZW5kX2Rpc2VxY19tc2coc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCByZWcsIGk7CisKKwlpZiAoY21kLT5tc2dfbGVuID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBlbmFibGUgRklGTyBwcmVjaGFyZ2UJKi8KKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRElTUFJFQ0hBUkdFLCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSwgcmVnKTsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5tc2dfbGVuOyBpKyspIHsKKwkJLyogd2FpdCBmb3IgRklGTyBlbXB0eQkqLworCQlpZiAoc3RiMDg5OV93YWl0X2Rpc2VxY19maWZvX2VtcHR5KHN0YXRlLCAxMCkgPCAwKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRElTRklGTywgY21kLT5tc2dbaV0pOworCX0KKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSk7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRElTUFJFQ0hBUkdFLCByZWcsIDApOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfd2FpdF9kaXNlcWNfcnhpZGxlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgaW50IHRpbWVvdXQpCit7CisJdTggcmVnID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKKworCXdoaWxlICghU1RCMDg5OV9HRVRGSUVMRChSWEVORCwgcmVnKSkgeworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU1JYX1NUMCk7CisJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiB0aW1lb3V0KSB7CisJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgInRpbWVkIG91dCEhIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoMTApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfcmVjdl9zbGF2ZV9yZXBseShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkgKnJlcGx5KQoreworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHJlZywgbGVuZ3RoID0gMCwgaTsKKwlpbnQgcmVzdWx0OworCisJaWYgKHN0YjA4OTlfd2FpdF9kaXNlcWNfcnhpZGxlKHN0YXRlLCAxMDApIDwgMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU1JYX1NUMCk7CisJaWYgKFNUQjA4OTlfR0VURklFTEQoUlhFTkQsIHJlZykpIHsKKworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU1JYX1NUMSk7CisJCWxlbmd0aCA9IFNUQjA4OTlfR0VURklFTEQoRklGT0JZVEVOQlIsIHJlZyk7CisKKwkJaWYgKGxlbmd0aCA+IHNpemVvZiAocmVwbHktPm1zZykpIHsKKwkJCXJlc3VsdCA9IC1FT1ZFUkZMT1c7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJcmVwbHktPm1zZ19sZW4gPSBsZW5ndGg7CisKKwkJLyogZXh0cmFjdCBkYXRhICovCisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJCXJlcGx5LT5tc2dbaV0gPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0ZJRk8pOworCX0KKworCXJldHVybiAwOworZXhpdDoKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc3RiMDg5OV93YWl0X2Rpc2VxY190eGlkbGUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwl1OCByZWcgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUgKCFTVEIwODk5X0dFVEZJRUxEKFRYSURMRSwgcmVnKSkgeworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU1NUQVRVUyk7CisJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiB0aW1lb3V0KSB7CisJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgInRpbWVkIG91dCEhIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoMTApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X3NlbmRfZGlzZXFjX2J1cnN0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCByZWcsIG9sZF9zdGF0ZTsKKworCS8qIHdhaXQgZm9yIGRpc2VxYyBpZGxlCSovCisJaWYgKHN0YjA4OTlfd2FpdF9kaXNlcWNfdHhpZGxlKHN0YXRlLCAxMDApIDwgMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSk7CisJb2xkX3N0YXRlID0gcmVnOworCS8qIHNldCB0byBidXJzdCBtb2RlCSovCisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRElTRVFDTU9ERSwgcmVnLCAweDAyKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChESVNQUkVDSEFSR0UsIHJlZywgMHgwMSk7CisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRElTQ05UUkwxLCByZWcpOworCXN3aXRjaCAoYnVyc3QpIHsKKwljYXNlIFNFQ19NSU5JX0E6CisJCS8qIHVubW9kdWxhdGVkCSovCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0ZJRk8sIDB4MDApOworCQlicmVhazsKKwljYXNlIFNFQ19NSU5JX0I6CisJCS8qIG1vZHVsYXRlZAkqLworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNGSUZPLCAweGZmKTsKKwkJYnJlYWs7CisJfQorCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfRElTQ05UUkwxKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChESVNQUkVDSEFSR0UsIHJlZywgMHgwMCk7CisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRElTQ05UUkwxLCByZWcpOworCS8qIHdhaXQgZm9yIGRpc2VxYyBpZGxlCSovCisJaWYgKHN0YjA4OTlfd2FpdF9kaXNlcWNfdHhpZGxlKHN0YXRlLCAxMDApIDwgMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkvKiByZXN0b3JlIHN0YXRlCSovCisJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRElTQ05UUkwxLCBvbGRfc3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiMDg5OV9kaXNlcWNfaW5pdChzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCB0eF9kYXRhOworLyoKKwlzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSByeF9kYXRhOworKi8KKwl1OCBmMjJfdHgsIGYyMl9yeCwgcmVnOworCisJdTMyIG1jbGssIHR4X2ZyZXEgPSAyMjAwMDsvKiBjb3VudCA9IDAsIGk7ICovCisJdHhfZGF0YS5tc2dbMF0gPSAweGUyOworCXR4X2RhdGEubXNnX2xlbiA9IDM7CisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNDTlRSTDIpOworCVNUQjA4OTlfU0VURklFTERfVkFMKE9ORUNISVBfVFJYLCByZWcsIDApOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMiwgcmVnKTsKKworCS8qIGRpc2FibGUgVHggc3B5CSovCisJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNDTlRSTDEpOworCVNUQjA4OTlfU0VURklFTERfVkFMKERJU0VRQ1JFU0VULCByZWcsIDEpOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSwgcmVnKTsKKworCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfRElTQ05UUkwxKTsKKwlTVEIwODk5X1NFVEZJRUxEX1ZBTChESVNFUUNSRVNFVCwgcmVnLCAwKTsKKwlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNDTlRSTDEsIHJlZyk7CisKKwltY2xrID0gc3RiMDg5OV9nZXRfbWNsayhzdGF0ZSk7CisJZjIyX3R4ID0gbWNsayAvICh0eF9mcmVxICogMzIpOworCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0YyMiwgZjIyX3R4KTsgLyogRGlTRXFDIFR4IGZyZXEJKi8KKwlzdGF0ZS0+cnhfZnJlcSA9IDIwMDAwOworCWYyMl9yeCA9IG1jbGsgLyAoc3RhdGUtPnJ4X2ZyZXEgKiAzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworLyoKKwl1OCByZWc7CisqLworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiR29pbmcgdG8gU2xlZXAgLi4gKFJlYWxseSB0aXJlZCAuLiA6LSkpIik7CisJLyogcG9zdCBwcm9jZXNzIGV2ZW50ICovCisJc3RiMDg5OV9wb3N0cHJvYyhzdGF0ZSwgU1RCMDg5OV9QT1NUUFJPQ19HUElPX1BPV0VSLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfd2FrZXVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmICgocmMgPSBzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9TWU5UQ1RSTCwgU1RCMDg5OV9TRUxPU0NJKSkpCisJCXJldHVybiByYzsKKwkvKiBBY3RpdmF0ZSBhbGwgY2xvY2tzOyBEVkItUzIgcmVnaXN0ZXJzIGFyZSBpbmFjY2Vzc2libGUgb3RoZXJ3aXNlLiAqLworCWlmICgocmMgPSBzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9TVE9QQ0xLMSwgMHgwMCkpKQorCQlyZXR1cm4gcmM7CisJaWYgKChyYyA9IHN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1NUT1BDTEsyLCAweDAwKSkpCisJCXJldHVybiByYzsKKworCS8qIHBvc3QgcHJvY2VzcyBldmVudCAqLworCXN0YjA4OTlfcG9zdHByb2Moc3RhdGUsIFNUQjA4OTlfUE9TVFBST0NfR1BJT19QT1dFUiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJaW50IGk7CisJc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJJbml0aWFsaXppbmcgU1RCMDg5OSAuLi4gIik7CisKKwkvKiBpbml0IGRldmljZQkJKi8KKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgImluaXQgZGV2aWNlIik7CisJZm9yIChpID0gMDsgY29uZmlnLT5pbml0X2RldltpXS5hZGRyZXNzICE9IDB4ZmZmZjsgaSsrKQorCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgY29uZmlnLT5pbml0X2RldltpXS5hZGRyZXNzLCBjb25maWctPmluaXRfZGV2W2ldLmRhdGEpOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJpbml0IFMyIGRlbW9kIik7CisJLyogaW5pdCBTMiBkZW1vZAkqLworCWZvciAoaSA9IDA7IGNvbmZpZy0+aW5pdF9zMl9kZW1vZFtpXS5vZmZzZXQgIT0gMHhmZmZmOyBpKyspCisJCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJERU1PRCwKKwkJCQkgICAgY29uZmlnLT5pbml0X3MyX2RlbW9kW2ldLmJhc2VfYWRkcmVzcywKKwkJCQkgICAgY29uZmlnLT5pbml0X3MyX2RlbW9kW2ldLm9mZnNldCwKKwkJCQkgICAgY29uZmlnLT5pbml0X3MyX2RlbW9kW2ldLmRhdGEpOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJpbml0IFMxIGRlbW9kIik7CisJLyogaW5pdCBTMSBkZW1vZAkqLworCWZvciAoaSA9IDA7IGNvbmZpZy0+aW5pdF9zMV9kZW1vZFtpXS5hZGRyZXNzICE9IDB4ZmZmZjsgaSsrKQorCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgY29uZmlnLT5pbml0X3MxX2RlbW9kW2ldLmFkZHJlc3MsIGNvbmZpZy0+aW5pdF9zMV9kZW1vZFtpXS5kYXRhKTsKKworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiaW5pdCBTMiBGRUMiKTsKKwkvKiBpbml0IFMyIGZlYwkJKi8KKwlmb3IgKGkgPSAwOyBjb25maWctPmluaXRfczJfZmVjW2ldLm9mZnNldCAhPSAweGZmZmY7IGkrKykKKwkJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkZFQywKKwkJCQkgICAgY29uZmlnLT5pbml0X3MyX2ZlY1tpXS5iYXNlX2FkZHJlc3MsCisJCQkJICAgIGNvbmZpZy0+aW5pdF9zMl9mZWNbaV0ub2Zmc2V0LAorCQkJCSAgICBjb25maWctPmluaXRfczJfZmVjW2ldLmRhdGEpOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJpbml0IFRTVCIpOworCS8qIGluaXQgdGVzdAkJKi8KKwlmb3IgKGkgPSAwOyBjb25maWctPmluaXRfdHN0W2ldLmFkZHJlc3MgIT0gMHhmZmZmOyBpKyspCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBjb25maWctPmluaXRfdHN0W2ldLmFkZHJlc3MsIGNvbmZpZy0+aW5pdF90c3RbaV0uZGF0YSk7CisKKwlzdGIwODk5X2luaXRfY2FsYyhzdGF0ZSk7CisJc3RiMDg5OV9kaXNlcWNfaW5pdChzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X3RhYmxlX2xvb2t1cChjb25zdCBzdHJ1Y3Qgc3RiMDg5OV90YWIgKnRhYiwgaW50IG1heCwgaW50IHZhbCkKK3sKKwlpbnQgcmVzID0gMDsKKwlpbnQgbWluID0gMCwgbWVkOworCisJaWYgKHZhbCA8IHRhYlttaW5dLnJlYWQpCisJCXJlcyA9IHRhYlttaW5dLnJlYWw7CisJZWxzZSBpZiAodmFsID49IHRhYlttYXhdLnJlYWQpCisJCXJlcyA9IHRhYlttYXhdLnJlYWw7CisJZWxzZSB7CisJCXdoaWxlICgobWF4IC0gbWluKSA+IDEpIHsKKwkJCW1lZCA9IChtYXggKyBtaW4pIC8gMjsKKwkJCWlmICh2YWwgPj0gdGFiW21pbl0ucmVhZCAmJiB2YWwgPCB0YWJbbWVkXS5yZWFkKQorCQkJCW1heCA9IG1lZDsKKwkJCWVsc2UKKwkJCQltaW4gPSBtZWQ7CisJCX0KKwkJcmVzID0gKCh2YWwgLSB0YWJbbWluXS5yZWFkKSAqCisJCSAgICAgICAodGFiW21heF0ucmVhbCAtIHRhYlttaW5dLnJlYWwpIC8KKwkJICAgICAgICh0YWJbbWF4XS5yZWFkIC0gdGFiW21pbl0ucmVhZCkpICsKKwkJCXRhYlttaW5dLnJlYWw7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzdGIwODk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZQkJPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwJPSAmc3RhdGUtPmludGVybmFsOworCisJaW50IHZhbDsKKwl1MzIgcmVnOworCXN3aXRjaCAoc3RhdGUtPmRlbHN5cykgeworCWNhc2UgU1lTX0RWQlM6CisJY2FzZSBTWVNfRFNTOgorCQlpZiAoaW50ZXJuYWwtPmxvY2spIHsKKwkJCXJlZyAgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1ZTVEFUVVMpOworCQkJaWYgKFNUQjA4OTlfR0VURklFTEQoVlNUQVRVU19MT0NLRURWSVQsIHJlZykpIHsKKworCQkJCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfQUdDSVFJTik7CisJCQkJdmFsID0gKHMzMikoczgpU1RCMDg5OV9HRVRGSUVMRChBR0NJUVZBTFVFLCByZWcpOworCisJCQkJKnN0cmVuZ3RoID0gc3RiMDg5OV90YWJsZV9sb29rdXAoc3RiMDg5OV9kdmJzcmZfdGFiLCBBUlJBWV9TSVpFKHN0YjA4OTlfZHZic3JmX3RhYikgLSAxLCB2YWwpOworCQkJCSpzdHJlbmd0aCArPSA3NTA7CisJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJBR0NJUVZBTFVFID0gMHglMDJ4LCBDID0gJWQgKiAwLjEgZEJtIiwKKwkJCQkJdmFsICYgMHhmZiwgKnN0cmVuZ3RoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFNZU19EVkJTMjoKKwkJaWYgKGludGVybmFsLT5sb2NrKSB7CisJCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9ERU1PRCwgSUZfQUdDX0dBSU4pOworCQkJdmFsID0gU1RCMDg5OV9HRVRGSUVMRChJRl9BR0NfR0FJTiwgcmVnKTsKKworCQkJKnN0cmVuZ3RoID0gc3RiMDg5OV90YWJsZV9sb29rdXAoc3RiMDg5OV9kdmJzMnJmX3RhYiwgQVJSQVlfU0laRShzdGIwODk5X2R2YnMycmZfdGFiKSAtIDEsIHZhbCk7CisJCQkqc3RyZW5ndGggKz0gNzUwOworCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJJRl9BR0NfR0FJTiA9IDB4JTA0eCwgQyA9ICVkICogMC4xIGRCbSIsCisJCQkJdmFsICYgMHgzZmZmLCAqc3RyZW5ndGgpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiVW5zdXBwb3J0ZWQgZGVsaXZlcnkgc3lzdGVtIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZQkJPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwJPSAmc3RhdGUtPmludGVybmFsOworCisJdW5zaWduZWQgaW50IHZhbCwgcXVhbnQsIHF1YW50biA9IC0xLCBlc3QsIGVzdG4gPSAtMTsKKwl1OCBidWZbMl07CisJdTMyIHJlZzsKKworCXJlZyAgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1ZTVEFUVVMpOworCXN3aXRjaCAoc3RhdGUtPmRlbHN5cykgeworCWNhc2UgU1lTX0RWQlM6CisJY2FzZSBTWVNfRFNTOgorCQlpZiAoaW50ZXJuYWwtPmxvY2spIHsKKwkJCWlmIChTVEIwODk5X0dFVEZJRUxEKFZTVEFUVVNfTE9DS0VEVklULCByZWcpKSB7CisKKwkJCQlzdGIwODk5X3JlYWRfcmVncyhzdGF0ZSwgU1RCMDg5OV9OSVJNLCBidWYsIDIpOworCQkJCXZhbCA9IE1BS0VXT1JEMTYoYnVmWzBdLCBidWZbMV0pOworCisJCQkJKnNuciA9IHN0YjA4OTlfdGFibGVfbG9va3VwKHN0YjA4OTlfY25fdGFiLCBBUlJBWV9TSVpFKHN0YjA4OTlfY25fdGFiKSAtIDEsIHZhbCk7CisJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJOSVIgPSAweCUwMnglMDJ4ID0gJXUsIEMvTiA9ICVkICogMC4xIGRCbVxuIiwKKwkJCQkJYnVmWzBdLCBidWZbMV0sIHZhbCwgKnNucik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCWlmIChpbnRlcm5hbC0+bG9jaykgeworCQkJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgVVdQX0NOVFJMMSk7CisJCQlxdWFudCA9IFNUQjA4OTlfR0VURklFTEQoVVdQX0VTTjBfUVVBTlQsIHJlZyk7CisJCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBVV1BfU1RBVDIpOworCQkJZXN0ID0gU1RCMDg5OV9HRVRGSUVMRChFU04wX0VTVCwgcmVnKTsKKwkJCWlmIChlc3QgPT0gMSkKKwkJCQl2YWwgPSAzMDE7IC8qIEMvTiA9IDMwLjEgZEIgKi8KKwkJCWVsc2UgaWYgKGVzdCA9PSAyKQorCQkJCXZhbCA9IDI3MDsgLyogQy9OID0gMjcuMCBkQiAqLworCQkJZWxzZSB7CisJCQkJLyogcXVhbnRuID0gMTAwICogbG9nKHF1YW50XjIpICovCisJCQkJcXVhbnRuID0gc3RiMDg5OV90YWJsZV9sb29rdXAoc3RiMDg5OV9xdWFudF90YWIsIEFSUkFZX1NJWkUoc3RiMDg5OV9xdWFudF90YWIpIC0gMSwgcXVhbnQgKiAxMDApOworCQkJCS8qIGVzdG4gPSAxMDAgKiBsb2coZXN0KSAqLworCQkJCWVzdG4gPSBzdGIwODk5X3RhYmxlX2xvb2t1cChzdGIwODk5X2VzdF90YWIsIEFSUkFZX1NJWkUoc3RiMDg5OV9lc3RfdGFiKSAtIDEsIGVzdCk7CisJCQkJLyogc25yKGRCbS8xMCkgPSAtMTAqKGxvZyhlc3QpLWxvZyhxdWFudF4yKSkgPT4gc25yKGRCbS8xMCkgPSAoMTAwKmxvZyhxdWFudF4yKS0xMDAqbG9nKGVzdCkpLzEwICovCisJCQkJdmFsID0gKHF1YW50biAtIGVzdG4pIC8gMTA7CisJCQl9CisJCQkqc25yID0gdmFsOworCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJFcy9OMCBxdWFudCA9ICVkICglZCkgZXN0aW1hdGUgPSAldSAoJWQpLCBDL04gPSAlZCAqIDAuMSBkQm0iLAorCQkJCXF1YW50LCBxdWFudG4sIGVzdCwgZXN0biwgdmFsKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIlVuc3VwcG9ydGVkIGRlbGl2ZXJ5IHN5c3RlbSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBlbnVtIGZlX3N0YXR1cyAqc3RhdHVzKQoreworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZQkJPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwJPSAmc3RhdGUtPmludGVybmFsOworCXU4IHJlZzsKKwkqc3RhdHVzID0gMDsKKworCXN3aXRjaCAoc3RhdGUtPmRlbHN5cykgeworCWNhc2UgU1lTX0RWQlM6CisJY2FzZSBTWVNfRFNTOgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRlbGl2ZXJ5IHN5c3RlbSBEVkItUy9EU1MiKTsKKwkJaWYgKGludGVybmFsLT5sb2NrKSB7CisJCQlyZWcgID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9WU1RBVFVTKTsKKwkJCWlmIChTVEIwODk5X0dFVEZJRUxEKFZTVEFUVVNfTE9DS0VEVklULCByZWcpKSB7CisJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tLT4gRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfTE9DSyIpOworCQkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfTE9DSzsKKworCQkJCXJlZyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfUExQQVJNKTsKKwkJCQlpZiAoU1RCMDg5OV9HRVRGSUVMRChWSVRDVVJQVU4sIHJlZykpIHsKKwkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICItLS0tLS0tLT4gRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU1lOQyIpOworCQkJCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkM7CisJCQkJCS8qIHBvc3QgcHJvY2VzcyBldmVudCAqLworCQkJCQlzdGIwODk5X3Bvc3Rwcm9jKHN0YXRlLCBTVEIwODk5X1BPU1RQUk9DX0dQSU9fTE9DSywgMSk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRlbGl2ZXJ5IHN5c3RlbSBEVkItUzIiKTsKKwkJaWYgKGludGVybmFsLT5sb2NrKSB7CisJCQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBETURfU1RBVDIpOworCQkJaWYgKFNUQjA4OTlfR0VURklFTEQoVVdQX0xPQ0ssIHJlZykgJiYgU1RCMDg5OV9HRVRGSUVMRChDU01fTE9DSywgcmVnKSkgeworCQkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCSJVV1AgJiBDU00gTG9jayAhIC0tLT4gRFZCLVMyIEZFX0hBU19DQVJSSUVSIik7CisKKwkJCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0NGR1BERUxTVEFUVVMxKTsKKwkJCQlpZiAoU1RCMDg5OV9HRVRGSUVMRChDRkdQREVMU1RBVFVTX0xPQ0ssIHJlZykpIHsKKwkJCQkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwkJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCQkiUGFja2V0IERlbGluZWF0b3IgTG9ja2VkICEgLS0tLS0+IERWQi1TMiBGRV9IQVNfTE9DSyIpOworCisJCQkJfQorCQkJCWlmIChTVEIwODk5X0dFVEZJRUxEKENPTlRJTlVPVVNfU1RSRUFNLCByZWcpKSB7CisJCQkJCSpzdGF0dXMgfD0gRkVfSEFTX1ZJVEVSQkk7CisJCQkJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLAorCQkJCQkJIlBhY2tldCBEZWxpbmVhdG9yIGZvdW5kIFZJVEVSQkkgISAtLS0tLT4gRFZCLVMyIEZFX0hBU19WSVRFUkJJIik7CisJCQkJfQorCQkJCWlmIChTVEIwODk5X0dFVEZJRUxEKEFDQ0VQVEVEX1NUUkVBTSwgcmVnKSkgeworCQkJCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCQkJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwKKwkJCQkJCSJQYWNrZXQgRGVsaW5lYXRvciBmb3VuZCBTWU5DICEgLS0tLS0+IERWQi1TMiBGRV9IQVNfU1lOQyIpOworCQkJCQkvKiBwb3N0IHByb2Nlc3MgZXZlbnQgKi8KKwkJCQkJc3RiMDg5OV9wb3N0cHJvYyhzdGF0ZSwgU1RCMDg5OV9QT1NUUFJPQ19HUElPX0xPQ0ssIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIlVuc3VwcG9ydGVkIGRlbGl2ZXJ5IHN5c3RlbSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzdGIwODk5X2dldF9lcnJvcgorICogdml0ZXJiaSBlcnJvciBmb3IgRFZCLVMvRFNTCisgKiBwYWNrZXQgZXJyb3IgZm9yIERWQi1TMgorICogQml0IEVycm9yIFJhdGUgb3IgUGFja2V0IEVycm9yIFJhdGUgKiAxMCBeIDcKKyAqLworc3RhdGljIGludCBzdGIwODk5X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUJCT0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsCT0gJnN0YXRlLT5pbnRlcm5hbDsKKworCXU4ICBsc2IsIG1zYjsKKwl1MzIgaTsKKworCSpiZXIgPSAwOworCisJc3dpdGNoIChzdGF0ZS0+ZGVsc3lzKSB7CisJY2FzZSBTWVNfRFZCUzoKKwljYXNlIFNZU19EU1M6CisJCWlmIChpbnRlcm5hbC0+bG9jaykgeworCQkJLyogYXZlcmFnZSA1IEJFUiB2YWx1ZXMJKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQltc2xlZXAoMTAwKTsKKwkJCQlsc2IgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0VDTlQxTCk7CisJCQkJbXNiID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9FQ05UMU0pOworCQkJCSpiZXIgKz0gTUFLRVdPUkQxNihtc2IsIGxzYik7CisJCQl9CisJCQkqYmVyIC89IDU7CisJCQkvKiBWaXRlcmJpIENoZWNrCSovCisJCQlpZiAoU1RCMDg5OV9HRVRGSUVMRChWU1RBVFVTX1BSRlZJVCwgaW50ZXJuYWwtPnZfc3RhdHVzKSkgeworCQkJCS8qIEVycm9yIFJhdGUJCSovCisJCQkJKmJlciAqPSA5NzY2OworCQkJCS8qIGJlciA9IGJlciAqIDEwIF4gNwkqLworCQkJCSpiZXIgLz0gKC0xICsgKDEgPDwgKDIgKiBTVEIwODk5X0dFVEZJRUxEKE5PRSwgaW50ZXJuYWwtPmVycl9jdHJsKSkpKTsKKwkJCQkqYmVyIC89IDg7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCWlmIChpbnRlcm5hbC0+bG9jaykgeworCQkJLyogQXZlcmFnZSA1IFBFUiB2YWx1ZXMJKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQltc2xlZXAoMTAwKTsKKwkJCQlsc2IgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0VDTlQxTCk7CisJCQkJbXNiID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9FQ05UMU0pOworCQkJCSpiZXIgKz0gTUFLRVdPUkQxNihtc2IsIGxzYik7CisJCQl9CisJCQkvKiBiZXIgPSBiZXIgKiAxMCBeIDcJKi8KKwkJCSpiZXIgKj0gMTAwMDAwMDA7CisJCQkqYmVyIC89ICgtMSArICgxIDw8ICg0ICsgMiAqIFNUQjA4OTlfR0VURklFTEQoTk9FLCBpbnRlcm5hbC0+ZXJyX2N0cmwpKSkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiVW5zdXBwb3J0ZWQgZGVsaXZlcnkgc3lzdGVtIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN3aXRjaCAodm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMENGRywgMHg4Mik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMUNGRywgMHgwMik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMkNGRywgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMENGRywgMHgwMik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMUNGRywgMHgwMik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0dQSU8wMkNGRywgMHg4Mik7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9HUElPMDBDRkcsIDB4ODIpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9HUElPMDFDRkcsIDB4ODIpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9HUElPMDJDRkcsIDB4ODIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGIwODk5X3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3sKKwlzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3Qgc3RiMDg5OV9pbnRlcm5hbCAqaW50ZXJuYWwgPSAmc3RhdGUtPmludGVybmFsOworCisJdTggZGl2LCByZWc7CisKKwkvKiB3YWl0IGZvciBkaXNlcWMgaWRsZQkqLworCWlmIChzdGIwODk5X3dhaXRfZGlzZXFjX3R4aWRsZShzdGF0ZSwgMTAwKSA8IDApCisJCXJldHVybiAtRVRJTUVET1VUOworCisJc3dpdGNoICh0b25lKSB7CisJY2FzZSBTRUNfVE9ORV9PTjoKKwkJZGl2ID0gKGludGVybmFsLT5tYXN0ZXJfY2xrIC8gMTAwKSAvIDU2MzI7CisJCWRpdiA9IChkaXYgKyA1KSAvIDEwOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9ESVNFUUNPQ0ZHLCAweDY2KTsKKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9BQ1JQUkVTQyk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEFDUlBSRVNDLCByZWcsIDB4MDMpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9BQ1JQUkVTQywgcmVnKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfQUNSRElWMSwgZGl2KTsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVE9ORV9PRkY6CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0VRQ09DRkcsIDB4MjApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdGIwODk5X2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJaW50IGkyY19zdGF0OworCXN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaTJjX3N0YXQgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0kyQ1JQVCk7CisJaWYgKGkyY19zdGF0IDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoZW5hYmxlKSB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiRW5hYmxpbmcgSTJDIFJlcGVhdGVyIC4uLiIpOworCQlpMmNfc3RhdCB8PSAgU1RCMDg5OV9JMkNUT047CisJCWlmIChzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9JMkNSUFQsIGkyY19zdGF0KSA8IDApCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeworCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRpc2FibGluZyBJMkMgUmVwZWF0ZXIgLi4uIik7CisJCWkyY19zdGF0ICY9IH5TVEIwODk5X0kyQ1RPTjsKKwkJaWYgKHN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0kyQ1JQVCwgaTJjX3N0YXQpIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgIkkyQyBSZXBlYXRlciBjb250cm9sIGZhaWxlZCIpOworCXJldHVybiAtRVJFTU9URUlPOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBDT05WRVJUMzIodTMyIHgsIGNoYXIgKnN0cikKK3sKKwkqc3RyKysJPSAoeCA+PiAyNCkgJiAweGZmOworCSpzdHIrKwk9ICh4ID4+IDE2KSAmIDB4ZmY7CisJKnN0cisrCT0gKHggPj4gIDgpICYgMHhmZjsKKwkqc3RyKysJPSAoeCA+PiAgMCkgJiAweGZmOworCSpzdHIJPSAnXDAnOworfQorCitpbnQgc3RiMDg5OV9nZXRfZGV2X2lkKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCBjaGlwX2lkLCByZWxlYXNlOworCXUxNiBpZDsKKwl1MzIgZGVtb2RfdmVyID0gMCwgZmVjX3ZlciA9IDA7CisJY2hhciBkZW1vZF9zdHJbNV0gPSB7IDAgfTsKKwljaGFyIGZlY19zdHJbNV0gPSB7IDAgfTsKKworCWlkID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9ERVZfSUQpOworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiSUQgcmVnPVsweCUwMnhdIiwgaWQpOworCWNoaXBfaWQgPSBTVEIwODk5X0dFVEZJRUxEKENISVBfSUQsIGlkKTsKKwlyZWxlYXNlID0gU1RCMDg5OV9HRVRGSUVMRChDSElQX1JFTCwgaWQpOworCisJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfRVJST1IsIDEsICJEZXZpY2UgSUQ9WyVkXSwgUmVsZWFzZT1bJWRdIiwKKwkJY2hpcF9pZCwgcmVsZWFzZSk7CisKKwlDT05WRVJUMzIoU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgRE1EX0NPUkVfSUQpLCAoY2hhciAqKSZkZW1vZF9zdHIpOworCisJZGVtb2RfdmVyID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJERU1PRCwgRE1EX1ZFUlNJT05fSUQpOworCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0VSUk9SLCAxLCAiRGVtb2R1bGF0b3IgQ29yZSBJRD1bJXNdLCBWZXJzaW9uPVslZF0iLCAoY2hhciAqKSAmZGVtb2Rfc3RyLCBkZW1vZF92ZXIpOworCUNPTlZFUlQzMihTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkZFQywgRkVDX0NPUkVfSURfUkVHKSwgKGNoYXIgKikmZmVjX3N0cik7CisJZmVjX3ZlciA9IFNUQjA4OTlfUkVBRF9TMlJFRyhTVEIwODk5X1MyRkVDLCBGRUNfVkVSX0lEX1JFRyk7CisJaWYgKCEgKGNoaXBfaWQgPiAwKSkgeworCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgImNvdWxkbid0IGZpbmQgYSBTVEIgMDg5OSIpOworCisJCXJldHVybiAtRU5PREVWOworCX0KKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgIkZFQyBDb3JlIElEPVslc10sIFZlcnNpb249WyVkXSIsIChjaGFyKikgJmZlY19zdHIsIGZlY192ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0YjA4OTlfc2V0X2RlbGl2ZXJ5KHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3sKKwl1OCByZWc7CisJdTggc3RvcF9jbGtbMl07CisKKwlzdG9wX2Nsa1swXSA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfU1RPUENMSzEpOworCXN0b3BfY2xrWzFdID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9TVE9QQ0xLMik7CisKKwlzd2l0Y2ggKHN0YXRlLT5kZWxzeXMpIHsKKwljYXNlIFNZU19EVkJTOgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkRlbGl2ZXJ5IFN5c3RlbSAtLSBEVkItUyIpOworCQkvKiBGRUNNL1ZpdGVyYmkgT04JKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9SU1ZEMCwgcmVnLCAwKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9WSVRFUkJJX09OLCByZWcsIDEpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNLCByZWcpOworCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1JTVUxDLCAweGIxKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVFNVTEMsIDB4NDApOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9SU0xMQywgMHg0Mik7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTTFBMLCAweDEyKTsKKworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUyk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEZSRVNMRFBDLCByZWcsIDEpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMsIHJlZyk7CisKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DSEs4UFNLLCBzdG9wX2Nsa1swXSwgMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tGRUMxMDgsIHN0b3BfY2xrWzBdLCAxKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS0ZFQzIxNiwgc3RvcF9jbGtbMF0sIDEpOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tQS0RMSU4xMDgsIHN0b3BfY2xrWzFdLCAxKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS1BLRExJTjIxNiwgc3RvcF9jbGtbMV0sIDEpOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tJTlRCVUYyMTYsIHN0b3BfY2xrWzBdLCAxKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS0NPUkUyMTYsIHN0b3BfY2xrWzBdLCAwKTsKKworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTVE9QX0NLUzJETUQxMDgsIHN0b3BfY2xrWzFdLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCS8qIEZFQ00vVml0ZXJiaSBPRkYJKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9SU1ZEMCwgcmVnLCAwKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9WSVRFUkJJX09OLCByZWcsIDApOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNLCByZWcpOworCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1JTVUxDLCAweGIxKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVFNVTEMsIDB4NDIpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9SU0xMQywgMHg0MCk7CisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1RTTFBMLCAweDAyKTsKKworCQlyZWcgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X1RTVFJFUyk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKEZSRVNMRFBDLCByZWcsIDApOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMsIHJlZyk7CisKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DSEs4UFNLLCBzdG9wX2Nsa1swXSwgMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tGRUMxMDgsIHN0b3BfY2xrWzBdLCAwKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS0ZFQzIxNiwgc3RvcF9jbGtbMF0sIDApOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tQS0RMSU4xMDgsIHN0b3BfY2xrWzFdLCAwKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS1BLRExJTjIxNiwgc3RvcF9jbGtbMV0sIDApOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tJTlRCVUYyMTYsIHN0b3BfY2xrWzBdLCAwKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS0NPUkUyMTYsIHN0b3BfY2xrWzBdLCAwKTsKKworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTVE9QX0NLUzJETUQxMDgsIHN0b3BfY2xrWzFdLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfRFNTOgorCQkvKiBGRUNNL1ZpdGVyYmkgT04JKi8KKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9SU1ZEMCwgcmVnLCAxKTsKKwkJU1RCMDg5OV9TRVRGSUVMRF9WQUwoRkVDTV9WSVRFUkJJX09OLCByZWcsIDEpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9GRUNNLCByZWcpOworCisJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X1JTVUxDLCAweGExKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVFNVTEMsIDB4NjEpOworCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9SU0xMQywgMHg0Mik7CisKKwkJcmVnID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9UU1RSRVMpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChGUkVTTERQQywgcmVnLCAxKTsKKwkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfVFNUUkVTLCByZWcpOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0hLOFBTSywgc3RvcF9jbGtbMF0sIDEpOworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTVE9QX0NLRkVDMTA4LCBzdG9wX2Nsa1swXSwgMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tGRUMyMTYsIHN0b3BfY2xrWzBdLCAxKTsKKworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTVE9QX0NLUEtETElOMTA4LCBzdG9wX2Nsa1sxXSwgMSk7CisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tQS0RMSU4yMTYsIHN0b3BfY2xrWzFdLCAxKTsKKworCQlTVEIwODk5X1NFVEZJRUxEX1ZBTChTVE9QX0NLQ09SRTIxNiwgc3RvcF9jbGtbMF0sIDApOworCisJCVNUQjA4OTlfU0VURklFTERfVkFMKFNUT1BfQ0tTMkRNRDEwOCwgc3RvcF9jbGtbMV0sIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9FUlJPUiwgMSwgIlVuc3VwcG9ydGVkIGRlbGl2ZXJ5IHN5c3RlbSIpOworCQlicmVhazsKKwl9CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoU1RPUF9DS0FEQ0kxMDgsIHN0b3BfY2xrWzBdLCAwKTsKKwlzdGIwODk5X3dyaXRlX3JlZ3Moc3RhdGUsIFNUQjA4OTlfU1RPUENMSzEsIHN0b3BfY2xrLCAyKTsKK30KKworLyoKKyAqIHN0YjA4OTlfc2V0X2l0ZXJhdGlvbnMKKyAqIHNldCB0aGUgTERQQyBpdGVyYXRpb24gc2NhbGUgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgc3RiMDg5OV9zZXRfaXRlcmF0aW9ucyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgKmludGVybmFsID0gJnN0YXRlLT5pbnRlcm5hbDsKKwlzdHJ1Y3Qgc3RiMDg5OV9jb25maWcgKmNvbmZpZyA9IHN0YXRlLT5jb25maWc7CisKKwlzMzIgaXRlcl9zY2FsZTsKKwl1MzIgcmVnOworCisJaXRlcl9zY2FsZSA9IDE3ICogKGludGVybmFsLT5tYXN0ZXJfY2xrIC8gMTAwMCk7CisJaXRlcl9zY2FsZSArPSA0MTAwMDA7CisJaXRlcl9zY2FsZSAvPSAoaW50ZXJuYWwtPnNyYXRlIC8gMTAwMDAwMCk7CisJaXRlcl9zY2FsZSAvPSAxMDAwOworCisJaWYgKGl0ZXJfc2NhbGUgPiBjb25maWctPmxkcGNfbWF4X2l0ZXIpCisJCWl0ZXJfc2NhbGUgPSBjb25maWctPmxkcGNfbWF4X2l0ZXI7CisKKwlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBNQVhfSVRFUik7CisJU1RCMDg5OV9TRVRGSUVMRF9WQUwoTUFYX0lURVJBVElPTlMsIHJlZywgaXRlcl9zY2FsZSk7CisJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfTUFYX0lURVIsIFNUQjA4OTlfT0ZGMF9NQVhfSVRFUiwgcmVnKTsKK30KKworc3RhdGljIGVudW0gZHZiZmVfc2VhcmNoIHN0YjA4OTlfc2VhcmNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHN0YjA4OTlfcGFyYW1zICppX3BhcmFtcyA9ICZzdGF0ZS0+cGFyYW1zOworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqcHJvcHMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKworCXUzMiBTZWFyY2hSYW5nZSwgZ2FpbjsKKworCWlfcGFyYW1zLT5mcmVxCT0gcC0+ZnJlcXVlbmN5OworCWlfcGFyYW1zLT5zcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKKwlzdGF0ZS0+ZGVsc3lzID0gcHJvcHMtPmRlbGl2ZXJ5X3N5c3RlbTsKKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgImRlbGl2ZXJ5IHN5c3RlbT0lZCIsIHN0YXRlLT5kZWxzeXMpOworCisJU2VhcmNoUmFuZ2UgPSAxMDAwMDAwMDsKKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkZyZXF1ZW5jeT0lZCwgU3JhdGU9JWQiLCBpX3BhcmFtcy0+ZnJlcSwgaV9wYXJhbXMtPnNyYXRlKTsKKwkvKiBjaGVja2luZyBTZWFyY2ggUmFuZ2UgaXMgbWVhbmluZ2xlc3MgZm9yIGEgZml4ZWQgMyBNaHoJCQkqLworCWlmIChJTlJBTkdFKGlfcGFyYW1zLT5zcmF0ZSwgMTAwMDAwMCwgNDUwMDAwMDApKSB7CisJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiUGFyYW1ldGVycyBJTiBSQU5HRSIpOworCQlzdGIwODk5X3NldF9kZWxpdmVyeShzdGF0ZSk7CisKKwkJaWYgKHN0YXRlLT5jb25maWctPnR1bmVyX3NldF9yZnNpZ2dhaW4pIHsKKwkJCWlmIChpbnRlcm5hbC0+c3JhdGUgPiAxNTAwMDAwMCkKKwkJCQlnYWluID0gIDg7IC8qIDE1TWIgPCBzcmF0ZSA8IDQ1TWIsIGdhaW4gPSA4ZEIJKi8KKwkJCWVsc2UgaWYgKGludGVybmFsLT5zcmF0ZSA+IDUwMDAwMDApCisJCQkJZ2FpbiA9IDEyOyAvKiAgNU1iIDwgc3JhdGUgPCAxNU1iLCBnYWluID0gMTJkQgkqLworCQkJZWxzZQorCQkJCWdhaW4gPSAxNDsgLyogIDFNYiA8IHNyYXRlIDwgIDVNYiwgZ2FpbiA9IDE0ZGIJKi8KKwkJCXN0YXRlLT5jb25maWctPnR1bmVyX3NldF9yZnNpZ2dhaW4oZmUsIGdhaW4pOworCQl9CisKKwkJaWYgKGlfcGFyYW1zLT5zcmF0ZSA8PSA1MDAwMDAwKQorCQkJc3RiMDg5OV9zZXRfbWNsayhzdGF0ZSwgY29uZmlnLT5sb19jbGspOworCQllbHNlCisJCQlzdGIwODk5X3NldF9tY2xrKHN0YXRlLCBjb25maWctPmhpX2Nsayk7CisKKwkJc3dpdGNoIChzdGF0ZS0+ZGVsc3lzKSB7CisJCWNhc2UgU1lTX0RWQlM6CisJCWNhc2UgU1lTX0RTUzoKKwkJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiRFZCLVMgZGVsaXZlcnkgc3lzdGVtIik7CisJCQlpbnRlcm5hbC0+ZnJlcQk9IGlfcGFyYW1zLT5mcmVxOworCQkJaW50ZXJuYWwtPnNyYXRlCT0gaV9wYXJhbXMtPnNyYXRlOworCQkJLyoKKwkJCSAqIHNlYXJjaCA9IHVzZXIgc2VhcmNoIHJhbmdlICsKKwkJCSAqCSAgICA1MDBLaHogKworCQkJICoJICAgIDIgKiBUdW5lcl9zdGVwX3NpemUgKworCQkJICoJICAgIDEwJSBvZiB0aGUgc3ltYm9sIHJhdGUKKwkJCSAqLworCQkJaW50ZXJuYWwtPnNyY2hfcmFuZ2UJPSBTZWFyY2hSYW5nZSArIDE1MDAwMDAgKyAoaV9wYXJhbXMtPnNyYXRlIC8gNSk7CisJCQlpbnRlcm5hbC0+ZGVyb3RfcGVyY2VudAk9IDMwOworCisJCQkvKiBXaGF0IHRvIGRvIGZvciB0dW5lcnMgaGF2aW5nIG5vIGJhbmR3aWR0aCBzZXR1cCA/CSovCisJCQkvKiBlbmFibGUgdHVuZXIgSS9PICovCisJCQlzdGIwODk5X2kyY19nYXRlX2N0cmwoJnN0YXRlLT5mcm9udGVuZCwgMSk7CisKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9zZXRfYmFuZHdpZHRoKQorCQkJCXN0YXRlLT5jb25maWctPnR1bmVyX3NldF9iYW5kd2lkdGgoZmUsICgxMyAqIChzdGIwODk5X2NhcnJfd2lkdGgoc3RhdGUpICsgU2VhcmNoUmFuZ2UpKSAvIDEwKTsKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9nZXRfYmFuZHdpZHRoKQorCQkJCXN0YXRlLT5jb25maWctPnR1bmVyX2dldF9iYW5kd2lkdGgoZmUsICZpbnRlcm5hbC0+dHVuZXJfYncpOworCisJCQkvKiBkaXNhYmxlIHR1bmVyIEkvTyAqLworCQkJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDApOworCisJCQkvKiBTZXQgRFZCLVMxIEFHQwkJKi8KKwkJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0FHQ1JGQ0ZHLCAweDExKTsKKworCQkJLyogUnVuIHRoZSBzZWFyY2ggYWxnb3JpdGhtCSovCisJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgInJ1bm5pbmcgRFZCLVMgc2VhcmNoIGFsZ28gLi4iKTsKKwkJCWlmIChzdGIwODk5X2R2YnNfYWxnbyhzdGF0ZSkJPT0gUkFOR0VPSykgeworCQkJCWludGVybmFsLT5sb2NrCQk9IDE7CisJCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsCisJCQkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBEVkItUyBMT0NLICEiKTsKKworLy8JCQkJc3RiMDg5OV93cml0ZV9yZWcoc3RhdGUsIFNUQjA4OTlfRVJSQ1RSTDEsIDB4M2QpOyAvKiBWaXRlcmJpIEVycm9ycwkqLworLy8JCQkJaW50ZXJuYWwtPnZfc3RhdHVzID0gc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9WU1RBVFVTKTsKKy8vCQkJCWludGVybmFsLT5lcnJfY3RybCA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfRVJSQ1RSTDEpOworLy8JCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJWU1RBVFVTPTB4JTAyeCIsIGludGVybmFsLT52X3N0YXR1cyk7CisvLwkJCQlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkVSUl9DVFJMPTB4JTAyeCIsIGludGVybmFsLT5lcnJfY3RybCk7CisKKwkJCQlyZXR1cm4gRFZCRkVfQUxHT19TRUFSQ0hfU1VDQ0VTUzsKKwkJCX0gZWxzZSB7CisJCQkJaW50ZXJuYWwtPmxvY2sJCT0gMDsKKworCQkJCXJldHVybiBEVkJGRV9BTEdPX1NFQVJDSF9GQUlMRUQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTWVNfRFZCUzI6CisJCQlpbnRlcm5hbC0+ZnJlcQkJCT0gaV9wYXJhbXMtPmZyZXE7CisJCQlpbnRlcm5hbC0+c3JhdGUJCQk9IGlfcGFyYW1zLT5zcmF0ZTsKKwkJCWludGVybmFsLT5zcmNoX3JhbmdlCQk9IFNlYXJjaFJhbmdlOworCisJCQkvKiBlbmFibGUgdHVuZXIgSS9PICovCisJCQlzdGIwODk5X2kyY19nYXRlX2N0cmwoJnN0YXRlLT5mcm9udGVuZCwgMSk7CisKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9zZXRfYmFuZHdpZHRoKQorCQkJCXN0YXRlLT5jb25maWctPnR1bmVyX3NldF9iYW5kd2lkdGgoZmUsIChzdGIwODk5X2NhcnJfd2lkdGgoc3RhdGUpICsgU2VhcmNoUmFuZ2UpKTsKKwkJCWlmIChzdGF0ZS0+Y29uZmlnLT50dW5lcl9nZXRfYmFuZHdpZHRoKQorCQkJCXN0YXRlLT5jb25maWctPnR1bmVyX2dldF9iYW5kd2lkdGgoZmUsICZpbnRlcm5hbC0+dHVuZXJfYncpOworCisJCQkvKiBkaXNhYmxlIHR1bmVyIEkvTyAqLworCQkJc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKCZzdGF0ZS0+ZnJvbnRlbmQsIDApOworCisvLwkJCXBQYXJhbXMtPlNwZWN0cmFsSW52CQk9IHBTZWFyY2gtPklRX0ludmVyc2lvbjsKKworCQkJLyogU2V0IERWQi1TMiBBR0MJCSovCisJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9BR0NSRkNGRywgMHgxYyk7CisKKwkJCS8qIFNldCBJdGVyU2NhbGUgPWYoTUNMSyxTWU1CKQkqLworCQkJc3RiMDg5OV9zZXRfaXRlcmF0aW9ucyhzdGF0ZSk7CisKKwkJCS8qIFJ1biB0aGUgc2VhcmNoIGFsZ29yaXRobQkqLworCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfREVCVUcsIDEsICJydW5uaW5nIERWQi1TMiBzZWFyY2ggYWxnbyAuLiIpOworCQkJaWYgKHN0YjA4OTlfZHZiczJfYWxnbyhzdGF0ZSkJPT0gRFZCUzJfRkVDX0xPQ0spIHsKKwkJCQlpbnRlcm5hbC0+bG9jawkJPSAxOworCQkJCWRwcmludGsoc3RhdGUtPnZlcmJvc2UsIEZFX0RFQlVHLCAxLAorCQkJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRFZCLVMyIExPQ0sgISIpOworCisvLwkJCQlzdGIwODk5X3dyaXRlX3JlZyhzdGF0ZSwgU1RCMDg5OV9FUlJDVFJMMSwgMHhiNik7IC8qIFBhY2tldCBFcnJvcnMJKi8KKy8vCQkJCWludGVybmFsLT52X3N0YXR1cyA9IHN0YjA4OTlfcmVhZF9yZWcoc3RhdGUsIFNUQjA4OTlfVlNUQVRVUyk7CisvLwkJCQlpbnRlcm5hbC0+ZXJyX2N0cmwgPSBzdGIwODk5X3JlYWRfcmVnKHN0YXRlLCBTVEIwODk5X0VSUkNUUkwxKTsKKworCQkJCXJldHVybiBEVkJGRV9BTEdPX1NFQVJDSF9TVUNDRVNTOworCQkJfSBlbHNlIHsKKwkJCQlpbnRlcm5hbC0+bG9jawkJPSAwOworCisJCQkJcmV0dXJuIERWQkZFX0FMR09fU0VBUkNIX0ZBSUxFRDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50ayhzdGF0ZS0+dmVyYm9zZSwgRkVfRVJST1IsIDEsICJVbnN1cHBvcnRlZCBkZWxpdmVyeSBzeXN0ZW0iKTsKKwkJCXJldHVybiBEVkJGRV9BTEdPX1NFQVJDSF9JTlZBTElEOworCQl9CisJfQorCisJcmV0dXJuIERWQkZFX0FMR09fU0VBUkNIX0VSUk9SOworfQorLyoKKyAqIHN0YjA4OTlfdHJhY2sKKyAqIHBlcmlvZGljYWxseSBjaGVjayB0aGUgc2lnbmFsIGxldmVsIGFnYWluc3QgYSBzcGVjaWZpZWQKKyAqIHRocmVzaG9sZCBsZXZlbCBhbmQgcGVyZm9ybSBkZXJvdGF0b3IgY2VudGVyaW5nLgorICogY2FsbGVkIG9uY2Ugd2UgaGF2ZSBhIGxvY2sgZnJvbSBhIHN1Y2Nlc2Z1bCBzZWFyY2gKKyAqIGV2ZW50LgorICoKKyAqIFdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseSBjYWxsZWQgdG8gbWFpbnRhaW4gdGhlCisgKiBsb2NrLgorICoKKyAqIFdpbGwgYmUgdXNlZCB0byBnZXQgcGFyYW1ldGVycyBhcyB3ZWxsIGFzIGluZm8gZnJvbQorICogdGhlIGRlY29kZWQgYmFzZWJhbmQgaGVhZGVyCisgKgorICogT25jZSBhIG5ldyBsb2NrIGhhcyBlc3RhYmxpc2hlZCwgdGhlIGludGVybmFsIHN0YXRlCisgKiBmcmVxdWVuY3kgKGludGVybmFsLT5mcmVxKSBpcyB1cGRhdGVkCisgKi8KK3N0YXRpYyBpbnQgc3RiMDg5OV90cmFjayhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjA4OTlfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlCQk9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbAk9ICZzdGF0ZS0+aW50ZXJuYWw7CisKKwlkcHJpbnRrKHN0YXRlLT52ZXJib3NlLCBGRV9ERUJVRywgMSwgIkdldCBwYXJhbXMiKTsKKwlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBpbnRlcm5hbC0+c3JhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gZHZiZmVfYWxnbyBzdGIwODk5X2Zyb250ZW5kX2FsZ28oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIERWQkZFX0FMR09fQ1VTVE9NOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgc3RiMDg5OV9vcHMgPSB7CisKKwkuaW5mbyA9IHsKKwkJLm5hbWUgCQkJPSAiU1RCMDg5OSBNdWx0aXN0YW5kYXJkIiwKKwkJLnR5cGUgCQkJPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbgkJPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4IAkJPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gMCwKKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UJPSAwLAorCQkuc3ltYm9sX3JhdGVfbWluIAk9ICA1MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4IAk9IDQ1MDAwMDAwLAorCisJCS5jYXBzIAkJCT0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPCXwKKwkJCQkJICBGRV9DQU5fRkVDX0FVVE8JfAorCQkJCQkgIEZFX0NBTl9RUFNLCisJfSwKKworCS5yZWxlYXNlCQkJPSBzdGIwODk5X3JlbGVhc2UsCisJLmluaXQJCQkJPSBzdGIwODk5X2luaXQsCisJLnNsZWVwCQkJCT0gc3RiMDg5OV9zbGVlcCwKKy8vCS53YWtldXAJCQkJPSBzdGIwODk5X3dha2V1cCwKKworCS5pMmNfZ2F0ZV9jdHJsCQkJPSBzdGIwODk5X2kyY19nYXRlX2N0cmwsCisKKwkuZ2V0X2Zyb250ZW5kX2FsZ28JCT0gc3RiMDg5OV9mcm9udGVuZF9hbGdvLAorCS5zZWFyY2gJCQkJPSBzdGIwODk5X3NlYXJjaCwKKwkudHJhY2sJCQkJPSBzdGIwODk5X3RyYWNrLAorCS5nZXRfZnJvbnRlbmQJCQk9IHN0YjA4OTlfZ2V0X2Zyb250ZW5kLAorCisKKwkucmVhZF9zdGF0dXMJCQk9IHN0YjA4OTlfcmVhZF9zdGF0dXMsCisJLnJlYWRfc25yCQkJPSBzdGIwODk5X3JlYWRfc25yLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aAkJPSBzdGIwODk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX2JlcgkJCT0gc3RiMDg5OV9yZWFkX2JlciwKKworCS5zZXRfdm9sdGFnZQkJCT0gc3RiMDg5OV9zZXRfdm9sdGFnZSwKKwkuc2V0X3RvbmUJCQk9IHN0YjA4OTlfc2V0X3RvbmUsCisKKwkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZAkJPSBzdGIwODk5X3NlbmRfZGlzZXFjX21zZywKKwkuZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHkJPSBzdGIwODk5X3JlY3Zfc2xhdmVfcmVwbHksCisJLmRpc2VxY19zZW5kX2J1cnN0CQk9IHN0YjA4OTlfc2VuZF9kaXNlcWNfYnVyc3QsCit9OworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdGIwODk5X2F0dGFjaChzdHJ1Y3Qgc3RiMDg5OV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwllbnVtIHN0YjA4OTlfaW52ZXJzaW9uIGludmVyc2lvbjsKKworCXN0YXRlID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCBzdGIwODk5X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwlpbnZlcnNpb24JCQkJPSBjb25maWctPmludmVyc2lvbjsKKwlzdGF0ZS0+dmVyYm9zZQkJCQk9ICZ2ZXJib3NlOworCXN0YXRlLT5jb25maWcJCQkJPSBjb25maWc7CisJc3RhdGUtPmkyYwkJCQk9IGkyYzsKKwlzdGF0ZS0+ZnJvbnRlbmQub3BzCQkJPSBzdGIwODk5X29wczsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdgk9IHN0YXRlOworCXN0YXRlLT5pbnRlcm5hbC5pbnZlcnNpb24JCT0gaW52ZXJzaW9uOworCisJc3RiMDg5OV93YWtldXAoJnN0YXRlLT5mcm9udGVuZCk7CisJaWYgKHN0YjA4OTlfZ2V0X2Rldl9pZChzdGF0ZSkgPT0gLUVOT0RFVikgeworCQlwcmludGsoIiVzOiBFeGl0aW5nIC4uICFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwcmludGsoIiVzOiBBdHRhY2hpbmcgU1RCMDg5OSBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKKworZXJyb3I6CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzdGIwODk5X2F0dGFjaCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJTZXQgVmVyYm9zaXR5IGxldmVsIik7CitNT0RVTEVfQVVUSE9SKCJNYW51IEFicmFoYW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1RCMDg5OSBNdWx0aS1TdGQgZnJvbnRlbmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiMjAwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorCVNUQjA4OTkgTXVsdGlzdGFuZGFyZCBGcm9udGVuZCBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fU1RCMDg5OV9EUlZfSAorI2RlZmluZSBfX1NUQjA4OTlfRFJWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNkZWZpbmUgU1RCMDg5OV9UU01PREVfU0VSSUFMCQkxCisjZGVmaW5lIFNUQjA4OTlfQ0xLUE9MX0ZBTExJTkcJCTIKKyNkZWZpbmUgU1RCMDg5OV9DTEtOVUxMX1BBUklUWQkJMworI2RlZmluZSBTVEIwODk5X1NZTkNfRk9SQ0VECQk0CisjZGVmaW5lIFNUQjA4OTlfRkVDTU9ERV9EU1MJCTUKKworc3RydWN0IHN0YjA4OTlfczFfcmVnIHsKKwl1MTYJYWRkcmVzczsKKwl1OAlkYXRhOworfTsKKworc3RydWN0IHN0YjA4OTlfczJfcmVnIHsKKwl1MTYJb2Zmc2V0OworCXUzMgliYXNlX2FkZHJlc3M7CisJdTMyCWRhdGE7Cit9OworCitlbnVtIHN0YjA4OTlfaW52ZXJzaW9uIHsKKwlJUV9TV0FQX09GRgk9IDAsCisJSVFfU1dBUF9PTiwKKwlJUV9TV0FQX0FVVE8KK307CisKKyNkZWZpbmUgU1RCMDg5OV9HUElPMDAJCQkJMHhmMTQwCisjZGVmaW5lIFNUQjA4OTlfR1BJTzAxCQkJCTB4ZjE0MQorI2RlZmluZSBTVEIwODk5X0dQSU8wMgkJCQkweGYxNDIKKyNkZWZpbmUgU1RCMDg5OV9HUElPMDMJCQkJMHhmMTQzCisjZGVmaW5lIFNUQjA4OTlfR1BJTzA0CQkJCTB4ZjE0NAorI2RlZmluZSBTVEIwODk5X0dQSU8wNQkJCQkweGYxNDUKKyNkZWZpbmUgU1RCMDg5OV9HUElPMDYJCQkJMHhmMTQ2CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA3CQkJCTB4ZjE0NworI2RlZmluZSBTVEIwODk5X0dQSU8wOAkJCQkweGYxNDgKKyNkZWZpbmUgU1RCMDg5OV9HUElPMDkJCQkJMHhmMTQ5CisjZGVmaW5lIFNUQjA4OTlfR1BJTzEwCQkJCTB4ZjE0YQorI2RlZmluZSBTVEIwODk5X0dQSU8xMQkJCQkweGYxNGIKKyNkZWZpbmUgU1RCMDg5OV9HUElPMTIJCQkJMHhmMTRjCisjZGVmaW5lIFNUQjA4OTlfR1BJTzEzCQkJCTB4ZjE0ZAorI2RlZmluZSBTVEIwODk5X0dQSU8xNAkJCQkweGYxNGUKKyNkZWZpbmUgU1RCMDg5OV9HUElPMTUJCQkJMHhmMTRmCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE2CQkJCTB4ZjE1MAorI2RlZmluZSBTVEIwODk5X0dQSU8xNwkJCQkweGYxNTEKKyNkZWZpbmUgU1RCMDg5OV9HUElPMTgJCQkJMHhmMTUyCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE5CQkJCTB4ZjE1MworI2RlZmluZSBTVEIwODk5X0dQSU8yMAkJCQkweGYxNTQKKworI2RlZmluZSBTVEIwODk5X0dQSU9QVUxMVVAJCQkweDAxIC8qIE91dHB1dCBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIFZkZCAqLworI2RlZmluZSBTVEIwODk5X0dQSU9QVUxMRE4JCQkweDAwIC8qIE91dHB1dCBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIFZzcyAqLworCisjZGVmaW5lIFNUQjA4OTlfUE9TVFBST0NfR1BJT19QT1dFUgkJMHgwMAorI2RlZmluZSBTVEIwODk5X1BPU1RQUk9DX0dQSU9fTE9DSwkJMHgwMQorCisvKgorICogUG9zdCBwcm9jZXNzIG91dHB1dCBjb25maWd1cmF0aW9uIGNvbnRyb2wKKyAqIDEuIFBPV0VSIE9OL09GRgkJKGluZGV4IDApCisgKiAyLiBGRV9IQVNfTE9DSy9MT0NLX0xPU1MJKGluZGV4IDEpCisgKgorICogQGdwaW8gCT0gb25lIG9mIHRoZSBhYm92ZSBsaXN0ZWQgR1BJTydzCisgKiBAbGV2ZWwJPSBvdXRwdXQgc3RhdGU6IHB1bGxlZCB1cCBvciBsb3cKKyAqLworc3RydWN0IHN0YjA4OTlfcG9zdHByb2MgeworCXUxNglncGlvOworCXU4CWxldmVsOworfTsKKworc3RydWN0IHN0YjA4OTlfY29uZmlnIHsKKwljb25zdCBzdHJ1Y3Qgc3RiMDg5OV9zMV9yZWcJKmluaXRfZGV2OworCWNvbnN0IHN0cnVjdCBzdGIwODk5X3MyX3JlZwkqaW5pdF9zMl9kZW1vZDsKKwljb25zdCBzdHJ1Y3Qgc3RiMDg5OV9zMV9yZWcJKmluaXRfczFfZGVtb2Q7CisJY29uc3Qgc3RydWN0IHN0YjA4OTlfczJfcmVnCSppbml0X3MyX2ZlYzsKKwljb25zdCBzdHJ1Y3Qgc3RiMDg5OV9zMV9yZWcJKmluaXRfdHN0OworCisJY29uc3Qgc3RydWN0IHN0YjA4OTlfcG9zdHByb2MJKnBvc3Rwcm9jOworCisJZW51bSBzdGIwODk5X2ludmVyc2lvbgkJaW52ZXJzaW9uOworCisJdTMyCXh0YWxfZnJlcTsKKworCXU4CWRlbW9kX2FkZHJlc3M7CisJdTgJdHNfb3V0cHV0X21vZGU7CisJdTgJYmxvY2tfc3luY19tb2RlOworCXU4CXRzX3BmYml0X3RvZ2dsZTsKKworCXU4CWNsb2NrX3BvbGFyaXR5OworCXU4CWRhdGFfY2xrX3Bhcml0eTsKKwl1OAlmZWNfbW9kZTsKKwl1OAlkYXRhX291dHB1dF9jdGw7CisJdTgJZGF0YV9maWZvX21vZGU7CisJdTgJb3V0X3JhdGVfY29tcDsKKwl1OAlpMmNfcmVwZWF0ZXI7CisvLwlpbnQJaW52ZXJzaW9uOworCWludAlsb19jbGs7CisJaW50CWhpX2NsazsKKworCXUzMgllc25vX2F2ZTsKKwl1MzIJZXNub19xdWFudDsKKwl1MzIJYXZmcmFtZXNfY29hcnNlOworCXUzMglhdmZyYW1lc19maW5lOworCXUzMgltaXNzX3RocmVzaG9sZDsKKwl1MzIJdXdwX3RocmVzaG9sZF9hY3E7CisJdTMyCXV3cF90aHJlc2hvbGRfdHJhY2s7CisJdTMyCXV3cF90aHJlc2hvbGRfc29mOworCXUzMglzb2Zfc2VhcmNoX3RpbWVvdXQ7CisKKwl1MzIJYnRyX25jb19iaXRzOworCXUzMglidHJfZ2Fpbl9zaGlmdF9vZmZzZXQ7CisJdTMyCWNybF9uY29fYml0czsKKwl1MzIJbGRwY19tYXhfaXRlcjsKKworCWludCAoKnR1bmVyX3NldF9mcmVxdWVuY3kpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgZnJlcXVlbmN5KTsKKwlpbnQgKCp0dW5lcl9nZXRfZnJlcXVlbmN5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpOworCWludCAoKnR1bmVyX3NldF9iYW5kd2lkdGgpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgYmFuZHdpZHRoKTsKKwlpbnQgKCp0dW5lcl9nZXRfYmFuZHdpZHRoKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiYW5kd2lkdGgpOworCWludCAoKnR1bmVyX3NldF9yZnNpZ2dhaW4pKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgcmZfZ2Fpbik7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUQjA4OTkpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfU1RCMDg5OV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnN0YjA4OTlfYXR0YWNoKHN0cnVjdCBzdGIwODk5X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqc3RiMDg5OV9hdHRhY2goc3RydWN0IHN0YjA4OTlfY29uZmlnICpjb25maWcsCisJCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYgLy9DT05GSUdfRFZCX1NUQjA4OTkKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYxOWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfcHJpdi5oCkBAIC0wLDAgKzEsMjY3IEBACisvKgorCVNUQjA4OTkgTXVsdGlzdGFuZGFyZCBGcm9udGVuZCBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fU1RCMDg5OV9QUklWX0gKKyNkZWZpbmUgX19TVEIwODk5X1BSSVZfSAorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAic3RiMDg5OV9kcnYuaCIKKworI2RlZmluZSBGRV9FUlJPUgkJCQkwCisjZGVmaW5lIEZFX05PVElDRQkJCQkxCisjZGVmaW5lIEZFX0lORk8JCQkJCTIKKyNkZWZpbmUgRkVfREVCVUcJCQkJMworI2RlZmluZSBGRV9ERUJVR1JFRwkJCQk0CisKKyNkZWZpbmUgZHByaW50ayh4LCB5LCB6LCBmb3JtYXQsIGFyZy4uLikgZG8gewkJCQkJCVwKKwlpZiAoeikgewkJCQkJCQkJCVwKKwkJaWYJKCgqeCA+IEZFX0VSUk9SKSAmJiAoKnggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fICwgIyNhcmcpOwkJXAorCQllbHNlIGlmCSgoKnggPiBGRV9OT1RJQ0UpICYmICgqeCA+IHkpKQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjI2FyZyk7CVwKKwkJZWxzZSBpZiAoKCp4ID4gRkVfSU5GTykgJiYgKCp4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjI2FyZyk7CQlcCisJCWVsc2UgaWYgKCgqeCA+IEZFX0RFQlVHKSAmJiAoKnggPiB5KSkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjI2FyZyk7CVwKKwl9IGVsc2UgewkJCQkJCQkJCVwKKwkJaWYgKCp4ID4geSkJCQkJCQkJCVwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJnKTsJCQkJCQlcCisJfQkJCQkJCQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgSU5SQU5HRSh2YWwsIHgsIHkpCQkJKCgoeCA8PSB2YWwpICYmICh2YWwgPD0geSkpIHx8CQlcCisJCQkJCQkgKCh5IDw9IHZhbCkgJiYgKHZhbCA8PSB4KSkgPyAxIDogMCkKKworI2RlZmluZSBCWVRFMAkJCQkJMAorI2RlZmluZSBCWVRFMQkJCQkJOAorI2RlZmluZSBCWVRFMgkJCQkJMTYKKyNkZWZpbmUgQllURTMJCQkJCTI0CisKKyNkZWZpbmUgR0VUQllURSh4LCB5KQkJCQkoKCh4KSA+PiAoeSkpICYgMHhmZikKKyNkZWZpbmUgTUFLRVdPUkQzMihhLCBiLCBjLCBkKQkJCSgoKGEpIDw8IDI0KSB8ICgoYikgPDwgMTYpIHwgKChjKSA8PCA4KSB8IChkKSkKKyNkZWZpbmUgTUFLRVdPUkQxNihhLCBiKQkJCSgoKGEpIDw8IDgpIHwgKGIpKQorCisjZGVmaW5lIE1JTih4LCB5KQkJCQkoKHgpIDw9ICh5KSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgTUFYKHgsIHkpCQkJCSgoeCkgPj0gKHkpID8gKHgpIDogKHkpKQorI2RlZmluZSBBQlMoeCkJCQkJCSgoeCkgPj0gMCA/ICh4KSA6IC0oeCkpCisKKyNkZWZpbmUgTFNCKHgpCQkJCQkoKHggJiAweGZmKSkKKyNkZWZpbmUgTVNCKHkpCQkJCQkoKHkgPj4gOCkgJiAweGZmKQorCisKKyNkZWZpbmUgU1RCMDg5OV9HRVRGSUVMRChiaXRmLCB2YWwpCQkoKHZhbCA+PiBTVEIwODk5X09GRlNUXyMjYml0ZikgJiAoKDEgPDwgU1RCMDg5OV9XSURUSF8jI2JpdGYpIC0gMSkpCisKKworI2RlZmluZSBTVEIwODk5X1NFVEZJRUxEKG1hc2ssIHZhbCwgd2lkdGgsIG9mZnNldCkgICAgICAobWFzayAmICh+KCgoMSA8PCB3aWR0aCkgLSAxKSA8PAlcCisJCQkJCQkJIG9mZnNldCkpKSB8ICgodmFsICYJCQlcCisJCQkJCQkJICgoMSA8PCB3aWR0aCkgLSAxKSkgPDwgb2Zmc2V0KQorCisjZGVmaW5lIFNUQjA4OTlfU0VURklFTERfVkFMKGJpdGYsIG1hc2ssIHZhbCkJKG1hc2sgPSAobWFzayAmICh+KCgoMSA8PCBTVEIwODk5X1dJRFRIXyMjYml0ZikgLSAxKSA8PFwKKwkJCQkJCQkgU1RCMDg5OV9PRkZTVF8jI2JpdGYpKSkgfCBcCisJCQkJCQkJICh2YWwgPDwgU1RCMDg5OV9PRkZTVF8jI2JpdGYpKQorCisKK2VudW0gc3RiMDg5OV9zdGF0dXMgeworCU5PQUdDMQk9IDAsCisJQUdDMU9LLAorCU5PVElNSU5HLAorCUFOQUxPR0NBUlJJRVIsCisJVElNSU5HT0ssCisJTk9BR0MyLAorCUFHQzJPSywKKwlOT0NBUlJJRVIsCisJQ0FSUklFUk9LLAorCU5PREFUQSwKKwlGQUxTRUxPQ0ssCisJREFUQU9LLAorCU9VVE9GUkFOR0UsCisJUkFOR0VPSywKKwlEVkJTMl9ERU1PRF9MT0NLLAorCURWQlMyX0RFTU9EX05PTE9DSywKKwlEVkJTMl9GRUNfTE9DSywKKwlEVkJTMl9GRUNfTk9MT0NLCit9OworCitlbnVtIHN0YjA4OTlfbW9kY29kIHsKKwlTVEIwODk5X0RVTU1ZX1BMRiwKKwlTVEIwODk5X1FQU0tfMTQsCisJU1RCMDg5OV9RUFNLXzEzLAorCVNUQjA4OTlfUVBTS18yNSwKKwlTVEIwODk5X1FQU0tfMTIsCisJU1RCMDg5OV9RUFNLXzM1LAorCVNUQjA4OTlfUVBTS18yMywKKwlTVEIwODk5X1FQU0tfMzQsCisJU1RCMDg5OV9RUFNLXzQ1LAorCVNUQjA4OTlfUVBTS181NiwKKwlTVEIwODk5X1FQU0tfODksCisJU1RCMDg5OV9RUFNLXzkxMCwKKwlTVEIwODk5XzhQU0tfMzUsCisJU1RCMDg5OV84UFNLXzIzLAorCVNUQjA4OTlfOFBTS18zNCwKKwlTVEIwODk5XzhQU0tfNTYsCisJU1RCMDg5OV84UFNLXzg5LAorCVNUQjA4OTlfOFBTS185MTAsCisJU1RCMDg5OV8xNkFQU0tfMjMsCisJU1RCMDg5OV8xNkFQU0tfMzQsCisJU1RCMDg5OV8xNkFQU0tfNDUsCisJU1RCMDg5OV8xNkFQU0tfNTYsCisJU1RCMDg5OV8xNkFQU0tfODksCisJU1RCMDg5OV8xNkFQU0tfOTEwLAorCVNUQjA4OTlfMzJBUFNLXzM0LAorCVNUQjA4OTlfMzJBUFNLXzQ1LAorCVNUQjA4OTlfMzJBUFNLXzU2LAorCVNUQjA4OTlfMzJBUFNLXzg5LAorCVNUQjA4OTlfMzJBUFNLXzkxMAorfTsKKworZW51bSBzdGIwODk5X2ZyYW1lIHsKKwlTVEIwODk5X0xPTkdfRlJBTUUsCisJU1RCMDg5OV9TSE9SVF9GUkFNRQorfTsKKworZW51bSBzdGIwODk5X2FscGhhIHsKKwlSUkNfMjAsCisJUlJDXzI1LAorCVJSQ18zNQorfTsKKworc3RydWN0IHN0YjA4OTlfdGFiIHsKKwlzMzIgcmVhbDsKKwlzMzIgcmVhZDsKK307CisKK2VudW0gc3RiMDg5OV9mZWMgeworCVNUQjA4OTlfRkVDXzFfMgkJCT0gMTMsCisJU1RCMDg5OV9GRUNfMl8zCQkJPSAxOCwKKwlTVEIwODk5X0ZFQ18zXzQJCQk9IDIxLAorCVNUQjA4OTlfRkVDXzVfNgkJCT0gMjQsCisJU1RCMDg5OV9GRUNfNl83CQkJPSAyNSwKKwlTVEIwODk5X0ZFQ183XzgJCQk9IDI2Cit9OworCitzdHJ1Y3Qgc3RiMDg5OV9wYXJhbXMgeworCXUzMglmcmVxOwkJCQkJLyogRnJlcXVlbmN5CSovCisJdTMyCXNyYXRlOwkJCQkJLyogU3ltYm9sIHJhdGUJKi8KKwllbnVtIGZlX2NvZGVfcmF0ZSBmZWNyYXRlOworfTsKKworc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwgeworCXUzMgkJCW1hc3Rlcl9jbGs7CisJdTMyCQkJZnJlcTsJCQkvKiBEZW1vZCBpbnRlcm5hbCBGcmVxdWVuY3kJCSovCisJdTMyCQkJc3JhdGU7CQkJLyogRGVtb2QgaW50ZXJuYWwgU3ltYm9sIHJhdGUJCSovCisJZW51bSBzdGIwODk5X2ZlYwlmZWNyYXRlOwkJLyogRGVtb2QgaW50ZXJuYWwgRkVDIHJhdGUJCSovCisJdTMyCQkJc3JjaF9yYW5nZTsJCS8qIERlbW9kIGludGVybmFsIFNlYXJjaCBSYW5nZQkJKi8KKwl1MzIJCQlzdWJfcmFuZ2U7CQkvKiBEZW1vZCBjdXJyZW50IHN1YiByYW5nZSAoSHopCQkqLworCXUzMgkJCXR1bmVyX3N0ZXA7CQkvKiBUdW5lciBzdGVwIChIeikJCQkqLworCXUzMgkJCXR1bmVyX29mZnN0OwkJLyogUmVsYXRpdmUgb2Zmc2V0IHRvIGNhcnJpZXIgKEh6KQkqLworCXUzMgkJCXR1bmVyX2J3OwkJLyogQ3VycmVudCBiYW5kd2lkdGggb2YgdGhlIHR1bmVyIChIeikJKi8KKworCXMzMgkJCW1jbGs7CQkJLyogTWFzdGVyY2xvY2sgRGl2aWRlciBmYWN0b3IgKGJpbmFyeSkJKi8KKwlzMzIJCQlyb2xsb2ZmOwkJLyogQ3VycmVudCBSb2xsT2ZmIG9mIHRoZSBmaWx0ZXIgKHgxMDApCSovCisKKwlzMTYJCQlkZXJvdF9mcmVxOwkJLyogQ3VycmVudCBkZXJvdGF0b3IgZnJlcXVlbmN5IChIeikJKi8KKwlzMTYJCQlkZXJvdF9wZXJjZW50OworCisJczE2CQkJZGlyZWN0aW9uOwkJLyogQ3VycmVudCBkZXJvdGF0b3Igc2VhcmNoIGRpcmVjdGlvbgkqLworCXMxNgkJCWRlcm90X3N0ZXA7CQkvKiBEZXJvdGF0b3Igc3RlcCAoYmluYXJ5IHZhbHVlKQkqLworCXMxNgkJCXRfZGVyb3Q7CQkvKiBEZXJvdGF0b3IgdGltZSBjb25zdGFudCAobXMpCQkqLworCXMxNgkJCXRfZGF0YTsJCQkvKiBEYXRhIHJlY292ZXJ5IHRpbWUgY29uc3RhbnQgKG1zKQkqLworCXMxNgkJCXN1Yl9kaXI7CQkvKiBEaXJlY3Rpb24gb2YgdGhlIG5leHQgc3ViIHJhbmdlCSovCisKKwlzMTYJCQl0X2FnYzE7CQkJLyogQWdjMSB0aW1lIGNvbnN0YW50IChtcykJCSovCisJczE2CQkJdF9hZ2MyOwkJCS8qIEFnYzIgdGltZSBjb25zdGFudCAobXMpCQkqLworCisJdTMyCQkJbG9jazsJCQkvKiBEZW1vZCBpbnRlcm5hbCBsb2NrIHN0YXRlCQkqLworCWVudW0gc3RiMDg5OV9zdGF0dXMJc3RhdHVzOwkJCS8qIERlbW9kIGludGVybmFsIHN0YXR1cwkJKi8KKworCS8qIERWQi1TMiAqLworCXMzMgkJCWFnY19nYWluOwkJLyogUkYgQUdDIEdhaW4JCQkJKi8KKwlzMzIJCQljZW50ZXJfZnJlcTsJCS8qIE5vbWluYWwgY2FycmllciBmcmVxdWVuY3kJCSovCisJczMyCQkJYXZfZnJhbWVfY29hcnNlOwkvKiBDb2Fyc2UgY2FycmllciBmcmVxIHNlYXJjaCBmcmFtZXMJKi8KKwlzMzIJCQlhdl9mcmFtZV9maW5lOwkJLyogRmluZSBjYXJyaWVyIGZyZXEgc2VhcmNoIGZyYW1lcwkqLworCisJczE2CQkJc3RlcF9zaXplOwkJLyogQ2FycmllciBmcmVxdWVuY3kgc2VhcmNoIHN0ZXAgc2l6ZQkqLworCisJZW51bSBzdGIwODk5X2FscGhhCXJyY19hbHBoYTsKKwllbnVtIHN0YjA4OTlfaW52ZXJzaW9uCWludmVyc2lvbjsKKwllbnVtIHN0YjA4OTlfbW9kY29kCW1vZGNvZDsKKwl1OAkJCXBpbG90czsJCQkvKiBQaWxvdHMgZm91bmQJCQkJKi8KKworCWVudW0gc3RiMDg5OV9mcmFtZQlmcmFtZV9sZW5ndGg7CisJdTgJCQl2X3N0YXR1czsJCS8qIFZTVEFUVVMJCQkJKi8KKwl1OAkJCWVycl9jdHJsOwkJLyogRVJSQ1RSTG4JCQkJKi8KK307CisKK3N0cnVjdCBzdGIwODk5X3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJCSppMmM7CisJc3RydWN0IHN0YjA4OTlfY29uZmlnCQkqY29uZmlnOworCXN0cnVjdCBkdmJfZnJvbnRlbmQJCWZyb250ZW5kOworCisJdTMyCQkJCSp2ZXJib3NlOwkvKiBDYWNoZWQgbW9kdWxlIHZlcmJvc2l0eSBsZXZlbAkqLworCisJc3RydWN0IHN0YjA4OTlfaW50ZXJuYWwJCWludGVybmFsOwkvKiBEZXZpY2UgaW50ZXJuYWwgcGFyYW1ldGVycwkJKi8KKworCS8qCWNhY2hlZCBwYXJhbXMgZnJvbSBBUEkJKi8KKwllbnVtIGZlX2RlbGl2ZXJ5X3N5c3RlbQkJZGVsc3lzOworCXN0cnVjdCBzdGIwODk5X3BhcmFtcwkJcGFyYW1zOworCisJdTMyCQkJCXJ4X2ZyZXE7CS8qIERpU0VxQyAyLjAgcmVjZWl2ZXIgZnJlcQkJKi8KKwlzdHJ1Y3QgbXV0ZXgJCQlzZWFyY2hfbG9jazsKK307CisvKiBzdGIwODk5LmMJCSovCitleHRlcm4gaW50IHN0YjA4OTlfcmVhZF9yZWcoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLAorCQkJICAgIHVuc2lnbmVkIGludCByZWcpOworCitleHRlcm4gdTMyIF9zdGIwODk5X3JlYWRfczJyZWcoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgIHUzMiBzdGIwODk5X2kyY2RldiwKKwkJCSAgICAgICB1MzIgc3RiMDg5OV9iYXNlX2FkZHIsCisJCQkgICAgICAgdTE2IHN0YjA4OTlfcmVnX29mZnNldCk7CisKK2V4dGVybiBpbnQgc3RiMDg5OV9yZWFkX3JlZ3Moc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1OCAqYnVmLAorCQkJICAgICB1MzIgY291bnQpOworCitleHRlcm4gaW50IHN0YjA4OTlfd3JpdGVfcmVncyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1OCAqZGF0YSwKKwkJCSAgICAgIHUzMiBjb3VudCk7CisKK2V4dGVybiBpbnQgc3RiMDg5OV93cml0ZV9yZWcoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICB1OCBkYXRhKTsKKworZXh0ZXJuIGludCBzdGIwODk5X3dyaXRlX3MycmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICB1MzIgc3RiMDg5OV9pMmNkZXYsCisJCQkgICAgICAgdTMyIHN0YjA4OTlfYmFzZV9hZGRyLAorCQkJICAgICAgIHUxNiBzdGIwODk5X3JlZ19vZmZzZXQsCisJCQkgICAgICAgdTMyIHN0YjA4OTlfZGF0YSk7CisKK2V4dGVybiBpbnQgc3RiMDg5OV9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKTsKKworCisjZGVmaW5lIFNUQjA4OTlfUkVBRF9TMlJFRyhERVZJQ0UsIFJFRykgCShfc3RiMDg5OV9yZWFkX3MycmVnKHN0YXRlLCBERVZJQ0UsIFNUQjA4OTlfQkFTRV8jI1JFRywgU1RCMDg5OV9PRkYwXyMjUkVHKSkKKy8vI2RlZmluZSBTVEIwODk5X1dSSVRFX1MyUkVHKERFVklDRSwgUkVHLCBEQVRBKQkoX3N0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIERFVklDRSwgU1RCMDg5OV9CQVNFXyMjUkVHLCBTVEIwODk5X09GRjBfIyNSRUcsIERBVEEpKQorCisvKiBzdGIwODk5X2FsZ28uYwkqLworZXh0ZXJuIGVudW0gc3RiMDg5OV9zdGF0dXMgc3RiMDg5OV9kdmJzX2FsZ28oc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKTsKK2V4dGVybiBlbnVtIHN0YjA4OTlfc3RhdHVzIHN0YjA4OTlfZHZiczJfYWxnbyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUpOworZXh0ZXJuIGxvbmcgc3RiMDg5OV9jYXJyX3dpZHRoKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSk7CisKKyNlbmRpZiAvL19fU1RCMDg5OV9QUklWX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X3JlZy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExZWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X3JlZy5oCkBAIC0wLDAgKzEsMjAyNyBAQAorLyoKKwlTVEIwODk5IE11bHRpc3RhbmRhcmQgRnJvbnRlbmQgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBNYW51IEFicmFoYW0gKGFicmFoYW0ubWFudUBnbWFpbC5jb20pCisKKwlDb3B5cmlnaHQgKEMpIFNUIE1pY3JvZWxlY3Ryb25pY3MKKworCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKwl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKwlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfX1NUQjA4OTlfUkVHX0gKKyNkZWZpbmUgX19TVEIwODk5X1JFR19ICisKKy8qCVMxCSovCisjZGVmaW5lIFNUQjA4OTlfREVWX0lECQkJCTB4ZjAwMAorI2RlZmluZSBTVEIwODk5X0NISVBfSUQJCQkJKDB4MGYgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DSElQX0lECQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NISVBfSUQJCQk0CisjZGVmaW5lIFNUQjA4OTlfQ0hJUF9SRUwJCQkoMHgwZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NISVBfUkVMCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NISVBfUkVMCQkJNAorCisjZGVmaW5lIFNUQjA4OTlfREVNT0QJCQkJMHhmNDBlCisjZGVmaW5lIFNUQjA4OTlfTU9ERUNPRUZGCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9NT0RFQ09FRkYJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTU9ERUNPRUZGCQkJMQorCisjZGVmaW5lIFNUQjA4OTlfUkNPTVBDCQkJCTB4ZjQxMAorI2RlZmluZSBTVEIwODk5X0FHQzFDTgkJCQkweGY0MTIKKyNkZWZpbmUgU1RCMDg5OV9BR0MxUkVGCQkJCTB4ZjQxMworI2RlZmluZSBTVEIwODk5X1JUQwkJCQkweGY0MTcKKyNkZWZpbmUgU1RCMDg5OV9UTUdDRkcJCQkJMHhmNDE4CisjZGVmaW5lIFNUQjA4OTlfQUdDMlJFRgkJCQkweGY0MTkKKyNkZWZpbmUgU1RCMDg5OV9UTFNSCQkJCTB4ZjQxYQorCisjZGVmaW5lIFNUQjA4OTlfQ0ZECQkJCTB4ZjQxYgorI2RlZmluZSBTVEIwODk5X0NGRF9PTgkJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NGRF9PTgkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DRkRfT04JCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9BQ0xDCQkJCTB4ZjQxYworCisjZGVmaW5lIFNUQjA4OTlfQkNMQwkJCQkweGY0MWQKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTEdPCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FMR09fUVBTSzIJCTIKKyNkZWZpbmUgU1RCMDg5OV9BTEdPX1FQU0syCQkJKDIgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9BTEdPX1FQU0sxCQkJKDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9BTEdPX0JQU0sJCQkoMCA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JFVEEJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkVUQQkJCTYKKworI2RlZmluZSBTVEIwODk5X0VRT04JCQkJMHhmNDFlCisjZGVmaW5lIFNUQjA4OTlfTERUCQkJCTB4ZjQxZgorI2RlZmluZSBTVEIwODk5X0xEVDIJCQkJMHhmNDIwCisjZGVmaW5lIFNUQjA4OTlfRVFVQUxSRUYJCQkweGY0MjUKKyNkZWZpbmUgU1RCMDg5OV9UTUdSQU1QCQkJCTB4ZjQyNgorI2RlZmluZSBTVEIwODk5X1RNR1RIRAkJCQkweGY0MjcKKyNkZWZpbmUgU1RCMDg5OV9JRENDT01QCQkJCTB4ZjQyOAorI2RlZmluZSBTVEIwODk5X1FEQ0NPTVAJCQkJMHhmNDI5CisjZGVmaW5lIFNUQjA4OTlfUE9XRVJJCQkJCTB4ZjQyYQorI2RlZmluZSBTVEIwODk5X1BPV0VSUQkJCQkweGY0MmIKKyNkZWZpbmUgU1RCMDg5OV9SQ09NUAkJCQkweGY0MmMKKworI2RlZmluZSBTVEIwODk5X0FHQ0lRSU4JCQkJMHhmNDJlCisjZGVmaW5lIFNUQjA4OTlfQUdDSVFWQUxVRQkJCSgweGZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQUdDSVFWQUxVRQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FHQ0lRVkFMVUUJCTgKKworI2RlZmluZSBTVEIwODk5X0FHQzJJMQkJCQkweGY0MzYKKyNkZWZpbmUgU1RCMDg5OV9BR0MySTIJCQkJMHhmNDM3CisKKyNkZWZpbmUgU1RCMDg5OV9UTElSCQkJCTB4ZjQzOAorI2RlZmluZSBTVEIwODk5X1RMSVJfVE1HX0xPQ0tfSU5ECQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RMSVJfVE1HX0xPQ0tfSU5ECQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVExJUl9UTUdfTE9DS19JTkQJCTgKKworI2RlZmluZSBTVEIwODk5X1JURgkJCQkweGY0MzkKKyNkZWZpbmUgU1RCMDg5OV9SVEZfVElNSU5HX0xPT1BfRlJFUQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9SVEZfVElNSU5HX0xPT1BfRlJFUQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUlRGX1RJTUlOR19MT09QX0ZSRVEJOAorCisjZGVmaW5lIFNUQjA4OTlfRFNUQVRVUwkJCQkweGY0M2EKKyNkZWZpbmUgU1RCMDg5OV9DQVJSSUVSX0ZPVU5ECQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DQVJSSUVSX0ZPVU5ECQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ0FSUklFUl9GT1VORAkJMQorI2RlZmluZSBTVEIwODk5X1RNR19MT0NLCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UTUdfTE9DSwkJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9UTUdfTE9DSwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9ERU1PRF9MT0NLCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ERU1PRF9MT0NLCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfREVNT0RfTE9DSwkJMQorI2RlZmluZSBTVEIwODk5X1RNR19BVVRPCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UTUdfQVVUTwkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9UTUdfQVVUTwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9FTkRfTUFJTgkJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRU5EX01BSU4JCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRU5EX01BSU4JCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9MREkJCQkJMHhmNDNiCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTERJCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0xESQkJCTgKKworI2RlZmluZSBTVEIwODk5X0NGUk0JCQkJMHhmNDNlCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ0ZSTQkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DRlJNCQkJOAorCisjZGVmaW5lIFNUQjA4OTlfQ0ZSTAkJCQkweGY0M2YKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DRlJMCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NGUkwJCQk4CisKKyNkZWZpbmUgU1RCMDg5OV9OSVJNCQkJCTB4ZjQ0MAorI2RlZmluZSBTVEIwODk5X09GRlNUX05JUk0JCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTklSTQkJCTgKKworI2RlZmluZSBTVEIwODk5X05JUkwJCQkJMHhmNDQxCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTklSTAkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9OSVJMCQkJOAorCisjZGVmaW5lIFNUQjA4OTlfSVNZTUIJCQkJMHhmNDQ0CisjZGVmaW5lIFNUQjA4OTlfUVNZTUIJCQkJMHhmNDQ1CisKKyNkZWZpbmUgU1RCMDg5OV9TRlJICQkJCTB4ZjQ0NgorI2RlZmluZSBTVEIwODk5X09GRlNUX1NGUkgJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU0ZSSAkJCTgKKworI2RlZmluZSBTVEIwODk5X1NGUk0JCQkJMHhmNDQ3CisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU0ZSTQkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TRlJNCQkJOAorCisjZGVmaW5lIFNUQjA4OTlfU0ZSTAkJCQkweGY0NDgKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TRlJMCQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NGUkwJCQk0CisKKyNkZWZpbmUgU1RCMDg5OV9TRlJVUEgJCQkJMHhmNDRjCisjZGVmaW5lIFNUQjA4OTlfU0ZSVVBNCQkJCTB4ZjQ0ZAorI2RlZmluZSBTVEIwODk5X1NGUlVQTAkJCQkweGY0NGUKKworI2RlZmluZSBTVEIwODk5X0VRVUFJMQkJCQkweGY0ZTAKKyNkZWZpbmUgU1RCMDg5OV9FUVVBUTEJCQkJMHhmNGUxCisjZGVmaW5lIFNUQjA4OTlfRVFVQUkyCQkJCTB4ZjRlMgorI2RlZmluZSBTVEIwODk5X0VRVUFRMgkJCQkweGY0ZTMKKyNkZWZpbmUgU1RCMDg5OV9FUVVBSTMJCQkJMHhmNGU0CisjZGVmaW5lIFNUQjA4OTlfRVFVQVEzCQkJCTB4ZjRlNQorI2RlZmluZSBTVEIwODk5X0VRVUFJNAkJCQkweGY0ZTYKKyNkZWZpbmUgU1RCMDg5OV9FUVVBUTQJCQkJMHhmNGU3CisjZGVmaW5lIFNUQjA4OTlfRVFVQUk1CQkJCTB4ZjRlOAorI2RlZmluZSBTVEIwODk5X0VRVUFRNQkJCQkweGY0ZTkKKworI2RlZmluZSBTVEIwODk5X0RTVEFUVVMyCQkJMHhmNTBjCisjZGVmaW5lIFNUQjA4OTlfRFMyX1RNR19BVVRPU1JDSAkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCODk5OV9PRkZTVF9EUzJfVE1HX0FVVE9TUkNICQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRFMyX1RNR19BVVRPU1JDSAkJMQorI2RlZmluZSBTVEIwODk5X0RTMl9FTkRfTUFJTkxPT1AJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRFMyX0VORF9NQUlOTE9PUAkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0RTMl9FTkRfTUFJTkxPT1AJCTEKKyNkZWZpbmUgU1RCMDg5OV9EUzJfQ0ZTWU5DCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9EUzJfQ0ZTWU5DCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRFMyX0NGU1lOQwkJMQorI2RlZmluZSBTVEIwODk5X0RTMl9UTUdMT0NLCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9EUzJfVE1HTE9DSwkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0RTMl9UTUdMT0NLCQkxCisjZGVmaW5lIFNUQjA4OTlfRFMyX0RFTU9EV0FJVAkJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRFMyX0RFTU9EV0FJVAkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0RTMl9ERU1PRFdBSVQJCTEKKyNkZWZpbmUgU1RCMDg5OV9EUzJfRkVDT04JCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RTMl9GRUNPTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9EUzJfRkVDT04JCQkxCisKKy8qCVMxIEZFQwkqLworI2RlZmluZSBTVEIwODk5X1ZTVEFUVVMJCQkJMHhmNTBkCisjZGVmaW5lIFNUQjA4OTlfVlNUQVRVU19WSVRFUkJJX09OCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1ZTVEFUVVNfVklURVJCSV9PTgk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVlNUQVRVU19WSVRFUkJJX09OCTEKKyNkZWZpbmUgU1RCMDg5OV9WU1RBVFVTX0VORF9MT09QVklUCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1ZTVEFUVVNfRU5EX0xPT1BWSVQJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1ZTVEFUVVNfRU5EX0xPT1BWSVQJMQorI2RlZmluZSBTVEIwODk5X1ZTVEFUVVNfUFJGVklUCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9WU1RBVFVTX1BSRlZJVAkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1ZTVEFUVVNfUFJGVklUCQkxCisjZGVmaW5lIFNUQjA4OTlfVlNUQVRVU19MT0NLRURWSVQJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVlNUQVRVU19MT0NLRURWSVQJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9WU1RBVFVTX0xPQ0tFRFZJVAkJMQorCisjZGVmaW5lIFNUQjA4OTlfVkVSUk9SCQkJCTB4ZjUwZgorCisjZGVmaW5lIFNUQjA4OTlfSVFTV0FQCQkJCTB4ZjUyMworI2RlZmluZSBTVEIwODk5X1NZTQkJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NZTQkJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TWU0JCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9GRUNBVVRPMQkJCTB4ZjUzMAorI2RlZmluZSBTVEIwODk5X0RTU1NSQ0gJCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9EU1NTUkNICQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0RTU1NSQ0gJCQkxCisjZGVmaW5lIFNUQjA4OTlfU1lNU1JDSAkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NZTVNSQ0gJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1lNU1JDSAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9RUFNLU1JDSAkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUVBTS1NSQ0gJCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUVBTS1NSQ0gJCQkxCisjZGVmaW5lIFNUQjA4OTlfQlBTS1NSQ0gJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JQU0tTUkNICQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JQU0tTUkNICQkJMQorCisjZGVmaW5lIFNUQjA4OTlfRkVDTQkJCQkweGY1MzMKKyNkZWZpbmUgU1RCMDg5OV9GRUNNX05PVF9EVkIJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFQ01fTk9UX0RWQgkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZFQ01fTk9UX0RWQgkJMQorI2RlZmluZSBTVEIwODk5X0ZFQ01fUlNWRDEJCQkoMHgwNyA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFQ01fUlNWRDEJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GRUNNX1JTVkQxCQkzCisjZGVmaW5lIFNUQjA4OTlfRkVDTV9WSVRFUkJJX09OCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GRUNNX1ZJVEVSQklfT04JCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GRUNNX1ZJVEVSQklfT04JCTEKKyNkZWZpbmUgU1RCMDg5OV9GRUNNX1JTVkQwCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GRUNNX1JTVkQwCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVDTV9SU1ZEMAkJMQorI2RlZmluZSBTVEIwODk5X0ZFQ01fU1lOQ0RJUwkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRkVDTV9TWU5DRElTCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVDTV9TWU5DRElTCQkxCisjZGVmaW5lIFNUQjA4OTlfRkVDTV9TWU1JCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GRUNNX1NZTUkJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVDTV9TWU1JCQkJMQorCisjZGVmaW5lIFNUQjA4OTlfVlRIMTIJCQkJMHhmNTM0CisjZGVmaW5lIFNUQjA4OTlfVlRIMjMJCQkJMHhmNTM1CisjZGVmaW5lIFNUQjA4OTlfVlRIMzQJCQkJMHhmNTM2CisjZGVmaW5lIFNUQjA4OTlfVlRINTYJCQkJMHhmNTM3CisjZGVmaW5lIFNUQjA4OTlfVlRINjcJCQkJMHhmNTM4CisjZGVmaW5lIFNUQjA4OTlfVlRINzgJCQkJMHhmNTM5CisKKyNkZWZpbmUgU1RCMDg5OV9QUlZJVAkJCQkweGY1M2MKKyNkZWZpbmUgU1RCMDg5OV9QUl83XzgJCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9QUl83XzgJCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUFJfN184CQkJMQorI2RlZmluZSBTVEIwODk5X1BSXzZfNwkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1BSXzZfNwkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9QUl82XzcJCQkxCisjZGVmaW5lIFNUQjA4OTlfUFJfNV82CQkJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUFJfNV82CQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX1BSXzVfNgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9QUl8zXzQJCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9QUl8zXzQJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUFJfM180CQkJMQorI2RlZmluZSBTVEIwODk5X1BSXzJfMwkJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1BSXzJfMwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9QUl8yXzMJCQkxCisjZGVmaW5lIFNUQjA4OTlfUFJfMV8yCQkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUFJfMV8yCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1BSXzFfMgkJCTEKKworI2RlZmluZSBTVEIwODk5X1ZJVFNZTkMJCQkJMHhmNTNkCisjZGVmaW5lIFNUQjA4OTlfQU0JCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTQkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BTQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9GUkVFWkUJCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GUkVFWkUJCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRlJFRVpFCQkJMQorI2RlZmluZSBTVEIwODk5X1NOXzY1NTM2CQkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TTl82NTUzNgkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TTl82NTUzNgkJCTIKKyNkZWZpbmUgU1RCMDg5OV9TTl8xNjM4NAkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU05fMTYzODQJCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU05fMTYzODQJCQkxCisjZGVmaW5lIFNUQjA4OTlfU05fNDA5NgkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NOXzQwOTYJCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU05fNDA5NgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9TTl8xMDI0CQkJCSgweDAwIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU05fMTAyNAkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TTl8xMDI0CQkJMAorI2RlZmluZSBTVEIwODk5X1RPXzEyOAkJCQkoMHgwMyA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RPXzEyOAkJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9UT18xMjgJCQkyCisjZGVmaW5lIFNUQjA4OTlfVE9fNjQJCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UT182NAkJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9UT182NAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9UT18zMgkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RPXzMyCQkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1RPXzMyCQkJMQorI2RlZmluZSBTVEIwODk5X1RPXzE2CQkJCSgweDAwIDw8IDIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVE9fMTYJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVE9fMTYJCQkwCisjZGVmaW5lIFNUQjA4OTlfSFlTVF8xMjgJCQkoMHgwMyA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0hZU1RfMTI4CQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0hZU1RfMTI4CQkJMgorI2RlZmluZSBTVEIwODk5X0hZU1RfNjQJCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9IWVNUXzY0CQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0hZU1RfNjQJCQkxCisjZGVmaW5lIFNUQjA4OTlfSFlTVF8zMgkJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0hZU1RfMzIJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSFlTVF8zMgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9IWVNUXzE2CQkJCSgweDAwIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSFlTVF8xNgkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9IWVNUXzE2CQkJMAorCisjZGVmaW5lIFNUQjA4OTlfUlNVTEMJCQkJMHhmNTQ4CisjZGVmaW5lIFNUQjA4OTlfVUxESUxfT04JCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VMRElMX09OCQkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX1VMRElMX09OCQkJMQorI2RlZmluZSBTVEIwODk5X1VMQVVUT19PTgkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVUxBVVRPX09OCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VMQVVUT19PTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9VTFJTX09OCQkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVUxSU19PTgkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9VTFJTX09OCQkJMQorI2RlZmluZSBTVEIwODk5X1VMREVTQ1JBTV9PTgkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVUxERVNDUkFNX09OCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVUxERVNDUkFNX09OCQkxCisjZGVmaW5lIFNUQjA4OTlfVUxfRElTQUJMRQkJCSgweDAxIDw8IDIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVUxfRElTQUJMRQkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VMX0RJU0FCTEUJCTEKKyNkZWZpbmUgU1RCMDg5OV9OT0ZUSFJFU0hPTEQJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX05PRlRIUkVTSE9MRAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX05PRlRIUkVTSE9MRAkJMQorCisjZGVmaW5lIFNUQjA4OTlfUlNMTEMJCQkJMHhmNTRhCisjZGVmaW5lIFNUQjA4OTlfREVNQVBWSVQJCQkweGY1ODMKKyNkZWZpbmUgU1RCMDg5OV9ERU1BUFZJVF9SU1ZECQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ERU1BUFZJVF9SU1ZECQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfREVNQVBWSVRfUlNWRAkJMQorI2RlZmluZSBTVEIwODk5X0RFTUFQVklUX0tESVZJREVSCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RFTUFQVklUX0tESVZJREVSCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfREVNQVBWSVRfS0RJVklERVIJCTcKKworI2RlZmluZSBTVEIwODk5X1BMUEFSTQkJCQkweGY1OGMKKyNkZWZpbmUgU1RCMDg5OV9WSVRNQVBQSU5HCQkJKDB4MDcgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9WSVRNQVBQSU5HCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVklUTUFQUElORwkJMworI2RlZmluZSBTVEIwODk5X1ZJVE1BUFBJTkdfQlBTSwkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVklUTUFQUElOR19CUFNLCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVklUTUFQUElOR19CUFNLCQkxCisjZGVmaW5lIFNUQjA4OTlfVklUTUFQUElOR19RUFNLCQkJKDB4MDAgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9WSVRNQVBQSU5HX1FQU0sJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9WSVRNQVBQSU5HX1FQU0sJCTAKKyNkZWZpbmUgU1RCMDg5OV9WSVRDVVJQVU4JCQkoMHgxZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1ZJVENVUlBVTgkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9WSVRDVVJQVU4JCQk1CisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzFfMgkJCSgweDBkIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzJfMwkJCSgweDEyIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzNfNAkJCSgweDE1IDw8IDApCisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzVfNgkJCSgweDE4IDw8IDApCisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzZfNwkJCSgweDE5IDw8IDApCisjZGVmaW5lIFNUQjA4OTlfVklUQ1VSUFVOXzdfOAkJCSgweDFhIDw8IDApCisKKy8qCVMyIERFTU9ECSovCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ETURfU1RBVFVTCQkJMHhmMzAwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ETURfU1RBVFVTCQkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0lGX0FHQ19MT0NLCQkJKDB4MDEgPDwgOCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JRl9BR0NfTE9DSwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lGX0FHQ19MT0NLCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NSTF9GUkVRCQkJMHhmMzA0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9DUkxfRlJFUQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9DQVJSX0ZSRVEJCQkoMHgzZmZmZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NBUlJfRlJFUQkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DQVJSX0ZSRVEJCQkzMAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9CVFJfRlJFUQkJCTB4ZjMwOAorI2RlZmluZSBTVEIwODk5X0JBU0VfQlRSX0ZSRVEJCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQlRSX0ZSRVEJCQkoMHhmZmZmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQlRSX0ZSRVEJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQlRSX0ZSRVEJCQkyOAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9JRl9BR0NfR0FJTgkJMHhmMzBjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9JRl9BR0NfR0FJTgkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0lGX0FHQ19HQUlOCQkJKDB4M2ZmZiA8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSUZfQUdDX0dBSU4JCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JRl9BR0NfR0FJTgkJMTQKKworI2RlZmluZSBTVEIwODk5X09GRjBfQkJfQUdDX0dBSU4JCTB4ZjMxMAorI2RlZmluZSBTVEIwODk5X0JBU0VfQkJfQUdDX0dBSU4JCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CQl9BR0NfR0FJTgkJCSgweDNmZmYgPCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JCX0FHQ19HQUlOCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkJfQUdDX0dBSU4JCTE0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0RDX09GRlNFVAkJCTB4ZjMxNAorI2RlZmluZSBTVEIwODk5X0JBU0VfRENfT0ZGU0VUCQkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0kJCQkJKDB4ZmYgPCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0kJCQkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0kJCQkJOAorI2RlZmluZSBTVEIwODk5X1EJCQkJKDB4ZmYgPCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1EJCQkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1EJCQkJOAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ETURfQ05UUkwJCQkweGYzMWMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0RNRF9DTlRSTAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9BREMwX1BJTlMxSU4JCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FEQzBfUElOUzFJTiAgICAgICAgICAgICAgNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FEQzBfUElOUzFJTiAgICAgICAgICAgICAgMQorI2RlZmluZSBTVEIwODk5X0lOMkNPTVAxX09GRkJJTjAJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSU4yQ09NUDFfT0ZGQklOMCAgICAgICAgICAzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSU4yQ09NUDFfT0ZGQklOMCAgICAgICAgICAxCisjZGVmaW5lIFNUQjA4OTlfRENfQ09NUAkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RDX0NPTVAJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRENfQ09NUAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9NT0RNT0RFCQkJCSgweDAzIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTU9ETU9ERQkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9NT0RNT0RFCQkJMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9JRl9BR0NfQ05UUkwJCTB4ZjMyMAorI2RlZmluZSBTVEIwODk5X0JBU0VfSUZfQUdDX0NOVFJMCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfSUZfR0FJTl9JTklUCQkJKDB4M2ZmZiA8PCAxMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JRl9HQUlOX0lOSVQJCTEzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSUZfR0FJTl9JTklUCQkxNAorI2RlZmluZSBTVEIwODk5X0lGX0dBSU5fU0VOU0UJCQkoMHgwMSA8PCAxMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JRl9HQUlOX1NFTlNFCQkxMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lGX0dBSU5fU0VOU0UJCTEKKyNkZWZpbmUgU1RCMDg5OV9JRl9MT09QX0dBSU4JCQkoMHgwZiA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0lGX0xPT1BfR0FJTgkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lGX0xPT1BfR0FJTgkJNAorI2RlZmluZSBTVEIwODk5X0lGX0xEX0dBSU5fSU5JVAkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSUZfTERfR0FJTl9JTklUCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSUZfTERfR0FJTl9JTklUCQkxCisjZGVmaW5lIFNUQjA4OTlfSUZfQUdDX1JFRgkJCSgweDdmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSUZfQUdDX1JFRgkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lGX0FHQ19SRUYJCTcKKworI2RlZmluZSBTVEIwODk5X09GRjBfQkJfQUdDX0NOVFJMCQkweGYzMjQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JCX0FHQ19DTlRSTAkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0JCX0dBSU5fSU5JVAkJCSgweDNmZmYgPDwgMTIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkJfR0FJTl9JTklUCQkxMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JCX0dBSU5fSU5JVAkJMTQKKyNkZWZpbmUgU1RCMDg5OV9CQl9MT09QX0dBSU4JCQkoMHgwZiA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JCX0xPT1BfR0FJTgkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JCX0xPT1BfR0FJTgkJNAorI2RlZmluZSBTVEIwODk5X0JCX0xEX0dBSU5fSU5JVAkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkJfTERfR0FJTl9JTklUCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkJfTERfR0FJTl9JTklUCQkxCisjZGVmaW5lIFNUQjA4OTlfQkJfQUdDX1JFRgkJCSgweDdmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkJfQUdDX1JFRgkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JCX0FHQ19SRUYJCTcKKworI2RlZmluZSBTVEIwODk5X09GRjBfQ1JMX0NOVFJMCQkJMHhmMzI4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9DUkxfQ05UUkwJCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQ1JMX0xPQ0tfQ0xFQVIJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9MT0NLX0NMRUFSCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX0xPQ0tfQ0xFQVIJCTEKKyNkZWZpbmUgU1RCMDg5OV9DUkxfU1dQUl9DTEVBUgkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX1NXUFJfQ0xFQVIJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfU1dQUl9DTEVBUgkJMQorI2RlZmluZSBTVEIwODk5X0NSTF9TV1BfRU5BCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DUkxfU1dQX0VOQQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSTF9TV1BfRU5BCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JMX0RFVF9TRUwJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9ERVRfU0VMCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX0RFVF9TRUwJCTEKKyNkZWZpbmUgU1RCMDg5OV9DUkxfU0VOU0UJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9TRU5TRQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfU0VOU0UJCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JMX1BIU0VSUl9DTEVBUgkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DUkxfUEhTRVJSX0NMRUFSCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX1BIU0VSUl9DTEVBUgkJMQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9DUkxfUEhTX0lOSVQJCTB4ZjMyYworI2RlZmluZSBTVEIwODk5X0JBU0VfQ1JMX1BIU19JTklUCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQ1JMX1BIU19JTklUXzMxCQkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DUkxfUEhTX0lOSVRfMzEJCTMwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX1BIU19JTklUXzMxCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JMX0xEX0lOSVRfUEhBU0UJCSgweDEgPDwgMjQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX0xEX0lOSVRfUEhBU0UJCTI0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX0xEX0lOSVRfUEhBU0UJCTEKKyNkZWZpbmUgU1RCMDg5OV9DUkxfSU5JVF9QSEFTRQkJCSgweGZmZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9JTklUX1BIQVNFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JMX0lOSVRfUEhBU0UJCTI0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NSTF9GUkVRX0lOSVQJCTB4ZjMzMAorI2RlZmluZSBTVEIwODk5X0JBU0VfQ1JMX0ZSRVFfSU5JVAkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0NSTF9GUkVRX0lOSVRfMzEJCSgweDEgPDwgMzApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX0ZSRVFfSU5JVF8zMQkJMzAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfRlJFUV9JTklUXzMxCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JMX0xEX0ZSRVFfSU5JVAkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DUkxfTERfRlJFUV9JTklUCQkyNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSTF9MRF9GUkVRX0lOSVQJCTEKKyNkZWZpbmUgU1RCMDg5OV9DUkxfRlJFUV9JTklUCQkJKDB4ZmZmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX0ZSRVFfSU5JVAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSTF9GUkVRX0lOSVQJCTI0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NSTF9MT09QX0dBSU4JCTB4ZjMzNAorI2RlZmluZSBTVEIwODk5X0JBU0VfQ1JMX0xPT1BfR0FJTgkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0tDUkwyX1JTSEZUCQkJKDB4ZiA8PCAxNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9LQ1JMMl9SU0hGVAkJMTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9LQ1JMMl9SU0hGVAkJNAorI2RlZmluZSBTVEIwODk5X0tDUkwxCQkJCSgweGYgPDwgMTIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfS0NSTDEJCQkxMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0tDUkwxCQkJNAorI2RlZmluZSBTVEIwODk5X0tDUkwxX1JTSEZUCQkJKDB4ZiA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0tDUkwxX1JTSEZUCQk4CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfS0NSTDFfUlNIRlQJCTQKKyNkZWZpbmUgU1RCMDg5OV9LQ1JMMAkJCQkoMHhmIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfS0NSTDAJCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfS0NSTDAJCQk0CisjZGVmaW5lIFNUQjA4OTlfS0NSTDBfUlNIRlQJCQkoMHhmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfS0NSTDBfUlNIRlQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9LQ1JMMF9SU0hGVAkJNAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9DUkxfTk9NX0ZSRVEJCTB4ZjMzOAorI2RlZmluZSBTVEIwODk5X0JBU0VfQ1JMX05PTV9GUkVRCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQ1JMX05PTV9GUkVRCQkJKDB4M2ZmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DUkxfTk9NX0ZSRVEJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfTk9NX0ZSRVEJCTMwCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NSTF9TV1BfUkFURQkJMHhmMzNjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9DUkxfU1dQX1JBVEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9DUkxfU1dQX1JBVEUJCQkoMHgzZmZmZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9TV1BfUkFURQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSTF9TV1BfUkFURQkJMzAKKworI2RlZmluZSBTVEIwODk5X09GRjBfQ1JMX01BWF9TV1AJCTB4ZjM0MAorI2RlZmluZSBTVEIwODk5X0JBU0VfQ1JMX01BWF9TV1AJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9DUkxfTUFYX1NXUAkJCSgweDNmZmZmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX01BWF9TV1AJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfTUFYX1NXUAkJMzAKKworI2RlZmluZSBTVEIwODk5X09GRjBfQ1JMX0xLX0NOVFJMCQkweGYzNDQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NSTF9MS19DTlRSTAkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ERUNJTV9DTlRSTAkJMHhmMzQ4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ERUNJTV9DTlRSTAkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0JBTkRfTElNSVRfQgkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkFORF9MSU1JVF9CCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkFORF9MSU1JVF9CCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lOX1NFTAkJCQkoMHgwMyA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1dJTl9TRUwJCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfV0lOX1NFTAkJCTIKKyNkZWZpbmUgU1RCMDg5OV9ERUNJTV9SQVRFCQkJKDB4MDcgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ERUNJTV9SQVRFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfREVDSU1fUkFURQkJMworCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9CVFJfQ05UUkwJCQkweGYzNGMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JUUl9DTlRSTAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CVFJfRlJFUV9DT1JSCQkJKDB4N2ZmIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQlRSX0ZSRVFfQ09SUgkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JUUl9GUkVRX0NPUlIJCTExCisjZGVmaW5lIFNUQjA4OTlfQlRSX0NMUl9MT0NLCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfQ0xSX0xPQ0sJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfQ0xSX0xPQ0sJCTEKKyNkZWZpbmUgU1RCMDg5OV9CVFJfU0VOU0UJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JUUl9TRU5TRQkJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfU0VOU0UJCQkxCisjZGVmaW5lIFNUQjA4OTlfQlRSX0VSUl9FTkEJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JUUl9FUlJfRU5BCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQlRSX0VSUl9FTkEJCTEKKyNkZWZpbmUgU1RCMDg5OV9JTlRSUF9QSFNfU0VOU0UJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0lOVFJQX1BIU19TRU5TRQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lOVFJQX1BIU19TRU5TRQkJMQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9CVFJfTE9PUF9HQUlOCQkweGYzNTAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JUUl9MT09QX0dBSU4JCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9LQlRSMl9SU0hGVAkJCSgweDBmIDw8IDE2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0tCVFIyX1JTSEZUCQkxNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0tCVFIyX1JTSEZUCQk0CisjZGVmaW5lIFNUQjA4OTlfS0JUUjEJCQkJKDB4MGYgPDwgMTIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfS0JUUjEJCQkxMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0tCVFIxCQkJNAorI2RlZmluZSBTVEIwODk5X0tCVFIxX1JTSEZUCQkJKDB4MGYgPDwgOCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9LQlRSMV9SU0hGVAkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0tCVFIxX1JTSEZUCQk0CisjZGVmaW5lIFNUQjA4OTlfS0JUUjAJCQkJKDB4MGYgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9LQlRSMAkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9LQlRSMAkJCTQKKyNkZWZpbmUgU1RCMDg5OV9LQlRSMF9SU0hGVAkJCSgweDBmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfS0JUUjBfUlNIRlQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9LQlRSMF9SU0hGVAkJNAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9CVFJfUEhTX0lOSVQJCTB4ZjM1NAorI2RlZmluZSBTVEIwODk5X0JBU0VfQlRSX1BIU19JTklUCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQlRSX0xEX1BIQVNFX0lOSVQJCSgweDAxIDw8IDI4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JUUl9MRF9QSEFTRV9JTklUCQkyOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JUUl9MRF9QSEFTRV9JTklUCQkxCisjZGVmaW5lIFNUQjA4OTlfQlRSX0lOSVRfUEhBU0UJCQkoMHhmZmZmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQlRSX0lOSVRfUEhBU0UJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfSU5JVF9QSEFTRQkJMjgKKworI2RlZmluZSBTVEIwODk5X09GRjBfQlRSX0ZSRVFfSU5JVAkJMHhmMzU4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9CVFJfRlJFUV9JTklUCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQlRSX0xEX0ZSRVFfSU5JVAkJKDEgPDwgMjgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQlRSX0xEX0ZSRVFfSU5JVAkJMjgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfTERfRlJFUV9JTklUCQkxCisjZGVmaW5lIFNUQjA4OTlfQlRSX0ZSRVFfSU5JVAkJCSgweGZmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfRlJFUV9JTklUCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQlRSX0ZSRVFfSU5JVAkJMjgKKworI2RlZmluZSBTVEIwODk5X09GRjBfQlRSX05PTV9GUkVRCQkweGYzNWMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JUUl9OT01fRlJFUQkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0JUUl9OT01fRlJFUQkJCSgweGZmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfTk9NX0ZSRVEJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfTk9NX0ZSRVEJCTI4CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0JUUl9MS19DTlRSTAkJMHhmMzYwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9CVFJfTEtfQ05UUkwJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CVFJfTUlOX0VORVJHWQkJCSgweDBmIDw8IDI0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JUUl9NSU5fRU5FUkdZCQkyNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JUUl9NSU5fRU5FUkdZCQk0CisjZGVmaW5lIFNUQjA4OTlfQlRSX0xPQ0tfVEhfTE8JCQkoMHhmZiA8PCAxNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfTE9DS19USF9MTwkJMTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CVFJfTE9DS19USF9MTwkJOAorI2RlZmluZSBTVEIwODk5X0JUUl9MT0NLX1RIX0hJCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfTE9DS19USF9ISQkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JUUl9MT0NLX1RIX0hJCQk4CisjZGVmaW5lIFNUQjA4OTlfQlRSX0xPQ0tfR0FJTgkJCSgweDAzIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQlRSX0xPQ0tfR0FJTgkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JUUl9MT0NLX0dBSU4JCTIKKyNkZWZpbmUgU1RCMDg5OV9CVFJfTE9DS19MRUFLCQkJKDB4M2YgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CVFJfTE9DS19MRUFLCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQlRSX0xPQ0tfTEVBSwkJNgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ERUNOX0NOVFJMCQkJMHhmMzY0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ERUNOX0NOVFJMCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9DTlRSTAkJCTB4ZjM2OAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQ05UUkwJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRl9TVEFUVVMJCTB4ZjM2YworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGX1NUQVRVUwkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X1RQX0JVRkZFUl9GVUxMICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBTVEIwODk5X09GRjBfRENfRVNUSU0JCQkweGYzN2MKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0RDX0VTVElNCQkJMHgwMDAwCisjZGVmaW5lIFNUQjA4OTlfSV9EQ19FU1RJTUFURQkJCSgweGZmIDw8IDgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSV9EQ19FU1RJTUFURQkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lfRENfRVNUSU1BVEUJCTgKKyNkZWZpbmUgU1RCMDg5OV9RX0RDX0VTVElNQVRFCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9RX0RDX0VTVElNQVRFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUV9EQ19FU1RJTUFURQkJOAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9GTExfQ05UUkwJCQkweGYzMTAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZMTF9DTlRSTAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgU1RCMDg5OV9DUkxfRkxMX0FDQwkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JMX0ZMTF9BQ0MJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DUkxfRkxMX0FDQwkJMQorI2RlZmluZSBTVEIwODk5X0ZMTF9BVkdfUEVSSU9ECQkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GTExfQVZHX1BFUklPRAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZMTF9BVkdfUEVSSU9ECQk0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZMTF9GUkVRX1dECQkweGYzMTQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZMTF9GUkVRX1dECQkweDAwMDAwMDIwCisjZGVmaW5lIFNUQjA4OTlfRkxMX0ZSRVFfV0QJCQkoMHhmZmZmZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZMTF9GUkVRX1dECQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkxMX0ZSRVFfV0QJCTMyCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0FOVElfQUxJQVNfU0VMCQkweGYzNTgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0FOVElfQUxJQVNfU0VMCQkweDAwMDAwMDIwCisjZGVmaW5lIFNUQjA4OTlfQU5USV9BTElBU19TRUxCCQkJKDB4MDMgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTlRJX0FMSUFTX1NFTEIJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BTlRJX0FMSUFTX1NFTEIJCTIKKworI2RlZmluZSBTVEIwODk5X09GRjBfUlJDX0FMUEhBCQkJMHhmMzVjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9SUkNfQUxQSEEJCQkweDAwMDAwMDIwCisjZGVmaW5lIFNUQjA4OTlfUlJDX0FMUEhBCQkJKDB4MDMgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9SUkNfQUxQSEEJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUlJDX0FMUEhBCQkJMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9EQ19BREFQVF9MU0hGVAkJMHhmMzYwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9EQ19BREFQVF9MU0hGVAkJMHgwMDAwMDAyMAorI2RlZmluZSBTVEIwODk5X0RDX0FEQVBUX0xTSEZUCQkJKDB4MDc3IDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRENfQURBUFRfTFNIRlQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9EQ19BREFQVF9MU0hGVAkJMworCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9JTUJfT0ZGU0VUCQkJMHhmMzY0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9JTUJfT0ZGU0VUCQkJMHgwMDAwMDAyMAorI2RlZmluZSBTVEIwODk5X1BIU19JTUJfQ09NUAkJCSgweGZmIDw8IDgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUEhTX0lNQl9DT01QCQk4CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUEhTX0lNQl9DT01QCQk4CisjZGVmaW5lIFNUQjA4OTlfQU1QTF9JTUJfQ09NUAkJCSgweGZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQU1QTF9JTUJfQ09NUAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FNUExfSU1CX0NPTVAJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfSU1CX0VTVElNQVRFCQkweGYzNjgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0lNQl9FU1RJTUFURQkJMHgwMDAwMDAyMAorI2RlZmluZSBTVEIwODk5X1BIU19JTUJfRVNUSU1BVEUJCSgweGZmIDw8IDgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUEhTX0lNQl9FU1RJTUFURQkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1BIU19JTUJfRVNUSU1BVEUJCTgKKyNkZWZpbmUgU1RCMDg5OV9BTVBMX0lNQl9FU1RJTUFURQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTVBMX0lNQl9FU1RJTUFURQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FNUExfSU1CX0VTVElNQVRFCQk4CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0lNQl9DTlRSTAkJCTB4ZjM2YworI2RlZmluZSBTVEIwODk5X0JBU0VfSU1CX0NOVFJMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBTVEIwODk5X1BIU19BREFQVF9MU0hGVAkJCSgweDA3IDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUEhTX0FEQVBUX0xTSEZUCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUEhTX0FEQVBUX0xTSEZUCQkzCisjZGVmaW5lIFNUQjA4OTlfQU1QTF9BREFQVF9MU0hGVAkJKDB4MDcgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTVBMX0FEQVBUX0xTSEZUCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQU1QTF9BREFQVF9MU0hGVAkJMworI2RlZmluZSBTVEIwODk5X0lNQl9DT01QCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JTUJfQ09NUAkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JTUJfQ09NUAkJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfSUZfQUdDX0NOVFJMMgkJMHhmMzc0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9JRl9BR0NfQ05UUkwyCQkweDAwMDAwMDIwCisjZGVmaW5lIFNUQjA4OTlfSUZfQUdDX0xPQ0tfVEgJCQkoMHhmZiA8PCAxMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JRl9BR0NfTE9DS19USAkJMTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JRl9BR0NfTE9DS19USAkJOAorI2RlZmluZSBTVEIwODk5X0lGX0FHQ19TRF9ESVYJCQkoMHhmZiA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0lGX0FHQ19TRF9ESVYJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JRl9BR0NfU0RfRElWCQk4CisjZGVmaW5lIFNUQjA4OTlfSUZfQUdDX0RVTVBfUEVSCQkJKDB4MDcgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JRl9BR0NfRFVNUF9QRVIJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JRl9BR0NfRFVNUF9QRVIJCTMKKworI2RlZmluZSBTVEIwODk5X09GRjBfRE1EX0NOVFJMMgkJCTB4ZjM3OAorI2RlZmluZSBTVEIwODk5X0JBU0VfRE1EX0NOVFJMMgkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgU1RCMDg5OV9TUEVDVFJVTV9JTlZFUlQJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NQRUNUUlVNX0lOVkVSVAkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NQRUNUUlVNX0lOVkVSVAkJMQorI2RlZmluZSBTVEIwODk5X0FHQ19NT0RFCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BR0NfTU9ERQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BR0NfTU9ERQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9DUkxfRlJFUV9BREoJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSTF9GUkVRX0FESgkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSTF9GUkVRX0FESgkJMQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIJCQkweGYzMDAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUgkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9UUF9CVUZGRVJfSU4JCQkoMHhmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVFBfQlVGRkVSX0lOCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVFBfQlVGRkVSX0lOCQkxNgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxCQkJMHhmMzA0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxCQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMgkJCTB4ZjMwOAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMgkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMJCQkweGYzMGMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjMJCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0CQkJMHhmMzEwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0CQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNQkJCTB4ZjMxNAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYJCQkweGYzMTgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjYJCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI3CQkJMHhmMzFjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI3CQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSOAkJCTB4ZjMyMAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSOAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjkJCQkweGYzMjQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjkJCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxMAkJMHhmMzI4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxMAkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTEJCTB4ZjMyYworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTEJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjEyCQkweGYzMzAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjEyCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxMwkJMHhmMzM0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxMwkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTQJCTB4ZjMzOAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTQJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjE1CQkweGYzM2MKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjE1CQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxNgkJMHhmMzQwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxNgkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMTcJCTB4ZjM0NAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMTcJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjE4CQkweGYzNDgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjE4CQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIxOQkJMHhmMzRjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIxOQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjAJCTB4ZjM1MAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjIxCQkweGYzNTQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjIxCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyMgkJMHhmMzU4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyMgkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjMJCTB4ZjM1YworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjMJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjI0CQkweGYzNjAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjI0CQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyNQkJMHhmMzY0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyNQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjYJCTB4ZjM2OAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjYJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjI3CQkweGYzNmMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjI3CQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIyOAkJMHhmMzcwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIyOAkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMjkJCTB4ZjM3NAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMjkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMwCQkweGYzNzgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjMwCQkweDAwMDAwMDQwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzMQkJMHhmMzdjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzMQkJMHgwMDAwMDA0MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzIJCTB4ZjMwMAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzIJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjMzCQkweGYzMDQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjMzCQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzNAkJMHhmMzA4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzNAkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzUJCTB4ZjMwYworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzUJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjM2CQkweGYzMTAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjM2CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVIzNwkJMHhmMzE0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVIzNwkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSMzgJCTB4ZjMxOAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSMzgJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjM5CQkweGYzMWMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjM5CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0MAkJMHhmMzIwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0MAkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDEJCTB4ZjMyNAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDEJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQyCQkweGYzMjgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQyCQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0MwkJMHhmMzJjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0MwkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDQJCTB4ZjMzMAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDQJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQ1CQkweGYzMzQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQ1CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0NgkJMHhmMzM4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0NgkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNDcJCTB4ZjMzYworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNDcJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjQ4CQkweGYzNDAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjQ4CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI0OQkJMHhmMzQ0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI0OQkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTAJCTB4ZjM0OAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTAJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjUxCQkweGYzNGMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjUxCQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1MgkJMHhmMzUwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1MgkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTMJCTB4ZjM1NAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTMJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjU0CQkweGYzNTgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjU0CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1NQkJMHhmMzVjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1NQkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTYJCTB4ZjM2MAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTYJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjU3CQkweGYzNjQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjU3CQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI1OAkJMHhmMzY4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI1OAkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNTkJCTB4ZjM2YworI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNTkJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYwCQkweGYzNzAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjYwCQkweDAwMDAwMDYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9UUF9CVUZGRVI2MQkJMHhmMzc0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9UUF9CVUZGRVI2MQkJMHgwMDAwMDA2MAorI2RlZmluZSBTVEIwODk5X09GRjBfVFBfQlVGRkVSNjIJCTB4ZjM3OAorI2RlZmluZSBTVEIwODk5X0JBU0VfVFBfQlVGRkVSNjIJCTB4MDAwMDAwNjAKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1RQX0JVRkZFUjYzCQkweGYzN2MKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1RQX0JVRkZFUjYzCQkweDAwMDAwMDYwCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX1JFU0VUX0NOVFJMCQkweGYzMDAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1JFU0VUX0NOVFJMCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfRFZCUzJfUkVTRVQJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RWQlMyX1JFU0VUCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRFZCUzJfUkVTRVQJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNNX0VOQUJMRQkJCTB4ZjMwNAorI2RlZmluZSBTVEIwODk5X0JBU0VfQUNNX0VOQUJMRQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9BQ01fRU5BQkxFCQkJMQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ERVNDUl9DTlRSTAkJMHhmMzBjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ERVNDUl9DTlRSTAkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X09GRlNUX0RFU0NSX0NOVFJMICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0RFU0NSX0NOVFJMICAgICAgICAgICAgICAgMTYKKworI2RlZmluZSBTVEIwODk5X09GRjBfVVdQX0NOVFJMMQkJCTB4ZjMyMAorI2RlZmluZSBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9VV1BfVEhfU09GCQkJKDB4N2ZmZiA8PCAxMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VV1BfVEhfU09GCQkxMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXUF9USF9TT0YJCTE1CisjZGVmaW5lIFNUQjA4OTlfVVdQX0VTTjBfUVVBTlQJCQkoMHhmZiA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VXUF9FU04wX1FVQU5UCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVVdQX0VTTjBfUVVBTlQJCTgKKyNkZWZpbmUgU1RCMDg5OV9VV1BfRVNOMF9BVkUJCQkoMHgwMyA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VXUF9FU04wX0FWRQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXUF9FU04wX0FWRQkJMgorI2RlZmluZSBTVEIwODk5X1VXUF9TVEFSVAkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVVdQX1NUQVJUCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXUF9TVEFSVAkJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfVVdQX0NOVFJMMgkJCTB4ZjMyNAorI2RlZmluZSBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMgkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9VV1BfTUlTU19USAkJCSgweGZmIDw8IDE2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VXUF9NSVNTX1RICQkxNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXUF9NSVNTX1RICQk4CisjZGVmaW5lIFNUQjA4OTlfRkVfRklORV9UUksJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFX0ZJTkVfVFJLCQk4CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVfRklORV9UUksJCTgKKyNkZWZpbmUgU1RCMDg5OV9GRV9DT0FSU0VfVFJLCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GRV9DT0FSU0VfVFJLCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVfQ09BUlNFX1RSSwkJOAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9VV1BfU1RBVDEJCQkweGYzMjgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1VXUF9TVEFUMQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9VV1BfU1RBVEUJCQkoMHgwM2ZmIDw8IDE1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VXUF9TVEFURQkJCTE1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVVdQX1NUQVRFCQkJMTAKKyNkZWZpbmUgU1RCMDg5OV9VV19NQVhfUEVBSwkJCSgweDdmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VV19NQVhfUEVBSwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXX01BWF9QRUFLCQkxNQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9VV1BfU1RBVDIJCQkweGYzMmMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX1VXUF9TVEFUMgkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9FU05PX0VTVAkJCSgweDA3ZmZmZiA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VTTjBfRVNUCQkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX0VTTjBfRVNUCQkJMTkKKyNkZWZpbmUgU1RCMDg5OV9VV1BfREVDT0RFX01PRAkJCSgweDdmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVVdQX0RFQ09ERV9NT0QJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9VV1BfREVDT0RFX01PRAkJNworCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ETURfQ09SRV9JRAkJMHhmMzM0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ETURfQ09SRV9JRAkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0NPUkVfSUQJCQkJKDB4ZmZmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DT1JFX0lECQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NPUkVfSUQJCQkzMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9ETURfVkVSU0lPTl9JRAkJMHhmMzNjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9ETURfVkVSU0lPTl9JRAkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X1ZFUlNJT05fSUQJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1ZFUlNJT05fSUQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9WRVJTSU9OX0lECQk4CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0RNRF9TVEFUMgkJCTB4ZjM0MAorI2RlZmluZSBTVEIwODk5X0JBU0VfRE1EX1NUQVQyCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0NTTV9MT0NLCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DU01fTE9DSwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fTE9DSwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9VV1BfTE9DSwkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVVdQX0xPQ0sJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVVdQX0xPQ0sJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZSRVFfQURKX1NDQUxFCQkweGYzNDQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZSRVFfQURKX1NDQUxFCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfRlJFUV9BREpfU0NBTEUJCQkoMHgwZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlJFUV9BREpfU0NBTEUJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GUkVRX0FESl9TQ0FMRQkJMTIKKworI2RlZmluZSBTVEIwODk5X09GRjBfVVdQX0NOVFJMMwkJCTB4ZjM0YworI2RlZmluZSBTVEIwODk5X0JBU0VfVVdQX0NOVFJMMwkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9VV1BfVEhfVFJBQ0sJCQkoMHg3ZmZmIDw8IDE1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VXUF9USF9UUkFDSwkJMTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9VV1BfVEhfVFJBQ0sJCTE1CisjZGVmaW5lIFNUQjA4OTlfVVdQX1RIX0FDUQkJCSgweDdmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VV1BfVEhfQUNRCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVVdQX1RIX0FDUQkJMTUKKworI2RlZmluZSBTVEIwODk5X09GRjBfU1lNX0NMS19TRUwJCTB4ZjM1MAorI2RlZmluZSBTVEIwODk5X0JBU0VfU1lNX0NMS19TRUwJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9TWU1fQ0xLX1NFTAkJCSgweDAzIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1lNX0NMS19TRUwJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TWU1fQ0xLX1NFTAkJMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9TT0ZfU1JDSF9UTwkJMHhmMzU0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9TT0ZfU1JDSF9UTwkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X1NPRl9TRUFSQ0hfVElNRU9VVAkJKDB4M2ZmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU09GX1NFQVJDSF9USU1FT1VUCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TT0ZfU0VBUkNIX1RJTUVPVVQJMjIKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNRX0NOVFJMMQkJCTB4ZjM1OAorI2RlZmluZSBTVEIwODk5X0JBU0VfQUNRX0NOVFJMMQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9GRV9GSU5FX0FDUQkJCSgweGZmIDw8IDgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRkVfRklORV9BQ1EJCTgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GRV9GSU5FX0FDUQkJOAorI2RlZmluZSBTVEIwODk5X0ZFX0NPQVJTRV9BQ1EJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFX0NPQVJTRV9BQ1EJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GRV9DT0FSU0VfQUNRCQk4CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0FDUV9DTlRSTDIJCQkweGYzNWMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0FDUV9DTlRSTDIJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfWklHWkFHCQkJCSgweDAxIDw8IDI1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1pJR1pBRwkJCTI1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfWklHWkFHCQkJMQorI2RlZmluZSBTVEIwODk5X05VTV9TVEVQUwkJCSgweGZmIDw8IDE3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX05VTV9TVEVQUwkJCTE3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTlVNX1NURVBTCQkJOAorI2RlZmluZSBTVEIwODk5X0ZSRVFfU1RFUFNJWkUJCQkoMHgxZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZSRVFfU1RFUFNJWkUJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GUkVRX1NURVBTSVpFCQkxNworCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9BQ1FfQ05UUkwzCQkJMHhmMzYwCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9BQ1FfQ05UUkwzCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X1RIUkVTSE9MRF9TQ0wJCQkoMHgzZiA8PCAyMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9USFJFU0hPTERfU0NMCQkyMworI2RlZmluZSBTVEIwODk5X1dJRFRIX1RIUkVTSE9MRF9TQ0wJCTYKKyNkZWZpbmUgU1RCMDg5OV9VV1BfVEhfU1JDSAkJCSgweDdmZmYgPDwgOCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VV1BfVEhfU1JDSAkJOAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VXUF9USF9TUkNICQkxNQorI2RlZmluZSBTVEIwODk5X0FVVE9fUkVBQ1FVSVJFCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BVVRPX1JFQUNRVUlSRQkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX0FVVE9fUkVBQ1FVSVJFCQkxCisjZGVmaW5lIFNUQjA4OTlfVFJBQ0tfTE9DS19TRUwJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RSQUNLX0xPQ0tfU0VMCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVFJBQ0tfTE9DS19TRUwJCTEKKyNkZWZpbmUgU1RCMDg5OV9BQ1FfU0VBUkNIX01PREUJCQkoMHgwMyA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FDUV9TRUFSQ0hfTU9ERQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FDUV9TRUFSQ0hfTU9ERQkJMgorI2RlZmluZSBTVEIwODk5X0NPTkZJUk1fRlJBTUVTCQkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DT05GSVJNX0ZSQU1FUwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NPTkZJUk1fRlJBTUVTCQk0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZFX1NFVFRMRQkJCTB4ZjM2NAorI2RlZmluZSBTVEIwODk5X0JBU0VfRkVfU0VUVExFCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X1NFVFRMSU5HX1RJTUUJCQkoMHgzZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TRVRUTElOR19USU1FCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU0VUVExJTkdfVElNRQkJMjIKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNfRFdFTEwJCQkweGYzNjgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0FDX0RXRUxMCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0RXRUxMX1RJTUUJCQkoMHgzZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9EV0VMTF9USU1FCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRFdFTExfVElNRQkJMjIKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNRVUlSRV9UUklHCQkweGYzNmMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0FDUVVJUkVfVFJJRwkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0FDUVVJUkUJCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BQ1FVSVJFCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FDUVVJUkUJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0xPQ0tfTE9TVAkJCTB4ZjM3MAorI2RlZmluZSBTVEIwODk5X0JBU0VfTE9DS19MT1NUCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0xPQ0tfTE9TVAkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTE9DS19MT1NUCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0xPQ0tfTE9TVAkJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNRX1NUQVQxCQkJMHhmMzc0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9BQ1FfU1RBVDEJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfU1RFUF9GUkVRCQkJKDB4MWZmZmZmIDw8IDExKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NURVBfRlJFUQkJCTExCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RFUF9GUkVRCQkJMjEKKyNkZWZpbmUgU1RCMDg5OV9BQ1FfU1RBVEUJCQkoMHgwNyA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FDUV9TVEFURQkJCTgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BQ1FfU1RBVEUJCQkzCisjZGVmaW5lIFNUQjA4OTlfVVdfREVURUNUX0NPVU5UCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VV19ERVRFQ1RfQ09VTlQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9VV19ERVRFQ1RfQ09VTlQJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfQUNRX1RJTUVPVVQJCTB4ZjM3OAorI2RlZmluZSBTVEIwODk5X0JBU0VfQUNRX1RJTUVPVVQJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9BQ1FfVElNRU9VVAkJCSgweDNmZmZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FDUV9USU1FT1VUCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQUNRX1RJTUVPVVQJCTIyCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0FDUV9USU1FCQkJMHhmMzdjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9BQ1FfVElNRQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1RCMDg5OV9BQ1FfVElNRV9TWU0JCQkoMHhmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BQ1FfVElNRV9TWU0JCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BQ1FfVElNRV9TWU0JCTI0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZJTkFMX0FHQ19DTlRSTAkJMHhmMzA4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9GSU5BTF9BR0NfQ05UUkwJCTB4MDAwMDA0NDAKKyNkZWZpbmUgU1RCMDg5OV9GSU5BTF9HQUlOX0lOSVQJCQkoMHgzZmZmIDw8IDEyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZJTkFMX0dBSU5fSU5JVAkJMTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSU5BTF9HQUlOX0lOSVQJCTE0CisjZGVmaW5lIFNUQjA4OTlfRklOQUxfTE9PUF9HQUlOCQkJKDB4MGYgPDwgOCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GSU5BTF9MT09QX0dBSU4JCTgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSU5BTF9MT09QX0dBSU4JCTQKKyNkZWZpbmUgU1RCMDg5OV9GSU5BTF9MRF9HQUlOX0lOSVQJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRklOQUxfTERfR0FJTl9JTklUCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSU5BTF9MRF9HQUlOX0lOSVQJMQorI2RlZmluZSBTVEIwODk5X0ZJTkFMX0FHQ19SRUYJCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZJTkFMX0FHQ19SRUYJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSU5BTF9BR0NfUkVGCQk3CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZJTkFMX0FHQ19HQUlOCQkweGYzMGMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZJTkFMX0FHQ19HQUlOCQkweDAwMDAwNDQwCisjZGVmaW5lIFNUQjA4OTlfRklOQUxfQUdDX0dBSU4JCQkoMHgzZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRklOQUxfQUdDX0dBSU4JCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSU5BTF9BR0NfR0FJTgkJMTQKKworI2RlZmluZSBTVEIwODk5X09GRjBfRVFVQUxJWkVSX0lOSVQJCTB4ZjMxMAorI2RlZmluZSBTVEIwODk5X0JBU0VfRVFVQUxJWkVSX0lOSVQJCTB4MDAwMDA0NDAKKyNkZWZpbmUgU1RCMDg5OV9FUV9TUlNUCQkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRVFfU1JTVAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FUV9TUlNUCQkJMQorI2RlZmluZSBTVEIwODk5X0VRX0lOSVQJCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9JTklUCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0VRX0lOSVQJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0VRX0NOVFJMCQkJMHhmMzE0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9FUV9DTlRSTAkJCTB4MDAwMDA0NDAKKyNkZWZpbmUgU1RCMDg5OV9FUV9BREFQVF9NT0RFCQkJKDB4MDEgPDwgMTgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRVFfQURBUFRfTU9ERQkJMTgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FUV9BREFQVF9NT0RFCQkxCisjZGVmaW5lIFNUQjA4OTlfRVFfREVMQVkJCQkoMHgwZiA8PCAxNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9ERUxBWQkJCTE0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVFfREVMQVkJCQk0CisjZGVmaW5lIFNUQjA4OTlfRVFfUVVBTlRfTEVWRUwJCQkoMHhmZiA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VRX1FVQU5UX0xFVkVMCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVFfUVVBTlRfTEVWRUwJCTgKKyNkZWZpbmUgU1RCMDg5OV9FUV9ESVNBQkxFX1VQREFURQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9ESVNBQkxFX1VQREFURQkJNQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0VRX0RJU0FCTEVfVVBEQVRFCQkxCisjZGVmaW5lIFNUQjA4OTlfRVFfQllQQVNTCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9CWVBBU1MJCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVFfQllQQVNTCQkJMQorI2RlZmluZSBTVEIwODk5X0VRX1NISUZUCQkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9TSElGVAkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FUV9TSElGVAkJCTQKKworI2RlZmluZSBTVEIwODk5X09GRjBfRVFfSV9JTklUX0NPRUZGXzAJCTB4ZjMyMAorI2RlZmluZSBTVEIwODk5X09GRjFfRVFfSV9JTklUX0NPRUZGXzEJCTB4ZjMyNAorI2RlZmluZSBTVEIwODk5X09GRjJfRVFfSV9JTklUX0NPRUZGXzIJCTB4ZjMyOAorI2RlZmluZSBTVEIwODk5X09GRjNfRVFfSV9JTklUX0NPRUZGXzMJCTB4ZjMyYworI2RlZmluZSBTVEIwODk5X09GRjRfRVFfSV9JTklUX0NPRUZGXzQJCTB4ZjMzMAorI2RlZmluZSBTVEIwODk5X09GRjVfRVFfSV9JTklUX0NPRUZGXzUJCTB4ZjMzNAorI2RlZmluZSBTVEIwODk5X09GRjZfRVFfSV9JTklUX0NPRUZGXzYJCTB4ZjMzOAorI2RlZmluZSBTVEIwODk5X09GRjdfRVFfSV9JTklUX0NPRUZGXzcJCTB4ZjMzYworI2RlZmluZSBTVEIwODk5X09GRjhfRVFfSV9JTklUX0NPRUZGXzgJCTB4ZjM0MAorI2RlZmluZSBTVEIwODk5X09GRjlfRVFfSV9JTklUX0NPRUZGXzkJCTB4ZjM0NAorI2RlZmluZSBTVEIwODk5X09GRmFfRVFfSV9JTklUX0NPRUZGXzEwCQkweGYzNDgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0VRX0lfSU5JVF9DT0VGRl9OCQkweDAwMDAwNDQwCisjZGVmaW5lIFNUQjA4OTlfRVFfSV9JTklUX0NPRUZGX04JCSgweDBmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9JX0lOSVRfQ09FRkZfTgkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0VRX0lfSU5JVF9DT0VGRl9OCQkxMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9FUV9RX0lOSVRfQ09FRkZfMAkJMHhmMzUwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMV9FUV9RX0lOSVRfQ09FRkZfMQkJMHhmMzU0CisjZGVmaW5lIFNUQjA4OTlfT0ZGMl9FUV9RX0lOSVRfQ09FRkZfMgkJMHhmMzU4CisjZGVmaW5lIFNUQjA4OTlfT0ZGM19FUV9RX0lOSVRfQ09FRkZfMwkJMHhmMzVjCisjZGVmaW5lIFNUQjA4OTlfT0ZGNF9FUV9RX0lOSVRfQ09FRkZfNAkJMHhmMzYwCisjZGVmaW5lIFNUQjA4OTlfT0ZGNV9FUV9RX0lOSVRfQ09FRkZfNQkJMHhmMzY0CisjZGVmaW5lIFNUQjA4OTlfT0ZGNl9FUV9RX0lOSVRfQ09FRkZfNgkJMHhmMzY4CisjZGVmaW5lIFNUQjA4OTlfT0ZGN19FUV9RX0lOSVRfQ09FRkZfNwkJMHhmMzZjCisjZGVmaW5lIFNUQjA4OTlfT0ZGOF9FUV9RX0lOSVRfQ09FRkZfOAkJMHhmMzcwCisjZGVmaW5lIFNUQjA4OTlfT0ZGOV9FUV9RX0lOSVRfQ09FRkZfOQkJMHhmMzc0CisjZGVmaW5lIFNUQjA4OTlfT0ZGYV9FUV9RX0lOSVRfQ09FRkZfMTAJCTB4ZjM3OAorI2RlZmluZSBTVEIwODk5X0JBU0VfRVFfUV9JTklUX0NPRUZGX04JCTB4MDAwMDA0NDAKKyNkZWZpbmUgU1RCMDg5OV9FUV9RX0lOSVRfQ09FRkZfTgkJKDB4MGZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VRX1FfSU5JVF9DT0VGRl9OCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVFfUV9JTklUX0NPRUZGX04JCTEyCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0VRX0lfT1VUX0NPRUZGXzAJCTB4ZjMwMAorI2RlZmluZSBTVEIwODk5X09GRjFfRVFfSV9PVVRfQ09FRkZfMQkJMHhmMzA0CisjZGVmaW5lIFNUQjA4OTlfT0ZGMl9FUV9JX09VVF9DT0VGRl8yCQkweGYzMDgKKyNkZWZpbmUgU1RCMDg5OV9PRkYzX0VRX0lfT1VUX0NPRUZGXzMJCTB4ZjMwYworI2RlZmluZSBTVEIwODk5X09GRjRfRVFfSV9PVVRfQ09FRkZfNAkJMHhmMzEwCisjZGVmaW5lIFNUQjA4OTlfT0ZGNV9FUV9JX09VVF9DT0VGRl81CQkweGYzMTQKKyNkZWZpbmUgU1RCMDg5OV9PRkY2X0VRX0lfT1VUX0NPRUZGXzYJCTB4ZjMxOAorI2RlZmluZSBTVEIwODk5X09GRjdfRVFfSV9PVVRfQ09FRkZfNwkJMHhmMzFjCisjZGVmaW5lIFNUQjA4OTlfT0ZGOF9FUV9JX09VVF9DT0VGRl84CQkweGYzMjAKKyNkZWZpbmUgU1RCMDg5OV9PRkY5X0VRX0lfT1VUX0NPRUZGXzkJCTB4ZjMyNAorI2RlZmluZSBTVEIwODk5X09GRmFfRVFfSV9PVVRfQ09FRkZfMTAJCTB4ZjMyOAorI2RlZmluZSBTVEIwODk5X0JBU0VfRVFfSV9PVVRfQ09FRkZfTgkJMHgwMDAwMDQ2MAorI2RlZmluZSBTVEIwODk5X0VRX0lfT1VUX0NPRUZGX04JCSgweDBmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUV9JX09VVF9DT0VGRl9OCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVFfSV9PVVRfQ09FRkZfTgkJMTIKKworI2RlZmluZSBTVEIwODk5X09GRjBfRVFfUV9PVVRfQ09FRkZfMAkJMHhmMzMwCisjZGVmaW5lIFNUQjA4OTlfT0ZGMV9FUV9RX09VVF9DT0VGRl8xCQkweGYzMzQKKyNkZWZpbmUgU1RCMDg5OV9PRkYyX0VRX1FfT1VUX0NPRUZGXzIJCTB4ZjMzOAorI2RlZmluZSBTVEIwODk5X09GRjNfRVFfUV9PVVRfQ09FRkZfMwkJMHhmMzNjCisjZGVmaW5lIFNUQjA4OTlfT0ZGNF9FUV9RX09VVF9DT0VGRl80CQkweGYzNDAKKyNkZWZpbmUgU1RCMDg5OV9PRkY1X0VRX1FfT1VUX0NPRUZGXzUJCTB4ZjM0NAorI2RlZmluZSBTVEIwODk5X09GRjZfRVFfUV9PVVRfQ09FRkZfNgkJMHhmMzQ4CisjZGVmaW5lIFNUQjA4OTlfT0ZGN19FUV9RX09VVF9DT0VGRl83CQkweGYzNGMKKyNkZWZpbmUgU1RCMDg5OV9PRkY4X0VRX1FfT1VUX0NPRUZGXzgJCTB4ZjM1MAorI2RlZmluZSBTVEIwODk5X09GRjlfRVFfUV9PVVRfQ09FRkZfOQkJMHhmMzU0CisjZGVmaW5lIFNUQjA4OTlfT0ZGYV9FUV9RX09VVF9DT0VGRl8xMAkJMHhmMzU4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9FUV9RX09VVF9DT0VGRl9OCQkweDAwMDAwNDYwCisjZGVmaW5lIFNUQjA4OTlfRVFfUV9PVVRfQ09FRkZfTgkJKDB4MGZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VRX1FfT1VUX0NPRUZGX04JCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FUV9RX09VVF9DT0VGRl9OCQkxMgorCisvKglTMiBGRUMJKi8KKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0JMT0NLX0xOR1RICQkweGZhMDQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JMT0NLX0xOR1RICQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfQkxPQ0tfTEVOR1RICQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CTE9DS19MRU5HVEgJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9CTE9DS19MRU5HVEgJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfUk9XX1NUUgkJCTB4ZmEwOAorI2RlZmluZSBTVEIwODk5X0JBU0VfUk9XX1NUUgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9ST1dfU1RSSURFCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ST1dfU1RSSURFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUk9XX1NUUklERQkJOAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9NQVhfSVRFUgkJCTB4ZmEwYworI2RlZmluZSBTVEIwODk5X0JBU0VfTUFYX0lURVIJCQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfTUFYX0lURVJBVElPTlMJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX01BWF9JVEVSQVRJT05TCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTUFYX0lURVJBVElPTlMJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfQk5fRU5EX0FERFIJCTB4ZmExMAorI2RlZmluZSBTVEIwODk5X0JBU0VfQk5fRU5EX0FERFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CTl9FTkRfQUREUgkJCSgweDBmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CTl9FTkRfQUREUgkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JOX0VORF9BRERSCQkxMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9DTl9FTkRfQUREUgkJMHhmYTE0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9DTl9FTkRfQUREUgkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0NOX0VORF9BRERSCQkJKDB4MGZmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NOX0VORF9BRERSCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ05fRU5EX0FERFIJCTEyCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0lORk9fTEVOR1RICQkweGZhMWMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0lORk9fTEVOR1RICQkweDAwMDAwMDAwCisjZGVmaW5lIFNUQjA4OTlfSU5GT19MRU5HVEgJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0lORk9fTEVOR1RICQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSU5GT19MRU5HVEgJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfQk9UX0FERFIJCQkweGZhMjAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JPVF9BRERSCQkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEIwODk5X0JPVFRPTV9CQVNFX0FERFIJCSgweDAzZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CT1RUT01fQkFTRV9BRERSCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQk9UVE9NX0JBU0VfQUREUgkJMTAKKworI2RlZmluZSBTVEIwODk5X09GRjBfQkNIX0JMS19MTgkJCTB4ZmEyNAorI2RlZmluZSBTVEIwODk5X0JBU0VfQkNIX0JMS19MTgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CQ0hfQkxPQ0tfTEVOR1RICQkoMHhmZmZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkNIX0JMT0NLX0xFTkdUSAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9CTE9DS19MRU5HVEgJCTE2CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0JDSF9UCQkJMHhmYTI4CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9CQ0hfVAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1RCMDg5OV9CQ0hfVAkJCQkoMHgwZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JDSF9UCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9UCQkJNAorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9DTkZHX01PREUJCQkweGZhMDAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NORkdfTU9ERQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgU1RCMDg5OV9NT0RDT0QJCQkJKDB4MWYgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9NT0RDT0QJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTU9EQ09ECQkJNQorI2RlZmluZSBTVEIwODk5X01PRENPRF9TRUwJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX01PRENPRF9TRUwJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9NT0RDT0RfU0VMCQkxCisjZGVmaW5lIFNUQjA4OTlfQ09ORklHX01PREUJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NPTkZJR19NT0RFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ09ORklHX01PREUJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfTERQQ19TVEFUCQkJMHhmYTA0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9MRFBDX1NUQVQJCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfSVRFUkFUSU9OCQkJKDB4ZmYgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JVEVSQVRJT04JCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSVRFUkFUSU9OCQkJOAorI2RlZmluZSBTVEIwODk5X0xEUENfREVDX1NUQVRFCQkJKDB4MDcgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MRFBDX0RFQ19TVEFURQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0xEUENfREVDX1NUQVRFCQkzCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0lURVJfU0NBTEUJCQkweGZhMDgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0lURVJfU0NBTEUJCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfSVRFUkFUSU9OX1NDQUxFCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JVEVSQVRJT05fU0NBTEUJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JVEVSQVRJT05fU0NBTEUJCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfSU5QVVRfTU9ERQkJCTB4ZmEwYworI2RlZmluZSBTVEIwODk5X0JBU0VfSU5QVVRfTU9ERQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgU1RCMDg5OV9TRF9CTE9DSzFfU1RSRUFNMAkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TRF9CTE9DSzFfU1RSRUFNMAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NEX0JMT0NLMV9TVFJFQU0wCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0xEUENERUNSU1QJCQkweGZhMTAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0xEUENERUNSU1QJCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfTERQQ19ERUNfUlNUCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MRFBDX0RFQ19SU1QJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9MRFBDX0RFQ19SU1QJCTEKKworI2RlZmluZSBTVEIwODk5X09GRjBfQ0xLX1BFUl9CWVRFX1JXCQkweGZhMTQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NMS19QRVJfQllURV9SVwkJMHgwMDAwMDgwMAorI2RlZmluZSBTVEIwODk5X0NMS1NfUEVSX0JZVEUJCQkoMHgwZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NMS1NfUEVSX0JZVEUJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DTEtTX1BFUl9CWVRFCQk1CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0JDSF9FUlJPUlMJCQkweGZhMTgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JDSF9FUlJPUlMJCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfQkNIX0VSUk9SUwkJCSgweDBmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkNIX0VSUk9SUwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9FUlJPUlMJCTQKKworI2RlZmluZSBTVEIwODk5X09GRjBfTERQQ19FUlJPUlMJCTB4ZmExYworI2RlZmluZSBTVEIwODk5X0JBU0VfTERQQ19FUlJPUlMJCTB4MDAwMDA4MDAKKyNkZWZpbmUgU1RCMDg5OV9MRFBDX0VSUk9SUwkJCSgweGZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MRFBDX0VSUk9SUwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0xEUENfRVJST1JTCQkxNgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9CQ0hfTU9ERQkJCTB4ZmEyMAorI2RlZmluZSBTVEIwODk5X0JBU0VfQkNIX01PREUJCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfQkNIX0NPUlJFQ1RfTgkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkNIX0NPUlJFQ1RfTgkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9DT1JSRUNUX04JCTEKKyNkZWZpbmUgU1RCMDg5OV9GVUxMX0JZUEFTUwkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlVMTF9CWVBBU1MJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GVUxMX0JZUEFTUwkJMQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9FUlJfQUNDX1BFUgkJMHhmYTI0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9FUlJfQUNDX1BFUgkJMHgwMDAwMDgwMAorI2RlZmluZSBTVEIwODk5X0JDSF9FUlJfQUNDX1BFUklPRAkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQ0hfRVJSX0FDQ19QRVJJT0QJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9FUlJfQUNDX1BFUklPRAk0CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0JDSF9FUlJfQUNDCQkweGZhMjgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0JDSF9FUlJfQUNDCQkweDAwMDAwODAwCisjZGVmaW5lIFNUQjA4OTlfQkNIX0VSUl9BQ0NVTQkJCSgweGZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQkNIX0VSUl9BQ0NVTQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9FUlJfQUNDVU0JCTgKKworI2RlZmluZSBTVEIwODk5X09GRjBfRkVDX0NPUkVfSURfUkVHCQkweGZhMmMKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZFQ19DT1JFX0lEX1JFRwkJMHgwMDAwMDgwMAorI2RlZmluZSBTVEIwODk5X0ZFQ19DT1JFX0lECQkJKDB4ZmZmZmZmZmYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GRUNfQ09SRV9JRAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZFQ19DT1JFX0lECQkzMgorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9GRUNfVkVSX0lEX1JFRwkJMHhmYTM0CisjZGVmaW5lIFNUQjA4OTlfQkFTRV9GRUNfVkVSX0lEX1JFRwkJMHgwMDAwMDgwMAorI2RlZmluZSBTVEIwODk5X0ZFQ19WRVJfSUQJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFQ19WRVJfSUQJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GRUNfVkVSX0lECQk4CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0ZFQ19UUF9TRUwJCQkweGZhMzgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0ZFQ19UUF9TRUwJCQkweDAwMDAwODAwCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEJCQkweGYzMTAKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDEJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfQ1NNX0ZPUkNFX0ZSRVFMT0NLCQkoMHgwMSA8PCAxOSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DU01fRk9SQ0VfRlJFUUxPQ0sJMTkKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fRk9SQ0VfRlJFUUxPQ0sJMQorI2RlZmluZSBTVEIwODk5X0NTTV9GUkVRX0xPQ0tTVEFURQkJKDB4MDEgPDwgMTgpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1NNX0ZSRVFfTE9DS1NUQVRFCTE4CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1NNX0ZSRVFfTE9DS1NUQVRFCTEKKyNkZWZpbmUgU1RCMDg5OV9DU01fQVVUT19QQVJBTQkJCSgweDAxIDw8IDE3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9BVVRPX1BBUkFNCQkxNworI2RlZmluZSBTVEIwODk5X1dJRFRIX0NTTV9BVVRPX1BBUkFNCQkxCisjZGVmaW5lIFNUQjA4OTlfRkVfTE9PUF9TSElGVAkJCSgweDA3IDw8IDE0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZFX0xPT1BfU0hJRlQJCTE0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRkVfTE9PUF9TSElGVAkJMworI2RlZmluZSBTVEIwODk5X0NTTV9BR0NfU0hJRlQJCQkoMHgwNyA8PCAxMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DU01fQUdDX1NISUZUCQkxMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NTTV9BR0NfU0hJRlQJCTMKKyNkZWZpbmUgU1RCMDg5OV9DU01fQUdDX0dBSU4JCQkoMHgxZmYgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DU01fQUdDX0dBSU4JCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fQUdDX0dBSU4JCTkKKyNkZWZpbmUgU1RCMDg5OV9DU01fVFdPX1BBU1MJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9UV09fUEFTUwkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NTTV9UV09fUEFTUwkJMQorI2RlZmluZSBTVEIwODk5X0NTTV9EVlRfVEFCTEUJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9EVlRfVEFCTEUJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fRFZUX1RBQkxFCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDIJCQkweGYzMTQKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDIJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfQ1NNX0dBTU1BX1JIT19BQ1EJCSgweDFmZiA8PCA5KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9HQU1NQV9SSE9BQ1EJCTkKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fR0FNTUFfUkhPQUNRCQk5CisjZGVmaW5lIFNUQjA4OTlfQ1NNX0dBTU1BX0FDUQkJCSgweDFmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9HQU1NQV9BQ1EJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fR0FNTUFfQUNRCQk5CisKKyNkZWZpbmUgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDMJCQkweGYzMTgKKyNkZWZpbmUgU1RCMDg5OV9CQVNFX0NTTV9DTlRSTDMJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNUQjA4OTlfQ1NNX0dBTU1BX1JIT19UUkFDSwkJKDB4MWZmIDw8IDkpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1NNX0dBTU1BX1JIT1RSQUNLCTkKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fR0FNTUFfUkhPVFJBQ0sJOQorI2RlZmluZSBTVEIwODk5X0NTTV9HQU1NQV9UUkFDSwkJCSgweDFmZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9HQU1NQV9UUkFDSwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NTTV9HQU1NQV9UUkFDSwkJOQorCisjZGVmaW5lIFNUQjA4OTlfT0ZGMF9DU01fQ05UUkw0CQkJMHhmMzFjCisjZGVmaW5lIFNUQjA4OTlfQkFTRV9DU01fQ05UUkw0CQkJMHgwMDAwMDQwMAorI2RlZmluZSBTVEIwODk5X0NTTV9QSEFTRURJRkZfVEhSRVNICQkoMHgwZiA8PCA4KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NTTV9QSEFTRURJRkZfVEhSRVNICTgKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DU01fUEhBU0VESUZGX1RIUkVTSAk0CisjZGVmaW5lIFNUQjA4OTlfQ1NNX0xPQ0tDT1VOVF9USFJFU0gJCSgweGZmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1NNX0xPQ0tDT1VOVF9USFJFU0gJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NTTV9MT0NLQ09VTlRfVEhSRVNICTgKKworLyoJQ2hlY2sgb24gY2hhcHRlciA4IHBhZ2UgNDIJKi8KKyNkZWZpbmUgU1RCMDg5OV9FUlJDVFJMMQkJCTB4ZjU3NAorI2RlZmluZSBTVEIwODk5X0VSUkNUUkwyCQkJMHhmNTc1CisjZGVmaW5lIFNUQjA4OTlfRVJSQ1RSTDMJCQkweGY1NzYKKyNkZWZpbmUgU1RCMDg5OV9FUlJfU1JDX1MxCQkJKDB4MWYgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUlJfU1JDX1MxCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVJSX1NSQ19TMQkJNQorI2RlZmluZSBTVEIwODk5X0VSUl9TUkNfUzIJCQkoMHgwZiA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VSUl9TUkNfUzIJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FUlJfU1JDX1MyCQk0CisjZGVmaW5lIFNUQjA4OTlfTk9FCQkJCSgweDA3IDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTk9FCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX05PRQkJCTMKKworI2RlZmluZSBTVEIwODk5X0VDTlQxTQkJCQkweGY1MjQKKyNkZWZpbmUgU1RCMDg5OV9FQ05UMUwJCQkJMHhmNTI1CisjZGVmaW5lIFNUQjA4OTlfRUNOVDJNCQkJCTB4ZjUyNgorI2RlZmluZSBTVEIwODk5X0VDTlQyTAkJCQkweGY1MjcKKyNkZWZpbmUgU1RCMDg5OV9FQ05UM00JCQkJMHhmNTI4CisjZGVmaW5lIFNUQjA4OTlfRUNOVDNMCQkJCTB4ZjUyOQorCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzEJCQkweGY1N2IKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMV9XQUlUXzFTVEVQCQkoMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X0RNT05NU0sxX0ZSRUVfMTQJCSgxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzFfQVZSR1ZJVF9DQUxDCQkoMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X0RNT05NU0sxX0ZSRUVfMTIJCSgxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzFfRlJFRV8xMQkJKDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMV9CMERJVl9DQUxDCQkoMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X0RNT05NU0sxX0tESVZCMV9DQUxDCQkoMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X0RNT05NU0sxX0tESVZCMl9DQUxDCQkoMSA8PCAwKQorCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzAJCQkweGY1N2MKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMF9TTU9UVEhfQ0FMQwkJKDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMF9GUkVFXzYJCQkoMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X0RNT05NU0swX1NJR1BPV0VSX0NBTEMJCSgxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzBfUVNFVUlMX0NBTEMJCSgxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfRE1PTk1TSzBfRlJFRV8zCQkJKDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMF9GUkVFXzIJCQkoMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X0RNT05NU0swX0tWRElWQjFfQ0FMQwkJKDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9ETU9OTVNLMF9LVkRJVkIyX0NBTEMJCSgxIDw8IDApCisKKyNkZWZpbmUgU1RCMDg5OV9UU1VMQwkJCQkweGY1NDkKKyNkZWZpbmUgU1RCMDg5OV9VTE5PU1lOQ0JZVEVTCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VTE5PU1lOQ0JZVEVTCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVUxOT1NZTkNCWVRFUwkJMQorI2RlZmluZSBTVEIwODk5X1VMUEFSSVRZX09OCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VTFBBUklUWV9PTgkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1VMUEFSSVRZX09OCQkxCisjZGVmaW5lIFNUQjA4OTlfVUxTWU5DT1VUUlMJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1VMU1lOQ09VVFJTCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVUxTWU5DT1VUUlMJCTEKKyNkZWZpbmUgU1RCMDg5OV9VTERTU19QQUNLRVRTCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9VTERTU19QQUNLRVRTCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVUxEU1NfUEFDS0VUUwkJMQorCisjZGVmaW5lIFNUQjA4OTlfVFNMUEwJCQkJMHhmNTRiCisjZGVmaW5lIFNUQjA4OTlfTExEVkJTMl9NT0RFCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MTERWQlMyX01PREUJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9MTERWQlMyX01PREUJCTEKKyNkZWZpbmUgU1RCMDg5OV9MTElTU1lJX09OCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MTElTU1lJX09OCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTExJU1NZSV9PTgkJMQorI2RlZmluZSBTVEIwODk5X0xMTlBEX09OCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MTE5QRF9PTgkJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9MTE5QRF9PTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9MTENSQzhfT04JCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0xMQ1JDOF9PTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9MTENSQzhfT04JCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9UU0NGR0gJCQkJMHhmNTRjCisjZGVmaW5lIFNUQjA4OTlfT1VUUlNfUFMJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX09VVFJTX1BTCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX09VVFJTX1BTCQkJMQorI2RlZmluZSBTVEIwODk5X1NZTkNCWVRFCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TWU5DQllURQkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TWU5DQllURQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9QRkJJVAkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1BGQklUCQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1BGQklUCQkJMQorI2RlZmluZSBTVEIwODk5X0VSUl9CSVQJCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUlJfQklUCQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0VSUl9CSVQJCQkxCisjZGVmaW5lIFNUQjA4OTlfTVBFRwkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX01QRUcJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTVBFRwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9DTEtfUE9MCQkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ0xLX1BPTAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DTEtfUE9MCQkJMQorI2RlZmluZSBTVEIwODk5X0ZPUkNFMAkJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZPUkNFMAkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GT1JDRTAJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9UU0NGR00JCQkJMHhmNTRkCisjZGVmaW5lIFNUQjA4OTlfTExQUklPUklUWQkJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTExQUklPUklZCQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0xMUFJJT1JJVFkJCTEKKyNkZWZpbmUgU1RCMDg5OV9FTjE4OAkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VOMTg4CQkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0VOMTg4CQkJMQorCisjZGVmaW5lIFNUQjA4OTlfVFNDRkdMCQkJCTB4ZjU0ZQorI2RlZmluZSBTVEIwODk5X0RFTF9FUlJQQ0sJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RFTF9FUlJQQ0sJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9ERUxfRVJSUENLCQkxCisjZGVmaW5lIFNUQjA4OTlfRVJSRkxBR1NURAkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRVJSRkxBR1NURAkJNQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0VSUkZMQUdTVEQJCTEKKyNkZWZpbmUgU1RCMDg5OV9NUEVHRVJSCQkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTVBFR0VSUgkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9NUEVHRVJSCQkJMQorI2RlZmluZSBTVEIwODk5X0JDSF9DSEsJCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQ0hfQ0hLCQkJNQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9DSEsJCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JDOENISwkJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NSQzhDSEsJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1JDOENISwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9TUEVDX0lORk8JCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NQRUNfSU5GTwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TUEVDX0lORk8JCQkxCisjZGVmaW5lIFNUQjA4OTlfTE9XX1BSSU9fQ0xLCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9MT1dfUFJJT19DTEsJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9MT1dfUFJJT19DTEsJCTEKKyNkZWZpbmUgU1RCMDg5OV9FUlJPUl9OT1JNCQkJKDB4MDAgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9FUlJPUl9OT1JNCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVJST1JfTk9STQkJMAorCisjZGVmaW5lIFNUQjA4OTlfVFNPVVQJCQkJMHhmNTRmCisjZGVmaW5lIFNUQjA4OTlfUlNTWU5DREVMCQkJMHhmNTUwCisjZGVmaW5lIFNUQjA4OTlfVFNJTkhERUxICQkJMHhmNTUxCisjZGVmaW5lIFNUQjA4OTlfVFNJTkhERUxNCQkJMHhmNTUyCisjZGVmaW5lIFNUQjA4OTlfVFNJTkhERUxMCQkJMHhmNTUzCisjZGVmaW5lIFNUQjA4OTlfVFNMTFNUS00JCQkweGY1NWEKKyNkZWZpbmUgU1RCMDg5OV9UU0xMU1RLTAkJCTB4ZjU1YgorI2RlZmluZSBTVEIwODk5X1RTVUxTVEtNCQkJMHhmNTVjCisjZGVmaW5lIFNUQjA4OTlfVFNVTFNUS0wJCQkweGY1NWQKKyNkZWZpbmUgU1RCMDg5OV9UU1NUQVRVUwkJCTB4ZjU2MQorCisjZGVmaW5lIFNUQjA4OTlfUERFTENUUkwJCQkweGY2MDAKKyNkZWZpbmUgU1RCMDg5OV9JTlZFUlRfUkVTCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JTlZFUlRfUkVTCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSU5WRVJUX1JFUwkJMQorI2RlZmluZSBTVEIwODk5X0ZPUkNFX0FDQ0VQVEVECQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GT1JDRV9BQ0NFUFRFRAkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZPUkNFX0FDQ0VQVEVECQkxCisjZGVmaW5lIFNUQjA4OTlfRklMVEVSX0VOCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GSUxURVJfRU4JCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRklMVEVSX0VOCQkJMQorI2RlZmluZSBTVEIwODk5X0xPQ0tGQUxMX1RIUkVTSAkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTE9DS0ZBTExfVEhSRVNICQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTE9DS0ZBTExfVEhSRVNICQkxCisjZGVmaW5lIFNUQjA4OTlfSFlTVF9FTgkJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0hZU1RfRU4JCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSFlTVF9FTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9IWVNUX1NXUlNUCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9IWVNUX1NXUlNUCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSFlTVF9TV1JTVAkJMQorI2RlZmluZSBTVEIwODk5X0FMR09fRU4JCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BTEdPX0VOCQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FMR09fRU4JCQkxCisjZGVmaW5lIFNUQjA4OTlfQUxHT19TV1JTVAkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQUxHT19TV1JTVAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FMR09fU1dSU1QJCTEKKworI2RlZmluZSBTVEIwODk5X1BERUxDVFJMMgkJCTB4ZjYwMQorI2RlZmluZSBTVEIwODk5X0JCSENUUkwxCQkJMHhmNjAyCisjZGVmaW5lIFNUQjA4OTlfQkJIQ1RSTDIJCQkweGY2MDMKKyNkZWZpbmUgU1RCMDg5OV9IWVNUVEhSRVNICQkJMHhmNjA0CisKKyNkZWZpbmUgU1RCMDg5OV9NQVRDU1RNCQkJCTB4ZjYwNQorI2RlZmluZSBTVEIwODk5X01BVENTVEwJCQkJMHhmNjA2CisjZGVmaW5lIFNUQjA4OTlfVVBMQ1NUTQkJCQkweGY2MDcKKyNkZWZpbmUgU1RCMDg5OV9VUExDU1RMCQkJCTB4ZjYwOAorI2RlZmluZSBTVEIwODk5X0RGTENTVE0JCQkJMHhmNjA5CisjZGVmaW5lIFNUQjA4OTlfREZMQ1NUTAkJCQkweGY2MGEKKyNkZWZpbmUgU1RCMDg5OV9TWU5DQ1NUCQkJCTB4ZjYwYgorI2RlZmluZSBTVEIwODk5X1NZTkNEQ1NUTQkJCTB4ZjYwYworI2RlZmluZSBTVEIwODk5X1NZTkNEQ1NUTAkJCTB4ZjYwZAorI2RlZmluZSBTVEIwODk5X0lTSV9FTlRSWQkJCTB4ZjYwZQorI2RlZmluZSBTVEIwODk5X0lTSV9CSVRfRU4JCQkweGY2MGYKKyNkZWZpbmUgU1RCMDg5OV9NQVRTVFJNCQkJCTB4ZjYxMAorI2RlZmluZSBTVEIwODk5X01BVFNUUkwJCQkJMHhmNjExCisjZGVmaW5lIFNUQjA4OTlfVVBMU1RSTQkJCQkweGY2MTIKKyNkZWZpbmUgU1RCMDg5OV9VUExTVFJMCQkJCTB4ZjYxMworI2RlZmluZSBTVEIwODk5X0RGTFNUUk0JCQkJMHhmNjE0CisjZGVmaW5lIFNUQjA4OTlfREZMU1RSTAkJCQkweGY2MTUKKyNkZWZpbmUgU1RCMDg5OV9TWU5DU1RSCQkJCTB4ZjYxNgorI2RlZmluZSBTVEIwODk5X1NZTkNEU1RSTQkJCTB4ZjYxNworI2RlZmluZSBTVEIwODk5X1NZTkNEU1RSTAkJCTB4ZjYxOAorCisjZGVmaW5lIFNUQjA4OTlfQ0ZHUERFTFNUQVRVUzEJCQkweGY2MTkKKyNkZWZpbmUgU1RCMDg5OV9CQURERkwJCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQURERkwJCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkFEREZMCQkJMQorI2RlZmluZSBTVEIwODk5X0NPTlRJTlVPVVNfU1RSRUFNCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0NPTlRJTlVPVVNfU1RSRUFNCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ09OVElOVU9VU19TVFJFQU0JCTEKKyNkZWZpbmUgU1RCMDg5OV9BQ0NFUFRFRF9TVFJFQU0JCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FDQ0VQVEVEX1NUUkVBTQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FDQ0VQVEVEX1NUUkVBTQkJMQorI2RlZmluZSBTVEIwODk5X0JDSF9FUlJGTEFHCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQ0hfRVJSRkxBRwkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDSF9FUlJGTEFHCQkxCisjZGVmaW5lIFNUQjA4OTlfQ1JDUkVTCQkJCSgweDAxIDw8IDIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1JDUkVTCQkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0NSQ1JFUwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9DRkdQREVMU1RBVFVTX0xPQ0sJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ0ZHUERFTFNUQVRVU19MT0NLCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DRkdQREVMU1RBVFVTX0xPQ0sJMQorI2RlZmluZSBTVEIwODk5XzFTVExPQ0sJCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF8xU1RMT0NLCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIXzFTVExPQ0sJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9DRkdQREVMU1RBVFVTMgkJCTB4ZjYxYQorI2RlZmluZSBTVEIwODk5X0JCRkVSUk9STQkJCTB4ZjYxYgorI2RlZmluZSBTVEIwODk5X0JCRkVSUk9STAkJCTB4ZjYxYworI2RlZmluZSBTVEIwODk5X1VQS1RFUlJPUk0JCQkweGY2MWQKKyNkZWZpbmUgU1RCMDg5OV9VUEtURVJST1JMCQkJMHhmNjFlCisKKyNkZWZpbmUgU1RCMDg5OV9UU1RDSwkJCQkweGZmMTAKKworI2RlZmluZSBTVEIwODk5X1RTVFJFUwkJCQkweGZmMTEKKyNkZWZpbmUgU1RCMDg5OV9GUkVTTERQQwkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlJFU0xEUEMJCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRlJFU0xEUEMJCQkxCisjZGVmaW5lIFNUQjA4OTlfRlJFU1JTCQkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlJFU1JTCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZSRVNSUwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9GUkVTVklUCQkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlJFU1ZJVAkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GUkVTVklUCQkJMQorI2RlZmluZSBTVEIwODk5X0ZSRVNNQVMxXzIJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZSRVNNQVMxXzIJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GUkVTTUFTMV8yCQkxCisjZGVmaW5lIFNUQjA4OTlfRlJFU0FDUwkJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZSRVNBQ1MJCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRlJFU0FDUwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9GUkVTU1lNCQkJCSgweDAxIDw8IDIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRlJFU1NZTQkJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GUkVTU1lNCQkJMQorI2RlZmluZSBTVEIwODk5X0ZSRVNNQVMJCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GUkVTTUFTCQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZSRVNNQVMJCQkxCisjZGVmaW5lIFNUQjA4OTlfRlJFU0lOVAkJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZSRVNJTklUCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZSRVNJTklUCQkJMQorCisjZGVmaW5lIFNUQjA4OTlfVFNUT1VUCQkJCTB4ZmYxMgorI2RlZmluZSBTVEIwODk5X0VOX1NJR05BVFVSRQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRU5fU0lHTkFUVVJFCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRU5fU0lHTkFUVVJFCQkxCisjZGVmaW5lIFNUQjA4OTlfQkNMS19DTEsJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0JDTEtfQ0xLCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDTEtfQ0xLCQkJMQorI2RlZmluZSBTVEIwODk5X1NHTkxfT1VUCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TR05MX09VVAkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TR05MX09VVAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9UUwkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RTCQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1RTCQkJMQorI2RlZmluZSBTVEIwODk5X0NURVNUCQkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQ1RFU1QJCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQ1RFU1QJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9UU1RJTgkJCQkweGZmMTMKKyNkZWZpbmUgU1RCMDg5OV9URVNUX0lOCQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVEVTVF9JTgkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9URVNUX0lOCQkJMQorI2RlZmluZSBTVEIwODk5X0VOX0FEQwkJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VOX0FEQwkJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FTkFEQwkJCTEKKyNkZWZpbmUgU1RCMDg5OV9TR05fQURDCQkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU0dOX0FEQwkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TR05fQURDCQkJMQorI2RlZmluZSBTVEIwODk5X0JDTEtfSU4JCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQ0xLX0lOCQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JDTEtfSU4JCQkxCisjZGVmaW5lIFNUQjA4OTlfSkVUT05JTl9NT0RFCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9KRVRPTklOX01PREUJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9KRVRPTklOX01PREUJCTEKKyNkZWZpbmUgU1RCMDg5OV9CQ0xLX1ZBTFVFCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CQ0xLX1ZBTFVFCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQkNMS19WQUxVRQkJMQorI2RlZmluZSBTVEIwODk5X1NHTlJTVF9UMTIJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NHTlJTVF9UMTIJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TR05SU1RfVDEyCQkxCisjZGVmaW5lIFNUQjA4OTlfTE9XU1BfRU5BWAkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTE9XU1BfRU5BWAkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0xPV1NQX0VOQVgJCTEKKworI2RlZmluZSBTVEIwODk5X1RTVFNZUwkJCQkweGZmMTQKKyNkZWZpbmUgU1RCMDg5OV9UU1RDSElQCQkJCTB4ZmYxNQorI2RlZmluZSBTVEIwODk5X1RTVEZSRUUJCQkJMHhmZjE2CisjZGVmaW5lIFNUQjA4OTlfVFNUSTJDCQkJCTB4ZmYxNworI2RlZmluZSBTVEIwODk5X0JJVFNQRUVETQkJCTB4ZmYxYworI2RlZmluZSBTVEIwODk5X0JJVFNQRUVETAkJCTB4ZmYxZAorI2RlZmluZSBTVEIwODk5X1RCVVNCSVQJCQkJMHhmZjFlCisjZGVmaW5lIFNUQjA4OTlfVFNURElTCQkJCTB4ZmYyNAorI2RlZmluZSBTVEIwODk5X1RTVERJU1JYCQkJMHhmZjI1CisjZGVmaW5lIFNUQjA4OTlfVFNUSkVUT04JCQkweGZmMjgKKyNkZWZpbmUgU1RCMDg5OV9UU1REQ0FESgkJCTB4ZmY0MAorI2RlZmluZSBTVEIwODk5X1RTVEFHQzEJCQkJMHhmZjQxCisjZGVmaW5lIFNUQjA4OTlfVFNUQUdDMU4JCQkweGZmNDIKKyNkZWZpbmUgU1RCMDg5OV9UU1RQT0xZUEgJCQkweGZmNDgKKyNkZWZpbmUgU1RCMDg5OV9UU1RSCQkJCTB4ZmY0OQorI2RlZmluZSBTVEIwODk5X1RTVEFHQzIJCQkJMHhmZjRhCisjZGVmaW5lIFNUQjA4OTlfVFNUQ1RMMQkJCQkweGZmNGIKKyNkZWZpbmUgU1RCMDg5OV9UU1RDVEwyCQkJCTB4ZmY0YworI2RlZmluZSBTVEIwODk5X1RTVENUTDMJCQkJMHhmZjRkCisjZGVmaW5lIFNUQjA4OTlfVFNUREVNQVAJCQkweGZmNTAKKyNkZWZpbmUgU1RCMDg5OV9UU1RERU1BUDIJCQkweGZmNTEKKyNkZWZpbmUgU1RCMDg5OV9UU1RERU1NT04JCQkweGZmNTIKKyNkZWZpbmUgU1RCMDg5OV9UU1RSQVRFCQkJCTB4ZmY1MworI2RlZmluZSBTVEIwODk5X1RTVFNFTE9VVAkJCTB4ZmY1NAorI2RlZmluZSBTVEIwODk5X1RTWU5DCQkJCTB4ZmY1NQorI2RlZmluZSBTVEIwODk5X1RTVEVSUgkJCQkweGZmNTYKKyNkZWZpbmUgU1RCMDg5OV9UU1RSQU0xCQkJCTB4ZmY1OAorI2RlZmluZSBTVEIwODk5X1RTVFZTRUxPVVQJCQkweGZmNTkKKyNkZWZpbmUgU1RCMDg5OV9UU1RGT1JDRUlOCQkJMHhmZjVhCisjZGVmaW5lIFNUQjA4OTlfVFNUUlMxCQkJCTB4ZmY1YworI2RlZmluZSBTVEIwODk5X1RTVFJTMgkJCQkweGZmNWQKKyNkZWZpbmUgU1RCMDg5OV9UU1RSUzMJCQkJMHhmZjUzCisKKyNkZWZpbmUgU1RCMDg5OV9JTlRCVUZTVEFUVVMJCQkweGYyMDAKKyNkZWZpbmUgU1RCMDg5OV9JTlRCVUZDVFJMCQkJMHhmMjAxCisjZGVmaW5lIFNUQjA4OTlfUENLTEVOVUwJCQkweGY1NWUKKyNkZWZpbmUgU1RCMDg5OV9QQ0tMRU5MTAkJCTB4ZjU1ZgorI2RlZmluZSBTVEIwODk5X1JTUENLTEVOCQkJMHhmNTYwCisKKy8qCTIgcmVnaXN0ZXJzCSovCisjZGVmaW5lIFNUQjA4OTlfU1lOQ0RDU1QJCQkweGY2MGMKKworLyoJRGlTRXFDCSovCisjZGVmaW5lIFNUQjA4OTlfRElTQ05UUkwxCQkJMHhmMGEwCisjZGVmaW5lIFNUQjA4OTlfVElNT0ZGCQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfVElNT0ZGCQkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX1RJTU9GRgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9ESVNFUUNSRVNFVAkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRElTRVFDUkVTRVQJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9ESVNFUUNSRVNFVAkJMQorI2RlZmluZSBTVEIwODk5X1RJTUNNRAkJCQkoMHgwMyA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RJTUNNRAkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9USU1DTUQJCQkyCisjZGVmaW5lIFNUQjA4OTlfRElTUFJFQ0hBUkdFCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ESVNQUkVDSEFSR0UJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9ESVNQUkVDSEFSR0UJCTEKKyNkZWZpbmUgU1RCMDg5OV9ESVNFUUNNT0RFCQkJKDB4MDMgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ESVNFUUNNT0RFCQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRElTRVFDTU9ERQkJMgorCisjZGVmaW5lIFNUQjA4OTlfRElTQ05UUkwyCQkJMHhmMGExCisjZGVmaW5lIFNUQjA4OTlfUkVDRUlWRVJfT04JCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1JFQ0VJVkVSX09OCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUkVDRUlWRVJfT04JCTEKKyNkZWZpbmUgU1RCMDg5OV9JR05PX1NIT1JUXzIySwkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSUdOT19TSE9SVF8yMksJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JR05PX1NIT1JUXzIySwkJMQorI2RlZmluZSBTVEIwODk5X09ORUNISVBfVFJYCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9PTkVDSElQX1RSWAkJNQorI2RlZmluZSBTVEIwODk5X1dJRFRIX09ORUNISVBfVFJYCQkxCisjZGVmaW5lIFNUQjA4OTlfRVhUX0VOVkVMT1AJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0VYVF9FTlZFTE9QCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRVhUX0VOVkVMT1AJCTEKKyNkZWZpbmUgU1RCMDg5OV9QSU5fU0VMRUNUCQkJKDB4MDMgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9QSU5fU0VMQ1QJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUElOX1NFTENUCQkJMgorI2RlZmluZSBTVEIwODk5X0lSUV9SWEVORAkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSVJRX1JYRU5ECQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX0lSUV9SWEVORAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9JUlFfNE5CWVRFUwkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSVJRXzROQllURVMJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JUlFfNE5CWVRFUwkJMQorCisjZGVmaW5lIFNUQjA4OTlfRElTUlhfU1QwCQkJMHhmMGE0CisjZGVmaW5lIFNUQjA4OTlfUlhFTkQJCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9SWEVORAkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9SWEVORAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9SWEFDVElWRQkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUlhBQ1RJVkUJCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUlhBQ1RJVkUJCQkxCisjZGVmaW5lIFNUQjA4OTlfU0hPUlQyMksJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NIT1JUMjJLCQkJNQorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NIT1JUMjJLCQkJMQorI2RlZmluZSBTVEIwODk5X0NPTlRUT05FCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9DT05UVE9ORQkJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9DT05UT05FCQkJMQorI2RlZmluZSBTVEIwODk5XzRCRklGT1JFRFkJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUXzRCRklGT1JFRFkJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF80QkZJRk9SRURZCQkxCisjZGVmaW5lIFNUQjA4OTlfRklGT0VNUFRZCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GSUZPRU1QVFkJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRklGT0VNUFRZCQkJMQorI2RlZmluZSBTVEIwODk5X0FCT1JUVFJYCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BQk9SVFRSWAkJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BQk9SVFRSWAkJCTEKKworI2RlZmluZSBTVEIwODk5X0RJU1JYX1NUMQkJCTB4ZjBhNQorI2RlZmluZSBTVEIwODk5X1JYRkFJTAkJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1JYRkFJTAkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9SWEZBSUwJCQkxCisjZGVmaW5lIFNUQjA4OTlfRklGT1BGQUlMCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9GSUZPUEZBSUwJCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRklGT1BGQUlMCQkJMQorI2RlZmluZSBTVEIwODk5X1JYTk9OQllURVMJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1JYTk9OQllURVMJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9SWE5PTkJZVEVTCQkxCisjZGVmaW5lIFNUQjA4OTlfRklGT09WRgkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZJRk9PVkYJCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfRklGT09WRgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9GSUZPQllURU5CUgkJCSgweDBmIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRklGT0JZVEVOQlIJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9GSUZPQllURU5CUgkJNAorCisjZGVmaW5lIFNUQjA4OTlfRElTUEFSSVRZCQkJMHhmMGE2CisKKyNkZWZpbmUgU1RCMDg5OV9ESVNGSUZPCQkJCTB4ZjBhNworCisjZGVmaW5lIFNUQjA4OTlfRElTU1RBVFVTCQkJMHhmMGE4CisjZGVmaW5lIFNUQjA4OTlfRklGT0ZVTEwJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0ZJRk9GVUxMCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0ZJRk9GVUxMCQkJMQorI2RlZmluZSBTVEIwODk5X1RYSURMRQkJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1RYSURMRQkJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9UWElETEUJCQkxCisjZGVmaW5lIFNUQjA4OTlfR0FQQlVSU1QJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0dBUEJVUlNUCQkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0dBUEJVUlNUCQkJMQorI2RlZmluZSBTVEIwODk5X1RYRklGT0JZVEVTCQkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UWEZJRk9CWVRFUwkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1RYRklGT0JZVEVTCQk0CisjZGVmaW5lIFNUQjA4OTlfRElTRjIyCQkJCTB4ZjBhOQorCisjZGVmaW5lIFNUQjA4OTlfRElTRjIyUlgJCQkweGYwYWEKKworLyoJR2VuZXJhbCBQdXJwb3NlCSovCisjZGVmaW5lIFNUQjA4OTlfU1lTUkVHCQkJCTB4ZjEwMQorI2RlZmluZSBTVEIwODk5X0FDUlBSRVNDCQkJMHhmMTEwCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUlNWRDIJCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUlNWRDIJCQkxCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQUNSUFJFU0MJCQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQUNSUFJFU0MJCQkzCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfUlNWRDEJCQkzCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfUlNWRDEJCQkxCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQUNSUFJFU0MyCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FDUlBSRVNDMgkJCTMKKworI2RlZmluZSBTVEIwODk5X0FDUkRJVjEJCQkJMHhmMTExCisjZGVmaW5lIFNUQjA4OTlfQUNSRElWMgkJCQkweGYxMTIKKyNkZWZpbmUgU1RCMDg5OV9EQUNSMQkJCQkweGYxMTMKKyNkZWZpbmUgU1RCMDg5OV9EQUNSMgkJCQkweGYxMTQKKyNkZWZpbmUgU1RCMDg5OV9PVVRDRkcJCQkJMHhmMTFjCisjZGVmaW5lIFNUQjA4OTlfTU9ERUNGRwkJCQkweGYxMWQKKyNkZWZpbmUgU1RCMDg5OV9OQ09BUlNFCQkJCTB4ZjFiMworCisjZGVmaW5lIFNUQjA4OTlfU1lOVENUUkwJCQkweGYxYjYKKyNkZWZpbmUgU1RCMDg5OV9TVEFOREJZCQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1RBTkRCWQkJCTcKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVEFOREJZCQkJMQorI2RlZmluZSBTVEIwODk5X0JZUEFTU1BMTAkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQllQQVNTUExMCQkJNgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0JZUEFTU1BMTAkJCTEKKyNkZWZpbmUgU1RCMDg5OV9TRUwxWFJBVElPCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TRUwxWFJBVElPCQk1CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU0VMMVhSQVRJTwkJMQorI2RlZmluZSBTVEIwODk5X1NFTE9TQ0kJCQkJKDB4MDEgPDwgMSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TRUxPU0NJCQkJMQorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NFTE9TQ0kJCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9GSUxUQ1RSTAkJCTB4ZjFiNworI2RlZmluZSBTVEIwODk5X1NZU0NUUkwJCQkJMHhmMWI4CisKKyNkZWZpbmUgU1RCMDg5OV9TVE9QQ0xLMQkJCTB4ZjFjMgorI2RlZmluZSBTVEIwODk5X1NUT1BfQ0tJTlRCVUYxMDgJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1RPUF9DS0lOVEJVRjEwOAkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX1NUT1BfQ0tJTlRCVUYxMDgJCTEKKyNkZWZpbmUgU1RCMDg5OV9TVE9QX0NLSU5UQlVGMjE2CQkoMHgwMSA8PCA2KQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUT1BfQ0tJTlRCVUYyMTYJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NLSU5UQlVGMjE2CQkxCisjZGVmaW5lIFNUQjA4OTlfU1RPUF9DSEs4UFNLCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TVE9QX0NISzhQU0sJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NISzhQU0sJCTEKKyNkZWZpbmUgU1RCMDg5OV9TVE9QX0NLRkVDMTA4CQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TVE9QX0NLRkVDMTA4CQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RPUF9DS0ZFQzEwOAkJMQorI2RlZmluZSBTVEIwODk5X1NUT1BfQ0tGRUMyMTYJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUT1BfQ0tGRUMyMTYJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NLRkVDMjE2CQkxCisjZGVmaW5lIFNUQjA4OTlfU1RPUF9DS0NPUkUyMTYJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUT1BfQ0tDT1JFMjE2CQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RPUF9DS0NPUkUyMTYJCTEKKyNkZWZpbmUgU1RCMDg5OV9TVE9QX0NLQURDSTEwOAkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1RPUF9DS0FEQ0kxMDgJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NLQURDSTEwOAkJMQorI2RlZmluZSBTVEIwODk5X1NUT1BfSU5WQ0tBRENJMTA4CQkoMHgwMSA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUT1BfSU5WQ0tBRENJMTA4CQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RPUF9JTlZDS0FEQ0kxMDgJCTEKKworI2RlZmluZSBTVEIwODk5X1NUT1BDTEsyCQkJMHhmMWMzCisjZGVmaW5lIFNUQjA4OTlfU1RPUF9DS1MyRE1EMTA4CQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TVE9QX0NLUzJETUQxMDgJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NLUzJETUQxMDgJCTEKKyNkZWZpbmUgU1RCMDg5OV9TVE9QX0NLUEtETElOMTA4CQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUT1BfQ0tQS0RMSU4xMDgJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QX0NLUEtETElOMTA4CQkxCisjZGVmaW5lIFNUQjA4OTlfU1RPUF9DS1BLRExJTjIxNgkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9TVE9QX0NLUEtETElOMjE2CQkwCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RPUF9DS1BLRExJTjIxNgkJMQorCisjZGVmaW5lIFNUQjA4OTlfVFNUVE5SMQkJCQkweGYxZTAKKyNkZWZpbmUgU1RCMDg5OV9CWVBBU1NfQURDCQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9CWVBBU1NfQURDCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfQllQQVNTX0FEQwkJMQorI2RlZmluZSBTVEIwODk5X0lOVkFEQ0lDS09VVAkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSU5WQURDSUNLT1VUCQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSU5WQURDSUNLT1VUCQkxCisjZGVmaW5lIFNUQjA4OTlfQURDVEVTVF9WT0xUQUdFCQkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9BRENURVNUX1ZPTFRBR0UJCTQKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BRENURVNUX1ZPTFRBR0UJCTEKKyNkZWZpbmUgU1RCMDg5OV9BRENfUkVTRVQJCQkoMHgwMSA8PCAzKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FEQ19SRVNFVAkJCTMKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BRENfUkVTRVQJCQkxCisjZGVmaW5lIFNUQjA4OTlfVFNUVE5SMV8yCQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UU1RUTlIxXzIJCQkyCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVFNUVE5SMV8yCQkJMQorI2RlZmluZSBTVEIwODk5X0FEQ1BPTgkJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0FEQ1BPTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9BRENQT04JCQkxCisjZGVmaW5lIFNUQjA4OTlfQURDSU5fTU9ERQkJCSgweDAxIDw8IDApCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfQURDSU5fTU9ERQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0FEQ0lOX01PREUJCTEKKworI2RlZmluZSBTVEIwODk5X1RTVFROUjIJCQkJMHhmMWUxCisjZGVmaW5lIFNUQjA4OTlfVFNUVE5SMl83CQkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9UU1RUTlIyXzcJCQk3CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfVFNUVE5SMl83CQkJMQorI2RlZmluZSBTVEIwODk5X05PVF9ESVNSWF9XSVJFRAkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfTk9UX0RJU1JYX1dJUkVECQk2CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfTk9UX0RJU1JYX1dJUkVECQkxCisjZGVmaW5lIFNUQjA4OTlfRElTRVFDX0RDVVJSRU5UCQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ESVNFUUNfRENVUlJFTlQJCTUKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9ESVNFUUNfRENVUlJFTlQJCTEKKyNkZWZpbmUgU1RCMDg5OV9ESVNFUUNfWkNVUlJFTlQJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBTVEIwODk5X09GRlNUX0RJU0VRQ19aQ1VSUkVOVAkJNAorI2RlZmluZSBTVEIwODk5X1dJRFRIX0RJU0VRQ19aQ1VSUkVOVAkJMQorI2RlZmluZSBTVEIwODk5X0RJU0VRQ19TSU5DX1NPVVJDRQkJKDB4MDMgPDwgMikKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9ESVNFUUNfU0lOQ19TT1VSQ0UJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX0RJU0VRQ19TSU5DX1NPVVJDRQkyCisjZGVmaW5lIFNUQjA4OTlfU0VMSVFTUkMJCQkoMHgwMyA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NFTElRU1JDCQkJMAorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NFTElRU1JDCQkJMgorCisjZGVmaW5lIFNUQjA4OTlfVFNUVE5SMwkJCQkweGYxZTIKKworI2RlZmluZSBTVEIwODk5X0kyQ0NGRwkJCQkweGYxMjkKKyNkZWZpbmUgU1RCMDg5OV9JMkNDRkdSU1ZECQkJKDB4MGYgPDwgNCkKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JMkNDRkdSU1ZECQk0CisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfSTJDQ0ZHUlNWRAkJNAorI2RlZmluZSBTVEIwODk5X0kyQ0ZBU1RNT0RFCQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgU1RCMDg5OV9PRkZTVF9JMkNGQVNUTU9ERQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX0kyQ0ZBU1RNT0RFCQkxCisjZGVmaW5lIFNUQjA4OTlfU1RBVFVTV1IJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEIwODk5X09GRlNUX1NUQVRVU1dSCQkJMgorI2RlZmluZSBTVEIwODk5X1dJRFRIX1NUQVRVU1dSCQkJMQorI2RlZmluZSBTVEIwODk5X0kyQ0FERFJJTkMJCQkoMHgwMyA8PCAwKQorI2RlZmluZSBTVEIwODk5X09GRlNUX0kyQ0FERFJJTkMJCTAKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9JMkNBRERSSU5DCQkyCisKKyNkZWZpbmUgU1RCMDg5OV9JMkNSUFQJCQkJMHhmMTJhCisjZGVmaW5lIFNUQjA4OTlfSTJDVE9OCQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfSTJDVE9OCQkJNworI2RlZmluZSBTVEIwODk5X1dJRFRIX0kyQ1RPTgkJCTEKKyNkZWZpbmUgU1RCMDg5OV9FTkFSUFRMRVZFTAkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfRU5BUlBUTEVWRUwJCTYKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9FTkFSUFRMRVZFTAkJMgorI2RlZmluZSBTVEIwODk5X1NDTFRERUxBWQkJCSgweDAxIDw8IDMpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU0NMVERFTEFZCQkJMworI2RlZmluZSBTVEIwODk5X1dJRFRIX1NDTFRERUxBWQkJCTEKKyNkZWZpbmUgU1RCMDg5OV9TVE9QRU5BCQkJCSgweDAxIDw8IDIpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1RPUEVOQQkJCTIKKyNkZWZpbmUgU1RCMDg5OV9XSURUSF9TVE9QRU5BCQkJMQorI2RlZmluZSBTVEIwODk5X1NUT1BTREFUMlNEQQkJCSgweDAxIDw8IDEpCisjZGVmaW5lIFNUQjA4OTlfT0ZGU1RfU1RPUFNEQVQyU0RBCQkxCisjZGVmaW5lIFNUQjA4OTlfV0lEVEhfU1RPUFNEQVQyU0RBCQkxCisKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTgJCQkweGYxMzYKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTcJCQkweGYxMzcKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTYJCQkweGYxMzgKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTUJCQkweGYxMzkKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTQJCQkweGYxM2EKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTMJCQkweGYxM2IKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTIJCQkweGYxM2MKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTEJCQkweGYxM2QKKyNkZWZpbmUgU1RCMDg5OV9JT1BWQUxVRTAJCQkweGYxM2UKKworI2RlZmluZSBTVEIwODk5X0dQSU8wMENGRwkJCTB4ZjE0MAorCisjZGVmaW5lIFNUQjA4OTlfR1BJTzAxQ0ZHCQkJMHhmMTQxCisjZGVmaW5lIFNUQjA4OTlfR1BJTzAyQ0ZHCQkJMHhmMTQyCisjZGVmaW5lIFNUQjA4OTlfR1BJTzAzQ0ZHCQkJMHhmMTQzCisjZGVmaW5lIFNUQjA4OTlfR1BJTzA0Q0ZHCQkJMHhmMTQ0CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA1Q0ZHCQkJMHhmMTQ1CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA2Q0ZHCQkJMHhmMTQ2CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA3Q0ZHCQkJMHhmMTQ3CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA4Q0ZHCQkJMHhmMTQ4CisjZGVmaW5lIFNUQjA4OTlfR1BJTzA5Q0ZHCQkJMHhmMTQ5CisjZGVmaW5lIFNUQjA4OTlfR1BJTzEwQ0ZHCQkJMHhmMTRhCisjZGVmaW5lIFNUQjA4OTlfR1BJTzExQ0ZHCQkJMHhmMTRiCisjZGVmaW5lIFNUQjA4OTlfR1BJTzEyQ0ZHCQkJMHhmMTRjCisjZGVmaW5lIFNUQjA4OTlfR1BJTzEzQ0ZHCQkJMHhmMTRkCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE0Q0ZHCQkJMHhmMTRlCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE1Q0ZHCQkJMHhmMTRmCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE2Q0ZHCQkJMHhmMTUwCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE3Q0ZHCQkJMHhmMTUxCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE4Q0ZHCQkJMHhmMTUyCisjZGVmaW5lIFNUQjA4OTlfR1BJTzE5Q0ZHCQkJMHhmMTUzCisjZGVmaW5lIFNUQjA4OTlfR1BJTzIwQ0ZHCQkJMHhmMTU0CisKKyNkZWZpbmUgU1RCMDg5OV9TREFUQ0ZHCQkJCTB4ZjE1NQorI2RlZmluZSBTVEIwODk5X1NDTFRDRkcJCQkJMHhmMTU2CisjZGVmaW5lIFNUQjA4OTlfQUdDUkZDRkcJCQkweGYxNTcKKyNkZWZpbmUgU1RCMDg5OV9HUElPMjIJCQkJMHhmMTU4CS8qIEFHQ0JCMkNGRwkqLworI2RlZmluZSBTVEIwODk5X0dQSU8yMQkJCQkweGYxNTkgIC8qIEFHQ0JCMUNGRwkqLworI2RlZmluZSBTVEIwODk5X0RJUkNMS0NGRwkJCTB4ZjE1YQorI2RlZmluZSBTVEIwODk5X0NMS09VVDI3Q0ZHCQkJMHhmMTViCisjZGVmaW5lIFNUQjA4OTlfU1REQllDRkcJCQkweGYxNWMKKyNkZWZpbmUgU1RCMDg5OV9DUzBDRkcJCQkJMHhmMTVkCisjZGVmaW5lIFNUQjA4OTlfQ1MxQ0ZHCQkJCTB4ZjE1ZQorI2RlZmluZSBTVEIwODk5X0RJU0VRQ09DRkcJCQkweGYxNWYKKworI2RlZmluZSBTVEIwODk5X0dQSU8zMkNGRwkJCTB4ZjE2MAorI2RlZmluZSBTVEIwODk5X0dQSU8zM0NGRwkJCTB4ZjE2MQorI2RlZmluZSBTVEIwODk5X0dQSU8zNENGRwkJCTB4ZjE2MgorI2RlZmluZSBTVEIwODk5X0dQSU8zNUNGRwkJCTB4ZjE2MworI2RlZmluZSBTVEIwODk5X0dQSU8zNkNGRwkJCTB4ZjE2NAorI2RlZmluZSBTVEIwODk5X0dQSU8zN0NGRwkJCTB4ZjE2NQorI2RlZmluZSBTVEIwODk5X0dQSU8zOENGRwkJCTB4ZjE2NgorI2RlZmluZSBTVEIwODk5X0dQSU8zOUNGRwkJCTB4ZjE2NworCisjZGVmaW5lIFNUQjA4OTlfSVJRU1RBVFVTXzMJCQkweGYxMjAKKyNkZWZpbmUgU1RCMDg5OV9JUlFTVEFUVVNfMgkJCTB4ZjEyMQorI2RlZmluZSBTVEIwODk5X0lSUVNUQVRVU18xCQkJMHhmMTIyCisjZGVmaW5lIFNUQjA4OTlfSVJRU1RBVFVTXzAJCQkweGYxMjMKKworI2RlZmluZSBTVEIwODk5X0lSUU1TS18zCQkJMHhmMTI0CisjZGVmaW5lIFNUQjA4OTlfSVJRTVNLXzIJCQkweGYxMjUKKyNkZWZpbmUgU1RCMDg5OV9JUlFNU0tfMQkJCTB4ZjEyNgorI2RlZmluZSBTVEIwODk5X0lSUU1TS18wCQkJMHhmMTI3CisKKyNkZWZpbmUgU1RCMDg5OV9JUlFDRkcJCQkJMHhmMTI4CisKKyNkZWZpbmUgU1RCMDg5OV9HSE9TVFJFRwkJCTB4ZjAwMAorCisjZGVmaW5lIFNUQjA4OTlfUzJERU1PRAkJCQkweGYzZmMKKyNkZWZpbmUgU1RCMDg5OV9TMkZFQwkJCQkweGZhZmMKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MTAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzkyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMC5jCkBAIC0wLDAgKzEsNTQ1IEBACisvKgorCVNUQjYxMDAgU2lsaWNvbiBUdW5lcgorCUNvcHlyaWdodCAoQykgTWFudSBBYnJhaGFtIChhYnJhaGFtLm1hbnVAZ21haWwuY29tKQorCisJQ29weXJpZ2h0IChDKSBTVCBNaWNyb2VsZWN0cm9uaWNzCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJzdGI2MTAwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVyYm9zZTsKK21vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOworCisKKyNkZWZpbmUgRkVfRVJST1IJCTAKKyNkZWZpbmUgRkVfTk9USUNFCQkxCisjZGVmaW5lIEZFX0lORk8JCQkyCisjZGVmaW5lIEZFX0RFQlVHCQkzCisKKyNkZWZpbmUgZHByaW50ayh4LCB5LCB6LCBmb3JtYXQsIGFyZy4uLikgZG8gewkJCQkJCVwKKwlpZiAoeikgewkJCQkJCQkJCVwKKwkJaWYJKCh4ID4gRkVfRVJST1IpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX2Z1bmNfXyAsICMjYXJnKTsJCVwKKwkJZWxzZSBpZgkoKHggPiBGRV9OT1RJQ0UpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX2Z1bmNfXyAsICMjYXJnKTsJXAorCQllbHNlIGlmICgoeCA+IEZFX0lORk8pICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjI2FyZyk7CQlcCisJCWVsc2UgaWYgKCh4ID4gRkVfREVCVUcpICYmICh4ID4geSkpCQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fICwgIyNhcmcpOwlcCisJfSBlbHNlIHsJCQkJCQkJCQlcCisJCWlmICh4ID4geSkJCQkJCQkJCVwKKwkJCXByaW50ayhmb3JtYXQsICMjYXJnKTsJCQkJCQlcCisJfQkJCQkJCQkJCQlcCit9IHdoaWxlKDApCisKK3N0cnVjdCBzdGI2MTAwX2xrdXAgeworCXUzMiB2YWxfbG93OworCXUzMiB2YWxfaGlnaDsKKwl1OCAgIHJlZzsKK307CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGI2MTAwX2xrdXAgbGt1cFtdID0geworCXsgICAgICAgMCwgIDk1MDAwMCwgMHgwYSB9LAorCXsgIDk1MDAwMCwgMTAwMDAwMCwgMHgwYSB9LAorCXsgMTAwMDAwMCwgMTA3NTAwMCwgMHgwYyB9LAorCXsgMTA3NTAwMCwgMTIwMDAwMCwgMHgwMCB9LAorCXsgMTIwMDAwMCwgMTMwMDAwMCwgMHgwMSB9LAorCXsgMTMwMDAwMCwgMTM3MDAwMCwgMHgwMiB9LAorCXsgMTM3MDAwMCwgMTQ3MDAwMCwgMHgwNCB9LAorCXsgMTQ3MDAwMCwgMTUzMDAwMCwgMHgwNSB9LAorCXsgMTUzMDAwMCwgMTY1MDAwMCwgMHgwNiB9LAorCXsgMTY1MDAwMCwgMTgwMDAwMCwgMHgwOCB9LAorCXsgMTgwMDAwMCwgMTk1MDAwMCwgMHgwYSB9LAorCXsgMTk1MDAwMCwgMjE1MDAwMCwgMHgwYyB9LAorCXsgMjE1MDAwMCwgOTk5OTk5OSwgMHgwYyB9LAorCXsgICAgICAgMCwgICAgICAgMCwgMHgwMCB9Cit9OworCisvKiBSZWdpc3RlciBuYW1lcyBmb3IgZWFzeSBkZWJ1Z2dpbmcuCSovCitzdGF0aWMgY29uc3QgY2hhciAqc3RiNjEwMF9yZWduYW1lc1tdID0geworCVtTVEI2MTAwX0xEXQkJPSAiTEQiLAorCVtTVEI2MTAwX1ZDT10JCT0gIlZDTyIsCisJW1NUQjYxMDBfTkldCQk9ICJOSSIsCisJW1NUQjYxMDBfTkZfTFNCXQk9ICJORiIsCisJW1NUQjYxMDBfS10JCT0gIksiLAorCVtTVEI2MTAwX0ddCQk9ICJHIiwKKwlbU1RCNjEwMF9GXQkJPSAiRiIsCisJW1NUQjYxMDBfRExCXQkJPSAiRExCIiwKKwlbU1RCNjEwMF9URVNUMV0JCT0gIlRFU1QxIiwKKwlbU1RCNjEwMF9GQ0NLXQkJPSAiRkNDSyIsCisJW1NUQjYxMDBfTFBFTl0JCT0gIkxQRU4iLAorCVtTVEI2MTAwX1RFU1QzXQkJPSAiVEVTVDMiLAorfTsKKworLyogVGVtcGxhdGUgZm9yIG5vcm1hbGlzYXRpb24sIGkuZS4gc2V0dGluZyB1bnVzZWQgb3IgdW5kb2N1bWVudGVkCisgKiBiaXRzIGFzIHJlcXVpcmVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqLworc3RydWN0IHN0YjYxMDBfcmVnbWFzayB7CisJdTggbWFzazsKKwl1OCBzZXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjYxMDBfcmVnbWFzayBzdGI2MTAwX3RlbXBsYXRlW10gPSB7CisJW1NUQjYxMDBfTERdCQk9IHsgMHhmZiwgMHgwMCB9LAorCVtTVEI2MTAwX1ZDT10JCT0geyAweGZmLCAweDAwIH0sCisJW1NUQjYxMDBfTkldCQk9IHsgMHhmZiwgMHgwMCB9LAorCVtTVEI2MTAwX05GX0xTQl0JPSB7IDB4ZmYsIDB4MDAgfSwKKwlbU1RCNjEwMF9LXQkJPSB7IDB4YzcsIDB4MzggfSwKKwlbU1RCNjEwMF9HXQkJPSB7IDB4ZWYsIDB4MTAgfSwKKwlbU1RCNjEwMF9GXQkJPSB7IDB4MWYsIDB4YzAgfSwKKwlbU1RCNjEwMF9ETEJdCQk9IHsgMHgzOCwgMHhjNCB9LAorCVtTVEI2MTAwX1RFU1QxXQkJPSB7IDB4MDAsIDB4OGYgfSwKKwlbU1RCNjEwMF9GQ0NLXQkJPSB7IDB4NDAsIDB4MGQgfSwKKwlbU1RCNjEwMF9MUEVOXQkJPSB7IDB4ZjAsIDB4MGIgfSwKKwlbU1RCNjEwMF9URVNUM10JCT0geyAweDAwLCAweGRlIH0sCit9OworCitzdGF0aWMgdm9pZCBzdGI2MTAwX25vcm1hbGlzZV9yZWdzKHU4IHJlZ3NbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTVEI2MTAwX05VTVJFR1M7IGkrKykKKwkJcmVnc1tpXSA9IChyZWdzW2ldICYgc3RiNjEwMF90ZW1wbGF0ZVtpXS5tYXNrKSB8IHN0YjYxMDBfdGVtcGxhdGVbaV0uc2V0OworfQorCitzdGF0aWMgaW50IHN0YjYxMDBfcmVhZF9yZWdzKHN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSwgdTggcmVnc1tdKQoreworCWludCByYzsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyCT0gc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzcywKKwkJLmZsYWdzCT0gSTJDX01fUkQsCisJCS5idWYJPSByZWdzLAorCQkubGVuCT0gU1RCNjEwMF9OVU1SRUdTCisJfTsKKworCXJjID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpOworCWlmICh1bmxpa2VseShyYyAhPSAxKSkgeworCQlkcHJpbnRrKHZlcmJvc2UsIEZFX0VSUk9SLCAxLCAiUmVhZCAoMHgleCkgZXJyLCByYz1bJWRdIiwKKwkJCXN0YXRlLT5jb25maWctPnR1bmVyX2FkZHJlc3MsIHJjKTsKKworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJaWYgKHVubGlrZWx5KHZlcmJvc2UgPiBGRV9ERUJVRykpIHsKKwkJaW50IGk7CisKKwkJZHByaW50ayh2ZXJib3NlLCBGRV9ERUJVRywgMSwgIiAgICBSZWFkIGZyb20gMHglMDJ4Iiwgc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzcyk7CisJCWZvciAoaSA9IDA7IGkgPCBTVEI2MTAwX05VTVJFR1M7IGkrKykKKwkJCWRwcmludGsodmVyYm9zZSwgRkVfREVCVUcsIDEsICIgICAgICAgICVzOiAweCUwMngiLCBzdGI2MTAwX3JlZ25hbWVzW2ldLCByZWdzW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9yZWFkX3JlZyhzdHJ1Y3Qgc3RiNjEwMF9zdGF0ZSAqc3RhdGUsIHU4IHJlZykKK3sKKwl1OCByZWdzW1NUQjYxMDBfTlVNUkVHU107CisJaW50IHJjOworCisJaWYgKHVubGlrZWx5KHJlZyA+PSBTVEI2MTAwX05VTVJFR1MpKSB7CisJCWRwcmludGsodmVyYm9zZSwgRkVfRVJST1IsIDEsICJJbnZhbGlkIHJlZ2lzdGVyIG9mZnNldCAweCV4IiwgcmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgocmMgPSBzdGI2MTAwX3JlYWRfcmVncyhzdGF0ZSwgcmVncykpIDwgMCkKKwkJcmV0dXJuIHJjOworCXJldHVybiAodW5zaWduZWQgaW50KXJlZ3NbcmVnXTsKK30KKworc3RhdGljIGludCBzdGI2MTAwX3dyaXRlX3JlZ19yYW5nZShzdHJ1Y3Qgc3RiNjEwMF9zdGF0ZSAqc3RhdGUsIHU4IGJ1ZltdLCBpbnQgc3RhcnQsIGludCBsZW4pCit7CisJaW50IHJjOworCXU4IGNtZGJ1ZltsZW4gKyAxXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyCT0gc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzcywKKwkJLmZsYWdzCT0gMCwKKwkJLmJ1Zgk9IGNtZGJ1ZiwKKwkJLmxlbgk9IGxlbiArIDEKKwl9OworCisJaWYgKHVubGlrZWx5KHN0YXJ0IDwgMSB8fCBzdGFydCArIGxlbiA+IFNUQjYxMDBfTlVNUkVHUykpIHsKKwkJZHByaW50ayh2ZXJib3NlLCBGRV9FUlJPUiwgMSwgIkludmFsaWQgcmVnaXN0ZXIgcmFuZ2UgJWQ6JWQiLAorCQkJc3RhcnQsIGxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1jcHkoJmNtZGJ1ZlsxXSwgYnVmLCBsZW4pOworCWNtZGJ1ZlswXSA9IHN0YXJ0OworCisJaWYgKHVubGlrZWx5KHZlcmJvc2UgPiBGRV9ERUJVRykpIHsKKwkJaW50IGk7CisKKwkJZHByaW50ayh2ZXJib3NlLCBGRV9ERUJVRywgMSwgIiAgICBXcml0ZSBAIDB4JTAyeDogWyVkOiVkXSIsIHN0YXRlLT5jb25maWctPnR1bmVyX2FkZHJlc3MsIHN0YXJ0LCBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlkcHJpbnRrKHZlcmJvc2UsIEZFX0RFQlVHLCAxLCAiICAgICAgICAlczogMHglMDJ4Iiwgc3RiNjEwMF9yZWduYW1lc1tzdGFydCArIGldLCBidWZbaV0pOworCX0KKwlyYyA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKKwlpZiAodW5saWtlbHkocmMgIT0gMSkpIHsKKwkJZHByaW50ayh2ZXJib3NlLCBGRV9FUlJPUiwgMSwgIigweCV4KSB3cml0ZSBlcnIgWyVkOiVkXSwgcmM9WyVkXSIsCisJCQkodW5zaWduZWQgaW50KXN0YXRlLT5jb25maWctPnR1bmVyX2FkZHJlc3MsIHN0YXJ0LCBsZW4sCXJjKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjYxMDBfd3JpdGVfcmVnKHN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCBkYXRhKQoreworCWlmICh1bmxpa2VseShyZWcgPj0gU1RCNjEwMF9OVU1SRUdTKSkgeworCQlkcHJpbnRrKHZlcmJvc2UsIEZFX0VSUk9SLCAxLCAiSW52YWxpZCByZWdpc3RlciBvZmZzZXQgMHgleCIsIHJlZyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlkYXRhID0gKGRhdGEgJiBzdGI2MTAwX3RlbXBsYXRlW3JlZ10ubWFzaykgfCBzdGI2MTAwX3RlbXBsYXRlW3JlZ10uc2V0OworCXJldHVybiBzdGI2MTAwX3dyaXRlX3JlZ19yYW5nZShzdGF0ZSwgJmRhdGEsIHJlZywgMSk7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF93cml0ZV9yZWdzKHN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSwgdTggcmVnc1tdKQoreworCXN0YjYxMDBfbm9ybWFsaXNlX3JlZ3MocmVncyk7CisJcmV0dXJuIHN0YjYxMDBfd3JpdGVfcmVnX3JhbmdlKHN0YXRlLCAmcmVnc1sxXSwgMSwgU1RCNjEwMF9OVU1SRUdTIC0gMSk7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnN0YXR1cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHN0YjYxMDBfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisKKwlpZiAoKHJjID0gc3RiNjEwMF9yZWFkX3JlZyhzdGF0ZSwgU1RCNjEwMF9MRCkpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIChyYyAmIFNUQjYxMDBfTERfTE9DSykgPyBUVU5FUl9TVEFUVVNfTE9DS0VEIDogMDsKK30KKworc3RhdGljIGludCBzdGI2MTAwX2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCWludCByYzsKKwl1OCBmOworCXN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCisJaWYgKChyYyA9IHN0YjYxMDBfcmVhZF9yZWcoc3RhdGUsIFNUQjYxMDBfRikpIDwgMCkKKwkJcmV0dXJuIHJjOworCWYgPSByYyAmIFNUQjYxMDBfRl9GOworCisJc3RhdGUtPnN0YXR1cy5iYW5kd2lkdGggPSAoZiArIDUpICogMjAwMDsJLyogeDIgZm9yIFpJRgkqLworCisJKmJhbmR3aWR0aCA9IHN0YXRlLT5iYW5kd2lkdGggPSBzdGF0ZS0+c3RhdHVzLmJhbmR3aWR0aCAqIDEwMDA7CisJZHByaW50ayh2ZXJib3NlLCBGRV9ERUJVRywgMSwgImJhbmR3aWR0aCA9ICV1IEh6Iiwgc3RhdGUtPmJhbmR3aWR0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9zZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgYmFuZHdpZHRoKQoreworCXUzMiB0bXA7CisJaW50IHJjOworCXN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCisJZHByaW50ayh2ZXJib3NlLCBGRV9ERUJVRywgMSwgInNldCBiYW5kd2lkdGggdG8gJXUgSHoiLCBiYW5kd2lkdGgpOworCisJYmFuZHdpZHRoIC89IDI7IC8qIFpJRiAqLworCisJaWYgKGJhbmR3aWR0aCA+PSAzNjAwMDAwMCkJLyogRls0OjBdIEJXLzIgbWF4ID0zMSs1PTM2IG1oeiBmb3IgRj0zMQkqLworCQl0bXAgPSAzMTsKKwllbHNlIGlmIChiYW5kd2lkdGggPD0gNTAwMDAwMCkJLyogYncvMiBtaW4gPSA1TWh6IGZvciBGPTAJCQkqLworCQl0bXAgPSAwOworCWVsc2UJCQkJLyogaWYgNSA8IGJ3LzIgPCAzNgkJCQkqLworCQl0bXAgPSAoYmFuZHdpZHRoICsgNTAwMDAwKSAvIDEwMDAwMDAgLSA1OworCisJLyogVHVybiBvbiBMUEYgYmFuZHdpZHRoIHNldHRpbmcgY2xvY2sgY29udHJvbCwKKwkgKiBzZXQgYmFuZHdpZHRoLCB3YWl0IDEwbXMsIHR1cm4gb2ZmLgorCSAqLworCWlmICgocmMgPSBzdGI2MTAwX3dyaXRlX3JlZyhzdGF0ZSwgU1RCNjEwMF9GQ0NLLCAweDBkIHwgU1RCNjEwMF9GQ0NLX0ZDQ0spKSA8IDApCisJCXJldHVybiByYzsKKwlpZiAoKHJjID0gc3RiNjEwMF93cml0ZV9yZWcoc3RhdGUsIFNUQjYxMDBfRiwgMHhjMCB8IHRtcCkpIDwgMCkKKwkJcmV0dXJuIHJjOworCW1zbGVlcCgxKTsKKwlpZiAoKHJjID0gc3RiNjEwMF93cml0ZV9yZWcoc3RhdGUsIFNUQjYxMDBfRkNDSywgMHgwZCkpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlpbnQgcmM7CisJdTMyIG5pbnQsIG5mcmFjLCBmdmNvOworCWludCBwc2QyLCBvZGl2OworCXN0cnVjdCBzdGI2MTAwX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCXU4IHJlZ3NbU1RCNjEwMF9OVU1SRUdTXTsKKworCWlmICgocmMgPSBzdGI2MTAwX3JlYWRfcmVncyhzdGF0ZSwgcmVncykpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJb2RpdiA9IChyZWdzW1NUQjYxMDBfVkNPXSAmIFNUQjYxMDBfVkNPX09ESVYpID4+IFNUQjYxMDBfVkNPX09ESVZfU0hJRlQ7CisJcHNkMiA9IChyZWdzW1NUQjYxMDBfS10gJiBTVEI2MTAwX0tfUFNEMikgPj4gU1RCNjEwMF9LX1BTRDJfU0hJRlQ7CisJbmludCA9IHJlZ3NbU1RCNjEwMF9OSV07CisJbmZyYWMgPSAoKHJlZ3NbU1RCNjEwMF9LXSAmIFNUQjYxMDBfS19ORl9NU0IpIDw8IDgpIHwgcmVnc1tTVEI2MTAwX05GX0xTQl07CisJZnZjbyA9IChuZnJhYyAqIHN0YXRlLT5yZWZlcmVuY2UgPj4gKDkgLSBwc2QyKSkgKyAobmludCAqIHN0YXRlLT5yZWZlcmVuY2UgPDwgcHNkMik7CisJKmZyZXF1ZW5jeSA9IHN0YXRlLT5mcmVxdWVuY3kgPSBmdmNvID4+IChvZGl2ICsgMSk7CisKKwlkcHJpbnRrKHZlcmJvc2UsIEZFX0RFQlVHLCAxLAorCQkiZnJlcXVlbmN5ID0gJXUga0h6LCBvZGl2ID0gJXUsIHBzZDIgPSAldSwgZnh0YWwgPSAldSBrSHosIGZ2Y28gPSAldSBrSHosIE4oSSkgPSAldSwgTihGKSA9ICV1IiwKKwkJc3RhdGUtPmZyZXF1ZW5jeSwgb2RpdiwgcHNkMiwgc3RhdGUtPnJlZmVyZW5jZSwJZnZjbywgbmludCwgbmZyYWMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3RiNjEwMF9zZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgZnJlcXVlbmN5KQoreworCWludCByYzsKKwljb25zdCBzdHJ1Y3Qgc3RiNjEwMF9sa3VwICpwdHI7CisJc3RydWN0IHN0YjYxMDBfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHA7CisKKwl1MzIgc3JhdGUgPSAwLCBmdmNvLCBuaW50LCBuZnJhYzsKKwl1OCByZWdzW1NUQjYxMDBfTlVNUkVHU107CisJdTggZywgcHNkMiwgb2RpdjsKKworCWlmICgocmMgPSBzdGI2MTAwX3JlYWRfcmVncyhzdGF0ZSwgcmVncykpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGZlLT5vcHMuZ2V0X2Zyb250ZW5kKSB7CisJCWRwcmludGsodmVyYm9zZSwgRkVfREVCVUcsIDEsICJHZXQgZnJvbnRlbmQgcGFyYW1ldGVycyIpOworCQlmZS0+b3BzLmdldF9mcm9udGVuZChmZSwgJnApOworCX0KKwlzcmF0ZSA9IHAudS5xcHNrLnN5bWJvbF9yYXRlOworCisJcmVnc1tTVEI2MTAwX0RMQl0gPSAweGRjOworCS8qIERpc2FibGUgTFBFTiAqLworCXJlZ3NbU1RCNjEwMF9MUEVOXSAmPSB+U1RCNjEwMF9MUEVOX0xQRU47IC8qIFBMTCBMb29wIGRpc2FibGVkICovCisKKwlpZiAoKHJjID0gc3RiNjEwMF93cml0ZV9yZWdzKHN0YXRlLCByZWdzKSkgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBCYXNlYmFuZCBnYWluLgkqLworCWlmIChzcmF0ZSA+PSAxNTAwMDAwMCkKKwkJZyA9IDk7ICAvLyAgKzQgZEIKKwllbHNlIGlmIChzcmF0ZSA+PSA1MDAwMDAwKQorCQlnID0gMTE7IC8vICArOCBkQgorCWVsc2UKKwkJZyA9IDE0OyAvLyArMTQgZEIKKworCXJlZ3NbU1RCNjEwMF9HXSA9IChyZWdzW1NUQjYxMDBfR10gJiB+U1RCNjEwMF9HX0cpIHwgZzsKKwlyZWdzW1NUQjYxMDBfR10gJj0gflNUQjYxMDBfR19HQ1Q7IC8qIG1hc2sgR0NUICovCisJcmVnc1tTVEI2MTAwX0ddIHw9ICgxIDw8IDUpOyAvKiAyVnAtcCBNb2RlICovCisKKwkvKiBWQ08gZGl2aWRlIHJhdGlvIChMTyBkaXZpZGUgcmF0aW8sIFZDTyBwcmVzY2FsZXIgZW5hYmxlKS4JKi8KKwlpZiAoZnJlcXVlbmN5IDw9IDEwNzUwMDApCisJCW9kaXYgPSAxOworCWVsc2UKKwkJb2RpdiA9IDA7CisJcmVnc1tTVEI2MTAwX1ZDT10gPSAocmVnc1tTVEI2MTAwX1ZDT10gJiB+U1RCNjEwMF9WQ09fT0RJVikgfCAob2RpdiA8PCBTVEI2MTAwX1ZDT19PRElWX1NISUZUKTsKKworCWlmICgoZnJlcXVlbmN5ID4gMTA3NTAwMCkgJiYgKGZyZXF1ZW5jeSA8PSAxMzI1MDAwKSkKKwkJcHNkMiA9IDA7CisJZWxzZQorCQlwc2QyID0gMTsKKwlyZWdzW1NUQjYxMDBfS10gPSAocmVnc1tTVEI2MTAwX0tdICYgflNUQjYxMDBfS19QU0QyKSB8IChwc2QyIDw8IFNUQjYxMDBfS19QU0QyX1NISUZUKTsKKworCS8qIE9TTQkqLworCWZvciAocHRyID0gbGt1cDsKKwkgICAgIChwdHItPnZhbF9oaWdoICE9IDApICYmICFDSEtSQU5HRShmcmVxdWVuY3ksIHB0ci0+dmFsX2xvdywgcHRyLT52YWxfaGlnaCk7CisJICAgICBwdHIrKyk7CisJaWYgKHB0ci0+dmFsX2hpZ2ggPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmcmVxdWVuY3kgb3V0IG9mIHJhbmdlOiAldSBrSHpcbiIsIF9fZnVuY19fLCBmcmVxdWVuY3kpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVnc1tTVEI2MTAwX1ZDT10gPSAocmVnc1tTVEI2MTAwX1ZDT10gJiB+U1RCNjEwMF9WQ09fT1NNKSB8IHB0ci0+cmVnOworCisJLyogRihWQ08pID0gRihMTykgKiAoT0RJViA9PSAwID8gMiA6IDQpCQkJKi8KKwlmdmNvID0gZnJlcXVlbmN5IDw8ICgxICsgb2Rpdik7CisJLyogTihJKSA9IGZsb29yKGYoVkNPKSAvIChmKFhUQUwpICogKFBTRDIgPyAyIDogMSkpKQkqLworCW5pbnQgPSBmdmNvIC8gKHN0YXRlLT5yZWZlcmVuY2UgPDwgcHNkMik7CisJLyogTihGKSA9IHJvdW5kKGYoVkNPKSAvIGYoWFRBTCkgKiAoUFNEMiA/IDIgOiAxKSAtIE4oSSkpICogMiBeIDkJKi8KKwluZnJhYyA9ICgoKGZ2Y28gLSAobmludCAqIHN0YXRlLT5yZWZlcmVuY2UgPDwgcHNkMikpIDw8ICg5IC0gcHNkMikpICsgc3RhdGUtPnJlZmVyZW5jZSAvIDIpIC8gc3RhdGUtPnJlZmVyZW5jZTsKKwlkcHJpbnRrKHZlcmJvc2UsIEZFX0RFQlVHLCAxLAorCQkiZnJlcXVlbmN5ID0gJXUsIHNyYXRlID0gJXUsIGcgPSAldSwgb2RpdiA9ICV1LCBwc2QyID0gJXUsIGZ4dGFsID0gJXUsIG9zbSA9ICV1LCBmdmNvID0gJXUsIE4oSSkgPSAldSwgTihGKSA9ICV1IiwKKwkJZnJlcXVlbmN5LCBzcmF0ZSwgKHVuc2lnbmVkIGludClnLCAodW5zaWduZWQgaW50KW9kaXYsCisJCSh1bnNpZ25lZCBpbnQpcHNkMiwgc3RhdGUtPnJlZmVyZW5jZSwKKwkJcHRyLT5yZWcsIGZ2Y28sIG5pbnQsIG5mcmFjKTsKKwlyZWdzW1NUQjYxMDBfTkldID0gbmludDsKKwlyZWdzW1NUQjYxMDBfTkZfTFNCXSA9IG5mcmFjOworCXJlZ3NbU1RCNjEwMF9LXSA9IChyZWdzW1NUQjYxMDBfS10gJiB+U1RCNjEwMF9LX05GX01TQikgfCAoKG5mcmFjID4+IDgpICYgU1RCNjEwMF9LX05GX01TQik7CisJcmVnc1tTVEI2MTAwX1ZDT10gfD0gU1RCNjEwMF9WQ09fT1NDSDsJCS8qIFZDTyBzZWFyY2ggZW5hYmxlZAkJKi8KKwlyZWdzW1NUQjYxMDBfVkNPXSB8PSBTVEI2MTAwX1ZDT19PQ0s7CQkvKiBWQ08gc2VhcmNoIGNsb2NrIG9mZgkJKi8KKwlyZWdzW1NUQjYxMDBfRkNDS10gfD0gU1RCNjEwMF9GQ0NLX0ZDQ0s7CS8qIExQRiBCVyBzZXR0aW5nIGNsb2NrIGVuYWJsZWQJKi8KKwlyZWdzW1NUQjYxMDBfTFBFTl0gJj0gflNUQjYxMDBfTFBFTl9MUEVOOwkvKiBQTEwgbG9vcCBkaXNhYmxlZAkJKi8KKwkvKiBQb3dlciB1cC4gKi8KKwlyZWdzW1NUQjYxMDBfTFBFTl0gfD0gU1RCNjEwMF9MUEVOX1NZTlAJfCBTVEI2MTAwX0xQRU5fT1NDUCB8IFNUQjYxMDBfTFBFTl9CRU47CisKKwltc2xlZXAoMik7CisJaWYgKChyYyA9IHN0YjYxMDBfd3JpdGVfcmVncyhzdGF0ZSwgcmVncykpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNsZWVwKDIpOworCXJlZ3NbU1RCNjEwMF9MUEVOXSB8PSBTVEI2MTAwX0xQRU5fTFBFTjsJLyogUExMIGxvb3AgZW5hYmxlZAkJKi8KKwlpZiAoKHJjID0gc3RiNjEwMF93cml0ZV9yZWcoc3RhdGUsIFNUQjYxMDBfTFBFTiwgcmVnc1tTVEI2MTAwX0xQRU5dKSkgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZWdzW1NUQjYxMDBfVkNPXSAmPSB+U1RCNjEwMF9WQ09fT0NLOwkJLyogVkNPIGZhc3Qgc2VhcmNoCQkqLworCWlmICgocmMgPSBzdGI2MTAwX3dyaXRlX3JlZyhzdGF0ZSwgU1RCNjEwMF9WQ08sIHJlZ3NbU1RCNjEwMF9WQ09dKSkgPCAwKQorCQlyZXR1cm4gcmM7CisKKwltc2xlZXAoMTApOwkJCQkJLyogd2FpdCBmb3IgTE8gdG8gbG9jawkJKi8KKwlyZWdzW1NUQjYxMDBfVkNPXSAmPSB+U1RCNjEwMF9WQ09fT1NDSDsJCS8qIHZjbyBzZWFyY2ggZGlzYWJsZWQJCSovCisJcmVnc1tTVEI2MTAwX1ZDT10gfD0gU1RCNjEwMF9WQ09fT0NLOwkJLyogc2VhcmNoIGNsb2NrIG9mZgkJKi8KKwlpZiAoKHJjID0gc3RiNjEwMF93cml0ZV9yZWcoc3RhdGUsIFNUQjYxMDBfVkNPLCByZWdzW1NUQjYxMDBfVkNPXSkpIDwgMCkKKwkJcmV0dXJuIHJjOworCXJlZ3NbU1RCNjEwMF9GQ0NLXSAmPSB+U1RCNjEwMF9GQ0NLX0ZDQ0s7ICAgICAgIC8qIExQRiBCVyBjbG9jayBkaXNhYmxlZAkqLworCXN0YjYxMDBfbm9ybWFsaXNlX3JlZ3MocmVncyk7CisJaWYgKChyYyA9IHN0YjYxMDBfd3JpdGVfcmVnX3JhbmdlKHN0YXRlLCAmcmVnc1sxXSwgMSwgU1RCNjEwMF9OVU1SRUdTIC0gMykpIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNsZWVwKDEwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGI2MTAwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCS8qIFRPRE86IHBvd2VyIGRvd24JKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGI2MTAwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHN0YjYxMDBfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJc3RydWN0IHR1bmVyX3N0YXRlICpzdGF0dXMgPSAmc3RhdGUtPnN0YXR1czsKKworCXN0YXR1cy0+dHVuZXJzdGVwCT0gMTI1MDAwOworCXN0YXR1cy0+aWZyZXEJCT0gMDsKKwlzdGF0dXMtPnJlZmNsb2NrCT0gMjcwMDAwMDA7CS8qIEh6CSovCisJc3RhdHVzLT5pcXNlbnNlCQk9IDE7CisJc3RhdHVzLT5iYW5kd2lkdGgJPSAzNjAwMDsJLyoga0h6CSovCisJc3RhdGUtPmJhbmR3aWR0aAk9IHN0YXR1cy0+YmFuZHdpZHRoICogMTAwMDsJLyogTUh6CSovCisJc3RhdGUtPnJlZmVyZW5jZQk9IHN0YXR1cy0+cmVmY2xvY2sgLyAxMDAwOwkvKiBrSHoJKi8KKworCS8qIFNldCBkZWZhdWx0IGJhbmR3aWR0aC4JKi8KKwlyZXR1cm4gc3RiNjEwMF9zZXRfYmFuZHdpZHRoKGZlLCBzdGF0dXMtPmJhbmR3aWR0aCk7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfc3RhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgIGVudW0gdHVuZXJfcGFyYW0gcGFyYW0sCisJCQkgICAgIHN0cnVjdCB0dW5lcl9zdGF0ZSAqc3RhdGUpCit7CisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgRFZCRkVfVFVORVJfRlJFUVVFTkNZOgorCQlzdGI2MTAwX2dldF9mcmVxdWVuY3koZmUsICZzdGF0ZS0+ZnJlcXVlbmN5KTsKKwkJYnJlYWs7CisJY2FzZSBEVkJGRV9UVU5FUl9UVU5FUlNURVA6CisJCWJyZWFrOworCWNhc2UgRFZCRkVfVFVORVJfSUZGUkVROgorCQlicmVhazsKKwljYXNlIERWQkZFX1RVTkVSX0JBTkRXSURUSDoKKwkJc3RiNjEwMF9nZXRfYmFuZHdpZHRoKGZlLCAmc3RhdGUtPmJhbmR3aWR0aCk7CisJCWJyZWFrOworCWNhc2UgRFZCRkVfVFVORVJfUkVGQ0xPQ0s6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjYxMDBfc2V0X3N0YXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICBlbnVtIHR1bmVyX3BhcmFtIHBhcmFtLAorCQkJICAgICBzdHJ1Y3QgdHVuZXJfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGI2MTAwX3N0YXRlICp0c3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIERWQkZFX1RVTkVSX0ZSRVFVRU5DWToKKwkJc3RiNjEwMF9zZXRfZnJlcXVlbmN5KGZlLCBzdGF0ZS0+ZnJlcXVlbmN5KTsKKwkJdHN0YXRlLT5mcmVxdWVuY3kgPSBzdGF0ZS0+ZnJlcXVlbmN5OworCQlicmVhazsKKwljYXNlIERWQkZFX1RVTkVSX1RVTkVSU1RFUDoKKwkJYnJlYWs7CisJY2FzZSBEVkJGRV9UVU5FUl9JRkZSRVE6CisJCWJyZWFrOworCWNhc2UgRFZCRkVfVFVORVJfQkFORFdJRFRIOgorCQlzdGI2MTAwX3NldF9iYW5kd2lkdGgoZmUsIHN0YXRlLT5iYW5kd2lkdGgpOworCQl0c3RhdGUtPmJhbmR3aWR0aCA9IHN0YXRlLT5iYW5kd2lkdGg7CisJCWJyZWFrOworCWNhc2UgRFZCRkVfVFVORVJfUkVGQ0xPQ0s6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgc3RiNjEwMF9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiU1RCNjEwMCBTaWxpY29uIFR1bmVyIiwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gOTUwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAJCT0gMCwKKwl9LAorCisJLmluaXQJCT0gc3RiNjEwMF9pbml0LAorCS5zbGVlcCAgICAgICAgICA9IHN0YjYxMDBfc2xlZXAsCisJLmdldF9zdGF0dXMJPSBzdGI2MTAwX2dldF9zdGF0dXMsCisJLmdldF9zdGF0ZQk9IHN0YjYxMDBfZ2V0X3N0YXRlLAorCS5zZXRfc3RhdGUJPSBzdGI2MTAwX3NldF9zdGF0ZSwKKwkucmVsZWFzZQk9IHN0YjYxMDBfcmVsZWFzZQorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqc3RiNjEwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgIHN0cnVjdCBzdGI2MTAwX2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3Qgc3RiNjEwMF9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IHN0YjYxMDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5jb25maWcJCT0gY29uZmlnOworCXN0YXRlLT5pMmMJCT0gaTJjOworCXN0YXRlLT5mcm9udGVuZAkJPSBmZTsKKwlzdGF0ZS0+cmVmZXJlbmNlCT0gY29uZmlnLT5yZWZjbG9jayAvIDEwMDA7IC8qIGtIeiAqLworCWZlLT50dW5lcl9wcml2CQk9IHN0YXRlOworCWZlLT5vcHMudHVuZXJfb3BzCT0gc3RiNjEwMF9vcHM7CisKKwlwcmludGsoIiVzOiBBdHRhY2hpbmcgU1RCNjEwMCBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gZmU7CisKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzdGI2MTAwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHN0YjYxMDBfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc3RiNjEwMF9hdHRhY2gpOworTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiU2V0IFZlcmJvc2l0eSBsZXZlbCIpOworCitNT0RVTEVfQVVUSE9SKCJNYW51IEFicmFoYW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1RCNjEwMCBTaWxpY29uIHR1bmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjYxMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVkMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjYxMDAuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKwlTVEI2MTAwIFNpbGljb24gVHVuZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fU1RCXzYxMDBfUkVHX0gKKyNkZWZpbmUgX19TVEJfNjEwMF9SRUdfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNkZWZpbmUgU1RCNjEwMF9MRAkJCTB4MDAKKyNkZWZpbmUgU1RCNjEwMF9MRF9MT0NLCQkJKDEgPDwgMCkKKworI2RlZmluZSBTVEI2MTAwX1ZDTwkJCTB4MDEKKyNkZWZpbmUgU1RCNjEwMF9WQ09fT1NDSAkJKDB4MDEgPDwgNykKKyNkZWZpbmUgU1RCNjEwMF9WQ09fT1NDSF9TSElGVAkJNworI2RlZmluZSBTVEI2MTAwX1ZDT19PQ0sJCQkoMHgwMyA8PCA1KQorI2RlZmluZSBTVEI2MTAwX1ZDT19PQ0tfU0hJRlQJCTUKKyNkZWZpbmUgU1RCNjEwMF9WQ09fT0RJVgkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgU1RCNjEwMF9WQ09fT0RJVl9TSElGVAkJNAorI2RlZmluZSBTVEI2MTAwX1ZDT19PU00JCQkoMHgwZiA8PCAwKQorCisjZGVmaW5lIFNUQjYxMDBfTkkJCQkweDAyCisjZGVmaW5lIFNUQjYxMDBfTkZfTFNCCQkJMHgwMworCisjZGVmaW5lIFNUQjYxMDBfSwkJCTB4MDQKKyNkZWZpbmUgU1RCNjEwMF9LX1BTRDIJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBTVEI2MTAwX0tfUFNEMl9TSElGVCAgICAgICAgICAgIDIKKyNkZWZpbmUgU1RCNjEwMF9LX05GX01TQgkJKDB4MDMgPDwgMCkKKworI2RlZmluZSBTVEI2MTAwX0cJCQkweDA1CisjZGVmaW5lIFNUQjYxMDBfR19HCQkJKDB4MGYgPDwgMCkKKyNkZWZpbmUgU1RCNjEwMF9HX0dDVAkJCSgweDA3IDw8IDUpCisKKyNkZWZpbmUgU1RCNjEwMF9GCQkJMHgwNgorI2RlZmluZSBTVEI2MTAwX0ZfRgkJCSgweDFmIDw8IDApCisKKyNkZWZpbmUgU1RCNjEwMF9ETEIJCQkweDA3CisKKyNkZWZpbmUgU1RCNjEwMF9URVNUMQkJCTB4MDgKKworI2RlZmluZSBTVEI2MTAwX0ZDQ0sJCQkweDA5CisjZGVmaW5lIFNUQjYxMDBfRkNDS19GQ0NLCQkoMHgwMSA8PCA2KQorCisjZGVmaW5lIFNUQjYxMDBfTFBFTgkJCTB4MGEKKyNkZWZpbmUgU1RCNjEwMF9MUEVOX0xQRU4JCSgweDAxIDw8IDQpCisjZGVmaW5lIFNUQjYxMDBfTFBFTl9TWU5QCQkoMHgwMSA8PCA1KQorI2RlZmluZSBTVEI2MTAwX0xQRU5fT1NDUAkJKDB4MDEgPDwgNikKKyNkZWZpbmUgU1RCNjEwMF9MUEVOX0JFTgkJKDB4MDEgPDwgNykKKworI2RlZmluZSBTVEI2MTAwX1RFU1QzCQkJMHgwYgorCisjZGVmaW5lIFNUQjYxMDBfTlVNUkVHUyAgICAgICAgICAgICAgICAgMHgwYworCisKKyNkZWZpbmUgSU5SQU5HRSh2YWwsIHgsIHkpCQkoKCh4IDw9IHZhbCkgJiYgKHZhbCA8PSB5KSkgfHwJCVwKKwkJCQkJICgoeSA8PSB2YWwpICYmICh2YWwgPD0geCkpID8gMSA6IDApCisKKyNkZWZpbmUgQ0hLUkFOR0UodmFsLCB4LCB5KQkJKCgodmFsID49IHgpICYmICh2YWwgPCB5KSkgPyAxIDogMCkKKworc3RydWN0IHN0YjYxMDBfY29uZmlnIHsKKwl1OAl0dW5lcl9hZGRyZXNzOworCXUzMglyZWZjbG9jazsKK307CisKK3N0cnVjdCBzdGI2MTAwX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKKworCWNvbnN0IHN0cnVjdCBzdGI2MTAwX2NvbmZpZwkqY29uZmlnOworCXN0cnVjdCBkdmJfdHVuZXJfb3BzCQlvcHM7CisJc3RydWN0IGR2Yl9mcm9udGVuZAkJKmZyb250ZW5kOworCXN0cnVjdCB0dW5lcl9zdGF0ZQkJc3RhdHVzOworCisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgc3JhdGU7CisJdTMyIGJhbmR3aWR0aDsKKwl1MzIgcmVmZXJlbmNlOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TVEI2MTAwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1NUQjYxMDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdGI2MTAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgc3RydWN0IHN0YjYxMDBfY29uZmlnICpjb25maWcsCisJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdGI2MTAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCSAgc3RydWN0IHN0YjYxMDBfY29uZmlnICpjb25maWcsCisJCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYgLy9DT05GSUdfRFZCX1NUQjYxMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMF9jZmcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MTAwX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjEwMF9jZmcuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKwlTVEI2MTAwIFNpbGljb24gVHVuZXIKKwlDb3B5cmlnaHQgKEMpIE1hbnUgQWJyYWhhbSAoYWJyYWhhbS5tYW51QGdtYWlsLmNvbSkKKworCUNvcHlyaWdodCAoQykgU1QgTWljcm9lbGVjdHJvbmljcworCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCitzdGF0aWMgaW50IHN0YjYxMDBfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMJKmZyb250ZW5kX29wcyA9IE5VTEw7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9IE5VTEw7CisJc3RydWN0IHR1bmVyX3N0YXRlCXRfc3RhdGU7CisJaW50IGVyciA9IDA7CisKKwlpZiAoJmZlLT5vcHMpCisJCWZyb250ZW5kX29wcyA9ICZmZS0+b3BzOworCWlmICgmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHMpCisJCXR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlpZiAodHVuZXJfb3BzLT5nZXRfc3RhdGUpIHsKKwkJaWYgKChlcnIgPSB0dW5lcl9vcHMtPmdldF9zdGF0ZShmZSwgRFZCRkVfVFVORVJfRlJFUVVFTkNZLCAmdF9zdGF0ZSkpIDwgMCkgeworCQkJcHJpbnRrKCIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJKmZyZXF1ZW5jeSA9IHRfc3RhdGUuZnJlcXVlbmN5OworCQlwcmludGsoIiVzOiBGcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCB0X3N0YXRlLmZyZXF1ZW5jeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YjYxMDBfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcwkqdHVuZXJfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgdHVuZXJfc3RhdGUJdF9zdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCXRfc3RhdGUuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworCWlmICgmZmUtPm9wcykKKwkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCWlmICh0dW5lcl9vcHMtPnNldF9zdGF0ZSkgeworCQlpZiAoKGVyciA9IHR1bmVyX29wcy0+c2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9GUkVRVUVOQ1ksICZ0X3N0YXRlKSkgPCAwKSB7CisJCQlwcmludGsoIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlwcmludGsoIiVzOiBGcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCB0X3N0YXRlLmZyZXF1ZW5jeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjEwMF9nZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJhbmR3aWR0aCkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlzdHJ1Y3QgdHVuZXJfc3RhdGUJdF9zdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgmZmUtPm9wcykKKwkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCWlmICh0dW5lcl9vcHMtPmdldF9zdGF0ZSkgeworCQlpZiAoKGVyciA9IHR1bmVyX29wcy0+Z2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9CQU5EV0lEVEgsICZ0X3N0YXRlKSkgPCAwKSB7CisJCQlwcmludGsoIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkqYmFuZHdpZHRoID0gdF9zdGF0ZS5iYW5kd2lkdGg7CisJfQorCXByaW50aygiJXM6IEJhbmR3aWR0aD0lZFxuIiwgX19mdW5jX18sIHRfc3RhdGUuYmFuZHdpZHRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGI2MTAwX3NldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBiYW5kd2lkdGgpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMJKmZyb250ZW5kX29wcyA9IE5VTEw7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9IE5VTEw7CisJc3RydWN0IHR1bmVyX3N0YXRlCXRfc3RhdGU7CisJaW50IGVyciA9IDA7CisKKwl0X3N0YXRlLmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKwlpZiAoJmZlLT5vcHMpCisJCWZyb250ZW5kX29wcyA9ICZmZS0+b3BzOworCWlmICgmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHMpCisJCXR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlpZiAodHVuZXJfb3BzLT5zZXRfc3RhdGUpIHsKKwkJaWYgKChlcnIgPSB0dW5lcl9vcHMtPnNldF9zdGF0ZShmZSwgRFZCRkVfVFVORVJfQkFORFdJRFRILCAmdF9zdGF0ZSkpIDwgMCkgeworCQkJcHJpbnRrKCIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcHJpbnRrKCIlczogQmFuZHdpZHRoPSVkXG4iLCBfX2Z1bmNfXywgdF9zdGF0ZS5iYW5kd2lkdGgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkMTc3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjYxLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisJVERBODI2MSA4UFNLL1FQU0sgdHVuZXIgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBNYW51IEFicmFoYW0gKGFicmFoYW0ubWFudUBnbWFpbC5jb20pCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgInRkYTgyNjEuaCIKKworc3RydWN0IHRkYTgyNjFfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQJCSpmZTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJCSppMmM7CisJY29uc3Qgc3RydWN0IHRkYTgyNjFfY29uZmlnCSpjb25maWc7CisKKwkvKiBzdGF0ZSBjYWNoZSAqLworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJhbmR3aWR0aDsKK307CisKK3N0YXRpYyBpbnQgdGRhODI2MV9yZWFkKHN0cnVjdCB0ZGE4MjYxX3N0YXRlICpzdGF0ZSwgdTggKmJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgdGRhODI2MV9jb25maWcgKmNvbmZpZyA9IHN0YXRlLT5jb25maWc7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkcgk9IGNvbmZpZy0+YWRkciwgLmZsYWdzID0gSTJDX01fUkQsLmJ1ZiA9IGJ1ZiwgIC5sZW4gPSAyIH07CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkKKwkJcHJpbnRrKCIlczogcmVhZCBlcnJvciwgZXJyPSVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI2MV93cml0ZShzdHJ1Y3QgdGRhODI2MV9zdGF0ZSAqc3RhdGUsIHU4ICpidWYpCit7CisJY29uc3Qgc3RydWN0IHRkYTgyNjFfY29uZmlnICpjb25maWcgPSBzdGF0ZS0+Y29uZmlnOworCWludCBlcnIgPSAwOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBjb25maWctPmFkZHIsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSA0IH07CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkKKwkJcHJpbnRrKCIlczogd3JpdGUgZXJyb3IsIGVycj0lZFxuIiwgX19mdW5jX18sIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRkYTgyNjFfZ2V0X3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpzdGF0dXMpCit7CisJc3RydWN0IHRkYTgyNjFfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJdTggcmVzdWx0ID0gMDsKKwlpbnQgZXJyID0gMDsKKworCSpzdGF0dXMgPSAwOworCisJaWYgKChlcnIgPSB0ZGE4MjYxX3JlYWQoc3RhdGUsICZyZXN1bHQpKSA8IDApIHsKKwkJcHJpbnRrKCIlczogSS9PIEVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBlcnI7CisJfQorCWlmICgocmVzdWx0ID4+IDYpICYgMHgwMSkgeworCQlwcmludGsoIiVzOiBUdW5lciBQaGFzZSBMb2NrZWRcbiIsIF9fZnVuY19fKTsKKwkJKnN0YXR1cyA9IDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHUzMiBkaXZfdGFiW10gPSB7IDIwMDAsIDEwMDAsICA1MDAsICAyNTAsICAxMjUgfTsgLyoga0h6ICovCitzdGF0aWMgY29uc3QgdTggIHJlZl9kaXZbXSA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNyB9OworCitzdGF0aWMgaW50IHRkYTgyNjFfZ2V0X3N0YXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICBlbnVtIHR1bmVyX3BhcmFtIHBhcmFtLAorCQkJICAgICBzdHJ1Y3QgdHVuZXJfc3RhdGUgKnRzdGF0ZSkKK3sKKwlzdHJ1Y3QgdGRhODI2MV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIERWQkZFX1RVTkVSX0ZSRVFVRU5DWToKKwkJdHN0YXRlLT5mcmVxdWVuY3kgPSBzdGF0ZS0+ZnJlcXVlbmN5OworCQlicmVhazsKKwljYXNlIERWQkZFX1RVTkVSX0JBTkRXSURUSDoKKwkJdHN0YXRlLT5iYW5kd2lkdGggPSA0MDAwMDAwMDsgLyogRklYTUUhIG5lZWQgdG8gY2FsY3VsYXRlIEJhbmR3aWR0aCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIiVzOiBVbmtub3duIHBhcmFtZXRlciAocGFyYW09JWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0pOworCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRkYTgyNjFfc2V0X3N0YXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICBlbnVtIHR1bmVyX3BhcmFtIHBhcmFtLAorCQkJICAgICBzdHJ1Y3QgdHVuZXJfc3RhdGUgKnRzdGF0ZSkKK3sKKwlzdHJ1Y3QgdGRhODI2MV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwljb25zdCBzdHJ1Y3QgdGRhODI2MV9jb25maWcgKmNvbmZpZyA9IHN0YXRlLT5jb25maWc7CisJdTMyIGZyZXF1ZW5jeSwgTiwgc3RhdHVzID0gMDsKKwl1OCBidWZbNF07CisJaW50IGVyciA9IDA7CisKKwlpZiAocGFyYW0gJiBEVkJGRV9UVU5FUl9GUkVRVUVOQ1kpIHsKKwkJLyoqCisJCSAqIE4gPSBNYXggVkNPIEZyZXF1ZW5jeSAvIENoYW5uZWwgU3BhY2luZworCQkgKiBNYXggVkNPIEZyZXF1ZW5jeSA9IFZDTyBmcmVxdWVuY3kgKyAoY2hhbm5lbCBzcGFjaW5nIC0gMSkKKwkJICogKHRvIGFjY291bnQgZm9yIGhhbGYgY2hhbm5lbCBzcGFjaW5nIG9uIGVpdGhlciBzaWRlKQorCQkgKi8KKwkJZnJlcXVlbmN5ID0gdHN0YXRlLT5mcmVxdWVuY3k7CisJCWlmICgoZnJlcXVlbmN5IDwgOTUwMDAwKSB8fCAoZnJlcXVlbmN5ID4gMjE1MDAwMCkpIHsKKwkJCXByaW50aygiJXM6IEZyZXF1ZW5jeSBiZXlvbmQgbGltaXRzLCBmcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCBmcmVxdWVuY3kpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJTiA9IChmcmVxdWVuY3kgKyAoZGl2X3RhYltjb25maWctPnN0ZXBfc2l6ZV0gLSAxKSkgLyBkaXZfdGFiW2NvbmZpZy0+c3RlcF9zaXplXTsKKwkJcHJpbnRrKCIlczogU3RlcCBzaXplPSVkLCBEaXZpZGVyPSVkLCBQRz0weCUwMnggKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBjb25maWctPnN0ZXBfc2l6ZSwgZGl2X3RhYltjb25maWctPnN0ZXBfc2l6ZV0sIE4sIE4pOworCisJCWJ1ZlswXSA9IChOID4+IDgpICYgMHhmZjsKKwkJYnVmWzFdID0gTiAmIDB4ZmY7CisJCWJ1ZlsyXSA9ICgweDAxIDw8IDcpIHwgKChyZWZfZGl2W2NvbmZpZy0+c3RlcF9zaXplXSAmIDB4MDcpIDw8IDEpOworCisJCWlmIChmcmVxdWVuY3kgPCAxNDUwMDAwKQorCQkJYnVmWzNdID0gMHgwMDsKKwkJaWYgKGZyZXF1ZW5jeSA8IDIwMDAwMDApCisJCQlidWZbM10gPSAweDQwOworCQlpZiAoZnJlcXVlbmN5IDwgMjE1MDAwMCkKKwkJCWJ1ZlszXSA9IDB4ODA7CisKKwkJLyogU2V0IHBhcmFtcyAqLworCQlpZiAoKGVyciA9IHRkYTgyNjFfd3JpdGUoc3RhdGUsIGJ1ZikpIDwgMCkgeworCQkJcHJpbnRrKCIlczogSS9PIEVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCS8qIHNsZWVwIGZvciBzb21lIHRpbWUgKi8KKwkJcHJpbnRrKCIlczogV2FpdGluZyB0byBQaGFzZSBMT0NLXG4iLCBfX2Z1bmNfXyk7CisJCW1zbGVlcCgyMCk7CisJCS8qIGNoZWNrIHN0YXR1cyAqLworCQlpZiAoKGVyciA9IHRkYTgyNjFfZ2V0X3N0YXR1cyhmZSwgJnN0YXR1cykpIDwgMCkgeworCQkJcHJpbnRrKCIlczogSS9PIEVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChzdGF0dXMgPT0gMSkgeworCQkJcHJpbnRrKCIlczogVHVuZXIgUGhhc2UgbG9ja2VkOiBzdGF0dXM9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQkJc3RhdGUtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsgLyogY2FjaGUgc3VjY2Vzc2Z1bCBzdGF0ZSAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlczogTm8gUGhhc2UgbG9jazogc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiJXM6IFVua25vd24gcGFyYW1ldGVyIChwYXJhbT0lZClcbiIsIF9fZnVuY19fLCBwYXJhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTgyNjFfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgdGRhODI2MV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKworCWZlLT50dW5lcl9wcml2ID0gTlVMTDsKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0ZGE4MjYxX29wcyA9IHsKKworCS5pbmZvID0geworCQkubmFtZQkJPSAiVERBODI2MSIsCisvLwkJLnR1bmVyX25hbWUJPSBOVUxMLAorCQkuZnJlcXVlbmN5X21pbgk9ICA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4CT0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwID0gMAorCX0sCisKKwkuc2V0X3N0YXRlCT0gdGRhODI2MV9zZXRfc3RhdGUsCisJLmdldF9zdGF0ZQk9IHRkYTgyNjFfZ2V0X3N0YXRlLAorCS5nZXRfc3RhdHVzCT0gdGRhODI2MV9nZXRfc3RhdHVzLAorCS5yZWxlYXNlCT0gdGRhODI2MV9yZWxlYXNlCit9OworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICp0ZGE4MjYxX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHRkYTgyNjFfY29uZmlnICpjb25maWcsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXN0cnVjdCB0ZGE4MjYxX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisKKwlpZiAoKHN0YXRlID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCB0ZGE4MjYxX3N0YXRlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gZXhpdDsKKworCXN0YXRlLT5jb25maWcJCT0gY29uZmlnOworCXN0YXRlLT5pMmMJCT0gaTJjOworCXN0YXRlLT5mZQkJPSBmZTsKKwlmZS0+dHVuZXJfcHJpdgkJPSBzdGF0ZTsKKwlmZS0+b3BzLnR1bmVyX29wcwk9IHRkYTgyNjFfb3BzOworCisJZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfc3RlcCA9IGRpdl90YWJbY29uZmlnLT5zdGVwX3NpemVdOworLy8JZmUtPm9wcy50dW5lcl9vcHMudHVuZXJfbmFtZQkgPSAmY29uZmlnLT5idWY7CisKKy8vCXByaW50aygiJXM6IEF0dGFjaGluZyAlcyBUREE4MjYxIDhQU0svUVBTSyB0dW5lclxuIiwKKy8vCQlfX2Z1bmNfXywgZmUtPm9wcy50dW5lcl9vcHMudHVuZXJfbmFtZSk7CisJcHJpbnRrKCIlczogQXR0YWNoaW5nIFREQTgyNjEgOFBTSy9RUFNLIHR1bmVyXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gZmU7CisKK2V4aXQ6CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHRkYTgyNjFfYXR0YWNoKTsKK01PRFVMRV9QQVJNX0RFU0ModmVyYm9zZSwgIlNldCB2ZXJib3NpdHkgbGV2ZWwiKTsKKworTU9EVUxFX0FVVEhPUigiTWFudSBBYnJhaGFtIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlREQTgyNjEgOFBTSy9RUFNLIFR1bmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2MS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZlNDUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNjEuaApAQCAtMCwwICsxLDU1IEBACisvKgorCVREQTgyNjEgOFBTSy9RUFNLIHR1bmVyIGRyaXZlcgorCUNvcHlyaWdodCAoQykgTWFudSBBYnJhaGFtIChhYnJhaGFtLm1hbnVAZ21haWwuY29tKQorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIF9fVERBODI2MV9ICisjZGVmaW5lIF9fVERBODI2MV9ICisKK2VudW0gdGRhODI2MV9zdGVwIHsKKwlUREE4MjYxX1NURVBfMjAwMCA9IDAsCS8qIDIwMDAga0h6ICovCisJVERBODI2MV9TVEVQXzEwMDAsCS8qIDEwMDAga0h6ICovCisJVERBODI2MV9TVEVQXzUwMCwJLyogIDUwMCBrSHogKi8KKwlUREE4MjYxX1NURVBfMjUwLAkvKiAgMjUwIGtIeiAqLworCVREQTgyNjFfU1RFUF8xMjUJLyogIDEyNSBrSHogKi8KK307CisKK3N0cnVjdCB0ZGE4MjYxX2NvbmZpZyB7CisvLwl1OAkJCWJ1ZlsxNl07CisJdTgJCQlhZGRyOworCWVudW0gdGRhODI2MV9zdGVwCXN0ZXBfc2l6ZTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBODI2MSkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UREE4MjYxX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhODI2MV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCB0ZGE4MjYxX2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhODI2MV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCB0ZGE4MjYxX2NvbmZpZyAqY29uZmlnLAorCQkJCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmIC8vQ09ORklHX0RWQl9UREE4MjYxCisKKyNlbmRpZi8vIF9fVERBODI2MV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2MV9jZmcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjYxX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjFlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2MV9jZmcuaApAQCAtMCwwICsxLDg0IEBACisvKgorCVREQTgyNjEgOFBTSy9RUFNLIHR1bmVyIGRyaXZlcgorCUNvcHlyaWdodCAoQykgTWFudSBBYnJhaGFtIChhYnJhaGFtLm1hbnVAZ21haWwuY29tKQorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKwlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCitzdGF0aWMgaW50IHRkYTgyNjFfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMJKmZyb250ZW5kX29wcyA9IE5VTEw7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9IE5VTEw7CisJc3RydWN0IHR1bmVyX3N0YXRlCXRfc3RhdGU7CisJaW50IGVyciA9IDA7CisKKwlpZiAoJmZlLT5vcHMpCisJCWZyb250ZW5kX29wcyA9ICZmZS0+b3BzOworCWlmICgmZnJvbnRlbmRfb3BzLT50dW5lcl9vcHMpCisJCXR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlpZiAodHVuZXJfb3BzLT5nZXRfc3RhdGUpIHsKKwkJaWYgKChlcnIgPSB0dW5lcl9vcHMtPmdldF9zdGF0ZShmZSwgRFZCRkVfVFVORVJfRlJFUVVFTkNZLCAmdF9zdGF0ZSkpIDwgMCkgeworCQkJcHJpbnRrKCIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJKmZyZXF1ZW5jeSA9IHRfc3RhdGUuZnJlcXVlbmN5OworCQlwcmludGsoIiVzOiBGcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCB0X3N0YXRlLmZyZXF1ZW5jeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTgyNjFfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcwkqdHVuZXJfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgdHVuZXJfc3RhdGUJdF9zdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCXRfc3RhdGUuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworCWlmICgmZmUtPm9wcykKKwkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCWlmICh0dW5lcl9vcHMtPnNldF9zdGF0ZSkgeworCQlpZiAoKGVyciA9IHR1bmVyX29wcy0+c2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9GUkVRVUVOQ1ksICZ0X3N0YXRlKSkgPCAwKSB7CisJCQlwcmludGsoIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlwcmludGsoIiVzOiBGcmVxdWVuY3k9JWRcbiIsIF9fZnVuY19fLCB0X3N0YXRlLmZyZXF1ZW5jeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI2MV9nZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJhbmR3aWR0aCkKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcwkqZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJc3RydWN0IGR2Yl90dW5lcl9vcHMJKnR1bmVyX29wcyA9ICZmcm9udGVuZF9vcHMtPnR1bmVyX29wczsKKwlzdHJ1Y3QgdHVuZXJfc3RhdGUJdF9zdGF0ZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgmZmUtPm9wcykKKwkJZnJvbnRlbmRfb3BzID0gJmZlLT5vcHM7CisJaWYgKCZmcm9udGVuZF9vcHMtPnR1bmVyX29wcykKKwkJdHVuZXJfb3BzID0gJmZyb250ZW5kX29wcy0+dHVuZXJfb3BzOworCWlmICh0dW5lcl9vcHMtPmdldF9zdGF0ZSkgeworCQlpZiAoKGVyciA9IHR1bmVyX29wcy0+Z2V0X3N0YXRlKGZlLCBEVkJGRV9UVU5FUl9CQU5EV0lEVEgsICZ0X3N0YXRlKSkgPCAwKSB7CisJCQlwcmludGsoIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkqYmFuZHdpZHRoID0gdF9zdGF0ZS5iYW5kd2lkdGg7CisJfQorCXByaW50aygiJXM6IEJhbmR3aWR0aD0lZFxuIiwgX19mdW5jX18sIHRfc3RhdGUuYmFuZHdpZHRoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5jCmluZGV4IDM2YTVhMWMuLjU1MDZmODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuYwpAQCAtMjIwLDE1ICsyMjAsMTggQEAKIAkJLyogVGhlc2UgYXJlIGV4dHJhcG9sYXRlZCBmcm9tIHRoZSA3IGFuZCA4TUh6IHZhbHVlcyAqLwogCQl6bDEwMzUzX3NpbmdsZV93cml0ZShmZSwgTUNMS19SQVRJTywgMHg5Nyk7CiAJCXpsMTAzNTNfc2luZ2xlX3dyaXRlKGZlLCAweDY0LCAweDM0KTsKKwkJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIDB4Y2MsIDB4ZGQpOwogCQlicmVhazsKIAljYXNlIEJBTkRXSURUSF83X01IWjoKIAkJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIE1DTEtfUkFUSU8sIDB4ODYpOwogCQl6bDEwMzUzX3NpbmdsZV93cml0ZShmZSwgMHg2NCwgMHgzNSk7CisJCXpsMTAzNTNfc2luZ2xlX3dyaXRlKGZlLCAweGNjLCAweDczKTsKIAkJYnJlYWs7CiAJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CiAJZGVmYXVsdDoKIAkJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIE1DTEtfUkFUSU8sIDB4NzUpOwogCQl6bDEwMzUzX3NpbmdsZV93cml0ZShmZSwgMHg2NCwgMHgzNik7CisJCXpsMTAzNTNfc2luZ2xlX3dyaXRlKGZlLCAweGNjLCAweDczKTsKIAl9CiAKIAl6bDEwMzUzX2NhbGNfbm9taW5hbF9yYXRlKGZlLCBvcC0+YmFuZHdpZHRoLCAmbm9taW5hbF9yYXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmMKaW5kZXggZTk4ZDZjYS4uZmQ2MmUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmMKQEAgLTM4LDYgKzM4LDE2IEBACiAJCS5kcml2ZXJfaW5mbyA9IFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX09LRU1PX0EgfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDE4MDEpLAogCQkuZHJpdmVyX2luZm8gPSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9PS0VNT19CIH0sCisJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHgyMDAwKSwKKwkJLmRyaXZlcl9pbmZvID0gU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfVElHRVJfTUlOSUNBUkQgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDIwMDkpLAorCQkuZHJpdmVyX2luZm8gPSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9USUdFUl9NSU5JQ0FSRF9SMiB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4MjAwYSksCisJCS5kcml2ZXJfaW5mbyA9IFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEIH0sCisJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHgyMDEwKSwKKwkJLmRyaXZlcl9pbmZvID0gU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfVElHRVJfTUlOSUNBUkQgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDIwMTkpLAorCQkuZHJpdmVyX2luZm8gPSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9USUdFUl9NSU5JQ0FSRCB9LAogCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NTUwMCksCiAJCS5kcml2ZXJfaW5mbyA9IFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1dJTkRIQU0gfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDU1MTApLApAQCAtOTYsNiArMTA2LDIxIEBACiAJCS5uYW1lCT0gIkhhdXBwYXVnZSBXaW5UViBNaW5pU3RpY2siLAogCQkudHlwZQk9IFNNU19OT1ZBX0IwLAogCQkuZndbREVWSUNFX01PREVfRFZCVF9CREFdID0gInNtczF4eHgtaGN3LTU1eHh4LWR2YnQtMDIuZnciLAorCQkubGVkX3Bvd2VyID0gMjYsCisJCS5sZWRfbG8gICAgPSAyNywKKwkJLmxlZF9oaSAgICA9IDI4LAorCX0sCisJW1NNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEXSA9IHsKKwkJLm5hbWUJPSAiSGF1cHBhdWdlIFdpblRWIE1pbmlDYXJkIiwKKwkJLnR5cGUJPSBTTVNfTk9WQV9CMCwKKwkJLmZ3W0RFVklDRV9NT0RFX0RWQlRfQkRBXSA9ICJzbXMxeHh4LWhjdy01NXh4eC1kdmJ0LTAyLmZ3IiwKKwkJLmxuYV9jdHJsICA9IDI5LAorCX0sCisJW1NNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEX1IyXSA9IHsKKwkJLm5hbWUJPSAiSGF1cHBhdWdlIFdpblRWIE1pbmlDYXJkIiwKKwkJLnR5cGUJPSBTTVNfTk9WQV9CMCwKKwkJLmZ3W0RFVklDRV9NT0RFX0RWQlRfQkRBXSA9ICJzbXMxeHh4LWhjdy01NXh4eC1kdmJ0LTAyLmZ3IiwKKwkJLmxuYV9jdHJsICA9IDEsCiAJfSwKIH07CiAKQEAgLTEwNiwzICsxMzEsODggQEAKIAlyZXR1cm4gJnNtc19ib2FyZHNbaWRdOwogfQogCitzdGF0aWMgaW50IHNtc19zZXRfZ3BpbyhzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldiwgdTMyIHBpbiwgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbXNjb3JlX2dwaW9fY29uZmlnIGdwaW9jb25maWcgPSB7CisJCS5kaXJlY3Rpb24gICAgICAgICAgICA9IFNNU19HUElPX0RJUkVDVElPTl9PVVRQVVQsCisJCS5wdWxsdXBkb3duICAgICAgICAgICA9IFNNU19HUElPX1BVTExVUERPV05fTk9ORSwKKwkJLmlucHV0Y2hhcmFjdGVyaXN0aWNzID0gU01TX0dQSU9fSU5QVVRDSEFSQUNURVJJU1RJQ1NfTk9STUFMLAorCQkub3V0cHV0c2xld3JhdGUgICAgICAgPSBTTVNfR1BJT19PVVRQVVRTTEVXUkFURV9GQVNULAorCQkub3V0cHV0ZHJpdmluZyAgICAgICAgPSBTTVNfR1BJT19PVVRQVVREUklWSU5HXzRtQSwKKwl9OworCisJaWYgKHBpbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHNtc2NvcmVfY29uZmlndXJlX2dwaW8oY29yZWRldiwgcGluLCAmZ3Bpb2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbXNjb3JlX3NldF9ncGlvKGNvcmVkZXYsIHBpbiwgZW5hYmxlKTsKK30KKworaW50IHNtc19ib2FyZF9zZXR1cChzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldikKK3sKKwlpbnQgYm9hcmRfaWQgPSBzbXNjb3JlX2dldF9ib2FyZF9pZChjb3JlZGV2KTsKKwlzdHJ1Y3Qgc21zX2JvYXJkICpib2FyZCA9IHNtc19nZXRfYm9hcmQoYm9hcmRfaWQpOworCisJc3dpdGNoIChib2FyZF9pZCkgeworCWNhc2UgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfV0lOREhBTToKKwkJLyogdHVybiBvZmYgYWxsIExFRHMgKi8KKwkJc21zX3NldF9ncGlvKGNvcmVkZXYsIGJvYXJkLT5sZWRfcG93ZXIsIDApOworCQlzbXNfc2V0X2dwaW8oY29yZWRldiwgYm9hcmQtPmxlZF9oaSwgMCk7CisJCXNtc19zZXRfZ3Bpbyhjb3JlZGV2LCBib2FyZC0+bGVkX2xvLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9USUdFUl9NSU5JQ0FSRF9SMjoKKwljYXNlIFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEOgorCQkvKiB0dXJuIG9mZiBMTkEgKi8KKwkJc21zX3NldF9ncGlvKGNvcmVkZXYsIGJvYXJkLT5sbmFfY3RybCwgMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNtc19ib2FyZF9wb3dlcihzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldiwgaW50IG9ub2ZmKQoreworCWludCBib2FyZF9pZCA9IHNtc2NvcmVfZ2V0X2JvYXJkX2lkKGNvcmVkZXYpOworCXN0cnVjdCBzbXNfYm9hcmQgKmJvYXJkID0gc21zX2dldF9ib2FyZChib2FyZF9pZCk7CisKKwlzd2l0Y2ggKGJvYXJkX2lkKSB7CisJY2FzZSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9XSU5ESEFNOgorCQkvKiBwb3dlciBMRUQgKi8KKwkJc21zX3NldF9ncGlvKGNvcmVkZXYsCisJCQkgICAgIGJvYXJkLT5sZWRfcG93ZXIsIG9ub2ZmID8gMSA6IDApOworCQlicmVhazsKKwljYXNlIFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1RJR0VSX01JTklDQVJEX1IyOgorCWNhc2UgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfVElHRVJfTUlOSUNBUkQ6CisJCS8qIExOQSAqLworCQlzbXNfc2V0X2dwaW8oY29yZWRldiwKKwkJCSAgICAgYm9hcmQtPmxuYV9jdHJsLCBvbm9mZiA/IDEgOiAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitpbnQgc21zX2JvYXJkX2xlZF9mZWVkYmFjayhzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldiwgaW50IGxlZCkKK3sKKwlpbnQgYm9hcmRfaWQgPSBzbXNjb3JlX2dldF9ib2FyZF9pZChjb3JlZGV2KTsKKwlzdHJ1Y3Qgc21zX2JvYXJkICpib2FyZCA9IHNtc19nZXRfYm9hcmQoYm9hcmRfaWQpOworCisJLyogZG9udCB0b3VjaCBHUElPIGlmIExFRHMgYXJlIGFscmVhZHkgc2V0ICovCisJaWYgKHNtc2NvcmVfbGVkX3N0YXRlKGNvcmVkZXYsIC0xKSA9PSBsZWQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChib2FyZF9pZCkgeworCWNhc2UgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfV0lOREhBTToKKwkJc21zX3NldF9ncGlvKGNvcmVkZXYsCisJCQkgICAgIGJvYXJkLT5sZWRfbG8sIChsZWQgJiBTTVNfTEVEX0xPKSA/IDEgOiAwKTsKKwkJc21zX3NldF9ncGlvKGNvcmVkZXYsCisJCQkgICAgIGJvYXJkLT5sZWRfaGksIChsZWQgJiBTTVNfTEVEX0hJKSA/IDEgOiAwKTsKKworCQlzbXNjb3JlX2xlZF9zdGF0ZShjb3JlZGV2LCBsZWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCmluZGV4IGM4ZjNkYTYuLjhlMGZlOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5oCkBAIC0zMiwxNCArMzIsMjcgQEAKICNkZWZpbmUgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfT0tFTU9fQSA2CiAjZGVmaW5lIFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX09LRU1PX0IgNwogI2RlZmluZSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9XSU5ESEFNIDgKKyNkZWZpbmUgU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfVElHRVJfTUlOSUNBUkQgOQorI2RlZmluZSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9USUdFUl9NSU5JQ0FSRF9SMiAxMAogCiBzdHJ1Y3Qgc21zX2JvYXJkIHsKIAllbnVtIHNtc19kZXZpY2VfdHlwZV9zdCB0eXBlOwogCWNoYXIgKm5hbWUsICpmd1tERVZJQ0VfTU9ERV9NQVhdOworCisJLyogZ3Bpb3MgKi8KKwlpbnQgbGVkX3Bvd2VyLCBsZWRfaGksIGxlZF9sbywgbG5hX2N0cmw7CiB9OwogCiBzdHJ1Y3Qgc21zX2JvYXJkICpzbXNfZ2V0X2JvYXJkKGludCBpZCk7CiAKK2ludCBzbXNfYm9hcmRfc2V0dXAoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYpOworCisjZGVmaW5lIFNNU19MRURfT0ZGIDAKKyNkZWZpbmUgU01TX0xFRF9MTyAgMQorI2RlZmluZSBTTVNfTEVEX0hJICAyCitpbnQgc21zX2JvYXJkX2xlZF9mZWVkYmFjayhzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZWRldiwgaW50IGxlZCk7CitpbnQgc21zX2JvYXJkX3Bvd2VyKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LCBpbnQgb25vZmYpOworCiBleHRlcm4gc3RydWN0IHVzYl9kZXZpY2VfaWQgc21zdXNiX2lkX3RhYmxlW107CiAKICNlbmRpZiAvKiBfX1NNU19DQVJEU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYwppbmRleCA2NTc2ZmJiLi5jZjYxM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCkBAIC05MSw2ICs5MSw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gaW5pdF9kZXZpY2VfZG9uZSwgcmVsb2FkX3N0YXJ0X2RvbmUsIHJlc3VtZV9kb25lOwogCiAJaW50IGJvYXJkX2lkOworCWludCBsZWRfc3RhdGU7CiB9OwogCiB2b2lkIHNtc2NvcmVfc2V0X2JvYXJkX2lkKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlLCBpbnQgaWQpCkBAIC05OCw2ICs5OSwxMyBAQAogCWNvcmUtPmJvYXJkX2lkID0gaWQ7CiB9CiAKK2ludCBzbXNjb3JlX2xlZF9zdGF0ZShzdHJ1Y3Qgc21zY29yZV9kZXZpY2VfdCAqY29yZSwgaW50IGxlZCkKK3sKKwlpZiAobGVkID49IDApCisJCWNvcmUtPmxlZF9zdGF0ZSA9IGxlZDsKKwlyZXR1cm4gY29yZS0+bGVkX3N0YXRlOworfQorCiBpbnQgc21zY29yZV9nZXRfYm9hcmRfaWQoc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmUpCiB7CiAJcmV0dXJuIGNvcmUtPmJvYXJkX2lkOwpAQCAtMTE4Nyw2ICsxMTk1LDc2IEBACiB9CiAKIAoraW50IHNtc2NvcmVfY29uZmlndXJlX2dwaW8oc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYsIHUzMiBwaW4sCisJCQkgICBzdHJ1Y3Qgc21zY29yZV9ncGlvX2NvbmZpZyAqcGluY29uZmlnKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBTbXNNc2dIZHJfU1QgaGRyOworCQl1MzIgZGF0YVs2XTsKKwl9IG1zZzsKKworCWlmIChjb3JlZGV2LT5kZXZpY2VfZmxhZ3MgJiBTTVNfREVWSUNFX0ZBTUlMWTIpIHsKKwkJbXNnLmhkci5tc2dTcmNJZCA9IERWQlRfQkRBX0NPTlRST0xfTVNHX0lEOworCQltc2cuaGRyLm1zZ0RzdElkID0gSElGX1RBU0s7CisJCW1zZy5oZHIubXNnRmxhZ3MgPSAwOworCQltc2cuaGRyLm1zZ1R5cGUgID0gTVNHX1NNU19HUElPX0NPTkZJR19FWF9SRVE7CisJCW1zZy5oZHIubXNnTGVuZ3RoID0gc2l6ZW9mKG1zZyk7CisKKwkJbXNnLmRhdGFbMF0gPSBwaW47CisJCW1zZy5kYXRhWzFdID0gcGluY29uZmlnLT5wdWxsdXBkb3duOworCisJCS8qIENvbnZlcnQgc2xldyByYXRlIGZvciBOb3ZhOiBGYXN0KDApID0gMyAvIFNsb3coMSkgPSAwOyAqLworCQltc2cuZGF0YVsyXSA9IHBpbmNvbmZpZy0+b3V0cHV0c2xld3JhdGUgPT0gMCA/IDMgOiAwOworCisJCXN3aXRjaCAocGluY29uZmlnLT5vdXRwdXRkcml2aW5nKSB7CisJCWNhc2UgU01TX0dQSU9fT1VUUFVURFJJVklOR18xNm1BOgorCQkJbXNnLmRhdGFbM10gPSA3OyAvKiBOb3ZhIC0gMTZtQSAqLworCQkJYnJlYWs7CisJCWNhc2UgU01TX0dQSU9fT1VUUFVURFJJVklOR18xMm1BOgorCQkJbXNnLmRhdGFbM10gPSA1OyAvKiBOb3ZhIC0gMTFtQSAqLworCQkJYnJlYWs7CisJCWNhc2UgU01TX0dQSU9fT1VUUFVURFJJVklOR184bUE6CisJCQltc2cuZGF0YVszXSA9IDM7IC8qIE5vdmEgLSA3bUEgKi8KKwkJCWJyZWFrOworCQljYXNlIFNNU19HUElPX09VVFBVVERSSVZJTkdfNG1BOgorCQlkZWZhdWx0OgorCQkJbXNnLmRhdGFbM10gPSAyOyAvKiBOb3ZhIC0gNG1BICovCisJCQlicmVhazsKKwkJfQorCisJCW1zZy5kYXRhWzRdID0gcGluY29uZmlnLT5kaXJlY3Rpb247CisJCW1zZy5kYXRhWzVdID0gMDsKKwl9IGVsc2UgLyogVE9ETzogU01TX0RFVklDRV9GQU1JTFkxICovCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvcmVkZXYtPnNlbmRyZXF1ZXN0X2hhbmRsZXIoY29yZWRldi0+Y29udGV4dCwKKwkJCQkJICAgICZtc2csIHNpemVvZihtc2cpKTsKK30KKworaW50IHNtc2NvcmVfc2V0X2dwaW8oc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYsIHUzMiBwaW4sIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgU21zTXNnSGRyX1NUIGhkcjsKKwkJdTMyIGRhdGFbM107CisJfSBtc2c7CisKKwlpZiAocGluID4gTUFYX0dQSU9fUElOX05VTUJFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cuaGRyLm1zZ1NyY0lkID0gRFZCVF9CREFfQ09OVFJPTF9NU0dfSUQ7CisJbXNnLmhkci5tc2dEc3RJZCA9IEhJRl9UQVNLOworCW1zZy5oZHIubXNnRmxhZ3MgPSAwOworCW1zZy5oZHIubXNnVHlwZSAgPSBNU0dfU01TX0dQSU9fU0VUX0xFVkVMX1JFUTsKKwltc2cuaGRyLm1zZ0xlbmd0aCA9IHNpemVvZihtc2cpOworCisJbXNnLmRhdGFbMF0gPSBwaW47CisJbXNnLmRhdGFbMV0gPSBsZXZlbCA/IDEgOiAwOworCW1zZy5kYXRhWzJdID0gMDsKKworCXJldHVybiBjb3JlZGV2LT5zZW5kcmVxdWVzdF9oYW5kbGVyKGNvcmVkZXYtPmNvbnRleHQsCisJCQkJCSAgICAmbXNnLCBzaXplb2YobXNnKSk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNtc2NvcmVfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oCmluZGV4IDhkOTczZjcuLjc2MGUyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmgKQEAgLTE4Niw2ICsxODYsOCBAQAogI2RlZmluZSBNU0dfU1dfUkVMT0FEX0VYRUNfUkVRCQkJCTcwNAogI2RlZmluZSBNU0dfU1dfUkVMT0FEX0VYRUNfUkVTCQkJCTcwNQogI2RlZmluZSBNU0dfU01TX1NQSV9JTlRfTElORV9TRVRfUkVRCQk3MTAKKyNkZWZpbmUgTVNHX1NNU19HUElPX0NPTkZJR19FWF9SRVEJCQk3MTIKKyNkZWZpbmUgTVNHX1NNU19HUElPX0NPTkZJR19FWF9SRVMJCQk3MTMKICNkZWZpbmUgTVNHX1NNU19JU0RCVF9UVU5FX1JFUQkJCQk3NzYKICNkZWZpbmUgTVNHX1NNU19JU0RCVF9UVU5FX1JFUwkJCQk3NzcKIApAQCAtMzQxLDYgKzM0MywzMiBAQAogfTsKIAogCitzdHJ1Y3Qgc21zY29yZV9ncGlvX2NvbmZpZyB7CisjZGVmaW5lIFNNU19HUElPX0RJUkVDVElPTl9JTlBVVCAgMAorI2RlZmluZSBTTVNfR1BJT19ESVJFQ1RJT05fT1VUUFVUIDEKKwl1OCBkaXJlY3Rpb247CisKKyNkZWZpbmUgU01TX0dQSU9fUFVMTFVQRE9XTl9OT05FICAgICAwCisjZGVmaW5lIFNNU19HUElPX1BVTExVUERPV05fUFVMTERPV04gMQorI2RlZmluZSBTTVNfR1BJT19QVUxMVVBET1dOX1BVTExVUCAgIDIKKyNkZWZpbmUgU01TX0dQSU9fUFVMTFVQRE9XTl9LRUVQRVIgICAzCisJdTggcHVsbHVwZG93bjsKKworI2RlZmluZSBTTVNfR1BJT19JTlBVVENIQVJBQ1RFUklTVElDU19OT1JNQUwgIDAKKyNkZWZpbmUgU01TX0dQSU9fSU5QVVRDSEFSQUNURVJJU1RJQ1NfU0NITUlUVCAxCisJdTggaW5wdXRjaGFyYWN0ZXJpc3RpY3M7CisKKyNkZWZpbmUgU01TX0dQSU9fT1VUUFVUU0xFV1JBVEVfRkFTVCAwCisjZGVmaW5lIFNNU19HUElPX09VVFBVVFNMRVdSQVRFX1NMT1cgMQorCXU4IG91dHB1dHNsZXdyYXRlOworCisjZGVmaW5lIFNNU19HUElPX09VVFBVVERSSVZJTkdfNG1BICAwCisjZGVmaW5lIFNNU19HUElPX09VVFBVVERSSVZJTkdfOG1BICAxCisjZGVmaW5lIFNNU19HUElPX09VVFBVVERSSVZJTkdfMTJtQSAyCisjZGVmaW5lIFNNU19HUElPX09VVFBVVERSSVZJTkdfMTZtQSAzCisJdTggb3V0cHV0ZHJpdmluZzsKK307CisKIHN0cnVjdCBzbXNkdmJfY2xpZW50X3QgewogCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CiAKQEAgLTM1Myw3ICszODEsNyBAQAogCXN0cnVjdCBkdmJfZnJvbnRlbmQJZnJvbnRlbmQ7CiAKIAlmZV9zdGF0dXNfdAkJZmVfc3RhdHVzOwotCWludAkJCWZlX2JlciwgZmVfc25yLCBmZV9zaWduYWxfc3RyZW5ndGg7CisJaW50CQkJZmVfYmVyLCBmZV9zbnIsIGZlX3VuYywgZmVfc2lnbmFsX3N0cmVuZ3RoOwogCiAJc3RydWN0IGNvbXBsZXRpb24JdHVuZV9kb25lLCBzdGF0X2RvbmU7CiAKQEAgLTM5Niw5ICs0MjQsMTUgQEAKIGV4dGVybiB2b2lkIHNtc2NvcmVfcHV0YnVmZmVyKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LAogCQkJICAgICAgc3RydWN0IHNtc2NvcmVfYnVmZmVyX3QgKmNiKTsKIAoraW50IHNtc2NvcmVfY29uZmlndXJlX2dwaW8oc3RydWN0IHNtc2NvcmVfZGV2aWNlX3QgKmNvcmVkZXYsIHUzMiBwaW4sCisJCQkgICBzdHJ1Y3Qgc21zY29yZV9ncGlvX2NvbmZpZyAqcGluY29uZmlnKTsKK2ludCBzbXNjb3JlX3NldF9ncGlvKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LCB1MzIgcGluLCBpbnQgbGV2ZWwpOworCiB2b2lkIHNtc2NvcmVfc2V0X2JvYXJkX2lkKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlLCBpbnQgaWQpOwogaW50IHNtc2NvcmVfZ2V0X2JvYXJkX2lkKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlKTsKIAoraW50IHNtc2NvcmVfbGVkX3N0YXRlKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlLCBpbnQgbGVkKTsKKwogLyogc21zZHZiLmMgKi8KIGludCBzbXNkdmJfcmVnaXN0ZXIodm9pZCk7CiB2b2lkIHNtc2R2Yl91bnJlZ2lzdGVyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNkdmIuYwppbmRleCA4ZDQ5MGUxLi4yZGE5NTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNkdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNkdmIuYwpAQCAtNjAsNiArNjAsNyBAQAogCiAJCQljbGllbnQtPmZlX3NuciA9IHAtPlN0YXQuU05SOwogCQkJY2xpZW50LT5mZV9iZXIgPSBwLT5TdGF0LkJFUjsKKwkJCWNsaWVudC0+ZmVfdW5jID0gcC0+U3RhdC5CRVJFcnJvckNvdW50OwogCiAJCQlpZiAocC0+U3RhdC5JbkJhbmRQd3IgPCAtOTUpCiAJCQkJY2xpZW50LT5mZV9zaWduYWxfc3RyZW5ndGggPSAwOwpAQCAtNzIsNiArNzMsNyBAQAogCQkJY2xpZW50LT5mZV9zdGF0dXMgPSAwOwogCQkJY2xpZW50LT5mZV9zbnIgPQogCQkJY2xpZW50LT5mZV9iZXIgPQorCQkJY2xpZW50LT5mZV91bmMgPQogCQkJY2xpZW50LT5mZV9zaWduYWxfc3RyZW5ndGggPSAwOwogCQl9CiAKQEAgLTE2NSw4ICsxNjcsMTggQEAKIAlzdHJ1Y3QgU21zTXNnSGRyX1NUIE1zZyA9IHsgTVNHX1NNU19HRVRfU1RBVElTVElDU19SRVEsCiAJCQkgICAgIERWQlRfQkRBX0NPTlRST0xfTVNHX0lELAogCQkJICAgICBISUZfVEFTSywgc2l6ZW9mKHN0cnVjdCBTbXNNc2dIZHJfU1QpLCAwIH07Ci0JcmV0dXJuIHNtc2R2Yl9zZW5kcmVxdWVzdF9hbmRfd2FpdChjbGllbnQsICZNc2csIHNpemVvZihNc2cpLAotCQkJCQkgICAmY2xpZW50LT5zdGF0X2RvbmUpOworCWludCByZXQgPSBzbXNkdmJfc2VuZHJlcXVlc3RfYW5kX3dhaXQoY2xpZW50LCAmTXNnLCBzaXplb2YoTXNnKSwKKwkJCQkJICAgICAgJmNsaWVudC0+c3RhdF9kb25lKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbGllbnQtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKQorCQlzbXNfYm9hcmRfbGVkX2ZlZWRiYWNrKGNsaWVudC0+Y29yZWRldiwKKwkJCQkgICAgICAgKGNsaWVudC0+ZmVfdW5jID09IDApID8KKwkJCQkgICAgICAgU01TX0xFRF9ISSA6IFNNU19MRURfTE8pOworCWVsc2UKKwkJc21zX2JvYXJkX2xlZF9mZWVkYmFjayhjbGllbnQtPmNvcmVkZXYsIFNNU19MRURfT0ZGKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNtc2R2Yl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXQpCkBAIC0yMTcsNiArMjI5LDE4IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IHNtc2R2Yl9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVjYmxvY2tzKQoreworCXN0cnVjdCBzbXNkdmJfY2xpZW50X3QgKmNsaWVudCA9CisJCWNvbnRhaW5lcl9vZihmZSwgc3RydWN0IHNtc2R2Yl9jbGllbnRfdCwgZnJvbnRlbmQpOworCWludCByYyA9IHNtc2R2Yl9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChjbGllbnQpOworCisJaWYgKCFyYykKKwkJKnVjYmxvY2tzID0gY2xpZW50LT5mZV91bmM7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgc21zZHZiX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCiB7CkBAIC0yNzMsNiArMjk3LDI4IEBACiAJLyogdG9kbzogKi8KIAltZW1jcHkoZmVwLCAmY2xpZW50LT5mZV9wYXJhbXMsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtc2R2Yl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzbXNkdmJfY2xpZW50X3QgKmNsaWVudCA9CisJCWNvbnRhaW5lcl9vZihmZSwgc3RydWN0IHNtc2R2Yl9jbGllbnRfdCwgZnJvbnRlbmQpOworCisJc21zX2JvYXJkX3Bvd2VyKGNsaWVudC0+Y29yZWRldiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXNkdmJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHNtc2R2Yl9jbGllbnRfdCAqY2xpZW50ID0KKwkJY29udGFpbmVyX29mKGZlLCBzdHJ1Y3Qgc21zZHZiX2NsaWVudF90LCBmcm9udGVuZCk7CisKKwlzbXNfYm9hcmRfbGVkX2ZlZWRiYWNrKGNsaWVudC0+Y29yZWRldiwgU01TX0xFRF9PRkYpOworCXNtc19ib2FyZF9wb3dlcihjbGllbnQtPmNvcmVkZXYsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwOCw2ICszNTQsMTAgQEAKIAkucmVhZF9iZXIgPSBzbXNkdmJfcmVhZF9iZXIsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gc21zZHZiX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IHNtc2R2Yl9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IHNtc2R2Yl9yZWFkX3VjYmxvY2tzLAorCisJLmluaXQgPSBzbXNkdmJfaW5pdCwKKwkuc2xlZXAgPSBzbXNkdmJfc2xlZXAsCiB9OwogCiBzdGF0aWMgaW50IHNtc2R2Yl9ob3RwbHVnKHN0cnVjdCBzbXNjb3JlX2RldmljZV90ICpjb3JlZGV2LApAQCAtNDAyLDYgKzQ1Miw4IEBACiAKIAlzbXNfaW5mbygic3VjY2VzcyIpOwogCisJc21zX2JvYXJkX3NldHVwKGNvcmVkZXYpOworCiAJcmV0dXJuIDA7CiAKIGNsaWVudF9lcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKaW5kZXggODdhM2MyNC4uNWQ3Y2EzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKQEAgLTQzMiwxMSArNDMyLDU2IEBACiAJc21zdXNiX3Rlcm1fZGV2aWNlKGludGYpOwogfQogCitzdGF0aWMgaW50IHNtc3VzYl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbXNnKQoreworCXN0cnVjdCBzbXN1c2JfZGV2aWNlX3QgKmRldiA9CisJCShzdHJ1Y3Qgc21zdXNiX2RldmljZV90ICopdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlwcmludGsoS0VSTl9JTkZPICIlcyAgRW50ZXJpbmcgc3RhdHVzICVkLlxuIiwgX19mdW5jX18sIG1zZy5ldmVudCk7CisJc21zdXNiX3N0b3Bfc3RyZWFtaW5nKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zdXNiX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmMsIGk7CisJc3RydWN0IHNtc3VzYl9kZXZpY2VfdCAqZGV2ID0KKwkJKHN0cnVjdCBzbXN1c2JfZGV2aWNlX3QgKil1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzICBFbnRlcmluZy5cbiIsIF9fZnVuY19fKTsKKwl1c2JfY2xlYXJfaGFsdCh1ZGV2LCB1c2JfcmN2YnVsa3BpcGUodWRldiwgMHg4MSkpOworCXVzYl9jbGVhcl9oYWx0KHVkZXYsIHVzYl9yY3ZidWxrcGlwZSh1ZGV2LCAweDAyKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICJlbmRwb2ludCAlZCAlMDJ4ICUwMnggJWRcbiIsIGksCisJCSAgICAgICBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzLAorCQkgICAgICAgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzLAorCQkgICAgICAgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemUpOworCisJaWYgKGludGYtPm51bV9hbHRzZXR0aW5nID4gMCkgeworCQlyYyA9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsCisJCQkJICAgICAgIGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLgorCQkJCSAgICAgICBiSW50ZXJmYWNlTnVtYmVyLCAwKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlcyB1c2Jfc2V0X2ludGVyZmFjZSBmYWlsZWQsIHJjICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlzbXN1c2Jfc3RhcnRfc3RyZWFtaW5nKGRldik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzbXN1c2JfZHJpdmVyID0gewogCS5uYW1lCQkJPSAic21zMXh4eCIsCiAJLnByb2JlCQkJPSBzbXN1c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QJCT0gc21zdXNiX2Rpc2Nvbm5lY3QsCiAJLmlkX3RhYmxlCQk9IHNtc3VzYl9pZF90YWJsZSwKKworCS5zdXNwZW5kCQk9IHNtc3VzYl9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IHNtc3VzYl9yZXN1bWUsCiB9OwogCiBpbnQgc21zdXNiX3JlZ2lzdGVyKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCA0MDFhMDRlLi5hYjBiY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEwNCw2ICsxMDQsOCBAQAogCXNlbGVjdCBEVkJfU1RWMDI5NyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfU1RWMDI5OSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwNFggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUQjA4OTkgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUQjYxMDAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0xOQlAyMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwMjMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfVERBODI3WCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVpFCkBAIC0xMzEsNiArMTMzLDggQEAKIAlzZWxlY3QgRFZCX1REQTEwMDRYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UREExMDAyMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwMjMgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUQjA4OTkgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTgyNjEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1RVQTYxMDAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBzaW1wbGUgU0FBNzE0NiBiYXNlZCBEVkIgY2FyZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggMTAzMmVhNy4uZjk5NmNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTM1LDYgKzM1LDExIEBACiAKICNpbmNsdWRlICJidWRnZXQuaCIKICNpbmNsdWRlICJzdHYwMjk5LmgiCisjaW5jbHVkZSAic3RiMDg5OV9kcnYuaCIKKyNpbmNsdWRlICJzdGIwODk5X3JlZy5oIgorI2luY2x1ZGUgInN0YjA4OTlfY2ZnLmgiCisjaW5jbHVkZSAidGRhODI2MS5oIgorI2luY2x1ZGUgInRkYTgyNjFfY2ZnLmgiCiAjaW5jbHVkZSAidGRhMTAwMnguaCIKICNpbmNsdWRlICJ0ZGExMDA0eC5oIgogI2luY2x1ZGUgInR1YTYxMDAuaCIKQEAgLTg4Miw2ICs4ODcsMjgxIEBACiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc2QxODc4X2NpX3NldF9zeW1ib2xfcmF0ZSwKIH07CiAKKy8qIEtOQzEgRFZCLVMgKFNUQjA4OTkpIEluaXR0YWIJKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RiMDg5OV9zMV9yZWcga25jMV9zdGIwODk5X3MxX2luaXRfMVtdID0geworCisJeyBTVEIwODk5X0RFVl9JRAkJLCAweDgxIH0sCisJeyBTVEIwODk5X0RJU0NOVFJMMQkJLCAweDMyIH0sCisJeyBTVEIwODk5X0RJU0NOVFJMMgkJLCAweDgwIH0sCisJeyBTVEIwODk5X0RJU1JYX1NUMAkJLCAweDA0IH0sCisJeyBTVEIwODk5X0RJU1JYX1NUMQkJLCAweDAwIH0sCisJeyBTVEIwODk5X0RJU1BBUklUWQkJLCAweDAwIH0sCisJeyBTVEIwODk5X0RJU0ZJRk8JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9ESVNTVEFUVVMJCSwgMHgyMCB9LAorCXsgU1RCMDg5OV9ESVNGMjIJCSwgMHg4YyB9LAorCXsgU1RCMDg5OV9ESVNGMjJSWAkJLCAweDlhIH0sCisJeyBTVEIwODk5X1NZU1JFRwkJLCAweDBiIH0sCisJeyBTVEIwODk5X0FDUlBSRVNDCQksIDB4MTEgfSwKKwl7IFNUQjA4OTlfQUNSRElWMQkJLCAweDBhIH0sCisJeyBTVEIwODk5X0FDUkRJVjIJCSwgMHgwNSB9LAorCXsgU1RCMDg5OV9EQUNSMQkJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9EQUNSMgkJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9PVVRDRkcJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9NT0RFQ0ZHCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVJRU1RBVFVTXzMJCSwgMHgzMCB9LAorCXsgU1RCMDg5OV9JUlFTVEFUVVNfMgkJLCAweDAwIH0sCisJeyBTVEIwODk5X0lSUVNUQVRVU18xCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVJRU1RBVFVTXzAJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9JUlFNU0tfMwkJLCAweGYzIH0sCisJeyBTVEIwODk5X0lSUU1TS18yCQksIDB4ZmMgfSwKKwl7IFNUQjA4OTlfSVJRTVNLXzEJCSwgMHhmZiB9LAorCXsgU1RCMDg5OV9JUlFNU0tfMAkJLCAweGZmIH0sCisJeyBTVEIwODk5X0lSUUNGRwkJLCAweDAwIH0sCisJeyBTVEIwODk5X0kyQ0NGRwkJLCAweDg4IH0sCisJeyBTVEIwODk5X0kyQ1JQVAkJLCAweDU4IH0sIC8qIFJlcGVhdGVyPTgsIFN0b3A9ZGlzYWJsZWQgKi8KKwl7IFNUQjA4OTlfSU9QVkFMVUU1CQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUU0CQksIDB4MjAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUzCQksIDB4YzkgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUyCQksIDB4OTAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUxCQksIDB4NDAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUwCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfR1BJTzAwQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzAxQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzAyQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzAzQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA0Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA1Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA2Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA3Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA4Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA5Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEwQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzExQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEyQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEzQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE0Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE1Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE2Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE3Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE4Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE5Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzIwQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfU0RBVENGRwkJLCAweGI4IH0sCisJeyBTVEIwODk5X1NDTFRDRkcJCSwgMHhiYSB9LAorCXsgU1RCMDg5OV9BR0NSRkNGRwkJLCAweDA4IH0sIC8qIDB4MWMgKi8KKwl7IFNUQjA4OTlfR1BJTzIyCQksIDB4ODIgfSwgLyogQUdDQkIyQ0ZHICovCisJeyBTVEIwODk5X0dQSU8yMQkJLCAweDkxIH0sIC8qIEFHQ0JCMUNGRyAqLworCXsgU1RCMDg5OV9ESVJDTEtDRkcJCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9DTEtPVVQyN0NGRwkJLCAweDdlIH0sCisJeyBTVEIwODk5X1NUREJZQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfQ1MwQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfQ1MxQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfRElTRVFDT0NGRwkJLCAweDIwIH0sCisJeyBTVEIwODk5X0dQSU8zMkNGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zM0NGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zNENGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zNUNGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zNkNGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zN0NGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zOENGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8zOUNGRwkJLCAweDgyIH0sCisJeyBTVEIwODk5X05DT0FSU0UJCSwgMHgxNSB9LCAvKiAweDE1ID0gMjcgTWh6IENsb2NrLCBGLzMgPSAxOThNSHosIEYvNiA9IDk5TUh6ICovCisJeyBTVEIwODk5X1NZTlRDVFJMCQksIDB4MDIgfSwgLyogMHgwMCA9IENMSyBmcm9tIENMS0ksIDB4MDIgPSBDTEsgZnJvbSBYVEFMSSAqLworCXsgU1RCMDg5OV9GSUxUQ1RSTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZU0NUUkwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TVE9QQ0xLMQkJLCAweDIwIH0sCisJeyBTVEIwODk5X1NUT1BDTEsyCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSU5UQlVGU1RBVFVTCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSU5UQlVGQ1RSTAkJLCAweDBhIH0sCisJeyAweGZmZmYJCQksIDB4ZmYgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RiMDg5OV9zMV9yZWcga25jMV9zdGIwODk5X3MxX2luaXRfM1tdID0geworCXsgU1RCMDg5OV9ERU1PRAkJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9SQ09NUEMJCSwgMHhjOSB9LAorCXsgU1RCMDg5OV9BR0MxQ04JCSwgMHg0MSB9LAorCXsgU1RCMDg5OV9BR0MxUkVGCQksIDB4MDggfSwKKwl7IFNUQjA4OTlfUlRDCQkJLCAweDdhIH0sCisJeyBTVEIwODk5X1RNR0NGRwkJLCAweDRlIH0sCisJeyBTVEIwODk5X0FHQzJSRUYJCSwgMHgzMyB9LAorCXsgU1RCMDg5OV9UTFNSCQkJLCAweDg0IH0sCisJeyBTVEIwODk5X0NGRAkJCSwgMHhlZSB9LAorCXsgU1RCMDg5OV9BQ0xDCQkJLCAweDg3IH0sCisJeyBTVEIwODk5X0JDTEMJCQksIDB4OTQgfSwKKwl7IFNUQjA4OTlfRVFPTgkJCSwgMHg0MSB9LAorCXsgU1RCMDg5OV9MRFQJCQksIDB4ZGQgfSwKKwl7IFNUQjA4OTlfTERUMgkJCSwgMHhjOSB9LAorCXsgU1RCMDg5OV9FUVVBTFJFRgkJLCAweGI0IH0sCisJeyBTVEIwODk5X1RNR1JBTVAJCSwgMHgxMCB9LAorCXsgU1RCMDg5OV9UTUdUSEQJCSwgMHgzMCB9LAorCXsgU1RCMDg5OV9JRENDT01QCQksIDB4ZmIgfSwKKwl7IFNUQjA4OTlfUURDQ09NUAkJLCAweDAzIH0sCisJeyBTVEIwODk5X1BPV0VSSQkJLCAweDNiIH0sCisJeyBTVEIwODk5X1BPV0VSUQkJLCAweDNkIH0sCisJeyBTVEIwODk5X1JDT01QCQkJLCAweDgxIH0sCisJeyBTVEIwODk5X0FHQ0lRSU4JCSwgMHg4MCB9LAorCXsgU1RCMDg5OV9BR0MySTEJCSwgMHgwNCB9LAorCXsgU1RCMDg5OV9BR0MySTIJCSwgMHhmNSB9LAorCXsgU1RCMDg5OV9UTElSCQkJLCAweDI1IH0sCisJeyBTVEIwODk5X1JURgkJCSwgMHg4MCB9LAorCXsgU1RCMDg5OV9EU1RBVFVTCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfTERJCQkJLCAweGNhIH0sCisJeyBTVEIwODk5X0NGUk0JCQksIDB4ZjEgfSwKKwl7IFNUQjA4OTlfQ0ZSTAkJCSwgMHhmMyB9LAorCXsgU1RCMDg5OV9OSVJNCQkJLCAweDJhIH0sCisJeyBTVEIwODk5X05JUkwJCQksIDB4MDUgfSwKKwl7IFNUQjA4OTlfSVNZTUIJCQksIDB4MTcgfSwKKwl7IFNUQjA4OTlfUVNZTUIJCQksIDB4ZmEgfSwKKwl7IFNUQjA4OTlfU0ZSSAkJCSwgMHgyZiB9LAorCXsgU1RCMDg5OV9TRlJNCQkJLCAweDY4IH0sCisJeyBTVEIwODk5X1NGUkwJCQksIDB4NDAgfSwKKwl7IFNUQjA4OTlfU0ZSVVBICQksIDB4MmYgfSwKKwl7IFNUQjA4OTlfU0ZSVVBNCQksIDB4NjggfSwKKwl7IFNUQjA4OTlfU0ZSVVBMCQksIDB4NDAgfSwKKwl7IFNUQjA4OTlfRVFVQUkxCQksIDB4ZmQgfSwKKwl7IFNUQjA4OTlfRVFVQVExCQksIDB4MDQgfSwKKwl7IFNUQjA4OTlfRVFVQUkyCQksIDB4MGYgfSwKKwl7IFNUQjA4OTlfRVFVQVEyCQksIDB4ZmYgfSwKKwl7IFNUQjA4OTlfRVFVQUkzCQksIDB4ZGYgfSwKKwl7IFNUQjA4OTlfRVFVQVEzCQksIDB4ZmEgfSwKKwl7IFNUQjA4OTlfRVFVQUk0CQksIDB4MzcgfSwKKwl7IFNUQjA4OTlfRVFVQVE0CQksIDB4MGQgfSwKKwl7IFNUQjA4OTlfRVFVQUk1CQksIDB4YmQgfSwKKwl7IFNUQjA4OTlfRVFVQVE1CQksIDB4ZjcgfSwKKwl7IFNUQjA4OTlfRFNUQVRVUzIJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9WU1RBVFVTCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVkVSUk9SCQksIDB4ZmYgfSwKKwl7IFNUQjA4OTlfSVFTV0FQCQksIDB4MmEgfSwKKwl7IFNUQjA4OTlfRUNOVDFNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDFMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDNNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDNMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRkVDQVVUTzEJCSwgMHgwNiB9LAorCXsgU1RCMDg5OV9GRUNNCQkJLCAweDAxIH0sCisJeyBTVEIwODk5X1ZUSDEyCQkJLCAweGYwIH0sCisJeyBTVEIwODk5X1ZUSDIzCQkJLCAweGEwIH0sCisJeyBTVEIwODk5X1ZUSDM0CQkJLCAweDc4IH0sCisJeyBTVEIwODk5X1ZUSDU2CQkJLCAweDRlIH0sCisJeyBTVEIwODk5X1ZUSDY3CQkJLCAweDQ4IH0sCisJeyBTVEIwODk5X1ZUSDc4CQkJLCAweDM4IH0sCisJeyBTVEIwODk5X1BSVklUCQkJLCAweGZmIH0sCisJeyBTVEIwODk5X1ZJVFNZTkMJCSwgMHgxOSB9LAorCXsgU1RCMDg5OV9SU1VMQwkJCSwgMHhiMSB9LCAvKiBEVkIgPSAweGIxLCBEU1MgPSAweGExICovCisJeyBTVEIwODk5X1RTVUxDCQkJLCAweDQyIH0sCisJeyBTVEIwODk5X1JTTExDCQkJLCAweDQwIH0sCisJeyBTVEIwODk5X1RTTFBMCQkJLCAweDEyIH0sCisJeyBTVEIwODk5X1RTQ0ZHSAkJLCAweDBjIH0sCisJeyBTVEIwODk5X1RTQ0ZHTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTQ0ZHTAkJLCAweDBjIH0sCisJeyBTVEIwODk5X1RTT1VUCQkJLCAweDBkIH0sIC8qIDB4MGQgZm9yIENBTSAqLworCXsgU1RCMDg5OV9SU1NZTkNERUwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0lOSERFTEgJCSwgMHgwMiB9LAorCXsgU1RCMDg5OV9UU0lOSERFTE0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0lOSERFTEwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0xMU1RLTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTTExTVEtMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNVTFNUS00JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU1VMU1RLTAkJLCAweGFiIH0sCisJeyBTVEIwODk5X1BDS0xFTlVMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfUENLTEVOTEwJCSwgMHhjYyB9LAorCXsgU1RCMDg5OV9SU1BDS0xFTgkJLCAweGNjIH0sCisJeyBTVEIwODk5X1RTU1RBVFVTCQksIDB4ODAgfSwKKwl7IFNUQjA4OTlfRVJSQ1RSTDEJCSwgMHhiNiB9LAorCXsgU1RCMDg5OV9FUlJDVFJMMgkJLCAweDk2IH0sCisJeyBTVEIwODk5X0VSUkNUUkwzCQksIDB4ODkgfSwKKwl7IFNUQjA4OTlfRE1PTk1TSzEJCSwgMHgyNyB9LAorCXsgU1RCMDg5OV9ETU9OTVNLMAkJLCAweDAzIH0sCisJeyBTVEIwODk5X0RFTUFQVklUCQksIDB4NWMgfSwKKwl7IFNUQjA4OTlfUExQQVJNCQksIDB4MWYgfSwKKwl7IFNUQjA4OTlfUERFTENUUkwJCSwgMHg0OCB9LAorCXsgU1RCMDg5OV9QREVMQ1RSTDIJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9CQkhDVFJMMQkJLCAweDAwIH0sCisJeyBTVEIwODk5X0JCSENUUkwyCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSFlTVFRIUkVTSAkJLCAweDc3IH0sCisJeyBTVEIwODk5X01BVENTVE0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9NQVRDU1RMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVVBMQ1NUTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1VQTENTVEwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9ERkxDU1RNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfREZMQ1NUTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZTkNDU1QJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRENTVE0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRENTVEwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9JU0lfRU5UUlkJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9JU0lfQklUX0VOCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfTUFUU1RSTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X01BVFNUUkwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9VUExTVFJNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVVBMU1RSTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X0RGTFNUUk0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9ERkxTVFJMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfU1lOQ1NUUgkJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZTkNEU1RSTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZTkNEU1RSTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X0NGR1BERUxTVEFUVVMxCSwgMHgxMCB9LAorCXsgU1RCMDg5OV9DRkdQREVMU1RBVFVTMgksIDB4MDAgfSwKKwl7IFNUQjA4OTlfQkJGRVJST1JNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfQkJGRVJST1JMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVVBLVEVSUk9STQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1VQS1RFUlJPUkwJCSwgMHgwMCB9LAorCXsgMHhmZmZmCQkJLCAweGZmIH0sCit9OworCisvKiBTVEIwODk5IGRlbW9kdWxhdG9yIGNvbmZpZyBmb3IgdGhlIEtOQzEgYW5kIGNsb25lcyAqLworc3RhdGljIHN0cnVjdCBzdGIwODk5X2NvbmZpZyBrbmMxX2R2YnMyX2NvbmZpZyA9IHsKKwkuaW5pdF9kZXYJCT0ga25jMV9zdGIwODk5X3MxX2luaXRfMSwKKwkuaW5pdF9zMl9kZW1vZAkJPSBzdGIwODk5X3MyX2luaXRfMiwKKwkuaW5pdF9zMV9kZW1vZAkJPSBrbmMxX3N0YjA4OTlfczFfaW5pdF8zLAorCS5pbml0X3MyX2ZlYwkJPSBzdGIwODk5X3MyX2luaXRfNCwKKwkuaW5pdF90c3QJCT0gc3RiMDg5OV9zMV9pbml0XzUsCisKKwkucG9zdHByb2MJCT0gTlVMTCwKKworCS5kZW1vZF9hZGRyZXNzCQk9IDB4NjgsCisvLwkudHNfb3V0cHV0X21vZGUJCT0gU1RCMDg5OV9PVVRfUEFSQUxMRUwsCS8qIHR5cGVzID0gU0VSSUFML1BBUkFMTEVMCSovCisJLmJsb2NrX3N5bmNfbW9kZQk9IFNUQjA4OTlfU1lOQ19GT1JDRUQsCS8qIERTUywgU1lOQ19GT1JDRUQvVU5TWU5DRUQJKi8KKy8vCS50c19wZmJpdF90b2dnbGUJPSBTVEIwODk5X01QRUdfTk9STUFMLAkvKiBEaXJlY1RWLCBNUEVHIHRvZ2dsaW5nIHNlcQkqLworCisJLnh0YWxfZnJlcQkJPSAyNzAwMDAwMCwKKwkuaW52ZXJzaW9uCQk9IElRX1NXQVBfT0ZGLCAvKiAxICovCisKKwkubG9fY2xrCQkJPSA3NjUwMDAwMCwKKwkuaGlfY2xrCQkJPSA5MDAwMDAwMCwKKworCS5lc25vX2F2ZQkJPSBTVEIwODk5X0RWQlMyX0VTTk9fQVZFLAorCS5lc25vX3F1YW50CQk9IFNUQjA4OTlfRFZCUzJfRVNOT19RVUFOVCwKKwkuYXZmcmFtZXNfY29hcnNlCT0gU1RCMDg5OV9EVkJTMl9BVkZSQU1FU19DT0FSU0UsCisJLmF2ZnJhbWVzX2ZpbmUJCT0gU1RCMDg5OV9EVkJTMl9BVkZSQU1FU19GSU5FLAorCS5taXNzX3RocmVzaG9sZAkJPSBTVEIwODk5X0RWQlMyX01JU1NfVEhSRVNIT0xELAorCS51d3BfdGhyZXNob2xkX2FjcQk9IFNUQjA4OTlfRFZCUzJfVVdQX1RIUkVTSE9MRF9BQ1EsCisJLnV3cF90aHJlc2hvbGRfdHJhY2sJPSBTVEIwODk5X0RWQlMyX1VXUF9USFJFU0hPTERfVFJBQ0ssCisJLnV3cF90aHJlc2hvbGRfc29mCT0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1NPRiwKKwkuc29mX3NlYXJjaF90aW1lb3V0CT0gU1RCMDg5OV9EVkJTMl9TT0ZfU0VBUkNIX1RJTUVPVVQsCisKKwkuYnRyX25jb19iaXRzCQk9IFNUQjA4OTlfRFZCUzJfQlRSX05DT19CSVRTLAorCS5idHJfZ2Fpbl9zaGlmdF9vZmZzZXQJPSBTVEIwODk5X0RWQlMyX0JUUl9HQUlOX1NISUZUX09GRlNFVCwKKwkuY3JsX25jb19iaXRzCQk9IFNUQjA4OTlfRFZCUzJfQ1JMX05DT19CSVRTLAorCS5sZHBjX21heF9pdGVyCQk9IFNUQjA4OTlfRFZCUzJfTERQQ19NQVhfSVRFUiwKKworCS50dW5lcl9nZXRfZnJlcXVlbmN5CT0gdGRhODI2MV9nZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfZnJlcXVlbmN5CT0gdGRhODI2MV9zZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfYmFuZHdpZHRoCT0gTlVMTCwKKwkudHVuZXJfZ2V0X2JhbmR3aWR0aAk9IHRkYTgyNjFfZ2V0X2JhbmR3aWR0aCwKKwkudHVuZXJfc2V0X3Jmc2lnZ2Fpbgk9IE5VTEwKK307CisKKy8qCisgKiBTRDE4NzgvU0hBIHR1bmVyIGNvbmZpZworICogMUYsIFNpbmdsZSBJL1AsIEhvcml6b250YWwgbW91bnQsIEhpZ2ggU2Vuc2l0aXZpdHkKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZGE4MjYxX2NvbmZpZyBzZDE4NzhjX2NvbmZpZyA9IHsKKy8vCS5uYW1lCQk9ICJTRDE4NzgvU0hBIiwKKwkuYWRkcgkJPSAweDYwLAorCS5zdGVwX3NpemUJPSBUREE4MjYxX1NURVBfMTAwMCAvKiBrSHogKi8KK307CisKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7CiAJdTggYiA9IDB4ZmY7CkBAIC05MDUsOCArMTE4NSwxMSBAQAogI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVIJCTB4MDAxNAogI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVJfUExVU19YNAkweDAwMTUKICNkZWZpbmUgU1VCSURfRFZCU19UVl9TVEFSX0NJCQkweDAwMTYKKyNkZWZpbmUgU1VCSURfRFZCUzJfS05DMQkJMHgwMDE4CisjZGVmaW5lIFNVQklEX0RWQlMyX0tOQzFfT0VNCQkweDAwMTkKICNkZWZpbmUgU1VCSURfRFZCU19FQVNZV0FUQ0hfMSAgCTB4MDAxYQogI2RlZmluZSBTVUJJRF9EVkJTX0VBU1lXQVRDSF8yICAJMHgwMDFiCisjZGVmaW5lIFNVQklEX0RWQlMyX0VBU1lXQVRDSAkJMHgwMDFkCiAjZGVmaW5lIFNVQklEX0RWQlNfRUFTWVdBVENICQkweDAwMWUKIAogI2RlZmluZSBTVUJJRF9EVkJDX0VBU1lXQVRDSAkJMHgwMDJhCkBAIC05NDEsNiArMTIyNCw5IEBACiAJCWNhc2UgU1VCSURfRFZCVF9LTkMxX1BMVVM6CiAJCWNhc2UgU1VCSURfRFZCQ19FQVNZV0FUQ0g6CiAJCWNhc2UgU1VCSURfRFZCQ19LTkMxX1BMVVNfTUszOgorCQljYXNlIFNVQklEX0RWQlMyX0tOQzE6CisJCWNhc2UgU1VCSURfRFZCUzJfS05DMV9PRU06CisJCWNhc2UgU1VCSURfRFZCUzJfRUFTWVdBVENIOgogCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVEhJKTsKIAkJCWJyZWFrOwogCX0KQEAgLTk5Myw3ICsxMjc5LDE0IEBACiAJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19zdTEyNzhfdHlfY2lfdHVuZXJfc2V0X3BhcmFtczsKIAkJfQogCQlicmVhazsKKwljYXNlIFNVQklEX0RWQlMyX0tOQzE6CisJY2FzZSBTVUJJRF9EVkJTMl9LTkMxX09FTToKKwljYXNlIFNVQklEX0RWQlMyX0VBU1lXQVRDSDoKKwkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOworCQlpZiAoKGZlID0gZHZiX2F0dGFjaChzdGIwODk5X2F0dGFjaCwgJmtuYzFfZHZiczJfY29uZmlnLCAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApKSkKKwkJCWR2Yl9hdHRhY2godGRhODI2MV9hdHRhY2gsIGZlLCAmc2QxODc4Y19jb25maWcsICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CiAKKwkJYnJlYWs7CiAJY2FzZSBTVUJJRF9EVkJTX0NJTkVSR1kxMjAwOgogCQlmZSA9IGR2Yl9hdHRhY2goc3R2MDI5OV9hdHRhY2gsICZjaW5lcmd5XzEyMDBzX2NvbmZpZywKIAkJCQkgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKQEAgLTEyNjAsNiArMTU1Myw4IEBACiBzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGJ1ZGdldF9leHRlbnNpb247CiAKIE1BS0VfQlVER0VUX0lORk8oa25jMXMsICJLTkMxIERWQi1TIiwgQlVER0VUX0tOQzFTKTsKK01BS0VfQlVER0VUX0lORk8oa25jMXMyLCJLTkMxIERWQi1TMiIsIEJVREdFVF9LTkMxUzIpOworTUFLRV9CVURHRVRfSU5GTyhzYXRlczIsIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TMiIsIEJVREdFVF9LTkMxUzIpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxYywgIktOQzEgRFZCLUMiLCBCVURHRVRfS05DMUMpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxdCwgIktOQzEgRFZCLVQiLCBCVURHRVRfS05DMVQpOwogTUFLRV9CVURHRVRfSU5GTyhrbmN4cywgIktOQyBUViBTVEFSIERWQi1TIiwgQlVER0VUX1RWU1RBUik7CkBAIC0xMjkwLDYgKzE1ODUsOSBAQAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmN4cywgMHgxODk0LCAweDAwMTQpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxc3B4NCwgMHgxODk0LCAweDAwMTUpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmN4cywgMHgxODk0LCAweDAwMTYpLAorCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxczIsIDB4MTg5NCwgMHgwMDE4KSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMXMyLCAweDE4OTQsIDB4MDAxOSksCisJTUFLRV9FWFRFTlNJT05fUENJKHNhdGVzMiwgMHgxODk0LCAweDAwMWQpLAogCU1BS0VfRVhURU5TSU9OX1BDSShzYXRld3BscywgMHgxODk0LCAweDAwMWUpLAogCU1BS0VfRVhURU5TSU9OX1BDSShzYXRld3BsczEsIDB4MTg5NCwgMHgwMDFhKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koc2F0ZXdwcywgMHgxODk0LCAweDAwMWIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCAwYTVhYWQ0Li4zNTA3NDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtNDMsNiArNDMsMTEgQEAKICNpbmNsdWRlICJzdHYwMjk5LmgiCiAjaW5jbHVkZSAic3R2MDI5Ny5oIgogI2luY2x1ZGUgInRkYTEwMDR4LmgiCisjaW5jbHVkZSAic3RiMDg5OV9kcnYuaCIKKyNpbmNsdWRlICJzdGIwODk5X3JlZy5oIgorI2luY2x1ZGUgInN0YjA4OTlfY2ZnLmgiCisjaW5jbHVkZSAic3RiNjEwMC5oIgorI2luY2x1ZGUgInN0YjYxMDBfY2ZnLmgiCiAjaW5jbHVkZSAibG5icDIxLmgiCiAjaW5jbHVkZSAiYnNiZTEuaCIKICNpbmNsdWRlICJic3J1Ni5oIgpAQCAtMTA3MSw3ICsxMDc2LDI3MSBAQAogCS5kZWx0YWYgPSAweGE1MTEsCiB9OwogCisvKiBUVCBTMi0zMjAwIERWQi1TIChTVEIwODk5KSBJbml0dGFiICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczFfcmVnIHR0MzIwMF9zdGIwODk5X3MxX2luaXRfMVtdID0gewogCisJeyBTVEIwODk5X0RFVl9JRAkJLCAweDgxIH0sCisJeyBTVEIwODk5X0RJU0NOVFJMMQkJLCAweDMyIH0sCisJeyBTVEIwODk5X0RJU0NOVFJMMiAgICAgCSwgMHg4MCB9LAorCXsgU1RCMDg5OV9ESVNSWF9TVDAgICAgIAksIDB4MDQgfSwKKwl7IFNUQjA4OTlfRElTUlhfU1QxICAgICAJLCAweDAwIH0sCisJeyBTVEIwODk5X0RJU1BBUklUWSAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9ESVNGSUZPICAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRElTU1RBVFVTCQksIDB4MjAgfSwKKwl7IFNUQjA4OTlfRElTRjIyICAgICAgICAJLCAweDhjIH0sCisJeyBTVEIwODk5X0RJU0YyMlJYICAgICAgCSwgMHg5YSB9LAorCXsgU1RCMDg5OV9TWVNSRUcJCSwgMHgwYiB9LAorCXsgU1RCMDg5OV9BQ1JQUkVTQyAgICAgIAksIDB4MTEgfSwKKwl7IFNUQjA4OTlfQUNSRElWMSAgICAgICAJLCAweDBhIH0sCisJeyBTVEIwODk5X0FDUkRJVjIgICAgICAgCSwgMHgwNSB9LAorCXsgU1RCMDg5OV9EQUNSMSAgICAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfREFDUjIgICAgICAgICAJLCAweDAwIH0sCisJeyBTVEIwODk5X09VVENGRyAgICAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9NT0RFQ0ZHICAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVJRU1RBVFVTXzMJCSwgMHgzMCB9LAorCXsgU1RCMDg5OV9JUlFTVEFUVVNfMgkJLCAweDAwIH0sCisJeyBTVEIwODk5X0lSUVNUQVRVU18xCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVJRU1RBVFVTXzAJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9JUlFNU0tfMyAgICAgIAksIDB4ZjMgfSwKKwl7IFNUQjA4OTlfSVJRTVNLXzIgICAgICAJLCAweGZjIH0sCisJeyBTVEIwODk5X0lSUU1TS18xICAgICAgCSwgMHhmZiB9LAorCXsgU1RCMDg5OV9JUlFNU0tfMAkJLCAweGZmIH0sCisJeyBTVEIwODk5X0lSUUNGRwkJLCAweDAwIH0sCisJeyBTVEIwODk5X0kyQ0NGRyAgICAgICAgCSwgMHg4OCB9LAorCXsgU1RCMDg5OV9JMkNSUFQgICAgICAgIAksIDB4NDggfSwgLyogMTJrIFB1bGx1cCwgUmVwZWF0ZXI9MTYsIFN0b3A9ZGlzYWJsZWQgKi8KKwl7IFNUQjA4OTlfSU9QVkFMVUU1CQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUU0CQksIDB4MjAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUzCQksIDB4YzkgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUyCQksIDB4OTAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUxCQksIDB4NDAgfSwKKwl7IFNUQjA4OTlfSU9QVkFMVUUwCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfR1BJTzAwQ0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wMUNGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDJDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzAzQ0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wNENGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDVDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA2Q0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wN0NGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDhDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA5Q0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xMENGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTFDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEyQ0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xM0NGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTRDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE1Q0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xNkNGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTdDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE4Q0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xOUNGRyAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMjBDRkcgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfU0RBVENGRyAgICAgICAJLCAweGI4IH0sCisJeyBTVEIwODk5X1NDTFRDRkcgICAgICAgCSwgMHhiYSB9LAorCXsgU1RCMDg5OV9BR0NSRkNGRyAgICAgIAksIDB4MWMgfSwgLyogMHgxMSAqLworCXsgU1RCMDg5OV9HUElPMjIgICAgICAgIAksIDB4ODIgfSwgLyogQUdDQkIyQ0ZHICovCisJeyBTVEIwODk5X0dQSU8yMSAgICAgICAgCSwgMHg5MSB9LCAvKiBBR0NCQjFDRkcgKi8KKwl7IFNUQjA4OTlfRElSQ0xLQ0ZHICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0NMS09VVDI3Q0ZHICAgCSwgMHg3ZSB9LAorCXsgU1RCMDg5OV9TVERCWUNGRyAgICAgIAksIDB4ODIgfSwKKwl7IFNUQjA4OTlfQ1MwQ0ZHICAgICAgICAJLCAweDgyIH0sCisJeyBTVEIwODk5X0NTMUNGRyAgICAgICAgCSwgMHg4MiB9LAorCXsgU1RCMDg5OV9ESVNFUUNPQ0ZHICAgIAksIDB4MjAgfSwKKwl7IFNUQjA4OTlfR1BJTzMyQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzMzQ0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM0Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM1Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM2Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM3Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM4Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzM5Q0ZHCQksIDB4ODIgfSwKKwl7IFNUQjA4OTlfTkNPQVJTRSAgICAgICAJLCAweDE1IH0sIC8qIDB4MTUgPSAyNyBNaHogQ2xvY2ssIEYvMyA9IDE5OE1IeiwgRi82ID0gOTlNSHogKi8KKwl7IFNUQjA4OTlfU1lOVENUUkwgICAgICAJLCAweDAyIH0sIC8qIDB4MDAgPSBDTEsgZnJvbSBDTEtJLCAweDAyID0gQ0xLIGZyb20gWFRBTEkgKi8KKwl7IFNUQjA4OTlfRklMVENUUkwgICAgICAJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZU0NUUkwgICAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TVE9QQ0xLMSAgICAgIAksIDB4MjAgfSwKKwl7IFNUQjA4OTlfU1RPUENMSzIgICAgICAJLCAweDAwIH0sCisJeyBTVEIwODk5X0lOVEJVRlNUQVRVUwkJLCAweDAwIH0sCisJeyBTVEIwODk5X0lOVEJVRkNUUkwgICAgCSwgMHgwYSB9LAorCXsgMHhmZmZmCQkJLCAweGZmIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczFfcmVnIHR0MzIwMF9zdGIwODk5X3MxX2luaXRfM1tdID0geworCXsgU1RCMDg5OV9ERU1PRCAgICAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfUkNPTVBDICAgICAgICAJLCAweGM5IH0sCisJeyBTVEIwODk5X0FHQzFDTiAgICAgICAgCSwgMHg0MSB9LAorCXsgU1RCMDg5OV9BR0MxUkVGICAgICAgIAksIDB4MTAgfSwKKwl7IFNUQjA4OTlfUlRDCQkJLCAweDdhIH0sCisJeyBTVEIwODk5X1RNR0NGRyAgICAgICAgCSwgMHg0ZSB9LAorCXsgU1RCMDg5OV9BR0MyUkVGICAgICAgIAksIDB4MzQgfSwKKwl7IFNUQjA4OTlfVExTUiAgICAgICAgICAJLCAweDg0IH0sCisJeyBTVEIwODk5X0NGRCAgICAgICAgICAgCSwgMHhjNyB9LAorCXsgU1RCMDg5OV9BQ0xDCQkJLCAweDg3IH0sCisJeyBTVEIwODk5X0JDTEMgICAgICAgICAgCSwgMHg5NCB9LAorCXsgU1RCMDg5OV9FUU9OICAgICAgICAgIAksIDB4NDEgfSwKKwl7IFNUQjA4OTlfTERUICAgICAgICAgICAJLCAweGRkIH0sCisJeyBTVEIwODk5X0xEVDIgICAgICAgICAgCSwgMHhjOSB9LAorCXsgU1RCMDg5OV9FUVVBTFJFRiAgICAgIAksIDB4YjQgfSwKKwl7IFNUQjA4OTlfVE1HUkFNUCAgICAgICAJLCAweDEwIH0sCisJeyBTVEIwODk5X1RNR1RIRCAgICAgICAgCSwgMHgzMCB9LAorCXsgU1RCMDg5OV9JRENDT01QCQksIDB4ZmIgfSwKKwl7IFNUQjA4OTlfUURDQ09NUAkJLCAweDAzIH0sCisJeyBTVEIwODk5X1BPV0VSSQkJLCAweDNiIH0sCisJeyBTVEIwODk5X1BPV0VSUQkJLCAweDNkIH0sCisJeyBTVEIwODk5X1JDT01QCQkJLCAweDgxIH0sCisJeyBTVEIwODk5X0FHQ0lRSU4JCSwgMHg4MCB9LAorCXsgU1RCMDg5OV9BR0MySTEJCSwgMHgwNCB9LAorCXsgU1RCMDg5OV9BR0MySTIJCSwgMHhmNSB9LAorCXsgU1RCMDg5OV9UTElSCQkJLCAweDI1IH0sCisJeyBTVEIwODk5X1JURgkJCSwgMHg4MCB9LAorCXsgU1RCMDg5OV9EU1RBVFVTCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfTERJCQkJLCAweGNhIH0sCisJeyBTVEIwODk5X0NGUk0JCQksIDB4ZjEgfSwKKwl7IFNUQjA4OTlfQ0ZSTAkJCSwgMHhmMyB9LAorCXsgU1RCMDg5OV9OSVJNCQkJLCAweDJhIH0sCisJeyBTVEIwODk5X05JUkwJCQksIDB4MDUgfSwKKwl7IFNUQjA4OTlfSVNZTUIJCQksIDB4MTcgfSwKKwl7IFNUQjA4OTlfUVNZTUIJCQksIDB4ZmEgfSwKKwl7IFNUQjA4OTlfU0ZSSCAgICAgICAgICAJLCAweDJmIH0sCisJeyBTVEIwODk5X1NGUk0gICAgICAgICAgCSwgMHg2OCB9LAorCXsgU1RCMDg5OV9TRlJMICAgICAgICAgIAksIDB4NDAgfSwKKwl7IFNUQjA4OTlfU0ZSVVBIICAgICAgICAJLCAweDJmIH0sCisJeyBTVEIwODk5X1NGUlVQTSAgICAgICAgCSwgMHg2OCB9LAorCXsgU1RCMDg5OV9TRlJVUEwgICAgICAgIAksIDB4NDAgfSwKKwl7IFNUQjA4OTlfRVFVQUkxCQksIDB4ZmQgfSwKKwl7IFNUQjA4OTlfRVFVQVExCQksIDB4MDQgfSwKKwl7IFNUQjA4OTlfRVFVQUkyCQksIDB4MGYgfSwKKwl7IFNUQjA4OTlfRVFVQVEyCQksIDB4ZmYgfSwKKwl7IFNUQjA4OTlfRVFVQUkzCQksIDB4ZGYgfSwKKwl7IFNUQjA4OTlfRVFVQVEzCQksIDB4ZmEgfSwKKwl7IFNUQjA4OTlfRVFVQUk0CQksIDB4MzcgfSwKKwl7IFNUQjA4OTlfRVFVQVE0CQksIDB4MGQgfSwKKwl7IFNUQjA4OTlfRVFVQUk1CQksIDB4YmQgfSwKKwl7IFNUQjA4OTlfRVFVQVE1CQksIDB4ZjcgfSwKKwl7IFNUQjA4OTlfRFNUQVRVUzIJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9WU1RBVFVTICAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVkVSUk9SCQksIDB4ZmYgfSwKKwl7IFNUQjA4OTlfSVFTV0FQCQksIDB4MmEgfSwKKwl7IFNUQjA4OTlfRUNOVDFNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDFMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDNNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDNMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfRkVDQVVUTzEgICAgICAJLCAweDA2IH0sCisJeyBTVEIwODk5X0ZFQ00JCQksIDB4MDEgfSwKKwl7IFNUQjA4OTlfVlRIMTIgICAgICAgICAJLCAweGYwIH0sCisJeyBTVEIwODk5X1ZUSDIzICAgICAgICAgCSwgMHhhMCB9LAorCXsgU1RCMDg5OV9WVEgzNAkJCSwgMHg3OCB9LAorCXsgU1RCMDg5OV9WVEg1NiAgICAgICAgIAksIDB4NGUgfSwKKwl7IFNUQjA4OTlfVlRINjcgICAgICAgICAJLCAweDQ4IH0sCisJeyBTVEIwODk5X1ZUSDc4ICAgICAgICAgCSwgMHgzOCB9LAorCXsgU1RCMDg5OV9QUlZJVCAgICAgICAgIAksIDB4ZmYgfSwKKwl7IFNUQjA4OTlfVklUU1lOQyAgICAgICAJLCAweDE5IH0sCisJeyBTVEIwODk5X1JTVUxDICAgICAgICAgCSwgMHhiMSB9LCAvKiBEVkIgPSAweGIxLCBEU1MgPSAweGExICovCisJeyBTVEIwODk5X1RTVUxDICAgICAgICAgCSwgMHg0MiB9LAorCXsgU1RCMDg5OV9SU0xMQyAgICAgICAgIAksIDB4NDAgfSwKKwl7IFNUQjA4OTlfVFNMUEwJCQksIDB4MTIgfSwKKwl7IFNUQjA4OTlfVFNDRkdIICAgICAgICAJLCAweDBjIH0sCisJeyBTVEIwODk5X1RTQ0ZHTSAgICAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0NGR0wgICAgICAgIAksIDB4MGMgfSwKKwl7IFNUQjA4OTlfVFNPVVQJCQksIDB4MGQgfSwgLyogMHgwZCBmb3IgQ0FNICovCisJeyBTVEIwODk5X1JTU1lOQ0RFTCAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0lOSERFTEggICAgIAksIDB4MDIgfSwKKwl7IFNUQjA4OTlfVFNJTkhERUxNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNJTkhERUxMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNMTFNUS00JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9UU0xMU1RLTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1RTVUxTVEtNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVFNVTFNUS0wJCSwgMHhhYiB9LAorCXsgU1RCMDg5OV9QQ0tMRU5VTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1BDS0xFTkxMCQksIDB4Y2MgfSwKKwl7IFNUQjA4OTlfUlNQQ0tMRU4JCSwgMHhjYyB9LAorCXsgU1RCMDg5OV9UU1NUQVRVUwkJLCAweDgwIH0sCisJeyBTVEIwODk5X0VSUkNUUkwxICAgICAgCSwgMHhiNiB9LAorCXsgU1RCMDg5OV9FUlJDVFJMMiAgICAgIAksIDB4OTYgfSwKKwl7IFNUQjA4OTlfRVJSQ1RSTDMgICAgICAJLCAweDg5IH0sCisJeyBTVEIwODk5X0RNT05NU0sxCQksIDB4MjcgfSwKKwl7IFNUQjA4OTlfRE1PTk1TSzAJCSwgMHgwMyB9LAorCXsgU1RCMDg5OV9ERU1BUFZJVCAgICAgIAksIDB4NWMgfSwKKwl7IFNUQjA4OTlfUExQQVJNCQksIDB4MWYgfSwKKwl7IFNUQjA4OTlfUERFTENUUkwgICAgICAJLCAweDQ4IH0sCisJeyBTVEIwODk5X1BERUxDVFJMMiAgICAgCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9CQkhDVFJMMSAgICAgIAksIDB4MDAgfSwKKwl7IFNUQjA4OTlfQkJIQ1RSTDIgICAgICAJLCAweDAwIH0sCisJeyBTVEIwODk5X0hZU1RUSFJFU0ggICAgCSwgMHg3NyB9LAorCXsgU1RCMDg5OV9NQVRDU1RNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfTUFUQ1NUTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1VQTENTVE0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9VUExDU1RMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfREZMQ1NUTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X0RGTENTVEwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DQ1NUCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfU1lOQ0RDU1RNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfU1lOQ0RDU1RMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVNJX0VOVFJZCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfSVNJX0JJVF9FTgkJLCAweDAwIH0sCisJeyBTVEIwODk5X01BVFNUUk0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9NQVRTVFJMCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfVVBMU1RSTQkJLCAweDAwIH0sCisJeyBTVEIwODk5X1VQTFNUUkwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9ERkxTVFJNCQksIDB4MDAgfSwKKwl7IFNUQjA4OTlfREZMU1RSTAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1NZTkNTVFIJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRFNUUk0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRFNUUkwJCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9DRkdQREVMU1RBVFVTMQksIDB4MTAgfSwKKwl7IFNUQjA4OTlfQ0ZHUERFTFNUQVRVUzIJLCAweDAwIH0sCisJeyBTVEIwODk5X0JCRkVSUk9STQkJLCAweDAwIH0sCisJeyBTVEIwODk5X0JCRkVSUk9STAkJLCAweDAwIH0sCisJeyBTVEIwODk5X1VQS1RFUlJPUk0JCSwgMHgwMCB9LAorCXsgU1RCMDg5OV9VUEtURVJST1JMCQksIDB4MDAgfSwKKwl7IDB4ZmZmZgkJCSwgMHhmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzdGIwODk5X2NvbmZpZyB0dDMyMDBfY29uZmlnID0geworCS5pbml0X2RldgkJPSB0dDMyMDBfc3RiMDg5OV9zMV9pbml0XzEsCisJLmluaXRfczJfZGVtb2QJCT0gc3RiMDg5OV9zMl9pbml0XzIsCisJLmluaXRfczFfZGVtb2QJCT0gdHQzMjAwX3N0YjA4OTlfczFfaW5pdF8zLAorCS5pbml0X3MyX2ZlYwkJPSBzdGIwODk5X3MyX2luaXRfNCwKKwkuaW5pdF90c3QJCT0gc3RiMDg5OV9zMV9pbml0XzUsCisKKwkucG9zdHByb2MJCT0gTlVMTCwKKworCS5kZW1vZF9hZGRyZXNzIAkJPSAweDY4LAorCisJLnh0YWxfZnJlcQkJPSAyNzAwMDAwMCwKKwkuaW52ZXJzaW9uCQk9IElRX1NXQVBfT04sIC8qIDEgKi8KKworCS5sb19jbGsJCQk9IDc2NTAwMDAwLAorCS5oaV9jbGsJCQk9IDk5MDAwMDAwLAorCisJLmVzbm9fYXZlCQk9IFNUQjA4OTlfRFZCUzJfRVNOT19BVkUsCisJLmVzbm9fcXVhbnQJCT0gU1RCMDg5OV9EVkJTMl9FU05PX1FVQU5ULAorCS5hdmZyYW1lc19jb2Fyc2UJPSBTVEIwODk5X0RWQlMyX0FWRlJBTUVTX0NPQVJTRSwKKwkuYXZmcmFtZXNfZmluZQkJPSBTVEIwODk5X0RWQlMyX0FWRlJBTUVTX0ZJTkUsCisJLm1pc3NfdGhyZXNob2xkCQk9IFNUQjA4OTlfRFZCUzJfTUlTU19USFJFU0hPTEQsCisJLnV3cF90aHJlc2hvbGRfYWNxCT0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX0FDUSwKKwkudXdwX3RocmVzaG9sZF90cmFjawk9IFNUQjA4OTlfRFZCUzJfVVdQX1RIUkVTSE9MRF9UUkFDSywKKwkudXdwX3RocmVzaG9sZF9zb2YJPSBTVEIwODk5X0RWQlMyX1VXUF9USFJFU0hPTERfU09GLAorCS5zb2Zfc2VhcmNoX3RpbWVvdXQJPSBTVEIwODk5X0RWQlMyX1NPRl9TRUFSQ0hfVElNRU9VVCwKKworCS5idHJfbmNvX2JpdHMJCT0gU1RCMDg5OV9EVkJTMl9CVFJfTkNPX0JJVFMsCisJLmJ0cl9nYWluX3NoaWZ0X29mZnNldAk9IFNUQjA4OTlfRFZCUzJfQlRSX0dBSU5fU0hJRlRfT0ZGU0VULAorCS5jcmxfbmNvX2JpdHMJCT0gU1RCMDg5OV9EVkJTMl9DUkxfTkNPX0JJVFMsCisJLmxkcGNfbWF4X2l0ZXIJCT0gU1RCMDg5OV9EVkJTMl9MRFBDX01BWF9JVEVSLAorCisJLnR1bmVyX2dldF9mcmVxdWVuY3kJPSBzdGI2MTAwX2dldF9mcmVxdWVuY3ksCisJLnR1bmVyX3NldF9mcmVxdWVuY3kJPSBzdGI2MTAwX3NldF9mcmVxdWVuY3ksCisJLnR1bmVyX3NldF9iYW5kd2lkdGgJPSBzdGI2MTAwX3NldF9iYW5kd2lkdGgsCisJLnR1bmVyX2dldF9iYW5kd2lkdGgJPSBzdGI2MTAwX2dldF9iYW5kd2lkdGgsCisJLnR1bmVyX3NldF9yZnNpZ2dhaW4JPSBOVUxMCit9OworCitzdHJ1Y3Qgc3RiNjEwMF9jb25maWcgdHQzMjAwX3N0YjYxMDBfY29uZmlnID0geworCS50dW5lcl9hZGRyZXNzCT0gMHg2MCwKKwkucmVmY2xvY2sJPSAyNzAwMDAwMCwKK307CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpKQogewpAQCAtMTE1Miw2ICsxNDIxLDQ2IEBACiAJCQl9CiAJCX0KIAkJYnJlYWs7CisKKwljYXNlIDB4MTAxOToJCS8vIFRUIFMyLTMyMDAgUENJCisJCS8qCisJCSAqIE5PVEUhIG9uIHNvbWUgU1RCMDg5OSB2ZXJzaW9ucywgdGhlIGludGVybmFsIFBMTCB0YWtlcyBhIGxvbmdlciB0aW1lCisJCSAqIHRvIHNldHRsZSwgYWthIExPQ0suIE9uIHRoZSBvbGRlciByZXZpc2lvbnMgb2YgdGhlIGNoaXAsIHdlIGRvbid0IHNlZQorCQkgKiB0aGlzLCBhcyBhIHJlc3VsdCBvbiB0aGUgbmV3ZXIgY2hpcHMgdGhlIGVudGlyZSBjbG9jayB0cmVlLCB3aWxsIG5vdAorCQkgKiBiZSBzdGFibGUgYWZ0ZXIgYSBmcmVzaGx5IFBPV0VSICdlZCB1cCBzaXR1YXRpb24uCisJCSAqIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIFJFU0VUIHRoZSBTVEIwODk5IChBY3RpdmUgTE9XKSBhbmQgd2FpdCBmb3IKKwkJICogUExMIHN0YWJpbGl6YXRpb24uCisJCSAqCisJCSAqIE9uIHRoZSBUVCBTMiAzMjAwIGFuZCBjbG9uZXMsIHRoZSBTVEIwODk5IGRlbW9kdWxhdG9yJ3MgUkVTRVRCIGlzCisJCSAqIGNvbm5lY3RlZCB0byB0aGUgU0FBNzE0NiBHUElPLCBHUElPMiwgUGluIDE0MgorCQkgKi8KKwkJLyogUmVzZXQgRGVtb2R1bGF0b3IgKi8KKwkJc2FhNzE0Nl9zZXRncGlvKGJ1ZGdldF9jaS0+YnVkZ2V0LmRldiwgMiwgU0FBNzE0Nl9HUElPX09VVExPKTsKKwkJLyogV2FpdCBmb3IgZXZlcnl0aGluZyB0byBkaWUgKi8KKwkJbXNsZWVwKDUwKTsKKwkJLyogUHVsbCBpdCB1cCBvdXQgb2YgUmVzZXQgc3RhdGUgKi8KKwkJc2FhNzE0Nl9zZXRncGlvKGJ1ZGdldF9jaS0+YnVkZ2V0LmRldiwgMiwgU0FBNzE0Nl9HUElPX09VVEhJKTsKKwkJLyogV2FpdCBmb3IgUExMIHRvIHN0YWJpbGl6ZSAqLworCQltc2xlZXAoMjUwKTsKKwkJLyoKKwkJICogUExMIHN0YXRlIHNob3VsZCBiZSBzdGFibGUgbm93LiBJZGVhbGx5LCB3ZSBzaG91bGQgY2hlY2sKKwkJICogZm9yIFBMTCBMT0NLIHN0YXR1cy4gQnV0IHdlbGwsIG5ldmVyIG1pbmQhCisJCSAqLworCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHN0YjA4OTlfYXR0YWNoLCAmdHQzMjAwX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJaWYgKGR2Yl9hdHRhY2goc3RiNjEwMF9hdHRhY2gsIGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgJnR0MzIwMF9zdGI2MTAwX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKSkgeworCQkJCWlmICghZHZiX2F0dGFjaChsbmJwMjFfYXR0YWNoLCBidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQsICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgMCwgMCkpIHsKKwkJCQkJcHJpbnRrKCIlczogTm8gTE5CUDIxIGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZHZiX2Zyb250ZW5kX2RldGFjaChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpOworCQkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKKwkJCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwogCX0KIAogCWlmIChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPT0gTlVMTCkgewpAQCAtMTI0Miw2ICsxNTUxLDcgQEAKIE1BS0VfQlVER0VUX0lORk8odHRidGNpLCAiVFQtQnVkZ2V0LVQtQ0kgUENJIiwgQlVER0VUX1RUKTsKIE1BS0VfQlVER0VUX0lORk8odHRiY2NpLCAiVFQtQnVkZ2V0LUMtQ0kgUENJIiwgQlVER0VUX1RUKTsKIE1BS0VfQlVER0VUX0lORk8odHRjMTUwMSwgIlRULUJ1ZGdldCBDLTE1MDEgUENJIiwgQlVER0VUX1RUKTsKK01BS0VfQlVER0VUX0lORk8odHQzMjAwLCAiVFQtQnVkZ2V0IFMyLTMyMDAgUENJIiwgQlVER0VUX1RUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBjKSwKQEAgLTEyNTEsNiArMTU2MSw3IEBACiAJTUFLRV9FWFRFTlNJT05fUENJKHR0YnRjaSwgMHgxM2MyLCAweDEwMTIpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJzMiwgMHgxM2MyLCAweDEwMTcpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGMxNTAxLCAweDEzYzIsIDB4MTAxYSksCisJTUFLRV9FWFRFTlNJT05fUENJKHR0MzIwMCwgMHgxM2MyLCAweDEwMTkpLAogCXsKIAkgLnZlbmRvciA9IDAsCiAJIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKaW5kZXggODY0MzViZi4uM2FkMGM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKQEAgLTEwMyw2ICsxMDMsNyBAQAogI2RlZmluZSBCVURHRVRfQ0lOMTIwMENfTUszCSAgIDE1CiAjZGVmaW5lIEJVREdFVF9LTkMxQ19NSzMJICAgMTYKICNkZWZpbmUgQlVER0VUX0tOQzFDUF9NSzMJICAgMTcKKyNkZWZpbmUgQlVER0VUX0tOQzFTMiAgICAgICAgICAgICAgMTgKIAogI2RlZmluZSBCVURHRVRfVklERU9fUE9SVEEgICAgICAgICAwCiAjZGVmaW5lIEJVREdFVF9WSURFT19QT1JUQiAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vZHNicjEwMC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKaW5kZXggYTVjYTE3Ni4uNTQ3NGEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKQEAgLTEsNSArMSw1IEBACi0vKiBBIGRyaXZlciBmb3IgdGhlIEQtTGluayBEU0ItUjEwMCBVU0IgcmFkaW8uICBUaGUgUjEwMCBwbHVncwotIGludG8gYm90aCB0aGUgVVNCIGFuZCBhbiBhbmFsb2cgYXVkaW8gaW5wdXQsIHNvIHRoaXMgdGhpbmcKKy8qIEEgZHJpdmVyIGZvciB0aGUgRC1MaW5rIERTQi1SMTAwIFVTQiByYWRpbyBhbmQgR2VtdGVrIFVTQiBSYWRpbyAyMS4KKyBUaGUgZGV2aWNlIHBsdWdzIGludG8gYm90aCB0aGUgVVNCIGFuZCBhbiBhbmFsb2cgYXVkaW8gaW5wdXQsIHNvIHRoaXMgdGhpbmcKICBvbmx5IGRlYWxzIHdpdGggaW5pdGlhbGlzYXRpb24gYW5kIGZyZXF1ZW5jeSBzZXR0aW5nLCB0aGUKICBhdWRpbyBkYXRhIGhhcyB0byBiZSBoYW5kbGVkIGJ5IGEgc291bmQgZHJpdmVyLgogCkBAIC0zMyw2ICszMywxMCBAQAogCiAgSGlzdG9yeToKIAorIFZlcnNpb24gMC40NDoKKwlBZGQgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25zLCBmaXggdW5wbHVnIG9mIGRldmljZSwKKwlhIGxvdCBvZiBjbGVhbnVwcyBhbmQgZml4ZXMgYnkgQWxleGV5IEtsaW1vdiA8a2xpbW92LmxpbnV4QGdtYWlsLmNvbT4KKwogIFZlcnNpb24gMC40MzoKIAlPbGl2ZXIgTmV1a3VtOiBhdm9pZGVkIERNQSBjb2hlcmVuY3kgaXNzdWUKIApAQCAtOTMsOCArOTcsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgkvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8JKi8KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNDEiCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCw0LDEpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC40NCIKKyNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCA0LCA0KQogCiBzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHJhZGlvX3FjdHJsW10gPSB7CiAJewpAQCAtMTA0LDcgKzEwOCwyNyBAQAogCQkubWF4aW11bSAgICAgICA9IDEsCiAJCS5kZWZhdWx0X3ZhbHVlID0gMSwKIAkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCX0KKwl9LAorLyogSElOVDogdGhlIGRpc2FibGVkIGNvbnRyb2xzIGFyZSBvbmx5IGhlcmUgdG8gc2F0aWZ5IGtyYWRpbyBhbmQgc3VjaCBhcHBzICovCisJeyAgICAgICAuaWQgICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCisJCS5mbGFncyAgICAgICAgICA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAorCX0sCisJeworCQkuaWQgICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAorCQkuZmxhZ3MgICAgICAgICAgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKKwl9LAorCXsKKwkJLmlkICAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFTUywKKwkJLmZsYWdzICAgICAgICAgID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZCAgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1RSRUJMRSwKKwkJLmZsYWdzICAgICAgICAgID0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZCAgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0xPVURORVNTLAorCQkuZmxhZ3MgICAgICAgICAgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKKwl9LAogfTsKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrdXMgRGVtbGVpdG5lciA8bXNkZW1sZWlAdHVjYW5hLmhhcnZhcmQuZWR1PiIKQEAgLTEyNSwxMiArMTQ5LDE2IEBACiAjZGVmaW5lIEZSRVFfTUFYIDEwOC4wCiAjZGVmaW5lIEZSRVFfTVVMIDE2MDAwCiAKKyNkZWZpbmUgdmlkZW9kZXZfdG9fcmFkaW8oZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBkc2JyMTAwX2RldmljZSwgdmlkZW9kZXYpCiAKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgdm9pZCB1c2JfZHNicjEwMF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IHVzYl9kc2JyMTAwX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJCXBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwpAQCAtMTM4LDggKzE2Niw5IEBACiAvKiBEYXRhIGZvciBvbmUgKHBoeXNpY2FsKSBkZXZpY2UgKi8KIHN0cnVjdCBkc2JyMTAwX2RldmljZSB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpZGVvZGV2OwogCXU4ICp0cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IG11dGV4IGxvY2s7CS8qIGJ1ZmZlciBsb2NraW5nICovCiAJaW50IGN1cmZyZXE7CiAJaW50IHN0ZXJlbzsKIAlpbnQgdXNlcnM7CkBAIC0xNDcsNyArMTc2LDYgQEAKIAlpbnQgbXV0ZWQ7CiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfZHNicjEwMF9kZXZpY2VfdGFibGUgW10gPSB7CiAJeyBVU0JfREVWSUNFKERTQjEwMF9WRU5ET1IsIERTQjEwMF9QUk9EVUNUKSB9LAogCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCkBAIC0xNTcsMTAgKzE4NSwxNCBAQAogCiAvKiBVU0Igc3Vic3lzdGVtIGludGVyZmFjZSAqLwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl9kc2JyMTAwX2RyaXZlciA9IHsKLQkubmFtZSA9CQkiZHNicjEwMCIsCi0JLnByb2JlID0JdXNiX2RzYnIxMDBfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPQl1c2JfZHNicjEwMF9kaXNjb25uZWN0LAotCS5pZF90YWJsZSA9CXVzYl9kc2JyMTAwX2RldmljZV90YWJsZSwKKwkubmFtZQkJCT0gImRzYnIxMDAiLAorCS5wcm9iZQkJCT0gdXNiX2RzYnIxMDBfcHJvYmUsCisJLmRpc2Nvbm5lY3QJCT0gdXNiX2RzYnIxMDBfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJCT0gdXNiX2RzYnIxMDBfZGV2aWNlX3RhYmxlLAorCS5zdXNwZW5kCQk9IHVzYl9kc2JyMTAwX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gdXNiX2RzYnIxMDBfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUJCT0gdXNiX2RzYnIxMDBfcmVzdW1lLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZAk9IDAsCiB9OwogCiAvKiBMb3ctbGV2ZWwgZGV2aWNlIGludGVyZmFjZSBiZWdpbnMgaGVyZSAqLwpAQCAtMTY4LDk1ICsyMDAsMTkwIEBACiAvKiBzd2l0Y2ggb24gcmFkaW8gKi8KIHN0YXRpYyBpbnQgZHNicjEwMF9zdGFydChzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvKQogewotCWlmICh1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAotCQkJVVNCX1JFUV9HRVRfU1RBVFVTLAotCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCi0JCQkweDAwLCAweEM3LCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApIDwgMCB8fAotCXVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCi0JCQlEU0IxMDBfT05PRkYsCi0JCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKLQkJCTB4MDEsIDB4MDAsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmFkaW8tPm11dGVkPTA7Ci0JcmV0dXJuIChyYWRpby0+dHJhbnNmZXJfYnVmZmVyKVswXTsKLX0KKwlpbnQgcmV0dmFsOworCWludCByZXF1ZXN0OwogCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJVVNCX1JFUV9HRVRfU1RBVFVTLAorCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJMHgwMCwgMHhDNywgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJlcXVlc3QgPSBVU0JfUkVRX0dFVF9TVEFUVVM7CisJCWdvdG8gdXNiX2NvbnRyb2xfbXNnX2ZhaWxlZDsKKwl9CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwKKwkJdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQlEU0IxMDBfT05PRkYsCisJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkweDAxLCAweDAwLCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJcmVxdWVzdCA9IERTQjEwMF9PTk9GRjsKKwkJZ290byB1c2JfY29udHJvbF9tc2dfZmFpbGVkOworCX0KKworCXJhZGlvLT5tdXRlZCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisJcmV0dXJuIChyYWRpby0+dHJhbnNmZXJfYnVmZmVyKVswXTsKKwordXNiX2NvbnRyb2xfbXNnX2ZhaWxlZDoKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwlkZXZfZXJyKCZyYWRpby0+dXNiZGV2LT5kZXYsCisJCSIlcyAtIHVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlaSwgcmVxdWVzdCAlaVxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwsIHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7CisKK30KIAogLyogc3dpdGNoIG9mZiByYWRpbyAqLwogc3RhdGljIGludCBkc2JyMTAwX3N0b3Aoc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbykKIHsKLQlpZiAodXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKLQkJCVVTQl9SRVFfR0VUX1NUQVRVUywKLQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAotCQkJMHgxNiwgMHgxQywgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKSA8IDAgfHwKLQl1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAotCQkJRFNCMTAwX09OT0ZGLAotCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCi0JCQkweDAwLCAweDAwLCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJhZGlvLT5tdXRlZD0xOworCWludCByZXR2YWw7CisJaW50IHJlcXVlc3Q7CisKKwltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwKKwkJdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQlVU0JfUkVRX0dFVF9TVEFUVVMsCisJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkweDE2LCAweDFDLCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJcmVxdWVzdCA9IFVTQl9SRVFfR0VUX1NUQVRVUzsKKwkJZ290byB1c2JfY29udHJvbF9tc2dfZmFpbGVkOworCX0KKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LAorCQl1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCURTQjEwMF9PTk9GRiwKKwkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCisJCTB4MDAsIDB4MDAsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCk7CisKKwlpZiAocmV0dmFsIDwgMCkgeworCQlyZXF1ZXN0ID0gRFNCMTAwX09OT0ZGOworCQlnb3RvIHVzYl9jb250cm9sX21zZ19mYWlsZWQ7CisJfQorCisJcmFkaW8tPm11dGVkID0gMTsKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKIAlyZXR1cm4gKHJhZGlvLT50cmFuc2Zlcl9idWZmZXIpWzBdOworCit1c2JfY29udHJvbF9tc2dfZmFpbGVkOgorCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworCWRldl9lcnIoJnJhZGlvLT51c2JkZXYtPmRldiwKKwkJIiVzIC0gdXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVpLCByZXF1ZXN0ICVpXG4iLAorCQkJX19mdW5jX18sIHJldHZhbCwgcmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKKwogfQogCiAvKiBzZXQgYSBmcmVxdWVuY3ksIGZyZXEgaXMgZGVmaW5lZCBieSB2NGwncyBUVU5FUl9MT1csIGkuZS4gMS8xNnRoIGtIeiAqLwogc3RhdGljIGludCBkc2JyMTAwX3NldGZyZXEoc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbywgaW50IGZyZXEpCiB7CisJaW50IHJldHZhbDsKKwlpbnQgcmVxdWVzdDsKKwogCWZyZXEgPSAoZnJlcSAvIDE2ICogODApIC8gMTAwMCArIDg1NjsKLQlpZiAodXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKLQkJCURTQjEwMF9UVU5FLAotCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCi0JCQkoZnJlcSA+PiA4KSAmIDB4MDBmZiwgZnJlcSAmIDB4ZmYsCi0JCQlyYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApIDwgMCB8fAotCSAgIHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCi0JCQlVU0JfUkVRX0dFVF9TVEFUVVMsCi0JCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKLQkJCTB4OTYsIDB4QjcsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCkgPCAwIHx8Ci0JdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKLQkJCVVTQl9SRVFfR0VUX1NUQVRVUywKLQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCAgVVNCX0RJUl9JTiwKLQkJCTB4MDAsIDB4MjQsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCkgPCAwKSB7Ci0JCXJhZGlvLT5zdGVyZW8gPSAtMTsKLQkJcmV0dXJuIC0xOworCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LAorCQl1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCURTQjEwMF9UVU5FLAorCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJKGZyZXEgPj4gOCkgJiAweDAwZmYsIGZyZXEgJiAweGZmLAorCQlyYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJcmVxdWVzdCA9IERTQjEwMF9UVU5FOworCQlnb3RvIHVzYl9jb250cm9sX21zZ19mYWlsZWQ7CiAJfQorCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsCisJCXVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJVVNCX1JFUV9HRVRfU1RBVFVTLAorCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJMHg5NiwgMHhCNywgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJlcXVlc3QgPSBVU0JfUkVRX0dFVF9TVEFUVVM7CisJCWdvdG8gdXNiX2NvbnRyb2xfbXNnX2ZhaWxlZDsKKwl9CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwKKwkJdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQlVU0JfUkVRX0dFVF9TVEFUVVMsCisJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCAgVVNCX0RJUl9JTiwKKwkJMHgwMCwgMHgyNCwgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJlcXVlc3QgPSBVU0JfUkVRX0dFVF9TVEFUVVM7CisJCWdvdG8gdXNiX2NvbnRyb2xfbXNnX2ZhaWxlZDsKKwl9CisKIAlyYWRpby0+c3RlcmVvID0gISgocmFkaW8tPnRyYW5zZmVyX2J1ZmZlcilbMF0gJiAweDAxKTsKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKIAlyZXR1cm4gKHJhZGlvLT50cmFuc2Zlcl9idWZmZXIpWzBdOworCit1c2JfY29udHJvbF9tc2dfZmFpbGVkOgorCXJhZGlvLT5zdGVyZW8gPSAtMTsKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwlkZXZfZXJyKCZyYWRpby0+dXNiZGV2LT5kZXYsCisJCSIlcyAtIHVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlaSwgcmVxdWVzdCAlaVxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwsIHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIHJldHVybiB0aGUgZGV2aWNlIHN0YXR1cy4gIFRoaXMgaXMsIGluIGVmZmVjdCwganVzdCB3aGV0aGVyIGl0CiBzZWVzIGEgc3RlcmVvIHNpZ25hbCBvciBub3QuICBQaXR5LiAqLwogc3RhdGljIHZvaWQgZHNicjEwMF9nZXRzdGF0KHN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8pCiB7Ci0JaWYgKHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJaW50IHJldHZhbDsKKworCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LAorCQl1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCiAJCVVTQl9SRVFfR0VUX1NUQVRVUywKIAkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCi0JCTB4MDAgLCAweDI0LCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApIDwgMCkKLQkJcmFkaW8tPnN0ZXJlbyA9IC0xOwotCWVsc2UKLQkJcmFkaW8tPnN0ZXJlbyA9ICEocmFkaW8tPnRyYW5zZmVyX2J1ZmZlclswXSAmIDB4MDEpOwotfQorCQkweDAwICwgMHgyNCwgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTsKIAorCWlmIChyZXR2YWwgPCAwKSB7CisJCXJhZGlvLT5zdGVyZW8gPSAtMTsKKwkJZGV2X2VycigmcmFkaW8tPnVzYmRldi0+ZGV2LAorCQkJIiVzIC0gdXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVpLCByZXF1ZXN0ICVpXG4iLAorCQkJCV9fZnVuY19fLCByZXR2YWwsIFVTQl9SRVFfR0VUX1NUQVRVUyk7CisJfSBlbHNlIHsKKwkJcmFkaW8tPnN0ZXJlbyA9ICEocmFkaW8tPnRyYW5zZmVyX2J1ZmZlclswXSAmIDB4MDEpOworCX0KKworCW11dGV4X3VubG9jaygmcmFkaW8tPmxvY2spOworfQogCiAvKiBVU0Igc3Vic3lzdGVtIGludGVyZmFjZSBiZWdpbnMgaGVyZSAqLwogCi0vKiBoYW5kbGUgdW5wbHVnZ2luZyBvZiB0aGUgZGV2aWNlLCByZWxlYXNlIGRhdGEgc3RydWN0dXJlcwotaWYgbm90aGluZyBrZWVwcyB1cyBmcm9tIGRvaW5nIGl0LiAgSWYgc29tZXRoaW5nIGlzIHN0aWxsCi1rZWVwaW5nIHVzIGJ1c3ksIHRoZSByZWxlYXNlIGNhbGxiYWNrIG9mIHY0bCB3aWxsIHRha2UgY2FyZQotb2YgcmVsZWFzaW5nIGl0LiAqLworLyoKKyAqIEhhbmRsZSB1bnBsdWdnaW5nIG9mIHRoZSBkZXZpY2UuCisgKiBXZSBjYWxsIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlIGluIGFueSBjYXNlLgorICogVGhlIGxhc3QgZnVuY3Rpb24gY2FsbGVkIGluIHRoaXMgcHJvY2VkdXJlIGlzCisgKiB1c2JfZHNicjEwMF92aWRlb19kZXZpY2VfcmVsZWFzZQorICovCiBzdGF0aWMgdm9pZCB1c2JfZHNicjEwMF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7Ci0JaWYgKHJhZGlvKSB7Ci0JCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2Rldik7Ci0JCXJhZGlvLT52aWRlb2RldiA9IE5VTEw7Ci0JCWlmIChyYWRpby0+dXNlcnMpIHsKLQkJCWtmcmVlKHJhZGlvLT50cmFuc2Zlcl9idWZmZXIpOwotCQkJa2ZyZWUocmFkaW8pOwotCQl9IGVsc2UgewotCQkJcmFkaW8tPnJlbW92ZWQgPSAxOwotCQl9Ci0JfQorCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCXJhZGlvLT5yZW1vdmVkID0gMTsKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZyYWRpby0+dmlkZW9kZXYpOwogfQogCiAKQEAgLTI3Niw2ICs0MDMsMTAgQEAKIHsKIAlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlpZiAodi0+aW5kZXggPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjk3LDYgKzQyOCwxMiBAQAogc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlpZiAodi0+aW5kZXggPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzA3LDkgKzQ0NCwxNSBAQAogCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlpbnQgcmV0dmFsOworCisJLyogc2FmZXR5IGNoZWNrICovCisJaWYgKHJhZGlvLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVJTzsKIAogCXJhZGlvLT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OwotCWlmIChkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKSA9PSAtMSkKKwlyZXR2YWwgPSBkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKTsKKwlpZiAocmV0dmFsIDwgMCkKIAkJZGV2X3dhcm4oJnJhZGlvLT51c2JkZXYtPmRldiwgIlNldCBmcmVxdWVuY3kgZmFpbGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMxOSw2ICs0NjIsMTAgQEAKIHsKIAlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAlmLT5mcmVxdWVuY3kgPSByYWRpby0+Y3VyZnJlcTsKIAlyZXR1cm4gMDsKQEAgLTM0Myw2ICs0OTAsMTAgQEAKIHsKIAlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgogCQljdHJsLT52YWx1ZSA9IHJhZGlvLT5tdXRlZDsKQEAgLTM1NSwxNyArNTA2LDI0IEBACiAJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlpbnQgcmV0dmFsOworCisJLyogc2FmZXR5IGNoZWNrICovCisJaWYgKHJhZGlvLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVJTzsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CiAJCWlmIChjdHJsLT52YWx1ZSkgewotCQkJaWYgKGRzYnIxMDBfc3RvcChyYWRpbykgPT0gLTEpIHsKKwkJCXJldHZhbCA9IGRzYnIxMDBfc3RvcChyYWRpbyk7CisJCQlpZiAocmV0dmFsIDwgMCkgewogCQkJCWRldl93YXJuKCZyYWRpby0+dXNiZGV2LT5kZXYsCiAJCQkJCSAiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5XG4iKTsKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKGRzYnIxMDBfc3RhcnQocmFkaW8pID09IC0xKSB7CisJCQlyZXR2YWwgPSBkc2JyMTAwX3N0YXJ0KHJhZGlvKTsKKwkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJZGV2X3dhcm4oJnJhZGlvLT51c2JkZXYtPmRldiwKIAkJCQkJICJSYWRpbyBkaWQgbm90IHJlc3BvbmQgcHJvcGVybHlcbiIpOwogCQkJCXJldHVybiAtRUJVU1k7CkBAIC00MTcsNyArNTc1LDggQEAKIAlyYWRpby0+dXNlcnMgPSAxOwogCXJhZGlvLT5tdXRlZCA9IDE7CiAKLQlpZiAoZHNicjEwMF9zdGFydChyYWRpbykgPCAwKSB7CisJcmV0dmFsID0gZHNicjEwMF9zdGFydChyYWRpbyk7CisJaWYgKHJldHZhbCA8IDApIHsKIAkJZGV2X3dhcm4oJnJhZGlvLT51c2JkZXYtPmRldiwKIAkJCSAiUmFkaW8gZGlkIG5vdCBzdGFydCB1cCBwcm9wZXJseVxuIik7CiAJCXJhZGlvLT51c2VycyA9IDA7CkBAIC00MjYsOSArNTg1LDkgQEAKIAl9CiAKIAlyZXR2YWwgPSBkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKTsKLQotCWlmIChyZXR2YWwgPT0gLTEpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUgIjogU2V0IGZyZXF1ZW5jeSBmYWlsZWRcbiIpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfd2FybigmcmFkaW8tPnVzYmRldi0+ZGV2LAorCQkJInNldCBmcmVxdWVuY3kgZmFpbGVkXG4iKTsKIAogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKQEAgLTQzNywxNyArNTk2LDYyIEBACiBzdGF0aWMgaW50IHVzYl9kc2JyMTAwX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWludCByZXR2YWw7CiAKIAlpZiAoIXJhZGlvKQogCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJhZGlvLT51c2VycyA9IDA7Ci0JaWYgKHJhZGlvLT5yZW1vdmVkKSB7Ci0JCWtmcmVlKHJhZGlvLT50cmFuc2Zlcl9idWZmZXIpOwotCQlrZnJlZShyYWRpbyk7CisJaWYgKCFyYWRpby0+cmVtb3ZlZCkgeworCQlyZXR2YWwgPSBkc2JyMTAwX3N0b3AocmFkaW8pOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZGV2X3dhcm4oJnJhZGlvLT51c2JkZXYtPmRldiwKKwkJCQkiZHNicjEwMF9zdG9wIGZhaWxlZFxuIik7CisJCX0KKwogCX0KIAlyZXR1cm4gMDsKIH0KIAorLyogU3VzcGVuZCBkZXZpY2UgLSBzdG9wIGRldmljZS4gKi8KK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGRzYnIxMDBfc3RvcChyYWRpbyk7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJkc2JyMTAwX3N0b3AgZmFpbGVkXG4iKTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJnb2luZyBpbnRvIHN1c3BlbmQuLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdW1lIGRldmljZSAtIHN0YXJ0IGRldmljZS4gKi8KK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBkc2JyMTAwX3N0YXJ0KHJhZGlvKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgImRzYnIxMDBfc3RhcnQgZmFpbGVkXG4iKTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJjb21pbmcgb3V0IG9mIHN1c3BlbmQuLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyB2b2lkIHVzYl9kc2JyMTAwX3ZpZGVvX2RldmljZV9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvZGV2KQoreworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb2Rldl90b19yYWRpbyh2aWRlb2Rldik7CisKKwlrZnJlZShyYWRpby0+dHJhbnNmZXJfYnVmZmVyKTsKKwlrZnJlZShyYWRpbyk7Cit9CisKIC8qIEZpbGUgc3lzdGVtIGludGVyZmFjZSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX2RzYnIxMDBfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC00NzYsMTkgKzY4MCwxOSBAQAogfTsKIAogLyogVjRMMiBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGUgPSB7CitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBkc2JyMTAwX3ZpZGVvZGV2X2RhdGEgPSB7CiAJLm5hbWUJCT0gIkQtTGluayBEU0ItUiAxMDAiLAogCS5mb3BzCQk9ICZ1c2JfZHNicjEwMF9mb3BzLAogCS5pb2N0bF9vcHMgCT0gJnVzYl9kc2JyMTAwX2lvY3RsX29wcywKLQkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5yZWxlYXNlCT0gdXNiX2RzYnIxMDBfdmlkZW9fZGV2aWNlX3JlbGVhc2UsCiB9OwogCi0vKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQgYW5kIHJlZ2lzdGVyIHdpdGggdjRsIGFuZAotdXNiIGlmIGl0IGlzICovCisvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQgYW5kIHJlZ2lzdGVyIHdpdGggdjRsIGFuZCB1c2IgaWYgaXQgaXMgKi8KIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW87CisJaW50IHJldHZhbDsKIAogCXJhZGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzYnIxMDBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTUwMSwyMyArNzA1LDE4IEBACiAJCWtmcmVlKHJhZGlvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXJhZGlvLT52aWRlb2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCi0JaWYgKCEocmFkaW8tPnZpZGVvZGV2KSkgewotCQlrZnJlZShyYWRpby0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJa2ZyZWUocmFkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtY3B5KHJhZGlvLT52aWRlb2RldiwgJmRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGUsCi0JCXNpemVvZihkc2JyMTAwX3ZpZGVvZGV2X3RlbXBsYXRlKSk7CisJbXV0ZXhfaW5pdCgmcmFkaW8tPmxvY2spOworCXJhZGlvLT52aWRlb2RldiA9IGRzYnIxMDBfdmlkZW9kZXZfZGF0YTsKKwogCXJhZGlvLT5yZW1vdmVkID0gMDsKIAlyYWRpby0+dXNlcnMgPSAwOwogCXJhZGlvLT51c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXJhZGlvLT5jdXJmcmVxID0gRlJFUV9NSU4gKiBGUkVRX01VTDsKLQl2aWRlb19zZXRfZHJ2ZGF0YShyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2RldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA8IDApIHsKLQkJZGV2X3dhcm4oJmludGYtPmRldiwgIkNvdWxkIG5vdCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOwotCQl2aWRlb19kZXZpY2VfcmVsZWFzZShyYWRpby0+dmlkZW9kZXYpOworCXZpZGVvX3NldF9kcnZkYXRhKCZyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKKwlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnJhZGlvLT52aWRlb2RldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOwogCQlrZnJlZShyYWRpby0+dHJhbnNmZXJfYnVmZmVyKTsKIAkJa2ZyZWUocmFkaW8pOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKaW5kZXggOTMwNWU5NS4uZGQ2ZDNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKQEAgLTEsNyArMSw3IEBACiAvKiByYWRpb3RyYWNrIChyYWRpb3JldmVhbCkgZHJpdmVyIGZvciBMaW51eCByYWRpbyBzdXBwb3J0CiAgKiAoYykgMTk5NyBNLiBLaXJrd29vZAogICogQ29udmVydGVkIHRvIFY0TDIgQVBJIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICogQ29udmVydGVkIHRvIG5ldyBBUEkgYnkgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqIENvbnZlcnRlZCB0byBuZXcgQVBJIGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KICAqCiAgKiBIaXN0b3J5OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IDA0OTBhMWYuLmJmZDM3ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIDIwMDItMDEtMTcJQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KICAqCQlVcGRhdGVkIHRvIGxhdGVzdCBwbnAgY29kZQogICoKLSAqIDIwMDMtMDEtMzEJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIDIwMDMtMDEtMzEJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQlDbGVhbmVkIHVwIGxvY2tpbmcsIGRlbGF5IGNvZGUsIGdlbmVyYWwgb2RkcyBhbmQgZW5kcwogICoKICAqIDIwMDYtMDctMzAJSGFucyBKLiBLb2NoIDxrb2NoQGhqay1hei5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCmluZGV4IGQxMzFhNWQuLmUxMzExOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwpAQCAtOCw3ICs4LDcgQEAKICAqICAgIFJhZGlvVHJhY2sgSUkgZHJpdmVyIGZvciBMaW51eCByYWRpbyBzdXBwb3J0IChDKSAxOTk4IEJlbiBQZmFmZgogICoKICAqICAgIEJhc2VkIG9uIFJhZGlvVHJhY2sgSS9SYWRpb1JldmVhbCAoQykgMTk5NyBNLiBLaXJrd29vZAotICogICAgQ29udmVydGVkIHRvIG5ldyBBUEkgYnkgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqICAgIENvbnZlcnRlZCB0byBuZXcgQVBJIGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiAgICBWYXJpb3VzIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYnkgUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4KICAqCiAgKiBUT0RPOiBBbGxvdyBmb3IgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBmb29saXNoIGVudGl0aWVzIDotKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCmluZGV4IDI1NmNiZWYuLmU3MzBlZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbXI4MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKQEAgLTcyLDYgKzcyLDExIEBACiAjZGVmaW5lIFVTQl9BTVJBRElPX1ZFTkRPUiAweDA3Y2EKICNkZWZpbmUgVVNCX0FNUkFESU9fUFJPRFVDVCAweGI4MDAKIAorLyogZGV2X3dhcm4gbWFjcm8gd2l0aCBkcml2ZXIgbmFtZSAqLworI2RlZmluZSBNUjgwMF9EUklWRVJfTkFNRSAicmFkaW8tbXI4MDAiCisjZGVmaW5lIGFtcmFkaW9fZGV2X3dhcm4oZGV2LCBmbXQsIGFyZy4uLikJCQkJXAorCQlkZXZfd2FybihkZXYsIE1SODAwX0RSSVZFUl9OQU1FICIgLSAiIGZtdCwgIyNhcmcpCisKIC8qIFByb2JhYmx5IFVTQl9USU1FT1VUIHNob3VsZCBiZSBtb2RpZmllZCBpbiBtb2R1bGUgcGFyYW1ldGVyICovCiAjZGVmaW5lIEJVRkZFUl9MRU5HVEggOAogI2RlZmluZSBVU0JfVElNRU9VVCA1MDAKQEAgLTE1NCwxNCArMTU5LDE0IEBACiAKIC8qIFVTQiBzdWJzeXN0ZW0gaW50ZXJmYWNlICovCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FtcmFkaW9fZHJpdmVyID0gewotCS5uYW1lCQkJPSAicmFkaW8tbXI4MDAiLAorCS5uYW1lCQkJPSBNUjgwMF9EUklWRVJfTkFNRSwKIAkucHJvYmUJCQk9IHVzYl9hbXJhZGlvX3Byb2JlLAogCS5kaXNjb25uZWN0CQk9IHVzYl9hbXJhZGlvX2Rpc2Nvbm5lY3QsCiAJLnN1c3BlbmQJCT0gdXNiX2FtcmFkaW9fc3VzcGVuZCwKIAkucmVzdW1lCQkJPSB1c2JfYW1yYWRpb19yZXN1bWUsCiAJLnJlc2V0X3Jlc3VtZQkJPSB1c2JfYW1yYWRpb19yZXN1bWUsCiAJLmlkX3RhYmxlCQk9IHVzYl9hbXJhZGlvX2RldmljZV90YWJsZSwKLQkuc3VwcG9ydHNfYXV0b3N1c3BlbmQJPSAxLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZAk9IDAsCiB9OwogCiAvKiBzd2l0Y2ggb24gcmFkaW8uIFNlbmQgOCBieXRlcyB0byBkZXZpY2UuICovCkBAIC0yMDIsNiArMjA3LDEwIEBACiAJaW50IHJldHZhbDsKIAlpbnQgc2l6ZTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7CiAKIAlyYWRpby0+YnVmZmVyWzBdID0gMHgwMDsKQEAgLTIzNSw2ICsyNDQsMTAgQEAKIAlpbnQgc2l6ZTsKIAl1bnNpZ25lZCBzaG9ydCBmcmVxX3NlbmQgPSAweDEzICsgKGZyZXEgPj4gMykgLyAyNTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7CiAKIAlyYWRpby0+YnVmZmVyWzBdID0gMHgwMDsKQEAgLTI4OCwxOCArMzAxLDEyIEBACiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCW11dGV4X2xvY2soJnJhZGlvLT5sb2NrKTsKKwlyYWRpby0+cmVtb3ZlZCA9IDE7CisJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CiAKLQlpZiAocmFkaW8pIHsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocmFkaW8tPnZpZGVvZGV2KTsKLQkJcmFkaW8tPnZpZGVvZGV2ID0gTlVMTDsKLQkJaWYgKHJhZGlvLT51c2VycykgewotCQkJa2ZyZWUocmFkaW8tPmJ1ZmZlcik7Ci0JCQlrZnJlZShyYWRpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlyYWRpby0+cmVtb3ZlZCA9IDE7Ci0JCX0KLQl9CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShyYWRpby0+dmlkZW9kZXYpOwogfQogCiAvKiB2aWRpb2NfcXVlcnljYXAgLSBxdWVyeSBkZXZpY2UgY2FwYWJpbGl0aWVzICovCkBAIC0zMjAsNiArMzI3LDEwIEBACiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwogCisJLyogc2FmZXR5IGNoZWNrICovCisJaWYgKHJhZGlvLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVJTzsKKwogCWlmICh2LT5pbmRleCA+IDApCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNDYsNiArMzU3LDEyIEBACiBzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogeworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKworCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlpZiAodi0+aW5kZXggPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKQEAgLTM1Nyw5ICszNzQsMTQgQEAKIHsKIAlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CiAKKwkvKiBzYWZldHkgY2hlY2sgKi8KKwlpZiAocmFkaW8tPnJlbW92ZWQpCisJCXJldHVybiAtRUlPOworCiAJcmFkaW8tPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJaWYgKGFtcmFkaW9fc2V0ZnJlcShyYWRpbywgcmFkaW8tPmN1cmZyZXEpIDwgMCkKLQkJd2FybigiU2V0IGZyZXF1ZW5jeSBmYWlsZWQiKTsKKwkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCisJCQkic2V0IGZyZXF1ZW5jeSBmYWlsZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjksNiArMzkxLDEwIEBACiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwogCisJLyogc2FmZXR5IGNoZWNrICovCisJaWYgKHJhZGlvLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVJTzsKKwogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwogCWYtPmZyZXF1ZW5jeSA9IHJhZGlvLT5jdXJmcmVxOwogCXJldHVybiAwOwpAQCAtMzgyLDggKzQwOCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgewogCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCXNpemVvZigqcWMpKTsKKwkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksIHNpemVvZigqcWMpKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMzk2LDYgKzQyMSwxMCBAQAogewogCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKIAorCS8qIHNhZmV0eSBjaGVjayAqLworCWlmIChyYWRpby0+cmVtb3ZlZCkKKwkJcmV0dXJuIC1FSU87CisKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgogCQljdHJsLT52YWx1ZSA9IHJhZGlvLT5tdXRlZDsKQEAgLTQxMCwxNiArNDM5LDIyIEBACiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwogCisJLyogc2FmZXR5IGNoZWNrICovCisJaWYgKHJhZGlvLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVJTzsKKwogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CiAJCWlmIChjdHJsLT52YWx1ZSkgewogCQkJaWYgKGFtcmFkaW9fc3RvcChyYWRpbykgPCAwKSB7Ci0JCQkJd2FybigiYW1yYWRpb19zdG9wKCkgZmFpbGVkIik7CisJCQkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCisJCQkJCSJhbXJhZGlvX3N0b3AgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoYW1yYWRpb19zdGFydChyYWRpbykgPCAwKSB7Ci0JCQkJd2FybigiYW1yYWRpb19zdGFydCgpIGZhaWxlZCIpOworCQkJCWFtcmFkaW9fZGV2X3dhcm4oJnJhZGlvLT52aWRlb2Rldi0+ZGV2LAorCQkJCQkiYW1yYWRpb19zdGFydCBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQpAQCAtNDc1LDMwICs1MTAsMzggQEAKIAlyYWRpby0+bXV0ZWQgPSAxOwogCiAJaWYgKGFtcmFkaW9fc3RhcnQocmFkaW8pIDwgMCkgewotCQl3YXJuKCJSYWRpbyBkaWQgbm90IHN0YXJ0IHVwIHByb3Blcmx5Iik7CisJCWFtcmFkaW9fZGV2X3dhcm4oJnJhZGlvLT52aWRlb2Rldi0+ZGV2LAorCQkJInJhZGlvIGRpZCBub3Qgc3RhcnQgdXAgcHJvcGVybHlcbiIpOwogCQlyYWRpby0+dXNlcnMgPSAwOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoYW1yYWRpb19zZXRmcmVxKHJhZGlvLCByYWRpby0+Y3VyZnJlcSkgPCAwKQotCQl3YXJuKCJTZXQgZnJlcXVlbmN5IGZhaWxlZCIpOworCQlhbXJhZGlvX2Rldl93YXJuKCZyYWRpby0+dmlkZW9kZXYtPmRldiwKKwkJCSJzZXQgZnJlcXVlbmN5IGZhaWxlZFxuIik7CiAKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qY2xvc2UgZGV2aWNlIC0gZnJlZSBkcml2ZXIgc3RydWN0dXJlcyAqLworLypjbG9zZSBkZXZpY2UgKi8KIHN0YXRpYyBpbnQgdXNiX2FtcmFkaW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCWludCByZXR2YWw7CiAKIAlpZiAoIXJhZGlvKQogCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJhZGlvLT51c2VycyA9IDA7Ci0JaWYgKHJhZGlvLT5yZW1vdmVkKSB7Ci0JCWtmcmVlKHJhZGlvLT5idWZmZXIpOwotCQlrZnJlZShyYWRpbyk7CisKKwlpZiAoIXJhZGlvLT5yZW1vdmVkKSB7CisJCXJldHZhbCA9IGFtcmFkaW9fc3RvcChyYWRpbyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJYW1yYWRpb19kZXZfd2FybigmcmFkaW8tPnZpZGVvZGV2LT5kZXYsCisJCQkJImFtcmFkaW9fc3RvcCBmYWlsZWRcbiIpOwogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC01MDgsOSArNTUxLDkgQEAKIAlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCWlmIChhbXJhZGlvX3N0b3AocmFkaW8pIDwgMCkKLQkJd2FybigiYW1yYWRpb19zdG9wKCkgZmFpbGVkIik7CisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJhbXJhZGlvX3N0b3AgZmFpbGVkXG4iKTsKIAotCWluZm8oInJhZGlvLW1yODAwOiBHb2luZyBpbnRvIHN1c3BlbmQuLiIpOworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJnb2luZyBpbnRvIHN1c3BlbmQuLlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUyMSw5ICs1NjQsOSBAQAogCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJaWYgKGFtcmFkaW9fc3RhcnQocmFkaW8pIDwgMCkKLQkJd2FybigiYW1yYWRpb19zdGFydCgpIGZhaWxlZCIpOworCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiYW1yYWRpb19zdGFydCBmYWlsZWRcbiIpOwogCi0JaW5mbygicmFkaW8tbXI4MDA6IENvbWluZyBvdXQgb2Ygc3VzcGVuZC4uIik7CisJZGV2X2luZm8oJmludGYtPmRldiwgImNvbWluZyBvdXQgb2Ygc3VzcGVuZC4uXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTU1LDEyICs1OTgsMjQgQEAKIAkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCiB9OwogCitzdGF0aWMgdm9pZCB1c2JfYW1yYWRpb19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb2RldikKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9kZXYpOworCisJLyogd2UgY2FsbCB2NGwgdG8gZnJlZSByYWRpby0+dmlkZW9kZXYgKi8KKwl2aWRlb19kZXZpY2VfcmVsZWFzZSh2aWRlb2Rldik7CisKKwkvKiBmcmVlIHJlc3QgbWVtb3J5ICovCisJa2ZyZWUocmFkaW8tPmJ1ZmZlcik7CisJa2ZyZWUocmFkaW8pOworfQorCiAvKiBWNEwyIGludGVyZmFjZSAqLwogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgYW1yYWRpb192aWRlb2Rldl90ZW1wbGF0ZSA9IHsKIAkubmFtZQkJPSAiQXZlck1lZGlhIE1SIDgwMCBVU0IgRk0gUmFkaW8iLAogCS5mb3BzCQk9ICZ1c2JfYW1yYWRpb19mb3BzLAogCS5pb2N0bF9vcHMgCT0gJnVzYl9hbXJhZGlvX2lvY3RsX29wcywKLQkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5yZWxlYXNlCT0gdXNiX2FtcmFkaW9fZGV2aWNlX3JlbGVhc2UsCiB9OwogCiAvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQgYW5kIHJlZ2lzdGVyIHdpdGggdjRsIGFuZApAQCAtNjAyLDcgKzY1Nyw3IEBACiAKIAl2aWRlb19zZXRfZHJ2ZGF0YShyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKIAlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2RldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSkgewotCQl3YXJuKCJDb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIik7CisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iKTsKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UocmFkaW8tPnZpZGVvZGV2KTsKIAkJa2ZyZWUocmFkaW8tPmJ1ZmZlcik7CiAJCWtmcmVlKHJhZGlvKTsKQEAgLTYxNyw5ICs2NzIsMTMgQEAKIHsKIAlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfYW1yYWRpb19kcml2ZXIpOwogCi0JaW5mbyhEUklWRVJfVkVSU0lPTiAiICIgRFJJVkVSX0RFU0MpOworCXByX2luZm8oS0JVSUxEX01PRE5BTUUKKwkJIjogdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIgIiBEUklWRVJfREVTQyAiXG4iKTsKKwogCWlmIChyZXR2YWwpCi0JCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0dmFsKTsKKwkJcHJfZXJyKEtCVUlMRF9NT0ROQU1FCisJCQkiOiB1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsIHJldHZhbCk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCmluZGV4IGE2NzA3OTcuLjc3MDRmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCkBAIC0xLDcgKzEsNyBAQAogLyogUmFkaW9UcmFjayBJSSBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQgKEMpIDE5OTggQmVuIFBmYWZmCiAgKgogICogQmFzZWQgb24gUmFkaW9UcmFjayBJL1JhZGlvUmV2ZWFsIChDKSAxOTk3IE0uIEtpcmt3b29kCi0gKiBDb252ZXJ0ZWQgdG8gbmV3IEFQSSBieSBBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICogQ29udmVydGVkIHRvIG5ldyBBUEkgYnkgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cyBieSBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPgogICoKICAqIFRPRE86IEFsbG93IGZvciBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGZvb2xpc2ggZW50aXRpZXMgOi0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCmluZGV4IDMyOWM5MGIuLjgzNGQ0MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jCkBAIC0zLDcgKzMsNyBAQAogICogKGMpIDE5OTcgTS4gS2lya3dvb2QKICAqIChjKSAxOTk4IFBldHIgVmFuZHJvdmVjLCB2YW5kcm92ZUB2Yy5jdnV0LmN6CiAgKgotICogRml0dGVkIHRvIG5ldyBpbnRlcmZhY2UgYnkgQWxhbiBDb3ggPGFsYW4uY294QGxpbnV4Lm9yZz4KKyAqIEZpdHRlZCB0byBuZXcgaW50ZXJmYWNlIGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiBNYWRlIHdvcmtpbmcgYW5kIGNsZWFuZWQgdXAgZnVuY3Rpb25zIDxtaWthZWwuaGVkaW5AaXJmLnNlPgogICogU3VwcG9ydCBmb3IgSVNBUG5QIGJ5IExhZGlzbGF2IE1pY2hsIDxsYWRpc0Bwc2kuY3o+CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IDA1N2ZkN2UxLi4xOWNmM2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0xODQsNyArMTg0LDcgQEAKIAogY29uZmlnIFZJREVPX0NTNTM0NQogCXRyaXN0YXRlICJDaXJydXMgTG9naWMgQ1M1MzQ1IGF1ZGlvIEFEQyIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciB0aGUgQ2lycnVzIExvZ2ljIENTNTM0NSAyNC1iaXQsIDE5MiBrSHoKIAkgIHN0ZXJlbyBBL0QgY29udmVydGVyLgpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIGNvbmZpZyBWSURFT19NNTI3OTAKICAgICAgICB0cmlzdGF0ZSAiTWl0c3ViaXNoaSBNNTI3OTAgQS9WIHN3aXRjaCIKLSAgICAgICBkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorICAgICAgIGRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMKICAgICAgICAtLS1oZWxwLS0tCiAJIFN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIE01Mjc5MCBBL1Ygc3dpdGNoLgogCkBAIC0yNDIsNyArMjQyLDcgQEAKIAogY29uZmlnIFZJREVPX1ZQMjdTTVBYCiAJdHJpc3RhdGUgIlBhbmFzb25pYyBWUDI3cyBpbnRlcm5hbCBNUFgiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIGludGVybmFsIE1QWCBvZiB0aGUgUGFuYXNvbmljIFZQMjdzIHR1bmVyLgogCkBAIC0zNjEsNiArMzYxLDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYWE3MTkxLgogCitjb25maWcgVklERU9fVFZQNTE0WAorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUVlA1MTR4IHZpZGVvIGRlY29kZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIEkyQworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBWaWRlbzRMaW51eDIgc2Vuc29yLWxldmVsIGRyaXZlciBmb3IgdGhlIFRJIFRWUDUxNDYvNDcKKwkgIGRlY29kZXIuIEl0IGlzIGN1cnJlbnRseSB3b3JraW5nIHdpdGggdGhlIFRJIE9NQVAzIGNhbWVyYQorCSAgY29udHJvbGxlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHZwNTE0eC4KKwogY29uZmlnIFZJREVPX1RWUDUxNTAKIAl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgVFZQNTE1MCB2aWRlbyBkZWNvZGVyIgogCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMKQEAgLTM4Nyw3ICszOTgsNyBAQAogCiBjb25maWcgVklERU9fQ1gyMzQxWAogCXRyaXN0YXRlICJDb25leGFudCBDWDIzNDF4IE1QRUcgZW5jb2RlcnMiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIEVYUEVSSU1FTlRBTCAmJiBWSURFT19WNEwyX0NPTU1PTgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBWSURFT19WNEwyX0NPTU1PTgogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIHRoZSBDb25leGFudCBDWDIzNDE2IE1QRUcgZW5jb2RlcnMKIAkgIGFuZCBDWDIzNDE1IE1QRUcgZW5jb2Rlci9kZWNvZGVycy4KQEAgLTcyNSwxMCArNzM2LDE2IEBACiAJICBleHRlbmRlciB0byBzd2l0Y2ggYmV0d2VlbiA4IGFuZCAxMCBiaXQgZGF0YXdpZHRoIG1vZGVzCiAKIGNvbmZpZyBTT0NfQ0FNRVJBX01UOU0xMTEKLQl0cmlzdGF0ZSAibXQ5bTExMSBzdXBwb3J0IgorCXRyaXN0YXRlICJtdDltMTExIGFuZCBtdDltMTEyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQwogCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1UOU0xMTEgY2FtZXJhcyBmcm9tIE1pY3JvbgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTVQ5TTExMSBhbmQgTVQ5TTExMiBjYW1lcmFzIGZyb20gTWljcm9uCisKK2NvbmZpZyBTT0NfQ0FNRVJBX01UOVQwMzEKKwl0cmlzdGF0ZSAibXQ5dDAzMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNVDlUMDMxIGNhbWVyYXMgZnJvbSBNaWNyb24uCiAKIGNvbmZpZyBTT0NfQ0FNRVJBX01UOVYwMjIKIAl0cmlzdGF0ZSAibXQ5djAyMiBzdXBwb3J0IgpAQCAtNzQ0LDEyICs3NjEsMjQgQEAKIAkgIFNlbGVjdCB0aGlzIGlmIHlvdXIgTVQ5VjAyMiBjYW1lcmEgdXNlcyBhIFBDQTk1MzYgSTJDIEdQSU8KIAkgIGV4dGVuZGVyIHRvIHN3aXRjaCBiZXR3ZWVuIDggYW5kIDEwIGJpdCBkYXRhd2lkdGggbW9kZXMKIAorY29uZmlnIFNPQ19DQU1FUkFfVFc5OTEwCisJdHJpc3RhdGUgInR3OTkxMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKKwloZWxwCisJICBUaGlzIGlzIGEgdHc5OTEwIHZpZGVvIGRyaXZlcgorCiBjb25maWcgU09DX0NBTUVSQV9QTEFURk9STQogCXRyaXN0YXRlICJwbGF0Zm9ybSBjYW1lcmEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPQ19DQU1FUkEKIAloZWxwCiAJICBUaGlzIGlzIGEgZ2VuZXJpYyBTb0MgY2FtZXJhIHBsYXRmb3JtIGRyaXZlciwgdXNlZnVsIGZvciB0ZXN0aW5nCiAKK2NvbmZpZyBTT0NfQ0FNRVJBX09WNzcyWAorCXRyaXN0YXRlICJvdjc3MnggY2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQworCWhlbHAKKwkgIFRoaXMgaXMgYSBvdjc3MnggY2FtZXJhIGRyaXZlcgorCiBjb25maWcgVklERU9fUFhBMjd4CiAJdHJpc3RhdGUgIlBYQTI3eCBRdWljayBDYXB0dXJlIEludGVyZmFjZSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgUFhBMjd4ICYmIFNPQ19DQU1FUkEKQEAgLTc2NCw2ICs3OTMsMTMgQEAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgdjRsMiBkcml2ZXIgZm9yIHRoZSBTdXBlckggTW9iaWxlIENFVSBJbnRlcmZhY2UKIAorY29uZmlnIFZJREVPX09NQVAyCisJdHJpc3RhdGUgIk9NQVAyIENhbWVyYSBDYXB0dXJlIEludGVyZmFjZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgQVJDSF9PTUFQMgorCXNlbGVjdCBWSURFT0JVRl9ETUFfU0cKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdjRsMiBkcml2ZXIgZm9yIHRoZSBUSSBPTUFQMiBjYW1lcmEgY2FwdHVyZSBpbnRlcmZhY2UKKwogIwogIyBVU0IgTXVsdGltZWRpYSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggMTY5NjJmMy4uMTYxMWMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC04LDkgKzgsMTEgQEAKIAogc3Rrd2ViY2FtLW9ianMJOj0Jc3RrLXdlYmNhbS5vIHN0ay1zZW5zb3IubwogCi12aWRlb2Rldi1vYmpzCTo9CXY0bDItZGV2Lm8gdjRsMi1pb2N0bC5vCitvbWFwMmNhbS1vYmpzCTo9CW9tYXAyNHh4Y2FtLm8gb21hcDI0eHhjYW0tZG1hLm8KIAotb2JqLSQoQ09ORklHX1ZJREVPX0RFVikgKz0gdmlkZW9kZXYubyBjb21wYXRfaW9jdGwzMi5vIHY0bDItaW50LWRldmljZS5vCit2aWRlb2Rldi1vYmpzCTo9CXY0bDItZGV2Lm8gdjRsMi1pb2N0bC5vIHY0bDItZGV2aWNlLm8gdjRsMi1zdWJkZXYubworCitvYmotJChDT05GSUdfVklERU9fREVWKSArPSB2aWRlb2Rldi5vIHY0bDItY29tcGF0LWlvY3RsMzIubyB2NGwyLWludC1kZXZpY2UubwogCiBvYmotJChDT05GSUdfVklERU9fVjRMMl9DT01NT04pICs9IHY0bDItY29tbW9uLm8KIApAQCAtMjUsNiArMjcsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1RWQVVESU8pICs9IHR2YXVkaW8ubwogb2JqLSQoQ09ORklHX1ZJREVPX1REQTc0MzIpICs9IHRkYTc0MzIubwogb2JqLSQoQ09ORklHX1ZJREVPX1REQTk4NzUpICs9IHRkYTk4NzUubworb2JqLSQoQ09ORklHX1NPVU5EX1RWTUlYRVIpICs9IHR2bWl4ZXIubwogCiBvYmotJChDT05GSUdfVklERU9fU0FBNjU4OCkgKz0gc2FhNjU4OC5vCiBvYmotJChDT05GSUdfVklERU9fU0FBNTI0NkEpICs9IHNhYTUyNDZhLm8KQEAgLTY2LDYgKzY5LDcgQEAKIG9iai0kKENPTkZJR19WSURFT19FTTI4WFgpICs9IGVtMjh4eC8KIG9iai0kKENPTkZJR19WSURFT19VU0JWSVNJT04pICs9IHVzYnZpc2lvbi8KIG9iai0kKENPTkZJR19WSURFT19UVlA1MTUwKSArPSB0dnA1MTUwLm8KK29iai0kKENPTkZJR19WSURFT19UVlA1MTRYKSArPSB0dnA1MTR4Lm8KIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLwogb2JqLSQoQ09ORklHX1ZJREVPX01TUDM0MDApICs9IG1zcDM0MDAubwogb2JqLSQoQ09ORklHX1ZJREVPX0NTNTM0NSkgKz0gY3M1MzQ1Lm8KQEAgLTEyOSwxMSArMTMzLDE1IEBACiAKIG9iai0kKENPTkZJR19WSURFT19QWEEyN3gpCSs9IHB4YV9jYW1lcmEubwogb2JqLSQoQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVUpCSs9IHNoX21vYmlsZV9jZXVfY2FtZXJhLm8KK29iai0kKENPTkZJR19WSURFT19PTUFQMikJCSs9IG9tYXAyY2FtLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBKQkrPSBzb2NfY2FtZXJhLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDEpCSs9IG10OW0wMDEubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfTVQ5TTExMSkJKz0gbXQ5bTExMS5vCitvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlUMDMxKQkrPSBtdDl0MDMxLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOVYwMjIpCSs9IG10OXYwMjIubworb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y3NzJYKQkJKz0gb3Y3NzJ4Lm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX1BMQVRGT1JNKQkrPSBzb2NfY2FtZXJhX3BsYXRmb3JtLm8KK29iai0kKENPTkZJR19TT0NfQ0FNRVJBX1RXOTkxMCkJCSs9IHR3OTkxMC5vCiAKIG9iai0kKENPTkZJR19WSURFT19BVTA4MjgpICs9IGF1MDgyOC8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKaW5kZXggZTA5YjAwNi4uMmJhNmFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCkBAIC0zOTYsOCArMzk2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFyX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBhcl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IGFyX2RldmljZSAqYXIgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtNTQzLDcgKzU0Miw3IEBACiBzdGF0aWMgaW50IGFyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgYXJfZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgYXJfZG9faW9jdGwpOwogfQogCiAjaWYgVVNFX0lOVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idDgzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idDgzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZmYzk2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnQ4MzIuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKiBEcml2ZXIgZm9yIEJ0ODMyIENNT1MgQ2FtZXJhIFZpZGVvIFByb2Nlc3NvcgotICAgIGkyYy1hZGRyZXNzZXM6IDB4ODggb3IgMHg4YQotCi0gIFRoZSBCVDgzMiBpbnRlcmZhY2VzIHRvIGEgUXVhcnR6c2lnaHQgRGlnaXRhbCBDYW1lcmEgKDM1MngyODgsIDI1IG9yIDMwIGZwcykKLSAgdmlhIGEgOSBwaW4gY29ubmVjdG9yICggNC13aXJlIFNEQVRBLCAyLXdpcmUgaTJjLCBTQ0xLLCBWQ0MsIEdORCkuCi0gIEl0IG91dHB1dHMgYW4gOC1iaXQgNDoyOjIgWVVWIG9yIFlDckNiIHZpZGVvIHNpZ25hbCB3aGljaCBjYW4gYmUgZGlyZWN0bHkKLSAgY29ubmVjdGVkIHRvIGJ0ODQ4L2J0ODc4IEdQSU8gcGlucyBvbiB0aGlzIHB1cnBvc2UuCi0gIChzZWU6IFZMU0kgVmlzaW9uIEx0ZC4gd3d3LnZ2bC5jby51ayBmb3IgY2FtZXJhIGRhdGFzaGVldHMpCi0KLSAgU3VwcG9ydGVkIENhcmRzOgotICAtICBQaXhlbHZpZXcgUmV2LjRFOiAweDhhCi0JCUdQSU8gMHg0MDAwMDAgdG9nZ2xlcyBCdDgzMiBSRVNFVCwgYW5kIHRoZSBjaGlwIGNoYW5nZXMgdG8gaTJjIDB4ODggIQotCi0gIChjKSBHdW50aGVyIE1heWVyLCAyMDAyCi0KLSAgU1RBVFVTOgotICAtIGRldGVjdCBjaGlwIGFuZCBoZXhkdW1wCi0gIC0gcmVzZXQgY2hpcCBhbmQgbGVhdmUgbG93IHBvd2VyIG1vZGUKLSAgLSBkZXRlY3QgY2FtZXJhIHByZXNlbnQKLQotICBUT0RPOgotICAtIG1ha2UgaXQgd29yayAoZmluZCBjb3JyZWN0IHNldHVwIGZvciBCdDgzMiBhbmQgQnQ4NzgpCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotCi0jaW5jbHVkZSAiYnR0di5oIgotI2luY2x1ZGUgImJ0ODMyLmgiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19BRERSX0JUODMyX0FMVDE+PjEsIEkyQ19BRERSX0JUODMyX0FMVDI+PjEsCi0JCQkJICAgICAgIEkyQ19DTElFTlRfRU5EIH07Ci1JMkNfQ0xJRU5UX0lOU01PRDsKLQotaW50IGRlYnVnOyAgICAvKiBkZWJ1ZyBvdXRwdXQgKi8KLW1vZHVsZV9wYXJhbShkZWJ1ZywgICAgICAgICAgICBpbnQsIDA2NDQpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgYnQ4MzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCi1zdHJ1Y3QgYnQ4MzIgewotCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKLX07Ci0KLWludCBidDgzMl9oZXhkdW1wKHN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50X3MsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLQlpbnQgaSxyYzsKLQlidWZbMF09MHg4MDsgLy8gc3RhcnQgYXQgcmVnaXN0ZXIgMCB3aXRoIGF1dG8taW5jcmVtZW50Ci0JaWYgKDEgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMSkpKQotCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7Ci0KLQlmb3IoaT0wO2k8NjU7aSsrKQotCQlidWZbaV09MDsKLQlpZiAoNjUgIT0gKHJjPWkyY19tYXN0ZXJfcmVjdihpMmNfY2xpZW50X3MsYnVmLDY1KSkpCi0JCXY0bF9lcnIoaTJjX2NsaWVudF9zLCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDY1KVxuIixyYyk7Ci0KLQkvLyBOb3RlOiBPbiBSRUFEIHRoZSBmaXJzdCBieXRlIGlzIHRoZSBjdXJyZW50IGluZGV4Ci0JLy8gIChlLmcuIDB4ODAsIHdoYXQgd2UganVzdCB3cm90ZSkKLQotCWlmKGRlYnVnPjEpIHsKLQkJaW50IGk7Ci0JCXY0bF9kYmcoMiwgZGVidWcsaTJjX2NsaWVudF9zLCJoZXhkdW1wOiIpOwotCQlmb3IoaT0xO2k8NjU7aSsrKSB7Ci0JCQlpZihpIT0xKSB7Ci0JCQkJaWYoKChpLTEpJTgpPT0wKSBwcmludGsoIiAiKTsKLQkJCQlpZigoKGktMSklMTYpPT0wKSB7Ci0JCQkJCXByaW50aygiXG4iKTsKLQkJCQkJdjRsX2RiZygyLCBkZWJ1ZyxpMmNfY2xpZW50X3MsImhleGR1bXA6Iik7Ci0JCQkJfQotCQkJfQotCQkJcHJpbnRrKCIgJTAyeCIsYnVmW2ldKTsKLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0vLyBSZXR1cm46IDEgKGlzIGEgYnQ4MzIpLCAwIChObyBidDgzMiBoZXJlKQotaW50IGJ0ODMyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnRfcykKLXsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JaW50IHJjOwotCi0JYnVmPWttYWxsb2MoNjUsR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJdjRsX2VycigmdC0+Y2xpZW50LAotCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuIERldGFjaGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKLQotCWlmKGJ1ZlsweDQwXSAhPSAweDMxKSB7Ci0JCXY0bF9lcnIoaTJjX2NsaWVudF9zLCJUaGlzIGkyYyBjaGlwIGlzIG5vIGJ0ODMyIChpZD0lMDJ4KS4gRGV0YWNoaW5nLlxuIixidWZbMHg0MF0pOwotCQlrZnJlZShidWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl2NGxfZXJyKGkyY19jbGllbnRfcywiV3JpdGUgMCB0cCBWUFNUQVRVU1xuIik7Ci0JYnVmWzBdPUJUODMyX1ZQX1NUQVRVUzsgLy8gUmVnLjUyCi0JYnVmWzFdPSAweDAwOwotCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJdjRsX2VycihpMmNfY2xpZW50X3MsImkyYyBpL28gZXJyb3IgVlBTOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKLQotCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7Ci0KLQotCS8vIExlYXZlIGxvdyBwb3dlciBtb2RlOgotCXY0bF9lcnIoaTJjX2NsaWVudF9zLCJsZWF2ZSBsb3cgcG93ZXIgbW9kZS5cbiIpOwotCWJ1ZlswXT1CVDgzMl9DQU1fU0VUVVAwOyAvLzB4MzkgNTcKLQlidWZbMV09MHgwODsKLQlpZiAoMiAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwyKSkpCi0JCXY0bF9lcnIoaTJjX2NsaWVudF9zLCJpMmMgaS9vIGVycm9yIExMUE06IHJjID09ICVkIChzaG91bGQgYmUgMilcbiIscmMpOwotCi0JYnQ4MzJfaGV4ZHVtcChpMmNfY2xpZW50X3MsYnVmKTsKLQotCXY0bF9pbmZvKGkyY19jbGllbnRfcywiV3JpdGUgMCB0cCBWUFNUQVRVU1xuIik7Ci0JYnVmWzBdPUJUODMyX1ZQX1NUQVRVUzsgLy8gUmVnLjUyCi0JYnVmWzFdPSAweDAwOwotCWlmICgyICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChpMmNfY2xpZW50X3MsYnVmLDIpKSkKLQkJdjRsX2VycihpMmNfY2xpZW50X3MsImkyYyBpL28gZXJyb3IgVlBTOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKLQotCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7Ci0KLQotCS8vIEVuYWJsZSBPdXRwdXQKLQl2NGxfaW5mbyhpMmNfY2xpZW50X3MsIkVuYWJsZSBPdXRwdXRcbiIpOwotCWJ1ZlswXT1CVDgzMl9WUF9DT05UUk9MMTsgLy8gUmVnLjQwCi0JYnVmWzFdPSAweDI3ICYgKH4weDAxKTsgLy8gRGVmYXVsdCB8ICFza2lwCi0JaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQotCQl2NGxfZXJyKGkyY19jbGllbnRfcywiaTJjIGkvbyBlcnJvciBFTzogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7Ci0KLQlidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOwotCi0KLQkvLyBmb3IgdGVzdGluZyAoZXZlbiB3b3JrcyB3aGVuIG5vIGNhbWVyYSBhdHRhY2hlZCkKLQl2NGxfaW5mbyhpMmNfY2xpZW50X3MsIioqKiBHZW5lcmF0ZSBOVFNDIE0gQmFycyAqKioqKlxuIik7Ci0JYnVmWzBdPUJUODMyX1ZQX1RFU1RDT05UUk9MMDsgLy8gUmVnLiA0MgotCWJ1ZlsxXT0zOyAvLyBHZW5lcmF0ZSBOVFNDIFN5c3RlbSBNIGJhcnMsIEdlbmVyYXRlIEZyYW1lIHRpbWluZyBpbnRlcm5hbGx5Ci0JaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQotCQl2NGxfaW5mbyhpMmNfY2xpZW50X3MsImkyYyBpL28gZXJyb3IgTUJBUjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7Ci0KLQl2NGxfaW5mbyhpMmNfY2xpZW50X3MsIkNhbWVyYSBQcmVzZW50OiAlc1xuIiwKLQkJKGJ1ZlsxK0JUODMyX0NBTV9TVEFUVVNdICYgQlQ4MzJfNTZfQ0FNRVJBX1BSRVNFTlQpID8gInllcyI6Im5vIik7Ci0KLQlidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGJ0ODMyX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKLXsKLQlzdHJ1Y3QgYnQ4MzIgKnQ7Ci0KLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgICAgPSBhZGRyOwotCi0JaWYgKE5VTEwgPT0gKHQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JdC0+Y2xpZW50ID0gY2xpZW50X3RlbXBsYXRlOwotCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+Y2xpZW50LCB0KTsKLQlpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKLQotCXY0bF9pbmZvKCZ0LT5jbGllbnQsImNoaXAgZm91bmQgQCAweCV4XG4iLCBhZGRyPDwxKTsKLQotCWlmKCEgYnQ4MzJfaW5pdCgmdC0+Y2xpZW50KSkgewotCQlidDgzMl9kZXRhY2goJnQtPmNsaWVudCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBidDgzMl9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKLQkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBidDgzMl9hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJ0ODMyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBidDgzMiAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JdjRsX2luZm8oJnQtPmNsaWVudCwiZGV0dGFjaFxuIik7Ci0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZSh0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotYnQ4MzJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGJ0ODMyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlpZiAoZGVidWc+MSkKLQkJdjRsX2kyY19wcmludF9pb2N0bCgmdC0+Y2xpZW50LGNtZCk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIEJUODMyX0hFWERVTVA6IHsKLQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQkJCWJ1ZiA9IGttYWxsb2MoNjUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFidWYpIHsKLQkJCQl2NGxfZXJyKCZ0LT5jbGllbnQsCi0JCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ0ODMyX2hleGR1bXAoJnQtPmNsaWVudCxidWYpOwotCQkJa2ZyZWUoYnVmKTsKLQkJfQotCQlicmVhazsKLQkJY2FzZSBCVDgzMl9SRUFUVEFDSDoKLQkJCXY0bF9pbmZvKCZ0LT5jbGllbnQsInJlLWF0dGFjaFxuIik7Ci0JCQlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKLQkJCWkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgICA9ICJidDgzMiIsCi0JfSwKLQkuaWQgICAgICAgICAgICAgPSAwLCAvKiBGSVhNRSAqLwotCS5hdHRhY2hfYWRhcHRlciA9IGJ0ODMyX3Byb2JlLAotCS5kZXRhY2hfY2xpZW50ICA9IGJ0ODMyX2RldGFjaCwKLQkuY29tbWFuZCAgICAgICAgPSBidDgzMl9jb21tYW5kLAotfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQotewotCS5uYW1lICAgICAgID0gImJ0ODMyIiwKLQkuZHJpdmVyICAgICA9ICZkcml2ZXIsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGJ0ODMyX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnQ4MzJfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYnQ4MzJfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoYnQ4MzJfY2xlYW51cF9tb2R1bGUpOwotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnQ4MzIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnQ4MzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlOGZhNzFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnQ4MzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKiBCdDgzMiBDTU9TIENhbWVyYSBWaWRlbyBQcm9jZXNzb3IgKFZQKQotCi0gVGhlIEJ0ODMyIENNT1MgQ2FtZXJhIFZpZGVvIFByb2Nlc3NvciBjaGlwIGNvbm5lY3RzIGEgUXVhcnRzaWdodCBDTU9TCi0gIGNvbG9yIGRpZ2l0YWwgY2FtZXJhIGRpcmVjdGx5IHRvIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyB2aWEgYW4gOC1iaXQsCi0gIDQ6MjoyIFlVViBvciBZQ3JDYiB2aWRlbyBpbnRlcmZhY2UuCi0KLSBpMmMgYWRkcmVzc2VzOiAweDg4IG9yIDB4OGEKLSAqLwotCi0vKiBUaGUgNjQgcmVnaXN0ZXJzOiAqLwotCi0vLyBJbnB1dCBQcm9jZXNzb3IKLSNkZWZpbmUgQlQ4MzJfT0ZGU0VUIDAKLSNkZWZpbmUgQlQ4MzJfUkNPTVAJMQotI2RlZmluZSBCVDgzMl9HMUNPTVAJMgotI2RlZmluZSBCVDgzMl9HMkNPTVAJMwotI2RlZmluZSBCVDgzMl9CQ09NUAk0Ci0vLyBFeHBvc3VyZXM6Ci0jZGVmaW5lIEJUODMyX0ZJTkVICTUKLSNkZWZpbmUgQlQ4MzJfRklORUwJNgotI2RlZmluZSBCVDgzMl9DT0FSU0VICTcKLSNkZWZpbmUgQlQ4MzJfQ09BUlNFTCAgIDgKLSNkZWZpbmUgQlQ4MzJfQ0FNR0FJTgk5Ci0vLyBNYWluIFByb2Nlc3NvcjoKLSNkZWZpbmUgQlQ4MzJfTTAwCTEwCi0jZGVmaW5lIEJUODMyX00wMQkxMQotI2RlZmluZSBCVDgzMl9NMDIJMTIKLSNkZWZpbmUgQlQ4MzJfTTEwCTEzCi0jZGVmaW5lIEJUODMyX00xMQkxNAotI2RlZmluZSBCVDgzMl9NMTIJMTUKLSNkZWZpbmUgQlQ4MzJfTTIwCTE2Ci0jZGVmaW5lIEJUODMyX00yMQkxNwotI2RlZmluZSBCVDgzMl9NMjIJMTgKLSNkZWZpbmUgQlQ4MzJfQVBDT1IJMTkKLSNkZWZpbmUgQlQ4MzJfR0FNQ09SCTIwCi0vLyBMZXZlbCBBY2N1bXVsYXRvciBJbnB1dHMKLSNkZWZpbmUgQlQ4MzJfVlBDT05UUk9MMgkyMQotI2RlZmluZSBCVDgzMl9aT05FQ09ERTAJMjIKLSNkZWZpbmUgQlQ4MzJfWk9ORUNPREUxCTIzCi0jZGVmaW5lIEJUODMyX1pPTkVDT0RFMgkyNAotI2RlZmluZSBCVDgzMl9aT05FQ09ERTMJMjUKLS8vIExldmVsIEFjY3VtdWxhdG9yIE91dHB1dHM6Ci0jZGVmaW5lIEJUODMyX1JBQ0MJMjYKLSNkZWZpbmUgQlQ4MzJfR0FDQwkyNwotI2RlZmluZSBCVDgzMl9CQUNDCTI4Ci0jZGVmaW5lIEJUODMyX0JMQUNLQUNDCTI5Ci0jZGVmaW5lIEJUODMyX0VYUF9BR0MJMzAKLSNkZWZpbmUgQlQ4MzJfTEFDQzAJMzEKLSNkZWZpbmUgQlQ4MzJfTEFDQzEJMzIKLSNkZWZpbmUgQlQ4MzJfTEFDQzIJMzMKLSNkZWZpbmUgQlQ4MzJfTEFDQzMJMzQKLSNkZWZpbmUgQlQ4MzJfTEFDQzQJMzUKLSNkZWZpbmUgQlQ4MzJfTEFDQzUJMzYKLSNkZWZpbmUgQlQ4MzJfTEFDQzYJMzcKLSNkZWZpbmUgQlQ4MzJfTEFDQzcJMzgKLS8vIFN5c3RlbToKLSNkZWZpbmUgQlQ4MzJfVlBfQ09OVFJPTDAJMzkKLSNkZWZpbmUgQlQ4MzJfVlBfQ09OVFJPTDEJNDAKLSNkZWZpbmUgQlQ4MzJfVEhSRVNICTQxCi0jZGVmaW5lIEJUODMyX1ZQX1RFU1RDT05UUk9MMAk0MgotI2RlZmluZSBCVDgzMl9WUF9ETUNPREUJNDMKLSNkZWZpbmUgQlQ4MzJfQUNCX0NPTkZJRwk0NAotI2RlZmluZSBCVDgzMl9BQ0JfR05CQVNFCTQ1Ci0jZGVmaW5lIEJUODMyX0FDQl9NVQk0NgotI2RlZmluZSBCVDgzMl9DQU1fVEVTVDAJNDcKLSNkZWZpbmUgQlQ4MzJfQUVDX0NPTkZJRwk0OAotI2RlZmluZSBCVDgzMl9BRUNfVEwJNDkKLSNkZWZpbmUgQlQ4MzJfQUVDX1RDCTUwCi0jZGVmaW5lIEJUODMyX0FFQ19USAk1MQotLy8gU3RhdHVzOgotI2RlZmluZSBCVDgzMl9WUF9TVEFUVVMJNTIKLSNkZWZpbmUgQlQ4MzJfVlBfTElORUNPVU5UCTUzCi0jZGVmaW5lIEJUODMyX0NBTV9ERVZJQ0VMCTU0IC8vIGUuZy4gMHgxOQotI2RlZmluZSBCVDgzMl9DQU1fREVWSUNFSAk1NSAvLyBlLmcuIDB4NDAgID09IDB4MTk0IE1hc2swLCAweDE5NCA9IDQwNCBkZWNpbWFsIChWVkwtNDA0IGNhbWVyYSkKLSNkZWZpbmUgQlQ4MzJfQ0FNX1NUQVRVUwkJNTYKLSAjZGVmaW5lIEJUODMyXzU2X0NBTUVSQV9QUkVTRU5UIDB4MjAKLS8vQ2FtZXJhIFNldHVwczoKLSNkZWZpbmUgQlQ4MzJfQ0FNX1NFVFVQMAk1NwotI2RlZmluZSBCVDgzMl9DQU1fU0VUVVAxCTU4Ci0jZGVmaW5lIEJUODMyX0NBTV9TRVRVUDIJNTkKLSNkZWZpbmUgQlQ4MzJfQ0FNX1NFVFVQMwk2MAotLy8gU3lzdGVtOgotI2RlZmluZSBCVDgzMl9ERUZDT1IJCTYxCi0jZGVmaW5lIEJUODMyX1ZQX1RFU1RDT05UUk9MMQk2MgotI2RlZmluZSBCVDgzMl9ERVZJQ0VfSUQJCTYzCi0jIGRlZmluZSBCVDgzMl9ERVZJQ0VfSURfXzMxCQkweDMxIC8vIEJ0ODMyIGhhcyBJRCAweDMxCi0KLS8qIFNUTWljcm9lbGVjdHJvbml2Y3MgVlY1NDA0IGNhbWVyYSBtb2R1bGUKLSAgIGkyYzogMHgyMDogc2Vuc29yIGFkZHJlc3MKLSAgIGkyYzogMHhhMDogZWVwcm9tIGZvciBjY2QgZGVmZWN0IG1hcAotICovCi0jZGVmaW5lIFZWNTQwNF9kZXZpY2VfaAkJMHgwMCAgLy8gMHgxOQotI2RlZmluZSBWVjU0MDRfZGV2aWNlX2wJCTB4MDEgIC8vIDB4NDAKLSNkZWZpbmUgVlY1NDA0X3N0YXR1czAJCTB4MDIKLSNkZWZpbmUgVlY1NDA0X2xpbmVjb3VudGMJMHgwMyAvLyBjdXJyZW50IGxpbmUgY291bnRlcgotI2RlZmluZSBWVjU0MDRfbGluZWNvdW50bAkweDA0Ci0jZGVmaW5lIFZWNTQwNF9zZXR1cDAJCTB4MTAKLSNkZWZpbmUgVlY1NDA0X3NldHVwMQkJMHgxMQotI2RlZmluZSBWVjU0MDRfc2V0dXAyCQkweDEyCi0jZGVmaW5lIFZWNTQwNF9zZXR1cDQJCTB4MTQKLSNkZWZpbmUgVlY1NDA0X3NldHVwNQkJMHgxNQotI2RlZmluZSBWVjU0MDRfZmluZV9oCQkweDIwICAvLyBmaW5lIGV4cG9zdXJlCi0jZGVmaW5lIFZWNTQwNF9maW5lX2wJCTB4MjEKLSNkZWZpbmUgVlY1NDA0X2NvYXJzZV9oCQkweDIyICAvL2NvYXJzZSBleHBvc3VyZQotI2RlZmluZSBWVjU0MDRfY29hcnNlX2wJCTB4MjMKLSNkZWZpbmUgVlY1NDA0X2dhaW4JCTB4MjQgLy8gQURDIHByZS1hbXAgZ2FpbiBzZXR0aW5nCi0jZGVmaW5lIFZWNTQwNF9jbGtfZGl2CQkweDI1Ci0jZGVmaW5lIFZWNTQwNF9jcgkJMHg3NiAvLyBjb250cm9sIHJlZ2lzdGVyCi0jZGVmaW5lIFZWNTQwNF9hczAJCTB4NzcgLy8gQURDIHNldHVwIHJlZ2lzdGVyCi0KLQotLy8gSU9DVEwKLSNkZWZpbmUgQlQ4MzJfSEVYRFVNUCAgIF9JT1IoJ2InLDEsaW50KQotI2RlZmluZSBCVDgzMl9SRUFUVEFDSAlfSU9SKCdiJywyLGludCkKLQotLyogZnJvbSBCVDh4OFZYRC9jYXBkcnYvZGlhbG9ncy5jcHAgKi8KLQotLyoKLXR5cGVkZWYgZW51bSB7IFNWSSwgTG9naXRlY2gsIFJvY2t3ZWxsIH0gQ0FNRVJBOwotCi1zdGF0aWMgQ09NQk9CT1hfRU5UUlkgZ3dDYW1lcmFPcHRpb25zW10gPQotewotICAgeyBTVkksICAgICAgIlNpbGljb24gVmlzaW9uIDUxMk4iIH0sCi0gICB7IExvZ2l0ZWNoLCAiTG9naXRlY2ggVmlkZW9NYW4gMS4zIiAgfSwKLSAgIHsgUm9ja3dlbGwsICJSb2Nrd2VsbCBRdWFydHpTaWdodCBQQ0kgMS4wIiAgIH0KLX07Ci0KLS8vIFNSQU0gdGFibGUgdmFsdWVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdHlwZWRlZiBlbnVtIHsgVEdCX05UU0M2MjQsIFRHQl9OVFNDNzgwLCBUR0JfTlRTQzg1OCwgVEdCX05UU0MzOTIgfSBUaW1lR2VuQnl0ZTsKLQotQllURSBTUkFNVGFibGVbXVsgNjAgXSA9Ci17Ci0gICAvLyBUR0JfTlRTQzYyNAotICAgewotICAgICAgMHgzMywgLy8gc2l6ZSBvZiB0YWJsZSA9IDUxCi0gICAgICAweDBFLCAweEMwLCAweDAwLCAweDAwLCAweDkwLCAweDAyLCAweDAzLCAweDEwLCAweDAzLCAweDA2LAotICAgICAgMHgxMCwgMHgwNCwgMHgxMiwgMHgxMiwgMHgwNSwgMHgwMiwgMHgxMywgMHgwNCwgMHgxOSwgMHgwMCwKLSAgICAgIDB4MDQsIDB4MzksIDB4MDAsIDB4MDYsIDB4NTksIDB4MDgsIDB4MDMsIDB4ODUsIDB4MDgsIDB4MDcsCi0gICAgICAweDAzLCAweDUwLCAweDAwLCAweDkxLCAweDQwLCAweDAwLCAweDExLCAweDAxLCAweDAxLCAweDRELAotICAgICAgMHgwRCwgMHgwMiwgMHgwMywgMHgxMSwgMHgwMSwgMHgwNSwgMHgzNywgMHgwMCwgMHgzNywgMHgyMSwgMHgwMAotICAgfSwKLSAgIC8vIFRHQl9OVFNDNzgwCi0gICB7Ci0gICAgICAweDMzLCAvLyBzaXplIG9mIHRhYmxlID0gNTEKLSAgICAgIDB4MGUsIDB4YzAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4ZTIsIDB4MDMsIDB4MTAsIDB4MDMsIDB4MDYsCi0gICAgICAweDEwLCAweDM0LCAweDEyLCAweDEyLCAweDY1LCAweDAyLCAweDEzLCAweDI0LCAweDE5LCAweDAwLAotICAgICAgMHgyNCwgMHgzOSwgMHgwMCwgMHg5NiwgMHg1OSwgMHgwOCwgMHg5MywgMHg4NSwgMHgwOCwgMHg5NywKLSAgICAgIDB4MDMsIDB4NTAsIDB4NTAsIDB4YWYsIDB4NDAsIDB4MzAsIDB4NWYsIDB4MDEsIDB4ZjEsIDB4N2YsCi0gICAgICAweDBkLCAweGYyLCAweDAzLCAweDExLCAweGYxLCAweDA1LCAweDM3LCAweDMwLCAweDg1LCAweDIxLCAweDUwCi0gICB9LAotICAgLy8gVEdCX05UU0M4NTgKLSAgIHsKLSAgICAgIDB4MzMsIC8vIHNpemUgb2YgdGFibGUgPSA1MQotICAgICAgMHgwYywgMHhjMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhjMiwgMHgwMywgMHgxMCwgMHgwMywgMHgwNiwKLSAgICAgIDB4MTAsIDB4MzQsIDB4MTIsIDB4MTIsIDB4NjUsIDB4MDIsIDB4MTMsIDB4MjQsIDB4MTksIDB4MDAsCi0gICAgICAweDI0LCAweDM5LCAweDAwLCAweDk2LCAweDU5LCAweDA4LCAweDkzLCAweDgzLCAweDA4LCAweDk3LAotICAgICAgMHgwMywgMHg1MCwgMHgzMCwgMHhjMCwgMHg0MCwgMHgzMCwgMHg4NiwgMHgwMSwgMHgwMSwgMHhhNiwKLSAgICAgIDB4MGQsIDB4NjIsIDB4MDMsIDB4MTEsIDB4NjEsIDB4MDUsIDB4MzcsIDB4MzAsIDB4YWMsIDB4MjEsIDB4NTAKLSAgIH0sCi0gICAvLyBUR0JfTlRTQzM5MgotICAgLy8gVGhpcyB0YWJsZSBoYXMgYmVlbiBtb2RpZmllZCB0byBiZSB1c2VkIGZvciBGdXNpb24gUmV2IEQKLSAgIHsKLSAgICAgIDB4MkEsIC8vIHNpemUgb2YgdGFibGUgPSA0MgotICAgICAgMHgwNiwgMHgwOCwgMHgwNCwgMHgwYSwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwOCwgMHgwMywgMHgyNCwKLSAgICAgIDB4MDgsIDB4MDcsIDB4MDIsIDB4OTAsIDB4MDIsIDB4MDgsIDB4MTAsIDB4MDQsIDB4MGMsIDB4MTAsCi0gICAgICAweDA1LCAweDJjLCAweDExLCAweDA0LCAweDU1LCAweDQ4LCAweDAwLCAweDA1LCAweDUwLCAweDAwLAotICAgICAgMHhiZiwgMHgwYywgMHgwMiwgMHgyZiwgMHgzZCwgMHgwMCwgMHgyZiwgMHgzZiwgMHgwMCwgMHhjMywKLSAgICAgIDB4MjAsIDB4MDAKLSAgIH0KLX07Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNhbWVyYSBzcGVjaWZpY2F0aW9ucwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXR5cGVkZWYgc3RydWN0IHRhZ19jYW1lcmFTcGVjCi17Ci0gICBTaWduYWxGb3JtYXQgc2lnbmFsOyAgICAgICAvLyB3aGljaCBkaWdpdGFsIHNpZ25hbCBmb3JtYXQgdGhlIGNhbWVyYSBoYXMKLSAgIFZpZGVvRm9ybWF0ICB2aWRGb3JtYXQ7ICAgIC8vIHZpZGVvIHN0YW5kYXJkCi0gICBTeW5jVmlkZW9SZWYgc3luY1JlZjsgICAgICAvLyB3aGljaCBzeW5jIHZpZGVvIHJlZmVyZW5jZSBpcyB1c2VkCi0gICBTdGF0ZSAgICAgICAgc3luY091dHB1dDsgICAvLyBlbmFibGUgc3luYyBvdXRwdXQgZm9yIHN5bmMgdmlkZW8gaW5wdXQ/Ci0gICBEZWNJbnB1dENsayAgaUNsazsgICAgICAgICAvLyB3aGljaCBpbnB1dCBjbG9jayBpcyB1c2VkCi0gICBUaW1lR2VuQnl0ZSAgdGdiOyAgICAgICAgICAvLyB3aGljaCB0aW1pbmcgZ2VuZXJhdG9yIGJ5dGUgZG9lcyB0aGUgY2FtZXJhIHVzZQotICAgaW50ICAgICAgICAgIEhSZXNldDsgICAgICAgLy8gc2VsZWN0IDY0LCA0OCwgMzIsIG9yIDE2IENMS3gxIGZvciBIUmVzZXQKLSAgIFBMTEZyZXEgICAgICBwbGxGcmVxOyAgICAgIC8vIHdoYXQgc3ludGhlc2l6ZWQgZnJlcXVlbmN5IHRvIHNldCBQTEwgdG8KLSAgIFZTSVpFUEFSTVMgICB2U2l6ZTsgICAgICAgIC8vIHZpZGVvIHNpemUgdGhlIGNhbWVyYSBwcm9kdWNlcwotICAgaW50ICAgICAgICAgIGxpbmVDb3VudDsgICAgLy8gZXhwZWN0ZWQgdG90YWwgbnVtYmVyIG9mIGhhbGYtbGluZSBwZXIgZnJhbWUgLSAxCi0gICBCT09MICAgICAgICAgaW50ZXJsYWNlOyAgICAvLyBpbnRlcmxhY2Ugc2lnbmFsPwotfSBDYW1lcmFTcGVjOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gPFVQREFURSBSRVFVSVJFRD4KLS8vIENhbWVyYSBzcGVjaWZpY2F0aW9ucyBkYXRhYmFzZS4gVXBkYXRlIHRoaXMgdGFibGUgd2hlbmV2ZXIgY2FtZXJhIHNwZWMKLS8vIGhhcyBiZWVuIGNoYW5nZWQgb3IgYWRkZWQvZGVsZXRlZCBzdXBwb3J0ZWQgY2FtZXJhIG1vZGVscwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXN0YXRpYyBDYW1lcmFTcGVjIGRiQ2FtZXJhU3BlY1sgTl9DQU1FUkFPUFRJT05TIF0gPQoteyAgLy8gU2lsaWNvbiBWaXNpb24gNTEyTgotICAgeyBTaWduYWxfQ0NJUjY1NiwgVkZvcm1hdF9OVFNDLCBWUmVmX2FsaWduZWRDYiwgT2ZmLCBEZWNDbGtfR1BDTEssIFRHQl9OVFNDNjI0LCA2NCwgS0h6MTk2MzYsCi0gICAgICAvLyBDbGt4MV9IQUNUSVZFLCBDbGt4MV9IREVMQVksIFZBY3RpdmUsIFZEZWxheSwgbGluZXNQZXJGaWVsZDsgbGluZUNvdW50LCBJbnRlcmxhY2UKLSAgIHsgICAgICAgICA1MTIsICAgICAgICAgICAweDY0LCAgICAgICA0ODAsICAgIDB4MTMsICAgICAgMjQwIH0sICAgICAgICAgMCwgICAgICAgVFJVRQotICAgfSwKLSAgIC8vIExvZ2l0ZWNoIFZpZGVvTWFuIDEuMwotICAgeyBTaWduYWxfQ0NJUjY1NiwgVkZvcm1hdF9OVFNDLCBWUmVmX2FsaWduZWRDYiwgT2ZmLCBEZWNDbGtfR1BDTEssIFRHQl9OVFNDNzgwLCA2NCwgS0h6MjQ1NDUsCi0gICAgICAvLyBDbGt4MV9IQUNUSVZFLCBDbGt4MV9IREVMQVksIFZBY3RpdmUsIFZEZWxheSwgbGluZXNQZXJGaWVsZDsgbGluZUNvdW50LCBJbnRlcmxhY2UKLSAgICAgIHsgICAgICA2NDAsICAgICAgICAgICAweDgwLCAgICAgICA0ODAsICAgIDB4MUEsICAgICAgMjQwIH0sICAgICAgICAgMCwgICAgICAgVFJVRQotICAgfSwKLSAgIC8vIFJvY2t3ZWxsIFF1YXJ0elNpZ2h0Ci0gICAvLyBOb3RlOiBGdXNpb24gUmV2IEQgKHJldiBJRCAweDAyKSBhbmQgbGF0ZXIgc3VwcG9ydHMgMTYgcGl4ZWxzIGZvciBIUmVzZXQgd2hpY2ggaXMgcHJlZmVyYWJsZS4KLSAgIC8vICAgICAgIFVzZSAzMiBmb3IgZWFybGllciB2ZXJzaW9uIG9mIGhhcmR3YXJlLiBDbGt4MV9IREVMQVkgYWxzbyBjaGFuZ2VkIGZyb20gMHgyNyB0byAweDIwLgotICAgeyBTaWduYWxfQ0NJUjY1NiwgVkZvcm1hdF9OVFNDLCBWUmVmX2FsaWduZWRDYiwgT2ZmLCBEZWNDbGtfR1BDTEssIFRHQl9OVFNDMzkyLCAxNiwgS0h6Mjg2MzYsCi0gICAgICAvLyBDbGt4MV9IQUNUSVZFLCBDbGt4MV9IREVMQVksIFZBY3RpdmUsIFZEZWxheSwgbGluZXNQZXJGaWVsZDsgbGluZUNvdW50LCBJbnRlcmxhY2UKLSAgICAgIHsgICAgICAzNTIsICAgICAgICAgICAweDIwLCAgICAgICA1NzYsICAgIDB4MDgsICAgICAgMjg4IH0sICAgICAgIDYwNywgICAgICAgRkFMU0UKLSAgIH0KLX07Ci0qLwotCi0vKgotVGhlIGNvcnJlc3BvbmRpbmcgQVBJcyByZXF1aXJlZCB0byBiZSBpbnZva2VkIGFyZToKLVNldENvbm5lY3RvciggQ29uQ2FtZXJhLCBUUlVFL0ZBTFNFICk7Ci1TZXRTaWduYWxGb3JtYXQoIHNwZWMuc2lnbmFsICk7Ci1TZXRWaWRlb0Zvcm1hdCggc3BlYy52aWRGb3JtYXQgKTsKLVNldFN5bmNWaWRlb1JlZiggc3BlYy5zeW5jUmVmICk7Ci1TZXRFbmFibGVTeW5jT3V0cHV0KCBzcGVjLnN5bmNPdXRwdXQgKTsKLVNldFRpbUdlbkJ5dGUoIFNSQU1UYWJsZVsgc3BlYy50Z2IgXSwgU1JBTVRhYmxlU2l6ZVsgc3BlYy50Z2IgXSApOwotU2V0SFJlc2V0KCBzcGVjLkhSZXNldCApOwotU2V0UExMKCBzcGVjLnBsbEZyZXEgKTsKLVNldERlY0lucHV0Q2xvY2soIHNwZWMuaUNsayApOwotU2V0VmlkZW9JbmZvKCBzcGVjLnZTaXplICk7Ci1TZXRUb3RhbExpbmVDb3VudCggc3BlYy5saW5lQ291bnQgKTsKLVNldEludGVybGFjZU1vZGUoIHNwZWMuaW50ZXJsYWNlICk7Ci0qLwotCi0vKiBmcm9tIHdlYjoKLSBWaWRlbyBTYW1wbGluZwotRGlnaXRhbCB2aWRlbyBpcyBhIHNhbXBsZWQgZm9ybSBvZiBhbmFsb2cgdmlkZW8uIFRoZSBtb3N0IGNvbW1vbiBzYW1wbGluZyBzY2hlbWVzIGluIHVzZSB0b2RheSBhcmU6Ci0JCSAgUGl4ZWwgQ2xvY2sgICBIb3JpeiAgICBIb3JpeiAgICBWZXJ0Ci0JCSAgIFJhdGUgICAgICAgICBUb3RhbCAgICBBY3RpdmUKLU5UU0Mgc3F1YXJlIHBpeGVsICAxMi4yNyBNSHogICAgNzgwICAgICAgNjQwICAgICAgNTI1Ci1OVFNDIENDSVItNjAxICAgICAgMTMuNSAgTUh6ICAgIDg1OCAgICAgIDcyMCAgICAgIDUyNQotTlRTQyA0RlNjICAgICAgICAgIDE0LjMyIE1IeiAgICA5MTAgICAgICA3NjggICAgICA1MjUKLVBBTCAgc3F1YXJlIHBpeGVsICAxNC43NSBNSHogICAgOTQ0ICAgICAgNzY4ICAgICAgNjI1Ci1QQUwgIENDSVItNjAxICAgICAgMTMuNSAgTUh6ICAgIDg2NCAgICAgIDcyMCAgICAgIDYyNQotUEFMICA0RlNjICAgICAgICAgIDE3LjcyIE1IeiAgIDExMzUgICAgICA5NDggICAgICA2MjUKLQotRm9yIHRoZSBDQ0lSLTYwMSBzdGFuZGFyZHMsIHRoZSBzYW1wbGluZyBpcyBiYXNlZCBvbiBhIHN0YXRpYyBvcnRob2dvbmFsIHNhbXBsaW5nIGdyaWQuIFRoZSBsdW1pbmFuY2UgY29tcG9uZW50IChZKSBpcyBzYW1wbGVkIGF0IDEzLjUgTUh6LCB3aGlsZSB0aGUgdHdvIGNvbG9yIGRpZmZlcmVuY2Ugc2lnbmFscywgQ3IgYW5kIENiIGFyZSBzYW1wbGVkIGF0IGhhbGYgdGhhdCwgb3IgNi43NSBNSHouIFRoZSBDciBhbmQgQ2Igc2FtcGxlcyBhcmUgY29sb2NhdGVkIHdpdGggYWx0ZXJuYXRlIFkgc2FtcGxlcywgYW5kIHRoZXkgYXJlIHRha2VuIGF0IHRoZSBzYW1lIHBvc2l0aW9uIG9uIGVhY2ggbGluZSwgc3VjaCB0aGF0IG9uZSBzYW1wbGUgaXMgY29pbmNpZGVudCB3aXRoIHRoZSA1MCUgcG9pbnQgb2YgdGhlIGZhbGxpbmcgZWRnZSBvZiBhbmFsb2cgc3luYy4gVGhlIHNhbXBsZXMgYXJlIGNvZGVkIHRvIGVpdGhlciA4IG9yIDEwIGJpdHMgcGVyIGNvbXBvbmVudC4KLSovCi0KLS8qIGZyb20gRFNjYWxlcjoqLwotLyoKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDQ0lSNjU2IERpZ2l0YWwgSW5wdXQgU3VwcG9ydDogVGhlIHRhYmxlcyB3ZXJlIHRha2VuIGZyb20gRFNjYWxlciBwcm95ZWN0Ci0vLwotLy8gMTMgRGVjIDIwMDAgLSBNaWNoYWVsIEVza2luLCBDb25leGFudCBTeXN0ZW1zIC0gSW5pdGlhbCB2ZXJzaW9uCi0vLwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gVGltaW5nIGdlbmVyYXRvciBTUkFNIHRhYmxlIHZhbHVlcyBmb3IgQ0NJUjYwMSA3MjB4NDgwIE5UU0MKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBGb3IgTlRTQyBDQ0lSNjU2Ci1CWVRFIEJ0Q2FyZDo6U1JBTVRhYmxlX05UU0NbXSA9Ci17Ci0gICAgLy8gU1JBTSBUaW1pbmcgVGFibGUgZm9yIE5UU0MKLSAgICAweDBjLCAweGMwLCAweDAwLAotICAgIDB4MDAsIDB4OTAsIDB4YzIsCi0gICAgMHgwMywgMHgxMCwgMHgwMywKLSAgICAweDA2LCAweDEwLCAweDM0LAotICAgIDB4MTIsIDB4MTIsIDB4NjUsCi0gICAgMHgwMiwgMHgxMywgMHgyNCwKLSAgICAweDE5LCAweDAwLCAweDI0LAotICAgIDB4MzksIDB4MDAsIDB4OTYsCi0gICAgMHg1OSwgMHgwOCwgMHg5MywKLSAgICAweDgzLCAweDA4LCAweDk3LAotICAgIDB4MDMsIDB4NTAsIDB4MzAsCi0gICAgMHhjMCwgMHg0MCwgMHgzMCwKLSAgICAweDg2LCAweDAxLCAweDAxLAotICAgIDB4YTYsIDB4MGQsIDB4NjIsCi0gICAgMHgwMywgMHgxMSwgMHg2MSwKLSAgICAweDA1LCAweDM3LCAweDMwLAotICAgIDB4YWMsIDB4MjEsIDB4NTAKLX07Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUaW1pbmcgZ2VuZXJhdG9yIFNSQU0gdGFibGUgdmFsdWVzIGZvciBDQ0lSNjAxIDcyMHg1NzYgTlRTQwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEZvciBQQUwgQ0NJUjY1NgotQllURSBCdENhcmQ6OlNSQU1UYWJsZV9QQUxbXSA9Ci17Ci0gICAgLy8gU1JBTSBUaW1pbmcgVGFibGUgZm9yIFBBTAotICAgIDB4MzYsIDB4MTEsIDB4MDEsCi0gICAgMHgwMCwgMHg5MCwgMHgwMiwKLSAgICAweDA1LCAweDEwLCAweDA0LAotICAgIDB4MTYsIDB4MTQsIDB4MDUsCi0gICAgMHgxMSwgMHgwMCwgMHgwNCwKLSAgICAweDEyLCAweGMwLCAweDAwLAotICAgIDB4MzEsIDB4MDAsIDB4MDYsCi0gICAgMHg1MSwgMHgwOCwgMHgwMywKLSAgICAweDg5LCAweDA4LCAweDA3LAotICAgIDB4YzAsIDB4NDQsIDB4MDAsCi0gICAgMHg4MSwgMHgwMSwgMHgwMSwKLSAgICAweGE5LCAweDBkLCAweDAyLAotICAgIDB4MDIsIDB4NTAsIDB4MDMsCi0gICAgMHgzNywgMHgzZCwgMHgwMCwKLSAgICAweGFmLCAweDIxLCAweDAwLAotfTsKLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCmluZGV4IDEzNzQyYjAuLmQyNGRjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCkBAIC00NCw3ICs0NCw2IEBACiAKIC8qIGZ3ZCBkZWNsICovCiBzdGF0aWMgdm9pZCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbik7Ci1zdGF0aWMgdm9pZCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpOwogc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKIHN0YXRpYyB2b2lkIGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CiBzdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYsIGNvbnN0IHU4IGVlWzI1Nl0pOwpAQCAtMjIxNyw5ICsyMjE2LDkgQEAKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCX0sCi0JW0JUVFZfQk9BUkRfVkQwMDlYMV9NSU5JRElOXSA9IHsKKwlbQlRUVl9CT0FSRF9WRDAwOVgxX1ZEMDExX01JTklESU5dID0gewogCQkvKiBNLktsYWhyQHBoeXRlYy5kZSAqLwotCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBNaW5pRElOIChidDg3OCkiLAorCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBWRC0wMTEgTWluaURJTiAoYnQ4NzgpIiwKIAkJLnZpZGVvX2lucHV0cyAgID0gNCwKIAkJLmF1ZGlvX2lucHV0cyAgID0gMCwKIAkJLnR1bmVyICAgICAgICAgID0gVU5TRVQsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCkBAIC0yMjI3LDE0ICsyMjI2LDE0IEBACiAJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCiAJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KLQkJLm5lZWRzX3R2YXVkaW8gID0gMSwKKwkJLm5lZWRzX3R2YXVkaW8gID0gMCwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCX0sCi0JW0JUVFZfQk9BUkRfVkQwMDlYMV9DT01CSV0gPSB7Ci0JCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIENvbWJpIChidDg3OCkiLAorCVtCVFRWX0JPQVJEX1ZEMDA5WDFfVkQwMTFfQ09NQkldID0geworCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOS1YMSBWRC0wMTEgQ29tYmkgKGJ0ODc4KSIsCiAJCS52aWRlb19pbnB1dHMgICA9IDQsCiAJCS5hdWRpb19pbnB1dHMgICA9IDAsCiAJCS50dW5lciAgICAgICAgICA9IFVOU0VULCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwpAQCAtMjI0Miw3ICsyMjQxLDcgQEAKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKIAkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCiAJCS5ncGlvbXV4ICAgICAgICA9IHsgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwotCQkubmVlZHNfdHZhdWRpbyAgPSAxLAorCQkubmVlZHNfdHZhdWRpbyAgPSAwLAogCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCkBAIC0zMDYxLDYgKzMwNjAsNTQgQEAKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkuaGFzX3JhZGlvICAgICAgPSAxLAogCQkuaGFzX3JlbW90ZSAgICAgPSAxLAorCX0sCisJCVtCVFRWX0JPQVJEX1ZEMDEyXSA9IHsKKwkJLyogRC5IZWVyQFBoeXRlYy5kZSAqLworCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAxMiAoYnQ4NzgpIiwKKwkJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkJLnR1bmVyICAgICAgICAgID0gVU5TRVQsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCisJCS5zdmhzICAgICAgICAgICA9IFVOU0VULCAvKiBjYXJkIGhhcyBubyBzLXZpZGVvICovCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCisJCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMiwgMywgMSB9LAorCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KKwkJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCX0sCisJCVtCVFRWX0JPQVJEX1ZEMDEyX1gxXSA9IHsKKwkJLyogRC5IZWVyQFBoeXRlYy5kZSAqLworCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAxMi1YMSAoYnQ4NzgpIiwKKwkJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkJLnR1bmVyICAgICAgICAgID0gVU5TRVQsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCisJCS5zdmhzICAgICAgICAgICA9IDMsCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCisJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAorCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KKwkJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCX0sCisJCVtCVFRWX0JPQVJEX1ZEMDEyX1gyXSA9IHsKKwkJLyogRC5IZWVyQFBoeXRlYy5kZSAqLworCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAxMi1YMiAoYnQ4NzgpIiwKKwkJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkJLmF1ZGlvX2lucHV0cyAgID0gMCwKKwkJLnR1bmVyICAgICAgICAgID0gVU5TRVQsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCisJCS5zdmhzICAgICAgICAgICA9IDMsCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCisJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMiwgMSB9LAorCQkuZ3Bpb211eCAgICAgICAgPSB7IDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KKwkJLm5lZWRzX3R2YXVkaW8gID0gMCwKKwkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAogCX0KIH07CiAKQEAgLTM2NzMsMTMgKzM3MjAsNiBAQAogCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX21vZGVfZ3BpbykKIAkJYnR2LT5hdWRpb19tb2RlX2dwaW89YnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19tb2RlX2dwaW87CiAKLQlpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5kaWdpdGFsX21vZGUgPT0gRElHSVRBTF9NT0RFX0NBTUVSQSkgewotCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KLQkJaWYgKChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQUREUl9CVDgzMl9BTFQxLCAiQnQ4MzIiKSA+PTApIHx8Ci0JCSAgICAoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0FERFJfQlQ4MzJfQUxUMiwgIkJ0ODMyIikgPj0wKSkKLQkJCWJvb3RfYnQ4MzIoYnR2KTsKLQl9Ci0KIAlpZiAoIWF1dG9sb2FkKQogCQlyZXR1cm47CiAKQEAgLTQwNzUsMTAgKzQxMTUsNiBAQAogCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KQotewotfQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLwogLyogIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHByb2NlZHVyZSBhcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKaW5kZXggZGNlNmRhZS4uNzRjMzI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCkBAIC00Miw3ICs0Miw3IEBACiAJc3RydWN0IGJ0dHZfc3ViX2RyaXZlciAqc3ViID0gdG9fYnR0dl9zdWJfZHJ2KGRydik7CiAJaW50IGxlbiA9IHN0cmxlbihzdWItPndhbnRlZCk7CiAKLQlpZiAoMCA9PSBzdHJuY21wKGRldi0+YnVzX2lkLCBzdWItPndhbnRlZCwgbGVuKSkKKwlpZiAoMCA9PSBzdHJuY21wKGRldl9uYW1lKGRldiksIHN1Yi0+d2FudGVkLCBsZW4pKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTkxLDE1ICs5MSwxNCBAQAogCXN1Yi0+ZGV2LnBhcmVudCAgPSAmY29yZS0+cGNpLT5kZXY7CiAJc3ViLT5kZXYuYnVzICAgICA9ICZidHR2X3N1Yl9idXNfdHlwZTsKIAlzdWItPmRldi5yZWxlYXNlID0gcmVsZWFzZV9zdWJfZGV2aWNlOwotCXNucHJpbnRmKHN1Yi0+ZGV2LmJ1c19pZCxzaXplb2Yoc3ViLT5kZXYuYnVzX2lkKSwiJXMlZCIsCi0JCSBuYW1lLCBjb3JlLT5ucik7CisJZGV2X3NldF9uYW1lKCZzdWItPmRldiwgIiVzJWQiLCBuYW1lLCBjb3JlLT5ucik7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnN1Yi0+ZGV2KTsKIAlpZiAoMCAhPSBlcnIpIHsKIAkJa2ZyZWUoc3ViKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JcHJpbnRrKCJidHR2JWQ6IGFkZCBzdWJkZXZpY2UgXCIlc1wiXG4iLCBjb3JlLT5uciwgc3ViLT5kZXYuYnVzX2lkKTsKKwlwcmludGsoImJ0dHYlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBkZXZfbmFtZSgmc3ViLT5kZXYpKTsKIAlsaXN0X2FkZF90YWlsKCZzdWItPmxpc3QsJmNvcmUtPnN1YnMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAppbmRleCA0NmNiOTBlLi41MjliZjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaApAQCAtMTMwLDggKzEzMCw4IEBACiAjZGVmaW5lIEJUVFZfQk9BUkRfWEdVQVJEICAgICAgICAgICAgICAgICAgMHg2NwogI2RlZmluZSBCVFRWX0JPQVJEX05FQlVMQV9ESUdJVFYgICAgICAgICAgIDB4NjgKICNkZWZpbmUgQlRUVl9CT0FSRF9QVjE0MyAgICAgICAgICAgICAgICAgICAweDY5Ci0jZGVmaW5lIEJUVFZfQk9BUkRfVkQwMDlYMV9NSU5JRElOICAgICAgICAgMHg2YQotI2RlZmluZSBCVFRWX0JPQVJEX1ZEMDA5WDFfQ09NQkkgICAgICAgICAgIDB4NmIKKyNkZWZpbmUgQlRUVl9CT0FSRF9WRDAwOVgxX1ZEMDExX01JTklESU4gICAweDZhCisjZGVmaW5lIEJUVFZfQk9BUkRfVkQwMDlYMV9WRDAxMV9DT01CSSAgICAgMHg2YgogI2RlZmluZSBCVFRWX0JPQVJEX1ZEMDA5X01JTklESU4gICAgICAgICAgIDB4NmMKICNkZWZpbmUgQlRUVl9CT0FSRF9WRDAwOV9DT01CSSAgICAgICAgICAgICAweDZkCiAjZGVmaW5lIEJUVFZfQk9BUkRfSVZDMTAwICAgICAgICAgICAgICAgICAgMHg2ZQpAQCAtMTc3LDYgKzE3NywxMCBAQAogI2RlZmluZSBCVFRWX0JPQVJEX0dFT1ZJU0lPTl9HVjYwMAkgICAweDk2CiAjZGVmaW5lIEJUVFZfQk9BUkRfS09aVU1JX0tUVl8wMUMgICAgICAgICAgMHg5NwogI2RlZmluZSBCVFRWX0JPQVJEX0VOTFRWX0ZNXzIJCSAgIDB4OTgKKyNkZWZpbmUgQlRUVl9CT0FSRF9WRDAxMgkJICAgMHg5OQorI2RlZmluZSBCVFRWX0JPQVJEX1ZEMDEyX1gxCQkgICAweDlhCisjZGVmaW5lIEJUVFZfQk9BUkRfVkQwMTJfWDIJCSAgIDB4OWIKKwogCiAvKiBtb3JlIGNhcmQtc3BlY2lmaWMgZGVmaW5lcyAqLwogI2RlZmluZSBQVDIyNTRfTF9DSEFOTkVMIDB4MTAKQEAgLTMwOCw3ICszMTIsNyBAQAogCiBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAgIGRydjsKLQljaGFyICAgICAgICAgICAgICAgICAgIHdhbnRlZFtCVVNfSURfU0laRV07CisJY2hhciAgICAgICAgICAgICAgICAgICB3YW50ZWRbMjBdOwogCWludCAgICAgICAgICAgICAgICAgICAgKCpwcm9iZSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICgqcmVtb3ZlKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAppbmRleCBiNGQ5NDBiLi4xOTlhNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCkBAIC00NTksNyArNDU5LDcgQEAKIH07CiAKIC8qIG91ciBkZXZpY2VzICovCi0jZGVmaW5lIEJUVFZfTUFYIDE2CisjZGVmaW5lIEJUVFZfTUFYIDMyCiBleHRlcm4gdW5zaWduZWQgaW50IGJ0dHZfbnVtOwogZXh0ZXJuIHN0cnVjdCBidHR2IGJ0dHZzW0JUVFZfTUFYXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYwppbmRleCBhY2U0ZmY5Li4xN2Y4MGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYwpAQCAtNzA2LDggKzcwNiw3IEBACiAgKglWaWRlbzRsaW51eCBpbnRlcmZhY2luZwogICovCiAKLXN0YXRpYyBpbnQgcWNhbV9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHFjYW1fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbT0oc3RydWN0IHFjYW1fZGV2aWNlICopZGV2OwpAQCAtODY3LDcgKzg2Niw3IEBACiBzdGF0aWMgaW50IHFjYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcWNhbV9kb19pb2N0bCk7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBxY2FtX2RvX2lvY3RsKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcWNhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKaW5kZXggMGY5MzBkMy4uMjFjNzFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCkBAIC01MDAsOCArNTAwLDcgQEAKICAqCVZpZGVvNGxpbnV4IGludGVyZmFjaW5nCiAgKi8KIAotc3RhdGljIGludCBxY2FtX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgcWNhbV9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtPShzdHJ1Y3QgcWNhbV9kZXZpY2UgKilkZXY7CkBAIC02NjcsOSArNjY2LDkgQEAKIH0KIAogc3RhdGljIGludCBxY2FtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBxY2FtX2RvX2lvY3RsKTsKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIHFjYW1fZG9faW9jdGwpOwogfQogCiBzdGF0aWMgc3NpemVfdCBxY2FtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NvbXBhdF9pb2N0bDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NvbXBhdF9pb2N0bDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTg1YTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jb21wYXRfaW9jdGwzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTM1ICswLDAgQEAKLS8qCi0gKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KLSAqCVNlcGFyYXRlZCBmcm9tIGZzIHN0dWZmIGJ5IEFybmQgQmVyZ21hbm4gPGFybmRAYXJuZGIuZGU+Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQotICogQ29weXJpZ2h0IChDKSAxOTk4ICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBBbmRpIEtsZWVuLCBTdVNFIExhYnMKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgUGhpbGlwcGUgRGUgTXV5dGVyIChwaGRtQG1hY3FlbC5iZSkKLSAqCi0gKiBUaGVzZSByb3V0aW5lcyBtYWludGFpbiBhcmd1bWVudCBzaXplIGNvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQKLSAqIGlvY3Rscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotc3RydWN0IHZpZGVvX3R1bmVyMzIgewotCWNvbXBhdF9pbnRfdCB0dW5lcjsKLQljaGFyIG5hbWVbMzJdOwotCWNvbXBhdF91bG9uZ190IHJhbmdlbG93LCByYW5nZWhpZ2g7Ci0JdTMyIGZsYWdzOwkvKiBJdCBpcyByZWFsbHkgdTMyIGluIHZpZGVvZGV2LmggKi8KLQl1MTYgbW9kZSwgc2lnbmFsOwotfTsKLQotc3RhdGljIGludCBnZXRfdmlkZW9fdHVuZXIzMihzdHJ1Y3QgdmlkZW9fdHVuZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMiBfX3VzZXIgKnVwKQotewotCWlmKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3R1bmVyMzIpKSB8fAotCQlnZXRfdXNlcihrcC0+dHVuZXIsICZ1cC0+dHVuZXIpIHx8Ci0JCWNvcHlfZnJvbV91c2VyKGtwLT5uYW1lLCB1cC0+bmFtZSwgMzIpIHx8Ci0JCWdldF91c2VyKGtwLT5yYW5nZWxvdywgJnVwLT5yYW5nZWxvdykgfHwKLQkJZ2V0X3VzZXIoa3AtPnJhbmdlaGlnaCwgJnVwLT5yYW5nZWhpZ2gpIHx8Ci0JCWdldF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykgfHwKLQkJZ2V0X3VzZXIoa3AtPm1vZGUsICZ1cC0+bW9kZSkgfHwKLQkJZ2V0X3VzZXIoa3AtPnNpZ25hbCwgJnVwLT5zaWduYWwpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXRfdmlkZW9fdHVuZXIzMihzdHJ1Y3QgdmlkZW9fdHVuZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMiBfX3VzZXIgKnVwKQotewotCWlmKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb190dW5lcjMyKSkgfHwKLQkJcHV0X3VzZXIoa3AtPnR1bmVyLCAmdXAtPnR1bmVyKSB8fAotCQljb3B5X3RvX3VzZXIodXAtPm5hbWUsIGtwLT5uYW1lLCAzMikgfHwKLQkJcHV0X3VzZXIoa3AtPnJhbmdlbG93LCAmdXAtPnJhbmdlbG93KSB8fAotCQlwdXRfdXNlcihrcC0+cmFuZ2VoaWdoLCAmdXAtPnJhbmdlaGlnaCkgfHwKLQkJcHV0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSB8fAotCQlwdXRfdXNlcihrcC0+bW9kZSwgJnVwLT5tb2RlKSB8fAotCQlwdXRfdXNlcihrcC0+c2lnbmFsLCAmdXAtPnNpZ25hbCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdHJ1Y3QgdmlkZW9fYnVmZmVyMzIgewotCWNvbXBhdF9jYWRkcl90IGJhc2U7Ci0JY29tcGF0X2ludF90IGhlaWdodCwgd2lkdGgsIGRlcHRoLCBieXRlc3BlcmxpbmU7Ci19OwotCi1zdGF0aWMgaW50IGdldF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCi17Ci0JdTMyIHRtcDsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIzMikpIHx8Ci0JCWdldF91c2VyKHRtcCwgJnVwLT5iYXNlKSB8fAotCQlnZXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCkgfHwKLQkJZ2V0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKSB8fAotCQlnZXRfdXNlcihrcC0+ZGVwdGgsICZ1cC0+ZGVwdGgpIHx8Ci0JCWdldF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JLyogVGhpcyBpcyBhY3R1YWxseSBhIHBoeXNpY2FsIGFkZHJlc3Mgc3RvcmVkCi0JICogYXMgYSB2b2lkIHBvaW50ZXIuCi0JICovCi0Ja3AtPmJhc2UgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSB0bXA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXRfdmlkZW9fYnVmZmVyMzIoc3RydWN0IHZpZGVvX2J1ZmZlciAqa3AsIHN0cnVjdCB2aWRlb19idWZmZXIzMiBfX3VzZXIgKnVwKQotewotCXUzMiB0bXAgPSAodTMyKSgodW5zaWduZWQgbG9uZylrcC0+YmFzZSk7Ci0KLQlpZighYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIpKSB8fAotCQlwdXRfdXNlcih0bXAsICZ1cC0+YmFzZSkgfHwKLQkJcHV0X3VzZXIoa3AtPmhlaWdodCwgJnVwLT5oZWlnaHQpIHx8Ci0JCXB1dF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCkgfHwKLQkJcHV0X3VzZXIoa3AtPmRlcHRoLCAmdXAtPmRlcHRoKSB8fAotCQlwdXRfdXNlcihrcC0+Ynl0ZXNwZXJsaW5lLCAmdXAtPmJ5dGVzcGVybGluZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHZpZGVvX2NsaXAzMiB7Ci0JczMyIHgsIHksIHdpZHRoLCBoZWlnaHQ7CS8qIEl0cyByZWFsbHkgczMyIGluIHZpZGVvZGV2LmggKi8KLQljb21wYXRfY2FkZHJfdCBuZXh0OwotfTsKLQotc3RydWN0IHZpZGVvX3dpbmRvdzMyIHsKLQl1MzIgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2hyb21ha2V5LCBmbGFnczsKLQljb21wYXRfY2FkZHJfdCBjbGlwczsKLQljb21wYXRfaW50X3QgY2xpcGNvdW50OwotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IG5hdGl2ZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJldCA9IC1FTk9JT0NUTENNRDsKLQotCWlmIChmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkKLQkJcmV0ID0gZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCWVsc2UgaWYgKGZpbGUtPmZfb3AtPmlvY3RsKSB7Ci0JCWxvY2tfa2VybmVsKCk7Ci0JCXJldCA9IGZpbGUtPmZfb3AtPmlvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotLyogWW91IGdldCBiYWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjbGlwcy4uLiAqLwotc3RhdGljIGludCBwdXRfdmlkZW9fd2luZG93MzIoc3RydWN0IHZpZGVvX3dpbmRvdyAqa3AsIHN0cnVjdCB2aWRlb193aW5kb3czMiBfX3VzZXIgKnVwKQotewotCWlmKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb193aW5kb3czMikpIHx8Ci0JCXB1dF91c2VyKGtwLT54LCAmdXAtPngpIHx8Ci0JCXB1dF91c2VyKGtwLT55LCAmdXAtPnkpIHx8Ci0JCXB1dF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCkgfHwKLQkJcHV0X3VzZXIoa3AtPmhlaWdodCwgJnVwLT5oZWlnaHQpIHx8Ci0JCXB1dF91c2VyKGtwLT5jaHJvbWFrZXksICZ1cC0+Y2hyb21ha2V5KSB8fAotCQlwdXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8Ci0JCXB1dF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0cnVjdCB2NGwyX2NsaXAzMgotewotCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGM7Ci0JY29tcGF0X2NhZGRyX3QgCQluZXh0OwotfTsKLQotc3RydWN0IHY0bDJfd2luZG93MzIKLXsKLQlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICB3OwotCWVudW0gdjRsMl9maWVsZCAgCWZpZWxkOwotCV9fdTMyCQkJY2hyb21ha2V5OwotCWNvbXBhdF9jYWRkcl90CQljbGlwczsgLyogYWN0dWFsbHkgc3RydWN0IHY0bDJfY2xpcDMyICogKi8KLQlfX3UzMgkJCWNsaXBjb3VudDsKLQljb21wYXRfY2FkZHJfdAkJYml0bWFwOwotfTsKLQotc3RhdGljIGludCBnZXRfdjRsMl93aW5kb3czMihzdHJ1Y3QgdjRsMl93aW5kb3cgKmtwLCBzdHJ1Y3QgdjRsMl93aW5kb3czMiBfX3VzZXIgKnVwKQotewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3dpbmRvdzMyKSkgfHwKLQkJY29weV9mcm9tX3VzZXIoJmtwLT53LCAmdXAtPncsIHNpemVvZih1cC0+dykpIHx8Ci0JCWdldF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKLQkJZ2V0X3VzZXIoa3AtPmNocm9tYWtleSwgJnVwLT5jaHJvbWFrZXkpIHx8Ci0JCWdldF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCWlmIChrcC0+Y2xpcGNvdW50ID4gMjA0OCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGtwLT5jbGlwY291bnQpIHsKLQkJc3RydWN0IHY0bDJfY2xpcDMyIF9fdXNlciAqdWNsaXBzOwotCQlzdHJ1Y3QgdjRsMl9jbGlwIF9fdXNlciAqa2NsaXBzOwotCQlpbnQgbiA9IGtwLT5jbGlwY291bnQ7Ci0JCWNvbXBhdF9jYWRkcl90IHA7Ci0KLQkJaWYgKGdldF91c2VyKHAsICZ1cC0+Y2xpcHMpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXVjbGlwcyA9IGNvbXBhdF9wdHIocCk7Ci0JCWtjbGlwcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG4gKiBzaXplb2Yoc3RydWN0IHY0bDJfY2xpcCkpOwotCQlrcC0+Y2xpcHMgPSBrY2xpcHM7Ci0JCXdoaWxlICgtLW4gPj0gMCkgewotCQkJaWYgKGNvcHlfaW5fdXNlcigma2NsaXBzLT5jLCAmdWNsaXBzLT5jLCBzaXplb2YodWNsaXBzLT5jKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAocHV0X3VzZXIobiA/IGtjbGlwcyArIDEgOiBOVUxMLCAma2NsaXBzLT5uZXh0KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXVjbGlwcyArPSAxOwotCQkJa2NsaXBzICs9IDE7Ci0JCX0KLQl9IGVsc2UKLQkJa3AtPmNsaXBzID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXRfdjRsMl93aW5kb3czMihzdHJ1Y3QgdjRsMl93aW5kb3cgKmtwLCBzdHJ1Y3QgdjRsMl93aW5kb3czMiBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X3RvX3VzZXIoJnVwLT53LCAma3AtPncsIHNpemVvZih1cC0+dykpIHx8Ci0JCXB1dF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKLQkJcHV0X3VzZXIoa3AtPmNocm9tYWtleSwgJnVwLT5jaHJvbWFrZXkpIHx8Ci0JCXB1dF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRfdjRsMl9waXhfZm9ybWF0KHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IF9fdXNlciAqdXApCi17Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB1dF92NGwyX3BpeF9mb3JtYXQoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgX191c2VyICp1cCkKLXsKLQlpZiAoY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX3ZiaV9mb3JtYXQoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgX191c2VyICp1cCkKLXsKLQlpZiAoY29weV9mcm9tX3VzZXIoa3AsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHV0X3Y0bDJfdmJpX2Zvcm1hdChzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHY0bDJfZm9ybWF0MzIKLXsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKLQl1bmlvbgotCXsKLQkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAlwaXg7ICAvLyBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUKLQkJc3RydWN0IHY0bDJfd2luZG93MzIJd2luOyAgLy8gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZCi0JCXN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQJdmJpOyAgLy8gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRQotCQlfX3U4CXJhd19kYXRhWzIwMF07ICAgICAgICAvLyB1c2VyLWRlZmluZWQKLQl9IGZtdDsKLX07Ci0KLXN0YXRpYyBpbnQgZ2V0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKLXsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQzMikpIHx8Ci0JCQlnZXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCXN3aXRjaCAoa3AtPnR5cGUpIHsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJcmV0dXJuIGdldF92NGwyX3BpeF9mb3JtYXQoJmtwLT5mbXQucGl4LCAmdXAtPmZtdC5waXgpOwotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgotCQlyZXR1cm4gZ2V0X3Y0bDJfd2luZG93MzIoJmtwLT5mbXQud2luLCAmdXAtPmZtdC53aW4pOwotCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKLQkJcmV0dXJuIGdldF92NGwyX3ZiaV9mb3JtYXQoJmtwLT5mbXQudmJpLCAmdXAtPmZtdC52YmkpOwotCWRlZmF1bHQ6Ci0JCXByaW50aygiY29tcGF0X2lvY3RsIDogdW5leHBlY3RlZCBWSURJT0NfRk1UIHR5cGUgJWRcbiIsCi0JCQkJCQkJCWtwLT50eXBlKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcHV0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKLXsKLQlpZighYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQzMikpIHx8Ci0JCXB1dF91c2VyKGtwLT50eXBlLCAmdXAtPnR5cGUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzd2l0Y2ggKGtwLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCXJldHVybiBwdXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LnBpeCwgJnVwLT5mbXQucGl4KTsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKLQkJcmV0dXJuIHB1dF92NGwyX3dpbmRvdzMyKCZrcC0+Zm10LndpbiwgJnVwLT5mbXQud2luKTsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6Ci0JCXJldHVybiBwdXRfdjRsMl92YmlfZm9ybWF0KCZrcC0+Zm10LnZiaSwgJnVwLT5mbXQudmJpKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOWElPOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X3Y0bDJfc3RhbmRhcmQoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl9zdGFuZGFyZChzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqa3AsIHN0cnVjdCB2NGwyX3N0YW5kYXJkIF9fdXNlciAqdXApCi17Ci0JaWYgKGNvcHlfdG9fdXNlcih1cCwga3AsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHY0bDJfc3RhbmRhcmQzMgotewotCV9fdTMyCQkgICAgIGluZGV4OwotCV9fdTMyCQkgICAgIGlkWzJdOyAvKiBfX3U2NCB3b3VsZCBnZXQgdGhlIGFsaWdubWVudCB3cm9uZyAqLwotCV9fdTgJCSAgICAgbmFtZVsyNF07Ci0Jc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLwotCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7Ci0JX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Ci19OwotCi1zdGF0aWMgaW50IGdldF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCi17Ci0JLyogb3RoZXIgZmllbGRzIGFyZSBub3Qgc2V0IGJ5IHRoZSB1c2VyLCBub3IgdXNlZCBieSB0aGUgZHJpdmVyICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQzMikpIHx8Ci0JCWdldF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB1dF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCi17Ci0JaWYoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQzMikpIHx8Ci0JCXB1dF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkgfHwKLQkJY29weV90b191c2VyKHVwLT5pZCwgJmtwLT5pZCwgc2l6ZW9mKF9fdTY0KSkgfHwKLQkJY29weV90b191c2VyKHVwLT5uYW1lLCBrcC0+bmFtZSwgMjQpIHx8Ci0JCWNvcHlfdG9fdXNlcigmdXAtPmZyYW1lcGVyaW9kLCAma3AtPmZyYW1lcGVyaW9kLCBzaXplb2Yoa3AtPmZyYW1lcGVyaW9kKSkgfHwKLQkJcHV0X3VzZXIoa3AtPmZyYW1lbGluZXMsICZ1cC0+ZnJhbWVsaW5lcykgfHwKLQkJY29weV90b191c2VyKHVwLT5yZXNlcnZlZCwga3AtPnJlc2VydmVkLCA0ICogc2l6ZW9mKF9fdTMyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X3Y0bDJfdHVuZXIoc3RydWN0IHY0bDJfdHVuZXIgKmtwLCBzdHJ1Y3QgdjRsMl90dW5lciBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl90dW5lcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl90dW5lcihzdHJ1Y3QgdjRsMl90dW5lciAqa3AsIHN0cnVjdCB2NGwyX3R1bmVyIF9fdXNlciAqdXApCi17Ci0JaWYgKGNvcHlfdG9fdXNlcih1cCwga3AsIHNpemVvZihzdHJ1Y3QgdjRsMl90dW5lcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHY0bDJfYnVmZmVyMzIKLXsKLQlfX3UzMgkJCWluZGV4OwotCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7Ci0JX191MzIJCQlieXRlc3VzZWQ7Ci0JX191MzIJCQlmbGFnczsKLQllbnVtIHY0bDJfZmllbGQJCWZpZWxkOwotCXN0cnVjdCBjb21wYXRfdGltZXZhbAl0aW1lc3RhbXA7Ci0Jc3RydWN0IHY0bDJfdGltZWNvZGUJdGltZWNvZGU7Ci0JX191MzIJCQlzZXF1ZW5jZTsKLQotCS8qIG1lbW9yeSBsb2NhdGlvbiAqLwotCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKLQl1bmlvbiB7Ci0JCV9fdTMyICAgICAgICAgICBvZmZzZXQ7Ci0JCWNvbXBhdF9sb25nX3QgICB1c2VycHRyOwotCX0gbTsKLQlfX3UzMgkJCWxlbmd0aDsKLQlfX3UzMgkJCWlucHV0OwotCV9fdTMyCQkJcmVzZXJ2ZWQ7Ci19OwotCi1zdGF0aWMgaW50IGdldF92NGwyX2J1ZmZlcjMyKHN0cnVjdCB2NGwyX2J1ZmZlciAqa3AsIHN0cnVjdCB2NGwyX2J1ZmZlcjMyIF9fdXNlciAqdXApCi17Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIzMikpIHx8Ci0JCWdldF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkgfHwKLQkJZ2V0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkgfHwKLQkJZ2V0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSB8fAotCQlnZXRfdXNlcihrcC0+bWVtb3J5LCAmdXAtPm1lbW9yeSkgfHwKLQkJZ2V0X3VzZXIoa3AtPmlucHV0LCAmdXAtPmlucHV0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCXN3aXRjaChrcC0+bWVtb3J5KSB7Ci0JY2FzZSBWNEwyX01FTU9SWV9NTUFQOgotCQlicmVhazsKLQljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6Ci0JCXsKLQkJY29tcGF0X2xvbmdfdCB0bXA7Ci0KLQkJaWYgKGdldF91c2VyKGtwLT5sZW5ndGgsICZ1cC0+bGVuZ3RoKSB8fAotCQkgICAgZ2V0X3VzZXIodG1wLCAmdXAtPm0udXNlcnB0cikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlrcC0+bS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cih0bXApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9NRU1PUllfT1ZFUkxBWToKLQkJaWYoZ2V0X3VzZXIoa3AtPm0ub2Zmc2V0LCAmdXAtPm0ub2Zmc2V0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHV0X3Y0bDJfYnVmZmVyMzIoc3RydWN0IHY0bDJfYnVmZmVyICprcCwgc3RydWN0IHY0bDJfYnVmZmVyMzIgX191c2VyICp1cCkKLXsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyMzIpKSB8fAotCQlwdXRfdXNlcihrcC0+aW5kZXgsICZ1cC0+aW5kZXgpIHx8Ci0JCXB1dF91c2VyKGtwLT50eXBlLCAmdXAtPnR5cGUpIHx8Ci0JCXB1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykgfHwKLQkJcHV0X3VzZXIoa3AtPm1lbW9yeSwgJnVwLT5tZW1vcnkpIHx8Ci0JCXB1dF91c2VyKGtwLT5pbnB1dCwgJnVwLT5pbnB1dCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQlzd2l0Y2goa3AtPm1lbW9yeSkgewotCWNhc2UgVjRMMl9NRU1PUllfTU1BUDoKLQkJaWYgKHB1dF91c2VyKGtwLT5sZW5ndGgsICZ1cC0+bGVuZ3RoKSB8fAotCQkJcHV0X3VzZXIoa3AtPm0ub2Zmc2V0LCAmdXAtPm0ub2Zmc2V0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6Ci0JCWlmIChwdXRfdXNlcihrcC0+bGVuZ3RoLCAmdXAtPmxlbmd0aCkgfHwKLQkJCXB1dF91c2VyKGtwLT5tLnVzZXJwdHIsICZ1cC0+bS51c2VycHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIFY0TDJfTUVNT1JZX09WRVJMQVk6Ci0JCWlmIChwdXRfdXNlcihrcC0+bS5vZmZzZXQsICZ1cC0+bS5vZmZzZXQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQlpZiAocHV0X3VzZXIoa3AtPmJ5dGVzdXNlZCwgJnVwLT5ieXRlc3VzZWQpIHx8Ci0JCXB1dF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKLQkJcHV0X3VzZXIoa3AtPnRpbWVzdGFtcC50dl9zZWMsICZ1cC0+dGltZXN0YW1wLnR2X3NlYykgfHwKLQkJcHV0X3VzZXIoa3AtPnRpbWVzdGFtcC50dl91c2VjLCAmdXAtPnRpbWVzdGFtcC50dl91c2VjKSB8fAotCQljb3B5X3RvX3VzZXIoJnVwLT50aW1lY29kZSwgJmtwLT50aW1lY29kZSwgc2l6ZW9mKHN0cnVjdCB2NGwyX3RpbWVjb2RlKSkgfHwKLQkJcHV0X3VzZXIoa3AtPnNlcXVlbmNlLCAmdXAtPnNlcXVlbmNlKSB8fAotCQlwdXRfdXNlcihrcC0+cmVzZXJ2ZWQsICZ1cC0+cmVzZXJ2ZWQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIKLXsKLQlfX3UzMgkJCWNhcGFiaWxpdHk7Ci0JX191MzIJCQlmbGFnczsKLQljb21wYXRfY2FkZHJfdCAJCWJhc2U7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAlmbXQ7Ci19OwotCi1zdGF0aWMgaW50IGdldF92NGwyX2ZyYW1lYnVmZmVyMzIoc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmtwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyIF9fdXNlciAqdXApCi17Ci0JdTMyIHRtcDsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIpKSB8fAotCQlnZXRfdXNlcih0bXAsICZ1cC0+YmFzZSkgfHwKLQkJZ2V0X3VzZXIoa3AtPmNhcGFiaWxpdHksICZ1cC0+Y2FwYWJpbGl0eSkgfHwKLQkJZ2V0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCWtwLT5iYXNlID0gY29tcGF0X3B0cih0bXApOwotCWdldF92NGwyX3BpeF9mb3JtYXQoJmtwLT5mbXQsICZ1cC0+Zm10KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICprcCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIzMiBfX3VzZXIgKnVwKQotewotCXUzMiB0bXAgPSAodTMyKSgodW5zaWduZWQgbG9uZylrcC0+YmFzZSk7Ci0KLQlpZighYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKSkgfHwKLQkJcHV0X3VzZXIodG1wLCAmdXAtPmJhc2UpIHx8Ci0JCXB1dF91c2VyKGtwLT5jYXBhYmlsaXR5LCAmdXAtPmNhcGFiaWxpdHkpIHx8Ci0JCXB1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQlwdXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LCAmdXAtPmZtdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX2lucHV0MzIoc3RydWN0IHY0bDJfaW5wdXQgKmtwLCBzdHJ1Y3QgdjRsMl9pbnB1dCBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkgLSA0KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB1dF92NGwyX2lucHV0MzIoc3RydWN0IHY0bDJfaW5wdXQgKmtwLCBzdHJ1Y3QgdjRsMl9pbnB1dCBfX3VzZXIgKnVwKQotewotCWlmIChjb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpIC0gNCkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRfdjRsMl9pbnB1dChzdHJ1Y3QgdjRsMl9pbnB1dCAqa3AsIHN0cnVjdCB2NGwyX2lucHV0IF9fdXNlciAqdXApCi17Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdXRfdjRsMl9pbnB1dChzdHJ1Y3QgdjRsMl9pbnB1dCAqa3AsIHN0cnVjdCB2NGwyX2lucHV0IF9fdXNlciAqdXApCi17Ci0JaWYgKGNvcHlfdG9fdXNlcih1cCwga3AsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotc3RydWN0IHZpZGVvX2NvZGUzMgotewotCWNoYXIJCWxvYWR3aGF0WzE2XTsJLyogbmFtZSBvciB0YWcgb2YgZmlsZSBiZWluZyBwYXNzZWQgKi8KLQljb21wYXRfaW50X3QJZGF0YXNpemU7Ci0JdW5zaWduZWQgY2hhcgkqZGF0YTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1pY3JvY29kZTMyKHN0cnVjdCB2aWRlb19jb2RlICprcCwgc3RydWN0IHZpZGVvX2NvZGUzMiBfX3VzZXIgKnVwKQotewotCWlmKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NvZGUzMikpIHx8Ci0JCWNvcHlfZnJvbV91c2VyKGtwLT5sb2Fkd2hhdCwgdXAtPmxvYWR3aGF0LCBzaXplb2YgKHVwLT5sb2Fkd2hhdCkpIHx8Ci0JCWdldF91c2VyKGtwLT5kYXRhc2l6ZSwgJnVwLT5kYXRhc2l6ZSkgfHwKLQkJY29weV9mcm9tX3VzZXIoa3AtPmRhdGEsIHVwLT5kYXRhLCB1cC0+ZGF0YXNpemUpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgVklESU9DR1RVTkVSMzIJCV9JT1dSKCd2Jyw0LCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMikKLSNkZWZpbmUgVklESU9DU1RVTkVSMzIJCV9JT1coJ3YnLDUsIHN0cnVjdCB2aWRlb190dW5lcjMyKQotI2RlZmluZSBWSURJT0NHV0lOMzIJCV9JT1IoJ3YnLDksIHN0cnVjdCB2aWRlb193aW5kb3czMikKLSNkZWZpbmUgVklESU9DU1dJTjMyCQlfSU9XKCd2JywxMCwgc3RydWN0IHZpZGVvX3dpbmRvdzMyKQotI2RlZmluZSBWSURJT0NHRkJVRjMyCQlfSU9SKCd2JywxMSwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQotI2RlZmluZSBWSURJT0NTRkJVRjMyCQlfSU9XKCd2JywxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQotI2RlZmluZSBWSURJT0NHRlJFUTMyCQlfSU9SKCd2JywxNCwgdTMyKQotI2RlZmluZSBWSURJT0NTRlJFUTMyCQlfSU9XKCd2JywxNSwgdTMyKQotI2RlZmluZSBWSURJT0NTTUlDUk9DT0RFMzIJX0lPVygndicsMjcsIHN0cnVjdCB2aWRlb19jb2RlMzIpCi0KLSNlbmRpZgotCi0vKiBWSURJT0NfRU5VTUlOUFVUMzIgaXMgVklESU9DX0VOVU1JTlBVVCBtaW51cyA0IGJ5dGVzIG9mIHBhZGRpbmcgYWxpZ25lbWVudCAqLwotI2RlZmluZSBWSURJT0NfRU5VTUlOUFVUMzIJVklESU9DX0VOVU1JTlBVVCAtIF9JT0MoMCwgMCwgMCwgNCkKLSNkZWZpbmUgVklESU9DX0dfRk1UMzIJCV9JT1dSICgnVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKLSNkZWZpbmUgVklESU9DX1NfRk1UMzIJCV9JT1dSICgnVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKLSNkZWZpbmUgVklESU9DX1FVRVJZQlVGMzIJX0lPV1IgKCdWJywgIDksIHN0cnVjdCB2NGwyX2J1ZmZlcjMyKQotI2RlZmluZSBWSURJT0NfR19GQlVGMzIJCV9JT1IgICgnVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKQotI2RlZmluZSBWSURJT0NfU19GQlVGMzIJCV9JT1cgICgnVicsIDExLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKQotLyogVklESU9DX09WRVJMQVkgaXMgbm93IF9JT1csIGJ1dCB3YXMgX0lPV1IgKi8KLSNkZWZpbmUgVklESU9DX09WRVJMQVkzMglfSU9XUiAoJ1YnLCAxNCwgY29tcGF0X2ludF90KQotI2RlZmluZSBWSURJT0NfUUJVRjMyCQlfSU9XUiAoJ1YnLCAxNSwgc3RydWN0IHY0bDJfYnVmZmVyMzIpCi0jZGVmaW5lIFZJRElPQ19EUUJVRjMyCQlfSU9XUiAoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyMzIpCi0jZGVmaW5lIFZJRElPQ19TVFJFQU1PTjMyCV9JT1cgICgnVicsIDE4LCBjb21wYXRfaW50X3QpCi0jZGVmaW5lIFZJRElPQ19TVFJFQU1PRkYzMglfSU9XICAoJ1YnLCAxOSwgY29tcGF0X2ludF90KQotI2RlZmluZSBWSURJT0NfRU5VTVNURDMyCV9JT1dSICgnVicsIDI1LCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyKQotLyogVklESU9DX1NfQ1RSTCBpcyBub3cgX0lPV1IsIGJ1dCB3YXMgX0lPVyAqLwotI2RlZmluZSBWSURJT0NfU19DVFJMMzIJCV9JT1cgICgnVicsIDI4LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQotI2RlZmluZSBWSURJT0NfR19JTlBVVDMyCV9JT1IgICgnVicsIDM4LCBjb21wYXRfaW50X3QpCi0jZGVmaW5lIFZJRElPQ19TX0lOUFVUMzIJX0lPV1IgKCdWJywgMzksIGNvbXBhdF9pbnRfdCkKLSNkZWZpbmUgVklESU9DX1RSWV9GTVQzMiAgICAgIAlfSU9XUiAoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0MzIpCi0KLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLWVudW0gewotCU1heENsaXBzID0gKH4wVS1zaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykpL3NpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkKLX07Ci0KLXN0YXRpYyBpbnQgZG9fc2V0X3dpbmRvdyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHZpZGVvX3dpbmRvdzMyIF9fdXNlciAqdXAgPSBjb21wYXRfcHRyKGFyZyk7Ci0Jc3RydWN0IHZpZGVvX3dpbmRvdyBfX3VzZXIgKnZ3OwotCXN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqcDsKLQlpbnQgbmNsaXBzOwotCXUzMiBuOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdzMyKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGdldF91c2VyKG5jbGlwcywgJnVwLT5jbGlwY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIFBlY3VsaWFyIGludGVyZmFjZS4uLiAqLwotCWlmIChuY2xpcHMgPCAwKQotCQluY2xpcHMgPSBWSURFT19DTElQTUFQX1NJWkU7Ci0KLQlpZiAobmNsaXBzID4gTWF4Q2xpcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdncgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykgKwotCQkJCSAgICBuY2xpcHMgKiBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApKTsKLQotCXAgPSBuY2xpcHMgPyAoc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICopKHZ3ICsgMSkgOiBOVUxMOwotCi0JaWYgKGdldF91c2VyKG4sICZ1cC0+eCkgfHwgcHV0X3VzZXIobiwgJnZ3LT54KSB8fAotCSAgICBnZXRfdXNlcihuLCAmdXAtPnkpIHx8IHB1dF91c2VyKG4sICZ2dy0+eSkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT53aWR0aCkgfHwgcHV0X3VzZXIobiwgJnZ3LT53aWR0aCkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT5oZWlnaHQpIHx8IHB1dF91c2VyKG4sICZ2dy0+aGVpZ2h0KSB8fAotCSAgICBnZXRfdXNlcihuLCAmdXAtPmNocm9tYWtleSkgfHwgcHV0X3VzZXIobiwgJnZ3LT5jaHJvbWFrZXkpIHx8Ci0JICAgIGdldF91c2VyKG4sICZ1cC0+ZmxhZ3MpIHx8IHB1dF91c2VyKG4sICZ2dy0+ZmxhZ3MpIHx8Ci0JICAgIGdldF91c2VyKG4sICZ1cC0+Y2xpcGNvdW50KSB8fCBwdXRfdXNlcihuLCAmdnctPmNsaXBjb3VudCkgfHwKLQkgICAgZ2V0X3VzZXIobiwgJnVwLT5jbGlwcykgfHwgcHV0X3VzZXIocCwgJnZ3LT5jbGlwcykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG5jbGlwcykgewotCQlzdHJ1Y3QgdmlkZW9fY2xpcDMyIF9fdXNlciAqdSA9IGNvbXBhdF9wdHIobik7Ci0JCWludCBpOwotCQlpZiAoIXUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZm9yIChpID0gMDsgaSA8IG5jbGlwczsgaSsrLCB1KyssIHArKykgewotCQkJczMyIHY7Ci0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdSwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwMzIpKSB8fAotCQkJICAgICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NsaXAzMikpIHx8Ci0JCQkgICAgZ2V0X3VzZXIodiwgJnUtPngpIHx8Ci0JCQkgICAgcHV0X3VzZXIodiwgJnAtPngpIHx8Ci0JCQkgICAgZ2V0X3VzZXIodiwgJnUtPnkpIHx8Ci0JCQkgICAgcHV0X3VzZXIodiwgJnAtPnkpIHx8Ci0JCQkgICAgZ2V0X3VzZXIodiwgJnUtPndpZHRoKSB8fAotCQkJICAgIHB1dF91c2VyKHYsICZwLT53aWR0aCkgfHwKLQkJCSAgICBnZXRfdXNlcih2LCAmdS0+aGVpZ2h0KSB8fAotCQkJICAgIHB1dF91c2VyKHYsICZwLT5oZWlnaHQpIHx8Ci0JCQkgICAgcHV0X3VzZXIoTlVMTCwgJnAtPm5leHQpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JcmV0dXJuIG5hdGl2ZV9pb2N0bChmaWxlLCBWSURJT0NTV0lOLCAodW5zaWduZWQgbG9uZyl2dyk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBkb192aWRlb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5pb24gewotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdnQ7Ci0JCXN0cnVjdCB2aWRlb19idWZmZXIgdmI7Ci0JCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7Ci0JCXN0cnVjdCB2aWRlb19jb2RlIHZjOwotCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gdmE7Ci0jZW5kaWYKLQkJc3RydWN0IHY0bDJfZm9ybWF0IHYyZjsKLQkJc3RydWN0IHY0bDJfYnVmZmVyIHYyYjsKLQkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgdjJmYjsKLQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgdjJzOwotCQlzdHJ1Y3QgdjRsMl9pbnB1dCB2Mmk7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyIHYydDsKLQkJdW5zaWduZWQgbG9uZyB2eDsKLQl9IGthcmc7Ci0Jdm9pZCBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOwotCWludCBjb21wYXRpYmxlX2FyZyA9IDE7Ci0JaW50IGVyciA9IDA7Ci0JaW50IHJlYWxjbWQgPSBjbWQ7Ci0KLQkvKiBGaXJzdCwgY29udmVydCB0aGUgY29tbWFuZC4gKi8KLQlzd2l0Y2goY21kKSB7Ci0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JY2FzZSBWSURJT0NHVFVORVIzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ0dUVU5FUjsgYnJlYWs7Ci0JY2FzZSBWSURJT0NTVFVORVIzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ1NUVU5FUjsgYnJlYWs7Ci0JY2FzZSBWSURJT0NHV0lOMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NHV0lOOyBicmVhazsKLQljYXNlIFZJRElPQ0dGQlVGMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NHRkJVRjsgYnJlYWs7Ci0JY2FzZSBWSURJT0NTRkJVRjMyOiByZWFsY21kID0gY21kID0gVklESU9DU0ZCVUY7IGJyZWFrOwotCWNhc2UgVklESU9DR0ZSRVEzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ0dGUkVROyBicmVhazsKLQljYXNlIFZJRElPQ1NGUkVRMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NTRlJFUTsgYnJlYWs7Ci0JY2FzZSBWSURJT0NTTUlDUk9DT0RFMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NTTUlDUk9DT0RFOyBicmVhazsKLSNlbmRpZgotCWNhc2UgVklESU9DX0dfRk1UMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfR19GTVQ7IGJyZWFrOwotCWNhc2UgVklESU9DX1NfRk1UMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfU19GTVQ7IGJyZWFrOwotCWNhc2UgVklESU9DX1FVRVJZQlVGMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfUVVFUllCVUY7IGJyZWFrOwotCWNhc2UgVklESU9DX1FCVUYzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ19RQlVGOyBicmVhazsKLQljYXNlIFZJRElPQ19EUUJVRjMyOiByZWFsY21kID0gY21kID0gVklESU9DX0RRQlVGOyBicmVhazsKLQljYXNlIFZJRElPQ19TVFJFQU1PTjMyOiByZWFsY21kID0gY21kID0gVklESU9DX1NUUkVBTU9OOyBicmVhazsKLQljYXNlIFZJRElPQ19TVFJFQU1PRkYzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ19TVFJFQU1PRkY7IGJyZWFrOwotCWNhc2UgVklESU9DX0dfRkJVRjMyOiByZWFsY21kID0gY21kID0gVklESU9DX0dfRkJVRjsgYnJlYWs7Ci0JY2FzZSBWSURJT0NfU19GQlVGMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfU19GQlVGOyBicmVhazsKLQljYXNlIFZJRElPQ19PVkVSTEFZMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfT1ZFUkxBWTsgYnJlYWs7Ci0JY2FzZSBWSURJT0NfRU5VTVNURDMyOiByZWFsY21kID0gVklESU9DX0VOVU1TVEQ7IGJyZWFrOwotCWNhc2UgVklESU9DX0VOVU1JTlBVVDMyOiByZWFsY21kID0gVklESU9DX0VOVU1JTlBVVDsgYnJlYWs7Ci0JY2FzZSBWSURJT0NfU19DVFJMMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfU19DVFJMOyBicmVhazsKLQljYXNlIFZJRElPQ19HX0lOUFVUMzI6IHJlYWxjbWQgPSBjbWQgPSBWSURJT0NfR19JTlBVVDsgYnJlYWs7Ci0JY2FzZSBWSURJT0NfU19JTlBVVDMyOiByZWFsY21kID0gY21kID0gVklESU9DX1NfSU5QVVQ7IGJyZWFrOwotCWNhc2UgVklESU9DX1RSWV9GTVQzMjogcmVhbGNtZCA9IGNtZCA9IFZJRElPQ19UUllfRk1UOyBicmVhazsKLQl9OwotCi0Jc3dpdGNoKGNtZCkgewotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCWNhc2UgVklESU9DU1RVTkVSOgotCWNhc2UgVklESU9DR1RVTkVSOgotCQllcnIgPSBnZXRfdmlkZW9fdHVuZXIzMigma2FyZy52dCwgdXApOwotCQljb21wYXRpYmxlX2FyZyA9IDA7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ1NGQlVGOgotCQllcnIgPSBnZXRfdmlkZW9fYnVmZmVyMzIoJmthcmcudmIsIHVwKTsKLQkJY29tcGF0aWJsZV9hcmcgPSAwOwotCQlicmVhazsKLQotCi0JY2FzZSBWSURJT0NTRlJFUToKLSNlbmRpZgotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JY2FzZSBWSURJT0NfT1ZFUkxBWToKLQljYXNlIFZJRElPQ19TVFJFQU1PTjoKLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JCWVyciA9IGdldF91c2VyKGthcmcudngsICh1MzIgX191c2VyICopdXApOwotCQljb21wYXRpYmxlX2FyZyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19GQlVGOgotCQllcnIgPSBnZXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKCZrYXJnLnYyZmIsIHVwKTsKLQkJY29tcGF0aWJsZV9hcmcgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfRk1UOgotCWNhc2UgVklESU9DX1NfRk1UOgotCWNhc2UgVklESU9DX1RSWV9GTVQ6Ci0JCWVyciA9IGdldF92NGwyX2Zvcm1hdDMyKCZrYXJnLnYyZiwgdXApOwotCQljb21wYXRpYmxlX2FyZyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JY2FzZSBWSURJT0NfUUJVRjoKLQljYXNlIFZJRElPQ19EUUJVRjoKLQkJZXJyID0gZ2V0X3Y0bDJfYnVmZmVyMzIoJmthcmcudjJiLCB1cCk7Ci0JCWNvbXBhdGlibGVfYXJnID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19FTlVNU1REOgotCQllcnIgPSBnZXRfdjRsMl9zdGFuZGFyZCgma2FyZy52MnMsIHVwKTsKLQkJY29tcGF0aWJsZV9hcmcgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0VOVU1TVEQzMjoKLQkJZXJyID0gZ2V0X3Y0bDJfc3RhbmRhcmQzMigma2FyZy52MnMsIHVwKTsKLQkJY29tcGF0aWJsZV9hcmcgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQkJZXJyID0gZ2V0X3Y0bDJfaW5wdXQoJmthcmcudjJpLCB1cCk7Ci0JCWNvbXBhdGlibGVfYXJnID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19FTlVNSU5QVVQzMjoKLQkJZXJyID0gZ2V0X3Y0bDJfaW5wdXQzMigma2FyZy52MmksIHVwKTsKLQkJY29tcGF0aWJsZV9hcmcgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJZXJyID0gZ2V0X3Y0bDJfdHVuZXIoJmthcmcudjJ0LCB1cCk7Ci0JCWNvbXBhdGlibGVfYXJnID0gMDsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLQljYXNlIFZJRElPQ0dXSU46Ci0JY2FzZSBWSURJT0NHRkJVRjoKLQljYXNlIFZJRElPQ0dGUkVROgotI2VuZGlmCi0JY2FzZSBWSURJT0NfR19GQlVGOgotCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JCWNvbXBhdGlibGVfYXJnID0gMDsKLQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JY2FzZSBWSURJT0NTTUlDUk9DT0RFOgotCQllcnIgPSBtaWNyb2NvZGUzMigma2FyZy52YywgdXApOwotCQljb21wYXRpYmxlX2FyZyA9IDA7Ci0JCWJyZWFrOwotI2VuZGlmCi0JfTsKLQlpZihlcnIpCi0JCWdvdG8gb3V0OwotCi0JaWYoY29tcGF0aWJsZV9hcmcpCi0JCWVyciA9IG5hdGl2ZV9pb2N0bChmaWxlLCByZWFsY21kLCAodW5zaWduZWQgbG9uZyl1cCk7Ci0JZWxzZSB7Ci0JCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKLQotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJZXJyID0gbmF0aXZlX2lvY3RsKGZpbGUsIHJlYWxjbWQsICh1bnNpZ25lZCBsb25nKSAma2FyZyk7Ci0JCXNldF9mcyhvbGRfZnMpOwotCX0KLQlpZihlcnIgPT0gMCkgewotCQlzd2l0Y2goY21kKSB7Ci0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JCWNhc2UgVklESU9DR1RVTkVSOgotCQkJZXJyID0gcHV0X3ZpZGVvX3R1bmVyMzIoJmthcmcudnQsIHVwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVklESU9DR1dJTjoKLQkJCWVyciA9IHB1dF92aWRlb193aW5kb3czMigma2FyZy52dywgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NHRkJVRjoKLQkJCWVyciA9IHB1dF92aWRlb19idWZmZXIzMigma2FyZy52YiwgdXApOwotCQkJYnJlYWs7Ci0KLSNlbmRpZgotCQljYXNlIFZJRElPQ19HX0ZCVUY6Ci0JCQllcnIgPSBwdXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKCZrYXJnLnYyZmIsIHVwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVklESU9DX0dfRk1UOgotCQljYXNlIFZJRElPQ19TX0ZNVDoKLQkJY2FzZSBWSURJT0NfVFJZX0ZNVDoKLQkJCWVyciA9IHB1dF92NGwyX2Zvcm1hdDMyKCZrYXJnLnYyZiwgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JCWNhc2UgVklESU9DX1FCVUY6Ci0JCWNhc2UgVklESU9DX0RRQlVGOgotCQkJZXJyID0gcHV0X3Y0bDJfYnVmZmVyMzIoJmthcmcudjJiLCB1cCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZJRElPQ19FTlVNU1REOgotCQkJZXJyID0gcHV0X3Y0bDJfc3RhbmRhcmQoJmthcmcudjJzLCB1cCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZJRElPQ19FTlVNU1REMzI6Ci0JCQllcnIgPSBwdXRfdjRsMl9zdGFuZGFyZDMyKCZrYXJnLnYycywgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NfR19UVU5FUjoKLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJCWVyciA9IHB1dF92NGwyX3R1bmVyKCZrYXJnLnYydCwgdXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCQkJZXJyID0gcHV0X3Y0bDJfaW5wdXQoJmthcmcudjJpLCB1cCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZJRElPQ19FTlVNSU5QVVQzMjoKLQkJCWVyciA9IHB1dF92NGwyX2lucHV0MzIoJmthcmcudjJpLCB1cCk7Ci0JCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCQljYXNlIFZJRElPQ0dGUkVROgotI2VuZGlmCi0JCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JCQllcnIgPSBwdXRfdXNlcigoKHUzMilrYXJnLnZ4KSwgKHUzMiBfX3VzZXIgKil1cCk7Ci0JCQlicmVhazsKLQkJfTsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotbG9uZyB2NGxfY29tcGF0X2lvY3RsMzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAtRU5PSU9DVExDTUQ7Ci0KLQlpZiAoIWZpbGUtPmZfb3AtPmlvY3RsICYmICFmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkKLQkJcmV0dXJuIHJldDsKLQotCXN3aXRjaCAoY21kKSB7Ci0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JY2FzZSBWSURJT0NTV0lOMzI6Ci0JCXJldCA9IGRvX3NldF93aW5kb3coZmlsZSwgY21kLCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ0dUVU5FUjMyOgotCWNhc2UgVklESU9DU1RVTkVSMzI6Ci0JY2FzZSBWSURJT0NHV0lOMzI6Ci0JY2FzZSBWSURJT0NHRkJVRjMyOgotCWNhc2UgVklESU9DU0ZCVUYzMjoKLQljYXNlIFZJRElPQ0dGUkVRMzI6Ci0JY2FzZSBWSURJT0NTRlJFUTMyOgotCWNhc2UgVklESU9DR0FVRElPOgotCWNhc2UgVklESU9DU0FVRElPOgotCWNhc2UgVklESU9DR1ZCSUZNVDoKLQljYXNlIFZJRElPQ1NWQklGTVQ6Ci0jZW5kaWYKLQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQljYXNlIFZJRElPQ19FTlVNX0ZNVDoKLQljYXNlIFZJRElPQ19HX0ZNVDMyOgotCWNhc2UgVklESU9DX0NST1BDQVA6Ci0JY2FzZSBWSURJT0NfU19DUk9QOgotCWNhc2UgVklESU9DX1NfRk1UMzI6Ci0JY2FzZSBWSURJT0NfUkVRQlVGUzoKLQljYXNlIFZJRElPQ19RVUVSWUJVRjMyOgotCWNhc2UgVklESU9DX0dfRkJVRjMyOgotCWNhc2UgVklESU9DX1NfRkJVRjMyOgotCWNhc2UgVklESU9DX09WRVJMQVkzMjoKLQljYXNlIFZJRElPQ19RQlVGMzI6Ci0JY2FzZSBWSURJT0NfRFFCVUYzMjoKLQljYXNlIFZJRElPQ19TVFJFQU1PTjMyOgotCWNhc2UgVklESU9DX1NUUkVBTU9GRjMyOgotCWNhc2UgVklESU9DX0dfUEFSTToKLQljYXNlIFZJRElPQ19TX1BBUk06Ci0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCWNhc2UgVklESU9DX0VOVU1TVEQ6Ci0JY2FzZSBWSURJT0NfRU5VTVNURDMyOgotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQljYXNlIFZJRElPQ19FTlVNSU5QVVQzMjoKLQljYXNlIFZJRElPQ19HX0NUUkw6Ci0JY2FzZSBWSURJT0NfU19DVFJMOgotCWNhc2UgVklESU9DX1NfQ1RSTDMyOgotCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQljYXNlIFZJRElPQ19HX0lOUFVUMzI6Ci0JY2FzZSBWSURJT0NfU19JTlBVVDMyOgotCWNhc2UgVklESU9DX1RSWV9GTVQzMjoKLQljYXNlIFZJRElPQ19TX0hXX0ZSRVFfU0VFSzoKLQljYXNlIFZJRElPQ19FTlVNX0ZSQU1FU0laRVM6Ci0JY2FzZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUzoKLQkJcmV0ID0gZG9fdmlkZW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAotCS8qIExpdHRsZSB2LCB0aGUgdmlkZW80bGludXggaW9jdGxzIChjb25mbGljdD8pICovCi0JY2FzZSBWSURJT0NHQ0FQOgotCWNhc2UgVklESU9DR0NIQU46Ci0JY2FzZSBWSURJT0NTQ0hBTjoKLQljYXNlIFZJRElPQ0dQSUNUOgotCWNhc2UgVklESU9DU1BJQ1Q6Ci0JY2FzZSBWSURJT0NDQVBUVVJFOgotCWNhc2UgVklESU9DS0VZOgotCWNhc2UgVklESU9DU1lOQzoKLQljYXNlIFZJRElPQ01DQVBUVVJFOgotCWNhc2UgVklESU9DR01CVUY6Ci0JY2FzZSBWSURJT0NHVU5JVDoKLQljYXNlIFZJRElPQ0dDQVBUVVJFOgotCWNhc2UgVklESU9DU0NBUFRVUkU6Ci0KLQkvKiBCVFRWIHNwZWNpZmljLi4uICovCi0JY2FzZSBfSU9XKCd2JywgIEJBU0VfVklESU9DUFJJVkFURSswLCBjaGFyIFsyNTZdKToKLQljYXNlIF9JT1IoJ3YnLCAgQkFTRV9WSURJT0NQUklWQVRFKzEsIGNoYXIgWzI1Nl0pOgotCWNhc2UgX0lPUigndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMiwgdW5zaWduZWQgaW50KToKLQljYXNlIF9JT1coJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzMsIGNoYXIgWzE2XSk6IC8qIHN0cnVjdCBidHR2X3BsbF9pbmZvICovCi0JY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSs0LCBpbnQpOgotCWNhc2UgX0lPUigndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNSwgaW50KToKLQljYXNlIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzYsIGludCk6Ci0JY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSs3LCBpbnQpOgotCQlyZXQgPSBuYXRpdmVfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXY0bF9wcmludF9pb2N0bCgiY29tcGF0X2lvY3RsMzIiLCBjbWQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotI2Vsc2UKLWxvbmcgdjRsX2NvbXBhdF9pb2N0bDMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotfQotI2VuZGlmCi1FWFBPUlRfU1lNQk9MX0dQTCh2NGxfY29tcGF0X2lvY3RsMzIpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCmluZGV4IDE2YzA5NGYuLjAyOGE0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jCkBAIC0zMzMzLDggKzMzMzMsNyBAQAogCXJldHVybiBjYW0tPmRlY29tcHJlc3NlZF9mcmFtZS5jb3VudDsKIH0KIAotc3RhdGljIGludCBjcGlhX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBpb2N0bG5yLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGNwaWFfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGNhbV9kYXRhICpjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMzM0Nyw5ICszMzQ2LDkgQEAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjYW0tPmJ1c3lfbG9jaykpCiAJCXJldHVybiAtRUlOVFI7CiAKLQkvL0RCRygiY3BpYV9pb2N0bDogJXVcbiIsIGlvY3RsbnIpOworCS8qIERCRygiY3BpYV9pb2N0bDogJXVcbiIsIGNtZCk7ICovCiAKLQlzd2l0Y2ggKGlvY3RsbnIpIHsKKwlzd2l0Y2ggKGNtZCkgewogCS8qIHF1ZXJ5IGNhcGFiaWxpdGllcyAqLwogCWNhc2UgVklESU9DR0NBUDoKIAl7CkBAIC0zNzI0LDcgKzM3MjMsNyBAQAogc3RhdGljIGludCBjcGlhX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGNwaWFfZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgY3BpYV9kb19pb2N0bCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX2NvcmUuYwppbmRleCA3ZTc5MWI2Li4xY2MwZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX2NvcmUuYwpAQCAtMjUsNyArMjUsNyBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKICAqICBTdHJpcHBlZCBvZiAyLjQgc3R1ZmYgcmVhZHkgZm9yIG1haW4ga2VybmVsIHN1Ym1pdCBieQotICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl91c2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdXNiLmMKaW5kZXggNzM1MTFhNS4uZGM1YjA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl91c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jCkBAIC0yNSw3ICsyNSw3IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgogICogIFN0cmlwcGVkIG9mIDIuNCBzdHVmZiByZWFkeSBmb3IgbWFpbiBrZXJuZWwgc3VibWl0IGJ5Ci0gKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCmluZGV4IDFjNmJkNjMuLjNjMmQ3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwpAQCAtMjYsNyArMjYsNyBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKICAqICBTdHJpcHBlZCBvZiAyLjQgc3R1ZmYgcmVhZHkgZm9yIG1haW4ga2VybmVsIHN1Ym1pdCBieQotICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgpAQCAtMTU3Miw4ICsxNTcyLDcgQEAKICAqICBjcGlhMl9pb2N0bAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgY3BpYTJfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBpb2N0bF9uciwgdm9pZCAqYXJnKQorc3RhdGljIGludCBjcGlhMl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTE1OTEsNyArMTU5MCw3IEBACiAJfQogCiAJLyogUHJpb3JpdHkgY2hlY2sgKi8KLQlzd2l0Y2ggKGlvY3RsX25yKSB7CisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ1NXSU46CiAJY2FzZSBWSURJT0NNQ0FQVFVSRToKIAljYXNlIFZJRElPQ19TX0ZNVDoKQEAgLTE2MTgsNyArMTYxNyw3IEBACiAJCWJyZWFrOwogCX0KIAotCXN3aXRjaCAoaW9jdGxfbnIpIHsKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVklESU9DR0NBUDoJLyogcXVlcnkgY2FwYWJpbGl0aWVzICovCiAJCXJldHZhbCA9IGlvY3RsX2NhcF9xdWVyeShhcmcsIGNhbSk7CiAJCWJyZWFrOwpAQCAtMTY4Myw3ICsxNjgyLDcgQEAKIAljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CiAJY2FzZSBWSURJT0NfR19JTlBVVDoKIAljYXNlIFZJRElPQ19TX0lOUFVUOgotCQlyZXR2YWwgPSBpb2N0bF9pbnB1dChpb2N0bF9uciwgYXJnLGNhbSk7CisJCXJldHZhbCA9IGlvY3RsX2lucHV0KGNtZCwgYXJnLCBjYW0pOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX0VOVU1fRk1UOgpAQCAtMTg0Myw5ICsxODQyLDkgQEAKIH0KIAogc3RhdGljIGludCBjcGlhMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBpb2N0bF9uciwgdW5zaWduZWQgbG9uZyBpYXJnKQorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBpb2N0bF9uciwgaWFyZywgY3BpYTJfZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgY3BpYTJfZG9faW9jdGwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NzNTM0NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jczUzNDUuYwppbmRleCBhNjYyYjE1Li43MGZjZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NzNTM0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M1MzQ1LmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2Lmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiaTJjIGRldmljZSBkcml2ZXIgZm9yIGNzNTM0NSBBdWRpbyBBREMiKTsKIE1PRFVMRV9BVVRIT1IoIkhhbnMgVmVya3VpbCIpOwpAQCAtNDAsMTExICs0MCwxNDMgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGlubGluZSBpbnQgY3M1MzQ1X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCitzdGF0aWMgaW5saW5lIGludCBjczUzNDVfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjczUzNDVfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCitzdGF0aWMgaW5saW5lIGludCBjczUzNDVfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCByZWcpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCiAJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CiB9CiAKK3N0YXRpYyBpbnQgY3M1MzQ1X3Nfcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSkKK3sKKwlpZiAoKHJvdXRlLT5pbnB1dCAmIDB4ZikgPiA2KSB7CisJCXY0bDJfZXJyKHNkLCAiSW52YWxpZCBpbnB1dCAlZC5cbiIsIHJvdXRlLT5pbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljczUzNDVfd3JpdGUoc2QsIDB4MDksIHJvdXRlLT5pbnB1dCAmIDB4Zik7CisJY3M1MzQ1X3dyaXRlKHNkLCAweDA1LCByb3V0ZS0+aW5wdXQgJiAweGYwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczUzNDVfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJY3RybC0+dmFsdWUgPSAoY3M1MzQ1X3JlYWQoc2QsIDB4MDQpICYgMHgwOCkgIT0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19WT0xVTUUpCisJCXJldHVybiAtRUlOVkFMOworCWN0cmwtPnZhbHVlID0gY3M1MzQ1X3JlYWQoc2QsIDB4MDcpICYgMHgzZjsKKwlpZiAoY3RybC0+dmFsdWUgPj0gMzIpCisJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgLSA2NDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczUzNDVfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJY3M1MzQ1X3dyaXRlKHNkLCAweDA0LCBjdHJsLT52YWx1ZSA/IDB4ODAgOiAwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19WT0xVTUUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjdHJsLT52YWx1ZSA+IDI0IHx8IGN0cmwtPnZhbHVlIDwgLTI0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwljczUzNDVfd3JpdGUoc2QsIDB4MDcsICgodTgpY3RybC0+dmFsdWUpICYgMHgzZik7CisJY3M1MzQ1X3dyaXRlKHNkLCAweDA4LCAoKHU4KWN0cmwtPnZhbHVlKSAmIDB4M2YpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCBjczUzNDVfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJlZy0+dmFsID0gY3M1MzQ1X3JlYWQoc2QsIHJlZy0+cmVnICYgMHgxZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M1MzQ1X3NfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoIXY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KGNsaWVudCwKKwkJCQlyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwljczUzNDVfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHgxZiwgcmVnLT52YWwgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNzNTM0NV9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBjaGlwLCBWNEwyX0lERU5UX0NTNTM0NSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgY3M1MzQ1X2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwl1OCB2ID0gY3M1MzQ1X3JlYWQoc2QsIDB4MDkpICYgNzsKKwl1OCBtID0gY3M1MzQ1X3JlYWQoc2QsIDB4MDQpOworCWludCB2b2wgPSBjczUzNDVfcmVhZChzZCwgMHgwOCkgJiAweDNmOworCisJdjRsMl9pbmZvKHNkLCAiSW5wdXQ6ICAlZCVzXG4iLCB2LAorCQkJKG0gJiAweDgwKSA/ICIgKG11dGVkKSIgOiAiIik7CisJaWYgKHZvbCA+PSAzMikKKwkJdm9sID0gdm9sIC0gNjQ7CisJdjRsMl9pbmZvKHNkLCAiVm9sdW1lOiAlZCBkQlxuIiwgdm9sKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjczUzNDVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HOgotCQlyb3V0ZS0+aW5wdXQgPSBjczUzNDVfcmVhZChjbGllbnQsIDB4MDkpICYgNzsKLQkJcm91dGUtPmlucHV0IHw9IGNzNTM0NV9yZWFkKGNsaWVudCwgMHgwNSkgJiAweDcwOwotCQlyb3V0ZS0+b3V0cHV0ID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgotCQlpZiAoKHJvdXRlLT5pbnB1dCAmIDB4ZikgPiA2KSB7Ci0JCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgaW5wdXQgJWQuXG4iLCByb3V0ZS0+aW5wdXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY3M1MzQ1X3dyaXRlKGNsaWVudCwgMHgwOSwgcm91dGUtPmlucHV0ICYgMHhmKTsKLQkJY3M1MzQ1X3dyaXRlKGNsaWVudCwgMHgwNSwgcm91dGUtPmlucHV0ICYgMHhmMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCQlpZiAoY3RybC0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgewotCQkJY3RybC0+dmFsdWUgPSAoY3M1MzQ1X3JlYWQoY2xpZW50LCAweDA0KSAmIDB4MDgpICE9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fVk9MVU1FKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWN0cmwtPnZhbHVlID0gY3M1MzQ1X3JlYWQoY2xpZW50LCAweDA3KSAmIDB4M2Y7Ci0JCWlmIChjdHJsLT52YWx1ZSA+PSAzMikKLQkJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgLSA2NDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCWJyZWFrOwotCQlpZiAoY3RybC0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgewotCQkJY3M1MzQ1X3dyaXRlKGNsaWVudCwgMHgwNCwgY3RybC0+dmFsdWUgPyAweDgwIDogMCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fVk9MVU1FKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChjdHJsLT52YWx1ZSA+IDI0IHx8IGN0cmwtPnZhbHVlIDwgLTI0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNzNTM0NV93cml0ZShjbGllbnQsIDB4MDcsICgodTgpY3RybC0+dmFsdWUpICYgMHgzZik7Ci0JCWNzNTM0NV93cml0ZShjbGllbnQsIDB4MDgsICgodTgpY3RybC0+dmFsdWUpICYgMHgzZik7Ci0JCWJyZWFrOwotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgotCWNhc2UgVklESU9DX0RCR19TX1JFR0lTVEVSOgotCXsKLQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKLQotCQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KGNsaWVudCwKLQkJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChjbWQgPT0gVklESU9DX0RCR19HX1JFR0lTVEVSKQotCQkJcmVnLT52YWwgPSBjczUzNDVfcmVhZChjbGllbnQsIHJlZy0+cmVnICYgMHgxZik7Ci0JCWVsc2UKLQkJCWNzNTM0NV93cml0ZShjbGllbnQsIHJlZy0+cmVnICYgMHgxZiwgcmVnLT52YWwgJiAweGZmKTsKLQkJYnJlYWs7Ci0JfQotI2VuZGlmCi0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsCi0JCQkJYXJnLCBWNEwyX0lERU5UX0NTNTM0NSwgMCk7Ci0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQl7Ci0JCQl1OCB2ID0gY3M1MzQ1X3JlYWQoY2xpZW50LCAweDA5KSAmIDc7Ci0JCQl1OCBtID0gY3M1MzQ1X3JlYWQoY2xpZW50LCAweDA0KTsKLQkJCWludCB2b2wgPSBjczUzNDVfcmVhZChjbGllbnQsIDB4MDgpICYgMHgzZjsKLQotCQkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICAlZCVzXG4iLCB2LAotCQkJCSAgICAgIChtICYgMHg4MCkgPyAiIChtdXRlZCkiIDogIiIpOwotCQkJaWYgKHZvbCA+PSAzMikKLQkJCQl2b2wgPSB2b2wgLSA2NDsKLQkJCXY0bF9pbmZvKGNsaWVudCwgIlZvbHVtZTogJWQgZEJcbiIsIHZvbCk7Ci0JCQlicmVhazsKLQkJfQotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgY3M1MzQ1X2NvcmVfb3BzID0geworCS5sb2dfc3RhdHVzID0gY3M1MzQ1X2xvZ19zdGF0dXMsCisJLmdfY2hpcF9pZGVudCA9IGNzNTM0NV9nX2NoaXBfaWRlbnQsCisJLmdfY3RybCA9IGNzNTM0NV9nX2N0cmwsCisJLnNfY3RybCA9IGNzNTM0NV9zX2N0cmwsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gY3M1MzQ1X2dfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIgPSBjczUzNDVfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgY3M1MzQ1X2F1ZGlvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gY3M1MzQ1X3Nfcm91dGluZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGNzNTM0NV9vcHMgPSB7CisJLmNvcmUgPSAmY3M1MzQ1X2NvcmVfb3BzLAorCS5hdWRpbyA9ICZjczUzNDVfYXVkaW9fb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogc3RhdGljIGludCBjczUzNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCiAJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLwogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTE1Miw5ICsxODQsMjUgQEAKIAl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAKLQljczUzNDVfd3JpdGUoY2xpZW50LCAweDAyLCAweDAwKTsKLQljczUzNDVfd3JpdGUoY2xpZW50LCAweDA0LCAweDAxKTsKLQljczUzNDVfd3JpdGUoY2xpZW50LCAweDA5LCAweDAxKTsKKwlzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX3N1YmRldiksIEdGUF9LRVJORUwpOworCWlmIChzZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmY3M1MzQ1X29wcyk7CisKKwljczUzNDVfd3JpdGUoc2QsIDB4MDIsIDB4MDApOworCWNzNTM0NV93cml0ZShzZCwgMHgwNCwgMHgwMSk7CisJY3M1MzQ1X3dyaXRlKHNkLCAweDA5LCAweDAxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBjczUzNDVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcxLDUgKzIxOSw2IEBACiAJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX0NTNTM0NSwKIAkuY29tbWFuZCA9IGNzNTM0NV9jb21tYW5kLAogCS5wcm9iZSA9IGNzNTM0NV9wcm9iZSwKKwkucmVtb3ZlID0gY3M1MzQ1X3JlbW92ZSwKIAkuaWRfdGFibGUgPSBjczUzNDVfaWQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jczUzbDMyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jczUzbDMyYS5jCmluZGV4IGM0NDQ0NTAuLmNiNjVkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M1M2wzMmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NzNTNsMzJhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2LWxlZ2FjeS5oPgogCkBAIC00Nyw4NiArNDcsMTA2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgY3M1M2wzMmFfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3N0YXRpYyBpbnQgY3M1M2wzMmFfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwogfQogCi1zdGF0aWMgaW50IGNzNTNsMzJhX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQorc3RhdGljIGludCBjczUzbDMyYV9yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KIAorc3RhdGljIGludCBjczUzbDMyYV9zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpCit7CisJLyogVGhlcmUgYXJlIDIgcGh5c2ljYWwgaW5wdXRzLCBidXQgdGhlIHNlY29uZCBpbnB1dCBjYW4gYmUKKwkgICBwbGFjZWQgaW4gdHdvIG1vZGVzLCB0aGUgZmlyc3QgbW9kZSBieXBhc3NlcyB0aGUgUEdBIChnYWluKSwKKwkgICB0aGUgc2Vjb25kIGdvZXMgdGhyb3VnaCB0aGUgUEdBLiBIZW5jZSB0aGVyZSBhcmUgdGhyZWUKKwkgICBwb3NzaWJsZSBpbnB1dHMgdG8gY2hvb3NlIGZyb20uICovCisJaWYgKHJvdXRlLT5pbnB1dCA+IDIpIHsKKwkJdjRsMl9lcnIoc2QsICJJbnZhbGlkIGlucHV0ICVkLlxuIiwgcm91dGUtPmlucHV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNzNTNsMzJhX3dyaXRlKHNkLCAweDAxLCAweDAxICsgKHJvdXRlLT5pbnB1dCA8PCA0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M1M2wzMmFfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJY3RybC0+dmFsdWUgPSAoY3M1M2wzMmFfcmVhZChzZCwgMHgwMykgJiAweGMwKSAhPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3RybC0+dmFsdWUgPSAoczgpY3M1M2wzMmFfcmVhZChzZCwgMHgwNCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M1M2wzMmFfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJY3M1M2wzMmFfd3JpdGUoc2QsIDB4MDMsIGN0cmwtPnZhbHVlID8gMHhmMCA6IDB4MzApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGN0cmwtPnZhbHVlID4gMTIgfHwgY3RybC0+dmFsdWUgPCAtOTYpCisJCXJldHVybiAtRUlOVkFMOworCWNzNTNsMzJhX3dyaXRlKHNkLCAweDA0LCAodTgpIGN0cmwtPnZhbHVlKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwNSwgKHU4KSBjdHJsLT52YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M1M2wzMmFfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwKKwkJCWNoaXAsIFY0TDJfSURFTlRfQ1M1M2wzMkEsIDApOworfQorCitzdGF0aWMgaW50IGNzNTNsMzJhX2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwl1OCB2ID0gY3M1M2wzMmFfcmVhZChzZCwgMHgwMSk7CisJdTggbSA9IGNzNTNsMzJhX3JlYWQoc2QsIDB4MDMpOworCXM4IHZvbCA9IGNzNTNsMzJhX3JlYWQoc2QsIDB4MDQpOworCisJdjRsMl9pbmZvKHNkLCAiSW5wdXQ6ICAlZCVzXG4iLCAodiA+PiA0KSAmIDMsCisJCQkobSAmIDB4QzApID8gIiAobXV0ZWQpIiA6ICIiKTsKKwl2NGwyX2luZm8oc2QsICJWb2x1bWU6ICVkIGRCXG4iLCB2b2wpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNzNTNsMzJhX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7Ci0Jc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORzoKLQkJcm91dGUtPmlucHV0ID0gKGNzNTNsMzJhX3JlYWQoY2xpZW50LCAweDAxKSA+PiA0KSAmIDM7Ci0JCXJvdXRlLT5vdXRwdXQgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkc6Ci0JCS8qIFRoZXJlIGFyZSAyIHBoeXNpY2FsIGlucHV0cywgYnV0IHRoZSBzZWNvbmQgaW5wdXQgY2FuIGJlCi0JCSAgIHBsYWNlZCBpbiB0d28gbW9kZXMsIHRoZSBmaXJzdCBtb2RlIGJ5cGFzc2VzIHRoZSBQR0EgKGdhaW4pLAotCQkgICB0aGUgc2Vjb25kIGdvZXMgdGhyb3VnaCB0aGUgUEdBLiBIZW5jZSB0aGVyZSBhcmUgdGhyZWUKLQkJICAgcG9zc2libGUgaW5wdXRzIHRvIGNob29zZSBmcm9tLiAqLwotCQlpZiAocm91dGUtPmlucHV0ID4gMikgewotCQkJdjRsX2VycihjbGllbnQsICJJbnZhbGlkIGlucHV0ICVkLlxuIiwgcm91dGUtPmlucHV0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNzNTNsMzJhX3dyaXRlKGNsaWVudCwgMHgwMSwgMHgwMSArIChyb3V0ZS0+aW5wdXQgPDwgNCkpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKLQkJCWN0cmwtPnZhbHVlID0gKGNzNTNsMzJhX3JlYWQoY2xpZW50LCAweDAzKSAmIDB4YzApICE9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fVk9MVU1FKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWN0cmwtPnZhbHVlID0gKHM4KWNzNTNsMzJhX3JlYWQoY2xpZW50LCAweDA0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCWlmIChjdHJsLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7Ci0JCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDMsIGN0cmwtPnZhbHVlID8gMHhmMCA6IDB4MzApOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoY3RybC0+dmFsdWUgPiAxMiB8fCBjdHJsLT52YWx1ZSA8IC05NikKLQkJCXJldHVybiAtRUlOVkFMOwotCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDQsICh1OCkgY3RybC0+dmFsdWUpOwotCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDUsICh1OCkgY3RybC0+dmFsdWUpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKLQkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwKLQkJCQlhcmcsIFY0TDJfSURFTlRfQ1M1M2wzMkEsIDApOwotCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJewotCQkJdTggdiA9IGNzNTNsMzJhX3JlYWQoY2xpZW50LCAweDAxKTsKLQkJCXU4IG0gPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgMHgwMyk7Ci0JCQlzOCB2b2wgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgMHgwNCk7Ci0KLQkJCXY0bF9pbmZvKGNsaWVudCwgIklucHV0OiAgJWQlc1xuIiwgKHYgPj4gNCkgJiAzLAotCQkJCSAgICAgIChtICYgMHhDMCkgPyAiIChtdXRlZCkiIDogIiIpOwotCQkJdjRsX2luZm8oY2xpZW50LCAiVm9sdW1lOiAlZCBkQlxuIiwgdm9sKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBjczUzbDMyYV9jb3JlX29wcyA9IHsKKwkubG9nX3N0YXR1cyA9IGNzNTNsMzJhX2xvZ19zdGF0dXMsCisJLmdfY2hpcF9pZGVudCA9IGNzNTNsMzJhX2dfY2hpcF9pZGVudCwKKwkuZ19jdHJsID0gY3M1M2wzMmFfZ19jdHJsLAorCS5zX2N0cmwgPSBjczUzbDMyYV9zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyBjczUzbDMyYV9hdWRpb19vcHMgPSB7CisJLnNfcm91dGluZyA9IGNzNTNsMzJhX3Nfcm91dGluZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGNzNTNsMzJhX29wcyA9IHsKKwkuY29yZSA9ICZjczUzbDMyYV9jb3JlX29wcywKKwkuYXVkaW8gPSAmY3M1M2wzMmFfYXVkaW9fb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogLyogaTJjIGltcGxlbWVudGF0aW9uICovCiAKIC8qCkBAIC0xMzcsNiArMTU3LDcgQEAKIHN0YXRpYyBpbnQgY3M1M2wzMmFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJaW50IGk7CiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCkBAIC0xNDksMzIgKzE3MCw0NiBAQAogCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCiAJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKIAotCWZvciAoaSA9IDE7IGkgPD0gNzsgaSsrKSB7Ci0JCXU4IHYgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgaSk7CisJc2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJmNzNTNsMzJhX29wcyk7CiAKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiUmVhZCBSZWcgJWQgJTAyeFxuIiwgaSwgdik7CisJZm9yIChpID0gMTsgaSA8PSA3OyBpKyspIHsKKwkJdTggdiA9IGNzNTNsMzJhX3JlYWQoc2QsIGkpOworCisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlJlYWQgUmVnICVkICUwMnhcbiIsIGksIHYpOwogCX0KIAogCS8qIFNldCBjczUzbDMyYSBpbnRlcm5hbCByZWdpc3RlciBmb3IgQWRhcHRlYyAyMDEwLzI0MTAgc2V0dXAgKi8KIAotCWNzNTNsMzJhX3dyaXRlKGNsaWVudCwgMHgwMSwgKHU4KSAweDIxKTsKLQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDIsICh1OCkgMHgyOSk7Ci0JY3M1M2wzMmFfd3JpdGUoY2xpZW50LCAweDAzLCAodTgpIDB4MzApOwotCWNzNTNsMzJhX3dyaXRlKGNsaWVudCwgMHgwNCwgKHU4KSAweDAwKTsKLQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDUsICh1OCkgMHgwMCk7Ci0JY3M1M2wzMmFfd3JpdGUoY2xpZW50LCAweDA2LCAodTgpIDB4MDApOwotCWNzNTNsMzJhX3dyaXRlKGNsaWVudCwgMHgwNywgKHU4KSAweDAwKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwMSwgKHU4KSAweDIxKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwMiwgKHU4KSAweDI5KTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwMywgKHU4KSAweDMwKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwNCwgKHU4KSAweDAwKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwNSwgKHU4KSAweDAwKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwNiwgKHU4KSAweDAwKTsKKwljczUzbDMyYV93cml0ZShzZCwgMHgwNywgKHU4KSAweDAwKTsKIAogCS8qIERpc3BsYXkgcmVzdWx0cywgc2hvdWxkIGJlIDB4MjEsMHgyOSwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAgKi8KIAogCWZvciAoaSA9IDE7IGkgPD0gNzsgaSsrKSB7Ci0JCXU4IHYgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgaSk7CisJCXU4IHYgPSBjczUzbDMyYV9yZWFkKHNkLCBpKTsKIAotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJSZWFkIFJlZyAlZCAlMDJ4XG4iLCBpLCB2KTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiUmVhZCBSZWcgJWQgJTAyeFxuIiwgaSwgdik7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNzNTNsMzJhX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZShzZCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjczUzbDMyYV9pZFtdID0gewogCXsgImNzNTNsMzJhIiwgMCB9LAogCXsgfQpAQCAtMTg1LDYgKzIyMCw3IEBACiAJLm5hbWUgPSAiY3M1M2wzMmEiLAogCS5kcml2ZXJpZCA9IEkyQ19EUklWRVJJRF9DUzUzTDMyQSwKIAkuY29tbWFuZCA9IGNzNTNsMzJhX2NvbW1hbmQsCisJLnJlbW92ZSA9IGNzNTNsMzJhX3JlbW92ZSwKIAkucHJvYmUgPSBjczUzbDMyYV9wcm9iZSwKIAkuaWRfdGFibGUgPSBjczUzbDMyYV9pZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtYXVkaW8uYwppbmRleCAwYjU1ODM3Li5hMmYwYWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWF1ZGlvLmMKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGN4MjU4NDAtYXVkaW8uYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zMCw5OCArMzEsMTY1IEBACiAJaWYgKGZyZXEgIT0gMzIwMDAgJiYgZnJlcSAhPSA0NDEwMCAmJiBmcmVxICE9IDQ4MDAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFNBX01DTEtfU0VMPTEsIFNBX01DTEtfRElWPTB4MTAgKi8KLQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg1MCk7CisJLyoKKwkgKiBUaGUgUExMIHBhcmFtZXRlcnMgYXJlIGJhc2VkIG9uIHRoZSBleHRlcm5hbCBjcnlzdGFsIGZyZXF1ZW5jeSB0aGF0CisJICogd291bGQgaWRlYWxseSBiZToKKwkgKgorCSAqIE5UU0MgQ29sb3Igc3ViY2FycmllciBmcmVxICogOCA9CisJICogCTQuNSBNSHovMjg2ICogNDU1LzIgKiA4ID0gMjguNjM2MzYzNjMuLi4gTUh6CisJICoKKwkgKiBUaGUgYWNjaWRlbnRzIG9mIGhpc3RvcnkgYW5kIHJhdGlvbmFsZSB0aGF0IGV4cGxhaW4gZnJvbSB3aGVyZSB0aGlzCisJICogY29tYmluYXRpb24gb2YgbWFnaWMgbnVtYmVycyBvcmlnaW5hdGUgY2FuIGJlIGZvdW5kIGluOgorCSAqCisJICogWzFdIEFicmFoYW1zLCBJLiBDLiwgIkNob2ljZSBvZiBDaHJvbWluYW5jZSBTdWJjYXJyaWVyIEZyZXF1ZW5jeSBpbgorCSAqIHRoZSBOVFNDIFN0YW5kYXJkcyIsIFByb2NlZWRpbmdzIG9mIHRoZSBJLVItRSwgSmFudWFyeSAxOTU0LCBwcCA3OS04MAorCSAqCisJICogWzJdIEFicmFoYW1zLCBJLiBDLiwgIlRoZSAnRnJlcXVlbmN5IEludGVybGVhdmluZycgUHJpbmNpcGxlIGluIHRoZQorCSAqIE5UU0MgU3RhbmRhcmRzIiwgUHJvY2VlZGluZ3Mgb2YgdGhlIEktUi1FLCBKYW51YXJ5IDE5NTQsIHBwIDgxLTgzCisJICoKKwkgKiBBcyBNaWtlIEJyYWRsZXkgaGFzIHJpZ2h0bHkgcG9pbnRlZCBvdXQsIGl0J3Mgbm90IHRoZSBleGFjdCBjcnlzdGFsCisJICogZnJlcXVlbmN5IHRoYXQgbWF0dGVycywgb25seSB0aGF0IGFsbCBwYXJ0cyBvZiB0aGUgZHJpdmVyIGFuZAorCSAqIGZpcm13YXJlIGFyZSB1c2luZyB0aGUgc2FtZSB2YWx1ZSAoY2xvc2UgdG8gdGhlIGlkZWFsIHZhbHVlKS4KKwkgKgorCSAqIFNpbmNlIEkgaGF2ZSBhIHN0cm9uZyBzdXNwaWNpb24gdGhhdCwgaWYgdGhlIGZpcm13YXJlIGV2ZXIgYXNzdW1lcyBhCisJICogY3J5c3RhbCB2YWx1ZSBhdCBhbGwsIGl0IHdpbGwgYXNzdW1lIDI4LjYzNjM2MCBNSHosIHRoZSBjcnlzdGFsCisJICogZnJlcSB1c2VkIGluIGNhbGN1bGF0aW9ucyBpbiB0aGlzIGRyaXZlciB3aWxsIGJlOgorCSAqCisJICoJeHRhbF9mcmVxID0gMjguNjM2MzYwIE1IegorCSAqCisJICogYW4gZXJyb3Igb2YgbGVzcyB0aGFuIDAuMTMgcHBtIHdoaWNoIGlzIHdheSwgd2F5IGJldHRlciB0aGFuIGFueSBvZmYKKwkgKiB0aGUgc2hlbGYgY3J5c3RhbCB3aWxsIGhhdmUgZm9yIGFjY3VyYWN5IGFueXdheS4KKwkgKgorCSAqIEJlbG93IEkgYWltIHRvIHJ1biB0aGUgUExMcycgVkNPcyBuZWFyIDQwMCBNSHogdG8gbWluaW16ZSBlcnJvci4KKwkgKgorCSAqIE1hbnkgdGhhbmtzIHRvIEplZmYgQ2FtcGJlbGwgYW5kIE1pa2UgQnJhZGxleSBmb3IgdGhlaXIgZXh0ZW5zaXZlCisJICogaW52ZXN0aWdhdGlvbiwgZXhwZXJpbWVudGF0aW9uLCB0ZXN0aW5nLCBhbmQgc3VnZ2VzdGVkIHNvbHV0aW9ucyBvZgorCSAqIG9mIGF1ZGlvL3ZpZGVvIHN5bmMgcHJvYmxlbXMgd2l0aCBTVmlkZW8gYW5kIENWQlMgY2FwdHVyZXMuCisJICovCiAKIAlpZiAoc3RhdGUtPmF1ZF9pbnB1dCA+IENYMThfQVZfQVVESU9fU0VSSUFMMikgewogCQlzd2l0Y2ggKGZyZXEpIHsKIAkJY2FzZSAzMjAwMDoKLQkJCS8qIFZJRF9QTEwgYW5kIEFVWF9QTEwgKi8KLQkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwOCwgMHgxNDA4MDQwZik7CisJCQkvKgorCQkJICogVklEX1BMTCBJbnRlZ2VyID0gMHgwZiwgVklEX1BMTCBQb3N0IERpdmlkZXIgPSAweDA0CisJCQkgKiBBVVhfUExMIEludGVnZXIgPSAweDBkLCBBVVggUExMIFBvc3QgRGl2aWRlciA9IDB4MjAKKwkJCSAqLworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTA4LCAweDIwMGQwNDBmKTsKIAotCQkJLyogQVVYX1BMTF9GUkFDICovCi0JCQkvKiAweDguOTUwNDMxOGEgKiAyOCw2MzYsMzYzLjYzNiAvIDB4MTQgPSAzMjAwMCAqIDM4NCAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTEwLCAweDAxMmEwODYzKTsKKwkJCS8qIFZJRF9QTEwgRnJhY3Rpb24gPSAweDJiZTJmZSAqLworCQkJLyogeHRhbCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6OiA0MzIgTUh6IHByZS1wb3N0ZGl2Ki8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwYywgMHgwMDJiZTJmZSk7CisKKwkJCS8qIEFVWF9QTEwgRnJhY3Rpb24gPSAweDE3Njc0MGMgKi8KKwkJCS8qIHh0YWwgKiAweGQuYmIzYTA2MC8weDIwID0gMzIwMDAgKiAzODQ6IDM5MyBNSHogcC1wZCovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMTAsIDB4MDE3Njc0MGMpOwogCiAJCQkvKiBzcmMzLzQvNl9jdGwgKi8KLQkJCS8qIDB4MS5mNzdmID0gKDQgKiAxNTczNC4yNikgLyAzMjAwMCAqLworCQkJLyogMHgxLmY3N2YgPSAoNCAqIHh0YWwvOCoyLzQ1NSkgLyAzMjAwMCAqLwogCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4OTAwLCAweDA4MDFmNzdmKTsKIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwNCwgMHgwODAxZjc3Zik7CiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHg5MGMsIDB4MDgwMWY3N2YpOwogCi0JCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDE0ICovCi0JCQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg1NCk7CisJCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDIwICovCisJCQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg2MCk7CiAKIAkJCS8qIEFVRF9DT1VOVCA9IDB4MmZmZiA9IDggc2FtcGxlcyAqIDQgKiAzODQgLSAxICovCiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMmMsIDB4MTEyMDJmZmYpOwogCiAJCQkvKgotCQkJICogRU5fQVZfTE9DSyA9IDEKKwkJCSAqIEVOX0FWX0xPQ0sgPSAwCiAJCQkgKiBWSURfQ09VTlQgPSAweDBkMmVmOCA9IDEwNzk5OS4wMDAgKiA4ID0KIAkJCSAqICAoKDggc2FtcGxlcy8zMiwwMDApICogKDEzLDUwMCwwMDAgKiA4KSAqIDQgLSAxKSAqIDgKIAkJCSAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTI4LCAweGExMGQyZWY4KTsKKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyOCwgMHhhMDBkMmVmOCk7CiAJCQlicmVhazsKIAogCQljYXNlIDQ0MTAwOgotCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTA4LCAweDEwMDkwNDBmKTsKKwkJCS8qCisJCQkgKiBWSURfUExMIEludGVnZXIgPSAweDBmLCBWSURfUExMIFBvc3QgRGl2aWRlciA9IDB4MDQKKwkJCSAqIEFVWF9QTEwgSW50ZWdlciA9IDB4MGUsIEFVWCBQTEwgUG9zdCBEaXZpZGVyID0gMHgxOAorCQkJICovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMDgsIDB4MTgwZTA0MGYpOwogCi0JCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCS8qIDB4OS43NjM1ZTcgKiAyOCw2MzYsMzYzLjYzIC8gMHgxMCA9IDQ0MTAwICogMzg0ICovCi0JCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMTAsIDB4MDBlYzZiY2UpOworCQkJLyogVklEX1BMTCBGcmFjdGlvbiA9IDB4MmJlMmZlICovCisJCQkvKiB4dGFsICogMHhmLjE1ZjE3ZjAvNCA9IDEwOCBNSHo6IDQzMiBNSHogcHJlLXBvc3RkaXYqLworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTBjLCAweDAwMmJlMmZlKTsKKworCQkJLyogQVVYX1BMTCBGcmFjdGlvbiA9IDB4MDYyYTFmMiAqLworCQkJLyogeHRhbCAqIDB4ZS4zMTUwZjkwLzB4MTggPSA0NDEwMCAqIDM4NDogNDA2IE1IeiBwLXBkKi8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDExMCwgMHgwMDYyYTFmMik7CiAKIAkJCS8qIHNyYzMvNC82X2N0bCAqLwotCQkJLyogMHgxLjZkNTkgPSAoNCAqIDE1NzM0LjI2KSAvIDQ0MTAwICovCisJCQkvKiAweDEuNmQ1OSA9ICg0ICogeHRhbC84KjIvNDU1KSAvIDQ0MTAwICovCiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHg5MDAsIDB4MDgwMTZkNTkpOwogCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4OTA0LCAweDA4MDE2ZDU5KTsKIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwYywgMHgwODAxNmQ1OSk7CiAKKwkJCS8qIFNBX01DTEtfU0VMPTEsIFNBX01DTEtfRElWPTB4MTggKi8KKwkJCWN4MThfYXZfd3JpdGUoY3gsIDB4MTI3LCAweDU4KTsKKwogCQkJLyogQVVEX0NPVU5UID0gMHg5MmZmID0gNDkgc2FtcGxlcyAqIDIgKiAzODQgLSAxICovCiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMmMsIDB4MTEyMDkyZmYpOwogCiAJCQkvKgotCQkJICogRU5fQVZfTE9DSyA9IDEKKwkJCSAqIEVOX0FWX0xPQ0sgPSAwCiAJCQkgKiBWSURfQ09VTlQgPSAweDFkNGJmOCA9IDIzOTk5OS4wMDAgKiA4ID0KIAkJCSAqICAoKDQ5IHNhbXBsZXMvNDQsMTAwKSAqICgxMyw1MDAsMDAwICogOCkgKiAyIC0gMSkgKiA4CiAJCQkgKi8KLQkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyOCwgMHhhMTFkNGJmOCk7CisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMjgsIDB4YTAxZDRiZjgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSA0ODAwMDoKLQkJCS8qIFZJRF9QTEwgYW5kIEFVWF9QTEwgKi8KLQkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwOCwgMHgxMDBhMDQwZik7CisJCQkvKgorCQkJICogVklEX1BMTCBJbnRlZ2VyID0gMHgwZiwgVklEX1BMTCBQb3N0IERpdmlkZXIgPSAweDA0CisJCQkgKiBBVVhfUExMIEludGVnZXIgPSAweDBlLCBBVVggUExMIFBvc3QgRGl2aWRlciA9IDB4MTYKKwkJCSAqLworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTA4LCAweDE2MGUwNDBmKTsKIAotCQkJLyogQVVYX1BMTF9GUkFDICovCi0JCQkvKiAweGEuNGM2YjZlYSAqIDI4LDYzNiwzNjMuNjMgLyAweDEwID0gNDgwMDAgKiAzODQgKi8KLQkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDExMCwgMHgwMDk4ZDZkZCk7CisJCQkvKiBWSURfUExMIEZyYWN0aW9uID0gMHgyYmUyZmUgKi8KKwkJCS8qIHh0YWwgKiAweGYuMTVmMTdmMC80ID0gMTA4IE1IejogNDMyIE1IeiBwcmUtcG9zdGRpdiovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMGMsIDB4MDAyYmUyZmUpOworCisJCQkvKiBBVVhfUExMIEZyYWN0aW9uID0gMHgwNTIyN2FkICovCisJCQkvKiB4dGFsICogMHhlLjI5MTNkNjgvMHgxNiA9IDQ4MDAwICogMzg0OiA0MDYgTUh6IHAtcGQqLworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTEwLCAweDAwNTIyN2FkKTsKIAogCQkJLyogc3JjMy80LzZfY3RsICovCi0JCQkvKiAweDEuNGZhYSA9ICg0ICogMTU3MzQuMjYpIC8gNDgwMDAgKi8KKwkJCS8qIDB4MS40ZmFhID0gKDQgKiB4dGFsLzgqMi80NTUpIC8gNDgwMDAgKi8KIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwMCwgMHgwODAxNGZhYSk7CiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHg5MDQsIDB4MDgwMTRmYWEpOwogCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4OTBjLCAweDA4MDE0ZmFhKTsKIAorCQkJLyogU0FfTUNMS19TRUw9MSwgU0FfTUNMS19ESVY9MHgxNiAqLworCQkJY3gxOF9hdl93cml0ZShjeCwgMHgxMjcsIDB4NTYpOworCiAJCQkvKiBBVURfQ09VTlQgPSAweDVmZmYgPSA0IHNhbXBsZXMgKiAxNiAqIDM4NCAtIDEgKi8KIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyYywgMHgxMTIwNWZmZik7CiAKIAkJCS8qCi0JCQkgKiBFTl9BVl9MT0NLID0gMQorCQkJICogRU5fQVZfTE9DSyA9IDAKIAkJCSAqIFZJRF9DT1VOVCA9IDB4MTE5M2Y4ID0gMTQzOTk5LjAwMCAqIDggPQogCQkJICogICgoNCBzYW1wbGVzLzQ4LDAwMCkgKiAoMTMsNTAwLDAwMCAqIDgpICogMTYgLSAxKSAqIDgKIAkJCSAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTI4LCAweGExMTE5M2Y4KTsKKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyOCwgMHhhMDExOTNmOCk7CiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7CiAJCXN3aXRjaCAoZnJlcSkgewogCQljYXNlIDMyMDAwOgotCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTA4LCAweDFlMDgwNDBmKTsKKwkJCS8qCisJCQkgKiBWSURfUExMIEludGVnZXIgPSAweDBmLCBWSURfUExMIFBvc3QgRGl2aWRlciA9IDB4MDQKKwkJCSAqIEFVWF9QTEwgSW50ZWdlciA9IDB4MGQsIEFVWCBQTEwgUG9zdCBEaXZpZGVyID0gMHgzMAorCQkJICovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMDgsIDB4MzAwZDA0MGYpOwogCi0JCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCS8qIDB4OC45NTA0MzE4ICogMjgsNjM2LDM2My42MyAvIDB4MWUgPSAzMjAwMCAqIDI1NiAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTEwLCAweDAxMmEwODYzKTsKKwkJCS8qIFZJRF9QTEwgRnJhY3Rpb24gPSAweDJiZTJmZSAqLworCQkJLyogeHRhbCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6OiA0MzIgTUh6IHByZS1wb3N0ZGl2Ki8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwYywgMHgwMDJiZTJmZSk7CisKKwkJCS8qIEFVWF9QTEwgRnJhY3Rpb24gPSAweDE3Njc0MGMgKi8KKwkJCS8qIHh0YWwgKiAweGQuYmIzYTA2MC8weDMwID0gMzIwMDAgKiAyNTY6IDM5MyBNSHogcC1wZCovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMTAsIDB4MDE3Njc0MGMpOwogCiAJCQkvKiBzcmMxX2N0bCAqLwogCQkJLyogMHgxLjAwMDAgPSAzMjAwMC8zMjAwMCAqLwpAQCAtMTMzLDI3ICsyMDEsMzQgQEAKIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwNCwgMHgwODAyMDAwMCk7CiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHg5MGMsIDB4MDgwMjAwMDApOwogCi0JCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDE0ICovCi0JCQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg1NCk7CisJCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDMwICovCisJCQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg3MCk7CiAKIAkJCS8qIEFVRF9DT1VOVCA9IDB4MWZmZiA9IDggc2FtcGxlcyAqIDQgKiAyNTYgLSAxICovCiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMmMsIDB4MTEyMDFmZmYpOwogCiAJCQkvKgotCQkJICogRU5fQVZfTE9DSyA9IDEKKwkJCSAqIEVOX0FWX0xPQ0sgPSAwCiAJCQkgKiBWSURfQ09VTlQgPSAweDBkMmVmOCA9IDEwNzk5OS4wMDAgKiA4ID0KIAkJCSAqICAoKDggc2FtcGxlcy8zMiwwMDApICogKDEzLDUwMCwwMDAgKiA4KSAqIDQgLSAxKSAqIDgKIAkJCSAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTI4LCAweGExMGQyZWY4KTsKKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyOCwgMHhhMDBkMmVmOCk7CiAJCQlicmVhazsKIAogCQljYXNlIDQ0MTAwOgotCQkJLyogVklEX1BMTCBhbmQgQVVYX1BMTCAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTA4LCAweDE4MDkwNDBmKTsKKwkJCS8qCisJCQkgKiBWSURfUExMIEludGVnZXIgPSAweDBmLCBWSURfUExMIFBvc3QgRGl2aWRlciA9IDB4MDQKKwkJCSAqIEFVWF9QTEwgSW50ZWdlciA9IDB4MGUsIEFVWCBQTEwgUG9zdCBEaXZpZGVyID0gMHgyNAorCQkJICovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMDgsIDB4MjQwZTA0MGYpOwogCi0JCQkvKiBBVVhfUExMX0ZSQUMgKi8KLQkJCS8qIDB4OS43NjM1ZTc0ICogMjgsNjM2LDM2My42MyAvIDB4MTggPSA0NDEwMCAqIDI1NiAqLwotCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTEwLCAweDAwZWM2YmNlKTsKKwkJCS8qIFZJRF9QTEwgRnJhY3Rpb24gPSAweDJiZTJmZSAqLworCQkJLyogeHRhbCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6OiA0MzIgTUh6IHByZS1wb3N0ZGl2Ki8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwYywgMHgwMDJiZTJmZSk7CisKKwkJCS8qIEFVWF9QTEwgRnJhY3Rpb24gPSAweDA2MmExZjIgKi8KKwkJCS8qIHh0YWwgKiAweGUuMzE1MGY5MC8weDI0ID0gNDQxMDAgKiAyNTY6IDQwNiBNSHogcC1wZCovCisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMTAsIDB4MDA2MmExZjIpOwogCiAJCQkvKiBzcmMxX2N0bCAqLwogCQkJLyogMHgxLjYwY2QgPSA0NDEwMC8zMjAwMCAqLwpAQCAtMTY1LDI0ICsyNDAsMzQgQEAKIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwNCwgMHgwODAxNzM4NSk7CiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHg5MGMsIDB4MDgwMTczODUpOwogCisJCQkvKiBTQV9NQ0xLX1NFTD0xLCBTQV9NQ0xLX0RJVj0weDI0ICovCisJCQljeDE4X2F2X3dyaXRlKGN4LCAweDEyNywgMHg2NCk7CisKIAkJCS8qIEFVRF9DT1VOVCA9IDB4NjFmZiA9IDQ5IHNhbXBsZXMgKiAyICogMjU2IC0gMSAqLwogCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTJjLCAweDExMjA2MWZmKTsKIAogCQkJLyoKLQkJCSAqIEVOX0FWX0xPQ0sgPSAxCisJCQkgKiBFTl9BVl9MT0NLID0gMAogCQkJICogVklEX0NPVU5UID0gMHgxZDRiZjggPSAyMzk5OTkuMDAwICogOCA9CiAJCQkgKiAgKCg0OSBzYW1wbGVzLzQ0LDEwMCkgKiAoMTMsNTAwLDAwMCAqIDgpICogMiAtIDEpICogOAogCQkJICovCi0JCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMjgsIDB4YTExZDRiZjgpOworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTI4LCAweGEwMWQ0YmY4KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgNDgwMDA6Ci0JCQkvKiBWSURfUExMIGFuZCBBVVhfUExMICovCi0JCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMDgsIDB4MTgwYTA0MGYpOworCQkJLyoKKwkJCSAqIFZJRF9QTEwgSW50ZWdlciA9IDB4MGYsIFZJRF9QTEwgUG9zdCBEaXZpZGVyID0gMHgwNAorCQkJICogQVVYX1BMTCBJbnRlZ2VyID0gMHgwZCwgQVVYIFBMTCBQb3N0IERpdmlkZXIgPSAweDIwCisJCQkgKi8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEwOCwgMHgyMDBkMDQwZik7CiAKLQkJCS8qIEFVWF9QTExfRlJBQyAqLwotCQkJLyogMHhhLjRjNmI2ZWEgKiAyOCw2MzYsMzYzLjYzIC8gMHgxOCA9IDQ4MDAwICogMjU2ICovCi0JCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMTAsIDB4MDA5OGQ2ZGQpOworCQkJLyogVklEX1BMTCBGcmFjdGlvbiA9IDB4MmJlMmZlICovCisJCQkvKiB4dGFsICogMHhmLjE1ZjE3ZjAvNCA9IDEwOCBNSHo6IDQzMiBNSHogcHJlLXBvc3RkaXYqLworCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4MTBjLCAweDAwMmJlMmZlKTsKKworCQkJLyogQVVYX1BMTCBGcmFjdGlvbiA9IDB4MTc2NzQwYyAqLworCQkJLyogeHRhbCAqIDB4ZC5iYjNhMDYwLzB4MjAgPSA0ODAwMCAqIDI1NjogMzkzIE1IeiBwLXBkKi8KKwkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDExMCwgMHgwMTc2NzQwYyk7CiAKIAkJCS8qIHNyYzFfY3RsICovCiAJCQkvKiAweDEuODAwMCA9IDQ4MDAwLzMyMDAwICovCkBAIC0xOTQsMTUgKzI3OSwxOCBAQAogCQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4OTA0LCAweDA4MDE1NTU1KTsKIAkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDkwYywgMHgwODAxNTU1NSk7CiAKKwkJCS8qIFNBX01DTEtfU0VMPTEsIFNBX01DTEtfRElWPTB4MjAgKi8KKwkJCWN4MThfYXZfd3JpdGUoY3gsIDB4MTI3LCAweDYwKTsKKwogCQkJLyogQVVEX0NPVU5UID0gMHgzZmZmID0gNCBzYW1wbGVzICogMTYgKiAyNTYgLSAxICovCiAJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMmMsIDB4MTEyMDNmZmYpOwogCiAJCQkvKgotCQkJICogRU5fQVZfTE9DSyA9IDEKKwkJCSAqIEVOX0FWX0xPQ0sgPSAwCiAJCQkgKiBWSURfQ09VTlQgPSAweDExOTNmOCA9IDE0Mzk5OS4wMDAgKiA4ID0KIAkJCSAqICAoKDQgc2FtcGxlcy80OCwwMDApICogKDEzLDUwMCwwMDAgKiA4KSAqIDE2IC0gMSkgKiA4CiAJCQkgKi8KLQkJCWN4MThfYXZfd3JpdGU0KGN4LCAweDEyOCwgMHhhMTExOTNmOCk7CisJCQljeDE4X2F2X3dyaXRlNChjeCwgMHgxMjgsIDB4YTAxMTkzZjgpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yMTUsMTIgKzMwMywxNSBAQAogdm9pZCBjeDE4X2F2X2F1ZGlvX3NldF9wYXRoKHN0cnVjdCBjeDE4ICpjeCkKIHsKIAlzdHJ1Y3QgY3gxOF9hdl9zdGF0ZSAqc3RhdGUgPSAmY3gtPmF2X3N0YXRlOworCXU4IHY7CiAKIAkvKiBzdG9wIG1pY3JvY29udHJvbGxlciAqLwotCWN4MThfYXZfYW5kX29yKGN4LCAweDgwMywgfjB4MTAsIDApOworCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4ODAzKSAmIH4weDEwOworCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwMywgdiwgdiwgMHgxZik7CiAKIAkvKiBhc3NlcnQgc29mdCByZXNldCAqLwotCWN4MThfYXZfYW5kX29yKGN4LCAweDgxMCwgfjB4MSwgMHgwMSk7CisJdiA9IGN4MThfYXZfcmVhZChjeCwgMHg4MTApIHwgMHgwMTsKKwljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MTAsIHYsIHYsIDB4MGYpOwogCiAJLyogTXV0ZSBldmVyeXRoaW5nIHRvIHByZXZlbnQgdGhlIFBGRlQhICovCiAJY3gxOF9hdl93cml0ZShjeCwgMHg4ZDMsIDB4MWYpOwpAQCAtMjQwLDEyICszMzEsMTQgQEAKIAlzZXRfYXVkY2xrX2ZyZXEoY3gsIHN0YXRlLT5hdWRjbGtfZnJlcSk7CiAKIAkvKiBkZWFzc2VydCBzb2Z0IHJlc2V0ICovCi0JY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODEwLCB+MHgxLCAweDAwKTsKKwl2ID0gY3gxOF9hdl9yZWFkKGN4LCAweDgxMCkgJiB+MHgwMTsKKwljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MTAsIHYsIHYsIDB4MGYpOwogCiAJaWYgKHN0YXRlLT5hdWRfaW5wdXQgPiBDWDE4X0FWX0FVRElPX1NFUklBTDIpIHsKIAkJLyogV2hlbiB0aGUgbWljcm9jb250cm9sbGVyIGRldGVjdHMgdGhlCiAJCSAqIGF1ZGlvIGZvcm1hdCwgaXQgd2lsbCB1bm11dGUgdGhlIGxpbmVzICovCi0JCWN4MThfYXZfYW5kX29yKGN4LCAweDgwMywgfjB4MTAsIDB4MTApOworCQl2ID0gY3gxOF9hdl9yZWFkKGN4LCAweDgwMykgfCAweDEwOworCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDMsIHYsIHYsIDB4MWYpOwogCX0KIH0KIApAQCAtMzQ3LDE5ICs0NDAsMjMgQEAKIHN0YXRpYyB2b2lkIHNldF9tdXRlKHN0cnVjdCBjeDE4ICpjeCwgaW50IG11dGUpCiB7CiAJc3RydWN0IGN4MThfYXZfc3RhdGUgKnN0YXRlID0gJmN4LT5hdl9zdGF0ZTsKKwl1OCB2OwogCiAJaWYgKHN0YXRlLT5hdWRfaW5wdXQgPiBDWDE4X0FWX0FVRElPX1NFUklBTDIpIHsKIAkJLyogTXVzdCB0dXJuIG9mZiBtaWNyb2NvbnRyb2xsZXIgaW4gb3JkZXIgdG8gbXV0ZSBzb3VuZC4KIAkJICogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBtZXRob2QsIGJ1dCBpdCBkb2VzIHdvcmsuCiAJCSAqIElmIHRoZSBtaWNyb2NvbnRyb2xsZXIgaXMgcnVubmluZywgdGhlbiBpdCB3aWxsIHVuZG8gYW55CiAJCSAqIGNoYW5nZXMgdG8gdGhlIG11dGUgcmVnaXN0ZXIuICovCisJCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4ODAzKTsKIAkJaWYgKG11dGUpIHsKIAkJCS8qIGRpc2FibGUgbWljcm9jb250cm9sbGVyICovCi0JCQljeDE4X2F2X2FuZF9vcihjeCwgMHg4MDMsIH4weDEwLCAweDAwKTsKKwkJCXYgJj0gfjB4MTA7CisJCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDMsIHYsIHYsIDB4MWYpOwogCQkJY3gxOF9hdl93cml0ZShjeCwgMHg4ZDMsIDB4MWYpOwogCQl9IGVsc2UgewogCQkJLyogZW5hYmxlIG1pY3JvY29udHJvbGxlciAqLwotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CisJCQl2IHw9IDB4MTA7CisJCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDMsIHYsIHYsIDB4MWYpOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogU1JDMV9NVVRFX0VOICovCkBAIC0zNzUsMTYgKzQ3MiwyNiBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKKwl7CisJCXU4IHY7CiAJCWlmIChzdGF0ZS0+YXVkX2lucHV0ID4gQ1gxOF9BVl9BVURJT19TRVJJQUwyKSB7Ci0JCQljeDE4X2F2X2FuZF9vcihjeCwgMHg4MDMsIH4weDEwLCAwKTsKKwkJCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4ODAzKSAmIH4weDEwOworCQkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODAzLCB2LCB2LCAweDFmKTsKIAkJCWN4MThfYXZfd3JpdGUoY3gsIDB4OGQzLCAweDFmKTsKIAkJfQotCQljeDE4X2F2X2FuZF9vcihjeCwgMHg4MTAsIH4weDEsIDEpOworCQl2ID0gY3gxOF9hdl9yZWFkKGN4LCAweDgxMCkgfCAweDE7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgxMCwgdiwgdiwgMHgwZik7CisKIAkJcmV0dmFsID0gc2V0X2F1ZGNsa19mcmVxKGN4LCAqKHUzMiAqKWFyZyk7Ci0JCWN4MThfYXZfYW5kX29yKGN4LCAweDgxMCwgfjB4MSwgMCk7Ci0JCWlmIChzdGF0ZS0+YXVkX2lucHV0ID4gQ1gxOF9BVl9BVURJT19TRVJJQUwyKQotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CisKKwkJdiA9IGN4MThfYXZfcmVhZChjeCwgMHg4MTApICYgfjB4MTsKKwkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODEwLCB2LCB2LCAweDBmKTsKKwkJaWYgKHN0YXRlLT5hdWRfaW5wdXQgPiBDWDE4X0FWX0FVRElPX1NFUklBTDIpIHsKKwkJCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4ODAzKSB8IDB4MTA7CisJCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDMsIHYsIHYsIDB4MWYpOworCQl9CiAJCXJldHVybiByZXR2YWw7CisJfQogCiAJY2FzZSBWSURJT0NfR19DVFJMOgogCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmMKaW5kZXggNzNmNTE0MS4uMGIxYzg0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBEZXJpdmVkIGZyb20gY3gyNTg0MC1jb3JlLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMzYsMTIgKzM3LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBjeDE4X2F2X3dyaXRlX2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1OCB2YWx1ZSwgdTggZXZhbCwgdTggbWFzaykKK3sKKwl1MzIgcmVnID0gMHhjNDAwMDAgKyAoYWRkciAmIH4zKTsKKwlpbnQgc2hpZnQgPSAoYWRkciAmIDMpICogODsKKwl1MzIgeCA9IGN4MThfcmVhZF9yZWcoY3gsIHJlZyk7CisKKwl4ID0gKHggJiB+KCh1MzIpMHhmZiA8PCBzaGlmdCkpIHwgKCh1MzIpdmFsdWUgPDwgc2hpZnQpOworCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgeCwgcmVnLAorCQkJCSgodTMyKWV2YWwgPDwgc2hpZnQpLCAoKHUzMiltYXNrIDw8IHNoaWZ0KSk7CisJcmV0dXJuIDA7Cit9CisKIGludCBjeDE4X2F2X3dyaXRlNChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1MzIgdmFsdWUpCiB7CiAJY3gxOF93cml0ZV9yZWcoY3gsIHZhbHVlLCAweGM0MDAwMCArIGFkZHIpOwogCXJldHVybiAwOwogfQogCitpbnQKK2N4MThfYXZfd3JpdGU0X2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1MzIgdmFsdWUsIHUzMiBldmFsLCB1MzIgbWFzaykKK3sKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIHZhbHVlLCAweGM0MDAwMCArIGFkZHIsIGV2YWwsIG1hc2spOworCXJldHVybiAwOworfQorCiBpbnQgY3gxOF9hdl93cml0ZTRfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1MzIgdmFsdWUpCiB7CiAJY3gxOF93cml0ZV9yZWdfbm9yZXRyeShjeCwgdmFsdWUsIDB4YzQwMDAwICsgYWRkcik7CkBAIC02MSwxMSArODEsNiBAQAogCXJldHVybiBjeDE4X3JlYWRfcmVnKGN4LCAweGM0MDAwMCArIGFkZHIpOwogfQogCi11MzIgY3gxOF9hdl9yZWFkNF9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIpCi17Ci0JcmV0dXJuIGN4MThfcmVhZF9yZWdfbm9yZXRyeShjeCwgMHhjNDAwMDAgKyBhZGRyKTsKLX0KLQogaW50IGN4MThfYXZfYW5kX29yKHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHVuc2lnbmVkIGFuZF9tYXNrLAogCQkgICB1OCBvcl92YWx1ZSkKIHsKQEAgLTk4LDE0ICsxMTMsMTYgQEAKIAogCWN4MThfYXZfbG9hZGZ3KGN4KTsKIAkvKiBTdG9wIDgwNTEgY29kZSBleGVjdXRpb24gKi8KLQljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX0RMX0NUTCwgMHgwMzAwMDAwMCk7CisJY3gxOF9hdl93cml0ZTRfZXhwZWN0KGN4LCBDWEFERUNfRExfQ1RMLCAweDAzMDAwMDAwLAorCQkJCQkJIDB4MDMwMDAwMDAsIDB4MTMwMDAwMDApOwogCiAJLyogaW5pdGFsbGl6ZSB0aGUgUExMIGJ5IHRvZ2dsaW5nIHNsZWVwIGJpdCAqLwogCXYgPSBjeDE4X2F2X3JlYWQ0KGN4LCBDWEFERUNfSE9TVF9SRUcxKTsKLQkvKiBlbmFibGUgc2xlZXAgbW9kZSAqLwotCWN4MThfYXZfd3JpdGU0KGN4LCBDWEFERUNfSE9TVF9SRUcxLCB2IHwgMSk7CisJLyogZW5hYmxlIHNsZWVwIG1vZGUgLSByZWdpc3RlciBhcHBlYXJzIHRvIGJlIHJlYWQgb25seS4uLiAqLworCWN4MThfYXZfd3JpdGU0X2V4cGVjdChjeCwgQ1hBREVDX0hPU1RfUkVHMSwgdiB8IDEsIHYsIDB4ZmZmZSk7CiAJLyogZGlzYWJsZSBzbGVlcCBtb2RlICovCi0JY3gxOF9hdl93cml0ZTQoY3gsIENYQURFQ19IT1NUX1JFRzEsIHYgJiAweGZmZmUpOworCWN4MThfYXZfd3JpdGU0X2V4cGVjdChjeCwgQ1hBREVDX0hPU1RfUkVHMSwgdiAmIDB4ZmZmZSwKKwkJCQkJCSAgICB2ICYgMHhmZmZlLCAweGZmZmYpOwogCiAJLyogaW5pdGlhbGl6ZSBETExzICovCiAJdiA9IGN4MThfYXZfcmVhZDQoY3gsIENYQURFQ19ETEwxX0RJQUdfQ1RSTCkgJiAweEUxRkZGRUZGOwpAQCAtMTI1LDkgKzE0MiwxMCBAQAogCiAJdiA9IGN4MThfYXZfcmVhZDQoY3gsIENYQURFQ19BRkVfRElBR19DVFJMMykgfCAxOwogCS8qIGVuYWJsZSBUVU5FX0ZJTF9SU1QgKi8KLQljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX0FGRV9ESUFHX0NUUkwzLCB2KTsKKwljeDE4X2F2X3dyaXRlNF9leHBlY3QoY3gsIENYQURFQ19BRkVfRElBR19DVFJMMywgdiwgdiwgMHgwMzAwOUYwRik7CiAJLyogZGlzYWJsZSBUVU5FX0ZJTF9SU1QgKi8KLQljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX0FGRV9ESUFHX0NUUkwzLCB2ICYgMHhGRkZGRkZGRSk7CisJY3gxOF9hdl93cml0ZTRfZXhwZWN0KGN4LCBDWEFERUNfQUZFX0RJQUdfQ1RSTDMsCisJCQkgICAgICB2ICYgMHhGRkZGRkZGRSwgdiAmIDB4RkZGRkZGRkUsIDB4MDMwMDlGMEYpOwogCiAJLyogZW5hYmxlIDY1NiBvdXRwdXQgKi8KIAljeDE4X2F2X2FuZF9vcjQoY3gsIENYQURFQ19QSU5fQ1RSTDEsIH4wLCAweDA0MEMwMCk7CkBAIC0yNTEsMTAgKzI2OSw5IEBACiAJCQlwbGxfaW50LCBwbGxfZnJhYywgcGxsX3Bvc3QpOwogCiAJaWYgKHBsbF9wb3N0KSB7Ci0JCWludCBmaW4sIGZzYzsKLQkJaW50IHBsbCA9IDI4NjM2MzYzTCAqICgoKCh1NjQpcGxsX2ludCkgPDwgMjUpICsgcGxsX2ZyYWMpOworCQlpbnQgZmluLCBmc2MsIHBsbDsKIAotCQlwbGwgPj49IDI1OworCQlwbGwgPSAoMjg2MzYzNjBMICogKCgoKHU2NClwbGxfaW50KSA8PCAyNSkgKyBwbGxfZnJhYykpID4+IDI1OwogCQlwbGwgLz0gcGxsX3Bvc3Q7CiAJCUNYMThfREVCVUdfSU5GTygiUExMID0gJWQuJTA2ZCBNSHpcbiIsCiAJCQkJCXBsbCAvIDEwMDAwMDAsIHBsbCAlIDEwMDAwMDApOwpAQCAtMzI0LDYgKzM0MSw3IEBACiB7CiAJc3RydWN0IGN4MThfYXZfc3RhdGUgKnN0YXRlID0gJmN4LT5hdl9zdGF0ZTsKIAl2NGwyX3N0ZF9pZCBzdGQgPSBzdGF0ZS0+c3RkOworCXU4IHY7CiAKIAkvKiBGb2xsb3cgc3RlcCA4YyBhbmQgOGQgb2Ygc2VjdGlvbiAzLjE2IGluIHRoZSBjeDE4X2F2IGRhdGFzaGVldCAqLwogCWN4MThfYXZfd3JpdGUoY3gsIDB4NDlmLCAoc3RkICYgVjRMMl9TVERfTlRTQykgPyAweDE0IDogMHgxMSk7CkBAIC0zMzMsMzEgKzM1MSwzNCBAQAogCWlmIChzdGQgJiBWNEwyX1NURF81MjVfNjApIHsKIAkJaWYgKHN0ZCA9PSBWNEwyX1NURF9OVFNDX01fSlApIHsKIAkJCS8qIEphcGFuIHVzZXMgRUlBSiBhdWRpbyBzdGFuZGFyZCAqLwotCQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MDgsIDB4ZjcpOwotCQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MGIsIDB4MDIpOworCQkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODA4LCAweGY3LCAweGY3LCAweGZmKTsKKwkJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwYiwgMHgwMiwgMHgwMiwgMHgzZik7CiAJCX0gZWxzZSBpZiAoc3RkID09IFY0TDJfU1REX05UU0NfTV9LUikgewogCQkJLyogU291dGggS29yZWEgdXNlcyBBMiBhdWRpbyBzdGFuZGFyZCAqLwotCQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MDgsIDB4ZjgpOwotCQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MGIsIDB4MDMpOworCQkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODA4LCAweGY4LCAweGY4LCAweGZmKTsKKwkJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwYiwgMHgwMywgMHgwMywgMHgzZik7CiAJCX0gZWxzZSB7CiAJCQkvKiBPdGhlcnMgdXNlIHRoZSBCVFNDIGF1ZGlvIHN0YW5kYXJkICovCi0JCQljeDE4X2F2X3dyaXRlKGN4LCAweDgwOCwgMHhmNik7Ci0JCQljeDE4X2F2X3dyaXRlKGN4LCAweDgwYiwgMHgwMSk7CisJCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDgsIDB4ZjYsIDB4ZjYsIDB4ZmYpOworCQkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODBiLCAweDAxLCAweDAxLCAweDNmKTsKIAkJfQogCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7CiAJCS8qIEZvbGxvdyB0dW5lciBjaGFuZ2UgcHJvY2VkdXJlIGZvciBQQUwgKi8KLQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MDgsIDB4ZmYpOwotCQljeDE4X2F2X3dyaXRlKGN4LCAweDgwYiwgMHgwMyk7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwOCwgMHhmZiwgMHhmZiwgMHhmZik7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwYiwgMHgwMywgMHgwMywgMHgzZik7CiAJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9TRUNBTSkgewogCQkvKiBTZWxlY3QgYXV0b2RldGVjdCBmb3IgU0VDQU0gKi8KLQkJY3gxOF9hdl93cml0ZShjeCwgMHg4MDgsIDB4ZmYpOwotCQljeDE4X2F2X3dyaXRlKGN4LCAweDgwYiwgMHgwMyk7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwOCwgMHhmZiwgMHhmZiwgMHhmZik7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwYiwgMHgwMywgMHgwMywgMHgzZik7CiAJfQogCi0JaWYgKGN4MThfYXZfcmVhZChjeCwgMHg4MDMpICYgMHgxMCkgeworCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4ODAzKTsKKwlpZiAodiAmIDB4MTApIHsKIAkJLyogcmVzdGFydCBhdWRpbyBkZWNvZGVyIG1pY3JvY29udHJvbGxlciAqLwotCQljeDE4X2F2X2FuZF9vcihjeCwgMHg4MDMsIH4weDEwLCAweDAwKTsKLQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CisJCXYgJj0gfjB4MTA7CisJCWN4MThfYXZfd3JpdGVfZXhwZWN0KGN4LCAweDgwMywgdiwgdiwgMHgxZik7CisJCXYgfD0gMHgxMDsKKwkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4ODAzLCB2LCB2LCAweDFmKTsKIAl9CiB9CiAKQEAgLTM2OCw2ICszODksNyBAQAogCXU4IGlzX2NvbXBvc2l0ZSA9ICh2aWRfaW5wdXQgPj0gQ1gxOF9BVl9DT01QT1NJVEUxICYmCiAJCQkgICB2aWRfaW5wdXQgPD0gQ1gxOF9BVl9DT01QT1NJVEU4KTsKIAl1OCByZWc7CisJdTggdjsKIAogCUNYMThfREVCVUdfSU5GTygiZGVjb2RlciBzZXQgdmlkZW8gaW5wdXQgJWQsIGF1ZGlvIGlucHV0ICVkXG4iLAogCQkJdmlkX2lucHV0LCBhdWRfaW5wdXQpOwpAQCAtNDEzLDE2ICs0MzUsMjMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3gxOF9hdl93cml0ZShjeCwgMHgxMDMsIHJlZyk7CisJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIDB4MTAzLCByZWcsIHJlZywgMHhmNyk7CiAJLyogU2V0IElOUFVUX01PREUgdG8gQ29tcG9zaXRlICgwKSBvciBTLVZpZGVvICgxKSAqLwogCWN4MThfYXZfYW5kX29yKGN4LCAweDQwMSwgfjB4NiwgaXNfY29tcG9zaXRlID8gMCA6IDB4MDIpOworCiAJLyogU2V0IENIX1NFTF9BREMyIHRvIDEgaWYgaW5wdXQgY29tZXMgZnJvbSBDSDMgKi8KLQljeDE4X2F2X2FuZF9vcihjeCwgMHgxMDIsIH4weDIsIChyZWcgJiAweDgwKSA9PSAwID8gMiA6IDApOworCXYgPSBjeDE4X2F2X3JlYWQoY3gsIDB4MTAyKTsKKwlpZiAocmVnICYgMHg4MCkKKwkJdiAmPSB+MHgyOworCWVsc2UKKwkJdiB8PSAweDI7CiAJLyogU2V0IERVQUxfTU9ERV9BREMyIHRvIDEgaWYgaW5wdXQgY29tZXMgZnJvbSBib3RoIENIMiBhbmQgQ0gzICovCiAJaWYgKChyZWcgJiAweGMwKSAhPSAweGMwICYmIChyZWcgJiAweDMwKSAhPSAweDMwKQotCQljeDE4X2F2X2FuZF9vcihjeCwgMHgxMDIsIH4weDQsIDQpOworCQl2IHw9IDB4NDsKIAllbHNlCi0JCWN4MThfYXZfYW5kX29yKGN4LCAweDEwMiwgfjB4NCwgMCk7CisJCXYgJj0gfjB4NDsKKwljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHgxMDIsIHYsIHYsIDB4MTcpOworCiAJLypjeDE4X2F2X2FuZF9vcjQoY3gsIDB4MTA0LCB+MHgwMDFiNDE4MCwgMHgwMDAwNDE4MCk7Ki8KIAogCXN0YXRlLT52aWRfaW5wdXQgPSB2aWRfaW5wdXQ7CkBAIC03OTksNDAgKzgyOCw0NyBAQAogCX0KIAogCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQl1OCB2OworCiAJCWlmIChzdGF0ZS0+cmFkaW8pCiAJCQlicmVhazsKIAorCQl2ID0gY3gxOF9hdl9yZWFkKGN4LCAweDgwOSk7CisJCXYgJj0gfjB4ZjsKKwogCQlzd2l0Y2ggKHZ0LT5hdWRtb2RlKSB7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CiAJCQkvKiBtb25vICAgICAgLT4gbW9ubwogCQkJICAgc3RlcmVvICAgIC0+IG1vbm8KIAkJCSAgIGJpbGluZ3VhbCAtPiBsYW5nMSAqLwotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODA5LCB+MHhmLCAweDAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgogCQkJLyogbW9ubyAgICAgIC0+IG1vbm8KIAkJCSAgIHN0ZXJlbyAgICAtPiBzdGVyZW8KIAkJCSAgIGJpbGluZ3VhbCAtPiBsYW5nMSAqLwotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODA5LCB+MHhmLCAweDA0KTsKKwkJCXYgfD0gMHg0OwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxX0xBTkcyOgogCQkJLyogbW9ubyAgICAgIC0+IG1vbm8KIAkJCSAgIHN0ZXJlbyAgICAtPiBzdGVyZW8KIAkJCSAgIGJpbGluZ3VhbCAtPiBsYW5nMS9sYW5nMiAqLwotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODA5LCB+MHhmLCAweDA3KTsKKwkJCXYgfD0gMHg3OwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgogCQkJLyogbW9ubyAgICAgIC0+IG1vbm8KIAkJCSAgIHN0ZXJlbyAgICAtPiBzdGVyZW8KIAkJCSAgIGJpbGluZ3VhbCAtPiBsYW5nMiAqLwotCQkJY3gxOF9hdl9hbmRfb3IoY3gsIDB4ODA5LCB+MHhmLCAweDAxKTsKKwkJCXYgfD0gMHgxOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQljeDE4X2F2X3dyaXRlX2V4cGVjdChjeCwgMHg4MDksIHYsIHYsIDB4ZmYpOwogCQlzdGF0ZS0+YXVkbW9kZSA9IHZ0LT5hdWRtb2RlOwogCQlicmVhazsKKwl9CiAKIAljYXNlIFZJRElPQ19HX0ZNVDoKIAkJcmV0dXJuIGdldF92NGxmbXQoY3gsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oCmluZGV4IGI2N2Q4ZGYuLmNmNjhhNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmgKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGN4MjU4NDAtY29yZS5oCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTMwMiw5ICszMDMsMTEgQEAKIGludCBjeDE4X2F2X3dyaXRlKHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHU4IHZhbHVlKTsKIGludCBjeDE4X2F2X3dyaXRlNChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1MzIgdmFsdWUpOwogaW50IGN4MThfYXZfd3JpdGU0X25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkciwgdTMyIHZhbHVlKTsKK2ludCBjeDE4X2F2X3dyaXRlX2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1OCB2YWx1ZSwgdTggZXZhbCwgdTggbWFzayk7CitpbnQgY3gxOF9hdl93cml0ZTRfZXhwZWN0KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHUzMiB2YWx1ZSwgdTMyIGV2YWwsCisJCQkgIHUzMiBtYXNrKTsKIHU4IGN4MThfYXZfcmVhZChzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyKTsKIHUzMiBjeDE4X2F2X3JlYWQ0KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIpOwotdTMyIGN4MThfYXZfcmVhZDRfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyKTsKIGludCBjeDE4X2F2X2FuZF9vcihzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1bnNpZ25lZCBtYXNrLCB1OCB2YWx1ZSk7CiBpbnQgY3gxOF9hdl9hbmRfb3I0KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHUzMiBtYXNrLCB1MzIgdmFsdWUpOwogaW50IGN4MThfYXZfY21kKHN0cnVjdCBjeDE4ICpjeCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1maXJtd2FyZS5jCmluZGV4IDUyMmEwMzUuLmM2NGZkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWZpcm13YXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtZmlybXdhcmUuYwpAQCAtMiw2ICsyLDcgQEAKICAqICBjeDE4IEFERUMgZmlybXdhcmUgZnVuY3Rpb25zCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTQzLDExICs0NCwxMyBAQAogCS8qIFRoZSBmaXJtd2FyZSBsb2FkIG9mdGVuIGhhcyBieXRlIGVycm9ycywgc28gYWxsb3cgZm9yIHNldmVyYWwKIAkgICByZXRyaWVzLCBib3RoIGF0IGJ5dGUgbGV2ZWwgYW5kIGF0IHRoZSBmaXJtd2FyZSBsb2FkIGxldmVsLiAqLwogCXdoaWxlIChyZXRyaWVzMSA8IDUpIHsKLQkJY3gxOF9hdl93cml0ZTQoY3gsIENYQURFQ19DSElQX0NUUkwsIDB4MDAwMTAwMDApOwotCQljeDE4X2F2X3dyaXRlKGN4LCBDWEFERUNfU1REX0RFVF9DVEwsIDB4ZjYpOworCQljeDE4X2F2X3dyaXRlNF9leHBlY3QoY3gsIENYQURFQ19DSElQX0NUUkwsIDB4MDAwMTAwMDAsCisJCQkJCSAgMHgwMDAwODQzMCwgMHhmZmZmZmZmZik7IC8qIGN4MjU4NDMgKi8KKwkJY3gxOF9hdl93cml0ZV9leHBlY3QoY3gsIENYQURFQ19TVERfREVUX0NUTCwgMHhmNiwgMHhmNiwgMHhmZik7CiAKLQkJLyogUmVzZXQgdGhlIE1ha28gY29yZSAoUmVnaXN0ZXIgaXMgdW5kb2N1bWVudGVkLikgKi8KLQkJY3gxOF9hdl93cml0ZTQoY3gsIDB4ODEwMCwgMHgwMDAxMDAwMCk7CisJCS8qIFJlc2V0IHRoZSBNYWtvIGNvcmUsIFJlZ2lzdGVyIGlzIGFsaWFzIG9mIENYQURFQ19DSElQX0NUUkwgKi8KKwkJY3gxOF9hdl93cml0ZTRfZXhwZWN0KGN4LCAweDgxMDAsIDB4MDAwMTAwMDAsCisJCQkJCSAgMHgwMDAwODQzMCwgMHhmZmZmZmZmZik7IC8qIGN4MjU4NDMgKi8KIAogCQkvKiBQdXQgdGhlIDgwNTEgaW4gcmVzZXQgYW5kIGVuYWJsZSBmaXJtd2FyZSB1cGxvYWQgKi8KIAkJY3gxOF9hdl93cml0ZTRfbm9yZXRyeShjeCwgQ1hBREVDX0RMX0NUTCwgMHgwRjAwMDAwMCk7CkBAIC02MSwxMyArNjQsMTIgQEAKIAkJCWludCByZXRyaWVzMjsKIAkJCWludCB1bnJlY19lcnIgPSAwOwogCi0JCQlmb3IgKHJldHJpZXMyID0gMDsgcmV0cmllczIgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7CisJCQlmb3IgKHJldHJpZXMyID0gMDsgcmV0cmllczIgPCBDWDE4X01BWF9NTUlPX1dSX1JFVFJJRVM7CiAJCQkgICAgIHJldHJpZXMyKyspIHsKIAkJCQljeDE4X2F2X3dyaXRlNF9ub3JldHJ5KGN4LCBDWEFERUNfRExfQ1RMLAogCQkJCQkJICAgICAgIGRsX2NvbnRyb2wpOwogCQkJCXVkZWxheSgxMCk7Ci0JCQkJdmFsdWUgPSBjeDE4X2F2X3JlYWQ0X25vcmV0cnkoY3gsCi0JCQkJCQkJICAgICAgQ1hBREVDX0RMX0NUTCk7CisJCQkJdmFsdWUgPSBjeDE4X2F2X3JlYWQ0KGN4LCBDWEFERUNfRExfQ1RMKTsKIAkJCQlpZiAodmFsdWUgPT0gZGxfY29udHJvbCkKIAkJCQkJYnJlYWs7CiAJCQkJLyogQ2hlY2sgaWYgd2UgY2FuIGNvcnJlY3QgdGhlIGJ5dGUgYnkgY2hhbmdpbmcKQEAgLTc4LDkgKzgwLDcgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJY3gxOF9sb2dfd3JpdGVfcmV0cmllcyhjeCwgcmV0cmllczIsCi0JCQkJCWN4LT5yZWdfbWVtICsgMHhjNDAwMDAgKyBDWEFERUNfRExfQ1RMKTsKLQkJCWlmICh1bnJlY19lcnIgfHwgcmV0cmllczIgPj0gQ1gxOF9NQVhfTU1JT19SRVRSSUVTKQorCQkJaWYgKHVucmVjX2VyciB8fCByZXRyaWVzMiA+PSBDWDE4X01BWF9NTUlPX1dSX1JFVFJJRVMpCiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgPT0gc2l6ZSkKQEAgLTkzLDcgKzkzLDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JY3gxOF9hdl93cml0ZTQoY3gsIENYQURFQ19ETF9DVEwsIDB4MTMwMDAwMDAgfCBmdy0+c2l6ZSk7CisJY3gxOF9hdl93cml0ZTRfZXhwZWN0KGN4LCBDWEFERUNfRExfQ1RMLAorCQkJCTB4MTMwMDAwMDAgfCBmdy0+c2l6ZSwgMHgxMzAwMDAwMCwgMHgxMzAwMDAwMCk7CiAKIAkvKiBPdXRwdXQgdG8gdGhlIDQxNiAqLwogCWN4MThfYXZfYW5kX29yNChjeCwgQ1hBREVDX1BJTl9DVFJMMSwgfjAsIDB4NzgwMDApOwpAQCAtMTE4LDcgKzExOSw4IEBACiAJICAgcGFzc3Rocm91Z2ggKi8KIAljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX1BJTl9DRkczLCAweDUwMDBCNjg3KTsKIAotCWN4MThfYXZfd3JpdGU0KGN4LCBDWEFERUNfU1REX0RFVF9DVEwsIDB4MDAwMDAwRjYpOworCWN4MThfYXZfd3JpdGU0X2V4cGVjdChjeCwgQ1hBREVDX1NURF9ERVRfQ1RMLCAweDAwMDAwMEY2LCAweDAwMDAwMEY2LAorCQkJCQkJCQkgIDB4M0YwMEZGRkYpOwogCS8qIEN4RGV2V3JSZWcoQ1hBREVDX1NURF9ERVRfQ1RMLCAweDAwMDAwMEZGKTsgKi8KIAogCS8qIFNldCBiaXQgMCBpbiByZWdpc3RlciAweDlDQyB0byBzaWduaWZ5IHRoYXQgdGhpcyBpcyBNaW5pTWUuICovCkBAIC0xMzYsNyArMTM4LDcgQEAKIAl2IHw9IDB4RkY7ICAgLyogQXV0byBieSBkZWZhdWx0ICovCiAJdiB8PSAweDQwMDsgIC8qIFN0ZXJlbyBieSBkZWZhdWx0ICovCiAJdiB8PSAweDE0MDAwMDAwOwotCWN4MThfYXZfd3JpdGU0KGN4LCBDWEFERUNfU1REX0RFVF9DVEwsIHYpOworCWN4MThfYXZfd3JpdGU0X2V4cGVjdChjeCwgQ1hBREVDX1NURF9ERVRfQ1RMLCB2LCB2LCAweDNGMDBGRkZGKTsKIAogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LXZiaS5jCmluZGV4IDAyZmRmNTcuLjE1MjdlYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LXZiaS5jCkBAIC0xNDEsMTAgKzE0MSwxMSBAQAogCQl1OCBsY3JbMjRdOwogCiAJCWZtdCA9IGFyZzsKLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSkKKwkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSAmJgorCQkgICAgZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJc3ZiaSA9ICZmbXQtPmZtdC5zbGljZWQ7Ci0JCWlmIChzdmJpLT5zZXJ2aWNlX3NldCA9PSAwKSB7CisJCWlmIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgewogCQkJLyogcmF3IFZCSSAqLwogCQkJbWVtc2V0KHN2YmksIDAsIHNpemVvZigqc3ZiaSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY2FyZHMuYwppbmRleCA1ZWZlMDFlLi5lMjc0MDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNhcmRzLmMKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGl2dHYtY2FyZHMuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNTAsNyArNTEsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBjeDE4X2NhcmQgY3gxOF9jYXJkX2h2cjE2MDBfZXNtdCA9IHsKIAkudHlwZSA9IENYMThfQ0FSRF9IVlJfMTYwMF9FU01ULAogCS5uYW1lID0gIkhhdXBwYXVnZSBIVlItMTYwMCIsCi0JLmNvbW1lbnQgPSAiVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAorCS5jb21tZW50ID0gIlJhdyBWQkkgc3VwcG9ydGVkOyBTbGljZWQgVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAogCS52NGwyX2NhcGFiaWxpdGllcyA9IENYMThfQ0FQX0VOQ09ERVIsCiAJLmh3X2F1ZGlvX2N0cmwgPSBDWDE4X0hXX0NYMjM0MTgsCiAJLmh3X211eGVyID0gQ1gxOF9IV19DUzUzNDUsCkBAIC05Niw3ICs5Nyw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGN4MThfY2FyZCBjeDE4X2NhcmRfaHZyMTYwMF9zYW1zdW5nID0gewogCS50eXBlID0gQ1gxOF9DQVJEX0hWUl8xNjAwX1NBTVNVTkcsCiAJLm5hbWUgPSAiSGF1cHBhdWdlIEhWUi0xNjAwIChQcmVwcm9kdWN0aW9uKSIsCi0JLmNvbW1lbnQgPSAiVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAorCS5jb21tZW50ID0gIlJhdyBWQkkgc3VwcG9ydGVkOyBTbGljZWQgVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAogCS52NGwyX2NhcGFiaWxpdGllcyA9IENYMThfQ0FQX0VOQ09ERVIsCiAJLmh3X2F1ZGlvX2N0cmwgPSBDWDE4X0hXX0NYMjM0MTgsCiAJLmh3X211eGVyID0gQ1gxOF9IV19DUzUzNDUsCkBAIC0xNTEsNyArMTUyLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3gxOF9jYXJkIGN4MThfY2FyZF9oOTAwID0gewogCS50eXBlID0gQ1gxOF9DQVJEX0NPTVBST19IOTAwLAogCS5uYW1lID0gIkNvbXBybyBWaWRlb01hdGUgSDkwMCIsCi0JLmNvbW1lbnQgPSAiVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAorCS5jb21tZW50ID0gIlJhdyBWQkkgc3VwcG9ydGVkOyBTbGljZWQgVkJJIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLAogCS52NGwyX2NhcGFiaWxpdGllcyA9IENYMThfQ0FQX0VOQ09ERVIsCiAJLmh3X2F1ZGlvX2N0cmwgPSBDWDE4X0hXX0NYMjM0MTgsCiAJLmh3X2FsbCA9IENYMThfSFdfVFVORVIsCkBAIC0yNDgsNyArMjQ5LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3gxOF9jYXJkIGN4MThfY2FyZF9jbnh0X3JhcHRvcl9wYWwgPSB7CiAJLnR5cGUgPSBDWDE4X0NBUkRfQ05YVF9SQVBUT1JfUEFMLAogCS5uYW1lID0gIkNvbmV4YW50IFJhcHRvciBQQUwvU0VDQU0iLAotCS5jb21tZW50ID0gIlZCSSBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkuY29tbWVudCA9ICJSYXcgVkJJIHN1cHBvcnRlZDsgU2xpY2VkIFZCSSBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIiwKIAkudjRsMl9jYXBhYmlsaXRpZXMgPSBDWDE4X0NBUF9FTkNPREVSLAogCS5od19hdWRpb19jdHJsID0gQ1gxOF9IV19DWDIzNDE4LAogCS5od19tdXhlciA9IENYMThfSFdfR1BJTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNhcmRzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5oCmluZGV4IDMyMTU1ZjYuLjZmYTdiY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNhcmRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY2FyZHMuaApAQCAtNCw2ICs0LDcgQEAKICAqICBEZXJpdmVkIGZyb20gaXZ0di1jYXJkcy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00Nyw4ICs0OCw5IEBACiAKIC8qIFY0TDIgY2FwYWJpbGl0eSBhbGlhc2VzICovCiAjZGVmaW5lIENYMThfQ0FQX0VOQ09ERVIgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9UVU5FUiB8IFwKLQkJCSAgVjRMMl9DQVBfQVVESU8gfCBWNEwyX0NBUF9SRUFEV1JJVEUpCi0vKiB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFKSBub3QgeWV0ICovCisJCQkgIFY0TDJfQ0FQX0FVRElPIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwgXAorCQkJICBWNEwyX0NBUF9WQklfQ0FQVFVSRSkKKy8qIHwgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFKSBub3QgeWV0ICovCiAKIHN0cnVjdCBjeDE4X2NhcmRfdmlkZW9faW5wdXQgewogCXU4ICB2aWRlb190eXBlOyAJLyogdmlkZW8gaW5wdXQgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY29udHJvbHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNvbnRyb2xzLmMKaW5kZXggZjQ2YzdlNS4uMTdlZGYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY29udHJvbHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jb250cm9scy5jCkBAIC0yNTksNiArMjU5LDcgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKGMtPmN0cmxfY2xhc3MgPT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpIHsKKwkJc3RydWN0IGN4MThfYXBpX2Z1bmNfcHJpdmF0ZSBwcml2OwogCQlzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyBwID0gY3gtPnBhcmFtczsKIAkJaW50IGVyciA9IGN4MjM0MXhfZXh0X2N0cmxzKCZwLCBhdG9taWNfcmVhZCgmY3gtPmFuYV9jYXB0dXJpbmcpLAogCQkJCQkJYywgVklESU9DX1NfRVhUX0NUUkxTKTsKQEAgLTI3OCw3ICsyNzksOSBAQAogCQkJZm10LmZtdC5waXguaGVpZ2h0ID0gY3gtPnBhcmFtcy5oZWlnaHQ7CiAJCQljeDE4X2F2X2NtZChjeCwgVklESU9DX1NfRk1ULCAmZm10KTsKIAkJfQotCQllcnIgPSBjeDIzNDF4X3VwZGF0ZShjeCwgY3gxOF9hcGlfZnVuYywgJmN4LT5wYXJhbXMsICZwKTsKKwkJcHJpdi5jeCA9IGN4OworCQlwcml2LnMgPSAmY3gtPnN0cmVhbXNbaWQtPnR5cGVdOworCQllcnIgPSBjeDIzNDF4X3VwZGF0ZSgmcHJpdiwgY3gxOF9hcGlfZnVuYywgJmN4LT5wYXJhbXMsICZwKTsKIAkJaWYgKCFlcnIgJiYgY3gtPnBhcmFtcy5zdHJlYW1fdmJpX2ZtdCAhPSBwLnN0cmVhbV92YmlfZm10KQogCQkJZXJyID0gY3gxOF9zZXR1cF92YmlfZm10KGN4LCBwLnN0cmVhbV92YmlfZm10KTsKIAkJY3gtPnBhcmFtcyA9IHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCmluZGV4IDc4NzRkOTcuLmY1MGNmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCkBAIC03NSw0OCArNzUsNzYgQEAKIAkJCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKIAkJCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKIAkJCQkgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9Owotc3RhdGljIGludCBtbWlvX25kZWxheVtDWDE4X01BWF9DQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLQkJCQkJICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotCQkJCQkgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0JCQkJCSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9Owogc3RhdGljIHVuc2lnbmVkIGNhcmR0eXBlX2MgPSAxOwogc3RhdGljIHVuc2lnbmVkIHR1bmVyX2MgPSAxOwogc3RhdGljIHVuc2lnbmVkIHJhZGlvX2MgPSAxOwotc3RhdGljIHVuc2lnbmVkIG1taW9fbmRlbGF5X2MgPSAxOwogc3RhdGljIGNoYXIgcGFsW10gPSAiLS0iOwogc3RhdGljIGNoYXIgc2VjYW1bXSA9ICItLSI7CiBzdGF0aWMgY2hhciBudHNjW10gPSAiLSI7CiAKIC8qIEJ1ZmZlcnMgKi8KLXN0YXRpYyBpbnQgZW5jX21wZ19idWZmZXJzID0gQ1gxOF9ERUZBVUxUX0VOQ19NUEdfQlVGRkVSUzsKIHN0YXRpYyBpbnQgZW5jX3RzX2J1ZmZlcnMgPSBDWDE4X0RFRkFVTFRfRU5DX1RTX0JVRkZFUlM7CitzdGF0aWMgaW50IGVuY19tcGdfYnVmZmVycyA9IENYMThfREVGQVVMVF9FTkNfTVBHX0JVRkZFUlM7CitzdGF0aWMgaW50IGVuY19pZHhfYnVmZmVycyA9IENYMThfREVGQVVMVF9FTkNfSURYX0JVRkZFUlM7CiBzdGF0aWMgaW50IGVuY195dXZfYnVmZmVycyA9IENYMThfREVGQVVMVF9FTkNfWVVWX0JVRkZFUlM7CiBzdGF0aWMgaW50IGVuY192YmlfYnVmZmVycyA9IENYMThfREVGQVVMVF9FTkNfVkJJX0JVRkZFUlM7CiBzdGF0aWMgaW50IGVuY19wY21fYnVmZmVycyA9IENYMThfREVGQVVMVF9FTkNfUENNX0JVRkZFUlM7CiAKK3N0YXRpYyBpbnQgZW5jX3RzX2J1ZnNpemUgPSBDWDE4X0RFRkFVTFRfRU5DX1RTX0JVRlNJWkU7CitzdGF0aWMgaW50IGVuY19tcGdfYnVmc2l6ZSA9IENYMThfREVGQVVMVF9FTkNfTVBHX0JVRlNJWkU7CitzdGF0aWMgaW50IGVuY19pZHhfYnVmc2l6ZSA9IENYMThfREVGQVVMVF9FTkNfSURYX0JVRlNJWkU7CitzdGF0aWMgaW50IGVuY195dXZfYnVmc2l6ZSA9IENYMThfREVGQVVMVF9FTkNfWVVWX0JVRlNJWkU7CisvKiBWQkkgYnVmc2l6ZSBiYXNlZCBvbiBzdGFuZGFyZHMgc3VwcG9ydGVkIGJ5IGNhcmQgdHVuZXIgZm9yIG5vdyAqLworc3RhdGljIGludCBlbmNfcGNtX2J1ZnNpemUgPSBDWDE4X0RFRkFVTFRfRU5DX1BDTV9CVUZTSVpFOworCitzdGF0aWMgaW50IGVuY190c19idWZzID0gLTE7CitzdGF0aWMgaW50IGVuY19tcGdfYnVmcyA9IC0xOworc3RhdGljIGludCBlbmNfaWR4X2J1ZnMgPSAtMTsKK3N0YXRpYyBpbnQgZW5jX3l1dl9idWZzID0gLTE7CitzdGF0aWMgaW50IGVuY192YmlfYnVmcyA9IC0xOworc3RhdGljIGludCBlbmNfcGNtX2J1ZnMgPSAtMTsKKworCiBzdGF0aWMgaW50IGN4MThfcGNpX2xhdGVuY3kgPSAxOwogCi1pbnQgY3gxOF9yZXRyeV9tbWlvID0gMTsKK3N0YXRpYyBpbnQgbW1pb19uZGVsYXk7CitzdGF0aWMgaW50IHJldHJ5X21taW8gPSAxOworCiBpbnQgY3gxOF9kZWJ1ZzsKIAogbW9kdWxlX3BhcmFtX2FycmF5KHR1bmVyLCBpbnQsICZ0dW5lcl9jLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheShyYWRpbywgYm9vbCwgJnJhZGlvX2MsIDA2NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KGNhcmR0eXBlLCBpbnQsICZjYXJkdHlwZV9jLCAwNjQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShtbWlvX25kZWxheSwgaW50LCAmbW1pb19uZGVsYXlfYywgMDY0NCk7CiBtb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCBzaXplb2YocGFsKSwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgc2l6ZW9mKHNlY2FtKSwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fc3RyaW5nKG50c2MsIG50c2MsIHNpemVvZihudHNjKSwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGN4MThfZGVidWcsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW1fbmFtZWQocmV0cnlfbW1pbywgY3gxOF9yZXRyeV9tbWlvLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKG1taW9fbmRlbGF5LCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHJldHJ5X21taW8sIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oY3gxOF9wY2lfbGF0ZW5jeSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShjeDE4X2ZpcnN0X21pbm9yLCBpbnQsIDA2NDQpOwogCi1tb2R1bGVfcGFyYW0oZW5jX21wZ19idWZmZXJzLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGVuY190c19idWZmZXJzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGVuY19tcGdfYnVmZmVycywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShlbmNfaWR4X2J1ZmZlcnMsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oZW5jX3l1dl9idWZmZXJzLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGVuY192YmlfYnVmZmVycywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShlbmNfcGNtX2J1ZmZlcnMsIGludCwgMDY0NCk7CiAKK21vZHVsZV9wYXJhbShlbmNfdHNfYnVmc2l6ZSwgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShlbmNfbXBnX2J1ZnNpemUsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZW5jX2lkeF9idWZzaXplLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGVuY195dXZfYnVmc2l6ZSwgaW50LCAwNjQ0KTsKKy8qIFZCSSBidWZzaXplIGJhc2VkIG9uIHN0YW5kYXJkcyBzdXBwb3J0ZWQgYnkgY2FyZCB0dW5lciBmb3Igbm93ICovCittb2R1bGVfcGFyYW0oZW5jX3BjbV9idWZzaXplLCBpbnQsIDA2NDQpOworCittb2R1bGVfcGFyYW0oZW5jX3RzX2J1ZnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZW5jX21wZ19idWZzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGVuY19pZHhfYnVmcywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShlbmNfeXV2X2J1ZnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZW5jX3ZiaV9idWZzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGVuY19wY21fYnVmcywgaW50LCAwNjQ0KTsKKwogTU9EVUxFX1BBUk1fREVTQyh0dW5lciwgIlR1bmVyIHR5cGUgc2VsZWN0aW9uLFxuIgogCQkJIlx0XHRcdHNlZSB0dW5lci5oIGZvciB2YWx1ZXMiKTsKIE1PRFVMRV9QQVJNX0RFU0MocmFkaW8sCkBAIC0xNTIsMjggKzE4MCw2MiBAQAogCQkgIkNoYW5nZSB0aGUgUENJIGxhdGVuY3kgdG8gNjQgaWYgbG93ZXI6IDAgPSBObywgMSA9IFllcyxcbiIKIAkJICJcdFx0XHREZWZhdWx0OiBZZXMiKTsKIE1PRFVMRV9QQVJNX0RFU0MocmV0cnlfbW1pbywKLQkJICJDaGVjayBhbmQgcmV0cnkgbWVtb3J5IG1hcHBlZCBJTyBhY2Nlc3Nlc1xuIgotCQkgIlx0XHRcdERlZmF1bHQ6IDEgW1llc10iKTsKKwkJICIoRGVwcmVjYXRlZCkgTU1JTyB3cml0ZXMgYXJlIG5vdyBhbHdheXMgY2hlY2tlZCBhbmQgcmV0cmllZFxuIgorCQkgIlx0XHRcdEVmZmVjdGl2ZWx5OiAxIFtZZXNdIik7CiBNT0RVTEVfUEFSTV9ERVNDKG1taW9fbmRlbGF5LAotCQkgIkRlbGF5IChucykgZm9yIGVhY2ggQ1gyMzQxOCBtZW1vcnkgbWFwcGVkIElPIGFjY2Vzcy5cbiIKLQkJICJcdFx0XHRUcnkgbGFyZ2VyIHZhbHVlcyB0aGF0IGFyZSBjbG9zZSB0byBhIG11bHRpcGxlIG9mIHRoZVxuIgotCQkgIlx0XHRcdFBDSSBjbG9jayBwZXJpb2QsIDMwLjMgbnMsIGlmIHlvdXIgY2FyZCBkb2Vzbid0IHdvcmsuXG4iCi0JCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfTU1JT19OREVMQVkpKTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5jX21wZ19idWZmZXJzLAotCQkgIkVuY29kZXIgTVBHIEJ1ZmZlcnMgKGluIE1CKVxuIgotCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19NUEdfQlVGRkVSUykpOworCQkgIihEZXByZWNhdGVkKSBNTUlPIGFjY2Vzc2VzIGFyZSBub3cgbmV2ZXIgcHVycG9zZWx5IGRlbGF5ZWRcbiIKKwkJICJcdFx0XHRFZmZlY3RpdmVseTogMCBucyIpOwogTU9EVUxFX1BBUk1fREVTQyhlbmNfdHNfYnVmZmVycywKLQkJICJFbmNvZGVyIFRTIEJ1ZmZlcnMgKGluIE1CKVxuIgorCQkgIkVuY29kZXIgVFMgYnVmZmVyIG1lbW9yeSAoTUIpLiAoZW5jX3RzX2J1ZnMgY2FuIG92ZXJyaWRlKVxuIgogCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19UU19CVUZGRVJTKSk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY190c19idWZzaXplLAorCQkgIlNpemUgb2YgYW4gZW5jb2RlciBUUyBidWZmZXIgKGtCKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19UU19CVUZTSVpFKSk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY190c19idWZzLAorCQkgIk51bWJlciBvZiBlbmNvZGVyIFRTIGJ1ZmZlcnNcbiIKKwkJICJcdFx0XHREZWZhdWx0IGlzIGNvbXB1dGVkIGZyb20gb3RoZXIgZW5jX3RzXyogcGFyYW1ldGVycyIpOworTU9EVUxFX1BBUk1fREVTQyhlbmNfbXBnX2J1ZmZlcnMsCisJCSAiRW5jb2RlciBNUEcgYnVmZmVyIG1lbW9yeSAoTUIpLiAoZW5jX21wZ19idWZzIGNhbiBvdmVycmlkZSlcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfTVBHX0JVRkZFUlMpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX21wZ19idWZzaXplLAorCQkgIlNpemUgb2YgYW4gZW5jb2RlciBNUEcgYnVmZmVyIChrQilcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfTVBHX0JVRlNJWkUpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX21wZ19idWZzLAorCQkgIk51bWJlciBvZiBlbmNvZGVyIE1QRyBidWZmZXJzXG4iCisJCSAiXHRcdFx0RGVmYXVsdCBpcyBjb21wdXRlZCBmcm9tIG90aGVyIGVuY19tcGdfKiBwYXJhbWV0ZXJzIik7CitNT0RVTEVfUEFSTV9ERVNDKGVuY19pZHhfYnVmZmVycywKKwkJICJFbmNvZGVyIElEWCBidWZmZXIgbWVtb3J5IChNQikuIChlbmNfaWR4X2J1ZnMgY2FuIG92ZXJyaWRlKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19JRFhfQlVGRkVSUykpOworTU9EVUxFX1BBUk1fREVTQyhlbmNfaWR4X2J1ZnNpemUsCisJCSAiU2l6ZSBvZiBhbiBlbmNvZGVyIElEWCBidWZmZXIgKGtCKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19JRFhfQlVGU0laRSkpOworTU9EVUxFX1BBUk1fREVTQyhlbmNfaWR4X2J1ZnMsCisJCSAiTnVtYmVyIG9mIGVuY29kZXIgSURYIGJ1ZmZlcnNcbiIKKwkJICJcdFx0XHREZWZhdWx0IGlzIGNvbXB1dGVkIGZyb20gb3RoZXIgZW5jX2lkeF8qIHBhcmFtZXRlcnMiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5jX3l1dl9idWZmZXJzLAotCQkgIkVuY29kZXIgWVVWIEJ1ZmZlcnMgKGluIE1CKVxuIgorCQkgIkVuY29kZXIgWVVWIGJ1ZmZlciBtZW1vcnkgKE1CKS4gKGVuY195dXZfYnVmcyBjYW4gb3ZlcnJpZGUpXG4iCiAJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZGRVJTKSk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY195dXZfYnVmc2l6ZSwKKwkJICJTaXplIG9mIGFuIGVuY29kZXIgWVVWIGJ1ZmZlciAoa0IpXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZTSVpFKSk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY195dXZfYnVmcywKKwkJICJOdW1iZXIgb2YgZW5jb2RlciBZVVYgYnVmZmVyc1xuIgorCQkgIlx0XHRcdERlZmF1bHQgaXMgY29tcHV0ZWQgZnJvbSBvdGhlciBlbmNfeXV2XyogcGFyYW1ldGVycyIpOwogTU9EVUxFX1BBUk1fREVTQyhlbmNfdmJpX2J1ZmZlcnMsCi0JCSAiRW5jb2RlciBWQkkgQnVmZmVycyAoaW4gTUIpXG4iCisJCSAiRW5jb2RlciBWQkkgYnVmZmVyIG1lbW9yeSAoTUIpLiAoZW5jX3ZiaV9idWZzIGNhbiBvdmVycmlkZSlcbiIKIAkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfVkJJX0JVRkZFUlMpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX3ZiaV9idWZzLAorCQkgIk51bWJlciBvZiBlbmNvZGVyIFZCSSBidWZmZXJzXG4iCisJCSAiXHRcdFx0RGVmYXVsdCBpcyBjb21wdXRlZCBmcm9tIGVuY192YmlfYnVmZmVycyAmIHR1bmVyIHN0ZCIpOwogTU9EVUxFX1BBUk1fREVTQyhlbmNfcGNtX2J1ZmZlcnMsCi0JCSAiRW5jb2RlciBQQ00gYnVmZmVycyAoaW4gTUIpXG4iCisJCSAiRW5jb2RlciBQQ00gYnVmZmVyIG1lbW9yeSAoTUIpLiAoZW5jX3BjbV9idWZzIGNhbiBvdmVycmlkZSlcbiIKIAkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfUENNX0JVRkZFUlMpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX3BjbV9idWZzaXplLAorCQkgIlNpemUgb2YgYW4gZW5jb2RlciBQQ00gYnVmZmVyIChrQilcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfUENNX0JVRlNJWkUpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX3BjbV9idWZzLAorCQkgIk51bWJlciBvZiBlbmNvZGVyIFBDTSBidWZmZXJzXG4iCisJCSAiXHRcdFx0RGVmYXVsdCBpcyBjb21wdXRlZCBmcm9tIG90aGVyIGVuY19wY21fKiBwYXJhbWV0ZXJzIik7CiAKIE1PRFVMRV9QQVJNX0RFU0MoY3gxOF9maXJzdF9taW5vciwgIlNldCBrZXJuZWwgbnVtYmVyIGFzc2lnbmVkIHRvIGZpcnN0IGNhcmQiKTsKIApAQCAtMTg3LDcgKzI0OSw3IEBACiAvKiBHZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25zICovCiBpbnQgY3gxOF9tc2xlZXBfdGltZW91dCh1bnNpZ25lZCBpbnQgbXNlY3MsIGludCBpbnRyKQogewotCWludCB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhtc2Vjcyk7CisJbG9uZyBpbnQgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobXNlY3MpOwogCWludCBzaWc7CiAKIAlkbyB7CkBAIC0zNjYsMjAgKzQyOCw2OSBAQAogewogCWludCBpLCBqOwogCi0JY3gtPm9wdGlvbnMubWVnYWJ5dGVzW0NYMThfRU5DX1NUUkVBTV9UWVBFX01QR10gPSBlbmNfbXBnX2J1ZmZlcnM7CiAJY3gtPm9wdGlvbnMubWVnYWJ5dGVzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1RTXSA9IGVuY190c19idWZmZXJzOworCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEddID0gZW5jX21wZ19idWZmZXJzOworCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9JRFhdID0gZW5jX2lkeF9idWZmZXJzOwogCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVZdID0gZW5jX3l1dl9idWZmZXJzOwogCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkldID0gZW5jX3ZiaV9idWZmZXJzOwogCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9QQ01dID0gZW5jX3BjbV9idWZmZXJzOworCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9SQURdID0gMDsgLyogY29udHJvbCBvbmx5ICovCisKKwljeC0+c3RyZWFtX2J1ZmZlcnNbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFNdID0gZW5jX3RzX2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX01QR10gPSBlbmNfbXBnX2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX0lEWF0gPSBlbmNfaWR4X2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1lVVl0gPSBlbmNfeXV2X2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSV0gPSBlbmNfdmJpX2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1BDTV0gPSBlbmNfcGNtX2J1ZnM7CisJY3gtPnN0cmVhbV9idWZmZXJzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1JBRF0gPSAwOyAvKiBjb250cm9sLCBubyBkYXRhICovCisKKwljeC0+c3RyZWFtX2J1Zl9zaXplW0NYMThfRU5DX1NUUkVBTV9UWVBFX1RTXSA9IGVuY190c19idWZzaXplOworCWN4LT5zdHJlYW1fYnVmX3NpemVbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfTVBHXSA9IGVuY19tcGdfYnVmc2l6ZTsKKwljeC0+c3RyZWFtX2J1Zl9zaXplW0NYMThfRU5DX1NUUkVBTV9UWVBFX0lEWF0gPSBlbmNfaWR4X2J1ZnNpemU7CisJY3gtPnN0cmVhbV9idWZfc2l6ZVtDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVZdID0gZW5jX3l1dl9idWZzaXplOworCWN4LT5zdHJlYW1fYnVmX3NpemVbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJXSA9IDA7IC8qIGNvbXB1dGVkIGxhdGVyICovCisJY3gtPnN0cmVhbV9idWZfc2l6ZVtDWDE4X0VOQ19TVFJFQU1fVFlQRV9QQ01dID0gZW5jX3BjbV9idWZzaXplOworCWN4LT5zdHJlYW1fYnVmX3NpemVbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfUkFEXSA9IDA7IC8qIGNvbnRyb2wgbm8gZGF0YSAqLworCisJLyogRXhjZXB0IGZvciBWQkkgZW5zdXJlIHN0cmVhbV9idWZmZXJzICYgc3RyZWFtX2J1Zl9zaXplIGFyZSB2YWxpZCAqLworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9TVFJFQU1TOyBpKyspIHsKKwkJLyogVXNlciBzYWlkIHRvIHVzZSAwIGJ1ZmZlcnMgKi8KKwkJaWYgKGN4LT5zdHJlYW1fYnVmZmVyc1tpXSA9PSAwKSB7CisJCQljeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0gPSAwOworCQkJY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBVc2VyIHNhaWQgdG8gdXNlIDAgTUIgdG90YWwgKi8KKwkJaWYgKGN4LT5vcHRpb25zLm1lZ2FieXRlc1tpXSA8PSAwKSB7CisJCQljeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0gPSAwOworCQkJY3gtPnN0cmVhbV9idWZmZXJzW2ldID0gMDsKKwkJCWN4LT5zdHJlYW1fYnVmX3NpemVbaV0gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJLyogVkJJIGlzIGNvbXB1dGVkIGxhdGVyIG9yIHVzZXIgc2FpZCBidWZmZXIgaGFzIHNpemUgMCAqLworCQlpZiAoY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSA8PSAwKSB7CisJCQlpZiAoaSAhPSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJCQljeC0+b3B0aW9ucy5tZWdhYnl0ZXNbaV0gPSAwOworCQkJCWN4LT5zdHJlYW1fYnVmZmVyc1tpXSA9IDA7CisJCQkJY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY3gtPnN0cmVhbV9idWZmZXJzW2ldIDwgMCkgeworCQkJY3gtPnN0cmVhbV9idWZmZXJzW2ldID0gY3gtPm9wdGlvbnMubWVnYWJ5dGVzW2ldICogMTAyNAorCQkJCQkJLyBjeC0+c3RyZWFtX2J1Zl9zaXplW2ldOworCQl9IGVsc2UgeworCQkJLyogTi5CLiBUaGlzIG1pZ2h0IHJvdW5kIGRvd24gdG8gMCAqLworCQkJY3gtPm9wdGlvbnMubWVnYWJ5dGVzW2ldID0KKwkJCSAgY3gtPnN0cmVhbV9idWZmZXJzW2ldICogY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSAvIDEwMjQ7CisJCX0KKwkJY3gtPnN0cmVhbV9idWZfc2l6ZVtpXSAqPSAxMDI0OyAvKiBjb252ZXJ0IGZyb20ga0IgdG8gYnl0ZXMgKi8KKwl9CisKIAljeC0+b3B0aW9ucy5jYXJkdHlwZSA9IGNhcmR0eXBlW2N4LT5udW1dOwogCWN4LT5vcHRpb25zLnR1bmVyID0gdHVuZXJbY3gtPm51bV07CiAJY3gtPm9wdGlvbnMucmFkaW8gPSByYWRpb1tjeC0+bnVtXTsKIAotCWlmIChtbWlvX25kZWxheVtjeC0+bnVtXSA8IDApCi0JCWN4LT5vcHRpb25zLm1taW9fbmRlbGF5ID0gQ1gxOF9ERUZBVUxUX01NSU9fTkRFTEFZOwotCWVsc2UKLQkJY3gtPm9wdGlvbnMubW1pb19uZGVsYXkgPSBtbWlvX25kZWxheVtjeC0+bnVtXTsKLQogCWN4LT5zdGQgPSBjeDE4X3BhcnNlX3N0ZChjeCk7CiAJaWYgKGN4LT5vcHRpb25zLmNhcmR0eXBlID09IC0xKSB7CiAJCUNYMThfSU5GTygiSWdub3JlIGNhcmRcbiIpOwpAQCAtNDQwLDIyICs1NTEsMzAgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgY3gxOF9pbml0X3N0cnVjdDEoc3RydWN0IGN4MTggKmN4KQogeworCWludCBpOworCiAJY3gtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChjeC0+ZGV2LCAwKTsKIAogCW11dGV4X2luaXQoJmN4LT5zZXJpYWxpemVfbG9jayk7CiAJbXV0ZXhfaW5pdCgmY3gtPmkyY19idXNfbG9ja1swXSk7CiAJbXV0ZXhfaW5pdCgmY3gtPmkyY19idXNfbG9ja1sxXSk7CiAJbXV0ZXhfaW5pdCgmY3gtPmdwaW9fbG9jayk7CisJbXV0ZXhfaW5pdCgmY3gtPmVwdTJhcHVfbWJfbG9jayk7CisJbXV0ZXhfaW5pdCgmY3gtPmVwdTJjcHVfbWJfbG9jayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmY3gtPmxvY2spOwogCiAJY3gtPndvcmtfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShjeC0+bmFtZSk7CiAJaWYgKGN4LT53b3JrX3F1ZXVlID09IE5VTEwpIHsKLQkJQ1gxOF9FUlIoIkNvdWxkIG5vdCBjcmVhdGUgd29yayBxdWV1ZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJQ1gxOF9FUlIoIlVuYWJsZSB0byBjcmVhdGUgd29yayBoYW5kZXIgdGhyZWFkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JSU5JVF9XT1JLKCZjeC0+d29yaywgY3gxOF93b3JrX2hhbmRsZXIpOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9FUFVfV09SS19PUkRFUlM7IGkrKykgeworCQljeC0+ZXB1X3dvcmtfb3JkZXJbaV0uY3ggPSBjeDsKKwkJY3gtPmVwdV93b3JrX29yZGVyW2ldLnN0ciA9IGN4LT5lcHVfZGVidWdfc3RyOworCQlJTklUX1dPUksoJmN4LT5lcHVfd29ya19vcmRlcltpXS53b3JrLCBjeDE4X2VwdV93b3JrX2hhbmRsZXIpOworCX0KIAogCS8qIHN0YXJ0IGNvdW50aW5nIG9wZW5faWQgYXQgMSAqLwogCWN4LT5vcGVuX2lkID0gMTsKQEAgLTQ3MiwyMCArNTkxLDU1IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3gtPmNhcF93KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjeC0+bWJfYXB1X3dhaXRxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjeC0+bWJfY3B1X3dhaXRxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjeC0+bWJfZXB1X3dhaXRxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjeC0+bWJfaHB1X3dhaXRxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjeC0+ZG1hX3dhaXRxKTsKIAogCS8qIFZCSSAqLwotCWN4LT52YmkuaW4udHlwZSA9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOworCWN4LT52YmkuaW4udHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CiAJY3gtPnZiaS5zbGljZWRfaW4gPSAmY3gtPnZiaS5pbi5mbXQuc2xpY2VkOwotCWN4LT52YmkucmF3X3NpemUgPSAxNDU2OwotCWN4LT52YmkucmF3X2RlY29kZXJfbGluZV9zaXplID0gMTQ1NjsKLQljeC0+dmJpLnJhd19kZWNvZGVyX3Nhdl9vZGRfZmllbGQgPSAweDIwOwotCWN4LT52YmkucmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQgPSAweDYwOwotCWN4LT52Ymkuc2xpY2VkX2RlY29kZXJfbGluZV9zaXplID0gMjcyOwotCWN4LT52Ymkuc2xpY2VkX2RlY29kZXJfc2F2X29kZF9maWVsZCA9IDB4QjA7Ci0JY3gtPnZiaS5zbGljZWRfZGVjb2Rlcl9zYXZfZXZlbl9maWVsZCA9IDB4RjA7CisKKwkvKgorCSAqIFRoZSBWQkkgbGluZSBzaXplcyBkZXBlbmQgb24gdGhlIHBpeGVsIGNsb2NrIGFuZCB0aGUgaG9yaXogcmF0ZQorCSAqCisJICogKDEvRmgpKigyKkZwKSA9IFNhbXBsZXMvbGluZQorCSAqICAgICA9IDQgYnl0ZXMgRUFWICsgQW5jIGRhdGEgaW4gaGJsYW5rICsgNCBieXRlcyBTQVYgKyBhY3RpdmUgc2FtcGxlcworCSAqCisJICogIFNsaWNlZCBWQkkgaXMgc2VudCBhcyBhbmNpbGxhcnkgZGF0YSBkdXJpbmcgaG9yaXpvbnRhbCBibGFua2luZworCSAqICBSYXcgVkJJIGlzIHNlbnQgYXMgYWN0aXZlIHZpZGVvIHNhbXBsZXMgZHVyaW5nIHZlcnRjYWwgYmxhbmtpbmcKKwkgKgorCSAqICBXZSB1c2UgYSAgQlQuNjU2IHB4aWVsIGNsb2NrIG9mIDEzLjUgTUh6IGFuZCBhIEJULjY1NiBhY3RpdmUgbGluZQorCSAqICBsZW5ndGggb2YgNzIwIHBpeGVscyBAIDQ6MjoyIHNhbXBsaW5nLiAgVGh1cy4uLgorCSAqCisJICogIEZvciBzeXN0ZW1zIHRoYXQgdXNlIGEgMTUuNzM0IGtIeiBob3Jpem9udGFsIHJhdGUsIHN1Y2ggYXMKKwkgKiAgTlRTQy1NLCBQQUwtTSwgUEFMLTYwLCBhbmQgb3RoZXIgNjAgSHovNTI1IGxpbmUgc3lzdGVtcywgd2UgaGF2ZToKKwkgKgorCSAqICAoMS8xNS43MzQga0h6KSAqIDIgKiAxMy41IE1IeiA9IDE3MTYgc2FtcGxlcy9saW5lID0KKwkgKiAgNCBieXRlcyBTQVYgKyAyNjggYnl0ZXMgYW5jIGRhdGEgKyA0IGJ5dGVzIFNBViArIDE0NDAgYWN0aXZlIHNhbXBsZXMKKwkgKgorCSAqICBGb3Igc3lzdGVtcyB0aGF0IHVzZSBhIDE1LjYyNSBrSHogaG9yaXpvbnRhbCByYXRlLCBzdWNoIGFzCisJICogIFBBTC1CL0cvSCwgUEFMLUksIFNFQ0FNLUwgYW5kIG90aGVyIDUwIEh6LzYyNSBsaW5lIHN5c3RlbXMsIHdlIGhhdmU6CisJICoKKwkgKiAgKDEvMTUuNjI1IGtIeikgKiAyICogMTMuNSBNSHogPSAxNzI4IHNhbXBsZXMvbGluZSA9CisJICogIDQgYnl0ZXMgU0FWICsgMjgwIGJ5dGVzIGFuYyBkYXRhICsgNCBieXRlcyBTQVYgKyAxNDQwIGFjdGl2ZSBzYW1wbGVzCisJICoKKwkgKi8KKworCS8qIEZJWE1FOiBpbml0IHRoZXNlIGJhc2VkIG9uIHR1bmVyIHN0ZCAmIG1vZGlmeSB3aGVuIHN0ZCBjaGFuZ2VzICovCisJLyogQ1gxOC1BVi1Db3JlIG51bWJlciBvZiBWQkkgc2FtcGxlcyBvdXRwdXQgcGVyIGhvcml6b250YWwgbGluZSAqLworCWN4LT52YmkucmF3X2RlY29kZXJfbGluZV9zaXplID0gMTQ0NDsgICAvKiA0IGJ5dGUgU0FWICsgMiAqIDcyMCAqLworCWN4LT52Ymkuc2xpY2VkX2RlY29kZXJfbGluZV9zaXplID0gMjcyOyAvKiA2MCBIejogMjY4KzQsIDUwIEh6OiAyODArNCAqLworCisJLyogQ1gxOC1BVi1Db3JlIFZCSSBzYW1wbGVzL2xpbmUgcG9zc2libHkgcm91bmRlZCB1cCAqLworCWN4LT52YmkucmF3X3NpemUgPSAxNDQ0OyAgIC8qIFJlYWwgbWF4IHNpemUgaXMgMTQ0NCAqLworCWN4LT52Ymkuc2xpY2VkX3NpemUgPSAyODQ7IC8qIFJlYWwgbWF4IHNpemUgaXMgIDI4NCAqLworCisJLyoKKwkgKiBDWDE4LUFWLUNvcmUgU0FWL0VBViBSUCBjb2RlcyBpbiBWSVAgMS54IG1vZGUKKwkgKiBUYXNrIEZpZWxkIFZlcnRpY2FsQmxhbmsgSG9yaXpvbnRhbEJsYW5rIDAgMCAwIDAKKwkgKi8KKwljeC0+dmJpLnJhd19kZWNvZGVyX3Nhdl9vZGRfZmllbGQgPSAweDIwOyAgICAgLyogICBWICAqLworCWN4LT52YmkucmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQgPSAweDYwOyAgICAvKiAgRlYgICovCisJY3gtPnZiaS5zbGljZWRfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkID0gMHhCMDsgIC8qIFQgVkggLSBhY3R1YWxseSBFQVYgKi8KKwljeC0+dmJpLnNsaWNlZF9kZWNvZGVyX3Nhdl9ldmVuX2ZpZWxkID0gMHhGMDsgLyogVEZWSCAtIGFjdHVhbGx5IEVBViAqLwogCXJldHVybiAwOwogfQogCkBAIC01MTgsNiArNjcyLDcgQEAKIAljeC0+YXZfc3RhdGUuYXVkX2lucHV0ID0gQ1gxOF9BVl9BVURJTzg7CiAJY3gtPmF2X3N0YXRlLmF1ZGNsa19mcmVxID0gNDgwMDA7CiAJY3gtPmF2X3N0YXRlLmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJLyogRklYTUUgLSA4IGlzIE5UU0MgdmFsdWUsIGludmVzdGlnYXRlICovCiAJY3gtPmF2X3N0YXRlLnZiaV9saW5lX29mZnNldCA9IDg7CiB9CiAKQEAgLTY2MiwxMiArODE3LDkgQEAKIAogCS8qIFBDSSBEZXZpY2UgU2V0dXAgKi8KIAlyZXR2YWwgPSBjeDE4X3NldHVwX3BjaShjeCwgZGV2LCBwY2lfaWQpOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlpZiAocmV0dmFsID09IC1FSU8pCi0JCQlnb3RvIGZyZWVfd29ya3F1ZXVlOwotCQllbHNlIGlmIChyZXR2YWwgPT0gLUVOWElPKQotCQkJZ290byBmcmVlX21lbTsKLQl9CisJaWYgKHJldHZhbCAhPSAwKQorCQlnb3RvIGZyZWVfd29ya3F1ZXVlOworCiAJLyogc2F2ZSBjeCBpbiB0aGUgcGNpIHN0cnVjdCBmb3IgbGF0ZXIgdXNlICovCiAJcGNpX3NldF9kcnZkYXRhKGRldiwgY3gpOwogCkBAIC03MjYsNiArODc4LDcgQEAKIAkJZ290byBmcmVlX2kyYzsKIAl9CiAJY3gxOF9pbml0X21lbW9yeShjeCk7CisJY3gxOF9pbml0X3NjYihjeCk7CiAKIAkvKiBSZWdpc3RlciBJUlEgKi8KIAlyZXR2YWwgPSByZXF1ZXN0X2lycShjeC0+ZGV2LT5pcnEsIGN4MThfaXJxX2hhbmRsZXIsCkBAIC03MzksOCArODkyLDYgQEAKIAkJY3gtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKIAogCWlmIChjeC0+b3B0aW9ucy50dW5lciA9PSAtMSkgewotCQlpbnQgaTsKLQogCQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9DQVJEX01BWF9UVU5FUlM7IGkrKykgewogCQkJaWYgKChjeC0+c3RkICYgY3gtPmNhcmQtPnR1bmVyc1tpXS5zdGQpID09IDApCiAJCQkJY29udGludWU7CkBAIC03NzcsMTMgKzkyOCwyMyBAQAogCX0KIAljeC0+cGFyYW1zLnZpZGVvX2dvcF9zaXplID0gY3gtPmlzXzYwaHogPyAxNSA6IDEyOwogCi0JY3gtPnN0cmVhbV9idWZfc2l6ZVtDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEddID0gMHgwODAwMDsKLQljeC0+c3RyZWFtX2J1Zl9zaXplW0NYMThfRU5DX1NUUkVBTV9UWVBFX1RTXSA9IDB4MDgwMDA7Ci0JY3gtPnN0cmVhbV9idWZfc2l6ZVtDWDE4X0VOQ19TVFJFQU1fVFlQRV9QQ01dID0gMHgwMTIwMDsKLQljeC0+c3RyZWFtX2J1Zl9zaXplW0NYMThfRU5DX1NUUkVBTV9UWVBFX1lVVl0gPSAweDIwMDAwOworCS8qCisJICogRklYTUU6IHNldHRpbmcgdGhlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHRoZSB0dW5lciBzdGFuZGFyZCBpcworCSAqIHN1Ym9wdGltYWwsIGFzIHRoZSBDVkJTIGFuZCBTVmlkZW8gaW5wdXRzIGNvdWxkIHVzZSBhIGRpZmZlcmVudCBzdGQKKwkgKiBhbmQgdGhlIGJ1ZmZlciBjb3VsZCBlbmQgdXAgYmVpbmcgdG9vIHNtYWxsIGluIHRoYXQgY2FzZS4KKwkgKi8KIAl2YmlfYnVmX3NpemUgPSBjeC0+dmJpLnJhd19zaXplICogKGN4LT5pc182MGh6ID8gMjQgOiAzNikgLyAyOwogCWN4LT5zdHJlYW1fYnVmX3NpemVbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJXSA9IHZiaV9idWZfc2l6ZTsKIAorCWlmIChjeC0+c3RyZWFtX2J1ZmZlcnNbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJXSA8IDApCisJCWN4LT5zdHJlYW1fYnVmZmVyc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkldID0KKwkJICAgY3gtPm9wdGlvbnMubWVnYWJ5dGVzW0NYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSV0gKiAxMDI0ICogMTAyNAorCQkgICAvIHZiaV9idWZfc2l6ZTsKKwllbHNlCisJCWN4LT5vcHRpb25zLm1lZ2FieXRlc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkldID0KKwkJICAgICBjeC0+c3RyZWFtX2J1ZmZlcnNbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJXSAqIHZiaV9idWZfc2l6ZQorCQkgICAgIC8gKDEwMjQgKiAxMDI0KTsKKwogCWlmIChjeC0+b3B0aW9ucy5yYWRpbyA+IDApCiAJCWN4LT52NGwyX2NhcCB8PSBWNEwyX0NBUF9SQURJTzsKIApAQCAtODQ0LDcgKzEwMDUsNiBAQAogCWlmIChyZXR2YWwgPT0gMCkKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAlDWDE4X0VSUigiRXJyb3IgJWQgb24gaW5pdGlhbGl6YXRpb25cbiIsIHJldHZhbCk7Ci0JY3gxOF9sb2dfc3RhdGlzdGljcyhjeCk7CiAKIAlpID0gY3gtPm51bTsKIAlzcGluX2xvY2soJmN4MThfY2FyZHNfbG9jayk7CkBAIC05MjMsNiArMTA4MywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjeDE4X2NhbmNlbF9lcHVfd29ya19vcmRlcnMoc3RydWN0IGN4MTggKmN4KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9FUFVfV09SS19PUkRFUlM7IGkrKykKKwkJY2FuY2VsX3dvcmtfc3luYygmY3gtPmVwdV93b3JrX29yZGVyW2ldLndvcmspOworfQorCiBzdGF0aWMgdm9pZCBjeDE4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CkBAIC05NDAsNyArMTEwNyw4IEBACiAKIAljeDE4X2hhbHRfZmlybXdhcmUoY3gpOwogCi0JZmx1c2hfd29ya3F1ZXVlKGN4LT53b3JrX3F1ZXVlKTsKKwljeDE4X2NhbmNlbF9lcHVfd29ya19vcmRlcnMoY3gpOworCiAJZGVzdHJveV93b3JrcXVldWUoY3gtPndvcmtfcXVldWUpOwogCiAJY3gxOF9zdHJlYW1zX2NsZWFudXAoY3gsIDEpOwpAQCAtOTU1LDcgKzExMjMsNiBAQAogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGN4LT5kZXYpOwogCi0JY3gxOF9sb2dfc3RhdGlzdGljcyhjeCk7CiAJQ1gxOF9JTkZPKCJSZW1vdmVkICVzLCBjYXJkICMlZFxuIiwgY3gtPmNhcmRfbmFtZSwgY3gtPm51bSk7CiB9CiAKQEAgLTEwMDQsNiArMTE3MSw3IEBACiAJCQljb250aW51ZTsKIAkJa2ZyZWUoY3gxOF9jYXJkc1tpXSk7CiAJfQorCiB9CiAKIG1vZHVsZV9pbml0KG1vZHVsZV9zdGFydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCmluZGV4IGJiZGQ1ZjIuLjBkMmVkZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LWRyaXZlci5oCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02NCw5ICs2NSw2IEBACiAjICBlcnJvciAiVGhpcyBkcml2ZXIgcmVxdWlyZXMga2VybmVsIFBDSSBzdXBwb3J0LiIKICNlbmRpZgogCi0vKiBEZWZhdWx0IGRlbGF5IHRvIHRocm90dGxlIG1taW8gYWNjZXNzIHRvIHRoZSBDWDIzNDE4ICovCi0jZGVmaW5lIENYMThfREVGQVVMVF9NTUlPX05ERUxBWSAwIC8qIDAgbnMgPSAwIFBDSSBjbG9jayhzKSAvIDMzIE1IeiAqLwotCiAjZGVmaW5lIENYMThfTUVNX09GRlNFVAkweDAwMDAwMDAwCiAjZGVmaW5lIENYMThfTUVNX1NJWkUJMHgwNDAwMDAwMAogI2RlZmluZSBDWDE4X1JFR19PRkZTRVQJMHgwMjAwMDAwMApAQCAtMTE3LDYgKzExNSwxNyBAQAogI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX1ZCSV9CVUZGRVJTIDEKICNkZWZpbmUgQ1gxOF9ERUZBVUxUX0VOQ19QQ01fQlVGRkVSUyAxCiAKKy8qIE1heGltdW0gZmlybXdhcmUgRE1BIGJ1ZmZlcnMgcGVyIHN0cmVhbSAqLworI2RlZmluZSBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0gNjMKKworLyogRE1BIGJ1ZmZlciwgZGVmYXVsdCBzaXplIGluIGtCIGFsbG9jYXRlZCAqLworI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX1RTX0JVRlNJWkUgICAzMgorI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX01QR19CVUZTSVpFICAzMgorI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX0lEWF9CVUZTSVpFICAzMgorI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX1lVVl9CVUZTSVpFIDEyOAorLyogRGVmYXVsdCBWQkkgYnVmc2l6ZSBiYXNlZCBvbiBzdGFuZGFyZHMgc3VwcG9ydGVkIGJ5IGNhcmQgdHVuZXIgZm9yIG5vdyAqLworI2RlZmluZSBDWDE4X0RFRkFVTFRfRU5DX1BDTV9CVUZTSVpFICAgNAorCiAvKiBpMmMgc3R1ZmYgKi8KICNkZWZpbmUgSTJDX0NMSUVOVFNfTUFYIDE2CiAKQEAgLTE3Niw3ICsxODUsNiBAQAogCiAjZGVmaW5lIENYMThfTUFYX1BHTV9JTkRFWCAoNDAwKQogCi1leHRlcm4gaW50IGN4MThfcmV0cnlfbW1pbzsJLyogZW5hYmxlIGNoZWNrICYgcmV0cnkgb2YgbW1pbyBhY2Nlc3NlcyAqLwogZXh0ZXJuIGludCBjeDE4X2RlYnVnOwogCiAKQEAgLTE4NSw3ICsxOTMsNiBAQAogCWludCBjYXJkdHlwZTsJCS8qIGZvcmNlIGNhcmQgdHlwZSBvbiBsb2FkICovCiAJaW50IHR1bmVyOwkJLyogc2V0IHR1bmVyIG9uIGxvYWQgKi8KIAlpbnQgcmFkaW87CQkvKiBlbmFibGUvZGlzYWJsZSByYWRpbyAqLwotCXVuc2lnbmVkIGxvbmcgbW1pb19uZGVsYXk7IC8qIGRlbGF5IGluIG5zIGFmdGVyIGV2ZXJ5IFBDSSBtbWlvIGFjY2VzcyAqLwogfTsKIAogLyogcGVyLWJ1ZmZlciBiaXQgZmxhZ3MgKi8KQEAgLTIwMywxMSArMjEwLDggQEAKICNkZWZpbmUgQ1gxOF9GX0lfRU9TCQkJNCAJLyogRW5kIG9mIGVuY29kZXIgc3RyZWFtICovCiAjZGVmaW5lIENYMThfRl9JX1JBRElPX1VTRVIJCTUgCS8qIHJhZGlvIHR1bmVyIGlzIHNlbGVjdGVkICovCiAjZGVmaW5lIENYMThfRl9JX0VOQ19QQVVTRUQJCTEzIAkvKiB0aGUgZW5jb2RlciBpcyBwYXVzZWQgKi8KLSNkZWZpbmUgQ1gxOF9GX0lfSEFWRV9XT1JLCQkxNSAgIAkvKiB0aGVyZSBpcyB3b3JrIHRvIGJlIGRvbmUgKi8KLSNkZWZpbmUgQ1gxOF9GX0lfV09SS19IQU5ETEVSX0RWQgkxOCAgIAkvKiB3b3JrIHRvIGJlIGRvbmUgZm9yIERWQiAqLwogI2RlZmluZSBDWDE4X0ZfSV9JTklURUQJCQkyMSAJLyogc2V0IGFmdGVyIGZpcnN0IG9wZW4gKi8KICNkZWZpbmUgQ1gxOF9GX0lfRkFJTEVECQkJMjIgCS8qIHNldCBpZiBmaXJzdCBvcGVuIGZhaWxlZCAqLwotI2RlZmluZSBDWDE4X0ZfSV9XT1JLX0lOSVRFRAkJMjMJLyogd29ya2VyIHRocmVhZCBpbml0aWFsaXplZCAqLwogCiAvKiBUaGVzZSBhcmUgdGhlIFZCSSB0eXBlcyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgZW1iZWRkZWQgVkJJIHByaXZhdGUgcGFja2V0cy4gKi8KICNkZWZpbmUgQ1gxOF9TTElDRURfVFlQRV9URUxFVEVYVF9CICAgICAoMSkKQEAgLTIyMCw2ICsyMjQsNyBAQAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAl1MzIgaWQ7CiAJdW5zaWduZWQgbG9uZyBiX2ZsYWdzOworCXVuc2lnbmVkIHNraXBwZWQ7CiAJY2hhciAqYnVmOwogCiAJdTMyIGJ5dGVzdXNlZDsKQEAgLTI0OCw2ICsyNTMsMjcgQEAKIHN0cnVjdCBjeDE4OwkgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KIHN0cnVjdCBjeDE4X3NjYjsgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KIAorCisjZGVmaW5lIENYMThfTUFYX01ETF9BQ0tTIDIKKyNkZWZpbmUgQ1gxOF9NQVhfRVBVX1dPUktfT1JERVJTIChDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0gKyA3KQorLyogQ1BVX0RFX1JFTEVBU0VfTURMIGNhbiBidXJzdCBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0gb3JkZXJzIGluIGEgZ3JvdXAgKi8KKworI2RlZmluZSBDWDE4X0ZfRVdPX01CX1NUQUxFX1VQT05fUkVDRUlQVCAweDEKKyNkZWZpbmUgQ1gxOF9GX0VXT19NQl9TVEFMRV9XSElMRV9QUk9DICAgMHgyCisjZGVmaW5lIENYMThfRl9FV09fTUJfU1RBTEUgXAorCSAgICAgKENYMThfRl9FV09fTUJfU1RBTEVfVVBPTl9SRUNFSVBUIHwgQ1gxOF9GX0VXT19NQl9TVEFMRV9XSElMRV9QUk9DKQorCitzdHJ1Y3QgY3gxOF9lcHVfd29ya19vcmRlciB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJYXRvbWljX3QgcGVuZGluZzsKKwlzdHJ1Y3QgY3gxOCAqY3g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnB1OworCXN0cnVjdCBjeDE4X21haWxib3ggbWI7CisJc3RydWN0IGN4MThfbWRsX2FjayBtZGxfYWNrW0NYMThfTUFYX01ETF9BQ0tTXTsKKwljaGFyICpzdHI7Cit9OworCiAjZGVmaW5lIENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRSAweGZmZmZmZmZmCiAKIHN0cnVjdCBjeDE4X3N0cmVhbSB7CkBAIC0yNjEsNyArMjg3LDcgQEAKIAl1bnNpZ25lZCBtZGxfb2Zmc2V0OwogCiAJdTMyIGlkOwotCXNwaW5sb2NrX3QgcWxvY2s7IAkvKiBsb2NrcyBhY2Nlc3MgdG8gdGhlIHF1ZXVlcyAqLworCXN0cnVjdCBtdXRleCBxbG9jazsgCS8qIGxvY2tzIGFjY2VzcyB0byB0aGUgcXVldWVzICovCiAJdW5zaWduZWQgbG9uZyBzX2ZsYWdzOwkvKiBzdGF0dXMgZmxhZ3MsIHNlZSBhYm92ZSAqLwogCWludCBkbWE7CQkvKiBjYW4gYmUgUENJX0RNQV9UT0RFVklDRSwKIAkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0Ugb3IKQEAgLTI3NSw4ICszMDEsOCBAQAogCiAJLyogQnVmZmVyIFF1ZXVlcyAqLwogCXN0cnVjdCBjeDE4X3F1ZXVlIHFfZnJlZTsJLyogZnJlZSBidWZmZXJzICovCi0Jc3RydWN0IGN4MThfcXVldWUgcV9mdWxsOwkvKiBmdWxsIGJ1ZmZlcnMgKi8KLQlzdHJ1Y3QgY3gxOF9xdWV1ZSBxX2lvOwkJLyogd2FpdGluZyBmb3IgSS9PICovCisJc3RydWN0IGN4MThfcXVldWUgcV9idXN5OwkvKiBidXN5IGJ1ZmZlcnMgLSBpbiB1c2UgYnkgZmlybXdhcmUgKi8KKwlzdHJ1Y3QgY3gxOF9xdWV1ZSBxX2Z1bGw7CS8qIGZ1bGwgYnVmZmVycyAtIGRhdGEgZm9yIHVzZXIgYXBwcyAqLwogCiAJLyogRFZCIC8gRGlnaXRhbCBUcmFuc3BvcnQgKi8KIAlzdHJ1Y3QgY3gxOF9kdmIgZHZiOwpAQCAtMzUzLDEyICszNzksNyBAQAogCWludCBidXNfaW5kZXg7ICAgLyogMCBvciAxIGZvciB0aGUgY3gyMzQxOCdzIDFzdCBvciAybmQgSTJDIGJ1cyAqLwogfTsKIAotI2RlZmluZSBDWDE4X01BWF9NTUlPX1JFVFJJRVMgMTAKLQotc3RydWN0IGN4MThfbW1pb19zdGF0cyB7Ci0JYXRvbWljX3QgcmV0cmllZF93cml0ZVtDWDE4X01BWF9NTUlPX1JFVFJJRVMrMV07Ci0JYXRvbWljX3QgcmV0cmllZF9yZWFkW0NYMThfTUFYX01NSU9fUkVUUklFUysxXTsKLX07CisjZGVmaW5lIENYMThfTUFYX01NSU9fV1JfUkVUUklFUyAxMAogCiAvKiBTdHJ1Y3QgdG8gaG9sZCBpbmZvIGFib3V0IGN4MTggY2FyZHMgKi8KIHN0cnVjdCBjeDE4IHsKQEAgLTM3OCw3ICszOTksOSBAQAogCXUzMiB2NGwyX2NhcDsJCS8qIFY0TDIgY2FwYWJpbGl0aWVzIG9mIGNhcmQgKi8KIAl1MzIgaHdfZmxhZ3M7IAkJLyogSGFyZHdhcmUgZGVzY3JpcHRpb24gb2YgdGhlIGJvYXJkICovCiAJdW5zaWduZWQgbWRsX29mZnNldDsKLQlzdHJ1Y3QgY3gxOF9zY2IgX19pb21lbSAqc2NiOyAgIC8qIHBvaW50ZXIgdG8gU0NCICovCisJc3RydWN0IGN4MThfc2NiIF9faW9tZW0gKnNjYjsgLyogcG9pbnRlciB0byBTQ0IgKi8KKwlzdHJ1Y3QgbXV0ZXggZXB1MmFwdV9tYl9sb2NrOyAvKiBwcm90ZWN0IGRyaXZlciB0byBjaGlwIG1haWxib3ggaW4gU0NCKi8KKwlzdHJ1Y3QgbXV0ZXggZXB1MmNwdV9tYl9sb2NrOyAvKiBwcm90ZWN0IGRyaXZlciB0byBjaGlwIG1haWxib3ggaW4gU0NCKi8KIAogCXN0cnVjdCBjeDE4X2F2X3N0YXRlIGF2X3N0YXRlOwogCkBAIC0zOTcsNiArNDIwLDcgQEAKIAogCXN0cnVjdCBtdXRleCBzZXJpYWxpemVfbG9jazsgICAgLyogbXV0ZXggdXNlZCB0byBzZXJpYWxpemUgb3Blbi9jbG9zZS9zdGFydC9zdG9wL2lvY3RsIG9wZXJhdGlvbnMgKi8KIAlzdHJ1Y3QgY3gxOF9vcHRpb25zIG9wdGlvbnM7IAkvKiBVc2VyIG9wdGlvbnMgKi8KKwlpbnQgc3RyZWFtX2J1ZmZlcnNbQ1gxOF9NQVhfU1RSRUFNU107IC8qICMgb2YgYnVmZmVycyBmb3IgZWFjaCBzdHJlYW0gKi8KIAlpbnQgc3RyZWFtX2J1Zl9zaXplW0NYMThfTUFYX1NUUkVBTVNdOyAvKiBTdHJlYW0gYnVmZmVyIHNpemUgKi8KIAlzdHJ1Y3QgY3gxOF9zdHJlYW0gc3RyZWFtc1tDWDE4X01BWF9TVFJFQU1TXTsgCS8qIFN0cmVhbSBkYXRhICovCiAJdW5zaWduZWQgbG9uZyBpX2ZsYWdzOyAgLyogZ2xvYmFsIGN4MTggZmxhZ3MgKi8KQEAgLTQyOCwxNCArNDUyLDE3IEBACiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBtYl9hcHVfd2FpdHE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgbWJfY3B1X3dhaXRxOwotCXdhaXRfcXVldWVfaGVhZF90IG1iX2VwdV93YWl0cTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBtYl9ocHVfd2FpdHE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgY2FwX3c7CiAJLyogd2hlbiB0aGUgY3VycmVudCBETUEgaXMgZmluaXNoZWQgdGhpcyBxdWV1ZSBpcyB3b2tlbiB1cCAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV93YWl0cTsKIAorCXUzMiBzdzFfaXJxX21hc2s7CisJdTMyIHN3Ml9pcnFfbWFzazsKKwl1MzIgaHcyX2lycV9tYXNrOworCiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGN4MThfZXB1X3dvcmtfb3JkZXIgZXB1X3dvcmtfb3JkZXJbQ1gxOF9NQVhfRVBVX1dPUktfT1JERVJTXTsKKwljaGFyIGVwdV9kZWJ1Z19zdHJbMjU2XTsgLyogQ1gxOF9FUFVfREVCVUcgaXMgcmFyZTogdXNlIHNoYXJlZCBzcGFjZSAqLwogCiAJLyogaTJjICovCiAJc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwWzJdOwpAQCAtNDUwLDkgKzQ3Nyw2IEBACiAJdTMyIGdwaW9fdmFsOwogCXN0cnVjdCBtdXRleCBncGlvX2xvY2s7CiAKLQkvKiBTdGF0aXN0aWNzICovCi0Jc3RydWN0IGN4MThfbW1pb19zdGF0cyBtbWlvX3N0YXRzOwotCiAJLyogdjRsMiBhbmQgVXNlciBzZXR0aW5ncyAqLwogCiAJLyogY29kZWMgc2V0dGluZ3MgKi8KQEAgLTQ4MSw0ICs1MDUsMTAgQEAKIC8qIEZpcnN0LW9wZW4gaW5pdGlhbGl6YXRpb246IGxvYWQgZmlybXdhcmUsIGV0Yy4gKi8KIGludCBjeDE4X2luaXRfb25fZmlyc3Rfb3BlbihzdHJ1Y3QgY3gxOCAqY3gpOwogCisvKiBUZXN0IGlmIHRoZSBjdXJyZW50IFZCSSBtb2RlIGlzIHJhdyAoMSkgb3Igc2xpY2VkICgwKSAqLworc3RhdGljIGlubGluZSBpbnQgY3gxOF9yYXdfdmJpKGNvbnN0IHN0cnVjdCBjeDE4ICpjeCkKK3sKKwlyZXR1cm4gY3gtPnZiaS5pbi50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7Cit9CisKICNlbmRpZiAvKiBDWDE4X0RSSVZFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWR2Yi5jCmluZGV4IDQ1NDJlMmUuLmJkNWU2ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWR2Yi5jCkBAIC0yLDYgKzIsNyBAQAogICogIGN4MTggZnVuY3Rpb25zIGZvciBEVkIgc3VwcG9ydAogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMDggU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjMsOCArMjQsNiBAQAogI2luY2x1ZGUgImN4MTgtZHZiLmgiCiAjaW5jbHVkZSAiY3gxOC1pby5oIgogI2luY2x1ZGUgImN4MTgtc3RyZWFtcy5oIgotI2luY2x1ZGUgImN4MTgtcXVldWUuaCIKLSNpbmNsdWRlICJjeDE4LXNjYi5oIgogI2luY2x1ZGUgImN4MTgtY2FyZHMuaCIKICNpbmNsdWRlICJzNWgxNDA5LmgiCiAjaW5jbHVkZSAibXhsNTAwNXMuaCIKQEAgLTEwOSwyMCArMTA4LDIzIEBACiAJaWYgKCFkZW11eC0+ZG14LmZyb250ZW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzdHJlYW0pIHsKLQkJbXV0ZXhfbG9jaygmc3RyZWFtLT5kdmIuZmVlZGxvY2spOwotCQlpZiAoc3RyZWFtLT5kdmIuZmVlZGluZysrID09IDApIHsKLQkJCUNYMThfREVCVUdfSU5GTygiU3RhcnRpbmcgVHJhbnNwb3J0IERNQVxuIik7Ci0JCQlyZXQgPSBjeDE4X3N0YXJ0X3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJlYW0pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlDWDE4X0RFQlVHX0lORk8oCi0JCQkJCSJGYWlsZWQgdG8gc3RhcnQgVHJhbnNwb3J0IERNQVxuIik7Ci0JCQkJc3RyZWFtLT5kdmIuZmVlZGluZy0tOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldCA9IDA7Ci0JCW11dGV4X3VubG9jaygmc3RyZWFtLT5kdmIuZmVlZGxvY2spOwotCX0KKwlpZiAoIXN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZzdHJlYW0tPmR2Yi5mZWVkbG9jayk7CisJaWYgKHN0cmVhbS0+ZHZiLmZlZWRpbmcrKyA9PSAwKSB7CisJCUNYMThfREVCVUdfSU5GTygiU3RhcnRpbmcgVHJhbnNwb3J0IERNQVxuIik7CisJCXNldF9iaXQoQ1gxOF9GX1NfU1RSRUFNSU5HLCAmc3RyZWFtLT5zX2ZsYWdzKTsKKwkJcmV0ID0gY3gxOF9zdGFydF92NGwyX2VuY29kZV9zdHJlYW0oc3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCUNYMThfREVCVUdfSU5GTygiRmFpbGVkIHRvIHN0YXJ0IFRyYW5zcG9ydCBETUFcbiIpOworCQkJc3RyZWFtLT5kdmIuZmVlZGluZy0tOworCQkJaWYgKHN0cmVhbS0+ZHZiLmZlZWRpbmcgPT0gMCkKKwkJCQljbGVhcl9iaXQoQ1gxOF9GX1NfU1RSRUFNSU5HLCAmc3RyZWFtLT5zX2ZsYWdzKTsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSAwOworCW11dGV4X3VubG9jaygmc3RyZWFtLT5kdmIuZmVlZGxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIxNSw2ICsyMTcsMTAgQEAKIAlkdmJfbmV0X2luaXQoZHZiX2FkYXB0ZXIsICZkdmItPmR2Ym5ldCwgZG14KTsKIAogCUNYMThfSU5GTygiRFZCIEZyb250ZW5kIHJlZ2lzdGVyZWRcbiIpOworCUNYMThfSU5GTygiUmVnaXN0ZXJlZCBEVkIgYWRhcHRlciVkIGZvciAlcyAoJWQgeCAlZCBrQilcbiIsCisJCSAgc3RyZWFtLT5kdmIuZHZiX2FkYXB0ZXIubnVtLCBzdHJlYW0tPm5hbWUsCisJCSAgc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1Zl9zaXplLzEwMjQpOworCiAJbXV0ZXhfaW5pdCgmZHZiLT5mZWVkbG9jayk7CiAJZHZiLT5lbmFibGVkID0gMTsKIAlyZXR1cm4gcmV0OwpAQCAtMzAyLDI0ICszMDgsMyBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQotdm9pZCBjeDE4X2R2Yl93b3JrX2hhbmRsZXIoc3RydWN0IGN4MTggKmN4KQotewotCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmOwotCXN0cnVjdCBjeDE4X3N0cmVhbSAqcyA9ICZjeC0+c3RyZWFtc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9UU107Ci0KLQl3aGlsZSAoKGJ1ZiA9IGN4MThfZGVxdWV1ZShzLCAmcy0+cV9mdWxsKSkgIT0gTlVMTCkgewotCQlpZiAocy0+ZHZiLmVuYWJsZWQpCi0JCQlkdmJfZG14X3N3ZmlsdGVyKCZzLT5kdmIuZGVtdXgsIGJ1Zi0+YnVmLAotCQkJCQkgYnVmLT5ieXRlc3VzZWQpOwotCi0JCWN4MThfZW5xdWV1ZShzLCBidWYsICZzLT5xX2ZyZWUpOwotCQljeDE4X2J1Zl9zeW5jX2Zvcl9kZXZpY2UocywgYnVmKTsKLQkJaWYgKHMtPmhhbmRsZSA9PSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEUpIC8qIEZJWE1FOiBpbXByb3ZlICovCi0JCQljb250aW51ZTsKLQotCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1NFVF9NREwsIDUsIHMtPmhhbmRsZSwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikmY3gtPnNjYi0+Y3B1X21kbFtidWYtPmlkXSAtIGN4LT5lbmNfbWVtLAotCQkgICAgICAgMSwgYnVmLT5pZCwgcy0+YnVmX3NpemUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWR2Yi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmgKaW5kZXggYmJkY2VmYy4uYmY4ZDhmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmgKQEAgLTIzLDQgKzIzLDMgQEAKIAogaW50IGN4MThfZHZiX3JlZ2lzdGVyKHN0cnVjdCBjeDE4X3N0cmVhbSAqc3RyZWFtKTsKIHZvaWQgY3gxOF9kdmJfdW5yZWdpc3RlcihzdHJ1Y3QgY3gxOF9zdHJlYW0gKnN0cmVhbSk7Ci12b2lkIGN4MThfZHZiX3dvcmtfaGFuZGxlcihzdHJ1Y3QgY3gxOCAqY3gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jCmluZGV4IDVmOTA4OTkuLjQyNTI3MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maWxlb3BzLmMKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGl2dHYtZmlsZW9wcy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02NiwxMiArNjcsMTEgQEAKIAl9CiAJcy0+aWQgPSBpZC0+b3Blbl9pZDsKIAotCS8qIENYMThfREVDX1NUUkVBTV9UWVBFX01QRyBuZWVkcyB0byBjbGFpbSBDWDE4X0RFQ19TVFJFQU1fVFlQRV9WQkksCi0JICAgQ1gxOF9FTkNfU1RSRUFNX1RZUEVfTVBHIG5lZWRzIHRvIGNsYWltIENYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSQorCS8qIENYMThfRU5DX1NUUkVBTV9UWVBFX01QRyBuZWVkcyB0byBjbGFpbSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkkKIAkgICAocHJvdmlkZWQgVkJJIGluc2VydGlvbiBpcyBvbiBhbmQgc2xpY2VkIFZCSSBpcyBzZWxlY3RlZCksIGZvciBhbGwKIAkgICBvdGhlciBzdHJlYW1zIHdlJ3JlIGRvbmUgKi8KIAlpZiAodHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYKLQkJICAgY3gtPnZiaS5pbnNlcnRfbXBlZyAmJiBjeC0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQpIHsKKwkgICAgY3gtPnZiaS5pbnNlcnRfbXBlZyAmJiAhY3gxOF9yYXdfdmJpKGN4KSkgewogCQl2YmlfdHlwZSA9IENYMThfRU5DX1NUUkVBTV9UWVBFX1ZCSTsKIAl9IGVsc2UgewogCQlyZXR1cm4gMDsKQEAgLTE4NSw4ICsxODUsMTAgQEAKIAkJCSAgICAhdGVzdF9iaXQoQ1gxOF9GX1NfQVBQTF9JTywgJnNfdmJpLT5zX2ZsYWdzKSkgewogCQkJCXdoaWxlICgoYnVmID0gY3gxOF9kZXF1ZXVlKHNfdmJpLCAmc192YmktPnFfZnVsbCkpKSB7CiAJCQkJCS8qIGJ5dGVzd2FwIGFuZCBwcm9jZXNzIFZCSSBkYXRhICovCi0vKgkJCQkJY3gxOF9wcm9jZXNzX3ZiaV9kYXRhKGN4LCBidWYsIHNfdmJpLT5kbWFfcHRzLCBzX3ZiaS0+dHlwZSk7ICovCi0JCQkJCWN4MThfZW5xdWV1ZShzX3ZiaSwgYnVmLCAmc192YmktPnFfZnJlZSk7CisJCQkJCWN4MThfcHJvY2Vzc192YmlfZGF0YShjeCwgYnVmLAorCQkJCQkJCSAgICAgIHNfdmJpLT5kbWFfcHRzLAorCQkJCQkJCSAgICAgIHNfdmJpLT50eXBlKTsKKwkJCQkJY3gxOF9zdHJlYW1fcHV0X2J1Zl9mdyhzX3ZiaSwgYnVmKTsKIAkJCQl9CiAJCQl9CiAJCQlidWYgPSAmY3gtPnZiaS5zbGljZWRfbXBlZ19idWY7CkBAIC0xOTQsMTEgKzE5Niw2IEBACiAJCQkJcmV0dXJuIGJ1ZjsKIAkJfQogCi0JCS8qIGRvIHdlIGhhdmUgbGVmdG92ZXIgZGF0YT8gKi8KLQkJYnVmID0gY3gxOF9kZXF1ZXVlKHMsICZzLT5xX2lvKTsKLQkJaWYgKGJ1ZikKLQkJCXJldHVybiBidWY7Ci0KIAkJLyogZG8gd2UgaGF2ZSBuZXcgZGF0YT8gKi8KIAkJYnVmID0gY3gxOF9kZXF1ZXVlKHMsICZzLT5xX2Z1bGwpOwogCQlpZiAoYnVmKSB7CkBAIC0yNjIsNyArMjU5LDcgQEAKIAlpZiAobGVuID4gdWNvdW50KQogCQlsZW4gPSB1Y291bnQ7CiAJaWYgKGN4LT52YmkuaW5zZXJ0X21wZWcgJiYgcy0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYKLQkgICAgY3gtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ICYmIGJ1ZiAhPSAmY3gtPnZiaS5zbGljZWRfbXBlZ19idWYpIHsKKwkgICAgIWN4MThfcmF3X3ZiaShjeCkgJiYgYnVmICE9ICZjeC0+dmJpLnNsaWNlZF9tcGVnX2J1ZikgewogCQljb25zdCBjaGFyICpzdGFydCA9IGJ1Zi0+YnVmICsgYnVmLT5yZWFkcG9zOwogCQljb25zdCBjaGFyICpwID0gc3RhcnQgKyAxOwogCQljb25zdCB1OCAqcTsKQEAgLTMzNyw4ICszMzQsNyBAQAogCS8qIEVhY2ggVkJJIGJ1ZmZlciBpcyBvbmUgZnJhbWUsIHRoZSB2NGwyIEFQSSBzYXlzIHRoYXQgZm9yIFZCSSB0aGUKIAkgICBmcmFtZXMgc2hvdWxkIGFycml2ZSBvbmUtYnktb25lLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgb3V0cHV0IG1vcmUKIAkgICB0aGFuIG9uZSBWQkkgZnJhbWUgYXQgYSB0aW1lICovCi0JaWYgKHMtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJICYmCi0JICAgIGN4LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCkKKwlpZiAocy0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9WQkkgJiYgIWN4MThfcmF3X3ZiaShjeCkpCiAJCXNpbmdsZV9mcmFtZSA9IDE7CiAKIAlmb3IgKDs7KSB7CkBAIC0zNjUsMTYgKzM2MSwxMCBAQAogCQkJCXRvdF9jb3VudCAtIHRvdF93cml0dGVuKTsKIAogCQlpZiAoYnVmICE9ICZjeC0+dmJpLnNsaWNlZF9tcGVnX2J1ZikgewotCQkJaWYgKGJ1Zi0+cmVhZHBvcyA9PSBidWYtPmJ5dGVzdXNlZCkgewotCQkJCWN4MThfYnVmX3N5bmNfZm9yX2RldmljZShzLCBidWYpOwotCQkJCWN4MThfZW5xdWV1ZShzLCBidWYsICZzLT5xX2ZyZWUpOwotCQkJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfREVfU0VUX01ETCwgNSwKLQkJCQkJcy0+aGFuZGxlLAotCQkJCQkodm9pZCBfX2lvbWVtICopJmN4LT5zY2ItPmNwdV9tZGxbYnVmLT5pZF0gLQotCQkJCQkgIGN4LT5lbmNfbWVtLAotCQkJCQkxLCBidWYtPmlkLCBzLT5idWZfc2l6ZSk7Ci0JCQl9IGVsc2UKLQkJCQljeDE4X2VucXVldWUocywgYnVmLCAmcy0+cV9pbyk7CisJCQlpZiAoYnVmLT5yZWFkcG9zID09IGJ1Zi0+Ynl0ZXN1c2VkKQorCQkJCWN4MThfc3RyZWFtX3B1dF9idWZfZncocywgYnVmKTsKKwkJCWVsc2UKKwkJCQljeDE4X3B1c2gocywgYnVmLCAmcy0+cV9mdWxsKTsKIAkJfSBlbHNlIGlmIChidWYtPnJlYWRwb3MgPT0gYnVmLT5ieXRlc3VzZWQpIHsKIAkJCWludCBpZHggPSBjeC0+dmJpLmluc2VydGVkX2ZyYW1lICUgQ1gxOF9WQklfRlJBTUVTOwogCkBAIC01MTgsNyArNTA4LDcgQEAKIAlDWDE4X0RFQlVHX0hJX0ZJTEUoIkVuY29kZXIgcG9sbFxuIik7CiAJcG9sbF93YWl0KGZpbHAsICZzLT53YWl0cSwgd2FpdCk7CiAKLQlpZiAoYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5idWZmZXJzKSB8fCBhdG9taWNfcmVhZCgmcy0+cV9pby5idWZmZXJzKSkKKwlpZiAoYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5idWZmZXJzKSkKIAkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CiAJaWYgKGVvZikKIAkJcmV0dXJuIFBPTExIVVA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maXJtd2FyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlybXdhcmUuYwppbmRleCA1MTUzNDQyLi4xZmE5NWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpcm13YXJlLmMKQEAgLTIsNiArMiw3IEBACiAgKiAgY3gxOCBmaXJtd2FyZSBmdW5jdGlvbnMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI1LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjeDE4LWlycS5oIgogI2luY2x1ZGUgImN4MTgtZmlybXdhcmUuaCIKICNpbmNsdWRlICJjeDE4LWNhcmRzLmgiCisjaW5jbHVkZSAiY3gxOC1hdi1jb3JlLmgiCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2RlZmluZSBDWDE4X1BST0NfU09GVF9SRVNFVCAJCTB4YzcwMDEwCkBAIC0xMjEsNiArMTIzLDcgQEAKIAkJCWlmIChjeDE4X3Jhd19yZWFkbChjeCwgZHN0KSAhPSAqc3JjKSB7CiAJCQkJQ1gxOF9FUlIoIk1pc21hdGNoIGF0IG9mZnNldCAleFxuIiwgaSk7CiAJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQkJY3gxOF9zZXR1cF9wYWdlKGN4LCAwKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCWRzdCsrOwpAQCAtMTMxLDEwICsxMzQsMTIgQEAKIAkJQ1gxOF9JTkZPKCJsb2FkZWQgJXMgZmlybXdhcmUgKCV6ZCBieXRlcylcbiIsIGZuLCBmdy0+c2l6ZSk7CiAJc2l6ZSA9IGZ3LT5zaXplOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWN4MThfc2V0dXBfcGFnZShjeCwgU0NCX09GRlNFVCk7CiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBpbnQgbG9hZF9hcHVfZndfZGlyZWN0KGNvbnN0IGNoYXIgKmZuLCB1OCBfX2lvbWVtICpkc3QsIHN0cnVjdCBjeDE4ICpjeCkKK3N0YXRpYyBpbnQgbG9hZF9hcHVfZndfZGlyZWN0KGNvbnN0IGNoYXIgKmZuLCB1OCBfX2lvbWVtICpkc3QsIHN0cnVjdCBjeDE4ICpjeCwKKwkJCQl1MzIgKmVudHJ5X2FkZHIpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CiAJaW50IGksIGo7CkBAIC0xNDksOSArMTU0LDExIEBACiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmbiwgJmN4LT5kZXYtPmRldikpIHsKIAkJQ1gxOF9FUlIoInVuYWJsZSB0byBvcGVuIGZpcm13YXJlICVzXG4iLCBmbik7CiAJCUNYMThfRVJSKCJkaWQgeW91IHB1dCB0aGUgZmlybXdhcmUgaW4gdGhlIGhvdHBsdWcgZmlybXdhcmUgZGlyZWN0b3J5P1xuIik7CisJCWN4MThfc2V0dXBfcGFnZShjeCwgMCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCSplbnRyeV9hZGRyID0gMDsKIAlzcmMgPSAoY29uc3QgdTMyICopZnctPmRhdGE7CiAJdmVycyA9IGZ3LT5kYXRhICsgc2l6ZW9mKHNlZ2hkcik7CiAJc3ogPSBmdy0+c2l6ZTsKQEAgLTE2OCwxMCArMTc1LDEyIEBACiAJCX0KIAkJQ1gxOF9ERUJVR19JTkZPKCJsb2FkIHNlZ21lbnQgJXgtJXhcbiIsIHNlZ2hkci5hZGRyLAogCQkJCXNlZ2hkci5hZGRyICsgc2VnaGRyLnNpemUgLSAxKTsKKwkJaWYgKCplbnRyeV9hZGRyID09IDApCisJCQkqZW50cnlfYWRkciA9IHNlZ2hkci5hZGRyOwogCQlpZiAob2Zmc2V0ICsgc2VnaGRyLnNpemUgPiBzeikKIAkJCWJyZWFrOwogCQlmb3IgKGkgPSAwOyBpIDwgc2VnaGRyLnNpemU7IGkgKz0gNDA5NikgewotCQkJY3gxOF9zZXR1cF9wYWdlKGN4LCBvZmZzZXQgKyBpKTsKKwkJCWN4MThfc2V0dXBfcGFnZShjeCwgc2VnaGRyLmFkZHIgKyBpKTsKIAkJCWZvciAoaiA9IGk7IGogPCBzZWdoZHIuc2l6ZSAmJiBqIDwgaSArIDQwOTY7IGogKz0gNCkgewogCQkJCS8qIG5vIG5lZWQgZm9yIGVuZGlhbm5lc3MgY29udmVyc2lvbiBvbiB0aGUgcHBjICovCiAJCQkJY3gxOF9yYXdfd3JpdGVsKGN4LCBzcmNbKG9mZnNldCArIGopIC8gNF0sCkBAIC0xODEsNiArMTkwLDcgQEAKIAkJCQkJQ1gxOF9FUlIoIk1pc21hdGNoIGF0IG9mZnNldCAleFxuIiwKIAkJCQkJCSBvZmZzZXQgKyBqKTsKIAkJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQkJCWN4MThfc2V0dXBfcGFnZShjeCwgMCk7CiAJCQkJCXJldHVybiAtRUlPOwogCQkJCX0KIAkJCX0KQEAgLTE5MiwxNiArMjAyLDE3IEBACiAJCQkJZm4sIGFwdV92ZXJzaW9uLCBmdy0+c2l6ZSk7CiAJc2l6ZSA9IGZ3LT5zaXplOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCS8qIENsZWFyIGJpdDAgZm9yIEFQVSB0byBzdGFydCBmcm9tIDAgKi8KLQljeDE4X3dyaXRlX3JlZyhjeCwgY3gxOF9yZWFkX3JlZyhjeCwgMHhjNzIwMzApICYgfjEsIDB4YzcyMDMwKTsKKwljeDE4X3NldHVwX3BhZ2UoY3gsIDApOwogCXJldHVybiBzaXplOwogfQogCiB2b2lkIGN4MThfaGFsdF9maXJtd2FyZShzdHJ1Y3QgY3gxOCAqY3gpCiB7CiAJQ1gxOF9ERUJVR19JTkZPKCJQcmVwYXJpbmcgZm9yIGZpcm13YXJlIGhhbHQuXG4iKTsKLQljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMDBGMDAwRiwgQ1gxOF9QUk9DX1NPRlRfUkVTRVQpOyAvKiBzdG9wIHRoZSBmdyAqLwotCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDIwMDAyLCBDWDE4X0FERUNfQ09OVFJPTCk7CisJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAweDAwMEYwMDBGLCBDWDE4X1BST0NfU09GVF9SRVNFVCwKKwkJCQkgIDB4MDAwMDAwMEYsIDB4MDAwRjAwMEYpOworCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHgwMDAyMDAwMiwgQ1gxOF9BREVDX0NPTlRST0wsCisJCQkJICAweDAwMDAwMDAyLCAweDAwMDIwMDAyKTsKIH0KIAogdm9pZCBjeDE4X2luaXRfcG93ZXIoc3RydWN0IGN4MTggKmN4LCBpbnQgbG93cHdyKQpAQCAtMjExLDkgKzIyMiw0OCBAQAogCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMDA4LCBDWDE4X1BMTF9QT1dFUl9ET1dOKTsKIAogCS8qIEFERUMgb3V0IG9mIHNsZWVwICovCi0JY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMjAwMDAsIENYMThfQURFQ19DT05UUk9MKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDAwMjAwMDAsIENYMThfQURFQ19DT05UUk9MLAorCQkJCSAgMHgwMDAwMDAwMCwgMHgwMDAyMDAwMik7CiAKLQkvKiBUaGUgZmFzdCBjbG9jayBpcyBhdCAyMDAvMjQ1IE1IeiAqLworCS8qCisJICogVGhlIFBMTCBwYXJhbWV0ZXJzIGFyZSBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgY3J5c3RhbCBmcmVxdWVuY3kgdGhhdAorCSAqIHdvdWxkIGlkZWFsbHkgYmU6CisJICoKKwkgKiBOVFNDIENvbG9yIHN1YmNhcnJpZXIgZnJlcSAqIDggPQorCSAqIAk0LjUgTUh6LzI4NiAqIDQ1NS8yICogOCA9IDI4LjYzNjM2MzYzLi4uIE1IegorCSAqCisJICogVGhlIGFjY2lkZW50cyBvZiBoaXN0b3J5IGFuZCByYXRpb25hbGUgdGhhdCBleHBsYWluIGZyb20gd2hlcmUgdGhpcworCSAqIGNvbWJpbmF0aW9uIG9mIG1hZ2ljIG51bWJlcnMgb3JpZ2luYXRlIGNhbiBiZSBmb3VuZCBpbjoKKwkgKgorCSAqIFsxXSBBYnJhaGFtcywgSS4gQy4sICJDaG9pY2Ugb2YgQ2hyb21pbmFuY2UgU3ViY2FycmllciBGcmVxdWVuY3kgaW4KKwkgKiB0aGUgTlRTQyBTdGFuZGFyZHMiLCBQcm9jZWVkaW5ncyBvZiB0aGUgSS1SLUUsIEphbnVhcnkgMTk1NCwgcHAgNzktODAKKwkgKgorCSAqIFsyXSBBYnJhaGFtcywgSS4gQy4sICJUaGUgJ0ZyZXF1ZW5jeSBJbnRlcmxlYXZpbmcnIFByaW5jaXBsZSBpbiB0aGUKKwkgKiBOVFNDIFN0YW5kYXJkcyIsIFByb2NlZWRpbmdzIG9mIHRoZSBJLVItRSwgSmFudWFyeSAxOTU0LCBwcCA4MS04MworCSAqCisJICogQXMgTWlrZSBCcmFkbGV5IGhhcyByaWdodGx5IHBvaW50ZWQgb3V0LCBpdCdzIG5vdCB0aGUgZXhhY3QgY3J5c3RhbAorCSAqIGZyZXF1ZW5jeSB0aGF0IG1hdHRlcnMsIG9ubHkgdGhhdCBhbGwgcGFydHMgb2YgdGhlIGRyaXZlciBhbmQKKwkgKiBmaXJtd2FyZSBhcmUgdXNpbmcgdGhlIHNhbWUgdmFsdWUgKGNsb3NlIHRvIHRoZSBpZGVhbCB2YWx1ZSkuCisJICoKKwkgKiBTaW5jZSBJIGhhdmUgYSBzdHJvbmcgc3VzcGljaW9uIHRoYXQsIGlmIHRoZSBmaXJtd2FyZSBldmVyIGFzc3VtZXMgYQorCSAqIGNyeXN0YWwgdmFsdWUgYXQgYWxsLCBpdCB3aWxsIGFzc3VtZSAyOC42MzYzNjAgTUh6LCB0aGUgY3J5c3RhbAorCSAqIGZyZXEgdXNlZCBpbiBjYWxjdWxhdGlvbnMgaW4gdGhpcyBkcml2ZXIgd2lsbCBiZToKKwkgKgorCSAqCXh0YWxfZnJlcSA9IDI4LjYzNjM2MCBNSHoKKwkgKgorCSAqIGFuIGVycm9yIG9mIGxlc3MgdGhhbiAwLjEzIHBwbSB3aGljaCBpcyB3YXksIHdheSBiZXR0ZXIgdGhhbiBhbnkgb2ZmCisJICogdGhlIHNoZWxmIGNyeXN0YWwgd2lsbCBoYXZlIGZvciBhY2N1cmFjeSBhbnl3YXkuCisJICoKKwkgKiBCZWxvdyBJIGFpbSB0byBydW4gdGhlIFBMTHMnIFZDT3MgbmVhciA0MDAgTUh6IHRvIG1pbmltemUgZXJyb3JzLgorCSAqCisJICogTWFueSB0aGFua3MgdG8gSmVmZiBDYW1wYmVsbCBhbmQgTWlrZSBCcmFkbGV5IGZvciB0aGVpciBleHRlbnNpdmUKKwkgKiBpbnZlc3RpZ2F0aW9uLCBleHBlcmltZW50YXRpb24sIHRlc3RpbmcsIGFuZCBzdWdnZXN0ZWQgc29sdXRpb25zIG9mCisJICogb2YgYXVkaW8vdmlkZW8gc3luYyBwcm9ibGVtcyB3aXRoIFNWaWRlbyBhbmQgQ1ZCUyBjYXB0dXJlcy4KKwkgKi8KKworCS8qIHRoZSBmYXN0IGNsb2NrIGlzIGF0IDIwMC8yNDUgTUh6ICovCisJLyogMSAqIHh0YWxfZnJlcSAqIDB4MGQuZjdkZjliOCAvIDIgPSAyMDAgTUh6OiA0MDAgTUh6IHByZSBwb3N0LWRpdmlkZSovCisJLyogMSAqIHh0YWxfZnJlcSAqIDB4MTEuMWM3MWViOCAvIDIgPSAyNDUgTUh6OiA0OTAgTUh6IHByZSBwb3N0LWRpdmlkZSovCiAJY3gxOF93cml0ZV9yZWcoY3gsIGxvd3B3ciA/IDB4RCA6IDB4MTEsIENYMThfRkFTVF9DTE9DS19QTExfSU5UKTsKIAljeDE4X3dyaXRlX3JlZyhjeCwgbG93cHdyID8gMHgxRUZCRjM3IDogMHgwMzhFM0Q3LAogCQkJCQkJQ1gxOF9GQVNUX0NMT0NLX1BMTF9GUkFDKTsKQEAgLTIyMywxNiArMjczLDM2IEBACiAJY3gxOF93cml0ZV9yZWcoY3gsIDQsIENYMThfRkFTVF9DTE9DS19QTExfQURKVVNUX0JBTkRXSURUSCk7CiAKIAkvKiBzZXQgc2xvdyBjbG9jayB0byAxMjUvMTIwIE1IeiAqLwotCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweDExIDogMHgxMCwgQ1gxOF9TTE9XX0NMT0NLX1BMTF9JTlQpOwotCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweEVCQUYwNSA6IDB4MTg2MThBOCwKKwkvKiB4dGFsX2ZyZXEgKiAweDBkLjE4NjFhMjAgLyAzID0gMTI1IE1IejogMzc1IE1IeiBiZWZvcmUgcG9zdC1kaXZpZGUgKi8KKwkvKiB4dGFsX2ZyZXEgKiAweDBjLjkyNDkzZjggLyAzID0gMTIwIE1IejogMzYwIE1IeiBiZWZvcmUgcG9zdC1kaXZpZGUgKi8KKwljeDE4X3dyaXRlX3JlZyhjeCwgbG93cHdyID8gMHhEIDogMHhDLCBDWDE4X1NMT1dfQ0xPQ0tfUExMX0lOVCk7CisJY3gxOF93cml0ZV9yZWcoY3gsIGxvd3B3ciA/IDB4MzBDMzQ0IDogMHgxMjQ5MjdGLAogCQkJCQkJQ1gxOF9TTE9XX0NMT0NLX1BMTF9GUkFDKTsKLQljeDE4X3dyaXRlX3JlZyhjeCwgNCwgQ1gxOF9TTE9XX0NMT0NLX1BMTF9QT1NUKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMywgQ1gxOF9TTE9XX0NMT0NLX1BMTF9QT1NUKTsKIAogCS8qIG1wZWcgY2xvY2sgcGxsIDU0TUh6ICovCisJLyogeHRhbF9mcmVxICogMHhmLjE1ZjE3ZjAgLyA4ID0gNTQgTUh6OiA0MzIgTUh6IGJlZm9yZSBwb3N0LWRpdmlkZSAqLwogCWN4MThfd3JpdGVfcmVnKGN4LCAweEYsIENYMThfTVBFR19DTE9DS19QTExfSU5UKTsKLQljeDE4X3dyaXRlX3JlZyhjeCwgMHgyQkNGRUYsIENYMThfTVBFR19DTE9DS19QTExfRlJBQyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MkJFMkZFLCBDWDE4X01QRUdfQ0xPQ0tfUExMX0ZSQUMpOwogCWN4MThfd3JpdGVfcmVnKGN4LCA4LCBDWDE4X01QRUdfQ0xPQ0tfUExMX1BPU1QpOwogCisJLyoKKwkgKiBWRENMSyAgSW50ZWdlciA9IDB4MGYsIFBvc3QgRGl2aWRlciA9IDB4MDQKKwkgKiBBSU1DTEsgSW50ZWdlciA9IDB4MGUsIFBvc3QgRGl2aWRlciA9IDB4MTYKKwkgKi8KKwljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX1BMTF9DVFJMMSwgMHgxNjBlMDQwZik7CisKKwkvKiBWRENMSyBGcmFjdGlvbiA9IDB4MmJlMmZlICovCisJLyogeHRhbCAqIDB4Zi4xNWYxN2YwLzQgPSAxMDggTUh6OiA0MzIgTUh6IGJlZm9yZSBwb3N0IGRpdmlkZSAqLworCWN4MThfYXZfd3JpdGU0KGN4LCBDWEFERUNfVklEX1BMTF9GUkFDLCAweDAwMmJlMmZlKTsKKworCS8qIEFJTUNMSyBGcmFjdGlvbiA9IDB4MDUyMjdhZCAqLworCS8qIHh0YWwgKiAweGUuMjkxM2Q2OC8weDE2ID0gNDgwMDAgKiAzODQ6IDQwNiBNSHogYmVmb3JlIHBvc3QtZGl2aWRlICovCisJY3gxOF9hdl93cml0ZTQoY3gsIENYQURFQ19BVVhfUExMX0ZSQUMsIDB4MDA1MjI3YWQpOworCisJLyogU0FfTUNMS19TRUw9MSwgU0FfTUNMS19ESVY9MHgxNiAqLworCWN4MThfYXZfd3JpdGUoY3gsIENYQURFQ19JMlNfTUNMSywgMHg1Nik7CisKIAkvKiBEZWZhdWx0cyAqLwogCS8qIEFQVSA9IFNDIG9yIFNDLzIgPSAxMjUvNjIuNSAqLwogCS8qIEVQVSA9IFNDID0gMTI1ICovCkBAIC0yNDgsMjIgKzMxOCwzNCBAQAogCS8qIFZGQyA9IGRpc2FibGVkICovCiAJLyogVVNCID0gZGlzYWJsZWQgKi8KIAotCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweEZGRkYwMDIwIDogMHgwMDA2MDAwNCwKLQkJCQkJCQlDWDE4X0NMT0NLX1NFTEVDVDEpOwotCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweEZGRkYwMDA0IDogMHgwMDA2MDAwNiwKLQkJCQkJCQlDWDE4X0NMT0NLX1NFTEVDVDIpOworCWlmIChsb3dwd3IpIHsKKwkJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAweEZGRkYwMDIwLCBDWDE4X0NMT0NLX1NFTEVDVDEsCisJCQkJCSAgMHgwMDAwMDAyMCwgMHhGRkZGRkZGRik7CisJCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHhGRkZGMDAwNCwgQ1gxOF9DTE9DS19TRUxFQ1QyLAorCQkJCQkgIDB4MDAwMDAwMDQsIDB4RkZGRkZGRkYpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgZG9lc24ndCBleHBsaWNpdGx5IHNldCBldmVyeSBjbG9jayBzZWxlY3QgKi8KKwkJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAweDAwMDYwMDA0LCBDWDE4X0NMT0NLX1NFTEVDVDEsCisJCQkJCSAgMHgwMDAwMDAwNCwgMHgwMDA2MDAwNik7CisJCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHgwMDA2MDAwNiwgQ1gxOF9DTE9DS19TRUxFQ1QyLAorCQkJCQkgIDB4MDAwMDAwMDYsIDB4MDAwNjAwMDYpOworCX0KIAotCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkYwMDAyLCBDWDE4X0hBTEZfQ0xPQ0tfU0VMRUNUMSk7Ci0JY3gxOF93cml0ZV9yZWcoY3gsIDB4RkZGRjAxMDQsIENYMThfSEFMRl9DTE9DS19TRUxFQ1QyKTsKLQotCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkY5MDI2LCBDWDE4X0NMT0NLX0VOQUJMRTEpOwotCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkYzMTA1LCBDWDE4X0NMT0NLX0VOQUJMRTIpOworCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHhGRkZGMDAwMiwgQ1gxOF9IQUxGX0NMT0NLX1NFTEVDVDEsCisJCQkJICAweDAwMDAwMDAyLCAweEZGRkZGRkZGKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4RkZGRjAxMDQsIENYMThfSEFMRl9DTE9DS19TRUxFQ1QyLAorCQkJCSAgMHgwMDAwMDEwNCwgMHhGRkZGRkZGRik7CisJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAweEZGRkY5MDI2LCBDWDE4X0NMT0NLX0VOQUJMRTEsCisJCQkJICAweDAwMDA5MDI2LCAweEZGRkZGRkZGKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4RkZGRjMxMDUsIENYMThfQ0xPQ0tfRU5BQkxFMiwKKwkJCQkgIDB4MDAwMDMxMDUsIDB4RkZGRkZGRkYpOwogfQogCiB2b2lkIGN4MThfaW5pdF9tZW1vcnkoc3RydWN0IGN4MTggKmN4KQogewogCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDApOwotCWN4MThfd3JpdGVfcmVnKGN4LCAweDEwMDAwLCBDWDE4X0REUl9TT0ZUX1JFU0VUKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDAwMTAwMDAsIENYMThfRERSX1NPRlRfUkVTRVQsCisJCQkJICAweDAwMDAwMDAwLCAweDAwMDEwMDAxKTsKIAljeDE4X21zbGVlcF90aW1lb3V0KDEwLCAwKTsKIAogCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLmNoaXBfY29uZmlnLCBDWDE4X0REUl9DSElQX0NPTkZJRyk7CkBAIC0yODIsMTMgKzM2NCwxNSBAQAogCiAJY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMCk7CiAKLQljeDE4X3dyaXRlX3JlZyhjeCwgMHgyMDAwMCwgQ1gxOF9ERFJfU09GVF9SRVNFVCk7CisJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAweDAwMDIwMDAwLCBDWDE4X0REUl9TT0ZUX1JFU0VULAorCQkJCSAgMHgwMDAwMDAwMCwgMHgwMDAyMDAwMik7CiAJY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMCk7CiAKIAkvKiB1c2UgcG93ZXItZG93biBtb2RlIHdoZW4gaWRsZSAqLwogCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMDEwLCBDWDE4X0REUl9QT1dFUl9SRUcpOwogCi0JY3gxOF93cml0ZV9yZWcoY3gsIDB4MTAwMDEsIENYMThfUkVHX0JVU19USU1FT1VUX0VOKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDAwMTAwMDEsIENYMThfUkVHX0JVU19USU1FT1VUX0VOLAorCQkJCSAgMHgwMDAwMDAwMSwgMHgwMDAxMDAwMSk7CiAKIAljeDE4X3dyaXRlX3JlZyhjeCwgMHg0OCwgQ1gxOF9ERFJfTUJfUEVSX1JPV183KTsKIAljeDE4X3dyaXRlX3JlZyhjeCwgMHhFMDAwMCwgQ1gxOF9ERFJfQkFTRV82M19BRERSKTsKQEAgLTMwNyw1MSArMzkxLDc2IEBACiAKIGludCBjeDE4X2Zpcm13YXJlX2luaXQoc3RydWN0IGN4MTggKmN4KQogeworCXUzMiBmd19lbnRyeV9hZGRyOworCWludCBzeiwgcmV0cmllczsKKwl1MzIgYXBpX2FyZ3NbTUFYX01CX0FSR1VNRU5UU107CisKIAkvKiBBbGxvdyBjaGlwIHRvIGNvbnRyb2wgQ0xLUlVOICovCiAJY3gxOF93cml0ZV9yZWcoY3gsIDB4NSwgQ1gxOF9EU1AwX0lOVEVSUlVQVF9NQVNLKTsKIAotCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMEYwMDBGLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7IC8qIHN0b3AgdGhlIGZ3ICovCisJLyogU3RvcCB0aGUgZmlybXdhcmUgKi8KKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDAwRjAwMEYsIENYMThfUFJPQ19TT0ZUX1JFU0VULAorCQkJCSAgMHgwMDAwMDAwRiwgMHgwMDBGMDAwRik7CiAKIAljeDE4X21zbGVlcF90aW1lb3V0KDEsIDApOwogCisJLyogSWYgdGhlIENQVSBpcyBzdGlsbCBydW5uaW5nICovCisJaWYgKChjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1BST0NfU09GVF9SRVNFVCkgJiA4KSA9PSAwKSB7CisJCUNYMThfRVJSKCIlczogY291bGRuJ3Qgc3RvcCBDUFUgdG8gbG9hZCBmaXJtd2FyZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAljeDE4X3N3MV9pcnFfZW5hYmxlKGN4LCBJUlFfQ1BVX1RPX0VQVSB8IElSUV9BUFVfVE9fRVBVKTsKIAljeDE4X3N3Ml9pcnFfZW5hYmxlKGN4LCBJUlFfQ1BVX1RPX0VQVV9BQ0sgfCBJUlFfQVBVX1RPX0VQVV9BQ0spOwogCi0JLyogT25seSBpZiB0aGUgcHJvY2Vzc29yIGlzIG5vdCBydW5uaW5nICovCi0JaWYgKGN4MThfcmVhZF9yZWcoY3gsIENYMThfUFJPQ19TT0ZUX1JFU0VUKSAmIDgpIHsKLQkJaW50IHN6ID0gbG9hZF9hcHVfZndfZGlyZWN0KCJ2NGwtY3gyMzQxOC1hcHUuZnciLAotCQkJICAgICAgIGN4LT5lbmNfbWVtLCBjeCk7CisJc3ogPSBsb2FkX2NwdV9md19kaXJlY3QoInY0bC1jeDIzNDE4LWNwdS5mdyIsIGN4LT5lbmNfbWVtLCBjeCk7CisJaWYgKHN6IDw9IDApCisJCXJldHVybiBzejsKIAotCQljeDE4X3dyaXRlX2VuYyhjeCwgMHhFNTFGRjAwNCwgMCk7Ci0JCWN4MThfd3JpdGVfZW5jKGN4LCAweGEwMDAwMCwgNCk7ICAvKiB0b2RvOiBub3QgaGFyZGNvZGVkICovCi0JCS8qIFN0YXJ0IEFQVSAqLwotCQljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMDAxMDAwMCwgQ1gxOF9QUk9DX1NPRlRfUkVTRVQpOwotCQljeDE4X21zbGVlcF90aW1lb3V0KDUwMCwgMCk7CisJLyogVGhlIFNDQiAmIElQQyBhcmVhICptdXN0KiBiZSBjb3JyZWN0IGJlZm9yZSBzdGFydGluZyB0aGUgZmlybXdhcmVzICovCisJY3gxOF9pbml0X3NjYihjeCk7CiAKLQkJc3ogPSBzeiA8PSAwID8gc3ogOiBsb2FkX2NwdV9md19kaXJlY3QoInY0bC1jeDIzNDE4LWNwdS5mdyIsCi0JCQkJCWN4LT5lbmNfbWVtLCBjeCk7CisJZndfZW50cnlfYWRkciA9IDA7CisJc3ogPSBsb2FkX2FwdV9md19kaXJlY3QoInY0bC1jeDIzNDE4LWFwdS5mdyIsIGN4LT5lbmNfbWVtLCBjeCwKKwkJCQkmZndfZW50cnlfYWRkcik7CisJaWYgKHN6IDw9IDApCisJCXJldHVybiBzejsKIAotCQlpZiAoc3ogPiAwKSB7Ci0JCQlpbnQgcmV0cmllcyA9IDA7CisJLyogU3RhcnQgdGhlIENQVS4gVGhlIENQVSB3aWxsIHRha2UgY2FyZSBvZiB0aGUgQVBVIGZvciB1cy4gKi8KKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDAwODAwMDAsIENYMThfUFJPQ19TT0ZUX1JFU0VULAorCQkJCSAgMHgwMDAwMDAwMCwgMHgwMDA4MDAwOCk7CiAKLQkJCS8qIHN0YXJ0IHRoZSBDUFUgKi8KLQkJCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDgwMDAwLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7Ci0JCQl3aGlsZSAocmV0cmllcysrIDwgNTApIHsgLyogTG9vcCBmb3IgbWF4IDUwMG1TICovCi0JCQkJaWYgKChjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1BST0NfU09GVF9SRVNFVCkKLQkJCQkgICAgICYgMSkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMCk7Ci0JCQl9Ci0JCQljeDE4X21zbGVlcF90aW1lb3V0KDIwMCwgMCk7Ci0JCQlpZiAocmV0cmllcyA9PSA1MSkgewotCQkJCUNYMThfRVJSKCJDb3VsZCBub3Qgc3RhcnQgdGhlIENQVVxuIik7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCX0KLQkJaWYgKHN6IDw9IDApCi0JCQlyZXR1cm4gLUVJTzsKKwkvKiBXYWl0IHVwIHRvIDUwMCBtcyBmb3IgdGhlIEFQVSB0byBjb21lIG91dCBvZiByZXNldCAqLworCWZvciAocmV0cmllcyA9IDA7CisJICAgICByZXRyaWVzIDwgNTAgJiYgKGN4MThfcmVhZF9yZWcoY3gsIENYMThfUFJPQ19TT0ZUX1JFU0VUKSAmIDEpID09IDE7CisJICAgICByZXRyaWVzKyspCisJCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDApOworCisJY3gxOF9tc2xlZXBfdGltZW91dCgyMDAsIDApOworCisJaWYgKHJldHJpZXMgPT0gNTAgJiYKKwkgICAgKGN4MThfcmVhZF9yZWcoY3gsIENYMThfUFJPQ19TT0ZUX1JFU0VUKSAmIDEpID09IDEpIHsKKwkJQ1gxOF9FUlIoIkNvdWxkIG5vdCBzdGFydCB0aGUgQ1BVXG4iKTsKKwkJcmV0dXJuIC1FSU87CiAJfQorCisJLyoKKwkgKiBUaGUgQ1BVIGhhZCBvbmNlIGJlZm9yZSBzZXQgdXAgdG8gcmVjZWl2ZSBhbiBpbnRlcnJ1cHQgZm9yIGl0J3MKKwkgKiBvdXRnb2luZyBJUlFfQ1BVX1RPX0VQVV9BQ0sgdG8gdXMuICBJZiBpdCBldmVyIGRvZXMgdGhpcywgd2UgZ2V0IGFuCisJICogaW50ZXJydXB0IHdoZW4gaXQgc2VuZHMgdXMgYW4gYWNrLCBidXQgYnkgdGhlIHRpbWUgd2UgcHJvY2VzcyBpdCwKKwkgKiB0aGF0IGZsYWcgaW4gdGhlIFNXMiBzdGF0dXMgcmVnaXN0ZXIgaGFzIGJlZW4gY2xlYXJlZCBieSB0aGUgQ1BVCisJICogZmlybXdhcmUuICBXZSdsbCBwcmV2ZW50IHRoYXQgbm90IHNvIHVzZWZ1bCBjb25kaXRpb24gZnJvbSBoYXBwZW5pbmcKKwkgKiBieSBjbGVhcmluZyB0aGUgQ1BVJ3MgaW50ZXJydXB0IGVuYWJsZXMgZm9yIEFjayBJUlEncyB3ZSB3YW50IHRvCisJICogcHJvY2Vzcy4KKwkgKi8KKwljeDE4X3N3Ml9pcnFfZGlzYWJsZV9jcHUoY3gsIElSUV9DUFVfVE9fRVBVX0FDSyB8IElSUV9BUFVfVE9fRVBVX0FDSyk7CisKKwkvKiBUcnkgYSBiZW5pZ24gY29tbWFuZCB0byBzZWUgaWYgdGhlIENQVSBpcyBhbGl2ZSBhbmQgd2VsbCAqLworCXN6ID0gY3gxOF92YXBpX3Jlc3VsdChjeCwgYXBpX2FyZ3MsIENYMThfQ1BVX0RFQlVHX1BFRUszMiwgMSwgMCk7CisJaWYgKHN6IDwgMCkKKwkJcmV0dXJuIHN6OworCiAJLyogaW5pdGlhbGl6ZSBHUElPICovCi0JY3gxOF93cml0ZV9yZWcoY3gsIDB4MTQwMDE0MDAsIDB4Qzc4MTEwKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MTQwMDE0MDAsIDB4Yzc4MTEwLCAweDAwMDAxNDAwLCAweDE0MDAxNDAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWdwaW8uYwppbmRleCAwZTU2MDQyLi4xYTk5MzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5jCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LWdwaW8uYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDcsMTUgKzQ4LDE5IEBACiAKIHN0YXRpYyB2b2lkIGdwaW9fd3JpdGUoc3RydWN0IGN4MTggKmN4KQogewotCXUzMiBkaXIgPSBjeC0+Z3Bpb19kaXI7Ci0JdTMyIHZhbCA9IGN4LT5ncGlvX3ZhbDsKKwl1MzIgZGlyX2xvID0gY3gtPmdwaW9fZGlyICYgMHhmZmZmOworCXUzMiB2YWxfbG8gPSBjeC0+Z3Bpb192YWwgJiAweGZmZmY7CisJdTMyIGRpcl9oaSA9IGN4LT5ncGlvX2RpciA+PiAxNjsKKwl1MzIgdmFsX2hpID0gY3gtPmdwaW9fdmFsID4+IDE2OwogCi0JY3gxOF93cml0ZV9yZWcoY3gsIChkaXIgJiAweGZmZmYpIDw8IDE2LCBDWDE4X1JFR19HUElPX0RJUjEpOwotCWN4MThfd3JpdGVfcmVnKGN4LCAoKGRpciAmIDB4ZmZmZikgPDwgMTYpIHwgKHZhbCAmIDB4ZmZmZiksCi0JCQlDWDE4X1JFR19HUElPX09VVDEpOwotCWN4MThfd3JpdGVfcmVnKGN4LCBkaXIgJiAweGZmZmYwMDAwLCBDWDE4X1JFR19HUElPX0RJUjIpOwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIChkaXIgJiAweGZmZmYwMDAwKSB8ICgodmFsICYgMHhmZmZmMDAwMCkgPj4gMTYpLAotCQkJQ1gxOF9SRUdfR1BJT19PVVQyKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIGRpcl9sbyA8PCAxNiwKKwkJCQkJQ1gxOF9SRUdfR1BJT19ESVIxLCB+ZGlyX2xvLCBkaXJfbG8pOworCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgKGRpcl9sbyA8PCAxNikgfCB2YWxfbG8sCisJCQkJCUNYMThfUkVHX0dQSU9fT1VUMSwgdmFsX2xvLCBkaXJfbG8pOworCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgZGlyX2hpIDw8IDE2LAorCQkJCQlDWDE4X1JFR19HUElPX0RJUjIsIH5kaXJfaGksIGRpcl9oaSk7CisJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCAoZGlyX2hpIDw8IDE2KSB8IHZhbF9oaSwKKwkJCQkJQ1gxOF9SRUdfR1BJT19PVVQyLCB2YWxfaGksIGRpcl9oaSk7CiB9CiAKIHZvaWQgY3gxOF9yZXNldF9pMmNfc2xhdmVzX2dwaW8oc3RydWN0IGN4MTggKmN4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5oCmluZGV4IGJlYjc0MjQuLjM5ZmZjY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWdwaW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1ncGlvLmgKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGl2dHYtZ3Bpby5oCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWkyYy5jCmluZGV4IGFhMDllNTUuLjg5NDFmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWkyYy5jCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LWkyYy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNyw2ICsyOCw3IEBACiAjaW5jbHVkZSAiY3gxOC1ncGlvLmgiCiAjaW5jbHVkZSAiY3gxOC1hdi1jb3JlLmgiCiAjaW5jbHVkZSAiY3gxOC1pMmMuaCIKKyNpbmNsdWRlICJjeDE4LWlycS5oIgogCiAjZGVmaW5lIENYMThfUkVHX0kyQ18xX1dSICAgMHhmMTUwMDAKICNkZWZpbmUgQ1gxOF9SRUdfSTJDXzFfUkQgICAweGYxNTAwOApAQCAtMTYwLDkgKzE2Miw5IEBACiAJdTMyIHIgPSBjeDE4X3JlYWRfcmVnKGN4LCBhZGRyKTsKIAogCWlmIChzdGF0ZSkKLQkJY3gxOF93cml0ZV9yZWdfc3luYyhjeCwgciB8IFNFVFNDTF9CSVQsIGFkZHIpOworCQljeDE4X3dyaXRlX3JlZyhjeCwgciB8IFNFVFNDTF9CSVQsIGFkZHIpOwogCWVsc2UKLQkJY3gxOF93cml0ZV9yZWdfc3luYyhjeCwgciAmIH5TRVRTQ0xfQklULCBhZGRyKTsKKwkJY3gxOF93cml0ZV9yZWcoY3gsIHIgJiB+U0VUU0NMX0JJVCwgYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIGN4MThfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKQEAgLTE3Myw5ICsxNzUsOSBAQAogCXUzMiByID0gY3gxOF9yZWFkX3JlZyhjeCwgYWRkcik7CiAKIAlpZiAoc3RhdGUpCi0JCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIHIgfCBTRVRTRExfQklULCBhZGRyKTsKKwkJY3gxOF93cml0ZV9yZWcoY3gsIHIgfCBTRVRTRExfQklULCBhZGRyKTsKIAllbHNlCi0JCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIHIgJiB+U0VUU0RMX0JJVCwgYWRkcik7CisJCWN4MThfd3JpdGVfcmVnKGN4LCByICYgflNFVFNETF9CSVQsIGFkZHIpOwogfQogCiBzdGF0aWMgaW50IGN4MThfZ2V0c2NsKHZvaWQgKmRhdGEpCkBAIC0zOTYsMzAgKzM5OCwzMyBAQAogCWlmIChjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1JFR19JMkNfMl9XUikgIT0gMHgwMDAzYzAyZikgewogCQkvKiBSZXNldC9VbnJlc2V0IEkyQyBoYXJkd2FyZSBibG9jayAqLwogCQkvKiBDbG9jayBzZWxlY3QgMjIwTUh6ICovCi0JCWN4MThfd3JpdGVfcmVnKGN4LCAweDEwMDAwMDAwLCAweGM3MTAwNCk7CisJCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHgxMDAwMDAwMCwgMHhjNzEwMDQsCisJCQkJCSAgMHgwMDAwMDAwMCwgMHgxMDAwMTAwMCk7CiAJCS8qIENsb2NrIEVuYWJsZSAqLwotCQljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCAweDEwMDAxMDAwLCAweGM3MTAyNCk7CisJCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgMHgxMDAwMTAwMCwgMHhjNzEwMjQsCisJCQkJCSAgMHgwMDAwMTAwMCwgMHgxMDAwMTAwMCk7CiAJfQogCS8qIGNvdXJ0ZXN5IG9mIFN0ZXZlbiBUb3RoIDxzdG90aEBoYXVwcGF1Z2UuY29tPiAqLwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwMDAsIDB4YzcwMDFjKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDBjMDAwMDAsIDB4YzcwMDFjLCAweDAwMDAwMDAwLCAweDAwYzAwMGMwKTsKIAltZGVsYXkoMTApOwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwYzAsIDB4YzcwMDFjKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDBjMDAwYzAsIDB4YzcwMDFjLCAweDAwMDAwMGMwLCAweDAwYzAwMGMwKTsKIAltZGVsYXkoMTApOwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwMDAsIDB4YzcwMDFjKTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIDB4MDBjMDAwMDAsIDB4YzcwMDFjLCAweDAwMDAwMDAwLCAweDAwYzAwMGMwKTsKIAltZGVsYXkoMTApOwogCiAJLyogU2V0IHRvIGVkZ2UtdHJpZ2dlcmVkIGludHJzLiAqLwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwMDAsIDB4YzczMGM4KTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMGMwMDAwMCwgMHhjNzMwYzgpOwogCS8qIENsZWFyIGFueSBzdGFsZSBpbnRycyAqLwotCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwMDAsIDB4YzczMGM0KTsKKwljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIEhXMl9JMkMxX0lOVHxIVzJfSTJDMl9JTlQsIEhXMl9JTlRfQ0xSX1NUQVRVUywKKwkJICAgICAgIH4oSFcyX0kyQzFfSU5UfEhXMl9JMkMyX0lOVCksIEhXMl9JMkMxX0lOVHxIVzJfSTJDMl9JTlQpOwogCiAJLyogSHcgSTJDMSBDbG9jayBGcmVxIH4xMDBrSHogKi8KLQljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCAweDAwMDIxYzBmICYgfjQsIENYMThfUkVHX0kyQ18xX1dSKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMDAyMWMwZiAmIH40LCBDWDE4X1JFR19JMkNfMV9XUik7CiAJY3gxOF9zZXRzY2woJmN4LT5pMmNfYWxnb19jYl9kYXRhWzBdLCAxKTsKIAljeDE4X3NldHNkYSgmY3gtPmkyY19hbGdvX2NiX2RhdGFbMF0sIDEpOwogCiAJLyogSHcgSTJDMiBDbG9jayBGcmVxIH4xMDBrSHogKi8KLQljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCAweDAwMDIxYzBmICYgfjQsIENYMThfUkVHX0kyQ18yX1dSKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMDAyMWMwZiAmIH40LCBDWDE4X1JFR19JMkNfMl9XUik7CiAJY3gxOF9zZXRzY2woJmN4LT5pMmNfYWxnb19jYl9kYXRhWzFdLCAxKTsKIAljeDE4X3NldHNkYSgmY3gtPmkyY19hbGdvX2NiX2RhdGFbMV0sIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW8uYwppbmRleCAyMjBmYWU4Li5lYzViM2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvLmMKQEAgLTI0LDE3OSArMjQsNiBAQAogI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LWlycS5oIgogCi12b2lkIGN4MThfbG9nX3N0YXRpc3RpY3Moc3RydWN0IGN4MTggKmN4KQotewotCWludCBpOwotCi0JaWYgKCEoY3gxOF9kZWJ1ZyAmIENYMThfREJHRkxHX0lORk8pKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKQotCQlDWDE4X0RFQlVHX0lORk8oInJldHJpZWRfd3JpdGVbJWRdID0gJWRcbiIsIGksCi0JCQkJYXRvbWljX3JlYWQoJmN4LT5tbWlvX3N0YXRzLnJldHJpZWRfd3JpdGVbaV0pKTsKLQlmb3IgKGkgPSAwOyBpIDw9IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKQotCQlDWDE4X0RFQlVHX0lORk8oInJldHJpZWRfcmVhZFslZF0gPSAlZFxuIiwgaSwKLQkJCQlhdG9taWNfcmVhZCgmY3gtPm1taW9fc3RhdHMucmV0cmllZF9yZWFkW2ldKSk7Ci0JcmV0dXJuOwotfQotCi12b2lkIGN4MThfcmF3X3dyaXRlbF9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKLQkJY3gxOF9yYXdfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JCWlmICh2YWwgPT0gY3gxOF9yYXdfcmVhZGxfbm9yZXRyeShjeCwgYWRkcikpCi0JCQlicmVhazsKLQl9Ci0JY3gxOF9sb2dfd3JpdGVfcmV0cmllcyhjeCwgaSwgYWRkcik7Ci19Ci0KLXUzMiBjeDE4X3Jhd19yZWFkbF9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaTsKLQl1MzIgdmFsOwotCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykgewotCQl2YWwgPSBjeDE4X3Jhd19yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKLQkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KLQkJCWJyZWFrOwotCX0KLQljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOwotCXJldHVybiB2YWw7Ci19Ci0KLXUxNiBjeDE4X3Jhd19yZWFkd19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaTsKLQl1MTYgdmFsOwotCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykgewotCQl2YWwgPSBjeDE4X3Jhd19yZWFkd19ub3JldHJ5KGN4LCBhZGRyKTsKLQkJaWYgKHZhbCAhPSAweGZmZmYpIC8qIFBDSSBidXMgcmVhZCBlcnJvciAqLwotCQkJYnJlYWs7Ci0JfQotCWN4MThfbG9nX3JlYWRfcmV0cmllcyhjeCwgaSwgYWRkcik7Ci0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBjeDE4X3dyaXRlbF9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKLQkJY3gxOF93cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQkJaWYgKHZhbCA9PSBjeDE4X3JlYWRsX25vcmV0cnkoY3gsIGFkZHIpKQotCQkJYnJlYWs7Ci0JfQotCWN4MThfbG9nX3dyaXRlX3JldHJpZXMoY3gsIGksIGFkZHIpOwotfQotCi12b2lkIF9jeDE4X3dyaXRlbF9leHBlY3Qoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIsCi0JCQkgdTMyIGV2YWwsIHUzMiBtYXNrKQotewotCWludCBpOwotCWV2YWwgJj0gbWFzazsKLQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKLQkJY3gxOF93cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQkJaWYgKGV2YWwgPT0gKGN4MThfcmVhZGxfbm9yZXRyeShjeCwgYWRkcikgJiBtYXNrKSkKLQkJCWJyZWFrOwotCX0KLQljeDE4X2xvZ193cml0ZV9yZXRyaWVzKGN4LCBpLCBhZGRyKTsKLX0KLQotdm9pZCBjeDE4X3dyaXRld19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKLQkJY3gxOF93cml0ZXdfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQkJaWYgKHZhbCA9PSBjeDE4X3JlYWR3X25vcmV0cnkoY3gsIGFkZHIpKQotCQkJYnJlYWs7Ci0JfQotCWN4MThfbG9nX3dyaXRlX3JldHJpZXMoY3gsIGksIGFkZHIpOwotfQotCi12b2lkIGN4MThfd3JpdGViX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7Ci0JCWN4MThfd3JpdGViX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JCWlmICh2YWwgPT0gY3gxOF9yZWFkYl9ub3JldHJ5KGN4LCBhZGRyKSkKLQkJCWJyZWFrOwotCX0KLQljeDE4X2xvZ193cml0ZV9yZXRyaWVzKGN4LCBpLCBhZGRyKTsKLX0KLQotdTMyIGN4MThfcmVhZGxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaW50IGk7Ci0JdTMyIHZhbDsKLQlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKLQkJdmFsID0gY3gxOF9yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKLQkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KLQkJCWJyZWFrOwotCX0KLQljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOwotCXJldHVybiB2YWw7Ci19Ci0KLXUxNiBjeDE4X3JlYWR3X3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQotewotCWludCBpOwotCXUxNiB2YWw7Ci0JZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7Ci0JCXZhbCA9IGN4MThfcmVhZHdfbm9yZXRyeShjeCwgYWRkcik7Ci0JCWlmICh2YWwgIT0gMHhmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KLQkJCWJyZWFrOwotCX0KLQljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOwotCXJldHVybiB2YWw7Ci19Ci0KLXU4IGN4MThfcmVhZGJfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaW50IGk7Ci0JdTggdmFsOwotCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykgewotCQl2YWwgPSBjeDE4X3JlYWRiX25vcmV0cnkoY3gsIGFkZHIpOwotCQlpZiAodmFsICE9IDB4ZmYpIC8qIFBDSSBidXMgcmVhZCBlcnJvciAqLwotCQkJYnJlYWs7Ci0JfQotCWN4MThfbG9nX3JlYWRfcmV0cmllcyhjeCwgaSwgYWRkcik7Ci0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBjeDE4X21lbWNweV9mcm9taW8oc3RydWN0IGN4MTggKmN4LCB2b2lkICp0bywKLQkJCWNvbnN0IHZvaWQgX19pb21lbSAqZnJvbSwgdW5zaWduZWQgaW50IGxlbikKLXsKLQljb25zdCB1OCBfX2lvbWVtICpzcmMgPSBmcm9tOwotCXU4ICpkc3QgPSB0bzsKLQotCS8qIEFsaWduIHJlYWRzIG9uIHRoZSBDWDIzNDE4J3MgYWRkcmVzc2VzICovCi0JaWYgKChsZW4gPiAwKSAmJiAoKHVuc2lnbmVkIGxvbmcpIHNyYyAmIDEpKSB7Ci0JCSpkc3QgPSBjeDE4X3JlYWRiKGN4LCBzcmMpOwotCQlsZW4tLTsKLQkJZHN0Kys7Ci0JCXNyYysrOwotCX0KLQlpZiAoKGxlbiA+IDEpICYmICgodW5zaWduZWQgbG9uZykgc3JjICYgMikpIHsKLQkJKigodTE2ICopZHN0KSA9IGN4MThfcmF3X3JlYWR3KGN4LCBzcmMpOwotCQlsZW4gLT0gMjsKLQkJZHN0ICs9IDI7Ci0JCXNyYyArPSAyOwotCX0KLQl3aGlsZSAobGVuID4gMykgewotCQkqKCh1MzIgKilkc3QpID0gY3gxOF9yYXdfcmVhZGwoY3gsIHNyYyk7Ci0JCWxlbiAtPSA0OwotCQlkc3QgKz0gNDsKLQkJc3JjICs9IDQ7Ci0JfQotCWlmIChsZW4gPiAxKSB7Ci0JCSooKHUxNiAqKWRzdCkgPSBjeDE4X3Jhd19yZWFkdyhjeCwgc3JjKTsKLQkJbGVuIC09IDI7Ci0JCWRzdCArPSAyOwotCQlzcmMgKz0gMjsKLQl9Ci0JaWYgKGxlbiA+IDApCi0JCSpkc3QgPSBjeDE4X3JlYWRiKGN4LCBzcmMpOwotfQotCiB2b2lkIGN4MThfbWVtc2V0X2lvKHN0cnVjdCBjeDE4ICpjeCwgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsLCBzaXplX3QgY291bnQpCiB7CiAJdTggX19pb21lbSAqZHN0ID0gYWRkcjsKQEAgLTIzMCwzMiArNTcsMzUgQEAKIAogdm9pZCBjeDE4X3N3MV9pcnFfZW5hYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCkKIHsKLQl1MzIgcjsKIAljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIHZhbCwgU1cxX0lOVF9TVEFUVVMsIH52YWwsIHZhbCk7Ci0JciA9IGN4MThfcmVhZF9yZWcoY3gsIFNXMV9JTlRfRU5BQkxFX1BDSSk7Ci0JY3gxOF93cml0ZV9yZWcoY3gsIHIgfCB2YWwsIFNXMV9JTlRfRU5BQkxFX1BDSSk7CisJY3gtPnN3MV9pcnFfbWFzayA9IGN4MThfcmVhZF9yZWcoY3gsIFNXMV9JTlRfRU5BQkxFX1BDSSkgfCB2YWw7CisJY3gxOF93cml0ZV9yZWcoY3gsIGN4LT5zdzFfaXJxX21hc2ssIFNXMV9JTlRfRU5BQkxFX1BDSSk7CiB9CiAKIHZvaWQgY3gxOF9zdzFfaXJxX2Rpc2FibGUoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsKQogewotCXUzMiByOwotCXIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzFfSU5UX0VOQUJMRV9QQ0kpOwotCWN4MThfd3JpdGVfcmVnKGN4LCByICYgfnZhbCwgU1cxX0lOVF9FTkFCTEVfUENJKTsKKwljeC0+c3cxX2lycV9tYXNrID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cxX0lOVF9FTkFCTEVfUENJKSAmIH52YWw7CisJY3gxOF93cml0ZV9yZWcoY3gsIGN4LT5zdzFfaXJxX21hc2ssIFNXMV9JTlRfRU5BQkxFX1BDSSk7CiB9CiAKIHZvaWQgY3gxOF9zdzJfaXJxX2VuYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpCiB7Ci0JdTMyIHI7CiAJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCB2YWwsIFNXMl9JTlRfU1RBVFVTLCB+dmFsLCB2YWwpOwotCXIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzJfSU5UX0VOQUJMRV9QQ0kpOwotCWN4MThfd3JpdGVfcmVnKGN4LCByIHwgdmFsLCBTVzJfSU5UX0VOQUJMRV9QQ0kpOworCWN4LT5zdzJfaXJxX21hc2sgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzJfSU5UX0VOQUJMRV9QQ0kpIHwgdmFsOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+c3cyX2lycV9tYXNrLCBTVzJfSU5UX0VOQUJMRV9QQ0kpOwogfQogCiB2b2lkIGN4MThfc3cyX2lycV9kaXNhYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCkKIHsKKwljeC0+c3cyX2lycV9tYXNrID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cyX0lOVF9FTkFCTEVfUENJKSAmIH52YWw7CisJY3gxOF93cml0ZV9yZWcoY3gsIGN4LT5zdzJfaXJxX21hc2ssIFNXMl9JTlRfRU5BQkxFX1BDSSk7Cit9CisKK3ZvaWQgY3gxOF9zdzJfaXJxX2Rpc2FibGVfY3B1KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCkKK3sKIAl1MzIgcjsKLQlyID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cyX0lOVF9FTkFCTEVfUENJKTsKLQljeDE4X3dyaXRlX3JlZyhjeCwgciAmIH52YWwsIFNXMl9JTlRfRU5BQkxFX1BDSSk7CisJciA9IGN4MThfcmVhZF9yZWcoY3gsIFNXMl9JTlRfRU5BQkxFX0NQVSk7CisJY3gxOF93cml0ZV9yZWcoY3gsIHIgJiB+dmFsLCBTVzJfSU5UX0VOQUJMRV9DUFUpOwogfQogCiB2b2lkIGN4MThfc2V0dXBfcGFnZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBhZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvLmgKaW5kZXggNDI1MjQ0NC4uMjYzNWIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pby5oCkBAIC0yNSwyMzIgKzI1LDEyNSBAQAogCiAjaW5jbHVkZSAiY3gxOC1kcml2ZXIuaCIKIAotc3RhdGljIGlubGluZSB2b2lkIGN4MThfaW9fZGVsYXkoc3RydWN0IGN4MTggKmN4KQotewotCWlmIChjeC0+b3B0aW9ucy5tbWlvX25kZWxheSkKLQkJbmRlbGF5KGN4LT5vcHRpb25zLm1taW9fbmRlbGF5KTsKLX0KLQogLyoKICAqIFJlYWRiYWNrIGFuZCByZXRyeSBvZiBNTUlPIGFjY2VzcyBmb3IgcmVsaWFiaWxpdHk6CiAgKiBUaGUgY29uY2VwdCB3YXMgc3VnZ2VzdGVkIGJ5IFN0ZXZlIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPi4KICAqIFRoZSBpbXBsbWVudGF0aW9uIGlzIHRoZSBmYXVsdCBvZiBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0Pi4KKyAqCisgKiAqd3JpdGUqIGZ1bmN0aW9ucyBhcmUgaW1wbGllZCB0byByZXRyeSB0aGUgbW1pbyB1bmxlc3Mgc3VmZml4ZWQgd2l0aCBfbm9yZXRyeQorICogKnJlYWQqIGZ1bmN0aW9ucyBuZXZlciByZXRyeSB0aGUgbW1pbyAoaXQgbmV2ZXIgaGVscHMgdG8gZG8gc28pCiAgKi8KIAotLyogU3RhdGlzdGljcyBnYXRoZXJpbmcgKi8KLXN0YXRpYyBpbmxpbmUKLXZvaWQgY3gxOF9sb2dfd3JpdGVfcmV0cmllcyhzdHJ1Y3QgY3gxOCAqY3gsIGludCBpLCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGkgPiBDWDE4X01BWF9NTUlPX1JFVFJJRVMpCi0JCWkgPSBDWDE4X01BWF9NTUlPX1JFVFJJRVM7Ci0JYXRvbWljX2luYygmY3gtPm1taW9fc3RhdHMucmV0cmllZF93cml0ZVtpXSk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIGN4MThfbG9nX3JlYWRfcmV0cmllcyhzdHJ1Y3QgY3gxOCAqY3gsIGludCBpLCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGkgPiBDWDE4X01BWF9NTUlPX1JFVFJJRVMpCi0JCWkgPSBDWDE4X01BWF9NTUlPX1JFVFJJRVM7Ci0JYXRvbWljX2luYygmY3gtPm1taW9fc3RhdHMucmV0cmllZF9yZWFkW2ldKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgY3gxOF9sb2dfc3RhdGlzdGljcyhzdHJ1Y3QgY3gxOCAqY3gpOwotCiAvKiBOb24gYnl0ZXN3YXBwaW5nIG1lbW9yeSBtYXBwZWQgSU8gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmF3X3JlYWRsKHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiBfX3Jhd19yZWFkbChhZGRyKTsKK30KKwogc3RhdGljIGlubGluZQogdm9pZCBjeDE4X3Jhd193cml0ZWxfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlfX3Jhd193cml0ZWwodmFsLCBhZGRyKTsKLQljeDE4X2lvX2RlbGF5KGN4KTsKIH0KIAotdm9pZCBjeDE4X3Jhd193cml0ZWxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF9yYXdfd3JpdGVsKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWlmIChjeDE4X3JldHJ5X21taW8pCi0JCWN4MThfcmF3X3dyaXRlbF9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQllbHNlCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fV1JfUkVUUklFUzsgaSsrKSB7CiAJCWN4MThfcmF3X3dyaXRlbF9ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCQlpZiAodmFsID09IGN4MThfcmF3X3JlYWRsKGN4LCBhZGRyKSkKKwkJCWJyZWFrOworCX0KIH0KIAotCi1zdGF0aWMgaW5saW5lCi11MzIgY3gxOF9yYXdfcmVhZGxfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MzIgcmV0ID0gX19yYXdfcmVhZGwoYWRkcik7Ci0JY3gxOF9pb19kZWxheShjeCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdTMyIGN4MThfcmF3X3JlYWRsX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKTsKLQotc3RhdGljIGlubGluZSB1MzIgY3gxOF9yYXdfcmVhZGwoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJcmV0dXJuIGN4MThfcmF3X3JlYWRsX3JldHJ5KGN4LCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3Jhd19yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lCi11MTYgY3gxOF9yYXdfcmVhZHdfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MTYgcmV0ID0gX19yYXdfcmVhZHcoYWRkcik7Ci0JY3gxOF9pb19kZWxheShjeCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdTE2IGN4MThfcmF3X3JlYWR3X3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKTsKLQotc3RhdGljIGlubGluZSB1MTYgY3gxOF9yYXdfcmVhZHcoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJcmV0dXJuIGN4MThfcmF3X3JlYWR3X3JldHJ5KGN4LCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3Jhd19yZWFkd19ub3JldHJ5KGN4LCBhZGRyKTsKLX0KLQotCiAvKiBOb3JtYWwgbWVtb3J5IG1hcHBlZCBJTyAqLworc3RhdGljIGlubGluZSB1MzIgY3gxOF9yZWFkbChzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoYWRkcik7Cit9CisKIHN0YXRpYyBpbmxpbmUKIHZvaWQgY3gxOF93cml0ZWxfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl3cml0ZWwodmFsLCBhZGRyKTsKLQljeDE4X2lvX2RlbGF5KGN4KTsKIH0KIAotdm9pZCBjeDE4X3dyaXRlbF9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcik7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjeDE4X3dyaXRlbChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQljeDE4X3dyaXRlbF9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQllbHNlCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fV1JfUkVUUklFUzsgaSsrKSB7CiAJCWN4MThfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJCWlmICh2YWwgPT0gY3gxOF9yZWFkbChjeCwgYWRkcikpCisJCQlicmVhazsKKwl9CiB9CiAKLXZvaWQgX2N4MThfd3JpdGVsX2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkciwKLQkJCSB1MzIgZXZhbCwgdTMyIG1hc2spOworc3RhdGljIGlubGluZQordm9pZCBjeDE4X3dyaXRlbF9leHBlY3Qoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIsCisJCQl1MzIgZXZhbCwgdTMyIG1hc2spCit7CisJaW50IGk7CisJdTMyIHI7CisJZXZhbCAmPSBtYXNrOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1dSX1JFVFJJRVM7IGkrKykgeworCQljeDE4X3dyaXRlbF9ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCQlyID0gY3gxOF9yZWFkbChjeCwgYWRkcik7CisJCWlmIChyID09IDB4ZmZmZmZmZmYgJiYgZXZhbCAhPSAweGZmZmZmZmZmKQorCQkJY29udGludWU7CisJCWlmIChldmFsID09IChyICYgbWFzaykpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGN4MThfcmVhZHcoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWR3KGFkZHIpOworfQogCiBzdGF0aWMgaW5saW5lCiB2b2lkIGN4MThfd3JpdGV3X25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJd3JpdGV3KHZhbCwgYWRkcik7Ci0JY3gxOF9pb19kZWxheShjeCk7CiB9CiAKLXZvaWQgY3gxOF93cml0ZXdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZXcoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJY3gxOF93cml0ZXdfcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JZWxzZQorCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1dSX1JFVFJJRVM7IGkrKykgewogCQljeDE4X3dyaXRld19ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCQlpZiAodmFsID09IGN4MThfcmVhZHcoY3gsIGFkZHIpKQorCQkJYnJlYWs7CisJfQogfQogCitzdGF0aWMgaW5saW5lIHU4IGN4MThfcmVhZGIoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIHJlYWRiKGFkZHIpOworfQogCiBzdGF0aWMgaW5saW5lCiB2b2lkIGN4MThfd3JpdGViX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl3cml0ZWIodmFsLCBhZGRyKTsKLQljeDE4X2lvX2RlbGF5KGN4KTsKIH0KIAotdm9pZCBjeDE4X3dyaXRlYl9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHU4IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKLQogc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGViKHN0cnVjdCBjeDE4ICpjeCwgdTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJY3gxOF93cml0ZWJfcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JZWxzZQorCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1dSX1JFVFJJRVM7IGkrKykgewogCQljeDE4X3dyaXRlYl9ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZGxfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MzIgcmV0ID0gcmVhZGwoYWRkcik7Ci0JY3gxOF9pb19kZWxheShjeCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdTMyIGN4MThfcmVhZGxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCi1zdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRsKHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQotewotCWlmIChjeDE4X3JldHJ5X21taW8pCi0JCXJldHVybiBjeDE4X3JlYWRsX3JldHJ5KGN4LCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3JlYWRsX25vcmV0cnkoY3gsIGFkZHIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTE2IGN4MThfcmVhZHdfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1MTYgcmV0ID0gcmVhZHcoYWRkcik7Ci0JY3gxOF9pb19kZWxheShjeCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdTE2IGN4MThfcmVhZHdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCi1zdGF0aWMgaW5saW5lIHUxNiBjeDE4X3JlYWR3KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQotewotCWlmIChjeDE4X3JldHJ5X21taW8pCi0JCXJldHVybiBjeDE4X3JlYWR3X3JldHJ5KGN4LCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3JlYWR3X25vcmV0cnkoY3gsIGFkZHIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTggY3gxOF9yZWFkYl9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQotewotCXU4IHJldCA9IHJlYWRiKGFkZHIpOwotCWN4MThfaW9fZGVsYXkoY3gpOwotCXJldHVybiByZXQ7Ci19Ci0KLXU4IGN4MThfcmVhZGJfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpOwotCi1zdGF0aWMgaW5saW5lIHU4IGN4MThfcmVhZGIoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJcmV0dXJuIGN4MThfcmVhZGJfcmV0cnkoY3gsIGFkZHIpOwotCi0JcmV0dXJuIGN4MThfcmVhZGJfbm9yZXRyeShjeCwgYWRkcik7Ci19Ci0KLQotc3RhdGljIGlubGluZQotdTMyIGN4MThfd3JpdGVfc3luY19ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQotewotCWN4MThfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JcmV0dXJuIGN4MThfcmVhZGxfbm9yZXRyeShjeCwgYWRkcik7CisJCWlmICh2YWwgPT0gY3gxOF9yZWFkYihjeCwgYWRkcikpCisJCQlicmVhazsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUKLXUzMiBjeDE4X3dyaXRlX3N5bmNfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JY3gxOF93cml0ZWxfcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci0JcmV0dXJuIGN4MThfcmVhZGxfcmV0cnkoY3gsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBjeDE4X3dyaXRlX3N5bmMoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJcmV0dXJuIGN4MThfd3JpdGVfc3luY19yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKLX0KLQotCiB2b2lkIGN4MThfbWVtY3B5X2Zyb21pbyhzdHJ1Y3QgY3gxOCAqY3gsIHZvaWQgKnRvLAotCQkJY29uc3Qgdm9pZCBfX2lvbWVtICpmcm9tLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwkJCWNvbnN0IHZvaWQgX19pb21lbSAqZnJvbSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwltZW1jcHlfZnJvbWlvKHRvLCBmcm9tLCBsZW4pOworfQorCiB2b2lkIGN4MThfbWVtc2V0X2lvKHN0cnVjdCBjeDE4ICpjeCwgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsLCBzaXplX3QgY291bnQpOwogCiAKQEAgLTI2MCwxMzYgKzE1MywzOSBAQAogCWN4MThfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgY3gtPnJlZ19tZW0gKyByZWcpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZV9yZWdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgcmVnKQotewotCWN4MThfd3JpdGVsX3JldHJ5KGN4LCB2YWwsIGN4LT5yZWdfbWVtICsgcmVnKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVfcmVnKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIHJlZykKIHsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQljeDE4X3dyaXRlX3JlZ19yZXRyeShjeCwgdmFsLCByZWcpOwotCWVsc2UKLQkJY3gxOF93cml0ZV9yZWdfbm9yZXRyeShjeCwgdmFsLCByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2N4MThfd3JpdGVfcmVnX2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiByZWcsCi0JCQkJCSAgdTMyIGV2YWwsIHUzMiBtYXNrKQotewotCV9jeDE4X3dyaXRlbF9leHBlY3QoY3gsIHZhbCwgY3gtPnJlZ19tZW0gKyByZWcsIGV2YWwsIG1hc2spOworCWN4MThfd3JpdGVsKGN4LCB2YWwsIGN4LT5yZWdfbWVtICsgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVfcmVnX2V4cGVjdChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiByZWcsCiAJCQkJCSB1MzIgZXZhbCwgdTMyIG1hc2spCiB7Ci0JaWYgKGN4MThfcmV0cnlfbW1pbykKLQkJX2N4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgdmFsLCByZWcsIGV2YWwsIG1hc2spOwotCWVsc2UKLQkJY3gxOF93cml0ZV9yZWdfbm9yZXRyeShjeCwgdmFsLCByZWcpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZF9yZWdfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiByZWcpCi17Ci0JcmV0dXJuIGN4MThfcmVhZGxfbm9yZXRyeShjeCwgY3gtPnJlZ19tZW0gKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRfcmVnX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHJlZykKLXsKLQlyZXR1cm4gY3gxOF9yZWFkbF9yZXRyeShjeCwgY3gtPnJlZ19tZW0gKyByZWcpOworCWN4MThfd3JpdGVsX2V4cGVjdChjeCwgdmFsLCBjeC0+cmVnX21lbSArIHJlZywgZXZhbCwgbWFzayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZF9yZWcoc3RydWN0IGN4MTggKmN4LCB1MzIgcmVnKQogewotCWlmIChjeDE4X3JldHJ5X21taW8pCi0JCXJldHVybiBjeDE4X3JlYWRfcmVnX3JldHJ5KGN4LCByZWcpOwotCi0JcmV0dXJuIGN4MThfcmVhZF9yZWdfbm9yZXRyeShjeCwgcmVnKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHUzMiBjeDE4X3dyaXRlX3JlZ19zeW5jX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgcmVnKQotewotCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfbm9yZXRyeShjeCwgdmFsLCBjeC0+cmVnX21lbSArIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGN4MThfd3JpdGVfcmVnX3N5bmNfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgcmVnKQotewotCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfcmV0cnkoY3gsIHZhbCwgY3gtPnJlZ19tZW0gKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBjeDE4X3dyaXRlX3JlZ19zeW5jKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIHJlZykKLXsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQlyZXR1cm4gY3gxOF93cml0ZV9yZWdfc3luY19yZXRyeShjeCwgdmFsLCByZWcpOwotCi0JcmV0dXJuIGN4MThfd3JpdGVfcmVnX3N5bmNfbm9yZXRyeShjeCwgdmFsLCByZWcpOworCXJldHVybiBjeDE4X3JlYWRsKGN4LCBjeC0+cmVnX21lbSArIHJlZyk7CiB9CiAKIAogLyogQWNjZXNzICJlbmNvZGVyIG1lbW9yeSIgcmVnaW9uIG9mIENYMjM0MTggbWVtb3J5IG1hcHBlZCBJL08gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjeDE4X3dyaXRlX2VuY19ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIGFkZHIpCi17Ci0JY3gxOF93cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBjeC0+ZW5jX21lbSArIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZV9lbmNfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgYWRkcikKLXsKLQljeDE4X3dyaXRlbF9yZXRyeShjeCwgdmFsLCBjeC0+ZW5jX21lbSArIGFkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZV9lbmMoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgYWRkcikKIHsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQljeDE4X3dyaXRlX2VuY19yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQllbHNlCi0JCWN4MThfd3JpdGVfZW5jX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1MzIgY3gxOF9yZWFkX2VuY19ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIGFkZHIpCi17Ci0JcmV0dXJuIGN4MThfcmVhZGxfbm9yZXRyeShjeCwgY3gtPmVuY19tZW0gKyBhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgY3gxOF9yZWFkX2VuY19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBhZGRyKQotewotCXJldHVybiBjeDE4X3JlYWRsX3JldHJ5KGN4LCBjeC0+ZW5jX21lbSArIGFkZHIpOworCWN4MThfd3JpdGVsKGN4LCB2YWwsIGN4LT5lbmNfbWVtICsgYWRkcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZF9lbmMoc3RydWN0IGN4MTggKmN4LCB1MzIgYWRkcikKIHsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQlyZXR1cm4gY3gxOF9yZWFkX2VuY19yZXRyeShjeCwgYWRkcik7Ci0KLQlyZXR1cm4gY3gxOF9yZWFkX2VuY19ub3JldHJ5KGN4LCBhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZQotdTMyIGN4MThfd3JpdGVfZW5jX3N5bmNfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQotewotCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfbm9yZXRyeShjeCwgdmFsLCBjeC0+ZW5jX21lbSArIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lCi11MzIgY3gxOF93cml0ZV9lbmNfc3luY19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQotewotCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfcmV0cnkoY3gsIHZhbCwgY3gtPmVuY19tZW0gKyBhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZQotdTMyIGN4MThfd3JpdGVfZW5jX3N5bmMoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgYWRkcikKLXsKLQlpZiAoY3gxOF9yZXRyeV9tbWlvKQotCQlyZXR1cm4gY3gxOF93cml0ZV9lbmNfc3luY19yZXRyeShjeCwgdmFsLCBhZGRyKTsKLQotCXJldHVybiBjeDE4X3dyaXRlX2VuY19zeW5jX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJcmV0dXJuIGN4MThfcmVhZGwoY3gsIGN4LT5lbmNfbWVtICsgYWRkcik7CiB9CiAKIHZvaWQgY3gxOF9zdzFfaXJxX2VuYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpOwogdm9pZCBjeDE4X3N3MV9pcnFfZGlzYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpOwogdm9pZCBjeDE4X3N3Ml9pcnFfZW5hYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCk7CiB2b2lkIGN4MThfc3cyX2lycV9kaXNhYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCk7Cit2b2lkIGN4MThfc3cyX2lycV9kaXNhYmxlX2NwdShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpOwogdm9pZCBjeDE4X3NldHVwX3BhZ2Uoc3RydWN0IGN4MTggKmN4LCB1MzIgYWRkcik7CiAKICNlbmRpZiAvKiBDWDE4X0lPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCmluZGV4IGYwY2E1MGYuLmU2MDg3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBEZXJpdmVkIGZyb20gaXZ0di1pb2N0bC5jCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yMzcsMTMgKzIzOCwxMiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoaWQtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJICYmCi0JCQljeC0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgJiYKLQkJCWF0b21pY19yZWFkKCZjeC0+YW5hX2NhcHR1cmluZykgPiAwKQorCWlmICghY3gxOF9yYXdfdmJpKGN4KSAmJiBhdG9taWNfcmVhZCgmY3gtPmFuYV9jYXB0dXJpbmcpID4gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWN4LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9IDA7Ci0JY3gxOF9hdl9jbWQoY3gsIFZJRElPQ19TX0ZNVCwgJmN4LT52YmkuaW4pOworCWN4LT52YmkuaW4udHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisJY3gxOF9hdl9jbWQoY3gsIFZJRElPQ19TX0ZNVCwgZm10KTsKIAlyZXR1cm4gY3gxOF9nX2ZtdF92YmlfY2FwKGZpbGUsIGZoLCBmbXQpOwogfQogCkBAIC03NDUsMTQgKzc0NSwxMiBAQAogCQkJY29udGludWU7CiAJCUNYMThfSU5GTygiU3RyZWFtICVzOiBzdGF0dXMgMHglMDRseCwgJWQlJSBvZiAlZCBLaUIgKCVkIGJ1ZmZlcnMpIGluIHVzZVxuIiwKIAkJCSAgcy0+bmFtZSwgcy0+c19mbGFncywKLQkJCSAgKHMtPmJ1ZmZlcnMgLSBhdG9taWNfcmVhZCgmcy0+cV9mcmVlLmJ1ZmZlcnMpKQotCQkJCSogMTAwIC8gcy0+YnVmZmVycywKKwkJCSAgYXRvbWljX3JlYWQoJnMtPnFfZnVsbC5idWZmZXJzKSAqIDEwMCAvIHMtPmJ1ZmZlcnMsCiAJCQkgIChzLT5idWZmZXJzICogcy0+YnVmX3NpemUpIC8gMTAyNCwgcy0+YnVmZmVycyk7CiAJfQogCUNYMThfSU5GTygiUmVhZCBNUEVHL1ZCSTogJWxsZC8lbGxkIGJ5dGVzXG4iLAogCQkJKGxvbmcgbG9uZyljeC0+bXBnX2RhdGFfcmVjZWl2ZWQsCiAJCQkobG9uZyBsb25nKWN4LT52YmlfZGF0YV9pbnNlcnRlZCk7Ci0JY3gxOF9sb2dfc3RhdGlzdGljcyhjeCk7CiAJQ1gxOF9JTkZPKCI9PT09PT09PT09PT09PT09PT0gIEVORCBTVEFUVVMgQ0FSRCAjJWQgID09PT09PT09PT09PT09PT09PVxuIiwgY3gtPm51bSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuaAppbmRleCAyMjIyZjY3Li4wOGZlMjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmgKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGl2dHYtaW9jdGwuaAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaXJxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYwppbmRleCA1ZmJmYmQwLi5hZjJmNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYwpAQCAtMiw2ICsyLDcgQEAKICAqICBjeDE4IGludGVycnVwdCBoYW5kbGluZwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjEsMTMyICsyMiw5IEBACiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgogI2luY2x1ZGUgImN4MTgtaW8uaCIKLSNpbmNsdWRlICJjeDE4LWZpcm13YXJlLmgiCi0jaW5jbHVkZSAiY3gxOC1maWxlb3BzLmgiCi0jaW5jbHVkZSAiY3gxOC1xdWV1ZS5oIgogI2luY2x1ZGUgImN4MTgtaXJxLmgiCi0jaW5jbHVkZSAiY3gxOC1pb2N0bC5oIgogI2luY2x1ZGUgImN4MTgtbWFpbGJveC5oIgotI2luY2x1ZGUgImN4MTgtdmJpLmgiCiAjaW5jbHVkZSAiY3gxOC1zY2IuaCIKLSNpbmNsdWRlICJjeDE4LWR2Yi5oIgotCi12b2lkIGN4MThfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgY3gxOCAqY3ggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGN4MTgsIHdvcmspOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ1gxOF9GX0lfV09SS19JTklURUQsICZjeC0+aV9mbGFncykpIHsKLQkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07Ci0JCS8qIFRoaXMgdGhyZWFkIG11c3QgdXNlIHRoZSBGSUZPIHNjaGVkdWxlciBhcyBpdAotCQkgKiBpcyByZWFsdGltZSBzZW5zaXRpdmUuICovCi0JCXNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwotCX0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENYMThfRl9JX1dPUktfSEFORExFUl9EVkIsICZjeC0+aV9mbGFncykpCi0JCWN4MThfZHZiX3dvcmtfaGFuZGxlcihjeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVwdV9kbWFfZG9uZShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X21haWxib3ggKm1iKQotewotCXUzMiBoYW5kbGUgPSBtYi0+YXJnc1swXTsKLQlzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMgPSBOVUxMOwotCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmOwotCXUzMiBvZmY7Ci0JaW50IGk7Ci0JaW50IGlkOwotCi0JZm9yIChpID0gMDsgaSA8IENYMThfTUFYX1NUUkVBTVM7IGkrKykgewotCQlzID0gJmN4LT5zdHJlYW1zW2ldOwotCQlpZiAoKGhhbmRsZSA9PSBzLT5oYW5kbGUpICYmIChzLT5kdmIuZW5hYmxlZCkpCi0JCQlicmVhazsKLQkJaWYgKHMtPnY0bDJkZXYgJiYgaGFuZGxlID09IHMtPmhhbmRsZSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA9PSBDWDE4X01BWF9TVFJFQU1TKSB7Ci0JCUNYMThfV0FSTigiR290IERNQSBkb25lIG5vdGlmaWNhdGlvbiBmb3IgdW5rbm93bi9pbmFjdGl2ZSIKLQkJCSAgIiBoYW5kbGUgJWRcbiIsIGhhbmRsZSk7Ci0JCW1iLT5lcnJvciA9IENYRVJSX05PVF9PUEVOOwotCQltYi0+Y21kID0gMDsKLQkJY3gxOF9tYl9hY2soY3gsIG1iKTsKLQkJcmV0dXJuOwotCX0KLQotCW9mZiA9IG1iLT5hcmdzWzFdOwotCWlmIChtYi0+YXJnc1syXSAhPSAxKQotCQlDWDE4X1dBUk4oIkFjayBzdHJ1Y3QgPSAlZCBmb3IgJXNcbiIsCi0JCQltYi0+YXJnc1syXSwgcy0+bmFtZSk7Ci0JaWQgPSBjeDE4X3JlYWRfZW5jKGN4LCBvZmYpOwotCWJ1ZiA9IGN4MThfcXVldWVfZ2V0X2J1Zl9pcnEocywgaWQsIGN4MThfcmVhZF9lbmMoY3gsIG9mZiArIDQpKTsKLQlDWDE4X0RFQlVHX0hJX0RNQSgiRE1BIERPTkUgZm9yICVzIChidWZmZXIgJWQpXG4iLCBzLT5uYW1lLCBpZCk7Ci0JaWYgKGJ1ZikgewotCQljeDE4X2J1Zl9zeW5jX2Zvcl9jcHUocywgYnVmKTsKLQkJaWYgKHMtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMgJiYgcy0+ZHZiLmVuYWJsZWQpIHsKLQkJCUNYMThfREVCVUdfSElfRE1BKCJUUyByZWN2IGJ5dGVzdXNlZCA9ICVkXG4iLAotCQkJCQlidWYtPmJ5dGVzdXNlZCk7Ci0KLQkJCXNldF9iaXQoQ1gxOF9GX0lfV09SS19IQU5ETEVSX0RWQiwgJmN4LT5pX2ZsYWdzKTsKLQkJCXNldF9iaXQoQ1gxOF9GX0lfSEFWRV9XT1JLLCAmY3gtPmlfZmxhZ3MpOwotCQl9IGVsc2UKLQkJCXNldF9iaXQoQ1gxOF9GX0JfTkVFRF9CVUZfU1dBUCwgJmJ1Zi0+Yl9mbGFncyk7Ci0JfSBlbHNlIHsKLQkJQ1gxOF9XQVJOKCJDb3VsZCBub3QgZmluZCBidWYgJWQgZm9yIHN0cmVhbSAlc1xuIiwKLQkJCQljeDE4X3JlYWRfZW5jKGN4LCBvZmYpLCBzLT5uYW1lKTsKLQl9Ci0JbWItPmVycm9yID0gMDsKLQltYi0+Y21kID0gMDsKLQljeDE4X21iX2FjayhjeCwgbWIpOwotCXdha2VfdXAoJmN4LT5kbWFfd2FpdHEpOwotCWlmIChzLT5pZCAhPSAtMSkKLQkJd2FrZV91cCgmcy0+d2FpdHEpOwotfQotCi1zdGF0aWMgdm9pZCBlcHVfZGVidWcoc3RydWN0IGN4MTggKmN4LCBzdHJ1Y3QgY3gxOF9tYWlsYm94ICptYikKLXsKLQljaGFyIHN0clsyNTZdID0geyAwIH07Ci0JY2hhciAqcDsKLQotCWlmIChtYi0+YXJnc1sxXSkgewotCQljeDE4X3NldHVwX3BhZ2UoY3gsIG1iLT5hcmdzWzFdKTsKLQkJY3gxOF9tZW1jcHlfZnJvbWlvKGN4LCBzdHIsIGN4LT5lbmNfbWVtICsgbWItPmFyZ3NbMV0sIDI1Mik7Ci0JCXN0clsyNTJdID0gMDsKLQl9Ci0JY3gxOF9tYl9hY2soY3gsIG1iKTsKLQlDWDE4X0RFQlVHX0lORk8oIiV4ICVzXG4iLCBtYi0+YXJnc1swXSwgc3RyKTsKLQlwID0gc3RyY2hyKHN0ciwgJy4nKTsKLQlpZiAoIXRlc3RfYml0KENYMThfRl9JX0xPQURFRF9GVywgJmN4LT5pX2ZsYWdzKSAmJiBwICYmIHAgPiBzdHIpCi0JCUNYMThfSU5GTygiRlcgdmVyc2lvbjogJXNcbiIsIHAgLSAxKTsKLX0KLQotc3RhdGljIHZvaWQgZXB1X2NtZChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBzdzEpCi17Ci0Jc3RydWN0IGN4MThfbWFpbGJveCBtYjsKLQotCWlmIChzdzEgJiBJUlFfQ1BVX1RPX0VQVSkgewotCQljeDE4X21lbWNweV9mcm9taW8oY3gsICZtYiwgJmN4LT5zY2ItPmNwdTJlcHVfbWIsIHNpemVvZihtYikpOwotCQltYi5lcnJvciA9IDA7Ci0KLQkJc3dpdGNoIChtYi5jbWQpIHsKLQkJY2FzZSBDWDE4X0VQVV9ETUFfRE9ORToKLQkJCWVwdV9kbWFfZG9uZShjeCwgJm1iKTsKLQkJCWJyZWFrOwotCQljYXNlIENYMThfRVBVX0RFQlVHOgotCQkJZXB1X2RlYnVnKGN4LCAmbWIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlDWDE4X1dBUk4oIlVua25vd24gQ1BVX1RPX0VQVSBtYWlsYm94IGNvbW1hbmQgJSMwOHhcbiIsCi0JCQkJICBtYi5jbWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoc3cxICYgSVJRX0FQVV9UT19FUFUpIHsKLQkJY3gxOF9tZW1jcHlfZnJvbWlvKGN4LCAmbWIsICZjeC0+c2NiLT5hcHUyZXB1X21iLCBzaXplb2YobWIpKTsKLQkJQ1gxOF9XQVJOKCJVbmtub3duIEFQVV9UT19FUFUgbWFpbGJveCBjb21tYW5kICUjMDh4XG4iLCBtYi5jbWQpOwotCX0KLQotCWlmIChzdzEgJiBJUlFfSFBVX1RPX0VQVSkgewotCQljeDE4X21lbWNweV9mcm9taW8oY3gsICZtYiwgJmN4LT5zY2ItPmhwdTJlcHVfbWIsIHNpemVvZihtYikpOwotCQlDWDE4X1dBUk4oIlVua25vd24gSFBVX1RPX0VQVSBtYWlsYm94IGNvbW1hbmQgJSMwOHhcbiIsIG1iLmNtZCk7Ci0JfQotfQogCiBzdGF0aWMgdm9pZCB4cHVfYWNrKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHN3MikKIHsKQEAgLTE1NCwyMyArMzIsMjQgQEAKIAkJd2FrZV91cCgmY3gtPm1iX2NwdV93YWl0cSk7CiAJaWYgKHN3MiAmIElSUV9BUFVfVE9fRVBVX0FDSykKIAkJd2FrZV91cCgmY3gtPm1iX2FwdV93YWl0cSk7Ci0JaWYgKHN3MiAmIElSUV9IUFVfVE9fRVBVX0FDSykKLQkJd2FrZV91cCgmY3gtPm1iX2hwdV93YWl0cSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwdV9jbWQoc3RydWN0IGN4MTggKmN4LCB1MzIgc3cxKQoreworCWlmIChzdzEgJiBJUlFfQ1BVX1RPX0VQVSkKKwkJY3gxOF9hcGlfZXB1X2NtZF9pcnEoY3gsIENQVSk7CisJaWYgKHN3MSAmIElSUV9BUFVfVE9fRVBVKQorCQljeDE4X2FwaV9lcHVfY21kX2lycShjeCwgQVBVKTsKIH0KIAogaXJxcmV0dXJuX3QgY3gxOF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGN4MTggKmN4ID0gKHN0cnVjdCBjeDE4ICopZGV2X2lkOwotCXUzMiBzdzEsIHN3MV9tYXNrOwotCXUzMiBzdzIsIHN3Ml9tYXNrOwotCXUzMiBodzIsIGh3Ml9tYXNrOworCXUzMiBzdzEsIHN3MiwgaHcyOwogCi0Jc3cxX21hc2sgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzFfSU5UX0VOQUJMRV9QQ0kpOwotCXN3MSA9IGN4MThfcmVhZF9yZWcoY3gsIFNXMV9JTlRfU1RBVFVTKSAmIHN3MV9tYXNrOwotCXN3Ml9tYXNrID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cyX0lOVF9FTkFCTEVfUENJKTsKLQlzdzIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzJfSU5UX1NUQVRVUykgJiBzdzJfbWFzazsKLQlodzJfbWFzayA9IGN4MThfcmVhZF9yZWcoY3gsIEhXMl9JTlRfTUFTSzVfUENJKTsKLQlodzIgPSBjeDE4X3JlYWRfcmVnKGN4LCBIVzJfSU5UX0NMUl9TVEFUVVMpICYgaHcyX21hc2s7CisJc3cxID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cxX0lOVF9TVEFUVVMpICYgY3gtPnN3MV9pcnFfbWFzazsKKwlzdzIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzJfSU5UX1NUQVRVUykgJiBjeC0+c3cyX2lycV9tYXNrOworCWh3MiA9IGN4MThfcmVhZF9yZWcoY3gsIEhXMl9JTlRfQ0xSX1NUQVRVUykgJiBjeC0+aHcyX2lycV9tYXNrOwogCiAJaWYgKHN3MSkKIAkJY3gxOF93cml0ZV9yZWdfZXhwZWN0KGN4LCBzdzEsIFNXMV9JTlRfU1RBVFVTLCB+c3cxLCBzdzEpOwpAQCAtMTgwLDcgKzU5LDE1IEBACiAJCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgaHcyLCBIVzJfSU5UX0NMUl9TVEFUVVMsIH5odzIsIGh3Mik7CiAKIAlpZiAoc3cxIHx8IHN3MiB8fCBodzIpCi0JCUNYMThfREVCVUdfSElfSVJRKCJTVzE6ICV4ICBTVzI6ICV4ICBIVzI6ICV4XG4iLCBzdzEsIHN3MiwgaHcyKTsKKwkJQ1gxOF9ERUJVR19ISV9JUlEoInJlY2VpdmVkIGludGVycnVwdHMgIgorCQkJCSAgIlNXMTogJXggIFNXMjogJXggIEhXMjogJXhcbiIsIHN3MSwgc3cyLCBodzIpOworCisJLyoKKwkgKiBTVzEgcmVzcG9uc2VzIGhhdmUgdG8gaGFwcGVuIGZpcnN0LiAgVGhlIHNlbmRpbmcgWFBVIHRpbWVzIG91dCB0aGUKKwkgKiBpbmNvbWluZyBtYWlsYm94ZXMgb24gdXMgcmF0aGVyIHJhcGlkbHkuCisJICovCisJaWYgKHN3MSkKKwkJZXB1X2NtZChjeCwgc3cxKTsKIAogCS8qIFRvIGRvOiBpbnRlcnJ1cHQtYmFzZWQgSTJDIGhhbmRsaW5nCiAJaWYgKGh3MiAmIChIVzJfSTJDMV9JTlR8SFcyX0kyQzJfSU5UKSkgewpAQCAtMTkwLDExICs3Nyw1IEBACiAJaWYgKHN3MikKIAkJeHB1X2FjayhjeCwgc3cyKTsKIAotCWlmIChzdzEpCi0JCWVwdV9jbWQoY3gsIHN3MSk7Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENYMThfRl9JX0hBVkVfV09SSywgJmN4LT5pX2ZsYWdzKSkKLQkJcXVldWVfd29yayhjeC0+d29ya19xdWV1ZSwgJmN4LT53b3JrKTsKLQogCXJldHVybiAoc3cxIHx8IHN3MiB8fCBodzIpID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlycS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaXJxLmgKaW5kZXggNjE3M2NhMy4uOTFmMGI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaXJxLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaXJxLmgKQEAgLTIsNiArMiw3IEBACiAgKiAgY3gxOCBpbnRlcnJ1cHQgaGFuZGxpbmcKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI4LDggKzI5LDcgQEAKICNkZWZpbmUgU1cxX0lOVF9FTkFCTEVfUENJICAgICAgICAgICAgICAweGM3MzExYwogI2RlZmluZSBTVzJfSU5UX1NFVCAgICAgICAgICAgICAgICAgICAgIDB4YzczMTQwCiAjZGVmaW5lIFNXMl9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgMHhjNzMxNDQKKyNkZWZpbmUgU1cyX0lOVF9FTkFCTEVfQ1BVICAgICAgICAgICAgICAweGM3MzE1OAogI2RlZmluZSBTVzJfSU5UX0VOQUJMRV9QQ0kgICAgICAgICAgICAgIDB4YzczMTVjCiAKIGlycXJldHVybl90IGN4MThfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLQotdm9pZCBjeDE4X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jCmluZGV4IGFjZmY3ZGYuLmRlNWU3MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMKQEAgLTIsNiArMiw3IEBACiAgKiAgY3gxOCBtYWlsYm94IGZ1bmN0aW9ucwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjYsMTUgKzI3LDE0IEBACiAjaW5jbHVkZSAiY3gxOC1zY2IuaCIKICNpbmNsdWRlICJjeDE4LWlycS5oIgogI2luY2x1ZGUgImN4MTgtbWFpbGJveC5oIgorI2luY2x1ZGUgImN4MTgtcXVldWUuaCIKKyNpbmNsdWRlICJjeDE4LXN0cmVhbXMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKnJwdV9zdHJbXSA9IHsgIkFQVSIsICJDUFUiLCAiRVBVIiwgIkhQVSIgfTsKIAogI2RlZmluZSBBUElfRkFTVCAoMSA8PCAyKSAvKiBTaG9ydCB0aW1lb3V0ICovCiAjZGVmaW5lIEFQSV9TTE9XICgxIDw8IDMpIC8qIEFkZGl0aW9uYWwgMzAwbXMgdGltZW91dCAqLwogCi0jZGVmaW5lIEFQVSAwCi0jZGVmaW5lIENQVSAxCi0jZGVmaW5lIEVQVSAyCi0jZGVmaW5lIEhQVSAzCi0KIHN0cnVjdCBjeDE4X2FwaV9pbmZvIHsKIAl1MzIgY21kOwogCXU4IGZsYWdzOwkJLyogRmxhZ3MsIHNlZSBhYm92ZSAqLwpAQCAtODIsOCArODIsOSBAQAogCUFQSV9FTlRSWShDUFUsIENYMThfQ1BVX0dFVF9FTkNfUFRTLCAgICAgICAgICAgICAgICAgICAgMCksCiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfU0VUX01ETF9BQ0ssCQkJMCksCiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfU0VUX01ETCwJCQlBUElfRkFTVCksCi0JQVBJX0VOVFJZKENQVSwgQ1gxOF9BUFVfUkVTRVRBSSwJCQlBUElfRkFTVCksCiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwsCQkJQVBJX1NMT1cpLAorCUFQSV9FTlRSWShBUFUsIENYMThfQVBVX1JFU0VUQUksCQkJMCksCisJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVCVUdfUEVFSzMyLAkJCTApLAogCUFQSV9FTlRSWSgwLCAwLAkJCQkJCTApLAogfTsKIApAQCAtOTcsNzAgKzk4LDE3NSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGN4MThfbWFpbGJveCBfX2lvbWVtICpjeDE4X21iX2lzX2NvbXBsZXRlKHN0cnVjdCBjeDE4ICpjeCwgaW50IHJwdSwKLQkJdTMyICpzdGF0ZSwgdTMyICppcnEsIHUzMiAqcmVxKQorc3RhdGljIHZvaWQgZHVtcF9tYihzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X21haWxib3ggKm1iLCBjaGFyICpuYW1lKQogewotCXN0cnVjdCBjeDE4X21haWxib3ggX19pb21lbSAqbWIgPSBOVUxMOwotCWludCB3YWl0X2NvdW50ID0gMDsKLQl1MzIgYWNrOworCWNoYXIgYXJnc3RyW01BWF9NQl9BUkdVTUVOVFMqMTErMV07CisJY2hhciAqcDsKKwlpbnQgaTsKIAotCXN3aXRjaCAocnB1KSB7Ci0JY2FzZSBBUFU6Ci0JCW1iID0gJmN4LT5zY2ItPmVwdTJhcHVfbWI7Ci0JCSpzdGF0ZSA9IGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5hcHVfc3RhdGUpOwotCQkqaXJxID0gY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmVwdTJhcHVfaXJxKTsKLQkJYnJlYWs7CisJaWYgKCEoY3gxOF9kZWJ1ZyAmIENYMThfREJHRkxHX0FQSSkpCisJCXJldHVybjsKIAotCWNhc2UgQ1BVOgotCQltYiA9ICZjeC0+c2NiLT5lcHUyY3B1X21iOwotCQkqc3RhdGUgPSBjeDE4X3JlYWRsKGN4LCAmY3gtPnNjYi0+Y3B1X3N0YXRlKTsKLQkJKmlycSA9IGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5lcHUyY3B1X2lycSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBIUFU6Ci0JCW1iID0gJmN4LT5zY2ItPmVwdTJocHVfbWI7Ci0JCSpzdGF0ZSA9IGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5ocHVfc3RhdGUpOwotCQkqaXJxID0gY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmVwdTJocHVfaXJxKTsKLQkJYnJlYWs7CisJZm9yIChpID0gMCwgcCA9IGFyZ3N0cjsgaSA8IE1BWF9NQl9BUkdVTUVOVFM7IGkrKywgcCArPSAxMSkgeworCQkvKiBrZXJuZWwgc25wcmludGYoKSBhcHBlbmRzICdcMCcgYWx3YXlzICovCisJCXNucHJpbnRmKHAsIDEyLCAiICUjMDEweCIsIG1iLT5hcmdzW2ldKTsKIAl9Ci0KLQlpZiAobWIgPT0gTlVMTCkKLQkJcmV0dXJuIG1iOwotCi0JZG8gewotCQkqcmVxID0gY3gxOF9yZWFkbChjeCwgJm1iLT5yZXF1ZXN0KTsKLQkJYWNrID0gY3gxOF9yZWFkbChjeCwgJm1iLT5hY2spOwotCQl3YWl0X2NvdW50Kys7Ci0JfSB3aGlsZSAoKnJlcSAhPSBhY2sgJiYgd2FpdF9jb3VudCA8IDYwMCk7Ci0KLQlpZiAoKnJlcSA9PSBhY2spIHsKLQkJKCpyZXEpKys7Ci0JCWlmICgqcmVxID09IDAgfHwgKnJlcSA9PSAweGZmZmZmZmZmKQotCQkJKnJlcSA9IDE7Ci0JCXJldHVybiBtYjsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJQ1gxOF9ERUJVR19BUEkoIiVzOiByZXEgJSMwMTB4IGFjayAlIzAxMHggY21kICUjMDEweCBlcnIgJSMwMTB4IGFyZ3MlcyIKKwkJIlxuIiwgbmFtZSwgbWItPnJlcXVlc3QsIG1iLT5hY2ssIG1iLT5jbWQsIG1iLT5lcnJvciwgYXJnc3RyKTsKIH0KIAotbG9uZyBjeDE4X21iX2FjayhzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHN0cnVjdCBjeDE4X21haWxib3ggKm1iKQorCisvKgorICogRnVuY3Rpb25zIHRoYXQgcnVuIGluIGEgd29ya19xdWV1ZSB3b3JrIGhhbmRsaW5nIGNvbnRleHQKKyAqLworCitzdGF0aWMgdm9pZCBlcHVfZG1hX2RvbmUoc3RydWN0IGN4MTggKmN4LCBzdHJ1Y3QgY3gxOF9lcHVfd29ya19vcmRlciAqb3JkZXIpCiB7Ci0JY29uc3Qgc3RydWN0IGN4MThfYXBpX2luZm8gKmluZm8gPSBmaW5kX2FwaV9pbmZvKG1iLT5jbWQpOwotCXN0cnVjdCBjeDE4X21haWxib3ggX19pb21lbSAqYWNrX21iOwotCXUzMiBhY2tfaXJxOwotCXU4IHJwdSA9IENQVTsKKwl1MzIgaGFuZGxlLCBtZGxfYWNrX2NvdW50LCBpZDsKKwlzdHJ1Y3QgY3gxOF9tYWlsYm94ICptYjsKKwlzdHJ1Y3QgY3gxOF9tZGxfYWNrICptZGxfYWNrOworCXN0cnVjdCBjeDE4X3N0cmVhbSAqczsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKKwlpbnQgaTsKIAotCWlmIChpbmZvID09IE5VTEwgJiYgbWItPmNtZCkgewotCQlDWDE4X1dBUk4oIkNhbm5vdCBhY2sgdW5rbm93biBjb21tYW5kICV4XG4iLCBtYi0+Y21kKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJbWIgPSAmb3JkZXItPm1iOworCWhhbmRsZSA9IG1iLT5hcmdzWzBdOworCXMgPSBjeDE4X2hhbmRsZV90b19zdHJlYW0oY3gsIGhhbmRsZSk7CisKKwlpZiAocyA9PSBOVUxMKSB7CisJCUNYMThfV0FSTigiR290IERNQSBkb25lIG5vdGlmaWNhdGlvbiBmb3IgdW5rbm93bi9pbmFjdGl2ZSIKKwkJCSAgIiBoYW5kbGUgJWQsICVzIG1haWxib3ggc2VxIG5vICVkXG4iLCBoYW5kbGUsCisJCQkgIChvcmRlci0+ZmxhZ3MgJiBDWDE4X0ZfRVdPX01CX1NUQUxFX1VQT05fUkVDRUlQVCkgPworCQkJICAic3RhbGUiIDogImdvb2QiLCBtYi0+cmVxdWVzdCk7CisJCXJldHVybjsKIAl9Ci0JaWYgKGluZm8pCi0JCXJwdSA9IGluZm8tPnJwdTsKIAotCXN3aXRjaCAocnB1KSB7Ci0JY2FzZSBIUFU6Ci0JCWFja19pcnEgPSBJUlFfRVBVX1RPX0hQVV9BQ0s7Ci0JCWFja19tYiA9ICZjeC0+c2NiLT5ocHUyZXB1X21iOworCW1kbF9hY2tfY291bnQgPSBtYi0+YXJnc1syXTsKKwltZGxfYWNrID0gb3JkZXItPm1kbF9hY2s7CisJZm9yIChpID0gMDsgaSA8IG1kbF9hY2tfY291bnQ7IGkrKywgbWRsX2FjaysrKSB7CisJCWlkID0gbWRsX2Fjay0+aWQ7CisJCS8qCisJCSAqIFNpbXBsZSBpbnRlZ3JpdHkgY2hlY2sgZm9yIHByb2Nlc3NpbmcgYSBzdGFsZSAoYW5kIHBvc3NpYmx5CisJCSAqIGluY29uc2lzdGVudCBtYWlsYm94KTogbWFrZSBzdXJlIHRoZSBidWZmZXIgaWQgaXMgaW4gdGhlCisJCSAqIHZhbGlkIHJhbmdlIGZvciB0aGUgc3RyZWFtLgorCQkgKgorCQkgKiBXZSBnbyB0aHJvdWdoIHRoZSB0cm91YmxlIG9mIGRlYWxpbmcgd2l0aCBzdGFsZSBtYWlsYm94ZXMKKwkJICogYmVjYXVzZSBtb3N0IG9mIHRoZSB0aW1lLCB0aGUgbWFpbGJveCBkYXRhIGlzIHN0aWxsIHZhbGlkIGFuZAorCQkgKiB1bmNoYW5nZWQgKGFuZCBpbiBwcmFjdGljZSB0aGUgZmlybXdhcmUgcGluZy1wb25ncyB0aGUKKwkJICogdHdvIG1kbF9hY2sgYnVmZmVycyBzbyBtZGxfYWNrcyBhcmUgbm90IHN0YWxlKS4KKwkJICoKKwkJICogVGhlcmUgYXJlIG9jY2FzaW9ucyB3aGVuIHdlIGdldCBhIGhhbGYgY2hhbmdlZCBtYWlsYm94LAorCQkgKiB3aGljaCB0aGlzIGNoZWNrIGNhdGNoZXMgZm9yIGEgaGFuZGxlICYgaWQgbWlzbWF0Y2guICBJZiB0aGUKKwkJICogaGFuZGxlIGFuZCBpZCBkbyBjb3JyZXNwb25kLCB0aGUgd29yc3QgY2FzZSBpcyB0aGF0IHdlCisJCSAqIGNvbXBsZXRlbHkgbG9zdCB0aGUgb2xkIGJ1ZmZlciwgYnV0IHBpY2sgdXAgdGhlIG5ldyBidWZmZXIKKwkJICogZWFybHkgKGJ1dCB0aGUgbmV3IG1kbF9hY2sgaXMgZ3VhcmFudGVlZCB0byBiZSBnb29kIGluIHRoaXMKKwkJICogY2FzZSBhcyB0aGUgZmlybXdhcmUgd291bGRuJ3QgcG9pbnQgdXMgdG8gYSBuZXcgbWRsX2FjayB1bnRpbAorCQkgKiBpdCdzIGZpbGxlZCBpbikuCisJCSAqCisJCSAqIGN4MThfcXVldWVfZ2V0IGJ1ZigpIHdpbGwgZGV0ZWN0IHRoZSBsb3N0IGJ1ZmZlcnMKKwkJICogYW5kIHNlbmQgdGhlbSBiYWNrIHRvIHFfZnJlZSBmb3IgZncgcm90YXRpb24gZXZlbnR1YWxseS4KKwkJICovCisJCWlmICgob3JkZXItPmZsYWdzICYgQ1gxOF9GX0VXT19NQl9TVEFMRV9VUE9OX1JFQ0VJUFQpICYmCisJCSAgICAhKGlkID49IHMtPm1kbF9vZmZzZXQgJiYKKwkJICAgICAgaWQgPCAocy0+bWRsX29mZnNldCArIHMtPmJ1ZmZlcnMpKSkgeworCQkJQ1gxOF9XQVJOKCJGZWxsIGJlaGluZCEgSWdub3Jpbmcgc3RhbGUgbWFpbGJveCB3aXRoICIKKwkJCQkgICIgaW5jb25zaXN0ZW50IGRhdGEuIExvc3QgYnVmZmVyIGZvciBtYWlsYm94ICIKKwkJCQkgICJzZXEgbm8gJWRcbiIsIG1iLT5yZXF1ZXN0KTsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZiA9IGN4MThfcXVldWVfZ2V0X2J1ZihzLCBpZCwgbWRsX2Fjay0+ZGF0YV91c2VkKTsKKworCQlDWDE4X0RFQlVHX0hJX0RNQSgiRE1BIERPTkUgZm9yICVzIChidWZmZXIgJWQpXG4iLCBzLT5uYW1lLCBpZCk7CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJQ1gxOF9XQVJOKCJDb3VsZCBub3QgZmluZCBidWYgJWQgZm9yIHN0cmVhbSAlc1xuIiwKKwkJCQkgIGlkLCBzLT5uYW1lKTsKKwkJCS8qIFB1dCBhcyBtYW55IGJ1ZmZlcnMgYXMgcG9zc2libGUgYmFjayBpbnRvIGZ3IHVzZSAqLworCQkJY3gxOF9zdHJlYW1fbG9hZF9md19xdWV1ZShzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHMtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMgJiYgcy0+ZHZiLmVuYWJsZWQpIHsKKwkJCUNYMThfREVCVUdfSElfRE1BKCJUUyByZWN2IGJ5dGVzdXNlZCA9ICVkXG4iLAorCQkJCQkgIGJ1Zi0+Ynl0ZXN1c2VkKTsKKwkJCWR2Yl9kbXhfc3dmaWx0ZXIoJnMtPmR2Yi5kZW11eCwgYnVmLT5idWYsCisJCQkJCSBidWYtPmJ5dGVzdXNlZCk7CisJCX0KKwkJLyogUHV0IGFzIG1hbnkgYnVmZmVycyBhcyBwb3NzaWJsZSBiYWNrIGludG8gZncgdXNlICovCisJCWN4MThfc3RyZWFtX2xvYWRfZndfcXVldWUocyk7CisJCS8qIFB1dCBiYWNrIFRTIGJ1ZmZlciwgc2luY2UgaXQgd2FzIHJlbW92ZWQgZnJvbSBhbGwgcXVldWVzICovCisJCWlmIChzLT50eXBlID09IENYMThfRU5DX1NUUkVBTV9UWVBFX1RTKQorCQkJY3gxOF9zdHJlYW1fcHV0X2J1Zl9mdyhzLCBidWYpOworCX0KKwl3YWtlX3VwKCZjeC0+ZG1hX3dhaXRxKTsKKwlpZiAocy0+aWQgIT0gLTEpCisJCXdha2VfdXAoJnMtPndhaXRxKTsKK30KKworc3RhdGljIHZvaWQgZXB1X2RlYnVnKHN0cnVjdCBjeDE4ICpjeCwgc3RydWN0IGN4MThfZXB1X3dvcmtfb3JkZXIgKm9yZGVyKQoreworCWNoYXIgKnA7CisJY2hhciAqc3RyID0gb3JkZXItPnN0cjsKKworCUNYMThfREVCVUdfSU5GTygiJXggJXNcbiIsIG9yZGVyLT5tYi5hcmdzWzBdLCBzdHIpOworCXAgPSBzdHJjaHIoc3RyLCAnLicpOworCWlmICghdGVzdF9iaXQoQ1gxOF9GX0lfTE9BREVEX0ZXLCAmY3gtPmlfZmxhZ3MpICYmIHAgJiYgcCA+IHN0cikKKwkJQ1gxOF9JTkZPKCJGVyB2ZXJzaW9uOiAlc1xuIiwgcCAtIDEpOworfQorCitzdGF0aWMgdm9pZCBlcHVfY21kKHN0cnVjdCBjeDE4ICpjeCwgc3RydWN0IGN4MThfZXB1X3dvcmtfb3JkZXIgKm9yZGVyKQoreworCXN3aXRjaCAob3JkZXItPnJwdSkgeworCWNhc2UgQ1BVOgorCXsKKwkJc3dpdGNoIChvcmRlci0+bWIuY21kKSB7CisJCWNhc2UgQ1gxOF9FUFVfRE1BX0RPTkU6CisJCQllcHVfZG1hX2RvbmUoY3gsIG9yZGVyKTsKKwkJCWJyZWFrOworCQljYXNlIENYMThfRVBVX0RFQlVHOgorCQkJZXB1X2RlYnVnKGN4LCBvcmRlcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUNYMThfV0FSTigiVW5rbm93biBDUFUgdG8gRVBVIG1haWxib3ggY29tbWFuZCAlIzB4XG4iLAorCQkJCSAgb3JkZXItPm1iLmNtZCk7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKKwl9CisJY2FzZSBBUFU6CisJCUNYMThfV0FSTigiVW5rbm93biBBUFUgdG8gRVBVIG1haWxib3ggY29tbWFuZCAlIzB4XG4iLAorCQkJICBvcmRlci0+bWIuY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMKK3ZvaWQgZnJlZV9lcHVfd29ya19vcmRlcihzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICpvcmRlcikKK3sKKwlhdG9taWNfc2V0KCZvcmRlci0+cGVuZGluZywgMCk7Cit9CisKK3ZvaWQgY3gxOF9lcHVfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY3gxOF9lcHVfd29ya19vcmRlciAqb3JkZXIgPQorCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyLCB3b3JrKTsKKwlzdHJ1Y3QgY3gxOCAqY3ggPSBvcmRlci0+Y3g7CisJZXB1X2NtZChjeCwgb3JkZXIpOworCWZyZWVfZXB1X3dvcmtfb3JkZXIoY3gsIG9yZGVyKTsKK30KKworCisvKgorICogRnVuY3Rpb25zIHRoYXQgcnVuIGluIGFuIGludGVycnVwdCBoYW5kbGluZyBjb250ZXh0CisgKi8KKworc3RhdGljIHZvaWQgbWJfYWNrX2lycShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICpvcmRlcikKK3sKKwlzdHJ1Y3QgY3gxOF9tYWlsYm94IF9faW9tZW0gKmFja19tYjsKKwl1MzIgYWNrX2lycSwgcmVxOworCisJc3dpdGNoIChvcmRlci0+cnB1KSB7CiAJY2FzZSBBUFU6CiAJCWFja19pcnEgPSBJUlFfRVBVX1RPX0FQVV9BQ0s7CiAJCWFja19tYiA9ICZjeC0+c2NiLT5hcHUyZXB1X21iOwpAQCAtMTcwLDI2ICsyNzYsMTk3IEBACiAJCWFja19tYiA9ICZjeC0+c2NiLT5jcHUyZXB1X21iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlDWDE4X1dBUk4oIlVua25vd24gUlBVIGZvciBjb21tYW5kICV4XG4iLCBtYi0+Y21kKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCUNYMThfV0FSTigiVW5oYW5kbGVkIFJQVSAoJWQpIGZvciBjb21tYW5kICV4IGFja1xuIiwKKwkJCSAgb3JkZXItPnJwdSwgb3JkZXItPm1iLmNtZCk7CisJCXJldHVybjsKIAl9CiAKLQljeDE4X3NldHVwX3BhZ2UoY3gsIFNDQl9PRkZTRVQpOwotCWN4MThfd3JpdGVfc3luYyhjeCwgbWItPnJlcXVlc3QsICZhY2tfbWItPmFjayk7CisJcmVxID0gb3JkZXItPm1iLnJlcXVlc3Q7CisJLyogRG9uJ3QgYWNrIGlmIHRoZSBSUFUgaGFzIGdvdHRlbiBpbXBhdGllbnQgYW5kIHRpbWVkIHVzIG91dCAqLworCWlmIChyZXEgIT0gY3gxOF9yZWFkbChjeCwgJmFja19tYi0+cmVxdWVzdCkgfHwKKwkgICAgcmVxID09IGN4MThfcmVhZGwoY3gsICZhY2tfbWItPmFjaykpIHsKKwkJQ1gxOF9ERUJVR19XQVJOKCJQb3NzaWJseSBmYWxsaW5nIGJlaGluZDogJXMgc2VsZi1hY2snZWQgb3VyICIKKwkJCQkiaW5jb21pbmcgJXMgdG8gRVBVIG1haWxib3ggKHNlcXVlbmNlIG5vLiAldSkgIgorCQkJCSJ3aGlsZSBwcm9jZXNzaW5nXG4iLAorCQkJCXJwdV9zdHJbb3JkZXItPnJwdV0sIHJwdV9zdHJbb3JkZXItPnJwdV0sIHJlcSk7CisJCW9yZGVyLT5mbGFncyB8PSBDWDE4X0ZfRVdPX01CX1NUQUxFX1dISUxFX1BST0M7CisJCXJldHVybjsKKwl9CisJY3gxOF93cml0ZWwoY3gsIHJlcSwgJmFja19tYi0+YWNrKTsKIAljeDE4X3dyaXRlX3JlZ19leHBlY3QoY3gsIGFja19pcnEsIFNXMl9JTlRfU0VULCBhY2tfaXJxLCBhY2tfaXJxKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAKK3N0YXRpYyBpbnQgZXB1X2RtYV9kb25lX2lycShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICpvcmRlcikKK3sKKwl1MzIgaGFuZGxlLCBtZGxfYWNrX29mZnNldCwgbWRsX2Fja19jb3VudDsKKwlzdHJ1Y3QgY3gxOF9tYWlsYm94ICptYjsKKworCW1iID0gJm9yZGVyLT5tYjsKKwloYW5kbGUgPSBtYi0+YXJnc1swXTsKKwltZGxfYWNrX29mZnNldCA9IG1iLT5hcmdzWzFdOworCW1kbF9hY2tfY291bnQgPSBtYi0+YXJnc1syXTsKKworCWlmIChoYW5kbGUgPT0gQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFIHx8CisJICAgIG1kbF9hY2tfY291bnQgPT0gMCB8fCBtZGxfYWNrX2NvdW50ID4gQ1gxOF9NQVhfTURMX0FDS1MpIHsKKwkJaWYgKChvcmRlci0+ZmxhZ3MgJiBDWDE4X0ZfRVdPX01CX1NUQUxFKSA9PSAwKQorCQkJbWJfYWNrX2lycShjeCwgb3JkZXIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3gxOF9tZW1jcHlfZnJvbWlvKGN4LCBvcmRlci0+bWRsX2FjaywgY3gtPmVuY19tZW0gKyBtZGxfYWNrX29mZnNldCwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgY3gxOF9tZGxfYWNrKSAqIG1kbF9hY2tfY291bnQpOworCisJaWYgKChvcmRlci0+ZmxhZ3MgJiBDWDE4X0ZfRVdPX01CX1NUQUxFKSA9PSAwKQorCQltYl9hY2tfaXJxKGN4LCBvcmRlcik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYworaW50IGVwdV9kZWJ1Z19pcnEoc3RydWN0IGN4MTggKmN4LCBzdHJ1Y3QgY3gxOF9lcHVfd29ya19vcmRlciAqb3JkZXIpCit7CisJdTMyIHN0cl9vZmZzZXQ7CisJY2hhciAqc3RyID0gb3JkZXItPnN0cjsKKworCXN0clswXSA9ICdcMCc7CisJc3RyX29mZnNldCA9IG9yZGVyLT5tYi5hcmdzWzFdOworCWlmIChzdHJfb2Zmc2V0KSB7CisJCWN4MThfc2V0dXBfcGFnZShjeCwgc3RyX29mZnNldCk7CisJCWN4MThfbWVtY3B5X2Zyb21pbyhjeCwgc3RyLCBjeC0+ZW5jX21lbSArIHN0cl9vZmZzZXQsIDI1Mik7CisJCXN0clsyNTJdID0gJ1wwJzsKKwkJY3gxOF9zZXR1cF9wYWdlKGN4LCBTQ0JfT0ZGU0VUKTsKKwl9CisKKwlpZiAoKG9yZGVyLT5mbGFncyAmIENYMThfRl9FV09fTUJfU1RBTEUpID09IDApCisJCW1iX2Fja19pcnEoY3gsIG9yZGVyKTsKKworCXJldHVybiBzdHJfb2Zmc2V0ID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBlcHVfY21kX2lycShzdHJ1Y3QgY3gxOCAqY3gsIHN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICpvcmRlcikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlzd2l0Y2ggKG9yZGVyLT5ycHUpIHsKKwljYXNlIENQVToKKwl7CisJCXN3aXRjaCAob3JkZXItPm1iLmNtZCkgeworCQljYXNlIENYMThfRVBVX0RNQV9ET05FOgorCQkJcmV0ID0gZXB1X2RtYV9kb25lX2lycShjeCwgb3JkZXIpOworCQkJYnJlYWs7CisJCWNhc2UgQ1gxOF9FUFVfREVCVUc6CisJCQlyZXQgPSBlcHVfZGVidWdfaXJxKGN4LCBvcmRlcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUNYMThfV0FSTigiVW5rbm93biBDUFUgdG8gRVBVIG1haWxib3ggY29tbWFuZCAlIzB4XG4iLAorCQkJCSAgb3JkZXItPm1iLmNtZCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBUFU6CisJCUNYMThfV0FSTigiVW5rbm93biBBUFUgdG8gRVBVIG1haWxib3ggY29tbWFuZCAlIzB4XG4iLAorCQkJICBvcmRlci0+bWIuY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICphbGxvY19lcHVfd29ya19vcmRlcl9pcnEoc3RydWN0IGN4MTggKmN4KQoreworCWludCBpOworCXN0cnVjdCBjeDE4X2VwdV93b3JrX29yZGVyICpvcmRlciA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfRVBVX1dPUktfT1JERVJTOyBpKyspIHsKKwkJLyoKKwkJICogV2Ugb25seSBuZWVkICJwZW5kaW5nIiBhdG9taWMgdG8gaW5zcGVjdCBpdHMgY29udGVudHMsCisJCSAqIGFuZCBuZWVkIG5vdCBkbyBhIGNoZWNrIGFuZCBzZXQgYmVjYXVzZToKKwkJICogMS4gQW55IHdvcmsgaGFuZGxlciB0aHJlYWQgb25seSBjbGVhcnMgInBlbmRpbmciIGFuZCBvbmx5CisJCSAqIG9uIG9uZSwgcGFydGljdWxhciB3b3JrIG9yZGVyIGF0IGEgdGltZSwgcGVyIGhhbmRsZXIgdGhyZWFkLgorCQkgKiAyLiAicGVuZGluZyIgaXMgb25seSBzZXQgaGVyZSwgYW5kIHdlJ3JlIHNlcmlhbGl6ZWQgYmVjYXVzZQorCQkgKiB3ZSdyZSBjYWxsZWQgaW4gYW4gSVJRIGhhbmRsZXIgY29udGV4dC4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmY3gtPmVwdV93b3JrX29yZGVyW2ldLnBlbmRpbmcpID09IDApIHsKKwkJCW9yZGVyID0gJmN4LT5lcHVfd29ya19vcmRlcltpXTsKKwkJCWF0b21pY19zZXQoJm9yZGVyLT5wZW5kaW5nLCAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBvcmRlcjsKK30KKwordm9pZCBjeDE4X2FwaV9lcHVfY21kX2lycShzdHJ1Y3QgY3gxOCAqY3gsIGludCBycHUpCit7CisJc3RydWN0IGN4MThfbWFpbGJveCBfX2lvbWVtICptYjsKKwlzdHJ1Y3QgY3gxOF9tYWlsYm94ICpvcmRlcl9tYjsKKwlzdHJ1Y3QgY3gxOF9lcHVfd29ya19vcmRlciAqb3JkZXI7CisJaW50IHN1Ym1pdDsKKworCXN3aXRjaCAocnB1KSB7CisJY2FzZSBDUFU6CisJCW1iID0gJmN4LT5zY2ItPmNwdTJlcHVfbWI7CisJCWJyZWFrOworCWNhc2UgQVBVOgorCQltYiA9ICZjeC0+c2NiLT5hcHUyZXB1X21iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJb3JkZXIgPSBhbGxvY19lcHVfd29ya19vcmRlcl9pcnEoY3gpOworCWlmIChvcmRlciA9PSBOVUxMKSB7CisJCUNYMThfV0FSTigiVW5hYmxlIHRvIGZpbmQgYmxhbmsgd29yayBvcmRlciBmb3JtIHRvIHNjaGVkdWxlICIKKwkJCSAgImluY29taW5nIG1haWxib3ggY29tbWFuZCBwcm9jZXNzaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW9yZGVyLT5mbGFncyA9IDA7CisJb3JkZXItPnJwdSA9IHJwdTsKKwlvcmRlcl9tYiA9ICZvcmRlci0+bWI7CisKKwkvKiBtYi0+Y21kIGFuZCBtYi0+YXJnc1swXSB0aHJvdWdoIG1iLT5hcmdzWzJdICovCisJY3gxOF9tZW1jcHlfZnJvbWlvKGN4LCAmb3JkZXJfbWItPmNtZCwgJm1iLT5jbWQsIDQgKiBzaXplb2YodTMyKSk7CisJLyogbWItPnJlcXVlc3QgYW5kIG1iLT5hY2suICBOLkIuIHdlIHdhbnQgdG8gcmVhZCBtYi0+YWNrIGxhc3QgKi8KKwljeDE4X21lbWNweV9mcm9taW8oY3gsICZvcmRlcl9tYi0+cmVxdWVzdCwgJm1iLT5yZXF1ZXN0LAorCQkJICAgMiAqIHNpemVvZih1MzIpKTsKKworCWlmIChvcmRlcl9tYi0+cmVxdWVzdCA9PSBvcmRlcl9tYi0+YWNrKSB7CisJCUNYMThfREVCVUdfV0FSTigiUG9zc2libHkgZmFsbGluZyBiZWhpbmQ6ICVzIHNlbGYtYWNrJ2VkIG91ciAiCisJCQkJImluY29taW5nICVzIHRvIEVQVSBtYWlsYm94IChzZXF1ZW5jZSBuby4gJXUpIgorCQkJCSJcbiIsCisJCQkJcnB1X3N0cltycHVdLCBycHVfc3RyW3JwdV0sIG9yZGVyX21iLT5yZXF1ZXN0KTsKKwkJZHVtcF9tYihjeCwgb3JkZXJfbWIsICJpbmNvbWluZyIpOworCQlvcmRlci0+ZmxhZ3MgPSBDWDE4X0ZfRVdPX01CX1NUQUxFX1VQT05fUkVDRUlQVDsKKwl9CisKKwkvKgorCSAqIEluZGl2aWR1YWwgRVBVIGNvbW1hbmQgcHJvY2Vzc2luZyBpcyByZXNwb25zaWJsZSBmb3IgYWNrLWluZworCSAqIGEgbm9uLXN0YWxlIG1haWxib3ggYXMgc29vbiBhcyBwb3NzaWJsZQorCSAqLworCXN1Ym1pdCA9IGVwdV9jbWRfaXJxKGN4LCBvcmRlcik7CisJaWYgKHN1Ym1pdCA+IDApIHsKKwkJcXVldWVfd29yayhjeC0+d29ya19xdWV1ZSwgJm9yZGVyLT53b3JrKTsKKwl9Cit9CisKKworLyoKKyAqIEZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBhIG5vbi1pbnRlcnJ1cHQsIG5vbiB3b3JrX3F1ZXVlIGNvbnRleHQKKyAqLwogCiBzdGF0aWMgaW50IGN4MThfYXBpX2NhbGwoc3RydWN0IGN4MTggKmN4LCB1MzIgY21kLCBpbnQgYXJncywgdTMyIGRhdGFbXSkKIHsKIAljb25zdCBzdHJ1Y3QgY3gxOF9hcGlfaW5mbyAqaW5mbyA9IGZpbmRfYXBpX2luZm8oY21kKTsKLQl1MzIgc3RhdGUgPSAwLCBpcnEgPSAwLCByZXEsIG9sZHJlcSwgZXJyOworCXUzMiBzdGF0ZSwgaXJxLCByZXEsIGFjaywgZXJyOwogCXN0cnVjdCBjeDE4X21haWxib3ggX19pb21lbSAqbWI7CisJdTMyIF9faW9tZW0gKnhwdV9zdGF0ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdHE7Ci0JaW50IHRpbWVvdXQgPSAxMDA7Ci0JaW50IGNudCA9IDA7Ci0JaW50IHNpZyA9IDA7CisJc3RydWN0IG11dGV4ICptYl9sb2NrOworCWxvbmcgaW50IHRpbWVvdXQsIHJldDsKIAlpbnQgaTsKIAogCWlmIChpbmZvID09IE5VTEwpIHsKQEAgLTIwMSw1MCArNDc4LDEwNCBAQAogCQlDWDE4X0RFQlVHX0hJX0FQSSgiJXNcbiIsIGluZm8tPm5hbWUpOwogCWVsc2UKIAkJQ1gxOF9ERUJVR19BUEkoIiVzXG4iLCBpbmZvLT5uYW1lKTsKLQljeDE4X3NldHVwX3BhZ2UoY3gsIFNDQl9PRkZTRVQpOwotCW1iID0gY3gxOF9tYl9pc19jb21wbGV0ZShjeCwgaW5mby0+cnB1LCAmc3RhdGUsICZpcnEsICZyZXEpOwogCi0JaWYgKG1iID09IE5VTEwpIHsKLQkJQ1gxOF9FUlIoIm1iICVzIGJ1c3lcbiIsIGluZm8tPm5hbWUpOwotCQlyZXR1cm4gLUVCVVNZOworCXN3aXRjaCAoaW5mby0+cnB1KSB7CisJY2FzZSBBUFU6CisJCXdhaXRxID0gJmN4LT5tYl9hcHVfd2FpdHE7CisJCW1iX2xvY2sgPSAmY3gtPmVwdTJhcHVfbWJfbG9jazsKKwkJaXJxID0gSVJRX0VQVV9UT19BUFU7CisJCW1iID0gJmN4LT5zY2ItPmVwdTJhcHVfbWI7CisJCXhwdV9zdGF0ZSA9ICZjeC0+c2NiLT5hcHVfc3RhdGU7CisJCWJyZWFrOworCWNhc2UgQ1BVOgorCQl3YWl0cSA9ICZjeC0+bWJfY3B1X3dhaXRxOworCQltYl9sb2NrID0gJmN4LT5lcHUyY3B1X21iX2xvY2s7CisJCWlycSA9IElSUV9FUFVfVE9fQ1BVOworCQltYiA9ICZjeC0+c2NiLT5lcHUyY3B1X21iOworCQl4cHVfc3RhdGUgPSAmY3gtPnNjYi0+Y3B1X3N0YXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlDWDE4X1dBUk4oIlVua25vd24gUlBVICglZCkgZm9yIEFQSSBjYWxsXG4iLCBpbmZvLT5ycHUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlvbGRyZXEgPSByZXEgLSAxOworCW11dGV4X2xvY2sobWJfbG9jayk7CisJLyoKKwkgKiBXYWl0IGZvciBhbiBpbi11c2UgbWFpbGJveCB0byBjb21wbGV0ZQorCSAqCisJICogSWYgdGhlIFhQVSBpcyByZXNwb25kaW5nIHdpdGggQWNrJ3MsIHRoZSBtYWlsYm94IHNob3VsZG4ndCBiZSBpbgorCSAqIGEgYnVzeSBzdGF0ZSwgc2luY2Ugd2Ugc2VyaWFsaXplIGFjY2VzcyB0byBpdCBvbiBvdXIgZW5kLgorCSAqCisJICogSWYgdGhlIHdhaXQgZm9yIGFjayBhZnRlciBzZW5kaW5nIGEgcHJldmlvdXMgY29tbWFuZCB3YXMgaW50ZXJydXB0ZWQKKwkgKiBieSBhIHNpZ25hbCwgd2UgbWF5IGdldCBoZXJlIGFuZCBmaW5kIGEgYnVzeSBtYWlsYm94LiAgQWZ0ZXIgd2FpdGluZywKKwkgKiBtYXJrIGl0ICJub3QgYnVzeSIgZnJvbSBvdXIgZW5kLCBpZiB0aGUgWFBVIGhhc24ndCBhY2snZWQgaXQgc3RpbGwuCisJICovCisJc3RhdGUgPSBjeDE4X3JlYWRsKGN4LCB4cHVfc3RhdGUpOworCXJlcSA9IGN4MThfcmVhZGwoY3gsICZtYi0+cmVxdWVzdCk7CisJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMTApOworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCgqd2FpdHEsCisJCQkJIChhY2sgPSBjeDE4X3JlYWRsKGN4LCAmbWItPmFjaykpID09IHJlcSwKKwkJCQkgdGltZW91dCk7CisJaWYgKHJlcSAhPSBhY2spIHsKKwkJLyogd2FpdGVkIGxvbmcgZW5vdWdoLCBtYWtlIHRoZSBtYm94ICJub3QgYnVzeSIgZnJvbSBvdXIgZW5kICovCisJCWN4MThfd3JpdGVsKGN4LCByZXEsICZtYi0+YWNrKTsKKwkJQ1gxOF9FUlIoIm1ib3ggd2FzIGZvdW5kIHN0dWNrIGJ1c3kgd2hlbiBzZXR0aW5nIHVwIGZvciAlczsgIgorCQkJICJjbGVhcmluZyBidXN5IGFuZCB0cnlpbmcgdG8gcHJvY2VlZFxuIiwgaW5mby0+bmFtZSk7CisJfSBlbHNlIGlmIChyZXQgIT0gdGltZW91dCkKKwkJQ1gxOF9ERUJVR19BUEkoIndhaXRlZCAldSBtc2VjcyBmb3IgYnVzeSBtYm94IHRvIGJlIGFja2VkXG4iLAorCQkJICAgICAgIGppZmZpZXNfdG9fbXNlY3ModGltZW91dC1yZXQpKTsKKworCS8qIEJ1aWxkIHRoZSBvdXRnb2luZyBtYWlsYm94ICovCisJcmVxID0gKChyZXEgJiAweGZmZmZmZmZlKSA9PSAweGZmZmZmZmZlKSA/IDEgOiByZXEgKyAxOworCiAJY3gxOF93cml0ZWwoY3gsIGNtZCwgJm1iLT5jbWQpOwogCWZvciAoaSA9IDA7IGkgPCBhcmdzOyBpKyspCiAJCWN4MThfd3JpdGVsKGN4LCBkYXRhW2ldLCAmbWItPmFyZ3NbaV0pOwogCWN4MThfd3JpdGVsKGN4LCAwLCAmbWItPmVycm9yKTsKIAljeDE4X3dyaXRlbChjeCwgcmVxLCAmbWItPnJlcXVlc3QpOworCWN4MThfd3JpdGVsKGN4LCByZXEgLSAxLCAmbWItPmFjayk7IC8qIGVuc3VyZSBhY2sgJiByZXEgYXJlIGRpc3RpbmN0ICovCiAKLQlzd2l0Y2ggKGluZm8tPnJwdSkgewotCWNhc2UgQVBVOiB3YWl0cSA9ICZjeC0+bWJfYXB1X3dhaXRxOyBicmVhazsKLQljYXNlIENQVTogd2FpdHEgPSAmY3gtPm1iX2NwdV93YWl0cTsgYnJlYWs7Ci0JY2FzZSBFUFU6IHdhaXRxID0gJmN4LT5tYl9lcHVfd2FpdHE7IGJyZWFrOwotCWNhc2UgSFBVOiB3YWl0cSA9ICZjeC0+bWJfaHB1X3dhaXRxOyBicmVhazsKLQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGluZm8tPmZsYWdzICYgQVBJX0ZBU1QpCi0JCXRpbWVvdXQgLz0gMjsKKwkvKgorCSAqIE5vdGlmeSB0aGUgWFBVIGFuZCB3YWl0IGZvciBpdCB0byBzZW5kIGFuIEFjayBiYWNrCisJICovCisJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoKGluZm8tPmZsYWdzICYgQVBJX0ZBU1QpID8gMTAgOiAyMCk7CisKKwlDWDE4X0RFQlVHX0hJX0lSUSgic2VuZGluZyBpbnRlcnJ1cHQgU1cxOiAleCB0byBzZW5kICVzXG4iLAorCQkJICBpcnEsIGluZm8tPm5hbWUpOwogCWN4MThfd3JpdGVfcmVnX2V4cGVjdChjeCwgaXJxLCBTVzFfSU5UX1NFVCwgaXJxLCBpcnEpOwogCi0Jd2hpbGUgKCFzaWcgJiYgY3gxOF9yZWFkbChjeCwgJm1iLT5hY2spICE9IGN4MThfcmVhZGwoY3gsICZtYi0+cmVxdWVzdCkKLQkgICAgICAgJiYgY250IDwgNjYwKSB7Ci0JCWlmIChjbnQgPiAyMDAgJiYgIWluX2F0b21pYygpKQotCQkJc2lnID0gY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMSk7Ci0JCWNudCsrOwotCX0KLQlpZiAoc2lnKQotCQlyZXR1cm4gLUVJTlRSOwotCWlmIChjbnQgPT0gNjYwKSB7Ci0JCWN4MThfd3JpdGVsKGN4LCBvbGRyZXEsICZtYi0+cmVxdWVzdCk7Ci0JCUNYMThfRVJSKCJtYiAlcyBmYWlsZWRcbiIsIGluZm8tPm5hbWUpOworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCgKKwkJICAgICAgICp3YWl0cSwKKwkJICAgICAgIGN4MThfcmVhZGwoY3gsICZtYi0+YWNrKSA9PSBjeDE4X3JlYWRsKGN4LCAmbWItPnJlcXVlc3QpLAorCQkgICAgICAgdGltZW91dCk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyogVGltZWQgb3V0ICovCisJCW11dGV4X3VubG9jayhtYl9sb2NrKTsKKwkJQ1gxOF9ERUJVR19XQVJOKCJzZW5kaW5nICVzIHRpbWVkIG91dCB3YWl0aW5nICVkIG1zZWNzIGZvciBSUFUgIgorCQkJCSJhY2tub3dsZWRnZW1lbnRcbiIsCisJCQkJaW5mby0+bmFtZSwgamlmZmllc190b19tc2Vjcyh0aW1lb3V0KSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCWlmIChyZXQgIT0gdGltZW91dCkKKwkJQ1gxOF9ERUJVR19ISV9BUEkoIndhaXRlZCAldSBtc2VjcyBmb3IgJXMgdG8gYmUgYWNrZWRcbiIsCisJCQkJICBqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQtcmV0KSwgaW5mby0+bmFtZSk7CisKKwkvKiBDb2xsZWN0IGRhdGEgcmV0dXJuZWQgYnkgdGhlIFhQVSAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTUJfQVJHVU1FTlRTOyBpKyspCiAJCWRhdGFbaV0gPSBjeDE4X3JlYWRsKGN4LCAmbWItPmFyZ3NbaV0pOwogCWVyciA9IGN4MThfcmVhZGwoY3gsICZtYi0+ZXJyb3IpOwotCWlmICghaW5fYXRvbWljKCkgJiYgKGluZm8tPmZsYWdzICYgQVBJX1NMT1cpKQorCW11dGV4X3VubG9jayhtYl9sb2NrKTsKKworCS8qCisJICogV2FpdCBmb3IgWFBVIHRvIHBlcmZvcm0gZXh0cmEgYWN0aW9ucyBmb3IgdGhlIGNhbGxlciBpbiBzb21lIGNhc2VzLgorCSAqIGUuZy4gQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwgd2lsbCBjYXVzZSB0aGUgQ1BVIHRvIHNlbmQgYWxsIGJ1ZmZlcnMKKwkgKiBiYWNrIGluIGEgYnVyc3Qgc2hvcnRseSB0aGVyZWFmdGVyCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgQVBJX1NMT1cpCiAJCWN4MThfbXNsZWVwX3RpbWVvdXQoMzAwLCAwKTsKKwogCWlmIChlcnIpCiAJCUNYMThfREVCVUdfQVBJKCJtYWlsYm94IGVycm9yICUwOHggZm9yIGNvbW1hbmQgJXNcbiIsIGVyciwKIAkJCQlpbmZvLT5uYW1lKTsKQEAgLTI1MywxMiArNTg0LDcgQEAKIAogaW50IGN4MThfYXBpKHN0cnVjdCBjeDE4ICpjeCwgdTMyIGNtZCwgaW50IGFyZ3MsIHUzMiBkYXRhW10pCiB7Ci0JaW50IHJlcyA9IGN4MThfYXBpX2NhbGwoY3gsIGNtZCwgYXJncywgZGF0YSk7Ci0KLQkvKiBBbGxvdyBhIHNpbmdsZSByZXRyeSwgcHJvYmFibHkgYWxyZWFkeSB0b28gbGF0ZSB0aG91Z2guCi0JICAgSWYgdGhlcmUgaXMgbm8gZnJlZSBtYWlsYm94IHRoZW4gdGhhdCBpcyB1c3VhbGx5IGFuIGluZGljYXRpb24KLQkgICBvZiBhIG1vcmUgc2VyaW91cyBwcm9ibGVtLiAqLwotCXJldHVybiAocmVzID09IC1FQlVTWSkgPyBjeDE4X2FwaV9jYWxsKGN4LCBjbWQsIGFyZ3MsIGRhdGEpIDogcmVzOworCXJldHVybiBjeDE4X2FwaV9jYWxsKGN4LCBjbWQsIGFyZ3MsIGRhdGEpOwogfQogCiBzdGF0aWMgaW50IGN4MThfc2V0X2ZpbHRlcl9wYXJhbShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpCkBAIC0yODEsOCArNjA3LDkgQEAKIGludCBjeDE4X2FwaV9mdW5jKHZvaWQgKnByaXYsIHUzMiBjbWQsIGludCBpbiwgaW50IG91dCwKIAkJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXSkKIHsKLQlzdHJ1Y3QgY3gxOCAqY3ggPSBwcml2OwotCXN0cnVjdCBjeDE4X3N0cmVhbSAqcyA9ICZjeC0+c3RyZWFtc1tDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEddOworCXN0cnVjdCBjeDE4X2FwaV9mdW5jX3ByaXZhdGUgKmFwaV9wcml2ID0gcHJpdjsKKwlzdHJ1Y3QgY3gxOCAqY3ggPSBhcGlfcHJpdi0+Y3g7CisJc3RydWN0IGN4MThfc3RyZWFtICpzID0gYXBpX3ByaXYtPnM7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQ1gyMzQxWF9FTkNfU0VUX09VVFBVVF9QT1JUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5oCmluZGV4IGQ5OTU2NDEuLmNlMmI2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmgKQEAgLTIsNiArMiw3IEBACiAgKiAgY3gxOCBtYWlsYm94IGZ1bmN0aW9ucwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzAsOCArMzEsMjQgQEAKICNkZWZpbmUgTUJfUkVTRVJWRURfSEFORExFXzAgMAogI2RlZmluZSBNQl9SRVNFUlZFRF9IQU5ETEVfMSAweEZGRkZGRkZGCiAKKyNkZWZpbmUgQVBVIDAKKyNkZWZpbmUgQ1BVIDEKKyNkZWZpbmUgRVBVIDIKKyNkZWZpbmUgSFBVIDMKKwogc3RydWN0IGN4MTg7CiAKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IENQVSB0byBwcm92aWRlIGNvbXBsZXRlZCBidWZmZXJzIGluZm9ybWF0aW9uCisgKiBJdHMgc3RydWN0dXJlIGlzIGRpY3RyYXRlZCBieSB0aGUgbGF5b3V0IG9mIHRoZSBTQ0IsIHJlcXVpcmVkIGJ5IHRoZQorICogZmlybXdhcmUsIGJ1dCBpdHMgZGVmaW50aW9uIG5lZWRzIHRvIGJlIGhlcmUsIGluc3RlYWQgb2YgaW4gY3gxOC1zY2IuaCwKKyAqIGZvciBtYWlsYm94IHdvcmsgb3JkZXIgc2NoZWR1bGluZworICovCitzdHJ1Y3QgY3gxOF9tZGxfYWNrIHsKKyAgICB1MzIgaWQ7ICAgICAgICAvKiBJRCBvZiBhIGNvbXBsZXRlZCBNREwgKi8KKyAgICB1MzIgZGF0YV91c2VkOyAvKiBUb3RhbCBkYXRhIGZpbGxlZCBpbiB0aGUgTURMIGZvciBidWZmZXIgJ2lkJyAqLworfTsKKwogLyogVGhlIGN4MThfbWFpbGJveCBzdHJ1Y3QgaXMgdGhlIG1haWxib3ggc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIHBhc3NpbmcKICAgIG1lc3NhZ2VzIGJldHdlZW4gcHJvY2Vzc29ycyAqLwogc3RydWN0IGN4MThfbWFpbGJveCB7CkBAIC02MiwxMiArNzksMjIgQEAKICAgICB1MzIgICAgICAgZXJyb3I7CiB9OwogCitzdHJ1Y3QgY3gxOF9zdHJlYW07CisKK3N0cnVjdCBjeDE4X2FwaV9mdW5jX3ByaXZhdGUgeworCXN0cnVjdCBjeDE4ICpjeDsKKwlzdHJ1Y3QgY3gxOF9zdHJlYW0gKnM7Cit9OworCiBpbnQgY3gxOF9hcGkoc3RydWN0IGN4MTggKmN4LCB1MzIgY21kLCBpbnQgYXJncywgdTMyIGRhdGFbXSk7CiBpbnQgY3gxOF92YXBpX3Jlc3VsdChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBkYXRhW01BWF9NQl9BUkdVTUVOVFNdLCB1MzIgY21kLAogCQlpbnQgYXJncywgLi4uKTsKIGludCBjeDE4X3ZhcGkoc3RydWN0IGN4MTggKmN4LCB1MzIgY21kLCBpbnQgYXJncywgLi4uKTsKIGludCBjeDE4X2FwaV9mdW5jKHZvaWQgKnByaXYsIHUzMiBjbWQsIGludCBpbiwgaW50IG91dCwKIAkJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXSk7Ci1sb25nIGN4MThfbWJfYWNrKHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgc3RydWN0IGN4MThfbWFpbGJveCAqbWIpOworCit2b2lkIGN4MThfYXBpX2VwdV9jbWRfaXJxKHN0cnVjdCBjeDE4ICpjeCwgaW50IHJwdSk7CisKK3ZvaWQgY3gxOF9lcHVfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXF1ZXVlLmMKaW5kZXggMTc0NjgyYy4uOGQ5NDQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5jCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LXF1ZXVlLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQxLDkxICs0MiwxMjYgQEAKIAlxLT5ieXRlc3VzZWQgPSAwOwogfQogCi12b2lkIGN4MThfZW5xdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAotCQlzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSkKK3N0cnVjdCBjeDE4X3F1ZXVlICpfY3gxOF9lbnF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfYnVmZmVyICpidWYsCisJCQkJIHN0cnVjdCBjeDE4X3F1ZXVlICpxLCBpbnQgdG9fZnJvbnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQkvKiBjbGVhciB0aGUgYnVmZmVyIGlmIGl0IGlzIGdvaW5nIHRvIGJlIGVucXVldWVkIHRvIHRoZSBmcmVlIHF1ZXVlICovCi0JaWYgKHEgPT0gJnMtPnFfZnJlZSkgeworCS8qIGNsZWFyIHRoZSBidWZmZXIgaWYgaXQgaXMgbm90IHRvIGJlIGVucXVldWVkIHRvIHRoZSBmdWxsIHF1ZXVlICovCisJaWYgKHEgIT0gJnMtPnFfZnVsbCkgewogCQlidWYtPmJ5dGVzdXNlZCA9IDA7CiAJCWJ1Zi0+cmVhZHBvcyA9IDA7CiAJCWJ1Zi0+Yl9mbGFncyA9IDA7CisJCWJ1Zi0+c2tpcHBlZCA9IDA7CiAJfQotCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5xbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnEtPmxpc3QpOwotCWF0b21pY19pbmMoJnEtPmJ1ZmZlcnMpOworCisJbXV0ZXhfbG9jaygmcy0+cWxvY2spOworCisJLyogcV9idXN5IGlzIHJlc3RyaWN0ZWQgdG8gYSBtYXggYnVmZmVyIGNvdW50IGltcG9zZWQgYnkgZmlybXdhcmUgKi8KKwlpZiAocSA9PSAmcy0+cV9idXN5ICYmCisJICAgIGF0b21pY19yZWFkKCZxLT5idWZmZXJzKSA+PSBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0pCisJCXEgPSAmcy0+cV9mcmVlOworCisJaWYgKHRvX2Zyb250KQorCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmcS0+bGlzdCk7IC8qIExJRk8gKi8KKwllbHNlCisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnEtPmxpc3QpOyAvKiBGSUZPICovCiAJcS0+Ynl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnFsb2NrLCBmbGFncyk7CisJYXRvbWljX2luYygmcS0+YnVmZmVycyk7CisKKwltdXRleF91bmxvY2soJnMtPnFsb2NrKTsKKwlyZXR1cm4gcTsKIH0KIAogc3RydWN0IGN4MThfYnVmZmVyICpjeDE4X2RlcXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+cWxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZzLT5xbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZxLT5saXN0KSkgewotCQlidWYgPSBsaXN0X2VudHJ5KHEtPmxpc3QubmV4dCwgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdChxLT5saXN0Lm5leHQpOwotCQlhdG9taWNfZGVjKCZxLT5idWZmZXJzKTsKKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcS0+bGlzdCwgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKIAkJcS0+Ynl0ZXN1c2VkIC09IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOworCQlidWYtPnNraXBwZWQgPSAwOworCQlhdG9taWNfZGVjKCZxLT5idWZmZXJzKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cWxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnMtPnFsb2NrKTsKIAlyZXR1cm4gYnVmOwogfQogCi1zdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfcXVldWVfZ2V0X2J1Zl9pcnEoc3RydWN0IGN4MThfc3RyZWFtICpzLCB1MzIgaWQsCitzdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfcXVldWVfZ2V0X2J1ZihzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHUzMiBpZCwKIAl1MzIgYnl0ZXN1c2VkKQogewogCXN0cnVjdCBjeDE4ICpjeCA9IHMtPmN4OwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CisJc3RydWN0IGN4MThfYnVmZmVyICp0bXA7CisJc3RydWN0IGN4MThfYnVmZmVyICpyZXQgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrKCZzLT5xbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmcy0+cV9mcmVlLmxpc3QpIHsKLQkJc3RydWN0IGN4MThfYnVmZmVyICpidWYgPQotCQkJbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY3gxOF9idWZmZXIsIGxpc3QpOwotCi0JCWlmIChidWYtPmlkICE9IGlkKQorCW11dGV4X2xvY2soJnMtPnFsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmLCB0bXAsICZzLT5xX2J1c3kubGlzdCwgbGlzdCkgeworCQlpZiAoYnVmLT5pZCAhPSBpZCkgeworCQkJYnVmLT5za2lwcGVkKys7CisJCQlpZiAoYnVmLT5za2lwcGVkID49IGF0b21pY19yZWFkKCZzLT5xX2J1c3kuYnVmZmVycyktMSkgeworCQkJCS8qIGJ1ZmZlciBtdXN0IGhhdmUgZmFsbGVuIG91dCBvZiByb3RhdGlvbiAqLworCQkJCUNYMThfV0FSTigiU2tpcHBlZCAlcywgYnVmZmVyICVkLCAlZCAiCisJCQkJCSAgInRpbWVzIC0gaXQgbXVzdCBoYXZlIGRyb3BwZWQgb3V0IG9mICIKKwkJCQkJICAicm90YXRpb25cbiIsIHMtPm5hbWUsIGJ1Zi0+aWQsCisJCQkJCSAgYnVmLT5za2lwcGVkKTsKKwkJCQkvKiBtb3ZlIGl0IHRvIHFfZnJlZSAqLworCQkJCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzLT5xX2ZyZWUubGlzdCk7CisJCQkJYnVmLT5ieXRlc3VzZWQgPSBidWYtPnJlYWRwb3MgPSBidWYtPmJfZmxhZ3MgPQorCQkJCQlidWYtPnNraXBwZWQgPSAwOworCQkJCWF0b21pY19kZWMoJnMtPnFfYnVzeS5idWZmZXJzKTsKKwkJCQlhdG9taWNfaW5jKCZzLT5xX2ZyZWUuYnVmZmVycyk7CisJCQl9CiAJCQljb250aW51ZTsKKwkJfQogCiAJCWJ1Zi0+Ynl0ZXN1c2VkID0gYnl0ZXN1c2VkOwotCQlhdG9taWNfZGVjKCZzLT5xX2ZyZWUuYnVmZmVycyk7Ci0JCWF0b21pY19pbmMoJnMtPnFfZnVsbC5idWZmZXJzKTsKLQkJcy0+cV9mdWxsLmJ5dGVzdXNlZCArPSBidWYtPmJ5dGVzdXNlZDsKLQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+bGlzdCwgJnMtPnFfZnVsbC5saXN0KTsKKwkJLyogU3luYyB0aGUgYnVmZmVyIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBxbG9jayAqLworCQljeDE4X2J1Zl9zeW5jX2Zvcl9jcHUocywgYnVmKTsKKwkJaWYgKHMtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMpIHsKKwkJCS8qCisJCQkgKiBUUyBkb2Vzbid0IHVzZSBxX2Z1bGwuICBBcyB3ZSBwdWxsIHRoZSBidWZmZXIgb2ZmIG9mCisJCQkgKiB0aGUgcXVldWUgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGhhdmUgdG8gcHV0IGl0IGJhY2suCisJCQkgKi8KKwkJCWxpc3RfZGVsX2luaXQoJmJ1Zi0+bGlzdCk7CisJCX0gZWxzZSB7CisJCQkvKiBNb3ZlIGJ1ZmZlciBmcm9tIHFfYnVzeSB0byBxX2Z1bGwgKi8KKwkJCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzLT5xX2Z1bGwubGlzdCk7CisJCQlzZXRfYml0KENYMThfRl9CX05FRURfQlVGX1NXQVAsICZidWYtPmJfZmxhZ3MpOworCQkJcy0+cV9mdWxsLmJ5dGVzdXNlZCArPSBidWYtPmJ5dGVzdXNlZDsKKwkJCWF0b21pY19pbmMoJnMtPnFfZnVsbC5idWZmZXJzKTsKKwkJfQorCQlhdG9taWNfZGVjKCZzLT5xX2J1c3kuYnVmZmVycyk7CiAKLQkJc3Bpbl91bmxvY2soJnMtPnFsb2NrKTsKLQkJcmV0dXJuIGJ1ZjsKKwkJcmV0ID0gYnVmOworCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2soJnMtPnFsb2NrKTsKLQlDWDE4X0VSUigiQ2Fubm90IGZpbmQgYnVmZmVyICVkIGZvciBzdHJlYW0gJXNcbiIsIGlkLCBzLT5uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKwltdXRleF91bmxvY2soJnMtPnFsb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBNb3ZlIGFsbCBidWZmZXJzIG9mIGEgcXVldWUgdG8gcV9mcmVlLCB3aGlsZSBmbHVzaGluZyB0aGUgYnVmZmVycyAqLwogc3RhdGljIHZvaWQgY3gxOF9xdWV1ZV9mbHVzaChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X3F1ZXVlICpxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGN4MThfYnVmZmVyICpidWY7CiAKIAlpZiAocSA9PSAmcy0+cV9mcmVlKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+cWxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZzLT5xbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZxLT5saXN0KSkgewotCQlidWYgPSBsaXN0X2VudHJ5KHEtPmxpc3QubmV4dCwgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9tb3ZlX3RhaWwocS0+bGlzdC5uZXh0LCAmcy0+cV9mcmVlLmxpc3QpOwotCQlidWYtPmJ5dGVzdXNlZCA9IGJ1Zi0+cmVhZHBvcyA9IGJ1Zi0+Yl9mbGFncyA9IDA7CisJCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJnEtPmxpc3QsIHN0cnVjdCBjeDE4X2J1ZmZlciwgbGlzdCk7CisJCWxpc3RfbW92ZV90YWlsKCZidWYtPmxpc3QsICZzLT5xX2ZyZWUubGlzdCk7CisJCWJ1Zi0+Ynl0ZXN1c2VkID0gYnVmLT5yZWFkcG9zID0gYnVmLT5iX2ZsYWdzID0gYnVmLT5za2lwcGVkID0gMDsKIAkJYXRvbWljX2luYygmcy0+cV9mcmVlLmJ1ZmZlcnMpOwogCX0KIAljeDE4X3F1ZXVlX2luaXQocSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cWxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnMtPnFsb2NrKTsKIH0KIAogdm9pZCBjeDE4X2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpCiB7Ci0JY3gxOF9xdWV1ZV9mbHVzaChzLCAmcy0+cV9pbyk7CisJY3gxOF9xdWV1ZV9mbHVzaChzLCAmcy0+cV9idXN5KTsKIAljeDE4X3F1ZXVlX2ZsdXNoKHMsICZzLT5xX2Z1bGwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuaAppbmRleCA3ZjkzYmIxLi40NTZjZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXF1ZXVlLmgKQEAgLTQsNiArNCw3IEBACiAgKiAgRGVyaXZlZCBmcm9tIGl2dHYtcXVldWUuaAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDIsMTEgKzQzLDI2IEBACiB2b2lkIGN4MThfYnVmX3N3YXAoc3RydWN0IGN4MThfYnVmZmVyICpidWYpOwogCiAvKiBjeDE4X3F1ZXVlIHV0aWxpdHkgZnVuY3Rpb25zICovCitzdHJ1Y3QgY3gxOF9xdWV1ZSAqX2N4MThfZW5xdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAorCQkJCSBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSwgaW50IHRvX2Zyb250KTsKKworc3RhdGljIGlubGluZQorc3RydWN0IGN4MThfcXVldWUgKmN4MThfZW5xdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAorCQkJCXN0cnVjdCBjeDE4X3F1ZXVlICpxKQoreworCXJldHVybiBfY3gxOF9lbnF1ZXVlKHMsIGJ1ZiwgcSwgMCk7IC8qIEZJRk8gKi8KK30KKworc3RhdGljIGlubGluZQorc3RydWN0IGN4MThfcXVldWUgKmN4MThfcHVzaChzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmLAorCQkJICAgICBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gX2N4MThfZW5xdWV1ZShzLCBidWYsIHEsIDEpOyAvKiBMSUZPICovCit9CisKIHZvaWQgY3gxOF9xdWV1ZV9pbml0KHN0cnVjdCBjeDE4X3F1ZXVlICpxKTsKLXZvaWQgY3gxOF9lbnF1ZXVlKHN0cnVjdCBjeDE4X3N0cmVhbSAqcywgc3RydWN0IGN4MThfYnVmZmVyICpidWYsCi0Jc3RydWN0IGN4MThfcXVldWUgKnEpOwogc3RydWN0IGN4MThfYnVmZmVyICpjeDE4X2RlcXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzLCBzdHJ1Y3QgY3gxOF9xdWV1ZSAqcSk7Ci1zdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfcXVldWVfZ2V0X2J1Zl9pcnEoc3RydWN0IGN4MThfc3RyZWFtICpzLCB1MzIgaWQsCitzdHJ1Y3QgY3gxOF9idWZmZXIgKmN4MThfcXVldWVfZ2V0X2J1ZihzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMsIHUzMiBpZCwKIAl1MzIgYnl0ZXN1c2VkKTsKIHZvaWQgY3gxOF9mbHVzaF9xdWV1ZXMoc3RydWN0IGN4MThfc3RyZWFtICpzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc2NiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuYwppbmRleCBmNTZkMzc3Li4zNGI0ZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuYwpAQCAtMiw2ICsyLDcgQEAKICAqICBjeDE4IFN5c3RlbSBDb250cm9sIEJsb2NrIGluaXRpYWxpemF0aW9uCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMTcsNiArMTE4LDUgQEAKIAljeDE4X3dyaXRlbChjeCwgU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgY3B1X3N0YXRlKSwKIAkJCSZjeC0+c2NiLT5pcGNfb2Zmc2V0KTsKIAotCWN4MThfd3JpdGVsKGN4LCAxLCAmY3gtPnNjYi0+aHB1X3N0YXRlKTsKIAljeDE4X3dyaXRlbChjeCwgMSwgJmN4LT5zY2ItPmVwdV9zdGF0ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXNjYi5oCmluZGV4IDU5NDcxM2JiLi4xZGMxYzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zY2IuaApAQCAtMiw2ICsyLDcgQEAKICAqICBjeDE4IFN5c3RlbSBDb250cm9sIEJsb2NrIGluaXRpYWxpemF0aW9uCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC04NSwxMiArODYsNiBAQAogICAgIHUzMiBsZW5ndGg7IC8qIExlbmd0aCBvZiB0aGUgYnVmZmVyIHNlZ21lbnQgKi8KIH07CiAKLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgQ1BVIHRvIHByb3ZpZGUgY29tcGxldGVkIGJ1ZmZlcnMgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCBjeDE4X21kbF9hY2sgewotICAgIHUzMiBpZDsgICAgICAgIC8qIElEIG9mIGEgY29tcGxldGVkIE1ETCAqLwotICAgIHUzMiBkYXRhX3VzZWQ7IC8qIFRvdGFsIGRhdGEgZmlsbGVkIGluIHRoZSBNREwgZm9yIGJ1ZmZlciAnaWQnICovCi19OwotCiBzdHJ1Y3QgY3gxOF9zY2IgewogCS8qIFRoZXNlIGZpZWxkcyBmb3JtIHRoZSBTeXN0ZW0gQ29udHJvbCBCbG9jayB3aGljaCBpcyB1c2VkIGF0IGJvb3QgdGltZQogCSAgIGZvciBsb2NhbGl6aW5nIHRoZSBJUEMgZGF0YSBhcyB3ZWxsIGFzIHRoZSBjb2RlIHBvc2l0aW9ucyBmb3IgYWxsCkBAIC0yNzYsNyArMjcxLDcgQEAKIAlzdHJ1Y3QgY3gxOF9tYWlsYm94ICBocHUyZXB1X21iOwogCXN0cnVjdCBjeDE4X21haWxib3ggIHBwdTJlcHVfbWI7CiAKLQlzdHJ1Y3QgY3gxOF9tZGxfYWNrICBjcHVfbWRsX2Fja1tDWDE4X01BWF9TVFJFQU1TXVsyXTsKKwlzdHJ1Y3QgY3gxOF9tZGxfYWNrICBjcHVfbWRsX2Fja1tDWDE4X01BWF9TVFJFQU1TXVtDWDE4X01BWF9NRExfQUNLU107CiAJc3RydWN0IGN4MThfbWRsICAgICAgY3B1X21kbFsxXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYwppbmRleCBlNWZmNzcwLi42M2MzMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LXN0cmVhbXMuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTEwLDcgKzExMSw2IEBACiB7CiAJc3RydWN0IGN4MThfc3RyZWFtICpzID0gJmN4LT5zdHJlYW1zW3R5cGVdOwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHMtPnY0bDJkZXY7Ci0JdTMyIG1heF9zaXplID0gY3gtPm9wdGlvbnMubWVnYWJ5dGVzW3R5cGVdICogMTAyNCAqIDEwMjQ7CiAKIAkvKiB3ZSBuZWVkIHRvIGtlZXAgdjRsMmRldiwgc28gcmVzdG9yZSBpdCBhZnRlcndhcmRzICovCiAJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOwpAQCAtMTIzLDIxICsxMjMsMTUgQEAKIAlzLT5oYW5kbGUgPSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEU7CiAKIAlzLT5kbWEgPSBjeDE4X3N0cmVhbV9pbmZvW3R5cGVdLmRtYTsKKwlzLT5idWZmZXJzID0gY3gtPnN0cmVhbV9idWZmZXJzW3R5cGVdOwogCXMtPmJ1Zl9zaXplID0gY3gtPnN0cmVhbV9idWZfc2l6ZVt0eXBlXTsKLQlpZiAocy0+YnVmX3NpemUpCi0JCXMtPmJ1ZmZlcnMgPSBtYXhfc2l6ZSAvIHMtPmJ1Zl9zaXplOwotCWlmIChzLT5idWZmZXJzID4gNjMpIHsKLQkJLyogRWFjaCBzdHJlYW0gaGFzIGEgbWF4aW11bSBvZiA2MyBidWZmZXJzLAotCQkgICBlbnN1cmUgd2UgZG8gbm90IGV4Y2VlZCB0aGF0LiAqLwotCQlzLT5idWZmZXJzID0gNjM7Ci0JCXMtPmJ1Zl9zaXplID0gKG1heF9zaXplIC8gcy0+YnVmZmVycykgJiB+MHhmZmY7Ci0JfQotCXNwaW5fbG9ja19pbml0KCZzLT5xbG9jayk7CisKKwltdXRleF9pbml0KCZzLT5xbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+d2FpdHEpOwogCXMtPmlkID0gLTE7CiAJY3gxOF9xdWV1ZV9pbml0KCZzLT5xX2ZyZWUpOworCWN4MThfcXVldWVfaW5pdCgmcy0+cV9idXN5KTsKIAljeDE4X3F1ZXVlX2luaXQoJnMtPnFfZnVsbCk7Ci0JY3gxOF9xdWV1ZV9pbml0KCZzLT5xX2lvKTsKIH0KIAogc3RhdGljIGludCBjeDE4X3ByZXBfZGV2KHN0cnVjdCBjeDE4ICpjeCwgaW50IHR5cGUpCkBAIC0xNjcsNyArMTYxLDcgQEAKIAkvKiBVc2VyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgMCBidWZmZXJzIGZvciB0aGVzZSBzdHJlYW1zLCBzbyBkb24ndAogCSAgIGNyZWF0ZSB0aGVtLiAqLwogCWlmIChjeDE4X3N0cmVhbV9pbmZvW3R5cGVdLmRtYSAhPSBQQ0lfRE1BX05PTkUgJiYKLQkgICAgY3gtPm9wdGlvbnMubWVnYWJ5dGVzW3R5cGVdID09IDApIHsKKwkgICAgY3gtPnN0cmVhbV9idWZmZXJzW3R5cGVdID09IDApIHsKIAkJQ1gxOF9JTkZPKCJEaXNhYmxlZCAlcyBkZXZpY2VcbiIsIGN4MThfc3RyZWFtX2luZm9bdHlwZV0ubmFtZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI2Nyw4ICsyNjEsOSBAQAogCiAJc3dpdGNoICh2ZmxfdHlwZSkgewogCWNhc2UgVkZMX1RZUEVfR1JBQkJFUjoKLQkJQ1gxOF9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIGZvciAlcyAoJWQgTUIpXG4iLAotCQkJbnVtLCBzLT5uYW1lLCBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pOworCQlDWDE4X0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHZpZGVvJWQgZm9yICVzICglZCB4ICVkIGtCKVxuIiwKKwkJCSAgbnVtLCBzLT5uYW1lLCBjeC0+c3RyZWFtX2J1ZmZlcnNbdHlwZV0sCisJCQkgIGN4LT5zdHJlYW1fYnVmX3NpemVbdHlwZV0vMTAyNCk7CiAJCWJyZWFrOwogCiAJY2FzZSBWRkxfVFlQRV9SQURJTzoKQEAgLTI3NywxMCArMjcyLDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBWRkxfVFlQRV9WQkk6Ci0JCWlmIChjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pCi0JCQlDWDE4X0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHZiaSVkIGZvciAlcyAoJWQgTUIpXG4iLAotCQkJCW51bSwKLQkJCQlzLT5uYW1lLCBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pOworCQlpZiAoY3gtPnN0cmVhbV9idWZmZXJzW3R5cGVdKQorCQkJQ1gxOF9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2YmklZCBmb3IgJXMgIgorCQkJCSAgIiglZCB4ICVkIGJ5dGVzKVxuIiwKKwkJCQkgIG51bSwgcy0+bmFtZSwgY3gtPnN0cmVhbV9idWZmZXJzW3R5cGVdLAorCQkJCSAgY3gtPnN0cmVhbV9idWZfc2l6ZVt0eXBlXSk7CiAJCWVsc2UKIAkJCUNYMThfSU5GTygiUmVnaXN0ZXJlZCBkZXZpY2UgdmJpJWQgZm9yICVzXG4iLAogCQkJCW51bSwgcy0+bmFtZSk7CkBAIC0zNDQsNyArMzQwLDcgQEAKIHN0YXRpYyB2b2lkIGN4MThfdmJpX3NldHVwKHN0cnVjdCBjeDE4X3N0cmVhbSAqcykKIHsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBzLT5jeDsKLQlpbnQgcmF3ID0gY3gtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ID09IDA7CisJaW50IHJhdyA9IGN4MThfcmF3X3ZiaShjeCk7CiAJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKIAlpbnQgbGluZXM7CiAKQEAgLTM2Miw4ICszNTgsNyBAQAogCWN4MThfYXZfY21kKGN4LCBWSURJT0NfU19GTVQsICZjeC0+dmJpLmluKTsKIAogCS8qIGRldGVybWluZSBudW1iZXIgb2YgbGluZXMgYW5kIHRvdGFsIG51bWJlciBvZiBWQkkgYnl0ZXMuCi0JICAgQSByYXcgbGluZSB0YWtlcyAxNDQzIGJ5dGVzOiAyICogNzIwICsgNCBieXRlIGZyYW1lIGhlYWRlciAtIDEKLQkgICBUaGUgJy0gMScgYnl0ZSBpcyBwcm9iYWJseSBhbiB1bnVzZWQgVSBvciBWIGJ5dGUuIE9yIHNvbWV0aGluZy4uLgorCSAgIEEgcmF3IGxpbmUgdGFrZXMgMTQ0NCBieXRlczogNCBieXRlIFNBViBjb2RlICsgMiAqIDcyMAogCSAgIEEgc2xpY2VkIGxpbmUgdGFrZXMgNTEgYnl0ZXM6IDQgYnl0ZSBmcmFtZSBoZWFkZXIsIDQgYnl0ZSBpbnRlcm5hbAogCSAgIGhlYWRlciwgNDIgZGF0YSBieXRlcyArIGNoZWNrc3VtICh0byBiZSBjb25maXJtZWQpICovCiAJaWYgKHJhdykgewpAQCAtMzgxLDE0ICszNzYsMTUgQEAKIAkvKiBMaW5lcyBwZXIgZmllbGQgKi8KIAlkYXRhWzFdID0gKGxpbmVzIC8gMikgfCAoKGxpbmVzIC8gMikgPDwgMTYpOwogCS8qIGJ5dGVzIHBlciBsaW5lICovCi0JZGF0YVsyXSA9IChyYXcgPyBjeC0+dmJpLnJhd19zaXplIDogY3gtPnZiaS5zbGljZWRfc2l6ZSk7CisJZGF0YVsyXSA9IChyYXcgPyBjeC0+dmJpLnJhd19kZWNvZGVyX2xpbmVfc2l6ZQorCQkgICAgICAgOiBjeC0+dmJpLnNsaWNlZF9kZWNvZGVyX2xpbmVfc2l6ZSk7CiAJLyogRXZlcnkgWCBudW1iZXIgb2YgZnJhbWVzIGEgVkJJIGludGVycnVwdCBhcnJpdmVzCiAJICAgKGZyYW1lcyBhcyBpbiAyNSBvciAzMCBmcHMpICovCiAJZGF0YVszXSA9IDE7CiAJLyogU2V0dXAgVkJJIGZvciB0aGUgY3gyNTg0MCBkaWdpdGl6ZXIgKi8KIAlpZiAocmF3KSB7CiAJCWRhdGFbNF0gPSAweDIwNjAyMDYwOwotCQlkYXRhWzVdID0gMHgzMDcwMzA3MDsKKwkJZGF0YVs1XSA9IDB4MzA3MDkwZDA7CiAJfSBlbHNlIHsKIAkJZGF0YVs0XSA9IDB4QjBGMEIwRjA7CiAJCWRhdGFbNV0gPSAweEEwRTBBMEUwOwpAQCAtNDAxLDExICszOTcsNTIgQEAKIAkJY3gxOF9hcGkoY3gsIENYMThfQ1BVX1NFVF9SQVdfVkJJX1BBUkFNLCA2LCBkYXRhKTsKIH0KIAorc3RydWN0IGN4MThfcXVldWUgKmN4MThfc3RyZWFtX3B1dF9idWZfZncoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkgIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBjeDE4ICpjeCA9IHMtPmN4OworCXN0cnVjdCBjeDE4X3F1ZXVlICpxOworCisJLyogRG9uJ3QgZ2l2ZSBpdCB0byB0aGUgZmlybXdhcmUsIGlmIHdlJ3JlIG5vdCBydW5uaW5nIGEgY2FwdHVyZSAqLworCWlmIChzLT5oYW5kbGUgPT0gQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFIHx8CisJICAgICF0ZXN0X2JpdChDWDE4X0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKSkKKwkJcmV0dXJuIGN4MThfZW5xdWV1ZShzLCBidWYsICZzLT5xX2ZyZWUpOworCisJcSA9IGN4MThfZW5xdWV1ZShzLCBidWYsICZzLT5xX2J1c3kpOworCWlmIChxICE9ICZzLT5xX2J1c3kpCisJCXJldHVybiBxOyAvKiBUaGUgZmlybXdhcmUgaGFzIHRoZSBtYXggYnVmZmVycyBpdCBjYW4gaGFuZGxlICovCisKKwljeDE4X2J1Zl9zeW5jX2Zvcl9kZXZpY2UocywgYnVmKTsKKwljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1NFVF9NREwsIDUsIHMtPmhhbmRsZSwKKwkJICAodm9pZCBfX2lvbWVtICopICZjeC0+c2NiLT5jcHVfbWRsW2J1Zi0+aWRdIC0gY3gtPmVuY19tZW0sCisJCSAgMSwgYnVmLT5pZCwgcy0+YnVmX3NpemUpOworCXJldHVybiBxOworfQorCit2b2lkIGN4MThfc3RyZWFtX2xvYWRfZndfcXVldWUoc3RydWN0IGN4MThfc3RyZWFtICpzKQoreworCXN0cnVjdCBjeDE4X3F1ZXVlICpxOworCXN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmOworCisJaWYgKGF0b21pY19yZWFkKCZzLT5xX2ZyZWUuYnVmZmVycykgPT0gMCB8fAorCSAgICBhdG9taWNfcmVhZCgmcy0+cV9idXN5LmJ1ZmZlcnMpID49IENYMThfTUFYX0ZXX01ETFNfUEVSX1NUUkVBTSkKKwkJcmV0dXJuOworCisJLyogTW92ZSBmcm9tIHFfZnJlZSB0byBxX2J1c3kgbm90aWZ5aW5nIHRoZSBmaXJtd2FyZSwgdW50aWwgdGhlIGxpbWl0ICovCisJZG8geworCQlidWYgPSBjeDE4X2RlcXVldWUocywgJnMtPnFfZnJlZSk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlxID0gY3gxOF9zdHJlYW1fcHV0X2J1Zl9mdyhzLCBidWYpOworCX0gd2hpbGUgKGF0b21pY19yZWFkKCZzLT5xX2J1c3kuYnVmZmVycykgPCBDWDE4X01BWF9GV19NRExTX1BFUl9TVFJFQU0KKwkJICYmIHEgPT0gJnMtPnFfYnVzeSk7Cit9CisKIGludCBjeDE4X3N0YXJ0X3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpCiB7CiAJdTMyIGRhdGFbTUFYX01CX0FSR1VNRU5UU107CiAJc3RydWN0IGN4MTggKmN4ID0gcy0+Y3g7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZjsKIAlpbnQgdHMgPSAwOwogCWludCBjYXB0eXBlID0gMDsKIApAQCAtNDM0LDggKzQ3MSw4IEBACiAJCWNhcHR5cGUgPSBDQVBUVVJFX0NIQU5ORUxfVFlQRV9QQ007CiAJCWJyZWFrOwogCWNhc2UgQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVkJJOgotCQljYXB0eXBlID0gY3gtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ID8KLQkJICAgIENBUFRVUkVfQ0hBTk5FTF9UWVBFX1NMSUNFRF9WQkkgOiBDQVBUVVJFX0NIQU5ORUxfVFlQRV9WQkk7CisJCWNhcHR5cGUgPSBjeDE4X3Jhd192YmkoY3gpID8KKwkJICAgICBDQVBUVVJFX0NIQU5ORUxfVFlQRV9WQkkgOiBDQVBUVVJFX0NIQU5ORUxfVFlQRV9TTElDRURfVkJJOwogCQljeC0+dmJpLmZyYW1lID0gMDsKIAkJY3gtPnZiaS5pbnNlcnRlZF9mcmFtZSA9IDA7CiAJCW1lbXNldChjeC0+dmJpLnNsaWNlZF9tcGVnX3NpemUsCkBAIC00NTcsNiArNDk0LDggQEAKIAljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX1NFVF9DSEFOTkVMX1RZUEUsIDIsIHMtPmhhbmRsZSwgY2FwdHlwZSk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmN4LT5hbmFfY2FwdHVyaW5nKSA9PSAwICYmICF0cykgeworCQlzdHJ1Y3QgY3gxOF9hcGlfZnVuY19wcml2YXRlIHByaXY7CisKIAkJLyogU3R1ZmYgZnJvbSBXaW5kb3dzLCB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMgKi8KIAkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9TRVRfVkVSX0NST1BfTElORSwgMiwgcy0+aGFuZGxlLCAwKTsKIAkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9TRVRfTUlTQ19QQVJBTUVURVJTLCAzLCBzLT5oYW5kbGUsIDMsIDEpOwpAQCAtNDc2LDcgKzUxNSw5IEBACiAJCWN4MThfdmFwaV9yZXN1bHQoY3gsIGRhdGEsIENYMThfQ1BVX1NFVF9JTkRFWFRBQkxFLCAxLCAwKTsKIAogCQkvKiBTZXR1cCBBUEkgZm9yIFN0cmVhbSAqLwotCQljeDIzNDF4X3VwZGF0ZShjeCwgY3gxOF9hcGlfZnVuYywgTlVMTCwgJmN4LT5wYXJhbXMpOworCQlwcml2LmN4ID0gY3g7CisJCXByaXYucyA9IHM7CisJCWN4MjM0MXhfdXBkYXRlKCZwcml2LCBjeDE4X2FwaV9mdW5jLCBOVUxMLCAmY3gtPnBhcmFtcyk7CiAJfQogCiAJaWYgKGF0b21pY19yZWFkKCZjeC0+dG90X2NhcHR1cmluZykgPT0gMCkgewpAQCAtNDg4LDE2ICs1MjksMTcgQEAKIAkJKHZvaWQgX19pb21lbSAqKSZjeC0+c2NiLT5jcHVfbWRsX2Fja1tzLT50eXBlXVswXSAtIGN4LT5lbmNfbWVtLAogCQkodm9pZCBfX2lvbWVtICopJmN4LT5zY2ItPmNwdV9tZGxfYWNrW3MtPnR5cGVdWzFdIC0gY3gtPmVuY19tZW0pOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmcy0+cV9mcmVlLmxpc3QpIHsKLQkJc3RydWN0IGN4MThfYnVmZmVyICpidWYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBjeDE4X2J1ZmZlciwgbGlzdCk7Ci0KKwkvKiBJbml0IGFsbCB0aGUgY3B1X21kbHMgZm9yIHRoaXMgc3RyZWFtICovCisJY3gxOF9mbHVzaF9xdWV1ZXMocyk7CisJbXV0ZXhfbG9jaygmcy0+cWxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVmLCAmcy0+cV9mcmVlLmxpc3QsIGxpc3QpIHsKIAkJY3gxOF93cml0ZWwoY3gsIGJ1Zi0+ZG1hX2hhbmRsZSwKIAkJCQkJJmN4LT5zY2ItPmNwdV9tZGxbYnVmLT5pZF0ucGFkZHIpOwogCQljeDE4X3dyaXRlbChjeCwgcy0+YnVmX3NpemUsICZjeC0+c2NiLT5jcHVfbWRsW2J1Zi0+aWRdLmxlbmd0aCk7Ci0JCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfREVfU0VUX01ETCwgNSwgcy0+aGFuZGxlLAotCQkJKHZvaWQgX19pb21lbSAqKSZjeC0+c2NiLT5jcHVfbWRsW2J1Zi0+aWRdIC0gY3gtPmVuY19tZW0sCi0JCQkxLCBidWYtPmlkLCBzLT5idWZfc2l6ZSk7CiAJfQorCW11dGV4X3VubG9jaygmcy0+cWxvY2spOworCWN4MThfc3RyZWFtX2xvYWRfZndfcXVldWUocyk7CisKIAkvKiBiZWdpbl9jYXB0dXJlICovCiAJaWYgKGN4MThfdmFwaShjeCwgQ1gxOF9DUFVfQ0FQVFVSRV9TVEFSVCwgMSwgcy0+aGFuZGxlKSkgewogCQlDWDE4X0RFQlVHX1dBUk4oIkVycm9yIHN0YXJ0aW5nIGNhcHR1cmUhXG4iKTsKQEAgLTUwNiw5ICs1NDgsMTUgQEAKIAkJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfQ0FQVFVSRV9TVE9QLCAyLCBzLT5oYW5kbGUsIDEpOwogCQllbHNlCiAJCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0NBUFRVUkVfU1RPUCwgMSwgcy0+aGFuZGxlKTsKKwkJY2xlYXJfYml0KENYMThfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpOworCQkvKiBGSVhNRSAtIENYMThfRl9TX1NUUkVBTU9GRiBhcyB3ZWxsPyAqLwogCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1JFTEVBU0VfTURMLCAxLCBzLT5oYW5kbGUpOwogCQljeDE4X3ZhcGkoY3gsIENYMThfREVTVFJPWV9UQVNLLCAxLCBzLT5oYW5kbGUpOwotCQkvKiBGSVhNRSAtIGNsZWFuLXVwIERTUDBfSU5UIG1hc2ssIGlfZmxhZ3MsIHNfZmxhZ3MsIGV0Yy4gKi8KKwkJcy0+aGFuZGxlID0gQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFOworCQlpZiAoYXRvbWljX3JlYWQoJmN4LT50b3RfY2FwdHVyaW5nKSA9PSAwKSB7CisJCQlzZXRfYml0KENYMThfRl9JX0VPUywgJmN4LT5pX2ZsYWdzKTsKKwkJCWN4MThfd3JpdGVfcmVnKGN4LCA1LCBDWDE4X0RTUDBfSU5URVJSVVBUX01BU0spOworCQl9CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTYwLDkgKzYwOCw2IEBACiAJCUNYMThfSU5GTygiaWdub3JpbmcgZ29wX2VuZDogbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgYnkgdGhlIGZpcm13YXJlXG4iKTsKIAl9CiAKLQkvKiBUZWxsIHRoZSBDWDIzNDE4IGl0IGNhbid0IHVzZSBvdXIgYnVmZmVycyBhbnltb3JlICovCi0JY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9ERV9SRUxFQVNFX01ETCwgMSwgcy0+aGFuZGxlKTsKLQogCWlmIChzLT50eXBlICE9IENYMThfRU5DX1NUUkVBTV9UWVBFX1RTKQogCQlhdG9taWNfZGVjKCZjeC0+YW5hX2NhcHR1cmluZyk7CiAJYXRvbWljX2RlYygmY3gtPnRvdF9jYXB0dXJpbmcpOwpAQCAtNTcwLDYgKzYxNSw5IEBACiAJLyogQ2xlYXIgY2FwdHVyZSBhbmQgbm8tcmVhZCBiaXRzICovCiAJY2xlYXJfYml0KENYMThfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpOwogCisJLyogVGVsbCB0aGUgQ1gyMzQxOCBpdCBjYW4ndCB1c2Ugb3VyIGJ1ZmZlcnMgYW55bW9yZSAqLworCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwsIDEsIHMtPmhhbmRsZSk7CisKIAljeDE4X3ZhcGkoY3gsIENYMThfREVTVFJPWV9UQVNLLCAxLCBzLT5oYW5kbGUpOwogCXMtPmhhbmRsZSA9IENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRTsKIApAQCAtNTk1LDMgKzY0MywyMSBAQAogCX0KIAlyZXR1cm4gQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFOwogfQorCitzdHJ1Y3QgY3gxOF9zdHJlYW0gKmN4MThfaGFuZGxlX3RvX3N0cmVhbShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBoYW5kbGUpCit7CisJaW50IGk7CisJc3RydWN0IGN4MThfc3RyZWFtICpzOworCisJaWYgKGhhbmRsZSA9PSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEUpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX1NUUkVBTVM7IGkrKykgeworCQlzID0gJmN4LT5zdHJlYW1zW2ldOworCQlpZiAocy0+aGFuZGxlICE9IGhhbmRsZSkKKwkJCWNvbnRpbnVlOworCQlpZiAocy0+djRsMmRldiB8fCBzLT5kdmIuZW5hYmxlZCkKKwkJCXJldHVybiBzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuaAppbmRleCBmMzI3ZTk0Li40MjBlMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5oCkBAIC00LDYgKzQsNyBAQAogICogIERlcml2ZWQgZnJvbSBpdnR2LXN0cmVhbXMuaAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjIsMTEgKzIzLDE1IEBACiAgKi8KIAogdTMyIGN4MThfZmluZF9oYW5kbGUoc3RydWN0IGN4MTggKmN4KTsKK3N0cnVjdCBjeDE4X3N0cmVhbSAqY3gxOF9oYW5kbGVfdG9fc3RyZWFtKHN0cnVjdCBjeDE4ICpjeCwgdTMyIGhhbmRsZSk7CiBpbnQgY3gxOF9zdHJlYW1zX3NldHVwKHN0cnVjdCBjeDE4ICpjeCk7CiBpbnQgY3gxOF9zdHJlYW1zX3JlZ2lzdGVyKHN0cnVjdCBjeDE4ICpjeCk7CiB2b2lkIGN4MThfc3RyZWFtc19jbGVhbnVwKHN0cnVjdCBjeDE4ICpjeCwgaW50IHVucmVnaXN0ZXIpOwogCiAvKiBDYXB0dXJlIHJlbGF0ZWQgKi8KK3ZvaWQgY3gxOF9zdHJlYW1fbG9hZF9md19xdWV1ZShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpOworc3RydWN0IGN4MThfcXVldWUgKmN4MThfc3RyZWFtX3B1dF9idWZfZncoc3RydWN0IGN4MThfc3RyZWFtICpzLAorCQkJCQkgIHN0cnVjdCBjeDE4X2J1ZmZlciAqYnVmKTsKIGludCBjeDE4X3N0YXJ0X3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMpOwogaW50IGN4MThfc3RvcF92NGwyX2VuY29kZV9zdHJlYW0oc3RydWN0IGN4MThfc3RyZWFtICpzLCBpbnQgZ29wX2VuZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmMKaW5kZXggMjJlNzZlZS4uZmI1OTViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmJpLmMKQEAgLTE2MCwxMSArMTYwLDE0IEBACiAJCXJldHVybjsKIAogCS8qIFJhdyBWQkkgZGF0YSAqLwotCWlmIChjeC0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgPT0gMCkgeworCWlmIChjeDE4X3Jhd192YmkoY3gpKSB7CiAJCXU4IHR5cGU7CiAKIAkJY3gxOF9idWZfc3dhcChidWYpOwogCisJCS8qIFNraXAgMTIgYnl0ZXMgb2YgaGVhZGVyIHRoYXQgZ2V0cyBzdHVmZmVkIGluICovCisJCXNpemUgLT0gMTI7CisJCW1lbWNweShwLCAmYnVmLT5idWZbMTJdLCBzaXplKTsKIAkJdHlwZSA9IHBbM107CiAKIAkJc2l6ZSA9IGJ1Zi0+Ynl0ZXN1c2VkID0gY29tcHJlc3NfcmF3X2J1ZihjeCwgcCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKaW5kZXggOWY2YmUyZC4uODRjMGZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBDWDE4X0RSSVZFUl9OQU1FICJjeDE4IgogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAxCisjZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCA0CiAKICNkZWZpbmUgQ1gxOF9WRVJTSU9OIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IpICIuIiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX01JTk9SKSAiLiIgX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IsIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gyMzQxOC5oCmluZGV4IDY2OGY5NjguLjYwMWYzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MjM0MTguaApAQCAtNDQsNiArNDQsNyBAQAogCiAvKiBBbGwgY29tbWFuZHMgZm9yIENQVSBoYXZlIHRoZSBmb2xsb3dpbmcgbWFzayBzZXQgKi8KICNkZWZpbmUgQ1BVX0NNRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ1BVX0NNRF9NQVNLX0RFQlVHICAgICAgIAkJKENQVV9DTURfTUFTSyB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIENQVV9DTURfTUFTS19BQ0sgICAgICAgICAgICAgICAgICAgIAkoQ1BVX0NNRF9NQVNLIHwgMHg4MDAwMDAwMCkKICNkZWZpbmUgQ1BVX0NNRF9NQVNLX0NBUFRVUkUgICAgICAgICAgICAgICAgCShDUFVfQ01EX01BU0sgfCAweDAwMDIwMDAwKQogI2RlZmluZSBDUFVfQ01EX01BU0tfVFMgICAgICAgICAgICAgICAgICAgICAJKENQVV9DTURfTUFTSyB8IDB4MDAwNDAwMDApCkBAIC03MSw2ICs3MiwxMSBAQAogCSAgIDAvemVyby9OVUxMIG1lYW5zICJJIGhhdmUgbm90aGluZyB0byBzYXkiICovCiAjZGVmaW5lIENYMThfRVBVX0RFQlVHIAkJCQkoRVBVX0NNRF9NQVNLX0RFQlVHIHwgMHgwMDAzKQogCisvKiBSZWFkcyBtZW1vcnkvcmVnaXN0ZXJzICgzMi1iaXQpCisgICBJTlswXSAtIEFkZHJlc3MKKyAgIE9VVFsxXSAtIFZhbHVlICovCisjZGVmaW5lIENYMThfQ1BVX0RFQlVHX1BFRUszMgkJCShDUFVfQ01EX01BU0tfREVCVUcgfCAweDAwMDMpCisKIC8qIERlc2NyaXB0aW9uOiBUaGlzIGNvbW1hbmQgc3RhcnRzIHN0cmVhbWluZyB3aXRoIHRoZSBzZXQgY2hhbm5lbCB0eXBlCiAgICBJTlswXSAtIFRhc2sgaGFuZGxlLiBIYW5kbGUgb2YgdGhlIHRhc2sgdG8gc3RhcnQKICAgIFJldHVybkNvZGUgLSBPbmUgb2YgdGhlIEVSUl9DQVBUVVJFXy4uLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwppbmRleCAwMDgzMWYzLi43OThkMjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMiw3ICsyLDcgQEAKICAqCiAgKiAgU3VwcG9ydCBmb3IgYSBjeDIzNDE3IG1wZWcgZW5jb2RlciB2aWEgY3gyMzg4NSBob3N0IHBvcnQuCiAgKgotICogICAgKGMpIDIwMDQgSmVsbGUgRm9rcyA8amVsbGVAZm9rcy44bS5jb20+CisgKiAgICAoYykgMjAwNCBKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLnVzPgogICogICAgKGMpIDIwMDQgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPgogICogICAgKGMpIDIwMDggU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPgogICogICAgICAtIENYMjM4ODUvNy84IHN1cHBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCmluZGV4IGRhYzVjY2MuLmNhYTA5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwpAQCAtMTU4LDYgKzE1OCwxMCBAQAogCQkubmFtZQkJPSAiTGVhZHRlayBXaW5mYXN0IFB4RFZSMzIwMCBIIiwKIAkJLnBvcnRjCQk9IENYMjM4ODVfTVBFR19EVkIsCiAJfSwKKwlbQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGXSA9IHsKKwkJLm5hbWUJCT0gIkNvbXBybyBWaWRlb01hdGUgRTY1MEYiLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9ib2FyZHMpOwogCkBAIC0yMzcsNiArMjQxLDEwIEBACiAJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCiAJCS5zdWJkZXZpY2UgPSAweDY2ODEsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDE4NWIsCisJCS5zdWJkZXZpY2UgPSAweGU4MDAsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEYsCiAJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3gyMzg4NV9pZGNvdW50ID0gQVJSQVlfU0laRShjeDIzODg1X3N1Ymlkcyk7CkBAIC0zOTAsNiArMzk4LDcgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNTAwUToKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCQkvKiBUdW5lciBSZXNldCBDb21tYW5kICovCiAJCWJpdG1hc2sgPSAweDA0OwogCQlicmVhazsKQEAgLTUzMCw2ICs1MzksNyBAQAogCQljeF9zZXQoR1AwX0lPLCAweDAwMGYwMDBmKTsKIAkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAkJLyogR1BJTy0yICB4YzMwMjggdHVuZXIgcmVzZXQgKi8KIAogCQkvKiBUaGUgZm9sbG93aW5nIEdQSU8ncyBhcmUgb24gdGhlIGludGVybmFsIEFWQ29yZSAoY3gyNTg0MCkgKi8KQEAgLTYzMCw2ICs2NDAsNyBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTcwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAlkZWZhdWx0OgogCQl0czItPmdlbl9jdHJsX3ZhbCAgPSAweGM7IC8qIFNlcmlhbCBidXMgKyBwdW5jdHVyZWQgY2xvY2sgKi8KIAkJdHMyLT50c19jbGtfZW5fdmFsID0gMHgxOyAvKiBFbmFibGUgVFNfQ0xLICovCkBAIC02NDQsNiArNjU1LDcgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4MDBscDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE3MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAkJcmVxdWVzdF9tb2R1bGUoImN4MjU4NDAiKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwppbmRleCBlMWFhYzA3Li4xYzQ1NDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwpAQCAtNTAyLDYgKzUwMiw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1swXTsKIAogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAppbmRleCAxZDUzZjU0Li42NzgyODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKQEAgLTY2LDYgKzY2LDcgQEAKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWXzdfRFVBTF9FWFAgMTAKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUxfRVhQIDExCiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IIDEyCisjZGVmaW5lIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRiAgIDEzCiAKIC8qIEN1cnJlbnRseSB1bnN1cHBvcnRlZCBieSB0aGUgZHJpdmVyOiBQQUwvSCwgTlRTQy9LciwgU0VDQU0gQi9HL0gvTEMgKi8KICNkZWZpbmUgQ1gyMzg4NV9OT1JNUyAoXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvS2NvbmZpZwppbmRleCBkZTUxNWRhLi40NTExMzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBWSURFT19DWDI1ODQwCiAJdHJpc3RhdGUgIkNvbmV4YW50IENYMjU4NHggYXVkaW8vdmlkZW8gZGVjb2RlcnMiCi0JZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSTJDCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIENvbmV4YW50IENYMjU4NHggYXVkaW8vdmlkZW8gZGVjb2RlcnMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCmluZGV4IGQ2NDIxZTEuLmQxOTlkODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYwpAQCAtMjUsNyArMjUsNyBAQAogCiBzdGF0aWMgaW50IHNldF9hdWRjbGtfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgZnJlcSkKIHsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAKIAlpZiAoZnJlcSAhPSAzMjAwMCAmJiBmcmVxICE9IDQ0MTAwICYmIGZyZXEgIT0gNDgwMDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIHZvaWQgY3gyNTg0MF9hdWRpb19zZXRfcGF0aChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCS8qIGFzc2VydCBzb2Z0IHJlc2V0ICovCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgxMCwgfjB4MSwgMHgwMSk7CkBAIC0yMzUsNyArMjM1LDcgQEAKIAogc3RhdGljIGludCBnZXRfdm9sdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCB2b2w7CiAKIAlpZiAoc3RhdGUtPnVubXV0ZV92b2x1bWUgPj0gMCkKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXRfdm9sdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB2b2x1bWUpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCB2b2w7CiAKIAlpZiAoc3RhdGUtPnVubXV0ZV92b2x1bWUgPj0gMCkgewpAQCAtMzQwLDE0ICszNDAsMTQgQEAKIAogc3RhdGljIGludCBnZXRfbXV0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCXJldHVybiBzdGF0ZS0+dW5tdXRlX3ZvbHVtZSA+PSAwOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfbXV0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgbXV0ZSkKIHsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAKIAlpZiAobXV0ZSAmJiBzdGF0ZS0+dW5tdXRlX3ZvbHVtZSA9PSAtMSkgewogCQlpbnQgdm9sID0gZ2V0X3ZvbHVtZShjbGllbnQpOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAKIGludCBjeDI1ODQwX2F1ZGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKIAlpbnQgcmV0dmFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKaW5kZXggNGRhOGNkNy4uMmFkMjc3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiBzdGF0aWMgdm9pZCBjeDI1ODQwX2luaXRpYWxpemUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnE7CiAKIAkvKiBkYXRhc2hlZXQgc3RhcnR1cCBpbiBudW1iZXJlZCBzdGVwcywgcmVmZXIgdG8gcGFnZSAzLTc3ICovCkBAIC0yNTksNyArMjU5LDcgQEAKIHN0YXRpYyB2b2lkIGN4MjM4ODVfaW5pdGlhbGl6ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCURFRklORV9XQUlUKHdhaXQpOwotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcTsKIAogCS8qIEludGVybmFsIFJlc2V0ICovCkBAIC0zNTAsNyArMzUwLDcgQEAKIAogdm9pZCBjeDI1ODQwX3N0ZF9zZXR1cChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAl2NGwyX3N0ZF9pZCBzdGQgPSBzdGF0ZS0+c3RkOwogCWludCBoYmxhbmssIGhhY3RpdmUsIGJ1cnN0LCB2YmxhbmssIHZhY3RpdmUsIHNjOwogCWludCB2Ymxhbms2NTYsIHNyY19kZWNpbWF0aW9uOwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGlucHV0X2NoYW5nZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAl2NGwyX3N0ZF9pZCBzdGQgPSBzdGF0ZS0+c3RkOwogCiAJLyogRm9sbG93IHN0ZXAgOGMgYW5kIDhkIG9mIHNlY3Rpb24gMy4xNiBpbiB0aGUgY3gyNTg0MCBkYXRhc2hlZXQgKi8KQEAgLTU1MSw3ICs1NTEsNyBAQAogc3RhdGljIGludCBzZXRfaW5wdXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgZW51bSBjeDI1ODQwX3ZpZGVvX2lucHV0IHZpZF9pbnB1dCwKIAkJCQkJCWVudW0gY3gyNTg0MF9hdWRpb19pbnB1dCBhdWRfaW5wdXQpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCXU4IGlzX2NvbXBvc2l0ZSA9ICh2aWRfaW5wdXQgPj0gQ1gyNTg0MF9DT01QT1NJVEUxICYmCiAJCQkgICB2aWRfaW5wdXQgPD0gQ1gyNTg0MF9DT01QT1NJVEU4KTsKIAl1OCByZWc7CkBAIC02NzEsNyArNjcxLDcgQEAKIAogc3RhdGljIGludCBzZXRfdjRsc3RkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCXU4IGZtdCA9IDA7IAkvKiB6ZXJvIGlzIGF1dG9kZXRlY3QgKi8KIAl1OCBwYWxfbSA9IDA7CiAKQEAgLTcyMCw5ICs3MjAsMTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzZXRfdjRsY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBjeDI1ODQwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBDWDI1ODQwX0NJRF9FTkFCTEVfUFZSMTUwX1dPUktBUk9VTkQ6CkBAIC03ODYsOSArNzg3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Y0bGN0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgY3gyNTg0MF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgQ1gyNTg0MF9DSURfRU5BQkxFX1BWUjE1MF9XT1JLQVJPVU5EOgpAQCAtODIzLDIxICs4MjUsMjMgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBnZXRfdjRsZm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQorc3RhdGljIGludCBjeDI1ODQwX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwogCXN3aXRjaCAoZm10LT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKIAkJcmV0dXJuIGN4MjU4NDBfdmJpKGNsaWVudCwgVklESU9DX0dfRk1ULCBmbXQpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF92NGxmbXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCitzdGF0aWMgaW50IGN4MjU4NDBfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXg7CiAJaW50IEhTQywgVlNDLCBWc3JjLCBIc3JjLCBmaWx0ZXIsIFZsaW5lczsKIAlpbnQgaXNfNTBIeiA9ICEoc3RhdGUtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCk7CkBAIC05MTQsNyArOTE4LDcgQEAKIAkJIjB4RCIsICIweEUiLCAiMHhGIgogCX07CiAKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJdTggdmlkZm10X3NlbCA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDAwKSAmIDB4ZjsKIAl1OCBnZW5fc3RhdDEgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwZCk7CiAJdTggZ2VuX3N0YXQyID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MGUpOwpAQCAtOTQ0LDcgKzk0OCw3IEBACiAKIHN0YXRpYyB2b2lkIGxvZ19hdWRpb19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJdTggZG93bmxvYWRfY3RsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDMpOwogCXU4IG1vZF9kZXRfc3RhdDAgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwNCk7CiAJdTggbW9kX2RldF9zdGF0MSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA1KTsKQEAgLTEwOTcsMjEgKzExMDEsMTIgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBjeDI1ODQwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgY3gyNTg0MF9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCiB7Ci0Jc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOwotCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOwotCi0JLyogaWdub3JlIHRoZXNlIGNvbW1hbmRzICovCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUVU5FUl9TRVRfVFlQRV9BRERSOgotCQkJcmV0dXJuIDA7Ci0JfQorCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKIAlpZiAoIXN0YXRlLT5pc19pbml0aWFsaXplZCkgewotCQl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgImNtZCAlMDh4IHRyaWdnZXJlZCBmdyBsb2FkXG4iLCBjbWQpOwogCQkvKiBpbml0aWFsaXplIG9uIGZpcnN0IHVzZSAqLwogCQlzdGF0ZS0+aXNfaW5pdGlhbGl6ZWQgPSAxOwogCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCkBAIC0xMTIxLDUwICsxMTE2LDY5IEBACiAJCWVsc2UKIAkJCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQpOwogCX0KKwlyZXR1cm4gMDsKK30KIAotCXN3aXRjaCAoY21kKSB7CiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS8qIGlvY3RscyB0byBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIHRoZQotCSAqIGN4MjU4NDAgcmVnaXN0ZXJzIGZvciB0ZXN0aW5nICovCi0JY2FzZSBWSURJT0NfREJHX0dfUkVHSVNURVI6Ci0JY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOworc3RhdGljIGludCBjeDI1ODQwX2dfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsIHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJlZy0+dmFsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgcmVnLT5yZWcgJiAweDBmZmYpOworCXJldHVybiAwOworfQogCi0JCWlmIChjbWQgPT0gVklESU9DX0RCR19HX1JFR0lTVEVSKQotCQkJcmVnLT52YWwgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCByZWctPnJlZyAmIDB4MGZmZik7Ci0JCWVsc2UKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCByZWctPnJlZyAmIDB4MGZmZiwgcmVnLT52YWwgJiAweGZmKTsKLQkJYnJlYWs7Ci0JfQorc3RhdGljIGludCBjeDI1ODQwX3NfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoIXY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KGNsaWVudCwKKwkJCQlyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgcmVnLT5yZWcgJiAweDBmZmYsIHJlZy0+dmFsICYgMHhmZik7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAotCWNhc2UgVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkU6Ci0JCXJldHVybiBjeDI1ODQwX3ZiaShjbGllbnQsIGNtZCwgYXJnKTsKK3N0YXRpYyBpbnQgY3gyNTg0MF9kZWNvZGVfdmJpX2xpbmUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZGVjb2RlX3ZiaV9saW5lICp2YmkpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCXJldHVybiBjeDI1ODQwX2F1ZGlvKGNsaWVudCwgY21kLCBhcmcpOworCXJldHVybiBjeDI1ODQwX3ZiaShjbGllbnQsIFZJRElPQ19JTlRfREVDT0RFX1ZCSV9MSU5FLCB2YmkpOworfQogCi0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiZW5hYmxlIG91dHB1dFxuIik7CitzdGF0aWMgaW50IGN4MjU4NDBfc19jbG9ja19mcmVxKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBmcmVxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiBjeDI1ODQwX2F1ZGlvKGNsaWVudCwgVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVRLCAmZnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgY3gyNTg0MF9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwl2NGxfZGJnKDEsIGN4MjU4NDBfZGVidWcsIGNsaWVudCwgIiVzIG91dHB1dFxuIiwKKwkJCWVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlpZiAoZW5hYmxlKSB7CiAJCWlmIChzdGF0ZS0+aXNfY3gyMzg4NSkgewogCQkJdTggdiA9IChjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQyMSkgfCAweDBiKTsKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQyMSwgdik7CiAJCX0gZWxzZSB7CiAJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMTUsCi0JCQkJc3RhdGUtPmlzX2N4MjU4MzYgPyAweDBjIDogMHg4Yyk7CisJCQkJCXN0YXRlLT5pc19jeDI1ODM2ID8gMHgwYyA6IDB4OGMpOwogCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTE2LAotCQkJCXN0YXRlLT5pc19jeDI1ODM2ID8gMHgwNCA6IDB4MDcpOworCQkJCQlzdGF0ZS0+aXNfY3gyNTgzNiA/IDB4MDQgOiAweDA3KTsKIAkJfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKLQkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJkaXNhYmxlIG91dHB1dFxuIik7CisJfSBlbHNlIHsKIAkJaWYgKHN0YXRlLT5pc19jeDIzODg1KSB7CiAJCQl1OCB2ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MjEpICYgfigweDBiKTsKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQyMSwgdik7CkBAIC0xMTcyLDEzMyArMTE4NiwxMzYgQEAKIAkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDExNSwgMHgwMCk7CiAJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMTYsIDB4MDApOwogCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjU4NDBfcXVlcnljdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJc3dpdGNoIChxYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworCWRlZmF1bHQ6CiAJCWJyZWFrOworCX0KKwlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCXJldHVybiAtRUlOVkFMOwogCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJbG9nX3ZpZGVvX3N0YXR1cyhjbGllbnQpOwotCQlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQotCQkJbG9nX2F1ZGlvX3N0YXR1cyhjbGllbnQpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJcmV0dXJuIGdldF92NGxjdHJsKGNsaWVudCwgKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmcpOwotCi0JY2FzZSBWSURJT0NfU19DVFJMOgotCQlyZXR1cm4gc2V0X3Y0bGN0cmwoY2xpZW50LCAoc3RydWN0IHY0bDJfY29udHJvbCAqKWFyZyk7Ci0KLQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JewotCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCi0JCXN3aXRjaCAocWMtPmlkKSB7Ci0JCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQkJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN3aXRjaCAocWMtPmlkKSB7Ci0JCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDY1NTM1LAotCQkJCQk2NTUzNSAvIDEwMCwgc3RhdGUtPmRlZmF1bHRfdm9sdW1lKTsKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgotCQkJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCXN3aXRjaCAocWMtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgNjU1MzUsCisJCQkJNjU1MzUgLyAxMDAsIHN0YXRlLT5kZWZhdWx0X3ZvbHVtZSk7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KIAotCWNhc2UgVklESU9DX0dfU1REOgotCQkqKHY0bDJfc3RkX2lkICopYXJnID0gc3RhdGUtPnN0ZDsKLQkJYnJlYWs7CitzdGF0aWMgaW50IGN4MjU4NDBfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQljYXNlIFZJRElPQ19TX1NURDoKLQkJaWYgKHN0YXRlLT5yYWRpbyA9PSAwICYmIHN0YXRlLT5zdGQgPT0gKih2NGwyX3N0ZF9pZCAqKWFyZykKLQkJCXJldHVybiAwOwotCQlzdGF0ZS0+cmFkaW8gPSAwOwotCQlzdGF0ZS0+c3RkID0gKih2NGwyX3N0ZF9pZCAqKWFyZzsKLQkJcmV0dXJuIHNldF92NGxzdGQoY2xpZW50KTsKKwlpZiAoc3RhdGUtPnJhZGlvID09IDAgJiYgc3RhdGUtPnN0ZCA9PSBzdGQpCisJCXJldHVybiAwOworCXN0YXRlLT5yYWRpbyA9IDA7CisJc3RhdGUtPnN0ZCA9IHN0ZDsKKwlyZXR1cm4gc2V0X3Y0bHN0ZChjbGllbnQpOworfQogCi0JY2FzZSBBVURDX1NFVF9SQURJTzoKLQkJc3RhdGUtPnJhZGlvID0gMTsKLQkJYnJlYWs7CitzdGF0aWMgaW50IGN4MjU4NDBfc19yYWRpbyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAotCWNhc2UgVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkc6Ci0JCXJvdXRlLT5pbnB1dCA9IHN0YXRlLT52aWRfaW5wdXQ7Ci0JCXJvdXRlLT5vdXRwdXQgPSAwOwotCQlicmVhazsKKwlzdGF0ZS0+cmFkaW8gPSAxOworCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKLQkJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsIHJvdXRlLT5pbnB1dCwgc3RhdGUtPmF1ZF9pbnB1dCk7CitzdGF0aWMgaW50IGN4MjU4NDBfc192aWRlb19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQljYXNlIFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HOgotCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcm91dGUtPmlucHV0ID0gc3RhdGUtPmF1ZF9pbnB1dDsKLQkJcm91dGUtPm91dHB1dCA9IDA7Ci0JCWJyZWFrOworCXJldHVybiBzZXRfaW5wdXQoY2xpZW50LCByb3V0ZS0+aW5wdXQsIHN0YXRlLT5hdWRfaW5wdXQpOworfQogCi0JY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzoKLQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiBzZXRfaW5wdXQoY2xpZW50LCBzdGF0ZS0+dmlkX2lucHV0LCByb3V0ZS0+aW5wdXQpOworc3RhdGljIGludCBjeDI1ODQwX3NfYXVkaW9fcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSkKK3sKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpIHsKLQkJCWlucHV0X2NoYW5nZShjbGllbnQpOwotCQl9Ci0JCWJyZWFrOworCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsIHN0YXRlLT52aWRfaW5wdXQsIHJvdXRlLT5pbnB1dCk7Cit9CiAKLQljYXNlIFZJRElPQ19HX1RVTkVSOgotCXsKLQkJdTggdnByZXMgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwZSkgJiAweDIwOwotCQl1OCBtb2RlOwotCQlpbnQgdmFsID0gMDsKK3N0YXRpYyBpbnQgY3gyNTg0MF9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCQlpZiAoc3RhdGUtPnJhZGlvKQotCQkJYnJlYWs7CisJaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwkJaW5wdXRfY2hhbmdlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CiAKLQkJdnQtPnNpZ25hbCA9IHZwcmVzID8gMHhmZmZmIDogMHgwOwotCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCi0JCQlicmVhazsKK3N0YXRpYyBpbnQgY3gyNTg0MF9nX3R1bmVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3R1bmVyICp2dCkKK3sKKwlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXU4IHZwcmVzID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MGUpICYgMHgyMDsKKwl1OCBtb2RlOworCWludCB2YWwgPSAwOwogCi0JCXZ0LT5jYXBhYmlsaXR5IHw9Ci0JCSAgICBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfCBWNEwyX1RVTkVSX0NBUF9MQU5HMSB8Ci0JCSAgICBWNEwyX1RVTkVSX0NBUF9MQU5HMiB8IFY0TDJfVFVORVJfQ0FQX1NBUDsKKwlpZiAoc3RhdGUtPnJhZGlvKQorCQlyZXR1cm4gMDsKIAotCQltb2RlID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDQpOworCXZ0LT5zaWduYWwgPSB2cHJlcyA/IDB4ZmZmZiA6IDB4MDsKKwlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCXJldHVybiAwOwogCi0JCS8qIGdldCByeHN1YmNoYW5zIGFuZCBhdWRtb2RlICovCi0JCWlmICgobW9kZSAmIDB4ZikgPT0gMSkKLQkJCXZhbCB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCWVsc2UKLQkJCXZhbCB8PSBWNEwyX1RVTkVSX1NVQl9NT05POworCXZ0LT5jYXBhYmlsaXR5IHw9CisJCVY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xBTkcxIHwKKwkJVjRMMl9UVU5FUl9DQVBfTEFORzIgfCBWNEwyX1RVTkVSX0NBUF9TQVA7CiAKLQkJaWYgKG1vZGUgPT0gMiB8fCBtb2RlID09IDQpCi0JCQl2YWwgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCW1vZGUgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwNCk7CiAKLQkJaWYgKG1vZGUgJiAweDEwKQotCQkJdmFsIHw9IFY0TDJfVFVORVJfU1VCX1NBUDsKKwkvKiBnZXQgcnhzdWJjaGFucyBhbmQgYXVkbW9kZSAqLworCWlmICgobW9kZSAmIDB4ZikgPT0gMSkKKwkJdmFsIHw9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwllbHNlCisJCXZhbCB8PSBWNEwyX1RVTkVSX1NVQl9NT05POwogCi0JCXZ0LT5yeHN1YmNoYW5zID0gdmFsOwotCQl2dC0+YXVkbW9kZSA9IHN0YXRlLT5hdWRtb2RlOwotCQlicmVhazsKLQl9CisJaWYgKG1vZGUgPT0gMiB8fCBtb2RlID09IDQpCisJCXZhbCA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7CiAKLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQlpZiAoc3RhdGUtPnJhZGlvIHx8IHN0YXRlLT5pc19jeDI1ODM2KQotCQkJYnJlYWs7CisJaWYgKG1vZGUgJiAweDEwKQorCQl2YWwgfD0gVjRMMl9UVU5FUl9TVUJfU0FQOwogCi0JCXN3aXRjaCAodnQtPmF1ZG1vZGUpIHsKKwl2dC0+cnhzdWJjaGFucyA9IHZhbDsKKwl2dC0+YXVkbW9kZSA9IHN0YXRlLT5hdWRtb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjU4NDBfc190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmIChzdGF0ZS0+cmFkaW8gfHwgc3RhdGUtPmlzX2N4MjU4MzYpCisJCXJldHVybiAwOworCisJc3dpdGNoICh2dC0+YXVkbW9kZSkgewogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgogCQkJLyogbW9ubyAgICAgIC0+IG1vbm8KIAkJCSAgIHN0ZXJlbyAgICAtPiBtb25vCkBAIC0xMzI2LDQxICsxMzQzLDEwMCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzdGF0ZS0+YXVkbW9kZSA9IHZ0LT5hdWRtb2RlOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfRk1UOgotCQlyZXR1cm4gZ2V0X3Y0bGZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwotCi0JY2FzZSBWSURJT0NfU19GTVQ6Ci0JCXJldHVybiBzZXRfdjRsZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZyk7Ci0KLQljYXNlIFZJRElPQ19JTlRfUkVTRVQ6Ci0JCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKLQkJCWN4MjU4MzZfaW5pdGlhbGl6ZShjbGllbnQpOwotCQllbHNlIGlmIChzdGF0ZS0+aXNfY3gyMzg4NSkKLQkJCWN4MjM4ODVfaW5pdGlhbGl6ZShjbGllbnQpOwotCQllbHNlCi0JCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywgc3RhdGUtPmlkLCBzdGF0ZS0+cmV2KTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KLQorCXN0YXRlLT5hdWRtb2RlID0gdnQtPmF1ZG1vZGU7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3gyNTg0MF9yZXNldChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgdmFsKQoreworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCWN4MjU4MzZfaW5pdGlhbGl6ZShjbGllbnQpOworCWVsc2UgaWYgKHN0YXRlLT5pc19jeDIzODg1KQorCQljeDIzODg1X2luaXRpYWxpemUoY2xpZW50KTsKKwllbHNlCisJCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjU4NDBfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIHN0YXRlLT5pZCwgc3RhdGUtPnJldik7Cit9CisKK3N0YXRpYyBpbnQgY3gyNTg0MF9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWxvZ192aWRlb19zdGF0dXMoY2xpZW50KTsKKwlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCQlsb2dfYXVkaW9fc3RhdHVzKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNTg0MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgY3gyNTg0MF9jb3JlX29wcyA9IHsKKwkubG9nX3N0YXR1cyA9IGN4MjU4NDBfbG9nX3N0YXR1cywKKwkuZ19jaGlwX2lkZW50ID0gY3gyNTg0MF9nX2NoaXBfaWRlbnQsCisJLmdfY3RybCA9IGN4MjU4NDBfZ19jdHJsLAorCS5zX2N0cmwgPSBjeDI1ODQwX3NfY3RybCwKKwkucXVlcnljdHJsID0gY3gyNTg0MF9xdWVyeWN0cmwsCisJLnJlc2V0ID0gY3gyNTg0MF9yZXNldCwKKwkuaW5pdCA9IGN4MjU4NDBfaW5pdCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIgPSBjeDI1ODQwX2dfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIgPSBjeDI1ODQwX3NfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdHVuZXJfb3BzIGN4MjU4NDBfdHVuZXJfb3BzID0geworCS5zX2ZyZXF1ZW5jeSA9IGN4MjU4NDBfc19mcmVxdWVuY3ksCisJLnNfc3RkID0gY3gyNTg0MF9zX3N0ZCwKKwkuc19yYWRpbyA9IGN4MjU4NDBfc19yYWRpbywKKwkuZ190dW5lciA9IGN4MjU4NDBfZ190dW5lciwKKwkuc190dW5lciA9IGN4MjU4NDBfc190dW5lciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfYXVkaW9fb3BzIGN4MjU4NDBfYXVkaW9fb3BzID0geworCS5zX2Nsb2NrX2ZyZXEgPSBjeDI1ODQwX3NfY2xvY2tfZnJlcSwKKwkuc19yb3V0aW5nID0gY3gyNTg0MF9zX2F1ZGlvX3JvdXRpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBjeDI1ODQwX3ZpZGVvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gY3gyNTg0MF9zX3ZpZGVvX3JvdXRpbmcsCisJLmdfZm10ID0gY3gyNTg0MF9nX2ZtdCwKKwkuc19mbXQgPSBjeDI1ODQwX3NfZm10LAorCS5kZWNvZGVfdmJpX2xpbmUgPSBjeDI1ODQwX2RlY29kZV92YmlfbGluZSwKKwkuc19zdHJlYW0gPSBjeDI1ODQwX3Nfc3RyZWFtLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgY3gyNTg0MF9vcHMgPSB7CisJLmNvcmUgPSAmY3gyNTg0MF9jb3JlX29wcywKKwkudHVuZXIgPSAmY3gyNTg0MF90dW5lcl9vcHMsCisJLmF1ZGlvID0gJmN4MjU4NDBfYXVkaW9fb3BzLAorCS52aWRlbyA9ICZjeDI1ODQwX3ZpZGVvX29wcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBpbnQgY3gyNTg0MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJdTMyIGlkOwogCXUxNiBkZXZpY2VfaWQ7CiAKQEAgLTEzOTIsMTAgKzE0NjgsMTEgQEAKIAl9CiAKIAlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDI1ODQwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIHsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZjeDI1ODQwX29wcyk7CiAJLyogTm90ZTogcmV2aXNpb24gJyhkZXZpY2VfaWQgJiAweDBmKSA9PSAyJyB3YXMgbmV2ZXIgYnVpbHQuIFRoZQogCSAgIG1hcmtpbmcgc2tpcHMgZnJvbSAweDEgPT0gMjIgdG8gMHgzID09IDIzLiAqLwogCXY0bF9pbmZvKGNsaWVudCwgImN4MjUlM3gtMiV4IGZvdW5kIEAgMHgleCAoJXMpXG4iLApAQCAtMTQwMyw3ICsxNDgwLDYgQEAKIAkJICAgIChkZXZpY2VfaWQgJiAweDBmKSA8IDMgPyAoZGV2aWNlX2lkICYgMHgwZikgKyAxIDogKGRldmljZV9pZCAmIDB4MGYpLAogCQkgICAgY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CiAJc3RhdGUtPmMgPSBjbGllbnQ7CiAJc3RhdGUtPmlzX2N4MjU4MzYgPSAoKGRldmljZV9pZCAmIDB4ZmYwMCkgPT0gMHg4MzAwKTsKIAlzdGF0ZS0+aXNfY3gyMzg4NSA9IChkZXZpY2VfaWQgPT0gMHgwMDAwKSB8fCAoZGV2aWNlX2lkID09IDB4MTMxMyk7CkBAIC0xNDMwLDcgKzE1MDYsMTAgQEAKIAogc3RhdGljIGludCBjeDI1ODQwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oCmluZGV4IGI4NzMzN2UuLmJlMDU1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAogLyogRU5BQkxFX1BWUjE1MF9XT1JLQVJPVU5EIGFjdGl2YXRlcyBhIHdvcmthcm91bmQgZm9yIGEgaGFyZHdhcmUgYnVnIHRoYXQgaXMKQEAgLTM0LDYgKzM1LDcgQEAKIAogc3RydWN0IGN4MjU4NDBfc3RhdGUgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjOworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKIAlpbnQgcHZyMTUwX3dvcmthcm91bmQ7CiAJaW50IHJhZGlvOwogCXY0bDJfc3RkX2lkIHN0ZDsKQEAgLTUzLDYgKzU1LDExIEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGZ3X3dvcms7ICAgLyogd29yayBlbnRyeSBmb3IgZncgbG9hZCAqLwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSwgc2QpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3gyNTg1MC1jb3JlLmMgCQkJCQkJCSAgICovCiBpbnQgY3gyNTg0MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTggdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMKaW5kZXggOGQ0ODlhNC4uMGIyZGNlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1maXJtd2FyZS5jCkBAIC05MSw3ICs5MSw3IEBACiAKIGludCBjeDI1ODQwX2xvYWRmdyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKIAl1OCBidWZmZXJbRldTRU5EXTsKIAljb25zdCB1OCAqcHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwppbmRleCA1OGU2ZWYxLi4wM2YwOWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwpAQCAtODQsNyArODQsNyBAQAogCiBpbnQgY3gyNTg0MF92Ymkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdDsKIAlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqc3ZiaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCmluZGV4IDA2ZjE3MWEuLjY2Yzc1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKQEAgLTc0Miw3ICs3NDIsNiBAQAogCWNvcmUgPSBjeDg4X2NvcmVfZ2V0KHBjaSk7CiAJaWYgKE5VTEwgPT0gY29yZSkgewogCQllcnIgPSAtRUlOVkFMOwotCQlrZnJlZSAoY2hpcCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC04MTIsNyArODExLDcgQEAKIAogCWVyciA9IHNuZF9jeDg4X2NyZWF0ZShjYXJkLCBwY2ksICZjaGlwKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIChlcnIpOworCQlnb3RvIGVycm9yOwogCiAJZXJyID0gc25kX2N4ODhfcGNtKGNoaXAsIDAsICJDWDg4IERpZ2l0YWwiKTsKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggZDNhZTViNC4uZTE2MmE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTMsNyArMyw3IEBACiAgKiAgU3VwcG9ydCBmb3IgYSBjeDIzNDE2IG1wZWcgZW5jb2RlciB2aWEgY3gyMzg4eCBob3N0IHBvcnQuCiAgKiAgImJsYWNrYmlyZCIgcmVmZXJlbmNlIGRlc2lnbi4KICAqCi0gKiAgICAoYykgMjAwNCBKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4KKyAqICAgIChjKSAyMDA0IEplbGxlIEZva3MgPGplbGxlQGZva3MudXM+CiAgKiAgICAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CiAgKgogICogICAgKGMpIDIwMDUtMjAwNiBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlICJjeDg4LmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4L2N4MjM0MTYgYmFzZWQgbXBlZyBlbmNvZGVyIGNhcmRzIik7Ci1NT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4sIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKK01PRFVMRV9BVVRIT1IoIkplbGxlIEZva3MgPGplbGxlQGZva3MudXM+LCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBlZ2J1ZnMgPSAzMjsKQEAgLTEyNDQsOCArMTI0NCwxNiBAQAogCQkgKiBXZSdyZSBiZWluZyBnaXZlbiBhY2Nlc3MgdG8gcmUtYXJyYW5nZSB0aGUgR1BJT3MuCiAJCSAqIFRha2UgdGhlIGJ1cyBvZmYgdGhlIGN4MjI3MDIgYW5kIHB1dCB0aGUgY3gyMzQxNiBvbiBpdC4KIAkJICovCi0JCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDA4MCk7IC8qIGN4MjI3MDIgaW4gcmVzZXQgKi8KLQkJY3hfc2V0KE1PX0dQMF9JTywgICAweDAwMDAwMDA0KTsgLyogRGlzYWJsZSB0aGUgY3gyMjcwMiAqLworCQkvKiBUb2dnbGUgcmVzZXQgb24gY3gyMjcwMiBsZWF2aW5nIGkyYyBhY3RpdmUgKi8KKwkJY3hfc2V0KE1PX0dQMF9JTywgMHgwMDAwMDA4MCk7CisJCXVkZWxheSgxMDAwKTsKKwkJY3hfY2xlYXIoTU9fR1AwX0lPLCAweDAwMDAwMDgwKTsKKwkJdWRlbGF5KDUwKTsKKwkJY3hfc2V0KE1PX0dQMF9JTywgMHgwMDAwMDA4MCk7CisJCXVkZWxheSgxMDAwKTsKKwkJLyogdHJpLXN0YXRlIHRoZSBjeDIyNzAyIHBpbnMgKi8KKwkJY3hfc2V0KE1PX0dQMF9JTywgMHgwMDAwMDAwNCk7CisJCXVkZWxheSgxMDAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IDViY2JiNGMuLjczM2VkZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwpAQCAtMTIzNyw3ICsxMjM3LDYgQEAKIAkJfSwKIAl9LAogCVtDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhdID0gewotCQkvKiB2aWRlbyBpbnB1dHMgYW5kIHJhZGlvIHN0aWxsIGluIHRlc3RpbmcgKi8KIAkJLm5hbWUgICAgICAgICAgID0gIldpbkZhc3QgRFRWMjAwMCBIIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszLAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKQEAgLTEyNTEsNyArMTI1MCwzNSBAQAogCQkJLmdwaW8xICA9IDB4MDAwMDgyMDMsCiAJCQkuZ3BpbzIgID0gMHgwMDAxNzMwNCwKIAkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDAwMDFkNzAxLAorCQkJLmdwaW8xICA9IDB4MDAwMGIyMDcsCisJCQkuZ3BpbzIgID0gMHgwMDAxZDcwMSwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTIsCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwMDFkNTAzLAorCQkJLmdwaW8xICA9IDB4MDAwMGIyMDcsCisJCQkuZ3BpbzIgID0gMHgwMDAxZDUwMywKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPSAzLAorCQkJLmdwaW8wICA9IDB4MDAwMWQ3MDEsCisJCQkuZ3BpbzEgID0gMHgwMDAwYjIwNywKKwkJCS5ncGlvMiAgPSAweDAwMDFkNzAxLAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCiAJCX19LAorCQkucmFkaW8gPSB7CisJCQkgLnR5cGUgID0gQ1g4OF9SQURJTywKKwkJCSAuZ3BpbzAgPSAweDAwMDE1NzAyLAorCQkJIC5ncGlvMSA9IDB4MDAwMGYyMDcsCisJCQkgLmdwaW8yID0gMHgwMDAxNTcwMiwKKwkJCSAuZ3BpbzMgPSAweDAyMDAwMDAwLAorCQl9LAogCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAogCX0sCiAJW0NYODhfQk9BUkRfR0VOSUFURUNIX0RWQlNdID0gewpAQCAtMTg0Nyw2ICsxODc0LDE4IEBACiAJCX0gfSwKIAkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAorCVtDWDg4X0JPQVJEX1RCU184OTEwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRCUyA4OTEwIERWQi1TIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9EVkIsCisJCQkudm11eCAgID0gMCwKKwkJfSB9LAorCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAorCX0sCiAJW0NYODhfQk9BUkRfVEJTXzg5MjBdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiVEJTIDg5MjAgRFZCLVMvUzIiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCkBAIC0xODU5LDYgKzE4OTgsMTggQEAKIAkJfSB9LAogCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAogCX0sCisJW0NYODhfQk9BUkRfUFJPRl82MjAwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlByb2YgNjIwMCBEVkItUyIsCisJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfRFZCLAorCQkJLnZtdXggICA9IDAsCisJCX0gfSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKKwl9LAogCVtDWDg4X0JPQVJEX1BST0ZfNzMwMF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJQUk9GIDczMDAgRFZCLVMvUzIiLAogCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKQEAgLTE4NzEsNiArMTkyMiwxOCBAQAogCQl9IH0sCiAJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCiAJfSwKKwlbQ1g4OF9CT0FSRF9TQVRUUkFERV9TVDQyMDBdID0geworCQkubmFtZSAgICAgICAgICAgPSAiU0FUVFJBREUgU1Q0MjAwIERWQi1TL1MyIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9EVkIsCisJCQkudm11eCAgID0gMCwKKwkJfSB9LAorCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAorCX0sCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4OTcsNyArMTk2MCwxMSBAQAogCQkuc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BVEksCiAJCS5zdWJkZXZpY2UgPSAweDAwZjgsCiAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0FUSV9XT05ERVJfUFJPLAotCX0seworCX0sIHsKKwkJLnN1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQVRJLAorCQkuc3ViZGV2aWNlID0gMHgwMGY5LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9BVElfV09OREVSX1BSTywKKwl9LCB7CiAJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCiAJCS5zdWJkZXZpY2UgPSAweDY2MTEsCiAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1QyMDAwWFBfRVhQRVJULApAQCAtMjI1NywxMyArMjMyNCwyNSBAQAogCQkuc3ViZGV2aWNlID0gMHgyMDExLAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSSwKIAl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDg5MTAsCisJCS5zdWJkZXZpY2UgPSAweDg4ODgsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1RCU184OTEwLAorCX0sIHsKIAkJLnN1YnZlbmRvciA9IDB4ODkyMCwKIAkJLnN1YmRldmljZSA9IDB4ODg4OCwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfVEJTXzg5MjAsCiAJfSwgeworCQkuc3VidmVuZG9yID0gMHhiMDIyLAorCQkuc3ViZGV2aWNlID0gMHgzMDIyLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9QUk9GXzYyMDAsCisJfSwgewogCQkuc3VidmVuZG9yID0gMHhCMDMzLAogCQkuc3ViZGV2aWNlID0gMHgzMDMzLAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9QUk9GXzczMDAsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHhiMjAwLAorCQkuc3ViZGV2aWNlID0gMHg0MjAwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9TQVRUUkFERV9TVDQyMDAsCiAJfSwKIH07CiAKQEAgLTI4NzQsOCArMjk1MywxMSBAQAogCWNhc2UgIENYODhfQk9BUkRfVEVWSUlfUzQyMDoKIAljYXNlICBDWDg4X0JPQVJEX1RFVklJX1M0NjA6CiAJY2FzZSAgQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSToKKwljYXNlICBDWDg4X0JPQVJEX1RCU184OTEwOgogCWNhc2UgIENYODhfQk9BUkRfVEJTXzg5MjA6CisJY2FzZSAgQ1g4OF9CT0FSRF9QUk9GXzYyMDA6CiAJY2FzZSAgQ1g4OF9CT0FSRF9QUk9GXzczMDA6CisJY2FzZSAgQ1g4OF9CT0FSRF9TQVRUUkFERV9TVDQyMDA6CiAJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOwogCQltc2xlZXAoMTAwKTsKIAkJY3hfd3JpdGUoTU9fU1JTVF9JTywgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggNjA3MDViMC4uYjA0NTg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtODQ0LDYgKzg0NCw5IEBACiAJfSBlbHNlIGlmIChWNEwyX1NURF9TRUNBTV9MICYgbm9ybSkgewogCQljb3JlLT50dmF1ZGlvID0gV1dfTDsKIAorCX0gZWxzZSBpZiAoKFY0TDJfU1REX1NFQ0FNX0IgfCBWNEwyX1NURF9TRUNBTV9HIHwgVjRMMl9TVERfU0VDQU1fSCkgJiBub3JtKSB7CisJCWNvcmUtPnR2YXVkaW8gPSBXV19CRzsKKwogCX0gZWxzZSBpZiAoVjRMMl9TVERfU0VDQU1fREsgJiBub3JtKSB7CiAJCWNvcmUtPnR2YXVkaW8gPSBXV19ESzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwppbmRleCAzMDljYTVlLi5kYTRkZDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAJCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwMDYwNjApOwogCQkJYnJlYWs7CiAJCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgotCQkgICAJcHJpbnRrKCJMTkIgVm9sdGFnZSBTRUNfVk9MVEFHRV9vZmZcbiIpOworCQkJcHJpbnRrKCJMTkIgVm9sdGFnZSBTRUNfVk9MVEFHRV9vZmZcbiIpOwogCQkJYnJlYWs7CiAJfQogCkBAIC02MDYsNyArNjA2LDcgQEAKIAkvKiBHZXQgdGhlIGZpcnN0IGZyb250ZW5kICovCiAJZmUwID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIDEpOwogCWlmICghZmUwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAKIAkvKiBtdWx0aS1mcm9udGVuZCBnYXRlIGNvbnRyb2wgaXMgdW5kZWZpbmVkIG9yIGRlZmF1bHRzIHRvIGZlMCAqLwogCWRldi0+ZnJvbnRlbmRzLmdhdGUgPSAwOwpAQCAtNjUzLDM4ICs2NTMsMzUgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDA6CisJCS8qIE1GRSBmcm9udGVuZCAxICovCisJCW1mZV9zaGFyZWQgPSAxOworCQlkZXYtPmZyb250ZW5kcy5nYXRlID0gMjsKIAkJLyogRFZCLVMgaW5pdCAqLwogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDEyM19hdHRhY2gsCi0JCQkgICAgICAgJmhhdXBwYXVnZV9ub3Zhc19jb25maWcsCi0JCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQkJCQkmaGF1cHBhdWdlX25vdmFzX2NvbmZpZywKKwkJCQkJJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQpIHsKLQkJCWlmICghZHZiX2F0dGFjaChpc2w2NDIxX2F0dGFjaCwgZmUwLT5kdmIuZnJvbnRlbmQsCi0JCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCwgMHgwOCwgSVNMNjQyMV9EQ0wsIDB4MDApKSB7Ci0JCQkJZHByaW50ayggMSwgIiVzKCk6IEhWUjMwMDAgLSBEVkItUyBMTkIgSW5pdDogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSMzAwMCAtIERWQi1TIEluaXQ6IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJaWYgKCFkdmJfYXR0YWNoKGlzbDY0MjFfYXR0YWNoLAorCQkJCQlmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJCTB4MDgsIElTTDY0MjFfRENMLCAweDAwKSkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKIAkJfQotCQkvKiBEVkItVCBpbml0ICovCisJCS8qIE1GRSBmcm9udGVuZCAyICovCiAJCWZlMSA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAyKTsKLQkJaWYgKGZlMSkgewotCQkJZGV2LT5mcm9udGVuZHMuZ2F0ZSA9IDI7Ci0JCQltZmVfc2hhcmVkID0gMTsKLQkJCWZlMS0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKLQkJCQkmaGF1cHBhdWdlX2h2cl9jb25maWcsCi0JCQkJJmRldi0+Y29yZS0+aTJjX2FkYXApOwotCQkJaWYgKGZlMS0+ZHZiLmZyb250ZW5kKSB7Ci0JCQkJZmUxLT5kdmIuZnJvbnRlbmQtPmlkID0gMTsKLQkJCQlpZighZHZiX2F0dGFjaChzaW1wbGVfdHVuZXJfYXR0YWNoLCBmZTEtPmR2Yi5mcm9udGVuZCwKLQkJCQkJCSZkZXYtPmNvcmUtPmkyY19hZGFwLCAweDYxLAotCQkJCQkJVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKSkgewotCQkJCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSMzAwMCAtIERWQi1UIG1pc2MgSW5pdDogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSMzAwMCAtIERWQi1UIEluaXQ6IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJfQotCQl9IGVsc2UgewotCQkJZHByaW50ayggMSwgIiVzKCk6IEhWUjMwMDAgLSBEVkItVCBJbml0OiBjYW4ndCBmaW5kIGZyb250ZW5kIDIuXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghZmUxKQorCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CisJCS8qIERWQi1UIGluaXQgKi8KKwkJZmUxLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLAorCQkJCQkmaGF1cHBhdWdlX2h2cl9jb25maWcsCisJCQkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGZlMS0+ZHZiLmZyb250ZW5kKSB7CisJCQlmZTEtPmR2Yi5mcm9udGVuZC0+aWQgPSAxOworCQkJaWYgKCFkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsCisJCQkJCWZlMS0+ZHZiLmZyb250ZW5kLAorCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkJMHg2MSwgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKSkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9QTFVTOgpAQCAtOTk4LDUwICs5OTUsNTEgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDA6CisJCS8qIE1GRSBmcm9udGVuZCAxICovCisJCW1mZV9zaGFyZWQgPSAxOworCQlkZXYtPmZyb250ZW5kcy5nYXRlID0gMjsKIAkJLyogRFZCLVMvUzIgSW5pdCAqLwogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsCi0JCQkmaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnLAotCQkJJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQkJCQkmaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnLAorCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkgewotCQkJaWYoIWR2Yl9hdHRhY2goaXNsNjQyMV9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLAotCQkJCSZkZXYtPmNvcmUtPmkyY19hZGFwLCAweDA4LCBJU0w2NDIxX0RDTCwgMHgwMCkpIHsKLQkJCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSNDAwMCAtIERWQi1TIExOQiBJbml0OiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWRwcmludGsoIDEsICIlcygpOiBIVlI0MDAwIC0gRFZCLVMgSW5pdDogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlpZiAoIWR2Yl9hdHRhY2goaXNsNjQyMV9hdHRhY2gsCisJCQkJCWZlMC0+ZHZiLmZyb250ZW5kLAorCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkJMHgwOCwgSVNMNjQyMV9EQ0wsIDB4MDApKQorCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOwogCQl9Ci0JCS8qIERWQi1UIEluaXQgKi8KKwkJLyogTUZFIGZyb250ZW5kIDIgKi8KIAkJZmUxID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIDIpOwotCQlpZiAoZmUxKSB7Ci0JCQlkZXYtPmZyb250ZW5kcy5nYXRlID0gMjsKLQkJCW1mZV9zaGFyZWQgPSAxOwotCQkJZmUxLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLAotCQkJCSZoYXVwcGF1Z2VfaHZyX2NvbmZpZywKLQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7Ci0JCQlpZiAoZmUxLT5kdmIuZnJvbnRlbmQpIHsKLQkJCQlmZTEtPmR2Yi5mcm9udGVuZC0+aWQgPSAxOwotCQkJCWlmKCFkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsIGZlMS0+ZHZiLmZyb250ZW5kLAotCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCwgMHg2MSwKLQkJCQkJVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKSkgewotCQkJCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSNDAwMCAtIERWQi1UIG1pc2MgSW5pdDogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkcHJpbnRrKCAxLCAiJXMoKTogSFZSNDAwMCAtIERWQi1UIEluaXQ6IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJfQotCQl9IGVsc2UgewotCQkJZHByaW50ayggMSwgIiVzKCk6IEhWUjQwMDAgLSBEVkItVCBJbml0OiBjYW4ndCBmaW5kIGZyb250ZW5kIDIuXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghZmUxKQorCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CisJCS8qIERWQi1UIEluaXQgKi8KKwkJZmUxLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLAorCQkJCQkmaGF1cHBhdWdlX2h2cl9jb25maWcsCisJCQkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGZlMS0+ZHZiLmZyb250ZW5kKSB7CisJCQlmZTEtPmR2Yi5mcm9udGVuZC0+aWQgPSAxOworCQkJaWYgKCFkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsCisJCQkJCWZlMS0+ZHZiLmZyb250ZW5kLAorCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkJMHg2MSwgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKSkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDBMSVRFOgogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsCi0JCQkmaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnLAotCQkJJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQkJCQkmaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnLAorCQkJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkgewotCQkJZHZiX2F0dGFjaChpc2w2NDIxX2F0dGFjaCwgZmUwLT5kdmIuZnJvbnRlbmQsCi0JCQkJJmRldi0+Y29yZS0+aTJjX2FkYXAsCi0JCQkJMHgwOCwgSVNMNjQyMV9EQ0wsIDB4MDApOworCQkJaWYgKCFkdmJfYXR0YWNoKGlzbDY0MjFfYXR0YWNoLAorCQkJCQlmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJCTB4MDgsIElTTDY0MjFfRENMLCAweDAwKSkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKIAkJfQogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfUFJPRl82MjAwOgorCWNhc2UgQ1g4OF9CT0FSRF9UQlNfODkxMDoKIAljYXNlIENYODhfQk9BUkRfVEVWSUlfUzQyMDoKIAkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHN0djAyOTlfYXR0YWNoLAogCQkJCQkJJnRldmlpX3R1bmVyX3NoYXJwX2NvbmZpZywKQEAgLTEwNzAsMjEgKzEwNjgsMTggQEAKIAkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjQxMTZfYXR0YWNoLAogCQkJCQkgICAgICAgJnRldmlpX3M0NjBfY29uZmlnLAogCQkJCQkgICAgICAgJmNvcmUtPmkyY19hZGFwKTsKLQkJaWYgKGZlMC0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKLQkJCWNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UgPSBmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlOworCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkKIAkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSB0ZXZpaV9kdmJzX3NldF92b2x0YWdlOwotCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSToKIAljYXNlIENYODhfQk9BUkRfVEJTXzg5MjA6CiAJY2FzZSBDWDg4X0JPQVJEX1BST0ZfNzMwMDoKKwljYXNlIENYODhfQk9BUkRfU0FUVFJBREVfU1Q0MjAwOgogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsCiAJCQkJCSAgICAgICAmaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnLAogCQkJCQkgICAgICAgJmNvcmUtPmkyY19hZGFwKTsKLQkJaWYgKGZlMC0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKLQkJCWNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UgPSBmZTAtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlOworCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkKIAkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSB0ZXZpaV9kdmJzX3NldF92b2x0YWdlOwotCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLApAQCAtMTA5MiwxMSArMTA4NywxMSBAQAogCQlicmVhazsKIAl9CiAKLSAgICAgICAgaWYgKCAoTlVMTCA9PSBmZTAtPmR2Yi5mcm9udGVuZCkgfHwgKGZlMSAmJiBOVUxMID09IGZlMS0+ZHZiLmZyb250ZW5kKSApIHsKKwlpZiAoIChOVUxMID09IGZlMC0+ZHZiLmZyb250ZW5kKSB8fCAoZmUxICYmIE5VTEwgPT0gZmUxLT5kdmIuZnJvbnRlbmQpICkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICIlcy8yOiBmcm9udGVuZCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCiAJCSAgICAgICBjb3JlLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOwogCX0KIAkvKiBkZWZpbmUgZ2VuZXJhbC1wdXJwb3NlIGNhbGxiYWNrIHBvaW50ZXIgKi8KIAlmZTAtPmR2Yi5mcm9udGVuZC0+Y2FsbGJhY2sgPSBjeDg4X3R1bmVyX2NhbGxiYWNrOwpAQCAtMTEzMyw0MCArMTEyOCw0NCBAQAogCQkgKiBvbiB0aGUgYnVzLiBUYWtlIHRoZSBidXMgZnJvbSB0aGUgY3gyMzQxNiBhbmQgZW5hYmxlIHRoZQogCQkgKiBjeDIyNzAyIGRlbW9kCiAJCSAqLwotCQljeF9zZXQoTU9fR1AwX0lPLCAgIDB4MDAwMDAwODApOyAvKiBjeDIyNzAyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlICovCisJCS8qIFRvZ2dsZSByZXNldCBvbiBjeDIyNzAyIGxlYXZpbmcgaTJjIGFjdGl2ZSAqLworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMDgwKTsKKwkJdWRlbGF5KDEwMDApOworCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwODApOworCQl1ZGVsYXkoNTApOworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMDgwKTsKKwkJdWRlbGF5KDEwMDApOworCQkvKiBlbmFibGUgdGhlIGN4MjI3MDIgcGlucyAqLwogCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwMDQpOwogCQl1ZGVsYXkoMTAwMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMDoKLQkJaWYoY29yZS0+ZHZiZGV2LT5mcm9udGVuZHMuYWN0aXZlX2ZlX2lkID09IDEpIHsKLQkJCS8qIERWQi1TL1MyIEVuYWJsZWQgKi8KLQotCQkJLyogVG9nZ2xlIHJlc2V0IG9uIGN4MjI3MDIgbGVhdmluZyBpMmMgYWN0aXZlICovCi0JCQljeF93cml0ZShNT19HUDBfSU8sIChjb3JlLT5ib2FyZC5pbnB1dFswXS5ncGlvMCAmIDB4MDAwMGZmMDApIHwgMHgwMDAwMDA4MCk7Ci0JCQl1ZGVsYXkoMTAwMCk7Ci0JCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwODApOwotCQkJdWRlbGF5KDUwKTsKLQkJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDAwODApOyAvKiBjeDIyNzAyIG91dCBvZiByZXNldCAqLwotCQkJY3hfc2V0KE1PX0dQMF9JTywgMHgwMDAwMDAwNCk7IC8qIHRyaS1zdGF0ZSB0aGUgY3gyMjcwMiBwaW5zICovCi0JCQl1ZGVsYXkoMTAwMCk7Ci0KLQkJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDEpOyAvKiBUYWtlIHRoZSBjeDI0MTE2L2N4MjQxMjMgb3V0IG9mIHJlc2V0ICovCisJCS8qIFRvZ2dsZSByZXNldCBvbiBjeDIyNzAyIGxlYXZpbmcgaTJjIGFjdGl2ZSAqLworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMDgwKTsKKwkJdWRlbGF5KDEwMDApOworCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwODApOworCQl1ZGVsYXkoNTApOworCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMDgwKTsKKwkJdWRlbGF5KDEwMDApOworCQlzd2l0Y2ggKGNvcmUtPmR2YmRldi0+ZnJvbnRlbmRzLmFjdGl2ZV9mZV9pZCkgeworCQljYXNlIDE6IC8qIERWQi1TL1MyIEVuYWJsZWQgKi8KKwkJCS8qIHRyaS1zdGF0ZSB0aGUgY3gyMjcwMiBwaW5zICovCisJCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAwMDA0KTsKKwkJCS8qIFRha2UgdGhlIGN4MjQxMTYvY3gyNDEyMyBvdXQgb2YgcmVzZXQgKi8KKwkJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDEpOwogCQkJY29yZS0+ZHZiZGV2LT50c19nZW5fY250cmwgPSAweDAyOyAvKiBQYXJhbGxlbCBJTyAqLwotCQl9IGVsc2UKLQkJaWYgKGNvcmUtPmR2YmRldi0+ZnJvbnRlbmRzLmFjdGl2ZV9mZV9pZCA9PSAyKSB7Ci0JCQkvKiBEVkItVCBFbmFibGVkICovCi0KKwkJCWJyZWFrOworCQljYXNlIDI6IC8qIERWQi1UIEVuYWJsZWQgKi8KIAkJCS8qIFB1dCB0aGUgY3gyNDExNi9jeDI0MTIzIGludG8gcmVzZXQgKi8KIAkJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOwotCi0JCQkvKiBjeDIyNzAyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlIGl0ICovCi0JCQljeF9zZXQoTU9fR1AwX0lPLCAgIDB4MDAwMDAwODApOworCQkJLyogZW5hYmxlIHRoZSBjeDIyNzAyIHBpbnMgKi8KIAkJCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDAwNCk7CiAJCQljb3JlLT5kdmJkZXYtPnRzX2dlbl9jbnRybCA9IDB4MGM7IC8qIFNlcmlhbCBJTyAqLwotCQkJdWRlbGF5KDEwMDApOworCQkJYnJlYWs7CiAJCX0KKwkJdWRlbGF5KDEwMDApOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xMTk5LDggKzExOTgsNyBAQAogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGRydi0+Y29yZS0+ZHZiZGV2OwotCWludCBlcnIsIGk7Ci0Jc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmU7CisJaW50IGVycjsKIAogCWRwcmludGsoIDEsICIlc1xuIiwgX19mdW5jX18pOwogCWRwcmludGsoIDEsICIgLT5iZWluZyBwcm9iZWQgYnkgQ2FyZD0lZCBOYW1lPSVzLCBQQ0kgJTAyeDolMDJ4XG4iLApAQCAtMTIxNiwzMSArMTIxNCw0NyBAQAogCS8qIElmIHZwMzA1NCBpc24ndCBlbmFibGVkLCBhIHN0dWIgd2lsbCBqdXN0IHJldHVybiAwICovCiAJZXJyID0gdnAzMDU0X2kyY19wcm9iZShkZXYpOwogCWlmICgwICE9IGVycikKLQkJZ290byBmYWlsX2NvcmU7CisJCWdvdG8gZmFpbF9wcm9iZTsKIAogCS8qIGR2YiBzdHVmZiAqLwogCXByaW50ayhLRVJOX0lORk8gIiVzLzI6IGN4MjM4OHggYmFzZWQgRFZCL0FUU0MgY2FyZFxuIiwgY29yZS0+bmFtZSk7CiAJZGV2LT50c19nZW5fY250cmwgPSAweDBjOwogCi0JZm9yIChpID0gMTsgaSA8PSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzOyBpKyspIHsKLQkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKCZjb3JlLT5kdmJkZXYtPmZyb250ZW5kcywgaSk7Ci0JCWlmICghZmUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBmYWlsZWQgdG8gZ2V0IGZyb250ZW5kKCVkKVxuIiwgX19mdW5jX18sIGkpOwotCQkJY29udGludWU7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcykgeworCQlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMTsgaSA8PSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzOyBpKyspIHsKKwkJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmY29yZS0+ZHZiZGV2LT5mcm9udGVuZHMsIGkpOworCQkJaWYgKGZlID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgZmFpbGVkIHRvIGdldCBmcm9udGVuZCglZClcbiIsCisJCQkJCV9fZnVuY19fLCBpKTsKKwkJCQlnb3RvIGZhaWxfcHJvYmU7CisJCQl9CisJCQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmZS0+ZHZiLmR2YnEsICZkdmJfcW9wcywKKwkJCQkgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAorCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkJICAgIFY0TDJfRklFTERfVE9QLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGN4ODhfYnVmZmVyKSwKKwkJCQkgICAgZGV2KTsKKwkJCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLworCQkJZmUtPmR2Yi5uYW1lID0gZGV2LT5jb3JlLT5uYW1lOwogCQl9Ci0JCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZlLT5kdmIuZHZicSwgJmR2Yl9xb3BzLAotCQkJICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKLQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkgICAgVjRMMl9GSUVMRF9UT1AsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjeDg4X2J1ZmZlciksCi0JCQkgICAgZGV2KTsKLQkJLyogaW5pdCBzdHJ1Y3QgdmlkZW9idWZfZHZiICovCi0JCWZlLT5kdmIubmFtZSA9IGRldi0+Y29yZS0+bmFtZTsKKwl9IGVsc2UgeworCQkvKiBubyBmcm9udGVuZHMgYWxsb2NhdGVkICovCisJCXByaW50ayhLRVJOX0VSUiAiJXMvMiAubnVtX2Zyb250ZW5kcyBzaG91bGQgYmUgbm9uLXplcm9cbiIsCisJCQljb3JlLT5uYW1lKTsKKwkJZ290byBmYWlsX2NvcmU7CiAJfQogCWVyciA9IGR2Yl9yZWdpc3RlcihkZXYpOwotCWlmIChlcnIgIT0gMCkKKwlpZiAoZXJyKQorCQkvKiBmcm9udGVuZHMvYWRhcHRlciBkZS1hbGxvY2F0ZWQgaW4gZHZiX3JlZ2lzdGVyICovCiAJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogZHZiX3JlZ2lzdGVyIGZhaWxlZCAoZXJyID0gJWQpXG4iLAogCQkgICAgICAgY29yZS0+bmFtZSwgZXJyKTsKKwlyZXR1cm4gZXJyOworZmFpbF9wcm9iZToKKwl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmNvcmUtPmR2YmRldi0+ZnJvbnRlbmRzKTsKIGZhaWxfY29yZToKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDNlYmRjZDEuLmEwNGZlZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTMsNyArMyw3IEBACiAgKiAgU3VwcG9ydCBmb3IgdGhlIG1wZWcgdHJhbnNwb3J0IHN0cmVhbSB0cmFuc2ZlcnMKICAqICBQQ0kgZnVuY3Rpb24gIzIgb2YgdGhlIGN4MjM4OHguCiAgKgotICogICAgKGMpIDIwMDQgSmVsbGUgRm9rcyA8amVsbGVAZm9rcy44bS5jb20+CisgKiAgICAoYykgMjAwNCBKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLnVzPgogICogICAgKGMpIDIwMDQgQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4KICAqICAgIChjKSAyMDA0IEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KICAqCkBAIC0zNCw3ICszNCw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJtcGVnIGRyaXZlciBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIpOwotTU9EVUxFX0FVVEhPUigiSmVsbGUgRm9rcyA8amVsbGVAZm9rcy44bS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLnVzPiIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGY0MjQwOTYuLjIwNjQ5YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtNTMsMTIgKzUzLDExIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZGVmaW5lcyBhbmQgZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotLyogQ3VycmVudGx5IHVuc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXI6IFBBTC9ILCBOVFNDL0tyLCBTRUNBTSBCL0cvSC9MQyAqLwotI2RlZmluZSBDWDg4X05PUk1TIChcCi0JVjRMMl9TVERfTlRTQ19NfCAgVjRMMl9TVERfTlRTQ19NX0pQfCAgVjRMMl9TVERfTlRTQ180NDMgfCBcCi0JVjRMMl9TVERfUEFMX0JHfCAgVjRMMl9TVERfUEFMX0RLICAgfCAgVjRMMl9TVERfUEFMX0kgICAgfCBcCi0JVjRMMl9TVERfUEFMX00gfCAgVjRMMl9TVERfUEFMX04gICAgfCAgVjRMMl9TVERfUEFMX05jICAgfCBcCi0JVjRMMl9TVERfUEFMXzYwfCAgVjRMMl9TVERfU0VDQU1fTCAgfCAgVjRMMl9TVERfU0VDQU1fREsgKQorLyogQ3VycmVudGx5IHVuc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXI6IFBBTC9ILCBOVFNDL0tyLCBTRUNBTS9MQyAqLworI2RlZmluZSBDWDg4X05PUk1TIChWNEwyX1NURF9BTEwgCQlcCisJCSAgICAmIH5WNEwyX1NURF9QQUxfSAkJXAorCQkgICAgJiB+VjRMMl9TVERfTlRTQ19NX0tSCVwKKwkJICAgICYgflY0TDJfU1REX1NFQ0FNX0xDKQogCiAjZGVmaW5lIEZPUk1BVF9GTEFHU19QQUNLRUQgICAgICAgMHgwMQogI2RlZmluZSBGT1JNQVRfRkxBR1NfUExBTkFSICAgICAgIDB4MDIKQEAgLTIyOSw2ICsyMjgsOSBAQAogI2RlZmluZSBDWDg4X0JPQVJEX1RFVklJX1M0MjAgICAgICAgICAgICAgIDczCiAjZGVmaW5lIENYODhfQk9BUkRfUFJPTElOS19QVl9HTE9CQUxfWFRSRU1FIDc0CiAjZGVmaW5lIENYODhfQk9BUkRfUFJPRl83MzAwICAgICAgICAgICAgICAgNzUKKyNkZWZpbmUgQ1g4OF9CT0FSRF9TQVRUUkFERV9TVDQyMDAgICAgICAgICA3NgorI2RlZmluZSBDWDg4X0JPQVJEX1RCU184OTEwICAgICAgICAgICAgICAgIDc3CisjZGVmaW5lIENYODhfQk9BUkRfUFJPRl82MjAwICAgICAgICAgICAgICAgNzgKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1hdWRpby5jCmluZGV4IDdhOGQ0OWUuLjE1YzAzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1hdWRpby5jCkBAIC00MjQsMTEgKzQyNCwxMiBAQAogCXN0cnVjdCBzbmRfcGNtICAgICAgKnBjbTsKIAlzdHJ1Y3Qgc25kX2NhcmQgICAgICpjYXJkOwogCXN0YXRpYyBpbnQgICAgICAgICAgZGV2bnI7Ci0JaW50ICAgICAgICAgICAgICAgICByZXQsIGVycjsKKwlpbnQgICAgICAgICAgICAgICAgIGVycjsKIAotCWlmIChkZXYtPmhhc19hdWRpb19jbGFzcykgeworCWlmIChkZXYtPmhhc19hbHNhX2F1ZGlvICE9IDEpIHsKIAkJLyogVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uIChpbiB0aGlzIGNhc2UKLQkJICAgdGhlIGRldmljZSBpcyBleHBlY3RpbmcgdGhlIHNuZC11c2ItYXVkaW8gbW9kdWxlICovCisJCSAgIHRoZSBkZXZpY2UgaXMgZXhwZWN0aW5nIHRoZSBzbmQtdXNiLWF1ZGlvIG1vZHVsZSBvcgorCQkgICBkb2Vzbid0IGhhdmUgYW5hbG9nIGF1ZGlvIHN1cHBvcnQgYXQgYWxsKSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ0OSw3ICs0NTAsMTIgQEAKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmYWRldi0+c2xvY2spOwotCXJldCA9IHNuZF9wY21fbmV3KGNhcmQsICJFbTI4eHggQXVkaW8iLCAwLCAwLCAxLCAmcGNtKTsKKwllcnIgPSBzbmRfcGNtX25ldyhjYXJkLCAiRW0yOHh4IEF1ZGlvIiwgMCwgMCwgMSwgJnBjbSk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfZW0yOHh4X3BjbV9jYXB0dXJlKTsKIAlwY20tPmluZm9fZmxhZ3MgPSAwOwogCXBjbS0+cHJpdmF0ZV9kYXRhID0gZGV2OwpAQCAtNDYxLDcgKzQ2Nyw3IEBACiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBlcnI7CiAJfQogCWFkZXYtPnNuZGNhcmQgPSBjYXJkOwogCWFkZXYtPnVkZXYgPSBkZXYtPnVkZXY7CkBAIC00NzUsOSArNDgxLDEwIEBACiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWlmIChkZXYtPmhhc19hdWRpb19jbGFzcykgeworCWlmIChkZXYtPmhhc19hbHNhX2F1ZGlvICE9IDEpIHsKIAkJLyogVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZXh0ZW5zaW9uIChpbiB0aGlzIGNhc2UKLQkJICAgdGhlIGRldmljZSBpcyBleHBlY3RpbmcgdGhlIHNuZC11c2ItYXVkaW8gbW9kdWxlICovCisJCSAgIHRoZSBkZXZpY2UgaXMgZXhwZWN0aW5nIHRoZSBzbmQtdXNiLWF1ZGlvIG1vZHVsZSBvcgorCQkgICBkb2Vzbid0IGhhdmUgYW5hbG9nIGF1ZGlvIHN1cHBvcnQgYXQgYWxsKSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKaW5kZXggZDY1ZDA1Ny4uZTc3NjY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKQEAgLTM3LDYgKzM3LDggQEAKIAogI2luY2x1ZGUgImVtMjh4eC5oIgogCisjZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgImVtMjh4eCIKKwogc3RhdGljIGludCB0dW5lciA9IC0xOwogbW9kdWxlX3BhcmFtKHR1bmVyLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyh0dW5lciwgInR1bmVyIHR5cGUiKTsKQEAgLTQ1LDEyMiArNDcsMTc3IEBACiBtb2R1bGVfcGFyYW0oZGlzYWJsZV9pciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9pciwgImRpc2FibGUgaW5mcmFyZWQgcmVtb3RlIHN1cHBvcnQiKTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW10gICAgID0ge1swIC4uLiAoRU0yOFhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhcmQsICAgICAiY2FyZCB0eXBlIik7CisKKy8qIEJpdG1hc2sgbWFya2luZyBhbGxvY2F0ZWQgZGV2aWNlcyBmcm9tIDAgdG8gRU0yOFhYX01BWEJPQVJEUyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZW0yOHh4X2RldnVzZWQ7CisKIHN0cnVjdCBlbTI4eHhfaGFzaF90YWJsZSB7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXVuc2lnbmVkIGludCAgbW9kZWw7CiAJdW5zaWduZWQgaW50ICB0dW5lcjsKIH07CiAKKy8qCisgKiAgUmVzZXQgc2VxdWVuY2VzIGZvciBhbmFsb2cvZGlnaXRhbCBtb2RlcworICovCisKKy8qIFJlc2V0IGZvciB0aGUgbW9zdCBbYW5hbG9nXSBib2FyZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZGVmYXVsdF9hbmFsb2dbXSA9IHsKKwl7RU0yOFhYX1IwOF9HUElPLAkweDZkLCAgIH5FTV9HUElPXzQsCTEwfSwKKwl7CS0xLAkJLTEsCS0xLAkJLTF9LAorfTsKKworLyogUmVzZXQgZm9yIHRoZSBtb3N0IFtkaWdpdGFsXSBib2FyZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZGVmYXVsdF9kaWdpdGFsW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywJMHg2ZSwJfkVNX0dQSU9fNCwJMTB9LAorCXsJLTEsCQktMSwJLTEsCQktMX0sCit9OworCisvKiBCb2FyZCBIYXVwcGF1Z2UgV2luVFYgSFZSIDkwMCBhbmFsb2cgKi8KK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywJMHgyZCwJfkVNX0dQSU9fNCwJMTB9LAorCXsweDA1LAkJCTB4ZmYsCTB4MTAsCQkxMH0sCisJeyAgLTEsCQkJLTEsCS0xLAkJLTF9LAorfTsKKworLyogQm9hcmQgSGF1cHBhdWdlIFdpblRWIEhWUiA5MDAgZGlnaXRhbCAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9kaWdpdGFsW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywJMHgyZSwJfkVNX0dQSU9fNCwJMTB9LAorCXtFTTI4ODBfUjA0X0dQTywJMHgwNCwJMHgwZiwJCTEwfSwKKwl7RU0yODgwX1IwNF9HUE8sCTB4MGMsCTB4MGYsCQkxMH0sCisJeyAtMSwJCQktMSwJLTEsCQktMX0sCit9OworCisvKiBCb2FyZHMgLSBFTTI4ODAgTVNJIERJR0lWT1ggQUQgYW5kIEVNMjg4MF9CT0FSRF9NU0lfRElHSVZPWF9BRF9JSSAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBlbTI4ODBfbXNpX2RpZ2l2b3hfYWRfYW5hbG9nW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywgICAgICAgMHg2OSwgICB+RU1fR1BJT180LAkgMTB9LAorCXsJLTEsCQktMSwJLTEsCQkgLTF9LAorfTsKKworLyogQm9hcmRzIC0gRU0yODgwIE1TSSBESUdJVk9YIEFEIGFuZCBFTTI4ODBfQk9BUkRfTVNJX0RJR0lWT1hfQURfSUkgKi8KKworLyogQm9hcmQgIC0gRU0yODcwIEt3b3JsZCAzNTV1CisgICBBbmFsb2cgLSBObyBpbnB1dCBhbmFsb2cgKi8KKworLyogQ2FsbGJhY2sgZm9yIHRoZSBtb3N0IGJvYXJkcyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBkZWZhdWx0X3R1bmVyX2dwaW9bXSA9IHsKKwl7RU0yOFhYX1IwOF9HUElPLAlFTV9HUElPXzQsCUVNX0dQSU9fNCwJMTB9LAorCXtFTTI4WFhfUjA4X0dQSU8sCTAsCQlFTV9HUElPXzQsCTEwfSwKKwl7RU0yOFhYX1IwOF9HUElPLAlFTV9HUElPXzQsCUVNX0dQSU9fNCwJMTB9LAorCXsgIC0xLAkJCS0xLAkJLTEsCQktMX0sCit9OworCisvKgorICogIEJvYXJkIGRlZmluaXRpb25zCisgKi8KIHN0cnVjdCBlbTI4eHhfYm9hcmQgZW0yOHh4X2JvYXJkc1tdID0gewogCVtFTTI3NTBfQk9BUkRfVU5LTk9XTl0gPSB7CiAJCS5uYW1lICAgICAgICAgID0gIlVua25vd24gRU0yNzUwL0VNMjc1MSB3ZWJjYW0gZ3JhYmJlciIsCi0JCS52Y2hhbm5lbHMgICAgID0gMSwKKwkJLnhjbGsgICAgICAgICAgPSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfNDhNSFosCisJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULAkvKiBUaGlzIGlzIGEgd2ViY2FtICovCiAJCS5pbnB1dCAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSB9LAogCX0sCiAJW0VNMjgwMF9CT0FSRF9VTktOT1dOXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJVbmtub3duIEVNMjgwMCB2aWRlbyBncmFiYmVyIiwKIAkJLmlzX2VtMjgwMCAgICA9IDEsCi0JCS52Y2hhbm5lbHMgICAgPSAyLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICAgPSB7IHsKKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODIwX0JPQVJEX1VOS05PV05dID0gewotCQkubmFtZSAgICAgICAgID0gIlVua25vd24gRU0yNzUwLzI4eHggdmlkZW8gZ3JhYmJlciIsCi0JCS5pc19lbTI4MDAgICAgPSAwLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAorCQkubmFtZSAgICAgICAgICA9ICJVbmtub3duIEVNMjc1MC8yOHh4IHZpZGVvIGdyYWJiZXIiLAorCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0FCU0VOVCwKIAl9LAogCVtFTTI3NTBfQk9BUkRfRExDV18xMzBdID0gewogCQkvKiBCZWlqaW5nIEh1YXFpIEluZm9ybWF0aW9uIERpZ2l0YWwgVGVjaG5vbG9neSBDby4sIEx0ZCAqLwogCQkubmFtZSAgICAgICAgICA9ICJIdWFxaSBETENXLTEzMCIsCiAJCS52YWxpZCAgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgID0gMSwKKwkJLnhjbGsgICAgICAgICAgPSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfNDhNSFosCisJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULAkvKiBUaGlzIGlzIGEgd2ViY2FtICovCiAJCS5pbnB1dCAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9LV09STERfUFZSVFYyODAwUkZdID0gewogCQkubmFtZSAgICAgICAgID0gIkt3b3JsZCBQVlIgVFYgMjgwMCBSRiIsCi0JCS5pc19lbTI4MDAgICAgPSAwLAotCQkudmNoYW5uZWxzICAgID0gMiwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1RFTUlDX1BBTCwKIAkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAotCQkuaW5wdXQgICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzI1MF0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSAyNTAgVVNCIiwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODIwX0JPQVJEX1BJTk5BQ0xFX1VTQl8yXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFVTQiAyIiwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfVVNCXzJdID0gewogCQkubmFtZSAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgMiIsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5UIHwKIAkJCQlUREE5ODg3X1BPUlQxX0FDVElWRXwKIAkJCQlUREE5ODg3X1BPUlQyX0FDVElWRSwKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAogCQkuaGFzX21zcDM0eHggID0gMSwKLQkJLypGSVhNRTogUy1WaWRlbyBub3QgdGVzdGVkICovCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gTVNQX0lOUFVUX0RFRkFVTFQsCkBAIC0xNzQsMzI3ICsyMzEsMzA1IEBACiAJW0VNMjgyMF9CT0FSRF9ETElOS19VU0JfVFZdID0gewogCQkubmFtZSAgICAgICAgID0gIkQtTGluayBEVUItVDIxMCBUViBUdW5lciIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS5pc19lbTI4MDAgICAgPSAwLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9IRVJDVUxFU19TTUFSVF9UVl9VU0IyXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBVU0IgMi4wIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKIAkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAorCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCiAJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9QSU5OQUNMRV9VU0JfMl9GTTEyMTZNRV0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiUGlubmFjbGUgUENUViBVU0IgMiAoUGhpbGlwcyBGTTEyMTZNRSkiLAogCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAotCQkuaXNfZW0yODAwICAgID0gMCwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0gfSwKIAl9LAogCVtFTTI4MjBfQk9BUkRfR0FETUVJX1VUVjMxMF0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiR2FkbWVpIFVUVjMxMCIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9UTkZfNTMzNU1GLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfVVNCSUlfREVMVVhFXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJMZWFkdGVrIFdpbmZhc3QgVVNCIElJIERlbHV4ZSIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKIAkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTE0LAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAotCQkJLnZtdXggICAgID0gMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKLQkJCS52bXV4ICAgICA9IDAsCi0JCQkuYW11eCAgICAgPSAxLAotCQl9LCB7Ci0JCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAotCQkJLmFtdXggICAgID0gMSwKLQkJfSB9LAotCX0sCi0JW0VNMjgyMF9CT0FSRF9QSU5OQUNMRV9EVkNfMTAwXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJQaW5uYWNsZSBEYXp6bGUgRFZDIDEwMCIsCi0JCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7Ci0JCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKLQkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODIwX0JPQVJEX1ZJREVPTE9HWV8yMEsxNFhVU0JdID0gewotCQkubmFtZSAgICAgICAgICA9ICJWaWRlb2xvZ3kgMjBLMTRYVVNCIFVTQjIuMCIsCisJCS5uYW1lICAgICAgICAgPSAiVmlkZW9sb2d5IDIwSzE0WFVTQiBVU0IyLjAiLAogCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgID0gMSwKLQkJLmlucHV0ICAgICAgICAgPSB7IHsKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0FCU0VOVCwJLyogVGhpcyBpcyBhIHdlYmNhbSAqLworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSB9LAogCX0sCiAJW0VNMjgyMV9CT0FSRF9QUk9MSU5LX1BMQVlUVl9VU0IyXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJTSUlHIEFWVHVuZXItUFZSL1Byb2xpbmsgUGxheVRWIFVTQiAyLjAiLAogCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAotCQkuaXNfZW0yODAwICAgID0gMCwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywJLyogdW5rbm93bj8gKi8KIAkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwJLyogdW5rbm93bj8gKi8KLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0gfSwKIAl9LAogCVtFTTI4MjFfQk9BUkRfU1VQRVJDT01QX1VTQl8yXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJTdXBlcmNvbXAgVVNCIDIuMCBUViIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS5pc19lbTI4MDAgICAgPSAwLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5UIHwKIAkJCQlUREE5ODg3X1BPUlQxX0FDVElWRSB8CiAJCQkJVERBOTg4N19QT1JUMl9BQ1RJVkUsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMV9CT0FSRF9VU0JHRUFSX1ZEMjA0XSA9IHsKLQkJLm5hbWUgICAgICAgICAgPSAiVXNiZ2VhciBWRDIwNHY5IiwKKwkJLm5hbWUgICAgICAgICA9ICJVc2JnZWFyIFZEMjA0djkiLAogCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgID0gMiwKLQkJLmRlY29kZXIgICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsCS8qIENhcHR1cmUgb25seSBkZXZpY2UgKi8KKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggID0gMSwKKwkJCS5hbXV4ICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICA9IDEsCisJCQkuYW11eCAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODYwX0JPQVJEX05FVEdNQkhfQ0FNXSA9IHsKIAkJLyogQmVpamluZyBIdWFxaSBJbmZvcm1hdGlvbiBEaWdpdGFsIFRlY2hub2xvZ3kgQ28uLCBMdGQgKi8KLQkJLm5hbWUgICAgICAgICAgPSAiTmV0R01CSCBDYW0iLAotCQkudmFsaWQgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICAgPSAxLAotCQkuaW5wdXQgICAgICAgICA9IHsgeworCQkubmFtZSAgICAgICAgID0gIk5ldEdNQkggQ2FtIiwKKwkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAkvKiBUaGlzIGlzIGEgd2ViY2FtICovCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSAwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAogCQl9IH0sCiAJfSwKIAlbRU0yODYwX0JPQVJEX1RZUEhPT05fRFZEX01BS0VSXSA9IHsKLQkJLm5hbWUgICAgICAgICAgPSAiVHlwaG9vbiBEVkQgTWFrZXIiLAotCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgID0gMiwKLQkJLmRlY29kZXIgICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5uYW1lICAgICAgICAgPSAiVHlwaG9vbiBEVkQgTWFrZXIiLAorCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsCS8qIENhcHR1cmUgb25seSBkZXZpY2UgKi8KKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICA9IDEsCisJCQkuYW11eCAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgPSAxLAorCQkJLmFtdXggID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjg2MF9CT0FSRF9HQURNRUlfVVRWMzMwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJHYWRtZWkgVVRWMzMwIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1RORl81MzM1TUYsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjg2MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFNdID0gewogCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgQSBIeWJyaWQgWFMiLAogCQkudmFsaWQgICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg2MV9CT0FSRF9LV09STERfUFZSVFZfMzAwVV0gPSB7CiAJCS5uYW1lCSAgICAgID0gIktXb3JsZCBQVlJUViAzMDBVIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODYxX0JPQVJEX1lBS1VNT19NT1ZJRV9NSVhFUl0gPSB7CiAJCS5uYW1lICAgICAgICAgID0gIllha3VtbyBNb3ZpZU1peGVyIiwKLQkJLnZhbGlkICAgICAgID0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQsCi0JCS52Y2hhbm5lbHMgICAgID0gMSwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0FCU0VOVCwJLyogQ2FwdHVyZSBvbmx5IGRldmljZSAqLwogCQkuZGVjb2RlciAgICAgICA9IEVNMjhYWF9UVlA1MTUwLAogCQkuaW5wdXQgICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODYxX0JPQVJEX1BMRVhUT1JfUFhfVFYxMDBVXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJQbGV4dG9yIENvbnZlcnRYIFBYLVRWMTAwVSIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9UTkZfNTMzNU1GLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCisKKwkvKiBUaG9zZSBib2FyZHMgd2l0aCBlbTI4NzAgYXJlIERWQiBPbmx5Ki8KKwogCVtFTTI4NzBfQk9BUkRfVEVSUkFURUNfWFNdID0gewogCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgVCBYUyIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAl9LAogCVtFTTI4NzBfQk9BUkRfVEVSUkFURUNfWFNfTVQyMDYwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IFQgWFMgKE1UMjA2MCkiLApAQCAtNTA1LDYgKzU0MCw3IEBACiAJCS5uYW1lICAgICAgICAgPSAiS3dvcmxkIDM1MCBVIERWQi1UIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCX0sCiAJW0VNMjg3MF9CT0FSRF9LV09STERfMzU1VV0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiS3dvcmxkIDM1NSBVIERWQi1UIiwKQEAgLTUxNCwxNjQgKzU1MCwyMTYgQEAKIAkJLm5hbWUgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIERWQi1UIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULCAvKiBNVDIwNjAgKi8KKwkJLyogZGpoIC0gSSBoYXZlIHNlcmlvdXMgZG91YnRzIHRoaXMgaXMgcmlnaHQuLi4gKi8KKwkJLnhjbGsgICAgICAgICA9IEVNMjhYWF9YQ0xLX0lSX1JDNV9NT0RFIHwKKwkJCQlFTTI4WFhfWENMS19GUkVRVUVOQ1lfMTBNSFosCiAJfSwKIAlbRU0yODcwX0JPQVJEX0NPTVBST19WSURFT01BVEVdID0gewogCQkubmFtZSAgICAgICAgID0gIkNvbXBybywgVmlkZW9NYXRlIFUzIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULCAvKiBNVDIwNjAgKi8KIAl9LAorCiAJW0VNMjg4MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFNfRlJdID0gewogCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIEh5YnJpZCBYUyBTZWNhbSIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS5oYXNfbXNwMzR4eCAgPSAxLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gICAgID0gZGVmYXVsdF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gZGVmYXVsdF9hbmFsb2csCiAJCX0gfSwKIAl9LAogCVtFTTI4ODBfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85MDBdID0gewogCQkubmFtZSAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBIVlIgOTAwIiwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9ncGlvICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5tdHNfZmlybXdhcmUgPSAxLAotCQkuaGFzX2R2YiAgICAgICAgPSAxLAorCQkuaGFzX2R2YiAgICAgID0gMSwKKwkJLmR2Yl9ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2RpZ2l0YWwsCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMF9SMl0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIEhWUiA5MDAgKFIyKSIsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkubXRzX2Zpcm13YXJlID0gMSwKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDMsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAorCQl9IH0sCisJfSwKKwlbRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfODUwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBIVlIgODUwIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCisJCS5tdHNfZmlybXdhcmUgICA9IDEsCisJCS5oYXNfZHZiICAgICAgICA9IDEsCisJCS5kdmJfZ3BpbyAgICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2RpZ2l0YWwsCisJCS5pcl9jb2RlcyAgICAgICA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXcsCisJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9UVlA1MTUwLAorCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKKwkJfSwgeworCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCisJCX0sIHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgSFZSIDk1MCIsCi0JCS52Y2hhbm5lbHMgICAgICA9IDMsCi0JCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5tdHNfZmlybXdhcmUgICA9IDEsCi0JCS5oYXNfMTJtaHpfaTJzICA9IDEsCiAJCS5oYXNfZHZiICAgICAgICA9IDEsCisJCS5kdmJfZ3BpbyAgICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2RpZ2l0YWwsCisJCS5pcl9jb2RlcyAgICAgICA9IGlyX2NvZGVzX2hhdXBwYXVnZV9uZXcsCiAJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9UVlA1MTUwLAogCQkuaW5wdXQgICAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4MF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEX1BST10gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIEhEIFBybyBTdGljayIsCi0JCS52Y2hhbm5lbHMgICAgICA9IDMsCi0JCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkubXRzX2Zpcm13YXJlICAgPSAxLAotCQkuaGFzXzEybWh6X2kycyAgPSAxLAogCQkuaGFzX2R2YiAgICAgICAgPSAxLAorCQkuZHZiX2dwaW8gICAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9kaWdpdGFsLAorCQkuaXJfY29kZXMgICAgICAgPSBpcl9jb2Rlc19waW5uYWNsZV9wY3R2X2hkLAogCQkuZGVjb2RlciAgICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKIAkJLmlucHV0ICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0gfSwKIAl9LAogCVtFTTI4ODBfQk9BUkRfQU1EX0FUSV9UVl9XT05ERVJfSERfNjAwXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkFNRCBBVEkgVFYgV29uZGVyIEhEIDYwMCIsCi0JCS52Y2hhbm5lbHMgICAgICA9IDMsCi0JCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5tdHNfZmlybXdhcmUgICA9IDEsCi0JCS5oYXNfMTJtaHpfaTJzICA9IDEsCiAJCS5oYXNfZHZiICAgICAgICA9IDEsCisJCS5kdmJfZ3BpbyAgICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2RpZ2l0YWwsCisJCS5pcl9jb2RlcyAgICAgICA9IGlyX2NvZGVzX2F0aV90dl93b25kZXJfaGRfNjAwLAogCQkuZGVjb2RlciAgICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKIAkJLmlucHV0ICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0gfSwKIAl9LAogCVtFTTI4ODBfQk9BUkRfVEVSUkFURUNfSFlCUklEX1hTXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJUZXJyYXRlYyBIeWJyaWQgWFMiLAotCQkudmNoYW5uZWxzICAgID0gMywKLQkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAorCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgSHlicmlkIFhTIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfZ3BpbyAgICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCisJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9UVlA1MTUwLAogCQkuaGFzX2R2YiAgICAgICAgPSAxLAorCQkuZHZiX2dwaW8gICAgICAgPSBkZWZhdWx0X2FuYWxvZywKIAkJLmlucHV0ICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gICAgID0gZGVmYXVsdF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gZGVmYXVsdF9hbmFsb2csCiAJCX0gfSwKIAl9LAogCS8qIG1heWJlIHRoZXJlJ3MgYSByZWFzb24gYmVoaW5kIGl0IHdoeSBUZXJyYXRlYyBzZWxscyB0aGUgSHlicmlkIFhTCkBAIC02NzksMTcyICs3NjcsMTkwIEBACiAJICAgbWF5YmUgd2UnbGwgbmVlZCBpdCBsYXRlcm9uICovCiAJW0VNMjg4MF9CT0FSRF9URVJSQVRFQ19QUk9ESUdZX1hTXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJUZXJyYXRlYyBQcm9kaWd5IFhTIiwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9ncGlvICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9NU0lfVk9YX1VTQl8yXSA9IHsKIAkJLm5hbWUJCSAgID0gIk1TSSBWT1ggVVNCIDIuMCIsCi0JCS52Y2hhbm5lbHMJICAgPSAzLAogCQkudHVuZXJfdHlwZQkgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKIAkJLnRkYTk4ODdfY29uZgkgICA9IFREQTk4ODdfUFJFU0VOVCAgICAgIHwKIAkJCQkgICAgIFREQTk4ODdfUE9SVDFfQUNUSVZFIHwKIAkJCQkgICAgIFREQTk4ODdfUE9SVDJfQUNUSVZFLAogCQkubWF4X3JhbmdlXzY0MF80ODAgPSAxLAotCi0JCS5kZWNvZGVyICAgICAgICAgICA9IEVNMjhYWF9TQUE3MTE0LAorCQkuZGVjb2RlciAgICAgICAgICAgPSBFTTI4WFhfU0FBNzExWCwKIAkJLmlucHV0ICAgICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTQsCi0JCQkuYW11eCAgICAgID0gMCwKKwkJCS5hbXV4ICAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgICA9IDEsCisJCQkuYW11eCAgICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSwgewogCQkJLnR5cGUgICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgID0gMSwKKwkJCS5hbXV4ICAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODAwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMjAwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDIwMCBVU0IiLAogCQkuaXNfZW0yODAwICAgID0gMSwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgwMF9CT0FSRF9HUkFCQkVFWF9VU0IyODAwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJlTVBJQSBUZWNobm9sb2d5LCBJbmMuIEdyYWJCZWVYKyBWaWRlbyBFbmNvZGVyIiwKIAkJLmlzX2VtMjgwMCAgICA9IDEsCi0JCS52Y2hhbm5lbHMgICAgPSAyLAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsIC8qIGNhcHR1cmUgb25seSBib2FyZCAqLworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODAwX0JPQVJEX0xFQURURUtfV0lORkFTVF9VU0JJSV0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiTGVhZHRlayBXaW5mYXN0IFVTQiBJSSIsCiAJCS5pc19lbTI4MDAgICAgPSAxLAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKIAkJLnRkYTk4ODdfY29uZiA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAotCQkJLmFtdXggICAgID0gMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODAwX0JPQVJEX0tXT1JMRF9VU0IyODAwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJLd29ybGQgVVNCMjgwMCIsCiAJCS5pc19lbTI4MDAgICAgPSAxLAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1BISUxJUFNfRkNWMTIzNkQsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKIAkJfSB9LAogCX0sCiAJW0VNMjgyMF9CT0FSRF9QSU5OQUNMRV9EVkNfOTBdID0gewogCQkubmFtZSAgICAgICAgID0gIlBpbm5hY2xlIERhenpsZSBEVkMgOTAvRFZDIDEwMCIsCi0JCS52Y2hhbm5lbHMgICAgPSAzLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULCAvKiBjYXB0dXJlIG9ubHkgYm9hcmQgKi8KKwkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTFYLAorCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODAwX0JPQVJEX1ZHRUFSX1BPQ0tFVFRWXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJWLUdlYXIgUG9ja2V0VFYiLAogCQkuaXNfZW0yODAwICAgID0gMSwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCi0JCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJfSB9LAorCX0sCisJW0VNMjgyMF9CT0FSRF9QUk9MSU5LX1BMQVlUVl9CT1g0X1VTQjJdID0geworCQkubmFtZSAgICAgICAgID0gIlBpeGVsdmlldyBQbGF5VFYgQm94IDQgVVNCIDIuMCIsCisJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9ZTUVDX1RWRl81NTMzTUYsCisJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExWCwKKwkJLmlucHV0ICAgICAgICA9IHsgeworCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAorCQkJLmFvdXQgICAgID0gRU0yOFhYX0FPVVRfTU9OTyB8IAkvKiBJMlMgKi8KKwkJCQkgICAgRU0yOFhYX0FPVVRfTUFTVEVSLAkvKiBMaW5lIG91dCBwaW4gKi8KKwkJfSwgeworCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCX0sIHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCiAJCX0gfSwKIAl9LAogCVtFTTI4MjBfQk9BUkRfUFJPTElOS19QTEFZVFZfVVNCMl0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiUGl4ZWx2aWV3IFByb2xpbmsgUGxheVRWIFVTQiAyLjAiLAotCQkudmNoYW5uZWxzICAgID0gMywKKwkJLmhhc19zbmFwc2hvdF9idXR0b24gPSAxLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWU1FQ19UVkZfNTUzM01GLAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCi0JCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuYW91dCAgICAgPSBFTTI4WFhfQU9VVF9NT05PIHwgCS8qIEkyUyAqLworCQkJCSAgICBFTTI4WFhfQU9VVF9NQVNURVIsCS8qIExpbmUgb3V0IHBpbiAqLwogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLApAQCAtODU2LDIyOCArOTYyLDI1MiBAQAogCQl9IH0sCiAJfSwKIAlbRU0yODYwX0JPQVJEX1BPSU5UTklYX0lOVFJBT1JBTF9DQU1FUkFdID0gewotCQkubmFtZSAgICAgICAgID0gIlBvaW50Tml4IEludHJhLU9yYWwgQ2FtZXJhIiwKKwkJLm5hbWUgICAgICAgICAgICAgICAgPSAiUG9pbnROaXggSW50cmEtT3JhbCBDYW1lcmEiLAogCQkuaGFzX3NuYXBzaG90X2J1dHRvbiA9IDEsCi0JCS52Y2hhbm5lbHMgICAgPSAxLAotCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkudGRhOTg4N19jb25mICAgICAgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLnR1bmVyX3R5cGUgICAgICAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5kZWNvZGVyICAgICAgICAgICAgID0gRU0yOFhYX1NBQTcxMVgsCisJCS5pbnB1dCAgICAgICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCiAJCX0gfSwKIAl9LAogCVtFTTI4ODBfQk9BUkRfTVNJX0RJR0lWT1hfQURdID0gewogCQkubmFtZSAgICAgICAgID0gIk1TSSBEaWdpVm94IEEvRCIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9ncGlvICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBlbTI4ODBfbXNpX2RpZ2l2b3hfYWRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBlbTI4ODBfbXNpX2RpZ2l2b3hfYWRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gZW0yODgwX21zaV9kaWdpdm94X2FkX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4MF9CT0FSRF9NU0lfRElHSVZPWF9BRF9JSV0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiTVNJIERpZ2lWb3ggQS9EIElJIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGVtMjg4MF9tc2lfZGlnaXZveF9hZF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGVtMjg4MF9tc2lfZGlnaXZveF9hZF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBlbTI4ODBfbXNpX2RpZ2l2b3hfYWRfYW5hbG9nLAogCQl9IH0sCiAJfSwKIAlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzA1VV0gPSB7CiAJCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMDVVIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKLQkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAotCQl9LCB7Ci0JCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKLQkJfSwgewotCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAotCQl9IH0sCi0JfSwKLQlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzEwVV0gPSB7Ci0JCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMTBVIiwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCi0JCS5oYXNfZHZiICAgICAgPSAxLAotCQkubXRzX2Zpcm13YXJlID0gMSwKLQkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX1ZJREVPLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfQUM5N19MSU5FX0lOLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJfSwgeworCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQl9IH0sCisJfSwKKwlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzEwVV0gPSB7CisJCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMTBVIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKKwkJLmhhc19kdmIgICAgICA9IDEsCisJCS5kdmJfZ3BpbyAgICAgPSBkZWZhdWx0X2RpZ2l0YWwsCisJCS5tdHNfZmlybXdhcmUgPSAxLAorCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCisJCS5pbnB1dCAgICAgICAgPSB7IHsKKwkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAorCQl9LCB7CisJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9LCB7CS8qIFMtdmlkZW8gaGFzIG5vdCBiZWVuIHRlc3RlZCB5ZXQgKi8KIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfQUM5N19MSU5FX0lOLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9IH0sCiAJfSwKIAlbRU0yODgxX0JPQVJEX0ROVF9EQTJfSFlCUklEXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJETlQgREEyIEh5YnJpZCIsCiAJCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKLQkJLnZjaGFubmVscyAgICA9IDMsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9ncGlvICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBkZWZhdWx0X2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gZGVmYXVsdF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBkZWZhdWx0X2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4MV9CT0FSRF9QSU5OQUNMRV9IWUJSSURfUFJPXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJQaW5uYWNsZSBIeWJyaWQgUHJvIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBkZWZhdWx0X2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9IH0sCiAJfSwKIAlbRU0yODgyX0JPQVJEX1BJTk5BQ0xFX0hZQlJJRF9QUk9dID0gewogCQkubmFtZSAgICAgICAgID0gIlBpbm5hY2xlIEh5YnJpZCBQcm8gKDIpIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLm10c19maXJtd2FyZSA9IDEsCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5pbnB1dCAgICAgICAgPSB7IHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAwLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX0NPTVBPU0lURTEsCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9TVklERU8sCi0JCQkuYW11eCAgICAgPSAxLAorCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSB9LAogCX0sCiAJW0VNMjg4Ml9CT0FSRF9LV09STERfVlNfRFZCVF0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiS3dvcmxkIFZTLURWQi1UIDMyM1VSIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAogCQl9IH0sCiAJfSwKIAlbRU0yODgyX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YU10gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgSHlicmlkIFhTIChlbTI4ODIpIiwKIAkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLAotCQkuaW5wdXQgICAgICAgICAgPSB7IHsKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nLAogCQl9IH0sCiAJfSwKIAlbRU0yODgzX0JPQVJEX0tXT1JMRF9IWUJSSURfQTMxNl0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiS3dvcmxkIFBsdXNUViBIRCBIeWJyaWQgMzMwIiwKLQkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkudmNoYW5uZWxzICAgID0gMywKLQkJLmlzX2VtMjgwMCAgICA9IDAsCiAJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9ncGlvICAgPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfVFZQNTE1MCwKLQkJLmlucHV0ICAgICAgICAgID0geyB7CisJCS5tdHNfZmlybXdhcmUgPSAxLAorCQkuaGFzX2R2YiAgICAgID0gMSwKKwkJLmR2Yl9ncGlvICAgICA9IGRlZmF1bHRfZGlnaXRhbCwKKwkJLmlucHV0ICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKKwkJCS5ncGlvICAgICA9IGRlZmF1bHRfYW5hbG9nLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUxLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0sIHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAotCQkJLmFtdXggICAgID0gMSwKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9hbmFsb2csCiAJCX0gfSwKIAl9LAogCVtFTTI4MjBfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9GT1JZT1VdID0gewogCQkubmFtZSAgICAgICAgID0gIkNvbXBybyBWaWRlb01hdGUgRm9yWW91L1N0ZXJlbyIsCi0JCS52Y2hhbm5lbHMgICAgPSAyLAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgeworCQkuaW5wdXQgICAgICAgID0geyB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gRU0yOFhYX0FNVVhfTElORV9JTiwKQEAgLTExMDEsNyArMTIzMSw3IEBACiAJeyBVU0JfREVWSUNFKDB4ZWIxYSwgMHgyODIwKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjgyMF9CT0FSRF9VTktOT1dOIH0sCiAJeyBVU0JfREVWSUNFKDB4ZWIxYSwgMHgyODIxKSwKLQkJCS5kcml2ZXJfaW5mbyA9IEVNMjgyMF9CT0FSRF9QUk9MSU5LX1BMQVlUVl9VU0IyIH0sCisJCQkuZHJpdmVyX2luZm8gPSBFTTI4MjBfQk9BUkRfVU5LTk9XTiB9LAogCXsgVVNCX0RFVklDRSgweGViMWEsIDB4Mjg2MCksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4MjBfQk9BUkRfVU5LTk9XTiB9LAogCXsgVVNCX0RFVklDRSgweGViMWEsIDB4Mjg2MSksCkBAIC0xMTY0LDggKzEyOTQsOCBAQAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTUwIH0sCiAJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NTFiKSwgLyogUlAgIEhWUi05NTAgKi8KIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MCB9LAotCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NjUxZiksIC8qIEhDVyBIVlItODUwICovCi0JCQkuZHJpdmVyX2luZm8gPSBFTTI4ODNfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85NTAgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDY1MWYpLAorCQkJLmRyaXZlcl9pbmZvID0gRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfODUwIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQzOCwgMHhiMDAyKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4MF9CT0FSRF9BTURfQVRJX1RWX1dPTkRFUl9IRF82MDAgfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDAxLCAweGYxMTIpLApAQCAtMTE4OSw3OCArMTMxOSwxMiBAQAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGVtMjh4eF9pZF90YWJsZSk7CiAKIC8qCi0gKiAgUmVzZXQgc2VxdWVuY2VzIGZvciBhbmFsb2cvZGlnaXRhbCBtb2RlcwotICovCi0KLS8qIFJlc2V0IGZvciB0aGUgbW9zdCBbYW5hbG9nXSBib2FyZHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZGVmYXVsdF9hbmFsb2dbXSA9IHsKLQl7RU0yOFhYX1IwOF9HUElPLAkweDZkLCAgIH5FTV9HUElPXzQsCTEwfSwKLQl7CS0xLAkJLTEsCS0xLAkJLTF9LAotfTsKLQotLyogUmVzZXQgZm9yIHRoZSBtb3N0IFtkaWdpdGFsXSBib2FyZHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZGVmYXVsdF9kaWdpdGFsW10gPSB7Ci0Je0VNMjhYWF9SMDhfR1BJTywJMHg2ZSwJfkVNX0dQSU9fNCwJMTB9LAotCXsJLTEsCQktMSwJLTEsCQktMX0sCi19OwotCi0vKiBCb2FyZCBIYXVwcGF1Z2UgV2luVFYgSFZSIDkwMCBhbmFsb2cgKi8KLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nW10gPSB7Ci0Je0VNMjhYWF9SMDhfR1BJTywJMHgyZCwJfkVNX0dQSU9fNCwJMTB9LAotCXsweDA1LAkJCTB4ZmYsCTB4MTAsCQkxMH0sCi0JeyAgLTEsCQkJLTEsCS0xLAkJLTF9LAotfTsKLQotLyogQm9hcmQgSGF1cHBhdWdlIFdpblRWIEhWUiA5MDAgZGlnaXRhbCAqLwotc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9kaWdpdGFsW10gPSB7Ci0Je0VNMjhYWF9SMDhfR1BJTywJMHgyZSwJfkVNX0dQSU9fNCwJMTB9LAotCXtFTTI4ODBfUjA0X0dQTywJMHgwNCwJMHgwZiwJCTEwfSwKLQl7RU0yODgwX1IwNF9HUE8sCTB4MGMsCTB4MGYsCQkxMH0sCi0JeyAtMSwJCQktMSwJLTEsCQktMX0sCi19OwotCi0vKiBCb2FyZHMgLSBFTTI4ODAgTVNJIERJR0lWT1ggQUQgYW5kIEVNMjg4MF9CT0FSRF9NU0lfRElHSVZPWF9BRF9JSSAqLwotc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBlbTI4ODBfbXNpX2RpZ2l2b3hfYWRfYW5hbG9nW10gPSB7Ci0Je0VNMjhYWF9SMDhfR1BJTywgICAgICAgMHg2OSwgICB+RU1fR1BJT180LAkgMTB9LAotCXsJLTEsCQktMSwJLTEsCQkgLTF9LAotfTsKLQotLyogQm9hcmRzIC0gRU0yODgwIE1TSSBESUdJVk9YIEFEIGFuZCBFTTI4ODBfQk9BUkRfTVNJX0RJR0lWT1hfQURfSUkgKi8KLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZW0yODgwX21zaV9kaWdpdm94X2FkX2RpZ2l0YWxbXSA9IHsKLQl7RU0yOFhYX1IwOF9HUElPLAkweDZhLAl+RU1fR1BJT180LAkxMH0sCi0JewktMSwJCS0xLAktMSwJCS0xfSwKLX07Ci0KLS8qIEJvYXJkICAtIEVNMjg3MCBLd29ybGQgMzU1dQotICAgQW5hbG9nIC0gTm8gaW5wdXQgYW5hbG9nICovCi1zdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIGVtMjg3MF9rd29ybGRfMzU1dV9kaWdpdGFsW10gPSB7Ci0Je0VNMjg4MF9SMDRfR1BPLAkweDAxLAkweGZmLAkJMTB9LAotCXsgIC0xLAkJCS0xLAktMSwJCS0xfSwKLX07Ci0KLS8qIENhbGxiYWNrIGZvciB0aGUgbW9zdCBib2FyZHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgZGVmYXVsdF9jYWxsYmFja1tdID0gewotCXtFTTI4WFhfUjA4X0dQSU8sCUVNX0dQSU9fNCwJRU1fR1BJT180LAkxMH0sCi0Je0VNMjhYWF9SMDhfR1BJTywJMCwJCUVNX0dQSU9fNCwJMTB9LAotCXtFTTI4WFhfUjA4X0dQSU8sCUVNX0dQSU9fNCwJRU1fR1BJT180LAkxMH0sCi0JeyAgLTEsCQkJLTEsCQktMSwJCS0xfSwKLX07Ci0KLS8qIENhbGxiYWNrIGZvciBFTTI4ODIgVEVSUkFURUMgSFlCUklEIFhTICovCi1zdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIGVtMjg4Ml90ZXJyYXRlY19oeWJyaWRfeHNfZGlnaXRhbFtdID0gewotCXtFTTI4WFhfUjA4X0dQSU8sICAgICAgIDB4MmUsICAgMHhmZiwJCSAgIDZ9LAotCXtFTTI4WFhfUjA4X0dQSU8sICAgICAgIDB4M2UsICAgfkVNX0dQSU9fNCwJICAgNn0sCi0Je0VNMjg4MF9SMDRfR1BPLCAgICAgICAgMHgwNCwgICAweGZmLAkJICAxMH0sCi0Je0VNMjg4MF9SMDRfR1BPLCAgICAgICAgMHgwYywgICAweGZmLAkJICAxMH0sCi0JeyAgLTEsCQkJLTEsCS0xLAkJICAtMX0sCi19OwotCi0vKgogICogRUVQUk9NIGhhc2ggdGFibGUgZm9yIGRldmljZXMgd2l0aCBnZW5lcmljIFVTQiBJRHMKICAqLwogc3RhdGljIHN0cnVjdCBlbTI4eHhfaGFzaF90YWJsZSBlbTI4eHhfZWVwcm9tX2hhc2ggW10gPSB7CiAJLyogUC9OOiBTQSA2MDAwMjA3MDQ2NSBUdW5lcjogVFZGNzUzMy1NRiAqLwogCXsweDZjZTA1YThmLCBFTTI4MjBfQk9BUkRfUFJPTElOS19QTEFZVFZfVVNCMiwgVFVORVJfWU1FQ19UVkZfNTUzM01GfSwKKwl7MHg3MmNjNWE4YiwgRU0yODIwX0JPQVJEX1BST0xJTktfUExBWVRWX0JPWDRfVVNCMiwgVFVORVJfWU1FQ19UVkZfNTUzM01GfSwKIAl7MHg5NjZhMDQ0MSwgRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzEwVSwgVFVORVJfWEMyMDI4fSwKIH07CiAKQEAgLTEyODIsMjcgKzEzNDYsMjYgQEAKIAlpZiAoY29tbWFuZCAhPSBYQzIwMjhfVFVORVJfUkVTRVQpCiAJCXJldHVybiAwOwogCi0JaWYgKGRldi0+bW9kZSA9PSBFTTI4WFhfQU5BTE9HX01PREUpCi0JCXJjID0gZW0yOHh4X2dwaW9fc2V0KGRldiwgZGV2LT50dW5fYW5hbG9nX2dwaW8pOwotCWVsc2UKLQkJcmMgPSBlbTI4eHhfZ3Bpb19zZXQoZGV2LCBkZXYtPnR1bl9kaWdpdGFsX2dwaW8pOworCXJjID0gZW0yOHh4X2dwaW9fc2V0KGRldiwgZGV2LT5ib2FyZC50dW5lcl9ncGlvKTsKIAogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF90dW5lcl9jYWxsYmFjayk7CiAKLXN0YXRpYyB2b2lkIGVtMjh4eF9zZXRfbW9kZWwoc3RydWN0IGVtMjh4eCAqZGV2KQorc3RhdGljIHZvaWQgaW5saW5lIGVtMjh4eF9zZXRfbW9kZWwoc3RydWN0IGVtMjh4eCAqZGV2KQogewotCWRldi0+aXNfZW0yODAwID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5pc19lbTI4MDA7Ci0JZGV2LT5oYXNfbXNwMzR4eCA9IGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0uaGFzX21zcDM0eHg7Ci0JZGV2LT50ZGE5ODg3X2NvbmYgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLnRkYTk4ODdfY29uZjsKLQlkZXYtPmRlY29kZXIgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLmRlY29kZXI7Ci0JZGV2LT52aWRlb19pbnB1dHMgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLnZjaGFubmVsczsKLQlkZXYtPmhhc18xMm1oel9pMnMgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLmhhc18xMm1oel9pMnM7Ci0JZGV2LT5tYXhfcmFuZ2VfNjQwXzQ4MCA9IGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0ubWF4X3JhbmdlXzY0MF80ODA7Ci0JZGV2LT5oYXNfZHZiID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5oYXNfZHZiOwotCWRldi0+aGFzX3NuYXBzaG90X2J1dHRvbiA9IGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0uaGFzX3NuYXBzaG90X2J1dHRvbjsKLQlkZXYtPnZhbGlkID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS52YWxpZDsKKwltZW1jcHkoJmRldi0+Ym9hcmQsICZlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLCBzaXplb2YoZGV2LT5ib2FyZCkpOworCisJLyogVGhvc2UgYXJlIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1ham9yaXR5IG9mIGJvYXJkcworCSAgIFVzZSB0aG9zZSB2YWx1ZXMgaWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UgYXQgYm9hcmRzIGVudHJ5CisJICovCisJaWYgKCFkZXYtPmJvYXJkLnhjbGspCisJCWRldi0+Ym9hcmQueGNsayA9IEVNMjhYWF9YQ0xLX0lSX1JDNV9NT0RFIHwKKwkJCQkgIEVNMjhYWF9YQ0xLX0ZSRVFVRU5DWV8xMk1IWjsKKworCWlmICghZGV2LT5ib2FyZC5pMmNfc3BlZWQpCisJCWRldi0+Ym9hcmQuaTJjX3NwZWVkID0gRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfAorCQkJCSAgICAgICBFTTI4WFhfSTJDX0ZSRVFfMTAwX0tIWjsKIH0KIAogLyogU2luY2UgZW0yOHh4X3ByZV9jYXJkX3NldHVwKCkgcmVxdWlyZXMgYSBwcm9wZXIgZGV2LT5tb2RlbCwKQEAgLTEzMTIsMjA1ICsxMzc1LDEyNiBAQAogewogCWludCByYzsKIAotCXJjID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgRU0yODgwX1IwNF9HUE8pOwotCWlmIChyYyA+PSAwKQotCQlkZXYtPnJlZ19ncG8gPSByYzsKKwllbTI4eHhfc2V0X21vZGVsKGRldik7CisKKwllbTI4eHhfaW5mbygiSWRlbnRpZmllZCBhcyAlcyAoY2FyZD0lZClcbiIsCisJCSAgICBkZXYtPmJvYXJkLm5hbWUsIGRldi0+bW9kZWwpOworCisJLyogU2V0IHRoZSBkZWZhdWx0IEdQTy9HUElPIGZvciBsZWdhY3kgZGV2aWNlcyAqLworCWRldi0+cmVnX2dwb19udW0gPSBFTTI4ODBfUjA0X0dQTzsKKwlkZXYtPnJlZ19ncGlvX251bSA9IEVNMjhYWF9SMDhfR1BJTzsKIAogCWRldi0+d2FpdF9hZnRlcl93cml0ZSA9IDU7CisKKwkvKiBCYXNlZCBvbiB0aGUgQ2hpcCBJRCwgc2V0IHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiAqLwogCXJjID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgRU0yOFhYX1IwQV9DSElQSUQpOwogCWlmIChyYyA+IDApIHsKLQkJc3dpdGNoIChyYykgeworCQlkZXYtPmNoaXBfaWQgPSByYzsKKworCQlzd2l0Y2ggKGRldi0+Y2hpcF9pZCkgeworCQljYXNlIENISVBfSURfRU0yNzUwOgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yNzUwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIENISVBfSURfRU0yODIwOgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODIwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIENISVBfSURfRU0yODQwOgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODQwXG4iKTsKKwkJCWJyZWFrOwogCQljYXNlIENISVBfSURfRU0yODYwOgogCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODYwXG4iKTsKIAkJCWJyZWFrOworCQljYXNlIENISVBfSURfRU0yODcwOgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODcwXG4iKTsKKwkJCWRldi0+d2FpdF9hZnRlcl93cml0ZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBDSElQX0lEX0VNMjg3NDoKKwkJCWVtMjh4eF9pbmZvKCJjaGlwIElEIGlzIGVtMjg3NFxuIik7CisJCQlkZXYtPnJlZ19ncGlvX251bSA9IEVNMjg3NF9SODBfR1BJTzsKKwkJCWRldi0+d2FpdF9hZnRlcl93cml0ZSA9IDA7CisJCQlicmVhazsKIAkJY2FzZSBDSElQX0lEX0VNMjg4MzoKIAkJCWVtMjh4eF9pbmZvKCJjaGlwIElEIGlzIGVtMjg4Mi9lbTI4ODNcbiIpOwogCQkJZGV2LT53YWl0X2FmdGVyX3dyaXRlID0gMDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZW0yOHh4X2luZm8oImVtMjh4eCBjaGlwIElEID0gJWRcbiIsIHJjKTsKKwkJCWVtMjh4eF9pbmZvKCJlbTI4eHggY2hpcCBJRCA9ICVkXG4iLCBkZXYtPmNoaXBfaWQpOwogCQl9CiAJfQotCWVtMjh4eF9zZXRfbW9kZWwoZGV2KTsKKworCS8qIFByZXBvcHVsYXRlIGNhY2hlZCBHUE8gcmVnaXN0ZXIgY29udGVudCAqLworCXJjID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgZGV2LT5yZWdfZ3BvX251bSk7CisJaWYgKHJjID49IDApCisJCWRldi0+cmVnX2dwbyA9IHJjOworCisJLyogU2V0IHRoZSBpbml0aWFsIFhDTEsgYW5kIEkyQyBjbG9jayB2YWx1ZXMgYmFzZWQgb24gdGhlIGJvYXJkCisJICAgZGVmaW5pdGlvbiAqLworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjBGX1hDTEssIGRldi0+Ym9hcmQueGNsayAmIDB4N2YpOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssIGRldi0+Ym9hcmQuaTJjX3NwZWVkKTsKKwltc2xlZXAoNTApOwogCiAJLyogcmVxdWVzdCBzb21lIG1vZHVsZXMgKi8KIAlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQljYXNlIEVNMjg4MF9CT0FSRF9URVJSQVRFQ19QUk9ESUdZX1hTOgotCWNhc2UgRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwOgotCWNhc2UgRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwX1IyOgotCWNhc2UgRU0yODYwX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YUzoKLQljYXNlIEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MDoKLQljYXNlIEVNMjg4MF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEX1BSTzoKLQljYXNlIEVNMjg4Ml9CT0FSRF9QSU5OQUNMRV9IWUJSSURfUFJPOgotCWNhc2UgRU0yODgzX0JPQVJEX0tXT1JMRF9IWUJSSURfQTMxNjoKLQljYXNlIEVNMjg4MF9CT0FSRF9BTURfQVRJX1RWX1dPTkRFUl9IRF82MDA6Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwRl9YQ0xLLCAgICAiXHgyNyIsIDEpOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgIlx4NDAiLCAxKTsKLQkJbXNsZWVwKDUwKTsKLQotCQkvKiBTZXRzIEdQTy9HUElPIHNlcXVlbmNlcyBmb3IgdGhpcyBkZXZpY2UgKi8KLQkJZGV2LT5hbmFsb2dfZ3BpbyAgICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfYW5hbG9nOwotCQlkZXYtPmRpZ2l0YWxfZ3BpbyAgICAgPSBoYXVwcGF1Z2Vfd2ludHZfaHZyXzkwMF9kaWdpdGFsOwotCQlkZXYtPnR1bl9hbmFsb2dfZ3BpbyAgPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlkZXYtPnR1bl9kaWdpdGFsX2dwaW8gPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlicmVhazsKLQotCWNhc2UgRU0yODgyX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YUzoKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjBGX1hDTEssICAgICJceDI3IiwgMSk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCAiXHg0MCIsIDEpOwotCQltc2xlZXAoNTApOwotCi0JCS8qIHNob3VsZCBiZSBhZGRlZCBpcl9jb2RlcyBoZXJlICovCi0KLQkJLyogU2V0cyBHUE8vR1BJTyBzZXF1ZW5jZXMgZm9yIHRoaXMgZGV2aWNlICovCi0JCWRldi0+YW5hbG9nX2dwaW8gICAgICA9IGhhdXBwYXVnZV93aW50dl9odnJfOTAwX2FuYWxvZzsKLQkJZGV2LT5kaWdpdGFsX2dwaW8gICAgID0gaGF1cHBhdWdlX3dpbnR2X2h2cl85MDBfZGlnaXRhbDsKLQkJZGV2LT50dW5fYW5hbG9nX2dwaW8gID0gZGVmYXVsdF9jYWxsYmFjazsKLQkJZGV2LT50dW5fZGlnaXRhbF9ncGlvID0gZW0yODgyX3RlcnJhdGVjX2h5YnJpZF94c19kaWdpdGFsOwotCQlicmVhazsKLQotCWNhc2UgRU0yODgwX0JPQVJEX1RFUlJBVEVDX0hZQlJJRF9YU19GUjoKLQljYXNlIEVNMjg4MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6Ci0JY2FzZSBFTTI4NzBfQk9BUkRfVEVSUkFURUNfWFM6Ci0JY2FzZSBFTTI4ODFfQk9BUkRfUElOTkFDTEVfSFlCUklEX1BSTzoKLQljYXNlIEVNMjg4MF9CT0FSRF9LV09STERfRFZCXzMxMFU6Ci0JY2FzZSBFTTI4NzBfQk9BUkRfS1dPUkxEXzM1MFU6Ci0JY2FzZSBFTTI4ODFfQk9BUkRfRE5UX0RBMl9IWUJSSUQ6Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwRl9YQ0xLLCAgICAiXHgyNyIsIDEpOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgIlx4NDAiLCAxKTsKLQkJbXNsZWVwKDUwKTsKLQotCQkvKiBOT1RFOiBFTTI4ODFfRE5UX0RBMl9IWUJSSUQgc3BlbmQgMTQwIG1zbGVlcCBmb3IgZGlnaXRhbAotCQkJIGFuZCBhbmFsb2cgY29tbWFuZHMuIElmIHRoaXMgY29tbWFuZHMgZG9lc24ndCB3b3JrLAotCQkJIGFkZCB0aGlzIHRpbWVyLiAqLwotCi0JCS8qIFNldHMgR1BPL0dQSU8gc2VxdWVuY2VzIGZvciB0aGlzIGRldmljZSAqLwotCQlkZXYtPmFuYWxvZ19ncGlvICAgICAgPSBkZWZhdWx0X2FuYWxvZzsKLQkJZGV2LT5kaWdpdGFsX2dwaW8gICAgID0gZGVmYXVsdF9kaWdpdGFsOwotCQlkZXYtPnR1bl9hbmFsb2dfZ3BpbyAgPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlkZXYtPnR1bl9kaWdpdGFsX2dwaW8gPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlicmVhazsKLQotCWNhc2UgRU0yODgwX0JPQVJEX01TSV9ESUdJVk9YX0FEOgotCWNhc2UgRU0yODgwX0JPQVJEX01TSV9ESUdJVk9YX0FEX0lJOgotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMEZfWENMSywgICAgIlx4MjciLCAxKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7Ci0JCW1zbGVlcCg1MCk7Ci0KLQkJLyogU2V0cyBHUE8vR1BJTyBzZXF1ZW5jZXMgZm9yIHRoaXMgZGV2aWNlICovCi0JCWRldi0+YW5hbG9nX2dwaW8gICAgICA9IGVtMjg4MF9tc2lfZGlnaXZveF9hZF9hbmFsb2c7Ci0JCWRldi0+ZGlnaXRhbF9ncGlvICAgICA9IGVtMjg4MF9tc2lfZGlnaXZveF9hZF9kaWdpdGFsOwotCQlkZXYtPnR1bl9hbmFsb2dfZ3BpbyAgPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlkZXYtPnR1bl9kaWdpdGFsX2dwaW8gPSBkZWZhdWx0X2NhbGxiYWNrOwotCQlicmVhazsKLQotCWNhc2UgRU0yNzUwX0JPQVJEX1VOS05PV046Ci0JY2FzZSBFTTI3NTBfQk9BUkRfRExDV18xMzA6Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwRl9YQ0xLLCAiXHgwYSIsIDEpOwotCQlicmVhazsKLQogCWNhc2UgRU0yODYxX0JPQVJEX1BMRVhUT1JfUFhfVFYxMDBVOgotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMEZfWENMSywgIlx4MjciLCAxKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7CiAJCS8qIEZJWE1FIGd1ZXNzICovCiAJCS8qIFR1cm4gb24gYW5hbG9nIGF1ZGlvIG91dHB1dCAqLwotCQllbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDA4LCAiXHhmZCIsIDEpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwOF9HUElPLCAweGZkKTsKIAkJYnJlYWs7Ci0KIAljYXNlIEVNMjg2MV9CT0FSRF9LV09STERfUFZSVFZfMzAwVToKIAljYXNlIEVNMjg4MF9CT0FSRF9LV09STERfRFZCXzMwNVU6Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwRl9YQ0xLLCAiXHgyNyIsIDEpOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgIlx4NGMiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHg2ZCk7CiAJCW1zbGVlcCgxMCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4NmQiLCAxKTsKLQkJbXNsZWVwKDEwKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCAweDA4LCAiXHg3ZCIsIDEpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwOF9HUElPLCAweDdkKTsKIAkJbXNsZWVwKDEwKTsKIAkJYnJlYWs7Ci0KLQljYXNlIEVNMjg3MF9CT0FSRF9LV09STERfMzU1VToKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjBGX1hDTEssICJceDI3IiwgMSk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCAiXHg0MCIsIDEpOwotCQltc2xlZXAoNTApOwotCi0JCS8qIFNldHMgR1BPL0dQSU8gc2VxdWVuY2VzIGZvciB0aGlzIGRldmljZSAqLwotCQlkZXYtPmRpZ2l0YWxfZ3BpbyAgICAgPSBlbTI4NzBfa3dvcmxkXzM1NXVfZGlnaXRhbDsKLQkJYnJlYWs7Ci0KIAljYXNlIEVNMjg3MF9CT0FSRF9DT01QUk9fVklERU9NQVRFOgotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMEZfWENMSywgIlx4MjciLCAxKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7CiAJCS8qIFRPRE86IHNvbWVvbmUgY2FuIGRvIHNvbWUgY2xlYW51cCBoZXJlLi4uCiAJCQkgbm90IGV2ZXJ5dGhpbmcncyBuZWVkZWQgKi8KLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCAweDA0LCAiXHgwMCIsIDEpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yODgwX1IwNF9HUE8sIDB4MDApOwogCQltc2xlZXAoMTApOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIDB4MDQsICJceDAxIiwgMSk7CisJCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4ODBfUjA0X0dQTywgMHgwMSk7CiAJCW1zbGVlcCgxMCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmQiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZCk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmMiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmYyk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZGMiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhkYyk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmMiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmYyk7CiAJCW1kZWxheSg3MCk7CiAJCWJyZWFrOwotCiAJY2FzZSBFTTI4NzBfQk9BUkRfVEVSUkFURUNfWFNfTVQyMDYwOgotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMEZfWENMSywgIlx4MjciLCAxKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7CiAJCS8qIHRoaXMgZGV2aWNlIG5lZWRzIHNvbWUgZ3BpbyB3cml0ZXMgdG8gZ2V0IHRoZSBEVkItVAogCQkgICBkZW1vZCB3b3JrICovCi0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmUiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZSk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZGUiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhkZSk7CiAJCW1kZWxheSg3MCk7Ci0JCWRldi0+ZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCAweDA4LCAiXHhmZSIsIDEpOworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwOF9HUElPLCAweGZlKTsKIAkJbWRlbGF5KDcwKTsKIAkJYnJlYWs7Ci0KIAljYXNlIEVNMjg3MF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0RWQjoKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7CiAJCS8qIHRoaXMgZGV2aWNlIG5lZWRzIHNvbWUgZ3BpbyB3cml0ZXMgdG8gZ2V0IHRoZQogCQkgICBEVkItVCBkZW1vZCB3b3JrICovCi0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmUiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZSk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZGUiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhkZSk7CiAJCW1kZWxheSg3MCk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgMHgwOCwgIlx4ZmUiLCAxKTsKKwkJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZSk7CiAJCW1kZWxheSg3MCk7Ci0JCS8qIHN3aXRjaCBlbTI4ODAgcmMgcHJvdG9jb2wgKi8KLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjBGX1hDTEssICJceDIyIiwgMSk7Ci0JCS8qIHNob3VsZCBiZSBhZGRlZCBpcl9jb2RlcyBoZXJlICovCiAJCWJyZWFrOwotCiAJY2FzZSBFTTI4MjBfQk9BUkRfR0FETUVJX1VUVjMxMDoKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjBGX1hDTEssICJceDI3IiwgMSk7Ci0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCAiXHg0MCIsIDEpOwotCQkvKiBUdXJuIG9uIGFuYWxvZyBhdWRpbyBvdXRwdXQgKi8KLQkJZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgwOCwgIlx4ZmQiLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVNMjg2MF9CT0FSRF9HQURNRUlfVVRWMzMwOgotCQkvKiBUdXJuIG9uIElSICovCi0JCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IwRl9YQ0xLLCAiXHgwNyIsIDEpOwotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgIlx4NDAiLCAxKTsKLQkJLyogc2hvdWxkIGJlIGFkZGVkIGlyX2NvZGVzIGhlcmUgKi8KLQkJYnJlYWs7Ci0KIAljYXNlIEVNMjgyMF9CT0FSRF9NU0lfVk9YX1VTQl8yOgotCQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMEZfWENMSywgIlx4MjciLCAxKTsKLQkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssICJceDQwIiwgMSk7Ci0JCS8qIGVuYWJsZXMgYXVkaW8gZm9yIHRoYXQgZGV2aWNlICovCi0JCWVtMjh4eF93cml0ZV9yZWdzX3JlcShkZXYsIDB4MDAsIDB4MDgsICJceGZkIiwgMSk7CisJCS8qIGVuYWJsZXMgYXVkaW8gZm9yIHRoYXQgZGV2aWNlcyAqLworCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwOF9HUElPLCAweGZkKTsKIAkJYnJlYWs7CiAJfQogCi0JZW0yOHh4X2dwaW9fc2V0KGRldiwgZGV2LT50dW5fYW5hbG9nX2dwaW8pOworCWVtMjh4eF9ncGlvX3NldChkZXYsIGRldi0+Ym9hcmQudHVuZXJfZ3Bpbyk7CiAJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX0FOQUxPR19NT0RFKTsKIAogCS8qIFVubG9jayBkZXZpY2UgKi8KLQllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfTU9ERV9VTkRFRklORUQpOworCWVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9TVVNQRU5EKTsKIH0KIAogc3RhdGljIHZvaWQgZW0yOHh4X3NldHVwX3hjMzAyOChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCB4YzIwMjhfY3RybCAqY3RsKQpAQCAtMTUzNiw2ICsxNTIwLDcgQEAKIAkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9ERUZBVUxUOwogCQljdGwtPmZuYW1lID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFOwogCQlicmVhazsKKwljYXNlIEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzg1MDoKIAljYXNlIEVNMjg4M19CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzk1MDoKIAljYXNlIEVNMjg4MF9CT0FSRF9QSU5OQUNMRV9QQ1RWX0hEX1BSTzoKIAkJLyogRklYTUU6IEJldHRlciB0byBzcGVjaWZ5IHRoZSBuZWVkZWQgSUYgKi8KQEAgLTE3MTIsMTIgKzE2OTcsMTUgQEAKIAllbTI4eHhfc2V0X21vZGVsKGRldik7CiAKIAlkZXYtPnR1bmVyX3R5cGUgPSBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLnR1bmVyX3R5cGU7CisJaWYgKGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0udHVuZXJfYWRkcikKKwkJZGV2LT50dW5lcl9hZGRyID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS50dW5lcl9hZGRyOwogCiAJLyogcmVxdWVzdCBzb21lIG1vZHVsZXMgKi8KIAlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKIAljYXNlIEVNMjgyMF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfVVNCXzI6CiAJY2FzZSBFTTI4ODBfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85MDA6CiAJY2FzZSBFTTI4ODBfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85MDBfUjI6CisJY2FzZSBFTTI4ODNfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl84NTA6CiAJY2FzZSBFTTI4ODNfQk9BUkRfSEFVUFBBVUdFX1dJTlRWX0hWUl85NTA6CiAJewogCQlzdHJ1Y3QgdHZlZXByb20gdHY7CkBAIC0xNzMzLDcgKzE3MjEsNyBAQAogCiAJCWlmICh0di5hdWRpb19wcm9jZXNzb3IgPT0gVjRMMl9JREVOVF9NU1BYNFhYKSB7CiAJCQlkZXYtPmkyc19zcGVlZCA9IDIwNDgwMDA7Ci0JCQlkZXYtPmhhc19tc3AzNHh4ID0gMTsKKwkJCWRldi0+Ym9hcmQuaGFzX21zcDM0eHggPSAxOwogCQl9CiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIAkJaWYgKHR2Lmhhc19pcikKQEAgLTE3NDMsNyArMTczMSw3IEBACiAJfQogCWNhc2UgRU0yODIwX0JPQVJEX0tXT1JMRF9QVlJUVjI4MDBSRjoKIAkJLyogR1BJTyBlbmFibGVzIHNvdW5kIG9uIEtXT1JMRCBQVlIgVFYgMjgwMFJGICovCi0JCWVtMjh4eF93cml0ZV9yZWdzX3JlcShkZXYsIDB4MDAsIDB4MDgsICJceGY5IiwgMSk7CisJCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZjkpOwogCQlicmVhazsKIAljYXNlIEVNMjgyMF9CT0FSRF9VTktOT1dOOgogCWNhc2UgRU0yODAwX0JPQVJEX1VOS05PV046CkBAIC0xNzY2LDEwICsxNzU0LDEwIEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChkZXYtPmhhc19zbmFwc2hvdF9idXR0b24pCisJaWYgKGRldi0+Ym9hcmQuaGFzX3NuYXBzaG90X2J1dHRvbikKIAkJZW0yOHh4X3JlZ2lzdGVyX3NuYXBzaG90X2J1dHRvbihkZXYpOwogCi0JaWYgKGRldi0+dmFsaWQgPT0gRU0yOFhYX0JPQVJEX05PVF9WQUxJREFURUQpIHsKKwlpZiAoZGV2LT5ib2FyZC52YWxpZCA9PSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCkgewogCQllbTI4eHhfZXJyZGV2KCJcblxuIik7CiAJCWVtMjh4eF9lcnJkZXYoIlRoZSBzdXBwb3J0IGZvciB0aGlzIGJvYXJkIHdlcmVuJ3QgIgogCQkJICAgICAgInZhbGlkIHlldC5cbiIpOwpAQCAtMTc4NCwxNSArMTc3Miw0MzMgQEAKIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCiAJLyogcmVxdWVzdCBzb21lIG1vZHVsZXMgKi8KLQlpZiAoZGV2LT5oYXNfbXNwMzR4eCkKKwlpZiAoZGV2LT5ib2FyZC5oYXNfbXNwMzR4eCkKIAkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKLQlpZiAoZGV2LT5kZWNvZGVyID09IEVNMjhYWF9TQUE3MTEzIHx8IGRldi0+ZGVjb2RlciA9PSBFTTI4WFhfU0FBNzExNCkKKwlpZiAoZGV2LT5ib2FyZC5kZWNvZGVyID09IEVNMjhYWF9TQUE3MTFYKQogCQlyZXF1ZXN0X21vZHVsZSgic2FhNzExNSIpOwotCWlmIChkZXYtPmRlY29kZXIgPT0gRU0yOFhYX1RWUDUxNTApCisJaWYgKGRldi0+Ym9hcmQuZGVjb2RlciA9PSBFTTI4WFhfVFZQNTE1MCkKIAkJcmVxdWVzdF9tb2R1bGUoInR2cDUxNTAiKTsKLQlpZiAoZGV2LT50dW5lcl90eXBlICE9IFRVTkVSX0FCU0VOVCkKKwlpZiAoZGV2LT5ib2FyZC50dW5lcl90eXBlICE9IFRVTkVSX0FCU0VOVCkKIAkJcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CiAjZW5kaWYKIAogCWVtMjh4eF9jb25maWdfdHVuZXIoZGV2KTsKKworCWVtMjh4eF9pcl9pbml0KGRldik7CiB9CisKKworI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIHZvaWQgcmVxdWVzdF9tb2R1bGVfYXN5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbTI4eHggKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJICAgICBzdHJ1Y3QgZW0yOHh4LCByZXF1ZXN0X21vZHVsZV93ayk7CisKKwlpZiAoZGV2LT5oYXNfYXVkaW9fY2xhc3MpCisJCXJlcXVlc3RfbW9kdWxlKCJzbmQtdXNiLWF1ZGlvIik7CisJZWxzZSBpZiAoZGV2LT5oYXNfYWxzYV9hdWRpbykKKwkJcmVxdWVzdF9tb2R1bGUoImVtMjh4eC1hbHNhIik7CisKKwlpZiAoZGV2LT5ib2FyZC5oYXNfZHZiKQorCQlyZXF1ZXN0X21vZHVsZSgiZW0yOHh4LWR2YiIpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X21vZHVsZXMoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCUlOSVRfV09SSygmZGV2LT5yZXF1ZXN0X21vZHVsZV93aywgcmVxdWVzdF9tb2R1bGVfYXN5bmMpOworCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVxdWVzdF9tb2R1bGVfd2spOworfQorI2Vsc2UKKyNkZWZpbmUgcmVxdWVzdF9tb2R1bGVzKGRldikKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCisvKgorICogZW0yOHh4X3JlYWxlYXNlX3Jlc291cmNlcygpCisgKiB1bnJlZ2lzdGVycyB0aGUgdjRsMixpMmMgYW5kIHVzYiBkZXZpY2VzCisgKiBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdldHMgZGlzY29uZWN0ZWQgb3IgYXQgbW9kdWxlIHVubG9hZAorKi8KK3ZvaWQgZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlpZiAoZGV2LT5zYnV0dG9uX2lucHV0X2RldikKKwkJZW0yOHh4X2RlcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKGRldik7CisKKwlpZiAoZGV2LT5pcikKKwkJZW0yOHh4X2lyX2ZpbmkoZGV2KTsKKworCS8qRklYTUU6IEkyQyBJUiBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCisKKwllbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKGRldik7CisKKwllbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOworCisJZW0yOHh4X2kyY191bnJlZ2lzdGVyKGRldik7CisJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKKworCS8qIE1hcmsgZGV2aWNlIGFzIHVudXNlZCAqLworCWVtMjh4eF9kZXZ1c2VkICY9IH4oMSA8PCBkZXYtPmRldm5vKTsKK307CisKKy8qCisgKiBlbTI4eHhfaW5pdF9kZXYoKQorICogYWxsb2NhdGVzIGFuZCBpbml0cyB0aGUgZGV2aWNlIHN0cnVjdHMsIHJlZ2lzdGVycyBpMmMgYnVzIGFuZCB2NGwgZGV2aWNlCisgKi8KK2ludCBlbTI4eHhfaW5pdF9kZXYoc3RydWN0IGVtMjh4eCAqKmRldmhhbmRsZSwgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCQkgICBpbnQgbWlub3IpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gKmRldmhhbmRsZTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlpbnQgZXJyQ29kZTsKKworCWRldi0+dWRldiA9IHVkZXY7CisJbXV0ZXhfaW5pdCgmZGV2LT5jdHJsX3VyYl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5vcGVuKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRfZnJhbWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdF9zdHJlYW0pOworCisJZGV2LT5lbTI4eHhfd3JpdGVfcmVncyA9IGVtMjh4eF93cml0ZV9yZWdzOworCWRldi0+ZW0yOHh4X3JlYWRfcmVnID0gZW0yOHh4X3JlYWRfcmVnOworCWRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4gPSBlbTI4eHhfcmVhZF9yZWdfcmVxX2xlbjsKKwlkZXYtPmVtMjh4eF93cml0ZV9yZWdzX3JlcSA9IGVtMjh4eF93cml0ZV9yZWdzX3JlcTsKKwlkZXYtPmVtMjh4eF9yZWFkX3JlZ19yZXEgPSBlbTI4eHhfcmVhZF9yZWdfcmVxOworCWRldi0+Ym9hcmQuaXNfZW0yODAwID0gZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5pc19lbTI4MDA7CisKKwllbTI4eHhfcHJlX2NhcmRfc2V0dXAoZGV2KTsKKworCWlmICghZGV2LT5ib2FyZC5pc19lbTI4MDApIHsKKwkJLyogU2V0cyBJMkMgc3BlZWQgdG8gMTAwIEtIeiAqLworCQlyZXR2YWwgPSBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCAweDQwKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgZmFpbGVkISIKKwkJCQkgICAgICAiIHJldHZhbCBbJWRdXG4iLAorCQkJCSAgICAgIF9fZnVuY19fLCByZXR2YWwpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKworCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KKwllcnJDb2RlID0gZW0yOHh4X2kyY19yZWdpc3RlcihkZXYpOworCWlmIChlcnJDb2RlIDwgMCkgeworCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X2kyY19yZWdpc3RlciAtIGVyckNvZGUgWyVkXSFcbiIsCisJCQlfX2Z1bmNfXywgZXJyQ29kZSk7CisJCXJldHVybiBlcnJDb2RlOworCX0KKworCS8qIERvIGJvYXJkIHNwZWNpZmljIGluaXQgYW5kIGVlcHJvbSByZWFkaW5nICovCisJZW0yOHh4X2NhcmRfc2V0dXAoZGV2KTsKKworCS8qIENvbmZpZ3VyZSBhdWRpbyAqLworCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKKwlpZiAoZXJyQ29kZSA8IDApIHsKKwkJZW0yOHh4X2VycmRldigiJXM6IEVycm9yIHdoaWxlIHNldHRpbmcgYXVkaW8gLSBlcnJDb2RlIFslZF0hXG4iLAorCQkJX19mdW5jX18sIGVyckNvZGUpOworCX0KKworCS8qIHdha2UgaTJjIGRldmljZXMgKi8KKwllbTI4eHhfd2FrZV9pMmMoZGV2KTsKKworCS8qIGluaXQgdmlkZW8gZG1hIHF1ZXVlcyAqLworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZpZHEuYWN0aXZlKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLnF1ZXVlZCk7CisKKworCWlmIChkZXYtPmJvYXJkLmhhc19tc3AzNHh4KSB7CisJCS8qIFNlbmQgYSByZXNldCB0byBvdGhlciBjaGlwcyB2aWEgZ3BpbyAqLworCQllcnJDb2RlID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmNyk7CisJCWlmIChlcnJDb2RlIDwgMCkgeworCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSAtICIKKwkJCQkgICAgICAibXNwMzR4eCgxKSBmYWlsZWQhIGVyckNvZGUgWyVkXVxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgZXJyQ29kZSk7CisJCQlyZXR1cm4gZXJyQ29kZTsKKwkJfQorCQltc2xlZXAoMyk7CisKKwkJZXJyQ29kZSA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZmYpOworCQlpZiAoZXJyQ29kZSA8IDApIHsKKwkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgLSAiCisJCQkJICAgICAgIm1zcDM0eHgoMikgZmFpbGVkISBlcnJDb2RlIFslZF1cbiIsCisJCQkJICAgICAgX19mdW5jX18sIGVyckNvZGUpOworCQkJcmV0dXJuIGVyckNvZGU7CisJCX0KKwkJbXNsZWVwKDMpOworCX0KKworCWVtMjh4eF9hZGRfaW50b19kZXZsaXN0KGRldik7CisKKwlyZXR2YWwgPSBlbTI4eHhfcmVnaXN0ZXJfYW5hbG9nX2RldmljZXMoZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKKwkJZ290byBmYWlsX3JlZ19kZXZpY2VzOworCX0KKworCWVtMjh4eF9pbml0X2V4dGVuc2lvbihkZXYpOworCisJLyogU2F2ZSBzb21lIHBvd2VyIGJ5IHB1dHRpbmcgdHVuZXIgdG8gc2xlZXAgKi8KKwllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKKworCXJldHVybiAwOworCitmYWlsX3JlZ19kZXZpY2VzOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBlbTI4eHhfdXNiX3Byb2JlKCkKKyAqIGNoZWNrcyBmb3Igc3VwcG9ydGVkIGRldmljZXMKKyAqLworc3RhdGljIGludCBlbTI4eHhfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpZjsKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOworCWludCByZXR2YWwgPSAtRU5PREVWOworCWludCBpLCBuciwgaWZudW0sIGlzb2NfcGlwZTsKKwljaGFyICpzcGVlZDsKKwljaGFyIGRlc2NyWzI1NV0gPSAiIjsKKworCXVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCWlmbnVtID0gaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcjsKKworCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KKwluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmVtMjh4eF9kZXZ1c2VkLCBFTTI4WFhfTUFYQk9BUkRTKTsKKwllbTI4eHhfZGV2dXNlZCB8PSAxPDxucjsKKworCS8qIERvbid0IHJlZ2lzdGVyIGF1ZGlvIGludGVyZmFjZXMgKi8KKwlpZiAoaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19BVURJTykgeworCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICIgYXVkaW8gZGV2aWNlICglMDR4OiUwNHgpOiAiCisJCQkiaW50ZXJmYWNlICVpLCBjbGFzcyAlaVxuIiwKKwkJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJaWZudW0sCisJCQlpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlQ2xhc3MpOworCisJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOworCisJLyogY2hlY2sgaWYgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KQorCSAgICAmJgorCSAgICAoaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzFdLmVuZHBvaW50WzBdLmRlc2Mud01heFBhY2tldFNpemUgPT0gOTQwKSkgeworCQkvKiBJdCdzIGEgbmV3ZXIgZW0yODc0L2VtMjg3NSBkZXZpY2UgKi8KKwkJaXNvY19waXBlID0gMDsKKwl9IGVsc2UgeworCQlpbnQgY2hlY2tfaW50ZXJmYWNlID0gMTsKKwkJaXNvY19waXBlID0gMTsKKwkJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMV0uZGVzYzsKKwkJaWYgKHVzYl9lbmRwb2ludF90eXBlKGVuZHBvaW50KSAhPQorCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykKKwkJCWNoZWNrX2ludGVyZmFjZSA9IDA7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVuZHBvaW50KSkKKwkJCWNoZWNrX2ludGVyZmFjZSA9IDA7CisKKwkJaWYgKCFjaGVja19pbnRlcmZhY2UpIHsKKwkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiB2aWRlbyBkZXZpY2UgKCUwNHg6JTA0eCk6ICIKKwkJCQkiaW50ZXJmYWNlICVpLCBjbGFzcyAlaSBmb3VuZC5cbiIsCisJCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJCWlmbnVtLAorCQkJCWludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CisKKwkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBUaGlzIGlzIGFuIGFuY2lsaWFyeSAiCisJCQkJImludGVyZmFjZSBub3QgdXNlZCBieSB0aGUgZHJpdmVyXG4iKTsKKworCQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXN3aXRjaCAodWRldi0+c3BlZWQpIHsKKwljYXNlIFVTQl9TUEVFRF9MT1c6CisJCXNwZWVkID0gIjEuNSI7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX1VOS05PV046CisJY2FzZSBVU0JfU1BFRURfRlVMTDoKKwkJc3BlZWQgPSAiMTIiOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9ISUdIOgorCQlzcGVlZCA9ICI0ODAiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGVlZCA9ICJ1bmtub3duIjsKKwl9CisKKwlpZiAodWRldi0+bWFudWZhY3R1cmVyKQorCQlzdHJsY3B5KGRlc2NyLCB1ZGV2LT5tYW51ZmFjdHVyZXIsIHNpemVvZihkZXNjcikpOworCisJaWYgKHVkZXYtPnByb2R1Y3QpIHsKKwkJaWYgKCpkZXNjcikKKwkJCXN0cmxjYXQoZGVzY3IsICIgIiwgc2l6ZW9mKGRlc2NyKSk7CisJCXN0cmxjYXQoZGVzY3IsIHVkZXYtPnByb2R1Y3QsIHNpemVvZihkZXNjcikpOworCX0KKwlpZiAoKmRlc2NyKQorCQlzdHJsY2F0KGRlc2NyLCAiICIsIHNpemVvZihkZXNjcikpOworCisJcHJpbnRrKERSSVZFUl9OQU1FICI6IE5ldyBkZXZpY2UgJXNAICVzIE1icHMgIgorCQkiKCUwNHg6JTA0eCwgaW50ZXJmYWNlICVkLCBjbGFzcyAlZClcbiIsCisJCWRlc2NyLAorCQlzcGVlZCwKKwkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJaWZudW0sCisJCWludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCWlmIChuciA+PSBFTTI4WFhfTUFYQk9BUkRTKSB7CisJCXByaW50ayhEUklWRVJfTkFNRSAiOiBTdXBwb3J0cyBvbmx5ICVpIGVtMjh4eCBib2FyZHMuXG4iLAorCQkJCUVNMjhYWF9NQVhCT0FSRFMpOworCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICI6IG91dCBvZiBtZW1vcnkhXG4iKTsKKwkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNucHJpbnRmKGRldi0+bmFtZSwgMjksICJlbTI4eHggIyVkIiwgbnIpOworCWRldi0+ZGV2bm8gPSBucjsKKwlkZXYtPm1vZGVsID0gaWQtPmRyaXZlcl9pbmZvOworCWRldi0+YWx0ICAgPSAtMTsKKworCS8qIENoZWNrcyBpZiBhdWRpbyBpcyBwcm92aWRlZCBieSBzb21lIGludGVyZmFjZSAqLworCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQl1aWYgPSB1ZGV2LT5jb25maWctPmludGVyZmFjZVtpXTsKKwkJaWYgKHVpZi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfQVVESU8pIHsKKwkJCWRldi0+aGFzX2F1ZGlvX2NsYXNzID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogY29tcHV0ZSBhbHRlcm5hdGUgbWF4IHBhY2tldCBzaXplcyAqLworCXVpZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdOworCisJZGV2LT5udW1fYWx0ID0gdWlmLT5udW1fYWx0c2V0dGluZzsKKwlkZXYtPmFsdF9tYXhfcGt0X3NpemUgPSBrbWFsbG9jKDMyICogZGV2LT5udW1fYWx0LCBHRlBfS0VSTkVMKTsKKworCWlmIChkZXYtPmFsdF9tYXhfcGt0X3NpemUgPT0gTlVMTCkgeworCQllbTI4eHhfZXJyZGV2KCJvdXQgb2YgbWVtb3J5IVxuIik7CisJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOworCQlrZnJlZShkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWx0IDsgaSsrKSB7CisJCXUxNiB0bXAgPSBsZTE2X3RvX2NwdSh1aWYtPmFsdHNldHRpbmdbaV0uZW5kcG9pbnRbaXNvY19waXBlXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwkJZGV2LT5hbHRfbWF4X3BrdF9zaXplW2ldID0KKwkJICAgICh0bXAgJiAweDA3ZmYpICogKCgodG1wICYgMHgxODAwKSA+PiAxMSkgKyAxKTsKKwl9CisKKwlpZiAoKGNhcmRbbnJdID49IDApICYmIChjYXJkW25yXSA8IGVtMjh4eF9iY291bnQpKQorCQlkZXYtPm1vZGVsID0gY2FyZFtucl07CisKKwkvKiBhbGxvY2F0ZSBkZXZpY2Ugc3RydWN0ICovCisJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXJldHZhbCA9IGVtMjh4eF9pbml0X2RldigmZGV2LCB1ZGV2LCBucik7CisJaWYgKHJldHZhbCkgeworCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PGRldi0+ZGV2bm8pOworCQlrZnJlZShkZXYpOworCisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOworCisJcmVxdWVzdF9tb2R1bGVzKGRldik7CisKKwkvKiBTaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gZG8sIHRvIGF2b2lkIG5ld2VyIHVkZXYncyB0bworCSAgIG9wZW4gdGhlIGRldmljZSBiZWZvcmUgZnVsbHkgaW5pdGlhbGl6aW5nIGl0CisJICovCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3QoKQorICogY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnZXRzIGRpY29uZW5jdGVkCisgKiB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB1bnJlZ2lzdGVyZWQgb24gdjRsMl9jbG9zZSBpbiBjYXNlIGl0IGlzIHN0aWxsIG9wZW4KKyAqLworc3RhdGljIHZvaWQgZW0yOHh4X3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2OworCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwllbTI4eHhfaW5mbygiZGlzY29ubmVjdGluZyAlc1xuIiwgZGV2LT52ZGV2LT5uYW1lKTsKKworCS8qIHdhaXQgdW50aWwgYWxsIGN1cnJlbnQgdjRsMiBpbyBpcyBmaW5pc2hlZCB0aGVuIGRlYWxsb2NhdGUKKwkgICByZXNvdXJjZXMgKi8KKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmZGV2LT5vcGVuKTsKKworCWlmIChkZXYtPnVzZXJzKSB7CisJCWVtMjh4eF93YXJuCisJCSAgICAoImRldmljZSAvZGV2L3ZpZGVvJWQgaXMgb3BlbiEgRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSAiCisJCSAgICAgImRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuXG4iLAorCQkJCWRldi0+dmRldi0+bnVtKTsKKworCQlkZXYtPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCQllbTI4eHhfdW5pbml0X2lzb2MoZGV2KTsKKwkJZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d2FpdF9mcmFtZSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X3N0cmVhbSk7CisJfSBlbHNlIHsKKwkJZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOworCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKKwl9CisKKwllbTI4eHhfY2xvc2VfZXh0ZW5zaW9uKGRldik7CisKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKKwlpZiAoIWRldi0+dXNlcnMpIHsKKwkJa2ZyZWUoZGV2LT5hbHRfbWF4X3BrdF9zaXplKTsKKwkJa2ZyZWUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbTI4eHhfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJlbTI4eHgiLAorCS5wcm9iZSA9IGVtMjh4eF91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gZW0yOHh4X2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW0yOHh4X21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmVtMjh4eF91c2JfZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FCisJCQkgICAiIHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZC5cbiIsIHJlc3VsdCk7CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgZHJpdmVyIGxvYWRlZFxuIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZW0yOHh4X21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmVtMjh4eF91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZW0yOHh4X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGVtMjh4eF9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCAxNWUyYjUyLi5mODUwNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2luY2x1ZGUgImVtMjh4eC5oIgogCkBAIC02Niw3ICs2Nyw4IEBACiBpbnQgZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4oc3RydWN0IGVtMjh4eCAqZGV2LCB1OCByZXEsIHUxNiByZWcsCiAJCQkJICAgY2hhciAqYnVmLCBpbnQgbGVuKQogewotCWludCByZXQsIGJ5dGU7CisJaW50IHJldDsKKwlpbnQgcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApOwogCiAJaWYgKGRldi0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTc0LDEwICs3NiwxOCBAQAogCWlmIChsZW4gPiBVUkJfTUFYX0NUUkxfU0laRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllbTI4eHhfcmVnZGJnKCJyZXE9JTAyeCwgcmVnPSUwMnggIiwgcmVxLCByZWcpOworCWlmIChyZWdfZGVidWcpIHsKKwkJcHJpbnRrKCBLRVJOX0RFQlVHICIocGlwZSAweCUwOHgpOiAiCisJCQkiSU46ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKKwkJCXBpcGUsCisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXJlcSwgMCwgMCwKKwkJCXJlZyAmIDB4ZmYsIHJlZyA+PiA4LAorCQkJbGVuICYgMHhmZiwgbGVuID4+IDgpOworCX0KIAogCW11dGV4X2xvY2soJmRldi0+Y3RybF91cmJfbG9jayk7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGRldi0+dWRldiwgMCksIHJlcSwKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCBwaXBlLCByZXEsCiAJCQkgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDB4MDAwMCwgcmVnLCBkZXYtPnVyYl9idWYsIGxlbiwgSFopOwogCWlmIChyZXQgPCAwKSB7CkBAIC05Myw3ICsxMDMsOSBAQAogCW11dGV4X3VubG9jaygmZGV2LT5jdHJsX3VyYl9sb2NrKTsKIAogCWlmIChyZWdfZGVidWcpIHsKLQkJcHJpbnRrKCIlMDJ4IHZhbHVlczogIiwgcmV0KTsKKwkJaW50IGJ5dGU7CisKKwkJcHJpbnRrKCI8PDwiKTsKIAkJZm9yIChieXRlID0gMDsgYnl0ZSA8IGxlbjsgYnl0ZSsrKQogCQkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKWJ1ZltieXRlXSk7CiAJCXByaW50aygiXG4iKTsKQEAgLTEwOCwyOCArMTIwLDEyIEBACiAgKi8KIGludCBlbTI4eHhfcmVhZF9yZWdfcmVxKHN0cnVjdCBlbTI4eHggKmRldiwgdTggcmVxLCB1MTYgcmVnKQogewotCXU4IHZhbDsKIAlpbnQgcmV0OworCXU4IHZhbDsKIAotCWlmIChkZXYtPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkKLQkJcmV0dXJuKC1FTk9ERVYpOwotCi0JZW0yOHh4X3JlZ2RiZygicmVxPSUwMngsIHJlZz0lMDJ4OiIsIHJlcSwgcmVnKTsKLQotCW11dGV4X2xvY2soJmRldi0+Y3RybF91cmJfbG9jayk7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldi0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGRldi0+dWRldiwgMCksIHJlcSwKLQkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotCQkJICAgICAgMHgwMDAwLCByZWcsIGRldi0+dXJiX2J1ZiwgMSwgSFopOwotCXZhbCA9IGRldi0+dXJiX2J1ZlswXTsKLQltdXRleF91bmxvY2soJmRldi0+Y3RybF91cmJfbG9jayk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoIiBmYWlsZWQhXG4iKTsKKwlyZXQgPSBlbTI4eHhfcmVhZF9yZWdfcmVxX2xlbihkZXYsIHJlcSwgcmVnLCAmdmFsLCAxKTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAocmVnX2RlYnVnKQotCQlwcmludGsoIiUwMnhcbiIsICh1bnNpZ25lZCBjaGFyKSB2YWwpOwogCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTE0Nyw2ICsxNDMsNyBAQAogCQkJCSBpbnQgbGVuKQogewogCWludCByZXQ7CisJaW50IHBpcGUgPSB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKTsKIAogCWlmIChkZXYtPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNTQsMTcgKzE1MSwyNSBAQAogCWlmICgobGVuIDwgMSkgfHwgKGxlbiA+IFVSQl9NQVhfQ1RSTF9TSVpFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllbTI4eHhfcmVnZGJnKCJyZXE9JTAyeCByZWc9JTAyeDoiLCByZXEsIHJlZyk7CiAJaWYgKHJlZ19kZWJ1ZykgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQotCQkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKWJ1ZltpXSk7CisJCWludCBieXRlOworCisJCXByaW50ayggS0VSTl9ERUJVRyAiKHBpcGUgMHglMDh4KTogIgorCQkJIk9VVDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ID4+PiIsCisJCQlwaXBlLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJcmVxLCAwLCAwLAorCQkJcmVnICYgMHhmZiwgcmVnID4+IDgsCisJCQlsZW4gJiAweGZmLCBsZW4gPj4gOCk7CisKKwkJZm9yIChieXRlID0gMDsgYnl0ZSA8IGxlbjsgYnl0ZSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKWJ1ZltieXRlXSk7CiAJCXByaW50aygiXG4iKTsKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0cmxfdXJiX2xvY2spOwogCW1lbWNweShkZXYtPnVyYl9idWYsIGJ1ZiwgbGVuKTsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwgcmVxLAorCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHBpcGUsIHJlcSwKIAkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDB4MDAwMCwgcmVnLCBkZXYtPnVyYl9idWYsIGxlbiwgSFopOwogCW11dGV4X3VubG9jaygmZGV2LT5jdHJsX3VyYl9sb2NrKTsKQEAgLTE4NywxNSArMTkyLDIxIEBACiAJICAgTm90IHN1cmUgd2hhdCBoYXBwZW5zIG9uIHJlYWRpbmcgR1BPIHJlZ2lzdGVyLgogCSAqLwogCWlmIChyYyA+PSAwKSB7Ci0JCWlmIChyZWcgPT0gRU0yODgwX1IwNF9HUE8pCisJCWlmIChyZWcgPT0gZGV2LT5yZWdfZ3BvX251bSkKIAkJCWRldi0+cmVnX2dwbyA9IGJ1ZlswXTsKLQkJZWxzZSBpZiAocmVnID09IEVNMjhYWF9SMDhfR1BJTykKKwkJZWxzZSBpZiAocmVnID09IGRldi0+cmVnX2dwaW9fbnVtKQogCQkJZGV2LT5yZWdfZ3BpbyA9IGJ1ZlswXTsKIAl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIFdyaXRlIGEgc2luZ2xlIHJlZ2lzdGVyICovCitpbnQgZW0yOHh4X3dyaXRlX3JlZyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiByZWcsIHU4IHZhbCkKK3sKKwlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCByZWcsICZ2YWwsIDEpOworfQorCiAvKgogICogZW0yOHh4X3dyaXRlX3JlZ19iaXRzKCkKICAqIHNldHMgb25seSBzb21lIGJpdHMgKHNwZWNpZmllZCBieSBiaXRtYXNrKSBvZiBhIHJlZ2lzdGVyLCBieSBmaXJzdCByZWFkaW5nCkBAIC0yMDgsOSArMjE5LDkgQEAKIAl1OCBuZXd2YWw7CiAKIAkvKiBVc2VzIGNhY2hlIGZvciBncG8vZ3BpbyByZWdpc3RlcnMgKi8KLQlpZiAocmVnID09IEVNMjg4MF9SMDRfR1BPKQorCWlmIChyZWcgPT0gZGV2LT5yZWdfZ3BvX251bSkKIAkJb2xkdmFsID0gZGV2LT5yZWdfZ3BvOwotCWVsc2UgaWYgKHJlZyA9PSBFTTI4WFhfUjA4X0dQSU8pCisJZWxzZSBpZiAocmVnID09IGRldi0+cmVnX2dwaW9fbnVtKQogCQlvbGR2YWwgPSBkZXYtPnJlZ19ncGlvOwogCWVsc2UKIAkJb2xkdmFsID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgcmVnKTsKQEAgLTIyNCwxNSArMjM1LDM4IEBACiB9CiAKIC8qCi0gKiBlbTI4eHhfd3JpdGVfYWM5NygpCi0gKiB3cml0ZSBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIEFDOTcgYWRkcmVzcyAoTFNCIGZpcnN0ISkKKyAqIGVtMjh4eF9pc19hYzk3X3JlYWR5KCkKKyAqIENoZWNrcyBpZiBhYzk3IGlzIHJlYWR5CiAgKi8KLXN0YXRpYyBpbnQgZW0yOHh4X3dyaXRlX2FjOTcoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCByZWcsIHU4ICp2YWwpCitzdGF0aWMgaW50IGVtMjh4eF9pc19hYzk3X3JlYWR5KHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAlpbnQgcmV0LCBpOwotCXU4IGFkZHIgPSByZWcgJiAweDdmOwogCi0JcmV0ID0gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjQwX0FDOTdMU0IsIHZhbCwgMik7CisJLyogV2FpdCB1cCB0byA1MCBtcyBmb3IgQUM5NyBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyssIG1zbGVlcCg1KSkgeworCQlyZXQgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjQzX0FDOTdCVVNZKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWlmICghKHJldCAmIDB4MDEpKQorCQkJcmV0dXJuIDA7CisJfQorCisJZW0yOHh4X3dhcm4oIkFDOTcgY29tbWFuZCBzdGlsbCBiZWluZyBleGVjdXRlZDogbm90IGhhbmRsZWQgcHJvcGVybHkhXG4iKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKgorICogZW0yOHh4X3JlYWRfYWM5NygpCisgKiB3cml0ZSBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIEFDOTcgYWRkcmVzcyAoTFNCIGZpcnN0ISkKKyAqLworaW50IGVtMjh4eF9yZWFkX2FjOTcoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCByZWcpCit7CisJaW50IHJldDsKKwl1OCBhZGRyID0gKHJlZyAmIDB4N2YpIHwgMHg4MDsKKwl1MTYgdmFsOworCisJcmV0ID0gZW0yOHh4X2lzX2FjOTdfcmVhZHkoZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjQwLDU4ICsyNzQsMTA2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBXYWl0IHVwIHRvIDUwIG1zIGZvciBBQzk3IGNvbW1hbmQgdG8gY29tcGxldGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlyZXQgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjQzX0FDOTdCVVNZKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4oZGV2LCAwLCBFTTI4WFhfUjQwX0FDOTdMU0IsCisJCQkJCSAgICh1OCAqKSZ2YWwsIHNpemVvZih2YWwpKTsKIAotCQlpZiAoIShyZXQgJiAweDAxKSkKLQkJCXJldHVybiAwOwotCQltc2xlZXAoNSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7Cit9CisKKy8qCisgKiBlbTI4eHhfd3JpdGVfYWM5NygpCisgKiB3cml0ZSBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIEFDOTcgYWRkcmVzcyAoTFNCIGZpcnN0ISkKKyAqLworaW50IGVtMjh4eF93cml0ZV9hYzk3KHN0cnVjdCBlbTI4eHggKmRldiwgdTggcmVnLCB1MTYgdmFsKQoreworCWludCByZXQ7CisJdTggYWRkciA9IHJlZyAmIDB4N2Y7CisJX19sZTE2IHZhbHVlOworCisJdmFsdWUgPSBjcHVfdG9fbGUxNih2YWwpOworCisJcmV0ID0gZW0yOHh4X2lzX2FjOTdfcmVhZHkoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1I0MF9BQzk3TFNCLCAodTggKikgJnZhbHVlLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1I0Ml9BQzk3QUREUiwgJmFkZHIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIHsKKwllbnVtIGVtMjh4eF9hbXV4IG11eDsKKwl1OAkJIHJlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBpbnB1dHNbXSA9IHsKKwl7IEVNMjhYWF9BTVVYX1ZJREVPLCAJQUM5N19WSURFT19WT0wgICB9LAorCXsgRU0yOFhYX0FNVVhfTElORV9JTiwJQUM5N19MSU5FSU5fVk9MICB9LAorCXsgRU0yOFhYX0FNVVhfUEhPTkUsCUFDOTdfUEhPTkVfVk9MICAgfSwKKwl7IEVNMjhYWF9BTVVYX01JQywJQUM5N19NSUNfVk9MICAgICB9LAorCXsgRU0yOFhYX0FNVVhfQ0QsCUFDOTdfQ0RfVk9MICAgICAgfSwKKwl7IEVNMjhYWF9BTVVYX0FVWCwJQUM5N19BVVhfVk9MICAgICB9LAorCXsgRU0yOFhYX0FNVVhfUENNX09VVCwJQUM5N19QQ01fT1VUX1ZPTCB9LAorfTsKKworc3RhdGljIGludCBzZXRfYWM5N19pbnB1dChzdHJ1Y3QgZW0yOHh4ICpkZXYpCit7CisJaW50IHJldCwgaTsKKwllbnVtIGVtMjh4eF9hbXV4IGFtdXggPSBkZXYtPmN0bF9haW5wdXQ7CisKKwkvKiBFTTI4WFhfQU1VWF9WSURFTzIgaXMgYSBzcGVjaWFsIGNhc2UgdXNlZCB0byBpbmRpY2F0ZSB0aGF0CisJICAgZW0yOHh4IHNob3VsZCBwb2ludCB0byBMSU5FIElOLCB3aGlsZSBBQzk3IHNob3VsZCB1c2UgVklERU8KKwkgKi8KKwlpZiAoYW11eCA9PSBFTTI4WFhfQU1VWF9WSURFTzIpCisJCWFtdXggPSBFTTI4WFhfQU1VWF9WSURFTzsKKworCS8qIE11dGUgYWxsIGVudHJlcyBidXQgdGhlIG9uZSB0aGF0IHdlcmUgc2VsZWN0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbnB1dHMpOyBpKyspIHsKKwkJaWYgKGFtdXggPT0gaW5wdXRzW2ldLm11eCkKKwkJCXJldCA9IGVtMjh4eF93cml0ZV9hYzk3KGRldiwgaW5wdXRzW2ldLnJlZywgMHgwODA4KTsKKwkJZWxzZQorCQkJcmV0ID0gZW0yOHh4X3dyaXRlX2FjOTcoZGV2LCBpbnB1dHNbaV0ucmVnLCAweDgwMDApOworCisJCWlmIChyZXQgPCAwKQorCQkJZW0yOHh4X3dhcm4oImNvdWxkbid0IHNldHVwIEFDOTcgcmVnaXN0ZXIgJWRcbiIsCisJCQkJICAgICBpbnB1dHNbaV0ucmVnKTsKIAl9Ci0JZW0yOHh4X3dhcm4oIkFDOTcgY29tbWFuZCBzdGlsbCBiZWluZyBleGVjdXRlZDogbm90IGhhbmRsZWQgcHJvcGVybHkhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBlbTI4eHhfc2V0X2F1ZGlvX3NvdXJjZShzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7Ci0Jc3RhdGljIGNoYXIgKmVuYWJsZSAgPSAiXHgwOFx4MDgiOwotCXN0YXRpYyBjaGFyICpkaXNhYmxlID0gIlx4MDhceDg4IjsKLQljaGFyICp2aWRlbyA9IGVuYWJsZSwgKmxpbmUgPSBkaXNhYmxlOwogCWludCByZXQ7CiAJdTggaW5wdXQ7CiAKLQlpZiAoZGV2LT5pc19lbTI4MDApIHsKLQkJaWYgKGRldi0+Y3RsX2FpbnB1dCkKLQkJCWlucHV0ID0gRU0yODAwX0FVRElPX1NSQ19MSU5FOwotCQllbHNlCisJaWYgKGRldi0+Ym9hcmQuaXNfZW0yODAwKSB7CisJCWlmIChkZXYtPmN0bF9haW5wdXQgPT0gRU0yOFhYX0FNVVhfVklERU8pCiAJCQlpbnB1dCA9IEVNMjgwMF9BVURJT19TUkNfVFVORVI7CisJCWVsc2UKKwkJCWlucHV0ID0gRU0yODAwX0FVRElPX1NSQ19MSU5FOwogCiAJCXJldCA9IGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yODAwX1IwOF9BVURJT1NSQywgJmlucHV0LCAxKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChkZXYtPmhhc19tc3AzNHh4KQorCWlmIChkZXYtPmJvYXJkLmhhc19tc3AzNHh4KQogCQlpbnB1dCA9IEVNMjhYWF9BVURJT19TUkNfVFVORVI7CiAJZWxzZSB7CiAJCXN3aXRjaCAoZGV2LT5jdGxfYWlucHV0KSB7CiAJCWNhc2UgRU0yOFhYX0FNVVhfVklERU86CiAJCQlpbnB1dCA9IEVNMjhYWF9BVURJT19TUkNfVFVORVI7CiAJCQlicmVhazsKLQkJY2FzZSBFTTI4WFhfQU1VWF9MSU5FX0lOOgorCQlkZWZhdWx0OgogCQkJaW5wdXQgPSBFTTI4WFhfQVVESU9fU1JDX0xJTkU7Ci0JCQl2aWRlbyA9IGRpc2FibGU7Ci0JCQlsaW5lICA9IGVuYWJsZTsKLQkJCWJyZWFrOwotCQljYXNlIEVNMjhYWF9BTVVYX0FDOTdfVklERU86Ci0JCQlpbnB1dCA9IEVNMjhYWF9BVURJT19TUkNfTElORTsKLQkJCWJyZWFrOwotCQljYXNlIEVNMjhYWF9BTVVYX0FDOTdfTElORV9JTjoKLQkJCWlucHV0ID0gRU0yOFhYX0FVRElPX1NSQ19MSU5FOwotCQkJdmlkZW8gPSBkaXNhYmxlOwotCQkJbGluZSAgPSBlbmFibGU7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTMwMSw0MSArMzgzLDUwIEBACiAJCXJldHVybiByZXQ7CiAJbXNsZWVwKDUpOwogCi0JLyogU2V0cyBBQzk3IG1peGVyIHJlZ2lzdGVycwotCSAgIFRoaXMgaXMgc2VlbXMgdG8gYmUgbmVlZGVkLCBldmVuIGZvciBub24tYWM5NyBjb25maWdzCi0JICovCi0JcmV0ID0gZW0yOHh4X3dyaXRlX2FjOTcoZGV2LCBFTTI4WFhfUjE0X1ZJREVPX0FDOTcsIHZpZGVvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGVtMjh4eF93cml0ZV9hYzk3KGRldiwgRU0yOFhYX1IxMF9MSU5FX0lOX0FDOTcsIGxpbmUpOworCXN3aXRjaCAoZGV2LT5hdWRpb19tb2RlLmFjOTcpIHsKKwljYXNlIEVNMjhYWF9OT19BQzk3OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBzZXRfYWM5N19pbnB1dChkZXYpOworCX0KIAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKKwl7IEVNMjhYWF9BT1VUX01BU1RFUiwgQUM5N19NQVNURVJfVk9MICAgICAgfSwKKwl7IEVNMjhYWF9BT1VUX0xJTkUsICAgQUM5N19MSU5FX0xFVkVMX1ZPTCAgfSwKKwl7IEVNMjhYWF9BT1VUX01PTk8sICAgQUM5N19NQVNURVJfTU9OT19WT0wgfSwKKwl7IEVNMjhYWF9BT1VUX0xGRSwgICAgQUM5N19MRkVfTUFTVEVSX1ZPTCAgfSwKKwl7IEVNMjhYWF9BT1VUX1NVUlIsICAgQUM5N19TVVJSX01BU1RFUl9WT0wgfSwKK307CisKIGludCBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7Ci0JaW50IHJldDsKLQljaGFyIHNbMl0gPSB7IDB4MDAsIDB4MDAgfTsKLQl1OCB4Y2xrID0gMHgwNzsKKwlpbnQgcmV0LCBpOworCXU4IHhjbGs7CiAKLQlzWzBdIHw9IDB4MWYgLSBkZXYtPnZvbHVtZTsKLQlzWzFdIHw9IDB4MWYgLSBkZXYtPnZvbHVtZTsKKwlpZiAoIWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8pCisJCXJldHVybiAwOwogCi0JLyogTXV0ZSAqLwotCXNbMV0gfD0gMHg4MDsKLQlyZXQgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIEVNMjhYWF9SMDJfTUFTVEVSX0FDOTcsIHMpOworCS8qIEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgZGV2aWNlcyB1c2UgbWFzdGVyIHZvbHVtZSBmb3Igb3V0cHV0LgorCSAgIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBhbHNvIGxpbmUgb3V0cHV0LgorCSAqLworCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgeworCQkvKiBNdXRlIGFsbCBvdXRwdXRzICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG91dHB1dHMpOyBpKyspIHsKKwkJCXJldCA9IGVtMjh4eF93cml0ZV9hYzk3KGRldiwgb3V0cHV0c1tpXS5yZWcsIDB4ODAwMCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQllbTI4eHhfd2FybigiY291bGRuJ3Qgc2V0dXAgQUM5NyByZWdpc3RlciAlZFxuIiwKKwkJCQkgICAgIG91dHB1dHNbaV0ucmVnKTsKKwkJfQorCX0KIAotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGRldi0+aGFzXzEybWh6X2kycykKLQkJeGNsayB8PSAweDIwOwotCisJeGNsayA9IGRldi0+Ym9hcmQueGNsayAmIDB4N2Y7CiAJaWYgKCFkZXYtPm11dGUpCiAJCXhjbGsgfD0gMHg4MDsKIAotCXJldCA9IGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjhYWF9SMEZfWENMSywgeGNsaywgMHhhNyk7CisJcmV0ID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMEZfWENMSywgeGNsayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAJbXNsZWVwKDEwKTsKQEAgLTM0MywzNiArNDM0LDE2OSBAQAogCS8qIFNlbGVjdHMgdGhlIHByb3BlciBhdWRpbyBpbnB1dCAqLwogCXJldCA9IGVtMjh4eF9zZXRfYXVkaW9fc291cmNlKGRldik7CiAKLQkvKiBVbm11dGUgZGV2aWNlICovCi0JaWYgKCFkZXYtPm11dGUpCi0JCXNbMV0gJj0gfjB4ODA7Ci0JcmV0ID0gZW0yOHh4X3dyaXRlX2FjOTcoZGV2LCBFTTI4WFhfUjAyX01BU1RFUl9BQzk3LCBzKTsKKwkvKiBTZXRzIHZvbHVtZSAqLworCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgeworCQlpbnQgdm9sOworCisJCS8qIExTQjogbGVmdCBjaGFubmVsIC0gYm90aCBjaGFubmVscyB3aXRoIHRoZSBzYW1lIGxldmVsICovCisJCXZvbCA9ICgweDFmIC0gZGV2LT52b2x1bWUpIHwgKCgweDFmIC0gZGV2LT52b2x1bWUpIDw8IDgpOworCisJCS8qIE11dGUgZGV2aWNlLCBpZiBuZWVkZWQgKi8KKwkJaWYgKGRldi0+bXV0ZSkKKwkJCXZvbCB8PSAweDgwMDA7CisKKwkJLyogU2V0cyB2b2x1bWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3V0cHV0cyk7IGkrKykgeworCQkJaWYgKGRldi0+Y3RsX2FvdXRwdXQgJiBvdXRwdXRzW2ldLm11eCkKKwkJCQlyZXQgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIG91dHB1dHNbaV0ucmVnLAorCQkJCQkJCXZvbCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQllbTI4eHhfd2FybigiY291bGRuJ3Qgc2V0dXAgQUM5NyByZWdpc3RlciAlZFxuIiwKKwkJCQkgICAgIG91dHB1dHNbaV0ucmVnKTsKKwkJfQorCX0KIAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfYXVkaW9fYW5hbG9nX3NldCk7CiAKK2ludCBlbTI4eHhfYXVkaW9fc2V0dXAoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCWludCB2aWQxLCB2aWQyLCBmZWF0LCBjZmc7CisJdTMyIHZpZDsKKworCWlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzAgfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7CisJCS8qIERpZ2l0YWwgb25seSBkZXZpY2UgLSBkb24ndCBsb2FkIGFueSBhbHNhIG1vZHVsZSAqLworCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gMDsKKwkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSAwOworCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBVc2IgQXVkaW8gQ2xhc3MsIHVzZSB2ZW5kb3IgY2xhc3MgKi8KKwlpZiAoIWRldi0+aGFzX2F1ZGlvX2NsYXNzKQorCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gMTsKKworCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSAxOworCisJLyogU2VlIGhvdyB0aGlzIGRldmljZSBpcyBjb25maWd1cmVkICovCisJY2ZnID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgRU0yOFhYX1IwMF9DSElQQ0ZHKTsKKwlpZiAoY2ZnIDwgMCkKKwkJY2ZnID0gRU0yOFhYX0NISVBDRkdfQUM5NzsgLyogQmUgY29uc2VydmF0aXZlICovCisJZWxzZQorCQllbTI4eHhfaW5mbygiQ29uZmlnIHJlZ2lzdGVyIHJhdyBkYXRhOiAweCUwMnhcbiIsIGNmZyk7CisKKwlpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0KKwkJICAgIEVNMjhYWF9DSElQQ0ZHX0kyU18zX1NBTVBSQVRFUykgeworCQllbTI4eHhfaW5mbygiSTJTIEF1ZGlvICgzIHNhbXBsZSByYXRlcylcbiIpOworCQlkZXYtPmF1ZGlvX21vZGUuaTJzXzNyYXRlcyA9IDE7CisJfQorCWlmICgoY2ZnICYgRU0yOFhYX0NISVBDRkdfQVVESU9NQVNLKSA9PQorCQkgICAgRU0yOFhYX0NISVBDRkdfSTJTXzVfU0FNUFJBVEVTKSB7CisJCWVtMjh4eF9pbmZvKCJJMlMgQXVkaW8gKDUgc2FtcGxlIHJhdGVzKVxuIik7CisJCWRldi0+YXVkaW9fbW9kZS5pMnNfNXJhdGVzID0gMTsKKwl9CisKKwlpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgIT0gRU0yOFhYX0NISVBDRkdfQUM5NykgeworCQkvKiBTa2lwIHRoZSBjb2RlIHRoYXQgZG9lcyBBQzk3IHZlbmRvciBkZXRlY3Rpb24gKi8KKwkJZGV2LT5hdWRpb19tb2RlLmFjOTcgPSBFTTI4WFhfTk9fQUM5NzsKKwkJZ290byBpbml0X2F1ZGlvOworCX0KKworCWRldi0+YXVkaW9fbW9kZS5hYzk3ID0gRU0yOFhYX0FDOTdfT1RIRVI7CisKKwl2aWQxID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIEFDOTdfVkVORE9SX0lEMSk7CisJaWYgKHZpZDEgPCAwKSB7CisJCS8qIERldmljZSBsaWtlbHkgZG9lc24ndCBzdXBwb3J0IEFDOTcgKi8KKwkJZW0yOHh4X3dhcm4oIkFDOTcgY2hpcCB0eXBlIGNvdWxkbid0IGJlIGRldGVybWluZWRcbiIpOworCQlnb3RvIGluaXRfYXVkaW87CisJfQorCisJdmlkMiA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBBQzk3X1ZFTkRPUl9JRDIpOworCWlmICh2aWQyIDwgMCkKKwkJZ290byBpbml0X2F1ZGlvOworCisJdmlkID0gdmlkMSA8PCAxNiB8IHZpZDI7CisKKwlkZXYtPmF1ZGlvX21vZGUuYWM5N192ZW5kb3JfaWQgPSB2aWQ7CisJZW0yOHh4X3dhcm4oIkFDOTcgdmVuZG9yIElEID0gMHglMDh4XG4iLCB2aWQpOworCisJZmVhdCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBBQzk3X1JFU0VUKTsKKwlpZiAoZmVhdCA8IDApCisJCWdvdG8gaW5pdF9hdWRpbzsKKworCWRldi0+YXVkaW9fbW9kZS5hYzk3X2ZlYXQgPSBmZWF0OworCWVtMjh4eF93YXJuKCJBQzk3IGZlYXR1cmVzID0gMHglMDR4XG4iLCBmZWF0KTsKKworCS8qIFRyeSB0byBpZGVudGlmeSB3aGF0IGF1ZGlvIHByb2Nlc3NvciB3ZSBoYXZlICovCisJaWYgKCh2aWQgPT0gMHhmZmZmZmZmZikgJiYgKGZlYXQgPT0gMHg2YTkwKSkKKwkJZGV2LT5hdWRpb19tb2RlLmFjOTcgPSBFTTI4WFhfQUM5N19FTTIwMjsKKwllbHNlIGlmICgodmlkID4+IDgpID09IDB4ODM4NDc2KQorCQlkZXYtPmF1ZGlvX21vZGUuYWM5NyA9IEVNMjhYWF9BQzk3X1NJR01BVEVMOworCitpbml0X2F1ZGlvOgorCS8qIFJlcG9ydHMgZGV0ZWN0ZWQgQUM5NyBwcm9jZXNzb3IgKi8KKwlzd2l0Y2ggKGRldi0+YXVkaW9fbW9kZS5hYzk3KSB7CisJY2FzZSBFTTI4WFhfTk9fQUM5NzoKKwkJZW0yOHh4X2luZm8oIk5vIEFDOTcgYXVkaW8gcHJvY2Vzc29yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTTI4WFhfQUM5N19FTTIwMjoKKwkJZW0yOHh4X2luZm8oIkVtcGlhIDIwMiBBQzk3IGF1ZGlvIHByb2Nlc3NvciBkZXRlY3RlZFxuIik7CisJCWJyZWFrOworCWNhc2UgRU0yOFhYX0FDOTdfU0lHTUFURUw6CisJCWVtMjh4eF9pbmZvKCJTaWdtYXRlbCBhdWRpbyBwcm9jZXNzb3IgZGV0ZWN0ZWQoc3RhYyA5NyUwMngpXG4iLAorCQkJICAgIGRldi0+YXVkaW9fbW9kZS5hYzk3X3ZlbmRvcl9pZCAmIDB4ZmYpOworCQlicmVhazsKKwljYXNlIEVNMjhYWF9BQzk3X09USEVSOgorCQllbTI4eHhfd2FybigiVW5rbm93biBBQzk3IGF1ZGlvIHByb2Nlc3NvciBkZXRlY3RlZCFcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZW0yOHh4X2F1ZGlvX2FuYWxvZ19zZXQoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF9hdWRpb19zZXR1cCk7CisKIGludCBlbTI4eHhfY29sb3JsZXZlbHNfc2V0X2RlZmF1bHQoc3RydWN0IGVtMjh4eCAqZGV2KQogewotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyMF9ZR0FJTiwgIlx4MTAiLCAxKTsJLyogY29udHJhc3QgKi8KLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjFfWU9GRlNFVCwgIlx4MDAiLCAxKTsJLyogYnJpZ2h0bmVzcyAqLwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyMl9VVkdBSU4sICJceDEwIiwgMSk7CS8qIHNhdHVyYXRpb24gKi8KLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjNfVU9GRlNFVCwgIlx4MDAiLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjRfVk9GRlNFVCwgIlx4MDAiLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMjVfU0hBUlBORVNTLCAiXHgwMCIsIDEpOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjIwX1lHQUlOLCAweDEwKTsJLyogY29udHJhc3QgKi8KKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyMV9ZT0ZGU0VULCAweDAwKTsJLyogYnJpZ2h0bmVzcyAqLworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjIyX1VWR0FJTiwgMHgxMCk7CS8qIHNhdHVyYXRpb24gKi8KKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyM19VT0ZGU0VULCAweDAwKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyNF9WT0ZGU0VULCAweDAwKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IyNV9TSEFSUE5FU1MsIDB4MDApOwogCi0JZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjE0X0dBTU1BLCAiXHgyMCIsIDEpOwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IxNV9SR0FJTiwgIlx4MjAiLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMTZfR0dBSU4sICJceDIwIiwgMSk7Ci0JZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjE3X0JHQUlOLCAiXHgyMCIsIDEpOwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IxOF9ST0ZGU0VULCAiXHgwMCIsIDEpOwotCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IxOV9HT0ZGU0VULCAiXHgwMCIsIDEpOwotCXJldHVybiBlbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMUFfQk9GRlNFVCwgIlx4MDAiLCAxKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxNF9HQU1NQSwgMHgyMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTVfUkdBSU4sIDB4MjApOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjE2X0dHQUlOLCAweDIwKTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxN19CR0FJTiwgMHgyMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMThfUk9GRlNFVCwgMHgwMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTlfR09GRlNFVCwgMHgwMCk7CisJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjFBX0JPRkZTRVQsIDB4MDApOwogfQogCiBpbnQgZW0yOHh4X2NhcHR1cmVfc3RhcnQoc3RydWN0IGVtMjh4eCAqZGV2LCBpbnQgc3RhcnQpCiB7CiAJaW50IHJjOworCisJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCkgeworCQkvKiBUaGUgVHJhbnNwb3J0IFN0cmVhbSBFbmFibGUgUmVnaXN0ZXIgbW92ZWQgaW4gZW0yODc0ICovCisJCWlmICghc3RhcnQpIHsKKwkJCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yODc0X1I1Rl9UU19FTkFCTEUsCisJCQkJCQkgICAweDAwLAorCQkJCQkJICAgRU0yODc0X1RTMV9DQVBUVVJFX0VOQUJMRSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQkvKiBFbmFibGUgVHJhbnNwb3J0IFN0cmVhbSAqLworCQlyYyA9IGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjg3NF9SNUZfVFNfRU5BQkxFLAorCQkJCQkgICBFTTI4NzRfVFMxX0NBUFRVUkVfRU5BQkxFLAorCQkJCQkgICBFTTI4NzRfVFMxX0NBUFRVUkVfRU5BQkxFKTsKKwkJcmV0dXJuIHJjOworCX0KKworCiAJLyogRklYTUU6IHdoaWNoIGlzIHRoZSBiZXN0IG9yZGVyPyAqLwogCS8qIHZpZGVvIHJlZ2lzdGVycyBhcmUgc2FtcGxlZCBieSBWUkVGICovCiAJcmMgPSBlbTI4eHhfd3JpdGVfcmVnX2JpdHMoZGV2LCBFTTI4WFhfUjBDX1VTQlNVU1AsCkBAIC0zODIsMjggKzYwNiwzNyBAQAogCiAJaWYgKCFzdGFydCkgewogCQkvKiBkaXNhYmxlIHZpZGVvIGNhcHR1cmUgKi8KLQkJcmMgPSBlbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMTJfVklORU5BQkxFLCAiXHgyNyIsIDEpOworCQlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjEyX1ZJTkVOQUJMRSwgMHgyNyk7CiAJCXJldHVybiByYzsKIAl9CiAKIAkvKiBlbmFibGUgdmlkZW8gY2FwdHVyZSAqLwotCXJjID0gZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHg0OCwgIlx4MDAiLCAxKTsKKwlyYyA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCAweDQ4LCAweDAwKTsKIAogCWlmIChkZXYtPm1vZGUgPT0gRU0yOFhYX0FOQUxPR19NT0RFKQotCQlyYyA9IGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IxMl9WSU5FTkFCTEUsICJceDY3IiwgMSk7CisJCXJjID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMTJfVklORU5BQkxFLCAweDY3KTsKIAllbHNlCi0JCXJjID0gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjEyX1ZJTkVOQUJMRSwgIlx4MzciLCAxKTsKKwkJcmMgPSBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMl9WSU5FTkFCTEUsIDB4MzcpOwogCiAJbXNsZWVwKDYpOwogCiAJcmV0dXJuIHJjOwogfQogCi1pbnQgZW0yOHh4X291dGZtdF9zZXRfeXV2NDIyKHN0cnVjdCBlbTI4eHggKmRldikKK2ludCBlbTI4eHhfc2V0X291dGZtdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7Ci0JZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjI3X09VVEZNVCwgIlx4MzQiLCAxKTsKLQllbTI4eHhfd3JpdGVfcmVncyhkZXYsIEVNMjhYWF9SMTBfVklOTU9ERSwgIlx4MTAiLCAxKTsKLQlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4WFhfUjExX1ZJTkNUUkwsICJceDExIiwgMSk7CisJaW50IHJldDsKKworCXJldCA9IGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjhYWF9SMjdfT1VURk1ULAorCQkJCSAgICBkZXYtPmZvcm1hdC0+cmVnIHwgMHgyMCwgMHgzZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMF9WSU5NT0RFLCAweDEwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBlbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMV9WSU5DVFJMLCAweDExKTsKIH0KIAogc3RhdGljIGludCBlbTI4eHhfYWNjdW11bGF0b3Jfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggeG1pbiwgdTggeG1heCwKQEAgLTQ0MCw3ICs2NzMsNyBAQAogewogCXU4IG1vZGU7CiAJLyogdGhlIGVtMjgwMCBzY2FsZXIgb25seSBzdXBwb3J0cyBzY2FsaW5nIGRvd24gdG8gNTAlICovCi0JaWYgKGRldi0+aXNfZW0yODAwKQorCWlmIChkZXYtPmJvYXJkLmlzX2VtMjgwMCkKIAkJbW9kZSA9ICh2ID8gMHgyMCA6IDB4MDApIHwgKGggPyAweDEwIDogMHgwMCk7CiAJZWxzZSB7CiAJCXU4IGJ1ZlsyXTsKQEAgLTQ2NCw3ICs2OTcsNyBAQAogCXdpZHRoID0gbm9ybV9tYXh3KGRldik7CiAJaGVpZ2h0ID0gbm9ybV9tYXhoKGRldikgPj4gMTsKIAotCWVtMjh4eF9vdXRmbXRfc2V0X3l1djQyMihkZXYpOworCWVtMjh4eF9zZXRfb3V0Zm10KGRldik7CiAJZW0yOHh4X2FjY3VtdWxhdG9yX3NldChkZXYsIDEsICh3aWR0aCAtIDQpID4+IDIsIDEsIChoZWlnaHQgLSA0KSA+PiAyKTsKIAllbTI4eHhfY2FwdHVyZV9hcmVhX3NldChkZXYsIDAsIDAsIHdpZHRoID4+IDIsIGhlaWdodCA+PiAyKTsKIAlyZXR1cm4gZW0yOHh4X3NjYWxlcl9zZXQoZGV2LCBkZXYtPmhzY2FsZSwgZGV2LT52c2NhbGUpOwpAQCAtNTE5LDEyICs3NTIsMTQgQEAKIAlpZiAoIWdwaW8pCiAJCXJldHVybiByYzsKIAotCWRldi0+ZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHg0OCwgIlx4MDAiLCAxKTsKLQlpZiAoZGV2LT5tb2RlID09IEVNMjhYWF9BTkFMT0dfTU9ERSkKLQkJZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDEyLCAiXHg2NyIsIDEpOwotCWVsc2UKLQkJZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDEyLCAiXHgzNyIsIDEpOwotCW1zbGVlcCg2KTsKKwlpZiAoZGV2LT5tb2RlICE9IEVNMjhYWF9TVVNQRU5EKSB7CisJCWVtMjh4eF93cml0ZV9yZWcoZGV2LCAweDQ4LCAweDAwKTsKKwkJaWYgKGRldi0+bW9kZSA9PSBFTTI4WFhfQU5BTE9HX01PREUpCisJCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMl9WSU5FTkFCTEUsIDB4NjcpOworCQllbHNlCisJCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IxMl9WSU5FTkFCTEUsIDB4MzcpOworCQltc2xlZXAoNik7CisJfQogCiAJLyogU2VuZCBHUElPIHJlc2V0IHNlcXVlbmNlcyBzcGVjaWZpZWQgYXQgYm9hcmQgZW50cnkgKi8KIAl3aGlsZSAoZ3Bpby0+c2xlZXAgPj0gMCkgewpAQCAtNTQ5LDE3ICs3ODQsMjAgQEAKIAlpZiAoZGV2LT5tb2RlID09IHNldF9tb2RlKQogCQlyZXR1cm4gMDsKIAotCWlmIChzZXRfbW9kZSA9PSBFTTI4WFhfTU9ERV9VTkRFRklORUQpIHsKKwlpZiAoc2V0X21vZGUgPT0gRU0yOFhYX1NVU1BFTkQpIHsKIAkJZGV2LT5tb2RlID0gc2V0X21vZGU7Ci0JCXJldHVybiAwOworCisJCS8qIEZJWE1FOiBhZGQgc3VzcGVuZCBzdXBwb3J0IGZvciBhYzk3ICovCisKKwkJcmV0dXJuIGVtMjh4eF9ncGlvX3NldChkZXYsIGRldi0+Ym9hcmQuc3VzcGVuZF9ncGlvKTsKIAl9CiAKIAlkZXYtPm1vZGUgPSBzZXRfbW9kZTsKIAogCWlmIChkZXYtPm1vZGUgPT0gRU0yOFhYX0RJR0lUQUxfTU9ERSkKLQkJcmV0dXJuIGVtMjh4eF9ncGlvX3NldChkZXYsIGRldi0+ZGlnaXRhbF9ncGlvKTsKKwkJcmV0dXJuIGVtMjh4eF9ncGlvX3NldChkZXYsIGRldi0+Ym9hcmQuZHZiX2dwaW8pOwogCWVsc2UKLQkJcmV0dXJuIGVtMjh4eF9ncGlvX3NldChkZXYsIGRldi0+YW5hbG9nX2dwaW8pOworCQlyZXR1cm4gZW0yOHh4X2dwaW9fc2V0KGRldiwgSU5QVVQoZGV2LT5jdGxfaW5wdXQpLT5ncGlvKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF9zZXRfbW9kZSk7CiAKQEAgLTczOCwzICs5NzYsMTQ1IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfaW5pdF9pc29jKTsKKworLyoKKyAqIGVtMjh4eF93YWtlX2kyYygpCisgKiBjb25maWd1cmUgaTJjIGF0dGFjaGVkIGRldmljZXMKKyAqLwordm9pZCBlbTI4eHhfd2FrZV9pMmMoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJaW50IHplcm8gPSAwOworCisJcm91dGUuaW5wdXQgPSBJTlBVVChkZXYtPmN0bF9pbnB1dCktPnZtdXg7CisJcm91dGUub3V0cHV0ID0gMDsKKwllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19JTlRfUkVTRVQsICZ6ZXJvKTsKKwllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOworCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX1NUUkVBTU9OLCBOVUxMKTsKK30KKworLyoKKyAqIERldmljZSBjb250cm9sIGxpc3QKKyAqLworCitzdGF0aWMgTElTVF9IRUFEKGVtMjh4eF9kZXZsaXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCitzdHJ1Y3QgZW0yOHh4ICplbTI4eHhfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBlbnVtIHY0bDJfYnVmX3R5cGUgKmZoX3R5cGUsCisJCQkJIGludCAqaGFzX3JhZGlvKQoreworCXN0cnVjdCBlbTI4eHggKmgsICpkZXYgPSBOVUxMOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwkqZmhfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkqaGFzX3JhZGlvID0gMDsKKworCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZlbTI4eHhfZGV2bGlzdCwgZGV2bGlzdCkgeworCQlpZiAoaC0+dmRldi0+bWlub3IgPT0gbWlub3IpCisJCQlkZXYgPSBoOworCQlpZiAoaC0+dmJpX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWRldiA9IGg7CisJCQkqZmhfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisJCX0KKwkJaWYgKGgtPnJhZGlvX2RldiAmJgorCQkgICAgaC0+cmFkaW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJZGV2ID0gaDsKKwkJCSpoYXNfcmFkaW8gPSAxOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCisJcmV0dXJuIGRldjsKK30KKworLyoKKyAqIGVtMjh4eF9yZWFsZWFzZV9yZXNvdXJjZXMoKQorICogdW5yZWdpc3RlcnMgdGhlIHY0bDIsaTJjIGFuZCB1c2IgZGV2aWNlcworICogY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnZXRzIGRpc2NvbmVjdGVkIG9yIGF0IG1vZHVsZSB1bmxvYWQKKyovCit2b2lkIGVtMjh4eF9yZW1vdmVfZnJvbV9kZXZsaXN0KHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwltdXRleF9sb2NrKCZlbTI4eHhfZGV2bGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmRldi0+ZGV2bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZGV2bGlzdF9tdXRleCk7Cit9OworCit2b2lkIGVtMjh4eF9hZGRfaW50b19kZXZsaXN0KHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwltdXRleF9sb2NrKCZlbTI4eHhfZGV2bGlzdF9tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCAmZW0yOHh4X2Rldmxpc3QpOworCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworfTsKKworLyoKKyAqIEV4dGVuc2lvbiBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgTElTVF9IRUFEKGVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKKworaW50IGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZvcHMtPm5leHQsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKKwkJaWYgKGRldikKKwkJCW9wcy0+aW5pdChkZXYpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOworCW11dGV4X3VubG9jaygmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOworCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChlbTI4eHhfcmVnaXN0ZXJfZXh0ZW5zaW9uKTsKKwordm9pZCBlbTI4eHhfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKKwkJaWYgKGRldikKKwkJCW9wcy0+ZmluaShkZXYpOworCX0KKworCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKKwlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IFJlbW92ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CisJbGlzdF9kZWwoJm9wcy0+bmV4dCk7CisJbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZGV2bGlzdF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7CisKK3ZvaWQgZW0yOHh4X2luaXRfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKKworCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJCWlmIChvcHMtPmluaXQpCisJCQkJb3BzLT5pbml0KGRldik7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7Cit9CisKK3ZvaWQgZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpCit7CisJc3RydWN0IGVtMjh4eF9vcHMgKm9wcyA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0LCBuZXh0KSB7CisJCQlpZiAob3BzLT5maW5pKQorCQkJCW9wcy0+ZmluaShkZXYpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCmluZGV4IGM5OWUyMzguLmQzOGNiMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJZW0yOHh4X3VuaW5pdF9pc29jKGRldik7CiAKLQllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfTU9ERV9VTkRFRklORUQpOworCWVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9TVVNQRU5EKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjE1LDcgKzIxNSw3IEBACiAJaWYgKGFjcXVpcmUpCiAJCXJldHVybiBlbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFKTsKIAllbHNlCi0JCXJldHVybiBlbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfTU9ERV9VTkRFRklORUQpOworCQlyZXR1cm4gZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX1NVU1BFTkQpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM5Myw3ICszOTMsNyBAQAogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmI7CiAKLQlpZiAoIWRldi0+aGFzX2R2YikgeworCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAqLwogCQlyZXR1cm4gMDsKIAl9CkBAIC00MDksOCArNDA5LDEwIEBACiAJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSk7CiAJLyogaW5pdCBmcm9udGVuZCAqLwogCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCWNhc2UgRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfODUwOgogCWNhc2UgRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTUwOgogCWNhc2UgRU0yODgwX0JPQVJEX1BJTk5BQ0xFX1BDVFZfSERfUFJPOgorCWNhc2UgRU0yODgzX0JPQVJEX0tXT1JMRF9IWUJSSURfQTMxNjoKIAljYXNlIEVNMjg4MF9CT0FSRF9BTURfQVRJX1RWX1dPTkRFUl9IRF82MDA6CiAJCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwKIAkJCQkJICAgJmVtMjg4MF9sZ2R0MzMwM19kZXYsCkBAIC00NjYsMTIgKzQ2OCwxMiBAQAogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCi0JZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX01PREVfVU5ERUZJTkVEKTsKKwllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfU1VTUEVORCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBlbTI4eHgtZHZiXG4iKTsKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWU6Ci0JZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX01PREVfVU5ERUZJTkVEKTsKKwllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfU1VTUEVORCk7CiAJa2ZyZWUoZHZiKTsKIAlkZXYtPmR2YiA9IE5VTEw7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTQ3OSw3ICs0ODEsNyBAQAogCiBzdGF0aWMgaW50IGR2Yl9maW5pKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlpZiAoIWRldi0+aGFzX2R2YikgeworCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAqLwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKaW5kZXggMjM2MGM2MS4uZDY5ZjBlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAogCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOwogCQlpZiAoIW1zZ3NbaV0ubGVuKSB7IC8qIG5vIGxlbjogY2hlY2sgb25seSBmb3IgZGV2aWNlIHByZXNlbmNlICovCi0JCQlpZiAoZGV2LT5pc19lbTI4MDApCisJCQlpZiAoZGV2LT5ib2FyZC5pc19lbTI4MDApCiAJCQkJcmMgPSBlbTI4MDBfaTJjX2NoZWNrX2Zvcl9kZXZpY2UoZGV2LCBhZGRyKTsKIAkJCWVsc2UKIAkJCQlyYyA9IGVtMjh4eF9pMmNfY2hlY2tfZm9yX2RldmljZShkZXYsIGFkZHIpOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAKIAkJfSBlbHNlIGlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpIHsKIAkJCS8qIHJlYWQgYnl0ZXMgKi8KLQkJCWlmIChkZXYtPmlzX2VtMjgwMCkKKwkJCWlmIChkZXYtPmJvYXJkLmlzX2VtMjgwMCkKIAkJCQlyYyA9IGVtMjgwMF9pMmNfcmVjdl9ieXRlcyhkZXYsIGFkZHIsCiAJCQkJCQkJICAgbXNnc1tpXS5idWYsCiAJCQkJCQkJICAgbXNnc1tpXS5sZW4pOwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspCiAJCQkJCXByaW50aygiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7CiAJCQl9Ci0JCQlpZiAoZGV2LT5pc19lbTI4MDApCisJCQlpZiAoZGV2LT5ib2FyZC5pc19lbTI4MDApCiAJCQkJcmMgPSBlbTI4MDBfaTJjX3NlbmRfYnl0ZXMoZGV2LCBhZGRyLAogCQkJCQkJCSAgIG1zZ3NbaV0uYnVmLAogCQkJCQkJCSAgIG1zZ3NbaV0ubGVuKTsKQEAgLTMzMiw2ICszMzIsMTcgQEAKIAlzdHJ1Y3QgZW0yOHh4X2VlcHJvbSAqZW1fZWVwcm9tID0gKHZvaWQgKillZWRhdGE7CiAJaW50IGksIGVyciwgc2l6ZSA9IGxlbiwgYmxvY2s7CiAKKwlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7CisJCS8qIEVtcGlhIHN3aXRjaGVkIHRvIGEgMTYtYml0IGFkZHJlc3NhYmxlIGVlcHJvbSBpbiBuZXdlcgorCQkgICBkZXZpY2VzLiAgV2hpbGUgd2UgY291bGQgY2VydGFpbmx5IHdyaXRlIGEgcm91dGluZSB0byByZWFkCisJCSAgIHRoZSBlZXByb20sIHRoZXJlIGlzIG5vdGhpbmcgb2YgdXNlIGluIHRoZXJlIHRoYXQgY2Fubm90IGJlCisJCSAgIGFjY2Vzc2VkIHRocm91Z2ggcmVnaXN0ZXJzLCBhbmQgdGhlcmUgaXMgdGhlIHJpc2sgdGhhdCB3ZQorCQkgICBjb3VsZCBjb3JydXB0IHRoZSBlZXByb20gKHNpbmNlIGEgMTYtYml0IHJlYWQgY2FsbCBpcworCQkgICBpbnRlcnByZXRlZCBhcyBhIHdyaXRlIGNhbGwgYnkgOC1iaXQgZWVwcm9tcykuCisJCSovCisJCXJldHVybiAwOworCX0KKwogCWRldi0+aTJjX2NsaWVudC5hZGRyID0gMHhhMCA+PiAxOwogCiAJLyogQ2hlY2sgaWYgYm9hcmQgaGFzIGVlcHJvbSAqLwpAQCAtMzc3LDQ3ICszODgsNDkgQEAKIAlpZiAoZW1fZWVwcm9tLT5pZCA9PSAweDk1NjdlYjFhKQogCQlkZXYtPmhhc2ggPSBlbTI4eHhfaGFzaF9tZW0oZWVkYXRhLCBsZW4sIDMyKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkVFUFJPTSBJRD0gMHglMDh4LCBoYXNoID0gMHglMDhseFxuIiwKLQkgICAgICAgZW1fZWVwcm9tLT5pZCwgZGV2LT5oYXNoKTsKLQlwcmludGsoS0VSTl9JTkZPICJWZW5kb3IvUHJvZHVjdCBJRD0gJTA0eDolMDR4XG4iLCBlbV9lZXByb20tPnZlbmRvcl9JRCwKLQkgICAgICAgZW1fZWVwcm9tLT5wcm9kdWN0X0lEKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRUVQUk9NIElEPSAweCUwOHgsIEVFUFJPTSBoYXNoID0gMHglMDhseFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBlbV9lZXByb20tPmlkLCBkZXYtPmhhc2gpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVFUFJPTSBpbmZvOlxuIiwgZGV2LT5uYW1lKTsKIAogCXN3aXRjaCAoZW1fZWVwcm9tLT5jaGlwX2NvbmYgPj4gNCAmIDB4MykgewogCWNhc2UgMDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gYXVkaW8gb24gYm9hcmQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6XHRObyBhdWRpbyBvbiBib2FyZC5cbiIsIGRldi0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQUM5NyBhdWRpbyAoNSBzYW1wbGUgcmF0ZXMpXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6XHRBQzk3IGF1ZGlvICg1IHNhbXBsZSByYXRlcylcbiIsCisJCQkJIGRldi0+bmFtZSk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiSTJTIGF1ZGlvLCBzYW1wbGUgcmF0ZT0zMmtcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczpcdEkyUyBhdWRpbywgc2FtcGxlIHJhdGU9MzJrXG4iLCBkZXYtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCXByaW50ayhLRVJOX0lORk8gIkkyUyBhdWRpbywgMyBzYW1wbGUgcmF0ZXNcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczpcdEkyUyBhdWRpbywgMyBzYW1wbGUgcmF0ZXNcbiIsIGRldi0+bmFtZSk7CiAJCWJyZWFrOwogCX0KIAogCWlmIChlbV9lZXByb20tPmNoaXBfY29uZiAmIDEgPDwgMykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVVNCIFJlbW90ZSB3YWtldXAgY2FwYWJsZVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0VVNCIFJlbW90ZSB3YWtldXAgY2FwYWJsZVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmIChlbV9lZXByb20tPmNoaXBfY29uZiAmIDEgPDwgMikKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVVNCIFNlbGYgcG93ZXIgY2FwYWJsZVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0VVNCIFNlbGYgcG93ZXIgY2FwYWJsZVxuIiwgZGV2LT5uYW1lKTsKIAogCXN3aXRjaCAoZW1fZWVwcm9tLT5jaGlwX2NvbmYgJiAweDMpIHsKIAljYXNlIDA6Ci0JCXByaW50ayhLRVJOX0lORk8gIjUwMG1BIG1heCBwb3dlclxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0NTAwbUEgbWF4IHBvd2VyXG4iLCBkZXYtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIDE6Ci0JCXByaW50ayhLRVJOX0lORk8gIjQwMG1BIG1heCBwb3dlclxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0NDAwbUEgbWF4IHBvd2VyXG4iLCBkZXYtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCXByaW50ayhLRVJOX0lORk8gIjMwMG1BIG1heCBwb3dlclxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0MzAwbUEgbWF4IHBvd2VyXG4iLCBkZXYtPm5hbWUpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCXByaW50ayhLRVJOX0lORk8gIjIwMG1BIG1heCBwb3dlclxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOlx0MjAwbUEgbWF4IHBvd2VyXG4iLCBkZXYtPm5hbWUpOwogCQlicmVhazsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVGFibGUgYXQgMHglMDJ4LCBzdHJpbmdzPTB4JTA0eCwgMHglMDR4LCAweCUwNHhcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6XHRUYWJsZSBhdCAweCUwMngsIHN0cmluZ3M9MHglMDR4LCAweCUwNHgsIDB4JTA0eFxuIiwKKwkJCQlkZXYtPm5hbWUsCiAJCQkJZW1fZWVwcm9tLT5zdHJpbmdfaWR4X3RhYmxlLAogCQkJCWVtX2VlcHJvbS0+c3RyaW5nMSwKIAkJCQllbV9lZXByb20tPnN0cmluZzIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IGVhYjNkOTUuLjQyYmJhZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zOCwxMiArMzgsNDggQEAKIG1vZHVsZV9wYXJhbShpcl9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSXSIpOwogCi0jZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pIFwKKyNkZWZpbmUgaTJjZHByaW50ayhmbXQsIGFyZy4uLikgXAogCWlmIChpcl9kZWJ1ZykgeyBcCiAJCXByaW50ayhLRVJOX0RFQlVHICIlcy9pcjogIiBmbXQsIGlyLT5jLm5hbWUgLCAjIyBhcmcpOyBcCiAJfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKSBcCisJaWYgKGlyX2RlYnVnKSB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2lyOiAiIGZtdCwgaXItPm5hbWUgLCAjIyBhcmcpOyBcCisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFBvbGxpbmcgc3RydWN0dXJlIHVzZWQgYnkgZW0yOHh4IElSJ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZW0yOHh4X2lyX3BvbGxfcmVzdWx0IHsKKwl1bnNpZ25lZCBpbnQgdG9nZ2xlX2JpdDoxOworCXVuc2lnbmVkIGludCByZWFkX2NvdW50Ojc7CisJdTggcmNfYWRkcmVzczsKKwl1OCByY19kYXRhWzRdOyAvKiAxIGJ5dGUgb24gZW0yODYwLzI4ODAsIDQgb24gZW0yODc0ICovCit9OworCitzdHJ1Y3QgZW0yOHh4X0lSIHsKKwlzdHJ1Y3QgZW0yOHh4ICpkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IGlyX2lucHV0X3N0YXRlIGlyOworCWNoYXIgbmFtZVszMl07CisJY2hhciBwaHlzWzMyXTsKKworCS8qIHBvbGwgZXh0ZXJuYWwgZGVjb2RlciAqLworCWludCBwb2xsaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXVuc2lnbmVkIGludCBsYXN0X3RvZ2dsZToxOworCXVuc2lnbmVkIGludCBsYXN0X3JlYWRjb3VudDsKKwl1bnNpZ25lZCBpbnQgcmVwZWF0X2ludGVydmFsOworCisJaW50ICAoKmdldF9rZXkpKHN0cnVjdCBlbTI4eHhfSVIgKiwgc3RydWN0IGVtMjh4eF9pcl9wb2xsX3Jlc3VsdCAqKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgSTJDIElSIGJhc2VkIGdldCBrZXljb2RlcyAtIHNob3VsZCBiZSB1c2VkIHdpdGggaXIta2JkLWkyYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGludCBlbTI4eHhfZ2V0X2tleV90ZXJyYXRlYyhzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQogewpAQCAtNTEsNyArODcsNyBAQAogCiAJLyogcG9sbCBJUiBjaGlwICovCiAJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KCZpci0+YywgJmIsIDEpKSB7Ci0JCWRwcmludGsoInJlYWQgZXJyb3JcbiIpOworCQlpMmNkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC01OSw3ICs5NSw3IEBACiAJICAgZG93biwgd2hpbGUgMHhmZiBpbmRpY2F0ZXMgdGhhdCBubyBidXR0b24gaXMgaG9sZAogCSAgIGRvd24uIDB4ZmUgc2VxdWVuY2VzIGFyZSBzb21ldGltZXMgaW50ZXJydXB0ZWQgYnkgMHhGRiAqLwogCi0JZHByaW50aygia2V5ICUwMnhcbiIsIGIpOworCWkyY2RwcmludGsoImtleSAlMDJ4XG4iLCBiKTsKIAogCWlmIChiID09IDB4ZmYpCiAJCXJldHVybiAwOwpAQCAtNzMsNyArMTA5LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotCiBpbnQgZW0yOHh4X2dldF9rZXlfZW1faGF1cChzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQogewogCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwpAQCAtOTcsNyArMTMyLDcgQEAKIAkJICgoYnVmWzBdJjB4MTApPj4zKSB8IC8qIDAwMDAgMDAxMCAqLwogCQkgKChidWZbMF0mMHgyMCk+PjUpOyAgLyogMDAwMCAwMDAxICovCiAKLQlkcHJpbnRrKCJpciBoYXVwcGF1Z2UgKGVtMjg0MCk6IGNvZGU9MHglMDJ4IChyY3Y9MHglMDJ4KVxuIiwKKwlpMmNkcHJpbnRrKCJpciBoYXVwcGF1Z2UgKGVtMjg0MCk6IGNvZGU9MHglMDJ4IChyY3Y9MHglMDJ4KVxuIiwKIAkJCWNvZGUsIGJ1ZlswXSk7CiAKIAkvKiByZXR1cm4ga2V5ICovCkBAIC0xMTQsMTEgKzE0OSwxMSBAQAogCS8qIHBvbGwgSVIgY2hpcCAqLwogCiAJaWYgKDMgIT0gaTJjX21hc3Rlcl9yZWN2KCZpci0+YywgYnVmLCAzKSkgewotCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKKwkJaTJjZHByaW50aygicmVhZCBlcnJvclxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWRwcmludGsoImtleSAlMDJ4XG4iLCBidWZbMl0mMHgzZik7CisJaTJjZHByaW50aygia2V5ICUwMnhcbiIsIGJ1ZlsyXSYweDNmKTsKIAlpZiAoYnVmWzBdICE9IDB4MDApCiAJCXJldHVybiAwOwogCkBAIC0xMjgsNiArMTYzLDI2MCBAQAogCXJldHVybiAxOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFBvbGwgYmFzZWQgZ2V0IGtleWNvZGUgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyBmb3IgdGhlIGVtMjg2MC9lbTI4ODAgKi8KK3N0YXRpYyBpbnQgZGVmYXVsdF9wb2xsaW5nX2dldGtleShzdHJ1Y3QgZW0yOHh4X0lSICppciwKKwkJCQkgIHN0cnVjdCBlbTI4eHhfaXJfcG9sbF9yZXN1bHQgKnBvbGxfcmVzdWx0KQoreworCXN0cnVjdCBlbTI4eHggKmRldiA9IGlyLT5kZXY7CisJaW50IHJjOworCXU4IG1zZ1szXSA9IHsgMCwgMCwgMCB9OworCisJLyogUmVhZCBrZXkgdG9nZ2xlLCBicmFuZCwgYW5kIGtleSBjb2RlCisJICAgb24gcmVnaXN0ZXJzIDB4NDUsIDB4NDYgYW5kIDB4NDcKKwkgKi8KKwlyYyA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW4oZGV2LCAwLCBFTTI4WFhfUjQ1X0lSLAorCQkJCQkgIG1zZywgc2l6ZW9mKG1zZykpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIEluZnJhcmVkIHRvZ2dsZSAoUmVnIDB4NDVbN10pICovCisJcG9sbF9yZXN1bHQtPnRvZ2dsZV9iaXQgPSAobXNnWzBdID4+IDcpOworCisJLyogSW5mcmFyZWQgcmVhZCBjb3VudCAoUmVnIDB4NDVbNjowXSAqLworCXBvbGxfcmVzdWx0LT5yZWFkX2NvdW50ID0gKG1zZ1swXSAmIDB4N2YpOworCisJLyogUmVtb3RlIENvbnRyb2wgQWRkcmVzcyAoUmVnIDB4NDYpICovCisJcG9sbF9yZXN1bHQtPnJjX2FkZHJlc3MgPSBtc2dbMV07CisKKwkvKiBSZW1vdGUgQ29udHJvbCBEYXRhIChSZWcgMHg0NykgKi8KKwlwb2xsX3Jlc3VsdC0+cmNfZGF0YVswXSA9IG1zZ1syXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtMjg3NF9wb2xsaW5nX2dldGtleShzdHJ1Y3QgZW0yOHh4X0lSICppciwKKwkJCQkgc3RydWN0IGVtMjh4eF9pcl9wb2xsX3Jlc3VsdCAqcG9sbF9yZXN1bHQpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gaXItPmRldjsKKwlpbnQgcmM7CisJdTggbXNnWzVdID0geyAwLCAwLCAwLCAwLCAwIH07CisKKwkvKiBSZWFkIGtleSB0b2dnbGUsIGJyYW5kLCBhbmQga2V5IGNvZGUKKwkgICBvbiByZWdpc3RlcnMgMHg1MS01NQorCSAqLworCXJjID0gZGV2LT5lbTI4eHhfcmVhZF9yZWdfcmVxX2xlbihkZXYsIDAsIEVNMjg3NF9SNTFfSVIsCisJCQkJCSAgbXNnLCBzaXplb2YobXNnKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogSW5mcmFyZWQgdG9nZ2xlIChSZWcgMHg1MVs3XSkgKi8KKwlwb2xsX3Jlc3VsdC0+dG9nZ2xlX2JpdCA9IChtc2dbMF0gPj4gNyk7CisKKwkvKiBJbmZyYXJlZCByZWFkIGNvdW50IChSZWcgMHg1MVs2OjBdICovCisJcG9sbF9yZXN1bHQtPnJlYWRfY291bnQgPSAobXNnWzBdICYgMHg3Zik7CisKKwkvKiBSZW1vdGUgQ29udHJvbCBBZGRyZXNzIChSZWcgMHg1MikgKi8KKwlwb2xsX3Jlc3VsdC0+cmNfYWRkcmVzcyA9IG1zZ1sxXTsKKworCS8qIFJlbW90ZSBDb250cm9sIERhdGEgKFJlZyAweDUzLTU1KSAqLworCXBvbGxfcmVzdWx0LT5yY19kYXRhWzBdID0gbXNnWzJdOworCXBvbGxfcmVzdWx0LT5yY19kYXRhWzFdID0gbXNnWzNdOworCXBvbGxfcmVzdWx0LT5yY19kYXRhWzJdID0gbXNnWzRdOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUG9sbGluZyBjb2RlIGZvciBlbTI4eHgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBlbTI4eHhfaXJfaGFuZGxlX2tleShzdHJ1Y3QgZW0yOHh4X0lSICppcikKK3sKKwlpbnQgcmVzdWx0OworCWludCBkb19zZW5ka2V5ID0gMDsKKwlzdHJ1Y3QgZW0yOHh4X2lyX3BvbGxfcmVzdWx0IHBvbGxfcmVzdWx0OworCisJLyogcmVhZCB0aGUgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgdGhlIElSIHN0YXR1cyAqLworCXJlc3VsdCA9IGlyLT5nZXRfa2V5KGlyLCAmcG9sbF9yZXN1bHQpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRwcmludGsoImlyLT5nZXRfa2V5KCkgZmFpbGVkICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm47CisJfQorCisJZHByaW50aygiaXItPmdldF9rZXkgcmVzdWx0IHRiPSUwMnggcmM9JTAyeCBscj0lMDJ4IGRhdGE9JTAyeFxuIiwKKwkJcG9sbF9yZXN1bHQudG9nZ2xlX2JpdCwgcG9sbF9yZXN1bHQucmVhZF9jb3VudCwKKwkJaXItPmxhc3RfcmVhZGNvdW50LCBwb2xsX3Jlc3VsdC5yY19kYXRhWzBdKTsKKworCWlmIChpci0+ZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7CisJCS8qIFRoZSBlbTI4NzQgY2xlYXJzIHRoZSByZWFkY291bnQgZmllbGQgZXZlcnkgdGltZSB0aGUKKwkJICAgcmVnaXN0ZXIgaXMgcmVhZC4gIFRoZSBlbTI4NjAvMjg4MCBkYXRhc2hlZXQgc2F5cyB0aGF0IGl0CisJCSAgIGlzIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSByZWFkY291bnQsIGJ1dCBpdCBkb2Vzbid0LiAgU28gd2l0aAorCQkgICB0aGUgZW0yODc0LCB3ZSBhcmUgbG9va2luZyBmb3IgYSBub24temVybyByZWFkIGNvdW50IGFzCisJCSAgIG9wcG9zZWQgdG8gYSByZWFkY291bnQgdGhhdCBpcyBpbmNyZW1lbnRpbmcgKi8KKwkJaXItPmxhc3RfcmVhZGNvdW50ID0gMDsKKwl9CisKKwlpZiAocG9sbF9yZXN1bHQucmVhZF9jb3VudCA9PSAwKSB7CisJCS8qIFRoZSBidXR0b24gaGFzIG5vdCBiZWVuIHByZXNzZWQgc2luY2UgdGhlIGxhc3QgcmVhZCAqLworCX0gZWxzZSBpZiAoaXItPmxhc3RfdG9nZ2xlICE9IHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQpIHsKKwkJLyogQSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZCAqLworCQlkcHJpbnRrKCJidXR0b24gaGFzIGJlZW4gcHJlc3NlZFxuIik7CisJCWlyLT5sYXN0X3RvZ2dsZSA9IHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQ7CisJCWlyLT5yZXBlYXRfaW50ZXJ2YWwgPSAwOworCQlkb19zZW5ka2V5ID0gMTsKKwl9IGVsc2UgaWYgKHBvbGxfcmVzdWx0LnRvZ2dsZV9iaXQgPT0gaXItPmxhc3RfdG9nZ2xlICYmCisJCSAgIHBvbGxfcmVzdWx0LnJlYWRfY291bnQgPiAwICYmCisJCSAgIHBvbGxfcmVzdWx0LnJlYWRfY291bnQgIT0gaXItPmxhc3RfcmVhZGNvdW50KSB7CisJCS8qIFRoZSBidXR0b24gaXMgc3RpbGwgYmVpbmcgaGVsZCBkb3duICovCisJCWRwcmludGsoImJ1dHRvbiBiZWluZyBoZWxkIGRvd25cbiIpOworCisJCS8qIERlYm91bmNlciBmb3IgZmlyc3Qga2V5cHJlc3MgKi8KKwkJaWYgKGlyLT5yZXBlYXRfaW50ZXJ2YWwrKyA+IDkpIHsKKwkJCS8qIFN0YXJ0IHJlcGVhdGluZyBhZnRlciAxIHNlY29uZCAqLworCQkJZG9fc2VuZGtleSA9IDE7CisJCX0KKwl9CisKKwlpZiAoZG9fc2VuZGtleSkgeworCQlkcHJpbnRrKCJzZW5kaW5nIGtleXByZXNzXG4iKTsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0sCisJCQkJIHBvbGxfcmVzdWx0LnJjX2RhdGFbMF0pOworCQlpcl9pbnB1dF9ub2tleShpci0+aW5wdXQsICZpci0+aXIpOworCX0KKworCWlyLT5sYXN0X3JlYWRjb3VudCA9IHBvbGxfcmVzdWx0LnJlYWRfY291bnQ7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGVtMjh4eF9JUiAqaXIgPSAoc3RydWN0IGVtMjh4eF9JUiAqKWRhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGVtMjh4eF9pcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZW0yOHh4X0lSICppciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW0yOHh4X0lSLCB3b3JrKTsKKworCWVtMjh4eF9pcl9oYW5kbGVfa2V5KGlyKTsKKwltb2RfdGltZXIoJmlyLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaXItPnBvbGxpbmcpKTsKK30KKwordm9pZCBlbTI4eHhfaXJfc3RhcnQoc3RydWN0IGVtMjh4eF9JUiAqaXIpCit7CisJc2V0dXBfdGltZXIoJmlyLT50aW1lciwgaXJfdGltZXIsICh1bnNpZ25lZCBsb25nKWlyKTsKKwlJTklUX1dPUksoJmlyLT53b3JrLCBlbTI4eHhfaXJfd29yayk7CisJc2NoZWR1bGVfd29yaygmaXItPndvcmspOworfQorCitzdGF0aWMgdm9pZCBlbTI4eHhfaXJfc3RvcChzdHJ1Y3QgZW0yOHh4X0lSICppcikKK3sKKwlkZWxfdGltZXJfc3luYygmaXItPnRpbWVyKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCitpbnQgZW0yOHh4X2lyX2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCXN0cnVjdCBlbTI4eHhfSVIgKmlyOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwl1OCBpcl9jb25maWc7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAoZGV2LT5ib2FyZC5pcl9jb2RlcyA9PSBOVUxMKSB7CisJCS8qIE5vIHJlbW90ZSBjb250cm9sIHN1cHBvcnQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJaXItPmlucHV0ID0gaW5wdXRfZGV2OworCisJLyogU2V0dXAgdGhlIHByb3BlciBoYW5kbGVyIGJhc2VkIG9uIHRoZSBjaGlwICovCisJc3dpdGNoIChkZXYtPmNoaXBfaWQpIHsKKwljYXNlIENISVBfSURfRU0yODYwOgorCWNhc2UgQ0hJUF9JRF9FTTI4ODM6CisJCWlyLT5nZXRfa2V5ID0gZGVmYXVsdF9wb2xsaW5nX2dldGtleTsKKwkJYnJlYWs7CisJY2FzZSBDSElQX0lEX0VNMjg3NDoKKwkJaXItPmdldF9rZXkgPSBlbTI4NzRfcG9sbGluZ19nZXRrZXk7CisJCS8qIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IFJDNSwgc28gZW5hYmxlIGl0ICovCisJCWlyX2NvbmZpZyA9IEVNMjg3NF9JUl9SQzU7CisJCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yODc0X1I1MF9JUl9DT05GSUcsICZpcl9jb25maWcsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlVucmVjb2duaXplZCBlbTI4eHggY2hpcCBpZDogSVIgbm90IHN1cHBvcnRlZFxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCS8qIFRoaXMgaXMgaG93IG9mdGVuIHdlIGFzayB0aGUgY2hpcCBmb3IgSVIgaW5mb3JtYXRpb24gKi8KKwlpci0+cG9sbGluZyA9IDEwMDsgLyogbXMgKi8KKworCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCisJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJlbTI4eHggSVIgKCVzKSIsCisJCQkJCQlkZXYtPm5hbWUpOworCisJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKKwlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOworCisJaXJfaW5wdXRfaW5pdChpbnB1dF9kZXYsICZpci0+aXIsIElSX1RZUEVfT1RIRVIsIGRldi0+Ym9hcmQuaXJfY29kZXMpOworCWlucHV0X2Rldi0+bmFtZSA9IGlyLT5uYW1lOworCWlucHV0X2Rldi0+cGh5cyA9IGlyLT5waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19VU0I7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmZGV2LT51ZGV2LT5kZXY7CisJLyogcmVjb3JkIGhhbmRsZXMgdG8gb3Vyc2VsZiAqLworCWlyLT5kZXYgPSBkZXY7CisJZGV2LT5pciA9IGlyOworCisJZW0yOHh4X2lyX3N0YXJ0KGlyKTsKKworCS8qIGFsbCBkb25lICovCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3N0b3A7CisKKwlyZXR1cm4gMDsKKyBlcnJfb3V0X3N0b3A6CisJZW0yOHh4X2lyX3N0b3AoaXIpOworCWRldi0+aXIgPSBOVUxMOworIGVycl9vdXRfZnJlZToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGlyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZW0yOHh4X2lyX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCXN0cnVjdCBlbTI4eHhfSVIgKmlyID0gZGV2LT5pcjsKKworCS8qIHNraXAgZGV0YWNoIG9uIG5vbiBhdHRhY2hlZCBib2FyZHMgKi8KKwlpZiAoIWlyKQorCQlyZXR1cm4gMDsKKworCWVtMjh4eF9pcl9zdG9wKGlyKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCWtmcmVlKGlyKTsKKworCS8qIGRvbmUgKi8KKwlkZXYtPmlyID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBIYW5kbGUgV2ViY2FtIHNuYXBzaG90IGJ1dHRvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHN0YXRpYyB2b2lkIGVtMjh4eF9xdWVyeV9zYnV0dG9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAkvKiBQb2xsIHRoZSByZWdpc3RlciBhbmQgc2VlIGlmIHRoZSBidXR0b24gaXMgZGVwcmVzc2VkICovCkBAIC0yMTAsOSArNDk5LDMgQEAKIAl9CiAJcmV0dXJuOwogfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmgKaW5kZXggZmFjMWFiMi4uNjVkY2I5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaApAQCAtMTcsMTcgKzE3LDU4IEBACiAKIC8qIGVtMjh4eCByZWdpc3RlcnMgKi8KIAorI2RlZmluZSBFTTI4WFhfUjAwX0NISVBDRkcJMHgwMAorCisvKiBlbTI4eHggQ2hpcCBDb25maWd1cmF0aW9uIDB4MDAgKi8KKyNkZWZpbmUgRU0yOFhYX0NISVBDRkdfVkVORE9SX0FVRElPCQkweDgwCisjZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0kyU19WT0xVTUVfQ0FQQUJMRQkweDQwCisjZGVmaW5lIEVNMjhYWF9DSElQQ0ZHX0kyU181X1NBTVBSQVRFUwkJMHgzMAorI2RlZmluZSBFTTI4WFhfQ0hJUENGR19JMlNfM19TQU1QUkFURVMJCTB4MjAKKyNkZWZpbmUgRU0yOFhYX0NISVBDRkdfQUM5NwkJCTB4MTAKKyNkZWZpbmUgRU0yOFhYX0NISVBDRkdfQVVESU9NQVNLCQkweDMwCisKIAkvKiBHUElPL0dQTyByZWdpc3RlcnMgKi8KICNkZWZpbmUgRU0yODgwX1IwNF9HUE8JMHgwNCAgICAvKiBlbTI4ODAtZW0yODgzIG9ubHkgKi8KICNkZWZpbmUgRU0yOFhYX1IwOF9HUElPCTB4MDgJLyogZW0yODIwIG9yIHVwcGVyICovCiAKICNkZWZpbmUgRU0yOFhYX1IwNl9JMkNfQ0xLCTB4MDYKKworLyogZW0yOHh4IEkyQyBDbG9jayBSZWdpc3RlciAoMHgwNikgKi8KKyNkZWZpbmUgRU0yOFhYX0kyQ19DTEtfQUNLX0xBU1RfUkVBRAkweDgwCisjZGVmaW5lIEVNMjhYWF9JMkNfQ0xLX1dBSVRfRU5BQkxFCTB4NDAKKyNkZWZpbmUgRU0yOFhYX0kyQ19FRVBST01fT05fQk9BUkQJMHgwOAorI2RlZmluZSBFTTI4WFhfSTJDX0VFUFJPTV9LRVlfVkFMSUQJMHgwNAorI2RlZmluZSBFTTI4NzRfSTJDX1NFQ09OREFSWV9CVVNfU0VMRUNUCTB4MDQgLyogZW0yODc0IGhhcyB0d28gaTJjIGJ1c3NlcyAqLworI2RlZmluZSBFTTI4WFhfSTJDX0ZSRVFfMV81X01IWgkJMHgwMyAvKiBidXMgZnJlcXVlbmN5IChiaXRzIFsxLTBdKSAqLworI2RlZmluZSBFTTI4WFhfSTJDX0ZSRVFfMjVfS0haCQkweDAyCisjZGVmaW5lIEVNMjhYWF9JMkNfRlJFUV80MDBfS0haCQkweDAxCisjZGVmaW5lIEVNMjhYWF9JMkNfRlJFUV8xMDBfS0haCQkweDAwCisKKwogI2RlZmluZSBFTTI4WFhfUjBBX0NISVBJRAkweDBhCiAjZGVmaW5lIEVNMjhYWF9SMENfVVNCU1VTUAkweDBjCS8qICovCiAKICNkZWZpbmUgRU0yOFhYX1IwRV9BVURJT1NSQwkweDBlCiAjZGVmaW5lIEVNMjhYWF9SMEZfWENMSwkweDBmCiAKKy8qIGVtMjh4eCBYQ0xLIFJlZ2lzdGVyICgweDBmKSAqLworI2RlZmluZSBFTTI4WFhfWENMS19BVURJT19VTk1VVEUJMHg4MCAvKiBvdGhlcndpc2UgYXVkaW8gbXV0ZWQgKi8KKyNkZWZpbmUgRU0yOFhYX1hDTEtfSTJTX01TQl9USU1JTkcJMHg0MCAvKiBvdGhlcndpc2Ugc3RhbmRhcmQgdGltaW5nICovCisjZGVmaW5lIEVNMjhYWF9YQ0xLX0lSX1JDNV9NT0RFCQkweDIwIC8qIG90aGVyd2lzZSBORUMgbW9kZSAqLworI2RlZmluZSBFTTI4WFhfWENMS19JUl9ORUNfQ0hLX1BBUklUWQkweDEwCisjZGVmaW5lIEVNMjhYWF9YQ0xLX0ZSRVFVRU5DWV8zME1IWgkweDAwIC8qIEZyZXEuIHNlbGVjdCAoYml0cyBbMy0wXSkgKi8KKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzE1TUhaCTB4MDEKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzEwTUhaCTB4MDIKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzdfNU1IWgkweDAzCisjZGVmaW5lIEVNMjhYWF9YQ0xLX0ZSRVFVRU5DWV82TUhaCTB4MDQKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzVNSFoJMHgwNQorI2RlZmluZSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfNF8zTUhaCTB4MDYKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzEyTUhaCTB4MDcKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzIwTUhaCTB4MDgKKyNkZWZpbmUgRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzIwTUhaXzIJMHgwOQorI2RlZmluZSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfNDhNSFoJMHgwYQorI2RlZmluZSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfMjRNSFoJMHgwYgorCiAjZGVmaW5lIEVNMjhYWF9SMTBfVklOTU9ERQkweDEwCiAjZGVmaW5lIEVNMjhYWF9SMTFfVklOQ1RSTAkweDExCiAjZGVmaW5lIEVNMjhYWF9SMTJfVklORU5BQkxFCTB4MTIJLyogKi8KQEAgLTU2LDYgKzk3LDE5IEBACiAjZGVmaW5lIEVNMjhYWF9SMjZfQ09NUFIJMHgyNgogI2RlZmluZSBFTTI4WFhfUjI3X09VVEZNVAkweDI3CiAKKy8qIGVtMjh4eCBPdXRwdXQgRm9ybWF0IFJlZ2lzdGVyICgweDI3KSAqLworI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl84X1JHUkcJMHgwMAorI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl84X0dSR1IJMHgwMQorI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl84X0dCR0IJMHgwMgorI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl84X0JHQkcJMHgwMworI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl8xNl82NTYJMHgwNAorI2RlZmluZSBFTTI4WFhfT1VURk1UX1JHQl84X0JBWUVSCTB4MDggLyogUGF0dGVybiBpbiBSZWcgMHgxMFsxLTBdICovCisjZGVmaW5lIEVNMjhYWF9PVVRGTVRfWVVWMjExCQkweDEwCisjZGVmaW5lIEVNMjhYWF9PVVRGTVRfWVVWNDIyX1kwVVkxVgkweDE0CisjZGVmaW5lIEVNMjhYWF9PVVRGTVRfWVVWNDIyX1kxVVkwVgkweDE1CisjZGVmaW5lIEVNMjhYWF9PVVRGTVRfWVVWNDExCQkweDE4CisKKwogI2RlZmluZSBFTTI4WFhfUjI4X1hNSU4JMHgyOAogI2RlZmluZSBFTTI4WFhfUjI5X1hNQVgJMHgyOQogI2RlZmluZSBFTTI4WFhfUjJBX1lNSU4JMHgyYQpAQCAtNzEsMTAgKzEyNSwzMiBAQAogI2RlZmluZSBFTTI4WFhfUjQyX0FDOTdBRERSCTB4NDIKICNkZWZpbmUgRU0yOFhYX1I0M19BQzk3QlVTWQkweDQzCiAKLS8qIGVtMjAyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBFTTI4WFhfUjAyX01BU1RFUl9BQzk3CTB4MDIKLSNkZWZpbmUgRU0yOFhYX1IxMF9MSU5FX0lOX0FDOTcgICAgMHgxMAotI2RlZmluZSBFTTI4WFhfUjE0X1ZJREVPX0FDOTcJMHgxNAorI2RlZmluZSBFTTI4WFhfUjQ1X0lSCQkweDQ1CisJLyogMHg0NSAgYml0IDcgICAgLSBwYXJpdHkgYml0CisJCSBiaXRzIDYtMCAtIGNvdW50CisJICAgMHg0NiAgSVIgYnJhbmQKKwkgICAweDQ3ICBJUiBkYXRhCisJICovCisKKy8qIGVtMjg3NCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU0yODc0X1I1MF9JUl9DT05GSUcgICAgMHg1MAorI2RlZmluZSBFTTI4NzRfUjUxX0lSICAgICAgICAgICAweDUxCisjZGVmaW5lIEVNMjg3NF9SNUZfVFNfRU5BQkxFICAgIDB4NWYKKyNkZWZpbmUgRU0yODc0X1I4MF9HUElPICAgICAgICAgMHg4MAorCisvKiBlbTI4NzQgSVIgY29uZmlnIHJlZ2lzdGVyICgweDUwKSAqLworI2RlZmluZSBFTTI4NzRfSVJfTkVDICAgICAgICAgICAweDAwCisjZGVmaW5lIEVNMjg3NF9JUl9SQzUgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRU0yODc0X0lSX1JDNV9NT0RFXzAgICAgMHgwOAorI2RlZmluZSBFTTI4NzRfSVJfUkM1X01PREVfNkEgICAweDBiCisKKy8qIGVtMjg3NCBUcmFuc3BvcnQgU3RyZWFtIEVuYWJsZSBSZWdpc3RlciAoMHg1ZikgKi8KKyNkZWZpbmUgRU0yODc0X1RTMV9DQVBUVVJFX0VOQUJMRSAoMSA8PCAwKQorI2RlZmluZSBFTTI4NzRfVFMxX0ZJTFRFUl9FTkFCTEUgICgxIDw8IDEpCisjZGVmaW5lIEVNMjg3NF9UUzFfTlVMTF9ESVNDQVJEICAgKDEgPDwgMikKKyNkZWZpbmUgRU0yODc0X1RTMl9DQVBUVVJFX0VOQUJMRSAoMSA8PCA0KQorI2RlZmluZSBFTTI4NzRfVFMyX0ZJTFRFUl9FTkFCTEUgICgxIDw8IDUpCisjZGVmaW5lIEVNMjg3NF9UUzJfTlVMTF9ESVNDQVJEICAgKDEgPDwgNikKIAogLyogcmVnaXN0ZXIgc2V0dGluZ3MgKi8KICNkZWZpbmUgRU0yODAwX0FVRElPX1NSQ19UVU5FUiAgMHgwZApAQCAtODQsNiArMTYwLDc1IEBACiAKIC8qIEZJWE1FOiBOZWVkIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBvdGhlciBjaGlwIElEJ3MgKi8KIGVudW0gZW0yOHh4X2NoaXBfaWQgeworCUNISVBfSURfRU0yODIwID0gMTgsCisJQ0hJUF9JRF9FTTI4NDAgPSAyMCwKKwlDSElQX0lEX0VNMjc1MCA9IDMzLAogCUNISVBfSURfRU0yODYwID0gMzQsCisJQ0hJUF9JRF9FTTI4NzAgPSAzNSwKIAlDSElQX0lEX0VNMjg4MyA9IDM2LAorCUNISVBfSURfRU0yODc0ID0gNjUsCiB9OworCisvKgorICogUmVnaXN0ZXJzIHVzZWQgYnkgZW0yMDIgYW5kIG90aGVyIEFDOTcgY2hpcHMKKyAqLworCisvKiBTdGFuZGFyZCBBQzk3IHJlZ2lzdGVycyAqLworI2RlZmluZSBBQzk3X1JFU0VUICAgICAgICAgICAgICAgMHgwMAorCisJLyogT3V0cHV0IHZvbHVtZXMgKi8KKyNkZWZpbmUgQUM5N19NQVNURVJfVk9MICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUM5N19MSU5FX0xFVkVMX1ZPTCAgICAgIDB4MDQJLyogU29tZSBkZXZpY2VzIHVzZSBmb3IgaGVhZHBob25lcyAqLworI2RlZmluZSBBQzk3X01BU1RFUl9NT05PX1ZPTCAgICAgMHgwNgorCisJLyogSW5wdXQgdm9sdW1lcyAqLworI2RlZmluZSBBQzk3X1BDX0JFRVBfVk9MICAgICAgICAgMHgwYQorI2RlZmluZSBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAgMHgwYworI2RlZmluZSBBQzk3X01JQ19WT0wgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAgMHgxMAorI2RlZmluZSBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBBQzk3X1ZJREVPX1ZPTCAgICAgICAgICAgMHgxNAorI2RlZmluZSBBQzk3X0FVWF9WT0wgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBBQzk3X1BDTV9PVVRfVk9MICAgICAgICAgMHgxOAorCisJLyogY2FwdHVyZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgIDB4MWEKKyNkZWZpbmUgQUM5N19SRUNPUkRfR0FJTiAgICAgICAgIDB4MWMKKworCS8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFDOTdfR0VORVJBTF9QVVJQT1NFICAgICAweDIwCisjZGVmaW5lIEFDOTdfM0RfQ1RSTCAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEFDOTdfQVVEX0lOVF9BTkRfUEFHICAgICAweDI0CisjZGVmaW5lIEFDOTdfUE9XRVJfRE9XTl9DVFJMICAgICAweDI2CisjZGVmaW5lIEFDOTdfRVhUX0FVRF9JRCAgICAgICAgICAweDI4CisjZGVmaW5lIEFDOTdfRVhUX0FVRF9DVFJMICAgICAgICAweDJhCisKKy8qIFN1cHBvcnRlZCByYXRlIHZhcmllcyBmb3IgZWFjaCBBQzk3IGRldmljZQorICAgaWYgd3JpdGUgYW4gdW5zdXBwb3J0ZWQgdmFsdWUsIGl0IHdpbGwgcmV0dXJuIHRoZSBjbG9zZXN0IG9uZQorICovCisjZGVmaW5lIEFDOTdfUENNX09VVF9GUk9OVF9TUkFURSAweDJjCisjZGVmaW5lIEFDOTdfUENNX09VVF9TVVJSX1NSQVRFICAweDJlCisjZGVmaW5lIEFDOTdfUENNX09VVF9MRkVfU1JBVEUgICAweDMwCisjZGVmaW5lIEFDOTdfUENNX0lOX1NSQVRFICAgICAgICAweDMyCisKKwkvKiBGb3IgZGV2aWNlcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzLCBleHRyYSBvdXRwdXQgdm9sdW1lcyAqLworI2RlZmluZSBBQzk3X0xGRV9NQVNURVJfVk9MICAgICAgMHgzNgorI2RlZmluZSBBQzk3X1NVUlJfTUFTVEVSX1ZPTCAgICAgMHgzOAorCisJLyogRGlnaXRhbCBTUERJRiBvdXRwdXQgY29udHJvbCAqLworI2RlZmluZSBBQzk3X1NQRElGX09VVF9DVFJMICAgICAgMHgzYQorCisJLyogVmVuZG9yIElEIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgQUM5N19WRU5ET1JfSUQxICAgICAgICAgIDB4N2MKKyNkZWZpbmUgQUM5N19WRU5ET1JfSUQyICAgICAgICAgIDB4N2UKKworLyogRU1QMjAyIHZlbmRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU0yMDJfRVhUX01PREVNX0NUUkwgICAgIDB4M2UKKyNkZWZpbmUgRU0yMDJfR1BJT19DT05GICAgICAgICAgIDB4NGMKKyNkZWZpbmUgRU0yMDJfR1BJT19QT0xBUklUWSAgICAgIDB4NGUKKyNkZWZpbmUgRU0yMDJfR1BJT19TVElDS1kgICAgICAgIDB4NTAKKyNkZWZpbmUgRU0yMDJfR1BJT19NQVNLICAgICAgICAgIDB4NTIKKyNkZWZpbmUgRU0yMDJfR1BJT19TVEFUVVMgICAgICAgIDB4NTQKKyNkZWZpbmUgRU0yMDJfU1BESUZfT1VUX1NFTCAgICAgIDB4NmEKKyNkZWZpbmUgRU0yMDJfQU5USVBPUCAgICAgICAgICAgIDB4NzIKKyNkZWZpbmUgRU0yMDJfRUFQRF9HUElPX0FDQ0VTUyAgIDB4NzQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKaW5kZXggNGVhMWYxZS4uNTM1Mjc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJlbTI4eHguaCIKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9tc3AzNDAwLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KIApAQCAtNDcsOSArNDgsOCBAQAogCQkgICAgICAiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+LCAiIFwKIAkJICAgICAgIlNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPiIKIAotI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICJlbTI4eHgiCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgIkVtcGlhIGVtMjh4eCBiYXNlZCBVU0IgdmlkZW8gZGV2aWNlIGRyaXZlciIKLSNkZWZpbmUgRU0yOFhYX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMCwgMSwgMCkKKyNkZWZpbmUgRU0yOFhYX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMCwgMSwgMSkKIAogI2RlZmluZSBlbTI4eHhfdmlkZW9kYmcoZm10LCBhcmcuLi4pIGRvIHtcCiAJaWYgKHZpZGVvX2RlYnVnKSBcCkBAIC03MiwxOSArNzIsMTMgQEAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBMSVNUX0hFQUQoZW0yOHh4X2Rldmxpc3QpOwotc3RhdGljIERFRklORV9NVVRFWChlbTI4eHhfZGV2bGlzdF9tdXRleCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtdICAgICA9IHtbMCAuLi4gKEVNMjhYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19ucltdID0ge1swIC4uLiAoRU0yOFhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHZiaV9ucltdICAgPSB7WzAgLi4uIChFTTI4WFhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fbnJbXSA9IHtbMCAuLi4gKEVNMjhYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OwogCi1tb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgIGludCwgTlVMTCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsIGludCwgTlVMTCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkodmJpX25yLCBpbnQsIE5VTEwsIDA0NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KHJhZGlvX25yLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAgICAgImNhcmQgdHlwZSIpOwogTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwgInZpZGVvIGRldmljZSBudW1iZXJzIik7CiBNT0RVTEVfUEFSTV9ERVNDKHZiaV9uciwgICAidmJpIGRldmljZSBudW1iZXJzIik7CiBNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAicmFkaW8gZGV2aWNlIG51bWJlcnMiKTsKQEAgLTkzLDggKzg3LDE1IEBACiBtb2R1bGVfcGFyYW0odmlkZW9fZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFt2aWRlb10iKTsKIAotLyogQml0bWFzayBtYXJraW5nIGFsbG9jYXRlZCBkZXZpY2VzIGZyb20gMCB0byBFTTI4WFhfTUFYQk9BUkRTICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBlbTI4eHhfZGV2dXNlZDsKKy8qIHN1cHBvcnRlZCB2aWRlbyBzdGFuZGFyZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X2ZtdCBmb3JtYXRbXSA9IHsKKwl7CisJCS5uYW1lICAgICA9ICIxNmJwcCBZVVkyLCA0OjI6MiwgcGFja2VkIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5kZXB0aCAgICA9IDE2LAorCQkucmVnCSAgPSBFTTI4WFhfT1VURk1UX1lVVjQyMl9ZMFVZMVYsCisJfSwKK307CiAKIC8qIHN1cHBvcnRlZCBjb250cm9scyAqLwogLyogQ29tbW9uIHRvIGFsbCBib2FyZHMgKi8KQEAgLTEyMCw4ICsxMjEsNiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbTI4eHhfdXNiX2RyaXZlcjsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJRE1BIGFuZCB0aHJlYWQgZnVuY3Rpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzg2LDE2ICszODUsMTggQEAKIAlzdHJ1Y3QgZW0yOHh4ICAgICAgICAqZGV2ID0gZmgtPmRldjsKIAlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZjsKIAotCSpzaXplID0gMTYgKiBmaC0+ZGV2LT53aWR0aCAqIGZoLT5kZXYtPmhlaWdodCA+PiAzOworCSpzaXplID0gKGZoLT5kZXYtPndpZHRoICogZmgtPmRldi0+aGVpZ2h0ICogZGV2LT5mb3JtYXQtPmRlcHRoICsgNykgPj4gMzsKKwogCWlmICgwID09ICpjb3VudCkKIAkJKmNvdW50ID0gRU0yOFhYX0RFRl9CVUY7CiAKIAlpZiAoKmNvdW50IDwgRU0yOFhYX01JTl9CVUYpCiAJCSpjb3VudCA9IEVNMjhYWF9NSU5fQlVGOwogCi0JLyogQXNrIHR1bmVyIHRvIGdvIHRvIGFuYWxvZyBtb2RlICovCisJLyogQXNrIHR1bmVyIHRvIGdvIHRvIGFuYWxvZyBvciByYWRpbyBtb2RlICovCiAJbWVtc2V0KCZmLCAwLCBzaXplb2YoZikpOwogCWYuZnJlcXVlbmN5ID0gZGV2LT5jdGxfZnJlcTsKKwlmLnR5cGUgPSBmaC0+cmFkaW8gPyBWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAKIAllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX0ZSRVFVRU5DWSwgJmYpOwogCkBAIC00MzgsOSArNDM5LDcgQEAKIAlzdHJ1Y3QgZW0yOHh4ICAgICAgICAqZGV2ID0gZmgtPmRldjsKIAlpbnQgICAgICAgICAgICAgICAgICByYyA9IDAsIHVyYl9pbml0ID0gMDsKIAotCS8qIEZJWE1FOiBJdCBhc3N1bWVzIGRlcHRoID0gMTYgKi8KLQkvKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIGZvcm1hdCBpcyAxNiBiaXRzL3BpeGVsICovCi0JYnVmLT52Yi5zaXplID0gMTYgKiBkZXYtPndpZHRoICogZGV2LT5oZWlnaHQgPj4gMzsKKwlidWYtPnZiLnNpemUgPSAoZmgtPmRldi0+d2lkdGggKiBmaC0+ZGV2LT5oZWlnaHQgKiBkZXYtPmZvcm1hdC0+ZGVwdGggKyA3KSA+PiAzOwogCiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTA4LDU2ICs1MDcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqICB2NGwyIGludGVyZmFjZSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBlbTI4eHhfY29uZmlnKCkKLSAqIGluaXRzIHJlZ2lzdGVycyB3aXRoIHNhbmUgZGVmYXVsdHMKLSAqLwotc3RhdGljIGludCBlbTI4eHhfY29uZmlnKHN0cnVjdCBlbTI4eHggKmRldikKLXsKLQlpbnQgcmV0dmFsOwotCi0JLyogU2V0cyBJMkMgc3BlZWQgdG8gMTAwIEtIeiAqLwotCWlmICghZGV2LT5pc19lbTI4MDApIHsKLQkJcmV0dmFsID0gZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgwNiwgIlx4NDAiLCAxKTsKLQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgZmFpbGVkISByZXR2YWwgWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0KLQl9Ci0KLQkvKiBlbmFibGUgdmJpIGNhcHR1cmluZyAqLwotCi0vKgllbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDBlLCAiXHhDMCIsIDEpOyBhdWRpbyByZWdpc3RlciAqLwotLyoJZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgwZiwgIlx4ODAiLCAxKTsgY2xrIHJlZ2lzdGVyICovCi0JZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgxMSwgIlx4NTEiLCAxKTsKLQotCWRldi0+bXV0ZSA9IDE7CQkvKiBtYXliZSBub3QgdGhlIHJpZ2h0IHBsYWNlLi4uICovCi0JZGV2LT52b2x1bWUgPSAweDFmOwotCi0JZW0yOHh4X291dGZtdF9zZXRfeXV2NDIyKGRldik7Ci0JZW0yOHh4X2NvbG9ybGV2ZWxzX3NldF9kZWZhdWx0KGRldik7Ci0JZW0yOHh4X2NvbXByZXNzaW9uX2Rpc2FibGUoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogZW0yOHh4X2NvbmZpZ19pMmMoKQotICogY29uZmlndXJlIGkyYyBhdHRhY2hlZCBkZXZpY2VzCi0gKi8KLXN0YXRpYyB2b2lkIGVtMjh4eF9jb25maWdfaTJjKHN0cnVjdCBlbTI4eHggKmRldikKLXsKLQlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwotCWludCB6ZXJvID0gMDsKLQotCXJvdXRlLmlucHV0ID0gSU5QVVQoZGV2LT5jdGxfaW5wdXQpLT52bXV4OwotCXJvdXRlLm91dHB1dCA9IDA7Ci0JZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1JFU0VULCAmemVybyk7Ci0JZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKLQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TVFJFQU1PTiwgTlVMTCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHZpZGVvX211eChzdHJ1Y3QgZW0yOHh4ICpkZXYsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwpAQCAtNTY2LDEwICs1MTUsMTQgQEAKIAlyb3V0ZS5vdXRwdXQgPSAwOwogCWRldi0+Y3RsX2lucHV0ID0gaW5kZXg7CiAJZGV2LT5jdGxfYWlucHV0ID0gSU5QVVQoaW5kZXgpLT5hbXV4OworCWRldi0+Y3RsX2FvdXRwdXQgPSBJTlBVVChpbmRleCktPmFvdXQ7CisKKwlpZiAoIWRldi0+Y3RsX2FvdXRwdXQpCisJCWRldi0+Y3RsX2FvdXRwdXQgPSBFTTI4WFhfQU9VVF9NQVNURVI7CiAKIAllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOwogCi0JaWYgKGRldi0+aGFzX21zcDM0eHgpIHsKKwlpZiAoZGV2LT5ib2FyZC5oYXNfbXNwMzR4eCkgewogCQlpZiAoZGV2LT5pMnNfc3BlZWQpIHsKIAkJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0lOVF9JMlNfQ0xPQ0tfRlJFUSwKIAkJCQkmZGV2LT5pMnNfc3BlZWQpOwpAQCAtNTk1LDEyICs1NDgsMTAgQEAKIAkJcmV0dXJuIHJjOwogCiAJaWYgKGRldi0+c3RyZWFtX29uKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FQlVTWTsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJZGV2LT5zdHJlYW1fb24gPSAxOwogCWZoLT5zdHJlYW1fb24gID0gMTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02MTMsMTAgKzU2NCw4IEBACiB7CiAJc3RydWN0IGVtMjh4eCAgICAqZGV2ID0gZmgtPmRldjsKIAotCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJZmgtPnN0cmVhbV9vbiA9IDA7CiAJZGV2LT5zdHJlYW1fb24gPSAwOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIH0KIAogLyoKQEAgLTcwMyw4ICs2NTIsOCBAQAogCiAJZi0+Zm10LnBpeC53aWR0aCA9IGRldi0+d2lkdGg7CiAJZi0+Zm10LnBpeC5oZWlnaHQgPSBkZXYtPmhlaWdodDsKLQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSBkZXYtPndpZHRoICogMjsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZGV2LT5mb3JtYXQtPmZvdXJjYzsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IChkZXYtPndpZHRoICogZGV2LT5mb3JtYXQtPmRlcHRoICsgNykgPj4gMzsKIAlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lICAqIGRldi0+aGVpZ2h0OwogCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CiAKQEAgLTcxNiw2ICs2NjUsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBlbTI4eHhfZm10ICpmb3JtYXRfYnlfZm91cmNjKHVuc2lnbmVkIGludCBmb3VyY2MpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXQpOyBpKyspCisJCWlmIChmb3JtYXRbaV0uZm91cmNjID09IGZvdXJjYykKKwkJCXJldHVybiAmZm9ybWF0W2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKQEAgLTcyNiwyNCArNjg2LDMwIEBACiAJdW5zaWduZWQgaW50ICAgICAgICAgIG1heHcgICA9IG5vcm1fbWF4dyhkZXYpOwogCXVuc2lnbmVkIGludCAgICAgICAgICBtYXhoICAgPSBub3JtX21heGgoZGV2KTsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgaHNjYWxlLCB2c2NhbGU7CisJc3RydWN0IGVtMjh4eF9mbXQgICAgICpmbXQ7CisKKwlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWlmICghZm10KSB7CisJCWVtMjh4eF92aWRlb2RiZygiRm91cmNjIGZvcm1hdCAoJTA4eCkgaW52YWxpZC5cbiIsCisJCQkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qIHdpZHRoIG11c3QgZXZlbiBiZWNhdXNlIG9mIHRoZSBZVVlWIGZvcm1hdAogCSAgIGhlaWdodCBtdXN0IGJlIGV2ZW4gYmVjYXVzZSBvZiBpbnRlcmxhY2luZyAqLwogCWhlaWdodCAmPSAweGZmZmU7Ci0Jd2lkdGggJj0gMHhmZmZlOworCXdpZHRoICAmPSAweGZmZmU7CiAKLQlpZiAoaGVpZ2h0IDwgMzIpCisJaWYgKHVubGlrZWx5KGhlaWdodCA8IDMyKSkKIAkJaGVpZ2h0ID0gMzI7Ci0JaWYgKGhlaWdodCA+IG1heGgpCisJaWYgKHVubGlrZWx5KGhlaWdodCA+IG1heGgpKQogCQloZWlnaHQgPSBtYXhoOwotCWlmICh3aWR0aCA8IDQ4KQorCWlmICh1bmxpa2VseSh3aWR0aCA8IDQ4KSkKIAkJd2lkdGggPSA0ODsKLQlpZiAod2lkdGggPiBtYXh3KQorCWlmICh1bmxpa2VseSh3aWR0aCA+IG1heHcpKQogCQl3aWR0aCA9IG1heHc7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCi0JaWYgKGRldi0+aXNfZW0yODAwKSB7CisJaWYgKGRldi0+Ym9hcmQuaXNfZW0yODAwKSB7CiAJCS8qIHRoZSBlbTI4MDAgY2FuIG9ubHkgc2NhbGUgZG93biB0byA1MCUgKi8KIAkJaWYgKGhlaWdodCAlIChtYXhoIC8gMikpCiAJCQloZWlnaHQgPSBtYXhoOwpAQCAtNzY2LDEzICs3MzIsMTIgQEAKIAogCWYtPmZtdC5waXgud2lkdGggPSB3aWR0aDsKIAlmLT5mbXQucGl4LmhlaWdodCA9IGhlaWdodDsKLQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSB3aWR0aCAqIDI7Ci0JZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSB3aWR0aCAqIDIgKiBoZWlnaHQ7CisJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IGZtdC0+Zm91cmNjOworCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gKGRldi0+d2lkdGggKiBmbXQtPmRlcHRoICsgNykgPj4gMzsKKwlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lICogaGVpZ2h0OwogCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CiAJZi0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKIAotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzgyLDE0ICs3NDcsMjEgQEAKIAlzdHJ1Y3QgZW0yOHh4X2ZoICAgICAgKmZoICA9IHByaXY7CiAJc3RydWN0IGVtMjh4eCAgICAgICAgICpkZXYgPSBmaC0+ZGV2OwogCWludCAgICAgICAgICAgICAgICAgICByYzsKKwlzdHJ1Y3QgZW0yOHh4X2ZtdCAgICAgKmZtdDsKIAogCXJjID0gY2hlY2tfZGV2KGRldik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwogCXZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCWZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJaWYgKCFmbXQpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAodmlkZW9idWZfcXVldWVfaXNfYnVzeSgmZmgtPnZiX3ZpZHEpKSB7CiAJCWVtMjh4eF9lcnJkZXYoIiVzIHF1ZXVlIGJ1c3lcbiIsIF9fZnVuY19fKTsKQEAgLTgwNiw2ICs3NzgsNyBAQAogCS8qIHNldCBuZXcgaW1hZ2Ugc2l6ZSAqLwogCWRldi0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwogCWRldi0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7CisJZGV2LT5mb3JtYXQgPSBmbXQ7CiAJZ2V0X3NjYWxlKGRldiwgZGV2LT53aWR0aCwgZGV2LT5oZWlnaHQsICZkZXYtPmhzY2FsZSwgJmRldi0+dnNjYWxlKTsKIAogCWVtMjh4eF9zZXRfYWx0ZXJuYXRlKGRldik7CkBAIC04MzEsMTUgKzgwNCwxMiBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAlkZXYtPm5vcm0gPSAqbm9ybTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAkvKiBBZGp1c3RzIHdpZHRoL2hlaWdodCwgaWYgbmVlZGVkICovCiAJZi5mbXQucGl4LndpZHRoID0gZGV2LT53aWR0aDsKIAlmLmZtdC5waXguaGVpZ2h0ID0gZGV2LT5oZWlnaHQ7CiAJdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCAmZik7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCiAJLyogc2V0IG5ldyBpbWFnZSBzaXplICovCiAJZGV2LT53aWR0aCA9IGYuZm10LnBpeC53aWR0aDsKIAlkZXYtPmhlaWdodCA9IGYuZm10LnBpeC5oZWlnaHQ7CkBAIC05MjgsMjAgKzg5OCwzOCBAQAogewogCXN0cnVjdCBlbTI4eHhfZmggICAqZmggICAgPSBwcml2OwogCXN0cnVjdCBlbTI4eHggICAgICAqZGV2ICAgPSBmaC0+ZGV2OwotCXVuc2lnbmVkIGludCAgICAgICAgaW5kZXggPSBhLT5pbmRleDsKIAotCWlmIChhLT5pbmRleCA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5kZXggPSBkZXYtPmN0bF9haW5wdXQ7Ci0KLQlpZiAoaW5kZXggPT0gMCkKKwlzd2l0Y2ggKGEtPmluZGV4KSB7CisJY2FzZSBFTTI4WFhfQU1VWF9WSURFTzoKIAkJc3RyY3B5KGEtPm5hbWUsICJUZWxldmlzaW9uIik7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIEVNMjhYWF9BTVVYX0xJTkVfSU46CiAJCXN0cmNweShhLT5uYW1lLCAiTGluZSBJbiIpOworCQlicmVhazsKKwljYXNlIEVNMjhYWF9BTVVYX1ZJREVPMjoKKwkJc3RyY3B5KGEtPm5hbWUsICJUZWxldmlzaW9uIGFsdCIpOworCQlicmVhazsKKwljYXNlIEVNMjhYWF9BTVVYX1BIT05FOgorCQlzdHJjcHkoYS0+bmFtZSwgIlBob25lIik7CisJCWJyZWFrOworCWNhc2UgRU0yOFhYX0FNVVhfTUlDOgorCQlzdHJjcHkoYS0+bmFtZSwgIk1pYyIpOworCQlicmVhazsKKwljYXNlIEVNMjhYWF9BTVVYX0NEOgorCQlzdHJjcHkoYS0+bmFtZSwgIkNEIik7CisJCWJyZWFrOworCWNhc2UgRU0yOFhYX0FNVVhfQVVYOgorCQlzdHJjcHkoYS0+bmFtZSwgIkF1eCIpOworCQlicmVhazsKKwljYXNlIEVNMjhYWF9BTVVYX1BDTV9PVVQ6CisJCXN0cmNweShhLT5uYW1lLCAiUENNIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAorCWEtPmluZGV4ID0gZGV2LT5jdGxfYWlucHV0OwogCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87Ci0JYS0+aW5kZXggPSBpbmRleDsKIAogCXJldHVybiAwOwogfQpAQCAtOTUxLDkgKzkzOSwxNSBAQAogCXN0cnVjdCBlbTI4eHhfZmggICAqZmggID0gcHJpdjsKIAlzdHJ1Y3QgZW0yOHh4ICAgICAgKmRldiA9IGZoLT5kZXY7CiAKLQlpZiAoYS0+aW5kZXggIT0gZGV2LT5jdGxfYWlucHV0KQotCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCisJZGV2LT5jdGxfYWlucHV0ID0gSU5QVVQoYS0+aW5kZXgpLT5hbXV4OworCWRldi0+Y3RsX2FvdXRwdXQgPSBJTlBVVChhLT5pbmRleCktPmFvdXQ7CisKKwlpZiAoIWRldi0+Y3RsX2FvdXRwdXQpCisJCWRldi0+Y3RsX2FvdXRwdXQgPSBFTTI4WFhfQU9VVF9NQVNURVI7CisKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk3NCw3ICs5NjgsNyBAQAogCiAJcWMtPmlkID0gaWQ7CiAKLQlpZiAoIWRldi0+aGFzX21zcDM0eHgpIHsKKwlpZiAoIWRldi0+Ym9hcmQuaGFzX21zcDM0eHgpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW0yOHh4X3FjdHJsKTsgaSsrKSB7CiAJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBlbTI4eHhfcWN0cmxbaV0uaWQpIHsKIAkJCQltZW1jcHkocWMsICYoZW0yOHh4X3FjdHJsW2ldKSwgc2l6ZW9mKCpxYykpOwpAQCAtMTAwMiwxNyArOTk2LDE0IEBACiAJcmMgPSBjaGVja19kZXYoZGV2KTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CisJcmMgPSAwOworCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAotCWlmICghZGV2LT5oYXNfbXNwMzR4eCkKLQkJcmMgPSBlbTI4eHhfZ2V0X2N0cmwoZGV2LCBjdHJsKTsKLQllbHNlCi0JCXJjID0gLUVJTlZBTDsKLQotCWlmIChyYyA9PSAtRUlOVkFMKSB7CisJaWYgKGRldi0+Ym9hcmQuaGFzX21zcDM0eHgpCiAJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0dfQ1RSTCwgY3RybCk7Ci0JCXJjID0gMDsKLQl9CisJZWxzZQorCQlyYyA9IGVtMjh4eF9nZXRfY3RybChkZXYsIGN0cmwpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiByYzsKQEAgLTEwMzIsNyArMTAyMyw3IEBACiAKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCi0JaWYgKGRldi0+aGFzX21zcDM0eHgpCisJaWYgKGRldi0+Ym9hcmQuaGFzX21zcDM0eHgpCiAJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX1NfQ1RSTCwgY3RybCk7CiAJZWxzZSB7CiAJCXJjID0gMTsKQEAgLTExMTIsOCArMTEwMywxMCBAQAogCXN0cnVjdCBlbTI4eHhfZmggICAgICAqZmggID0gcHJpdjsKIAlzdHJ1Y3QgZW0yOHh4ICAgICAgICAgKmRldiA9IGZoLT5kZXY7CiAKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWYtPnR5cGUgPSBmaC0+cmFkaW8gPyBWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJZi0+ZnJlcXVlbmN5ID0gZGV2LT5jdGxfZnJlcTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNDMsNiArMTEzNiw3IEBACiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19GUkVRVUVOQ1ksIGYpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNTksNiArMTE1MywyMSBAQAogCX0KIH0KIAorc3RhdGljIGludCB2aWRpb2NfZ19jaGlwX2lkZW50KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCSAgICAgICBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCXN0cnVjdCBlbTI4eHhfZmggICAgICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgZW0yOHh4ICAgICAgICAgKmRldiA9IGZoLT5kZXY7CisKKwljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLT5yZXZpc2lvbiA9IDA7CisKKwllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19HX0NISVBfSURFTlQsIGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCB2aWRpb2NfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKIHsKQEAgLTExNjYsMTkgKzExNzUsNDMgQEAKIAlzdHJ1Y3QgZW0yOHh4ICAgICAgICAgKmRldiA9IGZoLT5kZXY7CiAJaW50IHJldDsKIAotCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QocmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKHJlZy0+bWF0Y2hfdHlwZSkgeworCWNhc2UgVjRMMl9DSElQX01BVENIX0FDOTc6CisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJCXJldCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCByZWctPnJlZyk7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCisJCXJlZy0+dmFsID0gcmV0OworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0hJUF9NQVRDSF9JMkNfRFJJVkVSOgorCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19EQkdfR19SRUdJU1RFUiwgcmVnKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI6CisJCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QocmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWF0Y2ggaG9zdCAqLwogCWlmIChlbTI4eHhfcmVnX2xlbihyZWctPnJlZykgPT0gMSkgeworCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCQlyZXQgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCByZWctPnJlZyk7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKIAkJcmVnLT52YWwgPSByZXQ7CiAJfSBlbHNlIHsKIAkJX19sZTY0IHZhbCA9IDA7CisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJCXJldCA9IGVtMjh4eF9yZWFkX3JlZ19yZXFfbGVuKGRldiwgVVNCX1JFUV9HRVRfU1RBVFVTLAogCQkJCQkJICAgcmVnLT5yZWcsIChjaGFyICopJnZhbCwgMik7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0xMTk0LDExICsxMjI3LDM1IEBACiAJc3RydWN0IGVtMjh4eF9maCAgICAgICpmaCAgPSBwcml2OwogCXN0cnVjdCBlbTI4eHggICAgICAgICAqZGV2ID0gZmgtPmRldjsKIAlfX2xlNjQgYnVmOworCWludCAgICByYzsKIAorCXN3aXRjaCAocmVnLT5tYXRjaF90eXBlKSB7CisJY2FzZSBWNEwyX0NISVBfTUFUQ0hfQUM5NzoKKwkJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwkJcmMgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIHJlZy0+cmVnLCByZWctPnZhbCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCQlyZXR1cm4gcmM7CisJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUjoKKwkJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfREJHX1NfUkVHSVNURVIsIHJlZyk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSElQX01BVENIX0kyQ19BRERSOgorCQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1hdGNoIGhvc3QgKi8KIAlidWYgPSBjcHVfdG9fbGU2NChyZWctPnZhbCk7CiAKLQlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCByZWctPnJlZywgKGNoYXIgKikmYnVmLAotCQkJCSBlbTI4eHhfcmVnX2xlbihyZWctPnJlZykpOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcmMgPSBlbTI4eHhfd3JpdGVfcmVncyhkZXYsIHJlZy0+cmVnLCAoY2hhciAqKSZidWYsCisJCQkgICAgICAgZW0yOHh4X3JlZ19sZW4ocmVnLT5yZWcpKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKKwlyZXR1cm4gcmM7CiB9CiAjZW5kaWYKIApAQCAtMTIzNSwxMCArMTI5MiwxNSBAQAogCQlyZXR1cm4gcmM7CiAKIAotCWlmICh1bmxpa2VseShyZXNfZ2V0KGZoKSA8IDApKQotCQlyZXR1cm4gLUVCVVNZOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcmMgPSByZXNfZ2V0KGZoKTsKIAotCXJldHVybiAodmlkZW9idWZfc3RyZWFtb24oJmZoLT52Yl92aWRxKSk7CisJaWYgKGxpa2VseShyYyA+PSAwKSkKKwkJcmMgPSB2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMjU3LDkgKzEzMTksMTMgQEAKIAlpZiAodHlwZSAhPSBmaC0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCiAJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJfdmlkcSk7CiAJcmVzX2ZyZWUoZmgpOwogCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNzEsNyArMTMzNyw3IEBACiAKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCAiZW0yOHh4Iiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmNhcmQsIGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgZGV2LT51ZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOworCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgZGV2X25hbWUoJmRldi0+dWRldi0+ZGV2KSwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAogCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7CiAKQEAgLTEyODgsMTUgKzEzNTQsMTMgQEAKIH0KIAogc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdGQpCisJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCiB7Ci0JaWYgKGZtdGQtPmluZGV4ICE9IDApCisJaWYgKHVubGlrZWx5KGYtPmluZGV4ID49IEFSUkFZX1NJWkUoZm9ybWF0KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm10ZC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlzdHJjcHkoZm10ZC0+ZGVzY3JpcHRpb24sICJQYWNrZWQgWVVZMiIpOwotCWZtdGQtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7Ci0JbWVtc2V0KGZtdGQtPnJlc2VydmVkLCAwLCBzaXplb2YoZm10ZC0+cmVzZXJ2ZWQpKTsKKwlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCBmb3JtYXRbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0W2YtPmluZGV4XS5mb3VyY2M7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MjQsNyArMTQ4OCw3IEBACiAKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCAiZW0yOHh4Iiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmNhcmQsIGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgZGV2LT51ZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOworCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgZGV2X25hbWUoJmRldi0+dWRldi0+ZGV2KSwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAogCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKQEAgLTE0NDIsNyArMTUwNiwxMCBAQAogCXN0cmNweSh0LT5uYW1lLCAiUmFkaW8iKTsKIAl0LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAorCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfR19UVU5FUiwgdCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzQsNyArMTU0MSw5IEBACiAJaWYgKDAgIT0gdC0+aW5kZXgpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX1RVTkVSLCB0KTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MTYsMjggKzE1ODUsMTMgQEAKIHN0YXRpYyBpbnQgZW0yOHh4X3Y0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWludCBlcnJDb2RlID0gMCwgcmFkaW8gPSAwOwotCXN0cnVjdCBlbTI4eHggKmgsICpkZXYgPSBOVUxMOworCWludCBlcnJDb2RlID0gMCwgcmFkaW87CisJc3RydWN0IGVtMjh4eCAqZGV2OworCWVudW0gdjRsMl9idWZfdHlwZSBmaF90eXBlOwogCXN0cnVjdCBlbTI4eHhfZmggKmZoOwotCWVudW0gdjRsMl9idWZfdHlwZSBmaF90eXBlID0gMDsKIAotCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZlbTI4eHhfZGV2bGlzdCwgZGV2bGlzdCkgewotCQlpZiAoaC0+dmRldi0+bWlub3IgPT0gbWlub3IpIHsKLQkJCWRldiAgPSBoOwotCQkJZmhfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJfQotCQlpZiAoaC0+dmJpX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKLQkJCWRldiAgPSBoOwotCQkJZmhfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7Ci0JCX0KLQkJaWYgKGgtPnJhZGlvX2RldiAmJgotCQkgICAgaC0+cmFkaW9fZGV2LT5taW5vciA9PSBtaW5vcikgewotCQkJcmFkaW8gPSAxOwotCQkJZGV2ICAgPSBoOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCWRldiA9IGVtMjh4eF9nZXRfZGV2aWNlKGlub2RlLCAmZmhfdHlwZSwgJnJhZGlvKTsKKwogCWlmIChOVUxMID09IGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE1NzEsNyArMTYyNSw3IEBACiAJCS8qIE5lZWRlZCwgc2luY2UgR1BJTyBtaWdodCBoYXZlIGRpc2FibGVkIHBvd2VyIG9mCiAJCSAgIHNvbWUgaTJjIGRldmljZQogCQkgKi8KLQkJZW0yOHh4X2NvbmZpZ19pMmMoZGV2KTsKKwkJZW0yOHh4X3dha2VfaTJjKGRldik7CiAKIAl9CiAJaWYgKGZoLT5yYWRpbykgewpAQCAtMTU5NSwxNiArMTY0OSwxMSBAQAogICogdW5yZWdpc3RlcnMgdGhlIHY0bDIsaTJjIGFuZCB1c2IgZGV2aWNlcwogICogY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnZXRzIGRpc2NvbmVjdGVkIG9yIGF0IG1vZHVsZSB1bmxvYWQKICovCi1zdGF0aWMgdm9pZCBlbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGVtMjh4eCAqZGV2KQordm9pZCBlbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAogCS8qRklYTUU6IEkyQyBJUiBzaG91bGQgYmUgZGlzY29ubmVjdGVkICovCiAKLQllbTI4eHhfaW5mbygiVjRMMiBkZXZpY2VzIC9kZXYvdmlkZW8lZCBhbmQgL2Rldi92YmklZCBkZXJlZ2lzdGVyZWRcbiIsCi0JCQkJZGV2LT52ZGV2LT5udW0sIGRldi0+dmJpX2Rldi0+bnVtKTsKLQlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKLQlpZiAoZGV2LT5zYnV0dG9uX2lucHV0X2RldikKLQkJZW0yOHh4X2RlcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKGRldik7CiAJaWYgKGRldi0+cmFkaW9fZGV2KSB7CiAJCWlmICgtMSAhPSBkZXYtPnJhZGlvX2Rldi0+bWlub3IpCiAJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2Rldik7CkBAIC0xNjEzLDYgKzE2NjIsOCBAQAogCQlkZXYtPnJhZGlvX2RldiA9IE5VTEw7CiAJfQogCWlmIChkZXYtPnZiaV9kZXYpIHsKKwkJZW0yOHh4X2luZm8oIlY0TDIgZGV2aWNlIC9kZXYvdmJpJWQgZGVyZWdpc3RlcmVkXG4iLAorCQkJICAgIGRldi0+dmJpX2Rldi0+bnVtKTsKIAkJaWYgKC0xICE9IGRldi0+dmJpX2Rldi0+bWlub3IpCiAJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZiaV9kZXYpOwogCQllbHNlCkBAIC0xNjIwLDE3ICsxNjcxLDE0IEBACiAJCWRldi0+dmJpX2RldiA9IE5VTEw7CiAJfQogCWlmIChkZXYtPnZkZXYpIHsKKwkJZW0yOHh4X2luZm8oIlY0TDIgZGV2aWNlIC9kZXYvdmlkZW8lZCBkZXJlZ2lzdGVyZWRcbiIsCisJCQkgICAgZGV2LT52ZGV2LT5udW0pOwogCQlpZiAoLTEgIT0gZGV2LT52ZGV2LT5taW5vcikKIAkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmRldik7CiAJCWVsc2UKIAkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+dmRldik7CiAJCWRldi0+dmRldiA9IE5VTEw7CiAJfQotCWVtMjh4eF9pMmNfdW5yZWdpc3RlcihkZXYpOwotCXVzYl9wdXRfZGV2KGRldi0+dWRldik7Ci0KLQkvKiBNYXJrIGRldmljZSBhcyB1bnVzZWQgKi8KLQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PGRldi0+ZGV2bm8pOwogfQogCiAvKgpAQCAtMTY0NywxMSArMTY5NSwxMCBAQAogCWVtMjh4eF92aWRlb2RiZygidXNlcnM9JWRcbiIsIGRldi0+dXNlcnMpOwogCiAKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWlmIChyZXNfY2hlY2soZmgpKQogCQlyZXNfZnJlZShmaCk7CiAKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCiAJaWYgKGRldi0+dXNlcnMgPT0gMSkgewogCQl2aWRlb2J1Zl9zdG9wKCZmaC0+dmJfdmlkcSk7CiAJCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZiX3ZpZHEpOwpAQCAtMTY2NSw5ICsxNzEyLDEyIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCisJCS8qIFNhdmUgc29tZSBwb3dlciBieSBwdXR0aW5nIHR1bmVyIHRvIHNsZWVwICovCisJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOworCiAJCS8qIGRvIHRoaXMgYmVmb3JlIHNldHRpbmcgYWx0ZXJuYXRlISAqLwogCQllbTI4eHhfdW5pbml0X2lzb2MoZGV2KTsKLQkJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX01PREVfVU5ERUZJTkVEKTsKKwkJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX1NVU1BFTkQpOwogCiAJCS8qIHNldCBhbHRlcm5hdGUgMCAqLwogCQlkZXYtPmFsdCA9IDA7CkBAIC0xNzA2LDggKzE3NTYsMTIgQEAKIAkgKi8KIAogCWlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJaWYgKHVubGlrZWx5KHJlc19nZXQoZmgpKSkKLQkJCXJldHVybiAtRUJVU1k7CisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJCXJjID0gcmVzX2dldChmaCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCQlpZiAodW5saWtlbHkocmMgPCAwKSkKKwkJCXJldHVybiByYzsKIAogCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9zdHJlYW0oJmZoLT52Yl92aWRxLCBidWYsIGNvdW50LCBwb3MsIDAsCiAJCQkJCWZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKQEAgLTE3MjksNyArMTc4MywxMSBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCWlmICh1bmxpa2VseShyZXNfZ2V0KGZoKSA8IDApKQorCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcmMgPSByZXNfZ2V0KGZoKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKKwlpZiAodW5saWtlbHkocmMgPCAwKSkKIAkJcmV0dXJuIFBPTExFUlI7CiAKIAlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICE9IGZoLT50eXBlKQpAQCAtMTc0NywxMyArMTgwNSwxNyBAQAogCXN0cnVjdCBlbTI4eHgJICpkZXYgICA9IGZoLT5kZXY7CiAJaW50CQkgcmM7CiAKLQlpZiAodW5saWtlbHkocmVzX2dldChmaCkgPCAwKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCXJjID0gY2hlY2tfZGV2KGRldik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlyYyA9IHJlc19nZXQoZmgpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCWlmICh1bmxpa2VseShyYyA8IDApKQorCQlyZXR1cm4gcmM7CisKIAlyYyA9IHZpZGVvYnVmX21tYXBfbWFwcGVyKCZmaC0+dmJfdmlkcSwgdm1hKTsKIAogCWVtMjh4eF92aWRlb2RiZygidm1hIHN0YXJ0PTB4JTA4bHgsIHNpemU9JWxkLCByZXQ9JWRcbiIsCkBAIC0xODEwLDYgKzE4NzIsNyBAQAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkudmlkaW9jX2dfcmVnaXN0ZXIgICAgICAgICAgPSB2aWRpb2NfZ19yZWdpc3RlciwKIAkudmlkaW9jX3NfcmVnaXN0ZXIgICAgICAgICAgPSB2aWRpb2Nfc19yZWdpc3RlciwKKwkudmlkaW9jX2dfY2hpcF9pZGVudCAgICAgICAgPSB2aWRpb2NfZ19jaGlwX2lkZW50LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCiAJLnZpZGlvY2dtYnVmICAgICAgICAgICAgICAgID0gdmlkaW9jZ21idWYsCkBAIC0xODY1LDQ0ICsxOTI4LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB1c2IgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi1zdGF0aWMgTElTVF9IRUFEKGVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKLQotaW50IGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKm9wcykKLXsKLQlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZvcHMtPm5leHQsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKLQkJaWYgKGRldikKLQkJCW9wcy0+aW5pdChkZXYpOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOwotCW11dGV4X3VubG9jaygmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOwotCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChlbTI4eHhfcmVnaXN0ZXJfZXh0ZW5zaW9uKTsKLQotdm9pZCBlbTI4eHhfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKm9wcykKLXsKLQlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKLQkJaWYgKGRldikKLQkJCW9wcy0+ZmluaShkZXYpOwotCX0KLQotCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IFJlbW92ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7Ci0JbGlzdF9kZWwoJm9wcy0+bmV4dCk7Ci0JbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZGV2bGlzdF9tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlICplbTI4eHhfdmRldl9pbml0KHN0cnVjdCBlbTI4eHggKmRldiwKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKQEAgLTE5MjUsMTEgKzE5NTAsNDMgQEAKIAlyZXR1cm4gdmZkOwogfQogCi0KLXN0YXRpYyBpbnQgcmVnaXN0ZXJfYW5hbG9nX2RldmljZXMoc3RydWN0IGVtMjh4eCAqZGV2KQoraW50IGVtMjh4eF9yZWdpc3Rlcl9hbmFsb2dfZGV2aWNlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJaW50IHJldDsKIAorCXByaW50ayhLRVJOX0lORk8gIiVzOiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAorCQlkZXYtPm5hbWUsCisJCShFTTI4WFhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCisJCShFTTI4WFhfVkVSU0lPTl9DT0RFID4+IDgpICYgMHhmZiwgRU0yOFhYX1ZFUlNJT05fQ09ERSAmIDB4ZmYpOworCisJLyogQW5hbG9nIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJZGV2LT5mb3JtYXQgPSAmZm9ybWF0WzBdOworCXZpZGVvX211eChkZXYsIDApOworCisJLyogZW5hYmxlIHZiaSBjYXB0dXJpbmcgKi8KKworLyoJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMEVfQVVESU9TUkMsIDB4YzApOyBhdWRpbyByZWdpc3RlciAqLworLyoJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMEZfWENMSywgMHg4MCk7IGNsayByZWdpc3RlciAqLworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjExX1ZJTkNUUkwsIDB4NTEpOworCisJZGV2LT5tdXRlID0gMTsJCS8qIG1heWJlIG5vdCB0aGUgcmlnaHQgcGxhY2UuLi4gKi8KKwlkZXYtPnZvbHVtZSA9IDB4MWY7CisKKwllbTI4eHhfc2V0X291dGZtdChkZXYpOworCWVtMjh4eF9jb2xvcmxldmVsc19zZXRfZGVmYXVsdChkZXYpOworCWVtMjh4eF9jb21wcmVzc2lvbl9kaXNhYmxlKGRldik7CisKKwkvKiBzZXQgZGVmYXVsdCBub3JtICovCisJZGV2LT5ub3JtID0gZW0yOHh4X3ZpZGVvX3RlbXBsYXRlLmN1cnJlbnRfbm9ybTsKKwlkZXYtPndpZHRoID0gbm9ybV9tYXh3KGRldik7CisJZGV2LT5oZWlnaHQgPSBub3JtX21heGgoZGV2KTsKKwlkZXYtPmludGVybGFjZWQgPSBFTTI4WFhfSU5URVJMQUNFRF9ERUZBVUxUOworCWRldi0+aHNjYWxlID0gMDsKKwlkZXYtPnZzY2FsZSA9IDA7CisKKwkvKiBGSVhNRTogVGhpcyBpcyBhIHZlcnkgYmFkIGhhY2shIE5vdCBhbGwgZGV2aWNlcyBoYXZlIFRWIG9uIGlucHV0IDIgKi8KKwlkZXYtPmN0bF9pbnB1dCA9IDI7CisKIAkvKiBhbGxvY2F0ZSBhbmQgZmlsbCB2aWRlbyB2aWRlb19kZXZpY2Ugc3RydWN0ICovCiAJZGV2LT52ZGV2ID0gZW0yOHh4X3ZkZXZfaW5pdChkZXYsICZlbTI4eHhfdmlkZW9fdGVtcGxhdGUsICJ2aWRlbyIpOwogCWlmICghZGV2LT52ZGV2KSB7CkBAIC0xOTc4LDM4MyArMjAzNSwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotCi0vKgotICogZW0yOHh4X2luaXRfZGV2KCkKLSAqIGFsbG9jYXRlcyBhbmQgaW5pdHMgdGhlIGRldmljZSBzdHJ1Y3RzLCByZWdpc3RlcnMgaTJjIGJ1cyBhbmQgdjRsIGRldmljZQotICovCi1zdGF0aWMgaW50IGVtMjh4eF9pbml0X2RldihzdHJ1Y3QgZW0yOHh4ICoqZGV2aGFuZGxlLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJCSAgIGludCBtaW5vcikKLXsKLQlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKLQlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSAqZGV2aGFuZGxlOwotCWludCByZXR2YWwgPSAtRU5PTUVNOwotCWludCBlcnJDb2RlOwotCXVuc2lnbmVkIGludCBtYXhoLCBtYXh3OwotCi0JZGV2LT51ZGV2ID0gdWRldjsKLQltdXRleF9pbml0KCZkZXYtPmxvY2spOwotCW11dGV4X2luaXQoJmRldi0+Y3RybF91cmJfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+b3Blbik7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0X2ZyYW1lKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRfc3RyZWFtKTsKLQotCWRldi0+ZW0yOHh4X3dyaXRlX3JlZ3MgPSBlbTI4eHhfd3JpdGVfcmVnczsKLQlkZXYtPmVtMjh4eF9yZWFkX3JlZyA9IGVtMjh4eF9yZWFkX3JlZzsKLQlkZXYtPmVtMjh4eF9yZWFkX3JlZ19yZXFfbGVuID0gZW0yOHh4X3JlYWRfcmVnX3JlcV9sZW47Ci0JZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEgPSBlbTI4eHhfd3JpdGVfcmVnc19yZXE7Ci0JZGV2LT5lbTI4eHhfcmVhZF9yZWdfcmVxID0gZW0yOHh4X3JlYWRfcmVnX3JlcTsKLQlkZXYtPmlzX2VtMjgwMCA9IGVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0uaXNfZW0yODAwOwotCi0JZW0yOHh4X3ByZV9jYXJkX3NldHVwKGRldik7Ci0KLQllcnJDb2RlID0gZW0yOHh4X2NvbmZpZyhkZXYpOwotCWlmIChlcnJDb2RlKSB7Ci0JCWVtMjh4eF9lcnJkZXYoImVycm9yIGNvbmZpZ3VyaW5nIGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KLQllcnJDb2RlID0gZW0yOHh4X2kyY19yZWdpc3RlcihkZXYpOwotCWlmIChlcnJDb2RlIDwgMCkgewotCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X2kyY19yZWdpc3RlciAtIGVyckNvZGUgWyVkXSFcbiIsCi0JCQlfX2Z1bmNfXywgZXJyQ29kZSk7Ci0JCXJldHVybiBlcnJDb2RlOwotCX0KLQotCS8qIERvIGJvYXJkIHNwZWNpZmljIGluaXQgYW5kIGVlcHJvbSByZWFkaW5nICovCi0JZW0yOHh4X2NhcmRfc2V0dXAoZGV2KTsKLQotCS8qIENvbmZpZ3VyZSBhdWRpbyAqLwotCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldChkZXYpOwotCWlmIChlcnJDb2RlIDwgMCkgewotCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X2F1ZGlvX2FuYWxvZ19zZXQgLSBlcnJDb2RlIFslZF0hXG4iLAotCQkJX19mdW5jX18sIGVyckNvZGUpOwotCQlyZXR1cm4gZXJyQ29kZTsKLQl9Ci0KLQkvKiBjb25maWd1cmUgdGhlIGRldmljZSAqLwotCWVtMjh4eF9jb25maWdfaTJjKGRldik7Ci0KLQkvKiBzZXQgZGVmYXVsdCBub3JtICovCi0JZGV2LT5ub3JtID0gZW0yOHh4X3ZpZGVvX3RlbXBsYXRlLmN1cnJlbnRfbm9ybTsKLQotCW1heHcgPSBub3JtX21heHcoZGV2KTsKLQltYXhoID0gbm9ybV9tYXhoKGRldik7Ci0KLQkvKiBzZXQgZGVmYXVsdCBpbWFnZSBzaXplICovCi0JZGV2LT53aWR0aCA9IG1heHc7Ci0JZGV2LT5oZWlnaHQgPSBtYXhoOwotCWRldi0+aW50ZXJsYWNlZCA9IEVNMjhYWF9JTlRFUkxBQ0VEX0RFRkFVTFQ7Ci0JZGV2LT5oc2NhbGUgPSAwOwotCWRldi0+dnNjYWxlID0gMDsKLQlkZXYtPmN0bF9pbnB1dCA9IDI7Ci0KLQllcnJDb2RlID0gZW0yOHh4X2NvbmZpZyhkZXYpOwotCWlmIChlcnJDb2RlIDwgMCkgewotCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X2NvbmZpZyAtIGVyckNvZGUgWyVkXSFcbiIsCi0JCQlfX2Z1bmNfXywgZXJyQ29kZSk7Ci0JCXJldHVybiBlcnJDb2RlOwotCX0KLQotCS8qIGluaXQgdmlkZW8gZG1hIHF1ZXVlcyAqLwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZpZHEuYWN0aXZlKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLnF1ZXVlZCk7Ci0KLQotCWlmIChkZXYtPmhhc19tc3AzNHh4KSB7Ci0JCS8qIFNlbmQgYSByZXNldCB0byBvdGhlciBjaGlwcyB2aWEgZ3BpbyAqLwotCQllcnJDb2RlID0gZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgwOCwgIlx4ZjciLCAxKTsKLQkJaWYgKGVyckNvZGUgPCAwKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZ3NfcmVxIC0gbXNwMzR4eCgxKSBmYWlsZWQhIGVyckNvZGUgWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgZXJyQ29kZSk7Ci0JCQlyZXR1cm4gZXJyQ29kZTsKLQkJfQotCQltc2xlZXAoMyk7Ci0KLQkJZXJyQ29kZSA9IGVtMjh4eF93cml0ZV9yZWdzX3JlcShkZXYsIDB4MDAsIDB4MDgsICJceGZmIiwgMSk7Ci0JCWlmIChlcnJDb2RlIDwgMCkgewotCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSAtIG1zcDM0eHgoMikgZmFpbGVkISBlcnJDb2RlIFslZF1cbiIsCi0JCQkJX19mdW5jX18sIGVyckNvZGUpOwotCQkJcmV0dXJuIGVyckNvZGU7Ci0JCX0KLQkJbXNsZWVwKDMpOwotCX0KLQotCXZpZGVvX211eChkZXYsIDApOwotCi0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJmVtMjh4eF9kZXZsaXN0KTsKLQlyZXR2YWwgPSByZWdpc3Rlcl9hbmFsb2dfZGV2aWNlcyhkZXYpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWVtMjh4eF9yZWxlYXNlX3Jlc291cmNlcyhkZXYpOwotCQltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQkJZ290byBmYWlsX3JlZ19kZXZpY2VzOwotCX0KLQotCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKLQkJCWlmIChvcHMtPmlkKQotCQkJCW9wcy0+aW5pdChkZXYpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOwotCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfcmVnX2RldmljZXM6Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVTKSAmJiBkZWZpbmVkKE1PRFVMRSkKLXN0YXRpYyB2b2lkIHJlcXVlc3RfbW9kdWxlX2FzeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBjb250YWluZXJfb2Yod29yaywKLQkJCSAgICAgc3RydWN0IGVtMjh4eCwgcmVxdWVzdF9tb2R1bGVfd2spOwotCi0JaWYgKGRldi0+aGFzX2F1ZGlvX2NsYXNzKQotCQlyZXF1ZXN0X21vZHVsZSgic25kLXVzYi1hdWRpbyIpOwotCWVsc2UKLQkJcmVxdWVzdF9tb2R1bGUoImVtMjh4eC1hbHNhIik7Ci0KLQlpZiAoZGV2LT5oYXNfZHZiKQotCQlyZXF1ZXN0X21vZHVsZSgiZW0yOHh4LWR2YiIpOwotfQotCi1zdGF0aWMgdm9pZCByZXF1ZXN0X21vZHVsZXMoc3RydWN0IGVtMjh4eCAqZGV2KQotewotCUlOSVRfV09SSygmZGV2LT5yZXF1ZXN0X21vZHVsZV93aywgcmVxdWVzdF9tb2R1bGVfYXN5bmMpOwotCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVxdWVzdF9tb2R1bGVfd2spOwotfQotI2Vsc2UKLSNkZWZpbmUgcmVxdWVzdF9tb2R1bGVzKGRldikKLSNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLwotCi0vKgotICogZW0yOHh4X3VzYl9wcm9iZSgpCi0gKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCi0gKi8KLXN0YXRpYyBpbnQgZW0yOHh4X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aWY7Ci0Jc3RydWN0IGVtMjh4eCAqZGV2ID0gTlVMTDsKLQlpbnQgcmV0dmFsID0gLUVOT0RFVjsKLQlpbnQgaSwgbnIsIGlmbnVtOwotCi0JdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7Ci0JaWZudW0gPSBpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwotCi0JLyogQ2hlY2sgdG8gc2VlIG5leHQgZnJlZSBkZXZpY2UgYW5kIG1hcmsgYXMgdXNlZCAqLwotCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCgmZW0yOHh4X2RldnVzZWQsIEVNMjhYWF9NQVhCT0FSRFMpOwotCWVtMjh4eF9kZXZ1c2VkIHw9IDE8PG5yOwotCi0JLyogRG9uJ3QgcmVnaXN0ZXIgYXVkaW8gaW50ZXJmYWNlcyAqLwotCWlmIChpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX0FVRElPKSB7Ci0JCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBhdWRpbyBkZXZpY2UgKCUwNHg6JTA0eCk6IGludGVyZmFjZSAlaSwgY2xhc3MgJWlcbiIsCi0JCQkJdWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciwKLQkJCQl1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwKLQkJCQlpZm51bSwKLQkJCQlpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlQ2xhc3MpOwotCi0JCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICIgbmV3IHZpZGVvIGRldmljZSAoJTA0eDolMDR4KTogaW50ZXJmYWNlICVpLCBjbGFzcyAlaVxuIiwKLQkJCXVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCi0JCQl1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwKLQkJCWlmbnVtLAotCQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKLQotCWVuZHBvaW50ID0gJmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzFdLmRlc2M7Ci0KLQkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGhhcyB0aGUgaXNvIGluIGVuZHBvaW50IGF0IHRoZSBjb3JyZWN0IHBsYWNlICovCi0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9Ci0JICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKLQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIHByb2JpbmcgZXJyb3I6IGVuZHBvaW50IGlzIG5vbi1JU08gZW5kcG9pbnQhXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgewotCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICIgcHJvYmluZyBlcnJvcjogZW5kcG9pbnQgaXMgSVNPIE9VVCBlbmRwb2ludCFcbiIpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKG5yID49IEVNMjhYWF9NQVhCT0FSRFMpIHsKLQkJcHJpbnRrKERSSVZFUl9OQU1FICI6IFN1cHBvcnRzIG9ubHkgJWkgZW0yOHh4IGJvYXJkcy5cbiIsCi0JCQkJRU0yOFhYX01BWEJPQVJEUyk7Ci0JCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIjogb3V0IG9mIG1lbW9yeSFcbiIpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc25wcmludGYoZGV2LT5uYW1lLCAyOSwgImVtMjh4eCAjJWQiLCBucik7Ci0JZGV2LT5kZXZubyA9IG5yOwotCWRldi0+bW9kZWwgPSBpZC0+ZHJpdmVyX2luZm87Ci0JZGV2LT5hbHQgICA9IC0xOwotCi0JLyogQ2hlY2tzIGlmIGF1ZGlvIGlzIHByb3ZpZGVkIGJ5IHNvbWUgaW50ZXJmYWNlICovCi0JZm9yIChpID0gMDsgaSA8IHVkZXYtPmNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7Ci0JCXVpZiA9IHVkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQlpZiAodWlmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19BVURJTykgewotCQkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgJXMgdXNiIGF1ZGlvIGNsYXNzXG4iLAotCQkgICBkZXYtPmhhc19hdWRpb19jbGFzcyA/ICJIYXMiIDogIkRvZXNuJ3QgaGF2ZSIpOwotCi0JLyogY29tcHV0ZSBhbHRlcm5hdGUgbWF4IHBhY2tldCBzaXplcyAqLwotCXVpZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdOwotCi0JZGV2LT5udW1fYWx0ID0gdWlmLT5udW1fYWx0c2V0dGluZzsKLQllbTI4eHhfaW5mbygiQWx0ZXJuYXRlIHNldHRpbmdzOiAlaVxuIiwgZGV2LT5udW1fYWx0KTsKLS8qCWRldi0+YWx0X21heF9wa3Rfc2l6ZSA9IGttYWxsb2Moc2l6ZW9mKCpkZXYtPmFsdF9tYXhfcGt0X3NpemUpKiAqLwotCWRldi0+YWx0X21heF9wa3Rfc2l6ZSA9IGttYWxsb2MoMzIgKiBkZXYtPm51bV9hbHQsIEdGUF9LRVJORUwpOwotCi0JaWYgKGRldi0+YWx0X21heF9wa3Rfc2l6ZSA9PSBOVUxMKSB7Ci0JCWVtMjh4eF9lcnJkZXYoIm91dCBvZiBtZW1vcnkhXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9hbHQgOyBpKyspIHsKLQkJdTE2IHRtcCA9IGxlMTZfdG9fY3B1KHVpZi0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFsxXS5kZXNjLgotCQkJCQkJCXdNYXhQYWNrZXRTaXplKTsKLQkJZGV2LT5hbHRfbWF4X3BrdF9zaXplW2ldID0KLQkJICAgICh0bXAgJiAweDA3ZmYpICogKCgodG1wICYgMHgxODAwKSA+PiAxMSkgKyAxKTsKLQkJZW0yOHh4X2luZm8oIkFsdGVybmF0ZSBzZXR0aW5nICVpLCBtYXggc2l6ZT0gJWlcbiIsIGksCi0JCQkJCQlkZXYtPmFsdF9tYXhfcGt0X3NpemVbaV0pOwotCX0KLQotCWlmICgoY2FyZFtucl0gPj0gMCkgJiYgKGNhcmRbbnJdIDwgZW0yOHh4X2Jjb3VudCkpCi0JCWRldi0+bW9kZWwgPSBjYXJkW25yXTsKLQotCS8qIGFsbG9jYXRlIGRldmljZSBzdHJ1Y3QgKi8KLQlyZXR2YWwgPSBlbTI4eHhfaW5pdF9kZXYoJmRldiwgdWRldiwgbnIpOwotCWlmIChyZXR2YWwpIHsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxkZXYtPmRldm5vKTsKLQkJa2ZyZWUoZGV2KTsKLQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCWVtMjh4eF9pbmZvKCJGb3VuZCAlc1xuIiwgZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5uYW1lKTsKLQotCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKLQotCXJlcXVlc3RfbW9kdWxlcyhkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3QoKQotICogY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnZXRzIGRpY29uZW5jdGVkCi0gKiB2aWRlbyBkZXZpY2Ugd2lsbCBiZSB1bnJlZ2lzdGVyZWQgb24gdjRsMl9jbG9zZSBpbiBjYXNlIGl0IGlzIHN0aWxsIG9wZW4KLSAqLwotc3RhdGljIHZvaWQgZW0yOHh4X3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCi17Ci0Jc3RydWN0IGVtMjh4eCAqZGV2OwotCXN0cnVjdCBlbTI4eHhfb3BzICpvcHMgPSBOVUxMOwotCi0JZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQllbTI4eHhfaW5mbygiZGlzY29ubmVjdGluZyAlc1xuIiwgZGV2LT52ZGV2LT5uYW1lKTsKLQotCS8qIHdhaXQgdW50aWwgYWxsIGN1cnJlbnQgdjRsMiBpbyBpcyBmaW5pc2hlZCB0aGVuIGRlYWxsb2NhdGUKLQkgICByZXNvdXJjZXMgKi8KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmZGV2LT5vcGVuKTsKLQotCWlmIChkZXYtPnVzZXJzKSB7Ci0JCWVtMjh4eF93YXJuCi0JCSAgICAoImRldmljZSAvZGV2L3ZpZGVvJWQgaXMgb3BlbiEgRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSAiCi0JCSAgICAgImRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuXG4iLAotCQkJCWRldi0+dmRldi0+bnVtKTsKLQotCQlkZXYtPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwotCQllbTI4eHhfdW5pbml0X2lzb2MoZGV2KTsKLQkJZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d2FpdF9mcmFtZSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X3N0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOwotCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0X2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmZW0yOHh4X2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJb3BzLT5maW5pKGRldik7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3RfbG9jayk7Ci0KLQlpZiAoIWRldi0+dXNlcnMpIHsKLQkJa2ZyZWUoZGV2LT5hbHRfbWF4X3BrdF9zaXplKTsKLQkJa2ZyZWUoZGV2KTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbTI4eHhfdXNiX2RyaXZlciA9IHsKLQkubmFtZSA9ICJlbTI4eHgiLAotCS5wcm9iZSA9IGVtMjh4eF91c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlID0gZW0yOHh4X2lkX3RhYmxlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZW0yOHh4X21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQotCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKEVNMjhYWF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKEVNMjhYWF9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLCBFTTI4WFhfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QgLyAxMDAwMCwgKFNOQVBTSE9UIC8gMTAwKSAlIDEwMCwgU05BUFNIT1QgJSAxMDApOwotI2VuZGlmCi0KLQkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZlbTI4eHhfdXNiX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCkKLQkJZW0yOHh4X2VycihEUklWRVJfTkFNRQotCQkJICAgIiB1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQuXG4iLCByZXN1bHQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGVtMjh4eF9tb2R1bGVfZXhpdCh2b2lkKQotewotCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLwotCXVzYl9kZXJlZ2lzdGVyKCZlbTI4eHhfdXNiX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGVtMjh4eF9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChlbTI4eHhfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAppbmRleCA1OTU2ZTliLi5iNWVkZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaApAQCAtNjcsNyArNjcsNiBAQAogI2RlZmluZSBFTTI4MjBfQk9BUkRfSEVSQ1VMRVNfU01BUlRfVFZfVVNCMgkgIDI2CiAjZGVmaW5lIEVNMjgyMF9CT0FSRF9QSU5OQUNMRV9VU0JfMl9GTTEyMTZNRQkgIDI3CiAjZGVmaW5lIEVNMjgyMF9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfVVNCSUlfREVMVVhFIDI4Ci0jZGVmaW5lIEVNMjgyMF9CT0FSRF9QSU5OQUNMRV9EVkNfMTAwCQkgIDI5CiAjZGVmaW5lIEVNMjgyMF9CT0FSRF9WSURFT0xPR1lfMjBLMTRYVVNCCSAgMzAKICNkZWZpbmUgRU0yODIxX0JPQVJEX1VTQkdFQVJfVkQyMDQJCSAgMzEKICNkZWZpbmUgRU0yODIxX0JPQVJEX1NVUEVSQ09NUF9VU0JfMgkJICAzMgpAQCAtOTcsNiArOTYsOCBAQAogI2RlZmluZSBFTTI4ODJfQk9BUkRfUElOTkFDTEVfSFlCUklEX1BSTwkgIDU2CiAjZGVmaW5lIEVNMjg4M19CT0FSRF9LV09STERfSFlCUklEX0EzMTYJCSAgNTcKICNkZWZpbmUgRU0yODIwX0JPQVJEX0NPTVBST19WSURFT01BVEVfRk9SWU9VCSAgNTgKKyNkZWZpbmUgRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfODUwCSAgNjAKKyNkZWZpbmUgRU0yODIwX0JPQVJEX1BST0xJTktfUExBWVRWX0JPWDRfVVNCMgkgIDYxCiAKIC8qIExpbWl0cyBtaW5pbXVtIGFuZCBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCiAjZGVmaW5lIEVNMjhYWF9NSU5fQlVGIDQKQEAgLTE1OSw3ICsxNjAsNyBAQAogI2RlZmluZSBFTTI4MDBfSTJDX1dSSVRFX1RJTUVPVVQgMjAKIAogZW51bSBlbTI4eHhfbW9kZSB7Ci0JRU0yOFhYX01PREVfVU5ERUZJTkVELAorCUVNMjhYWF9TVVNQRU5ELAogCUVNMjhYWF9BTkFMT0dfTU9ERSwKIAlFTTI4WFhfRElHSVRBTF9NT0RFLAogfTsKQEAgLTIwNyw5ICsyMDgsMTIgQEAKIAogfTsKIAorLyogU3RydWN0IHRvIGVudW1iZXJhdGUgdmlkZW8gZm9ybWF0cyAqLwogc3RydWN0IGVtMjh4eF9mbXQgewogCWNoYXIgICpuYW1lOwogCXUzMiAgIGZvdXJjYzsgICAgICAgICAgLyogdjRsMiBmb3JtYXQgaWQgKi8KKwlpbnQgICBkZXB0aDsKKwlpbnQgICByZWc7CiB9OwogCiAvKiBidWZmZXIgZm9yIG9uZSB2aWRlbyBmcmFtZSAqLwpAQCAtMjU1LDI1ICsyNTksNTIgQEAKIAlFTTI4WFhfUkFESU8sCiB9OwogCitlbnVtIGVtMjh4eF9hYzk3X21vZGUgeworCUVNMjhYWF9OT19BQzk3ID0gMCwKKwlFTTI4WFhfQUM5N19FTTIwMiwKKwlFTTI4WFhfQUM5N19TSUdNQVRFTCwKKwlFTTI4WFhfQUM5N19PVEhFUiwKK307CisKK3N0cnVjdCBlbTI4eHhfYXVkaW9fbW9kZSB7CisJZW51bSBlbTI4eHhfYWM5N19tb2RlIGFjOTc7CisKKwl1MTYgYWM5N19mZWF0OworCXUzMiBhYzk3X3ZlbmRvcl9pZDsKKworCXVuc2lnbmVkIGludCBoYXNfYXVkaW86MTsKKworCXVuc2lnbmVkIGludCBpMnNfM3JhdGVzOjE7CisJdW5zaWduZWQgaW50IGkyc181cmF0ZXM6MTsKK307CisKKy8qIGVtMjh4eCBoYXMgdHdvIGF1ZGlvIGlucHV0czogdHVuZXIgYW5kIGxpbmUgaW4uCisgICBIb3dldmVyLCBvbiBtb3N0IGRldmljZXMsIGFuIGF1eGlsaWFyeSBBQzk3IGNvZGVjIGRldmljZSBpcyB1c2VkLgorICAgVGhlIEFDOTcgZGV2aWNlIG1heSBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGlucHV0cyBhbmQgb3V0cHV0cywKKyAgIGRlcGVuZGluZyBvbiB0aGVpciBtb2RlbC4gU28sIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBBQzk3IG1peGVyIHRvCisgICBhZGRyZXNzIG1vcmUgdGhhbiB0d28gZGlmZmVyZW50IGVudHJpZXMuCisgKi8KIGVudW0gZW0yOHh4X2FtdXggewotCUVNMjhYWF9BTVVYX1ZJREVPLAotCUVNMjhYWF9BTVVYX0xJTkVfSU4sCi0JRU0yOFhYX0FNVVhfQUM5N19WSURFTywKLQlFTTI4WFhfQU1VWF9BQzk3X0xJTkVfSU4sCisJLyogVGhpcyBpcyB0aGUgb25seSBlbnRyeSBmb3IgZW0yOHh4IHR1bmVyIGlucHV0ICovCisJRU0yOFhYX0FNVVhfVklERU8sCS8qIGVtMjh4eCB0dW5lciwgQUM5NyBtaXhlciBWaWRlbyAqLworCisJRU0yOFhYX0FNVVhfTElORV9JTiwJLyogQUM5NyBtaXhlciBMaW5lIEluICovCisKKwkvKiBTb21lIGxlc3MtY29tbW9uIG1peGVyIHNldHVwcyAqLworCUVNMjhYWF9BTVVYX1ZJREVPMiwJLyogZW0yOHh4IExpbmUgaW4sIEFDOTcgbWl4ZXIgVmlkZW8gKi8KKwlFTTI4WFhfQU1VWF9QSE9ORSwKKwlFTTI4WFhfQU1VWF9NSUMsCisJRU0yOFhYX0FNVVhfQ0QsCisJRU0yOFhYX0FNVVhfQVVYLAorCUVNMjhYWF9BTVVYX1BDTV9PVVQsCiB9OwogCi1zdHJ1Y3QgZW0yOHh4X2lucHV0IHsKLQllbnVtIGVudW0yOHh4X2l0eXBlIHR5cGU7Ci0JdW5zaWduZWQgaW50IHZtdXg7Ci0JZW51bSBlbTI4eHhfYW11eCBhbXV4OwotfTsKLQotI2RlZmluZSBJTlBVVChucikgKCZlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLmlucHV0W25yXSkKLQotZW51bSBlbTI4eHhfZGVjb2RlciB7Ci0JRU0yOFhYX1RWUDUxNTAsCi0JRU0yOFhYX1NBQTcxMTMsCi0JRU0yOFhYX1NBQTcxMTQKK2VudW0gZW0yOHh4X2FvdXQgeworCUVNMjhYWF9BT1VUX01BU1RFUiA9IDEgPDwgMCwKKwlFTTI4WFhfQU9VVF9MSU5FICAgPSAxIDw8IDEsCisJRU0yOFhYX0FPVVRfTU9OTyAgID0gMSA8PCAyLAorCUVNMjhYWF9BT1VUX0xGRSAgICA9IDEgPDwgMywKKwlFTTI4WFhfQU9VVF9TVVJSICAgPSAxIDw8IDQsCiB9OwogCiBzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgewpAQCAtMjgyLDI3ICszMTMsNTEgQEAKIAlpbnQgc2xlZXA7CiB9OwogCitzdHJ1Y3QgZW0yOHh4X2lucHV0IHsKKwllbnVtIGVudW0yOHh4X2l0eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHZtdXg7CisJZW51bSBlbTI4eHhfYW11eCBhbXV4OworCWVudW0gZW0yOHh4X2FvdXQgYW91dDsKKwlzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgKmdwaW87Cit9OworCisjZGVmaW5lIElOUFVUKG5yKSAoJmVtMjh4eF9ib2FyZHNbZGV2LT5tb2RlbF0uaW5wdXRbbnJdKQorCitlbnVtIGVtMjh4eF9kZWNvZGVyIHsKKwlFTTI4WFhfTk9ERUNPREVSLAorCUVNMjhYWF9UVlA1MTUwLAorCUVNMjhYWF9TQUE3MTFYLAorfTsKKwogc3RydWN0IGVtMjh4eF9ib2FyZCB7CiAJY2hhciAqbmFtZTsKIAlpbnQgdmNoYW5uZWxzOwogCWludCB0dW5lcl90eXBlOworCWludCB0dW5lcl9hZGRyOwogCiAJLyogaTJjIGZsYWdzICovCiAJdW5zaWduZWQgaW50IHRkYTk4ODdfY29uZjsKIAorCS8qIEdQSU8gc2VxdWVuY2VzICovCisJc3RydWN0IGVtMjh4eF9yZWdfc2VxICpkdmJfZ3BpbzsKKwlzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgKnN1c3BlbmRfZ3BpbzsKKwlzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgKnR1bmVyX2dwaW87CisKIAl1bnNpZ25lZCBpbnQgaXNfZW0yODAwOjE7CiAJdW5zaWduZWQgaW50IGhhc19tc3AzNHh4OjE7CiAJdW5zaWduZWQgaW50IG10c19maXJtd2FyZToxOwotCXVuc2lnbmVkIGludCBoYXNfMTJtaHpfaTJzOjE7CiAJdW5zaWduZWQgaW50IG1heF9yYW5nZV82NDBfNDgwOjE7CiAJdW5zaWduZWQgaW50IGhhc19kdmI6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX3NuYXBzaG90X2J1dHRvbjoxOwogCXVuc2lnbmVkIGludCB2YWxpZDoxOwogCisJdW5zaWduZWQgY2hhciB4Y2xrLCBpMmNfc3BlZWQ7CisKIAllbnVtIGVtMjh4eF9kZWNvZGVyIGRlY29kZXI7CiAKIAlzdHJ1Y3QgZW0yOHh4X2lucHV0ICAgICAgIGlucHV0W01BWF9FTTI4WFhfSU5QVVRdOwogCXN0cnVjdCBlbTI4eHhfaW5wdXQJICByYWRpbzsKKwlJUl9LRVlUQUJfVFlQRSAgICAgICAgICAgICppcl9jb2RlczsKIH07CiAKIHN0cnVjdCBlbTI4eHhfZWVwcm9tIHsKQEAgLTM2OSwzMiArNDI0LDI2IEBACiAJY2hhciBuYW1lWzMwXTsJCS8qIG5hbWUgKGluY2x1ZGluZyBtaW5vcikgb2YgdGhlIGRldmljZSAqLwogCWludCBtb2RlbDsJCS8qIGluZGV4IGluIHRoZSBkZXZpY2VfZGF0YSBzdHJ1Y3QgKi8KIAlpbnQgZGV2bm87CQkvKiBtYXJrcyB0aGUgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCi0JdW5zaWduZWQgaW50IGlzX2VtMjgwMDoxOwotCXVuc2lnbmVkIGludCBoYXNfbXNwMzR4eDoxOwotCXVuc2lnbmVkIGludCBoYXNfdGRhOTg4NzoxOworCWVudW0gZW0yOHh4X2NoaXBfaWQgY2hpcF9pZDsKKworCXN0cnVjdCBlbTI4eHhfYm9hcmQgYm9hcmQ7CisKIAl1bnNpZ25lZCBpbnQgc3RyZWFtX29uOjE7CS8qIExvY2tzIHN0cmVhbXMgKi8KIAl1bnNpZ25lZCBpbnQgaGFzX2F1ZGlvX2NsYXNzOjE7Ci0JdW5zaWduZWQgaW50IGhhc18xMm1oel9pMnM6MTsKLQl1bnNpZ25lZCBpbnQgbWF4X3JhbmdlXzY0MF80ODA6MTsKLQl1bnNpZ25lZCBpbnQgaGFzX2R2YjoxOwotCXVuc2lnbmVkIGludCBoYXNfc25hcHNob3RfYnV0dG9uOjE7Ci0JdW5zaWduZWQgaW50IHZhbGlkOjE7CQkvKiByZXBvcnQgZm9yIHZhbGlkYXRlZCBib2FyZHMgKi8KKwl1bnNpZ25lZCBpbnQgaGFzX2Fsc2FfYXVkaW86MTsKKworCXN0cnVjdCBlbTI4eHhfZm10ICpmb3JtYXQ7CisKKwlzdHJ1Y3QgZW0yOHh4X0lSICppcjsKIAogCS8qIFNvbWUgb2xkZXIgZW0yOHh4IGNoaXBzIG5lZWRzIGEgd2FpdGluZyB0aW1lIGFmdGVyIHdyaXRpbmcgKi8KIAl1bnNpZ25lZCBpbnQgd2FpdF9hZnRlcl93cml0ZTsKIAotCS8qIEdQSU8gc2VxdWVuY2VzIGZvciBhbmFsb2cgYW5kIGRpZ2l0YWwgbW9kZSAqLwotCXN0cnVjdCBlbTI4eHhfcmVnX3NlcSAqYW5hbG9nX2dwaW8sICpkaWdpdGFsX2dwaW87Ci0KLQkvKiBHUElPIHNlcXVlbmNlcyBmb3IgdHVuZXIgY2FsbGJhY2tzICovCi0Jc3RydWN0IGVtMjh4eF9yZWdfc2VxICp0dW5fYW5hbG9nX2dwaW8sICp0dW5fZGlnaXRhbF9ncGlvOwotCi0JaW50IHZpZGVvX2lucHV0czsJLyogbnVtYmVyIG9mIHZpZGVvIGlucHV0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJZGV2bGlzdDsKIAogCXUzMiBpMnNfc3BlZWQ7CQkvKiBJMlMgc3BlZWQgZm9yIGF1ZGlvIGRpZ2l0YWwgc3RyZWFtICovCiAKLQllbnVtIGVtMjh4eF9kZWNvZGVyIGRlY29kZXI7CisJc3RydWN0IGVtMjh4eF9hdWRpb19tb2RlIGF1ZGlvX21vZGU7CiAKIAlpbnQgdHVuZXJfdHlwZTsJCS8qIHR5cGUgb2YgdGhlIHR1bmVyICovCiAJaW50IHR1bmVyX2FkZHI7CQkvKiB0dW5lciBhZGRyZXNzICovCkBAIC00MDksNiArNDU4LDcgQEAKIAlpbnQgY3RsX2ZyZXE7CQkvKiBzZWxlY3RlZCBmcmVxdWVuY3kgKi8KIAl1bnNpZ25lZCBpbnQgY3RsX2lucHV0OwkvKiBzZWxlY3RlZCBpbnB1dCAqLwogCXVuc2lnbmVkIGludCBjdGxfYWlucHV0Oy8qIHNlbGVjdGVkIGF1ZGlvIGlucHV0ICovCisJdW5zaWduZWQgaW50IGN0bF9hb3V0cHV0Oy8qIHNlbGVjdGVkIGF1ZGlvIG91dHB1dCAqLwogCWludCBtdXRlOwogCWludCB2b2x1bWU7CiAJLyogZnJhbWUgcHJvcGVydGllcyAqLwpAQCAtNDY5LDYgKzUxOSw5IEBACiAKIAllbnVtIGVtMjh4eF9tb2RlIG1vZGU7CiAKKwkvKiByZWdpc3RlciBudW1iZXJzIGZvciBHUE8vR1BJTyByZWdpc3RlcnMgKi8KKwl1MTYgcmVnX2dwb19udW0sIHJlZ19ncGlvX251bTsKKwogCS8qIENhY2hlcyBHUE8gYW5kIEdQSU8gcmVnaXN0ZXJzICovCiAJdW5zaWduZWQgY2hhcglyZWdfZ3BvLCByZWdfZ3BpbzsKIApAQCAtNTA4LDExICs1NjEsMTcgQEAKIGludCBlbTI4eHhfd3JpdGVfcmVnc19yZXEoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCByZXEsIHUxNiByZWcsIGNoYXIgKmJ1ZiwKIAkJCSAgaW50IGxlbik7CiBpbnQgZW0yOHh4X3dyaXRlX3JlZ3Moc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgcmVnLCBjaGFyICpidWYsIGludCBsZW4pOworaW50IGVtMjh4eF93cml0ZV9yZWcoc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgcmVnLCB1OCB2YWwpOworCitpbnQgZW0yOHh4X3JlYWRfYWM5NyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IHJlZyk7CitpbnQgZW0yOHh4X3dyaXRlX2FjOTcoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCByZWcsIHUxNiB2YWwpOworCiBpbnQgZW0yOHh4X2F1ZGlvX2FuYWxvZ19zZXQoc3RydWN0IGVtMjh4eCAqZGV2KTsKK2ludCBlbTI4eHhfYXVkaW9fc2V0dXAoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAogaW50IGVtMjh4eF9jb2xvcmxldmVsc19zZXRfZGVmYXVsdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9jYXB0dXJlX3N0YXJ0KHN0cnVjdCBlbTI4eHggKmRldiwgaW50IHN0YXJ0KTsKLWludCBlbTI4eHhfb3V0Zm10X3NldF95dXY0MjIoc3RydWN0IGVtMjh4eCAqZGV2KTsKK2ludCBlbTI4eHhfc2V0X291dGZtdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9yZXNvbHV0aW9uX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9zZXRfYWx0ZXJuYXRlKHN0cnVjdCBlbTI4eHggKmRldik7CiBpbnQgZW0yOHh4X2luaXRfaXNvYyhzdHJ1Y3QgZW0yOHh4ICpkZXYsIGludCBtYXhfcGFja2V0cywKQEAgLTUyMSwxMCArNTgwLDIwIEBACiB2b2lkIGVtMjh4eF91bmluaXRfaXNvYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9zZXRfbW9kZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgc2V0X21vZGUpOwogaW50IGVtMjh4eF9ncGlvX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSAqZ3Bpbyk7Ci0KLS8qIFByb3ZpZGVkIGJ5IGVtMjh4eC12aWRlby5jICovCit2b2lkIGVtMjh4eF93YWtlX2kyYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwordm9pZCBlbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwordm9pZCBlbTI4eHhfYWRkX2ludG9fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOworc3RydWN0IGVtMjh4eCAqZW0yOHh4X2dldF9kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgZW51bSB2NGwyX2J1Zl90eXBlICpmaF90eXBlLAorCQkJCSBpbnQgKmhhc19yYWRpbyk7CiBpbnQgZW0yOHh4X3JlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4X29wcyAqZGV2KTsKIHZvaWQgZW0yOHh4X3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHhfb3BzICpkZXYpOwordm9pZCBlbTI4eHhfaW5pdF9leHRlbnNpb24oc3RydWN0IGVtMjh4eCAqZGV2KTsKK3ZvaWQgZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpOworCisvKiBQcm92aWRlZCBieSBlbTI4eHgtdmlkZW8uYyAqLworaW50IGVtMjh4eF9yZWdpc3Rlcl9hbmFsb2dfZGV2aWNlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwordm9pZCBlbTI4eHhfcmVsZWFzZV9hbmFsb2dfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldik7CiAKIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC1jYXJkcy5jICovCiBleHRlcm4gaW50IGVtMjgwMF92YXJpYW50X2RldGVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IG1vZGVsKTsKQEAgLTUzNSw5ICs2MDQsOSBAQAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBlbTI4eHhfYmNvdW50Owogdm9pZCBlbTI4eHhfc2V0X2lyKHN0cnVjdCBlbTI4eHggKmRldiwgc3RydWN0IElSX2kyYyAqaXIpOwogaW50IGVtMjh4eF90dW5lcl9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKK3ZvaWQgZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldik7CiAKIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC1pbnB1dC5jICovCi0vKiBUT0RPOiBDaGVjayBpZiB0aGUgc3RhbmRhcmQgZ2V0X2tleSBoYW5kbGVycyBvbiBpci1jb21tb24gY2FuIGJlIHVzZWQgKi8KIGludCBlbTI4eHhfZ2V0X2tleV90ZXJyYXRlYyhzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KTsKIGludCBlbTI4eHhfZ2V0X2tleV9lbV9oYXVwKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOwogaW50IGVtMjh4eF9nZXRfa2V5X3Bpbm5hY2xlX3VzYl9ncmV5KHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwKQEAgLTU0NSw2ICs2MTQsOSBAQAogdm9pZCBlbTI4eHhfcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKHN0cnVjdCBlbTI4eHggKmRldik7CiB2b2lkIGVtMjh4eF9kZXJlZ2lzdGVyX3NuYXBzaG90X2J1dHRvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogCitpbnQgZW0yOHh4X2lyX2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KTsKK2ludCBlbTI4eHhfaXJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpOworCiAvKiBwcmludGsgbWFjcm9zICovCiAKICNkZWZpbmUgZW0yOHh4X2VycihmbXQsIGFyZy4uLikgZG8ge1wKQEAgLTU2NCw3ICs2MzYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZW0yOHh4X2NvbXByZXNzaW9uX2Rpc2FibGUoc3RydWN0IGVtMjh4eCAqZGV2KQogewogCS8qIHNpZGUgZWZmZWN0IG9mIGRpc2FibGluZyBzY2FsZXIgYW5kIG1peGVyICovCi0JcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yOFhYX1IyNl9DT01QUiwgIlx4MDAiLCAxKTsKKwlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMjZfQ09NUFIsIDB4MDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlbTI4eHhfY29udHJhc3RfZ2V0KHN0cnVjdCBlbTI4eHggKmRldikKQEAgLTYzNiw3ICs3MDgsNyBAQAogLypGSVhNRTogbWF4dyBzaG91bGQgYmUgZGVwZW5kZW50IG9mIGFsdCBtb2RlICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub3JtX21heHcoc3RydWN0IGVtMjh4eCAqZGV2KQogewotCWlmIChkZXYtPm1heF9yYW5nZV82NDBfNDgwKQorCWlmIChkZXYtPmJvYXJkLm1heF9yYW5nZV82NDBfNDgwKQogCQlyZXR1cm4gNjQwOwogCWVsc2UKIAkJcmV0dXJuIDcyMDsKQEAgLTY0NCw3ICs3MTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBub3JtX21heGgoc3RydWN0IGVtMjh4eCAqZGV2KQogewotCWlmIChkZXYtPm1heF9yYW5nZV82NDBfNDgwKQorCWlmIChkZXYtPmJvYXJkLm1heF9yYW5nZV82NDBfNDgwKQogCQlyZXR1cm4gNDgwOwogCWVsc2UKIAkJcmV0dXJuIChkZXYtPm5vcm0gJiBWNEwyX1NURF82MjVfNTApID8gNTc2IDogNDgwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwppbmRleCA5ZDBlZjk2Li44M2MwNzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwpAQCAtMTU4MSw3ICsxNTgxLDcgQEAKIAogCXN0cmxjcHkoY2FwLmNhcmQsIGNhbS0+djRsZGV2LT5uYW1lLCBzaXplb2YoY2FwLmNhcmQpKTsKIAlpZiAodXNiX21ha2VfcGF0aChjYW0tPnVzYmRldiwgY2FwLmJ1c19pbmZvLCBzaXplb2YoY2FwLmJ1c19pbmZvKSkgPCAwKQotCQlzdHJsY3B5KGNhcC5idXNfaW5mbywgY2FtLT51c2JkZXYtPmRldi5idXNfaWQsCisJCXN0cmxjcHkoY2FwLmJ1c19pbmZvLCBkZXZfbmFtZSgmY2FtLT51c2JkZXYtPmRldiksCiAJCQlzaXplb2YoY2FwLmJ1c19pbmZvKSk7CiAKIAlpZiAoY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCmluZGV4IDZiNTU3YzAuLmVlNmE2OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKQEAgLTEyLDEyICsxMiwxMyBAQAogCSAgIlZpZGVvIEZvciBMaW51eCIgdG8gdXNlIHRoaXMgZHJpdmVyLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBnc3BjYV9tYWluLgorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX21haW4uCiAKIAogaWYgVVNCX0dTUENBICYmIFZJREVPX1Y0TDIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9LY29uZmlnIgogCiBjb25maWcgVVNCX0dTUENBX0NPTkVYCiAJdHJpc3RhdGUgIkNvbmV4YW50IENhbWVyYSBEcml2ZXIiCkBAIC02NCw2ICs2NSwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffb3Y1MTkuCiAKK2NvbmZpZyBVU0JfR1NQQ0FfT1Y1MzQKKwl0cmlzdGF0ZSAiT1Y1MzQgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgT1Y1MzQgY2hpcC4KKwkgIChlLmcuIFNvbnkgUGxheXN0YXRpb24gRVlFKQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9vdjUzNC4KKwogY29uZmlnIFVTQl9HU1BDQV9QQUMyMDcKIAl0cmlzdGF0ZSAiUGl4YXJ0IFBBQzIwNyBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCkBAIC04MywxMCArOTQsMTEgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9wYWM3MzExLgogCiBjb25maWcgVVNCX0dTUENBX1NPTklYQgotCXRyaXN0YXRlICJTTjlDMTAyIFVTQiBDYW1lcmEgRHJpdmVyIgorCXRyaXN0YXRlICJTT05JWCBCYXllciBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBTT05JWEIgY2hpcC4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU29uaXgKKwkgIGNoaXBzIHdpdGggQmF5ZXIgZm9ybWF0IChTTjlDMTAxLCBTTjlDMTAyIGFuZCBTTjlDMTAzKS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc29uaXhiLgpAQCAtOTUsNyArMTA3LDggQEAKIAl0cmlzdGF0ZSAiU09OSVggSlBFRyBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBTT05JWEogY2hpcC4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU29uaXgKKwkgIGNoaXBzIHdpdGggSlBFRyBmb3JtYXQgKFNOOUMxMDJQLCBTTjlDMTA1IGFuZCA+PSBTTjlDMTEwKS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc29uaXhqCkBAIC0xNzEsNyArMTg0LDcgQEAKIAkgIFNQQ0E1MDQoYWJjKSBTUENBNTMzIFNQQ0E1MzYgY2hpcHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NwY2E1eHguCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc3VucGx1cy4KIAogY29uZmlnIFVTQl9HU1BDQV9UNjEzCiAJdHJpc3RhdGUgIlQ2MTMgKEpQRUcgQ29tcGxpYW5jZSkgVVNCIENhbWVyYSBEcml2ZXIiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQppbmRleCAyMjczNGY1Li5iZDhkOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBX0ZJTkVQSVgpCSs9IGdzcGNhX2ZpbmVwaXgubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9NQVJTKQkrPSBnc3BjYV9tYXJzLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfT1Y1MTkpCSs9IGdzcGNhX292NTE5Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfT1Y1MzQpCSs9IGdzcGNhX292NTM0Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfUEFDMjA3KQkrPSBnc3BjYV9wYWMyMDcubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUM3MzExKSArPSBnc3BjYV9wYWM3MzExLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU09OSVhCKQkrPSBnc3BjYV9zb25peGIubwpAQCAtMjcsNiArMjgsNyBAQAogZ3NwY2FfZmluZXBpeC1vYmpzCQk6PSBmaW5lcGl4Lm8KIGdzcGNhX21hcnMtb2JqcwkJCTo9IG1hcnMubwogZ3NwY2Ffb3Y1MTktb2JqcwkJOj0gb3Y1MTkubworZ3NwY2Ffb3Y1MzQtb2JqcwkJOj0gb3Y1MzQubwogZ3NwY2FfcGFjMjA3LW9ianMJCTo9IHBhYzIwNy5vCiBnc3BjYV9wYWM3MzExLW9ianMJCTo9IHBhYzczMTEubwogZ3NwY2Ffc29uaXhiLW9ianMJCTo9IHNvbml4Yi5vCkBAIC00NSw0ICs0Nyw0IEBACiBnc3BjYV96YzN4eC1vYmpzCQk6PSB6YzN4eC5vCiAKIG9iai0kKENPTkZJR19VU0JfTTU2MDIpCQkrPSBtNTYwMi8KLQorb2JqLSQoQ09ORklHX1VTQl9TVFYwNlhYKSAJKz0gc3R2MDZ4eC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYwppbmRleCBkZTI4MzU0Li4xNzUzZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCkBAIC05Myw3ICs5Myw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKIAkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDMgLyA4ICsgNTkwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jCmluZGV4IDNiZTMwYjQuLmYzY2Q4ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCSB9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCiAJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAsCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJLnByaXYgPSAwfSwgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzaWZfbW9kZVtdID0gewogCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTc2LAogCQkuc2l6ZWltYWdlID0gMTc2ICogMTQ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYwppbmRleCA2MDc5NDJmLi5hZmM4YjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYwpAQCAtNzIsNyArNzIsNyBAQAogfQogCiAvKiBUaGVzZSBjYW1lcmFzIG9ubHkgc3VwcG9ydCAzMjB4MjAwLiAqLwotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgZnBpeF9tb2RlWzFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgZnBpeF9tb2RlWzFdID0gewogCXsgMzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCiAJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAgKiAzIC8gOCArIDU5MCwKQEAgLTMxNCw5ICszMTQsNiBAQAogCWludCByZXQ7CiAJaW50IHNpemVfcmV0OwogCi0JLyogUmVzZXQgYnVsayBpbiBlbmRwb2ludCAqLwotCXVzYl9jbGVhcl9oYWx0KGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmNhbS5lcGFkZHIpOwotCiAJLyogSW5pdCB0aGUgZGV2aWNlICovCiAJbWVtc2V0KGdzcGNhX2Rldi0+dXNiX2J1ZiwgMCwgMTIpOwogCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IDB4YzY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKaW5kZXggMDJhNmU5ZS4uOGI5ZjNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC00NSw3ICs0NCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBIFVTQiBDYW1lcmEgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT05fTlVNQkVSCUtFUk5FTF9WRVJTSU9OKDIsIDMsIDApCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigyLCA0LCAwKQogCiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CiAKQEAgLTE1MCw4ICsxNDksMTEgQEAKIAogCQkvKiBjaGVjayB0aGUgcGFja2V0IHN0YXR1cyBhbmQgbGVuZ3RoICovCiAJCWxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKQorCQlpZiAobGVuID09IDApIHsKKwkJCWlmIChnc3BjYV9kZXYtPmVtcHR5X3BhY2tldCA9PSAwKQorCQkJCWdzcGNhX2Rldi0+ZW1wdHlfcGFja2V0ID0gMTsKIAkJCWNvbnRpbnVlOworCQl9CiAJCXN0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CiAJCWlmIChzdCkgewogCQkJUERFQlVHKERfRVJSLApAQCAtMTcwLDcgKzE3Miw2IEBACiAJfQogCiAJLyogcmVzdWJtaXQgdGhlIFVSQiAqLwotCXVyYi0+c3RhdHVzID0gMDsKIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKIAkJUERFQlVHKERfRVJSfERfUEFDSywgInVzYl9zdWJtaXRfdXJiKCkgcmV0ICVkIiwgc3QpOwpAQCAtMjAwLDExICsyMDEsMTggQEAKIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSAoc3RydWN0IGdzcGNhX2RldiAqKSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKKwlpbnQgc3Q7CiAKIAlQREVCVUcoRF9QQUNLLCAiYnVsayBpcnEiKTsKIAlpZiAoIWdzcGNhX2Rldi0+c3RyZWFtaW5nKQogCQlyZXR1cm47Ci0JaWYgKHVyYi0+c3RhdHVzICE9IDAgJiYgdXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpIHsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCQl1cmItPnN0YXR1cyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAjaWZkZWYgQ09ORklHX1BNCiAJCWlmICghZ3NwY2FfZGV2LT5mcm96ZW4pCiAjZW5kaWYKQEAgLTIyMyw2ICsyMzEsMTMgQEAKIAkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsCiAJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfQorCisJLyogcmVzdWJtaXQgdGhlIFVSQiAqLworCWlmIChnc3BjYV9kZXYtPmNhbS5idWxrX251cmJzICE9IDApIHsKKwkJc3QgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3QgPCAwKQorCQkJUERFQlVHKERfRVJSfERfUEFDSywgInVzYl9zdWJtaXRfdXJiKCkgcmV0ICVkIiwgc3QpOworCX0KIH0KIAogLyoKQEAgLTI4NSw3ICszMDAsNiBAQAogCQlmcmFtZS0+djRsMl9idWYuYnl0ZXN1c2VkID0gZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGE7CiAJCWZyYW1lLT52NGwyX2J1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19RVUVVRUQ7CiAJCWZyYW1lLT52NGwyX2J1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCWF0b21pY19pbmMoJmdzcGNhX2Rldi0+bmV2ZW50KTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZnc3BjYV9kZXYtPndxKTsJLyogZXZlbnQgPSBuZXcgZnJhbWUgKi8KIAkJaSA9IChnc3BjYV9kZXYtPmZyX2kgKyAxKSAlIGdzcGNhX2Rldi0+bmZyYW1lczsKIAkJZ3NwY2FfZGV2LT5mcl9pID0gaTsKQEAgLTM3OSw3ICszOTMsNiBAQAogCWdzcGNhX2Rldi0+ZnJfaSA9IGdzcGNhX2Rldi0+ZnJfbyA9IGdzcGNhX2Rldi0+ZnJfcSA9IDA7CiAJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CiAJZ3NwY2FfZGV2LT5zZXF1ZW5jZSA9IDA7Ci0JYXRvbWljX3NldCgmZ3NwY2FfZGV2LT5uZXZlbnQsIDApOwogCXJldHVybiAwOwogfQogCkBAIC01MjAsMTEgKzUzMywxNCBAQAogCQludXJicyA9IERFRl9OVVJCUzsKIAl9IGVsc2UgewkJCQkvKiBidWxrICovCiAJCW5wa3QgPSAwOwotCQlic2l6ZSA9IGdzcGNhX2Rldi0+Y2FtLglidWxrX3NpemU7CisJCWJzaXplID0gZ3NwY2FfZGV2LT5jYW0uYnVsa19zaXplOwogCQlpZiAoYnNpemUgPT0gMCkKIAkJCWJzaXplID0gcHNpemU7CiAJCVBERUJVRyhEX1NUUkVBTSwgImJ1bGsgYnNpemU6JWQiLCBic2l6ZSk7Ci0JCW51cmJzID0gMTsKKwkJaWYgKGdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgIT0gMCkKKwkJCW51cmJzID0gZ3NwY2FfZGV2LT5jYW0uYnVsa19udXJiczsKKwkJZWxzZQorCQkJbnVyYnMgPSAxOwogCX0KIAogCWdzcGNhX2Rldi0+bnVyYnMgPSBudXJiczsKQEAgLTU5Nyw2ICs2MTMsMTIgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAorCQkvKiBjbGVhciB0aGUgYnVsayBlbmRwb2ludCAqLworCQlpZiAoZ3NwY2FfZGV2LT5hbHQgPT0gMCkJLyogaWYgYnVsayB0cmFuc2ZlciAqLworCQkJdXNiX2NsZWFyX2hhbHQoZ3NwY2FfZGV2LT5kZXYsCisJCQkJCXVzYl9yY3ZpbnRwaXBlKGdzcGNhX2Rldi0+ZGV2LAorCQkJCQkJIGdzcGNhX2Rldi0+Y2FtLmVwYWRkcikpOworCiAJCS8qIHN0YXJ0IHRoZSBjYW0gKi8KIAkJcmV0ID0gZ3NwY2FfZGV2LT5zZF9kZXNjLT5zdGFydChnc3BjYV9kZXYpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtNjA0LDEwICs2MjYsOSBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJZ3NwY2FfZGV2LT5zdHJlYW1pbmcgPSAxOwotCQlhdG9taWNfc2V0KCZnc3BjYV9kZXYtPm5ldmVudCwgMCk7CiAKLQkJLyogYnVsayB0cmFuc2ZlcnMgYXJlIHN0YXJ0ZWQgYnkgdGhlIHN1YmRyaXZlciAqLwotCQlpZiAoZ3NwY2FfZGV2LT5hbHQgPT0gMCkKKwkJLyogc29tZSBidWxrIHRyYW5zZmVycyBhcmUgc3RhcnRlZCBieSB0aGUgc3ViZHJpdmVyICovCisJCWlmIChnc3BjYV9kZXYtPmFsdCA9PSAwICYmIGdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgPT0gMCkKIAkJCWJyZWFrOwogCiAJCS8qIHN1Ym1pdCB0aGUgVVJCcyAqLwpAQCAtNjE4LDggKzYzOSwxMSBAQAogCQkJCQkidXNiX3N1Ym1pdF91cmIgWyVkXSBlcnIgJWQiLCBuLCByZXQpOwogCQkJCWdzcGNhX2Rldi0+c3RyZWFtaW5nID0gMDsKIAkJCQlkZXN0cm95X3VyYnMoZ3NwY2FfZGV2KTsKLQkJCQlpZiAocmV0ID09IC1FTk9TUEMpCisJCQkJaWYgKHJldCA9PSAtRU5PU1BDKSB7CisJCQkJCW1zbGVlcCgyMCk7CS8qIHdhaXQgZm9yIGtpbGwKKwkJCQkJCQkgKiBjb21wbGV0ZSAqLwogCQkJCQlicmVhazsJLyogdHJ5IHRoZSBwcmV2aW91cyBhbHQgKi8KKwkJCQl9CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTYzNyw3ICs2NjEsNyBAQAogCiAJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsIDApOwogCWlmIChyZXQgPCAwKQotCQlQREVCVUcoRF9FUlJ8RF9TVFJFQU0sICJzZXQgaW50ZXJmYWNlIDAgZXJyICVkIiwgcmV0KTsKKwkJUERFQlVHKERfRVJSfERfU1RSRUFNLCAic2V0IGFsdCAwIGVyciAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjQ1LDcgKzY2OSw2IEBACiBzdGF0aWMgdm9pZCBnc3BjYV9zdHJlYW1fb2ZmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlnc3BjYV9kZXYtPnN0cmVhbWluZyA9IDA7Ci0JYXRvbWljX3NldCgmZ3NwY2FfZGV2LT5uZXZlbnQsIDApOwogCWlmIChnc3BjYV9kZXYtPnByZXNlbnQKIAkgICAgJiYgZ3NwY2FfZGV2LT5zZF9kZXNjLT5zdG9wTikKIAkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5zdG9wTihnc3BjYV9kZXYpOwpAQCAtNzI3LDcgKzc1MCw3IEBACiAJCQlpZiAoZm10ZGVzYy0+aW5kZXggPT0gaW5kZXgpCiAJCQkJYnJlYWs7CQkvKiBuZXcgZm9ybWF0ICovCiAJCQlpbmRleCsrOwotCQkJaWYgKGluZGV4ID49IHNpemVvZiBmbXRfdGIgLyBzaXplb2YgZm10X3RiWzBdKQorCQkJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoZm10X3RiKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTc1Miw4ICs3NzUsNiBAQAogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IHByaXY7CiAJaW50IG1vZGU7CiAKLQlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJbW9kZSA9IGdzcGNhX2Rldi0+Y3Vycl9tb2RlOwogCW1lbWNweSgmZm10LT5mbXQucGl4LCAmZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbbW9kZV0sCiAJCXNpemVvZiBmbXQtPmZtdC5waXgpOwpAQCAtNzY1LDggKzc4Niw2IEBACiB7CiAJaW50IHcsIGgsIG1vZGUsIG1vZGUyOwogCi0JaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwogCXcgPSBmbXQtPmZtdC5waXgud2lkdGg7CiAJaCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CiAKQEAgLTg0NiwxMSArODY1LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZ3NwY2FfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQorc3RhdGljIHZvaWQgZ3NwY2FfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpCiB7Ci0Jc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBnc3BjYV9kZXYsIGtyZWYpOworCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IGNvbnRhaW5lcl9vZih2ZmQsIHN0cnVjdCBnc3BjYV9kZXYsIHZkZXYpOwogCi0JUERFQlVHKERfU1RSRUFNLCAiZGV2aWNlIGRlbGV0ZWQiKTsKKwlQREVCVUcoRF9TVFJFQU0sICJkZXZpY2UgcmVsZWFzZWQiKTsKIAogCWtmcmVlKGdzcGNhX2Rldi0+dXNiX2J1Zik7CiAJa2ZyZWUoZ3NwY2FfZGV2KTsKQEAgLTg2Miw3ICs4ODEsNyBAQAogCWludCByZXQ7CiAKIAlQREVCVUcoRF9TVFJFQU0sICIlcyBvcGVuIiwgY3VycmVudC0+Y29tbSk7Ci0JZ3NwY2FfZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlnc3BjYV9kZXYgPSAoc3RydWN0IGdzcGNhX2RldiAqKSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdzcGNhX2Rldi0+cXVldWVfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJaWYgKCFnc3BjYV9kZXYtPnByZXNlbnQpIHsKQEAgLTg4MywxNyArOTAyLDE0IEBACiAKIAlnc3BjYV9kZXYtPnVzZXJzKys7CiAKLQkvKiBvbmUgbW9yZSB1c2VyICovCi0Ja3JlZl9nZXQoJmdzcGNhX2Rldi0+a3JlZik7Ci0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBnc3BjYV9kZXY7CiAjaWZkZWYgR1NQQ0FfREVCVUcKIAkvKiBhY3RpdmF0ZSB0aGUgdjRsMiBkZWJ1ZyAqLwogCWlmIChnc3BjYV9kZWJ1ZyAmIERfVjRMMikKLQkJZ3NwY2FfZGV2LT52ZGV2LT5kZWJ1ZyB8PSBWNEwyX0RFQlVHX0lPQ1RMCisJCWdzcGNhX2Rldi0+dmRldi5kZWJ1ZyB8PSBWNEwyX0RFQlVHX0lPQ1RMCiAJCQkJCXwgVjRMMl9ERUJVR19JT0NUTF9BUkc7CiAJZWxzZQotCQlnc3BjYV9kZXYtPnZkZXYtPmRlYnVnICY9IH4oVjRMMl9ERUJVR19JT0NUTAorCQlnc3BjYV9kZXYtPnZkZXYuZGVidWcgJj0gfihWNEwyX0RFQlVHX0lPQ1RMCiAJCQkJCXwgVjRMMl9ERUJVR19JT0NUTF9BUkcpOwogI2VuZGlmCiAJcmV0ID0gMDsKQEAgLTkzMiw4ICs5NDgsNiBAQAogCiAJUERFQlVHKERfU1RSRUFNLCAiY2xvc2UgZG9uZSIpOwogCi0Ja3JlZl9wdXQoJmdzcGNhX2Rldi0+a3JlZiwgZ3NwY2FfZGVsZXRlKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDUzLDYgKzEwNjcsMzUgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLypmaXhtZTogaGF2ZSBhbiBhdWRpbyBmbGFnIGluIGdzcGNhX2Rldj8qLworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCit7CisJaWYgKGF1ZGlvLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCit7CisJbWVtc2V0KGF1ZGlvLCAwLCBzaXplb2YgKmF1ZGlvKTsKKwlzdHJjcHkoYXVkaW8tPm5hbWUsICJNaWNyb3Bob25lIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCit7CisJaWYgKGF1ZGlvLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhdWRpby0+bmFtZSwgIk1pY3JvcGhvbmUiKTsKKwlhdWRpby0+Y2FwYWJpbGl0eSA9IDA7CisJYXVkaW8tPm1vZGUgPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZpZGlvY19xdWVyeW1lbnUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbWVudSkKIHsKQEAgLTEwOTYsOCArMTEzOSw2IEBACiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gcHJpdjsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChyYi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCAocmItPm1lbW9yeSkgewogCWNhc2UgR1NQQ0FfTUVNT1JZX1JFQUQ6CQkJLyogKGludGVybmFsIGNhbGwpICovCiAJY2FzZSBWNEwyX01FTU9SWV9NTUFQOgpAQCAtMTE2Miw4ICsxMjAzLDcgQEAKIAlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSBwcml2OwogCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CiAKLQlpZiAodjRsMl9idWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFCi0JICAgIHx8IHY0bDJfYnVmLT5pbmRleCA8IDAKKwlpZiAodjRsMl9idWYtPmluZGV4IDwgMAogCSAgICB8fCB2NGwyX2J1Zi0+aW5kZXggPj0gZ3NwY2FfZGV2LT5uZnJhbWVzKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTE4Niw3ICsxMjI2LDggQEAKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChnc3BjYV9kZXYtPm5mcmFtZXMgPT0gMCkgeworCWlmIChnc3BjYV9kZXYtPm5mcmFtZXMgPT0gMAorCSAgICB8fCAhKGdzcGNhX2Rldi0+ZnJhbWVbMF0udjRsMl9idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX1FVRVVFRCkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTIzNiw3ICsxMjc3LDYgQEAKIAlnc3BjYV9kZXYtPmZyX2kgPSBnc3BjYV9kZXYtPmZyX28gPSBnc3BjYV9kZXYtPmZyX3EgPSAwOwogCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCWdzcGNhX2Rldi0+c2VxdWVuY2UgPSAwOwotCWF0b21pY19zZXQoJmdzcGNhX2Rldi0+bmV2ZW50LCAwKTsKIAlyZXQgPSAwOwogb3V0OgogCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT5xdWV1ZV9sb2NrKTsKQEAgLTEyODEsNiArMTMyMSwxNyBAQAogCW1lbXNldChwYXJtLCAwLCBzaXplb2YgKnBhcm0pOwogCXBhcm0tPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJcGFybS0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gZ3NwY2FfZGV2LT5uYnVmcmVhZDsKKworCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmdldF9zdHJlYW1wYXJtKSB7CisJCWludCByZXQ7CisKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ3NwY2FfZGV2LT51c2JfbG9jaykpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmdldF9zdHJlYW1wYXJtKGdzcGNhX2RldiwgcGFybSk7CisJCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT51c2JfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTUsNiArMTM0NiwxNyBAQAogCQlwYXJtLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBnc3BjYV9kZXYtPm5idWZyZWFkOwogCWVsc2UKIAkJZ3NwY2FfZGV2LT5uYnVmcmVhZCA9IG47CisKKwlpZiAoZ3NwY2FfZGV2LT5zZF9kZXNjLT5zZXRfc3RyZWFtcGFybSkgeworCQlpbnQgcmV0OworCisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdzcGNhX2Rldi0+dXNiX2xvY2spKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcmV0ID0gZ3NwY2FfZGV2LT5zZF9kZXNjLT5zZXRfc3RyZWFtcGFybShnc3BjYV9kZXYsIHBhcm0pOworCQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNDQwLDMzICsxNTAyLDIyIEBACiAJaSA9IGdzcGNhX2Rldi0+ZnJfbzsKIAlqID0gZ3NwY2FfZGV2LT5mcl9xdWV1ZVtpXTsKIAlmcmFtZSA9ICZnc3BjYV9kZXYtPmZyYW1lW2pdOwotCWlmIChmcmFtZS0+djRsMl9idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0RPTkUpIHsKLQkJYXRvbWljX2RlYygmZ3NwY2FfZGV2LT5uZXZlbnQpOwotCQlnb3RvIG9rOwotCX0KLQlpZiAobm9uYmxvY2tfaW5nKQkJCS8qIG5vIGZyYW1lIHlldCAqLwotCQlyZXR1cm4gLUVBR0FJTjsKIAotCS8qIHdhaXQgdGlsbCBhIGZyYW1lIGlzIHJlYWR5ICovCi0JZm9yICg7OykgeworCWlmICghKGZyYW1lLT52NGwyX2J1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRE9ORSkpIHsKKwkJaWYgKG5vbmJsb2NrX2luZykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCS8qIHdhaXQgdGlsbCBhIGZyYW1lIGlzIHJlYWR5ICovCiAJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGdzcGNhX2Rldi0+d3EsCi0JCQkJCWF0b21pY19yZWFkKCZnc3BjYV9kZXYtPm5ldmVudCkgPiAwLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDMwMDApKTsKLQkJaWYgKHJldCA8PSAwKSB7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwkvKiBpbnRlcnJ1cHQgKi8KLQkJCXJldHVybiAtRUlPOwkJLyogdGltZW91dCAqLwotCQl9Ci0JCWF0b21pY19kZWMoJmdzcGNhX2Rldi0+bmV2ZW50KTsKLQkJaWYgKCFnc3BjYV9kZXYtPnN0cmVhbWluZyB8fCAhZ3NwY2FfZGV2LT5wcmVzZW50KQorCQkJKGZyYW1lLT52NGwyX2J1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRE9ORSkgfHwKKwkJCSFnc3BjYV9kZXYtPnN0cmVhbWluZyB8fCAhZ3NwY2FfZGV2LT5wcmVzZW50LAorCQkJbXNlY3NfdG9famlmZmllcygzMDAwKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA9PSAwIHx8ICFnc3BjYV9kZXYtPnN0cmVhbWluZyB8fCAhZ3NwY2FfZGV2LT5wcmVzZW50KQogCQkJcmV0dXJuIC1FSU87Ci0JCWkgPSBnc3BjYV9kZXYtPmZyX287Ci0JCWogPSBnc3BjYV9kZXYtPmZyX3F1ZXVlW2ldOwotCQlmcmFtZSA9ICZnc3BjYV9kZXYtPmZyYW1lW2pdOwotCQlpZiAoZnJhbWUtPnY0bDJfYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19ET05FKQotCQkJYnJlYWs7CiAJfQotb2s6CisKIAlnc3BjYV9kZXYtPmZyX28gPSAoaSArIDEpICUgZ3NwY2FfZGV2LT5uZnJhbWVzOwogCVBERUJVRyhEX0ZSQU0sICJmcmFtZSB3YWl0IHE6JWQgaTolZCBvOiVkIiwKIAkJZ3NwY2FfZGV2LT5mcl9xLApAQCAtMTQ5NCw4ICsxNTQ1LDYgQEAKIAlpbnQgaSwgcmV0OwogCiAJUERFQlVHKERfRlJBTSwgImRxYnVmIik7Ci0JaWYgKHY0bDJfYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHY0bDJfYnVmLT5tZW1vcnkgIT0gZ3NwY2FfZGV2LT5tZW1vcnkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNTUwLDggKzE1OTksNiBAQAogCWludCBpLCBpbmRleCwgcmV0OwogCiAJUERFQlVHKERfRlJBTSwgInFidWYgJWQiLCB2NGwyX2J1Zi0+aW5kZXgpOwotCWlmICh2NGwyX2J1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ3NwY2FfZGV2LT5xdWV1ZV9sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKQEAgLTE3NjEsNyArMTgwOCw3IEBACiAJLnJlbGVhc2UgPSBkZXZfY2xvc2UsCiAJLnJlYWQgPSBkZXZfcmVhZCwKIAkubW1hcCA9IGRldl9tbWFwLAotCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKKwkudW5sb2NrZWRfaW9jdGwgPSBfX3ZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bCA9IHY0bF9jb21wYXRfaW9jdGwzMiwKICNlbmRpZgpAQCAtMTc4MSw2ICsxODI4LDkgQEAKIAkudmlkaW9jX3F1ZXJ5Y3RybAk9IHZpZGlvY19xdWVyeWN0cmwsCiAJLnZpZGlvY19nX2N0cmwJCT0gdmlkaW9jX2dfY3RybCwKIAkudmlkaW9jX3NfY3RybAkJPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19hdWRpbwkJPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8JCT0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19lbnVtYXVkaW8JPSB2aWRpb2NfZW51bWF1ZGlvLAogCS52aWRpb2NfcXVlcnltZW51CT0gdmlkaW9jX3F1ZXJ5bWVudSwKIAkudmlkaW9jX2VudW1faW5wdXQJPSB2aWRpb2NfZW51bV9pbnB1dCwKIAkudmlkaW9jX2dfaW5wdXQJCT0gdmlkaW9jX2dfaW5wdXQsCkBAIC0xODAyLDcgKzE4NTIsNyBAQAogCS5uYW1lID0gImdzcGNhIG1haW4gZHJpdmVyIiwKIAkuZm9wcyA9ICZkZXZfZm9wcywKIAkuaW9jdGxfb3BzID0gJmRldl9pb2N0bF9vcHMsCi0JLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkucmVsZWFzZSA9IGdzcGNhX3JlbGVhc2UsCiAJLm1pbm9yID0gLTEsCiB9OwogCkBAIC0xODQwLDcgKzE4OTAsNiBAQAogCQllcnIoImNvdWxkbid0IGt6YWxsb2MgZ3NwY2Egc3RydWN0Iik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlrcmVmX2luaXQoJmdzcGNhX2Rldi0+a3JlZik7CiAJZ3NwY2FfZGV2LT51c2JfYnVmID0ga21hbGxvYyhVU0JfQlVGX1NaLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdzcGNhX2Rldi0+dXNiX2J1ZikgewogCQllcnIoIm91dCBvZiBtZW1vcnkiKTsKQEAgLTE4NTIsMTIgKzE5MDEsMTMgQEAKIAlnc3BjYV9kZXYtPm5iYWx0ID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CiAJZ3NwY2FfZGV2LT5zZF9kZXNjID0gc2RfZGVzYzsKIAlnc3BjYV9kZXYtPm5idWZyZWFkID0gMjsKKwlnc3BjYV9kZXYtPmVtcHR5X3BhY2tldCA9IC0xOwkvKiBkb24ndCBjaGVjayB0aGUgZW1wdHkgcGFja2V0cyAqLwogCiAJLyogY29uZmlndXJlIHRoZSBzdWJkcml2ZXIgYW5kIGluaXRpYWxpemUgdGhlIFVTQiBkZXZpY2UgKi8KLQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmNvbmZpZyhnc3BjYV9kZXYsIGlkKTsKKwlyZXQgPSBzZF9kZXNjLT5jb25maWcoZ3NwY2FfZGV2LCBpZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwotCXJldCA9IGdzcGNhX2Rldi0+c2RfZGVzYy0+aW5pdChnc3BjYV9kZXYpOworCXJldCA9IHNkX2Rlc2MtPmluaXQoZ3NwY2FfZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAJcmV0ID0gZ3NwY2Ffc2V0X2FsdDAoZ3NwY2FfZGV2KTsKQEAgLTE4NzEsMTggKzE5MjEsMTUgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZnc3BjYV9kZXYtPndxKTsKIAogCS8qIGluaXQgdmlkZW8gc3R1ZmYgKi8KLQlnc3BjYV9kZXYtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQltZW1jcHkoZ3NwY2FfZGV2LT52ZGV2LCAmZ3NwY2FfdGVtcGxhdGUsIHNpemVvZiBnc3BjYV90ZW1wbGF0ZSk7Ci0JZ3NwY2FfZGV2LT52ZGV2LT5wYXJlbnQgPSAmZGV2LT5kZXY7CisJbWVtY3B5KCZnc3BjYV9kZXYtPnZkZXYsICZnc3BjYV90ZW1wbGF0ZSwgc2l6ZW9mIGdzcGNhX3RlbXBsYXRlKTsKKwlnc3BjYV9kZXYtPnZkZXYucGFyZW50ID0gJmRldi0+ZGV2OwogCWdzcGNhX2Rldi0+bW9kdWxlID0gbW9kdWxlOwogCWdzcGNhX2Rldi0+cHJlc2VudCA9IDE7Ci0JdmlkZW9fc2V0X2RydmRhdGEoZ3NwY2FfZGV2LT52ZGV2LCBnc3BjYV9kZXYpOwotCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShnc3BjYV9kZXYtPnZkZXYsCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZnc3BjYV9kZXYtPnZkZXYsCiAJCQkJICBWRkxfVFlQRV9HUkFCQkVSLAogCQkJCSAgdmlkZW9fbnIpOwogCWlmIChyZXQgPCAwKSB7CiAJCWVycigidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGVyciAlZCIsIHJldCk7Ci0JCXZpZGVvX2RldmljZV9yZWxlYXNlKGdzcGNhX2Rldi0+dmRldik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTkwNiwxNSArMTk1MywxNCBAQAogewogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCi0vKiBXZSBkb24ndCB3YW50IHBlb3BsZSB0cnlpbmcgdG8gb3BlbiB1cCB0aGUgZGV2aWNlICovCi0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZ3NwY2FfZGV2LT52ZGV2KTsKLQogCWdzcGNhX2Rldi0+cHJlc2VudCA9IDA7CiAJZ3NwY2FfZGV2LT5zdHJlYW1pbmcgPSAwOwogCi0Ja3JlZl9wdXQoJmdzcGNhX2Rldi0+a3JlZiwgZ3NwY2FfZGVsZXRlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJLyogcmVsZWFzZSB0aGUgZGV2aWNlICovCisJLyogKHRoaXMgd2lsbCBjYWxsIGdzcGNhX3JlbGVhc2UoKSBpbW1lZGlhdGx5IG9yIG9uIGxhc3QgY2xvc2UpICovCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmdzcGNhX2Rldi0+dmRldik7CiAKIAlQREVCVUcoRF9QUk9CRSwgImRpc2Nvbm5lY3QgY29tcGxldGUiKTsKIH0KQEAgLTE5OTIsNyArMjAzOCw3IEBACiAJICAgZGVzaXJlZCBsdW1pbmF0aW9uIGZhc3QgKHdpdGggdGhlIHJpc2Mgb2YgYSBzbGlnaHQgb3ZlcnNob290KSAqLwogCXN0ZXBzID0gYWJzKGRlc2lyZWRfYXZnX2x1bSAtIGF2Z19sdW0pIC8gZGVhZHpvbmU7CiAKLQlQREVCVUcoRF9GUkFNLCAiYXV0b2dhaW46IGx1bTogJWQsIGRlc2lyZWQ6ICVkLCBzdGVwczogJWRcbiIsCisJUERFQlVHKERfRlJBTSwgImF1dG9nYWluOiBsdW06ICVkLCBkZXNpcmVkOiAlZCwgc3RlcHM6ICVkIiwKIAkJYXZnX2x1bSwgZGVzaXJlZF9hdmdfbHVtLCBzdGVwcyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RlcHM7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCmluZGV4IGQyNWU4ZDY5Li5jOTBhZjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCkBAIC01Niw4ICs1NiwxMiBAQAogLyogZGV2aWNlIGluZm9ybWF0aW9uIC0gc2V0IGF0IHByb2JlIHRpbWUgKi8KIHN0cnVjdCBjYW0gewogCWludCBidWxrX3NpemU7CQkvKiBidWZmZXIgc2l6ZSB3aGVuIGltYWdlIHRyYW5zZmVyIGJ5IGJ1bGsgKi8KLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpjYW1fbW9kZTsJLyogc2l6ZSBubW9kZXMgKi8KKwljb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpjYW1fbW9kZTsJLyogc2l6ZSBubW9kZXMgKi8KIAljaGFyIG5tb2RlczsKKwlfX3U4IGJ1bGtfbnVyYnM7CS8qIG51bWJlciBvZiBVUkJzIGluIGJ1bGsgbW9kZQorCQkJCSAqIC0gY2Fubm90IGJlID4gTUFYX05VUkJTCisJCQkJICogLSB3aGVuIDAgYW5kIGJ1bGtfc2l6ZSAhPSAwIG1lYW5zCisJCQkJICogICAxIFVSQiBhbmQgc3VibWl0IGRvbmUgYnkgc3ViZHJpdmVyICovCiAJX191OCBlcGFkZHI7CiB9OwogCkBAIC03MCw2ICs3NCw4IEBACiB0eXBlZGVmIGludCAoKmNhbV9jZl9vcCkgKHN0cnVjdCBnc3BjYV9kZXYgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CiB0eXBlZGVmIGludCAoKmNhbV9qcGdfb3ApIChzdHJ1Y3QgZ3NwY2FfZGV2ICosCiAJCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICopOwordHlwZWRlZiBpbnQgKCpjYW1fc3RyZWFtcGFybV9vcCkgKHN0cnVjdCBnc3BjYV9kZXYgKiwKKwkJCQkgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKik7CiB0eXBlZGVmIGludCAoKmNhbV9xbW51X29wKSAoc3RydWN0IGdzcGNhX2RldiAqLAogCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICopOwogdHlwZWRlZiB2b2lkICgqY2FtX3BrdF9vcCkgKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKQEAgLTEwMiw2ICsxMDgsOCBAQAogCWNhbV9qcGdfb3AgZ2V0X2pjb21wOwogCWNhbV9qcGdfb3Agc2V0X2pjb21wOwogCWNhbV9xbW51X29wIHF1ZXJ5bWVudTsKKwljYW1fc3RyZWFtcGFybV9vcCBnZXRfc3RyZWFtcGFybTsKKwljYW1fc3RyZWFtcGFybV9vcCBzZXRfc3RyZWFtcGFybTsKIH07CiAKIC8qIHBhY2tldCB0eXBlcyB3aGVuIG1vdmluZyBmcm9tIGlzbyBidWYgdG8gZnJhbWUgYnVmICovCkBAIC0xMjAsMTAgKzEyOCw5IEBACiB9OwogCiBzdHJ1Y3QgZ3NwY2FfZGV2IHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsJCS8qIHN1YmRyaXZlciBoYW5kbGluZyB0aGUgZGV2aWNlICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBmaWxlICpjYXB0X2ZpbGU7CQkvKiBmaWxlIGRvaW5nIHZpZGVvIGNhcHR1cmUgKi8KIAogCXN0cnVjdCBjYW0gY2FtOwkJCQkvKiBkZXZpY2UgaW5mb3JtYXRpb24gKi8KQEAgLTE0MiwyMiArMTQ5LDIwIEBACiAJY2hhciBmcl9xOwkJCQkvKiBuZXh0IGZyYW1lIHRvIHF1ZXVlICovCiAJY2hhciBmcl9vOwkJCQkvKiBuZXh0IGZyYW1lIHRvIGRlcXVldWUgKi8KIAlzaWduZWQgY2hhciBmcl9xdWV1ZVtHU1BDQV9NQVhfRlJBTUVTXTsJLyogZnJhbWUgcXVldWUgKi8KLQljaGFyIGxhc3RfcGFja2V0X3R5cGU7CisJX191OCBsYXN0X3BhY2tldF90eXBlOworCV9fczggZW1wdHlfcGFja2V0OwkJLyogaWYgKC0xKSBkb24ndCBjaGVjayBlbXB0eSBwYWNrZXRzICovCisJX191OCBzdHJlYW1pbmc7CiAKLQlfX3U4IGlmYWNlOwkJCS8qIFVTQiBpbnRlcmZhY2UgbnVtYmVyICovCi0JX191OCBhbHQ7CQkJLyogVVNCIGFsdGVybmF0ZSBzZXR0aW5nICovCiAJX191OCBjdXJyX21vZGU7CQkJLyogY3VycmVudCBjYW1lcmEgbW9kZSAqLwogCV9fdTMyIHBpeGZtdDsJCQkvKiBjdXJyZW50IG1vZGUgcGFyYW1ldGVycyAqLwogCV9fdTE2IHdpZHRoOwogCV9fdTE2IGhlaWdodDsKKwlfX3UzMiBzZXF1ZW5jZTsJCQkvKiBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgKi8KIAotCWF0b21pY190IG5ldmVudDsJCS8qIG51bWJlciBvZiBmcmFtZXMgZG9uZSAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdxOwkJLyogd2FpdCBxdWV1ZSAqLwogCXN0cnVjdCBtdXRleCB1c2JfbG9jazsJCS8qIHVzYiBleGNoYW5nZSBwcm90ZWN0aW9uICovCiAJc3RydWN0IG11dGV4IHJlYWRfbG9jazsJCS8qIHJlYWQgcHJvdGVjdGlvbiAqLwogCXN0cnVjdCBtdXRleCBxdWV1ZV9sb2NrOwkvKiBJU09DIHF1ZXVlIHByb3RlY3Rpb24gKi8KLQlfX3UzMiBzZXF1ZW5jZTsJCQkvKiBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQljaGFyIHN0cmVhbWluZzsKICNpZmRlZiBDT05GSUdfUE0KIAljaGFyIGZyb3plbjsJCQkvKiBzdXNwZW5kIC0gcmVzdW1lICovCiAjZW5kaWYKQEAgLTE2Niw2ICsxNzEsOCBAQAogCWNoYXIgbmJ1ZnJlYWQ7CQkJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgZm9yIHJlYWQoKSAqLwogCWNoYXIgbnVyYnM7CQkJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBVUkJzICovCiAJY2hhciBtZW1vcnk7CQkJLyogbWVtb3J5IHR5cGUgKFY0TDJfTUVNT1JZX3h4eCkgKi8KKwlfX3U4IGlmYWNlOwkJCS8qIFVTQiBpbnRlcmZhY2UgbnVtYmVyICovCisJX191OCBhbHQ7CQkJLyogVVNCIGFsdGVybmF0ZSBzZXR0aW5nICovCiAJX191OCBuYmFsdDsJCQkvKiBudW1iZXIgb2YgVVNCIGFsdGVybmF0ZSBzZXR0aW5ncyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9icmlkZ2UuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfYnJpZGdlLmgKaW5kZXggMWEzN2FlNC4uYTNmM2I3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9icmlkZ2UuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2JyaWRnZS5oCkBAIC0yNSw1OSArMjUsNTkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIE01NjAyX1hCX1NFTlNPUl9UWVBFIDB4MDAKLSNkZWZpbmUgTTU2MDJfWEJfU0VOU09SX0NUUkwgMHgwMQotI2RlZmluZSBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0ggMHgwMgotI2RlZmluZSBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0wgMHgwMwotI2RlZmluZSBNNTYwMl9YQl9QSVhfT0ZfTElORV9IIDB4MDQKLSNkZWZpbmUgTTU2MDJfWEJfUElYX09GX0xJTkVfTCAweDA1Ci0jZGVmaW5lIE01NjAyX1hCX1ZTWU5DX1BBUkEgMHgwNgotI2RlZmluZSBNNTYwMl9YQl9IU1lOQ19QQVJBIDB4MDcKLSNkZWZpbmUgTTU2MDJfWEJfVEVTVF9NT0RFXzEgMHgwOAotI2RlZmluZSBNNTYwMl9YQl9URVNUX01PREVfMiAweDA5Ci0jZGVmaW5lIE01NjAyX1hCX1NJR19JTkkgMHgwYQotI2RlZmluZSBNNTYwMl9YQl9EU19QQVJBIDB4MGUKLSNkZWZpbmUgTTU2MDJfWEJfVFJJR19QQVJBIDB4MGYKLSNkZWZpbmUgTTU2MDJfWEJfQ0xLX1BEIDB4MTAKLSNkZWZpbmUgTTU2MDJfWEJfTUNVX0NMS19DVFJMIDB4MTIKLSNkZWZpbmUgTTU2MDJfWEJfTUNVX0NMS19ESVYgMHgxMwotI2RlZmluZSBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwgMHgxNAotI2RlZmluZSBNNTYwMl9YQl9TRU5fQ0xLX0RJViAweDE1Ci0jZGVmaW5lIE01NjAyX1hCX0FVRF9DTEtfQ1RSTCAweDE2Ci0jZGVmaW5lIE01NjAyX1hCX0FVRF9DTEtfRElWIDB4MTcKLSNkZWZpbmUgTTU2MDJfWEJfREVWQ1RSMSAweDQxCi0jZGVmaW5lIE01NjAyX1hCX0VQU0VUUjAgMHg0MgotI2RlZmluZSBNNTYwMl9YQl9FUEFGQ1RSIDB4NDcKLSNkZWZpbmUgTTU2MDJfWEJfRVBCRkNUUiAweDQ5Ci0jZGVmaW5lIE01NjAyX1hCX0VQRUZDVFIgMHg0ZgotI2RlZmluZSBNNTYwMl9YQl9URVNUX1JFRyAweDUzCi0jZGVmaW5lIE01NjAyX1hCX0FMVDJTSVpFIDB4NTQKLSNkZWZpbmUgTTU2MDJfWEJfQUxUM1NJWkUgMHg1NQotI2RlZmluZSBNNTYwMl9YQl9PQlNGUkFNRSAweDU2Ci0jZGVmaW5lIE01NjAyX1hCX1BXUl9DVEwgMHg1OQotI2RlZmluZSBNNTYwMl9YQl9BRENfQ1RSTCAweDYwCi0jZGVmaW5lIE01NjAyX1hCX0FEQ19EQVRBIDB4NjEKLSNkZWZpbmUgTTU2MDJfWEJfTUlTQ19DVFJMIDB4NjIKLSNkZWZpbmUgTTU2MDJfWEJfU05BUFNIT1QgMHg2MwotI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzEgMHg2NAotI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzIgMHg2NQotI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzMgMHg2NgotI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzQgMHg2NwotI2RlZmluZSBNNTYwMl9YQl9JMkNfQ1RSTCAweDY4Ci0jZGVmaW5lIE01NjAyX1hCX0kyQ19DTEtfRElWIDB4NjkKLSNkZWZpbmUgTTU2MDJfWEJfSTJDX0RFVl9BRERSIDB4NmEKLSNkZWZpbmUgTTU2MDJfWEJfSTJDX1JFR19BRERSIDB4NmIKLSNkZWZpbmUgTTU2MDJfWEJfSTJDX0RBVEEgMHg2YwotI2RlZmluZSBNNTYwMl9YQl9JMkNfU1RBVFVTIDB4NmQKLSNkZWZpbmUgTTU2MDJfWEJfR1BJT19EQVRfSCAweDcwCi0jZGVmaW5lIE01NjAyX1hCX0dQSU9fREFUX0wgMHg3MQotI2RlZmluZSBNNTYwMl9YQl9HUElPX0RJUl9IIDB4NzIKLSNkZWZpbmUgTTU2MDJfWEJfR1BJT19ESVJfTCAweDczCi0jZGVmaW5lIE01NjAyX1hCX0dQSU9fRU5fSCAweDc0Ci0jZGVmaW5lIE01NjAyX1hCX0dQSU9fRU5fTCAweDc1Ci0jZGVmaW5lIE01NjAyX1hCX0dQSU9fREFUIDB4NzYKLSNkZWZpbmUgTTU2MDJfWEJfR1BJT19ESVIgMHg3NwotI2RlZmluZSBNNTYwMl9YQl9NSVNDX0NUTCAweDcwCisjZGVmaW5lIE01NjAyX1hCX1NFTlNPUl9UWVBFCQkweDAwCisjZGVmaW5lIE01NjAyX1hCX1NFTlNPUl9DVFJMCQkweDAxCisjZGVmaW5lIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSAkweDAyCisjZGVmaW5lIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfTAkweDAzCisjZGVmaW5lIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gJCTB4MDQKKyNkZWZpbmUgTTU2MDJfWEJfUElYX09GX0xJTkVfTAkJMHgwNQorI2RlZmluZSBNNTYwMl9YQl9WU1lOQ19QQVJBCQkweDA2CisjZGVmaW5lIE01NjAyX1hCX0hTWU5DX1BBUkEJCTB4MDcKKyNkZWZpbmUgTTU2MDJfWEJfVEVTVF9NT0RFXzEJCTB4MDgKKyNkZWZpbmUgTTU2MDJfWEJfVEVTVF9NT0RFXzIJCTB4MDkKKyNkZWZpbmUgTTU2MDJfWEJfU0lHX0lOSQkJMHgwYQorI2RlZmluZSBNNTYwMl9YQl9EU19QQVJBCQkweDBlCisjZGVmaW5lIE01NjAyX1hCX1RSSUdfUEFSQQkJMHgwZgorI2RlZmluZSBNNTYwMl9YQl9DTEtfUEQJCQkweDEwCisjZGVmaW5lIE01NjAyX1hCX01DVV9DTEtfQ1RSTAkJMHgxMgorI2RlZmluZSBNNTYwMl9YQl9NQ1VfQ0xLX0RJVgkJMHgxMworI2RlZmluZSBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwJCTB4MTQKKyNkZWZpbmUgTTU2MDJfWEJfU0VOX0NMS19ESVYJCTB4MTUKKyNkZWZpbmUgTTU2MDJfWEJfQVVEX0NMS19DVFJMCQkweDE2CisjZGVmaW5lIE01NjAyX1hCX0FVRF9DTEtfRElWCQkweDE3CisjZGVmaW5lIE01NjAyX1hCX0RFVkNUUjEJCTB4NDEKKyNkZWZpbmUgTTU2MDJfWEJfRVBTRVRSMAkJMHg0MgorI2RlZmluZSBNNTYwMl9YQl9FUEFGQ1RSCQkweDQ3CisjZGVmaW5lIE01NjAyX1hCX0VQQkZDVFIJCTB4NDkKKyNkZWZpbmUgTTU2MDJfWEJfRVBFRkNUUgkJMHg0ZgorI2RlZmluZSBNNTYwMl9YQl9URVNUX1JFRwkJMHg1MworI2RlZmluZSBNNTYwMl9YQl9BTFQyU0laRQkJMHg1NAorI2RlZmluZSBNNTYwMl9YQl9BTFQzU0laRQkJMHg1NQorI2RlZmluZSBNNTYwMl9YQl9PQlNGUkFNRQkJMHg1NgorI2RlZmluZSBNNTYwMl9YQl9QV1JfQ1RMCQkweDU5CisjZGVmaW5lIE01NjAyX1hCX0FEQ19DVFJMCQkweDYwCisjZGVmaW5lIE01NjAyX1hCX0FEQ19EQVRBCQkweDYxCisjZGVmaW5lIE01NjAyX1hCX01JU0NfQ1RSTAkJMHg2MgorI2RlZmluZSBNNTYwMl9YQl9TTkFQU0hPVAkJMHg2MworI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzEJCTB4NjQKKyNkZWZpbmUgTTU2MDJfWEJfU0NSQVRDSF8yCQkweDY1CisjZGVmaW5lIE01NjAyX1hCX1NDUkFUQ0hfMwkJMHg2NgorI2RlZmluZSBNNTYwMl9YQl9TQ1JBVENIXzQJCTB4NjcKKyNkZWZpbmUgTTU2MDJfWEJfSTJDX0NUUkwJCTB4NjgKKyNkZWZpbmUgTTU2MDJfWEJfSTJDX0NMS19ESVYJCTB4NjkKKyNkZWZpbmUgTTU2MDJfWEJfSTJDX0RFVl9BRERSCQkweDZhCisjZGVmaW5lIE01NjAyX1hCX0kyQ19SRUdfQUREUgkJMHg2YgorI2RlZmluZSBNNTYwMl9YQl9JMkNfREFUQQkJMHg2YworI2RlZmluZSBNNTYwMl9YQl9JMkNfU1RBVFVTCQkweDZkCisjZGVmaW5lIE01NjAyX1hCX0dQSU9fREFUX0gJCTB4NzAKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19EQVRfTAkJMHg3MQorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RJUl9ICQkweDcyCisjZGVmaW5lIE01NjAyX1hCX0dQSU9fRElSX0wJCTB4NzMKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19FTl9ICQkweDc0CisjZGVmaW5lIE01NjAyX1hCX0dQSU9fRU5fTAkJMHg3NQorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RBVAkJMHg3NgorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RJUgkJMHg3NworI2RlZmluZSBNNTYwMl9YQl9NSVNDX0NUTAkJMHg3MAogCiAjZGVmaW5lIEkyQ19CVVNZIDB4ODAKIApAQCAtOTAsMTMgKzkwLDcgQEAKICNkZWZpbmUgTTU2MDJfSVNPQ19FTkRQT0lOVF9BRERSIDB4ODEKICNkZWZpbmUgTTU2MDJfSU5UUl9FTkRQT0lOVF9BRERSIDB4ODIKIAotI2RlZmluZSBNNTYwMl9NQVhfRlJBTUVTCTMyCi0jZGVmaW5lIE01NjAyX1VSQlMJCTIKLSNkZWZpbmUgTTU2MDJfSVNPQ19QQUNLRVRTCTE0Ci0KLSNkZWZpbmUgTTU2MDJfVVJCX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcygyICogTTU2MDJfSVNPQ19QQUNLRVRTKQogI2RlZmluZSBNNTYwMl9VUkJfTVNHX1RJTUVPVVQgICA1MDAwCi0jZGVmaW5lIE01NjAyX0ZSQU1FX1RJTUVPVVQJMgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTExNSw3ICsxMDksNiBAQAogCTB4MTMsIE01NjAyX1hCX0kyQ19DVFJMLCAweDgxLCAweDExCiB9OwogCi0vKiBtNTYwMiBkZXZpY2UgZGVzY3JpcHRvciwgY3VycmVudGx5IGl0IGp1c3Qgd3JhcHMgdGhlIG01NjAyX2NhbWVyYSBzdHJ1Y3QgKi8KIHN0cnVjdCBzZCB7CiAJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CiAKQEAgLTE0MCw0ICsxMzMsMTAgQEAKIGludCBtNTYwMl93cml0ZV9icmlkZ2UoCiAJc3RydWN0IHNkICpzZCwgdTggYWRkcmVzcywgdTggaTJjX2RhdGEpOwogCitpbnQgbTU2MDJfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKK2ludCBtNTYwMl9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYwppbmRleCBmZDZjZTM4Li5lZDkwNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAvKiBLZXJuZWwgbW9kdWxlIHBhcmFtZXRlcnMgKi8KIGludCBmb3JjZV9zZW5zb3I7Ci1pbnQgZHVtcF9icmlkZ2U7CitzdGF0aWMgaW50IGR1bXBfYnJpZGdlOwogaW50IGR1bXBfc2Vuc29yOwogCiBzdGF0aWMgY29uc3QgX19kZXZpbml0ZGF0YSBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtNTYwMl90YWJsZVtdID0gewpAQCAtODAsNiArODAsOTcgQEAKIAlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKIH0KIAoraW50IG01NjAyX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCisJaWYgKCFsZW4gfHwgbGVuID4gc2QtPnNlbnNvci0+aTJjX3JlZ1cpCisJCXJldHVybiAtRUlOVkFMOworCisJZG8geworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOworCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsCisJCQkJIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChzZC0+c2Vuc29yLT5pMmNfcmVnVyA9PSAxKSB7CisJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIGxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgwOCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxOCArIGxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgKGkgPCBsZW4pICYmICFlcnI7IGkrKykgeworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0RBVEEsICYoaTJjX2RhdGFbaV0pKTsKKworCQlQREVCVUcoRF9DT05GLCAiUmVhZGluZyBzZW5zb3IgcmVnaXN0ZXIgIgorCQkJICAgICAgICIweCV4IGNvbnRhaW5pbmcgMHgleCAiLCBhZGRyZXNzLCAqaTJjX2RhdGEpOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbTU2MDJfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCXU4ICpwOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gc2QtPmdzcGNhX2Rldi5kZXY7CisJX191OCAqYnVmID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCisJLyogTm8gc2Vuc29yIHdpdGggYSBkYXRhIHdpZHRoIGxhcmdlciB0aGFuIDE2IGJpdHMgaGFzIHlldCBiZWVuIHNlZW4gKi8KKwlpZiAobGVuID4gc2QtPnNlbnNvci0+aTJjX3JlZ1cgfHwgIWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoYnVmLCBzZW5zb3JfdXJiX3NrZWxldG9uLAorCSAgICAgICBzaXplb2Yoc2Vuc29yX3VyYl9za2VsZXRvbikpOworCisJYnVmWzExXSA9IHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZDsKKwlidWZbMTVdID0gYWRkcmVzczsKKworCS8qIFNwZWNpYWwgY2FzZSBsYXJnZXIgc2Vuc29yIHdyaXRlcyAqLworCXAgPSBidWYgKyAxNjsKKworCS8qIENvcHkgYSBmb3VyIGJ5dGUgd3JpdGUgc2VxdWVuY2UgZm9yIGVhY2ggYnl0ZSB0byBiZSB3cml0dGVuIHRvICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMTYsIDQpOworCQlwWzNdID0gaTJjX2RhdGFbaV07CisJCXAgKz0gNDsKKwkJUERFQlVHKERfQ09ORiwgIldyaXRpbmcgc2Vuc29yIHJlZ2lzdGVyIDB4JXggd2l0aCAweCV4IiwKKwkJICAgICAgIGFkZHJlc3MsIGkyY19kYXRhW2ldKTsKKwl9CisKKwkvKiBDb3B5IHRoZSB0YWlsZXIgKi8KKwltZW1jcHkocCwgc2Vuc29yX3VyYl9za2VsZXRvbiArIDIwLCA0KTsKKworCS8qIFNldCB0aGUgdG90YWwgbGVuZ3RoICovCisJcFszXSA9IDB4MTAgKyBsZW47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgMHgwNCwgMHg0MCwgMHgxOSwKKwkJCSAgICAgIDB4MDAwMCwgYnVmLAorCQkJICAgICAgMjAgKyBsZW4gKiA0LCBNNTYwMl9VUkJfTVNHX1RJTUVPVVQpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKIC8qIER1bXAgYWxsIHRoZSByZWdpc3RlcnMgb2YgdGhlIG01NjAyIGJyaWRnZSwKICAgIHVuZm9ydHVuYXRlbHkgdGhpcyBicmVha3MgdGhlIGNhbWVyYSB1bnRpbCBpdCdzIHBvd2VyIGN5Y2xlZCAqLwogc3RhdGljIHZvaWQgbTU2MDJfZHVtcF9icmlkZ2Uoc3RydWN0IHNkICpzZCkKQEAgLTE1MCwxMSArMjQxLDE1IEBACiAKIAkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQgdG8gdGhlIGNhbWVyYSAqLwogCWNvbnN0IHU4IGJ1ZmZlcls0XSA9IHsweDEzLCAweGY5LCAweDBmLCAweDAxfTsKKworCWlmIChzZC0+c2Vuc29yLT5zdGFydCkKKwkJc2QtPnNlbnNvci0+c3RhcnQoc2QpOworCiAJbWVtY3B5KGJ1ZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAogCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKIAkJCSAgICAgIDB4MDQsIDB4NDAsIDB4MTksIDB4MDAwMCwgYnVmLAotCQkJICAgICAgNCwgTTU2MDJfVVJCX01TR19USU1FT1VUKTsKKwkJCSAgICAgIHNpemVvZihidWZmZXIpLCBNNTYwMl9VUkJfTVNHX1RJTUVPVVQpOwogCiAJUERFQlVHKERfU1RSRUFNLCAiVHJhbnNmZXIgc3RhcnRlZCIpOwogCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwpAQCAtMjg0LDYgKzM3OSw3IEBACiAJUERFQlVHKERfUFJPQkUsICJyZWdpc3RlcmVkIik7CiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBtb2RfbTU2MDJfZXhpdCh2b2lkKQogewogCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwppbmRleCBmYjcwMGMyLi5jMGU3MWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwpAQCAtMTgsNiArMTgsOCBAQAogCiAjaW5jbHVkZSAibTU2MDJfbXQ5bTExMS5oIgogCitzdGF0aWMgdm9pZCBtdDltMTExX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpOworCiBpbnQgbXQ5bTExMV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQogewogCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CkBAIC00NCwxMiArNDYsMTIgQEAKIAkJfSBlbHNlIHsKIAkJCWRhdGFbMF0gPSBwcmVpbml0X210OW0xMTFbaV1bMl07CiAJCQlkYXRhWzFdID0gcHJlaW5pdF9tdDltMTExW2ldWzNdOwotCQkJbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsCisJCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJcHJlaW5pdF9tdDltMTExW2ldWzFdLCBkYXRhLCAyKTsKIAkJfQogCX0KIAotCWlmIChtdDltMTExX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX0NISVBWRVIsIGRhdGEsIDIpKQorCWlmIChtNTYwMl9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19DSElQVkVSLCBkYXRhLCAyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGRhdGFbMF0gPT0gMHgxNCkgJiYgKGRhdGFbMV0gPT0gMHgzYSkpIHsKQEAgLTcyLDcgKzc0LDcgQEAKIAlpbnQgaSwgZXJyID0gMDsKIAogCS8qIEluaXQgdGhlIHNlbnNvciAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfbXQ5bTExMSk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfbXQ5bTExMSkgJiYgIWVycjsgaSsrKSB7CiAJCXU4IGRhdGFbMl07CiAKIAkJaWYgKGluaXRfbXQ5bTExMVtpXVswXSA9PSBCUklER0UpIHsKQEAgLTgyLDcgKzg0LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWRhdGFbMF0gPSBpbml0X210OW0xMTFbaV1bMl07CiAJCQlkYXRhWzFdID0gaW5pdF9tdDltMTExW2ldWzNdOwotCQkJZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJaW5pdF9tdDltMTExW2ldWzFdLCBkYXRhLCAyKTsKIAkJfQogCX0KQEAgLTEwNCwxMiArMTA2LDEyIEBACiAJdTggZGF0YVsyXSA9IHsweDAwLCAweDAwfTsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQllcnIgPSBtdDltMTExX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsCisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQiwKIAkJCQkgIGRhdGEsIDIpOwogCSp2YWwgPSBkYXRhWzBdICYgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1M7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgdmVydGljYWwgZmxpcCAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG10OW0xMTFfc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMTIxLDE5ICsxMjMsMTkgQEAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IHZlcnRpY2FsIGZsaXAgdG8gJWQiLCB2YWwpOwogCiAJLyogU2V0IHRoZSBjb3JyZWN0IHBhZ2UgbWFwICovCi0JZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIGRhdGEsIDIpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgZGF0YSwgMik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLCBkYXRhLCAyKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLCBkYXRhLCAyKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlkYXRhWzBdID0gKGRhdGFbMF0gJiAweGZlKSB8IHZhbDsKLQllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAorCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAogCQkJCSAgIGRhdGEsIDIpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBtdDltMTExX2dldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0xNDIsMTIgKzE0NCwxMiBAQAogCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZXJyID0gbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAorCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsCiAJCQkJICBkYXRhLCAyKTsKIAkqdmFsID0gZGF0YVswXSAmIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGhvcml6b250YWwgZmxpcCAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG10OW0xMTFfc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMTU5LDE5ICsxNjEsMTkgQEAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IGhvcml6b250YWwgZmxpcCB0byAlZCIsIHZhbCk7CiAKIAkvKiBTZXQgdGhlIGNvcnJlY3QgcGFnZSBtYXAgKi8KLQllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgZGF0YSwgMik7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBNVDlNMTExX1BBR0VfTUFQLCBkYXRhLCAyKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBtdDltMTExX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsIGRhdGEsIDIpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsIGRhdGEsIDIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCWRhdGFbMF0gPSAoZGF0YVswXSAmIDB4ZmQpIHwgKCh2YWwgPDwgMSkgJiAweDAyKTsKLQllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAorCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAogCQkJCQlkYXRhLCAyKTsKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXQ5bTExMV9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0xODAsNyArMTgyLDcgQEAKIAl1OCBkYXRhWzJdID0gezB4MDAsIDB4MDB9OwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IG10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4sIGRhdGEsIDIpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX0dMT0JBTF9HQUlOLCBkYXRhLCAyKTsKIAl0bXAgPSAoKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzBdKTsKIAogCSp2YWwgPSAoKHRtcCAmICgxIDw8IDEwKSkgKiAyKSB8CkBAIC0xOTAsNyArMTkyLDcgQEAKIAogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGdhaW4gJWQiLCAqdmFsKTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBtdDltMTExX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMjAwLDcgKzIwMiw3IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJLyogU2V0IHRoZSBjb3JyZWN0IHBhZ2UgbWFwICovCi0JZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIGRhdGEsIDIpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgZGF0YSwgMik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0yMjUsOTAgKzIyNywxMyBAQAogCVBERUJVRyhEX1Y0TDIsICJ0bXA9JWQsIGRhdGFbMV09JWQsIGRhdGFbMF09JWQiLCB0bXAsCiAJICAgICAgIGRhdGFbMV0sIGRhdGFbMF0pOwogCi0JZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4sCisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBNVDlNMTExX1NDX0dMT0JBTF9HQUlOLAogCQkJCSAgIGRhdGEsIDIpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKLWludCBtdDltMTExX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikgewotCWludCBlcnIsIGk7Ci0KLQlkbyB7Ci0JCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfU1RBVFVTLCBpMmNfZGF0YSk7Ci0JfSB3aGlsZSAoKCppMmNfZGF0YSAmIEkyQ19CVVNZKSAmJiAhZXJyKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKLQkJCQkgc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgYWRkcmVzcyk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZm9yIChpID0gMDsgaSA8IGxlbiAmJiAhZXJyOyBpKyspIHsKLQkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19EQVRBLCAmKGkyY19kYXRhW2ldKSk7Ci0KLQkJUERFQlVHKERfQ09ORiwgIlJlYWRpbmcgc2Vuc29yIHJlZ2lzdGVyICIKLQkJICAgICAgICIweCV4IGNvbnRhaW5zIDB4JXggIiwgYWRkcmVzcywgKmkyY19kYXRhKTsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Ci19Ci0KLWludCBtdDltMTExX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkJCXU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKQotewotCWludCBlcnIsIGk7Ci0JdTggKnA7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKLQlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7Ci0KLQkvKiBObyBzZW5zb3Igd2l0aCBhIGRhdGEgd2lkdGggbGFyZ2VyCi0JICAgdGhhbiAxNiBiaXRzIGhhcyB5ZXQgYmVlbiBzZWVuLCBub3Igd2l0aCAwIDpwKi8KLQlpZiAobGVuID4gMiB8fCAhbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sCi0JICAgICAgIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7Ci0KLQlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOwotCWJ1ZlsxNV0gPSBhZGRyZXNzOwotCi0JcCA9IGJ1ZiArIDE2OwotCi0JLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7Ci0JCXBbM10gPSBpMmNfZGF0YVtpXTsKLQkJcCArPSA0OwotCQlQREVCVUcoRF9DT05GLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAotCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOwotCX0KLQotCS8qIENvcHkgdGhlIHRhaWxlciAqLwotCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOwotCi0JLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KLQlwWzNdID0gMHgxMCArIGxlbjsKLQotCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICAweDA0LCAweDQwLCAweDE5LAotCQkJICAgICAgMHgwMDAwLCBidWYsCi0JCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7Ci0KLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKLX0KLQotdm9pZCBtdDltMTExX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCitzdGF0aWMgdm9pZCBtdDltMTExX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCiB7CiAJdTggYWRkcmVzcywgdmFsdWVbMl0gPSB7MHgwMCwgMHgwMH07CiAKQEAgLTMxNiwyNyArMjQxLDI3IEBACiAKIAlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIHNlbnNvciBjb3JlIHJlZ2lzdGVycyIpOwogCXZhbHVlWzFdID0gTVQ5TTExMV9TRU5TT1JfQ09SRTsKLQltdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOworCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKLQkJbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgdmFsdWUsIDIpOworCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgdmFsdWUsIDIpOwogCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgleCIsCiAJCSAgICAgYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKIAl9CiAKIAlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNvbG9yIHBpcGVsaW5lIHJlZ2lzdGVycyIpOwogCXZhbHVlWzFdID0gTVQ5TTExMV9DT0xPUlBJUEU7Ci0JbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKKwltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKIAlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7Ci0JCW10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKIAkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAogCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CiAJfQogCiAJaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSBjYW1lcmEgY29udHJvbCByZWdpc3RlcnMiKTsKIAl2YWx1ZVsxXSA9IE1UOU0xMTFfQ0FNRVJBX0NPTlRST0w7Ci0JbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKKwltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKIAlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7Ci0JCW10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKIAkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAogCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuaAppbmRleCAzMTUyMDlkNS4uZTc5NWFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmgKQEAgLTg3LDE0ICs4Nyw2IEBACiBpbnQgbXQ5bTExMV9pbml0KHN0cnVjdCBzZCAqc2QpOwogaW50IG10OW0xMTFfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKTsKIAotaW50IG10OW0xMTFfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJCXU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKLQotaW50IG10OW0xMTFfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCQkgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOwotCi12b2lkIG10OW0xMTFfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7Ci0KIGludCBtdDltMTExX3NldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBpbnQgbXQ5bTExMV9nZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIGludCBtdDltMTExX2dldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwpAQCAtMTA2LDE0ICs5OCwxMiBAQAogCS5uYW1lID0gIk1UOU0xMTEiLAogCiAJLmkyY19zbGF2ZV9pZCA9IDB4YmEsCisJLmkyY19yZWdXID0gMiwKIAogCS5wcm9iZSA9IG10OW0xMTFfcHJvYmUsCiAJLmluaXQgPSBtdDltMTExX2luaXQsCiAJLnBvd2VyX2Rvd24gPSBtdDltMTExX3Bvd2VyX2Rvd24sCiAKLQkucmVhZF9zZW5zb3IgPSBtdDltMTExX3JlYWRfc2Vuc29yLAotCS53cml0ZV9zZW5zb3IgPSBtdDltMTExX3dyaXRlX3NlbnNvciwKLQogCS5uY3RybHMgPSAzLAogCS5jdHJscyA9IHsKIAl7CkBAIC0xMDAzLDcgKzk5Myw3IEBACiAJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMiwgMHgwMH0sCiAJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCiAJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCi0Je0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMiwgMHgwMH0sIC8qIDYzOSovCiAJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHg3ZiwgMHgwMH0sCiAJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCiAJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmMKaW5kZXggODM3YzdlNDcuLmM5MDhhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYwpAQCAtMTgsNzcgKzE4LDU3IEBACiAKICNpbmNsdWRlICJtNTYwMl9vdjk2NTAuaCIKIAotaW50IG92OTY1MF9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKLXsKLQlpbnQgZXJyLCBpOworLyogVmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5IGZsaXBzIHRoZSBpbWFnZSBpZiBtYXRjaGVkLCBuZWVkZWQgZm9yIG1hY2hpbmVzCisgICB3aGVyZSB0aGUgc2Vuc29yIGlzIG1vdW50ZWQgdXBzaWRlIGRvd24gKi8KK3N0YXRpYworICAgIGNvbnN0CisJc3RydWN0IGRtaV9zeXN0ZW1faWQgb3Y5NjUwX2ZsaXBfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiQVNVUyBBNlZDIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZWQyIpCisJCX0KKwl9LAorCXsKKwkJLmlkZW50ID0gIkFTVVMgQTZWTSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkE2Vk0iKQorCQl9CisJfSwKKwl7CisJCS5pZGVudCA9ICJBU1VTIEE2SkMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBNkpDIikKKwkJfQorCX0sCisJeworCQkuaWRlbnQgPSAiQVNVUyBBNkphIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZKIikKKwkJfQorCX0sCisJeworCQkuaWRlbnQgPSAiQVNVUyBBNkt0IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZLdCIpCisJCX0KKwl9LAorCXsKKwkJLmlkZW50ID0gIkFsaWVud2FyZSBBdXJvcmEgbTk3MDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgImFsaWVud2FyZSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBdXJvcmEgbTk3MDAiKQorCQl9CisJfSwKKwl7IH0KK307CiAKLQkvKiBUaGUgb3Y5NjUwIHJlZ2lzdGVycyBoYXZlIGEgbWF4IGRlcHRoIG9mIG9uZSBieXRlICovCi0JaWYgKGxlbiA+IDEgfHwgIWxlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkbyB7Ci0JCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfU1RBVFVTLCBpMmNfZGF0YSk7Ci0JfSB3aGlsZSAoKCppMmNfZGF0YSAmIEkyQ19CVVNZKSAmJiAhZXJyKTsKLQotCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLAotCQkJICAgb3Y5NjUwLmkyY19zbGF2ZV9pZCk7Ci0JbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOwotCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTAgKyBsZW4pOwotCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MDgpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREFUQSwgJihpMmNfZGF0YVtpXSkpOwotCi0JCVBERUJVRyhEX0NPTkYsICJSZWFkaW5nIHNlbnNvciByZWdpc3RlciAiCi0JCQkJIjB4JXggY29udGFpbmluZyAweCV4ICIsIGFkZHJlc3MsICppMmNfZGF0YSk7Ci0JfQotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotCi1pbnQgb3Y5NjUwX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pCi17Ci0JaW50IGVyciwgaTsKLQl1OCAqcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OwotCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKLQotCS8qIFRoZSBvdjk2NTAgb25seSBzdXBwb3J0cyBvbmUgYnl0ZSB3cml0ZXMgKi8KLQlpZiAobGVuID4gMSB8fCAhbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sCi0JICAgICAgIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7Ci0KLQlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOwotCWJ1ZlsxNV0gPSBhZGRyZXNzOwotCi0JLyogU3BlY2lhbCBjYXNlIGxhcmdlciBzZW5zb3Igd3JpdGVzICovCi0JcCA9IGJ1ZiArIDE2OwotCi0JLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7Ci0JCXBbM10gPSBpMmNfZGF0YVtpXTsKLQkJcCArPSA0OwotCQlQREVCVUcoRF9DT05GLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAotCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOwotCX0KLQotCS8qIENvcHkgdGhlIHRhaWxlciAqLwotCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOwotCi0JLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KLQlwWzNdID0gMHgxMCArIGxlbjsKLQotCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICAweDA0LCAweDQwLCAweDE5LAotCQkJICAgICAgMHgwMDAwLCBidWYsCi0JCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7Ci0KLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKLX0KK3N0YXRpYyB2b2lkIG92OTY1MF9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKTsKIAogaW50IG92OTY1MF9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQogewpAQCAtMTEwLDE2ICs5MCwxNiBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByZWluaXRfb3Y5NjUwKTsgaSsrKSB7CiAJCXU4IGRhdGEgPSBwcmVpbml0X292OTY1MFtpXVsyXTsKIAkJaWYgKHByZWluaXRfb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKLQkJCW92OTY1MF93cml0ZV9zZW5zb3Ioc2QsCisJCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJCSAgICBwcmVpbml0X292OTY1MFtpXVsxXSwgJmRhdGEsIDEpOwogCQllbHNlCiAJCQltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIHByZWluaXRfb3Y5NjUwW2ldWzFdLCBkYXRhKTsKIAl9CiAKLQlpZiAob3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfUElELCAmcHJvZF9pZCwgMSkpCisJaWYgKG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfUElELCAmcHJvZF9pZCwgMSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX1ZFUiwgJnZlcl9pZCwgMSkpCisJaWYgKG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVkVSLCAmdmVyX2lkLCAxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKHByb2RfaWQgPT0gMHg5NikgJiYgKHZlcl9pZCA9PSAweDUyKSkgewpAQCAtMTQ4LDM0ICsxMjgsOTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X292OTY1MCkgJiYgIWVycjsgaSsrKSB7CiAJCWRhdGEgPSBpbml0X292OTY1MFtpXVsyXTsKIAkJaWYgKGluaXRfb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKLQkJCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIGluaXRfb3Y5NjUwW2ldWzFdLAorCQkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBpbml0X292OTY1MFtpXVsxXSwKIAkJCQkJCSAgJmRhdGEsIDEpOwogCQllbHNlCiAJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIGluaXRfb3Y5NjUwW2ldWzFdLCBkYXRhKTsKIAl9CiAKLQlpZiAoIWVyciAmJiBkbWlfY2hlY2tfc3lzdGVtKG92OTY1MF9mbGlwX2RtaV90YWJsZSkpIHsKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShvdjk2NTBfZmxpcF9kbWlfdGFibGUpICYmICFlcnIpIHsKIAkJaW5mbygidmZsaXAgcXVpcmsgYWN0aXZlIik7CiAJCWRhdGEgPSAweDMwOwotCQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmRhdGEsIDEpOworCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmZGF0YSwgMSk7CiAJfQorCXJldHVybiBlcnI7Cit9CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK2ludCBvdjk2NTBfc3RhcnQoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKwlzdHJ1Y3QgY2FtICpjYW0gPSAmc2QtPmdzcGNhX2Rldi5jYW07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXNfaW5pdF9vdjk2NTApICYmICFlcnI7IGkrKykgeworCQl1OCBkYXRhID0gcmVzX2luaXRfb3Y5NjUwW2ldWzFdOworCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIHJlc19pbml0X292OTY1MFtpXVswXSwgZGF0YSk7CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChjYW0tPmNhbV9tb2RlW3NkLT5nc3BjYV9kZXYuY3Vycl9tb2RlXS53aWR0aCkKKwl7CisJY2FzZSA2NDA6CisJCVBERUJVRyhEX1Y0TDIsICJDb25maWd1cmluZyBjYW1lcmEgZm9yIFZHQSBtb2RlIik7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoVkdBX292OTY1MCkgJiYgIWVycjsgaSsrKSB7CisJCQl1OCBkYXRhID0gVkdBX292OTY1MFtpXVsyXTsKKwkJCWlmIChWR0Ffb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKKwkJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCisJCQkJCVZHQV9vdjk2NTBbaV1bMV0sICZkYXRhLCAxKTsKKwkJCWVsc2UKKwkJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIFZHQV9vdjk2NTBbaV1bMV0sIGRhdGEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAzNTI6CisJCVBERUJVRyhEX1Y0TDIsICJDb25maWd1cmluZyBjYW1lcmEgZm9yIENJRiBtb2RlIik7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQ0lGX292OTY1MCkgJiYgIWVycjsgaSsrKSB7CisJCQl1OCBkYXRhID0gQ0lGX292OTY1MFtpXVsyXTsKKwkJCWlmIChDSUZfb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKKwkJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCisJCQkJCUNJRl9vdjk2NTBbaV1bMV0sICZkYXRhLCAxKTsKKwkJCWVsc2UKKwkJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIENJRl9vdjk2NTBbaV1bMV0sIGRhdGEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAzMjA6CisJCVBERUJVRyhEX1Y0TDIsICJDb25maWd1cmluZyBjYW1lcmEgZm9yIFFWR0EgbW9kZSIpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFFWR0Ffb3Y5NjUwKSAmJiAhZXJyOyBpKyspIHsKKwkJCXU4IGRhdGEgPSBRVkdBX292OTY1MFtpXVsyXTsKKwkJCWlmIChRVkdBX292OTY1MFtpXVswXSA9PSBTRU5TT1IpCisJCQkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLAorCQkJCQlRVkdBX292OTY1MFtpXVsxXSwgJmRhdGEsIDEpOworCQkJZWxzZQorCQkJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgUVZHQV9vdjk2NTBbaV1bMV0sIGRhdGEpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX3Bvd2VyX2Rvd24oc3RydWN0IHNkICpzZCkKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3dlcl9kb3duX292OTY1MCk7IGkrKykgeworCWludCBpLCBlcnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvd2VyX2Rvd25fb3Y5NjUwKSAmJiAhZXJyOyBpKyspIHsKIAkJdTggZGF0YSA9IHBvd2VyX2Rvd25fb3Y5NjUwW2ldWzJdOwogCQlpZiAocG93ZXJfZG93bl9vdjk2NTBbaV1bMF0gPT0gU0VOU09SKQotCQkJb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwKKwkJCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwKIAkJCQkJICAgIHBvd2VyX2Rvd25fb3Y5NjUwW2ldWzFdLCAmZGF0YSwgMSk7CiAJCWVsc2UKLQkJCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgcG93ZXJfZG93bl9vdjk2NTBbaV1bMV0sIGRhdGEpOworCQkJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBwb3dlcl9kb3duX292OTY1MFtpXVsxXSwKKwkJCQkJCSBkYXRhKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX2dldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0xODQsMjQgKzIyMCwyNCBAQAogCXU4IGkyY19kYXRhOwogCWludCBlcnI7CiAKLQllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9DT00xLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NMSwgJmkyY19kYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAJKnZhbCA9IGkyY19kYXRhICYgMHgwMzsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0FFQ0gsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9BRUNILCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAkqdmFsIHw9IChpMmNfZGF0YSA8PCAyKTsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0FFQ0hNLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQUVDSE0sICZpMmNfZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCSp2YWwgfD0gKGkyY19kYXRhICYgMHgzZikgPDwgMTA7CiAKIAlQREVCVUcoRF9WNEwyLCAiUmVhZCBleHBvc3VyZSAlZCIsICp2YWwpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMjE1LDI0ICsyNTEsMjQgQEAKIAogCS8qIFRoZSA2IE1TQnMgKi8KIAlpMmNfZGF0YSA9ICh2YWwgPj4gMTApICYgMHgzZjsKLQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQUVDSE0sCisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQUVDSE0sCiAJCQkJICAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIFRoZSA4IG1pZGRsZSBiaXRzICovCiAJaTJjX2RhdGEgPSAodmFsID4+IDIpICYgMHhmZjsKLQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQUVDSCwKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9BRUNILAogCQkJCSAgJmkyY19kYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBUaGUgMiBMU0JzICovCiAJaTJjX2RhdGEgPSB2YWwgJiAweDAzOwotCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9DT00xLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTEsICZpMmNfZGF0YSwgMSk7CiAKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTI0MSwxMyArMjc3LDEzIEBACiAJdTggaTJjX2RhdGE7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0Jb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVlJFRiwgJmkyY19kYXRhLCAxKTsKKwltNTYwMl9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CiAJKnZhbCA9IChpMmNfZGF0YSAmIDB4MDMpIDw8IDg7CiAKLQllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9HQUlOLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfR0FJTiwgJmkyY19kYXRhLCAxKTsKIAkqdmFsIHw9IGkyY19kYXRhOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGdhaW4gJWQiLCAqdmFsKTsKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMjU5LDE2ICsyOTUsMTYgQEAKIAkvKiBUaGUgMiBNU0IgKi8KIAkvKiBSZWFkIHRoZSBPVjk2NTBfVlJFRiByZWdpc3RlciBmaXJzdCB0byBhdm9pZAogCSAgIGNvcnJ1cHRpbmcgdGhlIFZSRUYgaGlnaCBhbmQgbG93IGJpdHMgKi8KLQlvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOworCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVlJFRiwgJmkyY19kYXRhLCAxKTsKIAkvKiBNYXNrIGF3YXkgYWxsIHVuaW50ZXJlc3RpbmcgYml0cyAqLwogCWkyY19kYXRhID0gKCh2YWwgJiAweDAzMDApID4+IDIpIHwKIAkJCShpMmNfZGF0YSAmIDB4M0YpOwotCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CiAKIAkvKiBUaGUgOCBMU0JzICovCiAJaTJjX2RhdGEgPSB2YWwgJiAweGZmOwotCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9HQUlOLCAmaTJjX2RhdGEsIDEpOwotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0dBSU4sICZpMmNfZGF0YSwgMSk7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9nZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMjc3LDEyICszMTMsMTIgQEAKIAl1OCBpMmNfZGF0YTsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9SRUQsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9SRUQsICZpMmNfZGF0YSwgMSk7CiAJKnZhbCA9IGkyY19kYXRhOwogCiAJUERFQlVHKERfVjRMMiwgIlJlYWQgcmVkIGdhaW4gJWQiLCAqdmFsKTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfc2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMjk1LDkgKzMzMSw5IEBACiAJCQkgICAgIHZhbCAmIDB4ZmYpOwogCiAJaTJjX2RhdGEgPSB2YWwgJiAweGZmOwotCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9SRUQsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfUkVELCAmaTJjX2RhdGEsIDEpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9nZXRfYmx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTMwNiwxMiArMzQyLDEyIEBACiAJdTggaTJjX2RhdGE7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQkxVRSwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0JMVUUsICZpMmNfZGF0YSwgMSk7CiAJKnZhbCA9IGkyY19kYXRhOwogCiAJUERFQlVHKERfVjRMMiwgIlJlYWQgYmx1ZSBnYWluICVkIiwgKnZhbCk7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX3NldF9ibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0zMjQsOSArMzYwLDkgQEAKIAkgICAgICAgdmFsICYgMHhmZik7CiAKIAlpMmNfZGF0YSA9IHZhbCAmIDB4ZmY7Ci0JZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0JMVUUsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQkxVRSwgJmkyY19kYXRhLCAxKTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfZ2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTMzNSwxNCArMzcxLDE0IEBACiAJdTggaTJjX2RhdGE7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CiAJaWYgKGRtaV9jaGVja19zeXN0ZW0ob3Y5NjUwX2ZsaXBfZG1pX3RhYmxlKSkKIAkJKnZhbCA9ICgoaTJjX2RhdGEgJiBPVjk2NTBfSEZMSVApID4+IDUpID8gMCA6IDE7CiAJZWxzZQogCQkqdmFsID0gKGkyY19kYXRhICYgT1Y5NjUwX0hGTElQKSA+PiA1OwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGhvcml6b250YWwgZmxpcCAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9zZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0zNTIsMjAgKzM4OCwyMCBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCVBERUJVRyhEX1Y0TDIsICJTZXQgaG9yaXpvbnRhbCBmbGlwIHRvICVkIiwgdmFsKTsKLQllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoZG1pX2NoZWNrX3N5c3RlbShvdjk2NTBfZmxpcF9kbWlfdGFibGUpKQogCQlpMmNfZGF0YSA9ICgoaTJjX2RhdGEgJiAweGRmKSB8Ci0JCQkJKCgodmFsID8gMCA6IDEpICYgMHgwMSkgPDwgNSkpOworCQkJICAgKCgodmFsID8gMCA6IDEpICYgMHgwMSkgPDwgNSkpOwogCWVsc2UKIAkJaTJjX2RhdGEgPSAoKGkyY19kYXRhICYgMHhkZikgfAotCQkJCSgodmFsICYgMHgwMSkgPDwgNSkpOworCQkJICAgKCh2YWwgJiAweDAxKSA8PCA1KSk7CiAKLQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmaTJjX2RhdGEsIDEpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTM3NCwxNCArNDEwLDE0IEBACiAJdTggaTJjX2RhdGE7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CiAJaWYgKGRtaV9jaGVja19zeXN0ZW0ob3Y5NjUwX2ZsaXBfZG1pX3RhYmxlKSkKIAkJKnZhbCA9ICgoaTJjX2RhdGEgJiAweDEwKSA+PiA0KSA/IDAgOiAxOwogCWVsc2UKIAkJKnZhbCA9IChpMmNfZGF0YSAmIDB4MTApID4+IDQ7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgdmVydGljYWwgZmxpcCAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0zOTEsNyArNDI3LDcgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IHZlcnRpY2FsIGZsaXAgdG8gJWQiLCB2YWwpOwotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtNDAyLDkgKzQzOCw5IEBACiAJCWkyY19kYXRhID0gKChpMmNfZGF0YSAmIDB4ZWYpIHwKIAkJCQkoKHZhbCAmIDB4MDEpIDw8IDQpKTsKIAotCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmaTJjX2RhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CiBvdXQ6Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC00MTMsMTYgKzQ0OSwxNiBAQAogCXU4IGkyY19kYXRhOwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAkqdmFsID0gKGkyY19kYXRhICYgMHgwMykgPDwgODsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0dBSU4sICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9HQUlOLCAmaTJjX2RhdGEsIDEpOwogCSp2YWwgfD0gaTJjX2RhdGE7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgZ2FpbiAlZCIsICp2YWwpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfc2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC00MzUsMjIgKzQ3MSwyMiBAQAogCiAJLyogUmVhZCB0aGUgT1Y5NjUwX1ZSRUYgcmVnaXN0ZXIgZmlyc3QgdG8gYXZvaWQKIAkJY29ycnVwdGluZyB0aGUgVlJFRiBoaWdoIGFuZCBsb3cgYml0cyAqLwotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIE1hc2sgYXdheSBhbGwgdW5pbnRlcmVzdGluZyBiaXRzICovCiAJaTJjX2RhdGEgPSAoKHZhbCAmIDB4MDMwMCkgPj4gMikgfCAoaTJjX2RhdGEgJiAweDNGKTsKLQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfVlJFRiwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIFRoZSA4IExTQnMgKi8KIAlpMmNfZGF0YSA9IHZhbCAmIDB4ZmY7Ci0JZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0dBSU4sICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfR0FJTiwgJmkyY19kYXRhLCAxKTsKIAogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfZ2V0X2F1dG9fd2hpdGVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC00NTksMTEgKzQ5NSwxMSBAQAogCXU4IGkyY19kYXRhOwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9DT004LCAmaTJjX2RhdGEsIDEpOwogCSp2YWwgPSAoaTJjX2RhdGEgJiBPVjk2NTBfQVdCX0VOKSA+PiAxOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGF1dG8gd2hpdGUgYmFsYW5jZSAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IG92OTY1MF9zZXRfYXV0b193aGl0ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtNDczLDE0ICs1MDksMTQgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IGF1dG8gd2hpdGUgYmFsYW5jZSB0byAlZCIsIHZhbCk7Ci0JZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCiAJaTJjX2RhdGEgPSAoKGkyY19kYXRhICYgMHhmZCkgfCAoKHZhbCAmIDB4MDEpIDw8IDEpKTsKLQllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9DT004LCAmaTJjX2RhdGEsIDEpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBvdjk2NTBfZ2V0X2F1dG9fZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC00ODksMTEgKzUyNSwxMSBAQAogCXU4IGkyY19kYXRhOwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9DT004LCAmaTJjX2RhdGEsIDEpOwogCSp2YWwgPSAoaTJjX2RhdGEgJiBPVjk2NTBfQUdDX0VOKSA+PiAyOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGF1dG8gZ2FpbiBjb250cm9sICVkIiwgKnZhbCk7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgb3Y5NjUwX3NldF9hdXRvX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC01MDMsMjMgKzUzOSwyMyBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCVBERUJVRyhEX1Y0TDIsICJTZXQgYXV0byBnYWluIGNvbnRyb2wgdG8gJWQiLCB2YWwpOwotCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9DT004LCAmaTJjX2RhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCWkyY19kYXRhID0gKChpMmNfZGF0YSAmIDB4ZmIpIHwgKCh2YWwgJiAweDAxKSA8PCAyKSk7Ci0JZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCi12b2lkIG92OTY1MF9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQorc3RhdGljIHZvaWQgb3Y5NjUwX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGFkZHJlc3M7CiAJaW5mbygiRHVtcGluZyB0aGUgb3Y5NjUwIHJlZ2lzdGVyIHN0YXRlIik7CiAJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4YTk7IGFkZHJlc3MrKykgewogCQl1OCB2YWx1ZTsKLQkJb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmdmFsdWUsIDEpOworCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJnZhbHVlLCAxKTsKIAkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKIAkJICAgICBhZGRyZXNzLCB2YWx1ZSk7CiAJfQpAQCAtNTMxLDkgKzU2Nyw5IEBACiAJCXU4IG9sZF92YWx1ZSwgY3RybF92YWx1ZTsKIAkJdTggdGVzdF92YWx1ZVsyXSA9IHsweGZmLCAweGZmfTsKIAotCQlvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwotCQlvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCB0ZXN0X3ZhbHVlLCAxKTsKLQkJb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CisJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCB0ZXN0X3ZhbHVlLCAxKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbHVlLCAxKTsKIAogCQlpZiAoY3RybF92YWx1ZSA9PSB0ZXN0X3ZhbHVlWzBdKQogCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKQEAgLTU0MSw2ICs1NzcsNiBAQAogCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKIAogCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlICovCi0JCW92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOworCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5oCmluZGV4IDA2NTYzMmYuLmY0YjMzYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuaApAQCAtMjAsNyArMjAsNiBAQAogI2RlZmluZSBNNTYwMl9PVjk2NTBfSF8KIAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotCiAjaW5jbHVkZSAibTU2MDJfc2Vuc29yLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM2LDYgKzM1LDcgQEAKICNkZWZpbmUgT1Y5NjUwX1BJRAkJCTB4MGEKICNkZWZpbmUgT1Y5NjUwX1ZFUgkJCTB4MGIKICNkZWZpbmUgT1Y5NjUwX0NPTTMJCQkweDBjCisjZGVmaW5lIE9WOTY1MF9DT000CQkJMHgwZAogI2RlZmluZSBPVjk2NTBfQ09NNQkJCTB4MGUKICNkZWZpbmUgT1Y5NjUwX0NPTTYJCQkweDBmCiAjZGVmaW5lIE9WOTY1MF9BRUNICQkJMHgxMApAQCAtOTQsNiArOTQsOCBAQAogCiAjZGVmaW5lIE9WOTY1MF9SRUdJU1RFUl9SRVNFVAkJKDEgPDwgNykKICNkZWZpbmUgT1Y5NjUwX1ZHQV9TRUxFQ1QJCSgxIDw8IDYpCisjZGVmaW5lIE9WOTY1MF9DSUZfU0VMRUNUCQkoMSA8PCA1KQorI2RlZmluZSBPVjk2NTBfUVZHQV9TRUxFQ1QJCSgxIDw8IDQpCiAjZGVmaW5lIE9WOTY1MF9SR0JfU0VMRUNUCQkoMSA8PCAyKQogI2RlZmluZSBPVjk2NTBfUkFXX1JHQl9TRUxFQ1QJCSgxIDw8IDApCiAKQEAgLTEwOCw2ICsxMTAsOCBAQAogI2RlZmluZSBPVjk2NTBfU1lTVEVNX0NMS19TRUwJCSgxIDw8IDcpCiAjZGVmaW5lIE9WOTY1MF9TTEFNX01PREUgCQkoMSA8PCA0KQogCisjZGVmaW5lIE9WOTY1MF9RVkdBX1ZBUklPUElYRUwJCSgxIDw8IDcpCisKICNkZWZpbmUgT1Y5NjUwX1ZGTElQCQkJKDEgPDwgNCkKICNkZWZpbmUgT1Y5NjUwX0hGTElQCQkJKDEgPDwgNSkKIApAQCAtMTI0LDE1ICsxMjgsOSBAQAogCiBpbnQgb3Y5NjUwX3Byb2JlKHN0cnVjdCBzZCAqc2QpOwogaW50IG92OTY1MF9pbml0KHN0cnVjdCBzZCAqc2QpOworaW50IG92OTY1MF9zdGFydChzdHJ1Y3Qgc2QgKnNkKTsKIGludCBvdjk2NTBfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKTsKIAotaW50IG92OTY1MF9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkgICAgICAgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOwotaW50IG92OTY1MF93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKLQotdm9pZCBvdjk2NTBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7Ci0KIGludCBvdjk2NTBfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIGludCBvdjk2NTBfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBpbnQgb3Y5NjUwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC0xNTUsMTEgKzE1MywxMSBAQAogc3RhdGljIHN0cnVjdCBtNTYwMl9zZW5zb3Igb3Y5NjUwID0gewogCS5uYW1lID0gIk9WOTY1MCIsCiAJLmkyY19zbGF2ZV9pZCA9IDB4NjAsCisJLmkyY19yZWdXID0gMSwKIAkucHJvYmUgPSBvdjk2NTBfcHJvYmUsCiAJLmluaXQgPSBvdjk2NTBfaW5pdCwKKwkuc3RhcnQgPSBvdjk2NTBfc3RhcnQsCiAJLnBvd2VyX2Rvd24gPSBvdjk2NTBfcG93ZXJfZG93biwKLQkucmVhZF9zZW5zb3IgPSBvdjk2NTBfcmVhZF9zZW5zb3IsCi0JLndyaXRlX3NlbnNvciA9IG92OTY1MF93cml0ZV9zZW5zb3IsCiAKIAkubmN0cmxzID0gOCwKIAkuY3RybHMgPSB7CkBAIC0yNjQsMTggKzI2MiwzOCBAQAogCX0KIAl9LAogCi0JLm5tb2RlcyA9IDEsCisJLm5tb2RlcyA9IDMsCiAJLm1vZGVzID0gewogCXsKLQkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKLQkJTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQsCisJCTMyMCwKKwkJMjQwLAogCQlWNEwyX1BJWF9GTVRfU0JHR1I4LAogCQlWNEwyX0ZJRUxEX05PTkUsCiAJCS5zaXplaW1hZ2UgPQotCQkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCAqIE01NjAyX0RFRkFVTFRfRlJBTUVfSEVJR0hULAotCQkuYnl0ZXNwZXJsaW5lID0gTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKKwkJCTMyMCAqIDI0MCwKKwkJLmJ5dGVzcGVybGluZSA9IDMyMCwKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKLQkJLnByaXYgPSAxCisJCS5wcml2ID0gMAorCX0sIHsKKwkJMzUyLAorCQkyODgsCisJCVY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCVY0TDJfRklFTERfTk9ORSwKKwkJLnNpemVpbWFnZSA9CisJCQkzNTIgKiAyODgsCisJCS5ieXRlc3BlcmxpbmUgPSAzNTIsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMAorCX0sIHsKKwkJNjQwLAorCQk0ODAsCisJCVY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCVY0TDJfRklFTERfTk9ORSwKKwkJLnNpemVpbWFnZSA9CisJCQk2NDAgKiA0ODAsCisJCS5ieXRlc3BlcmxpbmUgPSA2NDAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMAogCX0KIAl9CiB9OwpAQCAtMzI0LDYgKzM0Miw3IEBACiAJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMH0sCiAJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDB9LAogCXtCUklER0UsIE01NjAyX1hCX0kyQ19DTEtfRElWLCAweDBhfSwKKwogCS8qIFJlc2V0IGNoaXAgKi8KIAl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX1JFR0lTVEVSX1JFU0VUfSwKIAkvKiBFbmFibGUgZG91YmxlIGNsb2NrICovCkBAIC0zMzEsOCArMzUwLDYgQEAKIAkvKiBEbyBzb21ldGhpbmcgb3V0IG9mIHNwZWMgd2l0aCB0aGUgcG93ZXIgKi8KIAl7U0VOU09SLCBPVjk2NTBfT0ZPTiwgMHg0MH0sCiAKLQkvKiBTZXQgUVFWR0EgKi8KLQl7U0VOU09SLCBPVjk2NTBfQ09NMSwgMHgyMH0sCiAJLyogU2V0IGZhc3QgQUdDL0FFQyBhbGdvcml0aG0gd2l0aCB1bmxpbWl0ZWQgc3RlcCBzaXplICovCiAJe1NFTlNPUiwgT1Y5NjUwX0NPTTgsIE9WOTY1MF9GQVNUX0FHQ19BRUMgfAogCQkJICAgICAgT1Y5NjUwX0FFQ19VTkxJTV9TVEVQX1NJWkUgfApAQCAtMzQzLDcgKzM2MCw3IEBACiAJe1NFTlNPUiwgT1Y5NjUwX0FDT00zOCwgMHg4MX0sCiAJLyogVHVybiBvZmYgY29sb3IgbWF0cml4IGNvZWZmaWNpZW50IGRvdWJsZSBvcHRpb24gKi8KIAl7U0VOU09SLCBPVjk2NTBfQ09NMTYsIDB4MDB9LAotCQkvKiBFbmFibGUgY29sb3IgbWF0cml4IGZvciBSR0IvWVVWLCBEZWxheSBZIGNoYW5uZWwsCisJLyogRW5hYmxlIGNvbG9yIG1hdHJpeCBmb3IgUkdCL1lVViwgRGVsYXkgWSBjaGFubmVsLAogCXNldCBvdXRwdXQgWS9VViBkZWxheSB0byAxICovCiAJe1NFTlNPUiwgT1Y5NjUwX0NPTTEzLCAweDE5fSwKIAkvKiBFbmFibGUgZGlnaXRhbCBCTEMsIFNldCBvdXRwdXQgbW9kZSB0byBVIFkgViBZICovCkBAIC0zNTIsNyArMzY5LDcgQEAKIAl7U0VOU09SLCBPVjk2NTBfQ09NMjQsIDB4MDB9LAogCS8qIEVuYWJsZSBIUkVGIGFuZCBzb21lIG91dCBvZiBzcGVjIHRoaW5ncyAqLwogCXtTRU5TT1IsIE9WOTY1MF9DT00xMiwgMHg3M30sCi0JCS8qIFNldCBhbGwgREJMQyBvZmZzZXQgc2lnbnMgdG8gcG9zaXRpdmUgYW5kCisJLyogU2V0IGFsbCBEQkxDIG9mZnNldCBzaWducyB0byBwb3NpdGl2ZSBhbmQKIAlkbyBzb21lIG91dCBvZiBzcGVjIHN0dWZmICovCiAJe1NFTlNPUiwgT1Y5NjUwX0RCTEMxLCAweGRmfSwKIAl7U0VOU09SLCBPVjk2NTBfQ09NMjEsIDB4MDZ9LApAQCAtMzY0LDcgKzM4MSw3IEBACiAJe1NFTlNPUiwgT1Y5NjUwX1JTVkQ5NiwgMHgwNH0sCiAJLyogRW5hYmxlIGZ1bGwgcmFuZ2Ugb3V0cHV0ICovCiAJe1NFTlNPUiwgT1Y5NjUwX0NPTTE1LCAweDB9LAotCQkvKiBFbmFibGUgSFJFRiBhdCBvcHRpY2FsIGJsYWNrLCBlbmFibGUgQURCTEMgYmlhcywKKwkvKiBFbmFibGUgSFJFRiBhdCBvcHRpY2FsIGJsYWNrLCBlbmFibGUgQURCTEMgYmlhcywKIAllbmFibGUgQURCTEMsIHJlc2V0IHRpbWluZ3MgYXQgZm9ybWF0IGNoYW5nZSAqLwogCXtTRU5TT1IsIE9WOTY1MF9DT002LCAweDRifSwKIAkvKiBTdWJ0cmFjdCAzMiBmcm9tIHRoZSBCIGNoYW5uZWwgYmlhcyAqLwpAQCAtMzg1LDcgKzQwMiw3IEBACiAJe1NFTlNPUiwgT1Y5NjUwX0FFQiwgMHg1Y30sCiAJLyogU2V0IHRoZSBoaWdoIGFuZCBsb3cgbGltaXQgbmliYmxlcyB0byAzICovCiAJe1NFTlNPUiwgT1Y5NjUwX1ZQVCwgMHhjM30sCi0JCS8qIFNldCB0aGUgQXV0b21hdGljIEdhaW4gQ2VpbGluZyAoQUdDKSB0byAxMjh4LAorCS8qIFNldCB0aGUgQXV0b21hdGljIEdhaW4gQ2VpbGluZyAoQUdDKSB0byAxMjh4LAogCWRyb3AgVlNZTkMgYXQgZnJhbWUgZHJvcCwKIAlsaW1pdCBleHBvc3VyZSB0aW1pbmcsCiAJZHJvcCBmcmFtZSB3aGVuIHRoZSBBRUMgc3RlcCBpcyBsYXJnZXIgdGhhbiB0aGUgZXhwb3N1cmUgZ2FwICovCkBAIC0zOTQsOSArNDExLDkgQEAKIAlhbmQgc2V0IFBXRE4gdG8gU0xWUyAoc2xhdmUgbW9kZSB2ZXJ0aWNhbCBzeW5jKSAqLwogCXtTRU5TT1IsIE9WOTY1MF9DT00xMCwgMHg0Mn0sCiAJLyogU2V0IGhvcml6b250YWwgY29sdW1uIHN0YXJ0IGhpZ2ggdG8gZGVmYXVsdCB2YWx1ZSAqLwotCXtTRU5TT1IsIE9WOTY1MF9IU1RBUlQsIDB4MWF9LAorCXtTRU5TT1IsIE9WOTY1MF9IU1RBUlQsIDB4MWF9LCAvKiAyMTAgKi8KIAkvKiBTZXQgaG9yaXpvbnRhbCBjb2x1bW4gZW5kICovCi0Je1NFTlNPUiwgT1Y5NjUwX0hTVE9QLCAweGJmfSwKKwl7U0VOU09SLCBPVjk2NTBfSFNUT1AsIDB4YmZ9LCAvKiAxNTM0ICovCiAJLyogQ29tcGxlbWVudGluZyByZWdpc3RlciB0byB0aGUgdHdvIHdyaXRlcyBhYm92ZSAqLwogCXtTRU5TT1IsIE9WOTY1MF9IUkVGLCAweGIyfSwKIAkvKiBTZXQgdmVydGljYWwgcm93IHN0YXJ0IGhpZ2ggYml0cyAqLwpAQCAtNDA1LDEwICs0MjIsNiBAQAogCXtTRU5TT1IsIE9WOTY1MF9WU1RPUCwgMHg3ZX0sCiAJLyogU2V0IGNvbXBsZW1lbnRpbmcgdmVydGljYWwgZnJhbWUgY29udHJvbCAqLwogCXtTRU5TT1IsIE9WOTY1MF9WUkVGLCAweDEwfSwKLQkvKiBTZXQgcmF3IFJHQiBvdXRwdXQgZm9ybWF0IHdpdGggVkdBIHJlc29sdXRpb24gKi8KLQl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX1ZHQV9TRUxFQ1QgfAotCQkJICAgICAgT1Y5NjUwX1JHQl9TRUxFQ1QgfAotCQkJICAgICAgT1Y5NjUwX1JBV19SR0JfU0VMRUNUfSwKIAl7U0VOU09SLCBPVjk2NTBfQURDLCAweDA0fSwKIAl7U0VOU09SLCBPVjk2NTBfSFYsIDB4NDB9LAogCS8qIEVuYWJsZSBkZW5vaXNlLCBhbmQgd2hpdGUtcGl4ZWwgZXJhc2UgKi8KQEAgLTQxNywzMCArNDMwLDE1IEBACiAJLyogU2V0IHRoZSBoaWdoIGJpdHMgb2YgdGhlIGV4cG9zdXJlIHZhbHVlICovCiAJe1NFTlNPUiwgT1Y5NjUwX0FFQ0gsICgoRVhQT1NVUkVfREVGQVVMVCAmIDB4ZmYwMCkgPj4gOCl9LAogCisJLyogRW5hYmxlIFZBUklPUElYRUwgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMywgT1Y5NjUwX1ZBUklPUElYRUx9LAorCXtTRU5TT1IsIE9WOTY1MF9DT000LCBPVjk2NTBfUVZHQV9WQVJJT1BJWEVMfSwKKwogCS8qIFNldCB0aGUgbG93IGJpdHMgb2YgdGhlIGV4cG9zdXJlIHZhbHVlICovCiAJe1NFTlNPUiwgT1Y5NjUwX0NPTTEsIChFWFBPU1VSRV9ERUZBVUxUICYgMHhmZil9LAogCXtTRU5TT1IsIE9WOTY1MF9HQUlOLCBHQUlOX0RFRkFVTFR9LAogCXtTRU5TT1IsIE9WOTY1MF9CTFVFLCBCTFVFX0dBSU5fREVGQVVMVH0sCiAJe1NFTlNPUiwgT1Y5NjUwX1JFRCwgUkVEX0dBSU5fREVGQVVMVH0sCi0KLQl7U0VOU09SLCBPVjk2NTBfQ09NMywgT1Y5NjUwX1ZBUklPUElYRUx9LAotCXtTRU5TT1IsIE9WOTY1MF9DT001LCBPVjk2NTBfU1lTVEVNX0NMS19TRUx9LAotCi0Je0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgyfSwKLQl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0wsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODJ9LAotCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0wsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDF9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDl9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDF9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4ZTB9LAotCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAotCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4NWV9LAotCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDJ9LAotCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4ZGV9CiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwb3dlcl9kb3duX292OTY1MFtdWzNdID0KQEAgLTQ2MCw0MyArNDU4LDc2IEBACiAJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDA2fSwKIAl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAyfSwKIAl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNH0sCi0Je0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwfQorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCiB9OwogCi0vKiBWZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkgZmxpcHMgdGhlIGltYWdlIGlmIG1hdGNoZWQsIG5lZWRlZCBmb3IgbWFjaGluZXMKLSAgIHdoZXJlIHRoZSBzZW5zb3IgaXMgbW91bnRlZCB1cHNpZGUgZG93biAqLwotc3RhdGljCi0gICAgY29uc3QKLQlzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBvdjk2NTBfZmxpcF9kbWlfdGFibGVbXSA9IHsKLQl7Ci0JCS5pZGVudCA9ICJBU1VTIEE2VkMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBNlZDIikKLQkJfQotCX0sCi0JewotCQkuaWRlbnQgPSAiQVNVUyBBNlZNIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZWTSIpCi0JCX0KLQl9LAotCXsKLQkJLmlkZW50ID0gIkFTVVMgQTZKQyIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkE2SkMiKQotCQl9Ci0JfSwKLQl7Ci0JCS5pZGVudCA9ICJBU1VTIEE2S3QiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBNkt0IikKLQkJfQotCX0sCi0JeyB9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByZXNfaW5pdF9vdjk2NTBbXVsyXSA9Cit7CisJe001NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSCwgMHg4Mn0sCisJe001NjAyX1hCX0xJTkVfT0ZfRlJBTUVfTCwgMHgwMH0sCisJe001NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODJ9LAorCXtNNTYwMl9YQl9QSVhfT0ZfTElORV9MLCAweDAwfSwKKwl7TTU2MDJfWEJfU0lHX0lOSSwgMHgwMX0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFZHQV9vdjk2NTBbXVszXSA9Cit7CisJLyogTW92ZXMgdGhlIHZpZXcgd2luZG93IGluIGEgdmVydGljYWwgb3JpZW50YXRpb24gKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDA5fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGUwfSwgLyogNDgwICovCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHg2Mn0sIC8qIDk4ICovCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMn0sIC8qIDY0MCArIDk4ICovCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHhlMn0sCisKKwl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX1ZHQV9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JHQl9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JBV19SR0JfU0VMRUNUfSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIENJRl9vdjk2NTBbXVszXSA9Cit7CisJLyogTW92ZXMgdGhlIHZpZXcgd2luZG93IGluIGEgdmVydGljYWwgb3JpZW50YXRpb24gKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDA5fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDIwfSwgLyogMjg4ICovCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHg2Mn0sIC8qIDk4ICovCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMX0sIC8qIDM1MiArIDk4ICovCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHhjMn0sCisKKwl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX0NJRl9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JHQl9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JBV19SR0JfU0VMRUNUfSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFFWR0Ffb3Y5NjUwW11bM10gPQoreworCS8qIE1vdmVzIHRoZSB2aWV3IHdpbmRvdyBpbiBhIHZlcnRpY2FsIG9yaWVudGF0aW9uICovCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwOH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHhmMH0sIC8qIDI0MCAqLworCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MzF9LCAvKiA1MCAqLworCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDF9LCAvKiAzMjAgKyA1MCAqLworCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4NzF9LAorCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTcsIE9WOTY1MF9RVkdBX1NFTEVDVCB8CisJCQkgICAgICBPVjk2NTBfUkdCX1NFTEVDVCB8CisJCQkgICAgICBPVjk2NTBfUkFXX1JHQl9TRUxFQ1R9LAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuYwppbmRleCBkMTdhYzUyLi4yZTdmYjkxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5jCkBAIC0xOCw2ICsxOCw4IEBACiAKICNpbmNsdWRlICJtNTYwMl9wbzEwMzAuaCIKIAorc3RhdGljIHZvaWQgcG8xMDMwX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpOworCiBpbnQgcG8xMDMwX3Byb2JlKHN0cnVjdCBzZCAqc2QpCiB7CiAJdTggcHJvZF9pZCA9IDAsIHZlcl9pZCA9IDAsIGk7CkBAIC0zOCwxNiArNDAsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVpbml0X3BvMTAzMCk7IGkrKykgewogCQl1OCBkYXRhID0gcHJlaW5pdF9wbzEwMzBbaV1bMl07CiAJCWlmIChwcmVpbml0X3BvMTAzMFtpXVswXSA9PSBTRU5TT1IpCi0JCQlwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAorCQkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLAogCQkJCXByZWluaXRfcG8xMDMwW2ldWzFdLCAmZGF0YSwgMSk7CiAJCWVsc2UKIAkJCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgcHJlaW5pdF9wbzEwMzBbaV1bMV0sIGRhdGEpOwogCX0KIAotCWlmIChwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIDB4MywgJnByb2RfaWQsIDEpKQorCWlmIChtNTYwMl9yZWFkX3NlbnNvcihzZCwgMHgzLCAmcHJvZF9pZCwgMSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBvMTAzMF9yZWFkX3NlbnNvcihzZCwgMHg0LCAmdmVyX2lkLCAxKSkKKwlpZiAobTU2MDJfcmVhZF9zZW5zb3Ioc2QsIDB4NCwgJnZlcl9pZCwgMSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKChwcm9kX2lkID09IDB4MDIpICYmICh2ZXJfaWQgPT0gMHhlZikpIHsKQEAgLTY0LDc4ICs2NiwxMiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcG8xMDMwX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKLXsKLQlpbnQgZXJyLCBpOwotCi0JZG8gewotCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOwotCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7Ci0KLQltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKLQkJCSAgIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7Ci0JbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOwotCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTAgKyBsZW4pOwotCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MDgpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREFUQSwgJihpMmNfZGF0YVtpXSkpOwotCi0JCVBERUJVRyhEX0NPTkYsICJSZWFkaW5nIHNlbnNvciByZWdpc3RlciAiCi0JCQkJIjB4JXggY29udGFpbmluZyAweCV4ICIsIGFkZHJlc3MsICppMmNfZGF0YSk7Ci0JfQotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotCi1pbnQgcG8xMDMwX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pCi17Ci0JaW50IGVyciwgaTsKLQl1OCAqcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OwotCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKLQotCS8qIFRoZSBwbzEwMzAgb25seSBzdXBwb3J0cyBvbmUgYnl0ZSB3cml0ZXMgKi8KLQlpZiAobGVuID4gMSB8fCAhbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7Ci0KLQlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOwotCWJ1ZlsxNV0gPSBhZGRyZXNzOwotCi0JcCA9IGJ1ZiArIDE2OwotCi0JLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7Ci0JCXBbM10gPSBpMmNfZGF0YVtpXTsKLQkJcCArPSA0OwotCQlQREVCVUcoRF9DT05GLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAotCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOwotCX0KLQotCS8qIENvcHkgdGhlIGZvb3RlciAqLwotCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOwotCi0JLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KLQlwWzNdID0gMHgxMCArIGxlbjsKLQotCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICAweDA0LCAweDQwLCAweDE5LAotCQkJICAgICAgMHgwMDAwLCBidWYsCi0JCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7Ci0KLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKLX0KLQogaW50IHBvMTAzMF9pbml0KHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGksIGVyciA9IDA7CiAKIAkvKiBJbml0IHRoZSBzZW5zb3IgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X3BvMTAzMCk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfcG8xMDMwKSAmJiAhZXJyOyBpKyspIHsKIAkJdTggZGF0YVsyXSA9IHsweDAwLCAweDAwfTsKIAogCQlzd2l0Y2ggKGluaXRfcG8xMDMwW2ldWzBdKSB7CkBAIC0xNDcsMTYgKzgzLDEwIEBACiAKIAkJY2FzZSBTRU5TT1I6CiAJCQlkYXRhWzBdID0gaW5pdF9wbzEwMzBbaV1bMl07Ci0JCQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAorCQkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLAogCQkJCWluaXRfcG8xMDMwW2ldWzFdLCBkYXRhLCAxKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgU0VOU09SX0xPTkc6Ci0JCQlkYXRhWzBdID0gaW5pdF9wbzEwMzBbaV1bMl07Ci0JCQlkYXRhWzFdID0gaW5pdF9wbzEwMzBbaV1bM107Ci0JCQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAotCQkJCWluaXRfcG8xMDMwW2ldWzFdLCBkYXRhLCAyKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaW5mbygiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2Niw3ICs5Niw3IEBACiAJaWYgKGR1bXBfc2Vuc29yKQogCQlwbzEwMzBfZHVtcF9yZWdpc3RlcnMoc2QpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHBvMTAzMF9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMTc1LDE5ICsxMDUsMTkgQEAKIAl1OCBpMmNfZGF0YTsKIAlpbnQgZXJyOwogCi0JZXJyID0gcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfSCwKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19JTlRFR0xJTkVTX0gsCiAJCQkJICZpMmNfZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCSp2YWwgPSAoaTJjX2RhdGEgPDwgOCk7CiAKLQllcnIgPSBwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19NLAorCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfTSwKIAkJCQkgJmkyY19kYXRhLCAxKTsKIAkqdmFsIHw9IGkyY19kYXRhOwogCiAJUERFQlVHKERfVjRMMiwgIkV4cG9zdXJlIHJlYWQgYXMgJWQiLCAqdmFsKTsKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgcG8xMDMwX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTIwMiw3ICsxMzIsNyBAQAogCVBERUJVRyhEX1Y0TDIsICJTZXQgZXhwb3N1cmUgdG8gaGlnaCBieXRlIHRvIDB4JXgiLAogCSAgICAgICBpMmNfZGF0YSk7CiAKLQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfSCwKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19ILAogCQkJCSAgJmkyY19kYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CkBAIC0yMTAsMTEgKzE0MCwxMSBAQAogCWkyY19kYXRhID0gKHZhbCAmIDB4ZmYpOwogCVBERUJVRyhEX1Y0TDIsICJTZXQgZXhwb3N1cmUgdG8gbG93IGJ5dGUgdG8gMHgleCIsCiAJICAgICAgIGkyY19kYXRhKTsKLQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfTSwKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19NLAogCQkJCSAgJmkyY19kYXRhLCAxKTsKIAogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBwbzEwMzBfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMjIzLDEyICsxNTMsMTIgQEAKIAl1OCBpMmNfZGF0YTsKIAlpbnQgZXJyOwogCi0JZXJyID0gcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0dMT0JBTEdBSU4sCisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfR0xPQkFMR0FJTiwKIAkJCQkgJmkyY19kYXRhLCAxKTsKIAkqdmFsID0gaTJjX2RhdGE7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgZ2xvYmFsIGdhaW4gJWQiLCAqdmFsKTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBwbzEwMzBfZ2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTIzNywxNCArMTY3LDE0IEBACiAJdTggaTJjX2RhdGE7CiAJaW50IGVycjsKIAotCWVyciA9IHBvMTAzMF9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19DT05UUk9MMiwKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19DT05UUk9MMiwKIAkJCQkgJmkyY19kYXRhLCAxKTsKIAogCSp2YWwgPSAoaTJjX2RhdGEgPj4gNykgJiAweDAxIDsKIAogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGhmbGlwICVkIiwgKnZhbCk7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgcG8xMDMwX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTI1NCwxMyArMTg0LDE3IEBACiAJaW50IGVycjsKIAogCVBERUJVRyhEX1Y0TDIsICJTZXQgaGZsaXAgJWQiLCB2YWwpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0NPTlRST0wyLCAmaTJjX2RhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKIAotCWkyY19kYXRhID0gKHZhbCAmIDB4MDEpIDw8IDc7CisJaTJjX2RhdGEgPSAoMHg3ZiAmIGkyY19kYXRhKSB8ICgodmFsICYgMHgwMSkgPDwgNyk7CiAKLQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0NPTlRST0wyLAotCQkJCSAgJmkyY19kYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfQ09OVFJPTDIsCisJCQkJICZpMmNfZGF0YSwgMSk7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgcG8xMDMwX2dldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0yNjksMTQgKzIwMywxNCBAQAogCXU4IGkyY19kYXRhOwogCWludCBlcnI7CiAKLQllcnIgPSBwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfR0xPQkFMR0FJTiwKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19HTE9CQUxHQUlOLAogCQkJCSAmaTJjX2RhdGEsIDEpOwogCiAJKnZhbCA9IChpMmNfZGF0YSA+PiA2KSAmIDB4MDE7CiAKIAlQREVCVUcoRF9WNEwyLCAiUmVhZCB2ZmxpcCAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHBvMTAzMF9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0yODYsMTMgKzIyMCwxNyBAQAogCWludCBlcnI7CiAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IHZmbGlwICVkIiwgdmFsKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19DT05UUk9MMiwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpMmNfZGF0YSA9ICh2YWwgJiAweDAxKSA8PCA2OworCWkyY19kYXRhID0gKGkyY19kYXRhICYgMHhiZikgfCAoKHZhbCAmIDB4MDEpIDw8IDYpOwogCi0JZXJyID0gcG8xMDMwX3dyaXRlX3NlbnNvcihzZCwgUE8xMDMwX1JFR19DT05UUk9MMiwKLQkJCQkgICZpMmNfZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0NPTlRST0wyLAorCQkJCSAmaTJjX2RhdGEsIDEpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHBvMTAzMF9zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTMwMyw5ICsyNDEsOSBAQAogCiAJaTJjX2RhdGEgPSB2YWwgJiAweGZmOwogCVBERUJVRyhEX1Y0TDIsICJTZXQgZ2xvYmFsIGdhaW4gdG8gJWQiLCBpMmNfZGF0YSk7Ci0JZXJyID0gcG8xMDMwX3dyaXRlX3NlbnNvcihzZCwgUE8xMDMwX1JFR19HTE9CQUxHQUlOLAorCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUE8xMDMwX1JFR19HTE9CQUxHQUlOLAogCQkJCSAgJmkyY19kYXRhLCAxKTsKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgcG8xMDMwX2dldF9yZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCkBAIC0zMTQsMTEgKzI1MiwxMSBAQAogCXU4IGkyY19kYXRhOwogCWludCBlcnI7CiAKLQllcnIgPSBwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfUkVEX0dBSU4sCisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfUkVEX0dBSU4sCiAJCQkJICZpMmNfZGF0YSwgMSk7CiAJKnZhbCA9IGkyY19kYXRhOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIHJlZCBnYWluICVkIiwgKnZhbCk7Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHBvMTAzMF9zZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0zMjksOSArMjY3LDkgQEAKIAogCWkyY19kYXRhID0gdmFsICYgMHhmZjsKIAlQREVCVUcoRF9WNEwyLCAiU2V0IHJlZCBnYWluIHRvICVkIiwgaTJjX2RhdGEpOwotCWVyciA9IHBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfUkVEX0dBSU4sCisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX1JFRF9HQUlOLAogCQkJCSAgJmkyY19kYXRhLCAxKTsKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgcG8xMDMwX2dldF9ibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMzQwLDEyICsyNzgsMTIgQEAKIAl1OCBpMmNfZGF0YTsKIAlpbnQgZXJyOwogCi0JZXJyID0gcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0JMVUVfR0FJTiwKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19CTFVFX0dBSU4sCiAJCQkJICZpMmNfZGF0YSwgMSk7CiAJKnZhbCA9IGkyY19kYXRhOwogCVBERUJVRyhEX1Y0TDIsICJSZWFkIGJsdWUgZ2FpbiAlZCIsICp2YWwpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHBvMTAzMF9zZXRfYmx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQpAQCAtMzU1LDEwICsyOTMsMTAgQEAKIAlpbnQgZXJyOwogCWkyY19kYXRhID0gdmFsICYgMHhmZjsKIAlQREVCVUcoRF9WNEwyLCAiU2V0IGJsdWUgZ2FpbiB0byAlZCIsIGkyY19kYXRhKTsKLQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0JMVUVfR0FJTiwKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfQkxVRV9HQUlOLAogCQkJCSAgJmkyY19kYXRhLCAxKTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBwbzEwMzBfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKQpAQCAtMzY2LDE0ICszMDQsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBwbzEwMzBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKK3N0YXRpYyB2b2lkIHBvMTAzMF9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQogewogCWludCBhZGRyZXNzOwogCXU4IHZhbHVlID0gMDsKIAogCWluZm8oIkR1bXBpbmcgdGhlIHBvMTAzMCBzZW5zb3IgY29yZSByZWdpc3RlcnMiKTsKIAlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHg3ZjsgYWRkcmVzcysrKSB7Ci0JCXBvMTAzMF9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJnZhbHVlLCAxKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7CiAJCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCiAJCSAgICAgYWRkcmVzcywgdmFsdWUpOwogCX0KQEAgLTM4NSw5ICszMjMsOSBAQAogCQl1OCBvbGRfdmFsdWUsIGN0cmxfdmFsdWU7CiAJCXU4IHRlc3RfdmFsdWVbMl0gPSB7MHhmZiwgMHhmZn07CiAKLQkJcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKLQkJcG8xMDMwX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgdGVzdF92YWx1ZSwgMSk7Ci0JCXBvMTAzMF9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsdWUsIDEpOworCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CisJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgdGVzdF92YWx1ZSwgMSk7CisJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZVswXSkKIAkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CkBAIC0zOTUsNiArMzMzLDYgQEAKIAkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CiAKIAkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwotCQlwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuaAppbmRleCBhMGI3NWZmLi5kZWYzOWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmgKQEAgLTEwLDcgKzEwLDcgQEAKICAqIHY0bDIgaW50ZXJmYWNlIG1vZGVsZWQgYWZ0ZXIgdGhlIFY0TDIgZHJpdmVyCiAgKiBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKICAqCi0gKiBSZWdpc3RlciBkZWZpbmVzIHRha2VuIGZyb20gUGFzY2FsIFN0YW5ncyBQcm94eWNvbiBBcm1saWIKKyAqIFJlZ2lzdGVyIGRlZmluZXMgdGFrZW4gZnJvbSBQYXNjYWwgU3RhbmdzIFByb2N5b24gQXJtbGliCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTEyOCwxMyArMTI4LDYgQEAKIGludCBwbzEwMzBfaW5pdChzdHJ1Y3Qgc2QgKnNkKTsKIGludCBwbzEwMzBfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKTsKIAotdm9pZCBwbzEwMzBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7Ci0KLWludCBwbzEwMzBfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJCSAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKLWludCBwbzEwMzBfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCQkgICAgICAgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOwotCiBpbnQgcG8xMDMwX2dldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogaW50IHBvMTAzMF9zZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogaW50IHBvMTAzMF9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwpAQCAtMTUyLDYgKzE0NSw3IEBACiAJLm5hbWUgPSAiUE8xMDMwIiwKIAogCS5pMmNfc2xhdmVfaWQgPSAweGRjLAorCS5pMmNfcmVnVyA9IDEsCiAKIAkucHJvYmUgPSBwbzEwMzBfcHJvYmUsCiAJLmluaXQgPSBwbzEwMzBfaW5pdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5jCmluZGV4IDE0YjFlYWMuLmU1NjRhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuYwpAQCAtMTgsNiArMTgsNDAgQEAKIAogI2luY2x1ZGUgIm01NjAyX3M1azRhYS5oIgogCitzdGF0aWMKKyAgICBjb25zdAorCXN0cnVjdCBkbWlfc3lzdGVtX2lkIHM1azRhYV92ZmxpcF9kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJGdWppdHN1LVNpZW1lbnMgQW1pbG8gWGEgMjUyOCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFhhIDI1MjgiKQorCQl9CisJfSwgeworCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFhpIDI1NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBYaSAyNTUwIikKKwkJfQorCX0sIHsKKwkJLmlkZW50ID0gIk1TSSBHWDcwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTWljcm8tU3RhciBJbnRlcm5hdGlvbmFsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkdYNzAwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA3LzI2LzIwMDciKQorCQl9CisJfSwgeworCQkuaWRlbnQgPSAiTVNJIEdYNzAwL0dYNzA1L0VYNzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNaWNyby1TdGFyIEludGVybmF0aW9uYWwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiR1g3MDAvR1g3MDUvRVg3MDAiKQorCQl9CisJfSwKKwl7IH0KK307CisKK3N0YXRpYyB2b2lkIHM1azRhYV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKTsKKwogaW50IHM1azRhYV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQogewogCXU4IHByb2RfaWRbNl0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CkBAIC00OSw3ICs4Myw3IEBACiAKIAkJY2FzZSBTRU5TT1I6CiAJCQlkYXRhWzBdID0gcHJlaW5pdF9zNWs0YWFbaV1bMl07Ci0JCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLAorCQkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLAogCQkJCQkJICBwcmVpbml0X3M1azRhYVtpXVsxXSwKIAkJCQkJCSAgZGF0YSwgMSk7CiAJCQlicmVhazsKQEAgLTU3LDcgKzkxLDcgQEAKIAkJY2FzZSBTRU5TT1JfTE9ORzoKIAkJCWRhdGFbMF0gPSBwcmVpbml0X3M1azRhYVtpXVsyXTsKIAkJCWRhdGFbMV0gPSBwcmVpbml0X3M1azRhYVtpXVszXTsKLQkJCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJCQkgIHByZWluaXRfczVrNGFhW2ldWzFdLAogCQkJCQkJICBkYXRhLCAyKTsKIAkJCWJyZWFrOwpAQCAtNjgsMTMgKzEwMiwxNCBAQAogCX0KIAogCS8qIFRlc3Qgc29tZSByZWdpc3RlcnMsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZWlyIGV4YWN0IG1lYW5pbmcgeWV0ICovCi0JaWYgKHM1azRhYV9yZWFkX3NlbnNvcihzZCwgMHgwMCwgcHJvZF9pZCwgc2l6ZW9mKHByb2RfaWQpKSkKKwlpZiAobTU2MDJfcmVhZF9zZW5zb3Ioc2QsIDB4MDAsIHByb2RfaWQsIHNpemVvZihwcm9kX2lkKSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKG1lbWNtcChwcm9kX2lkLCBleHBlY3RlZF9wcm9kX2lkLCBzaXplb2YocHJvZF9pZCkpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAllbHNlCiAJCWluZm8oIkRldGVjdGVkIGEgczVrNGFhIHNlbnNvciIpOworCiBzZW5zb3JfZm91bmQ6CiAJc2QtPmdzcGNhX2Rldi5jYW0uY2FtX21vZGUgPSBzNWs0YWEubW9kZXM7CiAJc2QtPmdzcGNhX2Rldi5jYW0ubm1vZGVzID0gczVrNGFhLm5tb2RlczsKQEAgLTg0LDkwICsxMTksNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgczVrNGFhX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKLXsKLQlpbnQgZXJyLCBpOwotCi0JZG8gewotCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOwotCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsCi0JCQkJIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dDsKLQotCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTggKyBsZW4pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dDsKLQotCWRvIHsKLQkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19TVEFUVVMsIGkyY19kYXRhKTsKLQl9IHdoaWxlICgoKmkyY19kYXRhICYgSTJDX0JVU1kpICYmICFlcnIpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dDsKLQotCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmICFlcnI7IGkrKykgewotCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0RBVEEsICYoaTJjX2RhdGFbaV0pKTsKLQotCQlQREVCVUcoRF9DT05GLCAiUmVhZGluZyBzZW5zb3IgcmVnaXN0ZXIgIgotCQkJCSAgIjB4JXggY29udGFpbmluZyAweCV4ICIsIGFkZHJlc3MsICppMmNfZGF0YSk7Ci0JfQotb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotCi1pbnQgczVrNGFhX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pCi17Ci0JaW50IGVyciwgaTsKLQl1OCAqcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OwotCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKLQotCS8qIE5vIHNlbnNvciB3aXRoIGEgZGF0YSB3aWR0aCBsYXJnZXIgdGhhbiAxNiBiaXRzIGhhcyB5ZXQgYmVlbiBzZWVuICovCi0JaWYgKGxlbiA+IDIgfHwgIWxlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkoYnVmLCBzZW5zb3JfdXJiX3NrZWxldG9uLAotCSAgICAgICBzaXplb2Yoc2Vuc29yX3VyYl9za2VsZXRvbikpOwotCi0JYnVmWzExXSA9IHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZDsKLQlidWZbMTVdID0gYWRkcmVzczsKLQotCS8qIFNwZWNpYWwgY2FzZSBsYXJnZXIgc2Vuc29yIHdyaXRlcyAqLwotCXAgPSBidWYgKyAxNjsKLQotCS8qIENvcHkgYSBmb3VyIGJ5dGUgd3JpdGUgc2VxdWVuY2UgZm9yIGVhY2ggYnl0ZSB0byBiZSB3cml0dGVuIHRvICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMTYsIDQpOwotCQlwWzNdID0gaTJjX2RhdGFbaV07Ci0JCXAgKz0gNDsKLQkJUERFQlVHKERfQ09ORiwgIldyaXRpbmcgc2Vuc29yIHJlZ2lzdGVyIDB4JXggd2l0aCAweCV4IiwKLQkJICAgICAgIGFkZHJlc3MsIGkyY19kYXRhW2ldKTsKLQl9Ci0KLQkvKiBDb3B5IHRoZSB0YWlsZXIgKi8KLQltZW1jcHkocCwgc2Vuc29yX3VyYl9za2VsZXRvbiArIDIwLCA0KTsKLQotCS8qIFNldCB0aGUgdG90YWwgbGVuZ3RoICovCi0JcFszXSA9IDB4MTAgKyBsZW47Ci0KLQllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgMHgwNCwgMHg0MCwgMHgxOSwKLQkJCSAgICAgIDB4MDAwMCwgYnVmLAotCQkJICAgICAgMjAgKyBsZW4gKiA0LCBNNTYwMl9VUkJfTVNHX1RJTUVPVVQpOwotCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Ci19Ci0KIGludCBzNWs0YWFfaW5pdChzdHJ1Y3Qgc2QgKnNkKQogewogCWludCBpLCBlcnIgPSAwOwpAQCAtMTg0LDE0ICsxMzUsMTQgQEAKIAogCQljYXNlIFNFTlNPUjoKIAkJCWRhdGFbMF0gPSBpbml0X3M1azRhYVtpXVsyXTsKLQkJCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJaW5pdF9zNWs0YWFbaV1bMV0sIGRhdGEsIDEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTRU5TT1JfTE9ORzoKIAkJCWRhdGFbMF0gPSBpbml0X3M1azRhYVtpXVsyXTsKIAkJCWRhdGFbMV0gPSBpbml0X3M1azRhYVtpXVszXTsKLQkJCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJaW5pdF9zNWs0YWFbaV1bMV0sIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0yMDYsMjEgKzE1NywyMSBAQAogCWlmICghZXJyICYmIGRtaV9jaGVja19zeXN0ZW0oczVrNGFhX3ZmbGlwX2RtaV90YWJsZSkpIHsKIAkJdTggZGF0YSA9IDB4MDI7CiAJCWluZm8oInZlcnRpY2FsIGZsaXAgcXVpcmsgYWN0aXZlIik7Ci0JCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOwotCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKIAkJZGF0YSB8PSBTNUs0QUFfUk1fVl9GTElQOwogCQlkYXRhICY9IH5TNUs0QUFfUk1fSF9GTElQOwotCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1JFQURfTU9ERSwgJmRhdGEsIDEpOwogCiAJCS8qIERlY3JlbWVudCBDT0xTVEFSVCB0byBwcmVzZXJ2ZSBjb2xvciBvcmRlciAoQkdHUikgKi8KLQkJczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfQ09MU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOwogCQlkYXRhLS07Ci0JCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOworCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOwogCiAJCS8qIEluY3JlbWVudCBST1dTVEFSVCB0byBwcmVzZXJ2ZSBjb2xvciBvcmRlciAoQkdHUikgKi8KLQkJczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOwogCQlkYXRhKys7Ci0JCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOworCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOwogCX0KIAogCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwpAQCAtMjM3LDIwICsxODgsMjAgQEAKIAl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CiAJaW50IGVycjsKIAotCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfSEksICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX0VYUE9TVVJFX0hJLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCiAJKnZhbCA9IGRhdGEgPDwgODsKLQllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9FWFBPU1VSRV9MTywgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfTE8sICZkYXRhLCAxKTsKIAkqdmFsIHw9IGRhdGE7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgZXhwb3N1cmUgJWQiLCAqdmFsKTsKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrNGFhX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTI2MCwxNyArMjExLDE3IEBACiAJaW50IGVycjsKIAogCVBERUJVRyhEX1Y0TDIsICJTZXQgZXhwb3N1cmUgdG8gJWQiLCB2YWwpOwotCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCWRhdGEgPSAodmFsID4+IDgpICYgMHhmZjsKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfSEksICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9FWFBPU1VSRV9ISSwgJmRhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAlkYXRhID0gdmFsICYgMHhmZjsKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfTE8sICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9FWFBPU1VSRV9MTywgJmRhdGEsIDEpOwogb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworCXJldHVybiBlcnI7CiB9CiAKIGludCBzNWs0YWFfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTI3OSwxNiArMjMwLDE2IEBACiAJdTggZGF0YSA9IFM1SzRBQV9QQUdFX01BUF8yOwogCWludCBlcnI7CiAKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHM1azRhYV9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOwogCSp2YWwgPSAoZGF0YSAmIFM1SzRBQV9STV9WX0ZMSVApID4+IDc7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgdmVydGljYWwgZmxpcCAlZCIsICp2YWwpOwogCiBvdXQ6Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHM1azRhYV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0yOTgsMzUgKzI0OSwzNSBAQAogCWludCBlcnI7CiAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IHZlcnRpY2FsIGZsaXAgdG8gJWQiLCB2YWwpOwotCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwotCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAJZGF0YSA9ICgoZGF0YSAmIH5TNUs0QUFfUk1fVl9GTElQKQogCQkJfCAoKHZhbCAmIDB4MDEpIDw8IDcpKTsKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCiAJaWYgKHZhbCkgewotCQllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOworCQllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1JPV1NUQVJUX0xPLCAmZGF0YSwgMSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXQ7CiAKIAkJZGF0YSsrOwotCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKIAl9IGVsc2UgewotCQllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOworCQllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1JPV1NUQVJUX0xPLCAmZGF0YSwgMSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXQ7CiAKIAkJZGF0YS0tOwotCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKIAl9CiBvdXQ6Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHM1azRhYV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMzM1LDE1ICsyODYsMTUgQEAKIAl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CiAJaW50IGVycjsKIAotCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CiAJKnZhbCA9IChkYXRhICYgUzVLNEFBX1JNX0hfRkxJUCkgPj4gNjsKIAlQREVCVUcoRF9WNEwyLCAiUmVhZCBob3Jpem9udGFsIGZsaXAgJWQiLCAqdmFsKTsKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrNGFhX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTM1NCwzNSArMzA1LDM1IEBACiAKIAlQREVCVUcoRF9WNEwyLCAiU2V0IGhvcml6b250YWwgZmxpcCB0byAlZCIsCiAJICAgICAgIHZhbCk7Ci0JZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7Ci0JZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1JFQURfTU9ERSwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1JFQURfTU9ERSwgJmRhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAogCWRhdGEgPSAoKGRhdGEgJiB+UzVLNEFBX1JNX0hfRkxJUCkgfCAoKHZhbCAmIDB4MDEpIDw8IDYpKTsKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwogCiAJaWYgKHZhbCkgewotCQllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOworCQllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX0NPTFNUQVJUX0xPLCAmZGF0YSwgMSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXQ7CiAJCWRhdGErKzsKLQkJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX0NPTFNUQVJUX0xPLCAmZGF0YSwgMSk7CisJCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX0NPTFNUQVJUX0xPLCAmZGF0YSwgMSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfQ09MU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gb3V0OwogCQlkYXRhLS07Ci0JCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOworCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOwogCX0KIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrNGFhX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTM5MSwxNiArMzQyLDE2IEBACiAJdTggZGF0YSA9IFM1SzRBQV9QQUdFX01BUF8yOwogCWludCBlcnI7CiAKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHM1azRhYV9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX0dBSU5fMiwgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfR0FJTl8yLCAmZGF0YSwgMSk7CiAJKnZhbCA9IGRhdGE7CiAJUERFQlVHKERfVjRMMiwgIlJlYWQgZ2FpbiAlZCIsICp2YWwpOwogCiBvdXQ6Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHM1azRhYV9zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTQxMCwyOCArMzYxLDI4IEBACiAJaW50IGVycjsKIAogCVBERUJVRyhEX1Y0TDIsICJTZXQgZ2FpbiB0byAlZCIsIHZhbCk7Ci0JZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlkYXRhID0gdmFsICYgMHhmZjsKLQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfR0FJTl8yLCAmZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfR0FJTl8yLCAmZGF0YSwgMSk7CiAKIG91dDoKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCi12b2lkIHM1azRhYV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQorc3RhdGljIHZvaWQgczVrNGFhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGFkZHJlc3M7CiAJdTggcGFnZSwgb2xkX3BhZ2U7Ci0JczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CisJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJm9sZF9wYWdlLCAxKTsKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgewotCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZwYWdlLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZwYWdlLCAxKTsKIAkJaW5mbygiRHVtcGluZyB0aGUgczVrNGFhIHJlZ2lzdGVyIHN0YXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKIAkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKIAkJCXU4IHZhbHVlID0gMDsKLQkJCXM1azRhYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJnZhbHVlLCAxKTsKKwkJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmdmFsdWUsIDEpOwogCQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKIAkJCSAgICAgYWRkcmVzcywgdmFsdWUpOwogCQl9CkBAIC00MzksMTUgKzM5MCwxNSBAQAogCWluZm8oInM1azRhYSByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlIik7CiAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgewotCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZwYWdlLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZwYWdlLCAxKTsKIAkJaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlICIKIAkJICAgICAicmVhZC93cml0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCBvbGRfdmFsdWUsIGN0cmxfdmFsdWUsIHRlc3RfdmFsdWUgPSAweGZmOwogCi0JCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwotCQkJczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJnRlc3RfdmFsdWUsIDEpOwotCQkJczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CisJCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CisJCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ0ZXN0X3ZhbHVlLCAxKTsKKwkJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJCWlmIChjdHJsX3ZhbHVlID09IHRlc3RfdmFsdWUpCiAJCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKQEAgLTQ1NSw5ICs0MDYsOSBAQAogCQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CiAKIAkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KLQkJCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOworCQkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKIAkJfQogCX0KIAlpbmZvKCJSZWFkL3dyaXRlIHJlZ2lzdGVyIHByb2JpbmcgY29tcGxldGUiKTsKLQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CisJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuaAppbmRleCBlYWVmNjc2Li4xZjg4YjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmgKQEAgLTQxLDExICs0MSwxMCBAQAogI2RlZmluZSBTNUs0QUFfV0lORE9XX0hFSUdIVF9MTwkJMHgwOQogI2RlZmluZSBTNUs0QUFfV0lORE9XX1dJRFRIX0hJCQkweDBhCiAjZGVmaW5lIFM1SzRBQV9XSU5ET1dfV0lEVEhfTE8JCTB4MGIKLSNkZWZpbmUgUzVLNEFBX0dMT0JBTF9HQUlOX18JCTB4MGYgLyogT25seSBhIGd1ZXNzIEFUTSAhISEgKi8KLSNkZWZpbmUgUzVLNEFBX0hfQkxBTktfSElfXwkJMHgxZCAvKiBPbmx5IGEgZ3Vlc3MgQVRNICEhISBzeW5jIGxvc3QKLQkJCQkJCWlmIHRvbyBsb3csIHJlZHVjZXMgZnJhbWUgcmF0ZQotCQkJCQkJaWYgdG9vIGhpZ2ggKi8KLSNkZWZpbmUgUzVLNEFBX0hfQkxBTktfTE9fXwkJMHgxZSAvKiBPbmx5IGEgZ3Vlc3MgQVRNICEhISAqLworI2RlZmluZSBTNUs0QUFfR0xPQkFMX0dBSU5fXwkJMHgwZgorLyogc3luYyBsb3N0LCBpZiB0b28gbG93LCByZWR1Y2VzIGZyYW1lIHJhdGUgaWYgdG9vIGhpZ2ggKi8KKyNkZWZpbmUgUzVLNEFBX0hfQkxBTktfSElfXwkJMHgxZAorI2RlZmluZSBTNUs0QUFfSF9CTEFOS19MT19fCQkweDFlCiAjZGVmaW5lIFM1SzRBQV9FWFBPU1VSRV9ISQkJMHgxNwogI2RlZmluZSBTNUs0QUFfRVhQT1NVUkVfTE8JCTB4MTgKICNkZWZpbmUgUzVLNEFBX0dBSU5fMQkJCTB4MWYgLyogKGRpZ2l0YWw/KSBnYWluIDogNSBiaXRzICovCkBAIC02OCwxMyArNjcsNiBAQAogaW50IHM1azRhYV9pbml0KHN0cnVjdCBzZCAqc2QpOwogaW50IHM1azRhYV9wb3dlcl9kb3duKHN0cnVjdCBzZCAqc2QpOwogCi12b2lkIHM1azRhYV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKTsKLQotaW50IHM1azRhYV9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkgICAgICAgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOwotaW50IHM1azRhYV93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJCXU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKLQogaW50IHM1azRhYV9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIGludCBzNWs0YWFfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIGludCBzNWs0YWFfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC04OSw5ICs4MSw4IEBACiAJLnByb2JlID0gczVrNGFhX3Byb2JlLAogCS5pbml0ID0gczVrNGFhX2luaXQsCiAJLnBvd2VyX2Rvd24gPSBzNWs0YWFfcG93ZXJfZG93biwKLQkucmVhZF9zZW5zb3IgPSBzNWs0YWFfcmVhZF9zZW5zb3IsCi0JLndyaXRlX3NlbnNvciA9IHM1azRhYV93cml0ZV9zZW5zb3IsCiAJLmkyY19zbGF2ZV9pZCA9IDB4NWEsCisJLmkyY19yZWdXID0gMiwKIAkubmN0cmxzID0gNCwKIAkuY3RybHMgPSB7CiAJewpAQCAtMzM4LDMyICszMjksNCBAQAogCXtTRU5TT1IsIFM1SzRBQV9HQUlOXzIsIDB4YTAsIDB4MDB9CiB9OwogCi1zdGF0aWMKLSAgICBjb25zdAotCXN0cnVjdCBkbWlfc3lzdGVtX2lkIHM1azRhYV92ZmxpcF9kbWlfdGFibGVbXSA9IHsKLQl7Ci0JCS5pZGVudCA9ICJGdWppdHN1LVNpZW1lbnMgQW1pbG8gWGEgMjUyOCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFhhIDI1MjgiKQotCQl9Ci0JfSwKLQl7Ci0JCS5pZGVudCA9ICJGdWppdHN1LVNpZW1lbnMgQW1pbG8gWGkgMjU1MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFhpIDI1NTAiKQotCQl9Ci0JfSwKLQkJewotCQkuaWRlbnQgPSAiTVNJIEdYNzAwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNaWNyby1TdGFyIEludGVybmF0aW9uYWwiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiR1g3MDAiKSwKLQkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDcvMjYvMjAwNyIpCi0JCX0KLQl9LAotCXsgfQotfTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwppbmRleCA4OTg4YTcyLi5hZjNmMmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKQEAgLTE4LDYgKzE4LDggQEAKIAogI2luY2x1ZGUgIm01NjAyX3M1azgzYS5oIgogCitzdGF0aWMgdm9pZCBzNWs4M2FfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7CisKIGludCBzNWs4M2FfcHJvYmUoc3RydWN0IHNkICpzZCkKIHsKIAl1OCBwcm9kX2lkID0gMCwgdmVyX2lkID0gMDsKQEAgLTM5LDcgKzQxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVpbml0X3M1azgzYSkgJiYgIWVycjsgaSsrKSB7CiAJCXU4IGRhdGFbMl0gPSB7cHJlaW5pdF9zNWs4M2FbaV1bMl0sIHByZWluaXRfczVrODNhW2ldWzNdfTsKIAkJaWYgKHByZWluaXRfczVrODNhW2ldWzBdID09IFNFTlNPUikKLQkJCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIHByZWluaXRfczVrODNhW2ldWzFdLAorCQkJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBwcmVpbml0X3M1azgzYVtpXVsxXSwKIAkJCQlkYXRhLCAyKTsKIAkJZWxzZQogCQkJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBwcmVpbml0X3M1azgzYVtpXVsxXSwKQEAgLTQ5LDEwICs1MSwxMCBAQAogCS8qIFdlIGRvbid0IGtub3cgd2hhdCByZWdpc3RlciAoaWYgYW55KSB0aGF0IGNvbnRhaW4gdGhlIHByb2R1Y3QgaWQKIAkgKiBKdXN0IHBpY2sgdGhlIGZpcnN0IGFkZHJlc3NlcyB0aGF0IHNlZW0gdG8gcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzCiAJICogb24gbXVsdGlwbGUgbWFjaGluZXMgKi8KLQlpZiAoczVrODNhX3JlYWRfc2Vuc29yKHNkLCAweDAwLCAmcHJvZF9pZCwgMSkpCisJaWYgKG01NjAyX3JlYWRfc2Vuc29yKHNkLCAweDAwLCAmcHJvZF9pZCwgMSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHM1azgzYV9yZWFkX3NlbnNvcihzZCwgMHgwMSwgJnZlcl9pZCwgMSkpCisJaWYgKG01NjAyX3JlYWRfc2Vuc29yKHNkLCAweDAxLCAmdmVyX2lkLCAxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKHByb2RfaWQgPT0gMHhmZikgfHwgKHZlcl9pZCA9PSAweGZmKSkKQEAgLTY4LDkxICs3MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzNWs4M2FfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJCSAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKQotewotCWludCBlcnIsIGk7Ci0KLQlkbyB7Ci0JCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfU1RBVFVTLCBpMmNfZGF0YSk7Ci0JfSB3aGlsZSAoKCppMmNfZGF0YSAmIEkyQ19CVVNZKSAmJiAhZXJyKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKLQkJCQkgc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgYWRkcmVzcyk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxOCArIGxlbik7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JZG8gewotCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOwotCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0JZm9yIChpID0gMDsgaSA8IGxlbiAmJiAhbGVuOyBpKyspIHsKLQkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19EQVRBLCAmKGkyY19kYXRhW2ldKSk7Ci0KLQkJUERFQlVHKERfQ09ORiwgIlJlYWRpbmcgc2Vuc29yIHJlZ2lzdGVyICIKLQkJCQkgICIweCV4IGNvbnRhaW5pbmcgMHgleCAiLCBhZGRyZXNzLCAqaTJjX2RhdGEpOwotCX0KLQotb3V0OgotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotCi1pbnQgczVrODNhX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAotCQkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKQotewotCWludCBlcnIsIGk7Ci0JdTggKnA7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKLQlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7Ci0KLQkvKiBObyBzZW5zb3Igd2l0aCBhIGRhdGEgd2lkdGggbGFyZ2VyIHRoYW4gMTYgYml0cyBoYXMgeWV0IGJlZW4gc2VlbiAqLwotCWlmIChsZW4gPiAyIHx8ICFsZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtY3B5KGJ1Ziwgc2Vuc29yX3VyYl9za2VsZXRvbiwKLQkgICAgICAgc2l6ZW9mKHNlbnNvcl91cmJfc2tlbGV0b24pKTsKLQotCWJ1ZlsxMV0gPSBzZC0+c2Vuc29yLT5pMmNfc2xhdmVfaWQ7Ci0JYnVmWzE1XSA9IGFkZHJlc3M7Ci0KLQkvKiBTcGVjaWFsIGNhc2UgbGFyZ2VyIHNlbnNvciB3cml0ZXMgKi8KLQlwID0gYnVmICsgMTY7Ci0KLQkvKiBDb3B5IGEgZm91ciBieXRlIHdyaXRlIHNlcXVlbmNlIGZvciBlYWNoIGJ5dGUgdG8gYmUgd3JpdHRlbiB0byAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQltZW1jcHkocCwgc2Vuc29yX3VyYl9za2VsZXRvbiArIDE2LCA0KTsKLQkJcFszXSA9IGkyY19kYXRhW2ldOwotCQlwICs9IDQ7Ci0JCVBERUJVRyhEX0NPTkYsICJXcml0aW5nIHNlbnNvciByZWdpc3RlciAweCV4IHdpdGggMHgleCIsCi0JCSAgICAgICBhZGRyZXNzLCBpMmNfZGF0YVtpXSk7Ci0JfQotCi0JLyogQ29weSB0aGUgdGFpbGVyICovCi0JbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAyMCwgNCk7Ci0KLQkvKiBTZXQgdGhlIHRvdGFsIGxlbmd0aCAqLwotCXBbM10gPSAweDEwICsgbGVuOwotCi0JZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIDB4MDQsIDB4NDAsIDB4MTksCi0JCQkgICAgICAweDAwMDAsIGJ1ZiwKLQkJCSAgICAgIDIwICsgbGVuICogNCwgTTU2MDJfVVJCX01TR19USU1FT1VUKTsKLQotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotCiBpbnQgczVrODNhX2luaXQoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgaSwgZXJyID0gMDsKQEAgLTE2OSwxNCArODYsMTQgQEAKIAogCQljYXNlIFNFTlNPUjoKIAkJCWRhdGFbMF0gPSBpbml0X3M1azgzYVtpXVsyXTsKLQkJCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJaW5pdF9zNWs4M2FbaV1bMV0sIGRhdGEsIDEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTRU5TT1JfTE9ORzoKIAkJCWRhdGFbMF0gPSBpbml0X3M1azgzYVtpXVsyXTsKIAkJCWRhdGFbMV0gPSBpbml0X3M1azgzYVtpXVszXTsKLQkJCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsCisJCQllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsCiAJCQkJaW5pdF9zNWs4M2FbaV1bMV0sIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0yMDAsMTQgKzExNywxNCBAQAogewogCWludCBhZGRyZXNzOwogCXU4IHBhZ2UsIG9sZF9wYWdlOwotCXM1azgzYV9yZWFkX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmb2xkX3BhZ2UsIDEpOworCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CiAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgewotCQlzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZwYWdlLCAxKTsKKwkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZwYWdlLCAxKTsKIAkJaW5mbygiRHVtcGluZyB0aGUgczVrODNhIHJlZ2lzdGVyIHN0YXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKIAkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKIAkJCXU4IHZhbCA9IDA7Ci0JCQlzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWwsIDEpOworCQkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWwsIDEpOwogCQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKIAkJCSAgICAgYWRkcmVzcywgdmFsKTsKIAkJfQpAQCAtMjE1LDE1ICsxMzIsMTUgQEAKIAlpbmZvKCJzNWs4M2EgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOwogCiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IDE2OyBwYWdlKyspIHsKLQkJczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7CisJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7CiAJCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlICIKIAkJICAgICAgImZvciBwYWdlIDB4JXgiLCBwYWdlKTsKIAkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKIAkJCXU4IG9sZF92YWwsIGN0cmxfdmFsLCB0ZXN0X3ZhbCA9IDB4ZmY7CiAKLQkJCXM1azgzYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWwsIDEpOwotCQkJczVrODNhX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJnRlc3RfdmFsLCAxKTsKLQkJCXM1azgzYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsLCAxKTsKKwkJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbCwgMSk7CisJCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ0ZXN0X3ZhbCwgMSk7CisJCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsLCAxKTsKIAogCQkJaWYgKGN0cmxfdmFsID09IHRlc3RfdmFsKQogCQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CkBAIC0yMzEsMTEgKzE0OCwxMSBAQAogCQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CiAKIAkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsICovCi0JCQlzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbCwgMSk7CisJCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsLCAxKTsKIAkJfQogCX0KIAlpbmZvKCJSZWFkL3dyaXRlIHJlZ2lzdGVyIHByb2JpbmcgY29tcGxldGUiKTsKLQlzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CisJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CiB9CiAKIGludCBzNWs4M2FfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMjQ0LDExICsxNjEsMTUgQEAKIAl1OCBkYXRhWzJdOwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IHM1azgzYV9yZWFkX3NlbnNvcihzZCwgUzVLODNBX0JSSUdIVE5FU1MsIGRhdGEsIDIpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfQlJJR0hUTkVTUywgZGF0YSwgMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCiAJZGF0YVsxXSA9IGRhdGFbMV0gPDwgMTsKIAkqdmFsID0gZGF0YVsxXTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIGludCBzNWs4M2Ffc2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0yNTksMjMgKzE4MCwyNCBAQAogCiAJZGF0YVswXSA9IDB4MDA7CiAJZGF0YVsxXSA9IDB4MjA7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgMHgxNCwgZGF0YSwgMik7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCAweDE0LCBkYXRhLCAyKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAlkYXRhWzBdID0gMHgwMTsKIAlkYXRhWzFdID0gMHgwMDsKLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCAweDBkLCBkYXRhLCAyKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIDB4MGQsIGRhdGEsIDIpOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dDsKIAogCS8qIEZJWE1FOiBUaGlzIGlzIG5vdCBzYW5lLCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbXBvc2l0aW9uCiAJCSAgb2YgdGhlc2UgcmVnaXN0ZXJzICovCiAJZGF0YVswXSA9IHZhbCA+PiAzOyAvKiBicmlnaHRuZXNzLCBoaWdoIDUgYml0cyAqLwogCWRhdGFbMV0gPSB2YWwgPj4gMTsgLyogYnJpZ2h0bmVzcywgaGlnaCA3IGJpdHMgKi8KLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfQlJJR0hUTkVTUywgZGF0YSwgMik7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfQlJJR0hUTkVTUywgZGF0YSwgMik7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrODNhX2dldF93aGl0ZW5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMjg0LDEwICsyMDYsMTQgQEAKIAl1OCBkYXRhOwogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAotCWVyciA9IHM1azgzYV9yZWFkX3NlbnNvcihzZCwgUzVLODNBX1dISVRFTkVTUywgJmRhdGEsIDEpOworCWVyciA9IG01NjAyX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfV0hJVEVORVNTLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OwogCiAJKnZhbCA9IGRhdGE7Ci0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrODNhX3NldF93aGl0ZW5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0yOTcsOSArMjIzLDkgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlkYXRhWzBdID0gdmFsOwotCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9XSElURU5FU1MsIGRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1dISVRFTkVTUywgZGF0YSwgMSk7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrODNhX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKQEAgLTMwOCw3ICsyMzQsOSBAQAogCXU4IGRhdGFbMl07CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZXJyID0gczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfR0FJTiwgZGF0YSwgMik7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9HQUlOLCBkYXRhLCAyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlkYXRhWzFdID0gZGF0YVsxXSAmIDB4M2Y7CiAJaWYgKGRhdGFbMV0gPiBTNUs4M0FfTUFYSU1VTV9HQUlOKQpAQCAtMzE2LDcgKzI0NCw4IEBACiAKIAkqdmFsID0gZGF0YVsxXTsKIAotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIGludCBzNWs4M2Ffc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC0zMjcsOSArMjU2LDggQEAKIAogCWRhdGFbMF0gPSAwOwogCWRhdGFbMV0gPSB2YWw7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX0dBSU4sIGRhdGEsIDIpOwotCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfR0FJTiwgZGF0YSwgMik7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHM1azgzYV9nZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMzM5LDE0ICsyNjcsMTUgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlkYXRhWzBdID0gMHgwNTsKLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsIGRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCBkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKLQllcnIgPSBzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLODNBX0ZMSVAsIGRhdGEsIDEpOwogCSp2YWwgPSAoZGF0YVswXSB8IDB4NDApID8gMSA6IDA7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrODNhX3NldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTM1NiwyNSArMjg1LDI2IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJZGF0YVswXSA9IDB4MDU7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCBkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9QQUdFX01BUCwgZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCi0JZXJyID0gczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAkvKiBzZXQgb3IgemVybyBzaXggYml0LCBzZXZlbiBpcyBoZmxpcCAqLwogCWRhdGFbMF0gPSAodmFsKSA/IChkYXRhWzBdICYgMHg4MCkgfCAweDQwIHwgUzVLODNBX0ZMSVBfTUFTSwogCQkJOiAoZGF0YVswXSAmIDB4ODApIHwgUzVLODNBX0ZMSVBfTUFTSzsKLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCiAJZGF0YVswXSA9ICh2YWwpID8gMHgwYiA6IDB4MGE7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1ZGTElQX1RVTkUsIGRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1ZGTElQX1RVTkUsIGRhdGEsIDEpOwogCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHM1azgzYV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQpAQCAtMzg0LDE0ICszMTQsMTUgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlkYXRhWzBdID0gMHgwNTsKLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsIGRhdGEsIDEpOworCWVyciA9IG01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCBkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKLQllcnIgPSBzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLODNBX0ZMSVAsIGRhdGEsIDEpOwogCSp2YWwgPSAoZGF0YVswXSB8IDB4ODApID8gMSA6IDA7CiAKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgczVrODNhX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTQwMSwyMyArMzMyLDIzIEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJZGF0YVswXSA9IDB4MDU7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCBkYXRhLCAxKTsKKwllcnIgPSBtNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9QQUdFX01BUCwgZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCi0JZXJyID0gczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAkvKiBzZXQgb3IgemVybyBzZXZlbiBiaXQsIHNpeCBpcyB2ZmxpcCAqLwogCWRhdGFbMF0gPSAodmFsKSA/IChkYXRhWzBdICYgMHg0MCkgfCAweDgwIHwgUzVLODNBX0ZMSVBfTUFTSwogCQkJOiAoZGF0YVswXSAmIDB4NDApIHwgUzVLODNBX0ZMSVBfTUFTSzsKLQllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCiAJZGF0YVswXSA9ICh2YWwpID8gMHgwYSA6IDB4MGI7Ci0JZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX0hGTElQX1RVTkUsIGRhdGEsIDEpOwotCi0JcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJZXJyID0gbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfSEZMSVBfVFVORSwgZGF0YSwgMSk7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5oCmluZGV4IGVlM2VlOWMuLjA1Y2NiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuaApAQCAtMjIsMTUgKzIyLDE1IEBACiAjaW5jbHVkZSAibTU2MDJfc2Vuc29yLmgiCiAKICNkZWZpbmUgUzVLODNBX0ZMSVAJCQkJMHgwMQotI2RlZmluZSBTNUs4M0FfSEZMSVBfVFVORQkJMHgwMwotI2RlZmluZSBTNUs4M0FfVkZMSVBfVFVORQkJMHgwNQotI2RlZmluZSBTNUs4M0FfV0hJVEVORVNTCQkweDBhCisjZGVmaW5lIFM1SzgzQV9IRkxJUF9UVU5FCQkJMHgwMworI2RlZmluZSBTNUs4M0FfVkZMSVBfVFVORQkJCTB4MDUKKyNkZWZpbmUgUzVLODNBX1dISVRFTkVTUwkJCTB4MGEKICNkZWZpbmUgUzVLODNBX0dBSU4JCQkJMHgxOAotI2RlZmluZSBTNUs4M0FfQlJJR0hUTkVTUwkJMHgxYgotI2RlZmluZSBTNUs4M0FfUEFHRV9NQVAJCQkweGVjCisjZGVmaW5lIFM1SzgzQV9CUklHSFRORVNTCQkJMHgxYgorI2RlZmluZSBTNUs4M0FfUEFHRV9NQVAJCQkJMHhlYwogCi0jZGVmaW5lIFM1SzgzQV9ERUZBVUxUX0JSSUdIVE5FU1MJMHg3MQotI2RlZmluZSBTNUs4M0FfREVGQVVMVF9XSElURU5FU1MJMHg3ZQorI2RlZmluZSBTNUs4M0FfREVGQVVMVF9CUklHSFRORVNTCQkweDcxCisjZGVmaW5lIFM1SzgzQV9ERUZBVUxUX1dISVRFTkVTUwkJMHg3ZQogI2RlZmluZSBTNUs4M0FfREVGQVVMVF9HQUlOCQkJMHgwMAogI2RlZmluZSBTNUs4M0FfTUFYSU1VTV9HQUlOCQkJMHgzYwogI2RlZmluZSBTNUs4M0FfRkxJUF9NQVNLCQkJMHgxMApAQCAtNDYsMTMgKzQ2LDYgQEAKIGludCBzNWs4M2FfaW5pdChzdHJ1Y3Qgc2QgKnNkKTsKIGludCBzNWs4M2FfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKTsKIAotdm9pZCBzNWs4M2FfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7Ci0KLWludCBzNWs4M2FfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKLWludCBzNWs4M2Ffd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7Ci0KIGludCBzNWs4M2Ffc2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogaW50IHM1azgzYV9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogaW50IHM1azgzYV9zZXRfd2hpdGVuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKQEAgLTY0LDE1ICs1NywxMyBAQAogaW50IHM1azgzYV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIGludCBzNWs4M2Ffc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIAotCiBzdGF0aWMgc3RydWN0IG01NjAyX3NlbnNvciBzNWs4M2EgPSB7CiAJLm5hbWUgPSAiUzVLODNBIiwKIAkucHJvYmUgPSBzNWs4M2FfcHJvYmUsCiAJLmluaXQgPSBzNWs4M2FfaW5pdCwKIAkucG93ZXJfZG93biA9IHM1azgzYV9wb3dlcl9kb3duLAotCS5yZWFkX3NlbnNvciA9IHM1azgzYV9yZWFkX3NlbnNvciwKLQkud3JpdGVfc2Vuc29yID0gczVrODNhX3dyaXRlX3NlbnNvciwKIAkuaTJjX3NsYXZlX2lkID0gMHg1YSwKKwkuaTJjX3JlZ1cgPSAyLAogCS5uY3RybHMgPSA1LAogCS5jdHJscyA9IHsKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3NlbnNvci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zZW5zb3IuaAppbmRleCA2MGM5YTQ4Li4yNjE2MjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3NlbnNvci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfc2Vuc29yLmgKQEAgLTQ5LDIzICs0OSwyMSBAQAogCS8qIFdoYXQgaTJjIGFkZHJlc3MgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQgdG8gKi8KIAl1OCBpMmNfc2xhdmVfaWQ7CiAKKwkvKiBXaWR0aCBvZiBlYWNoIGkyYyByZWdpc3RlciAoaW4gYnl0ZXMpICovCisJdTggaTJjX3JlZ1c7CisKIAkvKiBQcm9iZXMgaWYgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQgKi8KIAlpbnQgKCpwcm9iZSkoc3RydWN0IHNkICpzZCk7CiAKIAkvKiBQZXJmb3JtcyBhIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlICovCiAJaW50ICgqaW5pdCkoc3RydWN0IHNkICpzZCk7CiAKKwkvKiBFeGVjdXRlZCB3aGVuIHRoZSBjYW1lcmEgc3RhcnRzIHRvIHNlbmQgZGF0YSAqLworCWludCAoKnN0YXJ0KShzdHJ1Y3Qgc2QgKnNkKTsKKwogCS8qIFBlcmZvcm1zIGEgcG93ZXIgZG93biBzZXF1ZW5jZSAqLwogCWludCAoKnBvd2VyX2Rvd24pKHN0cnVjdCBzZCAqc2QpOwogCi0JLyogUmVhZHMgYSBzZW5zb3IgcmVnaXN0ZXIgKi8KLQlpbnQgKCpyZWFkX3NlbnNvcikoc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKLQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7Ci0KLQkvKiBXcml0ZXMgdG8gYSBzZW5zb3IgcmVnaXN0ZXIgKi8KLQlpbnQgKCp3cml0ZV9zZW5zb3IpKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCi0JICAgICAgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOwotCiAJaW50IG5jdHJsczsKIAlzdHJ1Y3QgY3RybCBjdHJsc1tNNTYwMl9NQVhfQ1RSTFNdOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCmluZGV4IDI3N2NhMzQuLjNkMjA5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDMyMCwKIAkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDMgLyA4ICsgNTg5LApAQCAtMTIzLDcgKzEyMyw3IEBACiAJY2FtID0gJmdzcGNhX2Rldi0+Y2FtOwogCWNhbS0+ZXBhZGRyID0gMHgwMTsKIAljYW0tPmNhbV9tb2RlID0gdmdhX21vZGU7Ci0JY2FtLT5ubW9kZXMgPSBzaXplb2YgdmdhX21vZGUgLyBzaXplb2YgdmdhX21vZGVbMF07CisJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKHZnYV9tb2RlKTsKIAlzZC0+cWluZGV4ID0gMTsJCQkvKiBzZXQgdGhlIHF1YW50aXphdGlvbiB0YWJsZSAqLwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IGNhNjcxMTkuLmVlMjMyOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTMsNyArMywxOCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBKZWFuLUZyYW5jb2lzIE1vaW5lIChodHRwOi8vbW9pbmVqZi5mcmVlLmZyKQogICoKLSAqIChUaGlzIG1vZHVsZSBpcyBhZGFwdGVkIGZyb20gdGhlIG92NTF4LWpwZWcgcGFja2FnZSkKKyAqIFRoaXMgbW9kdWxlIGlzIGFkYXB0ZWQgZnJvbSB0aGUgb3Y1MXgtanBlZyBwYWNrYWdlLCB3aGljaCBpdHNlbGYKKyAqIHdhcyBhZGFwdGVkIGZyb20gdGhlIG92NTExIGRyaXZlci4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9yIHRoZSBvdjUxMSBkcml2ZXIgaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTWFyayBXLiBNY0NsZWxsYW5kCisgKiBTdXBwb3J0IGZvciBPVjUxOSwgT1Y4NjEwIENvcHlyaWdodCAoYykgMjAwMyBKb2VyZyBIZWNrZW5iYWNoCisgKgorICogb3Y1MXgtanBlZyBvcmlnaW5hbCBjb3B5cmlnaHQgaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgUm9tYWluIEJlYXV4aXMgPHRvb3RzQHJhc3RhZ2Vla3Mub3JnPgorICogU3VwcG9ydCBmb3IgT1Y3NjcwIHNlbnNvcnMgd2FzIGNvbnRyaWJ1dGVkIGJ5IFNhbSBTa2lwc2V5IDxhb2FubGFAeWFob28uY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDAsMjIgKzUxLDE4IEBACiAJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CQkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCiAKIAkvKiBEZXRlcm1pbmVkIGJ5IHNlbnNvciB0eXBlICovCi0JY2hhciBzaWY7CisJX191OCBzaWY7CiAKLQl1bnNpZ25lZCBjaGFyIHByaW1hcnlfaTJjX3NsYXZlOwkvKiBJMkMgd3JpdGUgaWQgb2Ygc2Vuc29yICovCi0KLQl1bnNpZ25lZCBjaGFyIGJyaWdodG5lc3M7Ci0JdW5zaWduZWQgY2hhciBjb250cmFzdDsKLQl1bnNpZ25lZCBjaGFyIGNvbG9yczsKKwlfX3U4IGJyaWdodG5lc3M7CisJX191OCBjb250cmFzdDsKKwlfX3U4IGNvbG9yczsKIAlfX3U4IGhmbGlwOwogCV9fdTggdmZsaXA7CiAKLQljaGFyIGNvbXByZXNzOwkJLyogU2hvdWxkIHRoZSBuZXh0IGZyYW1lIGJlIGNvbXByZXNzZWQ/ICovCi0JY2hhciBjb21wcmVzc19pbml0ZWQ7CS8qIEFyZSBjb21wcmVzc2lvbiBwYXJhbXMgdXBsb2FkZWQ/ICovCi0JY2hhciBzdG9wcGVkOwkJLyogU3RyZWFtaW5nIGlzIHRlbXBvcmFyaWx5IHBhdXNlZCAqLworCV9fdTggc3RvcHBlZDsJCS8qIFN0cmVhbWluZyBpcyB0ZW1wb3JhcmlseSBwYXVzZWQgKi8KIAotCWNoYXIgZnJhbWVfcmF0ZTsJLyogY3VycmVudCBGcmFtZXJhdGUgKE9WNTE5IG9ubHkpICovCi0JY2hhciBjbG9ja2RpdjsJCS8qIGNsb2NrZGl2IG92ZXJyaWRlIGZvciBPVjUxOSBvbmx5ICovCisJX191OCBmcmFtZV9yYXRlOwkvKiBjdXJyZW50IEZyYW1lcmF0ZSAoT1Y1MTkgb25seSkgKi8KKwlfX3U4IGNsb2NrZGl2OwkJLyogY2xvY2tkaXYgb3ZlcnJpZGUgZm9yIE9WNTE5IG9ubHkgKi8KIAogCWNoYXIgc2Vuc29yOwkJLyogVHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAoU0VOXyopICovCiAjZGVmaW5lIFNFTl9VTktOT1dOIDAKQEAgLTY3LDcgKzc0LDYgQEAKICNkZWZpbmUgU0VOX09WNzY3MCA2CiAjZGVmaW5lIFNFTl9PVjc2QkUgNwogI2RlZmluZSBTRU5fT1Y4NjEwIDgKLQogfTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwpAQCAtMTU4LDcgKzE2NCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDMyMCwKIAkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDMgLyA4ICsgNTkwLApAQCAtMTcwLDcgKzE3Niw3IEBACiAJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCiAJCS5wcml2ID0gMH0sCiB9Owotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CiAJezE3NiwgMTQ0LCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTc2LAogCQkuc2l6ZWltYWdlID0gMTc2ICogMTQ0ICogMyAvIDggKyA1OTAsCkBAIC0xODQsMTUgKzE5MCwxNSBAQAogfTsKIAogLyogT1Y1MTkgQ2FtZXJhIGludGVyZmFjZSByZWdpc3RlciBudW1iZXJzICovCi0jZGVmaW5lIE9WNTE5X0NBTV9IX1NJWkUJCTB4MTAKLSNkZWZpbmUgT1Y1MTlfQ0FNX1ZfU0laRQkJMHgxMQotI2RlZmluZSBPVjUxOV9DQU1fWF9PRkZTRVRMCQkweDEyCi0jZGVmaW5lIE9WNTE5X0NBTV9YX09GRlNFVEgJCTB4MTMKLSNkZWZpbmUgT1Y1MTlfQ0FNX1lfT0ZGU0VUTAkJMHgxNAotI2RlZmluZSBPVjUxOV9DQU1fWV9PRkZTRVRICQkweDE1Ci0jZGVmaW5lIE9WNTE5X0NBTV9ESVZJREVSCQkweDE2Ci0jZGVmaW5lIE9WNTE5X0NBTV9ERlIJCQkweDIwCi0jZGVmaW5lIE9WNTE5X0NBTV9GT1JNQVQJCTB4MjUKKyNkZWZpbmUgT1Y1MTlfUjEwX0hfU0laRQkJMHgxMAorI2RlZmluZSBPVjUxOV9SMTFfVl9TSVpFCQkweDExCisjZGVmaW5lIE9WNTE5X1IxMl9YX09GRlNFVEwJCTB4MTIKKyNkZWZpbmUgT1Y1MTlfUjEzX1hfT0ZGU0VUSAkJMHgxMworI2RlZmluZSBPVjUxOV9SMTRfWV9PRkZTRVRMCQkweDE0CisjZGVmaW5lIE9WNTE5X1IxNV9ZX09GRlNFVEgJCTB4MTUKKyNkZWZpbmUgT1Y1MTlfUjE2X0RJVklERVIJCTB4MTYKKyNkZWZpbmUgT1Y1MTlfUjIwX0RGUgkJCTB4MjAKKyNkZWZpbmUgT1Y1MTlfUjI1X0ZPUk1BVAkJMHgyNQogCiAvKiBPVjUxOSBTeXN0ZW0gQ29udHJvbGxlciByZWdpc3RlciBudW1iZXJzICovCiAjZGVmaW5lIE9WNTE5X1NZU19SRVNFVDEgMHg1MQpAQCAtNTYyLDggKzU2OCw4IEBACiAJeyBPVjc2NzBfUkVHX1ZTVE9QLCAweDdhIH0sCiAJeyBPVjc2NzBfUkVHX1ZSRUYsIDB4MGEgfSwKIAotCXsgT1Y3NjcwX1JFR19DT00zLCAwIH0sCi0JeyBPVjc2NzBfUkVHX0NPTTE0LCAwIH0sCisJeyBPVjc2NzBfUkVHX0NPTTMsIDB4MDAgfSwKKwl7IE9WNzY3MF9SRUdfQ09NMTQsIDB4MDAgfSwKIC8qIE15c3Rlcnkgc2NhbGluZyBudW1iZXJzICovCiAJeyAweDcwLCAweDNhIH0sCiAJeyAweDcxLCAweDM1IH0sCkBAIC01OTUsOCArNjAxLDggQEAKIAl7IE9WNzY3MF9SRUdfQ09NOCwgT1Y3NjcwX0NPTThfRkFTVEFFQwogCQkJIHwgT1Y3NjcwX0NPTThfQUVDU1RFUAogCQkJIHwgT1Y3NjcwX0NPTThfQkZJTFQgfSwKLQl7IE9WNzY3MF9SRUdfR0FJTiwgMCB9LAotCXsgT1Y3NjcwX1JFR19BRUNILCAwIH0sCisJeyBPVjc2NzBfUkVHX0dBSU4sIDB4MDAgfSwKKwl7IE9WNzY3MF9SRUdfQUVDSCwgMHgwMCB9LAogCXsgT1Y3NjcwX1JFR19DT000LCAweDQwIH0sIC8qIG1hZ2ljIHJlc2VydmVkIGJpdCAqLwogCXsgT1Y3NjcwX1JFR19DT005LCAweDE4IH0sIC8qIDR4IGdhaW4gKyBtYWdpYyByc3ZkIGJpdCAqLwogCXsgT1Y3NjcwX1JFR19CRDUwTUFYLCAweDA1IH0sCkBAIC02MzQsMTYgKzY0MCwxNiBAQAogCXsgT1Y3NjcwX1JFR19DT00xMiwgMHg3OCB9LAogCXsgMHg0ZCwgMHg0MCB9LAogCXsgMHg0ZSwgMHgyMCB9LAotCXsgT1Y3NjcwX1JFR19HRklYLCAwIH0sCisJeyBPVjc2NzBfUkVHX0dGSVgsIDB4MDAgfSwKIAl7IDB4NmIsIDB4NGEgfSwKIAl7IDB4NzQsIDB4MTAgfSwKIAl7IDB4OGQsIDB4NGYgfSwKLQl7IDB4OGUsIDAgfSwKLQl7IDB4OGYsIDAgfSwKLQl7IDB4OTAsIDAgfSwKLQl7IDB4OTEsIDAgfSwKLQl7IDB4OTYsIDAgfSwKLQl7IDB4OWEsIDAgfSwKKwl7IDB4OGUsIDB4MDAgfSwKKwl7IDB4OGYsIDB4MDAgfSwKKwl7IDB4OTAsIDB4MDAgfSwKKwl7IDB4OTEsIDB4MDAgfSwKKwl7IDB4OTYsIDB4MDAgfSwKKwl7IDB4OWEsIDB4MDAgfSwKIAl7IDB4YjAsIDB4ODQgfSwKIAl7IDB4YjEsIDB4MGMgfSwKIAl7IDB4YjIsIDB4MGUgfSwKQEAgLTY4MSwxNyArNjg3LDE3IEBACiAvKiBNYXRyaXggY29lZmZpY2llbnRzICovCiAJeyAweDRmLCAweDgwIH0sCiAJeyAweDUwLCAweDgwIH0sCi0JeyAweDUxLCAwIH0sCisJeyAweDUxLCAweDAwIH0sCiAJeyAweDUyLCAweDIyIH0sCiAJeyAweDUzLCAweDVlIH0sCiAJeyAweDU0LCAweDgwIH0sCiAJeyAweDU4LCAweDllIH0sCiAKIAl7IE9WNzY3MF9SRUdfQ09NMTYsIE9WNzY3MF9DT00xNl9BV0JHQUlOIH0sCi0JeyBPVjc2NzBfUkVHX0VER0UsIDAgfSwKKwl7IE9WNzY3MF9SRUdfRURHRSwgMHgwMCB9LAogCXsgMHg3NSwgMHgwNSB9LAogCXsgMHg3NiwgMHhlMSB9LAotCXsgMHg0YywgMCB9LAorCXsgMHg0YywgMHgwMCB9LAogCXsgMHg3NywgMHgwMSB9LAogCXsgT1Y3NjcwX1JFR19DT00xMywgT1Y3NjcwX0NPTTEzX0dBTU1BCiAJCQkgIHwgT1Y3NjcwX0NPTTEzX1VWU0FUCkBAIC03MDQsNyArNzEwLDcgQEAKIAl7IDB4MzQsIDB4MTEgfSwKIAl7IE9WNzY3MF9SRUdfQ09NMTEsIE9WNzY3MF9DT00xMV9FWFB8T1Y3NjcwX0NPTTExX0haQVVUTyB9LAogCXsgMHhhNCwgMHg4OCB9LAotCXsgMHg5NiwgMCB9LAorCXsgMHg5NiwgMHgwMCB9LAogCXsgMHg5NywgMHgzMCB9LAogCXsgMHg5OCwgMHgyMCB9LAogCXsgMHg5OSwgMHgzMCB9LApAQCAtOTQyLDExICs5NDgsMTEgQEAKIAogCS8qIEluaXRpYXRlIDMtYnl0ZSB3cml0ZSBjeWNsZSAqLwogCXJjID0gcmVnX3coc2QsIFI1MThfSTJDX0NUTCwgMHgwMSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOwogCiAJLyogd2FpdCBmb3Igd3JpdGUgY29tcGxldGUgKi8KIAltc2xlZXAoNCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwogCXJldHVybiByZWdfcjgoc2QsIFI1MThfSTJDX0NUTCk7CiB9CiAKQEAgLTEwMjksNyArMTAzNSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaW5pdF9vdl9zZW5zb3Ioc3RydWN0IHNkICpzZCkKIHsKLQlpbnQgaSwgc3VjY2VzczsKKwlpbnQgaTsKIAogCS8qIFJlc2V0IHRoZSBzZW5zb3IgKi8KIAlpZiAoaTJjX3coc2QsIDB4MTIsIDB4ODApIDwgMCkKQEAgLTEwMzgsMTEgKzEwNDQsMTEgQEAKIAkvKiBXYWl0IGZvciBpdCB0byBpbml0aWFsaXplICovCiAJbXNsZWVwKDE1MCk7CiAKLQlmb3IgKGkgPSAwLCBzdWNjZXNzID0gMDsgaSA8IGkyY19kZXRlY3RfdHJpZXMgJiYgIXN1Y2Nlc3M7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpMmNfZGV0ZWN0X3RyaWVzOyBpKyspIHsKIAkJaWYgKGkyY19yKHNkLCBPVjc2MTBfUkVHX0lEX0hJR0gpID09IDB4N2YgJiYKIAkJICAgIGkyY19yKHNkLCBPVjc2MTBfUkVHX0lEX0xPVykgPT0gMHhhMikgewotCQkJc3VjY2VzcyA9IDE7Ci0JCQljb250aW51ZTsKKwkJCVBERUJVRyhEX1BST0JFLCAiSTJDIHN5bmNlZCBpbiAlZCBhdHRlbXB0KHMpIiwgaSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCiAJCS8qIFJlc2V0IHRoZSBzZW5zb3IgKi8KQEAgLTEwNTQsMTAgKzEwNjAsNyBAQAogCQlpZiAoaTJjX3Ioc2QsIDB4MDApIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCX0KLQlpZiAoIXN1Y2Nlc3MpCi0JCXJldHVybiAtRUlPOwotCVBERUJVRyhEX1BST0JFLCAiSTJDIHN5bmNlZCBpbiAlZCBhdHRlbXB0KHMpIiwgaSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU87CiB9CiAKIC8qIFNldCB0aGUgcmVhZCBhbmQgd3JpdGUgc2xhdmUgSURzLiBUaGUgInNsYXZlIiBhcmd1bWVudCBpcyB0aGUgd3JpdGUgc2xhdmUsCkBAIC0xMDczLDcgKzEwNzYsNiBAQAogCXJjID0gcmVnX3coc2QsIFI1MXhfSTJDX1dfU0lELCBzbGF2ZSk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwotCXNkLT5wcmltYXJ5X2kyY19zbGF2ZSA9IHNsYXZlOwogCXJldHVybiByZWdfdyhzZCwgUjUxeF9JMkNfUl9TSUQsIHNsYXZlICsgMSk7CiB9CiAKQEAgLTEyODUsNyArMTI4Nyw2IEBACiAvKiBUdXJucyBvbiBvciBvZmYgdGhlIExFRC4gT25seSBoYXMgYW4gZWZmZWN0IHdpdGggT1Y1MTErL09WNTE4KCspL09WNTE5ICovCiBzdGF0aWMgdm9pZCBvdjUxeF9sZWRfY29udHJvbChzdHJ1Y3Qgc2QgKnNkLCBpbnQgb24pCiB7Ci0vKglQREVCVUcoRF9TVFJFQU0sICJMRUQgKCVzKSIsIG9uID8gIm9uIiA6ICJvZmYiKTsgKi8KIAlyZWdfd19tYXNrKHNkLCBPVjUxOV9HUElPX0RBVEFfT1VUMCwgIW9uLCAxKTsJLyogMCAvIDEgKi8KIH0KIApAQCAtMTM1Miw3ICsxMzUzLDcgQEAKIAkJCX0KIAkJCWlmIChvdjh4eDBfY29uZmlndXJlKHNkKSA8IDApIHsKIAkJCQlQREVCVUcoRF9FUlIsCi0JCQkJICAgIkZhaWxlZCB0byBjb25maWd1cmUgT1Y4eHgwIHNlbnNvciIpOworCQkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjh4eDAgc2Vuc29yIik7CiAJCQkJZ290byBlcnJvcjsKIAkJCX0KIAkJfQpAQCAtMTQ4Miw3ICsxNDgzLDcgQEAKIAkJCXJldHVybiAtRUlPOwogCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5fT1Y3NjQwKSB7CiAJCQkvKiBTZWxlY3QgOC1iaXQgaW5wdXQgbW9kZSAqLwotCQkJcmVnX3dfbWFzayhzZCwgT1Y1MTlfQ0FNX0RGUiwgMHgxMCwgMHgxMCk7CisJCQlyZWdfd19tYXNrKHNkLCBPVjUxOV9SMjBfREZSLCAweDEwLCAweDEwKTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmICh3cml0ZV9yZWd2YWxzKHNkLCBtb2RlX2luaXRfNTE5X292NzY3MCwKQEAgLTE0OTAsMTQgKzE0OTEsMTQgQEAKIAkJCXJldHVybiAtRUlPOwogCX0KIAotCXJlZ193KHNkLCBPVjUxOV9DQU1fSF9TSVpFLAlzZC0+Z3NwY2FfZGV2LndpZHRoID4+IDQpOwotCXJlZ193KHNkLCBPVjUxOV9DQU1fVl9TSVpFLAlzZC0+Z3NwY2FfZGV2LmhlaWdodCA+PiAzKTsKLQlyZWdfdyhzZCwgT1Y1MTlfQ0FNX1hfT0ZGU0VUTCwJMHgwMCk7Ci0JcmVnX3coc2QsIE9WNTE5X0NBTV9YX09GRlNFVEgsCTB4MDApOwotCXJlZ193KHNkLCBPVjUxOV9DQU1fWV9PRkZTRVRMLAkweDAwKTsKLQlyZWdfdyhzZCwgT1Y1MTlfQ0FNX1lfT0ZGU0VUSCwJMHgwMCk7Ci0JcmVnX3coc2QsIE9WNTE5X0NBTV9ESVZJREVSLAkweDAwKTsKLQlyZWdfdyhzZCwgT1Y1MTlfQ0FNX0ZPUk1BVCwJMHgwMyk7IC8qIFlVVjQyMiAqLworCXJlZ193KHNkLCBPVjUxOV9SMTBfSF9TSVpFLAlzZC0+Z3NwY2FfZGV2LndpZHRoID4+IDQpOworCXJlZ193KHNkLCBPVjUxOV9SMTFfVl9TSVpFLAlzZC0+Z3NwY2FfZGV2LmhlaWdodCA+PiAzKTsKKwlyZWdfdyhzZCwgT1Y1MTlfUjEyX1hfT0ZGU0VUTCwJMHgwMCk7CisJcmVnX3coc2QsIE9WNTE5X1IxM19YX09GRlNFVEgsCTB4MDApOworCXJlZ193KHNkLCBPVjUxOV9SMTRfWV9PRkZTRVRMLAkweDAwKTsKKwlyZWdfdyhzZCwgT1Y1MTlfUjE1X1lfT0ZGU0VUSCwJMHgwMCk7CisJcmVnX3coc2QsIE9WNTE5X1IxNl9ESVZJREVSLAkweDAwKTsKKwlyZWdfdyhzZCwgT1Y1MTlfUjI1X0ZPUk1BVCwJMHgwMyk7IC8qIFlVVjQyMiAqLwogCXJlZ193KHNkLCAweDI2LAkJCTB4MDApOyAvKiBVbmRvY3VtZW50ZWQgKi8KIAogCS8qKioqKioqKiBTZXQgdGhlIGZyYW1lcmF0ZSAqKioqKioqKi8KQEAgLTE1MDksOCArMTUxMCw4IEBACiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5fT1Y3NjQwOgogCQlzd2l0Y2ggKHNkLT5mcmFtZV9yYXRlKSB7Ci0vKmZpeG1lOiBkZWZhdWx0IHdhcyAzMCBmcHMgKi8KLQkJY2FzZSAzMDoKKwkJZGVmYXVsdDoKKy8qCQljYXNlIDMwOiAqLwogCQkJcmVnX3coc2QsIDB4YTQsIDB4MGMpOwogCQkJcmVnX3coc2QsIDB4MjMsIDB4ZmYpOwogCQkJYnJlYWs7CkBAIC0xNTIyLDggKzE1MjMsNyBAQAogCQkJcmVnX3coc2QsIDB4YTQsIDB4MGMpOwogCQkJcmVnX3coc2QsIDB4MjMsIDB4MWIpOwogCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0vKgkJY2FzZSAxNTogKi8KKwkJY2FzZSAxNToKIAkJCXJlZ193KHNkLCAweGE0LCAweDA0KTsKIAkJCXJlZ193KHNkLCAweDIzLCAweGZmKTsKIAkJCXNkLT5jbG9ja2RpdiA9IDE7CkBAIC0xNTc2LDcgKzE1NzYsNiBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0xNjY3LDcgKzE2NjYsNyBAQAogCQkgKiB0aGUgZ2FpbiBvciB0aGUgY29udHJhc3QuIFRoZSAicmVzZXJ2ZWQiIGJpdHMgc2VlbQogCQkgKiB0byBoYXZlIHNvbWUgZWZmZWN0IGluIHRoaXMgY2FzZS4gKi8KIAkJaTJjX3coc2QsIDB4MmQsIDB4ODUpOwotCX0gZWxzZSBpZiAoc2QtPmNsb2NrZGl2ID49IDApIHsKKwl9IGVsc2UgewogCQlpMmNfdyhzZCwgMHgxMSwgc2QtPmNsb2NrZGl2KTsKIAl9CiAKQEAgLTE4NjksNyArMTg2OCw2IEBACiAJcmV0ID0gb3Y1MXhfcmVzdGFydChzZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwotCVBERUJVRyhEX1NUUkVBTSwgImNhbWVyYSBzdGFydGVkIGFsdDogMHglMDJ4IiwgZ3NwY2FfZGV2LT5hbHQpOwogCW92NTF4X2xlZF9jb250cm9sKHNkLCAxKTsKIAlyZXR1cm4gMDsKIG91dDoKQEAgLTE4NzksOCArMTg3NywxMCBAQAogCiBzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0Jb3Y1MXhfc3RvcCgoc3RydWN0IHNkICopIGdzcGNhX2Rldik7Ci0Jb3Y1MXhfbGVkX2NvbnRyb2woKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXYsIDApOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCW92NTF4X3N0b3Aoc2QpOworCW92NTF4X2xlZF9jb250cm9sKHNkLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LApAQCAtMTkzNSw5ICsxOTM1LDYgQEAKIAlpbnQgdmFsOwogCiAJdmFsID0gc2QtPmJyaWdodG5lc3M7Ci0JUERFQlVHKERfQ09ORiwgImJyaWdodG5lc3M6JWQiLCB2YWwpOwotLyoJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotICoJCW92NTF4X3N0b3Aoc2QpOyAqLwogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOX09WODYxMDoKIAljYXNlIFNFTl9PVjc2MTA6CkBAIC0xOTU5LDggKzE5NTYsNiBAQAogCQlpMmNfdyhzZCwgT1Y3NjcwX1JFR19CUklHSFQsIG92NzY3MF9hYnNfdG9fc20odmFsKSk7CiAJCWJyZWFrOwogCX0KLS8qCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLSAqCQlvdjUxeF9yZXN0YXJ0KHNkKTsgKi8KIH0KIAogc3RhdGljIHZvaWQgc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMTk2OSw5ICsxOTY0LDYgQEAKIAlpbnQgdmFsOwogCiAJdmFsID0gc2QtPmNvbnRyYXN0OwotCVBERUJVRyhEX0NPTkYsICJjb250cmFzdDolZCIsIHZhbCk7Ci0vKglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCW92NTF4X3N0b3Aoc2QpOyAqLwogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOX09WNzYxMDoKIAljYXNlIFNFTl9PVjY2MjA6CkBAIC0yMDA3LDggKzE5OTksNiBAQAogCQlpMmNfdyhzZCwgT1Y3NjcwX1JFR19DT05UUkFTLCB2YWwgPj4gMSk7CiAJCWJyZWFrOwogCX0KLS8qCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJb3Y1MXhfcmVzdGFydChzZCk7ICovCiB9CiAKIHN0YXRpYyB2b2lkIHNldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0yMDE3LDkgKzIwMDcsNiBAQAogCWludCB2YWw7CiAKIAl2YWwgPSBzZC0+Y29sb3JzOwotCVBERUJVRyhEX0NPTkYsICJzYXR1cmF0aW9uOiVkIiwgdmFsKTsKLS8qCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJb3Y1MXhfc3RvcChzZCk7ICovCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5fT1Y4NjEwOgogCWNhc2UgU0VOX09WNzYxMDoKQEAgLTIwNDQsOCArMjAzMSw2IEBACiAJCS8qIHNldCBSRUdfQ09NMTMgdmFsdWVzIGZvciBVViBzYXQgYXV0byBtb2RlICovCiAJCWJyZWFrOwogCX0KLS8qCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJb3Y1MXhfcmVzdGFydChzZCk7ICovCiB9CiAKIHN0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKQEAgLTIwNTMsNyArMjAzOCw4IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJc2QtPmJyaWdodG5lc3MgPSB2YWw7Ci0Jc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDcwLDcgKzIwNTYsOCBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT5jb250cmFzdCA9IHZhbDsKLQlzZXRjb250cmFzdChnc3BjYV9kZXYpOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA4Nyw3ICsyMDc0LDggQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKIAlzZC0+Y29sb3JzID0gdmFsOwotCXNldGNvbG9ycyhnc3BjYV9kZXYpOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0Y29sb3JzKGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMDQsNyArMjA5Miw4IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCiAJc2QtPmhmbGlwID0gdmFsOwotCXNldGh2ZmxpcChzZCk7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRodmZsaXAoc2QpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTIxLDcgKzIxMTAsOCBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT52ZmxpcCA9IHZhbDsKLQlzZXRodmZsaXAoc2QpOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0aHZmbGlwKHNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE2Miw3ICsyMTUyLDcgQEAKIAl7VVNCX0RFVklDRSgweDA1YTksIDB4ODUxOSl9LAogCXt9CiB9OwotI3VuZGVmIERWTkFNRQorCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKIAogLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYxNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jCkBAIC0wLDAgKzEsNjAxIEBACisvKgorICogb3Y1MzQvb3Y3NzJ4IGdzcGNhIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFudG9uaW8gT3NwaXRlIDxvc3BpdGVAc3R1ZGVudGkudW5pbmEuaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmltIFBhcmlzIDxqaW1AanRhbi5jb20+CisgKgorICogQmFzZWQgb24gYSBwcm90b3R5cGUgd3JpdHRlbiBieSBNYXJrIEZlcnJlbGwgPG1ham9ydHJpcHNAZ21haWwuY29tPgorICogVVNCIHByb3RvY29sIHJldmVyc2UgZW5naW5lZXJlZCBieSBKaW0gUGFyaXMgPGppbUBqdGFuLmNvbT4KKyAqIGh0dHBzOi8vamltLnNoL3N2bi9qaW0vZGV2bC9wbGF5c3RhdGlvbi9wczMvZXllL3Rlc3QvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjZGVmaW5lIE1PRFVMRV9OQU1FICJvdjUzNCIKKworI2luY2x1ZGUgImdzcGNhLmgiCisKKyNkZWZpbmUgT1Y1MzRfUkVHX0FERFJFU1MJMHhmMQkvKiA/ICovCisjZGVmaW5lIE9WNTM0X1JFR19TVUJBRERSCTB4ZjIKKyNkZWZpbmUgT1Y1MzRfUkVHX1dSSVRFCQkweGYzCisjZGVmaW5lIE9WNTM0X1JFR19SRUFECQkweGY0CisjZGVmaW5lIE9WNTM0X1JFR19PUEVSQVRJT04JMHhmNQorI2RlZmluZSBPVjUzNF9SRUdfU1RBVFVTCTB4ZjYKKworI2RlZmluZSBPVjUzNF9PUF9XUklURV8zCTB4MzcKKyNkZWZpbmUgT1Y1MzRfT1BfV1JJVEVfMgkweDMzCisjZGVmaW5lIE9WNTM0X09QX1JFQURfMgkJMHhmOQorCisjZGVmaW5lIENUUkxfVElNRU9VVCA1MDAKKworTU9EVUxFX0FVVEhPUigiQW50b25pbyBPc3BpdGUgPG9zcGl0ZUBzdHVkZW50aS51bmluYS5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EvT1Y1MzQgVVNCIENhbWVyYSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzZCB7CisJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KKwlfX3UzMiBsYXN0X2ZpZDsKKwlfX3UzMiBsYXN0X3B0czsKKwlpbnQgZnJhbWVfcmF0ZTsKK307CisKKy8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0geworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9ZVVlWLCBWNEwyX0ZJRUxEX05PTkUsCisJIC5ieXRlc3BlcmxpbmUgPSA2NDAgKiAyLAorCSAuc2l6ZWltYWdlID0gNjQwICogNDgwICogMiwKKwkgLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkgLnByaXYgPSAwfSwKK307CisKK3N0YXRpYyB2b2lkIG92NTM0X3JlZ193cml0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiByZWcsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGdzcGNhX2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlQREVCVUcoRF9VU0JPLCAicmVnPTB4JTA0eCwgdmFsPTAlMDJ4IiwgcmVnLCB2YWwpOworCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IHZhbDsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwKKwkJCSAgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgIDB4MSwKKwkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIDB4MCwgcmVnLCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCVBERUJVRyhEX0VSUiwgIndyaXRlIGZhaWxlZCIpOworfQorCitzdGF0aWMgdTggb3Y1MzRfcmVnX3JlYWQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgcmVnKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAorCQkJICAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgMHgxLAorCQkJICAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICAweDAsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBDVFJMX1RJTUVPVVQpOworCVBERUJVRyhEX1VTQkksICJyZWc9MHglMDR4LCBkYXRhPTB4JTAyeCIsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJUERFQlVHKERfRVJSLCAicmVhZCBmYWlsZWQiKTsKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworfQorCisvKiBUd28gYml0cyBjb250cm9sIExFRDogMHgyMSBiaXQgNyBhbmQgMHgyMyBiaXQgNy4KKyAqIChkaXJlY3Rpb24gYW5kIG91dHB1dCk/ICovCitzdGF0aWMgdm9pZCBvdjUzNF9zZXRfbGVkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgaW50IHN0YXR1cykKK3sKKwl1OCBkYXRhOworCisJUERFQlVHKERfQ09ORiwgImxlZCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKworCWRhdGEgPSBvdjUzNF9yZWdfcmVhZChnc3BjYV9kZXYsIDB4MjEpOworCWRhdGEgfD0gMHg4MDsKKwlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDIxLCBkYXRhKTsKKworCWRhdGEgPSBvdjUzNF9yZWdfcmVhZChnc3BjYV9kZXYsIDB4MjMpOworCWlmIChzdGF0dXMpCisJCWRhdGEgfD0gMHg4MDsKKwllbHNlCisJCWRhdGEgJj0gfigweDgwKTsKKworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MjMsIGRhdGEpOworfQorCitzdGF0aWMgaW50IHNjY2JfY2hlY2tfc3RhdHVzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwl1OCBkYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlkYXRhID0gb3Y1MzRfcmVnX3JlYWQoZ3NwY2FfZGV2LCBPVjUzNF9SRUdfU1RBVFVTKTsKKworCQlzd2l0Y2ggKGRhdGEpIHsKKwkJY2FzZSAweDAwOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgMHgwNDoKKwkJCXJldHVybiAwOworCQljYXNlIDB4MDM6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBERUJVRyhEX0VSUiwgInNjY2Igc3RhdHVzIDB4JTAyeCwgYXR0ZW1wdCAlZC81IiwKKwkJCSAgICAgICBkYXRhLCBpICsgMSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjY2JfcmVnX3dyaXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHJlZywgdTggdmFsKQoreworCVBERUJVRyhEX1VTQk8sICJyZWc6IDB4JTA0eCwgdmFsOiAweCUwMngiLCByZWcsIHZhbCk7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1NVQkFERFIsIHJlZyk7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1dSSVRFLCB2YWwpOworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1dSSVRFXzMpOworCisJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQorCQlQREVCVUcoRF9FUlIsICJzY2NiX3JlZ193cml0ZSBmYWlsZWQiKTsKK30KKworI2lmZGVmIEdTUENBX0RFQlVHCitzdGF0aWMgdTggc2NjYl9yZWdfcmVhZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiByZWcpCit7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1NVQkFERFIsIHJlZyk7CisJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgT1Y1MzRfUkVHX09QRVJBVElPTiwgT1Y1MzRfT1BfV1JJVEVfMik7CisJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQorCQlQREVCVUcoRF9FUlIsICJzY2NiX3JlZ19yZWFkIGZhaWxlZCAxIik7CisKKwlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCBPVjUzNF9SRUdfT1BFUkFUSU9OLCBPVjUzNF9PUF9SRUFEXzIpOworCWlmICghc2NjYl9jaGVja19zdGF0dXMoZ3NwY2FfZGV2KSkKKwkJUERFQlVHKERfRVJSLCAic2NjYl9yZWdfcmVhZCBmYWlsZWQgMiIpOworCisJcmV0dXJuIG92NTM0X3JlZ19yZWFkKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1JFQUQpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBfX3U4IG92NTM0X3JlZ19pbml0ZGF0YVtdWzJdID0geworCXsgMHhlNywgMHgzYSB9LAorCisJeyBPVjUzNF9SRUdfQUREUkVTUywgMHg0MiB9LCAvKiBzZWxlY3QgT1Y3NzJ4IHNlbnNvciAqLworCisJeyAweGMyLCAweDBjIH0sCisJeyAweDg4LCAweGY4IH0sCisJeyAweGMzLCAweDY5IH0sCisJeyAweDg5LCAweGZmIH0sCisJeyAweDc2LCAweDAzIH0sCisJeyAweDkyLCAweDAxIH0sCisJeyAweDkzLCAweDE4IH0sCisJeyAweDk0LCAweDEwIH0sCisJeyAweDk1LCAweDEwIH0sCisJeyAweGUyLCAweDAwIH0sCisJeyAweGU3LCAweDNlIH0sCisKKwl7IDB4OTYsIDB4MDAgfSwKKworCXsgMHg5NywgMHgyMCB9LAorCXsgMHg5NywgMHgyMCB9LAorCXsgMHg5NywgMHgyMCB9LAorCXsgMHg5NywgMHgwYSB9LAorCXsgMHg5NywgMHgzZiB9LAorCXsgMHg5NywgMHg0YSB9LAorCXsgMHg5NywgMHgyMCB9LAorCXsgMHg5NywgMHgxNSB9LAorCXsgMHg5NywgMHgwYiB9LAorCisJeyAweDhlLCAweDQwIH0sCisJeyAweDFmLCAweDgxIH0sCisJeyAweDM0LCAweDA1IH0sCisJeyAweGUzLCAweDA0IH0sCisJeyAweDg4LCAweDAwIH0sCisJeyAweDg5LCAweDAwIH0sCisJeyAweDc2LCAweDAwIH0sCisJeyAweGU3LCAweDJlIH0sCisJeyAweDMxLCAweGY5IH0sCisJeyAweDI1LCAweDQyIH0sCisJeyAweDIxLCAweGYwIH0sCisKKwl7IDB4MWMsIDB4MDAgfSwKKwl7IDB4MWQsIDB4NDAgfSwKKwl7IDB4MWQsIDB4MDIgfSwgLyogcGF5bG9hZCBzaXplIDB4MDIwMCAqIDQgPSAyMDQ4IGJ5dGVzICovCisJeyAweDFkLCAweDAwIH0sIC8qIHBheWxvYWQgc2l6ZSAqLworCXsgMHgxZCwgMHgwMiB9LCAvKiBmcmFtZSBzaXplIDB4MDI1ODAwICogNCA9IDYxNDQwMCAqLworCXsgMHgxZCwgMHg1OCB9LCAvKiBmcmFtZSBzaXplICovCisJeyAweDFkLCAweDAwIH0sIC8qIGZyYW1lIHNpemUgKi8KKworCXsgMHgxYywgMHgwYSB9LAorCXsgMHgxZCwgMHgwOCB9LCAvKiB0dXJuIG9uIFVWQyBoZWFkZXIgKi8KKwl7IDB4MWQsIDB4MGUgfSwgLyogLi4gKi8KKworCXsgMHg4ZCwgMHgxYyB9LAorCXsgMHg4ZSwgMHg4MCB9LAorCXsgMHhlNSwgMHgwNCB9LAorCisJeyAweGMwLCAweDUwIH0sCisJeyAweGMxLCAweDNjIH0sCisJeyAweGMyLCAweDBjIH0sCit9OworCitzdGF0aWMgY29uc3QgX191OCBvdjc3MnhfcmVnX2luaXRkYXRhW11bMl0gPSB7CisJeyAweDEyLCAweDgwIH0sCisJeyAweDExLCAweDAxIH0sCisKKwl7IDB4M2QsIDB4MDMgfSwKKwl7IDB4MTcsIDB4MjYgfSwKKwl7IDB4MTgsIDB4YTAgfSwKKwl7IDB4MTksIDB4MDcgfSwKKwl7IDB4MWEsIDB4ZjAgfSwKKwl7IDB4MzIsIDB4MDAgfSwKKwl7IDB4MjksIDB4YTAgfSwKKwl7IDB4MmMsIDB4ZjAgfSwKKwl7IDB4NjUsIDB4MjAgfSwKKwl7IDB4MTEsIDB4MDEgfSwKKwl7IDB4NDIsIDB4N2YgfSwKKwl7IDB4NjMsIDB4ZTAgfSwKKwl7IDB4NjQsIDB4ZmYgfSwKKwl7IDB4NjYsIDB4MDAgfSwKKwl7IDB4MTMsIDB4ZjAgfSwKKwl7IDB4MGQsIDB4NDEgfSwKKwl7IDB4MGYsIDB4YzUgfSwKKwl7IDB4MTQsIDB4MTEgfSwKKworCXsgMHgyMiwgMHg3ZiB9LAorCXsgMHgyMywgMHgwMyB9LAorCXsgMHgyNCwgMHg0MCB9LAorCXsgMHgyNSwgMHgzMCB9LAorCXsgMHgyNiwgMHhhMSB9LAorCXsgMHgyYSwgMHgwMCB9LAorCXsgMHgyYiwgMHgwMCB9LAorCXsgMHg2YiwgMHhhYSB9LAorCXsgMHgxMywgMHhmZiB9LAorCisJeyAweDkwLCAweDA1IH0sCisJeyAweDkxLCAweDAxIH0sCisJeyAweDkyLCAweDAzIH0sCisJeyAweDkzLCAweDAwIH0sCisJeyAweDk0LCAweDYwIH0sCisJeyAweDk1LCAweDNjIH0sCisJeyAweDk2LCAweDI0IH0sCisJeyAweDk3LCAweDFlIH0sCisJeyAweDk4LCAweDYyIH0sCisJeyAweDk5LCAweDgwIH0sCisJeyAweDlhLCAweDFlIH0sCisJeyAweDliLCAweDA4IH0sCisJeyAweDljLCAweDIwIH0sCisJeyAweDllLCAweDgxIH0sCisKKwl7IDB4YTYsIDB4MDQgfSwKKwl7IDB4N2UsIDB4MGMgfSwKKwl7IDB4N2YsIDB4MTYgfSwKKwl7IDB4ODAsIDB4MmEgfSwKKwl7IDB4ODEsIDB4NGUgfSwKKwl7IDB4ODIsIDB4NjEgfSwKKwl7IDB4ODMsIDB4NmYgfSwKKwl7IDB4ODQsIDB4N2IgfSwKKwl7IDB4ODUsIDB4ODYgfSwKKwl7IDB4ODYsIDB4OGUgfSwKKwl7IDB4ODcsIDB4OTcgfSwKKwl7IDB4ODgsIDB4YTQgfSwKKwl7IDB4ODksIDB4YWYgfSwKKwl7IDB4OGEsIDB4YzUgfSwKKwl7IDB4OGIsIDB4ZDcgfSwKKwl7IDB4OGMsIDB4ZTggfSwKKwl7IDB4OGQsIDB4MjAgfSwKKworCXsgMHgwYywgMHg5MCB9LAorCisJeyAweDJiLCAweDAwIH0sCisJeyAweDIyLCAweDdmIH0sCisJeyAweDIzLCAweDAzIH0sCisJeyAweDExLCAweDAxIH0sCisJeyAweDBjLCAweGQwIH0sCisJeyAweDY0LCAweGZmIH0sCisJeyAweDBkLCAweDQxIH0sCisKKwl7IDB4MTQsIDB4NDEgfSwKKwl7IDB4MGUsIDB4Y2QgfSwKKwl7IDB4YWMsIDB4YmYgfSwKKwl7IDB4OGUsIDB4MDAgfSwKKwl7IDB4MGMsIDB4ZDAgfQorfTsKKworLyogc2V0IGZyYW1lcmF0ZSAqLworc3RhdGljIHZvaWQgb3Y1MzRfc2V0X2ZyYW1lX3JhdGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgZnIgPSBzZC0+ZnJhbWVfcmF0ZTsKKworCXN3aXRjaCAoZnIpIHsKKwljYXNlIDUwOgorCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MTEsIDB4MDEpOworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MGQsIDB4NDEpOworCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGU1LCAweDAyKTsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDExLCAweDAyKTsKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDBkLCAweGMxKTsKKwkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlNSwgMHgwNCk7CisJCWJyZWFrOworLyoJY2FzZSAzMDogKi8KKwlkZWZhdWx0OgorCQlmciA9IDMwOworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MTEsIDB4MDQpOworCQlzY2NiX3JlZ193cml0ZShnc3BjYV9kZXYsIDB4MGQsIDB4ODEpOworCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGU1LCAweDAyKTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDExLCAweDAzKTsKKwkJc2NjYl9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweDBkLCAweDQxKTsKKwkJb3Y1MzRfcmVnX3dyaXRlKGdzcGNhX2RldiwgMHhlNSwgMHgwNCk7CisJCWJyZWFrOworCX0KKworCXNkLT5mcmFtZV9yYXRlID0gZnI7CisJUERFQlVHKERfUFJPQkUsICJmcmFtZV9yYXRlOiAlZCIsIGZyKTsKK30KKworLyogc2V0dXAgbWV0aG9kICovCitzdGF0aWMgdm9pZCBvdjUzNF9zZXR1cChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJaW50IGk7CisKKwkvKiBJbml0aWFsaXplIGJyaWRnZSBjaGlwICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y1MzRfcmVnX2luaXRkYXRhKTsgaSsrKQorCQlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCBvdjUzNF9yZWdfaW5pdGRhdGFbaV1bMF0sCisJCQkJb3Y1MzRfcmVnX2luaXRkYXRhW2ldWzFdKTsKKworCVBERUJVRyhEX1BST0JFLCAic2Vuc29yIGlzIG92JTAyeCUwMngiLAorCQlzY2NiX3JlZ19yZWFkKGdzcGNhX2RldiwgMHgwYSksCisJCXNjY2JfcmVnX3JlYWQoZ3NwY2FfZGV2LCAweDBiKSk7CisKKwlvdjUzNF9zZXRfbGVkKGdzcGNhX2RldiwgMSk7CisKKwkvKiBJbml0aWFsaXplIHNlbnNvciAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92NzcyeF9yZWdfaW5pdGRhdGEpOyBpKyspCisJCXNjY2JfcmVnX3dyaXRlKGdzcGNhX2Rldiwgb3Y3NzJ4X3JlZ19pbml0ZGF0YVtpXVswXSwKKwkJCSAgICAgICBvdjc3MnhfcmVnX2luaXRkYXRhW2ldWzFdKTsKKworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDkpOworCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAwKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgdGltZSAqLworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgY2FtICpjYW07CisKKwljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisKKwljYW0tPmVwYWRkciA9IDB4MDE7CisJY2FtLT5jYW1fbW9kZSA9IHZnYV9tb2RlOworCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfbW9kZSk7CisKKwljYW0tPmJ1bGtfc2l6ZSA9IDE2Mzg0OworCWNhbS0+YnVsa19udXJicyA9IDI7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCW92NTM0X3NldHVwKGdzcGNhX2Rldik7CisJb3Y1MzRfc2V0X2ZyYW1lX3JhdGUoZ3NwY2FfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwkvKiBzdGFydCBzdHJlYW1pbmcgZGF0YSAqLworCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJLyogc3RvcCBzdHJlYW1pbmcgZGF0YSAqLworCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIDB4ZTAsIDB4MDkpOworCW92NTM0X3NldF9sZWQoZ3NwY2FfZGV2LCAwKTsKK30KKworLyogVmFsdWVzIGZvciBibUhlYWRlckluZm8gKFZpZGVvIGFuZCBTdGlsbCBJbWFnZSBQYXlsb2FkIEhlYWRlcnMsIDIuNC4zLjMpICovCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9ICSgxIDw8IDcpCisjZGVmaW5lIFVWQ19TVFJFQU1fRVJSCSgxIDw8IDYpCisjZGVmaW5lIFVWQ19TVFJFQU1fU1RJCSgxIDw8IDUpCisjZGVmaW5lIFVWQ19TVFJFQU1fUkVTCSgxIDw8IDQpCisjZGVmaW5lIFVWQ19TVFJFQU1fU0NSCSgxIDw8IDMpCisjZGVmaW5lIFVWQ19TVFJFQU1fUFRTCSgxIDw8IDIpCisjZGVmaW5lIFVWQ19TVFJFQU1fRU9GCSgxIDw8IDEpCisjZGVmaW5lIFVWQ19TVFJFQU1fRklECSgxIDw8IDApCisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldiwgc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwKKwkJCV9fdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCV9fdTMyIHRoaXNfcHRzOworCWludCB0aGlzX2ZpZDsKKwlpbnQgcmVtYWluaW5nX2xlbiA9IGxlbjsKKwlfX3U4ICpuZXh0X2RhdGEgPSBkYXRhOworCitzY2FuX25leHQ6CisJaWYgKHJlbWFpbmluZ19sZW4gPD0gMCkKKwkJcmV0dXJuOworCisJZGF0YSA9IG5leHRfZGF0YTsKKwlsZW4gPSBtaW4ocmVtYWluaW5nX2xlbiwgMjA0OCk7CisJcmVtYWluaW5nX2xlbiAtPSBsZW47CisJbmV4dF9kYXRhICs9IGxlbjsKKworCS8qIFBheWxvYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgVVZDLXN0eWxlIGhlYWRlci4gIFdlCisJICAgY29uc2lkZXIgYSBmcmFtZSB0byBzdGFydCB3aGVuIHRoZSBGSUQgdG9nZ2xlcywgb3IgdGhlIFBUUworCSAgIGNoYW5nZXMuICBBIGZyYW1lIGVuZHMgd2hlbiBFT0YgaXMgc2V0LCBhbmQgd2UndmUgcmVjZWl2ZWQKKwkgICB0aGUgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMuICovCisKKwkvKiBWZXJpZnkgVVZDIGhlYWRlci4gIEhlYWRlciBsZW5ndGggaXMgYWx3YXlzIDEyICovCisJaWYgKGRhdGFbMF0gIT0gMTIgfHwgbGVuIDwgMTIpIHsKKwkJUERFQlVHKERfUEFDSywgImJhZCBoZWFkZXIiKTsKKwkJZ290byBkaXNjYXJkOworCX0KKworCS8qIENoZWNrIGVycm9ycyAqLworCWlmIChkYXRhWzFdICYgVVZDX1NUUkVBTV9FUlIpIHsKKwkJUERFQlVHKERfUEFDSywgInBheWxvYWQgZXJyb3IiKTsKKwkJZ290byBkaXNjYXJkOworCX0KKworCS8qIEV4dHJhY3QgUFRTIGFuZCBGSUQgKi8KKwlpZiAoIShkYXRhWzFdICYgVVZDX1NUUkVBTV9QVFMpKSB7CisJCVBERUJVRyhEX1BBQ0ssICJQVFMgbm90IHByZXNlbnQiKTsKKwkJZ290byBkaXNjYXJkOworCX0KKwl0aGlzX3B0cyA9IChkYXRhWzVdIDw8IDI0KSB8IChkYXRhWzRdIDw8IDE2KSB8IChkYXRhWzNdIDw8IDgpIHwgZGF0YVsyXTsKKwl0aGlzX2ZpZCA9IChkYXRhWzFdICYgVVZDX1NUUkVBTV9GSUQpID8gMSA6IDA7CisKKwkvKiBJZiBQVFMgb3IgRklEIGhhcyBjaGFuZ2VkLCBzdGFydCBhIG5ldyBmcmFtZS4gKi8KKwlpZiAodGhpc19wdHMgIT0gc2QtPmxhc3RfcHRzIHx8IHRoaXNfZmlkICE9IHNkLT5sYXN0X2ZpZCkgeworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGZyYW1lLCBOVUxMLCAwKTsKKwkJc2QtPmxhc3RfcHRzID0gdGhpc19wdHM7CisJCXNkLT5sYXN0X2ZpZCA9IHRoaXNfZmlkOworCX0KKworCS8qIEFkZCB0aGUgZGF0YSBmcm9tIHRoaXMgcGF5bG9hZCAqLworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCQkJZGF0YSArIDEyLCBsZW4gLSAxMik7CisKKwkvKiBJZiB0aGlzIHBhY2tldCBpcyBtYXJrZWQgYXMgRU9GLCBlbmQgdGhlIGZyYW1lICovCisJaWYgKGRhdGFbMV0gJiBVVkNfU1RSRUFNX0VPRikgeworCQlzZC0+bGFzdF9wdHMgPSAwOworCisJCWlmICgoZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGEpICE9CisJCSAgICAoZ3NwY2FfZGV2LT53aWR0aCAqIGdzcGNhX2Rldi0+aGVpZ2h0ICogMikpIHsKKwkJCVBERUJVRyhEX1BBQ0ssICJzaG9ydCBmcmFtZSIpOworCQkJZ290byBkaXNjYXJkOworCQl9CisKKwkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGZyYW1lLCBOVUxMLCAwKTsKKwl9CisKKwkvKiBEb25lIHRoaXMgcGF5bG9hZCAqLworCWdvdG8gc2Nhbl9uZXh0OworCitkaXNjYXJkOgorCS8qIERpc2NhcmQgZGF0YSB1bnRpbCBhIG5ldyBmcmFtZSBzdGFydHMuICovCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRElTQ0FSRF9QQUNLRVQsIGZyYW1lLCBOVUxMLCAwKTsKKwlnb3RvIHNjYW5fbmV4dDsKK30KKworLyogZ2V0IHN0cmVhbSBwYXJhbWV0ZXJzIChmcmFtZXJhdGUpICovCitzdGF0aWMgaW50IHNkX2dldF9zdHJlYW1wYXJtKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSAqY3AgPSAmcGFybS0+cGFybS5jYXB0dXJlOworCXN0cnVjdCB2NGwyX2ZyYWN0ICp0cGYgPSAmY3AtPnRpbWVwZXJmcmFtZTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJY3AtPmNhcGFiaWxpdHkgfD0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXRwZi0+bnVtZXJhdG9yID0gMTsKKwl0cGYtPmRlbm9taW5hdG9yID0gc2QtPmZyYW1lX3JhdGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHN0cmVhbSBwYXJhbWV0ZXJzIChmcmFtZXJhdGUpICovCitzdGF0aWMgaW50IHNkX3NldF9zdHJlYW1wYXJtKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSAqY3AgPSAmcGFybS0+cGFybS5jYXB0dXJlOworCXN0cnVjdCB2NGwyX2ZyYWN0ICp0cGYgPSAmY3AtPnRpbWVwZXJmcmFtZTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU2V0IHJlcXVlc3RlZCBmcmFtZXJhdGUgKi8KKwlzZC0+ZnJhbWVfcmF0ZSA9IHRwZi0+ZGVub21pbmF0b3IgLyB0cGYtPm51bWVyYXRvcjsKKwlvdjUzNF9zZXRfZnJhbWVfcmF0ZShnc3BjYV9kZXYpOworCisJLyogUmV0dXJuIHRoZSBhY3R1YWwgZnJhbWVyYXRlICovCisJdHBmLT5udW1lcmF0b3IgPSAxOworCXRwZi0+ZGVub21pbmF0b3IgPSBzZC0+ZnJhbWVfcmF0ZTsKKworCXJldHVybiAwOworfQorCisvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKKwkubmFtZSAgICAgPSBNT0RVTEVfTkFNRSwKKwkuY3RybHMgICAgPSBzZF9jdHJscywKKwkubmN0cmxzICAgPSBBUlJBWV9TSVpFKHNkX2N0cmxzKSwKKwkuY29uZmlnICAgPSBzZF9jb25maWcsCisJLmluaXQgICAgID0gc2RfaW5pdCwKKwkuc3RhcnQgICAgPSBzZF9zdGFydCwKKwkuc3RvcE4gICAgPSBzZF9zdG9wTiwKKwkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKKwkuZ2V0X3N0cmVhbXBhcm0gPSBzZF9nZXRfc3RyZWFtcGFybSwKKwkuc2V0X3N0cmVhbXBhcm0gPSBzZF9zZXRfc3RyZWFtcGFybSwKK307CisKKy8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLworc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNmY4LCAweDMwMDIpfSwJLyogSGVyY3VsZXMgQmxvZyBXZWJjYW0gKi8KKwl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwMyl9LAkvKiBIZXJjdWxlcyBEdWFscGl4IEhEIFdlYmxvZyAqLworCXtVU0JfREVWSUNFKDB4MTQxNSwgMHgyMDAwKX0sCS8qIFNvbnkgSEQgRXllIGZvciBQUzMgKFNMRUggMDAyMDEpICovCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkZXZpY2VfdGFibGUpOworCisvKiAtLSBkZXZpY2UgY29ubmVjdCAtLSAqLworc3RhdGljIGludCBzZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBnc3BjYV9kZXZfcHJvYmUoaW50ZiwgaWQsICZzZF9kZXNjLCBzaXplb2Yoc3RydWN0IHNkKSwKKwkJCSAgICAgICBUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgPSBNT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgICA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgICAgICA9IHNkX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZ3NwY2FfZGlzY29ubmVjdCwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCAgICA9IGdzcGNhX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJaWYgKHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKSA8IDApCisJCXJldHVybiAtMTsKKwlQREVCVUcoRF9QUk9CRSwgInJlZ2lzdGVyZWQiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNkX21vZF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNkX2RyaXZlcik7CisJUERFQlVHKERfUFJPQkUsICJkZXJlZ2lzdGVyZWQiKTsKK30KKworbW9kdWxlX2luaXQoc2RfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoc2RfbW9kX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMKaW5kZXggMGIwYzU3My4uYzkwYWM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFBpeGFydCBQQUMyMDdCQ0EgbGlicmFyeQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBIYW5zIGRlIEdvZWRlIDxqLncuci5kZWdvZWRlQGhocy5ubD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBIYW5zIGRlIEdvZWRlIDxoZGdvZWRlQHJlZGhhdC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhvbWFzIEthaXNlciB0aG9tYXNAa2Fpc2VyLWxpbnV4LmxpCiAgKiBDb3B5bGVmdCAoQykgMjAwNSBNaWNoZWwgWGhhYXJkIG14aGFhcmRAbWFnaWMuZnIKICAqCkBAIC0yNyw3ICsyNyw3IEBACiAKICNpbmNsdWRlICJnc3BjYS5oIgogCi1NT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxqLncuci5kZWdvZWRlQGhocy5ubD4iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGhkZ29lZGVAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUGl4YXJ0IFBBQzIwNyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC0xNDksNyArMTQ5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CiAJezE3NiwgMTQ0LCBWNEwyX1BJWF9GTVRfUEFDMjA3LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAxNzYsCiAJCS5zaXplaW1hZ2UgPSAoMTc2ICsgMikgKiAxNDQsCkBAIC01MjksNiArNTI5LDcgQEAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0gewogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDI4KX0sCiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI0NjApfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjQ2MSl9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNDYzKX0sCiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI0NjQpfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjQ2OCl9LApAQCAtNTM2LDYgKzUzNyw3IEBACiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI0NzEpfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjQ3Mil9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNDc2KX0sCisJe1VTQl9ERVZJQ0UoMHgxNDVmLCAweDAxM2EpfSwKIAl7VVNCX0RFVklDRSgweDIwMDEsIDB4ZjExNSl9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYwppbmRleCBmYmQ0NWUyLi5hOWM5NWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMTEuYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1BKUEcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE2MCwKIAkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDMgLyA4ICsgNTkwLApAQCAtMTA2NCwxMCArMTA2NCwxMyBAQAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjA4KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjBlKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjBmKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMTF9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIwKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIxKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIyKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI0KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI2KSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJhKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJjKSwgLmRyaXZlcl9pbmZvID0gU0VOU09SX1BBQzczMDJ9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYwppbmRleCA2YzY5YmM3Li5iM2U0ZTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhiLmMKQEAgLTEzMiw4ICsxMzIsNiBAQAogICAgaWdub3JlIGF0bGVhc3QgdGhlIDIgbmV4dCBmcmFtZXMgZm9yIHRoZSBuZXcgc2V0dGluZ3MgdG8gY29tZSBpbnRvIGVmZmVjdAogICAgYmVmb3JlIGRvaW5nIGFueSBvdGhlciBhZGp1c3RtZW50cyAqLwogI2RlZmluZSBBVVRPR0FJTl9JR05PUkVfRlJBTUVTIDMKLSNkZWZpbmUgQVVUT0dBSU5fREVBRFpPTkUgMTAwMAotI2RlZmluZSBERVNJUkVEX0FWR19MVU0gNzAwMAogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpAQCAtMjI5LDcgKzIyNyw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTYwLAogCQkuc2l6ZWltYWdlID0gMTYwICogMTIwLApAQCAtMjUxLDcgKzI0OSw3IEBACiAJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJCS5wcml2ID0gMH0sCiB9Owotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CiAJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAxNjAsCiAJCS5zaXplaW1hZ2UgPSAxNjAgKiAxMjAsCkBAIC04MjcsMTggKzgyNSwyOSBAQAogCiBzdGF0aWMgdm9pZCBkb19hdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJaW50IGRlYWR6b25lLCBkZXNpcmVkX2F2Z19sdW07CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCWludCBhdmdfbHVtID0gYXRvbWljX3JlYWQoJnNkLT5hdmdfbHVtKTsKIAogCWlmIChhdmdfbHVtID09IC0xKQogCQlyZXR1cm47CiAKKwkvKiBTSUYgLyBWR0Egc2Vuc29ycyBoYXZlIGEgZGlmZmVyZW50IGF1dG9leHBvc3VyZSBhcmVhIGFuZCB0aHVzCisJICAgZGlmZmVyZW50IGF2Z19sdW0gdmFsdWVzIGZvciB0aGUgc2FtZSBwaWN0dXJlIGJyaWdodG5lc3MgKi8KKwlpZiAoc2Vuc29yX2RhdGFbc2QtPnNlbnNvcl0uZmxhZ3MgJiBGX1NJRikgeworCQlkZWFkem9uZSA9IDEwMDA7CisJCWRlc2lyZWRfYXZnX2x1bSA9IDcwMDA7CisJfSBlbHNlIHsKKwkJZGVhZHpvbmUgPSAzMDAwOworCQlkZXNpcmVkX2F2Z19sdW0gPSAyMzAwMDsKKwl9CisKIAlpZiAoc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPiAwKQogCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcy0tOwogCWVsc2UgaWYgKGdzcGNhX2F1dG9fZ2Fpbl9uX2V4cG9zdXJlKGdzcGNhX2RldiwgYXZnX2x1bSwKLQkJCXNkLT5icmlnaHRuZXNzICogREVTSVJFRF9BVkdfTFVNIC8gMTI3LAotCQkJQVVUT0dBSU5fREVBRFpPTkUsIEdBSU5fS05FRSwgRVhQT1NVUkVfS05FRSkpIHsKLQkJUERFQlVHKERfRlJBTSwgImF1dG9nYWluOiBnYWluIGNoYW5nZWQ6IGdhaW46ICVkIGV4cG86ICVkXG4iLAorCQkJc2QtPmJyaWdodG5lc3MgKiBkZXNpcmVkX2F2Z19sdW0gLyAxMjcsCisJCQlkZWFkem9uZSwgR0FJTl9LTkVFLCBFWFBPU1VSRV9LTkVFKSkgeworCQlQREVCVUcoRF9GUkFNLCAiYXV0b2dhaW46IGdhaW4gY2hhbmdlZDogZ2FpbjogJWQgZXhwbzogJWQiLAogCQkJKGludClzZC0+Z2FpbiwgKGludClzZC0+ZXhwb3N1cmUpOwogCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcyA9IEFVVE9HQUlOX0lHTk9SRV9GUkFNRVM7CiAJfQpAQCAtMTIyNiw4ICsxMjM1LDggQEAKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjAyNSksIFNCKFRBUzUxMzBDWFgsIDEwMil9LAogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDI4KSwgU0IoUEFTMjAyLCAxMDIpfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjAyOSksIFNCKFBBUzEwNiwgMTAyKX0sCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmMpLCBTQihPVjc2MzAsIDEwMil9LAogI2VuZGlmCisJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmMpLCBTQihPVjc2MzAsIDEwMil9LAogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJkKSwgU0IoSFY3MTMxUiwgMTAyKX0sCiAjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyICYmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMl9NT0RVTEUKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjAyZSksIFNCKE9WNzYzMCwgMTAyKX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwppbmRleCA1M2NiODJkLi4zMzczYjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlICJnc3BjYS5oIgogI2luY2x1ZGUgImpwZWcuaCIKIAorI2RlZmluZSBWNEwyX0NJRF9JTkZSQVJFRCAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMCkKKwogTU9EVUxFX0FVVEhPUigiTWljaGVsIFhoYWFyZCA8bXhoYWFyZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBL1NPTklYIEpQRUcgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTM1LDIzICszNywyNiBAQAogCWF0b21pY190IGF2Z19sdW07CiAJdW5zaWduZWQgaW50IGV4cG9zdXJlOwogCi0JdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKLQl1bnNpZ25lZCBjaGFyIGNvbnRyYXN0OwotCXVuc2lnbmVkIGNoYXIgY29sb3JzOwotCXVuc2lnbmVkIGNoYXIgYXV0b2dhaW47CisJX191MTYgYnJpZ2h0bmVzczsKKwlfX3U4IGNvbnRyYXN0OworCV9fdTggY29sb3JzOworCV9fdTggYXV0b2dhaW47CisJX191OCBibHVlOworCV9fdTggcmVkOwogCV9fdTggdmZsaXA7CQkJLyogb3Y3NjMwIG9ubHkgKi8KKwlfX3U4IGluZnJhcmVkOwkJCS8qIG1pMDM2MCBvbmx5ICovCiAKLQlzaWduZWQgY2hhciBhZ19jbnQ7CisJX19zOCBhZ19jbnQ7CiAjZGVmaW5lIEFHX0NOVF9TVEFSVCAxMwogCi0JY2hhciBxaW5kZXg7Ci0JdW5zaWduZWQgY2hhciBicmlkZ2U7CisJX191OCBxaW5kZXg7CisJX191OCBicmlkZ2U7CiAjZGVmaW5lIEJSSURHRV9TTjlDMTAyUCAwCiAjZGVmaW5lIEJSSURHRV9TTjlDMTA1IDEKICNkZWZpbmUgQlJJREdFX1NOOUMxMTAgMgogI2RlZmluZSBCUklER0VfU045QzEyMCAzCiAjZGVmaW5lIEJSSURHRV9TTjlDMzI1IDQKLQljaGFyIHNlbnNvcjsJCQkvKiBUeXBlIG9mIGltYWdlIHNlbnNvciBjaGlwICovCisJX191OCBzZW5zb3I7CQkJLyogVHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAqLwogI2RlZmluZSBTRU5TT1JfSFY3MTMxUiAwCiAjZGVmaW5lIFNFTlNPUl9NSTAzNjAgMQogI2RlZmluZSBTRU5TT1JfTU80MDAwIDIKQEAgLTU5LDcgKzY0LDcgQEAKICNkZWZpbmUgU0VOU09SX09WNzYzMCA0CiAjZGVmaW5lIFNFTlNPUl9PVjc2NDggNQogI2RlZmluZSBTRU5TT1JfT1Y3NjYwIDYKLQl1bnNpZ25lZCBjaGFyIGkyY19iYXNlOworCV9fdTggaTJjX2Jhc2U7CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCkBAIC02OSwxMCArNzQsMTYgQEAKIHN0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIHN0YXRpYyBpbnQgc2Rfc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGJsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGJsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRyZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldHJlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBzdGF0aWMgaW50IHNkX3NldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIHN0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogc3RhdGljIGludCBzZF9nZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRpbmZyYXJlZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldGluZnJhcmVkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0gewogCXsKQEAgLTg0LDcgKzk1LDcgQEAKICNkZWZpbmUgQlJJR0hUTkVTU19NQVggMHhmZmZmCiAJCS5tYXhpbXVtID0gQlJJR0hUTkVTU19NQVgsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgQlJJR0hUTkVTU19ERUYgMHg3ZmZmCisjZGVmaW5lIEJSSUdIVE5FU1NfREVGIDB4ODAwMAogCQkuZGVmYXVsdF92YWx1ZSA9IEJSSUdIVE5FU1NfREVGLAogCSAgICB9LAogCSAgICAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKQEAgLTExMSw3ICsxMjIsNyBAQAogCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCS5uYW1lICAgID0gIkNvbG9yIiwKIAkJLm1pbmltdW0gPSAwLAotCQkubWF4aW11bSA9IDY0LAorCQkubWF4aW11bSA9IDQwLAogCQkuc3RlcCAgICA9IDEsCiAjZGVmaW5lIENPTE9SX0RFRiAzMgogCQkuZGVmYXVsdF92YWx1ZSA9IENPTE9SX0RFRiwKQEAgLTExOSw3ICsxMzAsMzUgQEAKIAkgICAgLnNldCA9IHNkX3NldGNvbG9ycywKIAkgICAgLmdldCA9IHNkX2dldGNvbG9ycywKIAl9LAotI2RlZmluZSBBVVRPR0FJTl9JRFggMworCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCbHVlIEJhbGFuY2UiLAorCQkubWluaW11bSA9IDI0LAorCQkubWF4aW11bSA9IDQwLAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIEJMVUVfQkFMQU5DRV9ERUYgMzIKKwkJLmRlZmF1bHRfdmFsdWUgPSBCTFVFX0JBTEFOQ0VfREVGLAorCSAgICB9LAorCSAgICAuc2V0ID0gc2Rfc2V0Ymx1ZV9iYWxhbmNlLAorCSAgICAuZ2V0ID0gc2RfZ2V0Ymx1ZV9iYWxhbmNlLAorCX0sCisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiUmVkIEJhbGFuY2UiLAorCQkubWluaW11bSA9IDI0LAorCQkubWF4aW11bSA9IDQwLAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIFJFRF9CQUxBTkNFX0RFRiAzMgorCQkuZGVmYXVsdF92YWx1ZSA9IFJFRF9CQUxBTkNFX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldHJlZF9iYWxhbmNlLAorCSAgICAuZ2V0ID0gc2RfZ2V0cmVkX2JhbGFuY2UsCisJfSwKKyNkZWZpbmUgQVVUT0dBSU5fSURYIDUKIAl7CiAJICAgIHsKIAkJLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKQEAgLTEzNSw3ICsxNzQsNyBAQAogCSAgICAuZ2V0ID0gc2RfZ2V0YXV0b2dhaW4sCiAJfSwKIC8qIG92NzYzMCBvbmx5ICovCi0jZGVmaW5lIFZGTElQX0lEWCA0CisjZGVmaW5lIFZGTElQX0lEWCA2CiAJewogCSAgICB7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfVkZMSVAsCkBAIC0xNTAsOSArMTg5LDQzIEBACiAJICAgIC5zZXQgPSBzZF9zZXR2ZmxpcCwKIAkgICAgLmdldCA9IHNkX2dldHZmbGlwLAogCX0sCisvKiBtaTAzNjAgb25seSAqLworI2RlZmluZSBJTkZSQVJFRF9JRFggNworCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0lORlJBUkVELAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lICAgID0gIkluZnJhcmVkIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwICAgID0gMSwKKyNkZWZpbmUgSU5GUkFSRURfREVGIDAKKwkJLmRlZmF1bHRfdmFsdWUgPSBJTkZSQVJFRF9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRpbmZyYXJlZCwKKwkgICAgLmdldCA9IHNkX2dldGluZnJhcmVkLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0geworLyogdGFibGUgb2YgdGhlIGRpc2FibGVkIGNvbnRyb2xzICovCitzdGF0aWMgX191MzIgY3RybF9kaXNbXSA9IHsKKwkoMSA8PCBJTkZSQVJFRF9JRFgpIHwgKDEgPDwgVkZMSVBfSURYKSwKKwkJCQkJCS8qIFNFTlNPUl9IVjcxMzFSIDAgKi8KKwkoMSA8PCBWRkxJUF9JRFgpLAorCQkJCQkJLyogU0VOU09SX01JMDM2MCAxICovCisJKDEgPDwgSU5GUkFSRURfSURYKSB8ICgxIDw8IFZGTElQX0lEWCksCisJCQkJCQkvKiBTRU5TT1JfTU80MDAwIDIgKi8KKwkoMSA8PCBJTkZSQVJFRF9JRFgpIHwgKDEgPDwgVkZMSVBfSURYKSwKKwkJCQkJCS8qIFNFTlNPUl9PTTY4MDIgMyAqLworCSgxIDw8IEFVVE9HQUlOX0lEWCkgfCAoMSA8PCBJTkZSQVJFRF9JRFgpLAorCQkJCQkJLyogU0VOU09SX09WNzYzMCA0ICovCisJKDEgPDwgQVVUT0dBSU5fSURYKSB8ICgxIDw8IElORlJBUkVEX0lEWCkgfCAoMSA8PCBWRkxJUF9JRFgpLAorCQkJCQkJLyogU0VOU09SX09WNzY0OCA1ICovCisJKDEgPDwgQVVUT0dBSU5fSURYKSB8ICgxIDw8IElORlJBUkVEX0lEWCkgfCAoMSA8PCBWRkxJUF9JRFgpLAorCQkJCQkJLyogU0VOU09SX09WNzY2MCA2ICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE2MCwKIAkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDQgLyA4ICsgNTkwLApAQCAtMjMxLDEzICszMDQsMTMgQEAKIAogc3RhdGljIGNvbnN0IF9fdTggc25fb3Y3NjQ4W10gPSB7CiAvKglyZWcwCXJlZzEJcmVnMglyZWczCXJlZzQJcmVnNQlyZWc2CXJlZzcgKi8KLQkweDAwLAkweDIxLAkweDYyLAkweDAwLAkweDFhLAkweDIwLAkweDIwLAkweDIwLAorCTB4MDAsCTB4NjMsCTB4NDAsCTB4MDAsCTB4MWEsCTB4MjAsCTB4MjAsCTB4MjAsCiAvKglyZWc4CXJlZzkJcmVnYQlyZWdiCXJlZ2MJcmVnZAlyZWdlCXJlZ2YgKi8KLQkweGExLAkweDZlLAkweDE4LAkweDY1LAkweDAwLAkweDAwLAkweDAwLAkweDEwLAorCTB4ODEsCTB4MjEsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MTAsCiAvKglyZWcxMAlyZWcxMQlyZWcxMglyZWcxMwlyZWcxNAlyZWcxNQlyZWcxNglyZWcxNyAqLwotCTB4MDMsCTB4MDAsCTB4MDAsCTB4MDYsCTB4MDYsCTB4MjgsCTB4MWUsCTB4ODIsCisJMHgwMywJMHgwMCwJMHgwMCwJMHgwMSwJMHgwMCwJMHgyOCwJMHgxZSwJMHgwMCwKIC8qCXJlZzE4CXJlZzE5CXJlZzFhCXJlZzFiCXJlZzFjCXJlZzFkCXJlZzFlCXJlZzFmICovCi0JMHgwNywJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMCwJMHgwMAorCTB4MGIsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAsCTB4MDAKIH07CiAKIHN0YXRpYyBjb25zdCBfX3U4IHNuX292NzY2MFtdCT0gewpAQCAtNDY5LDYgKzU0Miw1MyBAQAogLyoJezB4YjEsIDB4MjEsIDB4MDEsIDB4ODgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MTB9LCAqLwogCXt9CiB9OworCitzdGF0aWMgY29uc3QgX191OCBvdjc2NDhfc2Vuc29yX2luaXRbXVs4XSA9IHsKKwl7MHhhMSwgMHgyMSwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4YTEsIDB4MjEsIDB4MTIsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAkvKiByZXNldCAqLworCXsweGExLCAweDIxLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHgyMSwgMHgwMywgMHhhNCwgMHgzMCwgMHg4OCwgMHgwMCwgMHgxMH0sCisJezB4YjEsIDB4MjEsIDB4MTEsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGMxLCAweDIxLCAweDEzLCAweGEwLCAweDA0LCAweDg0LCAweDAwLCAweDEwfSwKKwl7MHhkMSwgMHgyMSwgMHgxNywgMHgxYSwgMHgwMiwgMHhiYSwgMHhmNCwgMHgxMH0sCisJezB4YTEsIDB4MjEsIDB4MWIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGQxLCAweDIxLCAweDFmLCAweDQxLCAweGMwLCAweDgwLCAweDgwLCAweDEwfSwKKwl7MHhkMSwgMHgyMSwgMHgyMywgMHhkZSwgMHhhMCwgMHg4MCwgMHgzMiwgMHgxMH0sCisJezB4ZDEsIDB4MjEsIDB4MjcsIDB4ZmUsIDB4YTAsIDB4MDAsIDB4OTEsIDB4MTB9LAorCXsweGQxLCAweDIxLCAweDJiLCAweDAwLCAweDg4LCAweDg1LCAweDgwLCAweDEwfSwKKwl7MHhjMSwgMHgyMSwgMHgyZiwgMHg5YywgMHgwMCwgMHhjNCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4MjEsIDB4NjAsIDB4YTYsIDB4NjAsIDB4ODgsIDB4MTIsIDB4MTB9LAorCXsweGQxLCAweDIxLCAweDY0LCAweDg4LCAweDAwLCAweDAwLCAweDk0LCAweDEwfSwKKwl7MHhkMSwgMHgyMSwgMHg2OCwgMHg3YSwgMHgwYywgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4ZDEsIDB4MjEsIDB4NmMsIDB4MTEsIDB4MzMsIDB4MjIsIDB4MDAsIDB4MTB9LAorCXsweGQxLCAweDIxLCAweDcwLCAweDExLCAweDAwLCAweDEwLCAweDUwLCAweDEwfSwKKwl7MHhkMSwgMHgyMSwgMHg3NCwgMHgyMCwgMHgwNiwgMHgwMCwgMHhiNSwgMHgxMH0sCisJezB4ZDEsIDB4MjEsIDB4NzgsIDB4OGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGIxLCAweDIxLCAweDdjLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDEwfSwKKworCXsweGQxLCAweDIxLCAweDIxLCAweDg2LCAweDAwLCAweGRlLCAweGEwLCAweDEwfSwKKy8qCXsweGQxLCAweDIxLCAweDI1LCAweDgwLCAweDMyLCAweGZlLCAweGEwLCAweDEwfSwgamZtIGRvbmUgKi8KKy8qCXsweGQxLCAweDIxLCAweDI5LCAweDAwLCAweDkxLCAweDAwLCAweDg4LCAweDEwfSwgamZtIGRvbmUgKi8KKwl7MHhiMSwgMHgyMSwgMHgyZCwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisvKi4uLiovCisvKgl7MHhhMSwgMHgyMSwgMHgxMiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIGpmbSBkb25lICovCisvKgl7MHhhMSwgMHgyMSwgMHg3NSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sIGpmbSBkb25lICovCisJezB4YTEsIDB4MjEsIDB4MTksIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAorCXsweGExLCAweDIxLCAweDEwLCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKKy8qCXsweGExLCAweDIxLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgamZtIGRvbmUgKi8KKy8qCXsweGExLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgICogR0FJTiAtIGRlZiAqLworLyoJezB4YjEsIDB4MjEsIDB4MDEsIDB4NmMsIDB4NmMsIDB4MDAsIDB4MDAsIDB4MTB9LCAgKiBCIFIgLSBkZWY6IDgwICovCisvKi4uLiovCisJezB4YTEsIDB4MjEsIDB4MTEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiBDTEtSQyAqLworLyoJezB4YTEsIDB4MjEsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCBqZm0gZG9uZSAqLworLyoJezB4YTEsIDB4MjEsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCBqZm0gZG9uZSAqLworLyoJezB4YTEsIDB4MjEsIDB4MmEsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCBqZm0gZG9uZSAqLworLyoJezB4YTEsIDB4MjEsIDB4MmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCBqZm0gZG9uZSAqLworLyoJezB4YjEsIDB4MjEsIDB4MDEsIDB4NjQsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MTB9LCAgKiBCIFIgLSBkZWY6IDgwICovCisKKwl7fQorfTsKKwogc3RhdGljIGNvbnN0IF9fdTggb3Y3NjYwX3NlbnNvcl9pbml0W11bOF0gPSB7CiAJezB4YTEsIDB4MjEsIDB4MTIsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiByZXNldCBTQ0NCICovCiAvKgkJKGRlbGF5IDIwbXMpICovCkBAIC01NTcsNjQgKzY3Nyw2IEBACiAJezB4YTEsIDB4MjEsIDB4MmIsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXt9CiB9OwotLyoJICByZWcgMHgwNAkgIHJlZyAweDA3CQkgICByZWcgMHgxMCAqLwotLyogZXhwbyA9IChDT00xICYgMHgwMikgfCAoKEFFQ0hIICYgMHgyZikgPDwgMTApIHwgKEFFQ2ggPDwgMikgKi8KLQotc3RhdGljIGNvbnN0IF9fdTggb3Y3NjQ4X3NlbnNvcl9pbml0W11bOF0gPSB7Ci0JezB4QzEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDB9LAotCXsweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwfSwKLQl7MHhDMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMH0sCi0JezB4QTEsIDB4NkUsIDB4M0YsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDNGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhBMSwgMHg2RSwgMHgzRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4MDQsIDB4MDIsIDB4QjEsIDB4MDIsIDB4MzksIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHgwQywgMHgwMiwgMHg3RiwgMHgwMSwgMHhFMCwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4MTIsIDB4MDMsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDE2LCAweDg1LCAweDQwLCAweDRBLCAweDQwLCAweDEwfSwKLQl7MHhDMSwgMHg2RSwgMHgxQSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4MUQsIDB4MDgsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDIzLCAweDAwLCAweEIwLCAweDAwLCAweDk0LCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHgyNywgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4MkQsIDB4MTQsIDB4MzUsIDB4NjEsIDB4ODQsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDMxLCAweEEyLCAweEJELCAweEQ4LCAweEZGLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHgzNSwgMHgwNiwgMHgxRSwgMHgxMiwgMHgwMiwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4MzksIDB4QUEsIDB4NTMsIDB4MzcsIDB4RDUsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDNELCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHgzRSwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMywgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4NDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEMxLCAweDZFLCAweDQ2LCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHg0QiwgMHgwMiwgMHhFRiwgMHgwOCwgMHhDRCwgMHgxMH0sCi0JezB4RDEsIDB4NkUsIDB4NEYsIDB4MDAsIDB4RDAsIDB4MDAsIDB4QTAsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDUzLCAweDAxLCAweEFBLCAweDAxLCAweDQwLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHg1QSwgMHg1MCwgMHgwNCwgMHgzMCwgMHgwMywgMHgxMH0sCi0JezB4QTEsIDB4NkUsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDVGLCAweDEwLCAweDQwLCAweEZGLCAweDAwLCAweDEwfSwKLSAgLyoJezB4RDEsIDB4NkUsIDB4NjMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEQxLCAweDZFLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLSAqIFRoaXMgaXMgY3VycmVudGx5IHNldHRpbmcgYQotICogYmx1ZSB0aW50LCBhbmQgc29tZSB0aGluZ3MgbW9yZSAsIGkgbGVhdmUgaXQgaGVyZSBmb3IgZnV0dXJlIHRlc3QgaWYKLSAqIHNvbWVuZSBpcyBoYXZpbmcgcHJvYmxlbXMgd2l0aCBjb2xvciBvbiB0aGlzIHNlbnNvcgotCXsweEQxLCAweDZFLCAweDZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhEMSwgMHg2RSwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4QzEsIDB4NkUsIDB4NzMsIDB4MTAsIDB4ODAsIDB4RUIsIDB4MDAsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDFFLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhBMSwgMHg2RSwgMHgxNSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4QzEsIDB4NkUsIDB4MTYsIDB4NDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhBMSwgMHg2RSwgMHgwNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4QTEsIDB4NkUsIDB4MDcsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDE4LCAweDZCLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhBMSwgMHg2RSwgMHgxRCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCi0JezB4QTEsIDB4NkUsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAotCXsweEExLCAweDZFLCAweDA3LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgICovCi0JezB4QzEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDB9LAotCXsweEExLCAweDZFLCAweDA2LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwgLyogQnJpZ2h0Li4uICovCi0JezB4QTEsIDB4NkUsIDB4MDcsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiBCLi4gKi8KLQl7MHhDMSwgMHg2RSwgMHgxQSwgMHgwMywgMHg2NSwgMHg5MCwgMHgwMCwgMHgxMH0sIC8qIEJyaWdodC9XaXRlbi4uLi4qLwotLyoJezB4QzEsIDB4NkUsIDB4MTYsIDB4NDUsIDB4NDAsIDB4NjAsIDB4MDAsIDB4MTB9LCAgKiBCcmlnaHQvV2l0ZW5lICovCi0Je30KLX07CiAKIHN0YXRpYyBjb25zdCBfX3U4IHF0YWJsZTRbXSA9IHsKIAkweDA2LCAweDA0LCAweDA0LCAweDA2LCAweDA0LCAweDA0LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA4LCAweDA2LApAQCAtNzU3LDggKzgxOSw2IEBACiAKIHN0YXRpYyBpbnQgcHJvYmVzZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQogCWkyY193MShnc3BjYV9kZXYsIDB4MDIsIDApOwkJCS8qIHNlbnNvciB3YWtldXAgKi8KIAltc2xlZXAoMTApOwogCXJlZ193MShnc3BjYV9kZXYsIDB4MDIsIDB4NjYpOwkJCS8qIEdwaW8gb24gKi8KQEAgLTc3MCw4ICs4MzAsNyBAQAogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbM10gPT0gMHgwMAogCSAgICAmJiBnc3BjYV9kZXYtPnVzYl9idWZbNF0gPT0gMHgwMCkgewogCQlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIHNuOWMxMDJQIEhWNzEzMVIiKTsKLQkJc2QtPnNlbnNvciA9IFNFTlNPUl9IVjcxMzFSOwotCQlyZXR1cm4gU0VOU09SX0hWNzEzMVI7CisJCXJldHVybiAwOwogCX0KIAlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIDB4JTAyeCAweCUwMnggMHglMDJ4IiwKIAkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCBnc3BjYV9kZXYtPnVzYl9idWZbMV0sCkBAIC04MjcsMTcgKzg4NiwyMCBAQAogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQwKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjQ4OgotCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQzKTsKLQkJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgMHhhZSk7CisJCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4NjMpOworCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDE3LCAweDIwKTsKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg0Mik7CiAJCWJyZWFrOwogLypqZm06IGZyb20gd2luIHRyYWNlICovCiAJY2FzZSBTRU5TT1JfT1Y3NjYwOgotCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYxKTsKLQkJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgMHgyMCk7Ci0JCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4NjApOwotCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQwKTsKLQkJYnJlYWs7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9TTjlDMTIwKSB7CisJCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDYxKTsKKwkJCXJlZ193MShnc3BjYV9kZXYsIDB4MTcsIDB4MjApOworCQkJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgMHg2MCk7CisJCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCAweDQwKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhydSAqLwogCWRlZmF1bHQ6CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIDB4NDMpOwogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDE3LCAweDYxKTsKQEAgLTkyMiw2ICs5ODQsMTMgQEAKIHsKIAlpbnQgaSA9IDA7CiAKKwlpMmNfdzgoZ3NwY2FfZGV2LCBvdjc2NDhfc2Vuc29yX2luaXRbaV0pOworCWkrKzsKKy8qIHdpbjogZGJsZSByZXNldCAqLworCWkyY193OChnc3BjYV9kZXYsIG92NzY0OF9zZW5zb3JfaW5pdFtpXSk7CS8qIHJlc2V0ICovCisJaSsrOworCW1zbGVlcCgyMCk7CisvKiB3aW46IGkyYyByZWcgcmVhZCAwMC4uN2YgKi8KIAl3aGlsZSAob3Y3NjQ4X3NlbnNvcl9pbml0W2ldWzBdKSB7CiAJCWkyY193OChnc3BjYV9kZXYsIG92NzY0OF9zZW5zb3JfaW5pdFtpXSk7CiAJCWkrKzsKQEAgLTk2MSwxOSArMTAzMCwxNCBAQAogCXNkLT5icmlnaHRuZXNzID0gQlJJR0hUTkVTU19ERUY7CiAJc2QtPmNvbnRyYXN0ID0gQ09OVFJBU1RfREVGOwogCXNkLT5jb2xvcnMgPSBDT0xPUl9ERUY7CisJc2QtPmJsdWUgPSBCTFVFX0JBTEFOQ0VfREVGOworCXNkLT5yZWQgPSBSRURfQkFMQU5DRV9ERUY7CiAJc2QtPmF1dG9nYWluID0gQVVUT0dBSU5fREVGOwogCXNkLT5hZ19jbnQgPSAtMTsKKwlzZC0+dmZsaXAgPSBWRkxJUF9ERUY7CisJc2QtPmluZnJhcmVkID0gSU5GUkFSRURfREVGOwogCi0Jc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfT1Y3NjMwOgotCWNhc2UgU0VOU09SX09WNzY0ODoKLQljYXNlIFNFTlNPUl9PVjc2NjA6Ci0JCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBBVVRPR0FJTl9JRFgpOwotCQlicmVhazsKLQl9Ci0JaWYgKHNkLT5zZW5zb3IgIT0gU0VOU09SX09WNzYzMCkKLQkJZ3NwY2FfZGV2LT5jdHJsX2RpcyB8PSAoMSA8PCBWRkxJUF9JRFgpOwotCisJZ3NwY2FfZGV2LT5jdHJsX2RpcyA9IGN0cmxfZGlzW3NkLT5zZW5zb3JdOwogCXJldHVybiAwOwogfQogCkBAIC05ODEsNyArMTA0NSw2IEBACiBzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLS8qCWNvbnN0IF9fdTggKnNuOWMxeHg7ICovCiAJX191OCByZWdHcGlvW10gPSB7IDB4MjksIDB4NzQgfTsKIAlfX3U4IHJlZ0YxOwogCkBAIC0xMTAwLDMyICsxMTYzLDEzIEBACiAJcmV0dXJuIGV4cG87CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc2Vuc29ycyBvNzZ4eCBvbmx5ICovCi1zdGF0aWMgdm9pZCBzZXRicmlnaHRjb250KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JaW50IHZhbDsKLQlfX3U4IHJlZzg0X2Z1bGxbMHgxNV07Ci0KLQltZW1jcHkocmVnODRfZnVsbCwgcmVnODQsIHNpemVvZiByZWc4NF9mdWxsKTsKLQl2YWwgPSBzZC0+Y29udHJhc3QgKiAweDMwIC8gQ09OVFJBU1RfTUFYICsgMHgxMDsJLyogMTAuLjQwICovCi0JcmVnODRfZnVsbFswXSA9ICh2YWwgKyAxKSAvIDI7CQkvKiByZWQgKi8KLQlyZWc4NF9mdWxsWzJdID0gdmFsOwkJCS8qIGdyZWVuICovCi0JcmVnODRfZnVsbFs0XSA9ICh2YWwgKyAxKSAvIDU7CQkvKiBibHVlICovCi0JdmFsID0gKHNkLT5icmlnaHRuZXNzIC0gQlJJR0hUTkVTU19ERUYpICogMHgxMAotCQkJLyBCUklHSFRORVNTX01BWDsKLQlyZWc4NF9mdWxsWzB4MTJdID0gdmFsICYgMHgxZjsJCS8qIDU6MCBzaWduZWQgdmFsdWUgKi8KLQlyZWdfdyhnc3BjYV9kZXYsIDB4ODQsIHJlZzg0X2Z1bGwsIHNpemVvZiByZWc4NF9mdWxsKTsKLX0KLQotLyogc2Vuc29yICE9IG92NzZ4eCAqLwogc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXVuc2lnbmVkIGludCBleHBvOwogCV9fdTggazI7CiAKLQlrMiA9IHNkLT5icmlnaHRuZXNzID4+IDEwOworCWsyID0gKChpbnQpIHNkLT5icmlnaHRuZXNzIC0gMHg4MDAwKSA+PiAxMDsKIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKIAljYXNlIFNFTlNPUl9IVjcxMzFSOgogCQlleHBvID0gc2QtPmJyaWdodG5lc3MgPDwgNDsKQEAgLTExNDcsMzggKzExOTEsNDkgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmVnX3cxKGdzcGNhX2RldiwgMHg5NiwgazIpOworCXJlZ193MShnc3BjYV9kZXYsIDB4OTYsIGsyKTsJCS8qIGNvbG9yIG1hdHJpeCBZIG9mZnNldCAqLwogfQogCi0vKiBzZW5zb3IgIT0gb3Y3Nnh4ICovCiBzdGF0aWMgdm9pZCBzZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCV9fdTggazI7Ci0JX191OCBjb250cmFzdFtdID0geyAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDA3LCAweDAwIH07CisJX191OCBjb250cmFzdFs2XTsKIAotCWsyID0gc2QtPmNvbnRyYXN0OwotCWNvbnRyYXN0WzJdID0gazI7Ci0JY29udHJhc3RbMF0gPSAoazIgKyAxKSA+PiAxOwotCWNvbnRyYXN0WzRdID0gKGsyICsgMSkgLyA1OwotCXJlZ193KGdzcGNhX2RldiwgMHg4NCwgY29udHJhc3QsIDYpOworCWsyID0gc2QtPmNvbnRyYXN0ICogMHgzMCAvIChDT05UUkFTVF9NQVggKyAxKSArIDB4MTA7CS8qIDEwLi40MCAqLworCWNvbnRyYXN0WzBdID0gKGsyICsgMSkgLyAyOwkJLyogcmVkICovCisJY29udHJhc3RbMV0gPSAwOworCWNvbnRyYXN0WzJdID0gazI7CQkJLyogZ3JlZW4gKi8KKwljb250cmFzdFszXSA9IDA7CisJY29udHJhc3RbNF0gPSAoazIgKyAxKSAvIDU7CQkvKiBibHVlICovCisJY29udHJhc3RbNV0gPSAwOworCXJlZ193KGdzcGNhX2RldiwgMHg4NCwgY29udHJhc3QsIHNpemVvZiBjb250cmFzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCV9fdTggYmx1ZSwgcmVkOwotCi0JaWYgKHNkLT5jb2xvcnMgPj0gMzIpIHsKLQkJcmVkID0gMzIgKyAoc2QtPmNvbG9ycyAtIDMyKSAvIDI7Ci0JCWJsdWUgPSA2NCAtIHNkLT5jb2xvcnM7Ci0JfSBlbHNlIHsKLQkJcmVkID0gc2QtPmNvbG9yczsKLQkJYmx1ZSA9IDMyICsgKDMyIC0gc2QtPmNvbG9ycykgLyAyOworCWludCBpLCB2OworCV9fdTggcmVnOGFbMTJdOwkJCS8qIFUgJiBWIGdhaW5zICovCisJc3RhdGljIF9fczE2IHV2WzZdID0gewkJLyogc2FtZSBhcyByZWc4NCBpbiBzaWduZWQgZGVjaW1hbCAqLworCQktMjQsIC0zOCwgNjQsCQkvKiBVUiBVRyBVQiAqLworCQkgNjIsIC01MSwgLTkJCS8qIFZSIFZHIFZCICovCisJfTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXYgPSB1dltpXSAqIHNkLT5jb2xvcnMgLyBDT0xPUl9ERUY7CisJCXJlZzhhW2kgKiAyXSA9IHY7CisJCXJlZzhhW2kgKiAyICsgMV0gPSAodiA+PiA4KSAmIDB4MGY7CiAJfQotCXJlZ193MShnc3BjYV9kZXYsIDB4MDUsIHJlZCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDhhLCByZWc4YSwgc2l6ZW9mIHJlZzhhKTsKK30KKworc3RhdGljIHZvaWQgc2V0cmVkYmx1ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJcmVnX3cxKGdzcGNhX2RldiwgMHgwNSwgc2QtPnJlZCk7CiAvKglyZWdfdzEoZ3NwY2FfZGV2LCAweDA3LCAzMik7ICovCi0JcmVnX3cxKGdzcGNhX2RldiwgMHgwNiwgYmx1ZSk7CisJcmVnX3cxKGdzcGNhX2RldiwgMHgwNiwgc2QtPmJsdWUpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0xMTk1LDEyICsxMjUwLDE4IEBACiAKIHN0YXRpYyB2b2lkIHNldHZmbGlwKHN0cnVjdCBzZCAqc2QpCiB7Ci0JaWYgKHNkLT5zZW5zb3IgIT0gU0VOU09SX09WNzYzMCkKLQkJcmV0dXJuOwogCWkyY193MSgmc2QtPmdzcGNhX2RldiwgMHg3NSwJCQkvKiBDT01OICovCiAJCXNkLT52ZmxpcCA/IDB4ODIgOiAweDAyKTsKIH0KIAorc3RhdGljIHZvaWQgc2V0aW5mcmFyZWQoc3RydWN0IHNkICpzZCkKK3sKKy8qZml4bWU6IGRpZmZlcmVudCBzZXF1ZW5jZSBmb3IgU3RhckNhbSBDbGlwIGFuZCBTdGFyQ2FtIDM3MGkgKi8KKy8qIENsaXAgKi8KKwlpMmNfdzEoJnNkLT5nc3BjYV9kZXYsIDB4MDIsCQkJLyogZ3BpbyAqLworCQlzZC0+aW5mcmFyZWQgPyAweDY2IDogMHg2NCk7Cit9CisKIC8qIC0tIHN0YXJ0IHRoZSBjYW1lcmEgLS0gKi8KIHN0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewpAQCAtMTIzNSwyOCArMTI5NiwzOSBAQAogCQlyZWcxNyA9IDB4ZTI7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY0ODoKLQkJcmVnMTcgPSAweGFlOworCQlyZWcxNyA9IDB4MjA7CiAJCWJyZWFrOwogLypqZm06IGZyb20gd2luIHRyYWNlICovCiAJY2FzZSBTRU5TT1JfT1Y3NjYwOgotCQlyZWcxNyA9IDB4YTA7Ci0JCWJyZWFrOworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfU045QzEyMCkgeworCQkJcmVnMTcgPSAweGEwOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJ1ICovCiAJZGVmYXVsdDoKIAkJcmVnMTcgPSAweDYwOwogCQlicmVhazsKIAl9CiAJcmVnX3cxKGdzcGNhX2RldiwgMHgxNywgcmVnMTcpOwotCXJlZ193MShnc3BjYV9kZXYsIDB4MDUsIHNuOWMxeHhbNV0pOwotCXJlZ193MShnc3BjYV9kZXYsIDB4MDcsIHNuOWMxeHhbN10pOwotCXJlZ193MShnc3BjYV9kZXYsIDB4MDYsIHNuOWMxeHhbNl0pOworLyogc2V0IHJlZzEgd2FzIGhlcmUgKi8KKwlyZWdfdzEoZ3NwY2FfZGV2LCAweDA1LCBzbjljMXh4WzVdKTsJLyogcmVkICovCisJcmVnX3cxKGdzcGNhX2RldiwgMHgwNywgc245YzF4eFs3XSk7CS8qIGdyZWVuICovCisJcmVnX3cxKGdzcGNhX2RldiwgMHgwNiwgc245YzF4eFs2XSk7CS8qIGJsdWUgKi8KIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDE0LCBzbjljMXh4WzB4MTRdKTsKIAlyZWdfdyhnc3BjYV9kZXYsIDB4MjAsIGdhbW1hX2RlZiwgc2l6ZW9mIGdhbW1hX2RlZik7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJcmVnX3coZ3NwY2FfZGV2LCAweDg0LCByZWc4NCwgc2l6ZW9mIHJlZzg0KTsKIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKLQljYXNlIFNFTlNPUl9PVjc2NjA6Ci0JCXJlZ193MShnc3BjYV9kZXYsIDB4OWEsIDB4MDUpOworCWNhc2UgU0VOU09SX09WNzY0ODoKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHg5YSwgMHgwYSk7CisJCXJlZ193MShnc3BjYV9kZXYsIDB4OTksIDB4NjApOwogCQlicmVhazsKKwljYXNlIFNFTlNPUl9PVjc2NjA6CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9TTjlDMTIwKSB7CisJCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDlhLCAweDA1KTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhydSAqLwogCWRlZmF1bHQ6CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4OWEsIDB4MDgpOwogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDk5LCAweDU5KTsKQEAgLTEyNjUsMTAgKzEzMzcsMTAgQEAKIAogCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVsoaW50KSBnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKIAlpZiAobW9kZSkKLQkJcmVnMSA9IDB4NDY7CS8qIDMyMCBjbGsgNDhNaHogKi8KKwkJcmVnMSA9IDB4NDY7CS8qIDMyMHgyNDA6IGNsayA0OE1oeiwgdmlkZW8gdHJmIGVuYWJsZSAqLwogCWVsc2UKLQkJcmVnMSA9IDB4MDY7CS8qIDY0MCBjbGsgMjRNeiAqLwotCXJlZzE3ID0gMHg2MTsKKwkJcmVnMSA9IDB4MDY7CS8qIDY0MHg0ODA6IGNsayAyNE1oeiwgdmlkZW8gdHJmIGVuYWJsZSAqLworCXJlZzE3ID0gMHg2MTsJCS8qIDB4OjIwOiBlbmFibGUgc2Vuc29yIGNsb2NrICovCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfSFY3MTMxUjoKIAkJaHY3MTMxUl9Jbml0U2Vuc29yKGdzcGNhX2Rldik7CkBAIC0xMjk4LDIzICsxMzcwLDIxIEBACiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY0ODoKIAkJb3Y3NjQ4X0luaXRTZW5zb3IoZ3NwY2FfZGV2KTsKLQkJcmVnMTcgPSAweGEyOwotCQlyZWcxID0gMHg0NDsKLS8qCQlpZiAobW9kZSkKLQkJCTsJCSAqIDMyMHgyLi4uCi0JCWVsc2UKLQkJCTsJCSAqIDY0MHguLi4gKi8KKwkJcmVnMTcgPSAweDIxOworLyoJCXJlZzEgPSAweDQyOwkJICogNDIgLSA0Nj8gKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIC8qCWNhc2UgU0VOU09SX09WNzY2MDogKi8KIAkJb3Y3NjYwX0luaXRTZW5zb3IoZ3NwY2FfZGV2KTsKLQkJaWYgKG1vZGUpIHsKLS8qCQkJcmVnMTcgPSAweDIxOwkgKiAzMjAgKi8KLS8qCQkJcmVnMSA9IDB4NDQ7ICovCi0vKgkJCXJlZzEgPSAweDQ2OwkoZG9uZSkgKi8KKwkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMjApIHsKKwkJCWlmIChtb2RlKSB7CQkvKiAzMjB4MjQwIC0gMTYweDEyMCAqLworCQkJCXJlZzE3ID0gMHhhMjsKKwkJCQlyZWcxID0gMHg0NDsJLyogNDggTWh6LCB2aWRlbyB0cmYgZW5lYmxlICovCisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlyZWcxNyA9IDB4YTI7CS8qIDY0MCAqLwotCQkJcmVnMSA9IDB4NDQ7CisJCQlyZWcxNyA9IDB4MjI7CisJCQlyZWcxID0gMHgwNjsJLyogMjQgTWh6LCB2aWRlbyB0cmYgZW5lYmxlCisJCQkJCSAqIGludmVyc2UgcG93ZXIgZG93biAqLwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTEzNDIsMjMgKzE0MTIsMTggQEAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDE4LCByZWcxOCk7CiAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDE3LCByZWcxNyk7CisJcmVnX3cxKGdzcGNhX2RldiwgMHgwMSwgcmVnMSk7CiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfSFY3MTMxUjoKIAljYXNlIFNFTlNPUl9NSTAzNjA6Ci0JY2FzZSBTRU5TT1JfTU80MDAwOgotCWNhc2UgU0VOU09SX09NNjgwMjoKLQkJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwotCQlzZXRjb250cmFzdChnc3BjYV9kZXYpOworCQlzZXRpbmZyYXJlZChzZCk7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzYzMDoKIAkJc2V0dmZsaXAoc2QpOwotCQkvKiBmYWxsIHRocnUgKi8KLQlkZWZhdWx0OgkJCS8qIE9WNzZ4eCAqLwotCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7CiAJCWJyZWFrOwogCX0KKwlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CisJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKIAlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOwotCXJlZ193MShnc3BjYV9kZXYsIDB4MDEsIHJlZzEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzY5LDYgKzE0MzQsOCBAQAogCQl7IDB4YTEsIDB4MTEsIDB4MDIsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAgfTsKIAlzdGF0aWMgY29uc3QgX191OCBzdG9wbWkwMzYwW10gPQogCQl7IDB4YjEsIDB4NWQsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAgfTsKKwlzdGF0aWMgY29uc3QgX191OCBzdG9wb3Y3NjQ4W10gPQorCQl7IDB4YTEsIDB4MjEsIDB4NzYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAgfTsKIAlfX3U4IGRhdGE7CiAJY29uc3QgX191OCAqc245YzF4eDsKIApAQCAtMTM4Miw4ICsxNDQ5LDEwIEBACiAJCWkyY193OChnc3BjYV9kZXYsIHN0b3BtaTAzNjApOwogCQlkYXRhID0gMHgyOTsKIAkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfT1Y3NjMwOgogCWNhc2UgU0VOU09SX09WNzY0ODoKKwkJaTJjX3c4KGdzcGNhX2Rldiwgc3RvcG92NzY0OCk7CisJCS8qIGZhbGwgdGhydSAqLworCWNhc2UgU0VOU09SX09WNzYzMDoKIAkJZGF0YSA9IDB4Mjk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNDM3LDcgKzE1MDYsNyBAQAogCQkJCWV4cG90aW1lcyA9IDA7CiAJCQlzZC0+ZXhwb3N1cmUgPSBzZXRleHBvc3VyZShnc3BjYV9kZXYsCiAJCQkJCQkgICAodW5zaWduZWQgaW50KSBleHBvdGltZXMpOwotCQkJc2V0Y29sb3JzKGdzcGNhX2Rldik7CisJCQlzZXRyZWRibHVlKGdzcGNhX2Rldik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE0OTEsMTkgKzE1NjAsOCBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT5icmlnaHRuZXNzID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgewotCQlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKLQkJY2FzZSBTRU5TT1JfSFY3MTMxUjoKLQkJY2FzZSBTRU5TT1JfTUkwMzYwOgotCQljYXNlIFNFTlNPUl9NTzQwMDA6Ci0JCWNhc2UgU0VOU09SX09NNjgwMjoKLQkJCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgkJCS8qIE9WNzZ4eCAqLwotCQkJc2V0YnJpZ2h0Y29udChnc3BjYV9kZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1MjAsMTkgKzE1NzgsOCBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAogCXNkLT5jb250cmFzdCA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpIHsKLQkJc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JCWNhc2UgU0VOU09SX0hWNzEzMVI6Ci0JCWNhc2UgU0VOU09SX01JMDM2MDoKLQkJY2FzZSBTRU5TT1JfTU80MDAwOgotCQljYXNlIFNFTlNPUl9PTTY4MDI6Ci0JCQlzZXRjb250cmFzdChnc3BjYV9kZXYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CQkJLyogT1Y3Nnh4ICovCi0JCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NjIsNiArMTYwOSw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNkX3NldGJsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+Ymx1ZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldHJlZGJsdWUoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Ymx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zZXRyZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+cmVkID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0cmVkYmx1ZShnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldHJlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPnJlZDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZF9zZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0xNTk4LDYgKzE2ODEsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZF9zZXRpbmZyYXJlZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlzZC0+aW5mcmFyZWQgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRpbmZyYXJlZChzZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0aW5mcmFyZWQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+aW5mcmFyZWQ7CisJcmV0dXJuIDA7Cit9CisKIC8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0gewogCS5uYW1lID0gTU9EVUxFX05BTUUsCkBAIC0xNjIwLDEyICsxNzIxLDE1IEBACiAjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyICYmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMl9NT0RVTEUKIAl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAyNSksIEJTSShTTjlDMTIwLCBNSTAzNjAsIDB4NWQpfSwKIAl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAyZSksIEJTSShTTjlDMTIwLCBPVjc2NjAsIDB4MjEpfSwKKyNlbmRpZgogCXtVU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMGY1KSwgQlNJKFNOOUMxMDUsIE9WNzY2MCwgMHgyMSl9LAogCXtVU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMGY3KSwgQlNJKFNOOUMxMDUsIE9WNzY2MCwgMHgyMSl9LAorI2lmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMiAmJiAhZGVmaW5lZCBDT05GSUdfVVNCX1NOOUMxMDJfTU9EVUxFCiAJe1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjcpLCBCU0koU045QzEwNSwgTUkwMzYwLCAweDVkKX0sCi0Je1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjgpLCBCU0koU045QzEwNSwgTUkwMzYwLCAweDVkKX0sCiAjZW5kaWYKKwl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOCksIEJTSShTTjlDMTA1LCBNSTAzNjAsIDB4NWQpfSwKIAl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMzMCksIEJTSShTTjlDMTA1LCBNSTAzNjAsIDB4NWQpfSwKKwl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwNCksIEJTSShTTjlDMTA1LCBPVjc2NjAsIDB4MjEpfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjA0MCksIEJTSShTTjlDMTAyUCwgSFY3MTMxUiwgMHgxMSl9LAogLyogYnc2MDAuaW5mOgogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDQwKSwgQlNJKFNOOUMxMDJQLCBNSTAzNjAsIDB4NWQpfSwgKi8KQEAgLTE2NDksNyArMTc1Myw3IEBACiAvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyMyksIEJTSShTTjlDMTEwLCBTYW55b0NDRCwgMHg/Pyl9LCAqLwogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTI4KSwgQlNJKFNOOUMxMTAsIE9NNjgwMiwgMHgyMSl9LCAvKnNuOWMzMjU/Ki8KIC8qYnc2MDAuaW5mOiovCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMmEpLCBCU0koU045QzExMCwgT1Y3NjQ4LCAweDIxKX0sIC8qc245YzMyNT8qLworCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJhKSwgQlNJKFNOOUMxMjAsIE9WNzY0OCwgMHgyMSl9LCAvKnNuOWMxMTA/Ki8KIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyYyksIEJTSShTTjlDMTEwLCBNTzQwMDAsIDB4MjEpfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyZSksIEJTSShTTjlDMTEwLCBPVjc2MzAsIDB4MjEpfSwKIC8qCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MTJmKSwgQlNJKFNOOUMxMTAsIElDTTEwNUMsIDB4Pz8pfSwgKi8KQEAgLTE2NTcsOCArMTc2MSw4IEBACiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzApLCBCU0koU045QzEyMCwgTUkwMzYwLCAweDVkKX0sCiAjZW5kaWYKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEzOCksIEJTSShTTjlDMTIwLCBNTzQwMDAsIDB4MjEpfSwKKwl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEzYSksIEJTSShTTjlDMTIwLCBPVjc2NDgsIDB4MjEpfSwKICNpZiAhZGVmaW5lZCBDT05GSUdfVVNCX1NOOUMxMDIgJiYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyX01PRFVMRQotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2EpLCBCU0koU045QzEyMCwgT1Y3NjQ4LCAweD8/KX0sICovCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2IpLCBCU0koU045QzEyMCwgT1Y3NjYwLCAweDIxKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2MpLCBCU0koU045QzEyMCwgSFY3MTMxUiwgMHgxMSl9LAogLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2UpLCBCU0koU045QzEyMCwgT1Y3NjMwLCAweD8/KX0sICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCmluZGV4IGJjYTEwNmMuLjk0MmYwNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAogCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogMyAvIDggKyA1OTAsCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJLnByaXYgPSAwfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzaWZfbW9kZVtdID0gewogCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKIAkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDMgLyA4ICsgNTkwLApAQCAtNjMzLDEwICs2MzMsMTAgQEAKIAlzZC0+c3VidHlwZSA9IGlkLT5kcml2ZXJfaW5mbzsKIAlpZiAoc2QtPnN1YnR5cGUgIT0gTG9naXRlY2hDbGlja1NtYXJ0MzEwKSB7CiAJCWNhbS0+Y2FtX21vZGUgPSB2Z2FfbW9kZTsKLQkJY2FtLT5ubW9kZXMgPSBzaXplb2YgdmdhX21vZGUgLyBzaXplb2YgdmdhX21vZGVbMF07CisJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfbW9kZSk7CiAJfSBlbHNlIHsKIAkJY2FtLT5jYW1fbW9kZSA9IHNpZl9tb2RlOwotCQljYW0tPm5tb2RlcyA9IHNpemVvZiBzaWZfbW9kZSAvIHNpemVvZiBzaWZfbW9kZVswXTsKKwkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKHNpZl9tb2RlKTsKIAl9CiAJc2QtPnFpbmRleCA9IDU7CiAJc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKaW5kZXggZTI5OTU0Yy4uODJlM2UzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKQEAgLTM0LDYgKzM0LDggQEAKIAl1bnNpZ25lZCBzaG9ydCBjb250cmFzdDsKIAlfX3U4IGJyaWdodG5lc3M7CiAJX191OCBjb2xvcnM7CisJX191OCBibHVlX2JhbGFuY2U7CisJX191OCByZWRfYmFsYW5jZTsKIAogCWNoYXIgc3VidHlwZTsKICNkZWZpbmUgQXJvd2FuYTMwMEtDTU9TQ2FtZXJhIDAKQEAgLTUyLDYgKzU0LDEwIEBACiBzdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiBzdGF0aWMgaW50IHNkX3NldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CiBzdGF0aWMgaW50IHNkX2dldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0cmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRyZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogCiBzdGF0aWMgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKICNkZWZpbmUgTVlfQlJJR0hUTkVTUyAwCkBAIC02Myw3ICs2OSw3IEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSAxMjcsCiAJCS5zdGVwICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2MywKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAogCSAgICB9LAogCSAgICAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKIAkgICAgLmdldCA9IHNkX2dldGJyaWdodG5lc3MsCkBAIC03NSw5ICs4MSw5IEBACiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkJLm5hbWUgICAgPSAiQ29udHJhc3QiLAogCQkubWluaW11bSA9IDAsCi0JCS5tYXhpbXVtID0gMHhmZmZmLAorCQkubWF4aW11bSA9IDY0NzI1LAogCQkuc3RlcCAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMHhhYTAwLAorCQkuZGVmYXVsdF92YWx1ZSA9IDY0NzI1LAogCSAgICB9LAogCSAgICAuc2V0ID0gc2Rfc2V0Y29udHJhc3QsCiAJICAgIC5nZXQgPSBzZF9nZXRjb250cmFzdCwKQEAgLTkxLDE0ICs5Nyw0MiBAQAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gNjMsCiAJCS5zdGVwICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAzMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAyMCwKIAkgICAgfSwKIAkgICAgLnNldCA9IHNkX3NldGNvbG9ycywKIAkgICAgLmdldCA9IHNkX2dldGNvbG9ycywKIAl9LAorI2RlZmluZSBNWV9CTFVFX0JBTEFOQ0UgMworCXsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJCbHVlIEJhbGFuY2UiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMTI3LAorCQkuc3RlcCAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldGJsdWVfYmFsYW5jZSwKKwkgICAgLmdldCA9IHNkX2dldGJsdWVfYmFsYW5jZSwKKwl9LAorI2RlZmluZSBNWV9SRURfQkFMQU5DRSA0CisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgPSAiUmVkIEJhbGFuY2UiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMTI3LAorCQkuc3RlcCAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldHJlZF9iYWxhbmNlLAorCSAgICAuZ2V0ID0gc2RfZ2V0cmVkX2JhbGFuY2UsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NQQ0E1MDEsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE2MCwKIAkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDMgLyAyLApAQCAtMTgyMiwyOSArMTg1Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogcmV0dXJuczogbmVnYXRpdmUgaXMgZXJyb3IsIHBvcyBvciB6ZXJvIGlzIGRhdGEgKi8KLXN0YXRpYyBpbnQgcmVnX3JlYWQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJX191MTYgcmVxLAkvKiBiUmVxdWVzdCAqLwotCQkJX191MTYgaW5kZXgsCS8qIHdJbmRleCAqLwotCQkJX191MTYgbGVuZ3RoKQkvKiB3TGVuZ3RoICgxIG9yIDIgb25seSkgKi8KLXsKLQlpbnQgcmV0OwotCi0JZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gMDsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCi0JCQl1c2JfcmN2Y3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAotCQkJcmVxLAotCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkwLAkJLyogdmFsdWUgKi8KLQkJCWluZGV4LAotCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW5ndGgsCi0JCQk1MDApOwkJCS8qIHRpbWVvdXQgKi8KLQlpZiAocmV0IDwgMCkgewotCQlQREVCVUcoRF9FUlIsICJyZWdfcmVhZCBlcnIgJWQiLCByZXQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAoZ3NwY2FfZGV2LT51c2JfYnVmWzFdIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotfQogCiBzdGF0aWMgaW50IHdyaXRlX3ZlY3RvcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCQljb25zdCBfX3UxNiBkYXRhW11bM10pCkBAIC0xODY5LDE4ICsxODgwLDExIEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JcmVnX3dyaXRlKGdzcGNhX2Rldi0+ZGV2LCBTUENBNTAxX1JFR19DQ0RTUCwgMHgxMSwgc2QtPmJyaWdodG5lc3MpOwogCXJlZ193cml0ZShnc3BjYV9kZXYtPmRldiwgU1BDQTUwMV9SRUdfQ0NEU1AsIDB4MTIsIHNkLT5icmlnaHRuZXNzKTsKLQlyZWdfd3JpdGUoZ3NwY2FfZGV2LT5kZXYsIFNQQ0E1MDFfUkVHX0NDRFNQLCAweDEzLCBzZC0+YnJpZ2h0bmVzcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlfX3UxNiBicmlnaHRuZXNzOwotCi0JYnJpZ2h0bmVzcyA9IHJlZ19yZWFkKGdzcGNhX2RldiwgU1BDQTUwMV9SRUdfQ0NEU1AsIDB4MTEsIDIpOwotCXNkLT5icmlnaHRuZXNzID0gYnJpZ2h0bmVzcyA8PCAxOwogfQogCiBzdGF0aWMgdm9pZCBzZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0xODk1LDcgKzE4OTksNiBAQAogCiBzdGF0aWMgdm9pZCBnZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0vKglzcGNhNTB4LT5jb250cmFzdCA9IDB4YWEwMTsgKi8KIH0KIAogc3RhdGljIHZvaWQgc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTE5MDcsMTEgKzE5MTAsMjAgQEAKIAogc3RhdGljIHZvaWQgZ2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKK30KKworc3RhdGljIHZvaWQgc2V0Ymx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlzZC0+Y29sb3JzID0gcmVnX3JlYWQoZ3NwY2FfZGV2LCBTUENBNTAxX1JFR19DQ0RTUCwgMHgwYywgMik7Ci0vKglzZC0+aHVlID0gKHJlZ19yZWFkKGdzcGNhX2RldiwgU1BDQTUwMV9SRUdfQ0NEU1AsIDB4MTMsICovCi0vKgkJCTIpICYgMHhGRikgPDwgODsgKi8KKwlyZWdfd3JpdGUoZ3NwY2FfZGV2LT5kZXYsIFNQQ0E1MDFfUkVHX0NDRFNQLCAweDExLCBzZC0+Ymx1ZV9iYWxhbmNlKTsKK30KKworc3RhdGljIHZvaWQgc2V0cmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXJlZ193cml0ZShnc3BjYV9kZXYtPmRldiwgU1BDQTUwMV9SRUdfQ0NEU1AsIDB4MTMsIHNkLT5yZWRfYmFsYW5jZSk7CiB9CiAKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KQEAgLTE5MzAsNiArMTk0MiwxNCBAQAogCXNkLT5jb250cmFzdCA9IHNkX2N0cmxzW01ZX0NPTlRSQVNUXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwogCXNkLT5jb2xvcnMgPSBzZF9jdHJsc1tNWV9DT0xPUl0ucWN0cmwuZGVmYXVsdF92YWx1ZTsKIAorCXJldHVybiAwOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSBhbmQgcmVzdW1lIHRpbWUgKi8KK3N0YXRpYyBpbnQgc2RfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCiAJc3dpdGNoIChzZC0+c3VidHlwZSkgewogCWNhc2UgQXJvd2FuYTMwMEtDTU9TQ2FtZXJhOgogCWNhc2UgU21pbGVJbnRsQ2FtZXJhOgpAQCAtMTk0OCwxNSArMTk2OCwxNyBAQAogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJfQorCVBERUJVRyhEX1NUUkVBTSwgIkluaXRpYWxpemluZyBTUENBNTAxIGZpbmlzaGVkIik7CiAJcmV0dXJuIDA7CiBlcnJvcjoKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCi1zdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKKwlpbnQgbW9kZTsKIAogCXN3aXRjaCAoc2QtPnN1YnR5cGUpIHsKIAljYXNlIFRocmVlQ29tSG9tZUNvbm5lY3RMaXRlOgpAQCAtMTk3NiwxNCArMTk5OCw2IEBACiAJCS8qIEdlbmVyaWMgNTAxIG9wZW4gZGF0YSAqLwogCQl3cml0ZV92ZWN0b3IoZ3NwY2FfZGV2LCBzcGNhNTAxX29wZW5fZGF0YSk7CiAJfQotCVBERUJVRyhEX1NUUkVBTSwgIkluaXRpYWxpemluZyBTUENBNTAxIGZpbmlzaGVkIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKLQlpbnQgbW9kZTsKIAogCS8qIG1lbW9yaXplIHRoZSB3YW50ZWQgcGl4ZWwgZm9ybWF0ICovCiAJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhpbnQpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwpAQCAtMjExMyw2ICsyMTI3LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2Rfc2V0Ymx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5ibHVlX2JhbGFuY2UgPSB2YWw7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRibHVlX2JhbGFuY2UoZ3NwY2FfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9nZXRibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+Ymx1ZV9iYWxhbmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHJlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5yZWRfYmFsYW5jZSA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldHJlZF9iYWxhbmNlKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfZ2V0cmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCSp2YWwgPSBzZC0+cmVkX2JhbGFuY2U7CisJcmV0dXJuIDA7Cit9CisKIC8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0gewogCS5uYW1lID0gTU9EVUxFX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCmluZGV4IDg5NWI5ZmUuLjJhMzNhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCkBAIC01OSw3ICs1OSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NQQ0E1MDUsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE2MCwKIAkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDMgLyAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDYuYwppbmRleCA2NDVlZTlkLi45NmUyNTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDYuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NQQ0E1MDUsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE2MCwKIAkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCAqIDMgLyAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwppbmRleCA2M2VjOTAyLi5iZTVkNzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwpAQCAtNjIsNyArNjIsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzaWZfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmX21vZGVbXSA9IHsKIAl7MTYwLCAxMjAsIFY0TDJfUElYX0ZNVF9TUENBNTA4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAxNjAsCiAJCS5zaXplaW1hZ2UgPSAxNjAgKiAxMjAgKiAzIC8gMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKaW5kZXggYzNkZTRlNC4uM2M5Mjg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMKQEAgLTMyLDIyICszMiwyMiBAQAogc3RydWN0IHNkIHsKIAlzdHJ1Y3QgZ3NwY2FfZGV2IGdzcGNhX2RldjsJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLwogCi0JX191MTYgY29udHJhc3Q7CQkJLyogcmV2NzJhIG9ubHkgKi8KLSNkZWZpbmUgQ09OVFJBU1RfTUlOIDB4MDAwMAotI2RlZmluZSBDT05UUkFTVF9ERUYgMHgyMDAwCi0jZGVmaW5lIENPTlRSQVNUX01BWCAweDNmZmYKLQogCV9fdTE2IGV4cG9zdXJlOwkJCS8qIHJldjEyYSBvbmx5ICovCiAjZGVmaW5lIEVYUE9TVVJFX01JTiAxCiAjZGVmaW5lIEVYUE9TVVJFX0RFRiAyMDAKICNkZWZpbmUgRVhQT1NVUkVfTUFYICg0MDk1IC0gOTAwKSAvKiBzZWUgc2V0X2V4cG9zdXJlICovCiAKKwlfX3U4IGNvbnRyYXN0OwkJCS8qIHJldjcyYSBvbmx5ICovCisjZGVmaW5lIENPTlRSQVNUX01JTiAweDAwCisjZGVmaW5lIENPTlRSQVNUX0RFRiAweDIwCisjZGVmaW5lIENPTlRSQVNUX01BWCAweDNmCisKIAlfX3U4IGJyaWdodG5lc3M7CQkvKiByZXY3MmEgb25seSAqLwogI2RlZmluZSBCUklHSFRORVNTX01JTiAwCi0jZGVmaW5lIEJSSUdIVE5FU1NfREVGIDMyCi0jZGVmaW5lIEJSSUdIVE5FU1NfTUFYIDYzCisjZGVmaW5lIEJSSUdIVE5FU1NfREVGIDB4MjAKKyNkZWZpbmUgQlJJR0hUTkVTU19NQVggMHgzZgogCi0JX191OCB3aGl0ZTsJCQkvKiByZXYxMmEgb25seSAqLworCV9fdTggd2hpdGU7CiAjZGVmaW5lIFdISVRFX01JTiAxCiAjZGVmaW5lIFdISVRFX0RFRiAweDQwCiAjZGVmaW5lIFdISVRFX01BWCAweDdmCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lIEFHX0NOVF9TVEFSVCAxMwogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmXzAxMmFfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmXzAxMmFfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NHQlJHOCwgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTYwLAogCQkuc2l6ZWltYWdlID0gMTYwICogMTIwLApAQCAtOTYsNyArOTYsNyBAQAogCQkucHJpdiA9IDB9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmXzA3MmFfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmXzA3MmFfbW9kZVtdID0gewogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NHQlJHOCwgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTYwLAogCQkuc2l6ZWltYWdlID0gMTYwICogMTIwLApAQCAtMTQ2LDk4ICsxNDYsNyBAQAogI2RlZmluZSBTUENBNTYxX1NOQVBCSVQgMHgyMAogI2RlZmluZSBTUENBNTYxX1NOQVBDVFJMIDB4NDAKIAotc3RhdGljIHZvaWQgcmVnX3dfdmFsKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIF9fdTE2IGluZGV4LCBfX3U4IHZhbHVlKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDAsCQkvKiByZXF1ZXN0ICovCi0JCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgICB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDUwMCk7Ci0JUERFQlVHKERfVVNCTywgInJlZyB3cml0ZTogMHglMDJ4OjB4JTAyeCIsIGluZGV4LCB2YWx1ZSk7Ci0JaWYgKHJldCA8IDApCi0JCVBERUJVRyhEX0VSUiwgInJlZyB3cml0ZTogZXJyb3IgJWQiLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZV92ZWN0b3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJY29uc3QgX191MTYgZGF0YVtdWzJdKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCWkgPSAwOwotCXdoaWxlIChkYXRhW2ldWzFdICE9IDApIHsKLQkJcmVnX3dfdmFsKGRldiwgZGF0YVtpXVsxXSwgZGF0YVtpXVswXSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLS8qIHJlYWQgJ2xlbicgYnl0ZXMgdG8gZ3NwY2FfZGV2LT51c2JfYnVmICovCi1zdGF0aWMgdm9pZCByZWdfcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCSAgX191MTYgaW5kZXgsIF9fdTE2IGxlbmd0aCkKLXsKLQl1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCi0JCQl1c2JfcmN2Y3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAotCQkJMCwJCQkvKiByZXF1ZXN0ICovCi0JCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCTAsCQkJLyogdmFsdWUgKi8KLQkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbmd0aCwgNTAwKTsKLX0KLQotc3RhdGljIHZvaWQgcmVnX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJICAgICAgX191MTYgaW5kZXgsIGNvbnN0IF9fdTggKmJ1ZmZlciwgX191MTYgbGVuKQotewotCW1lbWNweShnc3BjYV9kZXYtPnVzYl9idWYsIGJ1ZmZlciwgbGVuKTsKLQl1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCi0JCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAotCQkJMCwJCQkvKiByZXF1ZXN0ICovCi0JCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkwLAkJCS8qIHZhbHVlICovCi0JCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sIDUwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGkyY193cml0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fdTE2IHZhbGV1ciwgX191MTYgcmVnKQotewotCWludCByZXRyeSA9IDYwOwotCV9fdTggRGF0YUxvdzsKLQlfX3U4IERhdGFIaWdodDsKLQotCURhdGFMb3cgPSB2YWxldXI7Ci0JRGF0YUhpZ2h0ID0gdmFsZXVyID4+IDg7Ci0JcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDEsIHJlZyk7Ci0JcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDUsIERhdGFMb3cpOwotCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4ODAwLCBEYXRhSGlnaHQpOwotCXdoaWxlIChyZXRyeS0tKSB7Ci0JCXJlZ19yKGdzcGNhX2RldiwgMHg4ODAzLCAxKTsKLQkJaWYgKCFnc3BjYV9kZXYtPnVzYl9idWZbMF0pCi0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaTJjX3JlYWQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3UxNiByZWcsIF9fdTggbW9kZSkKLXsKLQlpbnQgcmV0cnkgPSA2MDsKLQlfX3U4IHZhbHVlOwotCV9fdTggdmFsbHNiOwotCi0JcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDQsIDB4OTIpOwotCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4ODAxLCByZWcpOwotCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4ODAyLCAobW9kZSB8IDB4MDEpKTsKLQlkbyB7Ci0JCXJlZ19yKGdzcGNhX2RldiwgMHg4ODAzLCAxKTsKLQkJaWYgKCFnc3BjYV9kZXYtPnVzYl9idWZbMF0pCi0JCQlicmVhazsKLQl9IHdoaWxlICgtLXJldHJ5KTsKLQlpZiAocmV0cnkgPT0gMCkKLQkJcmV0dXJuIC0xOwotCXJlZ19yKGdzcGNhX2RldiwgMHg4ODAwLCAxKTsKLQl2YWx1ZSA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLQlyZWdfcihnc3BjYV9kZXYsIDB4ODgwNSwgMSk7Ci0JdmFsbHNiID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotCXJldHVybiAoKGludCkgdmFsdWUgPDwgOCkgfCB2YWxsc2I7Ci19Ci0KLXN0YXRpYyBjb25zdCBfX3UxNiBzcGNhNTYxX2luaXRfZGF0YVtdWzJdID0geworc3RhdGljIGNvbnN0IF9fdTE2IHJldjcyYV9pbml0X2RhdGExW11bMl0gPSB7CiAJezB4MDAwMCwgMHg4MTE0fSwJLyogU29mdHdhcmUgR1BJTyBvdXRwdXQgZGF0YSAqLwogCXsweDAwMDEsIDB4ODExNH0sCS8qIFNvZnR3YXJlIEdQSU8gb3V0cHV0IGRhdGEgKi8KIAl7MHgwMDAwLCAweDgxMTJ9LAkvKiBTb21lIGtpbmQgb2YgcmVzZXQgKi8KQEAgLTI0Nyw0NCArMTU2LDI2IEBACiAJezB4MDAwMSwgMHg4MTE4fSwJLyogQ29uZiBzZW5zb3IgKi8KIAl7MHgwMDkyLCAweDg4MDR9LAkvKiBJIGtub3cgbm90aGluZyBhYm91dCB0aGVzZSAqLwogCXsweDAwMTAsIDB4ODgwMn0sCS8qIDB4ODh4eCByZWdpc3RlcnMsIHNvIEkgd29uJ3QgKi8KLQkvKioqKioqKioqKioqKioqLwogCXsweDAwMGQsIDB4ODgwNX0sCS8qIHNlbnNvciBkZWZhdWx0IHNldHRpbmcgKi8KLQl7MHgwMDAxLCAweDg4MDF9LAkvKiAxIDwtIDB4MGQgKi8KLQl7MHgwMDAwLCAweDg4MDB9LAotCXsweDAwMTgsIDB4ODgwNX0sCi0JezB4MDAwMiwgMHg4ODAxfSwJLyogMiA8LSAweDE4ICovCi0JezB4MDAwMCwgMHg4ODAwfSwKLQl7MHgwMDY1LCAweDg4MDV9LAotCXsweDAwMDQsIDB4ODgwMX0sCS8qIDQgPC0gMHgwMSAweDY1ICovCi0JezB4MDAwMSwgMHg4ODAwfSwKLQl7MHgwMDIxLCAweDg4MDV9LAotCXsweDAwMDUsIDB4ODgwMX0sCS8qIDUgPC0gMHgyMSAqLwotCXsweDAwMDAsIDB4ODgwMH0sCi0JezB4MDBhYSwgMHg4ODA1fSwKLQl7MHgwMDA3LCAweDg4MDF9LAkvKiA3IDwtIDB4YWEgKi8KLQl7MHgwMDAwLCAweDg4MDB9LAotCXsweDAwMDQsIDB4ODgwNX0sCi0JezB4MDAyMCwgMHg4ODAxfSwJLyogMHgyMCA8LSAweDE1IDB4MDQgKi8KLQl7MHgwMDE1LCAweDg4MDB9LAotCXsweDAwMDIsIDB4ODgwNX0sCi0JezB4MDAzOSwgMHg4ODAxfSwJLyogMHgzOSA8LSAweDAyICovCi0JezB4MDAwMCwgMHg4ODAwfSwKLQl7MHgwMDEwLCAweDg4MDV9LAotCXsweDAwMzUsIDB4ODgwMX0sCS8qIDB4MzUgPC0gMHgxMCAqLwotCXsweDAwMDAsIDB4ODgwMH0sCi0JezB4MDA0OSwgMHg4ODA1fSwKLQl7MHgwMDA5LCAweDg4MDF9LAkvKiAweDA5IDwtIDB4MTAgMHg0OSAqLwotCXsweDAwMTAsIDB4ODgwMH0sCi0JezB4MDAwYiwgMHg4ODA1fSwKLQl7MHgwMDI4LCAweDg4MDF9LAkvKiAweDI4IDwtIDB4MGIgKi8KLQl7MHgwMDAwLCAweDg4MDB9LAotCXsweDAwMGYsIDB4ODgwNX0sCi0JezB4MDAzYiwgMHg4ODAxfSwJLyogMHgzYiA8LSAweDBmICovCi0JezB4MDAwMCwgMHg4ODAwfSwKLQl7MHgwMDAwLCAweDg4MDV9LAotCXsweDAwM2MsIDB4ODgwMX0sCS8qIDB4M2MgPC0gMHgwMCAqLwotCXsweDAwMDAsIDB4ODgwMH0sCi0JLyoqKioqKioqKioqKioqKi8KKwl7fQorfTsKK3N0YXRpYyBjb25zdCBfX3UxNiByZXY3MmFfaW5pdF9zZW5zb3IxW11bMl0gPSB7CisJCQkJLyogbXMtd2luIHZhbHVlcyAqLworCXsweDAwMDEsIDB4MDAxOH0sCS8qIDB4MDEgPC0gMHgwZCAqLworCXsweDAwMDIsIDB4MDA2NX0sCS8qIDB4MDIgPC0gMHgxOCAqLworCXsweDAwMDQsIDB4MDEyMX0sCS8qIDB4MDQgPC0gMHgwMTY1ICovCisJezB4MDAwNSwgMHgwMGFhfSwJLyogMHgwNSA8LSAweDIxICovCisJezB4MDAwNywgMHgwMDA0fSwJLyogMHgwNyA8LSAweGFhICovCisJezB4MDAyMCwgMHgxNTAyfSwJLyogMHgyMCA8LSAweDE1MDQgKi8KKwl7MHgwMDM5LCAweDAwMTB9LAkvKiAweDM5IDwtIDB4MDIgKi8KKwl7MHgwMDM1LCAweDAwNDl9LAkvKiAweDM1IDwtIDB4MTAgKi8KKwl7MHgwMDA5LCAweDEwMGJ9LAkvKiAweDA5IDwtIDB4MTA0OSAqLworCXsweDAwMjgsIDB4MDAwZn0sCS8qIDB4MjggPC0gMHgwYiAqLworCXsweDAwM2IsIDB4MDAzY30sCS8qIDB4M2IgPC0gMHgwZiAqLworCXsweDAwM2MsIDB4MDAwMH0sCS8qIDB4M2MgPC0gMHgwMCAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IF9fdTE2IHJldjcyYV9pbml0X2RhdGEyW11bMl0gPSB7CiAJezB4MDAxOCwgMHg4NjAxfSwJLyogUGl4ZWwvbGluZSBzZWxlY3Rpb24gZm9yIGNvbG9yIHNlcGFyYXRpb24gKi8KIAl7MHgwMDAwLCAweDg2MDJ9LAkvKiBPcHRpY2FsIGJsYWNrIGxldmVsIGZvciB1c2VyIHNldHRpbmcgKi8KIAl7MHgwMDYwLCAweDg2MDR9LAkvKiBPcHRpY2FsIGJsYWNrIGhvcml6b250YWwgb2Zmc2V0ICovCkBAIC0zMDksMTAgKzIwMCwxMSBAQAogCXsweDAwMDQsIDB4ODYxMn0sCS8qIEdyIG9mZnNldCBmb3Igd2hpdGUgYmFsYW5jZSAqLwogCXsweDAwMDcsIDB4ODYxM30sCS8qIEIgb2Zmc2V0IGZvciB3aGl0ZSBiYWxhbmNlICovCiAJezB4MDAwMCwgMHg4NjE0fSwJLyogR2Igb2Zmc2V0IGZvciB3aGl0ZSBiYWxhbmNlICovCi0JezB4MDA4YywgMHg4NjUxfSwJLyogUiBnYWluIGZvciB3aGl0ZSBiYWxhbmNlICovCi0JezB4MDA4YywgMHg4NjUyfSwJLyogR3IgZ2FpbiBmb3Igd2hpdGUgYmFsYW5jZSAqLwotCXsweDAwYjUsIDB4ODY1M30sCS8qIEIgZ2FpbiBmb3Igd2hpdGUgYmFsYW5jZSAqLwotCXsweDAwOGMsIDB4ODY1NH0sCS8qIEdiIGdhaW4gZm9yIHdoaXRlIGJhbGFuY2UgKi8KKy8qIGZyb20gbXMtd2luICovCisJezB4MDAzNSwgMHg4NjUxfSwJLyogUiBnYWluIGZvciB3aGl0ZSBiYWxhbmNlICovCisJezB4MDA0MCwgMHg4NjUyfSwJLyogR3IgZ2FpbiBmb3Igd2hpdGUgYmFsYW5jZSAqLworCXsweDAwNWYsIDB4ODY1M30sCS8qIEIgZ2FpbiBmb3Igd2hpdGUgYmFsYW5jZSAqLworCXsweDAwNDAsIDB4ODY1NH0sCS8qIEdiIGdhaW4gZm9yIHdoaXRlIGJhbGFuY2UgKi8KIAl7MHgwMDAyLCAweDg1MDJ9LAkvKiBNYXhpbXVtIGF2ZXJhZ2UgYml0IHJhdGUgc3R1ZmYgKi8KIAogCXsweDAwMTEsIDB4ODgwMn0sCkBAIC0zMjQsMjkgKzIxNiwyMiBAQAogCiAJezB4MDAwMiwgMHg4NjVifSwJLyogSG9yaXpvbnRhbCBvZmZzZXQgZm9yIHZhbGlkIHBpeGVscyAqLwogCXsweDAwMDMsIDB4ODY1Y30sCS8qIFZlcnRpY2FsIG9mZnNldCBmb3IgdmFsaWQgbGluZXMgKi8KLQkvKioqKioqKioqKioqKioqLy8qIHNlbnNvciBhY3RpdmUgKi8KLQl7MHgwMDAzLCAweDg4MDF9LAkvKiAweDAzIDwtIDB4MDEgMHgyMSAvLzI4OSAqLwotCXsweDAwMjEsIDB4ODgwNX0sCi0JezB4MDAwMSwgMHg4ODAwfSwKLQl7MHgwMDA0LCAweDg4MDF9LAkvKiAweDA0IDwtIDB4MDEgMHg2NSAvLzM1NyAqLwotCXsweDAwNjUsIDB4ODgwNX0sCi0JezB4MDAwMSwgMHg4ODAwfSwKLQl7MHgwMDA1LCAweDg4MDF9LAkvKiAweDA1IDwtIDB4MmYgKi8KLQl7MHgwMDJmLCAweDg4MDV9LAotCXsweDAwMDAsIDB4ODgwMH0sCi0JezB4MDAwNiwgMHg4ODAxfSwJLyogMHgwNiA8LSAwICovCi0JezB4MDAwMCwgMHg4ODA1fSwKLQl7MHgwMDAwLCAweDg4MDB9LAotCXsweDAwMGEsIDB4ODgwMX0sCS8qIDB4MGEgPC0gMiAqLwotCXsweDAwMDIsIDB4ODgwNX0sCi0JezB4MDAwMCwgMHg4ODAwfSwKLQl7MHgwMDA5LCAweDg4MDF9LAkvKiAweDA5IDwtIDB4MTA2MSAqLwotCXsweDAwNjEsIDB4ODgwNX0sCi0JezB4MDAxMCwgMHg4ODAwfSwKLQl7MHgwMDM1LCAweDg4MDF9LAkvKiAweDM1IDwtMHgxNCAqLwotCXsweDAwMTQsIDB4ODgwNX0sCi0JezB4MDAwMCwgMHg4ODAwfSwKKwl7fQorfTsKK3N0YXRpYyBjb25zdCBfX3UxNiByZXY3MmFfaW5pdF9zZW5zb3IyW11bMl0gPSB7CisJCQkJLyogbXMtd2luIHZhbHVlcyAqLworCXsweDAwMDMsIDB4MDEyMX0sCS8qIDB4MDMgPC0gMHgwMSAweDIxIC8vMjg5ICovCisJezB4MDAwNCwgMHgwMTY1fSwJLyogMHgwNCA8LSAweDAxIDB4NjUgLy8zNTcgKi8KKwl7MHgwMDA1LCAweDAwMmZ9LAkvKiAweDA1IDwtIDB4MmYgKi8KKwl7MHgwMDA2LCAweDAwMDB9LAkvKiAweDA2IDwtIDAgKi8KKwl7MHgwMDBhLCAweDAwMDJ9LAkvKiAweDBhIDwtIDIgKi8KKwl7MHgwMDA5LCAweDEwNjF9LAkvKiAweDA5IDwtIDB4MTA2MSAqLworCXsweDAwMzUsIDB4MDAxNH0sCS8qIDB4MzUgPC0gMHgxNCAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IF9fdTE2IHJldjcyYV9pbml0X2RhdGEzW11bMl0gPSB7CiAJezB4MDAzMCwgMHg4MTEyfSwJLyogSVNPIGFuZCBkcm9wIHBhY2tldCBlbmFibGUgKi8KKy8qZml4bWU6IHNob3VsZCBzdG9wIGhlcmUqLwogCXsweDAwMDAsIDB4ODExMn0sCS8qIFNvbWUga2luZCBvZiByZXNldCA/Pz8/ICovCiAJezB4MDAwOSwgMHg4MTE4fSwJLyogRW5hYmxlIHNlbnNvciBhbmQgc2V0IHN0YW5kYnkgKi8KIAl7MHgwMDAwLCAweDgxMTR9LAkvKiBTb2Z0d2FyZSBHUElPIG91dHB1dCBkYXRhICovCkBAIC00MzQsNyArMzE5LDYgQEAKIAl7fQogfTsKIAotCiAvKioqKioqKioqKioqKioqKioqKiogUUMgRXhwcmVzcyBldGNoMiBzdHVmZiAqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBjb25zdCBfX3UxNiBQYjEwMF8xbWFwODMwMFtdWzJdID0gewogCS8qIHJlZywgdmFsdWUgKi8KQEAgLTUxNSwyMiArMzk5LDExMiBAQAogCXt9CiB9OwogCi1zdGF0aWMgdm9pZCBzZW5zb3JfbWFwd3JpdGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJICAgIGNvbnN0IF9fdTE2IHNlbnNvcm1hcFtdWzJdKQorc3RhdGljIHZvaWQgcmVnX3dfdmFsKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIF9fdTE2IGluZGV4LCBfX3U4IHZhbHVlKQogewotCWludCBpID0gMDsKLQlfX3U4IHVzYnZhbFsyXTsKKwlpbnQgcmV0OwogCi0Jd2hpbGUgKHNlbnNvcm1hcFtpXVswXSkgewotCQl1c2J2YWxbMF0gPSBzZW5zb3JtYXBbaV1bMV07Ci0JCXVzYnZhbFsxXSA9IHNlbnNvcm1hcFtpXVsxXSA+PiA4OwotCQlyZWdfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JtYXBbaV1bMF0sIHVzYnZhbCwgMik7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkgICAgICAwLAkJLyogcmVxdWVzdCAqLworCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCA1MDApOworCVBERUJVRyhEX1VTQk8sICJyZWcgd3JpdGU6IDB4JTAyeDoweCUwMngiLCBpbmRleCwgdmFsdWUpOworCWlmIChyZXQgPCAwKQorCQlQREVCVUcoRF9FUlIsICJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdmVjdG9yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IF9fdTE2IGRhdGFbXVsyXSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJaW50IGk7CisKKwlpID0gMDsKKwl3aGlsZSAoZGF0YVtpXVsxXSAhPSAwKSB7CisJCXJlZ193X3ZhbChkZXYsIGRhdGFbaV1bMV0sIGRhdGFbaV1bMF0pOwogCQlpKys7CiAJfQogfQorCisvKiByZWFkICdsZW4nIGJ5dGVzIHRvIGdzcGNhX2Rldi0+dXNiX2J1ZiAqLworc3RhdGljIHZvaWQgcmVnX3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkgIF9fdTE2IGluZGV4LCBfX3UxNiBsZW5ndGgpCit7CisJdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJdXNiX3JjdmN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCTAsCQkJLyogcmVxdWVzdCAqLworCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkwLAkJCS8qIHZhbHVlICovCisJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW5ndGgsIDUwMCk7Cit9CisKKy8qIHdyaXRlICdsZW4nIGJ5dGVzIGZyb20gZ3NwY2FfZGV2LT51c2JfYnVmICovCitzdGF0aWMgdm9pZCByZWdfd19idWYoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkgICAgICBfX3UxNiBpbmRleCwgX191MTYgbGVuKQoreworCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkwLAkJCS8qIHJlcXVlc3QgKi8KKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCTAsCQkJLyogdmFsdWUgKi8KKwkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwgNTAwKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3dyaXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX191MTYgdmFsdWUsIF9fdTE2IHJlZykKK3sKKwlpbnQgcmV0cnkgPSA2MDsKKworCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4ODAxLCByZWcpOworCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4ODA1LCB2YWx1ZSk7CisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDAsIHZhbHVlID4+IDgpOworCWRvIHsKKwkJcmVnX3IoZ3NwY2FfZGV2LCAweDg4MDMsIDEpOworCQlpZiAoIWdzcGNhX2Rldi0+dXNiX2J1ZlswXSkKKwkJCXJldHVybjsKKwl9IHdoaWxlICgtLXJldHJ5KTsKK30KKworc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fdTE2IHJlZywgX191OCBtb2RlKQoreworCWludCByZXRyeSA9IDYwOworCV9fdTggdmFsdWU7CisKKwlyZWdfd192YWwoZ3NwY2FfZGV2LT5kZXYsIDB4ODgwNCwgMHg5Mik7CisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDEsIHJlZyk7CisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDIsIG1vZGUgfCAweDAxKTsKKwlkbyB7CisJCXJlZ19yKGdzcGNhX2RldiwgMHg4ODAzLCAxKTsKKwkJaWYgKCFnc3BjYV9kZXYtPnVzYl9idWZbMF0pIHsKKwkJCXJlZ19yKGdzcGNhX2RldiwgMHg4ODAwLCAxKTsKKwkJCXZhbHVlID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworCQkJcmVnX3IoZ3NwY2FfZGV2LCAweDg4MDUsIDEpOworCQkJcmV0dXJuICgoaW50KSB2YWx1ZSA8PCA4KSB8IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKKwkJfQorCX0gd2hpbGUgKC0tcmV0cnkpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgc2Vuc29yX21hcHdyaXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICBjb25zdCBfX3UxNiAoKnNlbnNvcm1hcClbMl0pCit7CisJd2hpbGUgKCgqc2Vuc29ybWFwKVswXSkgeworCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAoKnNlbnNvcm1hcClbMV07CisJCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9ICgqc2Vuc29ybWFwKVsxXSA+PiA4OworCQlyZWdfd19idWYoZ3NwY2FfZGV2LCAoKnNlbnNvcm1hcClbMF0sIDIpOworCQlzZW5zb3JtYXArKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NlbnNvcl83MmEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJICAgIGNvbnN0IF9fdTE2ICgqc2Vuc29yKVsyXSkKK3sKKwl3aGlsZSAoKCpzZW5zb3IpWzBdKSB7CisJCWkyY193cml0ZShnc3BjYV9kZXYsICgqc2Vuc29yKVsxXSwgKCpzZW5zb3IpWzBdKTsKKwkJc2Vuc29yKys7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpbml0XzE2MXJldjEyQShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0vKglzZW5zb3JfcmVzZXQoZ3NwY2FfZGV2KTsJKG5vdCBpbiB3aW4pICovCiAJd3JpdGVfdmVjdG9yKGdzcGNhX2Rldiwgc3BjYTU2MV8xNjFyZXYxMkFfZGF0YTEpOwogCXNlbnNvcl9tYXB3cml0ZShnc3BjYV9kZXYsIFBiMTAwXzFtYXA4MzAwKTsKIC8qZml4bWU6IHNob3VsZCBiZSBpbiBzZF9zdGFydCovCkBAIC01OTgsNDkgKzU3Miw2OCBAQAogc3RhdGljIGludCBzZF9pbml0XzcyYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJUERFQlVHKERfU1RSRUFNLCAiQ2hpcCByZXZpc2lvbjogMDcyYSIpOwotCXdyaXRlX3ZlY3Rvcihnc3BjYV9kZXYsIHNwY2E1NjFfaW5pdF9kYXRhKTsKKwl3cml0ZV92ZWN0b3IoZ3NwY2FfZGV2LCByZXY3MmFfaW5pdF9kYXRhMSk7CisJd3JpdGVfc2Vuc29yXzcyYShnc3BjYV9kZXYsIHJldjcyYV9pbml0X3NlbnNvcjEpOworCXdyaXRlX3ZlY3Rvcihnc3BjYV9kZXYsIHJldjcyYV9pbml0X2RhdGEyKTsKKwl3cml0ZV9zZW5zb3JfNzJhKGdzcGNhX2RldiwgcmV2NzJhX2luaXRfc2Vuc29yMik7CisJd3JpdGVfdmVjdG9yKGdzcGNhX2RldiwgcmV2NzJhX2luaXRfZGF0YTMpOwogCXJldHVybiAwOwogfQogCisvKiByZXYgNzJhIG9ubHkgKi8KK3N0YXRpYyB2b2lkIHNldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CisJX191OCB2YWx1ZTsKKworCXZhbHVlID0gc2QtPmJyaWdodG5lc3M7CisKKwkvKiBvZmZzZXRzIGZvciB3aGl0ZSBiYWxhbmNlICovCisJcmVnX3dfdmFsKGRldiwgMHg4NjExLCB2YWx1ZSk7CQkvKiBSICovCisJcmVnX3dfdmFsKGRldiwgMHg4NjEyLCB2YWx1ZSk7CQkvKiBHciAqLworCXJlZ193X3ZhbChkZXYsIDB4ODYxMywgdmFsdWUpOwkJLyogQiAqLworCXJlZ193X3ZhbChkZXYsIDB4ODYxNCwgdmFsdWUpOwkJLyogR2IgKi8KK30KKworc3RhdGljIHZvaWQgc2V0d2hpdGUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlfX3UxNiB3aGl0ZTsKKwlfX3U4IGJsdWUsIHJlZDsKKwlfX3UxNiByZWc7CisKKwkvKiB0cnkgdG8gZW11bGF0ZSBNUy13aW4gYXMgcG9zc2libGUgKi8KKwl3aGl0ZSA9IHNkLT53aGl0ZTsKKwlyZWQgPSAweDIwICsgd2hpdGUgKiAzIC8gODsKKwlibHVlID0gMHg5MCAtIHdoaXRlICogNSAvIDg7CisJaWYgKHNkLT5jaGlwX3JldmlzaW9uID09IFJldjAxMkEpIHsKKwkJcmVnID0gMHg4NjE0OworCX0gZWxzZSB7CisJCXJlZyA9IDB4ODY1MTsKKwkJcmVkICs9IHNkLT5jb250cmFzdCAtIDB4MjA7CisJCWJsdWUgKz0gc2QtPmNvbnRyYXN0IC0gMHgyMDsKKwl9CisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCByZWcsIHJlZCk7CisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCByZWcgKyAyLCBibHVlKTsKK30KKwogc3RhdGljIHZvaWQgc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7Ci0JX191OCBsb3diOworCV9fdTggdmFsdWU7CiAKLQlzd2l0Y2ggKHNkLT5jaGlwX3JldmlzaW9uKSB7Ci0JY2FzZSBSZXYwNzJBOgotCQlsb3diID0gc2QtPmNvbnRyYXN0ID4+IDg7Ci0JCXJlZ193X3ZhbChkZXYsIDB4ODY1MSwgbG93Yik7Ci0JCXJlZ193X3ZhbChkZXYsIDB4ODY1MiwgbG93Yik7Ci0JCXJlZ193X3ZhbChkZXYsIDB4ODY1MywgbG93Yik7Ci0JCXJlZ193X3ZhbChkZXYsIDB4ODY1NCwgbG93Yik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6IHsKLS8qCWNhc2UgUmV2MDEyQTogeyAqLwotCQlzdGF0aWMgY29uc3QgX191OCBSZWc4MzkxW10gPQotCQkJeyAweDkyLCAweDMwLCAweDIwLCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwIH07CisJaWYgKHNkLT5jaGlwX3JldmlzaW9uICE9IFJldjA3MkEpCisJCXJldHVybjsKKwl2YWx1ZSA9IHNkLT5jb250cmFzdCArIDB4MjA7CiAKLQkJcmVnX3dfYnVmKGdzcGNhX2RldiwgMHg4MzkxLCBSZWc4MzkxLCA4KTsKLQkJcmVnX3dfYnVmKGdzcGNhX2RldiwgMHg4MzkwLCBSZWc4MzkxLCA4KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qIHJldjEyYSBvbmx5ICovCi1zdGF0aWMgdm9pZCBzZXR3aGl0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCV9fdTE2IHdoaXRlOwotCV9fdTggcmVnODYxNCwgcmVnODYxNjsKLQotCXdoaXRlID0gc2QtPndoaXRlOwotCS8qIHRyeSB0byBlbXVsYXRlIE1TLXdpbiBhcyBwb3NzaWJsZSAqLwotCXJlZzg2MTYgPSAweDkwIC0gd2hpdGUgKiA1IC8gODsKLQlyZWdfd192YWwoZ3NwY2FfZGV2LT5kZXYsIDB4ODYxNiwgcmVnODYxNik7Ci0JcmVnODYxNCA9IDB4MjAgKyB3aGl0ZSAqIDMgLyA4OwotCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4NjE0LCByZWc4NjE0KTsKKwkvKiBnYWlucyBmb3Igd2hpdGUgYmFsYW5jZSAqLworCXNldHdoaXRlKGdzcGNhX2Rldik7CisvKglyZWdfd192YWwoZGV2LCAweDg2NTEsIHZhbHVlKTsJCSAqIFIgLSBkb25lIGJ5IHNldHdoaXRlICovCisJcmVnX3dfdmFsKGRldiwgMHg4NjUyLCB2YWx1ZSk7CQkvKiBHciAqLworLyoJcmVnX3dfdmFsKGRldiwgMHg4NjUzLCB2YWx1ZSk7CQkgKiBCIC0gZG9uZSBieSBzZXR3aGl0ZSAqLworCXJlZ193X3ZhbChkZXYsIDB4ODY1NCwgdmFsdWUpOwkJLyogR2IgKi8KIH0KIAogLyogcmV2IDEyYSBvbmx5ICovCkBAIC02NDksNyArNjQyLDYgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IGV4cG87CiAJaW50IGNsb2NrX2RpdmlkZXI7Ci0JX191OCBkYXRhWzJdOwogCiAJLyogUmVnaXN0ZXIgMHg4MzA5IGNvbnRyb2xzIGV4cG9zdXJlIGZvciB0aGUgc3BjYTU2MSwKIAkgICB0aGUgYmFzaWMgZXhwb3N1cmUgc2V0dGluZyBnb2VzIGZyb20gMS0yMDQ3LCB3aGVyZSAxIGlzIGNvbXBsZXRlbHkKQEAgLTY3MywyMCArNjY1LDE5IEBACiAJCWNsb2NrX2RpdmlkZXIgPSAzOwogCX0KIAlleHBvIHw9IGNsb2NrX2RpdmlkZXIgPDwgMTE7Ci0JZGF0YVswXSA9IGV4cG87Ci0JZGF0YVsxXSA9IGV4cG8gPj4gODsKLQlyZWdfd19idWYoZ3NwY2FfZGV2LCAweDgzMDksIGRhdGEsIDIpOworCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IGV4cG87CisJZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gZXhwbyA+PiA4OworCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMwOSwgMik7CiB9CiAKIC8qIHJldiAxMmEgb25seSAqLwogc3RhdGljIHZvaWQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCV9fdTggZGF0YVsyXTsKIAotCWRhdGFbMF0gPSBzZC0+Z2FpbjsKLQlkYXRhWzFdID0gMDsKLQlyZWdfd19idWYoZ3NwY2FfZGV2LCAweDgzMzUsIGRhdGEsIDIpOworCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IHNkLT5nYWluOworCWdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA9IDA7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgMHg4MzM1LCAyKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtNzAyLDkgKzY5Myw5IEBACiBzdGF0aWMgaW50IHNkX3N0YXJ0XzEyYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OwotCWludCBDbGNrID0gMHg4YTsgLyogbG93ZXIgMHg4WCB2YWx1ZXMgbGVhZCB0byBmcHMgPiAzMCAqLwotCV9fdTggUmVnODMwN1tdID0geyAweGFhLCAweDAwIH07CiAJaW50IG1vZGU7CisJc3RhdGljIGNvbnN0IF9fdTggUmVnODM5MVs4XSA9CisJCXsweDkyLCAweDMwLCAweDIwLCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwfTsKIAogCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVsoaW50KSBnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKIAlpZiAobW9kZSA8PSAxKSB7CkBAIC03MTYsMTQgKzcwNywyMSBAQAogCQkgKiBpcyBzdWZmaWNpZW50IHRvIHB1c2ggcmF3IGZyYW1lcyBhdCB+MjBmcHMgKi8KIAkJcmVnX3dfdmFsKGRldiwgMHg4NTAwLCBtb2RlKTsKIAl9CQkvKiAtLSBxcUBrdWt1LmV1Lm9yZyAqLwotCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMwNywgUmVnODMwNywgMik7Ci0JcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg3MDAsIENsY2spOworCisJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gMHhhYTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMV0gPSAweDAwOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMwNywgMik7CisJLyogY2xvY2sgLSBsb3dlciAweDhYIHZhbHVlcyBsZWFkIHRvIGZwcyA+IDMwICovCisJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg3MDAsIDB4OGEpOwogCQkJCQkvKiAweDhmIDB4ODUgMHgyNyBjbG9jayAqLwogCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4MTEyLCAweDFlIHwgMHgyMCk7CiAJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg1MGIsIDB4MDMpOwotCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CisJbWVtY3B5KGdzcGNhX2Rldi0+dXNiX2J1ZiwgUmVnODM5MSwgOCk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgMHg4MzkxLCA4KTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCAweDgzOTAsIDgpOwogCXNldHdoaXRlKGdzcGNhX2Rldik7CiAJc2V0YXV0b2dhaW4oZ3NwY2FfZGV2KTsKKy8qCXNldGdhaW4oZ3NwY2FfZGV2KTsJCSovCiAJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc1MCw2ICs3NDgsOSBAQAogCXJlZ193X3ZhbChkZXYsIDB4ODUwMCwgbW9kZSk7CS8qIG1vZGUgKi8KIAlyZWdfd192YWwoZGV2LCAweDg3MDAsIENsY2spOwkvKiAweDI3IGNsb2NrICovCiAJcmVnX3dfdmFsKGRldiwgMHg4MTEyLCAweDEwIHwgMHgyMCk7CisJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKKy8qCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsJICogZml4bWU6IGJhZCB2YWx1ZXMgKi8KKwlzZXR3aGl0ZShnc3BjYV9kZXYpOwogCXNldGF1dG9nYWluKGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CkBAIC03OTEsNyArNzkyLDYgQEAKIAlfX3U4IGx1bWFfbWVhbiA9IDExMDsKIAlfX3U4IGx1bWFfZGVsdGEgPSAyMDsKIAlfX3U4IHNwcmluZyA9IDQ7Ci0JX191OCByZWc4MzM5WzJdOwogCiAJaWYgKHNkLT5hZ19jbnQgPCAwKQogCQlyZXR1cm47CkBAIC04MzQsMTMgKzgzNCwxMyBAQAogCiAJCQlpZiAoZ2FpbkcgPiAweDNmKQogCQkJCWdhaW5HID0gMHgzZjsKLQkJCWVsc2UgaWYgKGdhaW5HIDwgNCkKKwkJCWVsc2UgaWYgKGdhaW5HIDwgMykKIAkJCQlnYWluRyA9IDM7CiAJCQlpMmNfd3JpdGUoZ3NwY2FfZGV2LCBnYWluRywgMHgzNSk7CiAKLQkJCWlmIChleHBvdGltZXMgPj0gMHgwMjU2KQorCQkJaWYgKGV4cG90aW1lcyA+IDB4MDI1NikKIAkJCQlleHBvdGltZXMgPSAweDAyNTY7Ci0JCQllbHNlIGlmIChleHBvdGltZXMgPCA0KQorCQkJZWxzZSBpZiAoZXhwb3RpbWVzIDwgMykKIAkJCQlleHBvdGltZXMgPSAzOwogCQkJaTJjX3dyaXRlKGdzcGNhX2RldiwgZXhwb3RpbWVzIHwgcGl4ZWxjbGssIDB4MDkpOwogCQl9CkBAIC04NDgsMTMgKzg0OCwxMyBAQAogCWNhc2UgUmV2MDEyQToKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDgzMzAsIDIpOwogCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzFdID4gMHgwOCkgewotCQkJcmVnODMzOVswXSA9ICsrc2QtPmV4cG8xMmE7Ci0JCQlyZWc4MzM5WzFdID0gMDsKLQkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMzOSwgcmVnODMzOSwgMik7CisJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSArK3NkLT5leHBvMTJhOworCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gMDsKKwkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMzOSwgMik7CiAJCX0gZWxzZSBpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzFdIDwgMHgwMikgewotCQkJcmVnODMzOVswXSA9IC0tc2QtPmV4cG8xMmE7Ci0JCQlyZWc4MzM5WzFdID0gMDsKLQkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMzOSwgcmVnODMzOSwgMik7CisJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAtLXNkLT5leHBvMTJhOworCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdID0gMDsKKwkJCXJlZ193X2J1Zihnc3BjYV9kZXYsIDB4ODMzOSwgMik7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtODY3LDggKzg2Nyw4IEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0Jc3dpdGNoIChkYXRhWzBdKSB7Ci0JY2FzZSAwOgkJLyogc3RhcnQgb2YgZnJhbWUgKi8KKwlzd2l0Y2ggKGRhdGFbMF0pIHsJCQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKwljYXNlIDA6CQkJCQkvKiBzdGFydCBvZiBmcmFtZSAqLwogCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKIAkJCQkJZGF0YSwgMCk7CiAJCWRhdGEgKz0gU1BDQTU2MV9PRkZTRVRfREFUQTsKQEAgLTg5MCw4ICs4OTAsNyBAQAogCQkJCQkJZnJhbWUsIGRhdGEsIGxlbik7CiAJCX0KIAkJcmV0dXJuOwotCWNhc2UgMHhmZjoJCS8qIGRyb3AgKi8KLS8qCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsgKi8KKwljYXNlIDB4ZmY6CQkJLyogZHJvcCAoZW1wdHkgbXBhY2tldHMpICovCiAJCXJldHVybjsKIAl9CiAJZGF0YSsrOwpAQCAtOTAwLDU1ICs4OTksNiBAQAogfQogCiAvKiByZXYgNzJhIG9ubHkgKi8KLXN0YXRpYyB2b2lkIHNldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlfX3U4IHZhbHVlOwotCi0JdmFsdWUgPSBzZC0+YnJpZ2h0bmVzczsKLQlyZWdfd192YWwoZ3NwY2FfZGV2LT5kZXYsIDB4ODYxMSwgdmFsdWUpOwotCXJlZ193X3ZhbChnc3BjYV9kZXYtPmRldiwgMHg4NjEyLCB2YWx1ZSk7Ci0JcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg2MTMsIHZhbHVlKTsKLQlyZWdfd192YWwoZ3NwY2FfZGV2LT5kZXYsIDB4ODYxNCwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBnZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0JX191MTYgdG90OwotCi0JdG90ID0gMDsKLQlyZWdfcihnc3BjYV9kZXYsIDB4ODYxMSwgMSk7Ci0JdG90ICs9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLQlyZWdfcihnc3BjYV9kZXYsIDB4ODYxMiwgMSk7Ci0JdG90ICs9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLQlyZWdfcihnc3BjYV9kZXYsIDB4ODYxMywgMSk7Ci0JdG90ICs9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLQlyZWdfcihnc3BjYV9kZXYsIDB4ODYxNCwgMSk7Ci0JdG90ICs9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKLQlzZC0+YnJpZ2h0bmVzcyA9IHRvdCA+PiAyOwotfQotCi0vKiByZXY3MmEgb25seSAqLwotc3RhdGljIHZvaWQgZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQlfX3UxNiB0b3Q7Ci0KLQl0b3QgPSAwOwotCXJlZ19yKGdzcGNhX2RldiwgMHg4NjUxLCAxKTsKLQl0b3QgKz0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotCXJlZ19yKGdzcGNhX2RldiwgMHg4NjUyLCAxKTsKLQl0b3QgKz0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotCXJlZ19yKGdzcGNhX2RldiwgMHg4NjUzLCAxKTsKLQl0b3QgKz0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotCXJlZ19yKGdzcGNhX2RldiwgMHg4NjU0LCAxKTsKLQl0b3QgKz0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwotCXNkLT5jb250cmFzdCA9IHRvdCA8PCA2OwotCVBERUJVRyhEX0NPTkYsICJnZXQgY29udHJhc3QgJWQiLCBzZC0+Y29udHJhc3QpOwotfQotCi0vKiByZXYgNzJhIG9ubHkgKi8KIHN0YXRpYyBpbnQgc2Rfc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC05NjMsNyArOTEzLDYgQEAKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlnZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CiAJKnZhbCA9IHNkLT5icmlnaHRuZXNzOwogCXJldHVybiAwOwogfQpAQCAtOTgzLDcgKzkzMiw2IEBACiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JZ2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKIAkqdmFsID0gc2QtPmNvbnRyYXN0OwogCXJldHVybiAwOwogfQpAQCAtMTAwNiw3ICs5NTQsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiByZXYxMmEgb25seSAqLwogc3RhdGljIGludCBzZF9zZXR3aGl0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0xMTIxLDYgKzEwNjgsMTkgQEAKIAogc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzXzcyYVtdID0gewogCXsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIldoaXRlIEJhbGFuY2UiLAorCQkubWluaW11bSA9IFdISVRFX01JTiwKKwkJLm1heGltdW0gPSBXSElURV9NQVgsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSBXSElURV9ERUYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXR3aGl0ZSwKKwkgICAgLmdldCA9IHNkX2dldHdoaXRlLAorCX0sCisJewogCSAgIHsKIAkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKaW5kZXggZDlkNjQ5MS4uNjBkZTlhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAogCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogMyAvIDggKyA1OTAsCkBAIC00MjQsMTAgKzQyNCw4IEBACiAKIAkJLyogYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSAqLwogI2RlZmluZSBTVEtIRFJTWiAxMgotCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLAotCQkJCWRhdGEgKyBTVEtIRFJTWiwgbGVuIC0gU1RLSERSU1opOwotI3VuZGVmIFNUS0hEUlNaCi0JCXJldHVybjsKKwkJZGF0YSArPSBTVEtIRFJTWjsKKwkJbGVuIC09IFNUS0hEUlNaOwogCX0KIAlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRhZDM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIFVTQl9TVFYwNlhYCisJdHJpc3RhdGUgIlNUVjA2WFggVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24KKwkgIHRoZSBTVCBTVFYwNlhYIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3N0djA2eHguCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlYWE5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK29iai0kKENPTkZJR19VU0JfU1RWMDZYWCkgKz0gZ3NwY2Ffc3R2MDZ4eC5vCisKK2dzcGNhX3N0djA2eHgtb2JqcyA6PSBzdHYwNnh4Lm8gXAorCQkgICAgICBzdHYwNnh4X3Z2NjQxMC5vIFwKKwkJICAgICAgc3R2MDZ4eF9oZGNzLm8gXAorCQkgICAgICBzdHYwNnh4X3BiMDEwMC5vCisKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhMDIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVhbi1GcmVkcmljIENsZXJlLCBOaWtvbGFzIFppbW1lcm1hbm4sIEdlb3JnIEFjaGVyCisgKgkJICAgICAgTWFyayBDYXZlLUF5bGFuZCwgQ2FybG8gRSBQcmVseiwgRGljayBTdHJlZWZsYW5kCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVHV1a2thIFRvaXZvbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayBBbmRyw6luCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFAvTiA4NjEwMzc6ICAgICAgU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAxMDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAyMDogU2Vuc29yIFBob3RvYml0IFBCMTAwICBBU0lDIFNUVjA2MDAtMSAtIFF1aWNrQ2FtIEV4cHJlc3MKKyAqIFAvTiA4NjEwNTU6ICAgICAgU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIExFR08gY2FtCisgKiBQL04gODYxMDc1LTAwNDA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQworICogUC9OIDk2MTE3OS0wNzAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYwMiAgIC0gRGV4eGEgV2ViQ2FtIFVTQgorICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCisgKi8KKworI2luY2x1ZGUgInN0djA2eHhfc2Vuc29yLmgiCisKK01PRFVMRV9BVVRIT1IoIkVyaWsgQW5kcsOpbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVFYwNlhYIFVTQiBDYW1lcmEgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZHVtcF9icmlkZ2U7CitzdGF0aWMgaW50IGR1bXBfc2Vuc29yOworCitpbnQgc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc3RydWN0IHNkICpzZCwgdTE2IGFkZHJlc3MsIHUxNiBpMmNfZGF0YSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gc2QtPmdzcGNhX2Rldi5kZXY7CisJX191OCAqYnVmID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCXU4IGxlbiA9IChpMmNfZGF0YSA+IDB4ZmYpID8gMiA6IDE7CisKKwlidWZbMF0gPSBpMmNfZGF0YSAmIDB4ZmY7CisJYnVmWzFdID0gKGkyY19kYXRhID4+IDgpICYgMHhmZjsKKworCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAweDA0LCAweDQwLCBhZGRyZXNzLCAwLCBidWYsIGxlbiwKKwkJCSAgICAgIFNUVjA2WFhfVVJCX01TR19USU1FT1VUKTsKKworCisJUERFQlVHKERfQ09ORiwgIldyaXR0ZW4gMHgleCB0byBhZGRyZXNzIDB4JXgsIHN0YXR1czogJWQiLAorCSAgICAgICBpMmNfZGF0YSwgYWRkcmVzcywgZXJyKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgc3R2MDZ4eF9yZWFkX2JyaWRnZShzdHJ1Y3Qgc2QgKnNkLCB1MTYgYWRkcmVzcywgdTggKmkyY19kYXRhKQoreworCWludCBlcnI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgMHgwNCwgMHhjMCwgYWRkcmVzcywgMCwgYnVmLCAxLAorCQkJICAgICAgU1RWMDZYWF9VUkJfTVNHX1RJTUVPVVQpOworCisJKmkyY19kYXRhID0gYnVmWzBdOworCisJUERFQlVHKERfQ09ORiwgIlJlYWQgMHgleCBmcm9tIGFkZHJlc3MgMHgleCwgc3RhdHVzICVkIiwKKwkgICAgICAgKmkyY19kYXRhLCBhZGRyZXNzLCBlcnIpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKKy8qIFdyYXBzIHRoZSBub3JtYWwgd3JpdGUgc2Vuc29yIGJ5dGVzIC8gd29yZHMgZnVuY3Rpb25zIGZvciB3cml0aW5nIGEKKyAgIHNpbmdsZSB2YWx1ZSAqLworaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIHU4IGFkZHJlc3MsIHUxNiB2YWx1ZSkKK3sKKwlpZiAoc2QtPnNlbnNvci0+aTJjX2xlbiA9PSAyKSB7CisJCXUxNiBkYXRhWzJdID0geyBhZGRyZXNzLCB2YWx1ZSB9OworCQlyZXR1cm4gc3R2MDZ4eF93cml0ZV9zZW5zb3Jfd29yZHMoc2QsIGRhdGEsIDEpOworCX0gZWxzZSB7CisJCXU4IGRhdGFbMl0gPSB7IGFkZHJlc3MsIHZhbHVlIH07CisJCXJldHVybiBzdHYwNnh4X3dyaXRlX3NlbnNvcl9ieXRlcyhzZCwgZGF0YSwgMSk7CisJfQorfQorCitzdGF0aWMgaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yX2ZpbmlzaChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBlcnIgPSAwOworCisJaWYgKElTXzg1MChzZCkpIHsKKwkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwkJX191OCAqYnVmID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCisJCS8qIFF1aWNrYW0gV2ViIG5lZWRzIGFuIGV4dHJhIHBhY2tldCAqLworCQlidWZbMF0gPSAwOworCQllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSAgICAgIDB4MDQsIDB4NDAsIDB4MTcwNCwgMCwgYnVmLCAxLAorCQkJCSAgICAgIFNUVjA2WFhfVVJCX01TR19USU1FT1VUKTsKKwl9CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yX2J5dGVzKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4ICpkYXRhLCB1OCBsZW4pCit7CisJaW50IGVyciwgaSwgajsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OworCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKKworCVBERUJVRyhEX1VTQk8sICJJMkM6IENvbW1hbmQgYnVmZmVyIGNvbnRhaW5zICVkIGVudHJpZXMiLCBsZW4pOworCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7CisJCS8qIEJ1aWxkIHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQltZW1zZXQoYnVmLCAwLCBJMkNfQlVGRkVSX0xFTkdUSCk7CisJCWZvciAoaiA9IDA7IGogPCBJMkNfTUFYX0JZVEVTICYmIGkgPCBsZW47IGorKywgaSsrKSB7CisJCQlidWZbal0gPSBkYXRhWzIqaV07CisJCQlidWZbMHgxMCArIGpdID0gZGF0YVsyKmkrMV07CisJCQlQREVCVUcoRF9VU0JPLCAiSTJDOiBXcml0aW5nIDB4JTAyeCB0byByZWcgMHglMDJ4IiwKKwkJCWRhdGFbMippKzFdLCBkYXRhWzIqaV0pOworCQl9CisJCWJ1ZlsweDIwXSA9IHNkLT5zZW5zb3ItPmkyY19hZGRyOworCQlidWZbMHgyMV0gPSBqIC0gMTsgLyogTnVtYmVyIG9mIGNvbW1hbmRzIHRvIHNlbmQgLSAxICovCisJCWJ1ZlsweDIyXSA9IEkyQ19XUklURV9DTUQ7CisJCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJICAgICAgMHgwNCwgMHg0MCwgMHgwNDAwLCAwLCBidWYsCisJCQkJICAgICAgSTJDX0JVRkZFUl9MRU5HVEgsCisJCQkJICAgICAgU1RWMDZYWF9VUkJfTVNHX1RJTUVPVVQpOworCQkJCSAgICAgIGlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworICAgICAgIH0KKyAgICAgICByZXR1cm4gc3R2MDZ4eF93cml0ZV9zZW5zb3JfZmluaXNoKHNkKTsKK30KKworaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yX3dvcmRzKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHUxNiAqZGF0YSwgdTggbGVuKQoreworCWludCBlcnIsIGksIGo7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwlQREVCVUcoRF9VU0JPLCAiSTJDOiBDb21tYW5kIGJ1ZmZlciBjb250YWlucyAlZCBlbnRyaWVzIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7CisJCS8qIEJ1aWxkIHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQltZW1zZXQoYnVmLCAwLCBJMkNfQlVGRkVSX0xFTkdUSCk7CisJCWZvciAoaiA9IDA7IGogPCBJMkNfTUFYX1dPUkRTICYmIGkgPCBsZW47IGorKywgaSsrKSB7CisJCQlidWZbal0gPSBkYXRhWzIqaV07CisJCQlidWZbMHgxMCArIGogKiAyXSA9IGRhdGFbMippKzFdOworCQkJYnVmWzB4MTAgKyBqICogMiArIDFdID0gZGF0YVsyKmkrMV0gPj4gODsKKwkJCVBERUJVRyhEX1VTQk8sICJJMkM6IFdyaXRpbmcgMHglMDR4IHRvIHJlZyAweCUwMngiLAorCQkJCWRhdGFbMippKzFdLCBkYXRhWzIqaV0pOworCQl9CisJCWJ1ZlsweDIwXSA9IHNkLT5zZW5zb3ItPmkyY19hZGRyOworCQlidWZbMHgyMV0gPSBqIC0gMTsgLyogTnVtYmVyIG9mIGNvbW1hbmRzIHRvIHNlbmQgLSAxICovCisJCWJ1ZlsweDIyXSA9IEkyQ19XUklURV9DTUQ7CisJCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJMHgwNCwgMHg0MCwgMHgwNDAwLCAwLCBidWYsCisJCQkJSTJDX0JVRkZFUl9MRU5HVEgsCisJCQkJU1RWMDZYWF9VUkJfTVNHX1RJTUVPVVQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBzdHYwNnh4X3dyaXRlX3NlbnNvcl9maW5pc2goc2QpOworfQorCitpbnQgc3R2MDZ4eF9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLCB1MTYgKnZhbHVlKQoreworCWludCBlcnI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX0kyQ19GTFVTSCwgc2QtPnNlbnNvci0+aTJjX2ZsdXNoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIENsZWFyIG1lbSAqLworCW1lbXNldChidWYsIDAsIEkyQ19CVUZGRVJfTEVOR1RIKTsKKworCWJ1ZlswXSA9IGFkZHJlc3M7CisJYnVmWzB4MjBdID0gc2QtPnNlbnNvci0+aTJjX2FkZHI7CisJYnVmWzB4MjFdID0gMDsKKworCS8qIFJlYWQgSTJDIHJlZ2lzdGVyICovCisJYnVmWzB4MjJdID0gSTJDX1JFQURfQ01EOworCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgIDB4MDQsIDB4NDAsIDB4MTQwMCwgMCwgYnVmLCBJMkNfQlVGRkVSX0xFTkdUSCwKKwkJCSAgICAgIFNUVjA2WFhfVVJCX01TR19USU1FT1VUKTsKKwlpZiAoZXJyIDwgMCkgeworCQlQREVCVUcoRF9FUlIsICJJMkMgUmVhZDogZXJyb3Igd3JpdGluZyBhZGRyZXNzOiAlZCIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgIDB4MDQsIDB4YzAsIDB4MTQxMCwgMCwgYnVmLCBzZC0+c2Vuc29yLT5pMmNfbGVuLAorCQkJICAgICAgU1RWMDZYWF9VUkJfTVNHX1RJTUVPVVQpOworCWlmIChzZC0+c2Vuc29yLT5pMmNfbGVuID09IDIpCisJCSp2YWx1ZSA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCk7CisJZWxzZQorCQkqdmFsdWUgPSBidWZbMF07CisKKwlQREVCVUcoRF9VU0JPLCAiSTJDOiBSZWFkIDB4JXggZnJvbSBhZGRyZXNzIDB4JXgsIHN0YXR1czogJWQiLAorCSAgICAgICAqdmFsdWUsIGFkZHJlc3MsIGVycik7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworLyogRHVtcHMgYWxsIGJyaWRnZSByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIHN0djA2eHhfZHVtcF9icmlkZ2Uoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgaTsKKwl1OCBkYXRhLCBidWY7CisKKwlpbmZvKCJEdW1waW5nIGFsbCBzdHYwNnh4IGJyaWRnZSByZWdpc3RlcnMiKTsKKwlmb3IgKGkgPSAweDE0MDA7IGkgPCAweDE2MGY7IGkrKykgeworCQlzdHYwNnh4X3JlYWRfYnJpZGdlKHNkLCBpLCAmZGF0YSk7CisKKwkJaW5mbygiUmVhZCAweCV4IGZyb20gYWRkcmVzcyAweCV4IiwgZGF0YSwgaSk7CisJfQorCisJZm9yIChpID0gMHgxNDAwOyBpIDwgMHgxNjBmOyBpKyspIHsKKwkJc3R2MDZ4eF9yZWFkX2JyaWRnZShzZCwgaSwgJmRhdGEpOworCQlidWYgPSBkYXRhOworCisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBpLCAweGZmKTsKKwkJc3R2MDZ4eF9yZWFkX2JyaWRnZShzZCwgaSwgJmRhdGEpOworCQlpZiAoZGF0YSA9PSAweGZmKQorCQkJaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkL3dyaXRlIiwgaSk7CisJCWVsc2UgaWYgKGRhdGEgIT0gYnVmKQorCQkJaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkL3dyaXRlLCIKKwkJCSAgICAgImJ1dCBvbmx5IHBhcnRpYWxseSIsIGkpOworCQllbHNlCisJCQlpbmZvKCJSZWdpc3RlciAweCV4IGlzIHJlYWQtb25seSIsIGkpOworCisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBpLCBidWYpOworCX0KK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHN0djA2eHhfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBlcnI7CisKKwlQREVCVUcoRF9QUk9CRSwgIkluaXRpYWxpemluZyBjYW1lcmEiKTsKKworCS8qIExldCB0aGUgdXNiIGluaXQgc2V0dGxlIGZvciBhIGJpdAorCSAgIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBpbml0aWFsaXphdGlvbiAqLworCW1zbGVlcCgyNTApOworCisJZXJyID0gc2QtPnNlbnNvci0+aW5pdChzZCk7CisKKwlpZiAoZHVtcF9zZW5zb3IpCisJCXNkLT5zZW5zb3ItPmR1bXAoc2QpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKKy8qIFN0YXJ0IHRoZSBjYW1lcmEgKi8KK3N0YXRpYyBpbnQgc3R2MDZ4eF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBlcnI7CisKKwkvKiBQcmVwYXJlIHRoZSBzZW5zb3IgZm9yIHN0YXJ0ICovCisJZXJyID0gc2QtPnNlbnNvci0+c3RhcnQoc2QpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFN0YXJ0IGlzb2Nocm9ub3VzIHN0cmVhbWluZyAqLworCWVyciA9IHN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfSVNPX0VOQUJMRSwgMSk7CisKK291dDoKKwlpZiAoZXJyIDwgMCkKKwkJUERFQlVHKERfU1RSRUFNLCAiU3RhcnRpbmcgc3RyZWFtIGZhaWxlZCIpOworCWVsc2UKKwkJUERFQlVHKERfU1RSRUFNLCAiU3RhcnRlZCBzdHJlYW1pbmciKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitzdGF0aWMgdm9pZCBzdHYwNnh4X3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCS8qIHN0b3AgSVNPLXN0cmVhbWluZyAqLworCWVyciA9IHN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfSVNPX0VOQUJMRSwgMCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gc2QtPnNlbnNvci0+c3RvcChzZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCitvdXQ6CisJaWYgKGVyciA8IDApCisJCVBERUJVRyhEX1NUUkVBTSwgIkZhaWxlZCB0byBzdG9wIHN0cmVhbSIpOworCWVsc2UKKwkJUERFQlVHKERfU1RSRUFNLCAiU3RvcHBlZCBzdHJlYW1pbmciKTsKK30KKworLyoKKyAqIEFuYWx5c2UgYW4gVVNCIHBhY2tldCBvZiB0aGUgZGF0YSBzdHJlYW0gYW5kIHN0b3JlIGl0IGFwcHJvcHJpYXRlbHkuCisgKiBFYWNoIHBhY2tldCBjb250YWlucyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgY2h1bmtzLiBFYWNoIGNodW5rIGhhcworICogMi1ieXRlcyBpZGVudGlmaWNhdGlvbiwgZm9sbG93ZWQgYnkgMi1ieXRlcyB0aGF0IGRlc2NyaWJlIHRoZSBjaHVuaworICogbGVuZ3RoLiBLbm93bi9ndWVzc2VkIGNodW5rIGlkZW50aWZpY2F0aW9ucyBhcmU6CisgKiA4MDAxLzgwMDUvQzAwMS9DMDA1IC0gQmVnaW4gbmV3IGZyYW1lCisgKiA4MDAyLzgwMDYvQzAwMi9DMDA2IC0gRW5kIGZyYW1lCisgKiAwMjAwLzQyMDAgICAgICAgICAgIC0gQ29udGFpbnMgYWN0dWFsIGltYWdlIGRhdGEsIGJheWVyIG9yIGNvbXByZXNzZWQKKyAqIDAwMDUgICAgICAgICAgICAgICAgLSAxMSBieXRlcyBvZiB1bmtub3duIGRhdGEKKyAqIDAxMDAgICAgICAgICAgICAgICAgLSAyIGJ5dGVzIG9mIHVua25vd24gZGF0YQorICogVGhlIDAwMDUgYW5kIDAxMDAgY2h1bmtzIHNlZW0gdG8gYXBwZWFyIG9ubHkgaW4gY29tcHJlc3NlZCBzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIHN0djA2eHhfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwJLyogdGFyZ2V0ICovCisJCQlfX3U4ICpkYXRhLAkJCS8qIGlzb2MgcGFja2V0ICovCisJCQlpbnQgbGVuKQkJCS8qIGlzbyBwYWNrZXQgbGVuZ3RoICovCit7CisJUERFQlVHKERfUEFDSywgIlBhY2tldCBvZiBsZW5ndGggJWQgYXJyaXZlZCIsIGxlbik7CisKKwkvKiBBIHBhY2tldCBtYXkgY29udGFpbiBzZXZlcmFsIGZyYW1lcworCSAgIGxvb3AgdW50aWwgdGhlIHdob2xlIHBhY2tldCBpcyByZWFjaGVkICovCisJd2hpbGUgKGxlbikgeworCQlpbnQgaWQsIGNodW5rX2xlbjsKKworCQlpZiAobGVuIDwgNCkgeworCQkJUERFQlVHKERfUEFDSywgIlBhY2tldCBpcyBzbWFsbGVyIHRoYW4gNCBieXRlcyIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQ2FwdHVyZSB0aGUgaWQgKi8KKwkJaWQgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisKKwkJLyogQ2FwdHVyZSB0aGUgY2h1bmsgbGVuZ3RoICovCisJCWNodW5rX2xlbiA9IChkYXRhWzJdIDw8IDgpIHwgZGF0YVszXTsKKwkJUERFQlVHKERfUEFDSywgIkNodW5rIGlkOiAleCwgbGVuZ3RoOiAlZCIsIGlkLCBjaHVua19sZW4pOworCisJCWRhdGEgKz0gNDsKKwkJbGVuIC09IDQ7CisKKwkJaWYgKGxlbiA8IGNodW5rX2xlbikgeworCQkJUERFQlVHKERfRVJSLCAiVVJCIHBhY2tldCBsZW5ndGggaXMgc21hbGxlciIKKwkJCQkiIHRoYW4gdGhlIHNwZWNpZmllZCBjaHVuayBsZW5ndGgiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSAweDAyMDA6CisJCWNhc2UgMHg0MjAwOgorCQkJUERFQlVHKERfUEFDSywgIkZyYW1lIGRhdGEgcGFja2V0IGRldGVjdGVkIik7CisKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCQkJCWRhdGEsIGNodW5rX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIDB4ODAwMToKKwkJY2FzZSAweDgwMDU6CisJCWNhc2UgMHhjMDAxOgorCQljYXNlIDB4YzAwNToKKwkJCVBERUJVRyhEX1BBQ0ssICJTdGFydGluZyBuZXcgZnJhbWUiKTsKKworCQkJLyogQ3JlYXRlIGEgbmV3IGZyYW1lLCBjaHVuayBsZW5ndGggc2hvdWxkIGJlIHplcm8gKi8KKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKKwkJCQkJZnJhbWUsIGRhdGEsIDApOworCisJCQlpZiAoY2h1bmtfbGVuKQorCQkJCVBERUJVRyhEX0VSUiwgIkNodW5rIGxlbmd0aCBpcyAiCisJCQkJCSAgICAgICJub24temVybyBvbiBhIFNPRiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDgwMDI6CisJCWNhc2UgMHg4MDA2OgorCQljYXNlIDB4YzAwMjoKKwkJCVBERUJVRyhEX1BBQ0ssICJFbmQgb2YgZnJhbWUgZGV0ZWN0ZWQiKTsKKworCQkJLyogQ29tcGxldGUgdGhlIGxhc3QgZnJhbWUgKGlmIGFueSkgKi8KKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwgZGF0YSwgMCk7CisKKwkJCWlmIChjaHVua19sZW4pCisJCQkJUERFQlVHKERfRVJSLCAiQ2h1bmsgbGVuZ3RoIGlzICIKKwkJCQkJICAgICAgIm5vbi16ZXJvIG9uIGEgRU9GIik7CisJCQlicmVhazsKKworCQljYXNlIDB4MDAwNToKKwkJCVBERUJVRyhEX1BBQ0ssICJDaHVuayAweDAwNSBkZXRlY3RlZCIpOworCQkJLyogVW5rbm93biBjaHVuayB3aXRoIDExIGJ5dGVzIG9mIGRhdGEsCisJCQkgICBvY2N1cnMganVzdCBiZWZvcmUgZW5kIG9mIGVhY2ggZnJhbWUKKwkJCSAgIGluIGNvbXByZXNzZWQgbW9kZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAxMDA6CisJCQlQREVCVUcoRF9QQUNLLCAiQ2h1bmsgMHgwMTAwIGRldGVjdGVkIik7CisJCQkvKiBVbmtub3duIGNodW5rIHdpdGggMiBieXRlcyBvZiBkYXRhLAorCQkJICAgb2NjdXJzIDItMyB0aW1lcyBwZXIgVVNCIGludGVycnVwdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQREVCVUcoRF9QQUNLLCAiVW5rbm93biBjaHVuayAlZCBkZXRlY3RlZCIsIGlkKTsKKwkJCS8qIFVua25vd24gY2h1bmsgKi8KKwkJfQorCQlkYXRhICAgICs9IGNodW5rX2xlbjsKKwkJbGVuICAgICAtPSBjaHVua19sZW47CisJfQorfQorCitzdGF0aWMgaW50IHN0djA2eHhfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKKworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuY29uZmlnID0gc3R2MDZ4eF9jb25maWcsCisJLmluaXQgPSBzdHYwNnh4X2luaXQsCisJLnN0YXJ0ID0gc3R2MDZ4eF9zdGFydCwKKwkuc3RvcE4gPSBzdHYwNnh4X3N0b3BOLAorCS5wa3Rfc2NhbiA9IHN0djA2eHhfcGt0X3NjYW4KK307CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KK3N0YXRpYyBpbnQgc3R2MDZ4eF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbTsKKworCVBERUJVRyhEX1BST0JFLCAiQ29uZmlndXJpbmcgY2FtZXJhIik7CisKKwljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJY2FtLT5lcGFkZHIgPSBTVFZfSVNPQ19FTkRQT0lOVF9BRERSOworCXNkLT5kZXNjID0gc2RfZGVzYzsKKwlnc3BjYV9kZXYtPnNkX2Rlc2MgPSAmc2QtPmRlc2M7CisKKwlpZiAoZHVtcF9icmlkZ2UpCisJCXN0djA2eHhfZHVtcF9icmlkZ2Uoc2QpOworCisJc2QtPnNlbnNvciA9ICZzdHYwNnh4X3NlbnNvcl92djY0MTA7CisJaWYgKCFzZC0+c2Vuc29yLT5wcm9iZShzZCkpCisJCXJldHVybiAwOworCisJc2QtPnNlbnNvciA9ICZzdHYwNnh4X3NlbnNvcl9oZGNzMXgwMDsKKwlpZiAoIXNkLT5zZW5zb3ItPnByb2JlKHNkKSkKKwkJcmV0dXJuIDA7CisKKwlzZC0+c2Vuc29yID0gJnN0djA2eHhfc2Vuc29yX2hkY3MxMDIwOworCWlmICghc2QtPnNlbnNvci0+cHJvYmUoc2QpKQorCQlyZXR1cm4gMDsKKworCXNkLT5zZW5zb3IgPSAmc3R2MDZ4eF9zZW5zb3JfcGIwMTAwOworCWlmICghc2QtPnNlbnNvci0+cHJvYmUoc2QpKQorCQlyZXR1cm4gMDsKKworCXNkLT5zZW5zb3IgPSBOVUxMOworCXJldHVybiAtRU5PREVWOworfQorCisKKworLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCitzdGF0aWMgY29uc3QgX19kZXZpbml0ZGF0YSBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDg0MCl9LCAvKiBRdWlja0NhbSBFeHByZXNzICovCisJe1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4NTApfSwgLyogTEVHTyBjYW0gLyBRdWlja0NhbSBXZWIgKi8KKwl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDg3MCl9LCAvKiBEZXh4YSBXZWJDYW0gVVNCICovCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJUERFQlVHKERfUFJPQkUsICJQcm9iaW5nIGZvciBhIHN0djA2eHggZGV2aWNlIik7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJICAgICAgIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgc2RfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlQREVCVUcoRF9QUk9CRSwgIkRpc2Nvbm5lY3RpbmcgdGhlIHN0djA2eHggZGV2aWNlIik7CisKKwlpZiAoc2QtPnNlbnNvci0+ZGlzY29ubmVjdCkKKwkJc2QtPnNlbnNvci0+ZGlzY29ubmVjdChzZCk7CisJZ3NwY2FfZGlzY29ubmVjdChpbnRmKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHNkX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJaWYgKHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKSA8IDApCisJCXJldHVybiAtMTsKKwlQREVCVUcoRF9QUk9CRSwgInJlZ2lzdGVyZWQiKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZF9tb2RfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOworCVBERUJVRyhEX1BST0JFLCAiZGVyZWdpc3RlcmVkIik7Cit9CisKK21vZHVsZV9pbml0KHNkX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHNkX21vZF9leGl0KTsKKworbW9kdWxlX3BhcmFtKGR1bXBfYnJpZGdlLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBfYnJpZGdlLCAiRHVtcHMgYWxsIHVzYiBicmlkZ2UgcmVnaXN0ZXJzIGF0IHN0YXJ0dXAiKTsKKworbW9kdWxlX3BhcmFtKGR1bXBfc2Vuc29yLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBfc2Vuc29yLCAiRHVtcHMgYWxsIHNlbnNvciByZWdpc3RlcnMgYXQgc3RhcnR1cCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwN2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVhbi1GcmVkcmljIENsZXJlLCBOaWtvbGFzIFppbW1lcm1hbm4sIEdlb3JnIEFjaGVyCisgKgkJICAgICAgTWFyayBDYXZlLUF5bGFuZCwgQ2FybG8gRSBQcmVseiwgRGljayBTdHJlZWZsYW5kCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVHV1a2thIFRvaXZvbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayBBbmRyw6luCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFAvTiA4NjEwMzc6ICAgICAgU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAxMDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAyMDogU2Vuc29yIFBob3RvYml0IFBCMTAwICBBU0lDIFNUVjA2MDAtMSAtIFF1aWNrQ2FtIEV4cHJlc3MKKyAqIFAvTiA4NjEwNTU6ICAgICAgU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIExFR08gY2FtCisgKiBQL04gODYxMDc1LTAwNDA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQworICogUC9OIDk2MTE3OS0wNzAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYwMiAgIC0gRGV4eGEgV2ViQ2FtIFVTQgorICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCisgKi8KKworI2lmbmRlZiBTVFYwNlhYX0hfCisjZGVmaW5lIFNUVjA2WFhfSF8KKworI2luY2x1ZGUgImdzcGNhLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgIlNUVjA2eHgiCisKKyNkZWZpbmUgU1RWX0lTT0NfRU5EUE9JTlRfQUREUgkJMHg4MQorCisjaWZuZGVmIFY0TDJfUElYX0ZNVF9TR1JCRzgKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHOCB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpCisjZW5kaWYKKworI2RlZmluZSBTVFZfUkVHMjMgCQkJMHgwNDIzCisKKy8qIENvbnRyb2wgcmVnaXN0ZXJzIG9mIHRoZSBTVFYwNjAwIEFTSUMgKi8KKyNkZWZpbmUgU1RWX0kyQ19QQVJUTkVSCQkJMHgxNDIwCisjZGVmaW5lIFNUVl9JMkNfVkFMX1JFR19WQUxfUEFJUlNfTUlOMQkweDE0MjEKKyNkZWZpbmUgU1RWX0kyQ19SRUFEX1dSSVRFX1RPR0dMRQkweDE0MjIKKyNkZWZpbmUgU1RWX0kyQ19GTFVTSAkJCTB4MTQyMworI2RlZmluZSBTVFZfSTJDX1NVQ0NfUkVBRF9SRUdfVkFMUwkweDE0MjQKKworI2RlZmluZSBTVFZfSVNPX0VOQUJMRQkJCTB4MTQ0MAorI2RlZmluZSBTVFZfU0NBTl9SQVRFCQkJMHgxNDQzCisjZGVmaW5lIFNUVl9MRURfQ1RSTAkJCTB4MTQ0NQorI2RlZmluZSBTVFZfU1RWMDYwMF9FTVVMQVRJT04JCTB4MTQ0NgorI2RlZmluZSBTVFZfUkVHMDAJCQkweDE1MDAKKyNkZWZpbmUgU1RWX1JFRzAxCQkJMHgxNTAxCisjZGVmaW5lIFNUVl9SRUcwMgkJCTB4MTUwMgorI2RlZmluZSBTVFZfUkVHMDMJCQkweDE1MDMKKyNkZWZpbmUgU1RWX1JFRzA0CQkJMHgxNTA0CisKKyNkZWZpbmUgU1RWX0lTT19TSVpFX0wJCQkweDE1YzEKKyNkZWZpbmUgU1RWX0lTT19TSVpFX0gJCQkweDE1YzIKKworLyogUmVmZXJzIHRvIHRoZSBDSUYgMzUyeDI4OCBhbmQgUUNJRiAxNzZ4MTQ0ICovCisvKiAxOiAyODggbGluZXMsIDI6IDE0NCBsaW5lcyAqLworI2RlZmluZSBTVFZfWV9DVFJMCQkJMHgxNWMzCisKKy8qIDB4YTogMzUyIGNvbHVtbnMsIDB4NjogMTc2IGNvbHVtbnMgKi8KKyNkZWZpbmUgU1RWX1hfQ1RSTAkJCTB4MTY4MAorCisjZGVmaW5lIFNUVjA2WFhfVVJCX01TR19USU1FT1VUCQk1MDAwCisKKyNkZWZpbmUgSTJDX01BWF9CWVRFUwkJCTE2CisjZGVmaW5lIEkyQ19NQVhfV09SRFMJCQk4CisKKyNkZWZpbmUgSTJDX0JVRkZFUl9MRU5HVEgJCTB4MjMKKyNkZWZpbmUgSTJDX1JFQURfQ01ECQkJMworI2RlZmluZSBJMkNfV1JJVEVfQ01ECQkJMQorCisjZGVmaW5lIExFRF9PTgkJCQkxCisjZGVmaW5lIExFRF9PRkYJCQkJMAorCisvKiBTVFYwNnh4IGRldmljZSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OworCisJLyogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHNlbnNvciAqLworCWNvbnN0IHN0cnVjdCBzdHYwNnh4X3NlbnNvciAqc2Vuc29yOworCisJLyogQSBwb2ludGVyIHRvIHRoZSBzZF9kZXNjIHN0cnVjdCAqLworCXN0cnVjdCBzZF9kZXNjIGRlc2M7CisKKwkvKiBTZW5zb3IgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqc2Vuc29yX3ByaXY7Cit9OworCitpbnQgc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc3RydWN0IHNkICpzZCwgdTE2IGFkZHJlc3MsIHUxNiBpMmNfZGF0YSk7CitpbnQgc3R2MDZ4eF9yZWFkX2JyaWRnZShzdHJ1Y3Qgc2QgKnNkLCB1MTYgYWRkcmVzcywgdTggKmkyY19kYXRhKTsKKworaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yX2J5dGVzKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4ICpkYXRhLCB1OCBsZW4pOworaW50IHN0djA2eHhfd3JpdGVfc2Vuc29yX3dvcmRzKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHUxNiAqZGF0YSwgdTggbGVuKTsKKworaW50IHN0djA2eHhfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywgdTE2ICp2YWx1ZSk7CitpbnQgc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgdTggYWRkcmVzcywgdTE2IHZhbHVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMzVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBKZWFuLUZyZWRyaWMgQ2xlcmUsIE5pa29sYXMgWmltbWVybWFubiwgR2VvcmcgQWNoZXIKKyAqCQkgICAgICBNYXJrIENhdmUtQXlsYW5kLCBDYXJsbyBFIFByZWx6LCBEaWNrIFN0cmVlZmxhbmQKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBUdXVra2EgVG9pdm9uZW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIEFuZHLDqW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGlhLUkgV3UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogUC9OIDg2MTAzNzogICAgICBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDEwOiBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDIwOiBTZW5zb3IgUGhvdG9iaXQgUEIxMDAgIEFTSUMgU1RWMDYwMC0xIC0gUXVpY2tDYW0gRXhwcmVzcworICogUC9OIDg2MTA1NTogICAgICBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gTEVHTyBjYW0KKyAqIFAvTiA4NjEwNzUtMDA0MDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDCisgKiBQL04gOTYxMTc5LTA3MDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjAyICAgLSBEZXh4YSBXZWJDYW0gVVNCCisgKiBQL04gODYxMDQwLTAwMDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBRdWlja0NhbSBXZWIKKyAqLworCisjaW5jbHVkZSAic3R2MDZ4eF9oZGNzLmgiCisKK2VudW0gaGRjc19wb3dlcl9zdGF0ZSB7CisJSERDU19TVEFURV9TTEVFUCwKKwlIRENTX1NUQVRFX0lETEUsCisJSERDU19TVEFURV9SVU4KK307CisKKy8qIG5vIGxvY2s/ICovCitzdHJ1Y3QgaGRjcyB7CisJZW51bSBoZGNzX3Bvd2VyX3N0YXRlIHN0YXRlOworCWludCB3LCBoOworCisJLyogdmlzaWJsZSBhcmVhIG9mIHRoZSBzZW5zb3IgYXJyYXkgKi8KKwlzdHJ1Y3QgeworCQlpbnQgbGVmdCwgdG9wOworCQlpbnQgd2lkdGgsIGhlaWdodDsKKwkJaW50IGJvcmRlcjsKKwl9IGFycmF5OworCisJc3RydWN0IHsKKwkJLyogQ29sdW1uIHRpbWluZyBvdmVyaGVhZCAqLworCQl1OCBjdG87CisJCS8qIENvbHVtbiBwcm9jZXNzaW5nIG92ZXJoZWFkICovCisJCXU4IGNwbzsKKwkJLyogUm93IHNhbXBsZSBwZXJpb2QgY29uc3RhbnQgKi8KKwkJdTE2IHJzOworCQkvKiBFeHBvc3VyZSByZXNldCBkdXJhdGlvbiAqLworCQl1MTYgZXI7CisJfSBleHA7CisKKwlpbnQgcHNtcDsKK307CisKK3N0YXRpYyBpbnQgaGRjc19yZWdfd3JpdGVfc2VxKHN0cnVjdCBzZCAqc2QsIHU4IHJlZywgdTggKnZhbHMsIHU4IGxlbikKK3sKKwl1OCByZWdzW0kyQ19NQVhfQllURVMgKiAyXTsKKwlpbnQgaTsKKworCWlmICh1bmxpa2VseSgobGVuIDw9IDApIHx8IChsZW4gPj0gSTJDX01BWF9CWVRFUykgfHwKKwkJICAgICAocmVnICsgbGVuID4gMHhmZikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgcmVnKyspIHsKKwkJcmVnc1syKmldID0gcmVnOworCQlyZWdzWzIqaSsxXSA9IHZhbHNbaV07CisJfQorCisJcmV0dXJuIHN0djA2eHhfd3JpdGVfc2Vuc29yX2J5dGVzKHNkLCByZWdzLCBsZW4pOworfQorCitzdGF0aWMgaW50IGhkY3Nfc2V0X3N0YXRlKHN0cnVjdCBzZCAqc2QsIGVudW0gaGRjc19wb3dlcl9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaGRjcyAqaGRjcyA9IHNkLT5zZW5zb3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCWlmIChoZGNzLT5zdGF0ZSA9PSBzdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiB3ZSBuZWVkIHRvIGdvIGlkbGUgYmVmb3JlIHJ1bm5pbmcgb3Igc2xlZXBpbmcgKi8KKwlpZiAoaGRjcy0+c3RhdGUgIT0gSERDU19TVEFURV9JRExFKSB7CisJCXJldCA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBIRENTX1JFR19DT05UUk9MKHNkKSwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWhkY3MtPnN0YXRlID0gSERDU19TVEFURV9JRExFOworCisJaWYgKHN0YXRlID09IEhEQ1NfU1RBVEVfSURMRSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBIRENTX1NUQVRFX1NMRUVQOgorCQl2YWwgPSBIRENTX1NMRUVQX01PREU7CisJCWJyZWFrOworCisJY2FzZSBIRENTX1NUQVRFX1JVTjoKKwkJdmFsID0gSERDU19SVU5fRU5BQkxFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBIRENTX1JFR19DT05UUk9MKHNkKSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJaGRjcy0+c3RhdGUgPSBzdGF0ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGRjc19yZXNldChzdHJ1Y3Qgc2QgKnNkKQoreworCXN0cnVjdCBoZGNzICpoZGNzID0gc2QtPnNlbnNvcl9wcml2OworCWludCBlcnI7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgSERDU19SRUdfQ09OVFJPTChzZCksIDEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIEhEQ1NfUkVHX0NPTlRST0woc2QpLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJaGRjcy0+c3RhdGUgPSBIRENTX1NUQVRFX0lETEU7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhkY3NfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RydWN0IGhkY3MgKmhkY3MgPSBzZC0+c2Vuc29yX3ByaXY7CisKKwkvKiBDb2x1bW4gdGltZSBwZXJpb2QgKi8KKwlpbnQgY3Q7CisJLyogQ29sdW1uIHByb2Nlc3NpbmcgcGVyaW9kICovCisJaW50IGNwOworCS8qIFJvdyBwcm9jZXNzaW5nIHBlcmlvZCAqLworCWludCBycDsKKwlpbnQgY3ljbGVzOworCWludCBlcnI7CisJaW50IHJvd2V4cDsKKwl1MTYgZGF0YVsyXTsKKworCWVyciA9IHN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIEhEQ1NfUk9XRVhQTCwgJmRhdGFbMF0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgSERDU19ST1dFWFBILCAmZGF0YVsxXSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyb3dleHAgPSAoZGF0YVsxXSA8PCA4KSB8IGRhdGFbMF07CisKKwljdCA9IGhkY3MtPmV4cC5jdG8gKyBoZGNzLT5wc21wICsgKEhEQ1NfQURDX1NUQVJUX1NJR19EVVIgKyAyKTsKKwljcCA9IGhkY3MtPmV4cC5jdG8gKyAoaGRjcy0+dyAqIGN0IC8gMik7CisJcnAgPSBoZGNzLT5leHAucnMgKyBjcDsKKworCWN5Y2xlcyA9IHJwICogcm93ZXhwOworCSp2YWwgPSBjeWNsZXMgLyBIRENTX0NMS19GUkVRX01IWjsKKwlQREVCVUcoRF9WNEwyLCAiUmVhZCBleHBvc3VyZSAlZCIsICp2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkY3Nfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzdHJ1Y3QgaGRjcyAqaGRjcyA9IHNkLT5zZW5zb3JfcHJpdjsKKwlpbnQgcm93ZXhwLCBzcm93ZXhwOworCWludCBtYXhfc3Jvd2V4cDsKKwkvKiBDb2x1bW4gdGltZSBwZXJpb2QgKi8KKwlpbnQgY3Q7CisJLyogQ29sdW1uIHByb2Nlc3NpbmcgcGVyaW9kICovCisJaW50IGNwOworCS8qIFJvdyBwcm9jZXNzaW5nIHBlcmlvZCAqLworCWludCBycDsKKwkvKiBNaW5pbXVtIG51bWJlciBvZiBjb2x1bW4gdGltaW5nIHBlcmlvZHMKKwkgICB3aXRoaW4gdGhlIGNvbHVtbiBwcm9jZXNzaW5nIHBlcmlvZCAqLworCWludCBtbmN0OworCWludCBjeWNsZXMsIGVycjsKKwl1OCBleHBbNF07CisKKwljeWNsZXMgPSB2YWwgKiBIRENTX0NMS19GUkVRX01IWjsKKworCWN0ID0gaGRjcy0+ZXhwLmN0byArIGhkY3MtPnBzbXAgKyAoSERDU19BRENfU1RBUlRfU0lHX0RVUiArIDIpOworCWNwID0gaGRjcy0+ZXhwLmN0byArIChoZGNzLT53ICogY3QgLyAyKTsKKworCS8qIHRoZSBjeWNsZXMgb25lIHJvdyB0YWtlcyAqLworCXJwID0gaGRjcy0+ZXhwLnJzICsgY3A7CisKKwlyb3dleHAgPSBjeWNsZXMgLyBycDsKKworCS8qIHRoZSByZW1haW5pbmcgY3ljbGVzICovCisJY3ljbGVzIC09IHJvd2V4cCAqIHJwOworCisJLyogY2FsY3VsYXRlIHN1Yi1yb3cgZXhwb3N1cmUgKi8KKwlpZiAoSVNfMTAyMChzZCkpIHsKKwkJLyogc2VlIEhEQ1MtMTAyMCBkYXRhc2hlZXQgMy41LjYuNCwgcC4gNjMgKi8KKwkJc3Jvd2V4cCA9IGhkY3MtPncgLSAoY3ljbGVzICsgaGRjcy0+ZXhwLmVyICsgMTMpIC8gY3Q7CisKKwkJbW5jdCA9IChoZGNzLT5leHAuZXIgKyAxMiArIGN0IC0gMSkgLyBjdDsKKwkJbWF4X3Nyb3dleHAgPSBoZGNzLT53IC0gbW5jdDsKKwl9IGVsc2UgeworCQkvKiBzZWUgSERDUy0xMDAwIGRhdGFzaGVldCAzLjQuNS41LCBwLiA2MSAqLworCQlzcm93ZXhwID0gY3AgLSBoZGNzLT5leHAuZXIgLSA2IC0gY3ljbGVzOworCisJCW1uY3QgPSAoaGRjcy0+ZXhwLmVyICsgNSArIGN0IC0gMSkgLyBjdDsKKwkJbWF4X3Nyb3dleHAgPSBjcCAtIG1uY3QgKiBjdCAtIDE7CisJfQorCisJaWYgKHNyb3dleHAgPCAwKQorCQlzcm93ZXhwID0gMDsKKwllbHNlIGlmIChzcm93ZXhwID4gbWF4X3Nyb3dleHApCisJCXNyb3dleHAgPSBtYXhfc3Jvd2V4cDsKKworCWlmIChJU18xMDIwKHNkKSkgeworCQlleHBbMF0gPSByb3dleHAgJiAweGZmOworCQlleHBbMV0gPSByb3dleHAgPj4gODsKKwkJZXhwWzJdID0gKHNyb3dleHAgPj4gMikgJiAweGZmOworCQkvKiB0aGlzIGNsZWFycyBleHBvc3VyZSBlcnJvciBmbGFnICovCisJCWV4cFszXSA9IDB4MTsKKwkJZXJyID0gaGRjc19yZWdfd3JpdGVfc2VxKHNkLCBIRENTX1JPV0VYUEwsIGV4cCwgNCk7CisJfSBlbHNlIHsKKwkJZXhwWzBdID0gcm93ZXhwICYgMHhmZjsKKwkJZXhwWzFdID0gcm93ZXhwID4+IDg7CisJCWV4cFsyXSA9IHNyb3dleHAgJiAweGZmOworCQlleHBbM10gPSBzcm93ZXhwID4+IDg7CisJCWVyciA9IGhkY3NfcmVnX3dyaXRlX3NlcShzZCwgSERDU19ST1dFWFBMLCBleHAsIDQpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJLyogY2xlYXIgZXhwb3N1cmUgZXJyb3IgZmxhZyAqLworCQllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwKKwkJICAgICBIRENTX1NUQVRVUywgQklUKDQpKTsKKwl9CisJUERFQlVHKERfVjRMMiwgIldyaXRpbmcgZXhwb3N1cmUgJWQsIHJvd2V4cCAlZCwgc3Jvd2V4cCAlZCIsCisJICAgICAgIHZhbCwgcm93ZXhwLCBzcm93ZXhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhkY3Nfc2V0X2dhaW5zKHN0cnVjdCBzZCAqc2QsIHU4IHIsIHU4IGcsIHU4IGIpCit7CisJdTggZ2FpbnNbNF07CisKKwkvKiB0aGUgdm9sdGFnZSBnYWluIEF2ID0gKDEgKyAxOSAqIHZhbCAvIDEyNykgKiAoMSArIGJpdDcpICovCisJaWYgKHIgPiAxMjcpCisJCXIgPSAweDgwIHwgKHIgLyAyKTsKKwlpZiAoZyA+IDEyNykKKwkJZyA9IDB4ODAgfCAoZyAvIDIpOworCWlmIChiID4gMTI3KQorCQliID0gMHg4MCB8IChiIC8gMik7CisKKwlnYWluc1swXSA9IGc7CisJZ2FpbnNbMV0gPSByOworCWdhaW5zWzJdID0gYjsKKwlnYWluc1szXSA9IGc7CisKKwlyZXR1cm4gaGRjc19yZWdfd3JpdGVfc2VxKHNkLCBIRENTX0VSRUNQR0EsIGdhaW5zLCA0KTsKK30KKworc3RhdGljIGludCBoZGNzX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGVycjsKKwl1MTYgZGF0YTsKKworCWVyciA9IHN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIEhEQ1NfRVJFQ1BHQSwgJmRhdGEpOworCisJLyogQml0IDcgZG91YmxlcyB0aGUgZ2FpbiAqLworCWlmIChkYXRhICYgMHg4MCkKKwkJKnZhbCA9IChkYXRhICYgMHg3ZikgKiAyOworCWVsc2UKKwkJKnZhbCA9IGRhdGE7CisKKwlQREVCVUcoRF9WNEwyLCAiUmVhZCBnYWluICVkIiwgKnZhbCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoZGNzX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCVBERUJVRyhEX1Y0TDIsICJXcml0aW5nIGdhaW4gJWQiLCB2YWwpOworCXJldHVybiBoZGNzX3NldF9nYWlucygoc3RydWN0IHNkICopIGdzcGNhX2RldiwKKwkJCSAgICAgICB2YWwgJiAweGZmLCB2YWwgJiAweGZmLCB2YWwgJiAweGZmKTsKK30KKworc3RhdGljIGludCBoZGNzX3NldF9zaXplKHN0cnVjdCBzZCAqc2QsCisJCXVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKwlzdHJ1Y3QgaGRjcyAqaGRjcyA9IHNkLT5zZW5zb3JfcHJpdjsKKwl1OCB3aW5bNF07CisJdW5zaWduZWQgaW50IHgsIHk7CisJaW50IGVycjsKKworCS8qIG11c3QgYmUgbXVsdGlwbGUgb2YgNCAqLworCXdpZHRoID0gKHdpZHRoICsgMykgJiB+MHgzOworCWhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4weDM7CisKKwlpZiAod2lkdGggPiBoZGNzLT5hcnJheS53aWR0aCkKKwkJd2lkdGggPSBoZGNzLT5hcnJheS53aWR0aDsKKworCWlmIChJU18xMDIwKHNkKSkgeworCQkvKiB0aGUgYm9yZGVycyBhcmUgYWxzbyBpbnZhbGlkICovCisJCWlmIChoZWlnaHQgKyAyICogaGRjcy0+YXJyYXkuYm9yZGVyICsgSERDU18xMDIwX0JPVFRPTV9ZX1NLSVAKKwkJCQkgID4gaGRjcy0+YXJyYXkuaGVpZ2h0KQorCQkJaGVpZ2h0ID0gaGRjcy0+YXJyYXkuaGVpZ2h0IC0gMiAqIGhkY3MtPmFycmF5LmJvcmRlciAtCisJCQkJSERDU18xMDIwX0JPVFRPTV9ZX1NLSVA7CisKKwkJeSA9IChoZGNzLT5hcnJheS5oZWlnaHQgLSBIRENTXzEwMjBfQk9UVE9NX1lfU0tJUCAtIGhlaWdodCkgLyAyCisJCQkJKyBoZGNzLT5hcnJheS50b3A7CisJfSBlbHNlIHsKKwkJaWYgKGhlaWdodCA+IGhkY3MtPmFycmF5LmhlaWdodCkKKwkJCWhlaWdodCA9IGhkY3MtPmFycmF5LmhlaWdodDsKKworCQl5ID0gaGRjcy0+YXJyYXkudG9wICsgKGhkY3MtPmFycmF5LmhlaWdodCAtIGhlaWdodCkgLyAyOworCX0KKworCXggPSBoZGNzLT5hcnJheS5sZWZ0ICsgKGhkY3MtPmFycmF5LndpZHRoIC0gd2lkdGgpIC8gMjsKKworCXdpblswXSA9IHkgLyA0OworCXdpblsxXSA9IHggLyA0OworCXdpblsyXSA9ICh5ICsgaGVpZ2h0KSAvIDQgLSAxOworCXdpblszXSA9ICh4ICsgd2lkdGgpIC8gNCAtIDE7CisKKwllcnIgPSBoZGNzX3JlZ193cml0ZV9zZXEoc2QsIEhEQ1NfRldST1csIHdpbiwgNCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodCAqLworCWhkY3MtPncgPSB3aWR0aDsKKwloZGNzLT5oID0gaGVpZ2h0OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaGRjc19wcm9iZV8xeDAwKHN0cnVjdCBzZCAqc2QpCit7CisJc3RydWN0IGhkY3MgKmhkY3M7CisJdTE2IHNlbnNvcjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgSERDU19JREVOVCwgJnNlbnNvcik7CisJaWYgKHJldCA8IDAgfHwgc2Vuc29yICE9IDB4MDgpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbygiSERDUy0xMDAwLzExMDAgc2Vuc29yIGRldGVjdGVkIik7CisKKwlzZC0+Z3NwY2FfZGV2LmNhbS5jYW1fbW9kZSA9IHN0djA2eHhfc2Vuc29yX2hkY3MxeDAwLm1vZGVzOworCXNkLT5nc3BjYV9kZXYuY2FtLm5tb2RlcyA9IHN0djA2eHhfc2Vuc29yX2hkY3MxeDAwLm5tb2RlczsKKwlzZC0+ZGVzYy5jdHJscyA9IHN0djA2eHhfc2Vuc29yX2hkY3MxeDAwLmN0cmxzOworCXNkLT5kZXNjLm5jdHJscyA9IHN0djA2eHhfc2Vuc29yX2hkY3MxeDAwLm5jdHJsczsKKworCWhkY3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGRjcyksIEdGUF9LRVJORUwpOworCWlmICghaGRjcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZGNzLT5hcnJheS5sZWZ0ID0gODsKKwloZGNzLT5hcnJheS50b3AgPSA4OworCWhkY3MtPmFycmF5LndpZHRoID0gSERDU18xWDAwX0RFRl9XSURUSDsKKwloZGNzLT5hcnJheS5oZWlnaHQgPSBIRENTXzFYMDBfREVGX0hFSUdIVDsKKwloZGNzLT5hcnJheS5ib3JkZXIgPSA0OworCisJaGRjcy0+ZXhwLmN0byA9IDQ7CisJaGRjcy0+ZXhwLmNwbyA9IDI7CisJaGRjcy0+ZXhwLnJzID0gMTg2OworCWhkY3MtPmV4cC5lciA9IDEwMDsKKworCS8qCisJICogRnJhbWUgcmF0ZSBvbiBIRENTLTEwMDAgMHg0NkQ6MHg4NDAgZGVwZW5kcyBvbiBQU01QOgorCSAqICA0ID0gZG9lc24ndCB3b3JrIGF0IGFsbAorCSAqICA1ID0gNy44IGZwcywKKwkgKiAgNiA9IDYuOSBmcHMsCisJICogIDggPSA2LjMgZnBzLAorCSAqIDEwID0gNS41IGZwcywKKwkgKiAxNSA9IDQuNCBmcHMsCisJICogMzEgPSAyLjggZnBzCisJICoKKwkgKiBGcmFtZSByYXRlIG9uIEhEQ1MtMTAwMCAweDQ2RDoweDg3MCBkZXBlbmRzIG9uIFBTTVA6CisJICogMTUgPSBkb2Vzbid0IHdvcmsgYXQgYWxsCisJICogMTggPSBkb2Vzbid0IHdvcmsgYXQgYWxsCisJICogMTkgPSA3LjMgZnBzCisJICogMjAgPSA3LjQgZnBzCisJICogMjEgPSA3LjQgZnBzCisJICogMjIgPSA3LjQgZnBzCisJICogMjQgPSA2LjMgZnBzCisJICogMzAgPSA1LjQgZnBzCisJICovCisJaGRjcy0+cHNtcCA9IElTXzg3MChzZCkgPyAyMCA6IDU7CisKKwlzZC0+c2Vuc29yX3ByaXYgPSBoZGNzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRjc19wcm9iZV8xMDIwKHN0cnVjdCBzZCAqc2QpCit7CisJc3RydWN0IGhkY3MgKmhkY3M7CisJdTE2IHNlbnNvcjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgSERDU19JREVOVCwgJnNlbnNvcik7CisJaWYgKHJldCA8IDAgfHwgc2Vuc29yICE9IDB4MTApCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbygiSERDUy0xMDIwIHNlbnNvciBkZXRlY3RlZCIpOworCisJc2QtPmdzcGNhX2Rldi5jYW0uY2FtX21vZGUgPSBzdHYwNnh4X3NlbnNvcl9oZGNzMTAyMC5tb2RlczsKKwlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBzdHYwNnh4X3NlbnNvcl9oZGNzMTAyMC5ubW9kZXM7CisJc2QtPmRlc2MuY3RybHMgPSBzdHYwNnh4X3NlbnNvcl9oZGNzMTAyMC5jdHJsczsKKwlzZC0+ZGVzYy5uY3RybHMgPSBzdHYwNnh4X3NlbnNvcl9oZGNzMTAyMC5uY3RybHM7CisKKwloZGNzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhkY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhkY3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBGcm9tIEFuZHJleSdzIHRlc3QgaW1hZ2U6IGxvb2tzIGxpa2UgSERDUy0xMDIwIHVwcGVyLWxlZnQKKwkgKiB2aXNpYmxlIHBpeGVsIGlzIGF0IDI0LDggKHkgbWF5YmUgZXZlbiBzbWFsbGVyPykgYW5kIGxvd2VyLXJpZ2h0CisJICogdmlzaWJsZSBwaXhlbCBhdCAzNzUsMjk5ICh4IG1heWJlIGV2ZW4gbGFyZ2VyPykKKwkgKi8KKwloZGNzLT5hcnJheS5sZWZ0ID0gMjQ7CisJaGRjcy0+YXJyYXkudG9wICA9IDQ7CisJaGRjcy0+YXJyYXkud2lkdGggPSBIRENTXzEwMjBfREVGX1dJRFRIOworCWhkY3MtPmFycmF5LmhlaWdodCA9IDMwNDsKKwloZGNzLT5hcnJheS5ib3JkZXIgPSA0OworCisJaGRjcy0+cHNtcCA9IDY7CisKKwloZGNzLT5leHAuY3RvID0gMzsKKwloZGNzLT5leHAuY3BvID0gMzsKKwloZGNzLT5leHAucnMgPSAxNTU7CisJaGRjcy0+ZXhwLmVyID0gOTY7CisKKwlzZC0+c2Vuc29yX3ByaXYgPSBoZGNzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRjc19zdGFydChzdHJ1Y3Qgc2QgKnNkKQoreworCVBERUJVRyhEX1NUUkVBTSwgIlN0YXJ0aW5nIHN0cmVhbSIpOworCisJcmV0dXJuIGhkY3Nfc2V0X3N0YXRlKHNkLCBIRENTX1NUQVRFX1JVTik7Cit9CisKK3N0YXRpYyBpbnQgaGRjc19zdG9wKHN0cnVjdCBzZCAqc2QpCit7CisJUERFQlVHKERfU1RSRUFNLCAiSGFsdGluZyBzdHJlYW0iKTsKKworCXJldHVybiBoZGNzX3NldF9zdGF0ZShzZCwgSERDU19TVEFURV9TTEVFUCk7Cit9CisKK3N0YXRpYyB2b2lkIGhkY3NfZGlzY29ubmVjdChzdHJ1Y3Qgc2QgKnNkKQoreworCVBERUJVRyhEX1BST0JFLCAiRGlzY29ubmVjdGluZyB0aGUgc2Vuc29yIik7CisJa2ZyZWUoc2QtPnNlbnNvcl9wcml2KTsKK30KKworc3RhdGljIGludCBoZGNzX2luaXQoc3RydWN0IHNkICpzZCkKK3sKKwlzdHJ1Y3QgaGRjcyAqaGRjcyA9IHNkLT5zZW5zb3JfcHJpdjsKKwlpbnQgaSwgZXJyID0gMDsKKworCS8qIFNldCB0aGUgU1RWMDYwMkFBIGluIFNUVjA2MDAgZW11bGF0aW9uIG1vZGUgKi8KKwlpZiAoSVNfODcwKHNkKSkKKwkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9TVFYwNjAwX0VNVUxBVElPTiwgMSk7CisKKwkvKiBFeGVjdXRlIHRoZSBicmlkZ2UgaW5pdCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0dl9icmlkZ2VfaW5pdCkgJiYgIWVycjsgaSsrKSB7CisJCWVyciA9IHN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBzdHZfYnJpZGdlX2luaXRbaV1bMF0sCisJCQkJCSAgIHN0dl9icmlkZ2VfaW5pdFtpXVsxXSk7CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogc2Vuc29yIHNvZnQgcmVzZXQgKi8KKwloZGNzX3Jlc2V0KHNkKTsKKworCS8qIEV4ZWN1dGUgdGhlIHNlbnNvciBpbml0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3R2X3NlbnNvcl9pbml0KSAmJiAhZXJyOyBpKyspIHsKKwkJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIHN0dl9zZW5zb3JfaW5pdFtpXVswXSwKKwkJCQkJICAgICBzdHZfc2Vuc29yX2luaXRbaV1bMV0pOworCX0KKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIEVuYWJsZSBjb250aW5vdXMgZnJhbWUgY2FwdHVyZSwgYml0IDI6IHN0b3Agd2hlbiBmcmFtZSBjb21wbGV0ZSAqLworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBIRENTX1JFR19DT05GSUcoc2QpLCBCSVQoMykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogU2V0IFBHQSBzYW1wbGUgZHVyYXRpb24KKwkod2FzIDB4N0UgZm9yIElTXzg3MCwgYnV0IGNhdXNlZCBzbG93IGZyYW1lcmF0ZSB3aXRoIEhEQ1MtMTAyMCkgKi8KKwlpZiAoSVNfMTAyMChzZCkpCisJCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBIRENTX1RDVFJMLAorCQkJCShIRENTX0FEQ19TVEFSVF9TSUdfRFVSIDw8IDYpIHwgaGRjcy0+cHNtcCk7CisJZWxzZQorCQllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgSERDU19UQ1RSTCwKKwkJCQkoSERDU19BRENfU1RBUlRfU0lHX0RVUiA8PCA1KSB8IGhkY3MtPnBzbXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGRjc19zZXRfZ2FpbnMoc2QsIEhEQ1NfREVGQVVMVF9HQUlOLCBIRENTX0RFRkFVTFRfR0FJTiwKKwkJCSAgICAgSERDU19ERUZBVUxUX0dBSU4pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGRjc19zZXRfZXhwb3N1cmUoJnNkLT5nc3BjYV9kZXYsIEhEQ1NfREVGQVVMVF9FWFBPU1VSRSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBoZGNzX3NldF9zaXplKHNkLCBoZGNzLT5hcnJheS53aWR0aCwgaGRjcy0+YXJyYXkuaGVpZ2h0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhkY3NfZHVtcChzdHJ1Y3Qgc2QgKnNkKQoreworCXUxNiByZWcsIHZhbDsKKworCWluZm8oIkR1bXBpbmcgc2Vuc29yIHJlZ2lzdGVyczoiKTsKKworCWZvciAocmVnID0gSERDU19JREVOVDsgcmVnIDw9IEhEQ1NfUk9XRVhQSDsgcmVnKyspIHsKKwkJc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgcmVnLCAmdmFsKTsKKwkJaW5mbygicmVnIDB4JTAyeCA9IDB4JTAyeCIsIHJlZywgdmFsKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3Mjc5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBKZWFuLUZyZWRyaWMgQ2xlcmUsIE5pa29sYXMgWmltbWVybWFubiwgR2VvcmcgQWNoZXIKKyAqCQkgICAgICBNYXJrIENhdmUtQXlsYW5kLCBDYXJsbyBFIFByZWx6LCBEaWNrIFN0cmVlZmxhbmQKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBUdXVra2EgVG9pdm9uZW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIEFuZHLDqW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGlhLUkgV3UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogUC9OIDg2MTAzNzogICAgICBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDEwOiBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDIwOiBTZW5zb3IgUGhvdG9iaXQgUEIxMDAgIEFTSUMgU1RWMDYwMC0xIC0gUXVpY2tDYW0gRXhwcmVzcworICogUC9OIDg2MTA1NTogICAgICBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gTEVHTyBjYW0KKyAqIFAvTiA4NjEwNzUtMDA0MDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDCisgKiBQL04gOTYxMTc5LTA3MDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjAyICAgLSBEZXh4YSBXZWJDYW0gVVNCCisgKiBQL04gODYxMDQwLTAwMDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBRdWlja0NhbSBXZWIKKyAqLworCisjaWZuZGVmIFNUVjA2WFhfSERDU19IXworI2RlZmluZSBTVFYwNlhYX0hEQ1NfSF8KKworI2luY2x1ZGUgInN0djA2eHhfc2Vuc29yLmgiCisKKyNkZWZpbmUgSERDU19SRUdfQ09ORklHKHNkKQkoSVNfMTAyMChzZCkgPyBIRENTMjBfQ09ORklHIDogSERDUzAwX0NPTkZJRykKKyNkZWZpbmUgSERDU19SRUdfQ09OVFJPTChzZCkJKElTXzEwMjAoc2QpID8gSERDUzIwX0NPTlRST0wgOiBIRENTMDBfQ09OVFJPTCkKKworI2RlZmluZSBIRENTXzFYMDBfREVGX1dJRFRICTM2MAorI2RlZmluZSBIRENTXzFYMDBfREVGX0hFSUdIVCAJMjk2CisKKyNkZWZpbmUgSERDU18xMDIwX0RFRl9XSURUSAkzNTIKKyNkZWZpbmUgSERDU18xMDIwX0RFRl9IRUlHSFQJMjkyCisKKyNkZWZpbmUgSERDU18xMDIwX0JPVFRPTV9ZX1NLSVAJNAorCisjZGVmaW5lIEhEQ1NfQ0xLX0ZSRVFfTUhaCTI1CisKKyNkZWZpbmUgSERDU19BRENfU1RBUlRfU0lHX0RVUgkzCisKKy8qIExTQiBiaXQgb2YgSTJDIG9yIHJlZ2lzdGVyIGFkZHJlc3Mgc2lnbmlmaWVzIHdyaXRlICgwKSBvciByZWFkICgxKSAqLworLyogSTJDIFJlZ2lzdGVycyBjb21tb24gZm9yIGJvdGggSERDUy0xMDAwLzExMDAgYW5kIEhEQ1MtMTAyMCAqLworLyogSWRlbnRpZmljYXRpb25zIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfSURFTlQJCSgweDAwIDw8IDEpCisvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDU19TVEFUVVMJCSgweDAxIDw8IDEpCisvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX0lNQVNLCQkoMHgwMiA8PCAxKQorLyogUGFkIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDU19QQ1RSTAkJKDB4MDMgPDwgMSkKKy8qIFBhZCBEcml2ZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfUERSVgkJKDB4MDQgPDwgMSkKKy8qIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfSUNUUkwJCSgweDA1IDw8IDEpCisvKiBJbnRlcmZhY2UgVGltaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfSVRNRwkJKDB4MDYgPDwgMSkKKy8qIEJhdWQgRnJhY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDU19CRlJBQwkJKDB4MDcgPDwgMSkKKy8qIEJhdWQgUmF0ZSBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX0JSQVRFCQkoMHgwOCA8PCAxKQorLyogQURDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDU19BRENDVFJMCQkoMHgwOSA8PCAxKQorLyogRmlyc3QgV2luZG93IFJvdyBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX0ZXUk9XCQkoMHgwYSA8PCAxKQorLyogRmlyc3QgV2luZG93IENvbHVtbiBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX0ZXQ09MCQkoMHgwYiA8PCAxKQorLyogTGFzdCBXaW5kb3cgUm93IFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfTFdST1cJCSgweDBjIDw8IDEpCisvKiBMYXN0IFdpbmRvdyBDb2x1bW4gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDU19MV0NPTAkJKDB4MGQgPDwgMSkKKy8qIFRpbWluZyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1NfVENUUkwJCSgweDBlIDw8IDEpCisvKiBQR0EgR2FpbiBSZWdpc3RlcjogRXZlbiBSb3csIEV2ZW4gQ29sdW1uICovCisjZGVmaW5lIEhEQ1NfRVJFQ1BHQQkJKDB4MGYgPDwgMSkKKy8qIFBHQSBHYWluIFJlZ2lzdGVyOiBFdmVuIFJvdywgT2RkIENvbHVtbiAqLworI2RlZmluZSBIRENTX0VST0NQR0EJCSgweDEwIDw8IDEpCisvKiBQR0EgR2FpbiBSZWdpc3RlcjogT2RkIFJvdywgRXZlbiBDb2x1bW4gKi8KKyNkZWZpbmUgSERDU19PUkVDUEdBCQkoMHgxMSA8PCAxKQorLyogUEdBIEdhaW4gUmVnaXN0ZXI6IE9kZCBSb3csIE9kZCBDb2x1bW4gKi8KKyNkZWZpbmUgSERDU19PUk9DUEdBCQkoMHgxMiA8PCAxKQorLyogUm93IEV4cG9zdXJlIExvdyBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX1JPV0VYUEwJCSgweDEzIDw8IDEpCisvKiBSb3cgRXhwb3N1cmUgSGlnaCBSZWdpc3RlciAqLworI2RlZmluZSBIRENTX1JPV0VYUEgJCSgweDE0IDw8IDEpCisKKy8qIEkyQyBSZWdpc3RlcnMgb25seSBmb3IgSERDUy0xMDAwLzExMDAgKi8KKy8qIFN1Yi1Sb3cgRXhwb3N1cmUgTG93IFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MwMF9TUk9XRVhQTAkJKDB4MTUgPDwgMSkKKy8qIFN1Yi1Sb3cgRXhwb3N1cmUgSGlnaCBSZWdpc3RlciAqLworI2RlZmluZSBIRENTMDBfU1JPV0VYUEgJCSgweDE2IDw8IDEpCisvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MwMF9DT05GSUcJCSgweDE3IDw8IDEpCisvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MwMF9DT05UUk9MCQkoMHgxOCA8PCAxKQorCisvKiBJMkMgUmVnaXN0ZXJzIG9ubHkgZm9yIEhEQ1MtMTAyMCAqLworLyogU3ViLVJvdyBFeHBvc3VyZSBSZWdpc3RlciAqLworI2RlZmluZSBIRENTMjBfU1JPV0VYUAkJKDB4MTUgPDwgMSkKKy8qIEVycm9yIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDUzIwX0VSUk9SCQkoMHgxNiA8PCAxKQorLyogSW50ZXJmYWNlIFRpbWluZyAyIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MyMF9JVE1HMgkJKDB4MTcgPDwgMSkKKy8qIEludGVyZmFjZSBDb250cm9sIDIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSERDUzIwX0lDVFJMMgkJKDB4MTggPDwgMSkKKy8qIEhvcml6b250YWwgQmxhbmsgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSERDUzIwX0hCTEFOSwkJKDB4MTkgPDwgMSkKKy8qIFZlcnRpY2FsIEJsYW5rIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MyMF9WQkxBTksJCSgweDFhIDw8IDEpCisvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MyMF9DT05GSUcJCSgweDFiIDw8IDEpCisvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEhEQ1MyMF9DT05UUk9MCQkoMHgxYyA8PCAxKQorCisjZGVmaW5lIEhEQ1NfUlVOX0VOQUJMRQkJKDEgPDwgMikKKyNkZWZpbmUgSERDU19TTEVFUF9NT0RFCQkoMSA8PCAxKQorCisjZGVmaW5lIEhEQ1NfREVGQVVMVF9FWFBPU1VSRQk1MDAwCisjZGVmaW5lIEhEQ1NfREVGQVVMVF9HQUlOCTEyOAorCitzdGF0aWMgaW50IGhkY3NfcHJvYmVfMXgwMChzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgaGRjc19wcm9iZV8xMDIwKHN0cnVjdCBzZCAqc2QpOworc3RhdGljIGludCBoZGNzX3N0YXJ0KHN0cnVjdCBzZCAqc2QpOworc3RhdGljIGludCBoZGNzX2luaXQoc3RydWN0IHNkICpzZCk7CitzdGF0aWMgaW50IGhkY3Nfc3RvcChzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgaGRjc19kdW1wKHN0cnVjdCBzZCAqc2QpOworc3RhdGljIHZvaWQgaGRjc19kaXNjb25uZWN0KHN0cnVjdCBzZCAqc2QpOworCitzdGF0aWMgaW50IGhkY3NfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IGhkY3Nfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgaGRjc19zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IGhkY3NfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKKworY29uc3Qgc3RydWN0IHN0djA2eHhfc2Vuc29yIHN0djA2eHhfc2Vuc29yX2hkY3MxeDAwID0geworCS5uYW1lID0gIkhQIEhEQ1MtMTAwMC8xMTAwIiwKKwkuaTJjX2ZsdXNoID0gMCwKKwkuaTJjX2FkZHIgPSAoMHg1NSA8PCAxKSwKKwkuaTJjX2xlbiA9IDEsCisKKwkuaW5pdCA9IGhkY3NfaW5pdCwKKwkucHJvYmUgPSBoZGNzX3Byb2JlXzF4MDAsCisJLnN0YXJ0ID0gaGRjc19zdGFydCwKKwkuc3RvcCA9IGhkY3Nfc3RvcCwKKwkuZGlzY29ubmVjdCA9IGhkY3NfZGlzY29ubmVjdCwKKwkuZHVtcCA9IGhkY3NfZHVtcCwKKworCS5uY3RybHMgPSAyLAorCS5jdHJscyA9IHsKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZQkJPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0JPSAweDAwLAorCQkJLm1heGltdW0JPSAweGZmZmYsCisJCQkuc3RlcAkJPSAweDEsCisJCQkuZGVmYXVsdF92YWx1ZSAJPSBIRENTX0RFRkFVTFRfRVhQT1NVUkUsCisJCQkuZmxhZ3MgICAgICAgICAJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IGhkY3Nfc2V0X2V4cG9zdXJlLAorCQkuZ2V0ID0gaGRjc19nZXRfZXhwb3N1cmUKKwl9LAorCXsKKwkJeworCQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUJCT0gImdhaW4iLAorCQkJLm1pbmltdW0JPSAweDAwLAorCQkJLm1heGltdW0JPSAweGZmLAorCQkJLnN0ZXAJCT0gMHgxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gSERDU19ERUZBVUxUX0dBSU4sCisJCQkuZmxhZ3MgICAgICAgICAJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IGhkY3Nfc2V0X2dhaW4sCisJCS5nZXQgPSBoZGNzX2dldF9nYWluCisJfQorCX0sCisKKwkubm1vZGVzID0gMSwKKwkubW9kZXMgPSB7CisJeworCQlIRENTXzFYMDBfREVGX1dJRFRILAorCQlIRENTXzFYMDBfREVGX0hFSUdIVCwKKwkJVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJVjRMMl9GSUVMRF9OT05FLAorCQkuc2l6ZWltYWdlID0KKwkJCUhEQ1NfMVgwMF9ERUZfV0lEVEggKiBIRENTXzFYMDBfREVGX0hFSUdIVCwKKwkJLmJ5dGVzcGVybGluZSA9IEhEQ1NfMVgwMF9ERUZfV0lEVEgsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMQorCX0KKwl9Cit9OworCitjb25zdCBzdHJ1Y3Qgc3R2MDZ4eF9zZW5zb3Igc3R2MDZ4eF9zZW5zb3JfaGRjczEwMjAgPSB7CisJLm5hbWUgPSAiSERDUy0xMDIwIiwKKwkuaTJjX2ZsdXNoID0gMCwKKwkuaTJjX2FkZHIgPSAoMHg1NSA8PCAxKSwKKwkuaTJjX2xlbiA9IDEsCisKKwkubmN0cmxzID0gMCwKKwkuY3RybHMgPSB7fSwKKworCS5pbml0ID0gaGRjc19pbml0LAorCS5wcm9iZSA9IGhkY3NfcHJvYmVfMTAyMCwKKwkuc3RhcnQgPSBoZGNzX3N0YXJ0LAorCS5zdG9wID0gaGRjc19zdG9wLAorCS5kdW1wID0gaGRjc19kdW1wLAorCisJLm5tb2RlcyA9IDEsCisJLm1vZGVzID0geworCXsKKwkJSERDU18xMDIwX0RFRl9XSURUSCwKKwkJSERDU18xMDIwX0RFRl9IRUlHSFQsCisJCVY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCVY0TDJfRklFTERfTk9ORSwKKwkJLnNpemVpbWFnZSA9CisJCQlIRENTXzEwMjBfREVGX1dJRFRIICogSERDU18xMDIwX0RFRl9IRUlHSFQsCisJCS5ieXRlc3BlcmxpbmUgPSBIRENTXzEwMjBfREVGX1dJRFRILAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDEKKwl9CisJfQorfTsKKworc3RhdGljIGNvbnN0IHUxNiBzdHZfYnJpZGdlX2luaXRbXVsyXSA9IHsKKwl7U1RWX0lTT19FTkFCTEUsIDB9LAorCXtTVFZfUkVHMjMsIDB9LAorCXtTVFZfUkVHMDAsIDB4MWR9LAorCXtTVFZfUkVHMDEsIDB4YjV9LAorCXtTVFZfUkVHMDIsIDB4YTh9LAorCXtTVFZfUkVHMDMsIDB4OTV9LAorCXtTVFZfUkVHMDQsIDB4MDd9LAorCisJe1NUVl9TQ0FOX1JBVEUsIDB4MjB9LAorCXtTVFZfSVNPX1NJWkVfTCwgODQ3fSwKKwl7U1RWX1lfQ1RSTCwgMHgwMX0sCisJe1NUVl9YX0NUUkwsIDB4MGF9Cit9OworCitzdGF0aWMgY29uc3QgdTggc3R2X3NlbnNvcl9pbml0W11bMl0gPSB7CisJLyogQ2xlYXIgc3RhdHVzICh3cml0aW5nIDEgd2lsbCBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBzdGF0dXMgYml0KSAqLworCXtIRENTX1NUQVRVUywgQklUKDYpIHwgQklUKDUpIHwgQklUKDQpIHwgQklUKDMpIHwgQklUKDIpIHwgQklUKDEpfSwKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJe0hEQ1NfSU1BU0ssIDB4MDB9LAorCXtIRENTX1BDVFJMLCBCSVQoNikgfCBCSVQoNSkgfCBCSVQoMSkgfCBCSVQoMCl9LAorCXtIRENTX1BEUlYsICAweDAwfSwKKwl7SERDU19JQ1RSTCwgQklUKDUpfSwKKwl7SERDU19JVE1HLCAgQklUKDQpIHwgQklUKDEpfSwKKwkvKiBBREMgb3V0cHV0IHJlc29sdXRpb24gdG8gMTAgYml0cyAqLworCXtIRENTX0FEQ0NUUkwsIDEwfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9wYjAxMDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3BiMDEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTBmODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9wYjAxMDAuYwpAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBKZWFuLUZyZWRyaWMgQ2xlcmUsIE5pa29sYXMgWmltbWVybWFubiwgR2VvcmcgQWNoZXIKKyAqCQkgICAgICBNYXJrIENhdmUtQXlsYW5kLCBDYXJsbyBFIFByZWx6LCBEaWNrIFN0cmVlZmxhbmQKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBUdXVra2EgVG9pdm9uZW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIEFuZHLDqW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogUC9OIDg2MTAzNzogICAgICBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDEwOiBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMgU1RWMDYwMAorICogUC9OIDg2MTA1MC0wMDIwOiBTZW5zb3IgUGhvdG9iaXQgUEIxMDAgIEFTSUMgU1RWMDYwMC0xIC0gUXVpY2tDYW0gRXhwcmVzcworICogUC9OIDg2MTA1NTogICAgICBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gTEVHTyBjYW0KKyAqIFAvTiA4NjEwNzUtMDA0MDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDCisgKiBQL04gOTYxMTc5LTA3MDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjAyICAgLSBEZXh4YSBXZWJDYW0gVVNCCisgKiBQL04gODYxMDQwLTAwMDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBRdWlja0NhbSBXZWIKKyAqLworCisvKgorICogVGhlIHNwZWMgZmlsZSBmb3IgdGhlIFBCLTAxMDAgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBmb3IgYmVzdCBxdWFsaXR5CisgKiBpbWFnZXMgYWZ0ZXIgdGhlIHNlbnNvciBoYXMgYmVlbiByZXNldCA6CisgKgorICogUEJfQURDR0FJTkwgICAgICA9IFI2MCA9IDB4MDMgKDMgZGVjKSAgICAgIDogc2V0cyBsb3cgcmVmZXJlbmNlIG9mIEFEQworCQkJCQkJdG8gcHJvZHVjZSBnb29kIGJsYWNrIGxldmVsCisgKiBQQl9QUkVBRENUUkwgICAgID0gUjMyID0gMHgxNDAwICg1MTIwIGRlYykgOiBFbmFibGVzIGdsb2JhbCBnYWluIGNoYW5nZXMKKwkJCQkJCXRocm91Z2ggUjUzCisgKiBQQl9BRENNSU5HQUlOICAgID0gUjUyID0gMHgxMCAoMTYgZGVjKSAgICAgOiBTZXRzIHRoZSBtaW5pbXVtIGdhaW4gZm9yCisJCQkJCQlhdXRvLWV4cG9zdXJlCisgKiBQQl9BRENHTE9CQUxHQUlOID0gUjUzID0gMHgxMCAoMTYgZGVjKSAgICAgOiBTZXRzIHRoZSBnbG9iYWwgZ2FpbgorICogUEJfRVhQR0FJTiAgICAgICA9IFIxNCA9IDB4MTEgKDE3IGRlYykgICAgIDogU2V0cyB0aGUgYXV0by1leHBvc3VyZSB2YWx1ZQorICogUEJfVVBEQVRFSU5UICAgICA9IFIyMyA9IDB4MDIgKDIgZGVjKSAgICAgIDogU2V0cyB0aGUgc3BlZWQgb24KKwkJCQkJCWF1dG8tZXhwb3N1cmUgcm91dGluZQorICogUEJfQ0ZJTExJTiAgICAgICA9IFI1ICA9IDB4MEUgKDE0IGRlYykgICAgIDogU2V0cyB0aGUgZnJhbWUgcmF0ZQorICovCisKKyNpbmNsdWRlICJzdHYwNnh4X3BiMDEwMC5oIgorCitzdGF0aWMgaW50IHBiMDEwMF9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQoreworCXUxNiBzZW5zb3I7CisJaW50IGksIGVycjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5nczsKKworCWVyciA9IHN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIFBCX0lERU5ULCAmc2Vuc29yKTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoc2Vuc29yID4+IDgpID09IDB4NjQpIHsKKwkJc2Vuc29yX3NldHRpbmdzID0ga21hbGxvYygKKwkJCQlzdHYwNnh4X3NlbnNvcl9wYjAxMDAubmN0cmxzICogc2l6ZW9mKHMzMiksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghc2Vuc29yX3NldHRpbmdzKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaW5mbygiUGhvdG9iaXQgcGIwMTAwIHNlbnNvciBkZXRlY3RlZCIpOworCisJCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gc3R2MDZ4eF9zZW5zb3JfcGIwMTAwLm1vZGVzOworCQlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBzdHYwNnh4X3NlbnNvcl9wYjAxMDAubm1vZGVzOworCQlzZC0+ZGVzYy5jdHJscyA9IHN0djA2eHhfc2Vuc29yX3BiMDEwMC5jdHJsczsKKwkJc2QtPmRlc2MubmN0cmxzID0gc3R2MDZ4eF9zZW5zb3JfcGIwMTAwLm5jdHJsczsKKwkJZm9yIChpID0gMDsgaSA8IHN0djA2eHhfc2Vuc29yX3BiMDEwMC5uY3RybHM7IGkrKykKKwkJCXNlbnNvcl9zZXR0aW5nc1tpXSA9IHN0djA2eHhfc2Vuc29yX3BiMDEwMC4KKwkJCQkJICAgICBjdHJsc1tpXS5xY3RybC5kZWZhdWx0X3ZhbHVlOworCQlzZC0+c2Vuc29yX3ByaXYgPSBzZW5zb3Jfc2V0dGluZ3M7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX3N0YXJ0KHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgY2FtICpjYW0gPSAmc2QtPmdzcGNhX2Rldi5jYW07CisJczMyICpzZW5zb3Jfc2V0dGluZ3MgPSBzZC0+c2Vuc29yX3ByaXY7CisJdTMyIG1vZGUgPSBjYW0tPmNhbV9tb2RlW3NkLT5nc3BjYV9kZXYuY3Vycl9tb2RlXS5wcml2OworCisJLyogU2V0dXAgc2Vuc29yIHdpbmRvdyAqLworCWlmIChtb2RlICYgUEIwMTAwX0NST1BfVE9fVkdBKSB7CisJCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SU1RBUlQsIDMwKTsKKwkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0NTVEFSVCwgMjApOworCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUldTSVpFLCAyNDAgLSAxKTsKKwkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0NXU0laRSwgMzIwIC0gMSk7CisJfSBlbHNlIHsKKwkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX1JTVEFSVCwgOCk7CisJCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9DU1RBUlQsIDQpOworCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUldTSVpFLCAyODggLSAxKTsKKwkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0NXU0laRSwgMzUyIC0gMSk7CisJfQorCisJaWYgKG1vZGUgJiBQQjAxMDBfU1VCU0FNUExFKSB7CisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWV9DVFJMLCAweDAyKTsgLyogV3JvbmcsIEZJWE1FICovCisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWF9DVFJMLCAweDA2KTsKKworCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1NDQU5fUkFURSwgMHgxMCk7CisJfSBlbHNlIHsKKwkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9ZX0NUUkwsIDB4MDEpOworCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1hfQ1RSTCwgMHgwYSk7CisJCS8qIGxhcmdlciAtPiBzbG93ZXIgKi8KKwkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9TQ0FOX1JBVEUsIDB4MjApOworCX0KKworCS8qIHNldF9nYWluIGFsc28gc2V0cyByZWQgYW5kIGJsdWUgYmFsYW5jZSAqLworCXBiMDEwMF9zZXRfZ2Fpbigmc2QtPmdzcGNhX2Rldiwgc2Vuc29yX3NldHRpbmdzW0dBSU5fSURYXSk7CisJcGIwMTAwX3NldF9leHBvc3VyZSgmc2QtPmdzcGNhX2Rldiwgc2Vuc29yX3NldHRpbmdzW0VYUE9TVVJFX0lEWF0pOworCXBiMDEwMF9zZXRfYXV0b2dhaW5fdGFyZ2V0KCZzZC0+Z3NwY2FfZGV2LAorCQkJCSAgIHNlbnNvcl9zZXR0aW5nc1tBVVRPR0FJTl9UQVJHRVRfSURYXSk7CisJcGIwMTAwX3NldF9hdXRvZ2Fpbigmc2QtPmdzcGNhX2Rldiwgc2Vuc29yX3NldHRpbmdzW0FVVE9HQUlOX0lEWF0pOworCisJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0NPTlRST0wsIEJJVCg1KXxCSVQoMyl8QklUKDEpKTsKKwlQREVCVUcoRF9TVFJFQU0sICJTdGFydGVkIHN0cmVhbSwgc3RhdHVzOiAlZCIsIGVycik7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc3RvcChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBlcnI7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfQUJPUlRGUkFNRSwgMSk7CisKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBTZXQgYml0IDEgdG8gemVybyAqLworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9DT05UUk9MLCBCSVQoNSl8QklUKDMpKTsKKworCVBERUJVRyhEX1NUUkVBTSwgIkhhbHRpbmcgc3RyZWFtIik7CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKKy8qIEZJWE1FOiBTb3J0IHRoZSBpbml0IGNvbW1hbmRzIG91dCBhbmQgcHV0IHRoZW0gaW50byB0YWJsZXMsCisJICB0aGlzIGlzIG9ubHkgZm9yIGdldHRpbmcgdGhlIGNhbWVyYSB0byB3b3JrICovCisvKiBGSVhNRTogTm8gZXJyb3IgaGFuZGxpbmcgZm9yIG5vdywKKwkgIGFkZCB0aGlzIG9uY2UgdGhlIGluaXQgaGFzIGJlZW4gY29udmVydGVkIHRvIHByb3BlciB0YWJsZXMgKi8KK3N0YXRpYyBpbnQgcGIwMTAwX2luaXQoc3RydWN0IHNkICpzZCkKK3sKKwlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1JFRzAwLCAxKTsKKwlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1NDQU5fUkFURSwgMCk7CisKKwkvKiBSZXNldCBzZW5zb3IgKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUkVTRVQsIDEpOworCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SRVNFVCwgMCk7CisKKwkvKiBEaXNhYmxlIGNoaXAgKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfQ09OVFJPTCwgQklUKDUpfEJJVCgzKSk7CisKKwkvKiBHYWluIHN0dWZmLi4uKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUFJFQURDVFJMLCBCSVQoMTIpfEJJVCgxMCl8QklUKDYpKTsKKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfQURDR0xPQkFMR0FJTiwgMTIpOworCisJLyogU2V0IHVwIGF1dG8tZXhwb3N1cmUgKi8KKwkvKiBBREMgVlJFRl9ISSBuZXcgc2V0dGluZyBmb3IgYSB0cmFuc2l0aW9uCisJICBmcm9tIHRoZSBFeHBvc2UxIHRvIHRoZSBFeHBvc2UyIHNldHRpbmcgKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUjI4LCAxMik7CisJLyogZ2FpbiBtYXggZm9yIGF1dG9leHBvc3VyZSAqLworCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9BRENNQVhHQUlOLCAxODApOworCS8qIGdhaW4gbWluIGZvciBhdXRvZXhwb3N1cmUgICovCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0FEQ01JTkdBSU4sIDEyKTsKKwkvKiBNYXhpbXVtIGZyYW1lIGludGVncmF0aW9uIHRpbWUgKHByb2dyYW1tZWQgaW50byBSOCkKKwkgICBhbGxvd2VkIGZvciBhdXRvLWV4cG9zdXJlIHJvdXRpbmUgKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUjU0LCAzKTsKKwkvKiBNaW5pbXVtIGZyYW1lIGludGVncmF0aW9uIHRpbWUgKHByb2dyYW1tZWQgaW50byBSOCkKKwkgICBhbGxvd2VkIGZvciBhdXRvLWV4cG9zdXJlIHJvdXRpbmUgKi8KKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUjU1LCAwKTsKKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfVVBEQVRFSU5ULCAxKTsKKwkvKiBSMTUgIEV4cG9zZTAgKG1heGltdW0gdGhhdCBhdXRvLWV4cG9zdXJlIG1heSB1c2UpICovCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX1IxNSwgODAwKTsKKwkvKiBSMTcgIEV4cG9zZTIgKG1pbmltdW0gdGhhdCBhdXRvLWV4cG9zdXJlIG1heSB1c2UpICovCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX1IxNywgMTApOworCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0VYUEdBSU4sIDApOworCisJLyogMHgxNCAqLworCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9WT0ZGU0VULCAwKTsKKwkvKiAweDBEICovCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0FEQ0dBSU5ILCAxMSk7CisJLyogU2V0IGJsYWNrIGxldmVsIChpbXBvcnRhbnQhKSAqLworCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9BRENHQUlOTCwgMCk7CisKKwkvKiA/Pz8gKi8KKwlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1JFRzAwLCAweDExKTsKKwlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1JFRzAzLCAweDQ1KTsKKwlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1JFRzA0LCAweDA3KTsKKworCS8qIElTTy1TaXplICgweDI3YjogNjM1Li4uIHdoeT8gLSBIRENTIHVzZXMgODQ3KSAqLworCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfSVNPX1NJWkVfTCwgODQ3KTsKKworCS8qIFNjYW4vdGltaW5nIGZvciB0aGUgc2Vuc29yICovCisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX1JPV1NQRUVELCBCSVQoNCl8QklUKDMpfEJJVCgxKSk7CisJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0NGSUxMSU4sIDE0KTsKKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfVkJMLCAwKTsKKwlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfRklOVFRJTUUsIDApOworCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SSU5UVElNRSwgMTIzKTsKKworCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfUkVHMDEsIDB4YzIpOworCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfUkVHMDIsIDB4YjApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBiMDEwMF9kdW1wKHN0cnVjdCBzZCAqc2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJczMyICpzZW5zb3Jfc2V0dGluZ3MgPSBzZC0+c2Vuc29yX3ByaXY7CisKKwkqdmFsID0gc2Vuc29yX3NldHRpbmdzW0dBSU5fSURYXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBiMDEwMF9zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCWlmIChzZW5zb3Jfc2V0dGluZ3NbQVVUT0dBSU5fSURYXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNlbnNvcl9zZXR0aW5nc1tHQUlOX0lEWF0gPSB2YWw7CisJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0cxR0FJTiwgdmFsKTsKKwlpZiAoIWVycikKKwkJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFBCX0cyR0FJTiwgdmFsKTsKKwlQREVCVUcoRF9WNEwyLCAiU2V0IGdyZWVuIGdhaW4gdG8gJWQsIHN0YXR1czogJWQiLCB2YWwsIGVycik7CisKKwlpZiAoIWVycikKKwkJZXJyID0gcGIwMTAwX3NldF9yZWRfYmFsYW5jZShnc3BjYV9kZXYsCisJCQkJCSAgICAgc2Vuc29yX3NldHRpbmdzW1JFRF9CQUxBTkNFX0lEWF0pOworCWlmICghZXJyKQorCQllcnIgPSBwYjAxMDBfc2V0X2JsdWVfYmFsYW5jZShnc3BjYV9kZXYsCisJCQkJCSAgICBzZW5zb3Jfc2V0dGluZ3NbQkxVRV9CQUxBTkNFX0lEWF0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwYjAxMDBfZ2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJczMyICpzZW5zb3Jfc2V0dGluZ3MgPSBzZC0+c2Vuc29yX3ByaXY7CisKKwkqdmFsID0gc2Vuc29yX3NldHRpbmdzW1JFRF9CQUxBTkNFX0lEWF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OworCisJaWYgKHNlbnNvcl9zZXR0aW5nc1tBVVRPR0FJTl9JRFhdKQorCQlyZXR1cm4gLUVCVVNZOworCisJc2Vuc29yX3NldHRpbmdzW1JFRF9CQUxBTkNFX0lEWF0gPSB2YWw7CisJdmFsICs9IHNlbnNvcl9zZXR0aW5nc1tHQUlOX0lEWF07CisJaWYgKHZhbCA8IDApCisJCXZhbCA9IDA7CisJZWxzZSBpZiAodmFsID4gMjU1KQorCQl2YWwgPSAyNTU7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfUkdBSU4sIHZhbCk7CisJUERFQlVHKERfVjRMMiwgIlNldCByZWQgZ2FpbiB0byAlZCwgc3RhdHVzOiAlZCIsIHZhbCwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX2dldF9ibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCSp2YWwgPSBzZW5zb3Jfc2V0dGluZ3NbQkxVRV9CQUxBTkNFX0lEWF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCWlmIChzZW5zb3Jfc2V0dGluZ3NbQVVUT0dBSU5fSURYXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNlbnNvcl9zZXR0aW5nc1tCTFVFX0JBTEFOQ0VfSURYXSA9IHZhbDsKKwl2YWwgKz0gc2Vuc29yX3NldHRpbmdzW0dBSU5fSURYXTsKKwlpZiAodmFsIDwgMCkKKwkJdmFsID0gMDsKKwllbHNlIGlmICh2YWwgPiAyNTUpCisJCXZhbCA9IDI1NTsKKworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9CR0FJTiwgdmFsKTsKKwlQREVCVUcoRF9WNEwyLCAiU2V0IGJsdWUgZ2FpbiB0byAlZCwgc3RhdHVzOiAlZCIsIHZhbCwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX2dldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OworCisJKnZhbCA9IHNlbnNvcl9zZXR0aW5nc1tFWFBPU1VSRV9JRFhdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCWlmIChzZW5zb3Jfc2V0dGluZ3NbQVVUT0dBSU5fSURYXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNlbnNvcl9zZXR0aW5nc1tFWFBPU1VSRV9JRFhdID0gdmFsOworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SSU5UVElNRSwgdmFsKTsKKwlQREVCVUcoRF9WNEwyLCAiU2V0IGV4cG9zdXJlIHRvICVkLCBzdGF0dXM6ICVkIiwgdmFsLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwYjAxMDBfZ2V0X2F1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJczMyICpzZW5zb3Jfc2V0dGluZ3MgPSBzZC0+c2Vuc29yX3ByaXY7CisKKwkqdmFsID0gc2Vuc29yX3NldHRpbmdzW0FVVE9HQUlOX0lEWF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc2V0X2F1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OworCisJc2Vuc29yX3NldHRpbmdzW0FVVE9HQUlOX0lEWF0gPSB2YWw7CisJaWYgKHNlbnNvcl9zZXR0aW5nc1tBVVRPR0FJTl9JRFhdKSB7CisJCWlmIChzZW5zb3Jfc2V0dGluZ3NbTkFUVVJBTF9JRFhdKQorCQkJdmFsID0gQklUKDYpfEJJVCg0KXxCSVQoMCk7CisJCWVsc2UKKwkJCXZhbCA9IEJJVCg0KXxCSVQoMCk7CisJfSBlbHNlCisJCXZhbCA9IDA7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgUEJfRVhQR0FJTiwgdmFsKTsKKwlQREVCVUcoRF9WNEwyLCAiU2V0IGF1dG9nYWluIHRvICVkIChuYXR1cmFsOiAlZCksIHN0YXR1czogJWQiLAorCSAgICAgICBzZW5zb3Jfc2V0dGluZ3NbQVVUT0dBSU5fSURYXSwgc2Vuc29yX3NldHRpbmdzW05BVFVSQUxfSURYXSwKKwkgICAgICAgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGIwMTAwX2dldF9hdXRvZ2Fpbl90YXJnZXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCSp2YWwgPSBzZW5zb3Jfc2V0dGluZ3NbQVVUT0dBSU5fVEFSR0VUX0lEWF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc2V0X2F1dG9nYWluX3RhcmdldChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyLCB0b3RhbHBpeGVscywgYnJpZ2h0cGl4ZWxzLCBkYXJrcGl4ZWxzOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlzMzIgKnNlbnNvcl9zZXR0aW5ncyA9IHNkLT5zZW5zb3JfcHJpdjsKKworCXNlbnNvcl9zZXR0aW5nc1tBVVRPR0FJTl9UQVJHRVRfSURYXSA9IHZhbDsKKworCS8qIE51bWJlciBvZiBwaXhlbHMgY291bnRlZCBieSB0aGUgc2Vuc29yIHdoZW4gc3Vic2FtcGxpbmcgdGhlIHBpeGVscy4KKwkgKiBTbGlnaHRseSBsYXJnZXIgdGhhbiB0aGUgcmVhbCB2YWx1ZSB0byBhdm9pZCBvc2NpbGxhdGlvbiAqLworCXRvdGFscGl4ZWxzID0gZ3NwY2FfZGV2LT53aWR0aCAqIGdzcGNhX2Rldi0+aGVpZ2h0OworCXRvdGFscGl4ZWxzID0gdG90YWxwaXhlbHMvKDgqOCkgKyB0b3RhbHBpeGVscy8oNjQqNjQpOworCisJYnJpZ2h0cGl4ZWxzID0gKHRvdGFscGl4ZWxzICogdmFsKSA+PiA4OworCWRhcmtwaXhlbHMgICA9IHRvdGFscGl4ZWxzIC0gYnJpZ2h0cGl4ZWxzOworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SMjEsIGJyaWdodHBpeGVscyk7CisJaWYgKCFlcnIpCisJCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBQQl9SMjIsIGRhcmtwaXhlbHMpOworCisJUERFQlVHKERfVjRMMiwgIlNldCBhdXRvZ2FpbiB0YXJnZXQgdG8gJWQsIHN0YXR1czogJWQiLCB2YWwsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBiMDEwMF9nZXRfbmF0dXJhbChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OworCisJKnZhbCA9IHNlbnNvcl9zZXR0aW5nc1tOQVRVUkFMX0lEWF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYjAxMDBfc2V0X25hdHVyYWwoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OworCisJc2Vuc29yX3NldHRpbmdzW05BVFVSQUxfSURYXSA9IHZhbDsKKworCXJldHVybiBwYjAxMDBfc2V0X2F1dG9nYWluKGdzcGNhX2Rldiwgc2Vuc29yX3NldHRpbmdzW0FVVE9HQUlOX0lEWF0pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfcGIwMTAwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9wYjAxMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWEyMWExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfcGIwMTAwLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVhbi1GcmVkcmljIENsZXJlLCBOaWtvbGFzIFppbW1lcm1hbm4sIEdlb3JnIEFjaGVyCisgKgkJICAgICAgTWFyayBDYXZlLUF5bGFuZCwgQ2FybG8gRSBQcmVseiwgRGljayBTdHJlZWZsYW5kCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVHV1a2thIFRvaXZvbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayBBbmRyw6luCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFAvTiA4NjEwMzc6ICAgICAgU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAxMDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAyMDogU2Vuc29yIFBob3RvYml0IFBCMTAwICBBU0lDIFNUVjA2MDAtMSAtIFF1aWNrQ2FtIEV4cHJlc3MKKyAqIFAvTiA4NjEwNTU6ICAgICAgU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIExFR08gY2FtCisgKiBQL04gODYxMDc1LTAwNDA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQworICogUC9OIDk2MTE3OS0wNzAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYwMiAgIC0gRGV4eGEgV2ViQ2FtIFVTQgorICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCisgKi8KKworI2lmbmRlZiBTVFYwNlhYX1BCMDEwMF9IXworI2RlZmluZSBTVFYwNlhYX1BCMDEwMF9IXworCisjaW5jbHVkZSAic3R2MDZ4eF9zZW5zb3IuaCIKKworLyogbW9kZSBwcml2IGZpZWxkIGZsYWdzICovCisjZGVmaW5lIFBCMDEwMF9DUk9QX1RPX1ZHQQkweDAxCisjZGVmaW5lIFBCMDEwMF9TVUJTQU1QTEUJMHgwMgorCisvKiBJMkMgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBCX0lERU5UCQkweDAwCS8qIENoaXAgVmVyc2lvbiAqLworI2RlZmluZSBQQl9SU1RBUlQJCTB4MDEJLyogUm93IFdpbmRvdyBTdGFydCAqLworI2RlZmluZSBQQl9DU1RBUlQJCTB4MDIJLyogQ29sdW1uIFdpbmRvdyBTdGFydCAqLworI2RlZmluZSBQQl9SV1NJWkUJCTB4MDMJLyogUm93IFdpbmRvdyBTaXplICovCisjZGVmaW5lIFBCX0NXU0laRQkJMHgwNAkvKiBDb2x1bW4gIFdpbmRvdyBTaXplICovCisjZGVmaW5lIFBCX0NGSUxMSU4JCTB4MDUJLyogQ29sdW1uIEZpbGwtSW4gKi8KKyNkZWZpbmUgUEJfVkJMCQkJMHgwNgkvKiBWZXJ0aWNhbCBCbGFuayBDb3VudCAqLworI2RlZmluZSBQQl9DT05UUk9MCQkweDA3CS8qIENvbnRyb2wgTW9kZSAqLworI2RlZmluZSBQQl9GSU5UVElNRQkJMHgwOAkvKiBJbnRlZ3JhdGlvbiBUaW1lL0ZyYW1lIFVuaXQgQ291bnQgKi8KKyNkZWZpbmUgUEJfUklOVFRJTUUJCTB4MDkJLyogSW50ZWdyYXRpb24gVGltZS9Sb3cgVW5pdCBDb3VudCAqLworI2RlZmluZSBQQl9ST1dTUEVFRAkJMHgwYQkvKiBSb3cgU3BlZWQgQ29udHJvbCAqLworI2RlZmluZSBQQl9BQk9SVEZSQU1FCQkweDBiCS8qIEFib3J0IEZyYW1lICovCisjZGVmaW5lIFBCX1IxMgkJCTB4MGMJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEJfUkVTRVQJCTB4MGQJLyogUmVzZXQgKi8KKyNkZWZpbmUgUEJfRVhQR0FJTgkJMHgwZQkvKiBFeHBvc3VyZSBHYWluIENvbW1hbmQgKi8KKyNkZWZpbmUgUEJfUjE1CQkJMHgwZgkvKiBFeHBvc2UwICovCisjZGVmaW5lIFBCX1IxNgkJCTB4MTAJLyogRXhwb3NlMSAqLworI2RlZmluZSBQQl9SMTcJCQkweDExCS8qIEV4cG9zZTIgKi8KKyNkZWZpbmUgUEJfUjE4CQkJMHgxMgkvKiBMb3cwX0RBQyAqLworI2RlZmluZSBQQl9SMTkJCQkweDEzCS8qIExvdzFfREFDICovCisjZGVmaW5lIFBCX1IyMAkJCTB4MTQJLyogTG93Ml9EQUMgKi8KKyNkZWZpbmUgUEJfUjIxCQkJMHgxNQkvKiBUaHJlc2hvbGQxMSAqLworI2RlZmluZSBQQl9SMjIJCQkweDE2CS8qIFRocmVzaG9sZDB4ICovCisjZGVmaW5lIFBCX1VQREFURUlOVAkJMHgxNwkvKiBVcGRhdGUgSW50ZXJ2YWwgKi8KKyNkZWZpbmUgUEJfUjI0CQkJMHgxOAkvKiBIaWdoX0RBQyAqLworI2RlZmluZSBQQl9SMjUJCQkweDE5CS8qIFRyYW5zMEggKi8KKyNkZWZpbmUgUEJfUjI2CQkJMHgxYQkvKiBUcmFuczFMICovCisjZGVmaW5lIFBCX1IyNwkJCTB4MWIJLyogVHJhbnMxSCAqLworI2RlZmluZSBQQl9SMjgJCQkweDFjCS8qIFRyYW5zMkwgKi8KKyNkZWZpbmUgUEJfUjI5CQkJMHgxZAkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQl9SMzAJCQkweDFlCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFBCX1IzMQkJCTB4MWYJLyogV2FpdCB0byBSZWFkICovCisjZGVmaW5lIFBCX1BSRUFEQ1RSTAkJMHgyMAkvKiBQaXhlbCBSZWFkIENvbnRyb2wgTW9kZSAqLworI2RlZmluZSBQQl9SMzMJCQkweDIxCS8qIElSRUZfVkxOICovCisjZGVmaW5lIFBCX1IzNAkJCTB4MjIJLyogSVJFRl9WTFAgKi8KKyNkZWZpbmUgUEJfUjM1CQkJMHgyMwkvKiBJUkVGX1ZMTl9JTlRFRyAqLworI2RlZmluZSBQQl9SMzYJCQkweDI0CS8qIElSRUZfTUFTVEVSICovCisjZGVmaW5lIFBCX1IzNwkJCTB4MjUJLyogSURBQ1AgKi8KKyNkZWZpbmUgUEJfUjM4CQkJMHgyNgkvKiBJREFDTiAqLworI2RlZmluZSBQQl9SMzkJCQkweDI3CS8qIERBQ19Db250cm9sX1JlZyAqLworI2RlZmluZSBQQl9SNDAJCQkweDI4CS8qIFZDTCAqLworI2RlZmluZSBQQl9SNDEJCQkweDI5CS8qIElSRUZfVkxOX0FEQ0lOICovCisjZGVmaW5lIFBCX1I0MgkJCTB4MmEJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEJfRzFHQUlOCQkweDJiCS8qIEdyZWVuIDEgR2FpbiAqLworI2RlZmluZSBQQl9CR0FJTgkJMHgyYwkvKiBCbHVlIEdhaW4gKi8KKyNkZWZpbmUgUEJfUkdBSU4JCTB4MmQJLyogUmVkIEdhaW4gKi8KKyNkZWZpbmUgUEJfRzJHQUlOCQkweDJlCS8qIEdyZWVuIDIgR2FpbiAqLworI2RlZmluZSBQQl9SNDcJCQkweDJmCS8qIERhcmsgUm93IEFkZHJlc3MgKi8KKyNkZWZpbmUgUEJfUjQ4CQkJMHgzMAkvKiBEYXJrIFJvdyBPcHRpb25zICovCisjZGVmaW5lIFBCX1I0OQkJCTB4MzEJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEJfUjUwCQkJMHgzMgkvKiBJbWFnZSBUZXN0IERhdGEgKi8KKyNkZWZpbmUgUEJfQURDTUFYR0FJTgkJMHgzMwkvKiBNYXhpbXVtIEdhaW4gKi8KKyNkZWZpbmUgUEJfQURDTUlOR0FJTgkJMHgzNAkvKiBNaW5pbXVtIEdhaW4gKi8KKyNkZWZpbmUgUEJfQURDR0xPQkFMR0FJTgkweDM1CS8qIEdsb2JhbCBHYWluICovCisjZGVmaW5lIFBCX1I1NAkJCTB4MzYJLyogTWF4aW11bSBGcmFtZSAqLworI2RlZmluZSBQQl9SNTUJCQkweDM3CS8qIE1pbmltdW0gRnJhbWUgKi8KKyNkZWZpbmUgUEJfUjU2CQkJMHgzOAkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQl9WT0ZGU0VUCQkweDM5CS8qIFZPRkZTRVQgKi8KKyNkZWZpbmUgUEJfUjU4CQkJMHgzYQkvKiBTbmFwLVNob3QgU2VxdWVuY2UgVHJpZ2dlciAqLworI2RlZmluZSBQQl9BRENHQUlOSAkJMHgzYgkvKiBWUkVGX0hJICovCisjZGVmaW5lIFBCX0FEQ0dBSU5MCQkweDNjCS8qIFZSRUZfTE8gKi8KKyNkZWZpbmUgUEJfUjYxCQkJMHgzZAkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBQQl9SNjIJCQkweDNlCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFBCX1I2MwkJCTB4M2YJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEJfUjY0CQkJMHg0MAkvKiBSZWQvQmx1ZSBHYWluICovCisjZGVmaW5lIFBCX1I2NQkJCTB4NDEJLyogR3JlZW4gMi9HcmVlbiAxIEdhaW4gKi8KKyNkZWZpbmUgUEJfUjY2CQkJMHg0MgkvKiBWUkVGX0hJL0xPICovCisjZGVmaW5lIFBCX1I2NwkJCTB4NDMJLyogSW50ZWdyYXRpb24gVGltZS9Sb3cgVW5pdCBDb3VudCAqLworI2RlZmluZSBQQl9SMjQwCQkJMHhmMAkvKiBBREMgVGVzdCAqLworI2RlZmluZSBQQl9SMjQxCQkJMHhmMSAgICAvKiBDaGlwIEVuYWJsZSAqLworI2RlZmluZSBQQl9SMjQyCQkJMHhmMgkvKiBSZXNlcnZlZCAqLworCitzdGF0aWMgaW50IHBiMDEwMF9wcm9iZShzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgcGIwMTAwX3N0YXJ0KHN0cnVjdCBzZCAqc2QpOworc3RhdGljIGludCBwYjAxMDBfaW5pdChzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgcGIwMTAwX3N0b3Aoc3RydWN0IHNkICpzZCk7CitzdGF0aWMgaW50IHBiMDEwMF9kdW1wKHN0cnVjdCBzZCAqc2QpOworCisvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IHBiMDEwMF9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBwYjAxMDBfc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBwYjAxMDBfZ2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9zZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBwYjAxMDBfZ2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBwYjAxMDBfc2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgcGIwMTAwX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9nZXRfYXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgcGIwMTAwX3NldF9hdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9nZXRfYXV0b2dhaW5fdGFyZ2V0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9zZXRfYXV0b2dhaW5fdGFyZ2V0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgcGIwMTAwX2dldF9uYXR1cmFsKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHBiMDEwMF9zZXRfbmF0dXJhbChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CisKK2NvbnN0IHN0cnVjdCBzdHYwNnh4X3NlbnNvciBzdHYwNnh4X3NlbnNvcl9wYjAxMDAgPSB7CisJLm5hbWUgPSAiUEItMDEwMCIsCisJLmkyY19mbHVzaCA9IDEsCisJLmkyY19hZGRyID0gMHhiYSwKKwkuaTJjX2xlbiA9IDIsCisKKwkubmN0cmxzID0gNywKKwkuY3RybHMgPSB7CisjZGVmaW5lIEdBSU5fSURYIDAKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lCQk9ICJHYWluIiwKKwkJCS5taW5pbXVtCT0gMCwKKwkJCS5tYXhpbXVtCT0gMjU1LAorCQkJLnN0ZXAJCT0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlICA9IDEyOAorCQl9LAorCQkuc2V0ID0gcGIwMTAwX3NldF9nYWluLAorCQkuZ2V0ID0gcGIwMTAwX2dldF9nYWluCisJfSwKKyNkZWZpbmUgUkVEX0JBTEFOQ0VfSURYIDEKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZQkJPSAiUmVkIEJhbGFuY2UiLAorCQkJLm1pbmltdW0JPSAtMjU1LAorCQkJLm1heGltdW0JPSAyNTUsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMAorCQl9LAorCQkuc2V0ID0gcGIwMTAwX3NldF9yZWRfYmFsYW5jZSwKKwkJLmdldCA9IHBiMDEwMF9nZXRfcmVkX2JhbGFuY2UKKwl9LAorI2RlZmluZSBCTFVFX0JBTEFOQ0VfSURYIDIKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUJCT0gIkJsdWUgQmFsYW5jZSIsCisJCQkubWluaW11bQk9IC0yNTUsCisJCQkubWF4aW11bQk9IDI1NSwKKwkJCS5zdGVwCQk9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSAgPSAwCisJCX0sCisJCS5zZXQgPSBwYjAxMDBfc2V0X2JsdWVfYmFsYW5jZSwKKwkJLmdldCA9IHBiMDEwMF9nZXRfYmx1ZV9iYWxhbmNlCisJfSwKKyNkZWZpbmUgRVhQT1NVUkVfSURYIDMKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZQkJPSAiRXhwb3N1cmUiLAorCQkJLm1pbmltdW0JPSAwLAorCQkJLm1heGltdW0JPSA1MTEsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMTIKKwkJfSwKKwkJLnNldCA9IHBiMDEwMF9zZXRfZXhwb3N1cmUsCisJCS5nZXQgPSBwYjAxMDBfZ2V0X2V4cG9zdXJlCisJfSwKKyNkZWZpbmUgQVVUT0dBSU5fSURYIDQKKwl7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZQkJPSAiQXV0b21hdGljIEdhaW4gYW5kIEV4cG9zdXJlIiwKKwkJCS5taW5pbXVtCT0gMCwKKwkJCS5tYXhpbXVtCT0gMSwKKwkJCS5zdGVwCQk9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSAgPSAxCisJCX0sCisJCS5zZXQgPSBwYjAxMDBfc2V0X2F1dG9nYWluLAorCQkuZ2V0ID0gcGIwMTAwX2dldF9hdXRvZ2FpbgorCX0sCisjZGVmaW5lIEFVVE9HQUlOX1RBUkdFVF9JRFggNQorCXsKKwkJeworCQkJLmlkCQk9IFY0TDJfQ1RSTF9DTEFTU19VU0VSICsgMHgxMDAwLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lCQk9ICJBdXRvbWF0aWMgR2FpbiBUYXJnZXQiLAorCQkJLm1pbmltdW0JPSAwLAorCQkJLm1heGltdW0JPSAyNTUsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMTI4CisJCX0sCisJCS5zZXQgPSBwYjAxMDBfc2V0X2F1dG9nYWluX3RhcmdldCwKKwkJLmdldCA9IHBiMDEwMF9nZXRfYXV0b2dhaW5fdGFyZ2V0CisJfSwKKyNkZWZpbmUgTkFUVVJBTF9JRFggNgorCXsKKwkJeworCQkJLmlkCQk9IFY0TDJfQ1RSTF9DTEFTU19VU0VSICsgMHgxMDAxLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lCQk9ICJOYXR1cmFsIExpZ2h0IFNvdXJjZSIsCisJCQkubWluaW11bQk9IDAsCisJCQkubWF4aW11bQk9IDEsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMQorCQl9LAorCQkuc2V0ID0gcGIwMTAwX3NldF9uYXR1cmFsLAorCQkuZ2V0ID0gcGIwMTAwX2dldF9uYXR1cmFsCisJfSwKKwl9LAorCisJLmluaXQgPSBwYjAxMDBfaW5pdCwKKwkucHJvYmUgPSBwYjAxMDBfcHJvYmUsCisJLnN0YXJ0ID0gcGIwMTAwX3N0YXJ0LAorCS5zdG9wID0gcGIwMTAwX3N0b3AsCisJLmR1bXAgPSBwYjAxMDBfZHVtcCwKKworCS5ubW9kZXMgPSAyLAorCS5tb2RlcyA9IHsKKy8qIGxvdyByZXMgLyBzdWJzYW1wbGUgbW9kZXMgZGlzYWJsZWQgYXMgdGhleSBhcmUgb25seSBoYWxmIHJlcyBob3Jpem9udGFsLAorICAgaGFsdmluZyB0aGUgdmVydGljYWwgcmVzb2x1dGlvbiBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgKi8KKwl7CisJCTMyMCwKKwkJMjQwLAorCQlWNEwyX1BJWF9GTVRfU0dSQkc4LAorCQlWNEwyX0ZJRUxEX05PTkUsCisJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAsCisJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gUEIwMTAwX0NST1BfVE9fVkdBCisJfSwKKwl7CisJCTM1MiwKKwkJMjg4LAorCQlWNEwyX1BJWF9GTVRfU0dSQkc4LAorCQlWNEwyX0ZJRUxEX05PTkUsCisJCS5zaXplaW1hZ2UgPSAzNTIgKiAyODgsCisJCS5ieXRlc3BlcmxpbmUgPSAzNTIsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMAorCX0sCisJfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zZW5zb3IuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3NlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zZW5zb3IuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEplYW4tRnJlZHJpYyBDbGVyZSwgTmlrb2xhcyBaaW1tZXJtYW5uLCBHZW9yZyBBY2hlcgorICoJCSAgICAgIE1hcmsgQ2F2ZS1BeWxhbmQsIENhcmxvIEUgUHJlbHosIERpY2sgU3RyZWVmbGFuZAorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIFR1dWtrYSBUb2l2b25lbgorICogQ29weXJpZ2h0IChjKSAyMDA4IEVyaWsgQW5kcsOpbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBQL04gODYxMDM3OiAgICAgIFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQyBTVFYwNjAwCisgKiBQL04gODYxMDUwLTAwMTA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQyBTVFYwNjAwCisgKiBQL04gODYxMDUwLTAwMjA6IFNlbnNvciBQaG90b2JpdCBQQjEwMCAgQVNJQyBTVFYwNjAwLTEgLSBRdWlja0NhbSBFeHByZXNzCisgKiBQL04gODYxMDU1OiAgICAgIFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBMRUdPIGNhbQorICogUC9OIDg2MTA3NS0wMDQwOiBTZW5zb3IgSERDUzEwMDAgICAgICAgIEFTSUMKKyAqIFAvTiA5NjExNzktMDcwMDogU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MDIgICAtIERleHhhIFdlYkNhbSBVU0IKKyAqIFAvTiA4NjEwNDAtMDAwMDogU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIFF1aWNrQ2FtIFdlYgorICovCisKKyNpZm5kZWYgU1RWMDZYWF9TRU5TT1JfSF8KKyNkZWZpbmUgU1RWMDZYWF9TRU5TT1JfSF8KKworI2luY2x1ZGUgInN0djA2eHguaCIKKworI2RlZmluZSBJU184NTAoc2QpCSgoc2QpLT5nc3BjYV9kZXYuZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSAweDg1MCkKKyNkZWZpbmUgSVNfODcwKHNkKQkoKHNkKS0+Z3NwY2FfZGV2LmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gMHg4NzApCisjZGVmaW5lIElTXzEwMjAoc2QpCSgoc2QpLT5zZW5zb3IgPT0gJnN0djA2eHhfc2Vuc29yX2hkY3MxMDIwKQorCitleHRlcm4gY29uc3Qgc3RydWN0IHN0djA2eHhfc2Vuc29yIHN0djA2eHhfc2Vuc29yX3Z2NjQxMDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3R2MDZ4eF9zZW5zb3Igc3R2MDZ4eF9zZW5zb3JfaGRjczF4MDA7CitleHRlcm4gY29uc3Qgc3RydWN0IHN0djA2eHhfc2Vuc29yIHN0djA2eHhfc2Vuc29yX2hkY3MxMDIwOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdHYwNnh4X3NlbnNvciBzdHYwNnh4X3NlbnNvcl9wYjAxMDA7CisKKyNkZWZpbmUgU1RWMDZYWF9NQVhfQ1RSTFMJCShWNEwyX0NJRF9MQVNUUDEgLSBWNEwyX0NJRF9CQVNFICsgMTApCisKK3N0cnVjdCBzdHYwNnh4X3NlbnNvciB7CisJLyogRGVmaW5lcyB0aGUgbmFtZSBvZiBhIHNlbnNvciAqLworCWNoYXIgbmFtZVszMl07CisKKwkvKiBTZW5zb3IgaTJjIGFkZHJlc3MgKi8KKwl1OCBpMmNfYWRkcjsKKworCS8qIEZsdXNoIHZhbHVlKi8KKwl1OCBpMmNfZmx1c2g7CisKKwkvKiBsZW5ndGggb2YgYW4gaTJjIHdvcmQgKi8KKwl1OCBpMmNfbGVuOworCisJLyogUHJvYmVzIGlmIHRoZSBzZW5zb3IgaXMgY29ubmVjdGVkICovCisJaW50ICgqcHJvYmUpKHN0cnVjdCBzZCAqc2QpOworCisJLyogUGVyZm9ybXMgYSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSAqLworCWludCAoKmluaXQpKHN0cnVjdCBzZCAqc2QpOworCisJLyogRXhlY3V0ZWQgYXQgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KKwl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IHNkICpzZCk7CisKKwkvKiBSZWFkcyBhIHNlbnNvciByZWdpc3RlciAqLworCWludCAoKnJlYWRfc2Vuc29yKShzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCSAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKKworCS8qIFdyaXRlcyB0byBhIHNlbnNvciByZWdpc3RlciAqLworCWludCAoKndyaXRlX3NlbnNvcikoc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKKwkvKiBJbnN0cnVjdHMgdGhlIHNlbnNvciB0byBzdGFydCBzdHJlYW1pbmcgKi8KKwlpbnQgKCpzdGFydCkoc3RydWN0IHNkICpzZCk7CisKKwkvKiBJbnN0cnVjdHMgdGhlIHNlbnNvciB0byBzdG9wIHN0cmVhbWluZyAqLworCWludCAoKnN0b3ApKHN0cnVjdCBzZCAqc2QpOworCisJLyogSW5zdHJ1Y3RzIHRoZSBzZW5zb3IgdG8gZHVtcCBhbGwgaXRzIGNvbnRlbnRzICovCisJaW50ICgqZHVtcCkoc3RydWN0IHNkICpzZCk7CisKKwlpbnQgbmN0cmxzOworCXN0cnVjdCBjdHJsIGN0cmxzW1NUVjA2WFhfTUFYX0NUUkxTXTsKKworCWNoYXIgbm1vZGVzOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgbW9kZXNbXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVhbi1GcmVkcmljIENsZXJlLCBOaWtvbGFzIFppbW1lcm1hbm4sIEdlb3JnIEFjaGVyCisgKgkJICAgICAgTWFyayBDYXZlLUF5bGFuZCwgQ2FybG8gRSBQcmVseiwgRGljayBTdHJlZWZsYW5kCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVHV1a2thIFRvaXZvbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayBBbmRyw6luCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFAvTiA4NjEwMzc6ICAgICAgU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAxMDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAyMDogU2Vuc29yIFBob3RvYml0IFBCMTAwICBBU0lDIFNUVjA2MDAtMSAtIFF1aWNrQ2FtIEV4cHJlc3MKKyAqIFAvTiA4NjEwNTU6ICAgICAgU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIExFR08gY2FtCisgKiBQL04gODYxMDc1LTAwNDA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQworICogUC9OIDk2MTE3OS0wNzAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYwMiAgIC0gRGV4eGEgV2ViQ2FtIFVTQgorICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCisgKi8KKworI2luY2x1ZGUgInN0djA2eHhfdnY2NDEwLmgiCisKK3N0YXRpYyBpbnQgdnY2NDEwX3Byb2JlKHN0cnVjdCBzZCAqc2QpCit7CisJdTE2IGRhdGE7CisJaW50IGVycjsKKworCWVyciA9IHN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIFZWNjQxMF9ERVZJQ0VILCAmZGF0YSk7CisKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGF0YSA9PSAweDE5KSB7CisJCWluZm8oInZ2NjQxMCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKworCQlzZC0+Z3NwY2FfZGV2LmNhbS5jYW1fbW9kZSA9IHN0djA2eHhfc2Vuc29yX3Z2NjQxMC5tb2RlczsKKwkJc2QtPmdzcGNhX2Rldi5jYW0ubm1vZGVzID0gc3R2MDZ4eF9zZW5zb3JfdnY2NDEwLm5tb2RlczsKKwkJc2QtPmRlc2MuY3RybHMgPSBzdHYwNnh4X3NlbnNvcl92djY0MTAuY3RybHM7CisJCXNkLT5kZXNjLm5jdHJscyA9IHN0djA2eHhfc2Vuc29yX3Z2NjQxMC5uY3RybHM7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHZ2NjQxMF9pbml0KHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGVyciA9IDAsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHZfYnJpZGdlX2luaXQpOyBpKyspIHsKKwkJLyogaWYgTlVMTCB0aGVuIGxlbiBjb250YWlucyBzaW5nbGUgdmFsdWUgKi8KKwkJaWYgKHN0dl9icmlkZ2VfaW5pdFtpXS5kYXRhID09IE5VTEwpIHsKKwkJCWVyciA9IHN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLAorCQkJCXN0dl9icmlkZ2VfaW5pdFtpXS5zdGFydCwKKwkJCQlzdHZfYnJpZGdlX2luaXRbaV0ubGVuKTsKKwkJfSBlbHNlIHsKKwkJCWludCBqOworCQkJZm9yIChqID0gMDsgaiA8IHN0dl9icmlkZ2VfaW5pdFtpXS5sZW47IGorKykKKwkJCQllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwKKwkJCQkJc3R2X2JyaWRnZV9pbml0W2ldLnN0YXJ0ICsgaiwKKwkJCQkJc3R2X2JyaWRnZV9pbml0W2ldLmRhdGFbal0pOworCQl9CisJfQorCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzdHYwNnh4X3dyaXRlX3NlbnNvcl9ieXRlcyhzZCwgKHU4ICopIHZ2NjQxMF9zZW5zb3JfaW5pdCwKKwkJCQkJIEFSUkFZX1NJWkUodnY2NDEwX3NlbnNvcl9pbml0KSk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCB2djY0MTBfc3RhcnQoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBjYW0gKmNhbSA9ICZzZC0+Z3NwY2FfZGV2LmNhbTsKKwl1MzIgcHJpdiA9IGNhbS0+Y2FtX21vZGVbc2QtPmdzcGNhX2Rldi5jdXJyX21vZGVdLnByaXY7CisKKwlpZiAocHJpdiAmIFZWNjQxMF9DUk9QX1RPX1FWR0EpIHsKKwkJUERFQlVHKERfQ09ORiwgIkNyb3BwaW5nIHRvIFFWR0EiKTsKKwkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFZWNjQxMF9YRU5ESCwgMzIwIC0gMSk7CisJCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfWUVOREgsIDI0MCAtIDEpOworCX0gZWxzZSB7CisJCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfWEVOREgsIDM2MCAtIDEpOworCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgVlY2NDEwX1lFTkRILCAyOTQgLSAxKTsKKwl9CisKKwlpZiAocHJpdiAmIFZWNjQxMF9TVUJTQU1QTEUpIHsKKwkJUERFQlVHKERfQ09ORiwgIkVuYWJsaW5nIHN1YnNhbXBsaW5nIik7CisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWV9DVFJMLCAweDAyKTsKKwkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9YX0NUUkwsIDB4MDYpOworCisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfU0NBTl9SQVRFLCAweDEwKTsKKwl9IGVsc2UgeworCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1lfQ1RSTCwgMHgwMSk7CisJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWF9DVFJMLCAweDBhKTsKKworCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1NDQU5fUkFURSwgMHgyMCk7CisJfQorCisJLyogVHVybiBvbiBMRUQgKi8KKwllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX0xFRF9DVFJMLCBMRURfT04pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFZWNjQxMF9TRVRVUDAsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJUERFQlVHKERfU1RSRUFNLCAiU3RhcnRpbmcgc3RyZWFtIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2djY0MTBfc3RvcChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBlcnI7CisKKwkvKiBUdXJuIG9mZiBMRUQgKi8KKwllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX0xFRF9DVFJMLCBMRURfT0ZGKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfU0VUVVAwLCBWVjY0MTBfTE9XX1BPV0VSX01PREUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJUERFQlVHKERfU1RSRUFNLCAiSGFsdGluZyBzdHJlYW0iKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitzdGF0aWMgaW50IHZ2NjQxMF9kdW1wKHN0cnVjdCBzZCAqc2QpCit7CisJdTggaTsKKwlpbnQgZXJyID0gMDsKKworCWluZm8oIkR1bXBpbmcgYWxsIHZ2NjQxMCBzZW5zb3IgcmVnaXN0ZXJzIik7CisJZm9yIChpID0gMDsgaSA8IDB4ZmYgJiYgIWVycjsgaSsrKSB7CisJCXUxNiBkYXRhOworCQllcnIgPSBzdHYwNnh4X3JlYWRfc2Vuc29yKHNkLCBpLCAmZGF0YSk7CisJCWluZm8oIlJlZ2lzdGVyIDB4JXggY29udGFpbmVkIDB4JXgiLCBpLCBkYXRhKTsKKwl9CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdnY2NDEwX2dldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1MTYgaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgVlY2NDEwX0RBVEFGT1JNQVQsICZpMmNfZGF0YSk7CisKKwkqdmFsID0gKGkyY19kYXRhICYgVlY2NDEwX0hGTElQKSA/IDEgOiAwOworCisJUERFQlVHKERfVjRMMiwgIlJlYWQgaG9yaXpvbnRhbCBmbGlwICVkIiwgKnZhbCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCB2djY0MTBfc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJdTE2IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwllcnIgPSBzdHYwNnh4X3JlYWRfc2Vuc29yKHNkLCBWVjY0MTBfREFUQUZPUk1BVCwgJmkyY19kYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh2YWwpCisJCWkyY19kYXRhIHw9IFZWNjQxMF9IRkxJUDsKKwllbHNlCisJCWkyY19kYXRhICY9IH5WVjY0MTBfSEZMSVA7CisKKwlQREVCVUcoRF9WNEwyLCAiU2V0IGhvcml6b250YWwgZmxpcCB0byAlZCIsIHZhbCk7CisJZXJyID0gc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFZWNjQxMF9EQVRBRk9STUFULCBpMmNfZGF0YSk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCB2djY0MTBfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlpbnQgZXJyOworCXUxNiBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBzdHYwNnh4X3JlYWRfc2Vuc29yKHNkLCBWVjY0MTBfREFUQUZPUk1BVCwgJmkyY19kYXRhKTsKKworCSp2YWwgPSAoaTJjX2RhdGEgJiBWVjY0MTBfVkZMSVApID8gMSA6IDA7CisKKwlQREVCVUcoRF9WNEwyLCAiUmVhZCB2ZXJ0aWNhbCBmbGlwICVkIiwgKnZhbCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCB2djY0MTBfc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJdTE2IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwllcnIgPSBzdHYwNnh4X3JlYWRfc2Vuc29yKHNkLCBWVjY0MTBfREFUQUZPUk1BVCwgJmkyY19kYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh2YWwpCisJCWkyY19kYXRhIHw9IFZWNjQxMF9WRkxJUDsKKwllbHNlCisJCWkyY19kYXRhICY9IH5WVjY0MTBfVkZMSVA7CisKKwlQREVCVUcoRF9WNEwyLCAiU2V0IHZlcnRpY2FsIGZsaXAgdG8gJWQiLCB2YWwpOworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfREFUQUZPUk1BVCwgaTJjX2RhdGEpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdnY2NDEwX2dldF9hbmFsb2dfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1MTYgaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gc3R2MDZ4eF9yZWFkX3NlbnNvcihzZCwgVlY2NDEwX0FOQUxPR0dBSU4sICZpMmNfZGF0YSk7CisKKwkqdmFsID0gaTJjX2RhdGEgJiAweGY7CisKKwlQREVCVUcoRF9WNEwyLCAiUmVhZCBhbmFsb2cgZ2FpbiAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK3N0YXRpYyBpbnQgdnY2NDEwX3NldF9hbmFsb2dfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEX1Y0TDIsICJTZXQgYW5hbG9nIGdhaW4gdG8gJWQiLCB2YWwpOworCWVyciA9IHN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfQU5BTE9HR0FJTiwgMHhmMCB8ICh2YWwgJiAweGYpKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmY4YzRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmgKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSmVhbi1GcmVkcmljIENsZXJlLCBOaWtvbGFzIFppbW1lcm1hbm4sIEdlb3JnIEFjaGVyCisgKgkJICAgICAgTWFyayBDYXZlLUF5bGFuZCwgQ2FybG8gRSBQcmVseiwgRGljayBTdHJlZWZsYW5kCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVHV1a2thIFRvaXZvbmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayBBbmRyw6luCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIFAvTiA4NjEwMzc6ICAgICAgU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAxMDogU2Vuc29yIEhEQ1MxMDAwICAgICAgICBBU0lDIFNUVjA2MDAKKyAqIFAvTiA4NjEwNTAtMDAyMDogU2Vuc29yIFBob3RvYml0IFBCMTAwICBBU0lDIFNUVjA2MDAtMSAtIFF1aWNrQ2FtIEV4cHJlc3MKKyAqIFAvTiA4NjEwNTU6ICAgICAgU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIExFR08gY2FtCisgKiBQL04gODYxMDc1LTAwNDA6IFNlbnNvciBIRENTMTAwMCAgICAgICAgQVNJQworICogUC9OIDk2MTE3OS0wNzAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYwMiAgIC0gRGV4eGEgV2ViQ2FtIFVTQgorICogUC9OIDg2MTA0MC0wMDAwOiBTZW5zb3IgU1QgVlY2NDEwICAgICAgIEFTSUMgU1RWMDYxMCAgIC0gUXVpY2tDYW0gV2ViCisgKi8KKworI2lmbmRlZiBTVFYwNlhYX1ZWNjQxMF9IXworI2RlZmluZSBTVFYwNlhYX1ZWNjQxMF9IXworCisjaW5jbHVkZSAic3R2MDZ4eF9zZW5zb3IuaCIKKworI2RlZmluZSBWVjY0MTBfQ09MUwkJCTQxNgorI2RlZmluZSBWVjY0MTBfUk9XUwkJCTMyMAorCisvKiBTdGF0dXMgcmVnaXN0ZXJzICovCisvKiBDaGlwIGlkZW50aWZpY2F0aW9uIG51bWJlciBpbmNsdWRpbmcgcmV2aXNpb24gaW5kaWNhdG9yICovCisjZGVmaW5lIFZWNjQxMF9ERVZJQ0VICQkJMHgwMAorI2RlZmluZSBWVjY0MTBfREVWSUNFTAkJCTB4MDEKKworLyogVXNlciBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgdGltZWQgSTJDIGRhdGEKKyAgIGhhcyBiZWVuIGNvbnN1bWVkIGJ5IGludGVycm9nYXRpbmcgZmxhZyBzdGF0ZXMgKi8KKyNkZWZpbmUgVlY2NDEwX1NUQVRVUzAJCQkweDAyCisKKy8qIEN1cnJlbnQgbGluZSBjb3VudGVyIHZhbHVlICovCisjZGVmaW5lIFZWNjQxMF9MSU5FQ09VTlRICQkweDAzCisjZGVmaW5lIFZWNjQxMF9MSU5FQ09VTlRMCQkweDA0CisKKy8qIEVuZCB4IGNvb3JkaW5hdGUgb2YgaW1hZ2Ugc2l6ZSAqLworI2RlZmluZSBWVjY0MTBfWEVOREgJCQkweDA1CisjZGVmaW5lIFZWNjQxMF9YRU5ETAkJCTB4MDYKKworLyogRW5kIHkgY29vcmRpbmF0ZSBvZiBpbWFnZSBzaXplICovCisjZGVmaW5lIFZWNjQxMF9ZRU5ESAkJCTB4MDcKKyNkZWZpbmUgVlY2NDEwX1lFTkRMCQkJMHgwOAorCisvKiBUaGlzIGlzIHRoZSBhdmVyYWdlIHBpeGVsIHZhbHVlIHJldHVybmVkIGZyb20gdGhlCisgICBkYXJrIGxpbmUgb2Zmc2V0IGNhbmNlbGxhdGlvbiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgVlY2NDEwX0RBUktBVkdICQkJMHgwOQorI2RlZmluZSBWVjY0MTBfREFSS0FWR0wJCQkweDBhCisKKy8qIFRoaXMgaXMgdGhlIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUKKyAgIGJsYWNrIGxpbmUgb2Zmc2V0IGNhbmNlbGxhdGlvbiBhbGdvcml0aG0gICovCisjZGVmaW5lIFZWNjQxMF9CTEFDS0FWR0gJCTB4MGIKKyNkZWZpbmUgVlY2NDEwX0JMQUNLQVZHTAkJMHgwYworCisvKiBGbGFncyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB4IG9yIHkgaW1hZ2UgY29vcmRpbmF0ZXMgaGF2ZSBiZWVuIGNsaXBwZWQgKi8KKyNkZWZpbmUgVlY2NDEwX1NUQVRVUzEJCQkweDBkCisKKy8qIFNldHVwIHJlZ2lzdGVycyAqLworCisvKiBMb3ctcG93ZXIvc2xlZXAgbW9kZXMgJiB2aWRlbyB0aW1pbmcgKi8KKyNkZWZpbmUgVlY2NDEwX1NFVFVQMAkJCTB4MTAKKworLyogVmFyaW91cyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFZWNjQxMF9TRVRVUDEJCQkweDExCisKKy8qIENvbnRhaW5zIHBpeGVsIGNvdW50ZXIgcmVzZXQgdmFsdWUgdXNlZCBieSBleHRlcm5hbCBzeW5jICovCisjZGVmaW5lIFZWNjQxMF9TWU5DVkFMVUUJCTB4MTIKKworLyogRnJhbWUgZ3JhYmJpbmcgbW9kZXMgKEZTVCwgTFNUIGFuZCBRQ0spICovCisjZGVmaW5lIFZWNjQxMF9GR01PREVTCQkJMHgxNAorCisvKiBGU1QgYW5kIFFDSyBtYXBwaW5nIG1vZGVzLiAqLworI2RlZmluZSBWVjY0MTBfUElOTUFQUElORwkJMHgxNQorCisvKiBEYXRhIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgVlY2NDEwX0RBVEFGT1JNQVQJCTB4MTYKKworLyogT3V0cHV0IGNvZGluZyBmb3JtYXRzICovCisjZGVmaW5lIFZWNjQxMF9PUEZPUk1BVAkJCTB4MTcKKworLyogVmFyaW91cyBtb2RlIHNlbGVjdCBiaXRzICovCisjZGVmaW5lIFZWNjQxMF9NT0RFU0VMRUNUCQkweDE4CisKKy8qIEV4cG9zdXJlIHJlZ2lzdGVycyAqLworLyogRmluZSBleHBvc3VyZS4gKi8KKyNkZWZpbmUgVlY2NDEwX0ZJTkVICQkJMHgyMAorI2RlZmluZSBWVjY0MTBfRklORUwJCQkweDIxCisKKy8qIENvYXJzZSBleHBvc3VyZSAqLworI2RlZmluZSBWVjY0MTBfQ09BUlNFSAkJCTB4MjIKKyNkZWZpbmUgVlY2NDEwX0NPQVJTRUwJCQkweDIzCisKKy8qIEFuYWxvZyBnYWluIHNldHRpbmcgKi8KKyNkZWZpbmUgVlY2NDEwX0FOQUxPR0dBSU4JCTB4MjQKKworLyogQ2xvY2sgZGl2aXNpb24gKi8KKyNkZWZpbmUgVlY2NDEwX0NMS0RJVgkJCTB4MjUKKworLyogRGFyayBsaW5lIG9mZnNldCBjYW5jZWxsYXRpb24gdmFsdWUgKi8KKyNkZWZpbmUgVlY2NDEwX0RBUktPRkZTRVRICQkweDJjCisjZGVmaW5lIFZWNjQxMF9EQVJLT0ZGU0VUTAkJMHgyZAorCisvKiBEYXJrIGxpbmUgb2Zmc2V0IGNhbmNlbGxhdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgVlY2NDEwX0RBUktPRkZTRVRTRVRVUAkJMHgyZQorCisvKiBWaWRlbyB0aW1pbmcgcmVnaXN0ZXJzICovCisvKiBMaW5lIExlbmd0aCAoUGl4ZWwgQ2xvY2tzKSAqLworI2RlZmluZSBWVjY0MTBfTElORUxFTkdUSEgJCTB4NTIKKyNkZWZpbmUgVlY2NDEwX0xJTkVMRU5HVEhMCQkweDUzCisKKy8qIFgtY28tb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlZ2lvbiBvZiBpbnRlcmVzdCAoeC1vZmZzZXQpICovCisjZGVmaW5lIFZWNjQxMF9YT0ZGU0VUSAkJCTB4NTcKKyNkZWZpbmUgVlY2NDEwX1hPRkZTRVRMCQkJMHg1OAorCisvKiBZLWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlZ2lvbiBvZiBpbnRlcmVzdCAoeS1vZmZzZXQpICovCisjZGVmaW5lIFZWNjQxMF9ZT0ZGU0VUSAkJCTB4NTkKKyNkZWZpbmUgVlY2NDEwX1lPRkZTRVRMCQkJMHg1YQorCisvKiBGaWVsZCBsZW5ndGggKExpbmVzKSAqLworI2RlZmluZSBWVjY0MTBfRklFTERMRU5HVEhICQkweDYxCisjZGVmaW5lIFZWNjQxMF9GSUVMRExFTkdUSEwJCTB4NjIKKworLyogU3lzdGVtIHJlZ2lzdGVycyAqLworLyogQmxhY2sgb2Zmc2V0IGNhbmNlbGxhdGlvbiBkZWZhdWx0IHZhbHVlICovCisjZGVmaW5lIFZWNjQxMF9CTEFDS09GRlNFVEgJCTB4NzAKKyNkZWZpbmUgVlY2NDEwX0JMQUNLT0ZGU0VUTAkJMHg3MQorCisvKiBCbGFjayBvZmZzZXQgY2FuY2VsbGF0aW9uIHNldHVwICovCisjZGVmaW5lIFZWNjQxMF9CTEFDS09GRlNFVFNFVFVQCQkweDcyCisKKy8qIEFuYWxvZyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgVlY2NDEwX0NSMAkJCTB4NzUKKworLyogQW5hbG9nIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBWVjY0MTBfQ1IxCQkJMHg3NgorCisvKiBBREMgU2V0dXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVlY2NDEwX0FTMAkJCTB4NzcKKworLyogQW5hbG9nIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVlY2NDEwX0FUMAkJCTB4NzgKKworLyogQXVkaW8gQW1wbGlmaWVyIFNldHVwIFJlZ2lzdGVyICovCisjZGVmaW5lIFZWNjQxMF9BVDEJCQkweDc5CisKKyNkZWZpbmUgVlY2NDEwX0hGTElQIAkJCSgxIDw8IDMpCisjZGVmaW5lIFZWNjQxMF9WRkxJUCAJCQkoMSA8PCA0KQorCisjZGVmaW5lIFZWNjQxMF9MT1dfUE9XRVJfTU9ERQkJKDEgPDwgMCkKKyNkZWZpbmUgVlY2NDEwX1NPRlRfUkVTRVQJCSgxIDw8IDIpCisjZGVmaW5lIFZWNjQxMF9QQUxfMjVfRlBTCQkoMCA8PCAzKQorCisjZGVmaW5lIFZWNjQxMF9DTEtfRElWXzIJCSgxIDw8IDEpCisKKyNkZWZpbmUgVlY2NDEwX0ZJTkVfRVhQT1NVUkUJCTMyMAorI2RlZmluZSBWVjY0MTBfQ09BUlNFX0VYUE9TVVJFCQkxOTIKKyNkZWZpbmUgVlY2NDEwX0RFRkFVTFRfR0FJTgkJNQorCisjZGVmaW5lIFZWNjQxMF9TVUJTQU1QTEUJCTB4MDEKKyNkZWZpbmUgVlY2NDEwX0NST1BfVE9fUVZHQQkJMHgwMgorCitzdGF0aWMgaW50IHZ2NjQxMF9wcm9iZShzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgdnY2NDEwX3N0YXJ0KHN0cnVjdCBzZCAqc2QpOworc3RhdGljIGludCB2djY0MTBfaW5pdChzdHJ1Y3Qgc2QgKnNkKTsKK3N0YXRpYyBpbnQgdnY2NDEwX3N0b3Aoc3RydWN0IHNkICpzZCk7CitzdGF0aWMgaW50IHZ2NjQxMF9kdW1wKHN0cnVjdCBzZCAqc2QpOworCisvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IHZ2NjQxMF9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgdnY2NDEwX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHZ2NjQxMF9nZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgdnY2NDEwX3NldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHZ2NjQxMF9nZXRfYW5hbG9nX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgdnY2NDEwX3NldF9hbmFsb2dfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CisKK2NvbnN0IHN0cnVjdCBzdHYwNnh4X3NlbnNvciBzdHYwNnh4X3NlbnNvcl92djY0MTAgPSB7CisJLm5hbWUgPSAiU1QgVlY2NDEwIiwKKwkuaTJjX2ZsdXNoID0gNSwKKwkuaTJjX2FkZHIgPSAweDIwLAorCS5pMmNfbGVuID0gMSwKKwkuaW5pdCA9IHZ2NjQxMF9pbml0LAorCS5wcm9iZSA9IHZ2NjQxMF9wcm9iZSwKKwkuc3RhcnQgPSB2djY0MTBfc3RhcnQsCisJLnN0b3AgPSB2djY0MTBfc3RvcCwKKwkuZHVtcCA9IHZ2NjQxMF9kdW1wLAorCisJLm5jdHJscyA9IDMsCisJLmN0cmxzID0geworCXsKKwkJeworCQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lCQk9ICJob3Jpem9udGFsIGZsaXAiLAorCQkJLm1pbmltdW0JPSAwLAorCQkJLm1heGltdW0JPSAxLAorCQkJLnN0ZXAJCT0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlCT0gMAorCQl9LAorCQkuc2V0ID0gdnY2NDEwX3NldF9oZmxpcCwKKwkJLmdldCA9IHZ2NjQxMF9nZXRfaGZsaXAKKwl9LCB7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZQkJPSAidmVydGljYWwgZmxpcCIsCisJCQkubWluaW11bQk9IDAsCisJCQkubWF4aW11bQk9IDEsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gMAorCQl9LAorCQkuc2V0ID0gdnY2NDEwX3NldF92ZmxpcCwKKwkJLmdldCA9IHZ2NjQxMF9nZXRfdmZsaXAKKwl9LCB7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lCQk9ICJhbmFsb2cgZ2FpbiIsCisJCQkubWluaW11bQk9IDAsCisJCQkubWF4aW11bQk9IDE1LAorCQkJLnN0ZXAJCT0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlICA9IDAKKwkJfSwKKwkJLnNldCA9IHZ2NjQxMF9zZXRfYW5hbG9nX2dhaW4sCisJCS5nZXQgPSB2djY0MTBfZ2V0X2FuYWxvZ19nYWluCisJfQorCX0sCisKKwkubm1vZGVzID0gMSwKKwkubW9kZXMgPSB7CisJeworCQkzNTYsCisJCTI5MiwKKwkJVjRMMl9QSVhfRk1UX1NHUkJHOCwKKwkJVjRMMl9GSUVMRF9OT05FLAorCQkuc2l6ZWltYWdlID0KKwkJCTM1NiAqIDI5MiwKKwkJLmJ5dGVzcGVybGluZSA9IDM1NiwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAwCisJfQorCX0KK307CisKKy8qIElmIE5VTEwsIG9ubHkgc2luZ2xlIHZhbHVlIHRvIHdyaXRlLCBzdG9yZWQgaW4gbGVuICovCitzdHJ1Y3Qgc3R2X2luaXQgeworCWNvbnN0IHU4ICpkYXRhOworCXUxNiBzdGFydDsKKwl1OCBsZW47Cit9OworCitzdGF0aWMgY29uc3QgdTggeDE1MDBbXSA9IHsJLyogMHgxNTAwIC0gMHgxNTBmICovCisJMHgwYiwgMHhhNywgMHhiNywgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGNvbnN0IHU4IHgxNTM2W10gPSB7CS8qIDB4MTUzNiAtIDB4MTUzYiAqLworCTB4MDIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4MjAsIDB4MDEKK307CisKK3N0YXRpYyBjb25zdCB1OCB4MTVjMVtdID0gewkvKiAweDE1YzEgLSAweDE1YzIgKi8KKwkweGZmLCAweDAzIC8qIE91dHB1dCB3b3JkIDB4MDNmZiA9IDEwMjMgKElTTyBzaXplKSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdHZfaW5pdCBzdHZfYnJpZGdlX2luaXRbXSA9IHsKKwkvKiBUaGlzIHJlZyBpcyB3cml0dGVuIHR3aWNlLiBTb21lIGtpbmQgb2YgcmVzZXQ/ICovCisJe05VTEwsICAweDE2MjAsIDB4ODB9LAorCXtOVUxMLCAgMHgxNjIwLCAweDAwfSwKKwl7TlVMTCwgIDB4MTQyMywgMHgwNH0sCisJe3gxNTAwLCAweDE1MDAsIEFSUkFZX1NJWkUoeDE1MDApfSwKKwl7eDE1MzYsIDB4MTUzNiwgQVJSQVlfU0laRSh4MTUzNil9LAorCXt4MTVjMSwgMHgxNWMxLCBBUlJBWV9TSVpFKHgxNWMxKX0KK307CisKK3N0YXRpYyBjb25zdCB1OCB2djY0MTBfc2Vuc29yX2luaXRbXVsyXSA9IHsKKwkvKiBTZXR1cCByZWdpc3RlcnMgKi8KKwl7VlY2NDEwX1NFVFVQMCwJCVZWNjQxMF9TT0ZUX1JFU0VUfSwKKwl7VlY2NDEwX1NFVFVQMCwJCVZWNjQxMF9MT1dfUE9XRVJfTU9ERX0sCisJLyogVXNlIHNodWZmbGVkIHJlYWQtb3V0IG1vZGUgKi8KKwl7VlY2NDEwX1NFVFVQMSwJCUJJVCg2KX0sCisJLyogQWxsIG1vZGVzIHRvIDEgKi8KKwl7VlY2NDEwX0ZHTU9ERVMsCUJJVCg2KSB8IEJJVCg0KSB8IEJJVCgyKSB8IEJJVCgwKX0sCisJe1ZWNjQxMF9QSU5NQVBQSU5HLAkweDAwfSwKKwkvKiBQcmUtY2xvY2sgZ2VuZXJhdG9yIGRpdmlkZSBvZmYgKi8KKwl7VlY2NDEwX0RBVEFGT1JNQVQsCUJJVCg3KSB8IEJJVCgwKX0sCisKKwkvKiBFeHBvc3VyZSByZWdpc3RlcnMgKi8KKwl7VlY2NDEwX0ZJTkVILAkJVlY2NDEwX0ZJTkVfRVhQT1NVUkUgPj4gOH0sCisJe1ZWNjQxMF9GSU5FTCwJCVZWNjQxMF9GSU5FX0VYUE9TVVJFICYgMHhmZn0sCisJe1ZWNjQxMF9DT0FSU0VILAlWVjY0MTBfQ09BUlNFX0VYUE9TVVJFID4+IDh9LAorCXtWVjY0MTBfQ09BUlNFTCwJVlY2NDEwX0NPQVJTRV9FWFBPU1VSRSAmIDB4ZmZ9LAorCXtWVjY0MTBfQU5BTE9HR0FJTiwJMHhmMCB8IFZWNjQxMF9ERUZBVUxUX0dBSU59LAorCXtWVjY0MTBfQ0xLRElWLAkJVlY2NDEwX0NMS19ESVZfMn0sCisKKwkvKiBTeXN0ZW0gcmVnaXN0ZXJzICovCisJLyogRW5hYmxlIHZvbHRhZ2UgZG91YmxlciAqLworCXtWVjY0MTBfQVMwLAkJQklUKDYpIHwgQklUKDQpIHwgQklUKDMpIHwgQklUKDIpIHwgQklUKDEpfSwKKwl7VlY2NDEwX0FUMCwJCTB4MDB9LAorCS8qIFBvd2VyIHVwIGF1ZGlvLCBkaWZmZXJlbnRpYWwgKi8KKwl7VlY2NDEwX0FUMSwJCUJJVCg0KXxCSVQoMCl9LAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCmluZGV4IGJkOTI4ODYuLjZkOTA0ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAogCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogMyAvIDggKyA1OTAsCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJLnByaXYgPSAxfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IGN1c3RvbV9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBjdXN0b21fbW9kZVtdID0gewogCXszMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDMyMCwKIAkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDMgLyA4ICsgNTkwLApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCS5wcml2ID0gMX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2Z2FfbW9kZTJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlMltdID0gewogCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKIAkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDMgLyA4ICsgNTkwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwppbmRleCBlYWMyNDVkLi42ZWUxMTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJIk5lZ2F0aXZlIiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlX3QxNltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVfdDE2W10gPSB7CiAJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMTYwLAogCQkuc2l6ZWltYWdlID0gMTYwICogMTIwICogNCAvIDggKyA1OTAsCkBAIC00OTksNyArNDk5LDcgQEAKIAlyZWdfd19idWYoZ3NwY2FfZGV2LCBzZW5zb3JfcmVzZXQsIHNpemVvZiBzZW5zb3JfcmVzZXQpOwogCW1zbGVlcCg1KTsKIAlpID0gNDsKLQl3aGlsZSAoLS1pIDwgMCkgeworCXdoaWxlICgtLWkgPiAwKSB7CiAJCWJ5dGUgPSByZWdfcihnc3BjYV9kZXYsIDB4MDA2MCk7CiAJCWlmICghKGJ5dGUgJiAweDAxKSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdHY4NTMyLmMKaW5kZXggOTY4YTU5MS4uOTQxNjNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jCkBAIC0zMCwxNSArMzAsMTAgQEAKIHN0cnVjdCBzZCB7CiAJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KIAotCWludCBidWZsZW47CQkJLyogY3VycmVudCBsZW5ndGggb2YgdG1wYnVmICovCi0JX191OCB0bXBidWZbMzUyICogMjg4ICsgMTAgKiAyODhdOwkvKiBubyBwcm90ZWN0aW9uLi4uICovCi0JX191OCB0bXBidWYyWzM1MiAqIDI4OF07CQkvKiBubyBwcm90ZWN0aW9uLi4uICovCisJX191MTYgYnJpZ2h0bmVzczsKKwlfX3UxNiBjb250cmFzdDsKIAotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7Ci0KLQljaGFyIHBhY2tldDsKLQljaGFyIHN5bmNocm87CisJX191OCBwYWNrZXQ7CiB9OwogCiAvKiBWNEwyIGNvbnRyb2xzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCkBAIC03OCw3ICs3Myw3IEBACiAJIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzaWZfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgc2lmX21vZGVbXSA9IHsKIAl7MTc2LCAxNDQsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKIAkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCwKQEAgLTM5Miw2ICszODcsOCBAQAogLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLwogc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCiAJcmVnX3dfMShnc3BjYV9kZXYsIFRWODUzMl9BRF9TTE9QRSwgMHgzMik7CiAJcmVnX3dfMShnc3BjYV9kZXYsIFRWODUzMl9BRF9CSVRDVFJMLCAweDAwKTsKIAl0dl84NTMyUmVhZFJlZ2lzdGVycyhnc3BjYV9kZXYpOwpAQCAtNDQzLDYgKzQ0MCwxMCBAQAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJdHZfODUzMl9Qb2xsUmVnKGdzcGNhX2Rldik7CiAJcmVnX3dfMShnc3BjYV9kZXYsIFRWODUzMl9VRFBfVVBEQVRFLCAweDAwKTsJLyogMHgzMSAqLworCisJZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQgPSAwOwkJLyogY2hlY2sgdGhlIGVtcHR5IHBhY2tldHMgKi8KKwlzZC0+cGFja2V0ID0gMDsJCQkJLyogaWdub3JlIHRoZSBmaXJzdCBwYWNrZXRzICovCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUxLDExMSArNDUyLDM2IEBACiAJcmVnX3dfMShnc3BjYV9kZXYsIFRWODUzMl9HUElPX09FLCAweDBiKTsKIH0KIAotc3RhdGljIHZvaWQgdHY4NTMyX3ByZXByb2Nlc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLS8qIHdlIHNob3VsZCByZWNlaXZlZCBhIHdob2xlIGZyYW1lIHdpdGggaGVhZGVyIGFuZCBFT0wgbWFya2VyCi0gKiBpbiBnc3BjYV9kZXYtPnRtcGJ1ZiBhbmQgcmV0dXJuIGEgR0JSRyBwYXR0ZXJuIGluIGdzcGNhX2Rldi0+dG1wYnVmMgotICogc2VxdWVuY2UgMmJ5dGVzIGhlYWRlciB0aGUgQWx0ZXJuYXRlIHBpeGVscyBiYXllciBHQiA0IGJ5dGVzCi0gKiBBbHRlcm5hdGUgcGl4ZWxzIGJheWVyIFJHIDQgYnl0ZXMgRU9MICovCi0JaW50IHdpZHRoID0gZ3NwY2FfZGV2LT53aWR0aDsKLQlpbnQgaGVpZ2h0ID0gZ3NwY2FfZGV2LT5oZWlnaHQ7Ci0JdW5zaWduZWQgY2hhciAqZHN0ID0gc2QtPnRtcGJ1ZjI7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHNkLT50bXBidWY7Ci0JaW50IGk7Ci0KLQkvKiBwcmVjb21wdXRlIHdoZXJlIGlzIHRoZSBnb29kIGJheWVyIGxpbmUgKi8KLQlpZiAoKChkYXRhWzNdICsgZGF0YVt3aWR0aCArIDddKSA+PiAxKQotCSAgICArIChkYXRhWzRdID4+IDIpCi0JICAgICsgKGRhdGFbd2lkdGggKyA2XSA+PiAxKSA+PSAoKGRhdGFbMl0gKyBkYXRhW3dpZHRoICsgNl0pID4+IDEpCi0JICAgICsgKGRhdGFbM10gPj4gMikKLQkgICAgKyAoZGF0YVt3aWR0aCArIDVdID4+IDEpKQotCQlkYXRhICs9IDM7Ci0JZWxzZQotCQlkYXRhICs9IDI7Ci0JZm9yIChpID0gMDsgaSA8IGhlaWdodCAvIDI7IGkrKykgewotCQltZW1jcHkoZHN0LCBkYXRhLCB3aWR0aCk7Ci0JCWRhdGEgKz0gd2lkdGggKyAzOwotCQlkc3QgKz0gd2lkdGg7Ci0JCW1lbWNweShkc3QsIGRhdGEsIHdpZHRoKTsKLQkJZGF0YSArPSB3aWR0aCArIDc7Ci0JCWRzdCArPSB3aWR0aDsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLwogCQkJX191OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLwogCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgcGFja2V0X3R5cGUwLCBwYWNrZXRfdHlwZTE7CiAKLQlpZiAoZGF0YVswXSAhPSAweDgwKSB7Ci0JCXNkLT5wYWNrZXQrKzsKLQkJaWYgKHNkLT5idWZsZW4gKyBsZW4gPiBzaXplb2Ygc2QtPnRtcGJ1ZikgewotCQkJaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSAhPSBESVNDQVJEX1BBQ0tFVCkgewotCQkJCVBERUJVRyhEX1BBQ0ssICJidWZmZXIgb3ZlcmZsb3ciKTsKLQkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQltZW1jcHkoJnNkLT50bXBidWZbc2QtPmJ1Zmxlbl0sIGRhdGEsIGxlbik7Ci0JCXNkLT5idWZsZW4gKz0gbGVuOwotCQlyZXR1cm47Ci0JfQorCXBhY2tldF90eXBlMCA9IHBhY2tldF90eXBlMSA9IElOVEVSX1BBQ0tFVDsKKwlpZiAoZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQpIHsKKwkJZ3NwY2FfZGV2LT5lbXB0eV9wYWNrZXQgPSAwOworCQlzZC0+cGFja2V0ID0gZ3NwY2FfZGV2LT5oZWlnaHQgLyAyOworCQlwYWNrZXRfdHlwZTAgPSBGSVJTVF9QQUNLRVQ7CisJfSBlbHNlIGlmIChzZC0+cGFja2V0ID09IDApCisJCXJldHVybjsJCQkvKiAyIG1vcmUgbGluZXMgaW4gMzUyeDI4OCAhICovCisJc2QtPnBhY2tldC0tOworCWlmIChzZC0+cGFja2V0ID09IDApCisJCXBhY2tldF90eXBlMSA9IExBU1RfUEFDS0VUOwogCi0JLyogaGVyZSB3ZSBkZXRlY3QgMHg4MCAqLwotCS8qIGNvdW50ZXIgaXMgbGltaXRlZCBzbyB3ZSBuZWVkIGZldyBoZWFkZXIgZm9yIGEgZnJhbWUgOikgKi8KLQotCS8qIGhlYWRlciAweDgwIDB4ODAgMHg4MCAweDgwIDB4ODAgKi8KLQkvKiBwYWNrZXQgIDAwICAgNjMgIDEyNyAgMTQ1ICAwMCAgICovCi0JLyogc29mICAgICAwICAgICAxICAgMSAgICAwICAgIDAgICAqLwotCi0JLyogdXBkYXRlIHNlcXVlbmNlICovCi0JaWYgKHNkLT5wYWNrZXQgPT0gNjMgfHwgc2QtPnBhY2tldCA9PSAxMjcpCi0JCXNkLT5zeW5jaHJvID0gMTsKLQotCS8qIGlzIHRoZXJlIGEgZnJhbWUgc3RhcnQgPyAqLwotCWlmIChzZC0+cGFja2V0ID49IChnc3BjYV9kZXYtPmhlaWdodCA+PiAxKSAtIDEpIHsKLQkJUERFQlVHKERfUEFDSywgIlNPRiA+ICVkIHBhY2tldCAlZCIsIHNkLT5zeW5jaHJvLAotCQkgICAgICAgc2QtPnBhY2tldCk7Ci0JCWlmICghc2QtPnN5bmNocm8pIHsJLyogc3RhcnQgb2YgZnJhbWUgKi8KLQkJCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPT0gRklSU1RfUEFDS0VUKSB7Ci0JCQkJdHY4NTMyX3ByZXByb2Nlc3MoZ3NwY2FfZGV2KTsKLQkJCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsCi0JCQkJCQkJTEFTVF9QQUNLRVQsCi0JCQkJCQkJZnJhbWUsIHNkLT50bXBidWYyLAotCQkJCQkJCWdzcGNhX2Rldi0+d2lkdGggKgotCQkJCQkJCSAgICBnc3BjYV9kZXYtPndpZHRoKTsKLQkJCX0KLQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKLQkJCQkJZnJhbWUsIGRhdGEsIDApOwotCQkJbWVtY3B5KHNkLT50bXBidWYsIGRhdGEsIGxlbik7Ci0JCQlzZC0+YnVmbGVuID0gbGVuOwotCQkJc2QtPnBhY2tldCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSAhPSBESVNDQVJEX1BBQ0tFVCkgewotCQkJUERFQlVHKERfUEFDSywKLQkJCSAgICAgICAiV2FybmluZyB3cm9uZyBUVjg1MzIgZnJhbWUgZGV0ZWN0aW9uICVkIiwKLQkJCSAgICAgICBzZC0+cGFja2V0KTsKLQkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXNkLT5zeW5jaHJvKSB7Ci0JCS8qIERyb3AgcGFja2V0IGZyYW1lIGNvcnJ1cHQgKi8KLQkJUERFQlVHKERfUEFDSywgIkRST1AgU09GICVkIHBhY2tldCAlZCIsCi0JCSAgICAgICBzZC0+c3luY2hybywgc2QtPnBhY2tldCk7Ci0JCXNkLT5wYWNrZXQgPSAwOwotCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKLQkJcmV0dXJuOwotCX0KLQlzZC0+c3luY2hybyA9IDE7Ci0Jc2QtPnBhY2tldCsrOwotCW1lbWNweSgmc2QtPnRtcGJ1ZltzZC0+YnVmbGVuXSwgZGF0YSwgbGVuKTsKLQlzZC0+YnVmbGVuICs9IGxlbjsKKwkvKiBlYWNoIHBhY2tldCBjb250YWluczoKKwkgKiAtIGhlYWRlciAyIGJ5dGVzCisJICogLSBSRyBsaW5lCisJICogLSA0IGJ5dGVzCisJICogLSBHQiBsaW5lCisJICogLSA0IGJ5dGVzCisJICovCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgcGFja2V0X3R5cGUwLAorCQkJZnJhbWUsIGRhdGEgKyAyLCBnc3BjYV9kZXYtPndpZHRoKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBwYWNrZXRfdHlwZTEsCisJCQlmcmFtZSwgZGF0YSArIGdzcGNhX2Rldi0+d2lkdGggKyA2LCBnc3BjYV9kZXYtPndpZHRoKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKaW5kZXggMTdhZjM1My4uMDUyNWVhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCkBAIC0zMiw0NCArMzIsNjggQEAKIHN0cnVjdCBzZCB7CiAJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KIAotCXVuc2lnbmVkIGNoYXIgYXV0b2dhaW47Ci0JdW5zaWduZWQgY2hhciBsaWdodGZyZXE7CisJX191OCBoZmxpcDsKKwlfX3U4IHZmbGlwOworCV9fdTggbGlnaHRmcmVxOworCV9fdTggc2hhcnBuZXNzOwogCi0JY2hhciBxaW5kZXg7CiAJY2hhciBicmlkZ2U7CiAjZGVmaW5lIEJSSURHRV9WQzAzMjEgMAogI2RlZmluZSBCUklER0VfVkMwMzIzIDEKIAljaGFyIHNlbnNvcjsKICNkZWZpbmUgU0VOU09SX0hWNzEzMVIgMAotI2RlZmluZSBTRU5TT1JfTUkxMzIwIDEKLSNkZWZpbmUgU0VOU09SX01JMTMxMF9TT0MgMgotI2RlZmluZSBTRU5TT1JfT1Y3NjYwIDMKLSNkZWZpbmUgU0VOU09SX09WNzY3MCA0Ci0jZGVmaW5lIFNFTlNPUl9QTzMxMzBOQyA1CisjZGVmaW5lIFNFTlNPUl9NSTAzNjAgMQorI2RlZmluZSBTRU5TT1JfTUkxMzIwIDIKKyNkZWZpbmUgU0VOU09SX01JMTMxMF9TT0MgMworI2RlZmluZSBTRU5TT1JfT1Y3NjYwIDQKKyNkZWZpbmUgU0VOU09SX09WNzY3MCA1CisjZGVmaW5lIFNFTlNPUl9QTzEyMDAgNgorI2RlZmluZSBTRU5TT1JfUE8zMTMwTkMgNwogfTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBzZF9zZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitzdGF0aWMgaW50IHNkX3NldGhmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK3N0YXRpYyBpbnQgc2RfZ2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwogc3RhdGljIGludCBzZF9zZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKIHN0YXRpYyBpbnQgc2RfZ2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworc3RhdGljIGludCBzZF9nZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIAogc3RhdGljIHN0cnVjdCBjdHJsIHNkX2N0cmxzW10gPSB7CisvKiBuZXh0IDIgY29udHJvbHMgd29yayB3aXRoIG92NzY2MCBhbmQgb3Y3NjcwIG9ubHkgKi8KKyNkZWZpbmUgSEZMSVBfSURYIDAKIAl7CiAJICAgIHsKLQkJLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9IRkxJUCwKIAkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZSAgICA9ICJBdXRvIEdhaW4iLAorCQkubmFtZSAgICA9ICJNaXJyb3IiLAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gMSwKIAkJLnN0ZXAgICAgPSAxLAotI2RlZmluZSBBVVRPR0FJTl9ERUYgMQotCQkuZGVmYXVsdF92YWx1ZSA9IEFVVE9HQUlOX0RFRiwKKyNkZWZpbmUgSEZMSVBfREVGIDAKKwkJLmRlZmF1bHRfdmFsdWUgPSBIRkxJUF9ERUYsCiAJICAgIH0sCi0JICAgIC5zZXQgPSBzZF9zZXRhdXRvZ2FpbiwKLQkgICAgLmdldCA9IHNkX2dldGF1dG9nYWluLAorCSAgICAuc2V0ID0gc2Rfc2V0aGZsaXAsCisJICAgIC5nZXQgPSBzZF9nZXRoZmxpcCwKIAl9LAotI2RlZmluZSBMSUdIVEZSRVFfSURYIDEKKyNkZWZpbmUgVkZMSVBfSURYIDEKKwl7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9WRkxJUCwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSAgICA9ICJWZmxpcCIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCAgICA9IDEsCisjZGVmaW5lIFZGTElQX0RFRiAwCisJCS5kZWZhdWx0X3ZhbHVlID0gVkZMSVBfREVGLAorCSAgICB9LAorCSAgICAuc2V0ID0gc2Rfc2V0dmZsaXAsCisJICAgIC5nZXQgPSBzZF9nZXR2ZmxpcCwKKwl9LAorI2RlZmluZSBMSUdIVEZSRVFfSURYIDIKIAl7CiAJICAgIHsKIAkJLmlkCSA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLApAQCAtODQsOSArMTA4LDI1IEBACiAJICAgIC5zZXQgPSBzZF9zZXRmcmVxLAogCSAgICAuZ2V0ID0gc2RfZ2V0ZnJlcSwKIAl9LAorLyogcG8xMjAwIG9ubHkgKi8KKyNkZWZpbmUgU0hBUlBORVNTX0lEWCAzCisJeworCSB7CisJICAuaWQgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCisJICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAubmFtZSA9ICJTaGFycG5lc3MiLAorCSAgLm1pbmltdW0gPSAwLAorCSAgLm1heGltdW0gPSAyLAorCSAgLnN0ZXAgPSAxLAorI2RlZmluZSBTSEFSUE5FU1NfREVGIDEKKwkgIC5kZWZhdWx0X3ZhbHVlID0gU0hBUlBORVNTX0RFRiwKKwkgIH0sCisJIC5zZXQgPSBzZF9zZXRzaGFycG5lc3MsCisJIC5nZXQgPSBzZF9nZXRzaGFycG5lc3MsCisJIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2YzAzMjFfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmMwMzIxX21vZGVbXSA9IHsKIAl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9ZVllVLCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCiAJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAgKiAyLApAQCAtOTgsNyArMTM4LDcgQEAKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAkJLnByaXYgPSAwfSwKIH07Ci1zdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2YzAzMjNfbW9kZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmMwMzIzX21vZGVbXSA9IHsKIAl7MzIwLCAyNDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAzMjAsCiAJCS5zaXplaW1hZ2UgPSAzMjAgKiAyNDAgKiAzIC8gOCArIDU5MCwKQEAgLTExMSw2ICsxNTEsMjUyIEBACiAJCS5wcml2ID0gMH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzdmdhX21vZGVbXSA9IHsKKwl7ODAwLCA2MDAsIFY0TDJfUElYX0ZNVF9KUEVHLCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSA4MDAsCisJCS5zaXplaW1hZ2UgPSA4MDAgKiA2MDAgKiAxIC8gNCArIDU5MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkJLnByaXYgPSAwfSwKK307CisKKy8qIE9WNzY2MC83NjcwIHJlZ2lzdGVycyAqLworI2RlZmluZSBPVjc2NjBfUkVHX01WRlAgMHgxZQorI2RlZmluZSBPVjc2NjBfTVZGUF9NSVJST1IJMHgyMAorI2RlZmluZSBPVjc2NjBfTVZGUF9WRkxJUAkweDEwCisKK3N0YXRpYyBjb25zdCBfX3U4IG1pMDM2MF9tYXRyaXhbOV0gPSB7CisJMHg1MCwgMHhmOCwgMHhmOCwgMHhmNSwgMHg1MCwgMHhmYiwgMHhmZiwgMHhmMSwgMHg1MAorfTsKKworc3RhdGljIGNvbnN0IF9fdTggbWkwMzYwX2luaXRWR0FfSlBHW11bNF0gPSB7CisJezB4YjAsIDB4MDMsIDB4MTksIDB4Y2N9LAorCXsweGIwLCAweDA0LCAweDAyLCAweGNjfSwKKwl7MHhiMywgMHgwMCwgMHgyNCwgMHhjY30sCisJezB4YjMsIDB4MDAsIDB4MjUsIDB4Y2N9LAorCXsweGIzLCAweDA4LCAweDAxLCAweGNjfSwKKwl7MHhiMywgMHgwOSwgMHgwYywgMHhjY30sCisJezB4YjMsIDB4MDUsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDA2LCAweDAzLCAweGNjfSwKKwl7MHhiMywgMHgwMywgMHgwYSwgMHhjY30sCisJezB4YjMsIDB4MjAsIDB4MDAsIDB4Y2N9LAorCXsweGIzLCAweDIxLCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgyMiwgMHgwMSwgMHhjY30sCisJezB4YjMsIDB4MjMsIDB4ZTAsIDB4Y2N9LAorCXsweGIzLCAweDA0LCAweDA1LCAweGNjfSwKKwl7MHhiMywgMHgxNCwgMHgwMCwgMHhjY30sCisJezB4YjMsIDB4MTUsIDB4MDAsIDB4Y2N9LAorCXsweGIzLCAweDE2LCAweDAyLCAweGNjfSwKKwl7MHhiMywgMHgxNywgMHg3ZiwgMHhjY30sCisJezB4YjMsIDB4MzUsIDB4ZGQsIDB4Y2N9LAorCXsweGIzLCAweDM0LCAweDAyLCAweGNjfSwKKwl7MHhiMywgMHgwMCwgMHgyNSwgMHhjY30sCisJezB4YmMsIDB4MDAsIDB4NzEsIDB4Y2N9LAorCXsweGI4LCAweDAwLCAweDEzLCAweGNjfSwKKwl7MHhiOCwgMHgyNywgMHgyMCwgMHhjY30sCisJezB4YjgsIDB4MmMsIDB4NTAsIDB4Y2N9LAorCXsweGI4LCAweDJkLCAweGY4LCAweGNjfSwKKwl7MHhiOCwgMHgyZSwgMHhmOCwgMHhjY30sCisJezB4YjgsIDB4MmYsIDB4ZjgsIDB4Y2N9LAorCXsweGI4LCAweDMwLCAweDUwLCAweGNjfSwKKwl7MHhiOCwgMHgzMSwgMHhmOCwgMHhjY30sCisJezB4YjgsIDB4MzIsIDB4ZjgsIDB4Y2N9LAorCXsweGI4LCAweDMzLCAweGY4LCAweGNjfSwKKwl7MHhiOCwgMHgzNCwgMHg1MCwgMHhjY30sCisJezB4YjgsIDB4MzUsIDB4MDAsIDB4Y2N9LAorCXsweGI4LCAweDM2LCAweDAwLCAweGNjfSwKKwl7MHhiOCwgMHgzNywgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4MDEsIDB4NzksIDB4Y2N9LAorCXsweGI4LCAweDA4LCAweGUwLCAweGNjfSwKKwl7MHhiMywgMHgwMSwgMHg0MSwgMHhjY30sCisJezB4YjgsIDB4MDEsIDB4NzksIDB4Y2N9LAorCXsweGI4LCAweDE0LCAweDE4LCAweGNjfSwKKwl7MHhiOCwgMHhiMiwgMHgwYSwgMHhjY30sCisJezB4YjgsIDB4YjQsIDB4MGEsIDB4Y2N9LAorCXsweGI4LCAweGI1LCAweDBhLCAweGNjfSwKKwl7MHhiOCwgMHhmZSwgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4ZmYsIDB4MjgsIDB4Y2N9LAorCXsweGI5LCAweDAwLCAweDI4LCAweGNjfSwKKwl7MHhiOSwgMHgwMSwgMHgyOCwgMHhjY30sCisJezB4YjksIDB4MDIsIDB4MjgsIDB4Y2N9LAorCXsweGI5LCAweDAzLCAweDAwLCAweGNjfSwKKwl7MHhiOSwgMHgwNCwgMHgwMCwgMHhjY30sCisJezB4YjksIDB4MDUsIDB4M2MsIDB4Y2N9LAorCXsweGI5LCAweDA2LCAweDNjLCAweGNjfSwKKwl7MHhiOSwgMHgwNywgMHgzYywgMHhjY30sCisJezB4YjksIDB4MDgsIDB4M2MsIDB4Y2N9LAorCXsweGI4LCAweDhlLCAweDAwLCAweGNjfSwKKwl7MHhiOCwgMHg4ZiwgMHhmZiwgMHhjY30sCisJezB4YjgsIDB4ODEsIDB4MDksIDB4Y2N9LAorCXsweDMxLCAweDAwLCAweDAwLCAweGJifSwKKwl7MHgwOSwgMHgwMSwgMHhjNywgMHhiYn0sCisJezB4MzQsIDB4MDEsIDB4MDAsIDB4YmJ9LAorCXsweDJiLCAweDAwLCAweDI4LCAweGJifSwKKwl7MHgyYywgMHgwMCwgMHgzMCwgMHhiYn0sCisJezB4MmQsIDB4MDAsIDB4MzAsIDB4YmJ9LAorCXsweDJlLCAweDAwLCAweDI4LCAweGJifSwKKwl7MHg2MiwgMHgwNCwgMHgxMSwgMHhiYn0sCisJezB4MDMsIDB4MDEsIDB4ZTAsIDB4YmJ9LAorCXsweDJjLCAweDAwLCAweDJjLCAweGJifSwKKwl7MHgyMCwgMHhkMCwgMHgwMCwgMHhiYn0sCisJezB4MDEsIDB4MDAsIDB4MDgsIDB4YmJ9LAorCXsweDA2LCAweDAwLCAweDEwLCAweGJifSwKKwl7MHgwNSwgMHgwMCwgMHgyMCwgMHhiYn0sCisJezB4MjAsIDB4MDAsIDB4MDAsIDB4YmJ9LAorCXsweGI2LCAweDAwLCAweDAwLCAweGNjfSwKKwl7MHhiNiwgMHgwMywgMHgwMiwgMHhjY30sCisJezB4YjYsIDB4MDIsIDB4ODAsIDB4Y2N9LAorCXsweGI2LCAweDA1LCAweDAxLCAweGNjfSwKKwl7MHhiNiwgMHgwNCwgMHhlMCwgMHhjY30sCisJezB4YjYsIDB4MTIsIDB4NzgsIDB4Y2N9LAorCXsweGI2LCAweDE4LCAweDAyLCAweGNjfSwKKwl7MHhiNiwgMHgxNywgMHg1OCwgMHhjY30sCisJezB4YjYsIDB4MTYsIDB4MDAsIDB4Y2N9LAorCXsweGI2LCAweDIyLCAweDEyLCAweGNjfSwKKwl7MHhiNiwgMHgyMywgMHgwYiwgMHhjY30sCisJezB4YjMsIDB4MDIsIDB4MDIsIDB4Y2N9LAorCXsweGJmLCAweGMwLCAweDM5LCAweGNjfSwKKwl7MHhiZiwgMHhjMSwgMHgwNCwgMHhjY30sCisJezB4YmYsIDB4Y2MsIDB4MTAsIDB4Y2N9LAorCXsweGI5LCAweDEyLCAweDAwLCAweGNjfSwKKwl7MHhiOSwgMHgxMywgMHgwYSwgMHhjY30sCisJezB4YjksIDB4MTQsIDB4MGEsIDB4Y2N9LAorCXsweGI5LCAweDE1LCAweDBhLCAweGNjfSwKKwl7MHhiOSwgMHgxNiwgMHgwYSwgMHhjY30sCisJezB4YjksIDB4MTgsIDB4MDAsIDB4Y2N9LAorCXsweGI5LCAweDE5LCAweDBmLCAweGNjfSwKKwl7MHhiOSwgMHgxYSwgMHgwZiwgMHhjY30sCisJezB4YjksIDB4MWIsIDB4MGYsIDB4Y2N9LAorCXsweGI5LCAweDFjLCAweDBmLCAweGNjfSwKKwl7MHhiOCwgMHg4ZSwgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4OGYsIDB4ZmYsIDB4Y2N9LAorCXsweGI2LCAweDEyLCAweGY4LCAweGNjfSwKKwl7MHhiOCwgMHgwYywgMHgyMCwgMHhjY30sCisJezB4YjgsIDB4MGQsIDB4NzAsIDB4Y2N9LAorCXsweGI2LCAweDEzLCAweDEzLCAweGNjfSwKKwl7MHgzNSwgMHgwMCwgMHg2MCwgMHhiYn0sCisJezB4YjMsIDB4NWMsIDB4MDEsIDB4Y2N9LAorCXt9Cit9Oworc3RhdGljIGNvbnN0IF9fdTggbWkwMzYwX2luaXRRVkdBX0pQR1tdWzRdID0geworCXsweGIwLCAweDAzLCAweDE5LCAweGNjfSwKKwl7MHhiMCwgMHgwNCwgMHgwMiwgMHhjY30sCisJezB4YjMsIDB4MDAsIDB4MjQsIDB4Y2N9LAorCXsweGIzLCAweDAwLCAweDI1LCAweGNjfSwKKwl7MHhiMywgMHgwOCwgMHgwMSwgMHhjY30sCisJezB4YjMsIDB4MDksIDB4MGMsIDB4Y2N9LAorCXsweGIzLCAweDA1LCAweDAxLCAweGNjfSwKKwl7MHhiMywgMHgwNiwgMHgwMywgMHhjY30sCisJezB4YjMsIDB4MDMsIDB4MGEsIDB4Y2N9LAorCXsweGIzLCAweDIwLCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgyMSwgMHgwMCwgMHhjY30sCisJezB4YjMsIDB4MjIsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDIzLCAweGUwLCAweGNjfSwKKwl7MHhiMywgMHgwNCwgMHgwNSwgMHhjY30sCisJezB4YjMsIDB4MTQsIDB4MDAsIDB4Y2N9LAorCXsweGIzLCAweDE1LCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgxNiwgMHgwMiwgMHhjY30sCisJezB4YjMsIDB4MTcsIDB4N2YsIDB4Y2N9LAorCXsweGIzLCAweDM1LCAweGRkLCAweGNjfSwKKwl7MHhiMywgMHgzNCwgMHgwMiwgMHhjY30sCisJezB4YjMsIDB4MDAsIDB4MjUsIDB4Y2N9LAorCXsweGJjLCAweDAwLCAweGQxLCAweGNjfSwKKwl7MHhiOCwgMHgwMCwgMHgxMywgMHhjY30sCisJezB4YjgsIDB4MjcsIDB4MjAsIDB4Y2N9LAorCXsweGI4LCAweDJjLCAweDUwLCAweGNjfSwKKwl7MHhiOCwgMHgyZCwgMHhmOCwgMHhjY30sCisJezB4YjgsIDB4MmUsIDB4ZjgsIDB4Y2N9LAorCXsweGI4LCAweDJmLCAweGY4LCAweGNjfSwKKwl7MHhiOCwgMHgzMCwgMHg1MCwgMHhjY30sCisJezB4YjgsIDB4MzEsIDB4ZjgsIDB4Y2N9LAorCXsweGI4LCAweDMyLCAweGY4LCAweGNjfSwKKwl7MHhiOCwgMHgzMywgMHhmOCwgMHhjY30sCisJezB4YjgsIDB4MzQsIDB4NTAsIDB4Y2N9LAorCXsweGI4LCAweDM1LCAweDAwLCAweGNjfSwKKwl7MHhiOCwgMHgzNiwgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4MzcsIDB4MDAsIDB4Y2N9LAorCXsweGI4LCAweDAxLCAweDc5LCAweGNjfSwKKwl7MHhiOCwgMHgwOCwgMHhlMCwgMHhjY30sCisJezB4YjMsIDB4MDEsIDB4NDEsIDB4Y2N9LAorCXsweGI4LCAweDAxLCAweDc5LCAweGNjfSwKKwl7MHhiOCwgMHgxNCwgMHgxOCwgMHhjY30sCisJezB4YjgsIDB4YjIsIDB4MGEsIDB4Y2N9LAorCXsweGI4LCAweGI0LCAweDBhLCAweGNjfSwKKwl7MHhiOCwgMHhiNSwgMHgwYSwgMHhjY30sCisJezB4YjgsIDB4ZmUsIDB4MDAsIDB4Y2N9LAorCXsweGI4LCAweGZmLCAweDI4LCAweGNjfSwKKwl7MHhiOSwgMHgwMCwgMHgyOCwgMHhjY30sCisJezB4YjksIDB4MDEsIDB4MjgsIDB4Y2N9LAorCXsweGI5LCAweDAyLCAweDI4LCAweGNjfSwKKwl7MHhiOSwgMHgwMywgMHgwMCwgMHhjY30sCisJezB4YjksIDB4MDQsIDB4MDAsIDB4Y2N9LAorCXsweGI5LCAweDA1LCAweDNjLCAweGNjfSwKKwl7MHhiOSwgMHgwNiwgMHgzYywgMHhjY30sCisJezB4YjksIDB4MDcsIDB4M2MsIDB4Y2N9LAorCXsweGI5LCAweDA4LCAweDNjLCAweGNjfSwKKwl7MHhiOCwgMHg4ZSwgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4OGYsIDB4ZmYsIDB4Y2N9LAorCXsweGI4LCAweDgxLCAweDA5LCAweGNjfSwKKwl7MHgzMSwgMHgwMCwgMHgwMCwgMHhiYn0sCisJezB4MDksIDB4MDEsIDB4YzcsIDB4YmJ9LAorCXsweDM0LCAweDAxLCAweDAwLCAweGJifSwKKwl7MHgyYiwgMHgwMCwgMHgyOCwgMHhiYn0sCisJezB4MmMsIDB4MDAsIDB4MzAsIDB4YmJ9LAorCXsweDJkLCAweDAwLCAweDMwLCAweGJifSwKKwl7MHgyZSwgMHgwMCwgMHgyOCwgMHhiYn0sCisJezB4NjIsIDB4MDQsIDB4MTEsIDB4YmJ9LAorCXsweDAzLCAweDAxLCAweGUwLCAweGJifSwKKwl7MHgyYywgMHgwMCwgMHgyYywgMHhiYn0sCisJezB4MjAsIDB4ZDAsIDB4MDAsIDB4YmJ9LAorCXsweDAxLCAweDAwLCAweDA4LCAweGJifSwKKwl7MHgwNiwgMHgwMCwgMHgxMCwgMHhiYn0sCisJezB4MDUsIDB4MDAsIDB4MjAsIDB4YmJ9LAorCXsweDIwLCAweDAwLCAweDAwLCAweGJifSwKKwl7MHhiNiwgMHgwMCwgMHgwMCwgMHhjY30sCisJezB4YjYsIDB4MDMsIDB4MDEsIDB4Y2N9LAorCXsweGI2LCAweDAyLCAweDQwLCAweGNjfSwKKwl7MHhiNiwgMHgwNSwgMHgwMCwgMHhjY30sCisJezB4YjYsIDB4MDQsIDB4ZjAsIDB4Y2N9LAorCXsweGI2LCAweDEyLCAweDc4LCAweGNjfSwKKwl7MHhiNiwgMHgxOCwgMHgwMCwgMHhjY30sCisJezB4YjYsIDB4MTcsIDB4OTYsIDB4Y2N9LAorCXsweGI2LCAweDE2LCAweDAwLCAweGNjfSwKKwl7MHhiNiwgMHgyMiwgMHgxMiwgMHhjY30sCisJezB4YjYsIDB4MjMsIDB4MGIsIDB4Y2N9LAorCXsweGIzLCAweDAyLCAweDAyLCAweGNjfSwKKwl7MHhiZiwgMHhjMCwgMHgzOSwgMHhjY30sCisJezB4YmYsIDB4YzEsIDB4MDQsIDB4Y2N9LAorCXsweGJmLCAweGNjLCAweDEwLCAweGNjfSwKKwl7MHhiOSwgMHgxMiwgMHgwMCwgMHhjY30sCisJezB4YjksIDB4MTMsIDB4MGEsIDB4Y2N9LAorCXsweGI5LCAweDE0LCAweDBhLCAweGNjfSwKKwl7MHhiOSwgMHgxNSwgMHgwYSwgMHhjY30sCisJezB4YjksIDB4MTYsIDB4MGEsIDB4Y2N9LAorCXsweGI5LCAweDE4LCAweDAwLCAweGNjfSwKKwl7MHhiOSwgMHgxOSwgMHgwZiwgMHhjY30sCisJezB4YjksIDB4MWEsIDB4MGYsIDB4Y2N9LAorCXsweGI5LCAweDFiLCAweDBmLCAweGNjfSwKKwl7MHhiOSwgMHgxYywgMHgwZiwgMHhjY30sCisJezB4YjgsIDB4OGUsIDB4MDAsIDB4Y2N9LAorCXsweGI4LCAweDhmLCAweGZmLCAweGNjfSwKKwl7MHhiNiwgMHgxMiwgMHhmOCwgMHhjY30sCisJezB4YjYsIDB4MTMsIDB4MTMsIDB4Y2N9LAorCXsweGJjLCAweDAyLCAweDE4LCAweGNjfSwKKwl7MHhiYywgMHgwMywgMHg1MCwgMHhjY30sCisJezB4YmMsIDB4MDQsIDB4MTgsIDB4Y2N9LAorCXsweGJjLCAweDA1LCAweDAwLCAweGNjfSwKKwl7MHhiYywgMHgwNiwgMHgwMCwgMHhjY30sCisJezB4YmMsIDB4MDgsIDB4MzAsIDB4Y2N9LAorCXsweGJjLCAweDA5LCAweDQwLCAweGNjfSwKKwl7MHhiYywgMHgwYSwgMHgxMCwgMHhjY30sCisJezB4YjgsIDB4MGMsIDB4MjAsIDB4Y2N9LAorCXsweGI4LCAweDBkLCAweDcwLCAweGNjfSwKKwl7MHhiYywgMHgwYiwgMHgwMCwgMHhjY30sCisJezB4YmMsIDB4MGMsIDB4MDAsIDB4Y2N9LAorCXsweDM1LCAweDAwLCAweGVmLCAweGJifSwKKwl7MHhiMywgMHg1YywgMHgwMSwgMHhjY30sCisJe30KK307CisKIHN0YXRpYyBjb25zdCBfX3U4IG1pMTMxMF9zb2Npbml0VkdBX0pQR1tdWzRdID0gewogCXsweGIwLCAweDAzLCAweDE5LCAweGNjfSwKIAl7MHhiMCwgMHgwNCwgMHgwMiwgMHhjY30sCkBAIC04MjMsNyArMTEwOSw3IEBACiAJezB4MDAsIDB4MDEsIDB4ODAsIDB4YWF9LAl7MHgwMCwgMHgwMiwgMHg4MCwgMHhhYX0sCiAJezB4MDAsIDB4MTIsIDB4ODAsIDB4YWF9LAogCXsweDAwLCAweDEyLCAweDA1LCAweGFhfSwKLQl7MHgwMCwgMHgxZSwgMHgwMSwgMHhhYX0sCisJezB4MDAsIDB4MWUsIDB4MDEsIDB4YWF9LAkvKiBNVkZQICovCiAJezB4MDAsIDB4M2QsIDB4NDAsIDB4YWF9LCAvKiAweDNkIDwtNDAgZ2FtbWEgMDEgKi8KIAl7MHgwMCwgMHg0MSwgMHgwMCwgMHhhYX0sIC8qIGVkZ2UgMDAgKi8KIAl7MHgwMCwgMHgwZCwgMHg0OCwgMHhhYX0sCXsweDAwLCAweDBlLCAweDA0LCAweGFhfSwKQEAgLTg3Nyw3ICsxMTYzLDcgQEAKIAl7MHhiOCwgMHgyNywgMHgyMCwgMHhjY30sCXsweGI4LCAweDhmLCAweDUwLCAweGNjfSwKIAl7MHgwMCwgMHgwMSwgMHg4MCwgMHhhYX0sCXsweDAwLCAweDAyLCAweDgwLCAweGFhfSwKIAl7MHgwMCwgMHgxMiwgMHg4MCwgMHhhYX0sCXsweDAwLCAweDEyLCAweDA1LCAweGFhfSwKLQl7MHgwMCwgMHgxZSwgMHgwMSwgMHhhYX0sCisJezB4MDAsIDB4MWUsIDB4MDEsIDB4YWF9LAkvKiBNVkZQICovCiAJezB4MDAsIDB4M2QsIDB4NDAsIDB4YWF9LCAvKiAweDNkIDwtNDAgZ2FtbWEgMDEgKi8KIAl7MHgwMCwgMHg0MSwgMHgwMCwgMHhhYX0sIC8qIGVkZ2UgMDAgKi8KIAl7MHgwMCwgMHgwZCwgMHg0OCwgMHhhYX0sCXsweDAwLCAweDBlLCAweDA0LCAweGFhfSwKQEAgLTk4Myw3ICsxMjY5LDggQEAKIAl7MHgwMCwgMHhhOSwgMHg5MCwgMHhhYX0sCXsweDAwLCAweGFhLCAweDE0LCAweGFhfSwKIAl7MHgwMCwgMHgxMywgMHhlNSwgMHhhYX0sCXsweDAwLCAweDBlLCAweDYxLCAweGFhfSwKIAl7MHgwMCwgMHgwZiwgMHg0YiwgMHhhYX0sCXsweDAwLCAweDE2LCAweDAyLCAweGFhfSwKLQl7MHgwMCwgMHgxZSwgMHgwNywgMHhhYX0sCXsweDAwLCAweDIxLCAweDAyLCAweGFhfSwKKwl7MHgwMCwgMHgxZSwgMHgwNywgMHhhYX0sCS8qIE1WRlAgKi8KKwl7MHgwMCwgMHgyMSwgMHgwMiwgMHhhYX0sCiAJezB4MDAsIDB4MjIsIDB4OTEsIDB4YWF9LAl7MHgwMCwgMHgyOSwgMHgwNywgMHhhYX0sCiAJezB4MDAsIDB4MzMsIDB4MGIsIDB4YWF9LAl7MHgwMCwgMHgzNSwgMHgwYiwgMHhhYX0sCiAJezB4MDAsIDB4MzcsIDB4MWQsIDB4YWF9LAl7MHgwMCwgMHgzOCwgMHg3MSwgMHhhYX0sCkBAIC0xMDQ4LDcgKzEzMzUsOCBAQAogCXsweDAwLCAweDcxLCAweDM1LCAweGFhfSwJezB4MDAsIDB4NzIsIDB4MTEsIDB4YWF9LAogCXsweDAwLCAweDczLCAweGYwLCAweGFhfSwJezB4MDAsIDB4YTIsIDB4MDIsIDB4YWF9LAogCXsweDAwLCAweGIxLCAweDAwLCAweGFhfSwJezB4MDAsIDB4YjEsIDB4MGMsIDB4YWF9LAotCXsweDAwLCAweDFlLCAweDM3LCAweGFhfSwJezB4MDAsIDB4YWEsIDB4MTQsIDB4YWF9LAorCXsweDAwLCAweDFlLCAweDM3LCAweGFhfSwJLyogTVZGUCAqLworCXsweDAwLCAweGFhLCAweDE0LCAweGFhfSwKIAl7MHgwMCwgMHgyNCwgMHg4MCwgMHhhYX0sCXsweDAwLCAweDI1LCAweDc0LCAweGFhfSwKIAl7MHgwMCwgMHgyNiwgMHhkMywgMHhhYX0sCXsweDAwLCAweDBkLCAweDAwLCAweGFhfSwKIAl7MHgwMCwgMHgxNCwgMHgxOCwgMHhhYX0sCXsweDAwLCAweDlkLCAweDk5LCAweGFhfSwKQEAgLTExMTAsNyArMTM5OCw4IEBACiAJezB4MDAsIDB4YTksIDB4OTAsIDB4YWF9LAl7MHgwMCwgMHhhYSwgMHgxNCwgMHhhYX0sCiAJezB4MDAsIDB4MTMsIDB4ZTUsIDB4YWF9LAl7MHgwMCwgMHgwZSwgMHg2MSwgMHhhYX0sCiAJezB4MDAsIDB4MGYsIDB4NGIsIDB4YWF9LAl7MHgwMCwgMHgxNiwgMHgwMiwgMHhhYX0sCi0JezB4MDAsIDB4MWUsIDB4MDcsIDB4YWF9LAl7MHgwMCwgMHgyMSwgMHgwMiwgMHhhYX0sCisJezB4MDAsIDB4MWUsIDB4MDcsIDB4YWF9LAkvKiBNVkZQICovCisJezB4MDAsIDB4MjEsIDB4MDIsIDB4YWF9LAogCXsweDAwLCAweDIyLCAweDkxLCAweGFhfSwJezB4MDAsIDB4MjksIDB4MDcsIDB4YWF9LAogCXsweDAwLCAweDMzLCAweDBiLCAweGFhfSwJezB4MDAsIDB4MzUsIDB4MGIsIDB4YWF9LAogCXsweDAwLCAweDM3LCAweDFkLCAweGFhfSwJezB4MDAsIDB4MzgsIDB4NzEsIDB4YWF9LApAQCAtMTE3NSw3ICsxNDY0LDggQEAKIAl7MHgwMCwgMHg3MSwgMHgzNSwgMHhhYX0sCXsweDAwLCAweDcyLCAweDExLCAweGFhfSwKIAl7MHgwMCwgMHg3MywgMHhmMCwgMHhhYX0sCXsweDAwLCAweGEyLCAweDAyLCAweGFhfSwKIAl7MHgwMCwgMHhiMSwgMHgwMCwgMHhhYX0sCXsweDAwLCAweGIxLCAweDBjLCAweGFhfSwKLQl7MHgwMCwgMHgxZSwgMHgzNywgMHhhYX0sCXsweDAwLCAweGFhLCAweDE0LCAweGFhfSwKKwl7MHgwMCwgMHgxZSwgMHgzNywgMHhhYX0sCS8qIE1WRlAgKi8KKwl7MHgwMCwgMHhhYSwgMHgxNCwgMHhhYX0sCiAJezB4MDAsIDB4MjQsIDB4ODAsIDB4YWF9LAl7MHgwMCwgMHgyNSwgMHg3NCwgMHhhYX0sCiAJezB4MDAsIDB4MjYsIDB4ZDMsIDB4YWF9LAl7MHgwMCwgMHgwZCwgMHgwMCwgMHhhYX0sCiAJezB4MDAsIDB4MTQsIDB4MTgsIDB4YWF9LAl7MHgwMCwgMHg5ZCwgMHg5OSwgMHhhYX0sCkBAIC0xMjA0LDYgKzE0OTQsMjc1IEBACiAJe30sCiB9OwogCisvKiBQTzEyMDAgLSB2YWx1ZXMgZnJvbSB1c2J2bTMyNi5pbmYgYW5kIG1zLXdpbiB0cmFjZSAqLworc3RhdGljIGNvbnN0IF9fdTggcG8xMjAwX2dhbW1hWzE3XSA9IHsKKwkweDAwLCAweDEzLCAweDM4LCAweDU5LCAweDc5LCAweDkyLCAweGE3LCAweGI5LCAweGM4LAorCTB4ZDQsIDB4ZGYsIDB4ZTcsIDB4ZWUsIDB4ZjQsIDB4ZjksIDB4ZmMsIDB4ZmYKK307CitzdGF0aWMgY29uc3QgX191OCBwbzEyMDBfbWF0cml4WzldID0geworCTB4NjAsIDB4ZjksIDB4ZTUsIDB4ZTcsIDB4NTAsIDB4MDUsIDB4ZjMsIDB4ZTYsIDB4NWUKK307CitzdGF0aWMgY29uc3QgX191OCBwbzEyMDBfaW5pdFZHQV9kYXRhW11bNF0gPSB7CisJezB4YjAsIDB4MDMsIDB4MTksIDB4Y2N9LAkvKiByZXNldD8gKi8KKwl7MHhiMCwgMHgwMywgMHgxOSwgMHhjY30sCisvKgl7MHgwMCwgMHgwMCwgMHgzMywgMHhkZH0sICovCisJezB4YjAsIDB4MDQsIDB4MDIsIDB4Y2N9LAorCXsweGIwLCAweDAyLCAweDAyLCAweGNjfSwKKwl7MHhiMywgMHg1ZCwgMHgwMCwgMHhjY30sCisJezB4YjMsIDB4MDEsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDAwLCAweDY0LCAweGNjfSwKKwl7MHhiMywgMHgwMCwgMHg2NSwgMHhjY30sCisJezB4YjMsIDB4MDUsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDA2LCAweDAxLCAweGNjfSwKKwl7MHhiMywgMHg1YywgMHgwMSwgMHhjY30sCisJezB4YjMsIDB4MDgsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDA5LCAweDBjLCAweGNjfSwKKwl7MHhiMywgMHgwMCwgMHg2NywgMHhjY30sCisJezB4YjMsIDB4MDIsIDB4YjIsIDB4Y2N9LAorCXsweGIzLCAweDAzLCAweDE4LCAweGNjfSwKKwl7MHhiMywgMHgwNCwgMHgxNSwgMHhjY30sCisJezB4YjMsIDB4MjAsIDB4MDAsIDB4Y2N9LAorCXsweGIzLCAweDIxLCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgyMiwgMHgwMiwgMHhjY30sCisJezB4YjMsIDB4MjMsIDB4NTgsIDB4Y2N9LAorCXsweGIzLCAweDE0LCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgxNSwgMHgwMCwgMHhjY30sCisJezB4YjMsIDB4MTYsIDB4MDMsIDB4Y2N9LAorCXsweGIzLCAweDE3LCAweDFmLCAweGNjfSwKKwl7MHhiYywgMHgwMCwgMHg3MSwgMHhjY30sCisJezB4YmMsIDB4MDEsIDB4MDEsIDB4Y2N9LAorCXsweGIwLCAweDU0LCAweDEzLCAweGNjfSwKKwl7MHhiMywgMHgwMCwgMHg2NywgMHhjY30sCisJezB4YjMsIDB4MzQsIDB4MDEsIDB4Y2N9LAorCXsweGIzLCAweDM1LCAweGRjLCAweGNjfSwKKwl7MHgwMCwgMHgwMywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4MTIsIDB4MDUsIDB4YWF9LAorCXsweDAwLCAweDEzLCAweDAyLCAweGFhfSwKKwl7MHgwMCwgMHgxZSwgMHhjNiwgMHhhYX0sCS8qIGgvdiBmbGlwICovCisJezB4MDAsIDB4MjEsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDI1LCAweDAyLCAweGFhfSwKKwl7MHgwMCwgMHgzYywgMHg0ZiwgMHhhYX0sCisJezB4MDAsIDB4M2YsIDB4ZTAsIDB4YWF9LAorCXsweDAwLCAweDQyLCAweGZmLCAweGFhfSwKKwl7MHgwMCwgMHg0NSwgMHgzNCwgMHhhYX0sCisJezB4MDAsIDB4NTUsIDB4ZmUsIDB4YWF9LAorCXsweDAwLCAweDU5LCAweGQzLCAweGFhfSwKKwl7MHgwMCwgMHg1ZSwgMHgwNCwgMHhhYX0sCisJezB4MDAsIDB4NjEsIDB4YjgsIDB4YWF9LAkvKiBzaGFycG5lc3MgKi8KKwl7MHgwMCwgMHg2MiwgMHgwMiwgMHhhYX0sCisJezB4MDAsIDB4YTcsIDB4MzEsIDB4YWF9LAorCXsweDAwLCAweGE5LCAweDY2LCAweGFhfSwKKwl7MHgwMCwgMHhiMCwgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4YjEsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweGIzLCAweDExLCAweGFhfSwKKwl7MHgwMCwgMHhiNiwgMHgyNiwgMHhhYX0sCisJezB4MDAsIDB4YjcsIDB4MjAsIDB4YWF9LAorCXsweDAwLCAweGJhLCAweDA0LCAweGFhfSwKKwl7MHgwMCwgMHg4OCwgMHg0MiwgMHhhYX0sCisJezB4MDAsIDB4ODksIDB4OWEsIDB4YWF9LAorCXsweDAwLCAweDhhLCAweDg4LCAweGFhfSwKKwl7MHgwMCwgMHg4YiwgMHg4ZSwgMHhhYX0sCisJezB4MDAsIDB4OGMsIDB4M2UsIDB4YWF9LAorCXsweDAwLCAweDhkLCAweDkwLCAweGFhfSwKKwl7MHgwMCwgMHg4ZSwgMHg4NywgMHhhYX0sCisJezB4MDAsIDB4OGYsIDB4OTYsIDB4YWF9LAorCXsweDAwLCAweDkwLCAweDNkLCAweGFhfSwKKwl7MHgwMCwgMHg2NCwgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4NjUsIDB4MTAsIDB4YWF9LAorCXsweDAwLCAweDY2LCAweDIwLCAweGFhfSwKKwl7MHgwMCwgMHg2NywgMHgyYiwgMHhhYX0sCisJezB4MDAsIDB4NjgsIDB4MzYsIDB4YWF9LAorCXsweDAwLCAweDY5LCAweDQ5LCAweGFhfSwKKwl7MHgwMCwgMHg2YSwgMHg1YSwgMHhhYX0sCisJezB4MDAsIDB4NmIsIDB4N2YsIDB4YWF9LAorCXsweDAwLCAweDZjLCAweDliLCAweGFhfSwKKwl7MHgwMCwgMHg2ZCwgMHhiYSwgMHhhYX0sCisJezB4MDAsIDB4NmUsIDB4ZDQsIDB4YWF9LAorCXsweDAwLCAweDZmLCAweGVhLCAweGFhfSwKKwl7MHgwMCwgMHg3MCwgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4NzEsIDB4MTAsIDB4YWF9LAorCXsweDAwLCAweDcyLCAweDIwLCAweGFhfSwKKwl7MHgwMCwgMHg3MywgMHgyYiwgMHhhYX0sCisJezB4MDAsIDB4NzQsIDB4MzYsIDB4YWF9LAorCXsweDAwLCAweDc1LCAweDQ5LCAweGFhfSwKKwl7MHgwMCwgMHg3NiwgMHg1YSwgMHhhYX0sCisJezB4MDAsIDB4NzcsIDB4N2YsIDB4YWF9LAorCXsweDAwLCAweDc4LCAweDliLCAweGFhfSwKKwl7MHgwMCwgMHg3OSwgMHhiYSwgMHhhYX0sCisJezB4MDAsIDB4N2EsIDB4ZDQsIDB4YWF9LAorCXsweDAwLCAweDdiLCAweGVhLCAweGFhfSwKKwl7MHgwMCwgMHg3YywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4N2QsIDB4MTAsIDB4YWF9LAorCXsweDAwLCAweDdlLCAweDIwLCAweGFhfSwKKwl7MHgwMCwgMHg3ZiwgMHgyYiwgMHhhYX0sCisJezB4MDAsIDB4ODAsIDB4MzYsIDB4YWF9LAorCXsweDAwLCAweDgxLCAweDQ5LCAweGFhfSwKKwl7MHgwMCwgMHg4MiwgMHg1YSwgMHhhYX0sCisJezB4MDAsIDB4ODMsIDB4N2YsIDB4YWF9LAorCXsweDAwLCAweDg0LCAweDliLCAweGFhfSwKKwl7MHgwMCwgMHg4NSwgMHhiYSwgMHhhYX0sCisJezB4MDAsIDB4ODYsIDB4ZDQsIDB4YWF9LAorCXsweDAwLCAweDg3LCAweGVhLCAweGFhfSwKKwl7MHgwMCwgMHg1NywgMHgyYSwgMHhhYX0sCisJezB4MDAsIDB4MDMsIDB4MDEsIDB4YWF9LAorCXsweDAwLCAweDA0LCAweDEwLCAweGFhfSwKKwl7MHgwMCwgMHgwNSwgMHgxMCwgMHhhYX0sCisJezB4MDAsIDB4MDYsIDB4MTAsIDB4YWF9LAorCXsweDAwLCAweDA3LCAweDEwLCAweGFhfSwKKwl7MHgwMCwgMHgwOCwgMHgxMywgMHhhYX0sCisJezB4MDAsIDB4MGEsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDBiLCAweDEwLCAweGFhfSwKKwl7MHgwMCwgMHgwYywgMHgyMCwgMHhhYX0sCisJezB4MDAsIDB4MGQsIDB4MTgsIDB4YWF9LAorCXsweDAwLCAweDIyLCAweDAxLCAweGFhfSwKKwl7MHgwMCwgMHgyMywgMHg2MCwgMHhhYX0sCisJezB4MDAsIDB4MjUsIDB4MDgsIDB4YWF9LAorCXsweDAwLCAweDI2LCAweDgyLCAweGFhfSwKKwl7MHgwMCwgMHgyZSwgMHgwZiwgMHhhYX0sCisJezB4MDAsIDB4MmYsIDB4MWUsIDB4YWF9LAorCXsweDAwLCAweDMwLCAweDJkLCAweGFhfSwKKwl7MHgwMCwgMHgzMSwgMHgzYywgMHhhYX0sCisJezB4MDAsIDB4MzIsIDB4NGIsIDB4YWF9LAorCXsweDAwLCAweDMzLCAweDVhLCAweGFhfSwKKwl7MHgwMCwgMHgzNCwgMHg2OSwgMHhhYX0sCisJezB4MDAsIDB4MzUsIDB4NzgsIDB4YWF9LAorCXsweDAwLCAweDM2LCAweDg3LCAweGFhfSwKKwl7MHgwMCwgMHgzNywgMHg5NiwgMHhhYX0sCisJezB4MDAsIDB4MzgsIDB4YTUsIDB4YWF9LAorCXsweDAwLCAweDM5LCAweGI0LCAweGFhfSwKKwl7MHgwMCwgMHgzYSwgMHhjMywgMHhhYX0sCisJezB4MDAsIDB4M2IsIDB4ZDIsIDB4YWF9LAorCXsweDAwLCAweDNjLCAweGUxLCAweGFhfSwKKwl7MHgwMCwgMHgzZSwgMHhmZiwgMHhhYX0sCisJezB4MDAsIDB4M2YsIDB4ZmYsIDB4YWF9LAorCXsweDAwLCAweDQwLCAweGZmLCAweGFhfSwKKwl7MHgwMCwgMHg0MSwgMHhmZiwgMHhhYX0sCisJezB4MDAsIDB4NDIsIDB4ZmYsIDB4YWF9LAorCXsweDAwLCAweDQzLCAweGZmLCAweGFhfSwKKwl7MHgwMCwgMHgwMywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4MDMsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDIwLCAweGM0LCAweGFhfSwKKwl7MHgwMCwgMHgxMywgMHgwMywgMHhhYX0sCisJezB4MDAsIDB4M2MsIDB4NTAsIDB4YWF9LAorCXsweDAwLCAweDYxLCAweDZhLCAweGFhfSwJLyogc2hhcnBuZXNzPyAqLworCXsweDAwLCAweDUxLCAweDViLCAweGFhfSwKKwl7MHgwMCwgMHg1MiwgMHg5MSwgMHhhYX0sCisJezB4MDAsIDB4NTMsIDB4NGMsIDB4YWF9LAorCXsweDAwLCAweDU0LCAweDUwLCAweGFhfSwKKwl7MHgwMCwgMHg1NiwgMHgwMiwgMHhhYX0sCisJezB4YjYsIDB4MDAsIDB4MDAsIDB4Y2N9LAorCXsweGI2LCAweDAzLCAweDAzLCAweGNjfSwKKwl7MHhiNiwgMHgwMiwgMHgyMCwgMHhjY30sCisJezB4YjYsIDB4MDUsIDB4MDIsIDB4Y2N9LAorCXsweGI2LCAweDA0LCAweDU4LCAweGNjfSwKKwl7MHhiNiwgMHgxMiwgMHhmOCwgMHhjY30sCisJezB4YjYsIDB4MTMsIDB4MjEsIDB4Y2N9LAorCXsweGI2LCAweDE4LCAweDAzLCAweGNjfSwKKwl7MHhiNiwgMHgxNywgMHhhOSwgMHhjY30sCisJezB4YjYsIDB4MTYsIDB4ODAsIDB4Y2N9LAorCXsweGI2LCAweDIyLCAweDEyLCAweGNjfSwKKwl7MHhiNiwgMHgyMywgMHgwYiwgMHhjY30sCisJezB4YmYsIDB4YzAsIDB4MzksIDB4Y2N9LAorCXsweGJmLCAweGMxLCAweDA0LCAweGNjfSwKKwl7MHhiZiwgMHhjYywgMHgwMCwgMHhjY30sCisJezB4YjgsIDB4MDYsIDB4MjAsIDB4Y2N9LAorCXsweGI4LCAweDA3LCAweDAzLCAweGNjfSwKKwl7MHhiOCwgMHgwOCwgMHg1OCwgMHhjY30sCisJezB4YjgsIDB4MDksIDB4MDIsIDB4Y2N9LAorCXsweGIzLCAweDAxLCAweDQxLCAweGNjfSwKKwl7MHgwMCwgMHgwMywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4ZDksIDB4MGYsIDB4YWF9LAorCXsweDAwLCAweGRhLCAweGFhLCAweGFhfSwKKwl7MHgwMCwgMHhkOSwgMHgxMCwgMHhhYX0sCisJezB4MDAsIDB4ZGEsIDB4YWEsIDB4YWF9LAorCXsweDAwLCAweGQ5LCAweDExLCAweGFhfSwKKwl7MHgwMCwgMHhkYSwgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4ZDksIDB4MTIsIDB4YWF9LAorCXsweDAwLCAweGRhLCAweGZmLCAweGFhfSwKKwl7MHgwMCwgMHhkOSwgMHgxMywgMHhhYX0sCisJezB4MDAsIDB4ZGEsIDB4ZmYsIDB4YWF9LAorCXsweDAwLCAweGU4LCAweDExLCAweGFhfSwKKwl7MHgwMCwgMHhlOSwgMHgxMiwgMHhhYX0sCisJezB4MDAsIDB4ZWEsIDB4NWMsIDB4YWF9LAorCXsweDAwLCAweGViLCAweGZmLCAweGFhfSwKKwl7MHgwMCwgMHhkOCwgMHg4MCwgMHhhYX0sCisJezB4MDAsIDB4ZTYsIDB4MDIsIDB4YWF9LAorCXsweDAwLCAweGQ2LCAweDQwLCAweGFhfSwKKwl7MHgwMCwgMHhlMywgMHgwNSwgMHhhYX0sCisJezB4MDAsIDB4ZTAsIDB4NDAsIDB4YWF9LAorCXsweDAwLCAweGRlLCAweDAzLCAweGFhfSwKKwl7MHgwMCwgMHhkZiwgMHgwMywgMHhhYX0sCisJezB4MDAsIDB4ZGIsIDB4MDIsIDB4YWF9LAorCXsweDAwLCAweGRjLCAweDAwLCAweGFhfSwKKwl7MHgwMCwgMHhkZCwgMHgwMywgMHhhYX0sCisJezB4MDAsIDB4ZTEsIDB4MDgsIDB4YWF9LAorCXsweDAwLCAweGUyLCAweDAxLCAweGFhfSwKKwl7MHgwMCwgMHhkNiwgMHg0MCwgMHhhYX0sCisJezB4MDAsIDB4ZTQsIDB4NDAsIDB4YWF9LAorCXsweDAwLCAweGE4LCAweDhmLCAweGFhfSwKKwl7MHgwMCwgMHhiNCwgMHgxNiwgMHhhYX0sCisJezB4YjAsIDB4MDIsIDB4MDYsIDB4Y2N9LAorCXsweGIwLCAweDE4LCAweDA2LCAweGNjfSwKKwl7MHhiMCwgMHgxOSwgMHgwNiwgMHhjY30sCisJezB4YjMsIDB4NWQsIDB4MTgsIDB4Y2N9LAorCXsweGIzLCAweDA1LCAweDAwLCAweGNjfSwKKwl7MHhiMywgMHgwNiwgMHgwMCwgMHhjY30sCisJezB4MDAsIDB4YjQsIDB4MGUsIDB4YWF9LAorCXsweDAwLCAweGI1LCAweDQ5LCAweGFhfSwKKwl7MHgwMCwgMHhiNiwgMHgxYywgMHhhYX0sCisJezB4MDAsIDB4YjcsIDB4OTYsIDB4YWF9LAorLyogZW5kIG9mIHVzYnZtMzI2LmluZiAtIHN0YXJ0IG9mIG1zLXdpbiB0cmFjZSAqLworCXsweGI2LCAweDEyLCAweGY4LCAweGNjfSwKKwl7MHhiNiwgMHgxMywgMHgzZCwgMHhjY30sCisvKnJlYWQgYjMwNiovCisJezB4MDAsIDB4MDMsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDFhLCAweDA5LCAweGFhfSwKKwl7MHgwMCwgMHgxYiwgMHg4YSwgMHhhYX0sCisvKnJlYWQgYjgyNyovCisJezB4YjgsIDB4MjcsIDB4MDAsIDB4Y2N9LAorCXsweGI4LCAweDI2LCAweDYwLCAweGNjfSwKKwl7MHhiOCwgMHgyNiwgMHg2MCwgMHhjY30sCisvKmdhbW1hIC0gdG8gZG8/Ki8KKwl7MHgwMCwgMHgwMywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4YWUsIDB4ODQsIDB4YWF9LAorLypnYW1tYSBhZ2FpbiovCisJezB4MDAsIDB4MDMsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDk2LCAweGEwLCAweGFhfSwKKy8qbWF0cml4Ki8KKwl7MHgwMCwgMHgwMywgMHgwMCwgMHhhYX0sCisJezB4MDAsIDB4OTEsIDB4MzUsIDB4YWF9LAorCXsweDAwLCAweDkyLCAweDIyLCAweGFhfSwKKy8qZ2FtbWEqLworCXsweDAwLCAweDAzLCAweDAwLCAweGFhfSwKKwl7MHgwMCwgMHg5NSwgMHg4NSwgMHhhYX0sCisvKm1hdHJpeCovCisJezB4MDAsIDB4MDMsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweDRkLCAweDIwLCAweGFhfSwKKwl7MHhiOCwgMHgyMiwgMHg0MCwgMHhjY30sCisJezB4YjgsIDB4MjMsIDB4NDAsIDB4Y2N9LAorCXsweGI4LCAweDI0LCAweDQwLCAweGNjfSwKKwl7MHhiOCwgMHg4MSwgMHgwOSwgMHhjY30sCisJezB4MDAsIDB4MDAsIDB4NjQsIDB4ZGR9LAorCXsweDAwLCAweDAzLCAweDAxLCAweGFhfSwKKy8qcmVhZCA0NiovCisJezB4MDAsIDB4NDYsIDB4M2MsIDB4YWF9LAorCXsweDAwLCAweDAzLCAweDAwLCAweGFhfSwKKwl7MHgwMCwgMHgxNiwgMHg0MCwgMHhhYX0sCisJezB4MDAsIDB4MTcsIDB4NDAsIDB4YWF9LAorCXsweDAwLCAweDE4LCAweDQwLCAweGFhfSwKKwl7MHgwMCwgMHgxOSwgMHg0MSwgMHhhYX0sCisJezB4MDAsIDB4MDMsIDB4MDEsIDB4YWF9LAorCXsweDAwLCAweDQ2LCAweDNjLCAweGFhfSwKKwl7MHgwMCwgMHgwMCwgMHgxOCwgMHhkZH0sCisvKnJlYWQgYmZmZiovCisJezB4MDAsIDB4MDMsIDB4MDAsIDB4YWF9LAorCXsweDAwLCAweGI0LCAweDFjLCAweGFhfSwKKwl7MHgwMCwgMHhiNSwgMHg5MiwgMHhhYX0sCisJezB4MDAsIDB4YjYsIDB4MzksIDB4YWF9LAorCXsweDAwLCAweGI3LCAweDI0LCAweGFhfSwKKy8qd3JpdGUgODkgMDQwMCAxNDE1Ki8KK307CisKIHN0cnVjdCBzZW5zb3JfaW5mbyB7CiAJaW50IHNlbnNvcklkOwogCV9fdTggSTJjQWRkOwpAQCAtMTIyMiw2ICsxNzgxLDkgQEAKIAl7U0VOU09SX01JMTMyMCwgICAgIDB4ODAgfCAweGM4LCAweDAwLCAweDE0OGMsIDB4NjQsIDB4NjUsIDB4MDF9LAogCXtTRU5TT1JfT1Y3NjcwLCAgICAgMHg4MCB8IDB4MjEsIDB4MGEsIDB4NzY3MywgMHg2NiwgMHg2NywgMHgwNX0sCiAJe1NFTlNPUl9NSTEzMTBfU09DLCAweDgwIHwgMHg1ZCwgMHgwMCwgMHgxNDNhLCAweDI0LCAweDI1LCAweDAxfSwKKy8qICh0ZXN0ZWQgaW4gdmMwMzJ4X3Byb2JlX3NlbnNvcikgKi8KKy8qCXtTRU5TT1JfTUkwMzYwLAkgICAgMHg4MCB8IDB4NWQsIDB4MDAsIDB4ODI0MywgMHgyNCwgMHgyNSwgMHgwMX0sICovCisJe1NFTlNPUl9QTzEyMDAsICAgICAweDgwIHwgMHg1YywgMHgwMCwgMHgxMjAwLCAweDY3LCAweDY3LCAweDAxfSwKIH07CiAKIC8qIHJlYWQgJ2xlbicgYnl0ZXMgaW4gZ3NwY2FfZGV2LT51c2JfYnVmICovCkBAIC0xMjc4LDE4ICsxODQwLDE4IEBACiAJCW1zbGVlcCgxKTsKIAl9CiAJcmVnX3IoZ3NwY2FfZGV2LCAweGExLCAweGIzM2UsIDEpOwotCWhkYXRhID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworCWxkYXRhID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwogCXJlZ19yKGdzcGNhX2RldiwgMHhhMSwgMHhiMzNkLCAxKTsKIAltZGF0YSA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKIAlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YjMzYywgMSk7Ci0JbGRhdGEgPSBnc3BjYV9kZXYtPnVzYl9idWZbMF07Ci0JUERFQlVHKERfUFJPQkUsICJSZWFkIFNlbnNvciBoICgweCUwMlgpIG0gKDB4JTAyWCkgbCAoMHglMDJYKSIsCisJaGRhdGEgPSBnc3BjYV9kZXYtPnVzYl9idWZbMF07CisJUERFQlVHKERfUFJPQkUsICJSZWFkIFNlbnNvciAlMDJ4JTAyeCAlMDJ4IiwKIAkJaGRhdGEsIG1kYXRhLCBsZGF0YSk7CiAJcmVnX3IoZ3NwY2FfZGV2LCAweGExLCAweGIzMzQsIDEpOwogCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMHgwMikKLQkJKnZhbHVlID0gKGxkYXRhIDw8IDgpICsgbWRhdGE7CisJCSp2YWx1ZSA9IChoZGF0YSA8PCA4KSArIG1kYXRhOwogCWVsc2UKLQkJKnZhbHVlID0gbGRhdGE7CisJCSp2YWx1ZSA9IGhkYXRhOwogfQogCiBzdGF0aWMgaW50IHZjMDMyeF9wcm9iZV9zZW5zb3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMTMwMCw3ICsxODYyLDcgQEAKIAljb25zdCBzdHJ1Y3Qgc2Vuc29yX2luZm8gKnB0c2Vuc29yX2luZm87CiAKIAlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YmZjZiwgMSk7Ci0JUERFQlVHKERfUFJPQkUsICJjaGVjayBzZW5zb3IgaGVhZGVyICVkIiwgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKKwlQREVCVUcoRF9QUk9CRSwgImNoZWNrIHNlbnNvciBoZWFkZXIgJTAyeCIsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2Vuc29yX2luZm9fZGF0YSk7IGkrKykgewogCQlwdHNlbnNvcl9pbmZvID0gJnNlbnNvcl9pbmZvX2RhdGFbaV07CiAJCXJlZ193KGRldiwgMHhhMCwgMHgwMiwgMHhiMzM0KTsKQEAgLTEzMDksMTYgKzE4NzEsMTUgQEAKIAkJcmVnX3coZGV2LCAweGEwLCAweDAxLCAweGIzMDgpOwogCQlyZWdfdyhkZXYsIDB4YTAsIDB4MGMsIDB4YjMwOSk7CiAJCXJlZ193KGRldiwgMHhhMCwgcHRzZW5zb3JfaW5mby0+STJjQWRkLCAweGIzMzUpOwotLyoJCVBERUJVRyhEX1BST0JFLAotCQkJImNoZWNrIHNlbnNvciBWQzAzMlggLT4gJWQgQWRkIC0+IG94JTAyWCEiLAotCQkJaSwgcHRzZW5zb3JfaW5mby0+STJjQWRkKTsgKi8KIAkJcmVnX3coZGV2LCAweGEwLCBwdHNlbnNvcl9pbmZvLT5vcCwgMHhiMzAxKTsKIAkJcmVhZF9zZW5zb3JfcmVnaXN0ZXIoZ3NwY2FfZGV2LCBwdHNlbnNvcl9pbmZvLT5JZEFkZCwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlID09IHB0c2Vuc29yX2luZm8tPlZwSWQpIHsKLS8qCQkJUERFQlVHKERfUFJPQkUsICJmaW5kIHNlbnNvciBWQzAzMlggLT4gb3glMDRYISIsCi0JCQkJcHRzZW5zb3JfaW5mby0+VnBJZCk7ICovCisJCWlmICh2YWx1ZSA9PSBwdHNlbnNvcl9pbmZvLT5WcElkKQogCQkJcmV0dXJuIHB0c2Vuc29yX2luZm8tPnNlbnNvcklkOwotCQl9CisKKwkJLyogc3BlY2lhbCBjYXNlIGZvciBNSTAzNjAgKi8KKwkJaWYgKHB0c2Vuc29yX2luZm8tPnNlbnNvcklkID09IFNFTlNPUl9NSTEzMTBfU09DCisJCSAgICAmJiB2YWx1ZSA9PSAweDgyNDMpCisJCQlyZXR1cm4gU0VOU09SX01JMDM2MDsKIAl9CiAJcmV0dXJuIC0xOwogfQpAQCAtMTQyMCwxMyArMTk4MSw2IEBACiAJY2FtID0gJmdzcGNhX2Rldi0+Y2FtOwogCWNhbS0+ZXBhZGRyID0gMHgwMjsKIAlzZC0+YnJpZGdlID0gaWQtPmRyaXZlcl9pbmZvOwotCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9WQzAzMjEpIHsKLQkJY2FtLT5jYW1fbW9kZSA9IHZjMDMyMV9tb2RlOwotCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmMwMzIxX21vZGUpOwotCX0gZWxzZSB7Ci0JCWNhbS0+Y2FtX21vZGUgPSB2YzAzMjNfbW9kZTsKLQkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKHZjMDMyM19tb2RlKTsKLQl9CiAKIAl2YzAzMjFfcmVzZXQoZ3NwY2FfZGV2KTsKIAlzZW5zb3IgPSB2YzAzMnhfcHJvYmVfc2Vuc29yKGdzcGNhX2Rldik7CkBAIC0xNDM2LDM1ICsxOTkwLDY2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWNhc2UgU0VOU09SX0hWNzEzMVI6CiAJCVBERUJVRyhEX1BST0JFLCAiRmluZCBTZW5zb3IgSFY3MTMxUiIpOwotCQlzZC0+c2Vuc29yID0gU0VOU09SX0hWNzEzMVI7CisJCWJyZWFrOworCWNhc2UgU0VOU09SX01JMDM2MDoKKwkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBNSTAzNjAiKTsKKwkJc2QtPmJyaWRnZSA9IEJSSURHRV9WQzAzMjM7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX01JMTMxMF9TT0M6CiAJCVBERUJVRyhEX1BST0JFLCAiRmluZCBTZW5zb3IgTUkxMzEwX1NPQyIpOwotCQlzZC0+c2Vuc29yID0gU0VOU09SX01JMTMxMF9TT0M7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX01JMTMyMDoKIAkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBNSTEzMjAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTlNPUl9NSTEzMjA7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY2MDoKIAkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBPVjc2NjAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTlNPUl9PVjc2NjA7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY3MDoKIAkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBPVjc2NzAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTlNPUl9PVjc2NzA7CisJCWJyZWFrOworCWNhc2UgU0VOU09SX1BPMTIwMDoKKwkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBQTzEyMDAiKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfUE8zMTMwTkM6CiAJCVBERUJVRyhEX1BST0JFLCAiRmluZCBTZW5zb3IgUE8zMTMwTkMiKTsKLQkJc2QtPnNlbnNvciA9IFNFTlNPUl9QTzMxMzBOQzsKIAkJYnJlYWs7CiAJfQorCXNkLT5zZW5zb3IgPSBzZW5zb3I7CiAKLQlzZC0+cWluZGV4ID0gNzsKLQlzZC0+YXV0b2dhaW4gPSBBVVRPR0FJTl9ERUY7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1ZDMDMyMSkgeworCQljYW0tPmNhbV9tb2RlID0gdmMwMzIxX21vZGU7CisJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2YzAzMjFfbW9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKHNlbnNvciAhPSBTRU5TT1JfUE8xMjAwKSB7CisJCQljYW0tPmNhbV9tb2RlID0gdmMwMzIzX21vZGU7CisJCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUodmMwMzIzX21vZGUpOworCQl9IGVsc2UgeworCQkJY2FtLT5jYW1fbW9kZSA9IHN2Z2FfbW9kZTsKKwkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShzdmdhX21vZGUpOworCQl9CisJfQorCisJc2QtPmhmbGlwID0gSEZMSVBfREVGOworCXNkLT52ZmxpcCA9IFZGTElQX0RFRjsKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfT1Y3NjcwKSB7CisJCXNkLT5oZmxpcCA9IDE7CisJCXNkLT52ZmxpcCA9IDE7CisJfQogCXNkLT5saWdodGZyZXEgPSBGUkVRX0RFRjsKIAlpZiAoc2QtPnNlbnNvciAhPSBTRU5TT1JfT1Y3NjcwKQogCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgTElHSFRGUkVRX0lEWCk7CisJc3dpdGNoIChzZC0+c2Vuc29yKSB7CisJY2FzZSBTRU5TT1JfT1Y3NjYwOgorCWNhc2UgU0VOU09SX09WNzY3MDoKKwljYXNlIFNFTlNPUl9QTzEyMDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBIRkxJUF9JRFgpCisJCQkJCXwgKDEgPDwgVkZMSVBfSURYKTsKKwkJYnJlYWs7CisJfQorCisJc2QtPnNoYXJwbmVzcyA9IFNIQVJQTkVTU19ERUY7CiAKIAlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVkMwMzIxKSB7CiAJCXJlZ19yKGdzcGNhX2RldiwgMHg4YSwgMCwgMyk7CkBAIC0xNDgyLDEyICsyMDY3LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHF1YWxpdHkoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorLyogZm9yIE9WNzY2MCBhbmQgT1Y3NjcwIG9ubHkgKi8KK3N0YXRpYyB2b2lkIHNldGh2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci19CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCV9fdTggZGF0YTsKIAotc3RhdGljIHZvaWQgc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoteworCXN3aXRjaCAoc2QtPnNlbnNvcikgeworCWNhc2UgU0VOU09SX09WNzY2MDoKKwkJZGF0YSA9IDE7CisJCWJyZWFrOworCWNhc2UgU0VOU09SX09WNzY3MDoKKwkJZGF0YSA9IDc7CisJCWJyZWFrOworCWNhc2UgU0VOU09SX1BPMTIwMDoKKwkJZGF0YSA9IDA7CisJCWkyY193cml0ZShnc3BjYV9kZXYsIDB4MDMsICZkYXRhLCAxKTsKKwkJZGF0YSA9IDB4ODAgKiBzZC0+aGZsaXAKKwkJCXwgMHg0MCAqIHNkLT52ZmxpcAorCQkJfCAweDA2OworCQlpMmNfd3JpdGUoZ3NwY2FfZGV2LCAweDFlLCAmZGF0YSwgMSk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCWRhdGEgfD0gT1Y3NjYwX01WRlBfTUlSUk9SICogc2QtPmhmbGlwCisJCXwgT1Y3NjYwX01WRlBfVkZMSVAgKiBzZC0+dmZsaXA7CisJaTJjX3dyaXRlKGdzcGNhX2RldiwgT1Y3NjYwX1JFR19NVkZQLCAmZGF0YSwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGxpZ2h0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0xNTAxLDYgKzIxMDcsMjAgQEAKIAl1c2JfZXhjaGFuZ2UoZ3NwY2FfZGV2LCBvdjc2NjBfZnJlcV90YltzZC0+bGlnaHRmcmVxXSk7CiB9CiAKKy8qIHBvMTIwMCBvbmx5ICovCitzdGF0aWMgdm9pZCBzZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlfX3U4IGRhdGE7CisKKwlpZiAoc2QtPnNlbnNvciAhPSBTRU5TT1JfUE8xMjAwKQorCQlyZXR1cm47CisJZGF0YSA9IDA7CisJaTJjX3dyaXRlKGdzcGNhX2RldiwgMHgwMywgJmRhdGEsIDEpOworCWRhdGEgPSAweGI1ICsgc2QtPnNoYXJwbmVzcyAqIDM7CisJaTJjX3dyaXRlKGdzcGNhX2RldiwgMHg2MSwgJmRhdGEsIDEpOworfQorCiBzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CkBAIC0xNTUxLDYgKzIxNzEsMTcgQEAKIAkJCXVzYl9leGNoYW5nZShnc3BjYV9kZXYsIG92NzY3MF9pbml0VkdBX0pQRyk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTRU5TT1JfTUkwMzYwOgorCQlHYW1tYVQgPSBtaTEzMjBfZ2FtbWE7CisJCU1hdHJpeFQgPSBtaTAzNjBfbWF0cml4OworCQlpZiAobW9kZSkgeworCQkJLyogMzIweDI0MCAqLworCQkJdXNiX2V4Y2hhbmdlKGdzcGNhX2RldiwgbWkwMzYwX2luaXRRVkdBX0pQRyk7CisJCX0gZWxzZSB7CisJCQkvKiA2NDB4NDgwICovCisJCQl1c2JfZXhjaGFuZ2UoZ3NwY2FfZGV2LCBtaTAzNjBfaW5pdFZHQV9KUEcpOworCQl9CisJCWJyZWFrOwogCWNhc2UgU0VOU09SX01JMTMxMF9TT0M6CiAJCWlmIChtb2RlKSB7CiAJCQkvKiAzMjB4MjQwICovCkBAIC0xNTgzLDYgKzIyMTQsMTEgQEAKIAkJfQogCQl1c2JfZXhjaGFuZ2UoZ3NwY2FfZGV2LCBwbzMxMzBfcnVuZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgU0VOU09SX1BPMTIwMDoKKwkJR2FtbWFUID0gcG8xMjAwX2dhbW1hOworCQlNYXRyaXhUID0gcG8xMjAwX21hdHJpeDsKKwkJdXNiX2V4Y2hhbmdlKGdzcGNhX2RldiwgcG8xMjAwX2luaXRWR0FfZGF0YSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBERUJVRyhEX1BST0JFLCAiRGFtbmVkICEhIG5vIHNlbnNvciBmb3VuZCBCeWUiKTsKIAkJcmV0dXJuIC1FTUVESVVNVFlQRTsKQEAgLTE2MTUsMTEgKzIyNTEsMTYgQEAKIAkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4YTAsIDB4MjMsIDB4YjgwMCk7ICogSVNQIENUUkxfQkFTCiAJCSovCiAJCS8qIHNldCB0aGUgbGVkIG9uIDB4MDg5MiAweDA4OTYgKi8KLQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4ODksIDB4ZmZmZiwgMHhmZGZmKTsKLQkJbXNsZWVwKDEwMCk7Ci0JCXNldHF1YWxpdHkoZ3NwY2FfZGV2KTsKLQkJc2V0YXV0b2dhaW4oZ3NwY2FfZGV2KTsKLQkJc2V0bGlnaHRmcmVxKGdzcGNhX2Rldik7CisJCWlmIChzZC0+c2Vuc29yICE9IFNFTlNPUl9QTzEyMDApIHsKKwkJCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCAweDg5LCAweGZmZmYsIDB4ZmRmZik7CisJCQltc2xlZXAoMTAwKTsKKwkJCXNldGh2ZmxpcChnc3BjYV9kZXYpOworCQkJc2V0bGlnaHRmcmVxKGdzcGNhX2Rldik7CisJCX0gZWxzZSB7CisJCQlzZXRzaGFycG5lc3MoZ3NwY2FfZGV2KTsKKwkJCXNldGh2ZmxpcChnc3BjYV9kZXYpOworCQkJcmVnX3coZ3NwY2FfZGV2LT5kZXYsIDB4ODksIDB4MDQwMCwgMHgxNDE1KTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE2NjUsMjQgKzIzMDYsNDggQEAKIAkJCQlkYXRhLCBsZW4pOwogCQlyZXR1cm47CiAJfQorCisJLyogVGhlIHZjMDMyMSBzZW5kcyBzb21lIGFkZGl0aW9uYWwgZGF0YSBhZnRlciBzZW5kaW5nIHRoZSBjb21wbGV0ZQorCSAqIGZyYW1lLCB3ZSBpZ25vcmUgdGhpcy4gKi8KKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVkMwMzIxCisJICAgICYmIGxlbiA+IGZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSAoZnJhbWUtPmRhdGFfZW5kIC0gZnJhbWUtPmRhdGEpKQorCQlsZW4gPSBmcmFtZS0+djRsMl9idWYubGVuZ3RoIC0gKGZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhKTsKIAlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgaW50IHNkX3NldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQorc3RhdGljIGludCBzZF9zZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlzZC0+YXV0b2dhaW4gPSB2YWw7CisJc2QtPmhmbGlwID0gdmFsOwogCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0YXV0b2dhaW4oZ3NwY2FfZGV2KTsKKwkJc2V0aHZmbGlwKGdzcGNhX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQorc3RhdGljIGludCBzZF9nZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCi0JKnZhbCA9IHNkLT5hdXRvZ2FpbjsKKwkqdmFsID0gc2QtPmhmbGlwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3NldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT52ZmxpcCA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGh2ZmxpcChnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPnZmbGlwOwogCXJldHVybiAwOwogfQogCkBAIC0xNzA0LDYgKzIzNjksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZF9zZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPnNoYXJwbmVzcyA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldHNoYXJwbmVzcyhnc3BjYV9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJKnZhbCA9IHNkLT5zaGFycG5lc3M7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc2RfcXVlcnltZW51KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqbWVudSkKIHsKQEAgLTE3NDMsMTEgKzI0MjYsMTMgQEAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0gewogCXtVU0JfREVWSUNFKDB4MDQ2ZCwgMHgwODkyKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1ZDMDMyMX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4OTYpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVkMwMzIxfSwKKwl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDg5NyksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9WQzAzMjF9LAogCXtVU0JfREVWSUNFKDB4MGFjOCwgMHgwMzIxKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1ZDMDMyMX0sCiAJe1VTQl9ERVZJQ0UoMHgwYWM4LCAweDAzMjMpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVkMwMzIzfSwKIAl7VVNCX0RFVklDRSgweDBhYzgsIDB4MDMyOCksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9WQzAzMjF9LAogCXtVU0JfREVWSUNFKDB4MGFjOCwgMHhjMDAxKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1ZDMDMyMX0sCiAJe1VTQl9ERVZJQ0UoMHgwYWM4LCAweGMwMDIpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVkMwMzIxfSwKKwl7VVNCX0RFVklDRSgweDE1YjgsIDB4NjAwMiksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9WQzAzMjN9LAogCXtVU0JfREVWSUNFKDB4MTdlZiwgMHg0ODAyKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1ZDMDMyM30sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC1yZWcuaAppbmRleCBmNTJlMDljLi5iZmI1NTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHgtcmVnLmgKQEAgLTI0NCwxNCArMjQ0LDYgQEAKICNkZWZpbmUgWkMzWFhfUjFDQV9TSEFSUE5FU1MwNCAgICAgICAgIDB4MDFjYQogI2RlZmluZSBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1ICAgICAgICAgMHgwMWNiCiAKLS8qIFN5bmNocm9uaXphdGlvbiAqLwotI2RlZmluZSBaQzNYWF9SMTkwX1NZTkMwMExPVyAgICAgICAgICAgMHgwMTkwCi0jZGVmaW5lIFpDM1hYX1IxOTFfU1lOQzAwTUlEICAgICAgICAgICAweDAxOTEKLSNkZWZpbmUgWkMzWFhfUjE5Ml9TWU5DMDBISUdIICAgICAgICAgIDB4MDE5MgotI2RlZmluZSBaQzNYWF9SMTk1X1NZTkMwMUxPVyAgICAgICAgICAgMHgwMTk1Ci0jZGVmaW5lIFpDM1hYX1IxOTZfU1lOQzAxTUlEICAgICAgICAgICAweDAxOTYKLSNkZWZpbmUgWkMzWFhfUjE5N19TWU5DMDFISUdIICAgICAgICAgIDB4MDE5NwotCiAvKiBEZWFkIHBpeGVscyAqLwogI2RlZmluZSBaQzNYWF9SMjUwX0RFQURQSVhFTFNNT0RFICAgICAgMHgwMjUwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYwppbmRleCAwYmVmYWNmLi5lYzJhNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCkBAIC01MSwxNiArNTEsMTYgQEAKICNkZWZpbmUgU0VOU09SX0NTMjEwMiAwCiAjZGVmaW5lIFNFTlNPUl9DUzIxMDJLIDEKICNkZWZpbmUgU0VOU09SX0dDMDMwNSAyCi0jZGVmaW5lIFNFTlNPUl9IRENTMjAyMCAzCi0jZGVmaW5lIFNFTlNPUl9IRENTMjAyMGIgNAotI2RlZmluZSBTRU5TT1JfSFY3MTMxQiA1Ci0jZGVmaW5lIFNFTlNPUl9IVjcxMzFDIDYKLSNkZWZpbmUgU0VOU09SX0lDTTEwNUEgNwotI2RlZmluZSBTRU5TT1JfTUM1MDFDQiA4Ci0jZGVmaW5lIFNFTlNPUl9PVjc2MjAgOQotLyojZGVmaW5lIFNFTlNPUl9PVjc2NDggOSAtIHNhbWUgdmFsdWVzICovCi0jZGVmaW5lIFNFTlNPUl9PVjc2MzBDIDEwCi0jZGVmaW5lIFNFTlNPUl9QQVMxMDYgMTEKKyNkZWZpbmUgU0VOU09SX0hEQ1MyMDIwYiAzCisjZGVmaW5lIFNFTlNPUl9IVjcxMzFCIDQKKyNkZWZpbmUgU0VOU09SX0hWNzEzMUMgNQorI2RlZmluZSBTRU5TT1JfSUNNMTA1QSA2CisjZGVmaW5lIFNFTlNPUl9NQzUwMUNCIDcKKyNkZWZpbmUgU0VOU09SX09WNzYyMCA4CisvKiNkZWZpbmUgU0VOU09SX09WNzY0OCA4IC0gc2FtZSB2YWx1ZXMgKi8KKyNkZWZpbmUgU0VOU09SX09WNzYzMEMgOQorI2RlZmluZSBTRU5TT1JfUEFTMTA2IDEwCisjZGVmaW5lIFNFTlNPUl9QQVMyMDJCIDExCiAjZGVmaW5lIFNFTlNPUl9QQjAzMzAgMTIKICNkZWZpbmUgU0VOU09SX1BPMjAzMCAxMwogI2RlZmluZSBTRU5TT1JfVEFTNTEzMENLIDE0CkBAIC0xNzMsNyArMTczLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdmdhX21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAogCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAogCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogMyAvIDggKyA1OTAsCkBAIC0xODYsNyArMTg2LDcgQEAKIAkJLnByaXYgPSAwfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHNpZl9tb2RlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBzaWZfbW9kZVtdID0gewogCXsxNzYsIDE0NCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKIAkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDMgLyA4ICsgNTkwLApAQCAtMTY1MywyOTUgKzE2NTMsNiBAQAogCXt9CiB9OwogCi0vKiBwbGF5IHBva2VyIHdpdGggcmVnaXN0ZXJzIGF0IHlvdXIgb3duIHJpc2sgISEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBoZGNzMjAyMHh4X0luaXRpYWxbXSA9IHsKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMF9TWVNURU1DT05UUk9MfSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAotCXsweGEwLCAweDBlLCBaQzNYWF9SMDEwX0NNT1NTRU5TT1JTRUxFQ1R9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMDAyX0NMT0NLU0VMRUNUfSwKLQl7MHhhMCwgMHgwMiwgWkMzWFhfUjAwM19GUkFNRVdJRFRISElHSH0sCi0JezB4YTAsIDB4ODAsIFpDM1hYX1IwMDRfRlJBTUVXSURUSExPV30sCi0JezB4YTAsIDB4MDEsIFpDM1hYX1IwMDVfRlJBTUVIRUlHSFRISUdIfSwKLQl7MHhhMCwgMHhkMCwgWkMzWFhfUjAwNl9GUkFNRUhFSUdIVExPV30sCi0JCQkJCQkvKiBEMCA/PyBFMCBkaWQgbm90IHN0YXJ0ICovCi0JezB4YTAsIDB4MDEsIFpDM1hYX1IwMDFfU1lTVEVNT1BFUkFUSU5HfSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwKLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjA4RF9DT01QQUJJTElUWU1PREV9LAotCXsweGEwLCAweDA4LCBaQzNYWF9SMDk4X1dJTllTVEFSVExPV30sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IwOUFfV0lOWFNUQVJUTE9XfSwKLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjExQV9GSVJTVFlMT1d9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMTFDX0ZJUlNUWExPV30sCi0JezB4YTAsIDB4MDEsIFpDM1hYX1IwOUJfV0lOSEVJR0hUSElHSH0sCi0JezB4YTAsIDB4ZDgsIFpDM1hYX1IwOUNfV0lOSEVJR0hUTE9XfSwKLQl7MHhhMCwgMHgwMiwgWkMzWFhfUjA5RF9XSU5XSURUSEhJR0h9LAotCXsweGEwLCAweDg4LCBaQzNYWF9SMDlFX1dJTldJRFRITE9XfSwKLQl7MHhhYSwgMHgwMiwgMHgwMDAyfSwKLQl7MHhhYSwgMHgwNywgMHgwMDA2fSwKLQl7MHhhYSwgMHgwOCwgMHgwMDAyfSwKLQl7MHhhYSwgMHgwOSwgMHgwMDA2fSwKLQl7MHhhYSwgMHgwYSwgMHgwMDAxfSwKLQl7MHhhYSwgMHgwYiwgMHgwMDAxfSwKLQl7MHhhYSwgMHgwYywgMHgwMDA4fSwKLQl7MHhhYSwgMHgwZCwgMHgwMDAwfSwKLQl7MHhhYSwgMHgxMCwgMHgwMDAwfSwKLQl7MHhhYSwgMHgxMiwgMHgwMDA1fSwKLQl7MHhhYSwgMHgxMywgMHgwMDYzfSwKLQl7MHhhYSwgMHgxNSwgMHgwMDcwfSwKLQl7MHhhMCwgMHgzNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwKLQl7MHhhMCwgMHgwZCwgWkMzWFhfUjEwMF9PUEVSQVRJT05NT0RFfSwKLQl7MHhhMCwgMHgwNiwgWkMzWFhfUjE4OV9BV0JTVEFUVVN9LAotCXsweGEwLCAweDAwLCAweDAxYWR9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMUM1X1NIQVJQTkVTU01PREV9LAotCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwKLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKLQl7MHhhMCwgMHg3MCwgWkMzWFhfUjE4RF9ZVEFSR0VUfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDAyfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiBjbG9jayA/ICovCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0JezB4YTAsIDB4MTEsIFpDM1hYX1IxMjBfR0FNTUEwMH0sCS8qIGdhbW1hIH40ICovCi0JezB4YTAsIDB4MzcsIFpDM1hYX1IxMjFfR0FNTUEwMX0sCi0JezB4YTAsIDB4NTgsIFpDM1hYX1IxMjJfR0FNTUEwMn0sCi0JezB4YTAsIDB4NzksIFpDM1hYX1IxMjNfR0FNTUEwM30sCi0JezB4YTAsIDB4OTEsIFpDM1hYX1IxMjRfR0FNTUEwNH0sCi0JezB4YTAsIDB4YTYsIFpDM1hYX1IxMjVfR0FNTUEwNX0sCi0JezB4YTAsIDB4YjgsIFpDM1hYX1IxMjZfR0FNTUEwNn0sCi0JezB4YTAsIDB4YzcsIFpDM1hYX1IxMjdfR0FNTUEwN30sCi0JezB4YTAsIDB4ZDMsIFpDM1hYX1IxMjhfR0FNTUEwOH0sCi0JezB4YTAsIDB4ZGUsIFpDM1hYX1IxMjlfR0FNTUEwOX0sCi0JezB4YTAsIDB4ZTYsIFpDM1hYX1IxMkFfR0FNTUEwQX0sCi0JezB4YTAsIDB4ZWQsIFpDM1hYX1IxMkJfR0FNTUEwQn0sCi0JezB4YTAsIDB4ZjMsIFpDM1hYX1IxMkNfR0FNTUEwQ30sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMkRfR0FNTUEwRH0sCi0JezB4YTAsIDB4ZmIsIFpDM1hYX1IxMkVfR0FNTUEwRX0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IxMkZfR0FNTUEwRn0sCi0JezB4YTAsIDB4MjYsIFpDM1hYX1IxMzBfR0FNTUExMH0sCi0JezB4YTAsIDB4MjMsIFpDM1hYX1IxMzFfR0FNTUExMX0sCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IxMzJfR0FNTUExMn0sCi0JezB4YTAsIDB4MWMsIFpDM1hYX1IxMzNfR0FNTUExM30sCi0JezB4YTAsIDB4MTYsIFpDM1hYX1IxMzRfR0FNTUExNH0sCi0JezB4YTAsIDB4MTMsIFpDM1hYX1IxMzVfR0FNTUExNX0sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxMzZfR0FNTUExNn0sCi0JezB4YTAsIDB4MGQsIFpDM1hYX1IxMzdfR0FNTUExN30sCi0JezB4YTAsIDB4MGIsIFpDM1hYX1IxMzhfR0FNTUExOH0sCi0JezB4YTAsIDB4MDksIFpDM1hYX1IxMzlfR0FNTUExOX0sCi0JezB4YTAsIDB4MDcsIFpDM1hYX1IxM0FfR0FNTUExQX0sCi0JezB4YTAsIDB4MDYsIFpDM1hYX1IxM0JfR0FNTUExQn0sCi0JezB4YTAsIDB4MDUsIFpDM1hYX1IxM0NfR0FNTUExQ30sCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxM0RfR0FNTUExRH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IxM0VfR0FNTUExRX0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IxM0ZfR0FNTUExRn0sCi0KLQl7MHhhMCwgMHg0YywgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGY1LCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZjksIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDUxLCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhmNSwgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZmIsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGVkLCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg1ZiwgWkMzWFhfUjExMl9SR0IyMn0sCi0KLQl7MHhhMSwgMHgwMSwgMHgwMTgwfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCi0JezB4YTAsIDB4MjAsIFpDM1hYX1IwODdfRVhQVElNRU1JRH0sCi0JezB4YTAsIDB4MjEsIFpDM1hYX1IwODhfRVhQVElNRUxPV30sCi0JezB4YWEsIDB4MjAsIDB4MDAwNH0sCi0JezB4YWEsIDB4MjEsIDB4MDAzZH0sCi0JezB4YWEsIDB4MDMsIDB4MDA0MX0sCi0JezB4YWEsIDB4MDQsIDB4MDAxMH0sCi0JezB4YWEsIDB4MDUsIDB4MDAzZH0sCi0JezB4YWEsIDB4MGUsIDB4MDAwMX0sCi0JezB4YWEsIDB4MGYsIDB4MDAwMH0sCi0JezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCi0JezB4YTAsIDB4M2QsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCi0JezB4YTAsIDB4OWIsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKLQl7MHhhMCwgMHg0MSwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKLQl7MHhhMCwgMHg2ZiwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKLQl7MHhhMCwgMHhhZCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKLQl7MHhhMCwgMHgwZiwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwKLQl7MHhhMCwgMHgwZSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTEsIDB4MDEsIDB4MDE5NX0sCi0JezB4YTEsIDB4MDEsIDB4MDE5Nn0sCi0JezB4YTEsIDB4MDEsIDB4MDE5N30sCi0JezB4YTAsIDB4M2QsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAotCXsweGEwLCAweDFkLCBaQzNYWF9SMTE2X1JHQUlOfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExN19HR0FJTn0sCi0JezB4YTAsIDB4ODUsIFpDM1hYX1IxMThfQkdBSU59LAotCXsweGExLCAweDAxLCAweDAxMTZ9LAotCXsweGExLCAweDAxLCAweDAxMTh9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDQyLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgxZCwgWkMzWFhfUjExNl9SR0FJTn0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxMTdfR0dBSU59LAotCXsweGEwLCAweDg1LCBaQzNYWF9SMTE4X0JHQUlOfSwKLQl7MHhhMSwgMHgwMSwgMHgwMTE2fSwKLQl7MHhhMSwgMHgwMSwgMHgwMTE4fSwKLS8qCXsweGEwLCAweDAyLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sICovCi0JezB4YTAsIDB4MDAsIDB4MDAwN30sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBoZGNzMjAyMHh4X0luaXRpYWxTY2FsZVtdID0gewotCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCi0JezB4YTAsIDB4MGUsIFpDM1hYX1IwMTBfQ01PU1NFTlNPUlNFTEVDVH0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwMDJfQ0xPQ0tTRUxFQ1R9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMDAzX0ZSQU1FV0lEVEhISUdIfSwKLQl7MHhhMCwgMHg4MCwgWkMzWFhfUjAwNF9GUkFNRVdJRFRITE9XfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwNV9GUkFNRUhFSUdIVEhJR0h9LAotCXsweGEwLCAweGUwLCBaQzNYWF9SMDA2X0ZSQU1FSEVJR0hUTE9XfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMV9TWVNURU1PUEVSQVRJTkd9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMDEyX1ZJREVPQ09OVFJPTEZVTkN9LAotCXsweGEwLCAweDA4LCBaQzNYWF9SMDhEX0NPTVBBQklMSVRZTU9ERX0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwOThfV0lOWVNUQVJUTE9XfSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjA5QV9XSU5YU1RBUlRMT1d9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTFBX0ZJUlNUWUxPV30sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IxMUNfRklSU1RYTE9XfSwKLQl7MHhhMCwgMHgwMSwgWkMzWFhfUjA5Ql9XSU5IRUlHSFRISUdIfSwKLQl7MHhhMCwgMHhlNiwgWkMzWFhfUjA5Q19XSU5IRUlHSFRMT1d9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMDlEX1dJTldJRFRISElHSH0sCi0JezB4YTAsIDB4ODYsIFpDM1hYX1IwOUVfV0lOV0lEVEhMT1d9LAotCXsweGFhLCAweDAyLCAweDAwMDJ9LAotCXsweGFhLCAweDA3LCAweDAwMDZ9LAotCXsweGFhLCAweDA4LCAweDAwMDJ9LAotCXsweGFhLCAweDA5LCAweDAwMDZ9LAotCXsweGFhLCAweDBhLCAweDAwMDF9LAotCXsweGFhLCAweDBiLCAweDAwMDF9LAotCXsweGFhLCAweDBjLCAweDAwMDh9LAotCXsweGFhLCAweDBkLCAweDAwMDB9LAotCXsweGFhLCAweDEwLCAweDAwMDB9LAotCXsweGFhLCAweDEyLCAweDAwMDV9LAotCXsweGFhLCAweDEzLCAweDAwNjN9LAotCXsweGFhLCAweDE1LCAweDAwNzB9LAotCXsweGEwLCAweGI3LCBaQzNYWF9SMTAxX1NFTlNPUkNPUlJFQ1RJT059LAotCXsweGEwLCAweDBkLCBaQzNYWF9SMTAwX09QRVJBVElPTk1PREV9LAotCXsweGEwLCAweDA2LCBaQzNYWF9SMTg5X0FXQlNUQVRVU30sCi0JezB4YTAsIDB4MDAsIDB4MDFhZH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IxQzVfU0hBUlBORVNTTU9ERX0sCi0JezB4YTAsIDB4MTMsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAotCXsweGEwLCAweDA4LCBaQzNYWF9SMjUwX0RFQURQSVhFTFNNT0RFfSwKLQl7MHhhMCwgMHgwOCwgWkMzWFhfUjMwMV9FRVBST01BQ0NFU1N9LAotCXsweGEwLCAweDcwLCBaQzNYWF9SMThEX1lUQVJHRVR9LAotCXsweGExLCAweDAxLCAweDAwMDJ9LAotCXsweGExLCAweDAxLCAweDAwMDh9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCS8qIGNsb2NrID8gKi8KLQl7MHhhMCwgMHgwNCwgWkMzWFhfUjFDNl9TSEFSUE5FU1MwMH0sCS8qIHNoYXJwbmVzcysgKi8KLQl7MHhhMSwgMHgwMSwgMHgwMWM4fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWM5fSwKLQl7MHhhMSwgMHgwMSwgMHgwMWNhfSwKLQl7MHhhMCwgMHgwNywgWkMzWFhfUjFDQl9TSEFSUE5FU1MwNX0sCS8qIHNoYXJwbmVzcy0gKi8KLQl7MHhhMCwgMHgxMSwgWkMzWFhfUjEyMF9HQU1NQTAwfSwJLyogZ2FtbWEgfjQqLwotCXsweGEwLCAweDM3LCBaQzNYWF9SMTIxX0dBTU1BMDF9LAotCXsweGEwLCAweDU4LCBaQzNYWF9SMTIyX0dBTU1BMDJ9LAotCXsweGEwLCAweDc5LCBaQzNYWF9SMTIzX0dBTU1BMDN9LAotCXsweGEwLCAweDkxLCBaQzNYWF9SMTI0X0dBTU1BMDR9LAotCXsweGEwLCAweGE2LCBaQzNYWF9SMTI1X0dBTU1BMDV9LAotCXsweGEwLCAweGI4LCBaQzNYWF9SMTI2X0dBTU1BMDZ9LAotCXsweGEwLCAweGM3LCBaQzNYWF9SMTI3X0dBTU1BMDd9LAotCXsweGEwLCAweGQzLCBaQzNYWF9SMTI4X0dBTU1BMDh9LAotCXsweGEwLCAweGRlLCBaQzNYWF9SMTI5X0dBTU1BMDl9LAotCXsweGEwLCAweGU2LCBaQzNYWF9SMTJBX0dBTU1BMEF9LAotCXsweGEwLCAweGVkLCBaQzNYWF9SMTJCX0dBTU1BMEJ9LAotCXsweGEwLCAweGYzLCBaQzNYWF9SMTJDX0dBTU1BMEN9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTJEX0dBTU1BMER9LAotCXsweGEwLCAweGZiLCBaQzNYWF9SMTJFX0dBTU1BMEV9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTJGX0dBTU1BMEZ9LAotCXsweGEwLCAweDI2LCBaQzNYWF9SMTMwX0dBTU1BMTB9LAotCXsweGEwLCAweDIzLCBaQzNYWF9SMTMxX0dBTU1BMTF9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMTMyX0dBTU1BMTJ9LAotCXsweGEwLCAweDFjLCBaQzNYWF9SMTMzX0dBTU1BMTN9LAotCXsweGEwLCAweDE2LCBaQzNYWF9SMTM0X0dBTU1BMTR9LAotCXsweGEwLCAweDEzLCBaQzNYWF9SMTM1X0dBTU1BMTV9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMTM2X0dBTU1BMTZ9LAotCXsweGEwLCAweDBkLCBaQzNYWF9SMTM3X0dBTU1BMTd9LAotCXsweGEwLCAweDBiLCBaQzNYWF9SMTM4X0dBTU1BMTh9LAotCXsweGEwLCAweDA5LCBaQzNYWF9SMTM5X0dBTU1BMTl9LAotCXsweGEwLCAweDA3LCBaQzNYWF9SMTNBX0dBTU1BMUF9LAotCXsweGEwLCAweDA2LCBaQzNYWF9SMTNCX0dBTU1BMUJ9LAotCXsweGEwLCAweDA1LCBaQzNYWF9SMTNDX0dBTU1BMUN9LAotCXsweGEwLCAweDA0LCBaQzNYWF9SMTNEX0dBTU1BMUR9LAotCXsweGEwLCAweDAzLCBaQzNYWF9SMTNFX0dBTU1BMUV9LAotCXsweGEwLCAweDAyLCBaQzNYWF9SMTNGX0dBTU1BMUZ9LAotCXsweGEwLCAweDYwLCBaQzNYWF9SMTBBX1JHQjAwfSwJLyogbWF0cml4ICovCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IxMEJfUkdCMDF9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTBDX1JHQjAyfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjEwRF9SR0IxMH0sCi0JezB4YTAsIDB4NjAsIFpDM1hYX1IxMEVfUkdCMTF9LAotCXsweGEwLCAweGZmLCBaQzNYWF9SMTBGX1JHQjEyfSwKLQl7MHhhMCwgMHhmZiwgWkMzWFhfUjExMF9SR0IyMH0sCi0JezB4YTAsIDB4ZmYsIFpDM1hYX1IxMTFfUkdCMjF9LAotCXsweGEwLCAweDYwLCBaQzNYWF9SMTEyX1JHQjIyfSwKLQotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKLQl7MHhhMCwgMHgyMCwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwKLQl7MHhhMCwgMHgyMSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwKLQl7MHhhYSwgMHgyMCwgMHgwMDAyfSwKLQl7MHhhYSwgMHgyMSwgMHgwMDFifSwKLQl7MHhhYSwgMHgwMywgMHgwMDQ0fSwKLQl7MHhhYSwgMHgwNCwgMHgwMDA4fSwKLQl7MHhhYSwgMHgwNSwgMHgwMDFifSwKLQl7MHhhYSwgMHgwZSwgMHgwMDAxfSwKLQl7MHhhYSwgMHgwZiwgMHgwMDAwfSwKLQl7MHhhMCwgMHgxNCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKLQl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwKLQl7MHhhMCwgMHgwMiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKLQl7MHhhMCwgMHgxYiwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwKLQl7MHhhMCwgMHg0ZCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAotCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAotCXsweGEwLCAweDQ0LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAotCXsweGEwLCAweDZmLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAotCXsweGEwLCAweGFkLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAotCXsweGEwLCAweGViLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAotCXsweGEwLCAweDBmLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAotCXsweGEwLCAweDBlLCBaQzNYWF9SMDg4X0VYUFRJTUVMT1d9LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMSwgMHgwMSwgMHgwMTk1fSwKLQl7MHhhMSwgMHgwMSwgMHgwMTk2fSwKLQl7MHhhMSwgMHgwMSwgMHgwMTk3fSwKLQl7MHhhMCwgMHgxYiwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwKLQl7MHhhMCwgMHgwMiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCi0JezB4YTAsIDB4MWQsIFpDM1hYX1IxMTZfUkdBSU59LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTE3X0dHQUlOfSwKLQl7MHhhMCwgMHg5OSwgWkMzWFhfUjExOF9CR0FJTn0sCi0JezB4YTEsIDB4MDEsIDB4MDExNn0sCi0JezB4YTEsIDB4MDEsIDB4MDExOH0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDFkLCBaQzNYWF9SMTE2X1JHQUlOfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExN19HR0FJTn0sCi0JezB4YTAsIDB4OTksIFpDM1hYX1IxMThfQkdBSU59LAotLyoJezB4YTAsIDB4MDIsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwgKi8KLQl7MHhhMCwgMHgwMCwgMHgwMDA3fSwKLS8qCXsweGEwLCAweDE4LCAweDAwZmV9LCAqLwotCXt9Ci19Owogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGhkY3MyMDIweGJfSW5pdGlhbFtdID0gewogCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAogCXsweGEwLCAweDExLCBaQzNYWF9SMDAyX0NMT0NLU0VMRUNUfSwKQEAgLTIzMTAsNjcgKzIwMjEsNiBAQAogCXsweGEwLCAweDA4LCBaQzNYWF9SMjUwX0RFQURQSVhFTFNNT0RFfSwKIAl7MHhhMCwgMHgwOCwgWkMzWFhfUjMwMV9FRVBST01BQ0NFU1N9LAogCXsweGFhLCAweDAyLCAweDAwOTB9LAkJCS8qIDAwLDAyLDgwLGFhICovCi0JezB4YTEsIDB4MDEsIDB4MDAwMn0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwOTJfSTJDQUREUkVTU1NFTEVDVH0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IwOTBfSTJDQ09NTUFORH0sCi0JezB4YTEsIDB4MDEsIDB4MDA5MX0sCi0JezB4YTEsIDB4MDEsIDB4MDA5NX0sCi0JezB4YTEsIDB4MDEsIDB4MDA5Nn0sCi0KLQl7MHhhMSwgMHgwMSwgMHgwMDA4fSwKLQl7MHhhMCwgMHgwMywgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkvKiBjbG9jayA/ICovCi0JezB4YTAsIDB4MDgsIFpDM1hYX1IxQzZfU0hBUlBORVNTMDB9LAkvKiBzaGFycG5lc3MrICovCi0JezB4YTEsIDB4MDEsIDB4MDFjOH0sCi0JezB4YTEsIDB4MDEsIDB4MDFjOX0sCi0JezB4YTEsIDB4MDEsIDB4MDFjYX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkvKiBzaGFycG5lc3MtICovCi0KLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwQV9SR0IwMH0sCS8qIG1hdHJpeCAqLwotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBCX1JHQjAxfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQ19SR0IwMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMERfUkdCMTB9LAotCXsweGEwLCAweDUwLCBaQzNYWF9SMTBFX1JHQjExfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwRl9SR0IxMn0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMTBfUkdCMjB9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTExX1JHQjIxfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjExMl9SR0IyMn0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAotCXsweGFhLCAweDI1LCAweDAwMDd9LAotCXsweGFhLCAweDI2LCAweDAwYTF9LAotCXsweGFhLCAweDI3LCAweDAwMjB9LAotCXsweGFhLCAweDIwLCAweDAwMDB9LAotCXsweGFhLCAweDIxLCAweDAwYTB9LAotCXsweGFhLCAweDIyLCAweDAwMTZ9LAotCXsweGFhLCAweDIzLCAweDAwNDB9LAotCi0JezB4YTAsIDB4MTAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAkvKiAyRiAqLwotCXsweGEwLCAweDA0LCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAkvKiA0ZCAqLwotCXsweGEwLCAweDYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAotCXsweGEwLCAweDAxLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCi0JezB4YTAsIDB4ODYsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAotCXsweGEwLCAweGEwLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwKLQl7MHhhMCwgMHgwNywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCi0JezB4YTAsIDB4MGYsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCi0JezB4YTAsIDB4MTgsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCi0JezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwKLQl7MHhhMCwgMHhhMCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwKLQl7MHhhMCwgMHgxNiwgWkMzWFhfUjAxRl9IU1lOQ18yfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjAyMF9IU1lOQ18zfSwKLQl7MHhhMCwgMHg2MCwgWkMzWFhfUjExRF9HTE9CQUxHQUlOfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDFkfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDFlfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDFmfSwKLQl7MHhhMSwgMHgwMSwgMHgwMDIwfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTEsIDB4MDEsIDB4MDE4MH0sCi0JezB4YTAsIDB4NDIsIFpDM1hYX1IxODBfQVVUT0NPUlJFQ1RFTkFCTEV9LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTE2X1JHQUlOfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExN19HR0FJTn0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxMThfQkdBSU59LAotLyoJezB4YTAsIDB4MDIsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwgKi8KIAl7fQogfTsKIApAQCAtMjQxOCw2NSArMjA2OCwxNTYgQEAKIAl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCiAJezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwKIAl7MHhhYSwgMHgwMiwgMHgwMDkwfSwJLyogezB4YWEsIDB4MDIsIDB4MDA4MH0sICovCi0JezB4YTEsIDB4MDEsIDB4MDAwMn0sCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IwOTJfSTJDQUREUkVTU1NFTEVDVH0sCi0JezB4YTAsIDB4MDIsIFpDM1hYX1IwOTBfSTJDQ09NTUFORH0sCi0JezB4YTEsIDB4MDEsIDB4MDA5MX0sCi0JezB4YTEsIDB4MDEsIDB4MDA5NX0sCi0JezB4YTEsIDB4MDEsIDB4MDA5Nn0sCi0JezB4YTEsIDB4MDEsIDB4MDAwOH0sCi0JezB4YTAsIDB4MDMsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwJLyogY2xvY2sgPyAqLwotCXsweGEwLCAweDA4LCBaQzNYWF9SMUM2X1NIQVJQTkVTUzAwfSwJLyogc2hhcnBuZXNzKyAqLwotCXsweGExLCAweDAxLCAweDAxYzh9LAotCXsweGExLCAweDAxLCAweDAxYzl9LAotCXsweGExLCAweDAxLCAweDAxY2F9LAotCXsweGEwLCAweDBmLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwJLyogc2hhcnBuZXNzLSAqLwotCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMEFfUkdCMDB9LAkvKiBtYXRyaXggKi8KLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjEwQl9SR0IwMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMENfUkdCMDJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTBEX1JHQjEwfSwKLQl7MHhhMCwgMHg1MCwgWkMzWFhfUjEwRV9SR0IxMX0sCi0JezB4YTAsIDB4ZjgsIFpDM1hYX1IxMEZfUkdCMTJ9LAotCXsweGEwLCAweGY4LCBaQzNYWF9SMTEwX1JHQjIwfSwKLQl7MHhhMCwgMHhmOCwgWkMzWFhfUjExMV9SR0IyMX0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxMTJfUkdCMjJ9LAotCXsweGExLCAweDAxLCAweDAxODB9LAotCXsweGEwLCAweDEwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwKLQl7MHhhYSwgMHgyNSwgMHgwMDA3fSwKLQl7MHhhYSwgMHgyNiwgMHgwMGExfSwKLQl7MHhhYSwgMHgyNywgMHgwMDIwfSwKLQl7MHhhYSwgMHgyMCwgMHgwMDAwfSwKLQl7MHhhYSwgMHgyMSwgMHgwMDQwfSwKLQl7MHhhYSwgMHgyMiwgMHgwMDEzfSwKLQl7MHhhYSwgMHgyMywgMHgwMDRjfSwKLQl7MHhhMCwgMHgxMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCS8qIDJmICovCi0JezB4YTAsIDB4MDQsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCS8qIDRkICovCi0JezB4YTAsIDB4NjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCS8qIDYwICovCi0JezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwKLQl7MHhhMCwgMHhjMywgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCi0JezB4YTAsIDB4NTAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAotCXsweGEwLCAweDBjLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwKLQl7MHhhMCwgMHgxOCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwKLQl7MHhhMCwgMHgxOCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwKLQl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAotCXsweGEwLCAweDAwLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAotCXsweGEwLCAweDEzLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAotCXsweGEwLCAweDRjLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAotCXsweGEwLCAweDYwLCBaQzNYWF9SMTFEX0dMT0JBTEdBSU59LAotCXsweGExLCAweDAxLCAweDAwMWR9LAotCXsweGExLCAweDAxLCAweDAwMWV9LAotCXsweGExLCAweDAxLCAweDAwMWZ9LAotCXsweGExLCAweDAxLCAweDAwMjB9LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTgwX0FVVE9DT1JSRUNURU5BQkxFfSwKLQl7MHhhMSwgMHgwMSwgMHgwMTgwfSwKLQl7MHhhMCwgMHg0MiwgWkMzWFhfUjE4MF9BVVRPQ09SUkVDVEVOQUJMRX0sCi0JezB4YTAsIDB4NDAsIFpDM1hYX1IxMTZfUkdBSU59LAotCXsweGEwLCAweDQwLCBaQzNYWF9SMTE3X0dHQUlOfSwKLQl7MHhhMCwgMHg0MCwgWkMzWFhfUjExOF9CR0FJTn0sCi0vKgl7MHhhMCwgMHgwMiwgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LCAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGh2NzEzMWJfNTBIWltdID0gewkvKiA2NDB4NDgwKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJLyogMDAsMTksMDAsY2MgKi8KKwl7MHhhYSwgMHgyNSwgMHgwMDA3fSwJCQkvKiAwMCwyNSwwNyxhYSAqLworCXsweGFhLCAweDI2LCAweDAwNTN9LAkJCS8qIDAwLDI2LDUzLGFhICovCisJezB4YWEsIDB4MjcsIDB4MDAwMH0sCQkJLyogMDAsMjcsMDAsYWEgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAwfSwJCQkvKiAwMCwyMCwwMCxhYSAqLworCXsweGFhLCAweDIxLCAweDAwNTB9LAkJCS8qIDAwLDIxLDUwLGFhICovCisJezB4YWEsIDB4MjIsIDB4MDAxYn0sCQkJLyogMDAsMjIsMWIsYWEgKi8KKwl7MHhhYSwgMHgyMywgMHgwMGZjfSwJCQkvKiAwMCwyMyxmYyxhYSAqLworCXsweGEwLCAweDJmLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMmYsY2MgKi8KKwl7MHhhMCwgMHg5YiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsOWIsY2MgKi8KKwl7MHhhMCwgMHg4MCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsODAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMCxjYyAqLworCXsweGEwLCAweGVhLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsZWEsY2MgKi8KKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LDYwLGNjICovCisJezB4YTAsIDB4MGMsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkvKiAwMSw4YywwYyxjYyAqLworCXsweGEwLCAweDE4LCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAkvKiAwMSw4ZiwxOCxjYyAqLworCXsweGEwLCAweDE4LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAkvKiAwMSxhOSwxOCxjYyAqLworCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCS8qIDAxLGFhLDI0LGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMURfSFNZTkNfMH0sCS8qIDAwLDFkLDAwLGNjICovCisJezB4YTAsIDB4NTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCS8qIDAwLDFlLDUwLGNjICovCisJezB4YTAsIDB4MWIsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCS8qIDAwLDFmLDFiLGNjICovCisJezB4YTAsIDB4ZmMsIFpDM1hYX1IwMjBfSFNZTkNfM30sCS8qIDAwLDIwLGZjLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gaHY3MTMxYl81MEhaU2NhbGVbXSA9IHsJLyogMzIweDI0MCAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDE5X0FVVE9BREpVU1RGUFN9LAkvKiAwMCwxOSwwMCxjYyAqLworCXsweGFhLCAweDI1LCAweDAwMDd9LAkJCS8qIDAwLDI1LDA3LGFhICovCisJezB4YWEsIDB4MjYsIDB4MDA1M30sCQkJLyogMDAsMjYsNTMsYWEgKi8KKwl7MHhhYSwgMHgyNywgMHgwMDAwfSwJCQkvKiAwMCwyNywwMCxhYSAqLworCXsweGFhLCAweDIwLCAweDAwMDB9LAkJCS8qIDAwLDIwLDAwLGFhICovCisJezB4YWEsIDB4MjEsIDB4MDA1MH0sCQkJLyogMDAsMjEsNTAsYWEgKi8KKwl7MHhhYSwgMHgyMiwgMHgwMDEyfSwJCQkvKiAwMCwyMiwxMixhYSAqLworCXsweGFhLCAweDIzLCAweDAwODB9LAkJCS8qIDAwLDIzLDgwLGFhICovCisJezB4YTAsIDB4MmYsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAkvKiAwMSw5MCwyZixjYyAqLworCXsweGEwLCAweDliLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAkvKiAwMSw5MSw5YixjYyAqLworCXsweGEwLCAweDgwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAkvKiAwMSw5Miw4MCxjYyAqLworCXsweGEwLCAweDAxLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCS8qIDAxLDk1LDAxLGNjICovCisJezB4YTAsIDB4ZDQsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAkvKiAwMSw5NixkNCxjYyAqLworCXsweGEwLCAweGMwLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwJLyogMDEsOTcsYzAsY2MgKi8KKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCS8qIDAxLDhjLDA3LGNjICovCisJezB4YTAsIDB4MGYsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCS8qIDAxLDhmLDBmLGNjICovCisJezB4YTAsIDB4MTgsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCS8qIDAxLGE5LDE4LGNjICovCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwJLyogMDEsYWEsMjQsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxRF9IU1lOQ18wfSwJLyogMDAsMWQsMDAsY2MgKi8KKwl7MHhhMCwgMHg1MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwJLyogMDAsMWUsNTAsY2MgKi8KKwl7MHhhMCwgMHgxMiwgWkMzWFhfUjAxRl9IU1lOQ18yfSwJLyogMDAsMWYsMTIsY2MgKi8KKwl7MHhhMCwgMHg4MCwgWkMzWFhfUjAyMF9IU1lOQ18zfSwJLyogMDAsMjAsODAsY2MgKi8KKwl7fQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBodjcxMzFiXzYwSFpbXSA9IHsJLyogNjQweDQ4MCovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCS8qIDAwLDE5LDAwLGNjICovCisJezB4YWEsIDB4MjUsIDB4MDAwN30sCQkJLyogMDAsMjUsMDcsYWEgKi8KKwl7MHhhYSwgMHgyNiwgMHgwMGExfSwJCQkvKiAwMCwyNixhMSxhYSAqLworCXsweGFhLCAweDI3LCAweDAwMjB9LAkJCS8qIDAwLDI3LDIwLGFhICovCisJezB4YWEsIDB4MjAsIDB4MDAwMH0sCQkJLyogMDAsMjAsMDAsYWEgKi8KKwl7MHhhYSwgMHgyMSwgMHgwMDQwfSwJCQkvKiAwMCwyMSw0MCxhYSAqLworCXsweGFhLCAweDIyLCAweDAwMTN9LAkJCS8qIDAwLDIyLDEzLGFhICovCisJezB4YWEsIDB4MjMsIDB4MDA0Y30sCQkJLyogMDAsMjMsNGMsYWEgKi8KKwl7MHhhMCwgMHgyZiwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCS8qIDAxLDkwLDJmLGNjICovCisJezB4YTAsIDB4NGQsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCS8qIDAxLDkxLDRkLGNjICovCisJezB4YTAsIDB4NjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCS8qIDAxLDkyLDYwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwJLyogMDEsOTUsMDAsY2MgKi8KKwl7MHhhMCwgMHhjMywgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCS8qIDAxLDk2LGMzLGNjICovCisJezB4YTAsIDB4NTAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAkvKiAwMSw5Nyw1MCxjYyAqLworCXsweGEwLCAweDBjLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwJLyogMDEsOGMsMGMsY2MgKi8KKwl7MHhhMCwgMHgxOCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwJLyogMDEsOGYsMTgsY2MgKi8KKwl7MHhhMCwgMHgxOCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwJLyogMDEsYTksMTgsY2MgKi8KKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAkvKiAwMSxhYSwyNCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAkvKiAwMCwxZCwwMCxjYyAqLworCXsweGEwLCAweDQwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAkvKiAwMCwxZSw0MCxjYyAqLworCXsweGEwLCAweDEzLCBaQzNYWF9SMDFGX0hTWU5DXzJ9LAkvKiAwMCwxZiwxMyxjYyAqLworCXsweGEwLCAweDRjLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAkvKiAwMCwyMCw0YyxjYyAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIGh2NzEzMWJfNjBIWlNjYWxlW10gPSB7CS8qIDMyMHgyNDAgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJLyogMDAsMTksMDAsY2MgKi8KKwl7MHhhYSwgMHgyNSwgMHgwMDA3fSwJCQkvKiAwMCwyNSwwNyxhYSAqLworCXsweGFhLCAweDI2LCAweDAwYTF9LAkJCS8qIDAwLDI2LGExLGFhICovCisJezB4YWEsIDB4MjcsIDB4MDAyMH0sCQkJLyogMDAsMjcsMjAsYWEgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAwfSwJCQkvKiAwMCwyMCwwMCxhYSAqLworCXsweGFhLCAweDIxLCAweDAwYTB9LAkJCS8qIDAwLDIxLGEwLGFhICovCisJezB4YWEsIDB4MjIsIDB4MDAxNn0sCQkJLyogMDAsMjIsMTYsYWEgKi8KKwl7MHhhYSwgMHgyMywgMHgwMDQwfSwJCQkvKiAwMCwyMyw0MCxhYSAqLworCXsweGEwLCAweDJmLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMmYsY2MgKi8KKwl7MHhhMCwgMHg0ZCwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsNGQsY2MgKi8KKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsNjAsY2MgKi8KKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMSxjYyAqLworCXsweGEwLCAweDg2LCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsODYsY2MgKi8KKwl7MHhhMCwgMHhhMCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LGEwLGNjICovCisJezB4YTAsIDB4MDcsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkvKiAwMSw4YywwNyxjYyAqLworCXsweGEwLCAweDBmLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAkvKiAwMSw4ZiwwZixjYyAqLworCXsweGEwLCAweDE4LCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAkvKiAwMSxhOSwxOCxjYyAqLworCXsweGEwLCAweDI0LCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCS8qIDAxLGFhLDI0LGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMURfSFNZTkNfMH0sCS8qIDAwLDFkLDAwLGNjICovCisJezB4YTAsIDB4YTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCS8qIDAwLDFlLGEwLGNjICovCisJezB4YTAsIDB4MTYsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCS8qIDAwLDFmLDE2LGNjICovCisJezB4YTAsIDB4NDAsIFpDM1hYX1IwMjBfSFNZTkNfM30sCS8qIDAwLDIwLDQwLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gaHY3MTMxYl9Ob0ZsaWtlcltdID0gewkvKiA2NDB4NDgwKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJLyogMDAsMTksMDAsY2MgKi8KKwl7MHhhYSwgMHgyNSwgMHgwMDAzfSwJCQkvKiAwMCwyNSwwMyxhYSAqLworCXsweGFhLCAweDI2LCAweDAwMDB9LAkJCS8qIDAwLDI2LDAwLGFhICovCisJezB4YWEsIDB4MjcsIDB4MDAwMH0sCQkJLyogMDAsMjcsMDAsYWEgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAwfSwJCQkvKiAwMCwyMCwwMCxhYSAqLworCXsweGFhLCAweDIxLCAweDAwMTB9LAkJCS8qIDAwLDIxLDEwLGFhICovCisJezB4YWEsIDB4MjIsIDB4MDAwMH0sCQkJLyogMDAsMjIsMDAsYWEgKi8KKwl7MHhhYSwgMHgyMywgMHgwMDAzfSwJCQkvKiAwMCwyMywwMyxhYSAqLworCXsweGEwLCAweDJmLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMmYsY2MgKi8KKwl7MHhhMCwgMHhmOCwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsZjgsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMCxjYyAqLworCXsweGEwLCAweDAyLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsMDIsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LDAwLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkvKiAwMSw4YywxMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAkvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAkvKiAwMSxhOSwwMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCS8qIDAxLGFhLDAwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMURfSFNZTkNfMH0sCS8qIDAwLDFkLDAwLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCS8qIDAwLDFlLDEwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCS8qIDAwLDFmLDAwLGNjICovCisJezB4YTAsIDB4MDMsIFpDM1hYX1IwMjBfSFNZTkNfM30sCS8qIDAwLDIwLDAzLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gaHY3MTMxYl9Ob0ZsaWtlclNjYWxlW10gPSB7IC8qIDMyMHgyNDAgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJLyogMDAsMTksMDAsY2MgKi8KKwl7MHhhYSwgMHgyNSwgMHgwMDAzfSwJCQkvKiAwMCwyNSwwMyxhYSAqLworCXsweGFhLCAweDI2LCAweDAwMDB9LAkJCS8qIDAwLDI2LDAwLGFhICovCisJezB4YWEsIDB4MjcsIDB4MDAwMH0sCQkJLyogMDAsMjcsMDAsYWEgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAwfSwJCQkvKiAwMCwyMCwwMCxhYSAqLworCXsweGFhLCAweDIxLCAweDAwYTB9LAkJCS8qIDAwLDIxLGEwLGFhICovCisJezB4YWEsIDB4MjIsIDB4MDAxNn0sCQkJLyogMDAsMjIsMTYsYWEgKi8KKwl7MHhhYSwgMHgyMywgMHgwMDQwfSwJCQkvKiAwMCwyMyw0MCxhYSAqLworCXsweGEwLCAweDJmLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMmYsY2MgKi8KKwl7MHhhMCwgMHhmOCwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsZjgsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMCxjYyAqLworCXsweGEwLCAweDAyLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsMDIsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LDAwLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkvKiAwMSw4YywxMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAkvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAkvKiAwMSxhOSwwMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCS8qIDAxLGFhLDAwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMURfSFNZTkNfMH0sCS8qIDAwLDFkLDAwLGNjICovCisJezB4YTAsIDB4YTAsIFpDM1hYX1IwMUVfSFNZTkNfMX0sCS8qIDAwLDFlLGEwLGNjICovCisJezB4YTAsIDB4MTYsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCS8qIDAwLDFmLDE2LGNjICovCisJezB4YTAsIDB4NDAsIFpDM1hYX1IwMjBfSFNZTkNfM30sCS8qIDAwLDIwLDQwLGNjICovCiAJe30KIH07CiAKQEAgLTQzODksNiArNDEzMCwyNzAgQEAKIAl7fQogfTsKIAorLyogZnJvbSB1c2J2bTMxYi5pbmYgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBwYXMyMDJiX0luaXRpYWxbXSA9IHsJLyogNjQweDQ4MCAqLworCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAkJLyogMDAsMDAsMDEsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAwOF9DTE9DS1NFVFRJTkd9LAkJLyogMDAsMDgsMDAsY2MgKi8KKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjAxMF9DTU9TU0VOU09SU0VMRUNUfSwJLyogMDAsMTAsMGUsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAwMl9DTE9DS1NFTEVDVH0sCQkvKiAwMCwwMiwwMCxjYyAqLworCXsweGEwLCAweDAyLCBaQzNYWF9SMDAzX0ZSQU1FV0lEVEhISUdIfSwJLyogMDAsMDMsMDIsY2MgKi8KKwl7MHhhMCwgMHg4MCwgWkMzWFhfUjAwNF9GUkFNRVdJRFRITE9XfSwJCS8qIDAwLDA0LDgwLGNjICovCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDVfRlJBTUVIRUlHSFRISUdIfSwJLyogMDAsMDUsMDEsY2MgKi8KKwl7MHhhMCwgMHhlMCwgWkMzWFhfUjAwNl9GUkFNRUhFSUdIVExPV30sCS8qIDAwLDA2LGUwLGNjICovCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMDFfU1lTVEVNT1BFUkFUSU5HfSwJLyogMDAsMDEsMDEsY2MgKi8KKwl7MHhhMCwgMHgwMywgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwJLyogMDAsMTIsMDMsY2MgKi8KKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjAxMl9WSURFT0NPTlRST0xGVU5DfSwJLyogMDAsMTIsMDEsY2MgKi8KKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjA4RF9DT01QQUJJTElUWU1PREV9LAkvKiAwMCw4ZCwwOCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMDk4X1dJTllTVEFSVExPV30sCQkvKiAwMCw5OCwwMCxjYyAqLworCXsweGEwLCAweDAzLCBaQzNYWF9SMDlBX1dJTlhTVEFSVExPV30sCQkvKiAwMCw5YSwwMyxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTFBX0ZJUlNUWUxPV30sCQkvKiAwMSwxYSwwMCxjYyAqLworCXsweGEwLCAweDAzLCBaQzNYWF9SMTFDX0ZJUlNUWExPV30sCQkvKiAwMSwxYywwMyxjYyAqLworCXsweGEwLCAweDAxLCBaQzNYWF9SMDlCX1dJTkhFSUdIVEhJR0h9LAkJLyogMDAsOWIsMDEsY2MgKi8KKwl7MHhhMCwgMHhlNiwgWkMzWFhfUjA5Q19XSU5IRUlHSFRMT1d9LAkJLyogMDAsOWMsZTYsY2MgKi8KKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjA5RF9XSU5XSURUSEhJR0h9LAkJLyogMDAsOWQsMDIsY2MgKi8KKwl7MHhhMCwgMHg4NiwgWkMzWFhfUjA5RV9XSU5XSURUSExPV30sCQkvKiAwMCw5ZSw4NixjYyAqLworCXsweGFhLCAweDAyLCAweDAwMDJ9LAkJCS8qIDAwLDAyLDA0LGFhIC0tPiAwMiAqLworCXsweGFhLCAweDA3LCAweDAwMDZ9LAkJCQkvKiAwMCwwNywwNixhYSAqLworCXsweGFhLCAweDA4LCAweDAwMDJ9LAkJCQkvKiAwMCwwOCwwMixhYSAqLworCXsweGFhLCAweDA5LCAweDAwMDZ9LAkJCQkvKiAwMCwwOSwwNixhYSAqLworCXsweGFhLCAweDBhLCAweDAwMDF9LAkJCQkvKiAwMCwwYSwwMSxhYSAqLworCXsweGFhLCAweDBiLCAweDAwMDF9LAkJCQkvKiAwMCwwYiwwMSxhYSAqLworCXsweGFhLCAweDBjLCAweDAwMDh9LAkJCQkvKiAwMCwwYywwOCxhYSAqLworCXsweGFhLCAweDBkLCAweDAwMDB9LAkJCQkvKiAwMCwwZCwwMCxhYSAqLworCXsweGFhLCAweDEwLCAweDAwMDB9LAkJCQkvKiAwMCwxMCwwMCxhYSAqLworCXsweGFhLCAweDEyLCAweDAwMDV9LAkJCQkvKiAwMCwxMiwwNSxhYSAqLworCXsweGFhLCAweDEzLCAweDAwNjN9LAkJCQkvKiAwMCwxMyw2MyxhYSAqLworCXsweGFhLCAweDE1LCAweDAwNzB9LAkJCQkvKiAwMCwxNSw3MCxhYSAqLworCXsweGEwLCAweGI3LCBaQzNYWF9SMTAxX1NFTlNPUkNPUlJFQ1RJT059LAkvKiAwMSwwMSxiNyxjYyAqLworCXsweGEwLCAweDBkLCBaQzNYWF9SMTAwX09QRVJBVElPTk1PREV9LAkJLyogMDEsMDAsMGQsY2MgKi8KKwl7MHhhMCwgMHgwNiwgWkMzWFhfUjE4OV9BV0JTVEFUVVN9LAkJLyogMDEsODksMDYsY2MgKi8KKwl7MHhhMCwgMHgwMCwgMHgwMWFkfSwJCQkJLyogMDEsYWQsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMywgWkMzWFhfUjFDNV9TSEFSUE5FU1NNT0RFfSwJCS8qIDAxLGM1LDAzLGNjICovCisJezB4YTAsIDB4MTMsIFpDM1hYX1IxQ0JfU0hBUlBORVNTMDV9LAkJLyogMDEsY2IsMTMsY2MgKi8KKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjI1MF9ERUFEUElYRUxTTU9ERX0sCS8qIDAyLDUwLDA4LGNjICovCisJezB4YTAsIDB4MDgsIFpDM1hYX1IzMDFfRUVQUk9NQUNDRVNTfSwJCS8qIDAzLDAxLDA4LGNjICovCisJezB4YTAsIDB4NzAsIFpDM1hYX1IxOERfWVRBUkdFVH0sCQkvKiAwMSw4ZCw3MCxjYyAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBhczIwMmJfSW5pdGlhbFNjYWxlW10gPSB7CS8qIDMyMHgyNDAgKi8KKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjAwMF9TWVNURU1DT05UUk9MfSwJCS8qIDAwLDAwLDAxLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HfSwJCS8qIDAwLDA4LDAwLGNjICovCisJezB4YTAsIDB4MGUsIFpDM1hYX1IwMTBfQ01PU1NFTlNPUlNFTEVDVH0sCS8qIDAwLDEwLDBlLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IwMDJfQ0xPQ0tTRUxFQ1R9LAkJLyogMDAsMDIsMTAsY2MgKi8KKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjAwM19GUkFNRVdJRFRISElHSH0sCS8qIDAwLDAzLDAyLGNjICovCisJezB4YTAsIDB4ODAsIFpDM1hYX1IwMDRfRlJBTUVXSURUSExPV30sCQkvKiAwMCwwNCw4MCxjYyAqLworCXsweGEwLCAweDAxLCBaQzNYWF9SMDA1X0ZSQU1FSEVJR0hUSElHSH0sCS8qIDAwLDA1LDAxLGNjICovCisJezB4YTAsIDB4ZDAsIFpDM1hYX1IwMDZfRlJBTUVIRUlHSFRMT1d9LAkvKiAwMCwwNixkMCxjYyAqLworCXsweGEwLCAweDAxLCBaQzNYWF9SMDAxX1NZU1RFTU9QRVJBVElOR30sCS8qIDAwLDAxLDAxLGNjICovCisJezB4YTAsIDB4MDMsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCS8qIDAwLDEyLDAzLGNjICovCisJezB4YTAsIDB4MDEsIFpDM1hYX1IwMTJfVklERU9DT05UUk9MRlVOQ30sCS8qIDAwLDEyLDAxLGNjICovCisJezB4YTAsIDB4MDgsIFpDM1hYX1IwOERfQ09NUEFCSUxJVFlNT0RFfSwJLyogMDAsOGQsMDgsY2MgKi8KKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjA5OF9XSU5ZU1RBUlRMT1d9LAkJLyogMDAsOTgsMDgsY2MgKi8KKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjA5QV9XSU5YU1RBUlRMT1d9LAkJLyogMDAsOWEsMDIsY2MgKi8KKwl7MHhhMCwgMHgwOCwgWkMzWFhfUjExQV9GSVJTVFlMT1d9LAkJLyogMDEsMWEsMDgsY2MgKi8KKwl7MHhhMCwgMHgwMiwgWkMzWFhfUjExQ19GSVJTVFhMT1d9LAkJLyogMDEsMWMsMDIsY2MgKi8KKwl7MHhhMCwgMHgwMSwgWkMzWFhfUjA5Ql9XSU5IRUlHSFRISUdIfSwJCS8qIDAwLDliLDAxLGNjICovCisJezB4YTAsIDB4ZDgsIFpDM1hYX1IwOUNfV0lOSEVJR0hUTE9XfSwJCS8qIDAwLDljLGQ4LGNjICovCisJezB4YTAsIDB4MDIsIFpDM1hYX1IwOURfV0lOV0lEVEhISUdIfSwJCS8qIDAwLDlkLDAyLGNjICovCisJezB4YTAsIDB4ODgsIFpDM1hYX1IwOUVfV0lOV0lEVEhMT1d9LAkJLyogMDAsOWUsODgsY2MgKi8KKwl7MHhhYSwgMHgwMiwgMHgwMDAyfSwJCQkJLyogMDAsMDIsMDIsYWEgKi8KKwl7MHhhYSwgMHgwNywgMHgwMDA2fSwJCQkJLyogMDAsMDcsMDYsYWEgKi8KKwl7MHhhYSwgMHgwOCwgMHgwMDAyfSwJCQkJLyogMDAsMDgsMDIsYWEgKi8KKwl7MHhhYSwgMHgwOSwgMHgwMDA2fSwJCQkJLyogMDAsMDksMDYsYWEgKi8KKwl7MHhhYSwgMHgwYSwgMHgwMDAxfSwJCQkJLyogMDAsMGEsMDEsYWEgKi8KKwl7MHhhYSwgMHgwYiwgMHgwMDAxfSwJCQkJLyogMDAsMGIsMDEsYWEgKi8KKwl7MHhhYSwgMHgwYywgMHgwMDA4fSwJCQkJLyogMDAsMGMsMDgsYWEgKi8KKwl7MHhhYSwgMHgwZCwgMHgwMDAwfSwJCQkJLyogMDAsMGQsMDAsYWEgKi8KKwl7MHhhYSwgMHgxMCwgMHgwMDAwfSwJCQkJLyogMDAsMTAsMDAsYWEgKi8KKwl7MHhhYSwgMHgxMiwgMHgwMDA1fSwJCQkJLyogMDAsMTIsMDUsYWEgKi8KKwl7MHhhYSwgMHgxMywgMHgwMDYzfSwJCQkJLyogMDAsMTMsNjMsYWEgKi8KKwl7MHhhYSwgMHgxNSwgMHgwMDcwfSwJCQkJLyogMDAsMTUsNzAsYWEgKi8KKwl7MHhhMCwgMHgzNywgWkMzWFhfUjEwMV9TRU5TT1JDT1JSRUNUSU9OfSwJLyogMDEsMDEsMzcsY2MgKi8KKwl7MHhhMCwgMHgwZCwgWkMzWFhfUjEwMF9PUEVSQVRJT05NT0RFfSwJCS8qIDAxLDAwLDBkLGNjICovCisJezB4YTAsIDB4MDYsIFpDM1hYX1IxODlfQVdCU1RBVFVTfSwJCS8qIDAxLDg5LDA2LGNjICovCisJezB4YTAsIDB4MDAsIDB4MDFhZH0sCQkJCS8qIDAxLGFkLDAwLGNjICovCisJezB4YTAsIDB4MDMsIFpDM1hYX1IxQzVfU0hBUlBORVNTTU9ERX0sCQkvKiAwMSxjNSwwMyxjYyAqLworCXsweGEwLCAweDEzLCBaQzNYWF9SMUNCX1NIQVJQTkVTUzA1fSwJCS8qIDAxLGNiLDEzLGNjICovCisJezB4YTAsIDB4MDgsIFpDM1hYX1IyNTBfREVBRFBJWEVMU01PREV9LAkvKiAwMiw1MCwwOCxjYyAqLworCXsweGEwLCAweDA4LCBaQzNYWF9SMzAxX0VFUFJPTUFDQ0VTU30sCQkvKiAwMywwMSwwOCxjYyAqLworCXsweGEwLCAweDcwLCBaQzNYWF9SMThEX1lUQVJHRVR9LAkJLyogMDEsOGQsNzAsY2MgKi8KKwl7fQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjdGlvbiBwYXMyMDJiXzUwSFpbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJCS8qIDAwLDE5LDAwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IwODdfRVhQVElNRU1JRH0sCQkvKiAwMCw4NywyMCxjYyAqLworCXsweGEwLCAweDIxLCBaQzNYWF9SMDg4X0VYUFRJTUVMT1d9LAkJLyogMDAsODgsMjEsY2MgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAyfSwJCQkJLyogMDAsMjAsMDIsYWEgKi8KKwl7MHhhYSwgMHgyMSwgMHgwMDY4fSwJCQkJLyogMDAsMjEsNjgsYWEgKi8KKwl7MHhhYSwgMHgwMywgMHgwMDQ0fSwJCQkJLyogMDAsMDMsNDQsYWEgKi8KKwl7MHhhYSwgMHgwNCwgMHgwMDA5fSwJCQkJLyogMDAsMDQsMDksYWEgKi8KKwl7MHhhYSwgMHgwNSwgMHgwMDI4fSwJCQkJLyogMDAsMDUsMjgsYWEgKi8KKwl7MHhhYSwgMHgwZSwgMHgwMDAxfSwJCQkJLyogMDAsMGUsMDEsYWEgKi8KKwl7MHhhYSwgMHgwZiwgMHgwMDAwfSwJCQkJLyogMDAsMGYsMDAsYWEgKi8KKwl7MHhhMCwgMHgxNCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwJLyogMDEsYTksMTQsY2MgKi8KKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAkvKiAwMSxhYSwyNCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMDAsY2MgKi8KKwl7MHhhMCwgMHgwNywgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsMDcsY2MgKi8KKwl7MHhhMCwgMHhkMiwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsZDIsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsMDAsY2MgKi8KKwl7MHhhMCwgMHg0ZCwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LDRkLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkJLyogMDEsOGMsMTAsY2MgKi8KKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwJCS8qIDAxLDhmLDIwLGNjICovCisJezB4YTAsIDB4NDQsIFpDM1hYX1IwMURfSFNZTkNfMH0sCQkvKiAwMCwxZCw0NCxjYyAqLworCXsweGEwLCAweDZmLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAkJLyogMDAsMWUsNmYsY2MgKi8KKwl7MHhhMCwgMHhhZCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwJCS8qIDAwLDFmLGFkLGNjICovCisJezB4YTAsIDB4ZWIsIFpDM1hYX1IwMjBfSFNZTkNfM30sCQkvKiAwMCwyMCxlYixjYyAqLworCXsweGEwLCAweDBmLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMGYsY2MgKi8KKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDBlLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGFzMjAyYl81MEhaU2NhbGVbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJCS8qIDAwLDE5LDAwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IwODdfRVhQVElNRU1JRH0sCQkvKiAwMCw4NywyMCxjYyAqLworCXsweGEwLCAweDIxLCBaQzNYWF9SMDg4X0VYUFRJTUVMT1d9LAkJLyogMDAsODgsMjEsY2MgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAyfSwJCQkJLyogMDAsMjAsMDIsYWEgKi8KKwl7MHhhYSwgMHgyMSwgMHgwMDZjfSwJCQkJLyogMDAsMjEsNmMsYWEgKi8KKwl7MHhhYSwgMHgwMywgMHgwMDQxfSwJCQkJLyogMDAsMDMsNDEsYWEgKi8KKwl7MHhhYSwgMHgwNCwgMHgwMDA5fSwJCQkJLyogMDAsMDQsMDksYWEgKi8KKwl7MHhhYSwgMHgwNSwgMHgwMDJjfSwJCQkJLyogMDAsMDUsMmMsYWEgKi8KKwl7MHhhYSwgMHgwZSwgMHgwMDAxfSwJCQkJLyogMDAsMGUsMDEsYWEgKi8KKwl7MHhhYSwgMHgwZiwgMHgwMDAwfSwJCQkJLyogMDAsMGYsMDAsYWEgKi8KKwl7MHhhMCwgMHgxNCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwJLyogMDEsYTksMTQsY2MgKi8KKwl7MHhhMCwgMHgyNCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAkvKiAwMSxhYSwyNCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTkwX0VYUE9TVVJFTElNSVRISUdIfSwJLyogMDEsOTAsMDAsY2MgKi8KKwl7MHhhMCwgMHgwZiwgWkMzWFhfUjE5MV9FWFBPU1VSRUxJTUlUTUlEfSwJLyogMDEsOTEsMGYsY2MgKi8KKwl7MHhhMCwgMHhiZSwgWkMzWFhfUjE5Ml9FWFBPU1VSRUxJTUlUTE9XfSwJLyogMDEsOTIsYmUsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5NV9BTlRJRkxJQ0tFUkhJR0h9LAkvKiAwMSw5NSwwMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTk2X0FOVElGTElDS0VSTUlEfSwJLyogMDEsOTYsMDAsY2MgKi8KKwl7MHhhMCwgMHg5YiwgWkMzWFhfUjE5N19BTlRJRkxJQ0tFUkxPV30sCS8qIDAxLDk3LDliLGNjICovCisJezB4YTAsIDB4MTAsIFpDM1hYX1IxOENfQUVGUkVFWkV9LAkJLyogMDEsOGMsMTAsY2MgKi8KKwl7MHhhMCwgMHgyMCwgWkMzWFhfUjE4Rl9BRVVORlJFRVpFfSwJCS8qIDAxLDhmLDIwLGNjICovCisJezB4YTAsIDB4NDEsIFpDM1hYX1IwMURfSFNZTkNfMH0sCQkvKiAwMCwxZCw0MSxjYyAqLworCXsweGEwLCAweDZmLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAkJLyogMDAsMWUsNmYsY2MgKi8KKwl7MHhhMCwgMHhhZCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwJCS8qIDAwLDFmLGFkLGNjICovCisJezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCQkvKiAwMCwyMCxmZixjYyAqLworCXsweGEwLCAweDBmLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMGYsY2MgKi8KKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDBlLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGFzMjAyYl82MEhaW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCQkvKiAwMCwxOSwwMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMjAsY2MgKi8KKwl7MHhhMCwgMHgyMSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDIxLGNjICovCisJezB4YWEsIDB4MjAsIDB4MDAwMn0sCQkJCS8qIDAwLDIwLDAyLGFhICovCisJezB4YWEsIDB4MjEsIDB4MDAwMH0sCQkJCS8qIDAwLDIxLDAwLGFhICovCisJezB4YWEsIDB4MDMsIDB4MDA0NX0sCQkJCS8qIDAwLDAzLDQ1LGFhICovCisJezB4YWEsIDB4MDQsIDB4MDAwOH0sCQkJCS8qIDAwLDA0LDA4LGFhICovCisJezB4YWEsIDB4MDUsIDB4MDAwMH0sCQkJCS8qIDAwLDA1LDAwLGFhICovCisJezB4YWEsIDB4MGUsIDB4MDAwMX0sCQkJCS8qIDAwLDBlLDAxLGFhICovCisJezB4YWEsIDB4MGYsIDB4MDAwMH0sCQkJCS8qIDAwLDBmLDAwLGFhICovCisJezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCS8qIDAxLGE5LDE0LGNjICovCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwJLyogMDEsYWEsMjQsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCS8qIDAxLDkwLDAwLGNjICovCisJezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCS8qIDAxLDkxLDA3LGNjICovCisJezB4YTAsIDB4YzAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCS8qIDAxLDkyLGMwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwJLyogMDEsOTUsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCS8qIDAxLDk2LDAwLGNjICovCisJezB4YTAsIDB4NDAsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAkvKiAwMSw5Nyw0MCxjYyAqLworCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwJCS8qIDAxLDhjLDEwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCQkvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDQ1LCBaQzNYWF9SMDFEX0hTWU5DXzB9LAkJLyogMDAsMWQsNDUsY2MgKi8KKwl7MHhhMCwgMHg4ZSwgWkMzWFhfUjAxRV9IU1lOQ18xfSwJCS8qIDAwLDFlLDhlLGNjICovCisJezB4YTAsIDB4YzEsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCQkvKiAwMCwxZixjMSxjYyAqLworCXsweGEwLCAweGY1LCBaQzNYWF9SMDIwX0hTWU5DXzN9LAkJLyogMDAsMjAsZjUsY2MgKi8KKwl7MHhhMCwgMHgwZiwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwJCS8qIDAwLDg3LDBmLGNjICovCisJezB4YTAsIDB4MGUsIFpDM1hYX1IwODhfRVhQVElNRUxPV30sCQkvKiAwMCw4OCwwZSxjYyAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBhczIwMmJfNjBIWlNjYWxlW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCQkvKiAwMCwxOSwwMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMjAsY2MgKi8KKwl7MHhhMCwgMHgyMSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDIxLGNjICovCisJezB4YWEsIDB4MjAsIDB4MDAwMn0sCQkJCS8qIDAwLDIwLDAyLGFhICovCisJezB4YWEsIDB4MjEsIDB4MDAwNH0sCQkJCS8qIDAwLDIxLDA0LGFhICovCisJezB4YWEsIDB4MDMsIDB4MDA0Mn0sCQkJCS8qIDAwLDAzLDQyLGFhICovCisJezB4YWEsIDB4MDQsIDB4MDAwOH0sCQkJCS8qIDAwLDA0LDA4LGFhICovCisJezB4YWEsIDB4MDUsIDB4MDAwNH0sCQkJCS8qIDAwLDA1LDA0LGFhICovCisJezB4YWEsIDB4MGUsIDB4MDAwMX0sCQkJCS8qIDAwLDBlLDAxLGFhICovCisJezB4YWEsIDB4MGYsIDB4MDAwMH0sCQkJCS8qIDAwLDBmLDAwLGFhICovCisJezB4YTAsIDB4MTQsIFpDM1hYX1IxQTlfRElHSVRBTExJTUlURElGRn0sCS8qIDAxLGE5LDE0LGNjICovCisJezB4YTAsIDB4MjQsIFpDM1hYX1IxQUFfRElHSVRBTEdBSU5TVEVQfSwJLyogMDEsYWEsMjQsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCS8qIDAxLDkwLDAwLGNjICovCisJezB4YTAsIDB4MGYsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCS8qIDAxLDkxLDBmLGNjICovCisJezB4YTAsIDB4OWYsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCS8qIDAxLDkyLDlmLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwJLyogMDEsOTUsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCS8qIDAxLDk2LDAwLGNjICovCisJezB4YTAsIDB4ODEsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAkvKiAwMSw5Nyw4MSxjYyAqLworCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwJCS8qIDAxLDhjLDEwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCQkvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDQyLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAkJLyogMDAsMWQsNDIsY2MgKi8KKwl7MHhhMCwgMHg2ZiwgWkMzWFhfUjAxRV9IU1lOQ18xfSwJCS8qIDAwLDFlLDZmLGNjICovCisJezB4YTAsIDB4YWYsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCQkvKiAwMCwxZixhZixjYyAqLworCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAkJLyogMDAsMjAsZmYsY2MgKi8KKwl7MHhhMCwgMHgwZiwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwJCS8qIDAwLDg3LDBmLGNjICovCisJezB4YTAsIDB4MGUsIFpDM1hYX1IwODhfRVhQVElNRUxPV30sCQkvKiAwMCw4OCwwZSxjYyAqLworCXt9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHBhczIwMmJfTm9GbGlrZXJbXSA9IHsKKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjAxOV9BVVRPQURKVVNURlBTfSwJCS8qIDAwLDE5LDAwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IwODdfRVhQVElNRU1JRH0sCQkvKiAwMCw4NywyMCxjYyAqLworCXsweGEwLCAweDIxLCBaQzNYWF9SMDg4X0VYUFRJTUVMT1d9LAkJLyogMDAsODgsMjEsY2MgKi8KKwl7MHhhYSwgMHgyMCwgMHgwMDAyfSwJCQkJLyogMDAsMjAsMDIsYWEgKi8KKwl7MHhhYSwgMHgyMSwgMHgwMDIwfSwJCQkJLyogMDAsMjEsMjAsYWEgKi8KKwl7MHhhYSwgMHgwMywgMHgwMDQwfSwJCQkJLyogMDAsMDMsNDAsYWEgKi8KKwl7MHhhYSwgMHgwNCwgMHgwMDA4fSwJCQkJLyogMDAsMDQsMDgsYWEgKi8KKwl7MHhhYSwgMHgwNSwgMHgwMDIwfSwJCQkJLyogMDAsMDUsMjAsYWEgKi8KKwl7MHhhYSwgMHgwZSwgMHgwMDAxfSwJCQkJLyogMDAsMGUsMDEsYWEgKi8KKwl7MHhhYSwgMHgwZiwgMHgwMDAwfSwJCQkJLyogMDAsMGYsMDAsYWEgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5MF9FWFBPU1VSRUxJTUlUSElHSH0sCS8qIDAxLDkwLDAwLGNjICovCisJezB4YTAsIDB4MDcsIFpDM1hYX1IxOTFfRVhQT1NVUkVMSU1JVE1JRH0sCS8qIDAxLDkxLDA3LGNjICovCisJezB4YTAsIDB4ZjAsIFpDM1hYX1IxOTJfRVhQT1NVUkVMSU1JVExPV30sCS8qIDAxLDkyLGYwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTVfQU5USUZMSUNLRVJISUdIfSwJLyogMDEsOTUsMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjE5Nl9BTlRJRkxJQ0tFUk1JRH0sCS8qIDAxLDk2LDAwLGNjICovCisJezB4YTAsIDB4MDIsIFpDM1hYX1IxOTdfQU5USUZMSUNLRVJMT1d9LAkvKiAwMSw5NywwMixjYyAqLworCXsweGEwLCAweDEwLCBaQzNYWF9SMThDX0FFRlJFRVpFfSwJCS8qIDAxLDhjLDEwLGNjICovCisJezB4YTAsIDB4MjAsIFpDM1hYX1IxOEZfQUVVTkZSRUVaRX0sCQkvKiAwMSw4ZiwyMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUE5X0RJR0lUQUxMSU1JVERJRkZ9LAkvKiAwMSxhOSwwMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMUFBX0RJR0lUQUxHQUlOU1RFUH0sCS8qIDAxLGFhLDAwLGNjICovCisJezB4YTAsIDB4NDAsIFpDM1hYX1IwMURfSFNZTkNfMH0sCQkvKiAwMCwxZCw0MCxjYyAqLworCXsweGEwLCAweDYwLCBaQzNYWF9SMDFFX0hTWU5DXzF9LAkJLyogMDAsMWUsNjAsY2MgKi8KKwl7MHhhMCwgMHg5MCwgWkMzWFhfUjAxRl9IU1lOQ18yfSwJCS8qIDAwLDFmLDkwLGNjICovCisJezB4YTAsIDB4ZmYsIFpDM1hYX1IwMjBfSFNZTkNfM30sCQkvKiAwMCwyMCxmZixjYyAqLworCXsweGEwLCAweDBmLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMGYsY2MgKi8KKwl7MHhhMCwgMHgwZSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDBlLGNjICovCisJe30KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGFzMjAyYl9Ob0ZsaWtlclNjYWxlW10gPSB7CisJezB4YTAsIDB4MDAsIFpDM1hYX1IwMTlfQVVUT0FESlVTVEZQU30sCQkvKiAwMCwxOSwwMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMDg3X0VYUFRJTUVNSUR9LAkJLyogMDAsODcsMjAsY2MgKi8KKwl7MHhhMCwgMHgyMSwgWkMzWFhfUjA4OF9FWFBUSU1FTE9XfSwJCS8qIDAwLDg4LDIxLGNjICovCisJezB4YWEsIDB4MjAsIDB4MDAwMn0sCQkJCS8qIDAwLDIwLDAyLGFhICovCisJezB4YWEsIDB4MjEsIDB4MDAxMH0sCQkJCS8qIDAwLDIxLDEwLGFhICovCisJezB4YWEsIDB4MDMsIDB4MDA0MH0sCQkJCS8qIDAwLDAzLDQwLGFhICovCisJezB4YWEsIDB4MDQsIDB4MDAwOH0sCQkJCS8qIDAwLDA0LDA4LGFhICovCisJezB4YWEsIDB4MDUsIDB4MDAxMH0sCQkJCS8qIDAwLDA1LDEwLGFhICovCisJezB4YWEsIDB4MGUsIDB4MDAwMX0sCQkJCS8qIDAwLDBlLDAxLGFhICovCisJezB4YWEsIDB4MGYsIDB4MDAwMH0sCQkJCS8qIDAwLDBmLDAwLGFhICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTBfRVhQT1NVUkVMSU1JVEhJR0h9LAkvKiAwMSw5MCwwMCxjYyAqLworCXsweGEwLCAweDBmLCBaQzNYWF9SMTkxX0VYUE9TVVJFTElNSVRNSUR9LAkvKiAwMSw5MSwwZixjYyAqLworCXsweGEwLCAweGYwLCBaQzNYWF9SMTkyX0VYUE9TVVJFTElNSVRMT1d9LAkvKiAwMSw5MixmMCxjYyAqLworCXsweGEwLCAweDAwLCBaQzNYWF9SMTk1X0FOVElGTElDS0VSSElHSH0sCS8qIDAxLDk1LDAwLGNjICovCisJezB4YTAsIDB4MDAsIFpDM1hYX1IxOTZfQU5USUZMSUNLRVJNSUR9LAkvKiAwMSw5NiwwMCxjYyAqLworCXsweGEwLCAweDAyLCBaQzNYWF9SMTk3X0FOVElGTElDS0VSTE9XfSwJLyogMDEsOTcsMDIsY2MgKi8KKwl7MHhhMCwgMHgxMCwgWkMzWFhfUjE4Q19BRUZSRUVaRX0sCQkvKiAwMSw4YywxMCxjYyAqLworCXsweGEwLCAweDIwLCBaQzNYWF9SMThGX0FFVU5GUkVFWkV9LAkJLyogMDEsOGYsMjAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBOV9ESUdJVEFMTElNSVRESUZGfSwJLyogMDEsYTksMDAsY2MgKi8KKwl7MHhhMCwgMHgwMCwgWkMzWFhfUjFBQV9ESUdJVEFMR0FJTlNURVB9LAkvKiAwMSxhYSwwMCxjYyAqLworCXsweGEwLCAweDQwLCBaQzNYWF9SMDFEX0hTWU5DXzB9LAkJLyogMDAsMWQsNDAsY2MgKi8KKwl7MHhhMCwgMHg2MCwgWkMzWFhfUjAxRV9IU1lOQ18xfSwJCS8qIDAwLDFlLDYwLGNjICovCisJezB4YTAsIDB4OTAsIFpDM1hYX1IwMUZfSFNZTkNfMn0sCQkvKiAwMCwxZiw5MCxjYyAqLworCXsweGEwLCAweGZmLCBaQzNYWF9SMDIwX0hTWU5DXzN9LAkJLyogMDAsMjAsZmYsY2MgKi8KKwl7MHhhMCwgMHgwZiwgWkMzWFhfUjA4N19FWFBUSU1FTUlEfSwJCS8qIDAwLDg3LDBmLGNjICovCisJezB4YTAsIDB4MGUsIFpDM1hYX1IwODhfRVhQVElNRUxPV30sCQkvKiAwMCw4OCwwZSxjYyAqLworCXt9Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9hY3Rpb24gcGIwMzMwM3hfSW5pdGlhbFtdID0gewogCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAogCXsweGEwLCAweDAzLCBaQzNYWF9SMDA4X0NMT0NLU0VUVElOR30sCkBAIC01NzI1LDcgKzU3MzAsNyBAQAogCXt9CiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfYWN0aW9uIHRhczUxMzBjeHhfSW5pdGlhbFNjYWxlW10gPSB7Ci0JezB4YTAsIDB4MDEsIFpDM1hYX1IwMDBfU1lTVEVNQ09OVFJPTH0sCisvKj8/CXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LCAqLwogCXsweGEwLCAweDAxLCBaQzNYWF9SMDAwX1NZU1RFTUNPTlRST0x9LAogCXsweGEwLCAweDQwLCBaQzNYWF9SMDAyX0NMT0NLU0VMRUNUfSwKIApAQCAtNjA0OSw3ICs2MDU0LDcgQEAKIAl7MHhhYSwgMHgxYiwgMHgwMDAwfSwJCS8qIDAwLDFiLDAwLGFhLCAqLwogCXsweGFhLCAweDEzLCAweDAwMDJ9LAkJLyogMDAsMTMsMDIsYWEsICovCiAJezB4YWEsIDB4MTUsIDB4MDAwNH0sCQkvKiAwMCwxNSwwNCxhYSAqLwotCXsweGFhLCAweDAxLCAweDAwMDB9LAorLyo/Pwl7MHhhYSwgMHgwMSwgMHgwMDAwfSwgKi8KIAl7MHhhYSwgMHgwMSwgMHgwMDAwfSwKIAl7MHhhYSwgMHgxYSwgMHgwMDAwfSwJCS8qIDAwLDFhLDAwLGFhLCAqLwogCXsweGFhLCAweDFjLCAweDAwMTd9LAkJLyogMDAsMWMsMTcsYWEsICovCkBAIC02MDY1LDggKzYwNzAsOCBAQAogCXsweGFhLCAweDBmLCAweDAwYTB9LAkJLyogMDAsMGYsYTAsYWEsICovCiAJezB4YWEsIDB4MTAsIDB4MDAwMH0sCQkvKiAwMCwxMCwwMCxhYSwgKi8KIAl7MHhhYSwgMHgxMSwgMHgwMGEwfSwJCS8qIDAwLDExLGEwLGFhLCAqLwotCXsweGEwLCAweDAwLCAweDAwMzl9LAotCXsweGExLCAweDAxLCAweDAwMzd9LAorLyo/Pwl7MHhhMCwgMHgwMCwgMHgwMDM5fSwKKwl7MHhhMSwgMHgwMSwgMHgwMDM3fSwgKi8KIAl7MHhhYSwgMHgxNiwgMHgwMDAxfSwJCS8qIDAwLDE2LDAxLGFhLCAqLwogCXsweGFhLCAweDE3LCAweDAwZTh9LAkJLyogMDAsMTcsZTYsYWEgKGU2IC0+IGU4KSAqLwogCXsweGFhLCAweDE4LCAweDAwMDJ9LAkJLyogMDAsMTgsMDIsYWEsICovCkBAIC02MzAzLDcgKzYzMDgsNyBAQAogCXJlZ193X2koZ3NwY2FfZGV2LT5kZXYsIHZhbEwsIDB4OTMpOwogCXJlZ193X2koZ3NwY2FfZGV2LT5kZXYsIHZhbEgsIDB4OTQpOwogCXJlZ193X2koZ3NwY2FfZGV2LT5kZXYsIDB4MDEsIDB4OTApOwkJLyogPC0gd3JpdGUgY29tbWFuZCAqLwotCW1zbGVlcCg1KTsKKwltc2xlZXAoMTUpOwogCXJldGJ5dGUgPSByZWdfcl9pKGdzcGNhX2RldiwgMHgwMDkxKTsJCS8qIHJlYWQgc3RhdHVzICovCiAJUERFQlVHKERfVVNCTywgImkyYyB3IFslMDJ4XSA9ICUwMnglMDJ4ICglMDJ4KSIsCiAJCQlyZWcsIHZhbEgsIHZhbEwsIHJldGJ5dGUpOwpAQCAtNjM0NiwzMCArNjM1MSwzNSBAQAogCQl7MHg1MCwgMHhmOCwgMHhmOCwgMHhmOCwgMHg1MCwgMHhmOCwgMHhmOCwgMHhmOCwgMHg1MH07CiAJc3RhdGljIGNvbnN0IF9fdTggb3Y3NjIwX21hdHJpeFs5XSA9CiAJCXsweDU4LCAweGY0LCAweGY0LCAweGY0LCAweDU4LCAweGY0LCAweGY0LCAweGY0LCAweDU4fTsKKwlzdGF0aWMgY29uc3QgX191OCBwYXMyMDJiX21hdHJpeFs5XSA9CisJCXsweDRjLCAweGY1LCAweGZmLCAweGY5LCAweDUxLCAweGY1LCAweGZiLCAweGVkLCAweDVmfTsKIAlzdGF0aWMgY29uc3QgX191OCBwbzIwMzBfbWF0cml4WzldID0KIAkJezB4NjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4NjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4NjB9OwogCXN0YXRpYyBjb25zdCBfX3U4IHZmMDI1MF9tYXRyaXhbOV0gPQogCQl7MHg3YiwgMHhlYSwgMHhlYSwgMHhlYSwgMHg3YiwgMHhlYSwgMHhlYSwgMHhlYSwgMHg3Yn07CisJc3RhdGljIGNvbnN0IF9fdTggKm1hdHJpeF90YltTRU5TT1JfTUFYXSA9IHsKKwkJTlVMTCwJCS8qIFNFTlNPUl9DUzIxMDIgMCAqLworCQlOVUxMLAkJLyogU0VOU09SX0NTMjEwMksgMSAqLworCQlnYzAzMDVfbWF0cml4LAkvKiBTRU5TT1JfR0MwMzA1IDIgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9IRENTMjAyMGIgMyAqLworCQlOVUxMLAkJLyogU0VOU09SX0hWNzEzMUIgNCAqLworCQlOVUxMLAkJLyogU0VOU09SX0hWNzEzMUMgNSAqLworCQlOVUxMLAkJLyogU0VOU09SX0lDTTEwNUEgNiAqLworCQlOVUxMLAkJLyogU0VOU09SX01DNTAxQ0IgNyAqLworCQlvdjc2MjBfbWF0cml4LAkvKiBTRU5TT1JfT1Y3NjIwIDggKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9PVjc2MzBDIDkgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9QQVMxMDYgMTAgKi8KKwkJcGFzMjAyYl9tYXRyaXgsCS8qIFNFTlNPUl9QQVMyMDJCIDExICovCisJCU5VTEwsCQkvKiBTRU5TT1JfUEIwMzMwIDEyICovCisJCXBvMjAzMF9tYXRyaXgsCS8qIFNFTlNPUl9QTzIwMzAgMTMgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9UQVM1MTMwQ0sgMTQgKi8KKwkJTlVMTCwJCS8qIFNFTlNPUl9UQVM1MTMwQ1hYIDE1ICovCisJCXZmMDI1MF9tYXRyaXgsCS8qIFNFTlNPUl9UQVM1MTMwQ19WRjAyNTAgMTYgKi8KKwl9OwogCi0Jc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfR0MwMzA1OgotCQltYXRyaXggPSBnYzAzMDVfbWF0cml4OwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9NQzUwMUNCOgotCQlyZXR1cm47CQkvKiBubyBtYXRyaXg/ICovCi0JY2FzZSBTRU5TT1JfT1Y3NjIwOgotLyoJY2FzZSBTRU5TT1JfT1Y3NjQ4OiAqLwotCQltYXRyaXggPSBvdjc2MjBfbWF0cml4OwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9QTzIwMzA6Ci0JCW1hdHJpeCA9IHBvMjAzMF9tYXRyaXg7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1RBUzUxMzBDX1ZGMDI1MDoKLQkJbWF0cml4ID0gdmYwMjUwX21hdHJpeDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoJCS8qIG1hdHJpeCBhbHJlYWR5IGxvYWRlZCAqLwotCQlyZXR1cm47Ci0JfQorCW1hdHJpeCA9IG1hdHJpeF90YltzZC0+c2Vuc29yXTsKKwlpZiAobWF0cml4ID09IE5VTEwpCisJCXJldHVybjsJCS8qIG1hdHJpeCBhbHJlYWR5IGxvYWRlZCAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92NzYyMF9tYXRyaXgpOyBpKyspCiAJCXJlZ193KGdzcGNhX2Rldi0+ZGV2LCBtYXRyaXhbaV0sIDB4MDEwYSArIGkpOwogfQpAQCAtNjU4NSw0MiArNjU5NSw0MiBAQAogCQl7Z2MwMzA1X05vRmxpa2VyLCBnYzAzMDVfTm9GbGlrZXIsCiAJCSBnYzAzMDVfNTBIWiwgZ2MwMzA1XzUwSFosCiAJCSBnYzAzMDVfNjBIWiwgZ2MwMzA1XzYwSFp9LAotLyogU0VOU09SX0hEQ1MyMDIwIDMgKi8KLQkJe05VTEwsIE5VTEwsCi0JCSBOVUxMLCBOVUxMLAotCQkgTlVMTCwgTlVMTH0sCi0vKiBTRU5TT1JfSERDUzIwMjBiIDQgKi8KKy8qIFNFTlNPUl9IRENTMjAyMGIgMyAqLwogCQl7aGRjczIwMjBiX05vRmxpa2VyLCBoZGNzMjAyMGJfTm9GbGlrZXIsCiAJCSBoZGNzMjAyMGJfNTBIWiwgaGRjczIwMjBiXzUwSFosCiAJCSBoZGNzMjAyMGJfNjBIWiwgaGRjczIwMjBiXzYwSFp9LAotLyogU0VOU09SX0hWNzEzMUIgNSAqLworLyogU0VOU09SX0hWNzEzMUIgNCAqLworCQl7aHY3MTMxYl9Ob0ZsaWtlclNjYWxlLCBodjcxMzFiX05vRmxpa2VyLAorCQkgaHY3MTMxYl81MEhaU2NhbGUsIGh2NzEzMWJfNTBIWiwKKwkJIGh2NzEzMWJfNjBIWlNjYWxlLCBodjcxMzFiXzYwSFp9LAorLyogU0VOU09SX0hWNzEzMUMgNSAqLwogCQl7TlVMTCwgTlVMTCwKIAkJIE5VTEwsIE5VTEwsCiAJCSBOVUxMLCBOVUxMfSwKLS8qIFNFTlNPUl9IVjcxMzFDIDYgKi8KLQkJe05VTEwsIE5VTEwsCi0JCSBOVUxMLCBOVUxMLAotCQkgTlVMTCwgTlVMTH0sCi0vKiBTRU5TT1JfSUNNMTA1QSA3ICovCisvKiBTRU5TT1JfSUNNMTA1QSA2ICovCiAJCXtpY20xMDVhX05vRmxpa2VyLCBpY20xMDVhX05vRmxpa2VyU2NhbGUsCiAJCSBpY20xMDVhXzUwSFosIGljbTEwNWFfNTBIWlNjYWxlLAogCQkgaWNtMTA1YV82MEhaLCBpY20xMDVhXzYwSFpTY2FsZX0sCi0vKiBTRU5TT1JfTUM1MDFDQiA4ICovCisvKiBTRU5TT1JfTUM1MDFDQiA3ICovCiAJCXtNQzUwMUNCX05vRmxpa2VyLCBNQzUwMUNCX05vRmxpa2VyU2NhbGUsCiAJCSBNQzUwMUNCXzUwSFosIE1DNTAxQ0JfNTBIWlNjYWxlLAogCQkgTUM1MDFDQl82MEhaLCBNQzUwMUNCXzYwSFpTY2FsZX0sCi0vKiBTRU5TT1JfT1Y3NjIwIDkgKi8KKy8qIFNFTlNPUl9PVjc2MjAgOCAqLwogCQl7T1Y3NjIwX05vRmxpa2VyLCBPVjc2MjBfTm9GbGlrZXIsCiAJCSBPVjc2MjBfNTBIWiwgT1Y3NjIwXzUwSFosCiAJCSBPVjc2MjBfNjBIWiwgT1Y3NjIwXzYwSFp9LAotLyogU0VOU09SX09WNzYzMEMgMTAgKi8KKy8qIFNFTlNPUl9PVjc2MzBDIDkgKi8KIAkJe05VTEwsIE5VTEwsCiAJCSBOVUxMLCBOVUxMLAogCQkgTlVMTCwgTlVMTH0sCi0vKiBTRU5TT1JfUEFTMTA2IDExICovCisvKiBTRU5TT1JfUEFTMTA2IDEwICovCiAJCXtwYXMxMDZiX05vRmxpa2VyLCBwYXMxMDZiX05vRmxpa2VyLAogCQkgcGFzMTA2Yl81MEhaLCBwYXMxMDZiXzUwSFosCiAJCSBwYXMxMDZiXzYwSFosIHBhczEwNmJfNjBIWn0sCisvKiBTRU5TT1JfUEFTMjAyQiAxMSAqLworCQl7cGFzMjAyYl9Ob0ZsaWtlclNjYWxlLCBwYXMyMDJiX05vRmxpa2VyLAorCQkgcGFzMjAyYl81MEhaU2NhbGUsIHBhczIwMmJfNTBIWiwKKwkJIHBhczIwMmJfNjBIWlNjYWxlLCBwYXMyMDJiXzYwSFp9LAogLyogU0VOU09SX1BCMDMzMCAxMiAqLwogCQl7cGIwMzMwX05vRmxpa2VyLCBwYjAzMzBfTm9GbGlrZXJTY2FsZSwKIAkJIHBiMDMzMF81MEhaLCBwYjAzMzBfNTBIWlNjYWxlLApAQCAtNzAwMiwxNSArNzAxMiwxNSBAQAogCQk1LAkvKiBTRU5TT1JfQ1MyMTAyIDAgKi8KIAkJNSwJLyogU0VOU09SX0NTMjEwMksgMSAqLwogCQk0LAkvKiBTRU5TT1JfR0MwMzA1IDIgKi8KLQkJNCwJLyogU0VOU09SX0hEQ1MyMDIwIDMgKi8KLQkJNCwJLyogU0VOU09SX0hEQ1MyMDIwYiA0ICovCi0JCTQsCS8qIFNFTlNPUl9IVjcxMzFCIDUgKi8KLQkJNCwJLyogU0VOU09SX0hWNzEzMUMgNiAqLwotCQk0LAkvKiBTRU5TT1JfSUNNMTA1QSA3ICovCi0JCTQsCS8qIFNFTlNPUl9NQzUwMUNCIDggKi8KLQkJMywJLyogU0VOU09SX09WNzYyMCA5ICovCi0JCTQsCS8qIFNFTlNPUl9PVjc2MzBDIDEwICovCi0JCTQsCS8qIFNFTlNPUl9QQVMxMDYgMTEgKi8KKwkJNCwJLyogU0VOU09SX0hEQ1MyMDIwYiAzICovCisJCTQsCS8qIFNFTlNPUl9IVjcxMzFCIDQgKi8KKwkJNCwJLyogU0VOU09SX0hWNzEzMUMgNSAqLworCQk0LAkvKiBTRU5TT1JfSUNNMTA1QSA2ICovCisJCTQsCS8qIFNFTlNPUl9NQzUwMUNCIDcgKi8KKwkJMywJLyogU0VOU09SX09WNzYyMCA4ICovCisJCTQsCS8qIFNFTlNPUl9PVjc2MzBDIDkgKi8KKwkJNCwJLyogU0VOU09SX1BBUzEwNiAxMCAqLworCQk0LAkvKiBTRU5TT1JfUEFTMjAyQiAxMSAqLwogCQk0LAkvKiBTRU5TT1JfUEIwMzMwIDEyICovCiAJCTQsCS8qIFNFTlNPUl9QTzIwMzAgMTMgKi8KIAkJNCwJLyogU0VOU09SX1RBUzUxMzBDSyAxNCAqLwpAQCAtNzA2Niw4ICs3MDc2LDggQEAKIAkJCXNkLT5zZW5zb3IgPSBTRU5TT1JfSUNNMTA1QTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MGU6Ci0JCQlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIEhEQ1MyMDIwIik7Ci0JCQlzZC0+c2Vuc29yID0gU0VOU09SX0hEQ1MyMDIwOworCQkJUERFQlVHKERfUFJPQkUsICJGaW5kIFNlbnNvciBQQVMyMDJCIik7CisJCQlzZC0+c2Vuc29yID0gU0VOU09SX1BBUzIwMkI7CiAJCQlzZC0+c2hhcnBuZXNzID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MGY6CkBAIC03MTUzLDcgKzcxNjMsNiBAQAogCXNkLT5nYW1tYSA9IGdhbW1hWyhpbnQpIHNkLT5zZW5zb3JdOwogCXNkLT5hdXRvZ2FpbiA9IHNkX2N0cmxzW1NEX0FVVE9HQUlOXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwogCXNkLT5saWdodGZyZXEgPSBzZF9jdHJsc1tTRF9GUkVRXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwotCXNkLT5zaGFycG5lc3MgPSBzZF9jdHJsc1tTRF9TSEFSUE5FU1NdLnFjdHJsLmRlZmF1bHRfdmFsdWU7CiAKIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKIAljYXNlIFNFTlNPUl9HQzAzMDU6CkBAIC03MTYxLDcgKzcxNzAsNiBAQAogCWNhc2UgU0VOU09SX1BPMjAzMDoKIAkJZ3NwY2FfZGV2LT5jdHJsX2RpcyA9ICgxIDw8IEJSSUdIVE5FU1NfSURYKTsKIAkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfSERDUzIwMjA6CiAJY2FzZSBTRU5TT1JfSFY3MTMxQjoKIAljYXNlIFNFTlNPUl9IVjcxMzFDOgogCWNhc2UgU0VOU09SX09WNzYzMEM6CkBAIC03MTkxLDE1ICs3MTk5LDE1IEBACiAJCXtjczIxMDJfSW5pdGlhbFNjYWxlLCBjczIxMDJfSW5pdGlhbH0sCQkvKiAwICovCiAJCXtjczIxMDJLX0luaXRpYWxTY2FsZSwgY3MyMTAyS19Jbml0aWFsfSwJLyogMSAqLwogCQl7Z2MwMzA1X0luaXRpYWwsIGdjMDMwNV9Jbml0aWFsU2NhbGV9LAkJLyogMiAqLwotCQl7aGRjczIwMjB4eF9Jbml0aWFsU2NhbGUsIGhkY3MyMDIweHhfSW5pdGlhbH0sCS8qIDMgKi8KLQkJe2hkY3MyMDIweGJfSW5pdGlhbFNjYWxlLCBoZGNzMjAyMHhiX0luaXRpYWx9LAkvKiA0ICovCi0JCXtodjcxMzFieHhfSW5pdGlhbFNjYWxlLCBodjcxMzFieHhfSW5pdGlhbH0sCS8qIDUgKi8KLQkJe2h2NzEzMWN4eF9Jbml0aWFsU2NhbGUsIGh2NzEzMWN4eF9Jbml0aWFsfSwJLyogNiAqLwotCQl7aWNtMTA1YXh4X0luaXRpYWxTY2FsZSwgaWNtMTA1YXh4X0luaXRpYWx9LAkvKiA3ICovCi0JCXtNQzUwMUNCX0luaXRpYWxTY2FsZSwgTUM1MDFDQl9Jbml0aWFsfSwJLyogOSAqLwotCQl7T1Y3NjIwX21vZGUwLCBPVjc2MjBfbW9kZTF9LAkJCS8qIDkgKi8KLQkJe292NzYzMGNfSW5pdGlhbFNjYWxlLCBvdjc2MzBjX0luaXRpYWx9LAkvKiAxMCAqLwotCQl7cGFzMTA2Yl9Jbml0aWFsU2NhbGUsIHBhczEwNmJfSW5pdGlhbH0sCS8qIDExICovCisJCXtoZGNzMjAyMHhiX0luaXRpYWxTY2FsZSwgaGRjczIwMjB4Yl9Jbml0aWFsfSwJLyogMyAqLworCQl7aHY3MTMxYnh4X0luaXRpYWxTY2FsZSwgaHY3MTMxYnh4X0luaXRpYWx9LAkvKiA0ICovCisJCXtodjcxMzFjeHhfSW5pdGlhbFNjYWxlLCBodjcxMzFjeHhfSW5pdGlhbH0sCS8qIDUgKi8KKwkJe2ljbTEwNWF4eF9Jbml0aWFsU2NhbGUsIGljbTEwNWF4eF9Jbml0aWFsfSwJLyogNiAqLworCQl7TUM1MDFDQl9Jbml0aWFsU2NhbGUsIE1DNTAxQ0JfSW5pdGlhbH0sCS8qIDcgKi8KKwkJe09WNzYyMF9tb2RlMCwgT1Y3NjIwX21vZGUxfSwJCQkvKiA4ICovCisJCXtvdjc2MzBjX0luaXRpYWxTY2FsZSwgb3Y3NjMwY19Jbml0aWFsfSwJLyogOSAqLworCQl7cGFzMTA2Yl9Jbml0aWFsU2NhbGUsIHBhczEwNmJfSW5pdGlhbH0sCS8qIDEwICovCisJCXtwYXMyMDJiX0luaXRpYWwsIHBhczIwMmJfSW5pdGlhbFNjYWxlfSwJLyogMTEgKi8KIAkJe3BiMDMzMHh4X0luaXRpYWxTY2FsZSwgcGIwMzMweHhfSW5pdGlhbH0sCS8qIDEyICovCiAvKiBvcgkJe3BiMDMzMDN4X0luaXRpYWxTY2FsZSwgcGIwMzMwM3hfSW5pdGlhbH0sICovCiAJCXtQTzIwMzBfbW9kZTAsIFBPMjAzMF9tb2RlMX0sCQkJLyogMTMgKi8KQEAgLTcyNTYsNiArNzI2NCw3IEBACiAJCXJlZ19yKGdzcGNhX2RldiwgMHgwMDA4KTsKIAkJcmVnX3coZGV2LCAweDAwLCAweDAwMDgpOwogCQlicmVhazsKKwljYXNlIFNFTlNPUl9QQVMyMDJCOgogCWNhc2UgU0VOU09SX0dDMDMwNToKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDAwMDgpOwogCQkvKiBmYWxsIHRocnUgKi8KQEAgLTcyNjksNyArNzI3OCw2IEBACiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfQ1MyMTAyOgkJLyogZ2FtbWEgc2V0IGluIHh4eF9Jbml0aWFsICovCiAJY2FzZSBTRU5TT1JfQ1MyMTAySzoKLQljYXNlIFNFTlNPUl9IRENTMjAyMDoKIAljYXNlIFNFTlNPUl9IRENTMjAyMGI6CiAJY2FzZSBTRU5TT1JfUEIwMzMwOgkJLyogcGIgd2l0aCBjaGlwX3JldmlzaW9uIC0gc2VlIGFib3ZlICovCiAJY2FzZSBTRU5TT1JfT1Y3NjMwQzoKQEAgLTcyODIsNiArNzI5MCw3IEBACiAJc2V0bWF0cml4KGdzcGNhX2Rldik7CQkJLyogb25lIG1vcmUgdGltZT8gKi8KIAlzd2l0Y2ggKHNkLT5zZW5zb3IpIHsKIAljYXNlIFNFTlNPUl9PVjc2MjA6CisJY2FzZSBTRU5TT1JfUEFTMjAyQjoKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDAxODApOwkvKiBmcm9tIHdpbiAqLwogCQlyZWdfdyhkZXYsIDB4MDAsIDB4MDE4MCk7CiAJCWJyZWFrOwpAQCAtNzI5MywzNyArNzMwMiwyOSBAQAogCiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfR0MwMzA1OgotCWNhc2UgU0VOU09SX09WNzYyMDoKIAkJcmVnX3coZGV2LCAweDA5LCAweDAxYWQpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLwogCQlyZWdfdyhkZXYsIDB4MTUsIDB4MDFhZSk7Ci0JCXNkLT5hdXRvZ2FpbiA9IDA7Ci0JCWJyZWFrOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIFNFTlNPUl9QQVMyMDJCOgogCWNhc2UgU0VOU09SX1BPMjAzMDoKLQkJcmVnX3coZGV2LCAweDQwLCAweDAxMTcpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLworLyoJCXJlZ193KGRldiwgMHg0MCwgWkMzWFhfUjExN19HR0FJTik7ICAqIChmcm9tIHdpbiB0cmFjZXMpICovCisJCXJlZ19yKGdzcGNhX2RldiwgMHgwMTgwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5TT1JfT1Y3NjIwOgorCQlyZWdfdyhkZXYsIDB4MDksIDB4MDFhZCk7CisJCXJlZ193KGRldiwgMHgxNSwgMHgwMWFlKTsKKwkJaTJjX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJLypmaXhtZTogcmV0dXJucyAweGEzICovCisJCWkyY193cml0ZShnc3BjYV9kZXYsIDB4MTMsIDB4YTMsIDB4MDApOworCQkJCQkgLypmaXhtZTogcmV0dXJuZWQgdmFsdWUgdG8gc2VuZD8gKi8KKwkJcmVnX3coZGV2LCAweDQwLCAweDAxMTcpOwogCQlyZWdfcihnc3BjYV9kZXYsIDB4MDE4MCk7CiAJCWJyZWFrOwogCX0KIAogCXNldGF1dG9nYWluKGdzcGNhX2Rldik7CiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7Ci0JY2FzZSBTRU5TT1JfR0MwMzA1OgotLyoJCXNldGxpZ2h0ZnJlcShnc3BjYV9kZXYpOwk/PyAoZW5kOiA4MCAtPiBbMThkXSkgKi8KLQkJcmVnX3coZGV2LCAweDA5LCAweDAxYWQpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLwotCQlyZWdfdyhkZXYsIDB4MTUsIDB4MDFhZSk7Ci0JCXJlZ193KGRldiwgMHg0MCwgMHgwMTgwKTsKLQkJcmVnX3coZGV2LCAweDQwLCAweDAxMTcpOwotCQlyZWdfcihnc3BjYV9kZXYsIDB4MDE4MCk7Ci0JCXNkLT5hdXRvZ2FpbiA9IDE7Ci0JCXNldGF1dG9nYWluKGdzcGNhX2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX09WNzYyMDoKLQkJaTJjX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJLypmaXhtZTogcmV0dXJucyAweGEzICovCi0JCWkyY193cml0ZShnc3BjYV9kZXYsIDB4MTMsIDB4YTMsIDB4MDApOwotCQkJCQkgLypmaXhtZTogcmV0dXJuZWQgdmFsdWUgdG8gc2VuZD8gKi8KLQkJcmVnX3coZGV2LCAweDQwLCAweDAxMTcpOwkvKiAoZnJvbSB3aW4gdHJhY2VzKSAqLwotCQlyZWdfcihnc3BjYV9kZXYsIDB4MDE4MCk7Ci0JCXNldGF1dG9nYWluKGdzcGNhX2Rldik7Ci0JCW1zbGVlcCg1MDApOworCWNhc2UgU0VOU09SX1BBUzIwMkI6CisJCXJlZ193KGRldiwgMHgwMCwgMHgwMDA3KTsJLyogKGZyb20gd2luIHRyYWNlcykgKi8KIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfUE8yMDMwOgogCQltc2xlZXAoNTAwKTsKQEAgLTczMzMsNiArNzMzNCw4IEBACiAJCXJlZ193KGRldiwgMHgwMiwgMHgwMDA4KTsKIAkJYnJlYWs7CiAJfQorCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9QQVMyMDJCKQorCQlyZWdfdyhkZXYsIDB4MDIsIFpDM1hYX1IwMDhfQ0xPQ0tTRVRUSU5HKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzUzMCw2ICs3NTMzLDcgQEAKIAl7VVNCX0RFVklDRSgweDA0NTgsIDB4NzAwYyl9LAogCXtVU0JfREVWSUNFKDB4MDQ1OCwgMHg3MDBmKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDYxLCAweDBhMDApfSwKKwl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDg5ZCksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9NQzUwMUNCfSwKIAl7VVNCX0RFVklDRSgweDA0NmQsIDB4MDhhMCl9LAogCXtVU0JfREVWSUNFKDB4MDQ2ZCwgMHgwOGExKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YTIpfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKaW5kZXggZWZlODQ5OS4uZDQ2NThjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKQEAgLTM4NSwxMCArMzg1LDEwIEBACiAJCWdvdG8gZXJyX291dF9kZXRhY2g7CiAJfQogCi0JLyogUGh5cyBhZGRyIGNhbiBvbmx5IGJlIHNldCBhZnRlciBhdHRhY2hpbmcgKGZvciBpci0+Yy5kZXYuYnVzX2lkKSAqLworCS8qIFBoeXMgYWRkciBjYW4gb25seSBiZSBzZXQgYWZ0ZXIgYXR0YWNoaW5nIChmb3IgaXItPmMuZGV2KSAqLwogCXNucHJpbnRmKGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpLCAiJXMvJXMvaXIwIiwKLQkJIGlyLT5jLmFkYXB0ZXItPmRldi5idXNfaWQsCi0JCSBpci0+Yy5kZXYuYnVzX2lkKTsKKwkJIGRldl9uYW1lKCZpci0+Yy5hZGFwdGVyLT5kZXYpLAorCQkgZGV2X25hbWUoJmlyLT5jLmRldikpOwogCiAJLyogaW5pdCArIHJlZ2lzdGVyIGlucHV0IGRldmljZSAqLwogCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlLCBpci0+aXJfY29kZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmMKaW5kZXggNGUwNWY5MS4uMjg4M2M4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5jCkBAIC04NzcsMjAgKzg3NywyOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX3BnNjAwdjIgPSB7CiAJLnR5cGUgPSBJVlRWX0NBUkRfUEc2MDBWMiwKIAkubmFtZSA9ICJZdWFuIFBHNjAwLTIsIEdvdFZpZXcgUENJIERWRCBMaXRlIiwKLQkuY29tbWVudCA9ICJvbmx5IENvbXBvc2l0ZSBhbmQgUy1WaWRlbyBpbnB1dHMgYXJlIHN1cHBvcnRlZCwgbm90IHRoZSB0dW5lclxuIiwKIAkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAogCS5od192aWRlbyA9IElWVFZfSFdfQ1gyNTg0MCwKIAkuaHdfYXVkaW8gPSBJVlRWX0hXX0NYMjU4NDAsCiAJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0NYMjU4NDAsCi0JLmh3X2FsbCA9IElWVFZfSFdfQ1gyNTg0MCwKKwkuaHdfYWxsID0gSVZUVl9IV19DWDI1ODQwIHwgSVZUVl9IV19UVU5FUiwKKwkvKiBYQzIwMjggc3VwcG9ydCBhcHBhcmVudGx5IHdvcmtzIGZvciB0aGUgWXVhbiwgaXQncyBzdGlsbAorCSAgIHVuY2VydGFpbiB3aGV0aGVyIGl0IGFsc28gd29ya3Mgd2l0aCB0aGUgR290Vmlldy4gKi8KIAkudmlkZW9faW5wdXRzID0gewotCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAwLAorCQl7IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBDWDI1ODQwX0NPTVBPU0lURTIgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwKIAkJICBDWDI1ODQwX1NWSURFT19MVU1BMyB8IENYMjU4NDBfU1ZJREVPX0NIUk9NQTQgfSwKLQkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMCwgQ1gyNTg0MF9DT01QT1NJVEUxIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIENYMjU4NDBfQ09NUE9TSVRFMSB9LAogCX0sCiAJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgQ1gyNTg0MF9BVURJTzUgICAgICAgfSwKIAkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjEsICAgQ1gyNTg0MF9BVURJT19TRVJJQUwgfSwKIAl9LAorCS5yYWRpb19pbnB1dCA9IHsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgQ1gyNTg0MF9BVURJTzUgfSwKKwkueGNlaXZlX3BpbiA9IDEyLAorCS50dW5lcnMgPSB7CisJCXsgLnN0ZCA9IFY0TDJfU1REX0FMTCwgLnR1bmVyID0gVFVORVJfWEMyMDI4IH0sCisJfSwKIAkucGNpX2xpc3QgPSBpdnR2X3BjaV9wZzYwMHYyLAogCS5pMmMgPSAmaXZ0dl9pMmNfc3RkLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jb250cm9scy5jCmluZGV4IDQ4ZTEwM2IuLjYyYWEwNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY29udHJvbHMuYwpAQCAtNjMsNyArNjMsNyBAQAogCWNhc2UgVjRMMl9DSURfSFVFOgogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQlpZiAoaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19RVUVSWUNUUkwsIHFjdHJsKSkKKwkJaWYgKHY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgY29yZSwgcXVlcnljdHJsLCBxY3RybCkpCiAJCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQ7CiAJCXJldHVybiAwOwogCkBAIC03Myw3ICs3Myw3IEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6Ci0JCWlmIChpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW9fY3RybCwgVklESU9DX1FVRVJZQ1RSTCwgcWN0cmwpKQorCQlpZiAodjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX2F1ZGlvLCBjb3JlLCBxdWVyeWN0cmwsIHFjdHJsKSkKIAkJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRDsKIAkJcmV0dXJuIDA7CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCWNhc2UgVjRMMl9DSURfSFVFOgogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQlyZXR1cm4gaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0NUUkwsIHZjdHJsKTsKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgY29yZSwgc19jdHJsLCB2Y3RybCk7CiAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0xMzAsNyArMTMwLDcgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKLQkJcmV0dXJuIGl2dHZfaTJjX2h3KGl0diwgaXR2LT5jYXJkLT5od19hdWRpb19jdHJsLCBWSURJT0NfU19DVFJMLCB2Y3RybCk7CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfYXVkaW8sIGNvcmUsIHNfY3RybCwgdmN0cmwpOwogCiAJZGVmYXVsdDoKIAkJSVZUVl9ERUJVR19JT0NUTCgiaW52YWxpZCBjb250cm9sIDB4JXhcbiIsIHZjdHJsLT5pZCk7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAljYXNlIFY0TDJfQ0lEX0hVRToKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJcmV0dXJuIGl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfR19DVFJMLCB2Y3RybCk7CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfdmlkZW8sIGNvcmUsIGdfY3RybCwgdmN0cmwpOwogCiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMTU1LDcgKzE1NSw3IEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6Ci0JCXJldHVybiBpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW9fY3RybCwgVklESU9DX0dfQ1RSTCwgdmN0cmwpOworCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX2F1ZGlvLCBjb3JlLCBnX2N0cmwsIHZjdHJsKTsKIAlkZWZhdWx0OgogCQlJVlRWX0RFQlVHX0lPQ1RMKCJpbnZhbGlkIGNvbnRyb2wgMHgleFxuIiwgdmN0cmwtPmlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAkJCWZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCQkJZm10LmZtdC5waXgud2lkdGggPSBpdHYtPnBhcmFtcy53aWR0aCAvIChpc19tcGVnMSA/IDIgOiAxKTsKIAkJCWZtdC5mbXQucGl4LmhlaWdodCA9IGl0di0+cGFyYW1zLmhlaWdodDsKLQkJCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfU19GTVQsICZmbXQpOworCQkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19mbXQsICZmbXQpOwogCQl9CiAJCWVyciA9IGN4MjM0MXhfdXBkYXRlKGl0diwgaXZ0dl9hcGlfZnVuYywgJml0di0+cGFyYW1zLCAmcCk7CiAJCWlmICghZXJyICYmIGl0di0+cGFyYW1zLnN0cmVhbV92YmlfZm10ICE9IHAuc3RyZWFtX3ZiaV9mbXQpCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJLyogVGhlIGF1ZGlvIGNsb2NrIG9mIHRoZSBkaWdpdGl6ZXIgbXVzdCBtYXRjaCB0aGUgY29kZWMgc2FtcGxlCiAJCSAgIHJhdGUgb3RoZXJ3aXNlIHlvdSBnZXQgc29tZSB2ZXJ5IHN0cmFuZ2UgZWZmZWN0cy4gKi8KIAkJaWYgKGlkeCA8IHNpemVvZihmcmVxcykpCi0JCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEsICZmcmVxc1tpZHhdKTsKKwkJCWl2dHZfY2FsbF9hbGwoaXR2LCBhdWRpbywgc19jbG9ja19mcmVxLCBmcmVxc1tpZHhdKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCmluZGV4IGI2OWNjMWQuLjA4Yjc2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCkBAIC02MCw5ICs2MCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAKLS8qIHZhciB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgaW4gdXNlICovCi1pbnQgaXZ0dl9jYXJkc19hY3RpdmU7Ci0KIC8qIElmIHlvdSBoYXZlIGFscmVhZHkgWCB2NGwgY2FyZHMsIHRoZW4gc2V0IHRoaXMgdG8gWC4gVGhpcyB3YXkKICAgIHRoZSBkZXZpY2UgbnVtYmVycyBzdGF5IG1hdGNoZWQuIEV4YW1wbGU6IHlvdSBoYXZlIGEgV2luVFYgY2FyZAogICAgd2l0aG91dCByYWRpbyBhbmQgYSBQVlItMzUwIHdpdGguIE5vcm1hbGx5IHRoaXMgd291bGQgZ2l2ZSBhCkBAIC03MCwxMiArNjcsNiBAQAogICAgc2V0dGluZyB0aGlzIHRvIDEgeW91IGVuc3VyZSB0aGF0IHJhZGlvMCBpcyBub3cgYWxzbyByYWRpbzEuICovCiBpbnQgaXZ0dl9maXJzdF9taW5vcjsKIAotLyogTWFzdGVyIHZhcmlhYmxlIGZvciBhbGwgaXZ0diBpbmZvICovCi1zdHJ1Y3QgaXZ0diAqaXZ0dl9jYXJkc1tJVlRWX01BWF9DQVJEU107Ci0KLS8qIFByb3RlY3RzIGl2dHZfY2FyZHNfYWN0aXZlICovCi1ERUZJTkVfU1BJTkxPQ0soaXZ0dl9jYXJkc19sb2NrKTsKLQogLyogYWRkIHlvdXIgcmV2aXNpb24gYW5kIHdoYXRub3QgaGVyZSAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl2dHZfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJe1BDSV9WRU5ET1JfSURfSUNPTVAsIFBDSV9ERVZJQ0VfSURfSVZUVjE1LApAQCAtODcsNiArNzgsOSBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxpdnR2X3BjaV90YmwpOwogCisvKiBpdnR2IGluc3RhbmNlIGNvdW50ZXIgKi8KK3N0YXRpYyBhdG9taWNfdCBpdnR2X2luc3RhbmNlID0gQVRPTUlDX0lOSVQoMCk7CisKIC8qIFBhcmFtZXRlciBkZWNsYXJhdGlvbnMgKi8KIHN0YXRpYyBpbnQgY2FyZHR5cGVbSVZUVl9NQVhfQ0FSRFNdOwogc3RhdGljIGludCB0dW5lcltJVlRWX01BWF9DQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKQEAgLTU5OSw5ICs1OTMsOSBAQAogCWl0di0+b3B0aW9ucy5raWxvYnl0ZXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHXSA9IGRlY19tcGdfYnVmZmVycyAqIDEwMjQ7CiAJaXR2LT5vcHRpb25zLmtpbG9ieXRlc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVZdID0gZGVjX3l1dl9idWZmZXJzICogMTAyNDsKIAlpdHYtPm9wdGlvbnMua2lsb2J5dGVzW0lWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSV0gPSBkZWNfdmJpX2J1ZmZlcnM7Ci0JaXR2LT5vcHRpb25zLmNhcmR0eXBlID0gY2FyZHR5cGVbaXR2LT5udW1dOwotCWl0di0+b3B0aW9ucy50dW5lciA9IHR1bmVyW2l0di0+bnVtXTsKLQlpdHYtPm9wdGlvbnMucmFkaW8gPSByYWRpb1tpdHYtPm51bV07CisJaXR2LT5vcHRpb25zLmNhcmR0eXBlID0gY2FyZHR5cGVbaXR2LT5pbnN0YW5jZV07CisJaXR2LT5vcHRpb25zLnR1bmVyID0gdHVuZXJbaXR2LT5pbnN0YW5jZV07CisJaXR2LT5vcHRpb25zLnJhZGlvID0gcmFkaW9baXR2LT5pbnN0YW5jZV07CiAJaXR2LT5vcHRpb25zLm5ld2kyYyA9IG5ld2kyYzsKIAlpZiAodHVuZXJ0eXBlIDwgLTEgfHwgdHVuZXJ0eXBlID4gMSkgewogCQlJVlRWX1dBUk4oIkludmFsaWQgdHVuZXJ0eXBlIGFyZ3VtZW50LCB3aWxsIGF1dG9kZXRlY3QgaW5zdGVhZFxuIik7CkBAIC02ODgsNyArNjgyLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmaXR2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaXR2LT5kbWFfcmVnX2xvY2spOwogCi0JaXR2LT5pcnFfd29ya19xdWV1ZXMgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpdHYtPm5hbWUpOworCWl0di0+aXJxX3dvcmtfcXVldWVzID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoaXR2LT5kZXZpY2UubmFtZSk7CiAJaWYgKGl0di0+aXJxX3dvcmtfcXVldWVzID09IE5VTEwpIHsKIAkJSVZUVl9FUlIoIkNvdWxkIG5vdCBjcmVhdGUgaXZ0diB3b3JrcXVldWVcbiIpOwogCQlyZXR1cm4gLTE7CkBAIC03NzAsMTIgKzc2NCw2IEBACiAJCWkgPSAwOwogCWl0di0+YWN0aXZlX2lucHV0ID0gaTsKIAlpdHYtPmF1ZGlvX2lucHV0ID0gaXR2LT5jYXJkLT52aWRlb19pbnB1dHNbaV0uYXVkaW9faW5kZXg7Ci0JaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19DWDI1ODQwKQotCQlpdHYtPnZpZGVvX2RlY19mdW5jID0gaXZ0dl9jeDI1ODQwOwotCWVsc2UgaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19TQUE3MTdYKQotCQlpdHYtPnZpZGVvX2RlY19mdW5jID0gaXZ0dl9zYWE3MTd4OwotCWVsc2UKLQkJaXR2LT52aWRlb19kZWNfZnVuYyA9IGl2dHZfc2FhNzExNTsKIH0KIAogc3RhdGljIGludCBpdnR2X3NldHVwX3BjaShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LApAQCAtNzg4LDIxICs3NzYsMjEgQEAKIAlJVlRWX0RFQlVHX0lORk8oIkVuYWJsaW5nIHBjaSBkZXZpY2VcbiIpOwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpIHsKLQkJSVZUVl9FUlIoIkNhbid0IGVuYWJsZSBkZXZpY2UgJWQhXG4iLCBpdHYtPm51bSk7CisJCUlWVFZfRVJSKCJDYW4ndCBlbmFibGUgZGV2aWNlIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIDB4ZmZmZmZmZmYpKSB7Ci0JCUlWVFZfRVJSKCJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlIG9uIGNhcmQgJWQuXG4iLCBpdHYtPm51bSk7CisJCUlWVFZfRVJSKCJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpdHYtPmJhc2VfYWRkciwgSVZUVl9FTkNPREVSX1NJWkUsICJpdnR2IGVuY29kZXIiKSkgewotCQlJVlRWX0VSUigiQ2Fubm90IHJlcXVlc3QgZW5jb2RlciBtZW1vcnkgcmVnaW9uIG9uIGNhcmQgJWQuXG4iLCBpdHYtPm51bSk7CisJCUlWVFZfRVJSKCJDYW5ub3QgcmVxdWVzdCBlbmNvZGVyIG1lbW9yeSByZWdpb24uXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX1JFR19PRkZTRVQsCiAJCQkJSVZUVl9SRUdfU0laRSwgIml2dHYgcmVnaXN0ZXJzIikpIHsKLQkJSVZUVl9FUlIoIkNhbm5vdCByZXF1ZXN0IHJlZ2lzdGVyIG1lbW9yeSByZWdpb24gb24gY2FyZCAlZC5cbiIsIGl0di0+bnVtKTsKKwkJSVZUVl9FUlIoIkNhbm5vdCByZXF1ZXN0IHJlZ2lzdGVyIG1lbW9yeSByZWdpb24uXG4iKTsKIAkJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyLCBJVlRWX0VOQ09ERVJfU0laRSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTgxMCw3ICs3OTgsNyBAQAogCWlmIChpdHYtPmhhc19jeDIzNDE1ICYmCiAJICAgICFyZXF1ZXN0X21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX0RFQ09ERVJfT0ZGU0VULAogCQkJCUlWVFZfREVDT0RFUl9TSVpFLCAiaXZ0diBkZWNvZGVyIikpIHsKLQkJSVZUVl9FUlIoIkNhbm5vdCByZXF1ZXN0IGRlY29kZXIgbWVtb3J5IHJlZ2lvbiBvbiBjYXJkICVkLlxuIiwgaXR2LT5udW0pOworCQlJVlRWX0VSUigiQ2Fubm90IHJlcXVlc3QgZGVjb2RlciBtZW1vcnkgcmVnaW9uLlxuIik7CiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihpdHYtPmJhc2VfYWRkciwgSVZUVl9FTkNPREVSX1NJWkUpOwogCQlyZWxlYXNlX21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX1JFR19PRkZTRVQsIElWVFZfUkVHX1NJWkUpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTg1Myw2OSArODQxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB1MzIgaXZ0dl9yZXF1ZXN0X21vZHVsZShzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiBpZCkKLXsKLQlpZiAoKGh3ICYgaWQpID09IDApCi0JCXJldHVybiBodzsKLQlpZiAocmVxdWVzdF9tb2R1bGUobmFtZSkgIT0gMCkgewotCQlJVlRWX0VSUigiRmFpbGVkIHRvIGxvYWQgbW9kdWxlICVzXG4iLCBuYW1lKTsKLQkJcmV0dXJuIGh3ICYgfmlkOwotCX0KLQlJVlRWX0RFQlVHX0lORk8oIkxvYWRlZCBtb2R1bGUgJXNcbiIsIG5hbWUpOwotCXJldHVybiBodzsKLX0KLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBpdnR2X2xvYWRfYW5kX2luaXRfbW9kdWxlcyhzdHJ1Y3QgaXZ0diAqaXR2KQogewogCXUzMiBodyA9IGl0di0+Y2FyZC0+aHdfYWxsOwogCXVuc2lnbmVkIGk7CiAKLSNpZmRlZiBNT0RVTEUKLQkvKiBsb2FkIG1vZHVsZXMgKi8KLSNpZmRlZiBDT05GSUdfTUVESUFfVFVORVJfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJ0dW5lciIsIElWVFZfSFdfVFVORVIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX0NYMjU4NDBfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJjeDI1ODQwIiwgSVZUVl9IV19DWDI1ODQwKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19TQUE3MTFYX01PRFVMRQotCWh3ID0gaXZ0dl9yZXF1ZXN0X21vZHVsZShpdHYsIGh3LCAic2FhNzExNSIsIElWVFZfSFdfU0FBNzExWCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fU0FBNzEyN19NT0RVTEUKLQlodyA9IGl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCBodywgInNhYTcxMjciLCBJVlRWX0hXX1NBQTcxMjcpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX1NBQTcxN1hfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJzYWE3MTd4IiwgSVZUVl9IV19TQUE3MTdYKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19VUEQ2NDAzMUFfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJ1cGQ2NDAzMWEiLCBJVlRWX0hXX1VQRDY0MDMxQSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fVVBENjQwODNfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJ1cGQ2NDA4MyIsIElWVFZfSFdfVVBENjQwOFgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX01TUDM0MDBfTU9EVUxFCi0JaHcgPSBpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgaHcsICJtc3AzNDAwIiwgSVZUVl9IV19NU1AzNFhYKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19WUDI3U01QWF9NT0RVTEUKLQlodyA9IGl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCBodywgInZwMjdzbXB4IiwgSVZUVl9IV19WUDI3U01QWCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fV004Nzc1X01PRFVMRQotCWh3ID0gaXZ0dl9yZXF1ZXN0X21vZHVsZShpdHYsIGh3LCAid204Nzc1IiwgSVZUVl9IV19XTTg3NzUpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZJREVPX1dNODczOV9NT0RVTEUKLQlodyA9IGl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCBodywgIndtODczOSIsIElWVFZfSFdfV004NzM5KTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19DUzUzTDMyQV9NT0RVTEUKLQlodyA9IGl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCBodywgImNzNTNsMzJhIiwgSVZUVl9IV19DUzUzTDMyQSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fTTUyNzkwX01PRFVMRQotCWh3ID0gaXZ0dl9yZXF1ZXN0X21vZHVsZShpdHYsIGh3LCAibTUyNzkwIiwgSVZUVl9IV19NNTI3OTApOwotI2VuZGlmCi0jZW5kaWYKLQogCS8qIGNoZWNrIHdoaWNoIGkyYyBkZXZpY2VzIGFyZSBhY3R1YWxseSBmb3VuZCAqLwogCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CiAJCXUzMiBkZXZpY2UgPSAxIDw8IGk7CkBAIC05MjcsMTEgKzg1NywyMSBAQAogCQkJaXR2LT5od19mbGFncyB8PSBkZXZpY2U7CiAJCQljb250aW51ZTsKIAkJfQotCQlpdnR2X2kyY19yZWdpc3RlcihpdHYsIGkpOwotCQlpZiAoaXZ0dl9pMmNfaHdfYWRkcihpdHYsIGRldmljZSkgPiAwKQorCQlpZiAoaXZ0dl9pMmNfcmVnaXN0ZXIoaXR2LCBpKSA9PSAwKQogCQkJaXR2LT5od19mbGFncyB8PSBkZXZpY2U7CiAJfQogCisJaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19DWDI1ODQwKQorCQlpdHYtPnNkX3ZpZGVvID0gaXZ0dl9maW5kX2h3KGl0diwgSVZUVl9IV19DWDI1ODQwKTsKKwllbHNlIGlmIChpdHYtPmNhcmQtPmh3X2FsbCAmIElWVFZfSFdfU0FBNzE3WCkKKwkJaXR2LT5zZF92aWRlbyA9IGl2dHZfZmluZF9odyhpdHYsIElWVFZfSFdfU0FBNzE3WCk7CisJZWxzZSBpZiAoaXR2LT5jYXJkLT5od19hbGwgJiBJVlRWX0hXX1NBQTcxMTQpCisJCWl0di0+c2RfdmlkZW8gPSBpdnR2X2ZpbmRfaHcoaXR2LCBJVlRWX0hXX1NBQTcxMTQpOworCWVsc2UKKwkJaXR2LT5zZF92aWRlbyA9IGl2dHZfZmluZF9odyhpdHYsIElWVFZfSFdfU0FBNzExNSk7CisJaXR2LT5zZF9hdWRpbyA9IGl2dHZfZmluZF9odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW9fY3RybCk7CisJaXR2LT5zZF9tdXhlciA9IGl2dHZfZmluZF9odyhpdHYsIGl0di0+Y2FyZC0+aHdfbXV4ZXIpOworCiAJaHcgPSBpdHYtPmh3X2ZsYWdzOwogCiAJaWYgKGl0di0+Y2FyZC0+dHlwZSA9PSBJVlRWX0NBUkRfQ1gyMzQxNkdZQykgewpAQCAtOTQ5LDcgKzg4OSw3IEBACiAJCS8qIFRoZSBjcnlzdGFsIGZyZXF1ZW5jeSBvZiBHVk1WUFJYIGlzIDI0LjU3Nk1IeiAqLwogCQljcnlzdGFsX2ZyZXEuZnJlcSA9IFNBQTcxMTVfRlJFUV8yNF81NzZfTUhaOwogCQljcnlzdGFsX2ZyZXEuZmxhZ3MgPSBTQUE3MTE1X0ZSRVFfRkxfVUNHQzsKLQkJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEsICZjcnlzdGFsX2ZyZXEpOworCQl2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfdmlkZW8sIHZpZGVvLCBzX2NyeXN0YWxfZnJlcSwgJmNyeXN0YWxfZnJlcSk7CiAJfQogCiAJaWYgKGh3ICYgSVZUVl9IV19DWDI1ODQwKSB7CkBAIC05NjcsNyArOTA3LDcgQEAKIAkJLyogZGV0ZXJtaW5lIHRoZSBleGFjdCBzYWE3MTF4IG1vZGVsICovCiAJCWl0di0+aHdfZmxhZ3MgJj0gfklWVFZfSFdfU0FBNzExWDsKIAotCQlpdnR2X3NhYTcxMTUoaXR2LCBWSURJT0NfR19DSElQX0lERU5ULCAmdik7CisJCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzExWCwgY29yZSwgZ19jaGlwX2lkZW50LCAmdik7CiAJCWlmICh2LmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExNCkgewogCQkJaXR2LT5od19mbGFncyB8PSBJVlRWX0hXX1NBQTcxMTQ7CiAJCQkvKiBWQkkgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHNhYTcxMTQgZHJpdmVyLiAqLwpAQCAtMTAwMSwyOCArOTQxLDIwIEBACiAJaW50IHZiaV9idWZfc2l6ZTsKIAlzdHJ1Y3QgaXZ0diAqaXR2OwogCi0Jc3Bpbl9sb2NrKCZpdnR2X2NhcmRzX2xvY2spOwotCi0JLyogTWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIHBsYWNlIGZvciB0aGlzIGNhcmQgKi8KLQlpZiAoaXZ0dl9jYXJkc19hY3RpdmUgPT0gSVZUVl9NQVhfQ0FSRFMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpdnR2OiAgTWF4aW11bSBudW1iZXIgb2YgY2FyZHMgZGV0ZWN0ZWQgKCVkKVxuIiwKLQkJCSAgICAgIGl2dHZfY2FyZHNfYWN0aXZlKTsKLQkJc3Bpbl91bmxvY2soJml2dHZfY2FyZHNfbG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCWl0diA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdnR2KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGl0diA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrKCZpdnR2X2NhcmRzX2xvY2spOworCWlmIChpdHYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWl2dHZfY2FyZHNbaXZ0dl9jYXJkc19hY3RpdmVdID0gaXR2OwogCWl0di0+ZGV2ID0gZGV2OwotCWl0di0+bnVtID0gaXZ0dl9jYXJkc19hY3RpdmUrKzsKLQlzbnByaW50ZihpdHYtPm5hbWUsIHNpemVvZihpdHYtPm5hbWUpLCAiaXZ0diVkIiwgaXR2LT5udW0pOwotCUlWVFZfSU5GTygiSW5pdGlhbGl6aW5nIGNhcmQgIyVkXG4iLCBpdHYtPm51bSk7CisJaXR2LT5pbnN0YW5jZSA9IGF0b21pY19pbmNfcmV0dXJuKCZpdnR2X2luc3RhbmNlKSAtIDE7CiAKLQlzcGluX3VubG9jaygmaXZ0dl9jYXJkc19sb2NrKTsKKwlyZXR2YWwgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmZGV2LT5kZXYsICZpdHYtPmRldmljZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwkvKiAiaXZ0diArIFBDSSBJRCIgaXMgYSBiaXQgb2YgYSBtb3V0aGZ1bCwgc28gdXNlCisJICAgIml2dHYgKyBpbnN0YW5jZSIgaW5zdGVhZC4gKi8KKwlzbnByaW50ZihpdHYtPmRldmljZS5uYW1lLCBzaXplb2YoaXR2LT5kZXZpY2UubmFtZSksCisJCQkiaXZ0diVkIiwgaXR2LT5pbnN0YW5jZSk7CisJSVZUVl9JTkZPKCJJbml0aWFsaXppbmcgY2FyZCAlZFxuIiwgaXR2LT5pbnN0YW5jZSk7CiAKIAlpdnR2X3Byb2Nlc3Nfb3B0aW9ucyhpdHYpOwogCWlmIChpdHYtPm9wdGlvbnMuY2FyZHR5cGUgPT0gLTEpIHsKQEAgLTEwNDMsOCArOTc1LDYgQEAKIAkJZWxzZSBpZiAocmV0dmFsID09IC1FTlhJTykKIAkJCWdvdG8gZnJlZV9tZW07CiAJfQotCS8qIHNhdmUgaXR2IGluIHRoZSBwY2kgc3RydWN0IGZvciBsYXRlciB1c2UgKi8KLQlwY2lfc2V0X2RydmRhdGEoZGV2LCBpdHYpOwogCiAJLyogbWFwIGlvIG1lbW9yeSAqLwogCUlWVFZfREVCVUdfSU5GTygiYXR0ZW1wdGluZyBpb3JlbWFwIGF0IDB4JTA4eCBsZW4gMHglMDh4XG4iLApAQCAtMTA4Niw3ICsxMDE2LDkgQEAKIAkJZ290byBmcmVlX2lvOwogCX0KIAotCWl2dHZfZ3Bpb19pbml0KGl0dik7CisJcmV0dmFsID0gaXZ0dl9ncGlvX2luaXQoaXR2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZyZWVfaW87CiAKIAkvKiBhY3RpdmUgaTJjICAqLwogCUlWVFZfREVCVUdfSU5GTygiYWN0aXZhdGluZyBpMmMuLi5cbiIpOwpAQCAtMTA5NSw4ICsxMDI3LDYgQEAKIAkJZ290byBmcmVlX2lvOwogCX0KIAotCUlWVFZfREVCVUdfSU5GTygiQWN0aXZlIGNhcmQgY291bnQ6ICVkLlxuIiwgaXZ0dl9jYXJkc19hY3RpdmUpOwotCiAJaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19UVkVFUFJPTSkgewogCQkvKiBCYXNlZCBvbiB0aGUgbW9kZWwgbnVtYmVyIHRoZSBjYXJkdHlwZSBtYXkgYmUgY2hhbmdlZC4KIAkJICAgVGhlIFBDSSBJRHMgYXJlIG5vdCBhbHdheXMgcmVsaWFibGUuICovCkBAIC0xMTkxLDcgKzExMjEsNyBAQAogCQlzZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsgIC8qIG1hdGNoZXMgVFYgdHVuZXJzICovCiAJCXNldHVwLnR1bmVyX2NhbGxiYWNrID0gKHNldHVwLnR5cGUgPT0gVFVORVJfWEMyMDI4KSA/CiAJCQlpdnR2X3Jlc2V0X3R1bmVyX2dwaW8gOiBOVUxMOwotCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmc2V0dXApOworCQlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIHNfdHlwZV9hZGRyLCAmc2V0dXApOwogCQlpZiAoc2V0dXAudHlwZSA9PSBUVU5FUl9YQzIwMjgpIHsKIAkJCXN0YXRpYyBzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RybCA9IHsKIAkJCQkuZm5hbWUgPSBYQzIwMjhfREVGQVVMVF9GSVJNV0FSRSwKQEAgLTEyMDEsNyArMTEzMSw3IEBACiAJCQkJLnR1bmVyID0gaXR2LT5vcHRpb25zLnR1bmVyLAogCQkJCS5wcml2ID0gJmN0cmwsCiAJCQl9OwotCQkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVFVORVJfU0VUX0NPTkZJRywgJmNmZyk7CisJCQlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIHNfY29uZmlnLCAmY2ZnKTsKIAkJfQogCX0KIApAQCAtMTIxMCwxMSArMTE0MCwxMSBAQAogCWl0di0+dHVuZXJfc3RkID0gaXR2LT5zdGQ7CiAKIAlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkgewotCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfSU5UX1NfU1REX09VVFBVVCwgJml0di0+c3RkKTsKKwkJaXZ0dl9jYWxsX2FsbChpdHYsIHZpZGVvLCBzX3N0ZF9vdXRwdXQsIGl0di0+c3RkKTsKIAkJLyogVHVybiBvZmYgdGhlIG91dHB1dCBzaWduYWwuIFRoZSBtcGVnIGRlY29kZXIgaXMgbm90IHlldAogCQkgICBhY3RpdmUgc28gd2l0aG91dCB0aGlzIHlvdSB3b3VsZCBnZXQgYSBncmVlbiBpbWFnZSB1bnRpbCB0aGUKIAkJICAgbXBlZyBkZWNvZGVyIGJlY29tZXMgYWN0aXZlLiAqLwotCQlpdnR2X3NhYTcxMjcoaXR2LCBWSURJT0NfU1RSRUFNT0ZGLCBOVUxMKTsKKwkJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19TQUE3MTI3LCB2aWRlbywgc19zdHJlYW0sIDApOwogCX0KIAogCS8qIGNsZWFyIGludGVycnVwdCBtYXNrLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgaW50ZXJydXB0cyAqLwpAQCAtMTIyMiw3ICsxMTUyLDcgQEAKIAogCS8qIFJlZ2lzdGVyIElSUSAqLwogCXJldHZhbCA9IHJlcXVlc3RfaXJxKGl0di0+ZGV2LT5pcnEsIGl2dHZfaXJxX2hhbmRsZXIsCi0JCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgaXR2LT5uYW1lLCAodm9pZCAqKWl0dik7CisJICAgICBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsIGl0di0+ZGV2aWNlLm5hbWUsICh2b2lkICopaXR2KTsKIAlpZiAocmV0dmFsKSB7CiAJCUlWVFZfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgaXJxICVkXG4iLCByZXR2YWwpOwogCQlnb3RvIGZyZWVfaTJjOwpAQCAtMTIzOCw3ICsxMTY4LDcgQEAKIAkJSVZUVl9FUlIoIkVycm9yICVkIHJlZ2lzdGVyaW5nIGRldmljZXNcbiIsIHJldHZhbCk7CiAJCWdvdG8gZnJlZV9zdHJlYW1zOwogCX0KLQlJVlRWX0lORk8oIkluaXRpYWxpemVkIGNhcmQgIyVkOiAlc1xuIiwgaXR2LT5udW0sIGl0di0+Y2FyZF9uYW1lKTsKKwlJVlRWX0lORk8oIkluaXRpYWxpemVkIGNhcmQ6ICVzXG4iLCBpdHYtPmNhcmRfbmFtZSk7CiAJcmV0dXJuIDA7CiAKIGZyZWVfc3RyZWFtczoKQEAgLTEyNjEsMTAgKzExOTEsOCBAQAogCQlyZXR2YWwgPSAtRU5PREVWOwogCUlWVFZfRVJSKCJFcnJvciAlZCBvbiBpbml0aWFsaXphdGlvblxuIiwgcmV0dmFsKTsKIAotCXNwaW5fbG9jaygmaXZ0dl9jYXJkc19sb2NrKTsKLQlrZnJlZShpdnR2X2NhcmRzW2l2dHZfY2FyZHNfYWN0aXZlXSk7Ci0JaXZ0dl9jYXJkc1tpdnR2X2NhcmRzX2FjdGl2ZV0gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZpdnR2X2NhcmRzX2xvY2spOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJml0di0+ZGV2aWNlKTsKKwlrZnJlZShpdHYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEzMDQsMTAgKzEyMzIsMTEgQEAKIAlpZiAoaXR2LT5jYXJkLT5od19hbGwgJiBJVlRWX0hXX0NYMjU4NDApIHsKIAkJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOwogCisJCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgY29yZSwgaW5pdCwgMCk7CiAJCS8qIENYMjU4NDBfQ0lEX0VOQUJMRV9QVlIxNTBfV09SS0FST1VORCAqLwogCQljdHJsLmlkID0gVjRMMl9DSURfUFJJVkFURV9CQVNFOwogCQljdHJsLnZhbHVlID0gaXR2LT5wdnIxNTBfd29ya2Fyb3VuZDsKLQkJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0NUUkwsICZjdHJsKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCBjb3JlLCBzX2N0cmwsICZjdHJsKTsKIAl9CiAKIAl2Zi50dW5lciA9IDA7CkBAIC0xMzM3LDcgKzEyNjYsNyBAQAogCQkvKiBUdXJuIG9uIHRoZSBUVi1vdXQ6IGl2dHZfaW5pdF9tcGVnX2RlY29kZXIoKSBpbml0aWFsaXplcwogCQkgICB0aGUgbXBlZyBkZWNvZGVyIHNvIG5vdyB0aGUgc2FhNzEyNyByZWNlaXZlcyBhIHByb3BlcgogCQkgICBzaWduYWwuICovCi0JCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19TVFJFQU1PTiwgTlVMTCk7CisJCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfc3RyZWFtLCAxKTsKIAkJaXZ0dl9pbml0X21wZWdfZGVjb2RlcihpdHYpOwogCX0KIAlpdnR2X3Nfc3RkKE5VTEwsICZmaCwgJml0di0+dHVuZXJfc3RkKTsKQEAgLTEzNjIsOSArMTI5MSwxMSBAQAogCiBzdGF0aWMgdm9pZCBpdnR2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKLQlzdHJ1Y3QgaXZ0diAqaXR2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCB2NGwyX2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwY2lfZGV2LT5kZXYpOworCXN0cnVjdCBpdnR2ICppdHYgPSB0b19pdnR2KGRldik7CisJaW50IGk7CiAKLQlJVlRWX0RFQlVHX0lORk8oIlJlbW92aW5nIENhcmQgIyVkXG4iLCBpdHYtPm51bSk7CisJSVZUVl9ERUJVR19JTkZPKCJSZW1vdmluZyBjYXJkXG4iKTsKIAogCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9JTklURUQsICZpdHYtPmlfZmxhZ3MpKSB7CiAJCS8qIFN0b3AgYWxsIGNhcHR1cmVzICovCkBAIC0xMzc3LDcgKzEzMDgsNyBAQAogCiAJCS8qIFR1cm4gb2ZmIHRoZSBUVi1vdXQgKi8KIAkJaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpCi0JCQlpdnR2X3NhYTcxMjcoaXR2LCBWSURJT0NfU1RSRUFNT0ZGLCBOVUxMKTsKKwkJCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfc3RyZWFtLCAwKTsKIAkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSA+IDApIHsKIAkJCWludCB0eXBlOwogCkBAIC0xNDAyLDYgKzEzMzMsOCBAQAogCWl2dHZfc3RyZWFtc19jbGVhbnVwKGl0diwgMSk7CiAJaXZ0dl91ZG1hX2ZyZWUoaXR2KTsKIAorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJml0di0+ZGV2aWNlKTsKKwogCWV4aXRfaXZ0dl9pMmMoaXR2KTsKIAogCWZyZWVfaXJxKGl0di0+ZGV2LT5pcnEsICh2b2lkICopaXR2KTsKQEAgLTE0MTMsOCArMTM0NiwxMSBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX0RFQ09ERVJfT0ZGU0VULCBJVlRWX0RFQ09ERVJfU0laRSk7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UoaXR2LT5kZXYpOworCWZvciAoaSA9IDA7IGkgPCBJVlRWX1ZCSV9GUkFNRVM7IGkrKykKKwkJa2ZyZWUoaXR2LT52Ymkuc2xpY2VkX21wZWdfZGF0YVtpXSk7CiAKLQlJVlRWX0lORk8oIlJlbW92ZWQgJXMsIGNhcmQgIyVkXG4iLCBpdHYtPmNhcmRfbmFtZSwgaXR2LT5udW0pOworCXByaW50ayhLRVJOX0lORk8gIml2dHY6IFJlbW92ZWQgJXNcbiIsIGl0di0+Y2FyZF9uYW1lKTsKKwlrZnJlZShpdHYpOwogfQogCiAvKiBkZWZpbmUgYSBwY2lfZHJpdmVyIGZvciBjYXJkIGRldGVjdGlvbiAqLwpAQCAtMTQyNyw1NCArMTM2MywzNiBAQAogCiBzdGF0aWMgaW50IG1vZHVsZV9zdGFydCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIml2dHY6ICBTdGFydCBpbml0aWFsaXphdGlvbiwgdmVyc2lvbiAlc1xuIiwgSVZUVl9WRVJTSU9OKTsKLQotCW1lbXNldChpdnR2X2NhcmRzLCAwLCBzaXplb2YoaXZ0dl9jYXJkcykpOworCXByaW50ayhLRVJOX0lORk8gIml2dHY6IFN0YXJ0IGluaXRpYWxpemF0aW9uLCB2ZXJzaW9uICVzXG4iLCBJVlRWX1ZFUlNJT04pOwogCiAJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLwogCWlmIChpdnR2X2ZpcnN0X21pbm9yIDwgMCB8fCBpdnR2X2ZpcnN0X21pbm9yID49IElWVFZfTUFYX0NBUkRTKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXZ0djogIEV4aXRpbmcsIGl2dHZfZmlyc3RfbWlub3IgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIml2dHY6IEV4aXRpbmcsIGl2dHZfZmlyc3RfbWlub3IgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkXG4iLAogCQkgICAgIElWVFZfTUFYX0NBUkRTIC0gMSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoaXZ0dl9kZWJ1ZyA8IDAgfHwgaXZ0dl9kZWJ1ZyA+IDIwNDcpIHsKIAkJaXZ0dl9kZWJ1ZyA9IDA7Ci0JCXByaW50ayhLRVJOX0lORk8gIml2dHY6ICBEZWJ1ZyB2YWx1ZSBtdXN0IGJlID49IDAgYW5kIDw9IDIwNDdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJpdnR2OiBEZWJ1ZyB2YWx1ZSBtdXN0IGJlID49IDAgYW5kIDw9IDIwNDdcbiIpOwogCX0KIAogCWlmIChwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpdnR2X3BjaV9kcml2ZXIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXZ0djogIEVycm9yIGRldGVjdGluZyBQQ0kgY2FyZFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaXZ0djogRXJyb3IgZGV0ZWN0aW5nIFBDSSBjYXJkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIml2dHY6ICBFbmQgaW5pdGlhbGl6YXRpb25cbiIpOworCXByaW50ayhLRVJOX0lORk8gIml2dHY6IEVuZCBpbml0aWFsaXphdGlvblxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG1vZHVsZV9jbGVhbnVwKHZvaWQpCiB7Ci0JaW50IGksIGo7Ci0KIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml2dHZfcGNpX2RyaXZlcik7Ci0KLQlzcGluX2xvY2soJml2dHZfY2FyZHNfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IGl2dHZfY2FyZHNfYWN0aXZlOyBpKyspIHsKLQkJaWYgKGl2dHZfY2FyZHNbaV0gPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgSVZUVl9WQklfRlJBTUVTOyBqKyspIHsKLQkJCWtmcmVlKGl2dHZfY2FyZHNbaV0tPnZiaS5zbGljZWRfbXBlZ19kYXRhW2pdKTsKLQkJfQotCQlrZnJlZShpdnR2X2NhcmRzW2ldKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJml2dHZfY2FyZHNfbG9jayk7CiB9CiAKIC8qIE5vdGU6IFRoZXNlIHN5bWJvbHMgYXJlIGV4cG9ydGVkIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBieSB0aGUgaXZ0dmZiCiAgICBmcmFtZWJ1ZmZlciBtb2R1bGUgYW5kIGFuIGluZnJhcmVkIG1vZHVsZSBmb3IgdGhlIElSLWJsYXN0ZXIuICovCiBFWFBPUlRfU1lNQk9MKGl2dHZfc2V0X2lycV9tYXNrKTsKLUVYUE9SVF9TWU1CT0woaXZ0dl9jYXJkc19hY3RpdmUpOwotRVhQT1JUX1NZTUJPTChpdnR2X2NhcmRzKTsKLUVYUE9SVF9TWU1CT0woaXZ0dl9jYXJkc19sb2NrKTsKIEVYUE9SVF9TWU1CT0woaXZ0dl9hcGkpOwogRVhQT1JUX1NZTUJPTChpdnR2X3ZhcGkpOwogRVhQT1JUX1NZTUJPTChpdnR2X3ZhcGlfcmVzdWx0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmgKaW5kZXggMzczM2IyYS4uY2U4ZDliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmgKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kdmIvYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvY3gyMzQxeC5oPgogCkBAIC0xMTMsOSArMTE0LDYgQEAKICNkZWZpbmUgSVZUVl9SRUdfVlBVIAkJCSgweDkwNTgpCiAjZGVmaW5lIElWVFZfUkVHX0FQVSAJCQkoMHhBMDY0KQogCi0vKiBpMmMgc3R1ZmYgKi8KLSNkZWZpbmUgSTJDX0NMSUVOVFNfTUFYIDE2Ci0KIC8qIGRlYnVnZ2luZyAqLwogZXh0ZXJuIGludCBpdnR2X2RlYnVnOwogCkBAIC0xMzIsMTIgKzEzMCwxMCBAQAogLyogRmxhZyB0byB0dXJuIG9uIGhpZ2ggdm9sdW1lIGRlYnVnZ2luZyAqLwogI2RlZmluZSBJVlRWX0RCR0ZMR19ISUdIVk9MICgxIDw8IDEwKQogCi0vKiBOT1RFOiBleHRyYSBzcGFjZSBiZWZvcmUgY29tbWEgaW4gJ2l0di0+bnVtICwgIyMgYXJncycgaXMgcmVxdWlyZWQgZm9yCi0gICBnY2MtMi45NSwgb3RoZXJ3aXNlIGl0IHdvbid0IGNvbXBpbGUuICovCiAjZGVmaW5lIElWVFZfREVCVUcoeCwgdHlwZSwgZm10LCBhcmdzLi4uKSBcCiAJZG8geyBcCiAJCWlmICgoeCkgJiBpdnR2X2RlYnVnKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPICJpdnR2JWQgIiB0eXBlICI6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpOyBcCisJCQl2NGwyX2luZm8oJml0di0+ZGV2aWNlLCAiICIgdHlwZSAiOiAiIGZtdCAsICMjYXJncyk7CVwKIAl9IHdoaWxlICgwKQogI2RlZmluZSBJVlRWX0RFQlVHX1dBUk4oZm10LCBhcmdzLi4uKSAgSVZUVl9ERUJVRyhJVlRWX0RCR0ZMR19XQVJOLCAgIndhcm4iLCAgZm10ICwgIyMgYXJncykKICNkZWZpbmUgSVZUVl9ERUJVR19JTkZPKGZtdCwgYXJncy4uLikgIElWVFZfREVCVUcoSVZUVl9EQkdGTEdfSU5GTywgICJpbmZvIiwgIGZtdCAsICMjIGFyZ3MpCkBAIC0xNTIsOCArMTQ4LDggQEAKIAogI2RlZmluZSBJVlRWX0RFQlVHX0hJR0hfVk9MKHgsIHR5cGUsIGZtdCwgYXJncy4uLikgXAogCWRvIHsgXAotCQlpZiAoKCh4KSAmIGl2dHZfZGVidWcpICYmIChpdnR2X2RlYnVnICYgSVZUVl9EQkdGTEdfSElHSFZPTCkpIFwKLQkJCXByaW50ayhLRVJOX0lORk8gIml2dHYlZCAiIHR5cGUgIjogIiBmbXQsIGl0di0+bnVtICwgIyMgYXJncyk7IFwKKwkJaWYgKCgoeCkgJiBpdnR2X2RlYnVnKSAmJiAoaXZ0dl9kZWJ1ZyAmIElWVFZfREJHRkxHX0hJR0hWT0wpKSAJXAorCQkJdjRsMl9pbmZvKCZpdHYtPmRldmljZSwgIiAiIHR5cGUgIjogIiBmbXQgLCAjI2FyZ3MpOwlcCiAJfSB3aGlsZSAoMCkKICNkZWZpbmUgSVZUVl9ERUJVR19ISV9XQVJOKGZtdCwgYXJncy4uLikgIElWVFZfREVCVUdfSElHSF9WT0woSVZUVl9EQkdGTEdfV0FSTiwgICJ3YXJuIiwgIGZtdCAsICMjIGFyZ3MpCiAjZGVmaW5lIElWVFZfREVCVUdfSElfSU5GTyhmbXQsIGFyZ3MuLi4pICBJVlRWX0RFQlVHX0hJR0hfVk9MKElWVFZfREJHRkxHX0lORk8sICAiaW5mbyIsICBmbXQgLCAjIyBhcmdzKQpAQCAtMTY3LDkgKzE2Myw5IEBACiAjZGVmaW5lIElWVFZfREVCVUdfSElfWVVWKGZtdCwgYXJncy4uLikgICBJVlRWX0RFQlVHX0hJR0hfVk9MKElWVFZfREJHRkxHX1lVViwgICAieXV2IiwgICBmbXQgLCAjIyBhcmdzKQogCiAvKiBTdGFuZGFyZCBrZXJuZWwgbWVzc2FnZXMgKi8KLSNkZWZpbmUgSVZUVl9FUlIoZm10LCBhcmdzLi4uKSAgICAgIHByaW50ayhLRVJOX0VSUiAgIml2dHYlZDogIiBmbXQsIGl0di0+bnVtICwgIyMgYXJncykKLSNkZWZpbmUgSVZUVl9XQVJOKGZtdCwgYXJncy4uLikgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIml2dHYlZDogIiBmbXQsIGl0di0+bnVtICwgIyMgYXJncykKLSNkZWZpbmUgSVZUVl9JTkZPKGZtdCwgYXJncy4uLikgICAgIHByaW50ayhLRVJOX0lORk8gIml2dHYlZDogIiBmbXQsIGl0di0+bnVtICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9FUlIoZm10LCBhcmdzLi4uKSAgICAgIHY0bDJfZXJyKCZpdHYtPmRldmljZSwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9XQVJOKGZtdCwgYXJncy4uLikgICAgIHY0bDJfd2FybigmaXR2LT5kZXZpY2UsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfSU5GTyhmbXQsIGFyZ3MuLi4pICAgICB2NGwyX2luZm8oJml0di0+ZGV2aWNlLCBmbXQgLCAjIyBhcmdzKQogCiAvKiBvdXRwdXQgbW9kZXMgKGN4MjM0MTUgb25seSkgKi8KICNkZWZpbmUgT1VUX05PTkUgICAgICAgIDAKQEAgLTU5Niw4ICs1OTIsNiBAQAogLyogU3RydWN0IHRvIGhvbGQgaW5mbyBhYm91dCBpdnR2IGNhcmRzICovCiBzdHJ1Y3QgaXZ0diB7CiAJLyogR2VuZXJhbCBmaXhlZCBjYXJkIGRhdGEgKi8KLQlpbnQgbnVtOwkJCS8qIGJvYXJkIG51bWJlciwgLTEgZHVyaW5nIGluaXQhICovCi0JY2hhciBuYW1lWzhdOwkJCS8qIGJvYXJkIG5hbWUgZm9yIHByaW50ayBhbmQgaW50ZXJydXB0cyAoZS5nLiAnaXZ0djAnKSAqLwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CQkvKiBQQ0kgZGV2aWNlICovCiAJY29uc3Qgc3RydWN0IGl2dHZfY2FyZCAqY2FyZDsJLyogY2FyZCBpbmZvcm1hdGlvbiAqLwogCWNvbnN0IGNoYXIgKmNhcmRfbmFtZTsgICAgICAgICAgLyogZnVsbCBuYW1lIG9mIHRoZSBjYXJkICovCkBAIC02MDksMTQgKzYwMywxOCBAQAogCXUzMiB2NGwyX2NhcDsJCQkvKiBWNEwyIGNhcGFiaWxpdGllcyBvZiBjYXJkICovCiAJdTMyIGh3X2ZsYWdzOyAJCQkvKiBoYXJkd2FyZSBkZXNjcmlwdGlvbiBvZiB0aGUgYm9hcmQgKi8KIAl2NGwyX3N0ZF9pZCB0dW5lcl9zdGQ7CQkvKiB0aGUgbm9ybSBvZiB0aGUgY2FyZCdzIHR1bmVyIChmaXhlZCkgKi8KLQkJCQkJLyogY29udHJvbGxpbmcgdmlkZW8gZGVjb2RlciBmdW5jdGlvbiAqLwotCWludCAoKnZpZGVvX2RlY19mdW5jKShzdHJ1Y3QgaXZ0diAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZF92aWRlbzsJLyogY29udHJvbGxpbmcgdmlkZW8gZGVjb2RlciBzdWJkZXYgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkX2F1ZGlvOwkvKiBjb250cm9sbGluZyBhdWRpbyBzdWJkZXYgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkX211eGVyOwkvKiBjb250cm9sbGluZyBhdWRpbyBtdXhlciBzdWJkZXYgKi8KIAl1MzIgYmFzZV9hZGRyOyAgICAgICAgICAgICAgICAgIC8qIFBDSSByZXNvdXJjZSBiYXNlIGFkZHJlc3MgKi8KIAl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmVuY19tZW07IC8qIHBvaW50ZXIgdG8gbWFwcGVkIGVuY29kZXIgbWVtb3J5ICovCiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZWNfbWVtOyAvKiBwb2ludGVyIHRvIG1hcHBlZCBkZWNvZGVyIG1lbW9yeSAqLwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqcmVnX21lbTsgLyogcG9pbnRlciB0byBtYXBwZWQgcmVnaXN0ZXJzICovCiAJc3RydWN0IGl2dHZfb3B0aW9ucyBvcHRpb25zOyAJLyogdXNlciBvcHRpb25zICovCiAKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgZGV2aWNlOworCXN0cnVjdCB2NGwyX3N1YmRldiBzZF9ncGlvOwkvKiBHUElPIHN1Yi1kZXZpY2UgKi8KKwl1MTYgaW5zdGFuY2U7CiAKIAkvKiBIaWdoLWxldmVsIHN0YXRlIGluZm8gKi8KIAl1bnNpZ25lZCBsb25nIGlfZmxhZ3M7ICAgICAgICAgIC8qIGdsb2JhbCBpdnR2IGZsYWdzICovCkBAIC02NzYsNyArNjc0LDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGkyY19hbGdvOwogCXN0cnVjdCBpMmNfY2xpZW50IGkyY19jbGllbnQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnRzW0kyQ19DTElFTlRTX01BWF07LyogcG9pbnRlcnMgdG8gYWxsIEkyQyBjbGllbnRzICovCiAJaW50IGkyY19zdGF0ZTsgICAgICAgICAgICAgICAgICAvKiBpMmMgYml0IHN0YXRlICovCiAJc3RydWN0IG11dGV4IGkyY19idXNfbG9jazsgICAgICAvKiBsb2NrIGkyYyBidXMgKi8KIApAQCAtNzIyLDExICs3MTksMTMgQEAKIAlzdHJ1Y3Qgb3NkX2luZm8gKm9zZF9pbmZvOyAgICAgIC8qIGl2dHZmYiBwcml2YXRlIE9TRCBpbmZvICovCiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpdnR2ICp0b19pdnR2KHN0cnVjdCB2NGwyX2RldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaXZ0diwgZGV2aWNlKTsKK30KKwogLyogR2xvYmFscyAqLwotZXh0ZXJuIHN0cnVjdCBpdnR2ICppdnR2X2NhcmRzW107Ci1leHRlcm4gaW50IGl2dHZfY2FyZHNfYWN0aXZlOwogZXh0ZXJuIGludCBpdnR2X2ZpcnN0X21pbm9yOwotZXh0ZXJuIHNwaW5sb2NrX3QgaXZ0dl9jYXJkc19sb2NrOwogCiAvKj09PT09PT09PT09PT09UHJvdG90eXBlcz09PT09PT09PT09PT09PT09PSovCiAKQEAgLTc4Niw0ICs3ODUsMTkgQEAKICNkZWZpbmUgd3JpdGVfZGVjX3N5bmModmFsLCBhZGRyKSBcCiAJZG8geyB3cml0ZV9kZWModmFsLCBhZGRyKTsgcmVhZF9kZWMoYWRkcik7IH0gd2hpbGUgKDApCiAKKy8qIENhbGwgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmb3IgYWxsIHN1YmRldnMgbWF0Y2hpbmcgaHcgKGlmIDAsIHRoZW4KKyAgIG1hdGNoIHRoZW0gYWxsKS4gSWdub3JlIGFueSBlcnJvcnMuICovCisjZGVmaW5lIGl2dHZfY2FsbF9odyhpdHYsIGh3LCBvLCBmLCBhcmdzLi4uKSAJCQkJXAorCV9fdjRsMl9kZXZpY2VfY2FsbF9zdWJkZXZzKCYoaXR2KS0+ZGV2aWNlLCAhKGh3KSB8fCAoc2QtPmdycF9pZCAmIChodykpLCBvLCBmICwgIyNhcmdzKQorCisjZGVmaW5lIGl2dHZfY2FsbF9hbGwoaXR2LCBvLCBmLCBhcmdzLi4uKSBpdnR2X2NhbGxfaHcoaXR2LCAwLCBvLCBmICwgIyNhcmdzKQorCisvKiBDYWxsIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgZm9yIGFsbCBzdWJkZXZzIG1hdGNoaW5nIGh3IChpZiAwLCB0aGVuCisgICBtYXRjaCB0aGVtIGFsbCkuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGFuIGVycm9yIG90aGVyIHRoYW4gMCBvcgorICAgLUVOT0lPQ1RMQ01ELCB0aGVuIHJldHVybiB3aXRoIHRoYXQgZXJyb3IgY29kZS4gKi8KKyNkZWZpbmUgaXZ0dl9jYWxsX2h3X2VycihpdHYsIGh3LCBvLCBmLCBhcmdzLi4uKSAgCQlcCisJX192NGwyX2RldmljZV9jYWxsX3N1YmRldnNfdW50aWxfZXJyKCYoaXR2KS0+ZGV2aWNlLCAhKGh3KSB8fCAoc2QtPmdycF9pZCAmIChodykpLCBvLCBmICwgIyNhcmdzKQorCisjZGVmaW5lIGl2dHZfY2FsbF9hbGxfZXJyKGl0diwgbywgZiwgYXJncy4uLikgaXZ0dl9jYWxsX2h3X2VycihpdHYsIDAsIG8sIGYgLCAjI2FyZ3MpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCmluZGV4IDFjNDA0ZTQuLjVlYjU4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiAJbmV3X3N0ZXJlb19tb2RlID0gaXR2LT5wYXJhbXMuYXVkaW9fcHJvcGVydGllcyAmIHN0ZXJlb19tYXNrOwogCW1lbXNldCgmdnQsIDAsIHNpemVvZih2dCkpOwotCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19HX1RVTkVSLCAmdnQpOworCWl2dHZfY2FsbF9hbGwoaXR2LCB0dW5lciwgZ190dW5lciwgJnZ0KTsKIAlpZiAodnQuYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIgJiYgKHZ0LnJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikpCiAJCW5ld19zdGVyZW9fbW9kZSA9IGR1YWw7CiAKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCQkvKiBNYXJrIHRoYXQgdGhlIHJhZGlvIGlzIG5vIGxvbmdlciBpbiB1c2UgKi8KIAkJY2xlYXJfYml0KElWVFZfRl9JX1JBRElPX1VTRVIsICZpdHYtPmlfZmxhZ3MpOwogCQkvKiBTd2l0Y2ggdHVuZXIgdG8gVFYgKi8KLQkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX1NfU1RELCAmaXR2LT5zdGQpOworCQlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIHNfc3RkLCBpdHYtPnN0ZCk7CiAJCS8qIFNlbGVjdCBjb3JyZWN0IGF1ZGlvIGlucHV0IChpLmUuIFRWIHR1bmVyIG9yIExpbmUgaW4pICovCiAJCWl2dHZfYXVkaW9fc2V0X2lvKGl0dik7CiAJCWlmIChpdHYtPmh3X2ZsYWdzICYgSVZUVl9IV19TQUE3MTFYKQpAQCAtODY1LDcgKzg2NSw3IEBACiAJCQlzdHJ1Y3QgdjRsMl9jcnlzdGFsX2ZyZXEgY3J5c3RhbF9mcmVxOwogCQkJY3J5c3RhbF9mcmVxLmZyZXEgPSBTQUE3MTE1X0ZSRVFfMzJfMTFfTUhaOwogCQkJY3J5c3RhbF9mcmVxLmZsYWdzID0gMDsKLQkJCWl2dHZfc2FhNzExNShpdHYsIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEsICZjcnlzdGFsX2ZyZXEpOworCQkJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19TQUE3MTFYLCB2aWRlbywgc19jcnlzdGFsX2ZyZXEsICZjcnlzdGFsX2ZyZXEpOwogCQl9CiAJCWlmIChhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCkgewogCQkJLyogVW5kbyB2aWRlbyBtdXRlICovCkBAIC05NTIsMTUgKzk1MiwxNCBAQAogCQkvKiBXZSBoYXZlIHRoZSByYWRpbyAqLwogCQlpdnR2X211dGUoaXR2KTsKIAkJLyogU3dpdGNoIHR1bmVyIHRvIHJhZGlvICovCi0JCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIEFVRENfU0VUX1JBRElPLCBOVUxMKTsKKwkJaXZ0dl9jYWxsX2FsbChpdHYsIHR1bmVyLCBzX3JhZGlvKTsKIAkJLyogU2VsZWN0IHRoZSBjb3JyZWN0IGF1ZGlvIGlucHV0IChpLmUuIHJhZGlvIHR1bmVyKSAqLwogCQlpdnR2X2F1ZGlvX3NldF9pbyhpdHYpOwotCQlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfU0FBNzExWCkKLQkJeworCQlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfU0FBNzExWCkgewogCQkJc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxIGNyeXN0YWxfZnJlcTsKIAkJCWNyeXN0YWxfZnJlcS5mcmVxID0gU0FBNzExNV9GUkVRXzMyXzExX01IWjsKIAkJCWNyeXN0YWxfZnJlcS5mbGFncyA9IFNBQTcxMTVfRlJFUV9GTF9BUExMOwotCQkJaXZ0dl9zYWE3MTE1KGl0diwgVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSwgJmNyeXN0YWxfZnJlcSk7CisJCQlpdnR2X2NhbGxfaHcoaXR2LCBJVlRWX0hXX1NBQTcxMVgsIHZpZGVvLCBzX2NyeXN0YWxfZnJlcSwgJmNyeXN0YWxfZnJlcSk7CiAJCX0KIAkJLyogRG9uZSEgVW5tdXRlIGFuZCBjb250aW51ZS4gKi8KIAkJaXZ0dl91bm11dGUoaXR2KTsKQEAgLTk4MSwzNyArOTgwLDE4IEBACiAKIGludCBpdnR2X3Y0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQgcmVzLCB4LCB5ID0gMDsKKwlpbnQgcmVzOwogCXN0cnVjdCBpdnR2ICppdHYgPSBOVUxMOwogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9IE5VTEw7Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxwKTsKIAotCS8qIEZpbmQgd2hpY2ggY2FyZCB0aGlzIG9wZW4gd2FzIG9uICovCi0Jc3Bpbl9sb2NrKCZpdnR2X2NhcmRzX2xvY2spOwotCWZvciAoeCA9IDA7IGl0diA9PSBOVUxMICYmIHggPCBpdnR2X2NhcmRzX2FjdGl2ZTsgeCsrKSB7Ci0JCWlmIChpdnR2X2NhcmRzW3hdID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJLyogZmluZCBvdXQgd2hpY2ggc3RyZWFtIHRoaXMgb3BlbiB3YXMgb24gKi8KLQkJZm9yICh5ID0gMDsgeSA8IElWVFZfTUFYX1NUUkVBTVM7IHkrKykgewotCQkJcyA9ICZpdnR2X2NhcmRzW3hdLT5zdHJlYW1zW3ldOwotCQkJaWYgKHMtPnY0bDJkZXYgJiYgcy0+djRsMmRldi0+bWlub3IgPT0gbWlub3IpIHsKLQkJCQlpdHYgPSBpdnR2X2NhcmRzW3hdOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZpdnR2X2NhcmRzX2xvY2spOwotCi0JaWYgKGl0diA9PSBOVUxMKSB7Ci0JCS8qIENvdWxkbid0IGZpbmQgYSBkZXZpY2UgcmVnaXN0ZXJlZAotCQkgICBvbiB0aGF0IG1pbm9yLCBzaG91bGRuJ3QgaGFwcGVuISAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBpdnR2IGRldmljZSBmb3VuZCBvbiBtaW5vciAlZFxuIiwgbWlub3IpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KKwlzID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJaXR2ID0gcy0+aXR2OwogCiAJbXV0ZXhfbG9jaygmaXR2LT5zZXJpYWxpemVfbG9jayk7CiAJaWYgKGl2dHZfaW5pdF9vbl9maXJzdF9vcGVuKGl0dikpIHsKLQkJSVZUVl9FUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIG9uIG1pbm9yICVkXG4iLCBtaW5vcik7CisJCUlWVFZfRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBvbiBtaW5vciAlZFxuIiwKKwkJCQlzLT52NGwyZGV2LT5taW5vcik7CiAJCW11dGV4X3VubG9jaygmaXR2LT5zZXJpYWxpemVfbG9jayk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5jCmluZGV4IDc0YTQ0ODQuLmRjMjg1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmMKQEAgLTE0NCwyMiArMTQ0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpdnR2X2dwaW9faW5pdChzdHJ1Y3QgaXZ0diAqaXR2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXZ0diAqc2RfdG9faXZ0dihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewotCXUxNiBwaW4gPSAwOwotCi0JaWYgKGl0di0+Y2FyZC0+eGNlaXZlX3BpbikKLQkJcGluID0gMSA8PCBpdHYtPmNhcmQtPnhjZWl2ZV9waW47Ci0KLQlpZiAoKGl0di0+Y2FyZC0+Z3Bpb19pbml0LmRpcmVjdGlvbiB8IHBpbikgPT0gMCkKLQkJcmV0dXJuOwotCi0JSVZUVl9ERUJVR19JTkZPKCJHUElPIGluaXRpYWwgZGlyOiAlMDh4IG91dDogJTA4eFxuIiwKLQkJICAgcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19ESVIpLCByZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkpOwotCi0JLyogaW5pdCBvdXRwdXQgZGF0YSB0aGVuIGRpcmVjdGlvbiAqLwotCXdyaXRlX3JlZyhpdHYtPmNhcmQtPmdwaW9faW5pdC5pbml0aWFsX3ZhbHVlIHwgcGluLCBJVlRWX1JFR19HUElPX09VVCk7Ci0Jd3JpdGVfcmVnKGl0di0+Y2FyZC0+Z3Bpb19pbml0LmRpcmVjdGlvbiB8IHBpbiwgSVZUVl9SRUdfR1BJT19ESVIpOworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBpdnR2LCBzZF9ncGlvKTsKIH0KIAogc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBncGlvX2N0cmxfbXV0ZSA9IHsKQEAgLTE3MywxMzQgKzE2MCwyMzEgQEAKIAkuZmxhZ3MgICAgICAgICA9IDAsCiB9OwogCi1pbnQgaXZ0dl9ncGlvKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjb21tYW5kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHN1YmRldl9zX2Nsb2NrX2ZyZXEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGZyZXEpCiB7Ci0Jc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0Jc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisJc3RydWN0IGl2dHYgKml0diA9IHNkX3RvX2l2dHYoc2QpOwogCXUxNiBtYXNrLCBkYXRhOwogCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fZnJlcS5tYXNrOwotCQlzd2l0Y2ggKCoodTMyICopYXJnKSB7Ci0JCWNhc2UgMzIwMDA6Ci0JCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEuZjMyMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDQxMDA6Ci0JCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEuZjQ0MTAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDgwMDA6Ci0JCWRlZmF1bHQ6Ci0JCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEuZjQ4MDAwOwotCQkJYnJlYWs7Ci0JCX0KKwltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEubWFzazsKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDMyMDAwOgorCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEuZjMyMDAwOwogCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fZGV0ZWN0Lm1hc2s7Ci0JCWlmIChtYXNrID09IDAgfHwgKHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fSU4pICYgbWFzaykpCi0JCQl0dW5lci0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8gfAotCQkJICAgICAgIFY0TDJfVFVORVJfTU9ERV9MQU5HMSB8IFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKLQkJZWxzZQotCQkJdHVuZXItPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQlyZXR1cm4gMDsKLQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbW9kZS5tYXNrOwotCQlzd2l0Y2ggKHR1bmVyLT5hdWRtb2RlKSB7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgotCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLmxhbmcxOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgotCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLmxhbmcyOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86Ci0JCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUubW9ubzsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxX0xBTkcyOgotCQlkZWZhdWx0OgotCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLnN0ZXJlbzsKLQkJCWJyZWFrOwotCQl9CisJY2FzZSA0NDEwMDoKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19mcmVxLmY0NDEwMDsKIAkJYnJlYWs7Ci0KLQljYXNlIEFVRENfU0VUX1JBRElPOgotCQltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0Lm1hc2s7Ci0JCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQucmFkaW87Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQubWFzazsKLQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC50dW5lcjsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgotCQlpZiAocm91dGUtPmlucHV0ID4gMikKLQkJCXJldHVybiAtRUlOVkFMOwotCQltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0Lm1hc2s7Ci0JCXN3aXRjaCAocm91dGUtPmlucHV0KSB7Ci0JCQljYXNlIDA6Ci0JCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC50dW5lcjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0LmxpbmVpbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCWRlZmF1bHQ6Ci0JCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC5yYWRpbzsKLQkJCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm1hc2s7Ci0JCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbXV0ZS5tdXRlOwotCQljdHJsLT52YWx1ZSA9IChyZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkgJiBtYXNrKSA9PSBkYXRhOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm1hc2s7Ci0JCWRhdGEgPSBjdHJsLT52YWx1ZSA/IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm11dGUgOiAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0KLQkJaWYgKHFjLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCSpxYyA9IGdwaW9fY3RybF9tdXRlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQlJVlRWX0lORk8oIkdQSU8gc3RhdHVzOiBESVI9MHglMDR4IE9VVD0weCUwNHggSU49MHglMDR4XG4iLAotCQkJcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19ESVIpLCByZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCksCi0JCQlyZWFkX3JlZyhJVlRWX1JFR19HUElPX0lOKSk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKLQkJaWYgKHJvdXRlLT5pbnB1dCA+IDIpIC8qIDA6VHVuZXIgMTpDb21wb3NpdGUgMjpTLVZpZGVvICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC5tYXNrOwotCQlpZiAgKHJvdXRlLT5pbnB1dCA9PSAwKQotCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC50dW5lcjsKLQkJZWxzZSBpZiAgKHJvdXRlLT5pbnB1dCA9PSAxKQotCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC5jb21wb3NpdGU7Ci0JCWVsc2UKLQkJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fdmlkZW9faW5wdXQuc3ZpZGVvOwotCQlicmVhazsKLQorCWNhc2UgNDgwMDA6CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fZnJlcS5mNDgwMDA7CisJCWJyZWFrOwogCX0KIAlpZiAobWFzaykKIAkJd3JpdGVfcmVnKChyZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spLCBJVlRWX1JFR19HUElPX09VVCk7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgc3ViZGV2X2dfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKwl1MTYgbWFzazsKKworCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fZGV0ZWN0Lm1hc2s7CisJaWYgKG1hc2sgPT0gMCB8fCAocmVhZF9yZWcoSVZUVl9SRUdfR1BJT19JTikgJiBtYXNrKSkKKwkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPIHwKKwkJCVY0TDJfVFVORVJfTU9ERV9MQU5HMSB8IFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKKwllbHNlCisJCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJc3RydWN0IGl2dHYgKml0diA9IHNkX3RvX2l2dHYoc2QpOworCXUxNiBtYXNrLCBkYXRhOworCisJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLm1hc2s7CisJc3dpdGNoICh2dC0+YXVkbW9kZSkgeworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUubGFuZzE7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUubGFuZzI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbW9kZS5tb25vOworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzI6CisJZGVmYXVsdDoKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLnN0ZXJlbzsKKwkJYnJlYWs7CisJfQorCWlmIChtYXNrKQorCQl3cml0ZV9yZWcoKHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fT1VUKSAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIElWVFZfUkVHX0dQSU9fT1VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc19yYWRpbyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKwl1MTYgbWFzaywgZGF0YTsKKworCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQubWFzazsKKwlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0LnJhZGlvOworCWlmIChtYXNrKQorCQl3cml0ZV9yZWcoKHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fT1VUKSAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIElWVFZfUkVHX0dQSU9fT1VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKwl1MTYgbWFzaywgZGF0YTsKKworCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQubWFzazsKKwlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0LnR1bmVyOworCWlmIChtYXNrKQorCQl3cml0ZV9yZWcoKHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fT1VUKSAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIElWVFZfUkVHX0dQSU9fT1VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc19hdWRpb19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKwl1MTYgbWFzaywgZGF0YTsKKworCWlmIChyb3V0ZS0+aW5wdXQgPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0Lm1hc2s7CisJc3dpdGNoIChyb3V0ZS0+aW5wdXQpIHsKKwljYXNlIDA6CisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQudHVuZXI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC5saW5laW47CisJCWJyZWFrOworCWNhc2UgMjoKKwlkZWZhdWx0OgorCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0LnJhZGlvOworCQlicmVhazsKKwl9CisJaWYgKG1hc2spCisJCXdyaXRlX3JlZygocmVhZF9yZWcoSVZUVl9SRUdfR1BJT19PVVQpICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwgSVZUVl9SRUdfR1BJT19PVVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1YmRldl9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gc2RfdG9faXZ0dihzZCk7CisJdTE2IG1hc2ssIGRhdGE7CisKKwlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm1hc2s7CisJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm11dGU7CisJY3RybC0+dmFsdWUgPSAocmVhZF9yZWcoSVZUVl9SRUdfR1BJT19PVVQpICYgbWFzaykgPT0gZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGl2dHYgKml0diA9IHNkX3RvX2l2dHYoc2QpOworCXUxNiBtYXNrLCBkYXRhOworCisJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCXJldHVybiAtRUlOVkFMOworCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbXV0ZS5tYXNrOworCWRhdGEgPSBjdHJsLT52YWx1ZSA/IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm11dGUgOiAwOworCWlmIChtYXNrKQorCQl3cml0ZV9yZWcoKHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fT1VUKSAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIElWVFZfUkVHX0dQSU9fT1VUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfcXVlcnljdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaWYgKHFjLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqcWMgPSBncGlvX2N0cmxfbXV0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKworCUlWVFZfSU5GTygiR1BJTyBzdGF0dXM6IERJUj0weCUwNHggT1VUPTB4JTA0eCBJTj0weCUwNHhcbiIsCisJCQlyZWFkX3JlZyhJVlRWX1JFR19HUElPX0RJUiksIHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fT1VUKSwKKwkJCXJlYWRfcmVnKElWVFZfUkVHX0dQSU9fSU4pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJkZXZfc192aWRlb19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzZF90b19pdnR2KHNkKTsKKwl1MTYgbWFzaywgZGF0YTsKKworCWlmIChyb3V0ZS0+aW5wdXQgPiAyKSAvKiAwOlR1bmVyIDE6Q29tcG9zaXRlIDI6Uy1WaWRlbyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwltYXNrID0gaXR2LT5jYXJkLT5ncGlvX3ZpZGVvX2lucHV0Lm1hc2s7CisJaWYgIChyb3V0ZS0+aW5wdXQgPT0gMCkKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC50dW5lcjsKKwllbHNlIGlmICAocm91dGUtPmlucHV0ID09IDEpCisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fdmlkZW9faW5wdXQuY29tcG9zaXRlOworCWVsc2UKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC5zdmlkZW87CisJaWYgKG1hc2spCisJCXdyaXRlX3JlZygocmVhZF9yZWcoSVZUVl9SRUdfR1BJT19PVVQpICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwgSVZUVl9SRUdfR1BJT19PVVQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHN1YmRldl9jb3JlX29wcyA9IHsKKwkubG9nX3N0YXR1cyA9IHN1YmRldl9sb2dfc3RhdHVzLAorCS5nX2N0cmwgPSBzdWJkZXZfZ19jdHJsLAorCS5zX2N0cmwgPSBzdWJkZXZfc19jdHJsLAorCS5xdWVyeWN0cmwgPSBzdWJkZXZfcXVlcnljdHJsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgc3ViZGV2X3R1bmVyX29wcyA9IHsKKwkuc19zdGQgPSBzdWJkZXZfc19zdGQsCisJLnNfcmFkaW8gPSBzdWJkZXZfc19yYWRpbywKKwkuZ190dW5lciA9IHN1YmRldl9nX3R1bmVyLAorCS5zX3R1bmVyID0gc3ViZGV2X3NfdHVuZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyBzdWJkZXZfYXVkaW9fb3BzID0geworCS5zX2Nsb2NrX2ZyZXEgPSBzdWJkZXZfc19jbG9ja19mcmVxLAorCS5zX3JvdXRpbmcgPSBzdWJkZXZfc19hdWRpb19yb3V0aW5nLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgc3ViZGV2X3ZpZGVvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gc3ViZGV2X3NfdmlkZW9fcm91dGluZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHN1YmRldl9vcHMgPSB7CisJLmNvcmUgPSAmc3ViZGV2X2NvcmVfb3BzLAorCS50dW5lciA9ICZzdWJkZXZfdHVuZXJfb3BzLAorCS5hdWRpbyA9ICZzdWJkZXZfYXVkaW9fb3BzLAorCS52aWRlbyA9ICZzdWJkZXZfdmlkZW9fb3BzLAorfTsKKworaW50IGl2dHZfZ3Bpb19pbml0KHN0cnVjdCBpdnR2ICppdHYpCit7CisJdTE2IHBpbiA9IDA7CisKKwlpZiAoaXR2LT5jYXJkLT54Y2VpdmVfcGluKQorCQlwaW4gPSAxIDw8IGl0di0+Y2FyZC0+eGNlaXZlX3BpbjsKKworCWlmICgoaXR2LT5jYXJkLT5ncGlvX2luaXQuZGlyZWN0aW9uIHwgcGluKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCUlWVFZfREVCVUdfSU5GTygiR1BJTyBpbml0aWFsIGRpcjogJTA4eCBvdXQ6ICUwOHhcbiIsCisJCSAgIHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fRElSKSwgcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19PVVQpKTsKKworCS8qIGluaXQgb3V0cHV0IGRhdGEgdGhlbiBkaXJlY3Rpb24gKi8KKwl3cml0ZV9yZWcoaXR2LT5jYXJkLT5ncGlvX2luaXQuaW5pdGlhbF92YWx1ZSB8IHBpbiwgSVZUVl9SRUdfR1BJT19PVVQpOworCXdyaXRlX3JlZyhpdHYtPmNhcmQtPmdwaW9faW5pdC5kaXJlY3Rpb24gfCBwaW4sIElWVFZfUkVHX0dQSU9fRElSKTsKKwl2NGwyX3N1YmRldl9pbml0KCZpdHYtPnNkX2dwaW8sICZzdWJkZXZfb3BzKTsKKwlzbnByaW50ZihpdHYtPnNkX2dwaW8ubmFtZSwgc2l6ZW9mKGl0di0+c2RfZ3Bpby5uYW1lKSwgIiVzLWdwaW8iLCBpdHYtPmRldmljZS5uYW1lKTsKKwlpdHYtPnNkX2dwaW8uZ3JwX2lkID0gSVZUVl9IV19HUElPOworCXJldHVybiB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJml0di0+ZGV2aWNlLCAmaXR2LT5zZF9ncGlvKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uaAppbmRleCA0OGI2MjkxLi4wYjVkMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5oCkBAIC0yMiw5ICsyMiw4IEBACiAjZGVmaW5lIElWVFZfR1BJT19ICiAKIC8qIEdQSU8gc3R1ZmYgKi8KLXZvaWQgaXZ0dl9ncGlvX2luaXQoc3RydWN0IGl2dHYgKml0dik7CitpbnQgaXZ0dl9ncGlvX2luaXQoc3RydWN0IGl2dHYgKml0dik7CiB2b2lkIGl2dHZfcmVzZXRfaXJfZ3BpbyhzdHJ1Y3QgaXZ0diAqaXR2KTsKIGludCBpdnR2X3Jlc2V0X3R1bmVyX2dwaW8odm9pZCAqZGV2LCBpbnQgY29tcG9uZW50LCBpbnQgY21kLCBpbnQgdmFsdWUpOwotaW50IGl2dHZfZ3BpbyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5jCmluZGV4IDQxZGJiZTkuLmNhMWQ5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5jCkBAIC05MCwyNiArOTAsNiBAQAogI2RlZmluZSBJVlRWX001Mjc5MF9JMkNfQUREUiAgICAgIAkweDQ4CiAKIC8qIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSBJVlRWX0hXXyBkZWZpbmVzICovCi1zdGF0aWMgY29uc3QgdTggaHdfZHJpdmVyaWRzW10gPSB7Ci0JSTJDX0RSSVZFUklEX0NYMjU4NDAsCi0JSTJDX0RSSVZFUklEX1NBQTcxMVgsCi0JSTJDX0RSSVZFUklEX1NBQTcxMjcsCi0JSTJDX0RSSVZFUklEX01TUDM0MDAsCi0JSTJDX0RSSVZFUklEX1RVTkVSLAotCUkyQ19EUklWRVJJRF9XTTg3NzUsCi0JSTJDX0RSSVZFUklEX0NTNTNMMzJBLAotCUkyQ19EUklWRVJJRF9UVkVFUFJPTSwKLQlJMkNfRFJJVkVSSURfU0FBNzExWCwKLQlJMkNfRFJJVkVSSURfVVBENjQwMzFBLAotCUkyQ19EUklWRVJJRF9VUEQ2NDA4MywKLQlJMkNfRFJJVkVSSURfU0FBNzE3WCwKLQlJMkNfRFJJVkVSSURfV004NzM5LAotCUkyQ19EUklWRVJJRF9WUDI3U01QWCwKLQlJMkNfRFJJVkVSSURfTTUyNzkwLAotCTAgCQkvKiBJVlRWX0hXX0dQSU8gZHVtbXkgZHJpdmVyIElEICovCi19OwotCi0vKiBUaGlzIGFycmF5IHNob3VsZCBtYXRjaCB0aGUgSVZUVl9IV18gZGVmaW5lcyAqLwogc3RhdGljIGNvbnN0IHU4IGh3X2FkZHJzW10gPSB7CiAJSVZUVl9DWDI1ODQwX0kyQ19BRERSLAogCUlWVFZfU0FBNzExNV9JMkNfQUREUiwKQEAgLTEzMCw2ICsxMTAsMjYgQEAKIH07CiAKIC8qIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSBJVlRWX0hXXyBkZWZpbmVzICovCitzdGF0aWMgY29uc3QgY2hhciAqaHdfbW9kdWxlc1tdID0geworCSJjeDI1ODQwIiwKKwkic2FhNzExNSIsCisJInNhYTcxMjciLAorCSJtc3AzNDAwIiwKKwkidHVuZXIiLAorCSJ3bTg3NzUiLAorCSJjczUzbDMyYSIsCisJTlVMTCwKKwkic2FhNzExNSIsCisJInVwZDY0MDMxYSIsCisJInVwZDY0MDgzIiwKKwkic2FhNzE3eCIsCisJIndtODczOSIsCisJInZwMjdzbXB4IiwKKwkibTUyNzkwIiwKKwlOVUxMCit9OworCisvKiBUaGlzIGFycmF5IHNob3VsZCBtYXRjaCB0aGUgSVZUVl9IV18gZGVmaW5lcyAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod19kZXZpY2VuYW1lc1tdID0gewogCSJjeDI1ODQwIiwKIAkic2FhNzExNSIsCkBAIC0xNTEsODAgKzE1MSw1OCBAQAogCiBpbnQgaXZ0dl9pMmNfcmVnaXN0ZXIoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaWR4KQogewotCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjOwotCXU4IGlkOwotCWludCBpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gJml0di0+aTJjX2FkYXA7CisJY29uc3QgY2hhciAqbW9kID0gaHdfbW9kdWxlc1tpZHhdOworCWNvbnN0IGNoYXIgKnR5cGUgPSBod19kZXZpY2VuYW1lc1tpZHhdOworCXUzMiBodyA9IDEgPDwgaWR4OwogCi0JSVZUVl9ERUJVR19JMkMoImkyYyBjbGllbnQgcmVnaXN0ZXJcbiIpOwotCWlmIChpZHggPj0gQVJSQVlfU0laRShod19kcml2ZXJpZHMpIHx8IGh3X2RyaXZlcmlkc1tpZHhdID09IDApCisJaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGh3X2FkZHJzKSkKIAkJcmV0dXJuIC0xOwotCWlkID0gaHdfZHJpdmVyaWRzW2lkeF07Ci0JbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotCXN0cmxjcHkoaW5mby50eXBlLCBod19kZXZpY2VuYW1lc1tpZHhdLCBzaXplb2YoaW5mby50eXBlKSk7Ci0JaW5mby5hZGRyID0gaHdfYWRkcnNbaWR4XTsKLQlmb3IgKGkgPSAwOyBpdHYtPmkyY19jbGllbnRzW2ldICYmIGkgPCBJMkNfQ0xJRU5UU19NQVg7IGkrKykge30KLQotCWlmIChpID09IEkyQ19DTElFTlRTX01BWCkgewotCQlJVlRWX0VSUigiaW5zdWZmaWNpZW50IHJvb20gZm9yIG5ldyBJMkMgY2xpZW50IVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChodyA9PSBJVlRWX0hXX1RVTkVSKSB7CisJCS8qIHNwZWNpYWwgdHVuZXIgaGFuZGxpbmcgKi8KKwkJc2QgPSB2NGwyX2kyY19uZXdfcHJvYmVkX3N1YmRldihhZGFwLCBtb2QsIHR5cGUsCisJCQkJaXR2LT5jYXJkX2kyYy0+cmFkaW8pOworCQlpZiAoc2QpCisJCQlzZC0+Z3JwX2lkID0gMSA8PCBpZHg7CisJCXNkID0gdjRsMl9pMmNfbmV3X3Byb2JlZF9zdWJkZXYoYWRhcCwgbW9kLCB0eXBlLAorCQkJCWl0di0+Y2FyZF9pMmMtPmRlbW9kKTsKKwkJaWYgKHNkKQorCQkJc2QtPmdycF9pZCA9IDEgPDwgaWR4OworCQlzZCA9IHY0bDJfaTJjX25ld19wcm9iZWRfc3ViZGV2KGFkYXAsIG1vZCwgdHlwZSwKKwkJCQlpdHYtPmNhcmRfaTJjLT50dik7CisJCWlmIChzZCkKKwkJCXNkLT5ncnBfaWQgPSAxIDw8IGlkeDsKKwkJcmV0dXJuIHNkID8gMCA6IC0xOwogCX0KKwlpZiAoIWh3X2FkZHJzW2lkeF0pCisJCXJldHVybiAtMTsKKwlpZiAoaHcgPT0gSVZUVl9IV19VUEQ2NDAzMUEgfHwgaHcgPT0gSVZUVl9IV19VUEQ2NDA4WCkgeworCQl1bnNpZ25lZCBzaG9ydCBhZGRyc1syXSA9IHsgaHdfYWRkcnNbaWR4XSwgSTJDX0NMSUVOVF9FTkQgfTsKIAotCWlmIChpZCAhPSBJMkNfRFJJVkVSSURfVFVORVIpIHsKLQkJaWYgKGlkID09IEkyQ19EUklWRVJJRF9VUEQ2NDAzMUEgfHwKLQkJICAgIGlkID09IEkyQ19EUklWRVJJRF9VUEQ2NDA4MykgewotCQkJdW5zaWduZWQgc2hvcnQgYWRkcnNbMl0gPSB7IGluZm8uYWRkciwgSTJDX0NMSUVOVF9FTkQgfTsKLQotCQkJYyA9IGkyY19uZXdfcHJvYmVkX2RldmljZSgmaXR2LT5pMmNfYWRhcCwgJmluZm8sIGFkZHJzKTsKLQkJfSBlbHNlCi0JCQljID0gaTJjX25ld19kZXZpY2UoJml0di0+aTJjX2FkYXAsICZpbmZvKTsKLQkJaWYgKGMgJiYgYy0+ZHJpdmVyID09IE5VTEwpCi0JCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoYyk7Ci0JCWVsc2UgaWYgKGMpCi0JCQlpdHYtPmkyY19jbGllbnRzW2ldID0gYzsKLQkJcmV0dXJuIGl0di0+aTJjX2NsaWVudHNbaV0gPyAwIDogLUVOT0RFVjsKKwkJc2QgPSB2NGwyX2kyY19uZXdfcHJvYmVkX3N1YmRldihhZGFwLCBtb2QsIHR5cGUsIGFkZHJzKTsKKwl9IGVsc2UgeworCQlzZCA9IHY0bDJfaTJjX25ld19zdWJkZXYoYWRhcCwgbW9kLCB0eXBlLCBod19hZGRyc1tpZHhdKTsKIAl9Ci0KLQkvKiBzcGVjaWFsIHR1bmVyIGhhbmRsaW5nICovCi0JYyA9IGkyY19uZXdfcHJvYmVkX2RldmljZSgmaXR2LT5pMmNfYWRhcCwgJmluZm8sIGl0di0+Y2FyZF9pMmMtPnJhZGlvKTsKLQlpZiAoYyAmJiBjLT5kcml2ZXIgPT0gTlVMTCkKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGMpOwotCWVsc2UgaWYgKGMpCi0JCWl0di0+aTJjX2NsaWVudHNbaSsrXSA9IGM7Ci0JYyA9IGkyY19uZXdfcHJvYmVkX2RldmljZSgmaXR2LT5pMmNfYWRhcCwgJmluZm8sIGl0di0+Y2FyZF9pMmMtPmRlbW9kKTsKLQlpZiAoYyAmJiBjLT5kcml2ZXIgPT0gTlVMTCkKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGMpOwotCWVsc2UgaWYgKGMpCi0JCWl0di0+aTJjX2NsaWVudHNbaSsrXSA9IGM7Ci0JYyA9IGkyY19uZXdfcHJvYmVkX2RldmljZSgmaXR2LT5pMmNfYWRhcCwgJmluZm8sIGl0di0+Y2FyZF9pMmMtPnR2KTsKLQlpZiAoYyAmJiBjLT5kcml2ZXIgPT0gTlVMTCkKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGMpOwotCWVsc2UgaWYgKGMpCi0JCWl0di0+aTJjX2NsaWVudHNbaSsrXSA9IGM7Ci0JcmV0dXJuIDA7CisJaWYgKHNkKQorCQlzZC0+Z3JwX2lkID0gMSA8PCBpZHg7CisJcmV0dXJuIHNkID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGF0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0cnVjdCB2NGwyX3N1YmRldiAqaXZ0dl9maW5kX2h3KHN0cnVjdCBpdnR2ICppdHYsIHUzMiBodykKIHsKLQlyZXR1cm4gMDsKLX0KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAotc3RhdGljIGludCBkZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKLQotCUlWVFZfREVCVUdfSTJDKCJpMmMgY2xpZW50IGRldGFjaFxuIik7Ci0JZm9yIChpID0gMDsgaSA8IEkyQ19DTElFTlRTX01BWDsgaSsrKSB7Ci0JCWlmIChpdHYtPmkyY19jbGllbnRzW2ldID09IGNsaWVudCkgewotCQkJaXR2LT5pMmNfY2xpZW50c1tpXSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZpdHYtPmRldmljZS5sb2NrKTsKKwl2NGwyX2RldmljZV9mb3JfZWFjaF9zdWJkZXYoc2QsICZpdHYtPmRldmljZSkgeworCQlpZiAoc2QtPmdycF9pZCA9PSBodykgeworCQkJcmVzdWx0ID0gc2Q7CiAJCQlicmVhazsKIAkJfQogCX0KLQlJVlRWX0RFQlVHX0kyQygiaTJjIGRldGFjaCBbY2xpZW50PSVzLCVzXVxuIiwKLQkJICAgY2xpZW50LT5uYW1lLCAoaSA8IEkyQ19DTElFTlRTX01BWCkgPyAib2siIDogImZhaWxlZCIpOwotCi0JcmV0dXJuIDA7CisJc3Bpbl91bmxvY2soJml0di0+ZGV2aWNlLmxvY2spOworCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFNldCB0aGUgc2VyaWFsIGNsb2NrIGxpbmUgdG8gdGhlIGRlc2lyZWQgc3RhdGUgKi8KQEAgLTQ5NCw3ICs0NzIsOCBAQAogICAgaW50ZXJ2ZW5pbmcgc3RvcCBjb25kaXRpb24gKi8KIHN0YXRpYyBpbnQgaXZ0dl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQogewotCXN0cnVjdCBpdnR2ICppdHYgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKmRydiA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOworCXN0cnVjdCBpdnR2ICppdHYgPSB0b19pdnR2KGRydik7CiAJaW50IHJldHZhbDsKIAlpbnQgaTsKIApAQCAtNTMwLDggKzUwOSw2IEBACiAJLmlkID0gSTJDX0hXX0JfQ1gyMzQxWCwKIAkuYWxnbyA9ICZpdnR2X2FsZ28sCiAJLmFsZ29fZGF0YSA9IE5VTEwsCQkJLyogZmlsbGVkIGZyb20gdGVtcGxhdGUgKi8KLQkuY2xpZW50X3JlZ2lzdGVyID0gYXR0YWNoX2luZm9ybSwKLQkuY2xpZW50X3VucmVnaXN0ZXIgPSBkZXRhY2hfaW5mb3JtLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtNTgzLDggKzU2MCw2IEBACiAJLmlkID0gSTJDX0hXX0JfQ1gyMzQxWCwKIAkuYWxnbyA9IE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIHNldCBieSBpMmMtYWxnby1iaXQgKi8KIAkuYWxnb19kYXRhID0gTlVMTCwgICAgICAgICAgICAgIC8qIGZpbGxlZCBmcm9tIHRlbXBsYXRlICovCi0JLmNsaWVudF9yZWdpc3RlciA9IGF0dGFjaF9pbmZvcm0sCi0JLmNsaWVudF91bnJlZ2lzdGVyID0gZGV0YWNoX2luZm9ybSwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTYwMSwxNjAgKzU3Niw2IEBACiAJLm5hbWUgPSAiaXZ0diBpbnRlcm5hbCIsCiB9OwogCi1pbnQgaXZ0dl9jYWxsX2kyY19jbGllbnQoc3RydWN0IGl2dHYgKml0diwgaW50IGFkZHIsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCWludCByZXR2YWw7Ci0JaW50IGk7Ci0KLQlJVlRWX0RFQlVHX0kyQygiY2FsbF9pMmNfY2xpZW50IGFkZHI9JTAyeFxuIiwgYWRkcik7Ci0JZm9yIChpID0gMDsgaSA8IEkyQ19DTElFTlRTX01BWDsgaSsrKSB7Ci0JCWNsaWVudCA9IGl0di0+aTJjX2NsaWVudHNbaV07Ci0JCWlmIChjbGllbnQgPT0gTlVMTCB8fCBjbGllbnQtPmRyaXZlciA9PSBOVUxMIHx8Ci0JCSAgICBjbGllbnQtPmRyaXZlci0+Y29tbWFuZCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChhZGRyID09IGNsaWVudC0+YWRkcikgewotCQkJcmV0dmFsID0gY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LCBjbWQsIGFyZyk7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JfQotCWlmIChjbWQgIT0gVklESU9DX0dfQ0hJUF9JREVOVCkKLQkJSVZUVl9FUlIoImkyYyBhZGRyIDB4JTAyeCBub3QgZm91bmQgZm9yIGNvbW1hbmQgMHgleFxuIiwgYWRkciwgY21kKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotLyogRmluZCB0aGUgaTJjIGRldmljZSBiYXNlZCBvbiB0aGUgZHJpdmVyIElEIGFuZCByZXR1cm4KLSAgIGl0cyBpMmMgYWRkcmVzcyBvciAtRU5PREVWIGlmIG5vIG1hdGNoaW5nIGRldmljZSB3YXMgZm91bmQuICovCi1zdGF0aWMgaW50IGl2dHZfaTJjX2lkX2FkZHIoc3RydWN0IGl2dHYgKml0diwgdTMyIGlkKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JaW50IHJldHZhbCA9IC1FTk9ERVY7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSTJDX0NMSUVOVFNfTUFYOyBpKyspIHsKLQkJY2xpZW50ID0gaXR2LT5pMmNfY2xpZW50c1tpXTsKLQkJaWYgKGNsaWVudCA9PSBOVUxMIHx8IGNsaWVudC0+ZHJpdmVyID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKGlkID09IGNsaWVudC0+ZHJpdmVyLT5pZCkgewotCQkJcmV0dmFsID0gY2xpZW50LT5hZGRyOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogRmluZCB0aGUgaTJjIGRldmljZSBuYW1lIG1hdGNoaW5nIHRoZSBEUklWRVJJRCAqLwotc3RhdGljIGNvbnN0IGNoYXIgKml2dHZfaTJjX2lkX25hbWUodTMyIGlkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfZHJpdmVyaWRzKTsgaSsrKQotCQlpZiAoaHdfZHJpdmVyaWRzW2ldID09IGlkKQotCQkJcmV0dXJuIGh3X2RldmljZW5hbWVzW2ldOwotCXJldHVybiAidW5rbm93biBkZXZpY2UiOwotfQotCi0vKiBGaW5kIHRoZSBpMmMgZGV2aWNlIG5hbWUgbWF0Y2hpbmcgdGhlIElWVFZfSFdfIGZsYWcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICppdnR2X2kyY19od19uYW1lKHUzMiBodykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3X2RyaXZlcmlkcyk7IGkrKykKLQkJaWYgKDEgPDwgaSA9PSBodykKLQkJCXJldHVybiBod19kZXZpY2VuYW1lc1tpXTsKLQlyZXR1cm4gInVua25vd24gZGV2aWNlIjsKLX0KLQotLyogRmluZCB0aGUgaTJjIGRldmljZSBtYXRjaGluZyB0aGUgSVZUVl9IV18gZmxhZyBhbmQgcmV0dXJuCi0gICBpdHMgaTJjIGFkZHJlc3Mgb3IgLUVOT0RFViBpZiBubyBtYXRjaGluZyBkZXZpY2Ugd2FzIGZvdW5kLiAqLwotaW50IGl2dHZfaTJjX2h3X2FkZHIoc3RydWN0IGl2dHYgKml0diwgdTMyIGh3KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfZHJpdmVyaWRzKTsgaSsrKQotCQlpZiAoMSA8PCBpID09IGh3KQotCQkJcmV0dXJuIGl2dHZfaTJjX2lkX2FkZHIoaXR2LCBod19kcml2ZXJpZHNbaV0pOwotCXJldHVybiAtRU5PREVWOwotfQotCi0vKiBDYWxscyBpMmMgZGV2aWNlIGJhc2VkIG9uIElWVFZfSFdfIGZsYWcuIElmIGh3ID09IDAsIHRoZW4gZG8gbm90aGluZy4KLSAgIElmIGh3ID09IElWVFZfSFdfR1BJTyB0aGVuIGNhbGwgdGhlIGdwaW8gaGFuZGxlci4gKi8KLWludCBpdnR2X2kyY19odyhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgYWRkcjsKLQotCWlmIChodyA9PSBJVlRWX0hXX0dQSU8pCi0JCXJldHVybiBpdnR2X2dwaW8oaXR2LCBjbWQsIGFyZyk7Ci0JaWYgKGh3ID09IDApCi0JCXJldHVybiAwOwotCi0JYWRkciA9IGl2dHZfaTJjX2h3X2FkZHIoaXR2LCBodyk7Ci0JaWYgKGFkZHIgPCAwKSB7Ci0JCUlWVFZfRVJSKCJpMmMgaGFyZHdhcmUgMHglMDh4ICglcykgbm90IGZvdW5kIGZvciBjb21tYW5kIDB4JXhcbiIsCi0JCQkgICAgICAgaHcsIGl2dHZfaTJjX2h3X25hbWUoaHcpLCBjbWQpOwotCQlyZXR1cm4gYWRkcjsKLQl9Ci0JcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgYWRkciwgY21kLCBhcmcpOwotfQotCi0vKiBDYWxscyBpMmMgZGV2aWNlIGJhc2VkIG9uIEkyQyBkcml2ZXIgSUQuICovCi1pbnQgaXZ0dl9pMmNfaWQoc3RydWN0IGl2dHYgKml0diwgdTMyIGlkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IGFkZHI7Ci0KLQlhZGRyID0gaXZ0dl9pMmNfaWRfYWRkcihpdHYsIGlkKTsKLQlpZiAoYWRkciA8IDApIHsKLQkJaWYgKGNtZCAhPSBWSURJT0NfR19DSElQX0lERU5UKQotCQkJSVZUVl9FUlIoImkyYyBJRCAweCUwOHggKCVzKSBub3QgZm91bmQgZm9yIGNvbW1hbmQgMHgleFxuIiwKLQkJCQlpZCwgaXZ0dl9pMmNfaWRfbmFtZShpZCksIGNtZCk7Ci0JCXJldHVybiBhZGRyOwotCX0KLQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCBhZGRyLCBjbWQsIGFyZyk7Ci19Ci0KLWludCBpdnR2X2N4MjU4NDAoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIElWVFZfQ1gyNTg0MF9JMkNfQUREUiwgY21kLCBhcmcpOwotfQotCi1pbnQgaXZ0dl9zYWE3MTE1KHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCBJVlRWX1NBQTcxMTVfSTJDX0FERFIsIGNtZCwgYXJnKTsKLX0KLQotaW50IGl2dHZfc2FhNzEyNyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgSVZUVl9TQUE3MTI3X0kyQ19BRERSLCBjbWQsIGFyZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl2dHZfc2FhNzEyNyk7Ci0KLWludCBpdnR2X3NhYTcxN3goc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIElWVFZfU0FBNzE3eF9JMkNfQUREUiwgY21kLCBhcmcpOwotfQotCi1pbnQgaXZ0dl91cGQ2NDAzMWEoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIElWVFZfVVBENjQwMzFBX0kyQ19BRERSLCBjbWQsIGFyZyk7Ci19Ci0KLWludCBpdnR2X3VwZDY0MDgzKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCBJVlRWX1VQRDY0MDgzX0kyQ19BRERSLCBjbWQsIGFyZyk7Ci19Ci0KLS8qIGJyb2FkY2FzdCBjbWQgZm9yIGFsbCBJMkMgY2xpZW50cyBhbmQgZm9yIHRoZSBncGlvIHN1YnN5c3RlbSAqLwotdm9pZCBpdnR2X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWlmIChpdHYtPmkyY19hZGFwLmFsZ28gPT0gTlVMTCkgewotCQlJVlRWX0VSUigiQWRhcHRlciBpcyBub3Qgc2V0Iik7Ci0JCXJldHVybjsKLQl9Ci0JaTJjX2NsaWVudHNfY29tbWFuZCgmaXR2LT5pMmNfYWRhcCwgY21kLCBhcmcpOwotCWlmIChpdHYtPmh3X2ZsYWdzICYgSVZUVl9IV19HUElPKQotCQlpdnR2X2dwaW8oaXR2LCBjbWQsIGFyZyk7Ci19Ci0KIC8qIGluaXQgKyByZWdpc3RlciBpMmMgYWxnby1iaXQgYWRhcHRlciAqLwogaW50IGluaXRfaXZ0dl9pMmMoc3RydWN0IGl2dHYgKml0dikKIHsKQEAgLTc2MywxMCArNTg0LDkgQEAKIAkvKiBTYW5pdHkgY2hlY2tzIGZvciB0aGUgSTJDIGhhcmR3YXJlIGFycmF5cy4gVGhleSBtdXN0IGJlIHRoZQogCSAqIHNhbWUgc2l6ZSBhbmQgR1BJTyBtdXN0IGJlIHRoZSBsYXN0IGVudHJ5LgogCSAqLwotCWlmIChBUlJBWV9TSVpFKGh3X2RyaXZlcmlkcykgIT0gQVJSQVlfU0laRShod19hZGRycykgfHwKLQkgICAgQVJSQVlfU0laRShod19kZXZpY2VuYW1lcykgIT0gQVJSQVlfU0laRShod19hZGRycykgfHwKLQkgICAgSVZUVl9IV19HUElPICE9ICgxIDw8IChBUlJBWV9TSVpFKGh3X2FkZHJzKSAtIDEpKSB8fAotCSAgICBod19kcml2ZXJpZHNbQVJSQVlfU0laRShod19hZGRycykgLSAxXSkgeworCWlmIChBUlJBWV9TSVpFKGh3X2RldmljZW5hbWVzKSAhPSBBUlJBWV9TSVpFKGh3X2FkZHJzKSB8fAorCSAgICBBUlJBWV9TSVpFKGh3X2RldmljZW5hbWVzKSAhPSBBUlJBWV9TSVpFKGh3X21vZHVsZXMpIHx8CisJICAgIElWVFZfSFdfR1BJTyAhPSAoMSA8PCAoQVJSQVlfU0laRShod19hZGRycykgLSAxKSkpIHsKIAkJSVZUVl9FUlIoIk1pc21hdGNoZWQgSTJDIGhhcmR3YXJlIGFycmF5c1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTc4Myw4ICs2MDMsOCBAQAogCWl0di0+aTJjX2FkYXAuYWxnb19kYXRhID0gJml0di0+aTJjX2FsZ287CiAKIAlzcHJpbnRmKGl0di0+aTJjX2FkYXAubmFtZSArIHN0cmxlbihpdHYtPmkyY19hZGFwLm5hbWUpLCAiICMlZCIsCi0JCWl0di0+bnVtKTsKLQlpMmNfc2V0X2FkYXBkYXRhKCZpdHYtPmkyY19hZGFwLCBpdHYpOworCQlpdHYtPmluc3RhbmNlKTsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpdHYtPmkyY19hZGFwLCAmaXR2LT5kZXZpY2UpOwogCiAJbWVtY3B5KCZpdHYtPmkyY19jbGllbnQsICZpdnR2X2kyY19jbGllbnRfdGVtcGxhdGUsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuaAppbmRleCAwMjI5NzhjLi4zOTY5MjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuaApAQCAtMjEsMTkgKzIxLDggQEAKICNpZm5kZWYgSVZUVl9JMkNfSAogI2RlZmluZSBJVlRWX0kyQ19ICiAKLWludCBpdnR2X2N4MjU4NDAoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBpdnR2X3NhYTcxMTUoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBpdnR2X3NhYTcxMjcoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBpdnR2X3NhYTcxN3goc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBpdnR2X3VwZDY0MDMxYShzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwotaW50IGl2dHZfdXBkNjQwODMoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLQotaW50IGl2dHZfaTJjX2h3X2FkZHIoc3RydWN0IGl2dHYgKml0diwgdTMyIGh3KTsKLWludCBpdnR2X2kyY19odyhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci1pbnQgaXZ0dl9pMmNfaWQoc3RydWN0IGl2dHYgKml0diwgdTMyIGlkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwotaW50IGl2dHZfY2FsbF9pMmNfY2xpZW50KHN0cnVjdCBpdnR2ICppdHYsIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwotdm9pZCBpdnR2X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIGludCBpdnR2X2kyY19yZWdpc3RlcihzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpZHgpOworc3RydWN0IHY0bDJfc3ViZGV2ICppdnR2X2ZpbmRfaHcoc3RydWN0IGl2dHYgKml0diwgdTMyIGh3KTsKIAogLyogaW5pdCArIHJlZ2lzdGVyIGkyYyBhbGdvLWJpdCBhZGFwdGVyICovCiBpbnQgaW5pdF9pdnR2X2kyYyhzdHJ1Y3QgaXZ0diAqaXR2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCmluZGV4IDRiYWUzOGQuLmNkOTkwYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfR19GTVQsIGZtdCk7CisJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19mbXQsIGZtdCk7CiAJdmJpZm10LT5zZXJ2aWNlX3NldCA9IGl2dHZfZ2V0X3NlcnZpY2Vfc2V0KHZiaWZtdCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01ODEsNyArNTgxLDcgQEAKIAlwLT5oZWlnaHQgPSBoOwogCWlmIChwLT52aWRlb19lbmNvZGluZyA9PSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xKQogCQlmbXQtPmZtdC5waXgud2lkdGggLz0gMjsKLQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCBmbXQpOworCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIHNfZm10LCBmbXQpOwogCXJldHVybiBpdnR2X2dfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGZtdCk7CiB9CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCWl0di0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgPSAwOwogCWl0di0+dmJpLmluLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwotCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfU19GTVQsIGZtdCk7CisJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19mbXQsIGZtdCk7CiAJcmV0dXJuIGl2dHZfZ19mbXRfdmJpX2NhcChmaWxlLCBmaCwgZm10KTsKIH0KIApAQCAtNjExLDcgKzYxMSw3IEBACiAJaWYgKGl2dHZfcmF3X3ZiaShpdHYpICYmIGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwKQogCQlyZXR1cm4gLUVCVVNZOwogCWl0di0+dmJpLmluLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRTsKLQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCBmbXQpOworCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIHNfZm10LCBmbXQpOwogCW1lbWNweShpdHYtPnZiaS5zbGljZWRfaW4sIHZiaWZtdCwgc2l6ZW9mKCppdHYtPnZiaS5zbGljZWRfaW4pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY4NSwxOCArNjg1LDE3IEBACiAJCQljaGlwLT5pZGVudCA9IGl0di0+aGFzX2N4MjM0MTUgPyBWNEwyX0lERU5UX0NYMjM0MTUgOiBWNEwyX0lERU5UX0NYMjM0MTY7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoY2hpcC0+bWF0Y2hfdHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUikKLQkJcmV0dXJuIGl2dHZfaTJjX2lkKGl0diwgY2hpcC0+bWF0Y2hfY2hpcCwgVklESU9DX0dfQ0hJUF9JREVOVCwgY2hpcCk7Ci0JaWYgKGNoaXAtPm1hdGNoX3R5cGUgPT0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSKQotCQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCBjaGlwLT5tYXRjaF9jaGlwLCBWSURJT0NfR19DSElQX0lERU5ULCBjaGlwKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2hpcC0+bWF0Y2hfdHlwZSAhPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUiAmJgorCSAgICBjaGlwLT5tYXRjaF90eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogVE9ETzogaXMgdGhpcyBjb3JyZWN0PyAqLworCXJldHVybiBpdnR2X2NhbGxfYWxsX2VycihpdHYsIGNvcmUsIGdfY2hpcF9pZGVudCwgY2hpcCk7CiB9CiAKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiBzdGF0aWMgaW50IGl2dHZfaXR2YyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZ3MgPSBhcmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2xhdGlsZSB1OCBfX2lvbWVtICpyZWdfc3RhcnQ7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC03MTEsMTIgKzcxMCwxMCBAQAogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXZ0dl9jYXJkc19sb2NrLCBmbGFncyk7CiAJaWYgKGNtZCA9PSBWSURJT0NfREJHX0dfUkVHSVNURVIpCiAJCXJlZ3MtPnZhbCA9IHJlYWRsKHJlZ3MtPnJlZyArIHJlZ19zdGFydCk7CiAJZWxzZQogCQl3cml0ZWwocmVncy0+dmFsLCByZWdzLT5yZWcgKyByZWdfc3RhcnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml2dHZfY2FyZHNfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC03MjYsOSArNzIzLDEwIEBACiAKIAlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QocmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQogCQlyZXR1cm4gaXZ0dl9pdHZjKGl0diwgVklESU9DX0RCR19HX1JFR0lTVEVSLCByZWcpOwotCWlmIChyZWctPm1hdGNoX3R5cGUgPT0gVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIpCi0JCXJldHVybiBpdnR2X2kyY19pZChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgVklESU9DX0RCR19HX1JFR0lTVEVSLCByZWcpOwotCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgVklESU9DX0RCR19HX1JFR0lTVEVSLCByZWcpOworCS8qIFRPRE86IHN1YmRldiBlcnJvcnMgc2hvdWxkIG5vdCBiZSBpZ25vcmVkLCB0aGlzIHNob3VsZCBiZWNvbWUgYQorCSAgIHN1YmRldiBoZWxwZXIgZnVuY3Rpb24uICovCisJaXZ0dl9jYWxsX2FsbChpdHYsIGNvcmUsIGdfcmVnaXN0ZXIsIHJlZyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaXZ0dl9zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKQEAgLTczNyw5ICs3MzUsMTAgQEAKIAogCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdChyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCiAJCXJldHVybiBpdnR2X2l0dmMoaXR2LCBWSURJT0NfREJHX1NfUkVHSVNURVIsIHJlZyk7Ci0JaWYgKHJlZy0+bWF0Y2hfdHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUikKLQkJcmV0dXJuIGl2dHZfaTJjX2lkKGl0diwgcmVnLT5tYXRjaF9jaGlwLCBWSURJT0NfREJHX1NfUkVHSVNURVIsIHJlZyk7Ci0JcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgcmVnLT5tYXRjaF9jaGlwLCBWSURJT0NfREJHX1NfUkVHSVNURVIsIHJlZyk7CisJLyogVE9ETzogc3ViZGV2IGVycm9ycyBzaG91bGQgbm90IGJlIGlnbm9yZWQsIHRoaXMgc2hvdWxkIGJlY29tZSBhCisJICAgc3ViZGV2IGhlbHBlciBmdW5jdGlvbi4gKi8KKwlpdnR2X2NhbGxfYWxsKGl0diwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC04ODQsMTIgKzg4Myw2IEBACiAKIAlzdHJlYW10eXBlID0gaWQtPnR5cGU7CiAKLQlpZiAoaXZ0dl9kZWJ1ZyAmIElWVFZfREJHRkxHX0lPQ1RMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIml2dHYlZCBpb2N0bDogIiwgaXR2LT5udW0pOwotCQkvKiBTaG91bGQgYmUgcmVwbGFjZWQgKi8KLQkJLyogdjRsX3ByaW50a19pb2N0bChWSURJT0NfU19DUk9QKTsgKi8KLQl9Ci0KIAlpZiAoY3JvcC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAmJgogCSAgICAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKIAkJaWYgKHN0cmVhbXR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWKSB7CkBAIC0xMDUwLDcgKzEwNDMsNyBAQAogCWl0di0+YWN0aXZlX291dHB1dCA9IG91dHA7CiAJcm91dGUuaW5wdXQgPSBTQUE3MTI3X0lOUFVUX1RZUEVfTk9STUFMOwogCXJvdXRlLm91dHB1dCA9IGl0di0+Y2FyZC0+dmlkZW9fb3V0cHV0c1tvdXRwXS52aWRlb19vdXRwdXQ7Ci0JaXZ0dl9zYWE3MTI3KGl0diwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CisJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19TQUE3MTI3LCB2aWRlbywgc19yb3V0aW5nLCAmcm91dGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDYyLDcgKzEwNTUsNyBAQAogCWlmICh2Zi0+dHVuZXIgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfR19GUkVRVUVOQ1ksIHZmKTsKKwlpdnR2X2NhbGxfYWxsKGl0diwgdHVuZXIsIGdfZnJlcXVlbmN5LCB2Zik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNzUsNyArMTA2OCw3IEBACiAKIAlpdnR2X211dGUoaXR2KTsKIAlJVlRWX0RFQlVHX0lORk8oInY0bDIgaW9jdGw6IHNldCBmcmVxdWVuY3kgJWRcbiIsIHZmLT5mcmVxdWVuY3kpOwotCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19TX0ZSRVFVRU5DWSwgdmYpOworCWl2dHZfY2FsbF9hbGwoaXR2LCB0dW5lciwgc19mcmVxdWVuY3ksIHZmKTsKIAlpdnR2X3VubXV0ZShpdHYpOwogCXJldHVybiAwOwogfQpAQCAtMTEyMywxNCArMTExNiwxNCBAQAogCUlWVFZfREVCVUdfSU5GTygiU3dpdGNoaW5nIHN0YW5kYXJkIHRvICVsbHguXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWl0di0+c3RkKTsKIAogCS8qIFR1bmVyICovCi0JaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX1NfU1RELCAmaXR2LT5zdGQpOworCWl2dHZfY2FsbF9hbGwoaXR2LCB0dW5lciwgc19zdGQsIGl0di0+c3RkKTsKIAogCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CiAJCS8qIHNldCBkaXNwbGF5IHN0YW5kYXJkICovCiAJCWl0di0+c3RkX291dCA9ICpzdGQ7CiAJCWl0di0+aXNfb3V0XzYwaHogPSBpdHYtPmlzXzYwaHo7CiAJCWl0di0+aXNfb3V0XzUwaHogPSBpdHYtPmlzXzUwaHo7Ci0JCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19JTlRfU19TVERfT1VUUFVULCAmaXR2LT5zdGRfb3V0KTsKKwkJaXZ0dl9jYWxsX2FsbChpdHYsIHZpZGVvLCBzX3N0ZF9vdXRwdXQsIGl0di0+c3RkX291dCk7CiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9TVEFOREFSRCwgMSwgaXR2LT5pc19vdXRfNTBoeik7CiAJCWl0di0+bWFpbl9yZWN0LmxlZnQgPSBpdHYtPm1haW5fcmVjdC50b3AgPSAwOwogCQlpdHYtPm1haW5fcmVjdC53aWR0aCA9IDcyMDsKQEAgLTExNTQsNyArMTE0Nyw3IEBACiAJaWYgKHZ0LT5pbmRleCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19TX1RVTkVSLCB2dCk7CisJaXZ0dl9jYWxsX2FsbChpdHYsIHR1bmVyLCBzX3R1bmVyLCB2dCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNjYsNyArMTE1OSw3IEBACiAJaWYgKHZ0LT5pbmRleCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19HX1RVTkVSLCB2dCk7CisJaXZ0dl9jYWxsX2FsbChpdHYsIHR1bmVyLCBnX3R1bmVyLCB2dCk7CiAKIAlpZiAodGVzdF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncykpIHsKIAkJc3RybGNweSh2dC0+bmFtZSwgIml2dHYgUmFkaW8gVHVuZXIiLCBzaXplb2YodnQtPm5hbWUpKTsKQEAgLTE0NDQsMTQgKzE0MzcsMTUgQEAKIAlzdHJ1Y3QgdjRsMl9hdWRpbyBhdWRpbjsKIAlpbnQgaTsKIAotCUlWVFZfSU5GTygiPT09PT09PT09PT09PT09PT0gIFNUQVJUIFNUQVRVUyBDQVJEICMlZCAgPT09PT09PT09PT09PT09PT1cbiIsIGl0di0+bnVtKTsKKwlJVlRWX0lORk8oIj09PT09PT09PT09PT09PT09ICBTVEFSVCBTVEFUVVMgQ0FSRCAjJWQgID09PT09PT09PT09PT09PT09XG4iLAorCQkgICAgICAgaXR2LT5pbnN0YW5jZSk7CiAJSVZUVl9JTkZPKCJWZXJzaW9uOiAlcyBDYXJkOiAlc1xuIiwgSVZUVl9WRVJTSU9OLCBpdHYtPmNhcmRfbmFtZSk7CiAJaWYgKGl0di0+aHdfZmxhZ3MgJiBJVlRWX0hXX1RWRUVQUk9NKSB7CiAJCXN0cnVjdCB0dmVlcHJvbSB0djsKIAogCQlpdnR2X3JlYWRfZWVwcm9tKGl0diwgJnR2KTsKIAl9Ci0JaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX0xPR19TVEFUVVMsIE5VTEwpOworCWl2dHZfY2FsbF9hbGwoaXR2LCBjb3JlLCBsb2dfc3RhdHVzKTsKIAlpdnR2X2dldF9pbnB1dChpdHYsIGl0di0+YWN0aXZlX2lucHV0LCAmdmlkaW4pOwogCWl2dHZfZ2V0X2F1ZGlvX2lucHV0KGl0diwgaXR2LT5hdWRpb19pbnB1dCwgJmF1ZGluKTsKIAlJVlRWX0lORk8oIlZpZGVvIElucHV0OiAgJXNcbiIsIHZpZGluLm5hbWUpOwpAQCAtMTUxOCw3ICsxNTEyLDcgQEAKIAl9CiAJSVZUVl9JTkZPKCJUdW5lcjogICVzXG4iLAogCQl0ZXN0X2JpdChJVlRWX0ZfSV9SQURJT19VU0VSLCAmaXR2LT5pX2ZsYWdzKSA/ICJSYWRpbyIgOiAiVFYiKTsKLQljeDIzNDF4X2xvZ19zdGF0dXMoJml0di0+cGFyYW1zLCBpdHYtPm5hbWUpOworCWN4MjM0MXhfbG9nX3N0YXR1cygmaXR2LT5wYXJhbXMsIGl0di0+ZGV2aWNlLm5hbWUpOwogCUlWVFZfSU5GTygiU3RhdHVzIGZsYWdzOiAgICAweCUwOGx4XG4iLCBpdHYtPmlfZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBJVlRWX01BWF9TVFJFQU1TOyBpKyspIHsKIAkJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpXTsKQEAgLTE1MzAsOCArMTUyNCwxMSBAQAogCQkJCShzLT5idWZmZXJzICogcy0+YnVmX3NpemUpIC8gMTAyNCwgcy0+YnVmZmVycyk7CiAJfQogCi0JSVZUVl9JTkZPKCJSZWFkIE1QRy9WQkk6ICVsbGQvJWxsZCBieXRlc1xuIiwgKGxvbmcgbG9uZylpdHYtPm1wZ19kYXRhX3JlY2VpdmVkLCAobG9uZyBsb25nKWl0di0+dmJpX2RhdGFfaW5zZXJ0ZWQpOwotCUlWVFZfSU5GTygiPT09PT09PT09PT09PT09PT09ICBFTkQgU1RBVFVTIENBUkQgIyVkICA9PT09PT09PT09PT09PT09PT1cbiIsIGl0di0+bnVtKTsKKwlJVlRWX0lORk8oIlJlYWQgTVBHL1ZCSTogJWxsZC8lbGxkIGJ5dGVzXG4iLAorCQkJKGxvbmcgbG9uZylpdHYtPm1wZ19kYXRhX3JlY2VpdmVkLAorCQkJKGxvbmcgbG9uZylpdHYtPnZiaV9kYXRhX2luc2VydGVkKTsKKwlJVlRWX0lORk8oIj09PT09PT09PT09PT09PT09PSAgRU5EIFNUQVRVUyBDQVJEICMlZCAgPT09PT09PT09PT09PT09PT09XG4iLAorCQkJaXR2LT5pbnN0YW5jZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MzYsNyArMTczMyw3IEBACiAJY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzogewogCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKIAotCQlpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW8sIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HLCByb3V0ZSk7CisJCWl2dHZfY2FsbF9odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW8sIGF1ZGlvLCBzX3JvdXRpbmcsIHJvdXRlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNzQ2LDcgKzE3NDMsNyBAQAogCQlpZiAoKHZhbCA9PSAwICYmIGl0di0+b3B0aW9ucy5uZXdpMmMpIHx8ICh2YWwgJiAweDAxKSkKIAkJCWl2dHZfcmVzZXRfaXJfZ3BpbyhpdHYpOwogCQlpZiAodmFsICYgMHgwMikKLQkJCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBjbWQsIE5VTEwpOworCQkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCBjb3JlLCByZXNldCwgMCk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtcm91dGluZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtcm91dGluZy5jCmluZGV4IDA1NTY0OTEuLjNmZDMwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXJvdXRpbmcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1yb3V0aW5nLmMKQEAgLTQ3LDEzICs0NywxMyBAQAogCXJvdXRlLm91dHB1dCA9IDA7CiAJaWYgKGl0di0+Y2FyZC0+aHdfbXV4ZXIgJiBJVlRWX0hXX001Mjc5MCkKIAkJcm91dGUub3V0cHV0ID0gTTUyNzkwX09VVF9TVEVSRU87Ci0JaXZ0dl9pMmNfaHcoaXR2LCBpdHYtPmNhcmQtPmh3X211eGVyLCBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORywgJnJvdXRlKTsKKwl2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfbXV4ZXIsIGF1ZGlvLCBzX3JvdXRpbmcsICZyb3V0ZSk7CiAKIAlyb3V0ZS5pbnB1dCA9IGluLT5hdWRpb19pbnB1dDsKIAlyb3V0ZS5vdXRwdXQgPSAwOwogCWlmIChpdHYtPmNhcmQtPmh3X2F1ZGlvICYgSVZUVl9IV19NU1AzNFhYKQogCQlyb3V0ZS5vdXRwdXQgPSBNU1BfT1VUUFVUKE1TUF9TQ19JTl9EU1BfU0NBUlQxKTsKLQlpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW8sIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HLCAmcm91dGUpOworCWl2dHZfY2FsbF9odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW8sIGF1ZGlvLCBzX3JvdXRpbmcsICZyb3V0ZSk7CiB9CiAKIC8qIFNlbGVjdHMgdGhlIHZpZGVvIGlucHV0IGFuZCBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CkBAIC02Niw3ICs2Niw3IEBACiAKIAlyb3V0ZS5pbnB1dCA9IGl0di0+Y2FyZC0+dmlkZW9faW5wdXRzW2lucF0udmlkZW9faW5wdXQ7CiAJcm91dGUub3V0cHV0ID0gMDsKLQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CisJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19yb3V0aW5nLCAmcm91dGUpOwogCiAJdHlwZSA9IGl0di0+Y2FyZC0+dmlkZW9faW5wdXRzW2lucF0udmlkZW9fdHlwZTsKIApAQCAtNzksNyArNzksNyBAQAogCX0KIAogCWlmIChpdHYtPmNhcmQtPmh3X3ZpZGVvICYgSVZUVl9IV19HUElPKQotCQlpdnR2X2dwaW8oaXR2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKKwkJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19HUElPLCB2aWRlbywgc19yb3V0aW5nLCAmcm91dGUpOwogCiAJaWYgKGl0di0+Y2FyZC0+aHdfdmlkZW8gJiBJVlRWX0hXX1VQRDY0MDMxQSkgewogCQlpZiAodHlwZSA9PSBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSIHx8CkBAIC05Miw3ICs5Miw3IEBACiAJCX0KIAkJcm91dGUuaW5wdXQgfD0gaXR2LT5jYXJkLT5ncl9jb25maWc7CiAKLQkJaXZ0dl91cGQ2NDAzMWEoaXR2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKKwkJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19VUEQ2NDAzMUEsIHZpZGVvLCBzX3JvdXRpbmcsICZyb3V0ZSk7CiAJfQogCiAJaWYgKGl0di0+Y2FyZC0+aHdfdmlkZW8gJiBJVlRWX0hXX1VQRDY0MDhYKSB7CkBAIC0xMTAsNiArMTEwLDYgQEAKIAkJICAgIHJvdXRlLmlucHV0IHw9IFVQRDY0MDgzX0VYVF9ZX0FEQzsKIAkJICB9CiAJCX0KLQkJaXZ0dl91cGQ2NDA4MyhpdHYsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOworCQlpdnR2X2NhbGxfaHcoaXR2LCBJVlRWX0hXX1VQRDY0MDhYLCB2aWRlbywgc19yb3V0aW5nLCAmcm91dGUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwppbmRleCA5YjdhYTc5Li5mNzdkNzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIHsKIAlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW3R5cGVdOwogCWludCBudW1fb2Zmc2V0ID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5udW1fb2Zmc2V0OwotCWludCBudW0gPSBpdHYtPm51bSArIGl2dHZfZmlyc3RfbWlub3IgKyBudW1fb2Zmc2V0OworCWludCBudW0gPSBpdHYtPmluc3RhbmNlICsgaXZ0dl9maXJzdF9taW5vciArIG51bV9vZmZzZXQ7CiAKIAkvKiBUaGVzZSBmb3VyIGZpZWxkcyBhcmUgYWx3YXlzIGluaXRpYWxpemVkLiBJZiB2NGwyZGV2ID09IE5VTEwsIHRoZW4KIAkgICB0aGlzIHN0cmVhbSBpcyBub3QgaW4gdXNlLiBJbiB0aGF0IGNhc2Ugbm8gb3RoZXIgZmllbGRzIGJ1dCB0aGVzZQpAQCAtMjA1LDExICsyMDUsMTEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc25wcmludGYocy0+djRsMmRldi0+bmFtZSwgc2l6ZW9mKHMtPnY0bDJkZXYtPm5hbWUpLCAiaXZ0diVkICVzIiwKLQkJCWl0di0+bnVtLCBzLT5uYW1lKTsKKwlzbnByaW50ZihzLT52NGwyZGV2LT5uYW1lLCBzaXplb2Yocy0+djRsMmRldi0+bmFtZSksICIlcyAlcyIsCisJCQlpdHYtPmRldmljZS5uYW1lLCBzLT5uYW1lKTsKIAogCXMtPnY0bDJkZXYtPm51bSA9IG51bTsKLQlzLT52NGwyZGV2LT5wYXJlbnQgPSAmaXR2LT5kZXYtPmRldjsKKwlzLT52NGwyZGV2LT52NGwyX2RldiA9ICZpdHYtPmRldmljZTsKIAlzLT52NGwyZGV2LT5mb3BzID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5mb3BzOwogCXMtPnY0bDJkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAlzLT52NGwyZGV2LT50dm5vcm1zID0gVjRMMl9TVERfQUxMOwpAQCAtMjYwLDYgKzI2MCw3IEBACiAJCWlmIChzX21wZy0+djRsMmRldikKIAkJCW51bSA9IHNfbXBnLT52NGwyZGV2LT5udW0gKyBpdnR2X3N0cmVhbV9pbmZvW3R5cGVdLm51bV9vZmZzZXQ7CiAJfQorCXZpZGVvX3NldF9kcnZkYXRhKHMtPnY0bDJkZXYsIHMpOwogCiAJLyogUmVnaXN0ZXIgZGV2aWNlLiBGaXJzdCB0cnkgdGhlIGRlc2lyZWQgbWlub3IsIHRoZW4gYW55IGZyZWUgb25lLiAqLwogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2Uocy0+djRsMmRldiwgdmZsX3R5cGUsIG51bSkpIHsKQEAgLTM0Myw3ICszNDQsNyBAQAogCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NFVF9WQklfTElORSwgNSwgMHhmZmZmICwgMCwgMCwgMCwgMCk7CiAKIAkvKiBzZXR1cCBWQkkgcmVnaXN0ZXJzICovCi0JaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0ZNVCwgJml0di0+dmJpLmluKTsKKwl2NGwyX3N1YmRldl9jYWxsKGl0di0+c2RfdmlkZW8sIHZpZGVvLCBzX2ZtdCwgJml0di0+dmJpLmluKTsKIAogCS8qIGRldGVybWluZSBudW1iZXIgb2YgbGluZXMgYW5kIHRvdGFsIG51bWJlciBvZiBWQkkgYnl0ZXMuCiAJICAgQSByYXcgbGluZSB0YWtlcyAxNDQzIGJ5dGVzOiAyICogNzIwICsgNCBieXRlIGZyYW1lIGhlYWRlciAtIDEKQEAgLTU3NywxMCArNTc4LDEwIEBACiAJCWNsZWFyX2JpdChJVlRWX0ZfSV9FT1MsICZpdHYtPmlfZmxhZ3MpOwogCiAJCS8qIEluaXRpYWxpemUgRGlnaXRpemVyIGZvciBDYXB0dXJlICovCi0JCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfU1RSRUFNT0ZGLCBOVUxMKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19zdHJlYW0sIDApOwogCQlpdnR2X21zbGVlcF90aW1lb3V0KDMwMCwgMSk7CiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX0lOSVRJQUxJWkVfSU5QVVQsIDApOwotCQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NUUkVBTU9OLCBOVUxMKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChpdHYtPnNkX3ZpZGVvLCB2aWRlbywgc19zdHJlYW0sIDEpOwogCX0KIAogCS8qIGJlZ2luX2NhcHR1cmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKaW5kZXggNGEzN2E3ZC4uNWM1ZDFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJpdnR2LWkyYy5oIgogI2luY2x1ZGUgIml2dHYtaW9jdGwuaCIKICNpbmNsdWRlICJpdnR2LXF1ZXVlLmgiCisjaW5jbHVkZSAiaXZ0di1jYXJkcy5oIgogI2luY2x1ZGUgIml2dHYtdmJpLmgiCiAKIHN0YXRpYyB2b2lkIGl2dHZfc2V0X3ZwcyhzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgZW5hYmxlZCkKQEAgLTM3LDcgKzM4LDcgQEAKIAlkYXRhLmRhdGFbOV0gPSBpdHYtPnZiaS52cHNfcGF5bG9hZC5kYXRhWzJdOwogCWRhdGEuZGF0YVsxMF0gPSBpdHYtPnZiaS52cHNfcGF5bG9hZC5kYXRhWzNdOwogCWRhdGEuZGF0YVsxMV0gPSBpdHYtPnZiaS52cHNfcGF5bG9hZC5kYXRhWzRdOwotCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19JTlRfU19WQklfREFUQSwgJmRhdGEpOworCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfdmJpX2RhdGEsICZkYXRhKTsKIH0KIAogc3RhdGljIHZvaWQgaXZ0dl9zZXRfY2Moc3RydWN0IGl2dHYgKml0diwgaW50IG1vZGUsIGNvbnN0IHN0cnVjdCB2YmlfY2MgKmNjKQpAQCAtNTEsMTIgKzUyLDEyIEBACiAJZGF0YS5saW5lID0gKG1vZGUgJiAxKSA/IDIxIDogMDsKIAlkYXRhLmRhdGFbMF0gPSBjYy0+b2RkWzBdOwogCWRhdGEuZGF0YVsxXSA9IGNjLT5vZGRbMV07Ci0JaXZ0dl9zYWE3MTI3KGl0diwgVklESU9DX0lOVF9TX1ZCSV9EQVRBLCAmZGF0YSk7CisJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19TQUE3MTI3LCB2aWRlbywgc192YmlfZGF0YSwgJmRhdGEpOwogCWRhdGEuZmllbGQgPSAxOwogCWRhdGEubGluZSA9IChtb2RlICYgMikgPyAyMSA6IDA7CiAJZGF0YS5kYXRhWzBdID0gY2MtPmV2ZW5bMF07CiAJZGF0YS5kYXRhWzFdID0gY2MtPmV2ZW5bMV07Ci0JaXZ0dl9zYWE3MTI3KGl0diwgVklESU9DX0lOVF9TX1ZCSV9EQVRBLCAmZGF0YSk7CisJaXZ0dl9jYWxsX2h3KGl0diwgSVZUVl9IV19TQUE3MTI3LCB2aWRlbywgc192YmlfZGF0YSwgJmRhdGEpOwogfQogCiBzdGF0aWMgdm9pZCBpdnR2X3NldF93c3Moc3RydWN0IGl2dHYgKml0diwgaW50IGVuYWJsZWQsIGludCBtb2RlKQpAQCAtNzksNyArODAsNyBAQAogCWRhdGEubGluZSA9IGVuYWJsZWQgPyAyMyA6IDA7CiAJZGF0YS5kYXRhWzBdID0gbW9kZSAmIDB4ZmY7CiAJZGF0YS5kYXRhWzFdID0gKG1vZGUgPj4gOCkgJiAweGZmOwotCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19JTlRfU19WQklfREFUQSwgJmRhdGEpOworCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfdmJpX2RhdGEsICZkYXRhKTsKIH0KIAogc3RhdGljIGludCBvZGRfcGFyaXR5KHU4IGMpCkBAIC0zMTMsNyArMzE0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXZiaS5wID0gcCArIDQ7Ci0JCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORSwgJnZiaSk7CisJCXY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIGRlY29kZV92YmlfbGluZSwgJnZiaSk7CiAJCWlmICh2YmkudHlwZSAmJiAhKGxpbmVzICYgKDEgPDwgdmJpLmxpbmUpKSkgewogCQkJbGluZXMgfD0gMSA8PCB2YmkubGluZTsKIAkJCWl0di0+dmJpLnNsaWNlZF9kYXRhW2xpbmVdLmlkID0gdmJpLnR5cGU7CkBAIC00MzcsNyArNDM4LDcgQEAKIAkJCWRhdGEuaWQgPSBWNEwyX1NMSUNFRF9XU1NfNjI1OwogCQkJZGF0YS5maWVsZCA9IDA7CiAKLQkJCWlmIChpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9HX1ZCSV9EQVRBLCAmZGF0YSkgPT0gMCkgeworCQkJaWYgKHY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIGdfdmJpX2RhdGEsICZkYXRhKSA9PSAwKSB7CiAJCQkJaXZ0dl9zZXRfd3NzKGl0diwgMSwgZGF0YS5kYXRhWzBdICYgMHhmKTsKIAkJCQl2aS0+d3NzX21pc3NpbmdfY250ID0gMDsKIAkJCX0gZWxzZSBpZiAodmktPndzc19taXNzaW5nX2NudCA9PSA0KSB7CkBAIC00NTEsMTMgKzQ1MiwxMyBAQAogCiAJCQlkYXRhLmlkID0gVjRMMl9TTElDRURfQ0FQVElPTl81MjU7CiAJCQlkYXRhLmZpZWxkID0gMDsKLQkJCWlmIChpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9HX1ZCSV9EQVRBLCAmZGF0YSkgPT0gMCkgeworCQkJaWYgKHY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIGdfdmJpX2RhdGEsICZkYXRhKSA9PSAwKSB7CiAJCQkJbW9kZSB8PSAxOwogCQkJCWNjLm9kZFswXSA9IGRhdGEuZGF0YVswXTsKIAkJCQljYy5vZGRbMV0gPSBkYXRhLmRhdGFbMV07CiAJCQl9CiAJCQlkYXRhLmZpZWxkID0gMTsKLQkJCWlmIChpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9HX1ZCSV9EQVRBLCAmZGF0YSkgPT0gMCkgeworCQkJaWYgKHY0bDJfc3ViZGV2X2NhbGwoaXR2LT5zZF92aWRlbywgdmlkZW8sIGdfdmJpX2RhdGEsICZkYXRhKSA9PSAwKSB7CiAJCQkJbW9kZSB8PSAyOwogCQkJCWNjLmV2ZW5bMF0gPSBkYXRhLmRhdGFbMF07CiAJCQkJY2MuZXZlblsxXSA9IGRhdGEuZGF0YVsxXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYwppbmRleCA5MjFlMjgxLi4zNmFiZDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jCkBAIC00OCw2ICs0OCw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1jYXJkcy5oIgogI2luY2x1ZGUgIml2dHYtaTJjLmgiCiAjaW5jbHVkZSAiaXZ0di11ZG1hLmgiCiAjaW5jbHVkZSAiaXZ0di1tYWlsYm94LmgiCkBAIC0xMjEsMTUgKzEyMiwxNSBAQAogI2RlZmluZSBJVlRWRkJfREVCVUcoeCwgdHlwZSwgZm10LCBhcmdzLi4uKSBcCiAJZG8geyBcCiAJCWlmICgoeCkgJiBpdnR2ZmJfZGVidWcpIFwKLQkJCXByaW50ayhLRVJOX0lORk8gIml2dHZmYiVkICIgdHlwZSAiOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKTsgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXZ0dmZiJWQgIiB0eXBlICI6ICIgZm10LCBpdHYtPmluc3RhbmNlICwgIyMgYXJncyk7IFwKIAl9IHdoaWxlICgwKQogI2RlZmluZSBJVlRWRkJfREVCVUdfV0FSTihmbXQsIGFyZ3MuLi4pICBJVlRWRkJfREVCVUcoSVZUVkZCX0RCR0ZMR19XQVJOLCAid2FybmluZyIsIGZtdCAsICMjIGFyZ3MpCiAjZGVmaW5lIElWVFZGQl9ERUJVR19JTkZPKGZtdCwgYXJncy4uLikgIElWVFZGQl9ERUJVRyhJVlRWRkJfREJHRkxHX0lORk8sICJpbmZvIiwgZm10ICwgIyMgYXJncykKIAogLyogU3RhbmRhcmQga2VybmVsIG1lc3NhZ2VzICovCi0jZGVmaW5lIElWVFZGQl9FUlIoZm10LCBhcmdzLi4uKSAgIHByaW50ayhLRVJOX0VSUiAgIml2dHZmYiVkOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKQotI2RlZmluZSBJVlRWRkJfV0FSTihmbXQsIGFyZ3MuLi4pICBwcmludGsoS0VSTl9XQVJOSU5HICAiaXZ0dmZiJWQ6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpCi0jZGVmaW5lIElWVFZGQl9JTkZPKGZtdCwgYXJncy4uLikgIHByaW50ayhLRVJOX0lORk8gIml2dHZmYiVkOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWRkJfRVJSKGZtdCwgYXJncy4uLikgICBwcmludGsoS0VSTl9FUlIgICJpdnR2ZmIlZDogIiBmbXQsIGl0di0+aW5zdGFuY2UgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWRkJfV0FSTihmbXQsIGFyZ3MuLi4pICBwcmludGsoS0VSTl9XQVJOSU5HICAiaXZ0dmZiJWQ6ICIgZm10LCBpdHYtPmluc3RhbmNlICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVkZCX0lORk8oZm10LCBhcmdzLi4uKSAgcHJpbnRrKEtFUk5fSU5GTyAiaXZ0dmZiJWQ6ICIgZm10LCBpdHYtPmluc3RhbmNlICwgIyMgYXJncykKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTg5NSwxNiArODk2LDE2IEBACiAJc3dpdGNoIChibGFua19tb2RlKSB7CiAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgogCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX09TRF9TRVRfU1RBVEUsIDEsIDEpOwotCQlpdnR2X3NhYTcxMjcoaXR2LCBWSURJT0NfU1RSRUFNT04sIE5VTEwpOworCQlpdnR2X2NhbGxfaHcoaXR2LCBJVlRWX0hXX1NBQTcxMjcsIHZpZGVvLCBzX3N0cmVhbSwgMSk7CiAJCWJyZWFrOwogCWNhc2UgRkJfQkxBTktfTk9STUFMOgogCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKIAljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9TVEFURSwgMSwgMCk7Ci0JCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19TVFJFQU1PTiwgTlVMTCk7CisJCWl2dHZfY2FsbF9odyhpdHYsIElWVFZfSFdfU0FBNzEyNywgdmlkZW8sIHNfc3RyZWFtLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046Ci0JCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19TVFJFQU1PRkYsIE5VTEwpOworCQlpdnR2X2NhbGxfaHcoaXR2LCBJVlRWX0hXX1NBQTcxMjcsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CiAJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9TVEFURSwgMSwgMCk7CiAJCWJyZWFrOwogCX0KQEAgLTExODgsMTAgKzExODksNDUgQEAKIAogfQogCitzdGF0aWMgaW50IF9faW5pdCBpdnR2ZmJfY2FsbGJhY2tfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpdnR2ICppdHYgPSBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBpdnR2LCBkZXZpY2UpOworCisJaWYgKGl0diAmJiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKKwkJaWYgKGl2dHZmYl9pbml0X2NhcmQoaXR2KSA9PSAwKSB7CisJCQlJVlRWRkJfSU5GTygiRnJhbWVidWZmZXIgcmVnaXN0ZXJlZCBvbiAlc1xuIiwKKwkJCQkJaXR2LT5kZXZpY2UubmFtZSk7CisJCQkoKihpbnQgKilwKSsrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl2dHZmYl9jYWxsYmFja19jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGl2dHYgKml0diA9IGNvbnRhaW5lcl9vZih2NGwyX2Rldiwgc3RydWN0IGl2dHYsIGRldmljZSk7CisKKwlpZiAoaXR2ICYmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkgeworCQlpZiAodW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmaXR2LT5vc2RfaW5mby0+aXZ0dmZiX2luZm8pKSB7CisJCQlJVlRWRkJfV0FSTigiRnJhbWVidWZmZXIgJWQgaXMgaW4gdXNlLCBjYW5ub3QgdW5sb2FkXG4iLAorCQkJCSAgICAgICBpdHYtPmluc3RhbmNlKTsKKwkJCXJldHVybiAwOworCQl9CisJCUlWVFZGQl9JTkZPKCJVbnJlZ2lzdGVyIGZyYW1lYnVmZmVyICVkXG4iLCBpdHYtPmluc3RhbmNlKTsKKwkJaXZ0dmZiX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTiwgJml0di0+b3NkX2luZm8tPml2dHZmYl9pbmZvKTsKKwkJaXZ0dmZiX3JlbGVhc2VfYnVmZmVycyhpdHYpOworCQlpdHYtPm9zZF92aWRlb19wYmFzZSA9IDA7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBpdnR2ZmJfaW5pdCh2b2lkKQogewotCXN0cnVjdCBpdnR2ICppdHY7Ci0JaW50IGksIHJlZ2lzdGVyZWQgPSAwOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CisJaW50IHJlZ2lzdGVyZWQgPSAwOworCWludCBlcnI7CiAKIAlpZiAoaXZ0dmZiX2NhcmRfaWQgPCAtMSB8fCBpdnR2ZmJfY2FyZF9pZCA+PSBJVlRWX01BWF9DQVJEUykgewogCQlwcmludGsoS0VSTl9FUlIgIml2dHZmYjogIGl2dHZmYl9jYXJkX2lkIHBhcmFtZXRlciBpcyBvdXQgb2YgcmFuZ2UgKHZhbGlkIHJhbmdlOiAtMSAtICVkKVxuIiwKQEAgLTExOTksMjAgKzEyMzUsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogTG9jYXRlICYgaW5pdGlhbGlzZSBhbGwgY2FyZHMgc3VwcG9ydGluZyBhbiBPU0QuICovCi0JZm9yIChpID0gMDsgaSA8IGl2dHZfY2FyZHNfYWN0aXZlOyBpKyspIHsKLQkJaWYgKGl2dHZmYl9jYXJkX2lkICE9IC0xICYmIGkgIT0gaXZ0dmZiX2NhcmRfaWQpCi0JCQljb250aW51ZTsKLQkJaXR2ID0gaXZ0dl9jYXJkc1tpXTsKLQkJaWYgKGl0diAmJiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKLQkJCWlmIChpdnR2ZmJfaW5pdF9jYXJkKGl0dikgPT0gMCkgewotCQkJCUlWVFZGQl9JTkZPKCJGcmFtZWJ1ZmZlciByZWdpc3RlcmVkIG9uIGl2dHYgY2FyZCBpZCAlZFxuIiwgaSk7Ci0JCQkJcmVnaXN0ZXJlZCsrOwotCQkJfQotCQl9Ci0JfQorCWRydiA9IGRyaXZlcl9maW5kKCJpdnR2IiwgJnBjaV9idXNfdHlwZSk7CisJZXJyID0gZHJpdmVyX2Zvcl9lYWNoX2RldmljZShkcnYsIE5VTEwsICZyZWdpc3RlcmVkLCBpdnR2ZmJfY2FsbGJhY2tfaW5pdCk7CisJcHV0X2RyaXZlcihkcnYpOwogCWlmICghcmVnaXN0ZXJlZCkgewotCQlwcmludGsoS0VSTl9FUlIgIml2dHZmYjogIG5vIGNhcmRzIGZvdW5kIik7CisJCXByaW50ayhLRVJOX0VSUiAiaXZ0dmZiOiAgbm8gY2FyZHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMjIwLDI0ICsxMjQ3LDE0IEBACiAKIHN0YXRpYyB2b2lkIGl2dHZmYl9jbGVhbnVwKHZvaWQpCiB7Ci0Jc3RydWN0IGl2dHYgKml0djsKLQlpbnQgaTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCWludCBlcnI7CiAKIAlwcmludGsoS0VSTl9JTkZPICJpdnR2ZmI6ICBVbmxvYWRpbmcgZnJhbWVidWZmZXIgbW9kdWxlXG4iKTsKIAotCWZvciAoaSA9IDA7IGkgPCBpdnR2X2NhcmRzX2FjdGl2ZTsgaSsrKSB7Ci0JCWl0diA9IGl2dHZfY2FyZHNbaV07Ci0JCWlmIChpdHYgJiYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpICYmIGl0di0+b3NkX2luZm8pIHsKLQkJCWlmICh1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZpdHYtPm9zZF9pbmZvLT5pdnR2ZmJfaW5mbykpIHsKLQkJCQlJVlRWRkJfV0FSTigiRnJhbWVidWZmZXIgJWQgaXMgaW4gdXNlLCBjYW5ub3QgdW5sb2FkXG4iLCBpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJVlRWRkJfREVCVUdfSU5GTygiVW5yZWdpc3RlciBmcmFtZWJ1ZmZlciAlZFxuIiwgaSk7Ci0JCQlpdnR2ZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCAmaXR2LT5vc2RfaW5mby0+aXZ0dmZiX2luZm8pOwotCQkJaXZ0dmZiX3JlbGVhc2VfYnVmZmVycyhpdHYpOwotCQkJaXR2LT5vc2RfdmlkZW9fcGJhc2UgPSAwOwotCQl9Ci0JfQorCWRydiA9IGRyaXZlcl9maW5kKCJpdnR2IiwgJnBjaV9idXNfdHlwZSk7CisJZXJyID0gZHJpdmVyX2Zvcl9lYWNoX2RldmljZShkcnYsIE5VTEwsIE5VTEwsIGl2dHZmYl9jYWxsYmFja19jbGVhbnVwKTsKKwlwdXRfZHJpdmVyKGRydik7CiB9CiAKIG1vZHVsZV9pbml0KGl2dHZmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTUyNzkwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201Mjc5MC5jCmluZGV4IDg5YTc4MWMuLjA3YmUxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTUyNzkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNTI3OTAuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL201Mjc5MC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KIApAQCAtMzgsOTAgKzM4LDEzMSBAQAogCiAKIHN0cnVjdCBtNTI3OTBfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKIAl1MTYgaW5wdXQ7CiAJdTE2IG91dHB1dDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG01Mjc5MF9zdGF0ZSAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbTUyNzkwX3N0YXRlLCBzZCk7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgbTUyNzkwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG01Mjc5MF93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewotCXN0cnVjdCBtNTI3OTBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG01Mjc5MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCiAJdTggc3cxID0gKHN0YXRlLT5pbnB1dCB8IHN0YXRlLT5vdXRwdXQpICYgMHhmZjsKIAl1OCBzdzIgPSAoc3RhdGUtPmlucHV0IHwgc3RhdGUtPm91dHB1dCkgPj4gODsKIAogCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgc3cxLCBzdzIpOwogfQogCi1zdGF0aWMgaW50IG01Mjc5MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgdm9pZCAqYXJnKQorLyogTm90ZTogYXVkaW8gYW5kIHZpZGVvIGFyZSBsaW5rZWQgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBzZXBhcmF0ZWx5LgorICAgU28gYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgY29tbWFuZHMgYXJlIGlkZW50aWNhbCBmb3IgdGhpcyBjaGlwLgorICAgSW4gdGhlb3J5IHRoZSB2aWRlbyBhbXBsaWZpZXIgYW5kIGF1ZGlvIG1vZGVzIGNvdWxkIGJlIGhhbmRsZWQKKyAgIHNlcGFyYXRlbHkgZm9yIHRoZSBvdXRwdXQsIGJ1dCB0aGF0IHNlZW1zIHRvIGJlIG92ZXJraWxsIHJpZ2h0IG5vdy4KKyAgIFRoZSBzYW1lIGhvbGRzIGZvciBpbXBsZW1lbnRpbmcgYW4gYXVkaW8gbXV0ZSBjb250cm9sLCB0aGlzIGlzIG5vdworICAgcGFydCBvZiB0aGUgYXVkaW8gb3V0cHV0IHJvdXRpbmcuIFRoZSBub3JtYWwgY2FzZSBpcyB0aGF0IGFub3RoZXIKKyAgIGNoaXAgdGFrZXMgY2FyZSBvZiB0aGUgYWN0dWFsIG11dGluZyBzbyBtYWtpbmcgaXQgcGFydCBvZiB0aGUKKyAgIG91dHB1dCByb3V0aW5nIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyB0byBkbyBmb3Igbm93LiAqLworc3RhdGljIGludCBtNTI3OTBfc19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQogewotCXN0cnVjdCBtNTI3OTBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisJc3RydWN0IG01Mjc5MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKLQkvKiBOb3RlOiBhdWRpbyBhbmQgdmlkZW8gYXJlIGxpbmtlZCBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIHNlcGFyYXRlbHkuCi0JICAgU28gYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgY29tbWFuZHMgYXJlIGlkZW50aWNhbCBmb3IgdGhpcyBjaGlwLgotCSAgIEluIHRoZW9yeSB0aGUgdmlkZW8gYW1wbGlmaWVyIGFuZCBhdWRpbyBtb2RlcyBjb3VsZCBiZSBoYW5kbGVkCi0JICAgc2VwYXJhdGVseSBmb3IgdGhlIG91dHB1dCwgYnV0IHRoYXQgc2VlbXMgdG8gYmUgb3ZlcmtpbGwgcmlnaHQgbm93LgotCSAgIFRoZSBzYW1lIGhvbGRzIGZvciBpbXBsZW1lbnRpbmcgYW4gYXVkaW8gbXV0ZSBjb250cm9sLCB0aGlzIGlzIG5vdwotCSAgIHBhcnQgb2YgdGhlIGF1ZGlvIG91dHB1dCByb3V0aW5nLiBUaGUgbm9ybWFsIGNhc2UgaXMgdGhhdCBhbm90aGVyCi0JICAgY2hpcCB0YWtlcyBjYXJlIG9mIHRoZSBhY3R1YWwgbXV0aW5nIHNvIG1ha2luZyBpdCBwYXJ0IG9mIHRoZQotCSAgIG91dHB1dCByb3V0aW5nIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyB0byBkbyBmb3Igbm93LiAqLwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORzoKLQljYXNlIFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HOgotCQlyb3V0ZS0+aW5wdXQgPSBzdGF0ZS0+aW5wdXQ7Ci0JCXJvdXRlLT5vdXRwdXQgPSBzdGF0ZS0+b3V0cHV0OwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkc6Ci0JY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKLQkJc3RhdGUtPmlucHV0ID0gcm91dGUtPmlucHV0OwotCQlzdGF0ZS0+b3V0cHV0ID0gcm91dGUtPm91dHB1dDsKLQkJbTUyNzkwX3dyaXRlKGNsaWVudCk7Ci0JCWJyZWFrOwotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgotCWNhc2UgVklESU9DX0RCR19TX1JFR0lTVEVSOgotCXsKLQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKLQotCQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KGNsaWVudCwKLQkJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChyZWctPnJlZyAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChjbWQgPT0gVklESU9DX0RCR19HX1JFR0lTVEVSKQotCQkJcmVnLT52YWwgPSBzdGF0ZS0+aW5wdXQgfCBzdGF0ZS0+b3V0cHV0OwotCQllbHNlIHsKLQkJCXN0YXRlLT5pbnB1dCA9IHJlZy0+dmFsICYgMHgwMzAzOwotCQkJc3RhdGUtPm91dHB1dCA9IHJlZy0+dmFsICYgfjB4MDMwMzsKLQkJCW01Mjc5MF93cml0ZShjbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgotCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsCi0JCQkJVjRMMl9JREVOVF9NNTI3OTAsIDApOwotCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJdjRsX2luZm8oY2xpZW50LCAiU3dpdGNoIDE6ICUwMnhcbiIsCi0JCQkJKHN0YXRlLT5pbnB1dCB8IHN0YXRlLT5vdXRwdXQpICYgMHhmZik7Ci0JCXY0bF9pbmZvKGNsaWVudCwgIlN3aXRjaCAyOiAlMDJ4XG4iLAotCQkJCShzdGF0ZS0+aW5wdXQgfCBzdGF0ZS0+b3V0cHV0KSA+PiA4KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJc3RhdGUtPmlucHV0ID0gcm91dGUtPmlucHV0OworCXN0YXRlLT5vdXRwdXQgPSByb3V0ZS0+b3V0cHV0OworCW01Mjc5MF93cml0ZShzZCk7CiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IG01Mjc5MF9nX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IG01Mjc5MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCisJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKHJlZy0+cmVnICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJlZy0+dmFsID0gc3RhdGUtPmlucHV0IHwgc3RhdGUtPm91dHB1dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtNTI3OTBfc19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtNTI3OTBfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChyZWctPnJlZyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdGF0ZS0+aW5wdXQgPSByZWctPnZhbCAmIDB4MDMwMzsKKwlzdGF0ZS0+b3V0cHV0ID0gcmVnLT52YWwgJiB+MHgwMzAzOworCW01Mjc5MF93cml0ZShzZCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtNTI3OTBfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwgVjRMMl9JREVOVF9NNTI3OTAsIDApOworfQorCitzdGF0aWMgaW50IG01Mjc5MF9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IG01Mjc5MF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwl2NGwyX2luZm8oc2QsICJTd2l0Y2ggMTogJTAyeFxuIiwKKwkJCShzdGF0ZS0+aW5wdXQgfCBzdGF0ZS0+b3V0cHV0KSAmIDB4ZmYpOworCXY0bDJfaW5mbyhzZCwgIlN3aXRjaCAyOiAlMDJ4XG4iLAorCQkJKHN0YXRlLT5pbnB1dCB8IHN0YXRlLT5vdXRwdXQpID4+IDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG01Mjc5MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbTUyNzkwX2NvcmVfb3BzID0geworCS5sb2dfc3RhdHVzID0gbTUyNzkwX2xvZ19zdGF0dXMsCisJLmdfY2hpcF9pZGVudCA9IG01Mjc5MF9nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gbTUyNzkwX2dfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIgPSBtNTI3OTBfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgbTUyNzkwX2F1ZGlvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gbTUyNzkwX3Nfcm91dGluZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG01Mjc5MF92aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IG01Mjc5MF9zX3JvdXRpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtNTI3OTBfb3BzID0geworCS5jb3JlID0gJm01Mjc5MF9jb3JlX29wcywKKwkuYXVkaW8gPSAmbTUyNzkwX2F1ZGlvX29wcywKKwkudmlkZW8gPSAmbTUyNzkwX3ZpZGVvX29wcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIGkyYyBpbXBsZW1lbnRhdGlvbiAqLwpAQCAtMTMwLDYgKzE3MSw3IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IG01Mjc5MF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAogCS8qIENoZWNrIGlmIHRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBuZWVkZWQgZmVhdHVyZXMgKi8KIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKQEAgLTE0MiwxNiArMTg0LDIwIEBACiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZtNTI3OTBfb3BzKTsKIAlzdGF0ZS0+aW5wdXQgPSBNNTI3OTBfSU5fVFVORVI7CiAJc3RhdGUtPm91dHB1dCA9IE01Mjc5MF9PVVRfU1RFUkVPOwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKLQltNTI3OTBfd3JpdGUoY2xpZW50KTsKKwltNTI3OTBfd3JpdGUoc2QpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG01Mjc5MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHRvX3N0YXRlKHNkKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCAzZGE3NGRjLi5hNjIyZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC01MSwxNCArNTEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2LWxlZ2FjeS5oPgotI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9tc3AzNDAwLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbXNwMzQwMC5oPgorI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KICNpbmNsdWRlICJtc3AzNDAwLWRyaXZlci5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjUsNyArMjY1LDcgQEAKIAogdm9pZCBtc3Bfc2V0X3NjYXJ0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpbiwgaW50IG91dCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCiAJc3RhdGUtPmluX3NjYXJ0ID0gaW47CiAKQEAgLTI4OSw3ICsyODksNyBAQAogCiB2b2lkIG1zcF9zZXRfYXVkaW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCBiYWwgPSAwLCBiYXNzLCB0cmVibGUsIGxvdWRuZXNzOwogCWludCB2YWwgPSAwOwogCWludCByZWFsbHltdXRlZCA9IHN0YXRlLT5tdXRlZCB8IHN0YXRlLT5zY2FuX2luX3Byb2dyZXNzOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAKIHN0YXRpYyB2b2lkIG1zcF93YWtlX3RocmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAKIAlpZiAoTlVMTCA9PSBzdGF0ZS0+a3RocmVhZCkKIAkJcmV0dXJuOwpAQCAtMzkwLDkgKzM5MCw5IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBtc3BfZ2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXNwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CkBAIC00MzMsOSArNDMzLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXNwX3NldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG1zcF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKQEAgLTQ4MSw0MCArNDgyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXNwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorI2lmZGVmIENPTkZJR19WSURFT19BTExPV19WNEwxCitzdGF0aWMgaW50IG1zcF9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWlmIChtc3BfZGVidWcgPj0gMikKLQkJdjRsX2kyY19wcmludF9pb2N0bChjbGllbnQsIGNtZCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRENfU0VUX1JBRElPOgotCQlpZiAoc3RhdGUtPnJhZGlvKQotCQkJcmV0dXJuIDA7Ci0JCXN0YXRlLT5yYWRpbyA9IDE7Ci0JCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJzd2l0Y2hpbmcgdG8gcmFkaW8gbW9kZVxuIik7Ci0JCXN0YXRlLT53YXRjaF9zdGVyZW8gPSAwOwotCQlzd2l0Y2ggKHN0YXRlLT5vcG1vZGUpIHsKLQkJY2FzZSBPUE1PREVfTUFOVUFMOgotCQkJLyogc2V0IG1zcDM0MDAgdG8gRk0gcmFkaW8gbW9kZSAqLwotCQkJbXNwMzQwMGNfc2V0X21vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9SQURJTyk7Ci0JCQltc3AzNDAwY19zZXRfY2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDEwLjcpLAotCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOwotCQkJbXNwX3NldF9hdWRpbyhjbGllbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BNT0RFX0FVVE9ERVRFQ1Q6Ci0JCWNhc2UgT1BNT0RFX0FVVE9TRUxFQ1Q6Ci0JCQkvKiB0aGUgdGhyZWFkIHdpbGwgZG8gZm9yIHVzICovCi0JCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCiAJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCiAJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCiAJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwotI2lmZGVmIENPTkZJR19WSURFT19BTExPV19WNEwxCiAJY2FzZSBWSURJT0NHQVVESU86CiAJewogCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnZhID0gYXJnOwpAQCAtNTg4LDEwNSArNTY1LDEzNyBAQAogCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKIAkJYnJlYWs7CiAJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQogI2VuZGlmCi0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JewotCQkvKiBuZXcgY2hhbm5lbCAtLSBraWNrIGF1ZGlvIGNhcnJpZXIgc2NhbiAqLwotCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKLQkJYnJlYWs7Ci0JfQogCi0JLyogLS0tIHY0bDIgaW9jdGxzIC0tLSAqLwotCWNhc2UgVklESU9DX1NfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwotCQlpbnQgdXBkYXRlID0gc3RhdGUtPnJhZGlvIHx8IHN0YXRlLT52NGwyX3N0ZCAhPSAqaWQ7CisvKiAtLS0gdjRsMiBpb2N0bHMgLS0tICovCitzdGF0aWMgaW50IG1zcF9zX3JhZGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JCXN0YXRlLT52NGwyX3N0ZCA9ICppZDsKLQkJc3RhdGUtPnJhZGlvID0gMDsKLQkJaWYgKHVwZGF0ZSkKLQkJCW1zcF93YWtlX3RocmVhZChjbGllbnQpOworCWlmIChzdGF0ZS0+cmFkaW8pCiAJCXJldHVybiAwOwotCX0KLQotCWNhc2UgVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkc6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpydCA9IGFyZzsKLQotCQkqcnQgPSBzdGF0ZS0+cm91dGluZzsKKwlzdGF0ZS0+cmFkaW8gPSAxOworCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJzd2l0Y2hpbmcgdG8gcmFkaW8gbW9kZVxuIik7CisJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDA7CisJc3dpdGNoIChzdGF0ZS0+b3Btb2RlKSB7CisJY2FzZSBPUE1PREVfTUFOVUFMOgorCQkvKiBzZXQgbXNwMzQwMCB0byBGTSByYWRpbyBtb2RlICovCisJCW1zcDM0MDBjX3NldF9tb2RlKGNsaWVudCwgTVNQX01PREVfRk1fUkFESU8pOworCQltc3AzNDAwY19zZXRfY2FycmllcihjbGllbnQsIE1TUF9DQVJSSUVSKDEwLjcpLAorCQkJCU1TUF9DQVJSSUVSKDEwLjcpKTsKKwkJbXNwX3NldF9hdWRpbyhjbGllbnQpOwogCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgotCXsKLQkJc3RydWN0IHY0bDJfcm91dGluZyAqcnQgPSBhcmc7Ci0JCWludCB0dW5lciA9IChydC0+aW5wdXQgPj4gMykgJiAxOwotCQlpbnQgc2NfaW4gPSBydC0+aW5wdXQgJiAweDc7Ci0JCWludCBzYzFfb3V0ID0gcnQtPm91dHB1dCAmIDB4ZjsKLQkJaW50IHNjMl9vdXQgPSAocnQtPm91dHB1dCA+PiA0KSAmIDB4ZjsKLQkJdTE2IHZhbCwgcmVnOwotCQlpbnQgaTsKLQkJaW50IGV4dGVybl9pbnB1dCA9IDE7Ci0KLQkJaWYgKHN0YXRlLT5yb3V0aW5nLmlucHV0ID09IHJ0LT5pbnB1dCAmJgotCQkgICAgc3RhdGUtPnJvdXRpbmcub3V0cHV0ID09IHJ0LT5vdXRwdXQpCi0JCQlicmVhazsKLQkJc3RhdGUtPnJvdXRpbmcgPSAqcnQ7Ci0JCS8qIGNoZWNrIGlmIHRoZSB0dW5lciBpbnB1dCBpcyB1c2VkICovCi0JCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCWlmICgoKHJ0LT5pbnB1dCA+PiAoNCArIGkgKiA0KSkgJiAweGYpID09IDApCi0JCQkJZXh0ZXJuX2lucHV0ID0gMDsKLQkJfQotCQlzdGF0ZS0+bW9kZSA9IGV4dGVybl9pbnB1dCA/IE1TUF9NT0RFX0VYVEVSTiA6IE1TUF9NT0RFX0FNX0RFVEVDVDsKLQkJc3RhdGUtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBzY19pbiwgMCk7Ci0JCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBzYzFfb3V0LCAxKTsKLQkJbXNwX3NldF9zY2FydChjbGllbnQsIHNjMl9vdXQsIDIpOwotCQltc3Bfc2V0X2F1ZG1vZGUoY2xpZW50KTsKLQkJcmVnID0gKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpID8gMHgzMCA6IDB4YmI7Ci0JCXZhbCA9IG1zcF9yZWFkX2RlbShjbGllbnQsIHJlZyk7Ci0JCW1zcF93cml0ZV9kZW0oY2xpZW50LCByZWcsICh2YWwgJiB+MHgxMDApIHwgKHR1bmVyIDw8IDgpKTsKLQkJLyogd2FrZSB0aHJlYWQgd2hlbiBhIG5ldyBpbnB1dCBpcyBjaG9zZW4gKi8KKwljYXNlIE9QTU9ERV9BVVRPREVURUNUOgorCWNhc2UgT1BNT0RFX0FVVE9TRUxFQ1Q6CisJCS8qIHRoZSB0aHJlYWQgd2lsbCBkbyBmb3IgdXMgKi8KIAkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gMDsKK30KIAotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7CitzdGF0aWMgaW50IG1zcF9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JCWlmIChzdGF0ZS0+cmFkaW8pCi0JCQlicmVhazsKLQkJaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX0FVVE9TRUxFQ1QpCi0JCQltc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOwotCQl2dC0+YXVkbW9kZSAgICA9IHN0YXRlLT5hdWRtb2RlOwotCQl2dC0+cnhzdWJjaGFucyA9IHN0YXRlLT5yeHN1YmNoYW5zOwotCQl2dC0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAotCQkJVjRMMl9UVU5FUl9DQVBfTEFORzEgfCBWNEwyX1RVTkVSX0NBUF9MQU5HMjsKLQkJYnJlYWs7CisJLyogbmV3IGNoYW5uZWwgLS0ga2ljayBhdWRpbyBjYXJyaWVyIHNjYW4gKi8KKwltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc3Bfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgaWQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCWludCB1cGRhdGUgPSBzdGF0ZS0+cmFkaW8gfHwgc3RhdGUtPnY0bDJfc3RkICE9IGlkOworCisJc3RhdGUtPnY0bDJfc3RkID0gaWQ7CisJc3RhdGUtPnJhZGlvID0gMDsKKwlpZiAodXBkYXRlKQorCQltc3Bfd2FrZV90aHJlYWQoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc3Bfc19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJ0KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgdHVuZXIgPSAocnQtPmlucHV0ID4+IDMpICYgMTsKKwlpbnQgc2NfaW4gPSBydC0+aW5wdXQgJiAweDc7CisJaW50IHNjMV9vdXQgPSBydC0+b3V0cHV0ICYgMHhmOworCWludCBzYzJfb3V0ID0gKHJ0LT5vdXRwdXQgPj4gNCkgJiAweGY7CisJdTE2IHZhbCwgcmVnOworCWludCBpOworCWludCBleHRlcm5faW5wdXQgPSAxOworCisJaWYgKHN0YXRlLT5yb3V0aW5nLmlucHV0ID09IHJ0LT5pbnB1dCAmJgorCQkJc3RhdGUtPnJvdXRpbmcub3V0cHV0ID09IHJ0LT5vdXRwdXQpCisJCXJldHVybiAwOworCXN0YXRlLT5yb3V0aW5nID0gKnJ0OworCS8qIGNoZWNrIGlmIHRoZSB0dW5lciBpbnB1dCBpcyB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoKChydC0+aW5wdXQgPj4gKDQgKyBpICogNCkpICYgMHhmKSA9PSAwKQorCQkJZXh0ZXJuX2lucHV0ID0gMDsKIAl9CisJc3RhdGUtPm1vZGUgPSBleHRlcm5faW5wdXQgPyBNU1BfTU9ERV9FWFRFUk4gOiBNU1BfTU9ERV9BTV9ERVRFQ1Q7CisJc3RhdGUtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJbXNwX3NldF9zY2FydChjbGllbnQsIHNjX2luLCAwKTsKKwltc3Bfc2V0X3NjYXJ0KGNsaWVudCwgc2MxX291dCwgMSk7CisJbXNwX3NldF9zY2FydChjbGllbnQsIHNjMl9vdXQsIDIpOworCW1zcF9zZXRfYXVkbW9kZShjbGllbnQpOworCXJlZyA9IChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKSA/IDB4MzAgOiAweGJiOworCXZhbCA9IG1zcF9yZWFkX2RlbShjbGllbnQsIHJlZyk7CisJbXNwX3dyaXRlX2RlbShjbGllbnQsIHJlZywgKHZhbCAmIH4weDEwMCkgfCAodHVuZXIgPDwgOCkpOworCS8qIHdha2UgdGhyZWFkIHdoZW4gYSBuZXcgaW5wdXQgaXMgY2hvc2VuICovCisJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CiAKLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gKHN0cnVjdCB2NGwyX3R1bmVyICopYXJnOworc3RhdGljIGludCBtc3BfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JCWlmIChzdGF0ZS0+cmFkaW8pICAvKiBUT0RPOiBhZGQgbW9uby9zdGVyZW8gc3VwcG9ydCBmb3IgcmFkaW8gKi8KLQkJCWJyZWFrOwotCQlpZiAoc3RhdGUtPmF1ZG1vZGUgPT0gdnQtPmF1ZG1vZGUpCi0JCQlicmVhazsKLQkJc3RhdGUtPmF1ZG1vZGUgPSB2dC0+YXVkbW9kZTsKLQkJLyogb25seSBzZXQgYXVkbW9kZSAqLwotCQltc3Bfc2V0X2F1ZG1vZGUoY2xpZW50KTsKLQkJYnJlYWs7Ci0JfQorCWlmIChzdGF0ZS0+cmFkaW8pCisJCXJldHVybiAwOworCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKQorCQltc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCXZ0LT5hdWRtb2RlICAgID0gc3RhdGUtPmF1ZG1vZGU7CisJdnQtPnJ4c3ViY2hhbnMgPSBzdGF0ZS0+cnhzdWJjaGFuczsKKwl2dC0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAorCQlWNEwyX1RVTkVSX0NBUF9MQU5HMSB8IFY0TDJfVFVORVJfQ0FQX0xBTkcyOworCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfSU5UX0kyU19DTE9DS19GUkVROgotCXsKLQkJdTMyICphID0gKHUzMiAqKWFyZzsKK3N0YXRpYyBpbnQgbXNwX3NfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiU2V0dGluZyBJMlMgc3BlZWQgdG8gJWRcbiIsICphKTsKKwlpZiAoc3RhdGUtPnJhZGlvKSAgLyogVE9ETzogYWRkIG1vbm8vc3RlcmVvIHN1cHBvcnQgZm9yIHJhZGlvICovCisJCXJldHVybiAwOworCWlmIChzdGF0ZS0+YXVkbW9kZSA9PSB2dC0+YXVkbW9kZSkKKwkJcmV0dXJuIDA7CisJc3RhdGUtPmF1ZG1vZGUgPSB2dC0+YXVkbW9kZTsKKwkvKiBvbmx5IHNldCBhdWRtb2RlICovCisJbXNwX3NldF9hdWRtb2RlKGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CiAKLQkJc3dpdGNoICgqYSkgeworc3RhdGljIGludCBtc3Bfc19pMnNfY2xvY2tfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZnJlcSkKK3sKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAiU2V0dGluZyBJMlMgc3BlZWQgdG8gJWRcbiIsIGZyZXEpOworCisJc3dpdGNoIChmcmVxKSB7CiAJCWNhc2UgMTAyNDAwMDoKIAkJCXN0YXRlLT5pMnNfbW9kZSA9IDA7CiAJCQlicmVhazsKQEAgLTY5NSwyNCArNzA0LDI0IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwogCX0KKwlyZXR1cm4gMDsKK30KIAotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7CitzdGF0aWMgaW50IG1zcF9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAotCQlzd2l0Y2ggKHFjLT5pZCkgeworCXN3aXRjaCAocWMtPmlkKSB7CiAJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgogCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CiAJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwotCQl9Ci0JCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN3aXRjaCAocWMtPmlkKSB7CisJfQorCWlmICghc3RhdGUtPmhhc19zb3VuZF9wcm9jZXNzaW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKHFjLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgogCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKQEAgLTcyMCwzMiArNzI5LDM4IEBACiAJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAJfQorCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCQlyZXR1cm4gbXNwX2dldF9jdHJsKGNsaWVudCwgYXJnKTsKK3N0YXRpYyBpbnQgbXNwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJcmV0dXJuIG1zcF9zZXRfY3RybChjbGllbnQsIGFyZyk7CisJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwgc3RhdGUtPmlkZW50LAorCQkJKHN0YXRlLT5yZXYxIDw8IDE2KSB8IHN0YXRlLT5yZXYyKTsKK30KIAotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JewotCQljb25zdCBjaGFyICpwOworc3RhdGljIGludCBtc3BfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwljb25zdCBjaGFyICpwOwogCi0JCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKQotCQkJbXNwX2RldGVjdF9zdGVyZW8oY2xpZW50KTsKLQkJdjRsX2luZm8oY2xpZW50LCAiJXMgcmV2MSA9IDB4JTA0eCByZXYyID0gMHglMDR4XG4iLAotCQkJCWNsaWVudC0+bmFtZSwgc3RhdGUtPnJldjEsIHN0YXRlLT5yZXYyKTsKLQkJdjRsX2luZm8oY2xpZW50LCAiQXVkaW86ICAgIHZvbHVtZSAlZCVzXG4iLAotCQkJCXN0YXRlLT52b2x1bWUsIHN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7Ci0JCWlmIChzdGF0ZS0+aGFzX3NvdW5kX3Byb2Nlc3NpbmcpIHsKLQkJCXY0bF9pbmZvKGNsaWVudCwgIkF1ZGlvOiAgICBiYWxhbmNlICVkIGJhc3MgJWQgdHJlYmxlICVkIGxvdWRuZXNzICVzXG4iLAotCQkJCQlzdGF0ZS0+YmFsYW5jZSwgc3RhdGUtPmJhc3MsCi0JCQkJCXN0YXRlLT50cmVibGUsCi0JCQkJCXN0YXRlLT5sb3VkbmVzcyA/ICJvbiIgOiAib2ZmIik7Ci0JCX0KLQkJc3dpdGNoIChzdGF0ZS0+bW9kZSkgeworCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKQorCQltc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpOworCXY0bF9pbmZvKGNsaWVudCwgIiVzIHJldjEgPSAweCUwNHggcmV2MiA9IDB4JTA0eFxuIiwKKwkJCWNsaWVudC0+bmFtZSwgc3RhdGUtPnJldjEsIHN0YXRlLT5yZXYyKTsKKwl2NGxfaW5mbyhjbGllbnQsICJBdWRpbzogICAgdm9sdW1lICVkJXNcbiIsCisJCQlzdGF0ZS0+dm9sdW1lLCBzdGF0ZS0+bXV0ZWQgPyAiIChtdXRlZCkiIDogIiIpOworCWlmIChzdGF0ZS0+aGFzX3NvdW5kX3Byb2Nlc3NpbmcpIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiQXVkaW86ICAgIGJhbGFuY2UgJWQgYmFzcyAlZCB0cmVibGUgJWQgbG91ZG5lc3MgJXNcbiIsCisJCQkJc3RhdGUtPmJhbGFuY2UsIHN0YXRlLT5iYXNzLAorCQkJCXN0YXRlLT50cmVibGUsCisJCQkJc3RhdGUtPmxvdWRuZXNzID8gIm9uIiA6ICJvZmYiKTsKKwl9CisJc3dpdGNoIChzdGF0ZS0+bW9kZSkgewogCQljYXNlIE1TUF9NT0RFX0FNX0RFVEVDVDogcCA9ICJBTSAoZm9yIGNhcnJpZXIgZGV0ZWN0KSI7IGJyZWFrOwogCQljYXNlIE1TUF9NT0RFX0ZNX1JBRElPOiBwID0gIkZNIFJhZGlvIjsgYnJlYWs7CiAJCWNhc2UgTVNQX01PREVfRk1fVEVSUkE6IHAgPSAiVGVycmVzdGlhbCBGTS1tb25vL3N0ZXJlbyI7IGJyZWFrOwpAQCAtNzU2LDM2ICs3NzEsMjUgQEAKIAkJY2FzZSBNU1BfTU9ERV9CVFNDOiBwID0gIkJUU0MiOyBicmVhazsKIAkJY2FzZSBNU1BfTU9ERV9FWFRFUk46IHAgPSAiRXh0ZXJuYWwgaW5wdXQiOyBicmVhazsKIAkJZGVmYXVsdDogcCA9ICJ1bmtub3duIjsgYnJlYWs7Ci0JCX0KLQkJaWYgKHN0YXRlLT5tb2RlID09IE1TUF9NT0RFX0VYVEVSTikgewotCQkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzXG4iLCBwKTsKLQkJfSBlbHNlIGlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9NQU5VQUwpIHsKLQkJCXY0bF9pbmZvKGNsaWVudCwgIk1vZGU6ICAgICAlcyAoJXMlcylcbiIsIHAsCisJfQorCWlmIChzdGF0ZS0+bW9kZSA9PSBNU1BfTU9ERV9FWFRFUk4pIHsKKwkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzXG4iLCBwKTsKKwl9IGVsc2UgaWYgKHN0YXRlLT5vcG1vZGUgPT0gT1BNT0RFX01BTlVBTCkgeworCQl2NGxfaW5mbyhjbGllbnQsICJNb2RlOiAgICAgJXMgKCVzJXMpXG4iLCBwLAogCQkJCShzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX1NURVJFTykgPyAic3RlcmVvIiA6ICJtb25vIiwKIAkJCQkoc3RhdGUtPnJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikgPyAiLCBkdWFsIiA6ICIiKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPREVURUNUKQotCQkJCXY0bF9pbmZvKGNsaWVudCwgIk1vZGU6ICAgICAlc1xuIiwgcCk7Ci0JCQl2NGxfaW5mbyhjbGllbnQsICJTdGFuZGFyZDogJXMgKCVzJXMpXG4iLAorCX0gZWxzZSB7CisJCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPREVURUNUKQorCQkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzXG4iLCBwKTsKKwkJdjRsX2luZm8oY2xpZW50LCAiU3RhbmRhcmQ6ICVzICglcyVzKVxuIiwKIAkJCQltc3Bfc3RhbmRhcmRfc3RkX25hbWUoc3RhdGUtPnN0ZCksCiAJCQkJKHN0YXRlLT5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKSA/ICJzdGVyZW8iIDogIm1vbm8iLAogCQkJCShzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSA/ICIsIGR1YWwiIDogIiIpOwotCQl9Ci0JCXY0bF9pbmZvKGNsaWVudCwgIkF1ZG1vZGU6ICAweCUwNHhcbiIsIHN0YXRlLT5hdWRtb2RlKTsKLQkJdjRsX2luZm8oY2xpZW50LCAiUm91dGluZzogIDB4JTA4eCAoaW5wdXQpIDB4JTA4eCAob3V0cHV0KVxuIiwKLQkJCQlzdGF0ZS0+cm91dGluZy5pbnB1dCwgc3RhdGUtPnJvdXRpbmcub3V0cHV0KTsKLQkJdjRsX2luZm8oY2xpZW50LCAiQUNCOiAgICAgIDB4JTA0eFxuIiwgc3RhdGUtPmFjYik7Ci0JCWJyZWFrOwogCX0KLQotCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKLQkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgYXJnLCBzdGF0ZS0+aWRlbnQsCi0JCQkJKHN0YXRlLT5yZXYxIDw8IDE2KSB8IHN0YXRlLT5yZXYyKTsKLQotCWRlZmF1bHQ6Ci0JCS8qIHVua25vd24gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXY0bF9pbmZvKGNsaWVudCwgIkF1ZG1vZGU6ICAweCUwNHhcbiIsIHN0YXRlLT5hdWRtb2RlKTsKKwl2NGxfaW5mbyhjbGllbnQsICJSb3V0aW5nOiAgMHglMDh4IChpbnB1dCkgMHglMDh4IChvdXRwdXQpXG4iLAorCQkJc3RhdGUtPnJvdXRpbmcuaW5wdXQsIHN0YXRlLT5yb3V0aW5nLm91dHB1dCk7CisJdjRsX2luZm8oY2xpZW50LCAiQUNCOiAgICAgIDB4JTA0eFxuIiwgc3RhdGUtPmFjYik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwMywxMSArODA3LDQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXNwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc3BfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSBtc3BfbG9nX3N0YXR1cywKKwkuZ19jaGlwX2lkZW50ID0gbXNwX2dfY2hpcF9pZGVudCwKKwkuZ19jdHJsID0gbXNwX2dfY3RybCwKKwkuc19jdHJsID0gbXNwX3NfY3RybCwKKwkucXVlcnljdHJsID0gbXNwX3F1ZXJ5Y3RybCwKKyNpZmRlZiBDT05GSUdfVklERU9fQUxMT1dfVjRMMQorCS5pb2N0bCA9IG1zcF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgbXNwX3R1bmVyX29wcyA9IHsKKwkuc19mcmVxdWVuY3kgPSBtc3Bfc19mcmVxdWVuY3ksCisJLmdfdHVuZXIgPSBtc3BfZ190dW5lciwKKwkuc190dW5lciA9IG1zcF9zX3R1bmVyLAorCS5zX3JhZGlvID0gbXNwX3NfcmFkaW8sCisJLnNfc3RkID0gbXNwX3Nfc3RkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgbXNwX2F1ZGlvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gbXNwX3Nfcm91dGluZywKKwkuc19pMnNfY2xvY2tfZnJlcSA9IG1zcF9zX2kyc19jbG9ja19mcmVxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNwX29wcyA9IHsKKwkuY29yZSA9ICZtc3BfY29yZV9vcHMsCisJLnR1bmVyID0gJm1zcF90dW5lcl9vcHMsCisJLmF1ZGlvID0gJm1zcF9hdWRpb19vcHMsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50IG1zcF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlpbnQgKCp0aHJlYWRfZnVuYykodm9pZCAqZGF0YSkgPSBOVUxMOwogCWludCBtc3BfaGFyZDsKIAlpbnQgbXNwX2ZhbWlseTsKQEAgLTgyNyw3ICs4NjksOCBAQAogCWlmICghc3RhdGUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3RhdGUpOworCXNkID0gJnN0YXRlLT5zZDsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmbXNwX29wcyk7CiAKIAlzdGF0ZS0+djRsMl9zdGQgPSBWNEwyX1NURF9OVFNDOwogCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKQEAgLTk3Miw4ICsxMDE1LDkgQEAKIAogc3RhdGljIGludCBtc3BfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZzdGF0ZS0+c2QpOwogCS8qIHNodXRkb3duIGNvbnRyb2wgdGhyZWFkICovCiAJaWYgKHN0YXRlLT5rdGhyZWFkKSB7CiAJCXN0YXRlLT5yZXN0YXJ0ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuaAppbmRleCBhYjY5YTI5Li4zZmUxYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5oCkBAIC01LDYgKzUsNyBAQAogI2RlZmluZSBNU1AzNDAwX0RSSVZFUl9ICiAKICNpbmNsdWRlIDxtZWRpYS9tc3AzNDAwLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC00OSw2ICs1MCw3IEBACiBleHRlcm4gaW50IG1zcF9zdGVyZW9fdGhyZXNoOwogCiBzdHJ1Y3QgbXNwX3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAJaW50IHJldjEsIHJldjI7CiAJaW50IGlkZW50OwogCXU4IGhhc19uaWNhbTsKQEAgLTk2LDYgKzk4LDExIEBACiAJdW5zaWduZWQgaW50ICAgICAgICAgd2F0Y2hfc3RlcmVvOjE7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtc3Bfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG1zcF9zdGF0ZSwgc2QpOworfQorCiAvKiBtc3AzNDAwLWRyaXZlci5jICovCiBpbnQgbXNwX3dyaXRlX2RlbShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkciwgaW50IHZhbCk7CiBpbnQgbXNwX3dyaXRlX2RzcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkciwgaW50IHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCmluZGV4IDg0NmExNGEuLmE2NTVlOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAogc3RhdGljIHZvaWQgbXNwX3NldF9zb3VyY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHNyYykKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCiAJaWYgKG1zcF9kb2xieSkgewogCQltc3Bfd3JpdGVfZHNwKGNsaWVudCwgMHgwMDA4LCAweDA1MjApOyAvKiBJMlMxICovCkBAIC0xODYsNyArMTg2LDcgQEAKIAogdm9pZCBtc3AzNDAwY19zZXRfbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgbW9kZSkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCXN0cnVjdCBtc3AzNDAwY19pbml0X2RhdGFfZGVtICpkYXRhID0gJm1zcDM0MDBjX2luaXRfZGF0YVttb2RlXTsKIAlpbnQgdHVuZXIgPSAoc3RhdGUtPnJvdXRpbmcuaW5wdXQgPj4gMykgJiAxOwogCWludCBpOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJc3RhdGljIGNoYXIgKnN0cm1vZGVbXSA9IHsKIAkJIm1vbm8iLCAic3RlcmVvIiwgImxhbmcyIiwgImxhbmcxIiwgImxhbmcxK2xhbmcyIgogCX07Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAljaGFyICptb2Rlc3RyID0gKHN0YXRlLT5hdWRtb2RlID49IDAgJiYgc3RhdGUtPmF1ZG1vZGUgPCA1KSA/CiAJCXN0cm1vZGVbc3RhdGUtPmF1ZG1vZGVdIDogInVua25vd24iOwogCWludCBzcmMgPSAwOwkvKiBjaGFubmVsIHNvdXJjZTogRk0vQU0sIG5pY2FtIG9yIFNDQVJUICovCkBAIC0zNTYsNyArMzU2LDcgQEAKIAogc3RhdGljIHZvaWQgbXNwMzQwMGNfcHJpbnRfbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAKIAlpZiAoc3RhdGUtPm1haW4gPT0gc3RhdGUtPnNlY29uZCkKIAkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwKQEAgLTM4NSw3ICszODUsNyBAQAogCiBzdGF0aWMgaW50IG1zcDM0MDBjX2RldGVjdF9zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCB2YWw7CiAJaW50IHJ4c3ViY2hhbnMgPSBzdGF0ZS0+cnhzdWJjaGFuczsKIAlpbnQgbmV3bmljYW0gPSBzdGF0ZS0+bmljYW1fb247CkBAIC00NjMsNyArNDYzLDcgQEAKIC8qIHN0ZXJlby9tdWx0aWxhbmcgbW9uaXRvcmluZyAqLwogc3RhdGljIHZvaWQgd2F0Y2hfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCWlmIChtc3BfZGV0ZWN0X3N0ZXJlbyhjbGllbnQpKQogCQltc3Bfc2V0X2F1ZG1vZGUoY2xpZW50KTsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogaW50IG1zcDM0MDBjX3RocmVhZCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhOwotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJc3RydWN0IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0ICpjZDsKIAlpbnQgY291bnQsIG1heDEsIG1heDIsIHZhbDEsIHZhbDIsIHZhbCwgaTsKIApAQCAtNjU5LDcgKzY1OSw3IEBACiBpbnQgbXNwMzQxMGRfdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGE7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlpbnQgdmFsLCBpLCBzdGQsIGNvdW50OwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MTAgZGFlbW9uIHN0YXJ0ZWRcbiIpOwpAQCAtODI1LDcgKzgyNSw3IEBACiAKIHN0YXRpYyBpbnQgbXNwMzR4eGdfbW9kdXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCiAJaWYgKHN0YXRlLT5yYWRpbykgewogCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAic2VsZWN0ZWQgcmFkaW8gbW9kdXNcbiIpOwpAQCAtODUyLDcgKzg1Miw3IEBACiAKIHN0YXRpYyB2b2lkIG1zcDM0eHhnX3NldF9zb3VyY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgaW50IGluKQogIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCBzb3VyY2UsIG1hdHJpeDsKIAogCXN3aXRjaCAoc3RhdGUtPmF1ZG1vZGUpIHsKQEAgLTg5NSw3ICs4OTUsNyBAQAogCiBzdGF0aWMgdm9pZCBtc3AzNHh4Z19zZXRfc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJdTMyIGluID0gc3RhdGUtPnJvdXRpbmcuaW5wdXQ7CiAKIAltc3AzNHh4Z19zZXRfc291cmNlKGNsaWVudCwgMHgwMDA4LCAoaW4gPj4gNCkgJiAweGYpOwpAQCAtOTExLDcgKzkxMSw3IEBACiAvKiAocmUtKWluaXRpYWxpemUgdGhlIG1zcDM0eHhnICovCiBzdGF0aWMgdm9pZCBtc3AzNHh4Z19yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJaW50IHR1bmVyID0gKHN0YXRlLT5yb3V0aW5nLmlucHV0ID4+IDMpICYgMTsKIAlpbnQgbW9kdXM7CiAKQEAgLTk1NCw3ICs5NTQsNyBAQAogaW50IG1zcDM0eHhnX3RocmVhZCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhOwotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJaW50IHZhbCwgaTsKIAogCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyBkYWVtb24gc3RhcnRlZFxuIik7CkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCiBzdGF0aWMgaW50IG1zcDM0eHhnX2RldGVjdF9zdGVyZW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCWludCBzdGF0dXMgPSBtc3BfcmVhZF9kZW0oY2xpZW50LCAweDAyMDApOwogCWludCBpc19iaWxpbmd1YWwgPSBzdGF0dXMgJiAweDEwMDsKIAlpbnQgaXNfc3RlcmVvID0gc3RhdHVzICYgMHg0MDsKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAKIHN0YXRpYyB2b2lkIG1zcDM0eHhnX3NldF9hdWRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCWlmIChzdGF0ZS0+c3RkID09IDB4MjApIHsKIAkgICAgICAgaWYgKChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX1NBUCkgJiYKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAKIHZvaWQgbXNwX3NldF9hdWRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCXN3aXRjaCAoc3RhdGUtPm9wbW9kZSkgewogCWNhc2UgT1BNT0RFX01BTlVBTDoKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIGludCBtc3BfZGV0ZWN0X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlICA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlICA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAogCXN3aXRjaCAoc3RhdGUtPm9wbW9kZSkgewogCWNhc2UgT1BNT0RFX01BTlVBTDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKaW5kZXggMGM1MjQzNy4uMWExYTEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKQEAgLTI3MiwyMSArMjcyLDIwIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtdDltMDAxX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKIAlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMDAxLCBpY2QpOwotCXVuc2lnbmVkIGludCB3aWR0aF9mbGFnID0gU09DQU1fREFUQVdJRFRIXzEwOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IG10OW0wMDEtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJLyogTVQ5TTAwMSBoYXMgYWxsIGNhcHR1cmVfZm9ybWF0IHBhcmFtZXRlcnMgZml4ZWQgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fREFUQVdJRFRIXzEwIHwgU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKKwkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVNPQ0FNX01BU1RFUjsKIAogCWlmIChidXNfc3dpdGNoX3Bvc3NpYmxlKG10OW0wMDEpKQotCQl3aWR0aF9mbGFnIHw9IFNPQ0FNX0RBVEFXSURUSF84OworCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfODsKIAotCS8qIE1UOU0wMDEgaGFzIGFsbCBjYXB0dXJlX2Zvcm1hdCBwYXJhbWV0ZXJzIGZpeGVkICovCi0JcmV0dXJuIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9NQVNURVIgfAotCQl3aWR0aF9mbGFnOworCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBtdDltMDAxX3NldF9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQlfX3UzMiBwaXhmbXQsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCitzdGF0aWMgaW50IG10OW0wMDFfc2V0X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgIF9fdTMyIHBpeGZtdCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCkKIHsKIAlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMDAxLCBpY2QpOwogCWludCByZXQ7CkBAIC0yOTgsNyArMjk3LDcgQEAKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9WRVJUSUNBTF9CTEFOS0lORywgdmJsYW5rKTsKIAogCS8qIFRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzdXBwb3J0ZWQgZm9ybWF0LCBhcyB2ZXJpZmllZCBwZXIKLQkgKiBjYWxsIHRvIGljZC0+dHJ5X2ZtdF9jYXAoKSAqLworCSAqIGNhbGwgdG8gaWNkLT50cnlfZm10KCkgKi8KIAlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9DT0xVTU5fU1RBUlQsIHJlY3QtPmxlZnQpOwogCWlmICghcmV0KQpAQCAtMzI1LDE4ICszMjQsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0wMDFfdHJ5X2ZtdF9jYXAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQorc3RhdGljIGludCBtdDltMDAxX3RyeV9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0JaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgMzIgKyBpY2QtPnlfc2tpcF90b3ApCi0JCWYtPmZtdC5waXguaGVpZ2h0ID0gMzIgKyBpY2QtPnlfc2tpcF90b3A7Ci0JaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gMTAyNCArIGljZC0+eV9za2lwX3RvcCkKLQkJZi0+Zm10LnBpeC5oZWlnaHQgPSAxMDI0ICsgaWNkLT55X3NraXBfdG9wOwotCWlmIChmLT5mbXQucGl4LndpZHRoIDwgNDgpCi0JCWYtPmZtdC5waXgud2lkdGggPSA0ODsKLQlpZiAoZi0+Zm10LnBpeC53aWR0aCA+IDEyODApCi0JCWYtPmZtdC5waXgud2lkdGggPSAxMjgwOwotCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDE7IC8qIGhhcyB0byBiZSBldmVuLCB1bnN1cmUgd2h5IHdhcyB+MyAqLworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCisJaWYgKHBpeC0+aGVpZ2h0IDwgMzIgKyBpY2QtPnlfc2tpcF90b3ApCisJCXBpeC0+aGVpZ2h0ID0gMzIgKyBpY2QtPnlfc2tpcF90b3A7CisJaWYgKHBpeC0+aGVpZ2h0ID4gMTAyNCArIGljZC0+eV9za2lwX3RvcCkKKwkJcGl4LT5oZWlnaHQgPSAxMDI0ICsgaWNkLT55X3NraXBfdG9wOworCWlmIChwaXgtPndpZHRoIDwgNDgpCisJCXBpeC0+d2lkdGggPSA0ODsKKwlpZiAocGl4LT53aWR0aCA+IDEyODApCisJCXBpeC0+d2lkdGggPSAxMjgwOworCXBpeC0+d2lkdGggJj0gfjB4MDE7IC8qIGhhcyB0byBiZSBldmVuLCB1bnN1cmUgd2h5IHdhcyB+MyAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NDcsOCArNDQ4LDggQEAKIAkucmVsZWFzZQkJPSBtdDltMDAxX3JlbGVhc2UsCiAJLnN0YXJ0X2NhcHR1cmUJCT0gbXQ5bTAwMV9zdGFydF9jYXB0dXJlLAogCS5zdG9wX2NhcHR1cmUJCT0gbXQ5bTAwMV9zdG9wX2NhcHR1cmUsCi0JLnNldF9mbXRfY2FwCQk9IG10OW0wMDFfc2V0X2ZtdF9jYXAsCi0JLnRyeV9mbXRfY2FwCQk9IG10OW0wMDFfdHJ5X2ZtdF9jYXAsCisJLnNldF9mbXQJCT0gbXQ5bTAwMV9zZXRfZm10LAorCS50cnlfZm10CQk9IG10OW0wMDFfdHJ5X2ZtdCwKIAkuc2V0X2J1c19wYXJhbQkJPSBtdDltMDAxX3NldF9idXNfcGFyYW0sCiAJLnF1ZXJ5X2J1c19wYXJhbQk9IG10OW0wMDFfcXVlcnlfYnVzX3BhcmFtLAogCS5jb250cm9scwkJPSBtdDltMDAxX2NvbnRyb2xzLApAQCAtNTc4LDYgKzU3OSw3IEBACiBzdGF0aWMgaW50IG10OW0wMDFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTAwMSwgaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBtdDltMDAxLT5jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXMzMiBkYXRhOwogCWludCByZXQ7CiAKQEAgLTU4OCw3ICs1OTAsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIEVuYWJsZSB0aGUgY2hpcCAqLwotCWRhdGEgPSByZWdfd3JpdGUoJm10OW0wMDEtPmljZCwgTVQ5TTAwMV9DSElQX0VOQUJMRSwgMSk7CisJZGF0YSA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfQ0hJUF9FTkFCTEUsIDEpOwogCWRldl9kYmcoJmljZC0+ZGV2LCAid3JpdGU6ICVkXG4iLCBkYXRhKTsKIAogCS8qIFJlYWQgb3V0IHRoZSBjaGlwIHZlcnNpb24gcmVnaXN0ZXIgKi8KQEAgLTYwMCw3ICs2MDIsNyBAQAogCWNhc2UgMHg4NDIxOgogCQltdDltMDAxLT5tb2RlbCA9IFY0TDJfSURFTlRfTVQ5TTAwMUMxMlNUOwogCQlpY2QtPmZvcm1hdHMgPSBtdDltMDAxX2NvbG91cl9mb3JtYXRzOwotCQlpZiAobXQ5bTAwMS0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSkKKwkJaWYgKGdwaW9faXNfdmFsaWQoaWNsLT5ncGlvKSkKIAkJCWljZC0+bnVtX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG10OW0wMDFfY29sb3VyX2Zvcm1hdHMpOwogCQllbHNlCiAJCQlpY2QtPm51bV9mb3JtYXRzID0gMTsKQEAgLTYwOCw3ICs2MTAsNyBAQAogCWNhc2UgMHg4NDMxOgogCQltdDltMDAxLT5tb2RlbCA9IFY0TDJfSURFTlRfTVQ5TTAwMUMxMlNUTTsKIAkJaWNkLT5mb3JtYXRzID0gbXQ5bTAwMV9tb25vY2hyb21lX2Zvcm1hdHM7Ci0JCWlmIChtdDltMDAxLT5jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhKQorCQlpZiAoZ3Bpb19pc192YWxpZChpY2wtPmdwaW8pKQogCQkJaWNkLT5udW1fZm9ybWF0cyA9IEFSUkFZX1NJWkUobXQ5bTAwMV9tb25vY2hyb21lX2Zvcm1hdHMpOwogCQllbHNlCiAJCQlpY2QtPm51bV9mb3JtYXRzID0gMTsKQEAgLTY0MCw4ICs2NDIsOCBAQAogCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0wMDEsIGljZCk7CiAKIAlkZXZfZGJnKCZpY2QtPmRldiwgIlZpZGVvICV4IHJlbW92ZWQ6ICVwLCAlcFxuIiwgbXQ5bTAwMS0+Y2xpZW50LT5hZGRyLAotCQltdDltMDAxLT5pY2QuZGV2LnBhcmVudCwgbXQ5bTAwMS0+aWNkLnZkZXYpOwotCXNvY19jYW1lcmFfdmlkZW9fc3RvcCgmbXQ5bTAwMS0+aWNkKTsKKwkJaWNkLT5kZXYucGFyZW50LCBpY2QtPnZkZXYpOworCXNvY19jYW1lcmFfdmlkZW9fc3RvcChpY2QpOwogfQogCiBzdGF0aWMgaW50IG10OW0wMDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKaW5kZXggZGEwYjJkNS4uYzg5ZWE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogRHJpdmVyIGZvciBNVDlNMTExIENNT1MgSW1hZ2UgU2Vuc29yIGZyb20gTWljcm9uCisgKiBEcml2ZXIgZm9yIE1UOU0xMTEvTVQ5TTExMiBDTU9TIEltYWdlIFNlbnNvciBmcm9tIE1pY3JvbgogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCwgUm9iZXJ0IEphcnptaWsgPHJvYmVydC5qYXJ6bWlrQGZyZWUuZnI+CiAgKgpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KIAogLyoKLSAqIG10OW0xMTEgaTJjIGFkZHJlc3MgaXMgMHg1ZCBvciAweDQ4IChkZXBlbmRpbmcgb24gU0FkZHIgcGluKQorICogbXQ5bTExMSBhbmQgbXQ5bTExMiBpMmMgYWRkcmVzcyBpcyAweDVkIG9yIDB4NDggKGRlcGVuZGluZyBvbiBTQWRkciBwaW4pCiAgKiBUaGUgcGxhdGZvcm0gaGFzIHRvIGRlZmluZSBpMmNfYm9hcmRfaW5mbyBhbmQgY2FsbCBpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygpCiAgKi8KIApAQCAtOTAsNyArOTAsNyBAQAogI2RlZmluZSBNVDlNMTExX09VVFBVVF9GT1JNQVRfQ1RSTDJfQgkweDE5YgogCiAjZGVmaW5lIE1UOU0xMTFfT1BNT0RFX0FVVE9FWFBPX0VOCSgxIDw8IDE0KQotCisjZGVmaW5lIE1UOU0xMTFfT1BNT0RFX0FVVE9XSElURUJBTF9FTgkoMSA8PCAxKQogCiAjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUgkoMSA8PCAxNCkKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfQllQQVNTX0lGUAkoMSA8PCAxMCkKQEAgLTEyOCw5ICsxMjgsMTQgQEAKIAkuY29sb3JzcGFjZSA9IF9jb2xvcnNwYWNlIH0KICNkZWZpbmUgUkdCX0ZNVChfbmFtZSwgX2RlcHRoLCBfZm91cmNjKSBcCiAJQ09MX0ZNVChfbmFtZSwgX2RlcHRoLCBfZm91cmNjLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQikKKyNkZWZpbmUgSlBHX0ZNVChfbmFtZSwgX2RlcHRoLCBfZm91cmNjKSBcCisJQ09MX0ZNVChfbmFtZSwgX2RlcHRoLCBfZm91cmNjLCBWNEwyX0NPTE9SU1BBQ0VfSlBFRykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RhdGFfZm9ybWF0IG10OW0xMTFfY29sb3VyX2Zvcm1hdHNbXSA9IHsKLQlDT0xfRk1UKCJZQ3JZQ2IgOCBiaXQiLCA4LCBWNEwyX1BJWF9GTVRfWVVZViwgVjRMMl9DT0xPUlNQQUNFX0pQRUcpLAorCUpQR19GTVQoIkNiWUNyWSAxNiBiaXQiLCAxNiwgVjRMMl9QSVhfRk1UX1VZVlkpLAorCUpQR19GTVQoIkNyWUNiWSAxNiBiaXQiLCAxNiwgVjRMMl9QSVhfRk1UX1ZZVVkpLAorCUpQR19GTVQoIllDYllDciAxNiBiaXQiLCAxNiwgVjRMMl9QSVhfRk1UX1lVWVYpLAorCUpQR19GTVQoIllDcllDYiAxNiBiaXQiLCAxNiwgVjRMMl9QSVhfRk1UX1lWWVUpLAogCVJHQl9GTVQoIlJHQiA1NjUiLCAxNiwgVjRMMl9QSVhfRk1UX1JHQjU2NSksCiAJUkdCX0ZNVCgiUkdCIDU1NSIsIDE2LCBWNEwyX1BJWF9GTVRfUkdCNTU1KSwKIAlSR0JfRk1UKCJCYXllciAoc1JHQikgMTAgYml0IiwgMTAsIFY0TDJfUElYX0ZNVF9TQkdHUjE2KSwKQEAgLTE0NSw3ICsxNTAsNyBAQAogc3RydWN0IG10OW0xMTEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlIGljZDsKLQlpbnQgbW9kZWw7CS8qIFY0TDJfSURFTlRfTVQ5TTExMSogY29kZXMgZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLworCWludCBtb2RlbDsJLyogVjRMMl9JREVOVF9NVDlNMTF4KiBjb2RlcyBmcm9tIHY0bDItY2hpcC1pZGVudC5oICovCiAJZW51bSBtdDltMTExX2NvbnRleHQgY29udGV4dDsKIAl1bnNpZ25lZCBpbnQgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0OwogCXUzMiBwaXhmbXQ7CkBAIC0xNTgsNiArMTYzLDcgQEAKIAl1bnNpZ25lZCBpbnQgc3dhcF9yZ2JfcmVkX2JsdWU6MTsKIAl1bnNpZ25lZCBpbnQgc3dhcF95dXZfeV9jaHJvbWFzOjE7CiAJdW5zaWduZWQgaW50IHN3YXBfeXV2X2NiX2NyOjE7CisJdW5zaWduZWQgaW50IGF1dG93aGl0ZWJhbGFuY2U6MTsKIH07CiAKIHN0YXRpYyBpbnQgcmVnX3BhZ2VfbWFwX3NldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1MTYgcmVnKQpAQCAtNDEwLDkgKzQxNiwxMyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlyZXR1cm4gU09DQU1fTUFTVEVSIHwgU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IG10OW0xMTEtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX01BU1RFUiB8IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8CiAJCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAogCQlTT0NBTV9EQVRBV0lEVEhfODsKKworCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBtdDltMTExX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHVuc2lnbmVkIGxvbmcgZikKQEAgLTQzOCw3ICs0NDgsMjQgQEAKIAljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CiAJCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU2NShpY2QpOwogCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAwOworCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7CisJCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihpY2QpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9WWVVZOgorCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAwOworCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDE7CisJCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihpY2QpOworCQlicmVhazsKIAljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOworCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7CisJCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihpY2QpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOworCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDE7CiAJCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihpY2QpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNDUyLDggKzQ3OSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgIF9fdTMyIHBpeGZtdCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCkKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgX191MzIgcGl4Zm10LCBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewogCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CiAJaW50IHJldDsKQEAgLTQ3MywxMyArNTAwLDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3RyeV9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgbXQ5bTExMV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IE1UOU0xMTFfTUFYX0hFSUdIVCkKLQkJZi0+Zm10LnBpeC5oZWlnaHQgPSBNVDlNMTExX01BWF9IRUlHSFQ7Ci0JaWYgKGYtPmZtdC5waXgud2lkdGggPiBNVDlNMTExX01BWF9XSURUSCkKLQkJZi0+Zm10LnBpeC53aWR0aCA9IE1UOU0xMTFfTUFYX1dJRFRIOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCisJaWYgKHBpeC0+aGVpZ2h0ID4gTVQ5TTExMV9NQVhfSEVJR0hUKQorCQlwaXgtPmhlaWdodCA9IE1UOU0xMTFfTUFYX0hFSUdIVDsKKwlpZiAocGl4LT53aWR0aCA+IE1UOU0xMTFfTUFYX1dJRFRIKQorCQlwaXgtPndpZHRoID0gTVQ5TTExMV9NQVhfV0lEVEg7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5Nyw4ICs2MjYsOCBAQAogCS5yZWxlYXNlCQk9IG10OW0xMTFfcmVsZWFzZSwKIAkuc3RhcnRfY2FwdHVyZQkJPSBtdDltMTExX3N0YXJ0X2NhcHR1cmUsCiAJLnN0b3BfY2FwdHVyZQkJPSBtdDltMTExX3N0b3BfY2FwdHVyZSwKLQkuc2V0X2ZtdF9jYXAJCT0gbXQ5bTExMV9zZXRfZm10X2NhcCwKLQkudHJ5X2ZtdF9jYXAJCT0gbXQ5bTExMV90cnlfZm10X2NhcCwKKwkuc2V0X2ZtdAkJPSBtdDltMTExX3NldF9mbXQsCisJLnRyeV9mbXQJCT0gbXQ5bTExMV90cnlfZm10LAogCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbSwKIAkuc2V0X2J1c19wYXJhbQkJPSBtdDltMTExX3NldF9idXNfcGFyYW0sCiAJLmNvbnRyb2xzCQk9IG10OW0xMTFfY29udHJvbHMsCkBAIC02MzQsMTggKzY2MywxNSBAQAogCiBzdGF0aWMgaW50IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXVuc2lnbmVkIGludCBkYXRhLCBnYWluOworCWludCBkYXRhOwogCiAJZGF0YSA9IHJlZ19yZWFkKEdMT0JBTF9HQUlOKTsKIAlpZiAoZGF0YSA+PSAwKQotCQlnYWluID0gKChkYXRhICYgKDEgPDwgMTApKSAqIDIpCi0JCQl8ICgoZGF0YSAmICgxIDw8IDkpKSAqIDIpCi0JCQl8IChkYXRhICYgMHgyZik7Ci0JZWxzZQotCQlnYWluID0gZGF0YTsKLQotCXJldHVybiBnYWluOworCQlyZXR1cm4gKGRhdGEgJiAweDJmKSAqICgxIDw8ICgoZGF0YSA+PiAxMCkgJiAxKSkgKgorCQkJKDEgPDwgKChkYXRhID4+IDkpICYgMSkpOworCXJldHVybiBkYXRhOwogfQorCiBzdGF0aWMgaW50IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBpbnQgZ2FpbikKIHsKIAl1MTYgdmFsOwpAQCAtNjc5LDYgKzcwNSwyMyBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBpbnQgb24pCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgcmV0OworCisJaWYgKG9uKQorCQlyZXQgPSByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOworCWVsc2UKKwkJcmV0ID0gcmVnX2NsZWFyKE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOworCisJaWYgKCFyZXQpCisJCW10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UgPSBvbjsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbXQ5bTExMV9nZXRfY29udHJvbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewpAQCAtNzE1LDYgKzc1OCw5IEBACiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCQljdHJsLT52YWx1ZSA9IG10OW0xMTEtPmF1dG9leHBvc3VyZTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCWN0cmwtPnZhbHVlID0gbXQ5bTExMS0+YXV0b3doaXRlYmFsYW5jZTsKKwkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzQ4LDYgKzc5NCw5IEBACiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKGljZCwgY3RybC0+dmFsdWUpOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UoaWNkLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CiAJfQpAQCAtNzY2LDYgKzgxNSw3IEBACiAJbXQ5bTExMV9zZXRfZmxpcChpY2QsIG10OW0xMTEtPnZmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7CiAJbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oaWNkLCBpY2QtPmdhaW4pOwogCW10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShpY2QsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CisJbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShpY2QsIG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UpOwogCXJldHVybiAwOwogfQogCkBAIC03OTgsNyArODQ4LDcgQEAKIAlpZiAoIXJldCkKIAkJcmV0ID0gbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKGljZCwgbXQ5bTExMS0+YXV0b2V4cG9zdXJlKTsKIAlpZiAocmV0KQotCQlkZXZfZXJyKCZpY2QtPmRldiwgIm10OW0xMTEgaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKCZpY2QtPmRldiwgIm10OW0xMXggaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTgwOCw3ICs4NTgsNyBAQAogCiAJcmV0ID0gbXQ5bTExMV9kaXNhYmxlKGljZCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmljZC0+ZGV2LCAibXQ5bTExMSByZWxlYXNlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoJmljZC0+ZGV2LCAibXQ5bTExeCByZWxlYXNlIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtODQxLDI1ICs4OTEsMzAgQEAKIAlkYXRhID0gcmVnX3JlYWQoQ0hJUF9WRVJTSU9OKTsKIAogCXN3aXRjaCAoZGF0YSkgewotCWNhc2UgMHgxNDNhOgorCWNhc2UgMHgxNDNhOiAvKiBNVDlNMTExICovCiAJCW10OW0xMTEtPm1vZGVsID0gVjRMMl9JREVOVF9NVDlNMTExOwotCQlpY2QtPmZvcm1hdHMgPSBtdDltMTExX2NvbG91cl9mb3JtYXRzOwotCQlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShtdDltMTExX2NvbG91cl9mb3JtYXRzKTsKKwkJYnJlYWs7CisJY2FzZSAweDE0OGM6IC8qIE1UOU0xMTIgKi8KKwkJbXQ5bTExMS0+bW9kZWwgPSBWNEwyX0lERU5UX01UOU0xMTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9ERVY7CiAJCWRldl9lcnIoJmljZC0+ZGV2LAotCQkJIk5vIE1UOU0xMTEgY2hpcCBkZXRlY3RlZCwgcmVnaXN0ZXIgcmVhZCAleFxuIiwgZGF0YSk7CisJCQkiTm8gTVQ5TTExeCBjaGlwIGRldGVjdGVkLCByZWdpc3RlciByZWFkICV4XG4iLCBkYXRhKTsKIAkJZ290byBlaTJjOwogCX0KIAotCWRldl9pbmZvKCZpY2QtPmRldiwgIkRldGVjdGVkIGEgTVQ5TTExMSBjaGlwIElEIDB4MTQzYVxuIik7CisJaWNkLT5mb3JtYXRzID0gbXQ5bTExMV9jb2xvdXJfZm9ybWF0czsKKwlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShtdDltMTExX2NvbG91cl9mb3JtYXRzKTsKKworCWRldl9pbmZvKCZpY2QtPmRldiwgIkRldGVjdGVkIGEgTVQ5TTExeCBjaGlwIElEICV4XG4iLCBkYXRhKTsKIAogCXJldCA9IHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoaWNkKTsKIAlpZiAocmV0KQogCQlnb3RvIGVpc2lzOwogCiAJbXQ5bTExMS0+YXV0b2V4cG9zdXJlID0gMTsKKwltdDltMTExLT5hdXRvd2hpdGViYWxhbmNlID0gMTsKIAogCW10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkID0gMTsKIAltdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSA9IDE7CkBAIC04ODksNyArOTQ0LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFpY2wpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlNMTExIGRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlNMTF4IGRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05NjgsNiArMTAyMyw2IEBACiBtb2R1bGVfaW5pdChtdDltMTExX21vZF9pbml0KTsKIG1vZHVsZV9leGl0KG10OW0xMTFfbW9kX2V4aXQpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvbiBNVDlNMTExIENhbWVyYSBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9uIE1UOU0xMTEvTVQ5TTExMiBDYW1lcmEgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJSb2JlcnQgSmFyem1payIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlkNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIE1UOVQwMzEgQ01PUyBJbWFnZSBTZW5zb3IgZnJvbSBNaWNyb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEd1ZW5uYWRpIExpYWtob3ZldHNraSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8bGdAZGVueC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisKKy8qIG10OXQwMzEgaTJjIGFkZHJlc3MgMHg1ZAorICogVGhlIHBsYXRmb3JtIGhhcyB0byBkZWZpbmUgaTJjX2JvYXJkX2luZm8KKyAqIGFuZCBjYWxsIGkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKCkgKi8KKworLyogbXQ5dDAzMSBzZWxlY3RlZCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgTVQ5VDAzMV9DSElQX1ZFUlNJT04JCTB4MDAKKyNkZWZpbmUgTVQ5VDAzMV9ST1dfU1RBUlQJCTB4MDEKKyNkZWZpbmUgTVQ5VDAzMV9DT0xVTU5fU1RBUlQJCTB4MDIKKyNkZWZpbmUgTVQ5VDAzMV9XSU5ET1dfSEVJR0hUCQkweDAzCisjZGVmaW5lIE1UOVQwMzFfV0lORE9XX1dJRFRICQkweDA0CisjZGVmaW5lIE1UOVQwMzFfSE9SSVpPTlRBTF9CTEFOS0lORwkweDA1CisjZGVmaW5lIE1UOVQwMzFfVkVSVElDQUxfQkxBTktJTkcJMHgwNgorI2RlZmluZSBNVDlUMDMxX09VVFBVVF9DT05UUk9MCQkweDA3CisjZGVmaW5lIE1UOVQwMzFfU0hVVFRFUl9XSURUSF9VUFBFUgkweDA4CisjZGVmaW5lIE1UOVQwMzFfU0hVVFRFUl9XSURUSAkJMHgwOQorI2RlZmluZSBNVDlUMDMxX1BJWEVMX0NMT0NLX0NPTlRST0wJMHgwYQorI2RlZmluZSBNVDlUMDMxX0ZSQU1FX1JFU1RBUlQJCTB4MGIKKyNkZWZpbmUgTVQ5VDAzMV9TSFVUVEVSX0RFTEFZCQkweDBjCisjZGVmaW5lIE1UOVQwMzFfUkVTRVQJCQkweDBkCisjZGVmaW5lIE1UOVQwMzFfUkVBRF9NT0RFXzEJCTB4MWUKKyNkZWZpbmUgTVQ5VDAzMV9SRUFEX01PREVfMgkJMHgyMAorI2RlZmluZSBNVDlUMDMxX1JFQURfTU9ERV8zCQkweDIxCisjZGVmaW5lIE1UOVQwMzFfUk9XX0FERFJFU1NfTU9ERQkweDIyCisjZGVmaW5lIE1UOVQwMzFfQ09MVU1OX0FERFJFU1NfTU9ERQkweDIzCisjZGVmaW5lIE1UOVQwMzFfR0xPQkFMX0dBSU4JCTB4MzUKKyNkZWZpbmUgTVQ5VDAzMV9DSElQX0VOQUJMRQkJMHhGOAorCisjZGVmaW5lIE1UOVQwMzFfTUFYX0hFSUdIVAkJMTUzNgorI2RlZmluZSBNVDlUMDMxX01BWF9XSURUSAkJMjA0OAorI2RlZmluZSBNVDlUMDMxX01JTl9IRUlHSFQJCTIKKyNkZWZpbmUgTVQ5VDAzMV9NSU5fV0lEVEgJCTIKKyNkZWZpbmUgTVQ5VDAzMV9IT1JJWk9OVEFMX0JMQU5LCTE0MgorI2RlZmluZSBNVDlUMDMxX1ZFUlRJQ0FMX0JMQU5LCQkyNQorI2RlZmluZSBNVDlUMDMxX0NPTFVNTl9TS0lQCQkzMgorI2RlZmluZSBNVDlUMDMxX1JPV19TS0lQCQkyMAorCisjZGVmaW5lIE1UOVQwMzFfQlVTX1BBUkFNCShTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAlcCisJU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwJXAorCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8CVwKKwlTT0NBTV9NQVNURVIgfCBTT0NBTV9EQVRBV0lEVEhfMTApCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCBtdDl0MDMxX2NvbG91cl9mb3JtYXRzW10gPSB7CisJeworCQkubmFtZQkJPSAiQmF5ZXIgKHNSR0IpIDEwIGJpdCIsCisJCS5kZXB0aAkJPSAxMCwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfU0dSQkcxMCwKKwkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwl9Cit9OworCitzdHJ1Y3QgbXQ5dDAzMSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgaWNkOworCWludCBtb2RlbDsJLyogVjRMMl9JREVOVF9NVDlUMDMxKiBjb2RlcyBmcm9tIHY0bDItY2hpcC1pZGVudC5oICovCisJdW5zaWduZWQgY2hhciBhdXRvZXhwb3N1cmU7CisJdTE2IHhza2lwOworCXUxNiB5c2tpcDsKK307CisKK3N0YXRpYyBpbnQgcmVnX3JlYWQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGNvbnN0IHU4IHJlZykKK3sKKwlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDl0MDMxLCBpY2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBtdDl0MDMxLT5jbGllbnQ7CisJczMyIGRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCXJldHVybiBkYXRhIDwgMCA/IGRhdGEgOiBzd2FiMTYoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnX3dyaXRlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBjb25zdCB1OCByZWcsCisJCSAgICAgY29uc3QgdTE2IGRhdGEpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5dDAzMSwgaWNkKTsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShtdDl0MDMxLT5jbGllbnQsIHJlZywgc3dhYjE2KGRhdGEpKTsKK30KKworc3RhdGljIGludCByZWdfc2V0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBjb25zdCB1OCByZWcsCisJCSAgIGNvbnN0IHUxNiBkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfcmVhZChpY2QsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ193cml0ZShpY2QsIHJlZywgcmV0IHwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2NsZWFyKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBjb25zdCB1OCByZWcsCisJCSAgICAgY29uc3QgdTE2IGRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ19yZWFkKGljZCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnX3dyaXRlKGljZCwgcmVnLCByZXQgJiB+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NodXR0ZXIoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGNvbnN0IHUzMiBkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX1NIVVRURVJfV0lEVEhfVVBQRVIsIGRhdGEgPj4gMTYpOworCisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX1NIVVRURVJfV0lEVEgsIGRhdGEgJiAweGZmZmYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfc2h1dHRlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdTMyICpkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfcmVhZChpY2QsIE1UOVQwMzFfU0hVVFRFUl9XSURUSF9VUFBFUik7CisJKmRhdGEgPSByZXQgPDwgMTY7CisKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHJlZ19yZWFkKGljZCwgTVQ5VDAzMV9TSFVUVEVSX1dJRFRIKTsKKwkqZGF0YSB8PSByZXQgJiAweGZmZmY7CisKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAzMV9pbml0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIGNoaXAgb3V0cHV0LCBzeW5jaHJvbm91cyBvcHRpb24gdXBkYXRlICovCisJZGV2X2RiZyhpY2QtPnZkZXYtPnBhcmVudCwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX1JFU0VULCAxKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfUkVTRVQsIDApOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gcmVnX2NsZWFyKGljZCwgTVQ5VDAzMV9PVVRQVVRfQ09OVFJPTCwgMyk7CisKKwlyZXR1cm4gcmV0ID49IDAgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBtdDl0MDMxX3JlbGVhc2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJLyogRGlzYWJsZSB0aGUgY2hpcCAqLworCXJlZ19jbGVhcihpY2QsIE1UOVQwMzFfT1VUUFVUX0NPTlRST0wsIDMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMzFfc3RhcnRfY2FwdHVyZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwkvKiBTd2l0Y2ggdG8gbWFzdGVyICJub3JtYWwiIG1vZGUgKi8KKwlpZiAocmVnX3NldChpY2QsIE1UOVQwMzFfT1VUUFVUX0NPTlRST0wsIDMpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAzMV9zdG9wX2NhcHR1cmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJLyogU3RvcCBzZW5zb3IgcmVhZG91dCAqLworCWlmIChyZWdfY2xlYXIoaWNkLCBNVDlUMDMxX09VVFBVVF9DT05UUk9MLCAzKSA8IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMzFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwkvKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIHF1ZXJpZWQgb3VyIHBhcmFtZXRlcnMsIGNoZWNrIGFueXdheSAqLworCWlmIChmbGFncyAmIH5NVDlUMDMxX0JVU19QQVJBTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCQlyZWdfc2V0KGljZCwgTVQ5VDAzMV9QSVhFTF9DTE9DS19DT05UUk9MLCAweDgwMDApOworCWVsc2UKKwkJcmVnX2NsZWFyKGljZCwgTVQ5VDAzMV9QSVhFTF9DTE9DS19DT05UUk9MLCAweDgwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG10OXQwMzFfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXQwMzEsIGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gbXQ5dDAzMS0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIE1UOVQwMzFfQlVTX1BBUkFNKTsKK30KKworc3RhdGljIGludCBtdDl0MDMxX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICBfX3UzMiBwaXhmbXQsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5dDAzMSwgaWNkKTsKKwlpbnQgcmV0OworCWNvbnN0IHUxNiBoYmxhbmsgPSBNVDlUMDMxX0hPUklaT05UQUxfQkxBTkssCisJCXZibGFuayA9IE1UOVQwMzFfVkVSVElDQUxfQkxBTks7CisJdTE2IHhiaW4sIHhza2lwID0gbXQ5dDAzMS0+eHNraXAsIHliaW4sIHlza2lwID0gbXQ5dDAzMS0+eXNraXAsCisJCXdpZHRoID0gcmVjdC0+d2lkdGggKiB4c2tpcCwgaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0ICogeXNraXA7CisKKwlpZiAocGl4Zm10KSB7CisJCS8qIFNfRk1UIC0gdXNlIGJpbm5pbmcgYW5kIHNraXBwaW5nIGZvciBzY2FsaW5nLCByZWNhbGN1bGF0ZSAqLworCQkvKiBJcyB0aGlzIG1vcmUgb3B0aW1hbCB0aGFuIGp1c3QgYSBkaXZpc2lvbj8gKi8KKwkJZm9yICh4c2tpcCA9IDg7IHhza2lwID4gMTsgeHNraXAtLSkKKwkJCWlmIChyZWN0LT53aWR0aCAqIHhza2lwIDw9IGljZC0+d2lkdGhfbWF4KQorCQkJCWJyZWFrOworCisJCWZvciAoeXNraXAgPSA4OyB5c2tpcCA+IDE7IHlza2lwLS0pCisJCQlpZiAocmVjdC0+aGVpZ2h0ICogeXNraXAgPD0gaWNkLT5oZWlnaHRfbWF4KQorCQkJCWJyZWFrOworCisJCXdpZHRoID0gcmVjdC0+d2lkdGggKiB4c2tpcDsKKwkJaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0ICogeXNraXA7CisKKwkJZGV2X2RiZygmaWNkLT5kZXYsICJ4c2tpcCAldSwgd2lkdGggJXUsIHlza2lwICV1LCBoZWlnaHQgJXVcbiIsCisJCQl4c2tpcCwgd2lkdGgsIHlza2lwLCBoZWlnaHQpOworCX0KKworCXhiaW4gPSBtaW4oeHNraXAsICh1MTYpMyk7CisJeWJpbiA9IG1pbih5c2tpcCwgKHUxNikzKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgZnJhbWUgbGltaXRzICovCisJaWYgKHJlY3QtPmxlZnQgKyB3aWR0aCA+IGljZC0+d2lkdGhfbWF4KQorCQlyZWN0LT5sZWZ0ID0gKGljZC0+d2lkdGhfbWF4IC0gd2lkdGgpIC8gMjsKKworCWlmIChyZWN0LT50b3AgKyBoZWlnaHQgPiBpY2QtPmhlaWdodF9tYXgpCisJCXJlY3QtPnRvcCA9IChpY2QtPmhlaWdodF9tYXggLSBoZWlnaHQpIC8gMjsKKworCS8qIENvdWxkIGp1c3QgZG8gcm91bmR1cChyZWN0LT5sZWZ0LCBbeHldYmluKTsgYnV0IHRoaXMgaXMgY2hlYXBlciAqLworCXN3aXRjaCAoeGJpbikgeworCWNhc2UgMjoKKwkJcmVjdC0+bGVmdCA9IChyZWN0LT5sZWZ0ICsgMSkgJiB+MTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWN0LT5sZWZ0ID0gcm91bmR1cChyZWN0LT5sZWZ0LCAzKTsKKwl9CisKKwlzd2l0Y2ggKHliaW4pIHsKKwljYXNlIDI6CisJCXJlY3QtPnRvcCA9IChyZWN0LT50b3AgKyAxKSAmIH4xOworCQlicmVhazsKKwljYXNlIDM6CisJCXJlY3QtPnRvcCA9IHJvdW5kdXAocmVjdC0+dG9wLCAzKTsKKwl9CisKKwkvKiBCbGFua2luZyBhbmQgc3RhcnQgdmFsdWVzIC0gZGVmYXVsdC4uLiAqLworCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfSE9SSVpPTlRBTF9CTEFOS0lORywgaGJsYW5rKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfVkVSVElDQUxfQkxBTktJTkcsIHZibGFuayk7CisKKwlpZiAocGl4Zm10KSB7CisJCS8qIEJpbm5pbmcsIHNraXBwaW5nICovCisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfQ09MVU1OX0FERFJFU1NfTU9ERSwKKwkJCQkJKCh4YmluIC0gMSkgPDwgNCkgfCAoeHNraXAgLSAxKSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfUk9XX0FERFJFU1NfTU9ERSwKKwkJCQkJKCh5YmluIC0gMSkgPDwgNCkgfCAoeXNraXAgLSAxKSk7CisJfQorCWRldl9kYmcoJmljZC0+ZGV2LCAibmV3IGxlZnQgJXUsIHRvcCAldVxuIiwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wKTsKKworCS8qIFRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzdXBwb3J0ZWQgZm9ybWF0LCBhcyBndWFyYW50ZWVkIGJ5CisJICogaWNkLT50cnlfZm10X2NhcCgpLCBzb2NfY2FtZXJhX3NfY3JvcCgpIGFuZCBzb2NfY2FtZXJhX2Nyb3BjYXAoKSAqLworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VDAzMV9DT0xVTU5fU1RBUlQsIHJlY3QtPmxlZnQpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VDAzMV9ST1dfU1RBUlQsIHJlY3QtPnRvcCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX1dJTkRPV19XSURUSCwgd2lkdGggLSAxKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVQwMzFfV0lORE9XX0hFSUdIVCwKKwkJCQloZWlnaHQgKyBpY2QtPnlfc2tpcF90b3AgLSAxKTsKKwlpZiAocmV0ID49IDAgJiYgbXQ5dDAzMS0+YXV0b2V4cG9zdXJlKSB7CisJCXJldCA9IHNldF9zaHV0dGVyKGljZCwgaGVpZ2h0ICsgaWNkLT55X3NraXBfdG9wICsgdmJsYW5rKTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQljb25zdCB1MzIgc2h1dHRlcl9tYXggPSBNVDlUMDMxX01BWF9IRUlHSFQgKyB2Ymxhbms7CisJCQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsID0KKwkJCQlzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoaWNkLT5vcHMsCisJCQkJCQkgICAgICBWNEwyX0NJRF9FWFBPU1VSRSk7CisJCQlpY2QtPmV4cG9zdXJlID0gKHNodXR0ZXJfbWF4IC8gMiArIChoZWlnaHQgKworCQkJCQkgaWNkLT55X3NraXBfdG9wICsgdmJsYW5rIC0gMSkgKgorCQkJCQkgKHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW0pKSAvCisJCQkJc2h1dHRlcl9tYXggKyBxY3RybC0+bWluaW11bTsKKwkJfQorCX0KKworCWlmICghcmV0ICYmIHBpeGZtdCkgeworCQltdDl0MDMxLT54c2tpcCA9IHhza2lwOworCQltdDl0MDMxLT55c2tpcCA9IHlza2lwOworCX0KKworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKK30KKworc3RhdGljIGludCBtdDl0MDMxX3RyeV9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisKKwlpZiAocGl4LT5oZWlnaHQgPCBpY2QtPmhlaWdodF9taW4pCisJCXBpeC0+aGVpZ2h0ID0gaWNkLT5oZWlnaHRfbWluOworCWlmIChwaXgtPmhlaWdodCA+IGljZC0+aGVpZ2h0X21heCkKKwkJcGl4LT5oZWlnaHQgPSBpY2QtPmhlaWdodF9tYXg7CisJaWYgKHBpeC0+d2lkdGggPCBpY2QtPndpZHRoX21pbikKKwkJcGl4LT53aWR0aCA9IGljZC0+d2lkdGhfbWluOworCWlmIChwaXgtPndpZHRoID4gaWNkLT53aWR0aF9tYXgpCisJCXBpeC0+d2lkdGggPSBpY2QtPndpZHRoX21heDsKKworCXBpeC0+d2lkdGggJj0gfjB4MDE7IC8qIGhhcyB0byBiZSBldmVuICovCisJcGl4LT5oZWlnaHQgJj0gfjB4MDE7IC8qIGhhcyB0byBiZSBldmVuICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MDMxX2dldF9jaGlwX2lkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmlkKQoreworCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXQwMzEsIGljZCk7CisKKwlpZiAoaWQtPm1hdGNoX3R5cGUgIT0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpZC0+bWF0Y2hfY2hpcCAhPSBtdDl0MDMxLT5jbGllbnQtPmFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJaWQtPmlkZW50CT0gbXQ5dDAzMS0+bW9kZWw7CisJaWQtPnJldmlzaW9uCT0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCBtdDl0MDMxX2dldF9yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXQwMzEsIGljZCk7CisKKwlpZiAocmVnLT5tYXRjaF90eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiB8fCByZWctPnJlZyA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlZy0+bWF0Y2hfY2hpcCAhPSBtdDl0MDMxLT5jbGllbnQtPmFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJcmVnLT52YWwgPSByZWdfcmVhZChpY2QsIHJlZy0+cmVnKTsKKworCWlmIChyZWctPnZhbCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MDMxX3NldF9yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXQwMzEsIGljZCk7CisKKwlpZiAocmVnLT5tYXRjaF90eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiB8fCByZWctPnJlZyA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlZy0+bWF0Y2hfY2hpcCAhPSBtdDl0MDMxLT5jbGllbnQtPmFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHJlZ193cml0ZShpY2QsIHJlZy0+cmVnLCByZWctPnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXQ5dDAzMV9jb250cm9sc1tdID0geworCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKKwkJLm1pbmltdW0JPSAwLAorCQkubWF4aW11bQk9IDEsCisJCS5zdGVwCQk9IDEsCisJCS5kZWZhdWx0X3ZhbHVlCT0gMCwKKwl9LCB7CisJCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiIsCisJCS5taW5pbXVtCT0gMCwKKwkJLm1heGltdW0JPSAxMjcsCisJCS5zdGVwCQk9IDEsCisJCS5kZWZhdWx0X3ZhbHVlCT0gNjQsCisJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCisJfSwgeworCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkUsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCQk9ICJFeHBvc3VyZSIsCisJCS5taW5pbXVtCT0gMSwKKwkJLm1heGltdW0JPSAyNTUsCisJCS5zdGVwCQk9IDEsCisJCS5kZWZhdWx0X3ZhbHVlCT0gMjU1LAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAorCX0sIHsKKwkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJBdXRvbWF0aWMgRXhwb3N1cmUiLAorCQkubWluaW11bQk9IDAsCisJCS5tYXhpbXVtCT0gMSwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSAxLAorCX0KK307CisKK3N0YXRpYyBpbnQgbXQ5dDAzMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBtdDl0MDMxX3ZpZGVvX3JlbW92ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CitzdGF0aWMgaW50IG10OXQwMzFfZ2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2NvbnRyb2wgKik7CitzdGF0aWMgaW50IG10OXQwMzFfc2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2NvbnRyb2wgKik7CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5dDAzMV9vcHMgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkucHJvYmUJCQk9IG10OXQwMzFfdmlkZW9fcHJvYmUsCisJLnJlbW92ZQkJCT0gbXQ5dDAzMV92aWRlb19yZW1vdmUsCisJLmluaXQJCQk9IG10OXQwMzFfaW5pdCwKKwkucmVsZWFzZQkJPSBtdDl0MDMxX3JlbGVhc2UsCisJLnN0YXJ0X2NhcHR1cmUJCT0gbXQ5dDAzMV9zdGFydF9jYXB0dXJlLAorCS5zdG9wX2NhcHR1cmUJCT0gbXQ5dDAzMV9zdG9wX2NhcHR1cmUsCisJLnNldF9mbXQJCT0gbXQ5dDAzMV9zZXRfZm10LAorCS50cnlfZm10CQk9IG10OXQwMzFfdHJ5X2ZtdCwKKwkuc2V0X2J1c19wYXJhbQkJPSBtdDl0MDMxX3NldF9idXNfcGFyYW0sCisJLnF1ZXJ5X2J1c19wYXJhbQk9IG10OXQwMzFfcXVlcnlfYnVzX3BhcmFtLAorCS5jb250cm9scwkJPSBtdDl0MDMxX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtdDl0MDMxX2NvbnRyb2xzKSwKKwkuZ2V0X2NvbnRyb2wJCT0gbXQ5dDAzMV9nZXRfY29udHJvbCwKKwkuc2V0X2NvbnRyb2wJCT0gbXQ5dDAzMV9zZXRfY29udHJvbCwKKwkuZ2V0X2NoaXBfaWQJCT0gbXQ5dDAzMV9nZXRfY2hpcF9pZCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdldF9yZWdpc3RlcgkJPSBtdDl0MDMxX2dldF9yZWdpc3RlciwKKwkuc2V0X3JlZ2lzdGVyCQk9IG10OXQwMzFfc2V0X3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IG10OXQwMzFfZ2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5dDAzMSwgaWNkKTsKKwlpbnQgZGF0YTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlkYXRhID0gcmVnX3JlYWQoaWNkLCBNVDlUMDMxX1JFQURfTU9ERV8yKTsKKwkJaWYgKGRhdGEgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4ODAwMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCWRhdGEgPSByZWdfcmVhZChpY2QsIE1UOVQwMzFfUkVBRF9NT0RFXzIpOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHg0MDAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQljdHJsLT52YWx1ZSA9IG10OXQwMzEtPmF1dG9leHBvc3VyZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMzFfc2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5dDAzMSwgaWNkKTsKKwljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOworCWludCBkYXRhOworCisJcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OXQwMzFfb3BzLCBjdHJsLT5pZCk7CisKKwlpZiAoIXFjdHJsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQlkYXRhID0gcmVnX3NldChpY2QsIE1UOVQwMzFfUkVBRF9NT0RFXzIsIDB4ODAwMCk7CisJCWVsc2UKKwkJCWRhdGEgPSByZWdfY2xlYXIoaWNkLCBNVDlUMDMxX1JFQURfTU9ERV8yLCAweDgwMDApOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJZGF0YSA9IHJlZ19zZXQoaWNkLCBNVDlUMDMxX1JFQURfTU9ERV8yLCAweDQwMDApOworCQllbHNlCisJCQlkYXRhID0gcmVnX2NsZWFyKGljZCwgTVQ5VDAzMV9SRUFEX01PREVfMiwgMHg0MDAwKTsKKwkJaWYgKGRhdGEgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwgY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBTZWUgRGF0YXNoZWV0IFRhYmxlIDcsIEdhaW4gc2V0dGluZ3MuICovCisJCWlmIChjdHJsLT52YWx1ZSA8PSBxY3RybC0+ZGVmYXVsdF92YWx1ZSkgeworCQkJLyogUGFjayBpdCBpbnRvIDAuLjEgc3RlcCAwLjEyNSwgcmVnaXN0ZXIgdmFsdWVzIDAuLjggKi8KKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+ZGVmYXVsdF92YWx1ZSAtIHFjdHJsLT5taW5pbXVtOworCQkJZGF0YSA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiA4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlOworCisJCQlkZXZfZGJnKCZpY2QtPmRldiwgIlNldHRpbmcgZ2FpbiAlZFxuIiwgZGF0YSk7CisJCQlkYXRhID0gcmVnX3dyaXRlKGljZCwgTVQ5VDAzMV9HTE9CQUxfR0FJTiwgZGF0YSk7CisJCQlpZiAoZGF0YSA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSB7CisJCQkvKiBQYWNrIGl0IGludG8gMS4xMjUuLjE1IHZhcmlhYmxlIHN0ZXAsIHJlZ2lzdGVyIHZhbHVlcyA5Li42NyAqLworCQkJLyogV2UgYXNzdW1lIHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxID4gMCAqLworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxOworCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSkgKgorCQkJCQkgICAgICAgMTExICsgcmFuZ2UgLyAyKSAvIHJhbmdlICsgOTsKKworCQkJaWYgKGdhaW4gPD0gMzIpCisJCQkJZGF0YSA9IGdhaW47CisJCQllbHNlIGlmIChnYWluIDw9IDY0KQorCQkJCWRhdGEgPSAoKGdhaW4gLSAzMikgKiAxNiArIDE2KSAvIDMyICsgODA7CisJCQllbHNlCisJCQkJZGF0YSA9ICgoZ2FpbiAtIDY0KSAqIDcgKyAyOCkgLyA1NiArIDk2OworCisJCQlkZXZfZGJnKCZpY2QtPmRldiwgIlNldHRpbmcgZ2FpbiBmcm9tICVkIHRvICVkXG4iLAorCQkJCSByZWdfcmVhZChpY2QsIE1UOVQwMzFfR0xPQkFMX0dBSU4pLCBkYXRhKTsKKwkJCWRhdGEgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX0dMT0JBTF9HQUlOLCBkYXRhKTsKKwkJCWlmIChkYXRhIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIFN1Y2Nlc3MgKi8KKwkJaWNkLT5nYWluID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCS8qIG10OXQwMzEgaGFzIG1heGltdW0gPT0gZGVmYXVsdCAqLworCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgeworCQkJY29uc3QgdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07CisJCQljb25zdCB1MzIgc2h1dHRlciA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiAxMDQ4ICsKKwkJCQkJICAgICByYW5nZSAvIDIpIC8gcmFuZ2UgKyAxOworCQkJdTMyIG9sZDsKKworCQkJZ2V0X3NodXR0ZXIoaWNkLCAmb2xkKTsKKwkJCWRldl9kYmcoJmljZC0+ZGV2LCAiU2V0dGluZyBzaHV0dGVyIHdpZHRoIGZyb20gJXUgdG8gJXVcbiIsCisJCQkJb2xkLCBzaHV0dGVyKTsKKwkJCWlmIChzZXRfc2h1dHRlcihpY2QsIHNodXR0ZXIpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWljZC0+ZXhwb3N1cmUgPSBjdHJsLT52YWx1ZTsKKwkJCW10OXQwMzEtPmF1dG9leHBvc3VyZSA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlpZiAoY3RybC0+dmFsdWUpIHsKKwkJCWNvbnN0IHUxNiB2YmxhbmsgPSBNVDlUMDMxX1ZFUlRJQ0FMX0JMQU5LOworCQkJY29uc3QgdTMyIHNodXR0ZXJfbWF4ID0gTVQ5VDAzMV9NQVhfSEVJR0hUICsgdmJsYW5rOworCQkJaWYgKHNldF9zaHV0dGVyKGljZCwgaWNkLT5oZWlnaHQgKworCQkJCQlpY2QtPnlfc2tpcF90b3AgKyB2YmxhbmspIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXFjdHJsID0gc29jX2NhbWVyYV9maW5kX3FjdHJsKGljZC0+b3BzLCBWNEwyX0NJRF9FWFBPU1VSRSk7CisJCQlpY2QtPmV4cG9zdXJlID0gKHNodXR0ZXJfbWF4IC8gMiArIChpY2QtPmhlaWdodCArCisJCQkJCSBpY2QtPnlfc2tpcF90b3AgKyB2YmxhbmsgLSAxKSAqCisJCQkJCSAocWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bSkpIC8KKwkJCQlzaHV0dGVyX21heCArIHFjdHJsLT5taW5pbXVtOworCQkJbXQ5dDAzMS0+YXV0b2V4cG9zdXJlID0gMTsKKwkJfSBlbHNlCisJCQltdDl0MDMxLT5hdXRvZXhwb3N1cmUgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEludGVyZmFjZSBhY3RpdmUsIGNhbiB1c2UgaTJjLiBJZiBpdCBmYWlscywgaXQgY2FuIGluZGVlZCBtZWFuLCB0aGF0CisgKiB0aGlzIHdhc24ndCBvdXIgY2FwdHVyZSBpbnRlcmZhY2UsIHNvLCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgb25lICovCitzdGF0aWMgaW50IG10OXQwMzFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5dDAzMSwgaWNkKTsKKwlzMzIgZGF0YTsKKwlpbnQgcmV0OworCisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KKwkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LiAqLworCWlmICghaWNkLT5kZXYucGFyZW50IHx8CisJICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEVuYWJsZSB0aGUgY2hpcCAqLworCWRhdGEgPSByZWdfd3JpdGUoaWNkLCBNVDlUMDMxX0NISVBfRU5BQkxFLCAxKTsKKwlkZXZfZGJnKCZpY2QtPmRldiwgIndyaXRlOiAlZFxuIiwgZGF0YSk7CisKKwkvKiBSZWFkIG91dCB0aGUgY2hpcCB2ZXJzaW9uIHJlZ2lzdGVyICovCisJZGF0YSA9IHJlZ19yZWFkKGljZCwgTVQ5VDAzMV9DSElQX1ZFUlNJT04pOworCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAweDE2MjE6CisJCW10OXQwMzEtPm1vZGVsID0gVjRMMl9JREVOVF9NVDlUMDMxOworCQlpY2QtPmZvcm1hdHMgPSBtdDl0MDMxX2NvbG91cl9mb3JtYXRzOworCQlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShtdDl0MDMxX2NvbG91cl9mb3JtYXRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2VycigmaWNkLT5kZXYsCisJCQkiTm8gTVQ5VDAzMSBjaGlwIGRldGVjdGVkLCByZWdpc3RlciByZWFkICV4XG4iLCBkYXRhKTsKKwkJZ290byBlaTJjOworCX0KKworCWRldl9pbmZvKCZpY2QtPmRldiwgIkRldGVjdGVkIGEgTVQ5VDAzMSBjaGlwIElEICV4XG4iLCBkYXRhKTsKKworCS8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIG1vZGVsLCB3ZSBjYW4gc3RhcnQgdmlkZW8gKi8KKwlyZXQgPSBzb2NfY2FtZXJhX3ZpZGVvX3N0YXJ0KGljZCk7CisJaWYgKHJldCkKKwkJZ290byBldnN0YXJ0OworCisJcmV0dXJuIDA7CisKK2V2c3RhcnQ6CitlaTJjOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG10OXQwMzFfdmlkZW9fcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXQwMzEsIGljZCk7CisKKwlkZXZfZGJnKCZpY2QtPmRldiwgIlZpZGVvICV4IHJlbW92ZWQ6ICVwLCAlcFxuIiwgbXQ5dDAzMS0+Y2xpZW50LT5hZGRyLAorCQlpY2QtPmRldi5wYXJlbnQsIGljZC0+dmRldik7CisJc29jX2NhbWVyYV92aWRlb19zdG9wKGljZCk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAzMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzE7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIWljbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOVQwMzEgZHJpdmVyIG5lZWRzIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwKKwkJCSAiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IEkyQ19GVU5DX1NNQlVTX1dPUkRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltdDl0MDMxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10OXQwMzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10OXQwMzEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXQ5dDAzMS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG10OXQwMzEpOworCisJLyogU2Vjb25kIHN0YWdlIHByb2JlIC0gd2hlbiBhIGNhcHR1cmUgYWRhcHRlciBpcyB0aGVyZSAqLworCWljZCA9ICZtdDl0MDMxLT5pY2Q7CisJaWNkLT5vcHMJPSAmbXQ5dDAzMV9vcHM7CisJaWNkLT5jb250cm9sCT0gJmNsaWVudC0+ZGV2OworCWljZC0+eF9taW4JPSBNVDlUMDMxX0NPTFVNTl9TS0lQOworCWljZC0+eV9taW4JPSBNVDlUMDMxX1JPV19TS0lQOworCWljZC0+eF9jdXJyZW50CT0gaWNkLT54X21pbjsKKwlpY2QtPnlfY3VycmVudAk9IGljZC0+eV9taW47CisJaWNkLT53aWR0aF9taW4JPSBNVDlUMDMxX01JTl9XSURUSDsKKwlpY2QtPndpZHRoX21heAk9IE1UOVQwMzFfTUFYX1dJRFRIOworCWljZC0+aGVpZ2h0X21pbgk9IE1UOVQwMzFfTUlOX0hFSUdIVDsKKwlpY2QtPmhlaWdodF9tYXgJPSBNVDlUMDMxX01BWF9IRUlHSFQ7CisJaWNkLT55X3NraXBfdG9wCT0gMDsKKwlpY2QtPmlmYWNlCT0gaWNsLT5idXNfaWQ7CisJLyogU2ltdWxhdGVkIGF1dG9leHBvc3VyZS4gSWYgZW5hYmxlZCwgd2UgY2FsY3VsYXRlIHNodXR0ZXIgd2lkdGgKKwkgKiBvdXJzZWx2ZXMgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiB2ZXJ0aWNhbCBibGFua2luZyBhbmQgZnJhbWUgd2lkdGggKi8KKwltdDl0MDMxLT5hdXRvZXhwb3N1cmUgPSAxOworCisJbXQ5dDAzMS0+eHNraXAgPSAxOworCW10OXQwMzEtPnlza2lwID0gMTsKKworCXJldCA9IHNvY19jYW1lcmFfZGV2aWNlX3JlZ2lzdGVyKGljZCk7CisJaWYgKHJldCkKKwkJZ290byBlaXNkcjsKKworCXJldHVybiAwOworCitlaXNkcjoKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlrZnJlZShtdDl0MDMxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OXQwMzFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXNvY19jYW1lcmFfZGV2aWNlX3VucmVnaXN0ZXIoJm10OXQwMzEtPmljZCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUobXQ5dDAzMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG10OXQwMzFfaWRbXSA9IHsKKwl7ICJtdDl0MDMxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtdDl0MDMxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OXQwMzFfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdDl0MDMxIiwKKwl9LAorCS5wcm9iZQkJPSBtdDl0MDMxX3Byb2JlLAorCS5yZW1vdmUJCT0gbXQ5dDAzMV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbXQ5dDAzMV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG10OXQwMzFfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm10OXQwMzFfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdDl0MDMxX21vZF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm10OXQwMzFfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG10OXQwMzFfbW9kX2luaXQpOworbW9kdWxlX2V4aXQobXQ5dDAzMV9tb2RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9uIE1UOVQwMzEgQ2FtZXJhIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxsZ0BkZW54LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYwppbmRleCAyNTg0MjAxLi4xNGE1ZjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYwpAQCAtMjczLDYgKzI3Myw3IEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5djAyMiwgaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBtdDl2MDIyLT5jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXVuc2lnbmVkIGludCB3aWR0aF9mbGFnID0gZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKIAlpbnQgcmV0OwogCXUxNiBwaXhjbGsgPSAwOwpAQCAtMjk2LDYgKzI5Nyw4IEBACiAJCW10OXYwMjItPmRhdGF3aWR0aCA9IHdpZHRoX2ZsYWcgPT0gU09DQU1fREFUQVdJRFRIXzggPyA4IDogMTA7CiAJfQogCisJZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKKwogCWlmIChmbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykKIAkJcGl4Y2xrIHw9IDB4MTA7CiAKQEAgLTMzNywxNCArMzQwLDE0IEBACiAJCXdpZHRoX2ZsYWc7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5djAyMl9zZXRfZm10X2NhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJX191MzIgcGl4Zm10LCBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQorc3RhdGljIGludCBtdDl2MDIyX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICBfX3UzMiBwaXhmbXQsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5djAyMiwgaWNkKTsKIAlpbnQgcmV0OwogCiAJLyogVGhlIGNhbGxlciBwcm92aWRlcyBhIHN1cHBvcnRlZCBmb3JtYXQsIGFzIHZlcmlmaWVkIHBlciBjYWxsIHRvCi0JICogaWNkLT50cnlfZm10X2NhcCgpLCBkYXRhd2lkdGggaXMgZnJvbSBvdXIgc3VwcG9ydGVkIGZvcm1hdCBsaXN0ICovCisJICogaWNkLT50cnlfZm10KCksIGRhdGF3aWR0aCBpcyBmcm9tIG91ciBzdXBwb3J0ZWQgZm9ybWF0IGxpc3QgKi8KIAlzd2l0Y2ggKHBpeGZtdCkgewogCWNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6CiAJY2FzZSBWNEwyX1BJWF9GTVRfWTE2OgpAQCAtNDAwLDE4ICs0MDMsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDl2MDIyX3RyeV9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgbXQ5djAyMl90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDMyICsgaWNkLT55X3NraXBfdG9wKQotCQlmLT5mbXQucGl4LmhlaWdodCA9IDMyICsgaWNkLT55X3NraXBfdG9wOwotCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IDQ4MCArIGljZC0+eV9za2lwX3RvcCkKLQkJZi0+Zm10LnBpeC5oZWlnaHQgPSA0ODAgKyBpY2QtPnlfc2tpcF90b3A7Ci0JaWYgKGYtPmZtdC5waXgud2lkdGggPCA0OCkKLQkJZi0+Zm10LnBpeC53aWR0aCA9IDQ4OwotCWlmIChmLT5mbXQucGl4LndpZHRoID4gNzUyKQotCQlmLT5mbXQucGl4LndpZHRoID0gNzUyOwotCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDM7IC8qID8gKi8KKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKworCWlmIChwaXgtPmhlaWdodCA8IDMyICsgaWNkLT55X3NraXBfdG9wKQorCQlwaXgtPmhlaWdodCA9IDMyICsgaWNkLT55X3NraXBfdG9wOworCWlmIChwaXgtPmhlaWdodCA+IDQ4MCArIGljZC0+eV9za2lwX3RvcCkKKwkJcGl4LT5oZWlnaHQgPSA0ODAgKyBpY2QtPnlfc2tpcF90b3A7CisJaWYgKHBpeC0+d2lkdGggPCA0OCkKKwkJcGl4LT53aWR0aCA9IDQ4OworCWlmIChwaXgtPndpZHRoID4gNzUyKQorCQlwaXgtPndpZHRoID0gNzUyOworCXBpeC0+d2lkdGggJj0gfjB4MDM7IC8qID8gKi8KIAogCXJldHVybiAwOwogfQpAQCAtNTM4LDggKzU0Myw4IEBACiAJLnJlbGVhc2UJCT0gbXQ5djAyMl9yZWxlYXNlLAogCS5zdGFydF9jYXB0dXJlCQk9IG10OXYwMjJfc3RhcnRfY2FwdHVyZSwKIAkuc3RvcF9jYXB0dXJlCQk9IG10OXYwMjJfc3RvcF9jYXB0dXJlLAotCS5zZXRfZm10X2NhcAkJPSBtdDl2MDIyX3NldF9mbXRfY2FwLAotCS50cnlfZm10X2NhcAkJPSBtdDl2MDIyX3RyeV9mbXRfY2FwLAorCS5zZXRfZm10CQk9IG10OXYwMjJfc2V0X2ZtdCwKKwkudHJ5X2ZtdAkJPSBtdDl2MDIyX3RyeV9mbXQsCiAJLnNldF9idXNfcGFyYW0JCT0gbXQ5djAyMl9zZXRfYnVzX3BhcmFtLAogCS5xdWVyeV9idXNfcGFyYW0JPSBtdDl2MDIyX3F1ZXJ5X2J1c19wYXJhbSwKIAkuY29udHJvbHMJCT0gbXQ5djAyMl9jb250cm9scywKQEAgLTY5MCw2ICs2OTUsNyBAQAogc3RhdGljIGludCBtdDl2MDIyX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewogCXN0cnVjdCBtdDl2MDIyICptdDl2MDIyID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXYwMjIsIGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gbXQ5djAyMi0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzMzIgZGF0YTsKIAlpbnQgcmV0OwogCkBAIC03MjUsNyArNzMxLDcgQEAKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9QSVhFTF9PUEVSQVRJT05fTU9ERSwgNCB8IDB4MTEpOwogCQltdDl2MDIyLT5tb2RlbCA9IFY0TDJfSURFTlRfTVQ5VjAyMklYN0FUQzsKIAkJaWNkLT5mb3JtYXRzID0gbXQ5djAyMl9jb2xvdXJfZm9ybWF0czsKLQkJaWYgKG10OXYwMjItPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWlmIChncGlvX2lzX3ZhbGlkKGljbC0+Z3BpbykpCiAJCQlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShtdDl2MDIyX2NvbG91cl9mb3JtYXRzKTsKIAkJZWxzZQogCQkJaWNkLT5udW1fZm9ybWF0cyA9IDE7CkBAIC03MzMsNyArNzM5LDcgQEAKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9QSVhFTF9PUEVSQVRJT05fTU9ERSwgMHgxMSk7CiAJCW10OXYwMjItPm1vZGVsID0gVjRMMl9JREVOVF9NVDlWMDIySVg3QVRNOwogCQlpY2QtPmZvcm1hdHMgPSBtdDl2MDIyX21vbm9jaHJvbWVfZm9ybWF0czsKLQkJaWYgKG10OXYwMjItPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWlmIChncGlvX2lzX3ZhbGlkKGljbC0+Z3BpbykpCiAJCQlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShtdDl2MDIyX21vbm9jaHJvbWVfZm9ybWF0cyk7CiAJCWVsc2UKIAkJCWljZC0+bnVtX2Zvcm1hdHMgPSAxOwpAQCAtNzYwLDggKzc2Niw4IEBACiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5djAyMiwgaWNkKTsKIAogCWRldl9kYmcoJmljZC0+ZGV2LCAiVmlkZW8gJXggcmVtb3ZlZDogJXAsICVwXG4iLCBtdDl2MDIyLT5jbGllbnQtPmFkZHIsCi0JCW10OXYwMjItPmljZC5kZXYucGFyZW50LCBtdDl2MDIyLT5pY2QudmRldik7Ci0Jc29jX2NhbWVyYV92aWRlb19zdG9wKCZtdDl2MDIyLT5pY2QpOworCQlpY2QtPmRldi5wYXJlbnQsIGljZC0+dmRldik7CisJc29jX2NhbWVyYV92aWRlb19zdG9wKGljZCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5djAyMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS1kbWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0tZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0tZG1hLmMKQEAgLTAsMCArMSw2MDEgQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLWRtYS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBDb250YWN0OiBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bub2tpYS5jb20+CisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIEFuZHkgTG93ZSA8c291cmNlQG12aXN0YS5jb20+IGFuZAorICogICAgICAgICAgICAgICAgICAgIERhdmlkIENvaGVuIDxkYXZpZC5jb2hlbkBpbmR0Lm9yZy5icj4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlICJvbWFwMjR4eGNhbS5oIgorCisvKgorICoKKyAqIERNQSBoYXJkd2FyZS4KKyAqCisgKi8KKworLyogQWNrIGFsbCBpbnRlcnJ1cHQgb24gQ1NSIGFuZCBJUlFTVEFUVVNfTDAgKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2RtYWh3X2Fja19hbGwodW5zaWduZWQgbG9uZyBiYXNlKQoreworCXUzMiBjc3I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NBTURNQV9DSEFOTkVMUzsgKytpKSB7CisJCWNzciA9IG9tYXAyNHh4Y2FtX3JlZ19pbihiYXNlLCBDQU1ETUFfQ1NSKGkpKTsKKwkJLyogYWNrIGludGVycnVwdCBpbiBDU1IgKi8KKwkJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ1NSKGkpLCBjc3IpOworCX0KKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9JUlFTVEFUVVNfTDAsIDB4Zik7Cit9CisKKy8qIEFjayBkbWFjaCBvbiBDU1IgYW5kIElSUVNUQVRVU19MMCAqLworc3RhdGljIHUzMiBvbWFwMjR4eGNhbV9kbWFod19hY2tfY2godW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgZG1hY2gpCit7CisJdTMyIGNzcjsKKworCWNzciA9IG9tYXAyNHh4Y2FtX3JlZ19pbihiYXNlLCBDQU1ETUFfQ1NSKGRtYWNoKSk7CisJLyogYWNrIGludGVycnVwdCBpbiBDU1IgKi8KKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DU1IoZG1hY2gpLCBjc3IpOworCS8qIGFjayBpbnRlcnJ1cHQgaW4gSVJRU1RBVFVTICovCisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfSVJRU1RBVFVTX0wwLCAoMSA8PCBkbWFjaCkpOworCisJcmV0dXJuIGNzcjsKK30KKworc3RhdGljIGludCBvbWFwMjR4eGNhbV9kbWFod19ydW5uaW5nKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGRtYWNoKQoreworCXJldHVybiBvbWFwMjR4eGNhbV9yZWdfaW4oYmFzZSwgQ0FNRE1BX0NDUihkbWFjaCkpICYgQ0FNRE1BX0NDUl9FTkFCTEU7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2RtYWh3X3RyYW5zZmVyX3NldHVwKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGRtYWNoLAorCQkJCQkgICAgIGRtYV9hZGRyX3Qgc3RhcnQsIHUzMiBsZW4pCit7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ0NSKGRtYWNoKSwKKwkJCSAgICBDQU1ETUFfQ0NSX1NFTF9TUkNfRFNUX1NZTkMKKwkJCSAgICB8IENBTURNQV9DQ1JfQlMKKwkJCSAgICB8IENBTURNQV9DQ1JfRFNUX0FNT0RFX1BPU1RfSU5DCisJCQkgICAgfCBDQU1ETUFfQ0NSX1NSQ19BTU9ERV9QT1NUX0lOQworCQkJICAgIHwgQ0FNRE1BX0NDUl9GUworCQkJICAgIHwgQ0FNRE1BX0NDUl9XUl9BQ1RJVkUKKwkJCSAgICB8IENBTURNQV9DQ1JfUkRfQUNUSVZFCisJCQkgICAgfCBDQU1ETUFfQ0NSX1NZTkNIUk9fQ0FNRVJBKTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DTE5LX0NUUkwoZG1hY2gpLCAwKTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DRU4oZG1hY2gpLCBsZW4pOworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoYmFzZSwgQ0FNRE1BX0NGTihkbWFjaCksIDEpOworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoYmFzZSwgQ0FNRE1BX0NTRFAoZG1hY2gpLAorCQkJICAgIENBTURNQV9DU0RQX1dSSVRFX01PREVfUE9TVEVECisJCQkgICAgfCBDQU1ETUFfQ1NEUF9EU1RfQlVSU1RfRU5fMzIKKwkJCSAgICB8IENBTURNQV9DU0RQX0RTVF9QQUNLRUQKKwkJCSAgICB8IENBTURNQV9DU0RQX1NSQ19CVVJTVF9FTl8zMgorCQkJICAgIHwgQ0FNRE1BX0NTRFBfU1JDX1BBQ0tFRAorCQkJICAgIHwgQ0FNRE1BX0NTRFBfREFUQV9UWVBFXzhCSVRTKTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DU1NBKGRtYWNoKSwgMCk7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ0RTQShkbWFjaCksIHN0YXJ0KTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DU0VJKGRtYWNoKSwgMCk7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ1NGSShkbWFjaCksIERNQV9USFJFU0hPTEQpOworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoYmFzZSwgQ0FNRE1BX0NERUkoZG1hY2gpLCAwKTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DREZJKGRtYWNoKSwgMCk7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ1NSKGRtYWNoKSwKKwkJCSAgICBDQU1ETUFfQ1NSX01JU0FMSUdORURfRVJSCisJCQkgICAgfCBDQU1ETUFfQ1NSX1NFQ1VSRV9FUlIKKwkJCSAgICB8IENBTURNQV9DU1JfVFJBTlNfRVJSCisJCQkgICAgfCBDQU1ETUFfQ1NSX0JMT0NLCisJCQkgICAgfCBDQU1ETUFfQ1NSX0RST1ApOworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoYmFzZSwgQ0FNRE1BX0NJQ1IoZG1hY2gpLAorCQkJICAgIENBTURNQV9DSUNSX01JU0FMSUdORURfRVJSX0lFCisJCQkgICAgfCBDQU1ETUFfQ0lDUl9TRUNVUkVfRVJSX0lFCisJCQkgICAgfCBDQU1ETUFfQ0lDUl9UUkFOU19FUlJfSUUKKwkJCSAgICB8IENBTURNQV9DSUNSX0JMT0NLX0lFCisJCQkgICAgfCBDQU1ETUFfQ0lDUl9EUk9QX0lFKTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fZG1haHdfdHJhbnNmZXJfc3RhcnQodW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgZG1hY2gpCit7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfQ0NSKGRtYWNoKSwKKwkJCSAgICBDQU1ETUFfQ0NSX1NFTF9TUkNfRFNUX1NZTkMKKwkJCSAgICB8IENBTURNQV9DQ1JfQlMKKwkJCSAgICB8IENBTURNQV9DQ1JfRFNUX0FNT0RFX1BPU1RfSU5DCisJCQkgICAgfCBDQU1ETUFfQ0NSX1NSQ19BTU9ERV9QT1NUX0lOQworCQkJICAgIHwgQ0FNRE1BX0NDUl9FTkFCTEUKKwkJCSAgICB8IENBTURNQV9DQ1JfRlMKKwkJCSAgICB8IENBTURNQV9DQ1JfU1lOQ0hST19DQU1FUkEpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9kbWFod190cmFuc2Zlcl9jaGFpbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBkbWFjaCwKKwkJCQkJICAgICBpbnQgZnJlZV9kbWFjaCkKK3sKKwlpbnQgcHJldl9kbWFjaCwgY2g7CisKKwlpZiAoZG1hY2ggPT0gMCkKKwkJcHJldl9kbWFjaCA9IE5VTV9DQU1ETUFfQ0hBTk5FTFMgLSAxOworCWVsc2UKKwkJcHJldl9kbWFjaCA9IGRtYWNoIC0gMTsKKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DTE5LX0NUUkwocHJldl9kbWFjaCksCisJCQkgICAgQ0FNRE1BX0NMTktfQ1RSTF9FTkFCTEVfTE5LIHwgZG1hY2gpOworCS8qIERpZCB3ZSBjaGFpbiB0aGUgRE1BIHRyYW5zZmVyIGJlZm9yZSB0aGUgcHJldmlvdXMgb25lCisJICogZmluaXNoZWQ/CisJICovCisJY2ggPSAoZG1hY2ggKyBmcmVlX2RtYWNoKSAlIE5VTV9DQU1ETUFfQ0hBTk5FTFM7CisJd2hpbGUgKCEob21hcDI0eHhjYW1fcmVnX2luKGJhc2UsIENBTURNQV9DQ1IoY2gpKQorCQkgJiBDQU1ETUFfQ0NSX0VOQUJMRSkpIHsKKwkJaWYgKGNoID09IGRtYWNoKSB7CisJCQkvKiBUaGUgcHJldmlvdXMgdHJhbnNmZXIgaGFzIGVuZGVkIGFuZCB0aGlzIG9uZQorCQkJICogaGFzbid0IHN0YXJ0ZWQsIHNvIHdlIG11c3Qgbm90IGhhdmUgY2hhaW5lZAorCQkJICogdG8gdGhlIHByZXZpb3VzIG9uZSBpbiB0aW1lLiAgV2UnbGwgaGF2ZSB0bworCQkJICogc3RhcnQgaXQgbm93LgorCQkJICovCisJCQlvbWFwMjR4eGNhbV9kbWFod190cmFuc2Zlcl9zdGFydChiYXNlLCBkbWFjaCk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQljaCA9IChjaCArIDEpICUgTlVNX0NBTURNQV9DSEFOTkVMUzsKKwl9Cit9CisKKy8qIEFib3J0IGFsbCBjaGFpbmVkIERNQSB0cmFuc2ZlcnMuIEFmdGVyIGFsbCB0cmFuc2ZlcnMgaGF2ZSBiZWVuCisgKiBhYm9ydGVkIGFuZCB0aGUgRE1BIGNvbnRyb2xsZXIgaXMgaWRsZSwgdGhlIGNvbXBsZXRpb24gcm91dGluZXMgZm9yCisgKiBhbnkgYWJvcnRlZCB0cmFuc2ZlcnMgd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UuIFRoZSBETUEKKyAqIGNvbnRyb2xsZXIgbWF5IG5vdCBiZSBpZGxlIGFmdGVyIHRoaXMgcm91dGluZSBjb21wbGV0ZXMsIGJlY2F1c2UKKyAqIHRoZSBjb21wbGV0aW9uIHJvdXRpbmVzIG1pZ2h0IHN0YXJ0IG5ldyB0cmFuc2ZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2RtYWh3X2Fib3J0X2NoKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGRtYWNoKQoreworCS8qIG1hc2sgYWxsIGludGVycnVwdHMgZnJvbSB0aGlzIGNoYW5uZWwgKi8KKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGJhc2UsIENBTURNQV9DSUNSKGRtYWNoKSwgMCk7CisJLyogdW5saW5rIHRoaXMgY2hhbm5lbCAqLworCW9tYXAyNHh4Y2FtX3JlZ19tZXJnZShiYXNlLCBDQU1ETUFfQ0xOS19DVFJMKGRtYWNoKSwgMCwKKwkJCSAgICAgIENBTURNQV9DTE5LX0NUUkxfRU5BQkxFX0xOSyk7CisJLyogZGlzYWJsZSB0aGlzIGNoYW5uZWwgKi8KKwlvbWFwMjR4eGNhbV9yZWdfbWVyZ2UoYmFzZSwgQ0FNRE1BX0NDUihkbWFjaCksIDAsIENBTURNQV9DQ1JfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fZG1haHdfaW5pdCh1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfT0NQX1NZU0NPTkZJRywKKwkJCSAgICBDQU1ETUFfT0NQX1NZU0NPTkZJR19NSURMRU1PREVfRlNUQU5EQlkKKwkJCSAgICB8IENBTURNQV9PQ1BfU1lTQ09ORklHX1NJRExFTU9ERV9GSURMRQorCQkJICAgIHwgQ0FNRE1BX09DUF9TWVNDT05GSUdfQVVUT0lETEUpOworCisJb21hcDI0eHhjYW1fcmVnX21lcmdlKGJhc2UsIENBTURNQV9HQ1IsIDB4MTAsCisJCQkgICAgICBDQU1ETUFfR0NSX01BWF9DSEFOTkVMX0ZJRk9fREVQVEgpOworCisJb21hcDI0eHhjYW1fcmVnX291dChiYXNlLCBDQU1ETUFfSVJRRU5BQkxFX0wwLCAweGYpOworfQorCisvKgorICoKKyAqIEluZGl2aWR1YWwgRE1BIGNoYW5uZWwgaGFuZGxpbmcuCisgKgorICovCisKKy8qIFN0YXJ0IGEgRE1BIHRyYW5zZmVyIGZyb20gdGhlIGNhbWVyYSB0byBtZW1vcnkuCisgKiBSZXR1cm5zIHplcm8gaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgc3RhcnRlZCwgb3Igbm9uLXplcm8gaWYgYWxsCisgKiBETUEgY2hhbm5lbHMgYXJlIGFscmVhZHkgaW4gdXNlIG9yIHN0YXJ0aW5nIGlzIGN1cnJlbnRseSBpbmhpYml0ZWQuCisgKi8KK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fZG1hX3N0YXJ0KHN0cnVjdCBvbWFwMjR4eGNhbV9kbWEgKmRtYSwgZG1hX2FkZHJfdCBzdGFydCwKKwkJCQkgdTMyIGxlbiwgZG1hX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkbWFjaDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWEtPmxvY2ssIGZsYWdzKTsKKworCWlmICghZG1hLT5mcmVlX2RtYWNoIHx8IGF0b21pY19yZWFkKCZkbWEtPmRtYV9zdG9wKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWEtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkbWFjaCA9IGRtYS0+bmV4dF9kbWFjaDsKKworCWRtYS0+Y2hfc3RhdGVbZG1hY2hdLmNhbGxiYWNrID0gY2FsbGJhY2s7CisJZG1hLT5jaF9zdGF0ZVtkbWFjaF0uYXJnID0gYXJnOworCisJb21hcDI0eHhjYW1fZG1haHdfdHJhbnNmZXJfc2V0dXAoZG1hLT5iYXNlLCBkbWFjaCwgc3RhcnQsIGxlbik7CisKKwkvKiBXZSdyZSByZWFkeSB0byBzdGFydCB0aGUgRE1BIHRyYW5zZmVyLiAqLworCisJaWYgKGRtYS0+ZnJlZV9kbWFjaCA8IE5VTV9DQU1ETUFfQ0hBTk5FTFMpIHsKKwkJLyogQSB0cmFuc2ZlciBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBzbyB0cnkgdG8gY2hhaW4gdG8gaXQuICovCisJCW9tYXAyNHh4Y2FtX2RtYWh3X3RyYW5zZmVyX2NoYWluKGRtYS0+YmFzZSwgZG1hY2gsCisJCQkJCQkgZG1hLT5mcmVlX2RtYWNoKTsKKwl9IGVsc2UgeworCQkvKiBObyB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcywgc28gd2UnbGwganVzdCBzdGFydCB0aGlzIG9uZQorCQkgKiBub3cuCisJCSAqLworCQlvbWFwMjR4eGNhbV9kbWFod190cmFuc2Zlcl9zdGFydChkbWEtPmJhc2UsIGRtYWNoKTsKKwl9CisKKwlkbWEtPm5leHRfZG1hY2ggPSAoZG1hLT5uZXh0X2RtYWNoICsgMSkgJSBOVU1fQ0FNRE1BX0NIQU5ORUxTOworCWRtYS0+ZnJlZV9kbWFjaC0tOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWJvcnQgYWxsIGNoYWluZWQgRE1BIHRyYW5zZmVycy4gQWZ0ZXIgYWxsIHRyYW5zZmVycyBoYXZlIGJlZW4KKyAqIGFib3J0ZWQgYW5kIHRoZSBETUEgY29udHJvbGxlciBpcyBpZGxlLCB0aGUgY29tcGxldGlvbiByb3V0aW5lcyBmb3IKKyAqIGFueSBhYm9ydGVkIHRyYW5zZmVycyB3aWxsIGJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gVGhlIERNQQorICogY29udHJvbGxlciBtYXkgbm90IGJlIGlkbGUgYWZ0ZXIgdGhpcyByb3V0aW5lIGNvbXBsZXRlcywgYmVjYXVzZQorICogdGhlIGNvbXBsZXRpb24gcm91dGluZXMgbWlnaHQgc3RhcnQgbmV3IHRyYW5zZmVycy4KKyAqLworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fZG1hX2Fib3J0KHN0cnVjdCBvbWFwMjR4eGNhbV9kbWEgKmRtYSwgdTMyIGNzcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkbWFjaCwgaSwgZnJlZV9kbWFjaDsKKwlkbWFfY2FsbGJhY2tfdCBjYWxsYmFjazsKKwl2b2lkICphcmc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hLT5sb2NrLCBmbGFncyk7CisKKwkvKiBzdG9wIGFueSBETUEgdHJhbnNmZXJzIGluIHByb2dyZXNzICovCisJZG1hY2ggPSAoZG1hLT5uZXh0X2RtYWNoICsgZG1hLT5mcmVlX2RtYWNoKSAlIE5VTV9DQU1ETUFfQ0hBTk5FTFM7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DQU1ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlvbWFwMjR4eGNhbV9kbWFod19hYm9ydF9jaChkbWEtPmJhc2UsIGRtYWNoKTsKKwkJZG1hY2ggPSAoZG1hY2ggKyAxKSAlIE5VTV9DQU1ETUFfQ0hBTk5FTFM7CisJfQorCisJLyogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGhlcmUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgcm91dGluZQorCSAqIG1pZ2h0IHN0YXJ0IGEgbmV3IERNQSB0cmFuc2ZlciwgYW5kIHdlIG9ubHkgd2FudCB0byBhYm9ydAorCSAqIHRyYW5zZmVycyB0aGF0IHdlcmUgc3RhcnRlZCBiZWZvcmUgdGhpcyByb3V0aW5lIHdhcyBjYWxsZWQuCisJICovCisJZnJlZV9kbWFjaCA9IGRtYS0+ZnJlZV9kbWFjaDsKKwl3aGlsZSAoKGRtYS0+ZnJlZV9kbWFjaCA8IE5VTV9DQU1ETUFfQ0hBTk5FTFMpICYmCisJICAgICAgIChmcmVlX2RtYWNoIDwgTlVNX0NBTURNQV9DSEFOTkVMUykpIHsKKwkJZG1hY2ggPSAoZG1hLT5uZXh0X2RtYWNoICsgZG1hLT5mcmVlX2RtYWNoKQorCQkJJSBOVU1fQ0FNRE1BX0NIQU5ORUxTOworCQljYWxsYmFjayA9IGRtYS0+Y2hfc3RhdGVbZG1hY2hdLmNhbGxiYWNrOworCQlhcmcgPSBkbWEtPmNoX3N0YXRlW2RtYWNoXS5hcmc7CisJCWRtYS0+ZnJlZV9kbWFjaCsrOworCQlmcmVlX2RtYWNoKys7CisJCWlmIChjYWxsYmFjaykgeworCQkJLyogbGVhdmUgaW50ZXJydXB0cyBkaXNhYmxlZCBkdXJpbmcgY2FsbGJhY2sgKi8KKwkJCXNwaW5fdW5sb2NrKCZkbWEtPmxvY2spOworCQkJKCpjYWxsYmFjaykgKGRtYSwgY3NyLCBhcmcpOworCQkJc3Bpbl9sb2NrKCZkbWEtPmxvY2spOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEFib3J0IGFsbCBjaGFpbmVkIERNQSB0cmFuc2ZlcnMuIEFmdGVyIGFsbCB0cmFuc2ZlcnMgaGF2ZSBiZWVuCisgKiBhYm9ydGVkIGFuZCB0aGUgRE1BIGNvbnRyb2xsZXIgaXMgaWRsZSwgdGhlIGNvbXBsZXRpb24gcm91dGluZXMgZm9yCisgKiBhbnkgYWJvcnRlZCB0cmFuc2ZlcnMgd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UuIElmIHRoZSBjb21wbGV0aW9uCisgKiByb3V0aW5lcyBhdHRlbXB0IHRvIHN0YXJ0IGEgbmV3IERNQSB0cmFuc2ZlciBpdCB3aWxsIGZhaWwsIHNvIHRoZQorICogRE1BIGNvbnRyb2xsZXIgd2lsbCBiZSBpZGxlIGFmdGVyIHRoaXMgcm91dGluZSBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2RtYV9zdG9wKHN0cnVjdCBvbWFwMjR4eGNhbV9kbWEgKmRtYSwgdTMyIGNzcikKK3sKKwlhdG9taWNfaW5jKCZkbWEtPmRtYV9zdG9wKTsKKwlvbWFwMjR4eGNhbV9kbWFfYWJvcnQoZG1hLCBjc3IpOworCWF0b21pY19kZWMoJmRtYS0+ZG1hX3N0b3ApOworfQorCisvKiBDYW1lcmEgRE1BIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICovCit2b2lkIG9tYXAyNHh4Y2FtX2RtYV9pc3Ioc3RydWN0IG9tYXAyNHh4Y2FtX2RtYSAqZG1hKQoreworCWludCBkbWFjaDsKKwlkbWFfY2FsbGJhY2tfdCBjYWxsYmFjazsKKwl2b2lkICphcmc7CisJdTMyIGNzcjsKKwljb25zdCB1MzIgY3NyX2Vycm9yID0gQ0FNRE1BX0NTUl9NSVNBTElHTkVEX0VSUgorCQl8IENBTURNQV9DU1JfU1VQRVJWSVNPUl9FUlIgfCBDQU1ETUFfQ1NSX1NFQ1VSRV9FUlIKKwkJfCBDQU1ETUFfQ1NSX1RSQU5TX0VSUiB8IENBTURNQV9DU1JfRFJPUDsKKworCXNwaW5fbG9jaygmZG1hLT5sb2NrKTsKKworCWlmIChkbWEtPmZyZWVfZG1hY2ggPT0gTlVNX0NBTURNQV9DSEFOTkVMUykgeworCQkvKiBBIGNhbWVyYSBETUEgaW50ZXJydXB0IG9jY3VycmVkIHdoaWxlIGFsbCBjaGFubmVscworCQkgKiBhcmUgaWRsZSwgc28gd2UnbGwgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBpbiB0aGUKKwkJICogSVJRU1RBVFVTIHJlZ2lzdGVyIGFuZCBleGl0LgorCQkgKi8KKwkJb21hcDI0eHhjYW1fZG1haHdfYWNrX2FsbChkbWEtPmJhc2UpOworCQlzcGluX3VubG9jaygmZG1hLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChkbWEtPmZyZWVfZG1hY2ggPCBOVU1fQ0FNRE1BX0NIQU5ORUxTKSB7CisJCWRtYWNoID0gKGRtYS0+bmV4dF9kbWFjaCArIGRtYS0+ZnJlZV9kbWFjaCkKKwkJCSUgTlVNX0NBTURNQV9DSEFOTkVMUzsKKwkJaWYgKG9tYXAyNHh4Y2FtX2RtYWh3X3J1bm5pbmcoZG1hLT5iYXNlLCBkbWFjaCkpIHsKKwkJCS8qIFRoaXMgYnVmZmVyIGhhc24ndCBmaW5pc2hlZCB5ZXQsIHNvIHdlJ3JlIGRvbmUuICovCisJCQlicmVhazsKKwkJfQorCQljc3IgPSBvbWFwMjR4eGNhbV9kbWFod19hY2tfY2goZG1hLT5iYXNlLCBkbWFjaCk7CisJCWlmIChjc3IgJiBjc3JfZXJyb3IpIHsKKwkJCS8qIEEgRE1BIGVycm9yIG9jY3VycmVkLCBzbyBzdG9wIGFsbCBETUEKKwkJCSAqIHRyYW5zZmVycyBpbiBwcm9ncmVzcy4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2soJmRtYS0+bG9jayk7CisJCQlvbWFwMjR4eGNhbV9kbWFfc3RvcChkbWEsIGNzcik7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQljYWxsYmFjayA9IGRtYS0+Y2hfc3RhdGVbZG1hY2hdLmNhbGxiYWNrOworCQkJYXJnID0gZG1hLT5jaF9zdGF0ZVtkbWFjaF0uYXJnOworCQkJZG1hLT5mcmVlX2RtYWNoKys7CisJCQlpZiAoY2FsbGJhY2spIHsKKwkJCQlzcGluX3VubG9jaygmZG1hLT5sb2NrKTsKKwkJCQkoKmNhbGxiYWNrKSAoZG1hLCBjc3IsIGFyZyk7CisJCQkJc3Bpbl9sb2NrKCZkbWEtPmxvY2spOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmRtYS0+bG9jayk7CisKKwlvbWFwMjR4eGNhbV9zZ2RtYV9wcm9jZXNzKAorCQljb250YWluZXJfb2YoZG1hLCBzdHJ1Y3Qgb21hcDI0eHhjYW1fc2dkbWEsIGRtYSkpOworfQorCit2b2lkIG9tYXAyNHh4Y2FtX2RtYV9od2luaXQoc3RydWN0IG9tYXAyNHh4Y2FtX2RtYSAqZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hLT5sb2NrLCBmbGFncyk7CisKKwlvbWFwMjR4eGNhbV9kbWFod19pbml0KGRtYS0+YmFzZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWEtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fZG1hX2luaXQoc3RydWN0IG9tYXAyNHh4Y2FtX2RtYSAqZG1hLAorCQkJCSB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJaW50IGNoOworCisJLyogZ3JvdXAgYWxsIGNoYW5uZWxzIG9uIERNQSBJUlEwIGFuZCB1bm1hc2sgaXJxICovCisJc3Bpbl9sb2NrX2luaXQoJmRtYS0+bG9jayk7CisJZG1hLT5iYXNlID0gYmFzZTsKKwlkbWEtPmZyZWVfZG1hY2ggPSBOVU1fQ0FNRE1BX0NIQU5ORUxTOworCWRtYS0+bmV4dF9kbWFjaCA9IDA7CisJZm9yIChjaCA9IDA7IGNoIDwgTlVNX0NBTURNQV9DSEFOTkVMUzsgY2grKykgeworCQlkbWEtPmNoX3N0YXRlW2NoXS5jYWxsYmFjayA9IE5VTEw7CisJCWRtYS0+Y2hfc3RhdGVbY2hdLmFyZyA9IE5VTEw7CisJfQorfQorCisvKgorICoKKyAqIFNjYXR0ZXItZ2F0aGVyIERNQS4KKyAqCisgKiBIaWdoLWxldmVsIERNQSBjb25zdHJ1Y3QgZm9yIHRyYW5zZmVycmluZyB3aG9sZSBwaWN0dXJlIGZyYW1lcyB0bworICogbWVtb3J5IHRoYXQgaXMgZGlzY29udGludW91cy4KKyAqCisgKi8KKworLyogRE1BIGNvbXBsZXRpb24gcm91dGluZSBmb3IgdGhlIHNjYXR0ZXItZ2F0aGVyIERNQSBmcmFnbWVudHMuICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9zZ2RtYV9jYWxsYmFjayhzdHJ1Y3Qgb21hcDI0eHhjYW1fZG1hICpkbWEsIHUzMiBjc3IsCisJCQkJICAgICAgIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fc2dkbWEgKnNnZG1hID0KKwkJY29udGFpbmVyX29mKGRtYSwgc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hLCBkbWEpOworCWludCBzZ3Nsb3QgPSAoaW50KWFyZzsKKwlzdHJ1Y3Qgc2dkbWFfc3RhdGUgKnNnX3N0YXRlOworCWNvbnN0IHUzMiBjc3JfZXJyb3IgPSBDQU1ETUFfQ1NSX01JU0FMSUdORURfRVJSCisJCXwgQ0FNRE1BX0NTUl9TVVBFUlZJU09SX0VSUiB8IENBTURNQV9DU1JfU0VDVVJFX0VSUgorCQl8IENBTURNQV9DU1JfVFJBTlNfRVJSIHwgQ0FNRE1BX0NTUl9EUk9QOworCisJc3Bpbl9sb2NrKCZzZ2RtYS0+bG9jayk7CisKKwkvKiBXZSBnb3QgYW4gaW50ZXJydXB0LCB3ZSBjYW4gcmVtb3ZlIHRoZSB0aW1lciAqLworCWRlbF90aW1lcigmc2dkbWEtPnJlc2V0X3RpbWVyKTsKKworCXNnX3N0YXRlID0gc2dkbWEtPnNnX3N0YXRlICsgc2dzbG90OworCWlmICghc2dfc3RhdGUtPnF1ZXVlZF9zZ2xpc3QpIHsKKwkJc3Bpbl91bmxvY2soJnNnZG1hLT5sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2dkbWEgY29tcGxldGVkIHdoZW4gbm9uZSBxdWV1ZWQhXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJc2dfc3RhdGUtPmNzciB8PSBjc3I7CisJaWYgKCEtLXNnX3N0YXRlLT5xdWV1ZWRfc2dsaXN0KSB7CisJCS8qIFF1ZXVlIGZvciB0aGlzIHNnbGlzdCBpcyBlbXB0eSwgc28gY2hlY2sgdG8gc2VlIGlmIHdlJ3JlCisJCSAqIGRvbmUuCisJCSAqLworCQlpZiAoKHNnX3N0YXRlLT5uZXh0X3NnbGlzdCA9PSBzZ19zdGF0ZS0+c2dsZW4pCisJCSAgICB8fCAoc2dfc3RhdGUtPmNzciAmIGNzcl9lcnJvcikpIHsKKwkJCXNnZG1hX2NhbGxiYWNrX3QgY2FsbGJhY2sgPSBzZ19zdGF0ZS0+Y2FsbGJhY2s7CisJCQl2b2lkICphcmcgPSBzZ19zdGF0ZS0+YXJnOworCQkJdTMyIHNnX2NzciA9IHNnX3N0YXRlLT5jc3I7CisJCQkvKiBBbGwgZG9uZSB3aXRoIHRoaXMgc2dsaXN0ICovCisJCQlzZ2RtYS0+ZnJlZV9zZ2RtYSsrOworCQkJaWYgKGNhbGxiYWNrKSB7CisJCQkJc3Bpbl91bmxvY2soJnNnZG1hLT5sb2NrKTsKKwkJCQkoKmNhbGxiYWNrKSAoc2dkbWEsIHNnX2NzciwgYXJnKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmc2dkbWEtPmxvY2spOworfQorCisvKiBTdGFydCBxdWV1ZWQgc2NhdHRlci1nYXRoZXIgRE1BIHRyYW5zZmVycy4gKi8KK3ZvaWQgb21hcDI0eHhjYW1fc2dkbWFfcHJvY2VzcyhzdHJ1Y3Qgb21hcDI0eHhjYW1fc2dkbWEgKnNnZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHF1ZXVlZF9zZ2RtYSwgc2dzbG90OworCXN0cnVjdCBzZ2RtYV9zdGF0ZSAqc2dfc3RhdGU7CisJY29uc3QgdTMyIGNzcl9lcnJvciA9IENBTURNQV9DU1JfTUlTQUxJR05FRF9FUlIKKwkJfCBDQU1ETUFfQ1NSX1NVUEVSVklTT1JfRVJSIHwgQ0FNRE1BX0NTUl9TRUNVUkVfRVJSCisJCXwgQ0FNRE1BX0NTUl9UUkFOU19FUlIgfCBDQU1ETUFfQ1NSX0RST1A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2dkbWEtPmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlZF9zZ2RtYSA9IE5VTV9TR19ETUEgLSBzZ2RtYS0+ZnJlZV9zZ2RtYTsKKwlzZ3Nsb3QgPSAoc2dkbWEtPm5leHRfc2dkbWEgKyBzZ2RtYS0+ZnJlZV9zZ2RtYSkgJSBOVU1fU0dfRE1BOworCXdoaWxlIChxdWV1ZWRfc2dkbWEgPiAwKSB7CisJCXNnX3N0YXRlID0gc2dkbWEtPnNnX3N0YXRlICsgc2dzbG90OworCQl3aGlsZSAoKHNnX3N0YXRlLT5uZXh0X3NnbGlzdCA8IHNnX3N0YXRlLT5zZ2xlbikgJiYKKwkJICAgICAgICEoc2dfc3RhdGUtPmNzciAmIGNzcl9lcnJvcikpIHsKKwkJCWNvbnN0IHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OworCQkJdW5zaWduZWQgaW50IGxlbjsKKworCQkJc2dsaXN0ID0gc2dfc3RhdGUtPnNnbGlzdCArIHNnX3N0YXRlLT5uZXh0X3NnbGlzdDsKKwkJCS8qIHRyeSB0byBzdGFydCB0aGUgbmV4dCBETUEgdHJhbnNmZXIgKi8KKwkJCWlmIChzZ19zdGF0ZS0+bmV4dF9zZ2xpc3QgKyAxID09IHNnX3N0YXRlLT5zZ2xlbikgeworCQkJCS8qCisJCQkJICogIE9uIHRoZSBsYXN0IHNnLCB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUKKwkJCQkgKiAgY2FtLT5pbWcucGl4LnNpemVpbWFnZSAlIFBBR0VfQUxJR04gIT0gMAorCQkJCSAqLworCQkJCWxlbiA9IHNnX3N0YXRlLT5sZW4gLSBzZ19zdGF0ZS0+Ynl0ZXNfcmVhZDsKKwkJCX0gZWxzZSB7CisJCQkJbGVuID0gc2dfZG1hX2xlbihzZ2xpc3QpOworCQkJfQorCisJCQlpZiAob21hcDI0eHhjYW1fZG1hX3N0YXJ0KCZzZ2RtYS0+ZG1hLAorCQkJCQkJICBzZ19kbWFfYWRkcmVzcyhzZ2xpc3QpLAorCQkJCQkJICBsZW4sCisJCQkJCQkgIG9tYXAyNHh4Y2FtX3NnZG1hX2NhbGxiYWNrLAorCQkJCQkJICAodm9pZCAqKXNnc2xvdCkpIHsKKwkJCQkvKiBETUEgc3RhcnQgZmFpbGVkICovCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2dkbWEtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKwkJCQkvKiBETUEgc3RhcnQgd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJCQlzZ19zdGF0ZS0+bmV4dF9zZ2xpc3QrKzsKKwkJCQlzZ19zdGF0ZS0+Ynl0ZXNfcmVhZCArPSBsZW47CisJCQkJc2dfc3RhdGUtPnF1ZXVlZF9zZ2xpc3QrKzsKKworCQkJCS8qIFdlIHN0YXJ0IHRoZSByZXNldCB0aW1lciAqLworCQkJCWV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCQkJbW9kX3RpbWVyKCZzZ2RtYS0+cmVzZXRfdGltZXIsIGV4cGlyZXMpOworCQkJfQorCQl9CisJCXF1ZXVlZF9zZ2RtYS0tOworCQlzZ3Nsb3QgPSAoc2dzbG90ICsgMSkgJSBOVU1fU0dfRE1BOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNnZG1hLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBRdWV1ZSBhIHNjYXR0ZXItZ2F0aGVyIERNQSB0cmFuc2ZlciBmcm9tIHRoZSBjYW1lcmEgdG8gbWVtb3J5LgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZCwgb3Igbm9uLXplcm8KKyAqIGlmIGFsbCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgc2xvdHMgYXJlIGFscmVhZHkgaW4gdXNlLgorICovCitpbnQgb21hcDI0eHhjYW1fc2dkbWFfcXVldWUoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHNnbGVuLAorCQkJICAgIGludCBsZW4sIHNnZG1hX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZ2RtYV9zdGF0ZSAqc2dfc3RhdGU7CisKKwlpZiAoKHNnbGVuIDwgMCkgfHwgKChzZ2xlbiA+IDApICYgIXNnbGlzdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNnZG1hLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXNnZG1hLT5mcmVlX3NnZG1hKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNnZG1hLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2dfc3RhdGUgPSBzZ2RtYS0+c2dfc3RhdGUgKyBzZ2RtYS0+bmV4dF9zZ2RtYTsKKworCXNnX3N0YXRlLT5zZ2xpc3QgPSBzZ2xpc3Q7CisJc2dfc3RhdGUtPnNnbGVuID0gc2dsZW47CisJc2dfc3RhdGUtPm5leHRfc2dsaXN0ID0gMDsKKwlzZ19zdGF0ZS0+Ynl0ZXNfcmVhZCA9IDA7CisJc2dfc3RhdGUtPmxlbiA9IGxlbjsKKwlzZ19zdGF0ZS0+cXVldWVkX3NnbGlzdCA9IDA7CisJc2dfc3RhdGUtPmNzciA9IDA7CisJc2dfc3RhdGUtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJc2dfc3RhdGUtPmFyZyA9IGFyZzsKKworCXNnZG1hLT5uZXh0X3NnZG1hID0gKHNnZG1hLT5uZXh0X3NnZG1hICsgMSkgJSBOVU1fU0dfRE1BOworCXNnZG1hLT5mcmVlX3NnZG1hLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ2RtYS0+bG9jaywgZmxhZ3MpOworCisJb21hcDI0eHhjYW1fc2dkbWFfcHJvY2VzcyhzZ2RtYSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3luYyBzY2F0dGVyLWdhdGhlciBETUEgYnkgYWJvcnRpbmcgYW55IERNQSB0cmFuc2ZlcnMgY3VycmVudGx5IGluIHByb2dyZXNzLgorICogQW55IHF1ZXVlZCBzY2F0dGVyLWdhdGhlciBETUEgdHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc3RhcnRlZAorICogd2lsbCByZW1haW4gcXVldWVkLiAgVGhlIERNQSBjb250cm9sbGVyIHdpbGwgYmUgaWRsZSBhZnRlciB0aGlzIHJvdXRpbmUKKyAqIGNvbXBsZXRlcy4gIFdoZW4gdGhlIHNjYXR0ZXItZ2F0aGVyIHF1ZXVlIGlzIHJlc3RhcnRlZCwgdGhlIG5leHQKKyAqIHNjYXR0ZXItZ2F0aGVyIERNQSB0cmFuc2ZlciB3aWxsIGJlZ2luIGF0IHRoZSBzdGFydCBvZiBhIG5ldyB0cmFuc2FjdGlvbi4KKyAqLwordm9pZCBvbWFwMjR4eGNhbV9zZ2RtYV9zeW5jKHN0cnVjdCBvbWFwMjR4eGNhbV9zZ2RtYSAqc2dkbWEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc2dzbG90OworCXN0cnVjdCBzZ2RtYV9zdGF0ZSAqc2dfc3RhdGU7CisJdTMyIGNzciA9IENBTURNQV9DU1JfVFJBTlNfRVJSOworCisJLyogc3RvcCBhbnkgRE1BIHRyYW5zZmVycyBpbiBwcm9ncmVzcyAqLworCW9tYXAyNHh4Y2FtX2RtYV9zdG9wKCZzZ2RtYS0+ZG1hLCBjc3IpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNnZG1hLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2dkbWEtPmZyZWVfc2dkbWEgPCBOVU1fU0dfRE1BKSB7CisJCXNnc2xvdCA9IChzZ2RtYS0+bmV4dF9zZ2RtYSArIHNnZG1hLT5mcmVlX3NnZG1hKSAlIE5VTV9TR19ETUE7CisJCXNnX3N0YXRlID0gc2dkbWEtPnNnX3N0YXRlICsgc2dzbG90OworCQlpZiAoc2dfc3RhdGUtPm5leHRfc2dsaXN0ICE9IDApIHsKKwkJCS8qIFRoaXMgRE1BIHRyYW5zZmVyIHdhcyBpbiBwcm9ncmVzcywgc28gYWJvcnQgaXQuICovCisJCQlzZ2RtYV9jYWxsYmFja190IGNhbGxiYWNrID0gc2dfc3RhdGUtPmNhbGxiYWNrOworCQkJdm9pZCAqYXJnID0gc2dfc3RhdGUtPmFyZzsKKwkJCXNnZG1hLT5mcmVlX3NnZG1hKys7CisJCQlpZiAoY2FsbGJhY2spIHsKKwkJCQkvKiBsZWF2ZSBpbnRlcnJ1cHRzIG1hc2tlZCAqLworCQkJCXNwaW5fdW5sb2NrKCZzZ2RtYS0+bG9jayk7CisJCQkJKCpjYWxsYmFjaykgKHNnZG1hLCBjc3IsIGFyZyk7CisJCQkJc3Bpbl9sb2NrKCZzZ2RtYS0+bG9jayk7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ2RtYS0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIG9tYXAyNHh4Y2FtX3NnZG1hX2luaXQoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgdm9pZCAoKnJlc2V0X2NhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgcmVzZXRfY2FsbGJhY2tfZGF0YSkKK3sKKwlpbnQgc2c7CisKKwlzcGluX2xvY2tfaW5pdCgmc2dkbWEtPmxvY2spOworCXNnZG1hLT5mcmVlX3NnZG1hID0gTlVNX1NHX0RNQTsKKwlzZ2RtYS0+bmV4dF9zZ2RtYSA9IDA7CisJZm9yIChzZyA9IDA7IHNnIDwgTlVNX1NHX0RNQTsgc2crKykgeworCQlzZ2RtYS0+c2dfc3RhdGVbc2ddLnNnbGVuID0gMDsKKwkJc2dkbWEtPnNnX3N0YXRlW3NnXS5uZXh0X3NnbGlzdCA9IDA7CisJCXNnZG1hLT5zZ19zdGF0ZVtzZ10uYnl0ZXNfcmVhZCA9IDA7CisJCXNnZG1hLT5zZ19zdGF0ZVtzZ10ucXVldWVkX3NnbGlzdCA9IDA7CisJCXNnZG1hLT5zZ19zdGF0ZVtzZ10uY3NyID0gMDsKKwkJc2dkbWEtPnNnX3N0YXRlW3NnXS5jYWxsYmFjayA9IE5VTEw7CisJCXNnZG1hLT5zZ19zdGF0ZVtzZ10uYXJnID0gTlVMTDsKKwl9CisKKwlvbWFwMjR4eGNhbV9kbWFfaW5pdCgmc2dkbWEtPmRtYSwgYmFzZSk7CisJc2V0dXBfdGltZXIoJnNnZG1hLT5yZXNldF90aW1lciwgcmVzZXRfY2FsbGJhY2ssIHJlc2V0X2NhbGxiYWNrX2RhdGEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzNjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKQEAgLTAsMCArMSwxOTA4IEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCisgKgorICogT01BUCAyIGNhbWVyYSBibG9jayBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIENvbnRhY3Q6IFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG5va2lhLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gQW5keSBMb3dlIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CQkvKiBuZWVkZWQgZm9yIHZpZGVvYnVmcyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisKKyNpbmNsdWRlICJvbWFwMjR4eGNhbS5oIgorCisjZGVmaW5lIE9NQVAyNFhYQ0FNX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMCkKKworI2RlZmluZSBSRVNFVF9USU1FT1VUX05TIDEwMDAwCisKK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX3Jlc2V0KHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSk7CitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX3NlbnNvcl9pZl9lbmFibGUoc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKTsKK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnMpOworc3RhdGljIGludCBvbWFwMjR4eGNhbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CS8qIHZpZGVvIGRldmljZSBtaW5vciAoLTEgPT0+IGF1dG8gYXNzaWduKSAqLworLyoKKyAqIE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgZm9yIGNhcHR1cmUgYnVmZmVycy4KKyAqIERlZmF1bHQgaXMgNDgwMEtCLCBlbm91Z2ggdG8gZG91YmxlLWJ1ZmZlciBTWEdBLgorICovCitzdGF0aWMgaW50IGNhcHR1cmVfbWVtID0gMTI4MCAqIDk2MCAqIDIgKiAyOworCitzdGF0aWMgc3RydWN0IHY0bDJfaW50X2RldmljZSBvbWFwMjR4eGNhbTsKKworLyoKKyAqCisgKiBDbG9ja3MuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2Nsb2NrX3B1dChzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJaWYgKGNhbS0+aWNrICE9IE5VTEwgJiYgIUlTX0VSUihjYW0tPmljaykpCisJCWNsa19wdXQoY2FtLT5pY2spOworCWlmIChjYW0tPmZjayAhPSBOVUxMICYmICFJU19FUlIoY2FtLT5mY2spKQorCQljbGtfcHV0KGNhbS0+ZmNrKTsKKworCWNhbS0+aWNrID0gY2FtLT5mY2sgPSBOVUxMOworfQorCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX2Nsb2NrX2dldChzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJaW50IHJ2YWwgPSAwOworCisJY2FtLT5mY2sgPSBjbGtfZ2V0KGNhbS0+ZGV2LCAiY2FtX2ZjayIpOworCWlmIChJU19FUlIoY2FtLT5mY2spKSB7CisJCWRldl9lcnIoY2FtLT5kZXYsICJjYW4ndCBnZXQgY2FtX2ZjayIpOworCQlydmFsID0gUFRSX0VSUihjYW0tPmZjayk7CisJCW9tYXAyNHh4Y2FtX2Nsb2NrX3B1dChjYW0pOworCQlyZXR1cm4gcnZhbDsKKwl9CisKKwljYW0tPmljayA9IGNsa19nZXQoY2FtLT5kZXYsICJjYW1faWNrIik7CisJaWYgKElTX0VSUihjYW0tPmljaykpIHsKKwkJZGV2X2VycihjYW0tPmRldiwgImNhbid0IGdldCBjYW1faWNrIik7CisJCXJ2YWwgPSBQVFJfRVJSKGNhbS0+aWNrKTsKKwkJb21hcDI0eHhjYW1fY2xvY2tfcHV0KGNhbSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2Nsb2NrX29uKHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwljbGtfZW5hYmxlKGNhbS0+ZmNrKTsKKwljbGtfZW5hYmxlKGNhbS0+aWNrKTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fY2xvY2tfb2ZmKHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwljbGtfZGlzYWJsZShjYW0tPmZjayk7CisJY2xrX2Rpc2FibGUoY2FtLT5pY2spOworfQorCisvKgorICoKKyAqIENhbWVyYSBjb3JlCisgKgorICovCisKKy8qCisgKiBTZXQgeGNsay4KKyAqCisgKiBUbyBkaXNhYmxlIHhjbGssIHVzZSB2YWx1ZSB6ZXJvLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9jb3JlX3hjbGtfc2V0KGNvbnN0IHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSwKKwkJCQkgICAgICB1MzIgeGNsaykKK3sKKwlpZiAoeGNsaykgeworCQl1MzIgZGl2aXNvciA9IENBTV9NQ0xLIC8geGNsazsKKworCQlpZiAoZGl2aXNvciA9PSAxKQorCQkJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSArIENDX1JFR19PRkZTRVQsCisJCQkJCSAgICBDQ19DVFJMX1hDTEssCisJCQkJCSAgICBDQ19DVFJMX1hDTEtfRElWX0JZUEFTUyk7CisJCWVsc2UKKwkJCW9tYXAyNHh4Y2FtX3JlZ19vdXQoY2FtLT5tbWlvX2Jhc2UgKyBDQ19SRUdfT0ZGU0VULAorCQkJCQkgICAgQ0NfQ1RSTF9YQ0xLLCBkaXZpc29yKTsKKwl9IGVsc2UKKwkJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSArIENDX1JFR19PRkZTRVQsCisJCQkJICAgIENDX0NUUkxfWENMSywgQ0NfQ1RSTF9YQ0xLX0RJVl9TVEFCTEVfTE9XKTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fY29yZV9od2luaXQoY29uc3Qgc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCS8qCisJICogU2V0dGluZyB0aGUgY2FtZXJhIGNvcmUgQVVUT0lETEUgYml0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGZyYW1lCisJICogc3luY2hyb25pemF0aW9uLCBzbyB3ZSB3aWxsIGNsZWFyIHRoZSBBVVRPSURMRSBiaXQgaW5zdGVhZC4KKwkgKi8KKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGNhbS0+bW1pb19iYXNlICsgQ0NfUkVHX09GRlNFVCwgQ0NfU1lTQ09ORklHLAorCQkJICAgIENDX1NZU0NPTkZJR19BVVRPSURMRSk7CisKKwkvKiBwcm9ncmFtIHRoZSBjYW1lcmEgaW50ZXJmYWNlIERNQSBwYWNrZXQgc2l6ZSAqLworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoY2FtLT5tbWlvX2Jhc2UgKyBDQ19SRUdfT0ZGU0VULCBDQ19DVFJMX0RNQSwKKwkJCSAgICBDQ19DVFJMX0RNQV9FTiB8IChETUFfVEhSRVNIT0xEIC8gNCAtIDEpKTsKKworCS8qIGVuYWJsZSBjYW1lcmEgY29yZSBlcnJvciBpbnRlcnJ1cHRzICovCisJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSArIENDX1JFR19PRkZTRVQsIENDX0lSUUVOQUJMRSwKKwkJCSAgICBDQ19JUlFFTkFCTEVfRldfRVJSX0lSUQorCQkJICAgIHwgQ0NfSVJRRU5BQkxFX0ZTQ19FUlJfSVJRCisJCQkgICAgfCBDQ19JUlFFTkFCTEVfU1NDX0VSUl9JUlEKKwkJCSAgICB8IENDX0lSUUVOQUJMRV9GSUZPX09GX0lSUSk7Cit9CisKKy8qCisgKiBFbmFibGUgdGhlIGNhbWVyYSBjb3JlLgorICoKKyAqIERhdGEgdHJhbnNmZXIgdG8gdGhlIGNhbWVyYSBETUEgc3RhcnRzIGZyb20gbmV4dCBzdGFydGluZyBmcmFtZS4KKyAqLworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fY29yZV9lbmFibGUoY29uc3Qgc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCisJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSArIENDX1JFR19PRkZTRVQsIENDX0NUUkwsCisJCQkgICAgY2FtLT5jY19jdHJsKTsKK30KKworLyoKKyAqIERpc2FibGUgY2FtZXJhIGNvcmUuCisgKgorICogVGhlIGRhdGEgdHJhbnNmZXIgd2lsbCBiZSBzdG9wcGVkIGltbWVkaWF0ZWx5IChDQ19DVFJMX0NDX1JTVCkuIFRoZQorICogY29yZSBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcyB3aWxsIGJlIHJlc2V0LiBVc2UKKyAqIENDX0NUUkxfQ0NfRlJBTUVfVFJJRyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHRyYW5zZmVyIHRoZSBjdXJyZW50CisgKiBmcmFtZSBjb21wbGV0ZWx5LgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9jb3JlX2Rpc2FibGUoY29uc3Qgc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoY2FtLT5tbWlvX2Jhc2UgKyBDQ19SRUdfT0ZGU0VULCBDQ19DVFJMLAorCQkJICAgIENDX0NUUkxfQ0NfUlNUKTsKK30KKworLyogSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgY2FtZXJhIGNvcmUgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2NvcmVfaXNyKHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwl1MzIgY2NfaXJxc3RhdHVzOworCWNvbnN0IHUzMiBjY19pcnFzdGF0dXNfZXJyID0KKwkJQ0NfSVJRU1RBVFVTX0ZXX0VSUl9JUlEKKwkJfCBDQ19JUlFTVEFUVVNfRlNDX0VSUl9JUlEKKwkJfCBDQ19JUlFTVEFUVVNfU1NDX0VSUl9JUlEKKwkJfCBDQ19JUlFTVEFUVVNfRklGT19VRl9JUlEKKwkJfCBDQ19JUlFTVEFUVVNfRklGT19PRl9JUlE7CisKKwljY19pcnFzdGF0dXMgPSBvbWFwMjR4eGNhbV9yZWdfaW4oY2FtLT5tbWlvX2Jhc2UgKyBDQ19SRUdfT0ZGU0VULAorCQkJCQkgIENDX0lSUVNUQVRVUyk7CisJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSArIENDX1JFR19PRkZTRVQsIENDX0lSUVNUQVRVUywKKwkJCSAgICBjY19pcnFzdGF0dXMpOworCisJaWYgKGNjX2lycXN0YXR1cyAmIGNjX2lycXN0YXR1c19lcnIKKwkgICAgJiYgIWF0b21pY19yZWFkKCZjYW0tPmluX3Jlc2V0KSkgeworCQlkZXZfZGJnKGNhbS0+ZGV2LCAicmVzZXR0aW5nIGNhbWVyYSwgY2NfaXJxc3RhdHVzIDB4JXhcbiIsCisJCQljY19pcnFzdGF0dXMpOworCQlvbWFwMjR4eGNhbV9yZXNldChjYW0pOworCX0KK30KKworLyoKKyAqCisgKiB2aWRlb2J1Zl9idWZmZXIgaGFuZGxpbmcuCisgKgorICogTWVtb3J5IGZvciBtbWFwcGVkIHZpZGVvYnVmX2J1ZmZlcnMgaXMgbm90IGFsbG9jYXRlZAorICogY29udmVudGlvbmFsbHksIGJ1dCBieSBzZXZlcmFsIGttYWxsb2MgYWxsb2NhdGlvbnMgYW5kIHRoZW4KKyAqIGNyZWF0aW5nIHRoZSBzY2F0dGVybGlzdCBvbiBvdXIgb3duLiBVc2VyLXNwYWNlIGJ1ZmZlcnMgYXJlIGhhbmRsZWQKKyAqIG5vcm1hbGx5LgorICoKKyAqLworCisvKgorICogRnJlZSB0aGUgbWVtb3J5LW1hcHBlZCBidWZmZXIgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYQorICogdmlkZW9idWZfYnVmZmVyIGFuZCB0aGUgYXNzb2NpYXRlZCBzY2F0dGVybGlzdC4KKyAqLworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fdmJxX2ZyZWVfbW1hcF9idWZmZXIoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKwlzaXplX3QgYWxsb2Nfc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKworCWlmIChkbWEtPnNnbGlzdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpID0gZG1hLT5zZ2xlbjsKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCWFsbG9jX3NpemUgPSBzZ19kbWFfbGVuKCZkbWEtPnNnbGlzdFtpXSk7CisJCXBhZ2UgPSBzZ19wYWdlKCZkbWEtPnNnbGlzdFtpXSk7CisJCWRvIHsKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UrKyk7CisJCX0gd2hpbGUgKGFsbG9jX3NpemUgLT0gUEFHRV9TSVpFKTsKKwkJX19mcmVlX3BhZ2VzKHNnX3BhZ2UoJmRtYS0+c2dsaXN0W2ldKSwKKwkJCSAgICAgZ2V0X29yZGVyKHNnX2RtYV9sZW4oJmRtYS0+c2dsaXN0W2ldKSkpOworCX0KKworCWtmcmVlKGRtYS0+c2dsaXN0KTsKKwlkbWEtPnNnbGlzdCA9IE5VTEw7Cit9CisKKy8qIFJlbGVhc2UgYWxsIG1lbW9yeSByZWxhdGVkIHRvIHRoZSB2aWRlb2J1Zl9xdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX3ZicV9mcmVlX21tYXBfYnVmZmVycyhzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSkKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnZicS0+dmJfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKKwkJaWYgKE5VTEwgPT0gdmJxLT5idWZzW2ldKQorCQkJY29udGludWU7CisJCWlmIChWNEwyX01FTU9SWV9NTUFQICE9IHZicS0+YnVmc1tpXS0+bWVtb3J5KQorCQkJY29udGludWU7CisJCXZicS0+b3BzLT5idWZfcmVsZWFzZSh2YnEsIHZicS0+YnVmc1tpXSk7CisJCW9tYXAyNHh4Y2FtX3ZicV9mcmVlX21tYXBfYnVmZmVyKHZicS0+YnVmc1tpXSk7CisJCWtmcmVlKHZicS0+YnVmc1tpXSk7CisJCXZicS0+YnVmc1tpXSA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2YnEtPnZiX2xvY2spOworCisJdmlkZW9idWZfbW1hcF9mcmVlKHZicSk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBwaHlzaWNhbGx5IGFzIGNvbnRpZ3VvdXMgYXMgcG9zc2libGUgYnVmZmVyIGZvciB2aWRlbworICogZnJhbWUgYW5kIGFsbG9jYXRlIGFuZCBidWlsZCBETUEgc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgaXQuCisgKi8KK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fdmJxX2FsbG9jX21tYXBfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXVuc2lnbmVkIGludCBvcmRlcjsKKwlzaXplX3QgYWxsb2Nfc2l6ZSwgc2l6ZSA9IHZiLT5ic2l6ZTsgLyogdmItPmJzaXplIGlzIHBhZ2UgYWxpZ25lZCAqLworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBtYXhfcGFnZXMsIGVyciA9IDAsIGkgPSAwOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSA9IHZpZGVvYnVmX3RvX2RtYSh2Yik7CisKKwkvKgorCSAqIGFsbG9jYXRlIG1heGltdW0gc2l6ZSBzY2F0dGVyLWdhdGhlciBsaXN0LiBOb3RlIHRoaXMgaXMKKwkgKiBvdmVyaGVhZC4gV2UgbWF5IG5vdCB1c2UgYXMgbWFueSBlbnRyaWVzIGFzIHdlIGFsbG9jYXRlCisJICovCisJbWF4X3BhZ2VzID0gdmItPmJzaXplID4+IFBBR0VfU0hJRlQ7CisJZG1hLT5zZ2xpc3QgPSBrY2FsbG9jKG1heF9wYWdlcywgc2l6ZW9mKCpkbWEtPnNnbGlzdCksIEdGUF9LRVJORUwpOworCWlmIChkbWEtPnNnbGlzdCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChzaXplKSB7CisJCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCQkvKgorCQkgKiBkbyBub3Qgb3Zlci1hbGxvY2F0ZSBldmVuIGlmIHdlIHdvdWxkIGdldCBsYXJnZXIKKwkJICogY29udGlndW91cyBjaHVuayB0aGF0IHdheQorCQkgKi8KKwkJaWYgKChQQUdFX1NJWkUgPDwgb3JkZXIpID4gc2l6ZSkKKwkJCW9yZGVyLS07CisKKwkJLyogdHJ5IHRvIGFsbG9jYXRlIGFzIG1hbnkgY29udGlndW91cyBwYWdlcyBhcyBwb3NzaWJsZSAqLworCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIG9yZGVyKTsKKwkJLyogaWYgYWxsb2NhdGlvbiBmYWlscywgdHJ5IHRvIGFsbG9jYXRlIHNtYWxsZXIgYW1vdW50ICovCisJCXdoaWxlIChwYWdlID09IE5VTEwpIHsKKwkJCW9yZGVyLS07CisJCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIG9yZGVyKTsKKwkJCWlmIChwYWdlID09IE5VTEwgJiYgIW9yZGVyKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlzaXplIC09IChQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJCS8qIGFwcGVuZCBhbGxvY2F0ZWQgY2h1bmsgb2YgcGFnZXMgaW50byBzY2F0dGVyLWdhdGhlciBsaXN0ICovCisJCXNnX3NldF9wYWdlKCZkbWEtPnNnbGlzdFtpXSwgcGFnZSwgUEFHRV9TSVpFIDw8IG9yZGVyLCAwKTsKKwkJZG1hLT5zZ2xlbisrOworCQlpKys7CisKKwkJYWxsb2Nfc2l6ZSA9IChQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJCS8qIGNsZWFyIHBhZ2VzIGJlZm9yZSBnaXZpbmcgdGhlbSB0byB1c2VyIHNwYWNlICovCisJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSksIDAsIGFsbG9jX3NpemUpOworCisJCS8qIG1hcmsgYWxsb2NhdGVkIHBhZ2VzIHJlc2VydmVkICovCisJCWRvIHsKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKyspOworCQl9IHdoaWxlIChhbGxvY19zaXplIC09IFBBR0VfU0laRSk7CisJfQorCS8qCisJICogUkVWSVNJVDogbm90IGZ1bGx5IGNvcnJlY3QgdG8gYXNzaWduIG5yX3BhZ2VzID09IHNnbGVuIGJ1dAorCSAqIHZpZGVvLWJ1ZiBpcyBwYXNzaW5nIG5yX3BhZ2VzIGZvciBlLmcuIHVubWFwX3NnIGNhbGxzCisJICovCisJZG1hLT5ucl9wYWdlcyA9IGRtYS0+c2dsZW47CisJZG1hLT5kaXJlY3Rpb24gPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCW9tYXAyNHh4Y2FtX3ZicV9mcmVlX21tYXBfYnVmZmVyKHZiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX3ZicV9hbGxvY19tbWFwX2J1ZmZlcnMoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2YnEsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKmZoID0KKwkJY29udGFpbmVyX29mKHZicSwgc3RydWN0IG9tYXAyNHh4Y2FtX2ZoLCB2YnEpOworCisJbXV0ZXhfbG9jaygmdmJxLT52Yl9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWVyciA9IG9tYXAyNHh4Y2FtX3ZicV9hbGxvY19tbWFwX2J1ZmZlcih2YnEtPmJ1ZnNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWRldl9kYmcoZmgtPmNhbS0+ZGV2LCAic2dsZW4gaXMgJWQgZm9yIGJ1ZmZlciAlZFxuIiwKKwkJCXZpZGVvYnVmX3RvX2RtYSh2YnEtPmJ1ZnNbaV0pLT5zZ2xlbiwgaSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ2YnEtPnZiX2xvY2spOworCisJcmV0dXJuIDA7CitvdXQ6CisJd2hpbGUgKGkpIHsKKwkJaS0tOworCQlvbWFwMjR4eGNhbV92YnFfZnJlZV9tbWFwX2J1ZmZlcih2YnEtPmJ1ZnNbaV0pOworCX0KKworCW11dGV4X3VubG9jaygmdmJxLT52Yl9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgd2hlbiBhIHNjYXR0ZXItZ2F0aGVyIERNQQorICogdHJhbnNmZXIgb2YgYSB2aWRlb2J1Zl9idWZmZXIgY29tcGxldGVzLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV92YnFfY29tcGxldGUoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSwKKwkJCQkgICAgIHUzMiBjc3IsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPQorCQljb250YWluZXJfb2Yoc2dkbWEsIHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UsIHNnZG1hKTsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKmZoID0gY2FtLT5zdHJlYW1pbmctPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiA9IChzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICopYXJnOworCWNvbnN0IHUzMiBjc3JfZXJyb3IgPSBDQU1ETUFfQ1NSX01JU0FMSUdORURfRVJSCisJCXwgQ0FNRE1BX0NTUl9TVVBFUlZJU09SX0VSUiB8IENBTURNQV9DU1JfU0VDVVJFX0VSUgorCQl8IENBTURNQV9DU1JfVFJBTlNfRVJSIHwgQ0FNRE1BX0NTUl9EUk9QOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5jb3JlX2VuYWJsZV9kaXNhYmxlX2xvY2ssIGZsYWdzKTsKKwlpZiAoLS1jYW0tPnNnZG1hX2luX3F1ZXVlID09IDApCisJCW9tYXAyNHh4Y2FtX2NvcmVfZGlzYWJsZShjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+Y29yZV9lbmFibGVfZGlzYWJsZV9sb2NrLCBmbGFncyk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnZiLT50cyk7CisJdmItPmZpZWxkX2NvdW50ID0gYXRvbWljX2FkZF9yZXR1cm4oMiwgJmZoLT5maWVsZF9jb3VudCk7CisJaWYgKGNzciAmIGNzcl9lcnJvcikgeworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9FUlJPUjsKKwkJaWYgKCFhdG9taWNfcmVhZCgmZmgtPmNhbS0+aW5fcmVzZXQpKSB7CisJCQlkZXZfZGJnKGNhbS0+ZGV2LCAicmVzZXR0aW5nIGNhbWVyYSwgY3NyIDB4JXhcbiIsIGNzcik7CisJCQlvbWFwMjR4eGNhbV9yZXNldChjYW0pOworCQl9CisJfSBlbHNlCisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJd2FrZV91cCgmdmItPmRvbmUpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV92YnFfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSwKKwkJCQkgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKworCS8qIHdhaXQgZm9yIGJ1ZmZlciwgZXNwZWNpYWxseSB0byBnZXQgb3V0IG9mIHRoZSBzZ2RtYSBxdWV1ZSAqLworCXZpZGVvYnVmX3dhaXRvbih2YiwgMCwgMCk7CisJaWYgKHZiLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQlkbWFfdW5tYXBfc2codmJxLT5kZXYsIGRtYS0+c2dsaXN0LCBkbWEtPnNnbGVuLAorCQkJICAgICBkbWEtPmRpcmVjdGlvbik7CisJCWRtYS0+ZGlyZWN0aW9uID0gRE1BX05PTkU7CisJfSBlbHNlIHsKKwkJdmlkZW9idWZfZG1hX3VubWFwKHZicSwgdmlkZW9idWZfdG9fZG1hKHZiKSk7CisJCXZpZGVvYnVmX2RtYV9mcmVlKHZpZGVvYnVmX3RvX2RtYSh2YikpOworCX0KKworCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Cit9CisKKy8qCisgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBrZXJuZWwgaW1hZ2UgY2FwdHVyZSBidWZmZXJzIGJhc2VkIG9uIHRoZQorICogbnVtYmVyIHJlcXVlc3RlZCwgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbWFnZSBzaXplLCBhbmQgdGhlIG1heGltdW0KKyAqIGFtb3VudCBvZiBtZW1vcnkgcGVybWl0dGVkIGZvciBrZXJuZWwgY2FwdHVyZSBidWZmZXJzLgorICovCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX3ZicV9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSwgdW5zaWduZWQgaW50ICpjbnQsCisJCQkJIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKmZoID0gdmJxLT5wcml2X2RhdGE7CisKKwlpZiAoKmNudCA8PSAwKQorCQkqY250ID0gVklERU9fTUFYX0ZSQU1FOwkvKiBzdXBwbHkgYSBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCisKKwlpZiAoKmNudCA+IFZJREVPX01BWF9GUkFNRSkKKwkJKmNudCA9IFZJREVPX01BWF9GUkFNRTsKKworCSpzaXplID0gZmgtPnBpeC5zaXplaW1hZ2U7CisKKwkvKiBhY2Nlc3NpbmcgZmgtPmNhbS0+Y2FwdHVyZV9tZW0gaXMgb2ssIGl0J3MgY29uc3RhbnQgKi8KKwl3aGlsZSAoKnNpemUgKiAqY250ID4gZmgtPmNhbS0+Y2FwdHVyZV9tZW0pCisJCSgqY250KS0tOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fZG1hX2lvbG9jayhzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSwKKwkJCQkgIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWRtYS0+ZGlyZWN0aW9uID0gUENJX0RNQV9GUk9NREVWSUNFOworCWlmICghZG1hX21hcF9zZyh2YnEtPmRldiwgZG1hLT5zZ2xpc3QsIGRtYS0+c2dsZW4sIGRtYS0+ZGlyZWN0aW9uKSkgeworCQlrZnJlZShkbWEtPnNnbGlzdCk7CisJCWRtYS0+c2dsaXN0ID0gTlVMTDsKKwkJZG1hLT5zZ2xlbiA9IDA7CisJCWVyciA9IC1FSU87CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvbWFwMjR4eGNhbV92YnFfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSwKKwkJCQkgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCQkgICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpmaCA9IHZicS0+cHJpdl9kYXRhOworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBBY2Nlc3NpbmcgcGl4IGhlcmUgaXMgb2theSBzaW5jZSBpdCdzIGNvbnN0YW50IHdoaWxlCisJICogc3RyZWFtaW5nIGlzIG9uIChhbmQgd2Ugb25seSBnZXQgY2FsbGVkIHRoZW4pLgorCSAqLworCWlmICh2Yi0+YmFkZHIpIHsKKwkJLyogVGhpcyBpcyBhIHVzZXJzcGFjZSBidWZmZXIuICovCisJCWlmIChmaC0+cGl4LnNpemVpbWFnZSA+IHZiLT5ic2l6ZSkgeworCQkJLyogVGhlIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoLiAqLworCQkJZXJyID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQl2Yi0+c2l6ZSA9IGZoLT5waXguc2l6ZWltYWdlOworCX0gZWxzZSB7CisJCWlmICh2Yi0+c3RhdGUgIT0gVklERU9CVUZfTkVFRFNfSU5JVCkgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSBrZXJuZWwgYm91bmNlIGJ1ZmZlciB0aGF0IGhhcworCQkJICogYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4KKwkJCSAqLworCQkJaWYgKGZoLT5waXguc2l6ZWltYWdlID4gdmItPnNpemUpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBpbWFnZSBzaXplIGhhcyBiZWVuIGNoYW5nZWQgdG8KKwkJCQkgKiBhIGxhcmdlciBzaXplIHNpbmNlIHRoaXMgYnVmZmVyIHdhcworCQkJCSAqIGFsbG9jYXRlZCwgc28gd2UgbmVlZCB0byBmcmVlIGFuZAorCQkJCSAqIHJlYWxsb2NhdGUgaXQuCisJCQkJICovCisJCQkJb21hcDI0eHhjYW1fdmJxX3JlbGVhc2UodmJxLCB2Yik7CisJCQkJdmItPnNpemUgPSBmaC0+cGl4LnNpemVpbWFnZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcga2VybmVsIGJvdW5jZSBidWZmZXIuICovCisJCQl2Yi0+c2l6ZSA9IGZoLT5waXguc2l6ZWltYWdlOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXZiLT53aWR0aCA9IGZoLT5waXgud2lkdGg7CisJdmItPmhlaWdodCA9IGZoLT5waXguaGVpZ2h0OworCXZiLT5maWVsZCA9IGZpZWxkOworCisJaWYgKHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9ORUVEU19JTklUKSB7CisJCWlmICh2Yi0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVApCisJCQkvKgorCQkJICogd2UgaGF2ZSBidWlsdCB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCBieSBvdXJzZWxmIHNvCisJCQkgKiBkbyB0aGUgc2NhdHRlci1nYXRoZXIgbWFwcGluZyBhcyB3ZWxsCisJCQkgKi8KKwkJCWVyciA9IG9tYXAyNHh4Y2FtX2RtYV9pb2xvY2sodmJxLCB2aWRlb2J1Zl90b19kbWEodmIpKTsKKwkJZWxzZQorCQkJZXJyID0gdmlkZW9idWZfaW9sb2NrKHZicSwgdmIsIE5VTEwpOworCX0KKworCWlmICghZXJyKQorCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9QUkVQQVJFRDsKKwllbHNlCisJCW9tYXAyNHh4Y2FtX3ZicV9yZWxlYXNlKHZicSwgdmIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fdmJxX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdmJxLAorCQkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpmaCA9IHZicS0+cHJpdl9kYXRhOworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IGZoLT5jYW07CisJZW51bSB2aWRlb2J1Zl9zdGF0ZSBzdGF0ZSA9IHZiLT5zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwkvKgorCSAqIEZJWE1FOiBXZSdyZSBtYXJraW5nIHRoZSBidWZmZXIgYWN0aXZlIHNpbmNlIHdlIGhhdmUgbm8KKwkgKiBwcmV0dHkgd2F5IG9mIG1hcmtpbmcgaXQgYWN0aXZlIGV4YWN0bHkgd2hlbiB0aGUKKwkgKiBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlciBzdGFydHMuCisJICovCisJdmItPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCisJZXJyID0gb21hcDI0eHhjYW1fc2dkbWFfcXVldWUoJmZoLT5jYW0tPnNnZG1hLAorCQkJCSAgICAgIHZpZGVvYnVmX3RvX2RtYSh2YiktPnNnbGlzdCwKKwkJCQkgICAgICB2aWRlb2J1Zl90b19kbWEodmIpLT5zZ2xlbiwgdmItPnNpemUsCisJCQkJICAgICAgb21hcDI0eHhjYW1fdmJxX2NvbXBsZXRlLCB2Yik7CisKKwlpZiAoIWVycikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5jb3JlX2VuYWJsZV9kaXNhYmxlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCsrY2FtLT5zZ2RtYV9pbl9xdWV1ZSA9PSAxCisJCSAgICAmJiAhYXRvbWljX3JlYWQoJmNhbS0+aW5fcmVzZXQpKQorCQkJb21hcDI0eHhjYW1fY29yZV9lbmFibGUoY2FtKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5jb3JlX2VuYWJsZV9kaXNhYmxlX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPb3BzLiBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gZ2V0IGFueSBlcnJvcnMgaGVyZS4KKwkJICogVGhlIG9ubHkgd2F5IHdlIGNvdWxkIGdldCBhbiBlcnJvciBpcyBpZiB3ZSByYW4gb3V0CisJCSAqIG9mIHNjYXR0ZXItZ2F0aGVyIERNQSBzbG90cywgYnV0IHdlIGFyZSBzdXBwb3NlZCB0bworCQkgKiBoYXZlIGF0IGxlYXN0IGFzIG1hbnkgc2NhdHRlci1nYXRoZXIgRE1BIHNsb3RzIGFzCisJCSAqIHZpZGVvIGJ1ZmZlcnMgc28gdGhhdCBjYW4ndCBoYXBwZW4uCisJCSAqLworCQlkZXZfZXJyKGNhbS0+ZGV2LCAiZmFpbGVkIHRvIHF1ZXVlIGEgdmlkZW8gYnVmZmVyIGZvciBkbWEhXG4iKTsKKwkJZGV2X2VycihjYW0tPmRldiwgImxpa2VseSBhIGJ1ZyBpbiB0aGUgZHJpdmVyIVxuIik7CisJCXZiLT5zdGF0ZSA9IHN0YXRlOworCX0KK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgb21hcDI0eHhjYW1fdmJxX29wcyA9IHsKKwkuYnVmX3NldHVwICAgPSBvbWFwMjR4eGNhbV92YnFfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlID0gb21hcDI0eHhjYW1fdmJxX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZSAgID0gb21hcDI0eHhjYW1fdmJxX3F1ZXVlLAorCS5idWZfcmVsZWFzZSA9IG9tYXAyNHh4Y2FtX3ZicV9yZWxlYXNlLAorfTsKKworLyoKKyAqCisgKiBPTUFQIG1haW4gY2FtZXJhIHN5c3RlbQorICoKKyAqLworCisvKgorICogUmVzZXQgY2FtZXJhIGJsb2NrIHRvIHBvd2VyLW9uIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9wb3dlcm9uX3Jlc2V0KHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwlpbnQgbWF4X2xvb3AgPSBSRVNFVF9USU1FT1VUX05TOworCisJLyogUmVzZXQgd2hvbGUgY2FtZXJhIHN1YnN5c3RlbSAqLworCW9tYXAyNHh4Y2FtX3JlZ19vdXQoY2FtLT5tbWlvX2Jhc2UsCisJCQkgICAgQ0FNX1NZU0NPTkZJRywKKwkJCSAgICBDQU1fU1lTQ09ORklHX1NPRlRSRVNFVCk7CisKKwkvKiBXYWl0IHRpbGwgaXQncyBmaW5pc2hlZCAqLworCXdoaWxlICghKG9tYXAyNHh4Y2FtX3JlZ19pbihjYW0tPm1taW9fYmFzZSwgQ0FNX1NZU1NUQVRVUykKKwkJICYgQ0FNX1NZU1NUQVRVU19SRVNFVERPTkUpCisJICAgICAgICYmIC0tbWF4X2xvb3ApIHsKKwkJbmRlbGF5KDEpOworCX0KKworCWlmICghKG9tYXAyNHh4Y2FtX3JlZ19pbihjYW0tPm1taW9fYmFzZSwgQ0FNX1NZU1NUQVRVUykKKwkgICAgICAmIENBTV9TWVNTVEFUVVNfUkVTRVRET05FKSkKKwkJZGV2X2VycihjYW0tPmRldiwgImNhbWVyYSBzb2Z0IHJlc2V0IHRpbWVvdXRcbiIpOworfQorCisvKgorICogKFJlKWluaXRpYWxpc2UgdGhlIGNhbWVyYSBibG9jay4KKyAqLworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1faHdpbml0KHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwlvbWFwMjR4eGNhbV9wb3dlcm9uX3Jlc2V0KGNhbSk7CisKKwkvKiBzZXQgdGhlIGNhbWVyYSBzdWJzeXN0ZW0gYXV0b2lkbGUgYml0ICovCisJb21hcDI0eHhjYW1fcmVnX291dChjYW0tPm1taW9fYmFzZSwgQ0FNX1NZU0NPTkZJRywKKwkJCSAgICBDQU1fU1lTQ09ORklHX0FVVE9JRExFKTsKKworCS8qIHNldCB0aGUgY2FtZXJhIE1NVSBhdXRvaWRsZSBiaXQgKi8KKwlvbWFwMjR4eGNhbV9yZWdfb3V0KGNhbS0+bW1pb19iYXNlLAorCQkJICAgIENBTU1NVV9SRUdfT0ZGU0VUICsgQ0FNTU1VX1NZU0NPTkZJRywKKwkJCSAgICBDQU1NTVVfU1lTQ09ORklHX0FVVE9JRExFKTsKKworCW9tYXAyNHh4Y2FtX2NvcmVfaHdpbml0KGNhbSk7CisKKwlvbWFwMjR4eGNhbV9kbWFfaHdpbml0KCZjYW0tPnNnZG1hLmRtYSk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBmb3IgZG1hIHRyYW5zZmVyIHN0YWxsaW5nLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9zdGFsbGVkX2RtYV9yZXNldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gKHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKilkYXRhOworCisJaWYgKCFhdG9taWNfcmVhZCgmY2FtLT5pbl9yZXNldCkpIHsKKwkJZGV2X2RiZyhjYW0tPmRldiwgImRtYSBzdGFsbGVkLCByZXNldHRpbmcgY2FtZXJhXG4iKTsKKwkJb21hcDI0eHhjYW1fcmVzZXQoY2FtKTsKKwl9Cit9CisKKy8qCisgKiBTdG9wIGNhcHR1cmUuIE1hcmsgd2UncmUgZG9pbmcgYSByZXNldCwgc3RvcCBETUEgdHJhbnNmZXJzIGFuZAorICogY29yZS4gKE5vIG5ldyBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlcnMgd2lsbCBiZSBxdWV1ZWQgd2hpbHN0CisgKiBpbl9yZXNldCBpcyBub24temVyby4pCisgKgorICogSWYgb21hcDI0eHhjYW1fY2FwdHVyZV9zdG9wIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzIGF0CisgKiBvbmNlLCBvbmx5IHRoZSBmaXJzdCBjYWxsIHdpbGwgaGF2ZSBhbiBlZmZlY3QuIFNpbWlsYXJseSwgdGhlIGxhc3QKKyAqIGNhbGwgb21hcDI0eHhjYW1fc3RyZWFtaW5nX2NvbnQgd2lsbCBoYXZlIGVmZmVjdC4KKyAqCisgKiBTZXJpYWxpc2F0aW9uIGlzIGVuc3VyZWQgYnkgdXNpbmcgY2FtLT5jb3JlX2VuYWJsZV9kaXNhYmxlX2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIG9tYXAyNHh4Y2FtX2NhcHR1cmVfc3RvcChzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmNvcmVfZW5hYmxlX2Rpc2FibGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZjYW0tPmluX3Jlc2V0KSAhPSAxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+Y29yZV9lbmFibGVfZGlzYWJsZV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlvbWFwMjR4eGNhbV9jb3JlX2Rpc2FibGUoY2FtKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+Y29yZV9lbmFibGVfZGlzYWJsZV9sb2NrLCBmbGFncyk7CisKKwlvbWFwMjR4eGNhbV9zZ2RtYV9zeW5jKCZjYW0tPnNnZG1hKTsKK30KKworLyoKKyAqIFJlc2V0IGFuZCBjb250aW51ZSBzdHJlYW1pbmcuCisgKgorICogTm90ZTogUmVzZXR0aW5nIHRoZSBjYW1lcmEgRklGTyB2aWEgdGhlIENDX1JTVCBiaXQgaW4gdGhlIENDX0NUUkwKKyAqIHJlZ2lzdGVyIGlzIHN1cHBvc2VkIHRvIGJlIHN1ZmZpY2llbnQgdG8gcmVjb3ZlciBmcm9tIGEgY2FtZXJhCisgKiBpbnRlcmZhY2UgZXJyb3IsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgZW5vdWdoLiBJZiB3ZSBvbmx5IGRvCisgKiB0aGF0IHRoZW4gc3Vic2VxdWVudCBpbWFnZSBjYXB0dXJlcyBhcmUgb3V0IG9mIHN5bmMgYnkgZWl0aGVyIG9uZQorICogb3IgdHdvIHRpbWVzIERNQV9USFJFU0hPTEQgYnl0ZXMuIFJlc2V0dGluZyBhbmQgcmUtaW5pdGlhbGl6aW5nIHRoZQorICogZW50aXJlIGNhbWVyYSBzdWJzeXN0ZW0gcHJldmVudHMgdGhlIHByb2JsZW0gd2l0aCBmcmFtZQorICogc3luY2hyb25pemF0aW9uLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9jYXB0dXJlX2NvbnQoc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5jb3JlX2VuYWJsZV9kaXNhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChhdG9taWNfcmVhZCgmY2FtLT5pbl9yZXNldCkgIT0gMSkKKwkJZ290byBvdXQ7CisKKwlvbWFwMjR4eGNhbV9od2luaXQoY2FtKTsKKworCW9tYXAyNHh4Y2FtX3NlbnNvcl9pZl9lbmFibGUoY2FtKTsKKworCW9tYXAyNHh4Y2FtX3NnZG1hX3Byb2Nlc3MoJmNhbS0+c2dkbWEpOworCisJaWYgKGNhbS0+c2dkbWFfaW5fcXVldWUpCisJCW9tYXAyNHh4Y2FtX2NvcmVfZW5hYmxlKGNhbSk7CisKK291dDoKKwlhdG9taWNfZGVjKCZjYW0tPmluX3Jlc2V0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmNvcmVfZW5hYmxlX2Rpc2FibGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3NpemVfdAorb21hcDI0eHhjYW1fc3RyZWFtaW5nX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNhbS0+c3RyZWFtaW5nID8gICJhY3RpdmUiIDogImluYWN0aXZlIik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3RyZWFtaW5nLCBTX0lSVUdPLCBvbWFwMjR4eGNhbV9zdHJlYW1pbmdfc2hvdywgTlVMTCk7CisKKy8qCisgKiBTdG9wIGNhcHR1cmUgYW5kIHJlc3RhcnQgaXQuIEkuZS4gcmVzZXQgdGhlIGNhbWVyYSBkdXJpbmcgdXNlLgorICovCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9yZXNldChzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJb21hcDI0eHhjYW1fY2FwdHVyZV9zdG9wKGNhbSk7CisJb21hcDI0eHhjYW1fY2FwdHVyZV9jb250KGNhbSk7Cit9CisKKy8qCisgKiBUaGUgbWFpbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IG9tYXAyNHh4Y2FtX2lzcihpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gKHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKilhcmc7CisJdTMyIGlycXN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaXJxaGFuZGxlZCA9IDA7CisKKwlpcnFzdGF0dXMgPSBvbWFwMjR4eGNhbV9yZWdfaW4oY2FtLT5tbWlvX2Jhc2UsIENBTV9JUlFTVEFUVVMpOworCisJaWYgKGlycXN0YXR1cyAmCisJICAgIChDQU1fSVJRU1RBVFVTX0RNQV9JUlEyIHwgQ0FNX0lSUVNUQVRVU19ETUFfSVJRMQorCSAgICAgfCBDQU1fSVJRU1RBVFVTX0RNQV9JUlEwKSkgeworCQlvbWFwMjR4eGNhbV9kbWFfaXNyKCZjYW0tPnNnZG1hLmRtYSk7CisJCWlycWhhbmRsZWQgPSAxOworCX0KKwlpZiAoaXJxc3RhdHVzICYgQ0FNX0lSUVNUQVRVU19DQ19JUlEpIHsKKwkJb21hcDI0eHhjYW1fY29yZV9pc3IoY2FtKTsKKwkJaXJxaGFuZGxlZCA9IDE7CisJfQorCWlmIChpcnFzdGF0dXMgJiBDQU1fSVJRU1RBVFVTX01NVV9JUlEpCisJCWRldl9lcnIoY2FtLT5kZXYsICJ1bmhhbmRsZWQgY2FtZXJhIE1NVSBpbnRlcnJ1cHQhXG4iKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGlycWhhbmRsZWQpOworfQorCisvKgorICoKKyAqIFNlbnNvciBoYW5kbGluZy4KKyAqCisgKi8KKworLyoKKyAqIEVuYWJsZSB0aGUgZXh0ZXJuYWwgc2Vuc29yIGludGVyZmFjZS4gVHJ5IHRvIG5lZ290aWF0ZSBpbnRlcmZhY2UKKyAqIHBhcmFtZXRlcnMgd2l0aCB0aGUgc2Vuc29yIGFuZCBzdGFydCB1c2luZyB0aGUgbmV3IG9uZXMuIFRoZSBjYWxscworICogdG8gc2Vuc29yX2lmX2VuYWJsZSBhbmQgc2Vuc29yX2lmX2Rpc2FibGUgbmVlZCBub3QgdG8gYmUgYmFsYW5jZWQuCisgKi8KK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fc2Vuc29yX2lmX2VuYWJsZShzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJaW50IHJ2YWw7CisJc3RydWN0IHY0bDJfaWZwYXJtIHA7CisKKwlydmFsID0gdmlkaW9jX2ludF9nX2lmcGFybShjYW0tPnNkZXYsICZwKTsKKwlpZiAocnZhbCkgeworCQlkZXZfZXJyKGNhbS0+ZGV2LCAidmlkaW9jX2ludF9nX2lmcGFybSBmYWlsZWQgd2l0aCAlZFxuIiwgcnZhbCk7CisJCXJldHVybiBydmFsOworCX0KKworCWNhbS0+aWZfdHlwZSA9IHAuaWZfdHlwZTsKKworCWNhbS0+Y2NfY3RybCA9IENDX0NUUkxfQ0NfRU47CisKKwlzd2l0Y2ggKHAuaWZfdHlwZSkgeworCWNhc2UgVjRMMl9JRl9UWVBFX0JUNjU2OgorCQlpZiAocC51LmJ0NjU2LmZyYW1lX3N0YXJ0X29uX3Jpc2luZ192cykKKwkJCWNhbS0+Y2NfY3RybCB8PSBDQ19DVFJMX05PQlRfU1lOQ0hSTzsKKwkJaWYgKHAudS5idDY1Ni5idF9zeW5jX2NvcnJlY3QpCisJCQljYW0tPmNjX2N0cmwgfD0gQ0NfQ1RSTF9CVF9DT1JSRUNUOworCQlpZiAocC51LmJ0NjU2LnN3YXApCisJCQljYW0tPmNjX2N0cmwgfD0gQ0NfQ1RSTF9QQVJfT1JERVJDQU07CisJCWlmIChwLnUuYnQ2NTYubGF0Y2hfY2xrX2ludikKKwkJCWNhbS0+Y2NfY3RybCB8PSBDQ19DVFJMX1BBUl9DTEtfUE9MOworCQlpZiAocC51LmJ0NjU2Lm5vYnRfaHNfaW52KQorCQkJY2FtLT5jY19jdHJsIHw9IENDX0NUUkxfTk9CVF9IU19QT0w7CisJCWlmIChwLnUuYnQ2NTYubm9idF92c19pbnYpCisJCQljYW0tPmNjX2N0cmwgfD0gQ0NfQ1RSTF9OT0JUX1ZTX1BPTDsKKworCQlzd2l0Y2ggKHAudS5idDY1Ni5tb2RlKSB7CisJCWNhc2UgVjRMMl9JRl9UWVBFX0JUNjU2X01PREVfTk9CVF84QklUOgorCQkJY2FtLT5jY19jdHJsIHw9IENDX0NUUkxfUEFSX01PREVfTk9CVDg7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0lGX1RZUEVfQlQ2NTZfTU9ERV9OT0JUXzEwQklUOgorCQkJY2FtLT5jY19jdHJsIHw9IENDX0NUUkxfUEFSX01PREVfTk9CVDEwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9JRl9UWVBFX0JUNjU2X01PREVfTk9CVF8xMkJJVDoKKwkJCWNhbS0+Y2NfY3RybCB8PSBDQ19DVFJMX1BBUl9NT0RFX05PQlQxMjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfSUZfVFlQRV9CVDY1Nl9NT0RFX0JUXzhCSVQ6CisJCQljYW0tPmNjX2N0cmwgfD0gQ0NfQ1RSTF9QQVJfTU9ERV9CVDg7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0lGX1RZUEVfQlQ2NTZfTU9ERV9CVF8xMEJJVDoKKwkJCWNhbS0+Y2NfY3RybCB8PSBDQ19DVFJMX1BBUl9NT0RFX0JUMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY2FtLT5kZXYsCisJCQkJImJ0NjU2IGludGVyZmFjZSBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJcC51LmJ0NjU2Lm1vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyoKKwkJICogVGhlIGNsb2NrIHJhdGUgdGhhdCB0aGUgc2Vuc29yIHdhbnRzIGhhcyBjaGFuZ2VkLgorCQkgKiBXZSBoYXZlIHRvIGFkanVzdCB0aGUgeGNsayBmcm9tIE9NQVAgMiBzaWRlIHRvCisJCSAqIG1hdGNoIHRoZSBzZW5zb3IncyB3aXNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuCisJCSAqLworCQlpZiAocC51LmJ0NjU2LmNsb2NrX2N1cnIgIT0gY2FtLT5pZl91LmJ0NjU2LnhjbGspIHsKKwkJCXUzMiB4Y2xrID0gcC51LmJ0NjU2LmNsb2NrX2N1cnI7CisJCQl1MzIgZGl2aXNvcjsKKworCQkJaWYgKHhjbGsgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHhjbGsgPiBDQU1fTUNMSykKKwkJCQl4Y2xrID0gQ0FNX01DTEs7CisKKwkJCWRpdmlzb3IgPSBDQU1fTUNMSyAvIHhjbGs7CisJCQlpZiAoZGl2aXNvciAqIHhjbGsgPCBDQU1fTUNMSykKKwkJCQlkaXZpc29yKys7CisJCQlpZiAoQ0FNX01DTEsgLyBkaXZpc29yIDwgcC51LmJ0NjU2LmNsb2NrX21pbgorCQkJICAgICYmIGRpdmlzb3IgPiAxKQorCQkJCWRpdmlzb3ItLTsKKwkJCWlmIChkaXZpc29yID4gMzApCisJCQkJZGl2aXNvciA9IDMwOworCisJCQl4Y2xrID0gQ0FNX01DTEsgLyBkaXZpc29yOworCisJCQlpZiAoeGNsayA8IHAudS5idDY1Ni5jbG9ja19taW4KKwkJCSAgICB8fCB4Y2xrID4gcC51LmJ0NjU2LmNsb2NrX21heCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY2FtLT5pZl91LmJ0NjU2LnhjbGsgPSB4Y2xrOworCQl9CisJCW9tYXAyNHh4Y2FtX2NvcmVfeGNsa19zZXQoY2FtLCBjYW0tPmlmX3UuYnQ2NTYueGNsayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEZJWE1FOiBob3cgYWJvdXQgb3RoZXIgaW50ZXJmYWNlcz8gKi8KKwkJZGV2X2VycihjYW0tPmRldiwgImludGVyZmFjZSB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlwLmlmX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fc2Vuc29yX2lmX2Rpc2FibGUoY29uc3Qgc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCXN3aXRjaCAoY2FtLT5pZl90eXBlKSB7CisJY2FzZSBWNEwyX0lGX1RZUEVfQlQ2NTY6CisJCW9tYXAyNHh4Y2FtX2NvcmVfeGNsa19zZXQoY2FtLCAwKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgc2Vuc29yIGhhcmR3YXJlLgorICovCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX3NlbnNvcl9pbml0KHN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzZGV2ID0gY2FtLT5zZGV2OworCisJb21hcDI0eHhjYW1fY2xvY2tfb24oY2FtKTsKKwllcnIgPSBvbWFwMjR4eGNhbV9zZW5zb3JfaWZfZW5hYmxlKGNhbSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGNhbS0+ZGV2LCAic2Vuc29yIGludGVyZmFjZSBjb3VsZCBub3QgYmUgZW5hYmxlZCBhdCAiCisJCQkiaW5pdGlhbGlzYXRpb24sICVkXG4iLCBlcnIpOworCQljYW0tPnNkZXYgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBwb3dlciB1cCBzZW5zb3IgZHVyaW5nIHNlbnNvciBpbml0aWFsaXphdGlvbiAqLworCXZpZGlvY19pbnRfc19wb3dlcihzZGV2LCAxKTsKKworCWVyciA9IHZpZGlvY19pbnRfZGV2X2luaXQoc2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGNhbS0+ZGV2LCAiY2Fubm90IGluaXRpYWxpemUgc2Vuc29yLCBlcnJvciAlZFxuIiwgZXJyKTsKKwkJLyogU2Vuc29yIGluaXQgZmFpbGVkIC0tLSBpdCdzIG5vbmV4aXN0ZW50IHRvIHVzISAqLworCQljYW0tPnNkZXYgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfaW5mbyhjYW0tPmRldiwgInNlbnNvciBpcyAlc1xuIiwgc2Rldi0+bmFtZSk7CisKK291dDoKKwlvbWFwMjR4eGNhbV9zZW5zb3JfaWZfZGlzYWJsZShjYW0pOworCW9tYXAyNHh4Y2FtX2Nsb2NrX29mZihjYW0pOworCisJdmlkaW9jX2ludF9zX3Bvd2VyKHNkZXYsIDApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fc2Vuc29yX2V4aXQoc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCWlmIChjYW0tPnNkZXYpCisJCXZpZGlvY19pbnRfZGV2X2V4aXQoY2FtLT5zZGV2KTsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fc2Vuc29yX2Rpc2FibGUoc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtKQoreworCW9tYXAyNHh4Y2FtX3NlbnNvcl9pZl9kaXNhYmxlKGNhbSk7CisJb21hcDI0eHhjYW1fY2xvY2tfb2ZmKGNhbSk7CisJdmlkaW9jX2ludF9zX3Bvd2VyKGNhbS0+c2RldiwgMCk7Cit9CisKKy8qCisgKiBQb3dlci11cCBhbmQgY29uZmlndXJlIGNhbWVyYSBzZW5zb3IuIEl0J3MgcmVhZHkgZm9yIGNhcHR1cmluZyBub3cuCisgKi8KK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fc2Vuc29yX2VuYWJsZShzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0pCit7CisJaW50IHJ2YWw7CisKKwlvbWFwMjR4eGNhbV9jbG9ja19vbihjYW0pOworCisJb21hcDI0eHhjYW1fc2Vuc29yX2lmX2VuYWJsZShjYW0pOworCisJcnZhbCA9IHZpZGlvY19pbnRfc19wb3dlcihjYW0tPnNkZXYsIDEpOworCWlmIChydmFsKQorCQlnb3RvIG91dDsKKworCXJ2YWwgPSB2aWRpb2NfaW50X2luaXQoY2FtLT5zZGV2KTsKKwlpZiAocnZhbCkKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCW9tYXAyNHh4Y2FtX3NlbnNvcl9kaXNhYmxlKGNhbSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIHZvaWQgb21hcDI0eHhjYW1fc2Vuc29yX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlLAorCQkJICAgICBzZW5zb3JfcmVzZXRfd29yayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNhbS0+cmVzZXRfZGlzYWJsZSkpCisJCXJldHVybjsKKworCW9tYXAyNHh4Y2FtX2NhcHR1cmVfc3RvcChjYW0pOworCisJaWYgKHZpZGlvY19pbnRfcmVzZXQoY2FtLT5zZGV2KSA9PSAwKSB7CisJCXZpZGlvY19pbnRfaW5pdChjYW0tPnNkZXYpOworCX0gZWxzZSB7CisJCS8qIENhbid0IHJlc2V0IGl0IGJ5IHZpZGlvY19pbnRfcmVzZXQuICovCisJCW9tYXAyNHh4Y2FtX3NlbnNvcl9kaXNhYmxlKGNhbSk7CisJCW9tYXAyNHh4Y2FtX3NlbnNvcl9lbmFibGUoY2FtKTsKKwl9CisKKwlvbWFwMjR4eGNhbV9jYXB0dXJlX2NvbnQoY2FtKTsKK30KKworLyoKKyAqCisgKiBJT0NUTCBpbnRlcmZhY2UuCisgKgorICovCisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKm9maCA9IGZoOworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IG9maC0+Y2FtOworCisJc3RybGNweShjYXAtPmRyaXZlciwgQ0FNX05BTUUsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5jYXJkLCBjYW0tPnZmZC0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCWNhcC0+dmVyc2lvbiA9IE9NQVAyNFhYQ0FNX1ZFUlNJT047CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSB2aWRpb2NfaW50X2VudW1fZm10X2NhcChjYW0tPnNkZXYsIGYpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKm9maCA9IGZoOworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IG9maC0+Y2FtOworCWludCBydmFsOworCisJbXV0ZXhfbG9jaygmY2FtLT5tdXRleCk7CisJcnZhbCA9IHZpZGlvY19pbnRfZ19mbXRfY2FwKGNhbS0+c2RldiwgZik7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlpbnQgcnZhbDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZykgeworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlydmFsID0gdmlkaW9jX2ludF9zX2ZtdF9jYXAoY2FtLT5zZGV2LCBmKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisKKwlpZiAoIXJ2YWwpIHsKKwkJbXV0ZXhfbG9jaygmb2ZoLT52YnEudmJfbG9jayk7CisJCW9maC0+cGl4ID0gZi0+Zm10LnBpeDsKKwkJbXV0ZXhfdW5sb2NrKCZvZmgtPnZicS52Yl9sb2NrKTsKKwl9CisKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJdmlkaW9jX2dfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGYpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlpbnQgcnZhbDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCXJ2YWwgPSB2aWRpb2NfaW50X3RyeV9mbXRfY2FwKGNhbS0+c2RldiwgZik7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKmIpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlpbnQgcnZhbDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZykgeworCQltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW9tYXAyNHh4Y2FtX3ZicV9mcmVlX21tYXBfYnVmZmVycygmb2ZoLT52YnEpOworCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisKKwlydmFsID0gdmlkZW9idWZfcmVxYnVmcygmb2ZoLT52YnEsIGIpOworCisJLyoKKwkgKiBFaXRoZXIgdmlkZW9idWZfcmVxYnVmcyBmYWlsZWQgb3IgdGhlIGJ1ZmZlcnMgYXJlIG5vdAorCSAqIG1lbW9yeS1tYXBwZWQgKHdoaWNoIHdvdWxkIG5lZWQgc3BlY2lhbCBhdHRlbnRpb24pLgorCSAqLworCWlmIChydmFsIDwgMCB8fCBiLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJZ290byBvdXQ7CisKKwlydmFsID0gb21hcDI0eHhjYW1fdmJxX2FsbG9jX21tYXBfYnVmZmVycygmb2ZoLT52YnEsIHJ2YWwpOworCWlmIChydmFsKQorCQlvbWFwMjR4eGNhbV92YnFfZnJlZV9tbWFwX2J1ZmZlcnMoJm9maC0+dmJxKTsKKworb3V0OgorCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKworCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1Zigmb2ZoLT52YnEsIGIpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqb2ZoID0gZmg7CisKKwlyZXR1cm4gdmlkZW9idWZfcWJ1Zigmb2ZoLT52YnEsIGIpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKm9maCA9IGZoOworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IG9maC0+Y2FtOworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOworCWludCBydmFsOworCit2aWRlb2J1Zl9kcWJ1Zl9hZ2FpbjoKKwlydmFsID0gdmlkZW9idWZfZHFidWYoJm9maC0+dmJxLCBiLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaWYgKHJ2YWwpCisJCWdvdG8gb3V0OworCisJdmIgPSBvZmgtPnZicS5idWZzW2ItPmluZGV4XTsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCS8qIF9uZWVkc19yZXNldCByZXR1cm5zIC1FSU8gaWYgcmVzZXQgaXMgcmVxdWlyZWQuICovCisJcnZhbCA9IHZpZGlvY19pbnRfZ19uZWVkc19yZXNldChjYW0tPnNkZXYsICh2b2lkICopdmItPmJhZGRyKTsKKwltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCWlmIChydmFsID09IC1FSU8pCisJCXNjaGVkdWxlX3dvcmsoJmNhbS0+c2Vuc29yX3Jlc2V0X3dvcmspOworCWVsc2UKKwkJcnZhbCA9IDA7CisKK291dDoKKwkvKgorCSAqIFRoaXMgaXMgYSBoYWNrLiBXZSBkb24ndCB3YW50IHRvIHNob3cgLUVJTyB0byB0aGUgdXNlcgorCSAqIHNwYWNlLiBSZXF1ZXVlIHRoZSBidWZmZXIgYW5kIHRyeSBhZ2FpbiBpZiB3ZSdyZSBub3QgZG9pbmcKKwkgKiB0aGlzIGluIG5vbi1ibG9ja2luZyBtb2RlLgorCSAqLworCWlmIChydmFsID09IC1FSU8pIHsKKwkJdmlkZW9idWZfcWJ1Zigmb2ZoLT52YnEsIGIpOworCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCQlnb3RvIHZpZGVvYnVmX2RxYnVmX2FnYWluOworCQkvKgorCQkgKiBXZSBkb24ndCBoYXZlIGEgdmlkZW9idWZfYnVmZmVyIG5vdyAtLS0gbWF5YmUgbmV4dAorCQkgKiB0aW1lLi4uCisJCSAqLworCQlydmFsID0gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggKm9maCA9IGZoOworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IG9maC0+Y2FtOworCWludCBydmFsOworCisJbXV0ZXhfbG9jaygmY2FtLT5tdXRleCk7CisJaWYgKGNhbS0+c3RyZWFtaW5nKSB7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJ2YWwgPSBvbWFwMjR4eGNhbV9zZW5zb3JfaWZfZW5hYmxlKGNhbSk7CisJaWYgKHJ2YWwpIHsKKwkJZGV2X2RiZyhjYW0tPmRldiwgInZpZGlvY19pbnRfZ19pZnBhcm0gZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcnZhbCA9IHZpZGVvYnVmX3N0cmVhbW9uKCZvZmgtPnZicSk7CisJaWYgKCFydmFsKSB7CisJCWNhbS0+c3RyZWFtaW5nID0gZmlsZTsKKwkJc3lzZnNfbm90aWZ5KCZjYW0tPmRldi0+a29iaiwgTlVMTCwgInN0cmVhbWluZyIpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSAmb2ZoLT52YnE7CisJaW50IHJ2YWw7CisKKwlhdG9taWNfaW5jKCZjYW0tPnJlc2V0X2Rpc2FibGUpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCXJ2YWwgPSB2aWRlb2J1Zl9zdHJlYW1vZmYocSk7CisJaWYgKCFydmFsKSB7CisJCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCQljYW0tPnN0cmVhbWluZyA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisJCXN5c2ZzX25vdGlmeSgmY2FtLT5kZXYtPmtvYmosIE5VTEwsICJzdHJlYW1pbmciKTsKKwl9CisKKwlhdG9taWNfZGVjKCZjYW0tPnJlc2V0X2Rpc2FibGUpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKQoreworCWlmIChpbnAtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJsY3B5KGlucC0+bmFtZSwgImNhbWVyYSIsIHNpemVvZihpbnAtPm5hbWUpKTsKKwlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICphKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqb2ZoID0gZmg7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gb2ZoLT5jYW07CisJaW50IHJ2YWw7CisKKwlydmFsID0gdmlkaW9jX2ludF9xdWVyeWN0cmwoY2FtLT5zZGV2LCBhKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmEpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlpbnQgcnZhbDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCXJ2YWwgPSB2aWRpb2NfaW50X2dfY3RybChjYW0tPnNkZXYsIGEpOworCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICphKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqb2ZoID0gZmg7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gb2ZoLT5jYW07CisJaW50IHJ2YWw7CisKKwltdXRleF9sb2NrKCZjYW0tPm11dGV4KTsKKwlydmFsID0gdmlkaW9jX2ludF9zX2N0cmwoY2FtLT5zZGV2LCBhKTsKKwltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkgeworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqb2ZoID0gZmg7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gb2ZoLT5jYW07CisJaW50IHJ2YWw7CisKKwlpZiAoYS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY2FtLT5tdXRleCk7CisJcnZhbCA9IHZpZGlvY19pbnRfZ19wYXJtKGNhbS0+c2RldiwgYSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpvZmggPSBmaDsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvZmgtPmNhbTsKKwlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIG9sZF9zdHJlYW1wYXJtOworCWludCBydmFsOworCisJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZykgeworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlvbGRfc3RyZWFtcGFybS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXJ2YWwgPSB2aWRpb2NfaW50X2dfcGFybShjYW0tPnNkZXYsICZvbGRfc3RyZWFtcGFybSk7CisJaWYgKHJ2YWwpCisJCWdvdG8gb3V0OworCisJcnZhbCA9IHZpZGlvY19pbnRfc19wYXJtKGNhbS0+c2RldiwgYSk7CisJaWYgKHJ2YWwpCisJCWdvdG8gb3V0OworCisJcnZhbCA9IG9tYXAyNHh4Y2FtX3NlbnNvcl9pZl9lbmFibGUoY2FtKTsKKwkvKgorCSAqIFJldmVydCB0byBvbGQgc3RyZWFtaW5nIHBhcmFtZXRlcnMgaWYgZW5hYmxpbmcgc2Vuc29yCisJICogaW50ZXJmYWNlIHdpdGggdGhlIG5ldyBvbmVzIGZhaWxlZC4KKwkgKi8KKwlpZiAocnZhbCkKKwkJdmlkaW9jX2ludF9zX3Bhcm0oY2FtLT5zZGV2LCAmb2xkX3N0cmVhbXBhcm0pOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCXJldHVybiBydmFsOworfQorCisvKgorICoKKyAqIEZpbGUgb3BlcmF0aW9ucy4KKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBvbWFwMjR4eGNhbV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gZmgtPmNhbTsKKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZyAhPSBmaWxlKSB7CisJCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisJCXJldHVybiBQT0xMRVJSOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCisJbXV0ZXhfbG9jaygmZmgtPnZicS52Yl9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZmgtPnZicS5zdHJlYW0pKSB7CisJCW11dGV4X3VubG9jaygmZmgtPnZicS52Yl9sb2NrKTsKKwkJcmV0dXJuIFBPTExFUlI7CisJfQorCXZiID0gbGlzdF9lbnRyeShmaC0+dmJxLnN0cmVhbS5uZXh0LCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBzdHJlYW0pOworCW11dGV4X3VubG9jaygmZmgtPnZicS52Yl9sb2NrKTsKKworCXBvbGxfd2FpdChmaWxlLCAmdmItPmRvbmUsIHdhaXQpOworCisJaWYgKHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IHZiLT5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwMjR4eGNhbV9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gZmgtPmNhbTsKKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZicSA9ICZmaC0+dmJxOworCXVuc2lnbmVkIGludCBmaXJzdCwgbGFzdCwgc2l6ZSwgaSwgajsKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZykgeworCQltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCW11dGV4X2xvY2soJnZicS0+dmJfbG9jayk7CisKKwkvKiBsb29rIGZvciBmaXJzdCBidWZmZXIgdG8gbWFwICovCisJZm9yIChmaXJzdCA9IDA7IGZpcnN0IDwgVklERU9fTUFYX0ZSQU1FOyBmaXJzdCsrKSB7CisJCWlmIChOVUxMID09IHZicS0+YnVmc1tmaXJzdF0pCisJCQljb250aW51ZTsKKwkJaWYgKFY0TDJfTUVNT1JZX01NQVAgIT0gdmJxLT5idWZzW2ZpcnN0XS0+bWVtb3J5KQorCQkJY29udGludWU7CisJCWlmICh2YnEtPmJ1ZnNbZmlyc3RdLT5ib2ZmID09ICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpKQorCQkJYnJlYWs7CisJfQorCisJLyogbG9vayBmb3IgbGFzdCBidWZmZXIgdG8gbWFwICovCisJZm9yIChzaXplID0gMCwgbGFzdCA9IGZpcnN0OyBsYXN0IDwgVklERU9fTUFYX0ZSQU1FOyBsYXN0KyspIHsKKwkJaWYgKE5VTEwgPT0gdmJxLT5idWZzW2xhc3RdKQorCQkJY29udGludWU7CisJCWlmIChWNEwyX01FTU9SWV9NTUFQICE9IHZicS0+YnVmc1tsYXN0XS0+bWVtb3J5KQorCQkJY29udGludWU7CisJCXNpemUgKz0gdmJxLT5idWZzW2xhc3RdLT5ic2l6ZTsKKwkJaWYgKHNpemUgPT0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCisJCQlicmVhazsKKwl9CisKKwlzaXplID0gMDsKKwlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZicS0+YnVmc1tpXSk7CisKKwkJZm9yIChqID0gMDsgaiA8IGRtYS0+c2dsZW47IGorKykgeworCQkJZXJyID0gcmVtYXBfcGZuX3JhbmdlKAorCQkJCXZtYSwgdm1hLT52bV9zdGFydCArIHNpemUsCisJCQkJcGFnZV90b19wZm4oc2dfcGFnZSgmZG1hLT5zZ2xpc3Rbal0pKSwKKwkJCQlzZ19kbWFfbGVuKCZkbWEtPnNnbGlzdFtqXSksIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQlzaXplICs9IHNnX2RtYV9sZW4oJmRtYS0+c2dsaXN0W2pdKTsKKwkJfQorCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdmJxLT52Yl9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcnZhbDsKKworCS8qIGxldCB0aGUgdmlkZW8tYnVmIG1hcHBlciBjaGVjayBhcmd1bWVudHMgYW5kIHNldC11cCBzdHJ1Y3R1cmVzICovCisJcnZhbCA9IHZpZGVvYnVmX21tYXBfbWFwcGVyKCZmaC0+dmJxLCB2bWEpOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwkvKiBkbyBtYXBwaW5nIHRvIG91ciBhbGxvY2F0ZWQgYnVmZmVycyAqLworCXJ2YWwgPSBvbWFwMjR4eGNhbV9tbWFwX2J1ZmZlcnMoZmlsZSwgdm1hKTsKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3IsIGZyZWUgdm1hLT52bV9wcml2YXRlX2RhdGEgYWxsb2NhdGVkIGJ5CisJICogdmlkZW9idWZfbW1hcF9tYXBwZXIuCisJICovCisJaWYgKHJ2YWwpCisJCWtmcmVlKHZtYS0+dm1fcHJpdmF0ZV9kYXRhKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBvbWFwMjR4eGNhbS5wcml2OworCXN0cnVjdCBvbWFwMjR4eGNhbV9maCAqZmg7CisJc3RydWN0IHY0bDJfZm9ybWF0IGZvcm1hdDsKKworCWlmICghY2FtIHx8ICFjYW0tPnZmZCB8fCAoY2FtLT52ZmQtPm1pbm9yICE9IG1pbm9yKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChmaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnNkZXYgPT0gTlVMTCB8fCAhdHJ5X21vZHVsZV9nZXQoY2FtLT5zZGV2LT5tb2R1bGUpKSB7CisJCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisJCWdvdG8gb3V0X3RyeV9tb2R1bGVfZ2V0OworCX0KKworCWlmIChhdG9taWNfaW5jX3JldHVybigmY2FtLT51c2VycykgPT0gMSkgeworCQlvbWFwMjR4eGNhbV9od2luaXQoY2FtKTsKKwkJaWYgKG9tYXAyNHh4Y2FtX3NlbnNvcl9lbmFibGUoY2FtKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKwkJCWdvdG8gb3V0X29tYXAyNHh4Y2FtX3NlbnNvcl9lbmFibGU7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCWZoLT5jYW0gPSBjYW07CisJbXV0ZXhfbG9jaygmY2FtLT5tdXRleCk7CisJdmlkaW9jX2ludF9nX2ZtdF9jYXAoY2FtLT5zZGV2LCAmZm9ybWF0KTsKKwltdXRleF91bmxvY2soJmNhbS0+bXV0ZXgpOworCS8qIEZJWE1FOiBob3cgYWJvdXQgZmgtPnBpeCB3aGVuIHRoZXJlIGFyZSBtb3JlIHVzZXJzPyAqLworCWZoLT5waXggPSBmb3JtYXQuZm10LnBpeDsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCisJc3Bpbl9sb2NrX2luaXQoJmZoLT52YnFfbG9jayk7CisKKwl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmJxLCAmb21hcDI0eHhjYW1fdmJxX29wcywgTlVMTCwKKwkJCQkmZmgtPnZicV9sb2NrLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkJVjRMMl9GSUVMRF9OT05FLAorCQkJCXNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgpOworCisJcmV0dXJuIDA7CisKK291dF9vbWFwMjR4eGNhbV9zZW5zb3JfZW5hYmxlOgorCW9tYXAyNHh4Y2FtX3Bvd2Vyb25fcmVzZXQoY2FtKTsKKwltb2R1bGVfcHV0KGNhbS0+c2Rldi0+bW9kdWxlKTsKKworb3V0X3RyeV9tb2R1bGVfZ2V0OgorCWtmcmVlKGZoKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBmaC0+Y2FtOworCisJYXRvbWljX2luYygmY2FtLT5yZXNldF9kaXNhYmxlKTsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkvKiBzdG9wIHN0cmVhbWluZyBjYXB0dXJlICovCisJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJxKTsKKworCW11dGV4X2xvY2soJmNhbS0+bXV0ZXgpOworCWlmIChjYW0tPnN0cmVhbWluZyA9PSBmaWxlKSB7CisJCWNhbS0+c3RyZWFtaW5nID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKwkJc3lzZnNfbm90aWZ5KCZjYW0tPmRldi0+a29iaiwgTlVMTCwgInN0cmVhbWluZyIpOworCX0gZWxzZSB7CisJCW11dGV4X3VubG9jaygmY2FtLT5tdXRleCk7CisJfQorCisJYXRvbWljX2RlYygmY2FtLT5yZXNldF9kaXNhYmxlKTsKKworCW9tYXAyNHh4Y2FtX3ZicV9mcmVlX21tYXBfYnVmZmVycygmZmgtPnZicSk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcmVzZXQgd29yayB3ZSBtaWdodCBoYXZlIHNjaGVkdWxlZCBpcyBub3QKKwkgKiBwZW5kaW5nISBJdCBtYXkgYmUgcnVuICpvbmx5KiBpZiB3ZSBoYXZlIHVzZXJzLiAoQW5kIGl0IG1heQorCSAqIG5vdCBiZSBzY2hlZHVsZWQgYW55bW9yZSBzaW5jZSBzdHJlYW1pbmcgaXMgYWxyZWFkeQorCSAqIGRpc2FibGVkLikKKwkgKi8KKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJbXV0ZXhfbG9jaygmY2FtLT5tdXRleCk7CisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZjYW0tPnVzZXJzKSA9PSAwKSB7CisJCW9tYXAyNHh4Y2FtX3NlbnNvcl9kaXNhYmxlKGNhbSk7CisJCW9tYXAyNHh4Y2FtX3Bvd2Vyb25fcmVzZXQoY2FtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjYW0tPm11dGV4KTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwltb2R1bGVfcHV0KGNhbS0+c2Rldi0+bW9kdWxlKTsKKwlrZnJlZShmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21hcDI0eHhjYW1fZm9wcyA9IHsKKwkubGxzZWVrCSA9IG5vX2xsc2VlaywKKwkuaW9jdGwJID0gdmlkZW9faW9jdGwyLAorCS5wb2xsCSA9IG9tYXAyNHh4Y2FtX3BvbGwsCisJLm1tYXAJID0gb21hcDI0eHhjYW1fbW1hcCwKKwkub3BlbgkgPSBvbWFwMjR4eGNhbV9vcGVuLAorCS5yZWxlYXNlID0gb21hcDI0eHhjYW1fcmVsZWFzZSwKK307CisKKy8qCisgKgorICogUG93ZXIgbWFuYWdlbWVudC4KKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBvbWFwMjR4eGNhbV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChhdG9taWNfcmVhZCgmY2FtLT51c2VycykgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWF0b21pY19yZWFkKCZjYW0tPnJlc2V0X2Rpc2FibGUpKQorCQlvbWFwMjR4eGNhbV9jYXB0dXJlX3N0b3AoY2FtKTsKKworCW9tYXAyNHh4Y2FtX3NlbnNvcl9kaXNhYmxlKGNhbSk7CisJb21hcDI0eHhjYW1fcG93ZXJvbl9yZXNldChjYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNhbS0+dXNlcnMpID09IDApCisJCXJldHVybiAwOworCisJb21hcDI0eHhjYW1faHdpbml0KGNhbSk7CisJb21hcDI0eHhjYW1fc2Vuc29yX2VuYWJsZShjYW0pOworCisJaWYgKCFhdG9taWNfcmVhZCgmY2FtLT5yZXNldF9kaXNhYmxlKSkKKwkJb21hcDI0eHhjYW1fY2FwdHVyZV9jb250KGNhbSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBvbWFwMjR4eGNhbV9pb2N0bF9mb3BzID0geworCS52aWRpb2NfcXVlcnljYXAJPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwCT0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwCT0gdmlkaW9jX2dfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwCT0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2NfcmVxYnVmcwkJPSB2aWRpb2NfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCT0gdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZgkJPSB2aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmCQk9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCT0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmCT0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX2VudW1faW5wdXQJPSB2aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQJCT0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0CQk9IHZpZGlvY19zX2lucHV0LAorCS52aWRpb2NfcXVlcnljdHJsCT0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybAkJPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQk9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX3Bhcm0JCT0gdmlkaW9jX2dfcGFybSwKKwkudmlkaW9jX3NfcGFybQkJPSB2aWRpb2Nfc19wYXJtLAorfTsKKworLyoKKyAqCisgKiBDYW1lcmEgZGV2aWNlIChpLmUuIC9kZXYvdmlkZW8pLgorICoKKyAqLworCitzdGF0aWMgaW50IG9tYXAyNHh4Y2FtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IHMtPnUuc2xhdmUtPm1hc3Rlci0+cHJpdjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CisJaW50IHJ2YWw7CisKKwkvKiBXZSBhbHJlYWR5IGhhdmUgYSBzbGF2ZS4gKi8KKwlpZiAoY2FtLT5zZGV2KQorCQlyZXR1cm4gLUVCVVNZOworCisJY2FtLT5zZGV2ID0gczsKKworCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoY2FtLT5kZXYsICZkZXZfYXR0cl9zdHJlYW1pbmcpICE9IDApIHsKKwkJZGV2X2VycihjYW0tPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBzeXNmcyBlbnRyeVxuIik7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGluaXRpYWxpemUgdGhlIHZpZGVvX2RldmljZSBzdHJ1Y3QgKi8KKwl2ZmQgPSBjYW0tPnZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghdmZkKSB7CisJCWRldl9lcnIoY2FtLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gZGV2aWNlIHN0cnVjdFxuIik7CisJCXJ2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisKKwl2ZmQtPnBhcmVudCA9IGNhbS0+ZGV2OworCisJc3RybGNweSh2ZmQtPm5hbWUsIENBTV9OQU1FLCBzaXplb2YodmZkLT5uYW1lKSk7CisJdmZkLT52ZmxfdHlwZQkJID0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX0NIUk9NQUtFWTsKKwl2ZmQtPmZvcHMJCSA9ICZvbWFwMjR4eGNhbV9mb3BzOworCXZmZC0+bWlub3IJCSA9IC0xOworCXZmZC0+aW9jdGxfb3BzCQkgPSAmb21hcDI0eHhjYW1faW9jdGxfZm9wczsKKworCW9tYXAyNHh4Y2FtX2h3aW5pdChjYW0pOworCisJcnZhbCA9IG9tYXAyNHh4Y2FtX3NlbnNvcl9pbml0KGNhbSk7CisJaWYgKHJ2YWwpCisJCWdvdG8gZXJyOworCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA8IDApIHsKKwkJZGV2X2VycihjYW0tPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBWNEwgZGV2aWNlXG4iKTsKKwkJdmZkLT5taW5vciA9IC0xOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisKKwlvbWFwMjR4eGNhbV9wb3dlcm9uX3Jlc2V0KGNhbSk7CisKKwlkZXZfaW5mbyhjYW0tPmRldiwgInJlZ2lzdGVyZWQgZGV2aWNlIHZpZGVvJWRcbiIsIHZmZC0+bWlub3IpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlvbWFwMjR4eGNhbV9kZXZpY2VfdW5yZWdpc3RlcihzKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgdm9pZCBvbWFwMjR4eGNhbV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzKQoreworCXN0cnVjdCBvbWFwMjR4eGNhbV9kZXZpY2UgKmNhbSA9IHMtPnUuc2xhdmUtPm1hc3Rlci0+cHJpdjsKKworCW9tYXAyNHh4Y2FtX3NlbnNvcl9leGl0KGNhbSk7CisKKwlpZiAoY2FtLT52ZmQpIHsKKwkJaWYgKGNhbS0+dmZkLT5taW5vciA9PSAtMSkgeworCQkJLyoKKwkJCSAqIFRoZSBkZXZpY2Ugd2FzIG5ldmVyIHJlZ2lzdGVyZWQsIHNvIHJlbGVhc2UgdGhlCisJCQkgKiB2aWRlb19kZXZpY2Ugc3RydWN0IGRpcmVjdGx5LgorCQkJICovCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShjYW0tPnZmZCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIHVucmVnaXN0ZXIgZnVuY3Rpb24gd2lsbCByZWxlYXNlIHRoZQorCQkJICogdmlkZW9fZGV2aWNlIHN0cnVjdCBhcyB3ZWxsIGFzCisJCQkgKiB1bnJlZ2lzdGVyaW5nIGl0LgorCQkJICovCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnZmZCk7CisJCX0KKwkJY2FtLT52ZmQgPSBOVUxMOworCX0KKworCWRldmljZV9yZW1vdmVfZmlsZShjYW0tPmRldiwgJmRldl9hdHRyX3N0cmVhbWluZyk7CisKKwljYW0tPnNkZXYgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfaW50X21hc3RlciBvbWFwMjR4eGNhbV9tYXN0ZXIgPSB7CisJLmF0dGFjaCA9IG9tYXAyNHh4Y2FtX2RldmljZV9yZWdpc3RlciwKKwkuZGV0YWNoID0gb21hcDI0eHhjYW1fZGV2aWNlX3VucmVnaXN0ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfaW50X2RldmljZSBvbWFwMjR4eGNhbSA9IHsKKwkubW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJPSBDQU1fTkFNRSwKKwkudHlwZQk9IHY0bDJfaW50X3R5cGVfbWFzdGVyLAorCS51CT0geworCQkubWFzdGVyID0gJm9tYXAyNHh4Y2FtX21hc3RlcgorCX0sCit9OworCisvKgorICoKKyAqIERyaXZlciBpbml0aWFsaXNhdGlvbiBhbmQgZGVpbml0aWFsaXNhdGlvbi4KKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgb21hcDI0eHhjYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW07CisJc3RydWN0IHJlc291cmNlICptZW07CisJaW50IGlycTsKKworCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKCpjYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FtKTsKKworCWNhbS0+ZGV2ID0gJnBkZXYtPmRldjsKKworCS8qCisJICogSW1wb3NlIGEgbG93ZXIgbGltaXQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIGZvcgorCSAqIGNhcHR1cmUuIFdlIHJlcXVpcmUgYXQgbGVhc3QgZW5vdWdoIG1lbW9yeSB0byBkb3VibGUtYnVmZmVyCisJICogUVZHQSAoMzAwS0IpLgorCSAqLworCWlmIChjYXB0dXJlX21lbSA8IDMyMCAqIDI0MCAqIDIgKiAyKQorCQljYXB0dXJlX21lbSA9IDMyMCAqIDI0MCAqIDIgKiAyOworCWNhbS0+Y2FwdHVyZV9tZW0gPSBjYXB0dXJlX21lbTsKKworCS8qIHJlcXVlc3QgdGhlIG1lbSByZWdpb24gZm9yIHRoZSBjYW1lcmEgcmVnaXN0ZXJzICovCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlkZXZfZXJyKGNhbS0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCAobWVtLT5lbmQgLSBtZW0tPnN0YXJ0KSArIDEsCisJCQkJcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycihjYW0tPmRldiwKKwkJCSJjYW5ub3QgcmVzZXJ2ZSBjYW1lcmEgcmVnaXN0ZXIgSS9PIHJlZ2lvblxuIik7CisJCWdvdG8gZXJyOworCX0KKwljYW0tPm1taW9fYmFzZV9waHlzID0gbWVtLT5zdGFydDsKKwljYW0tPm1taW9fc2l6ZSA9IChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMTsKKworCS8qIG1hcCB0aGUgcmVnaW9uICovCisJY2FtLT5tbWlvX2Jhc2UgPSAodW5zaWduZWQgbG9uZykKKwkJaW9yZW1hcF9ub2NhY2hlKGNhbS0+bW1pb19iYXNlX3BoeXMsIGNhbS0+bW1pb19zaXplKTsKKwlpZiAoIWNhbS0+bW1pb19iYXNlKSB7CisJCWRldl9lcnIoY2FtLT5kZXYsICJjYW5ub3QgbWFwIGNhbWVyYSByZWdpc3RlciBJL08gcmVnaW9uXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApIHsKKwkJZGV2X2VycihjYW0tPmRldiwgIm5vIGlycSBmb3IgY2FtZXJhP1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGluc3RhbGwgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBvbWFwMjR4eGNhbV9pc3IsIDAsIENBTV9OQU1FLCBjYW0pKSB7CisJCWRldl9lcnIoY2FtLT5kZXYsCisJCQkiY291bGQgbm90IGluc3RhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZVxuIik7CisJCWdvdG8gZXJyOworCX0KKwljYW0tPmlycSA9IGlycTsKKworCWlmIChvbWFwMjR4eGNhbV9jbG9ja19nZXQoY2FtKSkKKwkJZ290byBlcnI7CisKKwlJTklUX1dPUksoJmNhbS0+c2Vuc29yX3Jlc2V0X3dvcmssIG9tYXAyNHh4Y2FtX3NlbnNvcl9yZXNldF93b3JrKTsKKworCW11dGV4X2luaXQoJmNhbS0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZjYW0tPmNvcmVfZW5hYmxlX2Rpc2FibGVfbG9jayk7CisKKwlvbWFwMjR4eGNhbV9zZ2RtYV9pbml0KCZjYW0tPnNnZG1hLAorCQkJICAgICAgIGNhbS0+bW1pb19iYXNlICsgQ0FNRE1BX1JFR19PRkZTRVQsCisJCQkgICAgICAgb21hcDI0eHhjYW1fc3RhbGxlZF9kbWFfcmVzZXQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2FtKTsKKworCW9tYXAyNHh4Y2FtLnByaXYgPSBjYW07CisKKwlpZiAodjRsMl9pbnRfZGV2aWNlX3JlZ2lzdGVyKCZvbWFwMjR4eGNhbSkpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlvbWFwMjR4eGNhbV9yZW1vdmUocGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgb21hcDI0eHhjYW1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXAyNHh4Y2FtX2RldmljZSAqY2FtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWNhbSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob21hcDI0eHhjYW0ucHJpdiAhPSBOVUxMKQorCQl2NGwyX2ludF9kZXZpY2VfdW5yZWdpc3Rlcigmb21hcDI0eHhjYW0pOworCW9tYXAyNHh4Y2FtLnByaXYgPSBOVUxMOworCisJb21hcDI0eHhjYW1fY2xvY2tfcHV0KGNhbSk7CisKKwlpZiAoY2FtLT5pcnEpIHsKKwkJZnJlZV9pcnEoY2FtLT5pcnEsIGNhbSk7CisJCWNhbS0+aXJxID0gMDsKKwl9CisKKwlpZiAoY2FtLT5tbWlvX2Jhc2UpIHsKKwkJaW91bm1hcCgodm9pZCAqKWNhbS0+bW1pb19iYXNlKTsKKwkJY2FtLT5tbWlvX2Jhc2UgPSAwOworCX0KKworCWlmIChjYW0tPm1taW9fYmFzZV9waHlzKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYW0tPm1taW9fYmFzZV9waHlzLCBjYW0tPm1taW9fc2l6ZSk7CisJCWNhbS0+bW1pb19iYXNlX3BoeXMgPSAwOworCX0KKworCWtmcmVlKGNhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDI0eHhjYW1fZHJpdmVyID0geworCS5wcm9iZQkgPSBvbWFwMjR4eGNhbV9wcm9iZSwKKwkucmVtb3ZlCSA9IG9tYXAyNHh4Y2FtX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IG9tYXAyNHh4Y2FtX3N1c3BlbmQsCisJLnJlc3VtZQkgPSBvbWFwMjR4eGNhbV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyCSA9IHsKKwkJLm5hbWUgPSBDQU1fTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKy8qCisgKgorICogTW9kdWxlIGluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyNHh4Y2FtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwMjR4eGNhbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcDI0eHhjYW1fY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwMjR4eGNhbV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bub2tpYS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAyNHh4IFZpZGVvIGZvciBMaW51eCBjYW1lcmEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLAorCQkgIk1pbm9yIG51bWJlciBmb3IgdmlkZW8gZGV2aWNlICgtMSA9PT4gYXV0byBhc3NpZ24pIik7Cittb2R1bGVfcGFyYW0oY2FwdHVyZV9tZW0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhcHR1cmVfbWVtLCAiTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGZvciBjYXB0dXJlICIKKwkJICJidWZmZXJzIChkZWZhdWx0IDQ4MDBraUIpIik7CisKK21vZHVsZV9pbml0KG9tYXAyNHh4Y2FtX2luaXQpOworbW9kdWxlX2V4aXQob21hcDI0eHhjYW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlNjdmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uaApAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIGRyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogQ29udGFjdDogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbm9raWEuY29tPgorICoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBBbmR5IExvd2UgPHNvdXJjZUBtdmlzdGEuY29tPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBPTUFQMjRYWENBTV9ICisjZGVmaW5lIE9NQVAyNFhYQ0FNX0gKKworI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW50LWRldmljZS5oPgorCisvKgorICoKKyAqIEdlbmVyYWwgZHJpdmVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCisgKgorICovCisKKyNkZWZpbmUgQ0FNX05BTUUJCQkJIm9tYXAyNHh4Y2FtIgorCisjZGVmaW5lIENBTV9NQ0xLCQkJCTk2MDAwMDAwCisKKy8qIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBwZXIgRE1BIHJlcXVlc3QgKi8KKyNkZWZpbmUgRE1BX1RIUkVTSE9MRAkJCQkzMgorCisvKgorICogTlVNX0NBTURNQV9DSEFOTkVMUyBpcyB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgY2hhbm5lbHMgcHJvdmlkZWQgYnkKKyAqIHRoZSBjYW1lcmEgRE1BIGNvbnRyb2xsZXIuCisgKi8KKyNkZWZpbmUgTlVNX0NBTURNQV9DSEFOTkVMUwkJCTQKKworLyoKKyAqIE5VTV9TR19ETUEgaXMgdGhlIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBETUEgdHJhbnNmZXJzIHRoYXQgY2FuCisgKiBiZSBxdWV1ZWQuIChXZSBkb24ndCBoYXZlIGFueSBvdmVybGF5IHNnbGlzdHMgbm93LikKKyAqLworI2RlZmluZSBOVU1fU0dfRE1BCQkJCShWSURFT19NQVhfRlJBTUUpCisKKy8qCisgKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKgorICovCisKKy8qIHN1YnN5c3RlbSByZWdpc3RlciBibG9jayBvZmZzZXRzICovCisjZGVmaW5lIENDX1JFR19PRkZTRVQJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBDQU1ETUFfUkVHX09GRlNFVAkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgQ0FNTU1VX1JFR19PRkZTRVQJCQkweDAwMDAwQzAwCisKKy8qIGRlZmluZSBjYW1lcmEgc3Vic3lzdGVtIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQ0FNX1JFVklTSU9OCQkJCTB4MDAwCisjZGVmaW5lIENBTV9TWVNDT05GSUcJCQkJMHgwMTAKKyNkZWZpbmUgQ0FNX1NZU1NUQVRVUwkJCQkweDAxNAorI2RlZmluZSBDQU1fSVJRU1RBVFVTCQkJCTB4MDE4CisjZGVmaW5lIENBTV9HUE8JCQkJCTB4MDQwCisjZGVmaW5lIENBTV9HUEkJCQkJCTB4MDUwCisKKy8qIGRlZmluZSBjYW1lcmEgY29yZSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIENDX1JFVklTSU9OCQkJCTB4MDAwCisjZGVmaW5lIENDX1NZU0NPTkZJRwkJCQkweDAxMAorI2RlZmluZSBDQ19TWVNTVEFUVVMJCQkJMHgwMTQKKyNkZWZpbmUgQ0NfSVJRU1RBVFVTCQkJCTB4MDE4CisjZGVmaW5lIENDX0lSUUVOQUJMRQkJCQkweDAxQworI2RlZmluZSBDQ19DVFJMCQkJCQkweDA0MAorI2RlZmluZSBDQ19DVFJMX0RNQQkJCQkweDA0NAorI2RlZmluZSBDQ19DVFJMX1hDTEsJCQkJMHgwNDgKKyNkZWZpbmUgQ0NfRklGT0RBVEEJCQkJMHgwNEMKKyNkZWZpbmUgQ0NfVEVTVAkJCQkJMHgwNTAKKyNkZWZpbmUgQ0NfR0VOUEFSCQkJCTB4MDU0CisjZGVmaW5lIENDX0NDUEZTQ1IJCQkJMHgwNTgKKyNkZWZpbmUgQ0NfQ0NQRkVDUgkJCQkweDA1QworI2RlZmluZSBDQ19DQ1BMU0NSCQkJCTB4MDYwCisjZGVmaW5lIENDX0NDUExFQ1IJCQkJMHgwNjQKKyNkZWZpbmUgQ0NfQ0NQREZSCQkJCTB4MDY4CisKKy8qIGRlZmluZSBjYW1lcmEgZG1hIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQ0FNRE1BX1JFVklTSU9OCQkJCTB4MDAwCisjZGVmaW5lIENBTURNQV9JUlFTVEFUVVNfTDAJCQkweDAwOAorI2RlZmluZSBDQU1ETUFfSVJRU1RBVFVTX0wxCQkJMHgwMEMKKyNkZWZpbmUgQ0FNRE1BX0lSUVNUQVRVU19MMgkJCTB4MDEwCisjZGVmaW5lIENBTURNQV9JUlFTVEFUVVNfTDMJCQkweDAxNAorI2RlZmluZSBDQU1ETUFfSVJRRU5BQkxFX0wwCQkJMHgwMTgKKyNkZWZpbmUgQ0FNRE1BX0lSUUVOQUJMRV9MMQkJCTB4MDFDCisjZGVmaW5lIENBTURNQV9JUlFFTkFCTEVfTDIJCQkweDAyMAorI2RlZmluZSBDQU1ETUFfSVJRRU5BQkxFX0wzCQkJMHgwMjQKKyNkZWZpbmUgQ0FNRE1BX1NZU1NUQVRVUwkJCTB4MDI4CisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHCQkJMHgwMkMKKyNkZWZpbmUgQ0FNRE1BX0NBUFNfMAkJCQkweDA2NAorI2RlZmluZSBDQU1ETUFfQ0FQU18yCQkJCTB4MDZDCisjZGVmaW5lIENBTURNQV9DQVBTXzMJCQkJMHgwNzAKKyNkZWZpbmUgQ0FNRE1BX0NBUFNfNAkJCQkweDA3NAorI2RlZmluZSBDQU1ETUFfR0NSCQkJCTB4MDc4CisjZGVmaW5lIENBTURNQV9DQ1IobikJCQkJKDB4MDgwICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DTE5LX0NUUkwobikJCQkoMHgwODQgKyAobikqMHg2MCkKKyNkZWZpbmUgQ0FNRE1BX0NJQ1IobikJCQkJKDB4MDg4ICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DU1IobikJCQkJKDB4MDhDICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DU0RQKG4pCQkJCSgweDA5MCArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ0VOKG4pCQkJCSgweDA5NCArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ0ZOKG4pCQkJCSgweDA5OCArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ1NTQShuKQkJCQkoMHgwOUMgKyAobikqMHg2MCkKKyNkZWZpbmUgQ0FNRE1BX0NEU0EobikJCQkJKDB4MEEwICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DU0VJKG4pCQkJCSgweDBBNCArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ1NGSShuKQkJCQkoMHgwQTggKyAobikqMHg2MCkKKyNkZWZpbmUgQ0FNRE1BX0NERUkobikJCQkJKDB4MEFDICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DREZJKG4pCQkJCSgweDBCMCArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ1NBQyhuKQkJCQkoMHgwQjQgKyAobikqMHg2MCkKKyNkZWZpbmUgQ0FNRE1BX0NEQUMobikJCQkJKDB4MEI4ICsgKG4pKjB4NjApCisjZGVmaW5lIENBTURNQV9DQ0VOKG4pCQkJCSgweDBCQyArIChuKSoweDYwKQorI2RlZmluZSBDQU1ETUFfQ0NGTihuKQkJCQkoMHgwQzAgKyAobikqMHg2MCkKKyNkZWZpbmUgQ0FNRE1BX0NPTE9SKG4pCQkJCSgweDBDNCArIChuKSoweDYwKQorCisvKiBkZWZpbmUgY2FtZXJhIG1tdSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIENBTU1NVV9SRVZJU0lPTgkJCQkweDAwMAorI2RlZmluZSBDQU1NTVVfU1lTQ09ORklHCQkJMHgwMTAKKyNkZWZpbmUgQ0FNTU1VX1NZU1NUQVRVUwkJCTB4MDE0CisjZGVmaW5lIENBTU1NVV9JUlFTVEFUVVMJCQkweDAxOAorI2RlZmluZSBDQU1NTVVfSVJRRU5BQkxFCQkJMHgwMUMKKyNkZWZpbmUgQ0FNTU1VX1dBTEtJTkdfU1QJCQkweDA0MAorI2RlZmluZSBDQU1NTVVfQ05UTAkJCQkweDA0NAorI2RlZmluZSBDQU1NTVVfRkFVTFRfQUQJCQkJMHgwNDgKKyNkZWZpbmUgQ0FNTU1VX1RUQgkJCQkweDA0QworI2RlZmluZSBDQU1NTVVfTE9DSwkJCQkweDA1MAorI2RlZmluZSBDQU1NTVVfTERfVExCCQkJCTB4MDU0CisjZGVmaW5lIENBTU1NVV9DQU0JCQkJMHgwNTgKKyNkZWZpbmUgQ0FNTU1VX1JBTQkJCQkweDA1QworI2RlZmluZSBDQU1NTVVfR0ZMVVNICQkJCTB4MDYwCisjZGVmaW5lIENBTU1NVV9GTFVTSF9FTlRSWQkJCTB4MDY0CisjZGVmaW5lIENBTU1NVV9SRUFEX0NBTQkJCQkweDA2OAorI2RlZmluZSBDQU1NTVVfUkVBRF9SQU0JCQkJMHgwNkMKKyNkZWZpbmUgQ0FNTU1VX0VNVV9GQVVMVF9BRAkJCTB4MDcwCisKKy8qIERlZmluZSBiaXQgZmllbGRzIHdpdGhpbiBzZWxlY3RlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0FNX1JFVklTSU9OX01BSk9SCQkJKDE1IDw8IDQpCisjZGVmaW5lIENBTV9SRVZJU0lPTl9NQUpPUl9TSElGVAkJNAorI2RlZmluZSBDQU1fUkVWSVNJT05fTUlOT1IJCQkoMTUgPDwgMCkKKyNkZWZpbmUgQ0FNX1JFVklTSU9OX01JTk9SX1NISUZUCQkwCisKKyNkZWZpbmUgQ0FNX1NZU0NPTkZJR19TT0ZUUkVTRVQJCQkoMSA8PCAgMSkKKyNkZWZpbmUgQ0FNX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8ICAwKQorCisjZGVmaW5lIENBTV9TWVNTVEFUVVNfUkVTRVRET05FCQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0FNX0lSUVNUQVRVU19DQ19JUlEJCQkoMSA8PCAgNCkKKyNkZWZpbmUgQ0FNX0lSUVNUQVRVU19NTVVfSVJRCQkJKDEgPDwgIDMpCisjZGVmaW5lIENBTV9JUlFTVEFUVVNfRE1BX0lSUTIJCQkoMSA8PCAgMikKKyNkZWZpbmUgQ0FNX0lSUVNUQVRVU19ETUFfSVJRMQkJCSgxIDw8ICAxKQorI2RlZmluZSBDQU1fSVJRU1RBVFVTX0RNQV9JUlEwCQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0FNX0dQT19DQU1fU19QX0VOCQkJKDEgPDwgIDEpCisjZGVmaW5lIENBTV9HUE9fQ0FNX0NDUF9NT0RFCQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0FNX0dQSV9DQ19ETUFfUkVRMQkJCSgxIDw8IDI0KQorI2RlZmluZSBDQVBfR1BJX0NDX0RNQV9SRVEwCQkJKDEgPDwgMjMpCisjZGVmaW5lIENBUF9HUElfQ0FNX01TVEFOREJZCQkJKDEgPDwgMjEpCisjZGVmaW5lIENBUF9HUElfQ0FNX1dBSVQJCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ0FQX0dQSV9DQU1fU19EQVRBCQkJKDEgPDwgMTcpCisjZGVmaW5lIENBUF9HUElfQ0FNX1NfQ0xLCQkJKDEgPDwgMTYpCisjZGVmaW5lIENBUF9HUElfQ0FNX1BfREFUQQkJCSgweEZGRiA8PCAzKQorI2RlZmluZSBDQVBfR1BJX0NBTV9QX0RBVEFfU0hJRlQJCTMKKyNkZWZpbmUgQ0FQX0dQSV9DQU1fUF9WUwkJCSgxIDw8ICAyKQorI2RlZmluZSBDQVBfR1BJX0NBTV9QX0hTCQkJKDEgPDwgIDEpCisjZGVmaW5lIENBUF9HUElfQ0FNX1BfQ0xLCQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0NfUkVWSVNJT05fTUFKT1IJCQkoMTUgPDwgNCkKKyNkZWZpbmUgQ0NfUkVWSVNJT05fTUFKT1JfU0hJRlQJCQk0CisjZGVmaW5lIENDX1JFVklTSU9OX01JTk9SCQkJKDE1IDw8IDApCisjZGVmaW5lIENDX1JFVklTSU9OX01JTk9SX1NISUZUCQkJMAorCisjZGVmaW5lIENDX1NZU0NPTkZJR19TSURMRU1PREUJCQkoMyA8PCAgMykKKyNkZWZpbmUgQ0NfU1lTQ09ORklHX1NJRExFTU9ERV9GSURMRQkJKDAgPDwgIDMpCisjZGVmaW5lIENDX1NZU0NPTkZJR19TSURMRU1PREVfTklETEUJCSgxIDw8ICAzKQorI2RlZmluZSBDQ19TWVNDT05GSUdfU09GVFJFU0VUCQkJKDEgPDwgIDEpCisjZGVmaW5lIENDX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8ICAwKQorCisjZGVmaW5lIENDX1NZU1NUQVRVU19SRVNFVERPTkUJCQkoMSA8PCAgMCkKKworI2RlZmluZSBDQ19JUlFTVEFUVVNfRlNfSVJRCQkJKDEgPDwgMTkpCisjZGVmaW5lIENDX0lSUVNUQVRVU19MRV9JUlEJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0NfSVJRU1RBVFVTX0xTX0lSUQkJCSgxIDw8IDE3KQorI2RlZmluZSBDQ19JUlFTVEFUVVNfRkVfSVJRCQkJKDEgPDwgMTYpCisjZGVmaW5lIENDX0lSUVNUQVRVU19GV19FUlJfSVJRCQkJKDEgPDwgMTApCisjZGVmaW5lIENDX0lSUVNUQVRVU19GU0NfRVJSX0lSUQkJKDEgPDwgIDkpCisjZGVmaW5lIENDX0lSUVNUQVRVU19TU0NfRVJSX0lSUQkJKDEgPDwgIDgpCisjZGVmaW5lIENDX0lSUVNUQVRVU19GSUZPX05PRU1QVFlfSVJRCQkoMSA8PCAgNCkKKyNkZWZpbmUgQ0NfSVJRU1RBVFVTX0ZJRk9fRlVMTF9JUlEJCSgxIDw8ICAzKQorI2RlZmluZSBDQ19JUlFTVEFUVVNfRklGT19USFJfSVJRCQkoMSA8PCAgMikKKyNkZWZpbmUgQ0NfSVJRU1RBVFVTX0ZJRk9fT0ZfSVJRCQkoMSA8PCAgMSkKKyNkZWZpbmUgQ0NfSVJRU1RBVFVTX0ZJRk9fVUZfSVJRCQkoMSA8PCAgMCkKKworI2RlZmluZSBDQ19JUlFFTkFCTEVfRlNfSVJRCQkJKDEgPDwgMTkpCisjZGVmaW5lIENDX0lSUUVOQUJMRV9MRV9JUlEJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0NfSVJRRU5BQkxFX0xTX0lSUQkJCSgxIDw8IDE3KQorI2RlZmluZSBDQ19JUlFFTkFCTEVfRkVfSVJRCQkJKDEgPDwgMTYpCisjZGVmaW5lIENDX0lSUUVOQUJMRV9GV19FUlJfSVJRCQkJKDEgPDwgMTApCisjZGVmaW5lIENDX0lSUUVOQUJMRV9GU0NfRVJSX0lSUQkJKDEgPDwgIDkpCisjZGVmaW5lIENDX0lSUUVOQUJMRV9TU0NfRVJSX0lSUQkJKDEgPDwgIDgpCisjZGVmaW5lIENDX0lSUUVOQUJMRV9GSUZPX05PRU1QVFlfSVJRCQkoMSA8PCAgNCkKKyNkZWZpbmUgQ0NfSVJRRU5BQkxFX0ZJRk9fRlVMTF9JUlEJCSgxIDw8ICAzKQorI2RlZmluZSBDQ19JUlFFTkFCTEVfRklGT19USFJfSVJRCQkoMSA8PCAgMikKKyNkZWZpbmUgQ0NfSVJRRU5BQkxFX0ZJRk9fT0ZfSVJRCQkoMSA8PCAgMSkKKyNkZWZpbmUgQ0NfSVJRRU5BQkxFX0ZJRk9fVUZfSVJRCQkoMSA8PCAgMCkKKworI2RlZmluZSBDQ19DVFJMX0NDX09ORV9TSE9UCQkJKDEgPDwgMjApCisjZGVmaW5lIENDX0NUUkxfQ0NfSUZfU1lOQ0hSTwkJCSgxIDw8IDE5KQorI2RlZmluZSBDQ19DVFJMX0NDX1JTVAkJCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0NfQ1RSTF9DQ19GUkFNRV9UUklHCQkJKDEgPDwgMTcpCisjZGVmaW5lIENDX0NUUkxfQ0NfRU4JCQkJKDEgPDwgMTYpCisjZGVmaW5lIENDX0NUUkxfTk9CVF9TWU5DSFJPCQkJKDEgPDwgMTMpCisjZGVmaW5lIENDX0NUUkxfQlRfQ09SUkVDVAkJCSgxIDw8IDEyKQorI2RlZmluZSBDQ19DVFJMX1BBUl9PUkRFUkNBTQkJCSgxIDw8IDExKQorI2RlZmluZSBDQ19DVFJMX1BBUl9DTEtfUE9MCQkJKDEgPDwgMTApCisjZGVmaW5lIENDX0NUUkxfTk9CVF9IU19QT0wJCQkoMSA8PCAgOSkKKyNkZWZpbmUgQ0NfQ1RSTF9OT0JUX1ZTX1BPTAkJCSgxIDw8ICA4KQorI2RlZmluZSBDQ19DVFJMX1BBUl9NT0RFCQkJKDcgPDwgIDEpCisjZGVmaW5lIENDX0NUUkxfUEFSX01PREVfU0hJRlQJCQkxCisjZGVmaW5lIENDX0NUUkxfUEFSX01PREVfTk9CVDgJCQkoMCA8PCAgMSkKKyNkZWZpbmUgQ0NfQ1RSTF9QQVJfTU9ERV9OT0JUMTAJCQkoMSA8PCAgMSkKKyNkZWZpbmUgQ0NfQ1RSTF9QQVJfTU9ERV9OT0JUMTIJCQkoMiA8PCAgMSkKKyNkZWZpbmUgQ0NfQ1RSTF9QQVJfTU9ERV9CVDgJCQkoNCA8PCAgMSkKKyNkZWZpbmUgQ0NfQ1RSTF9QQVJfTU9ERV9CVDEwCQkJKDUgPDwgIDEpCisjZGVmaW5lIENDX0NUUkxfUEFSX01PREVfRklGT1RFU1QJCSg3IDw8ICAxKQorI2RlZmluZSBDQ19DVFJMX0NDUF9NT0RFCQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0NfQ1RSTF9ETUFfRU4JCQkJKDEgPDwgIDgpCisjZGVmaW5lIENDX0NUUkxfRE1BX0ZJRk9fVEhSRVNIT0xECQkoMHg3RiA8PCAwKQorI2RlZmluZSBDQ19DVFJMX0RNQV9GSUZPX1RIUkVTSE9MRF9TSElGVAkwCisKKyNkZWZpbmUgQ0NfQ1RSTF9YQ0xLX0RJVgkJCSgweDFGIDw8IDApCisjZGVmaW5lIENDX0NUUkxfWENMS19ESVZfU0hJRlQJCQkwCisjZGVmaW5lIENDX0NUUkxfWENMS19ESVZfU1RBQkxFX0xPVwkJKDAgPDwgIDApCisjZGVmaW5lIENDX0NUUkxfWENMS19ESVZfU1RBQkxFX0hJR0gJCSgxIDw8ICAwKQorI2RlZmluZSBDQ19DVFJMX1hDTEtfRElWX0JZUEFTUwkJCSgzMSA8PCAwKQorCisjZGVmaW5lIENDX1RFU1RfRklGT19SRF9QT0lOVEVSCQkJKDB4RkYgPDwgMjQpCisjZGVmaW5lIENDX1RFU1RfRklGT19SRF9QT0lOVEVSX1NISUZUCQkyNAorI2RlZmluZSBDQ19URVNUX0ZJRk9fV1JfUE9JTlRFUgkJCSgweEZGIDw8IDE2KQorI2RlZmluZSBDQ19URVNUX0ZJRk9fV1JfUE9JTlRFUl9TSElGVAkJMTYKKyNkZWZpbmUgQ0NfVEVTVF9GSUZPX0xFVkVMCQkJKDB4RkYgPDwgIDgpCisjZGVmaW5lIENDX1RFU1RfRklGT19MRVZFTF9TSElGVAkJOAorI2RlZmluZSBDQ19URVNUX0ZJRk9fTEVWRUxfUEVBSwkJCSgweEZGIDw8ICAwKQorI2RlZmluZSBDQ19URVNUX0ZJRk9fTEVWRUxfUEVBS19TSElGVAkJMAorCisjZGVmaW5lIENDX0dFTlBBUl9GSUZPX0RFUFRICQkJKDcgPDwgIDApCisjZGVmaW5lIENDX0dFTlBBUl9GSUZPX0RFUFRIX1NISUZUCQkwCisKKyNkZWZpbmUgQ0NfQ0NQREZSX0FMUEhBCQkJCSgweEZGIDw8ICA4KQorI2RlZmluZSBDQ19DQ1BERlJfQUxQSEFfU0hJRlQJCQk4CisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUCQkJKDE1IDw8ICAwKQorI2RlZmluZSBDQ19DQ1BERlJfREFUQUZPUk1BVF9TSElGVAkJMAorI2RlZmluZSBDQ19DQ1BERlJfREFUQUZPUk1BVF9ZVVY0MjJCRQkJKDAgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1lVVjQyMgkJKDEgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1lVVjQyMAkJKDIgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1JHQjQ0NAkJKDQgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1JHQjU2NQkJKDUgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1JHQjg4OE5ERQkJKDYgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1JHQjg4OAkJKDcgPDwgIDApCisjZGVmaW5lIENDX0NDUERGUl9EQVRBRk9STUFUX1JBVzhOREUJCSg4IDw8ICAwKQorI2RlZmluZSBDQ19DQ1BERlJfREFUQUZPUk1BVF9SQVc4CQkoOSA8PCAgMCkKKyNkZWZpbmUgQ0NfQ0NQREZSX0RBVEFGT1JNQVRfUkFXMTBOREUJCSgxMCA8PCAgMCkKKyNkZWZpbmUgQ0NfQ0NQREZSX0RBVEFGT1JNQVRfUkFXMTAJCSgxMSA8PCAgMCkKKyNkZWZpbmUgQ0NfQ0NQREZSX0RBVEFGT1JNQVRfUkFXMTJOREUJCSgxMiA8PCAgMCkKKyNkZWZpbmUgQ0NfQ0NQREZSX0RBVEFGT1JNQVRfUkFXMTIJCSgxMyA8PCAgMCkKKyNkZWZpbmUgQ0NfQ0NQREZSX0RBVEFGT1JNQVRfSlBFRzgJCSgxNSA8PCAgMCkKKworI2RlZmluZSBDQU1ETUFfUkVWSVNJT05fTUFKT1IJCQkoMTUgPDwgNCkKKyNkZWZpbmUgQ0FNRE1BX1JFVklTSU9OX01BSk9SX1NISUZUCQk0CisjZGVmaW5lIENBTURNQV9SRVZJU0lPTl9NSU5PUgkJCSgxNSA8PCAwKQorI2RlZmluZSBDQU1ETUFfUkVWSVNJT05fTUlOT1JfU0hJRlQJCTAKKworI2RlZmluZSBDQU1ETUFfT0NQX1NZU0NPTkZJR19NSURMRU1PREUJCSgzIDw8IDEyKQorI2RlZmluZSBDQU1ETUFfT0NQX1NZU0NPTkZJR19NSURMRU1PREVfRlNUQU5EQlkJKDAgPDwgMTIpCisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHX01JRExFTU9ERV9OU1RBTkRCWQkoMSA8PCAxMikKKyNkZWZpbmUgQ0FNRE1BX09DUF9TWVNDT05GSUdfTUlETEVNT0RFX1NTVEFOREJZCSgyIDw8IDEyKQorI2RlZmluZSBDQU1ETUFfT0NQX1NZU0NPTkZJR19GVU5DX0NMT0NLCQkoMSA8PCAgOSkKKyNkZWZpbmUgQ0FNRE1BX09DUF9TWVNDT05GSUdfT0NQX0NMT0NLCQkoMSA8PCAgOCkKKyNkZWZpbmUgQ0FNRE1BX09DUF9TWVNDT05GSUdfRU1VRlJFRQkJKDEgPDwgIDUpCisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHX1NJRExFTU9ERQkJKDMgPDwgIDMpCisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHX1NJRExFTU9ERV9GSURMRQkoMCA8PCAgMykKKyNkZWZpbmUgQ0FNRE1BX09DUF9TWVNDT05GSUdfU0lETEVNT0RFX05JRExFCSgxIDw8ICAzKQorI2RlZmluZSBDQU1ETUFfT0NQX1NZU0NPTkZJR19TSURMRU1PREVfU0lETEUJKDIgPDwgIDMpCisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHX1NPRlRSRVNFVAkJKDEgPDwgIDEpCisjZGVmaW5lIENBTURNQV9PQ1BfU1lTQ09ORklHX0FVVE9JRExFCQkoMSA8PCAgMCkKKworI2RlZmluZSBDQU1ETUFfU1lTU1RBVFVTX1JFU0VURE9ORQkJKDEgPDwgIDApCisKKyNkZWZpbmUgQ0FNRE1BX0dDUl9BUkJJVFJBVElPTl9SQVRFCQkoMHhGRiA8PCAxNikKKyNkZWZpbmUgQ0FNRE1BX0dDUl9BUkJJVFJBVElPTl9SQVRFX1NISUZUCTE2CisjZGVmaW5lIENBTURNQV9HQ1JfTUFYX0NIQU5ORUxfRklGT19ERVBUSAkoMHhGRiA8PCAwKQorI2RlZmluZSBDQU1ETUFfR0NSX01BWF9DSEFOTkVMX0ZJRk9fREVQVEhfU0hJRlQJMAorCisjZGVmaW5lIENBTURNQV9DQ1JfU0VMX1NSQ19EU1RfU1lOQwkJKDEgPDwgMjQpCisjZGVmaW5lIENBTURNQV9DQ1JfUFJFRkVUQ0gJCQkoMSA8PCAyMykKKyNkZWZpbmUgQ0FNRE1BX0NDUl9TVVBFUlZJU09SCQkJKDEgPDwgMjIpCisjZGVmaW5lIENBTURNQV9DQ1JfU0VDVVJFCQkJKDEgPDwgMjEpCisjZGVmaW5lIENBTURNQV9DQ1JfQlMJCQkJKDEgPDwgMTgpCisjZGVmaW5lIENBTURNQV9DQ1JfVFJBTlNQQVJFTlRfQ09QWV9FTkFCTEUJKDEgPDwgMTcpCisjZGVmaW5lIENBTURNQV9DQ1JfQ09OU1RBTlRfRklMTF9FTkFCTEUJCSgxIDw8IDE2KQorI2RlZmluZSBDQU1ETUFfQ0NSX0RTVF9BTU9ERQkJCSgzIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ0NSX0RTVF9BTU9ERV9DT05TVF9BRERSCQkoMCA8PCAxNCkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9EU1RfQU1PREVfUE9TVF9JTkMJCSgxIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ0NSX0RTVF9BTU9ERV9TR0xfSURYCQkoMiA8PCAxNCkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9EU1RfQU1PREVfREJMX0lEWAkJKDMgPDwgMTQpCisjZGVmaW5lIENBTURNQV9DQ1JfU1JDX0FNT0RFCQkJKDMgPDwgMTIpCisjZGVmaW5lIENBTURNQV9DQ1JfU1JDX0FNT0RFX0NPTlNUX0FERFIJCSgwIDw8IDEyKQorI2RlZmluZSBDQU1ETUFfQ0NSX1NSQ19BTU9ERV9QT1NUX0lOQwkJKDEgPDwgMTIpCisjZGVmaW5lIENBTURNQV9DQ1JfU1JDX0FNT0RFX1NHTF9JRFgJCSgyIDw8IDEyKQorI2RlZmluZSBDQU1ETUFfQ0NSX1NSQ19BTU9ERV9EQkxfSURYCQkoMyA8PCAxMikKKyNkZWZpbmUgQ0FNRE1BX0NDUl9XUl9BQ1RJVkUJCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9SRF9BQ1RJVkUJCQkoMSA8PCAgOSkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9TVVNQRU5EX1NFTlNJVElWRQkJKDEgPDwgIDgpCisjZGVmaW5lIENBTURNQV9DQ1JfRU5BQkxFCQkJKDEgPDwgIDcpCisjZGVmaW5lIENBTURNQV9DQ1JfUFJJTwkJCQkoMSA8PCAgNikKKyNkZWZpbmUgQ0FNRE1BX0NDUl9GUwkJCQkoMSA8PCAgNSkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9TWU5DSFJPCQkJKCgzIDw8IDE5KSB8ICgzMSA8PCAwKSkKKyNkZWZpbmUgQ0FNRE1BX0NDUl9TWU5DSFJPX0NBTUVSQQkJMHgwMQorCisjZGVmaW5lIENBTURNQV9DTE5LX0NUUkxfRU5BQkxFX0xOSwkJKDEgPDwgMTUpCisjZGVmaW5lIENBTURNQV9DTE5LX0NUUkxfTkVYVExDSF9JRAkJKDB4MUYgPDwgMCkKKyNkZWZpbmUgQ0FNRE1BX0NMTktfQ1RSTF9ORVhUTENIX0lEX1NISUZUCTAKKworI2RlZmluZSBDQU1ETUFfQ0lDUl9NSVNBTElHTkVEX0VSUl9JRQkJKDEgPDwgMTEpCisjZGVmaW5lIENBTURNQV9DSUNSX1NVUEVSVklTT1JfRVJSX0lFCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ0FNRE1BX0NJQ1JfU0VDVVJFX0VSUl9JRQkJKDEgPDwgIDkpCisjZGVmaW5lIENBTURNQV9DSUNSX1RSQU5TX0VSUl9JRQkJKDEgPDwgIDgpCisjZGVmaW5lIENBTURNQV9DSUNSX1BBQ0tFVF9JRQkJCSgxIDw8ICA3KQorI2RlZmluZSBDQU1ETUFfQ0lDUl9CTE9DS19JRQkJCSgxIDw8ICA1KQorI2RlZmluZSBDQU1ETUFfQ0lDUl9MQVNUX0lFCQkJKDEgPDwgIDQpCisjZGVmaW5lIENBTURNQV9DSUNSX0ZSQU1FX0lFCQkJKDEgPDwgIDMpCisjZGVmaW5lIENBTURNQV9DSUNSX0hBTEZfSUUJCQkoMSA8PCAgMikKKyNkZWZpbmUgQ0FNRE1BX0NJQ1JfRFJPUF9JRQkJCSgxIDw8ICAxKQorCisjZGVmaW5lIENBTURNQV9DU1JfTUlTQUxJR05FRF9FUlIJCSgxIDw8IDExKQorI2RlZmluZSBDQU1ETUFfQ1NSX1NVUEVSVklTT1JfRVJSCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ0FNRE1BX0NTUl9TRUNVUkVfRVJSCQkJKDEgPDwgIDkpCisjZGVmaW5lIENBTURNQV9DU1JfVFJBTlNfRVJSCQkJKDEgPDwgIDgpCisjZGVmaW5lIENBTURNQV9DU1JfUEFDS0VUCQkJKDEgPDwgIDcpCisjZGVmaW5lIENBTURNQV9DU1JfU1lOQwkJCQkoMSA8PCAgNikKKyNkZWZpbmUgQ0FNRE1BX0NTUl9CTE9DSwkJCSgxIDw8ICA1KQorI2RlZmluZSBDQU1ETUFfQ1NSX0xBU1QJCQkJKDEgPDwgIDQpCisjZGVmaW5lIENBTURNQV9DU1JfRlJBTUUJCQkoMSA8PCAgMykKKyNkZWZpbmUgQ0FNRE1BX0NTUl9IQUxGCQkJCSgxIDw8ICAyKQorI2RlZmluZSBDQU1ETUFfQ1NSX0RST1AJCQkJKDEgPDwgIDEpCisKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfU1JDX0VORElBTk5FU1MJCSgxIDw8IDIxKQorI2RlZmluZSBDQU1ETUFfQ1NEUF9TUkNfRU5ESUFOTkVTU19MT0NLCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfRFNUX0VORElBTk5FU1MJCSgxIDw8IDE5KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EU1RfRU5ESUFOTkVTU19MT0NLCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfV1JJVEVfTU9ERQkJCSgzIDw8IDE2KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9XUklURV9NT0RFX1dSTlAJCSgwIDw8IDE2KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9XUklURV9NT0RFX1BPU1RFRAkJKDEgPDwgMTYpCisjZGVmaW5lIENBTURNQV9DU0RQX1dSSVRFX01PREVfUE9TVEVEX0xBU1RfV1JOUAkoMiA8PCAxNikKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfRFNUX0JVUlNUX0VOCQkoMyA8PCAxNCkKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfRFNUX0JVUlNUX0VOXzEJCSgwIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EU1RfQlVSU1RfRU5fMTYJCSgxIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EU1RfQlVSU1RfRU5fMzIJCSgyIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EU1RfQlVSU1RfRU5fNjQJCSgzIDw8IDE0KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EU1RfUEFDS0VECQkJKDEgPDwgMTMpCisjZGVmaW5lIENBTURNQV9DU0RQX1dSX0FERF9UUlNMVAkJKDE1IDw8IDkpCisjZGVmaW5lIENBTURNQV9DU0RQX1dSX0FERF9UUlNMVF9FTkFCTEVfTVJFUUFERAkoMyA8PCAgOSkKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfU1JDX0JVUlNUX0VOCQkoMyA8PCAgNykKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfU1JDX0JVUlNUX0VOXzEJCSgwIDw8ICA3KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9TUkNfQlVSU1RfRU5fMTYJCSgxIDw8ICA3KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9TUkNfQlVSU1RfRU5fMzIJCSgyIDw8ICA3KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9TUkNfQlVSU1RfRU5fNjQJCSgzIDw8ICA3KQorI2RlZmluZSBDQU1ETUFfQ1NEUF9TUkNfUEFDS0VECQkJKDEgPDwgIDYpCisjZGVmaW5lIENBTURNQV9DU0RQX1JEX0FERF9UUlNMVAkJKDE1IDw8IDIpCisjZGVmaW5lIENBTURNQV9DU0RQX1JEX0FERF9UUlNMVF9FTkFCTEVfTVJFUUFERAkoMyA8PCAgMikKKyNkZWZpbmUgQ0FNRE1BX0NTRFBfREFUQV9UWVBFCQkJKDMgPDwgIDApCisjZGVmaW5lIENBTURNQV9DU0RQX0RBVEFfVFlQRV84QklUUwkJKDAgPDwgIDApCisjZGVmaW5lIENBTURNQV9DU0RQX0RBVEFfVFlQRV8xNkJJVFMJCSgxIDw8ICAwKQorI2RlZmluZSBDQU1ETUFfQ1NEUF9EQVRBX1RZUEVfMzJCSVRTCQkoMiA8PCAgMCkKKworI2RlZmluZSBDQU1NTVVfU1lTQ09ORklHX0FVVE9JRExFCQkoMSA8PCAgMCkKKworLyoKKyAqCisgKiBEZWNsYXJhdGlvbnMuCisgKgorICovCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJ1Y3Qgb21hcDI0eHhjYW1fc2dkbWE7CitzdHJ1Y3Qgb21hcDI0eHhjYW1fZG1hOworCit0eXBlZGVmIHZvaWQgKCpzZ2RtYV9jYWxsYmFja190KShzdHJ1Y3Qgb21hcDI0eHhjYW1fc2dkbWEgKmNhbSwKKwkJCQkgdTMyIHN0YXR1cywgdm9pZCAqYXJnKTsKK3R5cGVkZWYgdm9pZCAoKmRtYV9jYWxsYmFja190KShzdHJ1Y3Qgb21hcDI0eHhjYW1fZG1hICpjYW0sCisJCQkgICAgICAgdTMyIHN0YXR1cywgdm9pZCAqYXJnKTsKKworc3RydWN0IGNoYW5uZWxfc3RhdGUgeworCWRtYV9jYWxsYmFja190IGNhbGxiYWNrOworCXZvaWQgKmFyZzsKK307CisKKy8qIHNnZG1hIHN0YXRlIGZvciBlYWNoIG9mIHRoZSBwb3NzaWJsZSB2aWRlb2J1Zl9idWZmZXJzICsgMiBvdmVybGF5cyAqLworc3RydWN0IHNnZG1hX3N0YXRlIHsKKwljb25zdCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdDsKKwlpbnQgc2dsZW47CQkgLyogbnVtYmVyIG9mIHNnbGlzdCBlbnRyaWVzICovCisJaW50IG5leHRfc2dsaXN0OwkgLyogaW5kZXggb2YgbmV4dCBzZ2xpc3QgZW50cnkgdG8gcHJvY2VzcyAqLworCXVuc2lnbmVkIGludCBieXRlc19yZWFkOyAvKiBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLworCXVuc2lnbmVkIGludCBsZW47ICAgICAgICAvKiB0b3RhbCBsZW5ndGggb2Ygc2dsaXN0IChleGNsdWRpbmcKKwkJCQkgICogYnl0ZXMgZHVlIHRvIHBhZ2UgYWxpZ25tZW50KSAqLworCWludCBxdWV1ZWRfc2dsaXN0OwkgLyogbnVtYmVyIG9mIHNnbGlzdCBlbnRyaWVzIHF1ZXVlZCBmb3IgRE1BICovCisJdTMyIGNzcjsJCSAvKiBETUEgcmV0dXJuIGNvZGUgKi8KKwlzZ2RtYV9jYWxsYmFja190IGNhbGxiYWNrOworCXZvaWQgKmFyZzsKK307CisKKy8qIHBoeXNpY2FsIERNQSBjaGFubmVsIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBvbWFwMjR4eGNhbV9kbWEgeworCXNwaW5sb2NrX3QgbG9jazsJLyogTG9jayBmb3IgdGhlIHdob2xlIHN0cnVjdHVyZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgYmFzZTsJLyogYmFzZSBhZGRyZXNzIGZvciBkbWEgY29udHJvbGxlciAqLworCisJLyogV2hpbGUgZG1hX3N0b3AhPTAsIGFuIGF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgRE1BIHRyYW5zZmVyIHdpbGwKKwkgKiBmYWlsLgorCSAqLworCWF0b21pY190IGRtYV9zdG9wOworCWludCBmcmVlX2RtYWNoOwkJLyogbnVtYmVyIG9mIGRtYSBjaGFubmVscyBmcmVlICovCisJaW50IG5leHRfZG1hY2g7CQkvKiBpbmRleCBvZiBuZXh0IGRtYSBjaGFubmVsIHRvIHVzZSAqLworCXN0cnVjdCBjaGFubmVsX3N0YXRlIGNoX3N0YXRlW05VTV9DQU1ETUFfQ0hBTk5FTFNdOworfTsKKworLyogc2NhdHRlci1nYXRoZXIgRE1BIChzY2F0dGVybGlzdCBzdHVmZikgbWFuYWdlbWVudCAqLworc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hIHsKKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZG1hIGRtYTsKKworCXNwaW5sb2NrX3QgbG9jazsJLyogTG9jayBmb3IgdGhlIGZpZWxkcyBiZWxvdy4gKi8KKwlpbnQgZnJlZV9zZ2RtYTsJCS8qIG51bWJlciBvZiBmcmVlIHNnIGRtYSBzbG90cyAqLworCWludCBuZXh0X3NnZG1hOwkJLyogaW5kZXggb2YgbmV4dCBzZyBkbWEgc2xvdCB0byB1c2UgKi8KKwlzdHJ1Y3Qgc2dkbWFfc3RhdGUgc2dfc3RhdGVbTlVNX1NHX0RNQV07CisKKwkvKiBSZXNldCB0aW1lciBkYXRhICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVzZXRfdGltZXI7Cit9OworCisvKiBwZXItZGV2aWNlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlIHsKKwkvKioqIG11dGV4ICAqKiovCisJLyoKKwkgKiBtdXRleCBzZXJpYWxpc2VzIGFjY2VzcyB0byB0aGlzIHN0cnVjdHVyZS4gQWxzbyBjYW1lcmEKKwkgKiBvcGVuaW5nIGFuZCByZWxlYXNpbmcgaXMgc3luY2hyb25pc2VkIGJ5IHRoaXMuCisJICovCisJc3RydWN0IG11dGV4IG11dGV4OworCisJLyoqKiBnZW5lcmFsIGRyaXZlciBzdGF0ZSBpbmZvcm1hdGlvbiAqKiovCisJYXRvbWljX3QgdXNlcnM7CisJLyoKKwkgKiBMb2NrIHRvIHNlcmlhbGlzZSBjb3JlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgYW5kIGFjY2VzcyB0bworCSAqIHNnZG1hX2luX3F1ZXVlLgorCSAqLworCXNwaW5sb2NrX3QgY29yZV9lbmFibGVfZGlzYWJsZV9sb2NrOworCS8qCisJICogTnVtYmVyIG9yIHNnZG1hIHJlcXVlc3RzIGluIHNjYXR0ZXItZ2F0aGVyIHF1ZXVlLCBwcm90ZWN0ZWQKKwkgKiBieSB0aGUgbG9jayBhYm92ZS4KKwkgKi8KKwlpbnQgc2dkbWFfaW5fcXVldWU7CisJLyoKKwkgKiBTZW5zb3IgaW50ZXJmYWNlIHBhcmFtZXRlcnM6IGludGVyZmFjZSB0eXBlLCBDQ19DVFJMCisJICogcmVnaXN0ZXIgdmFsdWUgYW5kIGludGVyZmFjZSBzcGVjaWZpYyBkYXRhLgorCSAqLworCWludCBpZl90eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHBhcmFsbGVsIHsKKwkJCXUzMiB4Y2xrOworCQl9IGJ0NjU2OworCX0gaWZfdTsKKwl1MzIgY2NfY3RybDsKKworCS8qKiogc3Vic3lzdGVtIHN0cnVjdHVyZXMgKioqLworCXN0cnVjdCBvbWFwMjR4eGNhbV9zZ2RtYSBzZ2RtYTsKKworCS8qKiogaGFyZHdhcmUgcmVzb3VyY2VzICoqKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlX3BoeXM7CisJdW5zaWduZWQgbG9uZyBtbWlvX3NpemU7CisKKwkvKioqIGludGVyZmFjZXMgYW5kIGRldmljZSAqKiovCisJc3RydWN0IHY0bDJfaW50X2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCisJLyoqKiBjYW1lcmEgYW5kIHNlbnNvciByZXNldCByZWxhdGVkIHN0dWZmICoqKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Vuc29yX3Jlc2V0X3dvcms7CisJLyoKKwkgKiBXZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVzZXQuIERvbid0IGVuYWJsZSBjb3JlIGlmIHRoaXMKKwkgKiBpcyBub24temVybyEgVGhpcyBleGlzdHMgdG8gaGVscCBkZWNpc2lvbm1ha2luZyBpbiBhIGNhc2UKKwkgKiB3aGVyZSB2aWRlb2J1Zl9xYnVmIGlzIGNhbGxlZCB3aGlsZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZgorCSAqIGEgcmVzZXQuCisJICovCisJYXRvbWljX3QgaW5fcmVzZXQ7CisJLyoKKwkgKiBOb24temVybyBpZiB3ZSBkb24ndCB3YW50IGFueSByZXNldHMgZm9yIG5vdy4gVXNlZCB0bworCSAqIHByZXZlbnQgcmVzZXQgd29yayB0byBydW4gd2hlbiB3ZSdyZSBhYm91dCB0byBzdG9wCisJICogc3RyZWFtaW5nLgorCSAqLworCWF0b21pY190IHJlc2V0X2Rpc2FibGU7CisKKwkvKioqIHZpZGVvIGRldmljZSBwYXJhbWV0ZXJzICoqKi8KKwlpbnQgY2FwdHVyZV9tZW07CisKKwkvKioqIGNhbWVyYSBtb2R1bGUgY2xvY2tzICoqKi8KKwlzdHJ1Y3QgY2xrICpmY2s7CisJc3RydWN0IGNsayAqaWNrOworCisJLyoqKiBjYXB0dXJlIGRhdGEgKioqLworCS8qIGZpbGUgaGFuZGxlLCBpZiBzdHJlYW1pbmcgaXMgb24gKi8KKwlzdHJ1Y3QgZmlsZSAqc3RyZWFtaW5nOworfTsKKworLyogUGVyLWZpbGUgaGFuZGxlIGRhdGEuICovCitzdHJ1Y3Qgb21hcDI0eHhjYW1fZmggeworCXNwaW5sb2NrX3QgdmJxX2xvY2s7IC8qIHNwaW5sb2NrIGZvciB0aGUgdmlkZW9idWYgcXVldWUgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmJxOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4OyAvKiBzZXJpYWxpc2UgcGl4IGJ5IHZicS0+bG9jayAqLworCWF0b21pY190IGZpZWxkX2NvdW50OyAvKiBmaWVsZCBjb3VudGVyIGZvciB2aWRlb2J1Zl9idWZmZXIgKi8KKwkvKiBhY2Nlc3NpbmcgY2FtIGhlcmUgZG9lc24ndCBuZWVkIHNlcmlhbGlzYXRpb246IGl0J3MgY29uc3RhbnQgKi8KKwlzdHJ1Y3Qgb21hcDI0eHhjYW1fZGV2aWNlICpjYW07Cit9OworCisvKgorICoKKyAqIFJlZ2lzdGVyIEkvTyBmdW5jdGlvbnMuCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIG9tYXAyNHh4Y2FtX3JlZ19pbih1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvbWFwMjR4eGNhbV9yZWdfb3V0KHVuc2lnbmVkIGxvbmcgYmFzZSwgdTMyIG9mZnNldCwKKwkJCQkJICB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGJhc2UgKyBvZmZzZXQpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9tYXAyNHh4Y2FtX3JlZ19tZXJnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBvZmZzZXQsCisJCQkJCSAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwl1MzIgYWRkciA9IGJhc2UgKyBvZmZzZXQ7CisJdTMyIG5ld192YWwgPSAocmVhZGwoYWRkcikgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisKKwl3cml0ZWwobmV3X3ZhbCwgYWRkcik7CisJcmV0dXJuIG5ld192YWw7Cit9CisKKy8qCisgKgorICogRnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqCisgKi8KKworLyogZG1hIHByb3RvdHlwZXMgKi8KKwordm9pZCBvbWFwMjR4eGNhbV9kbWFfaHdpbml0KHN0cnVjdCBvbWFwMjR4eGNhbV9kbWEgKmRtYSk7Cit2b2lkIG9tYXAyNHh4Y2FtX2RtYV9pc3Ioc3RydWN0IG9tYXAyNHh4Y2FtX2RtYSAqZG1hKTsKKworLyogc2dkbWEgcHJvdG90eXBlcyAqLworCit2b2lkIG9tYXAyNHh4Y2FtX3NnZG1hX3Byb2Nlc3Moc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSk7CitpbnQgb21hcDI0eHhjYW1fc2dkbWFfcXVldWUoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHNnbGVuLAorCQkJICAgIGludCBsZW4sIHNnZG1hX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmFyZyk7Cit2b2lkIG9tYXAyNHh4Y2FtX3NnZG1hX3N5bmMoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSk7Cit2b2lkIG9tYXAyNHh4Y2FtX3NnZG1hX2luaXQoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgdm9pZCAoKnJlc2V0X2NhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgcmVzZXRfY2FsbGJhY2tfZGF0YSk7Cit2b2lkIG9tYXAyNHh4Y2FtX3NnZG1hX2V4aXQoc3RydWN0IG9tYXAyNHh4Y2FtX3NnZG1hICpzZ2RtYSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCmluZGV4IDIxMGYxMjQuLjZlZTliNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKQEAgLTQwMTEsOCArNDAxMSw3IEBACiAKIC8qIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhICovCiBzdGF0aWMgaW50Ci1vdjUxeF92NGwxX2lvY3RsX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitvdjUxeF92NGwxX2lvY3RsX2ludGVybmFsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwpAQCAtNDQ2MSw3ICs0NDYwLDcgQEAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZvdi0+bG9jaykpCiAJCXJldHVybiAtRUlOVFI7CiAKLQlyYyA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgb3Y1MXhfdjRsMV9pb2N0bF9pbnRlcm5hbCk7CisJcmMgPSB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgb3Y1MXhfdjRsMV9pb2N0bF9pbnRlcm5hbCk7CiAKIAltdXRleF91bmxvY2soJm92LT5sb2NrKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI3MzZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwpAQCAtMCwwICsxLDEwMTIgQEAKKy8qCisgKiBvdjc3MnggQ2FtZXJhIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIEJhc2VkIG9uIG92NzY3MCBhbmQgc29jX2NhbWVyYV9wbGF0Zm9ybSBkcml2ZXIsCisgKgorICogQ29weXJpZ2h0IDIwMDYtNyBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hZ251cyBEYW1tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS9vdjc3MnguaD4KKworLyoKKyAqIHJlZ2lzdGVyIG9mZnNldAorICovCisjZGVmaW5lIEdBSU4gICAgICAgIDB4MDAgLyogQUdDIC0gR2FpbiBjb250cm9sIGdhaW4gc2V0dGluZyAqLworI2RlZmluZSBCTFVFICAgICAgICAweDAxIC8qIEFXQiAtIEJsdWUgY2hhbm5lbCBnYWluIHNldHRpbmcgKi8KKyNkZWZpbmUgUkVEICAgICAgICAgMHgwMiAvKiBBV0IgLSBSZWQgICBjaGFubmVsIGdhaW4gc2V0dGluZyAqLworI2RlZmluZSBHUkVFTiAgICAgICAweDAzIC8qIEFXQiAtIEdyZWVuIGNoYW5uZWwgZ2FpbiBzZXR0aW5nICovCisjZGVmaW5lIENPTTEgICAgICAgIDB4MDQgLyogQ29tbW9uIGNvbnRyb2wgMSAqLworI2RlZmluZSBCQVZHICAgICAgICAweDA1IC8qIFUvQiBBdmVyYWdlIExldmVsICovCisjZGVmaW5lIEdBVkcgICAgICAgIDB4MDYgLyogWS9HYiBBdmVyYWdlIExldmVsICovCisjZGVmaW5lIFJBVkcgICAgICAgIDB4MDcgLyogVi9SIEF2ZXJhZ2UgTGV2ZWwgKi8KKyNkZWZpbmUgQUVDSCAgICAgICAgMHgwOCAvKiBFeHBvc3VyZSBWYWx1ZSAtIEFFQyBNU0JzICovCisjZGVmaW5lIENPTTIgICAgICAgIDB4MDkgLyogQ29tbW9uIGNvbnRyb2wgMiAqLworI2RlZmluZSBQSUQgICAgICAgICAweDBBIC8qIFByb2R1Y3QgSUQgTnVtYmVyIE1TQiAqLworI2RlZmluZSBWRVIgICAgICAgICAweDBCIC8qIFByb2R1Y3QgSUQgTnVtYmVyIExTQiAqLworI2RlZmluZSBDT00zICAgICAgICAweDBDIC8qIENvbW1vbiBjb250cm9sIDMgKi8KKyNkZWZpbmUgQ09NNCAgICAgICAgMHgwRCAvKiBDb21tb24gY29udHJvbCA0ICovCisjZGVmaW5lIENPTTUgICAgICAgIDB4MEUgLyogQ29tbW9uIGNvbnRyb2wgNSAqLworI2RlZmluZSBDT002ICAgICAgICAweDBGIC8qIENvbW1vbiBjb250cm9sIDYgKi8KKyNkZWZpbmUgQUVDICAgICAgICAgMHgxMCAvKiBFeHBvc3VyZSBWYWx1ZSAqLworI2RlZmluZSBDTEtSQyAgICAgICAweDExIC8qIEludGVybmFsIGNsb2NrICovCisjZGVmaW5lIENPTTcgICAgICAgIDB4MTIgLyogQ29tbW9uIGNvbnRyb2wgNyAqLworI2RlZmluZSBDT004ICAgICAgICAweDEzIC8qIENvbW1vbiBjb250cm9sIDggKi8KKyNkZWZpbmUgQ09NOSAgICAgICAgMHgxNCAvKiBDb21tb24gY29udHJvbCA5ICovCisjZGVmaW5lIENPTTEwICAgICAgIDB4MTUgLyogQ29tbW9uIGNvbnRyb2wgMTAgKi8KKyNkZWZpbmUgUkVHMTYgICAgICAgMHgxNiAvKiBSZWdpc3RlciAxNiAqLworI2RlZmluZSBIU1RBUlQgICAgICAweDE3IC8qIEhvcml6b250YWwgc2Vuc29yIHNpemUgKi8KKyNkZWZpbmUgSFNJWkUgICAgICAgMHgxOCAvKiBIb3Jpem9udGFsIGZyYW1lIChIUkVGIGNvbHVtbikgZW5kIGhpZ2ggOC1iaXQgKi8KKyNkZWZpbmUgVlNUQVJUICAgICAgMHgxOSAvKiBWZXJ0aWNhbCBmcmFtZSAocm93KSBzdGFydCBoaWdoIDgtYml0ICovCisjZGVmaW5lIFZTSVpFICAgICAgIDB4MUEgLyogVmVydGljYWwgc2Vuc29yIHNpemUgKi8KKyNkZWZpbmUgUFNIRlQgICAgICAgMHgxQiAvKiBEYXRhIGZvcm1hdCAtIHBpeGVsIGRlbGF5IHNlbGVjdCAqLworI2RlZmluZSBNSURIICAgICAgICAweDFDIC8qIE1hbnVmYWN0dXJlciBJRCBieXRlIC0gaGlnaCAqLworI2RlZmluZSBNSURMICAgICAgICAweDFEIC8qIE1hbnVmYWN0dXJlciBJRCBieXRlIC0gbG93ICAqLworI2RlZmluZSBMQUVDICAgICAgICAweDFGIC8qIEZpbmUgQUVDIHZhbHVlICovCisjZGVmaW5lIENPTTExICAgICAgIDB4MjAgLyogQ29tbW9uIGNvbnRyb2wgMTEgKi8KKyNkZWZpbmUgQkRCQVNFICAgICAgMHgyMiAvKiBCYW5kaW5nIGZpbHRlciBNaW5pbXVtIEFFQyB2YWx1ZSAqLworI2RlZmluZSBEQlNURVAgICAgICAweDIzIC8qIEJhbmRpbmcgZmlsdGVyIE1heGltdW0gU2V0cCAqLworI2RlZmluZSBBRVcgICAgICAgICAweDI0IC8qIEFHQy9BRUMgLSBTdGFibGUgb3BlcmF0aW5nIHJlZ2lvbiAodXBwZXIgbGltaXQpICovCisjZGVmaW5lIEFFQiAgICAgICAgIDB4MjUgLyogQUdDL0FFQyAtIFN0YWJsZSBvcGVyYXRpbmcgcmVnaW9uIChsb3dlciBsaW1pdCkgKi8KKyNkZWZpbmUgVlBUICAgICAgICAgMHgyNiAvKiBBR0MvQUVDIEZhc3QgbW9kZSBvcGVyYXRpbmcgcmVnaW9uICovCisjZGVmaW5lIFJFRzI4ICAgICAgIDB4MjggLyogUmVnaXN0ZXIgMjggKi8KKyNkZWZpbmUgSE9VVFNJWkUgICAgMHgyOSAvKiBIb3Jpem9udGFsIGRhdGEgb3V0cHV0IHNpemUgTVNCcyAqLworI2RlZmluZSBFWEhDSCAgICAgICAweDJBIC8qIER1bW15IHBpeGVsIGluc2VydCBNU0IgKi8KKyNkZWZpbmUgRVhIQ0wgICAgICAgMHgyQiAvKiBEdW1teSBwaXhlbCBpbnNlcnQgTFNCICovCisjZGVmaW5lIFZPVVRTSVpFICAgIDB4MkMgLyogVmVydGljYWwgZGF0YSBvdXRwdXQgc2l6ZSBNU0JzICovCisjZGVmaW5lIEFEVkZMICAgICAgIDB4MkQgLyogTFNCIG9mIGluc2VydCBkdW1teSBsaW5lcyBpbiBWZXJ0aWNhbCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgQURWRkggICAgICAgMHgyRSAvKiBNU0cgb2YgaW5zZXJ0IGR1bW15IGxpbmVzIGluIFZlcnRpY2FsIGRpcmVjdGlvbiAqLworI2RlZmluZSBZQVZFICAgICAgICAweDJGIC8qIFkvRyBDaGFubmVsIEF2ZXJhZ2UgdmFsdWUgKi8KKyNkZWZpbmUgTFVNSFRIICAgICAgMHgzMCAvKiBIaXN0b2dyYW0gQUVDL0FHQyBMdW1pbmFuY2UgaGlnaCBsZXZlbCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgTFVNTFRIICAgICAgMHgzMSAvKiBIaXN0b2dyYW0gQUVDL0FHQyBMdW1pbmFuY2UgbG93ICBsZXZlbCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgSFJFRiAgICAgICAgMHgzMiAvKiBJbWFnZSBzdGFydCBhbmQgc2l6ZSBjb250cm9sICovCisjZGVmaW5lIERNX0xOTCAgICAgIDB4MzMgLyogRHVtbXkgbGluZSBsb3cgIDggYml0cyAqLworI2RlZmluZSBETV9MTkggICAgICAweDM0IC8qIER1bW15IGxpbmUgaGlnaCA4IGJpdHMgKi8KKyNkZWZpbmUgQURPRkZfQiAgICAgMHgzNSAvKiBBRCBvZmZzZXQgY29tcGVuc2F0aW9uIHZhbHVlIGZvciBCICBjaGFubmVsICovCisjZGVmaW5lIEFET0ZGX1IgICAgIDB4MzYgLyogQUQgb2Zmc2V0IGNvbXBlbnNhdGlvbiB2YWx1ZSBmb3IgUiAgY2hhbm5lbCAqLworI2RlZmluZSBBRE9GRl9HQiAgICAweDM3IC8qIEFEIG9mZnNldCBjb21wZW5zYXRpb24gdmFsdWUgZm9yIEdiIGNoYW5uZWwgKi8KKyNkZWZpbmUgQURPRkZfR1IgICAgMHgzOCAvKiBBRCBvZmZzZXQgY29tcGVuc2F0aW9uIHZhbHVlIGZvciBHciBjaGFubmVsICovCisjZGVmaW5lIE9GRl9CICAgICAgIDB4MzkgLyogQW5hbG9nIHByb2Nlc3MgQiAgY2hhbm5lbCBvZmZzZXQgdmFsdWUgKi8KKyNkZWZpbmUgT0ZGX1IgICAgICAgMHgzQSAvKiBBbmFsb2cgcHJvY2VzcyBSICBjaGFubmVsIG9mZnNldCB2YWx1ZSAqLworI2RlZmluZSBPRkZfR0IgICAgICAweDNCIC8qIEFuYWxvZyBwcm9jZXNzIEdiIGNoYW5uZWwgb2Zmc2V0IHZhbHVlICovCisjZGVmaW5lIE9GRl9HUiAgICAgIDB4M0MgLyogQW5hbG9nIHByb2Nlc3MgR3IgY2hhbm5lbCBvZmZzZXQgdmFsdWUgKi8KKyNkZWZpbmUgQ09NMTIgICAgICAgMHgzRCAvKiBDb21tb24gY29udHJvbCAxMiAqLworI2RlZmluZSBDT00xMyAgICAgICAweDNFIC8qIENvbW1vbiBjb250cm9sIDEzICovCisjZGVmaW5lIENPTTE0ICAgICAgIDB4M0YgLyogQ29tbW9uIGNvbnRyb2wgMTQgKi8KKyNkZWZpbmUgQ09NMTUgICAgICAgMHg0MCAvKiBDb21tb24gY29udHJvbCAxNSovCisjZGVmaW5lIENPTTE2ICAgICAgIDB4NDEgLyogQ29tbW9uIGNvbnRyb2wgMTYgKi8KKyNkZWZpbmUgVEdUX0IgICAgICAgMHg0MiAvKiBCTEMgYmx1ZSBjaGFubmVsIHRhcmdldCB2YWx1ZSAqLworI2RlZmluZSBUR1RfUiAgICAgICAweDQzIC8qIEJMQyByZWQgIGNoYW5uZWwgdGFyZ2V0IHZhbHVlICovCisjZGVmaW5lIFRHVF9HQiAgICAgIDB4NDQgLyogQkxDIEdiICAgY2hhbm5lbCB0YXJnZXQgdmFsdWUgKi8KKyNkZWZpbmUgVEdUX0dSICAgICAgMHg0NSAvKiBCTEMgR3IgICBjaGFubmVsIHRhcmdldCB2YWx1ZSAqLworLyogZm9yIG92NzcyMCAqLworI2RlZmluZSBMQ0MwICAgICAgICAweDQ2IC8qIExlbnMgY29ycmVjdGlvbiBjb250cm9sIDAgKi8KKyNkZWZpbmUgTENDMSAgICAgICAgMHg0NyAvKiBMZW5zIGNvcnJlY3Rpb24gb3B0aW9uIDEgLSBYIGNvb3JkaW5hdGUgKi8KKyNkZWZpbmUgTENDMiAgICAgICAgMHg0OCAvKiBMZW5zIGNvcnJlY3Rpb24gb3B0aW9uIDIgLSBZIGNvb3JkaW5hdGUgKi8KKyNkZWZpbmUgTENDMyAgICAgICAgMHg0OSAvKiBMZW5zIGNvcnJlY3Rpb24gb3B0aW9uIDMgKi8KKyNkZWZpbmUgTENDNCAgICAgICAgMHg0QSAvKiBMZW5zIGNvcnJlY3Rpb24gb3B0aW9uIDQgLSByYWRpdXMgb2YgdGhlIGNpcmN1bGFyICovCisjZGVmaW5lIExDQzUgICAgICAgIDB4NEIgLyogTGVucyBjb3JyZWN0aW9uIG9wdGlvbiA1ICovCisjZGVmaW5lIExDQzYgICAgICAgIDB4NEMgLyogTGVucyBjb3JyZWN0aW9uIG9wdGlvbiA2ICovCisvKiBmb3Igb3Y3NzI1ICovCisjZGVmaW5lIExDX0NUUiAgICAgIDB4NDYgLyogTGVucyBjb3JyZWN0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgTENfWEMgICAgICAgMHg0NyAvKiBYIGNvb3JkaW5hdGUgb2YgbGVucyBjb3JyZWN0aW9uIGNlbnRlciByZWxhdGl2ZSAqLworI2RlZmluZSBMQ19ZQyAgICAgICAweDQ4IC8qIFkgY29vcmRpbmF0ZSBvZiBsZW5zIGNvcnJlY3Rpb24gY2VudGVyIHJlbGF0aXZlICovCisjZGVmaW5lIExDX0NPRUYgICAgIDB4NDkgLyogTGVucyBjb3JyZWN0aW9uIGNvZWZmaWNpZW50ICovCisjZGVmaW5lIExDX1JBREkgICAgIDB4NEEgLyogTGVucyBjb3JyZWN0aW9uIHJhZGl1cyAqLworI2RlZmluZSBMQ19DT0VGQiAgICAweDRCIC8qIExlbnMgQiBjaGFubmVsIGNvbXBlbnNhdGlvbiBjb2VmZmljaWVudCAqLworI2RlZmluZSBMQ19DT0VGUiAgICAweDRDIC8qIExlbnMgUiBjaGFubmVsIGNvbXBlbnNhdGlvbiBjb2VmZmljaWVudCAqLworCisjZGVmaW5lIEZJWEdBSU4gICAgIDB4NEQgLyogQW5hbG9nIGZpeCBnYWluIGFtcGxpZmVyICovCisjZGVmaW5lIEFSRUYwICAgICAgIDB4NEUgLyogU2Vuc29yIHJlZmVyZW5jZSBjb250cm9sICovCisjZGVmaW5lIEFSRUYxICAgICAgIDB4NEYgLyogU2Vuc29yIHJlZmVyZW5jZSBjdXJyZW50IGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjIgICAgICAgMHg1MCAvKiBBbmFsb2cgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjMgICAgICAgMHg1MSAvKiBBREMgICAgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjQgICAgICAgMHg1MiAvKiBBREMgICAgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjUgICAgICAgMHg1MyAvKiBBREMgICAgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjYgICAgICAgMHg1NCAvKiBBbmFsb2cgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJFRjcgICAgICAgMHg1NSAvKiBBbmFsb2cgcmVmZXJlbmNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVUZJWCAgICAgICAgMHg2MCAvKiBVIGNoYW5uZWwgZml4ZWQgdmFsdWUgb3V0cHV0ICovCisjZGVmaW5lIFZGSVggICAgICAgIDB4NjEgLyogViBjaGFubmVsIGZpeGVkIHZhbHVlIG91dHB1dCAqLworI2RlZmluZSBBV0JCX0JMSyAgICAweDYyIC8qIEFXQiBvcHRpb24gZm9yIGFkdmFuY2VkIEFXQiAqLworI2RlZmluZSBBV0JfQ1RSTDAgICAweDYzIC8qIEFXQiBjb250cm9sIGJ5dGUgMCAqLworI2RlZmluZSBEU1BfQ1RSTDEgICAweDY0IC8qIERTUCBjb250cm9sIGJ5dGUgMSAqLworI2RlZmluZSBEU1BfQ1RSTDIgICAweDY1IC8qIERTUCBjb250cm9sIGJ5dGUgMiAqLworI2RlZmluZSBEU1BfQ1RSTDMgICAweDY2IC8qIERTUCBjb250cm9sIGJ5dGUgMyAqLworI2RlZmluZSBEU1BfQ1RSTDQgICAweDY3IC8qIERTUCBjb250cm9sIGJ5dGUgNCAqLworI2RlZmluZSBBV0JfQklBUyAgICAweDY4IC8qIEFXQiBCTEMgbGV2ZWwgY2xpcCAqLworI2RlZmluZSBBV0JfQ1RSTDEgICAweDY5IC8qIEFXQiBjb250cm9sICAxICovCisjZGVmaW5lIEFXQl9DVFJMMiAgIDB4NkEgLyogQVdCIGNvbnRyb2wgIDIgKi8KKyNkZWZpbmUgQVdCX0NUUkwzICAgMHg2QiAvKiBBV0IgY29udHJvbCAgMyAqLworI2RlZmluZSBBV0JfQ1RSTDQgICAweDZDIC8qIEFXQiBjb250cm9sICA0ICovCisjZGVmaW5lIEFXQl9DVFJMNSAgIDB4NkQgLyogQVdCIGNvbnRyb2wgIDUgKi8KKyNkZWZpbmUgQVdCX0NUUkw2ICAgMHg2RSAvKiBBV0IgY29udHJvbCAgNiAqLworI2RlZmluZSBBV0JfQ1RSTDcgICAweDZGIC8qIEFXQiBjb250cm9sICA3ICovCisjZGVmaW5lIEFXQl9DVFJMOCAgIDB4NzAgLyogQVdCIGNvbnRyb2wgIDggKi8KKyNkZWZpbmUgQVdCX0NUUkw5ICAgMHg3MSAvKiBBV0IgY29udHJvbCAgOSAqLworI2RlZmluZSBBV0JfQ1RSTDEwICAweDcyIC8qIEFXQiBjb250cm9sIDEwICovCisjZGVmaW5lIEFXQl9DVFJMMTEgIDB4NzMgLyogQVdCIGNvbnRyb2wgMTEgKi8KKyNkZWZpbmUgQVdCX0NUUkwxMiAgMHg3NCAvKiBBV0IgY29udHJvbCAxMiAqLworI2RlZmluZSBBV0JfQ1RSTDEzICAweDc1IC8qIEFXQiBjb250cm9sIDEzICovCisjZGVmaW5lIEFXQl9DVFJMMTQgIDB4NzYgLyogQVdCIGNvbnRyb2wgMTQgKi8KKyNkZWZpbmUgQVdCX0NUUkwxNSAgMHg3NyAvKiBBV0IgY29udHJvbCAxNSAqLworI2RlZmluZSBBV0JfQ1RSTDE2ICAweDc4IC8qIEFXQiBjb250cm9sIDE2ICovCisjZGVmaW5lIEFXQl9DVFJMMTcgIDB4NzkgLyogQVdCIGNvbnRyb2wgMTcgKi8KKyNkZWZpbmUgQVdCX0NUUkwxOCAgMHg3QSAvKiBBV0IgY29udHJvbCAxOCAqLworI2RlZmluZSBBV0JfQ1RSTDE5ICAweDdCIC8qIEFXQiBjb250cm9sIDE5ICovCisjZGVmaW5lIEFXQl9DVFJMMjAgIDB4N0MgLyogQVdCIGNvbnRyb2wgMjAgKi8KKyNkZWZpbmUgQVdCX0NUUkwyMSAgMHg3RCAvKiBBV0IgY29udHJvbCAyMSAqLworI2RlZmluZSBHQU0xICAgICAgICAweDdFIC8qIEdhbW1hIEN1cnZlICAxc3Qgc2VnbWVudCBpbnB1dCBlbmQgcG9pbnQgKi8KKyNkZWZpbmUgR0FNMiAgICAgICAgMHg3RiAvKiBHYW1tYSBDdXJ2ZSAgMm5kIHNlZ21lbnQgaW5wdXQgZW5kIHBvaW50ICovCisjZGVmaW5lIEdBTTMgICAgICAgIDB4ODAgLyogR2FtbWEgQ3VydmUgIDNyZCBzZWdtZW50IGlucHV0IGVuZCBwb2ludCAqLworI2RlZmluZSBHQU00ICAgICAgICAweDgxIC8qIEdhbW1hIEN1cnZlICA0dGggc2VnbWVudCBpbnB1dCBlbmQgcG9pbnQgKi8KKyNkZWZpbmUgR0FNNSAgICAgICAgMHg4MiAvKiBHYW1tYSBDdXJ2ZSAgNXRoIHNlZ21lbnQgaW5wdXQgZW5kIHBvaW50ICovCisjZGVmaW5lIEdBTTYgICAgICAgIDB4ODMgLyogR2FtbWEgQ3VydmUgIDZ0aCBzZWdtZW50IGlucHV0IGVuZCBwb2ludCAqLworI2RlZmluZSBHQU03ICAgICAgICAweDg0IC8qIEdhbW1hIEN1cnZlICA3dGggc2VnbWVudCBpbnB1dCBlbmQgcG9pbnQgKi8KKyNkZWZpbmUgR0FNOCAgICAgICAgMHg4NSAvKiBHYW1tYSBDdXJ2ZSAgOHRoIHNlZ21lbnQgaW5wdXQgZW5kIHBvaW50ICovCisjZGVmaW5lIEdBTTkgICAgICAgIDB4ODYgLyogR2FtbWEgQ3VydmUgIDl0aCBzZWdtZW50IGlucHV0IGVuZCBwb2ludCAqLworI2RlZmluZSBHQU0xMCAgICAgICAweDg3IC8qIEdhbW1hIEN1cnZlIDEwdGggc2VnbWVudCBpbnB1dCBlbmQgcG9pbnQgKi8KKyNkZWZpbmUgR0FNMTEgICAgICAgMHg4OCAvKiBHYW1tYSBDdXJ2ZSAxMXRoIHNlZ21lbnQgaW5wdXQgZW5kIHBvaW50ICovCisjZGVmaW5lIEdBTTEyICAgICAgIDB4ODkgLyogR2FtbWEgQ3VydmUgMTJ0aCBzZWdtZW50IGlucHV0IGVuZCBwb2ludCAqLworI2RlZmluZSBHQU0xMyAgICAgICAweDhBIC8qIEdhbW1hIEN1cnZlIDEzdGggc2VnbWVudCBpbnB1dCBlbmQgcG9pbnQgKi8KKyNkZWZpbmUgR0FNMTQgICAgICAgMHg4QiAvKiBHYW1tYSBDdXJ2ZSAxNHRoIHNlZ21lbnQgaW5wdXQgZW5kIHBvaW50ICovCisjZGVmaW5lIEdBTTE1ICAgICAgIDB4OEMgLyogR2FtbWEgQ3VydmUgMTV0aCBzZWdtZW50IGlucHV0IGVuZCBwb2ludCAqLworI2RlZmluZSBTTE9QICAgICAgICAweDhEIC8qIEdhbW1hIGN1cnZlIGhpZ2hlc3Qgc2VnbWVudCBzbG9wZSAqLworI2RlZmluZSBETlNUSCAgICAgICAweDhFIC8qIERlLW5vaXNlIHRocmVzaG9sZCAqLworI2RlZmluZSBFREdFMCAgICAgICAweDhGIC8qIEVkZ2UgZW5oYW5jZW1lbnQgY29udHJvbCAwICovCisjZGVmaW5lIEVER0UxICAgICAgIDB4OTAgLyogRWRnZSBlbmhhbmNlbWVudCBjb250cm9sIDEgKi8KKyNkZWZpbmUgRE5TT0ZGICAgICAgMHg5MSAvKiBBdXRvIERlLW5vaXNlIHRocmVzaG9sZCBjb250cm9sICovCisjZGVmaW5lIEVER0UyICAgICAgIDB4OTIgLyogRWRnZSBlbmhhbmNlbWVudCBzdHJlbmd0aCBsb3cgIHBvaW50IGNvbnRyb2wgKi8KKyNkZWZpbmUgRURHRTMgICAgICAgMHg5MyAvKiBFZGdlIGVuaGFuY2VtZW50IHN0cmVuZ3RoIGhpZ2ggcG9pbnQgY29udHJvbCAqLworI2RlZmluZSBNVFgxICAgICAgICAweDk0IC8qIE1hdHJpeCBjb2VmZmljaWVudCAxICovCisjZGVmaW5lIE1UWDIgICAgICAgIDB4OTUgLyogTWF0cml4IGNvZWZmaWNpZW50IDIgKi8KKyNkZWZpbmUgTVRYMyAgICAgICAgMHg5NiAvKiBNYXRyaXggY29lZmZpY2llbnQgMyAqLworI2RlZmluZSBNVFg0ICAgICAgICAweDk3IC8qIE1hdHJpeCBjb2VmZmljaWVudCA0ICovCisjZGVmaW5lIE1UWDUgICAgICAgIDB4OTggLyogTWF0cml4IGNvZWZmaWNpZW50IDUgKi8KKyNkZWZpbmUgTVRYNiAgICAgICAgMHg5OSAvKiBNYXRyaXggY29lZmZpY2llbnQgNiAqLworI2RlZmluZSBNVFhfQ1RSTCAgICAweDlBIC8qIE1hdHJpeCBjb250cm9sICovCisjZGVmaW5lIEJSSUdIVCAgICAgIDB4OUIgLyogQnJpZ2h0bmVzcyBjb250cm9sICovCisjZGVmaW5lIENOVFJTVCAgICAgIDB4OUMgLyogQ29udHJhc3QgY29udHJhc3QgKi8KKyNkZWZpbmUgQ05UUlNUX0NUUkwgMHg5RCAvKiBDb250cmFzdCBjb250cmFzdCBjZW50ZXIgKi8KKyNkZWZpbmUgVVZBRF9KMCAgICAgMHg5RSAvKiBBdXRvIFVWIGFkanVzdCBjb250cmFzdCAwICovCisjZGVmaW5lIFVWQURfSjEgICAgIDB4OUYgLyogQXV0byBVViBhZGp1c3QgY29udHJhc3QgMSAqLworI2RlZmluZSBTQ0FMMCAgICAgICAweEEwIC8qIFNjYWxpbmcgY29udHJvbCAwICovCisjZGVmaW5lIFNDQUwxICAgICAgIDB4QTEgLyogU2NhbGluZyBjb250cm9sIDEgKi8KKyNkZWZpbmUgU0NBTDIgICAgICAgMHhBMiAvKiBTY2FsaW5nIGNvbnRyb2wgMiAqLworI2RlZmluZSBGSUZPRExZTSAgICAweEEzIC8qIEZJRk8gbWFudWFsIG1vZGUgZGVsYXkgY29udHJvbCAqLworI2RlZmluZSBGSUZPRExZQSAgICAweEE0IC8qIEZJRk8gYXV0byAgIG1vZGUgZGVsYXkgY29udHJvbCAqLworI2RlZmluZSBTREUgICAgICAgICAweEE2IC8qIFNwZWNpYWwgZGlnaXRhbCBlZmZlY3QgY29udHJvbCAqLworI2RlZmluZSBVU0FUICAgICAgICAweEE3IC8qIFUgY29tcG9uZW50IHNhdHVyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBWU0FUICAgICAgICAweEE4IC8qIFYgY29tcG9uZW50IHNhdHVyYXRpb24gY29udHJvbCAqLworLyogZm9yIG92NzcyMCAqLworI2RlZmluZSBIVUUwICAgICAgICAweEE5IC8qIEh1ZSBjb250cm9sIDAgKi8KKyNkZWZpbmUgSFVFMSAgICAgICAgMHhBQSAvKiBIdWUgY29udHJvbCAxICovCisvKiBmb3Igb3Y3NzI1ICovCisjZGVmaW5lIEhVRUNPUyAgICAgIDB4QTkgLyogQ29zaW5lIHZhbHVlICovCisjZGVmaW5lIEhVRVNJTiAgICAgIDB4QUEgLyogU2luZSB2YWx1ZSAqLworCisjZGVmaW5lIFNJR04gICAgICAgIDB4QUIgLyogU2lnbiBiaXQgZm9yIEh1ZSBhbmQgY29udHJhc3QgKi8KKyNkZWZpbmUgRFNQQVVUTyAgICAgMHhBQyAvKiBEU1AgYXV0byBmdW5jdGlvbiBPTi9PRkYgY29udHJvbCAqLworCisvKgorICogcmVnaXN0ZXIgZGV0YWlsCisgKi8KKworLyogQ09NMiAqLworI2RlZmluZSBTT0ZUX1NMRUVQX01PREUgMHgxMAkvKiBTb2Z0IHNsZWVwIG1vZGUgKi8KKwkJCQkvKiBPdXRwdXQgZHJpdmUgY2FwYWJpbGl0eSAqLworI2RlZmluZSBPQ0FQXzF4ICAgICAgICAgMHgwMAkvKiAxeCAqLworI2RlZmluZSBPQ0FQXzJ4ICAgICAgICAgMHgwMQkvKiAyeCAqLworI2RlZmluZSBPQ0FQXzN4ICAgICAgICAgMHgwMgkvKiAzeCAqLworI2RlZmluZSBPQ0FQXzR4ICAgICAgICAgMHgwMwkvKiA0eCAqLworCisvKiBDT00zICovCisjZGVmaW5lIFNXQVBfTUFTSyAgICAgICAweDM4CisKKyNkZWZpbmUgVkZJTUdfT05fT0ZGICAgIDB4ODAJLyogVmVydGljYWwgZmxpcCBpbWFnZSBPTi9PRkYgc2VsZWN0aW9uICovCisjZGVmaW5lIEhNSU1HX09OX09GRiAgICAweDQwCS8qIEhvcml6b250YWwgbWlycm9yIGltYWdlIE9OL09GRiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU1dBUF9SR0IgICAgICAgIDB4MjAJLyogU3dhcCBCL1IgIG91dHB1dCBzZXF1ZW5jZSBpbiBSR0IgbW9kZSAqLworI2RlZmluZSBTV0FQX1lVViAgICAgICAgMHgxMAkvKiBTd2FwIFkvVVYgb3V0cHV0IHNlcXVlbmNlIGluIFlVViBtb2RlICovCisjZGVmaW5lIFNXQVBfTUwgICAgICAgICAweDA4CS8qIFN3YXAgb3V0cHV0IE1TQi9MU0IgKi8KKwkJCQkvKiBUcmktc3RhdGUgb3B0aW9uIGZvciBvdXRwdXQgY2xvY2sgKi8KKyNkZWZpbmUgTk9UUklfQ0xPQ0sgICAgIDB4MDQJLyogICAwOiBUcmktc3RhdGUgICAgYXQgdGhpcyBwZXJpb2QgKi8KKwkJCQkvKiAgIDE6IE5vIHRyaS1zdGF0ZSBhdCB0aGlzIHBlcmlvZCAqLworCQkJCS8qIFRyaS1zdGF0ZSBvcHRpb24gZm9yIG91dHB1dCBkYXRhICovCisjZGVmaW5lIE5PVFJJX0RBVEEgICAgICAweDAyCS8qICAgMDogVHJpLXN0YXRlICAgIGF0IHRoaXMgcGVyaW9kICovCisJCQkJLyogICAxOiBObyB0cmktc3RhdGUgYXQgdGhpcyBwZXJpb2QgKi8KKyNkZWZpbmUgU0NPTE9SX1RFU1QgICAgIDB4MDEJLyogU2Vuc29yIGNvbG9yIGJhciB0ZXN0IHBhdHRlcm4gKi8KKworLyogQ09NNCAqLworCQkJCS8qIFBMTCBmcmVxdWVuY3kgY29udHJvbCAqLworI2RlZmluZSBQTExfQllQQVNTICAgICAgMHgwMAkvKiAgMDA6IEJ5cGFzcyBQTEwgKi8KKyNkZWZpbmUgUExMXzR4ICAgICAgICAgIDB4NDAJLyogIDAxOiBQTEwgNHggKi8KKyNkZWZpbmUgUExMXzZ4ICAgICAgICAgIDB4ODAJLyogIDEwOiBQTEwgNnggKi8KKyNkZWZpbmUgUExMXzh4ICAgICAgICAgIDB4YzAJLyogIDExOiBQTEwgOHggKi8KKwkJCQkvKiBBRUMgZXZhbHVhdGUgd2luZG93ICovCisjZGVmaW5lIEFFQ19GVUxMICAgICAgICAweDAwCS8qICAwMDogRnVsbCB3aW5kb3cgKi8KKyNkZWZpbmUgQUVDXzFwMiAgICAgICAgIDB4MTAJLyogIDAxOiAxLzIgIHdpbmRvdyAqLworI2RlZmluZSBBRUNfMXA0ICAgICAgICAgMHgyMAkvKiAgMTA6IDEvNCAgd2luZG93ICovCisjZGVmaW5lIEFFQ18ycDMgICAgICAgICAweDMwCS8qICAxMTogTG93IDIvMyB3aW5kb3cgKi8KKworLyogQ09NNSAqLworI2RlZmluZSBBRlJfT05fT0ZGICAgICAgMHg4MAkvKiBBdXRvIGZyYW1lIHJhdGUgY29udHJvbCBPTi9PRkYgc2VsZWN0aW9uICovCisjZGVmaW5lIEFGUl9TUFBFRCAgICAgICAweDQwCS8qIEF1dG8gZnJhbWUgcmF0ZSBjb250cm9sIHNwZWVkIHNsZWN0aW9uICovCisJCQkJLyogQXV0byBmcmFtZSByYXRlIG1heCByYXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUZSX05PX1JBVEUgICAgIDB4MDAJLyogICAgIE5vICByZWR1Y3Rpb24gb2YgZnJhbWUgcmF0ZSAqLworI2RlZmluZSBBRlJfMXAyICAgICAgICAgMHgxMAkvKiAgICAgTWF4IHJlZHVjdGlvbiB0byAxLzIgZnJhbWUgcmF0ZSAqLworI2RlZmluZSBBRlJfMXA0ICAgICAgICAgMHgyMAkvKiAgICAgTWF4IHJlZHVjdGlvbiB0byAxLzQgZnJhbWUgcmF0ZSAqLworI2RlZmluZSBBRlJfMXA4ICAgICAgICAgMHgzMAkvKiBNYXggcmVkdWN0aW9uIHRvIDEvOCBmcmFtZSByYXRlICovCisJCQkJLyogQXV0byBmcmFtZSByYXRlIGFjdGl2ZSBwb2ludCBjb250cm9sICovCisjZGVmaW5lIEFGXzJ4ICAgICAgICAgICAweDAwCS8qICAgICBBZGQgZnJhbWUgd2hlbiBBR0MgcmVhY2hlcyAgMnggZ2FpbiAqLworI2RlZmluZSBBRl80eCAgICAgICAgICAgMHgwNAkvKiAgICAgQWRkIGZyYW1lIHdoZW4gQUdDIHJlYWNoZXMgIDR4IGdhaW4gKi8KKyNkZWZpbmUgQUZfOHggICAgICAgICAgIDB4MDgJLyogICAgIEFkZCBmcmFtZSB3aGVuIEFHQyByZWFjaGVzICA4eCBnYWluICovCisjZGVmaW5lIEFGXzE2eCAgICAgICAgICAweDBjCS8qIEFkZCBmcmFtZSB3aGVuIEFHQyByZWFjaGVzIDE2eCBnYWluICovCisJCQkJLyogQUVDIG1heCBzdGVwIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUVDX05PX0xJTUlUICAgIDB4MDEJLyogICAwIDogQUVDIGluY2Vhc2Ugc3RlcCBoYXMgbGltaXQgKi8KKwkJCQkvKiAgIDEgOiBObyBsaW1pdCB0byBBRUMgaW5jcmVhc2Ugc3RlcCAqLworCisvKiBDT003ICovCisJCQkJLyogU0NDQiBSZWdpc3RlciBSZXNldCAqLworI2RlZmluZSBTQ0NCX1JFU0VUICAgICAgMHg4MAkvKiAgIDAgOiBObyBjaGFuZ2UgKi8KKwkJCQkvKiAgIDEgOiBSZXNldHMgYWxsIHJlZ2lzdGVycyB0byBkZWZhdWx0ICovCisJCQkJLyogUmVzb2x1dGlvbiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0xDVF9NQVNLICAgICAgIDB4NDAJLyogICBNYXNrIG9mIFZHQSBvciBRVkdBICovCisjZGVmaW5lIFNMQ1RfVkdBICAgICAgICAweDAwCS8qICAgMCA6IFZHQSAqLworI2RlZmluZSBTTENUX1FWR0EgICAgICAgMHg0MAkvKiAgIDEgOiBRVkdBICovCisjZGVmaW5lIElUVTY1Nl9PTl9PRkYgICAweDIwCS8qIElUVTY1NiBwcm90b2NvbCBPTi9PRkYgc2VsZWN0aW9uICovCisJCQkJLyogUkdCIG91dHB1dCBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZSBGTVRfR0JSNDIyICAgICAgMHgwMAkvKiAgICAgIDAwIDogR0JSIDQ6MjoyICovCisjZGVmaW5lIEZNVF9SR0I1NjUgICAgICAweDA0CS8qICAgICAgMDEgOiBSR0IgNTY1ICovCisjZGVmaW5lIEZNVF9SR0I1NTUgICAgICAweDA4CS8qICAgICAgMTAgOiBSR0IgNTU1ICovCisjZGVmaW5lIEZNVF9SR0I0NDQgICAgICAweDBjCS8qIDExIDogUkdCIDQ0NCAqLworCQkJCS8qIE91dHB1dCBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZSBPRk1UX1lVViAgICAgICAgMHgwMAkvKiAgICAgIDAwIDogWVVWICovCisjZGVmaW5lIE9GTVRfUF9CUkFXICAgICAweDAxCS8qICAgICAgMDEgOiBQcm9jZXNzZWQgQmF5ZXIgUkFXICovCisjZGVmaW5lIE9GTVRfUkdCICAgICAgICAweDAyCS8qICAgICAgMTAgOiBSR0IgKi8KKyNkZWZpbmUgT0ZNVF9CUkFXICAgICAgIDB4MDMJLyogMTEgOiBCYXllciBSQVcgKi8KKworLyogQ09NOCAqLworI2RlZmluZSBGQVNUX0FMR08gICAgICAgMHg4MAkvKiBFbmFibGUgZmFzdCBBR0MvQUVDIGFsZ29yaXRobSAqLworCQkJCS8qIEFFQyBTZXRwIHNpemUgbGltaXQgKi8KKyNkZWZpbmUgVU5MTVRfU1RFUCAgICAgIDB4NDAJLyogICAwIDogU3RlcCBzaXplIGlzIGxpbWl0ZWQgKi8KKwkJCQkvKiAgIDEgOiBVbmxpbWl0ZWQgc3RlcCBzaXplICovCisjZGVmaW5lIEJOREZfT05fT0ZGICAgICAweDIwCS8qIEJhbmRpbmcgZmlsdGVyIE9OL09GRiAqLworI2RlZmluZSBBRUNfQk5EICAgICAgICAgMHgxMAkvKiBFbmFibGUgQUVDIGJlbG93IGJhbmRpbmcgdmFsdWUgKi8KKyNkZWZpbmUgQUVDX09OX09GRiAgICAgIDB4MDgJLyogRmluZSBBRUMgT04vT0ZGIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdDX09OICAgICAgICAgIDB4MDQJLyogQUdDIEVuYWJsZSAqLworI2RlZmluZSBBV0JfT04gICAgICAgICAgMHgwMgkvKiBBV0IgRW5hYmxlICovCisjZGVmaW5lIEFFQ19PTiAgICAgICAgICAweDAxCS8qIEFFQyBFbmFibGUgKi8KKworLyogQ09NOSAqLworI2RlZmluZSBCQVNFX0FFQ0FHQyAgICAgMHg4MAkvKiBIaXN0b2dyYW0gb3IgYXZlcmFnZSBiYXNlZCBBRUMvQUdDICovCisJCQkJLyogQXV0b21hdGljIGdhaW4gY2VpbGluZyAtIG1heGltdW0gQUdDIHZhbHVlICovCisjZGVmaW5lIEdBSU5fMnggICAgICAgICAweDAwCS8qICAgIDAwMCA6ICAgMnggKi8KKyNkZWZpbmUgR0FJTl80eCAgICAgICAgIDB4MTAJLyogICAgMDAxIDogICA0eCAqLworI2RlZmluZSBHQUlOXzh4ICAgICAgICAgMHgyMAkvKiAgICAwMTAgOiAgIDh4ICovCisjZGVmaW5lIEdBSU5fMTZ4ICAgICAgICAweDMwCS8qIDAxMSA6ICAxNnggKi8KKyNkZWZpbmUgR0FJTl8zMnggICAgICAgIDB4NDAJLyogICAgMTAwIDogIDMyeCAqLworI2RlZmluZSBHQUlOXzY0eCAgICAgICAgMHg1MAkvKiAxMDEgOiAgNjR4ICovCisjZGVmaW5lIEdBSU5fMTI4eCAgICAgICAweDYwCS8qIDExMCA6IDEyOHggKi8KKyNkZWZpbmUgRFJPUF9WU1lOQyAgICAgIDB4MDQJLyogRHJvcCBWU1lOQyBvdXRwdXQgb2YgY29ycnVwdCBmcmFtZSAqLworI2RlZmluZSBEUk9QX0hSRUYgICAgICAgMHgwMgkvKiBEcm9wIEhSRUYgIG91dHB1dCBvZiBjb3JydXB0IGZyYW1lICovCisKKy8qIENPTTExICovCisjZGVmaW5lIFNHTEZfT05fT0ZGICAgICAweDAyCS8qIFNpbmdsZSBmcmFtZSBPTi9PRkYgc2VsZWN0aW9uICovCisjZGVmaW5lIFNHTEZfVFJJRyAgICAgICAweDAxCS8qIFNpbmdsZSBmcmFtZSB0cmFuc2ZlciB0cmlnZ2VyICovCisKKy8qIEVYSENIICovCisjZGVmaW5lIFZTSVpFX0xTQiAgICAgICAweDA0CS8qIFZlcnRpY2FsIGRhdGEgb3V0cHV0IHNpemUgTFNCICovCisKKy8qIERTUF9DVFJMMSAqLworI2RlZmluZSBGSUZPX09OICAgICAgICAgMHg4MAkvKiBGSUZPIGVuYWJsZS9kaXNhYmxlIHNlbGVjdGlvbiAqLworI2RlZmluZSBVVl9PTl9PRkYgICAgICAgMHg0MAkvKiBVViBhZGp1c3QgZnVuY3Rpb24gT04vT0ZGIHNlbGVjdGlvbiAqLworI2RlZmluZSBZVVY0NDRfMl80MjIgICAgMHgyMAkvKiBZVVY0NDQgdG8gNDIyIFVWIGNoYW5uZWwgb3B0aW9uIHNlbGVjdGlvbiAqLworI2RlZmluZSBDTFJfTVRSWF9PTl9PRkYgMHgxMAkvKiBDb2xvciBtYXRyaXggT04vT0ZGIHNlbGVjdGlvbiAqLworI2RlZmluZSBJTlRQTFRfT05fT0ZGICAgMHgwOAkvKiBJbnRlcnBvbGF0aW9uIE9OL09GRiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgR01NX09OX09GRiAgICAgIDB4MDQJLyogR2FtbWEgZnVuY3Rpb24gT04vT0ZGIHNlbGVjdGlvbiAqLworI2RlZmluZSBBVVRPX0JMS19PTl9PRkYgMHgwMgkvKiBCbGFjayBkZWZlY3QgYXV0byBjb3JyZWN0aW9uIE9OL09GRiAqLworI2RlZmluZSBBVVRPX1dIVF9PTl9PRkYgMHgwMQkvKiBXaGl0ZSBkZWZpbmUgYXV0byBjb3JyZWN0aW9uIE9OL09GRiAqLworCisvKiBEU1BfQ1RSTDMgKi8KKyNkZWZpbmUgVVZfTUFTSyAgICAgICAgIDB4ODAJLyogVVYgb3V0cHV0IHNlcXVlbmNlIG9wdGlvbiAqLworI2RlZmluZSBVVl9PTiAgICAgICAgICAgMHg4MAkvKiAgIE9OICovCisjZGVmaW5lIFVWX09GRiAgICAgICAgICAweDAwCS8qICAgT0ZGICovCisjZGVmaW5lIENCQVJfTUFTSyAgICAgICAweDIwCS8qIERTUCBDb2xvciBiYXIgbWFzayAqLworI2RlZmluZSBDQkFSX09OICAgICAgICAgMHgyMAkvKiAgIE9OICovCisjZGVmaW5lIENCQVJfT0ZGICAgICAgICAweDAwCS8qICAgT0ZGICovCisKKy8qIEhTVEFSVCAqLworI2RlZmluZSBIU1RfVkdBICAgICAgICAgMHgyMworI2RlZmluZSBIU1RfUVZHQSAgICAgICAgMHgzRgorCisvKiBIU0laRSAqLworI2RlZmluZSBIU1pfVkdBICAgICAgICAgMHhBMAorI2RlZmluZSBIU1pfUVZHQSAgICAgICAgMHg1MAorCisvKiBWU1RBUlQgKi8KKyNkZWZpbmUgVlNUX1ZHQSAgICAgICAgIDB4MDcKKyNkZWZpbmUgVlNUX1FWR0EgICAgICAgIDB4MDMKKworLyogVlNJWkUgKi8KKyNkZWZpbmUgVlNaX1ZHQSAgICAgICAgIDB4RjAKKyNkZWZpbmUgVlNaX1FWR0EgICAgICAgIDB4NzgKKworLyogSE9VVFNJWkUgKi8KKyNkZWZpbmUgSE9TWl9WR0EgICAgICAgIDB4QTAKKyNkZWZpbmUgSE9TWl9RVkdBICAgICAgIDB4NTAKKworLyogVk9VVFNJWkUgKi8KKyNkZWZpbmUgVk9TWl9WR0EgICAgICAgIDB4RjAKKyNkZWZpbmUgVk9TWl9RVkdBICAgICAgIDB4NzgKKworLyoKKyAqIGJpdCBjb25maWd1cmUgKDMyIGJpdCkKKyAqIHRoaXMgaXMgdXNlZCBpbiBzdHJ1Y3Qgb3Y3NzJ4X2NvbG9yX2Zvcm1hdCA6OiBvcHRpb24KKyAqLworI2RlZmluZSBPUF9VViAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE9QX1NXQVBfUkdCIDB4MDAwMDAwMDIKKworLyoKKyAqIElECisgKi8KKyNkZWZpbmUgT1Y3NzIwICAweDc3MjAKKyNkZWZpbmUgT1Y3NzI1ICAweDc3MjEKKyNkZWZpbmUgVkVSU0lPTihwaWQsIHZlcikgKChwaWQ8PDgpfCh2ZXImMHhGRikpCisKKy8qCisgKiBzdHJ1Y3QKKyAqLworc3RydWN0IHJlZ3ZhbF9saXN0IHsKKwl1bnNpZ25lZCBjaGFyIHJlZ19udW07CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKK307CisKK3N0cnVjdCBvdjc3MnhfY29sb3JfZm9ybWF0IHsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgKm5hbWU7CisJX191MzIgICAgICAgICAgICAgICAgICAgICBmb3VyY2M7CisJY29uc3Qgc3RydWN0IHJlZ3ZhbF9saXN0ICpyZWdzOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgb3B0aW9uOworfTsKKworc3RydWN0IG92NzcyeF93aW5fc2l6ZSB7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICpuYW1lOworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgd2lkdGg7CisJX191MzIgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICBjb203X2JpdDsKKwljb25zdCBzdHJ1Y3QgcmVndmFsX2xpc3QgKnJlZ3M7Cit9OworCitzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgeworCXN0cnVjdCBvdjc3MnhfY2FtZXJhX2luZm8gICAgICAgICppbmZvOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgICAgICpjbGllbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICAgICAgICAgIGljZDsKKwljb25zdCBzdHJ1Y3Qgb3Y3NzJ4X2NvbG9yX2Zvcm1hdCAqZm10OworCWNvbnN0IHN0cnVjdCBvdjc3Mnhfd2luX3NpemUgICAgICp3aW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOworfTsKKworI2RlZmluZSBFTkRNQVJLRVIgeyAweGZmLCAweGZmIH0KKworLyoKKyAqIHJlZ2lzdGVyIHNldHRpbmcgZm9yIGNvbG9yIGZvcm1hdAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3ZhbF9saXN0IG92NzcyeF9SR0I1NTVfcmVnc1tdID0geworCXsgQ09NMywgMHgwMCB9LAorCXsgQ09NNywgRk1UX1JHQjU1NSB8IE9GTVRfUkdCIH0sCisJRU5ETUFSS0VSLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd2YWxfbGlzdCBvdjc3MnhfUkdCNTY1X3JlZ3NbXSA9IHsKKwl7IENPTTMsIDB4MDAgfSwKKwl7IENPTTcsIEZNVF9SR0I1NjUgfCBPRk1UX1JHQiB9LAorCUVORE1BUktFUiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NzJ4X1lZVVZfcmVnc1tdID0geworCXsgQ09NMywgU1dBUF9ZVVYgfSwKKwl7IENPTTcsIE9GTVRfWVVWIH0sCisJRU5ETUFSS0VSLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd2YWxfbGlzdCBvdjc3MnhfVVZZWV9yZWdzW10gPSB7CisJeyBDT00zLCAweDAwIH0sCisJeyBDT003LCBPRk1UX1lVViB9LAorCUVORE1BUktFUiwKK307CisKKworLyoKKyAqIHJlZ2lzdGVyIHNldHRpbmcgZm9yIHdpbmRvdyBzaXplCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NzJ4X3F2Z2FfcmVnc1tdID0geworCXsgSFNUQVJULCAgIEhTVF9RVkdBIH0sCisJeyBIU0laRSwgICAgSFNaX1FWR0EgfSwKKwl7IFZTVEFSVCwgICBWU1RfUVZHQSB9LAorCXsgVlNJWkUsICAgIFZTWl9RVkdBICB9LAorCXsgSE9VVFNJWkUsIEhPU1pfUVZHQSB9LAorCXsgVk9VVFNJWkUsIFZPU1pfUVZHQSB9LAorCUVORE1BUktFUiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NzJ4X3ZnYV9yZWdzW10gPSB7CisJeyBIU1RBUlQsICAgSFNUX1ZHQSB9LAorCXsgSFNJWkUsICAgIEhTWl9WR0EgfSwKKwl7IFZTVEFSVCwgICBWU1RfVkdBIH0sCisJeyBWU0laRSwgICAgVlNaX1ZHQSB9LAorCXsgSE9VVFNJWkUsIEhPU1pfVkdBIH0sCisJeyBWT1VUU0laRSwgVk9TWl9WR0EgfSwKKwlFTkRNQVJLRVIsCit9OworCisvKgorICogc3VwcG9ydGVkIGZvcm1hdCBsaXN0CisgKi8KKworI2RlZmluZSBTRVRGT1VSQ0ModHlwZSkgLm5hbWUgPSAoI3R5cGUpLCAuZm91cmNjID0gKFY0TDJfUElYX0ZNVF8gIyMgdHlwZSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCBvdjc3MnhfZm10X2xpc3RzW10gPSB7CisJeworCQlTRVRGT1VSQ0MoWVVZViksCisJCS5kZXB0aCAgICAgID0gMTYsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJfSwKKwl7CisJCVNFVEZPVVJDQyhZVllVKSwKKwkJLmRlcHRoICAgICAgPSAxNiwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwl9LAorCXsKKwkJU0VURk9VUkNDKFVZVlkpLAorCQkuZGVwdGggICAgICA9IDE2LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCX0sCisJeworCQlTRVRGT1VSQ0MoUkdCNTU1KSwKKwkJLmRlcHRoICAgICAgPSAxNiwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwl9LAorCXsKKwkJU0VURk9VUkNDKFJHQjU1NVgpLAorCQkuZGVwdGggICAgICA9IDE2LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCX0sCisJeworCQlTRVRGT1VSQ0MoUkdCNTY1KSwKKwkJLmRlcHRoICAgICAgPSAxNiwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwl9LAorCXsKKwkJU0VURk9VUkNDKFJHQjU2NVgpLAorCQkuZGVwdGggICAgICA9IDE2LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCX0sCit9OworCisvKgorICogY29sb3IgZm9ybWF0IGxpc3QKKyAqLworI2RlZmluZSBUX1lVWVYgMAorc3RhdGljIGNvbnN0IHN0cnVjdCBvdjc3MnhfY29sb3JfZm9ybWF0IG92NzcyeF9jZm10c1tdID0geworCVtUX1lVWVZdID0geworCQlTRVRGT1VSQ0MoWVVZViksCisJCS5yZWdzICAgPSBvdjc3MnhfWVlVVl9yZWdzLAorCX0sCisJeworCQlTRVRGT1VSQ0MoWVZZVSksCisJCS5yZWdzICAgPSBvdjc3MnhfWVlVVl9yZWdzLAorCQkub3B0aW9uID0gT1BfVVYsCisJfSwKKwl7CisJCVNFVEZPVVJDQyhVWVZZKSwKKwkJLnJlZ3MgICA9IG92NzcyeF9VVllZX3JlZ3MsCisJfSwKKwl7CisJCVNFVEZPVVJDQyhSR0I1NTUpLAorCQkucmVncyAgID0gb3Y3NzJ4X1JHQjU1NV9yZWdzLAorCQkub3B0aW9uID0gT1BfU1dBUF9SR0IsCisJfSwKKwl7CisJCVNFVEZPVVJDQyhSR0I1NTVYKSwKKwkJLnJlZ3MgICA9IG92NzcyeF9SR0I1NTVfcmVncywKKwl9LAorCXsKKwkJU0VURk9VUkNDKFJHQjU2NSksCisJCS5yZWdzICAgPSBvdjc3MnhfUkdCNTY1X3JlZ3MsCisJCS5vcHRpb24gPSBPUF9TV0FQX1JHQiwKKwl9LAorCXsKKwkJU0VURk9VUkNDKFJHQjU2NVgpLAorCQkucmVncyAgID0gb3Y3NzJ4X1JHQjU2NV9yZWdzLAorCX0sCit9OworCisKKy8qCisgKiB3aW5kb3cgc2l6ZSBsaXN0CisgKi8KKyNkZWZpbmUgVkdBX1dJRFRIICAgNjQwCisjZGVmaW5lIFZHQV9IRUlHSFQgIDQ4MAorI2RlZmluZSBRVkdBX1dJRFRIICAzMjAKKyNkZWZpbmUgUVZHQV9IRUlHSFQgMjQwCisjZGVmaW5lIE1BWF9XSURUSCAgIFZHQV9XSURUSAorI2RlZmluZSBNQVhfSEVJR0hUICBWR0FfSEVJR0hUCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y3NzJ4X3dpbl9zaXplIG92NzcyeF93aW5fdmdhID0geworCS5uYW1lICAgICA9ICJWR0EiLAorCS53aWR0aCAgICA9IFZHQV9XSURUSCwKKwkuaGVpZ2h0ICAgPSBWR0FfSEVJR0hULAorCS5jb203X2JpdCA9IFNMQ1RfVkdBLAorCS5yZWdzICAgICA9IG92NzcyeF92Z2FfcmVncywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y3NzJ4X3dpbl9zaXplIG92NzcyeF93aW5fcXZnYSA9IHsKKwkubmFtZSAgICAgPSAiUVZHQSIsCisJLndpZHRoICAgID0gUVZHQV9XSURUSCwKKwkuaGVpZ2h0ICAgPSBRVkdBX0hFSUdIVCwKKwkuY29tN19iaXQgPSBTTENUX1FWR0EsCisJLnJlZ3MgICAgID0gb3Y3NzJ4X3F2Z2FfcmVncywKK307CisKKworLyoKKyAqIGdlbmVyYWwgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgaW50IG92NzcyeF93cml0ZV9hcnJheShzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgKmNsaWVudCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByZWd2YWxfbGlzdCAqdmFscykKK3sKKwl3aGlsZSAodmFscy0+cmVnX251bSAhPSAweGZmKSB7CisJCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICB2YWxzLT5yZWdfbnVtLAorCQkJCQkJICAgIHZhbHMtPnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl2YWxzKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NzcyeF9tYXNrX3NldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQkgIHU4ICBjb21tYW5kLAorCQkJCQkgIHU4ICBtYXNrLAorCQkJCQkgIHU4ICBzZXQpCit7CisJczMyIHZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGNvbW1hbmQpOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gIHNldDsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgY29tbWFuZCwgdmFsKTsKK30KKworc3RhdGljIGludCBvdjc3MnhfcmVzZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIENPTTcsIFNDQ0JfUkVTRVQpOworCW1zbGVlcCgxKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc29jX2NhbWVyYV9vcHMgZnVuY3Rpb24KKyAqLworCitzdGF0aWMgaW50IG92NzcyeF9pbml0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBvdjc3MnhfcHJpdiwgaWNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcml2LT5pbmZvLT5saW5rLnBvd2VyKSB7CisJCXJldCA9IHByaXYtPmluZm8tPmxpbmsucG93ZXIoJnByaXYtPmNsaWVudC0+ZGV2LCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwcml2LT5pbmZvLT5saW5rLnJlc2V0KQorCQlyZXQgPSBwcml2LT5pbmZvLT5saW5rLnJlc2V0KCZwcml2LT5jbGllbnQtPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NzcyeF9yZWxlYXNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBvdjc3MnhfcHJpdiwgaWNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcml2LT5pbmZvLT5saW5rLnBvd2VyKQorCQlyZXQgPSBwcml2LT5pbmZvLT5saW5rLnBvd2VyKCZwcml2LT5jbGllbnQtPmRldiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NzcyeF9zdGFydF9jYXB0dXJlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBvdjc3MnhfcHJpdiwgaWNkKTsKKwlpbnQgICAgICAgICAgICAgICAgIHJldDsKKworCWlmICghcHJpdi0+d2luKQorCQlwcml2LT53aW4gPSAmb3Y3NzJ4X3dpbl92Z2E7CisJaWYgKCFwcml2LT5mbXQpCisJCXByaXYtPmZtdCA9ICZvdjc3MnhfY2ZtdHNbVF9ZVVlWXTsKKworCS8qCisJICogcmVzZXQgaGFyZHdhcmUKKwkgKi8KKwlvdjc3MnhfcmVzZXQocHJpdi0+Y2xpZW50KTsKKworCS8qCisJICogc2V0IGNvbG9yIGZvcm1hdAorCSAqLworCXJldCA9IG92NzcyeF93cml0ZV9hcnJheShwcml2LT5jbGllbnQsIHByaXYtPmZtdC0+cmVncyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc3RhcnRfZW5kOworCisJLyoKKwkgKiBzZXQgc2l6ZSBmb3JtYXQKKwkgKi8KKwlyZXQgPSBvdjc3Mnhfd3JpdGVfYXJyYXkocHJpdi0+Y2xpZW50LCBwcml2LT53aW4tPnJlZ3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHN0YXJ0X2VuZDsKKworCS8qCisJICogc2V0IENPTTcgYml0ICggUVZHQSBvciBWR0EgKQorCSAqLworCXJldCA9IG92NzcyeF9tYXNrX3NldChwcml2LT5jbGllbnQsCisJCQkgICAgICBDT003LCBTTENUX01BU0ssIHByaXYtPndpbi0+Y29tN19iaXQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHN0YXJ0X2VuZDsKKworCS8qCisJICogc2V0IFVWIHNldHRpbmcKKwkgKi8KKwlpZiAocHJpdi0+Zm10LT5vcHRpb24gJiBPUF9VVikgeworCQlyZXQgPSBvdjc3MnhfbWFza19zZXQocHJpdi0+Y2xpZW50LAorCQkJCSAgICAgIERTUF9DVFJMMywgVVZfTUFTSywgVVZfT04pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gc3RhcnRfZW5kOworCX0KKworCS8qCisJICogc2V0IFNXQVAgc2V0dGluZworCSAqLworCWlmIChwcml2LT5mbXQtPm9wdGlvbiAmIE9QX1NXQVBfUkdCKSB7CisJCXJldCA9IG92NzcyeF9tYXNrX3NldChwcml2LT5jbGllbnQsCisJCQkJICAgICAgQ09NMywgU1dBUF9NQVNLLCBTV0FQX1JHQik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBzdGFydF9lbmQ7CisJfQorCisJZGV2X2RiZygmaWNkLT5kZXYsCisJCSAiZm9ybWF0ICVzLCB3aW4gJXNcbiIsIHByaXYtPmZtdC0+bmFtZSwgcHJpdi0+d2luLT5uYW1lKTsKKworc3RhcnRfZW5kOgorCXByaXYtPmZtdCA9IE5VTEw7CisJcHJpdi0+d2luID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NzJ4X3N0b3BfY2FwdHVyZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3Qgb3Y3NzJ4X3ByaXYsIGljZCk7CisJb3Y3NzJ4X3Jlc2V0KHByaXYtPmNsaWVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NzJ4X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJdW5zaWduZWQgbG9uZwkJICBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y3NzJ4X3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3Qgb3Y3NzJ4X3ByaXYsIGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gcHJpdi0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fTUFTVEVSIHwKKwkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8CisJCXByaXYtPmluZm8tPmJ1c3dpZHRoOworCisJcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG92NzcyeF9nZXRfY2hpcF9pZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgICAqaWQpCit7CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG92NzcyeF9wcml2LCBpY2QpOworCisJaWQtPmlkZW50ICAgID0gcHJpdi0+bW9kZWw7CisJaWQtPnJldmlzaW9uID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCBvdjc3MnhfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG92NzcyeF9wcml2LCBpY2QpOworCWludCAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKHJlZy0+cmVnID4gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCByZWctPnJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZWctPnZhbCA9IChfX3U2NClyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjc3Mnhfc2V0X3JlZ2lzdGVyKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG92NzcyeF9wcml2LCBpY2QpOworCisJaWYgKHJlZy0+cmVnID4gMHhmZiB8fAorCSAgICByZWctPnZhbCA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCByZWctPnJlZywgcmVnLT52YWwpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y3NzJ4X3dpbl9zaXplKgorb3Y3NzJ4X3NlbGVjdF93aW4odTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCV9fdTMyIGRpZmY7CisJY29uc3Qgc3RydWN0IG92NzcyeF93aW5fc2l6ZSAqd2luOworCisJLyogZGVmYXVsdCBpcyBRVkdBICovCisJZGlmZiA9IGFicyh3aWR0aCAtIG92NzcyeF93aW5fcXZnYS53aWR0aCkgKworCQlhYnMoaGVpZ2h0IC0gb3Y3NzJ4X3dpbl9xdmdhLmhlaWdodCk7CisJd2luID0gJm92NzcyeF93aW5fcXZnYTsKKworCS8qIFZHQSAqLworCWlmIChkaWZmID4KKwkgICAgYWJzKHdpZHRoICAtIG92NzcyeF93aW5fdmdhLndpZHRoKSArCisJICAgIGFicyhoZWlnaHQgLSBvdjc3Mnhfd2luX3ZnYS5oZWlnaHQpKQorCQl3aW4gPSAmb3Y3NzJ4X3dpbl92Z2E7CisKKwlyZXR1cm4gd2luOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NzJ4X3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgcGl4Zm10LAorCQkJICBzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgKnJlY3QpCit7CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG92NzcyeF9wcml2LCBpY2QpOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBpOworCisJLyoKKwkgKiBzZWxlY3QgZm9ybWF0CisJICovCisJcHJpdi0+Zm10ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvdjc3MnhfY2ZtdHMpOyBpKyspIHsKKwkJaWYgKHBpeGZtdCA9PSBvdjc3MnhfY2ZtdHNbaV0uZm91cmNjKSB7CisJCQlwcml2LT5mbXQgPSBvdjc3MnhfY2ZtdHMgKyBpOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBzZWxlY3Qgd2luCisJICovCisJcHJpdi0+d2luID0gb3Y3NzJ4X3NlbGVjdF93aW4ocmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NzcyeF90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgICAgICAgKmYpCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJY29uc3Qgc3RydWN0IG92NzcyeF93aW5fc2l6ZSAqd2luOworCisJLyoKKwkgKiBzZWxlY3Qgc3VpdGFibGUgd2luCisJICovCisJd2luID0gb3Y3NzJ4X3NlbGVjdF93aW4ocGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCisJcGl4LT53aWR0aCAgPSB3aW4tPndpZHRoOworCXBpeC0+aGVpZ2h0ID0gd2luLT5oZWlnaHQ7CisJcGl4LT5maWVsZCAgPSBWNEwyX0ZJRUxEX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjc3MnhfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG92NzcyeF9wcml2LCBpY2QpOworCXU4ICAgICAgICAgICAgICAgICAgcGlkLCB2ZXI7CisJY29uc3QgY2hhciAgICAgICAgICpkZXZuYW1lOworCisJLyoKKwkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgorCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCisJICovCisJaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKKwkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBvdjc3Mnggb25seSB1c2UgOCBvciAxMCBiaXQgYnVzIHdpZHRoCisJICovCisJaWYgKFNPQ0FNX0RBVEFXSURUSF8xMCAhPSBwcml2LT5pbmZvLT5idXN3aWR0aCAmJgorCSAgICBTT0NBTV9EQVRBV0lEVEhfOCAgIT0gcHJpdi0+aW5mby0+YnVzd2lkdGgpIHsKKwkJZGV2X2VycigmaWNkLT5kZXYsICJidXMgd2lkdGggZXJyb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpY2QtPmZvcm1hdHMgICAgID0gb3Y3NzJ4X2ZtdF9saXN0czsKKwlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRShvdjc3MnhfZm10X2xpc3RzKTsKKworCS8qCisJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECisJICovCisJcGlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHByaXYtPmNsaWVudCwgUElEKTsKKwl2ZXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCBWRVIpOworCisJc3dpdGNoIChWRVJTSU9OKHBpZCwgdmVyKSkgeworCWNhc2UgT1Y3NzIwOgorCQlkZXZuYW1lICAgICA9ICJvdjc3MjAiOworCQlwcml2LT5tb2RlbCA9IFY0TDJfSURFTlRfT1Y3NzIwOworCQlicmVhazsKKwljYXNlIE9WNzcyNToKKwkJZGV2bmFtZSAgICAgPSAib3Y3NzI1IjsKKwkJcHJpdi0+bW9kZWwgPSBWNEwyX0lERU5UX09WNzcyNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaWNkLT5kZXYsCisJCQkiUHJvZHVjdCBJRCBlcnJvciAleDoleFxuIiwgcGlkLCB2ZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXZfaW5mbygmaWNkLT5kZXYsCisJCSAiJXMgUHJvZHVjdCBJRCAlMHg6JTB4IE1hbnVmYWN0dXJlciBJRCAleDoleFxuIiwKKwkJIGRldm5hbWUsCisJCSBwaWQsCisJCSB2ZXIsCisJCSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCBNSURIKSwKKwkJIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShwcml2LT5jbGllbnQsIE1JREwpKTsKKworCisJcmV0dXJuIHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoaWNkKTsKK30KKworc3RhdGljIHZvaWQgb3Y3NzJ4X3ZpZGVvX3JlbW92ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzb2NfY2FtZXJhX3ZpZGVvX3N0b3AoaWNkKTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBvdjc3Mnhfb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQkJPSBvdjc3MnhfdmlkZW9fcHJvYmUsCisJLnJlbW92ZQkJCT0gb3Y3NzJ4X3ZpZGVvX3JlbW92ZSwKKwkuaW5pdAkJCT0gb3Y3NzJ4X2luaXQsCisJLnJlbGVhc2UJCT0gb3Y3NzJ4X3JlbGVhc2UsCisJLnN0YXJ0X2NhcHR1cmUJCT0gb3Y3NzJ4X3N0YXJ0X2NhcHR1cmUsCisJLnN0b3BfY2FwdHVyZQkJPSBvdjc3Mnhfc3RvcF9jYXB0dXJlLAorCS5zZXRfZm10CQk9IG92NzcyeF9zZXRfZm10LAorCS50cnlfZm10CQk9IG92NzcyeF90cnlfZm10LAorCS5zZXRfYnVzX3BhcmFtCQk9IG92NzcyeF9zZXRfYnVzX3BhcmFtLAorCS5xdWVyeV9idXNfcGFyYW0JPSBvdjc3MnhfcXVlcnlfYnVzX3BhcmFtLAorCS5nZXRfY2hpcF9pZAkJPSBvdjc3MnhfZ2V0X2NoaXBfaWQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nZXRfcmVnaXN0ZXIJCT0gb3Y3NzJ4X2dldF9yZWdpc3RlciwKKwkuc2V0X3JlZ2lzdGVyCQk9IG92NzcyeF9zZXRfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKKy8qCisgKiBpMmNfZHJpdmVyIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIGludCBvdjc3MnhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQoreworCXN0cnVjdCBvdjc3MnhfcHJpdiAgICAgICAgKnByaXY7CisJc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgICppY2Q7CisJc3RydWN0IGkyY19hZGFwdGVyICAgICAgICAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCQkiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0ICIKKwkJCSJJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+aW5mbyAgID0gaW5mbzsKKwlwcml2LT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcHJpdik7CisKKwlpY2QgICAgICAgICAgICAgPSAmcHJpdi0+aWNkOworCWljZC0+b3BzICAgICAgICA9ICZvdjc3Mnhfb3BzOworCWljZC0+Y29udHJvbCAgICA9ICZjbGllbnQtPmRldjsKKwlpY2QtPndpZHRoX21heCAgPSBNQVhfV0lEVEg7CisJaWNkLT5oZWlnaHRfbWF4ID0gTUFYX0hFSUdIVDsKKwlpY2QtPmlmYWNlICAgICAgPSBwcml2LT5pbmZvLT5saW5rLmJ1c19pZDsKKworCXJldCA9IHNvY19jYW1lcmFfZGV2aWNlX3JlZ2lzdGVyKGljZCk7CisKKwlpZiAocmV0KSB7CisJCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NzcyeF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXNvY19jYW1lcmFfZGV2aWNlX3VucmVnaXN0ZXIoJnByaXYtPmljZCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjc3MnhfaWRbXSA9IHsKKwl7ICJvdjc3MngiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG92NzcyeF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBvdjc3MnhfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvdjc3MngiLAorCX0sCisJLnByb2JlICAgID0gb3Y3NzJ4X3Byb2JlLAorCS5yZW1vdmUgICA9IG92NzcyeF9yZW1vdmUsCisJLmlkX3RhYmxlID0gb3Y3NzJ4X2lkLAorfTsKKworLyoKKyAqIG1vZHVsZSBmdW5jdGlvbgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IG92NzcyeF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmb3Y3NzJ4X2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Y3NzJ4X21vZHVsZV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm92NzcyeF9pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3Y3NzJ4X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG92NzcyeF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU29DIENhbWVyYSBkcml2ZXIgZm9yIG92NzcyeCIpOworTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCmluZGV4IDk5NDgwNzguLjQ1NzMwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwpAQCAtMTAsOCArMTAsOCBAQAogICoJMTQ0NzggUG90c2RhbSwgR2VybWFueQogICoKICAqCU1vc3Qgb2YgdGhpcyBjb2RlIGlzIGRpcmVjdGx5IGRlcml2ZWQgZnJvbSBoaXMgdXNlcnNwYWNlIGRyaXZlci4KLSAqCUhpcyBkcml2ZXIgd29ya3Mgc28gc2VuZCBhbnkgcmVwb3J0cyB0byBhbGFuQHJlZGhhdC5jb20gdW5sZXNzIHRoZQotICoJdXNlcnNwYWNlIGRyaXZlciBhbHNvIGRvZXNuJ3Qgd29yayBmb3IgeW91Li4uCisgKglIaXMgZHJpdmVyIHdvcmtzIHNvIHNlbmQgYW55IHJlcG9ydHMgdG8gYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrCisgKgl1bmxlc3MgdGhlIHVzZXJzcGFjZSBkcml2ZXIgYWxzbyBkb2Vzbid0IHdvcmsgZm9yIHlvdS4uLgogICoKICAqICAgICAgQ2hhbmdlczoKICAqICAgICAgMDgvMDcvMjAwMyAgICAgICAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KQEAgLTY4MCw4ICs2ODAsNyBAQAogICoJVmlkZW80bGludXggaW50ZXJmYWNpbmcKICAqLwogCi1zdGF0aWMgaW50IHBtc19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgcG1zX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgcG1zX2RldmljZSAqcGQ9KHN0cnVjdCBwbXNfZGV2aWNlICopZGV2OwpAQCAtODY2LDcgKzg2NSw3IEBACiBzdGF0aWMgaW50IHBtc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBwbXNfZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgcG1zX2RvX2lvY3RsKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcG1zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IDViODFiYTQuLjQzNTgwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0yMzk1LDcgKzIzOTUsNyBAQAogCiAJc2NucHJpbnRmKGhkdy0+YnVzX2luZm8sc2l6ZW9mKGhkdy0+YnVzX2luZm8pLAogCQkgICJ1c2IgJXMgYWRkcmVzcyAlZCIsCi0JCSAgaGR3LT51c2JfZGV2LT5kZXYuYnVzX2lkLAorCQkgIGRldl9uYW1lKCZoZHctPnVzYl9kZXYtPmRldiksCiAJCSAgaGR3LT51c2JfZGV2LT5kZXZudW0pOwogCiAJaWZudW0gPSBoZHctPnVzYl9pbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXN5c2ZzLmMKaW5kZXggNzMzNjgwZi4uZTY0MWNkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1zeXNmcy5jCkBAIC02MjgsMTAgKzYyOCwxMCBAQAogCiAJY2xhc3NfZGV2LT5jbGFzcyA9ICZjbGFzc19wdHItPmNsYXNzOwogCWlmIChwdnIyX2hkd19nZXRfc24oc2ZwLT5jaGFubmVsLmhkdykpIHsKLQkJc25wcmludGYoY2xhc3NfZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAic24tJWx1IiwKKwkJZGV2X3NldF9uYW1lKGNsYXNzX2RldiwgInNuLSVsdSIsCiAJCQkgcHZyMl9oZHdfZ2V0X3NuKHNmcC0+Y2hhbm5lbC5oZHcpKTsKIAl9IGVsc2UgaWYgKHB2cjJfaGR3X2dldF91bml0X251bWJlcihzZnAtPmNoYW5uZWwuaGR3KSA+PSAwKSB7Ci0JCXNucHJpbnRmKGNsYXNzX2Rldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgInVuaXQtJWMiLAorCQlkZXZfc2V0X25hbWUoY2xhc3NfZGV2LCAidW5pdC0lYyIsCiAJCQkgcHZyMl9oZHdfZ2V0X3VuaXRfbnVtYmVyKHNmcC0+Y2hhbm5lbC5oZHcpICsgJ2EnKTsKIAl9IGVsc2UgewogCQlrZnJlZShjbGFzc19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCmluZGV4IDk3ZWQ5NTkuLjUyYWYxYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKQEAgLTE2OCw4ICsxNjgsNyBAQAogICogVGhpcyBpcyBwYXJ0IG9mIFZpZGVvIDQgTGludXggQVBJLiBUaGUgcHJvY2VkdXJlIGhhbmRsZXMgaW9jdGwoKSBjYWxscy4KICAqCiAgKi8KLXN0YXRpYyBpbnQgX19wdnIyX3Y0bDJfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHB2cjJfdjRsMl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBwdnIyX3Y0bDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwdnIyX3Y0bDIgKnZwID0gZmgtPnZoZWFkOwpAQCAtODY0LDcgKzg2Myw3IEBACiAKIAlkZWZhdWx0IDoKIAkJcmV0ID0gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoZmlsZSwgY21kLAotCQkJCQkJIGFyZywgX19wdnIyX3Y0bDJfZG9faW9jdGwpOworCQkJCQkJIGFyZywgcHZyMl92NGwyX2RvX2lvY3RsKTsKIAl9CiAKIAlwdnIyX2hkd19jb21taXRfY3RsKGhkdyk7CkBAIC04OTAsMTIgKzg4OSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwdnIyX3Y0bDJfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JcmV0dXJuIF9fcHZyMl92NGwyX2RvX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLX0KLQogc3RhdGljIHZvaWQgcHZyMl92NGwyX2Rldl9kZXN0cm95KHN0cnVjdCBwdnIyX3Y0bDJfZGV2ICpkaXApCiB7CiAJaW50IG51bSA9IGRpcC0+ZGV2YmFzZS5udW07CkBAIC05NjMsNyArOTU2LDcgQEAKICNkZWZpbmUgSVZUVl9JT0NfR19DT0RFQyAgICAgICAgMHhGRkVFNzcwMwogI2RlZmluZSBJVlRWX0lPQ19TX0NPREVDICAgICAgICAweEZGRUU3NzA0CiAJaWYgKGNtZCA9PSBJVlRWX0lPQ19HX0NPREVDIHx8IGNtZCA9PSBJVlRWX0lPQ19TX0NPREVDKSByZXR1cm4gMDsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBwdnIyX3Y0bDJfZG9faW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgcHZyMl92NGwyX2RvX2lvY3RsKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IGYzODk3YTMuLjFjZTlkYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC0xNDEyLDcgKzE0MTIsNyBAQAogCiAJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7CiAJaWYgKCFwZGV2LT51bnBsdWdnZWQpCi0JCXIgPSB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHB3Y192aWRlb19kb19pb2N0bCk7CisJCXIgPSB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgcHdjX3ZpZGVvX2RvX2lvY3RsKTsKIAltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOwogb3V0OgogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCmluZGV4IDc2YTEzNzYuLmQ3YzE0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKQEAgLTMzNyw4ICszMzcsNyBAQAogCiB9CiAKLWludCBwd2NfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCmluZGV4IDc0MTc4NzUuLmMwNDZhMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCkBAIC0zNDAsOCArMzQwLDcgQEAKIGV4dGVybiBpbnQgcHdjX2lvY3RsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwogCiAvKiogRnVuY3Rpb25zIGluIHB3Yy12NGwuYyAqLwotZXh0ZXJuIGludCBwd2NfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworZXh0ZXJuIGludCBwd2NfdmlkZW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKIC8qKiBwd2MtdW5jb21wcmVzcy5jICovCiAvKiBFeHBhbmQgZnJhbWUgdG8gaW1hZ2UsIHBvc3NpYmx5IGluY2x1ZGluZyBkZWNvbXByZXNzaW9uLiBVc2VzIHJlYWRfZnJhbWUgYW5kIGZpbGxfaW1hZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKaW5kZXggZWI2YmU1OC4uOWQzM2RlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CkBAIC0zOSw5ICszOCwxMDYgQEAKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KIAorI2luY2x1ZGUgInB4YV9jYW1lcmEuaCIKKwogI2RlZmluZSBQWEFfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQogI2RlZmluZSBQWEFfQ0FNX0RSVl9OQU1FICJweGEyN3gtY2FtZXJhIgogCisvKiBDYW1lcmEgSW50ZXJmYWNlICovCisjZGVmaW5lIENJQ1IwCQkweDAwMDAKKyNkZWZpbmUgQ0lDUjEJCTB4MDAwNAorI2RlZmluZSBDSUNSMgkJMHgwMDA4CisjZGVmaW5lIENJQ1IzCQkweDAwMEMKKyNkZWZpbmUgQ0lDUjQJCTB4MDAxMAorI2RlZmluZSBDSVNSCQkweDAwMTQKKyNkZWZpbmUgQ0lGUgkJMHgwMDE4CisjZGVmaW5lIENJVE9SCQkweDAwMUMKKyNkZWZpbmUgQ0lCUjAJCTB4MDAyOAorI2RlZmluZSBDSUJSMQkJMHgwMDMwCisjZGVmaW5lIENJQlIyCQkweDAwMzgKKworI2RlZmluZSBDSUNSMF9ETUFFTgkoMSA8PCAzMSkJLyogRE1BIHJlcXVlc3QgZW5hYmxlICovCisjZGVmaW5lIENJQ1IwX1BBUl9FTgkoMSA8PCAzMCkJLyogUGFyaXR5IGVuYWJsZSAqLworI2RlZmluZSBDSUNSMF9TTF9DQVBfRU4JKDEgPDwgMjkpCS8qIENhcHR1cmUgZW5hYmxlIGZvciBzbGF2ZSBtb2RlICovCisjZGVmaW5lIENJQ1IwX0VOQgkoMSA8PCAyOCkJLyogQ2FtZXJhIGludGVyZmFjZSBlbmFibGUgKi8KKyNkZWZpbmUgQ0lDUjBfRElTCSgxIDw8IDI3KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgKi8KKyNkZWZpbmUgQ0lDUjBfU0lNCSgweDcgPDwgMjQpCS8qIFNlbnNvciBpbnRlcmZhY2UgbW9kZSBtYXNrICovCisjZGVmaW5lIENJQ1IwX1RPTQkoMSA8PCA5KQkvKiBUaW1lLW91dCBtYXNrICovCisjZGVmaW5lIENJQ1IwX1JEQVZNCSgxIDw8IDgpCS8qIFJlY2VpdmUtZGF0YS1hdmFpbGFibGUgbWFzayAqLworI2RlZmluZSBDSUNSMF9GRU0JKDEgPDwgNykJLyogRklGTy1lbXB0eSBtYXNrICovCisjZGVmaW5lIENJQ1IwX0VPTE0JKDEgPDwgNikJLyogRW5kLW9mLWxpbmUgbWFzayAqLworI2RlZmluZSBDSUNSMF9QRVJSTQkoMSA8PCA1KQkvKiBQYXJpdHktZXJyb3IgbWFzayAqLworI2RlZmluZSBDSUNSMF9RRE0JKDEgPDwgNCkJLyogUXVpY2stZGlzYWJsZSBtYXNrICovCisjZGVmaW5lIENJQ1IwX0NETQkoMSA8PCAzKQkvKiBEaXNhYmxlLWRvbmUgbWFzayAqLworI2RlZmluZSBDSUNSMF9TT0ZNCSgxIDw8IDIpCS8qIFN0YXJ0LW9mLWZyYW1lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfRU9GTQkoMSA8PCAxKQkvKiBFbmQtb2YtZnJhbWUgbWFzayAqLworI2RlZmluZSBDSUNSMF9GT00JKDEgPDwgMCkJLyogRklGTy1vdmVycnVuIG1hc2sgKi8KKworI2RlZmluZSBDSUNSMV9UQklUCSgxIDw8IDMxKQkvKiBUcmFuc3BhcmVuY3kgYml0ICovCisjZGVmaW5lIENJQ1IxX1JHQlRfQ09OVgkoMHgzIDw8IDI5KQkvKiBSR0JUIGNvbnZlcnNpb24gbWFzayAqLworI2RlZmluZSBDSUNSMV9QUEwJKDB4N2ZmIDw8IDE1KQkvKiBQaXhlbHMgcGVyIGxpbmUgbWFzayAqLworI2RlZmluZSBDSUNSMV9SR0JfQ09OVgkoMHg3IDw8IDEyKQkvKiBSR0IgY29udmVyc2lvbiBtYXNrICovCisjZGVmaW5lIENJQ1IxX1JHQl9GCSgxIDw8IDExKQkvKiBSR0IgZm9ybWF0ICovCisjZGVmaW5lIENJQ1IxX1lDQkNSX0YJKDEgPDwgMTApCS8qIFlDYkNyIGZvcm1hdCAqLworI2RlZmluZSBDSUNSMV9SR0JfQlBQCSgweDcgPDwgNykJLyogUkdCIGJpcyBwZXIgcGl4ZWwgbWFzayAqLworI2RlZmluZSBDSUNSMV9SQVdfQlBQCSgweDMgPDwgNSkJLyogUmF3IGJpcyBwZXIgcGl4ZWwgbWFzayAqLworI2RlZmluZSBDSUNSMV9DT0xPUl9TUAkoMHgzIDw8IDMpCS8qIENvbG9yIHNwYWNlIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfRFcJKDB4NyA8PCAwKQkvKiBEYXRhIHdpZHRoIG1hc2sgKi8KKworI2RlZmluZSBDSUNSMl9CTFcJKDB4ZmYgPDwgMjQpCS8qIEJlZ2lubmluZy1vZi1saW5lIHBpeGVsIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSMl9FTFcJKDB4ZmYgPDwgMTYpCS8qIEVuZC1vZi1saW5lIHBpeGVsIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSMl9IU1cJKDB4M2YgPDwgMTApCS8qIEhvcml6b250YWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCisjZGVmaW5lIENJQ1IyX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSMl9GU1cJKDB4NyA8PCAwKQkvKiBGcmFtZSBzdGFiaWxpemF0aW9uCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworCisjZGVmaW5lIENJQ1IzX0JGVwkoMHhmZiA8PCAyNCkJLyogQmVnaW5uaW5nLW9mLWZyYW1lIGxpbmUgY2xvY2sKKwkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCisjZGVmaW5lIENJQ1IzX0VGVwkoMHhmZiA8PCAxNikJLyogRW5kLW9mLWZyYW1lIGxpbmUgY2xvY2sKKwkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCisjZGVmaW5lIENJQ1IzX1ZTVwkoMHgzZiA8PCAxMCkJLyogVmVydGljYWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCisjZGVmaW5lIENJQ1IzX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSM19MUEYJKDB4N2ZmIDw8IDApCS8qIExpbmVzIHBlciBmcmFtZSBtYXNrICovCisKKyNkZWZpbmUgQ0lDUjRfTUNMS19ETFkJKDB4MyA8PCAyNCkJLyogTUNMSyBEYXRhIENhcHR1cmUgRGVsYXkgbWFzayAqLworI2RlZmluZSBDSUNSNF9QQ0xLX0VOCSgxIDw8IDIzKQkvKiBQaXhlbCBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgQ0lDUjRfUENQCSgxIDw8IDIyKQkvKiBQaXhlbCBjbG9jayBwb2xhcml0eSAqLworI2RlZmluZSBDSUNSNF9IU1AJKDEgPDwgMjEpCS8qIEhvcml6b250YWwgc3luYyBwb2xhcml0eSAqLworI2RlZmluZSBDSUNSNF9WU1AJKDEgPDwgMjApCS8qIFZlcnRpY2FsIHN5bmMgcG9sYXJpdHkgKi8KKyNkZWZpbmUgQ0lDUjRfTUNMS19FTgkoMSA8PCAxOSkJLyogTUNMSyBlbmFibGUgKi8KKyNkZWZpbmUgQ0lDUjRfRlJfUkFURQkoMHg3IDw8IDgpCS8qIEZyYW1lIHJhdGUgbWFzayAqLworI2RlZmluZSBDSUNSNF9ESVYJKDB4ZmYgPDwgMCkJLyogQ2xvY2sgZGl2aXNvciBtYXNrICovCisKKyNkZWZpbmUgQ0lTUl9GVE8JKDEgPDwgMTUpCS8qIEZJRk8gdGltZS1vdXQgKi8KKyNkZWZpbmUgQ0lTUl9SREFWXzIJKDEgPDwgMTQpCS8qIENoYW5uZWwgMiByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lIENJU1JfUkRBVl8xCSgxIDw8IDEzKQkvKiBDaGFubmVsIDEgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBDSVNSX1JEQVZfMAkoMSA8PCAxMikJLyogQ2hhbm5lbCAwIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgQ0lTUl9GRU1QVFlfMgkoMSA8PCAxMSkJLyogQ2hhbm5lbCAyIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUgQ0lTUl9GRU1QVFlfMQkoMSA8PCAxMCkJLyogQ2hhbm5lbCAxIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUgQ0lTUl9GRU1QVFlfMAkoMSA8PCA5KQkvKiBDaGFubmVsIDAgRklGTyBlbXB0eSAqLworI2RlZmluZSBDSVNSX0VPTAkoMSA8PCA4KQkvKiBFbmQgb2YgbGluZSAqLworI2RlZmluZSBDSVNSX1BBUl9FUlIJKDEgPDwgNykJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIENJU1JfQ1FECSgxIDw8IDYpCS8qIENhbWVyYSBpbnRlcmZhY2UgcXVpY2sgZGlzYWJsZSAqLworI2RlZmluZSBDSVNSX0NERAkoMSA8PCA1KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgZG9uZSAqLworI2RlZmluZSBDSVNSX1NPRgkoMSA8PCA0KQkvKiBTdGFydCBvZiBmcmFtZSAqLworI2RlZmluZSBDSVNSX0VPRgkoMSA8PCAzKQkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgQ0lTUl9JRk9fMgkoMSA8PCAyKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMiAqLworI2RlZmluZSBDSVNSX0lGT18xCSgxIDw8IDEpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAxICovCisjZGVmaW5lIENJU1JfSUZPXzAJKDEgPDwgMCkJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDAgKi8KKworI2RlZmluZSBDSUZSX0ZMVkwyCSgweDdmIDw8IDIzKQkvKiBGSUZPIDIgbGV2ZWwgbWFzayAqLworI2RlZmluZSBDSUZSX0ZMVkwxCSgweDdmIDw8IDE2KQkvKiBGSUZPIDEgbGV2ZWwgbWFzayAqLworI2RlZmluZSBDSUZSX0ZMVkwwCSgweGZmIDw8IDgpCS8qIEZJRk8gMCBsZXZlbCBtYXNrICovCisjZGVmaW5lIENJRlJfVEhMXzAJKDB4MyA8PCA0KQkvKiBUaHJlc2hvbGQgTGV2ZWwgZm9yIENoYW5uZWwgMCBGSUZPICovCisjZGVmaW5lIENJRlJfUkVTRVRfRgkoMSA8PCAzKQkvKiBSZXNldCBpbnB1dCBGSUZPcyAqLworI2RlZmluZSBDSUZSX0ZFTjIJKDEgPDwgMikJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMiAqLworI2RlZmluZSBDSUZSX0ZFTjEJKDEgPDwgMSkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMSAqLworI2RlZmluZSBDSUZSX0ZFTjAJKDEgPDwgMCkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMCAqLworCiAjZGVmaW5lIENJQ1IwX1NJTV9NUAkoMCA8PCAyNCkKICNkZWZpbmUgQ0lDUjBfU0lNX1NQCSgxIDw8IDI0KQogI2RlZmluZSBDSUNSMF9TSU1fTVMJKDIgPDwgMjQpCkBAIC02OSw4ICsxNjUsNiBAQAogCQkJQ0lDUjBfUEVSUk0gfCBDSUNSMF9RRE0gfCBDSUNSMF9DRE0gfCBDSUNSMF9TT0ZNIHwgXAogCQkJQ0lDUjBfRU9GTSB8IENJQ1IwX0ZPTSkKIAotc3RhdGljIERFRklORV9NVVRFWChjYW1lcmFfbG9jayk7Ci0KIC8qCiAgKiBTdHJ1Y3R1cmVzCiAgKi8KQEAgLTEyMCw3ICsyMTQsOSBAQAogCXN0cnVjdCBweGFjYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlCQkqcmVzOwogCXVuc2lnbmVkIGxvbmcJCXBsYXRmb3JtX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcJCXBsYXRmb3JtX21jbGtfMTBraHo7CisJdW5zaWduZWQgbG9uZwkJY2ljbGs7CisJdW5zaWduZWQgbG9uZwkJbWNsazsKKwl1MzIJCQltY2xrX2Rpdmlzb3I7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNhcHR1cmU7CiAKQEAgLTE0Myw4ICsyMzksNyBAQAogCQkJICAgICAgdW5zaWduZWQgaW50ICpzaXplKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJZGV2X2RiZygmaWNkLT5kZXYsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CkBAIC0xNzAsOCArMjY1LDcgQEAKIHN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCBweGFfYnVmZmVyICpidWYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9Ci0JCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKTsKIAlpbnQgaTsKQEAgLTI0Nyw4ICszNDEsNyBAQAogCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBweGFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBweGFfYnVmZmVyLCB2Yik7CiAJaW50IHJldDsKQEAgLTM2Nyw4ICs0NjAsNyBAQAogCQkJICAgICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBweGFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBweGFfYnVmZmVyLCB2Yik7CiAJc3RydWN0IHB4YV9idWZmZXIgKmFjdGl2ZTsKQEAgLTM4NSw3ICs0NzcsMTAgQEAKIAlhY3RpdmUgPSBwY2Rldi0+YWN0aXZlOwogCiAJaWYgKCFhY3RpdmUpIHsKLQkJQ0lGUiB8PSBDSUZSX1JFU0VUX0Y7CisJCXVuc2lnbmVkIGxvbmcgY2lmciwgY2ljcjA7CisKKwkJY2lmciA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lGUikgfCBDSUZSX1JFU0VUX0Y7CisJCV9fcmF3X3dyaXRlbChjaWZyLCBwY2Rldi0+YmFzZSArIENJRlIpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBwY2Rldi0+Y2hhbm5lbHM7IGkrKykgewogCQkJRERBRFIocGNkZXYtPmRtYV9jaGFuc1tpXSkgPSBidWYtPmRtYXNbaV0uc2dfZG1hOwpAQCAtMzk0LDcgKzQ4OSw5IEBACiAJCX0KIAogCQlwY2Rldi0+YWN0aXZlID0gYnVmOwotCQlDSUNSMCB8PSBDSUNSMF9FTkI7CisKKwkJY2ljcjAgPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IwKSB8IENJQ1IwX0VOQjsKKwkJX19yYXdfd3JpdGVsKGNpY3IwLCBwY2Rldi0+YmFzZSArIENJQ1IwKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgcHhhX2NhbV9kbWEgKmJ1Zl9kbWE7CiAJCXN0cnVjdCBweGFfY2FtX2RtYSAqYWN0X2RtYTsKQEAgLTQ3OCw2ICs1NzUsOCBAQAogCQkJICAgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCiAJCQkgICAgICBzdHJ1Y3QgcHhhX2J1ZmZlciAqYnVmKQogeworCXVuc2lnbmVkIGxvbmcgY2ljcjA7CisKIAkvKiBfaW5pdCBpcyB1c2VkIHRvIGRlYnVnIHJhY2VzLCBzZWUgY29tbWVudCBpbiBweGFfY2FtZXJhX3JlcWJ1ZnMoKSAqLwogCWxpc3RfZGVsX2luaXQoJnZiLT5xdWV1ZSk7CiAJdmItPnN0YXRlID0gVklERU9CVUZfRE9ORTsKQEAgLTQ5MCw3ICs1ODksOSBAQAogCQlEQ1NSKHBjZGV2LT5kbWFfY2hhbnNbMF0pID0gMDsKIAkJRENTUihwY2Rldi0+ZG1hX2NoYW5zWzFdKSA9IDA7CiAJCURDU1IocGNkZXYtPmRtYV9jaGFuc1syXSkgPSAwOwotCQlDSUNSMCAmPSB+Q0lDUjBfRU5COworCisJCWNpY3IwID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSUNSMCkgJiB+Q0lDUjBfRU5COworCQlfX3Jhd193cml0ZWwoY2ljcjAsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCQlyZXR1cm47CiAJfQogCkBAIC01MDUsNiArNjA2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBzdGF0dXMsIGNhbWVyYV9zdGF0dXMsIG92ZXJydW47CiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CisJdW5zaWduZWQgbG9uZyBjaWZyLCBjaWNyMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY2Rldi0+bG9jaywgZmxhZ3MpOwogCkBAIC01MjcsMjIgKzYyOSwyNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljYW1lcmFfc3RhdHVzID0gQ0lTUjsKKwljYW1lcmFfc3RhdHVzID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSVNSKTsKIAlvdmVycnVuID0gQ0lTUl9JRk9fMDsKIAlpZiAocGNkZXYtPmNoYW5uZWxzID09IDMpCiAJCW92ZXJydW4gfD0gQ0lTUl9JRk9fMSB8IENJU1JfSUZPXzI7CiAJaWYgKGNhbWVyYV9zdGF0dXMgJiBvdmVycnVuKSB7CiAJCWRldl9kYmcocGNkZXYtPmRldiwgIkZJRk8gb3ZlcnJ1biEgQ0lTUjogJXhcbiIsIGNhbWVyYV9zdGF0dXMpOwogCQkvKiBTdG9wIHRoZSBDYXB0dXJlIEludGVyZmFjZSAqLwotCQlDSUNSMCAmPSB+Q0lDUjBfRU5COworCQljaWNyMCA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lDUjApICYgfkNJQ1IwX0VOQjsKKwkJX19yYXdfd3JpdGVsKGNpY3IwLCBwY2Rldi0+YmFzZSArIENJQ1IwKTsKKwogCQkvKiBTdG9wIERNQSAqLwogCQlEQ1NSKGNoYW5uZWwpID0gMDsKIAkJLyogUmVzZXQgdGhlIEZJRk9zICovCi0JCUNJRlIgfD0gQ0lGUl9SRVNFVF9GOworCQljaWZyID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSUZSKSB8IENJRlJfUkVTRVRfRjsKKwkJX19yYXdfd3JpdGVsKGNpZnIsIHBjZGV2LT5iYXNlICsgQ0lGUik7CiAJCS8qIEVuYWJsZSBFbmQtT2YtRnJhbWUgSW50ZXJydXB0ICovCi0JCUNJQ1IwICY9IH5DSUNSMF9FT0ZNOworCQljaWNyMCAmPSB+Q0lDUjBfRU9GTTsKKwkJX19yYXdfd3JpdGVsKGNpY3IwLCBwY2Rldi0+YmFzZSArIENJQ1IwKTsKIAkJLyogUmVzdGFydCB0aGUgQ2FwdHVyZSBJbnRlcmZhY2UgKi8KLQkJQ0lDUjAgfD0gQ0lDUjBfRU5COworCQlfX3Jhd193cml0ZWwoY2ljcjAgfCBDSUNSMF9FTkIsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTU5OCwyNCArNzA0LDQzIEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBweGFfYnVmZmVyKSwgaWNkKTsKIH0KIAotc3RhdGljIGludCBtY2xrX2dldF9kaXZpc29yKHN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYpCitzdGF0aWMgdTMyIG1jbGtfZ2V0X2Rpdmlzb3Ioc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldikKIHsKLQl1bnNpZ25lZCBpbnQgbWNsa18xMGtoeiA9IHBjZGV2LT5wbGF0Zm9ybV9tY2xrXzEwa2h6OwotCXVuc2lnbmVkIGxvbmcgZGl2OworCXVuc2lnbmVkIGxvbmcgbWNsayA9IHBjZGV2LT5tY2xrOworCXUzMiBkaXY7CiAJdW5zaWduZWQgbG9uZyBsY2RjbGs7CiAKLQlsY2RjbGsgPSBjbGtfZ2V0X3JhdGUocGNkZXYtPmNsaykgLyAxMDAwMDsKKwlsY2RjbGsgPSBjbGtfZ2V0X3JhdGUocGNkZXYtPmNsayk7CisJcGNkZXYtPmNpY2xrID0gbGNkY2xrOwogCi0JLyogV2UgdmVyaWZ5IHBsYXRmb3JtX21jbGtfMTBraHogIT0gMCwgc28gaWYgYW55b25lIGJyZWFrcyBpdCwgaGVyZQotCSAqIHRoZXkgZ2V0IGEgbmljZSBPb3BzICovCi0JZGl2ID0gKGxjZGNsayArIDIgKiBtY2xrXzEwa2h6IC0gMSkgLyAoMiAqIG1jbGtfMTBraHopIC0gMTsKKwkvKiBtY2xrIDw9IGNpY2xrIC8gNCAoMjcuNC4yKSAqLworCWlmIChtY2xrID4gbGNkY2xrIC8gNCkgeworCQltY2xrID0gbGNkY2xrIC8gNDsKKwkJZGV2X3dhcm4ocGNkZXYtPmRldiwgIkxpbWl0aW5nIG1hc3RlciBjbG9jayB0byAlbHVcbiIsIG1jbGspOworCX0KIAotCWRldl9kYmcocGNkZXYtPmRldiwgIkxDRCBjbG9jayAlbHVrSHosIHRhcmdldCBmcmVxICVka0h6LCAiCi0JCSJkaXZpc29yICVsdVxuIiwgbGNkY2xrICogMTAsIG1jbGtfMTBraHogKiAxMCwgZGl2KTsKKwkvKiBXZSB2ZXJpZnkgbWNsayAhPSAwLCBzbyBpZiBhbnlvbmUgYnJlYWtzIGl0LCBoZXJlIGNvbWVzIHRoZWlyIE9vcHMgKi8KKwlkaXYgPSAobGNkY2xrICsgMiAqIG1jbGsgLSAxKSAvICgyICogbWNsaykgLSAxOworCisJLyogSWYgd2UncmUgbm90IHN1cHBseWluZyBNQ0xLLCBsZWF2ZSBpdCBhdCAwICovCisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfTUNMS19FTikKKwkJcGNkZXYtPm1jbGsgPSBsY2RjbGsgLyAoMiAqIChkaXYgKyAxKSk7CisKKwlkZXZfZGJnKHBjZGV2LT5kZXYsICJMQ0QgY2xvY2sgJWx1SHosIHRhcmdldCBmcmVxICVsdUh6LCAiCisJCSJkaXZpc29yICV1XG4iLCBsY2RjbGssIG1jbGssIGRpdik7CiAKIAlyZXR1cm4gZGl2OwogfQogCitzdGF0aWMgdm9pZCByZWNhbGN1bGF0ZV9maWZvX3RpbWVvdXQoc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGNsaykKK3sKKwkvKiBXZSB3YW50IGEgdGltZW91dCA+IDEgcGl4ZWwgdGltZSwgbm90ICI+PSIgKi8KKwl1MzIgY2ljbGtfcGVyX3BpeGVsID0gcGNkZXYtPmNpY2xrIC8gcGNsayArIDE7CisKKwlfX3Jhd193cml0ZWwoY2ljbGtfcGVyX3BpeGVsLCBwY2Rldi0+YmFzZSArIENJVE9SKTsKK30KKwogc3RhdGljIHZvaWQgcHhhX2NhbWVyYV9hY3RpdmF0ZShzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2KQogewogCXN0cnVjdCBweGFjYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwY2Rldi0+cGRhdGE7CkBAIC02MjksNyArNzU0LDggQEAKIAkJcGRhdGEtPmluaXQocGNkZXYtPmRldik7CiAJfQogCi0JQ0lDUjAgPSAweDNGRjsgICAvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCV9fcmF3X3dyaXRlbCgweDNmZiwgcGNkZXYtPmJhc2UgKyBDSUNSMCk7CiAKIAlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9QQ0xLX0VOKQogCQljaWNyNCB8PSBDSUNSNF9QQ0xLX0VOOwpAQCAtNjQyLDcgKzc2OCwxNCBAQAogCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX1ZTUCkKIAkJY2ljcjQgfD0gQ0lDUjRfVlNQOwogCi0JQ0lDUjQgPSBtY2xrX2dldF9kaXZpc29yKHBjZGV2KSB8IGNpY3I0OworCV9fcmF3X3dyaXRlbChwY2Rldi0+bWNsa19kaXZpc29yIHwgY2ljcjQsIHBjZGV2LT5iYXNlICsgQ0lDUjQpOworCisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfTUNMS19FTikKKwkJLyogSW5pdGlhbGlzZSB0aGUgdGltZW91dCB1bmRlciB0aGUgYXNzdW1wdGlvbiBwY2xrID0gbWNsayAqLworCQlyZWNhbGN1bGF0ZV9maWZvX3RpbWVvdXQocGNkZXYsIHBjZGV2LT5tY2xrKTsKKwllbHNlCisJCS8qICJTYWZlIGRlZmF1bHQiIC0gMTNNSHogKi8KKwkJcmVjYWxjdWxhdGVfZmlmb190aW1lb3V0KHBjZGV2LCAxMzAwMDAwMCk7CiAKIAljbGtfZW5hYmxlKHBjZGV2LT5jbGspOwogfQpAQCAtNjU1LDE0ICs3ODgsMTUgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBweGFfY2FtZXJhX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBkYXRhOwotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBDSVNSOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzLCBjaWNyMDsKIAotCWRldl9kYmcocGNkZXYtPmRldiwgIkNhbWVyYSBpbnRlcnJ1cHQgc3RhdHVzIDB4JXhcbiIsIHN0YXR1cyk7CisJc3RhdHVzID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSVNSKTsKKwlkZXZfZGJnKHBjZGV2LT5kZXYsICJDYW1lcmEgaW50ZXJydXB0IHN0YXR1cyAweCVseFxuIiwgc3RhdHVzKTsKIAogCWlmICghc3RhdHVzKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlDSVNSID0gc3RhdHVzOworCV9fcmF3X3dyaXRlbChzdGF0dXMsIHBjZGV2LT5iYXNlICsgQ0lTUik7CiAKIAlpZiAoc3RhdHVzICYgQ0lTUl9FT0YpIHsKIAkJaW50IGk7CkBAIC02NzEsMjIgKzgwNSwyNCBAQAogCQkJCXBjZGV2LT5hY3RpdmUtPmRtYXNbaV0uc2dfZG1hOwogCQkJRENTUihwY2Rldi0+ZG1hX2NoYW5zW2ldKSA9IERDU1JfUlVOOwogCQl9Ci0JCUNJQ1IwIHw9IENJQ1IwX0VPRk07CisJCWNpY3IwID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSUNSMCkgfCBDSUNSMF9FT0ZNOworCQlfX3Jhd193cml0ZWwoY2ljcjAsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFic29sdXRlbHkgZGVwZW5kIG9uIHRoZSBmYWN0LCB0aGF0Ci0gKiB0aGVyZSBjYW4gYmUgb25seSBvbmUgY2FtZXJhIG9uIFBYQSBxdWljayBjYXB0dXJlIGludGVyZmFjZSAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhYnNvbHV0ZWx5IGRlcGVuZCBvbiB0aGUgZmFjdCwgdGhhdAorICogdGhlcmUgY2FuIGJlIG9ubHkgb25lIGNhbWVyYSBvbiBQWEEgcXVpY2sgY2FwdHVyZSBpbnRlcmZhY2UKKyAqIENhbGxlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQKKyAqLwogc3RhdGljIGludCBweGFfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmY2FtZXJhX2xvY2spOwotCiAJaWYgKHBjZGV2LT5pY2QpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVidXN5OwpAQCAtNzAyLDExICs4MzgsMTAgQEAKIAkJcGNkZXYtPmljZCA9IGljZDsKIAogZWJ1c3k6Ci0JbXV0ZXhfdW5sb2NrKCZjYW1lcmFfbG9jayk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCisvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBweGFfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CkBAIC03MTgsNyArODUzLDcgQEAKIAkJIGljZC0+ZGV2bnVtKTsKIAogCS8qIGRpc2FibGUgY2FwdHVyZSwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JQ0lDUjAgPSAweDNmZjsKKwlfX3Jhd193cml0ZWwoMHgzZmYsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCiAJLyogU3RvcCBETUEgZW5naW5lICovCiAJRENTUihwY2Rldi0+ZG1hX2NoYW5zWzBdKSA9IDA7CkBAIC03NjUsNiArOTAwLDkgQEAKIAkJaWYgKCEocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfOCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF84OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTc3MiwxMSArOTEwLDEwIEBACiAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGR3LCBicHAsIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7Ci0JdTMyIGNpY3IwLCBjaWNyMSwgY2ljcjQgPSAwOworCXUzMiBjaWNyMCwgY2ljcjEsIGNpY3IyLCBjaWNyMywgY2ljcjQgPSAwOwogCWludCByZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKHBjZGV2LCBpY2QtPmJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKIAogCWlmIChyZXQgPCAwKQpAQCAtODIzLDEyICs5NjAsMTAgQEAKIAkgKiBXZSBmaXggYml0LXBlci1waXhlbCBlcXVhbCB0byBkYXRhLXdpZHRoLi4uICovCiAJc3dpdGNoIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykgewogCWNhc2UgU09DQU1fREFUQVdJRFRIXzEwOgotCQlpY2QtPmJ1c3dpZHRoID0gMTA7CiAJCWR3ID0gNDsKIAkJYnBwID0gMHg0MDsKIAkJYnJlYWs7CiAJY2FzZSBTT0NBTV9EQVRBV0lEVEhfOToKLQkJaWNkLT5idXN3aWR0aCA9IDk7CiAJCWR3ID0gMzsKIAkJYnBwID0gMHgyMDsKIAkJYnJlYWs7CkBAIC04MzYsNyArOTcxLDYgQEAKIAkJLyogQWN0dWFsbHkgaXQgY2FuIG9ubHkgYmUgOCBub3csCiAJCSAqIGRlZmF1bHQgaXMganVzdCB0byBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzICovCiAJY2FzZSBTT0NBTV9EQVRBV0lEVEhfODoKLQkJaWNkLT5idXN3aWR0aCA9IDg7CiAJCWR3ID0gMjsKIAkJYnBwID0gMDsKIAl9CkBAIC04NTIsOSArOTg2LDkgQEAKIAlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKIAkJY2ljcjQgfD0gQ0lDUjRfVlNQOwogCi0JY2ljcjAgPSBDSUNSMDsKKwljaWNyMCA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCWlmIChjaWNyMCAmIENJQ1IwX0VOQikKLQkJQ0lDUjAgPSBjaWNyMCAmIH5DSUNSMF9FTkI7CisJCV9fcmF3X3dyaXRlbChjaWNyMCAmIH5DSUNSMF9FTkIsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCiAJY2ljcjEgPSBDSUNSMV9QUExfVkFMKGljZC0+d2lkdGggLSAxKSB8IGJwcCB8IGR3OwogCkBAIC04NjIsNyArOTk2LDE3IEBACiAJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKIAkJcGNkZXYtPmNoYW5uZWxzID0gMzsKIAkJY2ljcjEgfD0gQ0lDUjFfWUNCQ1JfRjsKKwkJLyoKKwkJICogTm9ybWFsbHksIHB4YSBidXMgd2FudHMgYXMgaW5wdXQgVVlWWSBmb3JtYXQuIFdlIGFsbG93IGFsbAorCQkgKiByZW9yZGVyaW5ncyBvZiB0aGUgWVVWNDIyIGZvcm1hdCwgYXMgbm8gcHJvY2Vzc2luZyBpcyBkb25lLAorCQkgKiBhbmQgdGhlIFlVViBzdHJlYW0gaXMganVzdCBwYXNzZWQgdGhyb3VnaCB3aXRob3V0IGFueQorCQkgKiB0cmFuc2Zvcm1hdGlvbi4gTm90ZSB0aGF0IFVZVlkgaXMgdGhlIG9ubHkgZm9ybWF0IHRoYXQKKwkJICogc2hvdWxkIGJlIHVzZWQgaWYgcHhhIGZyYW1lYnVmZmVyIE92ZXJsYXkyIGlzIHVzZWQuCisJCSAqLworCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJY2FzZSBWNEwyX1BJWF9GTVRfVllVWToKIAljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6CiAJCWNpY3IxIHw9IENJQ1IxX0NPTE9SX1NQX1ZBTCgyKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgpAQCAtODc0LDI3ICsxMDE4LDMyIEBACiAJCWJyZWFrOwogCX0KIAotCUNJQ1IxID0gY2ljcjE7Ci0JQ0lDUjIgPSAwOwotCUNJQ1IzID0gQ0lDUjNfTFBGX1ZBTChpY2QtPmhlaWdodCAtIDEpIHwKKwljaWNyMiA9IDA7CisJY2ljcjMgPSBDSUNSM19MUEZfVkFMKGljZC0+aGVpZ2h0IC0gMSkgfAogCQlDSUNSM19CRldfVkFMKG1pbigodW5zaWduZWQgc2hvcnQpMjU1LCBpY2QtPnlfc2tpcF90b3ApKTsKLQlDSUNSNCA9IG1jbGtfZ2V0X2Rpdmlzb3IocGNkZXYpIHwgY2ljcjQ7CisJY2ljcjQgfD0gcGNkZXYtPm1jbGtfZGl2aXNvcjsKKworCV9fcmF3X3dyaXRlbChjaWNyMSwgcGNkZXYtPmJhc2UgKyBDSUNSMSk7CisJX19yYXdfd3JpdGVsKGNpY3IyLCBwY2Rldi0+YmFzZSArIENJQ1IyKTsKKwlfX3Jhd193cml0ZWwoY2ljcjMsIHBjZGV2LT5iYXNlICsgQ0lDUjMpOworCV9fcmF3X3dyaXRlbChjaWNyNCwgcGNkZXYtPmJhc2UgKyBDSUNSNCk7CiAKIAkvKiBDSUYgaW50ZXJydXB0cyBhcmUgbm90IHVzZWQsIG9ubHkgRE1BICovCi0JQ0lDUjAgPSAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9NQVNURVIgPwotCQkgQ0lDUjBfU0lNX01QIDogKENJQ1IwX1NMX0NBUF9FTiB8IENJQ1IwX1NJTV9TUCkpIHwKLQkJQ0lDUjBfRE1BRU4gfCBDSUNSMF9JUlFfTUFTSyB8IChjaWNyMCAmIENJQ1IwX0VOQik7CisJY2ljcjAgPSAoY2ljcjAgJiBDSUNSMF9FTkIpIHwgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfTUFTVEVSID8KKwkJQ0lDUjBfU0lNX01QIDogKENJQ1IwX1NMX0NBUF9FTiB8IENJQ1IwX1NJTV9TUCkpOworCWNpY3IwIHw9IENJQ1IwX0RNQUVOIHwgQ0lDUjBfSVJRX01BU0s7CisJX19yYXdfd3JpdGVsKGNpY3IwLCBwY2Rldi0+YmFzZSArIENJQ1IwKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB4YV9jYW1lcmFfdHJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgX191MzIgcGl4Zm10KQorc3RhdGljIGludCBweGFfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzOwotCWludCByZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKHBjZGV2LCBpY2QtPmJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKKwlpbnQgcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShwY2RldiwgYnVzd2lkdGgsICZidXNfZmxhZ3MpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC05MDQsMjggKzEwNTMsMjEwIEBACiAJcmV0dXJuIHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpID8gMCA6IC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zZXRfZm10X2NhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgIF9fdTMyIHBpeGZtdCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCBweGFfY2FtZXJhX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJQbGFuYXIgWVVWNDIyIDE2IGJpdCIsCisJCS5kZXB0aAkJPSAxNiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfWVVWNDIyUCwKKwkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwl9LAorfTsKKworc3RhdGljIGJvb2wgYnVzd2lkdGhfc3VwcG9ydGVkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBpbnQgZGVwdGgpCiB7Ci0JcmV0dXJuIGljZC0+b3BzLT5zZXRfZm10X2NhcChpY2QsIHBpeGZtdCwgcmVjdCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKworCXN3aXRjaCAoZGVwdGgpIHsKKwljYXNlIDg6CisJCXJldHVybiAhIShwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF84KTsKKwljYXNlIDk6CisJCXJldHVybiAhIShwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX0RBVEFXSURUSF85KTsKKwljYXNlIDEwOgorCQlyZXR1cm4gISEocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfMTApOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2NhbWVyYV90cnlfZm10X2NhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgcmVxdWlyZWRfYnVzd2lkdGgoY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmZtdCkKIHsKLQkvKiBsaW1pdCB0byBweGEgaGFyZHdhcmUgY2FwYWJpbGl0aWVzICovCi0JaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgMzIpCi0JCWYtPmZtdC5waXguaGVpZ2h0ID0gMzI7Ci0JaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gMjA0OCkKLQkJZi0+Zm10LnBpeC5oZWlnaHQgPSAyMDQ4OwotCWlmIChmLT5mbXQucGl4LndpZHRoIDwgNDgpCi0JCWYtPmZtdC5waXgud2lkdGggPSA0ODsKLQlpZiAoZi0+Zm10LnBpeC53aWR0aCA+IDIwNDgpCi0JCWYtPmZtdC5waXgud2lkdGggPSAyMDQ4OwotCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDE7CisJc3dpdGNoIChmbXQtPmZvdXJjYykgeworCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJY2FzZSBWNEwyX1BJWF9GTVRfVllVWToKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6CisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKwkJcmV0dXJuIDg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZtdC0+ZGVwdGg7CisJfQorfQogCitzdGF0aWMgaW50IHB4YV9jYW1lcmFfZ2V0X2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGludCBpZHgsCisJCQkJICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCWludCBmb3JtYXRzID0gMCwgYnVzd2lkdGgsIHJldDsKKworCWJ1c3dpZHRoID0gcmVxdWlyZWRfYnVzd2lkdGgoaWNkLT5mb3JtYXRzICsgaWR4KTsKKworCWlmICghYnVzd2lkdGhfc3VwcG9ydGVkKGljZCwgYnVzd2lkdGgpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHB4YV9jYW1lcmFfdHJ5X2J1c19wYXJhbShpY2QsIGJ1c3dpZHRoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGljZC0+Zm9ybWF0c1tpZHhdLmZvdXJjYykgeworCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJCWZvcm1hdHMrKzsKKwkJaWYgKHhsYXRlKSB7CisJCQl4bGF0ZS0+aG9zdF9mbXQgPSAmcHhhX2NhbWVyYV9mb3JtYXRzWzBdOworCQkJeGxhdGUtPmNhbV9mbXQgPSBpY2QtPmZvcm1hdHMgKyBpZHg7CisJCQl4bGF0ZS0+YnVzd2lkdGggPSBidXN3aWR0aDsKKwkJCXhsYXRlKys7CisJCQlkZXZfZGJnKCZpY2ktPmRldiwgIlByb3ZpZGluZyBmb3JtYXQgJXMgdXNpbmcgJXNcbiIsCisJCQkJcHhhX2NhbWVyYV9mb3JtYXRzWzBdLm5hbWUsCisJCQkJaWNkLT5mb3JtYXRzW2lkeF0ubmFtZSk7CisJCX0KKwljYXNlIFY0TDJfUElYX0ZNVF9WWVVZOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisJY2FzZSBWNEwyX1BJWF9GTVRfWVZZVToKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorCQlmb3JtYXRzKys7CisJCWlmICh4bGF0ZSkgeworCQkJeGxhdGUtPmhvc3RfZm10ID0gaWNkLT5mb3JtYXRzICsgaWR4OworCQkJeGxhdGUtPmNhbV9mbXQgPSBpY2QtPmZvcm1hdHMgKyBpZHg7CisJCQl4bGF0ZS0+YnVzd2lkdGggPSBidXN3aWR0aDsKKwkJCXhsYXRlKys7CisJCQlkZXZfZGJnKCZpY2ktPmRldiwgIlByb3ZpZGluZyBmb3JtYXQgJXMgcGFja2VkXG4iLAorCQkJCWljZC0+Zm9ybWF0c1tpZHhdLm5hbWUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEdlbmVyaWMgcGFzcy10aHJvdWdoICovCisJCWZvcm1hdHMrKzsKKwkJaWYgKHhsYXRlKSB7CisJCQl4bGF0ZS0+aG9zdF9mbXQgPSBpY2QtPmZvcm1hdHMgKyBpZHg7CisJCQl4bGF0ZS0+Y2FtX2ZtdCA9IGljZC0+Zm9ybWF0cyArIGlkeDsKKwkJCXhsYXRlLT5idXN3aWR0aCA9IGljZC0+Zm9ybWF0c1tpZHhdLmRlcHRoOworCQkJeGxhdGUrKzsKKwkJCWRldl9kYmcoJmljaS0+ZGV2LAorCQkJCSJQcm92aWRpbmcgZm9ybWF0ICVzIGluIHBhc3MtdGhyb3VnaCBtb2RlXG4iLAorCQkJCWljZC0+Zm9ybWF0c1tpZHhdLm5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIGZvcm1hdHM7Cit9CisKK3N0YXRpYyBpbnQgcHhhX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgX191MzIgcGl4Zm10LCBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmhvc3RfZm10LCAqY2FtX2ZtdCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9zZW5zZSBzZW5zZSA9IHsKKwkJLm1hc3Rlcl9jbG9jayA9IHBjZGV2LT5tY2xrLAorCQkucGl4ZWxfY2xvY2tfbWF4ID0gcGNkZXYtPmNpY2xrIC8gNCwKKwl9OworCWludCByZXQsIGJ1c3dpZHRoOworCisJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CisJaWYgKCF4bGF0ZSkgeworCQlkZXZfd2FybigmaWNpLT5kZXYsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidXN3aWR0aCA9IHhsYXRlLT5idXN3aWR0aDsKKwlob3N0X2ZtdCA9IHhsYXRlLT5ob3N0X2ZtdDsKKwljYW1fZm10ID0geGxhdGUtPmNhbV9mbXQ7CisKKwkvKiBJZiBQQ0xLIGlzIHVzZWQgdG8gbGF0Y2ggZGF0YSBmcm9tIHRoZSBzZW5zb3IsIGNoZWNrIHNlbnNlICovCisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfUENMS19FTikKKwkJaWNkLT5zZW5zZSA9ICZzZW5zZTsKKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSAwOgkJCQkvKiBPbmx5IGdlb21ldHJ5IGNoYW5nZSAqLworCQlyZXQgPSBpY2QtPm9wcy0+c2V0X2ZtdChpY2QsIHBpeGZtdCwgcmVjdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IGljZC0+b3BzLT5zZXRfZm10KGljZCwgY2FtX2ZtdC0+Zm91cmNjLCByZWN0KTsKKwl9CisKKwlpY2QtPnNlbnNlID0gTlVMTDsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl93YXJuKCZpY2ktPmRldiwgIkZhaWxlZCB0byBjb25maWd1cmUgZm9yIGZvcm1hdCAleFxuIiwKKwkJCSBwaXhmbXQpOworCX0gZWxzZSBpZiAoc2Vuc2UuZmxhZ3MgJiBTT0NBTV9TRU5TRV9QQ0xLX0NIQU5HRUQpIHsKKwkJaWYgKHNlbnNlLnBpeGVsX2Nsb2NrID4gc2Vuc2UucGl4ZWxfY2xvY2tfbWF4KSB7CisJCQlkZXZfZXJyKCZpY2ktPmRldiwKKwkJCQkicGl4ZWwgY2xvY2sgJWx1IHNldCBieSB0aGUgY2FtZXJhIHRvbyBoaWdoISIsCisJCQkJc2Vuc2UucGl4ZWxfY2xvY2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmVjYWxjdWxhdGVfZmlmb190aW1lb3V0KHBjZGV2LCBzZW5zZS5waXhlbF9jbG9jayk7CisJfQorCisJaWYgKHBpeGZtdCAmJiAhcmV0KSB7CisJCWljZC0+YnVzd2lkdGggPSBidXN3aWR0aDsKKwkJaWNkLT5jdXJyZW50X2ZtdCA9IGhvc3RfZm10OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhX2NhbWVyYV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJX191MzIgcGl4Zm10ID0gcGl4LT5waXhlbGZvcm1hdDsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJaW50IHJldDsKKworCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOworCWlmICgheGxhdGUpIHsKKwkJZGV2X3dhcm4oJmljaS0+ZGV2LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbGltaXQgdG8gcHhhIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLworCWlmIChwaXgtPmhlaWdodCA8IDMyKQorCQlwaXgtPmhlaWdodCA9IDMyOworCWlmIChwaXgtPmhlaWdodCA+IDIwNDgpCisJCXBpeC0+aGVpZ2h0ID0gMjA0ODsKKwlpZiAocGl4LT53aWR0aCA8IDQ4KQorCQlwaXgtPndpZHRoID0gNDg7CisJaWYgKHBpeC0+d2lkdGggPiAyMDQ4KQorCQlwaXgtPndpZHRoID0gMjA0ODsKKwlwaXgtPndpZHRoICY9IH4weDAxOworCisJcGl4LT5ieXRlc3BlcmxpbmUgPSBwaXgtPndpZHRoICoKKwkJRElWX1JPVU5EX1VQKHhsYXRlLT5ob3N0X2ZtdC0+ZGVwdGgsIDgpOworCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKKworCS8qIGNhbWVyYSBoYXMgdG8gc2VlIGl0cyBmb3JtYXQsIGJ1dCB0aGUgdXNlciB0aGUgb3JpZ2luYWwgb25lICovCisJcGl4LT5waXhlbGZvcm1hdCA9IHhsYXRlLT5jYW1fZm10LT5mb3VyY2M7CiAJLyogbGltaXQgdG8gc2Vuc29yIGNhcGFiaWxpdGllcyAqLwotCXJldHVybiBpY2QtPm9wcy0+dHJ5X2ZtdF9jYXAoaWNkLCBmKTsKKwlyZXQgPSBpY2QtPm9wcy0+dHJ5X2ZtdChpY2QsIGYpOworCXBpeC0+cGl4ZWxmb3JtYXQgPSB4bGF0ZS0+aG9zdF9mbXQtPmZvdXJjYzsKKworCWZpZWxkID0gcGl4LT5maWVsZDsKKworCWlmIChmaWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkgeworCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCX0gZWxzZSBpZiAoZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSB7CisJCWRldl9lcnIoJmljZC0+ZGV2LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsIGZpZWxkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBweGFfY2FtZXJhX3JlcWJ1ZnMoc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmLApAQCAtOTc3LDE2ICsxMzA4LDE1IEBACiAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlpbnQgaSA9IDAsIHJldCA9IDA7CiAKLQlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBDSUNSMDsKLQlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBDSUNSMTsKLQlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBDSUNSMjsKLQlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBDSUNSMzsKLQlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBDSUNSNDsKKwlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IwKTsKKwlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IxKTsKKwlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IyKTsKKwlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IzKTsKKwlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1I0KTsKIAogCWlmICgocGNkZXYtPmljZCkgJiYgKHBjZGV2LT5pY2QtPm9wcy0+c3VzcGVuZCkpCiAJCXJldCA9IHBjZGV2LT5pY2QtPm9wcy0+c3VzcGVuZChwY2Rldi0+aWNkLCBzdGF0ZSk7CkBAIC05OTYsOCArMTMyNiw3IEBACiAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlpbnQgaSA9IDAsIHJldCA9IDA7CiAKQEAgLTEwMDUsMjMgKzEzMzQsMjcgQEAKIAlEUkNNUig2OSkgPSBwY2Rldi0+ZG1hX2NoYW5zWzFdIHwgRFJDTVJfTUFQVkxEOwogCURSQ01SKDcwKSA9IHBjZGV2LT5kbWFfY2hhbnNbMl0gfCBEUkNNUl9NQVBWTEQ7CiAKLQlDSUNSMCA9IHBjZGV2LT5zYXZlX2NpY3JbaSsrXSAmIH5DSUNSMF9FTkI7Ci0JQ0lDUjEgPSBwY2Rldi0+c2F2ZV9jaWNyW2krK107Ci0JQ0lDUjIgPSBwY2Rldi0+c2F2ZV9jaWNyW2krK107Ci0JQ0lDUjMgPSBwY2Rldi0+c2F2ZV9jaWNyW2krK107Ci0JQ0lDUjQgPSBwY2Rldi0+c2F2ZV9jaWNyW2krK107CisJX19yYXdfd3JpdGVsKHBjZGV2LT5zYXZlX2NpY3JbaSsrXSAmIH5DSUNSMF9FTkIsIHBjZGV2LT5iYXNlICsgQ0lDUjApOworCV9fcmF3X3dyaXRlbChwY2Rldi0+c2F2ZV9jaWNyW2krK10sIHBjZGV2LT5iYXNlICsgQ0lDUjEpOworCV9fcmF3X3dyaXRlbChwY2Rldi0+c2F2ZV9jaWNyW2krK10sIHBjZGV2LT5iYXNlICsgQ0lDUjIpOworCV9fcmF3X3dyaXRlbChwY2Rldi0+c2F2ZV9jaWNyW2krK10sIHBjZGV2LT5iYXNlICsgQ0lDUjMpOworCV9fcmF3X3dyaXRlbChwY2Rldi0+c2F2ZV9jaWNyW2krK10sIHBjZGV2LT5iYXNlICsgQ0lDUjQpOwogCiAJaWYgKChwY2Rldi0+aWNkKSAmJiAocGNkZXYtPmljZC0+b3BzLT5yZXN1bWUpKQogCQlyZXQgPSBwY2Rldi0+aWNkLT5vcHMtPnJlc3VtZShwY2Rldi0+aWNkKTsKIAogCS8qIFJlc3RhcnQgZnJhbWUgY2FwdHVyZSBpZiBhY3RpdmUgYnVmZmVyIGV4aXN0cyAqLwogCWlmICghcmV0ICYmIHBjZGV2LT5hY3RpdmUpIHsKKwkJdW5zaWduZWQgbG9uZyBjaWZyLCBjaWNyMDsKKwogCQkvKiBSZXNldCB0aGUgRklGT3MgKi8KLQkJQ0lGUiB8PSBDSUZSX1JFU0VUX0Y7Ci0JCS8qIEVuYWJsZSBFbmQtT2YtRnJhbWUgSW50ZXJydXB0ICovCi0JCUNJQ1IwICY9IH5DSUNSMF9FT0ZNOwotCQkvKiBSZXN0YXJ0IHRoZSBDYXB0dXJlIEludGVyZmFjZSAqLwotCQlDSUNSMCB8PSBDSUNSMF9FTkI7CisJCWNpZnIgPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJRlIpIHwgQ0lGUl9SRVNFVF9GOworCQlfX3Jhd193cml0ZWwoY2lmciwgcGNkZXYtPmJhc2UgKyBDSUZSKTsKKworCQljaWNyMCA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lDUjApOworCQljaWNyMCAmPSB+Q0lDUjBfRU9GTTsJLyogRW5hYmxlIEVuZC1PZi1GcmFtZSBJbnRlcnJ1cHQgKi8KKwkJY2ljcjAgfD0gQ0lDUjBfRU5COwkvKiBSZXN0YXJ0IHRoZSBDYXB0dXJlIEludGVyZmFjZSAqLworCQlfX3Jhd193cml0ZWwoY2ljcjAsIHBjZGV2LT5iYXNlICsgQ0lDUjApOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xMDMzLDEzICsxMzY2LDEzIEBACiAJLnJlbW92ZQkJPSBweGFfY2FtZXJhX3JlbW92ZV9kZXZpY2UsCiAJLnN1c3BlbmQJPSBweGFfY2FtZXJhX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBweGFfY2FtZXJhX3Jlc3VtZSwKLQkuc2V0X2ZtdF9jYXAJPSBweGFfY2FtZXJhX3NldF9mbXRfY2FwLAotCS50cnlfZm10X2NhcAk9IHB4YV9jYW1lcmFfdHJ5X2ZtdF9jYXAsCisJLmdldF9mb3JtYXRzCT0gcHhhX2NhbWVyYV9nZXRfZm9ybWF0cywKKwkuc2V0X2ZtdAk9IHB4YV9jYW1lcmFfc2V0X2ZtdCwKKwkudHJ5X2ZtdAk9IHB4YV9jYW1lcmFfdHJ5X2ZtdCwKIAkuaW5pdF92aWRlb2J1Zgk9IHB4YV9jYW1lcmFfaW5pdF92aWRlb2J1ZiwKIAkucmVxYnVmcwk9IHB4YV9jYW1lcmFfcmVxYnVmcywKIAkucG9sbAkJPSBweGFfY2FtZXJhX3BvbGwsCiAJLnF1ZXJ5Y2FwCT0gcHhhX2NhbWVyYV9xdWVyeWNhcCwKLQkudHJ5X2J1c19wYXJhbQk9IHB4YV9jYW1lcmFfdHJ5X2J1c19wYXJhbSwKIAkuc2V0X2J1c19wYXJhbQk9IHB4YV9jYW1lcmFfc2V0X2J1c19wYXJhbSwKIH07CiAKQEAgLTEwNzEsNyArMTQwNCw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlwY2Rldi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiQ0FNQ0xLIik7CisJcGNkZXYtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihwY2Rldi0+Y2xrKSkgewogCQllcnIgPSBQVFJfRVJSKHBjZGV2LT5jbGspOwogCQlnb3RvIGV4aXRfa2ZyZWU7CkBAIC0xMDkwLDE0ICsxNDIzLDE3IEBACiAJCQkgImRhdGEgd2lkdGhzLCB1c2luZyBkZWZhdWx0IDEwIGJpdFxuIik7CiAJCXBjZGV2LT5wbGF0Zm9ybV9mbGFncyB8PSBQWEFfQ0FNRVJBX0RBVEFXSURUSF8xMDsKIAl9Ci0JcGNkZXYtPnBsYXRmb3JtX21jbGtfMTBraHogPSBwY2Rldi0+cGRhdGEtPm1jbGtfMTBraHo7Ci0JaWYgKCFwY2Rldi0+cGxhdGZvcm1fbWNsa18xMGtoeikgeworCXBjZGV2LT5tY2xrID0gcGNkZXYtPnBkYXRhLT5tY2xrXzEwa2h6ICogMTAwMDA7CisJaWYgKCFwY2Rldi0+bWNsaykgewogCQlkZXZfd2FybigmcGRldi0+ZGV2LAotCQkJICJtY2xrXzEwa2h6ID09IDAhIFBsZWFzZSwgZml4IHlvdXIgcGxhdGZvcm0gZGF0YS4gIgorCQkJICJtY2xrID09IDAhIFBsZWFzZSwgZml4IHlvdXIgcGxhdGZvcm0gZGF0YS4gIgogCQkJICJVc2luZyBkZWZhdWx0IDIwTUh6XG4iKTsKLQkJcGNkZXYtPnBsYXRmb3JtX21jbGtfMTBraHogPSAyMDAwOworCQlwY2Rldi0+bWNsayA9IDIwMDAwMDAwOwogCX0KIAorCXBjZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCXBjZGV2LT5tY2xrX2Rpdmlzb3IgPSBtY2xrX2dldF9kaXZpc29yKHBjZGV2KTsKKwogCUlOSVRfTElTVF9IRUFEKCZwY2Rldi0+Y2FwdHVyZSk7CiAJc3Bpbl9sb2NrX2luaXQoJnBjZGV2LT5sb2NrKTsKIApAQCAtMTExNyw3ICsxNDUzLDYgQEAKIAl9CiAJcGNkZXYtPmlycSA9IGlycTsKIAlwY2Rldi0+YmFzZSA9IGJhc2U7Ci0JcGNkZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAKIAkvKiByZXF1ZXN0IGRtYSAqLwogCWVyciA9IHB4YV9yZXF1ZXN0X2RtYSgiQ0lfWSIsIERNQV9QUklPX0hJR0gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2JmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaApAQCAtMCwwICsxLDk1IEBACisvKiBDYW1lcmEgSW50ZXJmYWNlICovCisjZGVmaW5lIENJQ1IwCQlfX1JFRygweDUwMDAwMDAwKQorI2RlZmluZSBDSUNSMQkJX19SRUcoMHg1MDAwMDAwNCkKKyNkZWZpbmUgQ0lDUjIJCV9fUkVHKDB4NTAwMDAwMDgpCisjZGVmaW5lIENJQ1IzCQlfX1JFRygweDUwMDAwMDBDKQorI2RlZmluZSBDSUNSNAkJX19SRUcoMHg1MDAwMDAxMCkKKyNkZWZpbmUgQ0lTUgkJX19SRUcoMHg1MDAwMDAxNCkKKyNkZWZpbmUgQ0lGUgkJX19SRUcoMHg1MDAwMDAxOCkKKyNkZWZpbmUgQ0lUT1IJCV9fUkVHKDB4NTAwMDAwMUMpCisjZGVmaW5lIENJQlIwCQlfX1JFRygweDUwMDAwMDI4KQorI2RlZmluZSBDSUJSMQkJX19SRUcoMHg1MDAwMDAzMCkKKyNkZWZpbmUgQ0lCUjIJCV9fUkVHKDB4NTAwMDAwMzgpCisKKyNkZWZpbmUgQ0lDUjBfRE1BRU4JKDEgPDwgMzEpCS8qIERNQSByZXF1ZXN0IGVuYWJsZSAqLworI2RlZmluZSBDSUNSMF9QQVJfRU4JKDEgPDwgMzApCS8qIFBhcml0eSBlbmFibGUgKi8KKyNkZWZpbmUgQ0lDUjBfU0xfQ0FQX0VOCSgxIDw8IDI5KQkvKiBDYXB0dXJlIGVuYWJsZSBmb3Igc2xhdmUgbW9kZSAqLworI2RlZmluZSBDSUNSMF9FTkIJKDEgPDwgMjgpCS8qIENhbWVyYSBpbnRlcmZhY2UgZW5hYmxlICovCisjZGVmaW5lIENJQ1IwX0RJUwkoMSA8PCAyNykJLyogQ2FtZXJhIGludGVyZmFjZSBkaXNhYmxlICovCisjZGVmaW5lIENJQ1IwX1NJTQkoMHg3IDw8IDI0KQkvKiBTZW5zb3IgaW50ZXJmYWNlIG1vZGUgbWFzayAqLworI2RlZmluZSBDSUNSMF9UT00JKDEgPDwgOSkJLyogVGltZS1vdXQgbWFzayAqLworI2RlZmluZSBDSUNSMF9SREFWTQkoMSA8PCA4KQkvKiBSZWNlaXZlLWRhdGEtYXZhaWxhYmxlIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfRkVNCSgxIDw8IDcpCS8qIEZJRk8tZW1wdHkgbWFzayAqLworI2RlZmluZSBDSUNSMF9FT0xNCSgxIDw8IDYpCS8qIEVuZC1vZi1saW5lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfUEVSUk0JKDEgPDwgNSkJLyogUGFyaXR5LWVycm9yIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfUURNCSgxIDw8IDQpCS8qIFF1aWNrLWRpc2FibGUgbWFzayAqLworI2RlZmluZSBDSUNSMF9DRE0JKDEgPDwgMykJLyogRGlzYWJsZS1kb25lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfU09GTQkoMSA8PCAyKQkvKiBTdGFydC1vZi1mcmFtZSBtYXNrICovCisjZGVmaW5lIENJQ1IwX0VPRk0JKDEgPDwgMSkJLyogRW5kLW9mLWZyYW1lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjBfRk9NCSgxIDw8IDApCS8qIEZJRk8tb3ZlcnJ1biBtYXNrICovCisKKyNkZWZpbmUgQ0lDUjFfVEJJVAkoMSA8PCAzMSkJLyogVHJhbnNwYXJlbmN5IGJpdCAqLworI2RlZmluZSBDSUNSMV9SR0JUX0NPTlYJKDB4MyA8PCAyOSkJLyogUkdCVCBjb252ZXJzaW9uIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfUFBMCSgweDdmZiA8PCAxNSkJLyogUGl4ZWxzIHBlciBsaW5lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfUkdCX0NPTlYJKDB4NyA8PCAxMikJLyogUkdCIGNvbnZlcnNpb24gbWFzayAqLworI2RlZmluZSBDSUNSMV9SR0JfRgkoMSA8PCAxMSkJLyogUkdCIGZvcm1hdCAqLworI2RlZmluZSBDSUNSMV9ZQ0JDUl9GCSgxIDw8IDEwKQkvKiBZQ2JDciBmb3JtYXQgKi8KKyNkZWZpbmUgQ0lDUjFfUkdCX0JQUAkoMHg3IDw8IDcpCS8qIFJHQiBiaXMgcGVyIHBpeGVsIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfUkFXX0JQUAkoMHgzIDw8IDUpCS8qIFJhdyBiaXMgcGVyIHBpeGVsIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfQ09MT1JfU1AJKDB4MyA8PCAzKQkvKiBDb2xvciBzcGFjZSBtYXNrICovCisjZGVmaW5lIENJQ1IxX0RXCSgweDcgPDwgMCkJLyogRGF0YSB3aWR0aCBtYXNrICovCisKKyNkZWZpbmUgQ0lDUjJfQkxXCSgweGZmIDw8IDI0KQkvKiBCZWdpbm5pbmctb2YtbGluZSBwaXhlbCBjbG9jaworCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjJfRUxXCSgweGZmIDw8IDE2KQkvKiBFbmQtb2YtbGluZSBwaXhlbCBjbG9jaworCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjJfSFNXCSgweDNmIDw8IDEwKQkvKiBIb3Jpem9udGFsIHN5bmMgcHVsc2Ugd2lkdGggbWFzayAqLworI2RlZmluZSBDSUNSMl9CRlBXCSgweDNmIDw8IDMpCS8qIEJlZ2lubmluZy1vZi1mcmFtZSBwaXhlbCBjbG9jaworCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjJfRlNXCSgweDcgPDwgMCkJLyogRnJhbWUgc3RhYmlsaXphdGlvbgorCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KKworI2RlZmluZSBDSUNSM19CRlcJKDB4ZmYgPDwgMjQpCS8qIEJlZ2lubmluZy1vZi1mcmFtZSBsaW5lIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSM19FRlcJKDB4ZmYgPDwgMTYpCS8qIEVuZC1vZi1mcmFtZSBsaW5lIGNsb2NrCisJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLworI2RlZmluZSBDSUNSM19WU1cJKDB4M2YgPDwgMTApCS8qIFZlcnRpY2FsIHN5bmMgcHVsc2Ugd2lkdGggbWFzayAqLworI2RlZmluZSBDSUNSM19CRlBXCSgweDNmIDw8IDMpCS8qIEJlZ2lubmluZy1vZi1mcmFtZSBwaXhlbCBjbG9jaworCQkJCQkgICB3YWl0IGNvdW50IG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjNfTFBGCSgweDdmZiA8PCAwKQkvKiBMaW5lcyBwZXIgZnJhbWUgbWFzayAqLworCisjZGVmaW5lIENJQ1I0X01DTEtfRExZCSgweDMgPDwgMjQpCS8qIE1DTEsgRGF0YSBDYXB0dXJlIERlbGF5IG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjRfUENMS19FTgkoMSA8PCAyMykJLyogUGl4ZWwgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIENJQ1I0X1BDUAkoMSA8PCAyMikJLyogUGl4ZWwgY2xvY2sgcG9sYXJpdHkgKi8KKyNkZWZpbmUgQ0lDUjRfSFNQCSgxIDw8IDIxKQkvKiBIb3Jpem9udGFsIHN5bmMgcG9sYXJpdHkgKi8KKyNkZWZpbmUgQ0lDUjRfVlNQCSgxIDw8IDIwKQkvKiBWZXJ0aWNhbCBzeW5jIHBvbGFyaXR5ICovCisjZGVmaW5lIENJQ1I0X01DTEtfRU4JKDEgPDwgMTkpCS8qIE1DTEsgZW5hYmxlICovCisjZGVmaW5lIENJQ1I0X0ZSX1JBVEUJKDB4NyA8PCA4KQkvKiBGcmFtZSByYXRlIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjRfRElWCSgweGZmIDw8IDApCS8qIENsb2NrIGRpdmlzb3IgbWFzayAqLworCisjZGVmaW5lIENJU1JfRlRPCSgxIDw8IDE1KQkvKiBGSUZPIHRpbWUtb3V0ICovCisjZGVmaW5lIENJU1JfUkRBVl8yCSgxIDw8IDE0KQkvKiBDaGFubmVsIDIgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBDSVNSX1JEQVZfMQkoMSA8PCAxMykJLyogQ2hhbm5lbCAxIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgQ0lTUl9SREFWXzAJKDEgPDwgMTIpCS8qIENoYW5uZWwgMCByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lIENJU1JfRkVNUFRZXzIJKDEgPDwgMTEpCS8qIENoYW5uZWwgMiBGSUZPIGVtcHR5ICovCisjZGVmaW5lIENJU1JfRkVNUFRZXzEJKDEgPDwgMTApCS8qIENoYW5uZWwgMSBGSUZPIGVtcHR5ICovCisjZGVmaW5lIENJU1JfRkVNUFRZXzAJKDEgPDwgOSkJLyogQ2hhbm5lbCAwIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUgQ0lTUl9FT0wJKDEgPDwgOCkJLyogRW5kIG9mIGxpbmUgKi8KKyNkZWZpbmUgQ0lTUl9QQVJfRVJSCSgxIDw8IDcpCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBDSVNSX0NRRAkoMSA8PCA2KQkvKiBDYW1lcmEgaW50ZXJmYWNlIHF1aWNrIGRpc2FibGUgKi8KKyNkZWZpbmUgQ0lTUl9DREQJKDEgPDwgNSkJLyogQ2FtZXJhIGludGVyZmFjZSBkaXNhYmxlIGRvbmUgKi8KKyNkZWZpbmUgQ0lTUl9TT0YJKDEgPDwgNCkJLyogU3RhcnQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgQ0lTUl9FT0YJKDEgPDwgMykJLyogRW5kIG9mIGZyYW1lICovCisjZGVmaW5lIENJU1JfSUZPXzIJKDEgPDwgMikJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDIgKi8KKyNkZWZpbmUgQ0lTUl9JRk9fMQkoMSA8PCAxKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMSAqLworI2RlZmluZSBDSVNSX0lGT18wCSgxIDw8IDApCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAwICovCisKKyNkZWZpbmUgQ0lGUl9GTFZMMgkoMHg3ZiA8PCAyMykJLyogRklGTyAyIGxldmVsIG1hc2sgKi8KKyNkZWZpbmUgQ0lGUl9GTFZMMQkoMHg3ZiA8PCAxNikJLyogRklGTyAxIGxldmVsIG1hc2sgKi8KKyNkZWZpbmUgQ0lGUl9GTFZMMAkoMHhmZiA8PCA4KQkvKiBGSUZPIDAgbGV2ZWwgbWFzayAqLworI2RlZmluZSBDSUZSX1RITF8wCSgweDMgPDwgNCkJLyogVGhyZXNob2xkIExldmVsIGZvciBDaGFubmVsIDAgRklGTyAqLworI2RlZmluZSBDSUZSX1JFU0VUX0YJKDEgPDwgMykJLyogUmVzZXQgaW5wdXQgRklGT3MgKi8KKyNkZWZpbmUgQ0lGUl9GRU4yCSgxIDw8IDIpCS8qIEZJRk8gZW5hYmxlIGZvciBjaGFubmVsIDIgKi8KKyNkZWZpbmUgQ0lGUl9GRU4xCSgxIDw8IDEpCS8qIEZJRk8gZW5hYmxlIGZvciBjaGFubmVsIDEgKi8KKyNkZWZpbmUgQ0lGUl9GRU4wCSgxIDw8IDApCS8qIEZJRk8gZW5hYmxlIGZvciBjaGFubmVsIDAgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCmluZGV4IDRhMjFiOGEuLmYxNTk0NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqIDxyaWNoYXJkLmd1ZW50aGVyQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZT4KICAqCiAgKiB3aXRoIGNoYW5nZXMgYnkKLSAqIEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgKiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqIGFuZAogICoKQEAgLTgwNCw4ICs4MDQsNyBAQAogICoKICAqICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bAogICovCi1zdGF0aWMgaW50IGRvX3NhYTUyNDZhX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZG9fc2FhNTI0NmFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIApAQCAtOTUzLDcgKzk1Miw3IEBACiAKIAljbWQgPSB2dHhfZml4X2NvbW1hbmQoY21kKTsKIAltdXRleF9sb2NrKCZ0LT5sb2NrKTsKLQllcnIgPSB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGRvX3NhYTUyNDZhX2lvY3RsKTsKKwllcnIgPSB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgZG9fc2FhNTI0NmFfaW9jdGwpOwogCW11dGV4X3VubG9jaygmdC0+bG9jayk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0OS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMKaW5kZXggM2JiOTU5Yy4uNmVmM2FmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMKQEAgLTgsNyArOCw3IEBACiAgKgl5b3UgY2FuIGFkZCBhcmJpdGFyeSBtdWx0aXBsZSB0ZWxldGV4dCBkZXZpY2VzIHRvIExpbnV4IHZpZGVvNGxpbnV4CiAgKglub3cgKHdlbGwgMzIgYW55d2F5KS4KICAqCi0gKglBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKglUaGUgb3JpZ2luYWwgZHJpdmVyIHdhcyBoZWF2aWx5IG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBpMmMgaW50ZXJmYWNlCiAgKglJdCB3YXMgdHJ1bmNhdGVkIHRvIHVzZSB0aGUgV2luVFYgYm9hcmRzLCB0b28uCkBAIC0xOTAsOCArMTkwLDcgQEAKICAqCVN0YW5kYXJkIGNoYXJhY3Rlci1kZXZpY2UtZHJpdmVyIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyBpbnQgZG9fc2FhNTI0OV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRvX3NhYTUyNDlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdGF0aWMgaW50IHZpcnR1YWxfbW9kZSA9IGZhbHNlOwogCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CkBAIC00ODgsNyArNDg3LDcgQEAKIAogCWNtZCA9IHZ0eF9maXhfY29tbWFuZChjbWQpOwogCW11dGV4X2xvY2soJnQtPmxvY2spOwotCWVyciA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLGZpbGUsY21kLGFyZyxkb19zYWE1MjQ5X2lvY3RsKTsKKwllcnIgPSB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgZG9fc2FhNTI0OV9pb2N0bCk7CiAJbXV0ZXhfdW5sb2NrKCZ0LT5sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYwppbmRleCBjOGU5Y2IzLi4yMjcwOGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2LWxlZ2FjeS5oPgogI2luY2x1ZGUgPG1lZGlhL3NhYTcxMTUuaD4KQEAgLTcwLDYgKzcwLDcgQEAKIEkyQ19DTElFTlRfSU5TTU9EOwogCiBzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCXY0bDJfc3RkX2lkIHN0ZDsKIAlpbnQgaW5wdXQ7CiAJaW50IG91dHB1dDsKQEAgLTg5LDEwICs5MCwxNyBAQAogCXU4IGFwbGw7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzYWE3MTF4X3N0YXRlICp0b19zdGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzYWE3MTF4X3N0YXRlLCBzZCk7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHNhYTcxMXhfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgaW50IHNhYTcxMXhfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwogfQogCkBAIC0xMjgsOSArMTM2LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBzYWE3MTF4X3dyaXRlcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWdzKQorc3RhdGljIGludCBzYWE3MTF4X3dyaXRlcmVncyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWdzKQogewotCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAl1bnNpZ25lZCBjaGFyIHJlZywgZGF0YTsKIAogCXdoaWxlICgqcmVncyAhPSAweDAwKSB7CkBAIC0xMzksMTggKzE0NywyMCBAQAogCiAJCS8qIEFjY29yZGluZyB3aXRoIGRhdGFzaGVldHMsIHJlc2VydmVkIHJlZ3Mgc2hvdWxkIGJlCiAJCSAgIGZpbGxlZCB3aXRoIDAgLSBzZWVtcyBiZXR0ZXIgbm90IHRvIHRvdWNoIG9uIHRoZXkgKi8KLQkJaWYgKHNhYTcxMXhfaGFzX3JlZyhzdGF0ZS0+aWRlbnQscmVnKSkgewotCQkJaWYgKHNhYTcxMXhfd3JpdGUoY2xpZW50LCByZWcsIGRhdGEpIDwgMCkKKwkJaWYgKHNhYTcxMXhfaGFzX3JlZyhzdGF0ZS0+aWRlbnQsIHJlZykpIHsKKwkJCWlmIChzYWE3MTF4X3dyaXRlKHNkLCByZWcsIGRhdGEpIDwgMCkKIAkJCQlyZXR1cm4gLTE7CiAJCX0gZWxzZSB7Ci0JCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ0cmllZCB0byBhY2Nlc3MgcmVzZXJ2ZWQgcmVnIDB4JTAyeFxuIiwgcmVnKTsKKwkJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInRyaWVkIHRvIGFjY2VzcyByZXNlcnZlZCByZWcgMHglMDJ4XG4iLCByZWcpOwogCQl9CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzYWE3MTF4X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQorc3RhdGljIGlubGluZSBpbnQgc2FhNzExeF9yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KIApAQCAtNjAxLDcgKzYxMSw3IEBACiAJcmV0dXJuIGMgJiAxOwogfQogCi1zdGF0aWMgaW50IHNhYTcxMXhfZGVjb2RlX3Zwcyh1OCAqIGRzdCwgdTggKiBwKQorc3RhdGljIGludCBzYWE3MTF4X2RlY29kZV92cHModTggKmRzdCwgdTggKnApCiB7CiAJc3RhdGljIGNvbnN0IHU4IGJpcGhhc2VfdGJsW10gPSB7CiAJCTB4ZjAsIDB4NzgsIDB4NzAsIDB4ZjAsIDB4YjQsIDB4M2MsIDB4MzQsIDB4YjQsCkBAIC02NDgsNyArNjU4LDcgQEAKIAlyZXR1cm4gZXJyICYgMHhmMDsKIH0KIAotc3RhdGljIGludCBzYWE3MTF4X2RlY29kZV93c3ModTggKiBwKQorc3RhdGljIGludCBzYWE3MTF4X2RlY29kZV93c3ModTggKnApCiB7CiAJc3RhdGljIGNvbnN0IGludCB3c3NfYml0c1s4XSA9IHsKIAkJMCwgMCwgMCwgMSwgMCwgMSwgMSwgMQpAQCAtNjc1LDkgKzY4NSw5IEBACiAJcmV0dXJuIHdzczsKIH0KIAotc3RhdGljIGludCBzYWE3MTF4X3NldF9hdWRpb19jbG9ja19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiBmcmVxKQorc3RhdGljIGludCBzYWE3MTF4X3NfY2xvY2tfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZnJlcSkKIHsKLQlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJdTMyIGFjcGY7CiAJdTMyIGFjbmk7CiAJdTMyIGh6OwpAQCAtNjg1LDEwICs2OTUsMTAgQEAKIAl1OCBhY2MgPSAwOyAJLyogcmVnIDB4M2EsIGF1ZGlvIGNsb2NrIGNvbnRyb2wgKi8KIAogCS8qIENoZWNrcyBmb3IgY2hpcHMgdGhhdCBkb24ndCBoYXZlIGF1ZGlvIGNsb2NrIChzYWE3MTExLCBzYWE3MTEzKSAqLwotCWlmICghc2FhNzExeF9oYXNfcmVnKHN0YXRlLT5pZGVudCxSXzMwX0FVRF9NQVNUX0NMS19DWUNMRVNfUEVSX0ZJRUxEKSkKKwlpZiAoIXNhYTcxMXhfaGFzX3JlZyhzdGF0ZS0+aWRlbnQsIFJfMzBfQVVEX01BU1RfQ0xLX0NZQ0xFU19QRVJfRklFTEQpKQogCQlyZXR1cm4gMDsKIAotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgInNldCBhdWRpbyBjbG9jayBmcmVxOiAlZFxuIiwgZnJlcSk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAic2V0IGF1ZGlvIGNsb2NrIGZyZXE6ICVkXG4iLCBmcmVxKTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChmcmVxIDwgMzIwMDAgfHwgZnJlcSA+IDQ4MDAwKQpAQCAtNzE1LDY2ICs3MjUsNjYgQEAKIAlpZiAoc3RhdGUtPmFwbGwpCiAJCWFjYyB8PSAweDA4OwogCi0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfMzhfQ0xLX1JBVElPX0FNWENMS19UT19BU0NMSywgMHgwMyk7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfMzlfQ0xLX1JBVElPX0FTQ0xLX1RPX0FMUkNMSywgMHgxMCk7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfM0FfQVVEX0NMS19HRU5fQkFTSUNfU0VUVVAsIGFjYyk7CisJc2FhNzExeF93cml0ZShzZCwgUl8zOF9DTEtfUkFUSU9fQU1YQ0xLX1RPX0FTQ0xLLCAweDAzKTsKKwlzYWE3MTF4X3dyaXRlKHNkLCBSXzM5X0NMS19SQVRJT19BU0NMS19UT19BTFJDTEssIDB4MTApOworCXNhYTcxMXhfd3JpdGUoc2QsIFJfM0FfQVVEX0NMS19HRU5fQkFTSUNfU0VUVVAsIGFjYyk7CiAKLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8zMF9BVURfTUFTVF9DTEtfQ1lDTEVTX1BFUl9GSUVMRCwgYWNwZiAmIDB4ZmYpOwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSXzMwX0FVRF9NQVNUX0NMS19DWUNMRVNfUEVSX0ZJRUxEKzEsCisJc2FhNzExeF93cml0ZShzZCwgUl8zMF9BVURfTUFTVF9DTEtfQ1lDTEVTX1BFUl9GSUVMRCwgYWNwZiAmIDB4ZmYpOworCXNhYTcxMXhfd3JpdGUoc2QsIFJfMzBfQVVEX01BU1RfQ0xLX0NZQ0xFU19QRVJfRklFTEQrMSwKIAkJCQkJCQkoYWNwZiA+PiA4KSAmIDB4ZmYpOwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSXzMwX0FVRF9NQVNUX0NMS19DWUNMRVNfUEVSX0ZJRUxEKzIsCisJc2FhNzExeF93cml0ZShzZCwgUl8zMF9BVURfTUFTVF9DTEtfQ1lDTEVTX1BFUl9GSUVMRCsyLAogCQkJCQkJCShhY3BmID4+IDE2KSAmIDB4MDMpOwogCi0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfMzRfQVVEX01BU1RfQ0xLX05PTUlOQUxfSU5DLCBhY25pICYgMHhmZik7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfMzRfQVVEX01BU1RfQ0xLX05PTUlOQUxfSU5DKzEsIChhY25pID4+IDgpICYgMHhmZik7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfMzRfQVVEX01BU1RfQ0xLX05PTUlOQUxfSU5DKzIsIChhY25pID4+IDE2KSAmIDB4M2YpOworCXNhYTcxMXhfd3JpdGUoc2QsIFJfMzRfQVVEX01BU1RfQ0xLX05PTUlOQUxfSU5DLCBhY25pICYgMHhmZik7CisJc2FhNzExeF93cml0ZShzZCwgUl8zNF9BVURfTUFTVF9DTEtfTk9NSU5BTF9JTkMrMSwgKGFjbmkgPj4gOCkgJiAweGZmKTsKKwlzYWE3MTF4X3dyaXRlKHNkLCBSXzM0X0FVRF9NQVNUX0NMS19OT01JTkFMX0lOQysyLCAoYWNuaSA+PiAxNikgJiAweDNmKTsKIAlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSBmcmVxOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTcxMXhfc2V0X3Y0bGN0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgc2FhNzExeF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQlpZiAoY3RybC0+dmFsdWUgPCAwIHx8IGN0cmwtPnZhbHVlID4gMjU1KSB7Ci0JCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgYnJpZ2h0bmVzcyBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CisJCQl2NGwyX2VycihzZCwgImludmFsaWQgYnJpZ2h0bmVzcyBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCiAJCXN0YXRlLT5icmlnaHQgPSBjdHJsLT52YWx1ZTsKLQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMEFfTFVNQV9CUklHSFRfQ05UTCwgc3RhdGUtPmJyaWdodCk7CisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMEFfTFVNQV9CUklHSFRfQ05UTCwgc3RhdGUtPmJyaWdodCk7CiAJCWJyZWFrOwogCiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKIAkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDEyNykgewotCQkJdjRsX2VycihjbGllbnQsICJpbnZhbGlkIGNvbnRyYXN0IHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKKwkJCXY0bDJfZXJyKHNkLCAiaW52YWxpZCBjb250cmFzdCBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCiAJCXN0YXRlLT5jb250cmFzdCA9IGN0cmwtPnZhbHVlOwotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wQl9MVU1BX0NPTlRSQVNUX0NOVEwsIHN0YXRlLT5jb250cmFzdCk7CisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMEJfTFVNQV9DT05UUkFTVF9DTlRMLCBzdGF0ZS0+Y29udHJhc3QpOwogCQlicmVhazsKIAogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKIAkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDEyNykgewotCQkJdjRsX2VycihjbGllbnQsICJpbnZhbGlkIHNhdHVyYXRpb24gc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOworCQkJdjRsMl9lcnIoc2QsICJpbnZhbGlkIHNhdHVyYXRpb24gc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KIAogCQlzdGF0ZS0+c2F0ID0gY3RybC0+dmFsdWU7Ci0JCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSXzBDX0NIUk9NQV9TQVRfQ05UTCwgc3RhdGUtPnNhdCk7CisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMENfQ0hST01BX1NBVF9DTlRMLCBzdGF0ZS0+c2F0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0hVRToKIAkJaWYgKGN0cmwtPnZhbHVlIDwgLTEyNyB8fCBjdHJsLT52YWx1ZSA+IDEyNykgewotCQkJdjRsX2VycihjbGllbnQsICJpbnZhbGlkIGh1ZSBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CisJCQl2NGwyX2VycihzZCwgImludmFsaWQgaHVlIHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKIAkJCXJldHVybiAtRVJBTkdFOwogCQl9CiAKIAkJc3RhdGUtPmh1ZSA9IGN0cmwtPnZhbHVlOwotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wRF9DSFJPTUFfSFVFX0NOVEwsIHN0YXRlLT5odWUpOworCQlzYWE3MTF4X3dyaXRlKHNkLCBSXzBEX0NIUk9NQV9IVUVfQ05UTCwgc3RhdGUtPmh1ZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc4NCw5ICs3OTQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTcxMXhfZ2V0X3Y0bGN0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgc2FhNzExeF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgpAQCAtODA4LDE2ICs4MTgsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYWE3MTF4X3NldF9zaXplKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3N0YXRpYyBpbnQgc2FhNzExeF9zZXRfc2l6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0Jc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWludCBIUFNDLCBIRlNDOwogCWludCBWU0NZOwogCWludCByZXM7CiAJaW50IGlzXzUwaHogPSBzdGF0ZS0+c3RkICYgVjRMMl9TVERfNjI1XzUwOwogCWludCBWc3JjID0gaXNfNTBoeiA/IDU3NiA6IDQ4MDsKIAotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRlY29kZXIgc2V0IHNpemUgdG8gJWl4JWlcbiIsd2lkdGgsaGVpZ2h0KTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZWNvZGVyIHNldCBzaXplIHRvICVpeCVpXG4iLCB3aWR0aCwgaGVpZ2h0KTsKIAogCS8qIEZJWE1FIG5lZWQgYmV0dGVyIGJvdW5kcyBjaGVja2luZyBoZXJlICovCiAJaWYgKCh3aWR0aCA8IDEpIHx8ICh3aWR0aCA+IDE0NDApKQpAQCAtODI1LDcgKzgzNSw3IEBACiAJaWYgKChoZWlnaHQgPCAxKSB8fCAoaGVpZ2h0ID4gVnNyYykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFzYWE3MTF4X2hhc19yZWcoc3RhdGUtPmlkZW50LFJfRDBfQl9IT1JJWl9QUkVTQ0FMSU5HKSkgeworCWlmICghc2FhNzExeF9oYXNfcmVnKHN0YXRlLT5pZGVudCwgUl9EMF9CX0hPUklaX1BSRVNDQUxJTkcpKSB7CiAJCS8qIERlY29kZXIgb25seSBzdXBwb3J0cyA3MjAgY29sdW1ucyBhbmQgNDgwIG9yIDU3NiBsaW5lcyAqLwogCQlpZiAod2lkdGggIT0gNzIwKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC04NDMsMjIgKzg1MywyMiBAQAogCS8qIFNldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCiAJLyogd2lkdGggKi8KIAotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSX0NDX0JfSE9SSVpfT1VUUFVUX1dJTkRPV19MRU5HVEgsCisJc2FhNzExeF93cml0ZShzZCwgUl9DQ19CX0hPUklaX09VVFBVVF9XSU5ET1dfTEVOR1RILAogCQkJCQkodTgpICh3aWR0aCAmIDB4ZmYpKTsKLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9DRF9CX0hPUklaX09VVFBVVF9XSU5ET1dfTEVOR1RIX01TQiwKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0NEX0JfSE9SSVpfT1VUUFVUX1dJTkRPV19MRU5HVEhfTVNCLAogCQkJCQkodTgpICgod2lkdGggPj4gOCkgJiAweGZmKSk7CiAKIAkvKiBWZXJ0aWNhbCBTY2FsaW5nIHVzZXMgaGVpZ2h0LzIgKi8KLQlyZXM9aGVpZ2h0LzI7CisJcmVzID0gaGVpZ2h0IC8gMjsKIAogCS8qIE9uIDYwSHosIGl0IGlzIHVzaW5nIGEgaGlnaGVyIFZlcnRpY2FsIE91dHB1dCBTaXplICovCiAJaWYgKCFpc181MGh6KQogCQlyZXMgKz0gKFZSRVNfNjBIWiAtIDQ4MCkgPj4gMTsKIAogCQkvKiBoZWlnaHQgKi8KLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9DRV9CX1ZFUlRfT1VUUFVUX1dJTkRPV19MRU5HVEgsCisJc2FhNzExeF93cml0ZShzZCwgUl9DRV9CX1ZFUlRfT1VUUFVUX1dJTkRPV19MRU5HVEgsCiAJCQkJCSh1OCkgKHJlcyAmIDB4ZmYpKTsKLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9DRl9CX1ZFUlRfT1VUUFVUX1dJTkRPV19MRU5HVEhfTVNCLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfQ0ZfQl9WRVJUX09VVFBVVF9XSU5ET1dfTEVOR1RIX01TQiwKIAkJCQkJKHU4KSAoKHJlcyA+PiA4KSAmIDB4ZmYpKTsKIAogCS8qIFNjYWxpbmcgc2V0dGluZ3MgKi8KQEAgLTg2OSw1NCArODc5LDU0IEBACiAJSEZTQyA9IChpbnQpKCgxMDI0ICogNzIwKSAvIChIUFNDICogd2lkdGgpKTsKIAkvKiBGSVhNRSBoYXJkY29kZXMgdG8gIlRhc2sgQiIKIAkgKiB3cml0ZSBIIHByZXNjYWxlciBpbnRlZ2VyICovCi0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfRDBfQl9IT1JJWl9QUkVTQ0FMSU5HLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfRDBfQl9IT1JJWl9QUkVTQ0FMSU5HLAogCQkJCSh1OCkgKEhQU0MgJiAweDNmKSk7CiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJIcHNjOiAweCUwNXgsIEhmc2M6IDB4JTA1eFxuIiwgSFBTQywgSEZTQyk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiSHBzYzogMHglMDV4LCBIZnNjOiAweCUwNXhcbiIsIEhQU0MsIEhGU0MpOwogCS8qIHdyaXRlIEggZmluZS1zY2FsaW5nIChsdW1pbmFuY2UpICovCi0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfRDhfQl9IT1JJWl9MVU1BX1NDQUxJTkdfSU5DLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfRDhfQl9IT1JJWl9MVU1BX1NDQUxJTkdfSU5DLAogCQkJCSh1OCkgKEhGU0MgJiAweGZmKSk7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfRDlfQl9IT1JJWl9MVU1BX1NDQUxJTkdfSU5DX01TQiwKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0Q5X0JfSE9SSVpfTFVNQV9TQ0FMSU5HX0lOQ19NU0IsCiAJCQkJKHU4KSAoKEhGU0MgPj4gOCkgJiAweGZmKSk7CiAJLyogd3JpdGUgSCBmaW5lLXNjYWxpbmcgKGNocm9taW5hbmNlKQogCSAqIG11c3QgYmUgbHVtLzIsIHNvIGknbGwganVzdCBiaXRzaGlmdCA6KSAqLwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSX0RDX0JfSE9SSVpfQ0hST01BX1NDQUxJTkcsCisJc2FhNzExeF93cml0ZShzZCwgUl9EQ19CX0hPUklaX0NIUk9NQV9TQ0FMSU5HLAogCQkJCSh1OCkgKChIRlNDID4+IDEpICYgMHhmZikpOwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSX0REX0JfSE9SSVpfQ0hST01BX1NDQUxJTkdfTVNCLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfRERfQl9IT1JJWl9DSFJPTUFfU0NBTElOR19NU0IsCiAJCQkJKHU4KSAoKEhGU0MgPj4gOSkgJiAweGZmKSk7CiAKIAlWU0NZID0gKGludCkoKDEwMjQgKiBWc3JjKSAvIGhlaWdodCk7Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiVnNyYzogJWQsIFZzY3k6IDB4JTA1eFxuIiwgVnNyYywgVlNDWSk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiVnNyYzogJWQsIFZzY3k6IDB4JTA1eFxuIiwgVnNyYywgVlNDWSk7CiAKIAkvKiBDb3JyZWN0IENvbnRyYXN0IGFuZCBMdW1pbmFuY2UgKi8KLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9ENV9CX0xVTUFfQ09OVFJBU1RfQ05UTCwKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0Q1X0JfTFVNQV9DT05UUkFTVF9DTlRMLAogCQkJCQkodTgpICg2NCAqIDEwMjQgLyBWU0NZKSk7Ci0Jc2FhNzExeF93cml0ZShjbGllbnQsIFJfRDZfQl9DSFJPTUFfU0FUVVJBVElPTl9DTlRMLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfRDZfQl9DSFJPTUFfU0FUVVJBVElPTl9DTlRMLAogCQkJCQkodTgpICg2NCAqIDEwMjQgLyBWU0NZKSk7CiAKIAkJLyogd3JpdGUgViBmaW5lLXNjYWxpbmcgKGx1bWluYW5jZSkgKi8KLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9FMF9CX1ZFUlRfTFVNQV9TQ0FMSU5HX0lOQywKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0UwX0JfVkVSVF9MVU1BX1NDQUxJTkdfSU5DLAogCQkJCQkodTgpIChWU0NZICYgMHhmZikpOwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSX0UxX0JfVkVSVF9MVU1BX1NDQUxJTkdfSU5DX01TQiwKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0UxX0JfVkVSVF9MVU1BX1NDQUxJTkdfSU5DX01TQiwKIAkJCQkJKHU4KSAoKFZTQ1kgPj4gOCkgJiAweGZmKSk7CiAJCS8qIHdyaXRlIFYgZmluZS1zY2FsaW5nIChjaHJvbWluYW5jZSkgKi8KLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9FMl9CX1ZFUlRfQ0hST01BX1NDQUxJTkdfSU5DLAorCXNhYTcxMXhfd3JpdGUoc2QsIFJfRTJfQl9WRVJUX0NIUk9NQV9TQ0FMSU5HX0lOQywKIAkJCQkJKHU4KSAoVlNDWSAmIDB4ZmYpKTsKLQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl9FM19CX1ZFUlRfQ0hST01BX1NDQUxJTkdfSU5DX01TQiwKKwlzYWE3MTF4X3dyaXRlKHNkLCBSX0UzX0JfVkVSVF9DSFJPTUFfU0NBTElOR19JTkNfTVNCLAogCQkJCQkodTgpICgoVlNDWSA+PiA4KSAmIDB4ZmYpKTsKIAotCXNhYTcxMXhfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfcmVzZXRfc2NhbGVyKTsKKwlzYWE3MTF4X3dyaXRlcmVncyhzZCwgc2FhNzExNV9jZmdfcmVzZXRfc2NhbGVyKTsKIAogCS8qIEFjdGl2YXRlcyB0YXNrICJCIiAqLwotCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSXzgwX0dMT0JBTF9DTlRMXzEsCi0JCQkJc2FhNzExeF9yZWFkKGNsaWVudCxSXzgwX0dMT0JBTF9DTlRMXzEpIHwgMHgyMCk7CisJc2FhNzExeF93cml0ZShzZCwgUl84MF9HTE9CQUxfQ05UTF8xLAorCQkJCXNhYTcxMXhfcmVhZChzZCwgUl84MF9HTE9CQUxfQ05UTF8xKSB8IDB4MjApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNhYTcxMXhfc2V0X3Y0bHN0ZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB2NGwyX3N0ZF9pZCBzdGQpCitzdGF0aWMgdm9pZCBzYWE3MTF4X3NldF92NGxzdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQogewotCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAogCS8qIFByZXZlbnQgdW5uZWNlc3Nhcnkgc3RhbmRhcmQgY2hhbmdlcy4gRHVyaW5nIGEgc3RhbmRhcmQKIAkgICBjaGFuZ2UgdGhlIEktUG9ydCBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZC4gQW55IGRldmljZXMKQEAgLTkzMiwxMyArOTQyLDEzIEBACiAKIAkvLyBUaGlzIHdvcmtzIGZvciBOVFNDLU0sIFNFQ0FNLUwgYW5kIHRoZSA1MEh6IFBBTCB2YXJpYW50cy4KIAlpZiAoc3RkICYgVjRMMl9TVERfNTI1XzYwKSB7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRlY29kZXIgc2V0IHN0YW5kYXJkIDYwIEh6XG4iKTsKLQkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X3ZpZGVvKTsKLQkJc2FhNzExeF9zZXRfc2l6ZShjbGllbnQsIDcyMCwgNDgwKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiZGVjb2RlciBzZXQgc3RhbmRhcmQgNjAgSHpcbiIpOworCQlzYWE3MTF4X3dyaXRlcmVncyhzZCwgc2FhNzExNV9jZmdfNjBoel92aWRlbyk7CisJCXNhYTcxMXhfc2V0X3NpemUoc2QsIDcyMCwgNDgwKTsKIAl9IGVsc2UgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBzdGFuZGFyZCA1MCBIelxuIik7Ci0JCXNhYTcxMXhfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNTBoel92aWRlbyk7Ci0JCXNhYTcxMXhfc2V0X3NpemUoY2xpZW50LCA3MjAsIDU3Nik7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRlY29kZXIgc2V0IHN0YW5kYXJkIDUwIEh6XG4iKTsKKwkJc2FhNzExeF93cml0ZXJlZ3Moc2QsIHNhYTcxMTVfY2ZnXzUwaHpfdmlkZW8pOworCQlzYWE3MTF4X3NldF9zaXplKHNkLCA3MjAsIDU3Nik7CiAJfQogCiAJLyogUmVnaXN0ZXIgMEUgLSBCaXRzIEQ2LUQ0IG9uIE5PLUFVVE8gbW9kZQpAQCAtOTUyLDcgKzk2Miw3IEBACiAJKi8KIAlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMSB8fAogCSAgICBzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzKSB7Ci0JCXU4IHJlZyA9IHNhYTcxMXhfcmVhZChjbGllbnQsIFJfMEVfQ0hST01BX0NOVExfMSkgJiAweDhmOworCQl1OCByZWcgPSBzYWE3MTF4X3JlYWQoc2QsIFJfMEVfQ0hST01BX0NOVExfMSkgJiAweDhmOwogCiAJCWlmIChzdGQgPT0gVjRMMl9TVERfUEFMX00pIHsKIAkJCXJlZyB8PSAweDMwOwpAQCAtOTY1LDg3ICs5NzUsMzEgQEAKIAkJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9TRUNBTSkgewogCQkJcmVnIHw9IDB4NTA7CiAJCX0KLQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMEVfQ0hST01BX0NOVExfMSwgcmVnKTsKKwkJc2FhNzExeF93cml0ZShzZCwgUl8wRV9DSFJPTUFfQ05UTF8xLCByZWcpOwogCX0gZWxzZSB7CiAJCS8qIHJlc3RhcnQgdGFzayBCIGlmIG5lZWRlZCAqLwotCQlpbnQgdGFza2IgPSBzYWE3MTF4X3JlYWQoY2xpZW50LCBSXzgwX0dMT0JBTF9DTlRMXzEpICYgMHgxMDsKKwkJaW50IHRhc2tiID0gc2FhNzExeF9yZWFkKHNkLCBSXzgwX0dMT0JBTF9DTlRMXzEpICYgMHgxMDsKIAogCQlpZiAodGFza2IgJiYgc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExNCkgewotCQkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ192Ymlfb24pOworCQkJc2FhNzExeF93cml0ZXJlZ3Moc2QsIHNhYTcxMTVfY2ZnX3ZiaV9vbik7CiAJCX0KIAogCQkvKiBzd2l0Y2ggYXVkaW8gbW9kZSB0b28hICovCi0JCXNhYTcxMXhfc2V0X2F1ZGlvX2Nsb2NrX2ZyZXEoY2xpZW50LCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOworCQlzYWE3MTF4X3NfY2xvY2tfZnJlcShzZCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKIAl9CiB9CiAKLXN0YXRpYyB2NGwyX3N0ZF9pZCBzYWE3MTF4X2dldF92NGxzdGQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCXJldHVybiBzdGF0ZS0+c3RkOwotfQotCi1zdGF0aWMgdm9pZCBzYWE3MTF4X2xvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgcmVnMWUsIHJlZzFmOwotCWludCBzaWduYWxPazsKLQlpbnQgdmNyOwotCi0JdjRsX2luZm8oY2xpZW50LCAiQXVkaW8gZnJlcXVlbmN5OiAlZCBIelxuIiwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKLQlpZiAoc3RhdGUtPmlkZW50ICE9IFY0TDJfSURFTlRfU0FBNzExNSkgewotCQkvKiBzdGF0dXMgZm9yIHRoZSBzYWE3MTE0ICovCi0JCXJlZzFmID0gc2FhNzExeF9yZWFkKGNsaWVudCwgUl8xRl9TVEFUVVNfQllURV8yX1ZEX0RFQyk7Ci0JCXNpZ25hbE9rID0gKHJlZzFmICYgMHhjMSkgPT0gMHg4MTsKLQkJdjRsX2luZm8oY2xpZW50LCAiVmlkZW8gc2lnbmFsOiAgICAlc1xuIiwgc2lnbmFsT2sgPyAib2siIDogImJhZCIpOwotCQl2NGxfaW5mbyhjbGllbnQsICJGcmVxdWVuY3k6ICAgICAgICVzXG4iLCAocmVnMWYgJiAweDIwKSA/ICI2MCBIeiIgOiAiNTAgSHoiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHN0YXR1cyBmb3IgdGhlIHNhYTcxMTUgKi8KLQlyZWcxZSA9IHNhYTcxMXhfcmVhZChjbGllbnQsIFJfMUVfU1RBVFVTX0JZVEVfMV9WRF9ERUMpOwotCXJlZzFmID0gc2FhNzExeF9yZWFkKGNsaWVudCwgUl8xRl9TVEFUVVNfQllURV8yX1ZEX0RFQyk7Ci0KLQlzaWduYWxPayA9IChyZWcxZiAmIDB4YzEpID09IDB4ODEgJiYgKHJlZzFlICYgMHhjMCkgPT0gMHg4MDsKLQl2Y3IgPSAhKHJlZzFmICYgMHgxMCk7Ci0KLQlpZiAoc3RhdGUtPmlucHV0ID49IDYpIHsKLQkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICAgICAgICAgICBTLVZpZGVvICVkXG4iLCBzdGF0ZS0+aW5wdXQgLSA2KTsKLQl9IGVsc2UgewotCQl2NGxfaW5mbyhjbGllbnQsICJJbnB1dDogICAgICAgICAgIENvbXBvc2l0ZSAlZFxuIiwgc3RhdGUtPmlucHV0KTsKLQl9Ci0JdjRsX2luZm8oY2xpZW50LCAiVmlkZW8gc2lnbmFsOiAgICAlc1xuIiwgc2lnbmFsT2sgPyAodmNyID8gIlZDUiIgOiAiYnJvYWRjYXN0L0RWRCIpIDogImJhZCIpOwotCXY0bF9pbmZvKGNsaWVudCwgIkZyZXF1ZW5jeTogICAgICAgJXNcbiIsIChyZWcxZiAmIDB4MjApID8gIjYwIEh6IiA6ICI1MCBIeiIpOwotCi0Jc3dpdGNoIChyZWcxZSAmIDB4MDMpIHsKLQkJY2FzZSAxOgotCQkJdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiBOVFNDXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQl2NGxfaW5mbyhjbGllbnQsICJEZXRlY3RlZCBmb3JtYXQ6IFBBTFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiBTRUNBTVxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXY0bF9pbmZvKGNsaWVudCwgIkRldGVjdGVkIGZvcm1hdDogQlcvTm8gY29sb3JcbiIpOwotCQkJYnJlYWs7Ci0JfQotCXY0bF9pbmZvKGNsaWVudCwgIldpZHRoLCBIZWlnaHQ6ICAgJWQsICVkXG4iLCBzdGF0ZS0+d2lkdGgsIHN0YXRlLT5oZWlnaHQpOwotfQotCiAvKiBzZXR1cCB0aGUgc2xpY2VkIFZCSSBsY3IgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc2xpY2VkIFZCSSBmb3JtYXQgKi8KLXN0YXRpYyB2b2lkIHNhYTcxMXhfc2V0X2xjcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqZm10KQorc3RhdGljIHZvaWQgc2FhNzExeF9zZXRfbGNyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpmbXQpCiB7Ci0Jc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWludCBpc181MGh6ID0gKHN0YXRlLT5zdGQgJiBWNEwyX1NURF82MjVfNTApOwogCXU4IGxjclsyNF07CiAJaW50IGksIHg7CiAKICNpZiAxCiAJLyogc2FhNzExMy83MTE0LzcxMTggVkJJIHN1cHBvcnQgYXJlIGV4cGVyaW1lbnRhbCAqLwotCWlmICghc2FhNzExeF9oYXNfcmVnKHN0YXRlLT5pZGVudCxSXzQxX0xDUl9CQVNFKSkKKwlpZiAoIXNhYTcxMXhfaGFzX3JlZyhzdGF0ZS0+aWRlbnQsIFJfNDFfTENSX0JBU0UpKQogCQlyZXR1cm47CiAKICNlbHNlCkBAIC0xMTA5LDE2ICsxMDYzLDE2IEBACiAKIAkvKiB3cml0ZSB0aGUgbGNyIHJlZ2lzdGVycyAqLwogCWZvciAoaSA9IDI7IGkgPD0gMjM7IGkrKykgewotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgaSAtIDIgKyBSXzQxX0xDUl9CQVNFLCBsY3JbaV0pOworCQlzYWE3MTF4X3dyaXRlKHNkLCBpIC0gMiArIFJfNDFfTENSX0JBU0UsIGxjcltpXSk7CiAJfQogCiAJLyogZW5hYmxlL2Rpc2FibGUgcmF3IFZCSSBjYXB0dXJpbmcgKi8KLQlzYWE3MTF4X3dyaXRlcmVncyhjbGllbnQsIGZtdCA9PSBOVUxMID8KKwlzYWE3MTF4X3dyaXRlcmVncyhzZCwgZm10ID09IE5VTEwgPwogCQkJCXNhYTcxMTVfY2ZnX3ZiaV9vbiA6CiAJCQkJc2FhNzExNV9jZmdfdmJpX29mZik7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNzExeF9nZXRfdjRsZm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQorc3RhdGljIGludCBzYWE3MTF4X2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQogewogCXN0YXRpYyB1MTYgbGNyMnZiaVtdID0gewogCQkwLCBWNEwyX1NMSUNFRF9URUxFVEVYVF9CLCAwLAkvKiAxICovCkBAIC0xMTM0LDEwICsxMDg4LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCW1lbXNldChzbGljZWQsIDAsIHNpemVvZigqc2xpY2VkKSk7CiAJLyogZG9uZSBpZiB1c2luZyByYXcgVkJJICovCi0JaWYgKHNhYTcxMXhfcmVhZChjbGllbnQsIFJfODBfR0xPQkFMX0NOVExfMSkgJiAweDEwKQorCWlmIChzYWE3MTF4X3JlYWQoc2QsIFJfODBfR0xPQkFMX0NOVExfMSkgJiAweDEwKQogCQlyZXR1cm4gMDsKIAlmb3IgKGkgPSAyOyBpIDw9IDIzOyBpKyspIHsKLQkJdTggdiA9IHNhYTcxMXhfcmVhZChjbGllbnQsIGkgLSAyICsgUl80MV9MQ1JfQkFTRSk7CisJCXU4IHYgPSBzYWE3MTF4X3JlYWQoc2QsIGkgLSAyICsgUl80MV9MQ1JfQkFTRSk7CiAKIAkJc2xpY2VkLT5zZXJ2aWNlX2xpbmVzWzBdW2ldID0gbGNyMnZiaVt2ID4+IDRdOwogCQlzbGljZWQtPnNlcnZpY2VfbGluZXNbMV1baV0gPSBsY3IydmJpW3YgJiAweGZdOwpAQCAtMTE0NywyMCArMTEwMSwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTcxMXhfc2V0X3Y0bGZtdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3N0YXRpYyBpbnQgc2FhNzExeF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKIHsKIAlpZiAoZm10LT50eXBlID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKSB7Ci0JCXNhYTcxMXhfc2V0X2xjcihjbGllbnQsICZmbXQtPmZtdC5zbGljZWQpOworCQlzYWE3MTF4X3NldF9sY3Ioc2QsICZmbXQtPmZtdC5zbGljZWQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGZtdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKSB7Ci0JCXNhYTcxMXhfc2V0X2xjcihjbGllbnQsIE5VTEwpOworCQlzYWE3MTF4X3NldF9sY3Ioc2QsIE5VTEwpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHNhYTcxMXhfc2V0X3NpemUoY2xpZW50LGZtdC0+Zm10LnBpeC53aWR0aCxmbXQtPmZtdC5waXguaGVpZ2h0KTsKKwlyZXR1cm4gc2FhNzExeF9zZXRfc2l6ZShzZCwgZm10LT5mbXQucGl4LndpZHRoLCBmbXQtPmZtdC5waXguaGVpZ2h0KTsKIH0KIAogLyogRGVjb2RlIHRoZSBzbGljZWQgVkJJIGRhdGEgc3RyZWFtIGFzIGNyZWF0ZWQgYnkgdGhlIHNhYTcxMTUuCkBAIC0xMTY5LDEzICsxMTIzLDEyIEBACiAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIFNBVi9FQVYgY29kZXMgYW5kIG5vdCB0aGUgYW5jaWxsYXJ5IGRhdGEKICAgIGhlYWRlcnMuIFRoZSB2YmktPnAgcG9pbnRlciBwb2ludHMgdG8gdGhlIFJfNUVfU0RJRCBieXRlIHJpZ2h0IGFmdGVyIHRoZSBTQVYKICAgIGNvZGUuICovCi1zdGF0aWMgdm9pZCBzYWE3MTF4X2RlY29kZV92YmlfbGluZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICBzdHJ1Y3QgdjRsMl9kZWNvZGVfdmJpX2xpbmUgKnZiaSkKK3N0YXRpYyBpbnQgc2FhNzExeF9kZWNvZGVfdmJpX2xpbmUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZGVjb2RlX3ZiaV9saW5lICp2YmkpCiB7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCXN0YXRpYyBjb25zdCBjaGFyIHZiaV9ub19kYXRhX3BhdHRlcm5bXSA9IHsKIAkJMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMAogCX07Ci0Jc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdTggKnAgPSB2YmktPnA7CiAJdTMyIHdzczsKIAlpbnQgaWQxLCBpZDI7ICAgLyogdGhlIElEMSBhbmQgSUQyIGJ5dGVzIGZyb20gdGhlIGludGVybmFsIGhlYWRlciAqLwpAQCAtMTIwMiw3ICsxMTU1LDcgQEAKIAkvKiBJZiB0aGUgVkJJIHNsaWNlciBkb2VzIG5vdCBkZXRlY3QgYW55IHNpZ25hbCBpdCB3aWxsIGZpbGwgdXAKIAkgICB0aGUgcGF5bG9hZCBidWZmZXIgd2l0aCAweGEwIGJ5dGVzLiAqLwogCWlmICghbWVtY21wKHAsIHZiaV9ub19kYXRhX3BhdHRlcm4sIHNpemVvZih2Ymlfbm9fZGF0YV9wYXR0ZXJuKSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKiBkZWNvZGUgcGF5bG9hZHMgKi8KIAlzd2l0Y2ggKGlkMikgewpAQCAtMTIxMSwyNzUgKzExNjQsMzUyIEBACiAJCWJyZWFrOwogCWNhc2UgNDoKIAkJaWYgKCFzYWE3MTF4X29kZF9wYXJpdHkocFswXSkgfHwgIXNhYTcxMXhfb2RkX3Bhcml0eShwWzFdKSkKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl2YmktPnR5cGUgPSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNTsKIAkJYnJlYWs7CiAJY2FzZSA1OgogCQl3c3MgPSBzYWE3MTF4X2RlY29kZV93c3MocCk7CiAJCWlmICh3c3MgPT0gLTEpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJcFswXSA9IHdzcyAmIDB4ZmY7CiAJCXBbMV0gPSB3c3MgPj4gODsKIAkJdmJpLT50eXBlID0gVjRMMl9TTElDRURfV1NTXzYyNTsKIAkJYnJlYWs7CiAJY2FzZSA3OgogCQlpZiAoc2FhNzExeF9kZWNvZGVfdnBzKHAsIHApICE9IDApCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJdmJpLT50eXBlID0gVjRMMl9TTElDRURfVlBTOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm47CisJCWJyZWFrOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogLyogPT09PT09PT09PT09IFNBQTcxMTUgQVVESU8gc2V0dGluZ3MgKGVuZCkgPT09PT09PT09PT09PSAqLwogCi1zdGF0aWMgaW50IHNhYTcxMTVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHNhYTcxMXhfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCiB7Ci0Jc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCWludCBzdGF0dXM7CiAKLQkvKiBpb2N0bHMgdG8gYWxsb3cgZGlyZWN0IGFjY2VzcyB0byB0aGUgc2FhNzExNSByZWdpc3RlcnMgZm9yIHRlc3RpbmcgKi8KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX1NfRk1UOgotCQlyZXR1cm4gc2FhNzExeF9zZXRfdjRsZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZyk7CisJaWYgKHN0YXRlLT5yYWRpbykKKwkJcmV0dXJuIDA7CisJc3RhdHVzID0gc2FhNzExeF9yZWFkKHNkLCBSXzFGX1NUQVRVU19CWVRFXzJfVkRfREVDKTsKIAotCWNhc2UgVklESU9DX0dfRk1UOgotCQlyZXR1cm4gc2FhNzExeF9nZXRfdjRsZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZyk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAic3RhdHVzOiAweCUwMnhcbiIsIHN0YXR1cyk7CisJdnQtPnNpZ25hbCA9ICgoc3RhdHVzICYgKDEgPDwgNikpID09IDApID8gMHhmZmZmIDogMHgwOworCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCXJldHVybiBzYWE3MTF4X3NldF9hdWRpb19jbG9ja19mcmVxKGNsaWVudCwgKih1MzIgKilhcmcpOwotCi0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKLQkJaW50IHN0YXR1czsKLQotCQlpZiAoc3RhdGUtPnJhZGlvKQotCQkJYnJlYWs7Ci0JCXN0YXR1cyA9IHNhYTcxMXhfcmVhZChjbGllbnQsIFJfMUZfU1RBVFVTX0JZVEVfMl9WRF9ERUMpOwotCi0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgInN0YXR1czogMHglMDJ4XG4iLCBzdGF0dXMpOwotCQl2dC0+c2lnbmFsID0gKChzdGF0dXMgJiAoMSA8PCA2KSkgPT0gMCkgPyAweGZmZmYgOiAweDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCXNhYTcxMXhfbG9nX3N0YXR1cyhjbGllbnQpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJcmV0dXJuIHNhYTcxMXhfZ2V0X3Y0bGN0cmwoY2xpZW50LCAoc3RydWN0IHY0bDJfY29udHJvbCAqKWFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXJldHVybiBzYWE3MTF4X3NldF92NGxjdHJsKGNsaWVudCwgKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmcpOwotCi0JY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQotCQlzd2l0Y2ggKHFjLT5pZCkgewotCQkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJCWNhc2UgVjRMMl9DSURfSFVFOgotCQkJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCWNhc2UgVklESU9DX0dfU1REOgotCQkqKHY0bDJfc3RkX2lkICopYXJnID0gc2FhNzExeF9nZXRfdjRsc3RkKGNsaWVudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JCXN0YXRlLT5yYWRpbyA9IDA7Ci0JCXNhYTcxMXhfc2V0X3Y0bHN0ZChjbGllbnQsICoodjRsMl9zdGRfaWQgKilhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVEQ19TRVRfUkFESU86Ci0JCXN0YXRlLT5yYWRpbyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfSU5UX0dfVklERU9fUk9VVElORzoKLQl7Ci0JCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOwotCi0JCXJvdXRlLT5pbnB1dCA9IHN0YXRlLT5pbnB1dDsKLQkJcm91dGUtPm91dHB1dCA9IHN0YXRlLT5vdXRwdXQ7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkc6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKLQkJdTMyIGlucHV0ID0gcm91dGUtPmlucHV0OwotCQl1OCBtYXNrID0gKHN0YXRlLT5pZGVudCA9PSBWNEwyX0lERU5UX1NBQTcxMTEpID8gMHhmOCA6IDB4ZjA7Ci0KLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgaW5wdXQgJWQgb3V0cHV0ICVkXG4iLCByb3V0ZS0+aW5wdXQsIHJvdXRlLT5vdXRwdXQpOwotCQkvKiBzYWE3MTExLzMgZG9lcyBub3QgaGF2ZSB0aGVzZSBpbnB1dHMgKi8KLQkJaWYgKChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzIHx8Ci0JCSAgICAgc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMSkgJiYKLQkJICAgIChyb3V0ZS0+aW5wdXQgPT0gU0FBNzExNV9DT01QT1NJVEU0IHx8Ci0JCSAgICAgcm91dGUtPmlucHV0ID09IFNBQTcxMTVfQ09NUE9TSVRFNSkpIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyb3V0ZS0+aW5wdXQgPiBTQUE3MTE1X1NWSURFTzMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHJvdXRlLT5vdXRwdXQgPiBTQUE3MTE1X0lQT1JUX09OKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChzdGF0ZS0+aW5wdXQgPT0gcm91dGUtPmlucHV0ICYmIHN0YXRlLT5vdXRwdXQgPT0gcm91dGUtPm91dHB1dCkKLQkJCWJyZWFrOwotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJub3cgc2V0dGluZyAlcyBpbnB1dCAlcyBvdXRwdXRcbiIsCi0JCQkocm91dGUtPmlucHV0ID49IFNBQTcxMTVfU1ZJREVPMCkgPyAiUy1WaWRlbyIgOiAiQ29tcG9zaXRlIiwgKHJvdXRlLT5vdXRwdXQgPT0gU0FBNzExNV9JUE9SVF9PTikgPyAiaXBvcnQgb24iIDogImlwb3J0IG9mZiIpOwotCQlzdGF0ZS0+aW5wdXQgPSByb3V0ZS0+aW5wdXQ7Ci0KLQkJLyogc2FhNzExMSBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IGlucHV0IG51bWJlcmluZyAqLwotCQlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMSkgewotCQkJaWYgKGlucHV0ID49IFNBQTcxMTVfQ09NUE9TSVRFNCkKLQkJCQlpbnB1dCAtPSAyOwotCQkJLyogc2FhNzExMSBzcGVjaWZpYyAqLwotCQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMTBfQ0hST01BX0NOVExfMiwKLQkJCQkJKHNhYTcxMXhfcmVhZChjbGllbnQsIFJfMTBfQ0hST01BX0NOVExfMikgJiAweDNmKSB8Ci0JCQkJCSgocm91dGUtPm91dHB1dCAmIDB4YzApIF4gMHg0MCkpOwotCQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMTNfUlRfWF9QT1JUX09VVF9DTlRMLAotCQkJCQkoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8xM19SVF9YX1BPUlRfT1VUX0NOVEwpICYgMHhmMCkgfAotCQkJCQkoKHJvdXRlLT5vdXRwdXQgJiAyKSA/IDB4MGEgOiAwKSk7Ci0JCX0KLQotCQkvKiBzZWxlY3QgbW9kZSAqLwotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wMl9JTlBVVF9DTlRMXzEsCi0JCQkgICAgICAoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8wMl9JTlBVVF9DTlRMXzEpICYgbWFzaykgfAotCQkJICAgICAgIGlucHV0KTsKLQotCQkvKiBieXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgUy1WaWRlbyBtb2RlcyAqLwotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wOV9MVU1BX0NOVEwsCi0JCQkgICAgICAoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8wOV9MVU1BX0NOVEwpICYgMHg3ZikgfAotCQkJICAgICAgIChzdGF0ZS0+aW5wdXQgPj0gU0FBNzExNV9TVklERU8wID8gMHg4MCA6IDB4MCkpOwotCi0JCXN0YXRlLT5vdXRwdXQgPSByb3V0ZS0+b3V0cHV0OwotCQlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExNCB8fAotCQkJc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExNSkgewotCQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfODNfWF9QT1JUX0lfT19FTkFfQU5EX09VVF9DTEssCi0JCQkgICAgICAoc2FhNzExeF9yZWFkKGNsaWVudCwgUl84M19YX1BPUlRfSV9PX0VOQV9BTkRfT1VUX0NMSykgJiAweGZlKSB8Ci0JCQkgICAgICAgKHN0YXRlLT5vdXRwdXQgJiAweDAxKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICIlcyBvdXRwdXRcbiIsCi0JCQkoY21kID09IFZJRElPQ19TVFJFQU1PTikgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLQkJaWYgKHN0YXRlLT5lbmFibGUgIT0gKGNtZCA9PSBWSURJT0NfU1RSRUFNT04pKSB7Ci0JCQlzdGF0ZS0+ZW5hYmxlID0gKGNtZCA9PSBWSURJT0NfU1RSRUFNT04pOwotCQkJc2FhNzExeF93cml0ZShjbGllbnQsCi0JCQkJUl84N19JX1BPUlRfSV9PX0VOQV9PVVRfQ0xLX0FORF9HQVRFRCwKLQkJCQlzdGF0ZS0+ZW5hYmxlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUToKLQl7Ci0JCXN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSAqZnJlcSA9IGFyZzsKLQotCQlpZiAoZnJlcS0+ZnJlcSAhPSBTQUE3MTE1X0ZSRVFfMzJfMTFfTUhaICYmCi0JCSAgICBmcmVxLT5mcmVxICE9IFNBQTcxMTVfRlJFUV8yNF81NzZfTUhaKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBmcmVxLT5mcmVxOwotCQlzdGF0ZS0+Y2djZGl2ID0gKGZyZXEtPmZsYWdzICYgU0FBNzExNV9GUkVRX0ZMX0NHQ0RJVikgPyAzIDogNDsKLQkJc3RhdGUtPnVjZ2MgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfVUNHQykgPyAxIDogMDsKLQkJc3RhdGUtPmFwbGwgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfQVBMTCkgPyAxIDogMDsKLQkJc2FhNzExeF9zZXRfYXVkaW9fY2xvY2tfZnJlcShjbGllbnQsIHN0YXRlLT5hdWRjbGtfZnJlcSk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkU6Ci0JCXNhYTcxMXhfZGVjb2RlX3ZiaV9saW5lKGNsaWVudCwgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19JTlRfUkVTRVQ6Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRlY29kZXIgUkVTRVRcbiIpOwotCQlzYWE3MTF4X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfY2ZnX3Jlc2V0X3NjYWxlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfSU5UX1NfR1BJTzoKLQkJaWYgKHN0YXRlLT5pZGVudCAhPSBWNEwyX0lERU5UX1NBQTcxMTEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc2FhNzExeF93cml0ZShjbGllbnQsIDB4MTEsIChzYWE3MTF4X3JlYWQoY2xpZW50LCAweDExKSAmIDB4N2YpIHwKLQkJCSgqKHUzMiAqKWFyZyA/IDB4ODAgOiAwKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfSU5UX0dfVkJJX0RBVEE6Ci0JewotCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgKmRhdGEgPSBhcmc7Ci0KLQkJLyogTm90ZTogdGhlIGludGVybmFsIGZpZWxkIElEIGlzIGludmVydGVkIGZvciBOVFNDLAotCQkgICBzbyBkYXRhLT5maWVsZCAwIG1hcHMgdG8gdGhlIHNhYTcxMTUgZXZlbiBmaWVsZCwKLQkJICAgd2hlcmVhcyBmb3IgUEFMIGl0IG1hcHMgdG8gdGhlIHNhYTcxMTUgb2RkIGZpZWxkLiAqLwotCQlzd2l0Y2ggKGRhdGEtPmlkKSB7Ci0JCWNhc2UgVjRMMl9TTElDRURfV1NTXzYyNToKLQkJCWlmIChzYWE3MTF4X3JlYWQoY2xpZW50LCAweDZiKSAmIDB4YzApCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlkYXRhLT5kYXRhWzBdID0gc2FhNzExeF9yZWFkKGNsaWVudCwgMHg2Yyk7Ci0JCQlkYXRhLT5kYXRhWzFdID0gc2FhNzExeF9yZWFkKGNsaWVudCwgMHg2ZCk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNToKLQkJCWlmIChkYXRhLT5maWVsZCA9PSAwKSB7Ci0JCQkJLyogQ0MgKi8KLQkJCQlpZiAoc2FhNzExeF9yZWFkKGNsaWVudCwgMHg2NikgJiAweDMwKQotCQkJCQlyZXR1cm4gLUVJTzsKLQkJCQlkYXRhLT5kYXRhWzBdID0gc2FhNzExeF9yZWFkKGNsaWVudCwgMHg2OSk7Ci0JCQkJZGF0YS0+ZGF0YVsxXSA9IHNhYTcxMXhfcmVhZChjbGllbnQsIDB4NmEpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyogWERTICovCi0JCQlpZiAoc2FhNzExeF9yZWFkKGNsaWVudCwgMHg2NikgJiAweGMwKQotCQkJCXJldHVybiAtRUlPOwotCQkJZGF0YS0+ZGF0YVswXSA9IHNhYTcxMXhfcmVhZChjbGllbnQsIDB4NjcpOwotCQkJZGF0YS0+ZGF0YVsxXSA9IHNhYTcxMXhfcmVhZChjbGllbnQsIDB4NjgpOwotCQkJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JY2FzZSBWSURJT0NfREJHX0dfUkVHSVNURVI6Ci0JY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOwotCi0JCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LCByZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYgKGNtZCA9PSBWSURJT0NfREJHX0dfUkVHSVNURVIpCi0JCQlyZWctPnZhbCA9IHNhYTcxMXhfcmVhZChjbGllbnQsIHJlZy0+cmVnICYgMHhmZik7Ci0JCWVsc2UKLQkJCXNhYTcxMXhfd3JpdGUoY2xpZW50LCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgotCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIHN0YXRlLT5pZGVudCwgMCk7Ci0KK3N0YXRpYyBpbnQgc2FhNzExeF9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzd2l0Y2ggKHFjLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorfQogCitzdGF0aWMgaW50IHNhYTcxMXhfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQoreworCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXN0YXRlLT5yYWRpbyA9IDA7CisJc2FhNzExeF9zZXRfdjRsc3RkKHNkLCBzdGQpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNhYTcxMXhfc19yYWRpbyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXN0YXRlLT5yYWRpbyA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzExeF9zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpCit7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXUzMiBpbnB1dCA9IHJvdXRlLT5pbnB1dDsKKwl1OCBtYXNrID0gKHN0YXRlLT5pZGVudCA9PSBWNEwyX0lERU5UX1NBQTcxMTEpID8gMHhmOCA6IDB4ZjA7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZWNvZGVyIHNldCBpbnB1dCAlZCBvdXRwdXQgJWRcbiIsIHJvdXRlLT5pbnB1dCwgcm91dGUtPm91dHB1dCk7CisJLyogc2FhNzExMS8zIGRvZXMgbm90IGhhdmUgdGhlc2UgaW5wdXRzICovCisJaWYgKChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzIHx8CisJICAgICBzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTExKSAmJgorCSAgICAocm91dGUtPmlucHV0ID09IFNBQTcxMTVfQ09NUE9TSVRFNCB8fAorCSAgICAgcm91dGUtPmlucHV0ID09IFNBQTcxMTVfQ09NUE9TSVRFNSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyb3V0ZS0+aW5wdXQgPiBTQUE3MTE1X1NWSURFTzMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyb3V0ZS0+b3V0cHV0ID4gU0FBNzExNV9JUE9SVF9PTikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0YXRlLT5pbnB1dCA9PSByb3V0ZS0+aW5wdXQgJiYgc3RhdGUtPm91dHB1dCA9PSByb3V0ZS0+b3V0cHV0KQorCQlyZXR1cm4gMDsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJub3cgc2V0dGluZyAlcyBpbnB1dCAlcyBvdXRwdXRcbiIsCisJCShyb3V0ZS0+aW5wdXQgPj0gU0FBNzExNV9TVklERU8wKSA/ICJTLVZpZGVvIiA6ICJDb21wb3NpdGUiLAorCQkocm91dGUtPm91dHB1dCA9PSBTQUE3MTE1X0lQT1JUX09OKSA/ICJpcG9ydCBvbiIgOiAiaXBvcnQgb2ZmIik7CisJc3RhdGUtPmlucHV0ID0gcm91dGUtPmlucHV0OworCisJLyogc2FhNzExMSBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IGlucHV0IG51bWJlcmluZyAqLworCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTExKSB7CisJCWlmIChpbnB1dCA+PSBTQUE3MTE1X0NPTVBPU0lURTQpCisJCQlpbnB1dCAtPSAyOworCQkvKiBzYWE3MTExIHNwZWNpZmljICovCisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMTBfQ0hST01BX0NOVExfMiwKKwkJCQkoc2FhNzExeF9yZWFkKHNkLCBSXzEwX0NIUk9NQV9DTlRMXzIpICYgMHgzZikgfAorCQkJCSgocm91dGUtPm91dHB1dCAmIDB4YzApIF4gMHg0MCkpOworCQlzYWE3MTF4X3dyaXRlKHNkLCBSXzEzX1JUX1hfUE9SVF9PVVRfQ05UTCwKKwkJCQkoc2FhNzExeF9yZWFkKHNkLCBSXzEzX1JUX1hfUE9SVF9PVVRfQ05UTCkgJiAweGYwKSB8CisJCQkJKChyb3V0ZS0+b3V0cHV0ICYgMikgPyAweDBhIDogMCkpOworCX0KKworCS8qIHNlbGVjdCBtb2RlICovCisJc2FhNzExeF93cml0ZShzZCwgUl8wMl9JTlBVVF9DTlRMXzEsCisJCSAgICAgIChzYWE3MTF4X3JlYWQoc2QsIFJfMDJfSU5QVVRfQ05UTF8xKSAmIG1hc2spIHwKKwkJICAgICAgIGlucHV0KTsKKworCS8qIGJ5cGFzcyBjaHJvbWluYW5jZSB0cmFwIGZvciBTLVZpZGVvIG1vZGVzICovCisJc2FhNzExeF93cml0ZShzZCwgUl8wOV9MVU1BX0NOVEwsCisJCQkoc2FhNzExeF9yZWFkKHNkLCBSXzA5X0xVTUFfQ05UTCkgJiAweDdmKSB8CisJCQkoc3RhdGUtPmlucHV0ID49IFNBQTcxMTVfU1ZJREVPMCA/IDB4ODAgOiAweDApKTsKKworCXN0YXRlLT5vdXRwdXQgPSByb3V0ZS0+b3V0cHV0OworCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTE0IHx8CisJCQlzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTE1KSB7CisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfODNfWF9QT1JUX0lfT19FTkFfQU5EX09VVF9DTEssCisJCQkJKHNhYTcxMXhfcmVhZChzZCwgUl84M19YX1BPUlRfSV9PX0VOQV9BTkRfT1VUX0NMSykgJiAweGZlKSB8CisJCQkJKHN0YXRlLT5vdXRwdXQgJiAweDAxKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxMXhfc19ncGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCit7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJaWYgKHN0YXRlLT5pZGVudCAhPSBWNEwyX0lERU5UX1NBQTcxMTEpCisJCXJldHVybiAtRUlOVkFMOworCXNhYTcxMXhfd3JpdGUoc2QsIDB4MTEsIChzYWE3MTF4X3JlYWQoc2QsIDB4MTEpICYgMHg3ZikgfAorCQkodmFsID8gMHg4MCA6IDApKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE3MTF4X3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiJXMgb3V0cHV0XG4iLAorCQkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKHN0YXRlLT5lbmFibGUgIT0gZW5hYmxlKSB7CisJCXN0YXRlLT5lbmFibGUgPSBlbmFibGU7CisJCXNhYTcxMXhfd3JpdGUoc2QsIFJfODdfSV9QT1JUX0lfT19FTkFfT1VUX0NMS19BTkRfR0FURUQsCisJCQkJc3RhdGUtPmVuYWJsZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxMXhfc19jcnlzdGFsX2ZyZXEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxICpmcmVxKQoreworCXN0cnVjdCBzYWE3MTF4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCWlmIChmcmVxLT5mcmVxICE9IFNBQTcxMTVfRlJFUV8zMl8xMV9NSFogJiYKKwkJCWZyZXEtPmZyZXEgIT0gU0FBNzExNV9GUkVRXzI0XzU3Nl9NSFopCisJCXJldHVybiAtRUlOVkFMOworCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBmcmVxLT5mcmVxOworCXN0YXRlLT5jZ2NkaXYgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfQ0dDRElWKSA/IDMgOiA0OworCXN0YXRlLT51Y2djID0gKGZyZXEtPmZsYWdzICYgU0FBNzExNV9GUkVRX0ZMX1VDR0MpID8gMSA6IDA7CisJc3RhdGUtPmFwbGwgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfQVBMTCkgPyAxIDogMDsKKwlzYWE3MTF4X3NfY2xvY2tfZnJlcShzZCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYWE3MTF4X3Jlc2V0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCit7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiZGVjb2RlciBSRVNFVFxuIik7CisJc2FhNzExeF93cml0ZXJlZ3Moc2QsIHNhYTcxMTVfY2ZnX3Jlc2V0X3NjYWxlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzExeF9nX3ZiaV9kYXRhKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKK3sKKwkvKiBOb3RlOiB0aGUgaW50ZXJuYWwgZmllbGQgSUQgaXMgaW52ZXJ0ZWQgZm9yIE5UU0MsCisJICAgc28gZGF0YS0+ZmllbGQgMCBtYXBzIHRvIHRoZSBzYWE3MTE1IGV2ZW4gZmllbGQsCisJICAgd2hlcmVhcyBmb3IgUEFMIGl0IG1hcHMgdG8gdGhlIHNhYTcxMTUgb2RkIGZpZWxkLiAqLworCXN3aXRjaCAoZGF0YS0+aWQpIHsKKwljYXNlIFY0TDJfU0xJQ0VEX1dTU182MjU6CisJCWlmIChzYWE3MTF4X3JlYWQoc2QsIDB4NmIpICYgMHhjMCkKKwkJCXJldHVybiAtRUlPOworCQlkYXRhLT5kYXRhWzBdID0gc2FhNzExeF9yZWFkKHNkLCAweDZjKTsKKwkJZGF0YS0+ZGF0YVsxXSA9IHNhYTcxMXhfcmVhZChzZCwgMHg2ZCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9TTElDRURfQ0FQVElPTl81MjU6CisJCWlmIChkYXRhLT5maWVsZCA9PSAwKSB7CisJCQkvKiBDQyAqLworCQkJaWYgKHNhYTcxMXhfcmVhZChzZCwgMHg2NikgJiAweDMwKQorCQkJCXJldHVybiAtRUlPOworCQkJZGF0YS0+ZGF0YVswXSA9IHNhYTcxMXhfcmVhZChzZCwgMHg2OSk7CisJCQlkYXRhLT5kYXRhWzFdID0gc2FhNzExeF9yZWFkKHNkLCAweDZhKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIFhEUyAqLworCQlpZiAoc2FhNzExeF9yZWFkKHNkLCAweDY2KSAmIDB4YzApCisJCQlyZXR1cm4gLUVJTzsKKwkJZGF0YS0+ZGF0YVswXSA9IHNhYTcxMXhfcmVhZChzZCwgMHg2Nyk7CisJCWRhdGEtPmRhdGFbMV0gPSBzYWE3MTF4X3JlYWQoc2QsIDB4NjgpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IHNhYTcxMXhfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJlZy0+dmFsID0gc2FhNzExeF9yZWFkKHNkLCByZWctPnJlZyAmIDB4ZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxMXhfc19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXNhYTcxMXhfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNhYTcxMXhfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIHN0YXRlLT5pZGVudCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzExeF9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCWludCByZWcxZSwgcmVnMWY7CisJaW50IHNpZ25hbE9rOworCWludCB2Y3I7CisKKwl2NGwyX2luZm8oc2QsICJBdWRpbyBmcmVxdWVuY3k6ICVkIEh6XG4iLCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOworCWlmIChzdGF0ZS0+aWRlbnQgIT0gVjRMMl9JREVOVF9TQUE3MTE1KSB7CisJCS8qIHN0YXR1cyBmb3IgdGhlIHNhYTcxMTQgKi8KKwkJcmVnMWYgPSBzYWE3MTF4X3JlYWQoc2QsIFJfMUZfU1RBVFVTX0JZVEVfMl9WRF9ERUMpOworCQlzaWduYWxPayA9IChyZWcxZiAmIDB4YzEpID09IDB4ODE7CisJCXY0bDJfaW5mbyhzZCwgIlZpZGVvIHNpZ25hbDogICAgJXNcbiIsIHNpZ25hbE9rID8gIm9rIiA6ICJiYWQiKTsKKwkJdjRsMl9pbmZvKHNkLCAiRnJlcXVlbmN5OiAgICAgICAlc1xuIiwgKHJlZzFmICYgMHgyMCkgPyAiNjAgSHoiIDogIjUwIEh6Iik7CisJCXJldHVybiAwOworCX0KKworCS8qIHN0YXR1cyBmb3IgdGhlIHNhYTcxMTUgKi8KKwlyZWcxZSA9IHNhYTcxMXhfcmVhZChzZCwgUl8xRV9TVEFUVVNfQllURV8xX1ZEX0RFQyk7CisJcmVnMWYgPSBzYWE3MTF4X3JlYWQoc2QsIFJfMUZfU1RBVFVTX0JZVEVfMl9WRF9ERUMpOworCisJc2lnbmFsT2sgPSAocmVnMWYgJiAweGMxKSA9PSAweDgxICYmIChyZWcxZSAmIDB4YzApID09IDB4ODA7CisJdmNyID0gIShyZWcxZiAmIDB4MTApOworCisJaWYgKHN0YXRlLT5pbnB1dCA+PSA2KQorCQl2NGwyX2luZm8oc2QsICJJbnB1dDogICAgICAgICAgIFMtVmlkZW8gJWRcbiIsIHN0YXRlLT5pbnB1dCAtIDYpOworCWVsc2UKKwkJdjRsMl9pbmZvKHNkLCAiSW5wdXQ6ICAgICAgICAgICBDb21wb3NpdGUgJWRcbiIsIHN0YXRlLT5pbnB1dCk7CisJdjRsMl9pbmZvKHNkLCAiVmlkZW8gc2lnbmFsOiAgICAlc1xuIiwgc2lnbmFsT2sgPyAodmNyID8gIlZDUiIgOiAiYnJvYWRjYXN0L0RWRCIpIDogImJhZCIpOworCXY0bDJfaW5mbyhzZCwgIkZyZXF1ZW5jeTogICAgICAgJXNcbiIsIChyZWcxZiAmIDB4MjApID8gIjYwIEh6IiA6ICI1MCBIeiIpOworCisJc3dpdGNoIChyZWcxZSAmIDB4MDMpIHsKKwljYXNlIDE6CisJCXY0bDJfaW5mbyhzZCwgIkRldGVjdGVkIGZvcm1hdDogTlRTQ1xuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdjRsMl9pbmZvKHNkLCAiRGV0ZWN0ZWQgZm9ybWF0OiBQQUxcbiIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXY0bDJfaW5mbyhzZCwgIkRldGVjdGVkIGZvcm1hdDogU0VDQU1cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGwyX2luZm8oc2QsICJEZXRlY3RlZCBmb3JtYXQ6IEJXL05vIGNvbG9yXG4iKTsKKwkJYnJlYWs7CisJfQorCXY0bDJfaW5mbyhzZCwgIldpZHRoLCBIZWlnaHQ6ICAgJWQsICVkXG4iLCBzdGF0ZS0+d2lkdGgsIHN0YXRlLT5oZWlnaHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxMXhfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNhYTcxMTVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2FhNzExeF9jb3JlX29wcyA9IHsKKwkubG9nX3N0YXR1cyA9IHNhYTcxMXhfbG9nX3N0YXR1cywKKwkuZ19jaGlwX2lkZW50ID0gc2FhNzExeF9nX2NoaXBfaWRlbnQsCisJLmdfY3RybCA9IHNhYTcxMXhfZ19jdHJsLAorCS5zX2N0cmwgPSBzYWE3MTF4X3NfY3RybCwKKwkucXVlcnljdHJsID0gc2FhNzExeF9xdWVyeWN0cmwsCisJLnJlc2V0ID0gc2FhNzExeF9yZXNldCwKKwkuc19ncGlvID0gc2FhNzExeF9zX2dwaW8sCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gc2FhNzExeF9nX3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyID0gc2FhNzExeF9zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyBzYWE3MTF4X3R1bmVyX29wcyA9IHsKKwkuc19zdGQgPSBzYWE3MTF4X3Nfc3RkLAorCS5zX3JhZGlvID0gc2FhNzExeF9zX3JhZGlvLAorCS5nX3R1bmVyID0gc2FhNzExeF9nX3R1bmVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgc2FhNzExeF9hdWRpb19vcHMgPSB7CisJLnNfY2xvY2tfZnJlcSA9IHNhYTcxMXhfc19jbG9ja19mcmVxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgc2FhNzExeF92aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHNhYTcxMXhfc19yb3V0aW5nLAorCS5zX2NyeXN0YWxfZnJlcSA9IHNhYTcxMXhfc19jcnlzdGFsX2ZyZXEsCisJLmdfZm10ID0gc2FhNzExeF9nX2ZtdCwKKwkuc19mbXQgPSBzYWE3MTF4X3NfZm10LAorCS5nX3ZiaV9kYXRhID0gc2FhNzExeF9nX3ZiaV9kYXRhLAorCS5kZWNvZGVfdmJpX2xpbmUgPSBzYWE3MTF4X2RlY29kZV92YmlfbGluZSwKKwkuc19zdHJlYW0gPSBzYWE3MTF4X3Nfc3RyZWFtLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgc2FhNzExeF9vcHMgPSB7CisJLmNvcmUgPSAmc2FhNzExeF9jb3JlX29wcywKKwkudHVuZXIgPSAmc2FhNzExeF90dW5lcl9vcHMsCisJLmF1ZGlvID0gJnNhYTcxMXhfYXVkaW9fb3BzLAorCS52aWRlbyA9ICZzYWE3MTF4X3ZpZGVvX29wcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2FhNzExeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlpbnQJaTsKIAljaGFyCW5hbWVbMTddOwogCWNoYXIgY2hpcF9pZDsKQEAgLTE0OTAsOCArMTUyMCw4IEBACiAJCXJldHVybiAtRUlPOwogCiAJZm9yIChpID0gMDsgaSA8IDB4MGY7IGkrKykgewotCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgMCwgaSk7Ci0JCW5hbWVbaV0gPSAoc2FhNzExeF9yZWFkKGNsaWVudCwgMCkgJiAweDBmKSArICcwJzsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIDAsIGkpOworCQluYW1lW2ldID0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIDApICYgMHgwZikgKyAnMCc7CiAJCWlmIChuYW1lW2ldID4gJzknKQogCQkJbmFtZVtpXSArPSAnYScgLSAnOScgLSAxOwogCX0KQEAgLTE1MTgsNyArMTU0OCw4IEBACiAJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZzYWE3MTF4X29wcyk7CiAJc3RhdGUtPmlucHV0ID0gLTE7CiAJc3RhdGUtPm91dHB1dCA9IFNBQTcxMTVfSVBPUlRfT047CiAJc3RhdGUtPmVuYWJsZSA9IDE7CkBAIC0xNTQ1LDQxICsxNTc2LDQ1IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXN0YXRlLT5pZGVudCA9IFY0TDJfSURFTlRfU0FBNzExMTsKLQkJdjRsX2luZm8oY2xpZW50LCAiV0FSTklORzogQ2hpcCBpcyBub3Qga25vd24gLSBGYWxsaW5nIGJhY2sgdG8gc2FhNzExMVxuIik7CisJCXY0bDJfaW5mbyhzZCwgIldBUk5JTkc6IENoaXAgaXMgbm90IGtub3duIC0gRmFsbGluZyBiYWNrIHRvIHNhYTcxMTFcbiIpOwogCiAJfQogCiAJc3RhdGUtPmF1ZGNsa19mcmVxID0gNDgwMDA7CiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKIAogCS8qIGluaXQgdG8gNjBoei80OGtoeiAqLwogCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBTQUE3MTE1X0ZSRVFfMjRfNTc2X01IWjsKIAlzd2l0Y2ggKHN0YXRlLT5pZGVudCkgewogCWNhc2UgVjRMMl9JREVOVF9TQUE3MTExOgotCQlzYWE3MTF4X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTFfaW5pdCk7CisJCXNhYTcxMXhfd3JpdGVyZWdzKHNkLCBzYWE3MTExX2luaXQpOwogCQlicmVhazsKIAljYXNlIFY0TDJfSURFTlRfU0FBNzExMzoKLQkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTEzX2luaXQpOworCQlzYWE3MTF4X3dyaXRlcmVncyhzZCwgc2FhNzExM19pbml0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3RhdGUtPmNyeXN0YWxfZnJlcSA9IFNBQTcxMTVfRlJFUV8zMl8xMV9NSFo7Ci0JCXNhYTcxMXhfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9pbml0X2F1dG9faW5wdXQpOworCQlzYWE3MTF4X3dyaXRlcmVncyhzZCwgc2FhNzExNV9pbml0X2F1dG9faW5wdXQpOwogCX0KIAlpZiAoc3RhdGUtPmlkZW50ICE9IFY0TDJfSURFTlRfU0FBNzExMSkKLQkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2luaXRfbWlzYyk7Ci0Jc2FhNzExeF9zZXRfdjRsc3RkKGNsaWVudCwgVjRMMl9TVERfTlRTQyk7CisJCXNhYTcxMXhfd3JpdGVyZWdzKHNkLCBzYWE3MTE1X2luaXRfbWlzYyk7CisJc2FhNzExeF9zZXRfdjRsc3RkKHNkLCBWNEwyX1NURF9OVFNDKTsKIAotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgInN0YXR1czogKDFFKSAweCUwMngsICgxRikgMHglMDJ4XG4iLAotCQlzYWE3MTF4X3JlYWQoY2xpZW50LCBSXzFFX1NUQVRVU19CWVRFXzFfVkRfREVDKSwgc2FhNzExeF9yZWFkKGNsaWVudCwgUl8xRl9TVEFUVVNfQllURV8yX1ZEX0RFQykpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInN0YXR1czogKDFFKSAweCUwMngsICgxRikgMHglMDJ4XG4iLAorCQlzYWE3MTF4X3JlYWQoc2QsIFJfMUVfU1RBVFVTX0JZVEVfMV9WRF9ERUMpLAorCQlzYWE3MTF4X3JlYWQoc2QsIFJfMUZfU1RBVFVTX0JZVEVfMl9WRF9ERUMpKTsKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzYWE3MTE1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBzYWE3MTF4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU5Nyw5ICsxNjMyLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKIAkubmFtZSA9ICJzYWE3MTE1IiwKIAkuZHJpdmVyaWQgPSBJMkNfRFJJVkVSSURfU0FBNzExWCwKLQkuY29tbWFuZCA9IHNhYTcxMTVfY29tbWFuZCwKLQkucHJvYmUgPSBzYWE3MTE1X3Byb2JlLAotCS5yZW1vdmUgPSBzYWE3MTE1X3JlbW92ZSwKKwkuY29tbWFuZCA9IHNhYTcxMXhfY29tbWFuZCwKKwkucHJvYmUgPSBzYWE3MTF4X3Byb2JlLAorCS5yZW1vdmUgPSBzYWE3MTF4X3JlbW92ZSwKIAkubGVnYWN5X2NsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRyB8IEkyQ19DTEFTU19UVl9ESUdJVEFMLAogCS5pZF90YWJsZSA9IHNhYTcxMTVfaWQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTI3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYwppbmRleCBjYzAyZmIxLi5iZmM4NTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYwpAQCAtNTMsNyArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzEyNy5oPgpAQCAtMjMxLDYgKzIzMSw3IEBACiAgKi8KIAogc3RydWN0IHNhYTcxMjdfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKIAl2NGwyX3N0ZF9pZCBzdGQ7CiAJdTMyIGlkZW50OwogCWVudW0gc2FhNzEyN19pbnB1dF90eXBlIGlucHV0X3R5cGU7CkBAIC0yNTAsNiArMjUxLDExIEBACiAJdTggcmVnXzYxOwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSwgc2QpOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG91dHB1dF9zdHJzW10gPQogewogCSJTLVZpZGVvICsgQ29tcG9zaXRlIiwKQEAgLTI4MSwzMiArMjg3LDM1IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3N0YXRpYyBpbnQgc2FhNzEyN19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKIAlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzYWE3MTI3X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQorc3RhdGljIGludCBzYWE3MTI3X3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZywgdTggdmFsKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQl2NGxfZXJyKGNsaWVudCwgIkkyQyBXcml0ZSBQcm9ibGVtXG4iKTsKKwl2NGwyX2VycihzZCwgIkkyQyBXcml0ZSBQcm9ibGVtXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN193cml0ZV9pbml0dGFiKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IHNhYTcxMjdfd3JpdGVfaW5pdHRhYihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCSBjb25zdCBzdHJ1Y3QgaTJjX3JlZ192YWx1ZSAqcmVncykKIHsKIAl3aGlsZSAocmVncy0+cmVnICE9IDApIHsKLQkJc2FhNzEyN193cml0ZShjbGllbnQsIHJlZ3MtPnJlZywgcmVncy0+dmFsdWUpOworCQlzYWE3MTI3X3dyaXRlKHNkLCByZWdzLT5yZWcsIHJlZ3MtPnZhbHVlKTsKIAkJcmVncysrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMxNCwxNiArMzIzLDE2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN19zZXRfdnBzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgc2FhNzEyN19zZXRfdnBzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJaW50IGVuYWJsZSA9IChkYXRhLT5saW5lICE9IDApOwogCiAJaWYgKGVuYWJsZSAmJiAoZGF0YS0+ZmllbGQgIT0gMCB8fCBkYXRhLT5saW5lICE9IDE2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0YXRlLT52cHNfZW5hYmxlICE9IGVuYWJsZSkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUdXJuIFZQUyBTaWduYWwgJXNcbiIsIGVuYWJsZSA/ICJvbiIgOiAib2ZmIik7Ci0JCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDU0LCBlbmFibGUgPDwgNyk7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlR1cm4gVlBTIFNpZ25hbCAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKKwkJc2FhNzEyN193cml0ZShzZCwgMHg1NCwgZW5hYmxlIDw8IDcpOwogCQlzdGF0ZS0+dnBzX2VuYWJsZSA9IGVuYWJsZTsKIAl9CiAJaWYgKCFlbmFibGUpCkBAIC0zMzQsOTEgKzM0Myw5MSBAQAogCXN0YXRlLT52cHNfZGF0YVsyXSA9IGRhdGEtPmRhdGFbOV07CiAJc3RhdGUtPnZwc19kYXRhWzNdID0gZGF0YS0+ZGF0YVsxMF07CiAJc3RhdGUtPnZwc19kYXRhWzRdID0gZGF0YS0+ZGF0YVsxMV07Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU2V0IFZQUyBkYXRhICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTZXQgVlBTIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQlzdGF0ZS0+dnBzX2RhdGFbMF0sIHN0YXRlLT52cHNfZGF0YVsxXSwKIAkJc3RhdGUtPnZwc19kYXRhWzJdLCBzdGF0ZS0+dnBzX2RhdGFbM10sCiAJCXN0YXRlLT52cHNfZGF0YVs0XSk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTUsIHN0YXRlLT52cHNfZGF0YVswXSk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTYsIHN0YXRlLT52cHNfZGF0YVsxXSk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTcsIHN0YXRlLT52cHNfZGF0YVsyXSk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTgsIHN0YXRlLT52cHNfZGF0YVszXSk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4NTksIHN0YXRlLT52cHNfZGF0YVs0XSk7CisJc2FhNzEyN193cml0ZShzZCwgMHg1NSwgc3RhdGUtPnZwc19kYXRhWzBdKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCAweDU2LCBzdGF0ZS0+dnBzX2RhdGFbMV0pOworCXNhYTcxMjdfd3JpdGUoc2QsIDB4NTcsIHN0YXRlLT52cHNfZGF0YVsyXSk7CisJc2FhNzEyN193cml0ZShzZCwgMHg1OCwgc3RhdGUtPnZwc19kYXRhWzNdKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCAweDU5LCBzdGF0ZS0+dnBzX2RhdGFbNF0pOwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNhYTcxMjdfc2V0X2NjKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgc2FhNzEyN19zZXRfY2Moc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBzYWE3MTI3X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzYWE3MTI3X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAl1MTYgY2MgPSBkYXRhLT5kYXRhWzFdIDw8IDggfCBkYXRhLT5kYXRhWzBdOwogCWludCBlbmFibGUgPSAoZGF0YS0+bGluZSAhPSAwKTsKIAogCWlmIChlbmFibGUgJiYgKGRhdGEtPmZpZWxkICE9IDAgfHwgZGF0YS0+bGluZSAhPSAyMSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChzdGF0ZS0+Y2NfZW5hYmxlICE9IGVuYWJsZSkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsCisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKIAkJCSJUdXJuIENDICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOwotCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyN19SRUdfQ0xPU0VEX0NBUFRJT04sCisJCXNhYTcxMjdfd3JpdGUoc2QsIFNBQTcxMjdfUkVHX0NMT1NFRF9DQVBUSU9OLAogCQkJKHN0YXRlLT54ZHNfZW5hYmxlIDw8IDcpIHwgKGVuYWJsZSA8PCA2KSB8IDB4MTEpOwogCQlzdGF0ZS0+Y2NfZW5hYmxlID0gZW5hYmxlOwogCX0KIAlpZiAoIWVuYWJsZSkKIAkJcmV0dXJuIDA7CiAKLQl2NGxfZGJnKDIsIGRlYnVnLCBjbGllbnQsICJDQyBkYXRhOiAlMDR4XG4iLCBjYyk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIFNBQTcxMjdfUkVHX0xJTkVfMjFfT0REXzAsIGNjICYgMHhmZik7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIFNBQTcxMjdfUkVHX0xJTkVfMjFfT0REXzEsIGNjID4+IDgpOworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIkNDIGRhdGE6ICUwNHhcbiIsIGNjKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCBTQUE3MTI3X1JFR19MSU5FXzIxX09ERF8wLCBjYyAmIDB4ZmYpOworCXNhYTcxMjdfd3JpdGUoc2QsIFNBQTcxMjdfUkVHX0xJTkVfMjFfT0REXzEsIGNjID4+IDgpOwogCXN0YXRlLT5jY19kYXRhID0gY2M7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN19zZXRfeGRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgc2FhNzEyN19zZXRfeGRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJdTE2IHhkcyA9IGRhdGEtPmRhdGFbMV0gPDwgOCB8IGRhdGEtPmRhdGFbMF07CiAJaW50IGVuYWJsZSA9IChkYXRhLT5saW5lICE9IDApOwogCiAJaWYgKGVuYWJsZSAmJiAoZGF0YS0+ZmllbGQgIT0gMSB8fCBkYXRhLT5saW5lICE9IDIxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0YXRlLT54ZHNfZW5hYmxlICE9IGVuYWJsZSkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUdXJuIFhEUyAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKLQkJc2FhNzEyN193cml0ZShjbGllbnQsIFNBQTcxMjdfUkVHX0NMT1NFRF9DQVBUSU9OLAorCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJUdXJuIFhEUyAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKKwkJc2FhNzEyN193cml0ZShzZCwgU0FBNzEyN19SRUdfQ0xPU0VEX0NBUFRJT04sCiAJCQkJKGVuYWJsZSA8PCA3KSB8IChzdGF0ZS0+Y2NfZW5hYmxlIDw8IDYpIHwgMHgxMSk7CiAJCXN0YXRlLT54ZHNfZW5hYmxlID0gZW5hYmxlOwogCX0KIAlpZiAoIWVuYWJsZSkKIAkJcmV0dXJuIDA7CiAKLQl2NGxfZGJnKDIsIGRlYnVnLCBjbGllbnQsICJYRFMgZGF0YTogJTA0eFxuIiwgeGRzKTsKLQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyN19SRUdfTElORV8yMV9FVkVOXzAsIHhkcyAmIDB4ZmYpOwotCXNhYTcxMjdfd3JpdGUoY2xpZW50LCBTQUE3MTI3X1JFR19MSU5FXzIxX0VWRU5fMSwgeGRzID4+IDgpOworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIlhEUyBkYXRhOiAlMDR4XG4iLCB4ZHMpOworCXNhYTcxMjdfd3JpdGUoc2QsIFNBQTcxMjdfUkVHX0xJTkVfMjFfRVZFTl8wLCB4ZHMgJiAweGZmKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCBTQUE3MTI3X1JFR19MSU5FXzIxX0VWRU5fMSwgeGRzID4+IDgpOwogCXN0YXRlLT54ZHNfZGF0YSA9IHhkczsKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzYWE3MTI3X3NldF93c3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICpkYXRhKQorc3RhdGljIGludCBzYWE3MTI3X3NldF93c3Moc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBzYWE3MTI3X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzYWE3MTI3X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAlpbnQgZW5hYmxlID0gKGRhdGEtPmxpbmUgIT0gMCk7CiAKIAlpZiAoZW5hYmxlICYmIChkYXRhLT5maWVsZCAhPSAwIHx8IGRhdGEtPmxpbmUgIT0gMjMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoc3RhdGUtPndzc19lbmFibGUgIT0gZW5hYmxlKSB7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlR1cm4gV1NTICVzXG4iLCBlbmFibGUgPyAib24iIDogIm9mZiIpOwotCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyNywgZW5hYmxlIDw8IDcpOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJUdXJuIFdTUyAlc1xuIiwgZW5hYmxlID8gIm9uIiA6ICJvZmYiKTsKKwkJc2FhNzEyN193cml0ZShzZCwgMHgyNywgZW5hYmxlIDw8IDcpOwogCQlzdGF0ZS0+d3NzX2VuYWJsZSA9IGVuYWJsZTsKIAl9CiAJaWYgKCFlbmFibGUpCiAJCXJldHVybiAwOwogCi0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4MjYsIGRhdGEtPmRhdGFbMF0pOwotCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDI3LCAweDgwIHwgKGRhdGEtPmRhdGFbMV0gJiAweDNmKSk7Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LAorCXNhYTcxMjdfd3JpdGUoc2QsIDB4MjYsIGRhdGEtPmRhdGFbMF0pOworCXNhYTcxMjdfd3JpdGUoc2QsIDB4MjcsIDB4ODAgfCAoZGF0YS0+ZGF0YVsxXSAmIDB4M2YpKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCiAJCSJXU1MgbW9kZTogJXNcbiIsIHdzc19zdHJzW2RhdGEtPmRhdGFbMF0gJiAweGZdKTsKIAlzdGF0ZS0+d3NzX21vZGUgPSAoZGF0YS0+ZGF0YVsxXSAmIDB4M2YpIDw8IDggfCBkYXRhLT5kYXRhWzBdOwogCXJldHVybiAwOwpAQCAtNDI2LDE4ICs0MzUsMTggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzYWE3MTI3X3NldF92aWRlb19lbmFibGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGVuYWJsZSkKK3N0YXRpYyBpbnQgc2FhNzEyN19zZXRfdmlkZW9fZW5hYmxlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCiB7Ci0Jc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCiAJaWYgKGVuYWJsZSkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJFbmFibGUgVmlkZW8gT3V0cHV0XG4iKTsKLQkJc2FhNzEyN193cml0ZShjbGllbnQsIDB4MmQsIHN0YXRlLT5yZWdfMmQpOwotCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHg2MSwgc3RhdGUtPnJlZ182MSk7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIkVuYWJsZSBWaWRlbyBPdXRwdXRcbiIpOworCQlzYWE3MTI3X3dyaXRlKHNkLCAweDJkLCBzdGF0ZS0+cmVnXzJkKTsKKwkJc2FhNzEyN193cml0ZShzZCwgMHg2MSwgc3RhdGUtPnJlZ182MSk7CiAJfSBlbHNlIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiRGlzYWJsZSBWaWRlbyBPdXRwdXRcbiIpOwotCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyZCwgKHN0YXRlLT5yZWdfMmQgJiAweGYwKSk7Ci0JCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDYxLCAoc3RhdGUtPnJlZ182MSB8IDB4YzApKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiRGlzYWJsZSBWaWRlbyBPdXRwdXRcbiIpOworCQlzYWE3MTI3X3dyaXRlKHNkLCAweDJkLCAoc3RhdGUtPnJlZ18yZCAmIDB4ZjApKTsKKwkJc2FhNzEyN193cml0ZShzZCwgMHg2MSwgKHN0YXRlLT5yZWdfNjEgfCAweGMwKSk7CiAJfQogCXN0YXRlLT52aWRlb19lbmFibGUgPSBlbmFibGU7CiAJcmV0dXJuIDA7CkBAIC00NDUsMzIgKzQ1NCwzMiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNhYTcxMjdfc2V0X3N0ZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB2NGwyX3N0ZF9pZCBzdGQpCitzdGF0aWMgaW50IHNhYTcxMjdfc2V0X3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBzdGQpCiB7Ci0Jc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCWNvbnN0IHN0cnVjdCBpMmNfcmVnX3ZhbHVlICppbml0dGFiOwogCiAJaWYgKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJTZWxlY3RpbmcgNjAgSHogdmlkZW8gU3RhbmRhcmRcbiIpOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTZWxlY3RpbmcgNjAgSHogdmlkZW8gU3RhbmRhcmRcbiIpOwogCQlpbml0dGFiID0gc2FhNzEyN19pbml0X2NvbmZpZ182MGh6OwogCQlzdGF0ZS0+cmVnXzYxID0gU0FBNzEyN182MEhaX0RBQ19DT05UUk9MOwogCX0gZWxzZSB7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlNlbGVjdGluZyA1MCBIeiB2aWRlbyBTdGFuZGFyZFxuIik7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNlbGVjdGluZyA1MCBIeiB2aWRlbyBTdGFuZGFyZFxuIik7CiAJCWluaXR0YWIgPSBzYWE3MTI3X2luaXRfY29uZmlnXzUwaHo7CiAJCXN0YXRlLT5yZWdfNjEgPSBTQUE3MTI3XzUwSFpfREFDX0NPTlRST0w7CiAJfQogCiAJLyogV3JpdGUgVGFibGUgKi8KLQlzYWE3MTI3X3dyaXRlX2luaXR0YWIoY2xpZW50LCBpbml0dGFiKTsKKwlzYWE3MTI3X3dyaXRlX2luaXR0YWIoc2QsIGluaXR0YWIpOwogCXN0YXRlLT5zdGQgPSBzdGQ7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN19zZXRfb3V0cHV0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG91dHB1dCkKK3N0YXRpYyBpbnQgc2FhNzEyN19zZXRfb3V0cHV0X3R5cGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG91dHB1dCkKIHsKLQlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKIAlzd2l0Y2ggKG91dHB1dCkgewogCWNhc2UgU0FBNzEyN19PVVRQVVRfVFlQRV9SR0I6CkBAIC01MDYsMTY1ICs1MTUsMTk1IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCiAJCSJTZWxlY3RpbmcgJXMgb3V0cHV0IHR5cGVcbiIsIG91dHB1dF9zdHJzW291dHB1dF0pOwogCiAJLyogQ29uZmlndXJlIEVuY29kZXIgKi8KLQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgMHgyZCwgc3RhdGUtPnJlZ18yZCk7Ci0Jc2FhNzEyN193cml0ZShjbGllbnQsIDB4M2EsIHN0YXRlLT5yZWdfM2EgfCBzdGF0ZS0+cmVnXzNhX2NiKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCAweDJkLCBzdGF0ZS0+cmVnXzJkKTsKKwlzYWE3MTI3X3dyaXRlKHNkLCAweDNhLCBzdGF0ZS0+cmVnXzNhIHwgc3RhdGUtPnJlZ18zYV9jYik7CiAJc3RhdGUtPm91dHB1dF90eXBlID0gb3V0cHV0OwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNhYTcxMjdfc2V0X2lucHV0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGlucHV0KQorc3RhdGljIGludCBzYWE3MTI3X3NldF9pbnB1dF90eXBlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBpbnB1dCkKIHsKLQlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKIAlzd2l0Y2ggKGlucHV0KSB7CiAJY2FzZSBTQUE3MTI3X0lOUFVUX1RZUEVfTk9STUFMOgkvKiBhdmlhICovCi0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlNlbGVjdGluZyBOb3JtYWwgRW5jb2RlciBJbnB1dFxuIik7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNlbGVjdGluZyBOb3JtYWwgRW5jb2RlciBJbnB1dFxuIik7CiAJCXN0YXRlLT5yZWdfM2FfY2IgPSAwOwogCQlicmVhazsKIAogCWNhc2UgU0FBNzEyN19JTlBVVF9UWVBFX1RFU1RfSU1BR0U6CS8qIGNvbG9yIGJhciAqLwotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJTZWxlY3RpbmcgQ29sb3IgQmFyIGdlbmVyYXRvclxuIik7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNlbGVjdGluZyBDb2xvciBCYXIgZ2VuZXJhdG9yXG4iKTsKIAkJc3RhdGUtPnJlZ18zYV9jYiA9IDB4ODA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXNhYTcxMjdfd3JpdGUoY2xpZW50LCAweDNhLCBzdGF0ZS0+cmVnXzNhIHwgc3RhdGUtPnJlZ18zYV9jYik7CisJc2FhNzEyN193cml0ZShzZCwgMHgzYSwgc3RhdGUtPnJlZ18zYSB8IHN0YXRlLT5yZWdfM2FfY2IpOwogCXN0YXRlLT5pbnB1dF90eXBlID0gaW5wdXQ7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgc2FhNzEyN19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHNhYTcxMjdfc19zdGRfb3V0cHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCkKIHsKLQlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX0lOVF9TX1NURF9PVVRQVVQ6Ci0JCWlmIChzdGF0ZS0+c3RkID09ICoodjRsMl9zdGRfaWQgKilhcmcpCi0JCQlicmVhazsKLQkJcmV0dXJuIHNhYTcxMjdfc2V0X3N0ZChjbGllbnQsICoodjRsMl9zdGRfaWQgKilhcmcpOworCWlmIChzdGF0ZS0+c3RkID09IHN0ZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNhYTcxMjdfc2V0X3N0ZChzZCwgc3RkKTsKK30KIAotCWNhc2UgVklESU9DX0lOVF9HX1NURF9PVVRQVVQ6Ci0JCSoodjRsMl9zdGRfaWQgKilhcmcgPSBzdGF0ZS0+c3RkOwotCQlicmVhazsKK3N0YXRpYyBpbnQgc2FhNzEyN19zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpCit7CisJc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCWludCByYyA9IDA7CiAKLQljYXNlIFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HOgotCQlyb3V0ZS0+aW5wdXQgPSBzdGF0ZS0+aW5wdXRfdHlwZTsKLQkJcm91dGUtPm91dHB1dCA9IHN0YXRlLT5vdXRwdXRfdHlwZTsKLQkJYnJlYWs7CisJaWYgKHN0YXRlLT5pbnB1dF90eXBlICE9IHJvdXRlLT5pbnB1dCkKKwkJcmMgPSBzYWE3MTI3X3NldF9pbnB1dF90eXBlKHNkLCByb3V0ZS0+aW5wdXQpOworCWlmIChyYyA9PSAwICYmIHN0YXRlLT5vdXRwdXRfdHlwZSAhPSByb3V0ZS0+b3V0cHV0KQorCQlyYyA9IHNhYTcxMjdfc2V0X291dHB1dF90eXBlKHNkLCByb3V0ZS0+b3V0cHV0KTsKKwlyZXR1cm4gcmM7Cit9CiAKLQljYXNlIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HOgotCXsKLQkJaW50IHJjID0gMDsKK3N0YXRpYyBpbnQgc2FhNzEyN19zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzYWE3MTI3X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAotCQlpZiAoc3RhdGUtPmlucHV0X3R5cGUgIT0gcm91dGUtPmlucHV0KQotCQkJcmMgPSBzYWE3MTI3X3NldF9pbnB1dF90eXBlKGNsaWVudCwgcm91dGUtPmlucHV0KTsKLQkJaWYgKHJjID09IDAgJiYgc3RhdGUtPm91dHB1dF90eXBlICE9IHJvdXRlLT5vdXRwdXQpCi0JCQlyYyA9IHNhYTcxMjdfc2V0X291dHB1dF90eXBlKGNsaWVudCwgcm91dGUtPm91dHB1dCk7Ci0JCXJldHVybiByYzsKKwlpZiAoc3RhdGUtPnZpZGVvX2VuYWJsZSA9PSBlbmFibGUpCisJCXJldHVybiAwOworCXJldHVybiBzYWE3MTI3X3NldF92aWRlb19lbmFibGUoc2QsIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzEyN19nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmZm10LT5mbXQuc2xpY2VkLCAwLCBzaXplb2YoZm10LT5mbXQuc2xpY2VkKSk7CisJaWYgKHN0YXRlLT52cHNfZW5hYmxlKQorCQlmbXQtPmZtdC5zbGljZWQuc2VydmljZV9saW5lc1swXVsxNl0gPSBWNEwyX1NMSUNFRF9WUFM7CisJaWYgKHN0YXRlLT53c3NfZW5hYmxlKQorCQlmbXQtPmZtdC5zbGljZWQuc2VydmljZV9saW5lc1swXVsyM10gPSBWNEwyX1NMSUNFRF9XU1NfNjI1OworCWlmIChzdGF0ZS0+Y2NfZW5hYmxlKSB7CisJCWZtdC0+Zm10LnNsaWNlZC5zZXJ2aWNlX2xpbmVzWzBdWzIxXSA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQlmbXQtPmZtdC5zbGljZWQuc2VydmljZV9saW5lc1sxXVsyMV0gPSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNTsKIAl9CisJZm10LT5mbXQuc2xpY2VkLnNlcnZpY2Vfc2V0ID0KKwkJKHN0YXRlLT52cHNfZW5hYmxlID8gVjRMMl9TTElDRURfVlBTIDogMCkgfAorCQkoc3RhdGUtPndzc19lbmFibGUgPyBWNEwyX1NMSUNFRF9XU1NfNjI1IDogMCkgfAorCQkoc3RhdGUtPmNjX2VuYWJsZSA/IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1IDogMCk7CisJcmV0dXJuIDA7Cit9CiAKLQljYXNlIFZJRElPQ19TVFJFQU1PTjoKLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JCWlmIChzdGF0ZS0+dmlkZW9fZW5hYmxlID09IChjbWQgPT0gVklESU9DX1NUUkVBTU9OKSkKLQkJCWJyZWFrOwotCQlyZXR1cm4gc2FhNzEyN19zZXRfdmlkZW9fZW5hYmxlKGNsaWVudCwgY21kID09IFZJRElPQ19TVFJFQU1PTik7Ci0KLQljYXNlIFZJRElPQ19HX0ZNVDoKLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW1lbXNldCgmZm10LT5mbXQuc2xpY2VkLCAwLCBzaXplb2YoZm10LT5mbXQuc2xpY2VkKSk7Ci0JCWlmIChzdGF0ZS0+dnBzX2VuYWJsZSkKLQkJCWZtdC0+Zm10LnNsaWNlZC5zZXJ2aWNlX2xpbmVzWzBdWzE2XSA9IFY0TDJfU0xJQ0VEX1ZQUzsKLQkJaWYgKHN0YXRlLT53c3NfZW5hYmxlKQotCQkJZm10LT5mbXQuc2xpY2VkLnNlcnZpY2VfbGluZXNbMF1bMjNdID0gVjRMMl9TTElDRURfV1NTXzYyNTsKLQkJaWYgKHN0YXRlLT5jY19lbmFibGUpIHsKLQkJCWZtdC0+Zm10LnNsaWNlZC5zZXJ2aWNlX2xpbmVzWzBdWzIxXSA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OwotCQkJZm10LT5mbXQuc2xpY2VkLnNlcnZpY2VfbGluZXNbMV1bMjFdID0gVjRMMl9TTElDRURfQ0FQVElPTl81MjU7Ci0JCX0KLQkJZm10LT5mbXQuc2xpY2VkLnNlcnZpY2Vfc2V0ID0KLQkJCShzdGF0ZS0+dnBzX2VuYWJsZSA/IFY0TDJfU0xJQ0VEX1ZQUyA6IDApIHwKLQkJCShzdGF0ZS0+d3NzX2VuYWJsZSA/IFY0TDJfU0xJQ0VEX1dTU182MjUgOiAwKSB8Ci0JCQkoc3RhdGUtPmNjX2VuYWJsZSA/IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1IDogMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJdjRsX2luZm8oY2xpZW50LCAiU3RhbmRhcmQ6ICVzXG4iLCAoc3RhdGUtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgPyAiNjAgSHoiIDogIjUwIEh6Iik7Ci0JCXY0bF9pbmZvKGNsaWVudCwgIklucHV0OiAgICAlc1xuIiwgc3RhdGUtPmlucHV0X3R5cGUgPyAgImNvbG9yIGJhcnMiIDogIm5vcm1hbCIpOwotCQl2NGxfaW5mbyhjbGllbnQsICJPdXRwdXQ6ICAgJXNcbiIsIHN0YXRlLT52aWRlb19lbmFibGUgPwotCQkJb3V0cHV0X3N0cnNbc3RhdGUtPm91dHB1dF90eXBlXSA6ICJkaXNhYmxlZCIpOwotCQl2NGxfaW5mbyhjbGllbnQsICJXU1M6ICAgICAgJXNcbiIsIHN0YXRlLT53c3NfZW5hYmxlID8KLQkJCXdzc19zdHJzW3N0YXRlLT53c3NfbW9kZV0gOiAiZGlzYWJsZWQiKTsKLQkJdjRsX2luZm8oY2xpZW50LCAiVlBTOiAgICAgICVzXG4iLCBzdGF0ZS0+dnBzX2VuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCQl2NGxfaW5mbyhjbGllbnQsICJDQzogICAgICAgJXNcbiIsIHN0YXRlLT5jY19lbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JY2FzZSBWSURJT0NfREJHX0dfUkVHSVNURVI6Ci0JY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOwotCi0JCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAotCQkJCQlyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYgKGNtZCA9PSBWSURJT0NfREJHX0dfUkVHSVNURVIpCi0JCQlyZWctPnZhbCA9IHNhYTcxMjdfcmVhZChjbGllbnQsIHJlZy0+cmVnICYgMHhmZik7Ci0JCWVsc2UKLQkJCXNhYTcxMjdfd3JpdGUoY2xpZW50LCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JY2FzZSBWSURJT0NfSU5UX1NfVkJJX0RBVEE6Ci0JewotCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgKmRhdGEgPSBhcmc7Ci0KLQkJc3dpdGNoIChkYXRhLT5pZCkgewotCQljYXNlIFY0TDJfU0xJQ0VEX1dTU182MjU6Ci0JCQlyZXR1cm4gc2FhNzEyN19zZXRfd3NzKGNsaWVudCwgZGF0YSk7Ci0JCWNhc2UgVjRMMl9TTElDRURfVlBTOgotCQkJcmV0dXJuIHNhYTcxMjdfc2V0X3ZwcyhjbGllbnQsIGRhdGEpOwotCQljYXNlIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OgotCQkJaWYgKGRhdGEtPmZpZWxkID09IDApCi0JCQkJcmV0dXJuIHNhYTcxMjdfc2V0X2NjKGNsaWVudCwgZGF0YSk7Ci0JCQlyZXR1cm4gc2FhNzEyN19zZXRfeGRzKGNsaWVudCwgZGF0YSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywgc3RhdGUtPmlkZW50LCAwKTsKLQorc3RhdGljIGludCBzYWE3MTI3X3NfdmJpX2RhdGEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICpkYXRhKQoreworCXN3aXRjaCAoZGF0YS0+aWQpIHsKKwljYXNlIFY0TDJfU0xJQ0VEX1dTU182MjU6CisJCXJldHVybiBzYWE3MTI3X3NldF93c3Moc2QsIGRhdGEpOworCWNhc2UgVjRMMl9TTElDRURfVlBTOgorCQlyZXR1cm4gc2FhNzEyN19zZXRfdnBzKHNkLCBkYXRhKTsKKwljYXNlIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OgorCQlpZiAoZGF0YS0+ZmllbGQgPT0gMCkKKwkJCXJldHVybiBzYWE3MTI3X3NldF9jYyhzZCwgZGF0YSk7CisJCXJldHVybiBzYWE3MTI3X3NldF94ZHMoc2QsIGRhdGEpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgc2FhNzEyN19nX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCisJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmVnLT52YWwgPSBzYWE3MTI3X3JlYWQoc2QsIHJlZy0+cmVnICYgMHhmZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNzEyN19zX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCisJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJc2FhNzEyN193cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2FhNzEyN19nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwgc3RhdGUtPmlkZW50LCAwKTsKK30KKworc3RhdGljIGludCBzYWE3MTI3X2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwl2NGwyX2luZm8oc2QsICJTdGFuZGFyZDogJXNcbiIsIChzdGF0ZS0+c3RkICYgVjRMMl9TVERfNTI1XzYwKSA/ICI2MCBIeiIgOiAiNTAgSHoiKTsKKwl2NGwyX2luZm8oc2QsICJJbnB1dDogICAgJXNcbiIsIHN0YXRlLT5pbnB1dF90eXBlID8gICJjb2xvciBiYXJzIiA6ICJub3JtYWwiKTsKKwl2NGwyX2luZm8oc2QsICJPdXRwdXQ6ICAgJXNcbiIsIHN0YXRlLT52aWRlb19lbmFibGUgPworCQkJb3V0cHV0X3N0cnNbc3RhdGUtPm91dHB1dF90eXBlXSA6ICJkaXNhYmxlZCIpOworCXY0bDJfaW5mbyhzZCwgIldTUzogICAgICAlc1xuIiwgc3RhdGUtPndzc19lbmFibGUgPworCQkJd3NzX3N0cnNbc3RhdGUtPndzc19tb2RlXSA6ICJkaXNhYmxlZCIpOworCXY0bDJfaW5mbyhzZCwgIlZQUzogICAgICAlc1xuIiwgc3RhdGUtPnZwc19lbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwl2NGwyX2luZm8oc2QsICJDQzogICAgICAgJXNcbiIsIHN0YXRlLT5jY19lbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBzYWE3MTI3X2NvcmVfb3BzID0geworCS5sb2dfc3RhdHVzID0gc2FhNzEyN19sb2dfc3RhdHVzLAorCS5nX2NoaXBfaWRlbnQgPSBzYWE3MTI3X2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIgPSBzYWE3MTI3X2dfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIgPSBzYWE3MTI3X3NfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHNhYTcxMjdfdmlkZW9fb3BzID0geworCS5zX3ZiaV9kYXRhID0gc2FhNzEyN19zX3ZiaV9kYXRhLAorCS5nX2ZtdCA9IHNhYTcxMjdfZ19mbXQsCisJLnNfc3RkX291dHB1dCA9IHNhYTcxMjdfc19zdGRfb3V0cHV0LAorCS5zX3JvdXRpbmcgPSBzYWE3MTI3X3Nfcm91dGluZywKKwkuc19zdHJlYW0gPSBzYWE3MTI3X3Nfc3RyZWFtLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgc2FhNzEyN19vcHMgPSB7CisJLmNvcmUgPSAmc2FhNzEyN19jb3JlX29wcywKKwkudmlkZW8gPSAmc2FhNzEyN192aWRlb19vcHMsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50IHNhYTcxMjdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNhYTcxMjdfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIHZiaSA9IHsgMCwgMCwgMCwgMCB9OyAgLyogc2V0IHRvIGRpc2FibGVkICovCiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCkBAIC02NzQsNDAgKzcxMyw0MiBAQAogCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRldGVjdGluZyBzYWE3MTI3IGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsCiAJCQljbGllbnQtPmFkZHIgPDwgMSk7CiAKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTI3X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZzYWE3MTI3X29wcyk7CisKIAkvKiBGaXJzdCB0ZXN0IHJlZ2lzdGVyIDA6IEJpdHMgNS03IGFyZSBhIHZlcnNpb24gSUQgKHNob3VsZCBiZSAwKSwKIAkgICBhbmQgYml0IDIgc2hvdWxkIGFsc28gYmUgMC4KIAkgICBUaGlzIGlzIHJhdGhlciBnZW5lcmFsLCBzbyB0aGUgc2Vjb25kIHRlc3QgaXMgbW9yZSBzcGVjaWZpYyBhbmQKIAkgICBsb29rcyBhdCB0aGUgJ2VuZGluZyBwb2ludCBvZiBidXJzdCBpbiBjbG9jayBjeWNsZXMnIHdoaWNoIGlzCiAJICAgMHgxZCBhZnRlciBhIHJlc2V0IGFuZCBub3QgZXhwZWN0ZWQgdG8gZXZlciBjaGFuZ2UuICovCi0JaWYgKChzYWE3MTI3X3JlYWQoY2xpZW50LCAwKSAmIDB4ZTQpICE9IDAgfHwKLQkJCShzYWE3MTI3X3JlYWQoY2xpZW50LCAweDI5KSAmIDB4M2YpICE9IDB4MWQpIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAic2FhNzEyNyBub3QgZm91bmRcbiIpOworCWlmICgoc2FhNzEyN19yZWFkKHNkLCAwKSAmIDB4ZTQpICE9IDAgfHwKKwkJCShzYWE3MTI3X3JlYWQoc2QsIDB4MjkpICYgMHgzZikgIT0gMHgxZCkgeworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJzYWE3MTI3IG5vdCBmb3VuZFxuIik7CisJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhYTcxMjdfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQotCWlmIChzdGF0ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKIAogCS8qIENvbmZpZ3VyZSBFbmNvZGVyICovCiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJDb25maWd1cmluZyBlbmNvZGVyXG4iKTsKLQlzYWE3MTI3X3dyaXRlX2luaXR0YWIoY2xpZW50LCBzYWE3MTI3X2luaXRfY29uZmlnX2NvbW1vbik7Ci0Jc2FhNzEyN19zZXRfc3RkKGNsaWVudCwgVjRMMl9TVERfTlRTQyk7Ci0Jc2FhNzEyN19zZXRfb3V0cHV0X3R5cGUoY2xpZW50LCBTQUE3MTI3X09VVFBVVF9UWVBFX0JPVEgpOwotCXNhYTcxMjdfc2V0X3ZwcyhjbGllbnQsICZ2YmkpOwotCXNhYTcxMjdfc2V0X3dzcyhjbGllbnQsICZ2YmkpOwotCXNhYTcxMjdfc2V0X2NjKGNsaWVudCwgJnZiaSk7Ci0Jc2FhNzEyN19zZXRfeGRzKGNsaWVudCwgJnZiaSk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiQ29uZmlndXJpbmcgZW5jb2RlclxuIik7CisJc2FhNzEyN193cml0ZV9pbml0dGFiKHNkLCBzYWE3MTI3X2luaXRfY29uZmlnX2NvbW1vbik7CisJc2FhNzEyN19zZXRfc3RkKHNkLCBWNEwyX1NURF9OVFNDKTsKKwlzYWE3MTI3X3NldF9vdXRwdXRfdHlwZShzZCwgU0FBNzEyN19PVVRQVVRfVFlQRV9CT1RIKTsKKwlzYWE3MTI3X3NldF92cHMoc2QsICZ2YmkpOworCXNhYTcxMjdfc2V0X3dzcyhzZCwgJnZiaSk7CisJc2FhNzEyN19zZXRfY2Moc2QsICZ2YmkpOworCXNhYTcxMjdfc2V0X3hkcyhzZCwgJnZiaSk7CiAJaWYgKHRlc3RfaW1hZ2UgPT0gMSkKIAkJLyogVGhlIEVuY29kZXIgaGFzIGFuIGludGVybmFsIENvbG9yYmFyIGdlbmVyYXRvciAqLwogCQkvKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KLQkJc2FhNzEyN19zZXRfaW5wdXRfdHlwZShjbGllbnQsIFNBQTcxMjdfSU5QVVRfVFlQRV9URVNUX0lNQUdFKTsKKwkJc2FhNzEyN19zZXRfaW5wdXRfdHlwZShzZCwgU0FBNzEyN19JTlBVVF9UWVBFX1RFU1RfSU1BR0UpOwogCWVsc2UKLQkJc2FhNzEyN19zZXRfaW5wdXRfdHlwZShjbGllbnQsIFNBQTcxMjdfSU5QVVRfVFlQRV9OT1JNQUwpOwotCXNhYTcxMjdfc2V0X3ZpZGVvX2VuYWJsZShjbGllbnQsIDEpOworCQlzYWE3MTI3X3NldF9pbnB1dF90eXBlKHNkLCBTQUE3MTI3X0lOUFVUX1RZUEVfTk9STUFMKTsKKwlzYWE3MTI3X3NldF92aWRlb19lbmFibGUoc2QsIDEpOwogCiAJaWYgKGlkLT5kcml2ZXJfZGF0YSkgewkvKiBDaGlwIHR5cGUgaXMgYWxyZWFkeSBrbm93biAqLwogCQlzdGF0ZS0+aWRlbnQgPSBpZC0+ZHJpdmVyX2RhdGE7CkBAIC03MTUsMTAgKzc1NiwxMCBAQAogCQlpbnQgcmVhZF9yZXN1bHQ7CiAKIAkJLyogRGV0ZWN0IGlmIGl0J3MgYW4gc2FhNzEyOSAqLwotCQlyZWFkX3Jlc3VsdCA9IHNhYTcxMjdfcmVhZChjbGllbnQsIFNBQTcxMjlfUkVHX0ZBREVfS0VZX0NPTDIpOwotCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyOV9SRUdfRkFERV9LRVlfQ09MMiwgMHhhYSk7Ci0JCWlmIChzYWE3MTI3X3JlYWQoY2xpZW50LCBTQUE3MTI5X1JFR19GQURFX0tFWV9DT0wyKSA9PSAweGFhKSB7Ci0JCQlzYWE3MTI3X3dyaXRlKGNsaWVudCwgU0FBNzEyOV9SRUdfRkFERV9LRVlfQ09MMiwKKwkJcmVhZF9yZXN1bHQgPSBzYWE3MTI3X3JlYWQoc2QsIFNBQTcxMjlfUkVHX0ZBREVfS0VZX0NPTDIpOworCQlzYWE3MTI3X3dyaXRlKHNkLCBTQUE3MTI5X1JFR19GQURFX0tFWV9DT0wyLCAweGFhKTsKKwkJaWYgKHNhYTcxMjdfcmVhZChzZCwgU0FBNzEyOV9SRUdfRkFERV9LRVlfQ09MMikgPT0gMHhhYSkgeworCQkJc2FhNzEyN193cml0ZShzZCwgU0FBNzEyOV9SRUdfRkFERV9LRVlfQ09MMiwKIAkJCQkJcmVhZF9yZXN1bHQpOwogCQkJc3RhdGUtPmlkZW50ID0gVjRMMl9JREVOVF9TQUE3MTI5OwogCQkJc3RybGNweShjbGllbnQtPm5hbWUsICJzYWE3MTI5IiwgSTJDX05BTUVfU0laRSk7CkBAIC03MjgsMTAgKzc2OSwxMCBAQAogCQl9CiAJfQogCi0JdjRsX2luZm8oY2xpZW50LCAiJXMgZm91bmQgQCAweCV4ICglcylcbiIsIGNsaWVudC0+bmFtZSwKKwl2NGwyX2luZm8oc2QsICIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgY2xpZW50LT5uYW1lLAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAJaWYgKHN0YXRlLT5pZGVudCA9PSBWNEwyX0lERU5UX1NBQTcxMjkpCi0JCXNhYTcxMjdfd3JpdGVfaW5pdHRhYihjbGllbnQsIHNhYTcxMjlfaW5pdF9jb25maWdfZXh0cmEpOworCQlzYWE3MTI3X3dyaXRlX2luaXR0YWIoc2QsIHNhYTcxMjlfaW5pdF9jb25maWdfZXh0cmEpOwogCXJldHVybiAwOwogfQogCkBAIC03MzksOSArNzgwLDEyIEBACiAKIHN0YXRpYyBpbnQgc2FhNzEyN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CiAJLyogVHVybiBvZmYgVFYgb3V0cHV0ICovCi0Jc2FhNzEyN19zZXRfdmlkZW9fZW5hYmxlKGNsaWVudCwgMCk7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXNhYTcxMjdfc2V0X3ZpZGVvX2VuYWJsZShzZCwgMCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYwLDcgKzgwNCw2IEBACiBzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CiAJLm5hbWUgPSAic2FhNzEyNyIsCiAJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1NBQTcxMjcsCi0JLmNvbW1hbmQgPSBzYWE3MTI3X2NvbW1hbmQsCiAJLnByb2JlID0gc2FhNzEyN19wcm9iZSwKIAkucmVtb3ZlID0gc2FhNzEyN19yZW1vdmUsCiAJLmlkX3RhYmxlID0gc2FhNzEyN19pZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IGRkYzU0MDIuLmEyZTNmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtNDYwNiw2ICs0NjA2LDQzIEBACiAJCQkuZ3BpbyAgID0gMHgwMjAwMDAwLAogCQl9LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfS1dPUkxEX1BMVVNfVFZfQU5BTE9HXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkt3b3JsZCBQbHVzIFRWIEFuYWxvZyBMaXRlIFBDSSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1lNRUNfVFZGXzU1MzNNRiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVFVORVJfVEVBNTc2NywKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMHg4MDAwMDcwMCwKKwkJLmlucHV0cyA9IHsgeworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJCS50diAgICAgPSAxLAorCQkJLmdwaW8gICA9IDB4MTAwLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MjAwLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDIwMCwKKwkJfSB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MTAwLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSAyLAorCQl9LAorCX0sCiB9OwogCiBjb25zdCB1bnNpZ25lZCBpbnQgc2FhNzEzNF9iY291bnQgPSBBUlJBWV9TSVpFKHNhYTcxMzRfYm9hcmRzKTsKQEAgLTQ3MzYsNiArNDc3MywxMiBAQAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9NRDcxMzQsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTZiZSwgLyogQ1RYOTQ2IGFuYWxvZyBUViwgSFcgbXBlZywgRFZCLVQgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4NTAwMCwgLyogb25seSBhbmFsb2cgVFYgYW5kIERWQi1UIGZvciBub3cgKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTUQ3MTM0LAorCX0sIHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAogCQkuc3VidmVuZG9yICAgID0gMHgxMDQ4LAogCQkuc3ViZGV2aWNlICAgID0gMHgyMjZiLApAQCAtNTY1Myw2ICs1Njk2LDEyIEBACiAJCS5zdWJkZXZpY2UgICAgPSAweDQ4NzgsIC8qIFJFVjoxLjAyRyAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RJR0VSXzNJTjEsCiAJfSwgeworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE3ZGUsCisJCS5zdWJkZXZpY2UgICAgPSAweDcxMjgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9QTFVTX1RWX0FOQUxPRywKKwl9LCB7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKQEAgLTU4ODAsNiArNTkyOSw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF81MDdfOUZNOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9HRU5JVVNfVFZHT19BMTFNQ0U6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1JFQUxfQU5HRUxfMjIwOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfUExVU19UVl9BTkFMT0c6CiAJCWRldi0+aGFzX3JlbW90ZSA9IFNBQTcxMzRfUkVNT1RFX0dQSU87CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJTX0xSMzAwOgpAQCAtNjA0OCw3ICs2MDk4LDcgQEAKIAkJc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnICB4YzIwMjhfY2ZnOwogCQlzdHJ1Y3QgeGMyMDI4X2N0cmwgICAgICAgICAgIGN0bDsKIAotCQltZW1zZXQoJnhjMjAyOF9jZmcsIDAsIHNpemVvZihjdGwpKTsKKwkJbWVtc2V0KCZ4YzIwMjhfY2ZnLCAwLCBzaXplb2YoeGMyMDI4X2NmZykpOwogCQltZW1zZXQoJmN0bCwgMCwgc2l6ZW9mKGN0bCkpOwogCiAJCWN0bC5mbmFtZSAgID0gWEMyMDI4X0RFRkFVTFRfRklSTVdBUkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IDhjNDYxMTUuLmQ5YTU2NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC05NTQsMjAgKzk1NCwxNCBAQAogCS8qIEZJWE1FOiBhZGQgc3VwcG9ydCBmb3IgbXVsdGktZnJvbnRlbmQgKi8KIAltdXRleF9pbml0KCZkZXYtPmZyb250ZW5kcy5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5mcm9udGVuZHMuZmVsaXN0KTsKLQlkZXYtPmZyb250ZW5kcy5hY3RpdmVfZmVfaWQgPSAwOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKSBhbGxvY2F0aW5nIDEgZnJvbnRlbmRcbiIsIF9fZnVuY19fKTsKLQotCWlmICh2aWRlb2J1Zl9kdmJfYWxsb2NfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAxKSA9PSBOVUxMKSB7CisJZmUwID0gdmlkZW9idWZfZHZiX2FsbG9jX2Zyb250ZW5kKCZkZXYtPmZyb250ZW5kcywgMSk7CisJaWYgKCFmZTApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGZhaWxlZCB0byBhbGxvY1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkvKiBHZXQgdGhlIGZpcnN0IGZyb250ZW5kICovCi0JZmUwID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIDEpOwotCWlmICghZmUwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLwogCWRldi0+dHMubnJfYnVmcyAgICA9IDMyOwogCWRldi0+dHMubnJfcGFja2V0cyA9IDMyKjQ7CkBAIC0xMzc2LDcgKzEzNzAsNyBAQAogCQl9OwogCiAJCWlmICghZmUwLT5kdmIuZnJvbnRlbmQpCi0JCQlyZXR1cm4gLTE7CisJCQlnb3RvIGRldHRhY2hfZnJvbnRlbmQ7CiAKIAkJZmUgPSBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLCAmY2ZnKTsKIAkJaWYgKCFmZSkgewpAQCAtMTM4OCw3ICsxMzgyLDcgQEAKIAogCWlmIChOVUxMID09IGZlMC0+ZHZiLmZyb250ZW5kKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXMvZHZiOiBmcm9udGVuZCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybiAtMTsKKwkJZ290byBkZXR0YWNoX2Zyb250ZW5kOwogCX0KIAkvKiBkZWZpbmUgZ2VuZXJhbC1wdXJwb3NlIGNhbGxiYWNrIHBvaW50ZXIgKi8KIAlmZTAtPmR2Yi5mcm9udGVuZC0+Y2FsbGJhY2sgPSBzYWE3MTM0X3R1bmVyX2NhbGxiYWNrOwpAQCAtMTQxMSwxMSArMTQwNSw4IEBACiAJcmV0dXJuIHJldDsKIAogZGV0dGFjaF9mcm9udGVuZDoKLQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQpCi0JCWR2Yl9mcm9udGVuZF9kZXRhY2goZmUwLT5kdmIuZnJvbnRlbmQpOwotCWZlMC0+ZHZiLmZyb250ZW5kID0gTlVMTDsKLQotCXJldHVybiAtMTsKKwl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBkdmJfZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKQEAgLTE0NTQsOCArMTQ0NSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JaWYgKGZlMC0+ZHZiLmZyb250ZW5kKQotCQl2aWRlb2J1Zl9kdmJfdW5yZWdpc3Rlcl9idXMoJmRldi0+ZnJvbnRlbmRzKTsKKwl2aWRlb2J1Zl9kdmJfdW5yZWdpc3Rlcl9idXMoJmRldi0+ZnJvbnRlbmRzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggYzUzZmQ1Zi4uZDIxMjRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC05Nyw2ICs5NywxNSBAQAogCWRwcmludGsoImJ1aWxkX2tleSBncGlvPTB4JXggbWFzaz0weCV4IGRhdGE9JWRcbiIsCiAJCWdwaW8sIGlyLT5tYXNrX2tleWNvZGUsIGRhdGEpOwogCisJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9QTFVTX1RWX0FOQUxPRzoKKwkJaWYgKGRhdGEgPT0gaXItPm1hc2tfa2V5Y29kZSkKKwkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCQllbHNlCisJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGRhdGEsIGRhdGEpOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoaXItPnBvbGxpbmcpIHsKIAkJaWYgKChpci0+bWFza19rZXlkb3duICAmJiAgKDAgIT0gKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSkpIHx8CiAJCSAgICAoaXItPm1hc2tfa2V5dXAgICAgJiYgICgwID09IChncGlvICYgaXItPm1hc2tfa2V5dXApKSkpIHsKQEAgLTU4Niw2ICs1OTUsMTEgQEAKIAkJbWFza19rZXl1cCAgID0gMHg0MDAwOwogCQlwb2xsaW5nID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfUExVU19UVl9BTkFMT0c6CisJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX2t3b3JsZF9wbHVzX3R2X2FuYWxvZzsKKwkJbWFza19rZXljb2RlID0gMHg3ZjsKKwkJcG9sbGluZyA9IDQwOyAvKiBtcyAqLworCQlicmVhazsKIAl9CiAJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKIAkJcHJpbnRrKCIlczogT29wczogSVIgY29uZmlnIGVycm9yIFtjYXJkPSVkXVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYwppbmRleCBjNWQwYjQ0Li43NmIxNjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJLm1vZGUgICAgICAgICAgPSBUVkFVRElPX0ZNX01PTk8sCiAJfQogfTsKLSNkZWZpbmUgVFZBVURJTyAoc2l6ZW9mKHR2YXVkaW8pL3NpemVvZihzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvKSkKKyNkZWZpbmUgVFZBVURJTyBBUlJBWV9TSVpFKHR2YXVkaW8pCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCAyNDA5NmQ2Li5mNmMxZmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTI3NSw4ICsyNzUsOSBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1JFQUxfQU5HRUxfMjIwICAgICAxNTAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9IRFRWX1BDSSAgMTUxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19USUdFUiAgICAgICAgIDE1MgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9QTFVTX1RWX0FOQUxPRyAxNTMKIAotI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CisjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDMyCiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE3eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTd4LmMKaW5kZXggYWY2MGVkZS4uOWJlZmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTd4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTd4LmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYuaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFNBQTcxN3ggYXVkaW8vdmlkZW8gZGVjb2RlciBkcml2ZXIiKTsKQEAgLTU0LDYgKzU0LDcgQEAKICAqLwogCiBzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCXY0bDJfc3RkX2lkIHN0ZDsKIAlpbnQgaW5wdXQ7CiAJaW50IGVuYWJsZTsKQEAgLTc1LDYgKzc2LDExIEBACiAJaW50IGF1ZGlvX2lucHV0OwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSwgc2QpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBmb3IgYXVkaW8gbW9kZSAqLwpAQCAtODgsOCArOTQsOSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNhYTcxN3hfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIHJlZywgdTMyIHZhbHVlKQorc3RhdGljIGludCBzYWE3MTd4X3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiByZWcsIHUzMiB2YWx1ZSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwogCWludCBmd19hZGRyID0gcmVnID09IDB4NDU0IHx8IChyZWcgPj0gMHg0NjQgJiYgcmVnIDw9IDB4NDc4KSB8fCByZWcgPT0gMHg0ODAgfHwgcmVnID09IDB4NDg4OwogCXVuc2lnbmVkIGNoYXIgbW0xWzZdOwpAQCAtMTA5LDIwICsxMTYsMjEgQEAKIAl9CiAJbXNnLmxlbiA9IGZ3X2FkZHIgPyA1IDogMzsgLyogTG9uZyBSZWdpc3RlcnMgaGF2ZSAqb25seSogdGhyZWUgYnl0ZXMhICovCiAJbXNnLmJ1ZiA9IG1tMTsKLQl2NGxfZGJnKDIsIGRlYnVnLCBjbGllbnQsICJ3cm90ZTogIHJlZyAweCUwM3g9JTA4eFxuIiwgcmVnLCB2YWx1ZSk7CisJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAid3JvdGU6ICByZWcgMHglMDN4PSUwOHhcbiIsIHJlZywgdmFsdWUpOwogCXJldHVybiBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSkgPT0gMTsKIH0KIAotc3RhdGljIHZvaWQgc2FhNzE3eF93cml0ZV9yZWdzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiAqZGF0YSkKK3N0YXRpYyB2b2lkIHNhYTcxN3hfd3JpdGVfcmVncyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgKmRhdGEpCiB7CiAJd2hpbGUgKGRhdGFbMF0gfHwgZGF0YVsxXSkgewotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgZGF0YVswXSwgZGF0YVsxXSk7CisJCXNhYTcxN3hfd3JpdGUoc2QsIGRhdGFbMF0sIGRhdGFbMV0pOwogCQlkYXRhICs9IDI7CiAJfQogfQogCi1zdGF0aWMgdTMyIHNhYTcxN3hfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgcmVnKQorc3RhdGljIHUzMiBzYWE3MTd4X3JlYWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwogCWludCBmd19hZGRyID0gKHJlZyA+PSAweDQwNCAmJiByZWcgPD0gMHg0YjgpIHx8IHJlZyA9PSAweDUyODsKIAl1bnNpZ25lZCBjaGFyIG1tMVsyXTsKQEAgLTE0Niw3ICsxNTQsNyBAQAogCWVsc2UKIAkJdmFsdWUgPSBtbTJbMF0gJiAweGZmOwogCi0JdjRsX2RiZygyLCBkZWJ1ZywgY2xpZW50LCAicmVhZDogIHJlZyAweCUwM3g9MHglMDh4XG4iLCByZWcsIHZhbHVlKTsKKwl2NGwyX2RiZygyLCBkZWJ1Zywgc2QsICJyZWFkOiAgcmVnIDB4JTAzeD0weCUwOHhcbiIsIHJlZywgdmFsdWUpOwogCXJldHVybiB2YWx1ZTsKIH0KIApAQCAtNjgwLDcgKzY4OCw3IEBACiAKIAogLyogR2V0IGRldGVjdGVkIGF1ZGlvIGZsYWdzIChmcm9tIHNhYTcxMzQgZHJpdmVyKSAqLwotc3RhdGljIHZvaWQgZ2V0X2luZl9kZXZfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgdm9pZCBnZXRfaW5mX2Rldl9zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJaW50ICpkdWFsX2ZsYWcsIGludCAqc3RlcmVvX2ZsYWcpCiB7CiAJdTMyIHJlZ19kYXRhMzsKQEAgLTcxOSwxMyArNzI3LDEzIEBACiAJLyogKGRlbWRlYyBzdGF0dXM6IDB4NTI4KSAqLwogCiAJLyogcmVhZCBjdXJyZW50IHN0YXR1cyAqLwotCXJlZ19kYXRhMyA9IHNhYTcxN3hfcmVhZChjbGllbnQsIDB4MDUyOCk7CisJcmVnX2RhdGEzID0gc2FhNzE3eF9yZWFkKHNkLCAweDA1MjgpOwogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAidHZhdWRpbyB0aHJlYWQgc3RhdHVzOiAweCV4IFslcyVzJXNdXG4iLAorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInR2YXVkaW8gdGhyZWFkIHN0YXR1czogMHgleCBbJXMlcyVzXVxuIiwKIAkJcmVnX2RhdGEzLCBzdGRyZXNbcmVnX2RhdGEzICYgMHgxZl0sCiAJCShyZWdfZGF0YTMgJiAweDAwMDAyMCkgPyAiLHN0ZXJlbyIgOiAiIiwKIAkJKHJlZ19kYXRhMyAmIDB4MDAwMDQwKSA/ICIsZHVhbCIgICA6ICIiKTsKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZXRhaWxlZCBzdGF0dXM6ICIKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZXRhaWxlZCBzdGF0dXM6ICIKIAkJIiVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzIyVzXG4iLAogCQkocmVnX2RhdGEzICYgMHgwMDAwODApID8gIiBBMi9FSUFKIHBpbG90IHRvbmUgIiAgICAgOiAiIiwKIAkJKHJlZ19kYXRhMyAmIDB4MDAwMTAwKSA/ICIgQTIvRUlBSiBkdWFsICIgICAgICAgICAgIDogIiIsCkBAIC03NDYsNTEgKzc1NCw1MSBAQAogCQkocmVnX2RhdGEzICYgMHgxMDAwMDApID8gIiBpbml0IGRvbmUgIiAgICAgICAgICAgICAgOiAiIik7CiAKIAlpZiAocmVnX2RhdGEzICYgMHgwMDAyMjApIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiU1QhISFcbiIpOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTVCEhIVxuIik7CiAJCSpzdGVyZW9fZmxhZyA9IDE7CiAJfQogCiAJaWYgKHJlZ19kYXRhMyAmIDB4MDAwMTQwKSB7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIkRVQUwhISFcbiIpOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJEVUFMISEhXG4iKTsKIAkJKmR1YWxfZmxhZyA9IDE7CiAJfQogfQogCiAvKiByZWdzIHdyaXRlIHRvIHNldCBhdWRpbyBtb2RlICovCi1zdGF0aWMgdm9pZCBzZXRfYXVkaW9fbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYXVkaW9fbW9kZSkKK3N0YXRpYyB2b2lkIHNldF9hdWRpb19tb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBhdWRpb19tb2RlKQogewotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIndyaXRpbmcgcmVnaXN0ZXJzIHRvIHNldCBhdWRpbyBtb2RlIGJ5IHNldCAlZFxuIiwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ3cml0aW5nIHJlZ2lzdGVycyB0byBzZXQgYXVkaW8gbW9kZSBieSBzZXQgJWRcbiIsCiAJCQlhdWRpb19tb2RlKTsKIAotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDQ2YywgcmVnX3NldF9hdWRpb190ZW1wbGF0ZVthdWRpb19tb2RlXVswXSk7Ci0Jc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NDcwLCByZWdfc2V0X2F1ZGlvX3RlbXBsYXRlW2F1ZGlvX21vZGVdWzFdKTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDQ2YywgcmVnX3NldF9hdWRpb190ZW1wbGF0ZVthdWRpb19tb2RlXVswXSk7CisJc2FhNzE3eF93cml0ZShzZCwgMHg0NzAsIHJlZ19zZXRfYXVkaW9fdGVtcGxhdGVbYXVkaW9fbW9kZV1bMV0pOwogfQogCiAvKiB3cml0ZSByZWdzIHRvIHZpZGVvIG91dHB1dCBsZXZlbCAoYnJpZ2h0LGNvbnRyYXN0LGh1ZSxzYXQpICovCi1zdGF0aWMgdm9pZCBzZXRfdmlkZW9fb3V0cHV0X2xldmVsX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyB2b2lkIHNldF92aWRlb19vdXRwdXRfbGV2ZWxfcmVncyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlcikKIHsKIAkvKiBicmlnaHRuZXNzIGZmaCAoYnJpZ2h0KSAtIDgwaCAoSVRVIGxldmVsKSAtIDAwaCAoZGFyaykgKi8KLQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHgxMGEsIGRlY29kZXItPmJyaWdodCk7CisJc2FhNzE3eF93cml0ZShzZCwgMHgxMGEsIGRlY29kZXItPmJyaWdodCk7CiAKIAkvKiBjb250cmFzdCA3ZmggKG1heDogMS45ODQpIC0gNDRoIChJVFUpIC0gNDBoICgxLjApIC0KIAkgICAwaCAobHVtaW5hbmNlIG9mZikgNDA6IGkyYyBkdW1wCiAJICAgYzBoICgtMS4wIGludmVyc2UgY2hyb21pbmFuY2UpCiAJICAgODBoICgtMi4wIGludmVyc2UgY2hyb21pbmFuY2UpICovCi0Jc2FhNzE3eF93cml0ZShjbGllbnQsIDB4MTBiLCBkZWNvZGVyLT5jb250cmFzdCk7CisJc2FhNzE3eF93cml0ZShzZCwgMHgxMGIsIGRlY29kZXItPmNvbnRyYXN0KTsKIAogCS8qIHNhdHVyYXRpb24/IDdmaChtYXgpLTQwaChJVFUpLTBoKGNvbG9yIG9mZikKIAkgICBjMGggKC0xLjAgaW52ZXJzZSBjaHJvbWluYW5jZSkKIAkgICA4MGggKC0yLjAgaW52ZXJzZSBjaHJvbWluYW5jZSkgKi8KLQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHgxMGMsIGRlY29kZXItPnNhdCk7CisJc2FhNzE3eF93cml0ZShzZCwgMHgxMGMsIGRlY29kZXItPnNhdCk7CiAKIAkvKiBjb2xvciBodWUgKHBoYXNlKSBjb250cm9sCiAJICAgN2ZoICgrMTc4LjYpIC0gMGggKDAgbm9ybWFsKSAtIDgwaCAoLTE4MC4wKSAqLwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDEwZCwgZGVjb2Rlci0+aHVlKTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDEwZCwgZGVjb2Rlci0+aHVlKTsKIH0KIAogLyogd3JpdGUgcmVncyB0byBzZXQgYXVkaW8gdm9sdW1lLCBiYXNzIGFuZCB0cmVibGUgKi8KLXN0YXRpYyBpbnQgc2V0X2F1ZGlvX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgc2V0X2F1ZGlvX3JlZ3Moc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJc3RydWN0IHNhYTcxN3hfc3RhdGUgKmRlY29kZXIpCiB7CiAJdTggbXV0ZSA9IDB4YWM7IC8qIC04NCBkQiAqLwpAQCAtNzk4LDggKzgwNiw4IEBACiAJdW5zaWduZWQgaW50IHdvcmtfbCwgd29ya19yOwogCiAJLyogc2V0IFNJRiBhbmFsb2cgSS9PIHNlbGVjdCAqLwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDA1OTQsIGRlY29kZXItPmF1ZGlvX2lucHV0KTsKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzZXQgYXVkaW8gaW5wdXQgJWRcbiIsCisJc2FhNzE3eF93cml0ZShzZCwgMHgwNTk0LCBkZWNvZGVyLT5hdWRpb19pbnB1dCk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAic2V0IGF1ZGlvIGlucHV0ICVkXG4iLAogCQkJZGVjb2Rlci0+YXVkaW9faW5wdXQpOwogCiAJLyogbm9ybWFsaXplICggNjU1MzUgdG8gMCAtPiAyNCB0byAtNDAgKG5vdCAtODQpKSAqLwpAQCAtODE5LDE3ICs4MjcsMTcgQEAKIAkJCSgodTgpZGVjb2Rlci0+YXVkaW9fbWFpbl92b2xfciA8PCA4KTsKIAl9CiAKLQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg0ODAsIHZhbCk7CisJc2FhNzE3eF93cml0ZShzZCwgMHg0ODAsIHZhbCk7CiAKIAkvKiBiYXNzIGFuZCB0cmVibGU7IGdvIHRvIGFub3RoZXIgZnVuY3Rpb24gKi8KIAkvKiBzZXQgYmFzcyBhbmQgdHJlYmxlICovCiAJdmFsID0gZGVjb2Rlci0+YXVkaW9fbWFpbl9iYXNzIHwgKGRlY29kZXItPmF1ZGlvX21haW5fdHJlYmxlIDw8IDgpOwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDQ4OCwgdmFsKTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDQ4OCwgdmFsKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKiogc2NhbGluZyBzdGFmZiAqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNldF9oX3ByZXNjYWxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgdm9pZCBzZXRfaF9wcmVzY2FsZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQlpbnQgdGFzaywgaW50IHByZXNjYWxlKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewpAQCAtODYyLDEwNyArODcwLDEwMSBAQAogCQlyZXR1cm47CiAKIAkvKiBob3Jpem9uYWwgcHJlc2NhbGluZyAqLwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDYwICsgdGFza19zaGlmdCwgdmFsc1tpXS54cHNjKTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDYwICsgdGFza19zaGlmdCwgdmFsc1tpXS54cHNjKTsKIAkvKiBhY2N1bXVsYXRpb24gbGVuZ3RoICovCi0Jc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NjEgKyB0YXNrX3NoaWZ0LCB2YWxzW2ldLnhhY2wpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4NjEgKyB0YXNrX3NoaWZ0LCB2YWxzW2ldLnhhY2wpOwogCS8qIGxldmVsIGNvbnRyb2wgKi8KLQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg2MiArIHRhc2tfc2hpZnQsCisJc2FhNzE3eF93cml0ZShzZCwgMHg2MiArIHRhc2tfc2hpZnQsCiAJCQkodmFsc1tpXS54YzJfMSA8PCAzKSB8IHZhbHNbaV0ueGRjZyk7CiAJLypGSVIgcHJlZmlsdGVyIGNvbnRyb2wgKi8KLQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg2MyArIHRhc2tfc2hpZnQsCisJc2FhNzE3eF93cml0ZShzZCwgMHg2MyArIHRhc2tfc2hpZnQsCiAJCQkodmFsc1tpXS52cGZ5IDw8IDIpIHwgdmFsc1tpXS52cGZ5KTsKIH0KIAogLyoqKioqKioqKiogc2NhbGluZyBzdGFmZiAqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNldF92X3NjYWxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCB0YXNrLCBpbnQgeXNjYWxlKQorc3RhdGljIHZvaWQgc2V0X3Zfc2NhbGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IHRhc2ssIGludCB5c2NhbGUpCiB7CiAJaW50IHRhc2tfc2hpZnQ7CiAKIAl0YXNrX3NoaWZ0ID0gdGFzayAqIDB4NDA7CiAJLyogVmVydGljYWwgc2NhbGluZyByYXRpbyAoTE9XKSAqLwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDcwICsgdGFza19zaGlmdCwgeXNjYWxlICYgMHhmZik7CisJc2FhNzE3eF93cml0ZShzZCwgMHg3MCArIHRhc2tfc2hpZnQsIHlzY2FsZSAmIDB4ZmYpOwogCS8qIFZlcnRpY2FsIHNjYWxpbmcgcmF0aW8gKEhJKSAqLwotCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDcxICsgdGFza19zaGlmdCwgeXNjYWxlID4+IDgpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4NzEgKyB0YXNrX3NoaWZ0LCB5c2NhbGUgPj4gOCk7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNzE3eF9zZXRfYXVkaW9fY2xvY2tfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgZnJlcSkKK3N0YXRpYyBpbnQgc2FhNzE3eF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQkvKiBub3QgeWV0IGltcGxhbWVudCwgc28gc2FhNzE3eF9jZmdfPz9oel8/P19hdWRpbyBpcyBub3QgZGVmaW5lZC4gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYWE3MTd4X3NldF92NGxjdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNhYTcxN3hfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNhYTcxN3hfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKIAkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDI1NSkgewotCQkJdjRsX2VycihjbGllbnQsICJpbnZhbGlkIGJyaWdodG5lc3Mgc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOworCQkJdjRsMl9lcnIoc2QsICJpbnZhbGlkIGJyaWdodG5lc3Mgc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJCX0KIAogCQlzdGF0ZS0+YnJpZ2h0ID0gY3RybC0+dmFsdWU7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImJyaWdodDolZFxuIiwgc3RhdGUtPmJyaWdodCk7Ci0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDEwYSwgc3RhdGUtPmJyaWdodCk7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImJyaWdodDolZFxuIiwgc3RhdGUtPmJyaWdodCk7CisJCXNhYTcxN3hfd3JpdGUoc2QsIDB4MTBhLCBzdGF0ZS0+YnJpZ2h0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgogCQlpZiAoY3RybC0+dmFsdWUgPCAwIHx8IGN0cmwtPnZhbHVlID4gMTI3KSB7Ci0JCQl2NGxfZXJyKGNsaWVudCwgImludmFsaWQgY29udHJhc3Qgc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOworCQkJdjRsMl9lcnIoc2QsICJpbnZhbGlkIGNvbnRyYXN0IHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKIAkJCXJldHVybiAtRVJBTkdFOwogCQl9CiAKIAkJc3RhdGUtPmNvbnRyYXN0ID0gY3RybC0+dmFsdWU7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImNvbnRyYXN0OiVkXG4iLCBzdGF0ZS0+Y29udHJhc3QpOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHgxMGIsIHN0YXRlLT5jb250cmFzdCk7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNvbnRyYXN0OiVkXG4iLCBzdGF0ZS0+Y29udHJhc3QpOworCQlzYWE3MTd4X3dyaXRlKHNkLCAweDEwYiwgc3RhdGUtPmNvbnRyYXN0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CiAJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiAxMjcpIHsKLQkJCXY0bF9lcnIoY2xpZW50LCAiaW52YWxpZCBzYXR1cmF0aW9uIHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKKwkJCXY0bDJfZXJyKHNkLCAiaW52YWxpZCBzYXR1cmF0aW9uIHNldHRpbmcgJWRcbiIsIGN0cmwtPnZhbHVlKTsKIAkJCXJldHVybiAtRVJBTkdFOwogCQl9CiAKIAkJc3RhdGUtPnNhdCA9IGN0cmwtPnZhbHVlOwotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzYXQ6JWRcbiIsIHN0YXRlLT5zYXQpOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHgxMGMsIHN0YXRlLT5zYXQpOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJzYXQ6JWRcbiIsIHN0YXRlLT5zYXQpOworCQlzYWE3MTd4X3dyaXRlKHNkLCAweDEwYywgc3RhdGUtPnNhdCk7CiAJCWJyZWFrOwogCiAJY2FzZSBWNEwyX0NJRF9IVUU6CiAJCWlmIChjdHJsLT52YWx1ZSA8IC0xMjcgfHwgY3RybC0+dmFsdWUgPiAxMjcpIHsKLQkJCXY0bF9lcnIoY2xpZW50LCAiaW52YWxpZCBodWUgc2V0dGluZyAlZFxuIiwgY3RybC0+dmFsdWUpOworCQkJdjRsMl9lcnIoc2QsICJpbnZhbGlkIGh1ZSBzZXR0aW5nICVkXG4iLCBjdHJsLT52YWx1ZSk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfQogCiAJCXN0YXRlLT5odWUgPSBjdHJsLT52YWx1ZTsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiaHVlOiVkXG4iLCBzdGF0ZS0+aHVlKTsKLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4MTBkLCBzdGF0ZS0+aHVlKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiaHVlOiVkXG4iLCBzdGF0ZS0+aHVlKTsKKwkJc2FhNzE3eF93cml0ZShzZCwgMHgxMGQsIHN0YXRlLT5odWUpOwogCQlicmVhazsKIAogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKIAkJc3RhdGUtPmF1ZGlvX21haW5fbXV0ZSA9IGN0cmwtPnZhbHVlOwotCQlzZXRfYXVkaW9fcmVncyhjbGllbnQsIHN0YXRlKTsKKwkJc2V0X2F1ZGlvX3JlZ3Moc2QsIHN0YXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKIAkJc3RhdGUtPmF1ZGlvX21haW5fdm9sdW1lID0gY3RybC0+dmFsdWU7Ci0JCXNldF9hdWRpb19yZWdzKGNsaWVudCwgc3RhdGUpOworCQlzZXRfYXVkaW9fcmVncyhzZCwgc3RhdGUpOwogCQlicmVhazsKIAogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKIAkJc3RhdGUtPmF1ZGlvX21haW5fYmFsYW5jZSA9IGN0cmwtPnZhbHVlOwotCQlzZXRfYXVkaW9fcmVncyhjbGllbnQsIHN0YXRlKTsKKwkJc2V0X2F1ZGlvX3JlZ3Moc2QsIHN0YXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAkJc3RhdGUtPmF1ZGlvX21haW5fdHJlYmxlID0gY3RybC0+dmFsdWU7Ci0JCXNldF9hdWRpb19yZWdzKGNsaWVudCwgc3RhdGUpOworCQlzZXRfYXVkaW9fcmVncyhzZCwgc3RhdGUpOwogCQlicmVhazsKIAogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKIAkJc3RhdGUtPmF1ZGlvX21haW5fYmFzcyA9IGN0cmwtPnZhbHVlOwotCQlzZXRfYXVkaW9fcmVncyhjbGllbnQsIHN0YXRlKTsKKwkJc2V0X2F1ZGlvX3JlZ3Moc2QsIHN0YXRlKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtOTcyLDkgKzk3NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNzE3eF9nZXRfdjRsY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBzYWE3MTd4X2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBzYWE3MTd4X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzYWE3MTd4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CkBAIC0xMTAzLDEzICsxMTA1LDE1IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgc2FhNzE3eF9zZXRfdmlkZW9faW5wdXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHNhYTcxN3hfc3RhdGUgKmRlY29kZXIsIGludCBpbnApCitzdGF0aWMgaW50IHNhYTcxN3hfc192aWRlb19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQogeworCXN0cnVjdCBzYWE3MTd4X3N0YXRlICpkZWNvZGVyID0gdG9fc3RhdGUoc2QpOworCWludCBpbnAgPSByb3V0ZS0+aW5wdXQ7CiAJaW50IGlzX3R1bmVyID0gaW5wICYgMHg4MDsgIC8qIHR1bmVyIGlucHV0IGZsYWcgKi8KIAogCWlucCAmPSAweDdmOwogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgaW5wdXQgKCVkKVxuIiwgaW5wKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZWNvZGVyIHNldCBpbnB1dCAoJWQpXG4iLCBpbnApOwogCS8qIGlucHV0cyBmcm9tIDAtOSBhcmUgYXZhaWxhYmxlKi8KIAkvKiBzYWE3MTd4IGhhdmUgbW9kZTAtbW9kZTkgYnV0IG1vZGU1IGlzIHJlc2VydmVkLiAqLwogCWlmIChpbnAgPCAwIHx8IGlucCA+IDkgfHwgaW5wID09IDUpCkBAIC0xMTE5LDIyMiArMTEyMywxOTcgQEAKIAkJaW50IGlucHV0X2xpbmUgPSBpbnA7CiAKIAkJZGVjb2Rlci0+aW5wdXQgPSBpbnB1dF9saW5lOwotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICAibm93IHNldHRpbmcgJXMgaW5wdXQgJWRcbiIsCisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgICJub3cgc2V0dGluZyAlcyBpbnB1dCAlZFxuIiwKIAkJCQlpbnB1dF9saW5lID49IDYgPyAiUy1WaWRlbyIgOiAiQ29tcG9zaXRlIiwKIAkJCQlpbnB1dF9saW5lKTsKIAogCQkvKiBzZWxlY3QgbW9kZSAqLwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHgxMDIsCi0JCQkJKHNhYTcxN3hfcmVhZChjbGllbnQsIDB4MTAyKSAmIDB4ZjApIHwKKwkJc2FhNzE3eF93cml0ZShzZCwgMHgxMDIsCisJCQkJKHNhYTcxN3hfcmVhZChzZCwgMHgxMDIpICYgMHhmMCkgfAogCQkJCWlucHV0X2xpbmUpOwogCiAJCS8qIGJ5cGFzcyBjaHJvbWluYW5jZSB0cmFwIGZvciBtb2RlcyA2Li45ICovCi0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDEwOSwKLQkJCQkoc2FhNzE3eF9yZWFkKGNsaWVudCwgMHgxMDkpICYgMHg3ZikgfAorCQlzYWE3MTd4X3dyaXRlKHNkLCAweDEwOSwKKwkJCQkoc2FhNzE3eF9yZWFkKHNkLCAweDEwOSkgJiAweDdmKSB8CiAJCQkJKGlucHV0X2xpbmUgPCA2ID8gMHgwIDogMHg4MCkpOwogCiAJCS8qIGNoYW5nZSBhdWRpb19tb2RlICovCiAJCWlmIChpc190dW5lcikgewogCQkJLyogdHVuZXIgKi8KLQkJCXNldF9hdWRpb19tb2RlKGNsaWVudCwgZGVjb2Rlci0+dHVuZXJfYXVkaW9fbW9kZSk7CisJCQlzZXRfYXVkaW9fbW9kZShzZCwgZGVjb2Rlci0+dHVuZXJfYXVkaW9fbW9kZSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBGb3JjZSB0byBTVEVSRU8gbW9kZSBpZiBDb21wb3NpdGUgb3IKIAkJCSAqIFMtVmlkZW8gd2VyZSBjaG9zZW4gKi8KLQkJCXNldF9hdWRpb19tb2RlKGNsaWVudCwgVFVORVJfQVVESU9fU1RFUkVPKTsKKwkJCXNldF9hdWRpb19tb2RlKHNkLCBUVU5FUl9BVURJT19TVEVSRU8pOwogCQl9CiAJCS8qIGNoYW5nZSBpbml0aWFsaXplIHByb2NlZHVyZSAoQ29tcG9zaXRlL1MtVmlkZW8pICovCiAJCWlmIChpc190dW5lcikKLQkJCXNhYTcxN3hfd3JpdGVfcmVncyhjbGllbnQsIHJlZ19pbml0X3R1bmVyX2lucHV0KTsKKwkJCXNhYTcxN3hfd3JpdGVfcmVncyhzZCwgcmVnX2luaXRfdHVuZXJfaW5wdXQpOwogCQllbHNlIGlmIChpbnB1dF9saW5lID49IDYpCi0JCQlzYWE3MTd4X3dyaXRlX3JlZ3MoY2xpZW50LCByZWdfaW5pdF9zdmlkZW9faW5wdXQpOworCQkJc2FhNzE3eF93cml0ZV9yZWdzKHNkLCByZWdfaW5pdF9zdmlkZW9faW5wdXQpOwogCQllbHNlCi0JCQlzYWE3MTd4X3dyaXRlX3JlZ3MoY2xpZW50LCByZWdfaW5pdF9jb21wb3NpdGVfaW5wdXQpOworCQkJc2FhNzE3eF93cml0ZV9yZWdzKHNkLCByZWdfaW5pdF9jb21wb3NpdGVfaW5wdXQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTcxN3hfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgc2FhNzE3eF9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKLQlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOwogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiSU9DVEw6ICUwOHhcbiIsIGNtZCk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVROgotCQlyZXR1cm4gc2FhNzE3eF9zZXRfYXVkaW9fY2xvY2tfZnJlcShjbGllbnQsICoodTMyICopYXJnKTsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJcmV0dXJuIHNhYTcxN3hfZ2V0X3Y0bGN0cmwoY2xpZW50LCAoc3RydWN0IHY0bDJfY29udHJvbCAqKWFyZyk7Ci0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXJldHVybiBzYWE3MTd4X3NldF92NGxjdHJsKGNsaWVudCwgKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmcpOwotCi0JY2FzZSBWSURJT0NfUVVFUllDVFJMOiB7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhYTcxN3hfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBzYWE3MTd4X3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmc2FhNzE3eF9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2FhNzE3eF9xY3RybCk7IGkrKykKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gc2FhNzE3eF9xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmc2FhNzE3eF9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KIAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjogewotCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOworc3RhdGljIGludCBzYWE3MTd4X2dfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsIHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlyZWctPnZhbCA9IHNhYTcxN3hfcmVhZChjbGllbnQsIHJlZy0+cmVnKTsKLQkJYnJlYWs7Ci0JfQorCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LCByZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlyZWctPnZhbCA9IHNhYTcxN3hfcmVhZChzZCwgcmVnLT5yZWcpOworCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6IHsKLQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKLQkJdTE2IGFkZHIgPSByZWctPnJlZyAmIDB4ZmZmZjsKLQkJdTggdmFsID0gcmVnLT52YWwgJiAweGZmOworc3RhdGljIGludCBzYWE3MTd4X3NfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJdTE2IGFkZHIgPSByZWctPnJlZyAmIDB4ZmZmZjsKKwl1OCB2YWwgPSByZWctPnZhbCAmIDB4ZmY7CiAKLQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsIHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgYWRkciwgdmFsKTsKLQkJYnJlYWs7Ci0JfQorCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LCByZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlzYWE3MTd4X3dyaXRlKHNkLCBhZGRyLCB2YWwpOworCXJldHVybiAwOworfQogI2VuZGlmCiAKLQljYXNlIFZJRElPQ19TX0ZNVDogewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmc7Ci0JCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeDsKLQkJaW50IHByZXNjYWxlLCBoX3NjYWxlLCB2X3NjYWxlOworc3RhdGljIGludCBzYWE3MTd4X3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeDsKKwlpbnQgcHJlc2NhbGUsIGhfc2NhbGUsIHZfc2NhbGU7CiAKLQkJcGl4ID0gJmZtdC0+Zm10LnBpeDsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgc2l6ZVxuIik7CisJcGl4ID0gJmZtdC0+Zm10LnBpeDsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZWNvZGVyIHNldCBzaXplXG4iKTsKIAotCQkvKiBGSVhNRSBuZWVkIGJldHRlciBib3VuZHMgY2hlY2tpbmcgaGVyZSAqLwotCQlpZiAocGl4LT53aWR0aCA8IDEgfHwgcGl4LT53aWR0aCA+IDE0NDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHBpeC0+aGVpZ2h0IDwgMSB8fCBwaXgtPmhlaWdodCA+IDk2MCkKLQkJCXJldHVybiAtRUlOVkFMOworCS8qIEZJWE1FIG5lZWQgYmV0dGVyIGJvdW5kcyBjaGVja2luZyBoZXJlICovCisJaWYgKHBpeC0+d2lkdGggPCAxIHx8IHBpeC0+d2lkdGggPiAxNDQwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGl4LT5oZWlnaHQgPCAxIHx8IHBpeC0+aGVpZ2h0ID4gOTYwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkvKiBzY2FsaW5nIHNldHRpbmcgKi8KLQkJLyogTlRTQyBhbmQgaW50ZXJsYWNlIG9ubHkgKi8KLQkJcHJlc2NhbGUgPSBTQUE3MTdYX05UU0NfV0lEVEggLyBwaXgtPndpZHRoOwotCQlpZiAocHJlc2NhbGUgPT0gMCkKLQkJCXByZXNjYWxlID0gMTsKLQkJaF9zY2FsZSA9IDEwMjQgKiBTQUE3MTdYX05UU0NfV0lEVEggLyBwcmVzY2FsZSAvIHBpeC0+d2lkdGg7Ci0JCS8qIGludGVybGFjZSAqLwotCQl2X3NjYWxlID0gNTEyICogMiAqIFNBQTcxN1hfTlRTQ19IRUlHSFQgLyBwaXgtPmhlaWdodDsKKwkvKiBzY2FsaW5nIHNldHRpbmcgKi8KKwkvKiBOVFNDIGFuZCBpbnRlcmxhY2Ugb25seSAqLworCXByZXNjYWxlID0gU0FBNzE3WF9OVFNDX1dJRFRIIC8gcGl4LT53aWR0aDsKKwlpZiAocHJlc2NhbGUgPT0gMCkKKwkJcHJlc2NhbGUgPSAxOworCWhfc2NhbGUgPSAxMDI0ICogU0FBNzE3WF9OVFNDX1dJRFRIIC8gcHJlc2NhbGUgLyBwaXgtPndpZHRoOworCS8qIGludGVybGFjZSAqLworCXZfc2NhbGUgPSA1MTIgKiAyICogU0FBNzE3WF9OVFNDX0hFSUdIVCAvIHBpeC0+aGVpZ2h0OwogCi0JCS8qIEhvcml6b250YWwgcHJlc2NhbGluZyBldGMgKi8KLQkJc2V0X2hfcHJlc2NhbGUoY2xpZW50LCAwLCBwcmVzY2FsZSk7Ci0JCXNldF9oX3ByZXNjYWxlKGNsaWVudCwgMSwgcHJlc2NhbGUpOworCS8qIEhvcml6b250YWwgcHJlc2NhbGluZyBldGMgKi8KKwlzZXRfaF9wcmVzY2FsZShzZCwgMCwgcHJlc2NhbGUpOworCXNldF9oX3ByZXNjYWxlKHNkLCAxLCBwcmVzY2FsZSk7CiAKLQkJLyogSG9yaXpvbnRhbCBzY2FsaW5nIGluY3JlbWVudCAqLwotCQkvKiBUQVNLIEEgKi8KLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NkMsICh1OCkoaF9zY2FsZSAmIDB4RkYpKTsKLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NkQsICh1OCkoKGhfc2NhbGUgPj4gOCkgJiAweEZGKSk7Ci0JCS8qIFRBU0sgQiAqLwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHhBQywgKHU4KShoX3NjYWxlICYgMHhGRikpOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHhBRCwgKHU4KSgoaF9zY2FsZSA+PiA4KSAmIDB4RkYpKTsKKwkvKiBIb3Jpem9udGFsIHNjYWxpbmcgaW5jcmVtZW50ICovCisJLyogVEFTSyBBICovCisJc2FhNzE3eF93cml0ZShzZCwgMHg2QywgKHU4KShoX3NjYWxlICYgMHhGRikpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4NkQsICh1OCkoKGhfc2NhbGUgPj4gOCkgJiAweEZGKSk7CisJLyogVEFTSyBCICovCisJc2FhNzE3eF93cml0ZShzZCwgMHhBQywgKHU4KShoX3NjYWxlICYgMHhGRikpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4QUQsICh1OCkoKGhfc2NhbGUgPj4gOCkgJiAweEZGKSk7CiAKLQkJLyogVmVydGljYWwgcHJlc2NhbGluZyBldGMgKi8KLQkJc2V0X3Zfc2NhbGUoY2xpZW50LCAwLCB2X3NjYWxlKTsKLQkJc2V0X3Zfc2NhbGUoY2xpZW50LCAxLCB2X3NjYWxlKTsKKwkvKiBWZXJ0aWNhbCBwcmVzY2FsaW5nIGV0YyAqLworCXNldF92X3NjYWxlKHNkLCAwLCB2X3NjYWxlKTsKKwlzZXRfdl9zY2FsZShzZCwgMSwgdl9zY2FsZSk7CiAKLQkJLyogc2V0IHZpZGVvIG91dHB1dCBzaXplICovCi0JCS8qIHZpZGVvIG51bWJlciBvZiBwaXhlbHMgYXQgb3V0cHV0ICovCi0JCS8qIFRBU0sgQSAqLwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg1QywgKHU4KShwaXgtPndpZHRoICYgMHhGRikpOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg1RCwgKHU4KSgocGl4LT53aWR0aCA+PiA4KSAmIDB4RkYpKTsKLQkJLyogVEFTSyBCICovCi0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDlDLCAodTgpKHBpeC0+d2lkdGggJiAweEZGKSk7Ci0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDlELCAodTgpKChwaXgtPndpZHRoID4+IDgpICYgMHhGRikpOworCS8qIHNldCB2aWRlbyBvdXRwdXQgc2l6ZSAqLworCS8qIHZpZGVvIG51bWJlciBvZiBwaXhlbHMgYXQgb3V0cHV0ICovCisJLyogVEFTSyBBICovCisJc2FhNzE3eF93cml0ZShzZCwgMHg1QywgKHU4KShwaXgtPndpZHRoICYgMHhGRikpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4NUQsICh1OCkoKHBpeC0+d2lkdGggPj4gOCkgJiAweEZGKSk7CisJLyogVEFTSyBCICovCisJc2FhNzE3eF93cml0ZShzZCwgMHg5QywgKHU4KShwaXgtPndpZHRoICYgMHhGRikpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4OUQsICh1OCkoKHBpeC0+d2lkdGggPj4gOCkgJiAweEZGKSk7CiAKLQkJLyogdmlkZW8gbnVtYmVyIG9mIGxpbmVzIGF0IG91dHB1dCAqLwotCQkvKiBUQVNLIEEgKi8KLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NUUsICh1OCkocGl4LT5oZWlnaHQgJiAweEZGKSk7Ci0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDVGLCAodTgpKChwaXgtPmhlaWdodCA+PiA4KSAmIDB4RkYpKTsKLQkJLyogVEFTSyBCICovCi0JCXNhYTcxN3hfd3JpdGUoY2xpZW50LCAweDlFLCAodTgpKHBpeC0+aGVpZ2h0ICYgMHhGRikpOwotCQlzYWE3MTd4X3dyaXRlKGNsaWVudCwgMHg5RiwgKHU4KSgocGl4LT5oZWlnaHQgPj4gOCkgJiAweEZGKSk7Ci0JCWJyZWFrOwotCX0KKwkvKiB2aWRlbyBudW1iZXIgb2YgbGluZXMgYXQgb3V0cHV0ICovCisJLyogVEFTSyBBICovCisJc2FhNzE3eF93cml0ZShzZCwgMHg1RSwgKHU4KShwaXgtPmhlaWdodCAmIDB4RkYpKTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDVGLCAodTgpKChwaXgtPmhlaWdodCA+PiA4KSAmIDB4RkYpKTsKKwkvKiBUQVNLIEIgKi8KKwlzYWE3MTd4X3dyaXRlKHNkLCAweDlFLCAodTgpKHBpeC0+aGVpZ2h0ICYgMHhGRikpOworCXNhYTcxN3hfd3JpdGUoc2QsIDB4OUYsICh1OCkoKHBpeC0+aGVpZ2h0ID4+IDgpICYgMHhGRikpOworCXJldHVybiAwOworfQogCi0JY2FzZSBBVURDX1NFVF9SQURJTzoKLQkJZGVjb2Rlci0+cmFkaW8gPSAxOwotCQlicmVhazsKK3N0YXRpYyBpbnQgc2FhNzE3eF9zX3JhZGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHNhYTcxN3hfc3RhdGUgKmRlY29kZXIgPSB0b19zdGF0ZShzZCk7CiAKLQljYXNlIFZJRElPQ19TX1NURDogewotCQl2NGwyX3N0ZF9pZCBzdGQgPSAqKHY0bDJfc3RkX2lkICopIGFyZzsKKwlkZWNvZGVyLT5yYWRpbyA9IDE7CisJcmV0dXJuIDA7Cit9CiAKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgbm9ybSAiKTsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiKG5vdCB5ZXQgaW1wbGVtZW50ZClcbiIpOworc3RhdGljIGludCBzYWE3MTd4X3Nfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCkKK3sKKwlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlciA9IHRvX3N0YXRlKHNkKTsKIAotCQlkZWNvZGVyLT5yYWRpbyA9IDA7Ci0JCWRlY29kZXItPnN0ZCA9IHN0ZDsKLQkJYnJlYWs7Ci0JfQorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRlY29kZXIgc2V0IG5vcm0gIik7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiKG5vdCB5ZXQgaW1wbGVtZW50ZClcbiIpOwogCi0JY2FzZSBWSURJT0NfSU5UX0dfQVVESU9fUk9VVElORzogewotCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKKwlkZWNvZGVyLT5yYWRpbyA9IDA7CisJZGVjb2Rlci0+c3RkID0gc3RkOworCXJldHVybiAwOworfQogCi0JCXJvdXRlLT5pbnB1dCA9IGRlY29kZXItPmF1ZGlvX2lucHV0OwotCQlyb3V0ZS0+b3V0cHV0ID0gMDsKLQkJYnJlYWs7Ci0JfQorc3RhdGljIGludCBzYWE3MTd4X3NfYXVkaW9fcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSkKK3sKKwlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlciA9IHRvX3N0YXRlKHNkKTsKIAotCWNhc2UgVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkc6IHsKLQkJc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7Ci0KLQkJaWYgKHJvdXRlLT5pbnB1dCA8IDMpIHsgLyogRklYTUUhIC0tdGFkYWNoaSAqLwotCQkJZGVjb2Rlci0+YXVkaW9faW5wdXQgPSByb3V0ZS0+aW5wdXQ7Ci0JCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsCisJaWYgKHJvdXRlLT5pbnB1dCA8IDMpIHsgLyogRklYTUUhIC0tdGFkYWNoaSAqLworCQlkZWNvZGVyLT5hdWRpb19pbnB1dCA9IHJvdXRlLT5pbnB1dDsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLAogCQkJCSJzZXQgZGVjb2RlciBhdWRpbyBpbnB1dCB0byAlZFxuIiwKIAkJCQlkZWNvZGVyLT5hdWRpb19pbnB1dCk7Ci0JCQlzZXRfYXVkaW9fcmVncyhjbGllbnQsIGRlY29kZXIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIC1FUkFOR0U7CisJCXNldF9hdWRpb19yZWdzKHNkLCBkZWNvZGVyKTsKKwkJcmV0dXJuIDA7CiAJfQorCXJldHVybiAtRVJBTkdFOworfQogCi0JY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzogewotCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKLQkJaW50IGlucCA9IHJvdXRlLT5pbnB1dDsKK3N0YXRpYyBpbnQgc2FhNzE3eF9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzYWE3MTd4X3N0YXRlICpkZWNvZGVyID0gdG9fc3RhdGUoc2QpOwogCi0JCXJldHVybiBzYWE3MTd4X3NldF92aWRlb19pbnB1dChjbGllbnQsIGRlY29kZXIsIGlucCk7Ci0JfQorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImRlY29kZXIgJXMgb3V0cHV0XG4iLAorCQkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCWRlY29kZXItPmVuYWJsZSA9IGVuYWJsZTsKKwlzYWE3MTd4X3dyaXRlKHNkLCAweDE5MywgZW5hYmxlID8gMHhhNiA6IDB4MjYpOworCXJldHVybiAwOworfQogCi0JY2FzZSBWSURJT0NfU1RSRUFNT046IHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBlbmFibGUgb3V0cHV0XG4iKTsKLQkJZGVjb2Rlci0+ZW5hYmxlID0gMTsKLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4MTkzLCAweGE2KTsKLQkJYnJlYWs7Ci0JfQorLyogY2hhbmdlIGF1ZGlvIG1vZGUgKi8KK3N0YXRpYyBpbnQgc2FhNzE3eF9zX3R1bmVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3R1bmVyICp2dCkKK3sKKwlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlciA9IHRvX3N0YXRlKHNkKTsKKwlpbnQgYXVkaW9fbW9kZTsKKwljaGFyICptZXNbNF0gPSB7CisJCSJNT05PIiwgIlNURVJFTyIsICJMQU5HMSIsICJMQU5HMi9TQVAiCisJfTsKIAotCWNhc2UgVklESU9DX1NUUkVBTU9GRjogewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIGRpc2FibGUgb3V0cHV0XG4iKTsKLQkJZGVjb2Rlci0+ZW5hYmxlID0gMDsKLQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4MTkzLCAweDI2KTsgLyogcmlnaHQ/IEZJWE1FIS0tdGFkYWNoaSAqLwotCQlicmVhazsKLQl9CisJYXVkaW9fbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAKLQkJLyogY2hhbmdlIGF1ZGlvIG1vZGUgKi8KLQljYXNlIFZJRElPQ19TX1RVTkVSOiB7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IChzdHJ1Y3QgdjRsMl90dW5lciAqKWFyZzsKLQkJaW50IGF1ZGlvX21vZGU7Ci0JCWNoYXIgKm1lc1s0XSA9IHsKLQkJCSJNT05PIiwgIlNURVJFTyIsICJMQU5HMSIsICJMQU5HMi9TQVAiCi0JCX07Ci0KLQkJYXVkaW9fbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0KLQkJc3dpdGNoICh2dC0+YXVkbW9kZSkgeworCXN3aXRjaCAodnQtPmF1ZG1vZGUpIHsKIAkJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKIAkJCWF1ZGlvX21vZGUgPSBUVU5FUl9BVURJT19NT05POwogCQkJYnJlYWs7CkBAIC0xMzQ3LDcwICsxMzI2LDEwMSBAQAogCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKIAkJCWF1ZGlvX21vZGUgPSBUVU5FUl9BVURJT19MQU5HMTsKIAkJCWJyZWFrOwotCQl9Ci0KLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiY2hhbmdlIGF1ZGlvIG1vZGUgdG8gJXNcbiIsCi0JCQkJbWVzW2F1ZGlvX21vZGVdKTsKLQkJZGVjb2Rlci0+dHVuZXJfYXVkaW9fbW9kZSA9IGF1ZGlvX21vZGU7Ci0JCS8qIFRoZSByZWdpc3RlcnMgYXJlIG5vdCBjaGFuZ2VkIGhlcmUuICovCi0JCS8qIFNlZSBERUNPREVSX0VOQUJMRV9PVVRQVVQgc2VjdGlvbi4gKi8KLQkJc2V0X2F1ZGlvX21vZGUoY2xpZW50LCBkZWNvZGVyLT50dW5lcl9hdWRpb19tb2RlKTsKLQkJYnJlYWs7CiAJfQogCi0JY2FzZSBWSURJT0NfR19UVU5FUjogewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSAoc3RydWN0IHY0bDJfdHVuZXIgKilhcmc7Ci0JCWludCBkdWFsX2YsIHN0ZXJlb19mOwotCi0JCWlmIChkZWNvZGVyLT5yYWRpbykKLQkJCWJyZWFrOwotCQlnZXRfaW5mX2Rldl9zdGF0dXMoY2xpZW50LCAmZHVhbF9mLCAmc3RlcmVvX2YpOwotCi0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIkRFVEVDVD09c3Q6JWQgZHVhbDolZFxuIiwKLQkJCQlzdGVyZW9fZiwgZHVhbF9mKTsKLQotCQkvKiBtb25vICovCi0JCWlmICgoZHVhbF9mID09IDApICYmIChzdGVyZW9fZiA9PSAwKSkgewotCQkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiREVURUNUPT1NT05PXG4iKTsKLQkJfQotCi0JCS8qIHN0ZXJlbyAqLwotCQlpZiAoc3RlcmVvX2YgPT0gMSkgewotCQkJaWYgKHZ0LT5hdWRtb2RlID09IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8gfHwKLQkJCSAgICB2dC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzEpIHsKLQkJCQl2dC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJERVRFQ1Q9PVNUKFNUKVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJERVRFQ1Q9PVNUKE1PTk8pXG4iKTsKLQkJCX0KLQkJfQotCi0JCS8qIGR1YWwgKi8KLQkJaWYgKGR1YWxfZiA9PSAxKSB7Ci0JCQlpZiAodnQtPmF1ZG1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX0xBTkcyKSB7Ci0JCQkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMiB8IFY0TDJfVFVORVJfU1VCX01PTk87Ci0JCQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiREVURUNUPT1EVUFMMVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIkRFVEVDVD09RFVBTDJcbiIpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCS8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJjaGFuZ2UgYXVkaW8gbW9kZSB0byAlc1xuIiwKKwkJCW1lc1thdWRpb19tb2RlXSk7CisJZGVjb2Rlci0+dHVuZXJfYXVkaW9fbW9kZSA9IGF1ZGlvX21vZGU7CisJLyogVGhlIHJlZ2lzdGVycyBhcmUgbm90IGNoYW5nZWQgaGVyZS4gKi8KKwkvKiBTZWUgREVDT0RFUl9FTkFCTEVfT1VUUFVUIHNlY3Rpb24uICovCisJc2V0X2F1ZGlvX21vZGUoc2QsIGRlY29kZXItPnR1bmVyX2F1ZGlvX21vZGUpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNhYTcxN3hfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJc3RydWN0IHNhYTcxN3hfc3RhdGUgKmRlY29kZXIgPSB0b19zdGF0ZShzZCk7CisJaW50IGR1YWxfZiwgc3RlcmVvX2Y7CisKKwlpZiAoZGVjb2Rlci0+cmFkaW8pCisJCXJldHVybiAwOworCWdldF9pbmZfZGV2X3N0YXR1cyhzZCwgJmR1YWxfZiwgJnN0ZXJlb19mKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIkRFVEVDVD09c3Q6JWQgZHVhbDolZFxuIiwKKwkJCXN0ZXJlb19mLCBkdWFsX2YpOworCisJLyogbW9ubyAqLworCWlmICgoZHVhbF9mID09IDApICYmIChzdGVyZW9fZiA9PSAwKSkgeworCQl2dC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIkRFVEVDVD09TU9OT1xuIik7CisJfQorCisJLyogc3RlcmVvICovCisJaWYgKHN0ZXJlb19mID09IDEpIHsKKwkJaWYgKHZ0LT5hdWRtb2RlID09IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8gfHwKKwkJCQl2dC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzEpIHsKKwkJCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiREVURUNUPT1TVChTVClcbiIpOworCQl9IGVsc2UgeworCQkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiREVURUNUPT1TVChNT05PKVxuIik7CisJCX0KKwl9CisKKwkvKiBkdWFsICovCisJaWYgKGR1YWxfZiA9PSAxKSB7CisJCWlmICh2dC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzIpIHsKKwkJCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzIgfCBWNEwyX1RVTkVSX1NVQl9NT05POworCQkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiREVURUNUPT1EVUFMMVxuIik7CisJCX0gZWxzZSB7CisJCQl2dC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIkRFVEVDVD09RFVBTDJcbiIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhYTcxN3hfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHNhYTcxN3hfY29yZV9vcHMgPSB7CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gc2FhNzE3eF9nX3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyID0gc2FhNzE3eF9zX3JlZ2lzdGVyLAorI2VuZGlmCisJLnF1ZXJ5Y3RybCA9IHNhYTcxN3hfcXVlcnljdHJsLAorCS5nX2N0cmwgPSBzYWE3MTd4X2dfY3RybCwKKwkuc19jdHJsID0gc2FhNzE3eF9zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyBzYWE3MTd4X3R1bmVyX29wcyA9IHsKKwkuZ190dW5lciA9IHNhYTcxN3hfZ190dW5lciwKKwkuc190dW5lciA9IHNhYTcxN3hfc190dW5lciwKKwkuc19zdGQgPSBzYWE3MTd4X3Nfc3RkLAorCS5zX3JhZGlvID0gc2FhNzE3eF9zX3JhZGlvLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgc2FhNzE3eF92aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHNhYTcxN3hfc192aWRlb19yb3V0aW5nLAorCS5zX2ZtdCA9IHNhYTcxN3hfc19mbXQsCisJLnNfc3RyZWFtID0gc2FhNzE3eF9zX3N0cmVhbSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfYXVkaW9fb3BzIHNhYTcxN3hfYXVkaW9fb3BzID0geworCS5zX3JvdXRpbmcgPSBzYWE3MTd4X3NfYXVkaW9fcm91dGluZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHNhYTcxN3hfb3BzID0geworCS5jb3JlID0gJnNhYTcxN3hfY29yZV9vcHMsCisJLnR1bmVyID0gJnNhYTcxN3hfdHVuZXJfb3BzLAorCS5hdWRpbyA9ICZzYWE3MTd4X2F1ZGlvX29wcywKKwkudmlkZW8gPSAmc2FhNzE3eF92aWRlb19vcHMsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKQEAgLTE0MjEsNiArMTQzMSw3IEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3Qgc2FhNzE3eF9zdGF0ZSAqZGVjb2RlcjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwogCXU4IGlkID0gMDsKIAljaGFyICpwID0gIiI7CiAKQEAgLTE0MjgsMTMgKzE0MzksMjEgQEAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NWE0LCAweGZlKSAmJgotCQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NWE1LCAweDBmKSAmJgotCQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NWE2LCAweDAwKSAmJgotCQkJc2FhNzE3eF93cml0ZShjbGllbnQsIDB4NWE3LCAweDAxKSkKLQkJaWQgPSBzYWE3MTd4X3JlYWQoY2xpZW50LCAweDVhMCk7CisJZGVjb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTd4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlY29kZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZCA9ICZkZWNvZGVyLT5zZDsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmc2FhNzE3eF9vcHMpOworCisJaWYgKHNhYTcxN3hfd3JpdGUoc2QsIDB4NWE0LCAweGZlKSAmJgorCQkJc2FhNzE3eF93cml0ZShzZCwgMHg1YTUsIDB4MGYpICYmCisJCQlzYWE3MTd4X3dyaXRlKHNkLCAweDVhNiwgMHgwMCkgJiYKKwkJCXNhYTcxN3hfd3JpdGUoc2QsIDB4NWE3LCAweDAxKSkKKwkJaWQgPSBzYWE3MTd4X3JlYWQoc2QsIDB4NWEwKTsKIAlpZiAoaWQgIT0gMHhjMiAmJiBpZCAhPSAweDMyICYmIGlkICE9IDB4ZjIgJiYgaWQgIT0gMHg2YykgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzYWE3MTd4IG5vdCBmb3VuZCAoaWQ9JTAyeClcbiIsIGlkKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAic2FhNzE3eCBub3QgZm91bmQgKGlkPSUwMngpXG4iLCBpZCk7CisJCWtmcmVlKGRlY29kZXIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKGlkID09IDB4YzIpCkBAIC0xNDQ1LDE0ICsxNDY0LDggQEAKIAkJcCA9ICJzYWE3MTc0SEwiOwogCWVsc2UKIAkJcCA9ICJzYWE3MTcxIjsKLQl2NGxfaW5mbyhjbGllbnQsICIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgcCwKKwl2NGwyX2luZm8oc2QsICIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgcCwKIAkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOwotCi0JZGVjb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTd4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGVjb2Rlcik7Ci0KLQlpZiAoZGVjb2RlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKIAlkZWNvZGVyLT5zdGQgPSBWNEwyX1NURF9OVFNDOwogCWRlY29kZXItPmlucHV0ID0gLTE7CiAJZGVjb2Rlci0+ZW5hYmxlID0gMTsKQEAgLTE0ODEsMTUgKzE0OTQsMTUgQEAKIAlkZWNvZGVyLT5hdWRpb19tYWluX3ZvbHVtZSA9CiAJCShkZWNvZGVyLT5hdWRpb19tYWluX3ZvbF9yICsgNDEpICogNjU1MzUgLyAoMjQgLSAoLTQwKSk7CiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKIAogCS8qIEZJWE1FISEgKi8KLQlzYWE3MTd4X3dyaXRlX3JlZ3MoY2xpZW50LCByZWdfaW5pdF9pbml0aWFsaXplKTsKLQlzZXRfdmlkZW9fb3V0cHV0X2xldmVsX3JlZ3MoY2xpZW50LCBkZWNvZGVyKTsKKwlzYWE3MTd4X3dyaXRlX3JlZ3Moc2QsIHJlZ19pbml0X2luaXRpYWxpemUpOworCXNldF92aWRlb19vdXRwdXRfbGV2ZWxfcmVncyhzZCwgZGVjb2Rlcik7CiAJLyogc2V0IGJhc3MsdHJlYmxlIHRvIDBkYiAyMDA0MTEwMSBLLk9odGEgKi8KIAlkZWNvZGVyLT5hdWRpb19tYWluX2Jhc3MgPSAwOwogCWRlY29kZXItPmF1ZGlvX21haW5fdHJlYmxlID0gMDsKLQlzZXRfYXVkaW9fcmVncyhjbGllbnQsIGRlY29kZXIpOworCXNldF9hdWRpb19yZWdzKHNkLCBkZWNvZGVyKTsKIAogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJc2NoZWR1bGVfdGltZW91dCgyKkhaKTsKQEAgLTE0OTgsNyArMTUxMSwxMCBAQAogCiBzdGF0aWMgaW50IHNhYTcxN3hfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b19zdGF0ZShzZCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmMKaW5kZXggMDQ0YTJlOS4uZDY1MmYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2U0MDEuYwpAQCAtOTc1LDggKzk3NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2U0MDFfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgc2U0MDFfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gKHN0cnVjdCB1c2Jfc2U0MDEgKil2ZGV2OwpAQCAtMTE0Miw3ICsxMTQxLDcgQEAKIHN0YXRpYyBpbnQgc2U0MDFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBzZTQwMV9kb19pb2N0bCk7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBzZTQwMV9kb19pb2N0bCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlNDAxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggNTM2YjFhOS4uOWEyNTg2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCkBAIC03NSw4ICs3NCw2IEBACiAjZGVmaW5lIENEQllSMiAweDk4IC8qIENhcHR1cmUgZGF0YSBib3R0b20tZmllbGQgYWRkcmVzcyBZIHJlZ2lzdGVyIDIgKi8KICNkZWZpbmUgQ0RCQ1IyIDB4OWMgLyogQ2FwdHVyZSBkYXRhIGJvdHRvbS1maWVsZCBhZGRyZXNzIEMgcmVnaXN0ZXIgMiAqLwogCi1zdGF0aWMgREVGSU5FX01VVEVYKGNhbWVyYV9sb2NrKTsKLQogLyogcGVyIHZpZGVvIGZyYW1lIGJ1ZmZlciAqLwogc3RydWN0IHNoX21vYmlsZV9jZXVfYnVmZmVyIHsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyIHZiOyAvKiB2NGwgYnVmZmVyIG11c3QgYmUgZmlyc3QgKi8KQEAgLTk3LDE4ICs5NCwyMCBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNhcHR1cmU7CiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYWN0aXZlOworCWludCBpc19pbnRlcmxhY2U7CiAKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9pbmZvICpwZGF0YTsKKworCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RhdGFfZm9ybWF0ICpjYW1lcmFfZm10OwogfTsKIAogc3RhdGljIHZvaWQgY2V1X3dyaXRlKHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcHJpdiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyByZWdfb2ZmcywgdW5zaWduZWQgbG9uZyBkYXRhKQorCQkgICAgICB1bnNpZ25lZCBsb25nIHJlZ19vZmZzLCB1MzIgZGF0YSkKIHsKIAlpb3dyaXRlMzIoZGF0YSwgcHJpdi0+YmFzZSArIHJlZ19vZmZzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2V1X3JlYWQoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwcml2LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWdfb2ZmcykKK3N0YXRpYyB1MzIgY2V1X3JlYWQoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwcml2LCB1bnNpZ25lZCBsb25nIHJlZ19vZmZzKQogewogCXJldHVybiBpb3JlYWQzMihwcml2LT5iYXNlICsgcmVnX29mZnMpOwogfQpAQCAtMTU2LDIxICsxNTUsNTIgQEAKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KIAorI2RlZmluZSBDRVVfQ0VUQ1JfTUFHSUMgMHgwMzE3ZjMxMyAvKiBhY2tub3dsZWRnZSBtYWdpY2FsIGludGVycnVwdCBzb3VyY2VzICovCisjZGVmaW5lIENFVV9DRVRDUl9JR1JXICgxIDw8IDQpIC8qIHByb2hpYml0ZWQgcmVnaXN0ZXIgYWNjZXNzIGludGVycnVwdCBiaXQgKi8KKyNkZWZpbmUgQ0VVX0NFSUVSX0NQRUlFICgxIDw8IDApIC8qIG9uZS1mcmFtZSBjYXB0dXJlIGVuZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQ0VVX0NBUENSX0NUTkNQICgxIDw8IDE2KSAvKiBjb250aW51b3VzIGNhcHR1cmUgbW9kZSAoaWYgc2V0KSAqLworCisKIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9jZXVfY2FwdHVyZShzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2KQogewotCWNldV93cml0ZShwY2RldiwgQ0VJRVIsIGNldV9yZWFkKHBjZGV2LCBDRUlFUikgJiB+MSk7Ci0JY2V1X3dyaXRlKHBjZGV2LCBDRVRDUiwgfmNldV9yZWFkKHBjZGV2LCBDRVRDUikgJiAweDAzMTdmMzEzKTsKLQljZXVfd3JpdGUocGNkZXYsIENFSUVSLCBjZXVfcmVhZChwY2RldiwgQ0VJRVIpIHwgMSk7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBwY2Rldi0+aWNkOworCWRtYV9hZGRyX3QgcGh5c19hZGRyX3RvcCwgcGh5c19hZGRyX2JvdHRvbTsKIAotCWNldV93cml0ZShwY2RldiwgQ0FQQ1IsIGNldV9yZWFkKHBjZGV2LCBDQVBDUikgJiB+MHgxMDAwMCk7CisJLyogVGhlIGhhcmR3YXJlIGlzIF92ZXJ5XyBwaWNreSBhYm91dCB0aGlzIHNlcXVlbmNlLiBFc3BlY2lhbGx5CisJICogdGhlIENFVV9DRVRDUl9NQUdJQyB2YWx1ZS4gSXQgc2VlbXMgbGlrZSB3ZSBuZWVkIHRvIGFja25vd2xlZGdlCisJICogc2V2ZXJhbCBub3Qtc28td2VsbCBkb2N1bWVudGVkIGludGVycnVwdCBzb3VyY2VzIGluIENFVENSLgorCSAqLworCWNldV93cml0ZShwY2RldiwgQ0VJRVIsIGNldV9yZWFkKHBjZGV2LCBDRUlFUikgJiB+Q0VVX0NFSUVSX0NQRUlFKTsKKwljZXVfd3JpdGUocGNkZXYsIENFVENSLCB+Y2V1X3JlYWQocGNkZXYsIENFVENSKSAmIENFVV9DRVRDUl9NQUdJQyk7CisJY2V1X3dyaXRlKHBjZGV2LCBDRUlFUiwgY2V1X3JlYWQocGNkZXYsIENFSUVSKSB8IENFVV9DRUlFUl9DUEVJRSk7CisJY2V1X3dyaXRlKHBjZGV2LCBDQVBDUiwgY2V1X3JlYWQocGNkZXYsIENBUENSKSAmIH5DRVVfQ0FQQ1JfQ1ROQ1ApOworCWNldV93cml0ZShwY2RldiwgQ0VUQ1IsIENFVV9DRVRDUl9NQUdJQyBeIENFVV9DRVRDUl9JR1JXKTsKIAotCWNldV93cml0ZShwY2RldiwgQ0VUQ1IsIDB4MDMxN2YzMTMgXiAweDEwKTsKKwlpZiAoIXBjZGV2LT5hY3RpdmUpCisJCXJldHVybjsKIAotCWlmIChwY2Rldi0+YWN0aXZlKSB7Ci0JCXBjZGV2LT5hY3RpdmUtPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQljZXVfd3JpdGUocGNkZXYsIENEQVlSLCB2aWRlb2J1Zl90b19kbWFfY29udGlnKHBjZGV2LT5hY3RpdmUpKTsKLQkJY2V1X3dyaXRlKHBjZGV2LCBDQVBTUiwgMHgxKTsgLyogc3RhcnQgY2FwdHVyZSAqLworCXBoeXNfYWRkcl90b3AgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKHBjZGV2LT5hY3RpdmUpOworCWNldV93cml0ZShwY2RldiwgQ0RBWVIsIHBoeXNfYWRkcl90b3ApOworCWlmIChwY2Rldi0+aXNfaW50ZXJsYWNlKSB7CisJCXBoeXNfYWRkcl9ib3R0b20gPSBwaHlzX2FkZHJfdG9wICsgaWNkLT53aWR0aDsKKwkJY2V1X3dyaXRlKHBjZGV2LCBDREJZUiwgcGh5c19hZGRyX2JvdHRvbSk7CiAJfQorCisJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5mb3VyY2MpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKwljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgorCQlwaHlzX2FkZHJfdG9wICs9IGljZC0+d2lkdGggKiBpY2QtPmhlaWdodDsKKwkJY2V1X3dyaXRlKHBjZGV2LCBDREFDUiwgcGh5c19hZGRyX3RvcCk7CisJCWlmIChwY2Rldi0+aXNfaW50ZXJsYWNlKSB7CisJCQlwaHlzX2FkZHJfYm90dG9tID0gcGh5c19hZGRyX3RvcCArIGljZC0+d2lkdGg7CisJCQljZXVfd3JpdGUocGNkZXYsIENEQkNSLCBwaHlzX2FkZHJfYm90dG9tKTsKKwkJfQorCX0KKworCXBjZGV2LT5hY3RpdmUtPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCWNldV93cml0ZShwY2RldiwgQ0FQU1IsIDB4MSk7IC8qIHN0YXJ0IGNhcHR1cmUgKi8KIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTI5MiwxNCArMzIyLDEzIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCByZXQgPSAtRUJVU1k7CiAKLQltdXRleF9sb2NrKCZjYW1lcmFfbG9jayk7Ci0KIAlpZiAocGNkZXYtPmljZCkKIAkJZ290byBlcnI7CiAKQEAgLTMxOSwxMSArMzQ4LDEwIEBACiAKIAlwY2Rldi0+aWNkID0gaWNkOwogZXJyOgotCW11dGV4X3VubG9jaygmY2FtZXJhX2xvY2spOwotCiAJcmV0dXJuIHJldDsKIH0KIAorLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOwpAQCAtMzYyLDggKzM5MCw5IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlpbnQgcmV0LCBidXN3aWR0aCwgd2lkdGgsIGNmc3pyX3dpZHRoLCBjZHdkcl93aWR0aDsKKwlpbnQgcmV0LCBidXN3aWR0aCwgd2lkdGgsIGhlaWdodCwgY2ZzenJfd2lkdGgsIGNkd2RyX3dpZHRoOwogCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3MsIHZhbHVlOworCWludCB5dXZfbW9kZSwgeXV2X2xpbmVza2lwOwogCiAJY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOwogCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLApAQCAtMzg5LDI3ICs0MTgsNzEgQEAKIAljZXVfd3JpdGUocGNkZXYsIENSQ05UUiwgMCk7CiAJY2V1X3dyaXRlKHBjZGV2LCBDUkNNUFIsIDApOwogCi0JdmFsdWUgPSAweDAwMDAwMDEwOwotCXZhbHVlIHw9IChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKSA/ICgxIDw8IDEpIDogMDsKLQl2YWx1ZSB8PSAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykgPyAoMSA8PCAwKSA6IDA7Ci0JdmFsdWUgfD0gKGJ1c3dpZHRoID09IDE2KSA/ICgxIDw8IDEyKSA6IDA7CisJdmFsdWUgPSAweDAwMDAwMDEwOyAvKiBkYXRhIGZldGNoIGJ5IGRlZmF1bHQgKi8KKwl5dXZfbW9kZSA9IHl1dl9saW5lc2tpcCA9IDA7CisKKwlzd2l0Y2ggKGljZC0+Y3VycmVudF9mbXQtPmZvdXJjYykgeworCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKwkJeXV2X2xpbmVza2lwID0gMTsgLyogc2tpcCBmb3IgTlYxMi8yMSwgbm8gc2tpcCBmb3IgTlYxNi82MSAqLworCQkvKiBmYWxsLXRocm91Z2ggKi8KKwljYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgorCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisJCXl1dl9tb2RlID0gMTsKKwkJc3dpdGNoIChwY2Rldi0+Y2FtZXJhX2ZtdC0+Zm91cmNjKSB7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJCQl2YWx1ZSA9IDB4MDAwMDAwMDA7IC8qIENiMCwgWTAsIENyMCwgWTEgKi8KKwkJCWJyZWFrOworCQljYXNlIFY0TDJfUElYX0ZNVF9WWVVZOgorCQkJdmFsdWUgPSAweDAwMDAwMTAwOyAvKiBDcjAsIFkwLCBDYjAsIFkxICovCisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwkJCXZhbHVlID0gMHgwMDAwMDIwMDsgLyogWTAsIENiMCwgWTEsIENyMCAqLworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6CisJCQl2YWx1ZSA9IDB4MDAwMDAzMDA7IC8qIFkwLCBDcjAsIFkxLCBDYjAgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwlpZiAoaWNkLT5jdXJyZW50X2ZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjIxIHx8CisJICAgIGljZC0+Y3VycmVudF9mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlY2MSkKKwkJdmFsdWUgXj0gMHgwMDAwMDEwMDsgLyogc3dhcCBVLCBWIHRvIGNoYW5nZSBmcm9tIE5WMXgtPk5WeDEgKi8KKworCXZhbHVlIHw9IGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgPyAxIDw8IDEgOiAwOworCXZhbHVlIHw9IGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgPyAxIDw8IDAgOiAwOworCXZhbHVlIHw9IGJ1c3dpZHRoID09IDE2ID8gMSA8PCAxMiA6IDA7CiAJY2V1X3dyaXRlKHBjZGV2LCBDQU1DUiwgdmFsdWUpOwogCiAJY2V1X3dyaXRlKHBjZGV2LCBDQVBDUiwgMHgwMDMwMDAwMCk7Ci0JY2V1X3dyaXRlKHBjZGV2LCBDQUlGUiwgMCk7CisJY2V1X3dyaXRlKHBjZGV2LCBDQUlGUiwgKHBjZGV2LT5pc19pbnRlcmxhY2UpID8gMHgxMDEgOiAwKTsKIAogCW1kZWxheSgxKTsKIAotCXdpZHRoID0gaWNkLT53aWR0aCAqIChpY2QtPmN1cnJlbnRfZm10LT5kZXB0aCAvIDgpOwotCXdpZHRoID0gKGJ1c3dpZHRoID09IDE2KSA/IHdpZHRoIC8gMiA6IHdpZHRoOwotCWNmc3pyX3dpZHRoID0gKGJ1c3dpZHRoID09IDgpID8gd2lkdGggLyAyIDogd2lkdGg7Ci0JY2R3ZHJfd2lkdGggPSAoYnVzd2lkdGggPT0gMTYpID8gd2lkdGggKiAyIDogd2lkdGg7CisJaWYgKHl1dl9tb2RlKSB7CisJCXdpZHRoID0gaWNkLT53aWR0aCAqIDI7CisJCXdpZHRoID0gYnVzd2lkdGggPT0gMTYgPyB3aWR0aCAvIDIgOiB3aWR0aDsKKwkJY2ZzenJfd2lkdGggPSBjZHdkcl93aWR0aCA9IGljZC0+d2lkdGg7CisJfSBlbHNlIHsKKwkJd2lkdGggPSBpY2QtPndpZHRoICogKChpY2QtPmN1cnJlbnRfZm10LT5kZXB0aCArIDcpID4+IDMpOworCQl3aWR0aCA9IGJ1c3dpZHRoID09IDE2ID8gd2lkdGggLyAyIDogd2lkdGg7CisJCWNmc3pyX3dpZHRoID0gYnVzd2lkdGggPT0gOCA/IHdpZHRoIC8gMiA6IHdpZHRoOworCQljZHdkcl93aWR0aCA9IGJ1c3dpZHRoID09IDE2ID8gd2lkdGggKiAyIDogd2lkdGg7CisJfQorCisJaGVpZ2h0ID0gaWNkLT5oZWlnaHQ7CisJaWYgKHBjZGV2LT5pc19pbnRlcmxhY2UpIHsKKwkJaGVpZ2h0IC89IDI7CisJCWNkd2RyX3dpZHRoICo9IDI7CisJfQogCiAJY2V1X3dyaXRlKHBjZGV2LCBDQU1PUiwgMCk7Ci0JY2V1X3dyaXRlKHBjZGV2LCBDQVBXUiwgKGljZC0+aGVpZ2h0IDw8IDE2KSB8IHdpZHRoKTsKLQljZXVfd3JpdGUocGNkZXYsIENGTENSLCAwKTsgLyogZGF0YSBmZXRjaCBtb2RlIC0gbm8gc2NhbGluZyAqLwotCWNldV93cml0ZShwY2RldiwgQ0ZTWlIsIChpY2QtPmhlaWdodCA8PCAxNikgfCBjZnN6cl93aWR0aCk7Ci0JY2V1X3dyaXRlKHBjZGV2LCBDTEZDUiwgMCk7IC8qIGRhdGEgZmV0Y2ggbW9kZSAtIG5vIGxvd3Bhc3MgZmlsdGVyICovCisJY2V1X3dyaXRlKHBjZGV2LCBDQVBXUiwgKGhlaWdodCA8PCAxNikgfCB3aWR0aCk7CisJY2V1X3dyaXRlKHBjZGV2LCBDRkxDUiwgMCk7IC8qIG5vIHNjYWxpbmcgKi8KKwljZXVfd3JpdGUocGNkZXYsIENGU1pSLCAoaGVpZ2h0IDw8IDE2KSB8IGNmc3pyX3dpZHRoKTsKKwljZXVfd3JpdGUocGNkZXYsIENMRkNSLCAwKTsgLyogbm8gbG93cGFzcyBmaWx0ZXIgKi8KIAogCS8qIEEgZmV3IHdvcmRzIGFib3V0IGJ5dGUgb3JkZXIgKG9ic2VydmVkIGluIEJpZyBFbmRpYW4gbW9kZSkKIAkgKgpAQCAtNDIzLDE5ICs0OTYsMjAgQEAKIAkgKiB1c2luZyA3IHdlIHN3YXAgdGhlIGRhdGEgYnl0ZXMgdG8gbWF0Y2ggdGhlIGluY29taW5nIG9yZGVyOgogCSAqIEQwLCBEMSwgRDIsIEQzLCBENCwgRDUsIEQ2LCBENwogCSAqLwotCWNldV93cml0ZShwY2RldiwgQ0RPQ1IsIDB4MDAwMDAwMTcpOworCXZhbHVlID0gMHgwMDAwMDAxNzsKKwlpZiAoeXV2X2xpbmVza2lwKQorCQl2YWx1ZSAmPSB+MHgwMDAwMDAxMDsgLyogY29udmVydCA0OjI6MiAtPiA0OjI6MCAqLworCisJY2V1X3dyaXRlKHBjZGV2LCBDRE9DUiwgdmFsdWUpOwogCiAJY2V1X3dyaXRlKHBjZGV2LCBDRFdEUiwgY2R3ZHJfd2lkdGgpOwogCWNldV93cml0ZShwY2RldiwgQ0ZXQ1IsIDApOyAvKiBrZWVwICJkYXRhZmV0Y2ggZmlyZXdhbGwiIGRpc2FibGVkICovCiAKIAkvKiBub3QgaW4gYnVuZGxlIG1vZGU6IHNraXAgQ0JEU1IsIENEQVlSMiwgQ0RBQ1IyLCBDREJZUjIsIENEQkNSMiAqLwotCS8qIGluIGRhdGEgZmV0Y2ggbW9kZTogbm8gbmVlZCBmb3IgQ0RBQ1IsIENEQllSLCBDREJDUiAqLwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSAgICAgICBfX3UzMiBwaXhmbXQpCitzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfdHJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwpAQCAtNDUwLDE1ICs1MjQsMTIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zZXRfZm10X2NhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgICAgIF9fdTMyIHBpeGZtdCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCBzaF9tb2JpbGVfY2V1X2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJOVjEyIiwKKwkJLmRlcHRoCQk9IDEyLAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjEyLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCX0sCisJeworCQkubmFtZQkJPSAiTlYyMSIsCisJCS5kZXB0aAkJPSAxMiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfTlYyMSwKKwkJLmNvbG9yc3BhY2UJPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwl9LAorCXsKKwkJLm5hbWUJCT0gIk5WMTYiLAorCQkuZGVwdGgJCT0gMTYsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX05WMTYsCisJCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJOVjYxIiwKKwkJLmRlcHRoCQk9IDE2LAorCQkuZm91cmNjCQk9IFY0TDJfUElYX0ZNVF9OVjYxLAorCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCX0sCit9OworCitzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfZ2V0X2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGludCBpZHgsCisJCQkJICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQogewotCXJldHVybiBpY2QtPm9wcy0+c2V0X2ZtdF9jYXAoaWNkLCBwaXhmbXQsIHJlY3QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCWludCByZXQsIGssIG47CisJaW50IGZvcm1hdHMgPSAwOworCisJcmV0ID0gc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKGljZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChpY2QtPmZvcm1hdHNbaWR4XS5mb3VyY2MpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorCWNhc2UgVjRMMl9QSVhfRk1UX1ZZVVk6CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorCQluID0gQVJSQVlfU0laRShzaF9tb2JpbGVfY2V1X2Zvcm1hdHMpOworCQlmb3JtYXRzICs9IG47CisJCWZvciAoayA9IDA7IHhsYXRlICYmIGsgPCBuOyBrKyspIHsKKwkJCXhsYXRlLT5ob3N0X2ZtdCA9ICZzaF9tb2JpbGVfY2V1X2Zvcm1hdHNba107CisJCQl4bGF0ZS0+Y2FtX2ZtdCA9IGljZC0+Zm9ybWF0cyArIGlkeDsKKwkJCXhsYXRlLT5idXN3aWR0aCA9IGljZC0+Zm9ybWF0c1tpZHhdLmRlcHRoOworCQkJeGxhdGUrKzsKKwkJCWRldl9kYmcoJmljaS0+ZGV2LCAiUHJvdmlkaW5nIGZvcm1hdCAlcyB1c2luZyAlc1xuIiwKKwkJCQlzaF9tb2JpbGVfY2V1X2Zvcm1hdHNba10ubmFtZSwKKwkJCQlpY2QtPmZvcm1hdHNbaWR4XS5uYW1lKTsKKwkJfQorCWRlZmF1bHQ6CisJCS8qIEdlbmVyaWMgcGFzcy10aHJvdWdoICovCisJCWZvcm1hdHMrKzsKKwkJaWYgKHhsYXRlKSB7CisJCQl4bGF0ZS0+aG9zdF9mbXQgPSBpY2QtPmZvcm1hdHMgKyBpZHg7CisJCQl4bGF0ZS0+Y2FtX2ZtdCA9IGljZC0+Zm9ybWF0cyArIGlkeDsKKwkJCXhsYXRlLT5idXN3aWR0aCA9IGljZC0+Zm9ybWF0c1tpZHhdLmRlcHRoOworCQkJeGxhdGUrKzsKKwkJCWRldl9kYmcoJmljaS0+ZGV2LAorCQkJCSJQcm92aWRpbmcgZm9ybWF0ICVzIGluIHBhc3MtdGhyb3VnaCBtb2RlXG4iLAorCQkJCWljZC0+Zm9ybWF0c1tpZHhdLm5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIGZvcm1hdHM7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV90cnlfZm10X2NhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCSBfX3UzMiBwaXhmbXQsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCiB7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOworCWludCByZXQ7CisKKwl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKKwlpZiAoIXhsYXRlKSB7CisJCWRldl93YXJuKCZpY2ktPmRldiwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSAwOgkJCQkvKiBPbmx5IGdlb21ldHJ5IGNoYW5nZSAqLworCQlyZXQgPSBpY2QtPm9wcy0+c2V0X2ZtdChpY2QsIHBpeGZtdCwgcmVjdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IGljZC0+b3BzLT5zZXRfZm10KGljZCwgeGxhdGUtPmNhbV9mbXQtPmZvdXJjYywgcmVjdCk7CisJfQorCisJaWYgKHBpeGZtdCAmJiAhcmV0KSB7CisJCWljZC0+YnVzd2lkdGggPSB4bGF0ZS0+YnVzd2lkdGg7CisJCWljZC0+Y3VycmVudF9mbXQgPSB4bGF0ZS0+aG9zdF9mbXQ7CisJCXBjZGV2LT5jYW1lcmFfZm10ID0geGxhdGUtPmNhbV9mbXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3RyeV9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OworCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CisJX191MzIgcGl4Zm10ID0gZi0+Zm10LnBpeC5waXhlbGZvcm1hdDsKKwlpbnQgcmV0OworCisJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CisJaWYgKCF4bGF0ZSkgeworCQlkZXZfd2FybigmaWNpLT5kZXYsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBGSVhNRTogY2FsY3VsYXRlIHVzaW5nIGRlcHRoIGFuZCBidXMgd2lkdGggKi8KIAogCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDQpCkBAIC00NzIsOCArNjU0LDMxIEBACiAJZi0+Zm10LnBpeC53aWR0aCAmPSB+MHgwMTsKIAlmLT5mbXQucGl4LmhlaWdodCAmPSB+MHgwMzsKIAorCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gZi0+Zm10LnBpeC53aWR0aCAqCisJCURJVl9ST1VORF9VUCh4bGF0ZS0+aG9zdF9mbXQtPmRlcHRoLCA4KTsKKwlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisKIAkvKiBsaW1pdCB0byBzZW5zb3IgY2FwYWJpbGl0aWVzICovCi0JcmV0dXJuIGljZC0+b3BzLT50cnlfZm10X2NhcChpY2QsIGYpOworCXJldCA9IGljZC0+b3BzLT50cnlfZm10KGljZCwgZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGYtPmZtdC5waXguZmllbGQpIHsKKwljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJcGNkZXYtPmlzX2ludGVybGFjZSA9IDE7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GSUVMRF9BTlk6CisJCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCS8qIGZhbGwtdGhyb3VnaCAqLworCWNhc2UgVjRMMl9GSUVMRF9OT05FOgorCQlwY2Rldi0+aXNfaW50ZXJsYWNlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3JlcWJ1ZnMoc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmLApAQCAtNTMyLDcgKzczNyw3IEBACiAJCQkJICAgICAgICZzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX29wcywKIAkJCQkgICAgICAgJmljaS0+ZGV2LCAmcGNkZXYtPmxvY2ssCiAJCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCQkgICAgICAgVjRMMl9GSUVMRF9OT05FLAorCQkJCSAgICAgICBWNEwyX0ZJRUxEX0FOWSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciksCiAJCQkJICAgICAgIGljZCk7CiB9CkBAIC01NDEsMTIgKzc0NiwxMiBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuYWRkCQk9IHNoX21vYmlsZV9jZXVfYWRkX2RldmljZSwKIAkucmVtb3ZlCQk9IHNoX21vYmlsZV9jZXVfcmVtb3ZlX2RldmljZSwKLQkuc2V0X2ZtdF9jYXAJPSBzaF9tb2JpbGVfY2V1X3NldF9mbXRfY2FwLAotCS50cnlfZm10X2NhcAk9IHNoX21vYmlsZV9jZXVfdHJ5X2ZtdF9jYXAsCisJLmdldF9mb3JtYXRzCT0gc2hfbW9iaWxlX2NldV9nZXRfZm9ybWF0cywKKwkuc2V0X2ZtdAk9IHNoX21vYmlsZV9jZXVfc2V0X2ZtdCwKKwkudHJ5X2ZtdAk9IHNoX21vYmlsZV9jZXVfdHJ5X2ZtdCwKIAkucmVxYnVmcwk9IHNoX21vYmlsZV9jZXVfcmVxYnVmcywKIAkucG9sbAkJPSBzaF9tb2JpbGVfY2V1X3BvbGwsCiAJLnF1ZXJ5Y2FwCT0gc2hfbW9iaWxlX2NldV9xdWVyeWNhcCwKLQkudHJ5X2J1c19wYXJhbQk9IHNoX21vYmlsZV9jZXVfdHJ5X2J1c19wYXJhbSwKIAkuc2V0X2J1c19wYXJhbQk9IHNoX21vYmlsZV9jZXVfc2V0X2J1c19wYXJhbSwKIAkuaW5pdF92aWRlb2J1Zgk9IHNoX21vYmlsZV9jZXVfaW5pdF92aWRlb2J1ZiwKIH07CkBAIC02MTYsNyArODIxLDcgQEAKIAogCS8qIHJlcXVlc3QgaXJxICovCiAJZXJyID0gcmVxdWVzdF9pcnEocGNkZXYtPmlycSwgc2hfbW9iaWxlX2NldV9pcnEsIElSUUZfRElTQUJMRUQsCi0JCQkgIHBkZXYtPmRldi5idXNfaWQsIHBjZGV2KTsKKwkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIHBjZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciBDRVUgaW50ZXJydXB0LlxuIik7CiAJCWdvdG8gZXhpdF9yZWxlYXNlX21lbTsKQEAgLTYzMyw4ICs4MzgsOCBAQAogCXBjZGV2LT5pY2kucHJpdiA9IHBjZGV2OwogCXBjZGV2LT5pY2kuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJcGNkZXYtPmljaS5uciA9IHBkZXYtPmlkOwotCXBjZGV2LT5pY2kuZHJ2X25hbWUgPSBwZGV2LT5kZXYuYnVzX2lkLAotCXBjZGV2LT5pY2kub3BzID0gJnNoX21vYmlsZV9jZXVfaG9zdF9vcHMsCisJcGNkZXYtPmljaS5kcnZfbmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCXBjZGV2LT5pY2kub3BzID0gJnNoX21vYmlsZV9jZXVfaG9zdF9vcHM7CiAKIAllcnIgPSBzb2NfY2FtZXJhX2hvc3RfcmVnaXN0ZXIoJnBjZGV2LT5pY2kpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKaW5kZXggZmNkMmI2Mi4uMDFhOGVmYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKQEAgLTIxNjIsNyArMjE2Miw3IEBACiAKIAlzdHJsY3B5KGNhcC5jYXJkLCBjYW0tPnY0bGRldi0+bmFtZSwgc2l6ZW9mKGNhcC5jYXJkKSk7CiAJaWYgKHVzYl9tYWtlX3BhdGgoY2FtLT51c2JkZXYsIGNhcC5idXNfaW5mbywgc2l6ZW9mKGNhcC5idXNfaW5mbykpIDwgMCkKLQkJc3RybGNweShjYXAuYnVzX2luZm8sIGNhbS0+dXNiZGV2LT5kZXYuYnVzX2lkLAorCQlzdHJsY3B5KGNhcC5idXNfaW5mbywgZGV2X25hbWUoJmNhbS0+dXNiZGV2LT5kZXYpLAogCQkJc2l6ZW9mKGNhcC5idXNfaW5mbykpOwogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjYXAsIHNpemVvZihjYXApKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9kZXZ0YWJsZS5oCmluZGV4IGUyMzczNGYuLjhjYjM0NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaApAQCAtNTUsNyArNTUsOSBAQAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MDI5LCBCUklER0VfU045QzEwMiksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmEsIEJSSURHRV9TTjlDMTAyKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYiwgQlJJREdFX1NOOUMxMDIpLCB9LAorI2lmICFkZWZpbmVkIENPTkZJR19VU0JfR1NQQ0EgJiYgIWRlZmluZWQgQ09ORklHX1VTQl9HU1BDQV9NT0RVTEUKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYywgQlJJREdFX1NOOUMxMDIpLCB9LAorI2VuZGlmCiAvKgl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyZCwgQlJJREdFX1NOOUMxMDIpLCB9LCBIVjcxMzFSICovCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmUsIEJSSURHRV9TTjlDMTAyKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjAzMCwgQlJJREdFX1NOOUMxMDIpLCB9LApAQCAtOTEsMTAgKzkzLDE0IEBACiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYmMsIEJSSURHRV9TTjlDMTAzKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiZSwgQlJJREdFX1NOOUMxMDMpLCB9LAogCS8qIFNOOUMxMDUgKi8KKyNpZiAhZGVmaW5lZCBDT05GSUdfVVNCX0dTUENBICYmICFkZWZpbmVkIENPTkZJR19VU0JfR1NQQ0FfTU9EVUxFCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwZjUsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDA0NWUsIDB4MDBmNywgQlJJREdFX1NOOUMxMDUpLCB9LAorI2VuZGlmCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjcsIEJSSURHRV9TTjlDMTA1KSwgfSwKKyNpZiAhZGVmaW5lZCBDT05GSUdfVVNCX0dTUENBICYmICFkZWZpbmVkIENPTkZJR19VU0JfR1NQQ0FfTU9EVUxFCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjgsIEJSSURHRV9TTjlDMTA1KSwgfSwKKyNlbmRpZgogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGMwLCBCUklER0VfU045QzEwNSksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYzIsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBjOCwgQlJJREdFX1NOOUMxMDUpLCB9LApAQCAtMTEzLDcgKzExOSw5IEBACiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMGYsIEJSSURHRV9TTjlDMTIwKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEzMCwgQlJJREdFX1NOOUMxMjApLCB9LAogLyoJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzgsIEJSSURHRV9TTjlDMTIwKSwgfSwgTU84MDAwICovCisjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9HU1BDQSAmJiAhZGVmaW5lZCBDT05GSUdfVVNCX0dTUENBX01PRFVMRQogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNhLCBCUklER0VfU045QzEyMCksIH0sCisjZW5kaWYKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEzYiwgQlJJREdFX1NOOUMxMjApLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNjLCBCUklER0VfU045QzEyMCksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2UsIEJSSURHRV9TTjlDMTIwKSwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKaW5kZXggNjZlYmU1OS4uOTAwNzdjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKQEAgLTMzLDEwICszMyw5IEBACiBzdGF0aWMgTElTVF9IRUFEKGhvc3RzKTsKIHN0YXRpYyBMSVNUX0hFQUQoZGV2aWNlcyk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGxpc3RfbG9jayk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHZpZGVvX2xvY2spOwogCi1jb25zdCBzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQqCi1mb3JtYXRfYnlfZm91cmNjKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1bnNpZ25lZCBpbnQgZm91cmNjKQorY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKnNvY19jYW1lcmFfZm9ybWF0X2J5X2ZvdXJjYygKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdW5zaWduZWQgaW50IGZvdXJjYykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNDUsNjcgKzQ0LDg3IEBACiAJCQlyZXR1cm4gaWNkLT5mb3JtYXRzICsgaTsKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woc29jX2NhbWVyYV9mb3JtYXRfYnlfZm91cmNjKTsKKworY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICpzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYygKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdW5zaWduZWQgaW50IGZvdXJjYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpY2QtPm51bV91c2VyX2Zvcm1hdHM7IGkrKykKKwkJaWYgKGljZC0+dXNlcl9mb3JtYXRzW2ldLmhvc3RfZm10LT5mb3VyY2MgPT0gZm91cmNjKQorCQkJcmV0dXJuIGljZC0+dXNlcl9mb3JtYXRzICsgaTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MpOworCisvKioKKyAqIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKCkgLSBhcHBseSBwbGF0Zm9ybSBTT0NBTV9TRU5TT1JfSU5WRVJUXyogZmxhZ3MKKyAqIEBpY2w6CWNhbWVyYSBwbGF0Zm9ybSBwYXJhbWV0ZXJzCisgKiBAZmxhZ3M6CWZsYWdzIHRvIGJlIGludmVydGVkIGFjY29yZGluZyB0byBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCisgKiBAcmV0dXJuOglyZXN1bHRpbmcgZmxhZ3MKKyAqLwordW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgZjsKKworCS8qIElmIG9ubHkgb25lIG9mIHRoZSB0d28gcG9sYXJpdGllcyBpcyBzdXBwb3J0ZWQsIHN3aXRjaCB0byB0aGUgb3Bwb3NpdGUgKi8KKwlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfSFNZTkMpIHsKKwkJZiA9IGZsYWdzICYgKFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVyk7CisJCWlmIChmID09IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKKwkJCWZsYWdzIF49IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKKwl9CisKKwlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfVlNZTkMpIHsKKwkJZiA9IGZsYWdzICYgKFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyk7CisJCWlmIChmID09IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHx8IGYgPT0gU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKKwkJCWZsYWdzIF49IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVzsKKwl9CisKKwlpZiAoaWNsLT5mbGFncyAmIFNPQ0FNX1NFTlNPUl9JTlZFUlRfUENMSykgeworCQlmID0gZmxhZ3MgJiAoU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyk7CisJCWlmIChmID09IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8fCBmID09IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJCQlmbGFncyBePSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOworCX0KKworCXJldHVybiBmbGFnczsKK30KK0VYUE9SVF9TWU1CT0woc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MpOwogCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQorCQkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlICppY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBpY2YtPmljZDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKLQllbnVtIHY0bDJfZmllbGQgZmllbGQ7Ci0JY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmZtdDsKLQlpbnQgcmV0OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKLQlmbXQgPSBmb3JtYXRfYnlfZm91cmNjKGljZCwgZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JaWYgKCFmbXQpIHsKLQkJZGV2X2RiZygmaWNkLT5kZXYsICJpbnZhbGlkIGZvcm1hdCAweCUwOHhcbiIsCi0JCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZygmaWNkLT5kZXYsICJmbXQ6IDB4JTA4eFxuIiwgZm10LT5mb3VyY2MpOwotCi0JZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCi0JaWYgKGZpZWxkID09IFY0TDJfRklFTERfQU5ZKSB7Ci0JCWZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCX0gZWxzZSBpZiAoVjRMMl9GSUVMRF9OT05FICE9IGZpZWxkKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiRmllbGQgdHlwZSBpbnZhbGlkLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHRlc3QgcGh5c2ljYWwgYnVzIHBhcmFtZXRlcnMgKi8KLQlyZXQgPSBpY2ktPm9wcy0+dHJ5X2J1c19wYXJhbShpY2QsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBsaW1pdCBmb3JtYXQgdG8gaGFyZHdhcmUgY2FwYWJpbGl0aWVzICovCi0JcmV0ID0gaWNpLT5vcHMtPnRyeV9mbXRfY2FwKGljZCwgZik7Ci0KLQkvKiBjYWxjdWxhdGUgbWlzc2luZyBmaWVsZHMgKi8KLQlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQotCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZtdC0+ZGVwdGgpID4+IDM7Ci0JZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQotCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaWNpLT5vcHMtPnRyeV9mbXQoaWNkLCBmKTsKIH0KIAogc3RhdGljIGludCBzb2NfY2FtZXJhX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJIHN0cnVjdCB2NGwyX2lucHV0ICppbnApCiB7CisJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7CisJaW50IHJldCA9IDA7CisKIAlpZiAoaW5wLT5pbmRleCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JaW5wLT5zdGQgPSBWNEwyX1NURF9VTktOT1dOOwotCXN0cmNweShpbnAtPm5hbWUsICJDYW1lcmEiKTsKKwlpZiAoaWNkLT5vcHMtPmVudW1faW5wdXQpCisJCXJldCA9IGljZC0+b3BzLT5lbnVtX2lucHV0KGljZCwgaW5wKTsKKwllbHNlIHsKKwkJLyogZGVmYXVsdCBpcyBjYW1lcmEgKi8KKwkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJaW5wLT5zdGQgID0gVjRMMl9TVERfVU5LTk9XTjsKKwkJc3RyY3B5KGlucC0+bmFtZSwgIkNhbWVyYSIpOworCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCkBAIC0xMjUsNyArMTQ0LDE0IEBACiAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmEpCiB7Ci0JcmV0dXJuIDA7CisJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaWNkLT5vcHMtPnNldF9zdGQpCisJCXJldCA9IGljZC0+b3BzLT5zZXRfc3RkKGljZCwgYSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEzNCw4ICsxNjAsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtMTc4LDYgKzIwMyw1OSBAQAogCXJldHVybiB2aWRlb2J1Zl9kcWJ1ZigmaWNmLT52Yl92aWRxLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiB9CiAKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9pbml0X3VzZXJfZm9ybWF0cyhzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlpbnQgaSwgZm10cyA9IDA7CisKKwlpZiAoIWljaS0+b3BzLT5nZXRfZm9ybWF0cykKKwkJLyoKKwkJICogRmFsbGJhY2sgbW9kZSAtIHRoZSBob3N0IHdpbGwgaGF2ZSB0byBzZXJ2ZSBhbGwKKwkJICogc2Vuc29yLXByb3ZpZGVkIGZvcm1hdHMgb25lLXRvLW9uZSB0byB0aGUgdXNlcgorCQkgKi8KKwkJZm10cyA9IGljZC0+bnVtX2Zvcm1hdHM7CisJZWxzZQorCQkvKgorCQkgKiBGaXJzdCBwYXNzIC0gb25seSBjb3VudCBmb3JtYXRzIHRoaXMgaG9zdC1zZW5zb3IKKwkJICogY29uZmlndXJhdGlvbiBjYW4gcHJvdmlkZQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGljZC0+bnVtX2Zvcm1hdHM7IGkrKykKKwkJCWZtdHMgKz0gaWNpLT5vcHMtPmdldF9mb3JtYXRzKGljZCwgaSwgTlVMTCk7CisKKwlpZiAoIWZtdHMpCisJCXJldHVybiAtRU5YSU87CisKKwlpY2QtPnVzZXJfZm9ybWF0cyA9CisJCXZtYWxsb2MoZm10cyAqIHNpemVvZihzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUpKTsKKwlpZiAoIWljZC0+dXNlcl9mb3JtYXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWljZC0+bnVtX3VzZXJfZm9ybWF0cyA9IGZtdHM7CisJZm10cyA9IDA7CisKKwlkZXZfZGJnKCZpY2QtPmRldiwgIkZvdW5kICVkIHN1cHBvcnRlZCBmb3JtYXRzLlxuIiwgZm10cyk7CisKKwkvKiBTZWNvbmQgcGFzcyAtIGFjdHVhbGx5IGZpbGwgZGF0YSBmb3JtYXRzICovCisJZm9yIChpID0gMDsgaSA8IGljZC0+bnVtX2Zvcm1hdHM7IGkrKykKKwkJaWYgKCFpY2ktPm9wcy0+Z2V0X2Zvcm1hdHMpIHsKKwkJCWljZC0+dXNlcl9mb3JtYXRzW2ldLmhvc3RfZm10ID0gaWNkLT5mb3JtYXRzICsgaTsKKwkJCWljZC0+dXNlcl9mb3JtYXRzW2ldLmNhbV9mbXQgPSBpY2QtPmZvcm1hdHMgKyBpOworCQkJaWNkLT51c2VyX2Zvcm1hdHNbaV0uYnVzd2lkdGggPSBpY2QtPmZvcm1hdHNbaV0uZGVwdGg7CisJCX0gZWxzZSB7CisJCQlmbXRzICs9IGljaS0+b3BzLT5nZXRfZm9ybWF0cyhpY2QsIGksCisJCQkJCQkgICAgICAmaWNkLT51c2VyX2Zvcm1hdHNbZm10c10pOworCQl9CisKKwlpY2QtPmN1cnJlbnRfZm10ID0gaWNkLT51c2VyX2Zvcm1hdHNbMF0uaG9zdF9mbXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29jX2NhbWVyYV9mcmVlX3VzZXJfZm9ybWF0cyhzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwl2ZnJlZShpY2QtPnVzZXJfZm9ybWF0cyk7Cit9CisKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7CkBAIC0xOTAsOCArMjY4LDEwIEBACiAJaWYgKCFpY2YpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogUHJvdGVjdCBhZ2FpbnN0IGljZC0+cmVtb3ZlKCkgdW50aWwgd2UgbW9kdWxlX2dldCgpIGJvdGggZHJpdmVycy4gKi8KLQltdXRleF9sb2NrKCZ2aWRlb19sb2NrKTsKKwkvKgorCSAqIEl0IGlzIHNhZmUgdG8gZGVyZWZlcmVuY2UgdGhlc2UgcG9pbnRlcnMgbm93IGFzIGxvbmcgYXMgYSB1c2VyIGhhcworCSAqIHRoZSB2aWRlbyBkZXZpY2Ugb3BlbiAtIHdlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGhlbGQgY2RldiByZWZlcmVuY2UuCisJICovCiAKIAl2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlpY2QgPSBjb250YWluZXJfb2YodmRldi0+cGFyZW50LCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIGRldik7CkBAIC0yMDksMjAgKzI4OSwyNSBAQAogCQlnb3RvIGVtZ2k7CiAJfQogCisJLyogUHJvdGVjdCBhZ2FpbnN0IGljZC0+cmVtb3ZlKCkgdW50aWwgd2UgbW9kdWxlX2dldCgpIGJvdGggZHJpdmVycy4gKi8KKwltdXRleF9sb2NrKCZpY2QtPnZpZGVvX2xvY2spOworCiAJaWNmLT5pY2QgPSBpY2Q7CiAJaWNkLT51c2VfY291bnQrKzsKIAogCS8qIE5vdyB3ZSByZWFsbHkgaGF2ZSB0byBhY3RpdmF0ZSB0aGUgY2FtZXJhICovCiAJaWYgKGljZC0+dXNlX2NvdW50ID09IDEpIHsKKwkJcmV0ID0gc29jX2NhbWVyYV9pbml0X3VzZXJfZm9ybWF0cyhpY2QpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZWl1Zm10OwogCQlyZXQgPSBpY2ktPm9wcy0+YWRkKGljZCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGFjdGl2YXRlIHRoZSBjYW1lcmE6ICVkXG4iLCByZXQpOwotCQkJaWNkLT51c2VfY291bnQtLTsKIAkJCWdvdG8gZWljaWFkZDsKIAkJfQogCX0KIAotCW11dGV4X3VubG9jaygmdmlkZW9fbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZpY2QtPnZpZGVvX2xvY2spOwogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaWNmOwogCWRldl9kYmcoJmljZC0+ZGV2LCAiY2FtZXJhIGRldmljZSBvcGVuXG4iKTsKQEAgLTIzMSwxMyArMzE2LDE2IEBACiAKIAlyZXR1cm4gMDsKIAotCS8qIEFsbCBlcnJvcnMgYXJlIGVudGVyZWQgd2l0aCB0aGUgdmlkZW9fbG9jayBoZWxkICovCisJLyogRmlyc3QgdHdvIGVycm9ycyBhcmUgZW50ZXJlZCB3aXRoIHRoZSAudmlkZW9fbG9jayBoZWxkICovCiBlaWNpYWRkOgorCXNvY19jYW1lcmFfZnJlZV91c2VyX2Zvcm1hdHMoaWNkKTsKK2VpdWZtdDoKKwlpY2QtPnVzZV9jb3VudC0tOworCW11dGV4X3VubG9jaygmaWNkLT52aWRlb19sb2NrKTsKIAltb2R1bGVfcHV0KGljaS0+b3BzLT5vd25lcik7CiBlbWdpOgogCW1vZHVsZV9wdXQoaWNkLT5vcHMtPm93bmVyKTsKIGVtZ2Q6Ci0JbXV0ZXhfdW5sb2NrKCZ2aWRlb19sb2NrKTsKIAl2ZnJlZShpY2YpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNDksMTMgKzMzNywxNiBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBpY2QtPnZkZXY7CiAKLQltdXRleF9sb2NrKCZ2aWRlb19sb2NrKTsKKwltdXRleF9sb2NrKCZpY2QtPnZpZGVvX2xvY2spOwogCWljZC0+dXNlX2NvdW50LS07Ci0JaWYgKCFpY2QtPnVzZV9jb3VudCkKKwlpZiAoIWljZC0+dXNlX2NvdW50KSB7CiAJCWljaS0+b3BzLT5yZW1vdmUoaWNkKTsKKwkJc29jX2NhbWVyYV9mcmVlX3VzZXJfZm9ybWF0cyhpY2QpOworCX0KKwltdXRleF91bmxvY2soJmljZC0+dmlkZW9fbG9jayk7CisKIAltb2R1bGVfcHV0KGljZC0+b3BzLT5vd25lcik7CiAJbW9kdWxlX3B1dChpY2ktPm9wcy0+b3duZXIpOwotCW11dGV4X3VubG9jaygmdmlkZW9fbG9jayk7CiAKIAl2ZnJlZShpY2YpOwogCkBAIC0yNjUsNyArMzU2LDcgQEAKIH0KIAogc3RhdGljIHNzaXplX3Qgc29jX2NhbWVyYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7CkBAIC0yOTksOCArMzkwLDcgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlICppY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBpY2YtPmljZDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAogCWlmIChsaXN0X2VtcHR5KCZpY2YtPnZiX3ZpZHEuc3RyZWFtKSkgewogCQlkZXZfZXJyKCZpY2QtPmRldiwgIlRyeWluZyB0byBwb2xsIHdpdGggbm8gcXVldWVkIGJ1ZmZlcnMhXG4iKTsKQEAgLTMxMCw3ICs0MDAsNiBAQAogCXJldHVybiBpY2ktPm9wcy0+cG9sbChmaWxlLCBwdCk7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29jX2NhbWVyYV9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBzb2NfY2FtZXJhX29wZW4sCkBAIC0zMjIsNDQgKzQxMSw1MCBAQAogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogfTsKIAotCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCisJCQkJICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlICppY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBpY2YtPmljZDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwlfX3UzMiBwaXhmbXQgPSBwaXgtPnBpeGVsZm9ybWF0OwogCWludCByZXQ7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OwotCWNvbnN0IHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCAqZGF0YV9mbXQ7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAotCWRhdGFfZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhpY2QsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWlmICghZGF0YV9mbXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogYnVzd2lkdGggbWF5IGJlIGZ1cnRoZXIgYWRqdXN0ZWQgYnkgdGhlIGljaSAqLwotCWljZC0+YnVzd2lkdGggPSBkYXRhX2ZtdC0+ZGVwdGg7Ci0KLQlyZXQgPSBzb2NfY2FtZXJhX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBpY2YsIGYpOworCXJldCA9IHNvY19jYW1lcmFfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJbXV0ZXhfbG9jaygmaWNmLT52Yl92aWRxLnZiX2xvY2spOworCisJaWYgKHZpZGVvYnVmX3F1ZXVlX2lzX2J1c3koJmljZi0+dmJfdmlkcSkpIHsKKwkJZGV2X2VycigmaWNkLT5kZXYsICJTX0ZNVCBkZW5pZWQ6IHF1ZXVlIGJ1c3lcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOworCX0KKwogCXJlY3QubGVmdAk9IGljZC0+eF9jdXJyZW50OwogCXJlY3QudG9wCT0gaWNkLT55X2N1cnJlbnQ7Ci0JcmVjdC53aWR0aAk9IGYtPmZtdC5waXgud2lkdGg7Ci0JcmVjdC5oZWlnaHQJPSBmLT5mbXQucGl4LmhlaWdodDsKLQlyZXQgPSBpY2ktPm9wcy0+c2V0X2ZtdF9jYXAoaWNkLCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0LCAmcmVjdCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJcmVjdC53aWR0aAk9IHBpeC0+d2lkdGg7CisJcmVjdC5oZWlnaHQJPSBwaXgtPmhlaWdodDsKKwlyZXQgPSBpY2ktPm9wcy0+c2V0X2ZtdChpY2QsIHBpeC0+cGl4ZWxmb3JtYXQsICZyZWN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlnb3RvIHVubG9jazsKKwl9IGVsc2UgaWYgKCFpY2QtPmN1cnJlbnRfZm10IHx8CisJCSAgIGljZC0+Y3VycmVudF9mbXQtPmZvdXJjYyAhPSBwaXhmbXQpIHsKKwkJZGV2X2VycigmaWNpLT5kZXYsCisJCQkiSG9zdCBkcml2ZXIgaGFzbid0IHNldCB1cCBjdXJyZW50IGZvcm1hdCBjb3JyZWN0bHkhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQogCi0JaWNkLT5jdXJyZW50X2ZtdAk9IGRhdGFfZm10OwogCWljZC0+d2lkdGgJCT0gcmVjdC53aWR0aDsKIAlpY2QtPmhlaWdodAkJPSByZWN0LmhlaWdodDsKLQlpY2YtPnZiX3ZpZHEuZmllbGQJPSBmLT5mbXQucGl4LmZpZWxkOwotCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgIT0gZi0+dHlwZSkKKwlpY2YtPnZiX3ZpZHEuZmllbGQJPSBwaXgtPmZpZWxkOworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJZGV2X3dhcm4oJmljZC0+ZGV2LCAiQXR0ZW50aW9uISBXcm9uZyBidWYtdHlwZSAlZFxuIiwKIAkJCSBmLT50eXBlKTsKIApAQCAtMzY3LDExICs0NjIsMTYgQEAKIAkJaWNkLT53aWR0aCwgaWNkLT5oZWlnaHQpOwogCiAJLyogc2V0IHBoeXNpY2FsIGJ1cyBwYXJhbWV0ZXJzICovCi0JcmV0dXJuIGljaS0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJcmV0ID0gaWNpLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBwaXhmbXQpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpY2YtPnZiX3ZpZHEudmJfbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCi0JCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKKwkJCQkgICAgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlICppY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBpY2YtPmljZDsKQEAgLTM3OSwxMCArNDc5LDEwIEBACiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAotCWlmIChmLT5pbmRleCA+PSBpY2QtPm51bV9mb3JtYXRzKQorCWlmIChmLT5pbmRleCA+PSBpY2QtPm51bV91c2VyX2Zvcm1hdHMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9ybWF0ID0gJmljZC0+Zm9ybWF0c1tmLT5pbmRleF07CisJZm9ybWF0ID0gaWNkLT51c2VyX2Zvcm1hdHNbZi0+aW5kZXhdLmhvc3RfZm10OwogCiAJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm9ybWF0LT5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKIAlmLT5waXhlbGZvcm1hdCA9IGZvcm1hdC0+Zm91cmNjOwpAQCAtMzkwLDIxICs0OTAsMjEgQEAKIH0KIAogc3RhdGljIGludCBzb2NfY2FtZXJhX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQorCQkJCSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAotCWYtPmZtdC5waXgud2lkdGgJPSBpY2QtPndpZHRoOwotCWYtPmZtdC5waXguaGVpZ2h0CT0gaWNkLT5oZWlnaHQ7Ci0JZi0+Zm10LnBpeC5maWVsZAk9IGljZi0+dmJfdmlkcS5maWVsZDsKLQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0CT0gaWNkLT5jdXJyZW50X2ZtdC0+Zm91cmNjOwotCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lCT0KLQkJKGYtPmZtdC5waXgud2lkdGggKiBpY2QtPmN1cnJlbnRfZm10LT5kZXB0aCkgPj4gMzsKLQlmLT5mbXQucGl4LnNpemVpbWFnZQk9Ci0JCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJcGl4LT53aWR0aAkJPSBpY2QtPndpZHRoOworCXBpeC0+aGVpZ2h0CQk9IGljZC0+aGVpZ2h0OworCXBpeC0+ZmllbGQJCT0gaWNmLT52Yl92aWRxLmZpZWxkOworCXBpeC0+cGl4ZWxmb3JtYXQJPSBpY2QtPmN1cnJlbnRfZm10LT5mb3VyY2M7CisJcGl4LT5ieXRlc3BlcmxpbmUJPSBwaXgtPndpZHRoICoKKwkJRElWX1JPVU5EX1VQKGljZC0+Y3VycmVudF9mbXQtPmRlcHRoLCA4KTsKKwlwaXgtPnNpemVpbWFnZQkJPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwogCWRldl9kYmcoJmljZC0+ZGV2LCAiY3VycmVudF9mbXQtPmZvdXJjYzogMHglMDh4XG4iLAogCQlpY2QtPmN1cnJlbnRfZm10LT5mb3VyY2MpOwogCXJldHVybiAwOwpAQCAtNDE1LDggKzUxNSw3IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtNDI5LDYgKzUyOCw3IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqaWNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gaWNmLT5pY2Q7CisJaW50IHJldDsKIAogCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwogCkBAIC00MzcsMTAgKzUzNywxNiBAQAogCWlmIChpICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltdXRleF9sb2NrKCZpY2QtPnZpZGVvX2xvY2spOworCiAJaWNkLT5vcHMtPnN0YXJ0X2NhcHR1cmUoaWNkKTsKIAogCS8qIFRoaXMgY2FsbHMgYnVmX3F1ZXVlIGZyb20gaG9zdCBkcml2ZXIncyB2aWRlb2J1Zl9xdWV1ZV9vcHMgKi8KLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oJmljZi0+dmJfdmlkcSk7CisJcmV0ID0gdmlkZW9idWZfc3RyZWFtb24oJmljZi0+dmJfdmlkcSk7CisKKwltdXRleF91bmxvY2soJmljZC0+dmlkZW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LApAQCAtNDU2LDEyICs1NjIsMTYgQEAKIAlpZiAoaSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmaWNkLT52aWRlb19sb2NrKTsKKwogCS8qIFRoaXMgY2FsbHMgYnVmX3JlbGVhc2UgZnJvbSBob3N0IGRyaXZlcidzIHZpZGVvYnVmX3F1ZXVlX29wcyBmb3IgYWxsCiAJICogcmVtYWluaW5nIGJ1ZmZlcnMuIFdoZW4gdGhlIGxhc3QgYnVmZmVyIGlzIGZyZWVkLCBzdG9wIGNhcHR1cmUgKi8KIAl2aWRlb2J1Zl9zdHJlYW1vZmYoJmljZi0+dmJfdmlkcSk7CiAKIAlpY2QtPm9wcy0+c3RvcF9jYXB0dXJlKGljZCk7CiAKKwltdXRleF91bmxvY2soJmljZC0+dmlkZW9fbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTY3LDE0ICs2NzcsMTYgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlICppY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBpY2YtPmljZDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKIAlpbnQgcmV0OwogCiAJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGljaS0+b3BzLT5zZXRfZm10X2NhcChpY2QsIDAsICZhLT5jKTsKKwkvKiBDcm9wcGluZyBpcyBhbGxvd2VkIGR1cmluZyBhIHJ1bm5pbmcgY2FwdHVyZSwgZ3VhcmQgY29uc2lzdGVuY3kgKi8KKwltdXRleF9sb2NrKCZpY2YtPnZiX3ZpZHEudmJfbG9jayk7CisKKwlyZXQgPSBpY2ktPm9wcy0+c2V0X2ZtdChpY2QsIDAsICZhLT5jKTsKIAlpZiAoIXJldCkgewogCQlpY2QtPndpZHRoCT0gYS0+Yy53aWR0aDsKIAkJaWNkLT5oZWlnaHQJPSBhLT5jLmhlaWdodDsKQEAgLTU4Miw2ICs2OTQsOCBAQAogCQlpY2QtPnlfY3VycmVudAk9IGEtPmMudG9wOwogCX0KIAorCW11dGV4X3VubG9jaygmaWNmLT52Yl92aWRxLnZiX2xvY2spOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjkyLDE4ICs4MDYsMzUgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB0b19zb2NfY2FtZXJhX2RldihkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9Ci0JCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZC0+b3BzLT5wcm9iZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyoKKwkgKiBQb3NzaWJsZSByYWNlIHNjZW5hcmlvOgorCSAqIG1vZHByb2JlIDxjYW1lcmEtaG9zdC1kcml2ZXI+IHRyaWdnZXJzIF9fZnVuY19fCisJICogYXQgdGhpcyBtb21lbnQgcmVzcGVjdGl2ZSA8Y2FtZXJhLXNlbnNvci1kcml2ZXI+IGdldHMgcm1tb2QnZWQKKwkgKiB0byBwcm90ZWN0IHRha2UgbW9kdWxlIHJlZmVyZW5jZXMuCisJICovCisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGljZC0+b3BzLT5vd25lcikpIHsKKwkJZGV2X2VycigmaWNkLT5kZXYsICJDb3VsZG4ndCBsb2NrIHNlbnNvciBkcml2ZXIuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbWdkOworCX0KKworCWlmICghdHJ5X21vZHVsZV9nZXQoaWNpLT5vcHMtPm93bmVyKSkgeworCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGxvY2sgY2FwdHVyZSBidXMgZHJpdmVyLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW1naTsKKwl9CisKKwltdXRleF9sb2NrKCZpY2QtPnZpZGVvX2xvY2spOwogCiAJLyogV2Ugb25seSBjYWxsIC0+YWRkKCkgaGVyZSB0byBhY3RpdmF0ZSBhbmQgcHJvYmUgdGhlIGNhbWVyYS4KIAkgKiBXZSBzaGFsbCAtPnJlbW92ZSgpIGFuZCBkZWFjdGl2YXRlIGl0IGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuICovCiAJcmV0ID0gaWNpLT5vcHMtPmFkZChpY2QpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVpYWRkOwogCiAJcmV0ID0gaWNkLT5vcHMtPnByb2JlKGljZCk7CiAJaWYgKHJldCA+PSAwKSB7CkBAIC03MTcsNiArODQ4LDEyIEBACiAJfQogCWljaS0+b3BzLT5yZW1vdmUoaWNkKTsKIAorZWlhZGQ6CisJbXV0ZXhfdW5sb2NrKCZpY2QtPnZpZGVvX2xvY2spOworCW1vZHVsZV9wdXQoaWNpLT5vcHMtPm93bmVyKTsKK2VtZ2k6CisJbW9kdWxlX3B1dChpY2QtPm9wcy0+b3duZXIpOworZW1nZDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NzksMTEgKzkxNiwyMCBAQAogCWludCByZXQ7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaXg7CiAKLQlpZiAoIWljaS0+b3BzLT5pbml0X3ZpZGVvYnVmIHx8ICFpY2ktPm9wcy0+YWRkIHx8ICFpY2ktPm9wcy0+cmVtb3ZlKQorCWlmICghaWNpIHx8ICFpY2ktPm9wcyB8fAorCSAgICAhaWNpLT5vcHMtPnRyeV9mbXQgfHwKKwkgICAgIWljaS0+b3BzLT5zZXRfZm10IHx8CisJICAgICFpY2ktPm9wcy0+c2V0X2J1c19wYXJhbSB8fAorCSAgICAhaWNpLT5vcHMtPnF1ZXJ5Y2FwIHx8CisJICAgICFpY2ktPm9wcy0+aW5pdF92aWRlb2J1ZiB8fAorCSAgICAhaWNpLT5vcHMtPnJlcWJ1ZnMgfHwKKwkgICAgIWljaS0+b3BzLT5hZGQgfHwKKwkgICAgIWljaS0+b3BzLT5yZW1vdmUgfHwKKwkgICAgIWljaS0+b3BzLT5wb2xsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIE51bWJlciBtaWdodCBiZSBlcXVhbCB0byB0aGUgcGxhdGZvcm0gZGV2aWNlIElEICovCi0Jc3ByaW50ZihpY2ktPmRldi5idXNfaWQsICJjYW1lcmFfaG9zdCVkIiwgaWNpLT5ucik7CisJZGV2X3NldF9uYW1lKCZpY2ktPmRldiwgImNhbWVyYV9ob3N0JWQiLCBpY2ktPm5yKTsKIAogCW11dGV4X2xvY2soJmxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpeCwgJmhvc3RzLCBsaXN0KSB7CkBAIC04NDcsNyArOTkzLDE2IEBACiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppeDsKIAlpbnQgbnVtID0gLTEsIGk7CiAKLQlpZiAoIWljZCkKKwlpZiAoIWljZCB8fCAhaWNkLT5vcHMgfHwKKwkgICAgIWljZC0+b3BzLT5wcm9iZSB8fAorCSAgICAhaWNkLT5vcHMtPmluaXQgfHwKKwkgICAgIWljZC0+b3BzLT5yZWxlYXNlIHx8CisJICAgICFpY2QtPm9wcy0+c3RhcnRfY2FwdHVyZSB8fAorCSAgICAhaWNkLT5vcHMtPnN0b3BfY2FwdHVyZSB8fAorCSAgICAhaWNkLT5vcHMtPnNldF9mbXQgfHwKKwkgICAgIWljZC0+b3BzLT50cnlfZm10IHx8CisJICAgICFpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtIHx8CisJICAgICFpY2QtPm9wcy0+c2V0X2J1c19wYXJhbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjU2ICYmIG51bSA8IDA7IGkrKykgewpAQCAtODY3LDEwICsxMDIyLDEyIEBACiAKIAlpY2QtPmRldm51bSA9IG51bTsKIAlpY2QtPmRldi5idXMgPSAmc29jX2NhbWVyYV9idXNfdHlwZTsKLQlzbnByaW50ZihpY2QtPmRldi5idXNfaWQsIHNpemVvZihpY2QtPmRldi5idXNfaWQpLAotCQkgIiV1LSV1IiwgaWNkLT5pZmFjZSwgaWNkLT5kZXZudW0pOworCWRldl9zZXRfbmFtZSgmaWNkLT5kZXYsICIldS0ldSIsIGljZC0+aWZhY2UsIGljZC0+ZGV2bnVtKTsKIAotCWljZC0+ZGV2LnJlbGVhc2UgPSBkdW1teV9yZWxlYXNlOworCWljZC0+ZGV2LnJlbGVhc2UJPSBkdW1teV9yZWxlYXNlOworCWljZC0+dXNlX2NvdW50CQk9IDA7CisJaWNkLT5ob3N0X3ByaXYJCT0gTlVMTDsKKwltdXRleF9pbml0KCZpY2QtPnZpZGVvX2xvY2spOwogCiAJcmV0dXJuIHNjYW5fYWRkX2RldmljZShpY2QpOwogfQpAQCAtOTE3LDYgKzEwNzQsMTAgQEAKICNlbmRpZgogfTsKIAorLyoKKyAqIFVzdWFsbHkgY2FsbGVkIGZyb20gdGhlIHN0cnVjdCBzb2NfY2FtZXJhX29wcyAucHJvYmUoKSBtZXRob2QsIGkuZS4sIGZyb20KKyAqIHNvY19jYW1lcmFfcHJvYmUoKSBhYm92ZSB3aXRoIC52aWRlb19sb2NrIGhlbGQKKyAqLwogaW50IHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CkBAIC05MzIsNyArMTA5Myw3IEBACiAJZGV2X2RiZygmaWNpLT5kZXYsICJBbGxvY2F0ZWQgdmlkZW9fZGV2aWNlICVwXG4iLCB2ZGV2KTsKIAogCXN0cmxjcHkodmRldi0+bmFtZSwgaWNpLT5kcnZfbmFtZSwgc2l6ZW9mKHZkZXYtPm5hbWUpKTsKLQkvKiBNYXliZSBiZXR0ZXIgJmljaS0+ZGV2ICovCisKIAl2ZGV2LT5wYXJlbnQJCT0gJmljZC0+ZGV2OwogCXZkZXYtPmN1cnJlbnRfbm9ybQk9IFY0TDJfU1REX1VOS05PV047CiAJdmRldi0+Zm9wcwkJPSAmc29jX2NhbWVyYV9mb3BzOwpAQCAtOTQxLDggKzExMDIsNiBAQAogCXZkZXYtPm1pbm9yCQk9IC0xOwogCXZkZXYtPnR2bm9ybXMJCT0gVjRMMl9TVERfVU5LTk9XTiwKIAotCWljZC0+Y3VycmVudF9mbXQgPSAmaWNkLT5mb3JtYXRzWzBdOwotCiAJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZkZXYtPm1pbm9yKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHZkZXYtPnBhcmVudCwgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOwpAQCAtOTY4LDEwICsxMTI3LDEwIEBACiAJaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwgIXZkZXYpCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJnZpZGVvX2xvY2spOworCW11dGV4X2xvY2soJmljZC0+dmlkZW9fbG9jayk7CiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmRldik7CiAJaWNkLT52ZGV2ID0gTlVMTDsKLQltdXRleF91bmxvY2soJnZpZGVvX2xvY2spOworCW11dGV4X3VubG9jaygmaWNkLT52aWRlb19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0woc29jX2NhbWVyYV92aWRlb19zdG9wKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhX3BsYXRmb3JtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwppbmRleCBiYjdhOWQ0Li4wMTNhYjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwpAQCAtNzksMTkgKzc5LDIwIEBACiAJcmV0dXJuIHAtPmJ1c19wYXJhbTsKIH0KIAotc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX3NldF9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCQkgICBfX3UzMiBwaXhmbXQsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fc2V0X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgICAgICAgX191MzIgcGl4Zm10LCBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fdHJ5X2ZtdF9jYXAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHNvY19jYW1lcmFfcGxhdGZvcm1fZ2V0X2luZm8oaWNkKTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKIAotCWYtPmZtdC5waXgud2lkdGggPSBwLT5mb3JtYXQud2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBwLT5mb3JtYXQuaGVpZ2h0OworCXBpeC0+d2lkdGggPSBwLT5mb3JtYXQud2lkdGg7CisJcGl4LT5oZWlnaHQgPSBwLT5mb3JtYXQuaGVpZ2h0OwogCXJldHVybiAwOwogfQogCkBAIC0xMjQsOCArMTI1LDggQEAKIAkucmVsZWFzZQkJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX3JlbGVhc2UsCiAJLnN0YXJ0X2NhcHR1cmUJCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zdGFydF9jYXB0dXJlLAogCS5zdG9wX2NhcHR1cmUJCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zdG9wX2NhcHR1cmUsCi0JLnNldF9mbXRfY2FwCQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fc2V0X2ZtdF9jYXAsCi0JLnRyeV9mbXRfY2FwCQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fdHJ5X2ZtdF9jYXAsCisJLnNldF9mbXQJCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zZXRfZm10LAorCS50cnlfZm10CQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fdHJ5X2ZtdCwKIAkuc2V0X2J1c19wYXJhbQkJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX3NldF9idXNfcGFyYW0sCiAJLnF1ZXJ5X2J1c19wYXJhbQk9IHNvY19jYW1lcmFfcGxhdGZvcm1fcXVlcnlfYnVzX3BhcmFtLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKaW5kZXggZTllYjZkNy4uZjk1MTZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKQEAgLTEyNjIsNiArMTI2MiwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0a192aWRpb2NfZW51bV9mcmFtZXNpemVzKHN0cnVjdCBmaWxlICpmaWxwLAorCQl2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSAqZnJtcykKK3sKKwlpZiAoZnJtcy0+aW5kZXggPj0gQVJSQVlfU0laRShzdGtfc2l6ZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKGZybXMtPnBpeGVsX2Zvcm1hdCkgeworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjVYOgorCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjg6CisJCWZybXMtPnR5cGUgPSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKwkJZnJtcy0+ZGlzY3JldGUud2lkdGggPSBzdGtfc2l6ZXNbZnJtcy0+aW5kZXhdLnc7CisJCWZybXMtPmRpc2NyZXRlLmhlaWdodCA9IHN0a19zaXplc1tmcm1zLT5pbmRleF0uaDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2NGxfc3RrX2ZvcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gPSB2NGxfc3RrX29wZW4sCkBAIC0xMjk2LDYgKzEzMTUsNyBAQAogCS52aWRpb2NfZ19jdHJsID0gc3RrX3ZpZGlvY19nX2N0cmwsCiAJLnZpZGlvY19zX2N0cmwgPSBzdGtfdmlkaW9jX3NfY3RybCwKIAkudmlkaW9jX2dfcGFybSA9IHN0a192aWRpb2NfZ19wYXJtLAorCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gc3RrX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMsCiB9OwogCiBzdGF0aWMgdm9pZCBzdGtfdjRsX2Rldl9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkKQpAQCAtMTM3NiwxMiArMTM5Niw5IEBACiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJaWYgKCFkZXYtPmlzb2NfZXAKLQkJCSYmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MKLQkJCQkmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikKLQkJCSYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcwotCQkJCSYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpKSB7CisJCQkmJiB1c2JfZW5kcG9pbnRfaXNfaXNvY19pbihlbmRwb2ludCkpIHsKIAkJCS8qIHdlIGZvdW5kIGFuIGlzb2MgaW4gZW5kcG9pbnQgKi8KLQkJCWRldi0+aXNvY19lcCA9IChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4Rik7CisJCQlkZXYtPmlzb2NfZXAgPSB1c2JfZW5kcG9pbnRfbnVtKGVuZHBvaW50KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKaW5kZXggMzI4YzQxYi4uNDJhY2M5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCkBAIC0xMTMyLDggKzExMzIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0djY4MF9kb19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBzdHY2ODBfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKQEAgLTEzMDMsNyArMTMwMiw3IEBACiBzdGF0aWMgaW50IHN0djY4MF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHN0djY4MF9kb19pb2N0bCk7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBzdHY2ODBfZG9faW9jdGwpOwogfQogCiBzdGF0aWMgaW50IHN0djY4MF9tbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCmluZGV4IDQ5NjNkNDIuLjBjMDIwNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCkBAIC00Nyw5ICs0NywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS9pMmMtYWRkci5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KIAogI2lmbmRlZiBWSURFT19BVURJT19CQUxBTkNFCiAjIGRlZmluZSBWSURFT19BVURJT19CQUxBTkNFIDMyCkBAIC03OSw2ICs4MCw3IEBACiAvKiBTdHJ1Y3R1cmUgb2YgYWRkcmVzcyBhbmQgc3ViYWRkcmVzc2VzIGZvciB0aGUgdGRhNzQzMiAqLwogCiBzdHJ1Y3QgdGRhNzQzMiB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCWludCBhZGRyOwogCWludCBpbnB1dDsKIAlpbnQgdm9sdW1lOwpAQCAtODYsMTAgKzg4LDEyIEBACiAJaW50IGJhc3MsIHRyZWJsZTsKIAlpbnQgbGYsIGxyLCByZiwgcnI7CiAJaW50IGxvdWQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgYzsKIH07Ci1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGRhNzQzMiAqdG9fc3RhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgdGRhNzQzMiwgc2QpOworfQogCiAvKiBUaGUgVERBNzQzMiBpcyBtYWRlIGJ5IFNUUy1UaG9tcHNvbgogICogaHR0cDovL3d3dy5zdC5jb20KQEAgLTIyNCwzMiArMjI4LDMzIEBACiAKIC8qIEJlZ2luIGNvZGUgKi8KIAotc3RhdGljIGludCB0ZGE3NDMyX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBzdWJhZGRyLCBpbnQgdmFsKQorc3RhdGljIGludCB0ZGE3NDMyX3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBzdWJhZGRyLCBpbnQgdmFsKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKLQl2NGxfZGJnKDIsIGRlYnVnLGNsaWVudCwiSW4gdGRhNzQzMl93cml0ZVxuIik7Ci0JdjRsX2RiZygxLCBkZWJ1ZyxjbGllbnQsIldyaXRpbmcgJWQgMHgleFxuIiwgc3ViYWRkciwgdmFsKTsKKworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIkluIHRkYTc0MzJfd3JpdGVcbiIpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIldyaXRpbmcgJWQgMHgleFxuIiwgc3ViYWRkciwgdmFsKTsKIAlidWZmZXJbMF0gPSBzdWJhZGRyOwogCWJ1ZmZlclsxXSA9IHZhbDsKLQlpZiAoMiAhPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LGJ1ZmZlciwyKSkgewotCQl2NGxfZXJyKGNsaWVudCwiSS9PIGVycm9yLCB0cnlpbmcgKHdyaXRlICVkIDB4JXgpXG4iLAorCWlmICgyICE9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgMikpIHsKKwkJdjRsMl9lcnIoc2QsICJJL08gZXJyb3IsIHRyeWluZyAod3JpdGUgJWQgMHgleClcbiIsCiAJCSAgICAgICBzdWJhZGRyLCB2YWwpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiAwOwogfQogCi0vKiBJIGRvbid0IHRoaW5rIHdlIGV2ZXIgYWN0dWFsbHkgX3JlYWRfIHRoZSBjaGlwLi4uICovCi0KLXN0YXRpYyBpbnQgdGRhNzQzMl9zZXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgdGRhNzQzMl9zZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKLQlzdHJ1Y3QgdGRhNzQzMiAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdGRhNzQzMiAqdCA9IHRvX3N0YXRlKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07Ci0JdjRsX2RiZygyLCBkZWJ1ZyxjbGllbnQsIkluIHRkYTc0MzJfc2V0XG4iKTsKIAotCXY0bF9kYmcoMSwgZGVidWcsY2xpZW50LAorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKIAkJInRkYTc0MzI6IDc0MzJfc2V0KDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4KVxuIiwKLQkJdC0+aW5wdXQsdC0+dm9sdW1lLHQtPmJhc3MsdC0+dHJlYmxlLHQtPmxmLHQtPmxyLHQtPnJmLHQtPnJyLHQtPmxvdWQpOworCQl0LT5pbnB1dCwgdC0+dm9sdW1lLCB0LT5iYXNzLCB0LT50cmVibGUsIHQtPmxmLCB0LT5sciwKKwkJdC0+cmYsIHQtPnJyLCB0LT5sb3VkKTsKIAlidWZbMF0gID0gVERBNzQzMl9JTjsKIAlidWZbMV0gID0gdC0+aW5wdXQ7CiAJYnVmWzJdICA9IHQtPnZvbHVtZTsKQEAgLTI2MCwxOCArMjY1LDE5IEBACiAJYnVmWzddICA9IHQtPnJmOwogCWJ1Zls4XSAgPSB0LT5ycjsKIAlidWZbOV0gID0gdC0+bG91ZDsKLQlpZiAoMTAgIT0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMTApKSB7Ci0JCXY0bF9lcnIoY2xpZW50LCJJL08gZXJyb3IsIHRyeWluZyB0ZGE3NDMyX3NldFxuIik7CisJaWYgKDEwICE9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMTApKSB7CisJCXY0bDJfZXJyKHNkLCAiSS9PIGVycm9yLCB0cnlpbmcgdGRhNzQzMl9zZXRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3RkYTc0MzJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgZG9fdGRhNzQzMl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IHRkYTc0MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl2NGxfZGJnKDIsIGRlYnVnLGNsaWVudCwiSW4gdGRhNzQzMl9pbml0XG4iKTsKKwlzdHJ1Y3QgdGRhNzQzMiAqdCA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgIkluIHRkYTc0MzJfaW5pdFxuIik7CiAKIAl0LT5pbnB1dCAgPSBUREE3NDMyX1NURVJFT19JTiB8ICAvKiBNYWluIChzdGVyZW8pIGlucHV0ICAgKi8KIAkJICAgIFREQTc0MzJfQkFTU19TWU0gIHwgIC8qIFN5bW1ldHJpYyBiYXNzIGN1dCAgICAqLwpAQCAtMjg4LDU3ICsyOTQsMTIgQEAKIAl0LT5yciAgICAgPSBUREE3NDMyX0FUVEVOXzBEQjsJIC8qIDBkQiBhdHRlbnVhdGlvbiAgICAgICAqLwogCXQtPmxvdWQgICA9IGxvdWRuZXNzOwkJIC8qIGluc21vZCBwYXJhbWV0ZXIgICAgICAqLwogCi0JdGRhNzQzMl9zZXQoY2xpZW50KTsKKwl0ZGE3NDMyX3NldChzZCk7CiB9CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqICoKLSAqIGkyYyBpbnRlcmZhY2UgZnVuY3Rpb25zICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBpbnQgdGRhNzQzMl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCitzdGF0aWMgaW50IHRkYTc0MzJfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHRkYTc0MzIgKnQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQotCXQgPSBremFsbG9jKHNpemVvZiAqdCxHRlBfS0VSTkVMKTsKLQlpZiAoIXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2xpZW50ID0gJnQtPmM7Ci0JbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50LT5hZGRyID0gYWRkcjsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0KTsKLQotCWRvX3RkYTc0MzJfaW5pdChjbGllbnQpOwotCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7Ci0KLQl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyIDw8IDEsIGFkYXAtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTc0MzJfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhNzQzMl9hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTc0MzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHRkYTc0MzIgKnQgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlkb190ZGE3NDMyX2luaXQoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCi0Ja2ZyZWUodCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhNzQzMl9nZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHRkYTc0MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdGRhNzQzMiAqdCA9IHRvX3N0YXRlKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zODIsMTAgKzM0Myw5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgdGRhNzQzMl9zZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IHRkYTc0MzJfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHRkYTc0MzIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdGRhNzQzMiAqdCA9IHRvX3N0YXRlKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC00MDAsNyArMzYwLDcgQEAKIAkJaWYgKGxvdWRuZXNzKQkJLyogVHVybiBvbiB0aGUgbG91ZG5lc3MgYml0ICovCiAJCQl0LT52b2x1bWUgfD0gVERBNzQzMl9MRF9PTjsKIAotCQl0ZGE3NDMyX3dyaXRlKGNsaWVudCxUREE3NDMyX1ZMLCB0LT52b2x1bWUpOworCQl0ZGE3NDMyX3dyaXRlKHNkLCBUREE3NDMyX1ZMLCB0LT52b2x1bWUpOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CiAJCWlmIChjdHJsLT52YWx1ZSA8IDMyNzY4KSB7CkBAIC00MjgsMTQgKzM4OCwxNCBAQAogCQlpZih0LT5iYXNzPj0gMHg4KQogCQkJCXQtPmJhc3MgPSAofnQtPmJhc3MgJiAweGYpICsgMHg4IDsKIAotCQl0ZGE3NDMyX3dyaXRlKGNsaWVudCxUREE3NDMyX1ROLCAweDEwIHwgKHQtPmJhc3MgPDwgNCkgfCB0LT50cmVibGUgKTsKKwkJdGRhNzQzMl93cml0ZShzZCwgVERBNzQzMl9UTiwgMHgxMCB8ICh0LT5iYXNzIDw8IDQpIHwgdC0+dHJlYmxlKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CiAJCXQtPnRyZWJsZT0gY3RybC0+dmFsdWUgPj4gMTI7CiAJCWlmKHQtPnRyZWJsZT49IDB4OCkKIAkJCQl0LT50cmVibGUgPSAofnQtPnRyZWJsZSAmIDB4ZikgKyAweDggOwogCi0JCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfVE4sIDB4MTAgfCAodC0+YmFzcyA8PCA0KSB8IHQtPnRyZWJsZSApOworCQl0ZGE3NDMyX3dyaXRlKHNkLCBUREE3NDMyX1ROLCAweDEwIHwgKHQtPmJhc3MgPDwgNCkgfCB0LT50cmVibGUpOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ0NSw5MiArNDA1LDEwMiBAQAogCWlmICh0LT5tdXRlZCkKIAl7CiAJCS8qIE11dGUgJiB1cGRhdGUgYmFsYW5jZSovCi0JCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTEYsIHQtPmxmIHwgVERBNzQzMl9NVVRFKTsKLQkJdGRhNzQzMl93cml0ZShjbGllbnQsVERBNzQzMl9MUiwgdC0+bHIgfCBUREE3NDMyX01VVEUpOwotCQl0ZGE3NDMyX3dyaXRlKGNsaWVudCxUREE3NDMyX1JGLCB0LT5yZiB8IFREQTc0MzJfTVVURSk7Ci0JCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUlIsIHQtPnJyIHwgVERBNzQzMl9NVVRFKTsKKwkJdGRhNzQzMl93cml0ZShzZCwgVERBNzQzMl9MRiwgdC0+bGYgfCBUREE3NDMyX01VVEUpOworCQl0ZGE3NDMyX3dyaXRlKHNkLCBUREE3NDMyX0xSLCB0LT5sciB8IFREQTc0MzJfTVVURSk7CisJCXRkYTc0MzJfd3JpdGUoc2QsIFREQTc0MzJfUkYsIHQtPnJmIHwgVERBNzQzMl9NVVRFKTsKKwkJdGRhNzQzMl93cml0ZShzZCwgVERBNzQzMl9SUiwgdC0+cnIgfCBUREE3NDMyX01VVEUpOwogCX0gZWxzZSB7Ci0JCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfTEYsIHQtPmxmKTsKLQkJdGRhNzQzMl93cml0ZShjbGllbnQsVERBNzQzMl9MUiwgdC0+bHIpOwotCQl0ZGE3NDMyX3dyaXRlKGNsaWVudCxUREE3NDMyX1JGLCB0LT5yZik7Ci0JCXRkYTc0MzJfd3JpdGUoY2xpZW50LFREQTc0MzJfUlIsIHQtPnJyKTsKKwkJdGRhNzQzMl93cml0ZShzZCwgVERBNzQzMl9MRiwgdC0+bGYpOworCQl0ZGE3NDMyX3dyaXRlKHNkLCBUREE3NDMyX0xSLCB0LT5scik7CisJCXRkYTc0MzJfd3JpdGUoc2QsIFREQTc0MzJfUkYsIHQtPnJmKTsKKwkJdGRhNzQzMl93cml0ZShzZCwgVERBNzQzMl9SUiwgdC0+cnIpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGE3NDMyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdGRhNzQzMl9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKLQl2NGxfZGJnKDIsIGRlYnVnLGNsaWVudCwiSW4gdGRhNzQzMl9jb21tYW5kXG4iKTsKLQlpZiAoZGVidWc+MSkKLQkJdjRsX2kyY19wcmludF9pb2N0bChjbGllbnQsY21kKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCi0JLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCi0JICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0KLQkJc3dpdGNoIChxYy0+aWQpIHsKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJc3dpdGNoIChxYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CiAJfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJcmV0dXJuIHRkYTc0MzJfc2V0X2N0cmwoY2xpZW50LCBhcmcpOworCXJldHVybiAtRUlOVkFMOworfQogCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCQlyZXR1cm4gdGRhNzQzMl9nZXRfY3RybChjbGllbnQsIGFyZyk7CitzdGF0aWMgaW50IHRkYTc0MzJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQogCi0JfSAvKiBlbmQgb2YgKGNtZCkgc3dpdGNoICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRkYTc0MzJfY29yZV9vcHMgPSB7CisJLnF1ZXJ5Y3RybCA9IHRkYTc0MzJfcXVlcnljdHJsLAorCS5nX2N0cmwgPSB0ZGE3NDMyX2dfY3RybCwKKwkuc19jdHJsID0gdGRhNzQzMl9zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB0ZGE3NDMyX29wcyA9IHsKKwkuY29yZSA9ICZ0ZGE3NDMyX2NvcmVfb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKiogKgorICogaTJjIGludGVyZmFjZSBmdW5jdGlvbnMgKgorICogKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCB0ZGE3NDMyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHRkYTc0MzIgKnQ7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKworCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCUwMnggKCVzKVxuIiwKKwkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOworCisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlzZCA9ICZ0LT5zZDsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmdGRhNzQzMl9vcHMpOworCWlmIChsb3VkbmVzcyA8IDAgfHwgbG91ZG5lc3MgPiAxNSkgeworCQl2NGwyX3dhcm4oc2QsICJsb3VkbmVzcyBwYXJhbWV0ZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDE1XG4iKTsKKwkJaWYgKGxvdWRuZXNzIDwgMCkKKwkJCWxvdWRuZXNzID0gMDsKKwkJaWYgKGxvdWRuZXNzID4gMTUpCisJCQlsb3VkbmVzcyA9IDE1OworCX0KKworCWRvX3RkYTc0MzJfaW5pdChzZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgICAgPSAidGRhNzQzMiIsCi0JfSwKLQkuaWQgICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTc0MzIsCi0JLmF0dGFjaF9hZGFwdGVyICA9IHRkYTc0MzJfcHJvYmUsCi0JLmRldGFjaF9jbGllbnQgICA9IHRkYTc0MzJfZGV0YWNoLAotCS5jb21tYW5kICAgICAgICAgPSB0ZGE3NDMyX2NvbW1hbmQsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KK3N0YXRpYyBpbnQgdGRhNzQzMl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQkubmFtZSAgICAgICA9ICJ0ZGE3NDMyIiwKLQkuZHJpdmVyICAgICA9ICZkcml2ZXIsCi19OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotc3RhdGljIGludCBfX2luaXQgdGRhNzQzMl9pbml0KHZvaWQpCi17Ci0JaWYgKCAobG91ZG5lc3MgPCAwKSB8fCAobG91ZG5lc3MgPiAxNSkgKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibG91ZG5lc3MgcGFyYW1ldGVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKKwlkb190ZGE3NDMyX2luaXQoc2QpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b19zdGF0ZShzZCkpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGRhNzQzMl9maW5pKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGRhNzQzMl9pZFtdID0geworCXsgInRkYTc0MzIiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRkYTc0MzJfaWQpOwogCi1tb2R1bGVfaW5pdCh0ZGE3NDMyX2luaXQpOwotbW9kdWxlX2V4aXQodGRhNzQzMl9maW5pKTsKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKKwkubmFtZSA9ICJ0ZGE3NDMyIiwKKwkuZHJpdmVyaWQgPSBJMkNfRFJJVkVSSURfVERBNzQzMiwKKwkuY29tbWFuZCA9IHRkYTc0MzJfY29tbWFuZCwKKwkucHJvYmUgPSB0ZGE3NDMyX3Byb2JlLAorCS5yZW1vdmUgPSB0ZGE3NDMyX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB0ZGE3NDMyX2lkLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg0MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmMKaW5kZXggMWMzOTFmMC4uMjY0NGUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAjaW5jbHVkZSAidGRhOTg0MC5oIgogCkBAIC02Miw4NSArNjIsODkgQEAKIC8qIG1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCiBJMkNfQ0xJRU5UX0lOU01PRDsKIAotc3RhdGljIHZvaWQgdGRhOTg0MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3N0YXRpYyB2b2lkIHRkYTk4NDBfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCB2YWwpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCiAJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCkpCi0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImVycm9yIHdyaXRpbmcgJTAyeCB0byAlMDJ4XG4iLAorCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJlcnJvciB3cml0aW5nICUwMnggdG8gJTAyeFxuIiwKIAkJCQl2YWwsIHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgdGRhOTg0MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB0ZGE5ODQwX3NfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCiB7Ci0JaW50IGJ5dGUgPSAqKGludCAqKWFyZzsKKwlpbnQgYnl0ZTsKKworCWlmICh0LT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHQtPmF1ZG1vZGUpIHsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9TVEVSRU86CisJCWJ5dGUgPSBUREE5ODQwX1NFVF9TVEVSRU87CisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxX0xBTkcyOgorCQlieXRlID0gVERBOTg0MF9TRVRfQk9USDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6CisJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnl0ZSA9IFREQTk4NDBfU0VUX01PTk87CisJCWJyZWFrOworCX0KKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJUREE5ODQwX1NXSVRDSDogMHglMDJ4XG4iLCBieXRlKTsKKwl0ZGE5ODQwX3dyaXRlKHNkLCBTV0lUQ0gsIGJ5dGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTk4NDBfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJdTggYnl0ZTsKKworCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZieXRlLCAxKSkgeworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsCisJCQkiaTJjX21hc3Rlcl9yZWN2KCkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGJ5dGUgJiAweDgwKSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKKwkJCSJUREE5ODQwX0RFVEVDVDogcmVnaXN0ZXIgY29udGVudHMgaW52YWxpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlREQTk4NDBfREVURUNUOiBieXRlOiAweCUwMnhcbiIsIGJ5dGUpOworCisJc3dpdGNoIChieXRlICYgMHg2MCkgeworCWNhc2UgMHgwMDoKKwkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7CisJCWJyZWFrOworCWNhc2UgMHg0MDoKKwkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTyB8IFY0TDJfVFVORVJfU1VCX01PTk87CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIEluY29ycmVjdCBkZXRlY3QgKi8KKwkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhOTg0MF9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgYnl0ZTsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfU19UVU5FUjogewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKLQkJaW50IGJ5dGU7Ci0KLQkJaWYgKHQtPmluZGV4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJc3dpdGNoICh0LT5hdWRtb2RlKSB7Ci0JCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKLQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9TVEVSRU87Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzI6Ci0JCQlieXRlID0gVERBOTg0MF9TRVRfQk9USDsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKLQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKLQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnl0ZSA9IFREQTk4NDBfU0VUX01PTk87Ci0JCQlicmVhazsKLQkJfQotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUREE5ODQwX1NXSVRDSDogMHglMDJ4XG4iLCBieXRlKTsKLQkJdGRhOTg0MF93cml0ZShjbGllbnQsIFNXSVRDSCwgYnl0ZSk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0dfVFVORVI6IHsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7Ci0JCXU4IGJ5dGU7Ci0KLQkJdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87Ci0JCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZieXRlLCAxKSkgewotCQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LAotCQkJCSJpMmNfbWFzdGVyX3JlY3YoKSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlpZiAoYnl0ZSAmIDB4ODApIHsKLQkJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwKLQkJCQkiVERBOTg0MF9ERVRFQ1Q6IHJlZ2lzdGVyIGNvbnRlbnRzIGludmFsaWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUREE5ODQwX0RFVEVDVDogYnl0ZTogMHglMDJ4XG4iLCBieXRlKTsKLQotCQlzd2l0Y2ggKGJ5dGUgJiAweDYwKSB7Ci0JCWNhc2UgMHgwMDoKLQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgyMDoKLQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg0MDoKLQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gfCBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8qIEluY29ycmVjdCBkZXRlY3QgKi8KLQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQogCWNhc2UgVERBOTg0MF9MRVZFTF9BREpVU1Q6Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlREQTk4NDBfTEVWRUxfQURKVVNUOiAlZFxuIiwgYnl0ZSk7CisJCWJ5dGUgPSAqKGludCAqKWFyZzsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiVERBOTg0MF9MRVZFTF9BREpVU1Q6ICVkXG4iLCBieXRlKTsKIAogCQkvKiBjaGVjayBmb3IgY29ycmVjdCByYW5nZSAqLwogCQlpZiAoYnl0ZSA+IDI1IHx8IGJ5dGUgPCAtMjApCkBAIC0xNTIsMTEgKzE1NiwxMiBAQAogCQkJYnl0ZSArPSAweDg7CiAJCWVsc2UKIAkJCWJ5dGUgPSAtYnl0ZTsKLQkJdGRhOTg0MF93cml0ZShjbGllbnQsIExFVkVMX0FESlVTVCwgYnl0ZSk7CisJCXRkYTk4NDBfd3JpdGUoc2QsIExFVkVMX0FESlVTVCwgYnl0ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBUREE5ODQwX1NURVJFT19BREpVU1Q6Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlREQTk4NDBfU1RFUkVPX0FESlVTVDogJWRcbiIsIGJ5dGUpOworCQlieXRlID0gKihpbnQgKilhcmc7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlREQTk4NDBfU1RFUkVPX0FESlVTVDogJWRcbiIsIGJ5dGUpOwogCiAJCS8qIGNoZWNrIGZvciBjb3JyZWN0IHJhbmdlICovCiAJCWlmIChieXRlID4gMjUgfHwgYnl0ZSA8IC0yNCkKQEAgLTE2OSwxOCArMTc0LDQxIEBACiAJCWVsc2UKIAkJCWJ5dGUgPSAtYnl0ZTsKIAotCQl0ZGE5ODQwX3dyaXRlKGNsaWVudCwgU1RFUkVPX0FESlVTVCwgYnl0ZSk7CisJCXRkYTk4NDBfd3JpdGUoc2QsIFNURVJFT19BREpVU1QsIGJ5dGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KLQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHRkYTk4NDBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRkYTk4NDBfY29yZV9vcHMgPSB7CisJLmlvY3RsID0gdGRhOTg0MF9pb2N0bCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdHVuZXJfb3BzIHRkYTk4NDBfdHVuZXJfb3BzID0geworCS5zX3R1bmVyID0gdGRhOTg0MF9zX3R1bmVyLAorCS5nX3R1bmVyID0gdGRhOTg0MF9nX3R1bmVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdGRhOTg0MF9vcHMgPSB7CisJLmNvcmUgPSAmdGRhOTg0MF9jb3JlX29wcywKKwkudHVuZXIgPSAmdGRhOTg0MF90dW5lcl9vcHMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgaW50IHRkYTk4NDBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJaW50IHJlc3VsdDsKIAlpbnQgYnl0ZTsKIApAQCAtMTg4LDIzICsyMTYsMzggQEAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKIAkJCUkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBIHwKIAkJCUkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTzsKIAogCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCiAJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKIAorCXNkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ0ZGE5ODQwX29wcyk7CisKIAkvKiBzZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIGxldmVsICYgc3RlcmVvIC0gYWRqdXN0bWVudCwgbW9kZSAqLwogCWJ5dGUgPSAwOwotCXJlc3VsdCA9IHRkYTk4NDBfY29tbWFuZChjbGllbnQsIFREQTk4NDBfTEVWRUxfQURKVVNULCAmYnl0ZSk7Ci0JcmVzdWx0ICs9IHRkYTk4NDBfY29tbWFuZChjbGllbnQsIFREQTk4NDBfU1RFUkVPX0FESlVTVCwgJmJ5dGUpOwotCXRkYTk4NDBfd3JpdGUoY2xpZW50LCBTV0lUQ0gsIFREQTk4NDBfU0VUX1NURVJFTyk7CisJcmVzdWx0ID0gdGRhOTg0MF9pb2N0bChzZCwgVERBOTg0MF9MRVZFTF9BREpVU1QsICZieXRlKTsKKwlyZXN1bHQgfD0gdGRhOTg0MF9pb2N0bChzZCwgVERBOTg0MF9TVEVSRU9fQURKVVNULCAmYnl0ZSk7CisJdGRhOTg0MF93cml0ZShzZCwgU1dJVENILCBUREE5ODQwX1NFVF9TVEVSRU8pOwogCWlmIChyZXN1bHQpIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiY291bGQgbm90IGluaXRpYWxpemUgdGRhOTg0MFxuIik7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNvdWxkIG5vdCBpbml0aWFsaXplIHRkYTk4NDBcbiIpOworCQlrZnJlZShzZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZGE5ODQwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZShzZCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdGRhOTg0MF9sZWdhY3lfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCS8qIExldCdzIHNlZSB3aGV0aGVyIHRoaXMgaXMgYSBrbm93biBhZGFwdGVyIHdlIGNhbiBhdHRhY2ggdG8uCkBAIC0yMjIsNiArMjY1LDcgQEAKIAkuZHJpdmVyaWQgPSBJMkNfRFJJVkVSSURfVERBOTg0MCwKIAkuY29tbWFuZCA9IHRkYTk4NDBfY29tbWFuZCwKIAkucHJvYmUgPSB0ZGE5ODQwX3Byb2JlLAorCS5yZW1vdmUgPSB0ZGE5ODQwX3JlbW92ZSwKIAkubGVnYWN5X3Byb2JlID0gdGRhOTg0MF9sZWdhY3lfcHJvYmUsCiAJLmlkX3RhYmxlID0gdGRhOTg0MF9pZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDc5MmYwYjAuLjU2ZjBjMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0yNSwxMSArMjUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvaTJjLWFkZHIuaD4KIAogc3RhdGljIGludCBkZWJ1ZzsgLyogaW5zbW9kIHBhcmFtZXRlciAqLwpAQCAtNDYsMTMgKzQ1LDE1IEBACiAKIC8qIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgVERBOTg3NSAqLwogc3RydWN0IHRkYTk4NzUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKIAlpbnQgcnZvbCwgbHZvbDsKIAlpbnQgYmFzcywgdHJlYmxlOwotCXN0cnVjdCBpMmNfY2xpZW50IGM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRkYTk4NzUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHRkYTk4NzUsIHNkKTsKK30KIAogI2RlZmluZSBkcHJpbnRrICBpZiAoZGVidWcpIHByaW50awogCkBAIC0xMDUsMTUgKzEwNiwxNiBAQAogCiAvKiBCZWdpbiBjb2RlICovCiAKLXN0YXRpYyBpbnQgdGRhOTg3NV93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgc3ViYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCitzdGF0aWMgaW50IHRkYTk4NzVfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IHN1YmFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKLQlkcHJpbnRrKCJJbiB0ZGE5ODc1X3dyaXRlXG4iKTsKLQlkcHJpbnRrKCJXcml0aW5nICVkIDB4JXhcbiIsIHN1YmFkZHIsIHZhbCk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJXcml0aW5nICVkIDB4JXhcbiIsIHN1YmFkZHIsIHZhbCk7CiAJYnVmZmVyWzBdID0gc3ViYWRkcjsKIAlidWZmZXJbMV0gPSB2YWw7Ci0JaWYgKDIgIT0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWZmZXIsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhOTg3NTogSS9PIGVycm9yLCB0cnlpbmcgKHdyaXRlICVkIDB4JXgpXG4iLAorCWlmICgyICE9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgMikpIHsKKwkJdjRsMl93YXJuKHNkLCAiSS9PIGVycm9yLCB0cnlpbmcgKHdyaXRlICVkIDB4JXgpXG4iLAogCQkgICAgICAgc3ViYWRkciwgdmFsKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTEyMSw3ICsxMjMsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgaTJjX3JlYWRfcmVnaXN0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IHJlZykKK3N0YXRpYyBpbnQgaTJjX3JlYWRfcmVnaXN0ZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHIsIGludCByZWcpCiB7CiAJdW5zaWduZWQgY2hhciB3cml0ZVsxXTsKIAl1bnNpZ25lZCBjaGFyIHJlYWRbMV07CkBAIC0xMjksMTUwICsxMzEsODMgQEAKIAkJeyBhZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKIAkJeyBhZGRyLCBJMkNfTV9SRCwgMSwgcmVhZCAgfQogCX07CisKIAl3cml0ZVswXSA9IHJlZzsKIAotCWlmICgyICE9IGkyY190cmFuc2ZlcihhZGFwLG1zZ3MsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGRhOTg3NTogSS9PIGVycm9yIChyZWFkMilcbiIpOworCWlmICgyICE9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpKSB7CisJCXY0bF93YXJuKGNsaWVudCwgIkkvTyBlcnJvciAocmVhZDIpXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlkcHJpbnRrKCJ0ZGE5ODc1OiBjaGlwX3JlYWQyOiByZWclZD0weCV4XG4iLHJlZyxyZWFkWzBdKTsKKwl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJjaGlwX3JlYWQyOiByZWclZD0weCV4XG4iLCByZWcsIHJlYWRbMF0pOwogCXJldHVybiByZWFkWzBdOwogfQogCi1zdGF0aWMgdm9pZCB0ZGE5ODc1X3NldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgdGRhOTg3NV9zZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKLQlzdHJ1Y3QgdGRhOTg3NSAqdGRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHRkYTk4NzUgKnRkYSA9IHRvX3N0YXRlKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGE7CiAKLQlkcHJpbnRrKEtFUk5fREVCVUcgInRkYTk4NzVfc2V0KCUwNHgsJTA0eCwlMDR4LCUwNHgpXG4iLAotCQl0ZGEtPmx2b2wsdGRhLT5ydm9sLHRkYS0+YmFzcyx0ZGEtPnRyZWJsZSk7Ci0KKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODc1X3NldCglMDR4LCUwNHgsJTA0eCwlMDR4KVxuIiwKKwkJdGRhLT5sdm9sLCB0ZGEtPnJ2b2wsIHRkYS0+YmFzcywgdGRhLT50cmVibGUpOwogCiAJYSA9IHRkYS0+bHZvbCAmIDB4ZmY7Ci0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVZMLCBhKTsKKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X01WTCwgYSk7CiAJYSA9dGRhLT5ydm9sICYgMHhmZjsKLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVlIsIGEpOworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfTVZSLCBhKTsKIAlhID10ZGEtPmJhc3MgJiAweGZmOwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X01CQSwgYSk7CisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9NQkEsIGEpOwogCWEgPXRkYS0+dHJlYmxlICAmIDB4ZmY7Ci0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVRSLCBhKTsKKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X01UUiwgYSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3RkYTk4NzVfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHZvaWQgZG9fdGRhOTg3NV9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IHRkYTk4NzUgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlkcHJpbnRrKCJJbiB0ZGE5ODc1X2luaXRcbiIpOwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0NGRywgMHhkMCApOyAvKnJlZyBkZSBjb25maWcgMCAocmVzZXQpKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NU1IsIDB4MDMgKTsgICAgLyogTW9uaXRvciAwYjAwMDAwWFhYKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMU1TQiwgMHgwMCApOyAgLypDYXIxKEZNKSBNU0IgWE1IeiovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzFNSUIsIDB4MDAgKTsgIC8qQ2FyMShGTSkgTUlCIFhNSHoqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MxTFNCLCAweDAwICk7ICAvKkNhcjEoRk0pIExTQiBYTUh6Ki8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMk1TQiwgMHgwMCApOyAgLypDYXIyKE5JQ0FNKSBNU0IgWE1IeiovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzJNSUIsIDB4MDAgKTsgIC8qQ2FyMihOSUNBTSkgTUlCIFhNSHoqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MyTFNCLCAweDAwICk7ICAvKkNhcjIoTklDQU0pIExTQiBYTUh6Ki8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9EQ1IsIDB4MDAgKTsgICAgLypEZW1vZCBjb25maWcgMHgwMCovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfREVFTSwgMHg0NCApOyAgIC8qREUtRW1waCAwYjAxMDAgMDEwMCovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfRk1BVCwgMHgwMCApOyAgIC8qRk0gTWF0cml4IHJlZyAweDAwKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9TQzEsIDB4MDAgKTsgICAgLyogU0NBUlQgMSAoU0MxKSovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfU0MyLCAweDAxICk7ICAgIC8qIFNDQVJUIDIgKHNjMikqLworCXN0cnVjdCB0ZGE5ODc1ICp0ID0gdG9fc3RhdGUoc2QpOwogCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQ0gxViwgMHgxMCApOyAgLyogQ2hhbm5lbCB2b2x1bWUgMSBtdXRlKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DSDJWLCAweDEwICk7ICAvKiBDaGFubmVsIHZvbHVtZSAyIG11dGUgKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9EQUNPUywgMHgwMiApOyAvKiBzaWcgREFDIGkvbyhpbjpuaWNhbSkqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FEQ0lTLCAweDZmICk7IC8qIHNpZyBBREMgaW5wdXQoaW46bW9ubykqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0xPU1IsIDB4MDAgKTsgIC8qIGxpbmUgb3V0IChpbjptb25vKSovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQUVSLCAweDAwICk7ICAgLyowNiBFZmZlY3QgKEFWTCtQU0VVRE8pICovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTUNTLCAweDQ0ICk7ICAgLyogTWFpbiBjaCBzZWxlY3QgKERBQykgKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVkwsIDB4MDMgKTsgICAvKiBWb2wgTWFpbiBsZWZ0IDEwZEIgKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NVlIsIDB4MDMgKTsgICAvKiBWb2wgTWFpbiByaWdodCAxMGRCKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9NQkEsIDB4MDAgKTsgICAvKiBNYWluIEJhc3MgTWFpbiAwZEIqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X01UUiwgMHgwMCApOyAgIC8qIE1haW4gVHJlYmxlIE1haW4gMGRCKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9BQ1MsIDB4NDQgKTsgICAvKiBBdXggY2hhbiBzZWxlY3QgKGRhYykqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FWTCwgMHgwMCApOyAgIC8qIFZvbCBBdXggbGVmdCAwZEIqLwotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0FWUiwgMHgwMCApOyAgIC8qIFZvbCBBdXggcmlnaHQgMGRCKi8KLQl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9BQkEsIDB4MDAgKTsgICAvKiBBdXggQmFzcyBNYWluIDBkQiovCi0JdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQVRSLCAweDAwICk7ICAgLyogQXV4IEFpZ3VzIE1haW4gMGRCKi8KKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJJbiB0ZGE5ODc1X2luaXRcbiIpOworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfQ0ZHLCAweGQwKTsgLypyZWcgZGUgY29uZmlnIDAgKHJlc2V0KSovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9NU1IsIDB4MDMpOyAgICAvKiBNb25pdG9yIDBiMDAwMDBYWFgqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfQzFNU0IsIDB4MDApOyAgLypDYXIxKEZNKSBNU0IgWE1IeiovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9DMU1JQiwgMHgwMCk7ICAvKkNhcjEoRk0pIE1JQiBYTUh6Ki8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X0MxTFNCLCAweDAwKTsgIC8qQ2FyMShGTSkgTFNCIFhNSHoqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfQzJNU0IsIDB4MDApOyAgLypDYXIyKE5JQ0FNKSBNU0IgWE1IeiovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9DMk1JQiwgMHgwMCk7ICAvKkNhcjIoTklDQU0pIE1JQiBYTUh6Ki8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X0MyTFNCLCAweDAwKTsgIC8qQ2FyMihOSUNBTSkgTFNCIFhNSHoqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfRENSLCAweDAwKTsgICAgLypEZW1vZCBjb25maWcgMHgwMCovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9ERUVNLCAweDQ0KTsgICAvKkRFLUVtcGggMGIwMTAwIDAxMDAqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfRk1BVCwgMHgwMCk7ICAgLypGTSBNYXRyaXggcmVnIDB4MDAqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfU0MxLCAweDAwKTsgICAgLyogU0NBUlQgMSAoU0MxKSovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9TQzIsIDB4MDEpOyAgICAvKiBTQ0FSVCAyIChzYzIpKi8KIAotCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X01VVCwgMHhjYyApOyAgIC8qIEdlbmVyYWwgbXV0ZSAgKi8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X0NIMVYsIDB4MTApOyAgLyogQ2hhbm5lbCB2b2x1bWUgMSBtdXRlKi8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X0NIMlYsIDB4MTApOyAgLyogQ2hhbm5lbCB2b2x1bWUgMiBtdXRlICovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9EQUNPUywgMHgwMik7IC8qIHNpZyBEQUMgaS9vKGluOm5pY2FtKSovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9BRENJUywgMHg2Zik7IC8qIHNpZyBBREMgaW5wdXQoaW46bW9ubykqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfTE9TUiwgMHgwMCk7ICAvKiBsaW5lIG91dCAoaW46bW9ubykqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfQUVSLCAweDAwKTsgICAvKjA2IEVmZmVjdCAoQVZMK1BTRVVETykgKi8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X01DUywgMHg0NCk7ICAgLyogTWFpbiBjaCBzZWxlY3QgKERBQykgKi8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X01WTCwgMHgwMyk7ICAgLyogVm9sIE1haW4gbGVmdCAxMGRCICovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9NVlIsIDB4MDMpOyAgIC8qIFZvbCBNYWluIHJpZ2h0IDEwZEIqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfTUJBLCAweDAwKTsgICAvKiBNYWluIEJhc3MgTWFpbiAwZEIqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfTVRSLCAweDAwKTsgICAvKiBNYWluIFRyZWJsZSBNYWluIDBkQiovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9BQ1MsIDB4NDQpOyAgIC8qIEF1eCBjaGFuIHNlbGVjdCAoZGFjKSovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9BVkwsIDB4MDApOyAgIC8qIFZvbCBBdXggbGVmdCAwZEIqLworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfQVZSLCAweDAwKTsgICAvKiBWb2wgQXV4IHJpZ2h0IDBkQiovCisJdGRhOTg3NV93cml0ZShzZCwgVERBOTg3NV9BQkEsIDB4MDApOyAgIC8qIEF1eCBCYXNzIE1haW4gMGRCKi8KKwl0ZGE5ODc1X3dyaXRlKHNkLCBUREE5ODc1X0FUUiwgMHgwMCk7ICAgLyogQXV4IEFpZ3VzIE1haW4gMGRCKi8KIAotCXQtPmx2b2w9dC0+cnZvbCA9MDsgIAkvKiAwZEIgKi8KLQl0LT5iYXNzPTA7IAkJCS8qIDBkQiAqLwotCXQtPnRyZWJsZT0wOyAgCQkvKiAwZEIgKi8KLQl0ZGE5ODc1X3NldChjbGllbnQpOworCXRkYTk4NzVfd3JpdGUoc2QsIFREQTk4NzVfTVVULCAweGNjKTsgICAvKiBHZW5lcmFsIG11dGUgICovCiAKKwl0LT5sdm9sID0gdC0+cnZvbCA9IDA7ICAJLyogMGRCICovCisJdC0+YmFzcyA9IDA7IAkJCS8qIDBkQiAqLworCXQtPnRyZWJsZSA9IDA7ICAJCS8qIDBkQiAqLworCXRkYTk4NzVfc2V0KHNkKTsKIH0KIAogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKiAqCi0gKiBpMmMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1zdGF0aWMgaW50IHRkYTk4NzVfY2hlY2tpdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyKQorc3RhdGljIGludCB0ZGE5ODc1X2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCWludCBkaWMscmV2OwotCi0JZGljPWkyY19yZWFkX3JlZ2lzdGVyKGFkYXAsYWRkciwyNTQpOwotCXJldj1pMmNfcmVhZF9yZWdpc3RlcihhZGFwLGFkZHIsMjU1KTsKLQotCWlmKGRpYz09MCB8fCBkaWM9PTIpIHsgLy8gdGRhOTg3NSBhbmQgdGRhOTg3NUEKLQkJcHJpbnRrKCJ0ZGE5ODc1OiBUREE5ODc1JXMgUmV2LiVkIGRldGVjdGVkIGF0IDB4JXhcbiIsCi0JCWRpYz09MD8iIjoiQSIsIHJldixhZGRyPDwxKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXByaW50aygidGRhOTg3NTogbm8gc3VjaCBjaGlwIGF0IDB4JXggKGRpYz0weCV4IHJldj0weCV4KVxuIixhZGRyPDwxLGRpYyxyZXYpOwotCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCB0ZGE5ODc1X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKLXsKLQlzdHJ1Y3QgdGRhOTg3NSAqdDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCWRwcmludGsoIkluIHRkYTk4NzVfYXR0YWNoXG4iKTsKLQotCXQgPSBremFsbG9jKHNpemVvZiAqdCxHRlBfS0VSTkVMKTsKLQlpZiAoIXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2xpZW50ID0gJnQtPmM7Ci0JbWVtY3B5KGNsaWVudCwmY2xpZW50X3RlbXBsYXRlLHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50LT5hZGRyID0gYWRkcjsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0KTsKLQotCWlmKCF0ZGE5ODc1X2NoZWNraXQoYWRhcCxhZGRyKSkgewotCQlrZnJlZSh0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JZG9fdGRhOTg3NV9pbml0KGNsaWVudCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidGRhOTg3NTogaW5pdFxuIik7Ci0KLQlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTk4NzVfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdGRhOTg3NV9hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTk4NzVfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHRkYTk4NzUgKnQgID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlkb190ZGE5ODc1X2luaXQoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCi0Ja2ZyZWUodCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhOTg3NV9nZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHRkYTk4NzUgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdGRhOTg3NSAqdCA9IHRvX3N0YXRlKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKQEAgLTMwNCwxMCArMjM5LDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCB0ZGE5ODc1X3NldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgdGRhOTg3NV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdGRhOTg3NSAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB0ZGE5ODc1ICp0ID0gdG9fc3RhdGUoc2QpOwogCWludCBjaHZvbD0wLCB2b2x1bWUsIGJhbGFuY2UsIGxlZnQsIHJpZ2h0OwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtMzcxLDg1ICszMDUsMTA1IEBACiAJCQl0LT5ydm9sID0gLTg0ICYgMHhmZjsKIAl9CiAKLS8vcHJpbnRrKCJ0ZGE5ODc1IGJhbDolMDR4IHZvbDolMDR4IGJhc3M6JTA0eCB0cmVibGU6JTA0eFxuIix2YS0+YmFsYW5jZSx2YS0+dm9sdW1lLHZhLT5iYXNzLHZhLT50cmVibGUpOwotCi0JdGRhOTg3NV9zZXQoY2xpZW50KTsKLQorCXRkYTk4NzVfc2V0KHNkKTsKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHRkYTk4NzVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdGRhOTg3NV9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKLQlkcHJpbnRrKCJJbiB0ZGE5ODc1X2NvbW1hbmQuLi5cbiIpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KLQkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKLQkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCi0JY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQotCQlzd2l0Y2ggKHFjLT5pZCkgewotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6Ci0JCQljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwlzd2l0Y2ggKHFjLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CiAJfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJcmV0dXJuIHRkYTk4NzVfc2V0X2N0cmwoY2xpZW50LCBhcmcpOworCXJldHVybiAtRUlOVkFMOworfQogCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCQlyZXR1cm4gdGRhOTg3NV9nZXRfY3RybChjbGllbnQsIGFyZyk7CitzdGF0aWMgaW50IHRkYTk4NzVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQogCi0JZGVmYXVsdDogLyogTm90IFZJREVPQ0dBVURJTyBvciBWSURFT0NTQVVESU8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQkJLyogbm90aGluZyAqLwotCQlkcHJpbnRrKCJEZWZhdWx0XG4iKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdGRhOTg3NV9jb3JlX29wcyA9IHsKKwkucXVlcnljdHJsID0gdGRhOTg3NV9xdWVyeWN0cmwsCisJLmdfY3RybCA9IHRkYTk4NzVfZ19jdHJsLAorCS5zX2N0cmwgPSB0ZGE5ODc1X3NfY3RybCwKK307CiAKLQl9IC8qIGVuZCBvZiAoY21kKSBzd2l0Y2ggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHRkYTk4NzVfb3BzID0geworCS5jb3JlID0gJnRkYTk4NzVfY29yZV9vcHMsCit9OwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqICoKKyAqIGkyYyBpbnRlcmZhY2UgZnVuY3Rpb25zICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgdGRhOTg3NV9jaGVja2l0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBhZGRyKQoreworCWludCBkaWMsIHJldjsKKworCWRpYyA9IGkyY19yZWFkX3JlZ2lzdGVyKGNsaWVudCwgYWRkciwgMjU0KTsKKwlyZXYgPSBpMmNfcmVhZF9yZWdpc3RlcihjbGllbnQsIGFkZHIsIDI1NSk7CisKKwlpZiAoZGljID09IDAgfHwgZGljID09IDIpIHsgLyogdGRhOTg3NSBhbmQgdGRhOTg3NUEgKi8KKwkJdjRsX2luZm8oY2xpZW50LCAidGRhOTg3NSVzIHJldi4gJWQgZGV0ZWN0ZWQgYXQgMHglMDJ4XG4iLAorCQkJZGljID09IDAgPyAiIiA6ICJBIiwgcmV2LCBhZGRyIDw8IDEpOworCQlyZXR1cm4gMTsKKwl9CisJdjRsX2luZm8oY2xpZW50LCAibm8gc3VjaCBjaGlwIGF0IDB4JTAyeCAoZGljPTB4JXggcmV2PTB4JXgpXG4iLAorCQkJYWRkciA8PCAxLCBkaWMsIHJldik7CiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSAgID0gInRkYTk4NzUiLAotCX0sCi0JLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4NzUsCi0JLmF0dGFjaF9hZGFwdGVyID0gdGRhOTg3NV9wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCAgPSB0ZGE5ODc1X2RldGFjaCwKLQkuY29tbWFuZCAgICAgICAgPSB0ZGE5ODc1X2NvbW1hbmQsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0KK3N0YXRpYyBpbnQgdGRhOTg3NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCS5uYW1lICAgICAgPSAidGRhOTg3NSIsCi0JLmRyaXZlciAgICA9ICZkcml2ZXIsCi19OworCXN0cnVjdCB0ZGE5ODc1ICp0OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKLXN0YXRpYyBpbnQgX19pbml0IHRkYTk4NzVfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKKwl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHglMDJ4ICglcylcbiIsCisJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKworCWlmICghdGRhOTg3NV9jaGVja2l0KGNsaWVudCwgY2xpZW50LT5hZGRyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXQpCisJCXJldHVybiAtRU5PTUVNOworCXNkID0gJnQtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ0ZGE5ODc1X29wcyk7CisKKwlkb190ZGE5ODc1X2luaXQoc2QpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGRhOTg3NV9maW5pKHZvaWQpCitzdGF0aWMgaW50IHRkYTk4NzVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG9fdGRhOTg3NV9pbml0KHNkKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKKwlyZXR1cm4gMDsKIH0KIAotbW9kdWxlX2luaXQodGRhOTg3NV9pbml0KTsKLW1vZHVsZV9leGl0KHRkYTk4NzVfZmluaSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGRhOTg3NV9pZFtdID0geworCXsgInRkYTk4NzUiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRkYTk4NzVfaWQpOwogCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwotCitzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CisJLm5hbWUgPSAidGRhOTg3NSIsCisJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1REQTk4NzUsCisJLmNvbW1hbmQgPSB0ZGE5ODc1X2NvbW1hbmQsCisJLnByb2JlID0gdGRhOTg3NV9wcm9iZSwKKwkucmVtb3ZlID0gdGRhOTg3NV9yZW1vdmUsCisJLmlkX3RhYmxlID0gdGRhOTg3NV9pZCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMKaW5kZXggY2RlMDkyYS4uMzFkZGU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQxNWMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KICNpbmNsdWRlICJ0ZWE2NDE1Yy5oIgogCkBAIC0xMjIsMzEgKzEyMiw1NyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgdGVhNjQxNWNfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJaWYgKGNtZCA9PSBURUE2NDE1Q19TV0lUQ0gpIHsKKwkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCQlzdHJ1Y3QgdGVhNjQxNWNfbXVsdGlwbGV4ICp2ID0gKHN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggKilhcmc7CisKKwkJcmV0dXJuIHN3aXRjaF9tYXRyaXgoY2xpZW50LCB2LT5pbiwgdi0+b3V0KTsKKwl9CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKwogc3RhdGljIGludCB0ZWE2NDE1Y19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggKnYgPSAoc3RydWN0IHRlYTY0MTVjX211bHRpcGxleCAqKWFyZzsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBURUE2NDE1Q19TV0lUQ0g6Ci0JCXJlc3VsdCA9IHN3aXRjaF9tYXRyaXgoY2xpZW50LCB2LT5pbiwgdi0+b3V0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRlYTY0MTVjX2NvcmVfb3BzID0geworCS5pb2N0bCA9IHRlYTY0MTVjX2lvY3RsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdGVhNjQxNWNfb3BzID0geworCS5jb3JlID0gJnRlYTY0MTVjX2NvcmVfb3BzLAorfTsKKwogLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCiBzdGF0aWMgaW50IHRlYTY0MTVjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCiAJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGNhbiBzdXBwb3J0IHdoYXQgd2UgbmVlZCAqLwogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKSkKIAkJcmV0dXJuIDA7CiAKIAl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJc2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJnRlYTY0MTVjX29wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVhNjQxNWNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY4LDYgKzE5NCw3IEBACiAJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1RFQTY0MTVDLAogCS5jb21tYW5kID0gdGVhNjQxNWNfY29tbWFuZCwKIAkucHJvYmUgPSB0ZWE2NDE1Y19wcm9iZSwKKwkucmVtb3ZlID0gdGVhNjQxNWNfcmVtb3ZlLAogCS5sZWdhY3lfcHJvYmUgPSB0ZWE2NDE1Y19sZWdhY3lfcHJvYmUsCiAJLmlkX3RhYmxlID0gdGVhNjQxNWNfaWQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwppbmRleCBlNTA4MjA5Li4zOGU1MTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KICNpbmNsdWRlICJ0ZWE2NDIwLmgiCiAKQEAgLTkwLDI2ICs5MCwzNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHRlYTY0MjBfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJaWYgKGNtZCA9PSBURUE2NDIwX1NXSVRDSCkgeworCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJCXN0cnVjdCB0ZWE2NDIwX211bHRpcGxleCAqYSA9IChzdHJ1Y3QgdGVhNjQyMF9tdWx0aXBsZXggKilhcmc7CisKKwkJcmV0dXJuIHRlYTY0MjBfc3dpdGNoKGNsaWVudCwgYS0+aW4sIGEtPm91dCwgYS0+Z2Fpbik7CisJfQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKIHN0YXRpYyBpbnQgdGVhNjQyMF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCB0ZWE2NDIwX211bHRpcGxleCAqYSA9IChzdHJ1Y3QgdGVhNjQyMF9tdWx0aXBsZXggKilhcmc7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVEVBNjQyMF9TV0lUQ0g6Ci0JCXJlc3VsdCA9IHRlYTY0MjBfc3dpdGNoKGNsaWVudCwgYS0+aW4sIGEtPm91dCwgYS0+Z2Fpbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRlYTY0MjBfY29yZV9vcHMgPSB7CisJLmlvY3RsID0gdGVhNjQyMF9pb2N0bCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHRlYTY0MjBfb3BzID0geworCS5jb3JlID0gJnRlYTY0MjBfY29yZV9vcHMsCit9OworCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KIHN0YXRpYyBpbnQgdGVhNjQyMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlpbnQgZXJyLCBpOwogCiAJLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBhZGFwdGVyIGNhbiBzdXBwb3J0IHdoYXQgd2UgbmVlZCAqLwpAQCAtMTI2LDkgKzEzNywyMiBAQAogCX0KIAlpZiAoZXJyKSB7CiAJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImNvdWxkIG5vdCBpbml0aWFsaXplIHRlYTY0MjBcbiIpOwotCQlrZnJlZShjbGllbnQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisKKwlzZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX3N1YmRldiksIEdGUF9LRVJORUwpOworCWlmIChzZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmdGVhNjQyMF9vcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlYTY0MjBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUwLDYgKzE3NCw3IEBACiAJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1RFQTY0MjAsCiAJLmNvbW1hbmQgPSB0ZWE2NDIwX2NvbW1hbmQsCiAJLnByb2JlID0gdGVhNjQyMF9wcm9iZSwKKwkucmVtb3ZlID0gdGVhNjQyMF9yZW1vdmUsCiAJLmxlZ2FjeV9wcm9iZSA9IHRlYTY0MjBfbGVnYWN5X3Byb2JlLAogCS5pZF90YWJsZSA9IHRlYTY0MjBfaWQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGx2MzIwYWljMjNiLmMKaW5kZXggMjgxMDY1Yi4uNWM5NWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsdjMyMGFpYzIzYi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ0bHYzMjBhaWMyM2IgZHJpdmVyIik7CkBAIC00NCwxNSArNDQsMjIgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKIAl1OCBtdXRlZDsKIH07CiAKLXN0YXRpYyBpbnQgdGx2MzIwYWljMjNiX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHRsdjMyMGFpYzIzYl9zdGF0ZSwgc2QpOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlpbnQgaTsKIAogCWlmICgocmVnIDwgMCB8fCByZWcgPiA5KSAmJiAocmVnICE9IDE1KSkgewotCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQl2NGwyX2VycihzZCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC02MCw2MSArNjcsODIgQEAKIAkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAogCQkJCShyZWcgPDwgMSkgfCAodmFsID4+IDgpLCB2YWwgJiAweGZmKSA9PSAwKQogCQkJcmV0dXJuIDA7Ci0JdjRsX2VycihjbGllbnQsICJJMkM6IGNhbm5vdCB3cml0ZSAlMDN4IHRvIHJlZ2lzdGVyIFIlZFxuIiwgdmFsLCByZWcpOworCXY0bDJfZXJyKHNkLCAiSTJDOiBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJWRcbiIsIHZhbCwgcmVnKTsKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgdGx2MzIwYWljMjNiX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl9zX2Nsb2NrX2ZyZXEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGZyZXEpCiB7Ci0Jc3RydWN0IHRsdjMyMGFpYzIzYl9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCXUzMiAqZnJlcSA9IGFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6Ci0JCXN3aXRjaCAoKmZyZXEpIHsKLQkJY2FzZSAzMjAwMDogLyogc2V0IHNhbXBsZSByYXRlIHRvIDMyIGtIeiAqLwotCQkJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgOCwgMHgwMTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDQxMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0NC4xIGtIeiAqLwotCQkJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgOCwgMHgwMjIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDgwMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0OCBrSHogKi8KLQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDMyMDAwOiAvKiBzZXQgc2FtcGxlIHJhdGUgdG8gMzIga0h6ICovCisJCXRsdjMyMGFpYzIzYl93cml0ZShzZCwgOCwgMHgwMTgpOwogCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+bXV0ZWQ7CisJY2FzZSA0NDEwMDogLyogc2V0IHNhbXBsZSByYXRlIHRvIDQ0LjEga0h6ICovCisJCXRsdjMyMGFpYzIzYl93cml0ZShzZCwgOCwgMHgwMjIpOwogCQlicmVhazsKLQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUtPm11dGVkID0gY3RybC0+dmFsdWU7Ci0JCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDAsIDB4MTgwKTsgLyogbXV0ZSBib3RoIGNoYW5uZWxzICovCi0JCS8qIHNldCBnYWluIG9uIGJvdGggY2hhbm5lbHMgdG8gKzMuMCBkQiAqLwotCQlpZiAoIXN0YXRlLT5tdXRlZCkKLQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDAsIDB4MTE5KTsKKwljYXNlIDQ4MDAwOiAvKiBzZXQgc2FtcGxlIHJhdGUgdG8gNDgga0h6ICovCisJCXRsdjMyMGFpYzIzYl93cml0ZShzZCwgOCwgMHgwMDApOwogCQlicmVhazsKLQotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCXY0bF9pbmZvKGNsaWVudCwgIklucHV0OiAlc1xuIiwKLQkJCSAgICBzdGF0ZS0+bXV0ZWQgPyAibXV0ZWQiIDogImFjdGl2ZSIpOwotCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0bHYzMjBhaWMyM2JfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHRsdjMyMGFpYzIzYl9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3RybC0+dmFsdWUgPSBzdGF0ZS0+bXV0ZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCXJldHVybiAtRUlOVkFMOworCXN0YXRlLT5tdXRlZCA9IGN0cmwtPnZhbHVlOworCXRsdjMyMGFpYzIzYl93cml0ZShzZCwgMCwgMHgxODApOyAvKiBtdXRlIGJvdGggY2hhbm5lbHMgKi8KKwkvKiBzZXQgZ2FpbiBvbiBib3RoIGNoYW5uZWxzIHRvICszLjAgZEIgKi8KKwlpZiAoIXN0YXRlLT5tdXRlZCkKKwkJdGx2MzIwYWljMjNiX3dyaXRlKHNkLCAwLCAweDExOSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdGx2MzIwYWljMjNiX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfaW5mbyhzZCwgIklucHV0OiAlc1xuIiwgc3RhdGUtPm11dGVkID8gIm11dGVkIiA6ICJhY3RpdmUiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bHYzMjBhaWMyM2JfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHRsdjMyMGFpYzIzYl9jb3JlX29wcyA9IHsKKwkubG9nX3N0YXR1cyA9IHRsdjMyMGFpYzIzYl9sb2dfc3RhdHVzLAorCS5nX2N0cmwgPSB0bHYzMjBhaWMyM2JfZ19jdHJsLAorCS5zX2N0cmwgPSB0bHYzMjBhaWMyM2Jfc19jdHJsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9hdWRpb19vcHMgdGx2MzIwYWljMjNiX2F1ZGlvX29wcyA9IHsKKwkuc19jbG9ja19mcmVxID0gdGx2MzIwYWljMjNiX3NfY2xvY2tfZnJlcSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHRsdjMyMGFpYzIzYl9vcHMgPSB7CisJLmNvcmUgPSAmdGx2MzIwYWljMjNiX2NvcmVfb3BzLAorCS5hdWRpbyA9ICZ0bHYzMjBhaWMyM2JfYXVkaW9fb3BzLAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogaTJjIGltcGxlbWVudGF0aW9uICovCkBAIC0xMjgsNiArMTU2LDcgQEAKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdGx2MzIwYWljMjNiX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwogCiAJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLwogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQpAQCAtMTM2LDMyICsxNjUsMzYgQEAKIAl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAKLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ0bHYzMjBhaWMyM2Jfb3BzKTsKIAlzdGF0ZS0+bXV0ZWQgPSAwOwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKIAogCS8qIEluaXRpYWxpemUgdGx2MzIwYWljMjNiICovCiAKIAkvKiBSRVNFVCAqLwotCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDE1LCAweDAwMCk7CisJdGx2MzIwYWljMjNiX3dyaXRlKHNkLCAxNSwgMHgwMDApOwogCS8qIHR1cm4gb2ZmIERBQyAmIG1pYyBpbnB1dCAqLwotCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDYsIDB4MDBBKTsKKwl0bHYzMjBhaWMyM2Jfd3JpdGUoc2QsIDYsIDB4MDBBKTsKIAkvKiBsZWZ0LWp1c3RpZmllZCwgMjQtYml0LCBtYXN0ZXIgbW9kZSAqLwotCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDcsIDB4MDQ5KTsKKwl0bHYzMjBhaWMyM2Jfd3JpdGUoc2QsIDcsIDB4MDQ5KTsKIAkvKiBzZXQgZ2FpbiBvbiBib3RoIGNoYW5uZWxzIHRvICszLjAgZEIgKi8KLQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCAwLCAweDExOSk7CisJdGx2MzIwYWljMjNiX3dyaXRlKHNkLCAwLCAweDExOSk7CiAJLyogc2V0IHNhbXBsZSByYXRlIHRvIDQ4IGtIeiAqLwotCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDAwKTsKKwl0bHYzMjBhaWMyM2Jfd3JpdGUoc2QsIDgsIDB4MDAwKTsKIAkvKiBhY3RpdmF0ZSBkaWdpdGFsIGludGVyZmFjZSAqLwotCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDksIDB4MDAxKTsKKwl0bHYzMjBhaWMyM2Jfd3JpdGUoc2QsIDksIDB4MDAxKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0bHYzMjBhaWMyM2JfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b19zdGF0ZShzZCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDRhNzczNWMuLjk3ZDc1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAjaW5jbHVkZSAibXQyMHh4LmgiCkBAIC03OCw2ICs3OCw3IEBACiAJLyogZGV2aWNlICovCiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAgICppMmM7CisJc3RydWN0IHY0bDJfc3ViZGV2ICBzZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgIGxpc3Q7CiAJdW5zaWduZWQgaW50ICAgICAgICB1c2luZ192NGwyOjE7CiAKQEAgLTk1LDYgKzk2LDExIEBACiAJY29uc3QgY2hhciAgICAgICAgICAqbmFtZTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHR1bmVyICp0b190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCB0dW5lciwgc2QpOworfQorCiAvKiBzdGFuZGFyZCBpMmMgaW5zbW9kIG9wdGlvbnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTUVESUFfVFVORVJfVEVBNTc2MSkgfHwgKGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1RFQTU3NjFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCkBAIC0yMTMsNyArMjE5LDcgQEAKIAogc3RhdGljIHZvaWQgdHVuZXJfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKIAotc3RhdGljIHN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzIHR1bmVyX2NvcmVfb3BzID0geworc3RhdGljIHN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzIHR1bmVyX2FuYWxvZ19vcHMgPSB7CiAJLnNldF9wYXJhbXMgICAgID0gZmVfc2V0X3BhcmFtcywKIAkuc3RhbmRieSAgICAgICAgPSBmZV9zdGFuZGJ5LAogCS5oYXNfc2lnbmFsICAgICA9IGZlX2hhc19zaWduYWwsCkBAIC0yMjQsNyArMjMwLDcgQEAKIC8qIFNldCB0dW5lciBmcmVxdWVuY3ksICBmcmVxIGluIFVuaXRzIG9mIDYyLjVrSHogPSAxLzE2TUh6ICovCiBzdGF0aWMgdm9pZCBzZXRfdHZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKGkyY19nZXRfY2xpZW50ZGF0YShjKSk7CiAJc3RydWN0IGFuYWxvZ19kZW1vZF9vcHMgKmFuYWxvZ19vcHMgPSAmdC0+ZmUub3BzLmFuYWxvZ19vcHM7CiAKIAlzdHJ1Y3QgYW5hbG9nX3BhcmFtZXRlcnMgcGFyYW1zID0gewpAQCAtMjU5LDcgKzI2NSw3IEBACiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKLQlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoaTJjX2dldF9jbGllbnRkYXRhKGMpKTsKIAlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKIAogCXN0cnVjdCBhbmFsb2dfcGFyYW1ldGVycyBwYXJhbXMgPSB7CkBAIC0yOTQsNyArMzAwLDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGxvbmcgZnJlcSkKIHsKLQlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoaTJjX2dldF9jbGllbnRkYXRhKGMpKTsKIAogCXN3aXRjaCAodC0+bW9kZSkgewogCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKQEAgLTM0Nyw3ICszNTMsNyBAQAogCQkgICAgIHVuc2lnbmVkIGludCBuZXdfbW9kZV9tYXNrLCB1bnNpZ25lZCBpbnQgbmV3X2NvbmZpZywKIAkJICAgICBpbnQgKCp0dW5lcl9jYWxsYmFjaykgKHZvaWQgKmRldiwgaW50IGNvbXBvbmVudCwgaW50IGNtZCwgaW50IGFyZykpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKGkyY19nZXRfY2xpZW50ZGF0YShjKSk7CiAJc3RydWN0IGR2Yl90dW5lcl9vcHMgKmZlX3R1bmVyX29wcyA9ICZ0LT5mZS5vcHMudHVuZXJfb3BzOwogCXN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzICphbmFsb2dfb3BzID0gJnQtPmZlLm9wcy5hbmFsb2dfb3BzOwogCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOwpAQCAtNDcwLDcgKzQ3Niw3IEBACiAJCXQtPm5hbWUgPSBmZV90dW5lcl9vcHMtPmluZm8ubmFtZTsKIAogCQl0LT5mZS5hbmFsb2dfZGVtb2RfcHJpdiA9IHQ7Ci0JCW1lbWNweShhbmFsb2dfb3BzLCAmdHVuZXJfY29yZV9vcHMsCisJCW1lbWNweShhbmFsb2dfb3BzLCAmdHVuZXJfYW5hbG9nX29wcywKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcykpOwogCiAJfSBlbHNlIHsKQEAgLTUxNSw3ICs1MjEsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXRfYWRkcihzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHR1bmVyX3NldHVwICp0dW5fc2V0dXApCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKGkyY19nZXRfY2xpZW50ZGF0YShjKSk7CiAKIAlpZiAoICh0LT50eXBlID09IFVOU0VUICYmICgodHVuX3NldHVwLT5hZGRyID09IEFERFJfVU5TRVQpICYmCiAJCSh0LT5tb2RlX21hc2sgJiB0dW5fc2V0dXAtPm1vZGVfbWFzaykpKSB8fApAQCAtNzI3LDYgKzczMyw4IEBACiAJdC0+bW9kZSA9IG1vZGU7CiAKIAlpZiAoY2hlY2tfbW9kZSh0LCBjbWQpID09IC1FSU5WQUwpIHsKKwkJdHVuZXJfZGJnKCJUdW5lciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtb2RlLiAiCisJCQkgICJQdXR0aW5nIHR1bmVyIHRvIHNsZWVwXG4iKTsKIAkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKIAkJaWYgKGFuYWxvZ19vcHMtPnN0YW5kYnkpCiAJCQlhbmFsb2dfb3BzLT5zdGFuZGJ5KCZ0LT5mZSk7CkBAIC03NDgsNDMgKzc1Niw1OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR1bmVyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB0dW5lcl9zX3R5cGVfYWRkcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdHVuZXJfc2V0dXAgKnR5cGUpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IGR2Yl90dW5lcl9vcHMgKmZlX3R1bmVyX29wcyA9ICZ0LT5mZS5vcHMudHVuZXJfb3BzOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwl0dW5lcl9kYmcoIkNhbGxpbmcgc2V0X3R5cGVfYWRkciBmb3IgdHlwZT0lZCwgYWRkcj0weCUwMngsIG1vZGU9MHglMDJ4LCBjb25maWc9MHglMDJ4XG4iLAorCQkJdHlwZS0+dHlwZSwKKwkJCXR5cGUtPmFkZHIsCisJCQl0eXBlLT5tb2RlX21hc2ssCisJCQl0eXBlLT5jb25maWcpOworCisJc2V0X2FkZHIoY2xpZW50LCB0eXBlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9zX3JhZGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmIChzZXRfbW9kZShjbGllbnQsIHQsIFY0TDJfVFVORVJfUkFESU8sICJBVURDX1NFVF9SQURJTyIpCisJCQk9PSAtRUlOVkFMKQorCQlyZXR1cm4gMDsKKwlpZiAodC0+cmFkaW9fZnJlcSkKKwkJc2V0X2ZyZXEoY2xpZW50LCB0LT5yYWRpb19mcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9zX3N0YW5kYnkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHN0YW5kYnkpCit7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwogCXN0cnVjdCBhbmFsb2dfZGVtb2Rfb3BzICphbmFsb2dfb3BzID0gJnQtPmZlLm9wcy5hbmFsb2dfb3BzOwogCi0JaWYgKHR1bmVyX2RlYnVnID4gMSkgewotCQl2NGxfaTJjX3ByaW50X2lvY3RsKGNsaWVudCxjbWQpOwotCQlwcmludGsoIlxuIik7Ci0JfQorCXR1bmVyX2RiZygiUHV0dGluZyB0dW5lciB0byBzbGVlcFxuIik7CisKKwlpZiAoY2hlY2tfbW9kZSh0LCAiVFVORVJfU0VUX1NUQU5EQlkiKSA9PSAtRUlOVkFMKQorCQlyZXR1cm4gMDsKKwl0LT5tb2RlID0gVF9TVEFOREJZOworCWlmIChhbmFsb2dfb3BzLT5zdGFuZGJ5KQorCQlhbmFsb2dfb3BzLT5zdGFuZGJ5KCZ0LT5mZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfVklERU9fQUxMT1dfVjRMMQorc3RhdGljIGludCB0dW5lcl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqZmVfdHVuZXJfb3BzID0gJnQtPmZlLm9wcy50dW5lcl9vcHM7CiAKIAlzd2l0Y2ggKGNtZCkgewotCS8qIC0tLSBjb25maWd1cmF0aW9uIC0tLSAqLwotCWNhc2UgVFVORVJfU0VUX1RZUEVfQUREUjoKLQkJdHVuZXJfZGJnICgiQ2FsbGluZyBzZXRfdHlwZV9hZGRyIGZvciB0eXBlPSVkLCBhZGRyPTB4JTAyeCwgbW9kZT0weCUwMngsIGNvbmZpZz0weCUwMnhcbiIsCi0JCQkJKChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpLT50eXBlLAotCQkJCSgoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKS0+YWRkciwKLQkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPm1vZGVfbWFzaywKLQkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPmNvbmZpZyk7Ci0KLQkJc2V0X2FkZHIoY2xpZW50LCAoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURDX1NFVF9SQURJTzoKLQkJaWYgKHNldF9tb2RlKGNsaWVudCwgdCwgVjRMMl9UVU5FUl9SQURJTywgIkFVRENfU0VUX1JBRElPIikKLQkJCQk9PSAtRUlOVkFMKQotCQkJcmV0dXJuIDA7Ci0JCWlmICh0LT5yYWRpb19mcmVxKQotCQkJc2V0X2ZyZXEoY2xpZW50LCB0LT5yYWRpb19mcmVxKTsKLQkJYnJlYWs7Ci0JY2FzZSBUVU5FUl9TRVRfU1RBTkRCWToKLQkJaWYgKGNoZWNrX21vZGUodCwgIlRVTkVSX1NFVF9TVEFOREJZIikgPT0gLUVJTlZBTCkKLQkJCXJldHVybiAwOwotCQl0LT5tb2RlID0gVF9TVEFOREJZOwotCQlpZiAoYW5hbG9nX29wcy0+c3RhbmRieSkKLQkJCWFuYWxvZ19vcHMtPnN0YW5kYnkoJnQtPmZlKTsKLQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1ZJREVPX0FMTE9XX1Y0TDEKIAljYXNlIFZJRElPQ1NBVURJTzoKIAkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ1NBVURJTyIpID09IC1FSU5WQUwpCiAJCQlyZXR1cm4gMDsKQEAgLTg5NywxNDkgKzkyMCwxNzIgQEAKIAkJCX0KIAkJCXJldHVybiAwOwogCQl9CisJfQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CiAjZW5kaWYKLQljYXNlIFRVTkVSX1NFVF9DT05GSUc6Ci0JewotCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgKmNmZyA9IGFyZzsKIAotCQlpZiAodC0+dHlwZSAhPSBjZmctPnR1bmVyKQotCQkJYnJlYWs7CitzdGF0aWMgaW50IHR1bmVyX3NfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3ByaXZfdHVuX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKIAotCQlpZiAoYW5hbG9nX29wcy0+c2V0X2NvbmZpZykgewotCQkJYW5hbG9nX29wcy0+c2V0X2NvbmZpZygmdC0+ZmUsIGNmZy0+cHJpdik7Ci0JCQlicmVhazsKLQkJfQorCWlmICh0LT50eXBlICE9IGNmZy0+dHVuZXIpCisJCXJldHVybiAwOwogCi0JCXR1bmVyX2RiZygiVHVuZXIgZnJvbnRlbmQgbW9kdWxlIGhhcyBubyB3YXkgdG8gc2V0IGNvbmZpZ1xuIik7Ci0JCWJyZWFrOworCWlmIChhbmFsb2dfb3BzLT5zZXRfY29uZmlnKSB7CisJCWFuYWxvZ19vcHMtPnNldF9jb25maWcoJnQtPmZlLCBjZmctPnByaXYpOworCQlyZXR1cm4gMDsKIAl9Ci0JLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCi0JLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCi0JICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwotCWNhc2UgVklESU9DX1NfU1REOgotCQl7Ci0JCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CiAKLQkJCWlmIChzZXRfbW9kZSAoY2xpZW50LCB0LCBWNEwyX1RVTkVSX0FOQUxPR19UViwgIlZJRElPQ19TX1NURCIpCi0JCQkJCT09IC1FSU5WQUwpCi0JCQkJcmV0dXJuIDA7CisJdHVuZXJfZGJnKCJUdW5lciBmcm9udGVuZCBtb2R1bGUgaGFzIG5vIHdheSB0byBzZXQgY29uZmlnXG4iKTsKKwlyZXR1cm4gMDsKK30KIAotCQkJc3dpdGNoX3Y0bDIoKTsKKy8qIC0tLSB2NGwgaW9jdGxzIC0tLSAqLworLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCisgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCitzdGF0aWMgaW50IHR1bmVyX3Nfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JCQl0LT5zdGQgPSAqaWQ7Ci0JCQl0dW5lcl9maXh1cF9zdGQodCk7Ci0JCQlpZiAodC0+dHZfZnJlcSkKLQkJCQlzZXRfZnJlcShjbGllbnQsIHQtPnR2X2ZyZXEpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOworCWlmIChzZXRfbW9kZShjbGllbnQsIHQsIFY0TDJfVFVORVJfQU5BTE9HX1RWLCAiVklESU9DX1NfU1REIikKKwkJCT09IC1FSU5WQUwpCisJCXJldHVybiAwOwogCi0JCQlpZiAoc2V0X21vZGUgKGNsaWVudCwgdCwgZi0+dHlwZSwgIlZJRElPQ19TX0ZSRVFVRU5DWSIpCi0JCQkJCT09IC1FSU5WQUwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlzd2l0Y2hfdjRsMigpOwotCQkJc2V0X2ZyZXEoY2xpZW50LGYtPmZyZXF1ZW5jeSk7CisJc3dpdGNoX3Y0bDIoKTsKIAotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOworCXQtPnN0ZCA9IHN0ZDsKKwl0dW5lcl9maXh1cF9zdGQodCk7CisJaWYgKHQtPnR2X2ZyZXEpCisJCXNldF9mcmVxKGNsaWVudCwgdC0+dHZfZnJlcSk7CisJcmV0dXJuIDA7Cit9CiAKLQkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NfR19GUkVRVUVOQ1kiKSA9PSAtRUlOVkFMKQotCQkJCXJldHVybiAwOwotCQkJc3dpdGNoX3Y0bDIoKTsKLQkJCWYtPnR5cGUgPSB0LT5tb2RlOwotCQkJaWYgKGZlX3R1bmVyX29wcy0+Z2V0X2ZyZXF1ZW5jeSkgewotCQkJCXUzMiBhYnNfZnJlcTsKK3N0YXRpYyBpbnQgdHVuZXJfc19mcmVxdWVuY3koc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQkJCQlmZV90dW5lcl9vcHMtPmdldF9mcmVxdWVuY3koJnQtPmZlLCAmYWJzX2ZyZXEpOwotCQkJCWYtPmZyZXF1ZW5jeSA9IChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpID8KLQkJCQkJKGFic19mcmVxICogMiArIDEyNS8yKSAvIDEyNSA6Ci0JCQkJCShhYnNfZnJlcSArIDYyNTAwLzIpIC8gNjI1MDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlmLT5mcmVxdWVuY3kgPSAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSA/Ci0JCQkJdC0+cmFkaW9fZnJlcSA6IHQtPnR2X2ZyZXE7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lciA9IGFyZzsKLQotCQkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ19HX1RVTkVSIikgPT0gLUVJTlZBTCkKLQkJCQlyZXR1cm4gMDsKLQkJCXN3aXRjaF92NGwyKCk7Ci0KLQkJCXR1bmVyLT50eXBlID0gdC0+bW9kZTsKLQkJCWlmIChhbmFsb2dfb3BzLT5nZXRfYWZjKQotCQkJCXR1bmVyLT5hZmMgPSBhbmFsb2dfb3BzLT5nZXRfYWZjKCZ0LT5mZSk7Ci0JCQlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX0FOQUxPR19UVikKLQkJCQl0dW5lci0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9OT1JNOwotCQkJaWYgKHQtPm1vZGUgIT0gVjRMMl9UVU5FUl9SQURJTykgewotCQkJCXR1bmVyLT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7Ci0JCQkJdHVuZXItPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIHJhZGlvIG1vZGUgKi8KLQkJCXR1bmVyLT5yeHN1YmNoYW5zID0KLQkJCQlWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkJaWYgKGZlX3R1bmVyX29wcy0+Z2V0X3N0YXR1cykgewotCQkJCXUzMiB0dW5lcl9zdGF0dXM7Ci0KLQkJCQlmZV90dW5lcl9vcHMtPmdldF9zdGF0dXMoJnQtPmZlLCAmdHVuZXJfc3RhdHVzKTsKLQkJCQl0dW5lci0+cnhzdWJjaGFucyA9Ci0JCQkJCSh0dW5lcl9zdGF0dXMgJiBUVU5FUl9TVEFUVVNfU1RFUkVPKSA/Ci0JCQkJCVY0TDJfVFVORVJfU1VCX1NURVJFTyA6Ci0JCQkJCVY0TDJfVFVORVJfU1VCX01PTk87Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhbmFsb2dfb3BzLT5pc19zdGVyZW8pIHsKLQkJCQkJdHVuZXItPnJ4c3ViY2hhbnMgPQotCQkJCQkJYW5hbG9nX29wcy0+aXNfc3RlcmVvKCZ0LT5mZSkgPwotCQkJCQkJVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDoKLQkJCQkJCVY0TDJfVFVORVJfU1VCX01PTk87Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFuYWxvZ19vcHMtPmhhc19zaWduYWwpCi0JCQkJdHVuZXItPnNpZ25hbCA9IGFuYWxvZ19vcHMtPmhhc19zaWduYWwoJnQtPmZlKTsKLQkJCXR1bmVyLT5jYXBhYmlsaXR5IHw9Ci0JCQkgICAgVjRMMl9UVU5FUl9DQVBfTE9XIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPOwotCQkJdHVuZXItPmF1ZG1vZGUgPSB0LT5hdWRtb2RlOwotCQkJdHVuZXItPnJhbmdlbG93ID0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMDsKLQkJCXR1bmVyLT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIgPSBhcmc7Ci0KLQkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NfU19UVU5FUiIpID09IC1FSU5WQUwpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCXN3aXRjaF92NGwyKCk7Ci0KLQkJCS8qIGRvIG5vdGhpbmcgdW5sZXNzIHdlJ3JlIGEgcmFkaW8gdHVuZXIgKi8KLQkJCWlmICh0LT5tb2RlICE9IFY0TDJfVFVORVJfUkFESU8pCi0JCQkJYnJlYWs7Ci0JCQl0LT5hdWRtb2RlID0gdHVuZXItPmF1ZG1vZGU7Ci0JCQlzZXRfcmFkaW9fZnJlcShjbGllbnQsIHQtPnJhZGlvX2ZyZXEpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQlpZiAoYW5hbG9nX29wcy0+dHVuZXJfc3RhdHVzKQotCQkJYW5hbG9nX29wcy0+dHVuZXJfc3RhdHVzKCZ0LT5mZSk7Ci0JCWJyZWFrOwotCX0KKwlpZiAoc2V0X21vZGUoY2xpZW50LCB0LCBmLT50eXBlLCAiVklESU9DX1NfRlJFUVVFTkNZIikKKwkJCT09IC1FSU5WQUwpCisJCXJldHVybiAwOworCXN3aXRjaF92NGwyKCk7CisJc2V0X2ZyZXEoY2xpZW50LCBmLT5mcmVxdWVuY3kpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdHVuZXJfZ19mcmVxdWVuY3koc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqZmVfdHVuZXJfb3BzID0gJnQtPmZlLm9wcy50dW5lcl9vcHM7CisKKwlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX0dfRlJFUVVFTkNZIikgPT0gLUVJTlZBTCkKKwkJcmV0dXJuIDA7CisJc3dpdGNoX3Y0bDIoKTsKKwlmLT50eXBlID0gdC0+bW9kZTsKKwlpZiAoZmVfdHVuZXJfb3BzLT5nZXRfZnJlcXVlbmN5KSB7CisJCXUzMiBhYnNfZnJlcTsKKworCQlmZV90dW5lcl9vcHMtPmdldF9mcmVxdWVuY3koJnQtPmZlLCAmYWJzX2ZyZXEpOworCQlmLT5mcmVxdWVuY3kgPSAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSA/CisJCQkoYWJzX2ZyZXEgKiAyICsgMTI1LzIpIC8gMTI1IDoKKwkJCShhYnNfZnJlcSArIDYyNTAwLzIpIC8gNjI1MDA7CisJCXJldHVybiAwOworCX0KKwlmLT5mcmVxdWVuY3kgPSAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSA/CisJCXQtPnJhZGlvX2ZyZXEgOiB0LT50dl9mcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2dfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqZmVfdHVuZXJfb3BzID0gJnQtPmZlLm9wcy50dW5lcl9vcHM7CisKKwlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX0dfVFVORVIiKSA9PSAtRUlOVkFMKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2hfdjRsMigpOworCisJdnQtPnR5cGUgPSB0LT5tb2RlOworCWlmIChhbmFsb2dfb3BzLT5nZXRfYWZjKQorCQl2dC0+YWZjID0gYW5hbG9nX29wcy0+Z2V0X2FmYygmdC0+ZmUpOworCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfQU5BTE9HX1RWKQorCQl2dC0+Y2FwYWJpbGl0eSB8PSBWNEwyX1RVTkVSX0NBUF9OT1JNOworCWlmICh0LT5tb2RlICE9IFY0TDJfVFVORVJfUkFESU8pIHsKKwkJdnQtPnJhbmdlbG93ID0gdHZfcmFuZ2VbMF0gKiAxNjsKKwkJdnQtPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7CisJCXJldHVybiAwOworCX0KKworCS8qIHJhZGlvIG1vZGUgKi8KKwl2dC0+cnhzdWJjaGFucyA9CisJCVY0TDJfVFVORVJfU1VCX01PTk8gfCBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJaWYgKGZlX3R1bmVyX29wcy0+Z2V0X3N0YXR1cykgeworCQl1MzIgdHVuZXJfc3RhdHVzOworCisJCWZlX3R1bmVyX29wcy0+Z2V0X3N0YXR1cygmdC0+ZmUsICZ0dW5lcl9zdGF0dXMpOworCQl2dC0+cnhzdWJjaGFucyA9CisJCQkodHVuZXJfc3RhdHVzICYgVFVORVJfU1RBVFVTX1NURVJFTykgPworCQkJVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDoKKwkJCVY0TDJfVFVORVJfU1VCX01PTk87CisJfSBlbHNlIHsKKwkJaWYgKGFuYWxvZ19vcHMtPmlzX3N0ZXJlbykgeworCQkJdnQtPnJ4c3ViY2hhbnMgPQorCQkJCWFuYWxvZ19vcHMtPmlzX3N0ZXJlbygmdC0+ZmUpID8KKwkJCQlWNEwyX1RVTkVSX1NVQl9TVEVSRU8gOgorCQkJCVY0TDJfVFVORVJfU1VCX01PTk87CisJCX0KKwl9CisJaWYgKGFuYWxvZ19vcHMtPmhhc19zaWduYWwpCisJCXZ0LT5zaWduYWwgPSBhbmFsb2dfb3BzLT5oYXNfc2lnbmFsKCZ0LT5mZSk7CisJdnQtPmNhcGFiaWxpdHkgfD0KKwkJVjRMMl9UVU5FUl9DQVBfTE9XIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPOworCXZ0LT5hdWRtb2RlID0gdC0+YXVkbW9kZTsKKwl2dC0+cmFuZ2Vsb3cgPSByYWRpb19yYW5nZVswXSAqIDE2MDAwOworCXZ0LT5yYW5nZWhpZ2ggPSByYWRpb19yYW5nZVsxXSAqIDE2MDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX3NfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DX1NfVFVORVIiKSA9PSAtRUlOVkFMKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaF92NGwyKCk7CisKKwkvKiBkbyBub3RoaW5nIHVubGVzcyB3ZSdyZSBhIHJhZGlvIHR1bmVyICovCisJaWYgKHQtPm1vZGUgIT0gVjRMMl9UVU5FUl9SQURJTykKKwkJcmV0dXJuIDA7CisJdC0+YXVkbW9kZSA9IHZ0LT5hdWRtb2RlOworCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+cmFkaW9fZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKKwlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyAqYW5hbG9nX29wcyA9ICZ0LT5mZS5vcHMuYW5hbG9nX29wczsKKworCWlmIChhbmFsb2dfb3BzLT50dW5lcl9zdGF0dXMpCisJCWFuYWxvZ19vcHMtPnR1bmVyX3N0YXR1cygmdC0+ZmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKK30KKwogc3RhdGljIGludCB0dW5lcl9zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKGkyY19nZXRfY2xpZW50ZGF0YShjKSk7CiAKIAl0dW5lcl9kYmcoInN1c3BlbmRcbiIpOwogCS8qIEZJWE1FOiBwb3dlciBkb3duID8/PyAqLwpAQCAtMTA0OCw3ICsxMDk0LDcgQEAKIAogc3RhdGljIGludCB0dW5lcl9yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmMpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKGkyY19nZXRfY2xpZW50ZGF0YShjKSk7CiAKIAl0dW5lcl9kYmcoInJlc3VtZVxuIik7CiAJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gdC0+bW9kZSkgewpAQCAtMTA2MSw2ICsxMTA3LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdHVuZXJfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB0dW5lcl9sb2dfc3RhdHVzLAorCS5zX3N0YW5kYnkgPSB0dW5lcl9zX3N0YW5kYnksCisjaWZkZWYgQ09ORklHX1ZJREVPX0FMTE9XX1Y0TDEKKwkuaW9jdGwgPSB0dW5lcl9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl90dW5lcl9vcHMgdHVuZXJfdHVuZXJfb3BzID0geworCS5zX3N0ZCA9IHR1bmVyX3Nfc3RkLAorCS5zX3JhZGlvID0gdHVuZXJfc19yYWRpbywKKwkuZ190dW5lciA9IHR1bmVyX2dfdHVuZXIsCisJLnNfdHVuZXIgPSB0dW5lcl9zX3R1bmVyLAorCS5zX2ZyZXF1ZW5jeSA9IHR1bmVyX3NfZnJlcXVlbmN5LAorCS5nX2ZyZXF1ZW5jeSA9IHR1bmVyX2dfZnJlcXVlbmN5LAorCS5zX3R5cGVfYWRkciA9IHR1bmVyX3NfdHlwZV9hZGRyLAorCS5zX2NvbmZpZyA9IHR1bmVyX3NfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdHVuZXJfb3BzID0geworCS5jb3JlID0gJnR1bmVyX2NvcmVfb3BzLAorCS50dW5lciA9ICZ0dW5lcl90dW5lcl9vcHMsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBMSVNUX0hFQUQodHVuZXJfbGlzdCk7CkBAIC0xMTA5LDkgKzExODEsOSBAQAogCXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHVuZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSB0KQogCQlyZXR1cm4gLUVOT01FTTsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmdC0+c2QsIGNsaWVudCwgJnR1bmVyX29wcyk7CiAJdC0+aTJjID0gY2xpZW50OwogCXQtPm5hbWUgPSAiKHR1bmVyIHVuc2V0KSI7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdCk7CiAJdC0+dHlwZSA9IFVOU0VUOwogCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwogCXQtPm1vZGVfbWFzayA9IFRfVU5JTklUSUFMSVpFRDsKQEAgLTEyNjEsOCArMTMzMyw5IEBACiAKIHN0YXRpYyBpbnQgdHVuZXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnQtPnNkKTsKIAl0dW5lcl9kZXRhY2goJnQtPmZlKTsKIAl0LT5mZS5hbmFsb2dfZGVtb2RfcHJpdiA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggMzcyMGYwZS4uZDBjNzk0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTMzLDggKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS90dmF1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAKQEAgLTExMCw3ICsxMDksNyBAQAogCiAvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBjaGlwICovCiBzdHJ1Y3QgQ0hJUFNUQVRFIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYzsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAKIAkvKiBjaGlwLXNwZWNpZmljIGRlc2NyaXB0aW9uIC0gc2hvdWxkIHBvaW50IHRvCiAJICAgYW4gZW50cnkgYXQgQ0hJUERFU0MgdGFibGUgKi8KQEAgLTEzMiw2ICsxMzEsMTEgQEAKIAlpbnQgCQkgICAgIGF1ZG1vZGU7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBDSElQU1RBVEUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IENISVBTVEFURSwgc2QpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBpMmMgYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTE1MiwzNCArMTU2LDM0IEBACiAKIHN0YXRpYyBpbnQgY2hpcF93cml0ZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgc3ViYWRkciwgaW50IHZhbCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJdW5zaWduZWQgY2hhciBidWZmZXJbMl07CiAKIAlpZiAoc3ViYWRkciA8IDApIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiBjaGlwX3dyaXRlOiAweCV4XG4iLAotCQkJY2hpcC0+Yy0+bmFtZSwgdmFsKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiY2hpcF93cml0ZTogMHgleFxuIiwgdmFsKTsKIAkJY2hpcC0+c2hhZG93LmJ5dGVzWzFdID0gdmFsOwogCQlidWZmZXJbMF0gPSB2YWw7Ci0JCWlmICgxICE9IGkyY19tYXN0ZXJfc2VuZChjaGlwLT5jLGJ1ZmZlciwxKSkgewotCQkJdjRsX3dhcm4oY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLAotCQkJCWNoaXAtPmMtPm5hbWUsIHZhbCk7CisJCWlmICgxICE9IGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDEpKSB7CisJCQl2NGwyX3dhcm4oc2QsICJJL08gZXJyb3IgKHdyaXRlIDB4JXgpXG4iLCB2YWwpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHN1YmFkZHIgKyAxID49IEFSUkFZX1NJWkUoY2hpcC0+c2hhZG93LmJ5dGVzKSkgewotCQkJdjRsX2luZm8oY2hpcC0+YywKKwkJCXY0bDJfaW5mbyhzZCwKIAkJCQkiVHJpZWQgdG8gYWNjZXNzIGEgbm9uLWV4aXN0ZW50IHJlZ2lzdGVyOiAlZFxuIiwKIAkJCQlzdWJhZGRyKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiBjaGlwX3dyaXRlOiByZWclZD0weCV4XG4iLAotCQkJY2hpcC0+Yy0+bmFtZSwgc3ViYWRkciwgdmFsKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiY2hpcF93cml0ZTogcmVnJWQ9MHgleFxuIiwKKwkJCXN1YmFkZHIsIHZhbCk7CiAJCWNoaXAtPnNoYWRvdy5ieXRlc1tzdWJhZGRyKzFdID0gdmFsOwogCQlidWZmZXJbMF0gPSBzdWJhZGRyOwogCQlidWZmZXJbMV0gPSB2YWw7Ci0JCWlmICgyICE9IGkyY19tYXN0ZXJfc2VuZChjaGlwLT5jLGJ1ZmZlciwyKSkgewotCQkJdjRsX3dhcm4oY2hpcC0+YywgIiVzOiBJL08gZXJyb3IgKHdyaXRlIHJlZyVkPTB4JXgpXG4iLAotCQkJY2hpcC0+Yy0+bmFtZSwgc3ViYWRkciwgdmFsKTsKKwkJaWYgKDIgIT0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgMikpIHsKKwkJCXY0bDJfd2FybihzZCwgIkkvTyBlcnJvciAod3JpdGUgcmVnJWQ9MHgleClcbiIsCisJCQkJc3ViYWRkciwgdmFsKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTE4OSwxMiArMTkzLDE0IEBACiBzdGF0aWMgaW50IGNoaXBfd3JpdGVfbWFza2VkKHN0cnVjdCBDSElQU1RBVEUgKmNoaXAsCiAJCQkgICAgIGludCBzdWJhZGRyLCBpbnQgdmFsLCBpbnQgbWFzaykKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOworCiAJaWYgKG1hc2sgIT0gMCkgewogCQlpZiAoc3ViYWRkciA8IDApIHsKIAkJCXZhbCA9IChjaGlwLT5zaGFkb3cuYnl0ZXNbMV0gJiB+bWFzaykgfCAodmFsICYgbWFzayk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoc3ViYWRkciArIDEgPj0gQVJSQVlfU0laRShjaGlwLT5zaGFkb3cuYnl0ZXMpKSB7Ci0JCQkJdjRsX2luZm8oY2hpcC0+YywKKwkJCQl2NGwyX2luZm8oc2QsCiAJCQkJCSJUcmllZCB0byBhY2Nlc3MgYSBub24tZXhpc3RlbnQgcmVnaXN0ZXI6ICVkXG4iLAogCQkJCQlzdWJhZGRyKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwOCw0NSArMjE0LDUxIEBACiAKIHN0YXRpYyBpbnQgY2hpcF9yZWFkKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwogCi0JaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNoaXAtPmMsJmJ1ZmZlciwxKSkgewotCQl2NGxfd2FybihjaGlwLT5jLCAiJXM6IEkvTyBlcnJvciAocmVhZClcbiIsCi0JCWNoaXAtPmMtPm5hbWUpOworCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdihjLCAmYnVmZmVyLCAxKSkgeworCQl2NGwyX3dhcm4oc2QsICJJL08gZXJyb3IgKHJlYWQpXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQl2NGxfZGJnKDEsIGRlYnVnLCBjaGlwLT5jLCAiJXM6IGNoaXBfcmVhZDogMHgleFxuIixjaGlwLT5jLT5uYW1lLCBidWZmZXIpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNoaXBfcmVhZDogMHgleFxuIiwgYnVmZmVyKTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCiBzdGF0aWMgaW50IGNoaXBfcmVhZDIoc3RydWN0IENISVBTVEFURSAqY2hpcCwgaW50IHN1YmFkZHIpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXVuc2lnbmVkIGNoYXIgd3JpdGVbMV07CiAJdW5zaWduZWQgY2hhciByZWFkWzFdOwogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7Ci0JCXsgY2hpcC0+Yy0+YWRkciwgMCwgICAgICAgIDEsIHdyaXRlIH0sCi0JCXsgY2hpcC0+Yy0+YWRkciwgSTJDX01fUkQsIDEsIHJlYWQgIH0KKwkJeyBjLT5hZGRyLCAwLCAgICAgICAgMSwgd3JpdGUgfSwKKwkJeyBjLT5hZGRyLCBJMkNfTV9SRCwgMSwgcmVhZCAgfQogCX07CisKIAl3cml0ZVswXSA9IHN1YmFkZHI7CiAKLQlpZiAoMiAhPSBpMmNfdHJhbnNmZXIoY2hpcC0+Yy0+YWRhcHRlcixtc2dzLDIpKSB7Ci0JCXY0bF93YXJuKGNoaXAtPmMsICIlczogSS9PIGVycm9yIChyZWFkMilcbiIsIGNoaXAtPmMtPm5hbWUpOworCWlmICgyICE9IGkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCBtc2dzLCAyKSkgeworCQl2NGwyX3dhcm4oc2QsICJJL08gZXJyb3IgKHJlYWQyKVxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiBjaGlwX3JlYWQyOiByZWclZD0weCV4XG4iLAotCQljaGlwLT5jLT5uYW1lLCBzdWJhZGRyLHJlYWRbMF0pOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNoaXBfcmVhZDI6IHJlZyVkPTB4JXhcbiIsCisJCXN1YmFkZHIsIHJlYWRbMF0pOwogCXJldHVybiByZWFkWzBdOwogfQogCiBzdGF0aWMgaW50IGNoaXBfY21kKHN0cnVjdCBDSElQU1RBVEUgKmNoaXAsIGNoYXIgKm5hbWUsIGF1ZGlvY21kICpjbWQpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCWludCBpOwogCiAJaWYgKDAgPT0gY21kLT5jb3VudCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY21kLT5jb3VudCArIGNtZC0+Ynl0ZXNbMF0gLSAxID49IEFSUkFZX1NJWkUoY2hpcC0+c2hhZG93LmJ5dGVzKSkgewotCQl2NGxfaW5mbyhjaGlwLT5jLAorCQl2NGwyX2luZm8oc2QsCiAJCQkgIlRyaWVkIHRvIGFjY2VzcyBhIG5vbi1leGlzdGVudCByZWdpc3RlciByYW5nZTogJWQgdG8gJWRcbiIsCiAJCQkgY21kLT5ieXRlc1swXSArIDEsIGNtZC0+Ynl0ZXNbMF0gKyBjbWQtPmNvdW50IC0gMSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU1LDE5ICsyNjcsMTkgQEAKIAkvKiBGSVhNRTogaXQgc2VlbXMgdGhhdCB0aGUgc2hhZG93IGJ5dGVzIGFyZSB3cm9uZyBiZWxsb3cgISovCiAKIAkvKiB1cGRhdGUgb3VyIHNoYWRvdyByZWdpc3RlciBzZXQ7IHByaW50IGJ5dGVzIGlmIChkZWJ1ZyA+IDApICovCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiBjaGlwX2NtZCglcyk6IHJlZz0lZCwgZGF0YToiLAotCQljaGlwLT5jLT5uYW1lLCBuYW1lLGNtZC0+Ynl0ZXNbMF0pOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNoaXBfY21kKCVzKTogcmVnPSVkLCBkYXRhOiIsCisJCW5hbWUsIGNtZC0+Ynl0ZXNbMF0pOwogCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNvdW50OyBpKyspIHsKIAkJaWYgKGRlYnVnKQotCQkJcHJpbnRrKCIgMHgleCIsY21kLT5ieXRlc1tpXSk7CisJCQlwcmludGsoS0VSTl9DT05UICIgMHgleCIsIGNtZC0+Ynl0ZXNbaV0pOwogCQljaGlwLT5zaGFkb3cuYnl0ZXNbaStjbWQtPmJ5dGVzWzBdXSA9IGNtZC0+Ynl0ZXNbaV07CiAJfQogCWlmIChkZWJ1ZykKLQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCiAJLyogc2VuZCBkYXRhIHRvIHRoZSBjaGlwICovCi0JaWYgKGNtZC0+Y291bnQgIT0gaTJjX21hc3Rlcl9zZW5kKGNoaXAtPmMsY21kLT5ieXRlcyxjbWQtPmNvdW50KSkgewotCQl2NGxfd2FybihjaGlwLT5jLCAiJXM6IEkvTyBlcnJvciAoJXMpXG4iLCBjaGlwLT5jLT5uYW1lLCBuYW1lKTsKKwlpZiAoY21kLT5jb3VudCAhPSBpMmNfbWFzdGVyX3NlbmQoYywgY21kLT5ieXRlcywgY21kLT5jb3VudCkpIHsKKwkJdjRsMl93YXJuKHNkLCAiSS9PIGVycm9yICglcylcbiIsIG5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiAwOwpAQCAtMjkwLDkgKzMwMiwxMCBAQAogewogCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSBkYXRhOwogCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwLT5kZXNjOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmY2hpcC0+c2Q7CiAJaW50IG1vZGU7CiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjaGlwLT5jLCAiJXM6IHRocmVhZCBzdGFydGVkXG4iLCBjaGlwLT5jLT5uYW1lKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0aHJlYWQgc3RhcnRlZFxuIik7CiAJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTMwMiw3ICszMTUsNyBAQAogCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiB0aHJlYWQgd2FrZXVwXG4iLCBjaGlwLT5jLT5uYW1lKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAidGhyZWFkIHdha2V1cFxuIik7CiAKIAkJLyogZG9uJ3QgZG8gYW55dGhpbmcgZm9yIHJhZGlvIG9yIGlmIG1vZGUgIT0gYXV0byAqLwogCQlpZiAoY2hpcC0+cmFkaW8gfHwgY2hpcC0+bW9kZSAhPSAwKQpAQCAtMzE0LDggKzMyNyw3IEBACiAJCQljb250aW51ZTsKIAogCQkvKiBjaGlwIGRldGVjdGVkIGEgbmV3IGF1ZGlvIG1vZGUgLSBzZXQgaXQgKi8KLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiB0aHJlYWQgY2hlY2ttb2RlXG4iLAotCQkJY2hpcC0+Yy0+bmFtZSk7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInRocmVhZCBjaGVja21vZGVcbiIpOwogCiAJCWNoaXAtPnByZXZtb2RlID0gbW9kZTsKIApAQCAtMzM0LDcgKzM0Niw3IEBACiAJCW1vZF90aW1lcigmY2hpcC0+d3QsIGppZmZpZXMrbXNlY3NfdG9famlmZmllcygyMDAwKSk7CiAJfQogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgIiVzOiB0aHJlYWQgZXhpdGluZ1xuIiwgY2hpcC0+Yy0+bmFtZSk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAidGhyZWFkIGV4aXRpbmdcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjMsNiArMzc1LDcgQEAKIAogc3RhdGljIGludCB0ZGE5ODQwX2dldG1vZGUoc3RydWN0IENISVBTVEFURSAqY2hpcCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOwogCWludCB2YWwsIG1vZGU7CiAKIAl2YWwgPSBjaGlwX3JlYWQoY2hpcCk7CkBAIC0zNzIsNyArMzg1LDcgQEAKIAlpZiAodmFsICYgVERBOTg0MF9TVF9TVEVSRU8pCiAJCW1vZGUgfD0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODQwX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAidGRhOTg0MF9nZXRtb2RlKCk6IHJhdyBjaGlwIHJlYWQ6ICVkLCByZXR1cm46ICVkXG4iLAogCQl2YWwsIG1vZGUpOwogCXJldHVybiBtb2RlOwogfQpAQCAtNjY4LDYgKzY4MSw3IEBACiAKIHN0YXRpYyBpbnQgdGRhOTg3M19nZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKIAlpbnQgdmFsLG1vZGU7CiAKIAl2YWwgPSBjaGlwX3JlYWQoY2hpcCk7CkBAIC02NzYsMjMgKzY5MCwyNCBAQAogCQltb2RlIHw9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAJaWYgKHZhbCAmIFREQTk4NzNfRFVBTCkKIAkJbW9kZSB8PSBWNEwyX1RVTkVSX01PREVfTEFORzEgfCBWNEwyX1RVTkVSX01PREVfTEFORzI7Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgInRkYTk4NzNfZ2V0bW9kZSgpOiByYXcgY2hpcCByZWFkOiAlZCwgcmV0dXJuOiAlZFxuIiwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODczX2dldG1vZGUoKTogcmF3IGNoaXAgcmVhZDogJWQsIHJldHVybjogJWRcbiIsCiAJCXZhbCwgbW9kZSk7CiAJcmV0dXJuIG1vZGU7CiB9CiAKIHN0YXRpYyB2b2lkIHRkYTk4NzNfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOwogCWludCBzd19kYXRhICA9IGNoaXAtPnNoYWRvdy5ieXRlc1tUREE5ODczX1NXKzFdICYgfiBUREE5ODczX1RSX01BU0s7CiAJLyoJaW50IGFkal9kYXRhID0gY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfQUQrMV0gOyAqLwogCiAJaWYgKChzd19kYXRhICYgVERBOTg3M19JTlBfTUFTSykgIT0gVERBOTg3M19JTlRFUk5BTCkgewotCQl2NGxfZGJnKDEsIGRlYnVnLCBjaGlwLT5jLCAidGRhOTg3M19zZXRtb2RlKCk6IGV4dGVybmFsIGlucHV0XG4iKTsKKwkJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAidGRhOTg3M19zZXRtb2RlKCk6IGV4dGVybmFsIGlucHV0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODczX3NldG1vZGUoKTogY2hpcC0+c2hhZG93LmJ5dGVzWyVkXSA9ICVkXG4iLCBUREE5ODczX1NXKzEsIGNoaXAtPnNoYWRvdy5ieXRlc1tUREE5ODczX1NXKzFdKTsKLQl2NGxfZGJnKDEsIGRlYnVnLCBjaGlwLT5jLCAidGRhOTg3M19zZXRtb2RlKCk6IHN3X2RhdGEgID0gJWRcbiIsIHN3X2RhdGEpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInRkYTk4NzNfc2V0bW9kZSgpOiBjaGlwLT5zaGFkb3cuYnl0ZXNbJWRdID0gJWRcbiIsIFREQTk4NzNfU1crMSwgY2hpcC0+c2hhZG93LmJ5dGVzW1REQTk4NzNfU1crMV0pOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInRkYTk4NzNfc2V0bW9kZSgpOiBzd19kYXRhICA9ICVkXG4iLCBzd19kYXRhKTsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86CkBAIC03MTMsNyArNzI4LDcgQEAKIAl9CiAKIAljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzNfU1csIHN3X2RhdGEpOwotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODczX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBjaGlwX3dyaXRlOiAlZFxuIiwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODczX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBjaGlwX3dyaXRlOiAlZFxuIiwKIAkJbW9kZSwgc3dfZGF0YSk7CiB9CiAKQEAgLTgyMiw2ICs4MzcsOCBAQAogCiBzdGF0aWMgaW50IHRkYTk4NzRhX3NldHVwKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKKwogCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQUdDR1IsIDB4MDApOyAvKiAwIGRCICovCiAJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9HQ09OUiwgdGRhOTg3NGFfR0NPTlIpOwogCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfTVNSLCAodGRhOTg3NGFfbW9kZSkgPyAweDAzOjB4MDIpOwpAQCAtODUyLDEzICs4NjksMTQgQEAKIAkJY2hpcF93cml0ZShjaGlwLCBUREE5ODc0QV9TREFDT1NSLCAodGRhOTg3NGFfbW9kZSkgPyAweDgxOjB4ODApOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIDB4MDApOyAvKiBvciAweDEwICovCiAJfQotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODc0YV9zZXR1cCgpOiAlcyBbMHglMDJYXS5cbiIsCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAidGRhOTg3NGFfc2V0dXAoKTogJXMgWzB4JTAyWF0uXG4iLAogCQl0ZGE5ODc0YV9tb2RlbGlzdFt0ZGE5ODc0YV9TVERdLm5hbWUsdGRhOTg3NGFfU1REKTsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCB0ZGE5ODc0YV9nZXRtb2RlKHN0cnVjdCBDSElQU1RBVEUgKmNoaXApCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZjaGlwLT5zZDsKIAlpbnQgZHNyLG5zcixtb2RlOwogCWludCBuZWNyOyAvKiBqdXN0IGZvciBkZWJ1Z2dpbmcgKi8KIApAQCAtODk1LDE2ICs5MTMsMTggQEAKIAkJCW1vZGUgfD0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxIHwgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOwogCX0KIAotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODc0YV9nZXRtb2RlKCk6IERTUj0weCVYLCBOU1I9MHglWCwgTkVDUj0weCVYLCByZXR1cm46ICVkLlxuIiwKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODc0YV9nZXRtb2RlKCk6IERTUj0weCVYLCBOU1I9MHglWCwgTkVDUj0weCVYLCByZXR1cm46ICVkLlxuIiwKIAkJIGRzciwgbnNyLCBuZWNyLCBtb2RlKTsKIAlyZXR1cm4gbW9kZTsKIH0KIAogc3RhdGljIHZvaWQgdGRhOTg3NGFfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOworCiAJLyogRGlzYWJsZS9lbmFibGUgTklDQU0gYXV0by1tdXRpbmcgKGJhc2VkIG9uIERTUi5SU1NGIHN0YXR1cyBiaXQpLiAqLwogCS8qIElmIGF1dG8tbXV0aW5nIGlzIGRpc2FibGVkLCB3ZSBjYW4gaGVhciBhIHNpZ25hbCBvZiBkZWdyYWRpbmcgcXVhbGl0eS4gKi8KLQlpZih0ZGE5ODc0YV9tb2RlKSB7CisJaWYgKHRkYTk4NzRhX21vZGUpIHsKIAkJaWYoY2hpcC0+c2hhZG93LmJ5dGVzW01BWFJFR1MtMl0gJiAweDIwKSAvKiBEU1IuUlNTRj0xICovCiAJCQl0ZGE5ODc0YV9OQ09OUiAmPSAweGZlOyAvKiBlbmFibGUgKi8KIAkJZWxzZQpAQCAtOTQxLDcgKzk2MSw3IEBACiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfQU9TUiwgYW9zcik7CiAJCWNoaXBfd3JpdGUoY2hpcCwgVERBOTg3NEFfTURBQ09TUiwgbWRhY29zcik7CiAKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2hpcC0+YywgInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBBT1NSPTB4JVgsIE1EQUNPU1I9MHglWC5cbiIsCisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgInRkYTk4NzRhX3NldG1vZGUoKTogcmVxLiBtb2RlICVkOyBBT1NSPTB4JVgsIE1EQUNPU1I9MHglWC5cbiIsCiAJCQltb2RlLCBhb3NyLCBtZGFjb3NyKTsKIAogCX0gZWxzZSB7IC8qIGRpYyA9PSAweDA3ICovCkBAIC05NzYsMTMgKzk5NiwxNCBAQAogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0ZNTVIsIGZtbXIpOwogCQljaGlwX3dyaXRlKGNoaXAsIFREQTk4NzRBX0FPU1IsIGFvc3IpOwogCi0JCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgRk1NUj0weCVYLCBBT1NSPTB4JVguXG4iLAorCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODc0YV9zZXRtb2RlKCk6IHJlcS4gbW9kZSAlZDsgRk1NUj0weCVYLCBBT1NSPTB4JVguXG4iLAogCQkJbW9kZSwgZm1tciwgYW9zcik7CiAJfQogfQogCiBzdGF0aWMgaW50IHRkYTk4NzRhX2NoZWNraXQoc3RydWN0IENISVBTVEFURSAqY2hpcCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOwogCWludCBkaWMsc2ljOwkvKiBkZXZpY2UgaWQuIGFuZCBzb2Z0d2FyZSBpZC4gY29kZXMgKi8KIAogCWlmKC0xID09IChkaWMgPSBjaGlwX3JlYWQyKGNoaXAsVERBOTg3NEFfRElDKSkpCkBAIC05OTAsMTAgKzEwMTEsMTAgQEAKIAlpZigtMSA9PSAoc2ljID0gY2hpcF9yZWFkMihjaGlwLFREQTk4NzRBX1NJQykpKQogCQlyZXR1cm4gMDsKIAotCXY0bF9kYmcoMSwgZGVidWcsIGNoaXAtPmMsICJ0ZGE5ODc0YV9jaGVja2l0KCk6IERJQz0weCVYLCBTSUM9MHglWC5cbiIsIGRpYywgc2ljKTsKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0ZGE5ODc0YV9jaGVja2l0KCk6IERJQz0weCVYLCBTSUM9MHglWC5cbiIsIGRpYywgc2ljKTsKIAogCWlmKChkaWMgPT0gMHgxMSl8fChkaWMgPT0gMHgwNykpIHsKLQkJdjRsX2luZm8oY2hpcC0+YywgImZvdW5kIHRkYTk4NzQlcy5cbiIsIChkaWMgPT0gMHgxMSkgPyAiYSI6ImgiKTsKKwkJdjRsMl9pbmZvKHNkLCAiZm91bmQgdGRhOTg3NCVzLlxuIiwgKGRpYyA9PSAweDExKSA/ICJhIiA6ICJoIik7CiAJCXRkYTk4NzRhX2RpYyA9IGRpYzsJLyogcmVtZW1iZXIgZGV2aWNlIGlkLiAqLwogCQlyZXR1cm4gMTsKIAl9CkBAIC0xMTEzLDEyICsxMTM0LDEyIEBACiBzdGF0aWMgaW50IHRkYTg0MjVfaW5pdGlhbGl6ZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwKQogewogCXN0cnVjdCBDSElQREVTQyAqZGVzYyA9IGNoaXAtPmRlc2M7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZjaGlwLT5zZCk7CiAJaW50IGlucHV0bWFwWzRdID0geyAvKiB0dW5lcgkqLyBUREE4NDI1X1MxX0NIMiwgLyogcmFkaW8gICovIFREQTg0MjVfUzFfQ0gxLAogCQkJICAgIC8qIGV4dGVybgkqLyBUREE4NDI1X1MxX0NIMSwgLyogaW50ZXJuICovIFREQTg0MjVfUzFfT0ZGfTsKIAotCWlmIChjaGlwLT5jLT5hZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9SSVZBKSB7Ci0JCW1lbWNweSAoZGVzYy0+aW5wdXRtYXAsIGlucHV0bWFwLCBzaXplb2YgKGlucHV0bWFwKSk7Ci0JfQorCWlmIChjLT5hZGFwdGVyLT5pZCA9PSBJMkNfSFdfQl9SSVZBKQorCQltZW1jcHkoZGVzYy0+aW5wdXRtYXAsIGlucHV0bWFwLCBzaXplb2YoaW5wdXRtYXApKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxNSw5ICsxMjM2LDExIEBACiAKIHN0YXRpYyB2b2lkIHRhODg3NHpfc2V0bW9kZShzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJmNoaXAtPnNkOwogCWludCB1cGRhdGUgPSAxOwogCWF1ZGlvY21kICp0ID0gTlVMTDsKLQl2NGxfZGJnKDEsIGRlYnVnLCBjaGlwLT5jLCAidGE4ODc0el9zZXRtb2RlKCk6IG1vZGU6IDB4JTAyeFxuIiwgbW9kZSk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJ0YTg4NzR6X3NldG1vZGUoKTogbW9kZTogMHglMDJ4XG4iLCBtb2RlKTsKIAogCXN3aXRjaChtb2RlKXsKIAljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgpAQCAtMTQ3OSwxNDIgKzE1MDIsMTEgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBpMmMgcmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLXN0YXRpYyBpbnQgY2hpcF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IENISVBTVEFURSAqY2hpcDsKLQlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjOwotCi0JaWYgKGRlYnVnKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW86IFRWIGF1ZGlvIGRlY29kZXIgKyBhdWRpby92aWRlbyBtdXggZHJpdmVyXG4iKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidHZhdWRpbzoga25vd24gY2hpcHM6ICIpOwotCQlmb3IgKGRlc2MgPSBjaGlwbGlzdDsgZGVzYy0+bmFtZSAhPSBOVUxMOyBkZXNjKyspCi0JCQlwcmludGsoIiVzJXMiLCAoZGVzYyA9PSBjaGlwbGlzdCkgPyAiIiA6ICIsICIsIGRlc2MtPm5hbWUpOwotCQlwcmludGsoIlxuIik7Ci0JfQotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSxHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRU5PTUVNOwotCWNoaXAtPmMgPSBjbGllbnQ7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7Ci0KLQkvKiBmaW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgY2hpcCAqLwotCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4XG4iLCBjbGllbnQtPmFkZHI8PDEpOwotCWZvciAoZGVzYyA9IGNoaXBsaXN0OyBkZXNjLT5uYW1lICE9IE5VTEw7IGRlc2MrKykgewotCQlpZiAoMCA9PSAqKGRlc2MtPmluc21vZG9wdCkpCi0JCQljb250aW51ZTsKLQkJaWYgKGNsaWVudC0+YWRkciA8IGRlc2MtPmFkZHJfbG8gfHwKLQkJICAgIGNsaWVudC0+YWRkciA+IGRlc2MtPmFkZHJfaGkpCi0JCQljb250aW51ZTsKLQkJaWYgKGRlc2MtPmNoZWNraXQgJiYgIWRlc2MtPmNoZWNraXQoY2hpcCkpCi0JCQljb250aW51ZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChkZXNjLT5uYW1lID09IE5VTEwpIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAibm8gbWF0Y2hpbmcgY2hpcCBkZXNjcmlwdGlvbiBmb3VuZFxuIik7Ci0JCWtmcmVlKGNoaXApOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JdjRsX2luZm8oY2xpZW50LCAiJXMgZm91bmQgQCAweCV4ICglcylcbiIsIGRlc2MtPm5hbWUsIGNsaWVudC0+YWRkcjw8MSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKLQlpZiAoZGVzYy0+ZmxhZ3MpIHsKLQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAibWF0Y2hlczolcyVzJXMuXG4iLAotCQkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSAgICAgPyAiIHZvbHVtZSIgICAgICA6ICIiLAotCQkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfQkFTU1RSRUJMRSkgPyAiIGJhc3MvdHJlYmxlIiA6ICIiLAotCQkJKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfSU5QVVRTRUwpICAgPyAiIGF1ZGlvbXV4IiAgICA6ICIiKTsKLQl9Ci0KLQkvKiBmaWxsIHJlcXVpcmVkIGRhdGEgc3RydWN0dXJlcyAqLwotCWlmICghaWQpCi0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBkZXNjLT5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKLQljaGlwLT5kZXNjID0gZGVzYzsKLQljaGlwLT5zaGFkb3cuY291bnQgPSBkZXNjLT5yZWdpc3RlcnMrMTsKLQljaGlwLT5wcmV2bW9kZSA9IC0xOwotCWNoaXAtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7Ci0KLQkvKiBpbml0aWFsaXphdGlvbiAgKi8KLQlpZiAoZGVzYy0+aW5pdGlhbGl6ZSAhPSBOVUxMKQotCQlkZXNjLT5pbml0aWFsaXplKGNoaXApOwotCWVsc2UKLQkJY2hpcF9jbWQoY2hpcCwiaW5pdCIsJmRlc2MtPmluaXQpOwotCi0JaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSB7Ci0JCWlmICghZGVzYy0+dm9sZnVuYykgewotCQkJLyogVGhpcyBzaG91bGRuJ3QgYmUgaGFwcGVuLiBXYXJuIHVzZXIsIGJ1dCBrZWVwIHdvcmtpbmcKLQkJCSAgIHdpdGhvdXQgdm9sdW1lIGNvbnRyb2xzCi0JCQkgKi8KLQkJCXY0bF9pbmZvKGNoaXAtPmMsICJ2b2x1bWUgY2FsbGJhY2sgdW5kZWZpbmVkIVxuIik7Ci0JCQlkZXNjLT5mbGFncyAmPSB+Q0hJUF9IQVNfVk9MVU1FOwotCQl9IGVsc2UgewotCQkJY2hpcC0+bGVmdCAgPSBkZXNjLT5sZWZ0aW5pdCAgPyBkZXNjLT5sZWZ0aW5pdCAgOiA2NTUzNTsKLQkJCWNoaXAtPnJpZ2h0ID0gZGVzYy0+cmlnaHRpbml0ID8gZGVzYy0+cmlnaHRpbml0IDogNjU1MzU7Ci0JCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPmxlZnRyZWcsCi0JCQkJICAgZGVzYy0+dm9sZnVuYyhjaGlwLT5sZWZ0KSk7Ci0JCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPnJpZ2h0cmVnLAotCQkJCSAgIGRlc2MtPnZvbGZ1bmMoY2hpcC0+cmlnaHQpKTsKLQkJfQotCX0KLQlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSB7Ci0JCWlmICghZGVzYy0+YmFzc2Z1bmMgfHwgIWRlc2MtPnRyZWJsZWZ1bmMpIHsKLQkJCS8qIFRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbi4gV2FybiB1c2VyLCBidXQga2VlcCB3b3JraW5nCi0JCQkgICB3aXRob3V0IGJhc3MvdHJlYmxlIGNvbnRyb2xzCi0JCQkgKi8KLQkJCXY0bF9pbmZvKGNoaXAtPmMsICJiYXNzL3RyZWJsZSBjYWxsYmFja3MgdW5kZWZpbmVkIVxuIik7Ci0JCQlkZXNjLT5mbGFncyAmPSB+Q0hJUF9IQVNfQkFTU1RSRUJMRTsKLQkJfSBlbHNlIHsKLQkJCWNoaXAtPnRyZWJsZSA9IGRlc2MtPnRyZWJsZWluaXQgPwotCQkJCQkJZGVzYy0+dHJlYmxlaW5pdCA6IDMyNzY4OwotCQkJY2hpcC0+YmFzcyAgID0gZGVzYy0+YmFzc2luaXQgICA/Ci0JCQkJCQlkZXNjLT5iYXNzaW5pdCAgIDogMzI3Njg7Ci0JCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPmJhc3NyZWcsCi0JCQkJICAgZGVzYy0+YmFzc2Z1bmMoY2hpcC0+YmFzcykpOwotCQkJY2hpcF93cml0ZShjaGlwLCBkZXNjLT50cmVibGVyZWcsCi0JCQkJICAgZGVzYy0+dHJlYmxlZnVuYyhjaGlwLT50cmVibGUpKTsKLQkJfQotCX0KLQotCWNoaXAtPnRocmVhZCA9IE5VTEw7Ci0JaWYgKGRlc2MtPmZsYWdzICYgQ0hJUF9ORUVEX0NIRUNLTU9ERSkgewotCQlpZiAoIWRlc2MtPmdldG1vZGUgfHwgIWRlc2MtPnNldG1vZGUpIHsKLQkJCS8qIFRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbi4gV2FybiB1c2VyLCBidXQga2VlcCB3b3JraW5nCi0JCQkgICB3aXRob3V0IGt0aHJlYWQKLQkJCSAqLwotCQkJdjRsX2luZm8oY2hpcC0+YywgInNldC9nZXQgbW9kZSBjYWxsYmFja3MgdW5kZWZpbmVkIVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKiBzdGFydCBhc3luYyB0aHJlYWQgKi8KLQkJaW5pdF90aW1lcigmY2hpcC0+d3QpOwotCQljaGlwLT53dC5mdW5jdGlvbiA9IGNoaXBfdGhyZWFkX3dha2U7Ci0JCWNoaXAtPnd0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpY2hpcDsKLQkJY2hpcC0+dGhyZWFkID0ga3RocmVhZF9ydW4oY2hpcF90aHJlYWQsIGNoaXAsIGNoaXAtPmMtPm5hbWUpOwotCQlpZiAoSVNfRVJSKGNoaXAtPnRocmVhZCkpIHsKLQkJCXY0bF93YXJuKGNoaXAtPmMsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBrdGhyZWFkXG4iLAotCQkJICAgICAgIGNoaXAtPmMtPm5hbWUpOwotCQkJY2hpcC0+dGhyZWFkID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaGlwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWRlbF90aW1lcl9zeW5jKCZjaGlwLT53dCk7Ci0JaWYgKGNoaXAtPnRocmVhZCkgewotCQkvKiBzaHV0ZG93biBhc3luYyB0aHJlYWQgKi8KLQkJa3RocmVhZF9zdG9wKGNoaXAtPnRocmVhZCk7Ci0JCWNoaXAtPnRocmVhZCA9IE5VTEw7Ci0JfQotCi0Ja2ZyZWUoY2hpcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHZhdWRpb19nZXRfY3RybChzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLAorc3RhdGljIGludCB0dmF1ZGlvX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7CisJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IHRvX3N0YXRlKHNkKTsKIAlzdHJ1Y3QgQ0hJUERFU0MgKmRlc2MgPSBjaGlwLT5kZXNjOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtMTY1Miw5ICsxNTQ0LDEwIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgdHZhdWRpb19zZXRfY3RybChzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwLAorc3RhdGljIGludCB0dmF1ZGlvX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7CisJc3RydWN0IENISVBTVEFURSAqY2hpcCA9IHRvX3N0YXRlKHNkKTsKIAlzdHJ1Y3QgQ0hJUERFU0MgKmRlc2MgPSBjaGlwLT5kZXNjOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtMTcyNiwxNjEgKzE2MTksMzI3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiB2aWRlbzRsaW51eCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLXN0YXRpYyBpbnQgY2hpcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHR2YXVkaW9fc19yYWRpbyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewotCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjID0gY2hpcC0+ZGVzYzsKKwlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gdG9fc3RhdGUoc2QpOwogCi0JaWYgKGRlYnVnID4gMCkgewotCQl2NGxfaTJjX3ByaW50X2lvY3RsKGNoaXAtPmMsIGNtZCk7Ci0JCXByaW50aygiXG4iKTsKKwljaGlwLT5yYWRpbyA9IDE7CisJY2hpcC0+d2F0Y2hfc3RlcmVvID0gMDsKKwkvKiBkZWxfdGltZXIoJmNoaXAtPnd0KTsgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dmF1ZGlvX3F1ZXJ5Y3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcC0+ZGVzYzsKKworCXN3aXRjaCAocWMtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJCWlmICghKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfVk9MVU1FKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCWlmICghKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfQkFTU1RSRUJMRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworfQogCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRENfU0VUX1JBRElPOgotCQljaGlwLT5yYWRpbyA9IDE7CitzdGF0aWMgaW50IHR2YXVkaW9fc19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJ0KQoreworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcC0+ZGVzYzsKKworCWlmICghKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfSU5QVVRTRUwpIHx8IHJ0LT5pbnB1dCA+PSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBUaGVyZSBhcmUgZm91ciBpbnB1dHM6IHR1bmVyLCByYWRpbywgZXh0ZXJuIGFuZCBpbnRlcm4uICovCisJY2hpcC0+aW5wdXQgPSBydC0+aW5wdXQ7CisJaWYgKGNoaXAtPm11dGVkKQorCQlyZXR1cm4gMDsKKwljaGlwX3dyaXRlX21hc2tlZChjaGlwLCBkZXNjLT5pbnB1dHJlZywKKwkJCWRlc2MtPmlucHV0bWFwW2NoaXAtPmlucHV0XSwgZGVzYy0+aW5wdXRtYXNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dmF1ZGlvX3NfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcC0+ZGVzYzsKKwlpbnQgbW9kZSA9IDA7CisKKwlpZiAoY2hpcC0+cmFkaW8pCisJCXJldHVybiAwOworCXN3aXRjaCAodnQtPmF1ZG1vZGUpIHsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9NT05POgorCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMjoKKwkJbW9kZSA9IHZ0LT5hdWRtb2RlOworCQlicmVhazsKKwljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMjoKKwkJbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGlwLT5hdWRtb2RlID0gdnQtPmF1ZG1vZGU7CisKKwlpZiAoZGVzYy0+c2V0bW9kZSAmJiBtb2RlKSB7CiAJCWNoaXAtPndhdGNoX3N0ZXJlbyA9IDA7CiAJCS8qIGRlbF90aW1lcigmY2hpcC0+d3QpOyAqLwotCQlicmVhazsKLQkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KLQkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKLQlrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCi0JY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQotCQlzd2l0Y2ggKHFjLT5pZCkgewotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCWJyZWFrOwotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6Ci0JCQkJaWYgKCEoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgotCQkJCWlmICghKGRlc2MtPmZsYWdzICYgQ0hJUF9IQVNfQkFTU1RSRUJMRSkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKLQl9Ci0JY2FzZSBWSURJT0NfU19DVFJMOgotCQlyZXR1cm4gdHZhdWRpb19zZXRfY3RybChjaGlwLCBhcmcpOwotCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCQlyZXR1cm4gdHZhdWRpb19nZXRfY3RybChjaGlwLCBhcmcpOwotCWNhc2UgVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkc6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpydCA9IGFyZzsKLQotCQlydC0+aW5wdXQgPSBjaGlwLT5pbnB1dDsKLQkJcnQtPm91dHB1dCA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgotCXsKLQkJc3RydWN0IHY0bDJfcm91dGluZyAqcnQgPSBhcmc7Ci0KLQkJaWYgKCEoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19JTlBVVFNFTCkgfHwgcnQtPmlucHV0ID49IDQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCS8qIFRoZXJlIGFyZSBmb3VyIGlucHV0czogdHVuZXIsIHJhZGlvLCBleHRlcm4gYW5kIGludGVybi4gKi8KLQkJY2hpcC0+aW5wdXQgPSBydC0+aW5wdXQ7Ci0JCWlmIChjaGlwLT5tdXRlZCkKLQkJCWJyZWFrOwotCQljaGlwX3dyaXRlX21hc2tlZChjaGlwLCBkZXNjLT5pbnB1dHJlZywKLQkJCQlkZXNjLT5pbnB1dG1hcFtjaGlwLT5pbnB1dF0sIGRlc2MtPmlucHV0bWFzayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOwotCQlpbnQgbW9kZSA9IDA7Ci0KLQkJaWYgKGNoaXAtPnJhZGlvKQotCQkJYnJlYWs7Ci0JCXN3aXRjaCAodnQtPmF1ZG1vZGUpIHsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgotCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMToKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6Ci0JCQltb2RlID0gdnQtPmF1ZG1vZGU7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzI6Ci0JCQltb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2hpcC0+YXVkbW9kZSA9IHZ0LT5hdWRtb2RlOwotCi0JCWlmIChkZXNjLT5zZXRtb2RlICYmIG1vZGUpIHsKLQkJCWNoaXAtPndhdGNoX3N0ZXJlbyA9IDA7Ci0JCQkvKiBkZWxfdGltZXIoJmNoaXAtPnd0KTsgKi8KLQkJCWNoaXAtPm1vZGUgPSBtb2RlOwotCQkJZGVzYy0+c2V0bW9kZShjaGlwLCBtb2RlKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKLQkJaW50IG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQotCQlpZiAoY2hpcC0+cmFkaW8pCi0JCQlicmVhazsKLQkJdnQtPmF1ZG1vZGUgPSBjaGlwLT5hdWRtb2RlOwotCQl2dC0+cnhzdWJjaGFucyA9IDA7Ci0JCXZ0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwKLQkJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7Ci0KLQkJaWYgKGRlc2MtPmdldG1vZGUpCi0JCQltb2RlID0gZGVzYy0+Z2V0bW9kZShjaGlwKTsKLQotCQlpZiAobW9kZSAmIFY0TDJfVFVORVJfTU9ERV9NT05PKQotCQkJdnQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJaWYgKG1vZGUgJiBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQotCQkJdnQtPnJ4c3ViY2hhbnMgfD0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkvKiBOb3RlOiBmb3IgU0FQIGl0IHNob3VsZCBiZSBtb25vL2xhbmcyIG9yIHN0ZXJlby9sYW5nMi4KLQkJICAgV2hlbiB0aGlzIG1vZHVsZSBpcyBjb252ZXJ0ZWQgZnVsbHkgdG8gdjRsMiwgdGhlbiB0aGlzCi0JCSAgIHNob3VsZCBjaGFuZ2UgZm9yIHRob3NlIGNoaXBzIHRoYXQgY2FuIGRldGVjdCBTQVAuICovCi0JCWlmIChtb2RlICYgVjRMMl9UVU5FUl9NT0RFX0xBTkcxKQotCQkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8Ci0JCQkJCSBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfU1REOgotCQljaGlwLT5yYWRpbyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQljaGlwLT5tb2RlID0gMDsgLyogYXV0b21hdGljICovCi0KLQkJLyogRm9yIGNoaXBzIHRoYXQgcHJvdmlkZSBnZXRtb2RlIGFuZCBzZXRtb2RlLCBhbmQgZG9lc24ndAotCQkgICBhdXRvbWF0aWNhbGx5IGZvbGxvd3MgdGhlIHN0ZXJlbyBjYXJyaWVyLCBhIGt0aHJlYWQgaXMKLQkJICAgY3JlYXRlZCB0byBzZXQgdGhlIGF1ZGlvIHN0YW5kYXJkLiBJbiB0aGlzIGNhc2UsIHdoZW4gdGhlbgotCQkgICB0aGUgdmlkZW8gY2hhbm5lbCBpcyBjaGFuZ2VkLCB0dmF1ZGlvIHN0YXJ0cyBvbiBNT05PIG1vZGUuCi0JCSAgIEFmdGVyIHdhaXRpbmcgZm9yIDIgc2Vjb25kcywgdGhlIGtlcm5lbCB0aHJlYWQgaXMgY2FsbGVkLAotCQkgICB0byBmb2xsb3cgd2hhdGV2ZXIgYXVkaW8gc3RhbmRhcmQgaXMgcG9pbnRlZCBieSB0aGUKLQkJICAgYXVkaW8gY2Fycmllci4KLQkJICovCi0JCWlmIChjaGlwLT50aHJlYWQpIHsKLQkJCWRlc2MtPnNldG1vZGUoY2hpcCxWNEwyX1RVTkVSX01PREVfTU9OTyk7Ci0JCQlpZiAoY2hpcC0+cHJldm1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCi0JCQkJY2hpcC0+cHJldm1vZGUgPSAtMTsgLyogcmVzZXQgcHJldmlvdXMgbW9kZSAqLwotCQkJbW9kX3RpbWVyKCZjaGlwLT53dCwgamlmZmllcyttc2Vjc190b19qaWZmaWVzKDIwMDApKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKLQkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgYXJnLCBWNEwyX0lERU5UX1RWQVVESU8sIDApOworCQljaGlwLT5tb2RlID0gbW9kZTsKKwkJZGVzYy0+c2V0bW9kZShjaGlwLCBtb2RlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hpcF9sZWdhY3lfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQorc3RhdGljIGludCB0dmF1ZGlvX2dfdHVuZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KQoreworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcC0+ZGVzYzsKKwlpbnQgbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCisJaWYgKGNoaXAtPnJhZGlvKQorCQlyZXR1cm4gMDsKKwl2dC0+YXVkbW9kZSA9IGNoaXAtPmF1ZG1vZGU7CisJdnQtPnJ4c3ViY2hhbnMgPSAwOworCXZ0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwKKwkJVjRMMl9UVU5FUl9DQVBfTEFORzEgfCBWNEwyX1RVTkVSX0NBUF9MQU5HMjsKKworCWlmIChkZXNjLT5nZXRtb2RlKQorCQltb2RlID0gZGVzYy0+Z2V0bW9kZShjaGlwKTsKKworCWlmIChtb2RlICYgVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJCXZ0LT5yeHN1YmNoYW5zIHw9IFY0TDJfVFVORVJfU1VCX01PTk87CisJaWYgKG1vZGUgJiBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQorCQl2dC0+cnhzdWJjaGFucyB8PSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJLyogTm90ZTogZm9yIFNBUCBpdCBzaG91bGQgYmUgbW9uby9sYW5nMiBvciBzdGVyZW8vbGFuZzIuCisJICAgV2hlbiB0aGlzIG1vZHVsZSBpcyBjb252ZXJ0ZWQgZnVsbHkgdG8gdjRsMiwgdGhlbiB0aGlzCisJICAgc2hvdWxkIGNoYW5nZSBmb3IgdGhvc2UgY2hpcHMgdGhhdCBjYW4gZGV0ZWN0IFNBUC4gKi8KKwlpZiAobW9kZSAmIFY0TDJfVFVORVJfTU9ERV9MQU5HMSkKKwkJdnQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8CisJCQlWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dmF1ZGlvX3Nfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCkKK3sKKwlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwID0gdG9fc3RhdGUoc2QpOworCisJY2hpcC0+cmFkaW8gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2YXVkaW9fc19mcmVxdWVuY3koc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmcmVxKQoreworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IENISVBERVNDICpkZXNjID0gY2hpcC0+ZGVzYzsKKworCWNoaXAtPm1vZGUgPSAwOyAvKiBhdXRvbWF0aWMgKi8KKworCS8qIEZvciBjaGlwcyB0aGF0IHByb3ZpZGUgZ2V0bW9kZSBhbmQgc2V0bW9kZSwgYW5kIGRvZXNuJ3QKKwkgICBhdXRvbWF0aWNhbGx5IGZvbGxvd3MgdGhlIHN0ZXJlbyBjYXJyaWVyLCBhIGt0aHJlYWQgaXMKKwkgICBjcmVhdGVkIHRvIHNldCB0aGUgYXVkaW8gc3RhbmRhcmQuIEluIHRoaXMgY2FzZSwgd2hlbiB0aGVuCisJICAgdGhlIHZpZGVvIGNoYW5uZWwgaXMgY2hhbmdlZCwgdHZhdWRpbyBzdGFydHMgb24gTU9OTyBtb2RlLgorCSAgIEFmdGVyIHdhaXRpbmcgZm9yIDIgc2Vjb25kcywgdGhlIGtlcm5lbCB0aHJlYWQgaXMgY2FsbGVkLAorCSAgIHRvIGZvbGxvdyB3aGF0ZXZlciBhdWRpbyBzdGFuZGFyZCBpcyBwb2ludGVkIGJ5IHRoZQorCSAgIGF1ZGlvIGNhcnJpZXIuCisJICovCisJaWYgKGNoaXAtPnRocmVhZCkgeworCQlkZXNjLT5zZXRtb2RlKGNoaXAsIFY0TDJfVFVORVJfTU9ERV9NT05PKTsKKwkJaWYgKGNoaXAtPnByZXZtb2RlICE9IFY0TDJfVFVORVJfTU9ERV9NT05PKQorCQkJY2hpcC0+cHJldm1vZGUgPSAtMTsgLyogcmVzZXQgcHJldmlvdXMgbW9kZSAqLworCQltb2RfdGltZXIoJmNoaXAtPnd0LCBqaWZmaWVzK21zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dmF1ZGlvX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfVFZBVURJTywgMCk7Cit9CisKK3N0YXRpYyBpbnQgdHZhdWRpb19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdHZhdWRpb19jb3JlX29wcyA9IHsKKwkuZ19jaGlwX2lkZW50ID0gdHZhdWRpb19nX2NoaXBfaWRlbnQsCisJLnF1ZXJ5Y3RybCA9IHR2YXVkaW9fcXVlcnljdHJsLAorCS5nX2N0cmwgPSB0dmF1ZGlvX2dfY3RybCwKKwkuc19jdHJsID0gdHZhdWRpb19zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB0dmF1ZGlvX3R1bmVyX29wcyA9IHsKKwkuc19yYWRpbyA9IHR2YXVkaW9fc19yYWRpbywKKwkuc19mcmVxdWVuY3kgPSB0dmF1ZGlvX3NfZnJlcXVlbmN5LAorCS5zX3N0ZCA9IHR2YXVkaW9fc19zdGQsCisJLnNfdHVuZXIgPSB0dmF1ZGlvX3NfdHVuZXIsCisJLnNfdHVuZXIgPSB0dmF1ZGlvX2dfdHVuZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyB0dmF1ZGlvX2F1ZGlvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gdHZhdWRpb19zX3JvdXRpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB0dmF1ZGlvX29wcyA9IHsKKwkuY29yZSA9ICZ0dmF1ZGlvX2NvcmVfb3BzLAorCS50dW5lciA9ICZ0dmF1ZGlvX3R1bmVyX29wcywKKwkuYXVkaW8gPSAmdHZhdWRpb19hdWRpb19vcHMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIGkyYyByZWdpc3RyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGludCB0dmF1ZGlvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgQ0hJUFNUQVRFICpjaGlwOworCXN0cnVjdCBDSElQREVTQyAgKmRlc2M7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKworCWlmIChkZWJ1ZykgeworCQlwcmludGsoS0VSTl9JTkZPICJ0dmF1ZGlvOiBUViBhdWRpbyBkZWNvZGVyICsgYXVkaW8vdmlkZW8gbXV4IGRyaXZlclxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInR2YXVkaW86IGtub3duIGNoaXBzOiAiKTsKKwkJZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKQorCQkJcHJpbnRrKCIlcyVzIiwgKGRlc2MgPT0gY2hpcGxpc3QpID8gIiIgOiAiLCAiLCBkZXNjLT5uYW1lKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2QgPSAmY2hpcC0+c2Q7CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJnR2YXVkaW9fb3BzKTsKKworCS8qIGZpbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBjaGlwICovCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiY2hpcCBmb3VuZCBAIDB4JXhcbiIsIGNsaWVudC0+YWRkcjw8MSk7CisJZm9yIChkZXNjID0gY2hpcGxpc3Q7IGRlc2MtPm5hbWUgIT0gTlVMTDsgZGVzYysrKSB7CisJCWlmICgwID09ICooZGVzYy0+aW5zbW9kb3B0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2xpZW50LT5hZGRyIDwgZGVzYy0+YWRkcl9sbyB8fAorCQkgICAgY2xpZW50LT5hZGRyID4gZGVzYy0+YWRkcl9oaSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVzYy0+Y2hlY2tpdCAmJiAhZGVzYy0+Y2hlY2tpdChjaGlwKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKGRlc2MtPm5hbWUgPT0gTlVMTCkgeworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJubyBtYXRjaGluZyBjaGlwIGRlc2NyaXB0aW9uIGZvdW5kXG4iKTsKKwkJa2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUlPOworCX0KKwl2NGwyX2luZm8oc2QsICIlcyBmb3VuZCBAIDB4JXggKCVzKVxuIiwgZGVzYy0+bmFtZSwgY2xpZW50LT5hZGRyPDwxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOworCWlmIChkZXNjLT5mbGFncykgeworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJtYXRjaGVzOiVzJXMlcy5cbiIsCisJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19WT0xVTUUpICAgICA/ICIgdm9sdW1lIiAgICAgIDogIiIsCisJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSA/ICIgYmFzcy90cmVibGUiIDogIiIsCisJCQkoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19JTlBVVFNFTCkgICA/ICIgYXVkaW9tdXgiICAgIDogIiIpOworCX0KKworCS8qIGZpbGwgcmVxdWlyZWQgZGF0YSBzdHJ1Y3R1cmVzICovCisJaWYgKCFpZCkKKwkJc3RybGNweShjbGllbnQtPm5hbWUsIGRlc2MtPm5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWNoaXAtPmRlc2MgPSBkZXNjOworCWNoaXAtPnNoYWRvdy5jb3VudCA9IGRlc2MtPnJlZ2lzdGVycysxOworCWNoaXAtPnByZXZtb2RlID0gLTE7CisJY2hpcC0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKworCS8qIGluaXRpYWxpemF0aW9uICAqLworCWlmIChkZXNjLT5pbml0aWFsaXplICE9IE5VTEwpCisJCWRlc2MtPmluaXRpYWxpemUoY2hpcCk7CisJZWxzZQorCQljaGlwX2NtZChjaGlwLCAiaW5pdCIsICZkZXNjLT5pbml0KTsKKworCWlmIChkZXNjLT5mbGFncyAmIENISVBfSEFTX1ZPTFVNRSkgeworCQlpZiAoIWRlc2MtPnZvbGZ1bmMpIHsKKwkJCS8qIFRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbi4gV2FybiB1c2VyLCBidXQga2VlcCB3b3JraW5nCisJCQkgICB3aXRob3V0IHZvbHVtZSBjb250cm9scworCQkJICovCisJCQl2NGwyX2luZm8oc2QsICJ2b2x1bWUgY2FsbGJhY2sgdW5kZWZpbmVkIVxuIik7CisJCQlkZXNjLT5mbGFncyAmPSB+Q0hJUF9IQVNfVk9MVU1FOworCQl9IGVsc2UgeworCQkJY2hpcC0+bGVmdCAgPSBkZXNjLT5sZWZ0aW5pdCAgPyBkZXNjLT5sZWZ0aW5pdCAgOiA2NTUzNTsKKwkJCWNoaXAtPnJpZ2h0ID0gZGVzYy0+cmlnaHRpbml0ID8gZGVzYy0+cmlnaHRpbml0IDogNjU1MzU7CisJCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPmxlZnRyZWcsCisJCQkJICAgZGVzYy0+dm9sZnVuYyhjaGlwLT5sZWZ0KSk7CisJCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPnJpZ2h0cmVnLAorCQkJCSAgIGRlc2MtPnZvbGZ1bmMoY2hpcC0+cmlnaHQpKTsKKwkJfQorCX0KKwlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX0hBU19CQVNTVFJFQkxFKSB7CisJCWlmICghZGVzYy0+YmFzc2Z1bmMgfHwgIWRlc2MtPnRyZWJsZWZ1bmMpIHsKKwkJCS8qIFRoaXMgc2hvdWxkbid0IGJlIGhhcHBlbi4gV2FybiB1c2VyLCBidXQga2VlcCB3b3JraW5nCisJCQkgICB3aXRob3V0IGJhc3MvdHJlYmxlIGNvbnRyb2xzCisJCQkgKi8KKwkJCXY0bDJfaW5mbyhzZCwgImJhc3MvdHJlYmxlIGNhbGxiYWNrcyB1bmRlZmluZWQhXG4iKTsKKwkJCWRlc2MtPmZsYWdzICY9IH5DSElQX0hBU19CQVNTVFJFQkxFOworCQl9IGVsc2UgeworCQkJY2hpcC0+dHJlYmxlID0gZGVzYy0+dHJlYmxlaW5pdCA/CisJCQkJCQlkZXNjLT50cmVibGVpbml0IDogMzI3Njg7CisJCQljaGlwLT5iYXNzICAgPSBkZXNjLT5iYXNzaW5pdCAgID8KKwkJCQkJCWRlc2MtPmJhc3Npbml0ICAgOiAzMjc2ODsKKwkJCWNoaXBfd3JpdGUoY2hpcCwgZGVzYy0+YmFzc3JlZywKKwkJCQkgICBkZXNjLT5iYXNzZnVuYyhjaGlwLT5iYXNzKSk7CisJCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPnRyZWJsZXJlZywKKwkJCQkgICBkZXNjLT50cmVibGVmdW5jKGNoaXAtPnRyZWJsZSkpOworCQl9CisJfQorCisJY2hpcC0+dGhyZWFkID0gTlVMTDsKKwlpZiAoZGVzYy0+ZmxhZ3MgJiBDSElQX05FRURfQ0hFQ0tNT0RFKSB7CisJCWlmICghZGVzYy0+Z2V0bW9kZSB8fCAhZGVzYy0+c2V0bW9kZSkgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgYmUgaGFwcGVuLiBXYXJuIHVzZXIsIGJ1dCBrZWVwIHdvcmtpbmcKKwkJCSAgIHdpdGhvdXQga3RocmVhZAorCQkJICovCisJCQl2NGwyX2luZm8oc2QsICJzZXQvZ2V0IG1vZGUgY2FsbGJhY2tzIHVuZGVmaW5lZCFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogc3RhcnQgYXN5bmMgdGhyZWFkICovCisJCWluaXRfdGltZXIoJmNoaXAtPnd0KTsKKwkJY2hpcC0+d3QuZnVuY3Rpb24gPSBjaGlwX3RocmVhZF93YWtlOworCQljaGlwLT53dC5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWNoaXA7CisJCWNoaXAtPnRocmVhZCA9IGt0aHJlYWRfcnVuKGNoaXBfdGhyZWFkLCBjaGlwLCBjbGllbnQtPm5hbWUpOworCQlpZiAoSVNfRVJSKGNoaXAtPnRocmVhZCkpIHsKKwkJCXY0bDJfd2FybihzZCwgImZhaWxlZCB0byBjcmVhdGUga3RocmVhZFxuIik7CisJCQljaGlwLT50aHJlYWQgPSBOVUxMOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2YXVkaW9fcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBDSElQU1RBVEUgKmNoaXAgPSB0b19zdGF0ZShzZCk7CisKKwlkZWxfdGltZXJfc3luYygmY2hpcC0+d3QpOworCWlmIChjaGlwLT50aHJlYWQpIHsKKwkJLyogc2h1dGRvd24gYXN5bmMgdGhyZWFkICovCisJCWt0aHJlYWRfc3RvcChjaGlwLT50aHJlYWQpOworCQljaGlwLT50aHJlYWQgPSBOVUxMOworCX0KKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dmF1ZGlvX2xlZ2FjeV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7CiAJLyogZG9uJ3QgYXR0YWNoIG9uIHNhYTcxNDYgYmFzZWQgY2FyZHMsCiAJICAgYmVjYXVzZSBkZWRpY2F0ZWQgZHJpdmVycyBhcmUgdXNlZCAqLwpAQCAtMTg5NCwxOCArMTk1MywxOCBAQAogLyogVGhpcyBkcml2ZXIgc3VwcG9ydHMgbWFueSBkZXZpY2VzIGFuZCB0aGUgaWRlYSBpcyB0byBsZXQgdGhlIGRyaXZlcgogICAgZGV0ZWN0IHdoaWNoIGRldmljZSBpcyBwcmVzZW50LiBTbyByYXRoZXIgdGhhbiBsaXN0aW5nIGFsbCBzdXBwb3J0ZWQKICAgIGRldmljZXMgaGVyZSwgd2UgcHJldGVuZCB0byBzdXBwb3J0IGEgc2luZ2xlLCBmYWtlIGRldmljZSB0eXBlLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGNoaXBfaWRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0dmF1ZGlvX2lkW10gPSB7CiAJeyAidHZhdWRpbyIsIDAgfSwKIAl7IH0KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgY2hpcF9pZCk7CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHZhdWRpb19pZCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKIAkubmFtZSA9ICJ0dmF1ZGlvIiwKIAkuZHJpdmVyaWQgPSBJMkNfRFJJVkVSSURfVFZBVURJTywKLQkuY29tbWFuZCA9IGNoaXBfY29tbWFuZCwKLQkucHJvYmUgPSBjaGlwX3Byb2JlLAotCS5yZW1vdmUgPSBjaGlwX3JlbW92ZSwKLQkubGVnYWN5X3Byb2JlID0gY2hpcF9sZWdhY3lfcHJvYmUsCi0JLmlkX3RhYmxlID0gY2hpcF9pZCwKKwkuY29tbWFuZCA9IHR2YXVkaW9fY29tbWFuZCwKKwkucHJvYmUgPSB0dmF1ZGlvX3Byb2JlLAorCS5yZW1vdmUgPSB0dmF1ZGlvX3JlbW92ZSwKKwkubGVnYWN5X3Byb2JlID0gdHZhdWRpb19sZWdhY3lfcHJvYmUsCisJLmlkX3RhYmxlID0gdHZhdWRpb19pZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOWFhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYworICoKKyAqIFRJIFRWUDUxNDYvNDcgZGVjb2RlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKiBBdXRob3I6IFZhaWJoYXYgSGlyZW1hdGggPGh2YWliaGF2QHRpLmNvbT4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU2l2YXJhaiBSIDxzaXZhcmFqQHRpLmNvbT4KKyAqICAgICBCcmlqZXNoIFIgSmFkYXYgPGJyaWplc2guakB0aS5jb20+CisgKiAgICAgSGFyZGlrIFNoYWggPGhhcmRpay5zaGFoQHRpLmNvbT4KKyAqICAgICBNYW5qdW5hdGggSGFkbGkgPG1yaEB0aS5jb20+CisgKiAgICAgS2FyaWNoZXJpIE11cmFsaWRoYXJhbiA8bS1rYXJpY2hlcmkyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pbnQtZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdHZwNTE0eC5oPgorCisjaW5jbHVkZSAidHZwNTE0eF9yZWdzLmgiCisKKy8qIE1vZHVsZSBOYW1lICovCisjZGVmaW5lIFRWUDUxNFhfTU9EVUxFX05BTUUJCSJ0dnA1MTR4IgorCisvKiBQcml2YXRlIG1hY3JvcyBmb3IgVFZQICovCisjZGVmaW5lIEkyQ19SRVRSWV9DT1VOVCAgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIExPQ0tfUkVUUllfQ09VTlQgICAgICAgICAgICAgICAgKDUpCisjZGVmaW5lIExPQ0tfUkVUUllfREVMQVkgICAgICAgICAgICAgICAgKDIwMCkKKworLyogRGVidWcgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0xKSIpOworCisjZGVmaW5lIGR1bXBfcmVnKGNsaWVudCwgcmVnLCB2YWwpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJdmFsID0gdHZwNTE0eF9yZWFkX3JlZyhjbGllbnQsIHJlZyk7CQlcCisJCXY0bF9pbmZvKGNsaWVudCwgIlJlZygweCUuMlgpOiAweCUuMlhcbiIsIHJlZywgdmFsKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogZW51bSB0dnA1MTR4X3N0ZCAtIGVudW0gZm9yIHN1cHBvcnRlZCBzdGFuZGFyZHMKKyAqLworZW51bSB0dnA1MTR4X3N0ZCB7CisJU1REX05UU0NfTUogPSAwLAorCVNURF9QQUxfQkRHSElOLAorCVNURF9JTlZBTElECit9OworCisvKioKKyAqIGVudW0gdHZwNTE0eF9zdGF0ZSAtIGVudW0gZm9yIGRpZmZlcmVudCBkZWNvZGVyIHN0YXRlcworICovCitlbnVtIHR2cDUxNHhfc3RhdGUgeworCVNUQVRFX05PVF9ERVRFQ1RFRCwKKwlTVEFURV9ERVRFQ1RFRAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdHZwNTE0eF9zdGRfaW5mbyAtIFN0cnVjdHVyZSB0byBzdG9yZSBzdGFuZGFyZCBpbmZvcm1hdGlvbnMKKyAqIEB3aWR0aDogTGluZSB3aWR0aCBpbiBwaXhlbHMKKyAqIEBoZWlnaHQ6TnVtYmVyIG9mIGFjdGl2ZSBsaW5lcworICogQHZpZGVvX3N0ZDogVmFsdWUgdG8gd3JpdGUgaW4gUkVHX1ZJREVPX1NURCByZWdpc3RlcgorICogQHN0YW5kYXJkOiB2NGwyIHN0YW5kYXJkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgdHZwNTE0eF9zdGRfaW5mbyB7CisJdW5zaWduZWQgbG9uZyB3aWR0aDsKKwl1bnNpZ25lZCBsb25nIGhlaWdodDsKKwl1OCB2aWRlb19zdGQ7CisJc3RydWN0IHY0bDJfc3RhbmRhcmQgc3RhbmRhcmQ7Cit9OworCisvKioKKyAqIHN0cnVjdCB0dnA1MTR4X2RlY29kZWQgLSBUVlA1MTQ2LzQ3IGRlY29kZXIgb2JqZWN0CisgKiBAdjRsMl9pbnRfZGV2aWNlOiBTbGF2ZSBoYW5kbGUKKyAqIEBwZGF0YTogQm9hcmQgc3BlY2lmaWMKKyAqIEBjbGllbnQ6IEkyQyBjbGllbnQgZGF0YQorICogQGlkOiBFbnRyeSBmcm9tIEkyQyB0YWJsZQorICogQHZlcjogQ2hpcCB2ZXJzaW9uCisgKiBAc3RhdGU6IFRWUDUxNDYvNDcgZGVjb2RlciBzdGF0ZSAtIGRldGVjdGVkIG9yIG5vdC1kZXRlY3RlZAorICogQHBpeDogQ3VycmVudCBwaXhlbCBmb3JtYXQKKyAqIEBudW1fZm10czogTnVtYmVyIG9mIGZvcm1hdHMKKyAqIEBmbXRfbGlzdDogRm9ybWF0IGxpc3QKKyAqIEBjdXJyZW50X3N0ZDogQ3VycmVudCBzdGFuZGFyZAorICogQG51bV9zdGRzOiBOdW1iZXIgb2Ygc3RhbmRhcmRzCisgKiBAc3RkX2xpc3Q6IFN0YW5kYXJkcyBsaXN0CisgKiBAcm91dGU6IGlucHV0IGFuZCBvdXRwdXQgcm91dGluZyBhdCBjaGlwIGxldmVsCisgKi8KK3N0cnVjdCB0dnA1MTR4X2RlY29kZXIgeworCXN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnY0bDJfaW50X2RldmljZTsKKwljb25zdCBzdHJ1Y3QgdHZwNTE0eF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkOworCisJaW50IHZlcjsKKwllbnVtIHR2cDUxNHhfc3RhdGUgc3RhdGU7CisKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeDsKKwlpbnQgbnVtX2ZtdHM7CisJY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10X2xpc3Q7CisKKwllbnVtIHR2cDUxNHhfc3RkIGN1cnJlbnRfc3RkOworCWludCBudW1fc3RkczsKKwlzdHJ1Y3QgdHZwNTE0eF9zdGRfaW5mbyAqc3RkX2xpc3Q7CisKKwlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOworfTsKKworLyogVFZQNTE0eCBkZWZhdWx0IHJlZ2lzdGVyIHZhbHVlcyAqLworc3RhdGljIHN0cnVjdCB0dnA1MTR4X3JlZyB0dnA1MTR4X3JlZ19saXN0W10gPSB7CisJe1RPS19XUklURSwgUkVHX0lOUFVUX1NFTCwgMHgwNX0sCS8qIENvbXBvc2l0ZSBzZWxlY3RlZCAqLworCXtUT0tfV1JJVEUsIFJFR19BRkVfR0FJTl9DVFJMLCAweDBGfSwKKwl7VE9LX1dSSVRFLCBSRUdfVklERU9fU1RELCAweDAwfSwJLyogQXV0byBtb2RlICovCisJe1RPS19XUklURSwgUkVHX09QRVJBVElPTl9NT0RFLCAweDAwfSwKKwl7VE9LX1NLSVAsIFJFR19BVVRPU1dJVENIX01BU0ssIDB4M0Z9LAorCXtUT0tfV1JJVEUsIFJFR19DT0xPUl9LSUxMRVIsIDB4MTB9LAorCXtUT0tfV1JJVEUsIFJFR19MVU1BX0NPTlRST0wxLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfTFVNQV9DT05UUk9MMiwgMHgwMH0sCisJe1RPS19XUklURSwgUkVHX0xVTUFfQ09OVFJPTDMsIDB4MDJ9LAorCXtUT0tfV1JJVEUsIFJFR19CUklHSFRORVNTLCAweDgwfSwKKwl7VE9LX1dSSVRFLCBSRUdfQ09OVFJBU1QsIDB4ODB9LAorCXtUT0tfV1JJVEUsIFJFR19TQVRVUkFUSU9OLCAweDgwfSwKKwl7VE9LX1dSSVRFLCBSRUdfSFVFLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfQ0hST01BX0NPTlRST0wxLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfQ0hST01BX0NPTlRST0wyLCAweDBFfSwKKwl7VE9LX1NLSVAsIDB4MEYsIDB4MDB9LAkvKiBSZXNlcnZlZCAqLworCXtUT0tfV1JJVEUsIFJFR19DT01QX1BSX1NBVFVSQVRJT04sIDB4ODB9LAorCXtUT0tfV1JJVEUsIFJFR19DT01QX1lfQ09OVFJBU1QsIDB4ODB9LAorCXtUT0tfV1JJVEUsIFJFR19DT01QX1BCX1NBVFVSQVRJT04sIDB4ODB9LAorCXtUT0tfU0tJUCwgMHgxMywgMHgwMH0sCS8qIFJlc2VydmVkICovCisJe1RPS19XUklURSwgUkVHX0NPTVBfWV9CUklHSFRORVNTLCAweDgwfSwKKwl7VE9LX1NLSVAsIDB4MTUsIDB4MDB9LAkvKiBSZXNlcnZlZCAqLworCXtUT0tfU0tJUCwgUkVHX0FWSURfU1RBUlRfUElYRUxfTFNCLCAweDU1fSwJLyogTlRTQyB0aW1pbmcgKi8KKwl7VE9LX1NLSVAsIFJFR19BVklEX1NUQVJUX1BJWEVMX01TQiwgMHgwMH0sCisJe1RPS19TS0lQLCBSRUdfQVZJRF9TVE9QX1BJWEVMX0xTQiwgMHgyNX0sCisJe1RPS19TS0lQLCBSRUdfQVZJRF9TVE9QX1BJWEVMX01TQiwgMHgwM30sCisJe1RPS19TS0lQLCBSRUdfSFNZTkNfU1RBUlRfUElYRUxfTFNCLCAweDAwfSwJLyogTlRTQyB0aW1pbmcgKi8KKwl7VE9LX1NLSVAsIFJFR19IU1lOQ19TVEFSVF9QSVhFTF9NU0IsIDB4MDB9LAorCXtUT0tfU0tJUCwgUkVHX0hTWU5DX1NUT1BfUElYRUxfTFNCLCAweDQwfSwKKwl7VE9LX1NLSVAsIFJFR19IU1lOQ19TVE9QX1BJWEVMX01TQiwgMHgwMH0sCisJe1RPS19TS0lQLCBSRUdfVlNZTkNfU1RBUlRfTElORV9MU0IsIDB4MDR9LAkvKiBOVFNDIHRpbWluZyAqLworCXtUT0tfU0tJUCwgUkVHX1ZTWU5DX1NUQVJUX0xJTkVfTVNCLCAweDAwfSwKKwl7VE9LX1NLSVAsIFJFR19WU1lOQ19TVE9QX0xJTkVfTFNCLCAweDA3fSwKKwl7VE9LX1NLSVAsIFJFR19WU1lOQ19TVE9QX0xJTkVfTVNCLCAweDAwfSwKKwl7VE9LX1NLSVAsIFJFR19WQkxLX1NUQVJUX0xJTkVfTFNCLCAweDAxfSwJLyogTlRTQyB0aW1pbmcgKi8KKwl7VE9LX1NLSVAsIFJFR19WQkxLX1NUQVJUX0xJTkVfTVNCLCAweDAwfSwKKwl7VE9LX1NLSVAsIFJFR19WQkxLX1NUT1BfTElORV9MU0IsIDB4MTV9LAorCXtUT0tfU0tJUCwgUkVHX1ZCTEtfU1RPUF9MSU5FX01TQiwgMHgwMH0sCisJe1RPS19TS0lQLCAweDI2LCAweDAwfSwJLyogUmVzZXJ2ZWQgKi8KKwl7VE9LX1NLSVAsIDB4MjcsIDB4MDB9LAkvKiBSZXNlcnZlZCAqLworCXtUT0tfU0tJUCwgUkVHX0ZBU1RfU1dUSUNIX0NPTlRST0wsIDB4Q0N9LAorCXtUT0tfU0tJUCwgMHgyOSwgMHgwMH0sCS8qIFJlc2VydmVkICovCisJe1RPS19TS0lQLCBSRUdfRkFTVF9TV1RJQ0hfU0NBUlRfREVMQVksIDB4MDB9LAorCXtUT0tfU0tJUCwgMHgyQiwgMHgwMH0sCS8qIFJlc2VydmVkICovCisJe1RPS19TS0lQLCBSRUdfU0NBUlRfREVMQVksIDB4MDB9LAorCXtUT0tfU0tJUCwgUkVHX0NUSV9ERUxBWSwgMHgwMH0sCisJe1RPS19TS0lQLCBSRUdfQ1RJX0NPTlRST0wsIDB4MDB9LAorCXtUT0tfU0tJUCwgMHgyRiwgMHgwMH0sCS8qIFJlc2VydmVkICovCisJe1RPS19TS0lQLCAweDMwLCAweDAwfSwJLyogUmVzZXJ2ZWQgKi8KKwl7VE9LX1NLSVAsIDB4MzEsIDB4MDB9LAkvKiBSZXNlcnZlZCAqLworCXtUT0tfV1JJVEUsIFJFR19TWU5DX0NPTlRST0wsIDB4MDB9LAkvKiBIUywgVlMgYWN0aXZlIGhpZ2ggKi8KKwl7VE9LX1dSSVRFLCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjEsIDB4MDB9LAkvKiAxMC1iaXQgQlQuNjU2ICovCisJe1RPS19XUklURSwgUkVHX09VVFBVVF9GT1JNQVRURVIyLCAweDExfSwJLyogRW5hYmxlIGNsayAmIGRhdGEgKi8KKwl7VE9LX1dSSVRFLCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjMsIDB4RUV9LAkvKiBFbmFibGUgQVZJRCAmIEZMRCAqLworCXtUT0tfV1JJVEUsIFJFR19PVVRQVVRfRk9STUFUVEVSNCwgMHhBRn0sCS8qIEVuYWJsZSBWUyAmIEhTICovCisJe1RPS19XUklURSwgUkVHX09VVFBVVF9GT1JNQVRURVI1LCAweEZGfSwKKwl7VE9LX1dSSVRFLCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjYsIDB4RkZ9LAorCXtUT0tfV1JJVEUsIFJFR19DTEVBUl9MT1NUX0xPQ0ssIDB4MDF9LAkvKiBDbGVhciBzdGF0dXMgKi8KKwl7VE9LX1RFUk0sIDAsIDB9LAorfTsKKworLyogTGlzdCBvZiBpbWFnZSBmb3JtYXRzIHN1cHBvcnRlZCBieSBUVlA1MTQ2LzQ3IGRlY29kZXIKKyAqIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgOCBiaXQgbW9kZSBvbmx5LCBidXQgY2FuIGJlCisgKiBleHRlbmRlZCB0byAxMC8yMCBiaXQgbW9kZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZtdGRlc2MgdHZwNTE0eF9mbXRfbGlzdFtdID0geworCXsKKwkgLmluZGV4ID0gMCwKKwkgLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJIC5mbGFncyA9IDAsCisJIC5kZXNjcmlwdGlvbiA9ICI4LWJpdCBVWVZZIDQ6MjoyIEZvcm1hdCIsCisJIC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZLAorCX0sCit9OworCisvKgorICogU3VwcG9ydGVkIHN0YW5kYXJkcyAtCisgKgorICogQ3VycmVudGx5IHN1cHBvcnRzIHR3byBzdGFuZGFyZHMgb25seSwgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgcmVzdCBvZiB0aGUKKyAqIG1vZGVzLCBsaWtlIFNFQ0FNLCBldGMuLi4KKyAqLworc3RhdGljIHN0cnVjdCB0dnA1MTR4X3N0ZF9pbmZvIHR2cDUxNHhfc3RkX2xpc3RbXSA9IHsKKwkvKiBTdGFuZGFyZDogU1REX05UU0NfTUogKi8KKwlbU1REX05UU0NfTUpdID0geworCSAud2lkdGggPSBOVFNDX05VTV9BQ1RJVkVfUElYRUxTLAorCSAuaGVpZ2h0ID0gTlRTQ19OVU1fQUNUSVZFX0xJTkVTLAorCSAudmlkZW9fc3RkID0gVklERU9fU1REX05UU0NfTUpfQklULAorCSAuc3RhbmRhcmQgPSB7CisJCSAgICAgIC5pbmRleCA9IDAsCisJCSAgICAgIC5pZCA9IFY0TDJfU1REX05UU0MsCisJCSAgICAgIC5uYW1lID0gIk5UU0MiLAorCQkgICAgICAuZnJhbWVwZXJpb2QgPSB7MTAwMSwgMzAwMDB9LAorCQkgICAgICAuZnJhbWVsaW5lcyA9IDUyNQorCQkgICAgIH0sCisJLyogU3RhbmRhcmQ6IFNURF9QQUxfQkRHSElOICovCisJfSwKKwlbU1REX1BBTF9CREdISU5dID0geworCSAud2lkdGggPSBQQUxfTlVNX0FDVElWRV9QSVhFTFMsCisJIC5oZWlnaHQgPSBQQUxfTlVNX0FDVElWRV9MSU5FUywKKwkgLnZpZGVvX3N0ZCA9IFZJREVPX1NURF9QQUxfQkRHSElOX0JJVCwKKwkgLnN0YW5kYXJkID0geworCQkgICAgICAuaW5kZXggPSAxLAorCQkgICAgICAuaWQgPSBWNEwyX1NURF9QQUwsCisJCSAgICAgIC5uYW1lID0gIlBBTCIsCisJCSAgICAgIC5mcmFtZXBlcmlvZCA9IHsxLCAyNX0sCisJCSAgICAgIC5mcmFtZWxpbmVzID0gNjI1CisJCSAgICAgfSwKKwl9LAorCS8qIFN0YW5kYXJkOiBuZWVkIHRvIGFkZCBmb3IgYWRkaXRpb25hbCBzdGFuZGFyZCAqLworfTsKKy8qCisgKiBDb250cm9sIHN0cnVjdHVyZSBmb3IgQXV0byBHYWluCisgKiAgICAgVGhpcyBpcyB0ZW1wb3JhcnkgZGF0YSwgd2lsbCBnZXQgcmVwbGFjZWQgb25jZQorICogICAgIHY0bDJfY3RybF9xdWVyeV9maWxsIHN1cHBvcnRzIGl0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIHR2cDUxNHhfYXV0b2dhaW5fY3RybCA9IHsKKwkuaWQgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkubmFtZSA9ICJHYWluLCBBdXRvbWF0aWMiLAorCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubWluaW11bSA9IDAsCisJLm1heGltdW0gPSAxLAorCS5zdGVwID0gMSwKKwkuZGVmYXVsdF92YWx1ZSA9IDEsCit9OworCisvKgorICogUmVhZCBhIHZhbHVlIGZyb20gYSByZWdpc3RlciBpbiBhbiBUVlA1MTQ2LzQ3IGRlY29kZXIgZGV2aWNlLgorICogUmV0dXJucyB2YWx1ZSByZWFkIGlmIHN1Y2Nlc3NmdWwsIG9yIG5vbi16ZXJvICgtMSkgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHR2cDUxNHhfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWludCBlcnI7CisJaW50IHJldHJ5ID0gMDsKK3JlYWRfYWdhaW46CisKKwllcnIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChlcnIgPT0gLTEpIHsKKwkJaWYgKHJldHJ5IDw9IEkyQ19SRVRSWV9DT1VOVCkgeworCQkJdjRsX3dhcm4oY2xpZW50LCAiUmVhZDogcmV0cnkgLi4uICVkXG4iLCByZXRyeSk7CisJCQlyZXRyeSsrOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQkJZ290byByZWFkX2FnYWluOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFdyaXRlIGEgdmFsdWUgdG8gYSByZWdpc3RlciBpbiBhbiBUVlA1MTQ2LzQ3IGRlY29kZXIgZGV2aWNlLgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0dnA1MTR4X3dyaXRlX3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgZXJyOworCWludCByZXRyeSA9IDA7Cit3cml0ZV9hZ2FpbjoKKworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCk7CisJaWYgKGVycikgeworCQlpZiAocmV0cnkgPD0gSTJDX1JFVFJZX0NPVU5UKSB7CisJCQl2NGxfd2FybihjbGllbnQsICJXcml0ZTogcmV0cnkgLi4uICVkXG4iLCByZXRyeSk7CisJCQlyZXRyeSsrOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCQkJZ290byB3cml0ZV9hZ2FpbjsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiB0dnA1MTR4X3dyaXRlX3JlZ3MgOiBJbml0aWFsaXplcyBhIGxpc3Qgb2YgVFZQNTE0Ni80NyByZWdpc3RlcnMKKyAqCQlpZiB0b2tlbiBpcyBUT0tfVEVSTSwgdGhlbiBlbnRpcmUgd3JpdGUgb3BlcmF0aW9uIHRlcm1pbmF0ZXMKKyAqCQlpZiB0b2tlbiBpcyBUT0tfREVMQVksIHRoZW4gYSBkZWxheSBvZiAndmFsJyBtc2VjIGlzIGludHJvZHVjZWQKKyAqCQlpZiB0b2tlbiBpcyBUT0tfU0tJUCwgdGhlbiB0aGUgcmVnaXN0ZXIgd3JpdGUgaXMgc2tpcHBlZAorICoJCWlmIHRva2VuIGlzIFRPS19XUklURSwgdGhlbiB0aGUgcmVnaXN0ZXIgd3JpdGUgaXMgcGVyZm9ybWVkCisgKgorICogcmVnbGlzdCAtIGxpc3Qgb2YgcmVnaXN0ZXJzIHRvIGJlIHdyaXR0ZW4KKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBub24temVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdHZwNTE0eF93cml0ZV9yZWdzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdHZwNTE0eF9yZWcgcmVnbGlzdFtdKQoreworCWludCBlcnI7CisJY29uc3Qgc3RydWN0IHR2cDUxNHhfcmVnICpuZXh0ID0gcmVnbGlzdDsKKworCWZvciAoOyBuZXh0LT50b2tlbiAhPSBUT0tfVEVSTTsgbmV4dCsrKSB7CisJCWlmIChuZXh0LT50b2tlbiA9PSBUT0tfREVMQVkpIHsKKwkJCW1zbGVlcChuZXh0LT52YWwpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobmV4dC0+dG9rZW4gPT0gVE9LX1NLSVApCisJCQljb250aW51ZTsKKworCQllcnIgPSB0dnA1MTR4X3dyaXRlX3JlZyhjbGllbnQsIG5leHQtPnJlZywgKHU4KSBuZXh0LT52YWwpOworCQlpZiAoZXJyKSB7CisJCQl2NGxfZXJyKGNsaWVudCwgIldyaXRlIGZhaWxlZC4gRXJyWyVkXVxuIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0dnA1MTR4X2dldF9jdXJyZW50X3N0ZDoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhbmRhcmQgZGV0ZWN0ZWQgYnkgVFZQNTE0Ni80NworICovCitzdGF0aWMgZW51bSB0dnA1MTR4X3N0ZCB0dnA1MTR4X2dldF9jdXJyZW50X3N0ZChzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyCisJCQkJCQkqZGVjb2RlcikKK3sKKwl1OCBzdGQsIHN0ZF9zdGF0dXM7CisKKwlzdGQgPSB0dnA1MTR4X3JlYWRfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1ZJREVPX1NURCk7CisJaWYgKChzdGQgJiBWSURFT19TVERfTUFTSykgPT0gVklERU9fU1REX0FVVE9fU1dJVENIX0JJVCkgeworCQkvKiB1c2UgdGhlIHN0YW5kYXJkIHN0YXR1cyByZWdpc3RlciAqLworCQlzdGRfc3RhdHVzID0gdHZwNTE0eF9yZWFkX3JlZyhkZWNvZGVyLT5jbGllbnQsCisJCQkJUkVHX1ZJREVPX1NURF9TVEFUVVMpOworCX0gZWxzZQorCQlzdGRfc3RhdHVzID0gc3RkOwkvKiB1c2UgdGhlIHN0YW5kYXJkIHJlZ2lzdGVyIGl0c2VsZiAqLworCisJc3dpdGNoIChzdGRfc3RhdHVzICYgVklERU9fU1REX01BU0spIHsKKwljYXNlIFZJREVPX1NURF9OVFNDX01KX0JJVDoKKwkJcmV0dXJuIFNURF9OVFNDX01KOworCisJY2FzZSBWSURFT19TVERfUEFMX0JER0hJTl9CSVQ6CisJCXJldHVybiBTVERfUEFMX0JER0hJTjsKKworCWRlZmF1bHQ6CisJCXJldHVybiBTVERfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gU1REX0lOVkFMSUQ7Cit9CisKKy8qCisgKiBUVlA1MTQ2LzQ3IHJlZ2lzdGVyIGR1bXAgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgdHZwNTE0eF9yZWdfZHVtcChzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyKQoreworCXU4IHZhbHVlOworCisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfSU5QVVRfU0VMLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQUZFX0dBSU5fQ1RSTCwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1ZJREVPX1NURCwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX09QRVJBVElPTl9NT0RFLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQ09MT1JfS0lMTEVSLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfTFVNQV9DT05UUk9MMSwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0xVTUFfQ09OVFJPTDIsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19MVU1BX0NPTlRST0wzLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQlJJR0hUTkVTUywgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTlRSQVNULCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfU0FUVVJBVElPTiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0hVRSwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NIUk9NQV9DT05UUk9MMSwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NIUk9NQV9DT05UUk9MMiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTVBfUFJfU0FUVVJBVElPTiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTVBfWV9DT05UUkFTVCwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTVBfUEJfU0FUVVJBVElPTiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTVBfWV9CUklHSFRORVNTLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQVZJRF9TVEFSVF9QSVhFTF9MU0IsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19BVklEX1NUQVJUX1BJWEVMX01TQiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0FWSURfU1RPUF9QSVhFTF9MU0IsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19BVklEX1NUT1BfUElYRUxfTVNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfSFNZTkNfU1RBUlRfUElYRUxfTFNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfSFNZTkNfU1RBUlRfUElYRUxfTVNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfSFNZTkNfU1RPUF9QSVhFTF9MU0IsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19IU1lOQ19TVE9QX1BJWEVMX01TQiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1ZTWU5DX1NUQVJUX0xJTkVfTFNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfVlNZTkNfU1RBUlRfTElORV9NU0IsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19WU1lOQ19TVE9QX0xJTkVfTFNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfVlNZTkNfU1RPUF9MSU5FX01TQiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1ZCTEtfU1RBUlRfTElORV9MU0IsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19WQkxLX1NUQVJUX0xJTkVfTVNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfVkJMS19TVE9QX0xJTkVfTFNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfVkJMS19TVE9QX0xJTkVfTVNCLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfU1lOQ19DT05UUk9MLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjEsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19PVVRQVVRfRk9STUFUVEVSMiwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX09VVFBVVF9GT1JNQVRURVIzLCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjQsIHZhbHVlKTsKKwlkdW1wX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19PVVRQVVRfRk9STUFUVEVSNSwgdmFsdWUpOworCWR1bXBfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX09VVFBVVF9GT1JNQVRURVI2LCB2YWx1ZSk7CisJZHVtcF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQ0xFQVJfTE9TVF9MT0NLLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIFRWUDUxNDYvNDcgd2l0aCB0aGUgY3VycmVudCByZWdpc3RlciBzZXR0aW5ncworICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB0dnA1MTR4X2NvbmZpZ3VyZShzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyKQoreworCWludCBlcnI7CisKKwkvKiBjb21tb24gcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gKi8KKwllcnIgPQorCSAgICB0dnA1MTR4X3dyaXRlX3JlZ3MoZGVjb2Rlci0+Y2xpZW50LCB0dnA1MTR4X3JlZ19saXN0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGRlYnVnKQorCQl0dnA1MTR4X3JlZ19kdW1wKGRlY29kZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXRlY3QgaWYgYW4gdHZwNTE0eCBpcyBwcmVzZW50LCBhbmQgaWYgc28gd2hpY2ggcmV2aXNpb24uCisgKiBBIGRldmljZSBpcyBjb25zaWRlcmVkIHRvIGJlIGRldGVjdGVkIGlmIHRoZSBjaGlwIElEIChMU0IgYW5kIE1TQikKKyAqIHJlZ2lzdGVycyBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgorICogQW55IHZhbHVlIG9mIHRoZSByb20gdmVyc2lvbiByZWdpc3RlciBpcyBhY2NlcHRlZC4KKyAqIFJldHVybnMgRU5PREVWIGVycm9yIG51bWJlciBpZiBubyBkZXZpY2UgaXMgZGV0ZWN0ZWQsIG9yIHplcm8KKyAqIGlmIGEgZGV2aWNlIGlzIGRldGVjdGVkLgorICovCitzdGF0aWMgaW50IHR2cDUxNHhfZGV0ZWN0KHN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIpCit7CisJdTggY2hpcF9pZF9tc2IsIGNoaXBfaWRfbHNiLCByb21fdmVyOworCisJY2hpcF9pZF9tc2IgPSB0dnA1MTR4X3JlYWRfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NISVBfSURfTVNCKTsKKwljaGlwX2lkX2xzYiA9IHR2cDUxNHhfcmVhZF9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQ0hJUF9JRF9MU0IpOworCXJvbV92ZXIgPSB0dnA1MTR4X3JlYWRfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1JPTV9WRVJTSU9OKTsKKworCXY0bF9kYmcoMSwgZGVidWcsIGRlY29kZXItPmNsaWVudCwKKwkJICJjaGlwIGlkIGRldGVjdGVkIG1zYjoweCV4IGxzYjoweCV4IHJvbSB2ZXJzaW9uOjB4JXhcbiIsCisJCSBjaGlwX2lkX21zYiwgY2hpcF9pZF9sc2IsIHJvbV92ZXIpOworCWlmICgoY2hpcF9pZF9tc2IgIT0gVFZQNTE0WF9DSElQX0lEX01TQikKKwkJfHwgKChjaGlwX2lkX2xzYiAhPSBUVlA1MTQ2X0NISVBfSURfTFNCKQorCQkmJiAoY2hpcF9pZF9sc2IgIT0gVFZQNTE0N19DSElQX0lEX0xTQikpKSB7CisJCS8qIFdlIGRpZG4ndCByZWFkIHRoZSB2YWx1ZXMgd2UgZXhwZWN0ZWQsIHNvIHRoaXMgbXVzdCBub3QgYmUKKwkJICogYW4gVFZQNTE0Ni80Ny4KKwkJICovCisJCXY0bF9lcnIoZGVjb2Rlci0+Y2xpZW50LAorCQkJImNoaXAgaWQgbWlzbWF0Y2ggbXNiOjB4JXggbHNiOjB4JXhcbiIsCisJCQljaGlwX2lkX21zYiwgY2hpcF9pZF9sc2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZWNvZGVyLT52ZXIgPSByb21fdmVyOworCWRlY29kZXItPnN0YXRlID0gU1RBVEVfREVURUNURUQ7CisKKwl2NGxfaW5mbyhkZWNvZGVyLT5jbGllbnQsCisJCQkiJXMgZm91bmQgYXQgMHgleCAoJXMpXG4iLCBkZWNvZGVyLT5jbGllbnQtPm5hbWUsCisJCQlkZWNvZGVyLT5jbGllbnQtPmFkZHIgPDwgMSwKKwkJCWRlY29kZXItPmNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb2xsb3dpbmcgYXJlIGRlY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieQorICogVFZQNTE0Ni80NyBkZWNvZGVyIGRyaXZlci4KKyAqLworCisvKioKKyAqIGlvY3RsX3F1ZXJ5c3RkIC0gVjRMMiBkZWNvZGVyIGludGVyZmFjZSBoYW5kbGVyIGZvciBWSURJT0NfUVVFUllTVEQgaW9jdGwKKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQHN0ZF9pZDogc3RhbmRhcmQgVjRMMiBzdGRfaWQgaW9jdGwgZW51bQorICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhbmRhcmQgZGV0ZWN0ZWQgYnkgVFZQNTE0Ni80Ny4gSWYgbm8gYWN0aXZlIGlucHV0IGlzCisgKiBkZXRlY3RlZCwgcmV0dXJucyAtRUlOVkFMCisgKi8KK3N0YXRpYyBpbnQgaW9jdGxfcXVlcnlzdGQoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgdjRsMl9zdGRfaWQgKnN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwllbnVtIHR2cDUxNHhfc3RkIGN1cnJlbnRfc3RkOworCWVudW0gdHZwNTE0eF9pbnB1dCBpbnB1dF9zZWw7CisJdTggc3luY19sb2NrX3N0YXR1cywgbG9ja19tYXNrOworCisJaWYgKHN0ZF9pZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGdldCB0aGUgY3VycmVudCBzdGFuZGFyZCAqLworCWN1cnJlbnRfc3RkID0gdHZwNTE0eF9nZXRfY3VycmVudF9zdGQoZGVjb2Rlcik7CisJaWYgKGN1cnJlbnRfc3RkID09IFNURF9JTlZBTElEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlucHV0X3NlbCA9IGRlY29kZXItPnJvdXRlLmlucHV0OworCisJc3dpdGNoIChpbnB1dF9zZWwpIHsKKwljYXNlIElOUFVUX0NWQlNfVkkxQToKKwljYXNlIElOUFVUX0NWQlNfVkkxQjoKKwljYXNlIElOUFVUX0NWQlNfVkkxQzoKKwljYXNlIElOUFVUX0NWQlNfVkkyQToKKwljYXNlIElOUFVUX0NWQlNfVkkyQjoKKwljYXNlIElOUFVUX0NWQlNfVkkyQzoKKwljYXNlIElOUFVUX0NWQlNfVkkzQToKKwljYXNlIElOUFVUX0NWQlNfVkkzQjoKKwljYXNlIElOUFVUX0NWQlNfVkkzQzoKKwljYXNlIElOUFVUX0NWQlNfVkk0QToKKwkJbG9ja19tYXNrID0gU1RBVFVTX0NMUl9TVUJDQVJfTE9DS19CSVQgfAorCQkJU1RBVFVTX0hPUlpfU1lOQ19MT0NLX0JJVCB8CisJCQlTVEFUVVNfVklSVF9TWU5DX0xPQ0tfQklUOworCQlicmVhazsKKworCWNhc2UgSU5QVVRfU1ZJREVPX1ZJMkFfVkkxQToKKwljYXNlIElOUFVUX1NWSURFT19WSTJCX1ZJMUI6CisJY2FzZSBJTlBVVF9TVklERU9fVkkyQ19WSTFDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJMkFfVkkzQToKKwljYXNlIElOUFVUX1NWSURFT19WSTJCX1ZJM0I6CisJY2FzZSBJTlBVVF9TVklERU9fVkkyQ19WSTNDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJNEFfVkkxQToKKwljYXNlIElOUFVUX1NWSURFT19WSTRBX1ZJMUI6CisJY2FzZSBJTlBVVF9TVklERU9fVkk0QV9WSTFDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJNEFfVkkzQToKKwljYXNlIElOUFVUX1NWSURFT19WSTRBX1ZJM0I6CisJY2FzZSBJTlBVVF9TVklERU9fVkk0QV9WSTNDOgorCQlsb2NrX21hc2sgPSBTVEFUVVNfSE9SWl9TWU5DX0xPQ0tfQklUIHwKKwkJCVNUQVRVU19WSVJUX1NZTkNfTE9DS19CSVQ7CisJCWJyZWFrOworCQkvKk5lZWQgdG8gYWRkIG90aGVyIGludGVyZmFjZXMqLworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBjaGVjayB3aGV0aGVyIHNpZ25hbCBpcyBsb2NrZWQgKi8KKwlzeW5jX2xvY2tfc3RhdHVzID0gdHZwNTE0eF9yZWFkX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19TVEFUVVMxKTsKKwlpZiAobG9ja19tYXNrICE9IChzeW5jX2xvY2tfc3RhdHVzICYgbG9ja19tYXNrKSkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vIGlucHV0IGRldGVjdGVkICovCisKKwlkZWNvZGVyLT5jdXJyZW50X3N0ZCA9IGN1cnJlbnRfc3RkOworCSpzdGRfaWQgPSBkZWNvZGVyLT5zdGRfbGlzdFtjdXJyZW50X3N0ZF0uc3RhbmRhcmQuaWQ7CisKKwl2NGxfZGJnKDEsIGRlYnVnLCBkZWNvZGVyLT5jbGllbnQsICJDdXJyZW50IFNURDogJXMiLAorCQkJZGVjb2Rlci0+c3RkX2xpc3RbY3VycmVudF9zdGRdLnN0YW5kYXJkLm5hbWUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvY3RsX3Nfc3RkIC0gVjRMMiBkZWNvZGVyIGludGVyZmFjZSBoYW5kbGVyIGZvciBWSURJT0NfU19TVEQgaW9jdGwKKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQHN0ZF9pZDogc3RhbmRhcmQgVjRMMiB2NGwyX3N0ZF9pZCBpb2N0bCBlbnVtCisgKgorICogSWYgc3RkX2lkIGlzIHN1cHBvcnRlZCwgc2V0cyB0aGUgcmVxdWVzdGVkIHN0YW5kYXJkLiBPdGhlcndpc2UsIHJldHVybnMKKyAqIC1FSU5WQUwKKyAqLworc3RhdGljIGludCBpb2N0bF9zX3N0ZChzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLCB2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCWludCBlcnIsIGk7CisKKwlpZiAoc3RkX2lkID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGRlY29kZXItPm51bV9zdGRzOyBpKyspCisJCWlmICgqc3RkX2lkICYgZGVjb2Rlci0+c3RkX2xpc3RbaV0uc3RhbmRhcmQuaWQpCisJCQlicmVhazsKKworCWlmICgoaSA9PSBkZWNvZGVyLT5udW1fc3RkcykgfHwgKGkgPT0gU1REX0lOVkFMSUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX1ZJREVPX1NURCwKKwkJCQlkZWNvZGVyLT5zdGRfbGlzdFtpXS52aWRlb19zdGQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZWNvZGVyLT5jdXJyZW50X3N0ZCA9IGk7CisJdHZwNTE0eF9yZWdfbGlzdFtSRUdfVklERU9fU1REXS52YWwgPSBkZWNvZGVyLT5zdGRfbGlzdFtpXS52aWRlb19zdGQ7CisKKwl2NGxfZGJnKDEsIGRlYnVnLCBkZWNvZGVyLT5jbGllbnQsICJTdGFuZGFyZCBzZXQgdG86ICVzIiwKKwkJCWRlY29kZXItPnN0ZF9saXN0W2ldLnN0YW5kYXJkLm5hbWUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvY3RsX3Nfcm91dGluZyAtIFY0TDIgZGVjb2RlciBpbnRlcmZhY2UgaGFuZGxlciBmb3IgVklESU9DX1NfSU5QVVQgaW9jdGwKKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQGluZGV4OiBudW1iZXIgb2YgdGhlIGlucHV0CisgKgorICogSWYgaW5kZXggaXMgdmFsaWQsIHNlbGVjdHMgdGhlIHJlcXVlc3RlZCBpbnB1dC4gT3RoZXJ3aXNlLCByZXR1cm5zIC1FSU5WQUwgaWYKKyAqIHRoZSBpbnB1dCBpcyBub3Qgc3VwcG9ydGVkIG9yIHRoZXJlIGlzIG5vIGFjdGl2ZSBzaWduYWwgcHJlc2VudCBpbiB0aGUKKyAqIHNlbGVjdGVkIGlucHV0LgorICovCitzdGF0aWMgaW50IGlvY3RsX3Nfcm91dGluZyhzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLAorCQkJCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCWludCBlcnI7CisJZW51bSB0dnA1MTR4X2lucHV0IGlucHV0X3NlbDsKKwllbnVtIHR2cDUxNHhfb3V0cHV0IG91dHB1dF9zZWw7CisJZW51bSB0dnA1MTR4X3N0ZCBjdXJyZW50X3N0ZCA9IFNURF9JTlZBTElEOworCXU4IHN5bmNfbG9ja19zdGF0dXMsIGxvY2tfbWFzazsKKwlpbnQgdHJ5X2NvdW50ID0gTE9DS19SRVRSWV9DT1VOVDsKKworCWlmICgoIXJvdXRlKSB8fCAocm91dGUtPmlucHV0ID49IElOUFVUX0lOVkFMSUQpIHx8CisJCQkocm91dGUtPm91dHB1dCA+PSBPVVRQVVRfSU5WQUxJRCkpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbmRleCBvdXQgb2YgYm91bmQgKi8KKworCWlucHV0X3NlbCA9IHJvdXRlLT5pbnB1dDsKKwlvdXRwdXRfc2VsID0gcm91dGUtPm91dHB1dDsKKworCWVyciA9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0lOUFVUX1NFTCwgaW5wdXRfc2VsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJb3V0cHV0X3NlbCB8PSB0dnA1MTR4X3JlYWRfcmVnKGRlY29kZXItPmNsaWVudCwKKwkJCVJFR19PVVRQVVRfRk9STUFUVEVSMSkgJiAweDc7CisJZXJyID0gdHZwNTE0eF93cml0ZV9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfT1VUUFVUX0ZPUk1BVFRFUjEsCisJCQlvdXRwdXRfc2VsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdHZwNTE0eF9yZWdfbGlzdFtSRUdfSU5QVVRfU0VMXS52YWwgPSBpbnB1dF9zZWw7CisJdHZwNTE0eF9yZWdfbGlzdFtSRUdfT1VUUFVUX0ZPUk1BVFRFUjFdLnZhbCA9IG91dHB1dF9zZWw7CisKKwkvKiBDbGVhciBzdGF0dXMgKi8KKwltc2xlZXAoTE9DS19SRVRSWV9ERUxBWSk7CisJZXJyID0KKwkgICAgdHZwNTE0eF93cml0ZV9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQ0xFQVJfTE9TVF9MT0NLLCAweDAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChpbnB1dF9zZWwpIHsKKwljYXNlIElOUFVUX0NWQlNfVkkxQToKKwljYXNlIElOUFVUX0NWQlNfVkkxQjoKKwljYXNlIElOUFVUX0NWQlNfVkkxQzoKKwljYXNlIElOUFVUX0NWQlNfVkkyQToKKwljYXNlIElOUFVUX0NWQlNfVkkyQjoKKwljYXNlIElOUFVUX0NWQlNfVkkyQzoKKwljYXNlIElOUFVUX0NWQlNfVkkzQToKKwljYXNlIElOUFVUX0NWQlNfVkkzQjoKKwljYXNlIElOUFVUX0NWQlNfVkkzQzoKKwljYXNlIElOUFVUX0NWQlNfVkk0QToKKwkJbG9ja19tYXNrID0gU1RBVFVTX0NMUl9TVUJDQVJfTE9DS19CSVQgfAorCQkJU1RBVFVTX0hPUlpfU1lOQ19MT0NLX0JJVCB8CisJCQlTVEFUVVNfVklSVF9TWU5DX0xPQ0tfQklUOworCQlicmVhazsKKworCWNhc2UgSU5QVVRfU1ZJREVPX1ZJMkFfVkkxQToKKwljYXNlIElOUFVUX1NWSURFT19WSTJCX1ZJMUI6CisJY2FzZSBJTlBVVF9TVklERU9fVkkyQ19WSTFDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJMkFfVkkzQToKKwljYXNlIElOUFVUX1NWSURFT19WSTJCX1ZJM0I6CisJY2FzZSBJTlBVVF9TVklERU9fVkkyQ19WSTNDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJNEFfVkkxQToKKwljYXNlIElOUFVUX1NWSURFT19WSTRBX1ZJMUI6CisJY2FzZSBJTlBVVF9TVklERU9fVkk0QV9WSTFDOgorCWNhc2UgSU5QVVRfU1ZJREVPX1ZJNEFfVkkzQToKKwljYXNlIElOUFVUX1NWSURFT19WSTRBX1ZJM0I6CisJY2FzZSBJTlBVVF9TVklERU9fVkk0QV9WSTNDOgorCQlsb2NrX21hc2sgPSBTVEFUVVNfSE9SWl9TWU5DX0xPQ0tfQklUIHwKKwkJCVNUQVRVU19WSVJUX1NZTkNfTE9DS19CSVQ7CisJCWJyZWFrOworCS8qTmVlZCB0byBhZGQgb3RoZXIgaW50ZXJmYWNlcyovCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2hpbGUgKHRyeV9jb3VudC0tID4gMCkgeworCQkvKiBBbGxvdyBkZWNvZGVyIHRvIHN5bmMgdXAgd2l0aCBuZXcgaW5wdXQgKi8KKwkJbXNsZWVwKExPQ0tfUkVUUllfREVMQVkpOworCisJCS8qIGdldCB0aGUgY3VycmVudCBzdGFuZGFyZCBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworCQljdXJyZW50X3N0ZCA9IHR2cDUxNHhfZ2V0X2N1cnJlbnRfc3RkKGRlY29kZXIpOworCQlpZiAoY3VycmVudF9zdGQgPT0gU1REX0lOVkFMSUQpCisJCQljb250aW51ZTsKKworCQlzeW5jX2xvY2tfc3RhdHVzID0gdHZwNTE0eF9yZWFkX3JlZyhkZWNvZGVyLT5jbGllbnQsCisJCQkJUkVHX1NUQVRVUzEpOworCQlpZiAobG9ja19tYXNrID09IChzeW5jX2xvY2tfc3RhdHVzICYgbG9ja19tYXNrKSkKKwkJCWJyZWFrOwkvKiBJbnB1dCBkZXRlY3RlZCAqLworCX0KKworCWlmICgoY3VycmVudF9zdGQgPT0gU1REX0lOVkFMSUQpIHx8ICh0cnlfY291bnQgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWNvZGVyLT5jdXJyZW50X3N0ZCA9IGN1cnJlbnRfc3RkOworCWRlY29kZXItPnJvdXRlLmlucHV0ID0gcm91dGUtPmlucHV0OworCWRlY29kZXItPnJvdXRlLm91dHB1dCA9IHJvdXRlLT5vdXRwdXQ7CisKKwl2NGxfZGJnKDEsIGRlYnVnLCBkZWNvZGVyLT5jbGllbnQsCisJCQkiSW5wdXQgc2V0IHRvOiAlZCwgc3RkIDogJWQiLAorCQkJaW5wdXRfc2VsLCBjdXJyZW50X3N0ZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2N0bF9xdWVyeWN0cmwgLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIFZJRElPQ19RVUVSWUNUUkwgaW9jdGwKKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQHFjdHJsOiBzdGFuZGFyZCBWNEwyIHY0bDJfcXVlcnljdHJsIHN0cnVjdHVyZQorICoKKyAqIElmIHRoZSByZXF1ZXN0ZWQgY29udHJvbCBpcyBzdXBwb3J0ZWQsIHJldHVybnMgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24uCisgKiBPdGhlcndpc2UsIHJldHVybnMgLUVJTlZBTCBpZiB0aGUgY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50Citpb2N0bF9xdWVyeWN0cmwoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmIChxY3RybCA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCS8qIEJyaWdodG5lc3Mgc3VwcG9ydGVkIGlzIHNhbWUgYXMgc3RhbmRhcmQgb25lICgwLTI1NSksCisJCSAqIHNvIG1ha2UgdXNlIG9mIHN0YW5kYXJkIEFQSSBwcm92aWRlZC4KKwkJICovCisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkvKiBTYXR1cmF0aW9uIGFuZCBDb250cmFzdCBzdXBwb3J0ZWQgaXMgLQorCQkgKglDb250cmFzdDogMCAtIDI1NSAoRGVmYXVsdCAtIDEyOCkKKwkJICoJU2F0dXJhdGlvbjogMCAtIDI1NSAoRGVmYXVsdCAtIDEyOCkKKwkJICovCisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDEyOCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQkvKiBIdWUgU3VwcG9ydGVkIGlzIC0KKwkJICoJSHVlIC0gLTE4MCAtICsxODAgKERlZmF1bHQgLSAwLCBTdGVwIC0gKzE4MCkKKwkJICovCisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAtMTgwLCAxODAsIDE4MCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCS8qIEF1dG9nYWluIGlzIGVpdGhlciAwIG9yIDEqLworCQltZW1jcHkocWN0cmwsICZ0dnA1MTR4X2F1dG9nYWluX2N0cmwsCisJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpOworCQllcnIgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGxfZXJyKGRlY29kZXItPmNsaWVudCwKKwkJCSJpbnZhbGlkIGNvbnRyb2wgaWQgJWRcbiIsIHFjdHJsLT5pZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJdjRsX2RiZygxLCBkZWJ1ZywgZGVjb2Rlci0+Y2xpZW50LAorCQkJIlF1ZXJ5IENvbnRyb2w6ICVzIDogTWluIC0gJWQsIE1heCAtICVkLCBEZWYgLSAlZCIsCisJCQlxY3RybC0+bmFtZSwKKwkJCXFjdHJsLT5taW5pbXVtLAorCQkJcWN0cmwtPm1heGltdW0sCisJCQlxY3RybC0+ZGVmYXVsdF92YWx1ZSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGlvY3RsX2dfY3RybCAtIFY0TDIgZGVjb2RlciBpbnRlcmZhY2UgaGFuZGxlciBmb3IgVklESU9DX0dfQ1RSTCBpb2N0bAorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY3RybDogcG9pbnRlciB0byB2NGwyX2NvbnRyb2wgc3RydWN0dXJlCisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBjb250cm9sIGlzIHN1cHBvcnRlZCwgcmV0dXJucyB0aGUgY29udHJvbCdzIGN1cnJlbnQKKyAqIHZhbHVlIGZyb20gdGhlIGRlY29kZXIuIE90aGVyd2lzZSwgcmV0dXJucyAtRUlOVkFMIGlmIHRoZSBjb250cm9sIGlzIG5vdAorICogc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50Citpb2N0bF9nX2N0cmwoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKworCWlmIChjdHJsID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY3RybC0+dmFsdWUgPSB0dnA1MTR4X3JlZ19saXN0W1JFR19CUklHSFRORVNTXS52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWN0cmwtPnZhbHVlID0gdHZwNTE0eF9yZWdfbGlzdFtSRUdfQ09OVFJBU1RdLnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQljdHJsLT52YWx1ZSA9IHR2cDUxNHhfcmVnX2xpc3RbUkVHX1NBVFVSQVRJT05dLnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCWN0cmwtPnZhbHVlID0gdHZwNTE0eF9yZWdfbGlzdFtSRUdfSFVFXS52YWw7CisJCWlmIChjdHJsLT52YWx1ZSA9PSAweDdGKQorCQkJY3RybC0+dmFsdWUgPSAxODA7CisJCWVsc2UgaWYgKGN0cmwtPnZhbHVlID09IDB4ODApCisJCQljdHJsLT52YWx1ZSA9IC0xODA7CisJCWVsc2UKKwkJCWN0cmwtPnZhbHVlID0gMDsKKworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQljdHJsLT52YWx1ZSA9IHR2cDUxNHhfcmVnX2xpc3RbUkVHX0FGRV9HQUlOX0NUUkxdLnZhbDsKKwkJaWYgKChjdHJsLT52YWx1ZSAmIDB4MykgPT0gMykKKwkJCWN0cmwtPnZhbHVlID0gMTsKKwkJZWxzZQorCQkJY3RybC0+dmFsdWUgPSAwOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXY0bF9lcnIoZGVjb2Rlci0+Y2xpZW50LAorCQkJImludmFsaWQgY29udHJvbCBpZCAlZFxuIiwgY3RybC0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2NGxfZGJnKDEsIGRlYnVnLCBkZWNvZGVyLT5jbGllbnQsCisJCQkiR2V0IENvbnRyb2w6IElEIC0gJWQgLSAlZCIsCisJCQljdHJsLT5pZCwgY3RybC0+dmFsdWUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvY3RsX3NfY3RybCAtIFY0TDIgZGVjb2RlciBpbnRlcmZhY2UgaGFuZGxlciBmb3IgVklESU9DX1NfQ1RSTCBpb2N0bAorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY3RybDogcG9pbnRlciB0byB2NGwyX2NvbnRyb2wgc3RydWN0dXJlCisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBjb250cm9sIGlzIHN1cHBvcnRlZCwgc2V0cyB0aGUgY29udHJvbCdzIGN1cnJlbnQKKyAqIHZhbHVlIGluIEhXLiBPdGhlcndpc2UsIHJldHVybnMgLUVJTlZBTCBpZiB0aGUgY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50Citpb2N0bF9zX2N0cmwoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwlpbnQgZXJyID0gLUVJTlZBTCwgdmFsdWU7CisKKwlpZiAoY3RybCA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCisJdmFsdWUgPSAoX19zMzIpIGN0cmwtPnZhbHVlOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDI1NSkgeworCQkJdjRsX2VycihkZWNvZGVyLT5jbGllbnQsCisJCQkJCSJpbnZhbGlkIGJyaWdodG5lc3Mgc2V0dGluZyAlZFxuIiwKKwkJCQkJY3RybC0+dmFsdWUpOworCQkJcmV0dXJuIC1FUkFOR0U7CisJCX0KKwkJZXJyID0gdHZwNTE0eF93cml0ZV9yZWcoZGVjb2Rlci0+Y2xpZW50LCBSRUdfQlJJR0hUTkVTUywKKwkJCQl2YWx1ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQl0dnA1MTR4X3JlZ19saXN0W1JFR19CUklHSFRORVNTXS52YWwgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDI1NSkgeworCQkJdjRsX2VycihkZWNvZGVyLT5jbGllbnQsCisJCQkJCSJpbnZhbGlkIGNvbnRyYXN0IHNldHRpbmcgJWRcbiIsCisJCQkJCWN0cmwtPnZhbHVlKTsKKwkJCXJldHVybiAtRVJBTkdFOworCQl9CisJCWVyciA9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0NPTlRSQVNULAorCQkJCXZhbHVlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXR2cDUxNHhfcmVnX2xpc3RbUkVHX0NPTlRSQVNUXS52YWwgPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlpZiAoY3RybC0+dmFsdWUgPCAwIHx8IGN0cmwtPnZhbHVlID4gMjU1KSB7CisJCQl2NGxfZXJyKGRlY29kZXItPmNsaWVudCwKKwkJCQkJImludmFsaWQgc2F0dXJhdGlvbiBzZXR0aW5nICVkXG4iLAorCQkJCQljdHJsLT52YWx1ZSk7CisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJfQorCQllcnIgPSB0dnA1MTR4X3dyaXRlX3JlZyhkZWNvZGVyLT5jbGllbnQsIFJFR19TQVRVUkFUSU9OLAorCQkJCXZhbHVlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXR2cDUxNHhfcmVnX2xpc3RbUkVHX1NBVFVSQVRJT05dLnZhbCA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJaWYgKHZhbHVlID09IDE4MCkKKwkJCXZhbHVlID0gMHg3RjsKKwkJZWxzZSBpZiAodmFsdWUgPT0gLTE4MCkKKwkJCXZhbHVlID0gMHg4MDsKKwkJZWxzZSBpZiAodmFsdWUgPT0gMCkKKwkJCXZhbHVlID0gMDsKKwkJZWxzZSB7CisJCQl2NGxfZXJyKGRlY29kZXItPmNsaWVudCwKKwkJCQkJImludmFsaWQgaHVlIHNldHRpbmcgJWRcbiIsCisJCQkJCWN0cmwtPnZhbHVlKTsKKwkJCXJldHVybiAtRVJBTkdFOworCQl9CisJCWVyciA9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0hVRSwKKwkJCQl2YWx1ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQl0dnA1MTR4X3JlZ19saXN0W1JFR19IVUVdLnZhbCA9IHZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQlpZiAodmFsdWUgPT0gMSkKKwkJCXZhbHVlID0gMHgwRjsKKwkJZWxzZSBpZiAodmFsdWUgPT0gMCkKKwkJCXZhbHVlID0gMHgwQzsKKwkJZWxzZSB7CisJCQl2NGxfZXJyKGRlY29kZXItPmNsaWVudCwKKwkJCQkJImludmFsaWQgYXV0byBnYWluIHNldHRpbmcgJWRcbiIsCisJCQkJCWN0cmwtPnZhbHVlKTsKKwkJCXJldHVybiAtRVJBTkdFOworCQl9CisJCWVyciA9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX0FGRV9HQUlOX0NUUkwsCisJCQkJdmFsdWUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJdHZwNTE0eF9yZWdfbGlzdFtSRUdfQUZFX0dBSU5fQ1RSTF0udmFsID0gdmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXY0bF9lcnIoZGVjb2Rlci0+Y2xpZW50LAorCQkJImludmFsaWQgY29udHJvbCBpZCAlZFxuIiwgY3RybC0+aWQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXY0bF9kYmcoMSwgZGVidWcsIGRlY29kZXItPmNsaWVudCwKKwkJCSJTZXQgQ29udHJvbDogSUQgLSAlZCAtICVkIiwKKwkJCWN0cmwtPmlkLCBjdHJsLT52YWx1ZSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGlvY3RsX2VudW1fZm10X2NhcCAtIEltcGxlbWVudCB0aGUgQ0FQVFVSRSBidWZmZXIgVklESU9DX0VOVU1fRk1UIGlvY3RsCisgKiBAczogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmbXQ6IHN0YW5kYXJkIFY0TDIgVklESU9DX0VOVU1fRk1UIGlvY3RsIHN0cnVjdHVyZQorICoKKyAqIEltcGxlbWVudCB0aGUgVklESU9DX0VOVU1fRk1UIGlvY3RsIHRvIGVudW1lcmF0ZSBzdXBwb3J0ZWQgZm9ybWF0cworICovCitzdGF0aWMgaW50Citpb2N0bF9lbnVtX2ZtdF9jYXAoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCWludCBpbmRleDsKKworCWlmIChmbXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmRleCA9IGZtdC0+aW5kZXg7CisJaWYgKChpbmRleCA+PSBkZWNvZGVyLT5udW1fZm10cykgfHwgKGluZGV4IDwgMCkpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbmRleCBvdXQgb2YgYm91bmQgKi8KKworCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogb25seSBjYXB0dXJlIGlzIHN1cHBvcnRlZCAqLworCisJbWVtY3B5KGZtdCwgJmRlY29kZXItPmZtdF9saXN0W2luZGV4XSwKKwkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZtdGRlc2MpKTsKKworCXY0bF9kYmcoMSwgZGVidWcsIGRlY29kZXItPmNsaWVudCwKKwkJCSJDdXJyZW50IEZNVDogaW5kZXggLSAlZCAoJXMpIiwKKwkJCWRlY29kZXItPmZtdF9saXN0W2luZGV4XS5pbmRleCwKKwkJCWRlY29kZXItPmZtdF9saXN0W2luZGV4XS5kZXNjcmlwdGlvbik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jdGxfdHJ5X2ZtdF9jYXAgLSBJbXBsZW1lbnQgdGhlIENBUFRVUkUgYnVmZmVyIFZJRElPQ19UUllfRk1UIGlvY3RsCisgKiBAczogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgVklESU9DX1RSWV9GTVQgaW9jdGwgc3RydWN0dXJlCisgKgorICogSW1wbGVtZW50IHRoZSBWSURJT0NfVFJZX0ZNVCBpb2N0bCBmb3IgdGhlIENBUFRVUkUgYnVmZmVyIHR5cGUuIFRoaXMKKyAqIGlvY3RsIGlzIHVzZWQgdG8gbmVnb3RpYXRlIHRoZSBpbWFnZSBjYXB0dXJlIHNpemUgYW5kIHBpeGVsIGZvcm1hdAorICogd2l0aG91dCBhY3R1YWxseSBtYWtpbmcgaXQgdGFrZSBlZmZlY3QuCisgKi8KK3N0YXRpYyBpbnQKK2lvY3RsX3RyeV9mbXRfY2FwKHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnMsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwlpbnQgaWZtdDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXg7CisJZW51bSB0dnA1MTR4X3N0ZCBjdXJyZW50X3N0ZDsKKworCWlmIChmID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJcGl4ID0gJmYtPmZtdC5waXg7CisKKwkvKiBDYWxjdWxhdGUgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiBjdXJyZW50IHN0YW5kYXJkICovCisJY3VycmVudF9zdGQgPSB0dnA1MTR4X2dldF9jdXJyZW50X3N0ZChkZWNvZGVyKTsKKwlpZiAoY3VycmVudF9zdGQgPT0gU1REX0lOVkFMSUQpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVjb2Rlci0+Y3VycmVudF9zdGQgPSBjdXJyZW50X3N0ZDsKKwlwaXgtPndpZHRoID0gZGVjb2Rlci0+c3RkX2xpc3RbY3VycmVudF9zdGRdLndpZHRoOworCXBpeC0+aGVpZ2h0ID0gZGVjb2Rlci0+c3RkX2xpc3RbY3VycmVudF9zdGRdLmhlaWdodDsKKworCWZvciAoaWZtdCA9IDA7IGlmbXQgPCBkZWNvZGVyLT5udW1fZm10czsgaWZtdCsrKSB7CisJCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09CisJCQlkZWNvZGVyLT5mbXRfbGlzdFtpZm10XS5waXhlbGZvcm1hdCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaWZtdCA9PSBkZWNvZGVyLT5udW1fZm10cykKKwkJaWZtdCA9IDA7CS8qIE5vbmUgb2YgdGhlIGZvcm1hdCBtYXRjaGVkLCBzZWxlY3QgZGVmYXVsdCAqLworCXBpeC0+cGl4ZWxmb3JtYXQgPSBkZWNvZGVyLT5mbXRfbGlzdFtpZm10XS5waXhlbGZvcm1hdDsKKworCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJcGl4LT5ieXRlc3BlcmxpbmUgPSBwaXgtPndpZHRoICogMjsKKwlwaXgtPnNpemVpbWFnZSA9IHBpeC0+Ynl0ZXNwZXJsaW5lICogcGl4LT5oZWlnaHQ7CisJcGl4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKwlwaXgtPnByaXYgPSAwOworCisJdjRsX2RiZygxLCBkZWJ1ZywgZGVjb2Rlci0+Y2xpZW50LAorCQkJIlRyeSBGTVQ6IHBpeGVsZm9ybWF0IC0gJXMsIGJ5dGVzcGVybGluZSAtICVkIgorCQkJIldpZHRoIC0gJWQsIEhlaWdodCAtICVkIiwKKwkJCWRlY29kZXItPmZtdF9saXN0W2lmbXRdLmRlc2NyaXB0aW9uLCBwaXgtPmJ5dGVzcGVybGluZSwKKwkJCXBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2N0bF9zX2ZtdF9jYXAgLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIFZJRElPQ19TX0ZNVCBpb2N0bAorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZjogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIFZJRElPQ19TX0ZNVCBpb2N0bCBzdHJ1Y3R1cmUKKyAqCisgKiBJZiB0aGUgcmVxdWVzdGVkIGZvcm1hdCBpcyBzdXBwb3J0ZWQsIGNvbmZpZ3VyZXMgdGhlIEhXIHRvIHVzZSB0aGF0CisgKiBmb3JtYXQsIHJldHVybnMgZXJyb3IgY29kZSBpZiBmb3JtYXQgbm90IHN1cHBvcnRlZCBvciBIVyBjYW4ndCBiZQorICogY29ycmVjdGx5IGNvbmZpZ3VyZWQuCisgKi8KK3N0YXRpYyBpbnQKK2lvY3RsX3NfZm10X2NhcChzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHR2cDUxNHhfZGVjb2RlciAqZGVjb2RlciA9IHMtPnByaXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4OworCWludCBydmFsOworCisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOwkvKiBvbmx5IGNhcHR1cmUgaXMgc3VwcG9ydGVkICovCisKKwlwaXggPSAmZi0+Zm10LnBpeDsKKwlydmFsID0gaW9jdGxfdHJ5X2ZtdF9jYXAocywgZik7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCisJCWRlY29kZXItPnBpeCA9ICpwaXg7CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoqCisgKiBpb2N0bF9nX2ZtdF9jYXAgLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIGlvY3RsX2dfZm10X2NhcAorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZjogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIHY0bDJfZm9ybWF0IHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGRlY29kZXIncyBjdXJyZW50IHBpeGVsIGZvcm1hdCBpbiB0aGUgdjRsMl9mb3JtYXQKKyAqIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludAoraW9jdGxfZ19mbXRfY2FwKHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnMsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKworCWlmIChmID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogb25seSBjYXB0dXJlIGlzIHN1cHBvcnRlZCAqLworCisJZi0+Zm10LnBpeCA9IGRlY29kZXItPnBpeDsKKworCXY0bF9kYmcoMSwgZGVidWcsIGRlY29kZXItPmNsaWVudCwKKwkJCSJDdXJyZW50IEZNVDogYnl0ZXNwZXJsaW5lIC0gJWQiCisJCQkiV2lkdGggLSAlZCwgSGVpZ2h0IC0gJWQiLAorCQkJZGVjb2Rlci0+cGl4LmJ5dGVzcGVybGluZSwKKwkJCWRlY29kZXItPnBpeC53aWR0aCwgZGVjb2Rlci0+cGl4LmhlaWdodCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jdGxfZ19wYXJtIC0gVjRMMiBkZWNvZGVyIGludGVyZmFjZSBoYW5kbGVyIGZvciBWSURJT0NfR19QQVJNIGlvY3RsCisgKiBAczogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBhOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgVklESU9DX0dfUEFSTSBpb2N0bCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSBkZWNvZGVyJ3MgdmlkZW8gQ0FQVFVSRSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW50Citpb2N0bF9nX3Bhcm0oc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9jYXB0dXJlcGFybSAqY3Bhcm07CisJZW51bSB0dnA1MTR4X3N0ZCBjdXJyZW50X3N0ZDsKKworCWlmIChhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogb25seSBjYXB0dXJlIGlzIHN1cHBvcnRlZCAqLworCisJbWVtc2V0KGEsIDAsIHNpemVvZigqYSkpOworCWEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgc3RhbmRhcmQgKi8KKwljdXJyZW50X3N0ZCA9IHR2cDUxNHhfZ2V0X2N1cnJlbnRfc3RkKGRlY29kZXIpOworCWlmIChjdXJyZW50X3N0ZCA9PSBTVERfSU5WQUxJRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWNvZGVyLT5jdXJyZW50X3N0ZCA9IGN1cnJlbnRfc3RkOworCisJY3Bhcm0gPSAmYS0+cGFybS5jYXB0dXJlOworCWNwYXJtLT5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCWNwYXJtLT50aW1lcGVyZnJhbWUgPQorCQlkZWNvZGVyLT5zdGRfbGlzdFtjdXJyZW50X3N0ZF0uc3RhbmRhcmQuZnJhbWVwZXJpb2Q7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb2N0bF9zX3Bhcm0gLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIFZJRElPQ19TX1BBUk0gaW9jdGwKKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQGE6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBWSURJT0NfU19QQVJNIGlvY3RsIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZXMgdGhlIGRlY29kZXIgdG8gdXNlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLCBpZiBwb3NzaWJsZS4gSWYKKyAqIG5vdCBwb3NzaWJsZSwgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAoraW9jdGxfc19wYXJtKHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgKnMsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IHR2cDUxNHhfZGVjb2RlciAqZGVjb2RlciA9IHMtPnByaXY7CisJc3RydWN0IHY0bDJfZnJhY3QgKnRpbWVwZXJmcmFtZTsKKwllbnVtIHR2cDUxNHhfc3RkIGN1cnJlbnRfc3RkOworCisJaWYgKGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOwkvKiBvbmx5IGNhcHR1cmUgaXMgc3VwcG9ydGVkICovCisKKwl0aW1lcGVyZnJhbWUgPSAmYS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZTsKKworCS8qIGdldCB0aGUgY3VycmVudCBzdGFuZGFyZCAqLworCWN1cnJlbnRfc3RkID0gdHZwNTE0eF9nZXRfY3VycmVudF9zdGQoZGVjb2Rlcik7CisJaWYgKGN1cnJlbnRfc3RkID09IFNURF9JTlZBTElEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlY29kZXItPmN1cnJlbnRfc3RkID0gY3VycmVudF9zdGQ7CisKKwkqdGltZXBlcmZyYW1lID0KKwkgICAgZGVjb2Rlci0+c3RkX2xpc3RbY3VycmVudF9zdGRdLnN0YW5kYXJkLmZyYW1lcGVyaW9kOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jdGxfZ19pZnBhcm0gLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIHZpZGlvY19pbnRfZ19pZnBhcm1fbnVtCisgKiBAczogcG9pbnRlciB0byBzdGFuZGFyZCBWNEwyIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgdmlkaW9jX2ludF9nX2lmcGFybV9udW0gaW9jdGwgc3RydWN0dXJlCisgKgorICogR2V0cyBzbGF2ZSBpbnRlcmZhY2UgcGFyYW1ldGVycy4KKyAqIENhbGN1bGF0ZXMgdGhlIHJlcXVpcmVkIHhjbGsgdmFsdWUgdG8gc3VwcG9ydCB0aGUgcmVxdWVzdGVkCisgKiBjbG9jayBwYXJhbWV0ZXJzIGluIHAuIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQgaW4gdGhlIHAKKyAqIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCBpb2N0bF9nX2lmcGFybShzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLCBzdHJ1Y3QgdjRsMl9pZnBhcm0gKnApCit7CisJc3RydWN0IHR2cDUxNHhfZGVjb2RlciAqZGVjb2RlciA9IHMtPnByaXY7CisJaW50IHJ2YWw7CisKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChOVUxMID09IGRlY29kZXItPnBkYXRhLT5pZnBhcm0pCisJCXJldHVybiAtRUlOVkFMOworCisJcnZhbCA9IGRlY29kZXItPnBkYXRhLT5pZnBhcm0ocCk7CisJaWYgKHJ2YWwpIHsKKwkJdjRsX2VycihkZWNvZGVyLT5jbGllbnQsICJnX2lmcGFybS5FcnJbJWRdXG4iLCBydmFsKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJcC0+dS5idDY1Ni5jbG9ja19jdXJyID0gVFZQNTE0WF9YQ0xLX0JUNjU2OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9jdGxfZ19wcml2IC0gVjRMMiBkZWNvZGVyIGludGVyZmFjZSBoYW5kbGVyIGZvciB2aWRpb2NfaW50X2dfcHJpdl9udW0KKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQHA6IHZvaWQgcG9pbnRlciB0byBob2xkIGRlY29kZXIncyBwcml2YXRlIGRhdGEgYWRkcmVzcworICoKKyAqIFJldHVybnMgZGV2aWNlJ3MgKGRlY29kZXIncykgcHJpdmF0ZSBkYXRhIGFyZWEgYWRkcmVzcyBpbiBwIHBhcmFtZXRlcgorICovCitzdGF0aWMgaW50IGlvY3RsX2dfcHJpdihzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCisJaWYgKE5VTEwgPT0gZGVjb2Rlci0+cGRhdGEtPnByaXZfZGF0YV9zZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRlY29kZXItPnBkYXRhLT5wcml2X2RhdGFfc2V0KHApOworfQorCisvKioKKyAqIGlvY3RsX3NfcG93ZXIgLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIHZpZGlvY19pbnRfc19wb3dlcl9udW0KKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICogQG9uOiBwb3dlciBzdGF0ZSB0byB3aGljaCBkZXZpY2UgaXMgdG8gYmUgc2V0CisgKgorICogU2V0cyBkZXZpY2VzIHBvd2VyIHN0YXRlIHRvIHJlcXVyZXN0ZWQgc3RhdGUsIGlmIHBvc3NpYmxlLgorICovCitzdGF0aWMgaW50IGlvY3RsX3NfcG93ZXIoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcywgZW51bSB2NGwyX3Bvd2VyIG9uKQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChvbikgeworCWNhc2UgVjRMMl9QT1dFUl9PRkY6CisJCS8qIFBvd2VyIERvd24gU2VxdWVuY2UgKi8KKwkJZXJyID0KKwkJICAgIHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwgUkVHX09QRVJBVElPTl9NT0RFLAorCQkJCQkweDAxKTsKKwkJLyogRGlzYWJsZSBtdXggZm9yIFRWUDUxNDYvNDcgZGVjb2RlciBkYXRhIHBhdGggKi8KKwkJaWYgKGRlY29kZXItPnBkYXRhLT5wb3dlcl9zZXQpCisJCQllcnIgfD0gZGVjb2Rlci0+cGRhdGEtPnBvd2VyX3NldChvbik7CisJCWRlY29kZXItPnN0YXRlID0gU1RBVEVfTk9UX0RFVEVDVEVEOworCQlicmVhazsKKworCWNhc2UgVjRMMl9QT1dFUl9TVEFOREJZOgorCQlpZiAoZGVjb2Rlci0+cGRhdGEtPnBvd2VyX3NldCkKKwkJCWVyciA9IGRlY29kZXItPnBkYXRhLT5wb3dlcl9zZXQob24pOworCQlicmVhazsKKworCWNhc2UgVjRMMl9QT1dFUl9PTjoKKwkJLyogRW5hYmxlIG11eCBmb3IgVFZQNTE0Ni80NyBkZWNvZGVyIGRhdGEgcGF0aCAqLworCQlpZiAoKGRlY29kZXItPnBkYXRhLT5wb3dlcl9zZXQpICYmCisJCQkJKGRlY29kZXItPnN0YXRlID09IFNUQVRFX05PVF9ERVRFQ1RFRCkpIHsKKwkJCWludCBpOworCQkJc3RydWN0IHR2cDUxNHhfaW5pdF9zZXEgKmludF9zZXEgPQorCQkJCShzdHJ1Y3QgdHZwNTE0eF9pbml0X3NlcSAqKQorCQkJCWRlY29kZXItPmlkLT5kcml2ZXJfZGF0YTsKKworCQkJZXJyID0gZGVjb2Rlci0+cGRhdGEtPnBvd2VyX3NldChvbik7CisKKwkJCS8qIFBvd2VyIFVwIFNlcXVlbmNlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgaW50X3NlcS0+bm9fcmVnczsgaSsrKSB7CisJCQkJZXJyIHw9IHR2cDUxNHhfd3JpdGVfcmVnKGRlY29kZXItPmNsaWVudCwKKwkJCQkJCWludF9zZXEtPmluaXRfcmVnX3NlcVtpXS5yZWcsCisJCQkJCQlpbnRfc2VxLT5pbml0X3JlZ19zZXFbaV0udmFsKTsKKwkJCX0KKwkJCS8qIERldGVjdCB0aGUgc2Vuc29yIGlzIG5vdCBhbHJlYWR5IGRldGVjdGVkICovCisJCQllcnIgfD0gdHZwNTE0eF9kZXRlY3QoZGVjb2Rlcik7CisJCQlpZiAoZXJyKSB7CisJCQkJdjRsX2VycihkZWNvZGVyLT5jbGllbnQsCisJCQkJCQkiVW5hYmxlIHRvIGRldGVjdCBkZWNvZGVyXG4iKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisJCWVyciB8PSB0dnA1MTR4X2NvbmZpZ3VyZShkZWNvZGVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PREVWOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGlvY3RsX2luaXQgLSBWNEwyIGRlY29kZXIgaW50ZXJmYWNlIGhhbmRsZXIgZm9yIFZJRElPQ19JTlRfSU5JVAorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogSW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBkZXZpY2UgKGNhbGxzIHR2cDUxNHhfY29uZmlndXJlKCkpCisgKi8KK3N0YXRpYyBpbnQgaW9jdGxfaW5pdChzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzKQoreworCXN0cnVjdCB0dnA1MTR4X2RlY29kZXIgKmRlY29kZXIgPSBzLT5wcml2OworCisJLyogU2V0IGRlZmF1bHQgc3RhbmRhcmQgdG8gYXV0byAqLworCXR2cDUxNHhfcmVnX2xpc3RbUkVHX1ZJREVPX1NURF0udmFsID0KKwkgICAgVklERU9fU1REX0FVVE9fU1dJVENIX0JJVDsKKworCXJldHVybiB0dnA1MTR4X2NvbmZpZ3VyZShkZWNvZGVyKTsKK30KKworLyoqCisgKiBpb2N0bF9kZXZfZXhpdCAtIFY0TDIgZGVjb2RlciBpbnRlcmZhY2UgaGFuZGxlciBmb3IgdmlkaW9jX2ludF9kZXZfZXhpdF9udW0KKyAqIEBzOiBwb2ludGVyIHRvIHN0YW5kYXJkIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIERlbGluaXRpYWxpc2UgdGhlIGRldi4gYXQgc2xhdmUgZGV0YWNoLiBUaGUgY29tcGxlbWVudCBvZiBpb2N0bF9kZXZfaW5pdC4KKyAqLworc3RhdGljIGludCBpb2N0bF9kZXZfZXhpdChzdHJ1Y3QgdjRsMl9pbnRfZGV2aWNlICpzKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvY3RsX2Rldl9pbml0IC0gVjRMMiBkZWNvZGVyIGludGVyZmFjZSBoYW5kbGVyIGZvciB2aWRpb2NfaW50X2Rldl9pbml0X251bQorICogQHM6IHBvaW50ZXIgdG8gc3RhbmRhcmQgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogSW5pdGlhbGlzZSB0aGUgZGV2aWNlIHdoZW4gc2xhdmUgYXR0YWNoZXMgdG8gdGhlIG1hc3Rlci4gUmV0dXJucyAwIGlmCisgKiBUVlA1MTQ2LzQ3IGRldmljZSBjb3VsZCBiZSBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgYXBwcm9wcmlhdGUgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgaW9jdGxfZGV2X2luaXQoc3RydWN0IHY0bDJfaW50X2RldmljZSAqcykKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gcy0+cHJpdjsKKwlpbnQgZXJyOworCisJZXJyID0gdHZwNTE0eF9kZXRlY3QoZGVjb2Rlcik7CisJaWYgKGVyciA8IDApIHsKKwkJdjRsX2VycihkZWNvZGVyLT5jbGllbnQsCisJCQkiVW5hYmxlIHRvIGRldGVjdCBkZWNvZGVyXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl2NGxfaW5mbyhkZWNvZGVyLT5jbGllbnQsCisJCSAiY2hpcCB2ZXJzaW9uIDB4JS4yeCBkZXRlY3RlZFxuIiwgZGVjb2Rlci0+dmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfaW50X2lvY3RsX2Rlc2MgdHZwNTE0eF9pb2N0bF9kZXNjW10gPSB7CisJe3ZpZGlvY19pbnRfZGV2X2luaXRfbnVtLCAodjRsMl9pbnRfaW9jdGxfZnVuYyopIGlvY3RsX2Rldl9pbml0fSwKKwl7dmlkaW9jX2ludF9kZXZfZXhpdF9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jKikgaW9jdGxfZGV2X2V4aXR9LAorCXt2aWRpb2NfaW50X3NfcG93ZXJfbnVtLCAodjRsMl9pbnRfaW9jdGxfZnVuYyopIGlvY3RsX3NfcG93ZXJ9LAorCXt2aWRpb2NfaW50X2dfcHJpdl9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jKikgaW9jdGxfZ19wcml2fSwKKwl7dmlkaW9jX2ludF9nX2lmcGFybV9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jKikgaW9jdGxfZ19pZnBhcm19LAorCXt2aWRpb2NfaW50X2luaXRfbnVtLCAodjRsMl9pbnRfaW9jdGxfZnVuYyopIGlvY3RsX2luaXR9LAorCXt2aWRpb2NfaW50X2VudW1fZm10X2NhcF9udW0sCisJICh2NGwyX2ludF9pb2N0bF9mdW5jICopIGlvY3RsX2VudW1fZm10X2NhcH0sCisJe3ZpZGlvY19pbnRfdHJ5X2ZtdF9jYXBfbnVtLAorCSAodjRsMl9pbnRfaW9jdGxfZnVuYyAqKSBpb2N0bF90cnlfZm10X2NhcH0sCisJe3ZpZGlvY19pbnRfZ19mbXRfY2FwX251bSwKKwkgKHY0bDJfaW50X2lvY3RsX2Z1bmMgKikgaW9jdGxfZ19mbXRfY2FwfSwKKwl7dmlkaW9jX2ludF9zX2ZtdF9jYXBfbnVtLAorCSAodjRsMl9pbnRfaW9jdGxfZnVuYyAqKSBpb2N0bF9zX2ZtdF9jYXB9LAorCXt2aWRpb2NfaW50X2dfcGFybV9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jICopIGlvY3RsX2dfcGFybX0sCisJe3ZpZGlvY19pbnRfc19wYXJtX251bSwgKHY0bDJfaW50X2lvY3RsX2Z1bmMgKikgaW9jdGxfc19wYXJtfSwKKwl7dmlkaW9jX2ludF9xdWVyeWN0cmxfbnVtLAorCSAodjRsMl9pbnRfaW9jdGxfZnVuYyAqKSBpb2N0bF9xdWVyeWN0cmx9LAorCXt2aWRpb2NfaW50X2dfY3RybF9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jICopIGlvY3RsX2dfY3RybH0sCisJe3ZpZGlvY19pbnRfc19jdHJsX251bSwgKHY0bDJfaW50X2lvY3RsX2Z1bmMgKikgaW9jdGxfc19jdHJsfSwKKwl7dmlkaW9jX2ludF9xdWVyeXN0ZF9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jICopIGlvY3RsX3F1ZXJ5c3RkfSwKKwl7dmlkaW9jX2ludF9zX3N0ZF9udW0sICh2NGwyX2ludF9pb2N0bF9mdW5jICopIGlvY3RsX3Nfc3RkfSwKKwl7dmlkaW9jX2ludF9zX3ZpZGVvX3JvdXRpbmdfbnVtLAorCQkodjRsMl9pbnRfaW9jdGxfZnVuYyAqKSBpb2N0bF9zX3JvdXRpbmd9LAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX2ludF9zbGF2ZSB0dnA1MTR4X3NsYXZlID0geworCS5pb2N0bHMgPSB0dnA1MTR4X2lvY3RsX2Rlc2MsCisJLm51bV9pb2N0bHMgPSBBUlJBWV9TSVpFKHR2cDUxNHhfaW9jdGxfZGVzYyksCit9OworCitzdGF0aWMgc3RydWN0IHR2cDUxNHhfZGVjb2RlciB0dnA1MTR4X2RldiA9IHsKKwkuc3RhdGUgPSBTVEFURV9OT1RfREVURUNURUQsCisKKwkuZm10X2xpc3QgPSB0dnA1MTR4X2ZtdF9saXN0LAorCS5udW1fZm10cyA9IEFSUkFZX1NJWkUodHZwNTE0eF9mbXRfbGlzdCksCisKKwkucGl4ID0gewkJLyogRGVmYXVsdCB0byBOVFNDIDgtYml0IFlVViA0MjIgKi8KKwkJLndpZHRoID0gTlRTQ19OVU1fQUNUSVZFX1BJWEVMUywKKwkJLmhlaWdodCA9IE5UU0NfTlVNX0FDVElWRV9MSU5FUywKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlksCisJCS5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRCwKKwkJLmJ5dGVzcGVybGluZSA9IE5UU0NfTlVNX0FDVElWRV9QSVhFTFMgKiAyLAorCQkuc2l6ZWltYWdlID0KKwkJTlRTQ19OVU1fQUNUSVZFX1BJWEVMUyAqIDIgKiBOVFNDX05VTV9BQ1RJVkVfTElORVMsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSwKKwkJfSwKKworCS5jdXJyZW50X3N0ZCA9IFNURF9OVFNDX01KLAorCS5zdGRfbGlzdCA9IHR2cDUxNHhfc3RkX2xpc3QsCisJLm51bV9zdGRzID0gQVJSQVlfU0laRSh0dnA1MTR4X3N0ZF9saXN0KSwKKworfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX2ludF9kZXZpY2UgdHZwNTE0eF9pbnRfZGV2aWNlID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9IFRWUDUxNFhfTU9EVUxFX05BTUUsCisJLnByaXYgPSAmdHZwNTE0eF9kZXYsCisJLnR5cGUgPSB2NGwyX2ludF90eXBlX3NsYXZlLAorCS51ID0geworCSAgICAgIC5zbGF2ZSA9ICZ0dnA1MTR4X3NsYXZlLAorCSAgICAgIH0sCit9OworCisvKioKKyAqIHR2cDUxNHhfcHJvYmUgLSBkZWNvZGVyIGRyaXZlciBpMmMgcHJvYmUgaGFuZGxlcgorICogQGNsaWVudDogaTJjIGRyaXZlciBjbGllbnQgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJlZ2lzdGVyIGRlY29kZXIgYXMgYW4gaTJjIGNsaWVudCBkZXZpY2UgYW5kIFY0TDIKKyAqIGRldmljZS4KKyAqLworc3RhdGljIGludAordHZwNTE0eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHR2cDUxNHhfZGVjb2RlciAqZGVjb2RlciA9ICZ0dnA1MTR4X2RldjsKKwlpbnQgZXJyOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTzsKKworCWRlY29kZXItPnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIWRlY29kZXItPnBkYXRhKSB7CisJCXY0bF9lcnIoY2xpZW50LCAiTm8gcGxhdGZvcm0gZGF0YVxuISEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qCisJICogRmV0Y2ggcGxhdGZvcm0gc3BlY2lmaWMgZGF0YSwgYW5kIGNvbmZpZ3VyZSB0aGUKKwkgKiB0dnA1MTR4X3JlZ19saXN0W10gYWNjb3JkaW5nbHkuIFNpbmNlIHRoaXMgaXMgb25lCisJICogdGltZSBjb25maWd1cmF0aW9uLCBubyBuZWVkIHRvIHByZXNlcnZlLgorCSAqLworCXR2cDUxNHhfcmVnX2xpc3RbUkVHX09VVFBVVF9GT1JNQVRURVIyXS52YWwgfD0KKwkJCShkZWNvZGVyLT5wZGF0YS0+Y2xrX3BvbGFyaXR5IDw8IDEpOworCXR2cDUxNHhfcmVnX2xpc3RbUkVHX1NZTkNfQ09OVFJPTF0udmFsIHw9CisJCQkoKGRlY29kZXItPnBkYXRhLT5oc19wb2xhcml0eSA8PCAyKSB8CisJCQkoZGVjb2Rlci0+cGRhdGEtPnZzX3BvbGFyaXR5IDw8IDMpKTsKKwkvKgorCSAqIFNhdmUgdGhlIGlkIGRhdGEsIHJlcXVpcmVkIGZvciBwb3dlciB1cCBzZXF1ZW5jZQorCSAqLworCWRlY29kZXItPmlkID0gKHN0cnVjdCBpMmNfZGV2aWNlX2lkICopaWQ7CisJLyogQXR0YWNoIHRvIE1hc3RlciAqLworCXN0cmNweSh0dnA1MTR4X2ludF9kZXZpY2UudS5zbGF2ZS0+YXR0YWNoX3RvLCBkZWNvZGVyLT5wZGF0YS0+bWFzdGVyKTsKKwlkZWNvZGVyLT52NGwyX2ludF9kZXZpY2UgPSAmdHZwNTE0eF9pbnRfZGV2aWNlOworCWRlY29kZXItPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWNvZGVyKTsKKworCS8qIFJlZ2lzdGVyIHdpdGggVjRMMiBsYXllciBhcyBzbGF2ZSBkZXZpY2UgKi8KKwllcnIgPSB2NGwyX2ludF9kZXZpY2VfcmVnaXN0ZXIoZGVjb2Rlci0+djRsMl9pbnRfZGV2aWNlKTsKKwlpZiAoZXJyKSB7CisJCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCQl2NGxfZXJyKGNsaWVudCwKKwkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgdG8gdjRsMi4gRXJyWyVkXVxuIiwgZXJyKTsKKworCX0gZWxzZQorCQl2NGxfaW5mbyhjbGllbnQsICJSZWdpc3RlcmVkIHRvIHY0bDIgbWFzdGVyICVzISFcbiIsCisJCQkJZGVjb2Rlci0+cGRhdGEtPm1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0dnA1MTR4X3JlbW92ZSAtIGRlY29kZXIgZHJpdmVyIGkyYyByZW1vdmUgaGFuZGxlcgorICogQGNsaWVudDogaTJjIGRyaXZlciBjbGllbnQgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFVucmVnaXN0ZXIgZGVjb2RlciBhcyBhbiBpMmMgY2xpZW50IGRldmljZSBhbmQgVjRMMgorICogZGV2aWNlLiBDb21wbGVtZW50IG9mIHR2cDUxNHhfcHJvYmUoKS4KKyAqLworc3RhdGljIGludCBfX2V4aXQgdHZwNTE0eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHZwNTE0eF9kZWNvZGVyICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoIWNsaWVudC0+YWRhcHRlcikKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIG91ciBjbGllbnQgaXNuJ3QgYXR0YWNoZWQgKi8KKworCXY0bDJfaW50X2RldmljZV91bnJlZ2lzdGVyKGRlY29kZXItPnY0bDJfaW50X2RldmljZSk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBUVlA1MTQ2IEluaXQvUG93ZXIgb24gU2VxdWVuY2UKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0dnA1MTR4X3JlZyB0dnA1MTQ2X2luaXRfcmVnX3NlcVtdID0geworCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMSwgMHgwMn0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MyLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzMsIDB4ODB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0RBVEFfQUNDRVNTX05PX1ZCVVNfQUREUl9JTkNSLCAweDAxfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzEsIDB4NjB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMiwgMHgwMH0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MzLCAweEIwfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19EQVRBX0FDQ0VTU19OT19WQlVTX0FERFJfSU5DUiwgMHgwMX0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfREFUQV9BQ0NFU1NfTk9fVkJVU19BRERSX0lOQ1IsIDB4MDB9LAorCXtUT0tfV1JJVEUsIFJFR19PUEVSQVRJT05fTU9ERSwgMHgwMX0sCisJe1RPS19XUklURSwgUkVHX09QRVJBVElPTl9NT0RFLCAweDAwfSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHR2cDUxNHhfaW5pdF9zZXEgdHZwNTE0Nl9pbml0ID0geworCS5ub19yZWdzID0gQVJSQVlfU0laRSh0dnA1MTQ2X2luaXRfcmVnX3NlcSksCisJLmluaXRfcmVnX3NlcSA9IHR2cDUxNDZfaW5pdF9yZWdfc2VxLAorfTsKKy8qCisgKiBUVlA1MTQ3IEluaXQvUG93ZXIgb24gU2VxdWVuY2UKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0dnA1MTR4X3JlZyB0dnA1MTQ3X2luaXRfcmVnX3NlcVtdID0JeworCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMSwgMHgwMn0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MyLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzMsIDB4ODB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0RBVEFfQUNDRVNTX05PX1ZCVVNfQUREUl9JTkNSLCAweDAxfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzEsIDB4NjB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMiwgMHgwMH0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MzLCAweEIwfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19EQVRBX0FDQ0VTU19OT19WQlVTX0FERFJfSU5DUiwgMHgwMX0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MxLCAweDE2fSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzIsIDB4MDB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMywgMHhBMH0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfREFUQV9BQ0NFU1NfTk9fVkJVU19BRERSX0lOQ1IsIDB4MTZ9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMSwgMHg2MH0sCisJe1RPS19XUklURSwgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MyLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzMsIDB4QjB9LAorCXtUT0tfV1JJVEUsIFJFR19WQlVTX0RBVEFfQUNDRVNTX05PX1ZCVVNfQUREUl9JTkNSLCAweDAwfSwKKwl7VE9LX1dSSVRFLCBSRUdfT1BFUkFUSU9OX01PREUsIDB4MDF9LAorCXtUT0tfV1JJVEUsIFJFR19PUEVSQVRJT05fTU9ERSwgMHgwMH0sCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0dnA1MTR4X2luaXRfc2VxIHR2cDUxNDdfaW5pdCA9IHsKKwkubm9fcmVncyA9IEFSUkFZX1NJWkUodHZwNTE0N19pbml0X3JlZ19zZXEpLAorCS5pbml0X3JlZ19zZXEgPSB0dnA1MTQ3X2luaXRfcmVnX3NlcSwKK307CisvKgorICogVFZQNTE0Nk0yL1RWUDUxNDdNMSBJbml0L1Bvd2VyIG9uIFNlcXVlbmNlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHZwNTE0eF9yZWcgdHZwNTE0eG1faW5pdF9yZWdfc2VxW10gPSB7CisJe1RPS19XUklURSwgUkVHX09QRVJBVElPTl9NT0RFLCAweDAxfSwKKwl7VE9LX1dSSVRFLCBSRUdfT1BFUkFUSU9OX01PREUsIDB4MDB9LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHZwNTE0eF9pbml0X3NlcSB0dnA1MTR4bV9pbml0ID0geworCS5ub19yZWdzID0gQVJSQVlfU0laRSh0dnA1MTR4bV9pbml0X3JlZ19zZXEpLAorCS5pbml0X3JlZ19zZXEgPSB0dnA1MTR4bV9pbml0X3JlZ19zZXEsCit9OworLyoKKyAqIEkyQyBEZXZpY2UgVGFibGUgLQorICoKKyAqIG5hbWUgLSBOYW1lIG9mIHRoZSBhY3R1YWwgZGV2aWNlL2NoaXAuCisgKiBkcml2ZXJfZGF0YSAtIERyaXZlciBkYXRhCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0dnA1MTR4X2lkW10gPSB7CisJeyJ0dnA1MTQ2IiwgKHVuc2lnbmVkIGxvbmcpJnR2cDUxNDZfaW5pdH0sCisJeyJ0dnA1MTQ2bTIiLCAodW5zaWduZWQgbG9uZykmdHZwNTE0eG1faW5pdH0sCisJeyJ0dnA1MTQ3IiwgKHVuc2lnbmVkIGxvbmcpJnR2cDUxNDdfaW5pdH0sCisJeyJ0dnA1MTQ3bTEiLCAodW5zaWduZWQgbG9uZykmdHZwNTE0eG1faW5pdH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHZwNTE0eF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0dnA1MTR4X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSBUVlA1MTRYX01PRFVMRV9OQU1FLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucHJvYmUgPSB0dnA1MTR4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2V4aXRfcCh0dnA1MTR4X3JlbW92ZSksCisJLmlkX3RhYmxlID0gdHZwNTE0eF9pZCwKK307CisKKy8qKgorICogdHZwNTE0eF9pbml0CisgKgorICogTW9kdWxlIGluaXQgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgdHZwNTE0eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ0dnA1MTR4X2kyY19kcml2ZXIpOworfQorCisvKioKKyAqIHR2cDUxNHhfY2xlYW51cAorICoKKyAqIE1vZHVsZSBleGl0IGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB0dnA1MTR4X2NsZWFudXAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHZwNTE0eF9pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHZwNTE0eF9pbml0KTsKK21vZHVsZV9leGl0KHR2cDUxNHhfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRWUDUxNFggbGludXggZGVjb2RlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE0eF9yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHhfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTYyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHhfcmVncy5oCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTR4X3JlZ3MuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqIEF1dGhvcjogVmFpYmhhdiBIaXJlbWF0aCA8aHZhaWJoYXZAdGkuY29tPgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTaXZhcmFqIFIgPHNpdmFyYWpAdGkuY29tPgorICogICAgIEJyaWplc2ggUiBKYWRhdiA8YnJpamVzaC5qQHRpLmNvbT4KKyAqICAgICBIYXJkaWsgU2hhaCA8aGFyZGlrLnNoYWhAdGkuY29tPgorICogICAgIE1hbmp1bmF0aCBIYWRsaSA8bXJoQHRpLmNvbT4KKyAqICAgICBLYXJpY2hlcmkgTXVyYWxpZGhhcmFuIDxtLWthcmljaGVyaTJAdGkuY29tPgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9UVlA1MTRYX1JFR1NfSAorI2RlZmluZSBfVFZQNTE0WF9SRUdTX0gKKworLyoKKyAqIFRWUDUxNDYvNDcgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgUkVHX0lOUFVUX1NFTAkJCSgweDAwKQorI2RlZmluZSBSRUdfQUZFX0dBSU5fQ1RSTAkJKDB4MDEpCisjZGVmaW5lIFJFR19WSURFT19TVEQJCQkoMHgwMikKKyNkZWZpbmUgUkVHX09QRVJBVElPTl9NT0RFCQkoMHgwMykKKyNkZWZpbmUgUkVHX0FVVE9TV0lUQ0hfTUFTSwkJKDB4MDQpCisKKyNkZWZpbmUgUkVHX0NPTE9SX0tJTExFUgkJKDB4MDUpCisjZGVmaW5lIFJFR19MVU1BX0NPTlRST0wxCQkoMHgwNikKKyNkZWZpbmUgUkVHX0xVTUFfQ09OVFJPTDIJCSgweDA3KQorI2RlZmluZSBSRUdfTFVNQV9DT05UUk9MMwkJKDB4MDgpCisKKyNkZWZpbmUgUkVHX0JSSUdIVE5FU1MJCQkoMHgwOSkKKyNkZWZpbmUgUkVHX0NPTlRSQVNUCQkJKDB4MEEpCisjZGVmaW5lIFJFR19TQVRVUkFUSU9OCQkJKDB4MEIpCisjZGVmaW5lIFJFR19IVUUJCQkJKDB4MEMpCisKKyNkZWZpbmUgUkVHX0NIUk9NQV9DT05UUk9MMQkJKDB4MEQpCisjZGVmaW5lIFJFR19DSFJPTUFfQ09OVFJPTDIJCSgweDBFKQorCisvKiAweDBGIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX0NPTVBfUFJfU0FUVVJBVElPTgkJKDB4MTApCisjZGVmaW5lIFJFR19DT01QX1lfQ09OVFJBU1QJCSgweDExKQorI2RlZmluZSBSRUdfQ09NUF9QQl9TQVRVUkFUSU9OCQkoMHgxMikKKworLyogMHgxMyBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19DT01QX1lfQlJJR0hUTkVTUwkJKDB4MTQpCisKKy8qIDB4MTUgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfQVZJRF9TVEFSVF9QSVhFTF9MU0IJKDB4MTYpCisjZGVmaW5lIFJFR19BVklEX1NUQVJUX1BJWEVMX01TQgkoMHgxNykKKyNkZWZpbmUgUkVHX0FWSURfU1RPUF9QSVhFTF9MU0IJCSgweDE4KQorI2RlZmluZSBSRUdfQVZJRF9TVE9QX1BJWEVMX01TQgkJKDB4MTkpCisKKyNkZWZpbmUgUkVHX0hTWU5DX1NUQVJUX1BJWEVMX0xTQgkoMHgxQSkKKyNkZWZpbmUgUkVHX0hTWU5DX1NUQVJUX1BJWEVMX01TQgkoMHgxQikKKyNkZWZpbmUgUkVHX0hTWU5DX1NUT1BfUElYRUxfTFNCCSgweDFDKQorI2RlZmluZSBSRUdfSFNZTkNfU1RPUF9QSVhFTF9NU0IJKDB4MUQpCisKKyNkZWZpbmUgUkVHX1ZTWU5DX1NUQVJUX0xJTkVfTFNCCSgweDFFKQorI2RlZmluZSBSRUdfVlNZTkNfU1RBUlRfTElORV9NU0IJKDB4MUYpCisjZGVmaW5lIFJFR19WU1lOQ19TVE9QX0xJTkVfTFNCCQkoMHgyMCkKKyNkZWZpbmUgUkVHX1ZTWU5DX1NUT1BfTElORV9NU0IJCSgweDIxKQorCisjZGVmaW5lIFJFR19WQkxLX1NUQVJUX0xJTkVfTFNCCQkoMHgyMikKKyNkZWZpbmUgUkVHX1ZCTEtfU1RBUlRfTElORV9NU0IJCSgweDIzKQorI2RlZmluZSBSRUdfVkJMS19TVE9QX0xJTkVfTFNCCQkoMHgyNCkKKyNkZWZpbmUgUkVHX1ZCTEtfU1RPUF9MSU5FX01TQgkJKDB4MjUpCisKKy8qIDB4MjYgLSAweDI3IFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX0ZBU1RfU1dUSUNIX0NPTlRST0wJCSgweDI4KQorCisvKiAweDI5IFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX0ZBU1RfU1dUSUNIX1NDQVJUX0RFTEFZCSgweDJBKQorCisvKiAweDJCIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX1NDQVJUX0RFTEFZCQkJKDB4MkMpCisjZGVmaW5lIFJFR19DVElfREVMQVkJCQkoMHgyRCkKKyNkZWZpbmUgUkVHX0NUSV9DT05UUk9MCQkJKDB4MkUpCisKKy8qIDB4MkYgLSAweDMxIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX1NZTkNfQ09OVFJPTAkJKDB4MzIpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSMQkJKDB4MzMpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSMgkJKDB4MzQpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSMwkJKDB4MzUpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSNAkJKDB4MzYpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSNQkJKDB4MzcpCisjZGVmaW5lIFJFR19PVVRQVVRfRk9STUFUVEVSNgkJKDB4MzgpCisjZGVmaW5lIFJFR19DTEVBUl9MT1NUX0xPQ0sJCSgweDM5KQorCisjZGVmaW5lIFJFR19TVEFUVVMxCQkJKDB4M0EpCisjZGVmaW5lIFJFR19TVEFUVVMyCQkJKDB4M0IpCisKKyNkZWZpbmUgUkVHX0FHQ19HQUlOX1NUQVRVU19MU0IJCSgweDNDKQorI2RlZmluZSBSRUdfQUdDX0dBSU5fU1RBVFVTX01TQgkJKDB4M0QpCisKKy8qIDB4M0UgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfVklERU9fU1REX1NUQVRVUwkJKDB4M0YpCisjZGVmaW5lIFJFR19HUElPX0lOUFVUMQkJCSgweDQwKQorI2RlZmluZSBSRUdfR1BJT19JTlBVVDIJCQkoMHg0MSkKKworLyogMHg0MiAtIDB4NDUgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfQUZFX0NPQVJTRV9HQUlOX0NIMQkJKDB4NDYpCisjZGVmaW5lIFJFR19BRkVfQ09BUlNFX0dBSU5fQ0gyCQkoMHg0NykKKyNkZWZpbmUgUkVHX0FGRV9DT0FSU0VfR0FJTl9DSDMJCSgweDQ4KQorI2RlZmluZSBSRUdfQUZFX0NPQVJTRV9HQUlOX0NINAkJKDB4NDkpCisKKyNkZWZpbmUgUkVHX0FGRV9GSU5FX0dBSU5fUEJfQl9MU0IJKDB4NEEpCisjZGVmaW5lIFJFR19BRkVfRklORV9HQUlOX1BCX0JfTVNCCSgweDRCKQorI2RlZmluZSBSRUdfQUZFX0ZJTkVfR0FJTl9ZX0dfQ0hST01BX0xTQgkoMHg0QykKKyNkZWZpbmUgUkVHX0FGRV9GSU5FX0dBSU5fWV9HX0NIUk9NQV9NU0IJKDB4NEQpCisjZGVmaW5lIFJFR19BRkVfRklORV9HQUlOX1BSX1JfTFNCCSgweDRFKQorI2RlZmluZSBSRUdfQUZFX0ZJTkVfR0FJTl9QUl9SX01TQgkoMHg0RikKKyNkZWZpbmUgUkVHX0FGRV9GSU5FX0dBSU5fQ1ZCU19MVU1BX0xTQgkoMHg1MCkKKyNkZWZpbmUgUkVHX0FGRV9GSU5FX0dBSU5fQ1ZCU19MVU1BX01TQgkoMHg1MSkKKworLyogMHg1MiAtIDB4NjggUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfRkJJVF9WQklUX0NPTlRST0wxCQkoMHg2OSkKKworLyogMHg2QSAtIDB4NkIgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfQkFDS0VORF9BR0NfQ09OVFJPTAkJKDB4NkMpCisKKy8qIDB4NkQgLSAweDZFIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX0FHQ19ERUNSRU1FTlRfU1BFRURfQ09OVFJPTAkoMHg2RikKKyNkZWZpbmUgUkVHX1JPTV9WRVJTSU9OCQkJKDB4NzApCisKKy8qIDB4NzEgLSAweDczIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX0FHQ19XSElURV9QRUFLX1BST0NFU1NJTkcJKDB4NzQpCisjZGVmaW5lIFJFR19GQklUX1ZCSVRfQ09OVFJPTDIJCSgweDc1KQorI2RlZmluZSBSRUdfVkNSX1RSSUNLX01PREVfQ09OVFJPTAkoMHg3NikKKyNkZWZpbmUgUkVHX0hPUklaT05UQUxfU0hBS0VfSU5DUkVNRU5UCSgweDc3KQorI2RlZmluZSBSRUdfQUdDX0lOQ1JFTUVOVF9TUEVFRAkJKDB4NzgpCisjZGVmaW5lIFJFR19BR0NfSU5DUkVNRU5UX0RFTEFZCQkoMHg3OSkKKworLyogMHg3QSAtIDB4N0YgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfQ0hJUF9JRF9NU0IJCQkoMHg4MCkKKyNkZWZpbmUgUkVHX0NISVBfSURfTFNCCQkJKDB4ODEpCisKKy8qIDB4ODIgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfQ1BMTF9TUEVFRF9DT05UUk9MCQkoMHg4MykKKworLyogMHg4NCAtIDB4OTYgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfU1RBVFVTX1JFUVVFU1QJCSgweDk3KQorCisvKiAweDk4IC0gMHg5OSBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19WRVJUSUNBTF9MSU5FX0NPVU5UX0xTQgkoMHg5QSkKKyNkZWZpbmUgUkVHX1ZFUlRJQ0FMX0xJTkVfQ09VTlRfTVNCCSgweDlCKQorCisvKiAweDlDIC0gMHg5RCBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19BR0NfREVDUkVNRU5UX0RFTEFZCQkoMHg5RSkKKworLyogMHg5RiAtIDB4QjAgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfVkRQX1RUWF9GSUxURVJfMV9NQVNLMQkoMHhCMSkKKyNkZWZpbmUgUkVHX1ZEUF9UVFhfRklMVEVSXzFfTUFTSzIJKDB4QjIpCisjZGVmaW5lIFJFR19WRFBfVFRYX0ZJTFRFUl8xX01BU0szCSgweEIzKQorI2RlZmluZSBSRUdfVkRQX1RUWF9GSUxURVJfMV9NQVNLNAkoMHhCNCkKKyNkZWZpbmUgUkVHX1ZEUF9UVFhfRklMVEVSXzFfTUFTSzUJKDB4QjUpCisjZGVmaW5lIFJFR19WRFBfVFRYX0ZJTFRFUl8yX01BU0sxCSgweEI2KQorI2RlZmluZSBSRUdfVkRQX1RUWF9GSUxURVJfMl9NQVNLMgkoMHhCNykKKyNkZWZpbmUgUkVHX1ZEUF9UVFhfRklMVEVSXzJfTUFTSzMJKDB4QjgpCisjZGVmaW5lIFJFR19WRFBfVFRYX0ZJTFRFUl8yX01BU0s0CSgweEI5KQorI2RlZmluZSBSRUdfVkRQX1RUWF9GSUxURVJfMl9NQVNLNQkoMHhCQSkKKyNkZWZpbmUgUkVHX1ZEUF9UVFhfRklMVEVSX0NPTlRST0wJKDB4QkIpCisjZGVmaW5lIFJFR19WRFBfRklGT19XT1JEX0NPVU5UCQkoMHhCQykKKyNkZWZpbmUgUkVHX1ZEUF9GSUZPX0lOVEVSUlVQVF9USFJMRAkoMHhCRCkKKworLyogMHhCRSBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19WRFBfRklGT19SRVNFVAkJKDB4QkYpCisjZGVmaW5lIFJFR19WRFBfRklGT19PVVRQVVRfQ09OVFJPTAkoMHhDMCkKKyNkZWZpbmUgUkVHX1ZEUF9MSU5FX05VTUJFUl9JTlRFUlJVUFQJKDB4QzEpCisjZGVmaW5lIFJFR19WRFBfUElYRUxfQUxJR05NRU5UX0xTQgkoMHhDMikKKyNkZWZpbmUgUkVHX1ZEUF9QSVhFTF9BTElHTk1FTlRfTVNCCSgweEMzKQorCisvKiAweEM0IC0gMHhENSBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19WRFBfTElORV9TVEFSVAkJKDB4RDYpCisjZGVmaW5lIFJFR19WRFBfTElORV9TVE9QCQkoMHhENykKKyNkZWZpbmUgUkVHX1ZEUF9HTE9CQUxfTElORV9NT0RFCSgweEQ4KQorI2RlZmluZSBSRUdfVkRQX0ZVTExfRklFTERfRU5BQkxFCSgweEQ5KQorI2RlZmluZSBSRUdfVkRQX0ZVTExfRklFTERfTU9ERQkJKDB4REEpCisKKy8qIDB4REIgLSAweERGIFJlc2VydmVkICovCisKKyNkZWZpbmUgUkVHX1ZCVVNfREFUQV9BQ0NFU1NfTk9fVkJVU19BRERSX0lOQ1IJKDB4RTApCisjZGVmaW5lIFJFR19WQlVTX0RBVEFfQUNDRVNTX1ZCVVNfQUREUl9JTkNSCSgweEUxKQorI2RlZmluZSBSRUdfRklGT19SRUFEX0RBVEEJCQkoMHhFMikKKworLyogMHhFMyAtIDB4RTcgUmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRUdfVkJVU19BRERSRVNTX0FDQ0VTUzEJKDB4RTgpCisjZGVmaW5lIFJFR19WQlVTX0FERFJFU1NfQUNDRVNTMgkoMHhFOSkKKyNkZWZpbmUgUkVHX1ZCVVNfQUREUkVTU19BQ0NFU1MzCSgweEVBKQorCisvKiAweEVCIC0gMHhFRiBSZXNlcnZlZCAqLworCisjZGVmaW5lIFJFR19JTlRFUlJVUFRfUkFXX1NUQVRVUzAJKDB4RjApCisjZGVmaW5lIFJFR19JTlRFUlJVUFRfUkFXX1NUQVRVUzEJKDB4RjEpCisjZGVmaW5lIFJFR19JTlRFUlJVUFRfU1RBVFVTMAkJKDB4RjIpCisjZGVmaW5lIFJFR19JTlRFUlJVUFRfU1RBVFVTMQkJKDB4RjMpCisjZGVmaW5lIFJFR19JTlRFUlJVUFRfTUFTSzAJCSgweEY0KQorI2RlZmluZSBSRUdfSU5URVJSVVBUX01BU0sxCQkoMHhGNSkKKyNkZWZpbmUgUkVHX0lOVEVSUlVQVF9DTEVBUjAJCSgweEY2KQorI2RlZmluZSBSRUdfSU5URVJSVVBUX0NMRUFSMQkJKDB4RjcpCisKKy8qIDB4RjggLSAweEZGIFJlc2VydmVkICovCisKKy8qCisgKiBNYXNrIGFuZCBiaXQgZGVmaW5pdGlvbnMgb2YgVFZQNTE0Ni80NyByZWdpc3RlcnMKKyAqLworLyogVGhlIElEIHZhbHVlcyB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKyNkZWZpbmUgVFZQNTE0WF9DSElQX0lEX01TQgkJKDB4NTEpCisjZGVmaW5lIFRWUDUxNDZfQ0hJUF9JRF9MU0IJCSgweDQ2KQorI2RlZmluZSBUVlA1MTQ3X0NISVBfSURfTFNCCQkoMHg0NykKKworI2RlZmluZSBWSURFT19TVERfTUFTSwkJCSgweDA3KQorI2RlZmluZSBWSURFT19TVERfQVVUT19TV0lUQ0hfQklUCSgweDAwKQorI2RlZmluZSBWSURFT19TVERfTlRTQ19NSl9CSVQJCSgweDAxKQorI2RlZmluZSBWSURFT19TVERfUEFMX0JER0hJTl9CSVQJKDB4MDIpCisjZGVmaW5lIFZJREVPX1NURF9QQUxfTV9CSVQJCSgweDAzKQorI2RlZmluZSBWSURFT19TVERfUEFMX0NPTUJJTkFUSU9OX05fQklUCSgweDA0KQorI2RlZmluZSBWSURFT19TVERfTlRTQ180XzQzX0JJVAkJKDB4MDUpCisjZGVmaW5lIFZJREVPX1NURF9TRUNBTV9CSVQJCSgweDA2KQorI2RlZmluZSBWSURFT19TVERfUEFMXzYwX0JJVAkJKDB4MDcpCisKKy8qCisgKiBTdGF0dXMgYml0CisgKi8KKyNkZWZpbmUgU1RBVFVTX1RWX1ZDUl9CSVQJCSgxPDwwKQorI2RlZmluZSBTVEFUVVNfSE9SWl9TWU5DX0xPQ0tfQklUCSgxPDwxKQorI2RlZmluZSBTVEFUVVNfVklSVF9TWU5DX0xPQ0tfQklUCSgxPDwyKQorI2RlZmluZSBTVEFUVVNfQ0xSX1NVQkNBUl9MT0NLX0JJVAkoMTw8MykKKyNkZWZpbmUgU1RBVFVTX0xPU1RfTE9DS19ERVRFQ1RfQklUCSgxPDw0KQorI2RlZmluZSBTVEFUVVNfRkVJTERfUkFURV9CSVQJCSgxPDw1KQorI2RlZmluZSBTVEFUVVNfTElORV9BTFRFUk5BVElOR19CSVQJKDE8PDYpCisjZGVmaW5lIFNUQVRVU19QRUFLX1dISVRFX0RFVEVDVF9CSVQJKDE8PDcpCisKKy8qIFRva2VucyBmb3IgcmVnaXN0ZXIgd3JpdGUgKi8KKyNkZWZpbmUgVE9LX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAoMCkgICAgIC8qIHRva2VuIGZvciB3cml0ZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgVE9LX1RFUk0gICAgICAgICAgICAgICAgICAgICAgICAoMSkgICAgIC8qIHRlcm1pbmF0aW5nIHRva2VuICovCisjZGVmaW5lIFRPS19ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgKDIpICAgICAvKiBkZWxheSB0b2tlbiBmb3IgcmVnIGxpc3QgKi8KKyNkZWZpbmUgVE9LX1NLSVAgICAgICAgICAgICAgICAgICAgICAgICAoMykgICAgIC8qIHRva2VuIHRvIHNraXAgYSByZWdpc3RlciAqLworLyoqCisgKiBzdHJ1Y3QgdHZwNTE0eF9yZWcgLSBTdHJ1Y3R1cmUgZm9yIFRWUDUxNDYvNDcgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gdmFsdWVzCisgKiBAdG9rZW4gLSBUb2tlbjogVE9LX1dSSVRFLCBUT0tfVEVSTSBldGMuLgorICogQHJlZyAtIFJlZ2lzdGVyIG9mZnNldAorICogQHZhbCAtIFJlZ2lzdGVyIFZhbHVlIGZvciBUT0tfV1JJVEUgb3IgZGVsYXkgaW4gbXMgZm9yIFRPS19ERUxBWQorICovCitzdHJ1Y3QgdHZwNTE0eF9yZWcgeworCXU4IHRva2VuOworCXU4IHJlZzsKKwl1MzIgdmFsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdHZwNTE0eF9pbml0X3NlcSAtIFN0cnVjdHVyZSBmb3IgVFZQNTE0Ni80Ny80Nk0yLzQ3TTEgcG93ZXIgdXAKKyAqCQlTZXF1ZW5jZS4KKyAqIEAgbm9fcmVncyAtIE51bWJlciBvZiByZWdpc3RlcnMgdG8gd3JpdGUgZm9yIHBvd2VyIHVwIHNlcXVlbmNlLgorICogQCBpbml0X3JlZ19zZXEgLSBBcnJheSBvZiByZWdpc3RlcnMgYW5kIHJlc3BlY3RpdmUgdmFsdWUgdG8gd3JpdGUuCisgKi8KK3N0cnVjdCB0dnA1MTR4X2luaXRfc2VxIHsKKwl1bnNpZ25lZCBpbnQgbm9fcmVnczsKKwljb25zdCBzdHJ1Y3QgdHZwNTE0eF9yZWcgKmluaXRfcmVnX3NlcTsKK307CisjZW5kaWYJCQkJLyogaWZuZGVmIF9UVlA1MTRYX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwppbmRleCAyOGFmNWNlLi5hMzg4YTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwpAQCAtOSw4ICs5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3R2cDUxNTAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKICNpbmNsdWRlICJ0dnA1MTUwX3JlZy5oIgogCkBAIC0yOSwyMSArMzEsNyBAQAogCiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7Ci0KLSNkZWZpbmUgdHZwNTE1MF9lcnIoZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0VSUiAiJXMgJWQtJTA0eDogIiBmbXQsIGMtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkgICAgICAgaTJjX2FkYXB0ZXJfaWQoYy0+YWRhcHRlciksIGMtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0dnA1MTUwX2luZm8oZm10LCBhcmcuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCBjLT5kcml2ZXItPmRyaXZlci5uYW1lLCBcCi0JICAgICAgIGkyY19hZGFwdGVyX2lkKGMtPmFkYXB0ZXIpLCBjLT5hZGRyICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdHZwNTE1MF9kYmcobnVtLCBmbXQsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAoZGVidWcgPj0gbnVtKSBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZGVidWcgJWQtJTA0eDogIiBmbXQsXAotCQkJCWMtPmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKLQkJCQlpMmNfYWRhcHRlcl9pZChjLT5hZGFwdGVyKSwgXAotCQkJCWMtPmFkZHIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTIpIik7CiAKIC8qIHN1cHBvcnRlZCBjb250cm9scyAqLwogc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB0dnA1MTUwX3FjdHJsW10gPSB7CkBAIC04Nyw3ICs3NSw3IEBACiB9OwogCiBzdHJ1Y3QgdHZwNTE1MCB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAKIAl2NGwyX3N0ZF9pZCBub3JtOwkvKiBDdXJyZW50IHNldCBzdGFuZGFyZCAqLwogCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CkBAIC05OCw0OSArODYsNTcgQEAKIAlpbnQgc2F0OwogfTsKIAotc3RhdGljIGludCB0dnA1MTUwX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHR2cDUxNTAgKnRvX3R2cDUxNTAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgdHZwNTE1MCwgc2QpOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKIAlpbnQgcmM7CiAKIAlidWZmZXJbMF0gPSBhZGRyOwogCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDEpKSkKLQkJdHZwNTE1MF9kYmcoMCwgImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMSlcbiIsIHJjKTsKKwkJdjRsMl9kYmcoMCwgZGVidWcsIHNkLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOwogCiAJbXNsZWVwKDEwKTsKIAogCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDEpKSkKLQkJdHZwNTE1MF9kYmcoMCwgImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgMSlcbiIsIHJjKTsKKwkJdjRsMl9kYmcoMCwgZGVidWcsIHNkLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIiwgcmMpOwogCi0JdHZwNTE1MF9kYmcoMiwgInR2cDUxNTA6IHJlYWQgMHglMDJ4ID0gMHglMDJ4XG4iLCBhZGRyLCBidWZmZXJbMF0pOworCXY0bDJfZGJnKDIsIGRlYnVnLCBzZCwgInR2cDUxNTA6IHJlYWQgMHglMDJ4ID0gMHglMDJ4XG4iLCBhZGRyLCBidWZmZXJbMF0pOwogCiAJcmV0dXJuIChidWZmZXJbMF0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHZwNTE1MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciBhZGRyLAorc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgY2hhciBhZGRyLAogCQkJCSB1bnNpZ25lZCBjaGFyIHZhbHVlKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJdW5zaWduZWQgY2hhciBidWZmZXJbMl07CiAJaW50IHJjOwogCiAJYnVmZmVyWzBdID0gYWRkcjsKIAlidWZmZXJbMV0gPSB2YWx1ZTsKLQl0dnA1MTUwX2RiZygyLCAidHZwNTE1MDogd3JpdGluZyAweCUwMnggMHglMDJ4XG4iLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7CisJdjRsMl9kYmcoMiwgZGVidWcsIHNkLCAidHZwNTE1MDogd3JpdGluZyAweCUwMnggMHglMDJ4XG4iLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7CiAJaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgMikpKQotCQl0dnA1MTUwX2RiZygwLCAiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIiwgcmMpOworCQl2NGwyX2RiZygwLCBkZWJ1Zywgc2QsICJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLCByYyk7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfcmVnX3JhbmdlKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBjaGFyICpzLCB1OCBpbml0LCBjb25zdCB1OCBlbmQsaW50IG1heF9saW5lKQorc3RhdGljIHZvaWQgZHVtcF9yZWdfcmFuZ2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY2hhciAqcywgdTggaW5pdCwKKwkJCQljb25zdCB1OCBlbmQsIGludCBtYXhfbGluZSkKIHsKLQlpbnQgaT0wOworCWludCBpID0gMDsKIAotCXdoaWxlIChpbml0IT0odTgpKGVuZCsxKSkgewotCQlpZiAoKGklbWF4X2xpbmUpID09IDApIHsKLQkJCWlmIChpPjApCisJd2hpbGUgKGluaXQgIT0gKHU4KShlbmQgKyAxKSkgeworCQlpZiAoKGkgJSBtYXhfbGluZSkgPT0gMCkgeworCQkJaWYgKGkgPiAwKQogCQkJCXByaW50aygiXG4iKTsKLQkJCXByaW50aygidHZwNTE1MDogJXMgcmVnIDB4JTAyeCA9ICIscyxpbml0KTsKKwkJCXByaW50aygidHZwNTE1MDogJXMgcmVnIDB4JTAyeCA9ICIsIHMsIGluaXQpOwogCQl9Ci0JCXByaW50aygiJTAyeCAiLHR2cDUxNTBfcmVhZChjLCBpbml0KSk7CisJCXByaW50aygiJTAyeCAiLCB0dnA1MTUwX3JlYWQoc2QsIGluaXQpKTsKIAogCQlpbml0Kys7CiAJCWkrKzsKQEAgLTE0OCwxNDcgKzE0NCwxNDggQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjKQorc3RhdGljIGludCB0dnA1MTUwX2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlwcmludGsoInR2cDUxNTA6IFZpZGVvIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gIzEgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1ZEX0lOX1NSQ19TRUxfMSkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1ZEX0lOX1NSQ19TRUxfMSkpOwogCXByaW50aygidHZwNTE1MDogQW5hbG9nIGNoYW5uZWwgY29udHJvbHMgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0FOQUxfQ0hMX0NUTCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0FOQUxfQ0hMX0NUTCkpOwogCXByaW50aygidHZwNTE1MDogT3BlcmF0aW9uIG1vZGUgY29udHJvbHMgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX09QX01PREVfQ1RMKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfT1BfTU9ERV9DVEwpKTsKIAlwcmludGsoInR2cDUxNTA6IE1pc2NlbGxhbmVvdXMgY29udHJvbHMgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX01JU0NfQ1RMKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTUlTQ19DVEwpKTsKIAlwcmludGsoInR2cDUxNTA6IEF1dG9zd2l0Y2ggbWFzaz0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9BVVRPU1dfTVNLKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQVVUT1NXX01TSykpOwogCXByaW50aygidHZwNTE1MDogQ29sb3Iga2lsbGVyIHRocmVzaG9sZCBjb250cm9sID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9DT0xPUl9LSUxfVEhTSF9DVEwpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9DT0xPUl9LSUxfVEhTSF9DVEwpKTsKIAlwcmludGsoInR2cDUxNTA6IEx1bWluYW5jZSBwcm9jZXNzaW5nIGNvbnRyb2xzICMxICMyIGFuZCAjMyA9ICUwMnggJTAyeCAlMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9MVU1BX1BST0NfQ1RMXzEpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9MVU1BX1BST0NfQ1RMXzIpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9MVU1BX1BST0NfQ1RMXzMpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9MVU1BX1BST0NfQ1RMXzEpLAorCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0xVTUFfUFJPQ19DVExfMiksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTFVNQV9QUk9DX0NUTF8zKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBCcmlnaHRuZXNzIGNvbnRyb2wgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0JSSUdIVF9DVEwpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9CUklHSFRfQ1RMKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBDb2xvciBzYXR1cmF0aW9uIGNvbnRyb2wgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1NBVFVSQVRJT05fQ1RMKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfU0FUVVJBVElPTl9DVEwpKTsKIAlwcmludGsoInR2cDUxNTA6IEh1ZSBjb250cm9sID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9IVUVfQ1RMKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSFVFX0NUTCkpOwogCXByaW50aygidHZwNTE1MDogQ29udHJhc3QgY29udHJvbCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBPdXRwdXRzIGFuZCBkYXRhIHJhdGVzIHNlbGVjdCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfREFUQV9SQVRFX1NFTCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0RBVEFfUkFURV9TRUwpKTsKIAlwcmludGsoInR2cDUxNTA6IENvbmZpZ3VyYXRpb24gc2hhcmVkIHBpbnMgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0NPTkZfU0hBUkVEX1BJTikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0NPTkZfU0hBUkVEX1BJTikpOwogCXByaW50aygidHZwNTE1MDogQWN0aXZlIHZpZGVvIGNyb3BwaW5nIHN0YXJ0ID0gMHglMDJ4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfQUNUX1ZEX0NST1BfU1RfTVNCKSwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfQUNUX1ZEX0NST1BfU1RfTFNCKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQUNUX1ZEX0NST1BfU1RfTVNCKSwKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9BQ1RfVkRfQ1JPUF9TVF9MU0IpKTsKIAlwcmludGsoInR2cDUxNTA6IEFjdGl2ZSB2aWRlbyBjcm9wcGluZyBzdG9wICA9IDB4JTAyeCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0FDVF9WRF9DUk9QX1NUUF9NU0IpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9BQ1RfVkRfQ1JPUF9TVFBfTFNCKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQUNUX1ZEX0NST1BfU1RQX01TQiksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQUNUX1ZEX0NST1BfU1RQX0xTQikpOwogCXByaW50aygidHZwNTE1MDogR2VubG9jay9SVEMgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0dFTkxPQ0spKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9HRU5MT0NLKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBIb3Jpem9udGFsIHN5bmMgc3RhcnQgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0hPUklaX1NZTkNfU1RBUlQpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9IT1JJWl9TWU5DX1NUQVJUKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBWZXJ0aWNhbCBibGFua2luZyBzdGFydCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfVkVSVF9CTEFOS0lOR19TVEFSVCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1ZFUlRfQkxBTktJTkdfU1RBUlQpKTsKIAlwcmludGsoInR2cDUxNTA6IFZlcnRpY2FsIGJsYW5raW5nIHN0b3AgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1ZFUlRfQkxBTktJTkdfU1RPUCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1ZFUlRfQkxBTktJTkdfU1RPUCkpOwogCXByaW50aygidHZwNTE1MDogQ2hyb21pbmFuY2UgcHJvY2Vzc2luZyBjb250cm9sICMxIGFuZCAjMiA9ICUwMnggJTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfQ0hST01BX1BST0NfQ1RMXzEpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9DSFJPTUFfUFJPQ19DVExfMikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0NIUk9NQV9QUk9DX0NUTF8xKSwKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9DSFJPTUFfUFJPQ19DVExfMikpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IHJlc2V0IHJlZ2lzdGVyIEIgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0lOVF9SRVNFVF9SRUdfQikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0lOVF9SRVNFVF9SRUdfQikpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciBCID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9JTlRfRU5BQkxFX1JFR19CKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSU5UX0VOQUJMRV9SRUdfQikpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgQiA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfSU5UVF9DT05GSUdfUkVHX0IpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9JTlRUX0NPTkZJR19SRUdfQikpOwogCXByaW50aygidHZwNTE1MDogVmlkZW8gc3RhbmRhcmQgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1ZJREVPX1NURCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1ZJREVPX1NURCkpOwogCXByaW50aygidHZwNTE1MDogQ2hyb21hIGdhaW4gZmFjdG9yOiBDYj0weCUwMnggQ3I9MHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9DQl9HQUlOX0ZBQ1QpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9DUl9HQUlOX0ZBQ1RPUikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0NCX0dBSU5fRkFDVCksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQ1JfR0FJTl9GQUNUT1IpKTsKIAlwcmludGsoInR2cDUxNTA6IE1hY3JvdmlzaW9uIG9uIGNvdW50ZXIgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX01BQ1JPVklTSU9OX09OX0NUUikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX01BQ1JPVklTSU9OX09OX0NUUikpOwogCXByaW50aygidHZwNTE1MDogTWFjcm92aXNpb24gb2ZmIGNvdW50ZXIgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX01BQ1JPVklTSU9OX09GRl9DVFIpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9NQUNST1ZJU0lPTl9PRkZfQ1RSKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBJVFUtUiBCVC42NTYuJWQgdGltaW5nKFRWUDUxNTBBTTEgb25seSlcbiIsCi0JCQkJCSh0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9SRVZfU0VMRUNUKSYxKT8zOjQpOworCQkJKHR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9SRVZfU0VMRUNUKSAmIDEpID8gMyA6IDQpOwogCXByaW50aygidHZwNTE1MDogRGV2aWNlIElEID0gJTAyeCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX01TQl9ERVZfSUQpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9MU0JfREVWX0lEKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTVNCX0RFVl9JRCksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTFNCX0RFVl9JRCkpOwogCXByaW50aygidHZwNTE1MDogUk9NIHZlcnNpb24gPSAoaGV4KSAlMDJ4LiUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1JPTV9NQUpPUl9WRVIpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9ST01fTUlOT1JfVkVSKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfUk9NX01BSk9SX1ZFUiksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfUk9NX01JTk9SX1ZFUikpOwogCXByaW50aygidHZwNTE1MDogVmVydGljYWwgbGluZSBjb3VudCA9IDB4JTAyeCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1ZFUlRfTE5fQ09VTlRfTVNCKSwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfVkVSVF9MTl9DT1VOVF9MU0IpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9WRVJUX0xOX0NPVU5UX01TQiksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfVkVSVF9MTl9DT1VOVF9MU0IpKTsKIAlwcmludGsoInR2cDUxNTA6IEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgQiA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfSU5UX1NUQVRVU19SRUdfQikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0lOVF9TVEFUVVNfUkVHX0IpKTsKIAlwcmludGsoInR2cDUxNTA6IEludGVycnVwdCBhY3RpdmUgcmVnaXN0ZXIgQiA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfSU5UX0FDVElWRV9SRUdfQikpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0lOVF9BQ1RJVkVfUkVHX0IpKTsKIAlwcmludGsoInR2cDUxNTA6IFN0YXR1cyByZWdzICMxIHRvICM1ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9TVEFUVVNfUkVHXzEpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9TVEFUVVNfUkVHXzIpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9TVEFUVVNfUkVHXzMpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9TVEFUVVNfUkVHXzQpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9TVEFUVVNfUkVHXzUpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9TVEFUVVNfUkVHXzEpLAorCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1NUQVRVU19SRUdfMiksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfU1RBVFVTX1JFR18zKSwKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9TVEFUVVNfUkVHXzQpLAorCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1NUQVRVU19SRUdfNSkpOwogCi0JZHVtcF9yZWdfcmFuZ2UoYywiVGVsZXRleHQgZmlsdGVyIDEiLCAgIFRWUDUxNTBfVEVMRVRFWFRfRklMMV9JTkksCi0JCQkJCQlUVlA1MTUwX1RFTEVURVhUX0ZJTDFfRU5ELDgpOwotCWR1bXBfcmVnX3JhbmdlKGMsIlRlbGV0ZXh0IGZpbHRlciAyIiwgICBUVlA1MTUwX1RFTEVURVhUX0ZJTDJfSU5JLAotCQkJCQkJVFZQNTE1MF9URUxFVEVYVF9GSUwyX0VORCw4KTsKKwlkdW1wX3JlZ19yYW5nZShzZCwgIlRlbGV0ZXh0IGZpbHRlciAxIiwgICBUVlA1MTUwX1RFTEVURVhUX0ZJTDFfSU5JLAorCQkJVFZQNTE1MF9URUxFVEVYVF9GSUwxX0VORCwgOCk7CisJZHVtcF9yZWdfcmFuZ2Uoc2QsICJUZWxldGV4dCBmaWx0ZXIgMiIsICAgVFZQNTE1MF9URUxFVEVYVF9GSUwyX0lOSSwKKwkJCVRWUDUxNTBfVEVMRVRFWFRfRklMMl9FTkQsIDgpOwogCiAJcHJpbnRrKCJ0dnA1MTUwOiBUZWxldGV4dCBmaWx0ZXIgZW5hYmxlID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9URUxFVEVYVF9GSUxfRU5BKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfVEVMRVRFWFRfRklMX0VOQSkpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBBID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9JTlRfU1RBVFVTX1JFR19BKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSU5UX1NUQVRVU19SRUdfQSkpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciBBID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9JTlRfRU5BQkxFX1JFR19BKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSU5UX0VOQUJMRV9SRUdfQSkpOwogCXByaW50aygidHZwNTE1MDogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0lOVF9DT05GKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSU5UX0NPTkYpKTsKIAlwcmludGsoInR2cDUxNTA6IFZEUCBzdGF0dXMgcmVnaXN0ZXIgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1ZEUF9TVEFUVVNfUkVHKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfVkRQX1NUQVRVU19SRUcpKTsKIAlwcmludGsoInR2cDUxNTA6IEZJRk8gd29yZCBjb3VudCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfRklGT19XT1JEX0NPVU5UKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfRklGT19XT1JEX0NPVU5UKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBGSUZPIGludGVycnVwdCB0aHJlc2hvbGQgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0ZJRk9fSU5UX1RIUkVTSE9MRCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0ZJRk9fSU5UX1RIUkVTSE9MRCkpOwogCXByaW50aygidHZwNTE1MDogRklGTyByZXNldCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfRklGT19SRVNFVCkpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0ZJRk9fUkVTRVQpKTsKIAlwcmludGsoInR2cDUxNTA6IExpbmUgbnVtYmVyIGludGVycnVwdCA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfTElORV9OVU1CRVJfSU5UKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTElORV9OVU1CRVJfSU5UKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBQaXhlbCBhbGlnbm1lbnQgcmVnaXN0ZXIgPSAweCUwMnglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9QSVhfQUxJR05fUkVHX0hJR0gpLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9QSVhfQUxJR05fUkVHX0xPVykpOworCQkJdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1BJWF9BTElHTl9SRUdfSElHSCksCisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfUElYX0FMSUdOX1JFR19MT1cpKTsKIAlwcmludGsoInR2cDUxNTA6IEZJRk8gb3V0cHV0IGNvbnRyb2wgPSAweCUwMnhcbiIsCi0JCQkJCXR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX0ZJRk9fT1VUX0NUUkwpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9GSUZPX09VVF9DVFJMKSk7CiAJcHJpbnRrKCJ0dnA1MTUwOiBGdWxsIGZpZWxkIGVuYWJsZSA9IDB4JTAyeFxuIiwKLQkJCQkJdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfRlVMTF9GSUVMRF9FTkEpKTsKKwkJCXR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9GVUxMX0ZJRUxEX0VOQSkpOwogCXByaW50aygidHZwNTE1MDogRnVsbCBmaWVsZCBtb2RlIHJlZ2lzdGVyID0gMHglMDJ4XG4iLAotCQkJCQl0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9GVUxMX0ZJRUxEX01PREVfUkVHKSk7CisJCQl0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfRlVMTF9GSUVMRF9NT0RFX1JFRykpOwogCi0JZHVtcF9yZWdfcmFuZ2UoYywiQ0MgICBkYXRhIiwgICBUVlA1MTUwX0NDX0RBVEFfSU5JLAotCQkJCQlUVlA1MTUwX0NDX0RBVEFfRU5ELDgpOworCWR1bXBfcmVnX3JhbmdlKHNkLCAiQ0MgICBkYXRhIiwgICBUVlA1MTUwX0NDX0RBVEFfSU5JLAorCQkJVFZQNTE1MF9DQ19EQVRBX0VORCwgOCk7CiAKLQlkdW1wX3JlZ19yYW5nZShjLCJXU1MgIGRhdGEiLCAgIFRWUDUxNTBfV1NTX0RBVEFfSU5JLAotCQkJCQlUVlA1MTUwX1dTU19EQVRBX0VORCw4KTsKKwlkdW1wX3JlZ19yYW5nZShzZCwgIldTUyAgZGF0YSIsICAgVFZQNTE1MF9XU1NfREFUQV9JTkksCisJCQlUVlA1MTUwX1dTU19EQVRBX0VORCwgOCk7CiAKLQlkdW1wX3JlZ19yYW5nZShjLCJWUFMgIGRhdGEiLCAgIFRWUDUxNTBfVlBTX0RBVEFfSU5JLAotCQkJCQlUVlA1MTUwX1ZQU19EQVRBX0VORCw4KTsKKwlkdW1wX3JlZ19yYW5nZShzZCwgIlZQUyAgZGF0YSIsICAgVFZQNTE1MF9WUFNfREFUQV9JTkksCisJCQlUVlA1MTUwX1ZQU19EQVRBX0VORCwgOCk7CiAKLQlkdW1wX3JlZ19yYW5nZShjLCJWSVRDIGRhdGEiLCAgIFRWUDUxNTBfVklUQ19EQVRBX0lOSSwKLQkJCQkJVFZQNTE1MF9WSVRDX0RBVEFfRU5ELDEwKTsKKwlkdW1wX3JlZ19yYW5nZShzZCwgIlZJVEMgZGF0YSIsICAgVFZQNTE1MF9WSVRDX0RBVEFfSU5JLAorCQkJVFZQNTE1MF9WSVRDX0RBVEFfRU5ELCAxMCk7CiAKLQlkdW1wX3JlZ19yYW5nZShjLCJMaW5lIG1vZGUiLCAgIFRWUDUxNTBfTElORV9NT0RFX0lOSSwKLQkJCQkJVFZQNTE1MF9MSU5FX01PREVfRU5ELDgpOworCWR1bXBfcmVnX3JhbmdlKHNkLCAiTGluZSBtb2RlIiwgICBUVlA1MTUwX0xJTkVfTU9ERV9JTkksCisJCQlUVlA1MTUwX0xJTkVfTU9ERV9FTkQsIDgpOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJQmFzaWMgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfc2VsbXV4KHN0cnVjdCBpMmNfY2xpZW50ICpjKQorc3RhdGljIGlubGluZSB2b2lkIHR2cDUxNTBfc2VsbXV4KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJaW50IG9wbW9kZT0wOwotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gdG9fdHZwNTE1MChzZCk7CiAJaW50IGlucHV0ID0gMDsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIApAQCAtMzA5LDIzICszMDYsMjMgQEAKIAkJYnJlYWs7CiAJfQogCi0JdHZwNTE1MF9kYmcoIDEsICJTZWxlY3RpbmcgdmlkZW8gcm91dGU6IHJvdXRlIGlucHV0PSVpLCBvdXRwdXQ9JWkgIgorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNlbGVjdGluZyB2aWRlbyByb3V0ZTogcm91dGUgaW5wdXQ9JWksIG91dHB1dD0laSAiCiAJCQkiPT4gdHZwNTE1MCBpbnB1dD0laSwgb3Btb2RlPSVpXG4iLAogCQkJZGVjb2Rlci0+cm91dGUuaW5wdXQsZGVjb2Rlci0+cm91dGUub3V0cHV0LAogCQkJaW5wdXQsIG9wbW9kZSApOwogCi0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX09QX01PREVfQ1RMLCBvcG1vZGUpOwotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9WRF9JTl9TUkNfU0VMXzEsIGlucHV0KTsKKwl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX09QX01PREVfQ1RMLCBvcG1vZGUpOworCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfVkRfSU5fU1JDX1NFTF8xLCBpbnB1dCk7CiAKIAkvKiBTdmlkZW8gc2hvdWxkIGVuYWJsZSBZQ3JDYiBvdXRwdXQgYW5kIGRpc2FibGUgR1BDTCBvdXRwdXQKIAkgKiBGb3IgQ29tcG9zaXRlIGFuZCBUViwgaXQgc2hvdWxkIGJlIHRoZSByZXZlcnNlCiAJICovCi0JdmFsID0gdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfTUlTQ19DVEwpOworCXZhbCA9IHR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9NSVNDX0NUTCk7CiAJaWYgKGRlY29kZXItPnJvdXRlLmlucHV0ID09IFRWUDUxNTBfU1ZJREVPKQogCQl2YWwgPSAodmFsICYgfjB4NDApIHwgMHgxMDsKIAllbHNlCiAJCXZhbCA9ICh2YWwgJiB+MHgxMCkgfCAweDQwOwotCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9NSVNDX0NUTCwgdmFsKTsKKwl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX01JU0NfQ1RMLCB2YWwpOwogfTsKIAogc3RydWN0IGkyY19yZWdfdmFsdWUgewpAQCAtNTkzLDM1ICs1OTAsMzUgQEAKIAl7ICh1MTYpLTEgfQogfTsKIAotc3RhdGljIGludCB0dnA1MTUwX3dyaXRlX2luaXR0YWIoc3RydWN0IGkyY19jbGllbnQgKmMsCitzdGF0aWMgaW50IHR2cDUxNTBfd3JpdGVfaW5pdHRhYihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCWNvbnN0IHN0cnVjdCBpMmNfcmVnX3ZhbHVlICpyZWdzKQogewogCXdoaWxlIChyZWdzLT5yZWcgIT0gMHhmZikgewotCQl0dnA1MTUwX3dyaXRlKGMsIHJlZ3MtPnJlZywgcmVncy0+dmFsdWUpOworCQl0dnA1MTUwX3dyaXRlKHNkLCByZWdzLT5yZWcsIHJlZ3MtPnZhbHVlKTsKIAkJcmVncysrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0dnA1MTUwX3ZkcF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjLAorc3RhdGljIGludCB0dnA1MTUwX3ZkcF9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkJY29uc3Qgc3RydWN0IGkyY192YmlfcmFtX3ZhbHVlICpyZWdzKQogewogCXVuc2lnbmVkIGludCBpOwogCiAJLyogRGlzYWJsZSBGdWxsIEZpZWxkICovCi0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0ZVTExfRklFTERfRU5BLCAwKTsKKwl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX0ZVTExfRklFTERfRU5BLCAwKTsKIAogCS8qIEJlZm9yZSBwcm9ncmFtbWluZywgTGluZSBtb2RlIHNob3VsZCBiZSBhdCAweGZmICovCi0JZm9yIChpPVRWUDUxNTBfTElORV9NT0RFX0lOSTsgaTw9VFZQNTE1MF9MSU5FX01PREVfRU5EOyBpKyspCi0JCXR2cDUxNTBfd3JpdGUoYywgaSwgMHhmZik7CisJZm9yIChpID0gVFZQNTE1MF9MSU5FX01PREVfSU5JOyBpIDw9IFRWUDUxNTBfTElORV9NT0RFX0VORDsgaSsrKQorCQl0dnA1MTUwX3dyaXRlKHNkLCBpLCAweGZmKTsKIAogCS8qIExvYWQgUmFtIFRhYmxlICovCi0Jd2hpbGUgKHJlZ3MtPnJlZyAhPSAodTE2KS0xICkgewotCQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQ09ORl9SQU1fQUREUl9ISUdILHJlZ3MtPnJlZz4+OCk7Ci0JCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9DT05GX1JBTV9BRERSX0xPVyxyZWdzLT5yZWcpOworCXdoaWxlIChyZWdzLT5yZWcgIT0gKHUxNiktMSkgeworCQl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX0NPTkZfUkFNX0FERFJfSElHSCwgcmVncy0+cmVnID4+IDgpOworCQl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX0NPTkZfUkFNX0FERFJfTE9XLCByZWdzLT5yZWcpOwogCi0JCWZvciAoaT0wO2k8MTY7aSsrKQotCQkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX1ZEUF9DT05GX1JBTV9EQVRBLHJlZ3MtPnZhbHVlc1tpXSk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJdHZwNTE1MF93cml0ZShzZCwgVFZQNTE1MF9WRFBfQ09ORl9SQU1fREFUQSwgcmVncy0+dmFsdWVzW2ldKTsKIAogCQlyZWdzKys7CiAJfQpAQCAtNjI5LDExICs2MjYsMTMgQEAKIH0KIAogLyogRmlsbHMgVkJJIGNhcGFiaWxpdGllcyBiYXNlZCBvbiBpMmNfdmJpX3JhbV92YWx1ZSBzdHJ1Y3QgKi8KLXN0YXRpYyB2b2lkIHR2cDUxNTBfdmJpX2dldF9jYXAoY29uc3Qgc3RydWN0IGkyY192YmlfcmFtX3ZhbHVlICpyZWdzLAorc3RhdGljIGludCB0dnA1MTUwX2dfc2xpY2VkX3ZiaV9jYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCAqY2FwKQogeworCWNvbnN0IHN0cnVjdCBpMmNfdmJpX3JhbV92YWx1ZSAqcmVncyA9IHZiaV9yYW1fZGVmYXVsdDsKIAlpbnQgbGluZTsKIAorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQXG4iKTsKIAltZW1zZXQoY2FwLCAwLCBzaXplb2YgKmNhcCk7CiAKIAl3aGlsZSAocmVncy0+cmVnICE9ICh1MTYpLTEgKSB7CkBAIC02NDQsNiArNjQzLDcgQEAKIAogCQlyZWdzKys7CiAJfQorCXJldHVybiAwOwogfQogCiAvKiBTZXQgdmJpIHByb2Nlc3NpbmcKQEAgLTY1OSwxOCArNjU5LDE4IEBACiAgKglMU0IgPSBmaWVsZDEKICAqCU1TQiA9IGZpZWxkMgogICovCi1zdGF0aWMgaW50IHR2cDUxNTBfc2V0X3ZiaShzdHJ1Y3QgaTJjX2NsaWVudCAqYywKK3N0YXRpYyBpbnQgdHZwNTE1MF9zZXRfdmJpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQljb25zdCBzdHJ1Y3QgaTJjX3ZiaV9yYW1fdmFsdWUgKnJlZ3MsCiAJCQl1bnNpZ25lZCBpbnQgdHlwZSx1OCBmbGFncywgaW50IGxpbmUsCiAJCQljb25zdCBpbnQgZmllbGRzKQogewotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXY0bDJfc3RkX2lkIHN0ZD1kZWNvZGVyLT5ub3JtOworCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gdG9fdHZwNTE1MChzZCk7CisJdjRsMl9zdGRfaWQgc3RkID0gZGVjb2Rlci0+bm9ybTsKIAl1OCByZWc7CiAJaW50IHBvcz0wOwogCiAJaWYgKHN0ZCA9PSBWNEwyX1NURF9BTEwpIHsKLQkJdHZwNTE1MF9lcnIoIlZCSSBjYW4ndCBiZSBjb25maWd1cmVkIHdpdGhvdXQga25vd2luZyBudW1iZXIgb2YgbGluZXNcbiIpOworCQl2NGwyX2VycihzZCwgIlZCSSBjYW4ndCBiZSBjb25maWd1cmVkIHdpdGhvdXQga25vd2luZyBudW1iZXIgb2YgbGluZXNcbiIpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REXzYyNV81MCkgewogCQkvKiBEb24ndCBmb2xsb3cgTlRTQyBMaW5lIG51bWJlciBjb252ZW5zaW9uICovCkBAIC02OTgsMTYzICs2OTgsMTg2IEBACiAJcmVnPSgobGluZS02KTw8MSkrVFZQNTE1MF9MSU5FX01PREVfSU5JOwogCiAJaWYgKGZpZWxkcyYxKSB7Ci0JCXR2cDUxNTBfd3JpdGUoYywgcmVnLCB0eXBlKTsKKwkJdHZwNTE1MF93cml0ZShzZCwgcmVnLCB0eXBlKTsKIAl9CiAKIAlpZiAoZmllbGRzJjIpIHsKLQkJdHZwNTE1MF93cml0ZShjLCByZWcrMSwgdHlwZSk7CisJCXR2cDUxNTBfd3JpdGUoc2QsIHJlZysxLCB0eXBlKTsKIAl9CiAKIAlyZXR1cm4gdHlwZTsKIH0KIAotc3RhdGljIGludCB0dnA1MTUwX2dldF92Ymkoc3RydWN0IGkyY19jbGllbnQgKmMsCitzdGF0aWMgaW50IHR2cDUxNTBfZ2V0X3ZiaShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJY29uc3Qgc3RydWN0IGkyY192YmlfcmFtX3ZhbHVlICpyZWdzLCBpbnQgbGluZSkKIHsKLQlzdHJ1Y3QgdHZwNTE1MCAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQl2NGwyX3N0ZF9pZCBzdGQ9ZGVjb2Rlci0+bm9ybTsKKwlzdHJ1Y3QgdHZwNTE1MCAqZGVjb2RlciA9IHRvX3R2cDUxNTAoc2QpOworCXY0bDJfc3RkX2lkIHN0ZCA9IGRlY29kZXItPm5vcm07CiAJdTggcmVnOwotCWludCBwb3MsIHR5cGU9MDsKKwlpbnQgcG9zLCB0eXBlID0gMDsKIAogCWlmIChzdGQgPT0gVjRMMl9TVERfQUxMKSB7Ci0JCXR2cDUxNTBfZXJyKCJWQkkgY2FuJ3QgYmUgY29uZmlndXJlZCB3aXRob3V0IGtub3dpbmcgbnVtYmVyIG9mIGxpbmVzXG4iKTsKKwkJdjRsMl9lcnIoc2QsICJWQkkgY2FuJ3QgYmUgY29uZmlndXJlZCB3aXRob3V0IGtub3dpbmcgbnVtYmVyIG9mIGxpbmVzXG4iKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF82MjVfNTApIHsKIAkJLyogRG9uJ3QgZm9sbG93IE5UU0MgTGluZSBudW1iZXIgY29udmVuc2lvbiAqLwogCQlsaW5lICs9IDM7CiAJfQogCi0JaWYgKGxpbmU8Nnx8bGluZT4yNykKKwlpZiAobGluZSA8IDYgfHwgbGluZSA+IDI3KQogCQlyZXR1cm4gMDsKIAotCXJlZz0oKGxpbmUtNik8PDEpK1RWUDUxNTBfTElORV9NT0RFX0lOSTsKKwlyZWcgPSAoKGxpbmUgLSA2KSA8PCAxKSArIFRWUDUxNTBfTElORV9NT0RFX0lOSTsKIAotCXBvcz10dnA1MTUwX3JlYWQoYywgcmVnKSYweDBmOwotCWlmIChwb3M8MHgwZikKLQkJdHlwZT1yZWdzW3Bvc10udHlwZS52YmlfdHlwZTsKKwlwb3MgPSB0dnA1MTUwX3JlYWQoc2QsIHJlZykgJiAweDBmOworCWlmIChwb3MgPCAweDBmKQorCQl0eXBlID0gcmVnc1twb3NdLnR5cGUudmJpX3R5cGU7CiAKLQlwb3M9dHZwNTE1MF9yZWFkKGMsIHJlZysxKSYweDBmOwotCWlmIChwb3M8MHgwZikKLQkJdHlwZXw9cmVnc1twb3NdLnR5cGUudmJpX3R5cGU7CisJcG9zID0gdHZwNTE1MF9yZWFkKHNkLCByZWcgKyAxKSAmIDB4MGY7CisJaWYgKHBvcyA8IDB4MGYpCisJCXR5cGUgfD0gcmVnc1twb3NdLnR5cGUudmJpX3R5cGU7CiAKIAlyZXR1cm4gdHlwZTsKIH0KLXN0YXRpYyBpbnQgdHZwNTE1MF9zZXRfc3RkKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB2NGwyX3N0ZF9pZCBzdGQpCi17Ci0Jc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0JaW50IGZtdD0wOwogCi0JZGVjb2Rlci0+bm9ybT1zdGQ7CitzdGF0aWMgaW50IHR2cDUxNTBfc2V0X3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBzdGQpCit7CisJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSB0b190dnA1MTUwKHNkKTsKKwlpbnQgZm10ID0gMDsKKworCWRlY29kZXItPm5vcm0gPSBzdGQ7CiAKIAkvKiBGaXJzdCB0ZXN0cyBzaG91bGQgYmUgYWdhaW5zdCBzcGVjaWZpYyBzdGQgKi8KIAogCWlmIChzdGQgPT0gVjRMMl9TVERfQUxMKSB7Ci0JCWZtdD0wOwkvKiBBdXRvZGV0ZWN0IG1vZGUgKi8KKwkJZm10ID0gMDsJLyogQXV0b2RldGVjdCBtb2RlICovCiAJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9OVFNDXzQ0MykgewotCQlmbXQ9MHhhOworCQlmbXQgPSAweGE7CiAJfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9QQUxfTSkgewotCQlmbXQ9MHg2OwotCX0gZWxzZSBpZiAoc3RkICYgKFY0TDJfU1REX1BBTF9OfCBWNEwyX1NURF9QQUxfTmMpKSB7Ci0JCWZtdD0weDg7CisJCWZtdCA9IDB4NjsKKwl9IGVsc2UgaWYgKHN0ZCAmIChWNEwyX1NURF9QQUxfTiB8IFY0TDJfU1REX1BBTF9OYykpIHsKKwkJZm10ID0gMHg4OwogCX0gZWxzZSB7CiAJCS8qIFRoZW4sIHRlc3QgYWdhaW5zdCBnZW5lcmljIG9uZXMgKi8KLQkJaWYgKHN0ZCAmIFY0TDJfU1REX05UU0MpIHsKLQkJCWZtdD0weDI7Ci0JCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7Ci0JCQlmbXQ9MHg0OwotCQl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7Ci0JCQlmbXQ9MHhjOwotCQl9CisJCWlmIChzdGQgJiBWNEwyX1NURF9OVFNDKQorCQkJZm10ID0gMHgyOworCQllbHNlIGlmIChzdGQgJiBWNEwyX1NURF9QQUwpCisJCQlmbXQgPSAweDQ7CisJCWVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKQorCQkJZm10ID0gMHhjOwogCX0KIAotCXR2cDUxNTBfZGJnKDEsIlNldCB2aWRlbyBzdGQgcmVnaXN0ZXIgdG8gJWQuXG4iLGZtdCk7Ci0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX1ZJREVPX1NURCwgZm10KTsKLQorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlNldCB2aWRlbyBzdGQgcmVnaXN0ZXIgdG8gJWQuXG4iLCBmbXQpOworCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfVklERU9fU1RELCBmbXQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHZwNTE1MF9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3N0YXRpYyBpbnQgdHZwNTE1MF9zX3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBzdGQpCiB7CisJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSB0b190dnA1MTUwKHNkKTsKKworCWlmIChkZWNvZGVyLT5ub3JtID09IHN0ZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdHZwNTE1MF9zZXRfc3RkKHNkLCBzdGQpOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgdHZwNTE1MCAqZGVjb2RlciA9IHRvX3R2cDUxNTAoc2QpOwogCXU4IG1zYl9pZCwgbHNiX2lkLCBtc2Jfcm9tLCBsc2Jfcm9tOwotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCi0JbXNiX2lkPXR2cDUxNTBfcmVhZChjLFRWUDUxNTBfTVNCX0RFVl9JRCk7Ci0JbHNiX2lkPXR2cDUxNTBfcmVhZChjLFRWUDUxNTBfTFNCX0RFVl9JRCk7Ci0JbXNiX3JvbT10dnA1MTUwX3JlYWQoYyxUVlA1MTUwX1JPTV9NQUpPUl9WRVIpOwotCWxzYl9yb209dHZwNTE1MF9yZWFkKGMsVFZQNTE1MF9ST01fTUlOT1JfVkVSKTsKKwltc2JfaWQgPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfTVNCX0RFVl9JRCk7CisJbHNiX2lkID0gdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX0xTQl9ERVZfSUQpOworCW1zYl9yb20gPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfUk9NX01BSk9SX1ZFUik7CisJbHNiX3JvbSA9IHR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9ST01fTUlOT1JfVkVSKTsKIAotCWlmICgobXNiX3JvbT09NCkmJihsc2Jfcm9tPT0wKSkgeyAvKiBJcyBUVlA1MTUwQU0xICovCi0JCXR2cDUxNTBfaW5mbygidHZwJTAyeCUwMnhhbTEgZGV0ZWN0ZWQuXG4iLG1zYl9pZCwgbHNiX2lkKTsKKwlpZiAobXNiX3JvbSA9PSA0ICYmIGxzYl9yb20gPT0gMCkgeyAvKiBJcyBUVlA1MTUwQU0xICovCisJCXY0bDJfaW5mbyhzZCwgInR2cCUwMnglMDJ4YW0xIGRldGVjdGVkLlxuIiwgbXNiX2lkLCBsc2JfaWQpOwogCiAJCS8qIElUVS1UIEJULjY1Ni40IHRpbWluZyAqLwotCQl0dnA1MTUwX3dyaXRlKGMsVFZQNTE1MF9SRVZfU0VMRUNULDApOworCQl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX1JFVl9TRUxFQ1QsIDApOwogCX0gZWxzZSB7Ci0JCWlmICgobXNiX3JvbT09Myl8fChsc2Jfcm9tPT0weDIxKSkgeyAvKiBJcyBUVlA1MTUwQSAqLwotCQkJdHZwNTE1MF9pbmZvKCJ0dnAlMDJ4JTAyeGEgZGV0ZWN0ZWQuXG4iLG1zYl9pZCwgbHNiX2lkKTsKKwkJaWYgKG1zYl9yb20gPT0gMyB8fCBsc2Jfcm9tID09IDB4MjEpIHsgLyogSXMgVFZQNTE1MEEgKi8KKwkJCXY0bDJfaW5mbyhzZCwgInR2cCUwMnglMDJ4YSBkZXRlY3RlZC5cbiIsIG1zYl9pZCwgbHNiX2lkKTsKIAkJfSBlbHNlIHsKLQkJCXR2cDUxNTBfaW5mbygiKioqIHVua25vd24gdHZwJTAyeCUwMnggY2hpcCBkZXRlY3RlZC5cbiIsbXNiX2lkLGxzYl9pZCk7Ci0JCQl0dnA1MTUwX2luZm8oIioqKiBSb20gdmVyIGlzICVkLiVkXG4iLG1zYl9yb20sbHNiX3JvbSk7CisJCQl2NGwyX2luZm8oc2QsICIqKiogdW5rbm93biB0dnAlMDJ4JTAyeCBjaGlwIGRldGVjdGVkLlxuIiwKKwkJCQkJbXNiX2lkLCBsc2JfaWQpOworCQkJdjRsMl9pbmZvKHNkLCAiKioqIFJvbSB2ZXIgaXMgJWQuJWRcbiIsIG1zYl9yb20sIGxzYl9yb20pOwogCQl9CiAJfQogCiAJLyogSW5pdGlhbGl6ZXMgVFZQNTE1MCB0byBpdHMgZGVmYXVsdCB2YWx1ZXMgKi8KLQl0dnA1MTUwX3dyaXRlX2luaXR0YWIoYywgdHZwNTE1MF9pbml0X2RlZmF1bHQpOworCXR2cDUxNTBfd3JpdGVfaW5pdHRhYihzZCwgdHZwNTE1MF9pbml0X2RlZmF1bHQpOwogCiAJLyogSW5pdGlhbGl6ZXMgVkRQIHJlZ2lzdGVycyAqLwotCXR2cDUxNTBfdmRwX2luaXQoYywgdmJpX3JhbV9kZWZhdWx0KTsKKwl0dnA1MTUwX3ZkcF9pbml0KHNkLCB2YmlfcmFtX2RlZmF1bHQpOwogCiAJLyogU2VsZWN0cyBkZWNvZGVyIGlucHV0ICovCi0JdHZwNTE1MF9zZWxtdXgoYyk7CisJdHZwNTE1MF9zZWxtdXgoc2QpOwogCiAJLyogSW5pdGlhbGl6ZXMgVFZQNTE1MCB0byBzdHJlYW0gZW5hYmxlZCB2YWx1ZXMgKi8KLQl0dnA1MTUwX3dyaXRlX2luaXR0YWIoYywgdHZwNTE1MF9pbml0X2VuYWJsZSk7CisJdHZwNTE1MF93cml0ZV9pbml0dGFiKHNkLCB0dnA1MTUwX2luaXRfZW5hYmxlKTsKIAogCS8qIEluaXRpYWxpemUgaW1hZ2UgcHJlZmVyZW5jZXMgKi8KLQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQlJJR0hUX0NUTCwgZGVjb2Rlci0+YnJpZ2h0KTsKLQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMLCBkZWNvZGVyLT5jb250cmFzdCk7Ci0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX1NBVFVSQVRJT05fQ1RMLCBkZWNvZGVyLT5jb250cmFzdCk7Ci0JdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX0hVRV9DVEwsIGRlY29kZXItPmh1ZSk7CisJdHZwNTE1MF93cml0ZShzZCwgVFZQNTE1MF9CUklHSFRfQ1RMLCBkZWNvZGVyLT5icmlnaHQpOworCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMLCBkZWNvZGVyLT5jb250cmFzdCk7CisJdHZwNTE1MF93cml0ZShzZCwgVFZQNTE1MF9TQVRVUkFUSU9OX0NUTCwgZGVjb2Rlci0+Y29udHJhc3QpOworCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfSFVFX0NUTCwgZGVjb2Rlci0+aHVlKTsKIAotCXR2cDUxNTBfc2V0X3N0ZChjLCBkZWNvZGVyLT5ub3JtKTsKKwl0dnA1MTUwX3NldF9zdGQoc2QsIGRlY29kZXItPm5vcm0pOworCXJldHVybiAwOwogfTsKIAotc3RhdGljIGludCB0dnA1MTUwX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCB0dnA1MTUwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotLyoJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7ICovCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiVklESU9DX0dfQ1RSTCBjYWxsZWRcbiIpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9CUklHSFRfQ1RMKTsKKwkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQlJJR0hUX0NUTCk7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWN0cmwtPnZhbHVlID0gdHZwNTE1MF9yZWFkKGMsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMKTsKKwkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQljdHJsLT52YWx1ZSA9IHR2cDUxNTBfcmVhZChjLCBUVlA1MTUwX1NBVFVSQVRJT05fQ1RMKTsKKwkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfU0FUVVJBVElPTl9DVEwpOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0hVRToKLQkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoYywgVFZQNTE1MF9IVUVfQ1RMKTsKKwkJY3RybC0+dmFsdWUgPSB0dnA1MTUwX3JlYWQoc2QsIFRWUDUxNTBfSFVFX0NUTCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCB0dnA1MTUwX3NldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCB0dnA1MTUwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotLyoJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7ICovCisJdTggaSwgbjsKKwluID0gQVJSQVlfU0laRSh0dnA1MTUwX3FjdHJsKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKGN0cmwtPmlkICE9IHR2cDUxNTBfcWN0cmxbaV0uaWQpCisJCQljb250aW51ZTsKKwkJaWYgKGN0cmwtPnZhbHVlIDwgdHZwNTE1MF9xY3RybFtpXS5taW5pbXVtIHx8CisJCSAgICBjdHJsLT52YWx1ZSA+IHR2cDUxNTBfcWN0cmxbaV0ubWF4aW11bSkKKwkJCXJldHVybiAtRVJBTkdFOworCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJWSURJT0NfU19DVFJMOiBpZD0lZCwgdmFsdWU9JWRcbiIsCisJCQkJCWN0cmwtPmlkLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCX0KIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9CUklHSFRfQ1RMLCBjdHJsLT52YWx1ZSk7CisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfQlJJR0hUX0NUTCwgY3RybC0+dmFsdWUpOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMLCBjdHJsLT52YWx1ZSk7CisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfQ09OVFJBU1RfQ1RMLCBjdHJsLT52YWx1ZSk7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJdHZwNTE1MF93cml0ZShjLCBUVlA1MTUwX1NBVFVSQVRJT05fQ1RMLCBjdHJsLT52YWx1ZSk7CisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfU0FUVVJBVElPTl9DVEwsIGN0cmwtPnZhbHVlKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9IVUVfQ1RMLCBjdHJsLT52YWx1ZSk7CisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfSFVFX0NUTCwgY3RybC0+dmFsdWUpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC04NjMsMjI3ICs4ODYsMjEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJSTJDIENvbW1hbmQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCB0dnA1MTUwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmMsCi0JCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCisKK3N0YXRpYyBpbnQgdHZwNTE1MF9zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpCiB7Ci0Jc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IHR2cDUxNTAgKmRlY29kZXIgPSB0b190dnA1MTUwKHNkKTsKIAotCXN3aXRjaCAoY21kKSB7Ci0KLQljYXNlIDA6Ci0JY2FzZSBWSURJT0NfSU5UX1JFU0VUOgotCQl0dnA1MTUwX3Jlc2V0KGMpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HOgotCXsKLQkJc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7Ci0KLQkJKnJvdXRlID0gZGVjb2Rlci0+cm91dGU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HOgotCXsKLQkJc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7Ci0KLQkJZGVjb2Rlci0+cm91dGUgPSAqcm91dGU7Ci0JCXR2cDUxNTBfc2VsbXV4KGMpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JCWlmIChkZWNvZGVyLT5ub3JtID09ICoodjRsMl9zdGRfaWQgKilhcmcpCi0JCQlicmVhazsKLQkJcmV0dXJuIHR2cDUxNTBfc2V0X3N0ZChjLCAqKHY0bDJfc3RkX2lkICopYXJnKTsKLQljYXNlIFZJRElPQ19HX1NURDoKLQkJKih2NGwyX3N0ZF9pZCAqKWFyZyA9IGRlY29kZXItPm5vcm07Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwICpjYXAgPSBhcmc7Ci0JCXR2cDUxNTBfZGJnKDEsICJWSURJT0NfR19TTElDRURfVkJJX0NBUFxuIik7Ci0KLQkJdHZwNTE1MF92YmlfZ2V0X2NhcCh2YmlfcmFtX2RlZmF1bHQsIGNhcCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19TX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10OwotCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqc3ZiaTsKLQkJaW50IGk7Ci0KLQkJZm10ID0gYXJnOwotCQlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN2YmkgPSAmZm10LT5mbXQuc2xpY2VkOwotCQlpZiAoc3ZiaS0+c2VydmljZV9zZXQgIT0gMCkgewotCQkJZm9yIChpID0gMDsgaSA8PSAyMzsgaSsrKSB7Ci0JCQkJc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXSA9IDA7Ci0KLQkJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzBdW2ldPXR2cDUxNTBfc2V0X3ZiaShjLAotCQkJCQkgdmJpX3JhbV9kZWZhdWx0LAotCQkJCQkgc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSwweGYwLGksMyk7Ci0JCQl9Ci0JCQkvKiBFbmFibGVzIEZJRk8gKi8KLQkJCXR2cDUxNTBfd3JpdGUoYywgVFZQNTE1MF9GSUZPX09VVF9DVFJMLDEpOwotCQl9IGVsc2UgewotCQkJLyogRGlzYWJsZXMgRklGTyovCi0JCQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfRklGT19PVVRfQ1RSTCwwKTsKLQotCQkJLyogRGlzYWJsZSBGdWxsIEZpZWxkICovCi0JCQl0dnA1MTUwX3dyaXRlKGMsIFRWUDUxNTBfRlVMTF9GSUVMRF9FTkEsIDApOwotCi0JCQkvKiBEaXNhYmxlIExpbmUgbW9kZXMgKi8KLQkJCWZvciAoaT1UVlA1MTUwX0xJTkVfTU9ERV9JTkk7IGk8PVRWUDUxNTBfTElORV9NT0RFX0VORDsgaSsrKQotCQkJCXR2cDUxNTBfd3JpdGUoYywgaSwgMHhmZik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQ7Ci0JCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpzdmJpOwotCi0JCWludCBpLCBtYXNrPTA7Ci0KLQkJZm10ID0gYXJnOwotCQlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN2YmkgPSAmZm10LT5mbXQuc2xpY2VkOwotCQltZW1zZXQoc3ZiaSwgMCwgc2l6ZW9mKCpzdmJpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8PSAyMzsgaSsrKSB7Ci0JCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzBdW2ldPXR2cDUxNTBfZ2V0X3ZiaShjLAotCQkJCXZiaV9yYW1fZGVmYXVsdCxpKTsKLQkJCW1hc2t8PXN2YmktPnNlcnZpY2VfbGluZXNbMF1baV07Ci0JCX0KLQkJc3ZiaS0+c2VydmljZV9zZXQ9bWFzazsKLQkJYnJlYWs7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgotCWNhc2UgVklESU9DX0RCR19TX1JFR0lTVEVSOgotCXsKLQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKLQotCQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KGMsIHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAoY21kID09IFZJRElPQ19EQkdfR19SRUdJU1RFUikKLQkJCXJlZy0+dmFsID0gdHZwNTE1MF9yZWFkKGMsIHJlZy0+cmVnICYgMHhmZik7Ci0JCWVsc2UKLQkJCXR2cDUxNTBfd3JpdGUoYywgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOwotCQlicmVhazsKLQl9Ci0jZW5kaWYKLQotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCWR1bXBfcmVnKGMpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKLQkJCWludCBzdGF0dXMgPSB0dnA1MTUwX3JlYWQoYywgMHg4OCk7Ci0KLQkJCXZ0LT5zaWduYWwgPSAoKHN0YXR1cyAmIDB4MDQpICYmIChzdGF0dXMgJiAweDAyKSkgPyAweGZmZmYgOiAweDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQkJCWludCBpOwotCi0JCQl0dnA1MTUwX2RiZygxLCAiVklESU9DX1FVRVJZQ1RSTCBjYWxsZWRcbiIpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dnA1MTUwX3FjdHJsKTsgaSsrKQotCQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHR2cDUxNTBfcWN0cmxbaV0uaWQpIHsKLQkJCQkJbWVtY3B5KHFjLCAmKHR2cDUxNTBfcWN0cmxbaV0pLAotCQkJCQkgICAgICAgc2l6ZW9mKCpxYykpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCQkJdHZwNTE1MF9kYmcoMSwgIlZJRElPQ19HX0NUUkwgY2FsbGVkXG4iKTsKLQotCQkJcmV0dXJuIHR2cDUxNTBfZ2V0X2N0cmwoYywgY3RybCk7Ci0JCX0KLQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCQl1OCBpLCBuOwotCQkJbiA9IEFSUkFZX1NJWkUodHZwNTE1MF9xY3RybCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQkJCWlmIChjdHJsLT5pZCA9PSB0dnA1MTUwX3FjdHJsW2ldLmlkKSB7Ci0JCQkJCWlmIChjdHJsLT52YWx1ZSA8Ci0JCQkJCSAgICB0dnA1MTUwX3FjdHJsW2ldLm1pbmltdW0KLQkJCQkJICAgIHx8IGN0cmwtPnZhbHVlID4KLQkJCQkJICAgIHR2cDUxNTBfcWN0cmxbaV0ubWF4aW11bSkKLQkJCQkJCXJldHVybiAtRVJBTkdFOwotCQkJCQl0dnA1MTUwX2RiZygxLAotCQkJCQkJIlZJRElPQ19TX0NUUkw6IGlkPSVkLCB2YWx1ZT0lZFxuIiwKLQkJCQkJCWN0cmwtPmlkLCBjdHJsLT52YWx1ZSk7Ci0JCQkJCXJldHVybiB0dnA1MTUwX3NldF9jdHJsKGMsIGN0cmwpOwotCQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KKwlkZWNvZGVyLT5yb3V0ZSA9ICpyb3V0ZTsKKwl0dnA1MTUwX3NlbG11eChzZCk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdHZwNTE1MF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqc3ZiaTsKKwlpbnQgaTsKKworCS8qIHJhdyB2YmkgKi8KKwlpZiAoZm10LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKKwkJLyogdGhpcyBpcyBmb3IgY2FwdHVyaW5nIDM2IHJhdyB2YmkgbGluZXMKKwkJICAgaWYgdGhlcmUncyBhIHdheSB0byBjdXQgb2ZmIHRoZSBiZWdpbm5pbmcgMiB2YmkgbGluZXMKKwkJICAgd2l0aCB0aGUgdHZwNTE1MCB0aGVuIHRoZSB2YmkgbGluZSBjb3VudCBjb3VsZCBiZSBsb3dlcmVkCisJCSAgIHRvIDE3IGxpbmVzL2ZpZWxkIGFnYWluLCBhbHRob3VnaCBJIGNvdWxkbid0IGZpbmQgYSByZWdpc3RlcgorCQkgICB3aGljaCBjb3VsZCBkbyB0aGF0IGNyb3BwaW5nICovCisJCWlmIChmbXQtPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCA9PSBWNEwyX1BJWF9GTVRfR1JFWSkKKwkJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfTFVNQV9QUk9DX0NUTF8xLCAweDcwKTsKKwkJaWYgKGZtdC0+Zm10LnZiaS5jb3VudFswXSA9PSAxOCAmJiBmbXQtPmZtdC52YmkuY291bnRbMV0gPT0gMTgpIHsKKwkJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfVkVSVF9CTEFOS0lOR19TVEFSVCwgMHgwMCk7CisJCQl0dnA1MTUwX3dyaXRlKHNkLCBUVlA1MTUwX1ZFUlRfQkxBTktJTkdfU1RPUCwgMHgwMSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCXN2YmkgPSAmZm10LT5mbXQuc2xpY2VkOworCWlmIChzdmJpLT5zZXJ2aWNlX3NldCAhPSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gMjM7IGkrKykgeworCQkJc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXSA9IDA7CisJCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzBdW2ldID0KKwkJCQl0dnA1MTUwX3NldF92Ymkoc2QsIHZiaV9yYW1fZGVmYXVsdCwKKwkJCQkgICAgICAgc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSwgMHhmMCwgaSwgMyk7CisJCX0KKwkJLyogRW5hYmxlcyBGSUZPICovCisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfRklGT19PVVRfQ1RSTCwgMSk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZXMgRklGTyovCisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfRklGT19PVVRfQ1RSTCwgMCk7CisKKwkJLyogRGlzYWJsZSBGdWxsIEZpZWxkICovCisJCXR2cDUxNTBfd3JpdGUoc2QsIFRWUDUxNTBfRlVMTF9GSUVMRF9FTkEsIDApOworCisJCS8qIERpc2FibGUgTGluZSBtb2RlcyAqLworCQlmb3IgKGkgPSBUVlA1MTUwX0xJTkVfTU9ERV9JTkk7IGkgPD0gVFZQNTE1MF9MSU5FX01PREVfRU5EOyBpKyspCisJCQl0dnA1MTUwX3dyaXRlKHNkLCBpLCAweGZmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHZwNTE1MF9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqc3ZiaTsKKwlpbnQgaSwgbWFzayA9IDA7CisKKwlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdmJpID0gJmZtdC0+Zm10LnNsaWNlZDsKKwltZW1zZXQoc3ZiaSwgMCwgc2l6ZW9mKCpzdmJpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDIzOyBpKyspIHsKKwkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSA9CisJCQl0dnA1MTUwX2dldF92Ymkoc2QsIHZiaV9yYW1fZGVmYXVsdCwgaSk7CisJCW1hc2sgfD0gc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXTsKKwl9CisJc3ZiaS0+c2VydmljZV9zZXQgPSBtYXNrOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdHZwNTE1MF9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCWludCByZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJcmV2ID0gdHZwNTE1MF9yZWFkKHNkLCBUVlA1MTUwX1JPTV9NQUpPUl9WRVIpIDw8IDggfAorCSAgICAgIHR2cDUxNTBfcmVhZChzZCwgVFZQNTE1MF9ST01fTUlOT1JfVkVSKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfVFZQNTE1MCwKKwkJCQkJICByZXYpOworfQorCisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IHR2cDUxNTBfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJlZy0+dmFsID0gdHZwNTE1MF9yZWFkKHNkLCByZWctPnJlZyAmIDB4ZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfc19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXR2cDUxNTBfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHR2cDUxNTBfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJaW50IHN0YXR1cyA9IHR2cDUxNTBfcmVhZChzZCwgMHg4OCk7CisKKwl2dC0+c2lnbmFsID0gKChzdGF0dXMgJiAweDA0KSAmJiAoc3RhdHVzICYgMHgwMikpID8gMHhmZmZmIDogMHgwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfcXVlcnljdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJWSURJT0NfUVVFUllDVFJMIGNhbGxlZFxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dnA1MTUwX3FjdHJsKTsgaSsrKQorCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSB0dnA1MTUwX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYodHZwNTE1MF9xY3RybFtpXSksCisJCQkgICAgICAgc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHR2cDUxNTBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdjRsMl9zdWJkZXZfY29tbWFuZChpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgY21kLCBhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHR2cDUxNTBfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB0dnA1MTUwX2xvZ19zdGF0dXMsCisJLmdfY3RybCA9IHR2cDUxNTBfZ19jdHJsLAorCS5zX2N0cmwgPSB0dnA1MTUwX3NfY3RybCwKKwkucXVlcnljdHJsID0gdHZwNTE1MF9xdWVyeWN0cmwsCisJLnJlc2V0ID0gdHZwNTE1MF9yZXNldCwKKwkuZ19jaGlwX2lkZW50ID0gdHZwNTE1MF9nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gdHZwNTE1MF9nX3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyID0gdHZwNTE1MF9zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB0dnA1MTUwX3R1bmVyX29wcyA9IHsKKwkuc19zdGQgPSB0dnA1MTUwX3Nfc3RkLAorCS5nX3R1bmVyID0gdHZwNTE1MF9nX3R1bmVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgdHZwNTE1MF92aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHR2cDUxNTBfc19yb3V0aW5nLAorCS5nX2ZtdCA9IHR2cDUxNTBfZ19mbXQsCisJLnNfZm10ID0gdHZwNTE1MF9zX2ZtdCwKKwkuZ19zbGljZWRfdmJpX2NhcCA9IHR2cDUxNTBfZ19zbGljZWRfdmJpX2NhcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHR2cDUxNTBfb3BzID0geworCS5jb3JlID0gJnR2cDUxNTBfY29yZV9vcHMsCisJLnR1bmVyID0gJnR2cDUxNTBfdHVuZXJfb3BzLAorCS52aWRlbyA9ICZ0dnA1MTUwX3ZpZGVvX29wcywKK307CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCUkyQyBDbGllbnQgJiBEcml2ZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICIodW5zZXQpIiwKLQkuZHJpdmVyID0gJmRyaXZlciwKLX07Ci0KLXN0YXRpYyBpbnQgdHZwNTE1MF9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCB0dnA1MTUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjLAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYzsKIAlzdHJ1Y3QgdHZwNTE1MCAqY29yZTsKLQlpbnQgcnY7Ci0KLQlpZiAoZGVidWcpCi0JCXByaW50ayggS0VSTl9JTkZPCi0JCSJ0dnA1MTUwLmM6IGRldGVjdGluZyB0dnA1MTUwIGNsaWVudCBvbiBhZGRyZXNzIDB4JXhcbiIsCi0JCWFkZHJlc3MgPDwgMSk7Ci0KLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyZXNzOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eQotCSAgICAoYWRhcHRlciwKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGMtPmFkYXB0ZXIsCiAJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQotCQlyZXR1cm4gMDsKLQotCWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwotCWlmICghYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGMsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOworCQlyZXR1cm4gLUVJTzsKIAogCWNvcmUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHZwNTE1MCksIEdGUF9LRVJORUwpOwogCWlmICghY29yZSkgewotCQlrZnJlZShjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWkyY19zZXRfY2xpZW50ZGF0YShjLCBjb3JlKTsKLQotCXJ2ID0gaTJjX2F0dGFjaF9jbGllbnQoYyk7CisJc2QgPSAmY29yZS0+c2Q7CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGMsICZ0dnA1MTUwX29wcyk7CisJdjRsX2luZm8oYywgImNoaXAgZm91bmQgQCAweCUwMnggKCVzKVxuIiwKKwkJIGMtPmFkZHIgPDwgMSwgYy0+YWRhcHRlci0+bmFtZSk7CiAKIAljb3JlLT5ub3JtID0gVjRMMl9TVERfQUxMOwkvKiBEZWZhdWx0IGlzIGF1dG9kZXRlY3QgKi8KIAljb3JlLT5yb3V0ZS5pbnB1dCA9IFRWUDUxNTBfQ09NUE9TSVRFMTsKQEAgLTEwOTMsNjkgKzEwOTksMzggQEAKIAljb3JlLT5odWUgPSAwOwogCWNvcmUtPnNhdCA9IDEyODsKIAotCWlmIChydikgewotCQlrZnJlZShjKTsKLQkJa2ZyZWUoY29yZSk7Ci0JCXJldHVybiBydjsKLQl9Ci0KIAlpZiAoZGVidWcgPiAxKQotCQlkdW1wX3JlZyhjKTsKKwkJdHZwNTE1MF9sb2dfc3RhdHVzKHNkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0dnA1MTUwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgdHZwNTE1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmMpCiB7Ci0JaWYgKGRlYnVnKQotCQlwcmludGsoIEtFUk5fSU5GTwotCQkidHZwNTE1MC5jOiBzdGFydGluZyBwcm9iZSBmb3IgYWRhcHRlciAlcyAoMHgleClcbiIsCi0JCWFkYXB0ZXItPm5hbWUsIGFkYXB0ZXItPmlkKTsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsICZ0dnA1MTUwX2RldGVjdF9jbGllbnQpOwotfQorCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKLXN0YXRpYyBpbnQgdHZwNTE1MF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXN0cnVjdCB0dnA1MTUwICpkZWNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCWludCBlcnI7Ci0KLQl0dnA1MTUwX2RiZygxLAorCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKIAkJInR2cDUxNTAuYzogcmVtb3ZpbmcgdHZwNTE1MCBhZGFwdGVyIG9uIGFkZHJlc3MgMHgleFxuIiwKIAkJYy0+YWRkciA8PCAxKTsKIAotCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGMpOwotCWlmIChlcnIpIHsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlrZnJlZShkZWNvZGVyKTsKLQlrZnJlZShjKTsKLQorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b190dnA1MTUwKHNkKSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAidHZwNTE1MCIsCi0JfSwKLQkuaWQgPSBJMkNfRFJJVkVSSURfVFZQNTE1MCwKLQotCS5hdHRhY2hfYWRhcHRlciA9IHR2cDUxNTBfYXR0YWNoX2FkYXB0ZXIsCi0JLmRldGFjaF9jbGllbnQgPSB0dnA1MTUwX2RldGFjaF9jbGllbnQsCi0KLQkuY29tbWFuZCA9IHR2cDUxNTBfY29tbWFuZCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0dnA1MTUwX2lkW10gPSB7CisJeyAidHZwNTE1MCIsIDAgfSwKKwl7IH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHZwNTE1MF9pZCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHR2cDUxNTBfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHR2cDUxNTBfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh0dnA1MTUwX2luaXQpOwotbW9kdWxlX2V4aXQodHZwNTE1MF9leGl0KTsKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKKwkubmFtZSA9ICJ0dnA1MTUwIiwKKwkuZHJpdmVyaWQgPSBJMkNfRFJJVkVSSURfVFZQNTE1MCwKKwkuY29tbWFuZCA9IHR2cDUxNTBfY29tbWFuZCwKKwkucHJvYmUgPSB0dnA1MTUwX3Byb2JlLAorCS5yZW1vdmUgPSB0dnA1MTUwX3JlbW92ZSwKKwkubGVnYWN5X2NsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRyB8IEkyQ19DTEFTU19UVl9ESUdJVEFMLAorCS5pZF90YWJsZSA9IHR2cDUxNTBfaWQsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZGM0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiB0dzk5MTAgVmlkZW8gRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBLdW5pbm9yaSBNb3JpbW90byA8bW9yaW1vdG8ua3VuaW5vcmlAcmVuZXNhcy5jb20+CisgKgorICogQmFzZWQgb24gb3Y3NzJ4IGRyaXZlciwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICogQ29weXJpZ2h0IDIwMDYtNyBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hZ251cyBEYW1tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS90dzk5MTAuaD4KKworI2RlZmluZSBHRVRfSUQodmFsKSAgKCh2YWwgJiAweEY4KSA+PiAzKQorI2RlZmluZSBHRVRfUmVWKHZhbCkgKHZhbCAmIDB4MDcpCisKKy8qCisgKiByZWdpc3RlciBvZmZzZXQKKyAqLworI2RlZmluZSBJRAkJMHgwMCAvKiBQcm9kdWN0IElEIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTMQkJMHgwMSAvKiBDaGlwIFN0YXR1cyBSZWdpc3RlciBJICovCisjZGVmaW5lIElORk9STQkJMHgwMiAvKiBJbnB1dCBGb3JtYXQgKi8KKyNkZWZpbmUgT1BGT1JNCQkweDAzIC8qIE91dHB1dCBGb3JtYXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBETFlDVFIJCTB4MDQgLyogSHlzdGVyZXNpcyBhbmQgSFNZTkMgRGVsYXkgQ29udHJvbCAqLworI2RlZmluZSBPVVRDVFIxCQkweDA1IC8qIE91dHB1dCBDb250cm9sIEkgKi8KKyNkZWZpbmUgQUNOVEwxCQkweDA2IC8qIEFuYWxvZyBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgQ1JPUF9ISQkJMHgwNyAvKiBDcm9wcGluZyBSZWdpc3RlciwgSGlnaCAqLworI2RlZmluZSBWREVMQVlfTE8JMHgwOCAvKiBWZXJ0aWNhbCBEZWxheSBSZWdpc3RlciwgTG93ICovCisjZGVmaW5lIFZBQ1RJVkVfTE8JMHgwOSAvKiBWZXJ0aWNhbCBBY3RpdmUgUmVnaXN0ZXIsIExvdyAqLworI2RlZmluZSBIREVMQVlfTE8JMHgwQSAvKiBIb3Jpem9udGFsIERlbGF5IFJlZ2lzdGVyLCBMb3cgKi8KKyNkZWZpbmUgSEFDVElWRV9MTwkweDBCIC8qIEhvcml6b250YWwgQWN0aXZlIFJlZ2lzdGVyLCBMb3cgKi8KKyNkZWZpbmUgQ05UUkwxCQkweDBDIC8qIENvbnRyb2wgUmVnaXN0ZXIgSSAqLworI2RlZmluZSBWU0NBTEVfTE8JMHgwRCAvKiBWZXJ0aWNhbCBTY2FsaW5nIFJlZ2lzdGVyLCBMb3cgKi8KKyNkZWZpbmUgU0NBTEVfSEkJMHgwRSAvKiBTY2FsaW5nIFJlZ2lzdGVyLCBIaWdoICovCisjZGVmaW5lIEhTQ0FMRV9MTwkweDBGIC8qIEhvcml6b250YWwgU2NhbGluZyBSZWdpc3RlciwgTG93ICovCisjZGVmaW5lIEJSSUdIVAkJMHgxMCAvKiBCUklHSFRORVNTIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09OVFJBU1QJMHgxMSAvKiBDT05UUkFTVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNIQVJQTkVTUwkweDEyIC8qIFNIQVJQTkVTUyBDb250cm9sIFJlZ2lzdGVyIEkgKi8KKyNkZWZpbmUgU0FUX1UJCTB4MTMgLyogQ2hyb21hIChVKSBHYWluIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBVF9WCQkweDE0IC8qIENocm9tYSAoVikgR2FpbiBSZWdpc3RlciAqLworI2RlZmluZSBIVUUJCTB4MTUgLyogSHVlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09SSU5HMQkJMHgxNworI2RlZmluZSBDT1JJTkcyCQkweDE4IC8qIENvcmluZyBhbmQgSUYgY29tcGVuc2F0aW9uICovCisjZGVmaW5lIFZCSUNOVEwJCTB4MTkgLyogVkJJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNOVEwyCQkweDFBIC8qIEFuYWxvZyBDb250cm9sIDIgKi8KKyNkZWZpbmUgT1VUQ1RSMgkJMHgxQiAvKiBPdXRwdXQgQ29udHJvbCAyICovCisjZGVmaW5lIFNEVAkJMHgxQyAvKiBTdGFuZGFyZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0RUUgkJMHgxRCAvKiBTdGFuZGFyZCBSZWNvZ25pdGlvbiAqLworI2RlZmluZSBURVNUCQkweDFGIC8qIFRlc3QgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDTE1QRwkJMHgyMCAvKiBDbGFtcGluZyBHYWluICovCisjZGVmaW5lIElBR0MJCTB4MjEgLyogSW5kaXZpZHVhbCBBR0MgR2FpbiAqLworI2RlZmluZSBBR0NHQUlOCQkweDIyIC8qIEFHQyBHYWluICovCisjZGVmaW5lIFBFQUtXVAkJMHgyMyAvKiBXaGl0ZSBQZWFrIFRocmVzaG9sZCAqLworI2RlZmluZSBDTE1QTAkJMHgyNCAvKiBDbGFtcCBsZXZlbCAqLworI2RlZmluZSBTWU5DVAkJMHgyNSAvKiBTeW5jIEFtcGxpdHVkZSAqLworI2RlZmluZSBNSVNTQ05UCQkweDI2IC8qIFN5bmMgTWlzcyBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0xBTVAJCTB4MjcgLyogQ2xhbXAgUG9zaXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVkNOVEwxCQkweDI4IC8qIFZlcnRpY2FsIENvbnRyb2wgSSAqLworI2RlZmluZSBWQ05UTDIJCTB4MjkgLyogVmVydGljYWwgQ29udHJvbCBJSSAqLworI2RlZmluZSBDS0lMTAkJMHgyQSAvKiBDb2xvciBLaWxsZXIgTGV2ZWwgQ29udHJvbCAqLworI2RlZmluZSBDT01CCQkweDJCIC8qIENvbWIgRmlsdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgTERMWQkJMHgyQyAvKiBMdW1hIERlbGF5IGFuZCBIIEZpbHRlciBDb250cm9sICovCisjZGVmaW5lIE1JU0MxCQkweDJEIC8qIE1pc2NlbGxhbmVvdXMgQ29udHJvbCBJICovCisjZGVmaW5lIExPT1AJCTB4MkUgLyogTE9PUCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JU0MyCQkweDJGIC8qIE1pc2NlbGxhbmVvdXMgQ29udHJvbCBJSSAqLworI2RlZmluZSBNVlNOCQkweDMwIC8qIE1hY3JvdmlzaW9uIERldGVjdGlvbiAqLworI2RlZmluZSBTVEFUVVMyCQkweDMxIC8qIENoaXAgU1RBVFVTIElJICovCisjZGVmaW5lIEhGUkVGCQkweDMyIC8qIEggbW9uaXRvciAqLworI2RlZmluZSBDTE1ECQkweDMzIC8qIENMQU1QIE1PREUgKi8KKyNkZWZpbmUgSURDTlRMCQkweDM0IC8qIElEIERldGVjdGlvbiBDb250cm9sICovCisjZGVmaW5lIENMQ05UTDEJCTB4MzUgLyogQ2xhbXAgQ29udHJvbCBJICovCisjZGVmaW5lIEFOQVBMTENUTAkweDRDCisjZGVmaW5lIFZCSU1JTgkJMHg0RAorI2RlZmluZSBIU0xPV0NUTAkweDRFCisjZGVmaW5lIFdTUzMJCTB4NEYKKyNkZWZpbmUgRklMTERBVEEJMHg1MAorI2RlZmluZSBTRElECQkweDUxCisjZGVmaW5lIERJRAkJMHg1MgorI2RlZmluZSBXU1MxCQkweDUzCisjZGVmaW5lIFdTUzIJCTB4NTQKKyNkZWZpbmUgVlZCSQkJMHg1NQorI2RlZmluZSBMQ1RMNgkJMHg1NgorI2RlZmluZSBMQ1RMNwkJMHg1NworI2RlZmluZSBMQ1RMOAkJMHg1OAorI2RlZmluZSBMQ1RMOQkJMHg1OQorI2RlZmluZSBMQ1RMMTAJCTB4NUEKKyNkZWZpbmUgTENUTDExCQkweDVCCisjZGVmaW5lIExDVEwxMgkJMHg1QworI2RlZmluZSBMQ1RMMTMJCTB4NUQKKyNkZWZpbmUgTENUTDE0CQkweDVFCisjZGVmaW5lIExDVEwxNQkJMHg1RgorI2RlZmluZSBMQ1RMMTYJCTB4NjAKKyNkZWZpbmUgTENUTDE3CQkweDYxCisjZGVmaW5lIExDVEwxOAkJMHg2MgorI2RlZmluZSBMQ1RMMTkJCTB4NjMKKyNkZWZpbmUgTENUTDIwCQkweDY0CisjZGVmaW5lIExDVEwyMQkJMHg2NQorI2RlZmluZSBMQ1RMMjIJCTB4NjYKKyNkZWZpbmUgTENUTDIzCQkweDY3CisjZGVmaW5lIExDVEwyNAkJMHg2OAorI2RlZmluZSBMQ1RMMjUJCTB4NjkKKyNkZWZpbmUgTENUTDI2CQkweDZBCisjZGVmaW5lIEhTR0VHSU4JCTB4NkIKKyNkZWZpbmUgSFNFTkQJCTB4NkMKKyNkZWZpbmUgT1ZTRExZCQkweDZECisjZGVmaW5lIE9WU0VORAkJMHg2RQorI2RlZmluZSBWQklERUxBWQkweDZGCisKKy8qCisgKiByZWdpc3RlciBkZXRhaWwKKyAqLworCisvKiBJTkZPUk0gKi8KKyNkZWZpbmUgRkMyN19PTiAgICAgMHg0MCAvKiAxIDogSW5wdXQgY3J5c3RhbCBjbG9jayBmcmVxdWVuY3kgaXMgMjdNSHogKi8KKyNkZWZpbmUgRkMyN19GRiAgICAgMHgwMCAvKiAwIDogU3F1YXJlIHBpeGVsIG1vZGUuICovCisJCQkgLyogICAgIE11c3QgdXNlIDI0LjU0TUh6IGZvciA2MEh6IGZpZWxkIHJhdGUgKi8KKwkJCSAvKiAgICAgc291cmNlIG9yIDI5LjVNSHogZm9yIDUwSHogZmllbGQgcmF0ZSAqLworI2RlZmluZSBJRlNFTF9TICAgICAweDEwIC8qIDAxIDogUy12aWRlbyBkZWNvZGluZyAqLworI2RlZmluZSBJRlNFTF9DICAgICAweDAwIC8qIDAwIDogQ29tcG9zaXRlIHZpZGVvIGRlY29kaW5nICovCisJCQkgLyogWSBpbnB1dCB2aWRlbyBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgWVNFTF9NMCAgICAgMHgwMCAvKiAgMDAgOiBNdXgwIHNlbGVjdGVkICovCisjZGVmaW5lIFlTRUxfTTEgICAgIDB4MDQgLyogIDAxIDogTXV4MSBzZWxlY3RlZCAqLworI2RlZmluZSBZU0VMX00yICAgICAweDA4IC8qICAxMCA6IE11eDIgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgWVNFTF9NMyAgICAgMHgxMCAvKiAgMTEgOiBNdXgzIHNlbGVjdGVkICovCisKKy8qIE9QRk9STSAqLworI2RlZmluZSBNT0RFICAgICAgICAweDgwIC8qIDAgOiBDQ0lSNjAxIGNvbXBhdGlibGUgWUNyQ2IgNDoyOjIgZm9ybWF0ICovCisJCQkgLyogMSA6IElUVS1SLTY1NiBjb21wYXRpYmxlIGRhdGEgc2VxdWVuY2UgZm9ybWF0ICovCisjZGVmaW5lIExFTiAgICAgICAgIDB4NDAgLyogMCA6IDgtYml0IFlDckNiIDQ6MjoyIG91dHB1dCBmb3JtYXQgKi8KKwkJCSAvKiAxIDogMTYtYml0IFlDckNiIDQ6MjoyIG91dHB1dCBmb3JtYXQuKi8KKyNkZWZpbmUgTExDTU9ERSAgICAgMHgyMCAvKiAxIDogTExDIG91dHB1dCBtb2RlLiAqLworCQkJIC8qIDAgOiBmcmVlLXJ1biBvdXRwdXQgbW9kZSAqLworI2RlZmluZSBBSU5DICAgICAgICAweDEwIC8qIFNlcmlhbCBpbnRlcmZhY2UgYXV0by1pbmRleGluZyBjb250cm9sICovCisJCQkgLyogMCA6IGF1dG8taW5jcmVtZW50ICovCisJCQkgLyogMSA6IG5vbi1hdXRvICovCisjZGVmaW5lIFZTQ1RMICAgICAgIDB4MDggLyogMSA6IFZlcnRpY2FsIG91dCBjdHJsIGJ5IERWQUxJRCAqLworCQkJIC8qIDAgOiBWZXJ0aWNhbCBvdXQgY3RybCBieSBIQUNUSVZFIGFuZCBEVkFMSUQgKi8KKyNkZWZpbmUgT0VOICAgICAgICAgMHgwNCAvKiBPdXRwdXQgRW5hYmxlIHRvZ2V0aGVyIHdpdGggVFJJX1NFTC4gKi8KKworLyogT1VUQ1RSMSAqLworI2RlZmluZSBWU1BfTE8gICAgICAweDAwIC8qIDAgOiBWUyBwaW4gb3V0cHV0IHBvbGFyaXR5IGlzIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgVlNQX0hJICAgICAgMHg4MCAvKiAxIDogVlMgcGluIG91dHB1dCBwb2xhcml0eSBpcyBhY3RpdmUgaGlnaC4gKi8KKwkJCSAvKiBWUyBwaW4gb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgVlNTTF9WU1lOQyAgMHgwMCAvKiAgIDAgOiBWU1lOQyAgKi8KKyNkZWZpbmUgVlNTTF9WQUNUICAgMHgxMCAvKiAgIDEgOiBWQUNUICAgKi8KKyNkZWZpbmUgVlNTTF9GSUVMRCAgMHgyMCAvKiAgIDIgOiBGSUVMRCAgKi8KKyNkZWZpbmUgVlNTTF9WVkFMSUQgMHgzMCAvKiAgIDMgOiBWVkFMSUQgKi8KKyNkZWZpbmUgVlNTTF9aRVJPICAgMHg3MCAvKiAgIDcgOiAwICAgICAgKi8KKyNkZWZpbmUgSFNQX0xPVyAgICAgMHgwMCAvKiAwIDogSFMgcGluIG91dHB1dCBwb2xhcml0eSBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIEhTUF9ISSAgICAgIDB4MDggLyogMSA6IEhTIHBpbiBvdXRwdXQgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2guKi8KKwkJCSAvKiBIUyBwaW4gb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgSFNTTF9IQUNUICAgMHgwMCAvKiAgIDAgOiBIQUNUICAgKi8KKyNkZWZpbmUgSFNTTF9IU1lOQyAgMHgwMSAvKiAgIDEgOiBIU1lOQyAgKi8KKyNkZWZpbmUgSFNTTF9EVkFMSUQgMHgwMiAvKiAgIDIgOiBEVkFMSUQgKi8KKyNkZWZpbmUgSFNTTF9ITE9DSyAgMHgwMyAvKiAgIDMgOiBITE9DSyAgKi8KKyNkZWZpbmUgSFNTTF9BU1lOQ1cgMHgwNCAvKiAgIDQgOiBBU1lOQ1cgKi8KKyNkZWZpbmUgSFNTTF9aRVJPICAgMHgwNyAvKiAgIDcgOiAwICAgICAgKi8KKworLyogQUNOVEwxICovCisjZGVmaW5lIFNSRVNFVCAgICAgIDB4ODAgLyogcmVzZXRzIHRoZSBkZXZpY2UgdG8gaXRzIGRlZmF1bHQgc3RhdGUKKwkJCSAgKiBidXQgYWxsIHJlZ2lzdGVyIGNvbnRlbnQgcmVtYWluIHVuY2hhbmdlZC4KKwkJCSAgKiBUaGlzIGJpdCBpcyBzZWxmLXJlc2V0dGluZy4KKwkJCSAgKi8KKworLyogVkJJQ05UTCAqLworLyogUlRTRUwgOiBjb250cm9sIHRoZSByZWFsIHRpbWUgc2lnbmFsCisqICAgICAgICAgIG91dHB1dCBmcm9tIHRoZSBNUE9VVCBwaW4KKyovCisjZGVmaW5lIFJUU0VMX01BU0sgIDB4MDcKKyNkZWZpbmUgUlRTRUxfVkxPU1MgMHgwMCAvKiAwMDAwID0gVmlkZW8gbG9zcyAqLworI2RlZmluZSBSVFNFTF9ITE9DSyAweDAxIC8qIDAwMDEgPSBILWxvY2sgKi8KKyNkZWZpbmUgUlRTRUxfU0xPQ0sgMHgwMiAvKiAwMDEwID0gUy1sb2NrICovCisjZGVmaW5lIFJUU0VMX1ZMT0NLIDB4MDMgLyogMDAxMSA9IFYtbG9jayAqLworI2RlZmluZSBSVFNFTF9NT05PICAweDA0IC8qIDAxMDAgPSBNT05PICovCisjZGVmaW5lIFJUU0VMX0RFVDUwIDB4MDUgLyogMDEwMSA9IERFVDUwICovCisjZGVmaW5lIFJUU0VMX0ZJRUxEIDB4MDYgLyogMDExMCA9IEZJRUxEICovCisjZGVmaW5lIFJUU0VMX1JUQ08gIDB4MDcgLyogMDExMSA9IFJUQ08gKCBSZWFsIFRpbWUgQ29udHJvbCApICovCisKKy8qCisgKiBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgcmVndmFsX2xpc3QgeworCXVuc2lnbmVkIGNoYXIgcmVnX251bTsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworfTsKKworc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsIHsKKwljaGFyICAgICAgICAgICAqbmFtZTsKKwl1bnNpZ25lZCBzaG9ydCAgd2lkdGg7CisJdW5zaWduZWQgc2hvcnQgIGhlaWdodDsKKwl1MTYgICAgICAgICAgICAgaHNjYWxlOworCXUxNiAgICAgICAgICAgICB2c2NhbGU7Cit9OworCitzdHJ1Y3QgdHc5OTEwX2Nyb3BwaW5nX2N0cmwgeworCXUxNiB2ZGVsYXk7CisJdTE2IHZhY3RpdmU7CisJdTE2IGhkZWxheTsKKwl1MTYgaGFjdGl2ZTsKK307CisKK3N0cnVjdCB0dzk5MTBfaHN5bmNfY3RybCB7CisJdTE2IHN0YXJ0OworCXUxNiBlbmQ7Cit9OworCitzdHJ1Y3QgdHc5OTEwX3ByaXYgeworCXN0cnVjdCB0dzk5MTBfdmlkZW9faW5mbyAgICAgICAqaW5mbzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAgICAgKmNsaWVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgICAgICAgIGljZDsKKwljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOworfTsKKworLyoKKyAqIHJlZ2lzdGVyIHNldHRpbmdzCisgKi8KKworI2RlZmluZSBFTkRNQVJLRVIgeyAweGZmLCAweGZmIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd2YWxfbGlzdCB0dzk5MTBfZGVmYXVsdF9yZWdzW10gPQoreworCXsgT1BGT1JNLCAgMHgwMCB9LAorCXsgT1VUQ1RSMSwgVlNQX0xPIHwgVlNTTF9WVkFMSUQgfCBIU1BfSEkgfCBIU1NMX0hTWU5DIH0sCisJRU5ETUFSS0VSLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RhdGFfZm9ybWF0IHR3OTkxMF9jb2xvcl9mbXRbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gIlZZVVkiLAorCQkuZm91cmNjICAgICA9IFY0TDJfUElYX0ZNVF9WWVVZLAorCQkuZGVwdGggICAgICA9IDE2LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0sCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybCB0dzk5MTBfbnRzY19zY2FsZXNbXSA9IHsKKwl7CisJCS5uYW1lICAgPSAiTlRTQyBTUSIsCisJCS53aWR0aCAgPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5oc2NhbGUgPSAweDAxMDAsCisJCS52c2NhbGUgPSAweDAxMDAsCisJfSwKKwl7CisJCS5uYW1lICAgPSAiTlRTQyBDQ0lSNjAxIiwKKwkJLndpZHRoICA9IDcyMCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLmhzY2FsZSA9IDB4MDEwMCwKKwkJLnZzY2FsZSA9IDB4MDEwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJOVFNDIFNRIChDSUYpIiwKKwkJLndpZHRoICA9IDMyMCwKKwkJLmhlaWdodCA9IDI0MCwKKwkJLmhzY2FsZSA9IDB4MDIwMCwKKwkJLnZzY2FsZSA9IDB4MDIwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJOVFNDIENDSVI2MDEgKENJRikiLAorCQkud2lkdGggID0gMzYwLAorCQkuaGVpZ2h0ID0gMjQwLAorCQkuaHNjYWxlID0gMHgwMjAwLAorCQkudnNjYWxlID0gMHgwMjAwLAorCX0sCisJeworCQkubmFtZSAgID0gIk5UU0MgU1EgKFFDSUYpIiwKKwkJLndpZHRoICA9IDE2MCwKKwkJLmhlaWdodCA9IDEyMCwKKwkJLmhzY2FsZSA9IDB4MDQwMCwKKwkJLnZzY2FsZSA9IDB4MDQwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJOVFNDIENDSVI2MDEgKFFDSUYpIiwKKwkJLndpZHRoICA9IDE4MCwKKwkJLmhlaWdodCA9IDEyMCwKKwkJLmhzY2FsZSA9IDB4MDQwMCwKKwkJLnZzY2FsZSA9IDB4MDQwMCwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybCB0dzk5MTBfcGFsX3NjYWxlc1tdID0geworCXsKKwkJLm5hbWUgICA9ICJQQUwgU1EiLAorCQkud2lkdGggID0gNzY4LAorCQkuaGVpZ2h0ID0gNTc2LAorCQkuaHNjYWxlID0gMHgwMTAwLAorCQkudnNjYWxlID0gMHgwMTAwLAorCX0sCisJeworCQkubmFtZSAgID0gIlBBTCBDQ0lSNjAxIiwKKwkJLndpZHRoICA9IDcyMCwKKwkJLmhlaWdodCA9IDU3NiwKKwkJLmhzY2FsZSA9IDB4MDEwMCwKKwkJLnZzY2FsZSA9IDB4MDEwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJQQUwgU1EgKENJRikiLAorCQkud2lkdGggID0gMzg0LAorCQkuaGVpZ2h0ID0gMjg4LAorCQkuaHNjYWxlID0gMHgwMjAwLAorCQkudnNjYWxlID0gMHgwMjAwLAorCX0sCisJeworCQkubmFtZSAgID0gIlBBTCBDQ0lSNjAxIChDSUYpIiwKKwkJLndpZHRoICA9IDM2MCwKKwkJLmhlaWdodCA9IDI4OCwKKwkJLmhzY2FsZSA9IDB4MDIwMCwKKwkJLnZzY2FsZSA9IDB4MDIwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJQQUwgU1EgKFFDSUYpIiwKKwkJLndpZHRoICA9IDE5MiwKKwkJLmhlaWdodCA9IDE0NCwKKwkJLmhzY2FsZSA9IDB4MDQwMCwKKwkJLnZzY2FsZSA9IDB4MDQwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJQQUwgQ0NJUjYwMSAoUUNJRikiLAorCQkud2lkdGggID0gMTgwLAorCQkuaGVpZ2h0ID0gMTQ0LAorCQkuaHNjYWxlID0gMHgwNDAwLAorCQkudnNjYWxlID0gMHgwNDAwLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR3OTkxMF9jcm9wcGluZ19jdHJsIHR3OTkxMF9jcm9wcGluZ19jdHJsID0geworCS52ZGVsYXkgID0gMHgwMDEyLAorCS52YWN0aXZlID0gMHgwMEYwLAorCS5oZGVsYXkgID0gMHgwMDEwLAorCS5oYWN0aXZlID0gMHgwMkQwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dzk5MTBfaHN5bmNfY3RybCB0dzk5MTBfaHN5bmNfY3RybCA9IHsKKwkuc3RhcnQgPSAweDAyNjAsCisJLmVuZCAgID0gMHgwMzAwLAorfTsKKworLyoKKyAqIGdlbmVyYWwgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCB0dzk5MTBfc2V0X3NjYWxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsICpzY2FsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFNDQUxFX0hJLAorCQkJCQkoc2NhbGUtPnZzY2FsZSAmIDB4MEYwMCkgPj4gNCB8CisJCQkJCShzY2FsZS0+aHNjYWxlICYgMHgwRjAwKSA+PiA4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBIU0NBTEVfTE8sCisJCQkJCXNjYWxlLT5oc2NhbGUgJiAweDAwRkYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFZTQ0FMRV9MTywKKwkJCQkJc2NhbGUtPnZzY2FsZSAmIDB4MDBGRik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3OTkxMF9zZXRfY3JvcHBpbmcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdHc5OTEwX2Nyb3BwaW5nX2N0cmwgKmNyb3BwaW5nKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQ1JPUF9ISSwKKwkJCQkJKGNyb3BwaW5nLT52ZGVsYXkgICYgMHgwMzAwKSA+PiAyIHwKKwkJCQkJKGNyb3BwaW5nLT52YWN0aXZlICYgMHgwMzAwKSA+PiA0IHwKKwkJCQkJKGNyb3BwaW5nLT5oZGVsYXkgICYgMHgwMzAwKSA+PiA2IHwKKwkJCQkJKGNyb3BwaW5nLT5oYWN0aXZlICYgMHgwMzAwKSA+PiA4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBWREVMQVlfTE8sCisJCQkJCWNyb3BwaW5nLT52ZGVsYXkgJiAweDAwRkYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFZBQ1RJVkVfTE8sCisJCQkJCWNyb3BwaW5nLT52YWN0aXZlICYgMHgwMEZGKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBIREVMQVlfTE8sCisJCQkJCWNyb3BwaW5nLT5oZGVsYXkgJiAweDAwRkYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhBQ1RJVkVfTE8sCisJCQkJCWNyb3BwaW5nLT5oYWN0aXZlICYgMHgwMEZGKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHc5OTEwX3NldF9oc3luYyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgIGNvbnN0IHN0cnVjdCB0dzk5MTBfaHN5bmNfY3RybCAqaHN5bmMpCit7CisJaW50IHJldDsKKworCS8qIGJpdCAxMCAtIDMgKi8KKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSFNHRUdJTiwKKwkJCQkJKGhzeW5jLT5zdGFydCAmIDB4MDdGOCkgPj4gMyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBiaXQgMTAgLSAzICovCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhTRU5ELAorCQkJCQkoaHN5bmMtPmVuZCAmIDB4MDdGOCkgPj4gMyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBiaXQgMiAtIDAgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBIU0xPV0NUTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSFNMT1dDVEwsCisJCQkJCShyZXQgJiAweDg4KSAgICAgICAgICAgICAgICAgfAorCQkJCQkoaHN5bmMtPnN0YXJ0ICYgMHgwMDA3KSA8PCA0IHwKKwkJCQkJKGhzeW5jLT5lbmQgICAmIDB4MDAwNykpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dzk5MTBfd3JpdGVfYXJyYXkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCByZWd2YWxfbGlzdCAqdmFscykKK3sKKwl3aGlsZSAodmFscy0+cmVnX251bSAhPSAweGZmKSB7CisJCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICB2YWxzLT5yZWdfbnVtLAorCQkJCQkJICAgIHZhbHMtPnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl2YWxzKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3OTkxMF9tYXNrX3NldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJICAgdTggbWFzaywgdTggc2V0KQoreworCXMzMiB2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBjb21tYW5kKTsKKworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gIHNldDsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgY29tbWFuZCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgdHc5OTEwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFDTlRMMSwgU1JFU0VUKTsKKwltc2xlZXAoMSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwqCit0dzk5MTBfc2VsZWN0X25vcm0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKK3sKKwljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOworCWNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybCAqcmV0ID0gTlVMTDsKKwl2NGwyX3N0ZF9pZCBub3JtID0gaWNkLT52ZGV2LT5jdXJyZW50X25vcm07CisJX191MzIgZGlmZiA9IDB4ZmZmZmZmZmYsIHRtcDsKKwlpbnQgc2l6ZSwgaTsKKworCWlmIChub3JtICYgVjRMMl9TVERfTlRTQykgeworCQlzY2FsZSA9IHR3OTkxMF9udHNjX3NjYWxlczsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUodHc5OTEwX250c2Nfc2NhbGVzKTsKKwl9IGVsc2UgaWYgKG5vcm0gJiBWNEwyX1NURF9QQUwpIHsKKwkJc2NhbGUgPSB0dzk5MTBfcGFsX3NjYWxlczsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUodHc5OTEwX3BhbF9zY2FsZXMpOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJdG1wID0gYWJzKHdpZHRoIC0gc2NhbGVbaV0ud2lkdGgpICsKKwkJCWFicyhoZWlnaHQgLSBzY2FsZVtpXS5oZWlnaHQpOworCQlpZiAodG1wIDwgZGlmZikgeworCQkJZGlmZiA9IHRtcDsKKwkJCXJldCA9IHNjYWxlICsgaTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzb2NfY2FtZXJhX29wcyBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IHR3OTkxMF9pbml0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCB0dzk5MTBfcHJpdiwgaWNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcml2LT5pbmZvLT5saW5rLnBvd2VyKSB7CisJCXJldCA9IHByaXYtPmluZm8tPmxpbmsucG93ZXIoJnByaXYtPmNsaWVudC0+ZGV2LCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwcml2LT5pbmZvLT5saW5rLnJlc2V0KQorCQlyZXQgPSBwcml2LT5pbmZvLT5saW5rLnJlc2V0KCZwcml2LT5jbGllbnQtPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3OTkxMF9yZWxlYXNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCB0dzk5MTBfcHJpdiwgaWNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcml2LT5pbmZvLT5saW5rLnBvd2VyKQorCQlyZXQgPSBwcml2LT5pbmZvLT5saW5rLnBvd2VyKCZwcml2LT5jbGllbnQtPmRldiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3OTkxMF9zdGFydF9jYXB0dXJlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCB0dzk5MTBfcHJpdiwgaWNkKTsKKworCWlmICghcHJpdi0+c2NhbGUpIHsKKwkJZGV2X2VycigmaWNkLT5kZXYsICJub3JtIHNlbGVjdCBlcnJvclxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJZGV2X2RiZygmaWNkLT5kZXYsICIlcyAlZHglZFxuIiwKKwkJIHByaXYtPnNjYWxlLT5uYW1lLAorCQkgcHJpdi0+c2NhbGUtPndpZHRoLAorCQkgcHJpdi0+c2NhbGUtPmhlaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dzk5MTBfc3RvcF9jYXB0dXJlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3OTkxMF9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHR3OTkxMF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IHR3OTkxMF9wcml2LCBpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHByaXYtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX01BU1RFUiB8CisJCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgcHJpdi0+aW5mby0+YnVzd2lkdGg7CisKKwlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdHc5OTEwX2dldF9jaGlwX2lkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqaWQpCit7CisJaWQtPmlkZW50ID0gVjRMMl9JREVOVF9UVzk5MTA7CisJaWQtPnJldmlzaW9uID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3OTkxMF9zZXRfc3RkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICB2NGwyX3N0ZF9pZCAqYSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICgqYSAmIChWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMKSkKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHc5OTEwX2VudW1faW5wdXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppbnApCit7CisJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCWlucC0+c3RkICA9IFY0TDJfU1REX1VOS05PV047CisJc3RyY3B5KGlucC0+bmFtZSwgIlZpZGVvIik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgdHc5OTEwX2dldF9yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCB0dzk5MTBfcHJpdiwgaWNkKTsKKwlpbnQgcmV0OworCisJaWYgKHJlZy0+cmVnID4gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCByZWctPnJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiByZXQgICAgICA9IGludAorCSAqIHJlZy0+dmFsID0gX191NjQKKwkgKi8KKwlyZWctPnZhbCA9IChfX3U2NClyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dzk5MTBfc2V0X3JlZ2lzdGVyKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IHR3OTkxMF9wcml2LCBpY2QpOworCisJaWYgKHJlZy0+cmVnID4gMHhmZiB8fAorCSAgICByZWctPnZhbCA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEocHJpdi0+Y2xpZW50LCByZWctPnJlZywgcmVnLT52YWwpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdHc5OTEwX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCit7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IHR3OTkxMF9wcml2LCBpY2QpOworCWludCAgICAgICAgICAgICAgICAgcmV0ICA9IC1FSU5WQUw7CisJdTggICAgICAgICAgICAgICAgICB2YWw7CisKKwkvKgorCSAqIHNlbGVjdCBzdWl0YWJsZSBub3JtCisJICovCisJcHJpdi0+c2NhbGUgPSB0dzk5MTBfc2VsZWN0X25vcm0oaWNkLCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKKwlpZiAoIXByaXYtPnNjYWxlKQorCQlnb3RvIHR3OTkxMF9zZXRfZm10X2Vycm9yOworCisJLyoKKwkgKiByZXNldCBoYXJkd2FyZQorCSAqLworCXR3OTkxMF9yZXNldChwcml2LT5jbGllbnQpOworCXJldCA9IHR3OTkxMF93cml0ZV9hcnJheShwcml2LT5jbGllbnQsIHR3OTkxMF9kZWZhdWx0X3JlZ3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHR3OTkxMF9zZXRfZm10X2Vycm9yOworCisJLyoKKwkgKiBzZXQgYnVzIHdpZHRoCisJICovCisJdmFsID0gMHgwMDsKKwlpZiAoU09DQU1fREFUQVdJRFRIXzE2ID09IHByaXYtPmluZm8tPmJ1c3dpZHRoKQorCQl2YWwgPSBMRU47CisKKwlyZXQgPSB0dzk5MTBfbWFza19zZXQocHJpdi0+Y2xpZW50LCBPUEZPUk0sIExFTiwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB0dzk5MTBfc2V0X2ZtdF9lcnJvcjsKKworCS8qCisJICogc2VsZWN0IE1QT1VUIGJlaGF2aW9yCisJICovCisJc3dpdGNoIChwcml2LT5pbmZvLT5tcG91dCkgeworCWNhc2UgVFc5OTEwX01QT19WTE9TUzoKKwkJdmFsID0gUlRTRUxfVkxPU1M7IGJyZWFrOworCWNhc2UgVFc5OTEwX01QT19ITE9DSzoKKwkJdmFsID0gUlRTRUxfSExPQ0s7IGJyZWFrOworCWNhc2UgVFc5OTEwX01QT19TTE9DSzoKKwkJdmFsID0gUlRTRUxfU0xPQ0s7IGJyZWFrOworCWNhc2UgVFc5OTEwX01QT19WTE9DSzoKKwkJdmFsID0gUlRTRUxfVkxPQ0s7IGJyZWFrOworCWNhc2UgVFc5OTEwX01QT19NT05POgorCQl2YWwgPSBSVFNFTF9NT05POyAgYnJlYWs7CisJY2FzZSBUVzk5MTBfTVBPX0RFVDUwOgorCQl2YWwgPSBSVFNFTF9ERVQ1MDsgYnJlYWs7CisJY2FzZSBUVzk5MTBfTVBPX0ZJRUxEOgorCQl2YWwgPSBSVFNFTF9GSUVMRDsgYnJlYWs7CisJY2FzZSBUVzk5MTBfTVBPX1JUQ086CisJCXZhbCA9IFJUU0VMX1JUQ087ICBicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAwOworCX0KKworCXJldCA9IHR3OTkxMF9tYXNrX3NldChwcml2LT5jbGllbnQsIFZCSUNOVEwsIFJUU0VMX01BU0ssIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdHc5OTEwX3NldF9mbXRfZXJyb3I7CisKKwkvKgorCSAqIHNldCBzY2FsZQorCSAqLworCXJldCA9IHR3OTkxMF9zZXRfc2NhbGUocHJpdi0+Y2xpZW50LCBwcml2LT5zY2FsZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdHc5OTEwX3NldF9mbXRfZXJyb3I7CisKKwkvKgorCSAqIHNldCBjcm9wcGluZworCSAqLworCXJldCA9IHR3OTkxMF9zZXRfY3JvcHBpbmcocHJpdi0+Y2xpZW50LCAmdHc5OTEwX2Nyb3BwaW5nX2N0cmwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHR3OTkxMF9zZXRfZm10X2Vycm9yOworCisJLyoKKwkgKiBzZXQgaHN5bmMKKwkgKi8KKwlyZXQgPSB0dzk5MTBfc2V0X2hzeW5jKHByaXYtPmNsaWVudCwgJnR3OTkxMF9oc3luY19jdHJsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB0dzk5MTBfc2V0X2ZtdF9lcnJvcjsKKworCXJldHVybiByZXQ7CisKK3R3OTkxMF9zZXRfZm10X2Vycm9yOgorCisJdHc5OTEwX3Jlc2V0KHByaXYtPmNsaWVudCk7CisJcHJpdi0+c2NhbGUgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dzk5MTBfdHJ5X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOworCisJaWYgKFY0TDJfRklFTERfQU5ZID09IHBpeC0+ZmllbGQpIHsKKwkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwl9IGVsc2UgaWYgKFY0TDJfRklFTERfSU5URVJMQUNFRCAhPSBwaXgtPmZpZWxkKSB7CisJCWRldl9lcnIoJmljZC0+ZGV2LCAiRmllbGQgdHlwZSBpbnZhbGlkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogc2VsZWN0IHN1aXRhYmxlIG5vcm0KKwkgKi8KKwlzY2FsZSA9IHR3OTkxMF9zZWxlY3Rfbm9ybShpY2QsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlpZiAoIXNjYWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBpeC0+d2lkdGggID0gc2NhbGUtPndpZHRoOworCXBpeC0+aGVpZ2h0ID0gc2NhbGUtPmhlaWdodDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3OTkxMF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgdHc5OTEwX3ByaXYsIGljZCk7CisJczMyIHZhbDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgorCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCisJICovCisJaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKKwkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiB0dzk5MTAgb25seSB1c2UgOCBvciAxNiBiaXQgYnVzIHdpZHRoCisJICovCisJaWYgKFNPQ0FNX0RBVEFXSURUSF8xNiAhPSBwcml2LT5pbmZvLT5idXN3aWR0aCAmJgorCSAgICBTT0NBTV9EQVRBV0lEVEhfOCAgIT0gcHJpdi0+aW5mby0+YnVzd2lkdGgpIHsKKwkJZGV2X2VycigmaWNkLT5kZXYsICJidXMgd2lkdGggZXJyb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpY2QtPmZvcm1hdHMgICAgID0gdHc5OTEwX2NvbG9yX2ZtdDsKKwlpY2QtPm51bV9mb3JtYXRzID0gQVJSQVlfU0laRSh0dzk5MTBfY29sb3JfZm10KTsKKworCS8qCisJICogY2hlY2sgYW5kIHNob3cgUHJvZHVjdCBJRAorCSAqLworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShwcml2LT5jbGllbnQsIElEKTsKKwlpZiAoMHgwQiAhPSBHRVRfSUQodmFsKSB8fAorCSAgICAweDAwICE9IEdFVF9SZVYodmFsKSkgeworCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJCSJQcm9kdWN0IElEIGVycm9yICV4OiV4XG4iLCBHRVRfSUQodmFsKSwgR0VUX1JlVih2YWwpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2X2luZm8oJmljZC0+ZGV2LAorCQkgInR3OTkxMCBQcm9kdWN0IElEICUweDolMHhcbiIsIEdFVF9JRCh2YWwpLCBHRVRfUmVWKHZhbCkpOworCisJcmV0ID0gc29jX2NhbWVyYV92aWRlb19zdGFydChpY2QpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWNkLT52ZGV2LT50dm5vcm1zICAgICAgPSBWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMOworCWljZC0+dmRldi0+Y3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR3OTkxMF92aWRlb19yZW1vdmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc29jX2NhbWVyYV92aWRlb19zdG9wKGljZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgdHc5OTEwX29wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJCT0gdHc5OTEwX3ZpZGVvX3Byb2JlLAorCS5yZW1vdmUJCQk9IHR3OTkxMF92aWRlb19yZW1vdmUsCisJLmluaXQJCQk9IHR3OTkxMF9pbml0LAorCS5yZWxlYXNlCQk9IHR3OTkxMF9yZWxlYXNlLAorCS5zdGFydF9jYXB0dXJlCQk9IHR3OTkxMF9zdGFydF9jYXB0dXJlLAorCS5zdG9wX2NhcHR1cmUJCT0gdHc5OTEwX3N0b3BfY2FwdHVyZSwKKwkuc2V0X2ZtdAkJPSB0dzk5MTBfc2V0X2ZtdCwKKwkudHJ5X2ZtdAkJPSB0dzk5MTBfdHJ5X2ZtdCwKKwkuc2V0X2J1c19wYXJhbQkJPSB0dzk5MTBfc2V0X2J1c19wYXJhbSwKKwkucXVlcnlfYnVzX3BhcmFtCT0gdHc5OTEwX3F1ZXJ5X2J1c19wYXJhbSwKKwkuZ2V0X2NoaXBfaWQJCT0gdHc5OTEwX2dldF9jaGlwX2lkLAorCS5zZXRfc3RkCQk9IHR3OTkxMF9zZXRfc3RkLAorCS5lbnVtX2lucHV0CQk9IHR3OTkxMF9lbnVtX2lucHV0LAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkuZ2V0X3JlZ2lzdGVyCQk9IHR3OTkxMF9nZXRfcmVnaXN0ZXIsCisJLnNldF9yZWdpc3RlcgkJPSB0dzk5MTBfc2V0X3JlZ2lzdGVyLAorI2VuZGlmCit9OworCisvKgorICogaTJjX2RyaXZlciBmdW5jdGlvbgorICovCisKK3N0YXRpYyBpbnQgdHc5OTEwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQorCit7CisJc3RydWN0IHR3OTkxMF9wcml2ICAgICAgICAgICAgICpwcml2OworCXN0cnVjdCB0dzk5MTBfdmlkZW9faW5mbyAgICAgICAqaW5mbzsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgICAgICAgKmljZDsKKwljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmV0OworCisJaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0ICIKKwkJCSJJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+aW5mbyAgID0gaW5mbzsKKwlwcml2LT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcHJpdik7CisKKwlpY2QgICAgICAgICAgPSAmcHJpdi0+aWNkOworCWljZC0+b3BzICAgICA9ICZ0dzk5MTBfb3BzOworCWljZC0+Y29udHJvbCA9ICZjbGllbnQtPmRldjsKKwlpY2QtPmlmYWNlICAgPSBpbmZvLT5saW5rLmJ1c19pZDsKKworCS8qCisJICogc2V0IHdpZHRoIGFuZCBoZWlnaHQKKwkgKi8KKwlpY2QtPndpZHRoX21heCAgPSB0dzk5MTBfbnRzY19zY2FsZXNbMF0ud2lkdGg7IC8qIHNldCBkZWZhdWx0ICovCisJaWNkLT53aWR0aF9taW4gID0gdHc5OTEwX250c2Nfc2NhbGVzWzBdLndpZHRoOworCWljZC0+aGVpZ2h0X21heCA9IHR3OTkxMF9udHNjX3NjYWxlc1swXS5oZWlnaHQ7CisJaWNkLT5oZWlnaHRfbWluID0gdHc5OTEwX250c2Nfc2NhbGVzWzBdLmhlaWdodDsKKworCXNjYWxlID0gdHc5OTEwX250c2Nfc2NhbGVzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR3OTkxMF9udHNjX3NjYWxlcyk7IGkrKykgeworCQlpY2QtPndpZHRoX21heCAgPSBtYXgoc2NhbGVbaV0ud2lkdGgsICBpY2QtPndpZHRoX21heCk7CisJCWljZC0+d2lkdGhfbWluICA9IG1pbihzY2FsZVtpXS53aWR0aCwgIGljZC0+d2lkdGhfbWluKTsKKwkJaWNkLT5oZWlnaHRfbWF4ID0gbWF4KHNjYWxlW2ldLmhlaWdodCwgaWNkLT5oZWlnaHRfbWF4KTsKKwkJaWNkLT5oZWlnaHRfbWluID0gbWluKHNjYWxlW2ldLmhlaWdodCwgaWNkLT5oZWlnaHRfbWluKTsKKwl9CisJc2NhbGUgPSB0dzk5MTBfcGFsX3NjYWxlczsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dzk5MTBfcGFsX3NjYWxlcyk7IGkrKykgeworCQlpY2QtPndpZHRoX21heCAgPSBtYXgoc2NhbGVbaV0ud2lkdGgsICBpY2QtPndpZHRoX21heCk7CisJCWljZC0+d2lkdGhfbWluICA9IG1pbihzY2FsZVtpXS53aWR0aCwgIGljZC0+d2lkdGhfbWluKTsKKwkJaWNkLT5oZWlnaHRfbWF4ID0gbWF4KHNjYWxlW2ldLmhlaWdodCwgaWNkLT5oZWlnaHRfbWF4KTsKKwkJaWNkLT5oZWlnaHRfbWluID0gbWluKHNjYWxlW2ldLmhlaWdodCwgaWNkLT5oZWlnaHRfbWluKTsKKwl9CisKKwlyZXQgPSBzb2NfY2FtZXJhX2RldmljZV9yZWdpc3RlcihpY2QpOworCisJaWYgKHJldCkgeworCQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dzk5MTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzb2NfY2FtZXJhX2RldmljZV91bnJlZ2lzdGVyKCZwcml2LT5pY2QpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHc5OTEwX2lkW10gPSB7CisJeyAidHc5OTEwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0dzk5MTBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHc5OTEwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHc5OTEwIiwKKwl9LAorCS5wcm9iZSAgICA9IHR3OTkxMF9wcm9iZSwKKwkucmVtb3ZlICAgPSB0dzk5MTBfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHR3OTkxMF9pZCwKK307CisKKy8qCisgKiBtb2R1bGUgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgdHc5OTEwX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ0dzk5MTBfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0dzk5MTBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHc5OTEwX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0dzk5MTBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodHc5OTEwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgQ2FtZXJhIGRyaXZlciBmb3IgdHc5OTEwIik7CitNT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDAzMWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwMzFhLmMKaW5kZXggYjQ2Mjg4Ny4uN2E2MDlhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDAzMWEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VwZDY0MDMxYS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi5oPgogI2luY2x1ZGUgPG1lZGlhL3VwZDY0MDMxYS5oPgpAQCAtNjIsNiArNjIsNyBAQAogfTsKIAogc3RydWN0IHVwZDY0MDMxYV9zdGF0ZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCXU4IHJlZ3NbVE9UX1JFR1NdOwogCXU4IGdyX21vZGU7CiAJdTggZGlyZWN0XzNkeWNzX2Nvbm5lY3Q7CkBAIC02OSw2ICs3MCwxMSBAQAogCXU4IGV4dF92ZXJ0X3N5bmM7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1cGQ2NDAzMWFfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHVwZDY0MDMxYV9zdGF0ZSwgc2QpOworfQorCiBzdGF0aWMgdTggdXBkNjQwMzFhX2luaXRbXSA9IHsKIAkweDAwLCAweGI4LCAweDQ4LCAweGQyLCAweGU2LAogCTB4MDMsIDB4MTAsIDB4MGIsIDB4YWYsIDB4N2YsCkBAIC03OCw4ICs4NCw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdTggdXBkNjQwMzFhX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQorc3RhdGljIHU4IHVwZDY0MDMxYV9yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJdTggYnVmWzJdOwogCiAJaWYgKHJlZyA+PSBzaXplb2YoYnVmKSkKQEAgLTkwLDEwNyArOTcsMTI4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCB1cGQ2NDAzMWFfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWwpCitzdGF0aWMgdm9pZCB1cGQ2NDAzMWFfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTggcmVnLCB1OCB2YWwpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXU4IGJ1ZlsyXTsKIAogCWJ1ZlswXSA9IHJlZzsKIAlidWZbMV0gPSB2YWw7Ci0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAid3JpdGUgcmVnOiAlMDJYIHZhbDogJTAyWFxuIiwgcmVnLCB2YWwpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIndyaXRlIHJlZzogJTAyWCB2YWw6ICUwMlhcbiIsIHJlZywgdmFsKTsKIAlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKSAhPSAyKQotCQl2NGxfZXJyKGNsaWVudCwgIkkvTyBlcnJvciB3cml0ZSAweCUwMngvMHglMDJ4XG4iLCByZWcsIHZhbCk7CisJCXY0bDJfZXJyKHNkLCAiSS9PIGVycm9yIHdyaXRlIDB4JTAyeC8weCUwMnhcbiIsIHJlZywgdmFsKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIFRoZSBpbnB1dCBjaGFuZ2VkIGR1ZSB0byBuZXcgaW5wdXQgb3IgY2hhbm5lbCBjaGFuZ2VkICovCi1zdGF0aWMgdm9pZCB1cGQ2NDAzMWFfY2hhbmdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHVwZDY0MDMxYV9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpCiB7Ci0Jc3RydWN0IHVwZDY0MDMxYV9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdXBkNjQwMzFhX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAl1OCByZWcgPSBzdGF0ZS0+cmVnc1tSMDBdOwogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiY2hhbmdlZCBpbnB1dCBvciBjaGFubmVsXG4iKTsKLQl1cGQ2NDAzMWFfd3JpdGUoY2xpZW50LCBSMDAsIHJlZyB8IDB4MTApOwotCXVwZDY0MDMxYV93cml0ZShjbGllbnQsIFIwMCwgcmVnICYgfjB4MTApOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImNoYW5nZWQgaW5wdXQgb3IgY2hhbm5lbFxuIik7CisJdXBkNjQwMzFhX3dyaXRlKHNkLCBSMDAsIHJlZyB8IDB4MTApOworCXVwZDY0MDMxYV93cml0ZShzZCwgUjAwLCByZWcgJiB+MHgxMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHVwZDY0MDMxYV9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB1cGQ2NDAzMWFfc19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGNvbnN0IHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKQogewotCXN0cnVjdCB1cGQ2NDAzMWFfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisJc3RydWN0IHVwZDY0MDMxYV9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisJdTggcjAwLCByMDUsIHIwODsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCXVwZDY0MDMxYV9jaGFuZ2UoY2xpZW50KTsKLQkJYnJlYWs7CisJc3RhdGUtPmdyX21vZGUgPSAocm91dGUtPmlucHV0ICYgMykgPDwgNjsKKwlzdGF0ZS0+ZGlyZWN0XzNkeWNzX2Nvbm5lY3QgPSAocm91dGUtPmlucHV0ICYgMHhjKSA8PCA0OworCXN0YXRlLT5leHRfY29tcF9zeW5jID0KKwkJKHJvdXRlLT5pbnB1dCAmIFVQRDY0MDMxQV9DT01QT1NJVEVfRVhURVJOQUwpIDw8IDE7CisJc3RhdGUtPmV4dF92ZXJ0X3N5bmMgPQorCQkocm91dGUtPmlucHV0ICYgVVBENjQwMzFBX1ZFUlRJQ0FMX0VYVEVSTkFMKSA8PCAyOworCXIwMCA9IChzdGF0ZS0+cmVnc1tSMDBdICYgfkdSX01PREVfTUFTSykgfCBzdGF0ZS0+Z3JfbW9kZTsKKwlyMDUgPSAoc3RhdGUtPnJlZ3NbUjAwXSAmIH5TWU5DX0NJUkNVSVRfTUFTSykgfAorCQlzdGF0ZS0+ZXh0X2NvbXBfc3luYyB8IHN0YXRlLT5leHRfdmVydF9zeW5jOworCXIwOCA9IChzdGF0ZS0+cmVnc1tSMDhdICYgfkRJUkVDVF8zRFlDU19DT05ORUNUX01BU0spIHwKKwkJc3RhdGUtPmRpcmVjdF8zZHljc19jb25uZWN0OworCXVwZDY0MDMxYV93cml0ZShzZCwgUjAwLCByMDApOworCXVwZDY0MDMxYV93cml0ZShzZCwgUjA1LCByMDUpOworCXVwZDY0MDMxYV93cml0ZShzZCwgUjA4LCByMDgpOworCXJldHVybiB1cGQ2NDAzMWFfc19mcmVxdWVuY3koc2QsIE5VTEwpOworfQogCi0JY2FzZSBWSURJT0NfSU5UX0dfVklERU9fUk9VVElORzoKLQkJcm91dGUtPmlucHV0ID0gKHN0YXRlLT5ncl9tb2RlID4+IDYpIHwKLQkJCShzdGF0ZS0+ZGlyZWN0XzNkeWNzX2Nvbm5lY3QgPj4gNCkgfAotCQkJKHN0YXRlLT5leHRfY29tcF9zeW5jID4+IDEpIHwKLQkJCShzdGF0ZS0+ZXh0X3ZlcnRfc3luYyA+PiAyKTsKLQkJcm91dGUtPm91dHB1dCA9IDA7Ci0JCWJyZWFrOworc3RhdGljIGludCB1cGQ2NDAzMWFfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKLQl7Ci0JCXU4IHIwMCwgcjA1LCByMDg7CisJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgY2hpcCwgVjRMMl9JREVOVF9VUEQ2NDAzMUEsIDApOworfQogCi0JCXN0YXRlLT5ncl9tb2RlID0gKHJvdXRlLT5pbnB1dCAmIDMpIDw8IDY7Ci0JCXN0YXRlLT5kaXJlY3RfM2R5Y3NfY29ubmVjdCA9IChyb3V0ZS0+aW5wdXQgJiAweGMpIDw8IDQ7Ci0JCXN0YXRlLT5leHRfY29tcF9zeW5jID0KLQkJCShyb3V0ZS0+aW5wdXQgJiBVUEQ2NDAzMUFfQ09NUE9TSVRFX0VYVEVSTkFMKSA8PCAxOwotCQlzdGF0ZS0+ZXh0X3ZlcnRfc3luYyA9Ci0JCQkocm91dGUtPmlucHV0ICYgVVBENjQwMzFBX1ZFUlRJQ0FMX0VYVEVSTkFMKSA8PCAyOwotCQlyMDAgPSAoc3RhdGUtPnJlZ3NbUjAwXSAmIH5HUl9NT0RFX01BU0spIHwgc3RhdGUtPmdyX21vZGU7Ci0JCXIwNSA9IChzdGF0ZS0+cmVnc1tSMDBdICYgflNZTkNfQ0lSQ1VJVF9NQVNLKSB8Ci0JCQlzdGF0ZS0+ZXh0X2NvbXBfc3luYyB8IHN0YXRlLT5leHRfdmVydF9zeW5jOwotCQlyMDggPSAoc3RhdGUtPnJlZ3NbUjA4XSAmIH5ESVJFQ1RfM0RZQ1NfQ09OTkVDVF9NQVNLKSB8Ci0JCQlzdGF0ZS0+ZGlyZWN0XzNkeWNzX2Nvbm5lY3Q7Ci0JCXVwZDY0MDMxYV93cml0ZShjbGllbnQsIFIwMCwgcjAwKTsKLQkJdXBkNjQwMzFhX3dyaXRlKGNsaWVudCwgUjA1LCByMDUpOwotCQl1cGQ2NDAzMWFfd3JpdGUoY2xpZW50LCBSMDgsIHIwOCk7Ci0JCXVwZDY0MDMxYV9jaGFuZ2UoY2xpZW50KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJdjRsX2luZm8oY2xpZW50LCAiU3RhdHVzOiBTQTAwPTB4JTAyeCBTQTAxPTB4JTAyeFxuIiwKLQkJCXVwZDY0MDMxYV9yZWFkKGNsaWVudCwgMCksIHVwZDY0MDMxYV9yZWFkKGNsaWVudCwgMSkpOwotCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjoKLQljYXNlIFZJRElPQ19EQkdfU19SRUdJU1RFUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcgPSBhcmc7Ci0KLQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCi0JCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAoY21kID09IFZJRElPQ19EQkdfR19SRUdJU1RFUikgewotCQkJcmVnLT52YWwgPSB1cGQ2NDAzMWFfcmVhZChjbGllbnQsIHJlZy0+cmVnICYgMHhmZik7Ci0JCQlicmVhazsKLQkJfQotCQl1cGQ2NDAzMWFfd3JpdGUoY2xpZW50LCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgotCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsCi0JCQkJVjRMMl9JREVOVF9VUEQ2NDAzMUEsIDApOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorc3RhdGljIGludCB1cGQ2NDAzMWFfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXY0bDJfaW5mbyhzZCwgIlN0YXR1czogU0EwMD0weCUwMnggU0EwMT0weCUwMnhcbiIsCisJCQl1cGQ2NDAzMWFfcmVhZChzZCwgMCksIHVwZDY0MDMxYV9yZWFkKHNkLCAxKSk7CiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IHVwZDY0MDMxYV9nX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCisJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmVnLT52YWwgPSB1cGQ2NDAzMWFfcmVhZChzZCwgcmVnLT5yZWcgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGQ2NDAzMWFfc19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXVwZDY0MDMxYV93cml0ZShzZCwgcmVnLT5yZWcgJiAweGZmLCByZWctPnZhbCAmIDB4ZmYpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdXBkNjQwMzFhX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB1cGQ2NDAzMWFfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB1cGQ2NDAzMWFfbG9nX3N0YXR1cywKKwkuZ19jaGlwX2lkZW50ID0gdXBkNjQwMzFhX2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIgPSB1cGQ2NDAzMWFfZ19yZWdpc3RlciwKKwkuc19yZWdpc3RlciA9IHVwZDY0MDMxYV9zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB1cGQ2NDAzMWFfdHVuZXJfb3BzID0geworCS5zX2ZyZXF1ZW5jeSA9IHVwZDY0MDMxYV9zX2ZyZXF1ZW5jeSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHVwZDY0MDMxYV92aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHVwZDY0MDMxYV9zX3JvdXRpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB1cGQ2NDAzMWFfb3BzID0geworCS5jb3JlID0gJnVwZDY0MDMxYV9jb3JlX29wcywKKwkudHVuZXIgPSAmdXBkNjQwMzFhX3R1bmVyX29wcywKKwkudmlkZW8gPSAmdXBkNjQwMzFhX3ZpZGVvX29wcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBpMmMgaW1wbGVtZW50YXRpb24gKi8KQEAgLTE5OSw2ICsyMjcsNyBAQAogCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB1cGQ2NDAzMWFfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAJaW50IGk7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKQEAgLTIxMCwxOSArMjM5LDIzIEBACiAJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXBkNjQwMzFhX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKKwlzZCA9ICZzdGF0ZS0+c2Q7CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJnVwZDY0MDMxYV9vcHMpOwogCW1lbWNweShzdGF0ZS0+cmVncywgdXBkNjQwMzFhX2luaXQsIHNpemVvZihzdGF0ZS0+cmVncykpOwogCXN0YXRlLT5ncl9tb2RlID0gVVBENjQwMzFBX0dSX09OIDw8IDY7CiAJc3RhdGUtPmRpcmVjdF8zZHljc19jb25uZWN0ID0gVVBENjQwMzFBXzNEWUNTX0NPTVBPU0lURSA8PCA0OwogCXN0YXRlLT5leHRfY29tcF9zeW5jID0gc3RhdGUtPmV4dF92ZXJ0X3N5bmMgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBUT1RfUkVHUzsgaSsrKQotCQl1cGQ2NDAzMWFfd3JpdGUoY2xpZW50LCBpLCBzdGF0ZS0+cmVnc1tpXSk7CisJCXVwZDY0MDMxYV93cml0ZShzZCwgaSwgc3RhdGUtPnJlZ3NbaV0pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHVwZDY0MDMxYV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHRvX3N0YXRlKHNkKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwODMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwODMuYwppbmRleCA5NTIxY2UwLi41ODQxMmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VwZDY0MDgzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDA4My5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi5oPgogI2luY2x1ZGUgPG1lZGlhL3VwZDY0MDgzLmg+CkBAIC01MSwxMSArNTEsMTcgQEAKIH07CiAKIHN0cnVjdCB1cGQ2NDA4M19zdGF0ZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCXU4IG1vZGU7CiAJdTggZXh0X3lfYWRjOwogCXU4IHJlZ3NbVE9UX1JFR1NdOwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdXBkNjQwODNfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHVwZDY0MDgzX3N0YXRlLCBzZCk7Cit9CisKIC8qIEluaXRpYWwgdmFsdWVzIHdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZQogICAgTkVDIHVwZDY0MDMxYSBnaG9zdCByZWR1Y3Rpb24gY2hpcC4gKi8KIHN0YXRpYyB1OCB1cGQ2NDA4M19pbml0W10gPSB7CkBAIC02OCwzNCArNzQsMjQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkIHVwZDY0MDgzX2xvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyB2b2lkIHVwZDY0MDgzX3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZywgdTggdmFsKQogewotCXU4IGJ1Zls3XTsKLQotCWkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgNyk7Ci0JdjRsX2luZm8oY2xpZW50LCAiU3RhdHVzOiBTQTAwPSUwMnggU0EwMT0lMDJ4IFNBMDI9JTAyeCBTQTAzPSUwMnggIgotCQkgICAgICAiU0EwND0lMDJ4IFNBMDU9JTAyeCBTQTA2PSUwMnhcbiIsCi0JCWJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCB1cGQ2NDA4M193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKLXsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJdTggYnVmWzJdOwogCiAJYnVmWzBdID0gcmVnOwogCWJ1ZlsxXSA9IHZhbDsKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ3cml0ZSByZWc6ICUwMnggdmFsOiAlMDJ4XG4iLCByZWcsIHZhbCk7CisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAid3JpdGUgcmVnOiAlMDJ4IHZhbDogJTAyeFxuIiwgcmVnLCB2YWwpOwogCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpICE9IDIpCi0JCXY0bF9lcnIoY2xpZW50LCAiSS9PIGVycm9yIHdyaXRlIDB4JTAyeC8weCUwMnhcbiIsIHJlZywgdmFsKTsKKwkJdjRsMl9lcnIoc2QsICJJL08gZXJyb3Igd3JpdGUgMHglMDJ4LzB4JTAyeFxuIiwgcmVnLCB2YWwpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLXN0YXRpYyB1OCB1cGQ2NDA4M19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3N0YXRpYyB1OCB1cGQ2NDA4M19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHU4IHJlZykKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJdTggYnVmWzddOwogCiAJaWYgKHJlZyA+PSBzaXplb2YoYnVmKSkKQEAgLTEwNyw2NyArMTAzLDk0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHVwZDY0MDgzX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHVwZDY0MDgzX3Nfcm91dGluZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSkKIHsKLQlzdHJ1Y3QgdXBkNjQwODNfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUgPSBhcmc7CisJc3RydWN0IHVwZDY0MDgzX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKwl1OCByMDAsIHIwMjsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfSU5UX0dfVklERU9fUk9VVElORzoKLQkJcm91dGUtPmlucHV0ID0gKHN0YXRlLT5tb2RlID4+IDYpIHwgKHN0YXRlLT5leHRfeV9hZGMgPj4gMyk7Ci0JCXJvdXRlLT5vdXRwdXQgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkc6Ci0JewotCQl1OCByMDAsIHIwMjsKLQotCQlpZiAocm91dGUtPmlucHV0ID4gNyB8fCAocm91dGUtPmlucHV0ICYgNikgPT0gNikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZS0+bW9kZSA9IChyb3V0ZS0+aW5wdXQgJiAzKSA8PCA2OwotCQlzdGF0ZS0+ZXh0X3lfYWRjID0gKHJvdXRlLT5pbnB1dCAmIFVQRDY0MDgzX0VYVF9ZX0FEQykgPDwgMzsKLQkJcjAwID0gKHN0YXRlLT5yZWdzW1IwMF0gJiB+KDMgPDwgNikpIHwgc3RhdGUtPm1vZGU7Ci0JCXIwMiA9IChzdGF0ZS0+cmVnc1tSMDJdICYgfigxIDw8IDUpKSB8IHN0YXRlLT5leHRfeV9hZGM7Ci0JCXVwZDY0MDgzX3dyaXRlKGNsaWVudCwgUjAwLCByMDApOwotCQl1cGQ2NDA4M193cml0ZShjbGllbnQsIFIwMiwgcjAyKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKLQkJdXBkNjQwODNfbG9nX3N0YXR1cyhjbGllbnQpOwotCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjoKLQljYXNlIFZJRElPQ19EQkdfU19SRUdJU1RFUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcgPSBhcmc7Ci0KLQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCi0JCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChjbWQgPT0gVklESU9DX0RCR19HX1JFR0lTVEVSKSB7Ci0JCQlyZWctPnZhbCA9IHVwZDY0MDgzX3JlYWQoY2xpZW50LCByZWctPnJlZyAmIDB4ZmYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdXBkNjQwODNfd3JpdGUoY2xpZW50LCByZWctPnJlZyAmIDB4ZmYsIHJlZy0+dmFsICYgMHhmZik7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgotCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsCi0JCQkJVjRMMl9JREVOVF9VUEQ2NDA4MywgMCk7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KKwlpZiAocm91dGUtPmlucHV0ID4gNyB8fCAocm91dGUtPmlucHV0ICYgNikgPT0gNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RhdGUtPm1vZGUgPSAocm91dGUtPmlucHV0ICYgMykgPDwgNjsKKwlzdGF0ZS0+ZXh0X3lfYWRjID0gKHJvdXRlLT5pbnB1dCAmIFVQRDY0MDgzX0VYVF9ZX0FEQykgPDwgMzsKKwlyMDAgPSAoc3RhdGUtPnJlZ3NbUjAwXSAmIH4oMyA8PCA2KSkgfCBzdGF0ZS0+bW9kZTsKKwlyMDIgPSAoc3RhdGUtPnJlZ3NbUjAyXSAmIH4oMSA8PCA1KSkgfCBzdGF0ZS0+ZXh0X3lfYWRjOworCXVwZDY0MDgzX3dyaXRlKHNkLCBSMDAsIHIwMCk7CisJdXBkNjQwODNfd3JpdGUoc2QsIFIwMiwgcjAyKTsKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgdXBkNjQwODNfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY2xpZW50LAorCQkJCXJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJlZy0+dmFsID0gdXBkNjQwODNfcmVhZChzZCwgcmVnLT5yZWcgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGQ2NDA4M19zX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjbGllbnQsCisJCQkJcmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJdXBkNjQwODNfd3JpdGUoc2QsIHJlZy0+cmVnICYgMHhmZiwgcmVnLT52YWwgJiAweGZmKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHVwZDY0MDgzX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfVVBENjQwODMsIDApOworfQorCitzdGF0aWMgaW50IHVwZDY0MDgzX2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJdTggYnVmWzddOworCisJaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCA3KTsKKwl2NGwyX2luZm8oc2QsICJTdGF0dXM6IFNBMDA9JTAyeCBTQTAxPSUwMnggU0EwMj0lMDJ4IFNBMDM9JTAyeCAiCisJCSAgICAgICJTQTA0PSUwMnggU0EwNT0lMDJ4IFNBMDY9JTAyeFxuIiwKKwkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLCBidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGQ2NDA4M19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdXBkNjQwODNfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB1cGQ2NDA4M19sb2dfc3RhdHVzLAorCS5nX2NoaXBfaWRlbnQgPSB1cGQ2NDA4M19nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyID0gdXBkNjQwODNfZ19yZWdpc3RlciwKKwkuc19yZWdpc3RlciA9IHVwZDY0MDgzX3NfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHVwZDY0MDgzX3ZpZGVvX29wcyA9IHsKKwkuc19yb3V0aW5nID0gdXBkNjQwODNfc19yb3V0aW5nLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdXBkNjQwODNfb3BzID0geworCS5jb3JlID0gJnVwZDY0MDgzX2NvcmVfb3BzLAorCS52aWRlbyA9ICZ1cGQ2NDA4M192aWRlb19vcHMsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogaTJjIGltcGxlbWVudGF0aW9uICovCkBAIC0xNzYsNiArMTk5LDcgQEAKIAkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB1cGQ2NDA4M19zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlpbnQgaTsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQpAQCAtMTg3LDE5ICsyMTEsMjMgQEAKIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cGQ2NDA4M19zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ1cGQ2NDA4M19vcHMpOwogCS8qIEluaXRpYWxseSBhc3N1bWUgdGhhdCBhIGdob3N0IHJlZHVjdGlvbiBjaGlwIGlzIHByZXNlbnQgKi8KIAlzdGF0ZS0+bW9kZSA9IDA7ICAvKiBZQ1MgbW9kZSAqLwogCXN0YXRlLT5leHRfeV9hZGMgPSAoMSA8PCA1KTsKIAltZW1jcHkoc3RhdGUtPnJlZ3MsIHVwZDY0MDgzX2luaXQsIFRPVF9SRUdTKTsKIAlmb3IgKGkgPSAwOyBpIDwgVE9UX1JFR1M7IGkrKykKLQkJdXBkNjQwODNfd3JpdGUoY2xpZW50LCBpLCBzdGF0ZS0+cmVnc1tpXSk7CisJCXVwZDY0MDgzX3dyaXRlKHNkLCBpLCBzdGF0ZS0+cmVnc1tpXSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdXBkNjQwODNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b19zdGF0ZShzZCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9pYm1jYW0uYwppbmRleCBjNzEwYmNkLi5mOGQ4NWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMKQEAgLTM3NzksMTEgKzM3NzksMTEgQEAKIAkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDB4MDMpICE9IDB4MDEpIHsKKwkJaWYgKHVzYl9lbmRwb2ludF90eXBlKGVuZHBvaW50KSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwgaWZudW0pOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDApIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBJU08gT1VUIGVuZHBvaW50ISIsIGlmbnVtKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKaW5kZXggZGEyN2E1Mi4uOTBmMGNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwpAQCAtODIzLDEyICs4MjMsMTIgQEAKIAkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDB4MDMpICE9IDB4MDEpIHsKKwkJaWYgKHVzYl9lbmRwb2ludF90eXBlKGVuZHBvaW50KSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMCkgeworCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9vdXQoZW5kcG9pbnQpKSB7CiAJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIElTTyBPVVQgZW5kcG9pbnQhIiwKIAkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCmluZGV4IDQ0NTliOGEuLmZkMTEyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXR3KHV2ZC0+ZGV2LCAweDE1YzEsCiAJCQkJY3B1X3RvX2xlMTYoSVNPQ19QQUNLRVRfU0laRSkpKTsKIAlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTVjMywgMHgwOCkpOwotCUNIRUNLX1JFVChyZXQsIHJldCA9IHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNDNmLCAweDAxKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M2YsIDB4MDEpKTsKIAogCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgU1RWX0lTT19FTkFCTEUsIDB4MDApKTsKIApAQCAtOTU1LDggKzk1NSw3IEBACiAJCWZvciAoaj0wOyBqIDwgaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHM7IGorKykgewogCQkJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFtqXS5kZXNjOwogCi0JCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYKLQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfSU4pCisJCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9vdXQoZW5kcG9pbnQpKQogCQkJCWNvbnRpbnVlOyAvKiBub3QgaW5wdXQgdGhlbiBub3QgZ29vZCAqLwogCiAJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CkBAIC05NjUsOSArOTY0LDcgQEAKIAkJCQljb250aW51ZTsgLyogMCBwa3Qgc2l6ZSBpcyBub3Qgd2hhdCB3ZSB3YW50ICovCiAJCQl9CiAKLQkJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCi0JCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCQkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCQkJdmlkZW9fZXAgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKIAkJCQkvKiBicmVhayBvdXQgb2YgdGhlIHNlYXJjaCAqLwogCQkJCWdvdG8gZ29vZF92aWRlb2VwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jCmluZGV4IDk3MTRiYWEuLjgzOWEwODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMKQEAgLTU1NiwxMiArNTU2LDEyIEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAweDAzKSAhPSAweDAxKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDApIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBJU08gT1VUIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMKaW5kZXggN2M1NzViYi4uMTQ4YTFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYwpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCiAJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiJXMoJCVwKVxuIiwgX19mdW5jX18sIGRldik7CiAKLQlpZiAoMCA8IHVzYnZpZGVvX0NsaWVudEluY01vZENvdW50KHV2ZCkpCisJaWYgKHVzYnZpZGVvX0NsaWVudEluY01vZENvdW50KHV2ZCkgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAltdXRleF9sb2NrKCZ1dmQtPmxvY2spOwogCkBAIC0xMjgxLDggKzEyODEsNyBAQAogICogSGlzdG9yeToKICAqIDIyLUphbi0yMDAwIENvcnJlY3RlZCBWSURJT0NTUElDVCB0byByZWplY3QgdW5zdXBwb3J0ZWQgc2V0dGluZ3MuCiAgKi8KLXN0YXRpYyBpbnQgdXNidmlkZW9fdjRsX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB1dmQgKnV2ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIApAQCAtMTUwNSw3ICsxNTA0LDcgQEAKIHN0YXRpYyBpbnQgdXNidmlkZW9fdjRsX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdXNidmlkZW9fdjRsX2RvX2lvY3RsKTsKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIHVzYnZpZGVvX3Y0bF9kb19pb2N0bCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMKaW5kZXggOGUyZDU4Yi4uNDYwMjU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby92aWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdmljYW0uYwpAQCAtODQ0LDggKzg0NCw3IEBACiAJICAgICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAodW5zaWduZWQpIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpOwogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKIAotCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgotCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkgeworCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKIAkJLyogd2UgZm91bmQgYSBidWxrIGluIGVuZHBvaW50ICovCiAJCWJ1bGtFbmRwb2ludCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCmluZGV4IGQxODViNTcuLjg1NjYxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC01MjMsNyArNTIzLDcgQEAKIAlzdHJsY3B5KHZjLT5jYXJkLAogCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uTW9kZWxTdHJpbmcsCiAJCXNpemVvZih2Yy0+Y2FyZCkpOwotCXN0cmxjcHkodmMtPmJ1c19pbmZvLCB1c2J2aXNpb24tPmRldi0+ZGV2LmJ1c19pZCwKKwlzdHJsY3B5KHZjLT5idXNfaW5mbywgZGV2X25hbWUoJnVzYnZpc2lvbi0+ZGV2LT5kZXYpLAogCQlzaXplb2YodmMtPmJ1c19pbmZvKSk7CiAJdmMtPnZlcnNpb24gPSBVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT047CiAJdmMtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfApAQCAtMTI3OCw3ICsxMjc4LDcgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCB1c2J2aXNpb25fZG9fdmJpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCB1c2J2aXNpb25fZG9fdmJpX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJLyogVE9ETyAqLwpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKIHN0YXRpYyBpbnQgdXNidmlzaW9uX3ZiaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHVzYnZpc2lvbl9kb192YmlfaW9jdGwpOworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgdXNidmlzaW9uX2RvX3ZiaV9pb2N0bCk7CiB9CiAKIApAQCAtMTY3OSw3ICsxNjc5LDcgQEAKIAkJaW50ZXJmYWNlID0gJmRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaWZudW1dLT5hbHRzZXR0aW5nWzBdOwogCX0KIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzFdLmRlc2M7Ci0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9CisJaWYgKHVzYl9lbmRwb2ludF90eXBlKGVuZHBvaW50KSAhPQogCSAgICBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7CiAJCWVycigiJXM6IGludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJICAgIF9fZnVuY19fLCBpZm51bSk7CkBAIC0xNjg3LDggKzE2ODcsNyBAQAogCQkgICAgX19mdW5jX18sIGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0KLQkgICAgVVNCX0RJUl9PVVQpIHsKKwlpZiAodXNiX2VuZHBvaW50X2Rpcl9vdXQoZW5kcG9pbnQpKSB7CiAJCWVycigiJXM6IGludGVyZmFjZSAlZC4gaGFzIElTTyBPVVQgZW5kcG9pbnQhIiwKIAkJICAgIF9fZnVuY19fLCBpZm51bSk7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKaW5kZXggZjE2YWFmZS4uMjIwODE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCkBAIC0zMjcsNiArMzI3LDMxIEBACiAJeyA4LCAiQXBlcnR1cmUgUHJpb3JpdHkgTW9kZSIgfSwKIH07CiAKK3N0YXRpYyBfX3MzMiB1dmNfY3RybF9nZXRfem9vbShzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwcGluZywKKwlfX3U4IHF1ZXJ5LCBjb25zdCBfX3U4ICpkYXRhKQoreworCV9fczggem9vbSA9IChfX3M4KWRhdGFbMF07CisKKwlzd2l0Y2ggKHF1ZXJ5KSB7CisJY2FzZSBHRVRfQ1VSOgorCQlyZXR1cm4gKHpvb20gPT0gMCkgPyAwIDogKHpvb20gPiAwID8gZGF0YVsyXSA6IC1kYXRhWzJdKTsKKworCWNhc2UgR0VUX01JTjoKKwljYXNlIEdFVF9NQVg6CisJY2FzZSBHRVRfUkVTOgorCWNhc2UgR0VUX0RFRjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gZGF0YVsyXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHV2Y19jdHJsX3NldF96b29tKHN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICptYXBwaW5nLAorCV9fczMyIHZhbHVlLCBfX3U4ICpkYXRhKQoreworCWRhdGFbMF0gPSB2YWx1ZSA9PSAwID8gMCA6ICh2YWx1ZSA+IDApID8gMSA6IDB4ZmY7CisJZGF0YVsyXSA9IG1pbihhYnModmFsdWUpLCAweGZmKTsKK30KKwogc3RhdGljIHN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nIHV2Y19jdHJsX21hcHBpbmdzW10gPSB7CiAJewogCQkuaWQJCT0gVjRMMl9DSURfQlJJR0hUTkVTUywKQEAgLTUzMiw2ICs1NTcsMzggQEAKIAkJLnY0bDJfdHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCiAJCS5kYXRhX3R5cGUJPSBVVkNfQ1RSTF9EQVRBX1RZUEVfQk9PTEVBTiwKIAl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1pPT01fQUJTT0xVVEUsCisJCS5uYW1lCQk9ICJab29tLCBBYnNvbHV0ZSIsCisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfWk9PTV9BQlNPTFVURV9DT05UUk9MLAorCQkuc2l6ZQkJPSAxNiwKKwkJLm9mZnNldAkJPSAwLAorCQkudjRsMl90eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLmRhdGFfdHlwZQk9IFVWQ19DVFJMX0RBVEFfVFlQRV9VTlNJR05FRCwKKwl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1pPT01fQ09OVElOVU9VUywKKwkJLm5hbWUJCT0gIlpvb20sIENvbnRpbnVvdXMiLAorCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IENUX1pPT01fUkVMQVRJVkVfQ09OVFJPTCwKKwkJLnNpemUJCT0gMCwKKwkJLm9mZnNldAkJPSAwLAorCQkudjRsMl90eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLmRhdGFfdHlwZQk9IFVWQ19DVFJMX0RBVEFfVFlQRV9TSUdORUQsCisJCS5nZXQJCT0gdXZjX2N0cmxfZ2V0X3pvb20sCisJCS5zZXQJCT0gdXZjX2N0cmxfc2V0X3pvb20sCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9QUklWQUNZLAorCQkubmFtZQkJPSAiUHJpdmFjeSIsCisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfUFJJVkFDWV9DT05UUk9MLAorCQkuc2l6ZQkJPSAxLAorCQkub2Zmc2V0CQk9IDAsCisJCS52NGwyX3R5cGUJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkuZGF0YV90eXBlCT0gVVZDX0NUUkxfREFUQV9UWVBFX0JPT0xFQU4sCisJfSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTQzLDE4ICs2MDAsMjMgQEAKIAlyZXR1cm4gY3RybC0+ZGF0YSArIGlkICogY3RybC0+aW5mby0+c2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdXZjX2dldF9iaXQoY29uc3QgX191OCAqZGF0YSwgaW50IGJpdCkKK3N0YXRpYyBpbmxpbmUgaW50IHV2Y190ZXN0X2JpdChjb25zdCBfX3U4ICpkYXRhLCBpbnQgYml0KQogewogCXJldHVybiAoZGF0YVtiaXQgPj4gM10gPj4gKGJpdCAmIDcpKSAmIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB1dmNfY2xlYXJfYml0KF9fdTggKmRhdGEsIGludCBiaXQpCit7CisJZGF0YVtiaXQgPj4gM10gJj0gfigxIDw8IChiaXQgJiA3KSk7Cit9CisKIC8qIEV4dHJhY3QgdGhlIGJpdCBzdHJpbmcgc3BlY2lmaWVkIGJ5IG1hcHBpbmctPm9mZnNldCBhbmQgbWFwcGluZy0+c2l6ZQogICogZnJvbSB0aGUgbGl0dGxlLWVuZGlhbiBkYXRhIHN0b3JlZCBhdCAnZGF0YScgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzCiAgKiBhIHNpZ25lZCAzMmJpdCBpbnRlZ2VyLiBTaWduIGV4dGVuc2lvbiB3aWxsIGJlIHBlcmZvcm1lZCBpZiB0aGUgbWFwcGluZwogICogcmVmZXJlbmNlcyBhIHNpZ25lZCBkYXRhIHR5cGUuCiAgKi8KLXN0YXRpYyBfX3MzMiB1dmNfZ2V0X2xlX3ZhbHVlKGNvbnN0IF9fdTggKmRhdGEsCi0Jc3RydWN0IHV2Y19jb250cm9sX21hcHBpbmcgKm1hcHBpbmcpCitzdGF0aWMgX19zMzIgdXZjX2dldF9sZV92YWx1ZShzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwcGluZywKKwlfX3U4IHF1ZXJ5LCBjb25zdCBfX3U4ICpkYXRhKQogewogCWludCBiaXRzID0gbWFwcGluZy0+c2l6ZTsKIAlpbnQgb2Zmc2V0ID0gbWFwcGluZy0+b2Zmc2V0OwpAQCAtNTgzLDggKzY0NSw4IEBACiAvKiBTZXQgdGhlIGJpdCBzdHJpbmcgc3BlY2lmaWVkIGJ5IG1hcHBpbmctPm9mZnNldCBhbmQgbWFwcGluZy0+c2l6ZQogICogaW4gdGhlIGxpdHRsZS1lbmRpYW4gZGF0YSBzdG9yZWQgYXQgJ2RhdGEnIHRvIHRoZSB2YWx1ZSAndmFsdWUnLgogICovCi1zdGF0aWMgdm9pZCB1dmNfc2V0X2xlX3ZhbHVlKF9fczMyIHZhbHVlLCBfX3U4ICpkYXRhLAotCXN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICptYXBwaW5nKQorc3RhdGljIHZvaWQgdXZjX3NldF9sZV92YWx1ZShzdHJ1Y3QgdXZjX2NvbnRyb2xfbWFwcGluZyAqbWFwcGluZywKKwlfX3MzMiB2YWx1ZSwgX191OCAqZGF0YSkKIHsKIAlpbnQgYml0cyA9IG1hcHBpbmctPnNpemU7CiAJaW50IG9mZnNldCA9IG1hcHBpbmctPm9mZnNldDsKQEAgLTczNiw3ICs3OTgsNyBAQAogCQkJCXZpZGVvLT5kZXYtPmludGZudW0sIGN0cmwtPmluZm8tPnNlbGVjdG9yLAogCQkJCWRhdGEsIGN0cmwtPmluZm8tPnNpemUpKSA8IDApCiAJCQlnb3RvIG91dDsKLQkJdjRsMl9jdHJsLT5kZWZhdWx0X3ZhbHVlID0gdXZjX2dldF9sZV92YWx1ZShkYXRhLCBtYXBwaW5nKTsKKwkJdjRsMl9jdHJsLT5kZWZhdWx0X3ZhbHVlID0gbWFwcGluZy0+Z2V0KG1hcHBpbmcsIEdFVF9ERUYsIGRhdGEpOwogCX0KIAogCXN3aXRjaCAobWFwcGluZy0+djRsMl90eXBlKSB7CkBAIC03NzIsMjEgKzgzNCwyMSBAQAogCQkJCXZpZGVvLT5kZXYtPmludGZudW0sIGN0cmwtPmluZm8tPnNlbGVjdG9yLAogCQkJCWRhdGEsIGN0cmwtPmluZm8tPnNpemUpKSA8IDApCiAJCQlnb3RvIG91dDsKLQkJdjRsMl9jdHJsLT5taW5pbXVtID0gdXZjX2dldF9sZV92YWx1ZShkYXRhLCBtYXBwaW5nKTsKKwkJdjRsMl9jdHJsLT5taW5pbXVtID0gbWFwcGluZy0+Z2V0KG1hcHBpbmcsIEdFVF9NSU4sIGRhdGEpOwogCX0KIAlpZiAoY3RybC0+aW5mby0+ZmxhZ3MgJiBVVkNfQ09OVFJPTF9HRVRfTUFYKSB7CiAJCWlmICgocmV0ID0gdXZjX3F1ZXJ5X2N0cmwodmlkZW8tPmRldiwgR0VUX01BWCwgY3RybC0+ZW50aXR5LT5pZCwKIAkJCQl2aWRlby0+ZGV2LT5pbnRmbnVtLCBjdHJsLT5pbmZvLT5zZWxlY3RvciwKIAkJCQlkYXRhLCBjdHJsLT5pbmZvLT5zaXplKSkgPCAwKQogCQkJZ290byBvdXQ7Ci0JCXY0bDJfY3RybC0+bWF4aW11bSA9IHV2Y19nZXRfbGVfdmFsdWUoZGF0YSwgbWFwcGluZyk7CisJCXY0bDJfY3RybC0+bWF4aW11bSA9IG1hcHBpbmctPmdldChtYXBwaW5nLCBHRVRfTUFYLCBkYXRhKTsKIAl9CiAJaWYgKGN0cmwtPmluZm8tPmZsYWdzICYgVVZDX0NPTlRST0xfR0VUX1JFUykgewogCQlpZiAoKHJldCA9IHV2Y19xdWVyeV9jdHJsKHZpZGVvLT5kZXYsIEdFVF9SRVMsIGN0cmwtPmVudGl0eS0+aWQsCiAJCQkJdmlkZW8tPmRldi0+aW50Zm51bSwgY3RybC0+aW5mby0+c2VsZWN0b3IsCiAJCQkJZGF0YSwgY3RybC0+aW5mby0+c2l6ZSkpIDwgMCkKIAkJCWdvdG8gb3V0OwotCQl2NGwyX2N0cmwtPnN0ZXAgPSB1dmNfZ2V0X2xlX3ZhbHVlKGRhdGEsIG1hcHBpbmcpOworCQl2NGwyX2N0cmwtPnN0ZXAgPSBtYXBwaW5nLT5nZXQobWFwcGluZywgR0VUX1JFUywgZGF0YSk7CiAJfQogCiAJcmV0ID0gMDsKQEAgLTkyMyw4ICs5ODUsOCBAQAogCQljdHJsLT5sb2FkZWQgPSAxOwogCX0KIAotCXhjdHJsLT52YWx1ZSA9IHV2Y19nZXRfbGVfdmFsdWUoCi0JCXV2Y19jdHJsX2RhdGEoY3RybCwgVVZDX0NUUkxfREFUQV9DVVJSRU5UKSwgbWFwcGluZyk7CisJeGN0cmwtPnZhbHVlID0gbWFwcGluZy0+Z2V0KG1hcHBpbmcsIEdFVF9DVVIsCisJCXV2Y19jdHJsX2RhdGEoY3RybCwgVVZDX0NUUkxfREFUQV9DVVJSRU5UKSk7CiAKIAlpZiAobWFwcGluZy0+djRsMl90eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUpIHsKIAkJbWVudSA9IG1hcHBpbmctPm1lbnVfaW5mbzsKQEAgLTk4MCw4ICsxMDQyLDggQEAKIAkJICAgICAgIGN0cmwtPmluZm8tPnNpemUpOwogCX0KIAotCXV2Y19zZXRfbGVfdmFsdWUodmFsdWUsCi0JCXV2Y19jdHJsX2RhdGEoY3RybCwgVVZDX0NUUkxfREFUQV9DVVJSRU5UKSwgbWFwcGluZyk7CisJbWFwcGluZy0+c2V0KG1hcHBpbmcsIHZhbHVlLAorCQl1dmNfY3RybF9kYXRhKGN0cmwsIFVWQ19DVFJMX0RBVEFfQ1VSUkVOVCkpOwogCiAJY3RybC0+ZGlydHkgPSAxOwogCWN0cmwtPm1vZGlmaWVkID0gMTsKQEAgLTEyNTcsNiArMTMxOSwxMSBAQAogCXN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICptYXA7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKKwlpZiAobWFwcGluZy0+Z2V0ID09IE5VTEwpCisJCW1hcHBpbmctPmdldCA9IHV2Y19nZXRfbGVfdmFsdWU7CisJaWYgKG1hcHBpbmctPnNldCA9PSBOVUxMKQorCQltYXBwaW5nLT5zZXQgPSB1dmNfc2V0X2xlX3ZhbHVlOworCiAJaWYgKG1hcHBpbmctPmlkICYgflY0TDJfQ1RSTF9JRF9NQVNLKSB7CiAJCXV2Y190cmFjZShVVkNfVFJBQ0VfQ09OVFJPTCwgIkNhbid0IGFkZCBtYXBwaW5nICclcycgd2l0aCAiCiAJCQkiaW52YWxpZCBjb250cm9sIGlkIDB4JTA4eFxuIiwgbWFwcGluZy0+bmFtZSwKQEAgLTEzMDYsNiArMTM3Myw1MSBAQAogfQogCiAvKgorICogUHJ1bmUgYW4gZW50aXR5IG9mIGl0cyBib2d1cyBjb250cm9scy4gVGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgcHJvY2Vzc2luZworICogdW5pdCBhdXRvIGNvbnRyb2xzIGZvciB3aGljaCBubyBjb3JyZXNwb25kaW5nIG1hbnVhbCBjb250cm9sIGlzIGF2YWlsYWJsZS4KKyAqIFN1Y2ggYXV0byBjb250cm9scyBtYWtlIGxpdHRsZSBzZW5zZSBpZiBhbnksIGFuZCBhcmUga25vd24gdG8gY3Jhc2ggYXQKKyAqIGxlYXN0IHRoZSBTaUdtYSBNaWNybyB3ZWJjYW0uCisgKi8KK3N0YXRpYyB2b2lkCit1dmNfY3RybF9wcnVuZV9lbnRpdHkoc3RydWN0IHV2Y19lbnRpdHkgKmVudGl0eSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdTggaWR4X21hbnVhbDsKKwkJdTggaWR4X2F1dG87CisJfSBibGFja2xpc3RbXSA9IHsKKwkJeyAyLCAxMSB9LCAvKiBIdWUgKi8KKwkJeyA2LCAxMiB9LCAvKiBXaGl0ZSBCYWxhbmNlIFRlbXBlcmF0dXJlICovCisJCXsgNywgMTMgfSwgLyogV2hpdGUgQmFsYW5jZSBDb21wb25lbnQgKi8KKwl9OworCisJdTggKmNvbnRyb2xzOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKFVWQ19FTlRJVFlfVFlQRShlbnRpdHkpICE9IFZDX1BST0NFU1NJTkdfVU5JVCkKKwkJcmV0dXJuOworCisJY29udHJvbHMgPSBlbnRpdHktPnByb2Nlc3NpbmcuYm1Db250cm9sczsKKwlzaXplID0gZW50aXR5LT5wcm9jZXNzaW5nLmJDb250cm9sU2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJsYWNrbGlzdCk7ICsraSkgeworCQlpZiAoYmxhY2tsaXN0W2ldLmlkeF9hdXRvID49IDggKiBzaXplIHx8CisJCSAgICBibGFja2xpc3RbaV0uaWR4X21hbnVhbCA+PSA4ICogc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghdXZjX3Rlc3RfYml0KGNvbnRyb2xzLCBibGFja2xpc3RbaV0uaWR4X2F1dG8pIHx8CisJCSAgICAgdXZjX3Rlc3RfYml0KGNvbnRyb2xzLCBibGFja2xpc3RbaV0uaWR4X21hbnVhbCkpCisJCQljb250aW51ZTsKKworCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0NPTlRST0wsICJBdXRvIGNvbnRyb2wgJXUvJXUgaGFzIG5vICIKKwkJCSJtYXRjaGluZyBtYW51YWwgY29udHJvbCwgcmVtb3ZpbmcgaXQuXG4iLCBlbnRpdHktPmlkLAorCQkJYmxhY2tsaXN0W2ldLmlkeF9hdXRvKTsKKworCQl1dmNfY2xlYXJfYml0KGNvbnRyb2xzLCBibGFja2xpc3RbaV0uaWR4X2F1dG8pOworCX0KK30KKworLyoKICAqIEluaXRpYWxpemUgZGV2aWNlIGNvbnRyb2xzLgogICovCiBpbnQgdXZjX2N0cmxfaW5pdF9kZXZpY2Uoc3RydWN0IHV2Y19kZXZpY2UgKmRldikKQEAgLTEzMzEsNiArMTQ0Myw5IEBACiAJCQliQ29udHJvbFNpemUgPSBlbnRpdHktPmNhbWVyYS5iQ29udHJvbFNpemU7CiAJCX0KIAorCQlpZiAoZGV2LT5xdWlya3MgJiBVVkNfUVVJUktfUFJVTkVfQ09OVFJPTFMpCisJCQl1dmNfY3RybF9wcnVuZV9lbnRpdHkoZW50aXR5KTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgYkNvbnRyb2xTaXplOyArK2kpCiAJCQluY29udHJvbHMgKz0gaHdlaWdodDgoYm1Db250cm9sc1tpXSk7CiAKQEAgLTEzNDUsNyArMTQ2MCw3IEBACiAKIAkJY3RybCA9IGVudGl0eS0+Y29udHJvbHM7CiAJCWZvciAoaSA9IDA7IGkgPCBiQ29udHJvbFNpemUgKiA4OyArK2kpIHsKLQkJCWlmICh1dmNfZ2V0X2JpdChibUNvbnRyb2xzLCBpKSA9PSAwKQorCQkJaWYgKHV2Y190ZXN0X2JpdChibUNvbnRyb2xzLCBpKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCiAJCQljdHJsLT5lbnRpdHkgPSBlbnRpdHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKaW5kZXggZDdhZDA2MC4uODlkOGJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwpAQCAtMTIsOCArMTIsOCBAQAogICovCiAKIC8qCi0gKiBUaGlzIGRyaXZlciBhaW1zIHRvIHN1cHBvcnQgdmlkZW8gaW5wdXQgZGV2aWNlcyBjb21wbGlhbnQgd2l0aCB0aGUgJ1VTQgotICogVmlkZW8gQ2xhc3MnIHNwZWNpZmljYXRpb24uCisgKiBUaGlzIGRyaXZlciBhaW1zIHRvIHN1cHBvcnQgdmlkZW8gaW5wdXQgYW5kIG91cHV0IGRldmljZXMgY29tcGxpYW50IHdpdGggdGhlCisgKiAnVVNCIFZpZGVvIENsYXNzJyBzcGVjaWZpY2F0aW9uLgogICoKICAqIFRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBkZXByZWNhdGVkIHY0bDEgaW50ZXJmYWNlLiBJdCBpbXBsZW1lbnRzIHRoZQogICogbW1hcCBjYXB0dXJlIG1ldGhvZCBvbmx5LCBhbmQgZG9lc24ndCBkbyBhbnkgaW1hZ2UgZm9ybWF0IGNvbnZlcnNpb24gaW4KQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCkBAIC00Myw2ICs0NCw3IEBACiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkidjAuMS4wIgogI2VuZGlmCiAKK3Vuc2lnbmVkIGludCB1dmNfbm9fZHJvcF9wYXJhbTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdXZjX3F1aXJrc19wYXJhbTsKIHVuc2lnbmVkIGludCB1dmNfdHJhY2VfcGFyYW07CiAKQEAgLTI4OCw4ICsyOTAsMTAgQEAKIAlzdHJ1Y3QgdXZjX2Zvcm1hdF9kZXNjICpmbXRkZXNjOwogCXN0cnVjdCB1dmNfZnJhbWUgKmZyYW1lOwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0ID0gYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgKl9idWZmZXI7CiAJdW5zaWduZWQgaW50IGludGVydmFsOwogCXVuc2lnbmVkIGludCBpLCBuOworCWludCBfYnVmbGVuOwogCV9fdTggZnR5cGU7CiAKIAlmb3JtYXQtPnR5cGUgPSBidWZmZXJbMl07CkBAIC00MTAsMTIgKzQxNCwyMCBAQAogCWJ1ZmxlbiAtPSBidWZmZXJbMF07CiAJYnVmZmVyICs9IGJ1ZmZlclswXTsKIAorCS8qIENvdW50IHRoZSBudW1iZXIgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gdGVzdCB0aGUgYkZyYW1lSW5kZXgKKwkgKiBmaWVsZCB3aGVuIHBhcnNpbmcgdGhlIGRlc2NyaXB0b3JzLiBXZSBjYW4ndCByZWx5IG9uIHRoZQorCSAqIGJOdW1GcmFtZURlc2NyaXB0b3JzIGZpZWxkIGFzIHNvbWUgY2FtZXJhcyBkb24ndCBpbml0aWFsaXplIGl0CisJICogcHJvcGVybHkuCisJICovCisJZm9yIChfYnVmbGVuID0gYnVmbGVuLCBfYnVmZmVyID0gYnVmZmVyOworCSAgICAgX2J1ZmxlbiA+IDIgJiYgX2J1ZmZlclsyXSA9PSBmdHlwZTsKKwkgICAgIF9idWZsZW4gLT0gX2J1ZmZlclswXSwgX2J1ZmZlciArPSBfYnVmZmVyWzBdKQorCQlmb3JtYXQtPm5mcmFtZXMrKzsKKwogCS8qIFBhcnNlIHRoZSBmcmFtZSBkZXNjcmlwdG9ycy4gT25seSB1bmNvbXByZXNzZWQsIE1KUEVHIGFuZCBmcmFtZQogCSAqIGJhc2VkIGZvcm1hdHMgaGF2ZSBmcmFtZSBkZXNjcmlwdG9ycy4KIAkgKi8KIAl3aGlsZSAoYnVmbGVuID4gMiAmJiBidWZmZXJbMl0gPT0gZnR5cGUpIHsKLQkJZnJhbWUgPSAmZm9ybWF0LT5mcmFtZVtmb3JtYXQtPm5mcmFtZXNdOwotCiAJCWlmIChmdHlwZSAhPSBWU19GUkFNRV9GUkFNRV9CQVNFRCkKIAkJCW4gPSBidWZsZW4gPiAyNSA/IGJ1ZmZlclsyNV0gOiAwOwogCQllbHNlCkBAIC00MzAsMjIgKzQ0MiwzMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAorCQlpZiAoYnVmZmVyWzNdIC0gMSA+PSBmb3JtYXQtPm5mcmFtZXMpIHsKKwkJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJkZXZpY2UgJWQgdmlkZW9zdHJlYW1pbmciCisJCQkgICAgICAgImludGVyZmFjZSAlZCBmcmFtZSBpbmRleCAldSBvdXQgb2YgcmFuZ2VcbiIsCisJCQkgICAgICAgZGV2LT51ZGV2LT5kZXZudW0sIGFsdHMtPmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJCSAgICAgICBidWZmZXJbM10pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmcmFtZSA9ICZmb3JtYXQtPmZyYW1lW2J1ZmZlclszXSAtIDFdOworCiAJCWZyYW1lLT5iRnJhbWVJbmRleCA9IGJ1ZmZlclszXTsKIAkJZnJhbWUtPmJtQ2FwYWJpbGl0aWVzID0gYnVmZmVyWzRdOwotCQlmcmFtZS0+d1dpZHRoID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmZmVyWzVdKTsKLQkJZnJhbWUtPndIZWlnaHQgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZmZXJbN10pOwotCQlmcmFtZS0+ZHdNaW5CaXRSYXRlID0gbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmZmVyWzldKTsKLQkJZnJhbWUtPmR3TWF4Qml0UmF0ZSA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopJmJ1ZmZlclsxM10pOworCQlmcmFtZS0+d1dpZHRoID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZidWZmZXJbNV0pOworCQlmcmFtZS0+d0hlaWdodCA9IGdldF91bmFsaWduZWRfbGUxNigmYnVmZmVyWzddKTsKKwkJZnJhbWUtPmR3TWluQml0UmF0ZSA9IGdldF91bmFsaWduZWRfbGUzMigmYnVmZmVyWzldKTsKKwkJZnJhbWUtPmR3TWF4Qml0UmF0ZSA9IGdldF91bmFsaWduZWRfbGUzMigmYnVmZmVyWzEzXSk7CiAJCWlmIChmdHlwZSAhPSBWU19GUkFNRV9GUkFNRV9CQVNFRCkgewogCQkJZnJhbWUtPmR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemUgPQotCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopJmJ1ZmZlclsxN10pOworCQkJCWdldF91bmFsaWduZWRfbGUzMigmYnVmZmVyWzE3XSk7CiAJCQlmcmFtZS0+ZHdEZWZhdWx0RnJhbWVJbnRlcnZhbCA9Ci0JCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmZmVyWzIxXSk7CisJCQkJZ2V0X3VuYWxpZ25lZF9sZTMyKCZidWZmZXJbMjFdKTsKIAkJCWZyYW1lLT5iRnJhbWVJbnRlcnZhbFR5cGUgPSBidWZmZXJbMjVdOwogCQl9IGVsc2UgewogCQkJZnJhbWUtPmR3TWF4VmlkZW9GcmFtZUJ1ZmZlclNpemUgPSAwOwogCQkJZnJhbWUtPmR3RGVmYXVsdEZyYW1lSW50ZXJ2YWwgPQotCQkJCWxlMzJfdG9fY3B1cCgoX19sZTMyICopJmJ1ZmZlclsxN10pOworCQkJCWdldF91bmFsaWduZWRfbGUzMigmYnVmZmVyWzE3XSk7CiAJCQlmcmFtZS0+YkZyYW1lSW50ZXJ2YWxUeXBlID0gYnVmZmVyWzIxXTsKIAkJfQogCQlmcmFtZS0+ZHdGcmFtZUludGVydmFsID0gKmludGVydmFsczsKQEAgLTQ2OCw3ICs0OTAsNyBAQAogCQkgKiBzb21lIG90aGVyIGRpdmlzaW9ucyBieSB6ZXJvIHdoaWNoIGNvdWxkIGhhcHBlbi4KIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCWludGVydmFsID0gbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmZmVyWzI2KzQqaV0pOworCQkJaW50ZXJ2YWwgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmJ1ZmZlclsyNis0KmldKTsKIAkJCSooKmludGVydmFscykrKyA9IGludGVydmFsID8gaW50ZXJ2YWwgOiAxOwogCQl9CiAKQEAgLTQ4Niw3ICs1MDgsNiBAQAogCQkJMTAwMDAwMDAvZnJhbWUtPmR3RGVmYXVsdEZyYW1lSW50ZXJ2YWwsCiAJCQkoMTAwMDAwMDAwL2ZyYW1lLT5kd0RlZmF1bHRGcmFtZUludGVydmFsKSUxMCk7CiAKLQkJZm9ybWF0LT5uZnJhbWVzKys7CiAJCWJ1ZmxlbiAtPSBidWZmZXJbMF07CiAJCWJ1ZmZlciArPSBidWZmZXJbMF07CiAJfQpAQCAtNTg4LDQ2ICs2MDksNTUgQEAKIAl9CiAKIAkvKiBQYXJzZSB0aGUgaGVhZGVyIGRlc2NyaXB0b3IuICovCi0JaWYgKGJ1ZmZlclsyXSA9PSBWU19PVVRQVVRfSEVBREVSKSB7Ci0JCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJkZXZpY2UgJWQgdmlkZW9zdHJlYW1pbmcgaW50ZXJmYWNlICIKLQkJCSIlZCBPVVRQVVQgSEVBREVSIGRlc2NyaXB0b3IgaXMgbm90IHN1cHBvcnRlZC5cbiIsCi0JCQlkZXYtPnVkZXYtPmRldm51bSwgYWx0cy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKLQkJZ290byBlcnJvcjsKLQl9IGVsc2UgaWYgKGJ1ZmZlclsyXSA9PSBWU19JTlBVVF9IRUFERVIpIHsKLQkJcCA9IGJ1ZmxlbiA+PSA1ID8gYnVmZmVyWzNdIDogMDsKLQkJbiA9IGJ1ZmxlbiA+PSAxMiA/IGJ1ZmZlclsxMl0gOiAwOworCXN3aXRjaCAoYnVmZmVyWzJdKSB7CisJY2FzZSBWU19PVVRQVVRfSEVBREVSOgorCQlzdHJlYW1pbmctPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwkJc2l6ZSA9IDk7CisJCWJyZWFrOwogCi0JCWlmIChidWZsZW4gPCAxMyArIHAqbiB8fCBidWZmZXJbMl0gIT0gVlNfSU5QVVRfSEVBREVSKSB7Ci0JCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiZGV2aWNlICVkIHZpZGVvc3RyZWFtaW5nICIKLQkJCQkiaW50ZXJmYWNlICVkIElOUFVUIEhFQURFUiBkZXNjcmlwdG9yIGlzICIKLQkJCQkiaW52YWxpZC5cbiIsIGRldi0+dWRldi0+ZGV2bnVtLAotCQkJCWFsdHMtPmRlc2MuYkludGVyZmFjZU51bWJlcik7Ci0JCQlnb3RvIGVycm9yOwotCQl9CisJY2FzZSBWU19JTlBVVF9IRUFERVI6CisJCXN0cmVhbWluZy0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJc2l6ZSA9IDEzOworCQlicmVhazsKIAotCQlzdHJlYW1pbmctPmhlYWRlci5iTnVtRm9ybWF0cyA9IHA7Ci0JCXN0cmVhbWluZy0+aGVhZGVyLmJFbmRwb2ludEFkZHJlc3MgPSBidWZmZXJbNl07Ci0JCXN0cmVhbWluZy0+aGVhZGVyLmJtSW5mbyA9IGJ1ZmZlcls3XTsKLQkJc3RyZWFtaW5nLT5oZWFkZXIuYlRlcm1pbmFsTGluayA9IGJ1ZmZlcls4XTsKLQkJc3RyZWFtaW5nLT5oZWFkZXIuYlN0aWxsQ2FwdHVyZU1ldGhvZCA9IGJ1ZmZlcls5XTsKLQkJc3RyZWFtaW5nLT5oZWFkZXIuYlRyaWdnZXJTdXBwb3J0ID0gYnVmZmVyWzEwXTsKLQkJc3RyZWFtaW5nLT5oZWFkZXIuYlRyaWdnZXJVc2FnZSA9IGJ1ZmZlclsxMV07Ci0JCXN0cmVhbWluZy0+aGVhZGVyLmJDb250cm9sU2l6ZSA9IG47Ci0KLQkJc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMgPSBrbWFsbG9jKHAqbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzdHJlYW1pbmctPmhlYWRlci5ibWFDb250cm9scyA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCW1lbWNweShzdHJlYW1pbmctPmhlYWRlci5ibWFDb250cm9scywgJmJ1ZmZlclsxM10sIHAqbik7Ci0JfSBlbHNlIHsKKwlkZWZhdWx0OgogCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0RFU0NSLCAiZGV2aWNlICVkIHZpZGVvc3RyZWFtaW5nIGludGVyZmFjZSAiCiAJCQkiJWQgSEVBREVSIGRlc2NyaXB0b3Igbm90IGZvdW5kLlxuIiwgZGV2LT51ZGV2LT5kZXZudW0sCiAJCQlhbHRzLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQlnb3RvIGVycm9yOwogCX0KIAorCXAgPSBidWZsZW4gPj0gNCA/IGJ1ZmZlclszXSA6IDA7CisJbiA9IGJ1ZmxlbiA+PSBzaXplID8gYnVmZmVyW3NpemUtMV0gOiAwOworCisJaWYgKGJ1ZmxlbiA8IHNpemUgKyBwKm4pIHsKKwkJdXZjX3RyYWNlKFVWQ19UUkFDRV9ERVNDUiwgImRldmljZSAlZCB2aWRlb3N0cmVhbWluZyAiCisJCQkiaW50ZXJmYWNlICVkIEhFQURFUiBkZXNjcmlwdG9yIGlzIGludmFsaWQuXG4iLAorCQkJZGV2LT51ZGV2LT5kZXZudW0sIGFsdHMtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RyZWFtaW5nLT5oZWFkZXIuYk51bUZvcm1hdHMgPSBwOworCXN0cmVhbWluZy0+aGVhZGVyLmJFbmRwb2ludEFkZHJlc3MgPSBidWZmZXJbNl07CisJaWYgKGJ1ZmZlclsyXSA9PSBWU19JTlBVVF9IRUFERVIpIHsKKwkJc3RyZWFtaW5nLT5oZWFkZXIuYm1JbmZvID0gYnVmZmVyWzddOworCQlzdHJlYW1pbmctPmhlYWRlci5iVGVybWluYWxMaW5rID0gYnVmZmVyWzhdOworCQlzdHJlYW1pbmctPmhlYWRlci5iU3RpbGxDYXB0dXJlTWV0aG9kID0gYnVmZmVyWzldOworCQlzdHJlYW1pbmctPmhlYWRlci5iVHJpZ2dlclN1cHBvcnQgPSBidWZmZXJbMTBdOworCQlzdHJlYW1pbmctPmhlYWRlci5iVHJpZ2dlclVzYWdlID0gYnVmZmVyWzExXTsKKwl9IGVsc2UgeworCQlzdHJlYW1pbmctPmhlYWRlci5iVGVybWluYWxMaW5rID0gYnVmZmVyWzddOworCX0KKwlzdHJlYW1pbmctPmhlYWRlci5iQ29udHJvbFNpemUgPSBuOworCisJc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMgPSBrbWFsbG9jKHAqbiwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0cmVhbWluZy0+aGVhZGVyLmJtYUNvbnRyb2xzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltZW1jcHkoc3RyZWFtaW5nLT5oZWFkZXIuYm1hQ29udHJvbHMsICZidWZmZXJbc2l6ZV0sIHAqbik7CisKIAlidWZsZW4gLT0gYnVmZmVyWzBdOwogCWJ1ZmZlciArPSBidWZmZXJbMF07CiAKQEAgLTgxMyw4ICs4NDMsNyBAQAogCQl1bml0LT50eXBlID0gVkNfRVhURU5TSU9OX1VOSVQ7CiAJCW1lbWNweSh1bml0LT5leHRlbnNpb24uZ3VpZEV4dGVuc2lvbkNvZGUsICZidWZmZXJbNF0sIDE2KTsKIAkJdW5pdC0+ZXh0ZW5zaW9uLmJOdW1Db250cm9scyA9IGJ1ZmZlclsyMF07Ci0JCXVuaXQtPmV4dGVuc2lvbi5iTnJJblBpbnMgPQotCQkJbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmZmVyWzIxXSk7CisJCXVuaXQtPmV4dGVuc2lvbi5iTnJJblBpbnMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlclsyMV0pOwogCQl1bml0LT5leHRlbnNpb24uYmFTb3VyY2VJRCA9IChfX3U4ICopdW5pdCArIHNpemVvZiAqdW5pdDsKIAkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5iYVNvdXJjZUlELCAmYnVmZmVyWzIyXSwgcCk7CiAJCXVuaXQtPmV4dGVuc2lvbi5iQ29udHJvbFNpemUgPSBidWZmZXJbMjIrcF07CkBAIC04NTgsOCArODg3LDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJZGV2LT51dmNfdmVyc2lvbiA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmJ1ZmZlclszXSk7Ci0JCWRldi0+Y2xvY2tfZnJlcXVlbmN5ID0gbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmZmVyWzddKTsKKwkJZGV2LT51dmNfdmVyc2lvbiA9IGdldF91bmFsaWduZWRfbGUxNigmYnVmZmVyWzNdKTsKKwkJZGV2LT5jbG9ja19mcmVxdWVuY3kgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmJ1ZmZlcls3XSk7CiAKIAkJLyogUGFyc2UgYWxsIFVTQiBWaWRlbyBTdHJlYW1pbmcgaW50ZXJmYWNlcy4gKi8KIAkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewpAQCAtODg2LDcgKzkxNSw3IEBACiAJCS8qIE1ha2Ugc3VyZSB0aGUgdGVybWluYWwgdHlwZSBNU0IgaXMgbm90IG51bGwsIG90aGVyd2lzZSBpdAogCQkgKiBjb3VsZCBiZSBjb25mdXNlZCB3aXRoIGEgdW5pdC4KIAkJICovCi0JCXR5cGUgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZmZXJbNF0pOworCQl0eXBlID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZidWZmZXJbNF0pOwogCQlpZiAoKHR5cGUgJiAweGZmMDApID09IDApIHsKIAkJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJkZXZpY2UgJWQgdmlkZW9jb250cm9sICIKIAkJCQkiaW50ZXJmYWNlICVkIElOUFVUX1RFUk1JTkFMICVkIGhhcyBpbnZhbGlkICIKQEAgLTkyOCwxMSArOTU3LDExIEBACiAJCQl0ZXJtLT5jYW1lcmEuYkNvbnRyb2xTaXplID0gbjsKIAkJCXRlcm0tPmNhbWVyYS5ibUNvbnRyb2xzID0gKF9fdTggKil0ZXJtICsgc2l6ZW9mICp0ZXJtOwogCQkJdGVybS0+Y2FtZXJhLndPYmplY3RpdmVGb2NhbExlbmd0aE1pbiA9Ci0JCQkJbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmZmVyWzhdKTsKKwkJCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlcls4XSk7CiAJCQl0ZXJtLT5jYW1lcmEud09iamVjdGl2ZUZvY2FsTGVuZ3RoTWF4ID0KLQkJCQlsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZmZXJbMTBdKTsKKwkJCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlclsxMF0pOwogCQkJdGVybS0+Y2FtZXJhLndPY3VsYXJGb2NhbExlbmd0aCA9Ci0JCQkJbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmZmVyWzEyXSk7CisJCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZidWZmZXJbMTJdKTsKIAkJCW1lbWNweSh0ZXJtLT5jYW1lcmEuYm1Db250cm9scywgJmJ1ZmZlclsxNV0sIG4pOwogCQl9IGVsc2UgaWYgKFVWQ19FTlRJVFlfVFlQRSh0ZXJtKSA9PSBJVFRfTUVESUFfVFJBTlNQT1JUX0lOUFVUKSB7CiAJCQl0ZXJtLT5tZWRpYS5iQ29udHJvbFNpemUgPSBuOwpAQCAtOTY4LDcgKzk5Nyw3IEBACiAJCS8qIE1ha2Ugc3VyZSB0aGUgdGVybWluYWwgdHlwZSBNU0IgaXMgbm90IG51bGwsIG90aGVyd2lzZSBpdAogCQkgKiBjb3VsZCBiZSBjb25mdXNlZCB3aXRoIGEgdW5pdC4KIAkJICovCi0JCXR5cGUgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZmZXJbNF0pOworCQl0eXBlID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZidWZmZXJbNF0pOwogCQlpZiAoKHR5cGUgJiAweGZmMDApID09IDApIHsKIAkJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJkZXZpY2UgJWQgdmlkZW9jb250cm9sICIKIAkJCQkiaW50ZXJmYWNlICVkIE9VVFBVVF9URVJNSU5BTCAlZCBoYXMgaW52YWxpZCAiCkBAIC0xMDQyLDcgKzEwNzEsNyBAQAogCQl1bml0LT50eXBlID0gYnVmZmVyWzJdOwogCQl1bml0LT5wcm9jZXNzaW5nLmJTb3VyY2VJRCA9IGJ1ZmZlcls0XTsKIAkJdW5pdC0+cHJvY2Vzc2luZy53TWF4TXVsdGlwbGllciA9Ci0JCQlsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZmZXJbNV0pOworCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZidWZmZXJbNV0pOwogCQl1bml0LT5wcm9jZXNzaW5nLmJDb250cm9sU2l6ZSA9IGJ1ZmZlcls3XTsKIAkJdW5pdC0+cHJvY2Vzc2luZy5ibUNvbnRyb2xzID0gKF9fdTggKil1bml0ICsgc2l6ZW9mICp1bml0OwogCQltZW1jcHkodW5pdC0+cHJvY2Vzc2luZy5ibUNvbnRyb2xzLCAmYnVmZmVyWzhdLCBuKTsKQEAgLTEwNzcsOCArMTEwNiw3IEBACiAJCXVuaXQtPnR5cGUgPSBidWZmZXJbMl07CiAJCW1lbWNweSh1bml0LT5leHRlbnNpb24uZ3VpZEV4dGVuc2lvbkNvZGUsICZidWZmZXJbNF0sIDE2KTsKIAkJdW5pdC0+ZXh0ZW5zaW9uLmJOdW1Db250cm9scyA9IGJ1ZmZlclsyMF07Ci0JCXVuaXQtPmV4dGVuc2lvbi5iTnJJblBpbnMgPQotCQkJbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmZmVyWzIxXSk7CisJCXVuaXQtPmV4dGVuc2lvbi5iTnJJblBpbnMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZmZlclsyMV0pOwogCQl1bml0LT5leHRlbnNpb24uYmFTb3VyY2VJRCA9IChfX3U4ICopdW5pdCArIHNpemVvZiAqdW5pdDsKIAkJbWVtY3B5KHVuaXQtPmV4dGVuc2lvbi5iYVNvdXJjZUlELCAmYnVmZmVyWzIyXSwgcCk7CiAJCXVuaXQtPmV4dGVuc2lvbi5iQ29udHJvbFNpemUgPSBidWZmZXJbMjIrcF07CkBAIC0xMTI4LDggKzExNTYsMTMgQEAKIAkJYnVmZmVyICs9IGJ1ZmZlclswXTsKIAl9CiAKLQkvKiBDaGVjayBpZiB0aGUgb3B0aW9uYWwgc3RhdHVzIGVuZHBvaW50IGlzIHByZXNlbnQuICovCi0JaWYgKGFsdHMtPmRlc2MuYk51bUVuZHBvaW50cyA9PSAxKSB7CisJLyogQ2hlY2sgaWYgdGhlIG9wdGlvbmFsIHN0YXR1cyBlbmRwb2ludCBpcyBwcmVzZW50LiBCdWlsdC1pbiBpU2lnaHQKKwkgKiB3ZWJjYW1zIGhhdmUgYW4gaW50ZXJydXB0IGVuZHBvaW50IGJ1dCBzcGl0IHByb3ByaWV0YXJ5IGRhdGEgdGhhdAorCSAqIGRvbid0IGNvbmZvcm0gdG8gdGhlIFVWQyBzdGF0dXMgZW5kcG9pbnQgbWVzc2FnZXMuIERvbid0IHRyeSB0bworCSAqIGhhbmRsZSB0aGUgaW50ZXJydXB0IGVuZHBvaW50IGZvciB0aG9zZSBjYW1lcmFzLgorCSAqLworCWlmIChhbHRzLT5kZXNjLmJOdW1FbmRwb2ludHMgPT0gMSAmJgorCSAgICAhKGRldi0+cXVpcmtzICYgVVZDX1FVSVJLX0JVSUxUSU5fSVNJR0hUKSkgewogCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwID0gJmFsdHMtPmVuZHBvaW50WzBdOwogCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MgPSAmZXAtPmRlc2M7CiAKQEAgLTEyMzQsNiArMTI2NywyNiBAQAogCQlsaXN0X2FkZF90YWlsKCZlbnRpdHktPmNoYWluLCAmdmlkZW8tPml0ZXJtcyk7CiAJCWJyZWFrOwogCisJY2FzZSBUVF9TVFJFQU1JTkc6CisJCWlmICh1dmNfdHJhY2VfcGFyYW0gJiBVVkNfVFJBQ0VfUFJPQkUpCisJCQlwcmludGsoIiA8LSBJVCAlZFxuIiwgZW50aXR5LT5pZCk7CisKKwkJaWYgKCFVVkNfRU5USVRZX0lTX0lURVJNKGVudGl0eSkpIHsKKwkJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJVbnN1cHBvcnRlZCBpbnB1dCAiCisJCQkJInRlcm1pbmFsICV1LlxuIiwgZW50aXR5LT5pZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAodmlkZW8tPnN0ZXJtICE9IE5VTEwpIHsKKwkJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJGb3VuZCBtdWx0aXBsZSBzdHJlYW1pbmcgIgorCQkJCSJlbnRpdGllcyBpbiBjaGFpbi5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmZW50aXR5LT5jaGFpbiwgJnZpZGVvLT5pdGVybXMpOworCQl2aWRlby0+c3Rlcm0gPSBlbnRpdHk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJdXZjX3RyYWNlKFVWQ19UUkFDRV9ERVNDUiwgIlVuc3VwcG9ydGVkIGVudGl0eSB0eXBlICIKIAkJCSIweCUwNHggZm91bmQgaW4gY2hhaW4uXG4iLCBVVkNfRU5USVRZX1RZUEUoZW50aXR5KSk7CkBAIC0xMzQ0LDYgKzEzOTcsMTAgQEAKIAogCWVudGl0eSA9IHZpZGVvLT5vdGVybTsKIAl1dmNfdHJhY2UoVVZDX1RSQUNFX1BST0JFLCAiU2Nhbm5pbmcgVVZDIGNoYWluOiBPVCAlZCIsIGVudGl0eS0+aWQpOworCisJaWYgKFVWQ19FTlRJVFlfVFlQRShlbnRpdHkpID09IFRUX1NUUkVBTUlORykKKwkJdmlkZW8tPnN0ZXJtID0gZW50aXR5OworCiAJaWQgPSBlbnRpdHktPm91dHB1dC5iU291cmNlSUQ7CiAJd2hpbGUgKGlkICE9IDApIHsKIAkJcHJldiA9IGVudGl0eTsKQEAgLTEzNzIsOCArMTQyOSwxMSBAQAogCQkJcmV0dXJuIGlkOwogCX0KIAotCS8qIEluaXRpYWxpemUgdGhlIHZpZGVvIGJ1ZmZlcnMgcXVldWUuICovCi0JdXZjX3F1ZXVlX2luaXQoJnZpZGVvLT5xdWV1ZSk7CisJaWYgKHZpZGVvLT5zdGVybSA9PSBOVUxMKSB7CisJCXV2Y190cmFjZShVVkNfVFJBQ0VfREVTQ1IsICJObyBzdHJlYW1pbmcgZW50aXR5IGZvdW5kIGluICIKKwkJCSJjaGFpbi5cbiIpOworCQlyZXR1cm4gLTE7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzg0LDcgKzE0NDQsOCBAQAogICogVGhlIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgYSBzaW5nbGUgdmlkZW8gZGV2aWNlIHBlciBjb250cm9sIGludGVyZmFjZQogICogb25seS4gVGhlIHRlcm1pbmFsIGFuZCB1bml0cyBtdXN0IG1hdGNoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgogICoKLSAqIElUVF9DQU1FUkEgLT4gVkNfUFJPQ0VTU0lOR19VTklUIC0+IFZDX0VYVEVOU0lPTl9VTklUezAsbn0gLT4gVFRfU1RSRUFNSU5HCisgKiBJVFRfKiAtPiBWQ19QUk9DRVNTSU5HX1VOSVQgLT4gVkNfRVhURU5TSU9OX1VOSVR7MCxufSAtPiBUVF9TVFJFQU1JTkcKKyAqIFRUX1NUUkVBTUlORyAtPiBWQ19QUk9DRVNTSU5HX1VOSVQgLT4gVkNfRVhURU5TSU9OX1VOSVR7MCxufSAtPiBPVFRfKgogICoKICAqIFRoZSBFeHRlbnNpb24gVW5pdHMsIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIHNpbmdsZSBpbnB1dCBwaW4uIFRoZQogICogUHJvY2Vzc2luZyBVbml0IGFuZCBFeHRlbnNpb24gVW5pdHMgY2FuIGJlIGluIGFueSBvcmRlci4gQWRkaXRpb25hbApAQCAtMTQwMSw3ICsxNDYyLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlcm0sICZkZXYtPmVudGl0aWVzLCBsaXN0KSB7CiAJCXN0cnVjdCB1dmNfc3RyZWFtaW5nICpzdHJlYW1pbmc7CiAKLQkJaWYgKFVWQ19FTlRJVFlfVFlQRSh0ZXJtKSAhPSBUVF9TVFJFQU1JTkcpCisJCWlmICghVVZDX0VOVElUWV9JU19URVJNKHRlcm0pIHx8ICFVVkNfRU5USVRZX0lTX09URVJNKHRlcm0pKQogCQkJY29udGludWU7CiAKIAkJbWVtc2V0KCZkZXYtPnZpZGVvLCAwLCBzaXplb2YgZGV2LT52aWRlbyk7CkBAIC0xNDE0LDcgKzE0NzUsOCBAQAogCQkJY29udGludWU7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHJlYW1pbmcsICZkZXYtPnN0cmVhbWluZywgbGlzdCkgewotCQkJaWYgKHN0cmVhbWluZy0+aGVhZGVyLmJUZXJtaW5hbExpbmsgPT0gdGVybS0+aWQpIHsKKwkJCWlmIChzdHJlYW1pbmctPmhlYWRlci5iVGVybWluYWxMaW5rID09CisJCQkgICAgZGV2LT52aWRlby5zdGVybS0+aWQpIHsKIAkJCQlkZXYtPnZpZGVvLnN0cmVhbWluZyA9IHN0cmVhbWluZzsKIAkJCQlmb3VuZCA9IDE7CiAJCQkJYnJlYWs7CkBAIC0xNDQwLDYgKzE1MDIsOSBAQAogCQlwcmludGsoIiAtPiAlZCkuXG4iLCBkZXYtPnZpZGVvLm90ZXJtLT5pZCk7CiAJfQogCisJLyogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gYnVmZmVycyBxdWV1ZS4gKi8KKwl1dmNfcXVldWVfaW5pdCgmZGV2LT52aWRlby5xdWV1ZSwgZGV2LT52aWRlby5zdHJlYW1pbmctPnR5cGUpOworCiAJLyogSW5pdGlhbGl6ZSB0aGUgc3RyZWFtaW5nIGludGVyZmFjZSB3aXRoIGRlZmF1bHQgc3RyZWFtaW5nCiAJICogcGFyYW1ldGVycy4KIAkgKi8KQEAgLTE3MDcsMjQgKzE3NzIsNiBAQAogICogdGhvdWdoIHRoZXkgYXJlIGNvbXBsaWFudC4KICAqLwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHV2Y19pZHNbXSA9IHsKLQkvKiBBTGkgTTU2MDYgKENsZXZvIE01NDBTUikgKi8KLQl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQotCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKLQkgIC5pZFZlbmRvcgkJPSAweDA0MDIsCi0JICAuaWRQcm9kdWN0CQk9IDB4NTYwNiwKLQkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKLQkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAotCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKLQkvKiBDcmVhdGl2ZSBMaXZlISBPcHRpYSAqLwotCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCi0JCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAotCSAgLmlkVmVuZG9yCQk9IDB4MDQxZSwKLQkgIC5pZFByb2R1Y3QJCT0gMHg0MDU3LAotCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAotCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0JICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAogCS8qIE1pY3Jvc29mdCBMaWZlY2FtIE5YLTYwMDAgKi8KIAl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQogCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKQEAgLTE4MTAsMTUgKzE4NTcsNiBAQAogCSAgLmJJbnRlcmZhY2VTdWJDbGFzcyAgID0gMSwKIAkgIC5iSW50ZXJmYWNlUHJvdG9jb2wgICA9IDAsCiAJICAuZHJpdmVyX2luZm8gICAgICAgICAgPSBVVkNfUVVJUktfU1RSRUFNX05PX0ZJRCB9LAotCS8qIFNpbGljb24gTW90aW9uIFNNMzcxICovCi0JeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKLQkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCi0JICAuaWRWZW5kb3IJCT0gMHgwOTBjLAotCSAgLmlkUHJvZHVjdAkJPSAweGIzNzEsCi0JICAuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX1ZJREVPLAotCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCi0JICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKLQkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCiAJLyogTVQ2MjI3ICovCiAJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKIAkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCkBAIC0xODM3LDYgKzE4NzUsMTUgQEAKIAkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1NUUkVBTV9OT19GSUQgfSwKKwkvKiBTeW50ZWsgKFNhbXN1bmcgUTMxMCkgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDE3NGYsCisJICAuaWRQcm9kdWN0CQk9IDB4NTkzMSwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19TVFJFQU1fTk9fRklEIH0sCiAJLyogQXN1cyBGOVNHICovCiAJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKIAkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCkBAIC0xODU1LDYgKzE5MDIsMTUgQEAKIAkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1NUUkVBTV9OT19GSUQgfSwKKwkvKiBMZW5vdm8gVGhpbmtwYWQgU0w1MDAgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDE3ZWYsCisJICAuaWRQcm9kdWN0CQk9IDB4NDgwYiwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19TVFJFQU1fTk9fRklEIH0sCiAJLyogRWNhbW0gUGljbyBpTWFnZSAqLwogCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCiAJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLApAQCAtMTg4NCwxMDYgKzE5NDAsOCBAQAogCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCiAJICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKIAkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYCi0JCQkJfCBVVkNfUVVJUktfSUdOT1JFX1NFTEVDVE9SX1VOSVR9LAotCS8qIEFjZXIgT0VNIFdlYmNhbSAtIFVua25vd24gdmVuZG9yICovCi0JeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKLQkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCi0JICAuaWRWZW5kb3IJCT0gMHg1OTg2LAotCSAgLmlkUHJvZHVjdAkJPSAweDAxMDAsCi0JICAuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX1ZJREVPLAotCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCi0JICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKLQkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCi0JLyogUGFja2FyZCBCZWxsIE9FTSBXZWJjYW0gLSBCaXNvbiBFbGVjdHJvbmljcyAqLwotCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCi0JCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAotCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKLQkgIC5pZFByb2R1Y3QJCT0gMHgwMTAxLAotCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAotCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0JICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAotCS8qIEFjZXIgQ3J5c3RhbCBFeWUgd2ViY2FtIC0gQmlzb24gRWxlY3Ryb25pY3MgKi8KLQl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQotCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKLQkgIC5pZFZlbmRvcgkJPSAweDU5ODYsCi0JICAuaWRQcm9kdWN0CQk9IDB4MDEwMiwKLQkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKLQkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAotCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKLQkvKiBDb21wYXEgUHJlc2FyaW8gQjEyMDAgLSBCaXNvbiBFbGVjdHJvbmljcyAqLwotCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCi0JCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAotCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKLQkgIC5pZFByb2R1Y3QJCT0gMHgwMTA0LAotCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAotCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0JICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAotCS8qIEFjZXIgVHJhdmVsbWF0ZSA3NzIwIC0gQmlzb24gRWxlY3Ryb25pY3MgKi8KLQl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQotCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKLQkgIC5pZFZlbmRvcgkJPSAweDU5ODYsCi0JICAuaWRQcm9kdWN0CQk9IDB4MDEwNSwKLQkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKLQkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAotCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKLQkvKiBNZWRpb24gQWtveWEgTWluaSBFMTIxMCAtIEJpc29uIEVsZWN0cm9uaWNzICovCi0JeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKLQkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCi0JICAuaWRWZW5kb3IJCT0gMHg1OTg2LAotCSAgLmlkUHJvZHVjdAkJPSAweDAxNDEsCi0JICAuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX1ZJREVPLAotCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCi0JICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKLQkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCi0JLyogQWNlciBPcmJpQ2FtIC0gQmlzb24gRWxlY3Ryb25pY3MgKi8KLQl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQotCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKLQkgIC5pZFZlbmRvcgkJPSAweDU5ODYsCi0JICAuaWRQcm9kdWN0CQk9IDB4MDIwMCwKLQkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKLQkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAotCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKLQkvKiAgRnVqaXRzdSBBbWlsbyBTSTI2MzYgLSBCaXNvbiBFbGVjdHJvbmljcyAqLwotCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCi0JCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAotCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKLQkgIC5pZFByb2R1Y3QJCT0gMHgwMjAyLAotCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAotCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0JICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAotCS8qICBBZHZlbnQgNDIxMSAtIEJpc29uIEVsZWN0cm9uaWNzICovCi0JeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKLQkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCi0JICAuaWRWZW5kb3IJCT0gMHg1OTg2LAotCSAgLmlkUHJvZHVjdAkJPSAweDAyMDMsCi0JICAuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX1ZJREVPLAotCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCi0JICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKLQkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCi0JLyogQmlzb24gRWxlY3Ryb25pY3MgKi8KLQl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQotCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKLQkgIC5pZFZlbmRvcgkJPSAweDU5ODYsCi0JICAuaWRQcm9kdWN0CQk9IDB4MDMwMCwKLQkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCi0JICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKLQkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAotCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKLQkvKiBDbGV2byBNNTcwVFUgLSBCaXNvbiBFbGVjdHJvbmljcyAqLwotCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCi0JCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAotCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKLQkgIC5pZFByb2R1Y3QJCT0gMHgwMzAzLAotCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKLQkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAotCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCi0JICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAorCQkJCXwgVVZDX1FVSVJLX0lHTk9SRV9TRUxFQ1RPUl9VTklUCisJCQkJfCBVVkNfUVVJUktfUFJVTkVfQ09OVFJPTFMgfSwKIAkvKiBHZW5lcmljIFVTQiBWaWRlbyBDbGFzcyAqLwogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19WSURFTywgMSwgMCkgfSwKIAl7fQpAQCAtMjAyOSw2ICsxOTg3LDggQEAKIG1vZHVsZV9pbml0KHV2Y19pbml0KTsKIG1vZHVsZV9leGl0KHV2Y19jbGVhbnVwKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKG5vZHJvcCwgdXZjX25vX2Ryb3BfcGFyYW0sIHVpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG5vZHJvcCwgIkRvbid0IGRyb3AgaW5jb21wbGV0ZSBmcmFtZXMiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChxdWlya3MsIHV2Y19xdWlya3NfcGFyYW0sIHVpbnQsIFNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHF1aXJrcywgIkZvcmNlZCBkZXZpY2UgcXVpcmtzIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQodHJhY2UsIHV2Y190cmFjZV9wYXJhbSwgdWludCwgU19JUlVHT3xTX0lXVVNSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19xdWV1ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKaW5kZXggNTY0NmE2YS4uNDI1NDYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3F1ZXVlLmMKQEAgLTc5LDEyICs3OSwxMyBAQAogICoKICAqLwogCi12b2lkIHV2Y19xdWV1ZV9pbml0KHN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlKQordm9pZCB1dmNfcXVldWVfaW5pdChzdHJ1Y3QgdXZjX3ZpZGVvX3F1ZXVlICpxdWV1ZSwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7CiAJbXV0ZXhfaW5pdCgmcXVldWUtPm11dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmlycWxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+bWFpbnF1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmcXVldWUtPmlycXF1ZXVlKTsKKwlxdWV1ZS0+dHlwZSA9IHR5cGU7CiB9CiAKIC8qCkBAIC0xMzIsNyArMTMzLDcgQEAKIAkJcXVldWUtPmJ1ZmZlcltpXS5idWYuaW5kZXggPSBpOwogCQlxdWV1ZS0+YnVmZmVyW2ldLmJ1Zi5tLm9mZnNldCA9IGkgKiBidWZzaXplOwogCQlxdWV1ZS0+YnVmZmVyW2ldLmJ1Zi5sZW5ndGggPSBidWZsZW5ndGg7Ci0JCXF1ZXVlLT5idWZmZXJbaV0uYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCXF1ZXVlLT5idWZmZXJbaV0uYnVmLnR5cGUgPSBxdWV1ZS0+dHlwZTsKIAkJcXVldWUtPmJ1ZmZlcltpXS5idWYuc2VxdWVuY2UgPSAwOwogCQlxdWV1ZS0+YnVmZmVyW2ldLmJ1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAkJcXVldWUtPmJ1ZmZlcltpXS5idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKQEAgLTIyNiw3ICsyMjcsNyBAQAogCiAJdXZjX3RyYWNlKFVWQ19UUkFDRV9DQVBUVVJFLCAiUXVldWluZyBidWZmZXIgJXUuXG4iLCB2NGwyX2J1Zi0+aW5kZXgpOwogCi0JaWYgKHY0bDJfYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCWlmICh2NGwyX2J1Zi0+dHlwZSAhPSBxdWV1ZS0+dHlwZSB8fAogCSAgICB2NGwyX2J1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKIAkJdXZjX3RyYWNlKFVWQ19UUkFDRV9DQVBUVVJFLCAiW0VdIEludmFsaWQgYnVmZmVyIHR5cGUgKCV1KSAiCiAJCQkiYW5kL29yIG1lbW9yeSAoJXUpLlxuIiwgdjRsMl9idWYtPnR5cGUsCkBAIC0yNDksNiArMjUwLDEzIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwlpZiAodjRsMl9idWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkgICAgdjRsMl9idWYtPmJ5dGVzdXNlZCA+IGJ1Zi0+YnVmLmxlbmd0aCkgeworCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0NBUFRVUkUsICJbRV0gQnl0ZXMgdXNlZCBvdXQgb2YgYm91bmRzLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmlycWxvY2ssIGZsYWdzKTsKIAlpZiAocXVldWUtPmZsYWdzICYgVVZDX1FVRVVFX0RJU0NPTk5FQ1RFRCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOwpAQCAtMjU2LDcgKzI2NCwxMSBAQAogCQlnb3RvIGRvbmU7CiAJfQogCWJ1Zi0+c3RhdGUgPSBVVkNfQlVGX1NUQVRFX1FVRVVFRDsKLQlidWYtPmJ1Zi5ieXRlc3VzZWQgPSAwOworCWlmICh2NGwyX2J1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWJ1Zi0+YnVmLmJ5dGVzdXNlZCA9IDA7CisJZWxzZQorCQlidWYtPmJ1Zi5ieXRlc3VzZWQgPSB2NGwyX2J1Zi0+Ynl0ZXN1c2VkOworCiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5zdHJlYW0sICZxdWV1ZS0+bWFpbnF1ZXVlKTsKIAlsaXN0X2FkZF90YWlsKCZidWYtPnF1ZXVlLCAmcXVldWUtPmlycXF1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+aXJxbG9jaywgZmxhZ3MpOwpAQCAtMjg5LDcgKzMwMSw3IEBACiAJc3RydWN0IHV2Y19idWZmZXIgKmJ1ZjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICh2NGwyX2J1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwlpZiAodjRsMl9idWYtPnR5cGUgIT0gcXVldWUtPnR5cGUgfHwKIAkgICAgdjRsMl9idWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CiAJCXV2Y190cmFjZShVVkNfVFJBQ0VfQ0FQVFVSRSwgIltFXSBJbnZhbGlkIGJ1ZmZlciB0eXBlICgldSkgIgogCQkJImFuZC9vciBtZW1vcnkgKCV1KS5cbiIsIHY0bDJfYnVmLT50eXBlLApAQCAtMzk3LDYgKzQwOSw3IEBACiAJCX0KIAkJcXVldWUtPnNlcXVlbmNlID0gMDsKIAkJcXVldWUtPmZsYWdzIHw9IFVWQ19RVUVVRV9TVFJFQU1JTkc7CisJCXF1ZXVlLT5idWZfdXNlZCA9IDA7CiAJfSBlbHNlIHsKIAkJdXZjX3F1ZXVlX2NhbmNlbChxdWV1ZSwgMCk7CiAJCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+bWFpbnF1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCmluZGV4IDc1OGRmZWYuLmFmY2M2OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJaW50IHJldCA9IDA7CiAJX191OCAqZmNjOwogCi0JaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKGZtdC0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZjYyA9IChfX3U4ICopJmZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdDsKQEAgLTIxNiw3ICsyMTYsNyBAQAogCXN0cnVjdCB1dmNfZm9ybWF0ICpmb3JtYXQgPSB2aWRlby0+c3RyZWFtaW5nLT5jdXJfZm9ybWF0OwogCXN0cnVjdCB1dmNfZnJhbWUgKmZyYW1lID0gdmlkZW8tPnN0cmVhbWluZy0+Y3VyX2ZyYW1lOwogCi0JaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKGZtdC0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChmb3JtYXQgPT0gTlVMTCB8fCBmcmFtZSA9PSBOVUxMKQpAQCAtMjQyLDcgKzI0Miw3IEBACiAJc3RydWN0IHV2Y19mcmFtZSAqZnJhbWU7CiAJaW50IHJldDsKIAotCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmIChmbXQtPnR5cGUgIT0gdmlkZW8tPnN0cmVhbWluZy0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodXZjX3F1ZXVlX3N0cmVhbWluZygmdmlkZW8tPnF1ZXVlKSkKQEAgLTI1Miw5ICsyNTIsNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChyZXQgPSB1dmNfc2V0X3ZpZGVvX2N0cmwodmlkZW8sICZwcm9iZSwgMCkpIDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCW1lbWNweSgmdmlkZW8tPnN0cmVhbWluZy0+Y3RybCwgJnByb2JlLCBzaXplb2YgcHJvYmUpOwogCXZpZGVvLT5zdHJlYW1pbmctPmN1cl9mb3JtYXQgPSBmb3JtYXQ7CiAJdmlkZW8tPnN0cmVhbWluZy0+Y3VyX2ZyYW1lID0gZnJhbWU7CkBAIC0yNjcsNyArMjY0LDcgQEAKIHsKIAl1aW50MzJfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOwogCi0JaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmIChwYXJtLT50eXBlICE9IHZpZGVvLT5zdHJlYW1pbmctPnR5cGUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbnVtZXJhdG9yID0gdmlkZW8tPnN0cmVhbWluZy0+Y3RybC5kd0ZyYW1lSW50ZXJ2YWw7CkBAIC0yNzUsMTMgKzI3MiwyMSBAQAogCXV2Y19zaW1wbGlmeV9mcmFjdGlvbigmbnVtZXJhdG9yLCAmZGVub21pbmF0b3IsIDgsIDMzMyk7CiAKIAltZW1zZXQocGFybSwgMCwgc2l6ZW9mICpwYXJtKTsKLQlwYXJtLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCXBhcm0tPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOwotCXBhcm0tPnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZSA9IDA7Ci0JcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBudW1lcmF0b3I7Ci0JcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yOwotCXBhcm0tPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOwotCXBhcm0tPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IDA7CisJcGFybS0+dHlwZSA9IHZpZGVvLT5zdHJlYW1pbmctPnR5cGU7CisKKwlpZiAodmlkZW8tPnN0cmVhbWluZy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJcGFybS0+cGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJCXBhcm0tPnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZSA9IDA7CisJCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gbnVtZXJhdG9yOworCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZGVub21pbmF0b3I7CisJCXBhcm0tPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCQlwYXJtLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSAwOworCX0gZWxzZSB7CisJCXBhcm0tPnBhcm0ub3V0cHV0LmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJCXBhcm0tPnBhcm0ub3V0cHV0Lm91dHB1dG1vZGUgPSAwOworCQlwYXJtLT5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gbnVtZXJhdG9yOworCQlwYXJtLT5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBkZW5vbWluYXRvcjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5MSw0MiArMjk2LDQ1IEBACiB7CiAJc3RydWN0IHV2Y19mcmFtZSAqZnJhbWUgPSB2aWRlby0+c3RyZWFtaW5nLT5jdXJfZnJhbWU7CiAJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCBwcm9iZTsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCB0aW1lcGVyZnJhbWU7CiAJdWludDMyX3QgaW50ZXJ2YWw7CiAJaW50IHJldDsKIAotCWlmIChwYXJtLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAocGFybS0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh1dmNfcXVldWVfc3RyZWFtaW5nKCZ2aWRlby0+cXVldWUpKQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKHBhcm0tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQl0aW1lcGVyZnJhbWUgPSBwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lOworCWVsc2UKKwkJdGltZXBlcmZyYW1lID0gcGFybS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lOworCiAJbWVtY3B5KCZwcm9iZSwgJnZpZGVvLT5zdHJlYW1pbmctPmN0cmwsIHNpemVvZiBwcm9iZSk7Ci0JaW50ZXJ2YWwgPSB1dmNfZnJhY3Rpb25fdG9faW50ZXJ2YWwoCi0JCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciwKLQkJCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IpOworCWludGVydmFsID0gdXZjX2ZyYWN0aW9uX3RvX2ludGVydmFsKHRpbWVwZXJmcmFtZS5udW1lcmF0b3IsCisJCXRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcik7CiAKIAl1dmNfdHJhY2UoVVZDX1RSQUNFX0ZPUk1BVCwgIlNldHRpbmcgZnJhbWUgaW50ZXJ2YWwgdG8gJXUvJXUgKCV1KS5cbiIsCi0JCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciwKLQkJCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IsCi0JCQlpbnRlcnZhbCk7CisJCXRpbWVwZXJmcmFtZS5udW1lcmF0b3IsIHRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciwgaW50ZXJ2YWwpOwogCXByb2JlLmR3RnJhbWVJbnRlcnZhbCA9IHV2Y190cnlfZnJhbWVfaW50ZXJ2YWwoZnJhbWUsIGludGVydmFsKTsKIAogCS8qIFByb2JlIHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV3IHNldHRpbmdzLiAqLwogCWlmICgocmV0ID0gdXZjX3Byb2JlX3ZpZGVvKHZpZGVvLCAmcHJvYmUpKSA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBDb21taXQgdGhlIG5ldyBzZXR0aW5ncy4gKi8KLQlpZiAoKHJldCA9IHV2Y19zZXRfdmlkZW9fY3RybCh2aWRlbywgJnByb2JlLCAwKSkgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJbWVtY3B5KCZ2aWRlby0+c3RyZWFtaW5nLT5jdHJsLCAmcHJvYmUsIHNpemVvZiBwcm9iZSk7CiAKIAkvKiBSZXR1cm4gdGhlIGFjdHVhbCBmcmFtZSBwZXJpb2QuICovCi0JcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBwcm9iZS5kd0ZyYW1lSW50ZXJ2YWw7Ci0JcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IDEwMDAwMDAwOwotCXV2Y19zaW1wbGlmeV9mcmFjdGlvbigmcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IsCi0JCQkJJnBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IsCi0JCQkJOCwgMzMzKTsKKwl0aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gcHJvYmUuZHdGcmFtZUludGVydmFsOworCXRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IDEwMDAwMDAwOworCXV2Y19zaW1wbGlmeV9mcmFjdGlvbigmdGltZXBlcmZyYW1lLm51bWVyYXRvciwKKwkJJnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciwgOCwgMzMzKTsKKworCWlmIChwYXJtLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZSA9IHRpbWVwZXJmcmFtZTsKKwllbHNlCisJCXBhcm0tPnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZSA9IHRpbWVwZXJmcmFtZTsKIAogCXJldHVybiAwOwogfQpAQCAtNDY0LDE3ICs0NzIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX3V2Y192NGwyX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdXZjX3Y0bDJfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGUgPSAoc3RydWN0IHV2Y19maCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICh1dmNfdHJhY2VfcGFyYW0gJiBVVkNfVFJBQ0VfSU9DVEwpCi0JCXY0bF9wcmludGtfaW9jdGwoY21kKTsKLQogCXN3aXRjaCAoY21kKSB7CiAJLyogUXVlcnkgY2FwYWJpbGl0aWVzICovCiAJY2FzZSBWSURJT0NfUVVFUllDQVA6CkBAIC00ODcsOCArNDkxLDEyIEBACiAJCXN0cm5jcHkoY2FwLT5idXNfaW5mbywgdmlkZW8tPmRldi0+dWRldi0+YnVzLT5idXNfbmFtZSwKIAkJCXNpemVvZiBjYXAtPmJ1c19pbmZvKTsKIAkJY2FwLT52ZXJzaW9uID0gRFJJVkVSX1ZFUlNJT05fTlVNQkVSOwotCQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKLQkJCQkgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCQlpZiAodmlkZW8tPnN0cmVhbWluZy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKKwkJCQkJICB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwkJZWxzZQorCQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19PVVRQVVQKKwkJCQkJICB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAkJYnJlYWs7CiAJfQogCkBAIC02NjYsNyArNjc0LDcgQEAKIAkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10ID0gYXJnOwogCQlzdHJ1Y3QgdXZjX2Zvcm1hdCAqZm9ybWF0OwogCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCWlmIChmbXQtPnR5cGUgIT0gdmlkZW8tPnN0cmVhbWluZy0+dHlwZSB8fAogCQkgICAgZm10LT5pbmRleCA+PSB2aWRlby0+c3RyZWFtaW5nLT5uZm9ybWF0cykKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MDUsNyArODEzLDcgQEAKIAkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2NhcCA9IGFyZzsKIAkJc3RydWN0IHV2Y19mcmFtZSAqZnJhbWUgPSB2aWRlby0+c3RyZWFtaW5nLT5jdXJfZnJhbWU7CiAKLQkJaWYgKGNjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlpZiAoY2NhcC0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJY2NhcC0+Ym91bmRzLmxlZnQgPSAwOwpAQCAtODMxLDcgKzgzOSw3IEBACiAJCXVuc2lnbmVkIGludCBidWZzaXplID0KIAkJCXZpZGVvLT5zdHJlYW1pbmctPmN0cmwuZHdNYXhWaWRlb0ZyYW1lU2l6ZTsKIAotCQlpZiAocmItPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCWlmIChyYi0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlIHx8CiAJCSAgICByYi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtODUxLDcgKzg1OSw3IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKIAotCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJaWYgKGJ1Zi0+dHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCF1dmNfaGFzX3ByaXZpbGVnZXMoaGFuZGxlKSkKQEAgLTg3Nyw3ICs4ODUsNyBAQAogCXsKIAkJaW50ICp0eXBlID0gYXJnOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWlmICgqdHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCF1dmNfaGFzX3ByaXZpbGVnZXMoaGFuZGxlKSkKQEAgLTg5Miw3ICs5MDAsNyBAQAogCXsKIAkJaW50ICp0eXBlID0gYXJnOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWlmICgqdHlwZSAhPSB2aWRlby0+c3RyZWFtaW5nLT50eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKCF1dmNfaGFzX3ByaXZpbGVnZXMoaGFuZGxlKSkKQEAgLTkyNSw3ICs5MzMsNyBAQAogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCi0JCWluZm8gPSBrbWFsbG9jKHNpemVvZiAqaW5mbywgR0ZQX0tFUk5FTCk7CisJCWluZm8gPSBremFsbG9jKHNpemVvZiAqaW5mbywgR0ZQX0tFUk5FTCk7CiAJCWlmIChpbmZvID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtOTUyLDcgKzk2MCw3IEBACiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAKLQkJbWFwID0ga21hbGxvYyhzaXplb2YgKm1hcCwgR0ZQX0tFUk5FTCk7CisJCW1hcCA9IGt6YWxsb2Moc2l6ZW9mICptYXAsIEdGUF9LRVJORUwpOwogCQlpZiAobWFwID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtOTc5LDcgKzk4Nyw3IEBACiAKIAlkZWZhdWx0OgogCQlpZiAoKHJldCA9IHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGZpbGUsIGNtZCwgYXJnLAotCQkJX191dmNfdjRsMl9kb19pb2N0bCkpID09IC1FTk9JT0NUTENNRCkKKwkJCXV2Y192NGwyX2RvX2lvY3RsKSkgPT0gLUVOT0lPQ1RMQ01EKQogCQkJdXZjX3RyYWNlKFVWQ19UUkFDRV9JT0NUTCwgIlVua25vd24gaW9jdGwgMHglMDh4XG4iLAogCQkJCSAgY21kKTsKIAkJcmV0dXJuIHJldDsKQEAgLTk4OCwxNyArOTk2LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB1dmNfdjRsMl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gX191dmNfdjRsMl9kb19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci19Ci0KIHN0YXRpYyBpbnQgdXZjX3Y0bDJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JdXZjX3RyYWNlKFVWQ19UUkFDRV9DQUxMUywgInV2Y192NGwyX2lvY3RsXG4iKTsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB1dmNfdjRsMl9kb19pb2N0bCk7CisJaWYgKHV2Y190cmFjZV9wYXJhbSAmIFVWQ19UUkFDRV9JT0NUTCkgeworCQl1dmNfcHJpbnRrKEtFUk5fREVCVUcsICJ1dmNfdjRsMl9pb2N0bCgiKTsKKwkJdjRsX3ByaW50a19pb2N0bChjbWQpOworCQlwcmludGsoIilcbiIpOworCX0KKworCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgdXZjX3Y0bDJfZG9faW9jdGwpOwogfQogCiBzdGF0aWMgc3NpemVfdCB1dmNfdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKaW5kZXggYjdiYjIzOC4uZTdjMzE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKQEAgLTM2LDE1ICszNiwyMiBAQAogewogCV9fdTggdHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRTsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKLQlpbnQgcmV0OwogCiAJcGlwZSA9IChxdWVyeSAmIDB4ODApID8gdXNiX3JjdmN0cmxwaXBlKGRldi0+dWRldiwgMCkKIAkJCSAgICAgIDogdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCk7CiAJdHlwZSB8PSAocXVlcnkgJiAweDgwKSA/IFVTQl9ESVJfSU4gOiBVU0JfRElSX09VVDsKIAotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHBpcGUsIHF1ZXJ5LCB0eXBlLCBjcyA8PCA4LAorCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCBwaXBlLCBxdWVyeSwgdHlwZSwgY3MgPDwgOCwKIAkJCXVuaXQgPDwgOCB8IGludGZudW0sIGRhdGEsIHNpemUsIHRpbWVvdXQpOworfQogCitpbnQgdXZjX3F1ZXJ5X2N0cmwoc3RydWN0IHV2Y19kZXZpY2UgKmRldiwgX191OCBxdWVyeSwgX191OCB1bml0LAorCQkJX191OCBpbnRmbnVtLCBfX3U4IGNzLCB2b2lkICpkYXRhLCBfX3UxNiBzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX3V2Y19xdWVyeV9jdHJsKGRldiwgcXVlcnksIHVuaXQsIGludGZudW0sIGNzLCBkYXRhLCBzaXplLAorCQkJCVVWQ19DVFJMX0NPTlRST0xfVElNRU9VVCk7CiAJaWYgKHJldCAhPSBzaXplKSB7CiAJCXV2Y19wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gcXVlcnkgKCV1KSBVVkMgY29udHJvbCAldSAiCiAJCQkiKHVuaXQgJXUpIDogJWQgKGV4cC4gJXUpLlxuIiwgcXVlcnksIGNzLCB1bml0LCByZXQsCkBAIC01NSwxMyArNjIsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdXZjX3F1ZXJ5X2N0cmwoc3RydWN0IHV2Y19kZXZpY2UgKmRldiwgX191OCBxdWVyeSwgX191OCB1bml0LAotCQkJX191OCBpbnRmbnVtLCBfX3U4IGNzLCB2b2lkICpkYXRhLCBfX3UxNiBzaXplKQotewotCXJldHVybiBfX3V2Y19xdWVyeV9jdHJsKGRldiwgcXVlcnksIHVuaXQsIGludGZudW0sIGNzLCBkYXRhLCBzaXplLAotCQkJCVVWQ19DVFJMX0NPTlRST0xfVElNRU9VVCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHV2Y19maXh1cF9idWZmZXJfc2l6ZShzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8sCiAJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCAqY3RybCkKIHsKQEAgLTEwMiw4ICsxMDIsMzYgQEAKIAlyZXQgPSBfX3V2Y19xdWVyeV9jdHJsKHZpZGVvLT5kZXYsIHF1ZXJ5LCAwLCB2aWRlby0+c3RyZWFtaW5nLT5pbnRmbnVtLAogCQlwcm9iZSA/IFZTX1BST0JFX0NPTlRST0wgOiBWU19DT01NSVRfQ09OVFJPTCwgZGF0YSwgc2l6ZSwKIAkJVVZDX0NUUkxfU1RSRUFNSU5HX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKQorCisJaWYgKChxdWVyeSA9PSBHRVRfTUlOIHx8IHF1ZXJ5ID09IEdFVF9NQVgpICYmIHJldCA9PSAyKSB7CisJCS8qIFNvbWUgY2FtZXJhcywgbW9zdGx5IGJhc2VkIG9uIEJpc29uIEVsZWN0cm9uaWNzIGNoaXBzZXRzLAorCQkgKiBhbnN3ZXIgYSBHRVRfTUlOIG9yIEdFVF9NQVggcmVxdWVzdCB3aXRoIHRoZSB3Q29tcFF1YWxpdHkKKwkJICogZmllbGQgb25seS4KKwkJICovCisJCXV2Y193YXJuX29uY2UodmlkZW8tPmRldiwgVVZDX1dBUk5fTUlOTUFYLCAiVVZDIG5vbiAiCisJCQkiY29tcGxpYW5jZSAtIEdFVF9NSU4vTUFYKFBST0JFKSBpbmNvcnJlY3RseSAiCisJCQkic3VwcG9ydGVkLiBFbmFibGluZyB3b3JrYXJvdW5kLlxuIik7CisJCW1lbXNldChjdHJsLCAwLCBzaXplb2YgY3RybCk7CisJCWN0cmwtPndDb21wUXVhbGl0eSA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopZGF0YSk7CisJCXJldCA9IDA7CiAJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocXVlcnkgPT0gR0VUX0RFRiAmJiBwcm9iZSA9PSAxKSB7CisJCS8qIE1hbnkgY2FtZXJhcyBkb24ndCBzdXBwb3J0IHRoZSBHRVRfREVGIHJlcXVlc3Qgb24gdGhlaXIKKwkJICogdmlkZW8gcHJvYmUgY29udHJvbC4gV2FybiBvbmNlIGFuZCByZXR1cm4sIHRoZSBjYWxsZXIgd2lsbAorCQkgKiBmYWxsIGJhY2sgdG8gR0VUX0NVUi4KKwkJICovCisJCXV2Y193YXJuX29uY2UodmlkZW8tPmRldiwgVVZDX1dBUk5fUFJPQkVfREVGLCAiVVZDIG5vbiAiCisJCQkiY29tcGxpYW5jZSAtIEdFVF9ERUYoUFJPQkUpIG5vdCBzdXBwb3J0ZWQuICIKKwkJCSJFbmFibGluZyB3b3JrYXJvdW5kLlxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocmV0ICE9IHNpemUpIHsKKwkJdXZjX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBxdWVyeSAoJXUpIFVWQyAlcyBjb250cm9sIDogIgorCQkJIiVkIChleHAuICV1KS5cbiIsIHF1ZXJ5LCBwcm9iZSA/ICJwcm9iZSIgOiAiY29tbWl0IiwKKwkJCXJldCwgc2l6ZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KIAogCWN0cmwtPmJtSGludCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbMF0pOwogCWN0cmwtPmJGb3JtYXRJbmRleCA9IGRhdGFbMl07CkBAIC0xMTQsMTQgKzE0MiwxMSBAQAogCWN0cmwtPndDb21wUXVhbGl0eSA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbMTJdKTsKIAljdHJsLT53Q29tcFdpbmRvd1NpemUgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzE0XSk7CiAJY3RybC0+d0RlbGF5ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVsxNl0pOwotCWN0cmwtPmR3TWF4VmlkZW9GcmFtZVNpemUgPQotCQlsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMzIgKikmZGF0YVsxOF0pKTsKLQljdHJsLT5kd01heFBheWxvYWRUcmFuc2ZlclNpemUgPQotCQlsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMzIgKikmZGF0YVsyMl0pKTsKKwljdHJsLT5kd01heFZpZGVvRnJhbWVTaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZkYXRhWzE4XSk7CisJY3RybC0+ZHdNYXhQYXlsb2FkVHJhbnNmZXJTaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZkYXRhWzIyXSk7CiAKIAlpZiAoc2l6ZSA9PSAzNCkgewotCQljdHJsLT5kd0Nsb2NrRnJlcXVlbmN5ID0KLQkJCWxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUzMiAqKSZkYXRhWzI2XSkpOworCQljdHJsLT5kd0Nsb2NrRnJlcXVlbmN5ID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZkYXRhWzI2XSk7CiAJCWN0cmwtPmJtRnJhbWluZ0luZm8gPSBkYXRhWzMwXTsKIAkJY3RybC0+YlByZWZlcmVkVmVyc2lvbiA9IGRhdGFbMzFdOwogCQljdHJsLT5iTWluVmVyc2lvbiA9IGRhdGFbMzJdOwpAQCAtMTM4LDEzICsxNjMsMTQgQEAKIAkgKiBUcnkgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBmb3JtYXQgYW5kIGZyYW1lIGRlc2NyaXB0b3IuCiAJICovCiAJdXZjX2ZpeHVwX2J1ZmZlcl9zaXplKHZpZGVvLCBjdHJsKTsKKwlyZXQgPSAwOwogCiBvdXQ6CiAJa2ZyZWUoZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHV2Y19zZXRfdmlkZW9fY3RybChzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8sCitzdGF0aWMgaW50IHV2Y19zZXRfdmlkZW9fY3RybChzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8sCiAJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCAqY3RybCwgaW50IHByb2JlKQogewogCV9fdTggKmRhdGE7CkBAIC0xNjgsMTQgKzE5NCwxMSBAQAogCS8qIE5vdGU6IFNvbWUgb2YgdGhlIGZpZWxkcyBiZWxvdyBhcmUgbm90IHJlcXVpcmVkIGZvciBJTiBkZXZpY2VzIChzZWUKIAkgKiBVVkMgc3BlYywgNC4zLjEuMSksIGJ1dCB3ZSBzdGlsbCBjb3B5IHRoZW0gaW4gY2FzZSBzdXBwb3J0IGZvciBPVVQKIAkgKiBkZXZpY2VzIGlzIGFkZGVkIGluIHRoZSBmdXR1cmUuICovCi0JcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMihjdHJsLT5kd01heFZpZGVvRnJhbWVTaXplKSwKLQkJKF9fbGUzMiAqKSZkYXRhWzE4XSk7Ci0JcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMihjdHJsLT5kd01heFBheWxvYWRUcmFuc2ZlclNpemUpLAotCQkoX19sZTMyICopJmRhdGFbMjJdKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoY3RybC0+ZHdNYXhWaWRlb0ZyYW1lU2l6ZSwgJmRhdGFbMThdKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoY3RybC0+ZHdNYXhQYXlsb2FkVHJhbnNmZXJTaXplLCAmZGF0YVsyMl0pOwogCiAJaWYgKHNpemUgPT0gMzQpIHsKLQkJcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMihjdHJsLT5kd0Nsb2NrRnJlcXVlbmN5KSwKLQkJCShfX2xlMzIgKikmZGF0YVsyNl0pOworCQlwdXRfdW5hbGlnbmVkX2xlMzIoY3RybC0+ZHdDbG9ja0ZyZXF1ZW5jeSwgJmRhdGFbMjZdKTsKIAkJZGF0YVszMF0gPSBjdHJsLT5ibUZyYW1pbmdJbmZvOwogCQlkYXRhWzMxXSA9IGN0cmwtPmJQcmVmZXJlZFZlcnNpb247CiAJCWRhdGFbMzJdID0gY3RybC0+Yk1pblZlcnNpb247CkBAIC0xODYsNiArMjA5LDEyIEBACiAJCXZpZGVvLT5zdHJlYW1pbmctPmludGZudW0sCiAJCXByb2JlID8gVlNfUFJPQkVfQ09OVFJPTCA6IFZTX0NPTU1JVF9DT05UUk9MLCBkYXRhLCBzaXplLAogCQlVVkNfQ1RSTF9TVFJFQU1JTkdfVElNRU9VVCk7CisJaWYgKHJldCAhPSBzaXplKSB7CisJCXV2Y19wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gc2V0IFVWQyAlcyBjb250cm9sIDogIgorCQkJIiVkIChleHAuICV1KS5cbiIsIHByb2JlID8gInByb2JlIiA6ICJjb21taXQiLAorCQkJcmV0LCBzaXplKTsKKwkJcmV0ID0gLUVJTzsKKwl9CiAKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjUyLDYgKzI4MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCB1dmNfY29tbWl0X3ZpZGVvKHN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbywKKwlzdHJ1Y3QgdXZjX3N0cmVhbWluZ19jb250cm9sICpwcm9iZSkKK3sKKwlyZXR1cm4gdXZjX3NldF92aWRlb19jdHJsKHZpZGVvLCBwcm9iZSwgMCk7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVmlkZW8gY29kZWNzCiAgKi8KQEAgLTMzMyw3ICszNjgsNyBAQAogCiAJLyogU3luY2hyb25pemUgdG8gdGhlIGlucHV0IHN0cmVhbSBieSB3YWl0aW5nIGZvciB0aGUgRklEIGJpdCB0byBiZQogCSAqIHRvZ2dsZWQgd2hlbiB0aGUgdGhlIGJ1ZmZlciBzdGF0ZSBpcyBub3QgVVZDX0JVRl9TVEFURV9BQ1RJVkUuCi0JICogcXVldWUtPmxhc3RfZmlkIGlzIGluaXRpYWxpemVkIHRvIC0xLCBzbyB0aGUgZmlyc3QgaXNvY2hyb25vdXMKKwkgKiB2aWRlby0+bGFzdF9maWQgaXMgaW5pdGlhbGl6ZWQgdG8gLTEsIHNvIHRoZSBmaXJzdCBpc29jaHJvbm91cwogCSAqIGZyYW1lIHdpbGwgYWx3YXlzIGJlIGluIHN5bmMuCiAJICoKIAkgKiBJZiB0aGUgZGV2aWNlIGRvZXNuJ3QgdG9nZ2xlIHRoZSBGSUQgYml0LCBpbnZlcnQgdmlkZW8tPmxhc3RfZmlkCkBAIC0zNjAsNyArMzk1LDcgQEAKIAkgKiBsYXN0IHBheWxvYWQgY2FuIGJlIGxvc3QgYW55d2F5KS4gV2UgdGh1cyBtdXN0IGNoZWNrIGlmIHRoZSBGSUQgaGFzCiAJICogYmVlbiB0b2dnbGVkLgogCSAqCi0JICogcXVldWUtPmxhc3RfZmlkIGlzIGluaXRpYWxpemVkIHRvIC0xLCBzbyB0aGUgZmlyc3QgaXNvY2hyb25vdXMKKwkgKiB2aWRlby0+bGFzdF9maWQgaXMgaW5pdGlhbGl6ZWQgdG8gLTEsIHNvIHRoZSBmaXJzdCBpc29jaHJvbm91cwogCSAqIGZyYW1lIHdpbGwgbmV2ZXIgdHJpZ2dlciBhbiBlbmQgb2YgZnJhbWUgZGV0ZWN0aW9uLgogCSAqCiAJICogRW1wdHkgYnVmZmVycyAoYnl0ZXN1c2VkID09IDApIGRvbid0IHRyaWdnZXIgZW5kIG9mIGZyYW1lIGRldGVjdGlvbgpAQCAtNDE4LDYgKzQ1MywzNCBAQAogCX0KIH0KIAorc3RhdGljIGludCB1dmNfdmlkZW9fZW5jb2RlX2hlYWRlcihzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8sCisJCXN0cnVjdCB1dmNfYnVmZmVyICpidWYsIF9fdTggKmRhdGEsIGludCBsZW4pCit7CisJZGF0YVswXSA9IDI7CS8qIEhlYWRlciBsZW5ndGggKi8KKwlkYXRhWzFdID0gVVZDX1NUUkVBTV9FT0ggfCBVVkNfU1RSRUFNX0VPRgorCQl8ICh2aWRlby0+bGFzdF9maWQgJiBVVkNfU1RSRUFNX0ZJRCk7CisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgdXZjX3ZpZGVvX2VuY29kZV9kYXRhKHN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbywKKwkJc3RydWN0IHV2Y19idWZmZXIgKmJ1ZiwgX191OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdXZjX3ZpZGVvX3F1ZXVlICpxdWV1ZSA9ICZ2aWRlby0+cXVldWU7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKwl2b2lkICptZW07CisKKwkvKiBDb3B5IHZpZGVvIGRhdGEgdG8gdGhlIFVSQiBidWZmZXIuICovCisJbWVtID0gcXVldWUtPm1lbSArIGJ1Zi0+YnVmLm0ub2Zmc2V0ICsgcXVldWUtPmJ1Zl91c2VkOworCW5ieXRlcyA9IG1pbigodW5zaWduZWQgaW50KWxlbiwgYnVmLT5idWYuYnl0ZXN1c2VkIC0gcXVldWUtPmJ1Zl91c2VkKTsKKwluYnl0ZXMgPSBtaW4odmlkZW8tPmJ1bGsubWF4X3BheWxvYWRfc2l6ZSAtIHZpZGVvLT5idWxrLnBheWxvYWRfc2l6ZSwKKwkJCW5ieXRlcyk7CisJbWVtY3B5KGRhdGEsIG1lbSwgbmJ5dGVzKTsKKworCXF1ZXVlLT5idWZfdXNlZCArPSBuYnl0ZXM7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFVSQiBoYW5kbGluZwogICovCkBAIC00NzcsNyArNTQwLDcgQEAKIAkvKiBJZiB0aGUgVVJCIGlzIHRoZSBmaXJzdCBvZiBpdHMgcGF5bG9hZCwgZGVjb2RlIGFuZCBzYXZlIHRoZQogCSAqIGhlYWRlci4KIAkgKi8KLQlpZiAodmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUgPT0gMCkgeworCWlmICh2aWRlby0+YnVsay5oZWFkZXJfc2l6ZSA9PSAwICYmICF2aWRlby0+YnVsay5za2lwX3BheWxvYWQpIHsKIAkJZG8gewogCQkJcmV0ID0gdXZjX3ZpZGVvX2RlY29kZV9zdGFydCh2aWRlbywgYnVmLCBtZW0sIGxlbik7CiAJCQlpZiAocmV0ID09IC1FQUdBSU4pCkBAIC00ODcsMTQgKzU1MCwxMyBAQAogCQkvKiBJZiBhbiBlcnJvciBvY2N1cmVkIHNraXAgdGhlIHJlc3Qgb2YgdGhlIHBheWxvYWQuICovCiAJCWlmIChyZXQgPCAwIHx8IGJ1ZiA9PSBOVUxMKSB7CiAJCQl2aWRlby0+YnVsay5za2lwX3BheWxvYWQgPSAxOwotCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHZpZGVvLT5idWxrLmhlYWRlciwgbWVtLCByZXQpOworCQkJdmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUgPSByZXQ7CisKKwkJCW1lbSArPSByZXQ7CisJCQlsZW4gLT0gcmV0OwogCQl9Ci0KLQkJdmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUgPSByZXQ7Ci0JCW1lbWNweSh2aWRlby0+YnVsay5oZWFkZXIsIG1lbSwgdmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUpOwotCi0JCW1lbSArPSByZXQ7Ci0JCWxlbiAtPSByZXQ7CiAJfQogCiAJLyogVGhlIGJ1ZmZlciBxdWV1ZSBtaWdodCBoYXZlIGJlZW4gY2FuY2VsbGVkIHdoaWxlIGEgYnVsayB0cmFuc2ZlcgpAQCAtNTI1LDYgKzU4Nyw0OCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgdXZjX3ZpZGVvX2VuY29kZV9idWxrKHN0cnVjdCB1cmIgKnVyYiwKKwlzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8sIHN0cnVjdCB1dmNfYnVmZmVyICpidWYpCit7CisJdTggKm1lbSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCBsZW4gPSB2aWRlby0+dXJiX3NpemUsIHJldDsKKworCWlmIChidWYgPT0gTlVMTCkgeworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAwOworCQlyZXR1cm47CisJfQorCisJLyogSWYgdGhlIFVSQiBpcyB0aGUgZmlyc3Qgb2YgaXRzIHBheWxvYWQsIGFkZCB0aGUgaGVhZGVyLiAqLworCWlmICh2aWRlby0+YnVsay5oZWFkZXJfc2l6ZSA9PSAwKSB7CisJCXJldCA9IHV2Y192aWRlb19lbmNvZGVfaGVhZGVyKHZpZGVvLCBidWYsIG1lbSwgbGVuKTsKKwkJdmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUgPSByZXQ7CisJCXZpZGVvLT5idWxrLnBheWxvYWRfc2l6ZSArPSByZXQ7CisJCW1lbSArPSByZXQ7CisJCWxlbiAtPSByZXQ7CisJfQorCisJLyogUHJvY2VzcyB2aWRlbyBkYXRhLiAqLworCXJldCA9IHV2Y192aWRlb19lbmNvZGVfZGF0YSh2aWRlbywgYnVmLCBtZW0sIGxlbik7CisKKwl2aWRlby0+YnVsay5wYXlsb2FkX3NpemUgKz0gcmV0OworCWxlbiAtPSByZXQ7CisKKwlpZiAoYnVmLT5idWYuYnl0ZXN1c2VkID09IHZpZGVvLT5xdWV1ZS5idWZfdXNlZCB8fAorCSAgICB2aWRlby0+YnVsay5wYXlsb2FkX3NpemUgPT0gdmlkZW8tPmJ1bGsubWF4X3BheWxvYWRfc2l6ZSkgeworCQlpZiAoYnVmLT5idWYuYnl0ZXN1c2VkID09IHZpZGVvLT5xdWV1ZS5idWZfdXNlZCkgeworCQkJdmlkZW8tPnF1ZXVlLmJ1Zl91c2VkID0gMDsKKwkJCWJ1Zi0+c3RhdGUgPSBVVkNfQlVGX1NUQVRFX0RPTkU7CisJCQl1dmNfcXVldWVfbmV4dF9idWZmZXIoJnZpZGVvLT5xdWV1ZSwgYnVmKTsKKwkJCXZpZGVvLT5sYXN0X2ZpZCBePSBVVkNfU1RSRUFNX0ZJRDsKKwkJfQorCisJCXZpZGVvLT5idWxrLmhlYWRlcl9zaXplID0gMDsKKwkJdmlkZW8tPmJ1bGsucGF5bG9hZF9zaXplID0gMDsKKwl9CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB2aWRlby0+dXJiX3NpemUgLSBsZW47Cit9CisKIHN0YXRpYyB2b2lkIHV2Y192aWRlb19jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHV2Y192aWRlb19kZXZpY2UgKnZpZGVvID0gdXJiLT5jb250ZXh0OwpAQCAtNzIyLDcgKzgyNiwxNSBAQAogCWlmICh1dmNfYWxsb2NfdXJiX2J1ZmZlcnModmlkZW8sIHNpemUpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKHZpZGVvLT5kZXYtPnVkZXYsIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKCZlcC0+ZGVzYykpCisJCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUodmlkZW8tPmRldi0+dWRldiwKKwkJCQkgICAgICAgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJZWxzZQorCQlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKHZpZGVvLT5kZXYtPnVkZXYsCisJCQkJICAgICAgIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCisJaWYgKHZpZGVvLT5zdHJlYW1pbmctPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCisJCXNpemUgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IFVWQ19VUkJTOyArK2kpIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBnZnBfZmxhZ3MpOwpAQCAtODU0LDcgKzk2Niw3IEBACiAKIAl2aWRlby0+ZnJvemVuID0gMDsKIAotCWlmICgocmV0ID0gdXZjX3NldF92aWRlb19jdHJsKHZpZGVvLCAmdmlkZW8tPnN0cmVhbWluZy0+Y3RybCwgMCkpIDwgMCkgeworCWlmICgocmV0ID0gdXZjX2NvbW1pdF92aWRlbyh2aWRlbywgJnZpZGVvLT5zdHJlYW1pbmctPmN0cmwpKSA8IDApIHsKIAkJdXZjX3F1ZXVlX2VuYWJsZSgmdmlkZW8tPnF1ZXVlLCAwKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC05MzUsMjMgKzEwNDcsMzAgQEAKIAkJCWJyZWFrOwogCX0KIAotCS8qIENvbW1pdCB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gKi8KIAlwcm9iZS0+YkZvcm1hdEluZGV4ID0gZm9ybWF0LT5pbmRleDsKIAlwcm9iZS0+YkZyYW1lSW5kZXggPSBmcmFtZS0+YkZyYW1lSW5kZXg7Ci0JaWYgKChyZXQgPSB1dmNfc2V0X3ZpZGVvX2N0cmwodmlkZW8sIHByb2JlLCAwKSkgPCAwKQotCQlyZXR1cm4gcmV0OwogCiAJdmlkZW8tPnN0cmVhbWluZy0+Y3VyX2Zvcm1hdCA9IGZvcm1hdDsKIAl2aWRlby0+c3RyZWFtaW5nLT5jdXJfZnJhbWUgPSBmcmFtZTsKIAlhdG9taWNfc2V0KCZ2aWRlby0+YWN0aXZlLCAwKTsKIAogCS8qIFNlbGVjdCB0aGUgdmlkZW8gZGVjb2RpbmcgZnVuY3Rpb24gKi8KLQlpZiAodmlkZW8tPmRldi0+cXVpcmtzICYgVVZDX1FVSVJLX0JVSUxUSU5fSVNJR0hUKQotCQl2aWRlby0+ZGVjb2RlID0gdXZjX3ZpZGVvX2RlY29kZV9pc2lnaHQ7Ci0JZWxzZSBpZiAodmlkZW8tPnN0cmVhbWluZy0+aW50Zi0+bnVtX2FsdHNldHRpbmcgPiAxKQotCQl2aWRlby0+ZGVjb2RlID0gdXZjX3ZpZGVvX2RlY29kZV9pc29jOwotCWVsc2UKLQkJdmlkZW8tPmRlY29kZSA9IHV2Y192aWRlb19kZWNvZGVfYnVsazsKKwlpZiAodmlkZW8tPnN0cmVhbWluZy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJaWYgKHZpZGVvLT5kZXYtPnF1aXJrcyAmIFVWQ19RVUlSS19CVUlMVElOX0lTSUdIVCkKKwkJCXZpZGVvLT5kZWNvZGUgPSB1dmNfdmlkZW9fZGVjb2RlX2lzaWdodDsKKwkJZWxzZSBpZiAodmlkZW8tPnN0cmVhbWluZy0+aW50Zi0+bnVtX2FsdHNldHRpbmcgPiAxKQorCQkJdmlkZW8tPmRlY29kZSA9IHV2Y192aWRlb19kZWNvZGVfaXNvYzsKKwkJZWxzZQorCQkJdmlkZW8tPmRlY29kZSA9IHV2Y192aWRlb19kZWNvZGVfYnVsazsKKwl9IGVsc2UgeworCQlpZiAodmlkZW8tPnN0cmVhbWluZy0+aW50Zi0+bnVtX2FsdHNldHRpbmcgPT0gMSkKKwkJCXZpZGVvLT5kZWNvZGUgPSB1dmNfdmlkZW9fZW5jb2RlX2J1bGs7CisJCWVsc2UgeworCQkJdXZjX3ByaW50ayhLRVJOX0lORk8sICJJc29jaHJvbm91cyBlbmRwb2ludHMgYXJlIG5vdCAiCisJCQkJInN1cHBvcnRlZCBmb3IgdmlkZW8gb3V0cHV0IGRldmljZXMuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05NzEsNyArMTA5MCw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmICh2aWRlby0+c3RyZWFtaW5nLT5jdXJfZm9ybWF0LT5mbGFncyAmIFVWQ19GTVRfRkxBR19DT01QUkVTU0VEKQorCWlmICgodmlkZW8tPnN0cmVhbWluZy0+Y3VyX2Zvcm1hdC0+ZmxhZ3MgJiBVVkNfRk1UX0ZMQUdfQ09NUFJFU1NFRCkgfHwKKwkgICAgdXZjX25vX2Ryb3BfcGFyYW0pCiAJCXZpZGVvLT5xdWV1ZS5mbGFncyAmPSB+VVZDX1FVRVVFX0RST1BfSU5DT01QTEVURTsKIAllbHNlCiAJCXZpZGVvLT5xdWV1ZS5mbGFncyB8PSBVVkNfUVVFVUVfRFJPUF9JTkNPTVBMRVRFOwpAQCAtOTc5LDYgKzEwOTksMTAgQEAKIAlpZiAoKHJldCA9IHV2Y19xdWV1ZV9lbmFibGUoJnZpZGVvLT5xdWV1ZSwgMSkpIDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIENvbW1pdCB0aGUgc3RyZWFtaW5nIHBhcmFtZXRlcnMuICovCisJaWYgKChyZXQgPSB1dmNfY29tbWl0X3ZpZGVvKHZpZGVvLCAmdmlkZW8tPnN0cmVhbWluZy0+Y3RybCkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiB1dmNfaW5pdF92aWRlbyh2aWRlbywgR0ZQX0tFUk5FTCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCmluZGV4IDlhNmJjMWEuLjg5NmI3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaApAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KIAotCiAvKgogICogRHluYW1pYyBjb250cm9scwogICovCkBAIC0zMTYsNiArMzE1LDcgQEAKICNkZWZpbmUgVVZDX1FVSVJLX0JVSUxUSU5fSVNJR0hUCTB4MDAwMDAwMDgKICNkZWZpbmUgVVZDX1FVSVJLX1NUUkVBTV9OT19GSUQJCTB4MDAwMDAwMTAKICNkZWZpbmUgVVZDX1FVSVJLX0lHTk9SRV9TRUxFQ1RPUl9VTklUCTB4MDAwMDAwMjAKKyNkZWZpbmUgVVZDX1FVSVJLX1BSVU5FX0NPTlRST0xTCTB4MDAwMDAwNDAKIAogLyogRm9ybWF0IGZsYWdzICovCiAjZGVmaW5lIFVWQ19GTVRfRkxBR19DT01QUkVTU0VECQkweDAwMDAwMDAxCkBAIC0zODMsNiArMzgzLDExIEBACiAKIAlzdHJ1Y3QgdXZjX21lbnVfaW5mbyAqbWVudV9pbmZvOwogCV9fdTMyIG1lbnVfY291bnQ7CisKKwlfX3MzMiAoKmdldCkgKHN0cnVjdCB1dmNfY29udHJvbF9tYXBwaW5nICptYXBwaW5nLCBfX3U4IHF1ZXJ5LAorCQkgICAgICBjb25zdCBfX3U4ICpkYXRhKTsKKwl2b2lkICgqc2V0KSAoc3RydWN0IHV2Y19jb250cm9sX21hcHBpbmcgKm1hcHBpbmcsIF9fczMyIHZhbHVlLAorCQkgICAgIF9fdTggKmRhdGEpOwogfTsKIAogc3RydWN0IHV2Y19jb250cm9sIHsKQEAgLTUyMyw2ICs1MjgsNyBAQAogCV9fdTE2IG1heHBzaXplOwogCiAJc3RydWN0IHV2Y19zdHJlYW1pbmdfaGVhZGVyIGhlYWRlcjsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKIAogCXVuc2lnbmVkIGludCBuZm9ybWF0czsKIAlzdHJ1Y3QgdXZjX2Zvcm1hdCAqZm9ybWF0OwpAQCAtNTU4LDEyICs1NjQsMTUgQEAKICNkZWZpbmUgVVZDX1FVRVVFX0RST1BfSU5DT01QTEVURQkoMSA8PCAyKQogCiBzdHJ1Y3QgdXZjX3ZpZGVvX3F1ZXVlIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwogCXZvaWQgKm1lbTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJX191MzIgc2VxdWVuY2U7CiAKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAJdW5zaWduZWQgaW50IGJ1Zl9zaXplOworCXVuc2lnbmVkIGludCBidWZfdXNlZDsKIAlzdHJ1Y3QgdXZjX2J1ZmZlciBidWZmZXJbVVZDX01BWF9WSURFT19CVUZGRVJTXTsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIHByb3RlY3RzIGJ1ZmZlcnMgYW5kIG1haW5xdWV1ZSAqLwogCXNwaW5sb2NrX3QgaXJxbG9jazsJLyogcHJvdGVjdHMgaXJxcXVldWUgKi8KQEAgLTU3OCw4ICs1ODcsOSBAQAogCWF0b21pY190IGFjdGl2ZTsKIAl1bnNpZ25lZCBpbnQgZnJvemVuIDogMTsKIAotCXN0cnVjdCBsaXN0X2hlYWQgaXRlcm1zOwotCXN0cnVjdCB1dmNfZW50aXR5ICpvdGVybTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGl0ZXJtczsJCS8qIElucHV0IHRlcm1pbmFscyAqLworCXN0cnVjdCB1dmNfZW50aXR5ICpvdGVybTsJCS8qIE91dHB1dCB0ZXJtaW5hbCAqLworCXN0cnVjdCB1dmNfZW50aXR5ICpzdGVybTsJCS8qIFVTQiBzdHJlYW1pbmcgdGVybWluYWwgKi8KIAlzdHJ1Y3QgdXZjX2VudGl0eSAqcHJvY2Vzc2luZzsKIAlzdHJ1Y3QgdXZjX2VudGl0eSAqc2VsZWN0b3I7CiAJc3RydWN0IGxpc3RfaGVhZCBleHRlbnNpb25zOwpAQCAtNjE3LDYgKzYyNyw3IEBACiBzdHJ1Y3QgdXZjX2RldmljZSB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJdW5zaWduZWQgbG9uZyB3YXJuaW5nczsKIAlfX3UzMiBxdWlya3M7CiAJaW50IGludGZudW07CiAJY2hhciBuYW1lWzMyXTsKQEAgLTY3OSw2ICs2OTAsMTAgQEAKICNkZWZpbmUgVVZDX1RSQUNFX1NVU1BFTkQJKDEgPDwgOCkKICNkZWZpbmUgVVZDX1RSQUNFX1NUQVRVUwkoMSA8PCA5KQogCisjZGVmaW5lIFVWQ19XQVJOX01JTk1BWAkJMAorI2RlZmluZSBVVkNfV0FSTl9QUk9CRV9ERUYJMQorCitleHRlcm4gdW5zaWduZWQgaW50IHV2Y19ub19kcm9wX3BhcmFtOwogZXh0ZXJuIHVuc2lnbmVkIGludCB1dmNfdHJhY2VfcGFyYW07CiAKICNkZWZpbmUgdXZjX3RyYWNlKGZsYWcsIG1zZy4uLikgXApAQCAtNjg3LDYgKzcwMiwxMiBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgInV2Y3ZpZGVvOiAiIG1zZyk7IFwKIAl9IHdoaWxlICgwKQogCisjZGVmaW5lIHV2Y193YXJuX29uY2UoZGV2LCB3YXJuLCBtc2cuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHdhcm4sICZkZXYtPndhcm5pbmdzKSkgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAidXZjdmlkZW86ICIgbXNnKTsgXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgdXZjX3ByaW50ayhsZXZlbCwgbXNnLi4uKSBcCiAJcHJpbnRrKGxldmVsICJ1dmN2aWRlbzogIiBtc2cpCiAKQEAgLTcwOSw3ICs3MzAsOCBAQAogZXh0ZXJuIHZvaWQgdXZjX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZik7CiAKIC8qIFZpZGVvIGJ1ZmZlcnMgcXVldWUgbWFuYWdlbWVudC4gKi8KLWV4dGVybiB2b2lkIHV2Y19xdWV1ZV9pbml0KHN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlKTsKK2V4dGVybiB2b2lkIHV2Y19xdWV1ZV9pbml0KHN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlLAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSk7CiBleHRlcm4gaW50IHV2Y19hbGxvY19idWZmZXJzKHN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlLAogCQl1bnNpZ25lZCBpbnQgbmJ1ZmZlcnMsIHVuc2lnbmVkIGludCBidWZsZW5ndGgpOwogZXh0ZXJuIGludCB1dmNfZnJlZV9idWZmZXJzKHN0cnVjdCB1dmNfdmlkZW9fcXVldWUgKnF1ZXVlKTsKQEAgLTc0MCwxMCArNzYyLDEwIEBACiBleHRlcm4gaW50IHV2Y192aWRlb19lbmFibGUoc3RydWN0IHV2Y192aWRlb19kZXZpY2UgKnZpZGVvLCBpbnQgZW5hYmxlKTsKIGV4dGVybiBpbnQgdXZjX3Byb2JlX3ZpZGVvKHN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbywKIAkJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCAqcHJvYmUpOworZXh0ZXJuIGludCB1dmNfY29tbWl0X3ZpZGVvKHN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbywKKwkJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCAqY3RybCk7CiBleHRlcm4gaW50IHV2Y19xdWVyeV9jdHJsKHN0cnVjdCB1dmNfZGV2aWNlICpkZXYsIF9fdTggcXVlcnksIF9fdTggdW5pdCwKIAkJX191OCBpbnRmbnVtLCBfX3U4IGNzLCB2b2lkICpkYXRhLCBfX3UxNiBzaXplKTsKLWV4dGVybiBpbnQgdXZjX3NldF92aWRlb19jdHJsKHN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbywKLQkJc3RydWN0IHV2Y19zdHJlYW1pbmdfY29udHJvbCAqY3RybCwgaW50IHByb2JlKTsKIAogLyogU3RhdHVzICovCiBleHRlcm4gaW50IHV2Y19zdGF0dXNfaW5pdChzdHJ1Y3QgdXZjX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwppbmRleCA4NDY3NjNkLi5jNjc2YjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCkBAIC0yOCw3ICsyOCw3IEBACiAgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICogQXV0aG9yOglBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKiBGaXhlczoKICAqLwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2RlZmluZSBfX09MRF9WSURJT0NfIC8qIFRvIGFsbG93IGZpeGluZyBvbGQgY2FsbHMqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgpAQCAtMzIwLDYgKzMyMSwxOSBAQAogCQkiUHJpdmF0ZSBwYWNrZXQsIElWVFYgZm9ybWF0IiwKIAkJTlVMTAogCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNhbWVyYV9wb3dlcl9saW5lX2ZyZXF1ZW5jeVtdID0geworCQkiRGlzYWJsZWQiLAorCQkiNTAgSHoiLAorCQkiNjAgSHoiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY2FtZXJhX2V4cG9zdXJlX2F1dG9bXSA9IHsKKwkJIkF1dG8gTW9kZSIsCisJCSJNYW51YWwgTW9kZSIsCisJCSJTaHV0dGVyIFByaW9yaXR5IE1vZGUiLAorCQkiQXBlcnR1cmUgUHJpb3JpdHkgTW9kZSIsCisJCU5VTEwKKwl9OwogCiAJc3dpdGNoIChpZCkgewogCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKQEAgLTM1Miw2ICszNjYsMTAgQEAKIAkJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOwogCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CiAJCQlyZXR1cm4gbXBlZ19zdHJlYW1fdmJpX2ZtdDsKKwkJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWToKKwkJCXJldHVybiBjYW1lcmFfcG93ZXJfbGluZV9mcmVxdWVuY3k7CisJCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJCXJldHVybiBjYW1lcmFfZXhwb3N1cmVfYXV0bzsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBOVUxMOwogCX0KQEAgLTM2MywxNyArMzgxLDM3IEBACiB7CiAJc3dpdGNoIChpZCkgewogCS8qIFVTRVIgY29udHJvbHMgKi8KLQljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6IAlyZXR1cm4gIlVzZXIgQ29udHJvbHMiOwotCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOiAJcmV0dXJuICJWb2x1bWUiOwotCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogCXJldHVybiAiTXV0ZSI7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOiAJcmV0dXJuICJCYWxhbmNlIjsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6IAlyZXR1cm4gIkJhc3MiOwotCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOiAJcmV0dXJuICJUcmVibGUiOwotCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6IAlyZXR1cm4gIkxvdWRuZXNzIjsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6IAlyZXR1cm4gIkJyaWdodG5lc3MiOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6IAlyZXR1cm4gIkNvbnRyYXN0IjsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IAlyZXR1cm4gIlNhdHVyYXRpb24iOwotCWNhc2UgVjRMMl9DSURfSFVFOiAJCXJldHVybiAiSHVlIjsKKwljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6IAkJcmV0dXJuICJVc2VyIENvbnRyb2xzIjsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogCQlyZXR1cm4gIlZvbHVtZSI7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiAJCXJldHVybiAiTXV0ZSI7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOiAJCXJldHVybiAiQmFsYW5jZSI7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOiAJCXJldHVybiAiQmFzcyI7CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6IAkJcmV0dXJuICJUcmVibGUiOworCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6IAkJcmV0dXJuICJMb3VkbmVzcyI7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiAJCXJldHVybiAiQnJpZ2h0bmVzcyI7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogCQlyZXR1cm4gIkNvbnRyYXN0IjsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IAkJcmV0dXJuICJTYXR1cmF0aW9uIjsKKwljYXNlIFY0TDJfQ0lEX0hVRTogCQkJcmV0dXJuICJIdWUiOworCWNhc2UgVjRMMl9DSURfQkxBQ0tfTEVWRUw6CQlyZXR1cm4gIkJsYWNrIExldmVsIjsKKwljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToJcmV0dXJuICJXaGl0ZSBCYWxhbmNlLCBBdXRvbWF0aWMiOworCWNhc2UgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRToJCXJldHVybiAiRG8gV2hpdGUgQmFsYW5jZSI7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToJCXJldHVybiAiUmVkIEJhbGFuY2UiOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgkJcmV0dXJuICJCbHVlIEJhbGFuY2UiOworCWNhc2UgVjRMMl9DSURfR0FNTUE6CQkJcmV0dXJuICJHYW1tYSI7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToJCQlyZXR1cm4gIkV4cG9zdXJlIjsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgkJCXJldHVybiAiR2FpbiwgQXV0b21hdGljIjsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CQkJcmV0dXJuICJHYWluIjsKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgkJCXJldHVybiAiSG9yaXpvbnRhbCBGbGlwIjsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgkJCXJldHVybiAiVmVydGljYWwgRmxpcCI7CisJY2FzZSBWNEwyX0NJRF9IQ0VOVEVSOgkJCXJldHVybiAiSG9yaXpvbnRhbCBDZW50ZXIiOworCWNhc2UgVjRMMl9DSURfVkNFTlRFUjoJCQlyZXR1cm4gIlZlcnRpY2FsIENlbnRlciI7CisJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWToJcmV0dXJuICJQb3dlciBMaW5lIEZyZXF1ZW5jeSI7CisJY2FzZSBWNEwyX0NJRF9IVUVfQVVUTzoJCQlyZXR1cm4gIkh1ZSwgQXV0b21hdGljIjsKKwljYXNlIFY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkU6IHJldHVybiAiV2hpdGUgQmFsYW5jZSBUZW1wZXJhdHVyZSI7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CQlyZXR1cm4gIlNoYXJwbmVzcyI7CisJY2FzZSBWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OOglyZXR1cm4gIkJhY2tsaWdodCBDb21wZW5zYXRpb24iOworCWNhc2UgVjRMMl9DSURfQ0hST01BX0FHQzoJCXJldHVybiAiQ2hyb21hIEFHQyI7CisJY2FzZSBWNEwyX0NJRF9DT0xPUl9LSUxMRVI6CQlyZXR1cm4gIkNvbG9yIEtpbGxlciI7CiAKIAkvKiBNUEVHIGNvbnRyb2xzICovCiAJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOiAJCXJldHVybiAiTVBFRyBFbmNvZGVyIENvbnRyb2xzIjsKQEAgLTQxMCw2ICs0NDgsMjUgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTzogcmV0dXJuICJTdHJlYW0gUEVTIFZpZGVvIElEIjsKIAljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CXJldHVybiAiU3RyZWFtIFZCSSBGb3JtYXQiOwogCisJLyogQ0FNRVJBIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1M6CQlyZXR1cm4gIkNhbWVyYSBDb250cm9scyI7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgkJcmV0dXJuICJBdXRvIEV4cG9zdXJlIjsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFOglyZXR1cm4gIkV4cG9zdXJlIFRpbWUsIEFic29sdXRlIjsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFk6CXJldHVybiAiRXhwb3N1cmUsIER5bmFtaWMgRnJhbWVyYXRlIjsKKwljYXNlIFY0TDJfQ0lEX1BBTl9SRUxBVElWRToJCXJldHVybiAiUGFuLCBSZWxhdGl2ZSI7CisJY2FzZSBWNEwyX0NJRF9USUxUX1JFTEFUSVZFOgkJcmV0dXJuICJUaWx0LCBSZWxhdGl2ZSI7CisJY2FzZSBWNEwyX0NJRF9QQU5fUkVTRVQ6CQlyZXR1cm4gIlBhbiwgUmVzZXQiOworCWNhc2UgVjRMMl9DSURfVElMVF9SRVNFVDoJCXJldHVybiAiVGlsdCwgUmVzZXQiOworCWNhc2UgVjRMMl9DSURfUEFOX0FCU09MVVRFOgkJcmV0dXJuICJQYW4sIEFic29sdXRlIjsKKwljYXNlIFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEU6CQlyZXR1cm4gIlRpbHQsIEFic29sdXRlIjsKKwljYXNlIFY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFOgkJcmV0dXJuICJGb2N1cywgQWJzb2x1dGUiOworCWNhc2UgVjRMMl9DSURfRk9DVVNfUkVMQVRJVkU6CQlyZXR1cm4gIkZvY3VzLCBSZWxhdGl2ZSI7CisJY2FzZSBWNEwyX0NJRF9GT0NVU19BVVRPOgkJcmV0dXJuICJGb2N1cywgQXV0b21hdGljIjsKKwljYXNlIFY0TDJfQ0lEX1pPT01fQUJTT0xVVEU6CQlyZXR1cm4gIlpvb20sIEFic29sdXRlIjsKKwljYXNlIFY0TDJfQ0lEX1pPT01fUkVMQVRJVkU6CQlyZXR1cm4gIlpvb20sIFJlbGF0aXZlIjsKKwljYXNlIFY0TDJfQ0lEX1pPT01fQ09OVElOVU9VUzoJCXJldHVybiAiWm9vbSwgQ29udGludW91cyI7CisJY2FzZSBWNEwyX0NJRF9QUklWQUNZOgkJCXJldHVybiAiUHJpdmFjeSI7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00MjgsMTQgKzQ4NSwyMiBAQAogCXN3aXRjaCAocWN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJY2FzZSBWNEwyX0NJRF9IVUVfQVVUTzoKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURToKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURToKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgorCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWToKKwljYXNlIFY0TDJfQ0lEX1BSSVZBQ1k6CiAJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjsKIAkJbWluID0gMDsKIAkJbWF4ID0gc3RlcCA9IDE7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1k6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOgpAQCAtNDUxLDEwICs1MTYsMTIgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgogCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKIAljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CiAJCXN0ZXAgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6CisJY2FzZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1M6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgogCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M7CiAJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7CkBAIC04MDEsNCArODY4LDExNiBAQAogCXJldHVybiBlcnIgIT0gLUVOT01FTSA/IDAgOiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfaTJjX2F0dGFjaCk7CisKK3ZvaWQgdjRsMl9pMmNfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyAqb3BzKQoreworCXY0bDJfc3ViZGV2X2luaXQoc2QsIG9wcyk7CisJLyogdGhlIG93bmVyIGlzIHRoZSBzYW1lIGFzIHRoZSBpMmNfY2xpZW50J3MgZHJpdmVyIG93bmVyICovCisJc2QtPm93bmVyID0gY2xpZW50LT5kcml2ZXItPmRyaXZlci5vd25lcjsKKwkvKiBpMmNfY2xpZW50IGFuZCB2NGwyX3N1YmRldiBwb2ludCB0byBvbmUgYW5vdGhlciAqLworCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGNsaWVudCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc2QpOworCS8qIGluaXRpYWxpemUgbmFtZSAqLworCXNucHJpbnRmKHNkLT5uYW1lLCBzaXplb2Yoc2QtPm5hbWUpLCAiJXMgJWQtJTA0eCIsCisJCWNsaWVudC0+ZHJpdmVyLT5kcml2ZXIubmFtZSwgaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwKKwkJY2xpZW50LT5hZGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfaTJjX3N1YmRldl9pbml0KTsKKworCisKKy8qIExvYWQgYW4gaTJjIHN1Yi1kZXZpY2UuIEl0IGFzc3VtZXMgdGhhdCBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpCisgICByZXR1cm5zIHRoZSB2NGwyX2RldmljZSBhbmQgdGhhdCBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KQorICAgcmV0dXJucyB0aGUgdjRsMl9zdWJkZXYuICovCitzdHJ1Y3QgdjRsMl9zdWJkZXYgKnY0bDJfaTJjX25ld19zdWJkZXYoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQljb25zdCBjaGFyICptb2R1bGVfbmFtZSwgY29uc3QgY2hhciAqY2xpZW50X3R5cGUsIHU4IGFkZHIpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBOVUxMOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisKKwlCVUdfT04oIWRldik7CisjaWZkZWYgTU9EVUxFCisJaWYgKG1vZHVsZV9uYW1lKQorCQlyZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFtZSk7CisjZW5kaWYKKwkvKiBTZXR1cCB0aGUgaTJjIGJvYXJkIGluZm8gd2l0aCB0aGUgZGV2aWNlIHR5cGUgYW5kCisJICAgdGhlIGRldmljZSBhZGRyZXNzLiAqLworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlzdHJsY3B5KGluZm8udHlwZSwgY2xpZW50X3R5cGUsIHNpemVvZihpbmZvLnR5cGUpKTsKKwlpbmZvLmFkZHIgPSBhZGRyOworCisJLyogQ3JlYXRlIHRoZSBpMmMgY2xpZW50ICovCisJY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmluZm8pOworCS8qIE5vdGU6IGl0IGlzIHBvc3NpYmxlIGluIHRoZSBmdXR1cmUgdGhhdAorCSAgIGMtPmRyaXZlciBpcyBOVUxMIGlmIHRoZSBkcml2ZXIgaXMgc3RpbGwgYmVpbmcgbG9hZGVkLgorCSAgIFdlIG5lZWQgYmV0dGVyIHN1cHBvcnQgZnJvbSB0aGUga2VybmVsIHNvIHRoYXQgd2UKKwkgICBjYW4gZWFzaWx5IHdhaXQgZm9yIHRoZSBsb2FkIHRvIGZpbmlzaC4gKi8KKwlpZiAoY2xpZW50ID09IE5VTEwgfHwgY2xpZW50LT5kcml2ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBMb2NrIHRoZSBtb2R1bGUgc28gd2UgY2FuIHNhZmVseSBnZXQgdGhlIHY0bDJfc3ViZGV2IHBvaW50ZXIgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIub3duZXIpKQorCQlyZXR1cm4gTlVMTDsKKwlzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJLyogUmVnaXN0ZXIgd2l0aCB0aGUgdjRsMl9kZXZpY2Ugd2hpY2ggaW5jcmVhc2VzIHRoZSBtb2R1bGUncworCSAgIHVzZSBjb3VudCBhcyB3ZWxsLiAqLworCWlmICh2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoZGV2LCBzZCkpCisJCXNkID0gTlVMTDsKKwkvKiBEZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCB0byBtYXRjaCB0aGUgZmlyc3QgdHJ5X21vZHVsZV9nZXQuICovCisJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKKwlyZXR1cm4gc2Q7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfaTJjX25ld19zdWJkZXYpOworCisvKiBQcm9iZSBhbmQgbG9hZCBhbiBpMmMgc3ViLWRldmljZS4gSXQgYXNzdW1lcyB0aGF0IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcikKKyAgIHJldHVybnMgdGhlIHY0bDJfZGV2aWNlIGFuZCB0aGF0IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpCisgICByZXR1cm5zIHRoZSB2NGwyX3N1YmRldi4gKi8KK3N0cnVjdCB2NGwyX3N1YmRldiAqdjRsMl9pMmNfbmV3X3Byb2JlZF9zdWJkZXYoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCBjaGFyICpjbGllbnRfdHlwZSwKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqYWRkcnMpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBOVUxMOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBOVUxMOworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCisJQlVHX09OKCFkZXYpOworI2lmZGVmIE1PRFVMRQorCWlmIChtb2R1bGVfbmFtZSkKKwkJcmVxdWVzdF9tb2R1bGUobW9kdWxlX25hbWUpOworI2VuZGlmCisJLyogU2V0dXAgdGhlIGkyYyBib2FyZCBpbmZvIHdpdGggdGhlIGRldmljZSB0eXBlIGFuZAorCSAgIHRoZSBkZXZpY2UgYWRkcmVzcy4gKi8KKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJc3RybGNweShpbmZvLnR5cGUsIGNsaWVudF90eXBlLCBzaXplb2YoaW5mby50eXBlKSk7CisKKwkvKiBQcm9iZSBhbmQgY3JlYXRlIHRoZSBpMmMgY2xpZW50ICovCisJY2xpZW50ID0gaTJjX25ld19wcm9iZWRfZGV2aWNlKGFkYXB0ZXIsICZpbmZvLCBhZGRycyk7CisJLyogTm90ZTogaXQgaXMgcG9zc2libGUgaW4gdGhlIGZ1dHVyZSB0aGF0CisJICAgYy0+ZHJpdmVyIGlzIE5VTEwgaWYgdGhlIGRyaXZlciBpcyBzdGlsbCBiZWluZyBsb2FkZWQuCisJICAgV2UgbmVlZCBiZXR0ZXIgc3VwcG9ydCBmcm9tIHRoZSBrZXJuZWwgc28gdGhhdCB3ZQorCSAgIGNhbiBlYXNpbHkgd2FpdCBmb3IgdGhlIGxvYWQgdG8gZmluaXNoLiAqLworCWlmIChjbGllbnQgPT0gTlVMTCB8fCBjbGllbnQtPmRyaXZlciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIExvY2sgdGhlIG1vZHVsZSBzbyB3ZSBjYW4gc2FmZWx5IGdldCB0aGUgdjRsMl9zdWJkZXYgcG9pbnRlciAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoY2xpZW50LT5kcml2ZXItPmRyaXZlci5vd25lcikpCisJCXJldHVybiBOVUxMOworCXNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwkvKiBSZWdpc3RlciB3aXRoIHRoZSB2NGwyX2RldmljZSB3aGljaCBpbmNyZWFzZXMgdGhlIG1vZHVsZSdzCisJICAgdXNlIGNvdW50IGFzIHdlbGwuICovCisJaWYgKHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldihkZXYsIHNkKSkKKwkJc2QgPSBOVUxMOworCS8qIERlY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50IHRvIG1hdGNoIHRoZSBmaXJzdCB0cnlfbW9kdWxlX2dldC4gKi8KKwltb2R1bGVfcHV0KGNsaWVudC0+ZHJpdmVyLT5kcml2ZXIub3duZXIpOworCXJldHVybiBzZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfaTJjX25ld19wcm9iZWRfc3ViZGV2KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTFiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYwpAQCAtMCwwICsxLDEwODIgQEAKKy8qCisgKiBpb2N0bDMyLmM6IENvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQgbmF0aXZlIGlvY3Rscy4KKyAqCVNlcGFyYXRlZCBmcm9tIGZzIHN0dWZmIGJ5IEFybmQgQmVyZ21hbm4gPGFybmRAYXJuZGIuZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk4ICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBBbmRpIEtsZWVuLCBTdVNFIExhYnMKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgUGhpbGlwcGUgRGUgTXV5dGVyIChwaGRtQG1hY3FlbC5iZSkKKyAqIENvcHlyaWdodCAoQykgMjAwOCAgICAgICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYWludGFpbiBhcmd1bWVudCBzaXplIGNvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQKKyAqIGlvY3Rscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjZGVmaW5lIF9fT0xEX1ZJRElPQ18gLyogVG8gYWxsb3cgZml4aW5nIG9sZCBjYWxscyovCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAorc3RydWN0IHZpZGVvX3R1bmVyMzIgeworCWNvbXBhdF9pbnRfdCB0dW5lcjsKKwljaGFyIG5hbWVbMzJdOworCWNvbXBhdF91bG9uZ190IHJhbmdlbG93LCByYW5nZWhpZ2g7CisJdTMyIGZsYWdzOwkvKiBJdCBpcyByZWFsbHkgdTMyIGluIHZpZGVvZGV2LmggKi8KKwl1MTYgbW9kZSwgc2lnbmFsOworfTsKKworc3RhdGljIGludCBnZXRfdmlkZW9fdHVuZXIzMihzdHJ1Y3QgdmlkZW9fdHVuZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb190dW5lcjMyKSkgfHwKKwkJZ2V0X3VzZXIoa3AtPnR1bmVyLCAmdXAtPnR1bmVyKSB8fAorCQljb3B5X2Zyb21fdXNlcihrcC0+bmFtZSwgdXAtPm5hbWUsIDMyKSB8fAorCQlnZXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpIHx8CisJCWdldF91c2VyKGtwLT5yYW5nZWhpZ2gsICZ1cC0+cmFuZ2VoaWdoKSB8fAorCQlnZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJCWdldF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpIHx8CisJCWdldF91c2VyKGtwLT5zaWduYWwsICZ1cC0+c2lnbmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3R1bmVyMzIpKSB8fAorCQlwdXRfdXNlcihrcC0+dHVuZXIsICZ1cC0+dHVuZXIpIHx8CisJCWNvcHlfdG9fdXNlcih1cC0+bmFtZSwga3AtPm5hbWUsIDMyKSB8fAorCQlwdXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpIHx8CisJCXB1dF91c2VyKGtwLT5yYW5nZWhpZ2gsICZ1cC0+cmFuZ2VoaWdoKSB8fAorCQlwdXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJCXB1dF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpIHx8CisJCXB1dF91c2VyKGtwLT5zaWduYWwsICZ1cC0+c2lnbmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIgeworCWNvbXBhdF9jYWRkcl90IGJhc2U7CisJY29tcGF0X2ludF90IGhlaWdodCwgd2lkdGgsIGRlcHRoLCBieXRlc3BlcmxpbmU7Cit9OworCitzdGF0aWMgaW50IGdldF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIzMikpIHx8CisJCWdldF91c2VyKHRtcCwgJnVwLT5iYXNlKSB8fAorCQlnZXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCkgfHwKKwkJZ2V0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKSB8fAorCQlnZXRfdXNlcihrcC0+ZGVwdGgsICZ1cC0+ZGVwdGgpIHx8CisJCWdldF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJLyogVGhpcyBpcyBhY3R1YWxseSBhIHBoeXNpY2FsIGFkZHJlc3Mgc3RvcmVkCisJICogYXMgYSB2b2lkIHBvaW50ZXIuCisJICovCisJa3AtPmJhc2UgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSB0bXA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfdmlkZW9fYnVmZmVyMzIoc3RydWN0IHZpZGVvX2J1ZmZlciAqa3AsIHN0cnVjdCB2aWRlb19idWZmZXIzMiBfX3VzZXIgKnVwKQoreworCXUzMiB0bXAgPSAodTMyKSgodW5zaWduZWQgbG9uZylrcC0+YmFzZSk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2J1ZmZlcjMyKSkgfHwKKwkJcHV0X3VzZXIodG1wLCAmdXAtPmJhc2UpIHx8CisJCXB1dF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KSB8fAorCQlwdXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpIHx8CisJCXB1dF91c2VyKGtwLT5kZXB0aCwgJnVwLT5kZXB0aCkgfHwKKwkJcHV0X3VzZXIoa3AtPmJ5dGVzcGVybGluZSwgJnVwLT5ieXRlc3BlcmxpbmUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2aWRlb19jbGlwMzIgeworCXMzMiB4LCB5LCB3aWR0aCwgaGVpZ2h0OwkvKiBJdCdzIHJlYWxseSBzMzIgaW4gdmlkZW9kZXYuaCAqLworCWNvbXBhdF9jYWRkcl90IG5leHQ7Cit9OworCitzdHJ1Y3QgdmlkZW9fd2luZG93MzIgeworCXUzMiB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFrZXksIGZsYWdzOworCWNvbXBhdF9jYWRkcl90IGNsaXBzOworCWNvbXBhdF9pbnRfdCBjbGlwY291bnQ7Cit9OworCitzdGF0aWMgaW50IGdldF92aWRlb193aW5kb3czMihzdHJ1Y3QgdmlkZW9fd2luZG93ICprcCwgc3RydWN0IHZpZGVvX3dpbmRvdzMyIF9fdXNlciAqdXApCit7CisJc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICp1Y2xpcHM7CisJc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICprY2xpcHM7CisJY29tcGF0X2NhZGRyX3QgcDsKKwlpbnQgbmNsaXBzOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdzMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKG5jbGlwcywgJnVwLT5jbGlwY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb193aW5kb3czMikpIHx8CisJICAgIGdldF91c2VyKGtwLT54LCAmdXAtPngpIHx8CisJICAgIGdldF91c2VyKGtwLT55LCAmdXAtPnkpIHx8CisJICAgIGdldF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCkgfHwKKwkgICAgZ2V0X3VzZXIoa3AtPmhlaWdodCwgJnVwLT5oZWlnaHQpIHx8CisJICAgIGdldF91c2VyKGtwLT5jaHJvbWFrZXksICZ1cC0+Y2hyb21ha2V5KSB8fAorCSAgICBnZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpIHx8CisJICAgIGdldF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwluY2xpcHMgPSBrcC0+Y2xpcGNvdW50OworCWtwLT5jbGlwcyA9IE5VTEw7CisKKwlpZiAobmNsaXBzID09IDApCisJCXJldHVybiAwOworCWlmIChnZXRfdXNlcihwLCAmdXAtPmNsaXBzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdWNsaXBzID0gY29tcGF0X3B0cihwKTsKKworCS8qIElmIG5jbGlwcyA8IDAsIHRoZW4gaXQgaXMgYSBjbGlwcGluZyBiaXRtYXAgb2Ygc2l6ZQorCSAgIFZJREVPX0NMSVBNQVBfU0laRSAqLworCWlmIChuY2xpcHMgPCAwKSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1Y2xpcHMsIFZJREVPX0NMSVBNQVBfU0laRSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJa3AtPmNsaXBzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UoVklERU9fQ0xJUE1BUF9TSVpFKTsKKwkJaWYgKGNvcHlfaW5fdXNlcihrcC0+Y2xpcHMsIHVjbGlwcywgVklERU9fQ0xJUE1BUF9TSVpFKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPdGhlcndpc2UgaXQgaXMgYW4gYXJyYXkgb2YgdmlkZW9fY2xpcCBzdHJ1Y3RzLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1Y2xpcHMsIG5jbGlwcyAqIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWtwLT5jbGlwcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5jbGlwcyAqIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkpOworCWtjbGlwcyA9IGtwLT5jbGlwczsKKwl3aGlsZSAobmNsaXBzLS0pIHsKKwkJaW50IGVycjsKKworCQllcnIgPSBjb3B5X2luX3VzZXIoJmtjbGlwcy0+eCwgJnVjbGlwcy0+eCwgc2l6ZW9mKGtjbGlwcy0+eCkpOworCQllcnIgfD0gY29weV9pbl91c2VyKCZrY2xpcHMtPnksICZ1Y2xpcHMtPnksIHNpemVvZihrY2xpcHMtPnkpKTsKKwkJZXJyIHw9IGNvcHlfaW5fdXNlcigma2NsaXBzLT53aWR0aCwgJnVjbGlwcy0+d2lkdGgsIHNpemVvZihrY2xpcHMtPndpZHRoKSk7CisJCWVyciB8PSBjb3B5X2luX3VzZXIoJmtjbGlwcy0+aGVpZ2h0LCAmdWNsaXBzLT5oZWlnaHQsIHNpemVvZihrY2xpcHMtPmhlaWdodCkpOworCQlrY2xpcHMtPm5leHQgPSBOVUxMOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWtjbGlwcysrOworCQl1Y2xpcHMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFlvdSBnZXQgYmFjayBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgY2xpcHMuLi4gKi8KK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3dpbmRvdzMyKHN0cnVjdCB2aWRlb193aW5kb3cgKmtwLCBzdHJ1Y3QgdmlkZW9fd2luZG93MzIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdzMyKSkgfHwKKwkJcHV0X3VzZXIoa3AtPngsICZ1cC0+eCkgfHwKKwkJcHV0X3VzZXIoa3AtPnksICZ1cC0+eSkgfHwKKwkJcHV0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKSB8fAorCQlwdXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCkgfHwKKwkJcHV0X3VzZXIoa3AtPmNocm9tYWtleSwgJnVwLT5jaHJvbWFrZXkpIHx8CisJCXB1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykgfHwKKwkJcHV0X3VzZXIoa3AtPmNsaXBjb3VudCwgJnVwLT5jbGlwY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2aWRlb19jb2RlMzIgeworCWNoYXIJCWxvYWR3aGF0WzE2XTsJLyogbmFtZSBvciB0YWcgb2YgZmlsZSBiZWluZyBwYXNzZWQgKi8KKwljb21wYXRfaW50X3QJZGF0YXNpemU7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKK307CisKK3N0YXRpYyBpbnQgZ2V0X21pY3JvY29kZTMyKHN0cnVjdCB2aWRlb19jb2RlICprcCwgc3RydWN0IHZpZGVvX2NvZGUzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jb2RlMzIpKSB8fAorCQljb3B5X2Zyb21fdXNlcihrcC0+bG9hZHdoYXQsIHVwLT5sb2Fkd2hhdCwgc2l6ZW9mKHVwLT5sb2Fkd2hhdCkpIHx8CisJCWdldF91c2VyKGtwLT5kYXRhc2l6ZSwgJnVwLT5kYXRhc2l6ZSkgfHwKKwkJY29weV9mcm9tX3VzZXIoa3AtPmRhdGEsIHVwLT5kYXRhLCB1cC0+ZGF0YXNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVklESU9DR1RVTkVSMzIJCV9JT1dSKCd2JywgNCwgc3RydWN0IHZpZGVvX3R1bmVyMzIpCisjZGVmaW5lIFZJRElPQ1NUVU5FUjMyCQlfSU9XKCd2JywgNSwgc3RydWN0IHZpZGVvX3R1bmVyMzIpCisjZGVmaW5lIFZJRElPQ0dXSU4zMgkJX0lPUigndicsIDksIHN0cnVjdCB2aWRlb193aW5kb3czMikKKyNkZWZpbmUgVklESU9DU1dJTjMyCQlfSU9XKCd2JywgMTAsIHN0cnVjdCB2aWRlb193aW5kb3czMikKKyNkZWZpbmUgVklESU9DR0ZCVUYzMgkJX0lPUigndicsIDExLCBzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIpCisjZGVmaW5lIFZJRElPQ1NGQlVGMzIJCV9JT1coJ3YnLCAxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NHRlJFUTMyCQlfSU9SKCd2JywgMTQsIHUzMikKKyNkZWZpbmUgVklESU9DU0ZSRVEzMgkJX0lPVygndicsIDE1LCB1MzIpCisjZGVmaW5lIFZJRElPQ1NNSUNST0NPREUzMglfSU9XKCd2JywgMjcsIHN0cnVjdCB2aWRlb19jb2RlMzIpCisKKyNkZWZpbmUgVklESU9DQ0FQVFVSRTMyCQlfSU9XKCd2JywgOCwgczMyKQorI2RlZmluZSBWSURJT0NTWU5DMzIJCV9JT1coJ3YnLCAxOCwgczMyKQorI2RlZmluZSBWSURJT0NTV1JJVEVNT0RFMzIJX0lPVygndicsIDI1LCBzMzIpCisKKyNlbmRpZgorCitzdGF0aWMgaW50IG5hdGl2ZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKworCWlmIChmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkKKwkJcmV0ID0gZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCWVsc2UgaWYgKGZpbGUtPmZfb3AtPmlvY3RsKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IGZpbGUtPmZfb3AtPmlvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RydWN0IHY0bDJfY2xpcDMyIHsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOworCWNvbXBhdF9jYWRkcl90IAkJbmV4dDsKK307CisKK3N0cnVjdCB2NGwyX3dpbmRvdzMyIHsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICB3OworCWVudW0gdjRsMl9maWVsZCAgCWZpZWxkOworCV9fdTMyCQkJY2hyb21ha2V5OworCWNvbXBhdF9jYWRkcl90CQljbGlwczsgLyogYWN0dWFsbHkgc3RydWN0IHY0bDJfY2xpcDMyICogKi8KKwlfX3UzMgkJCWNsaXBjb3VudDsKKwljb21wYXRfY2FkZHJfdAkJYml0bWFwOworfTsKKworc3RhdGljIGludCBnZXRfdjRsMl93aW5kb3czMihzdHJ1Y3QgdjRsMl93aW5kb3cgKmtwLCBzdHJ1Y3QgdjRsMl93aW5kb3czMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3dpbmRvdzMyKSkgfHwKKwkJY29weV9mcm9tX3VzZXIoJmtwLT53LCAmdXAtPncsIHNpemVvZih1cC0+dykpIHx8CisJCWdldF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKKwkJZ2V0X3VzZXIoa3AtPmNocm9tYWtleSwgJnVwLT5jaHJvbWFrZXkpIHx8CisJCWdldF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCWlmIChrcC0+Y2xpcGNvdW50ID4gMjA0OCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtwLT5jbGlwY291bnQpIHsKKwkJc3RydWN0IHY0bDJfY2xpcDMyIF9fdXNlciAqdWNsaXBzOworCQlzdHJ1Y3QgdjRsMl9jbGlwIF9fdXNlciAqa2NsaXBzOworCQlpbnQgbiA9IGtwLT5jbGlwY291bnQ7CisJCWNvbXBhdF9jYWRkcl90IHA7CisKKwkJaWYgKGdldF91c2VyKHAsICZ1cC0+Y2xpcHMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXVjbGlwcyA9IGNvbXBhdF9wdHIocCk7CisJCWtjbGlwcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG4gKiBzaXplb2Yoc3RydWN0IHY0bDJfY2xpcCkpOworCQlrcC0+Y2xpcHMgPSBrY2xpcHM7CisJCXdoaWxlICgtLW4gPj0gMCkgeworCQkJaWYgKGNvcHlfaW5fdXNlcigma2NsaXBzLT5jLCAmdWNsaXBzLT5jLCBzaXplb2YodWNsaXBzLT5jKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocHV0X3VzZXIobiA/IGtjbGlwcyArIDEgOiBOVUxMLCAma2NsaXBzLT5uZXh0KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVjbGlwcyArPSAxOworCQkJa2NsaXBzICs9IDE7CisJCX0KKwl9IGVsc2UKKwkJa3AtPmNsaXBzID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfdjRsMl93aW5kb3czMihzdHJ1Y3QgdjRsMl93aW5kb3cgKmtwLCBzdHJ1Y3QgdjRsMl93aW5kb3czMiBfX3VzZXIgKnVwKQoreworCWlmIChjb3B5X3RvX3VzZXIoJnVwLT53LCAma3AtPncsIHNpemVvZih1cC0+dykpIHx8CisJCXB1dF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKKwkJcHV0X3VzZXIoa3AtPmNocm9tYWtleSwgJnVwLT5jaHJvbWFrZXkpIHx8CisJCXB1dF91c2VyKGtwLT5jbGlwY291bnQsICZ1cC0+Y2xpcGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfdjRsMl9waXhfZm9ybWF0KHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IF9fdXNlciAqdXApCit7CisJaWYgKGNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB1dF92NGwyX3BpeF9mb3JtYXQoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgX191c2VyICp1cCkKK3sKKwlpZiAoY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX3ZiaV9mb3JtYXQoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgX191c2VyICp1cCkKK3sKKwlpZiAoY29weV9mcm9tX3VzZXIoa3AsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHV0X3Y0bDJfdmJpX2Zvcm1hdChzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCBfX3VzZXIgKnVwKQoreworCWlmIChjb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfdmJpX2Zvcm1hdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3Y0bDJfc2xpY2VkX3ZiaV9mb3JtYXQoc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCBfX3VzZXIgKnVwKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHV0X3Y0bDJfc2xpY2VkX3ZiaV9mb3JtYXQoc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCBfX3VzZXIgKnVwKQoreworCWlmIChjb3B5X3RvX3VzZXIodXAsIGtwLCBzaXplb2Yoc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX2Zvcm1hdDMyIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJcGl4OworCQlzdHJ1Y3QgdjRsMl93aW5kb3czMgl3aW47CisJCXN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQJdmJpOworCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdAlzbGljZWQ7CisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgICAgICAgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gZm10OworfTsKKworc3RhdGljIGludCBnZXRfdjRsMl9mb3JtYXQzMihzdHJ1Y3QgdjRsMl9mb3JtYXQgKmtwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdDMyKSkgfHwKKwkJCWdldF91c2VyKGtwLT50eXBlLCAmdXAtPnR5cGUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChrcC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCXJldHVybiBnZXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LnBpeCwgJnVwLT5mbXQucGl4KTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVk6CisJCXJldHVybiBnZXRfdjRsMl93aW5kb3czMigma3AtPmZtdC53aW4sICZ1cC0+Zm10Lndpbik7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQlyZXR1cm4gZ2V0X3Y0bDJfdmJpX2Zvcm1hdCgma3AtPmZtdC52YmksICZ1cC0+Zm10LnZiaSk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKKwljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCXJldHVybiBnZXRfdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCgma3AtPmZtdC5zbGljZWQsICZ1cC0+Zm10LnNsaWNlZCk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcihrcCwgdXAsIHNpemVvZihrcC0+Zm10LnJhd19kYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSAwOgorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJjb21wYXRfaW9jdGwzMjogdW5leHBlY3RlZCBWSURJT0NfRk1UIHR5cGUgJWRcbiIsCisJCQkJCQkJCWtwLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdDMyKSkgfHwKKwkJcHV0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoa3AtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQlyZXR1cm4gcHV0X3Y0bDJfcGl4X2Zvcm1hdCgma3AtPmZtdC5waXgsICZ1cC0+Zm10LnBpeCk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZOgorCQlyZXR1cm4gcHV0X3Y0bDJfd2luZG93MzIoJmtwLT5mbXQud2luLCAmdXAtPmZtdC53aW4pOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVDoKKwkJcmV0dXJuIHB1dF92NGwyX3ZiaV9mb3JtYXQoJmtwLT5mbXQudmJpLCAmdXAtPmZtdC52YmkpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6CisJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUOgorCQlyZXR1cm4gcHV0X3Y0bDJfc2xpY2VkX3ZiaV9mb3JtYXQoJmtwLT5mbXQuc2xpY2VkLCAmdXAtPmZtdC5zbGljZWQpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgorCQlpZiAoY29weV90b191c2VyKHVwLCBrcCwgc2l6ZW9mKHVwLT5mbXQucmF3X2RhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIDA6CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gImNvbXBhdF9pb2N0bDMyOiB1bmV4cGVjdGVkIFZJRElPQ19GTVQgdHlwZSAlZFxuIiwKKwkJCQkJCQkJa3AtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0cnVjdCB2NGwyX3N0YW5kYXJkMzIgeworCV9fdTMyCQkgICAgIGluZGV4OworCV9fdTMyCQkgICAgIGlkWzJdOyAvKiBfX3U2NCB3b3VsZCBnZXQgdGhlIGFsaWdubWVudCB3cm9uZyAqLworCV9fdTgJCSAgICAgbmFtZVsyNF07CisJc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLworCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Cit9OworCitzdGF0aWMgaW50IGdldF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCit7CisJLyogb3RoZXIgZmllbGRzIGFyZSBub3Qgc2V0IGJ5IHRoZSB1c2VyLCBub3IgdXNlZCBieSB0aGUgZHJpdmVyICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQzMikpIHx8CisJCWdldF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX3N0YW5kYXJkMzIoc3RydWN0IHY0bDJfc3RhbmRhcmQgKmtwLCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZDMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkMzIpKSB8fAorCQlwdXRfdXNlcihrcC0+aW5kZXgsICZ1cC0+aW5kZXgpIHx8CisJCWNvcHlfdG9fdXNlcih1cC0+aWQsICZrcC0+aWQsIHNpemVvZihfX3U2NCkpIHx8CisJCWNvcHlfdG9fdXNlcih1cC0+bmFtZSwga3AtPm5hbWUsIDI0KSB8fAorCQljb3B5X3RvX3VzZXIoJnVwLT5mcmFtZXBlcmlvZCwgJmtwLT5mcmFtZXBlcmlvZCwgc2l6ZW9mKGtwLT5mcmFtZXBlcmlvZCkpIHx8CisJCXB1dF91c2VyKGtwLT5mcmFtZWxpbmVzLCAmdXAtPmZyYW1lbGluZXMpIHx8CisJCWNvcHlfdG9fdXNlcih1cC0+cmVzZXJ2ZWQsIGtwLT5yZXNlcnZlZCwgNCAqIHNpemVvZihfX3UzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX2J1ZmZlcjMyIHsKKwlfX3UzMgkJCWluZGV4OworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJX191MzIJCQlieXRlc3VzZWQ7CisJX191MzIJCQlmbGFnczsKKwllbnVtIHY0bDJfZmllbGQJCWZpZWxkOworCXN0cnVjdCBjb21wYXRfdGltZXZhbAl0aW1lc3RhbXA7CisJc3RydWN0IHY0bDJfdGltZWNvZGUJdGltZWNvZGU7CisJX191MzIJCQlzZXF1ZW5jZTsKKworCS8qIG1lbW9yeSBsb2NhdGlvbiAqLworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwl1bmlvbiB7CisJCV9fdTMyICAgICAgICAgICBvZmZzZXQ7CisJCWNvbXBhdF9sb25nX3QgICB1c2VycHRyOworCX0gbTsKKwlfX3UzMgkJCWxlbmd0aDsKKwlfX3UzMgkJCWlucHV0OworCV9fdTMyCQkJcmVzZXJ2ZWQ7Cit9OworCitzdGF0aWMgaW50IGdldF92NGwyX2J1ZmZlcjMyKHN0cnVjdCB2NGwyX2J1ZmZlciAqa3AsIHN0cnVjdCB2NGwyX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIzMikpIHx8CisJCWdldF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkgfHwKKwkJZ2V0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkgfHwKKwkJZ2V0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSB8fAorCQlnZXRfdXNlcihrcC0+bWVtb3J5LCAmdXAtPm1lbW9yeSkgfHwKKwkJZ2V0X3VzZXIoa3AtPmlucHV0LCAmdXAtPmlucHV0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoa3AtPm1lbW9yeSkgeworCWNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgorCQl7CisJCWNvbXBhdF9sb25nX3QgdG1wOworCisJCWlmIChnZXRfdXNlcihrcC0+bGVuZ3RoLCAmdXAtPmxlbmd0aCkgfHwKKwkJICAgIGdldF91c2VyKHRtcCwgJnVwLT5tLnVzZXJwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJa3AtPm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIodG1wKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX09WRVJMQVk6CisJCWlmIChnZXRfdXNlcihrcC0+bS5vZmZzZXQsICZ1cC0+bS5vZmZzZXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfdjRsMl9idWZmZXIzMihzdHJ1Y3QgdjRsMl9idWZmZXIgKmtwLCBzdHJ1Y3QgdjRsMl9idWZmZXIzMiBfX3VzZXIgKnVwKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIzMikpIHx8CisJCXB1dF91c2VyKGtwLT5pbmRleCwgJnVwLT5pbmRleCkgfHwKKwkJcHV0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkgfHwKKwkJcHV0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKSB8fAorCQlwdXRfdXNlcihrcC0+bWVtb3J5LCAmdXAtPm1lbW9yeSkgfHwKKwkJcHV0X3VzZXIoa3AtPmlucHV0LCAmdXAtPmlucHV0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoa3AtPm1lbW9yeSkgeworCWNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKwkJaWYgKHB1dF91c2VyKGtwLT5sZW5ndGgsICZ1cC0+bGVuZ3RoKSB8fAorCQkJcHV0X3VzZXIoa3AtPm0ub2Zmc2V0LCAmdXAtPm0ub2Zmc2V0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisJCWlmIChwdXRfdXNlcihrcC0+bGVuZ3RoLCAmdXAtPmxlbmd0aCkgfHwKKwkJCXB1dF91c2VyKGtwLT5tLnVzZXJwdHIsICZ1cC0+bS51c2VycHRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX09WRVJMQVk6CisJCWlmIChwdXRfdXNlcihrcC0+bS5vZmZzZXQsICZ1cC0+bS5vZmZzZXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlpZiAocHV0X3VzZXIoa3AtPmJ5dGVzdXNlZCwgJnVwLT5ieXRlc3VzZWQpIHx8CisJCXB1dF91c2VyKGtwLT5maWVsZCwgJnVwLT5maWVsZCkgfHwKKwkJcHV0X3VzZXIoa3AtPnRpbWVzdGFtcC50dl9zZWMsICZ1cC0+dGltZXN0YW1wLnR2X3NlYykgfHwKKwkJcHV0X3VzZXIoa3AtPnRpbWVzdGFtcC50dl91c2VjLCAmdXAtPnRpbWVzdGFtcC50dl91c2VjKSB8fAorCQljb3B5X3RvX3VzZXIoJnVwLT50aW1lY29kZSwgJmtwLT50aW1lY29kZSwgc2l6ZW9mKHN0cnVjdCB2NGwyX3RpbWVjb2RlKSkgfHwKKwkJcHV0X3VzZXIoa3AtPnNlcXVlbmNlLCAmdXAtPnNlcXVlbmNlKSB8fAorCQlwdXRfdXNlcihrcC0+cmVzZXJ2ZWQsICZ1cC0+cmVzZXJ2ZWQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIgeworCV9fdTMyCQkJY2FwYWJpbGl0eTsKKwlfX3UzMgkJCWZsYWdzOworCWNvbXBhdF9jYWRkcl90IAkJYmFzZTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0CWZtdDsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3Y0bDJfZnJhbWVidWZmZXIzMihzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqa3AsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIgX191c2VyICp1cCkKK3sKKwl1MzIgdG1wOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZnJhbWVidWZmZXIzMikpIHx8CisJCWdldF91c2VyKHRtcCwgJnVwLT5iYXNlKSB8fAorCQlnZXRfdXNlcihrcC0+Y2FwYWJpbGl0eSwgJnVwLT5jYXBhYmlsaXR5KSB8fAorCQlnZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJa3AtPmJhc2UgPSBjb21wYXRfcHRyKHRtcCk7CisJZ2V0X3Y0bDJfcGl4X2Zvcm1hdCgma3AtPmZtdCwgJnVwLT5mbXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2ZyYW1lYnVmZmVyMzIoc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmtwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcCA9ICh1MzIpKCh1bnNpZ25lZCBsb25nKWtwLT5iYXNlKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKSkgfHwKKwkJcHV0X3VzZXIodG1wLCAmdXAtPmJhc2UpIHx8CisJCXB1dF91c2VyKGtwLT5jYXBhYmlsaXR5LCAmdXAtPmNhcGFiaWxpdHkpIHx8CisJCXB1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlwdXRfdjRsMl9waXhfZm9ybWF0KCZrcC0+Zm10LCAmdXAtPmZtdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX2lucHV0MzIgeworCV9fdTMyCSAgICAgaW5kZXg7CQkvKiAgV2hpY2ggaW5wdXQgKi8KKwlfX3U4CSAgICAgbmFtZVszMl07CQkvKiAgTGFiZWwgKi8KKwlfX3UzMgkgICAgIHR5cGU7CQkvKiAgVHlwZSBvZiBpbnB1dCAqLworCV9fdTMyCSAgICAgYXVkaW9zZXQ7CQkvKiAgQXNzb2NpYXRlZCBhdWRpb3MgKGJpdGZpZWxkKSAqLworCV9fdTMyICAgICAgICB0dW5lcjsgICAgICAgICAgICAgLyogIEFzc29jaWF0ZWQgdHVuZXIgKi8KKwl2NGwyX3N0ZF9pZCAgc3RkOworCV9fdTMyCSAgICAgc3RhdHVzOworCV9fdTMyCSAgICAgcmVzZXJ2ZWRbNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIDY0LWJpdCB2NGwyX2lucHV0IHN0cnVjdCBoYXMgZXh0cmEgcGFkZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QuCisgICBPdGhlcndpc2UgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSAzMi1iaXQgdmVyc2lvbi4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF92NGwyX2lucHV0MzIoc3RydWN0IHY0bDJfaW5wdXQgKmtwLCBzdHJ1Y3QgdjRsMl9pbnB1dDMyIF9fdXNlciAqdXApCit7CisJaWYgKGNvcHlfZnJvbV91c2VyKGtwLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB1dF92NGwyX2lucHV0MzIoc3RydWN0IHY0bDJfaW5wdXQgKmtwLCBzdHJ1Y3QgdjRsMl9pbnB1dDMyIF9fdXNlciAqdXApCit7CisJaWYgKGNvcHlfdG9fdXNlcih1cCwga3AsIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMiB7CisgICAgICAgX191MzIgY3RybF9jbGFzczsKKyAgICAgICBfX3UzMiBjb3VudDsKKyAgICAgICBfX3UzMiBlcnJvcl9pZHg7CisgICAgICAgX191MzIgcmVzZXJ2ZWRbMl07CisgICAgICAgY29tcGF0X2NhZGRyX3QgY29udHJvbHM7IC8qIGFjdHVhbGx5IHN0cnVjdCB2NGwyX2V4dF9jb250cm9sMzIgKiAqLworfTsKKworc3RhdGljIGludCBnZXRfdjRsMl9leHRfY29udHJvbHMzMihzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmtwLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMiBfX3VzZXIgKnVwKQoreworCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sIF9fdXNlciAqdWNvbnRyb2xzOworCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sIF9fdXNlciAqa2NvbnRyb2xzOworCWludCBuOworCWNvbXBhdF9jYWRkcl90IHA7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikpIHx8CisJCWdldF91c2VyKGtwLT5jdHJsX2NsYXNzLCAmdXAtPmN0cmxfY2xhc3MpIHx8CisJCWdldF91c2VyKGtwLT5jb3VudCwgJnVwLT5jb3VudCkgfHwKKwkJZ2V0X3VzZXIoa3AtPmVycm9yX2lkeCwgJnVwLT5lcnJvcl9pZHgpIHx8CisJCWNvcHlfZnJvbV91c2VyKGtwLT5yZXNlcnZlZCwgdXAtPnJlc2VydmVkLCBzaXplb2Yoa3AtPnJlc2VydmVkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwluID0ga3AtPmNvdW50OworCWlmIChuID09IDApIHsKKwkJa3AtPmNvbnRyb2xzID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChnZXRfdXNlcihwLCAmdXAtPmNvbnRyb2xzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdWNvbnRyb2xzID0gY29tcGF0X3B0cihwKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWNvbnRyb2xzLCBuICogc2l6ZW9mKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sKSkpCisJCXJldHVybiAtRUZBVUxUOworCWtjb250cm9scyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG4gKiBzaXplb2Yoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wpKTsKKwlrcC0+Y29udHJvbHMgPSBrY29udHJvbHM7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCWlmIChjb3B5X2luX3VzZXIoJmtjb250cm9scy0+aWQsICZ1Y29udHJvbHMtPmlkLCBzaXplb2YoX191MzIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9pbl91c2VyKCZrY29udHJvbHMtPnJlc2VydmVkMiwgJnVjb250cm9scy0+cmVzZXJ2ZWQyLCBzaXplb2YodWNvbnRyb2xzLT5yZXNlcnZlZDIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkvKiBOb3RlOiBpZiB0aGUgdm9pZCAqIHBhcnQgb2YgdGhlIHVuaW9uIGV2ZXIgYmVjb21lcyByZWxldmFudAorCQkgICB0aGVuIHdlIG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgY29udHJvbCBpbiBvcmRlciB0byBkbworCQkgICB0aGUgcmlnaHQgdGhpbmcgaGVyZS4gTHVja2lseSwgdGhhdCBpcyBub3QgeWV0IGFuIGlzc3VlLiAqLworCQlpZiAoY29weV9pbl91c2VyKCZrY29udHJvbHMtPnZhbHVlLCAmdWNvbnRyb2xzLT52YWx1ZSwgc2l6ZW9mKHVjb250cm9scy0+dmFsdWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl1Y29udHJvbHMrKzsKKwkJa2NvbnRyb2xzKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92NGwyX2V4dF9jb250cm9sczMyKHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqa3AsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyIF9fdXNlciAqdXApCit7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgX191c2VyICp1Y29udHJvbHM7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgX191c2VyICprY29udHJvbHMgPSBrcC0+Y29udHJvbHM7CisJaW50IG4gPSBrcC0+Y291bnQ7CisJY29tcGF0X2NhZGRyX3QgcDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikpIHx8CisJCXB1dF91c2VyKGtwLT5jdHJsX2NsYXNzLCAmdXAtPmN0cmxfY2xhc3MpIHx8CisJCXB1dF91c2VyKGtwLT5jb3VudCwgJnVwLT5jb3VudCkgfHwKKwkJcHV0X3VzZXIoa3AtPmVycm9yX2lkeCwgJnVwLT5lcnJvcl9pZHgpIHx8CisJCWNvcHlfdG9fdXNlcih1cC0+cmVzZXJ2ZWQsIGtwLT5yZXNlcnZlZCwgc2l6ZW9mKHVwLT5yZXNlcnZlZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFrcC0+Y291bnQpCisJCXJldHVybiAwOworCisJaWYgKGdldF91c2VyKHAsICZ1cC0+Y29udHJvbHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl1Y29udHJvbHMgPSBjb21wYXRfcHRyKHApOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWNvbnRyb2xzLCBuICogc2l6ZW9mKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCWlmIChjb3B5X2luX3VzZXIoJnVjb250cm9scy0+aWQsICZrY29udHJvbHMtPmlkLCBzaXplb2YoX191MzIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9pbl91c2VyKCZ1Y29udHJvbHMtPnJlc2VydmVkMiwgJmtjb250cm9scy0+cmVzZXJ2ZWQyLAorCQkJCQlzaXplb2YodWNvbnRyb2xzLT5yZXNlcnZlZDIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkvKiBOb3RlOiBpZiB0aGUgdm9pZCAqIHBhcnQgb2YgdGhlIHVuaW9uIGV2ZXIgYmVjb21lcyByZWxldmFudAorCQkgICB0aGVuIHdlIG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgY29udHJvbCBpbiBvcmRlciB0byBkbworCQkgICB0aGUgcmlnaHQgdGhpbmcgaGVyZS4gTHVja2lseSwgdGhhdCBpcyBub3QgeWV0IGFuIGlzc3VlLiAqLworCQlpZiAoY29weV9pbl91c2VyKCZ1Y29udHJvbHMtPnZhbHVlLCAma2NvbnRyb2xzLT52YWx1ZSwgc2l6ZW9mKHVjb250cm9scy0+dmFsdWUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl1Y29udHJvbHMrKzsKKwkJa2NvbnRyb2xzKys7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIFZJRElPQ19HX0ZNVDMyCQlfSU9XUignVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKKyNkZWZpbmUgVklESU9DX1NfRk1UMzIJCV9JT1dSKCdWJywgIDUsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyKQorI2RlZmluZSBWSURJT0NfUVVFUllCVUYzMglfSU9XUignVicsICA5LCBzdHJ1Y3QgdjRsMl9idWZmZXIzMikKKyNkZWZpbmUgVklESU9DX0dfRkJVRjMyCQlfSU9SICgnVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NfU19GQlVGMzIJCV9JT1cgKCdWJywgMTEsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyMzIpCisjZGVmaW5lIFZJRElPQ19RQlVGMzIJCV9JT1dSKCdWJywgMTUsIHN0cnVjdCB2NGwyX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NfRFFCVUYzMgkJX0lPV1IoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyMzIpCisjZGVmaW5lIFZJRElPQ19FTlVNU1REMzIJX0lPV1IoJ1YnLCAyNSwgc3RydWN0IHY0bDJfc3RhbmRhcmQzMikKKyNkZWZpbmUgVklESU9DX0VOVU1JTlBVVDMyCV9JT1dSKCdWJywgMjYsIHN0cnVjdCB2NGwyX2lucHV0MzIpCisjZGVmaW5lIFZJRElPQ19UUllfRk1UMzIgICAgICAJX0lPV1IoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0MzIpCisjZGVmaW5lIFZJRElPQ19HX0VYVF9DVFJMUzMyICAgIF9JT1dSKCdWJywgNzEsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyKQorI2RlZmluZSBWSURJT0NfU19FWFRfQ1RSTFMzMiAgICBfSU9XUignVicsIDcyLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikKKyNkZWZpbmUgVklESU9DX1RSWV9FWFRfQ1RSTFMzMiAgX0lPV1IoJ1YnLCA3Mywgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzMzIpCisKKyNkZWZpbmUgVklESU9DX09WRVJMQVkzMglfSU9XICgnVicsIDE0LCBzMzIpCisjaWZkZWYgX19PTERfVklESU9DXworI2RlZmluZSBWSURJT0NfT1ZFUkxBWTMyX09MRAlfSU9XUignVicsIDE0LCBzMzIpCisjZW5kaWYKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9OMzIJX0lPVyAoJ1YnLCAxOCwgczMyKQorI2RlZmluZSBWSURJT0NfU1RSRUFNT0ZGMzIJX0lPVyAoJ1YnLCAxOSwgczMyKQorI2RlZmluZSBWSURJT0NfR19JTlBVVDMyCV9JT1IgKCdWJywgMzgsIHMzMikKKyNkZWZpbmUgVklESU9DX1NfSU5QVVQzMglfSU9XUignVicsIDM5LCBzMzIpCisjZGVmaW5lIFZJRElPQ19HX09VVFBVVDMyCV9JT1IgKCdWJywgNDYsIHMzMikKKyNkZWZpbmUgVklESU9DX1NfT1VUUFVUMzIJX0lPV1IoJ1YnLCA0NywgczMyKQorCitzdGF0aWMgaW50IGRvX3ZpZGVvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bmlvbiB7CisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCisJCXN0cnVjdCB2aWRlb190dW5lciB2dDsKKwkJc3RydWN0IHZpZGVvX2J1ZmZlciB2YjsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKKwkJc3RydWN0IHZpZGVvX2NvZGUgdmM7CisJCXN0cnVjdCB2aWRlb19hdWRpbyB2YTsKKyNlbmRpZgorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgdjJmOworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgdjJiOworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciB2MmZiOworCQlzdHJ1Y3QgdjRsMl9pbnB1dCB2Mmk7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHYyczsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIHYyZWNzOworCQl1bnNpZ25lZCBsb25nIHZ4OworCQlpbnQgdmk7CisJfSBrYXJnOworCXZvaWQgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgY29tcGF0aWJsZV9hcmcgPSAxOworCWludCBlcnIgPSAwOworCisJLyogRmlyc3QsIGNvbnZlcnQgdGhlIGNvbW1hbmQuICovCisJc3dpdGNoIChjbWQpIHsKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKKwljYXNlIFZJRElPQ0dUVU5FUjMyOiBjbWQgPSBWSURJT0NHVFVORVI7IGJyZWFrOworCWNhc2UgVklESU9DU1RVTkVSMzI6IGNtZCA9IFZJRElPQ1NUVU5FUjsgYnJlYWs7CisJY2FzZSBWSURJT0NHV0lOMzI6IGNtZCA9IFZJRElPQ0dXSU47IGJyZWFrOworCWNhc2UgVklESU9DU1dJTjMyOiBjbWQgPSBWSURJT0NTV0lOOyBicmVhazsKKwljYXNlIFZJRElPQ0dGQlVGMzI6IGNtZCA9IFZJRElPQ0dGQlVGOyBicmVhazsKKwljYXNlIFZJRElPQ1NGQlVGMzI6IGNtZCA9IFZJRElPQ1NGQlVGOyBicmVhazsKKwljYXNlIFZJRElPQ0dGUkVRMzI6IGNtZCA9IFZJRElPQ0dGUkVROyBicmVhazsKKwljYXNlIFZJRElPQ1NGUkVRMzI6IGNtZCA9IFZJRElPQ1NGUkVROyBicmVhazsKKwljYXNlIFZJRElPQ1NNSUNST0NPREUzMjogY21kID0gVklESU9DU01JQ1JPQ09ERTsgYnJlYWs7CisjZW5kaWYKKwljYXNlIFZJRElPQ19HX0ZNVDMyOiBjbWQgPSBWSURJT0NfR19GTVQ7IGJyZWFrOworCWNhc2UgVklESU9DX1NfRk1UMzI6IGNtZCA9IFZJRElPQ19TX0ZNVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfUVVFUllCVUYzMjogY21kID0gVklESU9DX1FVRVJZQlVGOyBicmVhazsKKwljYXNlIFZJRElPQ19HX0ZCVUYzMjogY21kID0gVklESU9DX0dfRkJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NfU19GQlVGMzI6IGNtZCA9IFZJRElPQ19TX0ZCVUY7IGJyZWFrOworCWNhc2UgVklESU9DX1FCVUYzMjogY21kID0gVklESU9DX1FCVUY7IGJyZWFrOworCWNhc2UgVklESU9DX0RRQlVGMzI6IGNtZCA9IFZJRElPQ19EUUJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NfRU5VTVNURDMyOiBjbWQgPSBWSURJT0NfRU5VTVNURDsgYnJlYWs7CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUMzI6IGNtZCA9IFZJRElPQ19FTlVNSU5QVVQ7IGJyZWFrOworCWNhc2UgVklESU9DX1RSWV9GTVQzMjogY21kID0gVklESU9DX1RSWV9GTVQ7IGJyZWFrOworCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19HX0VYVF9DVFJMUzsgYnJlYWs7CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFMzMjogY21kID0gVklESU9DX1NfRVhUX0NUUkxTOyBicmVhazsKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19UUllfRVhUX0NUUkxTOyBicmVhazsKKwljYXNlIFZJRElPQ19PVkVSTEFZMzI6IGNtZCA9IFZJRElPQ19PVkVSTEFZOyBicmVhazsKKyNpZmRlZiBfX09MRF9WSURJT0NfCisJY2FzZSBWSURJT0NfT1ZFUkxBWTMyX09MRDogY21kID0gVklESU9DX09WRVJMQVk7IGJyZWFrOworI2VuZGlmCisJY2FzZSBWSURJT0NfU1RSRUFNT04zMjogY21kID0gVklESU9DX1NUUkVBTU9OOyBicmVhazsKKwljYXNlIFZJRElPQ19TVFJFQU1PRkYzMjogY21kID0gVklESU9DX1NUUkVBTU9GRjsgYnJlYWs7CisJY2FzZSBWSURJT0NfR19JTlBVVDMyOiBjbWQgPSBWSURJT0NfR19JTlBVVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfU19JTlBVVDMyOiBjbWQgPSBWSURJT0NfU19JTlBVVDsgYnJlYWs7CisJY2FzZSBWSURJT0NfR19PVVRQVVQzMjogY21kID0gVklESU9DX0dfT1VUUFVUOyBicmVhazsKKwljYXNlIFZJRElPQ19TX09VVFBVVDMyOiBjbWQgPSBWSURJT0NfU19PVVRQVVQ7IGJyZWFrOworCX0KKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCisJY2FzZSBWSURJT0NTVFVORVI6CisJY2FzZSBWSURJT0NHVFVORVI6CisJCWVyciA9IGdldF92aWRlb190dW5lcjMyKCZrYXJnLnZ0LCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGQlVGOgorCQllcnIgPSBnZXRfdmlkZW9fYnVmZmVyMzIoJmthcmcudmIsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DU1dJTjoKKwkJZXJyID0gZ2V0X3ZpZGVvX3dpbmRvdzMyKCZrYXJnLnZ3LCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dXSU46CisJY2FzZSBWSURJT0NHRkJVRjoKKwljYXNlIFZJRElPQ0dGUkVROgorCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NTTUlDUk9DT0RFOgorCQllcnIgPSBnZXRfbWljcm9jb2RlMzIoJmthcmcudmMsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DU0ZSRVE6CisJCWVyciA9IGdldF91c2VyKGthcmcudngsICh1MzIgX191c2VyICopdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NDQVBUVVJFOgorCWNhc2UgVklESU9DU1lOQzoKKwljYXNlIFZJRElPQ1NXUklURU1PREU6CisjZW5kaWYKKwljYXNlIFZJRElPQ19PVkVSTEFZOgorCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCWNhc2UgVklESU9DX1NfT1VUUFVUOgorCQllcnIgPSBnZXRfdXNlcihrYXJnLnZpLCAoczMyIF9fdXNlciAqKXVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJY2FzZSBWSURJT0NfR19PVVRQVVQ6CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0ZNVDoKKwljYXNlIFZJRElPQ19TX0ZNVDoKKwljYXNlIFZJRElPQ19UUllfRk1UOgorCQllcnIgPSBnZXRfdjRsMl9mb3JtYXQzMigma2FyZy52MmYsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCWNhc2UgVklESU9DX1FCVUY6CisJY2FzZSBWSURJT0NfRFFCVUY6CisJCWVyciA9IGdldF92NGwyX2J1ZmZlcjMyKCZrYXJnLnYyYiwgdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19GQlVGOgorCQllcnIgPSBnZXRfdjRsMl9mcmFtZWJ1ZmZlcjMyKCZrYXJnLnYyZmIsIHVwKTsKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfRkJVRjoKKwkJY29tcGF0aWJsZV9hcmcgPSAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1TVEQ6CisJCWVyciA9IGdldF92NGwyX3N0YW5kYXJkMzIoJmthcmcudjJzLCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJCWVyciA9IGdldF92NGwyX2lucHV0MzIoJmthcmcudjJpLCB1cCk7CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgorCQllcnIgPSBnZXRfdjRsMl9leHRfY29udHJvbHMzMigma2FyZy52MmVjcywgdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGNvbXBhdGlibGVfYXJnKQorCQllcnIgPSBuYXRpdmVfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyl1cCk7CisJZWxzZSB7CisJCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJZXJyID0gbmF0aXZlX2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmthcmcpOworCQlzZXRfZnMob2xkX2ZzKTsKKwl9CisKKwkvKiBTcGVjaWFsIGNhc2U6IGV2ZW4gYWZ0ZXIgYW4gZXJyb3Igd2UgbmVlZCB0byBwdXQgdGhlCisJICAgcmVzdWx0cyBiYWNrIGZvciB0aGVzZSBpb2N0bHMgc2luY2UgdGhlIGVycm9yX2lkeCB3aWxsCisJICAgY29udGFpbiBpbmZvcm1hdGlvbiBvbiB3aGljaCBjb250cm9sIGZhaWxlZC4gKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgorCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJCWlmIChwdXRfdjRsMl9leHRfY29udHJvbHMzMigma2FyZy52MmVjcywgdXApKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGNtZCkgeworI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAorCWNhc2UgVklESU9DR1RVTkVSOgorCQllcnIgPSBwdXRfdmlkZW9fdHVuZXIzMigma2FyZy52dCwgdXApOworCQlicmVhazsKKworCWNhc2UgVklESU9DR1dJTjoKKwkJZXJyID0gcHV0X3ZpZGVvX3dpbmRvdzMyKCZrYXJnLnZ3LCB1cCk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHRkJVRjoKKwkJZXJyID0gcHV0X3ZpZGVvX2J1ZmZlcjMyKCZrYXJnLnZiLCB1cCk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHRlJFUToKKwkJZXJyID0gcHV0X3VzZXIoKCh1MzIpa2FyZy52eCksICh1MzIgX191c2VyICopdXApOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19PVVRQVVQ6CisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwljYXNlIFZJRElPQ19HX09VVFBVVDoKKwkJZXJyID0gcHV0X3VzZXIoKChzMzIpa2FyZy52aSksIChzMzIgX191c2VyICopdXApOworCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfRkJVRjoKKwkJZXJyID0gcHV0X3Y0bDJfZnJhbWVidWZmZXIzMigma2FyZy52MmZiLCB1cCk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19GTVQ6CisJY2FzZSBWSURJT0NfU19GTVQ6CisJY2FzZSBWSURJT0NfVFJZX0ZNVDoKKwkJZXJyID0gcHV0X3Y0bDJfZm9ybWF0MzIoJmthcmcudjJmLCB1cCk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJY2FzZSBWSURJT0NfUUJVRjoKKwljYXNlIFZJRElPQ19EUUJVRjoKKwkJZXJyID0gcHV0X3Y0bDJfYnVmZmVyMzIoJmthcmcudjJiLCB1cCk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwkJZXJyID0gcHV0X3Y0bDJfc3RhbmRhcmQzMigma2FyZy52MnMsIHVwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJCWVyciA9IHB1dF92NGwyX2lucHV0MzIoJmthcmcudjJpLCB1cCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitsb25nIHY0bF9jb21wYXRfaW9jdGwzMihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKworCWlmICghZmlsZS0+Zl9vcC0+aW9jdGwgJiYgIWZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChjbWQpIHsKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKKwljYXNlIFZJRElPQ0dDQVA6CisJY2FzZSBWSURJT0NHQ0hBTjoKKwljYXNlIFZJRElPQ1NDSEFOOgorCWNhc2UgVklESU9DR1RVTkVSMzI6CisJY2FzZSBWSURJT0NTVFVORVIzMjoKKwljYXNlIFZJRElPQ0dQSUNUOgorCWNhc2UgVklESU9DU1BJQ1Q6CisJY2FzZSBWSURJT0NDQVBUVVJFMzI6CisJY2FzZSBWSURJT0NHV0lOMzI6CisJY2FzZSBWSURJT0NTV0lOMzI6CisJY2FzZSBWSURJT0NHRkJVRjMyOgorCWNhc2UgVklESU9DU0ZCVUYzMjoKKwljYXNlIFZJRElPQ0tFWToKKwljYXNlIFZJRElPQ0dGUkVRMzI6CisJY2FzZSBWSURJT0NTRlJFUTMyOgorCWNhc2UgVklESU9DR0FVRElPOgorCWNhc2UgVklESU9DU0FVRElPOgorCWNhc2UgVklESU9DU1lOQzMyOgorCWNhc2UgVklESU9DTUNBUFRVUkU6CisJY2FzZSBWSURJT0NHTUJVRjoKKwljYXNlIFZJRElPQ0dVTklUOgorCWNhc2UgVklESU9DR0NBUFRVUkU6CisJY2FzZSBWSURJT0NTQ0FQVFVSRToKKwljYXNlIFZJRElPQ1NQTEFZTU9ERToKKwljYXNlIFZJRElPQ1NXUklURU1PREUzMjoKKwljYXNlIFZJRElPQ0dQTEFZSU5GTzoKKwljYXNlIFZJRElPQ1NNSUNST0NPREUzMjoKKwljYXNlIFZJRElPQ0dWQklGTVQ6CisJY2FzZSBWSURJT0NTVkJJRk1UOgorI2VuZGlmCisjaWZkZWYgX19PTERfVklESU9DXworCWNhc2UgVklESU9DX09WRVJMQVkzMl9PTEQ6CisJY2FzZSBWSURJT0NfU19QQVJNX09MRDoKKwljYXNlIFZJRElPQ19TX0NUUkxfT0xEOgorCWNhc2UgVklESU9DX0dfQVVESU9fT0xEOgorCWNhc2UgVklESU9DX0dfQVVET1VUX09MRDoKKwljYXNlIFZJRElPQ19DUk9QQ0FQX09MRDoKKyNlbmRpZgorCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCWNhc2UgVklESU9DX1JFU0VSVkVEOgorCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCWNhc2UgVklESU9DX0dfRk1UMzI6CisJY2FzZSBWSURJT0NfU19GTVQzMjoKKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCWNhc2UgVklESU9DX1FVRVJZQlVGMzI6CisJY2FzZSBWSURJT0NfR19GQlVGMzI6CisJY2FzZSBWSURJT0NfU19GQlVGMzI6CisJY2FzZSBWSURJT0NfT1ZFUkxBWTMyOgorCWNhc2UgVklESU9DX1FCVUYzMjoKKwljYXNlIFZJRElPQ19EUUJVRjMyOgorCWNhc2UgVklESU9DX1NUUkVBTU9OMzI6CisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGMzI6CisJY2FzZSBWSURJT0NfR19QQVJNOgorCWNhc2UgVklESU9DX1NfUEFSTToKKwljYXNlIFZJRElPQ19HX1NURDoKKwljYXNlIFZJRElPQ19TX1NURDoKKwljYXNlIFZJRElPQ19FTlVNU1REMzI6CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUMzI6CisJY2FzZSBWSURJT0NfR19DVFJMOgorCWNhc2UgVklESU9DX1NfQ1RSTDoKKwljYXNlIFZJRElPQ19HX1RVTkVSOgorCWNhc2UgVklESU9DX1NfVFVORVI6CisJY2FzZSBWSURJT0NfR19BVURJTzoKKwljYXNlIFZJRElPQ19TX0FVRElPOgorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwljYXNlIFZJRElPQ19RVUVSWU1FTlU6CisJY2FzZSBWSURJT0NfR19JTlBVVDMyOgorCWNhc2UgVklESU9DX1NfSU5QVVQzMjoKKwljYXNlIFZJRElPQ19HX09VVFBVVDMyOgorCWNhc2UgVklESU9DX1NfT1VUUFVUMzI6CisJY2FzZSBWSURJT0NfRU5VTU9VVFBVVDoKKwljYXNlIFZJRElPQ19HX0FVRE9VVDoKKwljYXNlIFZJRElPQ19TX0FVRE9VVDoKKwljYXNlIFZJRElPQ19HX01PRFVMQVRPUjoKKwljYXNlIFZJRElPQ19TX01PRFVMQVRPUjoKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwljYXNlIFZJRElPQ19DUk9QQ0FQOgorCWNhc2UgVklESU9DX0dfQ1JPUDoKKwljYXNlIFZJRElPQ19TX0NST1A6CisJY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKKwljYXNlIFZJRElPQ19TX0pQRUdDT01QOgorCWNhc2UgVklESU9DX1FVRVJZU1REOgorCWNhc2UgVklESU9DX1RSWV9GTVQzMjoKKwljYXNlIFZJRElPQ19FTlVNQVVESU86CisJY2FzZSBWSURJT0NfRU5VTUFVRE9VVDoKKwljYXNlIFZJRElPQ19HX1BSSU9SSVRZOgorCWNhc2UgVklESU9DX1NfUFJJT1JJVFk6CisJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKKwljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgorCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTMzI6CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFMzMjoKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTMzI6CisJY2FzZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTOgorCWNhc2UgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM6CisJY2FzZSBWSURJT0NfR19FTkNfSU5ERVg6CisJY2FzZSBWSURJT0NfRU5DT0RFUl9DTUQ6CisJY2FzZSBWSURJT0NfVFJZX0VOQ09ERVJfQ01EOgorCWNhc2UgVklESU9DX0RCR19TX1JFR0lTVEVSOgorCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgorCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKKwljYXNlIFZJRElPQ19TX0hXX0ZSRVFfU0VFSzoKKwkJcmV0ID0gZG9fdmlkZW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAorCS8qIEJUVFYgc3BlY2lmaWMuLi4gKi8KKwljYXNlIF9JT1coJ3YnLCAgQkFTRV9WSURJT0NQUklWQVRFKzAsIGNoYXIgWzI1Nl0pOgorCWNhc2UgX0lPUigndicsICBCQVNFX1ZJRElPQ1BSSVZBVEUrMSwgY2hhciBbMjU2XSk6CisJY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSsyLCB1bnNpZ25lZCBpbnQpOgorCWNhc2UgX0lPVygndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMywgY2hhciBbMTZdKTogLyogc3RydWN0IGJ0dHZfcGxsX2luZm8gKi8KKwljYXNlIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzQsIGludCk6CisJY2FzZSBfSU9SKCd2JyAsIEJBU0VfVklESU9DUFJJVkFURSs1LCBpbnQpOgorCWNhc2UgX0lPUigndicgLCBCQVNFX1ZJRElPQ1BSSVZBVEUrNiwgaW50KToKKwljYXNlIF9JT1IoJ3YnICwgQkFTRV9WSURJT0NQUklWQVRFKzcsIGludCk6CisJCXJldCA9IG5hdGl2ZV9pb2N0bChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJdjRsX3ByaW50X2lvY3RsKCJjb21wYXRfaW9jdGwzMiIsIGNtZCk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK2xvbmcgdjRsX2NvbXBhdF9pb2N0bDMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorI2VuZGlmCitFWFBPUlRfU1lNQk9MX0dQTCh2NGxfY29tcGF0X2lvY3RsMzIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMKaW5kZXggY2NkNjU2Ni4uN2FkNjcxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwpAQCAtOSw3ICs5LDcgQEAKICAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiBBdXRob3JzOglBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4gKHZlcnNpb24gMSkKKyAqIEF1dGhvcnM6CUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiAodmVyc2lvbiAxKQogICogICAgICAgICAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiAodmVyc2lvbiAyKQogICoKICAqIEZpeGVzOgkyMDAwMDUxNiAgQ2xhdWRpbyBNYXRzdW9rYSA8Y2xhdWRpb0Bjb25lY3RpdmEuY29tPgpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAogI2RlZmluZSBWSURFT19OVU1fREVWSUNFUwkyNTYKICNkZWZpbmUgVklERU9fTkFNRSAgICAgICAgICAgICAgInZpZGVvNGxpbnV4IgpAQCAtNDEsMTcgKzQyLDE3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2luZGV4KHN0cnVjdCBkZXZpY2UgKmNkLAogCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBkZXYpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2QpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHZmZC0+aW5kZXgpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCB2ZGV2LT5pbmRleCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpjZCwKIAkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdG9fdmlkZW9fZGV2aWNlKGNkKTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuKnNcbiIsIChpbnQpc2l6ZW9mKHZmZC0+bmFtZSksIHZmZC0+bmFtZSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJS4qc1xuIiwgKGludClzaXplb2YodmRldi0+bmFtZSksIHZkZXYtPm5hbWUpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmlkZW9fZGV2aWNlX2F0dHJzW10gPSB7CkBAIC03Myw2NCArNzQsNjQgQEAKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fZGV2aWNlX2FsbG9jKTsKIAotdm9pZCB2aWRlb19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpCit2b2lkIHZpZGVvX2RldmljZV9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7Ci0Ja2ZyZWUodmZkKTsKKwlrZnJlZSh2ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fZGV2aWNlX3JlbGVhc2UpOwogCi12b2lkIHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCkKK3ZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHkoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIHsKIAkvKiBEbyBub3RoaW5nICovCiAJLyogT25seSB2YWxpZCB3aGVuIHRoZSB2aWRlb19kZXZpY2Ugc3RydWN0IGlzIGEgc3RhdGljLiAqLwogfQogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSk7CiAKLS8qIENhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGNoYXJhY3RlciBkZXZpY2UgaXMgZ29uZS4gKi8KLXN0YXRpYyB2b2lkIHY0bDJfY2hhcmRldl9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQorc3RhdGljIGlubGluZSB2b2lkIHZpZGVvX2dldChzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjZGV2LmtvYmopOworCWdldF9kZXZpY2UoJnZkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19wdXQoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlwdXRfZGV2aWNlKCZ2ZGV2LT5kZXYpOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIHRoZSB2aWRlbyBkZXZpY2UgZXhpdHMuICovCitzdGF0aWMgdm9pZCB2NGwyX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmNkKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2QpOwogCiAJbXV0ZXhfbG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JaWYgKHZpZGVvX2RldmljZVt2ZmQtPm1pbm9yXSAhPSB2ZmQpIHsKKwlpZiAodmlkZW9fZGV2aWNlW3ZkZXYtPm1pbm9yXSAhPSB2ZGV2KSB7CiAJCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JCUJVRygpOworCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlXQVJOX09OKDEpOwogCQlyZXR1cm47CiAJfQogCiAJLyogRnJlZSB1cCB0aGlzIGRldmljZSBmb3IgcmV1c2UgKi8KLQl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gPSBOVUxMOwotCWNsZWFyX2JpdCh2ZmQtPm51bSwgdmlkZW9fbnVtc1t2ZmQtPnZmbF90eXBlXSk7CisJdmlkZW9fZGV2aWNlW3ZkZXYtPm1pbm9yXSA9IE5VTEw7CisKKwkvKiBEZWxldGUgdGhlIGNkZXYgb24gdGhpcyBtaW5vciBhcyB3ZWxsICovCisJY2Rldl9kZWwodmRldi0+Y2Rldik7CisJLyogSnVzdCBpbiBjYXNlIHNvbWUgZHJpdmVyIHRyaWVzIHRvIGFjY2VzcyB0aGlzIGZyb20KKwkgICB0aGUgcmVsZWFzZSgpIGNhbGxiYWNrLiAqLworCXZkZXYtPmNkZXYgPSBOVUxMOworCisJLyogTWFyayBtaW5vciBhcyBmcmVlICovCisJY2xlYXJfYml0KHZkZXYtPm51bSwgdmlkZW9fbnVtc1t2ZGV2LT52ZmxfdHlwZV0pOworCiAJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAotCS8qIFJlbGVhc2UgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KLQl2ZmQtPmNkZXZfcmVsZWFzZShrb2JqKTsKIAkvKiBSZWxlYXNlIHZpZGVvX2RldmljZSBhbmQgcGVyZm9ybSBvdGhlcgogCSAgIGNsZWFudXBzIGFzIG5lZWRlZC4gKi8KLQlpZiAodmZkLT5yZWxlYXNlKQotCQl2ZmQtPnJlbGVhc2UodmZkKTsKLX0KLQotLyogVGhlIG5ldyBrb2JqX3R5cGUgZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB2NGwyX2t0eXBlX2NkZXZfZGVmYXVsdCA9IHsKLQkucmVsZWFzZSA9IHY0bDJfY2hhcmRldl9yZWxlYXNlLAotfTsKLQotc3RhdGljIHZvaWQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpjZCkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGRldik7Ci0KLQkvKiBJdCdzIG5vdyBzYWZlIHRvIGRlbGV0ZSB0aGUgY2hhciBkZXZpY2UuCi0JICAgVGhpcyB3aWxsIGVpdGhlciB0cmlnZ2VyIHRoZSB2NGwyX2NoYXJkZXZfcmVsZWFzZSBpbW1lZGlhdGVseSAoaWYKLQkgICB0aGUgcmVmY291bnQgZ29lcyB0byAwKSBvciBsYXRlciB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgdGhlCi0JICAgY2hhcmFjdGVyIGRldmljZSBjbG9zZXMgaXQuICovCi0JY2Rldl9kZWwoJnZmZC0+Y2Rldik7CisJdmRldi0+cmVsZWFzZSh2ZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGFzcyB2aWRlb19jbGFzcyA9IHsKIAkubmFtZSA9IFZJREVPX05BTUUsCiAJLmRldl9hdHRycyA9IHZpZGVvX2RldmljZV9hdHRycywKLQkuZGV2X3JlbGVhc2UgPSB2aWRlb19yZWxlYXNlLAogfTsKIAogc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTEzOSwxMyArMTQwLDE2MyBAQAogfQogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZkYXRhKTsKIAorc3RhdGljIHNzaXplX3QgdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3Qgc3osIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworCisJaWYgKCF2ZGV2LT5mb3BzLT5yZWFkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmlkZW9faXNfdW5yZWdpc3RlcmVkKHZkZXYpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdmRldi0+Zm9wcy0+cmVhZChmaWxwLCBidWYsIHN6LCBvZmYpOworfQorCitzdGF0aWMgc3NpemVfdCB2NGwyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3Qgc3osIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworCisJaWYgKCF2ZGV2LT5mb3BzLT53cml0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZpZGVvX2lzX3VucmVnaXN0ZXJlZCh2ZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHZkZXYtPmZvcHMtPndyaXRlKGZpbHAsIGJ1Ziwgc3osIG9mZik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdjRsMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnBvbGwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlscCk7CisKKwlpZiAoIXZkZXYtPmZvcHMtPnBvbGwgfHwgdmlkZW9faXNfdW5yZWdpc3RlcmVkKHZkZXYpKQorCQlyZXR1cm4gREVGQVVMVF9QT0xMTUFTSzsKKwlyZXR1cm4gdmRldi0+Zm9wcy0+cG9sbChmaWxwLCBwb2xsKTsKK30KKworc3RhdGljIGludCB2NGwyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxwKTsKKworCWlmICghdmRldi0+Zm9wcy0+aW9jdGwpCisJCXJldHVybiAtRU5PVFRZOworCS8qIEFsbG93IGlvY3RsIHRvIGNvbnRpbnVlIGV2ZW4gaWYgdGhlIGRldmljZSB3YXMgdW5yZWdpc3RlcmVkLgorCSAgIFRoaW5ncyBsaWtlIGRlcXVldWVpbmcgYnVmZmVycyBtaWdodCBzdGlsbCBiZSB1c2VmdWwuICovCisJcmV0dXJuIHZkZXYtPmZvcHMtPmlvY3RsKGlub2RlLCBmaWxwLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBsb25nIHY0bDJfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworCisJaWYgKCF2ZGV2LT5mb3BzLT51bmxvY2tlZF9pb2N0bCkKKwkJcmV0dXJuIC1FTk9UVFk7CisJLyogQWxsb3cgaW9jdGwgdG8gY29udGludWUgZXZlbiBpZiB0aGUgZGV2aWNlIHdhcyB1bnJlZ2lzdGVyZWQuCisJICAgVGhpbmdzIGxpa2UgZGVxdWV1ZWluZyBidWZmZXJzIG1pZ2h0IHN0aWxsIGJlIHVzZWZ1bC4gKi8KKwlyZXR1cm4gdmRldi0+Zm9wcy0+dW5sb2NrZWRfaW9jdGwoZmlscCwgY21kLCBhcmcpOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgdjRsMl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworCisJaWYgKCF2ZGV2LT5mb3BzLT5jb21wYXRfaW9jdGwpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJLyogQWxsb3cgaW9jdGwgdG8gY29udGludWUgZXZlbiBpZiB0aGUgZGV2aWNlIHdhcyB1bnJlZ2lzdGVyZWQuCisJICAgVGhpbmdzIGxpa2UgZGVxdWV1ZWluZyBidWZmZXJzIG1pZ2h0IHN0aWxsIGJlIHVzZWZ1bC4gKi8KKwlyZXR1cm4gdmRldi0+Zm9wcy0+Y29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHY0bDJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxwKTsKKworCWlmICghdmRldi0+Zm9wcy0+bW1hcCB8fAorCSAgICB2aWRlb19pc191bnJlZ2lzdGVyZWQodmRldikpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiB2ZGV2LT5mb3BzLT5tbWFwKGZpbHAsIHZtKTsKK30KKworLyogT3ZlcnJpZGUgZm9yIHRoZSBvcGVuIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHY0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCWludCByZXQ7CisKKwkvKiBDaGVjayBpZiB0aGUgdmlkZW8gZGV2aWNlIGlzIGF2YWlsYWJsZSAqLworCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOworCXZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOworCS8qIHJldHVybiBFTk9ERVYgaWYgdGhlIHZpZGVvIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisJICAgYWxyZWFkeSBvciBpZiBpdCBpcyBub3QgcmVnaXN0ZXJlZCBhbnltb3JlLiAqLworCWlmICh2ZGV2ID09IE5VTEwgfHwgdmlkZW9faXNfdW5yZWdpc3RlcmVkKHZkZXYpKSB7CisJCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBhbmQgaW5jcmVhc2UgdGhlIGRldmljZSByZWZjb3VudCAqLworCXZpZGVvX2dldCh2ZGV2KTsKKwltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOworCXJldCA9IHZkZXYtPmZvcHMtPm9wZW4oaW5vZGUsIGZpbHApOworCS8qIGRlY3JlYXNlIHRoZSByZWZjb3VudCBpbiBjYXNlIG9mIGFuIGVycm9yICovCisJaWYgKHJldCkKKwkJdmlkZW9fcHV0KHZkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE92ZXJyaWRlIGZvciB0aGUgcmVsZWFzZSBmdW5jdGlvbiAqLworc3RhdGljIGludCB2NGwyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlscCk7CisJaW50IHJldCA9IHZkZXYtPmZvcHMtPnJlbGVhc2UoaW5vZGUsIGZpbHApOworCisJLyogZGVjcmVhc2UgdGhlIHJlZmNvdW50IHVuY29uZGl0aW9uYWxseSBzaW5jZSB0aGUgcmVsZWFzZSgpCisJICAgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuICovCisJdmlkZW9fcHV0KHZkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY0bDJfdW5sb2NrZWRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHY0bDJfcmVhZCwKKwkud3JpdGUgPSB2NGwyX3dyaXRlLAorCS5vcGVuID0gdjRsMl9vcGVuLAorCS5tbWFwID0gdjRsMl9tbWFwLAorCS51bmxvY2tlZF9pb2N0bCA9IHY0bDJfdW5sb2NrZWRfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSB2NGwyX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5yZWxlYXNlID0gdjRsMl9yZWxlYXNlLAorCS5wb2xsID0gdjRsMl9wb2xsLAorCS5sbHNlZWsgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2NGwyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSB2NGwyX3JlYWQsCisJLndyaXRlID0gdjRsMl93cml0ZSwKKwkub3BlbiA9IHY0bDJfb3BlbiwKKwkubW1hcCA9IHY0bDJfbW1hcCwKKwkuaW9jdGwgPSB2NGwyX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gdjRsMl9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkucmVsZWFzZSA9IHY0bDJfcmVsZWFzZSwKKwkucG9sbCA9IHY0bDJfcG9sbCwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorfTsKKwogLyoqCiAgKiBnZXRfaW5kZXggLSBhc3NpZ24gc3RyZWFtIG51bWJlciBiYXNlZCBvbiBwYXJlbnQgZGV2aWNlCi0gKiBAdmRldjogdmlkZW9fZGV2aWNlIHRvIGFzc2lnbiBpbmRleCBudW1iZXIgdG8sIHZkZXYtPmRldiBzaG91bGQgYmUgYXNzaWduZWQKLSAqIEBudW06IC0xIGlmIGF1dG8gYXNzaWduLCByZXF1ZXN0ZWQgbnVtYmVyIG90aGVyd2lzZQorICogQHZkZXY6IHZpZGVvX2RldmljZSB0byBhc3NpZ24gaW5kZXggbnVtYmVyIHRvLCB2ZGV2LT5wYXJlbnQgc2hvdWxkIGJlIGFzc2lnbmVkCisgKiBAbnVtOiAgLTEgaWYgYXV0byBhc3NpZ24sIHJlcXVlc3RlZCBudW1iZXIgb3RoZXJ3aXNlCiAgKgorICogTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyBjYWxsZWQgdGhlIG5ldyBkZXZpY2UgaGFzIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkCisgKiBpbiB0aGUgdmlkZW9fZGV2aWNlIGFycmF5LgogICoKLSAqIHJldHVybnMgLUVORklMRSBpZiBudW0gaXMgYWxyZWFkeSBpbiB1c2UsIGEgZnJlZSBpbmRleCBudW1iZXIgaWYKKyAqIFJldHVybnMgLUVORklMRSBpZiBudW0gaXMgYWxyZWFkeSBpbiB1c2UsIGEgZnJlZSBpbmRleCBudW1iZXIgaWYKICAqIHN1Y2Nlc3NmdWwuCiAgKi8KIHN0YXRpYyBpbnQgZ2V0X2luZGV4KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsIGludCBudW0pCkBAIC0xNjIsOSArMzEzLDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIFNvbWUgZHJpdmVycyBkbyBub3Qgc2V0IHRoZSBwYXJlbnQuIEluIHRoYXQgY2FzZSBhbHdheXMgcmV0dXJuIDAuICovCisJaWYgKHZkZXYtPnBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwogCWZvciAoaSA9IDA7IGkgPCBWSURFT19OVU1fREVWSUNFUzsgaSsrKSB7CiAJCWlmICh2aWRlb19kZXZpY2VbaV0gIT0gTlVMTCAmJgotCQkgICAgdmlkZW9fZGV2aWNlW2ldICE9IHZkZXYgJiYKIAkJICAgIHZpZGVvX2RldmljZVtpXS0+cGFyZW50ID09IHZkZXYtPnBhcmVudCkgewogCQkJdXNlZCB8PSAxIDw8IHZpZGVvX2RldmljZVtpXS0+aW5kZXg7CiAJCX0KQEAgLTE4MCwxNyArMzM0LDE1IEBACiAJcmV0dXJuIGkgPiBtYXhfaW5kZXggPyAtRU5GSUxFIDogaTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlkZW9fZm9wczsKLQotaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsIGludCB0eXBlLCBpbnQgbnIpCitpbnQgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsIGludCB0eXBlLCBpbnQgbnIpCiB7Ci0JcmV0dXJuIHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleCh2ZmQsIHR5cGUsIG5yLCAtMSk7CisJcmV0dXJuIHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleCh2ZGV2LCB0eXBlLCBuciwgLTEpOwogfQogRVhQT1JUX1NZTUJPTCh2aWRlb19yZWdpc3Rlcl9kZXZpY2UpOwogCiAvKioKICAqCXZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleCAtIHJlZ2lzdGVyIHZpZGVvNGxpbnV4IGRldmljZXMKLSAqCUB2ZmQ6ICB2aWRlbyBkZXZpY2Ugc3RydWN0dXJlIHdlIHdhbnQgdG8gcmVnaXN0ZXIKKyAqCUB2ZGV2OiB2aWRlbyBkZXZpY2Ugc3RydWN0dXJlIHdlIHdhbnQgdG8gcmVnaXN0ZXIKICAqCUB0eXBlOiB0eXBlIG9mIGRldmljZSB0byByZWdpc3RlcgogICoJQG5yOiAgIHdoaWNoIGRldmljZSBudW1iZXIgKDAgPT0gL2Rldi92aWRlbzAsIDEgPT0gL2Rldi92aWRlbzEsIC4uLgogICogICAgICAgICAgICAgLTEgPT0gZmlyc3QgZnJlZSkKQEAgLTIxNCw4ICszNjYsNyBAQAogICoKICAqCSVWRkxfVFlQRV9SQURJTyAtIEEgcmFkaW8gY2FyZAogICovCi0KLWludCB2aWRlb19yZWdpc3Rlcl9kZXZpY2VfaW5kZXgoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLCBpbnQgdHlwZSwgaW50IG5yLAoraW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleChzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2LCBpbnQgdHlwZSwgaW50IG5yLAogCQkJCQlpbnQgaW5kZXgpCiB7CiAJaW50IGkgPSAwOwpAQCAtMjIzLDE0ICszNzQsMTkgQEAKIAlpbnQgbWlub3Jfb2Zmc2V0ID0gMDsKIAlpbnQgbWlub3JfY250ID0gVklERU9fTlVNX0RFVklDRVM7CiAJY29uc3QgY2hhciAqbmFtZV9iYXNlOwotCXZvaWQgKnByaXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZmQpOworCXZvaWQgKnByaXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCS8qIEEgbWlub3IgdmFsdWUgb2YgLTEgbWFya3MgdGhpcyB2aWRlbyBkZXZpY2UgYXMgbmV2ZXIKKwkgICBoYXZpbmcgYmVlbiByZWdpc3RlcmVkICovCisJaWYgKHZkZXYpCisJCXZkZXYtPm1pbm9yID0gLTE7CiAKIAkvKiB0aGUgcmVsZWFzZSBjYWxsYmFjayBNVVNUIGJlIHByZXNlbnQgKi8KLQlCVUdfT04oIXZmZC0+cmVsZWFzZSk7Ci0KLQlpZiAodmZkID09IE5VTEwpCisJV0FSTl9PTighdmRldiB8fCAhdmRldi0+cmVsZWFzZSk7CisJaWYgKCF2ZGV2IHx8ICF2ZGV2LT5yZWxlYXNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIFBhcnQgMTogY2hlY2sgZGV2aWNlIHR5cGUgKi8KIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CiAJCW5hbWVfYmFzZSA9ICJ2aWRlbyI7CkBAIC0yNTAsOCArNDA2LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXZmZC0+dmZsX3R5cGUgPSB0eXBlOworCXZkZXYtPnZmbF90eXBlID0gdHlwZTsKKwl2ZGV2LT5jZGV2ID0gTlVMTDsKKwlpZiAodmRldi0+djRsMl9kZXYpCisJCXZkZXYtPnBhcmVudCA9IHZkZXYtPnY0bDJfZGV2LT5kZXY7CiAKKwkvKiBQYXJ0IDI6IGZpbmQgYSBmcmVlIG1pbm9yLCBrZXJuZWwgbnVtYmVyIGFuZCBkZXZpY2UgaW5kZXguICovCiAjaWZkZWYgQ09ORklHX1ZJREVPX0ZJWEVEX01JTk9SX1JBTkdFUwogCS8qIEtlZXAgdGhlIHJhbmdlcyBmb3IgdGhlIGZpcnN0IGZvdXIgdHlwZXMgZm9yIGhpc3RvcmljYWwKIAkgKiByZWFzb25zLgpAQCAtMjgyLDEwICs0NDIsNyBAQAogCX0KICNlbmRpZgogCi0JLyogSW5pdGlhbGl6ZSB0aGUgY2hhcmFjdGVyIGRldmljZSAqLwotCWNkZXZfaW5pdCgmdmZkLT5jZGV2LCB2ZmQtPmZvcHMpOwotCXZmZC0+Y2Rldi5vd25lciA9IHZmZC0+Zm9wcy0+b3duZXI7Ci0JLyogcGljayBhIG1pbm9yIG51bWJlciAqLworCS8qIFBpY2sgYSBtaW5vciBudW1iZXIgKi8KIAltdXRleF9sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIAluciA9IGZpbmRfbmV4dF96ZXJvX2JpdCh2aWRlb19udW1zW3R5cGVdLCBtaW5vcl9jbnQsIG5yID09IC0xID8gMCA6IG5yKTsKIAlpZiAobnIgPT0gbWlub3JfY250KQpAQCAtMzA5LDcyICs0NjYsOTIgQEAKIAkJcmV0dXJuIC1FTkZJTEU7CiAJfQogI2VuZGlmCi0JdmZkLT5taW5vciA9IGkgKyBtaW5vcl9vZmZzZXQ7Ci0JdmZkLT5udW0gPSBucjsKKwl2ZGV2LT5taW5vciA9IGkgKyBtaW5vcl9vZmZzZXQ7CisJdmRldi0+bnVtID0gbnI7CiAJc2V0X2JpdChuciwgdmlkZW9fbnVtc1t0eXBlXSk7Ci0JQlVHX09OKHZpZGVvX2RldmljZVt2ZmQtPm1pbm9yXSk7Ci0JdmlkZW9fZGV2aWNlW3ZmZC0+bWlub3JdID0gdmZkOwotCi0JcmV0ID0gZ2V0X2luZGV4KHZmZCwgaW5kZXgpOwotCXZmZC0+aW5kZXggPSByZXQ7Ci0KKwkvKiBTaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSB0aG91Z2h0IHRoaXMgbWlub3Igd2FzIGZyZWUgKi8KKwlXQVJOX09OKHZpZGVvX2RldmljZVt2ZGV2LT5taW5vcl0gIT0gTlVMTCk7CisJcmV0ID0gdmRldi0+aW5kZXggPSBnZXRfaW5kZXgodmRldiwgaW5kZXgpOwogCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CiAKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBnZXRfaW5kZXggZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9taW5vcjsKKwkJZ290byBjbGVhbnVwOwogCX0KIAotCXJldCA9IGNkZXZfYWRkKCZ2ZmQtPmNkZXYsIE1LREVWKFZJREVPX01BSk9SLCB2ZmQtPm1pbm9yKSwgMSk7CisJLyogUGFydCAzOiBJbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJdmRldi0+Y2RldiA9IGNkZXZfYWxsb2MoKTsKKwlpZiAodmRldi0+Y2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaWYgKHZkZXYtPmZvcHMtPnVubG9ja2VkX2lvY3RsKQorCQl2ZGV2LT5jZGV2LT5vcHMgPSAmdjRsMl91bmxvY2tlZF9mb3BzOworCWVsc2UKKwkJdmRldi0+Y2Rldi0+b3BzID0gJnY0bDJfZm9wczsKKwl2ZGV2LT5jZGV2LT5vd25lciA9IHZkZXYtPmZvcHMtPm93bmVyOworCXJldCA9IGNkZXZfYWRkKHZkZXYtPmNkZXYsIE1LREVWKFZJREVPX01BSk9SLCB2ZGV2LT5taW5vciksIDEpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNkZXZfYWRkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWxfbWlub3I7CisJCWtmcmVlKHZkZXYtPmNkZXYpOworCQl2ZGV2LT5jZGV2ID0gTlVMTDsKKwkJZ290byBjbGVhbnVwOwogCX0KLQkvKiBzeXNmcyBjbGFzcyAqLwotCW1lbXNldCgmdmZkLT5kZXYsIDAsIHNpemVvZih2ZmQtPmRldikpOworCisJLyogUGFydCA0OiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggc3lzZnMgKi8KKwltZW1zZXQoJnZkZXYtPmRldiwgMCwgc2l6ZW9mKHZkZXYtPmRldikpOwogCS8qIFRoZSBtZW1zZXQgYWJvdmUgY2xlYXJlZCB0aGUgZGV2aWNlJ3MgZHJ2ZGF0YSwgc28KIAkgICBwdXQgYmFjayB0aGUgY29weSB3ZSBtYWRlIGVhcmxpZXIuICovCi0JdmlkZW9fc2V0X2RydmRhdGEodmZkLCBwcml2KTsKLQl2ZmQtPmRldi5jbGFzcyA9ICZ2aWRlb19jbGFzczsKLQl2ZmQtPmRldi5kZXZ0ID0gTUtERVYoVklERU9fTUFKT1IsIHZmZC0+bWlub3IpOwotCWlmICh2ZmQtPnBhcmVudCkKLQkJdmZkLT5kZXYucGFyZW50ID0gdmZkLT5wYXJlbnQ7Ci0Jc3ByaW50Zih2ZmQtPmRldi5idXNfaWQsICIlcyVkIiwgbmFtZV9iYXNlLCBucik7Ci0JcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZmQtPmRldik7CisJdmlkZW9fc2V0X2RydmRhdGEodmRldiwgcHJpdik7CisJdmRldi0+ZGV2LmNsYXNzID0gJnZpZGVvX2NsYXNzOworCXZkZXYtPmRldi5kZXZ0ID0gTUtERVYoVklERU9fTUFKT1IsIHZkZXYtPm1pbm9yKTsKKwlpZiAodmRldi0+cGFyZW50KQorCQl2ZGV2LT5kZXYucGFyZW50ID0gdmRldi0+cGFyZW50OworCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMlZCIsIG5hbWVfYmFzZSwgbnIpOworCXJldCA9IGRldmljZV9yZWdpc3RlcigmdmRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZGVsX2NkZXY7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JLyogUmVtZW1iZXIgdGhlIGNkZXYncyByZWxlYXNlIGZ1bmN0aW9uICovCi0JdmZkLT5jZGV2X3JlbGVhc2UgPSB2ZmQtPmNkZXYua29iai5rdHlwZS0+cmVsZWFzZTsKLQkvKiBJbnN0YWxsIG91ciBvd24gKi8KLQl2ZmQtPmNkZXYua29iai5rdHlwZSA9ICZ2NGwyX2t0eXBlX2NkZXZfZGVmYXVsdDsKKwkvKiBSZWdpc3RlciB0aGUgcmVsZWFzZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGxhc3QKKwkgICByZWZlcmVuY2UgdG8gdGhlIGRldmljZSBnb2VzIGF3YXkuICovCisJdmRldi0+ZGV2LnJlbGVhc2UgPSB2NGwyX2RldmljZV9yZWxlYXNlOworCisJLyogUGFydCA1OiBBY3RpdmF0ZSB0aGlzIG1pbm9yLiBUaGUgY2hhciBkZXZpY2UgY2FuIG5vdyBiZSB1c2VkLiAqLworCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOworCXZpZGVvX2RldmljZVt2ZGV2LT5taW5vcl0gPSB2ZGV2OworCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CiAJcmV0dXJuIDA7CiAKLWRlbF9jZGV2OgotCWNkZXZfZGVsKCZ2ZmQtPmNkZXYpOwotCi1mYWlsX21pbm9yOgorY2xlYW51cDoKIAltdXRleF9sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKLQl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gPSBOVUxMOwotCWNsZWFyX2JpdCh2ZmQtPm51bSwgdmlkZW9fbnVtc1t0eXBlXSk7CisJaWYgKHZkZXYtPmNkZXYpCisJCWNkZXZfZGVsKHZkZXYtPmNkZXYpOworCWNsZWFyX2JpdCh2ZGV2LT5udW0sIHZpZGVvX251bXNbdHlwZV0pOwogCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JdmZkLT5taW5vciA9IC0xOworCS8qIE1hcmsgdGhpcyB2aWRlbyBkZXZpY2UgYXMgbmV2ZXIgaGF2aW5nIGJlZW4gcmVnaXN0ZXJlZC4gKi8KKwl2ZGV2LT5taW5vciA9IC0xOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleCk7CiAKIC8qKgogICoJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UgLSB1bnJlZ2lzdGVyIGEgdmlkZW80bGludXggZGV2aWNlCi0gKglAdmZkOiB0aGUgZGV2aWNlIHRvIHVucmVnaXN0ZXIKKyAqCUB2ZGV2OiB0aGUgZGV2aWNlIHRvIHVucmVnaXN0ZXIKICAqCi0gKglUaGlzIHVucmVnaXN0ZXJzIHRoZSBwYXNzZWQgZGV2aWNlIGFuZCBkZWFzc2lnbnMgdGhlIG1pbm9yCi0gKgludW1iZXIuIEZ1dHVyZSBvcGVuIGNhbGxzIHdpbGwgYmUgbWV0IHdpdGggZXJyb3JzLgorICoJVGhpcyB1bnJlZ2lzdGVycyB0aGUgcGFzc2VkIGRldmljZS4gRnV0dXJlIG9wZW4gY2FsbHMgd2lsbAorICoJYmUgbWV0IHdpdGggZXJyb3JzLgogICovCi0KLXZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQordm9pZCB2aWRlb191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQogewotCWRldmljZV91bnJlZ2lzdGVyKCZ2ZmQtPmRldik7CisJLyogQ2hlY2sgaWYgdmRldiB3YXMgZXZlciByZWdpc3RlcmVkIGF0IGFsbCAqLworCWlmICghdmRldiB8fCB2ZGV2LT5taW5vciA8IDApCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOworCXNldF9iaXQoVjRMMl9GTF9VTlJFR0lTVEVSRUQsICZ2ZGV2LT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmdmRldi0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlZmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICAgIFY0TDIgZGV2aWNlIHN1cHBvcnQuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKworaW50IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKK3sKKwlpZiAoZGV2ID09IE5VTEwgfHwgdjRsMl9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogV2FybiBpZiB3ZSBhcHBhcmVudGx5IHJlLXJlZ2lzdGVyIGEgZGV2aWNlICovCisJV0FSTl9PTihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJSU5JVF9MSVNUX0hFQUQoJnY0bDJfZGV2LT5zdWJkZXZzKTsKKwlzcGluX2xvY2tfaW5pdCgmdjRsMl9kZXYtPmxvY2spOworCXY0bDJfZGV2LT5kZXYgPSBkZXY7CisJc25wcmludGYodjRsMl9kZXYtPm5hbWUsIHNpemVvZih2NGwyX2Rldi0+bmFtZSksICIlcyAlcyIsCisJCQlkZXYtPmRyaXZlci0+bmFtZSwgZGV2LT5idXNfaWQpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHY0bDJfZGV2KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZGV2aWNlX3JlZ2lzdGVyKTsKKwordm9pZCB2NGwyX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgKm5leHQ7CisKKwlpZiAodjRsMl9kZXYgPT0gTlVMTCB8fCB2NGwyX2Rldi0+ZGV2ID09IE5VTEwpCisJCXJldHVybjsKKwlkZXZfc2V0X2RydmRhdGEodjRsMl9kZXYtPmRldiwgTlVMTCk7CisJLyogdW5yZWdpc3RlciBzdWJkZXZzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNkLCBuZXh0LCAmdjRsMl9kZXYtPnN1YmRldnMsIGxpc3QpCisJCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKworCXY0bDJfZGV2LT5kZXYgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9kZXZpY2VfdW5yZWdpc3Rlcik7CisKK2ludCB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoc3RydWN0IHY0bDJfZGV2aWNlICpkZXYsIHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJLyogQ2hlY2sgZm9yIHZhbGlkIGlucHV0ICovCisJaWYgKGRldiA9PSBOVUxMIHx8IHNkID09IE5VTEwgfHwgIXNkLT5uYW1lWzBdKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBXYXJuIGlmIHdlIGFwcGFyZW50bHkgcmUtcmVnaXN0ZXIgYSBzdWJkZXYgKi8KKwlXQVJOX09OKHNkLT5kZXYpOworCWlmICghdHJ5X21vZHVsZV9nZXQoc2QtPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2QtPmRldiA9IGRldjsKKwlzcGluX2xvY2soJmRldi0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmc2QtPmxpc3QsICZkZXYtPnN1YmRldnMpOworCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KTsKKwordm9pZCB2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCS8qIHJldHVybiBpZiBpdCBpc24ndCByZWdpc3RlcmVkICovCisJaWYgKHNkID09IE5VTEwgfHwgc2QtPmRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrKCZzZC0+ZGV2LT5sb2NrKTsKKwlsaXN0X2RlbCgmc2QtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZzZC0+ZGV2LT5sb2NrKTsKKwlzZC0+ZGV2ID0gTlVMTDsKKwltb2R1bGVfcHV0KHNkLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCmluZGV4IDcxMGUxYTQuLmIwNjMzODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCkBAIC04LDcgKzgsNyBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqIEF1dGhvcnM6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPiAodmVyc2lvbiAxKQorICogQXV0aG9yczoJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+ICh2ZXJzaW9uIDEpCiAgKiAgICAgICAgICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+ICh2ZXJzaW9uIDIpCiAgKi8KIApAQCAtMzkzLDEwICszOTMsOCBAQAogICogT2Jzb2xldGUgdXNlcmNvcHkgZnVuY3Rpb24gLSBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCiAgKi8KIGludAotdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCSAgICAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykpCit2aWRlb191c2VyY29weShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCXY0bDJfa2lvY3RsIGZ1bmMpCiB7CiAJY2hhcglzYnVmWzEyOF07CiAJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CkBAIC00NTgsNyArNDU2LDcgQEAKIAl9CiAKIAkvKiBjYWxsIGRyaXZlciAqLwotCWVyciA9IGZ1bmMoaW5vZGUsIGZpbGUsIGNtZCwgcGFyZyk7CisJZXJyID0gZnVuYyhmaWxlLCBjbWQsIHBhcmcpOwogCWlmIChlcnIgPT0gLUVOT0lPQ1RMQ01EKQogCQllcnIgPSAtRUlOVkFMOwogCWlmIChpc19leHRfY3RybCkgewpAQCAtMTQ4MSw5ICsxNDc5LDE1IEBACiAJY2FzZSBWSURJT0NfR19DUk9QOgogCXsKIAkJc3RydWN0IHY0bDJfY3JvcCAqcCA9IGFyZzsKKwkJX191MzIgdHlwZTsKIAogCQlpZiAoIW9wcy0+dmlkaW9jX2dfY3JvcCkKIAkJCWJyZWFrOworCisJCXR5cGUgPSBwLT50eXBlOworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCXAtPnR5cGUgPSB0eXBlOworCiAJCWRiZ2FyZyhjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMocC0+dHlwZSwgdjRsMl90eXBlX25hbWVzKSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX2dfY3JvcChmaWxlLCBmaCwgcCk7CiAJCWlmICghcmV0KQpAQCAtMTUwNCwxMCArMTUwOCwxNiBAQAogCWNhc2UgVklESU9DX0NST1BDQVA6CiAJewogCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpwID0gYXJnOworCQlfX3UzMiB0eXBlOwogCiAJCS8qRklYTUU6IFNob3VsZCBhbHNvIHNob3cgdjRsMl9mcmFjdCBwaXhlbGFzcGVjdCAqLwogCQlpZiAoIW9wcy0+dmlkaW9jX2Nyb3BjYXApCiAJCQlicmVhazsKKworCQl0eXBlID0gcC0+dHlwZTsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlwLT50eXBlID0gdHlwZTsKKwogCQlkYmdhcmcoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKHAtPnR5cGUsIHY0bDJfdHlwZV9uYW1lcykpOwogCQlyZXQgPSBvcHMtPnZpZGlvY19jcm9wY2FwKGZpbGUsIGZoLCBwKTsKIAkJaWYgKCFyZXQpIHsKQEAgLTE1MjIsNiArMTUzMiw5IEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19nX2pwZWdjb21wKQogCQkJYnJlYWs7CisKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCiAJCXJldCA9IG9wcy0+dmlkaW9jX2dfanBlZ2NvbXAoZmlsZSwgZmgsIHApOwogCQlpZiAoIXJldCkKIAkJCWRiZ2FyZyhjbWQsICJxdWFsaXR5PSVkLCBBUFBuPSVkLCAiCkBAIC0xNzQ5LDYgKzE3NjIsNzcgQEAKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc19od19mcmVxX3NlZWsoZmlsZSwgZmgsIHApOwogCQlicmVhazsKIAl9CisJY2FzZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTOgorCXsKKwkJc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKnAgPSBhcmc7CisKKwkJaWYgKCFvcHMtPnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMpCisJCQlicmVhazsKKworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisKKwkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mcmFtZXNpemVzKGZpbGUsIGZoLCBwKTsKKwkJZGJnYXJnKGNtZCwKKwkJCSJpbmRleD0lZCwgcGl4ZWxmb3JtYXQ9JWQsIHR5cGU9JWQgIiwKKwkJCXAtPmluZGV4LCBwLT5waXhlbF9mb3JtYXQsIHAtPnR5cGUpOworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURToKKwkJCWRiZ2FyZzIoIndpZHRoID0gJWQsIGhlaWdodD0lZFxuIiwKKwkJCQlwLT5kaXNjcmV0ZS53aWR0aCwgcC0+ZGlzY3JldGUuaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFOgorCQkJZGJnYXJnMigibWluICVkeCVkLCBtYXggJWR4JWQsIHN0ZXAgJWR4JWRcbiIsCisJCQkJcC0+c3RlcHdpc2UubWluX3dpZHRoLCAgcC0+c3RlcHdpc2UubWluX2hlaWdodCwKKwkJCQlwLT5zdGVwd2lzZS5zdGVwX3dpZHRoLCBwLT5zdGVwd2lzZS5zdGVwX2hlaWdodCwKKwkJCQlwLT5zdGVwd2lzZS5tYXhfd2lkdGgsICBwLT5zdGVwd2lzZS5tYXhfaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRlJNU0laRV9UWVBFX0NPTlRJTlVPVVM6CisJCQlkYmdhcmcyKCJjb250aW51b3VzXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGJnYXJnMigiLSBVbmtub3duIHR5cGUhXG4iKTsKKwkJfQorCisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTOgorCXsKKwkJc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKnAgPSBhcmc7CisKKwkJaWYgKCFvcHMtPnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzKQorCQkJYnJlYWs7CisKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCisJCXJldCA9IG9wcy0+dmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMoZmlsZSwgZmgsIHApOworCQlkYmdhcmcoY21kLAorCQkJImluZGV4PSVkLCBwaXhlbGZvcm1hdD0lZCwgd2lkdGg9JWQsIGhlaWdodD0lZCwgdHlwZT0lZCAiLAorCQkJcC0+aW5kZXgsIHAtPnBpeGVsX2Zvcm1hdCwKKwkJCXAtPndpZHRoLCBwLT5oZWlnaHQsIHAtPnR5cGUpOworCQlzd2l0Y2ggKHAtPnR5cGUpIHsKKwkJY2FzZSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURToKKwkJCWRiZ2FyZzIoImZwcz0lZC8lZFxuIiwKKwkJCQlwLT5kaXNjcmV0ZS5udW1lcmF0b3IsCisJCQkJcC0+ZGlzY3JldGUuZGVub21pbmF0b3IpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0U6CisJCQlkYmdhcmcyKCJtaW49JWQvJWQsIG1heD0lZC8lZCwgc3RlcD0lZC8lZFxuIiwKKwkJCQlwLT5zdGVwd2lzZS5taW4ubnVtZXJhdG9yLAorCQkJCXAtPnN0ZXB3aXNlLm1pbi5kZW5vbWluYXRvciwKKwkJCQlwLT5zdGVwd2lzZS5tYXgubnVtZXJhdG9yLAorCQkJCXAtPnN0ZXB3aXNlLm1heC5kZW5vbWluYXRvciwKKwkJCQlwLT5zdGVwd2lzZS5zdGVwLm51bWVyYXRvciwKKwkJCQlwLT5zdGVwd2lzZS5zdGVwLmRlbm9taW5hdG9yKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRlJNSVZBTF9UWVBFX0NPTlRJTlVPVVM6CisJCQlkYmdhcmcyKCJjb250aW51b3VzXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGJnYXJnMigiLSBVbmtub3duIHR5cGUhXG4iKTsKKwkJfQorCQlicmVhazsKKwl9CisKIAlkZWZhdWx0OgogCXsKIAkJaWYgKCFvcHMtPnZpZGlvY19kZWZhdWx0KQpAQCAtMTc2OCw3ICsxODUyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgX192aWRlb19pb2N0bDIoc3RydWN0IGZpbGUgKmZpbGUsCitsb25nIF9fdmlkZW9faW9jdGwyKHN0cnVjdCBmaWxlICpmaWxlLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAljaGFyCXNidWZbMTI4XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYxMmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICAgIFY0TDIgc3ViLWRldmljZSBzdXBwb3J0LgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA4ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKK2ludCB2NGwyX3N1YmRldl9jb21tYW5kKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgcXVlcnltZW51LCBhcmcpOworCWNhc2UgVklESU9DX0dfQ1RSTDoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGdfY3RybCwgYXJnKTsKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX2N0cmwsIGFyZyk7CisJY2FzZSBWSURJT0NfUVVFUllNRU5VOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgcXVlcnljdHJsLCBhcmcpOworCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBsb2dfc3RhdHVzKTsKKwljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBnX2NoaXBfaWRlbnQsIGFyZyk7CisJY2FzZSBWSURJT0NfSU5UX1NfU1RBTkRCWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfc3RhbmRieSwgYXJnID8gKCoodTMyICopYXJnKSA6IDApOworCWNhc2UgVklESU9DX0lOVF9SRVNFVDoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHJlc2V0LCBhcmcgPyAoKih1MzIgKilhcmcpIDogMCk7CisJY2FzZSBWSURJT0NfSU5UX1NfR1BJTzoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfZ3BpbywgYXJnID8gKCoodTMyICopYXJnKSA6IDApOworCWNhc2UgVklESU9DX0lOVF9JTklUOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW5pdCwgYXJnID8gKCoodTMyICopYXJnKSA6IDApOworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGdfcmVnaXN0ZXIsIGFyZyk7CisJY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3JlZ2lzdGVyLCBhcmcpOworI2VuZGlmCisKKwljYXNlIFZJRElPQ19JTlRfU19UVU5FUl9NT0RFOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdHVuZXIsIHNfbW9kZSwgKihlbnVtIHY0bDJfdHVuZXJfdHlwZSAqKWFyZyk7CisJY2FzZSBBVURDX1NFVF9SQURJTzoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHR1bmVyLCBzX3JhZGlvKTsKKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdHVuZXIsIHNfdHVuZXIsIGFyZyk7CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHR1bmVyLCBnX3R1bmVyLCBhcmcpOworCWNhc2UgVklESU9DX1NfU1REOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdHVuZXIsIHNfc3RkLCAqKHY0bDJfc3RkX2lkICopYXJnKTsKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgYXJnKTsKKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHR1bmVyLCBnX2ZyZXF1ZW5jeSwgYXJnKTsKKwljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCB0dW5lciwgc190eXBlX2FkZHIsIGFyZyk7CisJY2FzZSBUVU5FUl9TRVRfQ09ORklHOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdHVuZXIsIHNfY29uZmlnLCBhcmcpOworCisJY2FzZSBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVE6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBhdWRpbywgc19jbG9ja19mcmVxLCAqKHUzMiAqKWFyZyk7CisJY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGF1ZGlvLCBzX3JvdXRpbmcsIGFyZyk7CisJY2FzZSBWSURJT0NfSU5UX0kyU19DTE9DS19GUkVROgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgYXVkaW8sIHNfaTJzX2Nsb2NrX2ZyZXEsICoodTMyICopYXJnKTsKKworCWNhc2UgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkc6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19yb3V0aW5nLCBhcmcpOworCWNhc2UgVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX2NyeXN0YWxfZnJlcSwgYXJnKTsKKwljYXNlIFZJRElPQ19JTlRfREVDT0RFX1ZCSV9MSU5FOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGRlY29kZV92YmlfbGluZSwgYXJnKTsKKwljYXNlIFZJRElPQ19JTlRfU19WQklfREFUQToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3ZiaV9kYXRhLCBhcmcpOworCWNhc2UgVklESU9DX0lOVF9HX1ZCSV9EQVRBOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfdmJpX2RhdGEsIGFyZyk7CisJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX3NsaWNlZF92YmlfY2FwLCBhcmcpOworCWNhc2UgVklESU9DX1NfRk1UOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfZm10LCBhcmcpOworCWNhc2UgVklESU9DX0dfRk1UOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfZm10LCBhcmcpOworCWNhc2UgVklESU9DX0lOVF9TX1NURF9PVVRQVVQ6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19zdGRfb3V0cHV0LCAqKHY0bDJfc3RkX2lkICopYXJnKTsKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3N0cmVhbSwgMSk7CisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfc3RyZWFtLCAwKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBpb2N0bCwgY21kLCBhcmcpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfc3ViZGV2X2NvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwppbmRleCAxZWZjNWYzLi5hNzJhMzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtNDIzNyw4ICs0MjM3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHZpbm9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlub19kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKQEAgLTQzNTMsNyArNDM1Miw3IEBACiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdmNzLT5tdXRleCkpCiAJCXJldHVybiAtRUlOVFI7CiAKLQlyZXQgPSB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHZpbm9fZG9faW9jdGwpOworCXJldCA9IHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCB2aW5vX2RvX2lvY3RsKTsKIAogCW11dGV4X3VubG9jaygmdmNzLT5tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnAyN3NtcHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnAyN3NtcHguYwppbmRleCA1Nzc5NTZjLi5mNzJiODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZwMjdzbXB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92cDI3c21weC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi5oPgogCkBAIC00MCwxMyArNDAsMjAgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCB2cDI3c21weF9zdGF0ZSB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOwogCWludCByYWRpbzsKIAl1MzIgYXVkbW9kZTsKIH07CiAKLXN0YXRpYyB2b2lkIHZwMjdzbXB4X3NldF9hdWRtb2RlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiBhdWRtb2RlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IHZwMjdzbXB4X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCB2cDI3c21weF9zdGF0ZSwgc2QpOworfQorCitzdGF0aWMgdm9pZCB2cDI3c21weF9zZXRfYXVkbW9kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgYXVkbW9kZSkKK3sKKwlzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAl1OCBkYXRhWzNdID0geyAweDAwLCAweDAwLCAweDA0IH07CiAKIAlzd2l0Y2ggKGF1ZG1vZGUpIHsKQEAgLTYzLDU1ICs3MCw4OSBAQAogCX0KIAogCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCBzaXplb2YoZGF0YSkpICE9IHNpemVvZihkYXRhKSkKLQkJdjRsX2VycihjbGllbnQsICIlczogSS9PIGVycm9yIHNldHRpbmcgYXVkbW9kZVxuIiwKLQkJCQljbGllbnQtPm5hbWUpOworCQl2NGwyX2VycihzZCwgIkkvTyBlcnJvciBzZXR0aW5nIGF1ZG1vZGVcbiIpOwogCWVsc2UKIAkJc3RhdGUtPmF1ZG1vZGUgPSBhdWRtb2RlOwogfQogCi1zdGF0aWMgaW50IHZwMjdzbXB4X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZwMjdzbXB4X3NfcmFkaW8oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKLQlzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOworCXN0cnVjdCB2cDI3c21weF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVEQ19TRVRfUkFESU86Ci0JCXN0YXRlLT5yYWRpbyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JCXN0YXRlLT5yYWRpbyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJaWYgKCFzdGF0ZS0+cmFkaW8pCi0JCQl2cDI3c21weF9zZXRfYXVkbW9kZShjbGllbnQsIHZ0LT5hdWRtb2RlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQlpZiAoc3RhdGUtPnJhZGlvKQotCQkJYnJlYWs7Ci0JCXZ0LT5hdWRtb2RlID0gc3RhdGUtPmF1ZG1vZGU7Ci0JCXZ0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwKLQkJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzI7Ci0JCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywKLQkJCQlWNEwyX0lERU5UX1ZQMjdTTVBYLCAwKTsKLQotCWNhc2UgVklESU9DX0xPR19TVEFUVVM6Ci0JCXY0bF9pbmZvKGNsaWVudCwgIkF1ZGlvIE1vZGU6ICV1JXNcbiIsIHN0YXRlLT5hdWRtb2RlLAotCQkJCXN0YXRlLT5yYWRpbyA/ICIgKFJhZGlvKSIgOiAiIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXN0YXRlLT5yYWRpbyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdnAyN3NtcHhfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgbm9ybSkKK3sKKwlzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJc3RhdGUtPnJhZGlvID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDI3c21weF9zX3R1bmVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3R1bmVyICp2dCkKK3sKKwlzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJaWYgKCFzdGF0ZS0+cmFkaW8pCisJCXZwMjdzbXB4X3NldF9hdWRtb2RlKHNkLCB2dC0+YXVkbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnAyN3NtcHhfZ190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCit7CisJc3RydWN0IHZwMjdzbXB4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCWlmIChzdGF0ZS0+cmFkaW8pCisJCXJldHVybiAwOworCXZ0LT5hdWRtb2RlID0gc3RhdGUtPmF1ZG1vZGU7CisJdnQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfAorCQlWNEwyX1RVTkVSX0NBUF9MQU5HMSB8IFY0TDJfVFVORVJfQ0FQX0xBTkcyOworCXZ0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDI3c21weF9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBjaGlwLCBWNEwyX0lERU5UX1ZQMjdTTVBYLCAwKTsKK30KKworc3RhdGljIGludCB2cDI3c21weF9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHZwMjdzbXB4X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfaW5mbyhzZCwgIkF1ZGlvIE1vZGU6ICV1JXNcbiIsIHN0YXRlLT5hdWRtb2RlLAorCQkJc3RhdGUtPnJhZGlvID8gIiAoUmFkaW8pIiA6ICIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDI3c21weF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdnAyN3NtcHhfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB2cDI3c21weF9sb2dfc3RhdHVzLAorCS5nX2NoaXBfaWRlbnQgPSB2cDI3c21weF9nX2NoaXBfaWRlbnQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB2cDI3c21weF90dW5lcl9vcHMgPSB7CisJLnNfcmFkaW8gPSB2cDI3c21weF9zX3JhZGlvLAorCS5zX3N0ZCA9IHZwMjdzbXB4X3Nfc3RkLAorCS5zX3R1bmVyID0gdnAyN3NtcHhfc190dW5lciwKKwkuZ190dW5lciA9IHZwMjdzbXB4X2dfdHVuZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB2cDI3c21weF9vcHMgPSB7CisJLmNvcmUgPSAmdnAyN3NtcHhfY29yZV9vcHMsCisJLnR1bmVyID0gJnZwMjdzbXB4X3R1bmVyX29wcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIGkyYyBpbXBsZW1lbnRhdGlvbiAqLwpAQCAtMTI1LDYgKzE2Niw3IEBACiAJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdnAyN3NtcHhfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCkBAIC0xMzYsMTcgKzE3OCwyMSBAQAogCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwMjdzbXB4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOworCXNkID0gJnN0YXRlLT5zZDsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmdnAyN3NtcHhfb3BzKTsKIAlzdGF0ZS0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3RhdGUpOwogCiAJLyogaW5pdGlhbGl6ZSB2cDI3c21weCAqLwotCXZwMjdzbXB4X3NldF9hdWRtb2RlKGNsaWVudCwgc3RhdGUtPmF1ZG1vZGUpOworCXZwMjdzbXB4X3NldF9hdWRtb2RlKHNkLCBzdGF0ZS0+YXVkbW9kZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdnAyN3NtcHhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlrZnJlZSh0b19zdGF0ZShzZCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKaW5kZXggYjJkYmU0OC4uNTZjNTcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYwpAQCAtNzI3LDggKzcyNyw3IEBACiAgKglWaWRlbzRsaW51eCBpbnRlcmZhY2luZwogICovCiAKLXN0YXRpYyBpbnQgdzk5NjZfdjRsX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB3OTk2Nl92NGxfZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgdzk5NjZfZGV2ICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCkBAIC04ODEsNyArODgwLDcgQEAKIHN0YXRpYyBpbnQgdzk5NjZfdjRsX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdzk5NjZfdjRsX2RvX2lvY3RsKTsKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIHc5OTY2X3Y0bF9kb19pb2N0bCk7CiB9CiAKIC8vIENhcHR1cmUgZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93bTg3MzkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204NzM5LmMKaW5kZXggNTRhYzNmZS4uMTJhMzFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93bTg3MzkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODczOS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi5oPgogCkBAIC01Miw2ICs1Miw3IEBACiB9OwogCiBzdHJ1Y3Qgd204NzM5X3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAJdTMyIGNsb2NrX2ZyZXE7CiAJdTggbXV0ZWQ7CiAJdTE2IHZvbHVtZTsKQEAgLTYwLDQzICs2MSw0OSBAQAogCXU4IHZvbF9yOyAJCS8qICsxMmRCIHRvIC0zNC41ZEIgMS41ZEIgc3RlcCAoNWJpdCkgZGVmOjBkQiAqLwogfTsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgd204NzM5X3N0YXRlICp0b19zdGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCB3bTg3Mzlfc3RhdGUsIHNkKTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgd204NzM5X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHUxNiB2YWwpCitzdGF0aWMgaW50IHdtODczOV93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgcmVnLCB1MTYgdmFsKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlpbnQgaTsKIAogCWlmIChyZWcgPCAwIHx8IHJlZyA+PSBUT1RfUkVHUykgewotCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQl2NGwyX2VycihzZCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAid3JpdGU6ICUwMnggJTAyeFxuIiwgcmVnLCB2YWwpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIndyaXRlOiAlMDJ4ICUwMnhcbiIsIHJlZywgdmFsKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkocmVnIDw8IDEpIHwgKHZhbCA+PiA4KSwgdmFsICYgMHhmZikgPT0gMCkKIAkJCXJldHVybiAwOwotCXY0bF9lcnIoY2xpZW50LCAiSTJDOiBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJWRcbiIsIHZhbCwgcmVnKTsKKwl2NGwyX2VycihzZCwgIkkyQzogY2Fubm90IHdyaXRlICUwM3ggdG8gcmVnaXN0ZXIgUiVkXG4iLCB2YWwsIHJlZyk7CiAJcmV0dXJuIC0xOwogfQogCiAvKiB3cml0ZSByZWdzIHRvIHNldCBhdWRpbyB2b2x1bWUgZXRjICovCi1zdGF0aWMgdm9pZCB3bTg3Mzlfc2V0X2F1ZGlvKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCB3bTg3Mzlfc2V0X2F1ZGlvKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IHdtODczOV9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgd204NzM5X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAl1MTYgbXV0ZSA9IHN0YXRlLT5tdXRlZCA/IDB4ODAgOiAwOwogCiAJLyogVm9sdW1lIHNldHRpbmc6IGJpdHMgMC00LCAweDFmID0gMTIgZEIsIDB4MDAgPSAtMzQuNSBkQgogCSAqIERlZmF1bHQgc2V0dGluZzogMHgxNyA9IDAgZEIKIAkgKi8KLQl3bTg3Mzlfd3JpdGUoY2xpZW50LCBSMCwgKHN0YXRlLT52b2xfbCAmIDB4MWYpIHwgbXV0ZSk7Ci0Jd204NzM5X3dyaXRlKGNsaWVudCwgUjEsIChzdGF0ZS0+dm9sX3IgJiAweDFmKSB8IG11dGUpOworCXdtODczOV93cml0ZShzZCwgUjAsIChzdGF0ZS0+dm9sX2wgJiAweDFmKSB8IG11dGUpOworCXdtODczOV93cml0ZShzZCwgUjEsIChzdGF0ZS0+dm9sX3IgJiAweDFmKSB8IG11dGUpOwogfQogCi1zdGF0aWMgaW50IHdtODczOV9nZXRfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCB3bTg3MzlfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHdtODczOV9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3Qgd204NzM5X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0xMTcsOSArMTI0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTg3Mzlfc2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgd204NzM5X3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB3bTg3Mzlfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHdtODczOV9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CiAJdW5zaWduZWQgaW50IHdvcmtfbCwgd29ya19yOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtMTQ3LDcgKzE1NCw3IEBACiAJc3RhdGUtPnZvbF9yID0gKGxvbmcpd29ya19yICogMzEgLyA2NTUzNTsKIAogCS8qIHNldCBhdWRpbyB2b2x1bWUgZXRjLiAqLwotCXdtODczOV9zZXRfYXVkaW8oY2xpZW50KTsKKwl3bTg3Mzlfc2V0X2F1ZGlvKHNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2LDc3ICsxOTMsODkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgd204NzM5X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHdtODczOV9zX2Nsb2NrX2ZyZXEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGF1ZGlvZnJlcSkKIHsKLQlzdHJ1Y3Qgd204NzM5X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB3bTg3Mzlfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOwogCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKLQl7Ci0JCXUzMiBhdWRpb2ZyZXEgPSAqKHUzMiAqKWFyZzsKLQotCQlzdGF0ZS0+Y2xvY2tfZnJlcSA9IGF1ZGlvZnJlcTsKLQkJLyogZGUtYWN0aXZhdGUgKi8KLQkJd204NzM5X3dyaXRlKGNsaWVudCwgUjksIDB4MDAwKTsKLQkJc3dpdGNoIChhdWRpb2ZyZXEpIHsKLQkJY2FzZSA0NDEwMDoKLQkJCS8qIDI1NmZwcywgZnM9NDQuMWsgKi8KLQkJCXdtODczOV93cml0ZShjbGllbnQsIFI4LCAweDAyMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA0ODAwMDoKLQkJCS8qIDI1NmZwcywgZnM9NDhrICovCi0JCQl3bTg3Mzlfd3JpdGUoY2xpZW50LCBSOCwgMHgwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzIwMDA6Ci0JCQkvKiAyNTZmcHMsIGZzPTMyayAqLwotCQkJd204NzM5X3dyaXRlKGNsaWVudCwgUjgsIDB4MDE4KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJLyogYWN0aXZhdGUgKi8KLQkJd204NzM5X3dyaXRlKGNsaWVudCwgUjksIDB4MDAxKTsKKwlzdGF0ZS0+Y2xvY2tfZnJlcSA9IGF1ZGlvZnJlcTsKKwkvKiBkZS1hY3RpdmF0ZSAqLworCXdtODczOV93cml0ZShzZCwgUjksIDB4MDAwKTsKKwlzd2l0Y2ggKGF1ZGlvZnJlcSkgeworCWNhc2UgNDQxMDA6CisJCS8qIDI1NmZwcywgZnM9NDQuMWsgKi8KKwkJd204NzM5X3dyaXRlKHNkLCBSOCwgMHgwMjApOwogCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXJldHVybiB3bTg3MzlfZ2V0X2N0cmwoY2xpZW50LCBhcmcpOwotCi0JY2FzZSBWSURJT0NfU19DVFJMOgotCQlyZXR1cm4gd204NzM5X3NldF9jdHJsKGNsaWVudCwgYXJnKTsKLQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczOV9xY3RybCk7IGkrKykKLQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHdtODczOV9xY3RybFtpXS5pZCkgewotCQkJCW1lbWNweShxYywgJndtODczOV9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsCi0JCQkJYXJnLCBWNEwyX0lERU5UX1dNODczOSwgMCk7Ci0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQl2NGxfaW5mbyhjbGllbnQsICJGcmVxdWVuY3k6ICV1IEh6XG4iLCBzdGF0ZS0+Y2xvY2tfZnJlcSk7Ci0JCXY0bF9pbmZvKGNsaWVudCwgIlZvbHVtZSBMOiAgJTAyeCVzXG4iLCBzdGF0ZS0+dm9sX2wgJiAweDFmLAotCQkJCXN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7Ci0JCXY0bF9pbmZvKGNsaWVudCwgIlZvbHVtZSBSOiAgJTAyeCVzXG4iLCBzdGF0ZS0+dm9sX3IgJiAweDFmLAotCQkJCXN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7CisJY2FzZSA0ODAwMDoKKwkJLyogMjU2ZnBzLCBmcz00OGsgKi8KKwkJd204NzM5X3dyaXRlKHNkLCBSOCwgMHgwMDApOwogCQlicmVhazsKLQorCWNhc2UgMzIwMDA6CisJCS8qIDI1NmZwcywgZnM9MzJrICovCisJCXdtODczOV93cml0ZShzZCwgUjgsIDB4MDE4KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCX0KLQorCS8qIGFjdGl2YXRlICovCisJd204NzM5X3dyaXRlKHNkLCBSOSwgMHgwMDEpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHdtODczOV9xdWVyeWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczOV9xY3RybCk7IGkrKykKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gd204NzM5X3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICZ3bTg3MzlfcWN0cmxbaV0sIHNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgd204NzM5X2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsIFY0TDJfSURFTlRfV004NzM5LCAwKTsKK30KKworc3RhdGljIGludCB3bTg3MzlfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB3bTg3Mzlfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJdjRsMl9pbmZvKHNkLCAiRnJlcXVlbmN5OiAldSBIelxuIiwgc3RhdGUtPmNsb2NrX2ZyZXEpOworCXY0bDJfaW5mbyhzZCwgIlZvbHVtZSBMOiAgJTAyeCVzXG4iLCBzdGF0ZS0+dm9sX2wgJiAweDFmLAorCQkJc3RhdGUtPm11dGVkID8gIiAobXV0ZWQpIiA6ICIiKTsKKwl2NGwyX2luZm8oc2QsICJWb2x1bWUgUjogICUwMnglc1xuIiwgc3RhdGUtPnZvbF9yICYgMHgxZiwKKwkJCXN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzM5X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIHY0bDJfc3ViZGV2X2NvbW1hbmQoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIGNtZCwgYXJnKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB3bTg3MzlfY29yZV9vcHMgPSB7CisJLmxvZ19zdGF0dXMgPSB3bTg3MzlfbG9nX3N0YXR1cywKKwkuZ19jaGlwX2lkZW50ID0gd204NzM5X2dfY2hpcF9pZGVudCwKKwkucXVlcnljdHJsID0gd204NzM5X3F1ZXJ5Y3RybCwKKwkuZ19jdHJsID0gd204NzM5X2dfY3RybCwKKwkuc19jdHJsID0gd204NzM5X3NfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfYXVkaW9fb3BzIHdtODczOV9hdWRpb19vcHMgPSB7CisJLnNfY2xvY2tfZnJlcSA9IHdtODczOV9zX2Nsb2NrX2ZyZXEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB3bTg3Mzlfb3BzID0geworCS5jb3JlID0gJndtODczOV9jb3JlX29wcywKKwkuYXVkaW8gPSAmd204NzM5X2F1ZGlvX29wcywKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBpMmMgaW1wbGVtZW50YXRpb24gKi8KQEAgLTI2NSw2ICsyODQsNyBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB3bTg3Mzlfc3RhdGUgKnN0YXRlOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzICovCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCkBAIC0yNzYsNiArMjk2LDggQEAKIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3Mzlfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ3bTg3Mzlfb3BzKTsKIAlzdGF0ZS0+dm9sX2wgPSAweDE3OyAvKiAwZEIgKi8KIAlzdGF0ZS0+dm9sX3IgPSAweDE3OyAvKiAwZEIgKi8KIAlzdGF0ZS0+bXV0ZWQgPSAwOwpAQCAtMjgzLDMxICszMDUsMzMgQEAKIAkvKiBub3JtYWxpemUgKDEyZEIoMzEpIHRvIC0zNC41ZEIoMCkgWzBkQigyMyldIC0+IDY1NTM1IHRvIDApICovCiAJc3RhdGUtPnZvbHVtZSA9ICgobG9uZylzdGF0ZS0+dm9sX2wgKyAxKSAqIDY1NTM1IC8gMzE7CiAJc3RhdGUtPmNsb2NrX2ZyZXEgPSA0ODAwMDsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7CiAKIAkvKiBJbml0aWFsaXplIHdtODczOSAqLwogCiAJLyogcmVzZXQgKi8KLQl3bTg3Mzlfd3JpdGUoY2xpZW50LCBSMTUsIDB4MDApOworCXdtODczOV93cml0ZShzZCwgUjE1LCAweDAwKTsKIAkvKiBmaWx0ZXIgc2V0dGluZywgaGlnaCBwYXRoLCBvZmZldCBjbGVhciAqLwotCXdtODczOV93cml0ZShjbGllbnQsIFI1LCAweDAwMCk7CisJd204NzM5X3dyaXRlKHNkLCBSNSwgMHgwMDApOwogCS8qIEFEQywgT1NDLCBQb3dlciBPZmYgbW9kZSBEaXNhYmxlICovCi0Jd204NzM5X3dyaXRlKGNsaWVudCwgUjYsIDB4MDAwKTsKKwl3bTg3Mzlfd3JpdGUoc2QsIFI2LCAweDAwMCk7CiAJLyogRGlnaXRhbCBBdWRpbyBpbnRlcmZhY2UgZm9ybWF0OgogCSAgIEVuYWJsZSBNYXN0ZXIgbW9kZSwgMjQgYml0LCBNU0IgZmlyc3QvbGVmdCBqdXN0aWZpZWQgKi8KLQl3bTg3Mzlfd3JpdGUoY2xpZW50LCBSNywgMHgwNDkpOworCXdtODczOV93cml0ZShzZCwgUjcsIDB4MDQ5KTsKIAkvKiBzYW1wbGluZyBjb250cm9sOiBub3JtYWwsIDI1NmZzLCA0OEtIeiBzYW1wbGluZyByYXRlICovCi0Jd204NzM5X3dyaXRlKGNsaWVudCwgUjgsIDB4MDAwKTsKKwl3bTg3Mzlfd3JpdGUoc2QsIFI4LCAweDAwMCk7CiAJLyogYWN0aXZhdGUgKi8KLQl3bTg3Mzlfd3JpdGUoY2xpZW50LCBSOSwgMHgwMDEpOworCXdtODczOV93cml0ZShzZCwgUjksIDB4MDAxKTsKIAkvKiBzZXQgdm9sdW1lL211dGUgKi8KLQl3bTg3Mzlfc2V0X2F1ZGlvKGNsaWVudCk7CisJd204NzM5X3NldF9hdWRpbyhzZCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd204NzM5X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUodG9fc3RhdGUoc2QpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93bTg3NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204Nzc1LmMKaW5kZXggNDhkZjY2MS4uZDAyMjBiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93bTg3NzUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODc3NS5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KIApAQCAtNTQsMTYgKzU0LDIzIEBACiB9OwogCiBzdHJ1Y3Qgd204Nzc1X3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CiAJdTggaW5wdXQ7CQkvKiBMYXN0IHNlbGVjdGVkIGlucHV0ICgwLTB4ZikgKi8KIAl1OCBtdXRlZDsKIH07CiAKLXN0YXRpYyBpbnQgd204Nzc1X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB3bTg3NzVfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHdtODc3NV9zdGF0ZSwgc2QpOworfQorCitzdGF0aWMgaW50IHdtODc3NV93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlpbnQgaTsKIAogCWlmIChyZWcgPCAwIHx8IHJlZyA+PSBUT1RfUkVHUykgewotCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQl2NGwyX2VycihzZCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC03MSw4NiArNzgsMTE5IEBACiAJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkocmVnIDw8IDEpIHwgKHZhbCA+PiA4KSwgdmFsICYgMHhmZikgPT0gMCkKIAkJCXJldHVybiAwOwotCXY0bF9lcnIoY2xpZW50LCAiSTJDOiBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJWRcbiIsIHZhbCwgcmVnKTsKKwl2NGwyX2VycihzZCwgIkkyQzogY2Fubm90IHdyaXRlICUwM3ggdG8gcmVnaXN0ZXIgUiVkXG4iLCB2YWwsIHJlZyk7CiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50IHdtODc3NV9zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpCit7CisJc3RydWN0IHdtODc3NV9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwkvKiBUaGVyZSBhcmUgNCBpbnB1dHMgYW5kIG9uZSBvdXRwdXQuIFplcm8gb3IgbW9yZSBpbnB1dHMKKwkgICBhcmUgbXVsdGlwbGV4ZWQgdG9nZXRoZXIgdG8gdGhlIG91dHB1dC4gSGVuY2UgdGhlcmUgYXJlCisJICAgMTYgY29tYmluYXRpb25zLgorCSAgIElmIG9ubHkgb25lIGlucHV0IGlzIGFjdGl2ZSAodGhlIG5vcm1hbCBjYXNlKSB0aGVuIHRoZQorCSAgIGlucHV0IHZhbHVlcyAxLCAyLCA0IG9yIDggc2hvdWxkIGJlIHVzZWQuICovCisJaWYgKHJvdXRlLT5pbnB1dCA+IDE1KSB7CisJCXY0bDJfZXJyKHNkLCAiSW52YWxpZCBpbnB1dCAlZC5cbiIsIHJvdXRlLT5pbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzdGF0ZS0+aW5wdXQgPSByb3V0ZS0+aW5wdXQ7CisJaWYgKHN0YXRlLT5tdXRlZCkKKwkJcmV0dXJuIDA7CisJd204Nzc1X3dyaXRlKHNkLCBSMjEsIDB4MGMwKTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxNCwgMHgxZDQpOworCXdtODc3NV93cml0ZShzZCwgUjE1LCAweDFkNCk7CisJd204Nzc1X3dyaXRlKHNkLCBSMjEsIDB4MTAwICsgc3RhdGUtPmlucHV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3NzVfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHdtODc3NV9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3RybC0+dmFsdWUgPSBzdGF0ZS0+bXV0ZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204Nzc1X3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB3bTg3NzVfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCisJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCXJldHVybiAtRUlOVkFMOworCXN0YXRlLT5tdXRlZCA9IGN0cmwtPnZhbHVlOworCXdtODc3NV93cml0ZShzZCwgUjIxLCAweDBjMCk7CisJd204Nzc1X3dyaXRlKHNkLCBSMTQsIDB4MWQ0KTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxNSwgMHgxZDQpOworCWlmICghc3RhdGUtPm11dGVkKQorCQl3bTg3NzVfd3JpdGUoc2QsIFIyMSwgMHgxMDAgKyBzdGF0ZS0+aW5wdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc3NV9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBjaGlwLCBWNEwyX0lERU5UX1dNODc3NSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgd204Nzc1X2xvZ19zdGF0dXMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3Qgd204Nzc1X3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfaW5mbyhzZCwgIklucHV0OiAlZCVzXG4iLCBzdGF0ZS0+aW5wdXQsCisJCQlzdGF0ZS0+bXV0ZWQgPyAiIChtdXRlZCkiIDogIiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc3NV9zX2ZyZXF1ZW5jeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpCit7CisJc3RydWN0IHdtODc3NV9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7CisKKwkvKiBJZiBJIHJlbW92ZSB0aGlzLCB0aGVuIGl0IGNhbiBoYXBwZW4gdGhhdCBJIGhhdmUgbm8KKwkgICBzb3VuZCB0aGUgZmlyc3QgdGltZSBJIHR1bmUgZnJvbSBzdGF0aWMgdG8gYSB2YWxpZCBjaGFubmVsLgorCSAgIEl0J3MgZGlmZmljdWx0IHRvIHJlcHJvZHVjZSBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSByZWxhdGVkCisJICAgdG8gdGhlIHplcm8gY3Jvc3MgZGV0ZWN0IGNpcmN1aXQuICovCisJd204Nzc1X3dyaXRlKHNkLCBSMjEsIDB4MGMwKTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxNCwgMHgxZDQpOworCXdtODc3NV93cml0ZShzZCwgUjE1LCAweDFkNCk7CisJd204Nzc1X3dyaXRlKHNkLCBSMjEsIDB4MTAwICsgc3RhdGUtPmlucHV0KTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB3bTg3NzVfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgd204Nzc1X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkc6Ci0JCXJvdXRlLT5pbnB1dCA9IHN0YXRlLT5pbnB1dDsKLQkJcm91dGUtPm91dHB1dCA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzoKLQkJLyogVGhlcmUgYXJlIDQgaW5wdXRzIGFuZCBvbmUgb3V0cHV0LiBaZXJvIG9yIG1vcmUgaW5wdXRzCi0JCSAgIGFyZSBtdWx0aXBsZXhlZCB0b2dldGhlciB0byB0aGUgb3V0cHV0LiBIZW5jZSB0aGVyZSBhcmUKLQkJICAgMTYgY29tYmluYXRpb25zLgotCQkgICBJZiBvbmx5IG9uZSBpbnB1dCBpcyBhY3RpdmUgKHRoZSBub3JtYWwgY2FzZSkgdGhlbiB0aGUKLQkJICAgaW5wdXQgdmFsdWVzIDEsIDIsIDQgb3IgOCBzaG91bGQgYmUgdXNlZC4gKi8KLQkJaWYgKHJvdXRlLT5pbnB1dCA+IDE1KSB7Ci0JCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgaW5wdXQgJWQuXG4iLCByb3V0ZS0+aW5wdXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3RhdGUtPmlucHV0ID0gcm91dGUtPmlucHV0OwotCQlpZiAoc3RhdGUtPm11dGVkKQotCQkJYnJlYWs7Ci0JCXdtODc3NV93cml0ZShjbGllbnQsIFIyMSwgMHgwYzApOwotCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTQsIDB4MWQ0KTsKLQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjE1LCAweDFkNCk7Ci0JCXdtODc3NV93cml0ZShjbGllbnQsIFIyMSwgMHgxMDAgKyBzdGF0ZS0+aW5wdXQpOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY3RybC0+dmFsdWUgPSBzdGF0ZS0+bXV0ZWQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19DVFJMOgotCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZS0+bXV0ZWQgPSBjdHJsLT52YWx1ZTsKLQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDBjMCk7Ci0JCXdtODc3NV93cml0ZShjbGllbnQsIFIxNCwgMHgxZDQpOwotCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTUsIDB4MWQ0KTsKLQkJaWYgKCFzdGF0ZS0+bXV0ZWQpCi0JCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMjEsIDB4MTAwICsgc3RhdGUtPmlucHV0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6Ci0JCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsCi0JCQkJYXJnLCBWNEwyX0lERU5UX1dNODc3NSwgMCk7Ci0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQl2NGxfaW5mbyhjbGllbnQsICJJbnB1dDogJWQlc1xuIiwgc3RhdGUtPmlucHV0LAotCQkJICAgIHN0YXRlLT5tdXRlZCA/ICIgKG11dGVkKSIgOiAiIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCS8qIElmIEkgcmVtb3ZlIHRoaXMsIHRoZW4gaXQgY2FuIGhhcHBlbiB0aGF0IEkgaGF2ZSBubwotCQkgICBzb3VuZCB0aGUgZmlyc3QgdGltZSBJIHR1bmUgZnJvbSBzdGF0aWMgdG8gYSB2YWxpZCBjaGFubmVsLgotCQkgICBJdCdzIGRpZmZpY3VsdCB0byByZXByb2R1Y2UgYW5kIGlzIGFsbW9zdCBjZXJ0YWlubHkgcmVsYXRlZAotCQkgICB0byB0aGUgemVybyBjcm9zcyBkZXRlY3QgY2lyY3VpdC4gKi8KLQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDBjMCk7Ci0JCXdtODc3NV93cml0ZShjbGllbnQsIFIxNCwgMHgxZDQpOwotCQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTUsIDB4MWQ0KTsKLQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDEwMCArIHN0YXRlLT5pbnB1dCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOworCXJldHVybiB2NGwyX3N1YmRldl9jb21tYW5kKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBjbWQsIGFyZyk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgd204Nzc1X2NvcmVfb3BzID0geworCS5sb2dfc3RhdHVzID0gd204Nzc1X2xvZ19zdGF0dXMsCisJLmdfY2hpcF9pZGVudCA9IHdtODc3NV9nX2NoaXBfaWRlbnQsCisJLmdfY3RybCA9IHdtODc3NV9nX2N0cmwsCisJLnNfY3RybCA9IHdtODc3NV9zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB3bTg3NzVfdHVuZXJfb3BzID0geworCS5zX2ZyZXF1ZW5jeSA9IHdtODc3NV9zX2ZyZXF1ZW5jeSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfYXVkaW9fb3BzIHdtODc3NV9hdWRpb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHdtODc3NV9zX3JvdXRpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB3bTg3NzVfb3BzID0geworCS5jb3JlID0gJndtODc3NV9jb3JlX29wcywKKwkudHVuZXIgPSAmd204Nzc1X3R1bmVyX29wcywKKwkuYXVkaW8gPSAmd204Nzc1X2F1ZGlvX29wcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIC8qIGkyYyBpbXBsZW1lbnRhdGlvbiAqLwogCiAvKgpAQCAtMTYyLDU2ICsyMDIsNjEgQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgd204Nzc1X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwogCiAJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLwogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVJTzsKIAotCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCisJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JTAyeCAoJXMpXG4iLAogCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CiAKIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3NzVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CisJc2QgPSAmc3RhdGUtPnNkOworCXY0bDJfaTJjX3N1YmRldl9pbml0KHNkLCBjbGllbnQsICZ3bTg3NzVfb3BzKTsKIAlzdGF0ZS0+aW5wdXQgPSAyOwogCXN0YXRlLT5tdXRlZCA9IDA7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3RhdGUpOwogCiAJLyogSW5pdGlhbGl6ZSB3bTg3NzUgKi8KIAogCS8qIFJFU0VUICovCi0Jd204Nzc1X3dyaXRlKGNsaWVudCwgUjIzLCAweDAwMCk7CisJd204Nzc1X3dyaXRlKHNkLCBSMjMsIDB4MDAwKTsKIAkvKiBEaXNhYmxlIHplcm8gY3Jvc3MgZGV0ZWN0IHRpbWVvdXQgKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSNywgMHgwMDApOworCXdtODc3NV93cml0ZShzZCwgUjcsIDB4MDAwKTsKIAkvKiBMZWZ0IGp1c3RpZmllZCwgMjQtYml0IG1vZGUgKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTEsIDB4MDIxKTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxMSwgMHgwMjEpOwogCS8qIE1hc3RlciBtb2RlLCBjbG9jayByYXRpbyAyNTZmcyAqLwotCXdtODc3NV93cml0ZShjbGllbnQsIFIxMiwgMHgxMDIpOworCXdtODc3NV93cml0ZShzZCwgUjEyLCAweDEwMik7CiAJLyogUG93ZXJlZCB1cCAqLwotCXdtODc3NV93cml0ZShjbGllbnQsIFIxMywgMHgwMDApOworCXdtODc3NV93cml0ZShzZCwgUjEzLCAweDAwMCk7CiAJLyogQURDIGdhaW4gKzIuNWRCLCBlbmFibGUgemVybyBjcm9zcyAqLwotCXdtODc3NV93cml0ZShjbGllbnQsIFIxNCwgMHgxZDQpOworCXdtODc3NV93cml0ZShzZCwgUjE0LCAweDFkNCk7CiAJLyogQURDIGdhaW4gKzIuNWRCLCBlbmFibGUgemVybyBjcm9zcyAqLwotCXdtODc3NV93cml0ZShjbGllbnQsIFIxNSwgMHgxZDQpOworCXdtODc3NV93cml0ZShzZCwgUjE1LCAweDFkNCk7CiAJLyogQUxDIFN0ZXJlbywgQUxDIHRhcmdldCBsZXZlbCAtMWRCIEZTIG1heCBnYWluICs4ZEIgKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTYsIDB4MWJmKTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxNiwgMHgxYmYpOwogCS8qIEVuYWJsZSBnYWluIGNvbnRyb2wsIHVzZSB6ZXJvIGNyb3NzIGRldGVjdGlvbiwKIAkgICBBTEMgaG9sZCB0aW1lIDQyLjYgbXMgKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTcsIDB4MTg1KTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxNywgMHgxODUpOwogCS8qIEFMQyBnYWluIHJhbXAgdXAgZGVsYXkgMzQgcywgQUxDIGdhaW4gcmFtcCBkb3duIGRlbGF5IDMzIG1zICovCi0Jd204Nzc1X3dyaXRlKGNsaWVudCwgUjE4LCAweDBhMik7CisJd204Nzc1X3dyaXRlKHNkLCBSMTgsIDB4MGEyKTsKIAkvKiBFbmFibGUgbm9pc2UgZ2F0ZSwgdGhyZXNob2xkIC03MmRCZnMgKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMTksIDB4MDA1KTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIxOSwgMHgwMDUpOwogCS8qIFRyYW5zaWVudCB3aW5kb3cgNG1zLCBsb3dlciBQR0EgZ2FpbiBsaW1pdCAtMWRCICovCi0Jd204Nzc1X3dyaXRlKGNsaWVudCwgUjIwLCAweDA3YSk7CisJd204Nzc1X3dyaXRlKHNkLCBSMjAsIDB4MDdhKTsKIAkvKiBMUkJPVEggPSAxLCB1c2UgaW5wdXQgMi4gKi8KLQl3bTg3NzVfd3JpdGUoY2xpZW50LCBSMjEsIDB4MTAyKTsKKwl3bTg3NzVfd3JpdGUoc2QsIFIyMSwgMHgxMDIpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODc3NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCWtmcmVlKHRvX3N0YXRlKHNkKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCmluZGV4IDlmYzU4MTcuLjlkMDBlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogCXN0cmxjcHkoY2FwLmNhcmQsIGNhbS0+djRsZGV2LT5uYW1lLCBzaXplb2YoY2FwLmNhcmQpKTsKIAlpZiAodXNiX21ha2VfcGF0aChjYW0tPnVzYmRldiwgY2FwLmJ1c19pbmZvLCBzaXplb2YoY2FwLmJ1c19pbmZvKSkgPCAwKQotCQlzdHJsY3B5KGNhcC5idXNfaW5mbywgY2FtLT51c2JkZXYtPmRldi5idXNfaWQsCisJCXN0cmxjcHkoY2FwLmJ1c19pbmZvLCBkZXZfbmFtZSgmY2FtLT51c2JkZXYtPmRldiksCiAJCQlzaXplb2YoY2FwLmJ1c19pbmZvKSk7CiAKIAlpZiAoY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9jYXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwppbmRleCBmYTVmMmY4Li4wNWYzOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwpAQCAtMTUzLDEyICsxNTMsNiBAQAogTU9EVUxFX0FVVEhPUigiU2VyZ3VlaSBNaXJpZG9ub3YiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHpyMzYwNjdfcGNpX3RibFtdID0gewotCXtQQ0lfVkVORE9SX0lEX1pPUkFOLCBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MDU3LAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7MH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgenIzNjA2N19wY2lfdGJsKTsKIAogaW50IHpvcmFuX251bTsJCQkvKiBudW1iZXIgb2YgQnV6cyBpbiB1c2UgKi8KIHN0cnVjdCB6b3JhbiAqem9yYW5bQlVaX01BWF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYwppbmRleCBkYjExYWI5Li4wMGI5N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMKQEAgLTE5NDAsMTEgKzE5NDAsNyBAQAogICogICBpb2N0bCByb3V0aW5lCiAgKi8KIAotc3RhdGljIGludAotem9yYW5fZG9faW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCXN0cnVjdCBmaWxlICAqZmlsZSwKLQkJdW5zaWduZWQgaW50ICBjbWQsCi0JCXZvaWQgICAgICAgICAqYXJnKQorc3RhdGljIGludCB6b3Jhbl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKQEAgLTQyMDEsNyArNDE5Nyw3IEBACiAJICAgICB1bnNpZ25lZCBpbnQgIGNtZCwKIAkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHpvcmFuX2RvX2lvY3RsKTsKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIHpvcmFuX2RvX2lvY3RsKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwppbmRleCBkNmEwMDc0Li5jNGU4YjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtOTUyLDcgKzk1Miw2IEBACiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKICAqCW1wdF9mcmVlX21zZ19mcmFtZSAtIFBsYWNlIE1QVCByZXF1ZXN0IGZyYW1lIGJhY2sgb24gRnJlZVEuCi0gKglAaGFuZGxlOiBIYW5kbGUgb2YgcmVnaXN0ZXJlZCBNUFQgcHJvdG9jb2wgZHJpdmVyCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVCBhZGFwdGVyIHN0cnVjdHVyZQogICoJQG1mOiBQb2ludGVyIHRvIE1QVCByZXF1ZXN0IGZyYW1lCiAgKgpAQCAtNDU2Myw3ICs0NTYyLDcgQEAKIAkJCWZhaWxjbnQrKzsKIAkJaHdvcmQgPSBsZTE2X3RvX2NwdShDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCkgJiAweDAwMDBGRkZGKTsKIAkJLyogZG9uJ3Qgb3ZlcmZsb3cgb3VyIElPQyBoc19yZXBseVtdIGJ1ZmZlciEgKi8KLQkJaWYgKHUxNmNudCA8IHNpemVvZihpb2MtPmhzX3JlcGx5KSAvIHNpemVvZihpb2MtPmhzX3JlcGx5WzBdKSkKKwkJaWYgKHUxNmNudCA8IEFSUkFZX1NJWkUoaW9jLT5oc19yZXBseSkpCiAJCQloc19yZXBseVt1MTZjbnRdID0gaHdvcmQ7CiAJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMsIDApOwogCX0KQEAgLTU0MjIsNyArNTQyMSw2IEBACiAvKioKICAqCW1wdF9maW5kSW1Wb2x1bWVzIC0gSWRlbnRpZnkgSURzIG9mIGhpZGRlbiBkaXNrcyBhbmQgUkFJRCBWb2x1bWVzCiAgKglAaW9jOiBQb2ludGVyIHRvIGEgQWRhcHRlciBTdHJ1Y3V0cmUKLSAqCUBwb3J0bnVtOiBJT0MgcG9ydCBudW1iZXIKICAqCiAgKglSZXR1cm46CiAgKgkwIG9uIHN1Y2Nlc3MKQEAgLTY5MzksNyArNjkzNyw2IEBACiAvKioKICAqCW1wdF9zcGlfbG9nX2luZm8gLSBMb2cgaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBTQ1NJIFBhcmFsbGVsIElPQy4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCi0gKglAbXI6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lCiAgKglAbG9nX2luZm86IFUzMiBMb2dJbmZvIHdvcmQgZnJvbSB0aGUgSU9DCiAgKgogICoJUmVmZXIgdG8gbHNpL3NwX2xvZy5oLgpAQCAtNzE3Niw3ICs3MTczLDcgQEAKIAogCXNhc19sb2dpbmZvLmxvZ2luZm8gPSBsb2dfaW5mbzsKIAlpZiAoKHNhc19sb2dpbmZvLmR3LmJ1c190eXBlICE9IDMgLypTQVMqLykgJiYKLQkgICAgKHNhc19sb2dpbmZvLmR3Lm9yaWdpbmF0b3IgPCBzaXplb2Yob3JpZ2luYXRvcl9zdHIpL3NpemVvZihjaGFyKikpKQorCSAgICAoc2FzX2xvZ2luZm8uZHcub3JpZ2luYXRvciA8IEFSUkFZX1NJWkUob3JpZ2luYXRvcl9zdHIpKSkKIAkJcmV0dXJuOwogCiAJb3JpZ2luYXRvcl9kZXNjID0gb3JpZ2luYXRvcl9zdHJbc2FzX2xvZ2luZm8uZHcub3JpZ2luYXRvcl07CkBAIC03MTg1LDIxICs3MTgyLDIxIEBACiAKIAkJY2FzZSAwOiAgLyogSU9QICovCiAJCQlpZiAoc2FzX2xvZ2luZm8uZHcuY29kZSA8Ci0JCQkgICAgc2l6ZW9mKGlvcF9jb2RlX3N0cikvc2l6ZW9mKGNoYXIqKSkKKwkJCSAgICBBUlJBWV9TSVpFKGlvcF9jb2RlX3N0cikpCiAJCQkJY29kZV9kZXNjID0gaW9wX2NvZGVfc3RyW3Nhc19sb2dpbmZvLmR3LmNvZGVdOwogCQkJYnJlYWs7CiAJCWNhc2UgMTogIC8qIFBMICovCiAJCQlpZiAoc2FzX2xvZ2luZm8uZHcuY29kZSA8Ci0JCQkgICAgc2l6ZW9mKHBsX2NvZGVfc3RyKS9zaXplb2YoY2hhciopKQorCQkJICAgIEFSUkFZX1NJWkUocGxfY29kZV9zdHIpKQogCQkJCWNvZGVfZGVzYyA9IHBsX2NvZGVfc3RyW3Nhc19sb2dpbmZvLmR3LmNvZGVdOwogCQkJYnJlYWs7CiAJCWNhc2UgMjogIC8qIElSICovCiAJCQlpZiAoc2FzX2xvZ2luZm8uZHcuY29kZSA+PQotCQkJICAgIHNpemVvZihpcl9jb2RlX3N0cikvc2l6ZW9mKGNoYXIqKSkKKwkJCSAgICBBUlJBWV9TSVpFKGlyX2NvZGVfc3RyKSkKIAkJCQlicmVhazsKIAkJCWNvZGVfZGVzYyA9IGlyX2NvZGVfc3RyW3Nhc19sb2dpbmZvLmR3LmNvZGVdOwogCQkJaWYgKHNhc19sb2dpbmZvLmR3LnN1YmNvZGUgPj0KLQkJCSAgICBzaXplb2YocmFpZF9zdWJfY29kZV9zdHIpL3NpemVvZihjaGFyKikpCisJCQkgICAgQVJSQVlfU0laRShyYWlkX3N1Yl9jb2RlX3N0cikpCiAJCQlicmVhazsKIAkJCWlmIChzYXNfbG9naW5mby5kdy5jb2RlID09IDApCiAJCQkJc3ViX2NvZGVfZGVzYyA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hc2ljMy5jIGIvZHJpdmVycy9tZmQvYXNpYzMuYwppbmRleCBlNGMwZGI0Li45ZTQ4NTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hc2ljMy5jCisrKyBiL2RyaXZlcnMvbWZkL2FzaWMzLmMKQEAgLTQ3NCw5ICs0NzQsOSBAQAogCXUxNiBkaXJfcmVnW0FTSUMzX05VTV9HUElPX0JBTktTXTsKIAlpbnQgaTsKIAotCW1lbXplcm8oYWx0X3JlZywgQVNJQzNfTlVNX0dQSU9fQkFOS1MgKiBzaXplb2YodTE2KSk7Ci0JbWVtemVybyhvdXRfcmVnLCBBU0lDM19OVU1fR1BJT19CQU5LUyAqIHNpemVvZih1MTYpKTsKLQltZW16ZXJvKGRpcl9yZWcsIEFTSUMzX05VTV9HUElPX0JBTktTICogc2l6ZW9mKHUxNikpOworCW1lbXNldChhbHRfcmVnLCAwLCBBU0lDM19OVU1fR1BJT19CQU5LUyAqIHNpemVvZih1MTYpKTsKKwltZW1zZXQob3V0X3JlZywgMCwgQVNJQzNfTlVNX0dQSU9fQkFOS1MgKiBzaXplb2YodTE2KSk7CisJbWVtc2V0KGRpcl9yZWcsIDAsIEFTSUMzX05VTV9HUElPX0JBTktTICogc2l6ZW9mKHUxNikpOwogCiAJLyogRW5hYmxlIGFsbCBHUElPcyAqLwogCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX0dQSU9fT0ZGU0VUKEEsIE1BU0spLCAweGZmZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL21jcC1jb3JlLmMKaW5kZXggYjRlZDU3ZS4uNjA2M2RjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWNwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tY3AtY29yZS5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAibWNwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tY3Atc2ExMXgwLmMgYi9kcml2ZXJzL21mZC9tY3Atc2ExMXgwLmMKaW5kZXggMjgzODBiMi4uNjJiMzJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWNwLXNhMTF4MC5jCisrKyBiL2RyaXZlcnMvbWZkL21jcC1zYTExeDAuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtYXNzYWJldC5jIGIvZHJpdmVycy9tZmQvdWNiMXgwMC1hc3NhYmV0LmMKaW5kZXggNjFhZWFmNy4uODZmZWQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdWNiMXgwMC1hc3NhYmV0LmMKKysrIGIvZHJpdmVycy9tZmQvdWNiMXgwMC1hc3NhYmV0LmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogI2luY2x1ZGUgInVjYjF4MDAuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYwppbmRleCBhMzE2ZjFiLi42ODYwYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlICJ1Y2IxeDAwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKaW5kZXggNDQ3NjJjYS4uNjFiN2QzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2NvbGxpZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5jCmluZGV4IDJmMGZjZGIuLmViMjliMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYwpAQCAtMTAsMjAgKzEwLDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiAgMjAwNS0wNC0xNyBQYXZlbCBQaXNhIDxwaXNhQGNtcC5mZWxrLmN2dXQuY3o+Ci0gKiAgICAgICAgICAgICBDaGFuZ2VkIHRvIGNvbmZvcm0gcmVkZXNpZ25lZCBpLk1YIHNjYXR0ZXIgZ2F0aGVyIERNQSBpbnRlcmZhY2UKLSAqCi0gKiAgMjAwNS0xMS0wNCBQYXZlbCBQaXNhIDxwaXNhQGNtcC5mZWxrLmN2dXQuY3o+Ci0gKiAgICAgICAgICAgICBVcGRhdGVkIGZvciAyLjYuMTQga2VybmVsCi0gKgotICogIDIwMDUtMTItMTMgSmF5IE1vbmttYW4gPGp0bUBzbW9vdGhzbW9vdGhpZS5jb20+Ci0gKiAgICAgICAgICAgICBGb3VuZCBhbmQgY29ycmVjdGVkIHByb2JsZW1zIGluIHRoZSB3cml0ZSBwYXRoCi0gKgotICogIDIwMDUtMTItMzAgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgotICogICAgICAgICAgICAgVGhlIGV2ZW50IGhhbmRsaW5nIHJld3JpdHRlbiByaWdodCB3YXkgaW4gc29mdGlycS4KLSAqICAgICAgICAgICAgIEFkZGVkIG1hbnkgdWdseSBoYWNrcyBhbmQgZGVsYXlzIHRvIG92ZXJjb21lIFNESEMKLSAqICAgICAgICAgICAgIGRlZmljaWVuY2llcwotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNyw5ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CkBAIC01MCwxNyArMzYsMTYgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUgImlteC1tbWMiCiAKICNkZWZpbmUgSU1YTUNJX0lOVF9NQVNLX0RFRkFVTFQgKElOVF9NQVNLX0JVRl9SRUFEWSB8IElOVF9NQVNLX0RBVEFfVFJBTiB8IFwKLQkgICAgICAgICAgICAgIElOVF9NQVNLX1dSSVRFX09QX0RPTkUgfCBJTlRfTUFTS19FTkRfQ01EX1JFUyB8IFwKLQkJICAgICAgSU5UX01BU0tfQVVUT19DQVJEX0RFVEVDVCB8IElOVF9NQVNLX0RBVDBfRU4gfCBJTlRfTUFTS19TRElPKQorCQkJCSBJTlRfTUFTS19XUklURV9PUF9ET05FIHwgSU5UX01BU0tfRU5EX0NNRF9SRVMgfCBcCisJCQkJIElOVF9NQVNLX0FVVE9fQ0FSRF9ERVRFQ1QgfCBJTlRfTUFTS19EQVQwX0VOIHwgSU5UX01BU0tfU0RJTykKIAogc3RydWN0IGlteG1jaV9ob3N0IHsKIAlzdHJ1Y3QgbW1jX2hvc3QJCSptbWM7CiAJc3BpbmxvY2tfdAkJbG9jazsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKIAlpbnQJCQlpcnE7CiAJaW14X2RtYWNoX3QJCWRtYTsKLQl1bnNpZ25lZCBpbnQJCWNsa3J0OwotCXVuc2lnbmVkIGludAkJY21kYXQ7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50CWltYXNrOwogCXVuc2lnbmVkIGludAkJcG93ZXJfbW9kZTsKIAl1bnNpZ25lZCBpbnQJCXByZXNlbnQ7CkBAIC03NCw3ICs1OSw3IEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRhc2tsZXQ7CiAJdW5zaWduZWQgaW50CQlzdGF0dXNfcmVnOwogCXVuc2lnbmVkIGxvbmcJCXBlbmRpbmdfZXZlbnRzOwotCS8qIE5leHQgdG8gZmllbGRzIGFyZSB0aGVyZSBmb3IgQ1BVIGRyaXZlbiB0cmFuc2ZlcnMgdG8gb3ZlcmNvbWUgU0RIQyBkZWZpY2llbmNpZXMgKi8KKwkvKiBOZXh0IHR3byBmaWVsZHMgYXJlIHRoZXJlIGZvciBDUFUgZHJpdmVuIHRyYW5zZmVycyB0byBvdmVyY29tZSBTREhDIGRlZmljaWVuY2llcyAqLwogCXUxNgkJCSpkYXRhX3B0cjsKIAl1bnNpZ25lZCBpbnQJCWRhdGFfY250OwogCWF0b21pY190CQlzdHVja190aW1lb3V0OwpAQCAtMTE0LDE0ICs5OSwyMiBAQAogc3RhdGljIHZvaWQgaW14bWNpX3N0b3BfY2xvY2soc3RydWN0IGlteG1jaV9ob3N0ICpob3N0KQogewogCWludCBpID0gMDsKLQlNTUNfU1RSX1NUUF9DTEsgJj0gflNUUl9TVFBfQ0xLX1NUQVJUX0NMSzsKLQl3aGlsZShpIDwgMHgxMDAwKSB7Ci0JICAgICAgICBpZighKGkgJiAweDdmKSkKLQkJCU1NQ19TVFJfU1RQX0NMSyB8PSBTVFJfU1RQX0NMS19TVE9QX0NMSzsKKwl1MTYgcmVnOwogCi0JCWlmKCEoTU1DX1NUQVRVUyAmIFNUQVRVU19DQVJEX0JVU19DTEtfUlVOKSkgeworCXJlZyA9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUUl9TVFBfQ0xLKTsKKwl3cml0ZXcocmVnICYgflNUUl9TVFBfQ0xLX1NUQVJUX0NMSywgaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOworCXdoaWxlIChpIDwgMHgxMDAwKSB7CisJCWlmICghKGkgJiAweDdmKSkgeworCQkJcmVnID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOworCQkJd3JpdGV3KHJlZyB8IFNUUl9TVFBfQ0xLX1NUT1BfQ0xLLAorCQkJCQlob3N0LT5iYXNlICsgTU1DX1JFR19TVFJfU1RQX0NMSyk7CisJCX0KKworCQlyZWcgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOworCQlpZiAoIShyZWcgJiBTVEFUVVNfQ0FSRF9CVVNfQ0xLX1JVTikpIHsKIAkJCS8qIENoZWNrIHR3aWNlIGJlZm9yZSBjdXQgKi8KLQkJCWlmKCEoTU1DX1NUQVRVUyAmIFNUQVRVU19DQVJEX0JVU19DTEtfUlVOKSkKKwkJCXJlZyA9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUQVRVUyk7CisJCQlpZiAoIShyZWcgJiBTVEFUVVNfQ0FSRF9CVVNfQ0xLX1JVTikpCiAJCQkJcmV0dXJuOwogCQl9CiAKQEAgLTEzNSw4ICsxMjgsMTAgQEAKIAl1bnNpZ25lZCBpbnQgdHJpYWxzID0gMDsKIAl1bnNpZ25lZCBpbnQgZGVsYXlfbGltaXQgPSAxMjg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmVnOwogCi0JTU1DX1NUUl9TVFBfQ0xLICY9IH5TVFJfU1RQX0NMS19TVE9QX0NMSzsKKwlyZWcgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVFJfU1RQX0NMSyk7CisJd3JpdGV3KHJlZyAmIH5TVFJfU1RQX0NMS19TVE9QX0NMSywgaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOwogCiAJY2xlYXJfYml0KElNWE1DSV9QRU5EX1NUQVJURURfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKIApAQCAtMTQ1LDE4ICsxNDAsMjEgQEAKIAkgKiB0aGVuIDYgZGVsYXkgbG9vcHMsIGJ1dCBkdXJpbmcgY2FyZCBkZXRlY3Rpb24gKGxvdyBjbG9ja3JhdGUpCiAJICogaXQgdGFrZXMgdXAgdG8gNTAwMCBkZWxheSBsb29wcyBhbmQgc29tZXRpbWVzIGZhaWxzIGZvciB0aGUgZmlyc3QgdGltZQogCSAqLwotCU1NQ19TVFJfU1RQX0NMSyB8PSBTVFJfU1RQX0NMS19TVEFSVF9DTEs7CisJcmVnID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOworCXdyaXRldyhyZWcgfCBTVFJfU1RQX0NMS19TVEFSVF9DTEssIGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUUl9TVFBfQ0xLKTsKIAogCWRvIHsKIAkJdW5zaWduZWQgaW50IGRlbGF5ID0gZGVsYXlfbGltaXQ7CiAKLQkJd2hpbGUoZGVsYXktLSl7Ci0JCQlpZihNTUNfU1RBVFVTICYgU1RBVFVTX0NBUkRfQlVTX0NMS19SVU4pCisJCXdoaWxlIChkZWxheS0tKSB7CisJCQlyZWcgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOworCQkJaWYgKHJlZyAmIFNUQVRVU19DQVJEX0JVU19DTEtfUlVOKQogCQkJCS8qIENoZWNrIHR3aWNlIGJlZm9yZSBjdXQgKi8KLQkJCQlpZihNTUNfU1RBVFVTICYgU1RBVFVTX0NBUkRfQlVTX0NMS19SVU4pCisJCQkJcmVnID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RBVFVTKTsKKwkJCQlpZiAocmVnICYgU1RBVFVTX0NBUkRfQlVTX0NMS19SVU4pCiAJCQkJCXJldHVybiAwOwogCi0JCQlpZih0ZXN0X2JpdChJTVhNQ0lfUEVORF9TVEFSVEVEX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCQlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfU1RBUlRFRF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQogCQkJCXJldHVybiAwOwogCQl9CiAKQEAgLTE2Nyw1OCArMTY1LDU5IEBACiAJCSAqIElSUSBvciBzY2hlZHVsZSBkZWxheXMgdGhpcyBmdW5jdGlvbiBleGVjdXRpb24gYW5kIHRoZSBjbG9ja3MgaGFzCiAJCSAqIGJlZW4gYWxyZWFkeSBzdG9wcGVkIGJ5IG90aGVyIG1lYW5zIChyZXNwb25zZSBwcm9jZXNzaW5nLCBTREhDIEhXKQogCQkgKi8KLQkJaWYoIXRlc3RfYml0KElNWE1DSV9QRU5EX1NUQVJURURfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKLQkJCU1NQ19TVFJfU1RQX0NMSyB8PSBTVFJfU1RQX0NMS19TVEFSVF9DTEs7CisJCWlmICghdGVzdF9iaXQoSU1YTUNJX1BFTkRfU1RBUlRFRF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CisJCQlyZWcgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVFJfU1RQX0NMSyk7CisJCQl3cml0ZXcocmVnIHwgU1RSX1NUUF9DTEtfU1RBUlRfQ0xLLAorCQkJCQlob3N0LT5iYXNlICsgTU1DX1JFR19TVFJfU1RQX0NMSyk7CisJCX0KIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JfSB3aGlsZSgrK3RyaWFsczwyNTYpOworCX0gd2hpbGUgKCsrdHJpYWxzIDwgMjU2KTsKIAogCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiaW14bWNpX3N0YXJ0X2Nsb2NrIGJsb2NrZWQsIG5vIGx1Y2tcbiIpOwogCiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdm9pZCBpbXhtY2lfc29mdHJlc2V0KHZvaWQpCitzdGF0aWMgdm9pZCBpbXhtY2lfc29mdHJlc2V0KHN0cnVjdCBpbXhtY2lfaG9zdCAqaG9zdCkKIHsKLQkvKiByZXNldCBzZXF1ZW5jZSAqLwotCU1NQ19TVFJfU1RQX0NMSyA9IDB4ODsKLQlNTUNfU1RSX1NUUF9DTEsgPSAweEQ7Ci0JTU1DX1NUUl9TVFBfQ0xLID0gMHg1OwotCU1NQ19TVFJfU1RQX0NMSyA9IDB4NTsKLQlNTUNfU1RSX1NUUF9DTEsgPSAweDU7Ci0JTU1DX1NUUl9TVFBfQ0xLID0gMHg1OwotCU1NQ19TVFJfU1RQX0NMSyA9IDB4NTsKLQlNTUNfU1RSX1NUUF9DTEsgPSAweDU7Ci0JTU1DX1NUUl9TVFBfQ0xLID0gMHg1OwotCU1NQ19TVFJfU1RQX0NMSyA9IDB4NTsKKwlpbnQgaTsKIAotCU1NQ19SRVNfVE8gPSAweGZmOwotCU1NQ19CTEtfTEVOID0gNTEyOwotCU1NQ19OT0IgPSAxOworCS8qIHJlc2V0IHNlcXVlbmNlICovCisJd3JpdGV3KDB4MDgsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUUl9TVFBfQ0xLKTsKKwl3cml0ZXcoMHgwRCwgaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJd3JpdGV3KDB4MDUsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUUl9TVFBfQ0xLKTsKKworCXdyaXRldygweGZmLCBob3N0LT5iYXNlICsgTU1DX1JFR19SRVNfVE8pOworCXdyaXRldyg1MTIsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX0JMS19MRU4pOworCXdyaXRldygxLCBob3N0LT5iYXNlICsgTU1DX1JFR19OT0IpOwogfQogCiBzdGF0aWMgaW50IGlteG1jaV9idXN5X3dhaXRfZm9yX3N0YXR1cyhzdHJ1Y3QgaW14bWNpX2hvc3QgKmhvc3QsCi0JCQl1bnNpZ25lZCBpbnQgKnBzdGF0LCB1bnNpZ25lZCBpbnQgc3RhdF9tYXNrLAotCQkJaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKndoZXJlKQorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnBzdGF0LCB1bnNpZ25lZCBpbnQgc3RhdF9tYXNrLAorCQkJCSAgICAgICBpbnQgdGltZW91dCwgY29uc3QgY2hhciAqd2hlcmUpCiB7Ci0JaW50IGxvb3BzPTA7Ci0Jd2hpbGUoISgqcHN0YXQgJiBzdGF0X21hc2spKSB7Ci0JCWxvb3BzKz0yOwotCQlpZihsb29wcyA+PSB0aW1lb3V0KSB7CisJaW50IGxvb3BzID0gMDsKKworCXdoaWxlICghKCpwc3RhdCAmIHN0YXRfbWFzaykpIHsKKwkJbG9vcHMgKz0gMjsKKwkJaWYgKGxvb3BzID49IHRpbWVvdXQpIHsKIAkJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiYnVzeSB3YWl0IHRpbWVvdXQgaW4gJXMsIFNUQVRVUyA9IDB4JXggKDB4JXgpXG4iLAogCQkJCXdoZXJlLCAqcHN0YXQsIHN0YXRfbWFzayk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJdWRlbGF5KDIpOwotCQkqcHN0YXQgfD0gTU1DX1NUQVRVUzsKKwkJKnBzdGF0IHw9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUQVRVUyk7CiAJfQotCWlmKCFsb29wcykKKwlpZiAoIWxvb3BzKQogCQlyZXR1cm4gMDsKIAogCS8qIFRoZSBidXN5LXdhaXQgaXMgZXhwZWN0ZWQgdGhlcmUgZm9yIGNsb2NrIDw4TUh6IGR1ZSB0byBTREhDIGhhcmR3YXJlIGZsYXdzICovCi0JaWYoIShzdGF0X21hc2sgJiBTVEFUVVNfRU5EX0NNRF9SRVNQKSB8fCAoaG9zdC0+bW1jLT5pb3MuY2xvY2s+PTgwMDAwMDApKQorCWlmICghKHN0YXRfbWFzayAmIFNUQVRVU19FTkRfQ01EX1JFU1ApIHx8IChob3N0LT5tbWMtPmlvcy5jbG9jayA+PSA4MDAwMDAwKSkKIAkJZGV2X2luZm8obW1jX2Rldihob3N0LT5tbWMpLCAiYnVzeSB3YWl0IGZvciAlZCB1c2VjIGluICVzLCBTVEFUVVMgPSAweCV4ICgweCV4KVxuIiwKLQkJCWxvb3BzLCB3aGVyZSwgKnBzdGF0LCBzdGF0X21hc2spOworCQkJIGxvb3BzLCB3aGVyZSwgKnBzdGF0LCBzdGF0X21hc2spOwogCXJldHVybiBsb29wczsKIH0KIApAQCAtMjM1LDggKzIzNCw4IEBACiAJaG9zdC0+ZGF0YSA9IGRhdGE7CiAJZGF0YS0+Ynl0ZXNfeGZlcmVkID0gMDsKIAotCU1NQ19OT0IgPSBub2I7Ci0JTU1DX0JMS19MRU4gPSBibGtzejsKKwl3cml0ZXcobm9iLCBob3N0LT5iYXNlICsgTU1DX1JFR19OT0IpOworCXdyaXRldyhibGtzeiwgaG9zdC0+YmFzZSArIE1NQ19SRUdfQkxLX0xFTik7CiAKIAkvKgogCSAqIERNQSBjYW5ub3QgYmUgdXNlZCBmb3Igc21hbGwgYmxvY2sgc2l6ZXMsIHdlIGhhdmUgdG8gdXNlIENQVSBkcml2ZW4gdHJhbnNmZXJzIG90aGVyd2lzZS4KQEAgLTI1MiwxNCArMjUxLDE0IEBACiAJCQlob3N0LT5kbWFfZGlyID0gRE1BX0ZST01fREVWSUNFOwogCiAJCQkvKiBIYWNrIHRvIGVuYWJsZSByZWFkIFNDUiAqLwotCQkJTU1DX05PQiA9IDE7Ci0JCQlNTUNfQkxLX0xFTiA9IDUxMjsKKwkJCXdyaXRldygxLCBob3N0LT5iYXNlICsgTU1DX1JFR19OT0IpOworCQkJd3JpdGV3KDUxMiwgaG9zdC0+YmFzZSArIE1NQ19SRUdfQkxLX0xFTik7CiAJCX0gZWxzZSB7CiAJCQlob3N0LT5kbWFfZGlyID0gRE1BX1RPX0RFVklDRTsKIAkJfQogCiAJCS8qIENvbnZlcnQgYmFjayB0byB2aXJ0dWFsIGFkZHJlc3MgKi8KLQkJaG9zdC0+ZGF0YV9wdHIgPSAodTE2KilzZ192aXJ0KGRhdGEtPnNnKTsKKwkJaG9zdC0+ZGF0YV9wdHIgPSAodTE2ICopc2dfdmlydChkYXRhLT5zZyk7CiAJCWhvc3QtPmRhdGFfY250ID0gMDsKIAogCQljbGVhcl9iaXQoSU1YTUNJX1BFTkRfRE1BX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKQEAgLTI3MSwxMCArMjcwLDExIEBACiAJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgewogCQlob3N0LT5kbWFfZGlyID0gRE1BX0ZST01fREVWSUNFOwogCQlob3N0LT5kbWFfbmVudHMgPSBkbWFfbWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csCi0JCQkJCQlkYXRhLT5zZ19sZW4sICBob3N0LT5kbWFfZGlyKTsKKwkJCQkJICAgICBkYXRhLT5zZ19sZW4sICBob3N0LT5kbWFfZGlyKTsKIAogCQlpbXhfZG1hX3NldHVwX3NnKGhvc3QtPmRtYSwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwgZGF0YXN6LAotCQkJaG9zdC0+cmVzLT5zdGFydCArIE1NQ19CVUZGRVJfQUNDRVNTX09GUywgRE1BX01PREVfUkVBRCk7CisJCQkJIGhvc3QtPnJlcy0+c3RhcnQgKyBNTUNfUkVHX0JVRkZFUl9BQ0NFU1MsCisJCQkJIERNQV9NT0RFX1JFQUQpOwogCiAJCS8qaW14X2RtYV9zZXR1cF9tZW0yZGV2X2Njcihob3N0LT5kbWEsIERNQV9NT0RFX1JFQUQsIElNWF9ETUFfV0lEVEhfMTYsIENDUl9SRU4pOyovCiAJCUNDUihob3N0LT5kbWEpID0gQ0NSX0RNT0RfTElORUFSIHwgQ0NSX0RTSVpfMzIgfCBDQ1JfU01PRF9GSUZPIHwgQ0NSX1NTSVpfMTYgfCBDQ1JfUkVOOwpAQCAtMjgyLDEwICsyODIsMTEgQEAKIAkJaG9zdC0+ZG1hX2RpciA9IERNQV9UT19ERVZJQ0U7CiAKIAkJaG9zdC0+ZG1hX25lbnRzID0gZG1hX21hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLAotCQkJCQkJZGF0YS0+c2dfbGVuLCAgaG9zdC0+ZG1hX2Rpcik7CisJCQkJCSAgICAgZGF0YS0+c2dfbGVuLCAgaG9zdC0+ZG1hX2Rpcik7CiAKIAkJaW14X2RtYV9zZXR1cF9zZyhob3N0LT5kbWEsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGRhdGFzeiwKLQkJCWhvc3QtPnJlcy0+c3RhcnQgKyBNTUNfQlVGRkVSX0FDQ0VTU19PRlMsIERNQV9NT0RFX1dSSVRFKTsKKwkJCQkgaG9zdC0+cmVzLT5zdGFydCArIE1NQ19SRUdfQlVGRkVSX0FDQ0VTUywKKwkJCQkgRE1BX01PREVfV1JJVEUpOwogCiAJCS8qaW14X2RtYV9zZXR1cF9tZW0yZGV2X2Njcihob3N0LT5kbWEsIERNQV9NT0RFX1dSSVRFLCBJTVhfRE1BX1dJRFRIXzE2LCBDQ1JfUkVOKTsqLwogCQlDQ1IoaG9zdC0+ZG1hKSA9IENDUl9TTU9EX0xJTkVBUiB8IENDUl9TU0laXzMyIHwgQ0NSX0RNT0RfRklGTyB8IENDUl9EU0laXzE2IHwgQ0NSX1JFTjsKQEAgLTI5MywxMiArMjk0LDEyIEBACiAKICNpZiAxCS8qIFRoaXMgY29kZSBpcyB0aGVyZSBvbmx5IGZvciBjb25zaXN0ZW5jeSBjaGVja2luZyBhbmQgY2FuIGJlIGRpc2FibGVkIGluIGZ1dHVyZSAqLwogCWhvc3QtPmRtYV9zaXplID0gMDsKLQlmb3IoaT0wOyBpPGhvc3QtPmRtYV9uZW50czsgaSsrKQotCQlob3N0LT5kbWFfc2l6ZSs9ZGF0YS0+c2dbaV0ubGVuZ3RoOworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5kbWFfbmVudHM7IGkrKykKKwkJaG9zdC0+ZG1hX3NpemUgKz0gZGF0YS0+c2dbaV0ubGVuZ3RoOwogCiAJaWYgKGRhdGFzeiA+IGhvc3QtPmRtYV9zaXplKSB7CiAJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiaW14bWNpX3NldHVwX2RhdGEgZGF0YXN6IDB4JXggPiAweCV4IGRtX3NpemVcbiIsCi0JCSAgICAgICBkYXRhc3osIGhvc3QtPmRtYV9zaXplKTsKKwkJCWRhdGFzeiwgaG9zdC0+ZG1hX3NpemUpOwogCX0KICNlbmRpZgogCkBAIC0zMDYsNyArMzA3LDcgQEAKIAogCXdtYigpOwogCi0JaWYoaG9zdC0+YWN0dWFsX2J1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCisJaWYgKGhvc3QtPmFjdHVhbF9idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80KQogCQlCTFIoaG9zdC0+ZG1hKSA9IDA7CS8qIGJ1cnN0IDY0IGJ5dGUgcmVhZCAvIDY0IGJ5dGVzIHdyaXRlICovCiAJZWxzZQogCQlCTFIoaG9zdC0+ZG1hKSA9IDE2OwkvKiBidXJzdCAxNiBieXRlIHJlYWQgLyAxNiBieXRlcyB3cml0ZSAqLwpAQCAtMzE3LDkgKzMxOCw4IEBACiAJY2xlYXJfYml0KElNWE1DSV9QRU5EX0NQVV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CiAKIAkvKiBzdGFydCBETUEgZW5naW5lIGZvciByZWFkLCB3cml0ZSBpcyBkZWxheWVkIGFmdGVyIGluaXRpYWwgcmVzcG9uc2UgKi8KLQlpZiAoaG9zdC0+ZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwlpZiAoaG9zdC0+ZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpCiAJCWlteF9kbWFfZW5hYmxlKGhvc3QtPmRtYSk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBpbXhtY2lfc3RhcnRfY21kKHN0cnVjdCBpbXhtY2lfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jb21tYW5kICpjbWQsIHVuc2lnbmVkIGludCBjbWRhdCkKQEAgLTM1MSwxNiArMzUxLDE2IEBACiAJCWJyZWFrOwogCX0KIAotCWlmICggdGVzdF9hbmRfY2xlYXJfYml0KElNWE1DSV9QRU5EX1NFVF9JTklUX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykgKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSU1YTUNJX1BFTkRfU0VUX0lOSVRfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKIAkJY21kYXQgfD0gQ01EX0RBVF9DT05UX0lOSVQ7IC8qIFRoaXMgY29tbWFuZCBuZWVkcyBpbml0ICovCiAKLQlpZiAoIGhvc3QtPmFjdHVhbF9idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80ICkKKwlpZiAoaG9zdC0+YWN0dWFsX2J1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCiAJCWNtZGF0IHw9IENNRF9EQVRfQ09OVF9CVVNfV0lEVEhfNDsKIAotCU1NQ19DTUQgPSBjbWQtPm9wY29kZTsKLQlNTUNfQVJHSCA9IGNtZC0+YXJnID4+IDE2OwotCU1NQ19BUkdMID0gY21kLT5hcmcgJiAweGZmZmY7Ci0JTU1DX0NNRF9EQVRfQ09OVCA9IGNtZGF0OworCXdyaXRldyhjbWQtPm9wY29kZSwgaG9zdC0+YmFzZSArIE1NQ19SRUdfQ01EKTsKKwl3cml0ZXcoY21kLT5hcmcgPj4gMTYsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX0FSR0gpOworCXdyaXRldyhjbWQtPmFyZyAmIDB4ZmZmZiwgaG9zdC0+YmFzZSArIE1NQ19SRUdfQVJHTCk7CisJd3JpdGV3KGNtZGF0LCBob3N0LT5iYXNlICsgTU1DX1JFR19DTURfREFUX0NPTlQpOwogCiAJYXRvbWljX3NldCgmaG9zdC0+c3R1Y2tfdGltZW91dCwgMCk7CiAJc2V0X2JpdChJTVhNQ0lfUEVORF9XQUlUX1JFU1BfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKQEAgLTM2OCwxOCArMzY4LDE4IEBACiAKIAlpbWFzayA9IElNWE1DSV9JTlRfTUFTS19ERUZBVUxUOwogCWltYXNrICY9IH5JTlRfTUFTS19FTkRfQ01EX1JFUzsKLQlpZiAoIGNtZGF0ICYgQ01EX0RBVF9DT05UX0RBVEFfRU5BQkxFICkgewotCQkvKmltYXNrICY9IH5JTlRfTUFTS19CVUZfUkVBRFk7Ki8KKwlpZiAoY21kYXQgJiBDTURfREFUX0NPTlRfREFUQV9FTkFCTEUpIHsKKwkJLyogaW1hc2sgJj0gfklOVF9NQVNLX0JVRl9SRUFEWTsgKi8KIAkJaW1hc2sgJj0gfklOVF9NQVNLX0RBVEFfVFJBTjsKLQkJaWYgKCBjbWRhdCAmIENNRF9EQVRfQ09OVF9XUklURSApCisJCWlmIChjbWRhdCAmIENNRF9EQVRfQ09OVF9XUklURSkKIAkJCWltYXNrICY9IH5JTlRfTUFTS19XUklURV9PUF9ET05FOwotCQlpZih0ZXN0X2JpdChJTVhNQ0lfUEVORF9DUFVfREFUQV9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQorCQlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfQ1BVX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKIAkJCWltYXNrICY9IH5JTlRfTUFTS19CVUZfUkVBRFk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAlob3N0LT5pbWFzayA9IGltYXNrOwotCU1NQ19JTlRfTUFTSyA9IGhvc3QtPmltYXNrOworCXdyaXRldyhob3N0LT5pbWFzaywgaG9zdC0+YmFzZSArIE1NQ19SRUdfSU5UX01BU0spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAogCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiQ01EJTAyZCAoMHglMDJ4KSBtYXNrIHNldCB0byAweCUwNHhcbiIsCkBAIC0zOTUsMTQgKzM5NSwxNCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKIAlob3N0LT5wZW5kaW5nX2V2ZW50cyAmPSB+KElNWE1DSV9QRU5EX1dBSVRfUkVTUF9tIHwgSU1YTUNJX1BFTkRfRE1BX0VORF9tIHwKLQkJCUlNWE1DSV9QRU5EX0RNQV9EQVRBX20gfCBJTVhNQ0lfUEVORF9DUFVfREFUQV9tKTsKKwkJCQkgIElNWE1DSV9QRU5EX0RNQV9EQVRBX20gfCBJTVhNQ0lfUEVORF9DUFVfREFUQV9tKTsKIAogCWhvc3QtPmltYXNrID0gSU1YTUNJX0lOVF9NQVNLX0RFRkFVTFQ7Ci0JTU1DX0lOVF9NQVNLID0gaG9zdC0+aW1hc2s7CisJd3JpdGV3KGhvc3QtPmltYXNrLCBob3N0LT5iYXNlICsgTU1DX1JFR19JTlRfTUFTSyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKLQlpZihyZXEgJiYgcmVxLT5jbWQpCisJaWYgKHJlcSAmJiByZXEtPmNtZCkKIAkJaG9zdC0+cHJldl9jbWRfY29kZSA9IHJlcS0+Y21kLT5vcGNvZGU7CiAKIAlob3N0LT5yZXEgPSBOVUxMOwpAQCAtNDE2LDE3ICs0MTYsMTcgQEAKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5kYXRhOwogCWludCBkYXRhX2Vycm9yOwogCi0JaWYodGVzdF9hbmRfY2xlYXJfYml0KElNWE1DSV9QRU5EX0RNQV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSU1YTUNJX1BFTkRfRE1BX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgewogCQlpbXhfZG1hX2Rpc2FibGUoaG9zdC0+ZG1hKTsKIAkJZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csIGhvc3QtPmRtYV9uZW50cywKIAkJCSAgICAgaG9zdC0+ZG1hX2Rpcik7CiAJfQogCi0JaWYgKCBzdGF0ICYgU1RBVFVTX0VSUl9NQVNLICkgewotCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgInJlcXVlc3QgZmFpbGVkLiBzdGF0dXM6IDB4JTA4eFxuIixzdGF0KTsKLQkJaWYoc3RhdCAmIChTVEFUVVNfQ1JDX1JFQURfRVJSIHwgU1RBVFVTX0NSQ19XUklURV9FUlIpKQorCWlmIChzdGF0ICYgU1RBVFVTX0VSUl9NQVNLKSB7CisJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBmYWlsZWQuIHN0YXR1czogMHglMDh4XG4iLCBzdGF0KTsKKwkJaWYgKHN0YXQgJiAoU1RBVFVTX0NSQ19SRUFEX0VSUiB8IFNUQVRVU19DUkNfV1JJVEVfRVJSKSkKIAkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKLQkJZWxzZSBpZihzdGF0ICYgU1RBVFVTX1RJTUVfT1VUX1JFQUQpCisJCWVsc2UgaWYgKHN0YXQgJiBTVEFUVVNfVElNRV9PVVRfUkVBRCkKIAkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKIAkJZWxzZQogCQkJZGF0YS0+ZXJyb3IgPSAtRUlPOwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiB7CiAJc3RydWN0IG1tY19jb21tYW5kICpjbWQgPSBob3N0LT5jbWQ7CiAJaW50IGk7Ci0JdTMyIGEsYixjOworCXUzMiBhLCBiLCBjOwogCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IGhvc3QtPmRhdGE7CiAKIAlpZiAoIWNtZCkKQEAgLTQ2MSwxOCArNDYxLDE4IEBACiAJCWNtZC0+ZXJyb3IgPSAtRUlMU0VROwogCX0KIAotCWlmKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX1BSRVNFTlQpIHsKLQkJaWYoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KSB7CisJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX1BSRVNFTlQpIHsKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQXzEzNikgewogCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJCXUzMiBhID0gTU1DX1JFU19GSUZPICYgMHhmZmZmOwotCQkJCXUzMiBiID0gTU1DX1JFU19GSUZPICYgMHhmZmZmOwotCQkJCWNtZC0+cmVzcFtpXSA9IGE8PDE2IHwgYjsKKwkJCQlhID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfUkVTX0ZJRk8pOworCQkJCWIgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19SRVNfRklGTyk7CisJCQkJY21kLT5yZXNwW2ldID0gYSA8PCAxNiB8IGI7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlhID0gTU1DX1JFU19GSUZPICYgMHhmZmZmOwotCQkJYiA9IE1NQ19SRVNfRklGTyAmIDB4ZmZmZjsKLQkJCWMgPSBNTUNfUkVTX0ZJRk8gJiAweGZmZmY7Ci0JCQljbWQtPnJlc3BbMF0gPSBhPDwyNCB8IGI8PDggfCBjPj44OworCQkJYSA9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX1JFU19GSUZPKTsKKwkJCWIgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19SRVNfRklGTyk7CisJCQljID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfUkVTX0ZJRk8pOworCQkJY21kLT5yZXNwWzBdID0gYSA8PCAyNCB8IGIgPDwgOCB8IGMgPj4gODsKIAkJfQogCX0KIApAQCAtNDg0LDM2ICs0ODQsMzQgQEAKIAogCQkJLyogV2FpdCBmb3IgRklGTyB0byBiZSBlbXB0eSBiZWZvcmUgc3RhcnRpbmcgRE1BIHdyaXRlICovCiAKLQkJCXN0YXQgPSBNTUNfU1RBVFVTOwotCQkJaWYoaW14bWNpX2J1c3lfd2FpdF9mb3Jfc3RhdHVzKGhvc3QsICZzdGF0LAotCQkJCVNUQVRVU19BUFBMX0JVRkZfRkUsCi0JCQkJNDAsICJpbXhtY2lfY21kX2RvbmUgRE1BIFdSIikgPCAwKSB7CisJCQlzdGF0ID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RBVFVTKTsKKwkJCWlmIChpbXhtY2lfYnVzeV93YWl0X2Zvcl9zdGF0dXMoaG9zdCwgJnN0YXQsCisJCQkJCQkJU1RBVFVTX0FQUExfQlVGRl9GRSwKKwkJCQkJCQk0MCwgImlteG1jaV9jbWRfZG9uZSBETUEgV1IiKSA8IDApIHsKIAkJCQljbWQtPmVycm9yID0gLUVJTzsKIAkJCQlpbXhtY2lfZmluaXNoX2RhdGEoaG9zdCwgc3RhdCk7Ci0JCQkJaWYoaG9zdC0+cmVxKQorCQkJCWlmIChob3N0LT5yZXEpCiAJCQkJCWlteG1jaV9maW5pc2hfcmVxdWVzdChob3N0LCBob3N0LT5yZXEpOwogCQkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwgIlNUQVRVUyA9IDB4JTA0eFxuIiwKLQkJCQkgICAgICAgc3RhdCk7CisJCQkJCSBzdGF0KTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAotCQkJaWYodGVzdF9iaXQoSU1YTUNJX1BFTkRfRE1BX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgeworCQkJaWYgKHRlc3RfYml0KElNWE1DSV9QRU5EX0RNQV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCiAJCQkJaW14X2RtYV9lbmFibGUoaG9zdC0+ZG1hKTsKLQkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCXN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxOwogCQlpbXhtY2lfc3RvcF9jbG9jayhob3N0KTsKIAkJcmVxID0gaG9zdC0+cmVxOwogCi0JCWlmKGRhdGEpCisJCWlmIChkYXRhKQogCQkJaW14bWNpX2ZpbmlzaF9kYXRhKGhvc3QsIHN0YXQpOwogCi0JCWlmKCByZXEgKSB7CisJCWlmIChyZXEpCiAJCQlpbXhtY2lfZmluaXNoX3JlcXVlc3QoaG9zdCwgcmVxKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLCAiaW14bWNpX2NtZF9kb25lOiBubyByZXF1ZXN0IHRvIGZpbmlzaFxuIik7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTUzNSwxMSArNTMzLDEwIEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IG1tY19yZXF1ZXN0ICpyZXE7CiAJCXJlcSA9IGhvc3QtPnJlcTsKLQkJaWYoIHJlcSApIHsKKwkJaWYgKHJlcSkKIAkJCWlteG1jaV9maW5pc2hfcmVxdWVzdChob3N0LCByZXEpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlkZXZfd2FybihtbWNfZGV2KGhvc3QtPm1tYyksICJpbXhtY2lfZGF0YV9kb25lOiBubyByZXF1ZXN0IHRvIGZpbmlzaFxuIik7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTU1Miw3ICs1NDksNyBAQAogCWludCB0cmFuc19kb25lID0gMDsKIAl1bnNpZ25lZCBpbnQgc3RhdCA9ICpwc3RhdDsKIAotCWlmKGhvc3QtPmFjdHVhbF9idXNfd2lkdGggIT0gTU1DX0JVU19XSURUSF80KQorCWlmIChob3N0LT5hY3R1YWxfYnVzX3dpZHRoICE9IE1NQ19CVVNfV0lEVEhfNCkKIAkJYnVyc3RfbGVuID0gMTY7CiAJZWxzZQogCQlidXJzdF9sZW4gPSA2NDsKQEAgLTU2Myw0NCArNTYwLDQ0IEBACiAKIAl1ZGVsYXkoMjApOwkvKiByZXF1aXJlZCBmb3IgY2xvY2tzIDwgOE1IeiovCiAKLQlpZihob3N0LT5kbWFfZGlyID09IERNQV9GUk9NX0RFVklDRSkgeworCWlmIChob3N0LT5kbWFfZGlyID09IERNQV9GUk9NX0RFVklDRSkgewogCQlpbXhtY2lfYnVzeV93YWl0X2Zvcl9zdGF0dXMoaG9zdCwgJnN0YXQsCi0JCQkJU1RBVFVTX0FQUExfQlVGRl9GRiB8IFNUQVRVU19EQVRBX1RSQU5TX0RPTkUgfAotCQkJCVNUQVRVU19USU1FX09VVF9SRUFELAotCQkJCTUwLCAiaW14bWNpX2NwdV9kcml2ZW5fZGF0YSByZWFkIik7CisJCQkJCSAgICBTVEFUVVNfQVBQTF9CVUZGX0ZGIHwgU1RBVFVTX0RBVEFfVFJBTlNfRE9ORSB8CisJCQkJCSAgICBTVEFUVVNfVElNRV9PVVRfUkVBRCwKKwkJCQkJICAgIDUwLCAiaW14bWNpX2NwdV9kcml2ZW5fZGF0YSByZWFkIik7CiAKLQkJd2hpbGUoKHN0YXQgJiAoU1RBVFVTX0FQUExfQlVGRl9GRiB8ICBTVEFUVVNfREFUQV9UUkFOU19ET05FKSkgJiYKLQkJICAgICAgIShzdGF0ICYgU1RBVFVTX1RJTUVfT1VUX1JFQUQpICYmCi0JCSAgICAgIChob3N0LT5kYXRhX2NudCA8IDUxMikpIHsKKwkJd2hpbGUgKChzdGF0ICYgKFNUQVRVU19BUFBMX0JVRkZfRkYgfCBTVEFUVVNfREFUQV9UUkFOU19ET05FKSkgJiYKKwkJICAgICAgICEoc3RhdCAmIFNUQVRVU19USU1FX09VVF9SRUFEKSAmJgorCQkgICAgICAgKGhvc3QtPmRhdGFfY250IDwgNTEyKSkgewogCiAJCQl1ZGVsYXkoMjApOwkvKiByZXF1aXJlZCBmb3IgY2xvY2tzIDwgOE1IeiovCiAKLQkJCWZvcihpID0gYnVyc3RfbGVuOyBpPj0yIDsgaS09MikgeworCQkJZm9yIChpID0gYnVyc3RfbGVuOyBpID49IDIgOyBpIC09IDIpIHsKIAkJCQl1MTYgZGF0YTsKLQkJCQlkYXRhID0gTU1DX0JVRkZFUl9BQ0NFU1M7CisJCQkJZGF0YSA9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX0JVRkZFUl9BQ0NFU1MpOwogCQkJCXVkZWxheSgxMCk7CS8qIHJlcXVpcmVkIGZvciBjbG9ja3MgPCA4TUh6Ki8KLQkJCQlpZihob3N0LT5kYXRhX2NudCsyIDw9IGhvc3QtPmRtYV9zaXplKSB7CisJCQkJaWYgKGhvc3QtPmRhdGFfY250KzIgPD0gaG9zdC0+ZG1hX3NpemUpIHsKIAkJCQkJKihob3N0LT5kYXRhX3B0cisrKSA9IGRhdGE7CiAJCQkJfSBlbHNlIHsKLQkJCQkJaWYoaG9zdC0+ZGF0YV9jbnQgPCBob3N0LT5kbWFfc2l6ZSkKLQkJCQkJCSoodTgqKShob3N0LT5kYXRhX3B0cikgPSBkYXRhOworCQkJCQlpZiAoaG9zdC0+ZGF0YV9jbnQgPCBob3N0LT5kbWFfc2l6ZSkKKwkJCQkJCSoodTggKikoaG9zdC0+ZGF0YV9wdHIpID0gZGF0YTsKIAkJCQl9CiAJCQkJaG9zdC0+ZGF0YV9jbnQgKz0gMjsKIAkJCX0KIAotCQkJc3RhdCA9IE1NQ19TVEFUVVM7CisJCQlzdGF0ID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RBVFVTKTsKIAogCQkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJpbXhtY2lfY3B1X2RyaXZlbl9kYXRhIHJlYWQgJWQgYnVyc3QgJWQgU1RBVFVTID0gMHgleFxuIiwKIAkJCQlob3N0LT5kYXRhX2NudCwgYnVyc3RfbGVuLCBzdGF0KTsKIAkJfQogCi0JCWlmKChzdGF0ICYgU1RBVFVTX0RBVEFfVFJBTlNfRE9ORSkgJiYgKGhvc3QtPmRhdGFfY250ID49IDUxMikpCisJCWlmICgoc3RhdCAmIFNUQVRVU19EQVRBX1RSQU5TX0RPTkUpICYmIChob3N0LT5kYXRhX2NudCA+PSA1MTIpKQogCQkJdHJhbnNfZG9uZSA9IDE7CiAKLQkJaWYoaG9zdC0+ZG1hX3NpemUgJiAweDFmZikKKwkJaWYgKGhvc3QtPmRtYV9zaXplICYgMHgxZmYpCiAJCQlzdGF0ICY9IH5TVEFUVVNfQ1JDX1JFQURfRVJSOwogCi0JCWlmKHN0YXQgJiBTVEFUVVNfVElNRV9PVVRfUkVBRCkgeworCQlpZiAoc3RhdCAmIFNUQVRVU19USU1FX09VVF9SRUFEKSB7CiAJCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImlteG1jaV9jcHVfZHJpdmVuX2RhdGEgcmVhZCB0aW1lb3V0IFNUQVRVUyA9IDB4JXhcbiIsCiAJCQkJc3RhdCk7CiAJCQl0cmFuc19kb25lID0gLTE7CkBAIC02MDgsMTIgKzYwNSwxMiBAQAogCiAJfSBlbHNlIHsKIAkJaW14bWNpX2J1c3lfd2FpdF9mb3Jfc3RhdHVzKGhvc3QsICZzdGF0LAotCQkJCVNUQVRVU19BUFBMX0JVRkZfRkUsCi0JCQkJMjAsICJpbXhtY2lfY3B1X2RyaXZlbl9kYXRhIHdyaXRlIik7CisJCQkJCSAgICBTVEFUVVNfQVBQTF9CVUZGX0ZFLAorCQkJCQkgICAgMjAsICJpbXhtY2lfY3B1X2RyaXZlbl9kYXRhIHdyaXRlIik7CiAKLQkJd2hpbGUoKHN0YXQgJiBTVEFUVVNfQVBQTF9CVUZGX0ZFKSAmJgotCQkgICAgICAoaG9zdC0+ZGF0YV9jbnQgPCBob3N0LT5kbWFfc2l6ZSkpIHsKLQkJCWlmKGJ1cnN0X2xlbiA+PSBob3N0LT5kbWFfc2l6ZSAtIGhvc3QtPmRhdGFfY250KSB7CisJCXdoaWxlICgoc3RhdCAmIFNUQVRVU19BUFBMX0JVRkZfRkUpICYmCisJCSAgICAgICAoaG9zdC0+ZGF0YV9jbnQgPCBob3N0LT5kbWFfc2l6ZSkpIHsKKwkJCWlmIChidXJzdF9sZW4gPj0gaG9zdC0+ZG1hX3NpemUgLSBob3N0LT5kYXRhX2NudCkgewogCQkJCWJ1cnN0X2xlbiA9IGhvc3QtPmRtYV9zaXplIC0gaG9zdC0+ZGF0YV9jbnQ7CiAJCQkJaG9zdC0+ZGF0YV9jbnQgPSBob3N0LT5kbWFfc2l6ZTsKIAkJCQl0cmFuc19kb25lID0gMTsKQEAgLTYyMSwxMCArNjE4LDEwIEBACiAJCQkJaG9zdC0+ZGF0YV9jbnQgKz0gYnVyc3RfbGVuOwogCQkJfQogCi0JCQlmb3IoaSA9IGJ1cnN0X2xlbjsgaT4wIDsgaS09MikKLQkJCQlNTUNfQlVGRkVSX0FDQ0VTUyA9ICooaG9zdC0+ZGF0YV9wdHIrKyk7CisJCQlmb3IgKGkgPSBidXJzdF9sZW47IGkgPiAwIDsgaSAtPSAyKQorCQkJCXdyaXRldygqKGhvc3QtPmRhdGFfcHRyKyspLCBob3N0LT5iYXNlICsgTU1DX1JFR19CVUZGRVJfQUNDRVNTKTsKIAotCQkJc3RhdCA9IE1NQ19TVEFUVVM7CisJCQlzdGF0ID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RBVFVTKTsKIAogCQkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJpbXhtY2lfY3B1X2RyaXZlbl9kYXRhIHdyaXRlIGJ1cnN0ICVkIFNUQVRVUyA9IDB4JXhcbiIsCiAJCQkJYnVyc3RfbGVuLCBzdGF0KTsKQEAgLTYzOSw3ICs2MzYsNyBAQAogc3RhdGljIHZvaWQgaW14bWNpX2RtYV9pcnEoaW50IGRtYSwgdm9pZCAqZGV2aWQpCiB7CiAJc3RydWN0IGlteG1jaV9ob3N0ICpob3N0ID0gZGV2aWQ7Ci0JdWludDMyX3Qgc3RhdCA9IE1NQ19TVEFUVVM7CisJdTMyIHN0YXQgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOwogCiAJYXRvbWljX3NldCgmaG9zdC0+c3R1Y2tfdGltZW91dCwgMCk7CiAJaG9zdC0+c3RhdHVzX3JlZyA9IHN0YXQ7CkBAIC02NTAsMTAgKzY0NywxMSBAQAogc3RhdGljIGlycXJldHVybl90IGlteG1jaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCiB7CiAJc3RydWN0IGlteG1jaV9ob3N0ICpob3N0ID0gZGV2aWQ7Ci0JdWludDMyX3Qgc3RhdCA9IE1NQ19TVEFUVVM7CisJdTMyIHN0YXQgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOwogCWludCBoYW5kbGVkID0gMTsKIAotCU1NQ19JTlRfTUFTSyA9IGhvc3QtPmltYXNrIHwgSU5UX01BU0tfU0RJTyB8IElOVF9NQVNLX0FVVE9fQ0FSRF9ERVRFQ1Q7CisJd3JpdGV3KGhvc3QtPmltYXNrIHwgSU5UX01BU0tfU0RJTyB8IElOVF9NQVNLX0FVVE9fQ0FSRF9ERVRFQ1QsCisJCQlob3N0LT5iYXNlICsgTU1DX1JFR19JTlRfTUFTSyk7CiAKIAlhdG9taWNfc2V0KCZob3N0LT5zdHVja190aW1lb3V0LCAwKTsKIAlob3N0LT5zdGF0dXNfcmVnID0gc3RhdDsKQEAgLTY3MSwxMCArNjY5LDEwIEBACiAJdW5zaWduZWQgaW50IGRhdGFfZGlyX21hc2sgPSAwOwkvKiBTVEFUVVNfV1JfQ1JDX0VSUk9SX0NPREVfTUFTSyAqLwogCWludCB0aW1lb3V0ID0gMDsKIAotCWlmKGF0b21pY19yZWFkKCZob3N0LT5zdHVja190aW1lb3V0KSA+IDQpIHsKKwlpZiAoYXRvbWljX3JlYWQoJmhvc3QtPnN0dWNrX3RpbWVvdXQpID4gNCkgewogCQljaGFyICp3aGF0OwogCQl0aW1lb3V0ID0gMTsKLQkJc3RhdCA9IE1NQ19TVEFUVVM7CisJCXN0YXQgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOwogCQlob3N0LT5zdGF0dXNfcmVnID0gc3RhdDsKIAkJaWYgKHRlc3RfYml0KElNWE1DSV9QRU5EX1dBSVRfUkVTUF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQogCQkJaWYgKHRlc3RfYml0KElNWE1DSV9QRU5EX0RNQV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCkBAIC02ODMsMjkgKzY4MSwzNyBAQAogCQkJCXdoYXQgPSAiUkVTUCI7CiAJCWVsc2UKIAkJCWlmICh0ZXN0X2JpdChJTVhNQ0lfUEVORF9ETUFfREFUQV9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQotCQkJCWlmKHRlc3RfYml0KElNWE1DSV9QRU5EX0RNQV9FTkRfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCQlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfRE1BX0VORF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQogCQkJCQl3aGF0ID0gIkRBVEEiOwogCQkJCWVsc2UKIAkJCQkJd2hhdCA9ICJETUEiOwogCQkJZWxzZQogCQkJCXdoYXQgPSAiPz8/IjsKIAotCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIiVzIFRJTUVPVVQsIGhhcmR3YXJlIHN0dWNrZWQgU1RBVFVTID0gMHglMDR4IElNQVNLID0gMHglMDR4XG4iLAotCQkgICAgICAgd2hhdCwgc3RhdCwgTU1DX0lOVF9NQVNLKTsKLQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJDTURfREFUX0NPTlQgPSAweCUwNHgsIE1NQ19CTEtfTEVOID0gMHglMDR4LCBNTUNfTk9CID0gMHglMDR4LCBETUFfQ0NSID0gMHglMDh4XG4iLAotCQkgICAgICAgTU1DX0NNRF9EQVRfQ09OVCwgTU1DX0JMS19MRU4sIE1NQ19OT0IsIENDUihob3N0LT5kbWEpKTsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCisJCQkiJXMgVElNRU9VVCwgaGFyZHdhcmUgc3R1Y2tlZCBTVEFUVVMgPSAweCUwNHggSU1BU0sgPSAweCUwNHhcbiIsCisJCQl3aGF0LCBzdGF0LAorCQkJcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfSU5UX01BU0spKTsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCisJCQkiQ01EX0RBVF9DT05UID0gMHglMDR4LCBNTUNfQkxLX0xFTiA9IDB4JTA0eCwgTU1DX05PQiA9IDB4JTA0eCwgRE1BX0NDUiA9IDB4JTA4eFxuIiwKKwkJCXJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX0NNRF9EQVRfQ09OVCksCisJCQlyZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19CTEtfTEVOKSwKKwkJCXJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX05PQiksCisJCQlDQ1IoaG9zdC0+ZG1hKSk7CiAJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiQ01EJWQsIHByZXZDTUQlZCwgYnVzICVkLWJpdCwgZG1hX3NpemUgPSAweCV4XG4iLAotCQkgICAgICAgaG9zdC0+Y21kP2hvc3QtPmNtZC0+b3Bjb2RlOjAsIGhvc3QtPnByZXZfY21kX2NvZGUsIDE8PGhvc3QtPmFjdHVhbF9idXNfd2lkdGgsIGhvc3QtPmRtYV9zaXplKTsKKwkJCWhvc3QtPmNtZCA/IGhvc3QtPmNtZC0+b3Bjb2RlIDogMCwKKwkJCWhvc3QtPnByZXZfY21kX2NvZGUsCisJCQkxIDw8IGhvc3QtPmFjdHVhbF9idXNfd2lkdGgsIGhvc3QtPmRtYV9zaXplKTsKIAl9CiAKLQlpZighaG9zdC0+cHJlc2VudCB8fCB0aW1lb3V0KQorCWlmICghaG9zdC0+cHJlc2VudCB8fCB0aW1lb3V0KQogCQlob3N0LT5zdGF0dXNfcmVnID0gU1RBVFVTX1RJTUVfT1VUX1JFU1AgfCBTVEFUVVNfVElNRV9PVVRfUkVBRCB8Ci0JCQkJICAgIFNUQVRVU19DUkNfUkVBRF9FUlIgfCBTVEFUVVNfQ1JDX1dSSVRFX0VSUjsKKwkJCVNUQVRVU19DUkNfUkVBRF9FUlIgfCBTVEFUVVNfQ1JDX1dSSVRFX0VSUjsKIAotCWlmKHRlc3RfYml0KElNWE1DSV9QRU5EX0lSUV9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpIHx8IHRpbWVvdXQpIHsKKwlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfSVJRX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykgfHwgdGltZW91dCkgewogCQljbGVhcl9iaXQoSU1YTUNJX1BFTkRfSVJRX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CiAKLQkJc3RhdCA9IE1NQ19TVEFUVVM7CisJCXN0YXQgPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19TVEFUVVMpOwogCQkvKgogCQkgKiBUaGlzIGlzIG5vdCByZXF1aXJlZCBpbiB0aGVvcnksIGJ1dCB0aGVyZSBpcyBjaGFuY2UgdG8gbWlzcyBzb21lIGZsYWcKIAkJICogd2hpY2ggY2xlYXJzIGF1dG9tYXRpY2FsbHkgYnkgbWFzayB3cml0ZSwgRnJlZVNjYWxlIG9yaWdpbmFsIGNvZGUga2VlcHMKQEAgLTcxMyw2MyArNzE5LDYyIEBACiAJCSAqLwogCQlzdGF0IHw9IGhvc3QtPnN0YXR1c19yZWc7CiAKLQkJaWYodGVzdF9iaXQoSU1YTUNJX1BFTkRfQ1BVX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJaWYgKHRlc3RfYml0KElNWE1DSV9QRU5EX0NQVV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCiAJCQlzdGF0ICY9IH5TVEFUVVNfQ1JDX1JFQURfRVJSOwogCi0JCWlmKHRlc3RfYml0KElNWE1DSV9QRU5EX1dBSVRfUkVTUF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CisJCWlmICh0ZXN0X2JpdChJTVhNQ0lfUEVORF9XQUlUX1JFU1BfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgewogCQkJaW14bWNpX2J1c3lfd2FpdF9mb3Jfc3RhdHVzKGhvc3QsICZzdGF0LAotCQkJCQlTVEFUVVNfRU5EX0NNRF9SRVNQIHwgU1RBVFVTX0VSUl9NQVNLLAotCQkJCQkyMCwgImlteG1jaV90YXNrbGV0X2ZuYyByZXNwIChFUlJBVFVNICM0KSIpOworCQkJCQkJICAgIFNUQVRVU19FTkRfQ01EX1JFU1AgfCBTVEFUVVNfRVJSX01BU0ssCisJCQkJCQkgICAgMjAsICJpbXhtY2lfdGFza2xldF9mbmMgcmVzcCAoRVJSQVRVTSAjNCkiKTsKIAkJfQogCi0JCWlmKHN0YXQgJiAoU1RBVFVTX0VORF9DTURfUkVTUCB8IFNUQVRVU19FUlJfTUFTSykpIHsKLQkJCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChJTVhNQ0lfUEVORF9XQUlUX1JFU1BfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJaWYgKHN0YXQgJiAoU1RBVFVTX0VORF9DTURfUkVTUCB8IFNUQVRVU19FUlJfTUFTSykpIHsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSU1YTUNJX1BFTkRfV0FJVF9SRVNQX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCiAJCQkJaW14bWNpX2NtZF9kb25lKGhvc3QsIHN0YXQpOwotCQkJaWYoaG9zdC0+ZGF0YSAmJiAoc3RhdCAmIFNUQVRVU19FUlJfTUFTSykpCisJCQlpZiAoaG9zdC0+ZGF0YSAmJiAoc3RhdCAmIFNUQVRVU19FUlJfTUFTSykpCiAJCQkJaW14bWNpX2RhdGFfZG9uZShob3N0LCBzdGF0KTsKIAkJfQogCi0JCWlmKHRlc3RfYml0KElNWE1DSV9QRU5EX0NQVV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpIHsKLQkJCXN0YXQgfD0gTU1DX1NUQVRVUzsKLQkJCWlmKGlteG1jaV9jcHVfZHJpdmVuX2RhdGEoaG9zdCwgJnN0YXQpKXsKLQkJCQlpZih0ZXN0X2FuZF9jbGVhcl9iaXQoSU1YTUNJX1BFTkRfV0FJVF9SRVNQX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCWlmICh0ZXN0X2JpdChJTVhNQ0lfUEVORF9DUFVfREFUQV9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CisJCQlzdGF0IHw9IHJlYWR3KGhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUQVRVUyk7CisJCQlpZiAoaW14bWNpX2NwdV9kcml2ZW5fZGF0YShob3N0LCAmc3RhdCkpIHsKKwkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElNWE1DSV9QRU5EX1dBSVRfUkVTUF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpKQogCQkJCQlpbXhtY2lfY21kX2RvbmUoaG9zdCwgc3RhdCk7CiAJCQkJYXRvbWljX2NsZWFyX21hc2soSU1YTUNJX1BFTkRfSVJRX218SU1YTUNJX1BFTkRfQ1BVX0RBVEFfbSwKLQkJCQkJCQkmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQkJCQkJICAmaG9zdC0+cGVuZGluZ19ldmVudHMpOwogCQkJCWlteG1jaV9kYXRhX2RvbmUoaG9zdCwgc3RhdCk7CiAJCQl9CiAJCX0KIAl9CiAKLQlpZih0ZXN0X2JpdChJTVhNQ0lfUEVORF9ETUFfRU5EX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykgJiYKLQkgICAhdGVzdF9iaXQoSU1YTUNJX1BFTkRfV0FJVF9SRVNQX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpIHsKKwlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfRE1BX0VORF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpICYmCisJICAgICF0ZXN0X2JpdChJTVhNQ0lfUEVORF9XQUlUX1JFU1BfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgewogCi0JCXN0YXQgPSBNTUNfU1RBVFVTOworCQlzdGF0ID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RBVFVTKTsKIAkJLyogU2FtZSBhcyBhYm92ZSAqLwogCQlzdGF0IHw9IGhvc3QtPnN0YXR1c19yZWc7CiAKLQkJaWYoaG9zdC0+ZG1hX2RpciA9PSBETUFfVE9fREVWSUNFKSB7CisJCWlmIChob3N0LT5kbWFfZGlyID09IERNQV9UT19ERVZJQ0UpCiAJCQlkYXRhX2Rpcl9tYXNrID0gU1RBVFVTX1dSSVRFX09QX0RPTkU7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWRhdGFfZGlyX21hc2sgPSBTVEFUVVNfREFUQV9UUkFOU19ET05FOwotCQl9CiAKLQkJaWYoc3RhdCAmIGRhdGFfZGlyX21hc2spIHsKKwkJaWYgKHN0YXQgJiBkYXRhX2Rpcl9tYXNrKSB7CiAJCQljbGVhcl9iaXQoSU1YTUNJX1BFTkRfRE1BX0VORF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOwogCQkJaW14bWNpX2RhdGFfZG9uZShob3N0LCBzdGF0KTsKIAkJfQogCX0KIAotCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChJTVhNQ0lfUEVORF9DQVJEX1hDSEdfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSU1YTUNJX1BFTkRfQ0FSRF9YQ0hHX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpIHsKIAotCQlpZihob3N0LT5jbWQpCisJCWlmIChob3N0LT5jbWQpCiAJCQlpbXhtY2lfY21kX2RvbmUoaG9zdCwgU1RBVFVTX1RJTUVfT1VUX1JFU1ApOwogCi0JCWlmKGhvc3QtPmRhdGEpCisJCWlmIChob3N0LT5kYXRhKQogCQkJaW14bWNpX2RhdGFfZG9uZShob3N0LCBTVEFUVVNfVElNRV9PVVRfUkVBRCB8CiAJCQkJCSBTVEFUVVNfQ1JDX1JFQURfRVJSIHwgU1RBVFVTX0NSQ19XUklURV9FUlIpOwogCi0JCWlmKGhvc3QtPnJlcSkKKwkJaWYgKGhvc3QtPnJlcSkKIAkJCWlteG1jaV9maW5pc2hfcmVxdWVzdChob3N0LCBob3N0LT5yZXEpOwogCiAJCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKQEAgLTc5Niw5ICs4MDEsOCBAQAogCQlpZiAocmVxLT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQogCQkJY21kYXQgfD0gQ01EX0RBVF9DT05UX1dSSVRFOwogCi0JCWlmIChyZXEtPmRhdGEtPmZsYWdzICYgTU1DX0RBVEFfU1RSRUFNKSB7CisJCWlmIChyZXEtPmRhdGEtPmZsYWdzICYgTU1DX0RBVEFfU1RSRUFNKQogCQkJY21kYXQgfD0gQ01EX0RBVF9DT05UX1NUUkVBTV9CTE9DSzsKLQkJfQogCX0KIAogCWlteG1jaV9zdGFydF9jbWQoaG9zdCwgcmVxLT5jbWQsIGNtZGF0KTsKQEAgLTgxMSwzNiArODE1LDM3IEBACiAJc3RydWN0IGlteG1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAlpbnQgcHJlc2NhbGVyOwogCi0JaWYoIGlvcy0+YnVzX3dpZHRoPT1NTUNfQlVTX1dJRFRIXzQgKSB7CisJaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkgewogCQlob3N0LT5hY3R1YWxfYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF80OwogCQlpbXhfZ3Bpb19tb2RlKFBCMTFfUEZfU0RfREFUMyk7Ci0JfWVsc2V7CisJfSBlbHNlIHsKIAkJaG9zdC0+YWN0dWFsX2J1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKIAkJaW14X2dwaW9fbW9kZShHUElPX1BPUlRCIHwgR1BJT19JTiB8IEdQSU9fUFVFTiB8IDExKTsKIAl9CiAKLQlpZiAoIGhvc3QtPnBvd2VyX21vZGUgIT0gaW9zLT5wb3dlcl9tb2RlICkgeworCWlmIChob3N0LT5wb3dlcl9tb2RlICE9IGlvcy0+cG93ZXJfbW9kZSkgewogCQlzd2l0Y2ggKGlvcy0+cG93ZXJfbW9kZSkgewogCQljYXNlIE1NQ19QT1dFUl9PRkY6Ci0gICAgICAgIAkJYnJlYWs7CisJCQlicmVhazsKIAkJY2FzZSBNTUNfUE9XRVJfVVA6CiAJCQlzZXRfYml0KElNWE1DSV9QRU5EX1NFVF9JTklUX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7Ci0gICAgICAgIAkJYnJlYWs7CisJCQlicmVhazsKIAkJY2FzZSBNTUNfUE9XRVJfT046Ci0gICAgICAgIAkJYnJlYWs7CisJCQlicmVhazsKIAkJfQogCQlob3N0LT5wb3dlcl9tb2RlID0gaW9zLT5wb3dlcl9tb2RlOwogCX0KIAotCWlmICggaW9zLT5jbG9jayApIHsKKwlpZiAoaW9zLT5jbG9jaykgewogCQl1bnNpZ25lZCBpbnQgY2xrOworCQl1MTYgcmVnOwogCiAJCS8qIFRoZSBwcmVzY2FsZXIgaXMgNSBmb3IgUEVSQ0xLMiBlcXVhbCB0byA5Nk1IegogCQkgKiB0aGVuIDk2TUh6IC8gNSA9IDE5LjIgTUh6CiAJCSAqLwogCQljbGsgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Y2xrKTsKLQkJcHJlc2NhbGVyPShjbGsrKENMS19SQVRFKjcpLzgpL0NMS19SQVRFOwotCQlzd2l0Y2gocHJlc2NhbGVyKSB7CisJCXByZXNjYWxlciA9IChjbGsgKyAoQ0xLX1JBVEUgKiA3KSAvIDgpIC8gQ0xLX1JBVEU7CisJCXN3aXRjaCAocHJlc2NhbGVyKSB7CiAJCWNhc2UgMDoKIAkJY2FzZSAxOglwcmVzY2FsZXIgPSAwOwogCQkJYnJlYWs7CkBAIC04NTgsMjQgKzg2MywyOSBAQAogCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIlBFUkNMSzIgJWQgTUh6IC0+IHByZXNjYWxlciAlZFxuIiwKIAkJCWNsaywgcHJlc2NhbGVyKTsKIAotCQlmb3IoY2xrPTA7IGNsazw4OyBjbGsrKykgeworCQlmb3IgKGNsayA9IDA7IGNsayA8IDg7IGNsaysrKSB7CiAJCQlpbnQgeDsKLQkJCXggPSBDTEtfUkFURSAvICgxPDxjbGspOwotCQkJaWYoIHggPD0gaW9zLT5jbG9jaykKKwkJCXggPSBDTEtfUkFURSAvICgxIDw8IGNsayk7CisJCQlpZiAoeCA8PSBpb3MtPmNsb2NrKQogCQkJCWJyZWFrOwogCQl9CiAKLQkJTU1DX1NUUl9TVFBfQ0xLIHw9IFNUUl9TVFBfQ0xLX0VOQUJMRTsgLyogZW5hYmxlIGNvbnRyb2xsZXIgKi8KKwkJLyogZW5hYmxlIGNvbnRyb2xsZXIgKi8KKwkJcmVnID0gcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfU1RSX1NUUF9DTEspOworCQl3cml0ZXcocmVnIHwgU1RSX1NUUF9DTEtfRU5BQkxFLAorCQkJCWhvc3QtPmJhc2UgKyBNTUNfUkVHX1NUUl9TVFBfQ0xLKTsKIAogCQlpbXhtY2lfc3RvcF9jbG9jayhob3N0KTsKLQkJTU1DX0NMS19SQVRFID0gKHByZXNjYWxlcjw8MykgfCBjbGs7CisJCXdyaXRldygocHJlc2NhbGVyIDw8IDMpIHwgY2xrLCBob3N0LT5iYXNlICsgTU1DX1JFR19DTEtfUkFURSk7CiAJCS8qCiAJCSAqIFVuZGVyIG15IHVuZGVyc3RhbmRpbmcsIGNsb2NrIHNob3VsZCBub3QgYmUgc3RhcnRlZCB0aGVyZSwgYmVjYXVzZSBpdCB3b3VsZAogCQkgKiBpbml0aWF0ZSBTREhDIHNlcXVlbmNlciBhbmQgc2VuZCBsYXN0IG9yIHJhbmRvbSBjb21tYW5kIGludG8gY2FyZAogCQkgKi8KLQkJLyppbXhtY2lfc3RhcnRfY2xvY2soaG9zdCk7Ki8KKwkJLyogaW14bWNpX3N0YXJ0X2Nsb2NrKGhvc3QpOyAqLwogCi0JCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiTU1DX0NMS19SQVRFOiAweCUwOHhcbiIsIE1NQ19DTEtfUkFURSk7CisJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAorCQkJIk1NQ19DTEtfUkFURTogMHglMDh4XG4iLAorCQkJcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfQ0xLX1JBVEUpKTsKIAl9IGVsc2UgewogCQlpbXhtY2lfc3RvcF9jbG9jayhob3N0KTsKIAl9CkBAIC05MTUsMTAgKzkyNSwxMCBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAl9CiAKLQlpZih0ZXN0X2JpdChJTVhNQ0lfUEVORF9XQUlUX1JFU1BfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSB8fAotCSAgIHRlc3RfYml0KElNWE1DSV9QRU5EX0RNQV9EQVRBX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykpIHsKKwlpZiAodGVzdF9iaXQoSU1YTUNJX1BFTkRfV0FJVF9SRVNQX2IsICZob3N0LT5wZW5kaW5nX2V2ZW50cykgfHwKKwkgICAgdGVzdF9iaXQoSU1YTUNJX1BFTkRfRE1BX0RBVEFfYiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgewogCQlhdG9taWNfaW5jKCZob3N0LT5zdHVja190aW1lb3V0KTsKLQkJaWYoYXRvbWljX3JlYWQoJmhvc3QtPnN0dWNrX3RpbWVvdXQpID4gNCkKKwkJaWYgKGF0b21pY19yZWFkKCZob3N0LT5zdHVja190aW1lb3V0KSA+IDQpCiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAl9IGVsc2UgewogCQlhdG9taWNfc2V0KCZob3N0LT5zdHVja190aW1lb3V0LCAwKTsKQEAgLTkzNCw2ICs5NDQsNyBAQAogCXN0cnVjdCBpbXhtY2lfaG9zdCAqaG9zdCA9IE5VTEw7CiAJc3RydWN0IHJlc291cmNlICpyOwogCWludCByZXQgPSAwLCBpcnE7CisJdTE2IHJldl9ubzsKIAogCXByaW50ayhLRVJOX0lORk8gImkuTVggbW1jIGRyaXZlclxuIik7CiAKQEAgLTk0Miw3ICs5NTMsOCBAQAogCWlmICghciB8fCBpcnEgPCAwKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsIDB4MTAwLCBwZGV2LT5uYW1lKSkKKwlyID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLCBwZGV2LT5uYW1lKTsKKwlpZiAoIXIpCiAJCXJldHVybiAtRUJVU1k7CiAKIAltbWMgPSBtbWNfYWxsb2NfaG9zdChzaXplb2Yoc3RydWN0IGlteG1jaV9ob3N0KSwgJnBkZXYtPmRldik7CkBAIC05NjYsNiArOTc4LDEyIEBACiAJbW1jLT5tYXhfYmxrX2NvdW50ID0gNjU1MzU7CiAKIAlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlob3N0LT5iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFob3N0LT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwogCWhvc3QtPm1tYyA9IG1tYzsKIAlob3N0LT5kbWFfYWxsb2NhdGVkID0gMDsKIAlob3N0LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtOTkzLDE4ICsxMDExLDIwIEBACiAJaW14X2dwaW9fbW9kZShQQjEyX1BGX1NEX0NMSyk7CiAJaW14X2dwaW9fbW9kZShQQjEzX1BGX1NEX0NNRCk7CiAKLQlpbXhtY2lfc29mdHJlc2V0KCk7CisJaW14bWNpX3NvZnRyZXNldChob3N0KTsKIAotCWlmICggTU1DX1JFVl9OTyAhPSAweDM5MCApIHsKKwlyZXZfbm8gPSByZWFkdyhob3N0LT5iYXNlICsgTU1DX1JFR19SRVZfTk8pOworCWlmIChyZXZfbm8gIT0gMHgzOTApIHsKIAkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJ3cm9uZyByZXYubm8uIDB4JTA4eC4gYWJvcnRpbmcuXG4iLAotCQkgICAgICAgIE1NQ19SRVZfTk8pOworCQkJcmVhZHcoaG9zdC0+YmFzZSArIE1NQ19SRUdfUkVWX05PKSk7CiAJCWdvdG8gb3V0OwogCX0KIAotCU1NQ19SRUFEX1RPID0gMHgyZGI0OyAvKiByZWNvbW1lbmRlZCBpbiBkYXRhIHNoZWV0ICovCisJLyogcmVjb21tZW5kZWQgaW4gZGF0YSBzaGVldCAqLworCXdyaXRldygweDJkYjQsIGhvc3QtPmJhc2UgKyBNTUNfUkVHX1JFQURfVE8pOwogCiAJaG9zdC0+aW1hc2sgPSBJTVhNQ0lfSU5UX01BU0tfREVGQVVMVDsKLQlNTUNfSU5UX01BU0sgPSBob3N0LT5pbWFzazsKKwl3cml0ZXcoaG9zdC0+aW1hc2ssIGhvc3QtPmJhc2UgKyBNTUNfUkVHX0lOVF9NQVNLKTsKIAogCWhvc3QtPmRtYSA9IGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKERSSVZFUl9OQU1FLCBETUFfUFJJT19MT1cpOwogCWlmKGhvc3QtPmRtYSA8IDApIHsKQEAgLTEwMTIsNyArMTAzMiw3IEBACiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQotCWhvc3QtPmRtYV9hbGxvY2F0ZWQ9MTsKKwlob3N0LT5kbWFfYWxsb2NhdGVkID0gMTsKIAlpbXhfZG1hX3NldHVwX2hhbmRsZXJzKGhvc3QtPmRtYSwgaW14bWNpX2RtYV9pcnEsIE5VTEwsIGhvc3QpOwogCiAJdGFza2xldF9pbml0KCZob3N0LT50YXNrbGV0LCBpbXhtY2lfdGFza2xldF9mbmMsICh1bnNpZ25lZCBsb25nKWhvc3QpOwpAQCAtMTAzMiw3ICsxMDUyLDcgQEAKIAlob3N0LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaG9zdDsKIAlob3N0LT50aW1lci5mdW5jdGlvbiA9IGlteG1jaV9jaGVja19zdGF0dXM7CiAJYWRkX3RpbWVyKCZob3N0LT50aW1lcik7Ci0JbW9kX3RpbWVyKCZob3N0LT50aW1lciwgamlmZmllcyArIChIWj4+MSkpOworCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyAoSFogPj4gMSkpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbW1jKTsKIApAQCAtMTA0MiwxOCArMTA2MiwyMCBAQAogCiBvdXQ6CiAJaWYgKGhvc3QpIHsKLQkJaWYoaG9zdC0+ZG1hX2FsbG9jYXRlZCl7CisJCWlmIChob3N0LT5kbWFfYWxsb2NhdGVkKSB7CiAJCQlpbXhfZG1hX2ZyZWUoaG9zdC0+ZG1hKTsKLQkJCWhvc3QtPmRtYV9hbGxvY2F0ZWQ9MDsKKwkJCWhvc3QtPmRtYV9hbGxvY2F0ZWQgPSAwOwogCQl9CiAJCWlmIChob3N0LT5jbGspIHsKIAkJCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7CiAJCQljbGtfcHV0KGhvc3QtPmNsayk7CiAJCX0KKwkJaWYgKGhvc3QtPmJhc2UpCisJCQlpb3VubWFwKGhvc3QtPmJhc2UpOwogCX0KIAlpZiAobW1jKQogCQltbWNfZnJlZV9ob3N0KG1tYyk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAweDEwMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDcyLDkgKzEwOTQsMTAgQEAKIAkJbW1jX3JlbW92ZV9ob3N0KG1tYyk7CiAKIAkJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKLQkJaWYoaG9zdC0+ZG1hX2FsbG9jYXRlZCl7CisJCWlvdW5tYXAoaG9zdC0+YmFzZSk7CisJCWlmIChob3N0LT5kbWFfYWxsb2NhdGVkKSB7CiAJCQlpbXhfZG1hX2ZyZWUoaG9zdC0+ZG1hKTsKLQkJCWhvc3QtPmRtYV9hbGxvY2F0ZWQ9MDsKKwkJCWhvc3QtPmRtYV9hbGxvY2F0ZWQgPSAwOwogCQl9CiAKIAkJdGFza2xldF9raWxsKCZob3N0LT50YXNrbGV0KTsKQEAgLTEwODIsNyArMTEwNSw3IEBACiAJCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7CiAJCWNsa19wdXQoaG9zdC0+Y2xrKTsKIAotCQlyZWxlYXNlX21lbV9yZWdpb24oaG9zdC0+cmVzLT5zdGFydCwgMHgxMDApOworCQlyZWxlYXNlX21lbV9yZWdpb24oaG9zdC0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5yZXMpKTsKIAogCQltbWNfZnJlZV9ob3N0KG1tYyk7CiAJfQpAQCAtMTEwOSw3ICsxMTMyLDcgQEAKIAogCWlmIChtbWMpIHsKIAkJaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0JCWlmKGhvc3QpCisJCWlmIChob3N0KQogCQkJc2V0X2JpdChJTVhNQ0lfUEVORF9TRVRfSU5JVF9iLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOwogCQlyZXQgPSBtbWNfcmVzdW1lX2hvc3QobW1jKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuaAppbmRleCBlNTMzOWUzLi4wOWQ1ZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmgKQEAgLTEsMjQgKzEsMjEgQEAKKyNkZWZpbmUgTU1DX1JFR19TVFJfU1RQX0NMSwkJMHgwMAorI2RlZmluZSBNTUNfUkVHX1NUQVRVUwkJCTB4MDQKKyNkZWZpbmUgTU1DX1JFR19DTEtfUkFURQkJMHgwOAorI2RlZmluZSBNTUNfUkVHX0NNRF9EQVRfQ09OVAkJMHgwQworI2RlZmluZSBNTUNfUkVHX1JFU19UTwkJCTB4MTAKKyNkZWZpbmUgTU1DX1JFR19SRUFEX1RPCQkJMHgxNAorI2RlZmluZSBNTUNfUkVHX0JMS19MRU4JCQkweDE4CisjZGVmaW5lIE1NQ19SRUdfTk9CCQkJMHgxQworI2RlZmluZSBNTUNfUkVHX1JFVl9OTwkJCTB4MjAKKyNkZWZpbmUgTU1DX1JFR19JTlRfTUFTSwkJMHgyNAorI2RlZmluZSBNTUNfUkVHX0NNRAkJCTB4MjgKKyNkZWZpbmUgTU1DX1JFR19BUkdICQkJMHgyQworI2RlZmluZSBNTUNfUkVHX0FSR0wJCQkweDMwCisjZGVmaW5lIE1NQ19SRUdfUkVTX0ZJRk8JCTB4MzQKKyNkZWZpbmUgTU1DX1JFR19CVUZGRVJfQUNDRVNTCQkweDM4CiAKLSMgZGVmaW5lIF9fUkVHMTYoeCkJKCooKHZvbGF0aWxlIHUxNiAqKUlPX0FERFJFU1MoeCkpKQotCi0jZGVmaW5lIE1NQ19TVFJfU1RQX0NMSyAgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDAwKQotI2RlZmluZSBNTUNfU1RBVFVTICAgICAgIF9fUkVHMTYoSU1YX01NQ19CQVNFICsgMHgwNCkKLSNkZWZpbmUgTU1DX0NMS19SQVRFICAgICBfX1JFRzE2KElNWF9NTUNfQkFTRSArIDB4MDgpCi0jZGVmaW5lIE1NQ19DTURfREFUX0NPTlQgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDBDKQotI2RlZmluZSBNTUNfUkVTX1RPICAgICAgIF9fUkVHMTYoSU1YX01NQ19CQVNFICsgMHgxMCkKLSNkZWZpbmUgTU1DX1JFQURfVE8gICAgICBfX1JFRzE2KElNWF9NTUNfQkFTRSArIDB4MTQpCi0jZGVmaW5lIE1NQ19CTEtfTEVOICAgICAgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDE4KQotI2RlZmluZSBNTUNfTk9CICAgICAgICAgIF9fUkVHMTYoSU1YX01NQ19CQVNFICsgMHgxQykKLSNkZWZpbmUgTU1DX1JFVl9OTyAgICAgICBfX1JFRzE2KElNWF9NTUNfQkFTRSArIDB4MjApCi0jZGVmaW5lIE1NQ19JTlRfTUFTSyAgICAgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDI0KQotI2RlZmluZSBNTUNfQ01EICAgICAgICAgIF9fUkVHMTYoSU1YX01NQ19CQVNFICsgMHgyOCkKLSNkZWZpbmUgTU1DX0FSR0ggICAgICAgICBfX1JFRzE2KElNWF9NTUNfQkFTRSArIDB4MkMpCi0jZGVmaW5lIE1NQ19BUkdMICAgICAgICAgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDMwKQotI2RlZmluZSBNTUNfUkVTX0ZJRk8gICAgIF9fUkVHMTYoSU1YX01NQ19CQVNFICsgMHgzNCkKLSNkZWZpbmUgTU1DX0JVRkZFUl9BQ0NFU1MgX19SRUcxNihJTVhfTU1DX0JBU0UgKyAweDM4KQotI2RlZmluZSBNTUNfQlVGRkVSX0FDQ0VTU19PRlMgMHgzOAotCi0KKyNkZWZpbmUgU1RSX1NUUF9DTEtfSVBHX0NMS19HQVRFX0RJUyAgICAoMTw8MTUpCisjZGVmaW5lIFNUUl9TVFBfQ0xLX0lQR19QRVJDTEtfR0FURV9ESVMgKDE8PDE0KQogI2RlZmluZSBTVFJfU1RQX0NMS19FTkRJQU4gICAgICAgICAgICAgICgxPDw1KQogI2RlZmluZSBTVFJfU1RQX0NMS19SRVNFVCAgICAgICAgICAgICAgICgxPDwzKQogI2RlZmluZSBTVFJfU1RQX0NMS19FTkFCTEUgICAgICAgICAgICAgICgxPDwyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwppbmRleCAyZmFkZjMyLi4xYmNiZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwpAQCAtNTAwLDcgKzUwMCw3IEBACiAJfQogCiAJaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0JaG9zdC0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJNQ0xLIik7CisJaG9zdC0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoaG9zdC0+Y2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKGhvc3QtPmNsayk7CiAJCWhvc3QtPmNsayA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXAuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCmluZGV4IDFiOWZjM2MuLjY3ZDdiN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jCkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogCX0KIAogCWlmIChpc19yZWFkKSB7Ci0JCWlmIChob3N0LT5pZCA9PSAxKSB7CisJCWlmIChob3N0LT5pZCA9PSAwKSB7CiAJCQlzeW5jX2RldiA9IE9NQVBfRE1BX01NQ19SWDsKIAkJCWRtYV9kZXZfbmFtZSA9ICJNTUMxIHJlYWQiOwogCQl9IGVsc2UgewpAQCAtMTAyMyw3ICsxMDIzLDcgQEAKIAkJCWRtYV9kZXZfbmFtZSA9ICJNTUMyIHJlYWQiOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKGhvc3QtPmlkID09IDEpIHsKKwkJaWYgKGhvc3QtPmlkID09IDApIHsKIAkJCXN5bmNfZGV2ID0gT01BUF9ETUFfTU1DX1RYOwogCQkJZG1hX2Rldl9uYW1lID0gIk1NQzEgd3JpdGUiOwogCQl9IGVsc2UgewpAQCAtMTMxNyw3ICsxMzE3LDcgQEAKIAlob3N0LT5zbG90c1tpZF0gPSBzbG90OwogCiAJbW1jLT5jYXBzID0gMDsKLQlpZiAoaG9zdC0+cGRhdGEtPmNvbmYud2lyZTQpCisJaWYgKGhvc3QtPnBkYXRhLT5zbG90c1tpZF0ud2lyZXMgPj0gNCkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfNF9CSVRfREFUQTsKIAogCW1tYy0+b3BzID0gJm1tY19vbWFwX29wczsKQEAgLTE0NTEsNiArMTQ1MSw3IEBACiAJaG9zdC0+aXJxID0gaXJxOwogCiAJaG9zdC0+dXNlX2RtYSA9IDE7CisJaG9zdC0+ZGV2LT5kbWFfbWFzayA9ICZwZGF0YS0+ZG1hX21hc2s7CiAJaG9zdC0+ZG1hX2NoID0gLTE7CiAKIAlob3N0LT5pcnEgPSBpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYwppbmRleCBlYmZhYTk5Li5mODhjYzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKQEAgLTI2LDExICsyNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL21tYy5oPgogCkBAIC01MzMsNyArNTM0LDcgQEAKIAlob3N0LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWhvc3QtPmNsa3J0ID0gQ0xLUlRfT0ZGOwogCi0JaG9zdC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiTU1DQ0xLIik7CisJaG9zdC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGhvc3QtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihob3N0LT5jbGspOwogCQlob3N0LT5jbGsgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmMKaW5kZXggM2IyMDg1Yi4uZmNjOThhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNkaS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L21jaS5oPgorI2luY2x1ZGUgPHBsYXQvbWNpLmg+CiAKICNpbmNsdWRlICJzM2NtY2kuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9kYzIxMjg1LmMgYi9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYwppbmRleCAzYWEwMThjLi40Mjk2OWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYwpAQCAtMzIsMTYgKzMyLDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkIG53X2VuX3dyaXRlKHZvaWQpCiB7Ci0JZXh0ZXJuIHNwaW5sb2NrX3QgZ3Bpb19sb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKgogCSAqIHdlIHdhbnQgdG8gd3JpdGUgYSBiaXQgcGF0dGVybiBYWFgxIHRvIFhpbGlueCB0byBlbmFibGUKIAkgKiB0aGUgd3JpdGUgZ2F0ZSwgd2hpY2ggd2lsbCBiZSBvcGVuIGZvciBhYm91dCB0aGUgbmV4dCAybXMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCWNwbGRfbW9kaWZ5KDEsIDEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZud19ncGlvX2xvY2ssIGZsYWdzKTsKKwlud19jcGxkX21vZGlmeShDUExEX0ZMQVNIX1dSX0VOQUJMRSwgQ1BMRF9GTEFTSF9XUl9FTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBsZXQgdGhlIElTQSBidXMgdG8gY2F0Y2ggb24uLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKaW5kZXggZGNkYjFmMS4uM2VhMWRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIEVycm9yOwogCX0KLQltZW16ZXJvKGluZm8sIHNpemVvZihzdHJ1Y3QgaXhwMjAwMF9mbGFzaF9pbmZvKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaXhwMjAwMF9mbGFzaF9pbmZvKSk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYwppbmRleCA5YzdhNWZiLi4xNjU1NWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIEVycm9yOwogCX0KLQltZW16ZXJvKGluZm8sIHNpemVvZihzdHJ1Y3QgaXhwNHh4X2ZsYXNoX2luZm8pKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpeHA0eHhfZmxhc2hfaW5mbykpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IDFjMmU5NDUuLmY4YWUwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiBjb25maWcgTVREX05BTkRfTVhDCiAJdHJpc3RhdGUgIk1YQyBOQU5EIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX01YMgorCWRlcGVuZHMgb24gQVJDSF9NWDIgfHwgQVJDSF9NWDMKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUKIAkgIE1YQyBwcm9jZXNzb3JzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jCmluZGV4IDE1ZjBhMjYuLmZjNDE0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgogCisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHhfbmFuZC5oPgogCkBAIC0xMDgwLDcgKzEwODAsNyBAQAogCXRoaXMgPSAmaW5mby0+bmFuZF9jaGlwOwogCW10ZC0+cHJpdiA9IGluZm87CiAKLQlpbmZvLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJOQU5EQ0xLIik7CisJaW5mby0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGluZm8tPmNsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBuYW5kIGNsb2NrXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihpbmZvLT5jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwppbmRleCA1NTYxMzllLi44ZTM3NWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwpAQCAtNDUsOCArNDUsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1uYW5kLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtbmFuZC5oPgorI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogCiAjaWZkZWYgQ09ORklHX01URF9OQU5EX1MzQzI0MTBfSFdFQ0MKIHN0YXRpYyBpbnQgaGFyZHdhcmVfZWNjID0gMTsKQEAgLTgxOCw3ICs4MTgsNyBAQAogCQlnb3RvIGV4aXRfZXJyb3I7CiAJfQogCi0JbWVtemVybyhpbmZvLCBzaXplb2YoKmluZm8pKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaW5mby0+Y29udHJvbGxlci5sb2NrKTsKQEAgLTg4Myw3ICs4ODMsNyBAQAogCQlnb3RvIGV4aXRfZXJyb3I7CiAJfQogCi0JbWVtemVybyhpbmZvLT5tdGRzLCBzaXplKTsKKwltZW1zZXQoaW5mby0+bXRkcywgMCwgc2l6ZSk7CiAKIAkvKiBpbml0aWFsaXNlIGFsbCBwb3NzaWJsZSBjaGlwcyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKaW5kZXggYTdlNGQ5OC4uZDFlMGI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAKIAkJSU5JVF9DT01QTEVUSU9OKGMtPmlycV9kb25lKTsKIAkJaWYgKGMtPmdwaW9faXJxKSB7Ci0JCQlyZXN1bHQgPSBvbWFwX2dldF9ncGlvX2RhdGFpbihjLT5ncGlvX2lycSk7CisJCQlyZXN1bHQgPSBncGlvX2dldF92YWx1ZShjLT5ncGlvX2lycSk7CiAJCQlpZiAocmVzdWx0ID09IC0xKSB7CiAJCQkJY3RybCA9IHJlYWRfcmVnKGMsIE9ORU5BTkRfUkVHX0NUUkxfU1RBVFVTKTsKIAkJCQlpbnRyID0gcmVhZF9yZWcoYywgT05FTkFORF9SRUdfSU5URVJSVVBUKTsKQEAgLTYzNCw5ICs2MzQsOSBAQAogCQkJCSJPbmVOQU5EXG4iLCBjLT5ncGlvX2lycSk7CiAJCQlnb3RvIGVycl9pb3VubWFwOwogCX0KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihjLT5ncGlvX2lycSwgMSk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoYy0+Z3Bpb19pcnEpOwogCi0JaWYgKChyID0gcmVxdWVzdF9pcnEoT01BUF9HUElPX0lSUShjLT5ncGlvX2lycSksCisJaWYgKChyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoYy0+Z3Bpb19pcnEpLAogCQkJICAgICBvbWFwMl9vbmVuYW5kX2ludGVycnVwdCwgSVJRRl9UUklHR0VSX1JJU0lORywKIAkJCSAgICAgcGRldi0+ZGV2LmRyaXZlci0+bmFtZSwgYykpIDwgMCkKIAkJZ290byBlcnJfcmVsZWFzZV9ncGlvOwpAQCAtNzIzLDcgKzcyMyw3IEBACiAJaWYgKGMtPmRtYV9jaGFubmVsICE9IC0xKQogCQlvbWFwX2ZyZWVfZG1hKGMtPmRtYV9jaGFubmVsKTsKIAlpZiAoYy0+Z3Bpb19pcnEpCi0JCWZyZWVfaXJxKE9NQVBfR1BJT19JUlEoYy0+Z3Bpb19pcnEpLCBjKTsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoYy0+Z3Bpb19pcnEpLCBjKTsKIGVycl9yZWxlYXNlX2dwaW86CiAJaWYgKGMtPmdwaW9faXJxKQogCQlvbWFwX2ZyZWVfZ3BpbyhjLT5ncGlvX2lycSk7CkBAIC03NjAsNyArNzYwLDcgQEAKIAlvbWFwMl9vbmVuYW5kX3NodXRkb3duKHBkZXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWlmIChjLT5ncGlvX2lycSkgewotCQlmcmVlX2lycShPTUFQX0dQSU9fSVJRKGMtPmdwaW9faXJxKSwgYyk7CisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGMtPmdwaW9faXJxKSwgYyk7CiAJCW9tYXBfZnJlZV9ncGlvKGMtPmdwaW9faXJxKTsKIAl9CiAJaW91bm1hcChjLT5vbmVuYW5kLmJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggNzJhOTIxMi4uOWExODI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yMzk5LDkgKzIzOTksMTQgQEAKICAgICAgICAgICBFbmFibGVzIHN1cHBvcnQgZm9yIENoZWxzaW8ncyBnaWdhYml0IEV0aGVybmV0IFBDSSBjYXJkcy4gIElmIHlvdQogICAgICAgICAgIGFyZSB1c2luZyBvbmx5IDEwRyBjYXJkcyBzYXkgJ04nIGhlcmUuCiAKK2NvbmZpZyBDSEVMU0lPX1QzX0RFUEVORFMKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gUENJICYmIElORVQKKwlkZWZhdWx0IHkKKwogY29uZmlnIENIRUxTSU9fVDMKIAl0cmlzdGF0ZSAiQ2hlbHNpbyBDb21tdW5pY2F0aW9ucyBUMyAxMEdiIEV0aGVybmV0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSU5FVAorCWRlcGVuZHMgb24gQ0hFTFNJT19UM19ERVBFTkRTCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBJTkVUX0xSTwogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCmluZGV4IDZlY2M2MDAuLjNlYzIwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZlcC0+cnhfbG9jayk7CiAKLQkJaWYgKG1vcmUgJiYgbmV0aWZfcnhfcmVzY2hlZHVsZShkZXYsIG5hcGkpKQorCQlpZiAobW9yZSAmJiBuZXRpZl9yeF9yZXNjaGVkdWxlKG5hcGkpKQogCQkJZ290byBwb2xsX3NvbWVfbW9yZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9peHA0eHhfZXRoLmMgYi9kcml2ZXJzL25ldC9hcm0vaXhwNHh4X2V0aC5jCmluZGV4IDI2YWY0MTEuLjVmY2UxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9peHA0eHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2l4cDR4eF9ldGguYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJCQluZXRpZl9yeF9jb21wbGV0ZShuYXBpKTsKIAkJCXFtZ3JfZW5hYmxlX2lycShyeHEpOwogCQkJaWYgKCFxbWdyX3N0YXRfZW1wdHkocnhxKSAmJgotCQkJICAgIG5ldGlmX3J4X3Jlc2NoZWR1bGUoZGV2LCBuYXBpKSkgeworCQkJICAgIG5ldGlmX3J4X3Jlc2NoZWR1bGUobmFwaSkpIHsKICNpZiBERUJVR19SWAogCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXRoX3BvbGwiCiAJCQkJICAgICAgICIgbmV0aWZfcnhfcmVzY2hlZHVsZSBzdWNjZXNzZWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0va3M4Njk1bmV0LmMgYi9kcml2ZXJzL25ldC9hcm0va3M4Njk1bmV0LmMKaW5kZXggNTkyZGFlZS4uOWFkMjJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2tzODY5NW5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9rczg2OTVuZXQuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwppbmRleCBkNTQ4YTQ1Li5mZjY0OTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jczg5eDAuYworKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtMTcwLDExICsxNzAsNyBAQAogLyogVGhlIGNzODkwMCBoYXMgNCBJUlEgcGlucywgc29mdHdhcmUgc2VsZWN0YWJsZS4gY3M4OTAwX2lycV9tYXAgbWFwcwogICAgdGhlbSB0byBzeXN0ZW0gSVJRIG51bWJlcnMuIFRoaXMgbWFwcGluZyBpcyBjYXJkIHNwZWNpZmljIGFuZCBpcyBzZXQgdG8KICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBDaXJydXMgRXZhbCBib2FyZCBmb3IgdGhpcyBjaGlwLiAqLwotI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCi1zdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX3VzZWQgX19pbml0ZGF0YSA9Ci0gICB7IDB4ODAwOTAzMDMsIDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MmEwLCAweDJjMCwgMHgyZTAsIDB9Owotc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0gezEyLDAsMCwwfTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIX0hJQ09TSDQpCisjaWYgZGVmaW5lZChDT05GSUdfU0hfSElDT1NINCkKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9fdXNlZCBfX2luaXRkYXRhID0KICAgIHsgMHgwMzAwLCAwfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHsxLDAsMCwwfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmggYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5oCmluZGV4IDcwN2RmM2YuLmRjOWM2ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmgKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuaApAQCAtNjgsMTcgKzY4LDE3IEBACiAgKi8KIAogLyogdGhlc2UgZnVuY3Rpb25zIHRha2UgdGhlIFNDQiBzdGF0dXMgd29yZCBhbmQgdGVzdCB0aGUgcmVsZXZhbnQgc3RhdHVzIGJpdCAqLwotI2RlZmluZSBTQ0JfY29tcGxldGUocykgKChzJjB4ODAwMCkhPTApCi0jZGVmaW5lIFNDQl9yeGRmcmFtZShzKSAoKHMmMHg0MDAwKSE9MCkKLSNkZWZpbmUgU0NCX0NVZGVhZChzKSAgICgocyYweDIwMDApIT0wKQotI2RlZmluZSBTQ0JfUlVkZWFkKHMpICAgKChzJjB4MTAwMCkhPTApCi0jZGVmaW5lIFNDQl9hY2socykgICAgICAocyAmIDB4ZjAwMCkKKyNkZWZpbmUgU0NCX2NvbXBsZXRlKHMpICgoKHMpICYgMHg4MDAwKSAhPSAwKQorI2RlZmluZSBTQ0JfcnhkZnJhbWUocykgKCgocykgJiAweDQwMDApICE9IDApCisjZGVmaW5lIFNDQl9DVWRlYWQocykgICAoKChzKSAmIDB4MjAwMCkgIT0gMCkKKyNkZWZpbmUgU0NCX1JVZGVhZChzKSAgICgoKHMpICYgMHgxMDAwKSAhPSAwKQorI2RlZmluZSBTQ0JfYWNrKHMpICAgICAgKChzKSAmIDB4ZjAwMCkKIAogLyogQ29tbWFuZCB1bml0IHN0YXR1czogMD1pZGxlLCAxPXN1c3BlbmRlZCwgMj1hY3RpdmUgKi8KLSNkZWZpbmUgU0NCX0NVc3RhdChzKSAgICgocyYweDAzMDApPj44KQorI2RlZmluZSBTQ0JfQ1VzdGF0KHMpICAgKCgocykmMHgwMzAwKT4+OCkKIAogLyogUmVjZWl2ZSB1bml0IHN0YXR1czogMD1pZGxlLCAxPXN1c3BlbmRlZCwgMj1vdXQgb2YgcmVzb3VyY2VzLCA0PXJlYWR5ICovCi0jZGVmaW5lIFNDQl9SVXN0YXQocykgICAoKHMmMHgwMDcwKT4+NCkKKyNkZWZpbmUgU0NCX1JVc3RhdChzKSAgICgoKHMpJjB4MDA3MCk+PjQpCiAKIC8qIFNDQiBjb21tYW5kcyAqLwogI2RlZmluZSBTQ0JfQ1Vub3AgICAgICAgMHgwMDAwCkBAIC05OCwxOCArOTgsMTggQEAKICAqIENvbW1hbmQgYmxvY2sgZGVmaW5lcwogICovCiAKLSNkZWZpbmUgU3RhdF9Eb25lKHMpICAgICgocyYweDgwMDApIT0wKQotI2RlZmluZSBTdGF0X0J1c3kocykgICAgKChzJjB4NDAwMCkhPTApCi0jZGVmaW5lIFN0YXRfT0socykgICAgICAoKHMmMHgyMDAwKSE9MCkKLSNkZWZpbmUgU3RhdF9BYm9ydChzKSAgICgocyYweDEwMDApIT0wKQotI2RlZmluZSBTdGF0X1NURmFpbCAgICAgKChzJjB4MDgwMCkhPTApCi0jZGVmaW5lIFN0YXRfVE5vQ2FyKHMpICAoKHMmMHgwNDAwKSE9MCkKLSNkZWZpbmUgU3RhdF9UTm9DVFMocykgICgocyYweDAyMDApIT0wKQotI2RlZmluZSBTdGF0X1ROb0RNQShzKSAgKChzJjB4MDEwMCkhPTApCi0jZGVmaW5lIFN0YXRfVERlZmVyKHMpICAoKHMmMHgwMDgwKSE9MCkKLSNkZWZpbmUgU3RhdF9UQ29sbChzKSAgICgocyYweDAwNDApIT0wKQotI2RlZmluZSBTdGF0X1RYQ29sbChzKSAgKChzJjB4MDAyMCkhPTApCi0jZGVmaW5lIFN0YXRfTm9Db2xsKHMpICAocyYweDAwMGYpCisjZGVmaW5lIFN0YXRfRG9uZShzKSAgICAoKChzKSAmIDB4ODAwMCkgIT0gMCkKKyNkZWZpbmUgU3RhdF9CdXN5KHMpICAgICgoKHMpICYgMHg0MDAwKSAhPSAwKQorI2RlZmluZSBTdGF0X09LKHMpICAgICAgKCgocykgJiAweDIwMDApICE9IDApCisjZGVmaW5lIFN0YXRfQWJvcnQocykgICAoKChzKSAmIDB4MTAwMCkgIT0gMCkKKyNkZWZpbmUgU3RhdF9TVEZhaWwgICAgICgoKHMpICYgMHgwODAwKSAhPSAwKQorI2RlZmluZSBTdGF0X1ROb0NhcihzKSAgKCgocykgJiAweDA0MDApICE9IDApCisjZGVmaW5lIFN0YXRfVE5vQ1RTKHMpICAoKChzKSAmIDB4MDIwMCkgIT0gMCkKKyNkZWZpbmUgU3RhdF9UTm9ETUEocykgICgoKHMpICYgMHgwMTAwKSAhPSAwKQorI2RlZmluZSBTdGF0X1REZWZlcihzKSAgKCgocykgJiAweDAwODApICE9IDApCisjZGVmaW5lIFN0YXRfVENvbGwocykgICAoKChzKSAmIDB4MDA0MCkgIT0gMCkKKyNkZWZpbmUgU3RhdF9UWENvbGwocykgICgoKHMpICYgMHgwMDIwKSAhPSAwKQorI2RlZmluZSBTdGF0X05vQ29sbChzKSAgKChzKSAmIDB4MDAwZikKIAogLyogQ21kX0VORCB3aWxsIGVuZCBBRlRFUiB0aGUgY29tbWFuZCBpZiB0aGlzIGlzIHRoZSBmaXJzdAogICogY29tbWFuZCBibG9jayBhZnRlciBhbiBTQ0JfQ1VzdGFydCwgYnV0IEJFRk9SRSB0aGUgY29tbWFuZApAQCAtMTM2LDE2ICsxMzYsMTYgQEAKICAqIEZyYW1lIERlc2NyaXB0b3IgKFJlY2VpdmUgYmxvY2spIGRlZmluZXMKICAqLwogCi0jZGVmaW5lIEZEX0RvbmUocykgICgocyYweDgwMDApIT0wKQotI2RlZmluZSBGRF9CdXN5KHMpICAoKHMmMHg0MDAwKSE9MCkKLSNkZWZpbmUgRkRfT0socykgICAgKChzJjB4MjAwMCkhPTApCisjZGVmaW5lIEZEX0RvbmUocykgICgoKHMpICYgMHg4MDAwKSAhPSAwKQorI2RlZmluZSBGRF9CdXN5KHMpICAoKChzKSAmIDB4NDAwMCkgIT0gMCkKKyNkZWZpbmUgRkRfT0socykgICAgKCgocykgJiAweDIwMDApICE9IDApCiAKLSNkZWZpbmUgRkRfQ1JDKHMpICAgKChzJjB4MDgwMCkhPTApCi0jZGVmaW5lIEZEX0FsaWduKHMpICgocyYweDA0MDApIT0wKQotI2RlZmluZSBGRF9SZXNyYyhzKSAoKHMmMHgwMjAwKSE9MCkKLSNkZWZpbmUgRkRfRE1BKHMpICAgKChzJjB4MDEwMCkhPTApCi0jZGVmaW5lIEZEX1Nob3J0KHMpICgocyYweDAwODApIT0wKQotI2RlZmluZSBGRF9Ob0VPRihzKSAoKHMmMHgwMDQwKSE9MCkKKyNkZWZpbmUgRkRfQ1JDKHMpICAgKCgocykgJiAweDA4MDApICE9IDApCisjZGVmaW5lIEZEX0FsaWduKHMpICgoKHMpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBGRF9SZXNyYyhzKSAoKChzKSAmIDB4MDIwMCkgIT0gMCkKKyNkZWZpbmUgRkRfRE1BKHMpICAgKCgocykgJiAweDAxMDApICE9IDApCisjZGVmaW5lIEZEX1Nob3J0KHMpICgoKHMpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBGRF9Ob0VPRihzKSAoKChzKSAmIDB4MDA0MCkgIT0gMCkKIAogc3RydWN0IHJmZF9oZWFkZXIgewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IGEwZWUwNTMuLjAwNGE5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0yMiw5ICsyMiw1MyBAQAogI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9pcmRhLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtdWFydC5oPgorCisjZGVmaW5lIEZJQ1AJCV9fUkVHKDB4NDA4MDAwMDApICAvKiBTdGFydCBvZiBGSUNQIGFyZWEgKi8KKyNkZWZpbmUgSUNDUjAJCV9fUkVHKDB4NDA4MDAwMDApICAvKiBJQ1AgQ29udHJvbCBSZWdpc3RlciAwICovCisjZGVmaW5lIElDQ1IxCQlfX1JFRygweDQwODAwMDA0KSAgLyogSUNQIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBJQ0NSMgkJX19SRUcoMHg0MDgwMDAwOCkgIC8qIElDUCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgSUNEUgkJX19SRUcoMHg0MDgwMDAwYykgIC8qIElDUCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIElDU1IwCQlfX1JFRygweDQwODAwMDE0KSAgLyogSUNQIFN0YXR1cyBSZWdpc3RlciAwICovCisjZGVmaW5lIElDU1IxCQlfX1JFRygweDQwODAwMDE4KSAgLyogSUNQIFN0YXR1cyBSZWdpc3RlciAxICovCisKKyNkZWZpbmUgSUNDUjBfQU1FCSgxIDw8IDcpCS8qIEFkZHJlc3MgbWF0Y2ggZW5hYmxlICovCisjZGVmaW5lIElDQ1IwX1RJRQkoMSA8PCA2KQkvKiBUcmFuc21pdCBGSUZPIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUNDUjBfUklFCSgxIDw8IDUpCS8qIFJlY2lldmUgRklGTyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElDQ1IwX1JYRQkoMSA8PCA0KQkvKiBSZWNlaXZlIGVuYWJsZSAqLworI2RlZmluZSBJQ0NSMF9UWEUJKDEgPDwgMykJLyogVHJhbnNtaXQgZW5hYmxlICovCisjZGVmaW5lIElDQ1IwX1RVUwkoMSA8PCAyKQkvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuIHNlbGVjdCAqLworI2RlZmluZSBJQ0NSMF9MQk0JKDEgPDwgMSkJLyogTG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBJQ0NSMF9JVFIJKDEgPDwgMCkJLyogSXJEQSB0cmFuc21pc3Npb24gKi8KKworI2RlZmluZSBJQ0NSMl9SWFAgICAgICAgKDEgPDwgMykJLyogUmVjZWl2ZSBQaW4gUG9sYXJpdHkgc2VsZWN0ICovCisjZGVmaW5lIElDQ1IyX1RYUCAgICAgICAoMSA8PCAyKQkvKiBUcmFuc21pdCBQaW4gUG9sYXJpdHkgc2VsZWN0ICovCisjZGVmaW5lIElDQ1IyX1RSSUcJKDMgPDwgMCkJLyogUmVjZWl2ZSBGSUZPIFRyaWdnZXIgdGhyZXNob2xkICovCisjZGVmaW5lIElDQ1IyX1RSSUdfOCAgICAoMCA8PCAwKQkvKiAJPj0gOCBieXRlcyAqLworI2RlZmluZSBJQ0NSMl9UUklHXzE2ICAgKDEgPDwgMCkJLyoJPj0gMTYgYnl0ZXMgKi8KKyNkZWZpbmUgSUNDUjJfVFJJR18zMiAgICgyIDw8IDApCS8qCT49IDMyIGJ5dGVzICovCisKKyNpZmRlZiBDT05GSUdfUFhBMjd4CisjZGVmaW5lIElDU1IwX0VPQwkoMSA8PCA2KQkvKiBETUEgRW5kIG9mIERlc2NyaXB0b3IgQ2hhaW4gKi8KKyNlbmRpZgorI2RlZmluZSBJQ1NSMF9GUkUJKDEgPDwgNSkJLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBJQ1NSMF9SRlMJKDEgPDwgNCkJLyogUmVjZWl2ZSBGSUZPIHNlcnZpY2UgcmVxdWVzdCAqLworI2RlZmluZSBJQ1NSMF9URlMJKDEgPDwgMykJLyogVHJhbnNuaXQgRklGTyBzZXJ2aWNlIHJlcXVlc3QgKi8KKyNkZWZpbmUgSUNTUjBfUkFCCSgxIDw8IDIpCS8qIFJlY2VpdmVyIGFib3J0ICovCisjZGVmaW5lIElDU1IwX1RVUgkoMSA8PCAxKQkvKiBUcnVuc21pdCBGSUZPIHVuZGVydW4gKi8KKyNkZWZpbmUgSUNTUjBfRUlGCSgxIDw8IDApCS8qIEVuZC9FcnJvciBpbiBGSUZPICovCisKKyNkZWZpbmUgSUNTUjFfUk9SCSgxIDw8IDYpCS8qIFJlY2VpdmVyIEZJRk8gdW5kZXJydW4gICovCisjZGVmaW5lIElDU1IxX0NSRQkoMSA8PCA1KQkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgSUNTUjFfRU9GCSgxIDw8IDQpCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBJQ1NSMV9UTkYJKDEgPDwgMykJLyogVHJhbnNtaXQgRklGTyBub3QgZnVsbCAqLworI2RlZmluZSBJQ1NSMV9STkUJKDEgPDwgMikJLyogUmVjZWl2ZSBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZSBJQ1NSMV9UQlkJKDEgPDwgMSkJLyogVHJhbXNtaXRlciBidXN5IGZsYWcgKi8KKyNkZWZpbmUgSUNTUjFfUlNZCSgxIDw8IDApCS8qIFJlY2V2aWVyIHN5bmNocm9uaXplZCBmbGFnICovCiAKICNkZWZpbmUgSXJTUl9SWFBMX05FR19JU19aRVJPICgxPDw0KQogI2RlZmluZSBJclNSX1JYUExfUE9TX0lTX1pFUk8gMHgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwppbmRleCBjY2RlNTgyOS4uZDMwMmJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJkYS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX21haW4uYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbWFpbi5jCmluZGV4IGMxYzA1ODUyLi5lZGE3MmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX21haW4uYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2VuX21haW4uYwpAQCAtMTY5LDEzICsxNjksMTAgQEAKIAltbHg0X2ZvcmVhY2hfcG9ydChpLCBkZXYsIE1MWDRfUE9SVF9UWVBFX0VUSCkgewogCQltbHg0X2luZm8obWRldiwgIlVzaW5nICVkIHR4IHJpbmdzIGZvciBwb3J0OiVkXG4iLAogCQkJICBtZGV2LT5wcm9maWxlLnByb2ZbaV0udHhfcmluZ19udW0sIGkpOwotCQlpZiAoIW1kZXYtPnByb2ZpbGUucHJvZltpXS5yeF9yaW5nX251bSkgewotCQkJbWRldi0+cHJvZmlsZS5wcm9mW2ldLnJ4X3JpbmdfbnVtID0gZGV2LT5jYXBzLm51bV9jb21wX3ZlY3RvcnM7Ci0JCQltbHg0X2luZm8obWRldiwgIkRlZmF1bHRpbmcgdG8gJWQgcnggcmluZ3MgZm9yIHBvcnQ6JWRcbiIsCi0JCQkJICBtZGV2LT5wcm9maWxlLnByb2ZbaV0ucnhfcmluZ19udW0sIGkpOwotCQl9IGVsc2UKLQkJCW1seDRfaW5mbyhtZGV2LCAiVXNpbmcgJWQgcnggcmluZ3MgZm9yIHBvcnQ6JWRcbiIsCi0JCQkJICBtZGV2LT5wcm9maWxlLnByb2ZbaV0ucnhfcmluZ19udW0sIGkpOworCQltZGV2LT5wcm9maWxlLnByb2ZbaV0ucnhfcmluZ19udW0gPQorCQkJbWluX3QoaW50LCBkZXYtPmNhcHMubnVtX2NvbXBfdmVjdG9ycywgTUFYX1JYX1JJTkdTKTsKKwkJbWx4NF9pbmZvKG1kZXYsICJEZWZhdWx0aW5nIHRvICVkIHJ4IHJpbmdzIGZvciBwb3J0OiVkXG4iLAorCQkJICBtZGV2LT5wcm9maWxlLnByb2ZbaV0ucnhfcmluZ19udW0sIGkpOwogCX0KIAogCS8qIENyZWF0ZSBvdXIgb3duIHdvcmtxdWV1ZSBmb3IgcmVzZXQvbXVsdGljYXN0IHRhc2tzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9uZXRkZXYuYwppbmRleCBlYmFkYTNjLi4xNWJiMzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbmV0ZGV2LmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgbWx4NF9lbl9zdGFydF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgbWx4NF9lbl9zdGFydF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKQEAgLTcwNyw3ICs3MDcsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIG1seDRfZW5fc3RvcF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIG1seDRfZW5fc3RvcF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKQEAgLTgyNiw3ICs4MjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtbHg0X2VuX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYpCit2b2lkIG1seDRfZW5fZnJlZV9yZXNvdXJjZXMoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdikKIHsKIAlpbnQgaTsKIApAQCAtODQ1LDcgKzg0NSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1seDRfZW5fYWxsb2NfcmVzb3VyY2VzKHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYpCitpbnQgbWx4NF9lbl9hbGxvY19yZXNvdXJjZXMoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwogCXN0cnVjdCBtbHg0X2VuX3BvcnRfcHJvZmlsZSAqcHJvZiA9IHByaXYtPnByb2Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9wYXJhbXMuYwppbmRleCAwNDdiMzdmLi5jZmVlZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcGFyYW1zLmMKQEAgLTY1LDE1ICs2NSw2IEBACiBNTFg0X0VOX1BBUk1fSU5UKHBmY3J4LCAwLCAiUHJpb3JpdHkgYmFzZWQgRmxvdyBDb250cm9sIHBvbGljeSBvbiBSWFs3OjBdLiIKIAkJCSAgICIgUGVyIHByaW9yaXR5IGJpdCBtYXNrIik7CiAKLU1MWDRfRU5fUEFSTV9JTlQocnhfcmluZ19udW0xLCAwLCAiTnVtYmVyIG9yIFJ4IHJpbmdzIGZvciBwb3J0IDEgKDAgPSAjY29yZXMpIik7Ci1NTFg0X0VOX1BBUk1fSU5UKHJ4X3JpbmdfbnVtMiwgMCwgIk51bWJlciBvciBSeCByaW5ncyBmb3IgcG9ydCAyICgwID0gI2NvcmVzKSIpOwotCi1NTFg0X0VOX1BBUk1fSU5UKHR4X3Jpbmdfc2l6ZTEsIE1MWDRfRU5fQVVUT19DT05GLCAiVHggcmluZyBzaXplIGZvciBwb3J0IDEiKTsKLU1MWDRfRU5fUEFSTV9JTlQodHhfcmluZ19zaXplMiwgTUxYNF9FTl9BVVRPX0NPTkYsICJUeCByaW5nIHNpemUgZm9yIHBvcnQgMiIpOwotTUxYNF9FTl9QQVJNX0lOVChyeF9yaW5nX3NpemUxLCBNTFg0X0VOX0FVVE9fQ09ORiwgIlJ4IHJpbmcgc2l6ZSBmb3IgcG9ydCAxIik7Ci1NTFg0X0VOX1BBUk1fSU5UKHJ4X3Jpbmdfc2l6ZTIsIE1MWDRfRU5fQVVUT19DT05GLCAiUnggcmluZyBzaXplIGZvciBwb3J0IDIiKTsKLQotCiBpbnQgbWx4NF9lbl9nZXRfcHJvZmlsZShzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJvZmlsZSAqcGFyYW1zID0gJm1kZXYtPnByb2ZpbGU7CkBAIC04Nyw2ICs3OCw4IEBACiAJCXBhcmFtcy0+cHJvZltpXS5yeF9wcHAgPSBwZmNyeDsKIAkJcGFyYW1zLT5wcm9mW2ldLnR4X3BhdXNlID0gMTsKIAkJcGFyYW1zLT5wcm9mW2ldLnR4X3BwcCA9IHBmY3R4OworCQlwYXJhbXMtPnByb2ZbaV0udHhfcmluZ19zaXplID0gTUxYNF9FTl9ERUZfVFhfUklOR19TSVpFOworCQlwYXJhbXMtPnByb2ZbaV0ucnhfcmluZ19zaXplID0gTUxYNF9FTl9ERUZfUlhfUklOR19TSVpFOwogCX0KIAlpZiAocGZjcnggfHwgcGZjdHgpIHsKIAkJcGFyYW1zLT5wcm9mWzFdLnR4X3JpbmdfbnVtID0gTUxYNF9FTl9UWF9SSU5HX05VTTsKQEAgLTk1LDMyICs4OCw3IEBACiAJCXBhcmFtcy0+cHJvZlsxXS50eF9yaW5nX251bSA9IDE7CiAJCXBhcmFtcy0+cHJvZlsyXS50eF9yaW5nX251bSA9IDE7CiAJfQotCXBhcmFtcy0+cHJvZlsxXS5yeF9yaW5nX251bSA9IG1pbl90KGludCwgcnhfcmluZ19udW0xLCBNQVhfUlhfUklOR1MpOwotCXBhcmFtcy0+cHJvZlsyXS5yeF9yaW5nX251bSA9IG1pbl90KGludCwgcnhfcmluZ19udW0yLCBNQVhfUlhfUklOR1MpOwogCi0JaWYgKHR4X3Jpbmdfc2l6ZTEgPT0gTUxYNF9FTl9BVVRPX0NPTkYpCi0JCXR4X3Jpbmdfc2l6ZTEgPSBNTFg0X0VOX0RFRl9UWF9SSU5HX1NJWkU7Ci0JcGFyYW1zLT5wcm9mWzFdLnR4X3Jpbmdfc2l6ZSA9Ci0JCSh0eF9yaW5nX3NpemUxIDwgTUxYNF9FTl9NSU5fVFhfU0laRSkgPwotCQkgTUxYNF9FTl9NSU5fVFhfU0laRSA6IHJvdW5kdXBfcG93X29mX3R3byh0eF9yaW5nX3NpemUxKTsKLQotCWlmICh0eF9yaW5nX3NpemUyID09IE1MWDRfRU5fQVVUT19DT05GKQotCQl0eF9yaW5nX3NpemUyID0gTUxYNF9FTl9ERUZfVFhfUklOR19TSVpFOwotCXBhcmFtcy0+cHJvZlsyXS50eF9yaW5nX3NpemUgPQotCQkodHhfcmluZ19zaXplMiA8IE1MWDRfRU5fTUlOX1RYX1NJWkUpID8KLQkJIE1MWDRfRU5fTUlOX1RYX1NJWkUgOiByb3VuZHVwX3Bvd19vZl90d28odHhfcmluZ19zaXplMik7Ci0KLQlpZiAocnhfcmluZ19zaXplMSA9PSBNTFg0X0VOX0FVVE9fQ09ORikKLQkJcnhfcmluZ19zaXplMSA9IE1MWDRfRU5fREVGX1JYX1JJTkdfU0laRTsKLQlwYXJhbXMtPnByb2ZbMV0ucnhfcmluZ19zaXplID0KLQkJKHJ4X3Jpbmdfc2l6ZTEgPCBNTFg0X0VOX01JTl9SWF9TSVpFKSA/Ci0JCSBNTFg0X0VOX01JTl9SWF9TSVpFIDogcm91bmR1cF9wb3dfb2ZfdHdvKHJ4X3Jpbmdfc2l6ZTEpOwotCi0JaWYgKHJ4X3Jpbmdfc2l6ZTIgPT0gTUxYNF9FTl9BVVRPX0NPTkYpCi0JCXJ4X3Jpbmdfc2l6ZTIgPSBNTFg0X0VOX0RFRl9SWF9SSU5HX1NJWkU7Ci0JcGFyYW1zLT5wcm9mWzJdLnJ4X3Jpbmdfc2l6ZSA9Ci0JCShyeF9yaW5nX3NpemUyIDwgTUxYNF9FTl9NSU5fUlhfU0laRSkgPwotCQkgTUxYNF9FTl9NSU5fUlhfU0laRSA6IHJvdW5kdXBfcG93X29mX3R3byhyeF9yaW5nX3NpemUyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDE3LDYgKzM4NSw1NCBAQAogCXBhdXNlLT5yeF9wYXVzZSA9IHByaXYtPnByb2YtPnJ4X3BhdXNlOwogfQogCitzdGF0aWMgaW50IG1seDRfZW5fc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnBhcmFtKQoreworCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CisJdTMyIHJ4X3NpemUsIHR4X3NpemU7CisJaW50IHBvcnRfdXAgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHBhcmFtLT5yeF9qdW1ib19wZW5kaW5nIHx8IHBhcmFtLT5yeF9taW5pX3BlbmRpbmcpCisJCXJldHVybiAtRUlOVkFMOworCisJcnhfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhwYXJhbS0+cnhfcGVuZGluZyk7CisJcnhfc2l6ZSA9IG1heF90KHUzMiwgcnhfc2l6ZSwgTUxYNF9FTl9NSU5fUlhfU0laRSk7CisJdHhfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhwYXJhbS0+dHhfcGVuZGluZyk7CisJdHhfc2l6ZSA9IG1heF90KHUzMiwgdHhfc2l6ZSwgTUxYNF9FTl9NSU5fVFhfU0laRSk7CisKKwlpZiAocnhfc2l6ZSA9PSBwcml2LT5wcm9mLT5yeF9yaW5nX3NpemUgJiYKKwkgICAgdHhfc2l6ZSA9PSBwcml2LT5wcm9mLT50eF9yaW5nX3NpemUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmbWRldi0+c3RhdGVfbG9jayk7CisJaWYgKHByaXYtPnBvcnRfdXApIHsKKwkJcG9ydF91cCA9IDE7CisJCW1seDRfZW5fc3RvcF9wb3J0KGRldik7CisJfQorCisJbWx4NF9lbl9mcmVlX3Jlc291cmNlcyhwcml2KTsKKworCXByaXYtPnByb2YtPnR4X3Jpbmdfc2l6ZSA9IHR4X3NpemU7CisJcHJpdi0+cHJvZi0+cnhfcmluZ19zaXplID0gcnhfc2l6ZTsKKworCWVyciA9IG1seDRfZW5fYWxsb2NfcmVzb3VyY2VzKHByaXYpOworCWlmIChlcnIpIHsKKwkJbWx4NF9lcnIobWRldiwgIkZhaWxlZCByZWFsbG9jYXRpbmcgcG9ydCByZXNvdXJjZXNcbiIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHBvcnRfdXApIHsKKwkJZXJyID0gbWx4NF9lbl9zdGFydF9wb3J0KGRldik7CisJCWlmIChlcnIpCisJCQltbHg0X2VycihtZGV2LCAiRmFpbGVkIHN0YXJ0aW5nIHBvcnRcbiIpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmbWRldi0+c3RhdGVfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgbWx4NF9lbl9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnBhcmFtKQogewpAQCAtNDU2LDYgKzQ3Miw3IEBACiAJLmdldF9wYXVzZXBhcmFtID0gbWx4NF9lbl9nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0gPSBtbHg0X2VuX3NldF9wYXVzZXBhcmFtLAogCS5nZXRfcmluZ3BhcmFtID0gbWx4NF9lbl9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtID0gbWx4NF9lbl9zZXRfcmluZ3BhcmFtLAogCS5nZXRfZmxhZ3MgPSBldGh0b29sX29wX2dldF9mbGFncywKIAkuc2V0X2ZsYWdzID0gZXRodG9vbF9vcF9zZXRfZmxhZ3MsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmggYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAppbmRleCBlNzgyMDk3Li4yZTk2YzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaApAQCAtNDg5LDYgKzQ4OSwxMiBAQAogaW50IG1seDRfZW5faW5pdF9uZXRkZXYoc3RydWN0IG1seDRfZW5fZGV2ICptZGV2LCBpbnQgcG9ydCwKIAkJCXN0cnVjdCBtbHg0X2VuX3BvcnRfcHJvZmlsZSAqcHJvZik7CiAKK2ludCBtbHg0X2VuX3N0YXJ0X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIG1seDRfZW5fc3RvcF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIG1seDRfZW5fZnJlZV9yZXNvdXJjZXMoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdik7CitpbnQgbWx4NF9lbl9hbGxvY19yZXNvdXJjZXMoc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdik7CisKIGludCBtbHg0X2VuX2dldF9wcm9maWxlKHN0cnVjdCBtbHg0X2VuX2RldiAqbWRldik7CiAKIGludCBtbHg0X2VuX2NyZWF0ZV9jcShzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2LCBzdHJ1Y3QgbWx4NF9lbl9jcSAqY3EsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMgYi9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMKaW5kZXggZGNkMTk5MC4uNWI3YTU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYwpAQCAtOTU0LDcgKzk1NCw2IEBACiB7CiAJY29uc3Qgc3RydWN0IHBhc2VtaV9tYWNfcnhyaW5nICpyeHJpbmcgPSBkYXRhOwogCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSByeHJpbmctPm1hYzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWFjLT5uZXRkZXY7CiAJY29uc3Qgc3RydWN0IHBhc2VtaV9kbWFjaGFuICpjaGFuID0gJnJ4cmluZy0+Y2hhbjsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCkBAIC0xNjM0LDcgKzE2MzMsNiBAQAogc3RhdGljIGludCBwYXNlbWlfbWFjX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHBhc2VtaV9tYWMsIG5hcGkpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtYWMtPm5ldGRldjsKIAlpbnQgcGt0czsKIAogCXBhc2VtaV9tYWNfY2xlYW5fdHgodHhfcmluZyhtYWMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxMXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxMXguaAppbmRleCBjYzdkODViLi44NzBiNGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MTF4LmgKKysrIGIvZHJpdmVycy9uZXQvc21jOTExeC5oCkBAIC0yMDAsNiArMjAwLDkgQEAKIAogCiAjaWZkZWYgU01DX1VTRV9QWEFfRE1BCisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorCiAvKgogICogRGVmaW5lIHRoZSByZXF1ZXN0IGFuZCBmcmVlIGZ1bmN0aW9ucwogICogVGhlc2UgYXJlIHVuZm9ydHVuYXRlbHkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGFzIG5vIGdlbmVyaWMgYWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmggYi9kcml2ZXJzL25ldC9zbWM5MXguaAppbmRleCAzZTdjNmEzLi5jNGNjZDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtNDkzLDcgKzQ5Myw4IEBACiAgKiBhcyBSWCB3aGljaCBjYW4gb3ZlcnJ1biBtZW1vcnkgYW5kIGxvc2UgcGFja2V0cy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KIAogI2lmZGVmIFNNQ19pbnNsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jIGIvZHJpdmVycy9uZXQvc21zYzkxMXguYwppbmRleCA1ZTk4OWQ4Li5kYzNmMTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMKQEAgLTE0ODQsMTMgKzE0ODQsMTMgQEAKIAl9CiAKIAlpZiAobGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SU0ZMXykpIHsKLQkJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldiwgJnBkYXRhLT5uYXBpKSkpIHsKKwkJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKCZwZGF0YS0+bmFwaSkpKSB7CiAJCQkvKiBEaXNhYmxlIFJ4IGludGVycnVwdHMgKi8KIAkJCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKIAkJCXRlbXAgJj0gKH5JTlRfRU5fUlNGTF9FTl8pOwogCQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOwogCQkJLyogU2NoZWR1bGUgYSBOQVBJIHBvbGwgKi8KLQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2LCAmcGRhdGEtPm5hcGkpOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZSgmcGRhdGEtPm5hcGkpOwogCQl9IGVsc2UgewogCQkJU01TQ19XQVJOSU5HKFJYX0VSUiwKIAkJCQkibmV0aWZfcnhfc2NoZWR1bGVfcHJlcCBmYWlsZWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwppbmRleCBjNWMxMjNkLi44OGQyYzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC0xMjc3LDcgKzEyNzcsNiBAQAogc3RhdGljIGludCBzcGlkZXJfbmV0X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHNwaWRlcl9uZXRfY2FyZCwgbmFwaSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNhcmQtPm5ldGRldjsKIAlpbnQgcGFja2V0c19kb25lID0gMDsKIAogCXdoaWxlIChwYWNrZXRzX2RvbmUgPCBidWRnZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggNjY2YzFkOS4uNjlmOWEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgVFVOX1RBUF9ERVY6Ci0JCWRldi0+bmV0ZGV2X29wcyA9ICZ0dW5fbmV0ZGV2X29wczsKKwkJZGV2LT5uZXRkZXZfb3BzID0gJnRhcF9uZXRkZXZfb3BzOwogCQkvKiBFdGhlcm5ldCBUQVAgRGV2aWNlICovCiAJCWV0aGVyX3NldHVwKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwppbmRleCAxOThjZTNjLi45Zjc4OTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaHNvLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCkBAIC0yODMxLDcgKzI4MzEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJZW5kcCA9ICZpZmFjZS0+ZW5kcG9pbnRbaV0uZGVzYzsKIAkJaWYgKCgoZW5kcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gZGlyKSAmJgotCQkgICAgKChlbmRwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gdHlwZSkpCisJCSAgICAodXNiX2VuZHBvaW50X3R5cGUoZW5kcCkgPT0gdHlwZSkpCiAJCQlyZXR1cm4gZW5kcDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9peHA0eHhfaHNzLmMgYi9kcml2ZXJzL25ldC93YW4vaXhwNHh4X2hzcy5jCmluZGV4IDBjNjgwMjUuLjJkYzI0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9peHA0eHhfaHNzLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2l4cDR4eF9oc3MuYwpAQCAtNjU0LDcgKzY1NCw3IEBACiAJCQluZXRpZl9yeF9jb21wbGV0ZShkZXYsIG5hcGkpOwogCQkJcW1ncl9lbmFibGVfaXJxKHJ4cSk7CiAJCQlpZiAoIXFtZ3Jfc3RhdF9lbXB0eShyeHEpICYmCi0JCQkgICAgbmV0aWZfcnhfcmVzY2hlZHVsZShkZXYsIG5hcGkpKSB7CisJCQkgICAgbmV0aWZfcnhfcmVzY2hlZHVsZShuYXBpKSkgewogI2lmIERFQlVHX1JYCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoc3NfaGRsY19wb2xsIgogCQkJCSAgICAgICAiIG5ldGlmX3J4X3Jlc2NoZWR1bGUgc3VjY2VlZGVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCAwNGMxMzk2Li5iNWRiNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtMTA2NSw4ICsxMDY1LDcgQEAKIAkvKiBGaW5kIGJ1bGsgb3V0IGVuZHBvaW50ICovCiAJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbMV0uZGVzYzsKIAlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX0RJUl9PVVQgJiYKLQkgICAgKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkgICAgVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCSAgICB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVuZHBvaW50KSkgewogCQlidWxrX291dF9lcCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCX0gZWxzZSB7CiAJCWRldl9lcnIoJnVkZXYtPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwppbmRleCBiNTVjZDIzLi43MzdiZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCkBAIC0yNjgsMTggKzI2OCw2IEBACiAJcmV0dXJuIGNvb2tpZTsKIH0KIAotc3RhdGljIHZvaWQgaW5jcmVtZW50X3RhaWwoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIpCi17Ci0JdW5zaWduZWQgbG9uZyBuZXdfdGFpbCA9IGItPnRhaWxfcG9zICsgMTsKLQotCXJtYigpOwkvKiBiZSBzdXJlIGZpZm8gcG9pbnRlcnMgYXJlIHN5bmNocm9taXplZCAqLwotCi0JaWYgKG5ld190YWlsIDwgYi0+YnVmZmVyX3NpemUpCi0JCWItPnRhaWxfcG9zID0gbmV3X3RhaWw7Ci0JZWxzZQotCQliLT50YWlsX3BvcyA9IDA7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfY29va2llID0gSU5WQUxJRF9DT09LSUU7CiAKIHN0YXRpYyB2b2lkIGFkZF9jcHVfc3dpdGNoKGludCBpKQpAQCAtMzMxLDI4ICszMTksMjUgQEAKIAogI2RlZmluZSBJQlNfRkVUQ0hfQ09ERV9TSVpFCTIKICNkZWZpbmUgSUJTX09QX0NPREVfU0laRQk1Ci0jZGVmaW5lIElCU19FSVAob2Zmc2V0KQkJCQlcCi0JKCgoc3RydWN0IG9wX3NhbXBsZSAqKSZjcHVfYnVmLT5idWZmZXJbKG9mZnNldCldKS0+ZWlwKQotI2RlZmluZSBJQlNfRVZFTlQob2Zmc2V0KQkJCQlcCi0JKCgoc3RydWN0IG9wX3NhbXBsZSAqKSZjcHVfYnVmLT5idWZmZXJbKG9mZnNldCldKS0+ZXZlbnQpCiAKIC8qCiAgKiBBZGQgSUJTIGZldGNoIGFuZCBvcCBlbnRyaWVzIHRvIGV2ZW50IGJ1ZmZlcgogICovCi1zdGF0aWMgdm9pZCBhZGRfaWJzX2JlZ2luKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmLCBpbnQgY29kZSwKLQkJCSAgc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdGF0aWMgdm9pZCBhZGRfaWJzX2JlZ2luKGludCBjcHUsIGludCBjb2RlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAl1bnNpZ25lZCBsb25nIHJpcDsKIAlpbnQgaSwgY291bnQ7CiAJdW5zaWduZWQgbG9uZyBpYnNfY29va2llID0gMDsKIAlvZmZfdCBvZmZzZXQ7CisJc3RydWN0IG9wX3NhbXBsZSAqc2FtcGxlOwogCi0JaW5jcmVtZW50X3RhaWwoY3B1X2J1Zik7CS8qIG1vdmUgdG8gUklQIGVudHJ5ICovCi0KLQlyaXAgPSBJQlNfRUlQKGNwdV9idWYtPnRhaWxfcG9zKTsKKwlzYW1wbGUgPSBjcHVfYnVmZmVyX3JlYWRfZW50cnkoY3B1KTsKKwlpZiAoIXNhbXBsZSkKKwkJZ290byBFcnJvcjsKKwlyaXAgPSBzYW1wbGUtPmVpcDsKIAogI2lmZGVmIF9fTFA2NF9fCi0JcmlwICs9IElCU19FVkVOVChjcHVfYnVmLT50YWlsX3BvcykgPDwgMzI7CisJcmlwICs9IHNhbXBsZS0+ZXZlbnQgPDwgMzI7CiAjZW5kaWYKIAogCWlmIChtbSkgewpAQCAtMzc2LDggKzM2MSw4IEBACiAJYWRkX2V2ZW50X2VudHJ5KG9mZnNldCk7CS8qIE9mZnNldCBmcm9tIERjb29raWUgKi8KIAogCS8qIHdlIHNlbmQgdGhlIERjb29raWUgb2Zmc2V0LCBidXQgc2VuZCB0aGUgcmF3IExpbmVhciBBZGQgYWxzbyovCi0JYWRkX2V2ZW50X2VudHJ5KElCU19FSVAoY3B1X2J1Zi0+dGFpbF9wb3MpKTsKLQlhZGRfZXZlbnRfZW50cnkoSUJTX0VWRU5UKGNwdV9idWYtPnRhaWxfcG9zKSk7CisJYWRkX2V2ZW50X2VudHJ5KHNhbXBsZS0+ZWlwKTsKKwlhZGRfZXZlbnRfZW50cnkoc2FtcGxlLT5ldmVudCk7CiAKIAlpZiAoY29kZSA9PSBJQlNfRkVUQ0hfQ09ERSkKIAkJY291bnQgPSBJQlNfRkVUQ0hfQ09ERV9TSVpFOwkvKklCUyBGRVRDSCBpcyAyIGludDY0cyovCkBAIC0zODUsMTAgKzM3MCwxNyBAQAogCQljb3VudCA9IElCU19PUF9DT0RFX1NJWkU7CS8qSUJTIE9QIGlzIDUgaW50NjRzKi8KIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWluY3JlbWVudF90YWlsKGNwdV9idWYpOwotCQlhZGRfZXZlbnRfZW50cnkoSUJTX0VJUChjcHVfYnVmLT50YWlsX3BvcykpOwotCQlhZGRfZXZlbnRfZW50cnkoSUJTX0VWRU5UKGNwdV9idWYtPnRhaWxfcG9zKSk7CisJCXNhbXBsZSA9IGNwdV9idWZmZXJfcmVhZF9lbnRyeShjcHUpOworCQlpZiAoIXNhbXBsZSkKKwkJCWdvdG8gRXJyb3I7CisJCWFkZF9ldmVudF9lbnRyeShzYW1wbGUtPmVpcCk7CisJCWFkZF9ldmVudF9lbnRyeShzYW1wbGUtPmV2ZW50KTsKIAl9CisKKwlyZXR1cm47CisKK0Vycm9yOgorCXJldHVybjsKIH0KIAogI2VuZGlmCkBAIC00NjYsMzMgKzQ1OCw2IEBACiB9CiAKIAotLyogImFjcXVpcmUiIGFzIG1hbnkgY3B1IGJ1ZmZlciBzbG90cyBhcyB3ZSBjYW4gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9zbG90cyhzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqYikKLXsKLQl1bnNpZ25lZCBsb25nIGhlYWQgPSBiLT5oZWFkX3BvczsKLQl1bnNpZ25lZCBsb25nIHRhaWwgPSBiLT50YWlsX3BvczsKLQotCS8qCi0JICogU3VidGxlLiBUaGlzIHJlc2V0cyB0aGUgcGVyc2lzdGVudCBsYXN0X3Rhc2sKLQkgKiBhbmQgaW5fa2VybmVsIHZhbHVlcyB1c2VkIGZvciBzd2l0Y2hpbmcgbm90ZXMuCi0JICogQlVULCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBiZXR3ZWVuIHJlYWRpbmcKLQkgKiBoZWFkX3BvcywgYW5kIHRoaXMgY2FsbCwgdGhhdCBtZWFucyBzYW1wbGVzCi0JICogY2FuIGFwcGVhciBhdCB0aGUgbmV3IGhlYWQgcG9zaXRpb24sIGJ1dCBub3QKLQkgKiBiZSBwcmVmaXhlZCB3aXRoIHRoZSBub3RlcyBmb3Igc3dpdGNoaW5nCi0JICoga2VybmVsIG1vZGUgb3IgYSB0YXNrIHN3aXRjaC4gVGhpcyBzbWFsbCBob2xlCi0JICogY2FuIGxlYWQgdG8gbWlzLWF0dHJpYnV0aW9uIG9yIHNhbXBsZXMgd2hlcmUKLQkgKiB3ZSBkb24ndCBrbm93IGlmIGl0J3MgaW4gdGhlIGtlcm5lbCBvciBub3QsCi0JICogYXQgdGhlIHN0YXJ0IG9mIGFuIGV2ZW50IGJ1ZmZlci4KLQkgKi8KLQljcHVfYnVmZmVyX3Jlc2V0KGIpOwotCi0JaWYgKGhlYWQgPj0gdGFpbCkKLQkJcmV0dXJuIGhlYWQgLSB0YWlsOwotCi0JcmV0dXJuIGhlYWQgKyAoYi0+YnVmZmVyX3NpemUgLSB0YWlsKTsKLX0KLQotCiAvKiBNb3ZlIHRhc2tzIGFsb25nIHRvd2FyZHMgZGVhdGguIEFueSB0YXNrcyBvbiBkZWFkX3Rhc2tzCiAgKiB3aWxsIGRlZmluaXRlbHkgaGF2ZSBubyByZW1haW5pbmcgcmVmZXJlbmNlcyBpbiBhbnkKICAqIENQVSBidWZmZXJzIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2Ugd2UgdXNlIHR3byBsaXN0cywKQEAgLTU1OSw2MSArNTI0LDYxIEBACiAgKi8KIHZvaWQgc3luY19idWZmZXIoaW50IGNwdSkKIHsKLQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZwZXJfY3B1KGNwdV9idWZmZXIsIGNwdSk7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3OwogCXVuc2lnbmVkIGxvbmcgY29va2llID0gMDsKIAlpbnQgaW5fa2VybmVsID0gMTsKIAlzeW5jX2J1ZmZlcl9zdGF0ZSBzdGF0ZSA9IHNiX2J1ZmZlcl9zdGFydDsKLSNpZm5kZWYgQ09ORklHX09QUk9GSUxFX0lCUwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlOwotI2VuZGlmCiAKIAltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCiAJYWRkX2NwdV9zd2l0Y2goY3B1KTsKIAotCS8qIFJlbWVtYmVyLCBvbmx5IHdlIGNhbiBtb2RpZnkgdGFpbF9wb3MgKi8KLQotI2lmbmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCi0JYXZhaWxhYmxlID0gZ2V0X3Nsb3RzKGNwdV9idWYpOworCWNwdV9idWZmZXJfcmVzZXQoY3B1KTsKKwlhdmFpbGFibGUgPSBjcHVfYnVmZmVyX2VudHJpZXMoY3B1KTsKIAogCWZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGU7ICsraSkgewotI2Vsc2UKLQl3aGlsZSAoZ2V0X3Nsb3RzKGNwdV9idWYpKSB7Ci0jZW5kaWYKLQkJc3RydWN0IG9wX3NhbXBsZSAqcyA9ICZjcHVfYnVmLT5idWZmZXJbY3B1X2J1Zi0+dGFpbF9wb3NdOworCQlzdHJ1Y3Qgb3Bfc2FtcGxlICpzID0gY3B1X2J1ZmZlcl9yZWFkX2VudHJ5KGNwdSk7CisJCWlmICghcykKKwkJCWJyZWFrOwogCiAJCWlmIChpc19jb2RlKHMtPmVpcCkpIHsKLQkJCWlmIChzLT5ldmVudCA8PSBDUFVfSVNfS0VSTkVMKSB7CisJCQlzd2l0Y2ggKHMtPmV2ZW50KSB7CisJCQljYXNlIDA6CisJCQljYXNlIENQVV9JU19LRVJORUw6CiAJCQkJLyoga2VybmVsL3VzZXJzcGFjZSBzd2l0Y2ggKi8KIAkJCQlpbl9rZXJuZWwgPSBzLT5ldmVudDsKIAkJCQlpZiAoc3RhdGUgPT0gc2JfYnVmZmVyX3N0YXJ0KQogCQkJCQlzdGF0ZSA9IHNiX3NhbXBsZV9zdGFydDsKIAkJCQlhZGRfa2VybmVsX2N0eF9zd2l0Y2gocy0+ZXZlbnQpOwotCQkJfSBlbHNlIGlmIChzLT5ldmVudCA9PSBDUFVfVFJBQ0VfQkVHSU4pIHsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1BVX1RSQUNFX0JFR0lOOgogCQkJCXN0YXRlID0gc2JfYnRfc3RhcnQ7CiAJCQkJYWRkX3RyYWNlX2JlZ2luKCk7CisJCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUwotCQkJfSBlbHNlIGlmIChzLT5ldmVudCA9PSBJQlNfRkVUQ0hfQkVHSU4pIHsKKwkJCWNhc2UgSUJTX0ZFVENIX0JFR0lOOgogCQkJCXN0YXRlID0gc2JfYnRfc3RhcnQ7Ci0JCQkJYWRkX2lic19iZWdpbihjcHVfYnVmLCBJQlNfRkVUQ0hfQ09ERSwgbW0pOwotCQkJfSBlbHNlIGlmIChzLT5ldmVudCA9PSBJQlNfT1BfQkVHSU4pIHsKKwkJCQlhZGRfaWJzX2JlZ2luKGNwdSwgSUJTX0ZFVENIX0NPREUsIG1tKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUJTX09QX0JFR0lOOgogCQkJCXN0YXRlID0gc2JfYnRfc3RhcnQ7Ci0JCQkJYWRkX2lic19iZWdpbihjcHVfYnVmLCBJQlNfT1BfQ09ERSwgbW0pOworCQkJCWFkZF9pYnNfYmVnaW4oY3B1LCBJQlNfT1BfQ09ERSwgbW0pOworCQkJCWJyZWFrOwogI2VuZGlmCi0JCQl9IGVsc2UgewotCQkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tID0gbW07Ci0KKwkJCWRlZmF1bHQ6CiAJCQkJLyogdXNlcnNwYWNlIGNvbnRleHQgc3dpdGNoICovCisJCQkJb2xkbW0gPSBtbTsKIAkJCQluZXcgPSAoc3RydWN0IHRhc2tfc3RydWN0ICopcy0+ZXZlbnQ7Ci0KIAkJCQlyZWxlYXNlX21tKG9sZG1tKTsKIAkJCQltbSA9IHRha2VfdGFza3NfbW0obmV3KTsKIAkJCQlpZiAobW0gIT0gb2xkbW0pCiAJCQkJCWNvb2tpZSA9IGdldF9leGVjX2Rjb29raWUobW0pOwogCQkJCWFkZF91c2VyX2N0eF9zd2l0Y2gobmV3LCBjb29raWUpOworCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgaWYgKHN0YXRlID49IHNiX2J0X3N0YXJ0ICYmCiAJCQkgICAhYWRkX3NhbXBsZShtbSwgcywgaW5fa2VybmVsKSkgewpAQCAtNjIyLDggKzU4Nyw2IEBACiAJCQkJYXRvbWljX2luYygmb3Byb2ZpbGVfc3RhdHMuYnRfbG9zdF9ub19tYXBwaW5nKTsKIAkJCX0KIAkJfQotCi0JCWluY3JlbWVudF90YWlsKGNwdV9idWYpOwogCX0KIAlyZWxlYXNlX21tKG1tKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYwppbmRleCAwMWQzOGU3Li42MTA5MDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYwpAQCAtMjgsNiArMjgsMjUgQEAKICNpbmNsdWRlICJidWZmZXJfc3luYy5oIgogI2luY2x1ZGUgIm9wcm9mLmgiCiAKKyNkZWZpbmUgT1BfQlVGRkVSX0ZMQUdTCTAKKworLyoKKyAqIFJlYWQgYW5kIHdyaXRlIGFjY2VzcyBpcyB1c2luZyBzcGluIGxvY2tpbmcuIFRodXMsIHdyaXRpbmcgdG8gdGhlCisgKiBidWZmZXIgYnkgTk1JIGhhbmRsZXIgKHg4NikgY291bGQgb2NjdXIgYWxzbyBkdXJpbmcgY3JpdGljYWwKKyAqIHNlY3Rpb25zIHdoZW4gcmVhZGluZyB0aGUgYnVmZmVyLiBUbyBhdm9pZCB0aGlzLCB0aGVyZSBhcmUgMgorICogYnVmZmVycyBmb3IgaW5kZXBlbmRlbnQgcmVhZCBhbmQgd3JpdGUgYWNjZXNzLiBSZWFkIGFjY2VzcyBpcyBpbgorICogcHJvY2VzcyBjb250ZXh0IG9ubHksIHdyaXRlIGFjY2VzcyBvbmx5IGluIHRoZSBOTUkgaGFuZGxlci4gSWYgdGhlCisgKiByZWFkIGJ1ZmZlciBydW5zIGVtcHR5LCBib3RoIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgYXRvbWljYWxseS4gVGhlcmUKKyAqIGlzIHBvdGVudGlhbGx5IGEgc21hbGwgd2luZG93IGR1cmluZyBzd2FwcGluZyB3aGVyZSB0aGUgYnVmZmVycyBhcmUKKyAqIGRpc2FibGVkIGFuZCBzYW1wbGVzIGNvdWxkIGJlIGxvc3QuCisgKgorICogVXNpbmcgMiBidWZmZXJzIGlzIGEgbGl0dGxlIGJpdCBvdmVyaGVhZCwgYnV0IHRoZSBzb2x1dGlvbiBpcyBjbGVhcgorICogYW5kIGRvZXMgbm90IHJlcXVpcmUgY2hhbmdlcyBpbiB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24uIEl0CisgKiBjYW4gYmUgY2hhbmdlZCB0byBhIHNpbmdsZSBidWZmZXIgc29sdXRpb24gd2hlbiB0aGUgcmluZyBidWZmZXIKKyAqIGFjY2VzcyBpcyBpbXBsZW1lbnRlZCBhcyBub24tbG9ja2luZyBhdG9taWMgY29kZS4KKyAqLworc3RydWN0IHJpbmdfYnVmZmVyICpvcF9yaW5nX2J1ZmZlcl9yZWFkOworc3RydWN0IHJpbmdfYnVmZmVyICpvcF9yaW5nX2J1ZmZlcl93cml0ZTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyLCBjcHVfYnVmZmVyKTsKIAogc3RhdGljIHZvaWQgd3Ffc3luY19idWZmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTM3LDEyICs1NiwxMiBAQAogCiB2b2lkIGZyZWVfY3B1X2J1ZmZlcnModm9pZCkKIHsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXZmcmVlKHBlcl9jcHUoY3B1X2J1ZmZlciwgaSkuYnVmZmVyKTsKLQkJcGVyX2NwdShjcHVfYnVmZmVyLCBpKS5idWZmZXIgPSBOVUxMOwotCX0KKwlpZiAob3BfcmluZ19idWZmZXJfcmVhZCkKKwkJcmluZ19idWZmZXJfZnJlZShvcF9yaW5nX2J1ZmZlcl9yZWFkKTsKKwlvcF9yaW5nX2J1ZmZlcl9yZWFkID0gTlVMTDsKKwlpZiAob3BfcmluZ19idWZmZXJfd3JpdGUpCisJCXJpbmdfYnVmZmVyX2ZyZWUob3BfcmluZ19idWZmZXJfd3JpdGUpOworCW9wX3JpbmdfYnVmZmVyX3dyaXRlID0gTlVMTDsKIH0KIAogdW5zaWduZWQgbG9uZyBvcHJvZmlsZV9nZXRfY3B1X2J1ZmZlcl9zaXplKHZvaWQpCkBAIC02NCwxNCArODMsMTYgQEAKIAogCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3NpemUgPSBmc19jcHVfYnVmZmVyX3NpemU7CiAKKwlvcF9yaW5nX2J1ZmZlcl9yZWFkID0gcmluZ19idWZmZXJfYWxsb2MoYnVmZmVyX3NpemUsIE9QX0JVRkZFUl9GTEFHUyk7CisJaWYgKCFvcF9yaW5nX2J1ZmZlcl9yZWFkKQorCQlnb3RvIGZhaWw7CisJb3BfcmluZ19idWZmZXJfd3JpdGUgPSByaW5nX2J1ZmZlcl9hbGxvYyhidWZmZXJfc2l6ZSwgT1BfQlVGRkVSX0ZMQUdTKTsKKwlpZiAoIW9wX3JpbmdfYnVmZmVyX3dyaXRlKQorCQlnb3RvIGZhaWw7CisKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqYiA9ICZwZXJfY3B1KGNwdV9idWZmZXIsIGkpOwogCi0JCWItPmJ1ZmZlciA9IHZtYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IG9wX3NhbXBsZSkgKiBidWZmZXJfc2l6ZSwKLQkJCWNwdV90b19ub2RlKGkpKTsKLQkJaWYgKCFiLT5idWZmZXIpCi0JCQlnb3RvIGZhaWw7Ci0KIAkJYi0+bGFzdF90YXNrID0gTlVMTDsKIAkJYi0+bGFzdF9pc19rZXJuZWwgPSAtMTsKIAkJYi0+dHJhY2luZyA9IDA7CkBAIC0xMjQsNTcgKzE0NSwzMSBAQAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiB9CiAKLS8qIFJlc2V0cyB0aGUgY3B1IGJ1ZmZlciB0byBhIHNhbmUgc3RhdGUuICovCi12b2lkIGNwdV9idWZmZXJfcmVzZXQoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYpCi17Ci0JLyogcmVzZXQgdGhlc2UgdG8gaW52YWxpZCB2YWx1ZXM7IHRoZSBuZXh0IHNhbXBsZQotCSAqIGNvbGxlY3RlZCB3aWxsIHBvcHVsYXRlIHRoZSBidWZmZXIgd2l0aCBwcm9wZXIKLQkgKiB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSB0aGUgYnVmZmVyCi0JICovCi0JY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgPSAtMTsKLQljcHVfYnVmLT5sYXN0X3Rhc2sgPSBOVUxMOwotfQotCi0vKiBjb21wdXRlIG51bWJlciBvZiBhdmFpbGFibGUgc2xvdHMgaW4gY3B1X2J1ZmZlciBxdWV1ZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfYXZhaWxhYmxlX3Nsb3RzKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyIGNvbnN0ICpiKQotewotCXVuc2lnbmVkIGxvbmcgaGVhZCA9IGItPmhlYWRfcG9zOwotCXVuc2lnbmVkIGxvbmcgdGFpbCA9IGItPnRhaWxfcG9zOwotCi0JaWYgKHRhaWwgPiBoZWFkKQotCQlyZXR1cm4gKHRhaWwgLSBoZWFkKSAtIDE7Ci0KLQlyZXR1cm4gdGFpbCArIChiLT5idWZmZXJfc2l6ZSAtIGhlYWQpIC0gMTsKLX0KLQotc3RhdGljIHZvaWQgaW5jcmVtZW50X2hlYWQoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIpCi17Ci0JdW5zaWduZWQgbG9uZyBuZXdfaGVhZCA9IGItPmhlYWRfcG9zICsgMTsKLQotCS8qIEVuc3VyZSBhbnl0aGluZyB3cml0dGVuIHRvIHRoZSBzbG90IGJlZm9yZSB3ZQotCSAqIGluY3JlbWVudCBpcyB2aXNpYmxlICovCi0Jd21iKCk7Ci0KLQlpZiAobmV3X2hlYWQgPCBiLT5idWZmZXJfc2l6ZSkKLQkJYi0+aGVhZF9wb3MgPSBuZXdfaGVhZDsKLQllbHNlCi0JCWItPmhlYWRfcG9zID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIGludAogYWRkX3NhbXBsZShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiwKIAkgICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIGV2ZW50KQogewotCXN0cnVjdCBvcF9zYW1wbGUgKmVudHJ5ID0gJmNwdV9idWYtPmJ1ZmZlcltjcHVfYnVmLT5oZWFkX3Bvc107Ci0JZW50cnktPmVpcCA9IHBjOwotCWVudHJ5LT5ldmVudCA9IGV2ZW50OwotCWluY3JlbWVudF9oZWFkKGNwdV9idWYpOworCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1X2J1ZmZlcl93cml0ZV9lbnRyeSgmZW50cnkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllbnRyeS5zYW1wbGUtPmVpcCA9IHBjOworCWVudHJ5LnNhbXBsZS0+ZXZlbnQgPSBldmVudDsKKworCXJldCA9IGNwdV9idWZmZXJfd3JpdGVfY29tbWl0KCZlbnRyeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgaW50CiBhZGRfY29kZShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotCWFkZF9zYW1wbGUoYnVmZmVyLCBFU0NBUEVfQ09ERSwgdmFsdWUpOworCXJldHVybiBhZGRfc2FtcGxlKGJ1ZmZlciwgRVNDQVBFX0NPREUsIHZhbHVlKTsKIH0KIAogLyogVGhpcyBtdXN0IGJlIHNhZmUgZnJvbSBhbnkgY29udGV4dC4gSXQncyBzYWZlIHdyaXRpbmcgaGVyZQpAQCAtMTk4LDExICsxOTMsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobnJfYXZhaWxhYmxlX3Nsb3RzKGNwdV9idWYpIDwgMykgewotCQljcHVfYnVmLT5zYW1wbGVfbG9zdF9vdmVyZmxvdysrOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlpc19rZXJuZWwgPSAhIWlzX2tlcm5lbDsKIAogCXRhc2sgPSBjdXJyZW50OwpAQCAtMjEwLDI2ICsyMDAsMjkgQEAKIAkvKiBub3RpY2UgYSBzd2l0Y2ggZnJvbSB1c2VyLT5rZXJuZWwgb3IgdmljZSB2ZXJzYSAqLwogCWlmIChjcHVfYnVmLT5sYXN0X2lzX2tlcm5lbCAhPSBpc19rZXJuZWwpIHsKIAkJY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgPSBpc19rZXJuZWw7Ci0JCWFkZF9jb2RlKGNwdV9idWYsIGlzX2tlcm5lbCk7CisJCWlmIChhZGRfY29kZShjcHVfYnVmLCBpc19rZXJuZWwpKQorCQkJZ290byBmYWlsOwogCX0KIAogCS8qIG5vdGljZSBhIHRhc2sgc3dpdGNoICovCiAJaWYgKGNwdV9idWYtPmxhc3RfdGFzayAhPSB0YXNrKSB7CiAJCWNwdV9idWYtPmxhc3RfdGFzayA9IHRhc2s7Ci0JCWFkZF9jb2RlKGNwdV9idWYsICh1bnNpZ25lZCBsb25nKXRhc2spOworCQlpZiAoYWRkX2NvZGUoY3B1X2J1ZiwgKHVuc2lnbmVkIGxvbmcpdGFzaykpCisJCQlnb3RvIGZhaWw7CiAJfQogCi0JYWRkX3NhbXBsZShjcHVfYnVmLCBwYywgZXZlbnQpOworCWlmIChhZGRfc2FtcGxlKGNwdV9idWYsIHBjLCBldmVudCkpCisJCWdvdG8gZmFpbDsKKwogCXJldHVybiAxOworCitmYWlsOgorCWNwdV9idWYtPnNhbXBsZV9sb3N0X292ZXJmbG93Kys7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb3Byb2ZpbGVfYmVnaW5fdHJhY2Uoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYpCiB7Ci0JaWYgKG5yX2F2YWlsYWJsZV9zbG90cyhjcHVfYnVmKSA8IDQpIHsKLQkJY3B1X2J1Zi0+c2FtcGxlX2xvc3Rfb3ZlcmZsb3crKzsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJYWRkX2NvZGUoY3B1X2J1ZiwgQ1BVX1RSQUNFX0JFR0lOKTsKIAljcHVfYnVmLT50cmFjaW5nID0gMTsKIAlyZXR1cm4gMTsKQEAgLTI1Myw4ICsyNDYsMTAgQEAKIAlpZiAoIW9wcm9maWxlX2JlZ2luX3RyYWNlKGNwdV9idWYpKQogCQlyZXR1cm47CiAKLQkvKiBpZiBsb2dfc2FtcGxlKCkgZmFpbCB3ZSBjYW4ndCBiYWNrdHJhY2Ugc2luY2Ugd2UgbG9zdCB0aGUgc291cmNlCi0JICogb2YgdGhpcyBldmVudCAqLworCS8qCisJICogaWYgbG9nX3NhbXBsZSgpIGZhaWwgd2UgY2FuJ3QgYmFja3RyYWNlIHNpbmNlIHdlIGxvc3QgdGhlCisJICogc291cmNlIG9mIHRoaXMgZXZlbnQKKwkgKi8KIAlpZiAobG9nX3NhbXBsZShjcHVfYnVmLCBwYywgaXNfa2VybmVsLCBldmVudCkpCiAJCW9wcm9maWxlX29wcy5iYWNrdHJhY2UocmVncywgYmFja3RyYWNlX2RlcHRoKTsKIAlvcHJvZmlsZV9lbmRfdHJhY2UoY3B1X2J1Zik7CkBAIC0yNzIsNDkgKzI2Nyw1NSBAQAogCiAjZGVmaW5lIE1BWF9JQlNfU0FNUExFX1NJWkUgMTQKIAotdm9pZCBvcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShzdHJ1Y3QgcHRfcmVncyAqY29uc3QgcmVncywKLQkJCSAgICAgdW5zaWduZWQgaW50ICpjb25zdCBpYnNfc2FtcGxlLCBpbnQgaWJzX2NvZGUpCit2b2lkIG9wcm9maWxlX2FkZF9pYnNfc2FtcGxlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCSAgICAgdW5zaWduZWQgaW50ICogY29uc3QgaWJzX3NhbXBsZSwgaW50IGlic19jb2RlKQogewogCWludCBpc19rZXJuZWwgPSAhdXNlcl9tb2RlKHJlZ3MpOwogCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBmYWlsID0gMDsKIAogCWNwdV9idWYtPnNhbXBsZV9yZWNlaXZlZCsrOwogCi0JaWYgKG5yX2F2YWlsYWJsZV9zbG90cyhjcHVfYnVmKSA8IE1BWF9JQlNfU0FNUExFX1NJWkUpIHsKLQkJLyogd2UgY2FuJ3QgYmFja3RyYWNlIHNpbmNlIHdlIGxvc3QgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50ICovCi0JCWNwdV9idWYtPnNhbXBsZV9sb3N0X292ZXJmbG93Kys7Ci0JCXJldHVybjsKLQl9Ci0KIAkvKiBub3RpY2UgYSBzd2l0Y2ggZnJvbSB1c2VyLT5rZXJuZWwgb3IgdmljZSB2ZXJzYSAqLwogCWlmIChjcHVfYnVmLT5sYXN0X2lzX2tlcm5lbCAhPSBpc19rZXJuZWwpIHsKKwkJaWYgKGFkZF9jb2RlKGNwdV9idWYsIGlzX2tlcm5lbCkpCisJCQlnb3RvIGZhaWw7CiAJCWNwdV9idWYtPmxhc3RfaXNfa2VybmVsID0gaXNfa2VybmVsOwotCQlhZGRfY29kZShjcHVfYnVmLCBpc19rZXJuZWwpOwogCX0KIAogCS8qIG5vdGljZSBhIHRhc2sgc3dpdGNoICovCiAJaWYgKCFpc19rZXJuZWwpIHsKIAkJdGFzayA9IGN1cnJlbnQ7CiAJCWlmIChjcHVfYnVmLT5sYXN0X3Rhc2sgIT0gdGFzaykgeworCQkJaWYgKGFkZF9jb2RlKGNwdV9idWYsICh1bnNpZ25lZCBsb25nKXRhc2spKQorCQkJCWdvdG8gZmFpbDsKIAkJCWNwdV9idWYtPmxhc3RfdGFzayA9IHRhc2s7Ci0JCQlhZGRfY29kZShjcHVfYnVmLCAodW5zaWduZWQgbG9uZyl0YXNrKTsKIAkJfQogCX0KIAotCWFkZF9jb2RlKGNwdV9idWYsIGlic19jb2RlKTsKLQlhZGRfc2FtcGxlKGNwdV9idWYsIGlic19zYW1wbGVbMF0sIGlic19zYW1wbGVbMV0pOwotCWFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVsyXSwgaWJzX3NhbXBsZVszXSk7Ci0JYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzRdLCBpYnNfc2FtcGxlWzVdKTsKKwlmYWlsID0gZmFpbCB8fCBhZGRfY29kZShjcHVfYnVmLCBpYnNfY29kZSk7CisJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzBdLCBpYnNfc2FtcGxlWzFdKTsKKwlmYWlsID0gZmFpbCB8fCBhZGRfc2FtcGxlKGNwdV9idWYsIGlic19zYW1wbGVbMl0sIGlic19zYW1wbGVbM10pOworCWZhaWwgPSBmYWlsIHx8IGFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVs0XSwgaWJzX3NhbXBsZVs1XSk7CiAKIAlpZiAoaWJzX2NvZGUgPT0gSUJTX09QX0JFR0lOKSB7Ci0JCWFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVs2XSwgaWJzX3NhbXBsZVs3XSk7Ci0JCWFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVs4XSwgaWJzX3NhbXBsZVs5XSk7Ci0JCWFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVsxMF0sIGlic19zYW1wbGVbMTFdKTsKKwkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzZdLCBpYnNfc2FtcGxlWzddKTsKKwkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzhdLCBpYnNfc2FtcGxlWzldKTsKKwkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzEwXSwgaWJzX3NhbXBsZVsxMV0pOwogCX0KIAorCWlmIChmYWlsKQorCQlnb3RvIGZhaWw7CisKIAlpZiAoYmFja3RyYWNlX2RlcHRoKQogCQlvcHJvZmlsZV9vcHMuYmFja3RyYWNlKHJlZ3MsIGJhY2t0cmFjZV9kZXB0aCk7CisKKwlyZXR1cm47CisKK2ZhaWw6CisJY3B1X2J1Zi0+c2FtcGxlX2xvc3Rfb3ZlcmZsb3crKzsKKwlyZXR1cm47CiB9CiAKICNlbmRpZgpAQCAtMzMyLDIxICszMzMsMjEgQEAKIAlpZiAoIWNwdV9idWYtPnRyYWNpbmcpCiAJCXJldHVybjsKIAotCWlmIChucl9hdmFpbGFibGVfc2xvdHMoY3B1X2J1ZikgPCAxKSB7Ci0JCWNwdV9idWYtPnRyYWNpbmcgPSAwOwotCQljcHVfYnVmLT5zYW1wbGVfbG9zdF9vdmVyZmxvdysrOwotCQlyZXR1cm47Ci0JfQorCS8qCisJICogYnJva2VuIGZyYW1lIGNhbiBnaXZlIGFuIGVpcCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIGFuCisJICogZXNjYXBlIGNvZGUsIGFib3J0IHRoZSB0cmFjZSBpZiB3ZSBnZXQgaXQKKwkgKi8KKwlpZiAocGMgPT0gRVNDQVBFX0NPREUpCisJCWdvdG8gZmFpbDsKIAotCS8qIGJyb2tlbiBmcmFtZSBjYW4gZ2l2ZSBhbiBlaXAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyBhbiBlc2NhcGUgY29kZSwKLQkgKiBhYm9ydCB0aGUgdHJhY2UgaWYgd2UgZ2V0IGl0ICovCi0JaWYgKHBjID09IEVTQ0FQRV9DT0RFKSB7Ci0JCWNwdV9idWYtPnRyYWNpbmcgPSAwOwotCQljcHVfYnVmLT5iYWNrdHJhY2VfYWJvcnRlZCsrOwotCQlyZXR1cm47Ci0JfQorCWlmIChhZGRfc2FtcGxlKGNwdV9idWYsIHBjLCAwKSkKKwkJZ290byBmYWlsOwogCi0JYWRkX3NhbXBsZShjcHVfYnVmLCBwYywgMCk7CisJcmV0dXJuOworZmFpbDoKKwljcHVfYnVmLT50cmFjaW5nID0gMDsKKwljcHVfYnVmLT5iYWNrdHJhY2VfYWJvcnRlZCsrOworCXJldHVybjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5oIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKaW5kZXggZDNjYzI2Mi4uYWFjYjBmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmluZ19idWZmZXIuaD4KIAogc3RydWN0IHRhc2tfc3RydWN0OwogCkBAIC0zMiw2ICszMywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CiB9OwogCitzdHJ1Y3Qgb3BfZW50cnkgeworCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CisJc3RydWN0IG9wX3NhbXBsZSAqc2FtcGxlOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworfTsKKwogc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaGVhZF9wb3M7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0YWlsX3BvczsKQEAgLTM5LDcgKzQ2LDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3RfdGFzazsKIAlpbnQgbGFzdF9pc19rZXJuZWw7CiAJaW50IHRyYWNpbmc7Ci0Jc3RydWN0IG9wX3NhbXBsZSAqYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgc2FtcGxlX3JlY2VpdmVkOwogCXVuc2lnbmVkIGxvbmcgc2FtcGxlX2xvc3Rfb3ZlcmZsb3c7CiAJdW5zaWduZWQgbG9uZyBiYWNrdHJhY2VfYWJvcnRlZDsKQEAgLTQ4LDkgKzU0LDY4IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogfTsKIAorZXh0ZXJuIHN0cnVjdCByaW5nX2J1ZmZlciAqb3BfcmluZ19idWZmZXJfcmVhZDsKK2V4dGVybiBzdHJ1Y3QgcmluZ19idWZmZXIgKm9wX3JpbmdfYnVmZmVyX3dyaXRlOwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyLCBjcHVfYnVmZmVyKTsKIAotdm9pZCBjcHVfYnVmZmVyX3Jlc2V0KHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmKTsKKy8qCisgKiBSZXNldHMgdGhlIGNwdSBidWZmZXIgdG8gYSBzYW5lIHN0YXRlLgorICoKKyAqIHJlc2V0IHRoZXNlIHRvIGludmFsaWQgdmFsdWVzOyB0aGUgbmV4dCBzYW1wbGUgY29sbGVjdGVkIHdpbGwKKyAqIHBvcHVsYXRlIHRoZSBidWZmZXIgd2l0aCBwcm9wZXIgdmFsdWVzIHRvIGluaXRpYWxpemUgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2J1ZmZlcl9yZXNldChpbnQgY3B1KQoreworCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJnBlcl9jcHUoY3B1X2J1ZmZlciwgY3B1KTsKKworCWNwdV9idWYtPmxhc3RfaXNfa2VybmVsID0gLTE7CisJY3B1X2J1Zi0+bGFzdF90YXNrID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3B1X2J1ZmZlcl93cml0ZV9lbnRyeShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5KQoreworCWVudHJ5LT5ldmVudCA9IHJpbmdfYnVmZmVyX2xvY2tfcmVzZXJ2ZShvcF9yaW5nX2J1ZmZlcl93cml0ZSwKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgb3Bfc2FtcGxlKSwKKwkJCQkJCSZlbnRyeS0+aXJxX2ZsYWdzKTsKKwlpZiAoZW50cnktPmV2ZW50KQorCQllbnRyeS0+c2FtcGxlID0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShlbnRyeS0+ZXZlbnQpOworCWVsc2UKKwkJZW50cnktPnNhbXBsZSA9IE5VTEw7CisKKwlpZiAoIWVudHJ5LT5zYW1wbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9idWZmZXJfd3JpdGVfY29tbWl0KHN0cnVjdCBvcF9lbnRyeSAqZW50cnkpCit7CisJcmV0dXJuIHJpbmdfYnVmZmVyX3VubG9ja19jb21taXQob3BfcmluZ19idWZmZXJfd3JpdGUsIGVudHJ5LT5ldmVudCwKKwkJCQkJIGVudHJ5LT5pcnFfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvcF9zYW1wbGUgKmNwdV9idWZmZXJfcmVhZF9lbnRyeShpbnQgY3B1KQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZTsKKwllID0gcmluZ19idWZmZXJfY29uc3VtZShvcF9yaW5nX2J1ZmZlcl9yZWFkLCBjcHUsIE5VTEwpOworCWlmIChlKQorCQlyZXR1cm4gcmluZ19idWZmZXJfZXZlbnRfZGF0YShlKTsKKwlpZiAocmluZ19idWZmZXJfc3dhcF9jcHUob3BfcmluZ19idWZmZXJfcmVhZCwKKwkJCQkgb3BfcmluZ19idWZmZXJfd3JpdGUsCisJCQkJIGNwdSkpCisJCXJldHVybiBOVUxMOworCWUgPSByaW5nX2J1ZmZlcl9jb25zdW1lKG9wX3JpbmdfYnVmZmVyX3JlYWQsIGNwdSwgTlVMTCk7CisJaWYgKGUpCisJCXJldHVybiByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGUpOworCXJldHVybiBOVUxMOworfQorCisvKiAiYWNxdWlyZSIgYXMgbWFueSBjcHUgYnVmZmVyIHNsb3RzIGFzIHdlIGNhbiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNwdV9idWZmZXJfZW50cmllcyhpbnQgY3B1KQoreworCXJldHVybiByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShvcF9yaW5nX2J1ZmZlcl9yZWFkLCBjcHUpCisJCSsgcmluZ19idWZmZXJfZW50cmllc19jcHUob3BfcmluZ19idWZmZXJfd3JpdGUsIGNwdSk7Cit9CiAKIC8qIHRyYW5zaWVudCBldmVudHMgZm9yIHRoZSBDUFUgYnVmZmVyIC0+IGV2ZW50IGJ1ZmZlciAqLwogI2RlZmluZSBDUFVfSVNfS0VSTkVMIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVfZmlsZXMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVfZmlsZXMuYwppbmRleCBjYzEwNmQ1Li5kODIwMTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX2ZpbGVzLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9maWxlcy5jCkBAIC0xNCw5ICsxNCwxMyBAQAogI2luY2x1ZGUgIm9wcm9maWxlX3N0YXRzLmgiCiAjaW5jbHVkZSAib3Byb2YuaCIKIAotdW5zaWduZWQgbG9uZyBmc19idWZmZXJfc2l6ZSA9IDEzMTA3MjsKLXVuc2lnbmVkIGxvbmcgZnNfY3B1X2J1ZmZlcl9zaXplID0gODE5MjsKLXVuc2lnbmVkIGxvbmcgZnNfYnVmZmVyX3dhdGVyc2hlZCA9IDMyNzY4OyAvKiBGSVhNRTogdHVuZSAqLworI2RlZmluZSBGU19CVUZGRVJfU0laRV9ERUZBVUxUCQkxMzEwNzIKKyNkZWZpbmUgRlNfQ1BVX0JVRkZFUl9TSVpFX0RFRkFVTFQJODE5MgorI2RlZmluZSBGU19CVUZGRVJfV0FURVJTSEVEX0RFRkFVTFQJMzI3NjgJLyogRklYTUU6IHR1bmUgKi8KKwordW5zaWduZWQgbG9uZyBmc19idWZmZXJfc2l6ZTsKK3Vuc2lnbmVkIGxvbmcgZnNfY3B1X2J1ZmZlcl9zaXplOwordW5zaWduZWQgbG9uZyBmc19idWZmZXJfd2F0ZXJzaGVkOwogCiBzdGF0aWMgc3NpemVfdCBkZXB0aF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQogewpAQCAtMTIwLDYgKzEyNCwxMSBAQAogCiB2b2lkIG9wcm9maWxlX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQogeworCS8qIHJlaW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlcyAqLworCWZzX2J1ZmZlcl9zaXplID0JRlNfQlVGRkVSX1NJWkVfREVGQVVMVDsKKwlmc19jcHVfYnVmZmVyX3NpemUgPQlGU19DUFVfQlVGRkVSX1NJWkVfREVGQVVMVDsKKwlmc19idWZmZXJfd2F0ZXJzaGVkID0JRlNfQlVGRkVSX1dBVEVSU0hFRF9ERUZBVUxUOworCiAJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgcm9vdCwgImVuYWJsZSIsICZlbmFibGVfZm9wcyk7CiAJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZV9wZXJtKHNiLCByb290LCAiZHVtcCIsICZkdW1wX2ZvcHMsIDA2NjYpOwogCW9wcm9maWxlZnNfY3JlYXRlX2ZpbGUoc2IsIHJvb3QsICJidWZmZXIiLCAmZXZlbnRfYnVmZmVyX2ZvcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYyBiL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKaW5kZXggMmRlNWEzMi4uZjc4MzcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYworKysgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CiAjaW5jbHVkZSAiaW50cl9yZW1hcHBpbmcuaCIKIApAQCAtMTksMTcgKzIwLDc1IEBACiAJdTggIGlydGVfbWFzazsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxXzJfaW9tbXUgaXJxXzJfaW9tbXVYW05SX0lSUVNdOworI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCitzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICpnZXRfb25lX2ZyZWVfaXJxXzJfaW9tbXUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlvbW11OworCWludCBub2RlOworCisJbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CisKKwlpb21tdSA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmlvbW11KSwgR0ZQX0FUT01JQywgbm9kZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImFsbG9jIGlycV8yX2lvbW11IG9uIGNwdSAlZCBub2RlICVkXG4iLCBjcHUsIG5vZGUpOworCisJcmV0dXJuIGlvbW11OworfQogCiBzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXJldHVybiAoaXJxIDwgbnJfaXJxcykgPyBpcnFfMl9pb21tdVggKyBpcnEgOiBOVUxMOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKFdBUk5fT05fT05DRSghZGVzYykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRlc2MtPmlycV8yX2lvbW11OworfQorCitzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdV9hbGxvY19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisJc3RydWN0IGlycV8yX2lvbW11ICppcnFfaW9tbXU7CisKKwkvKgorCSAqIGFsbG9jIGlycSBkZXNjIGlmIG5vdCBhbGxvY2F0ZWQgYWxyZWFkeS4KKwkgKi8KKwlkZXNjID0gaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KGlycSwgY3B1KTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY2FuIG5vdCBnZXQgaXJxX2Rlc2MgZm9yICVkXG4iLCBpcnEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpcnFfaW9tbXUgPSBkZXNjLT5pcnFfMl9pb21tdTsKKworCWlmICghaXJxX2lvbW11KQorCQlkZXNjLT5pcnFfMl9pb21tdSA9IGdldF9vbmVfZnJlZV9pcnFfMl9pb21tdShjcHUpOworCisJcmV0dXJuIGRlc2MtPmlycV8yX2lvbW11OwogfQogCiBzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdV9hbGxvYyh1bnNpZ25lZCBpbnQgaXJxKQogeworCXJldHVybiBpcnFfMl9pb21tdV9hbGxvY19jcHUoaXJxLCBib290X2NwdV9pZCk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU1BBUlNFX0lSUSAqLworCitzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11IGlycV8yX2lvbW11WFtOUl9JUlFTXTsKKworc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxXzJfaW9tbXUodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgbnJfaXJxcykKKwkJcmV0dXJuICZpcnFfMl9pb21tdVhbaXJxXTsKKworCXJldHVybiBOVUxMOworfQorc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxXzJfaW9tbXVfYWxsb2ModW5zaWduZWQgaW50IGlycSkKK3sKIAlyZXR1cm4gaXJxXzJfaW9tbXUoaXJxKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV8yX2lyX2xvY2spOwogCkBAIC04Niw5ICsxNDUsMTEgQEAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gLTE7CiAKKyNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKIAkvKiBwcm90ZWN0IGlycV8yX2lvbW11X2FsbG9jIGxhdGVyICovCiAJaWYgKGlycSA+PSBucl9pcnFzKQogCQlyZXR1cm4gLTE7CisjZW5kaWYKIAogCS8qCiAJICogc3RhcnQgdGhlIElSVEUgc2VhcmNoIGZyb20gaW5kZXggMC4KQEAgLTEzMCw2ICsxOTEsMTIgQEAKIAkJdGFibGUtPmJhc2VbaV0ucHJlc2VudCA9IDE7CiAKIAlpcnFfaW9tbXUgPSBpcnFfMl9pb21tdV9hbGxvYyhpcnEpOworCWlmICghaXJxX2lvbW11KSB7CisJCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBpcnFfMl9pb21tdVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKIAlpcnFfaW9tbXUtPmlvbW11ID0gaW9tbXU7CiAJaXJxX2lvbW11LT5pcnRlX2luZGV4ID0gIGluZGV4OwogCWlycV9pb21tdS0+c3ViX2hhbmRsZSA9IDA7CkBAIC0xNzcsNiArMjQ0LDEyIEBACiAKIAlpcnFfaW9tbXUgPSBpcnFfMl9pb21tdV9hbGxvYyhpcnEpOwogCisJaWYgKCFpcnFfaW9tbXUpIHsKKwkJc3Bpbl91bmxvY2soJmlycV8yX2lyX2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIGlycV8yX2lvbW11XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCWlycV9pb21tdS0+aW9tbXUgPSBpb21tdTsKIAlpcnFfaW9tbXUtPmlydGVfaW5kZXggPSBpbmRleDsKIAlpcnFfaW9tbXUtPnN1Yl9oYW5kbGUgPSBzdWJoYW5kbGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDc0ODAxZjcuLjExYTUxZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0xMDMsMTEgKzEwMywxMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbXNpeF9mbHVzaF93cml0ZXModW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIG1zaXhfZmx1c2hfd3JpdGVzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCi0JZW50cnkgPSBnZXRfaXJxX21zaShpcnEpOworCWVudHJ5ID0gZ2V0X2lycV9kZXNjX21zaShkZXNjKTsKIAlCVUdfT04oIWVudHJ5IHx8ICFlbnRyeS0+ZGV2KTsKIAlzd2l0Y2ggKGVudHJ5LT5tc2lfYXR0cmliLnR5cGUpIHsKIAljYXNlIFBDSV9DQVBfSURfTVNJOgpAQCAtMTM1LDExICsxMzUsMTEgQEAKICAqIFJldHVybnMgMSBpZiBpdCBzdWNjZWVkZWQgaW4gbWFza2luZyB0aGUgaW50ZXJydXB0IGFuZCAwIGlmIHRoZSBkZXZpY2UKICAqIGRvZXNuJ3Qgc3VwcG9ydCBNU0kgbWFza2luZy4KICAqLwotc3RhdGljIGludCBtc2lfc2V0X21hc2tfYml0cyh1bnNpZ25lZCBpbnQgaXJxLCB1MzIgbWFzaywgdTMyIGZsYWcpCitzdGF0aWMgaW50IG1zaV9zZXRfbWFza19iaXRzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdTMyIG1hc2ssIHUzMiBmbGFnKQogewogCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7CiAKLQllbnRyeSA9IGdldF9pcnFfbXNpKGlycSk7CisJZW50cnkgPSBnZXRfaXJxX2Rlc2NfbXNpKGRlc2MpOwogCUJVR19PTighZW50cnkgfHwgIWVudHJ5LT5kZXYpOwogCXN3aXRjaCAoZW50cnktPm1zaV9hdHRyaWIudHlwZSkgewogCWNhc2UgUENJX0NBUF9JRF9NU0k6CkBAIC0xNzIsOSArMTcyLDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCByZWFkX21zaV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IG1zaV9tc2cgKm1zZykKK3ZvaWQgcmVhZF9tc2lfbXNnX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKQogewotCXN0cnVjdCBtc2lfZGVzYyAqZW50cnkgPSBnZXRfaXJxX21zaShpcnEpOworCXN0cnVjdCBtc2lfZGVzYyAqZW50cnkgPSBnZXRfaXJxX2Rlc2NfbXNpKGRlc2MpOwogCXN3aXRjaChlbnRyeS0+bXNpX2F0dHJpYi50eXBlKSB7CiAJY2FzZSBQQ0lfQ0FQX0lEX01TSToKIAl7CkBAIC0yMTEsOSArMjExLDE2IEBACiAJfQogfQogCi12b2lkIHdyaXRlX21zaV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IG1zaV9tc2cgKm1zZykKK3ZvaWQgcmVhZF9tc2lfbXNnKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBtc2lfbXNnICptc2cpCiB7Ci0Jc3RydWN0IG1zaV9kZXNjICplbnRyeSA9IGdldF9pcnFfbXNpKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCXJlYWRfbXNpX21zZ19kZXNjKGRlc2MsIG1zZyk7Cit9CisKK3ZvaWQgd3JpdGVfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5ID0gZ2V0X2lycV9kZXNjX21zaShkZXNjKTsKIAlzd2l0Y2ggKGVudHJ5LT5tc2lfYXR0cmliLnR5cGUpIHsKIAljYXNlIFBDSV9DQVBfSURfTVNJOgogCXsKQEAgLTI1MiwyMSArMjU5LDMxIEBACiAJZW50cnktPm1zZyA9ICptc2c7CiB9CiAKK3ZvaWQgd3JpdGVfbXNpX21zZyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisKKwl3cml0ZV9tc2lfbXNnX2Rlc2MoZGVzYywgbXNnKTsKK30KKwogdm9pZCBtYXNrX21zaV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQltc2lfc2V0X21hc2tfYml0cyhpcnEsIDEsIDEpOwotCW1zaXhfZmx1c2hfd3JpdGVzKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCW1zaV9zZXRfbWFza19iaXRzKGRlc2MsIDEsIDEpOworCW1zaXhfZmx1c2hfd3JpdGVzKGRlc2MpOwogfQogCiB2b2lkIHVubWFza19tc2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JbXNpX3NldF9tYXNrX2JpdHMoaXJxLCAxLCAwKTsKLQltc2l4X2ZsdXNoX3dyaXRlcyhpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisKKwltc2lfc2V0X21hc2tfYml0cyhkZXNjLCAxLCAwKTsKKwltc2l4X2ZsdXNoX3dyaXRlcyhkZXNjKTsKIH0KIAogc3RhdGljIGludCBtc2lfZnJlZV9pcnFzKHN0cnVjdCBwY2lfZGV2KiBkZXYpOwogCi0KIHN0YXRpYyBzdHJ1Y3QgbXNpX2Rlc2MqIGFsbG9jX21zaV9lbnRyeSh2b2lkKQogewogCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7CkBAIC0zMDMsOSArMzIwLDExIEBACiAJcGNpX2ludHhfZm9yX21zaShkZXYsIDApOwogCW1zaV9zZXRfZW5hYmxlKGRldiwgMCk7CiAJd3JpdGVfbXNpX21zZyhkZXYtPmlycSwgJmVudHJ5LT5tc2cpOwotCWlmIChlbnRyeS0+bXNpX2F0dHJpYi5tYXNrYml0KQotCQltc2lfc2V0X21hc2tfYml0cyhkZXYtPmlycSwgZW50cnktPm1zaV9hdHRyaWIubWFza2JpdHNfbWFzaywKKwlpZiAoZW50cnktPm1zaV9hdHRyaWIubWFza2JpdCkgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhkZXYtPmlycSk7CisJCW1zaV9zZXRfbWFza19iaXRzKGRlc2MsIGVudHJ5LT5tc2lfYXR0cmliLm1hc2tiaXRzX21hc2ssCiAJCQkJICBlbnRyeS0+bXNpX2F0dHJpYi5tYXNrZWQpOworCX0KIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX01TSV9GTEFHUywgJmNvbnRyb2wpOwogCWNvbnRyb2wgJj0gflBDSV9NU0lfRkxBR1NfUVNJWkU7CkBAIC0zMjcsOCArMzQ2LDkgQEAKIAltc2l4X3NldF9lbmFibGUoZGV2LCAwKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGVudHJ5LT5pcnEpOwogCQl3cml0ZV9tc2lfbXNnKGVudHJ5LT5pcnEsICZlbnRyeS0+bXNnKTsKLQkJbXNpX3NldF9tYXNrX2JpdHMoZW50cnktPmlycSwgMSwgZW50cnktPm1zaV9hdHRyaWIubWFza2VkKTsKKwkJbXNpX3NldF9tYXNrX2JpdHMoZGVzYywgMSwgZW50cnktPm1zaV9hdHRyaWIubWFza2VkKTsKIAl9CiAKIAlCVUdfT04obGlzdF9lbXB0eSgmZGV2LT5tc2lfbGlzdCkpOwpAQCAtNTk2LDcgKzYxNiw4IEBACiAJLyogUmV0dXJuIHRoZSB0aGUgcGNpIHJlc2V0IHdpdGggbXNpIGlycXMgdW5tYXNrZWQgKi8KIAlpZiAoZW50cnktPm1zaV9hdHRyaWIubWFza2JpdCkgewogCQl1MzIgbWFzayA9IGVudHJ5LT5tc2lfYXR0cmliLm1hc2tiaXRzX21hc2s7Ci0JCW1zaV9zZXRfbWFza19iaXRzKGRldi0+aXJxLCBtYXNrLCB+bWFzayk7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGRldi0+aXJxKTsKKwkJbXNpX3NldF9tYXNrX2JpdHMoZGVzYywgbWFzaywgfm1hc2spOwogCX0KIAlpZiAoIWVudHJ5LT5kZXYgfHwgZW50cnktPm1zaV9hdHRyaWIudHlwZSAhPSBQQ0lfQ0FQX0lEX01TSSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvS2NvbmZpZyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKaW5kZXggMjIyOTA0NC4uMjc2NDczNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCkBAIC0yMTcsNyArMjE3LDcgQEAKIAlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX1BYQSAmJiBQQ01DSUEKIAlkZXBlbmRzIG9uIChBUkNIX0xVQkJPQ0sgfHwgTUFDSF9NQUlOU1RPTkUgfHwgUFhBX1NIQVJQU0wgXAogCQkgICAgfHwgTUFDSF9BUk1DT1JFIHx8IEFSQ0hfUFhBX1BBTE0gfHwgVFJJWkVQU19QQ01DSUEgXAotCQkgICAgfHwgQVJDSF9WSVBFUikKKwkJICAgIHx8IEFSQ0hfVklQRVIgfHwgQVJDSF9QWEFfRVNFUklFUykKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBYQTJ4eCBQQ01DSUEgY29udHJvbGxlcgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlCmluZGV4IDIzODYyOWEuLmJiYWM0NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlCkBAIC03Miw1ICs3Miw2IEBACiBweGEyeHgtb2JqLSQoQ09ORklHX1RSSVpFUFNfUENNQ0lBKQkJKz0gcHhhMnh4X3RyaXplcHM0Lm8KIHB4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9QQUxNVFgpCQkrPSBweGEyeHhfcGFsbXR4Lm8KIHB4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9QQUxNTEQpCQkrPSBweGEyeHhfcGFsbWxkLm8KK3B4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9FNzQwKQkJCSs9IHB4YTJ4eF9lNzQwLm8KIAogb2JqLSQoQ09ORklHX1BDTUNJQV9QWEEyWFgpCQkJKz0gcHhhMnh4X2NvcmUubyAkKHB4YTJ4eC1vYmoteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9lNzQwLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfZTc0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjNhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfZTc0MC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogVG9zaGliYSBlNzQwIFBDTUNJQSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqCisgKiAoYykgMjAwNCBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAic29jX2NvbW1vbi5oIgorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9pcnFzIGNkX2lycXNbXSA9IHsKKwl7CisJCS5zb2NrID0gMCwKKwkJLmlycSAgPSBJUlFfR1BJTyhHUElPX0U3NDBfUENNQ0lBX0NEMCksCisJCS5zdHIgID0gIkNGIGNhcmQgZGV0ZWN0IgorCX0sCisJeworCQkuc29jayA9IDEsCisJCS5pcnEgID0gSVJRX0dQSU8oR1BJT19FNzQwX1BDTUNJQV9DRDEpLAorCQkuc3RyICA9ICJXaWZpIHN3aXRjaCIKKwl9LAorfTsKKworc3RhdGljIGludCBlNzQwX3BjbWNpYV9od19pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCXNrdC0+aXJxID0gc2t0LT5uciA9PSAwID8gSVJRX0dQSU8oR1BJT19FNzQwX1BDTUNJQV9SRFkwKSA6CisJCQkJSVJRX0dQSU8oR1BJT19FNzQwX1BDTUNJQV9SRFkxKTsKKworCXJldHVybiBzb2NfcGNtY2lhX3JlcXVlc3RfaXJxcyhza3QsICZjZF9pcnFzW3NrdC0+bnJdLCAxKTsKK30KKworLyoKKyAqIFJlbGVhc2UgYWxsIHJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQgZTc0MF9wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJc29jX3BjbWNpYV9mcmVlX2lycXMoc2t0LCAmY2RfaXJxc1tza3QtPm5yXSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGU3NDBfcGNtY2lhX3NvY2tldF9zdGF0ZShzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwKKwkJCQkJc3RydWN0IHBjbWNpYV9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKHNrdC0+bnIgPT0gMCkgeworCQlzdGF0ZS0+ZGV0ZWN0ID0gZ3Bpb19nZXRfdmFsdWUoR1BJT19FNzQwX1BDTUNJQV9DRDApID8gMCA6IDE7CisJCXN0YXRlLT5yZWFkeSAgPSBncGlvX2dldF92YWx1ZShHUElPX0U3NDBfUENNQ0lBX1JEWTApID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJc3RhdGUtPmRldGVjdCA9IGdwaW9fZ2V0X3ZhbHVlKEdQSU9fRTc0MF9QQ01DSUFfQ0QxKSA/IDAgOiAxOworCQlzdGF0ZS0+cmVhZHkgID0gZ3Bpb19nZXRfdmFsdWUoR1BJT19FNzQwX1BDTUNJQV9SRFkxKSA/IDEgOiAwOworCX0KKworCXN0YXRlLT52c18zdiAgPSAxOworCXN0YXRlLT5idmQxICAgPSAxOworCXN0YXRlLT5idmQyICAgPSAxOworCXN0YXRlLT53cnByb3QgPSAwOworCXN0YXRlLT52c19YdiAgPSAwOworfQorCitzdGF0aWMgaW50IGU3NDBfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCisJCQkJCWNvbnN0IHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpIHsKKwkJaWYgKHNrdC0+bnIgPT0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRTc0MF9QQ01DSUFfUlNUMCwgMSk7CisJCWVsc2UKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRTc0MF9QQ01DSUFfUlNUMSwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKHNrdC0+bnIgPT0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRTc0MF9QQ01DSUFfUlNUMCwgMCk7CisJCWVsc2UKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fRTc0MF9QQ01DSUFfUlNUMSwgMCk7CisJfQorCisJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CisJY2FzZSAwOgkvKiBTb2NrZXQgb2ZmICovCisJCWlmIChza3QtPm5yID09IDApCisJCQlncGlvX3NldF92YWx1ZShHUElPX0U3NDBfUENNQ0lBX1BXUjAsIDApOworCQllbHNlCisJCQlncGlvX3NldF92YWx1ZShHUElPX0U3NDBfUENNQ0lBX1BXUjEsIDEpOworCQlicmVhazsKKwljYXNlIDUwOgorCWNhc2UgMzM6IC8qIHNvY2tldCBvbiAqLworCQlpZiAoc2t0LT5uciA9PSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19FNzQwX1BDTUNJQV9QV1IwLCAxKTsKKwkJZWxzZQorCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19FNzQwX1BDTUNJQV9QV1IxLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJlNzQwX2NzOiBVbnN1cHBvcnRlZCBWY2M6ICVkXG4iLCBzdGF0ZS0+VmNjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuYWJsZSBjYXJkIHN0YXR1cyBJUlFzIG9uIChyZS0paW5pdGlhbGlzYXRpb24uICBUaGlzIGNhbgorICogYmUgY2FsbGVkIGF0IGluaXRpYWxpc2F0aW9uLCBwb3dlciBtYW5hZ2VtZW50IGV2ZW50LCBvcgorICogcGNtY2lhIGV2ZW50LgorICovCitzdGF0aWMgdm9pZCBlNzQwX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKKwlzb2NfcGNtY2lhX2VuYWJsZV9pcnFzKHNrdCwgY2RfaXJxcywgQVJSQVlfU0laRShjZF9pcnFzKSk7Cit9CisKKy8qCisgKiBEaXNhYmxlIGNhcmQgc3RhdHVzIElSUXMgb24gc3VzcGVuZC4KKyAqLworc3RhdGljIHZvaWQgZTc0MF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJc29jX3BjbWNpYV9kaXNhYmxlX2lycXMoc2t0LCBjZF9pcnFzLCBBUlJBWV9TSVpFKGNkX2lycXMpKTsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIGU3NDBfcGNtY2lhX29wcyA9IHsKKwkub3duZXIgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5od19pbml0ICAgICAgICAgID0gZTc0MF9wY21jaWFfaHdfaW5pdCwKKwkuaHdfc2h1dGRvd24gICAgICA9IGU3NDBfcGNtY2lhX2h3X3NodXRkb3duLAorCS5zb2NrZXRfc3RhdGUgICAgID0gZTc0MF9wY21jaWFfc29ja2V0X3N0YXRlLAorCS5jb25maWd1cmVfc29ja2V0ID0gZTc0MF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKKwkuc29ja2V0X2luaXQgICAgICA9IGU3NDBfcGNtY2lhX3NvY2tldF9pbml0LAorCS5zb2NrZXRfc3VzcGVuZCAgID0gZTc0MF9wY21jaWFfc29ja2V0X3N1c3BlbmQsCisJLm5yICAgICAgICAgICAgICAgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmU3NDBfcGNtY2lhX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgZTc0MF9wY21jaWFfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIW1hY2hpbmVfaXNfZTc0MCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWU3NDBfcGNtY2lhX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicHhhMnh4LXBjbWNpYSIsIC0xKTsKKwlpZiAoIWU3NDBfcGNtY2lhX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZTc0MF9wY21jaWFfZGV2aWNlLCAmZTc0MF9wY21jaWFfb3BzLAorCQkJCQlzaXplb2YoZTc0MF9wY21jaWFfb3BzKSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChlNzQwX3BjbWNpYV9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChlNzQwX3BjbWNpYV9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGU3NDBfcGNtY2lhX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihlNzQwX3BjbWNpYV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChlNzQwX3BjbWNpYV9pbml0KTsKK21vZHVsZV9leGl0KGU3NDBfcGNtY2lhX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEyeHgtcGNtY2lhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImU3NDAgUENNQ0lBIHBsYXRmb3JtIHN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdDkxc2FtOS5jIGIvZHJpdmVycy9ydGMvcnRjLWF0OTFzYW05LmMKaW5kZXggMjEzM2YzNy4uZDVlNGU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0OTFzYW05LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF0OTFzYW05LmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcnR0Lmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jIGIvZHJpdmVycy9ydGMvcnRjLXMzYy5jCmluZGV4IGY1OTI3N2IuLjdhNTY4YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1ydGMuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtcnRjLmg+CiAKIC8qIEkgaGF2ZSB5ZXQgdG8gZmluZCBhbiBTM0MgaW1wbGVtZW50YXRpb24gd2l0aCBtb3JlIHRoYW4gb25lCiAgKiBvZiB0aGVzZSBydGMgYmxvY2tzIGluICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKaW5kZXggNjZhOWJiOC4uZDI2YTVmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zYTExMDAuYwpAQCAtMzgsMTEgKzM4LDExIEBACiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2VuZGlmCiAKLSNkZWZpbmUgVElNRVJfRlJFUQkJQ0xPQ0tfVElDS19SQVRFCiAjZGVmaW5lIFJUQ19ERUZfRElWSURFUgkJMzI3NjggLSAxCiAjZGVmaW5lIFJUQ19ERUZfVFJJTQkJMAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfZnJlcSA9IDEwMjQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl9mcmVxOwogc3RhdGljIHN0cnVjdCBydGNfdGltZSBydGNfYWxhcm07CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNhMTEwMF9ydGNfbG9jayk7CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCXJ0Y191cGRhdGVfaXJxKHJ0YywgcnRjX3RpbWVyMV9jb3VudCwgUlRDX1BGIHwgUlRDX0lSUUYpOwogCiAJaWYgKHJ0Y190aW1lcjFfY291bnQgPT0gMSkKLQkJcnRjX3RpbWVyMV9jb3VudCA9IChydGNfZnJlcSAqICgoMTw8MzApLyhUSU1FUl9GUkVRPj4yKSkpOworCQlydGNfdGltZXIxX2NvdW50ID0gKHJ0Y19mcmVxICogKCgxIDw8IDMwKSAvICh0aW1lcl9mcmVxID4+IDIpKSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xNjYsNyArMTY2LDcgQEAKIHsKIAlpZiAoZGF0YSAmIFJUQ19QRikgewogCQkvKiBpbnRlcnBvbGF0ZSBtaXNzZWQgcGVyaW9kcyBhbmQgc2V0IG1hdGNoIGZvciB0aGUgbmV4dCAqLwotCQl1bnNpZ25lZCBsb25nIHBlcmlvZCA9IFRJTUVSX0ZSRVEvcnRjX2ZyZXE7CisJCXVuc2lnbmVkIGxvbmcgcGVyaW9kID0gdGltZXJfZnJlcSAvIHJ0Y19mcmVxOwogCQl1bnNpZ25lZCBsb25nIG9zY3IgPSBPU0NSOwogCQl1bnNpZ25lZCBsb25nIG9zbXIxID0gT1NNUjE7CiAJCXVuc2lnbmVkIGxvbmcgbWlzc2VkID0gKG9zY3IgLSBvc21yMSkvcGVyaW9kOwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCXJldHVybiAwOwogCWNhc2UgUlRDX1BJRV9PTjoKIAkJc3Bpbl9sb2NrX2lycSgmc2ExMTAwX3J0Y19sb2NrKTsKLQkJT1NNUjEgPSBUSU1FUl9GUkVRL3J0Y19mcmVxICsgT1NDUjsKKwkJT1NNUjEgPSB0aW1lcl9mcmVxIC8gcnRjX2ZyZXEgKyBPU0NSOwogCQlPSUVSIHw9IE9JRVJfRTE7CiAJCXJ0Y190aW1lcjFfY291bnQgPSAxOwogCQlzcGluX3VubG9ja19pcnEoJnNhMTEwMF9ydGNfbG9jayk7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAljYXNlIFJUQ19JUlFQX1JFQUQ6CiAJCXJldHVybiBwdXRfdXNlcihydGNfZnJlcSwgKHVuc2lnbmVkIGxvbmcgKilhcmcpOwogCWNhc2UgUlRDX0lSUVBfU0VUOgotCQlpZiAoYXJnIDwgMSB8fCBhcmcgPiBUSU1FUl9GUkVRKQorCQlpZiAoYXJnIDwgMSB8fCBhcmcgPiB0aW1lcl9mcmVxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJ0Y19mcmVxID0gYXJnOwogCQlyZXR1cm4gMDsKQEAgLTM1Miw2ICszNTIsOCBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAKKwl0aW1lcl9mcmVxID0gZ2V0X2Nsb2NrX3RpY2tfcmF0ZSgpOworCiAJLyoKIAkgKiBBY2NvcmRpbmcgdG8gdGhlIG1hbnVhbCB3ZSBzaG91bGQgYmUgYWJsZSB0byBsZXQgUlRUUiBiZSB6ZXJvCiAJICogYW5kIHRoZW4gYSBkZWZhdWx0IGRpdmlzZXIgZm9yIGEgMzIuNzY4S0h6IGNsb2NrIGlzIHVzZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCmluZGV4IDNkNDQyNDQuLjI4YzkwYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCkBAIC0xODgsMTEgKzE4OCwxMyBAQAogCWNvbmZpZyA9IGt2bV92cV9jb25maWcoa2Rldi0+ZGVzYykraW5kZXg7CiAKIAllcnIgPSB2bWVtX2FkZF9tYXBwaW5nKGNvbmZpZy0+YWRkcmVzcywKLQkJCSAgICAgICB2cmluZ19zaXplKGNvbmZpZy0+bnVtLCBQQUdFX1NJWkUpKTsKKwkJCSAgICAgICB2cmluZ19zaXplKGNvbmZpZy0+bnVtLAorCQkJCQkgIEtWTV9TMzkwX1ZJUlRJT19SSU5HX0FMSUdOKSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQl2cSA9IHZyaW5nX25ld192aXJ0cXVldWUoY29uZmlnLT5udW0sIHZkZXYsICh2b2lkICopIGNvbmZpZy0+YWRkcmVzcywKKwl2cSA9IHZyaW5nX25ld192aXJ0cXVldWUoY29uZmlnLT5udW0sIEtWTV9TMzkwX1ZJUlRJT19SSU5HX0FMSUdOLAorCQkJCSB2ZGV2LCAodm9pZCAqKSBjb25maWctPmFkZHJlc3MsCiAJCQkJIGt2bV9ub3RpZnksIGNhbGxiYWNrKTsKIAlpZiAoIXZxKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC0yMDksNyArMjExLDggQEAKIAlyZXR1cm4gdnE7CiB1bm1hcDoKIAl2bWVtX3JlbW92ZV9tYXBwaW5nKGNvbmZpZy0+YWRkcmVzcywKLQkJCSAgICB2cmluZ19zaXplKGNvbmZpZy0+bnVtLCBQQUdFX1NJWkUpKTsKKwkJCSAgICB2cmluZ19zaXplKGNvbmZpZy0+bnVtLAorCQkJCSAgICAgICBLVk1fUzM5MF9WSVJUSU9fUklOR19BTElHTikpOwogb3V0OgogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC0yMjAsNyArMjIzLDggQEAKIAogCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOwogCXZtZW1fcmVtb3ZlX21hcHBpbmcoY29uZmlnLT5hZGRyZXNzLAotCQkJICAgIHZyaW5nX3NpemUoY29uZmlnLT5udW0sIFBBR0VfU0laRSkpOworCQkJICAgIHZyaW5nX3NpemUoY29uZmlnLT5udW0sCisJCQkJICAgICAgIEtWTV9TMzkwX1ZJUlRJT19SSU5HX0FMSUdOKSk7CiB9CiAKIC8qCkBAIC0yOTUsMTMgKzI5OSwyOSBAQAogICovCiBzdGF0aWMgdm9pZCBrdm1fZXh0aW50X2hhbmRsZXIodTE2IGNvZGUpCiB7Ci0Jdm9pZCAqZGF0YSA9ICh2b2lkICopICoobG9uZyAqKSBfX0xDX1BGQVVMVF9JTlRQQVJNOwotCXUxNiBzdWJjb2RlID0gUzM5MF9sb3djb3JlLmNwdV9hZGRyOworCXN0cnVjdCB2aXJ0cXVldWUgKnZxOworCXUxNiBzdWJjb2RlOworCWludCBjb25maWdfY2hhbmdlZDsKIAorCXN1YmNvZGUgPSBTMzkwX2xvd2NvcmUuY3B1X2FkZHI7CiAJaWYgKChzdWJjb2RlICYgMHhmZjAwKSAhPSBWSVJUSU9fU1VCQ09ERV82NCkKIAkJcmV0dXJuOwogCi0JdnJpbmdfaW50ZXJydXB0KDAsIGRhdGEpOworCS8qIFRoZSBMU0IgbWlnaHQgYmUgb3ZlcmxvYWRlZCwgd2UgaGF2ZSB0byBtYXNrIGl0ICovCisJdnEgPSAoc3RydWN0IHZpcnRxdWV1ZSAqKSAoKCoobG9uZyAqKSBfX0xDX1BGQVVMVF9JTlRQQVJNKSAmIH4xVUwpOworCisJLyogV2UgdXNlIHRoZSBMU0Igb2YgZXh0cGFyYW0sIHRvIGRlY2lkZSwgaWYgdGhpcyBpbnRlcnJ1cHQgaXMgYSBjb25maWcKKwkgKiBjaGFuZ2Ugb3IgYSAic3RhbmRhcmQiIGludGVycnVwdCAqLworCWNvbmZpZ19jaGFuZ2VkID0gICgqKGludCAqKSAgX19MQ19FWFRfUEFSQU1TICYgMSk7CisKKwlpZiAoY29uZmlnX2NoYW5nZWQpIHsKKwkJc3RydWN0IHZpcnRpb19kcml2ZXIgKmRydjsKKwkJZHJ2ID0gY29udGFpbmVyX29mKHZxLT52ZGV2LT5kZXYuZHJpdmVyLAorCQkJCSAgIHN0cnVjdCB2aXJ0aW9fZHJpdmVyLCBkcml2ZXIpOworCQlpZiAoZHJ2LT5jb25maWdfY2hhbmdlZCkKKwkJCWRydi0+Y29uZmlnX2NoYW5nZWQodnEtPnZkZXYpOworCX0gZWxzZQorCQl2cmluZ19pbnRlcnJ1cHQoMCwgdnEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggZTUyOWI1NS4uOGFmN2RmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0zNCwxMyArMzQsMTIgQEAKIAogI2RlZmluZSBaRkNQX0JVU19JRF9TSVpFCTIwCiAKLXN0YXRpYyBjaGFyICpkZXZpY2U7Ci0KIE1PRFVMRV9BVVRIT1IoIklCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIC0gbGludXgzOTBAZGUuaWJtLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGQ1AgSEJBIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1tb2R1bGVfcGFyYW0oZGV2aWNlLCBjaGFycCwgMDQwMCk7CitzdGF0aWMgY2hhciAqaW5pdF9kZXZpY2U7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2aWNlLCBpbml0X2RldmljZSwgY2hhcnAsIDA0MDApOwogTU9EVUxFX1BBUk1fREVTQyhkZXZpY2UsICJzcGVjaWZ5IGluaXRpYWwgZGV2aWNlIik7CiAKIHN0YXRpYyBpbnQgemZjcF9yZXFsaXN0X2FsbG9jKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC03Myw0NiArNzIsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB6ZmNwX2RldmljZV9zZXR1cChjaGFyICpkZXZzdHIpCi17Ci0JY2hhciAqdG9rZW47Ci0JY2hhciAqc3RyOwotCi0JaWYgKCFkZXZzdHIpCi0JCXJldHVybiAwOwotCi0JLyogZHVwbGljYXRlIGRldnN0ciBhbmQga2VlcCB0aGUgb3JpZ2luYWwgZm9yIHN5c2ZzIHByZXNlbnRhdGlvbiovCi0Jc3RyID0ga21hbGxvYyhzdHJsZW4oZGV2c3RyKSArIDEsIEdGUF9LRVJORUwpOwotCWlmICghc3RyKQotCQlyZXR1cm4gMDsKLQotCXN0cmNweShzdHIsIGRldnN0cik7Ci0KLQl0b2tlbiA9IHN0cnNlcCgmc3RyLCAiLCIpOwotCWlmICghdG9rZW4gfHwgc3RybGVuKHRva2VuKSA+PSBaRkNQX0JVU19JRF9TSVpFKQotCQlnb3RvIGVycl9vdXQ7Ci0Jc3RybmNweSh6ZmNwX2RhdGEuaW5pdF9idXNpZCwgdG9rZW4sIFpGQ1BfQlVTX0lEX1NJWkUpOwotCi0JdG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKTsKLQlpZiAoIXRva2VuIHx8IHN0cmljdF9zdHJ0b3VsbCh0b2tlbiwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nICopICZ6ZmNwX2RhdGEuaW5pdF93d3BuKSkKLQkJZ290byBlcnJfb3V0OwotCi0JdG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKTsKLQlpZiAoIXRva2VuIHx8IHN0cmljdF9zdHJ0b3VsbCh0b2tlbiwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nICopICZ6ZmNwX2RhdGEuaW5pdF9mY3BfbHVuKSkKLQkJZ290byBlcnJfb3V0OwotCi0Ja2ZyZWUoc3RyKTsKLQlyZXR1cm4gMTsKLQotIGVycl9vdXQ6Ci0Ja2ZyZWUoc3RyKTsKLQlwcl9lcnIoIiVzIGlzIG5vdCBhIHZhbGlkIFNDU0kgZGV2aWNlXG4iLCBkZXZzdHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgemZjcF9pbml0X2RldmljZV9jb25maWd1cmUodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCB6ZmNwX2luaXRfZGV2aWNlX2NvbmZpZ3VyZShjaGFyICpidXNpZCwgdTY0IHd3cG4sIHU2NCBsdW4pCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwpAQCAtMTIwLDE3ICs4MCwxNyBAQAogCiAJZG93bigmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKIAlyZWFkX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWFkYXB0ZXIgPSB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkKHpmY3BfZGF0YS5pbml0X2J1c2lkKTsKKwlhZGFwdGVyID0gemZjcF9nZXRfYWRhcHRlcl9ieV9idXNpZChidXNpZCk7CiAJaWYgKGFkYXB0ZXIpCiAJCXpmY3BfYWRhcHRlcl9nZXQoYWRhcHRlcik7CiAJcmVhZF91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCiAJaWYgKCFhZGFwdGVyKQogCQlnb3RvIG91dF9hZGFwdGVyOwotCXBvcnQgPSB6ZmNwX3BvcnRfZW5xdWV1ZShhZGFwdGVyLCB6ZmNwX2RhdGEuaW5pdF93d3BuLCAwLCAwKTsKKwlwb3J0ID0gemZjcF9wb3J0X2VucXVldWUoYWRhcHRlciwgd3dwbiwgMCwgMCk7CiAJaWYgKElTX0VSUihwb3J0KSkKIAkJZ290byBvdXRfcG9ydDsKLQl1bml0ID0gemZjcF91bml0X2VucXVldWUocG9ydCwgemZjcF9kYXRhLmluaXRfZmNwX2x1bik7CisJdW5pdCA9IHpmY3BfdW5pdF9lbnF1ZXVlKHBvcnQsIGx1bik7CiAJaWYgKElTX0VSUih1bml0KSkKIAkJZ290byBvdXRfdW5pdDsKIAl1cCgmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKQEAgLTE2MCw2ICsxMjAsNDIgQEAKIAlyZXR1cm4ga21lbV9jYWNoZV9jcmVhdGUobmFtZSAsIHNpemUsIGFsaWduLCAwLCBOVUxMKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHpmY3BfaW5pdF9kZXZpY2Vfc2V0dXAoY2hhciAqZGV2c3RyKQoreworCWNoYXIgKnRva2VuOworCWNoYXIgKnN0cjsKKwljaGFyIGJ1c2lkW1pGQ1BfQlVTX0lEX1NJWkVdOworCXU2NCB3d3BuLCBsdW47CisKKwkvKiBkdXBsaWNhdGUgZGV2c3RyIGFuZCBrZWVwIHRoZSBvcmlnaW5hbCBmb3Igc3lzZnMgcHJlc2VudGF0aW9uKi8KKwlzdHIgPSBrbWFsbG9jKHN0cmxlbihkZXZzdHIpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHIpCisJCXJldHVybjsKKworCXN0cmNweShzdHIsIGRldnN0cik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3RyLCAiLCIpOworCWlmICghdG9rZW4gfHwgc3RybGVuKHRva2VuKSA+PSBaRkNQX0JVU19JRF9TSVpFKQorCQlnb3RvIGVycl9vdXQ7CisJc3RybmNweShidXNpZCwgdG9rZW4sIFpGQ1BfQlVTX0lEX1NJWkUpOworCisJdG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKTsKKwlpZiAoIXRva2VuIHx8IHN0cmljdF9zdHJ0b3VsbCh0b2tlbiwgMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAmd3dwbikpCisJCWdvdG8gZXJyX291dDsKKworCXRva2VuID0gc3Ryc2VwKCZzdHIsICIsIik7CisJaWYgKCF0b2tlbiB8fCBzdHJpY3Rfc3RydG91bGwodG9rZW4sIDAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikgJmx1bikpCisJCWdvdG8gZXJyX291dDsKKworCWtmcmVlKHN0cik7CisJemZjcF9pbml0X2RldmljZV9jb25maWd1cmUoYnVzaWQsIHd3cG4sIGx1bik7CisJcmV0dXJuOworCisgZXJyX291dDoKKwlrZnJlZShzdHIpOworCXByX2VycigiJXMgaXMgbm90IGEgdmFsaWQgU0NTSSBkZXZpY2VcbiIsIGRldnN0cik7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHpmY3BfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKQEAgLTE4MSw3ICsxNzcsNiBAQAogCiAJemZjcF9kYXRhLndvcmtfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiemZjcF93cSIpOwogCi0JSU5JVF9MSVNUX0hFQUQoJnpmY3BfZGF0YS5hZGFwdGVyX2xpc3RfaGVhZCk7CiAJc2VtYV9pbml0KCZ6ZmNwX2RhdGEuY29uZmlnX3NlbWEsIDEpOwogCXJ3bG9ja19pbml0KCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCkBAIC0yMDMsMTAgKzE5OCw5IEBACiAJCWdvdG8gb3V0X2Njd19yZWdpc3RlcjsKIAl9CiAKLQlpZiAoemZjcF9kZXZpY2Vfc2V0dXAoZGV2aWNlKSkKLQkJemZjcF9pbml0X2RldmljZV9jb25maWd1cmUoKTsKLQotCWdvdG8gb3V0OworCWlmIChpbml0X2RldmljZSkKKwkJemZjcF9pbml0X2RldmljZV9zZXR1cChpbml0X2RldmljZSk7CisJcmV0dXJuIDA7CiAKIG91dF9jY3dfcmVnaXN0ZXI6CiAJbWlzY19kZXJlZ2lzdGVyKCZ6ZmNwX2NmZGNfbWlzYyk7CkBAIC01MjcsMTQgKzUyMSwxMSBAQAogCQkJICAgICAgICZ6ZmNwX3N5c2ZzX2FkYXB0ZXJfYXR0cnMpKQogCQlnb3RvIHN5c2ZzX2ZhaWxlZDsKIAotCXdyaXRlX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZhZGFwdGVyLT5zdGF0dXMpOwotCWxpc3RfYWRkX3RhaWwoJmFkYXB0ZXItPmxpc3QsICZ6ZmNwX2RhdGEuYWRhcHRlcl9saXN0X2hlYWQpOwotCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0KIAl6ZmNwX2ZjX25hbWVzZXJ2ZXJfaW5pdChhZGFwdGVyKTsKIAotCXJldHVybiAwOworCWlmICghemZjcF9hZGFwdGVyX3Njc2lfcmVnaXN0ZXIoYWRhcHRlcikpCisJCXJldHVybiAwOwogCiBzeXNmc19mYWlsZWQ6CiAJemZjcF9hZGFwdGVyX2RlYnVnX3VucmVnaXN0ZXIoYWRhcHRlcik7CkBAIC01NzMsMTQgKzU2NCw3IEBACiAJCXJldHVybjsKIAogCXpmY3BfYWRhcHRlcl9kZWJ1Z191bnJlZ2lzdGVyKGFkYXB0ZXIpOwotCi0JLyogcmVtb3ZlIHNwZWNpZmllZCBhZGFwdGVyIGRhdGEgc3RydWN0dXJlIGZyb20gbGlzdCAqLwotCXdyaXRlX2xvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKLQl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwotCiAJemZjcF9xZGlvX2ZyZWUoYWRhcHRlcik7Ci0KIAl6ZmNwX2ZyZWVfbG93X21lbV9idWZmZXJzKGFkYXB0ZXIpOwogCWtmcmVlKGFkYXB0ZXItPnJlcV9saXN0KTsKIAlrZnJlZShhZGFwdGVyLT5mY19zdGF0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYwppbmRleCA3MjgxNDcxLi4yODU4ODFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKQEAgLTEwNiwxMCArMTA2LDYgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dDsKIAotCXJldHZhbCA9IHpmY3BfYWRhcHRlcl9zY3NpX3JlZ2lzdGVyKGFkYXB0ZXIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gb3V0X3Njc2lfcmVnaXN0ZXI7Ci0KIAkvKiBpbml0aWFsaXplIHJlcXVlc3QgY291bnRlciAqLwogCUJVR19PTighemZjcF9yZXFsaXN0X2lzZW1wdHkoYWRhcHRlcikpOwogCWFkYXB0ZXItPnJlcV9ubyA9IDA7CkBAIC0xMjMsOCArMTE5LDYgQEAKIAlmbHVzaF93b3JrKCZhZGFwdGVyLT5zY2FuX3dvcmspOwogCXJldHVybiAwOwogCi0gb3V0X3Njc2lfcmVnaXN0ZXI6Ci0JemZjcF9lcnBfdGhyZWFkX2tpbGwoYWRhcHRlcik7CiAgb3V0OgogCXVwKCZ6ZmNwX2RhdGEuY29uZmlnX3NlbWEpOwogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCmluZGV4IGYxYTc1MTguLjEwY2JmZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCkBAIC04NSwyMCArODUsOSBAQAogCiBzdGF0aWMgc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9jZmRjX2dldF9hZGFwdGVyKHUzMiBkZXZubykKIHsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gTlVMTCwgKmN1cl9hZGFwdGVyOwotCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKLQotCXJlYWRfbG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfYWRhcHRlciwgJnpmY3BfZGF0YS5hZGFwdGVyX2xpc3RfaGVhZCwgbGlzdCkgewotCQljY3dfZGV2aWNlX2dldF9pZChjdXJfYWRhcHRlci0+Y2N3X2RldmljZSwgJmRldl9pZCk7Ci0JCWlmIChkZXZfaWQuZGV2bm8gPT0gZGV2bm8pIHsKLQkJCWFkYXB0ZXIgPSBjdXJfYWRhcHRlcjsKLQkJCXpmY3BfYWRhcHRlcl9nZXQoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZWFkX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JcmV0dXJuIGFkYXB0ZXI7CisJY2hhciBidXNpZFs5XTsKKwlzbnByaW50ZihidXNpZCwgc2l6ZW9mKGJ1c2lkKSwgIjAuMC4lMDR4IiwgZGV2bm8pOworCXJldHVybiB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkKGJ1c2lkKTsKIH0KIAogc3RhdGljIGludCB6ZmNwX2NmZGNfc2V0X2ZzZihzdHJ1Y3QgemZjcF9mc2ZfY2ZkYyAqZnNmX2NmZGMsIGludCBjb21tYW5kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKaW5kZXggNzM1ZDY3NS4uY2I2ZGY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCkBAIC01MjIsNyArNTIyLDcgQEAKIAlbMjldCT0gImxpbmsgZG93biIsCiAJWzMwXQk9ICJsaW5rIHVwIHN0YXR1cyByZWFkIiwKIAlbMzFdCT0gIm9wZW4gcG9ydCBmYWlsZWQiLAotCVszMl0JPSAib3BlbiBwb3J0IGZhaWxlZCIsCisJWzMyXQk9ICIiLAogCVszM10JPSAiY2xvc2UgcG9ydCIsCiAJWzM0XQk9ICJvcGVuIHVuaXQgZmFpbGVkIiwKIAlbMzVdCT0gImV4Y2x1c2l2ZSBvcGVuIHVuaXQgZmFpbGVkIiwKQEAgLTkzNiw2ICs5MzYsNyBAQAogCXJjdC0+cmVhc29uX2NvZGUgPSBoZHItPnJlYXNvbl9jb2RlOwogCXJjdC0+ZXhwbCA9IGhkci0+cmVhc29uX2NvZGVfZXhwbDsKIAlyY3QtPnZlbmRvcl91bmlxdWUgPSBoZHItPnZlbmRvcl91bmlxdWU7CisJcmN0LT5tYXhfcmVzX3NpemUgPSBoZHItPm1heF9yZXNfc2l6ZTsKIAlyY3QtPmxlbiA9IG1pbigoaW50KWN0LT5yZXNwLT5sZW5ndGggLSAoaW50KXNpemVvZihzdHJ1Y3QgY3RfaGRyKSwKIAkJICAgICAgIFpGQ1BfREJGX1NBTl9NQVhfUEFZTE9BRCk7CiAJZGVidWdfZXZlbnQoYWRhcHRlci0+c2FuX2RiZiwgbGV2ZWwsIHIsIHNpemVvZigqcikpOwpAQCAtMTA0Myw2ICsxMDQ0LDcgQEAKIAkJemZjcF9kYmZfb3V0KCZwLCAicmVhc29uX2NvZGUiLCAiMHglMDJ4IiwgY3QtPnJlYXNvbl9jb2RlKTsKIAkJemZjcF9kYmZfb3V0KCZwLCAicmVhc29uX2NvZGVfZXhwbCIsICIweCUwMngiLCBjdC0+ZXhwbCk7CiAJCXpmY3BfZGJmX291dCgmcCwgInZlbmRvcl91bmlxdWUiLCAiMHglMDJ4IiwgY3QtPnZlbmRvcl91bmlxdWUpOworCQl6ZmNwX2RiZl9vdXQoJnAsICJtYXhfcmVzX3NpemUiLCAiMHglMDR4IiwgY3QtPm1heF9yZXNfc2l6ZSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKHItPnRhZywgIm9lbHMiLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCB8fAogCQkgICBzdHJuY21wKHItPnRhZywgInJlbHMiLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCB8fAogCQkgICBzdHJuY21wKHItPnRhZywgImllbHMiLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCkgewpAQCAtMTI0OSw3ICsxMjUxLDcgQEAKIAljaGFyIGRiZl9uYW1lW0RFQlVHX01BWF9OQU1FX0xFTl07CiAKIAkvKiBkZWJ1ZyBmZWF0dXJlIGFyZWEgd2hpY2ggcmVjb3JkcyByZWNvdmVyeSBhY3Rpdml0eSAqLwotCXNwcmludGYoZGJmX25hbWUsICJ6ZmNwXyVzX3JlYyIsIHpmY3BfZ2V0X2J1c2lkX2J5X2FkYXB0ZXIoYWRhcHRlcikpOworCXNwcmludGYoZGJmX25hbWUsICJ6ZmNwXyVzX3JlYyIsIGRldl9uYW1lKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYpKTsKIAlhZGFwdGVyLT5yZWNfZGJmID0gZGVidWdfcmVnaXN0ZXIoZGJmX25hbWUsIGRiZnNpemUsIDEsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCB6ZmNwX3JlY19kYmZfcmVjb3JkKSk7CiAJaWYgKCFhZGFwdGVyLT5yZWNfZGJmKQpAQCAtMTI1OSw3ICsxMjYxLDcgQEAKIAlkZWJ1Z19zZXRfbGV2ZWwoYWRhcHRlci0+cmVjX2RiZiwgMyk7CiAKIAkvKiBkZWJ1ZyBmZWF0dXJlIGFyZWEgd2hpY2ggcmVjb3JkcyBIQkEgKEZTRiBhbmQgUURJTykgY29uZGl0aW9ucyAqLwotCXNwcmludGYoZGJmX25hbWUsICJ6ZmNwXyVzX2hiYSIsIHpmY3BfZ2V0X2J1c2lkX2J5X2FkYXB0ZXIoYWRhcHRlcikpOworCXNwcmludGYoZGJmX25hbWUsICJ6ZmNwXyVzX2hiYSIsIGRldl9uYW1lKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYpKTsKIAlhZGFwdGVyLT5oYmFfZGJmID0gZGVidWdfcmVnaXN0ZXIoZGJmX25hbWUsIGRiZnNpemUsIDEsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCB6ZmNwX2hiYV9kYmZfcmVjb3JkKSk7CiAJaWYgKCFhZGFwdGVyLT5oYmFfZGJmKQpAQCAtMTI2OSw3ICsxMjcxLDcgQEAKIAlkZWJ1Z19zZXRfbGV2ZWwoYWRhcHRlci0+aGJhX2RiZiwgMyk7CiAKIAkvKiBkZWJ1ZyBmZWF0dXJlIGFyZWEgd2hpY2ggcmVjb3JkcyBTQU4gY29tbWFuZCBmYWlsdXJlcyBhbmQgcmVjb3ZlcnkgKi8KLQlzcHJpbnRmKGRiZl9uYW1lLCAiemZjcF8lc19zYW4iLCB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpKTsKKwlzcHJpbnRmKGRiZl9uYW1lLCAiemZjcF8lc19zYW4iLCBkZXZfbmFtZSgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2KSk7CiAJYWRhcHRlci0+c2FuX2RiZiA9IGRlYnVnX3JlZ2lzdGVyKGRiZl9uYW1lLCBkYmZzaXplLCAxLAogCQkJCQkgIHNpemVvZihzdHJ1Y3QgemZjcF9zYW5fZGJmX3JlY29yZCkpOwogCWlmICghYWRhcHRlci0+c2FuX2RiZikKQEAgLTEyNzksNyArMTI4MSw3IEBACiAJZGVidWdfc2V0X2xldmVsKGFkYXB0ZXItPnNhbl9kYmYsIDYpOwogCiAJLyogZGVidWcgZmVhdHVyZSBhcmVhIHdoaWNoIHJlY29yZHMgU0NTSSBjb21tYW5kIGZhaWx1cmVzIGFuZCByZWNvdmVyeSAqLwotCXNwcmludGYoZGJmX25hbWUsICJ6ZmNwXyVzX3Njc2kiLCB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpKTsKKwlzcHJpbnRmKGRiZl9uYW1lLCAiemZjcF8lc19zY3NpIiwgZGV2X25hbWUoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldikpOwogCWFkYXB0ZXItPnNjc2lfZGJmID0gZGVidWdfcmVnaXN0ZXIoZGJmX25hbWUsIGRiZnNpemUsIDEsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgemZjcF9zY3NpX2RiZl9yZWNvcmQpKTsKIAlpZiAoIWFkYXB0ZXItPnNjc2lfZGJmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmgKaW5kZXggNWQ2YjJkZi4uNzQ5OThmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oCkBAIC0xNzEsNiArMTcxLDcgQEAKIAl1OCByZWFzb25fY29kZTsKIAl1OCBleHBsOwogCXU4IHZlbmRvcl91bmlxdWU7CisJdTE2IG1heF9yZXNfc2l6ZTsKIAl1MzIgbGVuOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCmluZGV4IGUxOWU0NmEuLjUxMDY2MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaApAQCAtMTU5LDIwICsxNTksNiBAQAogICAgICAgICB1MzIgbnBvcnRfZGlkOjI0OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotI2RlZmluZSBaRkNQX1BPUlRfQUREUkVTUyAgIDB4MAotI2RlZmluZSBaRkNQX0FSRUFfQUREUkVTUyAgIDB4MQotI2RlZmluZSBaRkNQX0RPTUFJTl9BRERSRVNTIDB4MgotI2RlZmluZSBaRkNQX0ZBQlJJQ19BRERSRVNTIDB4MwotCi0jZGVmaW5lIFpGQ1BfUE9SVFNfUkFOR0VfUE9SVCAgIDB4RkZGRkZGCi0jZGVmaW5lIFpGQ1BfUE9SVFNfUkFOR0VfQVJFQSAgIDB4RkZGRjAwCi0jZGVmaW5lIFpGQ1BfUE9SVFNfUkFOR0VfRE9NQUlOIDB4RkYwMDAwCi0jZGVmaW5lIFpGQ1BfUE9SVFNfUkFOR0VfRkFCUklDIDB4MDAwMDAwCi0KLSNkZWZpbmUgWkZDUF9OT19QT1JUU19QRVJfQVJFQSAgICAweDEwMAotI2RlZmluZSBaRkNQX05PX1BPUlRTX1BFUl9ET01BSU4gIDB4MTAwMDAKLSNkZWZpbmUgWkZDUF9OT19QT1JUU19QRVJfRkFCUklDICAweDEwMDAwMDAKLQogLyogc2VlIGZjLXBoICovCiBzdHJ1Y3QgZmNwX2xvZ28gewogICAgICAgICB1MzIgY29tbWFuZDsKQEAgLTIxMSw3ICsxOTcsNiBAQAogI2RlZmluZSBaRkNQX0NUX1VOQUJMRV9UT19QRVJGT1JNX0NNRAkweDA5CiAjZGVmaW5lIFpGQ1BfQ1RfR0lEX1BOCQkJMHgwMTIxCiAjZGVmaW5lIFpGQ1BfQ1RfR1BOX0ZUCQkJMHgwMTcyCi0jZGVmaW5lIFpGQ1BfQ1RfTUFYX1NJWkUJCTB4MTAyMAogI2RlZmluZSBaRkNQX0NUX0FDQ0VQVAkJCTB4ODAwMgogI2RlZmluZSBaRkNQX0NUX1JFSkVDVAkJCTB4ODAwMQogCkBAIC0yNTgsNyArMjQzLDYgQEAKIAogLyogcmVtb3RlIHBvcnQgc3RhdHVzICovCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1BPUlRfUEhZU19PUEVOCQkweDAwMDAwMDAxCi0jZGVmaW5lIFpGQ1BfU1RBVFVTX1BPUlRfRElEX0RJRAkJMHgwMDAwMDAwMgogI2RlZmluZSBaRkNQX1NUQVRVU19QT1JUX1BIWVNfQ0xPU0lORwkJMHgwMDAwMDAwNAogI2RlZmluZSBaRkNQX1NUQVRVU19QT1JUX05PX1dXUE4JCTB4MDAwMDAwMDgKICNkZWZpbmUgWkZDUF9TVEFUVVNfUE9SVF9JTlZBTElEX1dXUE4JCTB4MDAwMDAwMjAKQEAgLTM0MCw4ICszMjQsNiBAQAogICogQHdrYV9wb3J0OiBwb3J0IHdoZXJlIHRoZSByZXF1ZXN0IGlzIHNlbnQgdG8KICAqIEByZXE6IHNjYXR0ZXItZ2F0aGVyIGxpc3QgZm9yIHJlcXVlc3QKICAqIEByZXNwOiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciByZXNwb25zZQotICogQHJlcV9jb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHJlcXVlc3Qgc2NhdHRlci1nYXRoZXIgbGlzdAotICogQHJlc3BfY291bnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiByZXNwb25zZSBzY2F0dGVyLWdhdGhlciBsaXN0CiAgKiBAaGFuZGxlcjogaGFuZGxlciBmdW5jdGlvbiAoY2FsbGVkIGZvciByZXNwb25zZSB0byB0aGUgcmVxdWVzdCkKICAqIEBoYW5kbGVyX2RhdGE6IGRhdGEgcGFzc2VkIHRvIGhhbmRsZXIgZnVuY3Rpb24KICAqIEB0aW1lb3V0OiBGU0YgdGltZW91dCBmb3IgdGhpcyByZXF1ZXN0CkBAIC0zNTIsOCArMzM0LDYgQEAKIAlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQ7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpyZXE7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpyZXNwOwotCXVuc2lnbmVkIGludCByZXFfY291bnQ7Ci0JdW5zaWduZWQgaW50IHJlc3BfY291bnQ7CiAJdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpOwogCXVuc2lnbmVkIGxvbmcgaGFuZGxlcl9kYXRhOwogCWludCB0aW1lb3V0OwpAQCAtMzc4LDggKzM1OCw2IEBACiAgKiBAZF9pZDogZGVzdGluaWF0aW9uIGlkIG9mIHBvcnQgd2hlcmUgcmVxdWVzdCBpcyBzZW50IHRvCiAgKiBAcmVxOiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciByZXF1ZXN0CiAgKiBAcmVzcDogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgcmVzcG9uc2UKLSAqIEByZXFfY291bnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiByZXF1ZXN0IHNjYXR0ZXItZ2F0aGVyIGxpc3QKLSAqIEByZXNwX2NvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gcmVzcG9uc2Ugc2NhdHRlci1nYXRoZXIgbGlzdAogICogQGhhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gKGNhbGxlZCBmb3IgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3QpCiAgKiBAaGFuZGxlcl9kYXRhOiBkYXRhIHBhc3NlZCB0byBoYW5kbGVyIGZ1bmN0aW9uCiAgKiBAY29tcGxldGlvbjogY29tcGxldGlvbiBmb3Igc3luY2hyb25pemF0aW9uIHB1cnBvc2VzCkBAIC0zOTIsOCArMzcwLDYgQEAKIAl1MzIgZF9pZDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJlcTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJlc3A7Ci0JdW5zaWduZWQgaW50IHJlcV9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcmVzcF9jb3VudDsKIAl2b2lkICgqaGFuZGxlcikodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGVyX2RhdGE7CiAJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb247CkBAIC00NTEsNyArNDI3LDYgQEAKIH07CiAKIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsgICAgICAgICAgICAgIC8qIGxpc3Qgb2YgYWRhcHRlcnMgKi8KIAlhdG9taWNfdCAgICAgICAgICAgICAgICByZWZjb3VudDsgICAgICAgICAgLyogcmVmZXJlbmNlIGNvdW50ICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJcmVtb3ZlX3dxOyAgICAgICAgIC8qIGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yCiAJCQkJCQkgICAgICByZWZjb3VudCBkcm9wIHRvIHplcm8gKi8KQEAgLTU5MywxNiArNTY4LDExIEBACiBzdHJ1Y3QgemZjcF9kYXRhIHsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNjc2lfaG9zdF90ZW1wbGF0ZTsKIAlzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlOwotCXN0cnVjdCBsaXN0X2hlYWQJYWRhcHRlcl9saXN0X2hlYWQ7ICAvKiBoZWFkIG9mIGFkYXB0ZXIgbGlzdCAqLwogCXJ3bG9ja190ICAgICAgICAgICAgICAgIGNvbmZpZ19sb2NrOyAgICAgICAgLyogc2VyaWFsaXNlcyBjaGFuZ2VzCiAJCQkJCQkgICAgICAgdG8gYWRhcHRlci9wb3J0L3VuaXQKIAkJCQkJCSAgICAgICBsaXN0cyAqLwogCXN0cnVjdCBzZW1hcGhvcmUgICAgICAgIGNvbmZpZ19zZW1hOyAgICAgICAgLyogc2VyaWFsaXNlcyBjb25maWd1cmF0aW9uCiAJCQkJCQkgICAgICAgY2hhbmdlcyAqLwotCWF0b21pY190CQlsb2dsZXZlbDsgICAgICAgICAgICAvKiBjdXJyZW50IGxvZ2xldmVsICovCi0JY2hhcgkJCWluaXRfYnVzaWRbMjBdOwotCXU2NAkJCWluaXRfd3dwbjsKLQl1NjQJCQlpbml0X2ZjcF9sdW47CiAJc3RydWN0IGttZW1fY2FjaGUJKmZzZl9yZXFfcXRjYl9jYWNoZTsKIAlzdHJ1Y3Qga21lbV9jYWNoZQkqc3JfYnVmZmVyX2NhY2hlOwogCXN0cnVjdCBrbWVtX2NhY2hlCSpnaWRfcG5fY2FjaGU7CkBAIC02MjMsOCArNTkzLDYgQEAKICNkZWZpbmUgWkZDUF9TRVQgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAogI2RlZmluZSBaRkNQX0NMRUFSICAgICAgICAgICAgICAweDAwMDAwMjAwCiAKLSNkZWZpbmUgemZjcF9nZXRfYnVzaWRfYnlfYWRhcHRlcihhZGFwdGVyKSAoZGV2X25hbWUoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldikpCi0KIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciByZXF1ZXN0IElEIG1hbmFnZW1lbnQuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCmluZGV4IDRlZDQ5NTAuLjM4N2EzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwpAQCAtODQwLDcgKzg0MCw2IEBACiAJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CiAJfQogCXBvcnQtPmRfaWQgPSBhZGFwdGVyLT5wZWVyX2RfaWQ7Ci0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX1BPUlRfRElEX0RJRCwgJnBvcnQtPnN0YXR1cyk7CiAJcmV0dXJuIHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9wb3J0KGFjdCk7CiB9CiAKQEAgLTg3MSwxMiArODcwLDEyIEBACiAJY2FzZSBaRkNQX0VSUF9TVEVQX1BPUlRfQ0xPU0lORzoKIAkJaWYgKGZjX2hvc3RfcG9ydF90eXBlKGFkYXB0ZXItPnNjc2lfaG9zdCkgPT0gRkNfUE9SVFRZUEVfUFRQKQogCQkJcmV0dXJuIHpmY3BfZXJwX29wZW5fcHRwX3BvcnQoYWN0KTsKLQkJaWYgKCEocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQpKSB7CisJCWlmICghcG9ydC0+ZF9pZCkgewogCQkJcXVldWVfd29yayh6ZmNwX2RhdGEud29ya19xdWV1ZSwgJnBvcnQtPmdpZF9wbl93b3JrKTsKIAkJCXJldHVybiBaRkNQX0VSUF9DT05USU5VRVM7CiAJCX0KIAljYXNlIFpGQ1BfRVJQX1NURVBfTkFNRVNFUlZFUl9MT09LVVA6Ci0JCWlmICghKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9ESURfRElEKSkgeworCQlpZiAoIXBvcnQtPmRfaWQpIHsKIAkJCWlmIChwX3N0YXR1cyAmIChaRkNQX1NUQVRVU19QT1JUX0lOVkFMSURfV1dQTikpIHsKIAkJCQl6ZmNwX2VycF9wb3J0X2ZhaWxlZChwb3J0LCAyNiwgTlVMTCk7CiAJCQkJcmV0dXJuIFpGQ1BfRVJQX0VYSVQ7CkBAIC04ODgsNyArODg3LDcgQEAKIAljYXNlIFpGQ1BfRVJQX1NURVBfUE9SVF9PUEVOSU5HOgogCQkvKiBEX0lEIG1pZ2h0IGhhdmUgY2hhbmdlZCBkdXJpbmcgb3BlbiAqLwogCQlpZiAocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19DT01NT05fT1BFTikgewotCQkJaWYgKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9ESURfRElEKQorCQkJaWYgKHBvcnQtPmRfaWQpCiAJCQkJcmV0dXJuIFpGQ1BfRVJQX1NVQ0NFRURFRDsKIAkJCWVsc2UgewogCQkJCWFjdC0+c3RlcCA9IFpGQ1BfRVJQX1NURVBfUE9SVF9DTE9TSU5HOwpAQCAtMTM4NSw2ICsxMzg0LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwogCXN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmFjdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZ25vcmU7CiAKIAlkYWVtb25pemUoInpmY3BlcnAlcyIsIGRldl9uYW1lKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYpKTsKIAkvKiBCbG9jayBhbGwgc2lnbmFscyAqLwpAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAkJfQogCiAJCXpmY3BfcmVjX2RiZl9ldmVudF90aHJlYWRfbG9jayg0LCBhZGFwdGVyKTsKLQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5lcnBfcmVhZHlfc2VtKTsKKwkJaWdub3JlID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5lcnBfcmVhZHlfc2VtKTsKIAkJemZjcF9yZWNfZGJmX2V2ZW50X3RocmVhZF9sb2NrKDUsIGFkYXB0ZXIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jCmluZGV4IGYwMDlmMmEuLmVhYmRmZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmMKQEAgLTExLDYgKzExLDIwIEBACiAKICNpbmNsdWRlICJ6ZmNwX2V4dC5oIgogCitlbnVtIHJzY25fYWRkcmVzc19mb3JtYXQgeworCVJTQ05fUE9SVF9BRERSRVNTCT0gMHgwLAorCVJTQ05fQVJFQV9BRERSRVNTCT0gMHgxLAorCVJTQ05fRE9NQUlOX0FERFJFU1MJPSAweDIsCisJUlNDTl9GQUJSSUNfQUREUkVTUwk9IDB4MywKK307CisKK3N0YXRpYyB1MzIgcnNjbl9yYW5nZV9tYXNrW10gPSB7CisJW1JTQ05fUE9SVF9BRERSRVNTXQkJPSAweEZGRkZGRiwKKwlbUlNDTl9BUkVBX0FERFJFU1NdCQk9IDB4RkZGRjAwLAorCVtSU0NOX0RPTUFJTl9BRERSRVNTXQkJPSAweEZGMDAwMCwKKwlbUlNDTl9GQUJSSUNfQUREUkVTU10JCT0gMHgwMDAwMDAsCit9OworCiBzdHJ1Y3QgY3RfaXVfZ3BuX2Z0X3JlcSB7CiAJc3RydWN0IGN0X2hkciBoZWFkZXI7CiAJdTggZmxhZ3M7CkBAIC0yNiw5ICs0MCwxMiBAQAogCXU2NCB3d3BuOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLSNkZWZpbmUgWkZDUF9HUE5fRlRfRU5UUklFUyAoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY3RfaGRyKSkgXAotCQkJCS8gc2l6ZW9mKHN0cnVjdCBncG5fZnRfcmVzcF9hY2MpKQorI2RlZmluZSBaRkNQX0NUX1NJWkVfT05FX1BBR0UJKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgY3RfaGRyKSkKKyNkZWZpbmUgWkZDUF9HUE5fRlRfRU5UUklFUwkoWkZDUF9DVF9TSVpFX09ORV9QQUdFIFwKKwkJCQkJLyBzaXplb2Yoc3RydWN0IGdwbl9mdF9yZXNwX2FjYykpCiAjZGVmaW5lIFpGQ1BfR1BOX0ZUX0JVRkZFUlMgNAorI2RlZmluZSBaRkNQX0dQTl9GVF9NQVhfU0laRSAoWkZDUF9HUE5fRlRfQlVGRkVSUyAqIFBBR0VfU0laRSBcCisJCQkJLSBzaXplb2Yoc3RydWN0IGN0X2hkcikpCiAjZGVmaW5lIFpGQ1BfR1BOX0ZUX01BWF9FTlRSSUVTIFpGQ1BfR1BOX0ZUX0JVRkZFUlMgKiAoWkZDUF9HUE5fRlRfRU5UUklFUyArIDEpCiAKIHN0cnVjdCBjdF9pdV9ncG5fZnRfcmVzcCB7CkBAIC0xNjAsMjIgKzE3Nyw3IEBACiAJZm9yIChpID0gMTsgaSA8IG5vX2VudHJpZXM7IGkrKykgewogCQkvKiBza2lwIGhlYWQgYW5kIHN0YXJ0IHdpdGggMXN0IGVsZW1lbnQgKi8KIAkJZmNwX3JzY25fZWxlbWVudCsrOwotCQlzd2l0Y2ggKGZjcF9yc2NuX2VsZW1lbnQtPmFkZHJfZm9ybWF0KSB7Ci0JCWNhc2UgWkZDUF9QT1JUX0FERFJFU1M6Ci0JCQlyYW5nZV9tYXNrID0gWkZDUF9QT1JUU19SQU5HRV9QT1JUOwotCQkJYnJlYWs7Ci0JCWNhc2UgWkZDUF9BUkVBX0FERFJFU1M6Ci0JCQlyYW5nZV9tYXNrID0gWkZDUF9QT1JUU19SQU5HRV9BUkVBOwotCQkJYnJlYWs7Ci0JCWNhc2UgWkZDUF9ET01BSU5fQUREUkVTUzoKLQkJCXJhbmdlX21hc2sgPSBaRkNQX1BPUlRTX1JBTkdFX0RPTUFJTjsKLQkJCWJyZWFrOwotCQljYXNlIFpGQ1BfRkFCUklDX0FERFJFU1M6Ci0JCQlyYW5nZV9tYXNrID0gWkZDUF9QT1JUU19SQU5HRV9GQUJSSUM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWNvbnRpbnVlOwotCQl9CisJCXJhbmdlX21hc2sgPSByc2NuX3JhbmdlX21hc2tbZmNwX3JzY25fZWxlbWVudC0+YWRkcl9mb3JtYXRdOwogCQlfemZjcF9mY19pbmNvbWluZ19yc2NuKGZzZl9yZXEsIHJhbmdlX21hc2ssIGZjcF9yc2NuX2VsZW1lbnQpOwogCX0KIAlzY2hlZHVsZV93b3JrKCZmc2ZfcmVxLT5hZGFwdGVyLT5zY2FuX3dvcmspOwpAQCAtMjY2LDcgKzI2OCw2IEBACiAJCXJldHVybjsKIAkvKiBsb29rcyBsaWtlIGEgdmFsaWQgZF9pZCAqLwogCXBvcnQtPmRfaWQgPSBjdF9pdV9yZXNwLT5kX2lkICYgWkZDUF9ESURfTUFTSzsKLQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfUE9SVF9ESURfRElELCAmcG9ydC0+c3RhdHVzKTsKIH0KIAogaW50IHN0YXRpYyB6ZmNwX2ZjX25zX2dpZF9wbl9yZXF1ZXN0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmVycF9hY3Rpb24sCkBAIC0yODQsOCArMjg1LDYgQEAKIAlnaWRfcG4tPmN0LnRpbWVvdXQgPSBaRkNQX05TX0dJRF9QTl9USU1FT1VUOwogCWdpZF9wbi0+Y3QucmVxID0gJmdpZF9wbi0+cmVxOwogCWdpZF9wbi0+Y3QucmVzcCA9ICZnaWRfcG4tPnJlc3A7Ci0JZ2lkX3BuLT5jdC5yZXFfY291bnQgPSAxOwotCWdpZF9wbi0+Y3QucmVzcF9jb3VudCA9IDE7CiAJc2dfaW5pdF9vbmUoJmdpZF9wbi0+cmVxLCAmZ2lkX3BuLT5jdF9pdV9yZXEsCiAJCSAgICBzaXplb2Yoc3RydWN0IGN0X2l1X2dpZF9wbl9yZXEpKTsKIAlzZ19pbml0X29uZSgmZ2lkX3BuLT5yZXNwLCAmZ2lkX3BuLT5jdF9pdV9yZXNwLApAQCAtMjk3LDcgKzI5Niw3IEBACiAJZ2lkX3BuLT5jdF9pdV9yZXEuaGVhZGVyLmdzX3N1YnR5cGUgPSBaRkNQX0NUX05BTUVfU0VSVkVSOwogCWdpZF9wbi0+Y3RfaXVfcmVxLmhlYWRlci5vcHRpb25zID0gWkZDUF9DVF9TWU5DSFJPTk9VUzsKIAlnaWRfcG4tPmN0X2l1X3JlcS5oZWFkZXIuY21kX3JzcF9jb2RlID0gWkZDUF9DVF9HSURfUE47Ci0JZ2lkX3BuLT5jdF9pdV9yZXEuaGVhZGVyLm1heF9yZXNfc2l6ZSA9IFpGQ1BfQ1RfTUFYX1NJWkU7CisJZ2lkX3BuLT5jdF9pdV9yZXEuaGVhZGVyLm1heF9yZXNfc2l6ZSA9IFpGQ1BfQ1RfU0laRV9PTkVfUEFHRSAvIDQ7CiAJZ2lkX3BuLT5jdF9pdV9yZXEud3dwbiA9IGVycF9hY3Rpb24tPnBvcnQtPnd3cG47CiAKIAlpbml0X2NvbXBsZXRpb24oJmNvbXBsX3JlYy5kb25lKTsKQEAgLTQwNyw4ICs0MDYsNiBAQAogCXNnX2luaXRfb25lKGFkaXNjLT5lbHMucmVzcCwgJmFkaXNjLT5sc19hZGlzY19hY2MsCiAJCSAgICBzaXplb2Yoc3RydWN0IHpmY3BfbHNfYWRpc2MpKTsKIAotCWFkaXNjLT5lbHMucmVxX2NvdW50ID0gMTsKLQlhZGlzYy0+ZWxzLnJlc3BfY291bnQgPSAxOwogCWFkaXNjLT5lbHMuYWRhcHRlciA9IGFkYXB0ZXI7CiAJYWRpc2MtPmVscy5wb3J0ID0gcG9ydDsKIAlhZGlzYy0+ZWxzLmRfaWQgPSBwb3J0LT5kX2lkOwpAQCAtNDQ4LDE3ICs0NDUsMTcgQEAKIAkJemZjcF9lcnBfcG9ydF9mb3JjZWRfcmVvcGVuKHBvcnQsIDAsIDY1LCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgemZjcF9mcmVlX3NnX2VudihzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdCkKK3N0YXRpYyB2b2lkIHpmY3BfZnJlZV9zZ19lbnYoc3RydWN0IHpmY3BfZ3BuX2Z0ICpncG5fZnQsIGludCBidWZfbnVtKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZ3BuX2Z0LT5zZ19yZXE7CiAKIAlrZnJlZShzZ192aXJ0KHNnKSk7IC8qIGZyZWUgcmVxdWVzdCBidWZmZXIgKi8KLQl6ZmNwX3NnX2ZyZWVfdGFibGUoZ3BuX2Z0LT5zZ19yZXNwLCBaRkNQX0dQTl9GVF9CVUZGRVJTKTsKKwl6ZmNwX3NnX2ZyZWVfdGFibGUoZ3BuX2Z0LT5zZ19yZXNwLCBidWZfbnVtKTsKIAogCWtmcmVlKGdwbl9mdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgemZjcF9ncG5fZnQgKnpmY3BfYWxsb2Nfc2dfZW52KHZvaWQpCitzdGF0aWMgc3RydWN0IHpmY3BfZ3BuX2Z0ICp6ZmNwX2FsbG9jX3NnX2VudihpbnQgYnVmX251bSkKIHsKIAlzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdDsKIAlzdHJ1Y3QgY3RfaXVfZ3BuX2Z0X3JlcSAqcmVxOwpAQCAtNDc1LDggKzQ3Miw4IEBACiAJfQogCXNnX2luaXRfb25lKCZncG5fZnQtPnNnX3JlcSwgcmVxLCBzaXplb2YoKnJlcSkpOwogCi0JaWYgKHpmY3Bfc2dfc2V0dXBfdGFibGUoZ3BuX2Z0LT5zZ19yZXNwLCBaRkNQX0dQTl9GVF9CVUZGRVJTKSkgewotCQl6ZmNwX2ZyZWVfc2dfZW52KGdwbl9mdCk7CisJaWYgKHpmY3Bfc2dfc2V0dXBfdGFibGUoZ3BuX2Z0LT5zZ19yZXNwLCBidWZfbnVtKSkgeworCQl6ZmNwX2ZyZWVfc2dfZW52KGdwbl9mdCwgYnVmX251bSk7CiAJCWdwbl9mdCA9IE5VTEw7CiAJfQogb3V0OgpAQCAtNDg1LDcgKzQ4Miw4IEBACiAKIAogc3RhdGljIGludCB6ZmNwX3NjYW5faXNzdWVfZ3BuX2Z0KHN0cnVjdCB6ZmNwX2dwbl9mdCAqZ3BuX2Z0LAotCQkJCSAgc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKKwkJCQkgIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICBpbnQgbWF4X2J5dGVzKQogewogCXN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0ID0gJmdwbl9mdC0+Y3Q7CiAJc3RydWN0IGN0X2l1X2dwbl9mdF9yZXEgKnJlcSA9IHNnX3ZpcnQoJmdwbl9mdC0+c2dfcmVxKTsKQEAgLTQ5OCw4ICs0OTYsNyBAQAogCXJlcS0+aGVhZGVyLmdzX3N1YnR5cGUgPSBaRkNQX0NUX05BTUVfU0VSVkVSOwogCXJlcS0+aGVhZGVyLm9wdGlvbnMgPSBaRkNQX0NUX1NZTkNIUk9OT1VTOwogCXJlcS0+aGVhZGVyLmNtZF9yc3BfY29kZSA9IFpGQ1BfQ1RfR1BOX0ZUOwotCXJlcS0+aGVhZGVyLm1heF9yZXNfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGdwbl9mdF9yZXNwX2FjYykgKgotCQkJCQkoWkZDUF9HUE5fRlRfTUFYX0VOVFJJRVMgLSAxKSkgPj4gMjsKKwlyZXEtPmhlYWRlci5tYXhfcmVzX3NpemUgPSBtYXhfYnl0ZXMgLyA0OwogCXJlcS0+ZmxhZ3MgPSAwOwogCXJlcS0+ZG9tYWluX2lkX3Njb3BlID0gMDsKIAlyZXEtPmFyZWFfaWRfc2NvcGUgPSAwOwpAQCAtNTEyLDggKzUwOSw2IEBACiAJY3QtPnRpbWVvdXQgPSAxMDsKIAljdC0+cmVxID0gJmdwbl9mdC0+c2dfcmVxOwogCWN0LT5yZXNwID0gZ3BuX2Z0LT5zZ19yZXNwOwotCWN0LT5yZXFfY291bnQgPSAxOwotCWN0LT5yZXNwX2NvdW50ID0gWkZDUF9HUE5fRlRfQlVGRkVSUzsKIAogCWluaXRfY29tcGxldGlvbigmY29tcGxfcmVjLmRvbmUpOwogCWNvbXBsX3JlYy5oYW5kbGVyID0gTlVMTDsKQEAgLTU0MCw3ICs1MzUsNyBAQAogCXpmY3BfcG9ydF9kZXF1ZXVlKHBvcnQpOwogfQogCi1zdGF0aWMgaW50IHpmY3Bfc2Nhbl9ldmFsX2dwbl9mdChzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdCkKK3N0YXRpYyBpbnQgemZjcF9zY2FuX2V2YWxfZ3BuX2Z0KHN0cnVjdCB6ZmNwX2dwbl9mdCAqZ3BuX2Z0LCBpbnQgbWF4X2VudHJpZXMpCiB7CiAJc3RydWN0IHpmY3Bfc2VuZF9jdCAqY3QgPSAmZ3BuX2Z0LT5jdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gZ3BuX2Z0LT5zZ19yZXNwOwpAQCAtNTYwLDEzICs1NTUsMTcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKGhkci0+bWF4X3Jlc19zaXplKQorCWlmIChoZHItPm1heF9yZXNfc2l6ZSkgeworCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQkJICJUaGUgbmFtZSBzZXJ2ZXIgcmVwb3J0ZWQgJWQgd29yZHMgcmVzaWR1YWwgZGF0YVxuIiwKKwkJCSBoZHItPm1heF9yZXNfc2l6ZSk7CiAJCXJldHVybiAtRTJCSUc7CisJfQogCiAJZG93bigmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKIAogCS8qIGZpcnN0IGVudHJ5IGlzIHRoZSBoZWFkZXIgKi8KLQlmb3IgKHggPSAxOyB4IDwgWkZDUF9HUE5fRlRfTUFYX0VOVFJJRVMgJiYgIWxhc3Q7IHgrKykgeworCWZvciAoeCA9IDE7IHggPCBtYXhfZW50cmllcyAmJiAhbGFzdDsgeCsrKSB7CiAJCWlmICh4ICUgKFpGQ1BfR1BOX0ZUX0VOVFJJRVMgKyAxKSkKIAkJCWFjYysrOwogCQllbHNlCkBAIC01ODksNyArNTg4LDYgQEAKIAkJfQogCiAJCXBvcnQgPSB6ZmNwX3BvcnRfZW5xdWV1ZShhZGFwdGVyLCBhY2MtPnd3cG4sCi0JCQkJCSBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQgfAogCQkJCQkgWkZDUF9TVEFUVVNfQ09NTU9OX05PRVNDLCBkX2lkKTsKIAkJaWYgKElTX0VSUihwb3J0KSkKIAkJCXJldCA9IFBUUl9FUlIocG9ydCk7CkBAIC02MTIsNiArNjEwLDEyIEBACiB7CiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdDsKKwlpbnQgY2hhaW4sIG1heF9lbnRyaWVzLCBidWZfbnVtLCBtYXhfYnl0ZXM7CisKKwljaGFpbiA9IGFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9FTFNfQ1RfQ0hBSU5FRF9TQkFMUzsKKwlidWZfbnVtID0gY2hhaW4gPyBaRkNQX0dQTl9GVF9CVUZGRVJTIDogMTsKKwltYXhfZW50cmllcyA9IGNoYWluID8gWkZDUF9HUE5fRlRfTUFYX0VOVFJJRVMgOiBaRkNQX0dQTl9GVF9FTlRSSUVTOworCW1heF9ieXRlcyA9IGNoYWluID8gWkZDUF9HUE5fRlRfTUFYX1NJWkUgOiBaRkNQX0NUX1NJWkVfT05FX1BBR0U7CiAKIAlpZiAoZmNfaG9zdF9wb3J0X3R5cGUoYWRhcHRlci0+c2NzaV9ob3N0KSAhPSBGQ19QT1JUVFlQRV9OUE9SVCkKIAkJcmV0dXJuIDA7CkBAIC02MjAsMjMgKzYyNCwyMyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlncG5fZnQgPSB6ZmNwX2FsbG9jX3NnX2VudigpOworCWdwbl9mdCA9IHpmY3BfYWxsb2Nfc2dfZW52KGJ1Zl9udW0pOwogCWlmICghZ3BuX2Z0KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJcmV0ID0gemZjcF9zY2FuX2lzc3VlX2dwbl9mdChncG5fZnQsIGFkYXB0ZXIpOworCQlyZXQgPSB6ZmNwX3NjYW5faXNzdWVfZ3BuX2Z0KGdwbl9mdCwgYWRhcHRlciwgbWF4X2J5dGVzKTsKIAkJaWYgKCFyZXQpIHsKLQkJCXJldCA9IHpmY3Bfc2Nhbl9ldmFsX2dwbl9mdChncG5fZnQpOworCQkJcmV0ID0gemZjcF9zY2FuX2V2YWxfZ3BuX2Z0KGdwbl9mdCwgbWF4X2VudHJpZXMpOwogCQkJaWYgKHJldCA9PSAtRUFHQUlOKQogCQkJCXNzbGVlcCgxKTsKIAkJCWVsc2UKIAkJCQlicmVhazsKIAkJfQogCX0KLQl6ZmNwX2ZyZWVfc2dfZW52KGdwbl9mdCk7CisJemZjcF9mcmVlX3NnX2VudihncG5fZnQsIGJ1Zl9udW0pOwogb3V0OgogCXpmY3Bfd2thX3BvcnRfcHV0KCZhZGFwdGVyLT5uc3ApOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwppbmRleCA5YzcyZTA4Li5lNjQxNmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKQEAgLTY0NCwzOCArNjQ0LDM4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHpmY3BfZnNmX3NiYWxfY2hlY2soc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgemZjcF9mc2Zfc2JhbF9hdmFpbGFibGUoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpyZXFfcSA9ICZhZGFwdGVyLT5yZXFfcTsKLQotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZyZXFfcS0+Y291bnQpKQorCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVxX3EuY291bnQpID4gMCkKIAkJcmV0dXJuIDE7Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOworCWF0b21pY19pbmMoJmFkYXB0ZXItPnFkaW9fb3V0Yl9mdWxsKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB6ZmNwX2ZzZl9zYmFsX2F2YWlsYWJsZShzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyKQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZXFfcS5jb3VudCk7Ci0JaWYgKCFjb3VudCkKLQkJYXRvbWljX2luYygmYWRhcHRlci0+cWRpb19vdXRiX2Z1bGwpOwotCXJldHVybiBjb3VudCA+IDA7Ci19Ci0KIHN0YXRpYyBpbnQgemZjcF9mc2ZfcmVxX3NiYWxfZ2V0KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCisJX19yZWxlYXNlcygmYWRhcHRlci0+cmVxX3FfbG9jaykKKwlfX2FjcXVpcmVzKCZhZGFwdGVyLT5yZXFfcV9sb2NrKQogeworCXN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgKnJlcV9xID0gJmFkYXB0ZXItPnJlcV9xOwogCWxvbmcgcmV0OwogCisJaWYgKGF0b21pY19yZWFkKCZyZXFfcS0+Y291bnQpIDw9IC1SRVFVRVNUX0xJU1RfU0laRSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGF0b21pY19yZWFkKCZyZXFfcS0+Y291bnQpID4gMCkKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfZGVjKCZyZXFfcS0+Y291bnQpOwogCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhZGFwdGVyLT5yZXF1ZXN0X3dxLAotCQkJCQl6ZmNwX2ZzZl9zYmFsX2NoZWNrKGFkYXB0ZXIpLCA1ICogSFopOworCQkJCQlhdG9taWNfcmVhZCgmcmVxX3EtPmNvdW50KSA+PSAwLAorCQkJCQk1ICogSFopOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CisJYXRvbWljX2luYygmcmVxX3EtPmNvdW50KTsKKwogCWlmIChyZXQgPiAwKQogCQlyZXR1cm4gMDsKIAlpZiAoIXJldCkKIAkJYXRvbWljX2luYygmYWRhcHRlci0+cWRpb19vdXRiX2Z1bGwpOwotCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTAxMywxMiArMTAxMywyOSBAQAogCQlzZW5kX2N0LT5oYW5kbGVyKHNlbmRfY3QtPmhhbmRsZXJfZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgemZjcF9mc2Zfc2V0dXBfc2JhbHMoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxLAotCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVxLAotCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVzcCwgaW50IG1heF9zYmFscykKK3N0YXRpYyBpbnQgemZjcF9mc2Zfc2V0dXBfY3RfZWxzX3NiYWxzKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSwKKwkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19yZXEsCisJCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVzcCwKKwkJCQkgICAgICAgaW50IG1heF9zYmFscykKIHsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHJlcSk7CisJdTMyIGZlYXQgPSByZXEtPmFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXM7CiAJaW50IGJ5dGVzOwogCisJaWYgKCEoZmVhdCAmIEZTRl9GRUFUVVJFX0VMU19DVF9DSEFJTkVEX1NCQUxTKSkgeworCQlpZiAoc2dfcmVxLT5sZW5ndGggPiBQQUdFX1NJWkUgfHwgc2dfcmVzcC0+bGVuZ3RoID4gUEFHRV9TSVpFIHx8CisJCSAgICAhc2dfaXNfbGFzdChzZ19yZXEpIHx8ICFzZ19pc19sYXN0KHNnX3Jlc3ApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCXNiYWxlWzBdLmZsYWdzIHw9IFNCQUxfRkxBR1MwX1RZUEVfV1JJVEVfUkVBRDsKKwkJc2JhbGVbMl0uYWRkciAgID0gc2dfdmlydChzZ19yZXEpOworCQlzYmFsZVsyXS5sZW5ndGggPSBzZ19yZXEtPmxlbmd0aDsKKwkJc2JhbGVbM10uYWRkciAgID0gc2dfdmlydChzZ19yZXNwKTsKKwkJc2JhbGVbM10ubGVuZ3RoID0gc2dfcmVzcC0+bGVuZ3RoOworCQlzYmFsZVszXS5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CisJCXJldHVybiAwOworCX0KKwogCWJ5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocmVxLCBTQkFMX0ZMQUdTMF9UWVBFX1dSSVRFX1JFQUQsCiAJCQkJCXNnX3JlcSwgbWF4X3NiYWxzKTsKIAlpZiAoYnl0ZXMgPD0gMCkKQEAgLTEwNjAsOCArMTA3Nyw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHpmY3BfZnNmX3NldHVwX3NiYWxzKHJlcSwgY3QtPnJlcSwgY3QtPnJlc3AsCi0JCQkJICAgRlNGX01BWF9TQkFMU19QRVJfUkVRKTsKKwlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfc2JhbHMocmVxLCBjdC0+cmVxLCBjdC0+cmVzcCwKKwkJCQkJICBGU0ZfTUFYX1NCQUxTX1BFUl9SRVEpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkX3NlbmQ7CiAKQEAgLTExNzEsNyArMTE4OCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHpmY3BfZnNmX3NldHVwX3NiYWxzKHJlcSwgZWxzLT5yZXEsIGVscy0+cmVzcCwgMik7CisJcmV0ID0gemZjcF9mc2Zfc2V0dXBfY3RfZWxzX3NiYWxzKHJlcSwgZWxzLT5yZXEsIGVscy0+cmVzcCwgMik7CiAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxlZF9zZW5kOwpAQCAtMTQwNiwxMyArMTQyMyw3IEBACiAJCXN3aXRjaCAoaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwud29yZFswXSkgewogCQljYXNlIEZTRl9TUV9JTlZPS0VfTElOS19URVNUX1BST0NFRFVSRToKIAkJY2FzZSBGU0ZfU1FfVUxQX0RFUEVOREVOVF9FUlBfUkVRVUlSRUQ6Ci0JCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7Ci0JCQlicmVhazsKIAkJY2FzZSBGU0ZfU1FfTk9fUkVUUllfUE9TU0lCTEU6Ci0JCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJICJSZW1vdGUgcG9ydCAweCUwMTZMeCBjb3VsZCBub3QgYmUgb3BlbmVkXG4iLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwotCQkJemZjcF9lcnBfcG9ydF9mYWlsZWQocG9ydCwgMzIsIHJlcSk7CiAJCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCQlicmVhazsKIAkJfQpAQCAtMTQ0MCwxMCArMTQ1MSwxMCBAQAogCQkgKiBBbHRlcm5hdGVseSwgYW4gQURJU0MvUERJU0MgRUxTIHNob3VsZCBzdWZmaWNlLCBhcyB3ZWxsLgogCQkgKi8KIAkJcGxvZ2kgPSAoc3RydWN0IGZzZl9wbG9naSAqKSByZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LmVsczsKLQkJaWYgKHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzMV9sZW5ndGggPj0gc2l6ZW9mKCpwbG9naSkpIHsKKwkJaWYgKHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzMV9sZW5ndGggPj0KKwkJICAgIEZTRl9QTE9HSV9NSU5fTEVOKSB7CiAJCQlpZiAocGxvZ2ktPnNlcnZfcGFyYW0ud3dwbiAhPSBwb3J0LT53d3BuKQotCQkJCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX1BPUlRfRElEX0RJRCwKLQkJCQkJCSAgJnBvcnQtPnN0YXR1cyk7CisJCQkJcG9ydC0+ZF9pZCA9IDA7CiAJCQllbHNlIHsKIAkJCQlwb3J0LT53d25uID0gcGxvZ2ktPnNlcnZfcGFyYW0ud3dubjsKIAkJCQl6ZmNwX2ZjX3Bsb2dpX2V2YWx1YXRlKHBvcnQsIHBsb2dpKTsKQEAgLTE5MDcsNyArMTkxOCw3IEBACiAJCQkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAogCQkJCQkiU2hhcmVkIHJlYWQtd3JpdGUgYWNjZXNzIG5vdCAiCiAJCQkJCSJzdXBwb3J0ZWQgKHVuaXQgMHglMDE2THgsIHBvcnQgIgotCQkJCQkiMHglMDE2THhcbikiLAorCQkJCQkiMHglMDE2THgpXG4iLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+cG9ydC0+d3dwbik7CiAJCQkJemZjcF9lcnBfdW5pdF9mYWlsZWQodW5pdCwgMzYsIHJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaAppbmRleCBmYTJhMzE3Li44YmIyMDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKQEAgLTE2NCw2ICsxNjQsNyBAQAogI2RlZmluZSBGU0ZfRkVBVFVSRV9MVU5fU0hBUklORwkJCTB4MDAwMDAwMDQKICNkZWZpbmUgRlNGX0ZFQVRVUkVfTk9USUZJQ0FUSU9OX0xPU1QJCTB4MDAwMDAwMDgKICNkZWZpbmUgRlNGX0ZFQVRVUkVfSEJBQVBJX01BTkFHRU1FTlQgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRlNGX0ZFQVRVUkVfRUxTX0NUX0NIQUlORURfU0JBTFMJMHgwMDAwMDAyMAogI2RlZmluZSBGU0ZfRkVBVFVSRV9VUERBVEVfQUxFUlQJCTB4MDAwMDAxMDAKICNkZWZpbmUgRlNGX0ZFQVRVUkVfTUVBU1VSRU1FTlRfREFUQQkJMHgwMDAwMDIwMAogCkBAIC0zMjIsNiArMzIzLDcgQEAKIAl1OCAgdmVuZG9yX3ZlcnNpb25fbGV2ZWxbMTZdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKyNkZWZpbmUgRlNGX1BMT0dJX01JTl9MRU4JMTEyCiBzdHJ1Y3QgZnNmX3Bsb2dpIHsKIAl1MzIgICAgY29kZTsKIAlzdHJ1Y3QgZnNmX25wb3J0X3NlcnZfcGFyYW0gc2Vydl9wYXJhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMKaW5kZXggZDNiNTVmYjYuLjMzZTBhMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJICogY29ycnVwdGlvbiBhbmQgbXVzdCBzdG9wIHRoZSBtYWNoaW5lIGltbWVkaWF0bHkuCiAJCSAqLwogCQlwYW5pYygiZXJyb3I6IHVua25vd24gcmVxdWVzdCBpZCAoJWx4KSBvbiBhZGFwdGVyICVzLlxuIiwKLQkJICAgICAgcmVxX2lkLCB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpKTsKKwkJICAgICAgcmVxX2lkLCBkZXZfbmFtZSgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2KSk7CiAKIAl6ZmNwX3JlcWxpc3RfcmVtb3ZlKGFkYXB0ZXIsIGZzZl9yZXEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnJlcV9saXN0X2xvY2ssIGZsYWdzKTsKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJaW5pdF9kYXRhLT5jZGV2ID0gYWRhcHRlci0+Y2N3X2RldmljZTsKIAlpbml0X2RhdGEtPnFfZm9ybWF0ID0gUURJT19aRkNQX1FGTVQ7Ci0JbWVtY3B5KGluaXRfZGF0YS0+YWRhcHRlcl9uYW1lLCB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpLCA4KTsKKwltZW1jcHkoaW5pdF9kYXRhLT5hZGFwdGVyX25hbWUsIGRldl9uYW1lKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYpLCA4KTsKIAlBU0NFQkMoaW5pdF9kYXRhLT5hZGFwdGVyX25hbWUsIDgpOwogCWluaXRfZGF0YS0+cWliX3BhcmFtX2ZpZWxkX2Zvcm1hdCA9IDA7CiAJaW5pdF9kYXRhLT5xaWJfcGFyYW1fZmllbGQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA0MDNlY2FkLi4xNTJkNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMzUyLDYgKzM1Miw4IEBACiAKIAkgaHR0cDovL29wZW4taXNjc2kub3JnCiAKK3NvdXJjZSAiZHJpdmVycy9zY3NpL2N4Z2IzaS9LY29uZmlnIgorCiBjb25maWcgU0dJV0Q5M19TQ1NJCiAJdHJpc3RhdGUgIlNHSSBXRDkzQzkzIFNDU0kgRHJpdmVyIgogCWRlcGVuZHMgb24gU0dJX0hBU19XRDkzICYmIFNDU0kKQEAgLTYwMyw2ICs2MDUsMTkgQEAKIAkgIHN1YnN0YW50aWFsLCBzbyB1c2VycyBvZiBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzIG1heSBub3QKIAkgIHdpc2ggdG8gaW5jbHVkZSBpdC4KIAorY29uZmlnIExJQkZDCisJdHJpc3RhdGUgIkxpYkZDIG1vZHVsZSIKKwlzZWxlY3QgU0NTSV9GQ19BVFRSUworCS0tLWhlbHAtLS0KKwkgIEZpYnJlIENoYW5uZWwgbGlicmFyeSBtb2R1bGUKKworY29uZmlnIEZDT0UKKwl0cmlzdGF0ZSAiRkNvRSBtb2R1bGUiCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgTElCRkMKKwktLS1oZWxwLS0tCisJICBGaWJyZSBDaGFubmVsIG92ZXIgRXRoZXJuZXQgbW9kdWxlCisKIGNvbmZpZyBTQ1NJX0RNWDMxOTFECiAJdHJpc3RhdGUgIkRNWDMxOTFEIFNDU0kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCkBAIC0xMzU3LDYgKzEzNzIsMTMgQEAKICAgICAgICAgICBUaGlzIGxwZmMgZHJpdmVyIHN1cHBvcnRzIHRoZSBFbXVsZXggTGlnaHRQdWxzZQogICAgICAgICAgIEZhbWlseSBvZiBGaWJyZSBDaGFubmVsIFBDSSBob3N0IGFkYXB0ZXJzLgogCitjb25maWcgU0NTSV9MUEZDX0RFQlVHX0ZTCisJYm9vbCAiRW11bGV4IExpZ2h0UHVsc2UgRmlicmUgQ2hhbm5lbCBkZWJ1Z2ZzIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX0xQRkMgJiYgREVCVUdfRlMKKwloZWxwCisJICBUaGlzIG1ha2VzIGRlYnVnZ2luZyBpbmZvbWF0aW9uIGZyb20gdGhlIGxwZmMgZHJpdmVyCisJICBhdmFpbGFibGUgdmlhIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0uCisKIGNvbmZpZyBTQ1NJX1NJTTcxMAogCXRyaXN0YXRlICJTaW1wbGUgNTNjNzEwIFNDU0kgc3VwcG9ydCAoQ29tcGFxLCBOQ1IgbWFjaGluZXMpIgogCWRlcGVuZHMgb24gKEVJU0EgfHwgTUNBKSAmJiBTQ1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKaW5kZXggNzJmZDUwNC4uMTQxMDY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtMzYsNyArMzYsOSBAQAogb2JqLSQoQ09ORklHX1NDU0lfU1JQX0FUVFJTKQkrPSBzY3NpX3RyYW5zcG9ydF9zcnAubwogb2JqLSQoQ09ORklHX1NDU0lfREgpCQkrPSBkZXZpY2VfaGFuZGxlci8KIAotb2JqLSQoQ09ORklHX0lTQ1NJX1RDUCkgCSs9IGxpYmlzY3NpLm8JaXNjc2lfdGNwLm8KK29iai0kKENPTkZJR19MSUJGQykJCSs9IGxpYmZjLworb2JqLSQoQ09ORklHX0ZDT0UpCQkrPSBmY29lLworb2JqLSQoQ09ORklHX0lTQ1NJX1RDUCkgCSs9IGxpYmlzY3NpLm8JbGliaXNjc2lfdGNwLm8gaXNjc2lfdGNwLm8KIG9iai0kKENPTkZJR19JTkZJTklCQU5EX0lTRVIpIAkrPSBsaWJpc2NzaS5vCiBvYmotJChDT05GSUdfU0NTSV9BNDAwMFQpCSs9IDUzYzcwMC5vCWE0MDAwdC5vCiBvYmotJChDT05GSUdfU0NTSV9aT1JSTzdYWCkJKz0gNTNjNzAwLm8Jem9ycm83eHgubwpAQCAtMTI0LDYgKzEyNiw3IEBACiBvYmotJChDT05GSUdfU0NTSV9TVEVYKQkJKz0gc3RleC5vCiBvYmotJChDT05GSUdfU0NTSV9NVlNBUykJKz0gbXZzYXMubwogb2JqLSQoQ09ORklHX1BTM19ST00pCQkrPSBwczNyb20ubworb2JqLSQoQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0kpCSs9IGxpYmlzY3NpLm8gbGliaXNjc2lfdGNwLm8gY3hnYjNpLwogCiBvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL05DUjUzODAuYwppbmRleCBlZWRkYmQxLi5mOTJkYTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqICRMb2c6IE5DUjUzODAuYyx2ICQKIAogICogUmV2aXNpb24gMS4xMCAxOTk4LzkvMglBbGFuIENveAotICoJCQkJKGFsYW5AcmVkaGF0LmNvbSkKKyAqCQkJCShhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCiAgKiBGaXhlZCB1cCB0aGUgdGltZXIgbG9ja3VwcyByZXBvcnRlZCBzbyBmYXIuIFRoaW5ncyBzdGlsbCBzdWNrLiBMb29raW5nIAogICogZm9yd2FyZCB0byAyLjMgYW5kIHBlciBkZXZpY2UgcmVxdWVzdCBxdWV1ZXMuIFRoZW4gaXQnbGwgYmUgcG9zc2libGUgdG8KICAqIFNNUCB0aHJlYWQgdGhpcyBiZWFzdCBhbmQgaW1wcm92ZSBsaWZlIG5vIGVuZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMgYi9kcml2ZXJzL3Njc2kvYTEwMHUydy5jCmluZGV4IDg0YmI2MTYuLjNjMjk4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpAQCAtNTQsNyArNTQsNyBAQAogICogOS8yOC8wNCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KICAqCSAgICAtIG1lcmdlIHRoZSB0d28gc291cmNlIGZpbGVzCiAgKgkgICAgLSByZW1vdmUgaW50ZXJuYWwgcXVldWVpbmcgY29kZQotICogMTQvMDYvMDcgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIDE0LzA2LzA3IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkgLSBHcmFuZCBjbGVhbnVwIGFuZCBMaW51eGlzYXRpb24KICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCmluZGV4IDhhYmZkMDYuLjkwZDFkMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCiAgKgogICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KICAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCmluZGV4IGE3MzU1MjYuLjAzOTFkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgotICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgogICoKICAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCiAgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCkBAIC05MCwxNCArOTAsMjQgQEAKIAlpZiAoc2l6ZSA8IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TZW5kZXJTaXplKSkKIAkJc2l6ZSA9IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TZW5kZXJTaXplKTsKIAlpZiAoc2l6ZSA+IGRldi0+bWF4X2ZpYl9zaXplKSB7CisJCWRtYV9hZGRyX3QgZGFkZHI7CisKIAkJaWYgKHNpemUgPiAyMDQ4KSB7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJZ290byBjbGVhbnVwOwogCQl9CisKKwkJa2ZpYiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZSwgJmRhZGRyKTsKKwkJaWYgKCFrZmliKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CisKIAkJLyogSGlnaGphY2sgdGhlIGh3X2ZpYiAqLwogCQlod19maWIgPSBmaWJwdHItPmh3X2ZpYl92YTsKIAkJaHdfZmliX3BhID0gZmlicHRyLT5od19maWJfcGE7Ci0JCWZpYnB0ci0+aHdfZmliX3ZhID0ga2ZpYiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZSwgJmZpYnB0ci0+aHdfZmliX3BhKTsKKwkJZmlicHRyLT5od19maWJfdmEgPSBrZmliOworCQlmaWJwdHItPmh3X2ZpYl9wYSA9IGRhZGRyOwogCQltZW1zZXQoKChjaGFyICopa2ZpYikgKyBkZXYtPm1heF9maWJfc2l6ZSwgMCwgc2l6ZSAtIGRldi0+bWF4X2ZpYl9zaXplKTsKIAkJbWVtY3B5KGtmaWIsIGh3X2ZpYiwgZGV2LT5tYXhfZmliX3NpemUpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCmluZGV4IGNiYWMwNjMuLjE2MzEwNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgotICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgogICoKICAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCiAgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKaW5kZXggMjg5MzA0YS4uZDI0YzI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgotICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgogICoKICAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCiAgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9kcGNzdXAuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jCmluZGV4IDkzM2YyMDguLmFiYzllZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCiAgKgogICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KICAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCmluZGV4IDk0YWNiZWUuLjM2ZDhhYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgotICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgogICoKICAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCiAgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCmluZGV4IDhjZDY1ODguLjE2ZDhkYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCiAgKgogICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KICAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCmluZGV4IDA3MzIwOGIuLmY3MGQ5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgotICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgogICoKICAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCiAgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYwppbmRleCBmYzFhNTU3Li5iNmEzYzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKLSAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4KICAqCiAgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgogICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAzOTlmZTU1Li4yZjYwMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMTM0MjUsOCArMTM0MjUsNyBAQAogCQl9CiAKIAkJYm9hcmRwLT5hc2Nfbl9pb19wb3J0ID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKLQkJYm9hcmRwLT5pb3JlbWFwX2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKLQkJCQkJICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisJCWJvYXJkcC0+aW9yZW1hcF9hZGRyID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDEpOwogCQlpZiAoIWJvYXJkcC0+aW9yZW1hcF9hZGRyKSB7CiAJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHNob3N0LCAiaW9yZW1hcCglbHgsICVkKSAiCiAJCQkJCSJyZXR1cm5lZCBOVUxMXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKaW5kZXggN2M0NWQ4OC4uZWQwZTNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYworKysgYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5jCkBAIC0yMiw3ICsyMiw3IEBACiAgKiBhaGExNzQwX21ha2Vjb2RlIG1heSBzdGlsbCBuZWVkIGV2ZW4gbW9yZSB3b3JrCiAgKiBpZiBpdCBkb2Vzbid0IHdvcmsgZm9yIHlvdXIgZGV2aWNlcywgdGFrZSBhIGxvb2suCiAgKgotICogUmV3b3JrZWQgZm9yIG5ld19laCBhbmQgbmV3IGxvY2tpbmcgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIFJld29ya2VkIGZvciBuZXdfZWggYW5kIG5ldyBsb2NraW5nIGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICogQ29udmVydGVkIHRvIEVJU0EgYW5kIGdlbmVyaWMgRE1BIEFQSXMgYnkgTWFyYyBaeW5naWVyCiAgKiA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+LCA0LzIwMDMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCmluZGV4IGY5MWY3OWMuLjEwNmMwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkJdWludDMyX3QgaW50bWFza19vcmc7CiAJCWludCBpLCBqOwogCi0JCWFjYi0+cG11QSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwkJYWNiLT5wbXVBID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCQlpZiAoIWFjYi0+cG11QSkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmNtc3IlZDogbWVtb3J5IG1hcHBpbmcgcmVnaW9uIGZhaWwgXG4iLAogCQkJCQkJCWFjYi0+aG9zdC0+aG9zdF9ubyk7CkBAIC0zMjksMTMgKzMyOSwxMSBAQAogCQlyZWcgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0IgKikoZG1hX2NvaGVyZW50ICsKIAkJQVJDTVNSX01BWF9GUkVFQ0NCX05VTSAqIHNpemVvZihzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaykpOwogCQlhY2ItPnBtdUIgPSByZWc7Ci0JCW1lbV9iYXNlMCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAotCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwkJbWVtX2Jhc2UwID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCQlpZiAoIW1lbV9iYXNlMCkKIAkJCWdvdG8gb3V0OwogCi0JCW1lbV9iYXNlMSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAotCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKKwkJbWVtX2Jhc2UxID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDIpOwogCQlpZiAoIW1lbV9iYXNlMSkgewogCQkJaW91bm1hcChtZW1fYmFzZTApOwogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRwODcwdS5jIGIvZHJpdmVycy9zY3NpL2F0cDg3MHUuYwppbmRleCA3ZDMxMTU0Li4yMGNhMGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXRwODcwdS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hdHA4NzB1LmMKQEAgLTEsOCArMSw4IEBACiAvKiAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTcJV3UgQ2hpbmcgQ2hlbgogICogIDIuMS54IHVwZGF0ZSAoQykgMTk5OCAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kKLSAqICAyLjUueCB1cGRhdGUgKEMpIDIwMDIgIFJlZCBIYXQgPGFsYW5AcmVkaGF0LmNvbT4KLSAqICAyLjYueCB1cGRhdGUgKEMpIDIwMDQgIFJlZCBIYXQgPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAyLjUueCB1cGRhdGUgKEMpIDIwMDIgIFJlZCBIYXQKKyAqICAyLjYueCB1cGRhdGUgKEMpIDIwMDQgIFJlZCBIYXQKICAqCiAgKiBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4gOiBTTVAgZml4ZXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY2guYyBiL2RyaXZlcnMvc2NzaS9jaC5jCmluZGV4IDg4ZWNmOTQuLmFmOTcyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9jaC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAogICAgICAgICByZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKGNoLT5kZXZpY2UsIGNtZCwgZGlyZWN0aW9uLCBidWZmZXIsCiAJCQkJICBidWZsZW5ndGgsICZzc2hkciwgdGltZW91dCAqIEhaLAotCQkJCSAgTUFYX1JFVFJJRVMpOworCQkJCSAgTUFYX1JFVFJJRVMsIE5VTEwpOwogCiAJZHByaW50aygicmVzdWx0OiAweCV4XG4iLHJlc3VsdCk7CiAJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvS2J1aWxkIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3ZDZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvS2J1aWxkCkBAIC0wLDAgKzEsNCBAQAorRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BESVIpL2RyaXZlcnMvbmV0L2N4Z2IzCisKK2N4Z2IzaS15IDo9IGN4Z2IzaV9pbml0Lm8gY3hnYjNpX2lzY3NpLm8gY3hnYjNpX3BkdS5vIGN4Z2IzaV9vZmZsb2FkLm8KK29iai0kKENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJKSArPSBjeGdiM2lfZGRwLm8gY3hnYjNpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRjYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9LY29uZmlnCkBAIC0wLDAgKzEsNyBAQAorY29uZmlnIFNDU0lfQ1hHQjNfSVNDU0kKKwl0cmlzdGF0ZSAiQ2hlbHNpbyBTM3h4IGlTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBDSEVMU0lPX1QzX0RFUEVORFMKKwlzZWxlY3QgQ0hFTFNJT19UMworCXNlbGVjdCBTQ1NJX0lTQ1NJX0FUVFJTCisJLS0taGVscC0tLQorCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGlTQ1NJIG9mZmxvYWQgZm9yIHRoZSBDaGVsc2lvIFMzIHNlcmllcyBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2kuaCBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlNmU0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBjeGdiM2kuaDogQ2hlbHNpbyBTM3h4IGlTQ1NJIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBXcml0dGVuIGJ5OiBLYXJlbiBYaWUgKGt4aWVAY2hlbHNpby5jb20pCisgKi8KKworI2lmbmRlZiBfX0NYR0IzSV9IX18KKyNkZWZpbmUgX19DWEdCM0lfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmlzY3NpX3RjcC5oPgorCisvKiBmcm9tIGN4Z2IzIExMRCAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInQzX2NwbC5oIgorI2luY2x1ZGUgInQzY2Rldi5oIgorI2luY2x1ZGUgImN4Z2IzX2N0bF9kZWZzLmgiCisjaW5jbHVkZSAiY3hnYjNfb2ZmbG9hZC5oIgorI2luY2x1ZGUgImZpcm13YXJlX2V4cG9ydHMuaCIKKworI2luY2x1ZGUgImN4Z2IzaV9vZmZsb2FkLmgiCisjaW5jbHVkZSAiY3hnYjNpX2RkcC5oIgorCisjZGVmaW5lIENYR0IzSV9TQ1NJX1FERVBUSF9ERkxUCTEyOAorI2RlZmluZSBDWEdCM0lfTUFYX1RBUkdFVAlDWEdCM0lfTUFYX0NPTk4KKyNkZWZpbmUgQ1hHQjNJX01BWF9MVU4JCTUxMgorI2RlZmluZSBJU0NTSV9QRFVfTk9OUEFZTE9BRF9NQVggXAorCShzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikgKyBJU0NTSV9NQVhfQUhTX1NJWkUgKyAyKklTQ1NJX0RJR0VTVF9TSVpFKQorCitzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXI7CitzdHJ1Y3QgY3hnYjNpX2hiYTsKK3N0cnVjdCBjeGdiM2lfZW5kcG9pbnQ7CisKKy8qKgorICogc3RydWN0IGN4Z2IzaV9oYmEgLSBjeGdiM2kgaXNjc2kgc3RydWN0dXJlIChwZXIgcG9ydCkKKyAqCisgKiBAc25pYzoJY3hnYjNpIGFkYXB0ZXIgY29udGFpbmluZyB0aGlzIHBvcnQKKyAqIEBuZGV2Oglwb2ludGVyIHRvIG5ldGRldiBzdHJ1Y3R1cmUKKyAqIEBzaG9zdDoJcG9pbnRlciB0byBzY3NpIGhvc3Qgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBjeGdiM2lfaGJhIHsKKwlzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXIgKnNuaWM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBjeGdiM2lfYWRhcHRlciAtIGN4Z2IzaSBhZGFwdGVyIHN0cnVjdHVyZSAocGVyIHBjaSkKKyAqCisgKiBAbGlzdGhlYWQ6CWxpc3QgaGVhZCB0byBsaW5rIGVsZW1lbnRzCisgKiBAbG9jazoJbG9jayBmb3IgdGhpcyBzdHJ1Y3R1cmUKKyAqIEB0ZGV2Oglwb2ludGVyIHRvIHQzY2RldiB1c2VkIGJ5IGN4Z2IzIGRyaXZlcgorICogQHBkZXY6CXBvaW50ZXIgdG8gcGNpIGRldgorICogQGhiYV9jbnQ6CSMgb2YgaGJhcyAodGhlIHNhbWUgYXMgIyBvZiBwb3J0cykKKyAqIEBoYmE6CWFsbCB0aGUgaGJhcyBvbiB0aGlzIGFkYXB0ZXIKKyAqIEB0eF9tYXhfc2l6ZTogbWF4LiB0eCBwYWNrZXQgc2l6ZSBzdXBwb3J0ZWQKKyAqIEByeF9tYXhfc2l6ZTogbWF4LiByeCBwYWNrZXQgc2l6ZSBzdXBwb3J0ZWQKKyAqIEB0YWdfZm9ybWF0OiBkZHAgdGFnIGZvcm1hdCBzZXR0aW5ncworICovCitzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgdDNjZGV2ICp0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGNoYXIgaGJhX2NudDsKKwlzdHJ1Y3QgY3hnYjNpX2hiYSAqaGJhW01BWF9OUE9SVFNdOworCisJdW5zaWduZWQgaW50IHR4X21heF9zaXplOworCXVuc2lnbmVkIGludCByeF9tYXhfc2l6ZTsKKworCXN0cnVjdCBjeGdiM2lfdGFnX2Zvcm1hdCB0YWdfZm9ybWF0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgY3hnYjNpX2Nvbm4gLSBjeGdiM2kgaXNjc2kgY29ubmVjdGlvbgorICoKKyAqIEBsaXN0aGVhZDoJbGlzdCBoZWFkIHRvIGxpbmsgZWxlbWVudHMKKyAqIEBjZXA6CXBvaW50ZXIgdG8gaXNjc2lfZW5kcG9pbnQgc3RydWN0dXJlCisgKiBAY29ubjoJcG9pbnRlciB0byBpc2NzaV9jb25uIHN0cnVjdHVyZQorICogQGhiYToJcG9pbnRlciB0byB0aGUgaGJhIHRoaXMgY29ubi4gaXMgZ29pbmcgdGhyb3VnaAorICogQHRhc2tfaWR4X2JpdHM6ICMgb2YgYml0cyBuZWVkZWQgZm9yIHNlc3Npb24tPmNtZHNfbWF4CisgKi8KK3N0cnVjdCBjeGdiM2lfY29ubiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2hlYWQ7CisJc3RydWN0IGN4Z2IzaV9lbmRwb2ludCAqY2VwOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBjeGdiM2lfaGJhICpoYmE7CisJdW5zaWduZWQgaW50IHRhc2tfaWR4X2JpdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBjeGdiM2lfZW5kcG9pbnQgLSBpc2NzaSB0Y3AgZW5kcG9pbnQKKyAqCisgKiBAYzNjbjoJdGhlIGgvdyB0Y3AgY29ubmVjdGlvbiByZXByZXNlbnRhdGlvbgorICogQGhiYToJcG9pbnRlciB0byB0aGUgaGJhIHRoaXMgY29ubi4gaXMgZ29pbmcgdGhyb3VnaAorICogQGNjb25uOglwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIGN4Z2IzaSBpc2NzaSBjb25uZWN0aW9uCisgKi8KK3N0cnVjdCBjeGdiM2lfZW5kcG9pbnQgeworCXN0cnVjdCBzM19jb25uICpjM2NuOworCXN0cnVjdCBjeGdiM2lfaGJhICpoYmE7CisJc3RydWN0IGN4Z2IzaV9jb25uICpjY29ubjsKK307CisKK2ludCBjeGdiM2lfaXNjc2lfaW5pdCh2b2lkKTsKK3ZvaWQgY3hnYjNpX2lzY3NpX2NsZWFudXAodm9pZCk7CisKK3N0cnVjdCBjeGdiM2lfYWRhcHRlciAqY3hnYjNpX2FkYXB0ZXJfYWRkKHN0cnVjdCB0M2NkZXYgKik7Cit2b2lkIGN4Z2IzaV9hZGFwdGVyX3JlbW92ZShzdHJ1Y3QgdDNjZGV2ICopOworaW50IGN4Z2IzaV9hZGFwdGVyX3VscF9pbml0KHN0cnVjdCBjeGdiM2lfYWRhcHRlciAqKTsKK3ZvaWQgY3hnYjNpX2FkYXB0ZXJfdWxwX2NsZWFudXAoc3RydWN0IGN4Z2IzaV9hZGFwdGVyICopOworCitzdHJ1Y3QgY3hnYjNpX2hiYSAqY3hnYjNpX2hiYV9maW5kX2J5X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0cnVjdCBjeGdiM2lfaGJhICpjeGdiM2lfaGJhX2hvc3RfYWRkKHN0cnVjdCBjeGdiM2lfYWRhcHRlciAqLAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgY3hnYjNpX2hiYV9ob3N0X3JlbW92ZShzdHJ1Y3QgY3hnYjNpX2hiYSAqKTsKKworaW50IGN4Z2IzaV9wZHVfaW5pdCh2b2lkKTsKK3ZvaWQgY3hnYjNpX3BkdV9jbGVhbnVwKHZvaWQpOwordm9pZCBjeGdiM2lfY29ubl9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKik7CitpbnQgY3hnYjNpX2Nvbm5fYWxsb2NfcGR1KHN0cnVjdCBpc2NzaV90YXNrICosIHU4KTsKK2ludCBjeGdiM2lfY29ubl9pbml0X3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitpbnQgY3hnYjNpX2Nvbm5feG1pdF9wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKik7CisKK3ZvaWQgY3hnYjNpX3JlbGVhc2VfaXR0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCBpdHRfdCBoZHJfaXR0KTsKK2ludCBjeGdiM2lfcmVzZXJ2ZV9pdHQoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIGl0dF90ICpoZHJfaXR0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2RkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDFmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwpAQCAtMCwwICsxLDc3MCBAQAorLyoKKyAqIGN4Z2IzaV9kZHAuYzogQ2hlbHNpbyBTM3h4IGlTQ1NJIEREUCBNYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IEthcmVuIFhpZSAoa3hpZUBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKy8qIGZyb20gY3hnYjMgTExEICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAidDNfY3BsLmgiCisjaW5jbHVkZSAidDNjZGV2LmgiCisjaW5jbHVkZSAiY3hnYjNfY3RsX2RlZnMuaCIKKyNpbmNsdWRlICJjeGdiM19vZmZsb2FkLmgiCisjaW5jbHVkZSAiZmlybXdhcmVfZXhwb3J0cy5oIgorCisjaW5jbHVkZSAiY3hnYjNpX2RkcC5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRSAgICAgICAgICJjeGdiM2lfZGRwIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04gICAgICAiMS4wLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURSAgICAgICJEZWMuIDEsIDIwMDgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CisJIkNoZWxzaW8gUzN4eCBpU0NTSSBERFAgIiBEUlZfTU9EVUxFX05BTUUKKwkiIHYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiS2FyZW4gWGllIDxreGllQGNoZWxzaW8uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJjeGdiM2kgZGRwIHBhZ2Vwb2QgbWFuYWdlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworI2RlZmluZSBkZHBfbG9nX2Vycm9yKGZtdC4uLikgcHJpbnRrKEtFUk5fRVJSICJjeGdiM2lfZGRwOiBFUlIhICIgZm10KQorI2RlZmluZSBkZHBfbG9nX3dhcm4oZm10Li4uKSAgcHJpbnRrKEtFUk5fV0FSTklORyAiY3hnYjNpX2RkcDogV0FSTiEgIiBmbXQpCisjZGVmaW5lIGRkcF9sb2dfaW5mbyhmbXQuLi4pICBwcmludGsoS0VSTl9JTkZPICJjeGdiM2lfZGRwOiAiIGZtdCkKKworI2lmZGVmIF9fREVCVUdfQ1hHQjNJX0REUF9fCisjZGVmaW5lIGRkcF9sb2dfZGVidWcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyAiY3hnYjNpX2RkcDogJXMgLSAiIGZtdCwgX19mdW5jX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZGRwX2xvZ19kZWJ1ZyhmbXQuLi4pCisjZW5kaWYKKworLyoKKyAqIGlTQ1NJIERpcmVjdCBEYXRhIFBsYWNlbWVudAorICoKKyAqIFQzIGgvdyBjYW4gZGlyZWN0bHkgcGxhY2UgdGhlIGlTQ1NJIERhdGEtSW4gb3IgRGF0YS1PdXQgUERVJ3MgcGF5bG9hZCBpbnRvCisgKiBwcmUtcG9zdGVkIGZpbmFsIGRlc3RpbmF0aW9uIGhvc3QtbWVtb3J5IGJ1ZmZlcnMgYmFzZWQgb24gdGhlIEluaXRpYXRvcgorICogVGFzayBUYWcgKElUVCkgaW4gRGF0YS1JbiBvciBUYXJnZXQgVGFzayBUYWcgKFRUVCkgaW4gRGF0YS1PdXQgUERVcy4KKyAqCisgKiBUaGUgaG9zdCBtZW1vcnkgYWRkcmVzcyBpcyBwcm9ncmFtbWVkIGludG8gaC93IGluIHRoZSBmb3JtYXQgb2YgcGFnZXBvZAorICogZW50cmllcy4KKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgcGFnZXBvZCBlbnRyeSBpcyBlbmNvZGVkIGludG8gZGRwIHRhZyB3aGljaCBpcyB1c2VkIG9yCisgKiBpcyB0aGUgYmFzZSBmb3IgSVRUL1RUVC4KKyAqLworCisjZGVmaW5lIEREUF9QR0lEWF9NQVgJCTQKKyNkZWZpbmUgRERQX1RIUkVTSE9MRAkyMDQ4CitzdGF0aWMgdW5zaWduZWQgY2hhciBkZHBfcGFnZV9vcmRlcltERFBfUEdJRFhfTUFYXSA9IHswLCAxLCAyLCA0fTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRkcF9wYWdlX3NoaWZ0W0REUF9QR0lEWF9NQVhdID0gezEyLCAxMywgMTQsIDE2fTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfaWR4ID0gRERQX1BHSURYX01BWDsKKworc3RhdGljIExJU1RfSEVBRChjeGdiM2lfZGRwX2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0soY3hnYjNpX2RkcF9yd2xvY2spOworCisvKgorICogZnVuY3Rpb25zIHRvIHByb2dyYW0gdGhlIHBhZ2Vwb2QgaW4gaC93CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bHBfbWVtX2lvX3NldF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IHVscF9tZW1faW8gKnJlcSA9IChzdHJ1Y3QgdWxwX21lbV9pbyAqKXNrYi0+aGVhZDsKKworCXJlcS0+d3Iud3JfbG8gPSAwOworCXJlcS0+d3Iud3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX0JZUEFTUykpOworCXJlcS0+Y21kX2xvY2tfYWRkciA9IGh0b25sKFZfVUxQX01FTUlPX0FERFIoYWRkciA+PiA1KSB8CisJCQkJICAgVl9VTFBUWF9DTUQoVUxQX01FTV9XUklURSkpOworCXJlcS0+bGVuID0gaHRvbmwoVl9VTFBfTUVNSU9fREFUQV9MRU4oUFBPRF9TSVpFID4+IDUpIHwKKwkJCSBWX1VMUFRYX05GTElUUygoUFBPRF9TSVpFID4+IDMpICsgMSkpOworfQorCitzdGF0aWMgaW50IHNldF9kZHBfbWFwKHN0cnVjdCBjeGdiM2lfZGRwX2luZm8gKmRkcCwgc3RydWN0IHBhZ2Vwb2RfaGRyICpoZHIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgbnBvZHMsCisJCSAgICAgICBzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpnbCkKK3sKKwl1bnNpZ25lZCBpbnQgcG1fYWRkciA9IChpZHggPDwgUFBPRF9TSVpFX1NISUZUKSArIGRkcC0+bGxpbWl0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5wb2RzOyBpKyssIGlkeCsrLCBwbV9hZGRyICs9IFBQT0RfU0laRSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGRwLT5nbF9za2JbaWR4XTsKKwkJc3RydWN0IHBhZ2Vwb2QgKnBwb2Q7CisJCWludCBqLCBwaWR4OworCisJCS8qIGhvbGQgb24gdG8gdGhlIHNrYiB1bnRpbCB3ZSBjbGVhciB0aGUgZGRwIG1hcHBpbmcgKi8KKwkJc2tiX2dldChza2IpOworCisJCXVscF9tZW1faW9fc2V0X2hkcihza2IsIHBtX2FkZHIpOworCQlwcG9kID0gKHN0cnVjdCBwYWdlcG9kICopCisJCSAgICAgICAoc2tiLT5oZWFkICsgc2l6ZW9mKHN0cnVjdCB1bHBfbWVtX2lvKSk7CisJCW1lbWNweSgmKHBwb2QtPmhkciksIGhkciwgc2l6ZW9mKHN0cnVjdCBwYWdlcG9kKSk7CisJCWZvciAocGlkeCA9IDQgKiBpLCBqID0gMDsgaiA8IDU7ICsraiwgKytwaWR4KQorCQkJcHBvZC0+YWRkcltqXSA9IHBpZHggPCBnbC0+bmVsZW0gPworCQkJCSAgICAgY3B1X3RvX2JlNjQoZ2wtPnBoeXNfYWRkcltwaWR4XSkgOiAwVUw7CisKKwkJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9DT05UUk9MOworCQljeGdiM19vZmxkX3NlbmQoZGRwLT50ZGV2LCBza2IpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGVhcl9kZHBfbWFwKHN0cnVjdCBjeGdiM2lfZGRwX2luZm8gKmRkcCwgdW5zaWduZWQgaW50IGlkeCwKKwkJCSB1bnNpZ25lZCBpbnQgbnBvZHMpCit7CisJdW5zaWduZWQgaW50IHBtX2FkZHIgPSAoaWR4IDw8IFBQT0RfU0laRV9TSElGVCkgKyBkZHAtPmxsaW1pdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucG9kczsgaSsrLCBpZHgrKywgcG1fYWRkciArPSBQUE9EX1NJWkUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRkcC0+Z2xfc2tiW2lkeF07CisKKwkJZGRwLT5nbF9za2JbaWR4XSA9IE5VTEw7CisJCW1lbXNldCgoc2tiLT5oZWFkICsgc2l6ZW9mKHN0cnVjdCB1bHBfbWVtX2lvKSksIDAsIFBQT0RfU0laRSk7CisJCXVscF9tZW1faW9fc2V0X2hkcihza2IsIHBtX2FkZHIpOworCQlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX0NPTlRST0w7CisJCWN4Z2IzX29mbGRfc2VuZChkZHAtPnRkZXYsIHNrYik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZHBfZmluZF91bnVzZWRfZW50cmllcyhzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvICpkZHAsCisJCQkJCSAgaW50IHN0YXJ0LCBpbnQgbWF4LCBpbnQgY291bnQsCisJCQkJCSAgc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqZ2wpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlzcGluX2xvY2soJmRkcC0+bWFwX2xvY2spOworCWZvciAoaSA9IHN0YXJ0OyBpIDw9IG1heDspIHsKKwkJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkJCWlmIChkZHAtPmdsX21hcFtpICsgal0pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gY291bnQpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKQorCQkJCWRkcC0+Z2xfbWFwW2kgKyBqXSA9IGdsOworCQkJc3Bpbl91bmxvY2soJmRkcC0+bWFwX2xvY2spOworCQkJcmV0dXJuIGk7CisJCX0KKwkJaSArPSBqICsgMTsKKwl9CisJc3Bpbl91bmxvY2soJmRkcC0+bWFwX2xvY2spOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZHBfdW5tYXJrX2VudHJpZXMoc3RydWN0IGN4Z2IzaV9kZHBfaW5mbyAqZGRwLAorCQkJCSAgICAgIGludCBzdGFydCwgaW50IGNvdW50KQoreworCXNwaW5fbG9jaygmZGRwLT5tYXBfbG9jayk7CisJbWVtc2V0KCZkZHAtPmdsX21hcFtzdGFydF0sIDAsCisJICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKikpOworCXNwaW5fdW5sb2NrKCZkZHAtPm1hcF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRkcF9mcmVlX2dsX3NrYihzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvICpkZHAsCisJCQkJICAgaW50IGlkeCwgaW50IGNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGlkeCsrKQorCQlpZiAoZGRwLT5nbF9za2JbaWR4XSkgeworCQkJa2ZyZWVfc2tiKGRkcC0+Z2xfc2tiW2lkeF0pOworCQkJZGRwLT5nbF9za2JbaWR4XSA9IE5VTEw7CisJCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgZGRwX2FsbG9jX2dsX3NrYihzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvICpkZHAsIGludCBpZHgsCisJCQkJICAgaW50IGNvdW50LCBnZnBfdCBnZnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgdWxwX21lbV9pbykgKworCQkJCQkJUFBPRF9TSVpFLCBnZnApOworCQlpZiAoc2tiKSB7CisJCQlkZHAtPmdsX3NrYltpZHggKyBpXSA9IHNrYjsKKwkJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHVscF9tZW1faW8pICsgUFBPRF9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCWRkcF9mcmVlX2dsX3NrYihkZHAsIGlkeCwgaSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjeGdiM2lfZGRwX2ZpbmRfcGFnZV9pbmRleCAtIHJldHVybiBkZHAgcGFnZSBpbmRleCBmb3IgYSBnaXZlbiBwYWdlIHNpemUuCisgKiBAcGdzejogcGFnZSBzaXplCisgKiByZXR1cm4gdGhlIGRkcCBwYWdlIGluZGV4LCBpZiBubyBtYXRjaCBpcyBmb3VuZCByZXR1cm4gRERQX1BHSURYX01BWC4KKyAqLworaW50IGN4Z2IzaV9kZHBfZmluZF9wYWdlX2luZGV4KHVuc2lnbmVkIGxvbmcgcGdzeikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBERFBfUEdJRFhfTUFYOyBpKyspIHsKKwkJaWYgKHBnc3ogPT0gKDFVTCA8PCBkZHBfcGFnZV9zaGlmdFtpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisJZGRwX2xvZ19kZWJ1ZygiZGRwIHBhZ2Ugc2l6ZSAweCVseCBub3Qgc3VwcG9ydGVkLlxuIiwgcGdzeik7CisJcmV0dXJuIEREUF9QR0lEWF9NQVg7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjeGdiM2lfZGRwX2ZpbmRfcGFnZV9pbmRleCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZHBfZ2xfdW5tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqZ2wpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2wtPm5lbGVtOyBpKyspCisJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGdsLT5waHlzX2FkZHJbaV0sIFBBR0VfU0laRSwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZHBfZ2xfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICBzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpnbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbC0+bmVsZW07IGkrKykgeworCQlnbC0+cGh5c19hZGRyW2ldID0gcGNpX21hcF9wYWdlKHBkZXYsIGdsLT5wYWdlc1tpXSwgMCwKKwkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmICh1bmxpa2VseShwY2lfZG1hX21hcHBpbmdfZXJyb3IocGRldiwgZ2wtPnBoeXNfYWRkcltpXSkpKQorCQkJZ290byB1bm1hcDsKKwl9CisKKwlyZXR1cm4gaTsKKwordW5tYXA6CisJaWYgKGkpIHsKKwkJdW5zaWduZWQgaW50IG5lbGVtID0gZ2wtPm5lbGVtOworCisJCWdsLT5uZWxlbSA9IGk7CisJCWRkcF9nbF91bm1hcChwZGV2LCBnbCk7CisJCWdsLT5uZWxlbSA9IG5lbGVtOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBjeGdiM2lfZGRwX21ha2VfZ2wgLSBidWlsZCBkZHAgcGFnZSBidWZmZXIgbGlzdAorICogQHhmZXJsZW46IHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAqIEBzZ2w6IHBhZ2UgYnVmZmVyIHNjYXR0ZXItZ2F0aGVyIGxpc3QKKyAqIEBzZ2NudDogIyBvZiBwYWdlIGJ1ZmZlcnMKKyAqIEBwZGV2OiBwY2lfZGV2LCB1c2VkIGZvciBwY2kgbWFwCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIG1vZGUKKyAqCisgKiBjb25zdHJ1Y3QgYSBkZHAgcGFnZSBidWZmZXIgbGlzdCBmcm9tIHRoZSBzY3NpIHNjYXR0ZXJnYXRoZXIgbGlzdC4KKyAqIGNvYWxlc2NlIGJ1ZmZlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIG9idGFpbiBkbWEgYWRkcmVzc2VzIGZvcgorICogZWFjaCBwYWdlLgorICoKKyAqIFJldHVybiB0aGUgY3hnYjNpX2dhdGhlcl9saXN0IGNvbnN0cnVjdGVkIGZyb20gdGhlIHBhZ2UgYnVmZmVycyBpZiB0aGUKKyAqIG1lbW9yeSBjYW4gYmUgdXNlZCBmb3IgZGRwLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKmN4Z2IzaV9kZHBfbWFrZV9nbCh1bnNpZ25lZCBpbnQgeGZlcmxlbiwKKwkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZ2NudCwKKwkJCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgICAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpnbDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2dsOworCXN0cnVjdCBwYWdlICpzZ3BhZ2UgPSBzZ19wYWdlKHNnKTsKKwl1bnNpZ25lZCBpbnQgc2dsZW4gPSBzZy0+bGVuZ3RoOworCXVuc2lnbmVkIGludCBzZ29mZnNldCA9IHNnLT5vZmZzZXQ7CisJdW5zaWduZWQgaW50IG5wYWdlcyA9ICh4ZmVybGVuICsgc2dvZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSA+PgorCQkJICAgICAgUEFHRV9TSElGVDsKKwlpbnQgaSA9IDEsIGogPSAwOworCisJaWYgKHhmZXJsZW4gPCBERFBfVEhSRVNIT0xEKSB7CisJCWRkcF9sb2dfZGVidWcoInhmZXIgJXUgPCB0aHJlc2hvbGQgJXUsIG5vIGRkcC5cbiIsCisJCQkgICAgICB4ZmVybGVuLCBERFBfVEhSRVNIT0xEKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZ2wgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0KSArCisJCSAgICAgbnBhZ2VzICogKHNpemVvZihkbWFfYWRkcl90KSArIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSksCisJCSAgICAgZ2ZwKTsKKwlpZiAoIWdsKQorCQlyZXR1cm4gTlVMTDsKKworCWdsLT5wYWdlcyA9IChzdHJ1Y3QgcGFnZSAqKikmZ2wtPnBoeXNfYWRkcltucGFnZXNdOworCWdsLT5sZW5ndGggPSB4ZmVybGVuOworCWdsLT5vZmZzZXQgPSBzZ29mZnNldDsKKwlnbC0+cGFnZXNbMF0gPSBzZ3BhZ2U7CisKKwlzZyA9IHNnX25leHQoc2cpOworCXdoaWxlIChzZykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2Uoc2cpOworCisJCWlmIChzZ3BhZ2UgPT0gcGFnZSAmJiBzZy0+b2Zmc2V0ID09IHNnb2Zmc2V0ICsgc2dsZW4pCisJCQlzZ2xlbiArPSBzZy0+bGVuZ3RoOworCQllbHNlIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGUgc2dsIGlzIGZpdCBmb3IgZGRwOgorCQkJICogZWFjaCBoYXMgdGhlIHNhbWUgcGFnZSBzaXplLCBhbmQKKwkJCSAqIGFsbCBvZiB0aGUgbWlkZGxlIHBhZ2VzIGFyZSB1c2VkIGNvbXBsZXRlbHkKKwkJCSAqLworCQkJaWYgKChqICYmIHNnb2Zmc2V0KSB8fAorCQkJICAgICgoaSAhPSBzZ2NudCAtIDEpICYmCisJCQkgICAgICgoc2dsZW4gKyBzZ29mZnNldCkgJiB+UEFHRV9NQVNLKSkpCisJCQkJZ290byBlcnJvcl9vdXQ7CisKKwkJCWorKzsKKwkJCWlmIChqID09IGdsLT5uZWxlbSB8fCBzZy0+b2Zmc2V0KQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJZ2wtPnBhZ2VzW2pdID0gcGFnZTsKKwkJCXNnbGVuID0gc2ctPmxlbmd0aDsKKwkJCXNnb2Zmc2V0ID0gc2ctPm9mZnNldDsKKwkJCXNncGFnZSA9IHBhZ2U7CisJCX0KKwkJaSsrOworCQlzZyA9IHNnX25leHQoc2cpOworCX0KKwlnbC0+bmVsZW0gPSArK2o7CisKKwlpZiAoZGRwX2dsX21hcChwZGV2LCBnbCkgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCXJldHVybiBnbDsKKworZXJyb3Jfb3V0OgorCWtmcmVlKGdsKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGN4Z2IzaV9kZHBfbWFrZV9nbCk7CisKKy8qKgorICogY3hnYjNpX2RkcF9yZWxlYXNlX2dsIC0gcmVsZWFzZSBhIHBhZ2UgYnVmZmVyIGxpc3QKKyAqIEBnbDogYSBkZHAgcGFnZSBidWZmZXIgbGlzdAorICogQHBkZXY6IHBjaV9kZXYgdXNlZCBmb3IgcGNpX3VubWFwCisgKiBmcmVlIGEgZGRwIHBhZ2UgYnVmZmVyIGxpc3QgcmVzdWx0ZWQgZnJvbSBjeGdiM2lfZGRwX21ha2VfZ2woKS4KKyAqLwordm9pZCBjeGdiM2lfZGRwX3JlbGVhc2VfZ2woc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqZ2wsCisJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZHBfZ2xfdW5tYXAocGRldiwgZ2wpOworCWtmcmVlKGdsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGN4Z2IzaV9kZHBfcmVsZWFzZV9nbCk7CisKKy8qKgorICogY3hnYjNpX2RkcF90YWdfcmVzZXJ2ZSAtIHNldCB1cCBkZHAgZm9yIGEgZGF0YSB0cmFuc2ZlcgorICogQHRkZXY6IHQzY2RldiBhZGFwdGVyCisgKiBAdGlkOiBjb25uZWN0aW9uIGlkCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdAorICogQHRhZ3A6IHRoZSBzL3cgdGFnLCBpZiBkZHAgc2V0dXAgaXMgc3VjY2Vzc2Z1bCwgaXQgd2lsbCBiZSB1cGRhdGVkIHdpdGgKKyAqCSAgZGRwL2h3IHRhZworICogQGdsOiB0aGUgcGFnZSBtb21vcnkgbGlzdAorICogQGdmcDogYWxsb2NhdGlvbiBtb2RlCisgKgorICogZGRwIHNldHVwIGZvciBhIGdpdmVuIHBhZ2UgYnVmZmVyIGxpc3QgYW5kIGNvbnN0cnVjdCB0aGUgZGRwIHRhZy4KKyAqIHJldHVybiAwIGlmIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBjeGdiM2lfZGRwX3RhZ19yZXNlcnZlKHN0cnVjdCB0M2NkZXYgKnRkZXYsIHVuc2lnbmVkIGludCB0aWQsCisJCQkgICBzdHJ1Y3QgY3hnYjNpX3RhZ19mb3JtYXQgKnRmb3JtYXQsIHUzMiAqdGFncCwKKwkJCSAgIHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKmdsLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGN4Z2IzaV9kZHBfaW5mbyAqZGRwID0gdGRldi0+dWxwX2lzY3NpOworCXN0cnVjdCBwYWdlcG9kX2hkciBoZHI7CisJdW5zaWduZWQgaW50IG5wb2RzOworCWludCBpZHggPSAtMSwgaWR4X21heDsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwl1MzIgc3dfdGFnID0gKnRhZ3A7CisJdTMyIHRhZzsKKworCWlmIChwYWdlX2lkeCA+PSBERFBfUEdJRFhfTUFYIHx8ICFkZHAgfHwgIWdsIHx8ICFnbC0+bmVsZW0gfHwKKwkJZ2wtPmxlbmd0aCA8IEREUF9USFJFU0hPTEQpIHsKKwkJZGRwX2xvZ19kZWJ1ZygicGdpZHggJXUsIHhmZXIgJXUvJXUsIE5PIGRkcC5cbiIsCisJCQkgICAgICBwYWdlX2lkeCwgZ2wtPmxlbmd0aCwgRERQX1RIUkVTSE9MRCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5wb2RzID0gKGdsLT5uZWxlbSArIFBQT0RfUEFHRVNfTUFYIC0gMSkgPj4gUFBPRF9QQUdFU19TSElGVDsKKwlpZHhfbWF4ID0gZGRwLT5ucHBvZHMgLSBucG9kcyArIDE7CisKKwlpZiAoZGRwLT5pZHhfbGFzdCA9PSBkZHAtPm5wcG9kcykKKwkJaWR4ID0gZGRwX2ZpbmRfdW51c2VkX2VudHJpZXMoZGRwLCAwLCBpZHhfbWF4LCBucG9kcywgZ2wpOworCWVsc2UgeworCQlpZHggPSBkZHBfZmluZF91bnVzZWRfZW50cmllcyhkZHAsIGRkcC0+aWR4X2xhc3QgKyAxLAorCQkJCQkgICAgICBpZHhfbWF4LCBucG9kcywgZ2wpOworCQlpZiAoaWR4IDwgMCAmJiBkZHAtPmlkeF9sYXN0ID49IG5wb2RzKQorCQkJaWR4ID0gZGRwX2ZpbmRfdW51c2VkX2VudHJpZXMoZGRwLCAwLAorCQkJCQkJICAgICAgZGRwLT5pZHhfbGFzdCAtIG5wb2RzICsgMSwKKwkJCQkJCSAgICAgIG5wb2RzLCBnbCk7CisJfQorCWlmIChpZHggPCAwKSB7CisJCWRkcF9sb2dfZGVidWcoInhmZXJsZW4gJXUsIGdsICV1LCBucG9kcyAldSBOTyBERFAuXG4iLAorCQkJICAgICAgZ2wtPmxlbmd0aCwgZ2wtPm5lbGVtLCBucG9kcyk7CisJCXJldHVybiBpZHg7CisJfQorCisJZXJyID0gZGRwX2FsbG9jX2dsX3NrYihkZHAsIGlkeCwgbnBvZHMsIGdmcCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5tYXJrX2VudHJpZXM7CisKKwl0YWcgPSBjeGdiM2lfZGRwX3RhZ19iYXNlKHRmb3JtYXQsIHN3X3RhZyk7CisJdGFnIHw9IGlkeCA8PCBQUE9EX0lEWF9TSElGVDsKKworCWhkci5yc3ZkID0gMDsKKwloZHIudmxkX3RpZCA9IGh0b25sKEZfUFBPRF9WQUxJRCB8IFZfUFBPRF9USUQodGlkKSk7CisJaGRyLnBnc3pfdGFnX2NsciA9IGh0b25sKHRhZyAmIGRkcC0+cnN2ZF90YWdfbWFzayk7CisJaGRyLm1heG9mZnNldCA9IGh0b25sKGdsLT5sZW5ndGgpOworCWhkci5wZ29mZnNldCA9IGh0b25sKGdsLT5vZmZzZXQpOworCisJZXJyID0gc2V0X2RkcF9tYXAoZGRwLCAmaGRyLCBpZHgsIG5wb2RzLCBnbCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZnJlZV9nbF9za2I7CisKKwlkZHAtPmlkeF9sYXN0ID0gaWR4OworCWRkcF9sb2dfZGVidWcoInhmZXIgJXUsIGdsICV1LCV1LCB0aWQgMHgleCwgMHgleCAtPiAweCV4KCV1LCV1KS5cbiIsCisJCSAgICAgIGdsLT5sZW5ndGgsIGdsLT5uZWxlbSwgZ2wtPm9mZnNldCwgdGlkLCBzd190YWcsIHRhZywKKwkJICAgICAgaWR4LCBucG9kcyk7CisJKnRhZ3AgPSB0YWc7CisJcmV0dXJuIDA7CisKK2ZyZWVfZ2xfc2tiOgorCWRkcF9mcmVlX2dsX3NrYihkZHAsIGlkeCwgbnBvZHMpOwordW5tYXJrX2VudHJpZXM6CisJZGRwX3VubWFya19lbnRyaWVzKGRkcCwgaWR4LCBucG9kcyk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGN4Z2IzaV9kZHBfdGFnX3Jlc2VydmUpOworCisvKioKKyAqIGN4Z2IzaV9kZHBfdGFnX3JlbGVhc2UgLSByZWxlYXNlIGEgZGRwIHRhZworICogQHRkZXY6IHQzY2RldiBhZGFwdGVyCisgKiBAdGFnOiBkZHAgdGFnCisgKiBkZHAgY2xlYW51cCBmb3IgYSBnaXZlbiBkZHAgdGFnIGFuZCByZWxlYXNlIGFsbCB0aGUgcmVzb3VyY2VzIGhlbGQKKyAqLwordm9pZCBjeGdiM2lfZGRwX3RhZ19yZWxlYXNlKHN0cnVjdCB0M2NkZXYgKnRkZXYsIHUzMiB0YWcpCit7CisJc3RydWN0IGN4Z2IzaV9kZHBfaW5mbyAqZGRwID0gdGRldi0+dWxwX2lzY3NpOworCXUzMiBpZHg7CisKKwlpZiAoIWRkcCkgeworCQlkZHBfbG9nX2Vycm9yKCJyZWxlYXNlIGRkcCB0YWcgMHgleCwgZGRwIE5VTEwuXG4iLCB0YWcpOworCQlyZXR1cm47CisJfQorCisJaWR4ID0gKHRhZyA+PiBQUE9EX0lEWF9TSElGVCkgJiBkZHAtPmlkeF9tYXNrOworCWlmIChpZHggPCBkZHAtPm5wcG9kcykgeworCQlzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpnbCA9IGRkcC0+Z2xfbWFwW2lkeF07CisJCXVuc2lnbmVkIGludCBucG9kczsKKworCQlpZiAoIWdsKSB7CisJCQlkZHBfbG9nX2Vycm9yKCJyZWxlYXNlIGRkcCAweCV4LCBpZHggMHgleCwgZ2wgTlVMTC5cbiIsCisJCQkJICAgICAgdGFnLCBpZHgpOworCQkJcmV0dXJuOworCQl9CisJCW5wb2RzID0gKGdsLT5uZWxlbSArIFBQT0RfUEFHRVNfTUFYIC0gMSkgPj4gUFBPRF9QQUdFU19TSElGVDsKKwkJZGRwX2xvZ19kZWJ1ZygiZGRwIHRhZyAweCV4LCByZWxlYXNlIGlkeCAweCV4LCBucG9kcyAldS5cbiIsCisJCQkgICAgICB0YWcsIGlkeCwgbnBvZHMpOworCQljbGVhcl9kZHBfbWFwKGRkcCwgaWR4LCBucG9kcyk7CisJCWRkcF91bm1hcmtfZW50cmllcyhkZHAsIGlkeCwgbnBvZHMpOworCQljeGdiM2lfZGRwX3JlbGVhc2VfZ2woZ2wsIGRkcC0+cGRldik7CisJfSBlbHNlCisJCWRkcF9sb2dfZXJyb3IoImRkcCB0YWcgMHgleCwgaWR4IDB4JXggPiBtYXggMHgleC5cbiIsCisJCQkgICAgICB0YWcsIGlkeCwgZGRwLT5ucHBvZHMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3hnYjNpX2RkcF90YWdfcmVsZWFzZSk7CisKK3N0YXRpYyBpbnQgc2V0dXBfY29ubl9wZ2lkeChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB1bnNpZ25lZCBpbnQgdGlkLCBpbnQgcGdfaWR4LAorCQkJICAgIGludCByZXBseSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgKnJlcTsKKwl1NjQgdmFsID0gcGdfaWR4IDwgRERQX1BHSURYX01BWCA/IHBnX2lkeCA6IDA7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBzZXQgdXAgdWxwIHN1Ym1vZGUgYW5kIHBhZ2Ugc2l6ZSAqLworCXJlcSA9IChzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPndyLndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9GT1JXQVJEKSk7CisJT1BDT0RFX1RJRChyZXEpID0gaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfU0VUX1RDQl9GSUVMRCwgdGlkKSk7CisJcmVxLT5yZXBseSA9IFZfTk9fUkVQTFkocmVwbHkgPyAwIDogMSk7CisJcmVxLT5jcHVfaWR4ID0gMDsKKwlyZXEtPndvcmQgPSBodG9ucygzMSk7CisJcmVxLT5tYXNrID0gY3B1X3RvX2JlNjQoMHhGMDAwMDAwMCk7CisJcmVxLT52YWwgPSBjcHVfdG9fYmU2NCh2YWwgPDwgMjgpOworCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfQ09OVFJPTDsKKworCWN4Z2IzX29mbGRfc2VuZCh0ZGV2LCBza2IpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGN4Z2IzaV9zZXR1cF9jb25uX2hvc3RfcGFnZXNpemUgLSBzZXR1cCB0aGUgY29ubi4ncyBkZHAgcGFnZSBzaXplCisgKiBAdGRldjogdDNjZGV2IGFkYXB0ZXIKKyAqIEB0aWQ6IGNvbm5lY3Rpb24gaWQKKyAqIEByZXBseTogcmVxdWVzdCByZXBseSBmcm9tIGgvdworICogc2V0IHVwIHRoZSBkZHAgcGFnZSBzaXplIGJhc2VkIG9uIHRoZSBob3N0IFBBR0VfU0laRSBmb3IgYSBjb25uZWN0aW9uCisgKiBpZGVudGlmaWVkIGJ5IHRpZAorICovCitpbnQgY3hnYjNpX3NldHVwX2Nvbm5faG9zdF9wYWdlc2l6ZShzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB1bnNpZ25lZCBpbnQgdGlkLAorCQkJCSAgICBpbnQgcmVwbHkpCit7CisJcmV0dXJuIHNldHVwX2Nvbm5fcGdpZHgodGRldiwgdGlkLCBwYWdlX2lkeCwgcmVwbHkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3hnYjNpX3NldHVwX2Nvbm5faG9zdF9wYWdlc2l6ZSk7CisKKy8qKgorICogY3hnYjNpX3NldHVwX2Nvbm5fcGFnZXNpemUgLSBzZXR1cCB0aGUgY29ubi4ncyBkZHAgcGFnZSBzaXplCisgKiBAdGRldjogdDNjZGV2IGFkYXB0ZXIKKyAqIEB0aWQ6IGNvbm5lY3Rpb24gaWQKKyAqIEByZXBseTogcmVxdWVzdCByZXBseSBmcm9tIGgvdworICogQHBnc3o6IGRkcCBwYWdlIHNpemUKKyAqIHNldCB1cCB0aGUgZGRwIHBhZ2Ugc2l6ZSBmb3IgYSBjb25uZWN0aW9uIGlkZW50aWZpZWQgYnkgdGlkCisgKi8KK2ludCBjeGdiM2lfc2V0dXBfY29ubl9wYWdlc2l6ZShzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB1bnNpZ25lZCBpbnQgdGlkLAorCQkJCWludCByZXBseSwgdW5zaWduZWQgbG9uZyBwZ3N6KQoreworCWludCBwZ2lkeCA9IGN4Z2IzaV9kZHBfZmluZF9wYWdlX2luZGV4KHBnc3opOworCisJcmV0dXJuIHNldHVwX2Nvbm5fcGdpZHgodGRldiwgdGlkLCBwZ2lkeCwgcmVwbHkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3hnYjNpX3NldHVwX2Nvbm5fcGFnZXNpemUpOworCisvKioKKyAqIGN4Z2IzaV9zZXR1cF9jb25uX2RpZ2VzdCAtIHNldHVwIGNvbm4uIGRpZ2VzdCBzZXR0aW5nCisgKiBAdGRldjogdDNjZGV2IGFkYXB0ZXIKKyAqIEB0aWQ6IGNvbm5lY3Rpb24gaWQKKyAqIEBoY3JjOiBoZWFkZXIgZGlnZXN0IGVuYWJsZWQKKyAqIEBkY3JjOiBkYXRhIGRpZ2VzdCBlbmFibGVkCisgKiBAcmVwbHk6IHJlcXVlc3QgcmVwbHkgZnJvbSBoL3cKKyAqIHNldCB1cCB0aGUgaXNjc2kgZGlnZXN0IHNldHRpbmdzIGZvciBhIGNvbm5lY3Rpb24gaWRlbnRpZmllZCBieSB0aWQKKyAqLworaW50IGN4Z2IzaV9zZXR1cF9jb25uX2RpZ2VzdChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB1bnNpZ25lZCBpbnQgdGlkLAorCQkJICAgICBpbnQgaGNyYywgaW50IGRjcmMsIGludCByZXBseSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgKnJlcTsKKwl1NjQgdmFsID0gKGhjcmMgPyAxIDogMCkgfCAoZGNyYyA/IDIgOiAwKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHNldCB1cCB1bHAgc3VibW9kZSBhbmQgcGFnZSBzaXplICovCisJcmVxID0gKHN0cnVjdCBjcGxfc2V0X3RjYl9maWVsZCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnJlcSkpOworCXJlcS0+d3Iud3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX0ZPUldBUkQpKTsKKwlPUENPREVfVElEKHJlcSkgPSBodG9ubChNS19PUENPREVfVElEKENQTF9TRVRfVENCX0ZJRUxELCB0aWQpKTsKKwlyZXEtPnJlcGx5ID0gVl9OT19SRVBMWShyZXBseSA/IDAgOiAxKTsKKwlyZXEtPmNwdV9pZHggPSAwOworCXJlcS0+d29yZCA9IGh0b25zKDMxKTsKKwlyZXEtPm1hc2sgPSBjcHVfdG9fYmU2NCgweDBGMDAwMDAwKTsKKwlyZXEtPnZhbCA9IGNwdV90b19iZTY0KHZhbCA8PCAyNCk7CisJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9DT05UUk9MOworCisJY3hnYjNfb2ZsZF9zZW5kKHRkZXYsIHNrYik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjeGdiM2lfc2V0dXBfY29ubl9kaWdlc3QpOworCitzdGF0aWMgaW50IGRkcF9pbml0KHN0cnVjdCB0M2NkZXYgKnRkZXYpCit7CisJc3RydWN0IGN4Z2IzaV9kZHBfaW5mbyAqZGRwOworCXN0cnVjdCB1bHBfaXNjc2lfaW5mbyB1aW5mbzsKKwl1bnNpZ25lZCBpbnQgcHBtYXgsIGJpdHM7CisJaW50IGksIGVycjsKKwlzdGF0aWMgaW50IHZlcnNfcHJpbnRlZDsKKworCWlmICghdmVyc19wcmludGVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisJCXZlcnNfcHJpbnRlZCA9IDE7CisJfQorCisJZXJyID0gdGRldi0+Y3RsKHRkZXYsIFVMUF9JU0NTSV9HRVRfUEFSQU1TLCAmdWluZm8pOworCWlmIChlcnIgPCAwKSB7CisJCWRkcF9sb2dfZXJyb3IoIiVzLCBmYWlsZWQgdG8gZ2V0IGlzY3NpIHBhcmFtIGVycj0lZC5cbiIsCisJCQkJIHRkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcHBtYXggPSAodWluZm8udWxpbWl0IC0gdWluZm8ubGxpbWl0ICsgMSkgPj4gUFBPRF9TSVpFX1NISUZUOworCWJpdHMgPSBfX2lsb2cyX3UzMihwcG1heCkgKyAxOworCWlmIChiaXRzID4gUFBPRF9JRFhfTUFYX1NJWkUpCisJCWJpdHMgPSBQUE9EX0lEWF9NQVhfU0laRTsKKwlwcG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKKworCWRkcCA9IGN4Z2IzaV9hbGxvY19iaWdfbWVtKHNpemVvZihzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvKSArCisJCQkJICAgcHBtYXggKgorCQkJCQkoc2l6ZW9mKHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKikgKworCQkJCQlzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghZGRwKSB7CisJCWRkcF9sb2dfd2FybigiJXMgdW5hYmxlIHRvIGFsbG9jIGRkcCAweCVkLCBkZHAgZGlzYWJsZWQuXG4iLAorCQkJICAgICB0ZGV2LT5uYW1lLCBwcG1heCk7CisJCXJldHVybiAwOworCX0KKwlkZHAtPmdsX21hcCA9IChzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICoqKShkZHAgKyAxKTsKKwlkZHAtPmdsX3NrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKikoKChjaGFyICopZGRwLT5nbF9tYXApICsKKwkJCQkJICBwcG1heCAqCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKikpOworCXNwaW5fbG9ja19pbml0KCZkZHAtPm1hcF9sb2NrKTsKKworCWRkcC0+dGRldiA9IHRkZXY7CisJZGRwLT5wZGV2ID0gdWluZm8ucGRldjsKKwlkZHAtPm1heF90eHN6ID0gbWluX3QodW5zaWduZWQgaW50LCB1aW5mby5tYXhfdHhzeiwgVUxQMl9NQVhfUEtUX1NJWkUpOworCWRkcC0+bWF4X3J4c3ogPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHVpbmZvLm1heF9yeHN6LCBVTFAyX01BWF9QS1RfU0laRSk7CisJZGRwLT5sbGltaXQgPSB1aW5mby5sbGltaXQ7CisJZGRwLT51bGltaXQgPSB1aW5mby51bGltaXQ7CisJZGRwLT5ucHBvZHMgPSBwcG1heDsKKwlkZHAtPmlkeF9sYXN0ID0gcHBtYXg7CisJZGRwLT5pZHhfYml0cyA9IGJpdHM7CisJZGRwLT5pZHhfbWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKKwlkZHAtPnJzdmRfdGFnX21hc2sgPSAoMSA8PCAoYml0cyArIFBQT0RfSURYX1NISUZUKSkgLSAxOworCisJdWluZm8udGFnbWFzayA9IGRkcC0+aWR4X21hc2sgPDwgUFBPRF9JRFhfU0hJRlQ7CisJZm9yIChpID0gMDsgaSA8IEREUF9QR0lEWF9NQVg7IGkrKykKKwkJdWluZm8ucGdzel9mYWN0b3JbaV0gPSBkZHBfcGFnZV9vcmRlcltpXTsKKwl1aW5mby51bGltaXQgPSB1aW5mby5sbGltaXQgKyAocHBtYXggPDwgUFBPRF9TSVpFX1NISUZUKTsKKworCWVyciA9IHRkZXYtPmN0bCh0ZGV2LCBVTFBfSVNDU0lfU0VUX1BBUkFNUywgJnVpbmZvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZHBfbG9nX3dhcm4oIiVzIHVuYWJsZSB0byBzZXQgaXNjc2kgcGFyYW0gZXJyPSVkLCAiCisJCQkgICAgICAiZGRwIGRpc2FibGVkLlxuIiwgdGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBmcmVlX2RkcF9tYXA7CisJfQorCisJdGRldi0+dWxwX2lzY3NpID0gZGRwOworCisJLyogYWRkIHRvIHRoZSBsaXN0ICovCisJd3JpdGVfbG9jaygmY3hnYjNpX2RkcF9yd2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmRkcC0+bGlzdCwgJmN4Z2IzaV9kZHBfbGlzdCk7CisJd3JpdGVfdW5sb2NrKCZjeGdiM2lfZGRwX3J3bG9jayk7CisKKwlkZHBfbG9nX2luZm8oIm5wcG9kcyAldSAoMHgleCB+IDB4JXgpLCBiaXRzICV1LCBtYXNrIDB4JXgsMHgleCAiCisJCQkicGt0ICV1LCV1LlxuIiwKKwkJCXBwbWF4LCBkZHAtPmxsaW1pdCwgZGRwLT51bGltaXQsIGRkcC0+aWR4X2JpdHMsCisJCQlkZHAtPmlkeF9tYXNrLCBkZHAtPnJzdmRfdGFnX21hc2ssCisJCQlkZHAtPm1heF90eHN6LCBkZHAtPm1heF9yeHN6KTsKKwlyZXR1cm4gMDsKKworZnJlZV9kZHBfbWFwOgorCWN4Z2IzaV9mcmVlX2JpZ19tZW0oZGRwKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGN4Z2IzaV9hZGFwdGVyX2RkcF9pbml0IC0gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlcidzIGRkcCByZXNvdXJjZQorICogQHRkZXY6IHQzY2RldiBhZGFwdGVyCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdAorICogQHR4c3o6IG1heCB0eCBwa3Qgc2l6ZSwgZmlsbGVkIGluIGJ5IHRoaXMgZnVuYy4KKyAqIEByeHN6OiBtYXggcnggcGt0IHNpemUsIGZpbGxlZCBpbiBieSB0aGlzIGZ1bmMuCisgKiBpbml0aWFsaXplIHRoZSBkZHAgcGFnZXBvZCBtYW5hZ2VyIGZvciBhIGdpdmVuIGFkYXB0ZXIgaWYgbmVlZGVkIGFuZAorICogc2V0dXAgdGhlIHRhZyBmb3JtYXQgZm9yIGEgZ2l2ZW4gaXNjc2kgZW50aXR5CisgKi8KK2ludCBjeGdiM2lfYWRhcHRlcl9kZHBfaW5pdChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LAorCQkJICAgIHN0cnVjdCBjeGdiM2lfdGFnX2Zvcm1hdCAqdGZvcm1hdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnR4c3osIHVuc2lnbmVkIGludCAqcnhzeikKK3sKKwlzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvICpkZHA7CisJdW5zaWduZWQgY2hhciBpZHhfYml0czsKKworCWlmICghdGZvcm1hdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXRkZXYtPnVscF9pc2NzaSkgeworCQlpbnQgZXJyID0gZGRwX2luaXQodGRldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJZGRwID0gKHN0cnVjdCBjeGdiM2lfZGRwX2luZm8gKil0ZGV2LT51bHBfaXNjc2k7CisKKwlpZHhfYml0cyA9IDMyIC0gdGZvcm1hdC0+c3dfYml0czsKKwl0Zm9ybWF0LT5yc3ZkX2JpdHMgPSBkZHAtPmlkeF9iaXRzOworCXRmb3JtYXQtPnJzdmRfc2hpZnQgPSBQUE9EX0lEWF9TSElGVDsKKwl0Zm9ybWF0LT5yc3ZkX21hc2sgPSAoMSA8PCB0Zm9ybWF0LT5yc3ZkX2JpdHMpIC0gMTsKKworCWRkcF9sb2dfaW5mbygidGFnIGZvcm1hdDogc3cgJXUsIHJzdmQgJXUsJXUsIG1hc2sgMHgleC5cbiIsCisJCSAgICAgIHRmb3JtYXQtPnN3X2JpdHMsIHRmb3JtYXQtPnJzdmRfYml0cywKKwkJICAgICAgdGZvcm1hdC0+cnN2ZF9zaGlmdCwgdGZvcm1hdC0+cnN2ZF9tYXNrKTsKKworCSp0eHN6ID0gZGRwLT5tYXhfdHhzejsKKwkqcnhzeiA9IGRkcC0+bWF4X3J4c3o7CisJZGRwX2xvZ19pbmZvKCJkZHAgbWF4IHBrdCBzaXplOiAldSwgJXUuXG4iLAorCQkgICAgIGRkcC0+bWF4X3R4c3osIGRkcC0+bWF4X3J4c3opOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3hnYjNpX2FkYXB0ZXJfZGRwX2luaXQpOworCitzdGF0aWMgdm9pZCBkZHBfcmVsZWFzZShzdHJ1Y3QgY3hnYjNpX2RkcF9pbmZvICpkZHApCit7CisJaW50IGkgPSAwOworCXN0cnVjdCB0M2NkZXYgKnRkZXYgPSBkZHAtPnRkZXY7CisKKwl0ZGV2LT51bHBfaXNjc2kgPSBOVUxMOworCXdoaWxlIChpIDwgZGRwLT5ucHBvZHMpIHsKKwkJc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqZ2wgPSBkZHAtPmdsX21hcFtpXTsKKwkJaWYgKGdsKSB7CisJCQlpbnQgbnBvZHMgPSAoZ2wtPm5lbGVtICsgUFBPRF9QQUdFU19NQVggLSAxKQorCQkJCSAgICAgPj4gUFBPRF9QQUdFU19TSElGVDsKKworCQkJa2ZyZWUoZ2wpOworCQkJZGRwX2ZyZWVfZ2xfc2tiKGRkcCwgaSwgbnBvZHMpOworCQl9IGVsc2UKKwkJCWkrKzsKKwl9CisJY3hnYjNpX2ZyZWVfYmlnX21lbShkZHApOworfQorCisvKioKKyAqIGN4Z2IzaV9hZGFwdGVyX2RkcF9jbGVhbnVwIC0gcmVsZWFzZSB0aGUgYWRhcHRlcidzIGRkcCByZXNvdXJjZQorICogQHRkZXY6IHQzY2RldiBhZGFwdGVyCisgKiByZWxlYXNlIGFsbCB0aGUgcmVzb3VyY2UgaGVsZCBieSB0aGUgZGRwIHBhZ2Vwb2QgbWFuYWdlciBmb3IgYSBnaXZlbgorICogYWRhcHRlciBpZiBuZWVkZWQKKyAqLwordm9pZCBjeGdiM2lfYWRhcHRlcl9kZHBfY2xlYW51cChzdHJ1Y3QgdDNjZGV2ICp0ZGV2KQoreworCXN0cnVjdCBjeGdiM2lfZGRwX2luZm8gKmRkcDsKKworCS8qIHJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCisJd3JpdGVfbG9jaygmY3hnYjNpX2RkcF9yd2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGRwLCAmY3hnYjNpX2RkcF9saXN0LCBsaXN0KSB7CisJCWlmIChkZHAtPnRkZXYgPT0gdGRldikgeworCQkJbGlzdF9kZWwoJmRkcC0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2soJmN4Z2IzaV9kZHBfcndsb2NrKTsKKworCWlmIChkZHApCisJCWRkcF9yZWxlYXNlKGRkcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjeGdiM2lfYWRhcHRlcl9kZHBfY2xlYW51cCk7CisKKy8qKgorICogY3hnYjNpX2RkcF9pbml0X21vZHVsZSAtIG1vZHVsZSBpbml0IGVudHJ5IHBvaW50CisgKiBpbml0aWFsaXplIGFueSBkcml2ZXIgd2lkZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGN4Z2IzaV9kZHBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwYWdlX2lkeCA9IGN4Z2IzaV9kZHBfZmluZF9wYWdlX2luZGV4KFBBR0VfU0laRSk7CisJZGRwX2xvZ19pbmZvKCJzeXN0ZW0gUEFHRV9TSVpFICVsdSwgZGRwIGlkeCAldS5cbiIsCisJCSAgICAgUEFHRV9TSVpFLCBwYWdlX2lkeCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYjNpX2RkcF9leGl0X21vZHVsZSAtIG1vZHVsZSBjbGVhbnVwL2V4aXQgZW50cnkgcG9pbnQKKyAqIGdvIHRocm91Z2ggdGhlIGRkcCBsaXN0IGFuZCByZWxlYXNlIGFueSByZXNvdXJjZSBoZWxkLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY3hnYjNpX2RkcF9leGl0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBjeGdiM2lfZGRwX2luZm8gKmRkcDsKKworCS8qIHJlbGVhc2UgYWxsIGRkcCBtYW5hZ2VyIGlmIHRoZXJlIGlzIGFueSAqLworCXdyaXRlX2xvY2soJmN4Z2IzaV9kZHBfcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRkcCwgJmN4Z2IzaV9kZHBfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGRwLT5saXN0KTsKKwkJZGRwX3JlbGVhc2UoZGRwKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZjeGdiM2lfZGRwX3J3bG9jayk7Cit9CisKK21vZHVsZV9pbml0KGN4Z2IzaV9kZHBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY3hnYjNpX2RkcF9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuaCBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2RkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2M0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIGN4Z2IzaV9kZHAuaDogQ2hlbHNpbyBTM3h4IGlTQ1NJIEREUCBNYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IEthcmVuIFhpZSAoa3hpZUBjaGVsc2lvLmNvbSkKKyAqLworCisjaWZuZGVmIF9fQ1hHQjNJX1VMUDJfRERQX0hfXworI2RlZmluZSBfX0NYR0IzSV9VTFAyX0REUF9IX18KKworLyoqCisgKiBzdHJ1Y3QgY3hnYjNpX3RhZ19mb3JtYXQgLSBjeGdiM2kgdWxwIHRhZyBmb3JtYXQgZm9yIGFuIGlzY3NpIGVudGl0eQorICoKKyAqIEBzd19iaXRzOgkjIG9mIGJpdHMgdXNlZCBieSBpc2NzaSBzb2Z0d2FyZSBsYXllcgorICogQHJzdmRfYml0czoJIyBvZiBiaXRzIHVzZWQgYnkgaC93CisgKiBAcnN2ZF9zaGlmdDoJaC93IGJpdHMgc2hpZnQgbGVmdAorICogQHJzdmRfbWFzazoJcmVzZXJ2ZWQgYml0IG1hc2sKKyAqLworc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0IHsKKwl1bnNpZ25lZCBjaGFyIHN3X2JpdHM7CisJdW5zaWduZWQgY2hhciByc3ZkX2JpdHM7CisJdW5zaWduZWQgY2hhciByc3ZkX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIgZmlsbGVyWzFdOworCXUzMiByc3ZkX21hc2s7Cit9OworCisvKioKKyAqIHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgLSBjeGdiM2kgZGlyZWN0IGRhdGEgcGxhY2VtZW50IG1lbW9yeQorICoKKyAqIEB0YWc6CWRkcCB0YWcKKyAqIEBsZW5ndGg6CXRvdGFsIGRhdGEgYnVmZmVyIGxlbmd0aAorICogQG9mZnNldDoJaW5pdGlhbCBvZmZzZXQgdG8gdGhlIDFzdCBwYWdlCisgKiBAbmVsZW06CSMgb2YgcGFnZXMKKyAqIEBwYWdlczoJcGFnZSBwb2ludGVycworICogQHBoeXNfYWRkcjoJcGh5c2ljYWwgYWRkcmVzcworICovCitzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0IHsKKwl1MzIgdGFnOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbmVsZW07CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwlkbWFfYWRkcl90IHBoeXNfYWRkclswXTsKK307CisKKy8qKgorICogc3RydWN0IGN4Z2IzaV9kZHBfaW5mbyAtIGN4Z2IzaSBkaXJlY3QgZGF0YSBwbGFjZW1lbnQgZm9yIHBkdSBwYXlsb2FkCisgKgorICogQGxpc3Q6CWxpc3QgaGVhZCB0byBsaW5rIGVsZW1lbnRzCisgKiBAdGRldjoJcG9pbnRlciB0byB0M2NkZXYgdXNlZCBieSBjeGdiMyBkcml2ZXIKKyAqIEBtYXhfdHhzejoJbWF4IHR4IHBhY2tldCBzaXplIGZvciBkZHAKKyAqIEBtYXhfcnhzejoJbWF4IHJ4IHBhY2tldCBzaXplIGZvciBkZHAKKyAqIEBsbGltaXQ6CWxvd2VyIGJvdW5kIG9mIHRoZSBwYWdlIHBvZCBtZW1vcnkKKyAqIEB1bGltaXQ6CXVwcGVyIGJvdW5kIG9mIHRoZSBwYWdlIHBvZCBtZW1vcnkKKyAqIEBucHBvZHM6CSMgb2YgcGFnZSBwb2QgZW50cmllcworICogQGlkeF9sYXN0OglwYWdlIHBvZCBlbnRyeSBsYXN0IHVzZWQKKyAqIEBpZHhfYml0czoJIyBvZiBiaXRzIHRoZSBwYWdlcG9kIGluZGV4IHdvdWxkIHRha2UKKyAqIEBpZHhfbWFzazoJcGFnZXBvZCBpbmRleCBtYXNrCisgKiBAcnN2ZF90YWdfbWFzazogdGFnIG1hc2sKKyAqIEBtYXBfbG9jazoJbG9jayB0byBzeW5jaG9uaXplIGFjY2VzcyB0byB0aGUgcGFnZSBwb2QgbWFwCisgKiBAZ2xfbWFwOglkZHAgbWVtb3J5IGdhdGhlciBsaXN0CisgKiBAZ2xfc2tiOglza2IgdXNlZCB0byBwcm9ncmFtIHRoZSBwYWdlcG9kCisgKi8KK3N0cnVjdCBjeGdiM2lfZGRwX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdDNjZGV2ICp0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGludCBtYXhfdHhzejsKKwl1bnNpZ25lZCBpbnQgbWF4X3J4c3o7CisJdW5zaWduZWQgaW50IGxsaW1pdDsKKwl1bnNpZ25lZCBpbnQgdWxpbWl0OworCXVuc2lnbmVkIGludCBucHBvZHM7CisJdW5zaWduZWQgaW50IGlkeF9sYXN0OworCXVuc2lnbmVkIGNoYXIgaWR4X2JpdHM7CisJdW5zaWduZWQgY2hhciBmaWxsZXJbM107CisJdTMyIGlkeF9tYXNrOworCXUzMiByc3ZkX3RhZ19tYXNrOworCXNwaW5sb2NrX3QgbWFwX2xvY2s7CisJc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqKmdsX21hcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKmdsX3NrYjsKK307CisKKyNkZWZpbmUgVUxQMl9NQVhfUEtUX1NJWkUJMTYyMjQKKyNkZWZpbmUgVUxQMl9NQVhfUERVX1BBWUxPQUQJKFVMUDJfTUFYX1BLVF9TSVpFIC0gSVNDU0lfUERVX05PTlBBWUxPQURfTUFYKQorI2RlZmluZSBQUE9EX1BBR0VTX01BWAkJNAorI2RlZmluZSBQUE9EX1BBR0VTX1NISUZUCTIJLyogNCBwYWdlcyBwZXIgcG9kICovCisKKy8qCisgKiBzdHJ1Y3QgcGFnZXBvZF9oZHIsIHBhZ2Vwb2QgLSBwYWdlcG9kIGZvcm1hdAorICovCitzdHJ1Y3QgcGFnZXBvZF9oZHIgeworCXUzMiB2bGRfdGlkOworCXUzMiBwZ3N6X3RhZ19jbHI7CisJdTMyIG1heG9mZnNldDsKKwl1MzIgcGdvZmZzZXQ7CisJdTY0IHJzdmQ7Cit9OworCitzdHJ1Y3QgcGFnZXBvZCB7CisJc3RydWN0IHBhZ2Vwb2RfaGRyIGhkcjsKKwl1NjQgYWRkcltQUE9EX1BBR0VTX01BWCArIDFdOworfTsKKworI2RlZmluZSBQUE9EX1NJWkUJCXNpemVvZihzdHJ1Y3QgcGFnZXBvZCkJLyogNjQgKi8KKyNkZWZpbmUgUFBPRF9TSVpFX1NISUZUCQk2CisKKyNkZWZpbmUgUFBPRF9DT0xPUl9TSElGVAkwCisjZGVmaW5lIFBQT0RfQ09MT1JfU0laRQkJNgorI2RlZmluZSBQUE9EX0NPTE9SX01BU0sJCSgoMSA8PCBQUE9EX0NPTE9SX1NJWkUpIC0gMSkKKworI2RlZmluZSBQUE9EX0lEWF9TSElGVAkJUFBPRF9DT0xPUl9TSVpFCisjZGVmaW5lIFBQT0RfSURYX01BWF9TSVpFCTI0CisKKyNkZWZpbmUgU19QUE9EX1RJRCAgICAwCisjZGVmaW5lIE1fUFBPRF9USUQgICAgMHhGRkZGRkYKKyNkZWZpbmUgVl9QUE9EX1RJRCh4KSAoKHgpIDw8IFNfUFBPRF9USUQpCisKKyNkZWZpbmUgU19QUE9EX1ZBTElEICAgIDI0CisjZGVmaW5lIFZfUFBPRF9WQUxJRCh4KSAoKHgpIDw8IFNfUFBPRF9WQUxJRCkKKyNkZWZpbmUgRl9QUE9EX1ZBTElEICAgIFZfUFBPRF9WQUxJRCgxVSkKKworI2RlZmluZSBTX1BQT0RfQ09MT1IgICAgMAorI2RlZmluZSBNX1BQT0RfQ09MT1IgICAgMHgzRgorI2RlZmluZSBWX1BQT0RfQ09MT1IoeCkgKCh4KSA8PCBTX1BQT0RfQ09MT1IpCisKKyNkZWZpbmUgU19QUE9EX1RBRyAgICA2CisjZGVmaW5lIE1fUFBPRF9UQUcgICAgMHhGRkZGRkYKKyNkZWZpbmUgVl9QUE9EX1RBRyh4KSAoKHgpIDw8IFNfUFBPRF9UQUcpCisKKyNkZWZpbmUgU19QUE9EX1BHU1ogICAgMzAKKyNkZWZpbmUgTV9QUE9EX1BHU1ogICAgMHgzCisjZGVmaW5lIFZfUFBPRF9QR1NaKHgpICgoeCkgPDwgU19QUE9EX1BHU1opCisKKy8qCisgKiBsYXJnZSBtZW1vcnkgY2h1bmsgYWxsb2NhdGlvbi9yZWxlYXNlCisgKiB1c2Ugdm1hbGxvYygpIGlmIGttYWxsb2MoKSBmYWlscworICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmN4Z2IzaV9hbGxvY19iaWdfbWVtKHVuc2lnbmVkIGludCBzaXplLAorCQkJCQkgZ2ZwX3QgZ2ZwKQoreworCXZvaWQgKnAgPSBrbWFsbG9jKHNpemUsIGdmcCk7CisJaWYgKCFwKQorCQlwID0gdm1hbGxvYyhzaXplKTsKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemUpOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3hnYjNpX2ZyZWVfYmlnX21lbSh2b2lkICphZGRyKQoreworCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCisJCXZmcmVlKGFkZHIpOworCWVsc2UKKwkJa2ZyZWUoYWRkcik7Cit9CisKKy8qCisgKiBjeGdiM2kgZGRwIHRhZyBhcmUgMzIgYml0cywgaXQgY29uc2lzdHMgb2YgcmVzZXJ2ZWQgYml0cyB1c2VkIGJ5IGgvdyBhbmQKKyAqIG5vbi1yZXNlcnZlZCBiaXRzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlzY3NpIHMvdy4KKyAqIFRoZSByZXNlcnZlZCBiaXRzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSByc3ZkX2JpdHMgYW5kIHJzdmRfc2hpZnQgZmllbGRzCisgKiBpbiBzdHJ1Y3QgY3hnYjNpX3RhZ19mb3JtYXQuCisgKgorICogVGhlIHVwcGVyIG1vc3QgcmVzZXJ2ZWQgYml0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIGEgdGFnIGlzIGRkcCB0YWcgb3Igbm90OgorICogCWlmIHRoZSBiaXQgaXMgMCwgdGhlIHRhZyBpcyBhIHZhbGlkIGRkcCB0YWcKKyAqLworCisvKioKKyAqIGN4Z2IzaV9pc19kZHBfdGFnIC0gY2hlY2sgaWYgYSBnaXZlbiB0YWcgaXMgYSBody9kZHAgdGFnCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHRhZzogdGFnIHRvIGJlIGNoZWNrZWQKKyAqCisgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFnIGlzIGEgZGRwIHRhZywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBjeGdiM2lfaXNfZGRwX3RhZyhzdHJ1Y3QgY3hnYjNpX3RhZ19mb3JtYXQgKnRmb3JtYXQsIHUzMiB0YWcpCit7CisJcmV0dXJuICEodGFnICYgKDEgPDwgKHRmb3JtYXQtPnJzdmRfYml0cyArIHRmb3JtYXQtPnJzdmRfc2hpZnQgLSAxKSkpOworfQorCisvKioKKyAqIGN4Z2IzaV9zd190YWdfdXNhYmxlIC0gY2hlY2sgaWYgYSBnaXZlbiBzL3cgdGFnIGhhcyBlbm91Z2ggYml0cyBsZWZ0IGZvcgorICoJCQkgIHRoZSByZXNlcnZlZC9odyBiaXRzCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHN3X3RhZzogcy93IHRhZyB0byBiZSBjaGVja2VkCisgKgorICogcmV0dXJuIHRydWUgaWYgdGhlIHRhZyBpcyBhIGRkcCB0YWcsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjNpX3N3X3RhZ191c2FibGUoc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0ICp0Zm9ybWF0LAorCQkJCQl1MzIgc3dfdGFnKQoreworCXN3X3RhZyA+Pj0gKDMyIC0gdGZvcm1hdC0+cnN2ZF9iaXRzKTsKKwlyZXR1cm4gIXN3X3RhZzsKK30KKworLyoqCisgKiBjeGdiM2lfc2V0X25vbl9kZHBfdGFnIC0gbWFyayBhIGdpdmVuIHMvdyB0YWcgYXMgYW4gaW52YWxpZCBkZHAgdGFnCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHN3X3RhZzogcy93IHRhZyB0byBiZSBjaGVja2VkCisgKgorICogaW5zZXJ0IDEgYXQgdGhlIHVwcGVyIG1vc3QgcmVzZXJ2ZWQgYml0IHRvIG1hcmsgaXQgYXMgYW4gaW52YWxpZCBkZHAgdGFnLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBjeGdiM2lfc2V0X25vbl9kZHBfdGFnKHN0cnVjdCBjeGdiM2lfdGFnX2Zvcm1hdCAqdGZvcm1hdCwKKwkJCQkJIHUzMiBzd190YWcpCit7CisJdW5zaWduZWQgY2hhciBzaGlmdCA9IHRmb3JtYXQtPnJzdmRfYml0cyArIHRmb3JtYXQtPnJzdmRfc2hpZnQgLSAxOworCXUzMiBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKworCWlmIChzd190YWcgJiYgKHN3X3RhZyAmIH5tYXNrKSkgeworCQl1MzIgdjEgPSBzd190YWcgJiAoKDEgPDwgc2hpZnQpIC0gMSk7CisJCXUzMiB2MiA9IChzd190YWcgPj4gKHNoaWZ0IC0gMSkpIDw8IHNoaWZ0OworCisJCXJldHVybiB2MiB8IHYxIHwgMSA8PCBzaGlmdDsKKwl9CisJcmV0dXJuIHN3X3RhZyB8IDEgPDwgc2hpZnQ7Cit9CisKKy8qKgorICogY3hnYjNpX2RkcF90YWdfYmFzZSAtIHNoaWZ0IHRoZSBzL3cgdGFnIGJpdHMgc28gdGhhdCByZXNlcnZlZCBiaXRzIGFyZSBub3QKKyAqCQkJIHVzZWQuCisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHN3X3RhZzogcy93IHRhZyB0byBiZSBjaGVja2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGN4Z2IzaV9kZHBfdGFnX2Jhc2Uoc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0ICp0Zm9ybWF0LAorCQkJCSAgICAgIHUzMiBzd190YWcpCit7CisJdTMyIG1hc2sgPSAoMSA8PCB0Zm9ybWF0LT5yc3ZkX3NoaWZ0KSAtIDE7CisKKwlpZiAoc3dfdGFnICYmIChzd190YWcgJiB+bWFzaykpIHsKKwkJdTMyIHYxID0gc3dfdGFnICYgbWFzazsKKwkJdTMyIHYyID0gc3dfdGFnID4+IHRmb3JtYXQtPnJzdmRfc2hpZnQ7CisKKwkJdjIgPDw9IHRmb3JtYXQtPnJzdmRfc2hpZnQgKyB0Zm9ybWF0LT5yc3ZkX2JpdHM7CisJCXJldHVybiB2MiB8IHYxOworCX0KKwlyZXR1cm4gc3dfdGFnOworfQorCisvKioKKyAqIGN4Z2IzaV90YWdfcnN2ZF9iaXRzIC0gZ2V0IHRoZSByZXNlcnZlZCBiaXRzIHVzZWQgYnkgdGhlIGgvdworICogQHRmb3JtYXQ6IHRhZyBmb3JtYXQgaW5mb3JtYXRpb24KKyAqIEB0YWc6IHRhZyB0byBiZSBjaGVja2VkCisgKgorICogcmV0dXJuIHRoZSByZXNlcnZlZCBiaXRzIGluIHRoZSB0YWcKKyAqLworc3RhdGljIGlubGluZSB1MzIgY3hnYjNpX3RhZ19yc3ZkX2JpdHMoc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0ICp0Zm9ybWF0LAorCQkJCSAgICAgICB1MzIgdGFnKQoreworCWlmIChjeGdiM2lfaXNfZGRwX3RhZyh0Zm9ybWF0LCB0YWcpKQorCQlyZXR1cm4gKHRhZyA+PiB0Zm9ybWF0LT5yc3ZkX3NoaWZ0KSAmIHRmb3JtYXQtPnJzdmRfbWFzazsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjeGdiM2lfdGFnX25vbnJzdmRfYml0cyAtIGdldCB0aGUgbm9uLXJlc2VydmVkIGJpdHMgdXNlZCBieSB0aGUgcy93CisgKiBAdGZvcm1hdDogdGFnIGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHRhZzogdGFnIHRvIGJlIGNoZWNrZWQKKyAqCisgKiByZXR1cm4gdGhlIG5vbi1yZXNlcnZlZCBiaXRzIGluIHRoZSB0YWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGN4Z2IzaV90YWdfbm9ucnN2ZF9iaXRzKHN0cnVjdCBjeGdiM2lfdGFnX2Zvcm1hdCAqdGZvcm1hdCwKKwkJCQkJICB1MzIgdGFnKQoreworCXVuc2lnbmVkIGNoYXIgc2hpZnQgPSB0Zm9ybWF0LT5yc3ZkX2JpdHMgKyB0Zm9ybWF0LT5yc3ZkX3NoaWZ0IC0gMTsKKwl1MzIgdjEsIHYyOworCisJaWYgKGN4Z2IzaV9pc19kZHBfdGFnKHRmb3JtYXQsIHRhZykpIHsKKwkJdjEgPSB0YWcgJiAoKDEgPDwgdGZvcm1hdC0+cnN2ZF9zaGlmdCkgLSAxKTsKKwkJdjIgPSAodGFnID4+IChzaGlmdCArIDEpKSA8PCB0Zm9ybWF0LT5yc3ZkX3NoaWZ0OworCX0gZWxzZSB7CisJCXUzMiBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKworCQl0YWcgJj0gfigxIDw8IHNoaWZ0KTsKKwkJdjEgPSB0YWcgJiBtYXNrOworCQl2MiA9ICh0YWcgPj4gMSkgJiB+bWFzazsKKwl9CisJcmV0dXJuIHYxIHwgdjI7Cit9CisKK2ludCBjeGdiM2lfZGRwX3RhZ19yZXNlcnZlKHN0cnVjdCB0M2NkZXYgKiwgdW5zaWduZWQgaW50IHRpZCwKKwkJCSAgIHN0cnVjdCBjeGdiM2lfdGFnX2Zvcm1hdCAqLCB1MzIgKnRhZywKKwkJCSAgIHN0cnVjdCBjeGdiM2lfZ2F0aGVyX2xpc3QgKiwgZ2ZwX3QgZ2ZwKTsKK3ZvaWQgY3hnYjNpX2RkcF90YWdfcmVsZWFzZShzdHJ1Y3QgdDNjZGV2ICosIHUzMiB0YWcpOworCitzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpjeGdiM2lfZGRwX21ha2VfZ2wodW5zaWduZWQgaW50IHhmZXJsZW4sCisJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkJdW5zaWduZWQgaW50IHNnY250LAorCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWdmcF90IGdmcCk7Cit2b2lkIGN4Z2IzaV9kZHBfcmVsZWFzZV9nbChzdHJ1Y3QgY3hnYjNpX2dhdGhlcl9saXN0ICpnbCwKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK2ludCBjeGdiM2lfc2V0dXBfY29ubl9ob3N0X3BhZ2VzaXplKHN0cnVjdCB0M2NkZXYgKiwgdW5zaWduZWQgaW50IHRpZCwKKwkJCQkgICAgaW50IHJlcGx5KTsKK2ludCBjeGdiM2lfc2V0dXBfY29ubl9wYWdlc2l6ZShzdHJ1Y3QgdDNjZGV2ICosIHVuc2lnbmVkIGludCB0aWQsIGludCByZXBseSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBnc3opOworaW50IGN4Z2IzaV9zZXR1cF9jb25uX2RpZ2VzdChzdHJ1Y3QgdDNjZGV2ICosIHVuc2lnbmVkIGludCB0aWQsCisJCQkJaW50IGhjcmMsIGludCBkY3JjLCBpbnQgcmVwbHkpOworaW50IGN4Z2IzaV9kZHBfZmluZF9wYWdlX2luZGV4KHVuc2lnbmVkIGxvbmcgcGdzeik7CitpbnQgY3hnYjNpX2FkYXB0ZXJfZGRwX2luaXQoc3RydWN0IHQzY2RldiAqLCBzdHJ1Y3QgY3hnYjNpX3RhZ19mb3JtYXQgKiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnR4c3osIHVuc2lnbmVkIGludCAqcnhzeik7Cit2b2lkIGN4Z2IzaV9hZGFwdGVyX2RkcF9jbGVhbnVwKHN0cnVjdCB0M2NkZXYgKik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTFlY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfaW5pdC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBjeGdiM2lfaW5pdC5jOiBDaGVsc2lvIFMzeHggaVNDU0kgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IEthcmVuIFhpZSAoa3hpZUBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSAiY3hnYjNpLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FICAgICAgICAgImN4Z2IzaSIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4uIDEsIDIwMDgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CisJIkNoZWxzaW8gUzN4eCBpU0NTSSBEcml2ZXIgIiBEUlZfTU9EVUxFX05BTUUKKwkiIHYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiS2FyZW4gWGllIDxreGllQGNoZWxzaW8uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaGVsc2lvIFMzeHggaVNDU0kgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdGF0aWMgdm9pZCBvcGVuX3MzX2RldihzdHJ1Y3QgdDNjZGV2ICopOworc3RhdGljIHZvaWQgY2xvc2VfczNfZGV2KHN0cnVjdCB0M2NkZXYgKik7CisKK3N0YXRpYyBjeGdiM19jcGxfaGFuZGxlcl9mdW5jIGN4Z2IzaV9jcGxfaGFuZGxlcnNbTlVNX0NQTF9DTURTXTsKK3N0YXRpYyBzdHJ1Y3QgY3hnYjNfY2xpZW50IHQzY19jbGllbnQgPSB7CisJLm5hbWUgPSAiaXNjc2lfY3hnYjMiLAorCS5oYW5kbGVycyA9IGN4Z2IzaV9jcGxfaGFuZGxlcnMsCisJLmFkZCA9IG9wZW5fczNfZGV2LAorCS5yZW1vdmUgPSBjbG9zZV9zM19kZXYsCit9OworCisvKioKKyAqIG9wZW5fczNfZGV2IC0gcmVnaXN0ZXIgd2l0aCBjeGdiMyBMTEQKKyAqIEB0M2RldjoJY3hnYjMgYWRhcHRlciBpbnN0YW5jZQorICovCitzdGF0aWMgdm9pZCBvcGVuX3MzX2RldihzdHJ1Y3QgdDNjZGV2ICp0M2RldikKK3sKKwlzdGF0aWMgaW50IHZlcnNfcHJpbnRlZDsKKworCWlmICghdmVyc19wcmludGVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisJCXZlcnNfcHJpbnRlZCA9IDE7CisJfQorCisJY3hnYjNpX3NkZXZfYWRkKHQzZGV2LCAmdDNjX2NsaWVudCk7CisJY3hnYjNpX2FkYXB0ZXJfYWRkKHQzZGV2KTsKK30KKworLyoqCisgKiBjbG9zZV9zM19kZXYgLSBkZS1yZWdpc3RlciB3aXRoIGN4Z2IzIExMRAorICogQHQzZGV2OgljeGdiMyBhZGFwdGVyIGluc3RhbmNlCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlX3MzX2RldihzdHJ1Y3QgdDNjZGV2ICp0M2RldikKK3sKKwljeGdiM2lfYWRhcHRlcl9yZW1vdmUodDNkZXYpOworCWN4Z2IzaV9zZGV2X3JlbW92ZSh0M2Rldik7Cit9CisKKy8qKgorICogY3hnYjNpX2luaXRfbW9kdWxlIC0gbW9kdWxlIGluaXQgZW50cnkgcG9pbnQKKyAqCisgKiBpbml0aWFsaXplIGFueSBkcml2ZXIgd2lkZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZWdpc3RlciBpdHNlbGYKKyAqCXdpdGggdGhlIGN4Z2IzIG1vZHVsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBjeGdiM2lfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY3hnYjNpX3NkZXZfaW5pdChjeGdiM2lfY3BsX2hhbmRsZXJzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGN4Z2IzaV9pc2NzaV9pbml0KCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjeGdiM2lfcGR1X2luaXQoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWN4Z2IzX3JlZ2lzdGVyX2NsaWVudCgmdDNjX2NsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjeGdiM2lfZXhpdF9tb2R1bGUgLSBtb2R1bGUgY2xlYW51cC9leGl0IGVudHJ5IHBvaW50CisgKgorICogZ28gdGhyb3VnaCB0aGUgZHJpdmVyIGhiYSBsaXN0IGFuZCBmb3IgZWFjaCBoYmEsIHJlbGVhc2UgYW55IHJlc291cmNlIGhlbGQuCisgKglhbmQgdW5yZWdpc3RlcnMgaXNjc2kgdHJhbnNwb3J0IGFuZCB0aGUgY3hnYjMgbW9kdWxlCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBjeGdiM2lfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwljeGdiM191bnJlZ2lzdGVyX2NsaWVudCgmdDNjX2NsaWVudCk7CisJY3hnYjNpX3BkdV9jbGVhbnVwKCk7CisJY3hnYjNpX2lzY3NpX2NsZWFudXAoKTsKKwljeGdiM2lfc2Rldl9jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KGN4Z2IzaV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjeGdiM2lfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2lzY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzNDY0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX2lzY3NpLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qIGN4Z2IzaV9pc2NzaS5jOiBDaGVsc2lvIFMzeHggaVNDU0kgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWlrZSBDaHJpc3RpZQorICogQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IEthcmVuIFhpZSAoa3hpZUBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmlzY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorCisjaW5jbHVkZSAiY3hnYjNpLmgiCisjaW5jbHVkZSAiY3hnYjNpX3BkdS5oIgorCisjaWZkZWYgX19ERUJVR19DWEdCM0lfVEFHX18KKyNkZWZpbmUgY3hnYjNpX3RhZ19kZWJ1ZwljeGdiM2lfbG9nX2RlYnVnCisjZWxzZQorI2RlZmluZSBjeGdiM2lfdGFnX2RlYnVnKGZtdC4uLikKKyNlbmRpZgorCisjaWZkZWYgX19ERUJVR19DWEdCM0lfQVBJX18KKyNkZWZpbmUgY3hnYjNpX2FwaV9kZWJ1ZwljeGdiM2lfbG9nX2RlYnVnCisjZWxzZQorI2RlZmluZSBjeGdiM2lfYXBpX2RlYnVnKGZtdC4uLikKKyNlbmRpZgorCisvKgorICogYWxpZ24gcGR1IHNpemUgdG8gbXVsdGlwbGUgb2YgNTEyIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UKKyAqLworI2RlZmluZSBhbGlnbl9wZHVfc2l6ZShuKSBkbyB7IG4gPSAobikgJiAofjUxMSk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmN4Z2IzaV9zY3NpX3RyYW5zcG9ydDsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGN4Z2IzaV9ob3N0X3RlbXBsYXRlOworc3RhdGljIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgY3hnYjNpX2lzY3NpX3RyYW5zcG9ydDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN3X3RhZ19pZHhfYml0czsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN3X3RhZ19hZ2VfYml0czsKKworc3RhdGljIExJU1RfSEVBRChjeGdiM2lfc25pY19saXN0KTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGN4Z2IzaV9zbmljX3J3bG9jayk7CisKKy8qKgorICogY3hnYjNpX2FkYXB0ZXJfYWRkIC0gaW5pdCBhIHMzIGFkYXB0ZXIgc3RydWN0dXJlIGFuZCBhbnkgaC93IHNldHRpbmdzCisgKiBAdDNkZXY6IHQzY2RldiBhZGFwdGVyCisgKiByZXR1cm4gdGhlIHJlc3VsdGluZyBjeGdiM2lfYWRhcHRlciBzdHJ1Y3QKKyAqLworc3RydWN0IGN4Z2IzaV9hZGFwdGVyICpjeGdiM2lfYWRhcHRlcl9hZGQoc3RydWN0IHQzY2RldiAqdDNkZXYpCit7CisJc3RydWN0IGN4Z2IzaV9hZGFwdGVyICpzbmljOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gdGRldjJhZGFwKHQzZGV2KTsKKwlpbnQgaTsKKworCXNuaWMgPSBremFsbG9jKHNpemVvZigqc25pYyksIEdGUF9LRVJORUwpOworCWlmICghc25pYykgeworCQljeGdiM2lfYXBpX2RlYnVnKCJjeGdiMyAlcywgT09NLlxuIiwgdDNkZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJnNuaWMtPmxvY2spOworCisJc25pYy0+dGRldiA9IHQzZGV2OworCXNuaWMtPnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXNuaWMtPnRhZ19mb3JtYXQuc3dfYml0cyA9IHN3X3RhZ19pZHhfYml0cyArIHN3X3RhZ19hZ2VfYml0czsKKworCWlmIChjeGdiM2lfYWRhcHRlcl9kZHBfaW5pdCh0M2RldiwgJnNuaWMtPnRhZ19mb3JtYXQsCisJCQkJICAgICZzbmljLT50eF9tYXhfc2l6ZSwKKwkJCQkgICAgJnNuaWMtPnJ4X21heF9zaXplKSA8IDApCisJCWdvdG8gZnJlZV9zbmljOworCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCXNuaWMtPmhiYVtpXSA9IGN4Z2IzaV9oYmFfaG9zdF9hZGQoc25pYywgYWRhcHRlci0+cG9ydFtpXSk7CisJCWlmICghc25pYy0+aGJhW2ldKQorCQkJZ290byB1bHBfY2xlYW51cDsKKwl9CisJc25pYy0+aGJhX2NudCA9IGFkYXB0ZXItPnBhcmFtcy5ucG9ydHM7CisKKwkvKiBhZGQgdG8gdGhlIGxpc3QgKi8KKwl3cml0ZV9sb2NrKCZjeGdiM2lfc25pY19yd2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnNuaWMtPmxpc3RfaGVhZCwgJmN4Z2IzaV9zbmljX2xpc3QpOworCXdyaXRlX3VubG9jaygmY3hnYjNpX3NuaWNfcndsb2NrKTsKKworCXJldHVybiBzbmljOworCit1bHBfY2xlYW51cDoKKwljeGdiM2lfYWRhcHRlcl9kZHBfY2xlYW51cCh0M2Rldik7CitmcmVlX3NuaWM6CisJa2ZyZWUoc25pYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogY3hnYjNpX2FkYXB0ZXJfcmVtb3ZlIC0gcmVsZWFzZSBhbGwgdGhlIHJlc291cmNlcyBoZWxkIGFuZCBjbGVhbnVwIGFueQorICoJaC93IHNldHRpbmdzCisgKiBAdDNkZXY6IHQzY2RldiBhZGFwdGVyCisgKi8KK3ZvaWQgY3hnYjNpX2FkYXB0ZXJfcmVtb3ZlKHN0cnVjdCB0M2NkZXYgKnQzZGV2KQoreworCWludCBpOworCXN0cnVjdCBjeGdiM2lfYWRhcHRlciAqc25pYzsKKworCS8qIHJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCisJd3JpdGVfbG9jaygmY3hnYjNpX3NuaWNfcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNuaWMsICZjeGdiM2lfc25pY19saXN0LCBsaXN0X2hlYWQpIHsKKwkJaWYgKHNuaWMtPnRkZXYgPT0gdDNkZXYpIHsKKwkJCWxpc3RfZGVsKCZzbmljLT5saXN0X2hlYWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrKCZjeGdiM2lfc25pY19yd2xvY2spOworCisJaWYgKHNuaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNuaWMtPmhiYV9jbnQ7IGkrKykgeworCQkJaWYgKHNuaWMtPmhiYVtpXSkgeworCQkJCWN4Z2IzaV9oYmFfaG9zdF9yZW1vdmUoc25pYy0+aGJhW2ldKTsKKwkJCQlzbmljLT5oYmFbaV0gPSBOVUxMOworCQkJfQorCQl9CisKKwkJLyogcmVsZWFzZSBkZHAgcmVzb3VyY2VzICovCisJCWN4Z2IzaV9hZGFwdGVyX2RkcF9jbGVhbnVwKHNuaWMtPnRkZXYpOworCQlrZnJlZShzbmljKTsKKwl9Cit9CisKKy8qKgorICogY3hnYjNpX2hiYV9maW5kX2J5X25ldGRldiAtIGZpbmQgdGhlIGN4Z2IzaV9oYmEgc3RydWN0dXJlIHdpdGggYSBnaXZlbgorICoJbmV0X2RldmljZQorICogQHQzZGV2OiB0M2NkZXYgYWRhcHRlcgorICovCitzdHJ1Y3QgY3hnYjNpX2hiYSAqY3hnYjNpX2hiYV9maW5kX2J5X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXIgKnNuaWM7CisJaW50IGk7CisKKwlyZWFkX2xvY2soJmN4Z2IzaV9zbmljX3J3bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbmljLCAmY3hnYjNpX3NuaWNfbGlzdCwgbGlzdF9oZWFkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzbmljLT5oYmFfY250OyBpKyspIHsKKwkJCWlmIChzbmljLT5oYmFbaV0tPm5kZXYgPT0gbmRldikgeworCQkJCXJlYWRfdW5sb2NrKCZjeGdiM2lfc25pY19yd2xvY2spOworCQkJCXJldHVybiBzbmljLT5oYmFbaV07CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmN4Z2IzaV9zbmljX3J3bG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogY3hnYjNpX2hiYV9ob3N0X2FkZCAtIHJlZ2lzdGVyIGEgbmV3IGhvc3Qgd2l0aCBzY3NpL2lzY3NpCisgKiBAc25pYzogdGhlIGN4Z2IzaSBhZGFwdGVyCisgKiBAbmRldjogYXNzb2NpYXRlZCBuZXRfZGV2aWNlCisgKi8KK3N0cnVjdCBjeGdiM2lfaGJhICpjeGdiM2lfaGJhX2hvc3RfYWRkKHN0cnVjdCBjeGdiM2lfYWRhcHRlciAqc25pYywKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGN4Z2IzaV9oYmEgKmhiYTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlpbnQgZXJyOworCisJc2hvc3QgPSBpc2NzaV9ob3N0X2FsbG9jKCZjeGdiM2lfaG9zdF90ZW1wbGF0ZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBjeGdiM2lfaGJhKSwKKwkJCQkgQ1hHQjNJX1NDU0lfUURFUFRIX0RGTFQpOworCWlmICghc2hvc3QpIHsKKwkJY3hnYjNpX2xvZ19pbmZvKCJpc2NzaV9ob3N0X2FsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaG9zdC0+dHJhbnNwb3J0dCA9IGN4Z2IzaV9zY3NpX3RyYW5zcG9ydDsKKwlzaG9zdC0+bWF4X2x1biA9IENYR0IzSV9NQVhfTFVOOworCXNob3N0LT5tYXhfaWQgPSBDWEdCM0lfTUFYX1RBUkdFVDsKKwlzaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCXNob3N0LT5tYXhfY21kX2xlbiA9IDE2OworCisJaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKwloYmEtPnNuaWMgPSBzbmljOworCWhiYS0+bmRldiA9IG5kZXY7CisJaGJhLT5zaG9zdCA9IHNob3N0OworCisJcGNpX2Rldl9nZXQoc25pYy0+cGRldik7CisJZXJyID0gaXNjc2lfaG9zdF9hZGQoc2hvc3QsICZzbmljLT5wZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJY3hnYjNpX2xvZ19pbmZvKCJpc2NzaV9ob3N0X2FkZCBmYWlsZWQuXG4iKTsKKwkJZ290byBwY2lfZGV2X3B1dDsKKwl9CisKKwljeGdiM2lfYXBpX2RlYnVnKCJzaG9zdCAweCVwLCBoYmEgMHglcCwgbm8gJXUuXG4iLAorCQkJIHNob3N0LCBoYmEsIHNob3N0LT5ob3N0X25vKTsKKworCXJldHVybiBoYmE7CisKK3BjaV9kZXZfcHV0OgorCXBjaV9kZXZfcHV0KHNuaWMtPnBkZXYpOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGN4Z2IzaV9oYmFfaG9zdF9yZW1vdmUgLSBkZS1yZWdpc3RlciB0aGUgaG9zdCB3aXRoIHNjc2kvaXNjc2kKKyAqIEBoYmE6IHRoZSBjeGdiM2kgaGJhCisgKi8KK3ZvaWQgY3hnYjNpX2hiYV9ob3N0X3JlbW92ZShzdHJ1Y3QgY3hnYjNpX2hiYSAqaGJhKQoreworCWN4Z2IzaV9hcGlfZGVidWcoInNob3N0IDB4JXAsIGhiYSAweCVwLCBubyAldS5cbiIsCisJCQkgaGJhLT5zaG9zdCwgaGJhLCBoYmEtPnNob3N0LT5ob3N0X25vKTsKKwlpc2NzaV9ob3N0X3JlbW92ZShoYmEtPnNob3N0KTsKKwlwY2lfZGV2X3B1dChoYmEtPnNuaWMtPnBkZXYpOworCWlzY3NpX2hvc3RfZnJlZShoYmEtPnNob3N0KTsKK30KKworLyoqCisgKiBjeGdiM2lfZXBfY29ubmVjdCAtIGVzdGFibGlzaCBUQ1AgY29ubmVjdGlvbiB0byB0YXJnZXQgcG9ydGFsCisgKiBAZHN0X2FkZHI6CQl0YXJnZXQgSVAgYWRkcmVzcworICogQG5vbl9ibG9ja2luZzoJYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nIGNhbGwKKyAqCisgKiBJbml0aWF0ZXMgYSBUQ1AvSVAgY29ubmVjdGlvbiB0byB0aGUgZHN0X2FkZHIKKyAqLworc3RhdGljIHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqY3hnYjNpX2VwX2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJCQkJCWludCBub25fYmxvY2tpbmcpCit7CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3QgY3hnYjNpX2VuZHBvaW50ICpjZXA7CisJc3RydWN0IGN4Z2IzaV9oYmEgKmhiYTsKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwljM2NuID0gY3hnYjNpX2MzY25fY3JlYXRlKCk7CisJaWYgKCFjM2NuKSB7CisJCWN4Z2IzaV9sb2dfaW5mbygiZXAgY29ubmVjdCBPT00uXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX2Nvbm47CisJfQorCisJZXJyID0gY3hnYjNpX2MzY25fY29ubmVjdChjM2NuLCAoc3RydWN0IHNvY2thZGRyX2luICopZHN0X2FkZHIpOworCWlmIChlcnIgPCAwKSB7CisJCWN4Z2IzaV9sb2dfaW5mbygiZXAgY29ubmVjdCBmYWlsZWQuXG4iKTsKKwkJZ290byByZWxlYXNlX2Nvbm47CisJfQorCWhiYSA9IGN4Z2IzaV9oYmFfZmluZF9ieV9uZXRkZXYoYzNjbi0+ZHN0X2NhY2hlLT5kZXYpOworCWlmICghaGJhKSB7CisJCWVyciA9IC1FTk9TUEM7CisJCWN4Z2IzaV9sb2dfaW5mbygiTk9UIGdvaW5nIHRocm91Z2ggY3hnYmkgZGV2aWNlLlxuIik7CisJCWdvdG8gcmVsZWFzZV9jb25uOworCX0KKwlpZiAoYzNjbl9pc19jbG9zaW5nKGMzY24pKSB7CisJCWVyciA9IC1FTk9TUEM7CisJCWN4Z2IzaV9sb2dfaW5mbygiZXAgY29ubmVjdCB1bmFibGUgdG8gY29ubmVjdC5cbiIpOworCQlnb3RvIHJlbGVhc2VfY29ubjsKKwl9CisKKwllcCA9IGlzY3NpX2NyZWF0ZV9lbmRwb2ludChzaXplb2YoKmNlcCkpOworCWlmICghZXApIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJY3hnYjNpX2xvZ19pbmZvKCJpc2NzaSBhbGxvYyBlcCwgT09NLlxuIik7CisJCWdvdG8gcmVsZWFzZV9jb25uOworCX0KKwljZXAgPSBlcC0+ZGRfZGF0YTsKKwljZXAtPmMzY24gPSBjM2NuOworCWNlcC0+aGJhID0gaGJhOworCisJY3hnYjNpX2FwaV9kZWJ1ZygiZXAgMHglcCwgMHglcCwgYzNjbiAweCVwLCBoYmEgMHglcC5cbiIsCisJCQkgIGVwLCBjZXAsIGMzY24sIGhiYSk7CisJcmV0dXJuIGVwOworCityZWxlYXNlX2Nvbm46CisJY3hnYjNpX2FwaV9kZWJ1ZygiY29ubiAweCVwIGZhaWxlZCwgcmVsZWFzZS5cbiIsIGMzY24pOworCWlmIChjM2NuKQorCQljeGdiM2lfYzNjbl9yZWxlYXNlKGMzY24pOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICogY3hnYjNpX2VwX3BvbGwgLSBwb2xscyBmb3IgVENQIGNvbm5lY3Rpb24gZXN0YWJsaXNoZW1lbnQKKyAqIEBlcDoJCVRDUCBjb25uZWN0aW9uIChlbmRwb2ludCkgaGFuZGxlCisgKiBAdGltZW91dF9tczoJdGltZW91dCB2YWx1ZSBpbiBtaWxsaSBzZWNzCisgKgorICogcG9sbHMgZm9yIFRDUCBjb25uZWN0IHJlcXVlc3QgdG8gY29tcGxldGUKKyAqLworc3RhdGljIGludCBjeGdiM2lfZXBfcG9sbChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLCBpbnQgdGltZW91dF9tcykKK3sKKwlzdHJ1Y3QgY3hnYjNpX2VuZHBvaW50ICpjZXAgPSBlcC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGNlcC0+YzNjbjsKKworCWlmICghYzNjbl9pc19lc3RhYmxpc2hlZChjM2NuKSkKKwkJcmV0dXJuIDA7CisJY3hnYjNpX2FwaV9kZWJ1ZygiZXAgMHglcCwgYzNjbiAweCVwIGVzdGFibGlzaGVkLlxuIiwgZXAsIGMzY24pOworCXJldHVybiAxOworfQorCisvKioKKyAqIGN4Z2IzaV9lcF9kaXNjb25uZWN0IC0gdGVhcmRvd24gVENQIGNvbm5lY3Rpb24KKyAqIEBlcDoJCVRDUCBjb25uZWN0aW9uIChlbmRwb2ludCkgaGFuZGxlCisgKgorICogdGVhcmRvd24gVENQIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIHZvaWQgY3hnYjNpX2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCkKK3sKKwlzdHJ1Y3QgY3hnYjNpX2VuZHBvaW50ICpjZXAgPSBlcC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgY3hnYjNpX2Nvbm4gKmNjb25uID0gY2VwLT5jY29ubjsKKworCWN4Z2IzaV9hcGlfZGVidWcoImVwIDB4JXAsIGNlcCAweCVwLlxuIiwgZXAsIGNlcCk7CisKKwlpZiAoY2Nvbm4gJiYgY2Nvbm4tPmNvbm4pIHsKKwkJLyoKKwkJICogc3RvcCB0aGUgeG1pdCBwYXRoIHNvIHRoZSB4bWl0X3BkdSBmdW5jdGlvbiBpcworCQkgKiBub3QgYmVpbmcgY2FsbGVkCisJCSAqLworCQlpc2NzaV9zdXNwZW5kX3R4KGNjb25uLT5jb25uKTsKKworCQl3cml0ZV9sb2NrX2JoKCZjZXAtPmMzY24tPmNhbGxiYWNrX2xvY2spOworCQljZXAtPmMzY24tPnVzZXJfZGF0YSA9IE5VTEw7CisJCWNjb25uLT5jZXAgPSBOVUxMOworCQl3cml0ZV91bmxvY2tfYmgoJmNlcC0+YzNjbi0+Y2FsbGJhY2tfbG9jayk7CisJfQorCisJY3hnYjNpX2FwaV9kZWJ1ZygiZXAgMHglcCwgY2VwIDB4JXAsIHJlbGVhc2UgYzNjbiAweCVwLlxuIiwKKwkJCSBlcCwgY2VwLCBjZXAtPmMzY24pOworCWN4Z2IzaV9jM2NuX3JlbGVhc2UoY2VwLT5jM2NuKTsKKwlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGVwKTsKK30KKworLyoqCisgKiBjeGdiM2lfc2Vzc2lvbl9jcmVhdGUgLSBjcmVhdGUgYSBuZXcgaXNjc2kgc2Vzc2lvbgorICogQGNtZHNfbWF4OgkJbWF4ICMgb2YgY29tbWFuZHMKKyAqIEBxZGVwdGg6CQlzY3NpIHF1ZXVlIGRlcHRoCisgKiBAaW5pdGlhbF9jbWRzbjoJaW5pdGlhbCBpc2NzaSBDTURTTiBmb3IgdGhpcyBzZXNzaW9uCisgKiBAaG9zdF9ubzoJCXBvaW50ZXIgdG8gcmV0dXJuIGhvc3Qgbm8KKyAqCisgKiBDcmVhdGVzIGEgbmV3IGlTQ1NJIHNlc3Npb24KKyAqLworc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCitjeGdiM2lfc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwgdTE2IGNtZHNfbWF4LCB1MTYgcWRlcHRoLAorCQkgICAgICB1MzIgaW5pdGlhbF9jbWRzbiwgdTMyICpob3N0X25vKQoreworCXN0cnVjdCBjeGdiM2lfZW5kcG9pbnQgKmNlcDsKKwlzdHJ1Y3QgY3hnYjNpX2hiYSAqaGJhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb247CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247CisKKwlpZiAoIWVwKSB7CisJCWN4Z2IzaV9sb2dfZXJyb3IoIiVzLCBtaXNzaW5nIGVuZHBvaW50LlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljZXAgPSBlcC0+ZGRfZGF0YTsKKwloYmEgPSBjZXAtPmhiYTsKKwlzaG9zdCA9IGhiYS0+c2hvc3Q7CisJY3hnYjNpX2FwaV9kZWJ1ZygiZXAgMHglcCwgY2VwIDB4JXAsIGhiYSAweCVwLlxuIiwgZXAsIGNlcCwgaGJhKTsKKwlCVUdfT04oaGJhICE9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCkpOworCisJKmhvc3Rfbm8gPSBzaG9zdC0+aG9zdF9ubzsKKworCWNsc19zZXNzaW9uID0gaXNjc2lfc2Vzc2lvbl9zZXR1cCgmY3hnYjNpX2lzY3NpX3RyYW5zcG9ydCwgc2hvc3QsCisJCQkJCSAgY21kc19tYXgsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV90Y3BfdGFzayksCisJCQkJCSAgaW5pdGlhbF9jbWRzbiwgSVNDU0lfTUFYX1RBUkdFVCk7CisJaWYgKCFjbHNfc2Vzc2lvbikKKwkJcmV0dXJuIE5VTEw7CisJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWlmIChpc2NzaV90Y3BfcjJ0cG9vbF9hbGxvYyhzZXNzaW9uKSkKKwkJZ290byByZW1vdmVfc2Vzc2lvbjsKKworCXJldHVybiBjbHNfc2Vzc2lvbjsKKworcmVtb3ZlX3Nlc3Npb246CisJaXNjc2lfc2Vzc2lvbl90ZWFyZG93bihjbHNfc2Vzc2lvbik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogY3hnYjNpX3Nlc3Npb25fZGVzdHJveSAtIGRlc3Ryb3lzIGlzY3NpIHNlc3Npb24KKyAqIEBjbHNfc2Vzc2lvbjoJcG9pbnRlciB0byBpc2NzaSBjbHMgc2Vzc2lvbgorICoKKyAqIERlc3Ryb3lzIGFuIGlTQ1NJIHNlc3Npb24gaW5zdGFuY2UgYW5kIHJlbGVhc2VzIGl0cyBhbGwgcmVzb3VyY2VzIGhlbGQKKyAqLworc3RhdGljIHZvaWQgY3hnYjNpX3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQoreworCWN4Z2IzaV9hcGlfZGVidWcoInNlc3MgMHglcC5cbiIsIGNsc19zZXNzaW9uKTsKKwlpc2NzaV90Y3BfcjJ0cG9vbF9mcmVlKGNsc19zZXNzaW9uLT5kZF9kYXRhKTsKKwlpc2NzaV9zZXNzaW9uX3RlYXJkb3duKGNsc19zZXNzaW9uKTsKK30KKworLyoqCisgKiBjeGdiM2lfY29ubl9tYXhfeG1pdF9kbGVuZ3RoIC0tIGNoZWNrIHRoZSBtYXguIHhtaXQgcGR1IHNlZ21lbnQgc2l6ZSwKKyAqIHJlZHVjZSBpdCB0byBiZSB3aXRoaW4gdGhlIGhhcmR3YXJlIGxpbWl0IGlmIG5lZWRlZAorICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjNpX2Nvbm5fbWF4X3htaXRfZGxlbmd0aChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKKworeworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBjeGdiM2lfY29ubiAqY2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWF4ID0gbWluX3QodW5zaWduZWQgaW50LCBVTFAyX01BWF9QRFVfUEFZTE9BRCwKKwkJCQkgY2Nvbm4tPmhiYS0+c25pYy0+dHhfbWF4X3NpemUgLQorCQkJCSBJU0NTSV9QRFVfTk9OUEFZTE9BRF9NQVgpOworCisJaWYgKGNvbm4tPm1heF94bWl0X2RsZW5ndGgpCisJCWNvbm4tPm1heF94bWl0X2RsZW5ndGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQljb25uLT5tYXhfeG1pdF9kbGVuZ3RoLCBtYXgpOworCWVsc2UKKwkJY29ubi0+bWF4X3htaXRfZGxlbmd0aCA9IG1heDsKKwlhbGlnbl9wZHVfc2l6ZShjb25uLT5tYXhfeG1pdF9kbGVuZ3RoKTsKKwljeGdiM2lfbG9nX2luZm8oImNvbm4gMHglcCwgbWF4IHhtaXQgJXUuXG4iLAorCQkJIGNvbm4sIGNvbm4tPm1heF94bWl0X2RsZW5ndGgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGN4Z2IzaV9jb25uX21heF9yZWN2X2RsZW5ndGggLS0gY2hlY2sgdGhlIG1heC4gcmVjdiBwZHUgc2VnbWVudCBzaXplIGFnYWluc3QKKyAqIHRoZSBoYXJkd2FyZSBsaW1pdAorICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KKyAqIHJldHVybiAwIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgPCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjNpX2Nvbm5fbWF4X3JlY3ZfZGxlbmd0aChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgY3hnYjNpX2Nvbm4gKmNjb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisJdW5zaWduZWQgaW50IG1heCA9IG1pbl90KHVuc2lnbmVkIGludCwgVUxQMl9NQVhfUERVX1BBWUxPQUQsCisJCQkJIGNjb25uLT5oYmEtPnNuaWMtPnJ4X21heF9zaXplIC0KKwkJCQkgSVNDU0lfUERVX05PTlBBWUxPQURfTUFYKTsKKworCWFsaWduX3BkdV9zaXplKG1heCk7CisJaWYgKGNvbm4tPm1heF9yZWN2X2RsZW5ndGgpIHsKKwkJaWYgKGNvbm4tPm1heF9yZWN2X2RsZW5ndGggPiBtYXgpIHsKKwkJCWN4Z2IzaV9sb2dfZXJyb3IoIk1heFJlY3ZEYXRhU2VnbWVudExlbmd0aCAldSB0b28gYmlnLiIKKwkJCQkJICIgTmVlZCB0byBiZSA8PSAldS5cbiIsCisJCQkJCSBjb25uLT5tYXhfcmVjdl9kbGVuZ3RoLCBtYXgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCWNvbm4tPm1heF9yZWN2X2RsZW5ndGgsIG1heCk7CisJCWFsaWduX3BkdV9zaXplKGNvbm4tPm1heF9yZWN2X2RsZW5ndGgpOworCX0gZWxzZQorCQljb25uLT5tYXhfcmVjdl9kbGVuZ3RoID0gbWF4OworCWN4Z2IzaV9hcGlfZGVidWcoImNvbm4gMHglcCwgbWF4IHJlY3YgJXUuXG4iLAorCQkJIGNvbm4sIGNvbm4tPm1heF9yZWN2X2RsZW5ndGgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGN4Z2IzaV9jb25uX2NyZWF0ZSAtIGNyZWF0ZSBpc2NzaSBjb25uZWN0aW9uIGluc3RhbmNlCisgKiBAY2xzX3Nlc3Npb246CXBvaW50ZXIgdG8gaXNjc2kgY2xzIHNlc3Npb24KKyAqIEBjaWQ6CQlpc2NzaSBjaWQKKyAqCisgKiBDcmVhdGVzIGEgbmV3IGlTQ1NJIGNvbm5lY3Rpb24gaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gc2Vzc2lvbgorICovCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjeGdiM2lfY29ubl9jcmVhdGUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uCisJCQkJCQkgKmNsc19zZXNzaW9uLCB1MzIgY2lkKQoreworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubjsKKwlzdHJ1Y3QgY3hnYjNpX2Nvbm4gKmNjb25uOworCisJY3hnYjNpX2FwaV9kZWJ1Zygic2VzcyAweCVwLCBjaWQgJXUuXG4iLCBjbHNfc2Vzc2lvbiwgY2lkKTsKKworCWNsc19jb25uID0gaXNjc2lfdGNwX2Nvbm5fc2V0dXAoY2xzX3Nlc3Npb24sIHNpemVvZigqY2Nvbm4pLCBjaWQpOworCWlmICghY2xzX2Nvbm4pCisJCXJldHVybiBOVUxMOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwl0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJY2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKworCWNjb25uLT5jb25uID0gY29ubjsKKwlyZXR1cm4gY2xzX2Nvbm47Cit9CisKKy8qKgorICogY3hnYjNpX2Nvbm5fYmluZCAtIGJpbmRzIGlzY3NpIHNlc3MsIGNvbm4gYW5kIGVuZHBvaW50IHRvZ2V0aGVyCisgKiBAY2xzX3Nlc3Npb246CXBvaW50ZXIgdG8gaXNjc2kgY2xzIHNlc3Npb24KKyAqIEBjbHNfY29ubjoJCXBvaW50ZXIgdG8gaXNjc2kgY2xzIGNvbm4KKyAqIEB0cmFuc3BvcnRfZXBoOgk2NC1iaXQgRVAgaGFuZGxlCisgKiBAaXNfbGVhZGluZzoJCWxlYWRpbmcgY29ubmVjdGlvbiBvbiB0aGlzIHNlc3Npb24/CisgKgorICogQmluZHMgdG9nZXRoZXIgYW4gaVNDU0kgc2Vzc2lvbiwgYW4gaVNDU0kgY29ubmVjdGlvbiBhbmQgYQorICoJVENQIGNvbm5lY3Rpb24uIFRoaXMgcm91dGluZSByZXR1cm5zIGVycm9yIGNvZGUgaWYgdGhlIFRDUAorICoJY29ubmVjdGlvbiBkb2VzIG5vdCBiZWxvbmcgb24gdGhlIGRldmljZSBpU0NTSSBzZXNzL2Nvbm4gaXMgYm91bmQKKyAqLworCitzdGF0aWMgaW50IGN4Z2IzaV9jb25uX2JpbmQoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbiwKKwkJCSAgICBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJICAgIHU2NCB0cmFuc3BvcnRfZXBoLCBpbnQgaXNfbGVhZGluZykKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBjeGdiM2lfY29ubiAqY2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXIgKnNuaWM7CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3QgY3hnYjNpX2VuZHBvaW50ICpjZXA7CisJc3RydWN0IHMzX2Nvbm4gKmMzY247CisJaW50IGVycjsKKworCWVwID0gaXNjc2lfbG9va3VwX2VuZHBvaW50KHRyYW5zcG9ydF9lcGgpOworCWlmICghZXApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc2V0dXAgZGRwIHBhZ2VzaXplICovCisJY2VwID0gZXAtPmRkX2RhdGE7CisJYzNjbiA9IGNlcC0+YzNjbjsKKwlzbmljID0gY2VwLT5oYmEtPnNuaWM7CisJZXJyID0gY3hnYjNpX3NldHVwX2Nvbm5faG9zdF9wYWdlc2l6ZShzbmljLT50ZGV2LCBjM2NuLT50aWQsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJY3hnYjNpX2FwaV9kZWJ1ZygiZXAgMHglcCwgY2xzIHNlc3MgMHglcCwgY2xzIGNvbm4gMHglcC5cbiIsCisJCQkgZXAsIGNsc19zZXNzaW9uLCBjbHNfY29ubik7CisKKwllcnIgPSBpc2NzaV9jb25uX2JpbmQoY2xzX3Nlc3Npb24sIGNsc19jb25uLCBpc19sZWFkaW5nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNhbGN1bGF0ZSB0aGUgdGFnIGlkeCBiaXRzIG5lZWRlZCBmb3IgdGhpcyBjb25uIGJhc2VkIG9uIGNtZHNfbWF4ICovCisJY2Nvbm4tPnRhc2tfaWR4X2JpdHMgPSAoX19pbG9nMl91MzIoY29ubi0+c2Vzc2lvbi0+Y21kc19tYXggLSAxKSkgKyAxOworCWN4Z2IzaV9hcGlfZGVidWcoInNlc3Npb24gY21kc19tYXggMHgleCwgYml0cyAldS5cbiIsCisJCQkgY29ubi0+c2Vzc2lvbi0+Y21kc19tYXgsIGNjb25uLT50YXNrX2lkeF9iaXRzKTsKKworCXJlYWRfbG9jaygmYzNjbi0+Y2FsbGJhY2tfbG9jayk7CisJYzNjbi0+dXNlcl9kYXRhID0gY29ubjsKKwljY29ubi0+aGJhID0gY2VwLT5oYmE7CisJY2Nvbm4tPmNlcCA9IGNlcDsKKwljZXAtPmNjb25uID0gY2Nvbm47CisJcmVhZF91bmxvY2soJmMzY24tPmNhbGxiYWNrX2xvY2spOworCisJY3hnYjNpX2Nvbm5fbWF4X3htaXRfZGxlbmd0aChjb25uKTsKKwljeGdiM2lfY29ubl9tYXhfcmVjdl9kbGVuZ3RoKGNvbm4pOworCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwlzcHJpbnRmKGNvbm4tPnBvcnRhbF9hZGRyZXNzLCBOSVBRVUFEX0ZNVCwKKwkJTklQUVVBRChjM2NuLT5kYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKwljb25uLT5wb3J0YWxfcG9ydCA9IG50b2hzKGMzY24tPmRhZGRyLnNpbl9wb3J0KTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisKKwkvKiBpbml0IHJlY3YgZW5naW5lICovCisJaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAodGNwX2Nvbm4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYjNpX2Nvbm5fZ2V0X3BhcmFtIC0gcmV0dXJuIGlzY3NpIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHRvIGNhbGxlcgorICogQGNsc19jb25uOglwb2ludGVyIHRvIGlzY3NpIGNscyBjb25uCisgKiBAcGFyYW06CXBhcmFtZXRlciB0eXBlIGlkZW50aWZpZXIKKyAqIEBidWY6CWJ1ZmZlciBwb2ludGVyCisgKgorICogcmV0dXJucyBpU0NTSSBjb25uZWN0aW9uIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGludCBjeGdiM2lfY29ubl9nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJaW50IGxlbjsKKworCWN4Z2IzaV9hcGlfZGVidWcoImNsc19jb25uIDB4JXAsIHBhcmFtICVkLlxuIiwgY2xzX2Nvbm4sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJbGVuID0gc3ByaW50ZihidWYsICIlaHVcbiIsIGNvbm4tPnBvcnRhbF9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJc3Bpbl9sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwgY29ubi0+cG9ydGFsX2FkZHJlc3MpOworCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBpc2NzaV9jb25uX2dldF9wYXJhbShjbHNfY29ubiwgcGFyYW0sIGJ1Zik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBjeGdiM2lfY29ubl9zZXRfcGFyYW0gLSBzZXQgaXNjc2kgY29ubmVjdGlvbiBwYXJhbWV0ZXIKKyAqIEBjbHNfY29ubjoJcG9pbnRlciB0byBpc2NzaSBjbHMgY29ubgorICogQHBhcmFtOglwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyCisgKiBAYnVmOglidWZmZXIgcG9pbnRlcgorICogQGJ1ZmxlbjoJYnVmZmVyIGxlbmd0aAorICoKKyAqIHNldCBpU0NTSSBjb25uZWN0aW9uIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGludCBjeGdiM2lfY29ubl9zZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBjeGdiM2lfY29ubiAqY2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgY3hnYjNpX2FkYXB0ZXIgKnNuaWMgPSBjY29ubi0+aGJhLT5zbmljOworCXN0cnVjdCBzM19jb25uICpjM2NuID0gY2Nvbm4tPmNlcC0+YzNjbjsKKwlpbnQgdmFsdWUsIGVyciA9IDA7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQllcnIgPSBpc2NzaV9zZXRfcGFyYW0oY2xzX2Nvbm4sIHBhcmFtLCBidWYsIGJ1Zmxlbik7CisJCWlmICghZXJyICYmIGNvbm4tPmhkcmRnc3RfZW4pCisJCQllcnIgPSBjeGdiM2lfc2V0dXBfY29ubl9kaWdlc3Qoc25pYy0+dGRldiwgYzNjbi0+dGlkLAorCQkJCQkJCWNvbm4tPmhkcmRnc3RfZW4sCisJCQkJCQkJY29ubi0+ZGF0YWRnc3RfZW4sIDApOworCQlicmVhazsKKwljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQllcnIgPSBpc2NzaV9zZXRfcGFyYW0oY2xzX2Nvbm4sIHBhcmFtLCBidWYsIGJ1Zmxlbik7CisJCWlmICghZXJyICYmIGNvbm4tPmRhdGFkZ3N0X2VuKQorCQkJZXJyID0gY3hnYjNpX3NldHVwX2Nvbm5fZGlnZXN0KHNuaWMtPnRkZXYsIGMzY24tPnRpZCwKKwkJCQkJCQljb25uLT5oZHJkZ3N0X2VuLAorCQkJCQkJCWNvbm4tPmRhdGFkZ3N0X2VuLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgorCQlzc2NhbmYoYnVmLCAiJWQiLCAmdmFsdWUpOworCQlpZiAodmFsdWUgPD0gMCB8fCAhaXNfcG93ZXJfb2ZfMih2YWx1ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHNlc3Npb24tPm1heF9yMnQgPT0gdmFsdWUpCisJCQlicmVhazsKKwkJaXNjc2lfdGNwX3IydHBvb2xfZnJlZShzZXNzaW9uKTsKKwkJZXJyID0gaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmLCBidWZsZW4pOworCQlpZiAoIWVyciAmJiBpc2NzaV90Y3BfcjJ0cG9vbF9hbGxvYyhzZXNzaW9uKSkKKwkJCXJldHVybiAtRU5PTUVNOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJZXJyID0gaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmLCBidWZsZW4pOworCQlpZiAoIWVycikKKwkJCWVyciA9IGN4Z2IzaV9jb25uX21heF9yZWN2X2RsZW5ndGgoY29ubik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJZXJyID0gaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmLCBidWZsZW4pOworCQlpZiAoIWVycikKKwkJCWVyciA9IGN4Z2IzaV9jb25uX21heF94bWl0X2RsZW5ndGgoY29ubik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBpc2NzaV9zZXRfcGFyYW0oY2xzX2Nvbm4sIHBhcmFtLCBidWYsIGJ1Zmxlbik7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogY3hnYjNpX2hvc3Rfc2V0X3BhcmFtIC0gY29uZmlndXJlIGhvc3QgKGFkYXB0ZXIpIHJlbGF0ZWQgcGFyYW1ldGVycworICogQHNob3N0OglzY3NpIGhvc3QgcG9pbnRlcgorICogQHBhcmFtOglwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyCisgKiBAYnVmOglidWZmZXIgcG9pbnRlcgorICovCitzdGF0aWMgaW50IGN4Z2IzaV9ob3N0X3NldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkgZW51bSBpc2NzaV9ob3N0X3BhcmFtIHBhcmFtLAorCQkJCSBjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJc3RydWN0IGN4Z2IzaV9oYmEgKmhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisKKwljeGdiM2lfYXBpX2RlYnVnKCJwYXJhbSAlZCwgYnVmICVzLlxuIiwgcGFyYW0sIGJ1Zik7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKKwl7CisJCV9fYmUzMiBhZGRyID0gaW5fYXRvbihidWYpOworCQljeGdiM2lfc2V0X3ByaXZhdGVfaXB2NGFkZHIoaGJhLT5uZGV2LCBhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX05FVERFVl9OQU1FOgorCQkvKiBpZ25vcmUgKi8KKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlzY3NpX2hvc3Rfc2V0X3BhcmFtKHNob3N0LCBwYXJhbSwgYnVmLCBidWZsZW4pOworCX0KK30KKworLyoqCisgKiBjeGdiM2lfaG9zdF9nZXRfcGFyYW0gLSByZXR1cm5zIGhvc3QgKGFkYXB0ZXIpIHJlbGF0ZWQgcGFyYW1ldGVycworICogQHNob3N0OglzY3NpIGhvc3QgcG9pbnRlcgorICogQHBhcmFtOglwYXJhbWV0ZXIgdHlwZSBpZGVudGlmaWVyCisgKiBAYnVmOglidWZmZXIgcG9pbnRlcgorICovCitzdGF0aWMgaW50IGN4Z2IzaV9ob3N0X2dldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkgZW51bSBpc2NzaV9ob3N0X3BhcmFtIHBhcmFtLCBjaGFyICpidWYpCit7CisJc3RydWN0IGN4Z2IzaV9oYmEgKmhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJaW50IGxlbiA9IDA7CisKKwljeGdiM2lfYXBpX2RlYnVnKCJoYmEgJXMsIHBhcmFtICVkLlxuIiwgaGJhLT5uZGV2LT5uYW1lLCBwYXJhbSk7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJbGVuID0gc3lzZnNfZm9ybWF0X21hYyhidWYsIGhiYS0+bmRldi0+ZGV2X2FkZHIsIDYpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsIGhiYS0+bmRldi0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M6CisJeworCQlfX2JlMzIgYWRkcjsKKworCQlhZGRyID0gY3hnYjNpX2dldF9wcml2YXRlX2lwdjRhZGRyKGhiYS0+bmRldik7CisJCWxlbiA9IHNwcmludGYoYnVmLCBOSVBRVUFEX0ZNVCwgTklQUVVBRChhZGRyKSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gaXNjc2lfaG9zdF9nZXRfcGFyYW0oc2hvc3QsIHBhcmFtLCBidWYpOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGN4Z2IzaV9jb25uX2dldF9zdGF0cyAtIHJldHVybnMgaVNDU0kgc3RhdHMKKyAqIEBjbHNfY29ubjoJcG9pbnRlciB0byBpc2NzaSBjbHMgY29ubgorICogQHN0YXRzOglwb2ludGVyIHRvIGlzY3NpIHN0YXRpc3RpYyBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgY3hnYjNpX2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkJICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisKKwlzdGF0cy0+dHhkYXRhX29jdGV0cyA9IGNvbm4tPnR4ZGF0YV9vY3RldHM7CisJc3RhdHMtPnJ4ZGF0YV9vY3RldHMgPSBjb25uLT5yeGRhdGFfb2N0ZXRzOworCXN0YXRzLT5zY3NpY21kX3BkdXMgPSBjb25uLT5zY3NpY21kX3BkdXNfY250OworCXN0YXRzLT5kYXRhb3V0X3BkdXMgPSBjb25uLT5kYXRhb3V0X3BkdXNfY250OworCXN0YXRzLT5zY3NpcnNwX3BkdXMgPSBjb25uLT5zY3NpcnNwX3BkdXNfY250OworCXN0YXRzLT5kYXRhaW5fcGR1cyA9IGNvbm4tPmRhdGFpbl9wZHVzX2NudDsKKwlzdGF0cy0+cjJ0X3BkdXMgPSBjb25uLT5yMnRfcGR1c19jbnQ7CisJc3RhdHMtPnRtZmNtZF9wZHVzID0gY29ubi0+dG1mY21kX3BkdXNfY250OworCXN0YXRzLT50bWZyc3BfcGR1cyA9IGNvbm4tPnRtZnJzcF9wZHVzX2NudDsKKwlzdGF0cy0+ZGlnZXN0X2VyciA9IDA7CisJc3RhdHMtPnRpbWVvdXRfZXJyID0gMDsKKwlzdGF0cy0+Y3VzdG9tX2xlbmd0aCA9IDE7CisJc3RyY3B5KHN0YXRzLT5jdXN0b21bMF0uZGVzYywgImVoX2Fib3J0X2NudCIpOworCXN0YXRzLT5jdXN0b21bMF0udmFsdWUgPSBjb25uLT5laF9hYm9ydF9jbnQ7Cit9CisKKy8qKgorICogY3hnYjNpX3BhcnNlX2l0dCAtIGdldCB0aGUgaWR4IGFuZCBhZ2UgYml0cyBmcm9tIGEgZ2l2ZW4gdGFnCisgKiBAY29ubjoJaXNjc2kgY29ubmVjdGlvbgorICogQGl0dDoJaXR0IHRhZworICogQGlkeDoJdGFzayBpbmRleCwgZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24KKyAqIEBhZ2U6CXNlc3Npb24gYWdlLCBmaWxsZWQgaW4gYnkgdGhpcyBmdW5jdGlvbgorICovCitzdGF0aWMgdm9pZCBjeGdiM2lfcGFyc2VfaXR0KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBpdHRfdCBpdHQsCisJCQkgICAgIGludCAqaWR4LCBpbnQgKmFnZSkKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgY3hnYjNpX2Nvbm4gKmNjb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGN4Z2IzaV9hZGFwdGVyICpzbmljID0gY2Nvbm4tPmhiYS0+c25pYzsKKwl1MzIgdGFnID0gbnRvaGwoKF9fZm9yY2UgdTMyKSBpdHQpOworCXUzMiBzd19iaXRzOworCisJc3dfYml0cyA9IGN4Z2IzaV90YWdfbm9ucnN2ZF9iaXRzKCZzbmljLT50YWdfZm9ybWF0LCB0YWcpOworCWlmIChpZHgpCisJCSppZHggPSBzd19iaXRzICYgKCgxIDw8IGNjb25uLT50YXNrX2lkeF9iaXRzKSAtIDEpOworCWlmIChhZ2UpCisJCSphZ2UgPSAoc3dfYml0cyA+PiBjY29ubi0+dGFza19pZHhfYml0cykgJiBJU0NTSV9BR0VfTUFTSzsKKworCWN4Z2IzaV90YWdfZGVidWcoInBhcnNlIHRhZyAweCV4LzB4JXgsIHN3IDB4JXgsIGl0dCAweCV4LCBhZ2UgMHgleC5cbiIsCisJCQkgdGFnLCBpdHQsIHN3X2JpdHMsIGlkeCA/ICppZHggOiAweEZGRkZGLAorCQkJIGFnZSA/ICphZ2UgOiAweEZGKTsKK30KKworLyoqCisgKiBjeGdiM2lfcmVzZXJ2ZV9pdHQgLSBnZW5lcmF0ZSB0YWcgZm9yIGEgZ2l2ZSB0YXNrCisgKiBUcnkgdG8gc2V0IHVwIGRkcCBmb3IgYSBzY3NpIHJlYWQgdGFzay4KKyAqIEB0YXNrOiBpc2NzaSB0YXNrCisgKiBAaGRyX2l0dDogdGFnLCBmaWxsZWQgaW4gYnkgdGhpcyBmdW5jdGlvbgorICovCitpbnQgY3hnYjNpX3Jlc2VydmVfaXR0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCBpdHRfdCAqaGRyX2l0dCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRhc2stPnNjOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzcyA9IGNvbm4tPnNlc3Npb247CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGN4Z2IzaV9jb25uICpjY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOworCXN0cnVjdCBjeGdiM2lfYWRhcHRlciAqc25pYyA9IGNjb25uLT5oYmEtPnNuaWM7CisJc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0ICp0Zm9ybWF0ID0gJnNuaWMtPnRhZ19mb3JtYXQ7CisJdTMyIHN3X3RhZyA9IChzZXNzLT5hZ2UgPDwgY2Nvbm4tPnRhc2tfaWR4X2JpdHMpIHwgdGFzay0+aXR0OworCXUzMiB0YWc7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoc2MgJiYKKwkgICAgKHNjc2lfYmlkaV9jbW5kKHNjKSB8fCBzYy0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSAmJgorCSAgICBjeGdiM2lfc3dfdGFnX3VzYWJsZSh0Zm9ybWF0LCBzd190YWcpKSB7CisJCXN0cnVjdCBzM19jb25uICpjM2NuID0gY2Nvbm4tPmNlcC0+YzNjbjsKKwkJc3RydWN0IGN4Z2IzaV9nYXRoZXJfbGlzdCAqZ2w7CisKKwkJZ2wgPSBjeGdiM2lfZGRwX21ha2VfZ2woc2NzaV9pbihzYyktPmxlbmd0aCwKKwkJCQkJc2NzaV9pbihzYyktPnRhYmxlLnNnbCwKKwkJCQkJc2NzaV9pbihzYyktPnRhYmxlLm5lbnRzLAorCQkJCQlzbmljLT5wZGV2LAorCQkJCQlHRlBfQVRPTUlDKTsKKwkJaWYgKGdsKSB7CisJCQl0YWcgPSBzd190YWc7CisJCQllcnIgPSBjeGdiM2lfZGRwX3RhZ19yZXNlcnZlKHNuaWMtPnRkZXYsIGMzY24tPnRpZCwKKwkJCQkJCSAgICAgdGZvcm1hdCwgJnRhZywKKwkJCQkJCSAgICAgZ2wsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVyciA8IDApCisJCQkJY3hnYjNpX2RkcF9yZWxlYXNlX2dsKGdsLCBzbmljLT5wZGV2KTsKKwkJfQorCX0KKworCWlmIChlcnIgPCAwKQorCQl0YWcgPSBjeGdiM2lfc2V0X25vbl9kZHBfdGFnKHRmb3JtYXQsIHN3X3RhZyk7CisJLyogdGhlIGl0dCBuZWVkIHRvIHNlbnQgaW4gYmlnLWVuZGlhbiBvcmRlciAqLworCSpoZHJfaXR0ID0gKF9fZm9yY2UgaXR0X3QpaHRvbmwodGFnKTsKKworCWN4Z2IzaV90YWdfZGVidWcoIm5ldyB0YWcgMHgleC8weCV4IChpdHQgMHgleCwgYWdlIDB4JXgpLlxuIiwKKwkJCSB0YWcsICpoZHJfaXR0LCB0YXNrLT5pdHQsIHNlc3MtPmFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYjNpX3JlbGVhc2VfaXR0IC0gcmVsZWFzZSB0aGUgdGFnIGZvciBhIGdpdmVuIHRhc2sKKyAqIGlmIHRoZSB0YWcgaXMgYSBkZHAgdGFnLCByZWxlYXNlIHRoZSBkZHAgc2V0dXAKKyAqIEB0YXNrOglpc2NzaSB0YXNrCisgKiBAaGRyX2l0dDoJdGFnCisgKi8KK3ZvaWQgY3hnYjNpX3JlbGVhc2VfaXR0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCBpdHRfdCBoZHJfaXR0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGFzay0+c2M7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IHRhc2stPmNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGN4Z2IzaV9jb25uICpjY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOworCXN0cnVjdCBjeGdiM2lfYWRhcHRlciAqc25pYyA9IGNjb25uLT5oYmEtPnNuaWM7CisJc3RydWN0IGN4Z2IzaV90YWdfZm9ybWF0ICp0Zm9ybWF0ID0gJnNuaWMtPnRhZ19mb3JtYXQ7CisJdTMyIHRhZyA9IG50b2hsKChfX2ZvcmNlIHUzMiloZHJfaXR0KTsKKworCWN4Z2IzaV90YWdfZGVidWcoInJlbGVhc2UgdGFnIDB4JXguXG4iLCB0YWcpOworCisJaWYgKHNjICYmCisJICAgIChzY3NpX2JpZGlfY21uZChzYykgfHwgc2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgJiYKKwkgICAgY3hnYjNpX2lzX2RkcF90YWcodGZvcm1hdCwgdGFnKSkKKwkJY3hnYjNpX2RkcF90YWdfcmVsZWFzZShzbmljLT50ZGV2LCB0YWcpOworfQorCisvKioKKyAqIGN4Z2IzaV9ob3N0X3RlbXBsYXRlIC0tIFNjc2lfSG9zdF9UZW1wbGF0ZSBzdHJ1Y3R1cmUKKyAqCXVzZWQgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBzY3NpIG1pZCBsYXllcgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBjeGdiM2lfaG9zdF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gIkNoZWxzaW8gUzN4eCBpU0NTSSBJbml0aWF0b3IiLAorCS5wcm9jX25hbWUJCT0gImN4Z2IzaSIsCisJLnF1ZXVlY29tbWFuZAkJPSBpc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aAk9IGlzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2FuX3F1ZXVlCQk9IDEyOCAqIChJU0NTSV9ERUZfWE1JVF9DTURTX01BWCAtIDEpLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5tYXhfc2VjdG9ycwkJPSAweEZGRkYsCisJLmNtZF9wZXJfbHVuCQk9IElTQ1NJX0RFRl9DTURfUEVSX0xVTiwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGlzY3NpX2VoX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IGlzY3NpX2VoX2RldmljZV9yZXNldCwKKwkuZWhfdGFyZ2V0X3Jlc2V0X2hhbmRsZXIgPSBpc2NzaV9laF90YXJnZXRfcmVzZXQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkudGhpc19pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGN4Z2IzaV9pc2NzaV90cmFuc3BvcnQgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImN4Z2IzaSIsCisJLmNhcHMJCQk9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9NVUxUSV9SMlQgfCBDQVBfSERSREdTVAorCQkJCXwgQ0FQX0RBVEFER1NUIHwgQ0FQX0RJR0VTVF9PRkZMT0FEIHwKKwkJCQlDQVBfUEFERElOR19PRkZMT0FELAorCS5wYXJhbV9tYXNrCQk9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfAorCQkJCUlTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAorCQkJCUlTQ1NJX0hEUkRHU1RfRU4gfAorCQkJCUlTQ1NJX0RBVEFER1NUX0VOIHwKKwkJCQlJU0NTSV9JTklUSUFMX1IyVF9FTiB8CisJCQkJSVNDU0lfTUFYX1IyVCB8CisJCQkJSVNDU0lfSU1NX0RBVEFfRU4gfAorCQkJCUlTQ1NJX0ZJUlNUX0JVUlNUIHwKKwkJCQlJU0NTSV9NQVhfQlVSU1QgfAorCQkJCUlTQ1NJX1BEVV9JTk9SREVSX0VOIHwKKwkJCQlJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfAorCQkJCUlTQ1NJX0VSTCB8CisJCQkJSVNDU0lfQ09OTl9QT1JUIHwKKwkJCQlJU0NTSV9DT05OX0FERFJFU1MgfAorCQkJCUlTQ1NJX0VYUF9TVEFUU04gfAorCQkJCUlTQ1NJX1BFUlNJU1RFTlRfUE9SVCB8CisJCQkJSVNDU0lfUEVSU0lTVEVOVF9BRERSRVNTIHwKKwkJCQlJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAorCQkJCUlTQ1NJX1VTRVJOQU1FIHwgSVNDU0lfUEFTU1dPUkQgfAorCQkJCUlTQ1NJX1VTRVJOQU1FX0lOIHwgSVNDU0lfUEFTU1dPUkRfSU4gfAorCQkJCUlTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAorCQkJCUlTQ1NJX0xVX1JFU0VUX1RNTyB8CisJCQkJSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8CisJCQkJSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAorCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKKwkJCUlTQ1NJX0hPU1RfSU5JVElBVE9SX05BTUUgfCBJU0NTSV9IT1NUX05FVERFVl9OQU1FLAorCS5nZXRfaG9zdF9wYXJhbQkJPSBjeGdiM2lfaG9zdF9nZXRfcGFyYW0sCisJLnNldF9ob3N0X3BhcmFtCQk9IGN4Z2IzaV9ob3N0X3NldF9wYXJhbSwKKwkvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KKwkuY3JlYXRlX3Nlc3Npb24JCT0gY3hnYjNpX3Nlc3Npb25fY3JlYXRlLAorCS5kZXN0cm95X3Nlc3Npb24JPSBjeGdiM2lfc2Vzc2lvbl9kZXN0cm95LAorCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLAorCS8qIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAqLworCS5jcmVhdGVfY29ubgkJPSBjeGdiM2lfY29ubl9jcmVhdGUsCisJLmJpbmRfY29ubgkJPSBjeGdiM2lfY29ubl9iaW5kLAorCS5kZXN0cm95X2Nvbm4JCT0gaXNjc2lfdGNwX2Nvbm5fdGVhcmRvd24sCisJLnN0YXJ0X2Nvbm4JCT0gaXNjc2lfY29ubl9zdGFydCwKKwkuc3RvcF9jb25uCQk9IGlzY3NpX2Nvbm5fc3RvcCwKKwkuZ2V0X2Nvbm5fcGFyYW0JCT0gY3hnYjNpX2Nvbm5fZ2V0X3BhcmFtLAorCS5zZXRfcGFyYW0JCT0gY3hnYjNpX2Nvbm5fc2V0X3BhcmFtLAorCS5nZXRfc3RhdHMJCT0gY3hnYjNpX2Nvbm5fZ2V0X3N0YXRzLAorCS8qIHBkdSB4bWl0IHJlcS4gZnJvbSB1c2VyIHNwYWNlICovCisJLnNlbmRfcGR1CQk9IGlzY3NpX2Nvbm5fc2VuZF9wZHUsCisJLyogdGFzayAqLworCS5pbml0X3Rhc2sJCT0gaXNjc2lfdGNwX3Rhc2tfaW5pdCwKKwkueG1pdF90YXNrCQk9IGlzY3NpX3RjcF90YXNrX3htaXQsCisJLmNsZWFudXBfdGFzawkJPSBjeGdiM2lfY29ubl9jbGVhbnVwX3Rhc2ssCisKKwkvKiBwZHUgKi8KKwkuYWxsb2NfcGR1CQk9IGN4Z2IzaV9jb25uX2FsbG9jX3BkdSwKKwkuaW5pdF9wZHUJCT0gY3hnYjNpX2Nvbm5faW5pdF9wZHUsCisJLnhtaXRfcGR1CQk9IGN4Z2IzaV9jb25uX3htaXRfcGR1LAorCS5wYXJzZV9wZHVfaXR0CQk9IGN4Z2IzaV9wYXJzZV9pdHQsCisKKwkvKiBUQ1AgY29ubmVjdC9kaXNjb25uZWN0ICovCisJLmVwX2Nvbm5lY3QJCT0gY3hnYjNpX2VwX2Nvbm5lY3QsCisJLmVwX3BvbGwJCT0gY3hnYjNpX2VwX3BvbGwsCisJLmVwX2Rpc2Nvbm5lY3QJCT0gY3hnYjNpX2VwX2Rpc2Nvbm5lY3QsCisJLyogRXJyb3IgcmVjb3ZlcnkgdGltZW91dCBjYWxsICovCisJLnNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQgPSBpc2NzaV9zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0LAorfTsKKworaW50IGN4Z2IzaV9pc2NzaV9pbml0KHZvaWQpCit7CisJc3dfdGFnX2lkeF9iaXRzID0gKF9faWxvZzJfdTMyKElTQ1NJX0lUVF9NQVNLKSkgKyAxOworCXN3X3RhZ19hZ2VfYml0cyA9IChfX2lsb2cyX3UzMihJU0NTSV9BR0VfTUFTSykpICsgMTsKKwljeGdiM2lfbG9nX2luZm8oInRhZyBpdHQgMHgleCwgJXUgYml0cywgYWdlIDB4JXgsICV1IGJpdHMuXG4iLAorCQkJSVNDU0lfSVRUX01BU0ssIHN3X3RhZ19pZHhfYml0cywKKwkJCUlTQ1NJX0FHRV9NQVNLLCBzd190YWdfYWdlX2JpdHMpOworCisJY3hnYjNpX3Njc2lfdHJhbnNwb3J0ID0KKwkgICAgaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KCZjeGdiM2lfaXNjc2lfdHJhbnNwb3J0KTsKKwlpZiAoIWN4Z2IzaV9zY3NpX3RyYW5zcG9ydCkgeworCQljeGdiM2lfbG9nX2Vycm9yKCJDb3VsZCBub3QgcmVnaXN0ZXIgY3hnYjNpIHRyYW5zcG9ydC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY3hnYjNpX2FwaV9kZWJ1ZygiY3hnYjNpIHRyYW5zcG9ydCAweCVwLlxuIiwgY3hnYjNpX3Njc2lfdHJhbnNwb3J0KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjeGdiM2lfaXNjc2lfY2xlYW51cCh2b2lkKQoreworCWlmIChjeGdiM2lfc2NzaV90cmFuc3BvcnQpIHsKKwkJY3hnYjNpX2FwaV9kZWJ1ZygiY3hnYjNpIHRyYW5zcG9ydCAweCVwLlxuIiwKKwkJCQkgY3hnYjNpX3Njc2lfdHJhbnNwb3J0KTsKKwkJaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJmN4Z2IzaV9pc2NzaV90cmFuc3BvcnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuYyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY1ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfb2ZmbG9hZC5jCkBAIC0wLDAgKzEsMTgxMCBAQAorLyoKKyAqIGN4Z2IzaV9vZmZsb2FkLmM6IENoZWxzaW8gUzN4eCBpc2NzaSBvZmZsb2FkZWQgdGNwIGNvbm5lY3Rpb24gbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluY2x1ZGVkIGluIHRoaXMKKyAqIHJlbGVhc2UgZm9yIGxpY2Vuc2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKyAqCisgKiBXcml0dGVuIGJ5OglEaW1pdHJpcyBNaWNoYWlsaWRpcyAoZG1AY2hlbHNpby5jb20pCisgKgkJS2FyZW4gWGllIChreGllQGNoZWxzaW8uY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAiY3hnYjNfZGVmcy5oIgorI2luY2x1ZGUgImN4Z2IzX2N0bF9kZWZzLmgiCisjaW5jbHVkZSAiZmlybXdhcmVfZXhwb3J0cy5oIgorI2luY2x1ZGUgImN4Z2IzaV9vZmZsb2FkLmgiCisjaW5jbHVkZSAiY3hnYjNpX3BkdS5oIgorI2luY2x1ZGUgImN4Z2IzaV9kZHAuaCIKKworI2lmZGVmIF9fREVCVUdfQzNDTl9DT05OX18KKyNkZWZpbmUgYzNjbl9jb25uX2RlYnVnICAgICAgICAgY3hnYjNpX2xvZ19pbmZvCisjZWxzZQorI2RlZmluZSBjM2NuX2Nvbm5fZGVidWcoZm10Li4uKQorI2VuZGlmCisKKyNpZmRlZiBfX0RFQlVHX0MzQ05fVFhfXworI2RlZmluZSBjM2NuX3R4X2RlYnVnICAgICAgICAgY3hnYjNpX2xvZ19kZWJ1ZworI2Vsc2UKKyNkZWZpbmUgYzNjbl90eF9kZWJ1ZyhmbXQuLi4pCisjZW5kaWYKKworI2lmZGVmIF9fREVCVUdfQzNDTl9SWF9fCisjZGVmaW5lIGMzY25fcnhfZGVidWcgICAgICAgICBjeGdiM2lfbG9nX2RlYnVnCisjZWxzZQorI2RlZmluZSBjM2NuX3J4X2RlYnVnKGZtdC4uLikKKyNlbmRpZgorCisvKgorICogbW9kdWxlIHBhcmFtZXRlcnMgcmVsZWF0ZWQgdG8gb2ZmbG9hZGVkIGlzY3NpIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIGludCBjeGdiM19yY3Zfd2luID0gMjU2ICogMTAyNDsKK21vZHVsZV9wYXJhbShjeGdiM19yY3Zfd2luLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjeGdiM19yY3Zfd2luLCAiVENQIHJlY2VpdmUgd2luZG93IGluIGJ5dGVzIChkZWZhdWx0PTI1NktCKSIpOworCitzdGF0aWMgaW50IGN4Z2IzX3NuZF93aW4gPSA2NCAqIDEwMjQ7Cittb2R1bGVfcGFyYW0oY3hnYjNfc25kX3dpbiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3hnYjNfc25kX3dpbiwgIlRDUCBzZW5kIHdpbmRvdyBpbiBieXRlcyAoZGVmYXVsdD02NEtCKSIpOworCitzdGF0aWMgaW50IGN4Z2IzX3J4X2NyZWRpdF90aHJlcyA9IDEwICogMTAyNDsKK21vZHVsZV9wYXJhbShjeGdiM19yeF9jcmVkaXRfdGhyZXMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NyZWRpdF90aHJlcywKKwkJICJSWCBjcmVkaXRzIHJldHVybiB0aHJlc2hvbGQgaW4gYnl0ZXMgKGRlZmF1bHQ9MTBLQikiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjeGdiM19tYXhfY29ubmVjdCA9IDggKiAxMDI0OworbW9kdWxlX3BhcmFtKGN4Z2IzX21heF9jb25uZWN0LCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3hnYjNfbWF4X2Nvbm5lY3QsICJNYXguICMgb2YgY29ubmVjdGlvbnMgKGRlZmF1bHQ9ODA5MikiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjeGdiM19zcG9ydF9iYXNlID0gMjAwMDA7Cittb2R1bGVfcGFyYW0oY3hnYjNfc3BvcnRfYmFzZSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGN4Z2IzX3Nwb3J0X2Jhc2UsICJzdGFydGluZyBwb3J0IG51bWJlciAoZGVmYXVsdD0yMDAwMCkiKTsKKworLyoKKyAqIGN4Z2IzaSB0Y3AgY29ubmVjdGlvbiBkYXRhKHBlciBhZGFwdGVyKSBsaXN0CisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoY2RhdGFfbGlzdCk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhjZGF0YV9yd2xvY2spOworCitzdGF0aWMgaW50IGMzY25fcHVzaF90eF9mcmFtZXMoc3RydWN0IHMzX2Nvbm4gKmMzY24sIGludCByZXFfY29tcGxldGlvbik7CitzdGF0aWMgdm9pZCBjM2NuX3JlbGVhc2Vfb2ZmbG9hZF9yZXNvdXJjZXMoc3RydWN0IHMzX2Nvbm4gKmMzY24pOworCisvKgorICogaXNjc2kgc291cmNlIHBvcnQgbWFuYWdlbWVudAorICoKKyAqIEZpbmQgYSBmcmVlIHNvdXJjZSBwb3J0IGluIHRoZSBwb3J0IGFsbG9jYXRpb24gbWFwLiBXZSB1c2UgYSB2ZXJ5IHNpbXBsZQorICogcm90b3Igc2NoZW1lIHRvIGxvb2sgZm9yIHRoZSBuZXh0IGZyZWUgcG9ydC4KKyAqCisgKiBJZiBhIHNvdXJjZSBwb3J0IGhhcyBiZWVuIHNwZWNpZmllZCBtYWtlIHN1cmUgdGhhdCBpdCBkb2Vzbid0IGNvbGxpZGUgd2l0aAorICogb3VyIG5vcm1hbCBzb3VyY2UgcG9ydCBhbGxvY2F0aW9uIG1hcC4gIElmIGl0J3Mgb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygb3VyCisgKiBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBzY2hlbWUganVzdCBsZXQgdGhlbSB1c2UgaXQuCisgKgorICogSWYgdGhlIHNvdXJjZSBwb3J0IGlzIG91dHNpZGUgb3VyIGFsbG9jYXRpb24gcmFuZ2UsIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZWlyIHBvcnQgdXNhZ2UuCisgKi8KK3N0YXRpYyBpbnQgYzNjbl9nZXRfcG9ydChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhKQoreworCXVuc2lnbmVkIGludCBzdGFydDsKKwlpbnQgaWR4OworCisJaWYgKCFjZGF0YSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAoYzNjbi0+c2FkZHIuc2luX3BvcnQgIT0gMCkgeworCQlpZHggPSBudG9ocyhjM2NuLT5zYWRkci5zaW5fcG9ydCkgLSBjeGdiM19zcG9ydF9iYXNlOworCQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gY3hnYjNfbWF4X2Nvbm5lY3QpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGlkeCwgY2RhdGEtPnNwb3J0X21hcCkpCisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJLyogdGhlIHNwb3J0X21hcF9uZXh0IG1heSBub3QgYmUgYWNjdXJhdGUgYnV0IHRoYXQgaXMgb2theSwgc3BvcnRfbWFwCisJICAgc2hvdWxkIGJlICovCisJc3RhcnQgPSBpZHggPSBjZGF0YS0+c3BvcnRfbWFwX25leHQ7CisJZG8geworCQlpZiAoKytpZHggPj0gY3hnYjNfbWF4X2Nvbm5lY3QpCisJCQlpZHggPSAwOworCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KGlkeCwgY2RhdGEtPnNwb3J0X21hcCkpKSB7CisJCQljM2NuLT5zYWRkci5zaW5fcG9ydCA9IGh0b25zKGN4Z2IzX3Nwb3J0X2Jhc2UgKyBpZHgpOworCQkJY2RhdGEtPnNwb3J0X21hcF9uZXh0ID0gaWR4OworCQkJYzNjbl9jb25uX2RlYnVnKCIlcyByZXNlcnZlIHBvcnQgJXUuXG4iLAorCQkJCQljZGF0YS0+Y2Rldi0+bmFtZSwKKwkJCQkJY3hnYjNfc3BvcnRfYmFzZSArIGlkeCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKGlkeCAhPSBzdGFydCk7CisKK2Vycm9yX291dDoKKwlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Cit9CisKK3N0YXRpYyB2b2lkIGMzY25fcHV0X3BvcnQoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhID0gQ1hHQjNfU0RFVl9EQVRBKGMzY24tPmNkZXYpOworCisJaWYgKGMzY24tPnNhZGRyLnNpbl9wb3J0KSB7CisJCWludCBpZHggPSBudG9ocyhjM2NuLT5zYWRkci5zaW5fcG9ydCkgLSBjeGdiM19zcG9ydF9iYXNlOworCisJCWMzY24tPnNhZGRyLnNpbl9wb3J0ID0gMDsKKwkJaWYgKGlkeCA8IDAgfHwgaWR4ID49IGN4Z2IzX21heF9jb25uZWN0KQorCQkJcmV0dXJuOworCQljbGVhcl9iaXQoaWR4LCBjZGF0YS0+c3BvcnRfbWFwKTsKKwkJYzNjbl9jb25uX2RlYnVnKCIlcywgcmVsZWFzZSBwb3J0ICV1LlxuIiwKKwkJCQljZGF0YS0+Y2Rldi0+bmFtZSwgY3hnYjNfc3BvcnRfYmFzZSArIGlkeCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYzNjbl9zZXRfZmxhZyhzdHJ1Y3QgczNfY29ubiAqYzNjbiwgZW51bSBjM2NuX2ZsYWdzIGZsYWcpCit7CisJX19zZXRfYml0KGZsYWcsICZjM2NuLT5mbGFncyk7CisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHNldCAlZCwgcyAldSwgZiAweCVseC5cbiIsCisJCQljM2NuLCBmbGFnLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYzNjbl9jbGVhcl9mbGFnKHN0cnVjdCBzM19jb25uICpjM2NuLCBlbnVtIGMzY25fZmxhZ3MgZmxhZykKK3sKKwlfX2NsZWFyX2JpdChmbGFnLCAmYzNjbi0+ZmxhZ3MpOworCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwLCBjbGVhciAlZCwgcyAldSwgZiAweCVseC5cbiIsCisJCQljM2NuLCBmbGFnLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjM2NuX2ZsYWcoc3RydWN0IHMzX2Nvbm4gKmMzY24sIGVudW0gYzNjbl9mbGFncyBmbGFnKQoreworCWlmIChjM2NuID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiB0ZXN0X2JpdChmbGFnLCAmYzNjbi0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjM2NuX3NldF9zdGF0ZShzdHJ1Y3QgczNfY29ubiAqYzNjbiwgaW50IHN0YXRlKQoreworCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwIHN0YXRlIC0+ICV1LlxuIiwgYzNjbiwgc3RhdGUpOworCWMzY24tPnN0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjM2NuX2hvbGQoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJYXRvbWljX2luYygmYzNjbi0+cmVmY250KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGMzY25fcHV0KHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjM2NuLT5yZWZjbnQpKSB7CisJCWMzY25fY29ubl9kZWJ1ZygiZnJlZSBjM2NuIDB4JXAsIHMgJXUsIGYgMHglbHguXG4iLAorCQkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisJCWtmcmVlKGMzY24pOworCX0KK30KKworc3RhdGljIHZvaWQgYzNjbl9jbG9zZWQoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCSBjM2NuLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworCisJYzNjbl9wdXRfcG9ydChjM2NuKTsKKwljM2NuX3JlbGVhc2Vfb2ZmbG9hZF9yZXNvdXJjZXMoYzNjbik7CisJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9DTE9TRUQpOworCWN4Z2IzaV9jb25uX2Nsb3NpbmcoYzNjbik7Cit9CisKKy8qCisgKiBDUEwgKENoZWxzaW8gUHJvdG9jb2wgTGFuZ3VhZ2UpIGRlZmluZXMgYSBtZXNzYWdlIHBhc3NpbmcgaW50ZXJmYWNlIGJldHdlZW4KKyAqIHRoZSBob3N0IGRyaXZlciBhbmQgVDMgYXNpYy4KKyAqIFRoZSBzZWN0aW9uIGJlbG93IGltcGxtZW50cyBDUExzIHRoYXQgcmVsYXRlZCB0byBpc2NzaSB0Y3AgY29ubmVjdGlvbgorICogb3Blbi9jbG9zZS9hYm9ydCBhbmQgZGF0YSBzZW5kL3JlY2VpdmUuCisgKi8KKworLyoKKyAqIENQTCBjb25uZWN0aW9uIGFjdGl2ZSBvcGVuIHJlcXVlc3Q6IGhvc3QgLT4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX2Jlc3RfbXR1KGNvbnN0IHN0cnVjdCB0M2NfZGF0YSAqZCwgdW5zaWduZWQgc2hvcnQgbXR1KQoreworCWludCBpID0gMDsKKworCXdoaWxlIChpIDwgZC0+bm10dXMgLSAxICYmIGQtPm10dXNbaSArIDFdIDw9IG10dSkKKwkJKytpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNlbGVjdF9tc3Moc3RydWN0IHMzX2Nvbm4gKmMzY24sIHVuc2lnbmVkIGludCBwbXR1KQoreworCXVuc2lnbmVkIGludCBpZHg7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gYzNjbi0+ZHN0X2NhY2hlOworCXN0cnVjdCB0M2NkZXYgKmNkZXYgPSBjM2NuLT5jZGV2OworCWNvbnN0IHN0cnVjdCB0M2NfZGF0YSAqdGQgPSBUM0NfREFUQShjZGV2KTsKKwl1MTYgYWR2bXNzID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfQURWTVNTKTsKKworCWlmIChhZHZtc3MgPiBwbXR1IC0gNDApCisJCWFkdm1zcyA9IHBtdHUgLSA0MDsKKwlpZiAoYWR2bXNzIDwgdGQtPm10dXNbMF0gLSA0MCkKKwkJYWR2bXNzID0gdGQtPm10dXNbMF0gLSA0MDsKKwlpZHggPSBmaW5kX2Jlc3RfbXR1KHRkLCBhZHZtc3MgKyA0MCk7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29tcHV0ZV93c2NhbGUoaW50IHdpbikKK3sKKwlpbnQgd3NjYWxlID0gMDsKKwl3aGlsZSAod3NjYWxlIDwgMTQgJiYgKDY1NTM1PDx3c2NhbGUpIDwgd2luKQorCQl3c2NhbGUrKzsKKwlyZXR1cm4gd3NjYWxlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX29wdDBoKHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCWludCB3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShjeGdiM19yY3Zfd2luKTsKKwlyZXR1cm4gIFZfS0VFUF9BTElWRSgxKSB8CisJCUZfVENBTV9CWVBBU1MgfAorCQlWX1dORF9TQ0FMRSh3c2NhbGUpIHwKKwkJVl9NU1NfSURYKGMzY24tPm1zc19pZHgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX29wdDBsKHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCXJldHVybiAgVl9VTFBfTU9ERShVTFBfTU9ERV9JU0NTSSkgfAorCQlWX1JDVl9CVUZTSVooY3hnYjNfcmN2X3dpbj4+MTApOworfQorCitzdGF0aWMgdm9pZCBtYWtlX2FjdF9vcGVuX3JlcShzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBhdGlkLCBjb25zdCBzdHJ1Y3QgbDJ0X2VudHJ5ICplKQoreworCXN0cnVjdCBjcGxfYWN0X29wZW5fcmVxICpyZXE7CisKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgYXRpZCAweCV4LlxuIiwgYzNjbiwgYXRpZCk7CisKKwlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX1NFVFVQOworCXJlcSA9IChzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CisJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX0FDVF9PUEVOX1JFUSwgYXRpZCkpOworCXJlcS0+bG9jYWxfcG9ydCA9IGMzY24tPnNhZGRyLnNpbl9wb3J0OworCXJlcS0+cGVlcl9wb3J0ID0gYzNjbi0+ZGFkZHIuc2luX3BvcnQ7CisJcmVxLT5sb2NhbF9pcCA9IGMzY24tPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlyZXEtPnBlZXJfaXAgPSBjM2NuLT5kYWRkci5zaW5fYWRkci5zX2FkZHI7CisJcmVxLT5vcHQwaCA9IGh0b25sKGNhbGNfb3B0MGgoYzNjbikgfCBWX0wyVF9JRFgoZS0+aWR4KSB8CisJCQkgICBWX1RYX0NIQU5ORUwoZS0+c210X2lkeCkpOworCXJlcS0+b3B0MGwgPSBodG9ubChjYWxjX29wdDBsKGMzY24pKTsKKwlyZXEtPnBhcmFtcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZhaWxfYWN0X29wZW4oc3RydWN0IHMzX2Nvbm4gKmMzY24sIGludCBlcnJubykKK3sKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgc3RhdGUgJXUsIGZsYWcgMHglbHguXG4iLAorCQkJYzNjbiwgYzNjbi0+c3RhdGUsIGMzY24tPmZsYWdzKTsKKwljM2NuLT5lcnIgPSBlcnJubzsKKwljM2NuX2Nsb3NlZChjM2NuKTsKK30KKworc3RhdGljIHZvaWQgYWN0X29wZW5fcmVxX2FycF9mYWlsdXJlKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IChzdHJ1Y3QgczNfY29ubiAqKXNrYi0+c2s7CisKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgc3RhdGUgJXUuXG4iLCBjM2NuLCBjM2NuLT5zdGF0ZSk7CisKKwljM2NuX2hvbGQoYzNjbik7CisJc3Bpbl9sb2NrX2JoKCZjM2NuLT5sb2NrKTsKKwlpZiAoYzNjbi0+c3RhdGUgPT0gQzNDTl9TVEFURV9DT05ORUNUSU5HKQorCQlmYWlsX2FjdF9vcGVuKGMzY24sIEVIT1NUVU5SRUFDSCk7CisJc3Bpbl91bmxvY2tfYmgoJmMzY24tPmxvY2spOworCWMzY25fcHV0KGMzY24pOworCV9fa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBDUEwgY29ubmVjdGlvbiBjbG9zZSByZXF1ZXN0OiBob3N0IC0+CisgKgorICogQ2xvc2UgYSBjb25uZWN0aW9uIGJ5IHNlbmRpbmcgYSBDUExfQ0xPU0VfQ09OX1JFUSBtZXNzYWdlIGFuZCBxdWV1ZSBpdCB0bworICogdGhlIHdyaXRlIHF1ZXVlIChpLmUuLCBhZnRlciBhbnkgdW5zZW50IHR4dCBkYXRhKS4KKyAqLworc3RhdGljIHZvaWQgc2tiX2VudGFpbChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgIGludCBmbGFncykKK3sKKwlDWEdCM19TS0JfQ0Ioc2tiKS0+c2VxID0gYzNjbi0+d3JpdGVfc2VxOworCUNYR0IzX1NLQl9DQihza2IpLT5mbGFncyA9IGZsYWdzOworCV9fc2tiX3F1ZXVlX3RhaWwoJmMzY24tPndyaXRlX3F1ZXVlLCBza2IpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2Nsb3NlX3JlcShzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYzNjbi0+Y3BsX2Nsb3NlOworCXN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKXNrYi0+aGVhZDsKKwl1bnNpZ25lZCBpbnQgdGlkID0gYzNjbi0+dGlkOworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlIDB4JXgsIGZsYWcgMHglbHguXG4iLAorCQkJYzNjbiwgYzNjbi0+c3RhdGUsIGMzY24tPmZsYWdzKTsKKworCWMzY24tPmNwbF9jbG9zZSA9IE5VTEw7CisKKwlyZXEtPndyLndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9PRkxEX0NMT1NFX0NPTikpOworCXJlcS0+d3Iud3JfbG8gPSBodG9ubChWX1dSX1RJRCh0aWQpKTsKKwlPUENPREVfVElEKHJlcSkgPSBodG9ubChNS19PUENPREVfVElEKENQTF9DTE9TRV9DT05fUkVRLCB0aWQpKTsKKwlyZXEtPnJzdmQgPSBodG9ubChjM2NuLT53cml0ZV9zZXEpOworCisJc2tiX2VudGFpbChjM2NuLCBza2IsIEMzQ0JfRkxBR19OT19BUFBFTkQpOworCWlmIChjM2NuLT5zdGF0ZSAhPSBDM0NOX1NUQVRFX0NPTk5FQ1RJTkcpCisJCWMzY25fcHVzaF90eF9mcmFtZXMoYzNjbiwgMSk7Cit9CisKKy8qCisgKiBDUEwgY29ubmVjdGlvbiBhYm9ydCByZXF1ZXN0OiBob3N0IC0+CisgKgorICogU2VuZCBhbiBBQk9SVF9SRVEgbWVzc2FnZS4gTWFrZXMgc3VyZSB3ZSBkbyBub3Qgc2VuZCBtdWx0aXBsZSBBQk9SVF9SRVFzCisgKiBmb3IgdGhlIHNhbWUgY29ubmVjdGlvbiBhbmQgYWxzbyB0aGF0IHdlIGRvIG5vdCB0cnkgdG8gc2VuZCBhIG1lc3NhZ2UKKyAqIGFmdGVyIHRoZSBjb25uZWN0aW9uIGhhcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFib3J0X2FycF9mYWlsdXJlKHN0cnVjdCB0M2NkZXYgKmNkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcSA9IGNwbGhkcihza2IpOworCisJYzNjbl9jb25uX2RlYnVnKCJ0ZGV2IDB4JXAuXG4iLCBjZGV2KTsKKworCXJlcS0+Y21kID0gQ1BMX0FCT1JUX05PX1JTVDsKKwljeGdiM19vZmxkX3NlbmQoY2Rldiwgc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGMzY25fcHVyZ2Vfd3JpdGVfcXVldWUoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmYzNjbi0+d3JpdGVfcXVldWUpKSkKKwkJX19rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9hYm9ydF9yZXEoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGMzY24tPmNwbF9hYm9ydF9yZXE7CisJc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKKwl1bnNpZ25lZCBpbnQgdGlkID0gYzNjbi0+dGlkOworCisJaWYgKHVubGlrZWx5KGMzY24tPnN0YXRlID09IEMzQ05fU1RBVEVfQUJPUlRJTkcpIHx8ICFza2IgfHwKKwkJICAgICAhYzNjbi0+Y2RldikKKwkJcmV0dXJuOworCisJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9BQk9SVElORyk7CisKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgZmxhZyBBQk9SVF9SUEwgKyBBQk9SVF9TSFVULlxuIiwgYzNjbik7CisKKwljM2NuX3NldF9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUlBMX1BFTkRJTkcpOworCisJLyogUHVyZ2UgdGhlIHNlbmQgcXVldWUgc28gd2UgZG9uJ3Qgc2VuZCBhbnl0aGluZyBhZnRlciBhbiBhYm9ydC4gKi8KKwljM2NuX3B1cmdlX3dyaXRlX3F1ZXVlKGMzY24pOworCisJYzNjbi0+Y3BsX2Fib3J0X3JlcSA9IE5VTEw7CisJcmVxID0gKHN0cnVjdCBjcGxfYWJvcnRfcmVxICopc2tiLT5oZWFkOworCisJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9EQVRBOworCXNldF9hcnBfZmFpbHVyZV9oYW5kbGVyKHNrYiwgYWJvcnRfYXJwX2ZhaWx1cmUpOworCisJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfT0ZMRF9IT1NUX0FCT1JUX0NPTl9SRVEpKTsKKwlyZXEtPndyLndyX2xvID0gaHRvbmwoVl9XUl9USUQodGlkKSk7CisJT1BDT0RFX1RJRChyZXEpID0gaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLCB0aWQpKTsKKwlyZXEtPnJzdmQwID0gaHRvbmwoYzNjbi0+c25kX254dCk7CisJcmVxLT5yc3ZkMSA9ICFjM2NuX2ZsYWcoYzNjbiwgQzNDTl9UWF9EQVRBX1NFTlQpOworCXJlcS0+Y21kID0gQ1BMX0FCT1JUX1NFTkRfUlNUOworCisJbDJ0X3NlbmQoYzNjbi0+Y2Rldiwgc2tiLCBjM2NuLT5sMnQpOworfQorCisvKgorICogQ1BMIGNvbm5lY3Rpb24gYWJvcnQgcmVwbHk6IGhvc3QgLT4KKyAqCisgKiBTZW5kIGFuIEFCT1JUX1JQTCBtZXNzYWdlIGluIHJlc3BvbnNlIG9mIHRoZSBBQk9SVF9SRVEgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfYWJvcnRfcnBsKHN0cnVjdCBzM19jb25uICpjM2NuLCBpbnQgcnN0X3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYzNjbi0+Y3BsX2Fib3J0X3JwbDsKKwlzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqcnBsID0gKHN0cnVjdCBjcGxfYWJvcnRfcnBsICopc2tiLT5oZWFkOworCisJYzNjbi0+Y3BsX2Fib3J0X3JwbCA9IE5VTEw7CisKKwlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX0RBVEE7CisJcnBsLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfT0ZMRF9IT1NUX0FCT1JUX0NPTl9SUEwpKTsKKwlycGwtPndyLndyX2xvID0gaHRvbmwoVl9XUl9USUQoYzNjbi0+dGlkKSk7CisJT1BDT0RFX1RJRChycGwpID0gaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCBjM2NuLT50aWQpKTsKKwlycGwtPmNtZCA9IHJzdF9zdGF0dXM7CisKKwljeGdiM19vZmxkX3NlbmQoYzNjbi0+Y2Rldiwgc2tiKTsKK30KKworLyoKKyAqIENQTCBjb25uZWN0aW9uIHJ4IGRhdGEgYWNrOiBob3N0IC0+CisgKiBTZW5kIFJYIGNyZWRpdHMgdGhyb3VnaCBhbiBSWF9EQVRBX0FDSyBDUEwgbWVzc2FnZS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiBjcmVkaXRzIHNlbnQuCisgKi8KK3N0YXRpYyB1MzIgc2VuZF9yeF9jcmVkaXRzKHN0cnVjdCBzM19jb25uICpjM2NuLCB1MzIgY3JlZGl0cywgdTMyIGRhY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICpyZXE7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpyZXEpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIDA7CisKKwlyZXEgPSAoc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CisJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLCBjM2NuLT50aWQpKTsKKwlyZXEtPmNyZWRpdF9kYWNrID0gaHRvbmwoZGFjayB8IFZfUlhfQ1JFRElUUyhjcmVkaXRzKSk7CisJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9BQ0s7CisJY3hnYjNfb2ZsZF9zZW5kKGMzY24tPmNkZXYsIHNrYik7CisJcmV0dXJuIGNyZWRpdHM7Cit9CisKKy8qCisgKiBDUEwgY29ubmVjdGlvbiB0eCBkYXRhOiBob3N0IC0+CisgKgorICogU2VuZCBpc2NzaSBQRFUgdmlhIFRYX0RBVEEgQ1BMIG1lc3NhZ2UuIFJldHVybnMgdGhlIG51bWJlciBvZgorICogY3JlZGl0cyBzZW50LgorICogRWFjaCBUWF9EQVRBIGNvbnN1bWVzIHdvcmsgcmVxdWVzdCBjcmVkaXQgKHdycyksIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICogaG93IG1hbnkgd2UndmUgdXNlZCBzbyBmYXIgYW5kIGhvdyBtYW55IGFyZSBwZW5kaW5nIChpLmUuLCB5ZXQgYWNrJ2VkIGJ5IFQzKS4KKyAqLworCisvKgorICogRm9yIFVMUCBjb25uZWN0aW9ucyBIVyBtYXkgaW5zZXJ0cyBkaWdlc3QgYnl0ZXMgaW50byB0aGUgcGR1LiBUaG9zZSBkaWdlc3QKKyAqIGJ5dGVzIGFyZSBub3Qgc2VudCBieSB0aGUgaG9zdCBidXQgYXJlIHBhcnQgb2YgdGhlIFRDUCBwYXlsb2FkIGFuZCB0aGVyZWZvcmUKKyAqIGNvbnN1bWUgVENQIHNlcXVlbmNlIHNwYWNlLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGN4Z2IzX3VscF9leHRyYV9sZW5bXSA9IHsgMCwgNCwgNCwgOCB9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWxwX2V4dHJhX2xlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBjeGdiM191bHBfZXh0cmFfbGVuW3NrYl91bHBfbW9kZShza2IpICYgM107Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3JsZW4gX19yZWFkX21vc3RseTsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgV1JzIG5lZWRlZCBmb3IgYW4gc2tiIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBmcmFnbWVudHMKKyAqIGluIHRoZSBza2IgYW5kIHdoZXRoZXIgaXQgaGFzIGFueSBwYXlsb2FkIGluIGl0cyBtYWluIGJvZHkuICBUaGlzIG1hcHMgdGhlCisgKiBsZW5ndGggb2YgdGhlIGdhdGhlciBsaXN0IHJlcHJlc2VudGVkIGJ5IGFuIHNrYiBpbnRvIHRoZSAjIG9mIG5lY2Vzc2FyeSBXUnMuCisgKgorICogVGhlIG1heC4gbGVuZ3RoIG9mIGFuIHNrYiBpcyBjb250cm9sbGVkIGJ5IHRoZSBtYXggcGR1IHNpemUgd2hpY2ggaXMgfjE2Sy4KKyAqIEFsc28sIGFzc3VtZSB0aGUgbWluLiBmcmFnbWVudCBsZW5ndGggaXMgdGhlIHNlY3RvciBzaXplICg1MTIpLCB0aGVuIGFkZAorICogZXh0cmEgZnJhZ21lbnQgY291bnRzIGZvciBpc2NzaSBiaHMgYW5kIHBheWxvYWQgcGFkZGluZy4KKyAqLworI2RlZmluZSBTS0JfV1JfTElTVF9TSVpFCSgxNjM4NC81MTIgKyAzKQorc3RhdGljIHVuc2lnbmVkIGludCBza2Jfd3JzW1NLQl9XUl9MSVNUX1NJWkVdIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyB2b2lkIHMzX2luaXRfd3JfdGFiKHVuc2lnbmVkIGludCB3cl9sZW4pCit7CisJaW50IGk7CisKKwlpZiAoc2tiX3dyc1sxXSkJCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJcmV0dXJuOworCisJZm9yIChpID0gMTsgaSA8IFNLQl9XUl9MSVNUX1NJWkU7IGkrKykgeworCQlpbnQgc2dsX2xlbiA9ICgzICogaSkgLyAyICsgKGkgJiAxKTsKKworCQlzZ2xfbGVuICs9IDM7CisJCXNrYl93cnNbaV0gPSAoc2dsX2xlbiA8PSB3cl9sZW4KKwkJCSAgICAgID8gMSA6IDEgKyAoc2dsX2xlbiAtIDIpIC8gKHdyX2xlbiAtIDEpKTsKKwl9CisKKwl3cmxlbiA9IHdyX2xlbiAqIDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF93cl9saXN0KHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCWMzY24tPndyX3BlbmRpbmdfaGVhZCA9IE5VTEw7Cit9CisKKy8qCisgKiBBZGQgYSBXUiB0byBhIGNvbm5lY3Rpb25zJ3MgbGlzdCBvZiBwZW5kaW5nIFdScy4gIFRoaXMgaXMgYSBzaW5nbHktbGlua2VkCisgKiBsaXN0IG9mIHNrX2J1ZmZzIG9wZXJhdGluZyBhcyBhIEZJRk8uICBUaGUgaGVhZCBpcyBrZXB0IGluIHdyX3BlbmRpbmdfaGVhZAorICogYW5kIHRoZSB0YWlsIGluIHdyX3BlbmRpbmdfdGFpbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVucXVldWVfd3Ioc3RydWN0IHMzX2Nvbm4gKmMzY24sCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl93cl9kYXRhKHNrYikgPSBOVUxMOworCisJLyoKKwkgKiBXZSB3YW50IHRvIHRha2UgYW4gZXh0cmEgcmVmZXJlbmNlIHNpbmNlIGJvdGggdXMgYW5kIHRoZSBkcml2ZXIKKwkgKiBuZWVkIHRvIGZyZWUgdGhlIHBhY2tldCBiZWZvcmUgaXQncyByZWFsbHkgZnJlZWQuIFdlIGtub3cgdGhlcmUncworCSAqIGp1c3Qgb25lIHVzZXIgY3VycmVudGx5IHNvIHdlIHVzZSBhdG9taWNfc2V0IHJhdGhlciB0aGFuIHNrYl9nZXQKKwkgKiB0byBhdm9pZCB0aGUgYXRvbWljIG9wLgorCSAqLworCWF0b21pY19zZXQoJnNrYi0+dXNlcnMsIDIpOworCisJaWYgKCFjM2NuLT53cl9wZW5kaW5nX2hlYWQpCisJCWMzY24tPndyX3BlbmRpbmdfaGVhZCA9IHNrYjsKKwllbHNlCisJCXNrYl93cl9kYXRhKHNrYikgPSBza2I7CisJYzNjbi0+d3JfcGVuZGluZ190YWlsID0gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpwZWVrX3dyKGNvbnN0IHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCXJldHVybiBjM2NuLT53cl9wZW5kaW5nX2hlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3dyX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpkZXF1ZXVlX3dyKHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBjM2NuLT53cl9wZW5kaW5nX2hlYWQ7CisKKwlpZiAobGlrZWx5KHNrYikpIHsKKwkJLyogRG9uJ3QgYm90aGVyIGNsZWFyaW5nIHRoZSB0YWlsICovCisJCWMzY24tPndyX3BlbmRpbmdfaGVhZCA9IHNrYl93cl9kYXRhKHNrYik7CisJCXNrYl93cl9kYXRhKHNrYikgPSBOVUxMOworCX0KKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZCBwdXJnZV93cl9xdWV1ZShzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdoaWxlICgoc2tiID0gZGVxdWV1ZV93cihjM2NuKSkgIT0gTlVMTCkKKwkJZnJlZV93cl9za2Ioc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1ha2VfdHhfZGF0YV93cihzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBpbnQgbGVuKQoreworCXN0cnVjdCB0eF9kYXRhX3dyICpyZXE7CisKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXJlcSA9IChzdHJ1Y3QgdHhfZGF0YV93ciAqKV9fc2tiX3B1c2goc2tiLCBzaXplb2YoKnJlcSkpOworCXJlcS0+d3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX09GTERfVFhfREFUQSkpOworCXJlcS0+d3JfbG8gPSBodG9ubChWX1dSX1RJRChjM2NuLT50aWQpKTsKKwlyZXEtPnNuZHNlcSA9IGh0b25sKGMzY24tPnNuZF9ueHQpOworCS8qIGxlbiBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIGFueSBIVyBVTFAgYWRkaXRpb25zICovCisJcmVxLT5sZW4gPSBodG9ubChsZW4pOworCXJlcS0+cGFyYW0gPSBodG9ubChWX1RYX1BPUlQoYzNjbi0+bDJ0LT5zbXRfaWR4KSk7CisJLyogVl9UWF9VTFBfU1VCTU9ERSBzZXRzIGJvdGggdGhlIG1vZGUgYW5kIHN1Ym1vZGUgKi8KKwlyZXEtPmZsYWdzID0gaHRvbmwoVl9UWF9VTFBfU1VCTU9ERShza2JfdWxwX21vZGUoc2tiKSkgfAorCQkJICAgVl9UWF9TSE9WRSgoc2tiX3BlZWsoJmMzY24tPndyaXRlX3F1ZXVlKSA/IDAgOiAxKSkpOworCisJaWYgKCFjM2NuX2ZsYWcoYzNjbiwgQzNDTl9UWF9EQVRBX1NFTlQpKSB7CisJCXJlcS0+ZmxhZ3MgfD0gaHRvbmwoVl9UWF9BQ0tfUEFHRVMoMikgfCBGX1RYX0lOSVQgfAorCQkJCSAgICBWX1RYX0NQVV9JRFgoYzNjbi0+cXNldCkpOworCQkvKiBTZW5kYnVmZmVyIGlzIGluIHVuaXRzIG9mIDMyS0IuICovCisJCXJlcS0+cGFyYW0gfD0gaHRvbmwoVl9UWF9TTkRCVUYoY3hnYjNfc25kX3dpbiA+PiAxNSkpOworCQljM2NuX3NldF9mbGFnKGMzY24sIEMzQ05fVFhfREFUQV9TRU5UKTsKKwl9Cit9CisKKy8qKgorICogYzNjbl9wdXNoX3R4X2ZyYW1lcyAtLSBzdGFydCB0cmFuc21pdAorICogQGMzY246IHRoZSBvZmZsb2FkZWQgY29ubmVjdGlvbgorICogQHJlcV9jb21wbGV0aW9uOiByZXF1ZXN0IHdyX2FjayBvciBub3QKKyAqCisgKiBQcmVwZW5kcyBUWF9EQVRBX1dSIG9yIENQTF9DTE9TRV9DT05fUkVRIGhlYWRlcnMgdG8gYnVmZmVycyB3YWl0aW5nIGluIGEKKyAqIGNvbm5lY3Rpb24ncyBzZW5kIHF1ZXVlIGFuZCBzZW5kcyB0aGVtIG9uIHRvIFQzLiAgTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAqIGNvbm5lY3Rpb24ncyBsb2NrIGhlbGQuICBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc2VuZCBidWZmZXIgc3BhY2UgdGhhdCB3YXMKKyAqIGZyZWVkIGFzIGEgcmVzdWx0IG9mIHNlbmRpbmcgcXVldWVkIGRhdGEgdG8gVDMuCisgKi8KK3N0YXRpYyB2b2lkIGFycF9mYWlsdXJlX2Rpc2NhcmQoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBjM2NuX3B1c2hfdHhfZnJhbWVzKHN0cnVjdCBzM19jb25uICpjM2NuLCBpbnQgcmVxX2NvbXBsZXRpb24pCit7CisJaW50IHRvdGFsX3NpemUgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHQzY2RldiAqY2RldjsKKwlzdHJ1Y3QgY3hnYjNpX3NkZXZfZGF0YSAqY2RhdGE7CisKKwlpZiAodW5saWtlbHkoYzNjbi0+c3RhdGUgPT0gQzNDTl9TVEFURV9DT05ORUNUSU5HIHx8CisJCSAgICAgYzNjbi0+c3RhdGUgPT0gQzNDTl9TVEFURV9DTE9TRV9XQUlUXzEgfHwKKwkJICAgICBjM2NuLT5zdGF0ZSA9PSBDM0NOX1NUQVRFX0FCT1JUSU5HKSkgeworCQljM2NuX3R4X2RlYnVnKCJjM2NuIDB4JXAsIGluIGNsb3Npbmcgc3RhdGUgJXUuXG4iLAorCQkJICAgICAgYzNjbiwgYzNjbi0+c3RhdGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwljZGV2ID0gYzNjbi0+Y2RldjsKKwljZGF0YSA9IENYR0IzX1NERVZfREFUQShjZGV2KTsKKworCXdoaWxlIChjM2NuLT53cl9hdmFpbAorCSAgICAgICAmJiAoc2tiID0gc2tiX3BlZWsoJmMzY24tPndyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc2tiLT5sZW47CS8qIGxlbmd0aCBiZWZvcmUgc2tiX3B1c2ggKi8KKwkJaW50IGZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIChsZW4gIT0gc2tiLT5kYXRhX2xlbik7CisJCWludCB3cnNfbmVlZGVkID0gc2tiX3dyc1tmcmFnc107CisKKwkJaWYgKHdyc19uZWVkZWQgPiAxICYmIGxlbiArIHNpemVvZihzdHJ1Y3QgdHhfZGF0YV93cikgPD0gd3JsZW4pCisJCQl3cnNfbmVlZGVkID0gMTsKKworCQlXQVJOX09OKGZyYWdzID49IFNLQl9XUl9MSVNUX1NJWkUgfHwgd3JzX25lZWRlZCA8IDEpOworCisJCWlmIChjM2NuLT53cl9hdmFpbCA8IHdyc19uZWVkZWQpIHsKKwkJCWMzY25fdHhfZGVidWcoImMzY24gMHglcCwgc2tiIGxlbiAldS8ldSwgZnJhZyAldSwgIgorCQkJCSAgICAgICJ3ciAlZCA8ICV1LlxuIiwKKwkJCQkgICAgICBjM2NuLCBza2ItPmxlbiwgc2tiLT5kYXRhbGVuLCBmcmFncywKKwkJCQkgICAgICB3cnNfbmVlZGVkLCBjM2NuLT53cl9hdmFpbCk7CisJCQlicmVhazsKKwkJfQorCisJCV9fc2tiX3VubGluayhza2IsICZjM2NuLT53cml0ZV9xdWV1ZSk7CisJCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfREFUQTsKKwkJc2tiLT5jc3VtID0gd3JzX25lZWRlZDsJLyogcmVtZW1iZXIgdGhpcyB1bnRpbCB0aGUgV1JfQUNLICovCisJCWMzY24tPndyX2F2YWlsIC09IHdyc19uZWVkZWQ7CisJCWMzY24tPndyX3VuYWNrZWQgKz0gd3JzX25lZWRlZDsKKwkJZW5xdWV1ZV93cihjM2NuLCBza2IpOworCisJCWlmIChsaWtlbHkoQ1hHQjNfU0tCX0NCKHNrYiktPmZsYWdzICYgQzNDQl9GTEFHX05FRURfSERSKSkgeworCQkJbGVuICs9IHVscF9leHRyYV9sZW4oc2tiKTsKKwkJCW1ha2VfdHhfZGF0YV93cihjM2NuLCBza2IsIGxlbik7CisJCQljM2NuLT5zbmRfbnh0ICs9IGxlbjsKKwkJCWlmICgocmVxX2NvbXBsZXRpb24KKwkJCSAgICAgJiYgYzNjbi0+d3JfdW5hY2tlZCA9PSB3cnNfbmVlZGVkKQorCQkJICAgIHx8IChDWEdCM19TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBDM0NCX0ZMQUdfQ09NUEwpCisJCQkgICAgfHwgYzNjbi0+d3JfdW5hY2tlZCA+PSBjM2NuLT53cl9tYXggLyAyKSB7CisJCQkJc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgKndyID0gY3BsaGRyKHNrYik7CisKKwkJCQl3ci0+d3JfaGkgfD0gaHRvbmwoRl9XUl9DT01QTCk7CisJCQkJYzNjbi0+d3JfdW5hY2tlZCA9IDA7CisJCQl9CisJCQlDWEdCM19TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJj0gfkMzQ0JfRkxBR19ORUVEX0hEUjsKKwkJfQorCisJCXRvdGFsX3NpemUgKz0gc2tiLT50cnVlc2l6ZTsKKwkJc2V0X2FycF9mYWlsdXJlX2hhbmRsZXIoc2tiLCBhcnBfZmFpbHVyZV9kaXNjYXJkKTsKKwkJbDJ0X3NlbmQoY2Rldiwgc2tiLCBjM2NuLT5sMnQpOworCX0KKwlyZXR1cm4gdG90YWxfc2l6ZTsKK30KKworLyoKKyAqIHByb2Nlc3NfY3BsX21zZzogLT4gaG9zdAorICogVG9wLWxldmVsIENQTCBtZXNzYWdlIHByb2Nlc3NpbmcgdXNlZCBieSBtb3N0IENQTCBtZXNzYWdlcyB0aGF0CisgKiBwZXJ0YWluIHRvIGNvbm5lY3Rpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19jcGxfbXNnKHZvaWQgKCpmbikoc3RydWN0IHMzX2Nvbm4gKiwKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKiksCisJCQkJICAgc3RydWN0IHMzX2Nvbm4gKmMzY24sCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzcGluX2xvY2tfYmgoJmMzY24tPmxvY2spOworCWZuKGMzY24sIHNrYik7CisJc3Bpbl91bmxvY2tfYmgoJmMzY24tPmxvY2spOworfQorCisvKgorICogcHJvY2Vzc19jcGxfbXNnX3JlZjogLT4gaG9zdAorICogU2ltaWxhciB0byBwcm9jZXNzX2NwbF9tc2coKSBidXQgdGFrZXMgYW4gZXh0cmEgY29ubmVjdGlvbiByZWZlcmVuY2UgYXJvdW5kCisgKiB0aGUgY2FsbCB0byB0aGUgaGFuZGxlci4gIFNob3VsZCBiZSB1c2VkIGlmIHRoZSBoYW5kbGVyIG1heSBkcm9wIGEKKyAqIGNvbm5lY3Rpb24gcmVmZXJlbmNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19jcGxfbXNnX3JlZih2b2lkICgqZm4pIChzdHJ1Y3QgczNfY29ubiAqLAorCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKiksCisJCQkJICAgICAgIHN0cnVjdCBzM19jb25uICpjM2NuLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWMzY25faG9sZChjM2NuKTsKKwlwcm9jZXNzX2NwbF9tc2coZm4sIGMzY24sIHNrYik7CisJYzNjbl9wdXQoYzNjbik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgQ1BMX0FDVF9FU1RBQkxJU0ggbWVzc2FnZTogLT4gaG9zdAorICogVXBkYXRlcyBjb25uZWN0aW9uIHN0YXRlIGZyb20gYW4gYWN0aXZlIGVzdGFibGlzaCBDUEwgbWVzc2FnZS4gIFJ1bnMgd2l0aAorICogdGhlIGNvbm5lY3Rpb24gbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM19mcmVlX2F0aWQoc3RydWN0IHQzY2RldiAqY2RldiwgdW5zaWduZWQgaW50IHRpZCkKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGN4Z2IzX2ZyZWVfYXRpZChjZGV2LCB0aWQpOworCWlmIChjM2NuKQorCQljM2NuX3B1dChjM2NuKTsKK30KKworc3RhdGljIHZvaWQgYzNjbl9lc3RhYmxpc2hlZChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgdTMyIHNuZF9pc24sCisJCQkgICAgIHVuc2lnbmVkIGludCBvcHQpCit7CisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LlxuIiwgYzNjbiwgYzNjbi0+c3RhdGUpOworCisJYzNjbi0+d3JpdGVfc2VxID0gYzNjbi0+c25kX254dCA9IGMzY24tPnNuZF91bmEgPSBzbmRfaXNuOworCisJLyoKKwkgKiBDYXVzZXMgdGhlIGZpcnN0IFJYX0RBVEFfQUNLIHRvIHN1cHBseSBhbnkgUnggY3JlZGl0cyB3ZSBjb3VsZG4ndAorCSAqIHBhc3MgdGhyb3VnaCBvcHQwLgorCSAqLworCWlmIChjeGdiM19yY3Zfd2luID4gKE1fUkNWX0JVRlNJWiA8PCAxMCkpCisJCWMzY24tPnJjdl93dXAgLT0gY3hnYjNfcmN2X3dpbiAtIChNX1JDVl9CVUZTSVogPDwgMTApOworCisJZHN0X2NvbmZpcm0oYzNjbi0+ZHN0X2NhY2hlKTsKKworCXNtcF9tYigpOworCisJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9FU1RBQkxJU0hFRCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWN0X2VzdGFibGlzaChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3BsX2FjdF9lc3RhYmxpc2ggKnJlcSA9IGNwbGhkcihza2IpOworCXUzMiByY3ZfaXNuID0gbnRvaGwocmVxLT5yY3ZfaXNuKTsJLyogcmVhbCBSQ1ZfSVNOICsgMSAqLworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlpZiAodW5saWtlbHkoYzNjbi0+c3RhdGUgIT0gQzNDTl9TVEFURV9DT05ORUNUSU5HKSkKKwkJY3hnYjNpX2xvZ19lcnJvcigiVElEICV1IGV4cGVjdGVkIFNZTl9TRU5ULCBnb3QgRVNULiwgcyAldVxuIiwKKwkJCQkgYzNjbi0+dGlkLCBjM2NuLT5zdGF0ZSk7CisKKwljM2NuLT5jb3BpZWRfc2VxID0gYzNjbi0+cmN2X3d1cCA9IGMzY24tPnJjdl9ueHQgPSByY3ZfaXNuOworCWMzY25fZXN0YWJsaXNoZWQoYzNjbiwgbnRvaGwocmVxLT5zbmRfaXNuKSwgbnRvaHMocmVxLT50Y3Bfb3B0KSk7CisKKwlfX2tmcmVlX3NrYihza2IpOworCisJaWYgKHVubGlrZWx5KGMzY25fZmxhZyhjM2NuLCBDM0NOX0FDVElWRV9DTE9TRV9ORUVERUQpKSkKKwkJLyogdXBwZXIgbGF5ZXIgaGFzIHJlcXVlc3RlZCBjbG9zaW5nICovCisJCXNlbmRfYWJvcnRfcmVxKGMzY24pOworCWVsc2UgaWYgKGMzY25fcHVzaF90eF9mcmFtZXMoYzNjbiwgMSkpCisJCWN4Z2IzaV9jb25uX3R4X29wZW4oYzNjbik7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWN0X2VzdGFibGlzaChzdHJ1Y3QgdDNjZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgY3BsX2FjdF9lc3RhYmxpc2ggKnJlcSA9IGNwbGhkcihza2IpOworCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKHJlcSk7CisJdW5zaWduZWQgaW50IGF0aWQgPSBHX1BBU1NfT1BFTl9USUQobnRvaGwocmVxLT50b3NfdGlkKSk7CisJc3RydWN0IHMzX2Nvbm4gKmMzY24gPSBjdHg7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhID0gQ1hHQjNfU0RFVl9EQVRBKGNkZXYpOworCisJYzNjbl9jb25uX2RlYnVnKCJyY3YsIHRpZCAweCV4LCBjM2NuIDB4JXAsIHMgJXUsIGYgMHglbHguXG4iLAorCQkJdGlkLCBjM2NuLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworCisJYzNjbi0+dGlkID0gdGlkOworCWMzY25faG9sZChjM2NuKTsKKwljeGdiM19pbnNlcnRfdGlkKGNkYXRhLT5jZGV2LCBjZGF0YS0+Y2xpZW50LCBjM2NuLCB0aWQpOworCXMzX2ZyZWVfYXRpZChjZGV2LCBhdGlkKTsKKworCWMzY24tPnFzZXQgPSBHX1FOVU0obnRvaGwoc2tiLT5jc3VtKSk7CisKKwlwcm9jZXNzX2NwbF9tc2cocHJvY2Vzc19hY3RfZXN0YWJsaXNoLCBjM2NuLCBza2IpOworCXJldHVybiAwOworfQorCisvKgorICogUHJvY2VzcyBhIENQTF9BQ1RfT1BFTl9SUEwgbWVzc2FnZTogLT4gaG9zdAorICogSGFuZGxlIGFjdGl2ZSBvcGVuIGZhaWx1cmVzLgorICovCitzdGF0aWMgaW50IGFjdF9vcGVuX3JwbF9zdGF0dXNfdG9fZXJybm8oaW50IHN0YXR1cykKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgQ1BMX0VSUl9DT05OX1JFU0VUOgorCQlyZXR1cm4gRUNPTk5SRUZVU0VEOworCWNhc2UgQ1BMX0VSUl9BUlBfTUlTUzoKKwkJcmV0dXJuIEVIT1NUVU5SRUFDSDsKKwljYXNlIENQTF9FUlJfQ09OTl9USU1FRE9VVDoKKwkJcmV0dXJuIEVUSU1FRE9VVDsKKwljYXNlIENQTF9FUlJfVENBTV9GVUxMOgorCQlyZXR1cm4gRU5PTUVNOworCWNhc2UgQ1BMX0VSUl9DT05OX0VYSVNUOgorCQljeGdiM2lfbG9nX2Vycm9yKCJBQ1RJVkVfT1BFTl9SUEw6IDQtdHVwbGUgaW4gdXNlXG4iKTsKKwkJcmV0dXJuIEVBRERSSU5VU0U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVJTzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjdF9vcGVuX3JldHJ5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzM19jb25uICpjM2NuID0gKHN0cnVjdCBzM19jb25uICopZGF0YTsKKworCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwLCBzdGF0ZSAldS5cbiIsIGMzY24sIGMzY24tPnN0YXRlKTsKKworCXNwaW5fbG9ja19iaCgmYzNjbi0+bG9jayk7CisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSksIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlmYWlsX2FjdF9vcGVuKGMzY24sIEVOT01FTSk7CisJZWxzZSB7CisJCXNrYi0+c2sgPSAoc3RydWN0IHNvY2sgKiljM2NuOworCQlzZXRfYXJwX2ZhaWx1cmVfaGFuZGxlcihza2IsIGFjdF9vcGVuX3JlcV9hcnBfZmFpbHVyZSk7CisJCW1ha2VfYWN0X29wZW5fcmVxKGMzY24sIHNrYiwgYzNjbi0+dGlkLCBjM2NuLT5sMnQpOworCQlsMnRfc2VuZChjM2NuLT5jZGV2LCBza2IsIGMzY24tPmwydCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZjM2NuLT5sb2NrKTsKKwljM2NuX3B1dChjM2NuKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19hY3Rfb3Blbl9ycGwoc3RydWN0IHMzX2Nvbm4gKmMzY24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNwbF9hY3Rfb3Blbl9ycGwgKnJwbCA9IGNwbGhkcihza2IpOworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlpZiAocnBsLT5zdGF0dXMgPT0gQ1BMX0VSUl9DT05OX0VYSVNUICYmCisJICAgIGMzY24tPnJldHJ5X3RpbWVyLmZ1bmN0aW9uICE9IGFjdF9vcGVuX3JldHJ5X3RpbWVyKSB7CisJCWMzY24tPnJldHJ5X3RpbWVyLmZ1bmN0aW9uID0gYWN0X29wZW5fcmV0cnlfdGltZXI7CisJCWlmICghbW9kX3RpbWVyKCZjM2NuLT5yZXRyeV90aW1lciwgamlmZmllcyArIEhaIC8gMikpCisJCQljM2NuX2hvbGQoYzNjbik7CisJfSBlbHNlCisJCWZhaWxfYWN0X29wZW4oYzNjbiwgYWN0X29wZW5fcnBsX3N0YXR1c190b19lcnJubyhycGwtPnN0YXR1cykpOworCV9fa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWN0X29wZW5fcnBsKHN0cnVjdCB0M2NkZXYgKmNkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGN0eDsKKwlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JwbCAqcnBsID0gY3BsaGRyKHNrYik7CisKKwljM2NuX2Nvbm5fZGVidWcoInJjdiwgc3RhdHVzIDB4JXgsIGMzY24gMHglcCwgcyAldSwgZiAweCVseC5cbiIsCisJCQlycGwtPnN0YXR1cywgYzNjbiwgYzNjbi0+c3RhdGUsIGMzY24tPmZsYWdzKTsKKworCWlmIChycGwtPnN0YXR1cyAhPSBDUExfRVJSX1RDQU1fRlVMTCAmJgorCSAgICBycGwtPnN0YXR1cyAhPSBDUExfRVJSX0NPTk5fRVhJU1QgJiYKKwkgICAgcnBsLT5zdGF0dXMgIT0gQ1BMX0VSUl9BUlBfTUlTUykKKwkJY3hnYjNfcXVldWVfdGlkX3JlbGVhc2UoY2RldiwgR0VUX1RJRChycGwpKTsKKworCXByb2Nlc3NfY3BsX21zZ19yZWYocHJvY2Vzc19hY3Rfb3Blbl9ycGwsIGMzY24sIHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIFBFRVJfQ0xPU0UgQ1BMIG1lc3NhZ2VzOiAtPiBob3N0CisgKiBIYW5kbGUgcGVlciBGSU4uCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGVlcl9jbG9zZShzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgc3RhdGUgJXUsIGZsYWcgMHglbHguXG4iLAorCQkJYzNjbiwgYzNjbi0+c3RhdGUsIGMzY24tPmZsYWdzKTsKKworCWlmIChjM2NuX2ZsYWcoYzNjbiwgQzNDTl9BQk9SVF9SUExfUEVORElORykpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChjM2NuLT5zdGF0ZSkgeworCWNhc2UgQzNDTl9TVEFURV9FU1RBQkxJU0hFRDoKKwkJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9QQVNTSVZFX0NMT1NFKTsKKwkJYnJlYWs7CisJY2FzZSBDM0NOX1NUQVRFX0FDVElWRV9DTE9TRToKKwkJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9DTE9TRV9XQUlUXzIpOworCQlicmVhazsKKwljYXNlIEMzQ05fU1RBVEVfQ0xPU0VfV0FJVF8xOgorCQljM2NuX2Nsb3NlZChjM2NuKTsKKwkJYnJlYWs7CisJY2FzZSBDM0NOX1NUQVRFX0FCT1JUSU5HOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQljeGdiM2lfbG9nX2Vycm9yKCIlczogcGVlciBjbG9zZSwgVElEICV1IGluIGJhZCBzdGF0ZSAldVxuIiwKKwkJCQkgYzNjbi0+Y2Rldi0+bmFtZSwgYzNjbi0+dGlkLCBjM2NuLT5zdGF0ZSk7CisJfQorCisJY3hnYjNpX2Nvbm5fY2xvc2luZyhjM2NuKTsKK291dDoKKwlfX2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGRvX3BlZXJfY2xvc2Uoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBzM19jb25uICpjM2NuID0gY3R4OworCisJYzNjbl9jb25uX2RlYnVnKCJyY3YsIGMzY24gMHglcCwgcyAldSwgZiAweCVseC5cbiIsCisJCQljM2NuLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworCXByb2Nlc3NfY3BsX21zZ19yZWYocHJvY2Vzc19wZWVyX2Nsb3NlLCBjM2NuLCBza2IpOworCXJldHVybiAwOworfQorCisvKgorICogUHJvY2VzcyBDTE9TRV9DT05OX1JQTCBDUEwgbWVzc2FnZTogLT4gaG9zdAorICogUHJvY2VzcyBhIHBlZXIgQUNLIHRvIG91ciBGSU4uCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2xvc2VfY29uX3JwbChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9ycGwgKnJwbCA9IGNwbGhkcihza2IpOworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwljM2NuLT5zbmRfdW5hID0gbnRvaGwocnBsLT5zbmRfbnh0KSAtIDE7CS8qIGV4Y2x1ZGUgRklOICovCisKKwlpZiAoYzNjbl9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUlBMX1BFTkRJTkcpKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoYzNjbi0+c3RhdGUpIHsKKwljYXNlIEMzQ05fU1RBVEVfQUNUSVZFX0NMT1NFOgorCQljM2NuX3NldF9zdGF0ZShjM2NuLCBDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMSk7CisJCWJyZWFrOworCWNhc2UgQzNDTl9TVEFURV9DTE9TRV9XQUlUXzE6CisJY2FzZSBDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMjoKKwkJYzNjbl9jbG9zZWQoYzNjbik7CisJCWJyZWFrOworCWNhc2UgQzNDTl9TVEFURV9BQk9SVElORzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3hnYjNpX2xvZ19lcnJvcigiJXM6IGNsb3NlX3JwbCwgVElEICV1IGluIGJhZCBzdGF0ZSAldVxuIiwKKwkJCQkgYzNjbi0+Y2Rldi0+bmFtZSwgYzNjbi0+dGlkLCBjM2NuLT5zdGF0ZSk7CisJfQorCitvdXQ6CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2xvc2VfY29uX3JwbChzdHJ1Y3QgdDNjZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGN0eDsKKworCWMzY25fY29ubl9kZWJ1ZygicmN2LCBjM2NuIDB4JXAsIHMgJXUsIGYgMHglbHguXG4iLAorCQkJIGMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlwcm9jZXNzX2NwbF9tc2dfcmVmKHByb2Nlc3NfY2xvc2VfY29uX3JwbCwgYzNjbiwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgQUJPUlRfUkVRX1JTUyBDUEwgbWVzc2FnZTogLT4gaG9zdAorICogUHJvY2VzcyBhYm9ydCByZXF1ZXN0cy4gIElmIHdlIGFyZSB3YWl0aW5nIGZvciBhbiBBQk9SVF9SUEwgd2UgaWdub3JlIHRoaXMKKyAqIHJlcXVlc3QgZXhjZXB0IHRoYXQgd2UgbmVlZCB0byByZXBseSB0byBpdC4KKyAqLworCitzdGF0aWMgaW50IGFib3J0X3N0YXR1c190b19lcnJubyhzdHJ1Y3QgczNfY29ubiAqYzNjbiwgaW50IGFib3J0X3JlYXNvbiwKKwkJCQkgaW50ICpuZWVkX3JzdCkKK3sKKwlzd2l0Y2ggKGFib3J0X3JlYXNvbikgeworCWNhc2UgQ1BMX0VSUl9CQURfU1lOOiAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIENQTF9FUlJfQ09OTl9SRVNFVDoKKwkJcmV0dXJuIGMzY24tPnN0YXRlID4gQzNDTl9TVEFURV9FU1RBQkxJU0hFRCA/CisJCQlFUElQRSA6IEVDT05OUkVTRVQ7CisJY2FzZSBDUExfRVJSX1hNSVRfVElNRURPVVQ6CisJY2FzZSBDUExfRVJSX1BFUlNJU1RfVElNRURPVVQ6CisJY2FzZSBDUExfRVJSX0ZJTldBSVQyX1RJTUVET1VUOgorCWNhc2UgQ1BMX0VSUl9LRUVQQUxJVkVfVElNRURPVVQ6CisJCXJldHVybiBFVElNRURPVVQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVJTzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWJvcnRfcmVxKHN0cnVjdCBzM19jb25uICpjM2NuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByc3Rfc3RhdHVzID0gQ1BMX0FCT1JUX05PX1JTVDsKKwljb25zdCBzdHJ1Y3QgY3BsX2Fib3J0X3JlcV9yc3MgKnJlcSA9IGNwbGhkcihza2IpOworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlpZiAoIWMzY25fZmxhZyhjM2NuLCBDM0NOX0FCT1JUX1JFUV9SQ1ZEKSkgeworCQljM2NuX3NldF9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUkVRX1JDVkQpOworCQljM2NuX3NldF9zdGF0ZShjM2NuLCBDM0NOX1NUQVRFX0FCT1JUSU5HKTsKKwkJX19rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWMzY25fY2xlYXJfZmxhZyhjM2NuLCBDM0NOX0FCT1JUX1JFUV9SQ1ZEKTsKKwlzZW5kX2Fib3J0X3JwbChjM2NuLCByc3Rfc3RhdHVzKTsKKworCWlmICghYzNjbl9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUlBMX1BFTkRJTkcpKSB7CisJCWMzY24tPmVyciA9CisJCSAgICBhYm9ydF9zdGF0dXNfdG9fZXJybm8oYzNjbiwgcmVxLT5zdGF0dXMsICZyc3Rfc3RhdHVzKTsKKwkJYzNjbl9jbG9zZWQoYzNjbik7CisJfQorfQorCitzdGF0aWMgaW50IGRvX2Fib3J0X3JlcShzdHJ1Y3QgdDNjZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpjdHgpCit7CisJY29uc3Qgc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpyZXEgPSBjcGxoZHIoc2tiKTsKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGN0eDsKKworCWMzY25fY29ubl9kZWJ1ZygicmN2LCBjM2NuIDB4JXAsIHMgMHgleCwgZiAweCVseC5cbiIsCisJCQljM2NuLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworCisJaWYgKHJlcS0+c3RhdHVzID09IENQTF9FUlJfUlRYX05FR19BRFZJQ0UgfHwKKwkgICAgcmVxLT5zdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UpIHsKKwkJX19rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJvY2Vzc19jcGxfbXNnX3JlZihwcm9jZXNzX2Fib3J0X3JlcSwgYzNjbiwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgQUJPUlRfUlBMX1JTUyBDUEwgbWVzc2FnZTogLT4gaG9zdAorICogUHJvY2VzcyBhYm9ydCByZXBsaWVzLiAgV2Ugb25seSBwcm9jZXNzIHRoZXNlIG1lc3NhZ2VzIGlmIHdlIGFudGljaXBhdGUKKyAqIHRoZW0gYXMgdGhlIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIFNXIGFuZCBIVyBpbiB0aGlzIGFyZWEgaXMgc29tZXdoYXQgbGFja2luZworICogYW5kIHNvbWV0aW1lcyB3ZSBnZXQgQUJPUlRfUlBMcyBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBjb25uZWN0aW9uIHRoYXQKKyAqIG9yaWdpbmF0ZWQgdGhlIEFCT1JUX1JFUS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19hYm9ydF9ycGwoc3RydWN0IHMzX2Nvbm4gKmMzY24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlpZiAoYzNjbl9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUlBMX1BFTkRJTkcpKSB7CisJCWlmICghYzNjbl9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUlBMX1JDVkQpKQorCQkJYzNjbl9zZXRfZmxhZyhjM2NuLCBDM0NOX0FCT1JUX1JQTF9SQ1ZEKTsKKwkJZWxzZSB7CisJCQljM2NuX2NsZWFyX2ZsYWcoYzNjbiwgQzNDTl9BQk9SVF9SUExfUkNWRCk7CisJCQljM2NuX2NsZWFyX2ZsYWcoYzNjbiwgQzNDTl9BQk9SVF9SUExfUEVORElORyk7CisJCQlpZiAoYzNjbl9mbGFnKGMzY24sIEMzQ05fQUJPUlRfUkVRX1JDVkQpKQorCQkJCWN4Z2IzaV9sb2dfZXJyb3IoIiVzIHRpZCAldSwgQUJPUlRfUlBMX1JTU1xuIiwKKwkJCQkJCSBjM2NuLT5jZGV2LT5uYW1lLCBjM2NuLT50aWQpOworCQkJYzNjbl9jbG9zZWQoYzNjbik7CisJCX0KKwl9CisJX19rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBkb19hYm9ydF9ycGwoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBjcGxfYWJvcnRfcnBsX3JzcyAqcnBsID0gY3BsaGRyKHNrYik7CisJc3RydWN0IHMzX2Nvbm4gKmMzY24gPSBjdHg7CisKKwljM2NuX2Nvbm5fZGVidWcoInJjdiwgc3RhdHVzIDB4JXgsIGMzY24gMHglcCwgcyAldSwgMHglbHguXG4iLAorCQkJcnBsLT5zdGF0dXMsIGMzY24sIGMzY24gPyBjM2NuLT5zdGF0ZSA6IDAsCisJCQljM2NuID8gYzNjbi0+ZmxhZ3MgOiAwVUwpOworCisJLyoKKwkgKiBJZ25vcmUgcmVwbGllcyB0byBwb3N0LWNsb3NlIGFib3J0cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGFib3J0IHdhcworCSAqIHJlcXVlc3RlZCB0b28gbGF0ZS4gIFRoZXNlIGNvbm5lY3Rpb25zIGFyZSB0ZXJtaW5hdGVkIHdoZW4gd2UgZ2V0CisJICogUEVFUl9DTE9TRSBvciBDTE9TRV9DT05fUlBMIGFuZCBieSB0aGUgdGltZSB0aGUgYWJvcnRfcnBsX3JzcworCSAqIGFycml2ZXMgdGhlIFRJRCBpcyBlaXRoZXIgbm8gbG9uZ2VyIHVzZWQgb3IgaXQgaGFzIGJlZW4gcmVjeWNsZWQuCisJICovCisJaWYgKHJwbC0+c3RhdHVzID09IENQTF9FUlJfQUJPUlRfRkFJTEVEKQorCQlnb3RvIGRpc2NhcmQ7CisKKwkvKgorCSAqIFNvbWV0aW1lcyB3ZSd2ZSBhbHJlYWR5IGNsb3NlZCB0aGUgY29ubmVjdGlvbiwgZS5nLiwgYSBwb3N0LWNsb3NlCisJICogYWJvcnQgcmFjZXMgd2l0aCBBQk9SVF9SRVFfUlNTLCB0aGUgbGF0dGVyIGZyZWVzIHRoZSBjb25uZWN0aW9uCisJICogZXhwZWN0aW5nIHRoZSBBQk9SVF9SRVEgd2lsbCBmYWlsIHdpdGggQ1BMX0VSUl9BQk9SVF9GQUlMRUQsCisJICogYnV0IEZXIHR1cm5zIHRoZSBBQk9SVF9SRVEgaW50byBhIHJlZ3VsYXIgb25lIGFuZCBzbyB3ZSBnZXQKKwkgKiBBQk9SVF9SUExfUlNTIHdpdGggc3RhdHVzIDAgYW5kIG5vIGNvbm5lY3Rpb24uCisJICovCisJaWYgKCFjM2NuKQorCQlnb3RvIGRpc2NhcmQ7CisKKwlwcm9jZXNzX2NwbF9tc2dfcmVmKHByb2Nlc3NfYWJvcnRfcnBsLCBjM2NuLCBza2IpOworCXJldHVybiAwOworCitkaXNjYXJkOgorCV9fa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIFJYX0lTQ1NJX0hEUiBDUEwgbWVzc2FnZTogLT4gaG9zdAorICogSGFuZGxlIHJlY2VpdmVkIFBEVXMsIHRoZSBwYXlsb2FkIGNvdWxkIGJlIEREUCdlZC4gSWYgbm90LCB0aGUgcGF5bG9hZAorICogZm9sbG93IGFmdGVyIHRoZSBiaHMuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfcnhfaXNjc2lfaGRyKHN0cnVjdCBzM19jb25uICpjM2NuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfaXNjc2lfaGRyICpoZHJfY3BsID0gY3BsaGRyKHNrYik7CisJc3RydWN0IGNwbF9pc2NzaV9oZHJfbm9yc3MgZGF0YV9jcGw7CisJc3RydWN0IGNwbF9yeF9kYXRhX2RkcF9ub3JzcyBkZHBfY3BsOworCXVuc2lnbmVkIGludCBoZHJfbGVuLCBkYXRhX2xlbiwgc3RhdHVzOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGVycjsKKworCWlmICh1bmxpa2VseShjM2NuLT5zdGF0ZSA+PSBDM0NOX1NUQVRFX1BBU1NJVkVfQ0xPU0UpKSB7CisJCWlmIChjM2NuLT5zdGF0ZSAhPSBDM0NOX1NUQVRFX0FCT1JUSU5HKQorCQkJc2VuZF9hYm9ydF9yZXEoYzNjbik7CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlDWEdCM19TS0JfQ0Ioc2tiKS0+c2VxID0gbnRvaGwoaGRyX2NwbC0+c2VxKTsKKwlDWEdCM19TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSAwOworCisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBjcGxfaXNjc2lfaGRyKSk7CisKKwlsZW4gPSBoZHJfbGVuID0gbnRvaHMoaGRyX2NwbC0+bGVuKTsKKwkvKiBtc2cgY29hbGVzY2UgaXMgb2ZmIG9yIG5vdCBlbm91Z2ggZGF0YSByZWNlaXZlZCAqLworCWlmIChza2ItPmxlbiA8PSBoZHJfbGVuKSB7CisJCWN4Z2IzaV9sb2dfZXJyb3IoIiVzOiBUSUQgJXUsIElTQ1NJX0hEUiwgc2tiIGxlbiAldSA8ICV1LlxuIiwKKwkJCQkgYzNjbi0+Y2Rldi0+bmFtZSwgYzNjbi0+dGlkLAorCQkJCSBza2ItPmxlbiwgaGRyX2xlbik7CisJCWdvdG8gYWJvcnRfY29ubjsKKwl9CisKKwllcnIgPSBza2JfY29weV9iaXRzKHNrYiwgc2tiLT5sZW4gLSBzaXplb2YoZGRwX2NwbCksICZkZHBfY3BsLAorCQkJICAgIHNpemVvZihkZHBfY3BsKSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gYWJvcnRfY29ubjsKKworCXNrYl91bHBfbW9kZShza2IpID0gVUxQMl9GTEFHX0RBVEFfUkVBRFk7CisJc2tiX3VscF9wZHVsZW4oc2tiKSA9IG50b2hzKGRkcF9jcGwubGVuKTsKKwlza2JfdWxwX2RkaWdlc3Qoc2tiKSA9IG50b2hsKGRkcF9jcGwudWxwX2NyYyk7CisJc3RhdHVzID0gbnRvaGwoZGRwX2NwbC5kZHBfc3RhdHVzKTsKKworCWMzY25fcnhfZGVidWcoInJ4IHNrYiAweCVwLCBsZW4gJXUsIHBkdWxlbiAldSwgZGRwIHN0YXR1cyAweCV4LlxuIiwKKwkJICAgICAgc2tiLCBza2ItPmxlbiwgc2tiX3VscF9wZHVsZW4oc2tiKSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiAoMSA8PCBSWF9ERFBfU1RBVFVTX0hDUkNfU0hJRlQpKQorCQlza2JfdWxwX21vZGUoc2tiKSB8PSBVTFAyX0ZMQUdfSENSQ19FUlJPUjsKKwlpZiAoc3RhdHVzICYgKDEgPDwgUlhfRERQX1NUQVRVU19EQ1JDX1NISUZUKSkKKwkJc2tiX3VscF9tb2RlKHNrYikgfD0gVUxQMl9GTEFHX0RDUkNfRVJST1I7CisJaWYgKHN0YXR1cyAmICgxIDw8IFJYX0REUF9TVEFUVVNfUEFEX1NISUZUKSkKKwkJc2tiX3VscF9tb2RlKHNrYikgfD0gVUxQMl9GTEFHX1BBRF9FUlJPUjsKKworCWlmIChza2ItPmxlbiA+IChoZHJfbGVuICsgc2l6ZW9mKGRkcF9jcGwpKSkgeworCQllcnIgPSBza2JfY29weV9iaXRzKHNrYiwgaGRyX2xlbiwgJmRhdGFfY3BsLCBzaXplb2YoZGF0YV9jcGwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGFib3J0X2Nvbm47CisJCWRhdGFfbGVuID0gbnRvaHMoZGF0YV9jcGwubGVuKTsKKwkJbGVuICs9IHNpemVvZihkYXRhX2NwbCkgKyBkYXRhX2xlbjsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmICgxIDw8IFJYX0REUF9TVEFUVVNfRERQX1NISUZUKSkKKwkJc2tiX3VscF9tb2RlKHNrYikgfD0gVUxQMl9GTEFHX0RBVEFfRERQRUQ7CisKKwljM2NuLT5yY3Zfbnh0ID0gbnRvaGwoZGRwX2NwbC5zZXEpICsgc2tiX3VscF9wZHVsZW4oc2tiKTsKKwlfX3Bza2JfdHJpbShza2IsIGxlbik7CisJX19za2JfcXVldWVfdGFpbCgmYzNjbi0+cmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwljeGdiM2lfY29ubl9wZHVfcmVhZHkoYzNjbik7CisKKwlyZXR1cm47CisKK2Fib3J0X2Nvbm46CisJc2VuZF9hYm9ydF9yZXEoYzNjbik7CisJX19rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBkb19pc2NzaV9oZHIoc3RydWN0IHQzY2RldiAqdDNkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbiA9IGN0eDsKKworCXByb2Nlc3NfY3BsX21zZyhwcm9jZXNzX3J4X2lzY3NpX2hkciwgYzNjbiwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgVFhfREFUQV9BQ0sgQ1BMIG1lc3NhZ2VzOiAtPiBob3N0CisgKiBQcm9jZXNzIGFuIGFja25vd2xlZGdtZW50IG9mIFdSIGNvbXBsZXRpb24uICBBZHZhbmNlIHNuZF91bmEgYW5kIHNlbmQgdGhlCisgKiBuZXh0IGJhdGNoIG9mIHdvcmsgcmVxdWVzdHMgZnJvbSB0aGUgd3JpdGUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfd3JfYWNrKHN0cnVjdCBzM19jb25uICpjM2NuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfd3JfYWNrICpoZHIgPSBjcGxoZHIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgY3JlZGl0cyA9IG50b2hzKGhkci0+Y3JlZGl0cyk7CisJdTMyIHNuZF91bmEgPSBudG9obChoZHItPnNuZF91bmEpOworCisJYzNjbi0+d3JfYXZhaWwgKz0gY3JlZGl0czsKKwlpZiAoYzNjbi0+d3JfdW5hY2tlZCA+IGMzY24tPndyX21heCAtIGMzY24tPndyX2F2YWlsKQorCQljM2NuLT53cl91bmFja2VkID0gYzNjbi0+d3JfbWF4IC0gYzNjbi0+d3JfYXZhaWw7CisKKwl3aGlsZSAoY3JlZGl0cykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqcCA9IHBlZWtfd3IoYzNjbik7CisKKwkJaWYgKHVubGlrZWx5KCFwKSkgeworCQkJY3hnYjNpX2xvZ19lcnJvcigiJXUgV1JfQUNLIGNyZWRpdHMgZm9yIFRJRCAldSB3aXRoICIKKwkJCQkJICJub3RoaW5nIHBlbmRpbmcsIHN0YXRlICV1XG4iLAorCQkJCQkgY3JlZGl0cywgYzNjbi0+dGlkLCBjM2NuLT5zdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAodW5saWtlbHkoY3JlZGl0cyA8IHAtPmNzdW0pKSB7CisJCQlwLT5jc3VtIC09IGNyZWRpdHM7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRlcXVldWVfd3IoYzNjbik7CisJCQljcmVkaXRzIC09IHAtPmNzdW07CisJCQlmcmVlX3dyX3NrYihwKTsKKwkJfQorCX0KKworCWlmICh1bmxpa2VseShiZWZvcmUoc25kX3VuYSwgYzNjbi0+c25kX3VuYSkpKQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKGMzY24tPnNuZF91bmEgIT0gc25kX3VuYSkgeworCQljM2NuLT5zbmRfdW5hID0gc25kX3VuYTsKKwkJZHN0X2NvbmZpcm0oYzNjbi0+ZHN0X2NhY2hlKTsKKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmYzNjbi0+d3JpdGVfcXVldWUpICYmIGMzY25fcHVzaF90eF9mcmFtZXMoYzNjbiwgMCkpCisJCWN4Z2IzaV9jb25uX3R4X29wZW4oYzNjbik7CitvdXRfZnJlZToKKwlfX2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGRvX3dyX2FjayhzdHJ1Y3QgdDNjZGV2ICpjZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpjdHgpCit7CisJc3RydWN0IHMzX2Nvbm4gKmMzY24gPSBjdHg7CisKKwlwcm9jZXNzX2NwbF9tc2cocHJvY2Vzc193cl9hY2ssIGMzY24sIHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmb3IgZWFjaCBjb25uZWN0aW9uLCBwcmUtYWxsb2NhdGUgc2ticyBuZWVkZWQgZm9yIGNsb3NlL2Fib3J0IHJlcXVlc3RzLiBTbworICogdGhhdCB3ZSBjYW4gc2VydmljZSB0aGUgcmVxdWVzdCByaWdodCBhd2F5LgorICovCitzdGF0aWMgdm9pZCBjM2NuX2ZyZWVfY3BsX3NrYnMoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJaWYgKGMzY24tPmNwbF9jbG9zZSkKKwkJa2ZyZWVfc2tiKGMzY24tPmNwbF9jbG9zZSk7CisJaWYgKGMzY24tPmNwbF9hYm9ydF9yZXEpCisJCWtmcmVlX3NrYihjM2NuLT5jcGxfYWJvcnRfcmVxKTsKKwlpZiAoYzNjbi0+Y3BsX2Fib3J0X3JwbCkKKwkJa2ZyZWVfc2tiKGMzY24tPmNwbF9hYm9ydF9ycGwpOworfQorCitzdGF0aWMgaW50IGMzY25fYWxsb2NfY3BsX3NrYnMoc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJYzNjbi0+Y3BsX2Nsb3NlID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghYzNjbi0+Y3BsX2Nsb3NlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcHV0KGMzY24tPmNwbF9jbG9zZSwgc2l6ZW9mKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSkpOworCisJYzNjbi0+Y3BsX2Fib3J0X3JlcSA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9yZXEpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWMzY24tPmNwbF9hYm9ydF9yZXEpCisJCWdvdG8gZnJlZV9jcGxfc2ticzsKKwlza2JfcHV0KGMzY24tPmNwbF9hYm9ydF9yZXEsIHNpemVvZihzdHJ1Y3QgY3BsX2Fib3J0X3JlcSkpOworCisJYzNjbi0+Y3BsX2Fib3J0X3JwbCA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9ycGwpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWMzY24tPmNwbF9hYm9ydF9ycGwpCisJCWdvdG8gZnJlZV9jcGxfc2ticzsKKwlza2JfcHV0KGMzY24tPmNwbF9hYm9ydF9ycGwsIHNpemVvZihzdHJ1Y3QgY3BsX2Fib3J0X3JwbCkpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfY3BsX3NrYnM6CisJYzNjbl9mcmVlX2NwbF9za2JzKGMzY24pOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGMzY25fcmVsZWFzZV9vZmZsb2FkX3Jlc291cmNlcyAtIHJlbGVhc2Ugb2ZmbG9hZCByZXNvdXJjZQorICogQGMzY246IHRoZSBvZmZsb2FkZWQgaXNjc2kgdGNwIGNvbm5lY3Rpb24uCisgKiBSZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5IGFuIG9mZmxvYWQgY29ubmVjdGlvbiAoVElELCBMMlQgZW50cnksIGV0Yy4pCisgKi8KK3N0YXRpYyB2b2lkIGMzY25fcmVsZWFzZV9vZmZsb2FkX3Jlc291cmNlcyhzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwlzdHJ1Y3QgdDNjZGV2ICpjZGV2ID0gYzNjbi0+Y2RldjsKKwl1bnNpZ25lZCBpbnQgdGlkID0gYzNjbi0+dGlkOworCisJaWYgKCFjZGV2KQorCQlyZXR1cm47CisKKwljM2NuLT5xc2V0ID0gMDsKKworCWMzY25fZnJlZV9jcGxfc2ticyhjM2NuKTsKKworCWlmIChjM2NuLT53cl9hdmFpbCAhPSBjM2NuLT53cl9tYXgpIHsKKwkJcHVyZ2Vfd3JfcXVldWUoYzNjbik7CisJCXJlc2V0X3dyX2xpc3QoYzNjbik7CisJfQorCisJaWYgKGMzY24tPmwydCkgeworCQlsMnRfcmVsZWFzZShMMkRBVEEoY2RldiksIGMzY24tPmwydCk7CisJCWMzY24tPmwydCA9IE5VTEw7CisJfQorCisJaWYgKGMzY24tPnN0YXRlID09IEMzQ05fU1RBVEVfQ09OTkVDVElORykgLyogd2UgaGF2ZSBBVElEICovCisJCXMzX2ZyZWVfYXRpZChjZGV2LCB0aWQpOworCWVsc2UgewkJLyogd2UgaGF2ZSBUSUQgKi8KKwkJY3hnYjNfcmVtb3ZlX3RpZChjZGV2LCAodm9pZCAqKWMzY24sIHRpZCk7CisJCWMzY25fcHV0KGMzY24pOworCX0KKworCWMzY24tPmNkZXYgPSBOVUxMOworfQorCisvKioKKyAqIGN4Z2IzaV9jM2NuX2NyZWF0ZSAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHMzX2Nvbm4gc3RydWN0dXJlCisgKiByZXR1cm5zIHRoZSBzM19jb25uIHN0cnVjdHVyZSBhbGxvY2F0ZWQuCisgKi8KK3N0cnVjdCBzM19jb25uICpjeGdiM2lfYzNjbl9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgczNfY29ubiAqYzNjbjsKKworCWMzY24gPSBremFsbG9jKHNpemVvZigqYzNjbiksIEdGUF9LRVJORUwpOworCWlmICghYzNjbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBwcmUtYWxsb2NhdGUgY2xvc2UvYWJvcnQgY3BsLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIG1lbW9yeQorCSAgIHdoZW4gY2xvc2UvYWJvcnQgaXMgcmVxdWVzdGVkLiAqLworCWlmIChjM2NuX2FsbG9jX2NwbF9za2JzKGMzY24pIDwgMCkKKwkJZ290byBmcmVlX2MzY247CisKKwljM2NuX2Nvbm5fZGVidWcoImFsbG9jIGMzY24gMHglcC5cbiIsIGMzY24pOworCisJYzNjbi0+ZmxhZ3MgPSAwOworCXNwaW5fbG9ja19pbml0KCZjM2NuLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZjM2NuLT5yZWZjbnQsIDEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmMzY24tPnJlY2VpdmVfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmMzY24tPndyaXRlX3F1ZXVlKTsKKwlzZXR1cF90aW1lcigmYzNjbi0+cmV0cnlfdGltZXIsIE5VTEwsICh1bnNpZ25lZCBsb25nKWMzY24pOworCXJ3bG9ja19pbml0KCZjM2NuLT5jYWxsYmFja19sb2NrKTsKKworCXJldHVybiBjM2NuOworCitmcmVlX2MzY246CisJa2ZyZWUoYzNjbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGMzY25fYWN0aXZlX2Nsb3NlKHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCWludCBkYXRhX2xvc3Q7CisJaW50IGNsb3NlX3JlcSA9IDA7CisKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgc3RhdGUgJXUsIGZsYWcgMHglbHguXG4iLAorCQkJIGMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisKKwlkc3RfY29uZmlybShjM2NuLT5kc3RfY2FjaGUpOworCisJYzNjbl9ob2xkKGMzY24pOworCXNwaW5fbG9ja19iaCgmYzNjbi0+bG9jayk7CisKKwlkYXRhX2xvc3QgPSBza2JfcXVldWVfbGVuKCZjM2NuLT5yZWNlaXZlX3F1ZXVlKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmYzNjbi0+cmVjZWl2ZV9xdWV1ZSk7CisKKwlzd2l0Y2ggKGMzY24tPnN0YXRlKSB7CisJY2FzZSBDM0NOX1NUQVRFX0NMT1NFRDoKKwljYXNlIEMzQ05fU1RBVEVfQUNUSVZFX0NMT1NFOgorCWNhc2UgQzNDTl9TVEFURV9DTE9TRV9XQUlUXzE6CisJY2FzZSBDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMjoKKwljYXNlIEMzQ05fU1RBVEVfQUJPUlRJTkc6CisJCS8qIG5vdGhpbmcgbmVlZCB0byBiZSBkb25lICovCisJCWJyZWFrOworCWNhc2UgQzNDTl9TVEFURV9DT05ORUNUSU5HOgorCQkvKiBkZWZlciB1bnRpbCBjcGxfYWN0X29wZW5fcnBsIG9yIGNwbF9hY3RfZXN0YWJsaXNoICovCisJCWMzY25fc2V0X2ZsYWcoYzNjbiwgQzNDTl9BQ1RJVkVfQ0xPU0VfTkVFREVEKTsKKwkJYnJlYWs7CisJY2FzZSBDM0NOX1NUQVRFX0VTVEFCTElTSEVEOgorCQljbG9zZV9yZXEgPSAxOworCQljM2NuX3NldF9zdGF0ZShjM2NuLCBDM0NOX1NUQVRFX0FDVElWRV9DTE9TRSk7CisJCWJyZWFrOworCWNhc2UgQzNDTl9TVEFURV9QQVNTSVZFX0NMT1NFOgorCQljbG9zZV9yZXEgPSAxOworCQljM2NuX3NldF9zdGF0ZShjM2NuLCBDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMik7CisJCWJyZWFrOworCX0KKworCWlmIChjbG9zZV9yZXEpIHsKKwkJaWYgKGRhdGFfbG9zdCkKKwkJCS8qIFVucmVhZCBkYXRhIHdhcyB0b3NzZWQsIHphcCB0aGUgY29ubmVjdGlvbi4gKi8KKwkJCXNlbmRfYWJvcnRfcmVxKGMzY24pOworCQllbHNlCisJCQlzZW5kX2Nsb3NlX3JlcShjM2NuKTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmYzNjbi0+bG9jayk7CisJYzNjbl9wdXQoYzNjbik7Cit9CisKKy8qKgorICogY3hnYjNpX2MzY25fcmVsZWFzZSAtIGNsb3NlIGFuZCByZWxlYXNlIGFuIGlzY3NpIHRjcCBjb25uZWN0aW9uIGFuZCBhbnkKKyAqIAlyZXNvdXJjZSBoZWxkCisgKiBAYzNjbjogdGhlIGlzY3NpIHRjcCBjb25uZWN0aW9uCisgKi8KK3ZvaWQgY3hnYjNpX2MzY25fcmVsZWFzZShzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgcyAldSwgZiAweCVseC5cbiIsCisJCQljM2NuLCBjM2NuLT5zdGF0ZSwgYzNjbi0+ZmxhZ3MpOworCWlmIChsaWtlbHkoYzNjbi0+c3RhdGUgIT0gQzNDTl9TVEFURV9DT05ORUNUSU5HKSkKKwkJYzNjbl9hY3RpdmVfY2xvc2UoYzNjbik7CisJZWxzZQorCQljM2NuX3NldF9mbGFnKGMzY24sIEMzQ05fQUNUSVZFX0NMT1NFX05FRURFRCk7CisJYzNjbl9wdXQoYzNjbik7Cit9CisKK3N0YXRpYyBpbnQgaXNfY3hnYjNfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhOworCisJd3JpdGVfbG9jaygmY2RhdGFfcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkYXRhLCAmY2RhdGFfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgYWRhcF9wb3J0cyAqcG9ydHMgPSAmY2RhdGEtPnBvcnRzOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydHMtPm5wb3J0czsgaSsrKQorCQkJaWYgKGRldiA9PSBwb3J0cy0+bGxkZXZzW2ldKSB7CisJCQkJd3JpdGVfdW5sb2NrKCZjZGF0YV9yd2xvY2spOworCQkJCXJldHVybiAxOworCQkJfQorCX0KKwl3cml0ZV91bmxvY2soJmNkYXRhX3J3bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYjNfZWdyZXNzX2RldiAtIHJldHVybiB0aGUgY3hnYjMgZWdyZXNzIGRldmljZQorICogQHJvb3RfZGV2OiB0aGUgcm9vdCBkZXZpY2UgYW5jaG9yaW5nIHRoZSBzZWFyY2gKKyAqIEBjM2NuOiB0aGUgY29ubmVjdGlvbiB1c2VkIHRvIGRldGVybWluZSBlZ3Jlc3MgcG9ydCBpbiBib25kaW5nIG1vZGUKKyAqIEBjb250ZXh0OiBpbiBib25kaW5nIG1vZGUsIGluZGljYXRlcyBhIGNvbm5lY3Rpb24gc2V0IHVwIG9yIGZhaWxvdmVyCisgKgorICogUmV0dXJuIGVncmVzcyBkZXZpY2Ugb3IgTlVMTCBpZiB0aGUgZWdyZXNzIGRldmljZSBpc24ndCBvbmUgb2Ygb3VyIHBvcnRzLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmN4Z2IzX2VncmVzc19kZXYoc3RydWN0IG5ldF9kZXZpY2UgKnJvb3RfZGV2LAorCQkJCQkgICBzdHJ1Y3QgczNfY29ubiAqYzNjbiwKKwkJCQkJICAgaW50IGNvbnRleHQpCit7CisJd2hpbGUgKHJvb3RfZGV2KSB7CisJCWlmIChyb290X2Rldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikKKwkJCXJvb3RfZGV2ID0gdmxhbl9kZXZfcmVhbF9kZXYocm9vdF9kZXYpOworCQllbHNlIGlmIChpc19jeGdiM19kZXYocm9vdF9kZXYpKQorCQkJcmV0dXJuIHJvb3RfZGV2OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRhYmxlICpmaW5kX3JvdXRlKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCSBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgZmxvd2kgZmwgPSB7CisJCS5vaWYgPSAwLAorCQkubmxfdSA9IHsKKwkJCSAuaXA0X3UgPSB7CisJCQkJICAgLmRhZGRyID0gZGFkZHIsCisJCQkJICAgLnNhZGRyID0gc2FkZHIsCisJCQkJICAgLnRvcyA9IDAgfSB9LAorCQkucHJvdG8gPSBJUFBST1RPX1RDUCwKKwkJLnVsaV91ID0geworCQkJICAucG9ydHMgPSB7CisJCQkJICAgIC5zcG9ydCA9IHNwb3J0LAorCQkJCSAgICAuZHBvcnQgPSBkcG9ydCB9IH0gfTsKKworCWlmIChpcF9yb3V0ZV9vdXRwdXRfZmxvdygmaW5pdF9uZXQsICZydCwgJmZsLCBOVUxMLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJ0OworfQorCisvKgorICogQXNzaWduIG9mZmxvYWQgcGFyYW1ldGVycyB0byBzb21lIGNvbm5lY3Rpb24gZmllbGRzLgorICovCitzdGF0aWMgdm9pZCBpbml0X29mZmxvYWRfY29ubihzdHJ1Y3QgczNfY29ubiAqYzNjbiwKKwkJCSAgICAgIHN0cnVjdCB0M2NkZXYgKmNkZXYsCisJCQkgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJQlVHX09OKGMzY24tPmNkZXYgIT0gY2Rldik7CisJYzNjbi0+d3JfbWF4ID0gYzNjbi0+d3JfYXZhaWwgPSBUM0NfREFUQShjZGV2KS0+bWF4X3dyczsKKwljM2NuLT53cl91bmFja2VkID0gMDsKKwljM2NuLT5tc3NfaWR4ID0gc2VsZWN0X21zcyhjM2NuLCBkc3RfbXR1KGRzdCkpOworCisJcmVzZXRfd3JfbGlzdChjM2NuKTsKK30KKworc3RhdGljIGludCBpbml0aWF0ZV9hY3Rfb3BlbihzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3hnYjNpX3NkZXZfZGF0YSAqY2RhdGEgPSBOREVWMkNEQVRBKGRldik7CisJc3RydWN0IHQzY2RldiAqY2RldiA9IGNkYXRhLT5jZGV2OworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IGMzY24tPmRzdF9jYWNoZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJYzNjbl9jb25uX2RlYnVnKCJjM2NuIDB4JXAsIHN0YXRlICV1LCBmbGFnIDB4JWx4LlxuIiwKKwkJCWMzY24sIGMzY24tPnN0YXRlLCBjM2NuLT5mbGFncyk7CisJLyoKKwkgKiBJbml0aWFsaXplIGNvbm5lY3Rpb24gZGF0YS4gIE5vdGUgdGhhdCB0aGUgZmxhZ3MgYW5kIFVMUCBtb2RlIGFyZQorCSAqIGluaXRpYWxpemVkIGhpZ2hlciB1cCAuLi4KKwkgKi8KKwljM2NuLT5kZXYgPSBkZXY7CisJYzNjbi0+Y2RldiA9IGNkZXY7CisJYzNjbi0+dGlkID0gY3hnYjNfYWxsb2NfYXRpZChjZGV2LCBjZGF0YS0+Y2xpZW50LCBjM2NuKTsKKwlpZiAoYzNjbi0+dGlkIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJYzNjbi0+cXNldCA9IDA7CisJYzNjbi0+bDJ0ID0gdDNfbDJ0X2dldChjZGV2LCBkc3QtPm5laWdoYm91ciwgZGV2KTsKKwlpZiAoIWMzY24tPmwydCkKKwkJZ290byBmcmVlX3RpZDsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJZ290byBmcmVlX2wydDsKKworCXNrYi0+c2sgPSAoc3RydWN0IHNvY2sgKiljM2NuOworCXNldF9hcnBfZmFpbHVyZV9oYW5kbGVyKHNrYiwgYWN0X29wZW5fcmVxX2FycF9mYWlsdXJlKTsKKworCWMzY25faG9sZChjM2NuKTsKKworCWluaXRfb2ZmbG9hZF9jb25uKGMzY24sIGNkZXYsIGRzdCk7CisJYzNjbi0+ZXJyID0gMDsKKworCW1ha2VfYWN0X29wZW5fcmVxKGMzY24sIHNrYiwgYzNjbi0+dGlkLCBjM2NuLT5sMnQpOworCWwydF9zZW5kKGNkZXYsIHNrYiwgYzNjbi0+bDJ0KTsKKwlyZXR1cm4gMDsKKworZnJlZV9sMnQ6CisJbDJ0X3JlbGVhc2UoTDJEQVRBKGNkZXYpLCBjM2NuLT5sMnQpOworZnJlZV90aWQ6CisJczNfZnJlZV9hdGlkKGNkZXYsIGMzY24tPnRpZCk7CisJYzNjbi0+dGlkID0gMDsKK291dF9lcnI6CisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogY3hnYjNpX2MzY25fY29ubmVjdCAtIGluaXRpYXRlcyBhbiBpc2NzaSB0Y3AgY29ubmVjdGlvbiB0byBhIGdpdmVuIGFkZHJlc3MKKyAqIEBjM2NuOiB0aGUgaXNjc2kgdGNwIGNvbm5lY3Rpb24KKyAqIEB1c2luOiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKgorICogcmV0dXJuIDAgaWYgYWN0aXZlIG9wZW4gcmVxdWVzdCBpcyBzZW50LCA8IDAgb3RoZXJ3aXNlLgorICovCitpbnQgY3hnYjNpX2MzY25fY29ubmVjdChzdHJ1Y3QgczNfY29ubiAqYzNjbiwgc3RydWN0IHNvY2thZGRyX2luICp1c2luKQoreworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhOworCXN0cnVjdCB0M2NkZXYgKmNkZXY7CisJX19iZTMyIHNpcHY0OworCWludCBlcnI7CisKKwlpZiAodXNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCWMzY24tPmRhZGRyLnNpbl9wb3J0ID0gdXNpbi0+c2luX3BvcnQ7CisJYzNjbi0+ZGFkZHIuc2luX2FkZHIuc19hZGRyID0gdXNpbi0+c2luX2FkZHIuc19hZGRyOworCisJcnQgPSBmaW5kX3JvdXRlKGMzY24tPnNhZGRyLnNpbl9hZGRyLnNfYWRkciwKKwkJCWMzY24tPmRhZGRyLnNpbl9hZGRyLnNfYWRkciwKKwkJCWMzY24tPnNhZGRyLnNpbl9wb3J0LAorCQkJYzNjbi0+ZGFkZHIuc2luX3BvcnQpOworCWlmIChydCA9PSBOVUxMKSB7CisJCWMzY25fY29ubl9kZWJ1ZygiTk8gcm91dGUgdG8gMHgleCwgcG9ydCAldS5cbiIsCisJCQkJYzNjbi0+ZGFkZHIuc2luX2FkZHIuc19hZGRyLAorCQkJCW50b2hzKGMzY24tPmRhZGRyLnNpbl9wb3J0KSk7CisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJfQorCisJaWYgKHJ0LT5ydF9mbGFncyAmIChSVENGX01VTFRJQ0FTVCB8IFJUQ0ZfQlJPQURDQVNUKSkgeworCQljM2NuX2Nvbm5fZGVidWcoIm11bHRpLWNhc3Qgcm91dGUgdG8gMHgleCwgcG9ydCAldS5cbiIsCisJCQkJYzNjbi0+ZGFkZHIuc2luX2FkZHIuc19hZGRyLAorCQkJCW50b2hzKGMzY24tPmRhZGRyLnNpbl9wb3J0KSk7CisJCWlwX3J0X3B1dChydCk7CisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJfQorCisJaWYgKCFjM2NuLT5zYWRkci5zaW5fYWRkci5zX2FkZHIpCisJCWMzY24tPnNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHJ0LT5ydF9zcmM7CisKKwkvKiBub3cgY29tbWl0IGRlc3RpbmF0aW9uIHRvIGNvbm5lY3Rpb24gKi8KKwljM2NuLT5kc3RfY2FjaGUgPSAmcnQtPnUuZHN0OworCisJLyogdHJ5IHRvIGVzdGFibGlzaCBhbiBvZmZsb2FkZWQgY29ubmVjdGlvbiAqLworCWRldiA9IGN4Z2IzX2VncmVzc19kZXYoYzNjbi0+ZHN0X2NhY2hlLT5kZXYsIGMzY24sIDApOworCWlmIChkZXYgPT0gTlVMTCkgeworCQljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCwgZWdyZXNzIGRldiBOVUxMLlxuIiwgYzNjbik7CisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJfQorCWNkYXRhID0gTkRFVjJDREFUQShkZXYpOworCWNkZXYgPSBjZGF0YS0+Y2RldjsKKworCS8qIGdldCBhIHNvdXJjZSBwb3J0IGlmIG9uZSBoYXNuJ3QgYmVlbiBwcm92aWRlZCAqLworCWVyciA9IGMzY25fZ2V0X3BvcnQoYzNjbiwgY2RhdGEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwljM2NuX2Nvbm5fZGVidWcoImMzY24gMHglcCBnZXQgcG9ydCAldS5cbiIsCisJCQljM2NuLCBudG9ocyhjM2NuLT5zYWRkci5zaW5fcG9ydCkpOworCisJc2lwdjQgPSBjeGdiM2lfZ2V0X3ByaXZhdGVfaXB2NGFkZHIoZGV2KTsKKwlpZiAoIXNpcHY0KSB7CisJCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwLCBpc2NzaSBpcCBub3QgY29uZmlndXJlZC5cbiIsIGMzY24pOworCQlzaXB2NCA9IGMzY24tPnNhZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwkJY3hnYjNpX3NldF9wcml2YXRlX2lwdjRhZGRyKGRldiwgc2lwdjQpOworCX0gZWxzZQorCQljM2NuLT5zYWRkci5zaW5fYWRkci5zX2FkZHIgPSBzaXB2NDsKKworCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwLCAldS4ldS4ldS4ldSwldS0ldS4ldS4ldS4ldSwldSBTWU5fU0VOVC5cbiIsCisJCQljM2NuLCBOSVBRVUFEKGMzY24tPnNhZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhjM2NuLT5zYWRkci5zaW5fcG9ydCksCisJCQlOSVBRVUFEKGMzY24tPmRhZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhjM2NuLT5kYWRkci5zaW5fcG9ydCkpOworCisJYzNjbl9zZXRfc3RhdGUoYzNjbiwgQzNDTl9TVEFURV9DT05ORUNUSU5HKTsKKwlpZiAoIWluaXRpYXRlX2FjdF9vcGVuKGMzY24sIGRldikpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgZG9uJ3QgaGF2ZSBhbiBvZmZsb2FkIGNvbm5lY3Rpb24gc28gc2ltcGx5CisJICogcmV0dXJuIGEgZmFpbHVyZS4KKwkgKi8KKwllcnIgPSAtRU5PVFNVUFA7CisKKwkvKgorCSAqIFRoaXMgdHJhc2hlcyB0aGUgY29ubmVjdGlvbiBhbmQgcmVsZWFzZXMgdGhlIGxvY2FsIHBvcnQsCisJICogaWYgbmVjZXNzYXJ5LgorCSAqLworCWMzY25fY29ubl9kZWJ1ZygiYzNjbiAweCVwIC0+IENMT1NFRC5cbiIsIGMzY24pOworCWMzY25fc2V0X3N0YXRlKGMzY24sIEMzQ05fU1RBVEVfQ0xPU0VEKTsKKwlpcF9ydF9wdXQocnQpOworCWMzY25fcHV0X3BvcnQoYzNjbik7CisJYzNjbi0+ZGFkZHIuc2luX3BvcnQgPSAwOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogY3hnYjNpX2MzY25fcnhfY3JlZGl0cyAtIGFjayByZWNlaXZlZCB0Y3AgZGF0YS4KKyAqIEBjM2NuOiBpc2NzaSB0Y3AgY29ubmVjdGlvbgorICogQGNvcGllZDogIyBvZiBieXRlcyBwcm9jZXNzZWQKKyAqCisgKiBDYWxsZWQgYWZ0ZXIgc29tZSByZWNlaXZlZCBkYXRhIGhhcyBiZWVuIHJlYWQuICBJdCByZXR1cm5zIFJYIGNyZWRpdHMKKyAqIHRvIHRoZSBIVyBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHByb2Nlc3NlZC4KKyAqLwordm9pZCBjeGdiM2lfYzNjbl9yeF9jcmVkaXRzKHN0cnVjdCBzM19jb25uICpjM2NuLCBpbnQgY29waWVkKQoreworCXN0cnVjdCB0M2NkZXYgKmNkZXY7CisJaW50IG11c3Rfc2VuZDsKKwl1MzIgY3JlZGl0cywgZGFjayA9IDA7CisKKwlpZiAoYzNjbi0+c3RhdGUgIT0gQzNDTl9TVEFURV9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuOworCisJY3JlZGl0cyA9IGMzY24tPmNvcGllZF9zZXEgLSBjM2NuLT5yY3Zfd3VwOworCWlmICh1bmxpa2VseSghY3JlZGl0cykpCisJCXJldHVybjsKKworCWNkZXYgPSBjM2NuLT5jZGV2OworCisJaWYgKHVubGlrZWx5KGN4Z2IzX3J4X2NyZWRpdF90aHJlcyA9PSAwKSkKKwkJcmV0dXJuOworCisJZGFjayA9IEZfUlhfREFDS19DSEFOR0UgfCBWX1JYX0RBQ0tfTU9ERSgxKTsKKworCS8qCisJICogRm9yIGNvYWxlc2NpbmcgdG8gd29yayBlZmZlY3RpdmVseSBlbnN1cmUgdGhlIHJlY2VpdmUgd2luZG93IGhhcworCSAqIGF0IGxlYXN0IDE2S0IgbGVmdC4KKwkgKi8KKwltdXN0X3NlbmQgPSBjcmVkaXRzICsgMTYzODQgPj0gY3hnYjNfcmN2X3dpbjsKKworCWlmIChtdXN0X3NlbmQgfHwgY3JlZGl0cyA+PSBjeGdiM19yeF9jcmVkaXRfdGhyZXMpCisJCWMzY24tPnJjdl93dXAgKz0gc2VuZF9yeF9jcmVkaXRzKGMzY24sIGNyZWRpdHMsIGRhY2spOworfQorCisvKioKKyAqIGN4Z2IzaV9jM2NuX3NlbmRfcGR1cyAtIHNlbmQgdGhlIHNrYnMgY29udGFpbmluZyBpc2NzaSBwZHVzCisgKiBAYzNjbjogaXNjc2kgdGNwIGNvbm5lY3Rpb24KKyAqIEBza2I6IHNrYiBjb250YWlucyB0aGUgaXNjc2kgcGR1CisgKgorICogQWRkIGEgbGlzdCBvZiBza2JzIHRvIGEgY29ubmVjdGlvbiBzZW5kIHF1ZXVlLiBUaGUgc2ticyBtdXN0IGNvbXBseSB3aXRoCisgKiB0aGUgbWF4IHNpemUgbGltaXQgb2YgdGhlIGRldmljZSBhbmQgaGF2ZSBhIGhlYWRyb29tIG9mIGF0IGxlYXN0CisgKiBUWF9IRUFERVJfTEVOIGJ5dGVzLgorICogUmV0dXJuICMgb2YgYnl0ZXMgcXVldWVkLgorICovCitpbnQgY3hnYjNpX2MzY25fc2VuZF9wZHVzKHN0cnVjdCBzM19jb25uICpjM2NuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpuZXh0OworCWludCBlcnIsIGNvcGllZCA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmMzY24tPmxvY2spOworCisJaWYgKGMzY24tPnN0YXRlICE9IEMzQ05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJYzNjbl90eF9kZWJ1ZygiYzNjbiAweCVwLCBub3QgaW4gZXN0LiBzdGF0ZSAldS5cbiIsCisJCQkgICAgICBjM2NuLCBjM2NuLT5zdGF0ZSk7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwllcnIgPSAtRVBJUEU7CisJaWYgKGMzY24tPmVycikgeworCQljM2NuX3R4X2RlYnVnKCJjM2NuIDB4JXAsIGVyciAlZC5cbiIsIGMzY24sIGMzY24tPmVycik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwl3aGlsZSAoc2tiKSB7CisJCWludCBmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKworCQkJCShza2ItPmxlbiAhPSBza2ItPmRhdGFfbGVuKTsKKworCQlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBUWF9IRUFERVJfTEVOKSkgeworCQkJYzNjbl90eF9kZWJ1ZygiYzNjbiAweCVwLCBza2IgaGVhZC5cbiIsIGMzY24pOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCWlmIChmcmFncyA+PSBTS0JfV1JfTElTVF9TSVpFKSB7CisJCQljeGdiM2lfbG9nX2Vycm9yKCJjM2NuIDB4JXAsIHR4IGZyYWdzICVkLCBsZW4gJXUsJXUuXG4iLAorCQkJCQkgYzNjbiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKKwkJCQkJIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQluZXh0ID0gc2tiLT5uZXh0OworCQlza2ItPm5leHQgPSBOVUxMOworCQlza2JfZW50YWlsKGMzY24sIHNrYiwgQzNDQl9GTEFHX05PX0FQUEVORCB8IEMzQ0JfRkxBR19ORUVEX0hEUik7CisJCWNvcGllZCArPSBza2ItPmxlbjsKKwkJYzNjbi0+d3JpdGVfc2VxICs9IHNrYi0+bGVuICsgdWxwX2V4dHJhX2xlbihza2IpOworCQlza2IgPSBuZXh0OworCX0KK2RvbmU6CisJaWYgKGxpa2VseShza2JfcXVldWVfbGVuKCZjM2NuLT53cml0ZV9xdWV1ZSkpKQorCQljM2NuX3B1c2hfdHhfZnJhbWVzKGMzY24sIDEpOworCXNwaW5fdW5sb2NrX2JoKCZjM2NuLT5sb2NrKTsKKwlyZXR1cm4gY29waWVkOworCitvdXRfZXJyOgorCWlmIChjb3BpZWQgPT0gMCAmJiBlcnIgPT0gLUVQSVBFKQorCQljb3BpZWQgPSBjM2NuLT5lcnIgPyBjM2NuLT5lcnIgOiAtRVBJUEU7CisJZ290byBkb25lOworfQorCitzdGF0aWMgdm9pZCBzZGV2X2RhdGFfY2xlYW51cChzdHJ1Y3QgY3hnYjNpX3NkZXZfZGF0YSAqY2RhdGEpCit7CisJc3RydWN0IGFkYXBfcG9ydHMgKnBvcnRzID0gJmNkYXRhLT5wb3J0czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0cy0+bnBvcnRzOyBpKyspCisJCU5ERVYyQ0RBVEEocG9ydHMtPmxsZGV2c1tpXSkgPSBOVUxMOworCWN4Z2IzaV9mcmVlX2JpZ19tZW0oY2RhdGEpOworfQorCit2b2lkIGN4Z2IzaV9zZGV2X2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgY3hnYjNpX3NkZXZfZGF0YSAqY2RhdGE7CisKKwl3cml0ZV9sb2NrKCZjZGF0YV9yd2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RhdGEsICZjZGF0YV9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZjZGF0YS0+bGlzdCk7CisJCXNkZXZfZGF0YV9jbGVhbnVwKGNkYXRhKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZjZGF0YV9yd2xvY2spOworfQorCitpbnQgY3hnYjNpX3NkZXZfaW5pdChjeGdiM19jcGxfaGFuZGxlcl9mdW5jICpjcGxfaGFuZGxlcnMpCit7CisJY3BsX2hhbmRsZXJzW0NQTF9BQ1RfRVNUQUJMSVNIXSA9IGRvX2FjdF9lc3RhYmxpc2g7CisJY3BsX2hhbmRsZXJzW0NQTF9BQ1RfT1BFTl9SUExdID0gZG9fYWN0X29wZW5fcnBsOworCWNwbF9oYW5kbGVyc1tDUExfUEVFUl9DTE9TRV0gPSBkb19wZWVyX2Nsb3NlOworCWNwbF9oYW5kbGVyc1tDUExfQUJPUlRfUkVRX1JTU10gPSBkb19hYm9ydF9yZXE7CisJY3BsX2hhbmRsZXJzW0NQTF9BQk9SVF9SUExfUlNTXSA9IGRvX2Fib3J0X3JwbDsKKwljcGxfaGFuZGxlcnNbQ1BMX0NMT1NFX0NPTl9SUExdID0gZG9fY2xvc2VfY29uX3JwbDsKKwljcGxfaGFuZGxlcnNbQ1BMX1RYX0RNQV9BQ0tdID0gZG9fd3JfYWNrOworCWNwbF9oYW5kbGVyc1tDUExfSVNDU0lfSERSXSA9IGRvX2lzY3NpX2hkcjsKKworCWlmIChjeGdiM19tYXhfY29ubmVjdCA+IENYR0IzSV9NQVhfQ09OTikKKwkJY3hnYjNfbWF4X2Nvbm5lY3QgPSBDWEdCM0lfTUFYX0NPTk47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYjNpX3NkZXZfYWRkIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmVzb3VyY2VzIGZvciBlYWNoIGFkYXB0ZXIgZm91bmQKKyAqIEBjZGV2Ogl0M2NkZXYgYWRhcHRlcgorICogQGNsaWVudDoJY3hnYjMgZHJpdmVyIGNsaWVudAorICovCit2b2lkIGN4Z2IzaV9zZGV2X2FkZChzdHJ1Y3QgdDNjZGV2ICpjZGV2LCBzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhOworCXN0cnVjdCBvZmxkX3BhZ2VfaW5mbyByeF9wYWdlX2luZm87CisJdW5zaWduZWQgaW50IHdyX2xlbjsKKwlpbnQgbWFwc2l6ZSA9IERJVl9ST1VORF9VUChjeGdiM19tYXhfY29ubmVjdCwKKwkJCQkgICA4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpbnQgaTsKKworCWNkYXRhID0gIGN4Z2IzaV9hbGxvY19iaWdfbWVtKHNpemVvZigqY2RhdGEpICsgbWFwc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGNkZXYtPmN0bChjZGV2LCBHRVRfV1JfTEVOLCAmd3JfbGVuKSA8IDAgfHwKKwkgICAgY2Rldi0+Y3RsKGNkZXYsIEdFVF9QT1JUUywgJmNkYXRhLT5wb3J0cykgPCAwIHx8CisJICAgIGNkZXYtPmN0bChjZGV2LCBHRVRfUlhfUEFHRV9JTkZPLCAmcnhfcGFnZV9pbmZvKSA8IDApCisJCWdvdG8gZnJlZV9jZGF0YTsKKworCXMzX2luaXRfd3JfdGFiKHdyX2xlbik7CisKKwlJTklUX0xJU1RfSEVBRCgmY2RhdGEtPmxpc3QpOworCWNkYXRhLT5jZGV2ID0gY2RldjsKKwljZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCisJZm9yIChpID0gMDsgaSA8IGNkYXRhLT5wb3J0cy5ucG9ydHM7IGkrKykKKwkJTkRFVjJDREFUQShjZGF0YS0+cG9ydHMubGxkZXZzW2ldKSA9IGNkYXRhOworCisJd3JpdGVfbG9jaygmY2RhdGFfcndsb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZjZGF0YS0+bGlzdCwgJmNkYXRhX2xpc3QpOworCXdyaXRlX3VubG9jaygmY2RhdGFfcndsb2NrKTsKKworCXJldHVybjsKKworZnJlZV9jZGF0YToKKwljeGdiM2lfZnJlZV9iaWdfbWVtKGNkYXRhKTsKK30KKworLyoqCisgKiBjeGdiM2lfc2Rldl9yZW1vdmUgLSBmcmVlIHRoZSBhbGxvY2F0ZWQgcmVzb3VyY2VzIGZvciB0aGUgYWRhcHRlcgorICogQGNkZXY6CXQzY2RldiBhZGFwdGVyCisgKi8KK3ZvaWQgY3hnYjNpX3NkZXZfcmVtb3ZlKHN0cnVjdCB0M2NkZXYgKmNkZXYpCit7CisJc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKmNkYXRhID0gQ1hHQjNfU0RFVl9EQVRBKGNkZXYpOworCisJd3JpdGVfbG9jaygmY2RhdGFfcndsb2NrKTsKKwlsaXN0X2RlbCgmY2RhdGEtPmxpc3QpOworCXdyaXRlX3VubG9jaygmY2RhdGFfcndsb2NrKTsKKworCXNkZXZfZGF0YV9jbGVhbnVwKGNkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuaCBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX29mZmxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMxNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfb2ZmbG9hZC5oCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogY3hnYjNpX29mZmxvYWQuaDogQ2hlbHNpbyBTM3h4IGlzY3NpIG9mZmxvYWRlZCB0Y3AgY29ubmVjdGlvbiBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQ2hlbHNpbyBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW5jbHVkZWQgaW4gdGhpcworICogcmVsZWFzZSBmb3IgbGljZW5zaW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLgorICoKKyAqIFdyaXR0ZW4gYnk6CURpbWl0cmlzIE1pY2hhaWxpZGlzIChkbUBjaGVsc2lvLmNvbSkKKyAqCQlLYXJlbiBYaWUgKGt4aWVAY2hlbHNpby5jb20pCisgKi8KKworI2lmbmRlZiBfQ1hHQjNJX09GRkxPQURfSAorI2RlZmluZSBfQ1hHQjNJX09GRkxPQURfSAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiYWRhcHRlci5oIgorI2luY2x1ZGUgInQzY2Rldi5oIgorI2luY2x1ZGUgImN4Z2IzX29mZmxvYWQuaCIKKworI2RlZmluZSBjeGdiM2lfbG9nX2Vycm9yKGZtdC4uLikgcHJpbnRrKEtFUk5fRVJSICJjeGdiM2k6IEVSUiEgIiBmbXQpCisjZGVmaW5lIGN4Z2IzaV9sb2dfd2FybihmbXQuLi4pCSBwcmludGsoS0VSTl9XQVJOSU5HICJjeGdiM2k6IFdBUk4hICIgZm10KQorI2RlZmluZSBjeGdiM2lfbG9nX2luZm8oZm10Li4uKSAgcHJpbnRrKEtFUk5fSU5GTyAiY3hnYjNpOiAiIGZtdCkKKyNkZWZpbmUgY3hnYjNpX2xvZ19kZWJ1ZyhmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPICJjeGdiM2k6ICVzIC0gIiBmbXQsIF9fZnVuY19fICwgIyMgYXJncykKKworLyoqCisgKiBzdHJ1Y3QgczNfY29ubiAtIGFuIGlzY3NpIHRjcCBjb25uZWN0aW9uIHN0cnVjdHVyZQorICoKKyAqIEBkZXY6CW5ldCBkZXZpY2Ugb2Ygd2l0aCBjb25uZWN0aW9uCisgKiBAY2RldjoJYWRhcHRlciB0M2NkZXYgZm9yIG5ldCBkZXZpY2UKKyAqIEBmbGFnczoJc2VlIGMzY25fZmxhZ3MgYmVsb3cKKyAqIEB0aWQ6CWNvbm5lY3Rpb24gaWQgYXNzaWduZWQgYnkgdGhlIGgvdworICogQHFzZXQ6CXF1ZXVlIHNldCB1c2VkIGJ5IGNvbm5lY3Rpb24KKyAqIEBtc3NfaWR4OglNYXhpbXVtIFNlZ21lbnQgU2l6ZSB0YWJsZSBpbmRleAorICogQGwydDoJQVJQIHJlc29sdXRpb24gZW50cnkgZm9yIG9mZmxvYWQgcGFja2V0cworICogQHdyX21heDoJbWF4aW11bSBpbi1mbGlnaHQgd3JpdGVzCisgKiBAd3JfYXZhaWw6CW51bWJlciBvZiB3cml0ZXMgYXZhaWxhYmxlCisgKiBAd3JfdW5hY2tlZDoJd3JpdGVzIHNpbmNlIGxhc3QgcmVxdWVzdCBmb3IgY29tcGxldGlvbiBub3RpZmljYXRpb24KKyAqIEB3cl9wZW5kaW5nX2hlYWQ6IGhlYWQgb2YgcGVuZGluZyB3cml0ZSBxdWV1ZQorICogQHdyX3BlbmRpbmdfdGFpbDogdGFpbCBvZiBwZW5kaW5nIHdyaXRlIHF1ZXVlCisgKiBAY3BsX2Nsb3NlOglza2IgZm9yIGNwbF9jbG9zZV9yZXEKKyAqIEBjcGxfYWJvcnRfcmVxOiBza2IgZm9yIGNwbF9hYm9ydF9yZXEKKyAqIEBjcGxfYWJvcnRfcnBsOiBza2IgZm9yIGNwbF9hYm9ydF9ycGwKKyAqIEBsb2NrOgljb25uZWN0aW9uIHN0YXR1cyBsb2NrCisgKiBAcmVmY250OglyZWZlcmVuY2UgY291bnQgb24gY29ubmVjdGlvbgorICogQHN0YXRlOgljb25uZWN0aW9uIHN0YXRlCisgKiBAc2FkZHI6CXNvdXJjZSBpcC9wb3J0IGFkZHJlc3MKKyAqIEBkYWRkcjoJZGVzdGluYXRpb24gaXAvcG9ydCBhZGRyZXNzCisgKiBAZHN0X2NhY2hlOglyZWZlcmVuY2UgdG8gZGVzdGluYXRpb24gcm91dGUKKyAqIEByZWNlaXZlX3F1ZXVlOiByZWNlaXZlZCBQRFVzCisgKiBAd3JpdGVfcXVldWU6IHVuLXB1c2hlZCBwZW5kaW5nIHdyaXRlcworICogQHJldHJ5X3RpbWVyOiByZXRyeSB0aW1lciBmb3IgdmFyaW91cyBvcGVyYXRpb25zCisgKiBAZXJyOgljb25uZWN0aW9uIGVycm9yIHN0YXR1cworICogQGNhbGxiYWNrX2xvY2s6IGxvY2sgZm9yIG9wYXF1ZSB1c2VyIGNvbnRleHQKKyAqIEB1c2VyX2RhdGE6CW9wYXF1ZSB1c2VyIGNvbnRleHQKKyAqIEByY3Zfbnh0OgluZXh0IHJlY2VpdmUgc2VxLiAjCisgKiBAY29waWVkX3NlcToJaGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEKKyAqIEByY3Zfd3VwOglyY3Zfbnh0IG9uIGxhc3Qgd2luZG93IHVwZGF0ZSBzZW50CisgKiBAc25kX254dDoJbmV4dCBzZXF1ZW5jZSB3ZSBzZW5kCisgKiBAc25kX3VuYToJZmlyc3QgYnl0ZSB3ZSB3YW50IGFuIGFjayBmb3IKKyAqIEB3cml0ZV9zZXE6CXRhaWwrMSBvZiBkYXRhIGhlbGQgaW4gc2VuZCBidWZmZXIKKyAqLworc3RydWN0IHMzX2Nvbm4geworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHQzY2RldiAqY2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aWQ7CisJaW50IHFzZXQ7CisJaW50IG1zc19pZHg7CisJc3RydWN0IGwydF9lbnRyeSAqbDJ0OworCWludCB3cl9tYXg7CisJaW50IHdyX2F2YWlsOworCWludCB3cl91bmFja2VkOworCXN0cnVjdCBza19idWZmICp3cl9wZW5kaW5nX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKndyX3BlbmRpbmdfdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3BsX2Nsb3NlOworCXN0cnVjdCBza19idWZmICpjcGxfYWJvcnRfcmVxOworCXN0cnVjdCBza19idWZmICpjcGxfYWJvcnRfcnBsOworCXNwaW5sb2NrX3QgbG9jazsKKwlhdG9taWNfdCByZWZjbnQ7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHN0YXRlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gZGFkZHI7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0X2NhY2hlOworCXN0cnVjdCBza19idWZmX2hlYWQgcmVjZWl2ZV9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHdyaXRlX3F1ZXVlOworCXN0cnVjdCB0aW1lcl9saXN0IHJldHJ5X3RpbWVyOworCWludCBlcnI7CisJcndsb2NrX3QgY2FsbGJhY2tfbG9jazsKKwl2b2lkICp1c2VyX2RhdGE7CisKKwl1MzIgcmN2X254dDsKKwl1MzIgY29waWVkX3NlcTsKKwl1MzIgcmN2X3d1cDsKKwl1MzIgc25kX254dDsKKwl1MzIgc25kX3VuYTsKKwl1MzIgd3JpdGVfc2VxOworfTsKKworLyoKKyAqIGNvbm5lY3Rpb24gc3RhdGUKKyAqLworZW51bSBjb25uX3N0YXRlcyB7CisJQzNDTl9TVEFURV9DT05ORUNUSU5HID0gMSwKKwlDM0NOX1NUQVRFX0VTVEFCTElTSEVELAorCUMzQ05fU1RBVEVfQUNUSVZFX0NMT1NFLAorCUMzQ05fU1RBVEVfUEFTU0lWRV9DTE9TRSwKKwlDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMSwKKwlDM0NOX1NUQVRFX0NMT1NFX1dBSVRfMiwKKwlDM0NOX1NUQVRFX0FCT1JUSU5HLAorCUMzQ05fU1RBVEVfQ0xPU0VELAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYzNjbl9pc19jbG9zaW5nKGNvbnN0IHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCXJldHVybiBjM2NuLT5zdGF0ZSA+PSBDM0NOX1NUQVRFX0FDVElWRV9DTE9TRTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGMzY25faXNfZXN0YWJsaXNoZWQoY29uc3Qgc3RydWN0IHMzX2Nvbm4gKmMzY24pCit7CisJcmV0dXJuIGMzY24tPnN0YXRlID09IEMzQ05fU1RBVEVfRVNUQUJMSVNIRUQ7Cit9CisKKy8qCisgKiBDb25uZWN0aW9uIGZsYWdzIC0tIG1hbnkgdG8gdHJhY2sgc29tZSBjbG9zZSByZWxhdGVkIGV2ZW50cy4KKyAqLworZW51bSBjM2NuX2ZsYWdzIHsKKwlDM0NOX0FCT1JUX1JQTF9SQ1ZELAkvKiByZWNlaXZlZCBvbmUgQUJPUlRfUlBMX1JTUyBtZXNzYWdlICovCisJQzNDTl9BQk9SVF9SRVFfUkNWRCwJLyogcmVjZWl2ZWQgb25lIEFCT1JUX1JFUV9SU1MgbWVzc2FnZSAqLworCUMzQ05fQUJPUlRfUlBMX1BFTkRJTkcsCS8qIGV4cGVjdGluZyBhbiBhYm9ydCByZXBseSAqLworCUMzQ05fVFhfREFUQV9TRU5ULAkvKiBhbHJlYWR5IHNlbnQgYSBUWF9EQVRBIFdSICovCisJQzNDTl9BQ1RJVkVfQ0xPU0VfTkVFREVELAkvKiBuZWVkIHRvIGJlIGNsb3NlZCAqLworfTsKKworLyoqCisgKiBjeGdiM2lfc2Rldl9kYXRhIC0gUGVyIGFkYXB0ZXIgZGF0YS4KKyAqIExpbmtlZCBvZmYgb2YgZWFjaCBFdGhlcm5ldCBkZXZpY2UgcG9ydCBvbiB0aGUgYWRhcHRlci4KKyAqIEFsc28gYXZhaWxhYmxlIHZpYSB0aGUgdDNjZGV2IHN0cnVjdHVyZSBzaW5jZSB3ZSBoYXZlIHBvaW50ZXJzIHRvIG91ciBwb3J0CisgKiBuZXRfZGV2aWNlJ3MgdGhlcmUgLi4uCisgKgorICogQGxpc3Q6CWxpc3QgaGVhZCB0byBsaW5rIGVsZW1lbnRzCisgKiBAY2RldjoJdDNjZGV2IGFkYXB0ZXIKKyAqIEBjbGllbnQ6CUNQTCBjbGllbnQgcG9pbnRlcgorICogQHBvcnRzOglhcnJheSBvZiBhZGFwdGVyIHBvcnRzCisgKiBAc3BvcnRfbWFwX25leHQ6IG5leHQgaW5kZXggaW50byB0aGUgcG9ydCBtYXAKKyAqIEBzcG9ydF9tYXA6CXNvdXJjZSBwb3J0IG1hcAorICovCitzdHJ1Y3QgY3hnYjNpX3NkZXZfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0M2NkZXYgKmNkZXY7CisJc3RydWN0IGN4Z2IzX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBhZGFwX3BvcnRzIHBvcnRzOworCXVuc2lnbmVkIGludCBzcG9ydF9tYXBfbmV4dDsKKwl1bnNpZ25lZCBsb25nIHNwb3J0X21hcFswXTsKK307CisjZGVmaW5lIE5ERVYyQ0RBVEEobmRldikgKCooc3RydWN0IGN4Z2IzaV9zZGV2X2RhdGEgKiopJihuZGV2KS0+ZWNfcHRyKQorI2RlZmluZSBDWEdCM19TREVWX0RBVEEoY2RldikgTkRFVjJDREFUQSgoY2RldiktPmxsZGV2KQorCit2b2lkIGN4Z2IzaV9zZGV2X2NsZWFudXAodm9pZCk7CitpbnQgY3hnYjNpX3NkZXZfaW5pdChjeGdiM19jcGxfaGFuZGxlcl9mdW5jICopOwordm9pZCBjeGdiM2lfc2Rldl9hZGQoc3RydWN0IHQzY2RldiAqLCBzdHJ1Y3QgY3hnYjNfY2xpZW50ICopOwordm9pZCBjeGdiM2lfc2Rldl9yZW1vdmUoc3RydWN0IHQzY2RldiAqKTsKKworc3RydWN0IHMzX2Nvbm4gKmN4Z2IzaV9jM2NuX2NyZWF0ZSh2b2lkKTsKK2ludCBjeGdiM2lfYzNjbl9jb25uZWN0KHN0cnVjdCBzM19jb25uICosIHN0cnVjdCBzb2NrYWRkcl9pbiAqKTsKK3ZvaWQgY3hnYjNpX2MzY25fcnhfY3JlZGl0cyhzdHJ1Y3QgczNfY29ubiAqLCBpbnQpOworaW50IGN4Z2IzaV9jM2NuX3NlbmRfcGR1cyhzdHJ1Y3QgczNfY29ubiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3ZvaWQgY3hnYjNpX2MzY25fcmVsZWFzZShzdHJ1Y3QgczNfY29ubiAqKTsKKworLyoqCisgKiBjeGdiM19za2JfY2IgLSBjb250cm9sIGJsb2NrIGZvciByZWNlaXZlZCBwZHUgc3RhdGUgYW5kIFVMUCBtb2RlIG1hbmFnZW1lbnQuCisgKgorICogQGZsYWc6CXNlZSBDM0NCX0ZMQUdfKiBiZWxvdworICogQHVscF9tb2RlOglVTFAgbW9kZS9zdWJtb2RlIG9mIHNrX2J1ZmYKKyAqIEBzZXE6CXRjcCBzZXF1ZW5jZSBudW1iZXIKKyAqIEBkZGlnZXN0OglwZHUgZGF0YSBkaWdlc3QKKyAqIEBwZHVsZW46CXJlY292ZXJlZCBwZHUgbGVuZ3RoCisgKiBAd3JfZGF0YToJc2NyYXRjaCBhcmVhIGZvciB0eCB3cgorICovCitzdHJ1Y3QgY3hnYjNfc2tiX2NiIHsKKwlfX3U4IGZsYWdzOworCV9fdTggdWxwX21vZGU7CisJX191MzIgc2VxOworCV9fdTMyIGRkaWdlc3Q7CisJX191MzIgcGR1bGVuOworCXN0cnVjdCBza19idWZmICp3cl9kYXRhOworfTsKKworI2RlZmluZSBDWEdCM19TS0JfQ0Ioc2tiKQkoKHN0cnVjdCBjeGdiM19za2JfY2IgKikmKChza2IpLT5jYlswXSkpCisKKyNkZWZpbmUgc2tiX3VscF9tb2RlKHNrYikJKENYR0IzX1NLQl9DQihza2IpLT51bHBfbW9kZSkKKyNkZWZpbmUgc2tiX3VscF9kZGlnZXN0KHNrYikJKENYR0IzX1NLQl9DQihza2IpLT5kZGlnZXN0KQorI2RlZmluZSBza2JfdWxwX3BkdWxlbihza2IpCShDWEdCM19TS0JfQ0Ioc2tiKS0+cGR1bGVuKQorI2RlZmluZSBza2Jfd3JfZGF0YShza2IpCShDWEdCM19TS0JfQ0Ioc2tiKS0+d3JfZGF0YSkKKworZW51bSBjM2NiX2ZsYWdzIHsKKwlDM0NCX0ZMQUdfTkVFRF9IRFIgPSAxIDw8IDAsCS8qIHBhY2tldCBuZWVkcyBhIFRYX0RBVEFfV1IgaGVhZGVyICovCisJQzNDQl9GTEFHX05PX0FQUEVORCA9IDEgPDwgMSwJLyogZG9uJ3QgZ3JvdyB0aGlzIHNrYiAqLworCUMzQ0JfRkxBR19DT01QTCA9IDEgPDwgMiwJLyogcmVxdWVzdCBXUiBjb21wbGV0aW9uICovCit9OworCisvKioKKyAqIHNnZV9vcGFxdWVfaGRyIC0KKyAqIE9wYXF1ZSB2ZXJzaW9uIG9mIHN0cnVjdHVyZSB0aGUgU0dFIHN0b3JlcyBhdCBza2ItPmhlYWQgb2YgVFhfREFUQSBwYWNrZXRzCisgKiBhbmQgZm9yIHdoaWNoIHdlIG11c3QgcmVzZXJ2ZSBzcGFjZS4KKyAqLworc3RydWN0IHNnZV9vcGFxdWVfaGRyIHsKKwl2b2lkICpkZXY7CisJZG1hX2FkZHJfdCBhZGRyW01BWF9TS0JfRlJBR1MgKyAxXTsKK307CisKKy8qIGZvciBUWDogYSBza2IgbXVzdCBoYXZlIGEgaGVhZHJvb20gb2YgYXQgbGVhc3QgVFhfSEVBREVSX0xFTiBieXRlcyAqLworI2RlZmluZSBUWF9IRUFERVJfTEVOIFwKKwkJKHNpemVvZihzdHJ1Y3QgdHhfZGF0YV93cikgKyBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSkKKworLyoKKyAqIGdldCBhbmQgc2V0IHByaXZhdGUgaXAgZm9yIGlzY3NpIHRyYWZmaWMKKyAqLworI2RlZmluZSBjeGdiM2lfZ2V0X3ByaXZhdGVfaXB2NGFkZHIobmRldikgXAorCSgoKHN0cnVjdCBwb3J0X2luZm8gKikobmV0ZGV2X3ByaXYobmRldikpKS0+aXNjc2lfaXB2NGFkZHIpCisjZGVmaW5lIGN4Z2IzaV9zZXRfcHJpdmF0ZV9pcHY0YWRkcihuZGV2LCBhZGRyKSBcCisJKCgoc3RydWN0IHBvcnRfaW5mbyAqKShuZXRkZXZfcHJpdihuZGV2KSkpLT5pc2NzaV9pcHY0YWRkcikgPSBhZGRyCisKKy8qIG1heC4gY29ubmVjdGlvbnMgcGVyIGFkYXB0ZXIgKi8KKyNkZWZpbmUgQ1hHQjNJX01BWF9DT05OCQkxNjM4NAorI2VuZGlmIC8qIF9DWEdCM19PRkZMT0FEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX3BkdS5jIGIvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfcGR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3Y2U4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX3BkdS5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogY3hnYjNpX3BkdS5jOiBDaGVsc2lvIFMzeHggaVNDU0kgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWlrZSBDaHJpc3RpZQorICogQ29weXJpZ2h0IChjKSAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnk6IEthcmVuIFhpZSAoa3hpZUBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAiY3hnYjNpLmgiCisjaW5jbHVkZSAiY3hnYjNpX3BkdS5oIgorCisjaWZkZWYgX19ERUJVR19DWEdCM0lfUlhfXworI2RlZmluZSBjeGdiM2lfcnhfZGVidWcJCWN4Z2IzaV9sb2dfZGVidWcKKyNlbHNlCisjZGVmaW5lIGN4Z2IzaV9yeF9kZWJ1ZyhmbXQuLi4pCisjZW5kaWYKKworI2lmZGVmIF9fREVCVUdfQ1hHQjNJX1RYX18KKyNkZWZpbmUgY3hnYjNpX3R4X2RlYnVnCQljeGdiM2lfbG9nX2RlYnVnCisjZWxzZQorI2RlZmluZSBjeGdiM2lfdHhfZGVidWcoZm10Li4uKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqcGFkX3BhZ2U7CisKKy8qCisgKiBwZHUgcmVjZWl2ZSwgaW50ZXJhY3Qgd2l0aCBsaWJpc2NzaV90Y3AKKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVhZF9wZHVfc2tiKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCBvZmZsb2FkZWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGJ5dGVzX3JlYWQ7CisKKwlieXRlc19yZWFkID0gaXNjc2lfdGNwX3JlY3Zfc2tiKGNvbm4sIHNrYiwgb2Zmc2V0LCBvZmZsb2FkZWQsICZzdGF0dXMpOworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBJU0NTSV9UQ1BfQ09OTl9FUlI6CisJCXJldHVybiAtRUlPOworCWNhc2UgSVNDU0lfVENQX1NVU1BFTkRFRDoKKwkJLyogbm8gdHJhbnNmZXIgLSBqdXN0IGhhdmUgY2FsbGVyIGZsdXNoIHF1ZXVlICovCisJCXJldHVybiBieXRlc19yZWFkOworCWNhc2UgSVNDU0lfVENQX1NLQl9ET05FOgorCQkvKgorCQkgKiBwZHVzIHNob3VsZCBhbHdheXMgZml0IGluIHRoZSBza2IgYW5kIHdlIHNob3VsZCBnZXQKKwkJICogc2VnbWVudCBkb25lIG5vdGlmY2F0aW9uLgorCQkgKi8KKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJJbnZhbGlkIHBkdSBvciBza2IuIik7CisJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSVNDU0lfVENQX1NFR01FTlRfRE9ORToKKwkJcmV0dXJuIGJ5dGVzX3JlYWQ7CisJZGVmYXVsdDoKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJJbnZhbGlkIGlzY3NpX3RjcF9yZWN2X3NrYiAiCisJCQkJICAic3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3hnYjNpX2Nvbm5fcmVhZF9wZHVfc2tiKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCWJvb2wgb2ZmbG9hZGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCByYzsKKworCWN4Z2IzaV9yeF9kZWJ1ZygiY29ubiAweCVwLCBza2IgMHglcCwgbGVuICV1LCBmbGFnIDB4JXguXG4iLAorCQkJY29ubiwgc2tiLCBza2ItPmxlbiwgc2tiX3VscF9tb2RlKHNrYikpOworCisJaWYgKCFpc2NzaV90Y3BfcmVjdl9zZWdtZW50X2lzX2hkcih0Y3BfY29ubikpIHsKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9QUk9UTyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjb25uLT5oZHJkZ3N0X2VuICYmIChza2JfdWxwX21vZGUoc2tiKSAmIFVMUDJfRkxBR19IQ1JDX0VSUk9SKSkgeworCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0hEUl9ER1NUKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuICYmIChza2JfdWxwX21vZGUoc2tiKSAmIFVMUDJfRkxBR19EQ1JDX0VSUk9SKSkgeworCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0RBVEFfREdTVCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGlzY3NpIGhkciAqLworCXJjID0gcmVhZF9wZHVfc2tiKGNvbm4sIHNrYiwgMCwgMCk7CisJaWYgKHJjIDw9IDApCisJCXJldHVybiByYzsKKworCWlmIChpc2NzaV90Y3BfcmVjdl9zZWdtZW50X2lzX2hkcih0Y3BfY29ubikpCisJCXJldHVybiAwOworCisJb2Zmc2V0ID0gcmM7CisJaWYgKGNvbm4tPmhkcmRnc3RfZW4pCisJCW9mZnNldCArPSBJU0NTSV9ESUdFU1RfU0laRTsKKworCS8qIGlzY3NpIGRhdGEgKi8KKwlpZiAoc2tiX3VscF9tb2RlKHNrYikgJiBVTFAyX0ZMQUdfREFUQV9ERFBFRCkgeworCQljeGdiM2lfcnhfZGVidWcoInNrYiAweCVwLCBvcGNvZGUgMHgleCwgZGF0YSAldSwgZGRwJ2VkLCAiCisJCQkJIml0dCAweCV4LlxuIiwKKwkJCQlza2IsCisJCQkJdGNwX2Nvbm4tPmluLmhkci0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0ssCisJCQkJdGNwX2Nvbm4tPmluLmRhdGFsZW4sCisJCQkJbnRvaGwodGNwX2Nvbm4tPmluLmhkci0+aXR0KSk7CisJCW9mZmxvYWRlZCA9IDE7CisJfSBlbHNlIHsKKwkJY3hnYjNpX3J4X2RlYnVnKCJza2IgMHglcCwgb3Bjb2RlIDB4JXgsIGRhdGEgJXUsIE5PVCBkZHAnZWQsICIKKwkJCQkiaXR0IDB4JXguXG4iLAorCQkJCXNrYiwKKwkJCQl0Y3BfY29ubi0+aW4uaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSywKKwkJCQl0Y3BfY29ubi0+aW4uZGF0YWxlbiwKKwkJCQludG9obCh0Y3BfY29ubi0+aW4uaGRyLT5pdHQpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgY3BsX2lzY3NpX2hkcl9ub3Jzcyk7CisJfQorCisJcmMgPSByZWFkX3BkdV9za2IoY29ubiwgc2tiLCBvZmZzZXQsIG9mZmxvYWRlZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwZHUgdHJhbnNtaXQsIGludGVyYWN0IHdpdGggbGliaXNjc2lfdGNwCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0eF9za2Jfc2V0bW9kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGNyYywgaW50IGRjcmMpCit7CisJdTggc3VibW9kZSA9IDA7CisKKwlpZiAoaGNyYykKKwkJc3VibW9kZSB8PSAxOworCWlmIChkY3JjKQorCQlzdWJtb2RlIHw9IDI7CisJc2tiX3VscF9tb2RlKHNrYikgPSAoVUxQX01PREVfSVNDU0kgPDwgNCkgfCBzdWJtb2RlOworfQorCit2b2lkIGN4Z2IzaV9jb25uX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKKworCS8qIG5ldmVyIHJlYWNoZWQgdGhlIHhtaXQgdGFzayBjYWxsb3V0ICovCisJaWYgKHRjcF90YXNrLT5kZF9kYXRhKQorCQlrZnJlZV9za2IodGNwX3Rhc2stPmRkX2RhdGEpOworCXRjcF90YXNrLT5kZF9kYXRhID0gTlVMTDsKKworCS8qIE1OQyAtIERvIHdlIG5lZWQgYSBjaGVjayBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIGJ1dAorCSAqIGN4Z2IzaV9jb25uX2FsbG9jX3BkdSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgb24gdGhlIHRhc2sgKi8KKwljeGdiM2lfcmVsZWFzZV9pdHQodGFzaywgdGFzay0+aGRyX2l0dCk7CisJaXNjc2lfdGNwX2NsZWFudXBfdGFzayh0YXNrKTsKK30KKworLyoKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGFocyB5ZXQKKyAqLworaW50IGN4Z2IzaV9jb25uX2FsbG9jX3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgdTggb3Bjb2RlKQoreworCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl0YXNrLT5oZHIgPSBOVUxMOworCS8qIGFsd2F5cyBhbGxvY2F0ZSByb29tcyBmb3IgQUhTICovCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSArIElTQ1NJX01BWF9BSFNfU0laRSArCisJCQlUWF9IRUFERVJfTEVOLCAgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY3hnYjNpX3R4X2RlYnVnKCJ0YXNrIDB4JXAsIG9wY29kZSAweCV4LCBza2IgMHglcC5cbiIsCisJCQl0YXNrLCBvcGNvZGUsIHNrYik7CisKKwl0Y3BfdGFzay0+ZGRfZGF0YSA9IHNrYjsKKwlza2JfcmVzZXJ2ZShza2IsIFRYX0hFQURFUl9MRU4pOworCXRhc2stPmhkciA9IChzdHJ1Y3QgaXNjc2lfaGRyICopc2tiLT5kYXRhOworCXRhc2stPmhkcl9tYXggPSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcik7CisKKwkvKiBkYXRhX291dCB1c2VzIHNjc2lfY21kJ3MgaXR0ICovCisJaWYgKG9wY29kZSAhPSBJU0NTSV9PUF9TQ1NJX0RBVEFfT1VUKQorCQljeGdiM2lfcmVzZXJ2ZV9pdHQodGFzaywgJnRhc2stPmhkci0+aXR0KTsKKworCXJldHVybiAwOworfQorCitpbnQgY3hnYjNpX2Nvbm5faW5pdF9wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF90YXNrLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKKwlzdHJ1Y3QgcGFnZSAqcGc7CisJdW5zaWduZWQgaW50IGRhdGFsZW4gPSBjb3VudDsKKwlpbnQgaSwgcGFkbGVuID0gaXNjc2lfcGFkZGluZyhjb3VudCk7CisJc2tiX2ZyYWdfdCAqZnJhZzsKKworCWN4Z2IzaV90eF9kZWJ1ZygidGFzayAweCVwLDB4JXAsIG9mZnNldCAldSwgY291bnQgJXUsIHNrYiAweCVwLlxuIiwKKwkJCXRhc2ssIHRhc2stPnNjLCBvZmZzZXQsIGNvdW50LCBza2IpOworCisJc2tiX3B1dChza2IsIHRhc2stPmhkcl9sZW4pOworCXR4X3NrYl9zZXRtb2RlKHNrYiwgY29ubi0+aGRyZGdzdF9lbiwgZGF0YWxlbiA/IGNvbm4tPmRhdGFkZ3N0X2VuIDogMCk7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGFzay0+c2MpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJc3RydWN0IHNjc2lfZGF0YV9idWZmZXIgKnNkYjsKKwkJdW5zaWduZWQgaW50IHNnb2Zmc2V0ID0gb2Zmc2V0OworCQlzdHJ1Y3QgcGFnZSAqc2dwZzsKKwkJdW5zaWduZWQgaW50IHNnbGVuOworCisJCXNkYiA9IHNjc2lfb3V0KHRhc2stPnNjKTsKKwkJc2cgPSBzZGItPnRhYmxlLnNnbDsKKworCQlmb3JfZWFjaF9zZyhzZGItPnRhYmxlLnNnbCwgc2csIHNkYi0+dGFibGUubmVudHMsIGkpIHsKKwkJCWN4Z2IzaV90eF9kZWJ1Zygic2cgJWQsIHBhZ2UgMHglcCwgbGVuICV1IG9mZnNldCAldVxuIiwKKwkJCQkJaSwgc2dfcGFnZShzZyksIHNnLT5sZW5ndGgsIHNnLT5vZmZzZXQpOworCisJCQlpZiAoc2dvZmZzZXQgPCBzZy0+bGVuZ3RoKQorCQkJCWJyZWFrOworCQkJc2dvZmZzZXQgLT0gc2ctPmxlbmd0aDsKKwkJfQorCQlzZ3BnID0gc2dfcGFnZShzZyk7CisJCXNnbGVuID0gc2ctPmxlbmd0aCAtIHNnb2Zmc2V0OworCisJCWRvIHsKKwkJCWludCBqID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCXVuc2lnbmVkIGludCBjb3B5OworCisJCQlpZiAoIXNnbGVuKSB7CisJCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCQlzZ3BnID0gc2dfcGFnZShzZyk7CisJCQkJc2dvZmZzZXQgPSAwOworCQkJCXNnbGVuID0gc2ctPmxlbmd0aDsKKwkJCQkrK2k7CisJCQl9CisJCQljb3B5ID0gbWluKHNnbGVuLCBkYXRhbGVuKTsKKwkJCWlmIChqICYmIHNrYl9jYW5fY29hbGVzY2Uoc2tiLCBqLCBzZ3BnLAorCQkJCQkJICBzZy0+b2Zmc2V0ICsgc2dvZmZzZXQpKSB7CisJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqIC0gMV0uc2l6ZSArPSBjb3B5OworCQkJfSBlbHNlIHsKKwkJCQlnZXRfcGFnZShzZ3BnKTsKKwkJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBqLCBzZ3BnLAorCQkJCQkJICAgc2ctPm9mZnNldCArIHNnb2Zmc2V0LCBjb3B5KTsKKwkJCX0KKwkJCXNnb2Zmc2V0ICs9IGNvcHk7CisJCQlzZ2xlbiAtPSBjb3B5OworCQkJZGF0YWxlbiAtPSBjb3B5OworCQl9IHdoaWxlIChkYXRhbGVuKTsKKwl9IGVsc2UgeworCQlwZyA9IHZpcnRfdG9fcGFnZSh0YXNrLT5kYXRhKTsKKworCQl3aGlsZSAoZGF0YWxlbikgeworCQkJaSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJCWdldF9wYWdlKHBnKTsKKwkJCWZyYWctPnBhZ2UgPSBwZzsKKwkJCWZyYWctPnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCWZyYWctPnNpemUgPSBtaW4oKHVuc2lnbmVkIGludClQQUdFX1NJWkUsIGRhdGFsZW4pOworCisJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKys7CisJCQlkYXRhbGVuIC09IGZyYWctPnNpemU7CisJCQlwZysrOworCQl9CisJfQorCisJaWYgKHBhZGxlbikgeworCQlpID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQlmcmFnLT5wYWdlID0gcGFkX3BhZ2U7CisJCWZyYWctPnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJZnJhZy0+c2l6ZSA9IHBhZGxlbjsKKwkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCX0KKworCWRhdGFsZW4gPSBjb3VudCArIHBhZGxlbjsKKwlza2ItPmRhdGFfbGVuICs9IGRhdGFsZW47CisJc2tiLT50cnVlc2l6ZSArPSBkYXRhbGVuOworCXNrYi0+bGVuICs9IGRhdGFsZW47CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeGdiM2lfY29ubl94bWl0X3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdGNwX3Rhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IHRhc2stPmNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGN4Z2IzaV9jb25uICpjY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOworCXVuc2lnbmVkIGludCBkYXRhbGVuOworCWludCBlcnI7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIDA7CisKKwlkYXRhbGVuID0gc2tiLT5kYXRhX2xlbjsKKwl0Y3BfdGFzay0+ZGRfZGF0YSA9IE5VTEw7CisJZXJyID0gY3hnYjNpX2MzY25fc2VuZF9wZHVzKGNjb25uLT5jZXAtPmMzY24sIHNrYik7CisJY3hnYjNpX3R4X2RlYnVnKCJ0YXNrIDB4JXAsIHNrYiAweCVwLCBsZW4gJXUvJXUsIHJ2ICVkLlxuIiwKKwkJCXRhc2ssIHNrYiwgc2tiLT5sZW4sIHNrYi0+ZGF0YV9sZW4sIGVycik7CisJaWYgKGVyciA+IDApIHsKKwkJaW50IHBkdWxlbiA9IGVycjsKKworCQlpZiAodGFzay0+Y29ubi0+aGRyZGdzdF9lbikKKwkJCXBkdWxlbiArPSBJU0NTSV9ESUdFU1RfU0laRTsKKwkJaWYgKGRhdGFsZW4gJiYgdGFzay0+Y29ubi0+ZGF0YWRnc3RfZW4pCisJCQlwZHVsZW4gKz0gSVNDU0lfRElHRVNUX1NJWkU7CisKKwkJdGFzay0+Y29ubi0+dHhkYXRhX29jdGV0cyArPSBwZHVsZW47CisJCXJldHVybiAwOworCX0KKworCWlmIChlcnIgPCAwICYmIGVyciAhPSAtRUFHQUlOKSB7CisJCWtmcmVlX3NrYihza2IpOworCQljeGdiM2lfdHhfZGVidWcoIml0dCAweCV4LCBza2IgMHglcCwgbGVuICV1LyV1LCB4bWl0IGVyciAlZC5cbiIsCisJCQkJdGFzay0+aXR0LCBza2IsIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuLCBlcnIpOworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgdGFzay0+Y29ubiwgInhtaXQgZXJyICVkLlxuIiwgZXJyKTsKKwkJaXNjc2lfY29ubl9mYWlsdXJlKHRhc2stPmNvbm4sIElTQ1NJX0VSUl9YTUlUX0ZBSUxFRCk7CisJCXJldHVybiBlcnI7CisJfQorCS8qIHJlc2V0IHNrYiB0byBzZW5kIHdoZW4gd2UgYXJlIGNhbGxlZCBhZ2FpbiAqLworCXRjcF90YXNrLT5kZF9kYXRhID0gc2tiOworCXJldHVybiAtRUFHQUlOOworfQorCitpbnQgY3hnYjNpX3BkdV9pbml0KHZvaWQpCit7CisJcGFkX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFkX3BhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwYWdlX2FkZHJlc3MocGFkX3BhZ2UpLCAwLCBQQUdFX1NJWkUpOworCXJldHVybiAwOworfQorCit2b2lkIGN4Z2IzaV9wZHVfY2xlYW51cCh2b2lkKQoreworCWlmIChwYWRfcGFnZSkgeworCQlfX2ZyZWVfcGFnZShwYWRfcGFnZSk7CisJCXBhZF9wYWdlID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgY3hnYjNpX2Nvbm5fcGR1X3JlYWR5KHN0cnVjdCBzM19jb25uICpjM2NuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHJlYWQgPSAwOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYzNjbi0+dXNlcl9kYXRhOworCWludCBlcnIgPSAwOworCisJY3hnYjNpX3J4X2RlYnVnKCJjbiAweCVwLlxuIiwgYzNjbik7CisKKwlyZWFkX2xvY2soJmMzY24tPmNhbGxiYWNrX2xvY2spOworCWlmICh1bmxpa2VseSghY29ubiB8fCBjb25uLT5zdXNwZW5kX3J4KSkgeworCQljeGdiM2lfcnhfZGVidWcoImNvbm4gMHglcCwgaWQgJWQsIHN1c3BlbmRfcnggJWx1IVxuIiwKKwkJCQljb25uLCBjb25uID8gY29ubi0+aWQgOiAweEZGLAorCQkJCWNvbm4gPyBjb25uLT5zdXNwZW5kX3J4IDogMHhGRik7CisJCXJlYWRfdW5sb2NrKCZjM2NuLT5jYWxsYmFja19sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlza2IgPSBza2JfcGVlaygmYzNjbi0+cmVjZWl2ZV9xdWV1ZSk7CisJd2hpbGUgKCFlcnIgJiYgc2tiKSB7CisJCV9fc2tiX3VubGluayhza2IsICZjM2NuLT5yZWNlaXZlX3F1ZXVlKTsKKwkJcmVhZCArPSBza2JfdWxwX3BkdWxlbihza2IpOworCQllcnIgPSBjeGdiM2lfY29ubl9yZWFkX3BkdV9za2IoY29ubiwgc2tiKTsKKwkJX19rZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gc2tiX3BlZWsoJmMzY24tPnJlY2VpdmVfcXVldWUpOworCX0KKwlyZWFkX3VubG9jaygmYzNjbi0+Y2FsbGJhY2tfbG9jayk7CisJaWYgKGMzY24pIHsKKwkJYzNjbi0+Y29waWVkX3NlcSArPSByZWFkOworCQljeGdiM2lfYzNjbl9yeF9jcmVkaXRzKGMzY24sIHJlYWQpOworCX0KKwljb25uLT5yeGRhdGFfb2N0ZXRzICs9IHJlYWQ7Cit9CisKK3ZvaWQgY3hnYjNpX2Nvbm5fdHhfb3BlbihzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGMzY24tPnVzZXJfZGF0YTsKKworCWN4Z2IzaV90eF9kZWJ1ZygiY24gMHglcC5cbiIsIGMzY24pOworCWlmIChjb25uKSB7CisJCWN4Z2IzaV90eF9kZWJ1ZygiY24gMHglcCwgY2lkICVkLlxuIiwgYzNjbiwgY29ubi0+aWQpOworCQlzY3NpX3F1ZXVlX3dvcmsoY29ubi0+c2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKKwl9Cit9CisKK3ZvaWQgY3hnYjNpX2Nvbm5fY2xvc2luZyhzdHJ1Y3QgczNfY29ubiAqYzNjbikKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKworCXJlYWRfbG9jaygmYzNjbi0+Y2FsbGJhY2tfbG9jayk7CisJY29ubiA9IGMzY24tPnVzZXJfZGF0YTsKKwlpZiAoY29ubiAmJiBjM2NuLT5zdGF0ZSAhPSBDM0NOX1NUQVRFX0VTVEFCTElTSEVEKQorCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKKwlyZWFkX3VubG9jaygmYzNjbi0+Y2FsbGJhY2tfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9wZHUuaCBiL2RyaXZlcnMvc2NzaS9jeGdiM2kvY3hnYjNpX3BkdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjY4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9wZHUuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogY3hnYjNpX3VscDIuaDogQ2hlbHNpbyBTM3h4IGlTQ1NJIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBXcml0dGVuIGJ5OiBLYXJlbiBYaWUgKGt4aWVAY2hlbHNpby5jb20pCisgKi8KKworI2lmbmRlZiBfX0NYR0IzSV9VTFAyX1BEVV9IX18KKyNkZWZpbmUgX19DWEdCM0lfVUxQMl9QRFVfSF9fCisKK3N0cnVjdCBjcGxfaXNjc2lfaGRyX25vcnNzIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBwZHVfbGVuX2RkcDsKKwl1MTYgbGVuOworCXUzMiBzZXE7CisJdTE2IHVyZzsKKwl1OCByc3ZkOworCXU4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YV9kZHBfbm9yc3MgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IHVyZzsKKwl1MTYgbGVuOworCXUzMiBzZXE7CisJdTMyIG54dF9zZXE7CisJdTMyIHVscF9jcmM7CisJdTMyIGRkcF9zdGF0dXM7Cit9OworCisjZGVmaW5lIFJYX0REUF9TVEFUVVNfSVBQX1NISUZUCQkyNwkvKiBpbnZhbGlkIHBhZ2Vwb2QgKi8KKyNkZWZpbmUgUlhfRERQX1NUQVRVU19USURfU0hJRlQJCTI2CS8qIHRpZCBtaXNtYXRjaCAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX0NPTE9SX1NISUZUCTI1CS8qIGNvbG9yIG1pc21hdGNoICovCisjZGVmaW5lIFJYX0REUF9TVEFUVVNfT0ZGU0VUX1NISUZUCTI0CS8qIG9mZnNldCBtaXNtYXRjaCAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX1VMSU1JVF9TSElGVAkyMwkvKiB1bGltaXQgZXJyb3IgKi8KKyNkZWZpbmUgUlhfRERQX1NUQVRVU19UQUdfU0hJRlQJCTIyCS8qIHRhZyBtaXNtYXRjaCAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX0RDUkNfU0hJRlQJMjEJLyogZGNyYyBlcnJvciAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX0hDUkNfU0hJRlQJMjAJLyogaGNyYyBlcnJvciAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX1BBRF9TSElGVAkJMTkJLyogcGFkIGVycm9yICovCisjZGVmaW5lIFJYX0REUF9TVEFUVVNfUFBQX1NISUZUCQkxOAkvKiBwYWdlcG9kIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBSWF9ERFBfU1RBVFVTX0xMSU1JVF9TSElGVAkxNwkvKiBsbGltaXQgZXJyb3IgKi8KKyNkZWZpbmUgUlhfRERQX1NUQVRVU19ERFBfU0hJRlQJCTE2CS8qIGRkcCdhYmxlICovCisjZGVmaW5lIFJYX0REUF9TVEFUVVNfUE1NX1NISUZUCQkxNQkvKiBwYWdlcG9kIG1pc21hdGNoICovCisKKyNkZWZpbmUgVUxQMl9GTEFHX0RBVEFfUkVBRFkJCTB4MQorI2RlZmluZSBVTFAyX0ZMQUdfREFUQV9ERFBFRAkJMHgyCisjZGVmaW5lIFVMUDJfRkxBR19IQ1JDX0VSUk9SCQkweDEwCisjZGVmaW5lIFVMUDJfRkxBR19EQ1JDX0VSUk9SCQkweDIwCisjZGVmaW5lIFVMUDJfRkxBR19QQURfRVJST1IJCTB4NDAKKwordm9pZCBjeGdiM2lfY29ubl9jbG9zaW5nKHN0cnVjdCBzM19jb25uICopOwordm9pZCBjeGdiM2lfY29ubl9wZHVfcmVhZHkoc3RydWN0IHMzX2Nvbm4gKmMzY24pOwordm9pZCBjeGdiM2lfY29ubl90eF9vcGVuKHN0cnVjdCBzM19jb25uICpjM2NuKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCmluZGV4IDNkNTBjYWIuLjUzNjY0NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfZGguaD4KIAogI2RlZmluZSBSREFDX05BTUUgInJkYWMiCisjZGVmaW5lIFJEQUNfUkVUUllfQ09VTlQgNQogCiAvKgogICogTFNJIG1vZGUgcGFnZSBzdHVmZgpAQCAtMzg2LDYgKzM4Nyw3IEBACiAJc3RydWN0IGM5X2lucXVpcnkgKmlucXA7CiAKIAloLT5sdW5fc3RhdGUgPSBSREFDX0xVTl9VTk9XTkVEOworCWgtPnN0YXRlID0gUkRBQ19TVEFURV9BQ1RJVkU7CiAJZXJyID0gc3VibWl0X2lucXVpcnkoc2RldiwgMHhDOSwgc2l6ZW9mKHN0cnVjdCBjOV9pbnF1aXJ5KSwgaCk7CiAJaWYgKGVyciA9PSBTQ1NJX0RIX09LKSB7CiAJCWlucXAgPSAmaC0+aW5xLmM5OwpAQCAtNDc3LDIxICs0NzksMjcgQEAKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOwotCWludCBlcnIgPSBTQ1NJX0RIX1JFU19URU1QX1VOQVZBSUw7CisJaW50IGVyciwgcmV0cnlfY250ID0gUkRBQ19SRVRSWV9DT1VOVDsKIAorcmV0cnk6CisJZXJyID0gU0NTSV9ESF9SRVNfVEVNUF9VTkFWQUlMOwogCXJxID0gcmRhY19mYWlsb3Zlcl9nZXQoc2RldiwgaCk7CiAJaWYgKCFycSkKIAkJZ290byBkb25lOwogCi0Jc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LCAicXVldWVpbmcgTU9ERV9TRUxFQ1QgY29tbWFuZC5cbiIpOworCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwgIiVzIE1PREVfU0VMRUNUIGNvbW1hbmQuXG4iLAorCQkocmV0cnlfY250ID09IFJEQUNfUkVUUllfQ09VTlQpID8gInF1ZXVlaW5nIiA6ICJyZXRyeWluZyIpOwogCiAJZXJyID0gYmxrX2V4ZWN1dGVfcnEocSwgTlVMTCwgcnEsIDEpOwotCWlmIChlcnIgIT0gU0NTSV9ESF9PSykKKwlibGtfcHV0X3JlcXVlc3QocnEpOworCWlmIChlcnIgIT0gU0NTSV9ESF9PSykgewogCQllcnIgPSBtb2RlX3NlbGVjdF9oYW5kbGVfc2Vuc2Uoc2RldiwgaC0+c2Vuc2UpOworCQlpZiAoZXJyID09IFNDU0lfREhfUkVUUlkgJiYgcmV0cnlfY250LS0pCisJCQlnb3RvIHJldHJ5OworCX0KIAlpZiAoZXJyID09IFNDU0lfREhfT0spCiAJCWgtPnN0YXRlID0gUkRBQ19TVEFURV9BQ1RJVkU7CiAKLQlibGtfcHV0X3JlcXVlc3QocnEpOwogZG9uZToKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTk0LDYgKzYwMiw4IEBACiAJeyJTVU4iLCAiTENTTTEwMF9GIn0sCiAJeyJERUxMIiwgIk1EMzAwMCJ9LAogCXsiREVMTCIsICJNRDMwMDBpIn0sCisJeyJMU0kiLCAiSU5GLTAxLTAwIn0sCisJeyJFTkdFTklPIiwgIklORi0wMS0wMCJ9LAogCXtOVUxMLCBOVUxMfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhLmMgYi9kcml2ZXJzL3Njc2kvZWF0YS5jCmluZGV4IGE3M2E2YmIuLjk3NmNkZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lYXRhLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGEuYwpAQCAtMTYyNiw4ICsxNjI2LDE1IEBACiAKIAljcHAtPnNlbnNlX2xlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKIAotCWNvdW50ID0gc2NzaV9kbWFfbWFwKFNDcG50KTsKLQlCVUdfT04oY291bnQgPCAwKTsKKwlpZiAoIXNjc2lfc2dfY291bnQoU0NwbnQpKSB7CisJCWNwcC0+ZGF0YV9sZW4gPSAwOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSBwY2lfbWFwX3NnKGhhLT5wZGV2LCBzY3NpX3NnbGlzdChTQ3BudCksIHNjc2lfc2dfY291bnQoU0NwbnQpLAorCQkJICAgcGNpX2Rpcik7CisJQlVHX09OKCFjb3VudCk7CisKIAlzY3NpX2Zvcl9lYWNoX3NnKFNDcG50LCBzZywgY291bnQsIGspIHsKIAkJY3BwLT5zZ2xpc3Rba10uYWRkcmVzcyA9IEgyREVWKHNnX2RtYV9hZGRyZXNzKHNnKSk7CiAJCWNwcC0+c2dsaXN0W2tdLm51bV9ieXRlcyA9IEgyREVWKHNnX2RtYV9sZW4oc2cpKTsKQEAgLTE2NTUsNyArMTY2Miw5IEBACiAJCXBjaV91bm1hcF9zaW5nbGUoaGEtPnBkZXYsIERFVjJIKGNwcC0+c2Vuc2VfYWRkciksCiAJCQkJIERFVjJIKGNwcC0+c2Vuc2VfbGVuKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCXNjc2lfZG1hX3VubWFwKFNDcG50KTsKKwlpZiAoc2NzaV9zZ19jb3VudChTQ3BudCkpCisJCXBjaV91bm1hcF9zZyhoYS0+cGRldiwgc2NzaV9zZ2xpc3QoU0NwbnQpLCBzY3NpX3NnX2NvdW50KFNDcG50KSwKKwkJCSAgICAgcGNpX2Rpcik7CiAKIAlpZiAoIURFVjJIKGNwcC0+ZGF0YV9sZW4pKQogCQlwY2lfZGlyID0gUENJX0RNQV9CSURJUkVDVElPTkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMgYi9kcml2ZXJzL3Njc2kvZWF0YV9waW8uYwppbmRleCA5NTI1MDVjLi4xNTJkZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZWF0YV9waW8uYworKysgYi9kcml2ZXJzL3Njc2kvZWF0YV9waW8uYwpAQCAtMTQsOCArMTQsOCBAQAogICogICAgICAgICAgICAgbmV1ZmZlckBnb29meS56ZHYudW5pLW1haW56LmRlICAgICAgICAgICAgICAgKgogICogICAgICAgICAgICAgYS5hcm5vbGRAa2ZhLWp1ZWxpY2guZGUgICAgICAgICAgICAgICAgICAgICAgKiAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBVcGRhdGVkIDIwMDIgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gZm9yIExpbnV4ICAgICoKLSAqICAyLjUueCBhbmQgdGhlIG5ld2VyIGxvY2tpbmcgYW5kIGVycm9yIGhhbmRsaW5nICAgICAgICAgICoKKyAqICBVcGRhdGVkIDIwMDIgYnkgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4gZm9yICoKKyAqICAgTGludXggMi41LnggYW5kIHRoZSBuZXdlciBsb2NraW5nIGFuZCBlcnJvciBoYW5kbGluZyAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgICoKICAqICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgICAgICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmMKaW5kZXggNjJhNDYxOC4uYTY4MGUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmMKQEAgLTE0NTMsNyArMTQ1Myw3IEBACiAJCW9mZnNldCA9IDA7CiAKIAlpZiAob2Zmc2V0KSB7Ci0JCWludCByb3VuZGVkX3VwLCBvbmVfY2xvY2s7CisJCWludCBvbmVfY2xvY2s7CiAKIAkJaWYgKHBlcmlvZCA+IGVzcC0+bWF4X3BlcmlvZCkgewogCQkJcGVyaW9kID0gb2Zmc2V0ID0gMDsKQEAgLTE0NjMsOSArMTQ2Myw3IEBACiAJCQlnb3RvIGRvX3JlamVjdDsKIAogCQlvbmVfY2xvY2sgPSBlc3AtPmNjeWNsZSAvIDEwMDA7Ci0JCXJvdW5kZWRfdXAgPSAocGVyaW9kIDw8IDIpOwotCQlyb3VuZGVkX3VwID0gKHJvdW5kZWRfdXAgKyBvbmVfY2xvY2sgLSAxKSAvIG9uZV9jbG9jazsKLQkJc3RwID0gcm91bmRlZF91cDsKKwkJc3RwID0gRElWX1JPVU5EX1VQKHBlcmlvZCA8PCAyLCBvbmVfY2xvY2spOwogCQlpZiAoc3RwICYmIGVzcC0+cmV2ID49IEZBUzIzNikgewogCQkJaWYgKHN0cCA+PSA1MCkKIAkJCQlzdHAtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2Zjb2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4ZGEwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIyAkSWQ6IE1ha2VmaWxlCisKK29iai0kKENPTkZJR19GQ09FKSArPSBmY29lLm8KKworZmNvZS15IDo9IFwKKwlsaWJmY29lLm8gXAorCWZjb2Vfc3cubyBcCisJZmNfdHJhbnNwb3J0X2Zjb2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNfdHJhbnNwb3J0X2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2ZjX3RyYW5zcG9ydF9mY29lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3ZmU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2ZjX3RyYW5zcG9ydF9mY29lLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNjc2kvbGliZmNvZS5oPgorI2luY2x1ZGUgPHNjc2kvZmNfdHJhbnNwb3J0X2Zjb2UuaD4KKworLyogaW50ZXJuYWwgZmNvZSB0cmFuc3BvcnQgKi8KK3N0cnVjdCBmY29lX3RyYW5zcG9ydF9pbnRlcm5hbCB7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyogZmNvZSB0cmFuc3BvcnRzIGxpc3QgYW5kIGl0cyBsb2NrICovCitzdGF0aWMgTElTVF9IRUFEKGZjb2VfdHJhbnNwb3J0cyk7CitzdGF0aWMgREVGSU5FX01VVEVYKGZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKworLyoqCisgKiBmY29lX3RyYW5zcG9ydF9kZWZhdWx0IC0gcmV0dXJucyBwdHIgdG8gdGhlIGRlZmF1bHQgdHJhbnNwb3J0IGZjb2Vfc3cKKyAqKi8KK3N0cnVjdCBmY29lX3RyYW5zcG9ydCAqZmNvZV90cmFuc3BvcnRfZGVmYXVsdCh2b2lkKQoreworCXJldHVybiAmZmNvZV9zd190cmFuc3BvcnQ7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfdG9fcGNpZGV2IC0gZ2V0IHRoZSBwY2kgZGV2IGZyb20gYSBuZXRkZXYKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdGhhdCBwY2kgZGV2IHdpbGwgYmUgcmV0cml2ZWQgZnJvbQorICoKKyAqIFJldHVybnM6IE5VTEwgb3IgdGhlIGNvcnJzcG9uZGluZyBwY2lfZGV2CisgKiovCitzdHJ1Y3QgcGNpX2RldiAqZmNvZV90cmFuc3BvcnRfcGNpZGV2KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaWYgKCFuZXRkZXYtPmRldi5wYXJlbnQpCisJCXJldHVybiBOVUxMOworCXJldHVybiB0b19wY2lfZGV2KG5ldGRldi0+ZGV2LnBhcmVudCk7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfZGV2aWNlX2xvb2t1cCAtIGZpbmQgb3V0IG5ldGRldiBpcyBtYW5hZ2VkIGJ5IHRoZQorICogdHJhbnNwb3J0CisgKiBhc3NpZ24gYSB0cmFuc3BvcnQgdG8gYSBkZXZpY2UKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdGhlIHRyYW5zcG9ydCB0byBiZSBhdHRhY2hlZCB0bworICoKKyAqIFRoaXMgd2lsbCBsb29rIGZvciBleGlzdGluZyBvZmZsb2FkIGRyaXZlciwgaWYgbm90IGZvdW5kLCBpdCBmYWxscyBiYWNrIHRvCisgKiB0aGUgZGVmYXVsdCBzdyBoYmEgKGZjb2Vfc3cpIGFzIGl0cyBmY29lIHRyYW5zcG9ydC4KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgc3RydWN0IGZjb2VfdHJhbnNwb3J0X2ludGVybmFsICpmY29lX3RyYW5zcG9ydF9kZXZpY2VfbG9va3VwKAorCXN0cnVjdCBmY29lX3RyYW5zcG9ydCAqdCwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZmNvZV90cmFuc3BvcnRfaW50ZXJuYWwgKnRpOworCisJLyogYXNzaWduIHRoZSB0cmFuc3BvciB0byB0aGlzIGRldmljZSAqLworCW11dGV4X2xvY2soJnQtPmRldmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGksICZ0LT5kZXZsaXN0LCBsaXN0KSB7CisJCWlmICh0aS0+bmV0ZGV2ID09IG5ldGRldikgeworCQkJbXV0ZXhfdW5sb2NrKCZ0LT5kZXZsb2NrKTsKKwkJCXJldHVybiB0aTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnQtPmRldmxvY2spOworCXJldHVybiBOVUxMOworfQorLyoqCisgKiBmY29lX3RyYW5zcG9ydF9kZXZpY2VfYWRkIC0gYXNzaWduIGEgdHJhbnNwb3J0IHRvIGEgZGV2aWNlCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRoZSB0cmFuc3BvcnQgdG8gYmUgYXR0YWNoZWQgdG8KKyAqCisgKiBUaGlzIHdpbGwgbG9vayBmb3IgZXhpc3Rpbmcgb2ZmbG9hZCBkcml2ZXIsIGlmIG5vdCBmb3VuZCwgaXQgZmFsbHMgYmFjayB0bworICogdGhlIGRlZmF1bHQgc3cgaGJhIChmY29lX3N3KSBhcyBpdHMgZmNvZSB0cmFuc3BvcnQuCisgKgorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICoqLworc3RhdGljIGludCBmY29lX3RyYW5zcG9ydF9kZXZpY2VfYWRkKHN0cnVjdCBmY29lX3RyYW5zcG9ydCAqdCwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0X2ludGVybmFsICp0aTsKKworCXRpID0gZmNvZV90cmFuc3BvcnRfZGV2aWNlX2xvb2t1cCh0LCBuZXRkZXYpOworCWlmICh0aSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfZGV2aWNlX2FkZDoiCisJCSAgICAgICAiZGV2aWNlICVzIGlzIGFscmVhZHkgYWRkZWQgdG8gdHJhbnNwb3J0ICVzXG4iLAorCQkgICAgICAgbmV0ZGV2LT5uYW1lLCB0LT5uYW1lKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCS8qIGFsbG9jYXRlIGFuIGludGVybmFsIHN0cnVjdCB0byBob3N0IHRoZSBuZXRkZXYgYW5kIHRoZSBsaXN0ICovCisJdGkgPSBremFsbG9jKHNpemVvZigqdGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRpLT50ID0gdDsKKwl0aS0+bmV0ZGV2ID0gbmV0ZGV2OworCUlOSVRfTElTVF9IRUFEKCZ0aS0+bGlzdCk7CisJZGV2X2hvbGQodGktPm5ldGRldik7CisKKwltdXRleF9sb2NrKCZ0LT5kZXZsb2NrKTsKKwlsaXN0X2FkZCgmdGktPmxpc3QsICZ0LT5kZXZsaXN0KTsKKwltdXRleF91bmxvY2soJnQtPmRldmxvY2spOworCisJcHJpbnRrKEtFUk5fREVCVUcgImZjb2VfdHJhbnNwb3J0X2RldmljZV9hZGQ6IgorCQkgICAgICAgImRldmljZSAlcyBhZGRlZCB0byB0cmFuc3BvcnQgJXNcbiIsCisJCSAgICAgICBuZXRkZXYtPm5hbWUsIHQtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfZGV2aWNlX3JlbW92ZSAtIHJlbW92ZSBhIGRldmljZSBmcm9tIGl0cyB0cmFuc3BvcnQKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdGhlIHRyYW5zcG9ydCB0byBiZSBhdHRhY2hlZCB0bworICoKKyAqIHRoaXMgcmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gdGhlIHRyYW5zcG9ydCBzbyB0aGUgZ2l2ZW4gdHJhbnNwb3J0IHdpbGwKKyAqIG5vdCBtYW5hZ2UgdGhpcyBkZXZpY2UgYW55IG1vcmUKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGZjb2VfdHJhbnNwb3J0X2RldmljZV9yZW1vdmUoc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBmY29lX3RyYW5zcG9ydF9pbnRlcm5hbCAqdGk7CisKKwl0aSA9IGZjb2VfdHJhbnNwb3J0X2RldmljZV9sb29rdXAodCwgbmV0ZGV2KTsKKwlpZiAoIXRpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3RyYW5zcG9ydF9kZXZpY2VfcmVtb3ZlOiIKKwkJICAgICAgICJkZXZpY2UgJXMgaXMgbm90IG1hbmFnZWQgYnkgdHJhbnNwb3J0ICVzXG4iLAorCQkgICAgICAgbmV0ZGV2LT5uYW1lLCB0LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW11dGV4X2xvY2soJnQtPmRldmxvY2spOworCWxpc3RfZGVsKCZ0aS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ0LT5kZXZsb2NrKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfZGV2aWNlX3JlbW92ZToiCisJICAgICAgICJkZXZpY2UgJXMgcmVtb3ZlZCBmcm9tIHRyYW5zcG9ydCAlc1xuIiwKKwkgICAgICAgbmV0ZGV2LT5uYW1lLCB0LT5uYW1lKTsKKwlkZXZfcHV0KHRpLT5uZXRkZXYpOworCWtmcmVlKHRpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY29lX3RyYW5zcG9ydF9kZXZpY2VfcmVtb3ZlX2FsbCAtIHJlbW92ZSBhbGwgZnJvbSB0cmFuc3BvcnQgZGV2bGlzdAorICoKKyAqIHRoaXMgcmVtb3ZlcyB0aGUgZGV2aWNlIGZyb20gdGhlIHRyYW5zcG9ydCBzbyB0aGUgZ2l2ZW4gdHJhbnNwb3J0IHdpbGwKKyAqIG5vdCBtYW5hZ2UgdGhpcyBkZXZpY2UgYW55IG1vcmUKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgdm9pZCBmY29lX3RyYW5zcG9ydF9kZXZpY2VfcmVtb3ZlX2FsbChzdHJ1Y3QgZmNvZV90cmFuc3BvcnQgKnQpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0X2ludGVybmFsICp0aSwgKnRtcDsKKworCW11dGV4X2xvY2soJnQtPmRldmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aSwgdG1wLCAmdC0+ZGV2bGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdGktPmxpc3QpOworCQlrZnJlZSh0aSk7CisJfQorCW11dGV4X3VubG9jaygmdC0+ZGV2bG9jayk7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfbWF0Y2ggLSB1c2UgdGhlIGJ1cyBkZXZpY2UgbWF0Y2ggZnVuY3Rpb24gdG8gbWF0Y2ggdGhlIGh3CisgKiBAdDogdGhlIGZjb2UgdHJhbnNwb3J0CisgKiBAbmV0ZGV2OgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgZ2l2bmUgdHJhbnNwb3J0IHdhbnRzIHRvIG1hbmFnZSB0aGUKKyAqIGlucHV0IG5ldGRldi4gaWYgdGhlIHRyYW5zcG9ydHMgaW1wbGVtZW50cyB0aGUgbWF0Y2ggZnVuY3Rpb24sIGl0IHdpbGwgYmUKKyAqIGNhbGxlZCwgby53LiB3ZSBqdXN0IGNvbXBhcmUgdGhlIHBjaSB2ZW5kb3IgYW5kIGRldmljZSBpZC4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGZvciBtYXRjaCB1cAorICoqLworc3RhdGljIGJvb2wgZmNvZV90cmFuc3BvcnRfbWF0Y2goc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJLyogbWF0Y2ggdHJhbnNwb3J0IGJ5IHZlbmRvciBhbmQgZGV2aWNlIGlkICovCisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKworCXBjaSA9IGZjb2VfdHJhbnNwb3J0X3BjaWRldihuZXRkZXYpOworCisJaWYgKHBjaSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfbWF0Y2g6IgorCQkgICAgICAgIiVzOiV4OiV4IC0tICVzOiV4OiV4XG4iLAorCQkgICAgICAgdC0+bmFtZSwgdC0+dmVuZG9yLCB0LT5kZXZpY2UsCisJCSAgICAgICBuZXRkZXYtPm5hbWUsIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSk7CisKKwkJLyogaWYgdHJhbnNwb3J0IHN1cHBvcnRzIG1hdGNoICovCisJCWlmICh0LT5tYXRjaCkKKwkJCXJldHVybiB0LT5tYXRjaChuZXRkZXYpOworCisJCS8qIGVsc2UganVzdCBjb21wYXJlIHRoZSB2ZW5kb3IgYW5kIGRldmljZSBpZDogcGNpIG9ubHkgKi8KKwkJcmV0dXJuICh0LT52ZW5kb3IgPT0gcGNpLT52ZW5kb3IpICYmICh0LT5kZXZpY2UgPT0gcGNpLT5kZXZpY2UpOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfbG9va3VwIC0gY2hlY2sgaWYgdGhlIHRyYW5zcG9ydCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAqIEB0OiB0aGUgdHJhbnNwb3J0IHRvIGJlIGxvb2tlZCB1cAorICoKKyAqIFRoaXMgY29tcGFyZXMgdGhlIHBhcmVudCBkZXZpY2UgKHBjaSkgdmVuZG9yIGFuZCBkZXZpY2UgaWQKKyAqCisgKiBSZXR1cm5zOiBOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRPRE8gLSByZXR1cm4gZGVmYXVsdCBzdyB0cmFuc3BvcnQgaWYgbm8gb3RoZXIgdHJhbnNwb3J0IGlzIGZvdW5kCisgKiovCitzdGF0aWMgc3RydWN0IGZjb2VfdHJhbnNwb3J0ICpmY29lX3RyYW5zcG9ydF9sb29rdXAoCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZmNvZV90cmFuc3BvcnQgKnQ7CisKKwltdXRleF9sb2NrKCZmY29lX3RyYW5zcG9ydHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmZmNvZV90cmFuc3BvcnRzLCBsaXN0KSB7CisJCWlmIChmY29lX3RyYW5zcG9ydF9tYXRjaCh0LCBuZXRkZXYpKSB7CisJCQltdXRleF91bmxvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwkJCXJldHVybiB0OworCQl9CisJfQorCW11dGV4X3VubG9jaygmZmNvZV90cmFuc3BvcnRzX2xvY2spOworCisJcHJpbnRrKEtFUk5fREVCVUcgImZjb2VfdHJhbnNwb3J0X2xvb2t1cDoiCisJICAgICAgICJ1c2UgZGVmYXVsdCB0cmFuc3BvcnQgZm9yICVzXG4iLCBuZXRkZXYtPm5hbWUpOworCXJldHVybiBmY29lX3RyYW5zcG9ydF9kZWZhdWx0KCk7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfcmVnaXN0ZXIgLSBhZGRzIGEgZmNvZSB0cmFuc3BvcnQgdG8gdGhlIGZjb2UgdHJhbnNwb3J0cyBsaXN0CisgKiBAdDogcHRyIHRvIHRoZSBmY29lIHRyYW5zcG9ydCB0byBiZSBhZGRlZAorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqKi8KK2ludCBmY29lX3RyYW5zcG9ydF9yZWdpc3RlcihzdHJ1Y3QgZmNvZV90cmFuc3BvcnQgKnQpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0dDsKKworCS8qIFRPRE8gLSBhZGQgZmNvZV90cmFuc3BvcnQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gaGVyZSAqLworCW11dGV4X2xvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR0LCAmZmNvZV90cmFuc3BvcnRzLCBsaXN0KSB7CisJCWlmICh0dCA9PSB0KSB7CisJCQltdXRleF91bmxvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCWxpc3RfYWRkX3RhaWwoJnQtPmxpc3QsICZmY29lX3RyYW5zcG9ydHMpOworCW11dGV4X3VubG9jaygmZmNvZV90cmFuc3BvcnRzX2xvY2spOworCisJbXV0ZXhfaW5pdCgmdC0+ZGV2bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnQtPmRldmxpc3QpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImZjb2VfdHJhbnNwb3J0X3JlZ2lzdGVyOiVzXG4iLCB0LT5uYW1lKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV90cmFuc3BvcnRfcmVnaXN0ZXIpOworCisvKioKKyAqIGZjb2VfdHJhbnNwb3J0X3VucmVnaXN0ZXIgLSByZW1vdmUgdGhlIHRyYW5wb3J0IGZybyB0aGUgZmNvZSB0cmFuc3BvcnRzIGxpc3QKKyAqIEB0OiBwdHIgdG8gdGhlIGZjb2UgdHJhbnNwb3J0IHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitpbnQgZmNvZV90cmFuc3BvcnRfdW5yZWdpc3RlcihzdHJ1Y3QgZmNvZV90cmFuc3BvcnQgKnQpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0dCwgKnRtcDsKKworCW11dGV4X2xvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHQsIHRtcCwgJmZjb2VfdHJhbnNwb3J0cywgbGlzdCkgeworCQlpZiAodHQgPT0gdCkgeworCQkJbGlzdF9kZWwoJnQtPmxpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZmY29lX3RyYW5zcG9ydHNfbG9jayk7CisJCQlmY29lX3RyYW5zcG9ydF9kZXZpY2VfcmVtb3ZlX2FsbCh0KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3RyYW5zcG9ydF91bnJlZ2lzdGVyOiVzXG4iLAorCQkJICAgICAgIHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZmY29lX3RyYW5zcG9ydHNfbG9jayk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX3RyYW5zcG9ydF91bnJlZ2lzdGVyKTsKKworLyoKKyAqIGZjb2VfbG9hZF90cmFuc3BvcnRfZHJpdmVyIC0gbG9hZCBhbiBvZmZsb2FkIGRyaXZlciBieSBhbGlhcyBuYW1lCisgKiBAbmV0ZGV2OiB0aGUgdGFyZ2V0IG5ldCBkZXZpY2UKKyAqCisgKiBSZXF1ZXN0cyBmb3IgYW4gb2ZmbG9hZCBkcml2ZXIgbW9kdWxlIGFzIHRoZSBmY29lIHRyYW5zcG9ydCwgaWYgZmFpbHMsIGl0CisgKiBmYWxscyBiYWNrIHRvIHVzZSB0aGUgU1cgSEJBIChmY29lX3N3KSBhcyBpdHMgdHJhbnNwb3J0CisgKgorICogVE9ETyAtCisgKiAJMS4gc3VwcG9ydHMgb25seSBQQ0kgZGV2aWNlCisgKiAJMi4gbmVlZHMgZml4IGZvciBWTEFuIGFuZCBib25kaW5nCisgKiAJMy4gcHVyZSBodyBmY29lIGhiYSBtYXkgbm90IGhhdmUgbmV0ZGV2CisgKgorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICoqLworaW50IGZjb2VfbG9hZF90cmFuc3BvcnRfZHJpdmVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZXRkZXYtPmRldi5wYXJlbnQ7CisKKwlpZiAoZmNvZV90cmFuc3BvcnRfbG9va3VwKG5ldGRldikpIHsKKwkJLyogbG9hZCBkZWZhdWx0IHRyYW5zcG9ydCAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZTogYWxyZWFkeSBsb2FkZWQgdHJhbnNwb3J0IGZvciAlc1xuIiwKKwkJICAgICAgIG5ldGRldi0+bmFtZSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCXBjaSA9IHRvX3BjaV9kZXYoZGV2KTsKKwlpZiAoZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZTogc3VwcG9ydCBub2x5IFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImZjb2U6IGxvYWRpbmcgZHJpdmVyIGZjb2UtcGNpLTB4JTA0eC0weCUwNHhcbiIsCisJICAgICAgIHBjaS0+dmVuZG9yLCBwY2ktPmRldmljZSk7CisKKwlyZXR1cm4gcmVxdWVzdF9tb2R1bGUoImZjb2UtcGNpLTB4JTA0eC0weCUwNHgiLAorCQkJICAgICAgcGNpLT52ZW5kb3IsIHBjaS0+ZGV2aWNlKTsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9sb2FkX3RyYW5zcG9ydF9kcml2ZXIpOworCisvKioKKyAqIGZjb2VfdHJhbnNwb3J0X2F0dGFjaCAtIGxvYWQgdHJhbnNwb3J0IHRvIGZjb2UKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdGhlIHRyYW5zcG9ydCB0byBiZSBhdHRhY2hlZCB0bworICoKKyAqIFRoaXMgd2lsbCBsb29rIGZvciBleGlzdGluZyBvZmZsb2FkIGRyaXZlciwgaWYgbm90IGZvdW5kLCBpdCBmYWxscyBiYWNrIHRvCisgKiB0aGUgZGVmYXVsdCBzdyBoYmEgKGZjb2Vfc3cpIGFzIGl0cyBmY29lIHRyYW5zcG9ydC4KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitpbnQgZmNvZV90cmFuc3BvcnRfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0OworCisJLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyB0cmFuc3BvcnQgKi8KKwl0ID0gZmNvZV90cmFuc3BvcnRfbG9va3VwKG5ldGRldik7CisJaWYgKCF0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3RyYW5zcG9ydF9hdHRhY2giCisJCSAgICAgICAiOm5vIHRyYW5zcG9ydCBmb3IgJXM6dXNlICVzXG4iLAorCQkgICAgICAgbmV0ZGV2LT5uYW1lLCB0LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGFkZCB0byB0aGUgdHJhbnNwb3J0ICovCisJaWYgKGZjb2VfdHJhbnNwb3J0X2RldmljZV9hZGQodCwgbmV0ZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfYXR0YWNoIgorCQkgICAgICAgIjpmYWlsZWQgdG8gYWRkICVzIHRvIHRyYW1zcG9ydCAlc1xuIiwKKwkJICAgICAgIG5ldGRldi0+bmFtZSwgdC0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiB0cmFuc3BvcnQgY3JlYXRlIGZ1bmN0aW9uICovCisJaWYgKHQtPmNyZWF0ZSkKKwkJdC0+Y3JlYXRlKG5ldGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfYXR0YWNoOnRyYW5zcG9ydCAlcyBmb3IgJXNcbiIsCisJICAgICAgIHQtPm5hbWUsIG5ldGRldi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX3RyYW5zcG9ydF9hdHRhY2gpOworCisvKioKKyAqIGZjb2VfdHJhbnNwb3J0X3JlbGVhc2UgLSB1bmxvYWQgdHJhbnNwb3J0IGZyb20gZmNvZQorICogQG5ldGRldjogdGhlIG5ldCBkZXZpY2Ugb24gd2hpY2ggZmNvZSBpcyB0byBiZSByZWxlYXNlZAorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqKi8KK2ludCBmY29lX3RyYW5zcG9ydF9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0OworCisJLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyB0cmFuc3BvcnQgKi8KKwl0ID0gZmNvZV90cmFuc3BvcnRfbG9va3VwKG5ldGRldik7CisJaWYgKCF0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3RyYW5zcG9ydF9yZWxlYXNlOiIKKwkJICAgICAgICJubyB0cmFuc3BvcnQgZm9yICVzOnVzZSAlc1xuIiwKKwkJICAgICAgIG5ldGRldi0+bmFtZSwgdC0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSB0cmFuc3BvcnQgKi8KKwlpZiAoZmNvZV90cmFuc3BvcnRfZGV2aWNlX3JlbW92ZSh0LCBuZXRkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3RyYW5zcG9ydF9yZWxlYXNlOiIKKwkJICAgICAgICJmYWlsZWQgdG8gYWRkICVzIHRvIHRyYW1zcG9ydCAlc1xuIiwKKwkJICAgICAgIG5ldGRldi0+bmFtZSwgdC0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiB0cmFuc3BvcnQgZGVzdHJveSBmdW5jdGlvbiAqLworCWlmICh0LT5kZXN0cm95KQorCQl0LT5kZXN0cm95KG5ldGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZmNvZV90cmFuc3BvcnRfcmVsZWFzZToiCisJICAgICAgICJkZXZpY2UgJXMgZGV0dGFjaGVkIGZyb20gdHJhbnNwb3J0ICVzXG4iLAorCSAgICAgICBuZXRkZXYtPm5hbWUsIHQtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX3RyYW5zcG9ydF9yZWxlYXNlKTsKKworLyoqCisgKiBmY29lX3RyYW5zcG9ydF9pbml0IC0gaW5pdGlhbGl6ZXMgZmNvZSB0cmFuc3BvcnQgbGF5ZXIKKyAqCisgKiBUaGlzIHByZXBhcmVzIGZvciB0aGUgZmNvZSB0cmFuc3BvcnQgbGF5ZXIKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKiovCitpbnQgX19pbml0IGZjb2VfdHJhbnNwb3J0X2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmZmNvZV90cmFuc3BvcnRzKTsKKwltdXRleF9pbml0KCZmY29lX3RyYW5zcG9ydHNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNvZV90cmFuc3BvcnRfZXhpdCAtIGNsZWFucyB1cCB0aGUgZmNvZSB0cmFuc3BvcnQgbGF5ZXIKKyAqIFRoaXMgY2xlYW5zIHVwIHRoZSBmY29lIHRyYW5zcG9ydCBsYXllci4gcmVtb3ZpbmcgYW55IHRyYW5zcG9ydCBvbiB0aGUgbGlzdCwKKyAqIG5vdGUgdGhhdCB0aGUgdHJhbnNwb3J0IGRlc3Ryb3kgZnVuYyBpcyBub3QgY2FsbGVkIGhlcmUuCisgKgorICogUmV0dXJuczogbm9uZQorICoqLworaW50IF9fZXhpdCBmY29lX3RyYW5zcG9ydF9leGl0KHZvaWQpCit7CisJc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0LCAqdG1wOworCisJbXV0ZXhfbG9jaygmZmNvZV90cmFuc3BvcnRzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0LCB0bXAsICZmY29lX3RyYW5zcG9ydHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnQtPmxpc3QpOworCQltdXRleF91bmxvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwkJZmNvZV90cmFuc3BvcnRfZGV2aWNlX3JlbW92ZV9hbGwodCk7CisJCW11dGV4X2xvY2soJmZjb2VfdHJhbnNwb3J0c19sb2NrKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZmY29lX3RyYW5zcG9ydHNfbG9jayk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3N3LmMgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3N3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0Y2Q1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2Vfc3cuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYXQgd3d3Lk9wZW4tRkNvRS5vcmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KKworI2luY2x1ZGUgPHNjc2kvZmMvZmNfZWxzLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19lbmNhcHMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKworI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjb2UuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjX3RyYW5zcG9ydF9mY29lLmg+CisKKyNkZWZpbmUgRkNPRV9TV19WRVJTSU9OCSIwLjEiCisjZGVmaW5lCUZDT0VfU1dfTkFNRQkiZmNvZXN3IgorI2RlZmluZQlGQ09FX1NXX1ZFTkRPUgkiT3Blbi1GQ29FLm9yZyIKKworI2RlZmluZSBGQ09FX01BWF9MVU4JCTI1NQorI2RlZmluZSBGQ09FX01BWF9GQ1BfVEFSR0VUCTI1NgorCisjZGVmaW5lIEZDT0VfTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTCTEwMjQKKworI2RlZmluZSBGQ09FX01JTl9YSUQJCTB4MDAwMQkvKiB0aGUgbWluIHhpZCBzdXBwb3J0ZWQgYnkgZmNvZV9zdyAqLworI2RlZmluZSBGQ09FX01BWF9YSUQJCTB4MDdlZgkvKiB0aGUgbWF4IHhpZCBzdXBwb3J0ZWQgYnkgZmNvZV9zdyAqLworCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpzY3NpX3RyYW5zcG9ydF9mY29lX3N3OworCitzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgZmNvZV9zd190cmFuc3BvcnRfZnVuY3Rpb24gPSB7CisJLnNob3dfaG9zdF9ub2RlX25hbWUgPSAxLAorCS5zaG93X2hvc3RfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9mYzRzID0gMSwKKwkuc2hvd19ob3N0X2FjdGl2ZV9mYzRzID0gMSwKKwkuc2hvd19ob3N0X21heGZyYW1lX3NpemUgPSAxLAorCisJLnNob3dfaG9zdF9wb3J0X2lkID0gMSwKKwkuc2hvd19ob3N0X3N1cHBvcnRlZF9zcGVlZHMgPSAxLAorCS5nZXRfaG9zdF9zcGVlZCA9IGZjX2dldF9ob3N0X3NwZWVkLAorCS5zaG93X2hvc3Rfc3BlZWQgPSAxLAorCS5zaG93X2hvc3RfcG9ydF90eXBlID0gMSwKKwkuZ2V0X2hvc3RfcG9ydF9zdGF0ZSA9IGZjX2dldF9ob3N0X3BvcnRfc3RhdGUsCisJLnNob3dfaG9zdF9wb3J0X3N0YXRlID0gMSwKKwkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAorCisJLmRkX2ZjcnBvcnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiksCisJLnNob3dfcnBvcnRfbWF4ZnJhbWVfc2l6ZSA9IDEsCisJLnNob3dfcnBvcnRfc3VwcG9ydGVkX2NsYXNzZXMgPSAxLAorCisJLnNob3dfaG9zdF9mYWJyaWNfbmFtZSA9IDEsCisJLnNob3dfc3RhcmdldF9ub2RlX25hbWUgPSAxLAorCS5zaG93X3N0YXJnZXRfcG9ydF9uYW1lID0gMSwKKwkuc2hvd19zdGFyZ2V0X3BvcnRfaWQgPSAxLAorCS5zZXRfcnBvcnRfZGV2X2xvc3NfdG1vID0gZmNfc2V0X3Jwb3J0X2xvc3NfdG1vLAorCS5zaG93X3Jwb3J0X2Rldl9sb3NzX3RtbyA9IDEsCisJLmdldF9mY19ob3N0X3N0YXRzID0gZmNfZ2V0X2hvc3Rfc3RhdHMsCisJLmlzc3VlX2ZjX2hvc3RfbGlwID0gZmNvZV9yZXNldCwKKworCS50ZXJtaW5hdGVfcnBvcnRfaW8gPSBmY19ycG9ydF90ZXJtaW5hdGVfaW8sCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBmY29lX3N3X3Nob3N0X3RlbXBsYXRlID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJGQ29FIERyaXZlciIsCisJLnByb2NfbmFtZSA9IEZDT0VfU1dfTkFNRSwKKwkucXVldWVjb21tYW5kID0gZmNfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gZmNfZWhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gZmNfZWhfZGV2aWNlX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSBmY19laF9ob3N0X3Jlc2V0LAorCS5zbGF2ZV9hbGxvYyA9IGZjX3NsYXZlX2FsbG9jLAorCS5jaGFuZ2VfcXVldWVfZGVwdGggPSBmY19jaGFuZ2VfcXVldWVfZGVwdGgsCisJLmNoYW5nZV9xdWV1ZV90eXBlID0gZmNfY2hhbmdlX3F1ZXVlX3R5cGUsCisJLnRoaXNfaWQgPSAtMSwKKwkuY21kX3Blcl9sdW4gPSAzMiwKKwkuY2FuX3F1ZXVlID0gRkNPRV9NQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMsCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNnX3RhYmxlc2l6ZSA9IFNHX0FMTCwKKwkubWF4X3NlY3RvcnMgPSAweGZmZmYsCit9OworCisvKgorICogZmNvZV9zd19scG9ydF9jb25maWcgLSBzZXRzIHVwIHRoZSBmY19scG9ydAorICogQGxwOiBwdHIgdG8gdGhlIGZjX2xwb3J0CisgKiBAc2hvc3Q6IHB0ciB0byB0aGUgcGFyZW50IHNjc2kgaG9zdAorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqCisgKi8KK3N0YXRpYyBpbnQgZmNvZV9zd19scG9ydF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlpbnQgaSA9IDA7CisKKwlscC0+bGlua19zdGF0dXMgPSAwOworCWxwLT5tYXhfcmV0cnlfY291bnQgPSAzOworCWxwLT5lX2RfdG92ID0gMiAqIDEwMDA7CS8qIEZDLUZTIGRlZmF1bHQgKi8KKwlscC0+cl9hX3RvdiA9IDIgKiAyICogMTAwMDsKKwlscC0+c2VydmljZV9wYXJhbXMgPSAoRkNQX1NQUEZfSU5JVF9GQ04gfCBGQ1BfU1BQRl9SRF9YUkRZX0RJUyB8CisJCQkgICAgICBGQ1BfU1BQRl9SRVRSWSB8IEZDUF9TUFBGX0NPTkZfQ09NUEwpOworCisJLyoKKwkgKiBhbGxvY2F0ZSBwZXIgY3B1IHN0YXRzIGJsb2NrCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShpKQorCQlscC0+ZGV2X3N0YXRzW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZjb2VfZGV2X3N0YXRzKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisKKwkvKiBscG9ydCBmY19scG9ydCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gKi8KKwlmY19scG9ydF9jb25maWcobHApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmY29lX3N3X25ldGRldl9jb25maWcgLSBzZXRzIHVwIGZjb2Vfc29mdGMgZm9yIGxwb3J0IGFuZCBuZXR3b3JrCisgKiByZWxhdGVkIHByb3BlcnRpZXMKKyAqIEBscCA6IHB0ciB0byB0aGUgZmNfbHBvcnQKKyAqIEBuZXRkZXYgOiBwdHIgdG8gdGhlIGFzc29jaWF0ZWQgbmV0ZGV2aWNlIHN0cnVjdAorICoKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGZjb2Vfc3dfbHBvcnRfY29uZmlnKCkgYXMgaXQgd2lsbCB1c2UgbHBvcnQgbXV0ZXgKKyAqCisgKiBSZXR1cm5zIDogMCBmb3Igc3VjY2VzcworICoKKyAqLworc3RhdGljIGludCBmY29lX3N3X25ldGRldl9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwl1MzIgbWZzOworCXU2NCB3d25uLCB3d3BuOworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKwl1OCBmbG9naV9tYWRkcltFVEhfQUxFTl07CisKKwkvKiBTZXR1cCBscG9ydCBwcml2YXRlIGRhdGEgdG8gcG9pbnQgdG8gZmNvZSBzb2Z0YyAqLworCWZjID0gbHBvcnRfcHJpdihscCk7CisJZmMtPmxwID0gbHA7CisJZmMtPnJlYWxfZGV2ID0gbmV0ZGV2OworCWZjLT5waHlzX2RldiA9IG5ldGRldjsKKworCS8qIFJlcXVpcmUgc3VwcG9ydCBmb3IgZ2V0X3BhdXNlcGFyYW0gZXRodG9vbCBvcC4gKi8KKwlpZiAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQorCQlmYy0+cGh5c19kZXYgPSB2bGFuX2Rldl9yZWFsX2RldihuZXRkZXYpOworCisJLyogRG8gbm90IHN1cHBvcnQgZm9yIGJvbmRpbmcgZGV2aWNlICovCisJaWYgKChmYy0+cmVhbF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfTUFTVEVSX0FMQikgfHwKKwkgICAgKGZjLT5yZWFsX2Rldi0+cHJpdl9mbGFncyAmIElGRl9TTEFWRV9JTkFDVElWRSkgfHwKKwkgICAgKGZjLT5yZWFsX2Rldi0+cHJpdl9mbGFncyAmIElGRl9NQVNURVJfODAyM0FEKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgbWF4IGZyYW1lIHNpemUgYmFzZWQgb24gdW5kZXJseWluZyBkZXZpY2UgYW5kIG9wdGlvbmFsCisJICogdXNlci1jb25maWd1cmVkIGxpbWl0LiAgSWYgdGhlIE1GUyBpcyB0b28gbG93LCBmY29lX2xpbmtfb2soKQorCSAqIHdpbGwgcmV0dXJuIDAsIHNvIGRvIHRoaXMgZmlyc3QuCisJICovCisJbWZzID0gZmMtPnJlYWxfZGV2LT5tdHUgLSAoc2l6ZW9mKHN0cnVjdCBmY29lX2hkcikgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmNvZV9jcmNfZW9mKSk7CisJaWYgKGZjX3NldF9tZnMobHAsIG1mcykpCisJCXJldHVybiAtRUlOVkFMOworCisJbHAtPmxpbmtfc3RhdHVzID0gfkZDX1BBVVNFICYgfkZDX0xJTktfVVA7CisJaWYgKCFmY29lX2xpbmtfb2sobHApKQorCQlscC0+bGlua19zdGF0dXMgfD0gRkNfTElOS19VUDsKKworCS8qIG9mZmxvYWQgZmVhdHVyZXMgc3VwcG9ydCAqLworCWlmIChmYy0+cmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TRykKKwkJbHAtPnNnX3N1cHAgPSAxOworCisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlKTsKKworCS8qIHNldHVwIFNvdXJjZSBNYWMgQWRkcmVzcyAqLworCW1lbWNweShmYy0+Y3RsX3NyY19hZGRyLCBmYy0+cmVhbF9kZXYtPmRldl9hZGRyLAorCSAgICAgICBmYy0+cmVhbF9kZXYtPmFkZHJfbGVuKTsKKworCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhmYy0+cmVhbF9kZXYtPmRldl9hZGRyLCAxLCAwKTsKKwlmY19zZXRfd3dubihscCwgd3dubik7CisJLyogWFhYIC0gM3JkIGFyZyBuZWVkcyB0byBiZSB2bGFuIGlkICovCisJd3dwbiA9IGZjb2Vfd3duX2Zyb21fbWFjKGZjLT5yZWFsX2Rldi0+ZGV2X2FkZHIsIDIsIDApOworCWZjX3NldF93d3BuKGxwLCB3d3BuKTsKKworCS8qCisJICogQWRkIEZDb0UgTUFDIGFkZHJlc3MgYXMgc2Vjb25kIHVuaWNhc3QgTUFDIGFkZHJlc3MKKwkgKiBvciBlbnRlciBwcm9taXNjdW91cyBtb2RlIGlmIG5vdCBjYXBhYmxlIG9mIGxpc3RlbmluZworCSAqIGZvciBtdWx0aXBsZSB1bmljYXN0IE1BQ3MuCisJICovCisJcnRubF9sb2NrKCk7CisJbWVtY3B5KGZsb2dpX21hZGRyLCAodThbNl0pIEZDX0ZDT0VfRkxPR0lfTUFDLCBFVEhfQUxFTik7CisJZGV2X3VuaWNhc3RfYWRkKGZjLT5yZWFsX2RldiwgZmxvZ2lfbWFkZHIsIEVUSF9BTEVOKTsKKwlydG5sX3VubG9jaygpOworCisJLyoKKwkgKiBzZXR1cCB0aGUgcmVjZWl2ZSBmdW5jdGlvbiBmcm9tIGV0aGVybmV0IGRyaXZlcgorCSAqIG9uIHRoZSBldGhlcnR5cGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UKKwkgKi8KKwlmYy0+ZmNvZV9wYWNrZXRfdHlwZS5mdW5jID0gZmNvZV9yY3Y7CisJZmMtPmZjb2VfcGFja2V0X3R5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRkNPRSk7CisJZmMtPmZjb2VfcGFja2V0X3R5cGUuZGV2ID0gZmMtPnJlYWxfZGV2OworCWRldl9hZGRfcGFjaygmZmMtPmZjb2VfcGFja2V0X3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmY29lX3N3X3Nob3N0X2NvbmZpZyAtIHNldHMgdXAgZmNfbHBvcnQtPmhvc3QKKyAqIEBscCA6IHB0ciB0byB0aGUgZmNfbHBvcnQKKyAqIEBzaG9zdCA6IHB0ciB0byB0aGUgYXNzb2NpYXRlZCBzY3NpIGhvc3QKKyAqIEBkZXYgOiBkZXZpY2UgYXNzb2NpYXRlZCB0byBzY3NpIGhvc3QKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBmY29lX3N3X2xwb3J0X2NvbmZpZykgYW5kIGZjb2Vfc3dfbmV0ZGV2X2NvbmZpZygpCisgKgorICogUmV0dXJucyA6IDAgZm9yIHN1Y2Nlc3MKKyAqCisgKi8KK3N0YXRpYyBpbnQgZmNvZV9zd19zaG9zdF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByYyA9IDA7CisKKwkvKiBscG9ydCBzY3NpIGhvc3QgY29uZmlnICovCisJbHAtPmhvc3QgPSBzaG9zdDsKKworCWxwLT5ob3N0LT5tYXhfbHVuID0gRkNPRV9NQVhfTFVOOworCWxwLT5ob3N0LT5tYXhfaWQgPSBGQ09FX01BWF9GQ1BfVEFSR0VUOworCWxwLT5ob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisJbHAtPmhvc3QtPnRyYW5zcG9ydHQgPSBzY3NpX3RyYW5zcG9ydF9mY29lX3N3OworCisJLyogYWRkIHRoZSBuZXcgaG9zdCB0byB0aGUgU0NTSS1tbCAqLworCXJjID0gc2NzaV9hZGRfaG9zdChscC0+aG9zdCwgZGV2KTsKKwlpZiAocmMpIHsKKwkJRkNfREJHKCJmY29lX3N3X3Nob3N0X2NvbmZpZzplcnJvciBvbiBzY3NpX2FkZF9ob3N0XG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKwlzcHJpbnRmKGZjX2hvc3Rfc3ltYm9saWNfbmFtZShscC0+aG9zdCksICIlcyB2JXMgb3ZlciAlcyIsCisJCUZDT0VfU1dfTkFNRSwgRkNPRV9TV19WRVJTSU9OLAorCQlmY29lX25ldGRldihscCktPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmY29lX3N3X2VtX2NvbmZpZyAtIGFsbG9jYXRlcyBlbSBmb3IgdGhpcyBscG9ydAorICogQGxwOiB0aGUgcG9ydCB0aGF0IGVtIGlzIHRvIGFsbG9jYXRlZCBmb3IKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZjb2Vfc3dfZW1fY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHApCit7CisJQlVHX09OKGxwLT5lbXApOworCisJbHAtPmVtcCA9IGZjX2V4Y2hfbWdyX2FsbG9jKGxwLCBGQ19DTEFTU18zLAorCQkJCSAgICBGQ09FX01JTl9YSUQsIEZDT0VfTUFYX1hJRCk7CisJaWYgKCFscC0+ZW1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKgorICogZmNvZV9zd19kZXN0cm95IC0gRkNvRSBzb2Z0d2FyZSBIQkEgdGVhci1kb3duIGZ1bmN0aW9uCisgKiBAbmV0ZGV2OiBwdHIgdG8gdGhlIGFzc29jaWF0ZWQgbmV0X2RldmljZQorICoKKyAqIFJldHVybnM6IDAgaWYgbGluayBpcyBPSyBmb3IgdXNlIGJ5IEZDb0UuCisgKi8KK3N0YXRpYyBpbnQgZmNvZV9zd19kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gTlVMTDsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisJdTggZmxvZ2lfbWFkZHJbRVRIX0FMRU5dOworCisJQlVHX09OKCFuZXRkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImZjb2Vfc3dfZGVzdHJveTppbnRlcmZhY2Ugb24gJXNcbiIsCisJICAgICAgIG5ldGRldi0+bmFtZSk7CisKKwlscCA9IGZjb2VfaG9zdGxpc3RfbG9va3VwKG5ldGRldik7CisJaWYgKCFscCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmYyA9IGZjb2Vfc29mdGMobHApOworCisJLyogTG9nb3V0IG9mIHRoZSBmYWJyaWMgKi8KKwlmY19mYWJyaWNfbG9nb2ZmKGxwKTsKKworCS8qIFJlbW92ZSB0aGUgaW5zdGFuY2UgZnJvbSBmY29lJ3MgbGlzdCAqLworCWZjb2VfaG9zdGxpc3RfcmVtb3ZlKGxwKTsKKworCS8qIERvbid0IGxpc3RlbiBmb3IgRXRoZXJuZXQgcGFja2V0cyBhbnltb3JlICovCisJZGV2X3JlbW92ZV9wYWNrKCZmYy0+ZmNvZV9wYWNrZXRfdHlwZSk7CisKKwkvKiBDbGVhbnVwIHRoZSBmY19scG9ydCAqLworCWZjX2xwb3J0X2Rlc3Ryb3kobHApOworCWZjX2ZjcF9kZXN0cm95KGxwKTsKKworCS8qIERldGFjaCBmcm9tIHRoZSBzY3NpLW1sICovCisJZmNfcmVtb3ZlX2hvc3QobHAtPmhvc3QpOworCXNjc2lfcmVtb3ZlX2hvc3QobHAtPmhvc3QpOworCisJLyogVGhlcmUgYXJlIG5vIG1vcmUgcnBvcnRzIG9yIEkvTywgZnJlZSB0aGUgRU0gKi8KKwlpZiAobHAtPmVtcCkKKwkJZmNfZXhjaF9tZ3JfZnJlZShscC0+ZW1wKTsKKworCS8qIERlbGV0ZSBzZWNvbmRhcnkgTUFDIGFkZHJlc3NlcyAqLworCXJ0bmxfbG9jaygpOworCW1lbWNweShmbG9naV9tYWRkciwgKHU4WzZdKSBGQ19GQ09FX0ZMT0dJX01BQywgRVRIX0FMRU4pOworCWRldl91bmljYXN0X2RlbGV0ZShmYy0+cmVhbF9kZXYsIGZsb2dpX21hZGRyLCBFVEhfQUxFTik7CisJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihmYy0+ZGF0YV9zcmNfYWRkciwgKHU4WzZdKSB7IDAgfSkpCisJCWRldl91bmljYXN0X2RlbGV0ZShmYy0+cmVhbF9kZXYsIGZjLT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CisJcnRubF91bmxvY2soKTsKKworCS8qIEZyZWUgdGhlIHBlci1DUFUgcmV2aWV2ZSB0aHJlYWRzICovCisJZmNvZV9wZXJjcHVfY2xlYW4obHApOworCisJLyogRnJlZSBleGlzdGluZyBza2JzICovCisJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwKTsKKworCS8qIEZyZWUgbWVtb3J5IHVzZWQgYnkgc3RhdGlzdGljYWwgY291bnRlcnMgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJa2ZyZWUobHAtPmRldl9zdGF0c1tjcHVdKTsKKworCS8qIFJlbGVhc2UgdGhlIG5ldF9kZXZpY2UgYW5kIFNjc2lfSG9zdCAqLworCWRldl9wdXQoZmMtPnJlYWxfZGV2KTsKKwlzY3NpX2hvc3RfcHV0KGxwLT5ob3N0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIGZjb2Vfc3dfbGliZmNfZmNuX3RlbXBsID0geworCS5mcmFtZV9zZW5kID0gZmNvZV94bWl0LAorfTsKKworLyoKKyAqIGZjb2Vfc3dfY3JlYXRlIC0gdGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBmY29lIGludGVyZmFjZQorICogQG5ldGRldjogcG9pbnRlciB0aGUgYXNzb2NpYXRlZCBuZXRkZXZpY2UKKyAqCisgKiBDcmVhdGVzIGZjX2xwb3J0IHN0cnVjdCBhbmQgc2NzaV9ob3N0IGZvciBscG9ydCwgY29uZmlndXJlcyBscG9ydAorICogYW5kIHN0YXJ0cyBmYWJyaWMgbG9naW4uCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGZjb2Vfc3dfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBOVUxMOworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCUJVR19PTighbmV0ZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJmY29lX3N3X2NyZWF0ZTppbnRlcmZhY2Ugb24gJXNcbiIsCisJICAgICAgIG5ldGRldi0+bmFtZSk7CisKKwlscCA9IGZjb2VfaG9zdGxpc3RfbG9va3VwKG5ldGRldik7CisJaWYgKGxwKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXNob3N0ID0gZmNvZV9ob3N0X2FsbG9jKCZmY29lX3N3X3Nob3N0X3RlbXBsYXRlLAorCQkJCXNpemVvZihzdHJ1Y3QgZmNvZV9zb2Z0YykpOworCWlmICghc2hvc3QpIHsKKwkJRkNfREJHKCJDb3VsZCBub3QgYWxsb2NhdGUgaG9zdCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbHAgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlmYyA9IGxwb3J0X3ByaXYobHApOworCisJLyogY29uZmlndXJlIGZjX2xwb3J0LCBlLmcuLCBlbSAqLworCXJjID0gZmNvZV9zd19scG9ydF9jb25maWcobHApOworCWlmIChyYykgeworCQlGQ19EQkcoIkNvdWxkIG5vdCBjb25maWd1cmUgbHBvcnRcbiIpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwkvKiBjb25maWd1cmUgbHBvcnQgbmV0d29yayBwcm9wZXJ0aWVzICovCisJcmMgPSBmY29lX3N3X25ldGRldl9jb25maWcobHAsIG5ldGRldik7CisJaWYgKHJjKSB7CisJCUZDX0RCRygiQ291bGQgbm90IGNvbmZpZ3VyZSBuZXRkZXYgZm9yIGxwb3J0XG4iKTsKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisJfQorCisJLyogY29uZmlndXJlIGxwb3J0IHNjc2kgaG9zdCBwcm9wZXJ0aWVzICovCisJcmMgPSBmY29lX3N3X3Nob3N0X2NvbmZpZyhscCwgc2hvc3QsICZuZXRkZXYtPmRldik7CisJaWYgKHJjKSB7CisJCUZDX0RCRygiQ291bGQgbm90IGNvbmZpZ3VyZSBzaG9zdCBmb3IgbHBvcnRcbiIpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwkvKiBscG9ydCBleGNoIG1hbmFnZXIgYWxsb2NhdGlvbiAqLworCXJjID0gZmNvZV9zd19lbV9jb25maWcobHApOworCWlmIChyYykgeworCQlGQ19EQkcoIkNvdWxkIG5vdCBjb25maWd1cmUgZW0gZm9yIGxwb3J0XG4iKTsKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSAqLworCXJjID0gZmNvZV9saWJmY19jb25maWcobHAsICZmY29lX3N3X2xpYmZjX2Zjbl90ZW1wbCk7CisJaWYgKHJjKSB7CisJCUZDX0RCRygiQ291bGQgbm90IGNvbmZpZ3VyZSBsaWJmYyBmb3IgbHBvcnQhXG4iKTsKKwkJZ290byBvdXRfbHBfZGVzdHJveTsKKwl9CisKKwkvKiBhZGQgdG8gbHBvcnRzIGxpc3QgKi8KKwlmY29lX2hvc3RsaXN0X2FkZChscCk7CisKKwlscC0+Ym9vdF90aW1lID0gamlmZmllczsKKworCWZjX2ZhYnJpY19sb2dpbihscCk7CisKKwlkZXZfaG9sZChuZXRkZXYpOworCisJcmV0dXJuIHJjOworCitvdXRfbHBfZGVzdHJveToKKwlmY19leGNoX21ncl9mcmVlKGxwLT5lbXApOyAvKiBGcmVlIHRoZSBFTSAqLworb3V0X2hvc3RfcHV0OgorCXNjc2lfaG9zdF9wdXQobHAtPmhvc3QpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIGZjb2Vfc3dfbWF0Y2ggLSB0aGUgZmNvZSBzdyB0cmFuc3BvcnQgbWF0Y2ggZnVuY3Rpb24KKyAqCisgKiBSZXR1cm5zIDogZmFsc2UgYWx3YXlzCisgKi8KK3N0YXRpYyBib29sIGZjb2Vfc3dfbWF0Y2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwkvKiBGSVhNRSAtIGZvciBzdyB0cmFuc3BvcnQsIGFsd2F5cyByZXR1cm4gZmFsc2UgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIHRoZSBzdyBoYmEgZmNvZSB0cmFuc3BvcnQgKi8KK3N0cnVjdCBmY29lX3RyYW5zcG9ydCBmY29lX3N3X3RyYW5zcG9ydCA9IHsKKwkubmFtZSA9ICJmY29lc3ciLAorCS5jcmVhdGUgPSBmY29lX3N3X2NyZWF0ZSwKKwkuZGVzdHJveSA9IGZjb2Vfc3dfZGVzdHJveSwKKwkubWF0Y2ggPSBmY29lX3N3X21hdGNoLAorCS52ZW5kb3IgPSAweDAsCisJLmRldmljZSA9IDB4ZmZmZiwKK307CisKKy8qCisgKiBmY29lX3N3X2luaXQgLSByZWdpc3RlcnMgZmNvZV9zd190cmFuc3BvcnQKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2ludCBfX2luaXQgZmNvZV9zd19pbml0KHZvaWQpCit7CisJLyogYXR0YWNoIHRvIHNjc2kgdHJhbnNwb3J0ICovCisJc2NzaV90cmFuc3BvcnRfZmNvZV9zdyA9CisJCWZjX2F0dGFjaF90cmFuc3BvcnQoJmZjb2Vfc3dfdHJhbnNwb3J0X2Z1bmN0aW9uKTsKKwlpZiAoIXNjc2lfdHJhbnNwb3J0X2Zjb2Vfc3cpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmY29lX3N3X2luaXQ6ZmNfYXR0YWNoX3RyYW5zcG9ydCgpIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiByZWdpc3RlciBzdyB0cmFuc3BvcnQgKi8KKwlmY29lX3RyYW5zcG9ydF9yZWdpc3RlcigmZmNvZV9zd190cmFuc3BvcnQpOworCXJldHVybiAwOworfQorCisvKgorICogZmNvZV9zd19leGl0IC0gdW5yZWdpc3RlcnMgZmNvZV9zd190cmFuc3BvcnQKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2ludCBfX2V4aXQgZmNvZV9zd19leGl0KHZvaWQpCit7CisJLyogZGV0dGFjaCB0aGUgdHJhbnNwb3J0ICovCisJZmNfcmVsZWFzZV90cmFuc3BvcnQoc2NzaV90cmFuc3BvcnRfZmNvZV9zdyk7CisJZmNvZV90cmFuc3BvcnRfdW5yZWdpc3RlcigmZmNvZV9zd190cmFuc3BvcnQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvbGliZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvbGliZmNvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTlmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9saWJmY29lLmMKQEAgLTAsMCArMSwxNTEwIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfZmMuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CisKKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2VuY2Fwcy5oPgorCisjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgorI2luY2x1ZGUgPHNjc2kvZmNfZnJhbWUuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjb2UuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjX3RyYW5zcG9ydF9mY29lLmg+CisKK3N0YXRpYyBpbnQgZGVidWdfZmNvZTsKKworI2RlZmluZSBGQ09FX01BWF9RVUVVRV9ERVBUSCAgMjU2CisKKy8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgbW9kZSAqLworI2RlZmluZSBGQ09FX0dXX0FERFJfTU9ERQkgICAgMHgwMAorI2RlZmluZSBGQ09FX0ZDT1VJX0FERFJfTU9ERQkgICAgMHgwMQorCisjZGVmaW5lIEZDT0VfV09SRF9UT19CWVRFICA0CisKK01PRFVMRV9BVVRIT1IoIk9wZW4tRkNvRS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiRkNvRSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBmY29lIGhvc3QgbGlzdCAqLworTElTVF9IRUFEKGZjb2VfaG9zdGxpc3QpOworREVGSU5FX1JXTE9DSyhmY29lX2hvc3RsaXN0X2xvY2spOworREVGSU5FX1RJTUVSKGZjb2VfdGltZXIsIE5VTEwsIDAsIDApOworc3RydWN0IGZjb2VfcGVyY3B1X3MgKmZjb2VfcGVyY3B1W05SX0NQVVNdOworCisKKy8qIEZ1bmN0aW9uIFByb3RvdHllcyAqLworc3RhdGljIGludCBmY29lX2NoZWNrX3dhaXRfcXVldWUoc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNvZV9pbnNlcnRfd2FpdF9xdWV1ZV9oZWFkKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGZjb2VfaW5zZXJ0X3dhaXRfcXVldWUoc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZmNvZV9yZWN2X2Zsb2dpKHN0cnVjdCBmY29lX3NvZnRjICosIHN0cnVjdCBmY19mcmFtZSAqLCB1OCAqKTsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgZmNvZV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVsb25nLCB2b2lkICopOworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworc3RhdGljIGludCBmY29lX2RldmljZV9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVsb25nLCB2b2lkICopOworc3RhdGljIHZvaWQgZmNvZV9kZXZfc2V0dXAodm9pZCk7CitzdGF0aWMgdm9pZCBmY29lX2Rldl9jbGVhbnVwKHZvaWQpOworCisvKiBub3RpZmljYXRpb24gZnVuY3Rpb24gZnJvbSBuZXQgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZjb2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBmY29lX2RldmljZV9ub3RpZmljYXRpb24sCit9OworCisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmNvZV9jcHVfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBmY29lX2NwdV9jYWxsYmFjaywKK307CisKKy8qKgorICogZmNvZV9jcmVhdGVfcGVyY3B1X2RhdGEgLSBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGNwdSBkYXRhCisgKiBAY3B1OiBpbmRleCBmb3IgdGhlIGNwdSB3aGVyZSBmY29lIGNwdSBkYXRhIHdpbGwgYmUgY3JlYXRlZAorICoKKyAqIGNyZWF0ZSBwZXJjcHUgc3RhdHMgYmxvY2ssIGZyb20gY3B1IGFkZCBub3RpZmllcgorICoKKyAqIFJldHVybnM6IG5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGZjb2VfY3JlYXRlX3BlcmNwdV9kYXRhKGludCBjcHUpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisKKwl3cml0ZV9sb2NrX2JoKCZmY29lX2hvc3RsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmMsICZmY29lX2hvc3RsaXN0LCBsaXN0KSB7CisJCWxwID0gZmMtPmxwOworCQlpZiAobHAtPmRldl9zdGF0c1tjcHVdID09IE5VTEwpCisJCQlscC0+ZGV2X3N0YXRzW2NwdV0gPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmY29lX2Rldl9zdGF0cyksCisJCQkJCUdGUF9LRVJORUwpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmZjb2VfaG9zdGxpc3RfbG9jayk7Cit9CisKKy8qKgorICogZmNvZV9kZXN0cm95X3BlcmNwdV9kYXRhIC0gZGVzdHJveXMgdGhlIGFzc29jaWF0ZWQgY3B1IGRhdGEKKyAqIEBjcHU6IGluZGV4IGZvciB0aGUgY3B1IHdoZXJlIGZjb2UgY3B1IGRhdGEgd2lsbCBkZXN0cm95ZWQKKyAqCisgKiBkZXN0cm95IHBlcmNwdSBzdGF0cyBibG9jayBjYWxsZWQgYnkgY3B1IGFkZC9yZW1vdmUgbm90aWZpZXIKKyAqCisgKiBSZXR1bnM6IG5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGZjb2VfZGVzdHJveV9wZXJjcHVfZGF0YShpbnQgY3B1KQoreworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjb2Vfc29mdGMgKmZjOworCisJd3JpdGVfbG9ja19iaCgmZmNvZV9ob3N0bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmZmNvZV9ob3N0bGlzdCwgbGlzdCkgeworCQlscCA9IGZjLT5scDsKKwkJa2ZyZWUobHAtPmRldl9zdGF0c1tjcHVdKTsKKwkJbHAtPmRldl9zdGF0c1tjcHVdID0gTlVMTDsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZmY29lX2hvc3RsaXN0X2xvY2spOworfQorCisvKioKKyAqIGZjb2VfY3B1X2NhbGxiYWNrIC0gZmNvZSBjcHUgaG90cGx1ZyBldmVudCBjYWxsYmFjaworICogQG5mYjogY2FsbGJhY2sgZGF0YSBibG9jaworICogQGFjdGlvbjogZXZlbnQgdHJpZ2dlcmluZyB0aGUgY2FsbGJhY2sKKyAqIEBoY3B1OiBpbmRleCBmb3IgdGhlIGNwdSBvZiB0aGlzIGV2ZW50CisgKgorICogdGhpcyBjcmVhdGVzIG9yIGRlc3Ryb3lzIHBlciBjcHUgZGF0YSBmb3IgZmNvZQorICoKKyAqIFJldHVybnMgTk9USUZZX09LIGFsd2F5cy4KKyAqKi8KK3N0YXRpYyBpbnQgZmNvZV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJICAgICB2b2lkICpoY3B1KQoreworCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJCWZjb2VfY3JlYXRlX3BlcmNwdV9kYXRhKGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RFQUQ6CisJCWZjb2VfZGVzdHJveV9wZXJjcHVfZGF0YShjcHUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworLyoqCisgKiBmY29lX3JjdiAtIHRoaXMgaXMgdGhlIGZjb2UgcmVjZWl2ZSBmdW5jdGlvbiBjYWxsZWQgYnkgTkVUX1JYX1NPRlRJUlEKKyAqIEBza2I6IHRoZSByZWNlaXZlIHNrYgorICogQGRldjogYXNzb2NpYXRlZCBuZXQgZGV2aWNlCisgKiBAcHR5cGU6IGNvbnRleHQKKyAqIEBvZGxkZXY6IGxhc3QgZGV2aWNlCisgKgorICogdGhpcyBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgdGhlIHBhY2tldCBhbmQgYnVpbGQgZmMgZnJhbWUgYW5kIHBhc3MgaXQgdXAKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitpbnQgZmNvZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpvbGRkZXYpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNvZV9yY3ZfaW5mbyAqZnI7CisJc3RydWN0IGZjb2Vfc29mdGMgKmZjOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJdW5zaWduZWQgc2hvcnQgb3hpZDsKKwlpbnQgY3B1X2lkeDsKKwlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqZnBzOworCisJZmMgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBmY29lX3NvZnRjLCBmY29lX3BhY2tldF90eXBlKTsKKwlscCA9IGZjLT5scDsKKwlpZiAodW5saWtlbHkobHAgPT0gTlVMTCkpIHsKKwkJRkNfREJHKCJjYW5ub3QgZmluZCBoYmEgc3RydWN0dXJlIik7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlpZiAodW5saWtlbHkoZGVidWdfZmNvZSkpIHsKKwkJRkNfREJHKCJza2JfaW5mbzogbGVuOiVkIGRhdGFfbGVuOiVkIGhlYWQ6JXAgZGF0YTolcCB0YWlsOiVwICIKKwkJICAgICAgICJlbmQ6JXAgc3VtOiVkIGRldjolcyIsIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuLAorCQkgICAgICAgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJICAgICAgIHNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmNzdW0sCisJCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOworCisJfQorCisJLyogY2hlY2sgZm9yIEZDT0UgcGFja2V0IHR5cGUgKi8KKwlpZiAodW5saWtlbHkoZXRoX2hkcihza2IpLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0ZDT0UpKSkgeworCQlGQ19EQkcoIndyb25nIEZDIHR5cGUgZnJhbWUiKTsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgbWluaW11bSBmcmFtZSBsZW5ndGgsIGFuZCBtYWtlIHN1cmUgcmVxdWlyZWQgRkNvRQorCSAqIGFuZCBGQyBoZWFkZXJzIGFyZSBwdWxsZWQgaW50byB0aGUgbGluZWFyIGRhdGEgYXJlYS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKHNrYi0+bGVuIDwgRkNPRV9NSU5fRlJBTUUpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgRkNPRV9IRUFERVJfTEVOKSkpCisJCWdvdG8gZXJyOworCisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBmY29lX2hkcikpOworCWZoID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKworCW94aWQgPSBudG9ocyhmaC0+Zmhfb3hfaWQpOworCisJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOworCWZyLT5mcl9kZXYgPSBscDsKKwlmci0+cHR5cGUgPSBwdHlwZTsKKwljcHVfaWR4ID0gMDsKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBUaGUgaW5jb21pbmcgZnJhbWUgZXhjaGFuZ2UgaWQob3hpZCkgaXMgQU5EZWQgd2l0aCBudW0gb2Ygb25saW5lCisJICogY3B1IGJpdHMgdG8gZ2V0IGNwdV9pZHggYW5kIHRoZW4gdGhpcyBjcHVfaWR4IGlzIHVzZWQgZm9yIHNlbGVjdGluZworCSAqIGEgcGVyIGNwdSBrZXJuZWwgdGhyZWFkIGZyb20gZmNvZV9wZXJjcHUuIEluIGNhc2UgdGhlIGNwdSBpcworCSAqIG9mZmxpbmUgb3Igbm8ga2VybmVsIHRocmVhZCBmb3IgZGVyaXZlZCBjcHVfaWR4IHRoZW4gY3B1X2lkeCBpcworCSAqIGluaXRpYWxpemUgdG8gZmlyc3Qgb25saW5lIGNwdSBpbmRleC4KKwkgKi8KKwljcHVfaWR4ID0gb3hpZCAmIChudW1fb25saW5lX2NwdXMoKSAtIDEpOworCWlmICghZmNvZV9wZXJjcHVbY3B1X2lkeF0gfHwgIWNwdV9vbmxpbmUoY3B1X2lkeCkpCisJCWNwdV9pZHggPSBmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApOworI2VuZGlmCisJZnBzID0gZmNvZV9wZXJjcHVbY3B1X2lkeF07CisKKwlzcGluX2xvY2tfYmgoJmZwcy0+ZmNvZV9yeF9saXN0LmxvY2spOworCV9fc2tiX3F1ZXVlX3RhaWwoJmZwcy0+ZmNvZV9yeF9saXN0LCBza2IpOworCWlmIChmcHMtPmZjb2VfcnhfbGlzdC5xbGVuID09IDEpCisJCXdha2VfdXBfcHJvY2VzcyhmcHMtPnRocmVhZCk7CisKKwlzcGluX3VubG9ja19iaCgmZnBzLT5mY29lX3J4X2xpc3QubG9jayk7CisKKwlyZXR1cm4gMDsKK2VycjoKKyNpZmRlZiBDT05GSUdfU01QCisJc3RhdHMgPSBscC0+ZGV2X3N0YXRzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisjZWxzZQorCXN0YXRzID0gbHAtPmRldl9zdGF0c1swXTsKKyNlbmRpZgorCWlmIChzdGF0cykKKwkJc3RhdHMtPkVycm9yRnJhbWVzKys7CisKK2VycjI6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9yY3YpOworCisvKioKKyAqIGZjb2Vfc3RhcnRfaW8gLSBwYXNzIHRvIG5ldGRldiB0byBzdGFydCB4bWl0IGZvciBmY29lCisgKiBAc2tiOiB0aGUgc2tiIHRvIGJlIHhtaXR0ZWQKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW5saW5lIGludCBmY29lX3N0YXJ0X2lvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjOworCisJc2tiX2dldChza2IpOworCXJjID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZjb2VfZ2V0X3BhZ2VkX2NyY19lb2YgLSBpbiBjYXNlIHdlIG5lZWQgYWxsb2MgYSBwYWdlIGZvciBjcmNfZW9mCisgKiBAc2tiOiB0aGUgc2tiIHRvIGJlIHhtaXR0ZWQKKyAqIEB0bGVuOiB0b3RhbCBsZW4KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGZjb2VfZ2V0X3BhZ2VkX2NyY19lb2Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRsZW4pCit7CisJc3RydWN0IGZjb2VfcGVyY3B1X3MgKmZwczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgY3B1X2lkeDsKKworCWNwdV9pZHggPSBnZXRfY3B1KCk7CisJZnBzID0gZmNvZV9wZXJjcHVbY3B1X2lkeF07CisJcGFnZSA9IGZwcy0+Y3JjX2VvZl9wYWdlOworCWlmICghcGFnZSkgeworCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlwdXRfY3B1KCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmcHMtPmNyY19lb2ZfcGFnZSA9IHBhZ2U7CisJCVdBUk5fT04oZnBzLT5jcmNfZW9mX29mZnNldCAhPSAwKTsKKwl9CisKKwlnZXRfcGFnZShwYWdlKTsKKwlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCBwYWdlLAorCQkJICAgZnBzLT5jcmNfZW9mX29mZnNldCwgdGxlbik7CisJc2tiLT5sZW4gKz0gdGxlbjsKKwlza2ItPmRhdGFfbGVuICs9IHRsZW47CisJc2tiLT50cnVlc2l6ZSArPSB0bGVuOworCWZwcy0+Y3JjX2VvZl9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBmY29lX2NyY19lb2YpOworCisJaWYgKGZwcy0+Y3JjX2VvZl9vZmZzZXQgPj0gUEFHRV9TSVpFKSB7CisJCWZwcy0+Y3JjX2VvZl9wYWdlID0gTlVMTDsKKwkJZnBzLT5jcmNfZW9mX29mZnNldCA9IDA7CisJCXB1dF9wYWdlKHBhZ2UpOworCX0KKwlwdXRfY3B1KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNvZV9mY19jcmMgLSBjYWxjdWxhdGVzIEZDIENSQyBpbiB0aGlzIGZjb2Ugc2tiCisgKiBAZnA6IHRoZSBmY19mcmFtZSBjb250YWluZyBkYXRhIHRvIGJlIGNoZWNrc3VtbWVkCisgKgorICogVGhpcyB1c2VzIGNyYzMyKCkgdG8gY2FsY3VsYXRlIHRoZSBjcmMgZm9yIGZjIGZyYW1lCisgKiBSZXR1cm4gICA6IDMyIGJpdCBjcmMKKyAqCisgKiovCit1MzIgZmNvZV9mY19jcmMoc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZnBfc2tiKGZwKTsKKwlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBvZmYsIGxlbiwgY2xlbjsKKwl1MzIgY3JjOworCXVuc2lnbmVkIGk7CisKKwljcmMgPSBjcmMzMih+MCwgc2tiLT5kYXRhLCBza2JfaGVhZGxlbihza2IpKTsKKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQlvZmYgPSBmcmFnLT5wYWdlX29mZnNldDsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWNsZW4gPSBtaW4obGVuLCBQQUdFX1NJWkUgLSAob2ZmICYgflBBR0VfTUFTSykpOworCQkJZGF0YSA9IGttYXBfYXRvbWljKGZyYWctPnBhZ2UgKyAob2ZmID4+IFBBR0VfU0hJRlQpLAorCQkJCQkgICBLTV9TS0JfREFUQV9TT0ZUSVJRKTsKKwkJCWNyYyA9IGNyYzMyKGNyYywgZGF0YSArIChvZmYgJiB+UEFHRV9NQVNLKSwgY2xlbik7CisJCQlrdW5tYXBfYXRvbWljKGRhdGEsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOworCQkJb2ZmICs9IGNsZW47CisJCQlsZW4gLT0gY2xlbjsKKwkJfQorCX0KKwlyZXR1cm4gY3JjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9mY19jcmMpOworCisvKioKKyAqIGZjb2VfeG1pdCAtIEZDb0UgZnJhbWUgdHJhbnNtaXQgZnVuY3Rpb24KKyAqIEBscDoJdGhlIGFzc29jaWF0ZWQgbG9jYWwgcG9ydAorICogQGZwOiB0aGUgZmNfZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqCisgKiBSZXR1cm4gICA6IDAgZm9yIHN1Y2Nlc3MKKyAqCisgKiovCitpbnQgZmNvZV94bWl0KHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJaW50IHdsZW4sIHJjID0gMDsKKwl1MzIgY3JjOworCXN0cnVjdCBldGhoZHIgKmVoOworCXN0cnVjdCBmY29lX2NyY19lb2YgKmNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpzdGF0czsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwl1bnNpZ25lZCBpbnQgaGxlbjsJCS8qIGhlYWRlciBsZW5ndGggaW1wbGllcyB0aGUgdmVyc2lvbiAqLworCXVuc2lnbmVkIGludCB0bGVuOwkJLyogdHJhaWxlciBsZW5ndGggKi8KKwl1bnNpZ25lZCBpbnQgZWxlbjsJCS8qIGV0aCBoZWFkZXIsIG1heSBpbmNsdWRlIHZsYW4gKi8KKwlpbnQgZmxvZ2lfaW5fcHJvZ3Jlc3MgPSAwOworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKwl1OCBzb2YsIGVvZjsKKwlzdHJ1Y3QgZmNvZV9oZHIgKmhwOworCisJV0FSTl9PTigoZnJfbGVuKGZwKSAlIHNpemVvZih1MzIpKSAhPSAwKTsKKworCWZjID0gZmNvZV9zb2Z0YyhscCk7CisJLyoKKwkgKiBpZiBpdCBpcyBhIGZsb2dpIHRoZW4gd2UgbmVlZCB0byBsZWFybiBndy1hZGRyCisJICogYW5kIG15IG93biBmY2lkCisJICovCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpZiAodW5saWtlbHkoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSkpIHsKKwkJaWYgKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19GTE9HSSkgeworCQkJZmMtPmZsb2dpX294aWQgPSBudG9ocyhmaC0+Zmhfb3hfaWQpOworCQkJZmMtPmFkZHJlc3NfbW9kZSA9IEZDT0VfRkNPVUlfQUREUl9NT0RFOworCQkJZmMtPmZsb2dpX3Byb2dyZXNzID0gMTsKKwkJCWZsb2dpX2luX3Byb2dyZXNzID0gMTsKKwkJfSBlbHNlIGlmIChmYy0+ZmxvZ2lfcHJvZ3Jlc3MgJiYgbnRvaDI0KGZoLT5maF9zX2lkKSAhPSAwKSB7CisJCQkvKgorCQkJICogSGVyZSB3ZSBtdXN0J3ZlIGdvdHRlbiBhbiBTSUQgYnkgYWNjZXB0aW5nIGFuIEZMT0dJCisJCQkgKiBmcm9tIGEgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbi4gIFN3aXRjaCB0byB1c2luZworCQkJICogdGhlIHNvdXJjZSBtYWMgYmFzZWQgb24gdGhlIFNJRC4gIFRoZSBkZXN0aW5hdGlvbgorCQkJICogTUFDIGluIHRoaXMgY2FzZSB3b3VsZCBoYXZlIGJlZW4gc2V0IGJ5IHJlY2V2aW5nIHRoZQorCQkJICogRkxPR0kuCisJCQkgKi8KKwkJCWZjX2Zjb2Vfc2V0X21hYyhmYy0+ZGF0YV9zcmNfYWRkciwgZmgtPmZoX3NfaWQpOworCQkJZmMtPmZsb2dpX3Byb2dyZXNzID0gMDsKKwkJfQorCX0KKworCXNrYiA9IGZwX3NrYihmcCk7CisJc29mID0gZnJfc29mKGZwKTsKKwllb2YgPSBmcl9lb2YoZnApOworCisJZWxlbiA9IChmYy0+cmVhbF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pID8KKwkJc2l6ZW9mKHN0cnVjdCB2bGFuX2V0aGhkcikgOiBzaXplb2Yoc3RydWN0IGV0aGhkcik7CisJaGxlbiA9IHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpOworCXRsZW4gPSBzaXplb2Yoc3RydWN0IGZjb2VfY3JjX2VvZik7CisJd2xlbiA9IChza2ItPmxlbiAtIHRsZW4gKyBzaXplb2YoY3JjKSkgLyBGQ09FX1dPUkRfVE9fQllURTsKKworCS8qIGNyYyBvZmZsb2FkICovCisJaWYgKGxpa2VseShscC0+Y3JjX29mZmxvYWQpKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CisJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl9oZWFkcm9vbShza2IpOworCQlza2ItPmNzdW1fb2Zmc2V0ID0gc2tiLT5sZW47CisJCWNyYyA9IDA7CisJfSBlbHNlIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQljcmMgPSBmY29lX2ZjX2NyYyhmcCk7CisJfQorCisJLyogY29weSBmYyBjcmMgYW5kIGVvZiB0byB0aGUgc2tiIGJ1ZmYgKi8KKwlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpKSB7CisJCXNrYl9mcmFnX3QgKmZyYWc7CisJCWlmIChmY29lX2dldF9wYWdlZF9jcmNfZW9mKHNrYiwgdGxlbikpIHsKKwkJCWtmcmVlKHNrYik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAtIDFdOworCQljcCA9IGttYXBfYXRvbWljKGZyYWctPnBhZ2UsIEtNX1NLQl9EQVRBX1NPRlRJUlEpCisJCQkrIGZyYWctPnBhZ2Vfb2Zmc2V0OworCX0gZWxzZSB7CisJCWNwID0gKHN0cnVjdCBmY29lX2NyY19lb2YgKilza2JfcHV0KHNrYiwgdGxlbik7CisJfQorCisJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CisJY3AtPmZjb2VfZW9mID0gZW9mOworCWNwLT5mY29lX2NyYzMyID0gY3B1X3RvX2xlMzIofmNyYyk7CisKKwlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpKSB7CisJCWt1bm1hcF9hdG9taWMoY3AsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOworCQljcCA9IE5VTEw7CisJfQorCisJLyogYWRqdXN0IHNrYiBuZXRvd3JrL3RyYW5zcG9ydCBvZmZzZXRzIHRvIG1hdGNoIG1hYy9mY29lL2ZjICovCisJc2tiX3B1c2goc2tiLCBlbGVuICsgaGxlbik7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2ItPm1hY19sZW4gPSBlbGVuOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMyk7CisJc2tiLT5kZXYgPSBmYy0+cmVhbF9kZXY7CisKKwkvKiBmaWxsIHVwIG1hYyBhbmQgZmNvZSBoZWFkZXJzICovCisJZWggPSBldGhfaGRyKHNrYik7CisJZWgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9GQ09FKTsKKwlpZiAoZmMtPmFkZHJlc3NfbW9kZSA9PSBGQ09FX0ZDT1VJX0FERFJfTU9ERSkKKwkJZmNfZmNvZV9zZXRfbWFjKGVoLT5oX2Rlc3QsIGZoLT5maF9kX2lkKTsKKwllbHNlCisJCS8qIGluc2VydCBHVyBhZGRyZXNzICovCisJCW1lbWNweShlaC0+aF9kZXN0LCBmYy0+ZGVzdF9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAodW5saWtlbHkoZmxvZ2lfaW5fcHJvZ3Jlc3MpKQorCQltZW1jcHkoZWgtPmhfc291cmNlLCBmYy0+Y3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkoZWgtPmhfc291cmNlLCBmYy0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOworCisJaHAgPSAoc3RydWN0IGZjb2VfaGRyICopKGVoICsgMSk7CisJbWVtc2V0KGhwLCAwLCBzaXplb2YoKmhwKSk7CisJaWYgKEZDX0ZDT0VfVkVSKQorCQlGQ19GQ09FX0VOQ0FQU19WRVIoaHAsIEZDX0ZDT0VfVkVSKTsKKwlocC0+ZmNvZV9zb2YgPSBzb2Y7CisKKwkvKiB1cGRhdGUgdHggc3RhdHM6IHJlZ2FyZGxlc3MgaWYgTExEIGZhaWxzICovCisJc3RhdHMgPSBscC0+ZGV2X3N0YXRzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJaWYgKHN0YXRzKSB7CisJCXN0YXRzLT5UeEZyYW1lcysrOworCQlzdGF0cy0+VHhXb3JkcyArPSB3bGVuOworCX0KKworCS8qIHNlbmQgZG93biB0byBsbGQgKi8KKwlmcl9kZXYoZnApID0gbHA7CisJaWYgKGZjLT5mY29lX3BlbmRpbmdfcXVldWUucWxlbikKKwkJcmMgPSBmY29lX2NoZWNrX3dhaXRfcXVldWUobHApOworCisJaWYgKHJjID09IDApCisJCXJjID0gZmNvZV9zdGFydF9pbyhza2IpOworCisJaWYgKHJjKSB7CisJCWZjb2VfaW5zZXJ0X3dhaXRfcXVldWUobHAsIHNrYik7CisJCWlmIChmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4gPiBGQ09FX01BWF9RVUVVRV9ERVBUSCkKKwkJCWZjX3BhdXNlKGxwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZjb2VfeG1pdCk7CisKKy8qCisgKiBmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCAtIHJlY3YgdGhyZWFkIHBlciBjcHUKKyAqIEBhcmc6IHB0ciB0byB0aGUgZmNvZSBwZXIgY3B1IHN0cnVjdAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcworICoKKyAqLworaW50IGZjb2VfcGVyY3B1X3JlY2VpdmVfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqcCA9IGFyZzsKKwl1MzIgZnJfbGVuOworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjb2VfcmN2X2luZm8gKmZyOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZmNvZV9jcmNfZW9mIGNyY19lb2Y7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwl1OCAqbWFjID0gTlVMTDsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisJc3RydWN0IGZjb2VfaGRyICpocDsKKworCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKworCQlzcGluX2xvY2tfYmgoJnAtPmZjb2VfcnhfbGlzdC5sb2NrKTsKKwkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZwLT5mY29lX3J4X2xpc3QpKSA9PSBOVUxMKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfYmgoJnAtPmZjb2VfcnhfbGlzdC5sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXNwaW5fbG9ja19iaCgmcC0+ZmNvZV9yeF9saXN0LmxvY2spOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwLT5mY29lX3J4X2xpc3QubG9jayk7CisJCWZyID0gZmNvZV9kZXZfZnJvbV9za2Ioc2tiKTsKKwkJbHAgPSBmci0+ZnJfZGV2OworCQlpZiAodW5saWtlbHkobHAgPT0gTlVMTCkpIHsKKwkJCUZDX0RCRygiaW52YWxpZCBIQkEgU3RydWN0dXJlIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3RhdHMgPSBscC0+ZGV2X3N0YXRzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisKKwkJaWYgKHVubGlrZWx5KGRlYnVnX2Zjb2UpKSB7CisJCQlGQ19EQkcoInNrYl9pbmZvOiBsZW46JWQgZGF0YV9sZW46JWQgaGVhZDolcCBkYXRhOiVwICIKKwkJCSAgICAgICAidGFpbDolcCBlbmQ6JXAgc3VtOiVkIGRldjolcyIsCisJCQkgICAgICAgc2tiLT5sZW4sIHNrYi0+ZGF0YV9sZW4sCisJCQkgICAgICAgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCSAgICAgICBza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5jc3VtLAorCQkJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiPE5VTEw+Iik7CisJCX0KKworCQkvKgorCQkgKiBTYXZlIHNvdXJjZSBNQUMgYWRkcmVzcyBiZWZvcmUgZGlzY2FyZGluZyBoZWFkZXIuCisJCSAqLworCQlmYyA9IGxwb3J0X3ByaXYobHApOworCQlpZiAodW5saWtlbHkoZmMtPmZsb2dpX3Byb2dyZXNzKSkKKwkJCW1hYyA9IGV0aF9oZHIoc2tiKS0+aF9zb3VyY2U7CisKKwkJaWYgKHNrYl9pc19ub25saW5lYXIoc2tiKSkKKwkJCXNrYl9saW5lYXJpemUoc2tiKTsJLyogbm90IGlkZWFsICovCisKKwkJLyoKKwkJICogRnJhbWUgbGVuZ3RoIGNoZWNrcyBhbmQgc2V0dGluZyB1cCB0aGUgaGVhZGVyIHBvaW50ZXJzCisJCSAqIHdhcyBkb25lIGluIGZjb2VfcmN2IGFscmVhZHkuCisJCSAqLworCQlocCA9IChzdHJ1Y3QgZmNvZV9oZHIgKikgc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJCWZoID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKworCQlpZiAodW5saWtlbHkoRkNfRkNPRV9ERUNBUFNfVkVSKGhwKSAhPSBGQ19GQ09FX1ZFUikpIHsKKwkJCWlmIChzdGF0cykgeworCQkJCWlmIChzdGF0cy0+RXJyb3JGcmFtZXMgPCA1KQorCQkJCQlGQ19EQkcoInVua25vd24gRkNvRSB2ZXJzaW9uICV4IiwKKwkJCQkJICAgICAgIEZDX0ZDT0VfREVDQVBTX1ZFUihocCkpOworCQkJCXN0YXRzLT5FcnJvckZyYW1lcysrOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBmY29lX2hkcikpOworCQlmcl9sZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgZmNvZV9jcmNfZW9mKTsKKworCQlpZiAoc3RhdHMpIHsKKwkJCXN0YXRzLT5SeEZyYW1lcysrOworCQkJc3RhdHMtPlJ4V29yZHMgKz0gZnJfbGVuIC8gRkNPRV9XT1JEX1RPX0JZVEU7CisJCX0KKworCQlmcCA9IChzdHJ1Y3QgZmNfZnJhbWUgKilza2I7CisJCWZjX2ZyYW1lX2luaXQoZnApOworCQlmcl9kZXYoZnApID0gbHA7CisJCWZyX3NvZihmcCkgPSBocC0+ZmNvZV9zb2Y7CisKKwkJLyogQ29weSBvdXQgdGhlIENSQyBhbmQgRU9GIHRyYWlsZXIgZm9yIGFjY2VzcyAqLworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIGZyX2xlbiwgJmNyY19lb2YsIHNpemVvZihjcmNfZW9mKSkpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKwkJZnJfZW9mKGZwKSA9IGNyY19lb2YuZmNvZV9lb2Y7CisJCWZyX2NyYyhmcCkgPSBjcmNfZW9mLmZjb2VfY3JjMzI7CisJCWlmIChwc2tiX3RyaW0oc2tiLCBmcl9sZW4pKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2Ugb25seSBjaGVjayBDUkMgaWYgbm8gb2ZmbG9hZCBpcyBhdmFpbGFibGUgYW5kIGlmIGl0IGlzCisJCSAqIGl0J3Mgc29saWNpdGVkIGRhdGEsIGluIHdoaWNoIGNhc2UsIHRoZSBGQ1AgbGF5ZXIgd291bGQKKwkJICogY2hlY2sgaXQgZHVyaW5nIHRoZSBjb3B5LgorCQkgKi8KKwkJaWYgKGxwLT5jcmNfb2ZmbG9hZCkKKwkJCWZyX2ZsYWdzKGZwKSAmPSB+RkNQSEZfQ1JDX1VOQ0hFQ0tFRDsKKwkJZWxzZQorCQkJZnJfZmxhZ3MoZnApIHw9IEZDUEhGX0NSQ19VTkNIRUNLRUQ7CisKKwkJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkJaWYgKGZoLT5maF9yX2N0bCA9PSBGQ19SQ1RMX0REX1NPTF9EQVRBICYmCisJCSAgICBmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0ZDUCkgeworCQkJZmNfZXhjaF9yZWN2KGxwLCBscC0+ZW1wLCBmcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCkgeworCQkJaWYgKGxlMzJfdG9fY3B1KGZyX2NyYyhmcCkpICE9CisJCQkgICAgfmNyYzMyKH4wLCBza2ItPmRhdGEsIGZyX2xlbikpIHsKKwkJCQlpZiAoZGVidWdfZmNvZSB8fCBzdGF0cy0+SW52YWxpZENSQ0NvdW50IDwgNSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmNvZTogZHJvcHBpbmcgIgorCQkJCQkgICAgICAgImZyYW1lIHdpdGggQ1JDIGVycm9yXG4iKTsKKwkJCQlzdGF0cy0+SW52YWxpZENSQ0NvdW50Kys7CisJCQkJc3RhdHMtPkVycm9yRnJhbWVzKys7CisJCQkJZmNfZnJhbWVfZnJlZShmcCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcl9mbGFncyhmcCkgJj0gfkZDUEhGX0NSQ19VTkNIRUNLRUQ7CisJCX0KKwkJLyogbm9uIGZsb2dpIGFuZCBub24gZGF0YSBleGNoYW5nZXMgYXJlIGhhbmRsZWQgaGVyZSAqLworCQlpZiAodW5saWtlbHkoZmMtPmZsb2dpX3Byb2dyZXNzKSkKKwkJCWZjb2VfcmVjdl9mbG9naShmYywgZnAsIG1hYyk7CisJCWZjX2V4Y2hfcmVjdihscCwgbHAtPmVtcCwgZnApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY29lX3JlY3ZfZmxvZ2kgLSBmbG9naSByZWNlaXZlIGZ1bmN0aW9uCisgKiBAZmM6IGFzc29jaWF0ZWQgZmNvZV9zb2Z0YworICogQGZwOiB0aGUgcmVjaWV2ZWQgZnJhbWUKKyAqIEBzYTogdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoaXMgZmxvZ2kKKyAqCisgKiBUaGlzIGlzIHJlc3BvbnNpYmxlIHRvIHBhcnNlIHRoZSBmbG9naSByZXNwb25zZSBhbmQgc2V0cyB0aGUgY29ycmVzcG9uZGluZworICogbWFjIGFkZHJlc3MgZm9yIHRoZSBpbml0aWF0b3IsIGVpdGVociBPVUkgYmFzZWQgb3IgR1cgYmFzZWQuCisgKgorICogUmV0dXJuczogbm9uZQorICoqLworc3RhdGljIHZvaWQgZmNvZV9yZWN2X2Zsb2dpKHN0cnVjdCBmY29lX3NvZnRjICpmYywgc3RydWN0IGZjX2ZyYW1lICpmcCwgdTggKnNhKQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXU4IG9wOworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpZiAoZmgtPmZoX3R5cGUgIT0gRkNfVFlQRV9FTFMpCisJCXJldHVybjsKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDICYmIGZoLT5maF9yX2N0bCA9PSBGQ19SQ1RMX0VMU19SRVAgJiYKKwkgICAgZmMtPmZsb2dpX294aWQgPT0gbnRvaHMoZmgtPmZoX294X2lkKSkgeworCQkvKgorCQkgKiBGTE9HSSBhY2NlcHRlZC4KKwkJICogSWYgdGhlIHNyYyBtYWMgYWRkciBpcyBGQ19PVUktYmFzZWQsIHRoZW4gd2UgbWFyayB0aGUKKwkJICogYWRkcmVzc19tb2RlIGZsYWcgdG8gdXNlIEZDX09VSS1iYXNlZCBFdGhlcm5ldCBEQS4KKwkJICogT3RoZXJ3aXNlIHdlIHVzZSB0aGUgRkNvRSBnYXRld2F5IGFkZHIKKwkJICovCisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHNhLCAodThbNl0pIEZDX0ZDT0VfRkxPR0lfTUFDKSkgeworCQkJZmMtPmFkZHJlc3NfbW9kZSA9IEZDT0VfRkNPVUlfQUREUl9NT0RFOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGZjLT5kZXN0X2FkZHIsIHNhLCBFVEhfQUxFTik7CisJCQlmYy0+YWRkcmVzc19tb2RlID0gRkNPRV9HV19BRERSX01PREU7CisJCX0KKworCQkvKgorCQkgKiBSZW1vdmUgYW55IHByZXZpb3VzbHktc2V0IHVuaWNhc3QgTUFDIGZpbHRlci4KKwkJICogQWRkIHNlY29uZGFyeSBGQ29FIE1BQyBhZGRyZXNzIGZpbHRlciBmb3Igb3VyIE9VSS4KKwkJICovCisJCXJ0bmxfbG9jaygpOworCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGZjLT5kYXRhX3NyY19hZGRyLCAodThbNl0pIHsgMCB9KSkKKwkJCWRldl91bmljYXN0X2RlbGV0ZShmYy0+cmVhbF9kZXYsIGZjLT5kYXRhX3NyY19hZGRyLAorCQkJCQkgICBFVEhfQUxFTik7CisJCWZjX2Zjb2Vfc2V0X21hYyhmYy0+ZGF0YV9zcmNfYWRkciwgZmgtPmZoX2RfaWQpOworCQlkZXZfdW5pY2FzdF9hZGQoZmMtPnJlYWxfZGV2LCBmYy0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOworCQlydG5sX3VubG9jaygpOworCisJCWZjLT5mbG9naV9wcm9ncmVzcyA9IDA7CisJfSBlbHNlIGlmIChvcCA9PSBFTFNfRkxPR0kgJiYgZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSAmJiBzYSkgeworCQkvKgorCQkgKiBTYXZlIHNvdXJjZSBNQUMgZm9yIHBvaW50LXRvLXBvaW50IHJlc3BvbnNlcy4KKwkJICovCisJCW1lbWNweShmYy0+ZGVzdF9hZGRyLCBzYSwgRVRIX0FMRU4pOworCQlmYy0+YWRkcmVzc19tb2RlID0gRkNPRV9HV19BRERSX01PREU7CisJfQorfQorCisvKioKKyAqIGZjb2Vfd2F0Y2hkb2cgLSBmY29lIHRpbWVyIGNhbGxiYWNrCisgKiBAdnA6CisgKgorICogVGhpcyBjaGVja3MgdGhlIHBlbmRpbmcgcXVldWUgbGVuZ3RoIGZvciBmY29lIGFuZCBwdXQgZmNvZSB0byBiZSBwYXVzZWQgc3RhdGUKKyAqIGlmIHRoZSBGQ09FX01BWF9RVUVVRV9ERVBUSCBpcyByZWFjaGVkLiBUaGlzIGlzIGRvbmUgZm9yIGFsbCBmY19scG9ydCBvbiB0aGUKKyAqIGZjb2VfaG9zdGxpc3QuCisgKgorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICoqLwordm9pZCBmY29lX3dhdGNoZG9nKHVsb25nIHZwKQoreworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjb2Vfc29mdGMgKmZjOworCWludCBwYXVzZWQgPSAwOworCisJcmVhZF9sb2NrKCZmY29lX2hvc3RsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmMsICZmY29lX2hvc3RsaXN0LCBsaXN0KSB7CisJCWxwID0gZmMtPmxwOworCQlpZiAobHApIHsKKwkJCWlmIChmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4gPiBGQ09FX01BWF9RVUVVRV9ERVBUSCkKKwkJCQlwYXVzZWQgPSAxOworCQkJaWYgKGZjb2VfY2hlY2tfd2FpdF9xdWV1ZShscCkgPAkgRkNPRV9NQVhfUVVFVUVfREVQVEgpIHsKKwkJCQlpZiAocGF1c2VkKQorCQkJCQlmY191bnBhdXNlKGxwKTsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZmNvZV9ob3N0bGlzdF9sb2NrKTsKKworCWZjb2VfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoMSAqIEhaKTsKKwlhZGRfdGltZXIoJmZjb2VfdGltZXIpOworfQorCisKKy8qKgorICogZmNvZV9jaGVja193YWl0X3F1ZXVlIC0gcHV0IHRoZSBza2IgaW50byBmY29lIHBlbmRpbmcgeG1pdCBxdWV1ZQorICogQGxwOiB0aGUgZmNfcG9ydCBmb3IgdGhpcyBza2IKKyAqIEBza2I6IHRoZSBhc3NvY2lhdGVkIHNrYiB0byBiZSB4bWl0dGVkCisgKgorICogVGhpcyBlbXB0aWVzIHRoZSB3YWl0X3F1ZXVlLCBkZXF1ZXVlIHRoZSBoZWFkIG9mIHRoZSB3YWl0X3F1ZXVlIHF1ZXVlCisgKiBhbmQgY2FsbHMgZmNvZV9zdGFydF9pbygpIGZvciBlYWNoIHBhY2tldCwgaWYgYWxsIHNrYiBoYXZlIGJlZW4KKyAqIHRyYW5zbWl0dGVkLCByZXR1cm4gMCBpZiBhIGVycm9yIG9jY3VycywgdGhlbiByZXN0b3JlIHdhaXRfcXVldWUgYW5kCisgKiB0cnkgYWdhaW4gbGF0ZXIuCisgKgorICogVGhlIHdhaXRfcXVldWUgaXMgdXNlZCB3aGVuIHRoZSBza2IgdHJhbnNtaXQgZmFpbHMuIHNrYiB3aWxsIGdvCisgKiBpbiB0aGUgd2FpdF9xdWV1ZSB3aGljaCB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIHRpbWUgZnVuY3Rpb24gT1IKKyAqIGJ5IHRoZSBuZXh0IHNrYiB0cmFuc21pdC4KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGZjb2VfY2hlY2tfd2FpdF9xdWV1ZShzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCWludCByYywgdW5wYXVzZSA9IDA7CisJaW50IHBhdXNlZCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisKKwlmYyA9IGZjb2Vfc29mdGMobHApOworCXNwaW5fbG9ja19iaCgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKKworCS8qCisJICogaXMgdGhpcyBpbnRlcmZhY2UgcGF1c2VkPworCSAqLworCWlmIChmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4gPiBGQ09FX01BWF9RVUVVRV9ERVBUSCkKKwkJcGF1c2VkID0gMTsKKwlpZiAoZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5xbGVuKSB7CisJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZSkpICE9IE5VTEwpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworCQkJcmMgPSBmY29lX3N0YXJ0X2lvKHNrYik7CisJCQlpZiAocmMpIHsKKwkJCQlmY29lX2luc2VydF93YWl0X3F1ZXVlX2hlYWQobHAsIHNrYik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJc3Bpbl9sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworCQl9CisJCWlmIChmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4gPCBGQ09FX01BWF9RVUVVRV9ERVBUSCkKKwkJCXVucGF1c2UgPSAxOworCX0KKwlzcGluX3VubG9ja19iaCgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKKwlpZiAoKHVucGF1c2UpICYmIChwYXVzZWQpKQorCQlmY191bnBhdXNlKGxwKTsKKwlyZXR1cm4gZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5xbGVuOworfQorCisvKioKKyAqIGZjb2VfaW5zZXJ0X3dhaXRfcXVldWVfaGVhZCAtIHB1dHMgc2tiIHRvIGZjb2UgcGVuZGluZyBxdWV1ZSBoZWFkCisgKiBAbHA6IHRoZSBmY19wb3J0IGZvciB0aGlzIHNrYgorICogQHNrYjogdGhlIGFzc29jaWF0ZWQgc2tiIHRvIGJlIHhtaXR0ZWQKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKiovCitzdGF0aWMgdm9pZCBmY29lX2luc2VydF93YWl0X3F1ZXVlX2hlYWQoc3RydWN0IGZjX2xwb3J0ICpscCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisKKwlmYyA9IGZjb2Vfc29mdGMobHApOworCXNwaW5fbG9ja19iaCgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKKwlfX3NrYl9xdWV1ZV9oZWFkKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLCBza2IpOworCXNwaW5fdW5sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworfQorCisvKioKKyAqIGZjb2VfaW5zZXJ0X3dhaXRfcXVldWUgLSBwdXQgdGhlIHNrYiBpbnRvIGZjb2UgcGVuZGluZyBxdWV1ZSB0YWlsCisgKiBAbHA6IHRoZSBmY19wb3J0IGZvciB0aGlzIHNrYgorICogQHNrYjogdGhlIGFzc29jaWF0ZWQgc2tiIHRvIGJlIHhtaXR0ZWQKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKiovCitzdGF0aWMgdm9pZCBmY29lX2luc2VydF93YWl0X3F1ZXVlKHN0cnVjdCBmY19scG9ydCAqbHAsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisKKwlmYyA9IGZjb2Vfc29mdGMobHApOworCXNwaW5fbG9ja19iaCgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZS5sb2NrKTsKKwlfX3NrYl9xdWV1ZV90YWlsKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLCBza2IpOworCXNwaW5fdW5sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworfQorCisvKioKKyAqIGZjb2VfZGV2X3NldHVwIC0gc2V0dXAgbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uIGludGVyZmFjZQorICoKKyAqKi8KK3N0YXRpYyB2b2lkIGZjb2VfZGV2X3NldHVwKHZvaWQpCit7CisJLyoKKwkgKiBoZXJlIHNldHVwIGEgaW50ZXJmYWNlIHNwZWNpZmljIHdkIHRpbWUgdG8KKwkgKiBtb25pdG9yIHRoZSBsaW5rIHN0YXRlCisJICovCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmY29lX25vdGlmaWVyKTsKK30KKworLyoqCisgKiBmY29lX2Rldl9zZXR1cCAtIGNsZWFudXAgbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uIGludGVyZmFjZQorICoqLworc3RhdGljIHZvaWQgZmNvZV9kZXZfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmY29lX25vdGlmaWVyKTsKK30KKworLyoqCisgKiBmY29lX2RldmljZV9ub3RpZmljYXRpb24gLSBuZXRkZXYgZXZlbnQgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBAbm90aWZpZXI6IGNvbnRleHQgb2YgdGhlIG5vdGlmaWNhdGlvbgorICogQGV2ZW50OiB0eXBlIG9mIGV2ZW50CisgKiBAcHRyOiBmaXhlZCBhcnJheSBmb3Igb3V0cHV0IHBhcnNlZCBpZm5hbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgZXRoZXJuZXQgZHJpdmVyIGluIGNhc2Ugb2YgbGluayBjaGFuZ2UgZXZlbnQKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGZjb2VfZGV2aWNlX25vdGlmaWNhdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCSAgICB1bG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHB0cjsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmM7CisJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpzdGF0czsKKwl1MTYgbmV3X3N0YXR1czsKKwl1MzIgbWZzOworCWludCByYyA9IE5PVElGWV9PSzsKKworCXJlYWRfbG9jaygmZmNvZV9ob3N0bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmZmNvZV9ob3N0bGlzdCwgbGlzdCkgeworCQlpZiAoZmMtPnJlYWxfZGV2ID09IHJlYWxfZGV2KSB7CisJCQlscCA9IGZjLT5scDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZmY29lX2hvc3RsaXN0X2xvY2spOworCWlmIChscCA9PSBOVUxMKSB7CisJCXJjID0gTk9USUZZX0RPTkU7CisJCWdvdG8gb3V0OworCX0KKworCW5ld19zdGF0dXMgPSBscC0+bGlua19zdGF0dXM7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0RPV046CisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwkJbmV3X3N0YXR1cyAmPSB+RkNfTElOS19VUDsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVVA6CisJY2FzZSBORVRERVZfQ0hBTkdFOgorCQluZXdfc3RhdHVzICY9IH5GQ19MSU5LX1VQOworCQlpZiAoIWZjb2VfbGlua19vayhscCkpCisJCQluZXdfc3RhdHVzIHw9IEZDX0xJTktfVVA7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKwkJbWZzID0gZmMtPnJlYWxfZGV2LT5tdHUgLQorCQkJKHNpemVvZihzdHJ1Y3QgZmNvZV9oZHIpICsKKwkJCSBzaXplb2Yoc3RydWN0IGZjb2VfY3JjX2VvZikpOworCQlpZiAobWZzID49IEZDX01JTl9NQVhfRlJBTUUpCisJCQlmY19zZXRfbWZzKGxwLCBtZnMpOworCQluZXdfc3RhdHVzICY9IH5GQ19MSU5LX1VQOworCQlpZiAoIWZjb2VfbGlua19vayhscCkpCisJCQluZXdfc3RhdHVzIHw9IEZDX0xJTktfVVA7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1JFR0lTVEVSOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlGQ19EQkcoInVua25vd24gZXZlbnQgJWxkIGNhbGwiLCBldmVudCk7CisJfQorCWlmIChscC0+bGlua19zdGF0dXMgIT0gbmV3X3N0YXR1cykgeworCQlpZiAoKG5ld19zdGF0dXMgJiBGQ19MSU5LX1VQKSA9PSBGQ19MSU5LX1VQKQorCQkJZmNfbGlua3VwKGxwKTsKKwkJZWxzZSB7CisJCQlzdGF0cyA9IGxwLT5kZXZfc3RhdHNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwkJCWlmIChzdGF0cykKKwkJCQlzdGF0cy0+TGlua0ZhaWx1cmVDb3VudCsrOworCQkJZmNfbGlua2Rvd24obHApOworCQkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwKTsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZmNvZV9pZl90b19uZXRkZXYgLSBwYXJzZSBhIG5hbWUgYnVmZmVyIHRvIGdldCBuZXRkZXYKKyAqIEBpZm5hbWU6IGZpeGVkIGFycmF5IGZvciBvdXRwdXQgcGFyc2VkIGlmbmFtZQorICogQGJ1ZmZlcjogaW5jb21pbmcgYnVmZmVyIHRvIGJlIGNvcGllZAorICoKKyAqIFJldHVybnM6IE5VTEwgb3IgcHRyIHRvIG5ldGRlaXZlCisgKiovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZjb2VfaWZfdG9fbmV0ZGV2KGNvbnN0IGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICpjcDsKKwljaGFyIGlmbmFtZVtJRk5BTVNJWiArIDJdOworCisJaWYgKGJ1ZmZlcikgeworCQlzdHJsY3B5KGlmbmFtZSwgYnVmZmVyLCBJRk5BTVNJWik7CisJCWNwID0gaWZuYW1lICsgc3RybGVuKGlmbmFtZSk7CisJCXdoaWxlICgtLWNwID49IGlmbmFtZSAmJiAqY3AgPT0gJ1xuJykKKwkJCSpjcCA9ICdcMCc7CisJCXJldHVybiBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpZm5hbWUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBmY29lX25ldGRldl90b19tb2R1bGVfb3duZXIgLSBmaW5kcyBvdXQgdGhlIG5pYyBkcml2ZSBtb2RkdWxlIG9mIHRoZSBuZXRkZXYKKyAqIEBuZXRkZXY6IHRoZSB0YXJnZXQgbmV0ZGV2CisgKgorICogUmV0dXJuczogcHRyIHRvIHRoZSBzdHJ1Y3QgbW9kdWxlLCBOVUxMIGZvciBmYWlsdXJlCisgKiovCitzdGF0aWMgc3RydWN0IG1vZHVsZSAqZmNvZV9uZXRkZXZfdG9fbW9kdWxlX293bmVyKAorCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKCFuZXRkZXYpCisJCXJldHVybiBOVUxMOworCisJZGV2ID0gbmV0ZGV2LT5kZXYucGFyZW50OworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGV2LT5kcml2ZXIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRldi0+ZHJpdmVyLT5vd25lcjsKK30KKworLyoqCisgKiBmY29lX2V0aGRydl9nZXQgLSBob2xkcyB0aGUgbmljIGRyaXZlciBtb2R1bGUgYnkgIHRyeV9tb2R1bGVfZ2V0KCkgZm9yCisgKiB0aGUgY29ycmVzcG9uZGluZyBuZXRkZXYuCisgKiBAbmV0ZGV2OiB0aGUgdGFyZ2V0IG5ldGRldgorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nzc3MKKyAqKi8KK3N0YXRpYyBpbnQgZmNvZV9ldGhkcnZfZ2V0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwlvd25lciA9IGZjb2VfbmV0ZGV2X3RvX21vZHVsZV9vd25lcihuZXRkZXYpOworCWlmIChvd25lcikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZTpob2xkIGRyaXZlciBtb2R1bGUgJXMgZm9yICVzXG4iLAorCQkgICAgICAgbW9kdWxlX25hbWUob3duZXIpLCBuZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gIHRyeV9tb2R1bGVfZ2V0KG93bmVyKTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qKgorICogZmNvZV9ldGhkcnZfZ2V0IC0gcmVsZWFzZXMgdGhlIG5pYyBkcml2ZXIgbW9kdWxlIGJ5IG1vZHVsZV9wdXQgZm9yCisgKiB0aGUgY29ycmVzcG9uZGluZyBuZXRkZXYuCisgKiBAbmV0ZGV2OiB0aGUgdGFyZ2V0IG5ldGRldgorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nzc3MKKyAqKi8KK3N0YXRpYyBpbnQgZmNvZV9ldGhkcnZfcHV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwlvd25lciA9IGZjb2VfbmV0ZGV2X3RvX21vZHVsZV9vd25lcihuZXRkZXYpOworCWlmIChvd25lcikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZmNvZTpyZWxlYXNlIGRyaXZlciBtb2R1bGUgJXMgZm9yICVzXG4iLAorCQkgICAgICAgbW9kdWxlX25hbWUob3duZXIpLCBuZXRkZXYtPm5hbWUpOworCQltb2R1bGVfcHV0KG93bmVyKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKioKKyAqIGZjb2VfZGVzdHJveS0gaGFuZGxlcyB0aGUgZGVzdHJveSBmcm9tIHN5c2ZzCisgKiBAYnVmZmVyOiBleHBjdGVkIHRvIGJlIGEgZXRoIGlmIG5hbWUKKyAqIEBrcDogYXNzb2NpYXRlZCBrZXJuZWwgcGFyYW0KKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGZjb2VfZGVzdHJveShjb25zdCBjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJbmV0ZGV2ID0gZmNvZV9pZl90b19uZXRkZXYoYnVmZmVyKTsKKwlpZiAoIW5ldGRldikgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X25vZGV2OworCX0KKwkvKiBsb29rIGZvciBleGlzdGluZyBscG9ydCAqLworCWlmICghZmNvZV9ob3N0bGlzdF9sb29rdXAobmV0ZGV2KSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3B1dGRldjsKKwl9CisJLyogcGFzcyB0byB0cmFuc3BvcnQgKi8KKwlyYyA9IGZjb2VfdHJhbnNwb3J0X3JlbGVhc2UobmV0ZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmY29lOiBmY29lX3RyYW5zcG9ydF9yZWxlYXNlKCVzKSBmYWlsZWRcbiIsCisJCSAgICAgICBuZXRkZXYtPm5hbWUpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0X3B1dGRldjsKKwl9CisJZmNvZV9ldGhkcnZfcHV0KG5ldGRldik7CisJcmMgPSAwOworb3V0X3B1dGRldjoKKwlkZXZfcHV0KG5ldGRldik7CitvdXRfbm9kZXY6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZjb2VfY3JlYXRlIC0gaGFuZGxlcyB0aGUgY3JlYXRlIGNhbGwgZnJvbSBzeXNmcworICogQGJ1ZmZlcjogZXhwY3RlZCB0byBiZSBhIGV0aCBpZiBuYW1lCisgKiBAa3A6IGFzc29jaWF0ZWQga2VybmVsIHBhcmFtCisgKgorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICoqLworc3RhdGljIGludCBmY29lX2NyZWF0ZShjb25zdCBjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCByYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJbmV0ZGV2ID0gZmNvZV9pZl90b19uZXRkZXYoYnVmZmVyKTsKKwlpZiAoIW5ldGRldikgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X25vZGV2OworCX0KKwkvKiBsb29rIGZvciBleGlzdGluZyBscG9ydCAqLworCWlmIChmY29lX2hvc3RsaXN0X2xvb2t1cChuZXRkZXYpKSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXRfcHV0ZGV2OworCX0KKwlmY29lX2V0aGRydl9nZXQobmV0ZGV2KTsKKworCS8qIHBhc3MgdG8gdHJhbnNwb3J0ICovCisJcmMgPSBmY29lX3RyYW5zcG9ydF9hdHRhY2gobmV0ZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmY29lOiBmY29lX3RyYW5zcG9ydF9hdHRhY2goJXMpIGZhaWxlZFxuIiwKKwkJICAgICAgIG5ldGRldi0+bmFtZSk7CisJCWZjb2VfZXRoZHJ2X3B1dChuZXRkZXYpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0X3B1dGRldjsKKwl9CisJcmMgPSAwOworb3V0X3B1dGRldjoKKwlkZXZfcHV0KG5ldGRldik7CitvdXRfbm9kZXY6CisJcmV0dXJuIHJjOworfQorCittb2R1bGVfcGFyYW1fY2FsbChjcmVhdGUsIGZjb2VfY3JlYXRlLCBOVUxMLCBOVUxMLCBTX0lXVVNSKTsKK19fTU9EVUxFX1BBUk1fVFlQRShjcmVhdGUsICJzdHJpbmciKTsKK01PRFVMRV9QQVJNX0RFU0MoY3JlYXRlLCAiQ3JlYXRlIGZjb2UgcG9ydCB1c2luZyBuZXQgZGV2aWNlIHBhc3NlZCBpbi4iKTsKK21vZHVsZV9wYXJhbV9jYWxsKGRlc3Ryb3ksIGZjb2VfZGVzdHJveSwgTlVMTCwgTlVMTCwgU19JV1VTUik7CitfX01PRFVMRV9QQVJNX1RZUEUoZGVzdHJveSwgInN0cmluZyIpOworTU9EVUxFX1BBUk1fREVTQyhkZXN0cm95LCAiRGVzdHJveSBmY29lIHBvcnQiKTsKKworLyoKKyAqIGZjb2VfbGlua19vayAtIGNoZWNrIGlmIGxpbmsgaXMgb2sgZm9yIHRoZSBmY19scG9ydAorICogQGxwOiBwdHIgdG8gdGhlIGZjX2xwb3J0CisgKgorICogQW55IHBlcm1hbmVudGx5LWRpc3F1YWxpZnlpbmcgY29uZGl0aW9ucyBoYXZlIGJlZW4gcHJldmlvdXNseSBjaGVja2VkLgorICogVGhpcyBhbHNvIHVwZGF0ZXMgdGhlIHNwZWVkIHNldHRpbmcsIHdoaWNoIG1heSBjaGFuZ2Ugd2l0aCBsaW5rIGZvciAxMDAvMTAwMC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBiZSBjaGVja2luZyBmb3IgUEFVU0Ugc3VwcG9ydCBhdCBzb21lIHBvaW50CisgKiBpbiB0aGUgZnV0dXJlLiBDdXJyZW50bHkgUGVyLXByaW9yaXR5LXBhdXNlIGlzIG5vdCBkZXRlcm1pbmFibGUgdXNpbmcKKyAqIGV0aHRvb2wsIHNvIHdlIHNob3VsZG4ndCBiZSByZXN0cmljdGl2ZSB1bnRpbCB0aGF0IHByb2JsZW0gaXMgcmVzb2x2ZWQuCisgKgorICogUmV0dXJuczogMCBpZiBsaW5rIGlzIE9LIGZvciB1c2UgYnkgRkNvRS4KKyAqCisgKi8KK2ludCBmY29lX2xpbmtfb2soc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmMgPSBmY29lX3NvZnRjKGxwKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmMtPnJlYWxfZGV2OworCXN0cnVjdCBldGh0b29sX2NtZCBlY21kID0geyBFVEhUT09MX0dTRVQgfTsKKwlpbnQgcmMgPSAwOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJZGV2ID0gZmMtPnBoeXNfZGV2OworCQlpZiAoZGV2LT5ldGh0b29sX29wcy0+Z2V0X3NldHRpbmdzKSB7CisJCQlkZXYtPmV0aHRvb2xfb3BzLT5nZXRfc2V0dGluZ3MoZGV2LCAmZWNtZCk7CisJCQlscC0+bGlua19zdXBwb3J0ZWRfc3BlZWRzICY9CisJCQkJfihGQ19QT1JUU1BFRURfMUdCSVQgfCBGQ19QT1JUU1BFRURfMTBHQklUKTsKKwkJCWlmIChlY21kLnN1cHBvcnRlZCAmIChTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKQorCQkJCWxwLT5saW5rX3N1cHBvcnRlZF9zcGVlZHMgfD0gRkNfUE9SVFNQRUVEXzFHQklUOworCQkJaWYgKGVjbWQuc3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCkKKwkJCQlscC0+bGlua19zdXBwb3J0ZWRfc3BlZWRzIHw9CisJCQkJCUZDX1BPUlRTUEVFRF8xMEdCSVQ7CisJCQlpZiAoZWNtZC5zcGVlZCA9PSBTUEVFRF8xMDAwKQorCQkJCWxwLT5saW5rX3NwZWVkID0gRkNfUE9SVFNQRUVEXzFHQklUOworCQkJaWYgKGVjbWQuc3BlZWQgPT0gU1BFRURfMTAwMDApCisJCQkJbHAtPmxpbmtfc3BlZWQgPSBGQ19QT1JUU1BFRURfMTBHQklUOworCQl9CisJfSBlbHNlCisJCXJjID0gLTE7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX2xpbmtfb2spOworCisvKgorICogZmNvZV9wZXJjcHVfY2xlYW4gLSBmcmVlcyBza2Igb2YgdGhlIGNvcnJlc3BvbmRpbmcgbHBvcnQgZnJvbSB0aGUgcGVyCisgKiBjcHUgcXVldWUuCisgKiBAbHA6IHRoZSBmY19scG9ydAorICovCit2b2lkIGZjb2VfcGVyY3B1X2NsZWFuKHN0cnVjdCBmY19scG9ydCAqbHApCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqcHA7CisJc3RydWN0IGZjb2VfcmN2X2luZm8gKmZyOworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3Q7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5SX0NQVVM7IGlkeCsrKSB7CisJCWlmIChmY29lX3BlcmNwdVtpZHhdKSB7CisJCQlwcCA9IGZjb2VfcGVyY3B1W2lkeF07CisJCQlzcGluX2xvY2tfYmgoJnBwLT5mY29lX3J4X2xpc3QubG9jayk7CisJCQlsaXN0ID0gJnBwLT5mY29lX3J4X2xpc3Q7CisJCQloZWFkID0gbGlzdC0+bmV4dDsKKwkJCWZvciAoc2tiID0gaGVhZDsgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKWxpc3Q7CisJCQkgICAgIHNrYiA9IG5leHQpIHsKKwkJCQluZXh0ID0gc2tiLT5uZXh0OworCQkJCWZyID0gZmNvZV9kZXZfZnJvbV9za2Ioc2tiKTsKKwkJCQlpZiAoZnItPmZyX2RldiA9PSBscCkgeworCQkJCQlfX3NrYl91bmxpbmsoc2tiLCBsaXN0KTsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJnBwLT5mY29lX3J4X2xpc3QubG9jayk7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX3BlcmNwdV9jbGVhbik7CisKKy8qKgorICogZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlIC0gZGVxdWV1ZSBza2IgYW5kIGZyZWUgaXQKKyAqIEBscDogdGhlIGNvcnJlc3BvbmRpbmcgZmNfbHBvcnQKKyAqCisgKiBSZXR1cm5zOiBub25lCisgKiovCit2b2lkIGZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCXN0cnVjdCBmY29lX3NvZnRjICAqZmMgPSBscG9ydF9wcml2KGxwKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc3Bpbl9sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmZmMtPmZjb2VfcGVuZGluZ19xdWV1ZSkpICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmZjLT5mY29lX3BlbmRpbmdfcXVldWUubG9jayk7CisJCWtmcmVlX3NrYihza2IpOworCQlzcGluX2xvY2tfYmgoJmZjLT5mY29lX3BlbmRpbmdfcXVldWUubG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZmYy0+ZmNvZV9wZW5kaW5nX3F1ZXVlLmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKTsKKworLyoqCisgKiBsaWJmY19ob3N0X2FsbG9jIC0gYWxsb2NhdGUgYSBTY3NpX0hvc3Qgd2l0aCByb29tIGZvciB0aGUgZmNfbHBvcnQKKyAqIEBzaHQ6IHB0ciB0byB0aGUgc2NzaSBob3N0IHRlbXBsCisgKiBAcHJpdl9zaXplOiBzaXplIG9mIHByaXZhdGUgZGF0YSBhZnRlciBmY19scG9ydAorICoKKyAqIFJldHVybnM6IHB0ciB0byBTY3NpX0hvc3QKKyAqIFRPRE8gLSB0byBsaWJmYz8KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICpsaWJmY19ob3N0X2FsbG9jKAorCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgaW50IHByaXZfc2l6ZSkKK3sKKwlyZXR1cm4gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHN0cnVjdCBmY19scG9ydCkgKyBwcml2X3NpemUpOworfQorCisvKioKKyAqIGZjb2VfaG9zdF9hbGxvYyAtIGFsbG9jYXRlIGEgU2NzaV9Ib3N0IHdpdGggcm9vbSBmb3IgdGhlIGZjb2Vfc29mdGMKKyAqIEBzaHQ6IHB0ciB0byB0aGUgc2NzaSBob3N0IHRlbXBsCisgKiBAcHJpdl9zaXplOiBzaXplIG9mIHByaXZhdGUgZGF0YSBhZnRlciBmY19scG9ydAorICoKKyAqIFJldHVybnM6IHB0ciB0byBTY3NpX0hvc3QKKyAqLworc3RydWN0IFNjc2lfSG9zdCAqZmNvZV9ob3N0X2FsbG9jKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgaW50IHByaXZfc2l6ZSkKK3sKKwlyZXR1cm4gbGliZmNfaG9zdF9hbGxvYyhzaHQsIHNpemVvZihzdHJ1Y3QgZmNvZV9zb2Z0YykgKyBwcml2X3NpemUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9ob3N0X2FsbG9jKTsKKworLyoKKyAqIGZjb2VfcmVzZXQgLSByZXNldHMgdGhlIGZjb2UKKyAqIEBzaG9zdDogc2hvc3QgdGhlIHJlc2V0IGlzIGZyb20KKyAqCisgKiBSZXR1cm5zOiBhbHdheXMgMAorICovCitpbnQgZmNvZV9yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CisJZmNfbHBvcnRfcmVzZXQobHBvcnQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9yZXNldCk7CisKKy8qCisgKiBmY29lX3d3bl9mcm9tX21hYyAtIGNvbnZlcnRzIDQ4LWJpdCBJRUVFIE1BQyBhZGRyZXNzIHRvIDY0LWJpdCBGQyBXV04uCisgKiBAbWFjOiBtYWMgYWRkcmVzcworICogQHNjaGVtZTogY2hlY2sgcG9ydAorICogQHBvcnQ6IHBvcnQgaW5kaWNhdG9yIGZvciBjb252ZXJ0aW5nCisgKgorICogUmV0dXJuczogdTY0IGZjIHdvcmxkIHdpZGUgbmFtZQorICovCit1NjQgZmNvZV93d25fZnJvbV9tYWModW5zaWduZWQgY2hhciBtYWNbTUFYX0FERFJfTEVOXSwKKwkJICAgICAgdW5zaWduZWQgaW50IHNjaGVtZSwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdTY0IHd3bjsKKwl1NjQgaG9zdF9tYWM7CisKKwkvKiBUaGUgTUFDIGlzIGluIE5PLCBzbyBmbGlwIG9ubHkgdGhlIGxvdyA0OCBiaXRzICovCisJaG9zdF9tYWMgPSAoKHU2NCkgbWFjWzBdIDw8IDQwKSB8CisJCSgodTY0KSBtYWNbMV0gPDwgMzIpIHwKKwkJKCh1NjQpIG1hY1syXSA8PCAyNCkgfAorCQkoKHU2NCkgbWFjWzNdIDw8IDE2KSB8CisJCSgodTY0KSBtYWNbNF0gPDwgOCkgfAorCQkodTY0KSBtYWNbNV07CisKKwlXQVJOX09OKGhvc3RfbWFjID49ICgxVUxMIDw8IDQ4KSk7CisJd3duID0gaG9zdF9tYWMgfCAoKHU2NCkgc2NoZW1lIDw8IDYwKTsKKwlzd2l0Y2ggKHNjaGVtZSkgeworCWNhc2UgMToKKwkJV0FSTl9PTihwb3J0ICE9IDApOworCQlicmVhazsKKwljYXNlIDI6CisJCVdBUk5fT04ocG9ydCA+PSAweGZmZik7CisJCXd3biB8PSAodTY0KSBwb3J0IDw8IDQ4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gd3duOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV93d25fZnJvbV9tYWMpOworLyoKKyAqIGZjb2VfaG9zdGxpc3RfbG9va3VwX3NvZnRjIC0gZmluZCB0aGUgY29ycmVzcG9uZGluZyBscG9ydCBieSBhIGdpdmVuIGRldmljZQorICogQGRldmljZTogdGhpcyBpcyBjdXJyZW50bHkgcHRyIHRvIG5ldF9kZXZpY2UKKyAqCisgKiBSZXR1cm5zOiBOVUxMIG9yIHRoZSBsb2NhdGVkIGZjb2Vfc29mdGMKKyAqLworc3RhdGljIHN0cnVjdCBmY29lX3NvZnRjICpmY29lX2hvc3RsaXN0X2xvb2t1cF9zb2Z0YygKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKworCXJlYWRfbG9jaygmZmNvZV9ob3N0bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmZmNvZV9ob3N0bGlzdCwgbGlzdCkgeworCQlpZiAoZmMtPnJlYWxfZGV2ID09IGRldikgeworCQkJcmVhZF91bmxvY2soJmZjb2VfaG9zdGxpc3RfbG9jayk7CisJCQlyZXR1cm4gZmM7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmZjb2VfaG9zdGxpc3RfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBmY29lX2hvc3RsaXN0X2xvb2t1cCAtIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbHBvcnQgYnkgbmV0ZGV2CisgKiBAbmV0ZGV2OiBwdHIgdG8gbmV0X2RldmljZQorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RydWN0IGZjX2xwb3J0ICpmY29lX2hvc3RsaXN0X2xvb2t1cChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKworCWZjID0gZmNvZV9ob3N0bGlzdF9sb29rdXBfc29mdGMobmV0ZGV2KTsKKworCXJldHVybiAoZmMpID8gZmMtPmxwIDogTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZjb2VfaG9zdGxpc3RfbG9va3VwKTsKKworLyoKKyAqIGZjb2VfaG9zdGxpc3RfYWRkIC0gYWRkIGEgbHBvcnQgdG8gbHBvcnRzIGxpc3QKKyAqIEBscDogcHRyIHRvIHRoZSBmY19scG9ydCB0byBiYWRkZWQKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK2ludCBmY29lX2hvc3RsaXN0X2FkZChjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKworCWZjID0gZmNvZV9ob3N0bGlzdF9sb29rdXBfc29mdGMoZmNvZV9uZXRkZXYobHApKTsKKwlpZiAoIWZjKSB7CisJCWZjID0gZmNvZV9zb2Z0YyhscCk7CisJCXdyaXRlX2xvY2tfYmgoJmZjb2VfaG9zdGxpc3RfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmZjLT5saXN0LCAmZmNvZV9ob3N0bGlzdCk7CisJCXdyaXRlX3VubG9ja19iaCgmZmNvZV9ob3N0bGlzdF9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX2hvc3RsaXN0X2FkZCk7CisKKy8qCisgKiBmY29lX2hvc3RsaXN0X3JlbW92ZSAtIHJlbW92ZSBhIGxwb3J0IGZyb20gbHBvcnRzIGxpc3QKKyAqIEBscDogcHRyIHRvIHRoZSBmY19scG9ydCB0byBiYWRkZWQKKyAqCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK2ludCBmY29lX2hvc3RsaXN0X3JlbW92ZShjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCXN0cnVjdCBmY29lX3NvZnRjICpmYzsKKworCWZjID0gZmNvZV9ob3N0bGlzdF9sb29rdXBfc29mdGMoZmNvZV9uZXRkZXYobHApKTsKKwlCVUdfT04oIWZjKTsKKwl3cml0ZV9sb2NrX2JoKCZmY29lX2hvc3RsaXN0X2xvY2spOworCWxpc3RfZGVsKCZmYy0+bGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZmY29lX2hvc3RsaXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmY29lX2hvc3RsaXN0X3JlbW92ZSk7CisKKy8qKgorICogZmNvZV9saWJmY19jb25maWcgLSBzZXRzIHVwIGxpYmZjIHJlbGF0ZWQgcHJvcGVydGllcyBmb3IgbHBvcnQKKyAqIEBscDogcHRyIHRvIHRoZSBmY19scG9ydAorICogQHR0OiBsaWJmYyBmdW5jdGlvbiB0ZW1wbGF0ZQorICoKKyAqIFJldHVybnMgOiAwIGZvciBzdWNjZXNzCisgKiovCitpbnQgZmNvZV9saWJmY19jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICp0dCkKK3sKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHNldCBieSB0aGUgTExERCAqLworCW1lbWNweSgmbHAtPnR0LCB0dCwgc2l6ZW9mKCp0dCkpOworCWlmIChmY19mY3BfaW5pdChscCkpCisJCXJldHVybiAtRU5PTUVNOworCWZjX2V4Y2hfaW5pdChscCk7CisJZmNfZWxzY3RfaW5pdChscCk7CisJZmNfbHBvcnRfaW5pdChscCk7CisJZmNfcnBvcnRfaW5pdChscCk7CisJZmNfZGlzY19pbml0KGxwKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV9saWJmY19jb25maWcpOworCisvKioKKyAqIGZjb2VfaW5pdCAtIGZjb2UgbW9kdWxlIGxvYWRpbmcgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBJbml0aWFsaXphdGlvbiByb3V0aW5lCisgKiAxLiBXaWxsIGNyZWF0ZSBmYyB0cmFuc3BvcnQgc29mdHdhcmUgc3RydWN0dXJlCisgKiAyLiBpbml0aWFsaXplIHRoZSBsaW5rIGxpc3Qgb2YgcG9ydCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBfX2luaXQgZmNvZV9pbml0KHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqcDsKKworCisJSU5JVF9MSVNUX0hFQUQoJmZjb2VfaG9zdGxpc3QpOworCXJ3bG9ja19pbml0KCZmY29lX2hvc3RsaXN0X2xvY2spOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZmY29lX2NwdV9ub3RpZmllcik7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKKwkvKgorCSAqIGluaXRpYWxpemUgcGVyIENQVSBpbnRlcnJ1cHQgdGhyZWFkCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmY29lX3BlcmNwdV9zKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwKSB7CisJCQlwLT50aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCwKKwkJCQkJCSAgICh2b2lkICopcCwKKwkJCQkJCSAgICJmY29ldGhyZWFkLyVkIiwgY3B1KTsKKworCQkJLyoKKwkJCSAqIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRoZW4gYmluZCB0aGUgdGhyZWFkIHRvIHRoZSBjcHUKKwkJCSAqIGluaXRpYWxpemUgdGhlIHNlbWFwaG9yZSBhbmQgc2tiIHF1ZXVlIGhlYWQKKwkJCSAqLworCQkJaWYgKGxpa2VseSghSVNfRVJSKHAtPnRocmVhZCkpKSB7CisJCQkJcC0+Y3B1ID0gY3B1OworCQkJCWZjb2VfcGVyY3B1W2NwdV0gPSBwOworCQkJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnAtPmZjb2VfcnhfbGlzdCk7CisJCQkJa3RocmVhZF9iaW5kKHAtPnRocmVhZCwgY3B1KTsKKwkJCQl3YWtlX3VwX3Byb2Nlc3MocC0+dGhyZWFkKTsKKwkJCX0gZWxzZSB7CisJCQkJZmNvZV9wZXJjcHVbY3B1XSA9IE5VTEw7CisJCQkJa2ZyZWUocCk7CisKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogc2V0dXAgbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uCisJICovCisJZmNvZV9kZXZfc2V0dXAoKTsKKworCWluaXRfdGltZXIoJmZjb2VfdGltZXIpOworCWZjb2VfdGltZXIuZGF0YSA9IDA7CisJZmNvZV90aW1lci5mdW5jdGlvbiA9IGZjb2Vfd2F0Y2hkb2c7CisJZmNvZV90aW1lci5leHBpcmVzID0gKGppZmZpZXMgKyAoMTAgKiBIWikpOworCWFkZF90aW1lcigmZmNvZV90aW1lcik7CisKKwkvKiBpbml0aWF0bGl6ZSB0aGUgZmNvZSB0cmFuc3BvcnQgKi8KKwlmY29lX3RyYW5zcG9ydF9pbml0KCk7CisKKwlmY29lX3N3X2luaXQoKTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZmNvZV9pbml0KTsKKworLyoqCisgKiBmY29lX2V4aXQgLSBmY29lIG1vZHVsZSB1bmxvYWRpbmcgY2xlYW51cAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgdm9pZCBfX2V4aXQgZmNvZV9leGl0KHZvaWQpCit7CisJdTMyIGlkeDsKKwlzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmMsICp0bXA7CisJc3RydWN0IGZjb2VfcGVyY3B1X3MgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qCisJICogU3RvcCBhbGwgY2FsbCBiYWNrIGludGVyZmFjZXMKKwkgKi8KKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmZmNvZV9jcHVfbm90aWZpZXIpOworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCWZjb2VfZGV2X2NsZWFudXAoKTsKKworCS8qCisJICogc3RvcCB0aW1lcgorCSAqLworCWRlbF90aW1lcl9zeW5jKCZmY29lX3RpbWVyKTsKKworCS8qIHJlbGVhc2VzIHRoZSBhc3NvY2FpdGVkIGZjb2UgdHJhbnNwb3J0IGZvciBlYWNoIGxwb3J0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjLCB0bXAsICZmY29lX2hvc3RsaXN0LCBsaXN0KQorCQlmY29lX3RyYW5zcG9ydF9yZWxlYXNlKGZjLT5yZWFsX2Rldik7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5SX0NQVVM7IGlkeCsrKSB7CisJCWlmIChmY29lX3BlcmNwdVtpZHhdKSB7CisJCQlrdGhyZWFkX3N0b3AoZmNvZV9wZXJjcHVbaWR4XS0+dGhyZWFkKTsKKwkJCXAgPSBmY29lX3BlcmNwdVtpZHhdOworCQkJc3Bpbl9sb2NrX2JoKCZwLT5mY29lX3J4X2xpc3QubG9jayk7CisJCQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnAtPmZjb2VfcnhfbGlzdCkpICE9IE5VTEwpCisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlzcGluX3VubG9ja19iaCgmcC0+ZmNvZV9yeF9saXN0LmxvY2spOworCQkJaWYgKGZjb2VfcGVyY3B1W2lkeF0tPmNyY19lb2ZfcGFnZSkKKwkJCQlwdXRfcGFnZShmY29lX3BlcmNwdVtpZHhdLT5jcmNfZW9mX3BhZ2UpOworCQkJa2ZyZWUoZmNvZV9wZXJjcHVbaWR4XSk7CisJCX0KKwl9CisKKwkvKiByZW1vdmUgc3cgdHJhc25wb3J0ICovCisJZmNvZV9zd19leGl0KCk7CisKKwkvKiBkZXRhY2ggdGhlIHRyYW5zcG9ydCAqLworCWZjb2VfdHJhbnNwb3J0X2V4aXQoKTsKK30KK21vZHVsZV9leGl0KGZjb2VfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jIGIvZHJpdmVycy9zY3NpL2Zkb21haW4uYwppbmRleCA1NmY0ZTZiLi4zMmVlZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9mZG9tYWluLmMKQEAgLTMsNyArMyw3IEBACiAgKiBSZXZpc2VkOiBNb24gRGVjIDI4IDIxOjU5OjAyIDE5OTggYnkgZmFpdGhAYWNtLm9yZwogICogQXV0aG9yOiBSaWNrYXJkIEUuIEZhaXRoLCBmYWl0aEBjcy51bmMuZWR1CiAgKiBDb3B5cmlnaHQgMTk5Mi0xOTk2LCAxOTk4IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCi0gKiBTaGFyZWQgSVJRIHN1cHBvcnRlZCBhZGRlZCA3LzcvMjAwMSAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIFNoYXJlZCBJUlEgc3VwcG9ydGVkIGFkZGVkIDcvNy8yMDAxICBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmMgYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKaW5kZXggNGQxNWE2Mi4uOWMxZTZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libW1jYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuYwpAQCAtMTAsNyArMTAsNyBAQAogIFNlZSB0aGUgV1dXLXBhZ2U6IGh0dHA6Ly93d3cudW5pLW1haW56LmRlL35sYW5nbTAwMC9saW51eC5odG1sIGZvciBsYXRlc3QKICB1cGRhdGVzLCBpbmZvIGFuZCBBREYtZmlsZXMgZm9yIGFkYXB0ZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KIAotIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICBVcGRhdGVkIGZvciBMaW51eCAyLjUuNDUgdG8gdXNlIHRoZSBuZXcgZXJyb3IgaGFuZGxlciwgY2xlYW5lZCB1cCB0aGUKICBsb2NrIG1hY3JvcyBhbmQgZGlkIGEgZmV3IHVuYXZvaWRhYmxlIGxvY2tpbmcgdHdlYWtzLCBwbHVzIG9uZSBsb2NraW5nCiAgZml4IGluIHRoZSBpcnEgYW5kIGNvbXBsZXRpb24gcGF0aC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYwppbmRleCA3NjUwNzA3Li40NGYyMDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCkBAIC0xMjEsNiArMTIxLDcgQEAKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19UUkFOU19DQU5DRUxMRUQsIERJRF9BQk9SVCwgMCwgMSwgInRyYW5zYWN0aW9uIGNhbmNlbGxlZCIgfSwKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19UUkFOU19DQU5DRUxMRURfSU1QTElDSVQsIERJRF9BQk9SVCwgMCwgMSwgInRyYW5zYWN0aW9uIGNhbmNlbGxlZCBpbXBsaWNpdCIgfSwKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0UsIERJRF9SRVFVRVVFLCAxLCAxLCAiaW5zdWZmaWNpZW50IHJlc291cmNlcyIgfSwKKwl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19QTE9HSV9SRVFVSVJFRCwgRElEX0VSUk9SLCAwLCAxLCAicG9ydCBsb2dpbiByZXF1aXJlZCIgfSwKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19DT01NQU5EX0ZBSUxFRCwgRElEX0VSUk9SLCAxLCAxLCAiY29tbWFuZCBmYWlsZWQiIH0sCiAKIAl7IElCTVZGQ19GQ19GQUlMVVJFLCBJQk1WRkNfSU5WQUxJRF9FTFNfQ01EX0NPREUsIERJRF9FUlJPUiwgMCwgMSwgImludmFsaWQgRUxTIGNvbW1hbmQgY29kZSIgfSwKQEAgLTI3OCwxMyArMjc5LDYgQEAKIAkgICAgIHJzcC0+ZGF0YS5pbmZvLnJzcF9jb2RlKSkKIAkJcmV0dXJuIERJRF9FUlJPUiA8PCAxNjsKIAotCWlmICghdmZjX2NtZC0+c3RhdHVzKSB7Ci0JCWlmIChyc3AtPmZsYWdzICYgRkNQX1JFU0lEX09WRVIpCi0JCQlyZXR1cm4gcnNwLT5zY3NpX3N0YXR1cyB8IChESURfRVJST1IgPDwgMTYpOwotCQllbHNlCi0JCQlyZXR1cm4gcnNwLT5zY3NpX3N0YXR1cyB8IChESURfT0sgPDwgMTYpOwotCX0KLQogCWVyciA9IGlibXZmY19nZXRfZXJyX2luZGV4KHZmY19jbWQtPnN0YXR1cywgdmZjX2NtZC0+ZXJyb3IpOwogCWlmIChlcnIgPj0gMCkKIAkJcmV0dXJuIHJzcC0+c2NzaV9zdGF0dXMgfCAoY21kX3N0YXR1c1tlcnJdLnJlc3VsdCA8PCAxNik7CkBAIC01MDMsNiArNDk3LDcgQEAKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9JTklUOgogCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUw6CiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fUVVFUllfVEdUUzoKKwljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMX0ZBSUxFRDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfQUREOgogCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX05PTkU6CiAJZGVmYXVsdDoKQEAgLTU2Niw3ICs1NjEsNyBAQAogCXN0cnVjdCBpYm12ZmNfdGFyZ2V0ICp0Z3Q7CiAKIAlpZiAodmhvc3QtPmFjdGlvbiA9PSBJQk1WRkNfSE9TVF9BQ1RJT05fSU5JVF9XQUlUKSB7Ci0JCWlmICgrK3Zob3N0LT5pbml0X3JldHJpZXMgPiBJQk1WRkNfTUFYX0lOSVRfUkVUUklFUykgeworCQlpZiAoKyt2aG9zdC0+aW5pdF9yZXRyaWVzID4gSUJNVkZDX01BWF9IT1NUX0lOSVRfUkVUUklFUykgewogCQkJZGV2X2Vycih2aG9zdC0+ZGV2LAogCQkJCSJIb3N0IGluaXRpYWxpemF0aW9uIHJldHJpZXMgZXhjZWVkZWQuIFRha2luZyBhZGFwdGVyIG9mZmxpbmVcbiIpOwogCQkJaWJtdmZjX2xpbmtfZG93bih2aG9zdCwgSUJNVkZDX0hPU1RfT0ZGTElORSk7CkBAIC03NjUsNiArNzYwLDkgQEAKIAkJY21uZC0+c2NzaV9kb25lKGNtbmQpOwogCX0KIAorCWlmIChldnQtPmVoX2NvbXApCisJCWNvbXBsZXRlKGV2dC0+ZWhfY29tcCk7CisKIAlpYm12ZmNfZnJlZV9ldmVudChldnQpOwogfQogCkBAIC04NDcsMTEgKzg0NSwxMiBAQAogc3RhdGljIHZvaWQgaWJtdmZjX3JldHJ5X2hvc3RfaW5pdChzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0KQogewogCWlmICh2aG9zdC0+YWN0aW9uID09IElCTVZGQ19IT1NUX0FDVElPTl9JTklUX1dBSVQpIHsKLQkJaWYgKCsrdmhvc3QtPmluaXRfcmV0cmllcyA+IElCTVZGQ19NQVhfSU5JVF9SRVRSSUVTKSB7CisJCXZob3N0LT5kZWxheV9pbml0ID0gMTsKKwkJaWYgKCsrdmhvc3QtPmluaXRfcmV0cmllcyA+IElCTVZGQ19NQVhfSE9TVF9JTklUX1JFVFJJRVMpIHsKIAkJCWRldl9lcnIodmhvc3QtPmRldiwKIAkJCQkiSG9zdCBpbml0aWFsaXphdGlvbiByZXRyaWVzIGV4Y2VlZGVkLiBUYWtpbmcgYWRhcHRlciBvZmZsaW5lXG4iKTsKIAkJCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19IT1NUX09GRkxJTkUpOwotCQl9IGVsc2UgaWYgKHZob3N0LT5pbml0X3JldHJpZXMgPT0gSUJNVkZDX01BWF9JTklUX1JFVFJJRVMpCisJCX0gZWxzZSBpZiAodmhvc3QtPmluaXRfcmV0cmllcyA9PSBJQk1WRkNfTUFYX0hPU1RfSU5JVF9SRVRSSUVTKQogCQkJX19pYm12ZmNfcmVzZXRfaG9zdCh2aG9zdCk7CiAJCWVsc2UKIAkJCWlibXZmY19zZXRfaG9zdF9hY3Rpb24odmhvc3QsIElCTVZGQ19IT1NUX0FDVElPTl9JTklUKTsKQEAgLTEyNTIsNiArMTI1MSw3IEBACiAJZXZ0LT5zeW5jX2l1ID0gTlVMTDsKIAlldnQtPmNycS5mb3JtYXQgPSBmb3JtYXQ7CiAJZXZ0LT5kb25lID0gZG9uZTsKKwlldnQtPmVoX2NvbXAgPSBOVUxMOwogfQogCiAvKioKQEAgLTEzODEsNiArMTM4MSw4IEBACiAJCWFkZF90aW1lcigmZXZ0LT50aW1lcik7CiAJfQogCisJbWIoKTsKKwogCWlmICgocmMgPSBpYm12ZmNfc2VuZF9jcnEodmhvc3QsIGNycV9hc191NjRbMF0sIGNycV9hc191NjRbMV0pKSkgewogCQlsaXN0X2RlbCgmZXZ0LT5xdWV1ZSk7CiAJCWRlbF90aW1lcigmZXZ0LT50aW1lcik7CkBAIC0xNDc3LDYgKzE0NzksMTEgQEAKIAkJCQlzZW5zZV9sZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUgLSByc3BfbGVuOwogCQkJaWYgKChyc3AtPmZsYWdzICYgRkNQX1NOU19MRU5fVkFMSUQpICYmIHJzcC0+ZmNwX3NlbnNlX2xlbiAmJiByc3BfbGVuIDw9IDgpCiAJCQkJbWVtY3B5KGNtbmQtPnNlbnNlX2J1ZmZlciwgcnNwLT5kYXRhLnNlbnNlICsgcnNwX2xlbiwgc2Vuc2VfbGVuKTsKKwkJCWlmICgodmZjX2NtZC0+c3RhdHVzICYgSUJNVkZDX1ZJT1NfRkFJTFVSRSkgJiYgKHZmY19jbWQtPmVycm9yID09IElCTVZGQ19QTE9HSV9SRVFVSVJFRCkpCisJCQkJaWJtdmZjX3JlaW5pdF9ob3N0KGV2dC0+dmhvc3QpOworCisJCQlpZiAoIWNtbmQtPnJlc3VsdCAmJiAoIXNjc2lfZ2V0X3Jlc2lkKGNtbmQpIHx8IChyc3AtPmZsYWdzICYgRkNQX1JFU0lEX09WRVIpKSkKKwkJCQljbW5kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAogCQkJaWJtdmZjX2xvZ19lcnJvcihldnQpOwogCQl9CkBAIC0xNDg5LDYgKzE0OTYsOSBAQAogCQljbW5kLT5zY3NpX2RvbmUoY21uZCk7CiAJfQogCisJaWYgKGV2dC0+ZWhfY29tcCkKKwkJY29tcGxldGUoZXZ0LT5laF9jb21wKTsKKwogCWlibXZmY19mcmVlX2V2ZW50KGV2dCk7CiB9CiAKQEAgLTE2MjcsNyArMTYzNyw3IEBACiAJc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCA9IHNob3N0X3ByaXYoc2Rldi0+aG9zdCk7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2RldikpOwogCXN0cnVjdCBpYm12ZmNfY21kICp0bWY7Ci0Jc3RydWN0IGlibXZmY19ldmVudCAqZXZ0OworCXN0cnVjdCBpYm12ZmNfZXZlbnQgKmV2dCA9IE5VTEw7CiAJdW5pb24gaWJtdmZjX2l1IHJzcF9pdTsKIAlzdHJ1Y3QgaWJtdmZjX2ZjcF9yc3AgKmZjX3JzcCA9ICZyc3BfaXUuY21kLnJzcDsKIAlpbnQgcnNwX3JjID0gLUVCVVNZOwpAQCAtMTc4OSw3ICsxNzk5LDggQEAKIHN0YXRpYyBpbnQgaWJtdmZjX2NhbmNlbF9hbGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0ID0gc2hvc3RfcHJpdihzZGV2LT5ob3N0KTsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzZGV2KSk7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc3RhcmdldCk7CiAJc3RydWN0IGlibXZmY190bWYgKnRtZjsKIAlzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQsICpmb3VuZF9ldnQ7CiAJdW5pb24gaWJtdmZjX2l1IHJzcDsKQEAgLTE4MjcsNyArMTgzOCw3IEBACiAJCWludF90b19zY3NpbHVuKHNkZXYtPmx1biwgJnRtZi0+bHVuKTsKIAkJdG1mLT5mbGFncyA9ICh0eXBlIHwgSUJNVkZDX1RNRl9MVUFfVkFMSUQpOwogCQl0bWYtPmNhbmNlbF9rZXkgPSAodW5zaWduZWQgbG9uZylzZGV2LT5ob3N0ZGF0YTsKLQkJdG1mLT5teV9jYW5jZWxfa2V5ID0gKElCTVZGQ19UTUZfQ0FOQ0VMX0tFWSB8ICh1bnNpZ25lZCBsb25nKXNkZXYtPmhvc3RkYXRhKTsKKwkJdG1mLT5teV9jYW5jZWxfa2V5ID0gKHVuc2lnbmVkIGxvbmcpc3RhcmdldC0+aG9zdGRhdGE7CiAKIAkJZXZ0LT5zeW5jX2l1ID0gJnJzcDsKIAkJaW5pdF9jb21wbGV0aW9uKCZldnQtPmNvbXApOwpAQCAtMTg1OSw2ICsxODcwLDkxIEBACiB9CiAKIC8qKgorICogaWJtdmZjX21hdGNoX3RhcmdldCAtIE1hdGNoIGZ1bmN0aW9uIGZvciBzcGVjaWZpZWQgdGFyZ2V0CisgKiBAZXZ0OglpYm12ZmMgZXZlbnQgc3RydWN0CisgKiBAZGV2aWNlOglkZXZpY2UgdG8gbWF0Y2ggKHN0YXJnZXQpCisgKgorICogUmV0dXJuczoKKyAqCTEgaWYgZXZlbnQgbWF0Y2hlcyBzdGFyZ2V0IC8gMCBpZiBldmVudCBkb2VzIG5vdCBtYXRjaCBzdGFyZ2V0CisgKiovCitzdGF0aWMgaW50IGlibXZmY19tYXRjaF90YXJnZXQoc3RydWN0IGlibXZmY19ldmVudCAqZXZ0LCB2b2lkICpkZXZpY2UpCit7CisJaWYgKGV2dC0+Y21uZCAmJiBzY3NpX3RhcmdldChldnQtPmNtbmQtPmRldmljZSkgPT0gZGV2aWNlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpYm12ZmNfbWF0Y2hfbHVuIC0gTWF0Y2ggZnVuY3Rpb24gZm9yIHNwZWNpZmllZCBMVU4KKyAqIEBldnQ6CWlibXZmYyBldmVudCBzdHJ1Y3QKKyAqIEBkZXZpY2U6CWRldmljZSB0byBtYXRjaCAoc2RldikKKyAqCisgKiBSZXR1cm5zOgorICoJMSBpZiBldmVudCBtYXRjaGVzIHNkZXYgLyAwIGlmIGV2ZW50IGRvZXMgbm90IG1hdGNoIHNkZXYKKyAqKi8KK3N0YXRpYyBpbnQgaWJtdmZjX21hdGNoX2x1bihzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQsIHZvaWQgKmRldmljZSkKK3sKKwlpZiAoZXZ0LT5jbW5kICYmIGV2dC0+Y21uZC0+ZGV2aWNlID09IGRldmljZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWJtdmZjX3dhaXRfZm9yX29wcyAtIFdhaXQgZm9yIG9wcyB0byBjb21wbGV0ZQorICogQHZob3N0OglpYm12ZmMgaG9zdCBzdHJ1Y3QKKyAqIEBkZXZpY2U6CWRldmljZSB0byBtYXRjaCAoc3RhcmdldCBvciBzZGV2KQorICogQG1hdGNoOgltYXRjaCBmdW5jdGlvbgorICoKKyAqIFJldHVybnM6CisgKglTVUNDRVNTIC8gRkFJTEVECisgKiovCitzdGF0aWMgaW50IGlibXZmY193YWl0X2Zvcl9vcHMoc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCwgdm9pZCAqZGV2aWNlLAorCQkJICAgICAgIGludCAoKm1hdGNoKSAoc3RydWN0IGlibXZmY19ldmVudCAqLCB2b2lkICopKQoreworCXN0cnVjdCBpYm12ZmNfZXZlbnQgKmV2dDsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wKTsKKwlpbnQgd2FpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNpZ25lZCBsb25nIHRpbWVvdXQgPSBpbml0X3RpbWVvdXQgKiBIWjsKKworCUVOVEVSOworCWRvIHsKKwkJd2FpdCA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShldnQsICZ2aG9zdC0+c2VudCwgcXVldWUpIHsKKwkJCWlmIChtYXRjaChldnQsIGRldmljZSkpIHsKKwkJCQlldnQtPmVoX2NvbXAgPSAmY29tcDsKKwkJCQl3YWl0Kys7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHdhaXQpIHsKKwkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbXAsIHRpbWVvdXQpOworCisJCQlpZiAoIXRpbWVvdXQpIHsKKwkJCQl3YWl0ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShldnQsICZ2aG9zdC0+c2VudCwgcXVldWUpIHsKKwkJCQkJaWYgKG1hdGNoKGV2dCwgZGV2aWNlKSkgeworCQkJCQkJZXZ0LT5laF9jb21wID0gTlVMTDsKKwkJCQkJCXdhaXQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCQlpZiAod2FpdCkKKwkJCQkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGFib3J0ZWQgY29tbWFuZHNcbiIpOworCQkJCUxFQVZFOworCQkJCXJldHVybiB3YWl0ID8gRkFJTEVEIDogU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKHdhaXQpOworCisJTEVBVkU7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgogICogaWJtdmZjX2VoX2Fib3J0X2hhbmRsZXIgLSBBYm9ydCBhIGNvbW1hbmQKICAqIEBjbWQ6CXNjc2kgY29tbWFuZCB0byBhYm9ydAogICoKQEAgLTE4NjcsMjkgKzE5NjMsMjEgQEAKICAqKi8KIHN0YXRpYyBpbnQgaWJtdmZjX2VoX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKLQlzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQsICpwb3M7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCA9IHNob3N0X3ByaXYoc2Rldi0+aG9zdCk7CiAJaW50IGNhbmNlbF9yYywgYWJvcnRfcmM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSBGQUlMRUQ7CiAKIAlFTlRFUjsKIAlpYm12ZmNfd2FpdF93aGlsZV9yZXNldHRpbmcodmhvc3QpOwotCWNhbmNlbF9yYyA9IGlibXZmY19jYW5jZWxfYWxsKGNtZC0+ZGV2aWNlLCBJQk1WRkNfVE1GX0FCT1JUX1RBU0tfU0VUKTsKLQlhYm9ydF9yYyA9IGlibXZmY19hYm9ydF90YXNrX3NldChjbWQtPmRldmljZSk7CisJY2FuY2VsX3JjID0gaWJtdmZjX2NhbmNlbF9hbGwoc2RldiwgSUJNVkZDX1RNRl9BQk9SVF9UQVNLX1NFVCk7CisJYWJvcnRfcmMgPSBpYm12ZmNfYWJvcnRfdGFza19zZXQoc2Rldik7CiAKLQlpZiAoIWNhbmNlbF9yYyAmJiAhYWJvcnRfcmMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZ0LCBwb3MsICZ2aG9zdC0+c2VudCwgcXVldWUpIHsKLQkJCWlmIChldnQtPmNtbmQgJiYgZXZ0LT5jbW5kLT5kZXZpY2UgPT0gY21kLT5kZXZpY2UpCi0JCQkJaWJtdmZjX2ZhaWxfcmVxdWVzdChldnQsIERJRF9BQk9SVCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCUxFQVZFOwotCQlyZXR1cm4gU1VDQ0VTUzsKLQl9CisJaWYgKCFjYW5jZWxfcmMgJiYgIWFib3J0X3JjKQorCQlyYyA9IGlibXZmY193YWl0X2Zvcl9vcHModmhvc3QsIHNkZXYsIGlibXZmY19tYXRjaF9sdW4pOwogCiAJTEVBVkU7Ci0JcmV0dXJuIEZBSUxFRDsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMTkwMSwyOSArMTk4OSwyMSBAQAogICoqLwogc3RhdGljIGludCBpYm12ZmNfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKLQlzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQsICpwb3M7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IGlibXZmY19ob3N0ICp2aG9zdCA9IHNob3N0X3ByaXYoc2Rldi0+aG9zdCk7CiAJaW50IGNhbmNlbF9yYywgcmVzZXRfcmM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSBGQUlMRUQ7CiAKIAlFTlRFUjsKIAlpYm12ZmNfd2FpdF93aGlsZV9yZXNldHRpbmcodmhvc3QpOwotCWNhbmNlbF9yYyA9IGlibXZmY19jYW5jZWxfYWxsKGNtZC0+ZGV2aWNlLCBJQk1WRkNfVE1GX0xVTl9SRVNFVCk7Ci0JcmVzZXRfcmMgPSBpYm12ZmNfcmVzZXRfZGV2aWNlKGNtZC0+ZGV2aWNlLCBJQk1WRkNfTFVOX1JFU0VULCAiTFVOIik7CisJY2FuY2VsX3JjID0gaWJtdmZjX2NhbmNlbF9hbGwoc2RldiwgSUJNVkZDX1RNRl9MVU5fUkVTRVQpOworCXJlc2V0X3JjID0gaWJtdmZjX3Jlc2V0X2RldmljZShzZGV2LCBJQk1WRkNfTFVOX1JFU0VULCAiTFVOIik7CiAKLQlpZiAoIWNhbmNlbF9yYyAmJiAhcmVzZXRfcmMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZ0LCBwb3MsICZ2aG9zdC0+c2VudCwgcXVldWUpIHsKLQkJCWlmIChldnQtPmNtbmQgJiYgZXZ0LT5jbW5kLT5kZXZpY2UgPT0gY21kLT5kZXZpY2UpCi0JCQkJaWJtdmZjX2ZhaWxfcmVxdWVzdChldnQsIERJRF9BQk9SVCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCUxFQVZFOwotCQlyZXR1cm4gU1VDQ0VTUzsKLQl9CisJaWYgKCFjYW5jZWxfcmMgJiYgIXJlc2V0X3JjKQorCQlyYyA9IGlibXZmY193YWl0X2Zvcl9vcHModmhvc3QsIHNkZXYsIGlibXZmY19tYXRjaF9sdW4pOwogCiAJTEVBVkU7Ci0JcmV0dXJuIEZBSUxFRDsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMTk1OSwzMSArMjAzOSwyMyBAQAogICoqLwogc3RhdGljIGludCBpYm12ZmNfZWhfdGFyZ2V0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY3NpX3RhcmdldChjbWQtPmRldmljZSk7Ci0Jc3RydWN0IGlibXZmY19ldmVudCAqZXZ0LCAqcG9zOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCXN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QgPSBzaG9zdF9wcml2KHNkZXYtPmhvc3QpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNjc2lfdGFyZ2V0KHNkZXYpOwogCWludCByZXNldF9yYzsKKwlpbnQgcmMgPSBGQUlMRUQ7CiAJdW5zaWduZWQgbG9uZyBjYW5jZWxfcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlFTlRFUjsKIAlpYm12ZmNfd2FpdF93aGlsZV9yZXNldHRpbmcodmhvc3QpOwogCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHN0YXJnZXQsICZjYW5jZWxfcmMsIGlibXZmY19kZXZfY2FuY2VsX2FsbCk7Ci0JcmVzZXRfcmMgPSBpYm12ZmNfcmVzZXRfZGV2aWNlKGNtZC0+ZGV2aWNlLCBJQk1WRkNfVEFSR0VUX1JFU0VULCAidGFyZ2V0Iik7CisJcmVzZXRfcmMgPSBpYm12ZmNfcmVzZXRfZGV2aWNlKHNkZXYsIElCTVZGQ19UQVJHRVRfUkVTRVQsICJ0YXJnZXQiKTsKIAotCWlmICghY2FuY2VsX3JjICYmICFyZXNldF9yYykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldnQsIHBvcywgJnZob3N0LT5zZW50LCBxdWV1ZSkgewotCQkJaWYgKGV2dC0+Y21uZCAmJiBzY3NpX3RhcmdldChldnQtPmNtbmQtPmRldmljZSkgPT0gc3RhcmdldCkKLQkJCQlpYm12ZmNfZmFpbF9yZXF1ZXN0KGV2dCwgRElEX0FCT1JUKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJTEVBVkU7Ci0JCXJldHVybiBTVUNDRVNTOwotCX0KKwlpZiAoIWNhbmNlbF9yYyAmJiAhcmVzZXRfcmMpCisJCXJjID0gaWJtdmZjX3dhaXRfZm9yX29wcyh2aG9zdCwgc3RhcmdldCwgaWJtdmZjX21hdGNoX3RhcmdldCk7CiAKIAlMRUFWRTsKLQlyZXR1cm4gRkFJTEVEOworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0yMDEzLDIzICsyMDg1LDE4IEBACiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdG9fc2NzaV90YXJnZXQoJnJwb3J0LT5kZXYpOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBpYm12ZmNfaG9zdCAqdmhvc3QgPSBzaG9zdF9wcml2KHNob3N0KTsKLQlzdHJ1Y3QgaWJtdmZjX2V2ZW50ICpldnQsICpwb3M7CiAJdW5zaWduZWQgbG9uZyBjYW5jZWxfcmMgPSAwOwogCXVuc2lnbmVkIGxvbmcgYWJvcnRfcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gRkFJTEVEOwogCiAJRU5URVI7CiAJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RhcmdldCwgJmNhbmNlbF9yYywgaWJtdmZjX2Rldl9jYW5jZWxfYWxsKTsKIAlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShzdGFyZ2V0LCAmYWJvcnRfcmMsIGlibXZmY19kZXZfYWJvcnRfYWxsKTsKIAotCWlmICghY2FuY2VsX3JjICYmICFhYm9ydF9yYykgewotCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldnQsIHBvcywgJnZob3N0LT5zZW50LCBxdWV1ZSkgewotCQkJaWYgKGV2dC0+Y21uZCAmJiBzY3NpX3RhcmdldChldnQtPmNtbmQtPmRldmljZSkgPT0gc3RhcmdldCkKLQkJCQlpYm12ZmNfZmFpbF9yZXF1ZXN0KGV2dCwgRElEX0FCT1JUKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UKKwlpZiAoIWNhbmNlbF9yYyAmJiAhYWJvcnRfcmMpCisJCXJjID0gaWJtdmZjX3dhaXRfZm9yX29wcyh2aG9zdCwgc3RhcmdldCwgaWJtdmZjX21hdGNoX3RhcmdldCk7CisKKwlpZiAocmMgPT0gRkFJTEVEKQogCQlpYm12ZmNfaXNzdWVfZmNfaG9zdF9saXAoc2hvc3QpOwogCUxFQVZFOwogfQpAQCAtMjA4OSwxNSArMjE1NiwxNyBAQAogCWNhc2UgSUJNVkZDX0FFX0xJTktfVVA6CiAJY2FzZSBJQk1WRkNfQUVfUkVTVU1FOgogCQl2aG9zdC0+ZXZlbnRzX3RvX2xvZyB8PSBJQk1WRkNfQUVfTElOS1VQOwotCQlpYm12ZmNfaW5pdF9ob3N0KHZob3N0LCAxKTsKKwkJdmhvc3QtPmRlbGF5X2luaXQgPSAxOworCQlfX2libXZmY19yZXNldF9ob3N0KHZob3N0KTsKIAkJYnJlYWs7CiAJY2FzZSBJQk1WRkNfQUVfU0NOX0ZBQlJJQzoKKwljYXNlIElCTVZGQ19BRV9TQ05fRE9NQUlOOgogCQl2aG9zdC0+ZXZlbnRzX3RvX2xvZyB8PSBJQk1WRkNfQUVfUlNDTjsKLQkJaWJtdmZjX2luaXRfaG9zdCh2aG9zdCwgMSk7CisJCXZob3N0LT5kZWxheV9pbml0ID0gMTsKKwkJX19pYm12ZmNfcmVzZXRfaG9zdCh2aG9zdCk7CiAJCWJyZWFrOwogCWNhc2UgSUJNVkZDX0FFX1NDTl9OUE9SVDoKIAljYXNlIElCTVZGQ19BRV9TQ05fR1JPVVA6Ci0JY2FzZSBJQk1WRkNfQUVfU0NOX0RPTUFJTjoKIAkJdmhvc3QtPmV2ZW50c190b19sb2cgfD0gSUJNVkZDX0FFX1JTQ047CiAJY2FzZSBJQk1WRkNfQUVfRUxTX0xPR086CiAJY2FzZSBJQk1WRkNfQUVfRUxTX1BSTE86CkBAIC0yMjYzLDYgKzIzMzIsMjggQEAKIH0KIAogLyoqCisgKiBpYm12ZmNfdGFyZ2V0X2FsbG9jIC0gU2V0dXAgdGhlIHRhcmdldCdzIHRhc2sgc2V0IHZhbHVlCisgKiBAc3RhcmdldDoJc3RydWN0IHNjc2lfdGFyZ2V0CisgKgorICogU2V0IHRoZSB0YXJnZXQncyB0YXNrIHNldCB2YWx1ZSBzbyB0aGF0IGVycm9yIGhhbmRsaW5nIHdvcmtzIGFzCisgKiBleHBlY3RlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJMCBvbiBzdWNjZXNzIC8gLUVOWElPIGlmIGRldmljZSBkb2VzIG5vdCBleGlzdAorICoqLworc3RhdGljIGludCBpYm12ZmNfdGFyZ2V0X2FsbG9jKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0ID0gc2hvc3RfcHJpdihzaG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc3RhcmdldC0+aG9zdGRhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXZob3N0LT50YXNrX3NldCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKICAqIGlibXZmY19zbGF2ZV9jb25maWd1cmUgLSBDb25maWd1cmUgdGhlIGRldmljZQogICogQHNkZXY6CXN0cnVjdCBzY3NpX2RldmljZSBkZXZpY2UgdG8gY29uZmlndXJlCiAgKgpAQCAtMjU0MSw2ICsyNjMyLDcgQEAKIAkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gaWJtdmZjX2VoX2hvc3RfcmVzZXRfaGFuZGxlciwKIAkuc2xhdmVfYWxsb2MgPSBpYm12ZmNfc2xhdmVfYWxsb2MsCiAJLnNsYXZlX2NvbmZpZ3VyZSA9IGlibXZmY19zbGF2ZV9jb25maWd1cmUsCisJLnRhcmdldF9hbGxvYyA9IGlibXZmY190YXJnZXRfYWxsb2MsCiAJLnNjYW5fZmluaXNoZWQgPSBpYm12ZmNfc2Nhbl9maW5pc2hlZCwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoID0gaWJtdmZjX2NoYW5nZV9xdWV1ZV9kZXB0aCwKIAkuY2hhbmdlX3F1ZXVlX3R5cGUgPSBpYm12ZmNfY2hhbmdlX3F1ZXVlX3R5cGUsCkBAIC0yNjM3LDcgKzI3MjksNyBAQAogCQl9IGVsc2UgaWYgKChhc3luYyA9IGlibXZmY19uZXh0X2FzeW5jX2NycSh2aG9zdCkpICE9IE5VTEwpIHsKIAkJCXZpb19kaXNhYmxlX2ludGVycnVwdHModmRldik7CiAJCQlpYm12ZmNfaGFuZGxlX2FzeW5jKGFzeW5jLCB2aG9zdCk7Ci0JCQljcnEtPnZhbGlkID0gMDsKKwkJCWFzeW5jLT52YWxpZCA9IDA7CiAJCX0gZWxzZQogCQkJZG9uZSA9IDE7CiAJfQpAQCAtMjY2OSw3ICsyNzYxLDcgQEAKIHN0YXRpYyB2b2lkIGlibXZmY19yZXRyeV90Z3RfaW5pdChzdHJ1Y3QgaWJtdmZjX3RhcmdldCAqdGd0LAogCQkJCSAgdm9pZCAoKmpvYl9zdGVwKSAoc3RydWN0IGlibXZmY190YXJnZXQgKikpCiB7Ci0JaWYgKCsrdGd0LT5pbml0X3JldHJpZXMgPiBJQk1WRkNfTUFYX0lOSVRfUkVUUklFUykgeworCWlmICgrK3RndC0+aW5pdF9yZXRyaWVzID4gSUJNVkZDX01BWF9UR1RfSU5JVF9SRVRSSUVTKSB7CiAJCWlibXZmY19zZXRfdGd0X2FjdGlvbih0Z3QsIElCTVZGQ19UR1RfQUNUSU9OX0RFTF9SUE9SVCk7CiAJCXdha2VfdXAoJnRndC0+dmhvc3QtPndvcmtfd2FpdF9xKTsKIAl9IGVsc2UKQEAgLTI3MDgsNiArMjgwMCw4IEBACiAJCQlyc3AtPnN0YXR1cywgcnNwLT5lcnJvciwgc3RhdHVzKTsKIAkJaWYgKGlibXZmY19yZXRyeV9jbWQocnNwLT5zdGF0dXMsIHJzcC0+ZXJyb3IpKQogCQkJaWJtdmZjX3JldHJ5X3RndF9pbml0KHRndCwgaWJtdmZjX3RndF9zZW5kX3BybGkpOworCQllbHNlCisJCQlpYm12ZmNfc2V0X3RndF9hY3Rpb24odGd0LCBJQk1WRkNfVEdUX0FDVElPTl9ERUxfUlBPUlQpOwogCQlicmVhazsKIAl9OwogCkBAIC0yODAyLDYgKzI4OTYsOCBAQAogCiAJCWlmIChpYm12ZmNfcmV0cnlfY21kKHJzcC0+c3RhdHVzLCByc3AtPmVycm9yKSkKIAkJCWlibXZmY19yZXRyeV90Z3RfaW5pdCh0Z3QsIGlibXZmY190Z3Rfc2VuZF9wbG9naSk7CisJCWVsc2UKKwkJCWlibXZmY19zZXRfdGd0X2FjdGlvbih0Z3QsIElCTVZGQ19UR1RfQUNUSU9OX0RFTF9SUE9SVCk7CiAJCWJyZWFrOwogCX07CiAKQEAgLTMwOTMsNiArMzE4OSw4IEBACiAJCQlpYm12ZmNfc2V0X3RndF9hY3Rpb24odGd0LCBJQk1WRkNfVEdUX0FDVElPTl9ERUxfUlBPUlQpOwogCQllbHNlIGlmIChpYm12ZmNfcmV0cnlfY21kKHJzcC0+c3RhdHVzLCByc3AtPmVycm9yKSkKIAkJCWlibXZmY19yZXRyeV90Z3RfaW5pdCh0Z3QsIGlibXZmY190Z3RfcXVlcnlfdGFyZ2V0KTsKKwkJZWxzZQorCQkJaWJtdmZjX3NldF90Z3RfYWN0aW9uKHRndCwgSUJNVkZDX1RHVF9BQ1RJT05fREVMX1JQT1JUKTsKIAkJYnJlYWs7CiAJfTsKIApAQCAtMzQyMyw2ICszNTIxLDcgQEAKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9BTExPQ19UR1RTOgogCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9BREQ6CiAJY2FzZSBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0RFTDoKKwljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMX0ZBSUxFRDoKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9RVUVSWToKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTM1MTksNyArMzYxOCwxMyBAQAogCQlicmVhazsKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9JTklUOgogCQlCVUdfT04odmhvc3QtPnN0YXRlICE9IElCTVZGQ19JTklUSUFMSVpJTkcpOwotCQl2aG9zdC0+am9iX3N0ZXAodmhvc3QpOworCQlpZiAodmhvc3QtPmRlbGF5X2luaXQpIHsKKwkJCXZob3N0LT5kZWxheV9pbml0ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJc3NsZWVwKDE1KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlCisJCQl2aG9zdC0+am9iX3N0ZXAodmhvc3QpOwogCQlicmVhazsKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9RVUVSWToKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0Z3QsICZ2aG9zdC0+dGFyZ2V0cywgcXVldWUpCkBAIC0zNTM4LDYgKzM2NDMsNyBAQAogCQkJaWJtdmZjX3NldF9ob3N0X2FjdGlvbih2aG9zdCwgSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUwpOwogCQlicmVhazsKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfREVMOgorCWNhc2UgSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUxfRkFJTEVEOgogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRndCwgJnZob3N0LT50YXJnZXRzLCBxdWV1ZSkgewogCQkJaWYgKHRndC0+YWN0aW9uID09IElCTVZGQ19UR1RfQUNUSU9OX0RFTF9SUE9SVCkgewogCQkJCXRndF9kYmcodGd0LCAiRGVsZXRpbmcgcnBvcnRcbiIpOwpAQCAtMzU1Myw4ICszNjU5LDE3IEBACiAJCX0KIAogCQlpZiAodmhvc3QtPnN0YXRlID09IElCTVZGQ19JTklUSUFMSVpJTkcpIHsKLQkJCWlibXZmY19zZXRfaG9zdF9hY3Rpb24odmhvc3QsIElCTVZGQ19IT1NUX0FDVElPTl9JTklUKTsKLQkJCXZob3N0LT5qb2Jfc3RlcCA9IGlibXZmY19kaXNjb3Zlcl90YXJnZXRzOworCQkJaWYgKHZob3N0LT5hY3Rpb24gPT0gSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUxfRkFJTEVEKSB7CisJCQkJaWJtdmZjX3NldF9ob3N0X3N0YXRlKHZob3N0LCBJQk1WRkNfQUNUSVZFKTsKKwkJCQlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0FERCk7CisJCQkJdmhvc3QtPmluaXRfcmV0cmllcyA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZob3N0LT5ob3N0KTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWlibXZmY19zZXRfaG9zdF9hY3Rpb24odmhvc3QsIElCTVZGQ19IT1NUX0FDVElPTl9JTklUKTsKKwkJCQl2aG9zdC0+am9iX3N0ZXAgPSBpYm12ZmNfZGlzY292ZXJfdGFyZ2V0czsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWlibXZmY19zZXRfaG9zdF9hY3Rpb24odmhvc3QsIElCTVZGQ19IT1NUX0FDVElPTl9OT05FKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpAQCAtMzU3NywxNCArMzY5Miw4IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoIWlibXZmY19kZXZfaW5pdF90b19kbyh2aG9zdCkpIHsKLQkJCWlibXZmY19zZXRfaG9zdF9zdGF0ZSh2aG9zdCwgSUJNVkZDX0FDVElWRSk7Ci0JCQlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0FERCk7Ci0JCQl2aG9zdC0+aW5pdF9yZXRyaWVzID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodmhvc3QtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZob3N0LT5ob3N0KTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoIWlibXZmY19kZXZfaW5pdF90b19kbyh2aG9zdCkpCisJCQlpYm12ZmNfc2V0X2hvc3RfYWN0aW9uKHZob3N0LCBJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0RFTF9GQUlMRUQpOwogCQlicmVhazsKIAljYXNlIElCTVZGQ19IT1NUX0FDVElPTl9UR1RfQUREOgogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRndCwgJnZob3N0LT50YXJnZXRzLCBxdWV1ZSkgewpAQCAtMzU5MiwxNiArMzcwMSw2IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJCQkJaWJtdmZjX3RndF9hZGRfcnBvcnQodGd0KTsKIAkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKHRndC0+YWN0aW9uID09IElCTVZGQ19UR1RfQUNUSU9OX0RFTF9SUE9SVCkgewotCQkJCXRndF9kYmcodGd0LCAiRGVsZXRpbmcgcnBvcnRcbiIpOwotCQkJCXJwb3J0ID0gdGd0LT5ycG9ydDsKLQkJCQl0Z3QtPnJwb3J0ID0gTlVMTDsKLQkJCQlsaXN0X2RlbCgmdGd0LT5xdWV1ZSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh2aG9zdC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKHJwb3J0KQotCQkJCQlmY19yZW1vdGVfcG9ydF9kZWxldGUocnBvcnQpOwotCQkJCWtyZWZfcHV0KCZ0Z3QtPmtyZWYsIGlibXZmY19yZWxlYXNlX3RndCk7Ci0JCQkJcmV0dXJuOwogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaCBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaAppbmRleCBmYjMxNzdhLi5iYWJkZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oCkBAIC0yOSwxMSArMjksMTEgQEAKICNpbmNsdWRlICJ2aW9zcnAuaCIKIAogI2RlZmluZSBJQk1WRkNfTkFNRQkiaWJtdmZjIgotI2RlZmluZSBJQk1WRkNfRFJJVkVSX1ZFUlNJT04JCSIxLjAuMiIKLSNkZWZpbmUgSUJNVkZDX0RSSVZFUl9EQVRFCQkiKEF1Z3VzdCAxNCwgMjAwOCkiCisjZGVmaW5lIElCTVZGQ19EUklWRVJfVkVSU0lPTgkJIjEuMC40IgorI2RlZmluZSBJQk1WRkNfRFJJVkVSX0RBVEUJCSIoTm92ZW1iZXIgMTQsIDIwMDgpIgogCiAjZGVmaW5lIElCTVZGQ19ERUZBVUxUX1RJTUVPVVQJMTUKLSNkZWZpbmUgSUJNVkZDX0lOSVRfVElNRU9VVAkJMzAKKyNkZWZpbmUgSUJNVkZDX0lOSVRfVElNRU9VVAkJMTIwCiAjZGVmaW5lIElCTVZGQ19NQVhfUkVRVUVTVFNfREVGQVVMVAkxMDAKIAogI2RlZmluZSBJQk1WRkNfREVCVUcJCQkwCkBAIC00Myw3ICs0Myw4IEBACiAjZGVmaW5lIElCTVZGQ19NQVhfRElTQ19USFJFQURTCTQKICNkZWZpbmUgSUJNVkZDX1RHVF9NRU1QT09MX1NaCQk2NAogI2RlZmluZSBJQk1WRkNfTUFYX0NNRFNfUEVSX0xVTgk2NAotI2RlZmluZSBJQk1WRkNfTUFYX0lOSVRfUkVUUklFUwkzCisjZGVmaW5lIElCTVZGQ19NQVhfSE9TVF9JTklUX1JFVFJJRVMJNgorI2RlZmluZSBJQk1WRkNfTUFYX1RHVF9JTklUX1JFVFJJRVMJCTMKICNkZWZpbmUgSUJNVkZDX0RFVl9MT1NTX1RNTwkJKDUgKiA2MCkKICNkZWZpbmUgSUJNVkZDX0RFRkFVTFRfTE9HX0xFVkVMCTIKICNkZWZpbmUgSUJNVkZDX01BWF9DREJfTEVOCQkxNgpAQCAtMTA5LDYgKzExMCw3IEBACiAJSUJNVkZDX1RSQU5TX0NBTkNFTExFRAkJCT0gMHgwMDA2LAogCUlCTVZGQ19UUkFOU19DQU5DRUxMRURfSU1QTElDSVQJPSAweDAwMDcsCiAJSUJNVkZDX0lOU1VGRklDSUVOVF9SRVNPVVJDRQkJPSAweDAwMDgsCisJSUJNVkZDX1BMT0dJX1JFUVVJUkVECQkJPSAweDAwMTAsCiAJSUJNVkZDX0NPTU1BTkRfRkFJTEVECQkJPSAweDgwMDAsCiB9OwogCkBAIC0zMzcsNyArMzM5LDYgQEAKICNkZWZpbmUgSUJNVkZDX1RNRl9MVUFfVkFMSUQJCTB4NDAKIAl1MzIgY2FuY2VsX2tleTsKIAl1MzIgbXlfY2FuY2VsX2tleTsKLSNkZWZpbmUgSUJNVkZDX1RNRl9DQU5DRUxfS0VZCQkweDgwMDAwMDAwCiAJdTMyIHBhZDsKIAl1NjQgcmVzZXJ2ZWRbMl07CiB9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg4KSkpOwpAQCAtNTI0LDEwICs1MjUsMTAgQEAKIH07CiAKIHN0cnVjdCBpYm12ZmNfY3JxIHsKLQl1OCB2YWxpZDsKLQl1OCBmb3JtYXQ7CisJdm9sYXRpbGUgdTggdmFsaWQ7CisJdm9sYXRpbGUgdTggZm9ybWF0OwogCXU4IHJlc2VydmVkWzZdOwotCXU2NCBpb2JhOworCXZvbGF0aWxlIHU2NCBpb2JhOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoOCkpKTsKIAogc3RydWN0IGlibXZmY19jcnFfcXVldWUgewpAQCAtNTM3LDEzICs1MzgsMTMgQEAKIH07CiAKIHN0cnVjdCBpYm12ZmNfYXN5bmNfY3JxIHsKLQl1OCB2YWxpZDsKKwl2b2xhdGlsZSB1OCB2YWxpZDsKIAl1OCBwYWRbM107CiAJdTMyIHBhZDI7Ci0JdTY0IGV2ZW50OwotCXU2NCBzY3NpX2lkOwotCXU2NCB3d3BuOwotCXU2NCBub2RlX25hbWU7CisJdm9sYXRpbGUgdTY0IGV2ZW50OworCXZvbGF0aWxlIHU2NCBzY3NpX2lkOworCXZvbGF0aWxlIHU2NCB3d3BuOworCXZvbGF0aWxlIHU2NCBub2RlX25hbWU7CiAJdTY0IHJlc2VydmVkOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoOCkpKTsKIApAQCAtNjA2LDYgKzYwNyw3IEBACiAJc3RydWN0IHNycF9kaXJlY3RfYnVmICpleHRfbGlzdDsKIAlkbWFfYWRkcl90IGV4dF9saXN0X3Rva2VuOwogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisJc3RydWN0IGNvbXBsZXRpb24gKmVoX2NvbXA7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCkBAIC02MjYsNiArNjI4LDcgQEAKIAlJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0RFTCwKIAlJQk1WRkNfSE9TVF9BQ1RJT05fQUxMT0NfVEdUUywKIAlJQk1WRkNfSE9TVF9BQ1RJT05fVEdUX0lOSVQsCisJSUJNVkZDX0hPU1RfQUNUSU9OX1RHVF9ERUxfRkFJTEVELAogCUlCTVZGQ19IT1NUX0FDVElPTl9UR1RfQURELAogfTsKIApAQCAtNjcxLDYgKzY3NCw3IEBACiAJaW50IGRpc2NvdmVyeV90aHJlYWRzOwogCWludCBjbGllbnRfbWlncmF0ZWQ7CiAJaW50IHJlaW5pdDsKKwlpbnQgZGVsYXlfaW5pdDsKIAlpbnQgZXZlbnRzX3RvX2xvZzsKICNkZWZpbmUgSUJNVkZDX0FFX0xJTktVUAkweDAwMDEKICNkZWZpbmUgSUJNVkZDX0FFX0xJTktET1dOCTB4MDAwMgpAQCAtNzAwLDcgKzcwNCw3IEBACiAKICNkZWZpbmUgaWJtdmZjX2xvZyh2aG9zdCwgbGV2ZWwsIC4uLikgXAogCWRvIHsgXAotCQlpZiAobGV2ZWwgPj0gKHZob3N0KS0+bG9nX2xldmVsKSBcCisJCWlmICgodmhvc3QpLT5sb2dfbGV2ZWwgPj0gbGV2ZWwpIFwKIAkJCWRldl9lcnIoKHZob3N0KS0+ZGV2LCAjI19fVkFfQVJHU19fKTsgXAogCX0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKaW5kZXggNmNhZDE3NS4uODY4ZDM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhtYXhfY2hhbm5lbCwgIkxhcmdlc3QgY2hhbm5lbCB2YWx1ZSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKGluaXRfdGltZW91dCwgaW5pdF90aW1lb3V0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5pdF90aW1lb3V0LCAiSW5pdGlhbGl6YXRpb24gdGltZW91dCBpbiBzZWNvbmRzIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQobWF4X3JlcXVlc3RzLCBtYXhfcmVxdWVzdHMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9yZXF1ZXN0cywgbWF4X3JlcXVlc3RzLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfcmVxdWVzdHMsICJNYXhpbXVtIHJlcXVlc3RzIGZvciB0aGlzIGFkYXB0ZXIiKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogCiAJdmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAotCWRyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSBtYXhfcmVxdWVzdHM7CisJZHJpdmVyX3RlbXBsYXRlLmNhbl9xdWV1ZSA9IG1heF9yZXF1ZXN0cyAtIDI7CiAJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YoKmhvc3RkYXRhKSk7CiAJaWYgKCFob3N0KSB7CiAJCWRldl9lcnIoJnZkZXYtPmRldiwgImNvdWxkbid0IGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCmluZGV4IDIzNzBmZDguLmMyNDE0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCkBAIC01NzgsNiArNTc4LDggQEAKIHsKIAlpZGVzY3NpX3Njc2lfdCAqc2NzaSAgPSBzY3NpaG9zdF90b19pZGVzY3NpKGNtZC0+ZGV2aWNlLT5ob3N0KTsKIAlpZGVfZHJpdmVfdCAgICAqZHJpdmUgPSBzY3NpLT5kcml2ZTsKKwlpZGVfaHdpZl90ICAgICAqaHdpZjsKKwlpZGVfaHdncm91cF90ICAqaHdncm91cDsKIAlpbnQJCWJ1c3k7CiAJaW50ICAgICAgICAgICAgIHJldCAgID0gRkFJTEVEOwogCkBAIC01OTQsMTMgKzU5NiwxNiBAQAogCQlnb3RvIG5vX2RyaXZlOwogCX0KIAotCS8qIEZpcnN0IGdpdmUgaXQgc29tZSBtb3JlIHRpbWUsIGhvdyBtdWNoIGlzICJyaWdodCIgaXMgaGFyZCB0byBzYXkgOi0oICovCisJaHdpZiA9IGRyaXZlLT5od2lmOworCWh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCi0JYnVzeSA9IGlkZV93YWl0X25vdF9idXN5KEhXSUYoZHJpdmUpLCAxMDApOwkvKiBGSVhNRSAtIHVzZXMgbWRlbGF5IHdoaWNoIGNhdXNlcyBsYXRlbmN5PyAqLworCS8qIEZpcnN0IGdpdmUgaXQgc29tZSBtb3JlIHRpbWUsIGhvdyBtdWNoIGlzICJyaWdodCIgaXMgaGFyZCB0byBzYXkgOi0oCisJICAgRklYTUUgLSB1c2VzIG1kZWxheSB3aGljaCBjYXVzZXMgbGF0ZW5jeT8gKi8KKwlidXN5ID0gaWRlX3dhaXRfbm90X2J1c3koaHdpZiwgMTAwKTsKIAlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKIAkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBkcml2ZSBkaWQlcyBiZWNvbWUgcmVhZHlcbiIsIGJ1c3k/IiBub3QiOiIiKTsKIAotCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAogCS8qIElmIHRoZXJlIGlzIG5vIHBjIHJ1bm5pbmcgd2UncmUgZG9uZSAob3VyIGludGVycnVwdCB0b29rIGNhcmUgb2YgaXQpICovCiAJcGMgPSBkcml2ZS0+cGM7CkBAIC02MjksNyArNjM0LDcgQEAKIAl9CiAKIGlkZV91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIG5vX2RyaXZlOgogCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQogCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IGFib3J0IHJldHVybnMgJXNcbiIsIHJldCA9PSBTVUNDRVNTPyJzdWNjZXNzIjoiZmFpbGVkIik7CkBAIC02NDIsNiArNjQ3LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCWlkZXNjc2lfc2NzaV90ICpzY3NpICA9IHNjc2lob3N0X3RvX2lkZXNjc2koY21kLT5kZXZpY2UtPmhvc3QpOwogCWlkZV9kcml2ZV90ICAgICpkcml2ZSA9IHNjc2ktPmRyaXZlOworCWlkZV9od2dyb3VwX3QgICpod2dyb3VwOwogCWludCAgICAgICAgICAgICByZWFkeSA9IDA7CiAJaW50ICAgICAgICAgICAgIHJldCAgID0gU1VDQ0VTUzsKIApAQCAtNjU4LDE0ICs2NjQsMTggQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKKwlod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisKIAlzcGluX2xvY2tfaXJxKGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOwotCXNwaW5fbG9jaygmaWRlX2xvY2spOworCXNwaW5fbG9jaygmaHdncm91cC0+bG9jayk7CiAKIAlwYyA9IGRyaXZlLT5wYzsKKwlpZiAocGMpCisJCXJlcSA9IHBjLT5ycTsKIAotCWlmIChwYyA9PSBOVUxMIHx8IChyZXEgPSBwYy0+cnEpICE9IEhXR1JPVVAoZHJpdmUpLT5ycSB8fCAhSFdHUk9VUChkcml2ZSktPmhhbmRsZXIpIHsKKwlpZiAocGMgPT0gTlVMTCB8fCByZXEgIT0gaHdncm91cC0+cnEgfHwgaHdncm91cC0+aGFuZGxlciA9PSBOVUxMKSB7CiAJCXByaW50ayAoS0VSTl9XQVJOSU5HICJpZGUtc2NzaTogTm8gYWN0aXZlIHJlcXVlc3QgaW4gaWRlc2NzaV9laF9yZXNldFxuIik7Ci0JCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZod2dyb3VwLT5sb2NrKTsKIAkJc3Bpbl91bmxvY2tfaXJxKGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KQEAgLTY4NSwxMCArNjk1LDEwIEBACiAJCQlCVUcoKTsKIAl9CiAKLQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOwotCUhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyID0gTlVMTDsKLQlIV0dST1VQKGRyaXZlKS0+YnVzeSA9IDE7CQkvKiB3aWxsIHNldCB0aGlzIHRvIHplcm8gd2hlbiBpZGUgcmVzZXQgZmluaXNoZWQgKi8KLQlzcGluX3VubG9jaygmaWRlX2xvY2spOworCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwlod2dyb3VwLT5oYW5kbGVyID0gTlVMTDsKKwlod2dyb3VwLT5idXN5ID0gMTsgLyogd2lsbCBzZXQgdGhpcyB0byB6ZXJvIHdoZW4gaWRlIHJlc2V0IGZpbmlzaGVkICovCisJc3Bpbl91bmxvY2soJmh3Z3JvdXAtPmxvY2spOwogCiAJaWRlX2RvX3Jlc2V0KGRyaXZlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luMjAwMC5jIGIvZHJpdmVycy9zY3NpL2luMjAwMC5jCmluZGV4IDgwNTNiMWUuLjUyYmRjNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbjIwMDAuYworKysgYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogICogdGhpcyB0aGluZyBpbnRvIGFzIGdvb2QgYSBzaGFwZSBhcyBwb3NzaWJsZSwgYW5kIEknbSBwb3NpdGl2ZQogICogdGhlcmUgYXJlIGxvdHMgb2YgbHVya2luZyBidWdzIGFuZCAiU3R1cGlkIFBsYWNlcyIuCiAgKgotICogVXBkYXRlZCBmb3IgTGludXggMi41IGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiBVcGRhdGVkIGZvciBMaW51eCAyLjUgYnkgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCS0gVXNpbmcgbmV3X2VoIGhhbmRsZXIKICAqCS0gSG9wZWZ1bGx5IGdvdCBhbGwgdGhlIGxvY2tpbmcgcmlnaHQgYWdhaW4KICAqCVNlZSAiRklYTUUiIG5vdGVzIGZvciBpdGVtcyB0aGF0IGNvdWxkIGRvIHdpdGggbW9yZSB3b3JrCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKaW5kZXggZTNmNzM5Ny4uNTUyOTUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2luaXRpby5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4IEluaXRpbyBDb3Jwb3JhdGlvbgogICogQ29weXJpZ2h0IChjKSAxOTk4IEJhcyBWZXJtZXVsZW4gPGJ2ZXJtZXVsQGJsYWNrc3Rhci54czRhbGwubmw+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBsc3QuZGU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmVkIEhhdCA8YWxhbkByZWRoYXQuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3IFJlZCBIYXQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbml0aW8uaCBiL2RyaXZlcnMvc2NzaS9pbml0aW8uaAppbmRleCBjYjQ4ZWZhLi5lNThhZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmgKKysrIGIvZHJpdmVycy9zY3NpL2luaXRpby5oCkBAIC00LDcgKzQsNyBAQAogICogQ29weXJpZ2h0IChjKSAxOTk0LTE5OTggSW5pdGlvIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIENsZWFudXBzIChjKSBDb3B5cmlnaHQgMjAwNyBSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKiBDbGVhbnVwcyAoYykgQ29weXJpZ2h0IDIwMDcgUmVkIEhhdCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IGRlZDg1NGEuLjBlZGZiMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTUzODksOSArNTM4OSw5IEBACiAJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOwogCXdha2VfdXBfYWxsKCZpb2FfY2ZnLT5yZXNldF93YWl0X3EpOwogCi0Jc3Bpbl91bmxvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl91bmxvY2soaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKIAlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaW9hX2NmZy0+aG9zdCk7Ci0Jc3Bpbl9sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCXNwaW5fbG9jayhpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOwogCiAJaWYgKCFpb2FfY2ZnLT5hbGxvd19jbWRzKQogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGlvYV9jZmctPmhvc3QpOwpAQCAtNzQ3Myw3ICs3NDczLDcgQEAKIAkJZ290byBvdXRfc2NzaV9ob3N0X3B1dDsKIAl9CiAKLQlpcHJfcmVncyA9IGlvcmVtYXAoaXByX3JlZ3NfcGNpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpcHJfcmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKIAogCWlmICghaXByX3JlZ3MpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5oIGIvZHJpdmVycy9zY3NpL2lwci5oCmluZGV4IDQ4NzFkZDEuLjU5NDU5MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuaAorKysgYi9kcml2ZXJzL3Njc2kvaXByLmgKQEAgLTE5LDcgKzE5LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKgotICogQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gLSBSZW1vdmVkIHNldmVyYWwgY2FyZWxlc3MgdTMyL2RtYV9hZGRyX3QgZXJyb3JzCisgKiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiAtIFJlbW92ZWQgc2V2ZXJhbCBjYXJlbGVzcyB1MzIvZG1hX2FkZHJfdCBlcnJvcnMKICAqCQkJCXRoYXQgYnJva2UgNjRiaXQgcGxhdGZvcm1zLgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCBlMTFiY2U2Li4yMzgwOGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC0yNyw3ICsyNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CkBAIC00NCwxMiArNDMsMTIgQEAKIAogI2luY2x1ZGUgImlzY3NpX3RjcC5oIgogCi1NT0RVTEVfQVVUSE9SKCJEbWl0cnkgWXVzdXBvdiA8ZG1pdHJ5X3l1c0B5YWhvby5jb20+LCAiCitNT0RVTEVfQVVUSE9SKCJNaWtlIENocmlzdGllIDxtaWNoYWVsY0Bjcy53aXNjLmVkdT4sICIKKwkgICAgICAiRG1pdHJ5IFl1c3Vwb3YgPGRtaXRyeV95dXNAeWFob28uY29tPiwgIgogCSAgICAgICJBbGV4IEFpem1hbiA8aXRuNzgwQHlhaG9vLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaVNDU0kvVENQIGRhdGEtcGF0aCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogI3VuZGVmIERFQlVHX1RDUAotI2RlZmluZSBERUJVR19BU1NFUlQKIAogI2lmZGVmIERFQlVHX1RDUAogI2RlZmluZSBkZWJ1Z190Y3AoZm10Li4uKSBwcmludGsoS0VSTl9JTkZPICJ0Y3A6ICIgZm10KQpAQCAtNTcsMjE0ICs1NiwxNDQgQEAKICNkZWZpbmUgZGVidWdfdGNwKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIERFQlVHX0FTU0VSVAotI2lmZGVmIEJVR19PTgotI3VuZGVmIEJVR19PTgotI2VuZGlmCi0jZGVmaW5lIEJVR19PTihleHByKQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmlzY3NpX3RjcF9zY3NpX3RyYW5zcG9ydDsKLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGlzY3NpX3NodDsKLXN0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGlzY3NpX3RjcF90cmFuc3BvcnQ7CitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICppc2NzaV9zd190Y3Bfc2NzaV90cmFuc3BvcnQ7CitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NzaV9zd190Y3Bfc2h0Oworc3RhdGljIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgaXNjc2lfc3dfdGNwX3RyYW5zcG9ydDsKIAogc3RhdGljIHVuc2lnbmVkIGludCBpc2NzaV9tYXhfbHVuID0gNTEyOwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9sdW4sIGlzY3NpX21heF9sdW4sIHVpbnQsIFNfSVJVR08pOwogCi1zdGF0aWMgaW50IGlzY3NpX3RjcF9oZHJfcmVjdl9kb25lKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCi0JCQkJICAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQpOwotCi0vKgotICogU2NhdHRlcmxpc3QgaGFuZGxpbmc6IGluc2lkZSB0aGUgaXNjc2lfc2VnbWVudCwgd2UKLSAqIHJlbWVtYmVyIGFuIGluZGV4IGludG8gdGhlIHNjYXR0ZXJsaXN0LCBhbmQgc2V0IGRhdGEvc2l6ZQotICogdG8gdGhlIGN1cnJlbnQgc2NhdHRlcmxpc3QgZW50cnkuIEZvciBoaWdobWVtIHBhZ2VzLCB3ZQotICoga21hcCBhcyBuZWVkZWQuCi0gKgotICogTm90ZSB0aGF0IHRoZSBwYWdlIGlzIHVubWFwcGVkIHdoZW4gd2UgcmV0dXJuIGZyb20KLSAqIFRDUCdzIGRhdGFfcmVhZHkgaGFuZGxlciwgc28gd2UgbWF5IGVuZCB1cCBtYXBwaW5nIGFuZAotICogdW5tYXBwaW5nIHRoZSBzYW1lIHBhZ2UgcmVwZWF0ZWRseS4gVGhlIHdob2xlIHJlYXNvbgotICogZm9yIHRoaXMgaXMgdGhhdCB3ZSBzaG91bGRuJ3Qga2VlcCB0aGUgcGFnZSBtYXBwZWQKLSAqIG91dHNpZGUgdGhlIHNvZnRpcnEuCi0gKi8KLQogLyoqCi0gKiBpc2NzaV90Y3Bfc2VnbWVudF9pbml0X3NnIC0gaW5pdCBpbmRpY2F0ZWQgc2NhdHRlcmxpc3QgZW50cnkKLSAqIEBzZWdtZW50OiB0aGUgYnVmZmVyIG9iamVjdAotICogQHNnOiBzY2F0dGVybGlzdAotICogQG9mZnNldDogYnl0ZSBvZmZzZXQgaW50byB0aGF0IHNnIGVudHJ5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBzZWdtZW50IHNvIHRoYXQgc3Vic2VxdWVudAotICogZGF0YSBpcyBjb3BpZWQgdG8gdGhlIGluZGljYXRlZCBzZyBlbnRyeSwgYXQgdGhlIGdpdmVuCi0gKiBvZmZzZXQuCisgKiBpc2NzaV9zd190Y3BfcmVjdiAtIFRDUCByZWNlaXZlIGluIHNlbmRmaWxlIGZhc2hpb24KKyAqIEByZF9kZXNjOiByZWFkIGRlc2NyaXB0b3IKKyAqIEBza2I6IHNvY2tldCBidWZmZXIKKyAqIEBvZmZzZXQ6IG9mZnNldCBpbiBza2IKKyAqIEBsZW46IHNrYi0+bGVuIC0gb2Zmc2V0CiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXNjc2lfdGNwX3NlZ21lbnRfaW5pdF9zZyhzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgaXNjc2lfc3dfdGNwX3JlY3YocmVhZF9kZXNjcmlwdG9yX3QgKnJkX2Rlc2MsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBsZW4pCiB7Ci0Jc2VnbWVudC0+c2cgPSBzZzsKLQlzZWdtZW50LT5zZ19vZmZzZXQgPSBvZmZzZXQ7Ci0Jc2VnbWVudC0+c2l6ZSA9IG1pbihzZy0+bGVuZ3RoIC0gb2Zmc2V0LAotCQkJICAgIHNlZ21lbnQtPnRvdGFsX3NpemUgLSBzZWdtZW50LT50b3RhbF9jb3BpZWQpOwotCXNlZ21lbnQtPmRhdGEgPSBOVUxMOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gcmRfZGVzYy0+YXJnLmRhdGE7CisJdW5zaWduZWQgaW50IGNvbnN1bWVkLCB0b3RhbF9jb25zdW1lZCA9IDA7CisJaW50IHN0YXR1czsKKworCWRlYnVnX3RjcCgiaW4gJWQgYnl0ZXNcbiIsIHNrYi0+bGVuIC0gb2Zmc2V0KTsKKworCWRvIHsKKwkJc3RhdHVzID0gMDsKKwkJY29uc3VtZWQgPSBpc2NzaV90Y3BfcmVjdl9za2IoY29ubiwgc2tiLCBvZmZzZXQsIDAsICZzdGF0dXMpOworCQlvZmZzZXQgKz0gY29uc3VtZWQ7CisJCXRvdGFsX2NvbnN1bWVkICs9IGNvbnN1bWVkOworCX0gd2hpbGUgKGNvbnN1bWVkICE9IDAgJiYgc3RhdHVzICE9IElTQ1NJX1RDUF9TS0JfRE9ORSk7CisKKwlkZWJ1Z190Y3AoInJlYWQgJWQgYnl0ZXMgc3RhdHVzICVkXG4iLCBza2ItPmxlbiAtIG9mZnNldCwgc3RhdHVzKTsKKwlyZXR1cm4gdG90YWxfY29uc3VtZWQ7CiB9CiAKLS8qKgotICogaXNjc2lfdGNwX3NlZ21lbnRfbWFwIC0gbWFwIHRoZSBjdXJyZW50IFMvRyBwYWdlCi0gKiBAc2VnbWVudDogaXNjc2lfc2VnbWVudAotICogQHJlY3Y6IDEgaWYgY2FsbGVkIGZyb20gcmVjdiBwYXRoCi0gKgotICogV2Ugb25seSBuZWVkIHRvIHBvc3NpYmx5IGttYXAgZGF0YSBpZiBzY2F0dGVyIGxpc3RzIGFyZSBiZWluZyB1c2VkLAotICogYmVjYXVzZSB0aGUgaXNjc2kgcGFzc3Rocm91Z2ggYW5kIGludGVybmFsIElPIHBhdGhzIHdpbGwgbmV2ZXIgdXNlIGhpZ2gKLSAqIG1lbSBwYWdlcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pc2NzaV90Y3Bfc2VnbWVudF9tYXAoc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsIGludCByZWN2KQorc3RhdGljIHZvaWQgaXNjc2lfc3dfdGNwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZykKIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gc2stPnNrX3VzZXJfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlyZWFkX2Rlc2NyaXB0b3JfdCByZF9kZXNjOwogCi0JaWYgKHNlZ21lbnQtPmRhdGEgIT0gTlVMTCB8fCAhc2VnbWVudC0+c2cpCi0JCXJldHVybjsKLQotCXNnID0gc2VnbWVudC0+c2c7Ci0JQlVHX09OKHNlZ21lbnQtPnNnX21hcHBlZCk7Ci0JQlVHX09OKHNnLT5sZW5ndGggPT0gMCk7CisJcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAkvKgotCSAqIElmIHRoZSBwYWdlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBvbmUgaXQgaXMgb2sgdG8gc2VuZAotCSAqIHRvIHRoZSBuZXR3b3JrIGxheWVyJ3MgemVybyBjb3B5IHNlbmQgcGF0aC4gSWYgbm90IHdlCi0JICogaGF2ZSB0byBnbyB0aGUgc2xvdyBzZW5kbXNnIHBhdGguIFdlIGFsd2F5cyBtYXAgZm9yIHRoZQotCSAqIHJlY3YgcGF0aC4KKwkgKiBVc2UgcmRfZGVzYyB0byBwYXNzICdjb25uJyB0byBpc2NzaV90Y3BfcmVjdi4KKwkgKiBXZSBzZXQgY291bnQgdG8gMSBiZWNhdXNlIHdlIHdhbnQgdGhlIG5ldHdvcmsgbGF5ZXIgdG8KKwkgKiBoYW5kIHVzIGFsbCB0aGUgc2ticyB0aGF0IGFyZSBhdmFpbGFibGUuIGlzY3NpX3RjcF9yZWN2CisJICogaGFuZGxlZCBwZHVzIHRoYXQgY3Jvc3MgYnVmZmVycyBvciBwZHVzIHRoYXQgc3RpbGwgbmVlZCBkYXRhLgogCSAqLwotCWlmIChwYWdlX2NvdW50KHNnX3BhZ2Uoc2cpKSA+PSAxICYmICFyZWN2KQotCQlyZXR1cm47CisJcmRfZGVzYy5hcmcuZGF0YSA9IGNvbm47CisJcmRfZGVzYy5jb3VudCA9IDE7CisJdGNwX3JlYWRfc29jayhzaywgJnJkX2Rlc2MsIGlzY3NpX3N3X3RjcF9yZWN2KTsKIAotCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3NlZ21lbnRfbWFwICVzICVwXG4iLCByZWN2ID8gInJlY3YiIDogInhtaXQiLAotCQkgIHNlZ21lbnQpOwotCXNlZ21lbnQtPnNnX21hcHBlZCA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9TT0ZUSVJRMCk7Ci0Jc2VnbWVudC0+ZGF0YSA9IHNlZ21lbnQtPnNnX21hcHBlZCArIHNnLT5vZmZzZXQgKyBzZWdtZW50LT5zZ19vZmZzZXQ7CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKworCS8qIElmIHdlIGhhZCB0byAoYXRvbWljYWxseSkgbWFwIGEgaGlnaG1lbSBwYWdlLAorCSAqIHVubWFwIGl0IG5vdy4gKi8KKwlpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCgmdGNwX2Nvbm4tPmluLnNlZ21lbnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlzY3NpX3RjcF9zZWdtZW50X3VubWFwKHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQorc3RhdGljIHZvaWQgaXNjc2lfc3dfdGNwX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JZGVidWdfdGNwKCJpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCAlcFxuIiwgc2VnbWVudCk7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubjsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uOworCXZvaWQgKCpvbGRfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqKTsKIAotCWlmIChzZWdtZW50LT5zZ19tYXBwZWQpIHsKLQkJZGVidWdfdGNwKCJpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCB2YWxpZFxuIik7Ci0JCWt1bm1hcF9hdG9taWMoc2VnbWVudC0+c2dfbWFwcGVkLCBLTV9TT0ZUSVJRMCk7Ci0JCXNlZ21lbnQtPnNnX21hcHBlZCA9IE5VTEw7Ci0JCXNlZ21lbnQtPmRhdGEgPSBOVUxMOworCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCisJY29ubiA9IChzdHJ1Y3QgaXNjc2lfY29ubiopc2stPnNrX3VzZXJfZGF0YTsKKwlzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKworCWlmICgoc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRV9XQUlUIHx8CisJICAgICBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKSAmJgorCSAgICAhYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSkgeworCQlkZWJ1Z190Y3AoImlzY3NpX3RjcF9zdGF0ZV9jaGFuZ2U6IFRDUF9DTE9TRXxUQ1BfQ0xPU0VfV0FJVFxuIik7CisJCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogCX0KLX0KIAotLyoKLSAqIFNwbGljZSB0aGUgZGlnZXN0IGJ1ZmZlciBpbnRvIHRoZSBidWZmZXIKLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pc2NzaV90Y3Bfc2VnbWVudF9zcGxpY2VfZGlnZXN0KHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50LCB2b2lkICpkaWdlc3QpCi17Ci0Jc2VnbWVudC0+ZGF0YSA9IGRpZ2VzdDsKLQlzZWdtZW50LT5kaWdlc3RfbGVuID0gSVNDU0lfRElHRVNUX1NJWkU7Ci0Jc2VnbWVudC0+dG90YWxfc2l6ZSArPSBJU0NTSV9ESUdFU1RfU0laRTsKLQlzZWdtZW50LT5zaXplID0gSVNDU0lfRElHRVNUX1NJWkU7Ci0Jc2VnbWVudC0+Y29waWVkID0gMDsKLQlzZWdtZW50LT5zZyA9IE5VTEw7Ci0Jc2VnbWVudC0+aGFzaCA9IE5VTEw7CisJdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisJb2xkX3N0YXRlX2NoYW5nZSA9IHRjcF9zd19jb25uLT5vbGRfc3RhdGVfY2hhbmdlOworCisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKworCW9sZF9zdGF0ZV9jaGFuZ2Uoc2spOwogfQogCiAvKioKLSAqIGlzY3NpX3RjcF9zZWdtZW50X2RvbmUgLSBjaGVjayB3aGV0aGVyIHRoZSBzZWdtZW50IGlzIGNvbXBsZXRlCi0gKiBAc2VnbWVudDogaXNjc2kgc2VnbWVudCB0byBjaGVjawotICogQHJlY3Y6IHNldCB0byBvbmUgb2YgdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgcmVjdiBwYXRoCi0gKiBAY29waWVkOiBudW1iZXIgb2YgYnl0ZXMgY29waWVkCi0gKgotICogQ2hlY2sgaWYgd2UncmUgZG9uZSByZWNlaXZpbmcgdGhpcyBzZWdtZW50LiBJZiB0aGUgcmVjZWl2ZQotICogYnVmZmVyIGlzIGZ1bGwgYnV0IHdlIGV4cGVjdCBtb3JlIGRhdGEsIG1vdmUgb24gdG8gdGhlCi0gKiBuZXh0IGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdC4KLSAqCi0gKiBJZiB0aGUgYW1vdW50IG9mIGRhdGEgd2UgcmVjZWl2ZWQgaXNuJ3QgYSBtdWx0aXBsZSBvZiA0LAotICogd2Ugd2lsbCB0cmFuc3BhcmVudGx5IHJlY2VpdmUgdGhlIHBhZCBieXRlcywgdG9vLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSByZS1lbnRyYW50LgotICovCi1zdGF0aWMgaW5saW5lIGludAotaXNjc2lfdGNwX3NlZ21lbnRfZG9uZShzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwgaW50IHJlY3YsIHVuc2lnbmVkIGNvcGllZCkKKyAqIGlzY3NpX3dyaXRlX3NwYWNlIC0gQ2FsbGVkIHdoZW4gbW9yZSBvdXRwdXQgYnVmZmVyIHNwYWNlIGlzIGF2YWlsYWJsZQorICogQHNrOiBzb2NrZXQgc3BhY2UgaXMgYXZhaWxhYmxlIGZvcgorICoqLworc3RhdGljIHZvaWQgaXNjc2lfc3dfdGNwX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBwYWRidWZbSVNDU0lfUEFEX0xFTl07Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwotCXVuc2lnbmVkIGludCBwYWQ7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSAoc3RydWN0IGlzY3NpX2Nvbm4qKXNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOwogCi0JZGVidWdfdGNwKCJjb3BpZWQgJXUgJXUgc2l6ZSAldSAlc1xuIiwgc2VnbWVudC0+Y29waWVkLCBjb3BpZWQsCi0JCSAgc2VnbWVudC0+c2l6ZSwgcmVjdiA/ICJyZWN2IiA6ICJ4bWl0Iik7Ci0JaWYgKHNlZ21lbnQtPmhhc2ggJiYgY29waWVkKSB7Ci0JCS8qCi0JCSAqIElmIGEgc2VnbWVudCBpcyBrbWFwZCB3ZSBtdXN0IHVubWFwIGl0IGJlZm9yZSBzZW5kaW5nCi0JCSAqIHRvIHRoZSBjcnlwdG8gbGF5ZXIgc2luY2UgdGhhdCB3aWxsIHRyeSB0byBrbWFwIGl0IGFnYWluLgotCQkgKi8KLQkJaXNjc2lfdGNwX3NlZ21lbnRfdW5tYXAoc2VnbWVudCk7CisJdGNwX3N3X2Nvbm4tPm9sZF93cml0ZV9zcGFjZShzayk7CisJZGVidWdfdGNwKCJpc2NzaV93cml0ZV9zcGFjZTogY2lkICVkXG4iLCBjb25uLT5pZCk7CisJc2NzaV9xdWV1ZV93b3JrKGNvbm4tPnNlc3Npb24tPmhvc3QsICZjb25uLT54bWl0d29yayk7Cit9CiAKLQkJaWYgKCFzZWdtZW50LT5kYXRhKSB7Ci0JCQlzZ19pbml0X3RhYmxlKCZzZywgMSk7Ci0JCQlzZ19zZXRfcGFnZSgmc2csIHNnX3BhZ2Uoc2VnbWVudC0+c2cpLCBjb3BpZWQsCi0JCQkJICAgIHNlZ21lbnQtPmNvcGllZCArIHNlZ21lbnQtPnNnX29mZnNldCArCi0JCQkJCQkJc2VnbWVudC0+c2ctPm9mZnNldCk7Ci0JCX0gZWxzZQotCQkJc2dfaW5pdF9vbmUoJnNnLCBzZWdtZW50LT5kYXRhICsgc2VnbWVudC0+Y29waWVkLAotCQkJCSAgICBjb3BpZWQpOwotCQljcnlwdG9faGFzaF91cGRhdGUoc2VnbWVudC0+aGFzaCwgJnNnLCBjb3BpZWQpOwotCX0KK3N0YXRpYyB2b2lkIGlzY3NpX3N3X3RjcF9jb25uX3NldF9jYWxsYmFja3Moc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOworCXN0cnVjdCBzb2NrICpzayA9IHRjcF9zd19jb25uLT5zb2NrLT5zazsKIAotCXNlZ21lbnQtPmNvcGllZCArPSBjb3BpZWQ7Ci0JaWYgKHNlZ21lbnQtPmNvcGllZCA8IHNlZ21lbnQtPnNpemUpIHsKLQkJaXNjc2lfdGNwX3NlZ21lbnRfbWFwKHNlZ21lbnQsIHJlY3YpOwotCQlyZXR1cm4gMDsKLQl9CisJLyogYXNzaWduIG5ldyBjYWxsYmFja3MgKi8KKwl3cml0ZV9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJc2stPnNrX3VzZXJfZGF0YSA9IGNvbm47CisJdGNwX3N3X2Nvbm4tPm9sZF9kYXRhX3JlYWR5ID0gc2stPnNrX2RhdGFfcmVhZHk7CisJdGNwX3N3X2Nvbm4tPm9sZF9zdGF0ZV9jaGFuZ2UgPSBzay0+c2tfc3RhdGVfY2hhbmdlOworCXRjcF9zd19jb25uLT5vbGRfd3JpdGVfc3BhY2UgPSBzay0+c2tfd3JpdGVfc3BhY2U7CisJc2stPnNrX2RhdGFfcmVhZHkgPSBpc2NzaV9zd190Y3BfZGF0YV9yZWFkeTsKKwlzay0+c2tfc3RhdGVfY2hhbmdlID0gaXNjc2lfc3dfdGNwX3N0YXRlX2NoYW5nZTsKKwlzay0+c2tfd3JpdGVfc3BhY2UgPSBpc2NzaV9zd190Y3Bfd3JpdGVfc3BhY2U7CisJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit9CiAKLQlzZWdtZW50LT50b3RhbF9jb3BpZWQgKz0gc2VnbWVudC0+Y29waWVkOwotCXNlZ21lbnQtPmNvcGllZCA9IDA7Ci0Jc2VnbWVudC0+c2l6ZSA9IDA7CitzdGF0aWMgdm9pZAoraXNjc2lfc3dfdGNwX2Nvbm5fcmVzdG9yZV9jYWxsYmFja3Moc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSB0Y3Bfc3dfY29ubi0+c29jay0+c2s7CiAKLQkvKiBVbm1hcCB0aGUgY3VycmVudCBzY2F0dGVybGlzdCBwYWdlLCBpZiB0aGVyZSBpcyBvbmUuICovCi0JaXNjc2lfdGNwX3NlZ21lbnRfdW5tYXAoc2VnbWVudCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIG1vcmUgc2NhdHRlcmxpc3QgZW50cmllcz8gKi8KLQlkZWJ1Z190Y3AoInRvdGFsIGNvcGllZCAldSB0b3RhbCBzaXplICV1XG4iLCBzZWdtZW50LT50b3RhbF9jb3BpZWQsCi0JCSAgIHNlZ21lbnQtPnRvdGFsX3NpemUpOwotCWlmIChzZWdtZW50LT50b3RhbF9jb3BpZWQgPCBzZWdtZW50LT50b3RhbF9zaXplKSB7Ci0JCS8qIFByb2NlZWQgdG8gdGhlIG5leHQgZW50cnkgaW4gdGhlIHNjYXR0ZXJsaXN0LiAqLwotCQlpc2NzaV90Y3Bfc2VnbWVudF9pbml0X3NnKHNlZ21lbnQsIHNnX25leHQoc2VnbWVudC0+c2cpLAotCQkJCQkgIDApOwotCQlpc2NzaV90Y3Bfc2VnbWVudF9tYXAoc2VnbWVudCwgcmVjdik7Ci0JCUJVR19PTihzZWdtZW50LT5zaXplID09IDApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBwYWRkaW5nPyAqLwotCXBhZCA9IGlzY3NpX3BhZGRpbmcoc2VnbWVudC0+dG90YWxfY29waWVkKTsKLQlpZiAocGFkICE9IDApIHsKLQkJZGVidWdfdGNwKCJjb25zdW1lICVkIHBhZCBieXRlc1xuIiwgcGFkKTsKLQkJc2VnbWVudC0+dG90YWxfc2l6ZSArPSBwYWQ7Ci0JCXNlZ21lbnQtPnNpemUgPSBwYWQ7Ci0JCXNlZ21lbnQtPmRhdGEgPSBwYWRidWY7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogU2V0IHVzIHVwIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGRhdGEgZGlnZXN0LiBoZHIgZGlnZXN0Ci0JICogaXMgY29tcGxldGVseSBoYW5kbGVkIGluIGhkciBkb25lIGZ1bmN0aW9uLgotCSAqLwotCWlmIChzZWdtZW50LT5oYXNoKSB7Ci0JCWNyeXB0b19oYXNoX2ZpbmFsKHNlZ21lbnQtPmhhc2gsIHNlZ21lbnQtPmRpZ2VzdCk7Ci0JCWlzY3NpX3RjcF9zZWdtZW50X3NwbGljZV9kaWdlc3Qoc2VnbWVudCwKLQkJCQkgcmVjdiA/IHNlZ21lbnQtPnJlY3ZfZGlnZXN0IDogc2VnbWVudC0+ZGlnZXN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7CisJLyogcmVzdG9yZSBzb2NrZXQgY2FsbGJhY2tzLCBzZWUgYWxzbzogaXNjc2lfY29ubl9zZXRfY2FsbGJhY2tzKCkgKi8KKwl3cml0ZV9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJc2stPnNrX3VzZXJfZGF0YSAgICA9IE5VTEw7CisJc2stPnNrX2RhdGFfcmVhZHkgICA9IHRjcF9zd19jb25uLT5vbGRfZGF0YV9yZWFkeTsKKwlzay0+c2tfc3RhdGVfY2hhbmdlID0gdGNwX3N3X2Nvbm4tPm9sZF9zdGF0ZV9jaGFuZ2U7CisJc2stPnNrX3dyaXRlX3NwYWNlICA9IHRjcF9zd19jb25uLT5vbGRfd3JpdGVfc3BhY2U7CisJc2stPnNrX25vX2NoZWNrCSA9IDA7CisJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiB9CiAKIC8qKgotICogaXNjc2lfdGNwX3htaXRfc2VnbWVudCAtIHRyYW5zbWl0IHNlZ21lbnQKKyAqIGlzY3NpX3N3X3RjcF94bWl0X3NlZ21lbnQgLSB0cmFuc21pdCBzZWdtZW50CiAgKiBAdGNwX2Nvbm46IHRoZSBpU0NTSSBUQ1AgY29ubmVjdGlvbgogICogQHNlZ21lbnQ6IHRoZSBidWZmZXIgdG8gdHJhbnNtbml0CiAgKgpAQCAtMjc2LDE1ICsyMDUsMTUgQEAKICAqIGhhc2ggYXMgaXQgZ29lcy4gV2hlbiB0aGUgZW50aXJlIHNlZ21lbnQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQsCiAgKiBpdCB3aWxsIHJldHJpZXZlIHRoZSBoYXNoIHZhbHVlIGFuZCBzZW5kIGl0IGFzIHdlbGwuCiAgKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF94bWl0X3NlZ21lbnQoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiwKLQkJICAgICAgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQorc3RhdGljIGludCBpc2NzaV9zd190Y3BfeG1pdF9zZWdtZW50KHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCisJCQkJICAgICBzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCkKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzayA9IHRjcF9jb25uLT5zb2NrOworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3Qgc29ja2V0ICpzayA9IHRjcF9zd19jb25uLT5zb2NrOwogCXVuc2lnbmVkIGludCBjb3BpZWQgPSAwOwogCWludCByID0gMDsKIAotCXdoaWxlICghaXNjc2lfdGNwX3NlZ21lbnRfZG9uZShzZWdtZW50LCAwLCByKSkgeworCXdoaWxlICghaXNjc2lfdGNwX3NlZ21lbnRfZG9uZSh0Y3BfY29ubiwgc2VnbWVudCwgMCwgcikpIHsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAkJdW5zaWduZWQgaW50IG9mZnNldCwgY29weTsKIAkJaW50IGZsYWdzID0gMDsKQEAgLTMwMCw4ICsyMjksOCBAQAogCQlpZiAoIXNlZ21lbnQtPmRhdGEpIHsKIAkJCXNnID0gc2VnbWVudC0+c2c7CiAJCQlvZmZzZXQgKz0gc2VnbWVudC0+c2dfb2Zmc2V0ICsgc2ctPm9mZnNldDsKLQkJCXIgPSB0Y3BfY29ubi0+c2VuZHBhZ2Uoc2ssIHNnX3BhZ2Uoc2cpLCBvZmZzZXQsIGNvcHksCi0JCQkJCSAgICAgICBmbGFncyk7CisJCQlyID0gdGNwX3N3X2Nvbm4tPnNlbmRwYWdlKHNrLCBzZ19wYWdlKHNnKSwgb2Zmc2V0LAorCQkJCQkJICBjb3B5LCBmbGFncyk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19mbGFncyA9IGZsYWdzIH07CiAJCQlzdHJ1Y3Qga3ZlYyBpb3YgPSB7CkBAIC0zMjQsNzgwICsyNTMsMTggQEAKIH0KIAogLyoqCi0gKiBpc2NzaV90Y3Bfc2VnbWVudF9yZWN2IC0gY29weSBkYXRhIHRvIHNlZ21lbnQKLSAqIEB0Y3BfY29ubjogdGhlIGlTQ1NJIFRDUCBjb25uZWN0aW9uCi0gKiBAc2VnbWVudDogdGhlIGJ1ZmZlciB0byBjb3B5IHRvCi0gKiBAcHRyOiBkYXRhIHBvaW50ZXIKLSAqIEBsZW46IGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gY29waWVzIHVwIHRvIEBsZW4gYnl0ZXMgdG8gdGhlCi0gKiBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqIGNvbnN1bWVkLCB3aGljaCBjYW4gYWN0dWFsbHkgYmUgbGVzcyB0aGFuIEBsZW4uCi0gKgotICogSWYgaGFzaCBkaWdlc3QgaXMgZW5hYmxlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZQotICogaGFzaCB3aGlsZSBjb3B5aW5nLgotICogQ29tYmluaW5nIHRoZXNlIHR3byBvcGVyYXRpb25zIGRvZXNuJ3QgYnV5IHVzIGEgbG90ICh5ZXQpLAotICogYnV0IGluIHRoZSBmdXR1cmUgd2UgY291bGQgaW1wbGVtZW50IGNvbWJpbmVkIGNvcHkrY3JjLAotICoganVzdCB3YXkgd2UgZG8gZm9yIG5ldHdvcmsgbGF5ZXIgY2hlY2tzdW1zLgotICovCi1zdGF0aWMgaW50Ci1pc2NzaV90Y3Bfc2VnbWVudF9yZWN2KHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCi0JCSAgICAgICBzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwgY29uc3Qgdm9pZCAqcHRyLAotCQkgICAgICAgdW5zaWduZWQgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgY29weSA9IDAsIGNvcGllZCA9IDA7Ci0KLQl3aGlsZSAoIWlzY3NpX3RjcF9zZWdtZW50X2RvbmUoc2VnbWVudCwgMSwgY29weSkpIHsKLQkJaWYgKGNvcGllZCA9PSBsZW4pIHsKLQkJCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3NlZ21lbnRfcmVjdiBjb3BpZWQgJWQgYnl0ZXNcbiIsCi0JCQkJICBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljb3B5ID0gbWluKGxlbiAtIGNvcGllZCwgc2VnbWVudC0+c2l6ZSAtIHNlZ21lbnQtPmNvcGllZCk7Ci0JCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3NlZ21lbnRfcmVjdiBjb3B5aW5nICVkXG4iLCBjb3B5KTsKLQkJbWVtY3B5KHNlZ21lbnQtPmRhdGEgKyBzZWdtZW50LT5jb3BpZWQsIHB0ciArIGNvcGllZCwgY29weSk7Ci0JCWNvcGllZCArPSBjb3B5OwotCX0KLQlyZXR1cm4gY29waWVkOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlzY3NpX3RjcF9kZ3N0X2hlYWRlcihzdHJ1Y3QgaGFzaF9kZXNjICpoYXNoLCBjb25zdCB2b2lkICpoZHIsIHNpemVfdCBoZHJsZW4sCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0W0lTQ1NJX0RJR0VTVF9TSVpFXSkKLXsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7Ci0KLQlzZ19pbml0X29uZSgmc2csIGhkciwgaGRybGVuKTsKLQljcnlwdG9faGFzaF9kaWdlc3QoaGFzaCwgJnNnLCBoZHJsZW4sIGRpZ2VzdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pc2NzaV90Y3BfZGdzdF92ZXJpZnkoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiwKLQkJICAgICAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQpCi17Ci0JaWYgKCFzZWdtZW50LT5kaWdlc3RfbGVuKQotCQlyZXR1cm4gMTsKLQotCWlmIChtZW1jbXAoc2VnbWVudC0+cmVjdl9kaWdlc3QsIHNlZ21lbnQtPmRpZ2VzdCwKLQkJICAgc2VnbWVudC0+ZGlnZXN0X2xlbikpIHsKLQkJZGVidWdfc2NzaSgiZGlnZXN0IG1pc21hdGNoXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHNlZ21lbnQgYnVmZmVyCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pc2NzaV9zZWdtZW50X2luaXQoc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsIHNpemVfdCBzaXplLAotCQkgICAgIGlzY3NpX3NlZ21lbnRfZG9uZV9mbl90ICpkb25lLCBzdHJ1Y3QgaGFzaF9kZXNjICpoYXNoKQotewotCW1lbXNldChzZWdtZW50LCAwLCBzaXplb2YoKnNlZ21lbnQpKTsKLQlzZWdtZW50LT50b3RhbF9zaXplID0gc2l6ZTsKLQlzZWdtZW50LT5kb25lID0gZG9uZTsKLQotCWlmIChoYXNoKSB7Ci0JCXNlZ21lbnQtPmhhc2ggPSBoYXNoOwotCQljcnlwdG9faGFzaF9pbml0KGhhc2gpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50LCB2b2lkICpkYXRhLAotCQkJICBzaXplX3Qgc2l6ZSwgaXNjc2lfc2VnbWVudF9kb25lX2ZuX3QgKmRvbmUsCi0JCQkgIHN0cnVjdCBoYXNoX2Rlc2MgKmhhc2gpCi17Ci0JX19pc2NzaV9zZWdtZW50X2luaXQoc2VnbWVudCwgc2l6ZSwgZG9uZSwgaGFzaCk7Ci0Jc2VnbWVudC0+ZGF0YSA9IGRhdGE7Ci0Jc2VnbWVudC0+c2l6ZSA9IHNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pc2NzaV9zZWdtZW50X3NlZWtfc2coc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsCi0JCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwgdW5zaWduZWQgaW50IHNnX2NvdW50LAotCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkJICAgICAgaXNjc2lfc2VnbWVudF9kb25lX2ZuX3QgKmRvbmUsIHN0cnVjdCBoYXNoX2Rlc2MgKmhhc2gpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWRlYnVnX3Njc2koImlzY3NpX3NlZ21lbnRfc2Vla19zZyBvZmZzZXQgJXUgc2l6ZSAlbGx1XG4iLAotCQkgIG9mZnNldCwgc2l6ZSk7Ci0JX19pc2NzaV9zZWdtZW50X2luaXQoc2VnbWVudCwgc2l6ZSwgZG9uZSwgaGFzaCk7Ci0JZm9yX2VhY2hfc2coc2dfbGlzdCwgc2csIHNnX2NvdW50LCBpKSB7Ci0JCWRlYnVnX3Njc2koInNnICVkLCBsZW4gJXUgb2Zmc2V0ICV1XG4iLCBpLCBzZy0+bGVuZ3RoLAotCQkJICAgc2ctPm9mZnNldCk7Ci0JCWlmIChvZmZzZXQgPCBzZy0+bGVuZ3RoKSB7Ci0JCQlpc2NzaV90Y3Bfc2VnbWVudF9pbml0X3NnKHNlZ21lbnQsIHNnLCBvZmZzZXQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJb2Zmc2V0IC09IHNnLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIElTQ1NJX0VSUl9EQVRBX09GRlNFVDsKLX0KLQotLyoqCi0gKiBpc2NzaV90Y3BfaGRyX3JlY3ZfcHJlcCAtIHByZXAgc2VnbWVudCBmb3IgaGRyIHJlY2VwdGlvbgotICogQHRjcF9jb25uOiBpc2NzaSBjb25uZWN0aW9uIHRvIHByZXAgZm9yCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbHdheXMgcGFzc2VzIE5VTEwgZm9yIHRoZSBoYXNoIGFyZ3VtZW50LCBiZWNhdXNlIHdoZW4gdGhpcwotICogZnVuY3Rpb24gaXMgY2FsbGVkIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgaGVhZGVyIGFuZCB3YW50Ci0gKiB0byBkZWxheSB0aGUgZGlnZXN0IHByb2Nlc3NpbmcgdW50aWwgd2Uga25vdyB0aGF0LgotICovCi1zdGF0aWMgdm9pZAotaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubikKLXsKLQlkZWJ1Z190Y3AoImlzY3NpX3RjcF9oZHJfcmVjdl9wcmVwKCVwJXMpXG4iLCB0Y3BfY29ubiwKLQkJICB0Y3BfY29ubi0+aXNjc2lfY29ubi0+aGRyZGdzdF9lbiA/ICIsIGRpZ2VzdCBlbmFibGVkIiA6ICIiKTsKLQlpc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKCZ0Y3BfY29ubi0+aW4uc2VnbWVudCwKLQkJCQl0Y3BfY29ubi0+aW4uaGRyX2J1Ziwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpLAotCQkJCWlzY3NpX3RjcF9oZHJfcmVjdl9kb25lLCBOVUxMKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBpbmNvbWluZyByZXBseSB0byBhbnkgb3RoZXIgdHlwZSBvZiBjb21tYW5kCi0gKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF9kYXRhX3JlY3ZfZG9uZShzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uLAotCQkJIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQotewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGNwX2Nvbm4tPmlzY3NpX2Nvbm47Ci0JaW50IHJjID0gMDsKLQotCWlmICghaXNjc2lfdGNwX2Rnc3RfdmVyaWZ5KHRjcF9jb25uLCBzZWdtZW50KSkKLQkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBX0RHU1Q7Ci0KLQlyYyA9IGlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCB0Y3BfY29ubi0+aW4uaGRyLAotCQkJY29ubi0+ZGF0YSwgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAodGNwX2Nvbm4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotaXNjc2lfdGNwX2RhdGFfcmVjdl9wcmVwKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4pCi17Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSB0Y3BfY29ubi0+aXNjc2lfY29ubjsKLQlzdHJ1Y3QgaGFzaF9kZXNjICpyeF9oYXNoID0gTlVMTDsKLQotCWlmIChjb25uLT5kYXRhZGdzdF9lbikKLQkJcnhfaGFzaCA9ICZ0Y3BfY29ubi0+cnhfaGFzaDsKLQotCWlzY3NpX3NlZ21lbnRfaW5pdF9saW5lYXIoJnRjcF9jb25uLT5pbi5zZWdtZW50LAotCQkJCWNvbm4tPmRhdGEsIHRjcF9jb25uLT5pbi5kYXRhbGVuLAotCQkJCWlzY3NpX3RjcF9kYXRhX3JlY3ZfZG9uZSwgcnhfaGFzaCk7Ci19Ci0KLS8qCi0gKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jawotICovCi1zdGF0aWMgdm9pZAotaXNjc2lfdGNwX2NsZWFudXBfdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCi17Ci0Jc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQ7Ci0KLQkvKiBub3RoaW5nIHRvIGRvIGZvciBtZ210IHRhc2tzICovCi0JaWYgKCF0YXNrLT5zYykKLQkJcmV0dXJuOwotCi0JLyogZmx1c2ggdGFzaydzIHIydCBxdWV1ZXMgKi8KLQl3aGlsZSAoX19rZmlmb19nZXQodGNwX3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSkpIHsKLQkJX19rZmlmb19wdXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlkZWJ1Z19zY3NpKCJpc2NzaV90Y3BfY2xlYW51cF90YXNrIHBlbmRpbmcgcjJ0IGRyb3BwZWRcbiIpOwotCX0KLQotCXIydCA9IHRjcF90YXNrLT5yMnQ7Ci0JaWYgKHIydCAhPSBOVUxMKSB7Ci0JCV9fa2ZpZm9fcHV0KHRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKLQkJCSAgICBzaXplb2Yodm9pZCopKTsKLQkJdGNwX3Rhc2stPnIydCA9IE5VTEw7Ci0JfQotfQotCi0vKioKLSAqIGlzY3NpX2RhdGFfaW4gLSBTQ1NJIERhdGEtSW4gUmVzcG9uc2UgcHJvY2Vzc2luZwotICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KLSAqIEB0YXNrOiBzY3NpIGNvbW1hbmQgdGFzaworICogaXNjc2lfc3dfdGNwX3htaXQgLSBUQ1AgdHJhbnNtaXQKICAqKi8KLXN0YXRpYyBpbnQKLWlzY3NpX2RhdGFfaW4oc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQorc3RhdGljIGludCBpc2NzaV9zd190Y3BfeG1pdChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKIHsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKLQlzdHJ1Y3QgaXNjc2lfZGF0YV9yc3AgKnJoZHIgPSAoc3RydWN0IGlzY3NpX2RhdGFfcnNwICopdGNwX2Nvbm4tPmluLmhkcjsKLQlpbnQgZGF0YXNuID0gYmUzMl90b19jcHUocmhkci0+ZGF0YXNuKTsKLQl1bnNpZ25lZCB0b3RhbF9pbl9sZW5ndGggPSBzY3NpX2luKHRhc2stPnNjKS0+bGVuZ3RoOwotCi0JaXNjc2lfdXBkYXRlX2NtZHNuKGNvbm4tPnNlc3Npb24sIChzdHJ1Y3QgaXNjc2lfbm9waW4qKXJoZHIpOwotCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbiA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICh0Y3BfdGFzay0+ZXhwX2RhdGFzbiAhPSBkYXRhc24pIHsKLQkJZGVidWdfdGNwKCIlczogdGFzay0+ZXhwX2RhdGFzbiglZCkgIT0gcmhkci0+ZGF0YXNuKCVkKVxuIiwKLQkJICAgICAgICAgIF9fZnVuY19fLCB0Y3BfdGFzay0+ZXhwX2RhdGFzbiwgZGF0YXNuKTsKLQkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBU047Ci0JfQotCi0JdGNwX3Rhc2stPmV4cF9kYXRhc24rKzsKLQotCXRjcF90YXNrLT5kYXRhX29mZnNldCA9IGJlMzJfdG9fY3B1KHJoZHItPm9mZnNldCk7Ci0JaWYgKHRjcF90YXNrLT5kYXRhX29mZnNldCArIHRjcF9jb25uLT5pbi5kYXRhbGVuID4gdG90YWxfaW5fbGVuZ3RoKSB7Ci0JCWRlYnVnX3RjcCgiJXM6IGRhdGFfb2Zmc2V0KCVkKSArIGRhdGFfbGVuKCVkKSA+IHRvdGFsX2xlbmd0aF9pbiglZClcbiIsCi0JCSAgICAgICAgICBfX2Z1bmNfXywgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAotCQkgICAgICAgICAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sIHRvdGFsX2luX2xlbmd0aCk7Ci0JCXJldHVybiBJU0NTSV9FUlJfREFUQV9PRkZTRVQ7Ci0JfQotCi0JY29ubi0+ZGF0YWluX3BkdXNfY250Kys7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXNjc2lfc29saWNpdF9kYXRhX2luaXQgLSBpbml0aWFsaXplIGZpcnN0IERhdGEtT3V0Ci0gKiBAY29ubjogaXNjc2kgY29ubmVjdGlvbgotICogQHRhc2s6IHNjc2kgY29tbWFuZCB0YXNrCi0gKiBAcjJ0OiBSMlQgaW5mbwotICoKLSAqIE5vdGVzOgotICoJSW5pdGlhbGl6ZSBmaXJzdCBEYXRhLU91dCB3aXRoaW4gdGhpcyBSMlQgc2VxdWVuY2UgYW5kIGZpbmRzCi0gKglwcm9wZXIgZGF0YV9vZmZzZXQgd2l0aGluIHRoaXMgU0NTSSBjb21tYW5kLgotICoKLSAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIHRha2VuLgotICoqLwotc3RhdGljIHZvaWQKLWlzY3NpX3NvbGljaXRfZGF0YV9pbml0KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKLQkJCXN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqcjJ0KQotewotCXN0cnVjdCBpc2NzaV9kYXRhICpoZHI7Ci0KLQloZHIgPSAmcjJ0LT5kdGFzay5oZHI7Ci0JbWVtc2V0KGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9kYXRhKSk7Ci0JaGRyLT50dHQgPSByMnQtPnR0dDsKLQloZHItPmRhdGFzbiA9IGNwdV90b19iZTMyKHIydC0+c29saWNpdF9kYXRhc24pOwotCXIydC0+c29saWNpdF9kYXRhc24rKzsKLQloZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfREFUQV9PVVQ7Ci0JbWVtY3B5KGhkci0+bHVuLCB0YXNrLT5oZHItPmx1biwgc2l6ZW9mKGhkci0+bHVuKSk7Ci0JaGRyLT5pdHQgPSB0YXNrLT5oZHItPml0dDsKLQloZHItPmV4cF9zdGF0c24gPSByMnQtPmV4cF9zdGF0c247Ci0JaGRyLT5vZmZzZXQgPSBjcHVfdG9fYmUzMihyMnQtPmRhdGFfb2Zmc2V0KTsKLQlpZiAocjJ0LT5kYXRhX2xlbmd0aCA+IGNvbm4tPm1heF94bWl0X2RsZW5ndGgpIHsKLQkJaHRvbjI0KGhkci0+ZGxlbmd0aCwgY29ubi0+bWF4X3htaXRfZGxlbmd0aCk7Ci0JCXIydC0+ZGF0YV9jb3VudCA9IGNvbm4tPm1heF94bWl0X2RsZW5ndGg7Ci0JCWhkci0+ZmxhZ3MgPSAwOwotCX0gZWxzZSB7Ci0JCWh0b24yNChoZHItPmRsZW5ndGgsIHIydC0+ZGF0YV9sZW5ndGgpOwotCQlyMnQtPmRhdGFfY291bnQgPSByMnQtPmRhdGFfbGVuZ3RoOwotCQloZHItPmZsYWdzID0gSVNDU0lfRkxBR19DTURfRklOQUw7Ci0JfQotCWNvbm4tPmRhdGFvdXRfcGR1c19jbnQrKzsKLQotCXIydC0+c2VudCA9IDA7Ci19Ci0KLS8qKgotICogaXNjc2lfcjJ0X3JzcCAtIGlTQ1NJIFIyVCBSZXNwb25zZSBwcm9jZXNzaW5nCi0gKiBAY29ubjogaXNjc2kgY29ubmVjdGlvbgotICogQHRhc2s6IHNjc2kgY29tbWFuZCB0YXNrCi0gKiovCi1zdGF0aWMgaW50Ci1pc2NzaV9yMnRfcnNwKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKLXsKLQlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydDsKLQlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0Jc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3IydF9yc3AgKnJoZHIgPSAoc3RydWN0IGlzY3NpX3IydF9yc3AgKil0Y3BfY29ubi0+aW4uaGRyOwotCWludCByMnRzbiA9IGJlMzJfdG9fY3B1KHJoZHItPnIydHNuKTsKLQlpbnQgcmM7Ci0KLQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKLQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCi0JCQkJICAiaW52YWxpZCBSMnQgd2l0aCBkYXRhbGVuICVkXG4iLAotCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQotCi0JaWYgKHRjcF90YXNrLT5leHBfZGF0YXNuICE9IHIydHNuKXsKLQkJZGVidWdfdGNwKCIlczogdGFzay0+ZXhwX2RhdGFzbiglZCkgIT0gcmhkci0+cjJ0c24oJWQpXG4iLAotCQkgICAgICAgICAgX19mdW5jX18sIHRjcF90YXNrLT5leHBfZGF0YXNuLCByMnRzbik7Ci0JCXJldHVybiBJU0NTSV9FUlJfUjJUU047Ci0JfQotCi0JLyogZmlsbC1pbiBuZXcgUjJUIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayAqLwotCWlzY3NpX3VwZGF0ZV9jbWRzbihzZXNzaW9uLCAoc3RydWN0IGlzY3NpX25vcGluKilyaGRyKTsKLQotCWlmICghdGFzay0+c2MgfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7Ci0JCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fSU5GTywgY29ubiwKLQkJCQkgICJkcm9wcGluZyBSMlQgaXR0ICVkIGluIHJlY292ZXJ5LlxuIiwKLQkJCQkgIHRhc2stPml0dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJjID0gX19rZmlmb19nZXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKLQlCVUdfT04oIXJjKTsKLQotCXIydC0+ZXhwX3N0YXRzbiA9IHJoZHItPnN0YXRzbjsKLQlyMnQtPmRhdGFfbGVuZ3RoID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9sZW5ndGgpOwotCWlmIChyMnQtPmRhdGFfbGVuZ3RoID09IDApIHsKLQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCi0JCQkJICAiaW52YWxpZCBSMlQgd2l0aCB6ZXJvIGRhdGEgbGVuXG4iKTsKLQkJX19rZmlmb19wdXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAotCQkJICAgIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQotCi0JaWYgKHIydC0+ZGF0YV9sZW5ndGggPiBzZXNzaW9uLT5tYXhfYnVyc3QpCi0JCWRlYnVnX3Njc2koImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYW5kIG1heCBidXJzdCAldS4iCi0JCQkgICAiQXR0ZW1wdGluZyB0byBleGVjdXRlIHJlcXVlc3QuXG4iLAotCQkJICAgIHIydC0+ZGF0YV9sZW5ndGgsIHNlc3Npb24tPm1heF9idXJzdCk7Ci0KLQlyMnQtPmRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOwotCWlmIChyMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5kYXRhX2xlbmd0aCA+IHNjc2lfb3V0KHRhc2stPnNjKS0+bGVuZ3RoKSB7Ci0JCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAotCQkJCSAgImludmFsaWQgUjJUIHdpdGggZGF0YSBsZW4gJXUgYXQgb2Zmc2V0ICV1ICIKLQkJCQkgICJhbmQgdG90YWwgbGVuZ3RoICVkXG4iLCByMnQtPmRhdGFfbGVuZ3RoLAotCQkJCSAgcjJ0LT5kYXRhX29mZnNldCwgc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpOwotCQlfX2tmaWZvX3B1dCh0Y3BfdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQqKSZyMnQsCi0JCQkgICAgc2l6ZW9mKHZvaWQqKSk7Ci0JCXJldHVybiBJU0NTSV9FUlJfREFUQUxFTjsKLQl9Ci0KLQlyMnQtPnR0dCA9IHJoZHItPnR0dDsgLyogbm8gZmxpcCAqLwotCXIydC0+c29saWNpdF9kYXRhc24gPSAwOwotCi0JaXNjc2lfc29saWNpdF9kYXRhX2luaXQoY29ubiwgdGFzaywgcjJ0KTsKLQotCXRjcF90YXNrLT5leHBfZGF0YXNuID0gcjJ0c24gKyAxOwotCV9fa2ZpZm9fcHV0KHRjcF90YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZyMnQsIHNpemVvZih2b2lkKikpOwotCWNvbm4tPnIydF9wZHVzX2NudCsrOwotCi0JaXNjc2lfcmVxdWV1ZV90YXNrKHRhc2spOwotCXJldHVybiAwOwotfQotCi0vKgotICogSGFuZGxlIGluY29taW5nIHJlcGx5IHRvIERhdGFJbiBjb21tYW5kCi0gKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF9wcm9jZXNzX2RhdGFfaW4oc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiwKLQkJCSAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQpCi17Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSB0Y3BfY29ubi0+aXNjc2lfY29ubjsKLQlzdHJ1Y3QgaXNjc2lfaGRyICpoZHIgPSB0Y3BfY29ubi0+aW4uaGRyOwotCWludCByYzsKLQotCWlmICghaXNjc2lfdGNwX2Rnc3RfdmVyaWZ5KHRjcF9jb25uLCBzZWdtZW50KSkKLQkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBX0RHU1Q7Ci0KLQkvKiBjaGVjayBmb3Igbm9uLWV4Y2VwdGlvbmFsIHN0YXR1cyAqLwotCWlmIChoZHItPmZsYWdzICYgSVNDU0lfRkxBR19EQVRBX1NUQVRVUykgewotCQlyYyA9IGlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCB0Y3BfY29ubi0+aW4uaGRyLCBOVUxMLCAwKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCWlzY3NpX3RjcF9oZHJfcmVjdl9wcmVwKHRjcF9jb25uKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpc2NzaV90Y3BfaGRyX2Rpc3NlY3QgLSBwcm9jZXNzIFBEVSBoZWFkZXIKLSAqIEBjb25uOiBpU0NTSSBjb25uZWN0aW9uCi0gKiBAaGRyOiBQRFUgaGVhZGVyCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbmFseXplcyB0aGUgaGVhZGVyIG9mIHRoZSBQRFUgcmVjZWl2ZWQsCi0gKiBhbmQgcGVyZm9ybXMgc2V2ZXJhbCBzYW5pdHkgY2hlY2tzLiBJZiB0aGUgUERVIGlzIGFjY29tcGFuaWVkCi0gKiBieSBkYXRhLCB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgc2V0IHVwIHRvIGNvcHkgdGhlIGluY29taW5nIGRhdGEKLSAqIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgotICovCi1zdGF0aWMgaW50Ci1pc2NzaV90Y3BfaGRyX2Rpc3NlY3Qoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9oZHIgKmhkcikKLXsKLQlpbnQgcmMgPSAwLCBvcGNvZGUsIGFoc2xlbjsKLQlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKLQotCS8qIHZlcmlmeSBQRFUgbGVuZ3RoICovCi0JdGNwX2Nvbm4tPmluLmRhdGFsZW4gPSBudG9oMjQoaGRyLT5kbGVuZ3RoKTsKLQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4gPiBjb25uLT5tYXhfcmVjdl9kbGVuZ3RoKSB7Ci0JCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAotCQkJCSAgImlzY3NpX3RjcDogZGF0YWxlbiAlZCA+ICVkXG4iLAotCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sIGNvbm4tPm1heF9yZWN2X2RsZW5ndGgpOwotCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47Ci0JfQotCi0JLyogQWRkaXRpb25hbCBoZWFkZXIgc2VnbWVudHMuIFNvIGZhciwgd2UgZG9uJ3QKLQkgKiBwcm9jZXNzIGFkZGl0aW9uYWwgaGVhZGVycy4KLQkgKi8KLQlhaHNsZW4gPSBoZHItPmhsZW5ndGggPDwgMjsKLQotCW9wY29kZSA9IGhkci0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0s7Ci0JLyogdmVyaWZ5IGl0dCAoaXR0IGVuY29kaW5nOiBhZ2UrY2lkK2l0dCkgKi8KLQlyYyA9IGlzY3NpX3ZlcmlmeV9pdHQoY29ubiwgaGRyLT5pdHQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JZGVidWdfdGNwKCJvcGNvZGUgMHgleCBhaHNsZW4gJWQgZGF0YWxlbiAlZFxuIiwKLQkJICBvcGNvZGUsIGFoc2xlbiwgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOwotCi0Jc3dpdGNoKG9wY29kZSkgewotCWNhc2UgSVNDU0lfT1BfU0NTSV9EQVRBX0lOOgotCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOwotCQl0YXNrID0gaXNjc2lfaXR0X3RvX2N0YXNrKGNvbm4sIGhkci0+aXR0KTsKLQkJaWYgKCF0YXNrKQotCQkJcmMgPSBJU0NTSV9FUlJfQkFEX0lUVDsKLQkJZWxzZQotCQkJcmMgPSBpc2NzaV9kYXRhX2luKGNvbm4sIHRhc2spOwotCQlpZiAocmMpIHsKLQkJCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuKSB7Ci0JCQlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKLQkJCXN0cnVjdCBoYXNoX2Rlc2MgKnJ4X2hhc2ggPSBOVUxMOwotCQkJc3RydWN0IHNjc2lfZGF0YV9idWZmZXIgKnNkYiA9IHNjc2lfaW4odGFzay0+c2MpOwotCi0JCQkvKgotCQkJICogU2V0dXAgY29weSBvZiBEYXRhLUluIGludG8gdGhlIFNjc2lfQ21uZAotCQkJICogU2NhdHRlcmxpc3QgY2FzZToKLQkJCSAqIFdlIHNldCB1cCB0aGUgaXNjc2lfc2VnbWVudCB0byBwb2ludCB0byB0aGUgbmV4dAotCQkJICogc2NhdHRlcmxpc3QgZW50cnkgdG8gY29weSB0by4gQXMgd2UgZ28gYWxvbmcsCi0JCQkgKiB3ZSBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNjYXR0ZXJsaXN0IGVudHJ5IGFuZAotCQkJICogdXBkYXRlIHRoZSBkaWdlc3QgcGVyLWVudHJ5LgotCQkJICovCi0JCQlpZiAoY29ubi0+ZGF0YWRnc3RfZW4pCi0JCQkJcnhfaGFzaCA9ICZ0Y3BfY29ubi0+cnhfaGFzaDsKLQotCQkJZGVidWdfdGNwKCJpc2NzaV90Y3BfYmVnaW5fZGF0YV9pbiglcCwgb2Zmc2V0PSVkLCAiCi0JCQkJICAiZGF0YWxlbj0lZClcbiIsIHRjcF9jb25uLAotCQkJCSAgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAotCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOwotCQkJcmMgPSBpc2NzaV9zZWdtZW50X3NlZWtfc2coJnRjcF9jb25uLT5pbi5zZWdtZW50LAotCQkJCQkJICAgc2RiLT50YWJsZS5zZ2wsCi0JCQkJCQkgICBzZGItPnRhYmxlLm5lbnRzLAotCQkJCQkJICAgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAotCQkJCQkJICAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sCi0JCQkJCQkgICBpc2NzaV90Y3BfcHJvY2Vzc19kYXRhX2luLAotCQkJCQkJICAgcnhfaGFzaCk7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJcmMgPSBfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCBoZHIsIE5VTEwsIDApOwotCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfT1BfU0NTSV9DTURfUlNQOgotCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKLQkJCWlzY3NpX3RjcF9kYXRhX3JlY3ZfcHJlcCh0Y3BfY29ubik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyYyA9IGlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCBoZHIsIE5VTEwsIDApOwotCQlicmVhazsKLQljYXNlIElTQ1NJX09QX1IyVDoKLQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKLQkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7Ci0JCWlmICghdGFzaykKLQkJCXJjID0gSVNDU0lfRVJSX0JBRF9JVFQ7Ci0JCWVsc2UgaWYgKGFoc2xlbikKLQkJCXJjID0gSVNDU0lfRVJSX0FIU0xFTjsKLQkJZWxzZSBpZiAodGFzay0+c2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCi0JCQlyYyA9IGlzY3NpX3IydF9yc3AoY29ubiwgdGFzayk7Ci0JCWVsc2UKLQkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwotCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgotCWNhc2UgSVNDU0lfT1BfVEVYVF9SU1A6Ci0JY2FzZSBJU0NTSV9PUF9SRUpFQ1Q6Ci0JY2FzZSBJU0NTSV9PUF9BU1lOQ19FVkVOVDoKLQkJLyoKLQkJICogSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBjb3VsZCBnZXQgYSBQRFUgd2l0aCBhIGJ1ZmZlciBsYXJnZXIKLQkJICogdGhhbiA4SywgYnV0IHRoZXJlIGFyZSBubyB0YXJnZXRzIHRoYXQgY3VycmVudGx5IGRvIHRoaXMuCi0JCSAqIEZvciBub3cgd2UgZmFpbCB1bnRpbCB3ZSBmaW5kIGEgdmVuZG9yIHRoYXQgbmVlZHMgaXQKLQkJICovCi0JCWlmIChJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTiA8IHRjcF9jb25uLT5pbi5kYXRhbGVuKSB7Ci0JCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKLQkJCQkJICAiaXNjc2lfdGNwOiByZWNlaXZlZCBidWZmZXIgb2YgIgotCQkJCQkgICJsZW4gJXUgYnV0IGNvbm4gYnVmZmVyIGlzIG9ubHkgJXUgIgotCQkJCQkgICIob3Bjb2RlICUweClcbiIsCi0JCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sCi0JCQkJCSAgSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4sIG9wY29kZSk7Ci0JCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSWYgdGhlcmUncyBkYXRhIGNvbWluZyBpbiB3aXRoIHRoZSByZXNwb25zZSwKLQkJICogcmVjZWl2ZSBpdCB0byB0aGUgY29ubmVjdGlvbidzIGJ1ZmZlci4KLQkJICovCi0JCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbikgewotCQkJaXNjc2lfdGNwX2RhdGFfcmVjdl9wcmVwKHRjcF9jb25uKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBJU0NTSV9PUF9MT0dPVVRfUlNQOgotCWNhc2UgSVNDU0lfT1BfTk9PUF9JTjoKLQljYXNlIElTQ1NJX09QX1NDU0lfVE1GVU5DX1JTUDoKLQkJcmMgPSBpc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgaGRyLCBOVUxMLCAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSBJU0NTSV9FUlJfQkFEX09QQ09ERTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJjID09IDApIHsKLQkJLyogQW55dGhpbmcgdGhhdCBjb21lcyB3aXRoIGRhdGEgc2hvdWxkIGhhdmUKLQkJICogYmVlbiBoYW5kbGVkIGFib3ZlLiAqLwotCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pCi0JCQlyZXR1cm4gSVNDU0lfRVJSX1BST1RPOwotCQlpc2NzaV90Y3BfaGRyX3JlY3ZfcHJlcCh0Y3BfY29ubik7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGlzY3NpX3RjcF9oZHJfcmVjdl9kb25lIC0gcHJvY2VzcyBQRFUgaGVhZGVyCi0gKgotICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBQRFUgaGVhZGVyIGhhcwotICogYmVlbiByZWNlaXZlZC4gSWYgdGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsCi0gKiBoZWFkZXIgc2VnbWVudHMsIHdlIGdvIGJhY2sgZm9yIG1vcmUgZGF0YS4KLSAqLwotc3RhdGljIGludAotaXNjc2lfdGNwX2hkcl9yZWN2X2RvbmUoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiwKLQkJCXN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQotewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGNwX2Nvbm4tPmlzY3NpX2Nvbm47Ci0Jc3RydWN0IGlzY3NpX2hkciAqaGRyOwotCi0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgaGVhZGVyIHNlZ21lbnRzCi0JICogKnByaW9yKiB0byBjb21wdXRpbmcgdGhlIGRpZ2VzdCwgYmVjYXVzZSB3ZQotCSAqIG1heSBuZWVkIHRvIGdvIGJhY2sgdG8gdGhlIGNhbGxlciBmb3IgbW9yZS4KLQkgKi8KLQloZHIgPSAoc3RydWN0IGlzY3NpX2hkciAqKSB0Y3BfY29ubi0+aW4uaGRyX2J1ZjsKLQlpZiAoc2VnbWVudC0+Y29waWVkID09IHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSAmJiBoZHItPmhsZW5ndGgpIHsKLQkJLyogQnVtcCB0aGUgaGVhZGVyIGxlbmd0aCAtIHRoZSBjYWxsZXIgd2lsbAotCQkgKiBqdXN0IGxvb3AgYXJvdW5kIGFuZCBnZXQgdGhlIEFIUyBmb3IgdXMsIGFuZAotCQkgKiBjYWxsIGFnYWluLiAqLwotCQl1bnNpZ25lZCBpbnQgYWhzbGVuID0gaGRyLT5obGVuZ3RoIDw8IDI7Ci0KLQkJLyogTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93ICovCi0JCWlmIChzaXplb2YoKmhkcikgKyBhaHNsZW4gPiBzaXplb2YodGNwX2Nvbm4tPmluLmhkcl9idWYpKQotCQkJcmV0dXJuIElTQ1NJX0VSUl9BSFNMRU47Ci0KLQkJc2VnbWVudC0+dG90YWxfc2l6ZSArPSBhaHNsZW47Ci0JCXNlZ21lbnQtPnNpemUgKz0gYWhzbGVuOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBXZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhlIGhlYWRlci4gU2VlIGlmIHdlJ3JlIGRvaW5nCi0JICogaGVhZGVyIGRpZ2VzdHM7IGlmIHNvLCBzZXQgdXAgdGhlIHJlY3ZfZGlnZXN0IGJ1ZmZlcgotCSAqIGFuZCBnbyBiYWNrIGZvciBtb3JlLiAqLwotCWlmIChjb25uLT5oZHJkZ3N0X2VuKSB7Ci0JCWlmIChzZWdtZW50LT5kaWdlc3RfbGVuID09IDApIHsKLQkJCWlzY3NpX3RjcF9zZWdtZW50X3NwbGljZV9kaWdlc3Qoc2VnbWVudCwKLQkJCQkJCQlzZWdtZW50LT5yZWN2X2RpZ2VzdCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpc2NzaV90Y3BfZGdzdF9oZWFkZXIoJnRjcF9jb25uLT5yeF9oYXNoLCBoZHIsCi0JCQkJICAgICAgc2VnbWVudC0+dG90YWxfY29waWVkIC0gSVNDU0lfRElHRVNUX1NJWkUsCi0JCQkJICAgICAgc2VnbWVudC0+ZGlnZXN0KTsKLQotCQlpZiAoIWlzY3NpX3RjcF9kZ3N0X3ZlcmlmeSh0Y3BfY29ubiwgc2VnbWVudCkpCi0JCQlyZXR1cm4gSVNDU0lfRVJSX0hEUl9ER1NUOwotCX0KLQotCXRjcF9jb25uLT5pbi5oZHIgPSBoZHI7Ci0JcmV0dXJuIGlzY3NpX3RjcF9oZHJfZGlzc2VjdChjb25uLCBoZHIpOwotfQotCi0vKioKLSAqIGlzY3NpX3RjcF9yZWN2IC0gVENQIHJlY2VpdmUgaW4gc2VuZGZpbGUgZmFzaGlvbgotICogQHJkX2Rlc2M6IHJlYWQgZGVzY3JpcHRvcgotICogQHNrYjogc29ja2V0IGJ1ZmZlcgotICogQG9mZnNldDogb2Zmc2V0IGluIHNrYgotICogQGxlbjogc2tiLT5sZW4gLSBvZmZzZXQKLSAqKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF9yZWN2KHJlYWRfZGVzY3JpcHRvcl90ICpyZF9kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gcmRfZGVzYy0+YXJnLmRhdGE7Ci0Jc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQgPSAmdGNwX2Nvbm4tPmluLnNlZ21lbnQ7Ci0Jc3RydWN0IHNrYl9zZXFfc3RhdGUgc2VxOwotCXVuc2lnbmVkIGludCBjb25zdW1lZCA9IDA7Ci0JaW50IHJjID0gMDsKLQotCWRlYnVnX3RjcCgiaW4gJWQgYnl0ZXNcbiIsIHNrYi0+bGVuIC0gb2Zmc2V0KTsKLQotCWlmICh1bmxpa2VseShjb25uLT5zdXNwZW5kX3J4KSkgewotCQlkZWJ1Z190Y3AoImNvbm4gJWQgUnggc3VzcGVuZGVkIVxuIiwgY29ubi0+aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlza2JfcHJlcGFyZV9zZXFfcmVhZChza2IsIG9mZnNldCwgc2tiLT5sZW4sICZzZXEpOwotCXdoaWxlICgxKSB7Ci0JCXVuc2lnbmVkIGludCBhdmFpbDsKLQkJY29uc3QgdTggKnB0cjsKLQotCQlhdmFpbCA9IHNrYl9zZXFfcmVhZChjb25zdW1lZCwgJnB0ciwgJnNlcSk7Ci0JCWlmIChhdmFpbCA9PSAwKSB7Ci0JCQlkZWJ1Z190Y3AoIm5vIG1vcmUgZGF0YSBhdmFpbC4gQ29uc3VtZWQgJWRcbiIsCi0JCQkJICBjb25zdW1lZCk7Ci0JCQlicmVhazsKLQkJfQotCQlCVUdfT04oc2VnbWVudC0+Y29waWVkID49IHNlZ21lbnQtPnNpemUpOwotCi0JCWRlYnVnX3RjcCgic2tiICVwIHB0cj0lcCBhdmFpbD0ldVxuIiwgc2tiLCBwdHIsIGF2YWlsKTsKLQkJcmMgPSBpc2NzaV90Y3Bfc2VnbWVudF9yZWN2KHRjcF9jb25uLCBzZWdtZW50LCBwdHIsIGF2YWlsKTsKLQkJQlVHX09OKHJjID09IDApOwotCQljb25zdW1lZCArPSByYzsKLQotCQlpZiAoc2VnbWVudC0+dG90YWxfY29waWVkID49IHNlZ21lbnQtPnRvdGFsX3NpemUpIHsKLQkJCWRlYnVnX3RjcCgic2VnbWVudCBkb25lXG4iKTsKLQkJCXJjID0gc2VnbWVudC0+ZG9uZSh0Y3BfY29ubiwgc2VnbWVudCk7Ci0JCQlpZiAocmMgIT0gMCkgewotCQkJCXNrYl9hYm9ydF9zZXFfcmVhZCgmc2VxKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCi0JCQkvKiBUaGUgZG9uZSgpIGZ1bmN0aW9ucyBzZXRzIHVwIHRoZQotCQkJICogbmV4dCBzZWdtZW50LiAqLwotCQl9Ci0JfQotCXNrYl9hYm9ydF9zZXFfcmVhZCgmc2VxKTsKLQljb25uLT5yeGRhdGFfb2N0ZXRzICs9IGNvbnN1bWVkOwotCXJldHVybiBjb25zdW1lZDsKLQotZXJyb3I6Ci0JZGVidWdfdGNwKCJFcnJvciByZWNlaXZpbmcgUERVLCBlcnJubz0lZFxuIiwgcmMpOwotCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCByYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pc2NzaV90Y3BfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFnKQotewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gc2stPnNrX3VzZXJfZGF0YTsKLQlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQlyZWFkX2Rlc2NyaXB0b3JfdCByZF9kZXNjOwotCi0JcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0KLQkvKgotCSAqIFVzZSByZF9kZXNjIHRvIHBhc3MgJ2Nvbm4nIHRvIGlzY3NpX3RjcF9yZWN2LgotCSAqIFdlIHNldCBjb3VudCB0byAxIGJlY2F1c2Ugd2Ugd2FudCB0aGUgbmV0d29yayBsYXllciB0bwotCSAqIGhhbmQgdXMgYWxsIHRoZSBza2JzIHRoYXQgYXJlIGF2YWlsYWJsZS4gaXNjc2lfdGNwX3JlY3YKLQkgKiBoYW5kbGVkIHBkdXMgdGhhdCBjcm9zcyBidWZmZXJzIG9yIHBkdXMgdGhhdCBzdGlsbCBuZWVkIGRhdGEuCi0JICovCi0JcmRfZGVzYy5hcmcuZGF0YSA9IGNvbm47Ci0JcmRfZGVzYy5jb3VudCA9IDE7Ci0JdGNwX3JlYWRfc29jayhzaywgJnJkX2Rlc2MsIGlzY3NpX3RjcF9yZWN2KTsKLQotCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0KLQkvKiBJZiB3ZSBoYWQgdG8gKGF0b21pY2FsbHkpIG1hcCBhIGhpZ2htZW0gcGFnZSwKLQkgKiB1bm1hcCBpdCBub3cuICovCi0JaXNjc2lfdGNwX3NlZ21lbnRfdW5tYXAoJnRjcF9jb25uLT5pbi5zZWdtZW50KTsKLX0KLQotc3RhdGljIHZvaWQKLWlzY3NpX3RjcF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm47Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47Ci0Jc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247Ci0Jdm9pZCAoKm9sZF9zdGF0ZV9jaGFuZ2UpKHN0cnVjdCBzb2NrICopOwotCi0JcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0KLQljb25uID0gKHN0cnVjdCBpc2NzaV9jb25uKilzay0+c2tfdXNlcl9kYXRhOwotCXNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwotCi0JaWYgKChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFX1dBSVQgfHwKLQkgICAgIHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpICYmCi0JICAgICFhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpKSB7Ci0JCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3N0YXRlX2NoYW5nZTogVENQX0NMT1NFfFRDUF9DTE9TRV9XQUlUXG4iKTsKLQkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7Ci0JfQotCi0JdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwotCW9sZF9zdGF0ZV9jaGFuZ2UgPSB0Y3BfY29ubi0+b2xkX3N0YXRlX2NoYW5nZTsKLQotCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0KLQlvbGRfc3RhdGVfY2hhbmdlKHNrKTsKLX0KLQotLyoqCi0gKiBpc2NzaV93cml0ZV9zcGFjZSAtIENhbGxlZCB3aGVuIG1vcmUgb3V0cHV0IGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUKLSAqIEBzazogc29ja2V0IHNwYWNlIGlzIGF2YWlsYWJsZSBmb3IKLSAqKi8KLXN0YXRpYyB2b2lkCi1pc2NzaV93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCi17Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSAoc3RydWN0IGlzY3NpX2Nvbm4qKXNrLT5za191c2VyX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0KLQl0Y3BfY29ubi0+b2xkX3dyaXRlX3NwYWNlKHNrKTsKLQlkZWJ1Z190Y3AoImlzY3NpX3dyaXRlX3NwYWNlOiBjaWQgJWRcbiIsIGNvbm4tPmlkKTsKLQlzY3NpX3F1ZXVlX3dvcmsoY29ubi0+c2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKLX0KLQotc3RhdGljIHZvaWQKLWlzY3NpX2Nvbm5fc2V0X2NhbGxiYWNrcyhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKLXsKLQlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQlzdHJ1Y3Qgc29jayAqc2sgPSB0Y3BfY29ubi0+c29jay0+c2s7Ci0KLQkvKiBhc3NpZ24gbmV3IGNhbGxiYWNrcyAqLwotCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQlzay0+c2tfdXNlcl9kYXRhID0gY29ubjsKLQl0Y3BfY29ubi0+b2xkX2RhdGFfcmVhZHkgPSBzay0+c2tfZGF0YV9yZWFkeTsKLQl0Y3BfY29ubi0+b2xkX3N0YXRlX2NoYW5nZSA9IHNrLT5za19zdGF0ZV9jaGFuZ2U7Ci0JdGNwX2Nvbm4tPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKLQlzay0+c2tfZGF0YV9yZWFkeSA9IGlzY3NpX3RjcF9kYXRhX3JlYWR5OwotCXNrLT5za19zdGF0ZV9jaGFuZ2UgPSBpc2NzaV90Y3Bfc3RhdGVfY2hhbmdlOwotCXNrLT5za193cml0ZV9zcGFjZSA9IGlzY3NpX3dyaXRlX3NwYWNlOwotCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZAotaXNjc2lfY29ubl9yZXN0b3JlX2NhbGxiYWNrcyhzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uKQotewotCXN0cnVjdCBzb2NrICpzayA9IHRjcF9jb25uLT5zb2NrLT5zazsKLQotCS8qIHJlc3RvcmUgc29ja2V0IGNhbGxiYWNrcywgc2VlIGFsc286IGlzY3NpX2Nvbm5fc2V0X2NhbGxiYWNrcygpICovCi0Jd3JpdGVfbG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotCXNrLT5za191c2VyX2RhdGEgICAgPSBOVUxMOwotCXNrLT5za19kYXRhX3JlYWR5ICAgPSB0Y3BfY29ubi0+b2xkX2RhdGFfcmVhZHk7Ci0Jc2stPnNrX3N0YXRlX2NoYW5nZSA9IHRjcF9jb25uLT5vbGRfc3RhdGVfY2hhbmdlOwotCXNrLT5za193cml0ZV9zcGFjZSAgPSB0Y3BfY29ubi0+b2xkX3dyaXRlX3NwYWNlOwotCXNrLT5za19ub19jaGVjawkgPSAwOwotCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotfQotCi0vKioKLSAqIGlzY3NpX3htaXQgLSBUQ1AgdHJhbnNtaXQKLSAqKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3htaXQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCi17Ci0Jc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0Jc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQgPSAmdGNwX2Nvbm4tPm91dC5zZWdtZW50OworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCA9ICZ0Y3Bfc3dfY29ubi0+b3V0LnNlZ21lbnQ7CiAJdW5zaWduZWQgaW50IGNvbnN1bWVkID0gMDsKIAlpbnQgcmMgPSAwOwogCiAJd2hpbGUgKDEpIHsKLQkJcmMgPSBpc2NzaV90Y3BfeG1pdF9zZWdtZW50KHRjcF9jb25uLCBzZWdtZW50KTsKKwkJcmMgPSBpc2NzaV9zd190Y3BfeG1pdF9zZWdtZW50KHRjcF9jb25uLCBzZWdtZW50KTsKIAkJaWYgKHJjIDwgMCkgewogCQkJcmMgPSBJU0NTSV9FUlJfWE1JVF9GQUlMRUQ7CiAJCQlnb3RvIGVycm9yOwpAQCAtMTEzMiwyMiArMjk5LDIyIEBACiAvKioKICAqIGlzY3NpX3RjcF94bWl0X3FsZW4gLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBxdWV1ZWQgZm9yIHhtaXQKICAqLwotc3RhdGljIGlubGluZSBpbnQKLWlzY3NpX3RjcF94bWl0X3FsZW4oc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCitzdGF0aWMgaW5saW5lIGludCBpc2NzaV9zd190Y3BfeG1pdF9xbGVuKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKQogewogCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwotCXN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50ID0gJnRjcF9jb25uLT5vdXQuc2VnbWVudDsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQgPSAmdGNwX3N3X2Nvbm4tPm91dC5zZWdtZW50OwogCiAJcmV0dXJuIHNlZ21lbnQtPnRvdGFsX2NvcGllZCAtIHNlZ21lbnQtPnRvdGFsX3NpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1pc2NzaV90Y3BfZmx1c2goc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCitzdGF0aWMgaW50IGlzY3NpX3N3X3RjcF9wZHVfeG1pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CiAJaW50IHJjOwogCi0Jd2hpbGUgKGlzY3NpX3RjcF94bWl0X3FsZW4oY29ubikpIHsKLQkJcmMgPSBpc2NzaV94bWl0KGNvbm4pOworCXdoaWxlIChpc2NzaV9zd190Y3BfeG1pdF9xbGVuKGNvbm4pKSB7CisJCXJjID0gaXNjc2lfc3dfdGNwX3htaXQoY29ubik7CiAJCWlmIChyYyA9PSAwKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJCWlmIChyYyA8IDApCkBAIC0xMTYxLDI3ICszMjgsMzEgQEAKICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UncmUgZG9uZSBzZW5kaW5nIHRoZSBoZWFkZXIuCiAgKiBTaW1wbHkgY29weSB0aGUgZGF0YV9zZWdtZW50IHRvIHRoZSBzZW5kIHNlZ21lbnQsIGFuZCByZXR1cm4uCiAgKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF9zZW5kX2hkcl9kb25lKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCi0JCQlzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCkKK3N0YXRpYyBpbnQgaXNjc2lfc3dfdGNwX3NlbmRfaGRyX2RvbmUoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiwKKwkJCQkgICAgICBzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCkKIHsKLQl0Y3BfY29ubi0+b3V0LnNlZ21lbnQgPSB0Y3BfY29ubi0+b3V0LmRhdGFfc2VnbWVudDsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisKKwl0Y3Bfc3dfY29ubi0+b3V0LnNlZ21lbnQgPSB0Y3Bfc3dfY29ubi0+b3V0LmRhdGFfc2VnbWVudDsKIAlkZWJ1Z190Y3AoIkhlYWRlciBkb25lLiBOZXh0IHNlZ21lbnQgc2l6ZSAldSB0b3RhbF9zaXplICV1XG4iLAotCQkgIHRjcF9jb25uLT5vdXQuc2VnbWVudC5zaXplLCB0Y3BfY29ubi0+b3V0LnNlZ21lbnQudG90YWxfc2l6ZSk7CisJCSAgdGNwX3N3X2Nvbm4tPm91dC5zZWdtZW50LnNpemUsCisJCSAgdGNwX3N3X2Nvbm4tPm91dC5zZWdtZW50LnRvdGFsX3NpemUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotaXNjc2lfdGNwX3NlbmRfaGRyX3ByZXAoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHZvaWQgKmhkciwgc2l6ZV90IGhkcmxlbikKK3N0YXRpYyB2b2lkIGlzY3NpX3N3X3RjcF9zZW5kX2hkcl9wcmVwKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCB2b2lkICpoZHIsCisJCQkJICAgICAgIHNpemVfdCBoZHJsZW4pCiB7CiAJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOwogCiAJZGVidWdfdGNwKCIlcyglcCVzKVxuIiwgX19mdW5jX18sIHRjcF9jb25uLAogCQkJY29ubi0+aGRyZGdzdF9lbj8gIiwgZGlnZXN0IGVuYWJsZWQiIDogIiIpOwogCiAJLyogQ2xlYXIgdGhlIGRhdGEgc2VnbWVudCAtIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBieSB0aGUKIAkgKiBjYWxsZXIgdXNpbmcgaXNjc2lfdGNwX3NlbmRfZGF0YV9wcmVwKCkgKi8KLQltZW1zZXQoJnRjcF9jb25uLT5vdXQuZGF0YV9zZWdtZW50LCAwLCBzaXplb2Yoc3RydWN0IGlzY3NpX3NlZ21lbnQpKTsKKwltZW1zZXQoJnRjcF9zd19jb25uLT5vdXQuZGF0YV9zZWdtZW50LCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlzY3NpX3NlZ21lbnQpKTsKIAogCS8qIElmIGhlYWRlciBkaWdlc3QgaXMgZW5hYmxlZCwgY29tcHV0ZSB0aGUgQ1JDIGFuZAogCSAqIHBsYWNlIHRoZSBkaWdlc3QgaW50byB0aGUgc2FtZSBidWZmZXIuIFdlIG1ha2UKQEAgLTExODksNyArMzYwLDcgQEAKIAkgKiBzdWZmaWNpZW50IHJvb20uCiAJICovCiAJaWYgKGNvbm4tPmhkcmRnc3RfZW4pIHsKLQkJaXNjc2lfdGNwX2Rnc3RfaGVhZGVyKCZ0Y3BfY29ubi0+dHhfaGFzaCwgaGRyLCBoZHJsZW4sCisJCWlzY3NpX3RjcF9kZ3N0X2hlYWRlcigmdGNwX3N3X2Nvbm4tPnR4X2hhc2gsIGhkciwgaGRybGVuLAogCQkJCSAgICAgIGhkciArIGhkcmxlbik7CiAJCWhkcmxlbiArPSBJU0NTSV9ESUdFU1RfU0laRTsKIAl9CkBAIC0xMTk3LDEwICszNjgsMTAgQEAKIAkvKiBSZW1lbWJlciBoZWFkZXIgcG9pbnRlciBmb3IgbGF0ZXIsIHdoZW4gd2UgbmVlZAogCSAqIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXJlJ3MgYSBwYXlsb2FkIHRvIGdvIGFsb25nCiAJICogd2l0aCB0aGUgaGVhZGVyLiAqLwotCXRjcF9jb25uLT5vdXQuaGRyID0gaGRyOworCXRjcF9zd19jb25uLT5vdXQuaGRyID0gaGRyOwogCi0JaXNjc2lfc2VnbWVudF9pbml0X2xpbmVhcigmdGNwX2Nvbm4tPm91dC5zZWdtZW50LCBoZHIsIGhkcmxlbiwKLQkJCQlpc2NzaV90Y3Bfc2VuZF9oZHJfZG9uZSwgTlVMTCk7CisJaXNjc2lfc2VnbWVudF9pbml0X2xpbmVhcigmdGNwX3N3X2Nvbm4tPm91dC5zZWdtZW50LCBoZHIsIGhkcmxlbiwKKwkJCQkgIGlzY3NpX3N3X3RjcF9zZW5kX2hkcl9kb25lLCBOVUxMKTsKIH0KIAogLyoKQEAgLTEyMDksMTEgKzM4MCwxMiBAQAogICogb2YgYnkgdGhlIGlzY3NpX3NlZ21lbnQgcm91dGluZXMuCiAgKi8KIHN0YXRpYyBpbnQKLWlzY3NpX3RjcF9zZW5kX2RhdGFfcHJlcChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCQkgdW5zaWduZWQgaW50IGxlbikKK2lzY3NpX3N3X3RjcF9zZW5kX2RhdGFfcHJlcChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGhhc2hfZGVzYyAqdHhfaGFzaCA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGhkcl9zcGVjX2xlbjsKIApAQCAtMTIyMywyMiArMzk1LDIzIEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlIGRhdGFsZW4gbWF0Y2hlcyB3aGF0IHRoZSBjYWxsZXIKIAkgICBzYWlkIGhlIHdvdWxkIHNlbmQuICovCi0JaGRyX3NwZWNfbGVuID0gbnRvaDI0KHRjcF9jb25uLT5vdXQuaGRyLT5kbGVuZ3RoKTsKKwloZHJfc3BlY19sZW4gPSBudG9oMjQodGNwX3N3X2Nvbm4tPm91dC5oZHItPmRsZW5ndGgpOwogCVdBUk5fT04oaXNjc2lfcGFkZGVkKGxlbikgIT0gaXNjc2lfcGFkZGVkKGhkcl9zcGVjX2xlbikpOwogCiAJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuKQotCQl0eF9oYXNoID0gJnRjcF9jb25uLT50eF9oYXNoOworCQl0eF9oYXNoID0gJnRjcF9zd19jb25uLT50eF9oYXNoOwogCi0JcmV0dXJuIGlzY3NpX3NlZ21lbnRfc2Vla19zZygmdGNwX2Nvbm4tPm91dC5kYXRhX3NlZ21lbnQsCi0JCQkJICAgc2csIGNvdW50LCBvZmZzZXQsIGxlbiwKLQkJCQkgICBOVUxMLCB0eF9oYXNoKTsKKwlyZXR1cm4gaXNjc2lfc2VnbWVudF9zZWVrX3NnKCZ0Y3Bfc3dfY29ubi0+b3V0LmRhdGFfc2VnbWVudCwKKwkJCQkgICAgIHNnLCBjb3VudCwgb2Zmc2V0LCBsZW4sCisJCQkJICAgICBOVUxMLCB0eF9oYXNoKTsKIH0KIAogc3RhdGljIHZvaWQKLWlzY3NpX3RjcF9zZW5kX2xpbmVhcl9kYXRhX3ByZXBhcmUoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHZvaWQgKmRhdGEsCitpc2NzaV9zd190Y3Bfc2VuZF9saW5lYXJfZGF0YV9wcmVwKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCB2b2lkICpkYXRhLAogCQkJCSAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOwogCXN0cnVjdCBoYXNoX2Rlc2MgKnR4X2hhc2ggPSBOVUxMOwogCXVuc2lnbmVkIGludCBoZHJfc3BlY19sZW47CiAKQEAgLTEyNDcsMzQxICs0MjAsMTYwIEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlIGRhdGFsZW4gbWF0Y2hlcyB3aGF0IHRoZSBjYWxsZXIKIAkgICBzYWlkIGhlIHdvdWxkIHNlbmQuICovCi0JaGRyX3NwZWNfbGVuID0gbnRvaDI0KHRjcF9jb25uLT5vdXQuaGRyLT5kbGVuZ3RoKTsKKwloZHJfc3BlY19sZW4gPSBudG9oMjQodGNwX3N3X2Nvbm4tPm91dC5oZHItPmRsZW5ndGgpOwogCVdBUk5fT04oaXNjc2lfcGFkZGVkKGxlbikgIT0gaXNjc2lfcGFkZGVkKGhkcl9zcGVjX2xlbikpOwogCiAJaWYgKGNvbm4tPmRhdGFkZ3N0X2VuKQotCQl0eF9oYXNoID0gJnRjcF9jb25uLT50eF9oYXNoOworCQl0eF9oYXNoID0gJnRjcF9zd19jb25uLT50eF9oYXNoOwogCi0JaXNjc2lfc2VnbWVudF9pbml0X2xpbmVhcigmdGNwX2Nvbm4tPm91dC5kYXRhX3NlZ21lbnQsCisJaXNjc2lfc2VnbWVudF9pbml0X2xpbmVhcigmdGNwX3N3X2Nvbm4tPm91dC5kYXRhX3NlZ21lbnQsCiAJCQkJZGF0YSwgbGVuLCBOVUxMLCB0eF9oYXNoKTsKIH0KIAotLyoqCi0gKiBpc2NzaV9zb2xpY2l0X2RhdGFfY29udCAtIGluaXRpYWxpemUgbmV4dCBEYXRhLU91dAotICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KLSAqIEB0YXNrOiBzY3NpIGNvbW1hbmQgdGFzawotICogQHIydDogUjJUIGluZm8KLSAqIEBsZWZ0OiBieXRlcyBsZWZ0IHRvIHRyYW5zZmVyCi0gKgotICogTm90ZXM6Ci0gKglJbml0aWFsaXplIG5leHQgRGF0YS1PdXQgd2l0aGluIHRoaXMgUjJUIHNlcXVlbmNlIGFuZCBjb250aW51ZQotICoJdG8gcHJvY2VzcyBuZXh0IFNjYXR0ZXItR2F0aGVyIGVsZW1lbnQoaWYgYW55KSBvZiB0aGlzIFNDU0kgY29tbWFuZC4KLSAqCi0gKglDYWxsZWQgdW5kZXIgY29ubmVjdGlvbiBsb2NrLgotICoqLwotc3RhdGljIGludAotaXNjc2lfc29saWNpdF9kYXRhX2NvbnQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLAotCQkJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQpCitzdGF0aWMgaW50IGlzY3NpX3N3X3RjcF9wZHVfaW5pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywKKwkJCQkgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50KQogewotCXN0cnVjdCBpc2NzaV9kYXRhICpoZHI7Ci0JaW50IG5ld19vZmZzZXQsIGxlZnQ7Ci0KLQlCVUdfT04ocjJ0LT5kYXRhX2xlbmd0aCAtIHIydC0+c2VudCA8IDApOwotCWxlZnQgPSByMnQtPmRhdGFfbGVuZ3RoIC0gcjJ0LT5zZW50OwotCWlmIChsZWZ0ID09IDApCi0JCXJldHVybiAwOwotCi0JaGRyID0gJnIydC0+ZHRhc2suaGRyOwotCW1lbXNldChoZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfZGF0YSkpOwotCWhkci0+dHR0ID0gcjJ0LT50dHQ7Ci0JaGRyLT5kYXRhc24gPSBjcHVfdG9fYmUzMihyMnQtPnNvbGljaXRfZGF0YXNuKTsKLQlyMnQtPnNvbGljaXRfZGF0YXNuKys7Ci0JaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX0RBVEFfT1VUOwotCW1lbWNweShoZHItPmx1biwgdGFzay0+aGRyLT5sdW4sIHNpemVvZihoZHItPmx1bikpOwotCWhkci0+aXR0ID0gdGFzay0+aGRyLT5pdHQ7Ci0JaGRyLT5leHBfc3RhdHNuID0gcjJ0LT5leHBfc3RhdHNuOwotCW5ld19vZmZzZXQgPSByMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5zZW50OwotCWhkci0+b2Zmc2V0ID0gY3B1X3RvX2JlMzIobmV3X29mZnNldCk7Ci0JaWYgKGxlZnQgPiBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoKSB7Ci0JCWh0b24yNChoZHItPmRsZW5ndGgsIGNvbm4tPm1heF94bWl0X2RsZW5ndGgpOwotCQlyMnQtPmRhdGFfY291bnQgPSBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoOwotCX0gZWxzZSB7Ci0JCWh0b24yNChoZHItPmRsZW5ndGgsIGxlZnQpOwotCQlyMnQtPmRhdGFfY291bnQgPSBsZWZ0OwotCQloZHItPmZsYWdzID0gSVNDU0lfRkxBR19DTURfRklOQUw7Ci0JfQotCi0JY29ubi0+ZGF0YW91dF9wZHVzX2NudCsrOwotCXJldHVybiAxOwotfQotCi0vKioKLSAqIGlzY3NpX3RjcF90YXNrIC0gSW5pdGlhbGl6ZSBpU0NTSSBTQ1NJX1JFQUQgb3IgU0NTSV9XUklURSBjb21tYW5kcwotICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KLSAqIEB0YXNrOiBzY3NpIGNvbW1hbmQgdGFzawotICogQHNjOiBzY3NpIGNvbW1hbmQKLSAqKi8KLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF90YXNrX2luaXQoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCi17Ci0Jc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSB0YXNrLT5jb25uOwotCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGFzay0+c2M7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAotCWlmICghc2MpIHsKLQkJLyoKLQkJICogbWdtdCB0YXNrcyBkbyBub3QgaGF2ZSBhIHNjYXR0ZXJsaXN0IHNpbmNlIHRoZXkgY29tZQotCQkgKiBpbiBmcm9tIHRoZSBpc2NzaSBpbnRlcmZhY2UuCi0JCSAqLwotCQlkZWJ1Z19zY3NpKCJtdGFzayBkZXEgW2NpZCAlZCBpdHQgMHgleF1cbiIsIGNvbm4tPmlkLAotCQkJICAgdGFzay0+aXR0KTsKKwlpc2NzaV9zd190Y3Bfc2VuZF9oZHJfcHJlcChjb25uLCB0YXNrLT5oZHIsIHRhc2stPmhkcl9sZW4pOwogCi0JCS8qIFByZXBhcmUgUERVLCBvcHRpb25hbGx5IHcvIGltbWVkaWF0ZSBkYXRhICovCi0JCWlzY3NpX3RjcF9zZW5kX2hkcl9wcmVwKGNvbm4sIHRhc2stPmhkciwgc2l6ZW9mKCp0YXNrLT5oZHIpKTsKLQotCQkvKiBJZiB3ZSBoYXZlIGltbWVkaWF0ZSBkYXRhLCBhdHRhY2ggYSBwYXlsb2FkICovCi0JCWlmICh0YXNrLT5kYXRhX2NvdW50KQotCQkJaXNjc2lfdGNwX3NlbmRfbGluZWFyX2RhdGFfcHJlcGFyZShjb25uLCB0YXNrLT5kYXRhLAotCQkJCQkJCSAgIHRhc2stPmRhdGFfY291bnQpOworCWlmICghY291bnQpCiAJCXJldHVybiAwOworCisJaWYgKCF0YXNrLT5zYykKKwkJaXNjc2lfc3dfdGNwX3NlbmRfbGluZWFyX2RhdGFfcHJlcChjb25uLCB0YXNrLT5kYXRhLCBjb3VudCk7CisJZWxzZSB7CisJCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpzZGIgPSBzY3NpX291dCh0YXNrLT5zYyk7CisKKwkJZXJyID0gaXNjc2lfc3dfdGNwX3NlbmRfZGF0YV9wcmVwKGNvbm4sIHNkYi0+dGFibGUuc2dsLAorCQkJCQkJICBzZGItPnRhYmxlLm5lbnRzLCBvZmZzZXQsCisJCQkJCQkgIGNvdW50KTsKIAl9CiAKLQlCVUdfT04oX19rZmlmb19sZW4odGNwX3Rhc2stPnIydHF1ZXVlKSk7Ci0JdGNwX3Rhc2stPnNlbnQgPSAwOwotCXRjcF90YXNrLT5leHBfZGF0YXNuID0gMDsKLQotCS8qIFByZXBhcmUgUERVLCBvcHRpb25hbGx5IHcvIGltbWVkaWF0ZSBkYXRhICovCi0JZGVidWdfc2NzaSgidGFzayBkZXEgW2NpZCAlZCBpdHQgMHgleCBpbW0gJWQgdW5zb2wgJWRdXG4iLAotCQkgICAgY29ubi0+aWQsIHRhc2stPml0dCwgdGFzay0+aW1tX2NvdW50LAotCQkgICAgdGFzay0+dW5zb2xfY291bnQpOwotCWlzY3NpX3RjcF9zZW5kX2hkcl9wcmVwKGNvbm4sIHRhc2stPmhkciwgdGFzay0+aGRyX2xlbik7Ci0KLQlpZiAoIXRhc2stPmltbV9jb3VudCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJZiB3ZSBoYXZlIGltbWVkaWF0ZSBkYXRhLCBhdHRhY2ggYSBwYXlsb2FkICovCi0JZXJyID0gaXNjc2lfdGNwX3NlbmRfZGF0YV9wcmVwKGNvbm4sIHNjc2lfb3V0KHNjKS0+dGFibGUuc2dsLAotCQkJCSAgICAgICBzY3NpX291dChzYyktPnRhYmxlLm5lbnRzLAotCQkJCSAgICAgICAwLCB0YXNrLT5pbW1fY291bnQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JdGNwX3Rhc2stPnNlbnQgKz0gdGFzay0+aW1tX2NvdW50OwotCXRhc2stPmltbV9jb3VudCA9IDA7CisJaWYgKGVycikgeworCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgZXJyKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXJldHVybiAwOwogfQogCi0vKgotICogaXNjc2lfdGNwX3Rhc2tfeG1pdCAtIHhtaXQgbm9ybWFsIFBEVSB0YXNrCi0gKiBAdGFzazogaXNjc2kgY29tbWFuZCB0YXNrCi0gKgotICogV2UncmUgZXhwZWN0ZWQgdG8gcmV0dXJuIDAgd2hlbiBldmVyeXRoaW5nIHdhcyB0cmFuc21pdHRlZCBzdWNjZXNmdWxseSwKLSAqIC1FQUdBSU4gaWYgdGhlcmUncyBzdGlsbCBkYXRhIGluIHRoZSBxdWV1ZSwgb3IgIT0gMCBmb3IgYW55IG90aGVyIGtpbmQKLSAqIG9mIGVycm9yLgotICovCi1zdGF0aWMgaW50Ci1pc2NzaV90Y3BfdGFza194bWl0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQorc3RhdGljIGludCBpc2NzaV9zd190Y3BfcGR1X2FsbG9jKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCB1aW50OF90IG9wY29kZSkKIHsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CiAJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2MgPSB0YXNrLT5zYzsKLQlzdHJ1Y3Qgc2NzaV9kYXRhX2J1ZmZlciAqc2RiOwotCWludCByYyA9IDA7CiAKLWZsdXNoOgotCS8qIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgZmlyc3QuICovCi0JcmMgPSBpc2NzaV90Y3BfZmx1c2goY29ubik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JLyogbWdtdCBjb21tYW5kICovCi0JaWYgKCFzYykgewotCQlpZiAodGFzay0+aGRyLT5pdHQgPT0gUkVTRVJWRURfSVRUKQotCQkJaXNjc2lfcHV0X3Rhc2sodGFzayk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIEFyZSB3ZSBkb25lIGFscmVhZHk/ICovCi0JaWYgKHNjLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQotCQlyZXR1cm4gMDsKLQotCXNkYiA9IHNjc2lfb3V0KHNjKTsKLQlpZiAodGFzay0+dW5zb2xfY291bnQgIT0gMCkgewotCQlzdHJ1Y3QgaXNjc2lfZGF0YSAqaGRyID0gJnRjcF90YXNrLT51bnNvbF9kdGFzay5oZHI7Ci0KLQkJLyogUHJlcGFyZSBhIGhlYWRlciBmb3IgdGhlIHVuc29saWNpdGVkIFBEVS4KLQkJICogVGhlIGFtb3VudCBvZiBkYXRhIHdlIHdhbnQgdG8gc2VuZCB3aWxsIGJlCi0JCSAqIGluIHRhc2stPmRhdGFfY291bnQuCi0JCSAqIEZJWE1FOiByZXR1cm4gdGhlIGRhdGEgY291bnQgaW5zdGVhZC4KLQkJICovCi0JCWlzY3NpX3ByZXBfdW5zb2xpY2l0X2RhdGFfcGR1KHRhc2ssIGhkcik7Ci0KLQkJZGVidWdfdGNwKCJ1bnNvbCBkb3V0IFtpdHQgMHgleCBkb2ZmICVkIGRsZW4gJWRdXG4iLAotCQkJCXRhc2stPml0dCwgdGNwX3Rhc2stPnNlbnQsIHRhc2stPmRhdGFfY291bnQpOwotCi0JCWlzY3NpX3RjcF9zZW5kX2hkcl9wcmVwKGNvbm4sIGhkciwgc2l6ZW9mKCpoZHIpKTsKLQkJcmMgPSBpc2NzaV90Y3Bfc2VuZF9kYXRhX3ByZXAoY29ubiwgc2RiLT50YWJsZS5zZ2wsCi0JCQkJCSAgICAgIHNkYi0+dGFibGUubmVudHMsIHRjcF90YXNrLT5zZW50LAotCQkJCQkgICAgICB0YXNrLT5kYXRhX2NvdW50KTsKLQkJaWYgKHJjKQotCQkJZ290byBmYWlsOwotCQl0Y3BfdGFzay0+c2VudCArPSB0YXNrLT5kYXRhX2NvdW50OwotCQl0YXNrLT51bnNvbF9jb3VudCAtPSB0YXNrLT5kYXRhX2NvdW50OwotCQlnb3RvIGZsdXNoOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQkJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQ7Ci0KLQkJLyogQWxsIHVuc29saWNpdGVkIFBEVXMgc2VudC4gQ2hlY2sgZm9yIHNvbGljaXRlZCBQRFVzLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQkJcjJ0ID0gdGNwX3Rhc2stPnIydDsKLQkJaWYgKHIydCAhPSBOVUxMKSB7Ci0JCQkvKiBDb250aW51ZSB3aXRoIHRoaXMgUjJUPyAqLwotCQkJaWYgKCFpc2NzaV9zb2xpY2l0X2RhdGFfY29udChjb25uLCB0YXNrLCByMnQpKSB7Ci0JCQkJZGVidWdfc2NzaSgiICBkb25lIHdpdGggcjJ0ICVwXG4iLCByMnQpOwotCi0JCQkJX19rZmlmb19wdXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsCi0JCQkJCSAgICAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSk7Ci0JCQkJdGNwX3Rhc2stPnIydCA9IHIydCA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocjJ0ID09IE5VTEwpIHsKLQkJCV9fa2ZpZm9fZ2V0KHRjcF90YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZ0Y3BfdGFzay0+cjJ0LAotCQkJCSAgICBzaXplb2Yodm9pZCopKTsKLQkJCXIydCA9IHRjcF90YXNrLT5yMnQ7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCi0JCS8qIFdhaXRpbmcgZm9yIG1vcmUgUjJUcyB0byBhcnJpdmUuICovCi0JCWlmIChyMnQgPT0gTlVMTCkgewotCQkJZGVidWdfdGNwKCJubyBSMlRzIHlldFxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWRlYnVnX3Njc2koInNvbCBkb3V0ICVwIFtkc24gJWQgaXR0IDB4JXggZG9mZiAlZCBkbGVuICVkXVxuIiwKLQkJCXIydCwgcjJ0LT5zb2xpY2l0X2RhdGFzbiAtIDEsIHRhc2stPml0dCwKLQkJCXIydC0+ZGF0YV9vZmZzZXQgKyByMnQtPnNlbnQsIHIydC0+ZGF0YV9jb3VudCk7Ci0KLQkJaXNjc2lfdGNwX3NlbmRfaGRyX3ByZXAoY29ubiwgJnIydC0+ZHRhc2suaGRyLAotCQkJCQlzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwotCi0JCXJjID0gaXNjc2lfdGNwX3NlbmRfZGF0YV9wcmVwKGNvbm4sIHNkYi0+dGFibGUuc2dsLAotCQkJCQkgICAgICBzZGItPnRhYmxlLm5lbnRzLAotCQkJCQkgICAgICByMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5zZW50LAotCQkJCQkgICAgICByMnQtPmRhdGFfY291bnQpOwotCQlpZiAocmMpCi0JCQlnb3RvIGZhaWw7Ci0JCXRjcF90YXNrLT5zZW50ICs9IHIydC0+ZGF0YV9jb3VudDsKLQkJcjJ0LT5zZW50ICs9IHIydC0+ZGF0YV9jb3VudDsKLQkJZ290byBmbHVzaDsKLQl9CisJdGFzay0+aGRyID0gdGFzay0+ZGRfZGF0YSArIHNpemVvZigqdGNwX3Rhc2spOworCXRhc2stPmhkcl9tYXggPSBzaXplb2Yoc3RydWN0IGlzY3NpX3N3X3RjcF9oZHJidWYpIC0gSVNDU0lfRElHRVNUX1NJWkU7CiAJcmV0dXJuIDA7Ci1mYWlsOgotCWlzY3NpX2Nvbm5fZmFpbHVyZShjb25uLCByYyk7Ci0JcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKgotaXNjc2lfdGNwX2Nvbm5fY3JlYXRlKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sIHVpbnQzMl90IGNvbm5faWR4KQoraXNjc2lfc3dfdGNwX2Nvbm5fY3JlYXRlKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCQkgdWludDMyX3QgY29ubl9pZHgpCiB7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uOworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm47CiAKLQljbHNfY29ubiA9IGlzY3NpX2Nvbm5fc2V0dXAoY2xzX3Nlc3Npb24sIHNpemVvZigqdGNwX2Nvbm4pLCBjb25uX2lkeCk7CisJY2xzX2Nvbm4gPSBpc2NzaV90Y3BfY29ubl9zZXR1cChjbHNfc2Vzc2lvbiwgc2l6ZW9mKCp0Y3Bfc3dfY29ubiksCisJCQkJCWNvbm5faWR4KTsKIAlpZiAoIWNsc19jb25uKQogCQlyZXR1cm4gTlVMTDsKIAljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7Ci0JLyoKLQkgKiBkdWUgdG8gc3RyYW5nZSBpc3N1ZXMgd2l0aCBpc2VyIHRoZXNlIGFyZSBub3Qgc2V0Ci0JICogaW4gaXNjc2lfY29ubl9zZXR1cAotCSAqLwotCWNvbm4tPm1heF9yZWN2X2RsZW5ndGggPSBJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTjsKLQogCXRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQl0Y3BfY29ubi0+aXNjc2lfY29ubiA9IGNvbm47CisJdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKIAotCXRjcF9jb25uLT50eF9oYXNoLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKCJjcmMzMmMiLCAwLAotCQkJCQkJICBDUllQVE9fQUxHX0FTWU5DKTsKLQl0Y3BfY29ubi0+dHhfaGFzaC5mbGFncyA9IDA7Ci0JaWYgKElTX0VSUih0Y3BfY29ubi0+dHhfaGFzaC50Zm0pKQorCXRjcF9zd19jb25uLT50eF9oYXNoLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKCJjcmMzMmMiLCAwLAorCQkJCQkJICAgICBDUllQVE9fQUxHX0FTWU5DKTsKKwl0Y3Bfc3dfY29ubi0+dHhfaGFzaC5mbGFncyA9IDA7CisJaWYgKElTX0VSUih0Y3Bfc3dfY29ubi0+dHhfaGFzaC50Zm0pKQogCQlnb3RvIGZyZWVfY29ubjsKIAotCXRjcF9jb25uLT5yeF9oYXNoLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKCJjcmMzMmMiLCAwLAotCQkJCQkJICBDUllQVE9fQUxHX0FTWU5DKTsKLQl0Y3BfY29ubi0+cnhfaGFzaC5mbGFncyA9IDA7Ci0JaWYgKElTX0VSUih0Y3BfY29ubi0+cnhfaGFzaC50Zm0pKQorCXRjcF9zd19jb25uLT5yeF9oYXNoLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKCJjcmMzMmMiLCAwLAorCQkJCQkJICAgICBDUllQVE9fQUxHX0FTWU5DKTsKKwl0Y3Bfc3dfY29ubi0+cnhfaGFzaC5mbGFncyA9IDA7CisJaWYgKElTX0VSUih0Y3Bfc3dfY29ubi0+cnhfaGFzaC50Zm0pKQogCQlnb3RvIGZyZWVfdHhfdGZtOworCXRjcF9jb25uLT5yeF9oYXNoID0gJnRjcF9zd19jb25uLT5yeF9oYXNoOwogCiAJcmV0dXJuIGNsc19jb25uOwogCiBmcmVlX3R4X3RmbToKLQljcnlwdG9fZnJlZV9oYXNoKHRjcF9jb25uLT50eF9oYXNoLnRmbSk7CisJY3J5cHRvX2ZyZWVfaGFzaCh0Y3Bfc3dfY29ubi0+dHhfaGFzaC50Zm0pOwogZnJlZV9jb25uOgogCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAogCQkJICAiQ291bGQgbm90IGNyZWF0ZSBjb25uZWN0aW9uIGR1ZSB0byBjcmMzMmMgIgogCQkJICAibG9hZGluZyBlcnJvci4gTWFrZSBzdXJlIHRoZSBjcmMzMmMgIgogCQkJICAibW9kdWxlIGlzIGJ1aWx0IGFzIGEgbW9kdWxlIG9yIGludG8gdGhlICIKIAkJCSAgImtlcm5lbFxuIik7Ci0JaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7CisJaXNjc2lfdGNwX2Nvbm5fdGVhcmRvd24oY2xzX2Nvbm4pOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAotaXNjc2lfdGNwX3JlbGVhc2VfY29ubihzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKK3N0YXRpYyB2b2lkIGlzY3NpX3N3X3RjcF9yZWxlYXNlX2Nvbm4oc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOwotCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSB0Y3BfY29ubi0+c29jazsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHRjcF9zd19jb25uLT5zb2NrOwogCiAJaWYgKCFzb2NrKQogCQlyZXR1cm47CiAKIAlzb2NrX2hvbGQoc29jay0+c2spOwotCWlzY3NpX2Nvbm5fcmVzdG9yZV9jYWxsYmFja3ModGNwX2Nvbm4pOworCWlzY3NpX3N3X3RjcF9jb25uX3Jlc3RvcmVfY2FsbGJhY2tzKHRjcF9zd19jb25uKTsKIAlzb2NrX3B1dChzb2NrLT5zayk7CiAKIAlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCXRjcF9jb25uLT5zb2NrID0gTlVMTDsKKwl0Y3Bfc3dfY29ubi0+c29jayA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCXNvY2tmZF9wdXQoc29jayk7CiB9CiAKLXN0YXRpYyB2b2lkCi1pc2NzaV90Y3BfY29ubl9kZXN0cm95KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4pCitzdGF0aWMgdm9pZCBpc2NzaV9zd190Y3BfY29ubl9kZXN0cm95KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4pCiB7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CiAKLQlpc2NzaV90Y3BfcmVsZWFzZV9jb25uKGNvbm4pOworCWlzY3NpX3N3X3RjcF9yZWxlYXNlX2Nvbm4oY29ubik7CiAKLQlpZiAodGNwX2Nvbm4tPnR4X2hhc2gudGZtKQotCQljcnlwdG9fZnJlZV9oYXNoKHRjcF9jb25uLT50eF9oYXNoLnRmbSk7Ci0JaWYgKHRjcF9jb25uLT5yeF9oYXNoLnRmbSkKLQkJY3J5cHRvX2ZyZWVfaGFzaCh0Y3BfY29ubi0+cnhfaGFzaC50Zm0pOworCWlmICh0Y3Bfc3dfY29ubi0+dHhfaGFzaC50Zm0pCisJCWNyeXB0b19mcmVlX2hhc2godGNwX3N3X2Nvbm4tPnR4X2hhc2gudGZtKTsKKwlpZiAodGNwX3N3X2Nvbm4tPnJ4X2hhc2gudGZtKQorCQljcnlwdG9fZnJlZV9oYXNoKHRjcF9zd19jb25uLT5yeF9oYXNoLnRmbSk7CiAKLQlpc2NzaV9jb25uX3RlYXJkb3duKGNsc19jb25uKTsKKwlpc2NzaV90Y3BfY29ubl90ZWFyZG93bihjbHNfY29ubik7CiB9CiAKLXN0YXRpYyB2b2lkCi1pc2NzaV90Y3BfY29ubl9zdG9wKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIGludCBmbGFnKQorc3RhdGljIHZvaWQgaXNjc2lfc3dfdGNwX2Nvbm5fc3RvcChzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLCBpbnQgZmxhZykKIHsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKIAogCS8qIHVzZXJzcGFjZSBtYXkgaGF2ZSBnb29mZWQgdXAgYW5kIG5vdCBib3VuZCB1cyAqLwotCWlmICghdGNwX2Nvbm4tPnNvY2spCisJaWYgKCF0Y3Bfc3dfY29ubi0+c29jaykKIAkJcmV0dXJuOwogCS8qCiAJICogTWFrZSBzdXJlIG91ciByZWN2IHNpZGUgaXMgc3RvcHBlZC4KIAkgKiBPbGRlciB0b29scyBjYWxsZWQgY29ubiBzdG9wIGJlZm9yZSBlcF9kaXNjb25uZWN0CiAJICogc28gSU8gY291bGQgc3RpbGwgYmUgY29taW5nIGluLgogCSAqLwotCXdyaXRlX2xvY2tfYmgoJnRjcF9jb25uLT5zb2NrLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmdGNwX3N3X2Nvbm4tPnNvY2stPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF9yeCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfY29ubi0+c29jay0+c2stPnNrX2NhbGxiYWNrX2xvY2spOworCXdyaXRlX3VubG9ja19iaCgmdGNwX3N3X2Nvbm4tPnNvY2stPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAogCWlzY3NpX2Nvbm5fc3RvcChjbHNfY29ubiwgZmxhZyk7Ci0JaXNjc2lfdGNwX3JlbGVhc2VfY29ubihjb25uKTsKKwlpc2NzaV9zd190Y3BfcmVsZWFzZV9jb25uKGNvbm4pOwogfQogCi1zdGF0aWMgaW50IGlzY3NpX3RjcF9nZXRfYWRkcihzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgIGNoYXIgKmJ1ZiwgaW50ICpwb3J0LAotCQkJICAgICAgaW50ICgqZ2V0bmFtZSkoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwKLQkJCQkJaW50ICphZGRybGVuKSkKK3N0YXRpYyBpbnQgaXNjc2lfc3dfdGNwX2dldF9hZGRyKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSBjaGFyICpidWYsIGludCAqcG9ydCwKKwkJCQkgaW50ICgqZ2V0bmFtZSkoc3RydWN0IHNvY2tldCAqLAorCQkJCQkJc3RydWN0IHNvY2thZGRyICosCisJCQkJCQlpbnQgKmFkZHJsZW4pKQogewogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CkBAIC0xNjE5LDE0ICs2MTEsMTUgQEAKIH0KIAogc3RhdGljIGludAotaXNjc2lfdGNwX2Nvbm5fYmluZChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uLAotCQkgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwgdWludDY0X3QgdHJhbnNwb3J0X2VwaCwKLQkJICAgIGludCBpc19sZWFkaW5nKQoraXNjc2lfc3dfdGNwX2Nvbm5fYmluZChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uLAorCQkgICAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwgdWludDY0X3QgdHJhbnNwb3J0X2VwaCwKKwkJICAgICAgIGludCBpc19sZWFkaW5nKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChjbHNfc2Vzc2lvbik7CiAJc3RydWN0IGlzY3NpX2hvc3QgKmlob3N0ID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gKnRjcF9zd19jb25uID0gdGNwX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJaW50IGVycjsKQEAgLTE2NDMsMTMgKzYzNiwxMyBAQAogCSAqIHVzZXJzcGFjZSBtYXkgc3RpbGwgd2FudCB0byBxdWVyeSB0aGUgdmFsdWVzIHNpbmNlIHdlIHdpbGwKIAkgKiBiZSB1c2luZyB0aGVtIGZvciB0aGUgcmVjb25uZWN0CiAJICovCi0JZXJyID0gaXNjc2lfdGNwX2dldF9hZGRyKGNvbm4sIHNvY2ssIGNvbm4tPnBvcnRhbF9hZGRyZXNzLAotCQkJCSAmY29ubi0+cG9ydGFsX3BvcnQsIGtlcm5lbF9nZXRwZWVybmFtZSk7CisJZXJyID0gaXNjc2lfc3dfdGNwX2dldF9hZGRyKGNvbm4sIHNvY2ssIGNvbm4tPnBvcnRhbF9hZGRyZXNzLAorCQkJCSAgICAmY29ubi0+cG9ydGFsX3BvcnQsIGtlcm5lbF9nZXRwZWVybmFtZSk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX3NvY2tldDsKIAotCWVyciA9IGlzY3NpX3RjcF9nZXRfYWRkcihjb25uLCBzb2NrLCBpaG9zdC0+bG9jYWxfYWRkcmVzcywKLQkJCQkmaWhvc3QtPmxvY2FsX3BvcnQsIGtlcm5lbF9nZXRzb2NrbmFtZSk7CisJZXJyID0gaXNjc2lfc3dfdGNwX2dldF9hZGRyKGNvbm4sIHNvY2ssIGlob3N0LT5sb2NhbF9hZGRyZXNzLAorCQkJCSAgICAmaWhvc3QtPmxvY2FsX3BvcnQsIGtlcm5lbF9nZXRzb2NrbmFtZSk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX3NvY2tldDsKIApAQCAtMTY1OCw3ICs2NTEsNyBAQAogCQlnb3RvIGZyZWVfc29ja2V0OwogCiAJLyogYmluZCBpU0NTSSBjb25uZWN0aW9uIGFuZCBzb2NrZXQgKi8KLQl0Y3BfY29ubi0+c29jayA9IHNvY2s7CisJdGNwX3N3X2Nvbm4tPnNvY2sgPSBzb2NrOwogCiAJLyogc2V0dXAgU29ja2V0IHBhcmFtZXRlcnMgKi8KIAlzayA9IHNvY2stPnNrOwpAQCAtMTY2Niw4ICs2NTksOCBAQAogCXNrLT5za19zbmR0aW1lbyA9IDE1ICogSFo7IC8qIEZJWE1FOiBtYWtlIGl0IGNvbmZpZ3VyYWJsZSAqLwogCXNrLT5za19hbGxvY2F0aW9uID0gR0ZQX0FUT01JQzsKIAotCWlzY3NpX2Nvbm5fc2V0X2NhbGxiYWNrcyhjb25uKTsKLQl0Y3BfY29ubi0+c2VuZHBhZ2UgPSB0Y3BfY29ubi0+c29jay0+b3BzLT5zZW5kcGFnZTsKKwlpc2NzaV9zd190Y3BfY29ubl9zZXRfY2FsbGJhY2tzKGNvbm4pOworCXRjcF9zd19jb25uLT5zZW5kcGFnZSA9IHRjcF9zd19jb25uLT5zb2NrLT5vcHMtPnNlbmRwYWdlOwogCS8qCiAJICogc2V0IHJlY2VpdmUgc3RhdGUgbWFjaGluZSBpbnRvIGluaXRpYWwgc3RhdGUKIAkgKi8KQEAgLTE2NzksNzQgKzY3MiwxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQKLWlzY3NpX3IydHBvb2xfYWxsb2Moc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0JaW50IGk7Ci0JaW50IGNtZF9pOwotCi0JLyoKLQkgKiBpbml0aWFsaXplIHBlci10YXNrOiBSMlQgcG9vbCBhbmQgeG1pdCBxdWV1ZQotCSAqLwotCWZvciAoY21kX2kgPSAwOyBjbWRfaSA8IHNlc3Npb24tPmNtZHNfbWF4OyBjbWRfaSsrKSB7Ci0JICAgICAgICBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayA9IHNlc3Npb24tPmNtZHNbY21kX2ldOwotCQlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKLQotCQkvKgotCQkgKiBwcmUtYWxsb2NhdGVkIHg0IGFzIG11Y2ggcjJ0cyB0byBoYW5kbGUgcmFjZSB3aGVuCi0JCSAqIHRhcmdldCBhY2tzIERhdGFPdXQgZmFzdGVyIHRoYW4gd2UgZGF0YV94bWl0KCkgcXVldWVzCi0JCSAqIGNvdWxkIHJlcGxlbmlzaCByMnRxdWV1ZS4KLQkJICovCi0KLQkJLyogUjJUIHBvb2wgKi8KLQkJaWYgKGlzY3NpX3Bvb2xfaW5pdCgmdGNwX3Rhc2stPnIydHBvb2wsIHNlc3Npb24tPm1heF9yMnQgKiA0LCBOVUxMLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGlzY3NpX3IydF9pbmZvKSkpIHsKLQkJCWdvdG8gcjJ0X2FsbG9jX2ZhaWw7Ci0JCX0KLQotCQkvKiBSMlQgeG1pdCBxdWV1ZSAqLwotCQl0Y3BfdGFzay0+cjJ0cXVldWUgPSBrZmlmb19hbGxvYygKLQkJICAgICAgc2Vzc2lvbi0+bWF4X3IydCAqIDQgKiBzaXplb2Yodm9pZCopLCBHRlBfS0VSTkVMLCBOVUxMKTsKLQkJaWYgKHRjcF90YXNrLT5yMnRxdWV1ZSA9PSBFUlJfUFRSKC1FTk9NRU0pKSB7Ci0JCQlpc2NzaV9wb29sX2ZyZWUoJnRjcF90YXNrLT5yMnRwb29sKTsKLQkJCWdvdG8gcjJ0X2FsbG9jX2ZhaWw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotcjJ0X2FsbG9jX2ZhaWw6Ci0JZm9yIChpID0gMDsgaSA8IGNtZF9pOyBpKyspIHsKLQkJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2sgPSBzZXNzaW9uLT5jbWRzW2ldOwotCQlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKLQotCQlrZmlmb19mcmVlKHRjcF90YXNrLT5yMnRxdWV1ZSk7Ci0JCWlzY3NpX3Bvb2xfZnJlZSgmdGNwX3Rhc2stPnIydHBvb2wpOwotCX0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQKLWlzY3NpX3IydHBvb2xfZnJlZShzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzZXNzaW9uLT5jbWRzX21heDsgaSsrKSB7Ci0JCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrID0gc2Vzc2lvbi0+Y21kc1tpXTsKLQkJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7Ci0KLQkJa2ZpZm9fZnJlZSh0Y3BfdGFzay0+cjJ0cXVldWUpOwotCQlpc2NzaV9wb29sX2ZyZWUoJnRjcF90YXNrLT5yMnRwb29sKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWlzY3NpX2Nvbm5fc2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sCi0JCSAgICAgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQorc3RhdGljIGludCBpc2NzaV9zd190Y3BfY29ubl9zZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgICAgICAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmLAorCQkJCSAgICAgICBpbnQgYnVmbGVuKQogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9zd190Y3BfY29ubiAqdGNwX3N3X2Nvbm4gPSB0Y3BfY29ubi0+ZGRfZGF0YTsKIAlpbnQgdmFsdWU7CiAKIAlzd2l0Y2gocGFyYW0pIHsKQEAgLTE3NTUsOCArNjg4LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTjoKIAkJaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmLCBidWZsZW4pOwotCQl0Y3BfY29ubi0+c2VuZHBhZ2UgPSBjb25uLT5kYXRhZGdzdF9lbiA/Ci0JCQlzb2NrX25vX3NlbmRwYWdlIDogdGNwX2Nvbm4tPnNvY2stPm9wcy0+c2VuZHBhZ2U7CisJCXRjcF9zd19jb25uLT5zZW5kcGFnZSA9IGNvbm4tPmRhdGFkZ3N0X2VuID8KKwkJCXNvY2tfbm9fc2VuZHBhZ2UgOiB0Y3Bfc3dfY29ubi0+c29jay0+b3BzLT5zZW5kcGFnZTsKIAkJYnJlYWs7CiAJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgogCQlzc2NhbmYoYnVmLCAiJWQiLCAmdmFsdWUpOwpAQCAtMTc2NCw5ICs2OTcsOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChzZXNzaW9uLT5tYXhfcjJ0ID09IHZhbHVlKQogCQkJYnJlYWs7Ci0JCWlzY3NpX3IydHBvb2xfZnJlZShzZXNzaW9uKTsKKwkJaXNjc2lfdGNwX3IydHBvb2xfZnJlZShzZXNzaW9uKTsKIAkJaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBwYXJhbSwgYnVmLCBidWZsZW4pOwotCQlpZiAoaXNjc2lfcjJ0cG9vbF9hbGxvYyhzZXNzaW9uKSkKKwkJaWYgKGlzY3NpX3RjcF9yMnRwb29sX2FsbG9jKHNlc3Npb24pKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzc2LDkgKzcwOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWlzY3NpX3RjcF9jb25uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAotCQkJIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgaXNjc2lfc3dfdGNwX2Nvbm5fZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkJICAgICAgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOwogCWludCBsZW47CkBAIC0xODAyLDQ4ICs3MzQsNDIgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlzY3NpX2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sIHN0cnVjdCBpc2NzaV9zdGF0cyAqc3RhdHMpCitpc2NzaV9zd190Y3BfY29ubl9nZXRfc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3N3X3RjcF9jb25uICp0Y3Bfc3dfY29ubiA9IHRjcF9jb25uLT5kZF9kYXRhOwogCi0Jc3RhdHMtPnR4ZGF0YV9vY3RldHMgPSBjb25uLT50eGRhdGFfb2N0ZXRzOwotCXN0YXRzLT5yeGRhdGFfb2N0ZXRzID0gY29ubi0+cnhkYXRhX29jdGV0czsKLQlzdGF0cy0+c2NzaWNtZF9wZHVzID0gY29ubi0+c2NzaWNtZF9wZHVzX2NudDsKLQlzdGF0cy0+ZGF0YW91dF9wZHVzID0gY29ubi0+ZGF0YW91dF9wZHVzX2NudDsKLQlzdGF0cy0+c2NzaXJzcF9wZHVzID0gY29ubi0+c2NzaXJzcF9wZHVzX2NudDsKLQlzdGF0cy0+ZGF0YWluX3BkdXMgPSBjb25uLT5kYXRhaW5fcGR1c19jbnQ7Ci0Jc3RhdHMtPnIydF9wZHVzID0gY29ubi0+cjJ0X3BkdXNfY250OwotCXN0YXRzLT50bWZjbWRfcGR1cyA9IGNvbm4tPnRtZmNtZF9wZHVzX2NudDsKLQlzdGF0cy0+dG1mcnNwX3BkdXMgPSBjb25uLT50bWZyc3BfcGR1c19jbnQ7CiAJc3RhdHMtPmN1c3RvbV9sZW5ndGggPSAzOwogCXN0cmNweShzdGF0cy0+Y3VzdG9tWzBdLmRlc2MsICJ0eF9zZW5kcGFnZV9mYWlsdXJlcyIpOwotCXN0YXRzLT5jdXN0b21bMF0udmFsdWUgPSB0Y3BfY29ubi0+c2VuZHBhZ2VfZmFpbHVyZXNfY250OworCXN0YXRzLT5jdXN0b21bMF0udmFsdWUgPSB0Y3Bfc3dfY29ubi0+c2VuZHBhZ2VfZmFpbHVyZXNfY250OwogCXN0cmNweShzdGF0cy0+Y3VzdG9tWzFdLmRlc2MsICJyeF9kaXNjb250aWd1b3VzX2hkciIpOwotCXN0YXRzLT5jdXN0b21bMV0udmFsdWUgPSB0Y3BfY29ubi0+ZGlzY29udGlndW91c19oZHJfY250OworCXN0YXRzLT5jdXN0b21bMV0udmFsdWUgPSB0Y3Bfc3dfY29ubi0+ZGlzY29udGlndW91c19oZHJfY250OwogCXN0cmNweShzdGF0cy0+Y3VzdG9tWzJdLmRlc2MsICJlaF9hYm9ydF9jbnQiKTsKIAlzdGF0cy0+Y3VzdG9tWzJdLnZhbHVlID0gY29ubi0+ZWhfYWJvcnRfY250OworCisJaXNjc2lfdGNwX2Nvbm5fZ2V0X3N0YXRzKGNsc19jb25uLCBzdGF0cyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKgotaXNjc2lfdGNwX3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIHVpbnQxNl90IGNtZHNfbWF4LAotCQkJIHVpbnQxNl90IHFkZXB0aCwgdWludDMyX3QgaW5pdGlhbF9jbWRzbiwKLQkJCSB1aW50MzJfdCAqaG9zdG5vKQoraXNjc2lfc3dfdGNwX3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIHVpbnQxNl90IGNtZHNfbWF4LAorCQkJICAgIHVpbnQxNl90IHFkZXB0aCwgdWludDMyX3QgaW5pdGlhbF9jbWRzbiwKKwkJCSAgICB1aW50MzJfdCAqaG9zdG5vKQogewogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb247CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb247CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7Ci0JaW50IGNtZF9pOwogCiAJaWYgKGVwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBpbnZhbGlkIGVwICVwLlxuIiwgZXApOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlzaG9zdCA9IGlzY3NpX2hvc3RfYWxsb2MoJmlzY3NpX3NodCwgMCwgcWRlcHRoKTsKKwlzaG9zdCA9IGlzY3NpX2hvc3RfYWxsb2MoJmlzY3NpX3N3X3RjcF9zaHQsIDAsIHFkZXB0aCk7CiAJaWYgKCFzaG9zdCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc2hvc3QtPnRyYW5zcG9ydHQgPSBpc2NzaV90Y3Bfc2NzaV90cmFuc3BvcnQ7CisJc2hvc3QtPnRyYW5zcG9ydHQgPSBpc2NzaV9zd190Y3Bfc2NzaV90cmFuc3BvcnQ7CiAJc2hvc3QtPm1heF9sdW4gPSBpc2NzaV9tYXhfbHVuOwogCXNob3N0LT5tYXhfaWQgPSAwOwogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDA7CkBAIC0xODUzLDIzICs3NzksMTcgQEAKIAkJZ290byBmcmVlX2hvc3Q7CiAJKmhvc3RubyA9IHNob3N0LT5ob3N0X25vOwogCi0JY2xzX3Nlc3Npb24gPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZpc2NzaV90Y3BfdHJhbnNwb3J0LCBzaG9zdCwgY21kc19tYXgsCi0JCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV90Y3BfdGFzayksCisJY2xzX3Nlc3Npb24gPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZpc2NzaV9zd190Y3BfdHJhbnNwb3J0LCBzaG9zdCwKKwkJCQkJICBjbWRzX21heCwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGlzY3NpX3RjcF90YXNrKSArCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpc2NzaV9zd190Y3BfaGRyYnVmKSwKIAkJCQkJICBpbml0aWFsX2NtZHNuLCAwKTsKIAlpZiAoIWNsc19zZXNzaW9uKQogCQlnb3RvIHJlbW92ZV9ob3N0OwogCXNlc3Npb24gPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKIAogCXNob3N0LT5jYW5fcXVldWUgPSBzZXNzaW9uLT5zY3NpX2NtZHNfbWF4OwotCWZvciAoY21kX2kgPSAwOyBjbWRfaSA8IHNlc3Npb24tPmNtZHNfbWF4OyBjbWRfaSsrKSB7Ci0JCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrID0gc2Vzc2lvbi0+Y21kc1tjbWRfaV07Ci0JCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwotCi0JCXRhc2stPmhkciA9ICZ0Y3BfdGFzay0+aGRyLmNtZF9oZHI7Ci0JCXRhc2stPmhkcl9tYXggPSBzaXplb2YodGNwX3Rhc2stPmhkcikgLSBJU0NTSV9ESUdFU1RfU0laRTsKLQl9Ci0KLQlpZiAoaXNjc2lfcjJ0cG9vbF9hbGxvYyhzZXNzaW9uKSkKKwlpZiAoaXNjc2lfdGNwX3IydHBvb2xfYWxsb2Moc2Vzc2lvbikpCiAJCWdvdG8gcmVtb3ZlX3Nlc3Npb247CiAJcmV0dXJuIGNsc19zZXNzaW9uOwogCkBAIC0xODgyLDI1ICs4MDIsMjUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgaXNjc2lfdGNwX3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQorc3RhdGljIHZvaWQgaXNjc2lfc3dfdGNwX3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChjbHNfc2Vzc2lvbik7CiAKLQlpc2NzaV9yMnRwb29sX2ZyZWUoY2xzX3Nlc3Npb24tPmRkX2RhdGEpOworCWlzY3NpX3RjcF9yMnRwb29sX2ZyZWUoY2xzX3Nlc3Npb24tPmRkX2RhdGEpOwogCWlzY3NpX3Nlc3Npb25fdGVhcmRvd24oY2xzX3Nlc3Npb24pOwogCiAJaXNjc2lfaG9zdF9yZW1vdmUoc2hvc3QpOwogCWlzY3NpX2hvc3RfZnJlZShzaG9zdCk7CiB9CiAKLXN0YXRpYyBpbnQgaXNjc2lfdGNwX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IGlzY3NpX3N3X3RjcF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgQkxLX0JPVU5DRV9BTlkpOwogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsIDApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NzaV9zaHQgPSB7CitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpc2NzaV9zd190Y3Bfc2h0ID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSAiaVNDU0kgSW5pdGlhdG9yIG92ZXIgVENQL0lQIiwKIAkucXVldWVjb21tYW5kICAgICAgICAgICA9IGlzY3NpX3F1ZXVlY29tbWFuZCwKQEAgLTE5MTMsMTIgKzgzMywxMiBAQAogCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gaXNjc2lfZWhfZGV2aWNlX3Jlc2V0LAogCS5laF90YXJnZXRfcmVzZXRfaGFuZGxlcj0gaXNjc2lfZWhfdGFyZ2V0X3Jlc2V0LAogCS51c2VfY2x1c3RlcmluZyAgICAgICAgID0gRElTQUJMRV9DTFVTVEVSSU5HLAotCS5zbGF2ZV9jb25maWd1cmUgICAgICAgID0gaXNjc2lfdGNwX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfY29uZmlndXJlICAgICAgICA9IGlzY3NpX3N3X3RjcF9zbGF2ZV9jb25maWd1cmUsCiAJLnByb2NfbmFtZQkJPSAiaXNjc2lfdGNwIiwKIAkudGhpc19pZAkJPSAtMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0IGlzY3NpX3RjcF90cmFuc3BvcnQgPSB7CitzdGF0aWMgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCBpc2NzaV9zd190Y3BfdHJhbnNwb3J0ID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCQk9ICJ0Y3AiLAogCS5jYXBzCQkJPSBDQVBfUkVDT1ZFUllfTDAgfCBDQVBfTVVMVElfUjJUIHwgQ0FQX0hEUkRHU1QKQEAgLTE5NTEsMzIgKzg3MSwzNiBAQAogCQkJCSAgSVNDU0lfSE9TVF9JTklUSUFUT1JfTkFNRSB8CiAJCQkJICBJU0NTSV9IT1NUX05FVERFVl9OQU1FLAogCS8qIHNlc3Npb24gbWFuYWdlbWVudCAqLwotCS5jcmVhdGVfc2Vzc2lvbgkJPSBpc2NzaV90Y3Bfc2Vzc2lvbl9jcmVhdGUsCi0JLmRlc3Ryb3lfc2Vzc2lvbgk9IGlzY3NpX3RjcF9zZXNzaW9uX2Rlc3Ryb3ksCisJLmNyZWF0ZV9zZXNzaW9uCQk9IGlzY3NpX3N3X3RjcF9zZXNzaW9uX2NyZWF0ZSwKKwkuZGVzdHJveV9zZXNzaW9uCT0gaXNjc2lfc3dfdGNwX3Nlc3Npb25fZGVzdHJveSwKIAkvKiBjb25uZWN0aW9uIG1hbmFnZW1lbnQgKi8KLQkuY3JlYXRlX2Nvbm4JCT0gaXNjc2lfdGNwX2Nvbm5fY3JlYXRlLAotCS5iaW5kX2Nvbm4JCT0gaXNjc2lfdGNwX2Nvbm5fYmluZCwKLQkuZGVzdHJveV9jb25uCQk9IGlzY3NpX3RjcF9jb25uX2Rlc3Ryb3ksCi0JLnNldF9wYXJhbQkJPSBpc2NzaV9jb25uX3NldF9wYXJhbSwKLQkuZ2V0X2Nvbm5fcGFyYW0JCT0gaXNjc2lfdGNwX2Nvbm5fZ2V0X3BhcmFtLAorCS5jcmVhdGVfY29ubgkJPSBpc2NzaV9zd190Y3BfY29ubl9jcmVhdGUsCisJLmJpbmRfY29ubgkJPSBpc2NzaV9zd190Y3BfY29ubl9iaW5kLAorCS5kZXN0cm95X2Nvbm4JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fZGVzdHJveSwKKwkuc2V0X3BhcmFtCQk9IGlzY3NpX3N3X3RjcF9jb25uX3NldF9wYXJhbSwKKwkuZ2V0X2Nvbm5fcGFyYW0JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fZ2V0X3BhcmFtLAogCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLAogCS5zdGFydF9jb25uCQk9IGlzY3NpX2Nvbm5fc3RhcnQsCi0JLnN0b3BfY29ubgkJPSBpc2NzaV90Y3BfY29ubl9zdG9wLAorCS5zdG9wX2Nvbm4JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fc3RvcCwKIAkvKiBpc2NzaSBob3N0IHBhcmFtcyAqLwogCS5nZXRfaG9zdF9wYXJhbQkJPSBpc2NzaV9ob3N0X2dldF9wYXJhbSwKIAkuc2V0X2hvc3RfcGFyYW0JCT0gaXNjc2lfaG9zdF9zZXRfcGFyYW0sCiAJLyogSU8gKi8KIAkuc2VuZF9wZHUJCT0gaXNjc2lfY29ubl9zZW5kX3BkdSwKLQkuZ2V0X3N0YXRzCQk9IGlzY3NpX2Nvbm5fZ2V0X3N0YXRzLAorCS5nZXRfc3RhdHMJCT0gaXNjc2lfc3dfdGNwX2Nvbm5fZ2V0X3N0YXRzLAorCS8qIGlzY3NpIHRhc2svY21kIGhlbHBlcnMgKi8KIAkuaW5pdF90YXNrCQk9IGlzY3NpX3RjcF90YXNrX2luaXQsCiAJLnhtaXRfdGFzawkJPSBpc2NzaV90Y3BfdGFza194bWl0LAogCS5jbGVhbnVwX3Rhc2sJCT0gaXNjc2lfdGNwX2NsZWFudXBfdGFzaywKKwkvKiBsb3cgbGV2ZWwgcGR1IGhlbHBlcnMgKi8KKwkueG1pdF9wZHUJCT0gaXNjc2lfc3dfdGNwX3BkdV94bWl0LAorCS5pbml0X3BkdQkJPSBpc2NzaV9zd190Y3BfcGR1X2luaXQsCisJLmFsbG9jX3BkdQkJPSBpc2NzaV9zd190Y3BfcGR1X2FsbG9jLAogCS8qIHJlY292ZXJ5ICovCiAJLnNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQgPSBpc2NzaV9zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0LAogfTsKIAotc3RhdGljIGludCBfX2luaXQKLWlzY3NpX3RjcF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpc2NzaV9zd190Y3BfaW5pdCh2b2lkKQogewogCWlmIChpc2NzaV9tYXhfbHVuIDwgMSkgewogCQlwcmludGsoS0VSTl9FUlIgImlzY3NpX3RjcDogSW52YWxpZCBtYXhfbHVuIHZhbHVlIG9mICV1XG4iLApAQCAtMTk4NCwxOSArOTA4LDE4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlzY3NpX3RjcF9zY3NpX3RyYW5zcG9ydCA9IGlzY3NpX3JlZ2lzdGVyX3RyYW5zcG9ydCgKLQkJCQkJCQkmaXNjc2lfdGNwX3RyYW5zcG9ydCk7Ci0JaWYgKCFpc2NzaV90Y3Bfc2NzaV90cmFuc3BvcnQpCisJaXNjc2lfc3dfdGNwX3Njc2lfdHJhbnNwb3J0ID0gaXNjc2lfcmVnaXN0ZXJfdHJhbnNwb3J0KAorCQkJCQkJJmlzY3NpX3N3X3RjcF90cmFuc3BvcnQpOworCWlmICghaXNjc2lfc3dfdGNwX3Njc2lfdHJhbnNwb3J0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWlzY3NpX3RjcF9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNjc2lfc3dfdGNwX2V4aXQodm9pZCkKIHsKLQlpc2NzaV91bnJlZ2lzdGVyX3RyYW5zcG9ydCgmaXNjc2lfdGNwX3RyYW5zcG9ydCk7CisJaXNjc2lfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJmlzY3NpX3N3X3RjcF90cmFuc3BvcnQpOwogfQogCi1tb2R1bGVfaW5pdChpc2NzaV90Y3BfaW5pdCk7Ci1tb2R1bGVfZXhpdChpc2NzaV90Y3BfZXhpdCk7Cittb2R1bGVfaW5pdChpc2NzaV9zd190Y3BfaW5pdCk7Cittb2R1bGVfZXhpdChpc2NzaV9zd190Y3BfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmggYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmgKaW5kZXggNDk4ZDhjYS4uY2E2YjdiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5oCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuaApAQCAtMTksNjcgKzE5LDI3IEBACiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2lmbmRlZiBJU0NTSV9UQ1BfSAotI2RlZmluZSBJU0NTSV9UQ1BfSAorI2lmbmRlZiBJU0NTSV9TV19UQ1BfSAorI2RlZmluZSBJU0NTSV9TV19UQ1BfSAogCiAjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvbGliaXNjc2lfdGNwLmg+CiAKLXN0cnVjdCBjcnlwdG9faGFzaDsKIHN0cnVjdCBzb2NrZXQ7CiBzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm47Ci1zdHJ1Y3QgaXNjc2lfc2VnbWVudDsKLQotdHlwZWRlZiBpbnQgaXNjc2lfc2VnbWVudF9kb25lX2ZuX3Qoc3RydWN0IGlzY3NpX3RjcF9jb25uICosCi0JCQkJICAgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICopOwotCi1zdHJ1Y3QgaXNjc2lfc2VnbWVudCB7Ci0JdW5zaWduZWQgY2hhcgkJKmRhdGE7Ci0JdW5zaWduZWQgaW50CQlzaXplOwotCXVuc2lnbmVkIGludAkJY29waWVkOwotCXVuc2lnbmVkIGludAkJdG90YWxfc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCXRvdGFsX2NvcGllZDsKLQotCXN0cnVjdCBoYXNoX2Rlc2MJKmhhc2g7Ci0JdW5zaWduZWQgY2hhcgkJcmVjdl9kaWdlc3RbSVNDU0lfRElHRVNUX1NJWkVdOwotCXVuc2lnbmVkIGNoYXIJCWRpZ2VzdFtJU0NTSV9ESUdFU1RfU0laRV07Ci0JdW5zaWduZWQgaW50CQlkaWdlc3RfbGVuOwotCi0Jc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKLQl2b2lkCQkJKnNnX21hcHBlZDsKLQl1bnNpZ25lZCBpbnQJCXNnX29mZnNldDsKLQotCWlzY3NpX3NlZ21lbnRfZG9uZV9mbl90CSpkb25lOwotfTsKLQotLyogU29ja2V0IGNvbm5lY3Rpb24gcmVjaWV2ZSBoZWxwZXIgKi8KLXN0cnVjdCBpc2NzaV90Y3BfcmVjdiB7Ci0Jc3RydWN0IGlzY3NpX2hkcgkqaGRyOwotCXN0cnVjdCBpc2NzaV9zZWdtZW50CXNlZ21lbnQ7Ci0KLQkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEJIUyArIEFIUyAqLwotCXVpbnQzMl90CQloZHJfYnVmWzY0XTsKLQotCS8qIGNvcGllZCBhbmQgZmxpcHBlZCB2YWx1ZXMgKi8KLQlpbnQJCQlkYXRhbGVuOwotfTsKIAogLyogU29ja2V0IGNvbm5lY3Rpb24gc2VuZCBoZWxwZXIgKi8KLXN0cnVjdCBpc2NzaV90Y3Bfc2VuZCB7CitzdHJ1Y3QgaXNjc2lfc3dfdGNwX3NlbmQgewogCXN0cnVjdCBpc2NzaV9oZHIJKmhkcjsKIAlzdHJ1Y3QgaXNjc2lfc2VnbWVudAlzZWdtZW50OwogCXN0cnVjdCBpc2NzaV9zZWdtZW50CWRhdGFfc2VnbWVudDsKIH07CiAKLXN0cnVjdCBpc2NzaV90Y3BfY29ubiB7CitzdHJ1Y3QgaXNjc2lfc3dfdGNwX2Nvbm4gewogCXN0cnVjdCBpc2NzaV9jb25uCSppc2NzaV9jb25uOwogCXN0cnVjdCBzb2NrZXQJCSpzb2NrOwotCWludAkJCXN0b3Bfc3RhZ2U7CS8qIGNvbm5fc3RvcCgpIGZsYWc6ICoKLQkJCQkJCSAqIHN0b3AgdG8gcmVjb3ZlciwgICoKLQkJCQkJCSAqIHN0b3AgdG8gdGVybWluYXRlICovCi0JLyogY29udHJvbCBkYXRhICovCi0Jc3RydWN0IGlzY3NpX3RjcF9yZWN2CWluOwkJLyogVENQIHJlY2VpdmUgY29udGV4dCAqLwotCXN0cnVjdCBpc2NzaV90Y3Bfc2VuZAlvdXQ7CQkvKiBUQ1Agc2VuZCBjb250ZXh0ICovCiAKKwlzdHJ1Y3QgaXNjc2lfc3dfdGNwX3NlbmQgb3V0OwogCS8qIG9sZCB2YWx1ZXMgZm9yIHNvY2tldCBjYWxsYmFja3MgKi8KIAl2b2lkCQkJKCpvbGRfZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKiwgaW50KTsKIAl2b2lkCQkJKCpvbGRfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqKTsKQEAgLTkzLDQxICs1MywxMyBAQAogCXVpbnQzMl90CQlzZW5kcGFnZV9mYWlsdXJlc19jbnQ7CiAJdWludDMyX3QJCWRpc2NvbnRpZ3VvdXNfaGRyX2NudDsKIAotCWludAkJCWVycm9yOwotCiAJc3NpemVfdCAoKnNlbmRwYWdlKShzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBpbnQpOwogfTsKIAotc3RydWN0IGlzY3NpX2RhdGFfdGFzayB7Ci0Jc3RydWN0IGlzY3NpX2RhdGEJaGRyOwkJCS8qIFBEVSAqLwotCWNoYXIJCQloZHJleHRbSVNDU0lfRElHRVNUX1NJWkVdOy8qIEhlYWRlci1EaWdlc3QgKi8KLX07Ci0KLXN0cnVjdCBpc2NzaV9yMnRfaW5mbyB7Ci0JX19iZTMyCQkJdHR0OwkJLyogY29waWVkIGZyb20gUjJUICovCi0JX19iZTMyCQkJZXhwX3N0YXRzbjsJLyogY29waWVkIGZyb20gUjJUICovCi0JdWludDMyX3QJCWRhdGFfbGVuZ3RoOwkvKiBjb3BpZWQgZnJvbSBSMlQgKi8KLQl1aW50MzJfdAkJZGF0YV9vZmZzZXQ7CS8qIGNvcGllZCBmcm9tIFIyVCAqLwotCWludAkJCXNlbnQ7CQkvKiBSMlQgc2VxdWVuY2UgcHJvZ3Jlc3MgKi8KLQlpbnQJCQlkYXRhX2NvdW50OwkvKiBEQVRBLU91dCBwYXlsb2FkIHByb2dyZXNzICovCi0JaW50CQkJc29saWNpdF9kYXRhc247Ci0Jc3RydWN0IGlzY3NpX2RhdGFfdGFzawlkdGFzazsJCS8qIERhdGEtT3V0IGhlYWRlciBidWYgKi8KLX07Ci0KLXN0cnVjdCBpc2NzaV90Y3BfdGFzayB7Ci0Jc3RydWN0IGlzY3NpX2hkcl9idWZmIHsKLQkJc3RydWN0IGlzY3NpX2NtZAljbWRfaGRyOwotCQljaGFyCQkJaGRyZXh0YnVmW0lTQ1NJX01BWF9BSFNfU0laRSArCitzdHJ1Y3QgaXNjc2lfc3dfdGNwX2hkcmJ1ZiB7CisJc3RydWN0IGlzY3NpX2hkcgloZHJidWY7CisJY2hhcgkJCWhkcmV4dGJ1ZltJU0NTSV9NQVhfQUhTX1NJWkUgKwogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNDU0lfRElHRVNUX1NJWkVdOwotCX0gaGRyOwotCi0JaW50CQkJc2VudDsKLQl1aW50MzJfdAkJZXhwX2RhdGFzbjsJLyogZXhwZWN0ZWQgdGFyZ2V0J3MgUjJUU04vRGF0YVNOICovCi0JaW50CQkJZGF0YV9vZmZzZXQ7Ci0Jc3RydWN0IGlzY3NpX3IydF9pbmZvCSpyMnQ7CQkvKiBpbiBwcm9ncmVzcyBSMlQgICAgKi8KLQlzdHJ1Y3QgaXNjc2lfcG9vbAlyMnRwb29sOwotCXN0cnVjdCBrZmlmbwkJKnIydHF1ZXVlOwotCXN0cnVjdCBpc2NzaV9kYXRhX3Rhc2sJdW5zb2xfZHRhc2s7CS8qIERhdGEtT3V0IGhlYWRlciBidWYgKi8KIH07CiAKLSNlbmRpZiAvKiBJU0NTSV9IICovCisjZW5kaWYgLyogSVNDU0lfU1dfVENQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9saWJmYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWY5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMgJElkOiBNYWtlZmlsZQorCitvYmotJChDT05GSUdfTElCRkMpICs9IGxpYmZjLm8KKworbGliZmMtb2JqcyA6PSBcCisJZmNfZGlzYy5vIFwKKwlmY19leGNoLm8gXAorCWZjX2Vsc2N0Lm8gXAorCWZjX2ZyYW1lLm8gXAorCWZjX2xwb3J0Lm8gXAorCWZjX3Jwb3J0Lm8gXAorCWZjX2ZjcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE1NjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYwpAQCAtMCwwICsxLDg0NSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYXQgd3d3Lk9wZW4tRkNvRS5vcmcKKyAqLworCisvKgorICogVGFyZ2V0IERpc2NvdmVyeQorICoKKyAqIFRoaXMgYmxvY2sgZGlzY292ZXJzIGFsbCBGQy00IHJlbW90ZSBwb3J0cywgaW5jbHVkaW5nIEZDUCBpbml0aWF0b3JzLiBJdAorICogYWxzbyBoYW5kbGVzIFJTQ04gZXZlbnRzIGFuZCByZS1kaXNjb3ZlcnkgaWYgbmVjZXNzYXJ5LgorICovCisKKy8qCisgKiBESVNDIExPQ0tJTkcKKyAqCisgKiBUaGUgZGlzYyBtdXRleCBpcyBjYW4gYmUgbG9ja2VkIHdoZW4gYWNxdWlyaW5nIHJwb3J0IGxvY2tzLCBidXQgbWF5IG5vdAorICogYmUgaGVsZCB3aGVuIGFjcXVpcmluZyB0aGUgbHBvcnQgbG9jay4gUmVmZXIgdG8gZmNfbHBvcnQuYyBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2dzLmg+CisKKyNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CisKKyNkZWZpbmUgRkNfRElTQ19SRVRSWV9MSU1JVAkzCS8qIG1heCByZXRyaWVzICovCisjZGVmaW5lIEZDX0RJU0NfUkVUUllfREVMQVkJNTAwVUwJLyogKG1zZWNzKSBkZWxheSAqLworCisjZGVmaW5lCUZDX0RJU0NfREVMQVkJCTMKKworc3RhdGljIGludCBmY19kaXNjX2RlYnVnOworCisjZGVmaW5lIEZDX0RFQlVHX0RJU0MoZm10Li4uKQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChmY19kaXNjX2RlYnVnKQkJXAorCQkJRkNfREJHKGZtdCk7CQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZmNfZGlzY19ncG5fZnRfcmVxKHN0cnVjdCBmY19kaXNjICopOworc3RhdGljIHZvaWQgZmNfZGlzY19ncG5fZnRfcmVzcChzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLCB2b2lkICopOworc3RhdGljIGludCBmY19kaXNjX25ld190YXJnZXQoc3RydWN0IGZjX2Rpc2MgKiwgc3RydWN0IGZjX3Jwb3J0ICosCisJCQkgICAgICBzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgKik7CitzdGF0aWMgdm9pZCBmY19kaXNjX2RlbF90YXJnZXQoc3RydWN0IGZjX2Rpc2MgKiwgc3RydWN0IGZjX3Jwb3J0ICopOworc3RhdGljIHZvaWQgZmNfZGlzY19kb25lKHN0cnVjdCBmY19kaXNjICopOworc3RhdGljIHZvaWQgZmNfZGlzY190aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGZjX2Rpc2Nfc2luZ2xlKHN0cnVjdCBmY19kaXNjICosIHN0cnVjdCBmY19kaXNjX3BvcnQgKik7CitzdGF0aWMgdm9pZCBmY19kaXNjX3Jlc3RhcnQoc3RydWN0IGZjX2Rpc2MgKik7CisKKy8qKgorICogZmNfZGlzY19sb29rdXBfcnBvcnQgLSBsb29rdXAgYSByZW1vdGUgcG9ydCBieSBwb3J0X2lkCisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgaG9zdCBwb3J0IGluc3RhbmNlCisgKiBAcG9ydF9pZDogcmVtb3RlIHBvcnQgcG9ydF9pZCB0byBtYXRjaAorICovCitzdHJ1Y3QgZmNfcnBvcnQgKmZjX2Rpc2NfbG9va3VwX3Jwb3J0KGNvbnN0IHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgICAgdTMyIHBvcnRfaWQpCit7CisJY29uc3Qgc3RydWN0IGZjX2Rpc2MgKmRpc2MgPSAmbHBvcnQtPmRpc2M7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGE7CisJaW50IGRpc2NfZm91bmQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGF0YSwgJmRpc2MtPnJwb3J0cywgcGVlcnMpIHsKKwkJcnBvcnQgPSBQUklWX1RPX1JQT1JUKHJkYXRhKTsKKwkJaWYgKHJwb3J0LT5wb3J0X2lkID09IHBvcnRfaWQpIHsKKwkJCWRpc2NfZm91bmQgPSAxOworCQkJZm91bmQgPSBycG9ydDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFkaXNjX2ZvdW5kKQorCQlmb3VuZCA9IE5VTEw7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qKgorICogZmNfZGlzY19zdG9wX3Jwb3J0cyAtIGRlbGV0ZSBhbGwgdGhlIHJlbW90ZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGxwb3J0CisgKiBAZGlzYzogVGhlIGRpc2NvdmVyeSBqb2IgdG8gc3RvcCBycG9ydHMgb24KKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBscG9ydCBtdXRleCBpcyBsb2NrZWQgYmVmb3JlCisgKiBjYWxsaW5nIGl0LgorICovCit2b2lkIGZjX2Rpc2Nfc3RvcF9ycG9ydHMoc3RydWN0IGZjX2Rpc2MgKmRpc2MpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSwgKm5leHQ7CisKKwlscG9ydCA9IGRpc2MtPmxwb3J0OworCisJbXV0ZXhfbG9jaygmZGlzYy0+ZGlzY19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJkYXRhLCBuZXh0LCAmZGlzYy0+cnBvcnRzLCBwZWVycykgeworCQlycG9ydCA9IFBSSVZfVE9fUlBPUlQocmRhdGEpOworCQlsaXN0X2RlbCgmcmRhdGEtPnBlZXJzKTsKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihycG9ydCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKK30KKworLyoqCisgKiBmY19kaXNjX3Jwb3J0X2NhbGxiYWNrIC0gRXZlbnQgaGFuZGxlciBmb3IgcnBvcnQgZXZlbnRzCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB3aGljaCBpcyByZWNlaXZpbmcgdGhlIGV2ZW50CisgKiBAcnBvcnQ6IFRoZSBycG9ydCB3aGljaCB0aGUgZXZlbnQgaGFzIG9jY3VyZWQgb24KKyAqIEBldmVudDogVGhlIGV2ZW50IHRoYXQgb2NjdXJlZAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIHdoZW4gY2FsbGluZworICoJCSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19kaXNjX3Jwb3J0X2NhbGxiYWNrKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwKKwkJCQkgICBlbnVtIGZjX3Jwb3J0X2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCXN0cnVjdCBmY19kaXNjICpkaXNjID0gJmxwb3J0LT5kaXNjOworCWludCBmb3VuZCA9IDA7CisKKwlGQ19ERUJVR19ESVNDKCJSZWNlaXZlZCBhICVkIGV2ZW50IGZvciBwb3J0ICglNngpXG4iLCBldmVudCwKKwkJICAgICAgcnBvcnQtPnBvcnRfaWQpOworCisJaWYgKGV2ZW50ID09IFJQT1JUX0VWX0NSRUFURUQpIHsKKwkJaWYgKGRpc2MpIHsKKwkJCWZvdW5kID0gMTsKKwkJCW11dGV4X2xvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworCQkJbGlzdF9hZGRfdGFpbCgmcmRhdGEtPnBlZXJzLCAmZGlzYy0+cnBvcnRzKTsKKwkJCW11dGV4X3VubG9jaygmZGlzYy0+ZGlzY19tdXRleCk7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlGQ19ERUJVR19ESVNDKCJUaGUgcnBvcnQgKCU2eCkgaXMgbm90IG1haW50YWluZWQgIgorCQkJICAgICAgImJ5IHRoZSBkaXNjb3ZlcnkgbGF5ZXJcbiIsIHJwb3J0LT5wb3J0X2lkKTsKK30KKworLyoqCisgKiBmY19kaXNjX3JlY3ZfcnNjbl9yZXEgLSBIYW5kbGUgUmVnaXN0ZXJlZCBTdGF0ZSBDaGFuZ2UgTm90aWZpY2F0aW9uIChSU0NOKQorICogQHNwOiBDdXJyZW50IHNlcXVlbmNlIG9mIHRoZSBSU0NOIGV4Y2hhbmdlCisgKiBAZnA6IFJTQ04gRnJhbWUKKyAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBkaXNjX211dGV4IGlzIGxvY2tlZAorICoJCSBiZWZvcmUgaXQgaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBmY19kaXNjX3JlY3ZfcnNjbl9yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJICBzdHJ1Y3QgZmNfZGlzYyAqZGlzYykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhOworCXN0cnVjdCBmY19lbHNfcnNjbiAqcnA7CisJc3RydWN0IGZjX2Vsc19yc2NuX3BhZ2UgKnBwOworCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgcmVkaXNjID0gMDsKKwllbnVtIGZjX2Vsc19yc2NuX2V2X3F1YWwgZXZfcXVhbDsKKwllbnVtIGZjX2Vsc19yc2NuX2FkZHJfZm10IGZtdDsKKwlMSVNUX0hFQUQoZGlzY19wb3J0cyk7CisJc3RydWN0IGZjX2Rpc2NfcG9ydCAqZHAsICpuZXh0OworCisJbHBvcnQgPSBkaXNjLT5scG9ydDsKKworCUZDX0RFQlVHX0RJU0MoIlJlY2VpdmVkIGFuIFJTQ04gZXZlbnQgb24gcG9ydCAoJTZ4KVxuIiwKKwkJICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGZyYW1lIGNvbnRhaW5zIGFuIFJTQ04gbWVzc2FnZSAqLworCXJwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcnApKTsKKwlpZiAoIXJwKQorCQlnb3RvIHJlamVjdDsKKwkvKiBtYWtlIHN1cmUgdGhlIHBhZ2UgbGVuZ3RoIGlzIGFzIGV4cGVjdGVkICg0IGJ5dGVzKSAqLworCWlmIChycC0+cnNjbl9wYWdlX2xlbiAhPSBzaXplb2YoKnBwKSkKKwkJZ290byByZWplY3Q7CisJLyogZ2V0IHRoZSBSU0NOIHBheWxvYWQgbGVuZ3RoICovCisJbGVuID0gbnRvaHMocnAtPnJzY25fcGxlbik7CisJaWYgKGxlbiA8IHNpemVvZigqcnApKQorCQlnb3RvIHJlamVjdDsKKwkvKiBtYWtlIHN1cmUgdGhlIGZyYW1lIGNvbnRhaW5zIHRoZSBleHBlY3RlZCBwYXlsb2FkICovCisJcnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKKwlpZiAoIXJwKQorCQlnb3RvIHJlamVjdDsKKwkvKiBwYXlsb2FkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgUlNDTiBwYWdlIHNpemUgKi8KKwlsZW4gLT0gc2l6ZW9mKCpycCk7CisJaWYgKGxlbiAlIHNpemVvZigqcHApKQorCQlnb3RvIHJlamVjdDsKKworCWZvciAocHAgPSAodm9pZCAqKShycCArIDEpOyBsZW4gPiAwOyBsZW4gLT0gc2l6ZW9mKCpwcCksIHBwKyspIHsKKwkJZXZfcXVhbCA9IHBwLT5yc2NuX3BhZ2VfZmxhZ3MgPj4gRUxTX1JTQ05fRVZfUVVBTF9CSVQ7CisJCWV2X3F1YWwgJj0gRUxTX1JTQ05fRVZfUVVBTF9NQVNLOworCQlmbXQgPSBwcC0+cnNjbl9wYWdlX2ZsYWdzID4+IEVMU19SU0NOX0FERFJfRk1UX0JJVDsKKwkJZm10ICY9IEVMU19SU0NOX0FERFJfRk1UX01BU0s7CisJCS8qCisJCSAqIGlmIHdlIGdldCBhbiBhZGRyZXNzIGZvcm1hdCBvdGhlciB0aGFuIHBvcnQKKwkJICogKGFyZWEsIGRvbWFpbiwgZmFicmljKSwgdGhlbiBkbyBhIGZ1bGwgZGlzY292ZXJ5CisJCSAqLworCQlzd2l0Y2ggKGZtdCkgeworCQljYXNlIEVMU19BRERSX0ZNVF9QT1JUOgorCQkJRkNfREVCVUdfRElTQygiUG9ydCBhZGRyZXNzIGZvcm1hdCBmb3IgcG9ydCAoJTZ4KVxuIiwKKwkJCQkgICAgICBudG9oMjQocHAtPnJzY25fZmlkKSk7CisJCQlkcCA9IGt6YWxsb2Moc2l6ZW9mKCpkcCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFkcCkgeworCQkJCXJlZGlzYyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcC0+bHAgPSBscG9ydDsKKwkJCWRwLT5pZHMucG9ydF9pZCA9IG50b2gyNChwcC0+cnNjbl9maWQpOworCQkJZHAtPmlkcy5wb3J0X25hbWUgPSAtMTsKKwkJCWRwLT5pZHMubm9kZV9uYW1lID0gLTE7CisJCQlkcC0+aWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOworCQkJbGlzdF9hZGRfdGFpbCgmZHAtPnBlZXJzLCAmZGlzY19wb3J0cyk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfQUREUl9GTVRfQVJFQToKKwkJY2FzZSBFTFNfQUREUl9GTVRfRE9NOgorCQljYXNlIEVMU19BRERSX0ZNVF9GQUI6CisJCWRlZmF1bHQ6CisJCQlGQ19ERUJVR19ESVNDKCJBZGRyZXNzIGZvcm1hdCBpcyAoJWQpXG4iLCBmbXQpOworCQkJcmVkaXNjID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfQUNDLCBOVUxMKTsKKwlpZiAocmVkaXNjKSB7CisJCUZDX0RFQlVHX0RJU0MoIlJTQ04gcmVjZWl2ZWQ6IHJlZGlzY292ZXJpbmdcbiIpOworCQlmY19kaXNjX3Jlc3RhcnQoZGlzYyk7CisJfSBlbHNlIHsKKwkJRkNfREVCVUdfRElTQygiUlNDTiByZWNlaXZlZDogbm90IHJlZGlzY292ZXJpbmcuICIKKwkJCSAgICAgICJyZWRpc2MgJWQgc3RhdGUgJWQgaW5fcHJvZyAlZFxuIiwKKwkJCSAgICAgIHJlZGlzYywgbHBvcnQtPnN0YXRlLCBkaXNjLT5wZW5kaW5nKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRwLCBuZXh0LCAmZGlzY19wb3J0cywgcGVlcnMpIHsKKwkJCWxpc3RfZGVsKCZkcC0+cGVlcnMpOworCQkJcnBvcnQgPSBscG9ydC0+dHQucnBvcnRfbG9va3VwKGxwb3J0LCBkcC0+aWRzLnBvcnRfaWQpOworCQkJaWYgKHJwb3J0KSB7CisJCQkJcmRhdGEgPSBSUE9SVF9UT19QUklWKHJwb3J0KTsKKwkJCQlsaXN0X2RlbCgmcmRhdGEtPnBlZXJzKTsKKwkJCQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKHJwb3J0KTsKKwkJCX0KKwkJCWZjX2Rpc2Nfc2luZ2xlKGRpc2MsIGRwKTsKKwkJfQorCX0KKwlmY19mcmFtZV9mcmVlKGZwKTsKKwlyZXR1cm47CityZWplY3Q6CisJRkNfREVCVUdfRElTQygiUmVjZWl2ZWQgYSBiYWQgUlNDTiBmcmFtZVxuIik7CisJcmp0X2RhdGEuZnAgPSBOVUxMOworCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfTE9HSUM7CisJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChzcCwgRUxTX0xTX1JKVCwgJnJqdF9kYXRhKTsKKwlmY19mcmFtZV9mcmVlKGZwKTsKK30KKworLyoqCisgKiBmY19kaXNjX3JlY3ZfcmVxIC0gSGFuZGxlIGluY29taW5nIHJlcXVlc3RzCisgKiBAc3A6IEN1cnJlbnQgc2VxdWVuY2Ugb2YgdGhlIHJlcXVlc3QgZXhjaGFuZ2UKKyAqIEBmcDogVGhlIGZyYW1lCisgKiBAbHBvcnQ6IFRoZSBGQyBsb2NhbCBwb3J0CisgKgorICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBFTSBhbmQgd2lsbCBsb2NrCisgKgkJIHRoZSBkaXNjX211dGV4IGJlZm9yZSBjYWxsaW5nIHRoZSBoYW5kbGVyIGZvciB0aGUKKyAqCQkgcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQgZmNfZGlzY19yZWN2X3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwl1OCBvcDsKKwlzdHJ1Y3QgZmNfZGlzYyAqZGlzYyA9ICZscG9ydC0+ZGlzYzsKKworCW9wID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CisJc3dpdGNoIChvcCkgeworCWNhc2UgRUxTX1JTQ046CisJCW11dGV4X2xvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworCQlmY19kaXNjX3JlY3ZfcnNjbl9yZXEoc3AsIGZwLCBkaXNjKTsKKwkJbXV0ZXhfdW5sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRkNfREJHKCJSZWNlaXZlZCBhbiB1bnN1cHBvcnRlZCByZXF1ZXN0LiBvcGNvZGUgKCV4KVxuIiwgb3ApOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmNfZGlzY19yZXN0YXJ0IC0gUmVzdGFydCBkaXNjb3ZlcnkKKyAqIEBscG9ydDogRkMgZGlzY292ZXJ5IGNvbnRleHQKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBkaXNjIG11dGV4CisgKgkJIGlzIGFscmVhZHkgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCBmY19kaXNjX3Jlc3RhcnQoc3RydWN0IGZjX2Rpc2MgKmRpc2MpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEsICpuZXh0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBkaXNjLT5scG9ydDsKKworCUZDX0RFQlVHX0RJU0MoIlJlc3RhcnRpbmcgZGlzY292ZXJ5IGZvciBwb3J0ICglNngpXG4iLAorCQkgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZGF0YSwgbmV4dCwgJmRpc2MtPnJwb3J0cywgcGVlcnMpIHsKKwkJcnBvcnQgPSBQUklWX1RPX1JQT1JUKHJkYXRhKTsKKwkJRkNfREVCVUdfRElTQygibGlzdF9kZWwoJTZ4KVxuIiwgcnBvcnQtPnBvcnRfaWQpOworCQlsaXN0X2RlbCgmcmRhdGEtPnBlZXJzKTsKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihycG9ydCk7CisJfQorCisJZGlzYy0+cmVxdWVzdGVkID0gMTsKKwlpZiAoIWRpc2MtPnBlbmRpbmcpCisJCWZjX2Rpc2NfZ3BuX2Z0X3JlcShkaXNjKTsKK30KKworLyoqCisgKiBmY19kaXNjX3N0YXJ0IC0gRmlicmUgQ2hhbm5lbCBUYXJnZXQgZGlzY292ZXJ5CisgKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGRpc2NvdmVyeSBjYW5ub3QgYmUgc3RhcnRlZC4KKyAqLworc3RhdGljIHZvaWQgZmNfZGlzY19zdGFydCh2b2lkICgqZGlzY19jYWxsYmFjaykoc3RydWN0IGZjX2xwb3J0ICosCisJCQkJCQllbnVtIGZjX2Rpc2NfZXZlbnQpLAorCQkJICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIGlkczsKKwlzdHJ1Y3QgZmNfZGlzYyAqZGlzYyA9ICZscG9ydC0+ZGlzYzsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBtYXkgaGF2ZSBhIG5ldyBkaXNjIGpvYiBvciBhbiBleGlzdGluZworCSAqIG9uZS4gRWl0aGVyIHdheSwgbGV0J3MgbG9jayB3aGVuIHdlIG1ha2UgY2hhbmdlcyB0byBpdAorCSAqIGFuZCBzZW5kIHRoZSBHUE5fRlQgcmVxdWVzdC4KKwkgKi8KKwltdXRleF9sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKKworCWRpc2MtPmRpc2NfY2FsbGJhY2sgPSBkaXNjX2NhbGxiYWNrOworCisJLyoKKwkgKiBJZiBub3QgcmVhZHksIG9yIGFscmVhZHkgcnVubmluZyBkaXNjb3ZlcnksIGp1c3Qgc2V0IHJlcXVlc3QgZmxhZy4KKwkgKi8KKwlkaXNjLT5yZXF1ZXN0ZWQgPSAxOworCisJaWYgKGRpc2MtPnBlbmRpbmcpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkaXNjLT5kaXNjX211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSGFuZGxlIHBvaW50LXRvLXBvaW50IG1vZGUgYXMgYSBzaW1wbGUgZGlzY292ZXJ5CisJICogb2YgdGhlIHJlbW90ZSBwb3J0LiBZdWNreSwgeXVja3ksIHl1Y2ssIHl1Y2shCisJICovCisJcnBvcnQgPSBkaXNjLT5scG9ydC0+cHRwX3JwOworCWlmIChycG9ydCkgeworCQlpZHMucG9ydF9pZCA9IHJwb3J0LT5wb3J0X2lkOworCQlpZHMucG9ydF9uYW1lID0gcnBvcnQtPnBvcnRfbmFtZTsKKwkJaWRzLm5vZGVfbmFtZSA9IHJwb3J0LT5ub2RlX25hbWU7CisJCWlkcy5yb2xlcyA9IEZDX1JQT1JUX1JPTEVfVU5LTk9XTjsKKwkJZ2V0X2RldmljZSgmcnBvcnQtPmRldik7CisKKwkJaWYgKCFmY19kaXNjX25ld190YXJnZXQoZGlzYywgcnBvcnQsICZpZHMpKSB7CisJCQlkaXNjLT5ldmVudCA9IERJU0NfRVZfU1VDQ0VTUzsKKwkJCWZjX2Rpc2NfZG9uZShkaXNjKTsKKwkJfQorCQlwdXRfZGV2aWNlKCZycG9ydC0+ZGV2KTsKKwl9IGVsc2UgeworCQlmY19kaXNjX2dwbl9mdF9yZXEoZGlzYyk7CS8qIGdldCBwb3J0cyBieSBGQy00IHR5cGUgKi8KKwl9CisKKwltdXRleF91bmxvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IGZjX3Jwb3J0X29wZXJhdGlvbnMgZmNfZGlzY19ycG9ydF9vcHMgPSB7CisJLmV2ZW50X2NhbGxiYWNrID0gZmNfZGlzY19ycG9ydF9jYWxsYmFjaywKK307CisKKy8qKgorICogZmNfZGlzY19uZXdfdGFyZ2V0IC0gSGFuZGxlIG5ldyB0YXJnZXQgZm91bmQgYnkgZGlzY292ZXJ5CisgKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKKyAqIEBycG9ydDogVGhlIHByZXZpb3VzIEZDIHJlbW90ZSBwb3J0IChOVUxMIGlmIG5ldyByZW1vdGUgcG9ydCkKKyAqIEBpZHM6IElkZW50aWZpZXJzIGZvciB0aGUgbmV3IEZDIHJlbW90ZSBwb3J0CisgKgorICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCB0aGUgZGlzY19tdXRleCBpcyBsb2NrZWQKKyAqCQkgYmVmb3JlIGl0IGlzIGNhbGxlZC4KKyAqLworc3RhdGljIGludCBmY19kaXNjX25ld190YXJnZXQoc3RydWN0IGZjX2Rpc2MgKmRpc2MsCisJCQkgICAgICBzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LAorCQkJICAgICAgc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzICppZHMpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGRpc2MtPmxwb3J0OworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKHJwb3J0ICYmIGlkcy0+cG9ydF9uYW1lKSB7CisJCWlmIChycG9ydC0+cG9ydF9uYW1lID09IC0xKSB7CisJCQkvKgorCQkJICogU2V0IFdXTiBhbmQgZmFsbCB0aHJvdWdoIHRvIG5vdGlmeSBvZiBjcmVhdGUuCisJCQkgKi8KKwkJCWZjX3Jwb3J0X3NldF9uYW1lKHJwb3J0LCBpZHMtPnBvcnRfbmFtZSwKKwkJCQkJICBycG9ydC0+bm9kZV9uYW1lKTsKKwkJfSBlbHNlIGlmIChycG9ydC0+cG9ydF9uYW1lICE9IGlkcy0+cG9ydF9uYW1lKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBhIG5ldyBwb3J0IHdpdGggdGhlIHNhbWUgRkNJRCBhcworCQkJICogYSBwcmV2aW91c2x5LWRpc2NvdmVyZWQgcG9ydC4gIFByZXN1bWFibHkgdGhlIG9sZAorCQkJICogcG9ydCBsb2dnZWQgb3V0IGFuZCBhIG5ldyBwb3J0IGxvZ2dlZCBpbiBhbmQgd2FzCisJCQkgKiBhc3NpZ25lZCB0aGUgc2FtZSBGQ0lELiAgVGhpcyBzaG91bGQgYmUgcmFyZS4KKwkJCSAqIERlbGV0ZSB0aGUgb2xkIG9uZSBhbmQgZmFsbCB0aHJ1IHRvIHJlLWNyZWF0ZS4KKwkJCSAqLworCQkJZmNfZGlzY19kZWxfdGFyZ2V0KGRpc2MsIHJwb3J0KTsKKwkJCXJwb3J0ID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoKChpZHMtPnBvcnRfbmFtZSAhPSAtMSkgfHwgKGlkcy0+cG9ydF9pZCAhPSAtMSkpICYmCisJICAgIGlkcy0+cG9ydF9pZCAhPSBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpICYmCisJICAgIGlkcy0+cG9ydF9uYW1lICE9IGxwb3J0LT53d3BuKSB7CisJCWlmICghcnBvcnQpIHsKKwkJCXJwb3J0ID0gbHBvcnQtPnR0LnJwb3J0X2xvb2t1cChscG9ydCwgaWRzLT5wb3J0X2lkKTsKKwkJCWlmICghcnBvcnQpIHsKKwkJCQlzdHJ1Y3QgZmNfZGlzY19wb3J0IGRwOworCQkJCWRwLmxwID0gbHBvcnQ7CisJCQkJZHAuaWRzLnBvcnRfaWQgPSBpZHMtPnBvcnRfaWQ7CisJCQkJZHAuaWRzLnBvcnRfbmFtZSA9IGlkcy0+cG9ydF9uYW1lOworCQkJCWRwLmlkcy5ub2RlX25hbWUgPSBpZHMtPm5vZGVfbmFtZTsKKwkJCQlkcC5pZHMucm9sZXMgPSBpZHMtPnJvbGVzOworCQkJCXJwb3J0ID0gZmNfcnBvcnRfcm9ndWVfY3JlYXRlKCZkcCk7CisJCQl9CisJCQlpZiAoIXJwb3J0KQorCQkJCWVycm9yID0gLUVOT01FTTsKKwkJfQorCQlpZiAocnBvcnQpIHsKKwkJCXJwID0gcnBvcnQtPmRkX2RhdGE7CisJCQlycC0+b3BzID0gJmZjX2Rpc2NfcnBvcnRfb3BzOworCQkJcnAtPnJwX3N0YXRlID0gUlBPUlRfU1RfSU5JVDsKKwkJCWxwb3J0LT50dC5ycG9ydF9sb2dpbihycG9ydCk7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZjX2Rpc2NfZGVsX3RhcmdldCAtIERlbGV0ZSBhIHRhcmdldAorICogQGRpc2M6IEZDIGRpc2NvdmVyeSBjb250ZXh0CisgKiBAcnBvcnQ6IFRoZSByZW1vdGUgcG9ydCB0byBiZSByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfZGVsX3RhcmdldChzdHJ1Y3QgZmNfZGlzYyAqZGlzYywgc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZGlzYy0+bHBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gUlBPUlRfVE9fUFJJVihycG9ydCk7CisJbGlzdF9kZWwoJnJkYXRhLT5wZWVycyk7CisJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihycG9ydCk7Cit9CisKKy8qKgorICogZmNfZGlzY19kb25lIC0gRGlzY292ZXJ5IGhhcyBiZWVuIGNvbXBsZXRlZAorICogQGRpc2M6IEZDIGRpc2NvdmVyeSBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfZG9uZShzdHJ1Y3QgZmNfZGlzYyAqZGlzYykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gZGlzYy0+bHBvcnQ7CisKKwlGQ19ERUJVR19ESVNDKCJEaXNjb3ZlcnkgY29tcGxldGUgZm9yIHBvcnQgKCU2eClcbiIsCisJCSAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCisJZGlzYy0+ZGlzY19jYWxsYmFjayhscG9ydCwgZGlzYy0+ZXZlbnQpOworCWRpc2MtPmV2ZW50ID0gRElTQ19FVl9OT05FOworCisJaWYgKGRpc2MtPnJlcXVlc3RlZCkKKwkJZmNfZGlzY19ncG5fZnRfcmVxKGRpc2MpOworCWVsc2UKKwkJZGlzYy0+cGVuZGluZyA9IDA7Cit9CisKKy8qKgorICogZmNfZGlzY19lcnJvciAtIEhhbmRsZSBlcnJvciBvbiBkTlMgcmVxdWVzdAorICogQGRpc2M6IEZDIGRpc2NvdmVyeSBjb250ZXh0CisgKiBAZnA6IFRoZSBmcmFtZSBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfZXJyb3Ioc3RydWN0IGZjX2Rpc2MgKmRpc2MsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGRpc2MtPmxwb3J0OworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCWlmIChmY19kaXNjX2RlYnVnKQorCQlGQ19EQkcoIkVycm9yICVsZCwgcmV0cmllcyAlZC8lZFxuIiwKKwkJICAgICAgIFBUUl9FUlIoZnApLCBkaXNjLT5yZXRyeV9jb3VudCwKKwkJICAgICAgIEZDX0RJU0NfUkVUUllfTElNSVQpOworCisJaWYgKCFmcCB8fCBQVFJfRVJSKGZwKSA9PSAtRkNfRVhfVElNRU9VVCkgeworCQkvKgorCQkgKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCBvciB0aGUgZXhjaGFuZ2UgdGltZWQgb3V0LAorCQkgKiByZXRyeSBhZnRlciBkZWxheS4KKwkJICovCisJCWlmIChkaXNjLT5yZXRyeV9jb3VudCA8IEZDX0RJU0NfUkVUUllfTElNSVQpIHsKKwkJCS8qIGdvIGFoZWFkIGFuZCByZXRyeSAqLworCQkJaWYgKCFmcCkKKwkJCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoRkNfRElTQ19SRVRSWV9ERUxBWSk7CisJCQllbHNlIHsKKwkJCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMobHBvcnQtPmVfZF90b3YpOworCisJCQkJLyogdGltZW91dCBmYXN0ZXIgZmlyc3QgdGltZSAqLworCQkJCWlmICghZGlzYy0+cmV0cnlfY291bnQpCisJCQkJCWRlbGF5IC89IDQ7CisJCQl9CisJCQlkaXNjLT5yZXRyeV9jb3VudCsrOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkaXNjLT5kaXNjX3dvcmssIGRlbGF5KTsKKwkJfSBlbHNlIHsKKwkJCS8qIGV4Y2VlZGVkIHJldHJpZXMgKi8KKwkJCWRpc2MtPmV2ZW50ID0gRElTQ19FVl9GQUlMRUQ7CisJCQlmY19kaXNjX2RvbmUoZGlzYyk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZmNfZGlzY19ncG5fZnRfcmVxIC0gU2VuZCBHZXQgUG9ydCBOYW1lcyBieSBGQy00IHR5cGUgKEdQTl9GVCkgcmVxdWVzdAorICogQGxwb3J0OiBGQyBkaXNjb3ZlcnkgY29udGV4dAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGRpc2NfbXV0ZXggaXMgbG9ja2VkCisgKgkJIGJlZm9yZSBpdCBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfZ3BuX2Z0X3JlcShzdHJ1Y3QgZmNfZGlzYyAqZGlzYykKK3sKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBkaXNjLT5scG9ydDsKKworCVdBUk5fT04oIWZjX2xwb3J0X3Rlc3RfcmVhZHkobHBvcnQpKTsKKworCWRpc2MtPnBlbmRpbmcgPSAxOworCWRpc2MtPnJlcXVlc3RlZCA9IDA7CisKKwlkaXNjLT5idWZfbGVuID0gMDsKKwlkaXNjLT5zZXFfY291bnQgPSAwOworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBmY19jdF9oZHIpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGZjX25zX2dpZF9mdCkpOworCWlmICghZnApCisJCWdvdG8gZXJyOworCisJaWYgKGxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBOVUxMLCBmcCwKKwkJCQkgRkNfTlNfR1BOX0ZULAorCQkJCSBmY19kaXNjX2dwbl9mdF9yZXNwLAorCQkJCSBkaXNjLCBscG9ydC0+ZV9kX3RvdikpCisJCXJldHVybjsKK2VycjoKKwlmY19kaXNjX2Vycm9yKGRpc2MsIGZwKTsKK30KKworLyoqCisgKiBmY19kaXNjX2dwbl9mdF9wYXJzZSAtIFBhcnNlIHRoZSBsaXN0IG9mIElEcyBhbmQgbmFtZXMgcmVzdWx0aW5nIGZyb20gYSByZXF1ZXN0CisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgaG9zdCBwb3J0IGluc3RhbmNlCisgKiBAYnVmOiBHUE5fRlQgcmVzcG9uc2UgYnVmZmVyCisgKiBAbGVuOiBzaXplIG9mIHJlc3BvbnNlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGZjX2Rpc2NfZ3BuX2Z0X3BhcnNlKHN0cnVjdCBmY19kaXNjICpkaXNjLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgKm5wOworCWNoYXIgKmJwOworCXNpemVfdCBwbGVuOworCXNpemVfdCB0bGVuOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGZjX2Rpc2NfcG9ydCBkcDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YTsKKworCWxwb3J0ID0gZGlzYy0+bHBvcnQ7CisKKwkvKgorCSAqIEhhbmRsZSBwYXJ0aWFsIG5hbWUgcmVjb3JkIGxlZnQgb3ZlciBmcm9tIHByZXZpb3VzIGNhbGwuCisJICovCisJYnAgPSBidWY7CisJcGxlbiA9IGxlbjsKKwlucCA9IChzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgKilicDsKKwl0bGVuID0gZGlzYy0+YnVmX2xlbjsKKwlpZiAodGxlbikgeworCQlXQVJOX09OKHRsZW4gPj0gc2l6ZW9mKCpucCkpOworCQlwbGVuID0gc2l6ZW9mKCpucCkgLSB0bGVuOworCQlXQVJOX09OKHBsZW4gPD0gMCk7CisJCVdBUk5fT04ocGxlbiA+PSBzaXplb2YoKm5wKSk7CisJCWlmIChwbGVuID4gbGVuKQorCQkJcGxlbiA9IGxlbjsKKwkJbnAgPSAmZGlzYy0+cGFydGlhbF9idWY7CisJCW1lbWNweSgoY2hhciAqKW5wICsgdGxlbiwgYnAsIHBsZW4pOworCisJCS8qCisJCSAqIFNldCBicCBzbyB0aGF0IHRoZSBsb29wIGJlbG93IHdpbGwgYWR2YW5jZSBpdCB0byB0aGUKKwkJICogZmlyc3QgdmFsaWQgZnVsbCBuYW1lIGVsZW1lbnQuCisJCSAqLworCQlicCAtPSB0bGVuOworCQlsZW4gKz0gdGxlbjsKKwkJcGxlbiArPSB0bGVuOworCQlkaXNjLT5idWZfbGVuID0gKHVuc2lnbmVkIGNoYXIpIHBsZW47CisJCWlmIChwbGVuID09IHNpemVvZigqbnApKQorCQkJZGlzYy0+YnVmX2xlbiA9IDA7CisJfQorCisJLyoKKwkgKiBIYW5kbGUgZnVsbCBuYW1lIHJlY29yZHMsIGluY2x1ZGluZyB0aGUgb25lIGZpbGxlZCBmcm9tIGFib3ZlLgorCSAqIE5vcm1hbGx5LCBucCA9PSBicCBhbmQgcGxlbiA9PSBsZW4sIGJ1dCBmcm9tIHRoZSBwYXJ0aWFsIGNhc2UgYWJvdmUsCisJICogYnAsIGxlbiBkZXNjcmliZSB0aGUgb3ZlcmFsbCBidWZmZXIsIGFuZCBucCwgcGxlbiBkZXNjcmliZSB0aGUKKwkgKiBwYXJ0aWFsIGJ1ZmZlciwgd2hpY2ggaWYgd291bGQgdXN1YWxseSBiZSBmdWxsIG5vdy4KKwkgKiBBZnRlciB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wLCB0aGluZ3MgcmV0dXJuIHRvICJub3JtYWwiLgorCSAqLworCXdoaWxlIChwbGVuID49IHNpemVvZigqbnApKSB7CisJCWRwLmxwID0gbHBvcnQ7CisJCWRwLmlkcy5wb3J0X2lkID0gbnRvaDI0KG5wLT5mcF9maWQpOworCQlkcC5pZHMucG9ydF9uYW1lID0gbnRvaGxsKG5wLT5mcF93d3BuKTsKKwkJZHAuaWRzLm5vZGVfbmFtZSA9IC0xOworCQlkcC5pZHMucm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CisKKwkJaWYgKChkcC5pZHMucG9ydF9pZCAhPSBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKSAmJgorCQkgICAgKGRwLmlkcy5wb3J0X25hbWUgIT0gbHBvcnQtPnd3cG4pKSB7CisJCQlycG9ydCA9IGZjX3Jwb3J0X3JvZ3VlX2NyZWF0ZSgmZHApOworCQkJaWYgKHJwb3J0KSB7CisJCQkJcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwkJCQlyZGF0YS0+b3BzID0gJmZjX2Rpc2NfcnBvcnRfb3BzOworCQkJCXJkYXRhLT5sb2NhbF9wb3J0ID0gbHBvcnQ7CisJCQkJbHBvcnQtPnR0LnJwb3J0X2xvZ2luKHJwb3J0KTsKKwkJCX0gZWxzZQorCQkJCUZDX0RCRygiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJCSAgICAgICAidGhlIG5ld2x5IGRpc2NvdmVyZWQgcG9ydCAoJTZ4KVxuIiwKKwkJCQkgICAgICAgZHAuaWRzLnBvcnRfaWQpOworCQl9CisKKwkJaWYgKG5wLT5mcF9mbGFncyAmIEZDX05TX0ZJRF9MQVNUKSB7CisJCQlkaXNjLT5ldmVudCA9IERJU0NfRVZfU1VDQ0VTUzsKKwkJCWZjX2Rpc2NfZG9uZShkaXNjKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCQlsZW4gLT0gc2l6ZW9mKCpucCk7CisJCWJwICs9IHNpemVvZigqbnApOworCQlucCA9IChzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgKilicDsKKwkJcGxlbiA9IGxlbjsKKwl9CisKKwkvKgorCSAqIFNhdmUgYW55IHBhcnRpYWwgcmVjb3JkIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBmb3IgbmV4dCB0aW1lLgorCSAqLworCWlmIChlcnJvciA9PSAwICYmIGxlbiA+IDAgJiYgbGVuIDwgc2l6ZW9mKCpucCkpIHsKKwkJaWYgKG5wICE9ICZkaXNjLT5wYXJ0aWFsX2J1ZikgeworCQkJRkNfREVCVUdfRElTQygiUGFydGlhbCBidWZmZXIgcmVtYWlucyAiCisJCQkJICAgICAgImZvciBkaXNjb3ZlcnkgYnkgKCU2eClcbiIsCisJCQkJICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJCQltZW1jcHkoJmRpc2MtPnBhcnRpYWxfYnVmLCBucCwgbGVuKTsKKwkJfQorCQlkaXNjLT5idWZfbGVuID0gKHVuc2lnbmVkIGNoYXIpIGxlbjsKKwl9IGVsc2UgeworCQlkaXNjLT5idWZfbGVuID0gMDsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSGFuZGxlIHJldHJ5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZvciByZW1vdGUgcG9ydHMuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZjX2Rpc2MgKmRpc2MgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJICAgIHN0cnVjdCBmY19kaXNjLAorCQkJCQkgICAgZGlzY193b3JrLndvcmspOworCW11dGV4X2xvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworCWlmIChkaXNjLT5yZXF1ZXN0ZWQgJiYgIWRpc2MtPnBlbmRpbmcpCisJCWZjX2Rpc2NfZ3BuX2Z0X3JlcShkaXNjKTsKKwltdXRleF91bmxvY2soJmRpc2MtPmRpc2NfbXV0ZXgpOworfQorCisvKioKKyAqIGZjX2Rpc2NfZ3BuX2Z0X3Jlc3AgLSBIYW5kbGUgYSByZXNwb25zZSBmcmFtZSBmcm9tIEdldCBQb3J0IE5hbWVzIChHUE5fRlQpCisgKiBAc3A6IEN1cnJlbnQgc2VxdWVuY2Ugb2YgR1BOX0ZUIGV4Y2hhbmdlCisgKiBAZnA6IHJlc3BvbnNlIGZyYW1lCisgKiBAbHBfYXJnOiBGaWJyZSBDaGFubmVsIGhvc3QgcG9ydCBpbnN0YW5jZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGRpc2NfbXV0ZXggaXMgbG9ja2VkCisgKgkJIGJlZm9yZSBpdCBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2NfZ3BuX2Z0X3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJdm9pZCAqZGlzY19hcmcpCit7CisJc3RydWN0IGZjX2Rpc2MgKmRpc2MgPSBkaXNjX2FyZzsKKwlzdHJ1Y3QgZmNfY3RfaGRyICpjcDsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwl1bnNpZ25lZCBpbnQgc2VxX2NudDsKKwl2b2lkICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGVycm9yOworCisJRkNfREVCVUdfRElTQygiUmVjZWl2ZWQgYSBHUE5fRlQgcmVzcG9uc2Ugb24gcG9ydCAoJTZ4KVxuIiwKKwkJICAgICAgZmNfaG9zdF9wb3J0X2lkKGRpc2MtPmxwb3J0LT5ob3N0KSk7CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19kaXNjX2Vycm9yKGRpc2MsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCVdBUk5fT04oIWZjX2ZyYW1lX2lzX2xpbmVhcihmcCkpOwkvKiBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzICovCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlsZW4gPSBmcl9sZW4oZnApIC0gc2l6ZW9mKCpmaCk7CisJc2VxX2NudCA9IG50b2hzKGZoLT5maF9zZXFfY250KTsKKwlpZiAoZnJfc29mKGZwKSA9PSBGQ19TT0ZfSTMgJiYgc2VxX2NudCA9PSAwICYmCisJICAgIGRpc2MtPnNlcV9jb3VudCA9PSAwKSB7CisJCWNwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqY3ApKTsKKwkJaWYgKCFjcCkgeworCQkJRkNfREJHKCJHUE5fRlQgcmVzcG9uc2UgdG9vIHNob3J0LCBsZW4gJWRcbiIsCisJCQkgICAgICAgZnJfbGVuKGZwKSk7CisJCX0gZWxzZSBpZiAobnRvaHMoY3AtPmN0X2NtZCkgPT0gRkNfRlNfQUNDKSB7CisKKwkJCS8qCisJCQkgKiBBY2NlcHRlZC4gIFBhcnNlIHJlc3BvbnNlLgorCQkJICovCisJCQlidWYgPSBjcCArIDE7CisJCQlsZW4gLT0gc2l6ZW9mKCpjcCk7CisJCX0gZWxzZSBpZiAobnRvaHMoY3AtPmN0X2NtZCkgPT0gRkNfRlNfUkpUKSB7CisJCQlGQ19EQkcoIkdQTl9GVCByZWplY3RlZCByZWFzb24gJXggZXhwICV4ICIKKwkJCSAgICAgICAiKGNoZWNrIHpvbmluZylcbiIsIGNwLT5jdF9yZWFzb24sCisJCQkgICAgICAgY3AtPmN0X2V4cGxhbik7CisJCQlkaXNjLT5ldmVudCA9IERJU0NfRVZfRkFJTEVEOworCQkJZmNfZGlzY19kb25lKGRpc2MpOworCQl9IGVsc2UgeworCQkJRkNfREJHKCJHUE5fRlQgdW5leHBlY3RlZCByZXNwb25zZSBjb2RlICV4XG4iLAorCQkJICAgICAgIG50b2hzKGNwLT5jdF9jbWQpKTsKKwkJfQorCX0gZWxzZSBpZiAoZnJfc29mKGZwKSA9PSBGQ19TT0ZfTjMgJiYKKwkJICAgc2VxX2NudCA9PSBkaXNjLT5zZXFfY291bnQpIHsKKwkJYnVmID0gZmggKyAxOworCX0gZWxzZSB7CisJCUZDX0RCRygiR1BOX0ZUIHVuZXhwZWN0ZWQgZnJhbWUgLSBvdXQgb2Ygc2VxdWVuY2U/ICIKKwkJICAgICAgICJzZXFfY250ICV4IGV4cGVjdGVkICV4IHNvZiAleCBlb2YgJXhcbiIsCisJCSAgICAgICBzZXFfY250LCBkaXNjLT5zZXFfY291bnQsIGZyX3NvZihmcCksIGZyX2VvZihmcCkpOworCX0KKwlpZiAoYnVmKSB7CisJCWVycm9yID0gZmNfZGlzY19ncG5fZnRfcGFyc2UoZGlzYywgYnVmLCBsZW4pOworCQlpZiAoZXJyb3IpCisJCQlmY19kaXNjX2Vycm9yKGRpc2MsIGZwKTsKKwkJZWxzZQorCQkJZGlzYy0+c2VxX2NvdW50Kys7CisJfQorCWZjX2ZyYW1lX2ZyZWUoZnApOworfQorCisvKioKKyAqIGZjX2Rpc2Nfc2luZ2xlIC0gRGlzY292ZXIgdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgdGFyZ2V0CisgKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKKyAqIEBkcDogVGhlIHBvcnQgdG8gcmVkaXNjb3ZlcgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGRpc2NfbXV0ZXggaXMgbG9ja2VkCisgKgkJIGJlZm9yZSBpdCBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2Rpc2Nfc2luZ2xlKHN0cnVjdCBmY19kaXNjICpkaXNjLCBzdHJ1Y3QgZmNfZGlzY19wb3J0ICpkcCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0ICpuZXdfcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhOworCisJbHBvcnQgPSBkaXNjLT5scG9ydDsKKworCWlmIChkcC0+aWRzLnBvcnRfaWQgPT0gZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSkKKwkJZ290byBvdXQ7CisKKwlycG9ydCA9IGxwb3J0LT50dC5ycG9ydF9sb29rdXAobHBvcnQsIGRwLT5pZHMucG9ydF9pZCk7CisJaWYgKHJwb3J0KQorCQlmY19kaXNjX2RlbF90YXJnZXQoZGlzYywgcnBvcnQpOworCisJbmV3X3Jwb3J0ID0gZmNfcnBvcnRfcm9ndWVfY3JlYXRlKGRwKTsKKwlpZiAobmV3X3Jwb3J0KSB7CisJCXJkYXRhID0gbmV3X3Jwb3J0LT5kZF9kYXRhOworCQlyZGF0YS0+b3BzID0gJmZjX2Rpc2NfcnBvcnRfb3BzOworCQlrZnJlZShkcCk7CisJCWxwb3J0LT50dC5ycG9ydF9sb2dpbihuZXdfcnBvcnQpOworCX0KKwlyZXR1cm47CitvdXQ6CisJa2ZyZWUoZHApOworfQorCisvKioKKyAqIGZjX2Rpc2Nfc3RvcCAtIFN0b3AgZGlzY292ZXJ5IGZvciBhIGdpdmVuIGxwb3J0CisgKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IGRpc2NvdmVyeSBzaG91bGQgc3RvcCBmb3IKKyAqLwordm9pZCBmY19kaXNjX3N0b3Aoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgZmNfZGlzYyAqZGlzYyA9ICZscG9ydC0+ZGlzYzsKKworCWlmIChkaXNjKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGlzYy0+ZGlzY193b3JrKTsKKwkJZmNfZGlzY19zdG9wX3Jwb3J0cyhkaXNjKTsKKwl9Cit9CisKKy8qKgorICogZmNfZGlzY19zdG9wX2ZpbmFsIC0gU3RvcCBkaXNjb3ZlcnkgZm9yIGEgZ2l2ZW4gbHBvcnQKKyAqIEBscG9ydDogVGhlIGxwb3J0IHRoYXQgZGlzY292ZXJ5IHNob3VsZCBzdG9wIGZvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBkaXNjb3ZlcnkgaGFzIGJlZW4KKyAqIGNvbXBsZXRlbHkgc3RvcHBlZCBhbmQgYWxsIHJwb3J0cyBoYXZlIGJlZW4gZGVsZXRlZC4KKyAqLwordm9pZCBmY19kaXNjX3N0b3BfZmluYWwoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlmY19kaXNjX3N0b3AobHBvcnQpOworCWxwb3J0LT50dC5ycG9ydF9mbHVzaF9xdWV1ZSgpOworfQorCisvKioKKyAqIGZjX2Rpc2NfaW5pdCAtIEluaXRpYWxpemUgdGhlIGRpc2NvdmVyeSBibG9jaworICogQGxwb3J0OiBGQyBsb2NhbCBwb3J0CisgKi8KK2ludCBmY19kaXNjX2luaXQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgZmNfZGlzYyAqZGlzYzsKKworCWlmICghbHBvcnQtPnR0LmRpc2Nfc3RhcnQpCisJCWxwb3J0LT50dC5kaXNjX3N0YXJ0ID0gZmNfZGlzY19zdGFydDsKKworCWlmICghbHBvcnQtPnR0LmRpc2Nfc3RvcCkKKwkJbHBvcnQtPnR0LmRpc2Nfc3RvcCA9IGZjX2Rpc2Nfc3RvcDsKKworCWlmICghbHBvcnQtPnR0LmRpc2Nfc3RvcF9maW5hbCkKKwkJbHBvcnQtPnR0LmRpc2Nfc3RvcF9maW5hbCA9IGZjX2Rpc2Nfc3RvcF9maW5hbDsKKworCWlmICghbHBvcnQtPnR0LmRpc2NfcmVjdl9yZXEpCisJCWxwb3J0LT50dC5kaXNjX3JlY3ZfcmVxID0gZmNfZGlzY19yZWN2X3JlcTsKKworCWlmICghbHBvcnQtPnR0LnJwb3J0X2xvb2t1cCkKKwkJbHBvcnQtPnR0LnJwb3J0X2xvb2t1cCA9IGZjX2Rpc2NfbG9va3VwX3Jwb3J0OworCisJZGlzYyA9ICZscG9ydC0+ZGlzYzsKKwlJTklUX0RFTEFZRURfV09SSygmZGlzYy0+ZGlzY193b3JrLCBmY19kaXNjX3RpbWVvdXQpOworCW11dGV4X2luaXQoJmRpc2MtPmRpc2NfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZkaXNjLT5ycG9ydHMpOworCisJZGlzYy0+bHBvcnQgPSBscG9ydDsKKwlkaXNjLT5kZWxheSA9IEZDX0RJU0NfREVMQVk7CisJZGlzYy0+ZXZlbnQgPSBESVNDX0VWX05PTkU7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZGlzY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Vsc2N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0N2ZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19lbHNjdC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYXQgd3d3Lk9wZW4tRkNvRS5vcmcKKyAqLworCisvKgorICogUHJvdmlkZSBpbnRlcmZhY2UgdG8gc2VuZCBFTFMvQ1QgRkMgZnJhbWVzCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2dzLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19ucy5oPgorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZWxzLmg+CisjaW5jbHVkZSA8c2NzaS9saWJmYy5oPgorI2luY2x1ZGUgPHNjc2kvZmNfZW5jb2RlLmg+CisKKy8qCisgKiBmY19lbHNjdF9zZW5kIC0gc2VuZHMgRUxTL0NUIGZyYW1lCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19lbHNjdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgIHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsCisJCQkJICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJICAgIHVuc2lnbmVkIGludCBvcCwKKwkJCQkgICAgdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwKKwkJCQkJCSBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCQkJIHZvaWQgKmFyZyksCisJCQkJICAgIHZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpCit7CisJZW51bSBmY19yY3RsIHJfY3RsOworCXUzMiBkaWQ7CisJZW51bSBmY19maF90eXBlIGZoX3R5cGU7CisJaW50IHJjOworCisJLyogRUxTIHJlcXVlc3RzICovCisJaWYgKChvcCA+PSBFTFNfTFNfUkpUKSAmJiAob3AgPD0gRUxTX0FVVEhfRUxTKSkKKwkJcmMgPSBmY19lbHNfZmlsbChscG9ydCwgcnBvcnQsIGZwLCBvcCwgJnJfY3RsLCAmZGlkLCAmZmhfdHlwZSk7CisJZWxzZQorCQkvKiBDVCByZXF1ZXN0cyAqLworCQlyYyA9IGZjX2N0X2ZpbGwobHBvcnQsIGZwLCBvcCwgJnJfY3RsLCAmZGlkLCAmZmhfdHlwZSk7CisKKwlpZiAocmMpCisJCXJldHVybiBOVUxMOworCisJZmNfZmlsbF9mY19oZHIoZnAsIHJfY3RsLCBkaWQsIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIGZoX3R5cGUsCisJCSAgICAgICBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOworCisJcmV0dXJuIGxwb3J0LT50dC5leGNoX3NlcV9zZW5kKGxwb3J0LCBmcCwgcmVzcCwgTlVMTCwgYXJnLCB0aW1lcl9tc2VjKTsKK30KKworaW50IGZjX2Vsc2N0X2luaXQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKQorCQlscG9ydC0+dHQuZWxzY3Rfc2VuZCA9IGZjX2Vsc2N0X3NlbmQ7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZWxzY3RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRiMDhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwpAQCAtMCwwICsxLDE5NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwOCBNaWtlIENocmlzdGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworLyoKKyAqIEZpYnJlIENoYW5uZWwgZXhjaGFuZ2UgYW5kIHNlcXVlbmNlIGhhbmRsaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8c2NzaS9mYy9mY19mYzIuaD4KKworI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjX2VuY29kZS5oPgorCisjZGVmaW5lCSAgRkNfREVGX1JfQV9UT1YgICAgICAoMTAgKiAxMDAwKSAvKiByZXNvdXJjZSBhbGxvY2F0aW9uIHRpbWVvdXQgKi8KKworLyoKKyAqIGZjX2V4Y2hfZGVidWcgY2FuIGJlIHNldCBpbiBkZWJ1Z2dlciBvciBhdCBjb21waWxlIHRpbWUgdG8gZ2V0IG1vcmUgbG9ncy4KKyAqLworc3RhdGljIGludCBmY19leGNoX2RlYnVnOworCisjZGVmaW5lIEZDX0RFQlVHX0VYQ0goZm10Li4uKQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChmY19leGNoX2RlYnVnKQkJXAorCQkJRkNfREJHKGZtdCk7CQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmY19lbV9jYWNoZXA7CS8qIGNhY2hlIGZvciBleGNoYW5nZXMgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1hbmFnaW5nIEZpYnJlIENoYW5uZWwgRXhjaGFuZ2VzCisgKiBhbmQgU2VxdWVuY2VzLgorICoKKyAqIFRoZSB0aHJlZSBwcmltYXJ5IHN0cnVjdHVyZXMgdXNlZCBoZXJlIGFyZSBmY19leGNoX21nciwgZmNfZXhjaCwgYW5kIGZjX3NlcS4KKyAqCisgKiBmY19leGNoX21nciBob2xkcyB0aGUgZXhjaGFuZ2Ugc3RhdGUgZm9yIGFuIE4gcG9ydAorICoKKyAqIGZjX2V4Y2ggaG9sZHMgc3RhdGUgZm9yIG9uZSBleGNoYW5nZSBhbmQgbGlua3MgdG8gaXRzIGFjdGl2ZSBzZXF1ZW5jZS4KKyAqCisgKiBmY19zZXEgaG9sZHMgdGhlIHN0YXRlIGZvciBhbiBpbmRpdmlkdWFsIHNlcXVlbmNlLgorICovCisKKy8qCisgKiBFeGNoYW5nZSBtYW5hZ2VyLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBjZW50ZXIgZm9yIGNyZWF0aW5nIGV4Y2hhbmdlcyBhbmQgc2VxdWVuY2VzLgorICogSXQgbWFuYWdlcyB0aGUgYWxsb2NhdGlvbiBvZiBleGNoYW5nZSBJRHMuCisgKi8KK3N0cnVjdCBmY19leGNoX21nciB7CisJZW51bSBmY19jbGFzcwljbGFzczsJCS8qIGRlZmF1bHQgY2xhc3MgZm9yIHNlcXVlbmNlcyAqLworCXNwaW5sb2NrX3QJZW1fbG9jazsJLyogZXhjaGFuZ2UgbWFuYWdlciBsb2NrLAorCQkJCQkgICBtdXN0IGJlIHRha2VuIGJlZm9yZSBleF9sb2NrICovCisJdTE2CQlsYXN0X3hpZDsJLyogbGFzdCBhbGxvY2F0ZWQgZXhjaGFuZ2UgSUQgKi8KKwl1MTYJCW1pbl94aWQ7CS8qIG1pbiBleGNoYW5nZSBJRCAqLworCXUxNgkJbWF4X3hpZDsJLyogbWF4IGV4Y2hhbmdlIElEICovCisJdTE2CQltYXhfcmVhZDsJLyogbWF4IGV4Y2hhbmdlIElEIGZvciByZWFkICovCisJdTE2CQlsYXN0X3JlYWQ7CS8qIGxhc3QgeGlkIGFsbG9jYXRlZCBmb3IgcmVhZCAqLworCXUzMgl0b3RhbF9leGNoZXM7CQkvKiB0b3RhbCBhbGxvY2F0ZWQgZXhjaGFuZ2VzICovCisJc3RydWN0IGxpc3RfaGVhZAlleF9saXN0OwkvKiBhbGxvY2F0ZWQgZXhjaGFuZ2VzIGxpc3QgKi8KKwlzdHJ1Y3QgZmNfbHBvcnQJKmxwOwkJLyogZmMgZGV2aWNlIGluc3RhbmNlICovCisJbWVtcG9vbF90CSplcF9wb29sOwkvKiByZXNlcnZlIGVwJ3MgKi8KKworCS8qCisJICogY3VycmVudGx5IGV4Y2hhbmdlIG1nciBzdGF0cyBhcmUgdXBkYXRlZCBidXQgbm90IHVzZWQuCisJICogZWl0aGVyIHN0YXRzIGNhbiBiZSBleHBvc2UgdmlhIHN5c2ZzIG9yIHJlbW92ZSB0aGVtCisJICogYWxsIHRvZ2V0aGVyIGlmIG5vdCB1c2VkIFhYWAorCSAqLworCXN0cnVjdCB7CisJCWF0b21pY190IG5vX2ZyZWVfZXhjaDsKKwkJYXRvbWljX3Qgbm9fZnJlZV9leGNoX3hpZDsKKwkJYXRvbWljX3QgeGlkX25vdF9mb3VuZDsKKwkJYXRvbWljX3QgeGlkX2J1c3k7CisJCWF0b21pY190IHNlcV9ub3RfZm91bmQ7CisJCWF0b21pY190IG5vbl9ibHNfcmVzcDsKKwl9IHN0YXRzOworCXN0cnVjdCBmY19leGNoICoqZXhjaGVzOwkvKiBmb3IgZXhjaCBwb2ludGVycyBpbmRleGVkIGJ5IHhpZCAqLworfTsKKyNkZWZpbmUJZmNfc2VxX2V4Y2goc3ApIGNvbnRhaW5lcl9vZihzcCwgc3RydWN0IGZjX2V4Y2gsIHNlcSkKKworc3RhdGljIHZvaWQgZmNfZXhjaF9ycnEoc3RydWN0IGZjX2V4Y2ggKik7CitzdGF0aWMgdm9pZCBmY19zZXFfbHNfYWNjKHN0cnVjdCBmY19zZXEgKik7CitzdGF0aWMgdm9pZCBmY19zZXFfbHNfcmp0KHN0cnVjdCBmY19zZXEgKiwgZW51bSBmY19lbHNfcmp0X3JlYXNvbiwKKwkJCSAgZW51bSBmY19lbHNfcmp0X2V4cGxhbik7CitzdGF0aWMgdm9pZCBmY19leGNoX2Vsc19yZWMoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CitzdGF0aWMgdm9pZCBmY19leGNoX2Vsc19ycnEoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CitzdGF0aWMgc3RydWN0IGZjX3NlcSAqZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKHN0cnVjdCBmY19zZXEgKnNwKTsKKworLyoKKyAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG5vdGVzLgorICoKKyAqIFRoZSBleGNoYW5nZSBtYW5hZ2VyIGlzIG9uZSBieSBkZWZhdWx0IGluIGxpYmZjIGJ1dCBMTEQgbWF5IGNob29zZQorICogdG8gaGF2ZSBvbmUgcGVyIENQVS4gVGhlIHNlcXVlbmNlIG1hbmFnZXIgaXMgb25lIHBlciBleGNoYW5nZSBtYW5hZ2VyCisgKiBhbmQgY3VycmVudGx5IG5ldmVyIHNlcGFyYXRlZC4KKyAqCisgKiBTZWN0aW9uIDkuOCBpbiBGQy1GUy0yIHNwZWNpZmllczogICJUaGUgU0VRX0lEIGlzIGEgb25lLWJ5dGUgZmllbGQKKyAqIGFzc2lnbmVkIGJ5IHRoZSBTZXF1ZW5jZSBJbml0aWF0b3IgdGhhdCBzaGFsbCBiZSB1bmlxdWUgZm9yIGEgc3BlY2lmaWMKKyAqIERfSUQgYW5kIFNfSUQgcGFpciB3aGlsZSB0aGUgU2VxdWVuY2UgaXMgb3Blbi4iICAgTm90ZSB0aGF0IGl0IGlzbid0CisgKiBxdWFsaWZpZWQgYnkgZXhjaGFuZ2UgSUQsIHdoaWNoIG9uZSBtaWdodCB0aGluayBpdCB3b3VsZCBiZS4KKyAqIEluIHByYWN0aWNlIHRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2Ygb3BlbiBzZXF1ZW5jZXMgYW5kIGV4Y2hhbmdlcyB0byAyNTYKKyAqIHBlciBzZXNzaW9uLgkgRm9yIG1vc3QgdGFyZ2V0cyB3ZSBjb3VsZCB0cmVhdCB0aGlzIGxpbWl0IGFzIHBlciBleGNoYW5nZS4KKyAqCisgKiBUaGUgZXhjaGFuZ2UgYW5kIGl0cyBzZXF1ZW5jZSBhcmUgZnJlZWQgd2hlbiB0aGUgbGFzdCBzZXF1ZW5jZSBpcyByZWNlaXZlZC4KKyAqIEl0J3MgcG9zc2libGUgZm9yIHRoZSByZW1vdGUgcG9ydCB0byBsZWF2ZSBhbiBleGNoYW5nZSBvcGVuIHdpdGhvdXQKKyAqIHNlbmRpbmcgYW55IHNlcXVlbmNlcy4KKyAqCisgKiBOb3RlcyBvbiByZWZlcmVuY2UgY291bnRzOgorICoKKyAqIEV4Y2hhbmdlcyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIGV4Y2hhbmdlIGdldHMgZnJlZWQgd2hlbiB0aGUgcmVmZXJlbmNlCisgKiBjb3VudCBiZWNvbWVzIHplcm8uCisgKgorICogVGltZW91dHM6CisgKiBTZXF1ZW5jZXMgYXJlIHRpbWVkIG91dCBmb3IgRV9EX1RPViBhbmQgUl9BX1RPVi4KKyAqCisgKiBTZXF1ZW5jZSBldmVudCBoYW5kbGluZzoKKyAqCisgKiBUaGUgZm9sbG93aW5nIGV2ZW50cyBtYXkgb2NjdXIgb24gaW5pdGlhdG9yIHNlcXVlbmNlczoKKyAqCisgKglTZW5kLgorICoJICAgIEZvciBub3csIHRoZSB3aG9sZSB0aGluZyBpcyBzZW50LgorICoJUmVjZWl2ZSBBQ0sKKyAqCSAgICBUaGlzIGFwcGxpZXMgb25seSB0byBjbGFzcyBGLgorICoJICAgIFRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgY29tcGxldGUuCisgKglVTFAgY29tcGxldGlvbi4KKyAqCSAgICBUaGUgdXBwZXIgbGF5ZXIgY2FsbHMgZmNfZXhjaF9kb25lKCkgd2hlbiBkb25lCisgKgkgICAgd2l0aCBleGNoYW5nZSBhbmQgc2VxdWVuY2UgdHVwbGUuCisgKglSWC1pbmZlcnJlZCBjb21wbGV0aW9uLgorICoJICAgIFdoZW4gd2UgcmVjZWl2ZSB0aGUgbmV4dCBzZXF1ZW5jZSBvbiB0aGUgc2FtZSBleGNoYW5nZSwgd2UgY2FuCisgKgkgICAgcmV0aXJlIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBJRC4gIChYWFggbm90IGltcGxlbWVudGVkKS4KKyAqCVRpbWVvdXQuCisgKgkgICAgUl9BX1RPViBmcmVlcyB0aGUgc2VxdWVuY2UgSUQuICBJZiB3ZSdyZSB3YWl0aW5nIGZvciBBQ0ssCisgKgkgICAgRV9EX1RPViBjYXVzZXMgYWJvcnQgYW5kIGNhbGxzIHVwcGVyIGxheWVyIHJlc3BvbnNlIGhhbmRsZXIKKyAqCSAgICB3aXRoIEZDX0VYX1RJTUVPVVQgZXJyb3IuCisgKglSZWNlaXZlIFJKVAorICoJICAgIFhYWCBkZWZlci4KKyAqCVNlbmQgQUJUUworICoJICAgIE9uIHRpbWVvdXQuCisgKgorICogVGhlIGZvbGxvd2luZyBldmVudHMgbWF5IG9jY3VyIG9uIHJlY2lwaWVudCBzZXF1ZW5jZXM6CisgKgorICoJUmVjZWl2ZQorICoJICAgIEFsbG9jYXRlIHNlcXVlbmNlIGZvciBmaXJzdCBmcmFtZSByZWNlaXZlZC4KKyAqCSAgICBIb2xkIGR1cmluZyByZWNlaXZlIGhhbmRsZXIuCisgKgkgICAgUmVsZWFzZSB3aGVuIGZpbmFsIGZyYW1lIHJlY2VpdmVkLgorICoJICAgIEtlZXAgc3RhdHVzIG9mIGxhc3QgTiBvZiB0aGVzZSBmb3IgdGhlIEVMUyBSRVMgY29tbWFuZC4gIFhYWCBUQkQuCisgKglSZWNlaXZlIEFCVFMKKyAqCSAgICBEZWFsbG9jYXRlIHNlcXVlbmNlCisgKglTZW5kIFJKVAorICoJICAgIERlYWxsb2NhdGUKKyAqCisgKiBGb3Igbm93LCB3ZSBuZWdsZWN0IGNvbmRpdGlvbnMgd2hlcmUgb25seSBwYXJ0IG9mIGEgc2VxdWVuY2Ugd2FzCisgKiByZWNlaXZlZCBvciB0cmFuc21pdHRlZCwgb3Igd2hlcmUgb3V0LW9mLW9yZGVyIHJlY2VpcHQgaXMgZGV0ZWN0ZWQuCisgKi8KKworLyoKKyAqIExvY2tpbmcgbm90ZXM6CisgKgorICogVGhlIEVNIGNvZGUgcnVuIGluIGEgcGVyLUNQVSB3b3JrZXIgdGhyZWFkLgorICoKKyAqIFRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW5jeSBiZXR3ZWVuIGEgd29ya2VyIHRocmVhZCBjb2RlIGFuZCB0aW1lcnMsCisgKiBzZXF1ZW5jZSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gbXVzdCBiZSBsb2NrZWQuCisgKiAgLSBleGNoYW5nZSByZWZjbnQgY2FuIGJlIGRvbmUgYXRvbWljbHkgd2l0aG91dCBsb2Nrcy4KKyAqICAtIHNlcXVlbmNlIGFsbG9jYXRpb24gbXVzdCBiZSBsb2NrZWQgYnkgZXhjaCBsb2NrLgorICogIC0gSWYgdGhlIGVtX2xvY2sgYW5kIGV4X2xvY2sgbXVzdCBiZSB0YWtlbiBhdCB0aGUgc2FtZSB0aW1lLCB0aGVuIHRoZQorICogICAgZW1fbG9jayBtdXN0IGJlIHRha2VuIGJlZm9yZSB0aGUgZXhfbG9jay4KKyAqLworCisvKgorICogb3Bjb2RlIG5hbWVzIGZvciBkZWJ1Z2dpbmcuCisgKi8KK3N0YXRpYyBjaGFyICpmY19leGNoX3JjdGxfbmFtZXNbXSA9IEZDX1JDVExfTkFNRVNfSU5JVDsKKworI2RlZmluZSBGQ19UQUJMRV9TSVpFKHgpICAgKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpmY19leGNoX25hbWVfbG9va3VwKHVuc2lnbmVkIGludCBvcCwgY2hhciAqKnRhYmxlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4X2luZGV4KQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisJaWYgKG9wIDwgbWF4X2luZGV4KQorCQluYW1lID0gdGFibGVbb3BdOworCWlmICghbmFtZSkKKwkJbmFtZSA9ICJ1bmtub3duIjsKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZjX2V4Y2hfcmN0bF9uYW1lKHVuc2lnbmVkIGludCBvcCkKK3sKKwlyZXR1cm4gZmNfZXhjaF9uYW1lX2xvb2t1cChvcCwgZmNfZXhjaF9yY3RsX25hbWVzLAorCQkJCSAgIEZDX1RBQkxFX1NJWkUoZmNfZXhjaF9yY3RsX25hbWVzKSk7Cit9CisKKy8qCisgKiBIb2xkIGFuIGV4Y2hhbmdlIC0ga2VlcCBpdCBmcm9tIGJlaW5nIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBmY19leGNoX2hvbGQoc3RydWN0IGZjX2V4Y2ggKmVwKQoreworCWF0b21pY19pbmMoJmVwLT5leF9yZWZjbnQpOworfQorCisvKgorICogc2V0dXAgZmMgaGRyIGJ5IGluaXRpYWxpemluZyBmZXcgbW9yZSBGQyBoZWFkZXIgZmllbGRzIGFuZCBzb2YvZW9mLgorICogSW5pdGlhbGl6ZWQgZmllbGRzIGJ5IHRoaXMgZnVuYzoKKyAqCS0gZmhfb3hfaWQsIGZoX3J4X2lkLCBmaF9zZXFfaWQsIGZoX3NlcV9jbnQKKyAqCS0gc29mIGFuZCBlb2YKKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9zZXR1cF9oZHIoc3RydWN0IGZjX2V4Y2ggKmVwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJICAgICAgdTMyIGZfY3RsKQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJdTE2IGZpbGw7CisKKwlmcl9zb2YoZnApID0gZXAtPmNsYXNzOworCWlmIChlcC0+c2VxLmNudCkKKwkJZnJfc29mKGZwKSA9IGZjX3NvZl9ub3JtYWwoZXAtPmNsYXNzKTsKKworCWlmIChmX2N0bCAmIEZDX0ZDX0VORF9TRVEpIHsKKwkJZnJfZW9mKGZwKSA9IEZDX0VPRl9UOworCQlpZiAoZmNfc29mX25lZWRzX2FjayhlcC0+Y2xhc3MpKQorCQkJZnJfZW9mKGZwKSA9IEZDX0VPRl9OOworCQkvKgorCQkgKiBGb3JtIGZfY3RsLgorCQkgKiBUaGUgbnVtYmVyIG9mIGZpbGwgYnl0ZXMgdG8gbWFrZSB0aGUgbGVuZ3RoIGEgNC1ieXRlCisJCSAqIG11bHRpcGxlIGlzIHRoZSBsb3cgb3JkZXIgMi1iaXRzIG9mIHRoZSBmX2N0bC4KKwkJICogVGhlIGZpbGwgaXRzZWxmIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgdGhlIGZyYW1lCisJCSAqIGFsbG9jYXRpb24uCisJCSAqIEFmdGVyIHRoaXMsIHRoZSBsZW5ndGggd2lsbCBiZSBldmVuLCBhcyBleHBlY3RlZCBieQorCQkgKiB0aGUgdHJhbnNwb3J0LgorCQkgKi8KKwkJZmlsbCA9IGZyX2xlbihmcCkgJiAzOworCQlpZiAoZmlsbCkgeworCQkJZmlsbCA9IDQgLSBmaWxsOworCQkJLyogVE9ETywgdGhpcyBtYXkgYmUgYSBwcm9ibGVtIHdpdGggZnJhZ21lbnRlZCBza2IgKi8KKwkJCXNrYl9wdXQoZnBfc2tiKGZwKSwgZmlsbCk7CisJCQlodG9uMjQoZmgtPmZoX2ZfY3RsLCBmX2N0bCB8IGZpbGwpOworCQl9CisJfSBlbHNlIHsKKwkJV0FSTl9PTihmcl9sZW4oZnApICUgNCAhPSAwKTsJLyogbm8gcGFkIHRvIG5vbiBsYXN0IGZyYW1lICovCisJCWZyX2VvZihmcCkgPSBGQ19FT0ZfTjsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgcmVtYWluaWcgZmggZmllbGRzCisJICogZnJvbSBmY19maWxsX2ZjX2hkcgorCSAqLworCWZoLT5maF9veF9pZCA9IGh0b25zKGVwLT5veGlkKTsKKwlmaC0+ZmhfcnhfaWQgPSBodG9ucyhlcC0+cnhpZCk7CisJZmgtPmZoX3NlcV9pZCA9IGVwLT5zZXEuaWQ7CisJZmgtPmZoX3NlcV9jbnQgPSBodG9ucyhlcC0+c2VxLmNudCk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYW4gZXhjaGFuZ2UuCisgKiBJZiB0aGUgcmVmY250IGdvZXMgdG8gemVybyBhbmQgdGhlIGV4Y2hhbmdlIGlzIGNvbXBsZXRlLCBpdCBpcyBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9yZWxlYXNlKHN0cnVjdCBmY19leGNoICplcCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVwLT5leF9yZWZjbnQpKSB7CisJCW1wID0gZXAtPmVtOworCQlpZiAoZXAtPmRlc3RydWN0b3IpCisJCQllcC0+ZGVzdHJ1Y3RvcigmZXAtPnNlcSwgZXAtPmFyZyk7CisJCWlmIChlcC0+bHAtPnR0LmV4Y2hfcHV0KQorCQkJZXAtPmxwLT50dC5leGNoX3B1dChlcC0+bHAsIG1wLCBlcC0+eGlkKTsKKwkJV0FSTl9PTighZXAtPmVzYl9zdGF0ICYgRVNCX1NUX0NPTVBMRVRFKTsKKwkJbWVtcG9vbF9mcmVlKGVwLCBtcC0+ZXBfcG9vbCk7CisJfQorfQorCitzdGF0aWMgaW50IGZjX2V4Y2hfZG9uZV9sb2NrZWQoc3RydWN0IGZjX2V4Y2ggKmVwKQoreworCWludCByYyA9IDE7CisKKwkvKgorCSAqIFdlIG11c3QgY2hlY2sgZm9yIGNvbXBsZXRpb24gaW4gY2FzZSB0aGVyZSBhcmUgdHdvIHRocmVhZHMKKwkgKiB0eXJpbmcgdG8gY29tcGxldGUgdGhpcy4gQnV0IHRoZSBycnEgY29kZSB3aWxsIHJldXNlIHRoZQorCSAqIGVwLCBhbmQgaW4gdGhhdCBjYXNlIHdlIG9ubHkgY2xlYXIgdGhlIHJlc3AgYW5kIHNldCBpdCBhcworCSAqIGNvbXBsZXRlLCBzbyBpdCBjYW4gYmUgcmV1c2VkIGJ5IHRoZSB0aW1lciB0byBzZW5kIHRoZSBycnEuCisJICovCisJZXAtPnJlc3AgPSBOVUxMOworCWlmIChlcC0+c3RhdGUgJiBGQ19FWF9ET05FKQorCQlyZXR1cm4gcmM7CisJZXAtPmVzYl9zdGF0IHw9IEVTQl9TVF9DT01QTEVURTsKKworCWlmICghKGVwLT5lc2Jfc3RhdCAmIEVTQl9TVF9SRUNfUVVBTCkpIHsKKwkJZXAtPnN0YXRlIHw9IEZDX0VYX0RPTkU7CisJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZlcC0+dGltZW91dF93b3JrKSkKKwkJCWF0b21pY19kZWMoJmVwLT5leF9yZWZjbnQpOyAvKiBkcm9wIGhvbGQgZm9yIHRpbWVyICovCisJCXJjID0gMDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBmY19leGNoX21ncl9kZWxldGVfZXAoc3RydWN0IGZjX2V4Y2ggKmVwKQoreworCXN0cnVjdCBmY19leGNoX21nciAqbXA7CisKKwltcCA9IGVwLT5lbTsKKwlzcGluX2xvY2tfYmgoJm1wLT5lbV9sb2NrKTsKKwlXQVJOX09OKG1wLT50b3RhbF9leGNoZXMgPD0gMCk7CisJbXAtPnRvdGFsX2V4Y2hlcy0tOworCW1wLT5leGNoZXNbZXAtPnhpZCAtIG1wLT5taW5feGlkXSA9IE5VTEw7CisJbGlzdF9kZWwoJmVwLT5leF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmbXAtPmVtX2xvY2spOworCWZjX2V4Y2hfcmVsZWFzZShlcCk7CS8qIGRyb3AgaG9sZCBmb3IgZXhjaCBpbiBtcCAqLworfQorCisvKgorICogSW50ZXJuYWwgdmVyc2lvbiBvZiBmY19leGNoX3RpbWVyX3NldCAtIHVzZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmY19leGNoX3RpbWVyX3NldF9sb2NrZWQoc3RydWN0IGZjX2V4Y2ggKmVwLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpCit7CisJaWYgKGVwLT5zdGF0ZSAmIChGQ19FWF9SU1RfQ0xFQU5VUCB8IEZDX0VYX0RPTkUpKQorCQlyZXR1cm47CisKKwlGQ19ERUJVR19FWENIKCJFeGNoYW5nZSAoJTR4KSB0aW1lZCBvdXQsIG5vdGlmeWluZyB0aGUgdXBwZXIgbGF5ZXJcbiIsCisJCSAgICAgIGVwLT54aWQpOworCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmVwLT50aW1lb3V0X3dvcmssCisJCQkJICBtc2Vjc190b19qaWZmaWVzKHRpbWVyX21zZWMpKSkKKwkJZmNfZXhjaF9ob2xkKGVwKTsJCS8qIGhvbGQgZm9yIHRpbWVyICovCit9CisKKy8qCisgKiBTZXQgdGltZXIgZm9yIGFuIGV4Y2hhbmdlLgorICogVGhlIHRpbWUgaXMgYSBtaW5pbXVtIGRlbGF5IGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgdGltZXIgZmlyZXMuCisgKiBVc2VkIGZvciB1cHBlciBsZXZlbCBwcm90b2NvbHMgdG8gdGltZSBvdXQgdGhlIGV4Y2hhbmdlLgorICogVGhlIHRpbWVyIGlzIGNhbmNlbGxlZCB3aGVuIGl0IGZpcmVzIG9yIHdoZW4gdGhlIGV4Y2hhbmdlIGNvbXBsZXRlcy4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYSB0aW1lciBjb3VsZG4ndCBiZSBhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2V4Y2hfdGltZXJfc2V0KHN0cnVjdCBmY19leGNoICplcCwgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpCit7CisJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJZmNfZXhjaF90aW1lcl9zZXRfbG9ja2VkKGVwLCB0aW1lcl9tc2VjKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworfQorCitpbnQgZmNfc2VxX2V4Y2hfYWJvcnQoY29uc3Qgc3RydWN0IGZjX3NlcSAqcmVxX3NwLCB1bnNpZ25lZCBpbnQgdGltZXJfbXNlYykKK3sKKwlzdHJ1Y3QgZmNfc2VxICpzcDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlpbnQgZXJyb3I7CisKKwllcCA9IGZjX3NlcV9leGNoKHJlcV9zcCk7CisKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlpZiAoZXAtPmVzYl9zdGF0ICYgKEVTQl9TVF9DT01QTEVURSB8IEVTQl9TVF9BQk5PUk1BTCkgfHwKKwkgICAgZXAtPnN0YXRlICYgKEZDX0VYX0RPTkUgfCBGQ19FWF9SU1RfQ0xFQU5VUCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKgorCSAqIFNlbmQgdGhlIGFib3J0IG9uIGEgbmV3IHNlcXVlbmNlIGlmIHBvc3NpYmxlLgorCSAqLworCXNwID0gZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKCZlcC0+c2VxKTsKKwlpZiAoIXNwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVwLT5lc2Jfc3RhdCB8PSBFU0JfU1RfU0VRX0lOSVQgfCBFU0JfU1RfQUJOT1JNQUw7CisJaWYgKHRpbWVyX21zZWMpCisJCWZjX2V4Y2hfdGltZXJfc2V0X2xvY2tlZChlcCwgdGltZXJfbXNlYyk7CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKworCS8qCisJICogSWYgbm90IGxvZ2dlZCBpbnRvIHRoZSBmYWJyaWMsIGRvbid0IHNlbmQgQUJUUyBidXQgbGVhdmUKKwkgKiBzZXF1ZW5jZSBhY3RpdmUgdW50aWwgbmV4dCB0aW1lb3V0LgorCSAqLworCWlmICghZXAtPnNpZCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNlbmQgYW4gYWJvcnQgZm9yIHRoZSBzZXF1ZW5jZSB0aGF0IHRpbWVkIG91dC4KKwkgKi8KKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGVwLT5scCwgMCk7CisJaWYgKGZwKSB7CisJCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0JBX0FCVFMsIGVwLT5kaWQsIGVwLT5zaWQsCisJCQkgICAgICAgRkNfVFlQRV9CTFMsIEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CisJCWVycm9yID0gZmNfc2VxX3NlbmQoZXAtPmxwLCBzcCwgZnApOworCX0gZWxzZQorCQllcnJvciA9IC1FTk9CVUZTOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0woZmNfc2VxX2V4Y2hfYWJvcnQpOworCisvKgorICogRXhjaGFuZ2UgdGltZW91dCAtIGhhbmRsZSBleGNoYW5nZSB0aW1lciBleHBpcmF0aW9uLgorICogVGhlIHRpbWVyIHdpbGwgaGF2ZSBiZWVuIGNhbmNlbGxlZCBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2V4Y2hfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY19leGNoLAorCQkJCQkgIHRpbWVvdXRfd29yay53b3JrKTsKKwlzdHJ1Y3QgZmNfc2VxICpzcCA9ICZlcC0+c2VxOworCXZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZyk7CisJdm9pZCAqYXJnOworCXUzMiBlX3N0YXQ7CisJaW50IHJjID0gMTsKKworCXNwaW5fbG9ja19iaCgmZXAtPmV4X2xvY2spOworCWlmIChlcC0+c3RhdGUgJiAoRkNfRVhfUlNUX0NMRUFOVVAgfCBGQ19FWF9ET05FKSkKKwkJZ290byB1bmxvY2s7CisKKwllX3N0YXQgPSBlcC0+ZXNiX3N0YXQ7CisJaWYgKGVfc3RhdCAmIEVTQl9TVF9DT01QTEVURSkgeworCQllcC0+ZXNiX3N0YXQgPSBlX3N0YXQgJiB+RVNCX1NUX1JFQ19RVUFMOworCQlpZiAoZV9zdGF0ICYgRVNCX1NUX1JFQ19RVUFMKQorCQkJZmNfZXhjaF9ycnEoZXApOworCQlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJcmVzcCA9IGVwLT5yZXNwOworCQlhcmcgPSBlcC0+YXJnOworCQllcC0+cmVzcCA9IE5VTEw7CisJCWlmIChlX3N0YXQgJiBFU0JfU1RfQUJOT1JNQUwpCisJCQlyYyA9IGZjX2V4Y2hfZG9uZV9sb2NrZWQoZXApOworCQlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCQlpZiAoIXJjKQorCQkJZmNfZXhjaF9tZ3JfZGVsZXRlX2VwKGVwKTsKKwkJaWYgKHJlc3ApCisJCQlyZXNwKHNwLCBFUlJfUFRSKC1GQ19FWF9USU1FT1VUKSwgYXJnKTsKKwkJZmNfc2VxX2V4Y2hfYWJvcnQoc3AsIDIgKiBlcC0+cl9hX3Rvdik7CisJCWdvdG8gZG9uZTsKKwl9Cit1bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKK2RvbmU6CisJLyoKKwkgKiBUaGlzIHJlbGVhc2UgbWF0Y2hlcyB0aGUgaG9sZCB0YWtlbiB3aGVuIHRoZSB0aW1lciB3YXMgc2V0LgorCSAqLworCWZjX2V4Y2hfcmVsZWFzZShlcCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHNlcXVlbmNlLgorICoKKyAqIFdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgb3JpZ2luYXRlZCBzZXF1ZW5jZXMgb24gdGhlIHNhbWUgZXhjaGFuZ2UuCisgKiBCeSBpbXBsaWNhdGlvbiwgYW55IHByZXZpb3VzbHkgb3JpZ2luYXRlZCBzZXF1ZW5jZSBvbiB0aGlzIGV4Y2hhbmdlCisgKiBpcyBjb21wbGV0ZSwgYW5kIHdlIHJlYWxsb2NhdGUgdGhlIHNhbWUgc2VxdWVuY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19zZXFfYWxsb2Moc3RydWN0IGZjX2V4Y2ggKmVwLCB1OCBzZXFfaWQpCit7CisJc3RydWN0IGZjX3NlcSAqc3A7CisKKwlzcCA9ICZlcC0+c2VxOworCXNwLT5zc2Jfc3RhdCA9IDA7CisJc3AtPmNudCA9IDA7CisJc3AtPmlkID0gc2VxX2lkOworCXJldHVybiBzcDsKK30KKworLyoKKyAqIGZjX2VtX2FsbG9jX3hpZCAtIHJldHVybnMgYW4geGlkIGJhc2VkIG9uIHJlcXVlc3QgdHlwZQorICogQGxwIDogcHRyIHRvIGFzc29jaWF0ZWQgbHBvcnQKKyAqIEBmcCA6IHB0ciB0byB0aGUgYXNzb2NhdGVkIGZyYW1lCisgKgorICogY2hlY2sgdGhlIGFzc29jaWF0ZWQgZmNfZnNwX3BrdCB0byBnZXQgc2NzaSBjb21tYW5kIHR5cGUgYW5kCisgKiBjb21tYW5kIGRpcmVjdGlvbiB0byBkZWNpZGUgZnJvbSB3aGljaCByYW5nZSB0aGlzIGV4Y2ggaWQKKyAqIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20uCisgKgorICogUmV0dXJucyA6IDAgb3IgYW4gdmFsaWQgeGlkCisgKi8KK3N0YXRpYyB1MTYgZmNfZW1fYWxsb2NfeGlkKHN0cnVjdCBmY19leGNoX21nciAqbXAsIGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJdTE2IHhpZCwgbWluLCBtYXg7CisJdTE2ICpwbGFzdDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBOVUxMOworCisJaWYgKG1wLT5tYXhfcmVhZCkgeworCQlpZiAoZmNfZnJhbWVfaXNfcmVhZChmcCkpIHsKKwkJCW1pbiA9IG1wLT5taW5feGlkOworCQkJbWF4ID0gbXAtPm1heF9yZWFkOworCQkJcGxhc3QgPSAmbXAtPmxhc3RfcmVhZDsKKwkJfSBlbHNlIHsKKwkJCW1pbiA9IG1wLT5tYXhfcmVhZCArIDE7CisJCQltYXggPSBtcC0+bWF4X3hpZDsKKwkJCXBsYXN0ID0gJm1wLT5sYXN0X3hpZDsKKwkJfQorCX0gZWxzZSB7CisJCW1pbiA9IG1wLT5taW5feGlkOworCQltYXggPSBtcC0+bWF4X3hpZDsKKwkJcGxhc3QgPSAmbXAtPmxhc3RfeGlkOworCX0KKwl4aWQgPSAqcGxhc3Q7CisJZG8geworCQl4aWQgPSAoeGlkID09IG1heCkgPyBtaW4gOiB4aWQgKyAxOworCQllcCA9IG1wLT5leGNoZXNbeGlkIC0gbXAtPm1pbl94aWRdOworCX0gd2hpbGUgKChlcCAhPSBOVUxMKSAmJiAoeGlkICE9ICpwbGFzdCkpOworCisJaWYgKHVubGlrZWx5KGVwKSkKKwkJeGlkID0gMDsKKwllbHNlCisJCSpwbGFzdCA9IHhpZDsKKworCXJldHVybiB4aWQ7Cit9CisKKy8qCisgKiBmY19leGNoX2FsbG9jIC0gYWxsb2NhdGUgYW4gZXhjaGFuZ2UuCisgKiBAbXAgOiBwdHIgdG8gdGhlIGV4Y2hhbmdlIG1hbmFnZXIKKyAqIEB4aWQ6IGlucHV0IHhpZAorICoKKyAqIGlmIHhpZCBpcyBzdXBwbGllZCB6ZXJvIHRoZW4gYXNzaWduIG5leHQgZnJlZSBleGNoYW5nZSBJRAorICogZnJvbSBleGNoYW5nZSBtYW5hZ2VyLCBvdGhlcndpc2UgdXNlIHN1cHBsaWVkIHhpZC4KKyAqIFJldHVybnMgd2l0aCBleGNoIGxvY2sgaGVsZC4KKyAqLworc3RydWN0IGZjX2V4Y2ggKmZjX2V4Y2hfYWxsb2Moc3RydWN0IGZjX2V4Y2hfbWdyICptcCwKKwkJCSAgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsIHUxNiB4aWQpCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBleGNoYW5nZSAqLworCWVwID0gbWVtcG9vbF9hbGxvYyhtcC0+ZXBfcG9vbCwgR0ZQX0FUT01JQyk7CisJaWYgKCFlcCkgeworCQlhdG9taWNfaW5jKCZtcC0+c3RhdHMubm9fZnJlZV9leGNoKTsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldChlcCwgMCwgc2l6ZW9mKCplcCkpOworCisJc3Bpbl9sb2NrX2JoKCZtcC0+ZW1fbG9jayk7CisJLyogYWxsb2MgeGlkIGlmIGlucHV0IHhpZCAwICovCisJaWYgKCF4aWQpIHsKKwkJLyogYWxsb2MgYSBuZXcgeGlkICovCisJCXhpZCA9IGZjX2VtX2FsbG9jX3hpZChtcCwgZnApOworCQlpZiAoIXhpZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmY19lbV9hbGxvY194aWQoKSBmYWlsZWRcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlmY19leGNoX2hvbGQoZXApOwkvKiBob2xkIGZvciBleGNoIGluIG1wICovCisJc3Bpbl9sb2NrX2luaXQoJmVwLT5leF9sb2NrKTsKKwkvKgorCSAqIEhvbGQgZXhjaCBsb2NrIGZvciBjYWxsZXIgdG8gcHJldmVudCBmY19leGNoX3Jlc2V0KCkKKwkgKiBmcm9tIHJlbGVhc2luZyBleGNoCXdoaWxlIGZjX2V4Y2hfYWxsb2MoKSBjYWxsZXIgaXMKKwkgKiBzdGlsbCB3b3JraW5nIG9uIGV4Y2guCisJICovCisJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisKKwltcC0+ZXhjaGVzW3hpZCAtIG1wLT5taW5feGlkXSA9IGVwOworCWxpc3RfYWRkX3RhaWwoJmVwLT5leF9saXN0LCAmbXAtPmV4X2xpc3QpOworCWZjX3NlcV9hbGxvYyhlcCwgZXAtPnNlcV9pZCsrKTsKKwltcC0+dG90YWxfZXhjaGVzKys7CisJc3Bpbl91bmxvY2tfYmgoJm1wLT5lbV9sb2NrKTsKKworCS8qCisJICogIHVwZGF0ZSBleGNoYW5nZQorCSAqLworCWVwLT5veGlkID0gZXAtPnhpZCA9IHhpZDsKKwllcC0+ZW0gPSBtcDsKKwllcC0+bHAgPSBtcC0+bHA7CisJZXAtPmZfY3RsID0gRkNfRkNfRklSU1RfU0VROwkvKiBuZXh0IHNlcSBpcyBmaXJzdCBzZXEgKi8KKwllcC0+cnhpZCA9IEZDX1hJRF9VTktOT1dOOworCWVwLT5jbGFzcyA9IG1wLT5jbGFzczsKKwlJTklUX0RFTEFZRURfV09SSygmZXAtPnRpbWVvdXRfd29yaywgZmNfZXhjaF90aW1lb3V0KTsKK291dDoKKwlyZXR1cm4gZXA7CitlcnI6CisJc3Bpbl91bmxvY2tfYmgoJm1wLT5lbV9sb2NrKTsKKwlhdG9taWNfaW5jKCZtcC0+c3RhdHMubm9fZnJlZV9leGNoX3hpZCk7CisJbWVtcG9vbF9mcmVlKGVwLCBtcC0+ZXBfcG9vbCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfYWxsb2MpOworCisvKgorICogTG9va3VwIGFuZCBob2xkIGFuIGV4Y2hhbmdlLgorICovCitzdGF0aWMgc3RydWN0IGZjX2V4Y2ggKmZjX2V4Y2hfZmluZChzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLCB1MTYgeGlkKQoreworCXN0cnVjdCBmY19leGNoICplcCA9IE5VTEw7CisKKwlpZiAoKHhpZCA+PSBtcC0+bWluX3hpZCkgJiYgKHhpZCA8PSBtcC0+bWF4X3hpZCkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZtcC0+ZW1fbG9jayk7CisJCWVwID0gbXAtPmV4Y2hlc1t4aWQgLSBtcC0+bWluX3hpZF07CisJCWlmIChlcCkgeworCQkJZmNfZXhjaF9ob2xkKGVwKTsKKwkJCVdBUk5fT04oZXAtPnhpZCAhPSB4aWQpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZtcC0+ZW1fbG9jayk7CisJfQorCXJldHVybiBlcDsKK30KKwordm9pZCBmY19leGNoX2RvbmUoc3RydWN0IGZjX3NlcSAqc3ApCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCWludCByYzsKKworCXNwaW5fbG9ja19iaCgmZXAtPmV4X2xvY2spOworCXJjID0gZmNfZXhjaF9kb25lX2xvY2tlZChlcCk7CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlpZiAoIXJjKQorCQlmY19leGNoX21ncl9kZWxldGVfZXAoZXApOworfQorRVhQT1JUX1NZTUJPTChmY19leGNoX2RvbmUpOworCisvKgorICogQWxsb2NhdGUgYSBuZXcgZXhjaGFuZ2UgYXMgcmVzcG9uZGVyLgorICogU2V0cyB0aGUgcmVzcG9uZGVyIElEIGluIHRoZSBmcmFtZSBoZWFkZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfZXhjaCAqZmNfZXhjaF9yZXNwKHN0cnVjdCBmY19leGNoX21nciAqbXAsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXUxNiByeGlkOworCisJZXAgPSBtcC0+bHAtPnR0LmV4Y2hfZ2V0KG1wLT5scCwgZnApOworCWlmIChlcCkgeworCQllcC0+Y2xhc3MgPSBmY19mcmFtZV9jbGFzcyhmcCk7CisKKwkJLyoKKwkJICogU2V0IEVYX0NUWCBpbmRpY2F0aW5nIHdlJ3JlIHJlc3BvbmRpbmcgb24gdGhpcyBleGNoYW5nZS4KKwkJICovCisJCWVwLT5mX2N0bCB8PSBGQ19GQ19FWF9DVFg7CS8qIHdlJ3JlIHJlc3BvbmRpbmcgKi8KKwkJZXAtPmZfY3RsICY9IH5GQ19GQ19GSVJTVF9TRVE7CS8qIG5vdCBuZXcgKi8KKwkJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkJZXAtPnNpZCA9IG50b2gyNChmaC0+ZmhfZF9pZCk7CisJCWVwLT5kaWQgPSBudG9oMjQoZmgtPmZoX3NfaWQpOworCQllcC0+b2lkID0gZXAtPmRpZDsKKworCQkvKgorCQkgKiBBbGxvY2F0ZWQgZXhjaGFuZ2UgaGFzIHBsYWNlZCB0aGUgWElEIGluIHRoZQorCQkgKiBvcmlnaW5hdG9yIGZpZWxkLiBNb3ZlIGl0IHRvIHRoZSByZXNwb25kZXIgZmllbGQsCisJCSAqIGFuZCBzZXQgdGhlIG9yaWdpbmF0b3IgWElEIGZyb20gdGhlIGZyYW1lLgorCQkgKi8KKwkJZXAtPnJ4aWQgPSBlcC0+eGlkOworCQllcC0+b3hpZCA9IG50b2hzKGZoLT5maF9veF9pZCk7CisJCWVwLT5lc2Jfc3RhdCB8PSBFU0JfU1RfUkVTUCB8IEVTQl9TVF9TRVFfSU5JVDsKKwkJaWYgKChudG9oMjQoZmgtPmZoX2ZfY3RsKSAmIEZDX0ZDX1NFUV9JTklUKSA9PSAwKQorCQkJZXAtPmVzYl9zdGF0ICY9IH5FU0JfU1RfU0VRX0lOSVQ7CisKKwkJLyoKKwkJICogU2V0IHRoZSByZXNwb25kZXIgSUQgaW4gdGhlIGZyYW1lIGhlYWRlci4KKwkJICogVGhlIG9sZCBvbmUgc2hvdWxkJ3ZlIGJlZW4gMHhmZmZmLgorCQkgKiBJZiBpdCBpc24ndCwgZG9uJ3QgYXNzaWduIG9uZS4KKwkJICogSW5jb21pbmcgYmFzaWMgbGluayBzZXJ2aWNlIGZyYW1lcyBtYXkgc3BlY2lmeQorCQkgKiBhIHJlZmVyZW5jZWQgUlhfSUQuCisJCSAqLworCQlpZiAoZmgtPmZoX3R5cGUgIT0gRkNfVFlQRV9CTFMpIHsKKwkJCXJ4aWQgPSBudG9ocyhmaC0+ZmhfcnhfaWQpOworCQkJV0FSTl9PTihyeGlkICE9IEZDX1hJRF9VTktOT1dOKTsKKwkJCWZoLT5maF9yeF9pZCA9IGh0b25zKGVwLT5yeGlkKTsKKwkJfQorCQlmY19leGNoX2hvbGQoZXApOwkvKiBob2xkIGZvciBjYWxsZXIgKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsJLyogbG9jayBmcm9tIGV4Y2hfZ2V0ICovCisJfQorCXJldHVybiBlcDsKK30KKworLyoKKyAqIEZpbmQgYSBzZXF1ZW5jZSBmb3IgcmVjZWl2ZSB3aGVyZSB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBzZXF1ZW5jZS4KKyAqIElmIGZjX3BmX3JqdF9yZWFzb24gaXMgRkNfUkpUX05PTkUgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSBhIGhvbGQKKyAqIG9uIHRoZSBlcCB0aGF0IHNob3VsZCBiZSByZWxlYXNlZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgZW51bSBmY19wZl9yanRfcmVhc29uCitmY19zZXFfbG9va3VwX3JlY2lwKHN0cnVjdCBmY19leGNoX21nciAqbXAsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBOVUxMOworCXN0cnVjdCBmY19zZXEgKnNwID0gTlVMTDsKKwllbnVtIGZjX3BmX3JqdF9yZWFzb24gcmVqZWN0ID0gRkNfUkpUX05PTkU7CisJdTMyIGZfY3RsOworCXUxNiB4aWQ7CisKKwlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOworCVdBUk5fT04oKGZfY3RsICYgRkNfRkNfU0VRX0NUWCkgIT0gMCk7CisKKwkvKgorCSAqIExvb2t1cCBvciBjcmVhdGUgdGhlIGV4Y2hhbmdlIGlmIHdlIHdpbGwgYmUgY3JlYXRpbmcgdGhlIHNlcXVlbmNlLgorCSAqLworCWlmIChmX2N0bCAmIEZDX0ZDX0VYX0NUWCkgeworCQl4aWQgPSBudG9ocyhmaC0+Zmhfb3hfaWQpOwkvKiB3ZSBvcmlnaW5hdGVkIGV4Y2ggKi8KKwkJZXAgPSBmY19leGNoX2ZpbmQobXAsIHhpZCk7CisJCWlmICghZXApIHsKKwkJCWF0b21pY19pbmMoJm1wLT5zdGF0cy54aWRfbm90X2ZvdW5kKTsKKwkJCXJlamVjdCA9IEZDX1JKVF9PWF9JRDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChlcC0+cnhpZCA9PSBGQ19YSURfVU5LTk9XTikKKwkJCWVwLT5yeGlkID0gbnRvaHMoZmgtPmZoX3J4X2lkKTsKKwkJZWxzZSBpZiAoZXAtPnJ4aWQgIT0gbnRvaHMoZmgtPmZoX3J4X2lkKSkgeworCQkJcmVqZWN0ID0gRkNfUkpUX09YX0lEOworCQkJZ290byByZWw7CisJCX0KKwl9IGVsc2UgeworCQl4aWQgPSBudG9ocyhmaC0+ZmhfcnhfaWQpOwkvKiB3ZSBhcmUgdGhlIHJlc3BvbmRlciAqLworCisJCS8qCisJCSAqIFNwZWNpYWwgY2FzZSBmb3IgTURTIGlzc3VpbmcgYW4gRUxTIFRFU1Qgd2l0aCBhCisJCSAqIGJhZCByeGlkIG9mIDAuCisJCSAqIFhYWCB0YWtlIHRoaXMgb3V0IG9uY2Ugd2UgZG8gdGhlIHByb3BlciByZWplY3QuCisJCSAqLworCQlpZiAoeGlkID09IDAgJiYgZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSAmJgorCQkgICAgZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgPT0gRUxTX1RFU1QpIHsKKwkJCWZoLT5maF9yeF9pZCA9IGh0b25zKEZDX1hJRF9VTktOT1dOKTsKKwkJCXhpZCA9IEZDX1hJRF9VTktOT1dOOworCQl9CisKKwkJLyoKKwkJICogbmV3IHNlcXVlbmNlIC0gZmluZCB0aGUgZXhjaGFuZ2UKKwkJICovCisJCWVwID0gZmNfZXhjaF9maW5kKG1wLCB4aWQpOworCQlpZiAoKGZfY3RsICYgRkNfRkNfRklSU1RfU0VRKSAmJiBmY19zb2ZfaXNfaW5pdChmcl9zb2YoZnApKSkgeworCQkJaWYgKGVwKSB7CisJCQkJYXRvbWljX2luYygmbXAtPnN0YXRzLnhpZF9idXN5KTsKKwkJCQlyZWplY3QgPSBGQ19SSlRfUlhfSUQ7CisJCQkJZ290byByZWw7CisJCQl9CisJCQllcCA9IGZjX2V4Y2hfcmVzcChtcCwgZnApOworCQkJaWYgKCFlcCkgeworCQkJCXJlamVjdCA9IEZDX1JKVF9FWENIX0VTVDsJLyogWFhYICovCisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl4aWQgPSBlcC0+eGlkOwkvKiBnZXQgb3VyIFhJRCAqLworCQl9IGVsc2UgaWYgKCFlcCkgeworCQkJYXRvbWljX2luYygmbXAtPnN0YXRzLnhpZF9ub3RfZm91bmQpOworCQkJcmVqZWN0ID0gRkNfUkpUX1JYX0lEOwkvKiBYSUQgbm90IGZvdW5kICovCisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0aGUgZXhjaGFuZ2UgaGVsZC4KKwkgKiBGaW5kIG9yIGNyZWF0ZSB0aGUgc2VxdWVuY2UuCisJICovCisJaWYgKGZjX3NvZl9pc19pbml0KGZyX3NvZihmcCkpKSB7CisJCXNwID0gZmNfc2VxX3N0YXJ0X25leHQoJmVwLT5zZXEpOworCQlpZiAoIXNwKSB7CisJCQlyZWplY3QgPSBGQ19SSlRfU0VRX1hTOwkvKiBleGNoYW5nZSBzaG9ydGFnZSAqLworCQkJZ290byByZWw7CisJCX0KKwkJc3AtPmlkID0gZmgtPmZoX3NlcV9pZDsKKwkJc3AtPnNzYl9zdGF0IHw9IFNTQl9TVF9SRVNQOworCX0gZWxzZSB7CisJCXNwID0gJmVwLT5zZXE7CisJCWlmIChzcC0+aWQgIT0gZmgtPmZoX3NlcV9pZCkgeworCQkJYXRvbWljX2luYygmbXAtPnN0YXRzLnNlcV9ub3RfZm91bmQpOworCQkJcmVqZWN0ID0gRkNfUkpUX1NFUV9JRDsJLyogc2VxdWVuY2UvZXhjaCBzaG91bGQgZXhpc3QgKi8KKwkJCWdvdG8gcmVsOworCQl9CisJfQorCVdBUk5fT04oZXAgIT0gZmNfc2VxX2V4Y2goc3ApKTsKKworCWlmIChmX2N0bCAmIEZDX0ZDX1NFUV9JTklUKQorCQllcC0+ZXNiX3N0YXQgfD0gRVNCX1NUX1NFUV9JTklUOworCisJZnJfc2VxKGZwKSA9IHNwOworb3V0OgorCXJldHVybiByZWplY3Q7CityZWw6CisJZmNfZXhjaF9kb25lKCZlcC0+c2VxKTsKKwlmY19leGNoX3JlbGVhc2UoZXApOwkvKiBob2xkIGZyb20gZmNfZXhjaF9maW5kL2ZjX2V4Y2hfcmVzcCAqLworCXJldHVybiByZWplY3Q7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBzZXF1ZW5jZSBmb3IgYSBmcmFtZSBiZWluZyByZWNlaXZlZC4KKyAqIFdlIG9yaWdpbmF0ZWQgdGhlIHNlcXVlbmNlLCBzbyBpdCBzaG91bGQgYmUgZm91bmQuCisgKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIG9yaWdpbmF0ZWQgdGhlIGV4Y2hhbmdlLgorICogRG9lcyBub3QgaG9sZCB0aGUgc2VxdWVuY2UgZm9yIHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19zZXFfbG9va3VwX29yaWcoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwKKwkJCQkJIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IGZjX3NlcSAqc3AgPSBOVUxMOworCXUzMiBmX2N0bDsKKwl1MTYgeGlkOworCisJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlXQVJOX09OKChmX2N0bCAmIEZDX0ZDX1NFUV9DVFgpICE9IEZDX0ZDX1NFUV9DVFgpOworCXhpZCA9IG50b2hzKChmX2N0bCAmIEZDX0ZDX0VYX0NUWCkgPyBmaC0+Zmhfb3hfaWQgOiBmaC0+ZmhfcnhfaWQpOworCWVwID0gZmNfZXhjaF9maW5kKG1wLCB4aWQpOworCWlmICghZXApCisJCXJldHVybiBOVUxMOworCWlmIChlcC0+c2VxLmlkID09IGZoLT5maF9zZXFfaWQpIHsKKwkJLyoKKwkJICogU2F2ZSB0aGUgUlhfSUQgaWYgd2UgZGlkbid0IHByZXZpb3VzbHkga25vdyBpdC4KKwkJICovCisJCXNwID0gJmVwLT5zZXE7CisJCWlmICgoZl9jdGwgJiBGQ19GQ19FWF9DVFgpICE9IDAgJiYKKwkJICAgIGVwLT5yeGlkID09IEZDX1hJRF9VTktOT1dOKSB7CisJCQllcC0+cnhpZCA9IG50b2hzKGZoLT5maF9yeF9pZCk7CisJCX0KKwl9CisJZmNfZXhjaF9yZWxlYXNlKGVwKTsKKwlyZXR1cm4gc3A7Cit9CisKKy8qCisgKiBTZXQgYWRkcmVzc2VzIGZvciBhbiBleGNoYW5nZS4KKyAqIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCBzZXF1ZW5jZSBvZiB0aGUgZXhjaGFuZ2UgaXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9zZXRfYWRkcihzdHJ1Y3QgZmNfZXhjaCAqZXAsCisJCQkgICAgIHUzMiBvcmlnX2lkLCB1MzIgcmVzcF9pZCkKK3sKKwllcC0+b2lkID0gb3JpZ19pZDsKKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1JFU1ApIHsKKwkJZXAtPnNpZCA9IHJlc3BfaWQ7CisJCWVwLT5kaWQgPSBvcmlnX2lkOworCX0gZWxzZSB7CisJCWVwLT5zaWQgPSBvcmlnX2lkOworCQllcC0+ZGlkID0gcmVzcF9pZDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmNfc2VxICpmY19zZXFfc3RhcnRfbmV4dF9sb2NrZWQoc3RydWN0IGZjX3NlcSAqc3ApCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCisJc3AgPSBmY19zZXFfYWxsb2MoZXAsIGVwLT5zZXFfaWQrKyk7CisJRkNfREVCVUdfRVhDSCgiZXhjaCAlNHggZl9jdGwgJTZ4IHNlcSAlMnhcbiIsCisJCSAgICAgIGVwLT54aWQsIGVwLT5mX2N0bCwgc3AtPmlkKTsKKwlyZXR1cm4gc3A7Cit9CisvKgorICogQWxsb2NhdGUgYSBuZXcgc2VxdWVuY2Ugb24gdGhlIHNhbWUgZXhjaGFuZ2UgYXMgdGhlIHN1cHBsaWVkIHNlcXVlbmNlLgorICogVGhpcyB3aWxsIG5ldmVyIHJldHVybiBOVUxMLgorICovCitzdHJ1Y3QgZmNfc2VxICpmY19zZXFfc3RhcnRfbmV4dChzdHJ1Y3QgZmNfc2VxICpzcCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CisKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlXQVJOX09OKChlcC0+ZXNiX3N0YXQgJiBFU0JfU1RfQ09NUExFVEUpICE9IDApOworCXNwID0gZmNfc2VxX3N0YXJ0X25leHRfbG9ja2VkKHNwKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCisJcmV0dXJuIHNwOworfQorRVhQT1JUX1NZTUJPTChmY19zZXFfc3RhcnRfbmV4dCk7CisKK2ludCBmY19zZXFfc2VuZChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlpbnQgZXJyb3I7CisJdTMyCWZfY3RsOworCisJZXAgPSBmY19zZXFfZXhjaChzcCk7CisJV0FSTl9PTigoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1NFUV9JTklUKSAhPSBFU0JfU1RfU0VRX0lOSVQpOworCisJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlmY19leGNoX3NldHVwX2hkcihlcCwgZnAsIGZfY3RsKTsKKworCS8qCisJICogdXBkYXRlIHNlcXVlbmNlIGNvdW50IGlmIHRoaXMgZnJhbWUgaXMgY2FycnlpbmcKKwkgKiBtdWx0aXBsZSBGQyBmcmFtZXMgd2hlbiBzZXF1ZW5jZSBvZmZsb2FkIGlzIGVuYWJsZWQKKwkgKiBieSBMTEQuCisJICovCisJaWYgKGZyX21heF9wYXlsb2FkKGZwKSkKKwkJc3AtPmNudCArPSBESVZfUk9VTkRfVVAoKGZyX2xlbihmcCkgLSBzaXplb2YoKmZoKSksCisJCQkJCWZyX21heF9wYXlsb2FkKGZwKSk7CisJZWxzZQorCQlzcC0+Y250Kys7CisKKwkvKgorCSAqIFNlbmQgdGhlIGZyYW1lLgorCSAqLworCWVycm9yID0gbHAtPnR0LmZyYW1lX3NlbmQobHAsIGZwKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBleGNoYW5nZSBhbmQgc2VxdWVuY2UgZmxhZ3MsCisJICogYXNzdW1pbmcgYWxsIGZyYW1lcyBmb3IgdGhlIHNlcXVlbmNlIGhhdmUgYmVlbiBzZW50LgorCSAqIFdlIGNhbiBvbmx5IGJlIGNhbGxlZCB0byBzZW5kIG9uY2UgZm9yIGVhY2ggc2VxdWVuY2UuCisJICovCisJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJZXAtPmZfY3RsID0gZl9jdGwgJiB+RkNfRkNfRklSU1RfU0VROwkvKiBub3QgZmlyc3Qgc2VxICovCisJaWYgKGZfY3RsICYgKEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCkpCisJCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1NFUV9JTklUOworCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTChmY19zZXFfc2VuZCk7CisKK3ZvaWQgZmNfc2VxX2Vsc19yc3Bfc2VuZChzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCisJCQkgc3RydWN0IGZjX3NlcV9lbHNfZGF0YSAqZWxzX2RhdGEpCit7CisJc3dpdGNoIChlbHNfY21kKSB7CisJY2FzZSBFTFNfTFNfUkpUOgorCQlmY19zZXFfbHNfcmp0KHNwLCBlbHNfZGF0YS0+cmVhc29uLCBlbHNfZGF0YS0+ZXhwbGFuKTsKKwkJYnJlYWs7CisJY2FzZSBFTFNfTFNfQUNDOgorCQlmY19zZXFfbHNfYWNjKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBFTFNfUlJROgorCQlmY19leGNoX2Vsc19ycnEoc3AsIGVsc19kYXRhLT5mcCk7CisJCWJyZWFrOworCWNhc2UgRUxTX1JFQzoKKwkJZmNfZXhjaF9lbHNfcmVjKHNwLCBlbHNfZGF0YS0+ZnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlGQ19EQkcoIkludmFsaWQgRUxTIENNRDoleFxuIiwgZWxzX2NtZCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChmY19zZXFfZWxzX3JzcF9zZW5kKTsKKworLyoKKyAqIFNlbmQgYSBzZXF1ZW5jZSwgd2hpY2ggaXMgYWxzbyB0aGUgbGFzdCBzZXF1ZW5jZSBpbiB0aGUgZXhjaGFuZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3NlcV9zZW5kX2xhc3Qoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkgICAgIGVudW0gZmNfcmN0bCByY3RsLCBlbnVtIGZjX2ZoX3R5cGUgZmhfdHlwZSkKK3sKKwl1MzIgZl9jdGw7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCisJZl9jdGwgPSBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKKwlmX2N0bCB8PSBlcC0+Zl9jdGw7CisJZmNfZmlsbF9mY19oZHIoZnAsIHJjdGwsIGVwLT5kaWQsIGVwLT5zaWQsIGZoX3R5cGUsIGZfY3RsLCAwKTsKKwlmY19zZXFfc2VuZChlcC0+bHAsIHNwLCBmcCk7Cit9CisKKy8qCisgKiBTZW5kIEFDS18xIChvciBlcXVpdi4pIGluZGljYXRpbmcgd2UgcmVjZWl2ZWQgc29tZXRoaW5nLgorICogVGhlIGZyYW1lIHdlJ3JlIGFja2luZyBpcyBzdXBwbGllZC4KKyAqLworc3RhdGljIHZvaWQgZmNfc2VxX3NlbmRfYWNrKHN0cnVjdCBmY19zZXEgKnNwLCBjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqcnhfZmg7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBlcC0+bHA7CisJdW5zaWduZWQgaW50IGZfY3RsOworCisJLyoKKwkgKiBEb24ndCBzZW5kIEFDS3MgZm9yIGNsYXNzIDMuCisJICovCisJaWYgKGZjX3NvZl9uZWVkc19hY2soZnJfc29mKHJ4X2ZwKSkpIHsKKwkJZnAgPSBmY19mcmFtZV9hbGxvYyhscCwgMCk7CisJCWlmICghZnApCisJCQlyZXR1cm47CisKKwkJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkJZmgtPmZoX3JfY3RsID0gRkNfUkNUTF9BQ0tfMTsKKwkJZmgtPmZoX3R5cGUgPSBGQ19UWVBFX0JMUzsKKworCQkvKgorCQkgKiBGb3JtIGZfY3RsIGJ5IGludmVydGluZyBFWF9DVFggYW5kIFNFUV9DVFggKGJpdHMgMjMsIDIyKS4KKwkJICogRWNobyBGSVJTVF9TRVEsIExBU1RfU0VRLCBFTkRfU0VRLCBFTkRfQ09OTiwgU0VRX0lOSVQuCisJCSAqIEJpdHMgOS04IGFyZSBtZWFuaW5nZnVsIChyZXRyYW5zbWl0dGVkIG9yIHVuaWRpcmVjdGlvbmFsKS4KKwkJICogTGFzdCBBQ0sgdXNlcyBiaXRzIDctNiAoY29udGludWUgc2VxdWVuY2UpLAorCQkgKiBiaXRzIDUtNCBhcmUgbWVhbmluZ2Z1bCAod2hhdCBraW5kIG9mIEFDSyB0byB1c2UpLgorCQkgKi8KKwkJcnhfZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KHJ4X2ZwKTsKKwkJZl9jdGwgPSBudG9oMjQocnhfZmgtPmZoX2ZfY3RsKTsKKwkJZl9jdGwgJj0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfU0VRX0NUWCB8CisJCQlGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19MQVNUX1NFUSB8CisJCQlGQ19GQ19FTkRfU0VRIHwgRkNfRkNfRU5EX0NPTk4gfCBGQ19GQ19TRVFfSU5JVCB8CisJCQlGQ19GQ19SRVRYX1NFUSB8IEZDX0ZDX1VOSV9UWDsKKwkJZl9jdGwgXj0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfU0VRX0NUWDsKKwkJaHRvbjI0KGZoLT5maF9mX2N0bCwgZl9jdGwpOworCisJCWZjX2V4Y2hfc2V0dXBfaGRyKGVwLCBmcCwgZl9jdGwpOworCQlmaC0+Zmhfc2VxX2lkID0gcnhfZmgtPmZoX3NlcV9pZDsKKwkJZmgtPmZoX3NlcV9jbnQgPSByeF9maC0+Zmhfc2VxX2NudDsKKwkJZmgtPmZoX3Bhcm1fb2Zmc2V0ID0gaHRvbmwoMSk7CS8qIGFjayBzaW5nbGUgZnJhbWUgKi8KKworCQlmcl9zb2YoZnApID0gZnJfc29mKHJ4X2ZwKTsKKwkJaWYgKGZfY3RsICYgRkNfRkNfRU5EX1NFUSkKKwkJCWZyX2VvZihmcCkgPSBGQ19FT0ZfVDsKKwkJZWxzZQorCQkJZnJfZW9mKGZwKSA9IEZDX0VPRl9OOworCisJCSh2b2lkKSBscC0+dHQuZnJhbWVfc2VuZChscCwgZnApOworCX0KK30KKworLyoKKyAqIFNlbmQgQkxTIFJlamVjdC4KKyAqIFRoaXMgaXMgZm9yIHJlamVjdGluZyBCQV9BQlRTIG9ubHkuCisgKi8KK3N0YXRpYyB2b2lkCitmY19leGNoX3NlbmRfYmFfcmp0KHN0cnVjdCBmY19mcmFtZSAqcnhfZnAsIGVudW0gZmNfYmFfcmp0X3JlYXNvbiByZWFzb24sCisJCSAgICBlbnVtIGZjX2JhX3JqdF9leHBsYW4gZXhwbGFuKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqcnhfZmg7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX2JhX3JqdCAqcnA7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwl1bnNpZ25lZCBpbnQgZl9jdGw7CisKKwlscCA9IGZyX2RldihyeF9mcCk7CisJZnAgPSBmY19mcmFtZV9hbGxvYyhscCwgc2l6ZW9mKCpycCkpOworCWlmICghZnApCisJCXJldHVybjsKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCXJ4X2ZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChyeF9mcCk7CisKKwltZW1zZXQoZmgsIDAsIHNpemVvZigqZmgpICsgc2l6ZW9mKCpycCkpOworCisJcnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpycCkpOworCXJwLT5icl9yZWFzb24gPSByZWFzb247CisJcnAtPmJyX2V4cGxhbiA9IGV4cGxhbjsKKworCS8qCisJICogc2VxX2lkLCBjc19jdGwsIGRmX2N0bCBhbmQgcGFyYW0vb2Zmc2V0IGFyZSB6ZXJvLgorCSAqLworCW1lbWNweShmaC0+Zmhfc19pZCwgcnhfZmgtPmZoX2RfaWQsIDMpOworCW1lbWNweShmaC0+ZmhfZF9pZCwgcnhfZmgtPmZoX3NfaWQsIDMpOworCWZoLT5maF9veF9pZCA9IHJ4X2ZoLT5maF9yeF9pZDsKKwlmaC0+ZmhfcnhfaWQgPSByeF9maC0+Zmhfb3hfaWQ7CisJZmgtPmZoX3NlcV9jbnQgPSByeF9maC0+Zmhfc2VxX2NudDsKKwlmaC0+Zmhfcl9jdGwgPSBGQ19SQ1RMX0JBX1JKVDsKKwlmaC0+ZmhfdHlwZSA9IEZDX1RZUEVfQkxTOworCisJLyoKKwkgKiBGb3JtIGZfY3RsIGJ5IGludmVydGluZyBFWF9DVFggYW5kIFNFUV9DVFggKGJpdHMgMjMsIDIyKS4KKwkgKiBFY2hvIEZJUlNUX1NFUSwgTEFTVF9TRVEsIEVORF9TRVEsIEVORF9DT05OLCBTRVFfSU5JVC4KKwkgKiBCaXRzIDktOCBhcmUgbWVhbmluZ2Z1bCAocmV0cmFuc21pdHRlZCBvciB1bmlkaXJlY3Rpb25hbCkuCisJICogTGFzdCBBQ0sgdXNlcyBiaXRzIDctNiAoY29udGludWUgc2VxdWVuY2UpLAorCSAqIGJpdHMgNS00IGFyZSBtZWFuaW5nZnVsICh3aGF0IGtpbmQgb2YgQUNLIHRvIHVzZSkuCisJICogQWx3YXlzIHNldCBMQVNUX1NFUSwgRU5EX1NFUS4KKwkgKi8KKwlmX2N0bCA9IG50b2gyNChyeF9maC0+ZmhfZl9jdGwpOworCWZfY3RsICY9IEZDX0ZDX0VYX0NUWCB8IEZDX0ZDX1NFUV9DVFggfAorCQlGQ19GQ19FTkRfQ09OTiB8IEZDX0ZDX1NFUV9JTklUIHwKKwkJRkNfRkNfUkVUWF9TRVEgfCBGQ19GQ19VTklfVFg7CisJZl9jdGwgXj0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfU0VRX0NUWDsKKwlmX2N0bCB8PSBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVE7CisJZl9jdGwgJj0gfkZDX0ZDX0ZJUlNUX1NFUTsKKwlodG9uMjQoZmgtPmZoX2ZfY3RsLCBmX2N0bCk7CisKKwlmcl9zb2YoZnApID0gZmNfc29mX2NsYXNzKGZyX3NvZihyeF9mcCkpOworCWZyX2VvZihmcCkgPSBGQ19FT0ZfVDsKKwlpZiAoZmNfc29mX25lZWRzX2Fjayhmcl9zb2YoZnApKSkKKwkJZnJfZW9mKGZwKSA9IEZDX0VPRl9OOworCisJKHZvaWQpIGxwLT50dC5mcmFtZV9zZW5kKGxwLCBmcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gaW5jb21pbmcgQUJUUy4gIFRoaXMgd291bGQgYmUgZm9yIHRhcmdldCBtb2RlIHVzdWFsbHksCisgKiBidXQgY291bGQgYmUgZHVlIHRvIGxvc3QgRkNQIHRyYW5zZmVyIHJlYWR5LCBjb25maXJtIG9yIFJSUS4KKyAqIFdlIGFsd2F5cyBoYW5kbGUgdGhpcyBhcyBhbiBleGNoYW5nZSBhYm9ydCwgaWdub3JpbmcgdGhlIHBhcmFtZXRlci4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9yZWN2X2FidHMoc3RydWN0IGZjX2V4Y2ggKmVwLCBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2JhX2FjYyAqYXA7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX3NlcSAqc3A7CisKKwlpZiAoIWVwKQorCQlnb3RvIHJlamVjdDsKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX0NPTVBMRVRFKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJCWdvdG8gcmVqZWN0OworCX0KKwlpZiAoIShlcC0+ZXNiX3N0YXQgJiBFU0JfU1RfUkVDX1FVQUwpKQorCQlmY19leGNoX2hvbGQoZXApOwkJLyogaG9sZCBmb3IgUkVDX1FVQUwgKi8KKwllcC0+ZXNiX3N0YXQgfD0gRVNCX1NUX0FCTk9STUFMIHwgRVNCX1NUX1JFQ19RVUFMOworCWZjX2V4Y2hfdGltZXJfc2V0X2xvY2tlZChlcCwgZXAtPnJfYV90b3YpOworCisJZnAgPSBmY19mcmFtZV9hbGxvYyhlcC0+bHAsIHNpemVvZigqYXApKTsKKwlpZiAoIWZwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJCWdvdG8gZnJlZTsKKwl9CisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlhcCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmFwKSk7CisJbWVtc2V0KGFwLCAwLCBzaXplb2YoKmFwKSk7CisJc3AgPSAmZXAtPnNlcTsKKwlhcC0+YmFfaGlnaF9zZXFfY250ID0gaHRvbnMoMHhmZmZmKTsKKwlpZiAoc3AtPnNzYl9zdGF0ICYgU1NCX1NUX1JFU1ApIHsKKwkJYXAtPmJhX3NlcV9pZCA9IHNwLT5pZDsKKwkJYXAtPmJhX3NlcV9pZF92YWwgPSBGQ19CQV9TRVFfSURfVkFMOworCQlhcC0+YmFfaGlnaF9zZXFfY250ID0gZmgtPmZoX3NlcV9jbnQ7CisJCWFwLT5iYV9sb3dfc2VxX2NudCA9IGh0b25zKHNwLT5jbnQpOworCX0KKwlzcCA9IGZjX3NlcV9zdGFydF9uZXh0KHNwKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCWZjX3NlcV9zZW5kX2xhc3Qoc3AsIGZwLCBGQ19SQ1RMX0JBX0FDQywgRkNfVFlQRV9CTFMpOworCWZjX2ZyYW1lX2ZyZWUocnhfZnApOworCXJldHVybjsKKworcmVqZWN0OgorCWZjX2V4Y2hfc2VuZF9iYV9yanQocnhfZnAsIEZDX0JBX1JKVF9VTkFCTEUsIEZDX0JBX1JKVF9JTlZfWElEKTsKK2ZyZWU6CisJZmNfZnJhbWVfZnJlZShyeF9mcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgcmVjZWl2ZSB3aGVyZSB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBzZXF1ZW5jZS4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9yZWN2X3JlcShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLAorCQkJICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJc3RydWN0IGZjX3NlcSAqc3AgPSBOVUxMOworCXN0cnVjdCBmY19leGNoICplcCA9IE5VTEw7CisJZW51bSBmY19zb2Ygc29mOworCWVudW0gZmNfZW9mIGVvZjsKKwl1MzIgZl9jdGw7CisJZW51bSBmY19wZl9yanRfcmVhc29uIHJlamVjdDsKKworCWZyX3NlcShmcCkgPSBOVUxMOworCXJlamVjdCA9IGZjX3NlcV9sb29rdXBfcmVjaXAobXAsIGZwKTsKKwlpZiAocmVqZWN0ID09IEZDX1JKVF9OT05FKSB7CisJCXNwID0gZnJfc2VxKGZwKTsJLyogc2VxdWVuY2Ugd2lsbCBiZSBoZWxkICovCisJCWVwID0gZmNfc2VxX2V4Y2goc3ApOworCQlzb2YgPSBmcl9zb2YoZnApOworCQllb2YgPSBmcl9lb2YoZnApOworCQlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOworCQlmY19zZXFfc2VuZF9hY2soc3AsIGZwKTsKKworCQkvKgorCQkgKiBDYWxsIHRoZSByZWNlaXZlIGZ1bmN0aW9uLgorCQkgKgorCQkgKiBUaGUgcmVjZWl2ZSBmdW5jdGlvbiBtYXkgYWxsb2NhdGUgYSBuZXcgc2VxdWVuY2UKKwkJICogb3ZlciB0aGUgb2xkIG9uZSwgc28gd2Ugc2hvdWxkbid0IGNoYW5nZSB0aGUKKwkJICogc2VxdWVuY2UgYWZ0ZXIgdGhpcy4KKwkJICoKKwkJICogVGhlIGZyYW1lIHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlY2VpdmUgZnVuY3Rpb24uCisJCSAqIElmIG5ldyBleGNoIHJlc3AgaGFuZGxlciBpcyB2YWxpZCB0aGVuIGNhbGwgdGhhdAorCQkgKiBmaXJzdC4KKwkJICovCisJCWlmIChlcC0+cmVzcCkKKwkJCWVwLT5yZXNwKHNwLCBmcCwgZXAtPmFyZyk7CisJCWVsc2UKKwkJCWxwLT50dC5scG9ydF9yZWN2KGxwLCBzcCwgZnApOworCQlmY19leGNoX3JlbGVhc2UoZXApOwkvKiByZWxlYXNlIGZyb20gbG9va3VwICovCisJfSBlbHNlIHsKKwkJRkNfREVCVUdfRVhDSCgiZXhjaC9zZXEgbG9va3VwIGZhaWxlZDogcmVqZWN0ICV4XG4iLCByZWplY3QpOworCQlmY19mcmFtZV9mcmVlKGZwKTsKKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgcmVjZWl2ZSB3aGVyZSB0aGUgb3RoZXIgZW5kIGlzIG9yaWdpbmF0aW5nIHRoZSBzZXF1ZW5jZSBpbgorICogcmVzcG9uc2UgdG8gb3VyIGV4Y2hhbmdlLgorICovCitzdGF0aWMgdm9pZCBmY19leGNoX3JlY3Zfc2VxX3Jlc3Aoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCXN0cnVjdCBmY19zZXEgKnNwOworCXN0cnVjdCBmY19leGNoICplcDsKKwllbnVtIGZjX3NvZiBzb2Y7CisJdTMyIGZfY3RsOworCXZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZyk7CisJdm9pZCAqZXhfcmVzcF9hcmc7CisJaW50IHJjOworCisJZXAgPSBmY19leGNoX2ZpbmQobXAsIG50b2hzKGZoLT5maF9veF9pZCkpOworCWlmICghZXApIHsKKwkJYXRvbWljX2luYygmbXAtPnN0YXRzLnhpZF9ub3RfZm91bmQpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGVwLT5yeGlkID09IEZDX1hJRF9VTktOT1dOKQorCQllcC0+cnhpZCA9IG50b2hzKGZoLT5maF9yeF9pZCk7CisJaWYgKGVwLT5zaWQgIT0gMCAmJiBlcC0+c2lkICE9IG50b2gyNChmaC0+ZmhfZF9pZCkpIHsKKwkJYXRvbWljX2luYygmbXAtPnN0YXRzLnhpZF9ub3RfZm91bmQpOworCQlnb3RvIHJlbDsKKwl9CisJaWYgKGVwLT5kaWQgIT0gbnRvaDI0KGZoLT5maF9zX2lkKSAmJgorCSAgICBlcC0+ZGlkICE9IEZDX0ZJRF9GTE9HSSkgeworCQlhdG9taWNfaW5jKCZtcC0+c3RhdHMueGlkX25vdF9mb3VuZCk7CisJCWdvdG8gcmVsOworCX0KKwlzb2YgPSBmcl9zb2YoZnApOworCWlmIChmY19zb2ZfaXNfaW5pdChzb2YpKSB7CisJCXNwID0gZmNfc2VxX3N0YXJ0X25leHQoJmVwLT5zZXEpOworCQlzcC0+aWQgPSBmaC0+Zmhfc2VxX2lkOworCQlzcC0+c3NiX3N0YXQgfD0gU1NCX1NUX1JFU1A7CisJfSBlbHNlIHsKKwkJc3AgPSAmZXAtPnNlcTsKKwkJaWYgKHNwLT5pZCAhPSBmaC0+Zmhfc2VxX2lkKSB7CisJCQlhdG9taWNfaW5jKCZtcC0+c3RhdHMuc2VxX25vdF9mb3VuZCk7CisJCQlnb3RvIHJlbDsKKwkJfQorCX0KKwlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOworCWZyX3NlcShmcCkgPSBzcDsKKwlpZiAoZl9jdGwgJiBGQ19GQ19TRVFfSU5JVCkKKwkJZXAtPmVzYl9zdGF0IHw9IEVTQl9TVF9TRVFfSU5JVDsKKworCWlmIChmY19zb2ZfbmVlZHNfYWNrKHNvZikpCisJCWZjX3NlcV9zZW5kX2FjayhzcCwgZnApOworCXJlc3AgPSBlcC0+cmVzcDsKKwlleF9yZXNwX2FyZyA9IGVwLT5hcmc7CisKKwlpZiAoZmgtPmZoX3R5cGUgIT0gRkNfVFlQRV9GQ1AgJiYgZnJfZW9mKGZwKSA9PSBGQ19FT0ZfVCAmJgorCSAgICAoZl9jdGwgJiAoRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VRKSkgPT0KKwkgICAgKEZDX0ZDX0xBU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJCXJjID0gZmNfZXhjaF9kb25lX2xvY2tlZChlcCk7CisJCVdBUk5fT04oZmNfc2VxX2V4Y2goc3ApICE9IGVwKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwkJaWYgKCFyYykKKwkJCWZjX2V4Y2hfbWdyX2RlbGV0ZV9lcChlcCk7CisJfQorCisJLyoKKwkgKiBDYWxsIHRoZSByZWNlaXZlIGZ1bmN0aW9uLgorCSAqIFRoZSBzZXF1ZW5jZSBpcyBoZWxkIChoYXMgYSByZWZjbnQpIGZvciB1cywKKwkgKiBidXQgbm90IGZvciB0aGUgcmVjZWl2ZSBmdW5jdGlvbi4KKwkgKgorCSAqIFRoZSByZWNlaXZlIGZ1bmN0aW9uIG1heSBhbGxvY2F0ZSBhIG5ldyBzZXF1ZW5jZQorCSAqIG92ZXIgdGhlIG9sZCBvbmUsIHNvIHdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlCisJICogc2VxdWVuY2UgYWZ0ZXIgdGhpcy4KKwkgKgorCSAqIFRoZSBmcmFtZSB3aWxsIGJlIGZyZWVkIGJ5IHRoZSByZWNlaXZlIGZ1bmN0aW9uLgorCSAqIElmIG5ldyBleGNoIHJlc3AgaGFuZGxlciBpcyB2YWxpZCB0aGVuIGNhbGwgdGhhdAorCSAqIGZpcnN0LgorCSAqLworCWlmIChyZXNwKQorCQlyZXNwKHNwLCBmcCwgZXhfcmVzcF9hcmcpOworCWVsc2UKKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJZmNfZXhjaF9yZWxlYXNlKGVwKTsKKwlyZXR1cm47CityZWw6CisJZmNfZXhjaF9yZWxlYXNlKGVwKTsKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK30KKworLyoKKyAqIEhhbmRsZSByZWNlaXZlIGZvciBhIHNlcXVlbmNlIHdoZXJlIG90aGVyIGVuZCBpcyByZXNwb25kaW5nIHRvIG91ciBzZXF1ZW5jZS4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9yZWN2X3Jlc3Aoc3RydWN0IGZjX2V4Y2hfbWdyICptcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfc2VxICpzcDsKKworCXNwID0gZmNfc2VxX2xvb2t1cF9vcmlnKG1wLCBmcCk7CS8qIGRvZXNuJ3QgaG9sZCBzZXF1ZW5jZSAqLworCWlmICghc3ApIHsKKwkJYXRvbWljX2luYygmbXAtPnN0YXRzLnhpZF9ub3RfZm91bmQpOworCQlGQ19ERUJVR19FWENIKCJzZXEgbG9va3VwIGZhaWxlZFxuIik7CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmbXAtPnN0YXRzLm5vbl9ibHNfcmVzcCk7CisJCUZDX0RFQlVHX0VYQ0goIm5vbi1CTFMgcmVzcG9uc2UgdG8gc2VxdWVuY2UiKTsKKwl9CisJZmNfZnJhbWVfZnJlZShmcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIHJlc3BvbnNlIHRvIGFuIEFCVFMgZm9yIGV4Y2hhbmdlIG9yIHNlcXVlbmNlLgorICogVGhpcyBjYW4gYmUgQkFfQUNDIG9yIEJBX1JKVC4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9hYnRzX3Jlc3Aoc3RydWN0IGZjX2V4Y2ggKmVwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZyk7CisJdm9pZCAqZXhfcmVzcF9hcmc7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX2JhX2FjYyAqYXA7CisJc3RydWN0IGZjX3NlcSAqc3A7CisJdTE2IGxvdzsKKwl1MTYgaGlnaDsKKwlpbnQgcmMgPSAxLCBoYXNfcmVjID0gMDsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJRkNfREVCVUdfRVhDSCgiZXhjaDogQkxTIHJjdGwgJXggLSAlc1xuIiwKKwkJICAgICAgZmgtPmZoX3JfY3RsLCBmY19leGNoX3JjdGxfbmFtZShmaC0+Zmhfcl9jdGwpKTsKKworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVwLT50aW1lb3V0X3dvcmspKQorCQlmY19leGNoX3JlbGVhc2UoZXApOwkvKiByZWxlYXNlIGZyb20gcGVuZGluZyB0aW1lciBob2xkICovCisKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlzd2l0Y2ggKGZoLT5maF9yX2N0bCkgeworCWNhc2UgRkNfUkNUTF9CQV9BQ0M6CisJCWFwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqYXApKTsKKwkJaWYgKCFhcCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIERlY2lkZSB3aGV0aGVyIHRvIGVzdGFibGlzaCBhIFJlY292ZXJ5IFF1YWxpZmllci4KKwkJICogV2UgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBTRVFfQ05UIHJhbmdlIGFuZAorCQkgKiBTRVFfSUQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3ZSBhYm9ydGVkLgorCQkgKi8KKwkJbG93ID0gbnRvaHMoYXAtPmJhX2xvd19zZXFfY250KTsKKwkJaGlnaCA9IG50b2hzKGFwLT5iYV9oaWdoX3NlcV9jbnQpOworCQlpZiAoKGVwLT5lc2Jfc3RhdCAmIEVTQl9TVF9SRUNfUVVBTCkgPT0gMCAmJgorCQkgICAgKGFwLT5iYV9zZXFfaWRfdmFsICE9IEZDX0JBX1NFUV9JRF9WQUwgfHwKKwkJICAgICBhcC0+YmFfc2VxX2lkID09IGVwLT5zZXFfaWQpICYmIGxvdyAhPSBoaWdoKSB7CisJCQllcC0+ZXNiX3N0YXQgfD0gRVNCX1NUX1JFQ19RVUFMOworCQkJZmNfZXhjaF9ob2xkKGVwKTsgIC8qIGhvbGQgZm9yIHJlY292ZXJ5IHF1YWxpZmllciAqLworCQkJaGFzX3JlYyA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBGQ19SQ1RMX0JBX1JKVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmVzcCA9IGVwLT5yZXNwOworCWV4X3Jlc3BfYXJnID0gZXAtPmFyZzsKKworCS8qIGRvIHdlIG5lZWQgdG8gZG8gc29tZSBvdGhlciBjaGVja3MgaGVyZS4gQ2FuIHdlIHJldXNlIG1vcmUgb2YKKwkgKiBmY19leGNoX3JlY3Zfc2VxX3Jlc3AKKwkgKi8KKwlzcCA9ICZlcC0+c2VxOworCS8qCisJICogZG8gd2Ugd2FudCB0byBjaGVjayBFTkRfU0VRIGFzIHdlbGwgYXMgTEFTVF9TRVEgaGVyZT8KKwkgKi8KKwlpZiAoZXAtPmZoX3R5cGUgIT0gRkNfVFlQRV9GQ1AgJiYKKwkgICAgbnRvaDI0KGZoLT5maF9mX2N0bCkgJiBGQ19GQ19MQVNUX1NFUSkKKwkJcmMgPSBmY19leGNoX2RvbmVfbG9ja2VkKGVwKTsKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCWlmICghcmMpCisJCWZjX2V4Y2hfbWdyX2RlbGV0ZV9lcChlcCk7CisKKwlpZiAocmVzcCkKKwkJcmVzcChzcCwgZnAsIGV4X3Jlc3BfYXJnKTsKKwllbHNlCisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCisJaWYgKGhhc19yZWMpCisJCWZjX2V4Y2hfdGltZXJfc2V0KGVwLCBlcC0+cl9hX3Rvdik7CisKK30KKworLyoKKyAqIFJlY2VpdmUgQkxTIHNlcXVlbmNlLgorICogVGhpcyBpcyBhbHdheXMgYSBzZXF1ZW5jZSBpbml0aWF0ZWQgYnkgdGhlIHJlbW90ZSBzaWRlLgorICogV2UgbWF5IGJlIGVpdGhlciB0aGUgb3JpZ2luYXRvciBvciByZWNpcGllbnQgb2YgdGhlIGV4Y2hhbmdlLgorICovCitzdGF0aWMgdm9pZCBmY19leGNoX3JlY3ZfYmxzKHN0cnVjdCBmY19leGNoX21nciAqbXAsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCXUzMiBmX2N0bDsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlmcl9zZXEoZnApID0gTlVMTDsKKworCWVwID0gZmNfZXhjaF9maW5kKG1wLCAoZl9jdGwgJiBGQ19GQ19FWF9DVFgpID8KKwkJCSAgbnRvaHMoZmgtPmZoX294X2lkKSA6IG50b2hzKGZoLT5maF9yeF9pZCkpOworCWlmIChlcCAmJiAoZl9jdGwgJiBGQ19GQ19TRVFfSU5JVCkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJCWVwLT5lc2Jfc3RhdCB8PSBFU0JfU1RfU0VRX0lOSVQ7CisJCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJfQorCWlmIChmX2N0bCAmIEZDX0ZDX1NFUV9DVFgpIHsKKwkJLyoKKwkJICogQSByZXNwb25zZSB0byBhIHNlcXVlbmNlIHdlIGluaXRpYXRlZC4KKwkJICogVGhpcyBzaG91bGQgb25seSBiZSBBQ0tzIGZvciBjbGFzcyAyIG9yIEYuCisJCSAqLworCQlzd2l0Y2ggKGZoLT5maF9yX2N0bCkgeworCQljYXNlIEZDX1JDVExfQUNLXzE6CisJCWNhc2UgRkNfUkNUTF9BQ0tfMDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRkNfREVCVUdfRVhDSCgiQkxTIHJjdGwgJXggLSAlcyByZWNlaXZlZCIsCisJCQkJICAgICAgZmgtPmZoX3JfY3RsLAorCQkJCSAgICAgIGZjX2V4Y2hfcmN0bF9uYW1lKGZoLT5maF9yX2N0bCkpOworCQkJYnJlYWs7CisJCX0KKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmaC0+Zmhfcl9jdGwpIHsKKwkJY2FzZSBGQ19SQ1RMX0JBX1JKVDoKKwkJY2FzZSBGQ19SQ1RMX0JBX0FDQzoKKwkJCWlmIChlcCkKKwkJCQlmY19leGNoX2FidHNfcmVzcChlcCwgZnApOworCQkJZWxzZQorCQkJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQkJYnJlYWs7CisJCWNhc2UgRkNfUkNUTF9CQV9BQlRTOgorCQkJZmNfZXhjaF9yZWN2X2FidHMoZXAsIGZwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkJCS8qIGlnbm9yZSBqdW5rICovCisJCQlmY19mcmFtZV9mcmVlKGZwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcCkKKwkJZmNfZXhjaF9yZWxlYXNlKGVwKTsJLyogcmVsZWFzZSBob2xkIHRha2VuIGJ5IGZjX2V4Y2hfZmluZCAqLworfQorCisvKgorICogQWNjZXB0IHNlcXVlbmNlIHdpdGggTFNfQUNDLgorICogSWYgdGhpcyBmYWlscyBkdWUgdG8gYWxsb2NhdGlvbiBvciB0cmFuc21pdCBjb25nZXN0aW9uLCBhc3N1bWUgdGhlCisgKiBvcmlnaW5hdG9yIHdpbGwgcmVwZWF0IHRoZSBzZXF1ZW5jZS4KKyAqLworc3RhdGljIHZvaWQgZmNfc2VxX2xzX2FjYyhzdHJ1Y3QgZmNfc2VxICpyZXFfc3ApCit7CisJc3RydWN0IGZjX3NlcSAqc3A7CisJc3RydWN0IGZjX2Vsc19sc19hY2MgKmFjYzsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCisJc3AgPSBmY19zZXFfc3RhcnRfbmV4dChyZXFfc3ApOworCWZwID0gZmNfZnJhbWVfYWxsb2MoZmNfc2VxX2V4Y2goc3ApLT5scCwgc2l6ZW9mKCphY2MpKTsKKwlpZiAoZnApIHsKKwkJYWNjID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqYWNjKSk7CisJCW1lbXNldChhY2MsIDAsIHNpemVvZigqYWNjKSk7CisJCWFjYy0+bGFfY21kID0gRUxTX0xTX0FDQzsKKwkJZmNfc2VxX3NlbmRfbGFzdChzcCwgZnAsIEZDX1JDVExfRUxTX1JFUCwgRkNfVFlQRV9FTFMpOworCX0KK30KKworLyoKKyAqIFJlamVjdCBzZXF1ZW5jZSB3aXRoIEVMUyBMU19SSlQuCisgKiBJZiB0aGlzIGZhaWxzIGR1ZSB0byBhbGxvY2F0aW9uIG9yIHRyYW5zbWl0IGNvbmdlc3Rpb24sIGFzc3VtZSB0aGUKKyAqIG9yaWdpbmF0b3Igd2lsbCByZXBlYXQgdGhlIHNlcXVlbmNlLgorICovCitzdGF0aWMgdm9pZCBmY19zZXFfbHNfcmp0KHN0cnVjdCBmY19zZXEgKnJlcV9zcCwgZW51bSBmY19lbHNfcmp0X3JlYXNvbiByZWFzb24sCisJCQkgIGVudW0gZmNfZWxzX3JqdF9leHBsYW4gZXhwbGFuKQoreworCXN0cnVjdCBmY19zZXEgKnNwOworCXN0cnVjdCBmY19lbHNfbHNfcmp0ICpyanQ7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKworCXNwID0gZmNfc2VxX3N0YXJ0X25leHQocmVxX3NwKTsKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGZjX3NlcV9leGNoKHNwKS0+bHAsIHNpemVvZigqcmp0KSk7CisJaWYgKGZwKSB7CisJCXJqdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJqdCkpOworCQltZW1zZXQocmp0LCAwLCBzaXplb2YoKnJqdCkpOworCQlyanQtPmVyX2NtZCA9IEVMU19MU19SSlQ7CisJCXJqdC0+ZXJfcmVhc29uID0gcmVhc29uOworCQlyanQtPmVyX2V4cGxhbiA9IGV4cGxhbjsKKwkJZmNfc2VxX3NlbmRfbGFzdChzcCwgZnAsIEZDX1JDVExfRUxTX1JFUCwgRkNfVFlQRV9FTFMpOworCX0KK30KKworc3RhdGljIHZvaWQgZmNfZXhjaF9yZXNldChzdHJ1Y3QgZmNfZXhjaCAqZXApCit7CisJc3RydWN0IGZjX3NlcSAqc3A7CisJdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7CisJdm9pZCAqYXJnOworCWludCByYyA9IDE7CisKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwllcC0+c3RhdGUgfD0gRkNfRVhfUlNUX0NMRUFOVVA7CisJLyoKKwkgKiB3ZSByZWFsbHkgd2FudCB0byBjYWxsIGRlbF90aW1lcl9zeW5jLCBidXQgY2Fubm90IGR1ZQorCSAqIHRvIHRoZSBscG9ydCBjYWxsaW5nIHdpdGggdGhlIGxwb3J0IGxvY2sgaGVsZCAoc29tZSByZXNwCisJICogZnVuY3Rpb25zIGNhbiBhbHNvIGdyYWIgdGhlIGxwb3J0IGxvY2sgd2hpY2ggY291bGQgY2F1c2UKKwkgKiBhIGRlYWRsb2NrKS4KKwkgKi8KKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZXAtPnRpbWVvdXRfd29yaykpCisJCWF0b21pY19kZWMoJmVwLT5leF9yZWZjbnQpOwkvKiBkcm9wIGhvbGQgZm9yIHRpbWVyICovCisJcmVzcCA9IGVwLT5yZXNwOworCWVwLT5yZXNwID0gTlVMTDsKKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1JFQ19RVUFMKQorCQlhdG9taWNfZGVjKCZlcC0+ZXhfcmVmY250KTsJLyogZHJvcCBob2xkIGZvciByZWNfcXVhbCAqLworCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1JFQ19RVUFMOworCWFyZyA9IGVwLT5hcmc7CisJc3AgPSAmZXAtPnNlcTsKKwlyYyA9IGZjX2V4Y2hfZG9uZV9sb2NrZWQoZXApOworCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJaWYgKCFyYykKKwkJZmNfZXhjaF9tZ3JfZGVsZXRlX2VwKGVwKTsKKworCWlmIChyZXNwKQorCQlyZXNwKHNwLCBFUlJfUFRSKC1GQ19FWF9DTE9TRUQpLCBhcmcpOworfQorCisvKgorICogUmVzZXQgYW4gZXhjaGFuZ2UgbWFuYWdlciwgcmVsZWFzaW5nIGFsbCBzZXF1ZW5jZXMgYW5kIGV4Y2hhbmdlcy4KKyAqIElmIHNpZCBpcyBub24temVybywgcmVzZXQgb25seSBleGNoYW5nZXMgd2Ugc291cmNlIGZyb20gdGhhdCBGSUQuCisgKiBJZiBkaWQgaXMgbm9uLXplcm8sIHJlc2V0IG9ubHkgZXhjaGFuZ2VzIGRlc3RpbmVkIHRvIHRoYXQgRklELgorICovCit2b2lkIGZjX2V4Y2hfbWdyX3Jlc2V0KHN0cnVjdCBmY19leGNoX21nciAqbXAsIHUzMiBzaWQsIHUzMiBkaWQpCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCXN0cnVjdCBmY19leGNoICpuZXh0OworCisJc3Bpbl9sb2NrX2JoKCZtcC0+ZW1fbG9jayk7CityZXN0YXJ0OgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlcCwgbmV4dCwgJm1wLT5leF9saXN0LCBleF9saXN0KSB7CisJCWlmICgoc2lkID09IDAgfHwgc2lkID09IGVwLT5zaWQpICYmCisJCSAgICAoZGlkID09IDAgfHwgZGlkID09IGVwLT5kaWQpKSB7CisJCQlmY19leGNoX2hvbGQoZXApOworCQkJc3Bpbl91bmxvY2tfYmgoJm1wLT5lbV9sb2NrKTsKKworCQkJZmNfZXhjaF9yZXNldChlcCk7CisKKwkJCWZjX2V4Y2hfcmVsZWFzZShlcCk7CisJCQlzcGluX2xvY2tfYmgoJm1wLT5lbV9sb2NrKTsKKworCQkJLyoKKwkJCSAqIG11c3QgcmVzdGFydCBsb29wIGluY2FzZSB3aGlsZSBsb2NrIHdhcyBkb3duCisJCQkgKiBtdWx0aXBsZSBlcHMgd2VyZSByZWxlYXNlZC4KKwkJCSAqLworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZtcC0+ZW1fbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfbWdyX3Jlc2V0KTsKKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyBFTFMgUkVDIC0gUmVhZCBFeGNoYW5nZSBDb25jaXNlLgorICogTm90ZSB0aGF0IHRoZSByZXF1ZXN0aW5nIHBvcnQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBTX0lEIGluIHRoZSByZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZCBmY19leGNoX2Vsc19yZWMoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqcmZwKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCXN0cnVjdCBmY19leGNoX21nciAqZW07CisJc3RydWN0IGZjX2Vsc19yZWMgKnJwOworCXN0cnVjdCBmY19lbHNfcmVjX2FjYyAqYWNjOworCWVudW0gZmNfZWxzX3JqdF9yZWFzb24gcmVhc29uID0gRUxTX1JKVF9MT0dJQzsKKwllbnVtIGZjX2Vsc19yanRfZXhwbGFuIGV4cGxhbjsKKwl1MzIgc2lkOworCXUxNiByeGlkOworCXUxNiBveGlkOworCisJcnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChyZnAsIHNpemVvZigqcnApKTsKKwlleHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOworCWlmICghcnApCisJCWdvdG8gcmVqZWN0OworCXNpZCA9IG50b2gyNChycC0+cmVjX3NfaWQpOworCXJ4aWQgPSBudG9ocyhycC0+cmVjX3J4X2lkKTsKKwlveGlkID0gbnRvaHMocnAtPnJlY19veF9pZCk7CisKKwkvKgorCSAqIEN1cnJlbnRseSBpdCdzIGhhcmQgdG8gZmluZCB0aGUgbG9jYWwgU19JRCBmcm9tIHRoZSBleGNoYW5nZQorCSAqIG1hbmFnZXIuICBUaGlzIHdpbGwgZXZlbnR1YWxseSBiZSBmaXhlZCwgYnV0IGZvciBub3cgaXQncyBlYXNpZXIKKwkgKiB0byBsb29rdXAgdGhlIHN1YmplY3QgZXhjaGFuZ2UgdHdpY2UsIG9uY2UgYXMgaWYgd2Ugd2VyZQorCSAqIHRoZSBpbml0aWF0b3IsIGFuZCB0aGVuIGFnYWluIGlmIHdlIHdlcmVuJ3QuCisJICovCisJZW0gPSBmY19zZXFfZXhjaChzcCktPmVtOworCWVwID0gZmNfZXhjaF9maW5kKGVtLCBveGlkKTsKKwlleHBsYW4gPSBFTFNfRVhQTF9PWElEX1JYSUQ7CisJaWYgKGVwICYmIGVwLT5vaWQgPT0gc2lkKSB7CisJCWlmIChlcC0+cnhpZCAhPSBGQ19YSURfVU5LTk9XTiAmJgorCQkgICAgcnhpZCAhPSBGQ19YSURfVU5LTk9XTiAmJgorCQkgICAgZXAtPnJ4aWQgIT0gcnhpZCkKKwkJCWdvdG8gcmVsOworCX0gZWxzZSB7CisJCWlmIChlcCkKKwkJCWZjX2V4Y2hfcmVsZWFzZShlcCk7CisJCWVwID0gTlVMTDsKKwkJaWYgKHJ4aWQgIT0gRkNfWElEX1VOS05PV04pCisJCQllcCA9IGZjX2V4Y2hfZmluZChlbSwgcnhpZCk7CisJCWlmICghZXApCisJCQlnb3RvIHJlamVjdDsKKwl9CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGZjX3NlcV9leGNoKHNwKS0+bHAsIHNpemVvZigqYWNjKSk7CisJaWYgKCFmcCkgeworCQlmY19leGNoX2RvbmUoc3ApOworCQlnb3RvIG91dDsKKwl9CisJc3AgPSBmY19zZXFfc3RhcnRfbmV4dChzcCk7CisJYWNjID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqYWNjKSk7CisJbWVtc2V0KGFjYywgMCwgc2l6ZW9mKCphY2MpKTsKKwlhY2MtPnJlY2FfY21kID0gRUxTX0xTX0FDQzsKKwlhY2MtPnJlY2Ffb3hfaWQgPSBycC0+cmVjX294X2lkOworCW1lbWNweShhY2MtPnJlY2Ffb2ZpZCwgcnAtPnJlY19zX2lkLCAzKTsKKwlhY2MtPnJlY2FfcnhfaWQgPSBodG9ucyhlcC0+cnhpZCk7CisJaWYgKGVwLT5zaWQgPT0gZXAtPm9pZCkKKwkJaHRvbjI0KGFjYy0+cmVjYV9yZmlkLCBlcC0+ZGlkKTsKKwllbHNlCisJCWh0b24yNChhY2MtPnJlY2FfcmZpZCwgZXAtPnNpZCk7CisJYWNjLT5yZWNhX2ZjNHZhbHVlID0gaHRvbmwoZXAtPnNlcS5yZWNfZGF0YSk7CisJYWNjLT5yZWNhX2Vfc3RhdCA9IGh0b25sKGVwLT5lc2Jfc3RhdCAmIChFU0JfU1RfUkVTUCB8CisJCQkJCQkgRVNCX1NUX1NFUV9JTklUIHwKKwkJCQkJCSBFU0JfU1RfQ09NUExFVEUpKTsKKwlzcCA9IGZjX3NlcV9zdGFydF9uZXh0KHNwKTsKKwlmY19zZXFfc2VuZF9sYXN0KHNwLCBmcCwgRkNfUkNUTF9FTFNfUkVQLCBGQ19UWVBFX0VMUyk7CitvdXQ6CisJZmNfZXhjaF9yZWxlYXNlKGVwKTsKKwlmY19mcmFtZV9mcmVlKHJmcCk7CisJcmV0dXJuOworCityZWw6CisJZmNfZXhjaF9yZWxlYXNlKGVwKTsKK3JlamVjdDoKKwlmY19zZXFfbHNfcmp0KHNwLCByZWFzb24sIGV4cGxhbik7CisJZmNfZnJhbWVfZnJlZShyZnApOworfQorCisvKgorICogSGFuZGxlIHJlc3BvbnNlIGZyb20gUlJRLgorICogTm90IG11Y2ggdG8gZG8gaGVyZSwgcmVhbGx5LgorICogU2hvdWxkIHJlcG9ydCBlcnJvcnMuCisgKgorICogVE9ETzogZml4IGVycm9yIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2V4Y2hfcnJxX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqYWJvcnRlZF9lcCA9IGFyZzsKKwl1bnNpZ25lZCBpbnQgb3A7CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlpbnQgZXJyID0gUFRSX0VSUihmcCk7CisKKwkJaWYgKGVyciA9PSAtRkNfRVhfQ0xPU0VEKQorCQkJZ290byBjbGVhbnVwOworCQlGQ19EQkcoIkNhbm5vdCBwcm9jZXNzIFJSUSwgYmVjYXVzZSBvZiBmcmFtZSBlcnJvciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCW9wID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CisJZmNfZnJhbWVfZnJlZShmcCk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBFTFNfTFNfUkpUOgorCQlGQ19EQkcoIkxTX1JKVCBmb3IgUlJRIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRUxTX0xTX0FDQzoKKwkJZ290byBjbGVhbnVwOworCWRlZmF1bHQ6CisJCUZDX0RCRygidW5leHBlY3RlZCByZXNwb25zZSBvcCAleCBmb3IgUlJRIiwgb3ApOworCQlyZXR1cm47CisJfQorCitjbGVhbnVwOgorCWZjX2V4Y2hfZG9uZSgmYWJvcnRlZF9lcC0+c2VxKTsKKwkvKiBkcm9wIGhvbGQgZm9yIHJlYyBxdWFsICovCisJZmNfZXhjaF9yZWxlYXNlKGFib3J0ZWRfZXApOworfQorCisvKgorICogU2VuZCBFTFMgUlJRIC0gUmVpbnN0YXRlIFJlY292ZXJ5IFF1YWxpZmllci4KKyAqIFRoaXMgdGVsbHMgdGhlIHJlbW90ZSBwb3J0IHRvIHN0b3AgYmxvY2tpbmcgdGhlIHVzZSBvZgorICogdGhlIGV4Y2hhbmdlIGFuZCB0aGUgc2VxX2NudCByYW5nZS4KKyAqLworc3RhdGljIHZvaWQgZmNfZXhjaF9ycnEoc3RydWN0IGZjX2V4Y2ggKmVwKQoreworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjX2Vsc19ycnEgKnJycTsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19zZXEgKnJycV9zcDsKKwl1MzIgZGlkOworCisJbHAgPSBlcC0+bHA7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCBzaXplb2YoKnJycSkpOworCWlmICghZnApCisJCXJldHVybjsKKwlycnEgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpycnEpKTsKKwltZW1zZXQocnJxLCAwLCBzaXplb2YoKnJycSkpOworCXJycS0+cnJxX2NtZCA9IEVMU19SUlE7CisJaHRvbjI0KHJycS0+cnJxX3NfaWQsIGVwLT5zaWQpOworCXJycS0+cnJxX294X2lkID0gaHRvbnMoZXAtPm94aWQpOworCXJycS0+cnJxX3J4X2lkID0gaHRvbnMoZXAtPnJ4aWQpOworCisJZGlkID0gZXAtPmRpZDsKKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1JFU1ApCisJCWRpZCA9IGVwLT5zaWQ7CisKKwlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVRLCBkaWQsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHAtPmhvc3QpLCBGQ19UWVBFX0VMUywKKwkJICAgICAgIEZDX0ZDX0ZJUlNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CisKKwlycnFfc3AgPSBmY19leGNoX3NlcV9zZW5kKGxwLCBmcCwgZmNfZXhjaF9ycnFfcmVzcCwgTlVMTCwgZXAsCisJCQkJICBscC0+ZV9kX3Rvdik7CisJaWYgKCFycnFfc3ApIHsKKwkJZXAtPmVzYl9zdGF0IHw9IEVTQl9TVF9SRUNfUVVBTDsKKwkJZmNfZXhjaF90aW1lcl9zZXRfbG9ja2VkKGVwLCBlcC0+cl9hX3Rvdik7CisJCXJldHVybjsKKwl9Cit9CisKKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyBFTFMgUlJRIC0gUmVzZXQgUmVjb3ZlcnkgUXVhbGlmaWVyLgorICovCitzdGF0aWMgdm9pZCBmY19leGNoX2Vsc19ycnEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2V4Y2ggKmVwOwkJLyogcmVxdWVzdCBvciBzdWJqZWN0IGV4Y2hhbmdlICovCisJc3RydWN0IGZjX2Vsc19ycnEgKnJwOworCXUzMiBzaWQ7CisJdTE2IHhpZDsKKwllbnVtIGZjX2Vsc19yanRfZXhwbGFuIGV4cGxhbjsKKworCXJwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcnApKTsKKwlleHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOworCWlmICghcnApCisJCWdvdG8gcmVqZWN0OworCisJLyoKKwkgKiBsb29rdXAgc3ViamVjdCBleGNoYW5nZS4KKwkgKi8KKwllcCA9IGZjX3NlcV9leGNoKHNwKTsKKwlzaWQgPSBudG9oMjQocnAtPnJycV9zX2lkKTsJCS8qIHN1YmplY3Qgc291cmNlICovCisJeGlkID0gZXAtPmRpZCA9PSBzaWQgPyBudG9ocyhycC0+cnJxX294X2lkKSA6IG50b2hzKHJwLT5ycnFfcnhfaWQpOworCWVwID0gZmNfZXhjaF9maW5kKGVwLT5lbSwgeGlkKTsKKworCWV4cGxhbiA9IEVMU19FWFBMX09YSURfUlhJRDsKKwlpZiAoIWVwKQorCQlnb3RvIHJlamVjdDsKKwlzcGluX2xvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlpZiAoZXAtPm94aWQgIT0gbnRvaHMocnAtPnJycV9veF9pZCkpCisJCWdvdG8gdW5sb2NrX3JlamVjdDsKKwlpZiAoZXAtPnJ4aWQgIT0gbnRvaHMocnAtPnJycV9yeF9pZCkgJiYKKwkgICAgZXAtPnJ4aWQgIT0gRkNfWElEX1VOS05PV04pCisJCWdvdG8gdW5sb2NrX3JlamVjdDsKKwlleHBsYW4gPSBFTFNfRVhQTF9TSUQ7CisJaWYgKGVwLT5zaWQgIT0gc2lkKQorCQlnb3RvIHVubG9ja19yZWplY3Q7CisKKwkvKgorCSAqIENsZWFyIFJlY292ZXJ5IFF1YWxpZmllciBzdGF0ZSwgYW5kIGNhbmNlbCB0aW1lciBpZiBjb21wbGV0ZS4KKwkgKi8KKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX1JFQ19RVUFMKSB7CisJCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1JFQ19RVUFMOworCQlhdG9taWNfZGVjKCZlcC0+ZXhfcmVmY250KTsJLyogZHJvcCBob2xkIGZvciByZWMgcXVhbCAqLworCX0KKwlpZiAoZXAtPmVzYl9zdGF0ICYgRVNCX1NUX0NPTVBMRVRFKSB7CisJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZlcC0+dGltZW91dF93b3JrKSkKKwkJCWF0b21pY19kZWMoJmVwLT5leF9yZWZjbnQpOwkvKiBkcm9wIHRpbWVyIGhvbGQgKi8KKwl9CisKKwlzcGluX3VubG9ja19iaCgmZXAtPmV4X2xvY2spOworCisJLyoKKwkgKiBTZW5kIExTX0FDQy4KKwkgKi8KKwlmY19zZXFfbHNfYWNjKHNwKTsKKwlmY19mcmFtZV9mcmVlKGZwKTsKKwlyZXR1cm47CisKK3VubG9ja19yZWplY3Q6CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlmY19leGNoX3JlbGVhc2UoZXApOwkvKiBkcm9wIGhvbGQgZnJvbSBmY19leGNoX2ZpbmQgKi8KK3JlamVjdDoKKwlmY19zZXFfbHNfcmp0KHNwLCBFTFNfUkpUX0xPR0lDLCBleHBsYW4pOworCWZjX2ZyYW1lX2ZyZWUoZnApOworfQorCitzdHJ1Y3QgZmNfZXhjaF9tZ3IgKmZjX2V4Y2hfbWdyX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqbHAsCisJCQkJICAgICAgZW51bSBmY19jbGFzcyBjbGFzcywKKwkJCQkgICAgICB1MTYgbWluX3hpZCwgdTE2IG1heF94aWQpCit7CisJc3RydWN0IGZjX2V4Y2hfbWdyICptcDsKKwlzaXplX3QgbGVuOworCisJaWYgKG1heF94aWQgPD0gbWluX3hpZCB8fCBtaW5feGlkID09IDAgfHwgbWF4X3hpZCA9PSBGQ19YSURfVU5LTk9XTikgeworCQlGQ19EQkcoIkludmFsaWQgbWluX3hpZCAweDoleCBhbmQgbWF4X3hpZCAweDoleFxuIiwKKwkJICAgICAgIG1pbl94aWQsIG1heF94aWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIE1lbW9yeSBuZWVkIGZvciBFTQorCSAqLworI2RlZmluZSB4aWRfb2soaSwgbTEsIG0yKSAoKChpKSA+PSAobTEpKSAmJiAoKGkpIDw9IChtMikpKQorCWxlbiA9IChtYXhfeGlkIC0gbWluX3hpZCArIDEpICogKHNpemVvZihzdHJ1Y3QgZmNfZXhjaCAqKSk7CisJbGVuICs9IHNpemVvZihzdHJ1Y3QgZmNfZXhjaF9tZ3IpOworCisJbXAgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFtcCkKKwkJcmV0dXJuIE5VTEw7CisKKwltcC0+Y2xhc3MgPSBjbGFzczsKKwltcC0+dG90YWxfZXhjaGVzID0gMDsKKwltcC0+ZXhjaGVzID0gKHN0cnVjdCBmY19leGNoICoqKShtcCArIDEpOworCW1wLT5scCA9IGxwOworCS8qIGFkanVzdCBlbSBleGNoIHhpZCByYW5nZSBmb3Igb2ZmbG9hZCAqLworCW1wLT5taW5feGlkID0gbWluX3hpZDsKKwltcC0+bWF4X3hpZCA9IG1heF94aWQ7CisJbXAtPmxhc3RfeGlkID0gbWluX3hpZCAtIDE7CisJbXAtPm1heF9yZWFkID0gMDsKKwltcC0+bGFzdF9yZWFkID0gMDsKKwlpZiAobHAtPmxyb19lbmFibGVkICYmIHhpZF9vayhscC0+bHJvX3hpZCwgbWluX3hpZCwgbWF4X3hpZCkpIHsKKwkJbXAtPm1heF9yZWFkID0gbHAtPmxyb194aWQ7CisJCW1wLT5sYXN0X3JlYWQgPSBtaW5feGlkIC0gMTsKKwkJbXAtPmxhc3RfeGlkID0gbXAtPm1heF9yZWFkOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgbHJvIGlmIG5vIHhpZCBjb250cm9sIG92ZXIgcmVhZCAqLworCQlscC0+bHJvX2VuYWJsZWQgPSAwOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZtcC0+ZXhfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJm1wLT5lbV9sb2NrKTsKKworCW1wLT5lcF9wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKDIsIGZjX2VtX2NhY2hlcCk7CisJaWYgKCFtcC0+ZXBfcG9vbCkKKwkJZ290byBmcmVlX21wOworCisJcmV0dXJuIG1wOworCitmcmVlX21wOgorCWtmcmVlKG1wKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZXhjaF9tZ3JfYWxsb2MpOworCit2b2lkIGZjX2V4Y2hfbWdyX2ZyZWUoc3RydWN0IGZjX2V4Y2hfbWdyICptcCkKK3sKKwlXQVJOX09OKCFtcCk7CisJLyoKKwkgKiBUaGUgdG90YWwgZXhjaCBjb3VudCBtdXN0IGJlIHplcm8KKwkgKiBiZWZvcmUgZnJlZWluZyBleGNoYW5nZSBtYW5hZ2VyLgorCSAqLworCVdBUk5fT04obXAtPnRvdGFsX2V4Y2hlcyAhPSAwKTsKKwltZW1wb29sX2Rlc3Ryb3kobXAtPmVwX3Bvb2wpOworCWtmcmVlKG1wKTsKK30KK0VYUE9SVF9TWU1CT0woZmNfZXhjaF9tZ3JfZnJlZSk7CisKK3N0cnVjdCBmY19leGNoICpmY19leGNoX2dldChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCWlmICghbHAgfHwgIWxwLT5lbXApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZjX2V4Y2hfYWxsb2MobHAtPmVtcCwgZnAsIDApOworfQorRVhQT1JUX1NZTUJPTChmY19leGNoX2dldCk7CisKK3N0cnVjdCBmY19zZXEgKmZjX2V4Y2hfc2VxX3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscCwKKwkJCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCXZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosCisJCQkJCSAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkJICAgICB2b2lkICphcmcpLAorCQkJCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICosIHZvaWQgKiksCisJCQkJdm9pZCAqYXJnLCB1MzIgdGltZXJfbXNlYykKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IGZjX3NlcSAqc3AgPSBOVUxMOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCWludCByYyA9IDE7CisKKwllcCA9IGxwLT50dC5leGNoX2dldChscCwgZnApOworCWlmICghZXApIHsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJCXJldHVybiBOVUxMOworCX0KKwllcC0+ZXNiX3N0YXQgfD0gRVNCX1NUX1NFUV9JTklUOworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJZmNfZXhjaF9zZXRfYWRkcihlcCwgbnRvaDI0KGZoLT5maF9zX2lkKSwgbnRvaDI0KGZoLT5maF9kX2lkKSk7CisJZXAtPnJlc3AgPSByZXNwOworCWVwLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKKwllcC0+YXJnID0gYXJnOworCWVwLT5yX2FfdG92ID0gRkNfREVGX1JfQV9UT1Y7CisJZXAtPmxwID0gbHA7CisJc3AgPSAmZXAtPnNlcTsKKworCWVwLT5maF90eXBlID0gZmgtPmZoX3R5cGU7IC8qIHNhdmUgZm9yIHBvc3NiaWxlIHRpbWVvdXQgaGFuZGxpbmcgKi8KKwllcC0+Zl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwlmY19leGNoX3NldHVwX2hkcihlcCwgZnAsIGVwLT5mX2N0bCk7CisJc3AtPmNudCsrOworCisJaWYgKHVubGlrZWx5KGxwLT50dC5mcmFtZV9zZW5kKGxwLCBmcCkpKQorCQlnb3RvIGVycjsKKworCWlmICh0aW1lcl9tc2VjKQorCQlmY19leGNoX3RpbWVyX3NldF9sb2NrZWQoZXAsIHRpbWVyX21zZWMpOworCWVwLT5mX2N0bCAmPSB+RkNfRkNfRklSU1RfU0VROwkvKiBub3QgZmlyc3Qgc2VxICovCisKKwlpZiAoZXAtPmZfY3RsICYgRkNfRkNfU0VRX0lOSVQpCisJCWVwLT5lc2Jfc3RhdCAmPSB+RVNCX1NUX1NFUV9JTklUOworCXNwaW5fdW5sb2NrX2JoKCZlcC0+ZXhfbG9jayk7CisJcmV0dXJuIHNwOworZXJyOgorCXJjID0gZmNfZXhjaF9kb25lX2xvY2tlZChlcCk7CisJc3Bpbl91bmxvY2tfYmgoJmVwLT5leF9sb2NrKTsKKwlpZiAoIXJjKQorCQlmY19leGNoX21ncl9kZWxldGVfZXAoZXApOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChmY19leGNoX3NlcV9zZW5kKTsKKworLyoKKyAqIFJlY2VpdmUgYSBmcmFtZQorICovCit2b2lkIGZjX2V4Y2hfcmVjdihzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLAorCQkgIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwl1MzIgZl9jdGw7CisKKwkvKiBscG9ydCBsb2NrID8gKi8KKwlpZiAoIWxwIHx8ICFtcCB8fCAobHAtPnN0YXRlID09IExQT1JUX1NUX05PTkUpKSB7CisJCUZDX0RCRygiZmNfbHBvcnQgb3IgRU0gaXMgbm90IGFsbG9jYXRlZCBhbmQgY29uZmlndXJlZCIpOworCQlmY19mcmFtZV9mcmVlKGZwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgZnJhbWUgaXMgbWFya2VkIGludmFsaWQsIGp1c3QgZHJvcCBpdC4KKwkgKi8KKwlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOworCXN3aXRjaCAoZnJfZW9mKGZwKSkgeworCWNhc2UgRkNfRU9GX1Q6CisJCWlmIChmX2N0bCAmIEZDX0ZDX0VORF9TRVEpCisJCQlza2JfdHJpbShmcF9za2IoZnApLCBmcl9sZW4oZnApIC0gRkNfRkNfRklMTChmX2N0bCkpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEZDX0VPRl9OOgorCQlpZiAoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9CTFMpCisJCQlmY19leGNoX3JlY3ZfYmxzKG1wLCBmcCk7CisJCWVsc2UgaWYgKChmX2N0bCAmIChGQ19GQ19FWF9DVFggfCBGQ19GQ19TRVFfQ1RYKSkgPT0KKwkJCSBGQ19GQ19FWF9DVFgpCisJCQlmY19leGNoX3JlY3Zfc2VxX3Jlc3AobXAsIGZwKTsKKwkJZWxzZSBpZiAoZl9jdGwgJiBGQ19GQ19TRVFfQ1RYKQorCQkJZmNfZXhjaF9yZWN2X3Jlc3AobXAsIGZwKTsKKwkJZWxzZQorCQkJZmNfZXhjaF9yZWN2X3JlcShscCwgbXAsIGZwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRkNfREJHKCJkcm9wcGluZyBpbnZhbGlkIGZyYW1lIChlb2YgJXgpIiwgZnJfZW9mKGZwKSk7CisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGZjX2V4Y2hfcmVjdik7CisKK2ludCBmY19leGNoX2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlpZiAoIWxwLT50dC5leGNoX2dldCkgeworCQkvKgorCQkgKiAgZXhjaF9wdXQoKSBzaG91bGQgYmUgTlVMTCBpZgorCQkgKiAgZXhjaF9nZXQoKSBpcyBOVUxMCisJCSAqLworCQlXQVJOX09OKGxwLT50dC5leGNoX3B1dCk7CisJCWxwLT50dC5leGNoX2dldCA9IGZjX2V4Y2hfZ2V0OworCX0KKworCWlmICghbHAtPnR0LnNlcV9zdGFydF9uZXh0KQorCQlscC0+dHQuc2VxX3N0YXJ0X25leHQgPSBmY19zZXFfc3RhcnRfbmV4dDsKKworCWlmICghbHAtPnR0LmV4Y2hfc2VxX3NlbmQpCisJCWxwLT50dC5leGNoX3NlcV9zZW5kID0gZmNfZXhjaF9zZXFfc2VuZDsKKworCWlmICghbHAtPnR0LnNlcV9zZW5kKQorCQlscC0+dHQuc2VxX3NlbmQgPSBmY19zZXFfc2VuZDsKKworCWlmICghbHAtPnR0LnNlcV9lbHNfcnNwX3NlbmQpCisJCWxwLT50dC5zZXFfZWxzX3JzcF9zZW5kID0gZmNfc2VxX2Vsc19yc3Bfc2VuZDsKKworCWlmICghbHAtPnR0LmV4Y2hfZG9uZSkKKwkJbHAtPnR0LmV4Y2hfZG9uZSA9IGZjX2V4Y2hfZG9uZTsKKworCWlmICghbHAtPnR0LmV4Y2hfbWdyX3Jlc2V0KQorCQlscC0+dHQuZXhjaF9tZ3JfcmVzZXQgPSBmY19leGNoX21ncl9yZXNldDsKKworCWlmICghbHAtPnR0LnNlcV9leGNoX2Fib3J0KQorCQlscC0+dHQuc2VxX2V4Y2hfYWJvcnQgPSBmY19zZXFfZXhjaF9hYm9ydDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19leGNoX2luaXQpOworCitpbnQgZmNfc2V0dXBfZXhjaF9tZ3Iodm9pZCkKK3sKKwlmY19lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGliZmNfZW0iLCBzaXplb2Yoc3RydWN0IGZjX2V4Y2gpLAorCQkJCQkgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWZjX2VtX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmNfZGVzdHJveV9leGNoX21ncih2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShmY19lbV9jYWNoZXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGU2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKQEAgLTAsMCArMSwyMTMxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDggTWlrZSBDaHJpc3RpZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKworI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmMyLmg+CisKKyNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CisjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KKworTU9EVUxFX0FVVEhPUigiT3Blbi1GQ29FLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsaWJmYyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGZjX2ZjcF9kZWJ1ZzsKKworI2RlZmluZSBGQ19ERUJVR19GQ1AoZm10Li4uKQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChmY19mY3BfZGVidWcpCQlcCisJCQlGQ19EQkcoZm10KTsJCVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNjc2lfcGt0X2NhY2hlcDsKKworLyogU1JCIHN0YXRlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZDX1NSQl9GUkVFCQkwCQkvKiBjbWQgaXMgZnJlZSAqLworI2RlZmluZSBGQ19TUkJfQ01EX1NFTlQJCSgxIDw8IDApCS8qIGNtZCBoYXMgYmVlbiBzZW50ICovCisjZGVmaW5lIEZDX1NSQl9SQ1ZfU1RBVFVTCSgxIDw8IDEpCS8qIHJlc3BvbnNlIGhhcyBhcnJpdmVkICovCisjZGVmaW5lIEZDX1NSQl9BQk9SVF9QRU5ESU5HCSgxIDw8IDIpCS8qIGNtZCBhYm9ydCBzZW50IHRvIGRldmljZSAqLworI2RlZmluZSBGQ19TUkJfQUJPUlRFRAkJKDEgPDwgMykJLyogYWJvcnQgYWNrbm93bGVnZWQgKi8KKyNkZWZpbmUgRkNfU1JCX0RJU0NPTlRJRwkoMSA8PCA0KQkvKiBub24tc2VxdWVudGlhbCBkYXRhIHJlY3ZkICovCisjZGVmaW5lIEZDX1NSQl9DT01QTAkJKDEgPDwgNSkJLyogZmNfaW9fY29tcGwgaGFzIGJlZW4gcnVuICovCisjZGVmaW5lIEZDX1NSQl9GQ1BfUFJPQ0VTU0lOR19UTU8gKDEgPDwgNikJLyogdGltZXIgZnVuY3Rpb24gcHJvY2Vzc2luZyAqLworI2RlZmluZSBGQ19TUkJfTk9NRU0JCSgxIDw8IDcpCS8qIGRyb3BwZWQgdG8gb3V0IG9mIG1lbSAqLworCisjZGVmaW5lIEZDX1NSQl9SRUFECQkoMSA8PCAxKQorI2RlZmluZSBGQ19TUkJfV1JJVEUJCSgxIDw8IDApCisKKy8qCisgKiBUaGUgU0NwLnB0ciBzaG91bGQgYmUgdGVzdGVkIGFuZCBzZXQgdW5kZXIgdGhlIGhvc3QgbG9jay4gTlVMTCBpbmRpY2F0ZXMKKyAqIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gcmV0cnVuZWQgdG8gdGhlIHNjc2kgbGF5ZXIuCisgKi8KKyNkZWZpbmUgQ01EX1NQKENtbmQpCQkgICAgKChzdHJ1Y3QgZmNfZmNwX3BrdCAqKShDbW5kKS0+U0NwLnB0cikKKyNkZWZpbmUgQ01EX0VOVFJZX1NUQVRVUyhDbW5kKQkgICAgKChDbW5kKS0+U0NwLmhhdmVfZGF0YV9pbikKKyNkZWZpbmUgQ01EX0NPTVBMX1NUQVRVUyhDbW5kKQkgICAgKChDbW5kKS0+U0NwLnRoaXNfcmVzaWR1YWwpCisjZGVmaW5lIENNRF9TQ1NJX1NUQVRVUyhDbW5kKQkgICAgKChDbW5kKS0+U0NwLlN0YXR1cykKKyNkZWZpbmUgQ01EX1JFU0lEX0xFTihDbW5kKQkgICAgKChDbW5kKS0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpCisKK3N0cnVjdCBmY19mY3BfaW50ZXJuYWwgeworCW1lbXBvb2xfdAkqc2NzaV9wa3RfcG9vbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNjc2lfcGt0X3F1ZXVlOworCXU4CQl0aHJvdHRsZWQ7Cit9OworCisjZGVmaW5lIGZjX2dldF9zY3NpX2ludGVybmFsKHgpCSgoc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqKSh4KS0+c2NzaV9wcml2KQorCisvKgorICogZnVuY3Rpb24gcHJvdG90eXBlcworICogRkMgc2NzaSBJL08gcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX3JlY3ZfZGF0YShzdHJ1Y3QgZmNfZmNwX3BrdCAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CitzdGF0aWMgdm9pZCBmY19mY3BfcmVjdihzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqLCB2b2lkICopOworc3RhdGljIHZvaWQgZmNfZmNwX3Jlc3Aoc3RydWN0IGZjX2ZjcF9wa3QgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChzdHJ1Y3QgZmNfZmNwX3BrdCAqKTsKK3N0YXRpYyB2b2lkIGZjX3RtX2RvbmUoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIGZjX2ZjcF9lcnJvcihzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKK3N0YXRpYyB2b2lkIGZjX3RpbWVvdXRfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKik7CitzdGF0aWMgdm9pZCBmY19mY3BfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZmNfZmNwX3JlYyhzdHJ1Y3QgZmNfZmNwX3BrdCAqKTsKK3N0YXRpYyB2b2lkIGZjX2ZjcF9yZWNfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfZmNwX3JlY19yZXNwKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7CitzdGF0aWMgdm9pZCBmY19pb19jb21wbChzdHJ1Y3QgZmNfZmNwX3BrdCAqKTsKKworc3RhdGljIHZvaWQgZmNfZmNwX3NycihzdHJ1Y3QgZmNfZmNwX3BrdCAqLCBlbnVtIGZjX3JjdGwsIHUzMik7CitzdGF0aWMgdm9pZCBmY19mY3Bfc3JyX3Jlc3Aoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIGZjX2ZjcF9zcnJfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKiwgc3RydWN0IGZjX2ZyYW1lICopOworCisvKgorICogY29tbWFuZCBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBGQ19DT01QTEVURQkJMAorI2RlZmluZSBGQ19DTURfQUJPUlRFRAkJMQorI2RlZmluZSBGQ19DTURfUkVTRVQJCTIKKyNkZWZpbmUgRkNfQ01EX1BMT0dPCQkzCisjZGVmaW5lIEZDX1NOU19SQ1YJCTQKKyNkZWZpbmUgRkNfVFJBTlNfRVJSCQk1CisjZGVmaW5lIEZDX0RBVEFfT1ZSUlVOCQk2CisjZGVmaW5lIEZDX0RBVEFfVU5EUlVOCQk3CisjZGVmaW5lIEZDX0VSUk9SCQk4CisjZGVmaW5lIEZDX0hSRF9FUlJPUgkJOQorI2RlZmluZSBGQ19DTURfVElNRV9PVVQJCTEwCisKKy8qCisgKiBFcnJvciByZWNvdmVyeSB0aW1lb3V0IHZhbHVlcy4KKyAqLworI2RlZmluZSBGQ19TQ1NJX0VSX1RJTUVPVVQJKDEwICogSFopCisjZGVmaW5lIEZDX1NDU0lfVE1fVE9WCQkoMTAgKiBIWikKKyNkZWZpbmUgRkNfU0NTSV9SRUNfVE9WCQkoMiAqIEhaKQorI2RlZmluZSBGQ19IT1NUX1JFU0VUX1RJTUVPVVQJKDMwICogSFopCisKKyNkZWZpbmUgRkNfTUFYX0VSUk9SX0NOVAk1CisjZGVmaW5lIEZDX01BWF9SRUNPVl9SRVRSWQkzCisKKyNkZWZpbmUgRkNfRkNQX0RGTFRfUVVFVUVfREVQVEggMzIKKworLyoqCisgKiBmY19mY3BfcGt0X2FsbG9jIC0gYWxsb2NhdGlvbiByb3V0aW5lIGZvciBzY3NpX3BrdCBwYWNrZXQKKyAqIEBscDoJCWZjIGxwb3J0IHN0cnVjdAorICogQGdmcDoJZ2ZwIGZsYWdzIGZvciBhbGxvY2F0aW9uCisgKgorICogVGhpcyBpcyB1c2VkIGJ5IHVwcGVyIGxheWVyIHNjc2kgZHJpdmVyLgorICogUmV0dXJuIFZhbHVlIDogc2NzaV9wa3Qgc3RydWN0dXJlIG9yIG51bGwgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgorICogQ29udGV4dAk6IGNhbGwgZnJvbSBwcm9jZXNzIGNvbnRleHQuIG5vIGxvY2tpbmcgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmNfZmNwX3BrdCAqZmNfZmNwX3BrdF9hbGxvYyhzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcDsKKworCWZzcCA9IG1lbXBvb2xfYWxsb2Moc2ktPnNjc2lfcGt0X3Bvb2wsIGdmcCk7CisJaWYgKGZzcCkgeworCQltZW1zZXQoZnNwLCAwLCBzaXplb2YoKmZzcCkpOworCQlmc3AtPmxwID0gbHA7CisJCWF0b21pY19zZXQoJmZzcC0+cmVmX2NudCwgMSk7CisJCWluaXRfdGltZXIoJmZzcC0+dGltZXIpOworCQlJTklUX0xJU1RfSEVBRCgmZnNwLT5saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmZzcC0+c2NzaV9wa3RfbG9jayk7CisJfQorCXJldHVybiBmc3A7Cit9CisKKy8qKgorICogZmNfZmNwX3BrdF9yZWxlYXNlIC0gcmVsZWFzZSBob2xkIG9uIHNjc2lfcGt0IHBhY2tldAorICogQGZzcDoJZmNwIHBhY2tldCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgdXBwZXIgbGF5ZXIgc2NzaSBkcml2ZXIuCisgKiBDb250ZXh0CTogY2FsbCBmcm9tIHByb2Nlc3MgIGFuZCBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCQkgIG5vIGxvY2tpbmcgcmVxdWlyZWQKKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX3BrdF9yZWxlYXNlKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZzcC0+cmVmX2NudCkpIHsKKwkJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChmc3AtPmxwKTsKKworCQltZW1wb29sX2ZyZWUoZnNwLCBzaS0+c2NzaV9wa3RfcG9vbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmY19mY3BfcGt0X2hvbGQoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlhdG9taWNfaW5jKCZmc3AtPnJlZl9jbnQpOworfQorCisvKioKKyAqIGZjX2ZjcF9wa3RfZGVzdG9yeSAtIHJlbGVhc2UgaG9sZCBvbiBzY3NpX3BrdCBwYWNrZXQKKyAqCisgKiBAc2VxOgkJZXhjaGFuZ2Ugc2VxdWVuY2UKKyAqIEBmc3A6CWZjcCBwYWNrZXQgc3RydWN0CisgKgorICogUmVsZWFzZSBob2xkIG9uIHNjc2lfcGt0IHBhY2tldCBzZXQgdG8ga2VlcCBzY3NpX3BrdAorICogdGlsbCBFTSBsYXllciBleGNoIHJlc291cmNlIGlzIG5vdCBmcmVlZC4KKyAqIENvbnRleHQJOiBjYWxsZWQgZnJvbSBmcm9tIEVNIGxheWVyLgorICoJCSAgbm8gbG9ja2luZyByZXF1aXJlZAorICovCitzdGF0aWMgdm9pZCBmY19mY3BfcGt0X2Rlc3Ryb3koc3RydWN0IGZjX3NlcSAqc2VxLCB2b2lkICpmc3ApCit7CisJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7Cit9CisKKy8qKgorICogZmNfZmNwX2xvY2tfcGt0IC0gbG9jayBhIHBhY2tldCBhbmQgZ2V0IGEgcmVmIHRvIGl0LgorICogQGZzcDoJZmNwIHBhY2tldAorICoKKyAqIFdlIHNob3VsZCBvbmx5IHJldHVybiBlcnJvciBpZiB3ZSByZXR1cm4gYSBjb21tYW5kIHRvIHNjc2ktbWwgYmVmb3JlCisgKiBnZXR0aW5nIGEgcmVzcG9uc2UuIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlcyB3aGVyZSB3ZSBzZW5kIGEgYWJvcnQsIGJ1dAorICogZG8gbm90IHdhaXQgZm9yIHRoZSByZXNwb25zZSBhbmQgdGhlIGFib3J0IGFuZCBjb21tYW5kIGNhbiBiZSBwYXNzaW5nCisgKiBlYWNoIG90aGVyIG9uIHRoZSB3aXJlL25ldHdvcmstbGF5ZXIuCisgKgorICogTm90ZTogdGhpcyBmdW5jdGlvbiBsb2NrcyB0aGUgcGFja2V0IGFuZCBnZXRzIGEgcmVmZXJlbmNlIHRvIGFsbG93CisgKiBjYWxsZXJzIHRvIGNhbGwgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24gd2hpbGUgdGhlIGxvY2sgaXMgaGVsZCBhbmQKKyAqIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBwYWNrZXRzIHJlZmNvdW50LgorICoKKyAqIFRPRE86IE1heWJlIHdlIHNob3VsZCBqdXN0IGhhdmUgY2FsbGVycyBncmFiL3JlbGVhc2UgdGhlIGxvY2sgYW5kCisgKiBoYXZlIGEgZnVuY3Rpb24gdGhhdCB0aGV5IGNhbGwgdG8gdmVyaWZ5IHRoZSBmc3AgYW5kIGdyYWIgYSByZWYgaWYKKyAqIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmNfZmNwX2xvY2tfcGt0KHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJc3Bpbl9sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOworCWlmIChmc3AtPnN0YXRlICYgRkNfU1JCX0NPTVBMKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWZjX2ZjcF9wa3RfaG9sZChmc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfZmNwX3VubG9ja19wa3Qoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlzcGluX3VubG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsKK30KKworc3RhdGljIHZvaWQgZmNfZmNwX3RpbWVyX3NldChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCWlmICghKGZzcC0+c3RhdGUgJiBGQ19TUkJfQ09NUEwpKQorCQltb2RfdGltZXIoJmZzcC0+dGltZXIsIGppZmZpZXMgKyBkZWxheSk7Cit9CisKK3N0YXRpYyBpbnQgZmNfZmNwX3NlbmRfYWJvcnQoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlpZiAoIWZzcC0+c2VxX3B0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc3AtPnN0YXRlIHw9IEZDX1NSQl9BQk9SVF9QRU5ESU5HOworCXJldHVybiBmc3AtPmxwLT50dC5zZXFfZXhjaF9hYm9ydChmc3AtPnNlcV9wdHIsIDApOworfQorCisvKgorICogUmV0cnkgY29tbWFuZC4KKyAqIEFuIGFib3J0IGlzbid0IG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX3JldHJ5X2NtZChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQoreworCWlmIChmc3AtPnNlcV9wdHIpIHsKKwkJZnNwLT5scC0+dHQuZXhjaF9kb25lKGZzcC0+c2VxX3B0cik7CisJCWZzcC0+c2VxX3B0ciA9IE5VTEw7CisJfQorCisJZnNwLT5zdGF0ZSAmPSB+RkNfU1JCX0FCT1JUX1BFTkRJTkc7CisJZnNwLT5pb19zdGF0dXMgPSBTVUdHRVNUX1JFVFJZIDw8IDI0OworCWZzcC0+c3RhdHVzX2NvZGUgPSBGQ19FUlJPUjsKKwlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7Cit9CisKKy8qCisgKiBSZWNlaXZlIFNDU0kgZGF0YSBmcm9tIHRhcmdldC4KKyAqIENhbGxlZCBhZnRlciByZWNlaXZpbmcgc29saWNpdGVkIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9yZWN2X2RhdGEoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IGZzcC0+Y21kOworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBmc3AtPmxwOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc2l6ZV90IHN0YXJ0X29mZnNldDsKKwlzaXplX3Qgb2Zmc2V0OworCXUzMiBjcmM7CisJdTMyIGNvcHlfbGVuID0gMDsKKwlzaXplX3QgbGVuOworCXZvaWQgKmJ1ZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXNpemVfdCByZW1haW5pbmc7CisKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCW9mZnNldCA9IG50b2hsKGZoLT5maF9wYXJtX29mZnNldCk7CisJc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0OworCWxlbiA9IGZyX2xlbihmcCkgLSBzaXplb2YoKmZoKTsKKwlidWYgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgMCk7CisKKwlpZiAob2Zmc2V0ICsgbGVuID4gZnNwLT5kYXRhX2xlbikgeworCQkvKgorCQkgKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJICovCisJCWlmICgoZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCkgJiYKKwkJICAgIGZjX2ZyYW1lX2NyY19jaGVjayhmcCkpCisJCQlnb3RvIGNyY19lcnI7CisJCUZDX0RFQlVHX0ZDUCgiZGF0YSByZWNlaXZlZCBwYXN0IGVuZC4gbGVuICV6eCBvZmZzZXQgJXp4ICIKKwkJCSAgICAgImRhdGFfbGVuICV4XG4iLCBsZW4sIG9mZnNldCwgZnNwLT5kYXRhX2xlbik7CisJCWZjX2ZjcF9yZXRyeV9jbWQoZnNwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAob2Zmc2V0ICE9IGZzcC0+eGZlcl9sZW4pCisJCWZzcC0+c3RhdGUgfD0gRkNfU1JCX0RJU0NPTlRJRzsKKworCWNyYyA9IDA7CisJaWYgKGZyX2ZsYWdzKGZwKSAmIEZDUEhGX0NSQ19VTkNIRUNLRUQpCisJCWNyYyA9IGNyYzMyKH4wLCAodTggKikgZmgsIHNpemVvZigqZmgpKTsKKworCXNnID0gc2NzaV9zZ2xpc3Qoc2MpOworCXJlbWFpbmluZyA9IGxlbjsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNnKSB7CisJCXNpemVfdCBvZmY7CisJCXZvaWQgKnBhZ2VfYWRkcjsKKwkJc2l6ZV90IHNnX2J5dGVzOworCisJCWlmIChvZmZzZXQgPj0gc2ctPmxlbmd0aCkgeworCQkJb2Zmc2V0IC09IHNnLT5sZW5ndGg7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJY29udGludWU7CisJCX0KKwkJc2dfYnl0ZXMgPSBtaW4ocmVtYWluaW5nLCBzZy0+bGVuZ3RoIC0gb2Zmc2V0KTsKKworCQkvKgorCQkgKiBUaGUgc2NhdHRlcmxpc3QgaXRlbSBtYXkgYmUgYmlnZ2VyIHRoYW4gUEFHRV9TSVpFLAorCQkgKiBidXQgd2UgYXJlIGxpbWl0ZWQgdG8gbWFwcGluZyBQQUdFX1NJWkUgYXQgYSB0aW1lLgorCQkgKi8KKwkJb2ZmID0gb2Zmc2V0ICsgc2ctPm9mZnNldDsKKwkJc2dfYnl0ZXMgPSBtaW4oc2dfYnl0ZXMsIChzaXplX3QpCisJCQkgICAgICAgKFBBR0VfU0laRSAtIChvZmYgJiB+UEFHRV9NQVNLKSkpOworCQlwYWdlX2FkZHIgPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSArIChvZmYgPj4gUEFHRV9TSElGVCksCisJCQkJCUtNX1NPRlRJUlEwKTsKKwkJaWYgKCFwYWdlX2FkZHIpCisJCQlicmVhazsJCS8qIFhYWCBwYW5pYz8gKi8KKworCQlpZiAoZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCkKKwkJCWNyYyA9IGNyYzMyKGNyYywgYnVmLCBzZ19ieXRlcyk7CisJCW1lbWNweSgoY2hhciAqKXBhZ2VfYWRkciArIChvZmYgJiB+UEFHRV9NQVNLKSwgYnVmLAorCQkgICAgICAgc2dfYnl0ZXMpOworCisJCWt1bm1hcF9hdG9taWMocGFnZV9hZGRyLCBLTV9TT0ZUSVJRMCk7CisJCWJ1ZiArPSBzZ19ieXRlczsKKwkJb2Zmc2V0ICs9IHNnX2J5dGVzOworCQlyZW1haW5pbmcgLT0gc2dfYnl0ZXM7CisJCWNvcHlfbGVuICs9IHNnX2J5dGVzOworCX0KKworCWlmIChmcl9mbGFncyhmcCkgJiBGQ1BIRl9DUkNfVU5DSEVDS0VEKSB7CisJCWJ1ZiA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCAwKTsKKwkJaWYgKGxlbiAlIDQpIHsKKwkJCWNyYyA9IGNyYzMyKGNyYywgYnVmICsgbGVuLCA0IC0gKGxlbiAlIDQpKTsKKwkJCWxlbiArPSA0IC0gKGxlbiAlIDQpOworCQl9CisKKwkJaWYgKH5jcmMgIT0gbGUzMl90b19jcHUoZnJfY3JjKGZwKSkpIHsKK2NyY19lcnI6CisJCQlzdGF0cyA9IGxwLT5kZXZfc3RhdHNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwkJCXN0YXRzLT5FcnJvckZyYW1lcysrOworCQkJaWYgKHN0YXRzLT5JbnZhbGlkQ1JDQ291bnQrKyA8IDUpCisJCQkJRkNfREJHKCJDUkMgZXJyb3Igb24gZGF0YSBmcmFtZVxuIik7CisJCQkvKgorCQkJICogQXNzdW1lIHRoZSBmcmFtZSBpcyB0b3RhbCBnYXJiYWdlLgorCQkJICogV2UgbWF5IGhhdmUgY29waWVkIGl0IG92ZXIgdGhlIGdvb2QgcGFydAorCQkJICogb2YgdGhlIGJ1ZmZlci4KKwkJCSAqIElmIHNvLCB3ZSBuZWVkIHRvIHJldHJ5IHRoZSBlbnRpcmUgb3BlcmF0aW9uLgorCQkJICogT3RoZXJ3aXNlLCBpZ25vcmUgaXQuCisJCQkgKi8KKwkJCWlmIChmc3AtPnN0YXRlICYgRkNfU1JCX0RJU0NPTlRJRykKKwkJCQlmY19mY3BfcmV0cnlfY21kKGZzcCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoZnNwLT54ZmVyX2NvbnRpZ19lbmQgPT0gc3RhcnRfb2Zmc2V0KQorCQlmc3AtPnhmZXJfY29udGlnX2VuZCArPSBjb3B5X2xlbjsKKwlmc3AtPnhmZXJfbGVuICs9IGNvcHlfbGVuOworCisJLyoKKwkgKiBJbiB0aGUgdmVyeSByYXJlIGV2ZW50IHRoYXQgdGhpcyBkYXRhIGFycml2ZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlCisJICogYW5kIGNvbXBsZXRlcyB0aGUgdHJhbnNmZXIsIGNhbGwgdGhlIGNvbXBsZXRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAodW5saWtlbHkoZnNwLT5zdGF0ZSAmIEZDX1NSQl9SQ1ZfU1RBVFVTKSAmJgorCSAgICBmc3AtPnhmZXJfbGVuID09IGZzcC0+ZGF0YV9sZW4gLSBmc3AtPnNjc2lfcmVzaWQpCisJCWZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoZnNwKTsKK30KKworLyoKKyAqIGZjX2ZjcF9zZW5kX2RhdGEgLSAgU2VuZCBTQ1NJIGRhdGEgdG8gdGFyZ2V0LgorICogQGZzcDogcHRyIHRvIGZjX2ZjcF9wa3QKKyAqIEBzcDogcHRyIHRvIHRoaXMgc2VxdWVuY2UKKyAqIEBvZmZzZXQ6IHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyBkYXRhIHJlcXVlc3QKKyAqIEBzZXFfYmxlbjogdGhlIGJ1cnN0IGxlbmd0aCBmb3IgdGhpcyBkYXRhIHJlcXVlc3QKKyAqCisgKiBDYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIGEgVHJhbnNmZXIgUmVhZHkgZGF0YSBkZXNjcmlwdG9yLgorICogaWYgTExEIGlzIGNhcGFibGUgb2Ygc2VxIG9mZmxvYWQgdGhlbiBzZW5kIGRvd24gc2VxX2JsZW4KKyAqIHNpemUgb2YgZGF0YSBpbiBzaW5nbGUgZnJhbWUsIG90aGVyd2lzZSBzZW5kIG11bHRpcGxlIEZDCisgKiBmcmFtZXMgb2YgbWF4IEZDIGZyYW1lIHBheWxvYWQgc3VwcG9ydGVkIGJ5IHRhcmdldCBwb3J0LgorICoKKyAqIFJldHVybnMgOiAwIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGZjX2ZjcF9zZW5kX2RhdGEoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX3NlcSAqc2VxLAorCQkJICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzZXFfYmxlbikKK3sKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJc3RydWN0IHNjc2lfY21uZCAqc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwID0gTlVMTDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZnNwLT5scDsKKwlzaXplX3QgcmVtYWluaW5nOworCXNpemVfdCB0X2JsZW47CisJc2l6ZV90IHRsZW47CisJc2l6ZV90IHNnX2J5dGVzOworCXNpemVfdCBmcmFtZV9vZmZzZXQsIGZoX3Bhcm1fb2Zmc2V0OworCWludCBlcnJvcjsKKwl2b2lkICpkYXRhID0gTlVMTDsKKwl2b2lkICpwYWdlX2FkZHI7CisJaW50IHVzaW5nX3NnID0gbHAtPnNnX3N1cHA7CisJdTMyIGZfY3RsOworCisJV0FSTl9PTihzZXFfYmxlbiA8PSAwKTsKKwlpZiAodW5saWtlbHkob2Zmc2V0ICsgc2VxX2JsZW4gPiBmc3AtPmRhdGFfbGVuKSkgeworCQkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJRkNfREVCVUdfRkNQKCJ4ZmVyLXJlYWR5IHBhc3QgZW5kLiBzZXFfYmxlbiAlenggb2Zmc2V0ICV6eFxuIiwKKwkJCSAgICAgc2VxX2JsZW4sIG9mZnNldCk7CisJCWZjX2ZjcF9zZW5kX2Fib3J0KGZzcCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAob2Zmc2V0ICE9IGZzcC0+eGZlcl9sZW4pIHsKKwkJLyogT3V0IG9mIE9yZGVyIERhdGEgUmVxdWVzdCAtIG5vIHByb2JsZW0sIGJ1dCB1bmV4cGVjdGVkLiAqLworCQlGQ19ERUJVR19GQ1AoInhmZXItcmVhZHkgbm9uLWNvbnRpZ3VvdXMuICIKKwkJCSAgICAgInNlcV9ibGVuICV6eCBvZmZzZXQgJXp4XG4iLCBzZXFfYmxlbiwgb2Zmc2V0KTsKKwl9CisKKwkvKgorCSAqIGlmIExMRCBpcyBjYXBhYmxlIG9mIHNlcV9vZmZsb2FkIHRoZW4gc2V0IHRyYW5zcG9ydAorCSAqIGJ1cnN0IGxlbmd0aCAodF9ibGVuKSB0byBzZXFfYmxlbiwgb3RoZXJ3aXNlIHNldCB0X2JsZW4KKwkgKiB0byBtYXggRkMgZnJhbWUgcGF5bG9hZCBwcmV2aW91c2x5IHNldCBpbiBmc3AtPm1heF9wYXlsb2FkLgorCSAqLworCXRfYmxlbiA9IGxwLT5zZXFfb2ZmbG9hZCA/IHNlcV9ibGVuIDogZnNwLT5tYXhfcGF5bG9hZDsKKwlXQVJOX09OKHRfYmxlbiA8IEZDX01JTl9NQVhfUEFZTE9BRCk7CisJaWYgKHRfYmxlbiA+IDUxMikKKwkJdF9ibGVuICY9IH4oNTEyIC0gMSk7CS8qIHJvdW5kIGRvd24gdG8gYmxvY2sgc2l6ZSAqLworCVdBUk5fT04odF9ibGVuIDwgRkNfTUlOX01BWF9QQVlMT0FEKTsJLyogd29uJ3QgZ28gYmVsb3cgMjU2ICovCisJc2MgPSBmc3AtPmNtZDsKKworCXJlbWFpbmluZyA9IHNlcV9ibGVuOworCWZoX3Bhcm1fb2Zmc2V0ID0gZnJhbWVfb2Zmc2V0ID0gb2Zmc2V0OworCXRsZW4gPSAwOworCXNlcSA9IGxwLT50dC5zZXFfc3RhcnRfbmV4dChzZXEpOworCWZfY3RsID0gRkNfRkNfUkVMX09GRjsKKwlXQVJOX09OKCFzZXEpOworCisJLyoKKwkgKiBJZiBhIGdldF9wYWdlKCkvcHV0X3BhZ2UoKSB3aWxsIGZhaWwsIGRvbid0IHVzZSBzZyBsaXN0cworCSAqIGluIHRoZSBmY19mcmFtZSBzdHJ1Y3R1cmUuCisJICoKKwkgKiBUaGUgcHV0X3BhZ2UoKSBtYXkgYmUgbG9uZyBhZnRlciB0aGUgSS9PIGhhcyBjb21wbGV0ZWQKKwkgKiBpbiB0aGUgY2FzZSBvZiBGQ29FLCBzaW5jZSB0aGUgbmV0d29yayBkcml2ZXIgZG9lcyBpdAorCSAqIHZpYSBmcmVlX3NrYigpLiAgU2VlIHRoZSB0ZXN0IGluIGZyZWVfcGFnZXNfY2hlY2soKS4KKwkgKgorCSAqIFRlc3QgdGhpcyBjYXNlIHdpdGggJ2RkIDwvZGV2L3plcm8gPi9kZXYvc3QwIGJzPTY0aycuCisJICovCisJaWYgKHVzaW5nX3NnKSB7CisJCWZvciAoc2cgPSBzY3NpX3NnbGlzdChzYyk7IHNnOyBzZyA9IHNnX25leHQoc2cpKSB7CisJCQlpZiAocGFnZV9jb3VudChzZ19wYWdlKHNnKSkgPT0gMCB8fAorCQkJICAgIChzZ19wYWdlKHNnKS0+ZmxhZ3MgJiAoMSA8PCBQR19scnUgfAorCQkJCQkJICAgMSA8PCBQR19wcml2YXRlIHwKKwkJCQkJCSAgIDEgPDwgUEdfbG9ja2VkIHwKKwkJCQkJCSAgIDEgPDwgUEdfYWN0aXZlIHwKKwkJCQkJCSAgIDEgPDwgUEdfc2xhYiB8CisJCQkJCQkgICAxIDw8IFBHX3N3YXBjYWNoZSB8CisJCQkJCQkgICAxIDw8IFBHX3dyaXRlYmFjayB8CisJCQkJCQkgICAxIDw8IFBHX3Jlc2VydmVkIHwKKwkJCQkJCSAgIDEgPDwgUEdfYnVkZHkpKSkgeworCQkJCXVzaW5nX3NnID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzZyA9IHNjc2lfc2dsaXN0KHNjKTsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwICYmIHNnKSB7CisJCWlmIChvZmZzZXQgPj0gc2ctPmxlbmd0aCkgeworCQkJb2Zmc2V0IC09IHNnLT5sZW5ndGg7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFmcCkgeworCQkJdGxlbiA9IG1pbih0X2JsZW4sIHJlbWFpbmluZyk7CisKKwkJCS8qCisJCQkgKiBUT0RPLiAgVGVtcG9yYXJ5IHdvcmthcm91bmQuCSBmY19zZXFfc2VuZCgpIGNhbid0CisJCQkgKiBoYW5kbGUgb2RkIGxlbmd0aHMgaW4gbm9uLWxpbmVhciBza2JzLgorCQkJICogVGhpcyB3aWxsIGJlIHRoZSBmaW5hbCBmcmFnbWVudCBvbmx5LgorCQkJICovCisJCQlpZiAodGxlbiAlIDQpCisJCQkJdXNpbmdfc2cgPSAwOworCQkJaWYgKHVzaW5nX3NnKSB7CisJCQkJZnAgPSBfZmNfZnJhbWVfYWxsb2MobHAsIDApOworCQkJCWlmICghZnApCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJfSBlbHNlIHsKKwkJCQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCB0bGVuKTsKKwkJCQlpZiAoIWZwKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCWRhdGEgPSAodm9pZCAqKShmcl9oZHIoZnApKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKTsKKwkJCX0KKwkJCWZoX3Bhcm1fb2Zmc2V0ID0gZnJhbWVfb2Zmc2V0OworCQkJZnJfbWF4X3BheWxvYWQoZnApID0gZnNwLT5tYXhfcGF5bG9hZDsKKwkJfQorCQlzZ19ieXRlcyA9IG1pbih0bGVuLCBzZy0+bGVuZ3RoIC0gb2Zmc2V0KTsKKwkJaWYgKHVzaW5nX3NnKSB7CisJCQlXQVJOX09OKHNrYl9zaGluZm8oZnBfc2tiKGZwKSktPm5yX2ZyYWdzID4KKwkJCQlGQ19GUkFNRV9TR19MRU4pOworCQkJZ2V0X3BhZ2Uoc2dfcGFnZShzZykpOworCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKGZwX3NrYihmcCksCisJCQkJCSAgIHNrYl9zaGluZm8oZnBfc2tiKGZwKSktPm5yX2ZyYWdzLAorCQkJCQkgICBzZ19wYWdlKHNnKSwgc2ctPm9mZnNldCArIG9mZnNldCwKKwkJCQkJICAgc2dfYnl0ZXMpOworCQkJZnBfc2tiKGZwKS0+ZGF0YV9sZW4gKz0gc2dfYnl0ZXM7CisJCQlmcl9sZW4oZnApICs9IHNnX2J5dGVzOworCQkJZnBfc2tiKGZwKS0+dHJ1ZXNpemUgKz0gUEFHRV9TSVpFOworCQl9IGVsc2UgeworCQkJc2l6ZV90IG9mZiA9IG9mZnNldCArIHNnLT5vZmZzZXQ7CisKKwkJCS8qCisJCQkgKiBUaGUgc2NhdHRlcmxpc3QgaXRlbSBtYXkgYmUgYmlnZ2VyIHRoYW4gUEFHRV9TSVpFLAorCQkJICogYnV0IHdlIG11c3Qgbm90IGNyb3NzIHBhZ2VzIGluc2lkZSB0aGUga21hcC4KKwkJCSAqLworCQkJc2dfYnl0ZXMgPSBtaW4oc2dfYnl0ZXMsIChzaXplX3QpIChQQUdFX1NJWkUgLQorCQkJCQkJCSAgIChvZmYgJiB+UEFHRV9NQVNLKSkpOworCQkJcGFnZV9hZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShzZykgKworCQkJCQkJKG9mZiA+PiBQQUdFX1NISUZUKSwKKwkJCQkJCUtNX1NPRlRJUlEwKTsKKwkJCW1lbWNweShkYXRhLCAoY2hhciAqKXBhZ2VfYWRkciArIChvZmYgJiB+UEFHRV9NQVNLKSwKKwkJCSAgICAgICBzZ19ieXRlcyk7CisJCQlrdW5tYXBfYXRvbWljKHBhZ2VfYWRkciwgS01fU09GVElSUTApOworCQkJZGF0YSArPSBzZ19ieXRlczsKKwkJfQorCQlvZmZzZXQgKz0gc2dfYnl0ZXM7CisJCWZyYW1lX29mZnNldCArPSBzZ19ieXRlczsKKwkJdGxlbiAtPSBzZ19ieXRlczsKKwkJcmVtYWluaW5nIC09IHNnX2J5dGVzOworCisJCWlmICh0bGVuKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogU2VuZCBzZXF1ZW5jZSB3aXRoIHRyYW5zZmVyIHNlcXVlbmNlIGluaXRpYXRpdmUgaW4gY2FzZQorCQkgKiB0aGlzIGlzIGxhc3QgRkNQIGZyYW1lIG9mIHRoZSBzZXF1ZW5jZS4KKwkJICovCisJCWlmIChyZW1haW5pbmcgPT0gMCkKKwkJCWZfY3RsIHw9IEZDX0ZDX1NFUV9JTklUIHwgRkNfRkNfRU5EX1NFUTsKKworCQllcCA9IGZjX3NlcV9leGNoKHNlcSk7CisJCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0REX1NPTF9EQVRBLCBlcC0+ZGlkLCBlcC0+c2lkLAorCQkJICAgICAgIEZDX1RZUEVfRkNQLCBmX2N0bCwgZmhfcGFybV9vZmZzZXQpOworCisJCS8qCisJCSAqIHNlbmQgZnJhZ21lbnQgdXNpbmcgZm9yIGEgc2VxdWVuY2UuCisJCSAqLworCQllcnJvciA9IGxwLT50dC5zZXFfc2VuZChscCwgc2VxLCBmcCk7CisJCWlmIChlcnJvcikgeworCQkJV0FSTl9PTigxKTsJCS8qIHNlbmQgZXJyb3Igc2hvdWxkIGJlIHJhcmUgKi8KKwkJCWZjX2ZjcF9yZXRyeV9jbWQoZnNwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZwID0gTlVMTDsKKwl9CisJZnNwLT54ZmVyX2xlbiArPSBzZXFfYmxlbjsJLyogcHJlbWF0dXJlIGNvdW50PyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmY19mY3BfYWJ0c19yZXNwKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJaW50IGJhX2RvbmUgPSAxOworCXN0cnVjdCBmY19iYV9yanQgKmJycDsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJc3dpdGNoIChmaC0+Zmhfcl9jdGwpIHsKKwljYXNlIEZDX1JDVExfQkFfQUNDOgorCQlicmVhazsKKwljYXNlIEZDX1JDVExfQkFfUkpUOgorCQlicnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpicnApKTsKKwkJaWYgKGJycCAmJiBicnAtPmJyX3JlYXNvbiA9PSBGQ19CQV9SSlRfTE9HX0VSUikKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocnUgKi8KKwlkZWZhdWx0OgorCQkvKgorCQkgKiB3ZSB3aWxsIGxldCB0aGUgY29tbWFuZCB0aW1lb3V0CisJCSAqIGFuZCBzY3NpLW1sIHJlY292ZXIgaW4gdGhpcyBjYXNlLAorCQkgKiB0aGVyZWZvcmUgY2xlYXJlZCB0aGUgYmFfZG9uZSBmbGFnLgorCQkgKi8KKwkJYmFfZG9uZSA9IDA7CisJfQorCisJaWYgKGJhX2RvbmUpIHsKKwkJZnNwLT5zdGF0ZSB8PSBGQ19TUkJfQUJPUlRFRDsKKwkJZnNwLT5zdGF0ZSAmPSB+RkNfU1JCX0FCT1JUX1BFTkRJTkc7CisKKwkJaWYgKGZzcC0+d2FpdF9mb3JfY29tcCkKKwkJCWNvbXBsZXRlKCZmc3AtPnRtX2RvbmUpOworCQllbHNlCisJCQlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7CisJfQorfQorCisvKgorICogZmNfZmNwX3JlZHVjZV9jYW5fcXVldWUgLSBkcm9wIGNhbl9xdWV1ZQorICogQGxwOiBscG9ydCB0byBkcm9wIHF1ZXVlaW5nIGZvcgorICoKKyAqIElmIHdlIGFyZSBnZXR0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLCB0aGVuIHdlIG1heQorICogYmUgdHJ5aW5nIHRvIGV4ZWN1dGUgdG9vIG1hbnkgY29tbWFuZHMuIFdlIGxldCB0aGUgcnVubmluZworICogY29tbWFuZHMgY29tcGxldGUgb3IgdGltZW91dCwgdGhlbiB0cnkgYWdhaW4gd2l0aCBhIHJlZHVjZWQKKyAqIGNhbl9xdWV1ZS4gRXZlbnR1YWxseSB3ZSB3aWxsIGhpdCB0aGUgcG9pbnQgd2hlcmUgd2UgcnVuCisgKiBvbiBhbGwgcmVzZXJ2ZWQgc3RydWN0cy4KKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX3JlZHVjZV9jYW5fcXVldWUoc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjYW5fcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHNpLT50aHJvdHRsZWQpCisJCWdvdG8gZG9uZTsKKwlzaS0+dGhyb3R0bGVkID0gMTsKKworCWNhbl9xdWV1ZSA9IGxwLT5ob3N0LT5jYW5fcXVldWU7CisJY2FuX3F1ZXVlID4+PSAxOworCWlmICghY2FuX3F1ZXVlKQorCQljYW5fcXVldWUgPSAxOworCWxwLT5ob3N0LT5jYW5fcXVldWUgPSBjYW5fcXVldWU7CisJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBscC0+aG9zdCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZS5cbiIKKwkJICAgICAiUmVkdWNpbmcgY2FuX3F1ZXVlIHRvICVkLlxuIiwgY2FuX3F1ZXVlKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBleGNoIG1nciBjYWxscyB0aGlzIHJvdXRpbmUgdG8gcHJvY2VzcyBzY3NpCisgKiBleGNoYW5nZXMuCisgKgorICogUmV0dXJuICAgOiBOb25lCisgKiBDb250ZXh0ICA6IGNhbGxlZCBmcm9tIFNvZnQgSVJRIGNvbnRleHQKKyAqCSAgICAgIGNhbiBub3QgY2FsbGVkIGhvbGRpbmcgbGlzdCBsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9yZWN2KHN0cnVjdCBmY19zZXEgKnNlcSwgc3RydWN0IGZjX2ZyYW1lICpmcCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBmY19mY3BfcGt0ICpmc3AgPSAoc3RydWN0IGZjX2ZjcF9wa3QgKilhcmc7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwlzdHJ1Y3QgZmNwX3R4cmR5ICpkZDsKKwl1OCByX2N0bDsKKwlpbnQgcmMgPSAwOworCisJaWYgKElTX0VSUihmcCkpCisJCWdvdG8gZXJyb3V0OworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlyX2N0bCA9IGZoLT5maF9yX2N0bDsKKwlscCA9IGZzcC0+bHA7CisKKwlpZiAoIShscC0+c3RhdGUgJiBMUE9SVF9TVF9SRUFEWSkpCisJCWdvdG8gb3V0OworCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkKKwkJZ290byBvdXQ7CisJZnNwLT5sYXN0X3BrdF90aW1lID0gamlmZmllczsKKworCWlmIChmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0JMUykgeworCQlmY19mY3BfYWJ0c19yZXNwKGZzcCwgZnApOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoZnNwLT5zdGF0ZSAmIChGQ19TUkJfQUJPUlRFRCB8IEZDX1NSQl9BQk9SVF9QRU5ESU5HKSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAocl9jdGwgPT0gRkNfUkNUTF9ERF9EQVRBX0RFU0MpIHsKKwkJLyoKKwkJICogcmVjZWl2ZWQgWEZFUiBSRFkgZnJvbSB0aGUgdGFyZ2V0CisJCSAqIG5lZWQgdG8gc2VuZCBkYXRhIHRvIHRoZSB0YXJnZXQKKwkJICovCisJCVdBUk5fT04oZnJfZmxhZ3MoZnApICYgRkNQSEZfQ1JDX1VOQ0hFQ0tFRCk7CisJCWRkID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZGQpKTsKKwkJV0FSTl9PTighZGQpOworCisJCXJjID0gZmNfZmNwX3NlbmRfZGF0YShmc3AsIHNlcSwKKwkJCQkgICAgICAoc2l6ZV90KSBudG9obChkZC0+ZnRfZGF0YV9ybyksCisJCQkJICAgICAgKHNpemVfdCkgbnRvaGwoZGQtPmZ0X2J1cnN0X2xlbikpOworCQlpZiAoIXJjKQorCQkJc2VxLT5yZWNfZGF0YSA9IGZzcC0+eGZlcl9sZW47CisJCWVsc2UgaWYgKHJjID09IC1FTk9NRU0pCisJCQlmc3AtPnN0YXRlIHw9IEZDX1NSQl9OT01FTTsKKwl9IGVsc2UgaWYgKHJfY3RsID09IEZDX1JDVExfRERfU09MX0RBVEEpIHsKKwkJLyoKKwkJICogcmVjZWl2ZWQgYSBEQVRBIGZyYW1lCisJCSAqIG5leHQgd2Ugd2lsbCBjb3B5IHRoZSBkYXRhIHRvIHRoZSBzeXN0ZW0gYnVmZmVyCisJCSAqLworCQlXQVJOX09OKGZyX2xlbihmcCkgPCBzaXplb2YoKmZoKSk7CS8qIGxlbiBtYXkgYmUgMCAqLworCQlmY19mY3BfcmVjdl9kYXRhKGZzcCwgZnApOworCQlzZXEtPnJlY19kYXRhID0gZnNwLT54ZmVyX2NvbnRpZ19lbmQ7CisJfSBlbHNlIGlmIChyX2N0bCA9PSBGQ19SQ1RMX0REX0NNRF9TVEFUVVMpIHsKKwkJV0FSTl9PTihmcl9mbGFncyhmcCkgJiBGQ1BIRl9DUkNfVU5DSEVDS0VEKTsKKworCQlmY19mY3BfcmVzcChmc3AsIGZwKTsKKwl9IGVsc2UgeworCQlGQ19EQkcoInVuZXhwZWN0ZWQgZnJhbWUuICByX2N0bCAleFxuIiwgcl9jdGwpOworCX0KK3VubG9jazoKKwlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworb3V0OgorCWZjX2ZyYW1lX2ZyZWUoZnApOworZXJyb3V0OgorCWlmIChJU19FUlIoZnApKQorCQlmY19mY3BfZXJyb3IoZnNwLCBmcCk7CisJZWxzZSBpZiAocmMgPT0gLUVOT01FTSkKKwkJZmNfZmNwX3JlZHVjZV9jYW5fcXVldWUobHApOworfQorCitzdGF0aWMgdm9pZCBmY19mY3BfcmVzcChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY3BfcmVzcCAqZmNfcnA7CisJc3RydWN0IGZjcF9yZXNwX2V4dCAqcnBfZXg7CisJc3RydWN0IGZjcF9yZXNwX3JzcF9pbmZvICpmY19ycF9pbmZvOworCXUzMiBwbGVuOworCXUzMiBleHBlY3RlZF9sZW47CisJdTMyIHJlc3BsID0gMDsKKwl1MzIgc25zbCA9IDA7CisJdTggZmxhZ3MgPSAwOworCisJcGxlbiA9IGZyX2xlbihmcCk7CisJZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKWZyX2hkcihmcCk7CisJaWYgKHVubGlrZWx5KHBsZW4gPCBzaXplb2YoKmZoKSArIHNpemVvZigqZmNfcnApKSkKKwkJZ290byBsZW5fZXJyOworCXBsZW4gLT0gc2l6ZW9mKCpmaCk7CisJZmNfcnAgPSAoc3RydWN0IGZjcF9yZXNwICopKGZoICsgMSk7CisJZnNwLT5jZGJfc3RhdHVzID0gZmNfcnAtPmZyX3N0YXR1czsKKwlmbGFncyA9IGZjX3JwLT5mcl9mbGFnczsKKwlmc3AtPnNjc2lfY29tcF9mbGFncyA9IGZsYWdzOworCWV4cGVjdGVkX2xlbiA9IGZzcC0+ZGF0YV9sZW47CisKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgfkZDUF9DT05GX1JFUSkgfHwgZmNfcnAtPmZyX3N0YXR1cykpIHsKKwkJcnBfZXggPSAodm9pZCAqKShmY19ycCArIDEpOworCQlpZiAoZmxhZ3MgJiAoRkNQX1JTUF9MRU5fVkFMIHwgRkNQX1NOU19MRU5fVkFMKSkgeworCQkJaWYgKHBsZW4gPCBzaXplb2YoKmZjX3JwKSArIHNpemVvZigqcnBfZXgpKQorCQkJCWdvdG8gbGVuX2VycjsKKwkJCWZjX3JwX2luZm8gPSAoc3RydWN0IGZjcF9yZXNwX3JzcF9pbmZvICopKHJwX2V4ICsgMSk7CisJCQlpZiAoZmxhZ3MgJiBGQ1BfUlNQX0xFTl9WQUwpIHsKKwkJCQlyZXNwbCA9IG50b2hsKHJwX2V4LT5mcl9yc3BfbGVuKTsKKwkJCQlpZiAocmVzcGwgIT0gc2l6ZW9mKCpmY19ycF9pbmZvKSkKKwkJCQkJZ290byBsZW5fZXJyOworCQkJCWlmIChmc3AtPndhaXRfZm9yX2NvbXApIHsKKwkJCQkJLyogQWJ1c2UgY2RiX3N0YXR1cyBmb3IgcnNwIGNvZGUgKi8KKwkJCQkJZnNwLT5jZGJfc3RhdHVzID0gZmNfcnBfaW5mby0+cnNwX2NvZGU7CisJCQkJCWNvbXBsZXRlKCZmc3AtPnRtX2RvbmUpOworCQkJCQkvKgorCQkJCQkgKiB0bWZzIHdpbGwgbm90IGhhdmUgYW55IHNjc2kgY21kIHNvCisJCQkJCSAqIGV4aXQgaGVyZQorCQkJCQkgKi8KKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZQorCQkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWlmIChmbGFncyAmIEZDUF9TTlNfTEVOX1ZBTCkgeworCQkJCXNuc2wgPSBudG9obChycF9leC0+ZnJfc25zX2xlbik7CisJCQkJaWYgKHNuc2wgPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQkJCXNuc2wgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQkJbWVtY3B5KGZzcC0+Y21kLT5zZW5zZV9idWZmZXIsCisJCQkJICAgICAgIChjaGFyICopZmNfcnBfaW5mbyArIHJlc3BsLCBzbnNsKTsKKwkJCX0KKwkJfQorCQlpZiAoZmxhZ3MgJiAoRkNQX1JFU0lEX1VOREVSIHwgRkNQX1JFU0lEX09WRVIpKSB7CisJCQlpZiAocGxlbiA8IHNpemVvZigqZmNfcnApICsgc2l6ZW9mKHJwX2V4LT5mcl9yZXNpZCkpCisJCQkJZ290byBsZW5fZXJyOworCQkJaWYgKGZsYWdzICYgRkNQX1JFU0lEX1VOREVSKSB7CisJCQkJZnNwLT5zY3NpX3Jlc2lkID0gbnRvaGwocnBfZXgtPmZyX3Jlc2lkKTsKKwkJCQkvKgorCQkJCSAqIFRoZSBjbW5kLT51bmRlcmZsb3cgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mCisJCQkJICogYnl0ZXMgdGhhdCBtdXN0IGJlIHRyYW5zZmVyZWQgZm9yIHRoaXMKKwkJCQkgKiBjb21tYW5kLiAgUHJvdmlkZWQgYSBzZW5zZSBjb25kaXRpb24gaXMgbm90CisJCQkJICogcHJlc2VudCwgbWFrZSBzdXJlIHRoZSBhY3R1YWwgYW1vdW50CisJCQkJICogdHJhbnNmZXJyZWQgaXMgYXQgbGVhc3QgdGhlIHVuZGVyZmxvdyB2YWx1ZQorCQkJCSAqIG9yIGZhaWwuCisJCQkJICovCisJCQkJaWYgKCEoZmxhZ3MgJiBGQ1BfU05TX0xFTl9WQUwpICYmCisJCQkJICAgIChmY19ycC0+ZnJfc3RhdHVzID09IDApICYmCisJCQkJICAgIChzY3NpX2J1ZmZsZW4oZnNwLT5jbWQpIC0KKwkJCQkgICAgIGZzcC0+c2NzaV9yZXNpZCkgPCBmc3AtPmNtZC0+dW5kZXJmbG93KQorCQkJCQlnb3RvIGVycjsKKwkJCQlleHBlY3RlZF9sZW4gLT0gZnNwLT5zY3NpX3Jlc2lkOworCQkJfSBlbHNlIHsKKwkJCQlmc3AtPnN0YXR1c19jb2RlID0gRkNfRVJST1I7CisJCQl9CisJCX0KKwl9CisJZnNwLT5zdGF0ZSB8PSBGQ19TUkJfUkNWX1NUQVRVUzsKKworCS8qCisJICogQ2hlY2sgZm9yIG1pc3Npbmcgb3IgZXh0cmEgZGF0YSBmcmFtZXMuCisJICovCisJaWYgKHVubGlrZWx5KGZzcC0+eGZlcl9sZW4gIT0gZXhwZWN0ZWRfbGVuKSkgeworCQlpZiAoZnNwLT54ZmVyX2xlbiA8IGV4cGVjdGVkX2xlbikgeworCQkJLyoKKwkJCSAqIFNvbWUgZGF0YSBtYXkgYmUgcXVldWVkIGxvY2FsbHksCisJCQkgKiBXYWl0IGEgYXQgbGVhc3Qgb25lIGppZmZ5IHRvIHNlZSBpZiBpdCBpcyBkZWxpdmVyZWQuCisJCQkgKiBJZiB0aGlzIGV4cGlyZXMgd2l0aG91dCBkYXRhLCB3ZSBtYXkgZG8gU1JSLgorCQkJICovCisJCQlmY19mY3BfdGltZXJfc2V0KGZzcCwgMik7CisJCQlyZXR1cm47CisJCX0KKwkJZnNwLT5zdGF0dXNfY29kZSA9IEZDX0RBVEFfT1ZSUlVOOworCQlGQ19EQkcoInRndCAlNnggeGZlciBsZW4gJXp4IGdyZWF0ZXIgdGhhbiBleHBlY3RlZCBsZW4gJXguICIKKwkJICAgICAgICJkYXRhIGxlbiAleFxuIiwKKwkJICAgICAgIGZzcC0+cnBvcnQtPnBvcnRfaWQsCisJCSAgICAgICBmc3AtPnhmZXJfbGVuLCBleHBlY3RlZF9sZW4sIGZzcC0+ZGF0YV9sZW4pOworCX0KKwlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7CisJcmV0dXJuOworCitsZW5fZXJyOgorCUZDX0RCRygic2hvcnQgRkNQIHJlc3BvbnNlLiBmbGFncyAweCV4IGxlbiAldSByZXNwbCAldSBzbnNsICV1XG4iLAorCSAgICAgICBmbGFncywgZnJfbGVuKGZwKSwgcmVzcGwsIHNuc2wpOworZXJyOgorCWZzcC0+c3RhdHVzX2NvZGUgPSBGQ19FUlJPUjsKKwlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7Cit9CisKKy8qKgorICogZmNfZmNwX2NvbXBsZXRlX2xvY2tlZCAtIGNvbXBsZXRlIHByb2Nlc3Npbmcgb2YgYSBmY3AgcGFja2V0CisgKiBAZnNwOglmY3AgcGFja2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgaWYgYSB0aW1lciBpcyBwZW5kaW5nLiBUaGUgcGFja2V0IGxvY2sgbXVzdCBiZQorICogaGVsZCwgYW5kIHRoZSBob3N0IGxvY2sgbXVzdCBub3QgYmUgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwKQoreworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBmc3AtPmxwOworCXN0cnVjdCBmY19zZXEgKnNlcTsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXA7CisJdTMyIGZfY3RsOworCisJaWYgKGZzcC0+c3RhdGUgJiBGQ19TUkJfQUJPUlRfUEVORElORykKKwkJcmV0dXJuOworCisJaWYgKGZzcC0+c3RhdGUgJiBGQ19TUkJfQUJPUlRFRCkgeworCQlpZiAoIWZzcC0+c3RhdHVzX2NvZGUpCisJCQlmc3AtPnN0YXR1c19jb2RlID0gRkNfQ01EX0FCT1JURUQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGVzdCBmb3IgdHJhbnNwb3J0IHVuZGVycnVuLCBpbmRlcGVuZGVudCBvZiByZXNwb25zZQorCQkgKiB1bmRlcnJ1biBzdGF0dXMuCisJCSAqLworCQlpZiAoZnNwLT54ZmVyX2xlbiA8IGZzcC0+ZGF0YV9sZW4gJiYgIWZzcC0+aW9fc3RhdHVzICYmCisJCSAgICAoIShmc3AtPnNjc2lfY29tcF9mbGFncyAmIEZDUF9SRVNJRF9VTkRFUikgfHwKKwkJICAgICBmc3AtPnhmZXJfbGVuIDwgZnNwLT5kYXRhX2xlbiAtIGZzcC0+c2NzaV9yZXNpZCkpIHsKKwkJCWZzcC0+c3RhdHVzX2NvZGUgPSBGQ19EQVRBX1VORFJVTjsKKwkJCWZzcC0+aW9fc3RhdHVzID0gU1VHR0VTVF9SRVRSWSA8PCAyNDsKKwkJfQorCX0KKworCXNlcSA9IGZzcC0+c2VxX3B0cjsKKwlpZiAoc2VxKSB7CisJCWZzcC0+c2VxX3B0ciA9IE5VTEw7CisJCWlmICh1bmxpa2VseShmc3AtPnNjc2lfY29tcF9mbGFncyAmIEZDUF9DT05GX1JFUSkpIHsKKwkJCXN0cnVjdCBmY19mcmFtZSAqY29uZl9mcmFtZTsKKwkJCXN0cnVjdCBmY19zZXEgKmNzcDsKKworCQkJY3NwID0gbHAtPnR0LnNlcV9zdGFydF9uZXh0KHNlcSk7CisJCQljb25mX2ZyYW1lID0gZmNfZnJhbWVfYWxsb2MoZnNwLT5scCwgMCk7CisJCQlpZiAoY29uZl9mcmFtZSkgeworCQkJCWZfY3RsID0gRkNfRkNfU0VRX0lOSVQ7CisJCQkJZl9jdGwgfD0gRkNfRkNfTEFTVF9TRVEgfCBGQ19GQ19FTkRfU0VROworCQkJCWVwID0gZmNfc2VxX2V4Y2goc2VxKTsKKwkJCQlmY19maWxsX2ZjX2hkcihjb25mX2ZyYW1lLCBGQ19SQ1RMX0REX1NPTF9DVEwsCisJCQkJCSAgICAgICBlcC0+ZGlkLCBlcC0+c2lkLAorCQkJCQkgICAgICAgRkNfVFlQRV9GQ1AsIGZfY3RsLCAwKTsKKwkJCQlscC0+dHQuc2VxX3NlbmQobHAsIGNzcCwgY29uZl9mcmFtZSk7CisJCQl9CisJCX0KKwkJbHAtPnR0LmV4Y2hfZG9uZShzZXEpOworCX0KKwlmY19pb19jb21wbChmc3ApOworfQorCitzdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cF9jbWQoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgaW50IGVycm9yKQoreworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBmc3AtPmxwOworCisJaWYgKGZzcC0+c2VxX3B0cikgeworCQlscC0+dHQuZXhjaF9kb25lKGZzcC0+c2VxX3B0cik7CisJCWZzcC0+c2VxX3B0ciA9IE5VTEw7CisJfQorCWZzcC0+c3RhdHVzX2NvZGUgPSBlcnJvcjsKK30KKworLyoqCisgKiBmY19mY3BfY2xlYW51cF9lYWNoX2NtZCAtIHJ1biBmbiBvbiBlYWNoIGFjdGl2ZSBjb21tYW5kCisgKiBAbHA6CQlsb2dpY2FsIHBvcnQKKyAqIEBpZDoJCXRhcmdldCBpZAorICogQGx1bjoJbHVuCisgKiBAZXJyb3I6CWZzcCBzdGF0dXMgY29kZQorICoKKyAqIElmIGx1biBvciBpZCBpcyAtMSwgdGhleSBhcmUgaWdub3JlZC4KKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX2NsZWFudXBfZWFjaF9jbWQoc3RydWN0IGZjX2xwb3J0ICpscCwgdW5zaWduZWQgaW50IGlkLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbHVuLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK3Jlc3RhcnQ6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmc3AsICZzaS0+c2NzaV9wa3RfcXVldWUsIGxpc3QpIHsKKwkJc2NfY21kID0gZnNwLT5jbWQ7CisJCWlmIChpZCAhPSAtMSAmJiBzY21kX2lkKHNjX2NtZCkgIT0gaWQpCisJCQljb250aW51ZTsKKworCQlpZiAobHVuICE9IC0xICYmIHNjX2NtZC0+ZGV2aWNlLT5sdW4gIT0gbHVuKQorCQkJY29udGludWU7CisKKwkJZmNfZmNwX3BrdF9ob2xkKGZzcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJCWlmICghZmNfZmNwX2xvY2tfcGt0KGZzcCkpIHsKKwkJCWZjX2ZjcF9jbGVhbnVwX2NtZChmc3AsIGVycm9yKTsKKwkJCWZjX2lvX2NvbXBsKGZzcCk7CisJCQlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworCQl9CisKKwkJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJLyoKKwkJICogd2hpbGUgd2UgZHJvcHBlZCB0aGUgbG9jayBtdWx0aXBsZSBwa3RzIGNvdWxkCisJCSAqIGhhdmUgYmVlbiByZWxlYXNlZCwgc28gd2UgaGF2ZSB0byBzdGFydCBvdmVyLgorCQkgKi8KKwkJZ290byByZXN0YXJ0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZmNfZmNwX2Fib3J0X2lvKHN0cnVjdCBmY19scG9ydCAqbHApCit7CisJZmNfZmNwX2NsZWFudXBfZWFjaF9jbWQobHAsIC0xLCAtMSwgRkNfSFJEX0VSUk9SKTsKK30KKworLyoqCisgKiBmY19mY3BfcGt0X3NlbmQgLSBzZW5kIGEgZmNwIHBhY2tldCB0byB0aGUgbG93ZXIgbGV2ZWwuCisgKiBAbHA6CQlmYyBscG9ydAorICogQGZzcDoJZmMgcGFja2V0LgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHVwcGVyIGxheWVyIHByb3RvY29sLgorICogUmV0dXJuICAgOiB6ZXJvIGZvciBzdWNjZXNzIGFuZCAtMSBmb3IgZmFpbHVyZQorICogQ29udGV4dCAgOiBjYWxsZWQgZnJvbSBxdWV1ZWNvbW1hbmQgd2hpY2ggY2FuIGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MKKyAqCSAgICAgIG9yIHNjc2kgc29mdCBpcnEuCisgKiBMb2NrcyAgICA6IGNhbGxlZCB3aXRoIHRoZSBob3N0IGxvY2sgYW5kIGlycXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgZmNfZmNwX3BrdF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJaW50IHJjOworCisJZnNwLT5jbWQtPlNDcC5wdHIgPSAoY2hhciAqKWZzcDsKKwlmc3AtPmNkYl9jbWQuZmNfZGwgPSBodG9ubChmc3AtPmRhdGFfbGVuKTsKKwlmc3AtPmNkYl9jbWQuZmNfZmxhZ3MgPSBmc3AtPnJlcV9mbGFncyAmIH5GQ1BfQ0ZMX0xFTl9NQVNLOworCisJaW50X3RvX3Njc2lsdW4oZnNwLT5jbWQtPmRldmljZS0+bHVuLAorCQkgICAgICAgKHN0cnVjdCBzY3NpX2x1biAqKWZzcC0+Y2RiX2NtZC5mY19sdW4pOworCW1lbWNweShmc3AtPmNkYl9jbWQuZmNfY2RiLCBmc3AtPmNtZC0+Y21uZCwgZnNwLT5jbWQtPmNtZF9sZW4pOworCWxpc3RfYWRkX3RhaWwoJmZzcC0+bGlzdCwgJnNpLT5zY3NpX3BrdF9xdWV1ZSk7CisKKwlzcGluX3VubG9ja19pcnEobHAtPmhvc3QtPmhvc3RfbG9jayk7CisJcmMgPSBscC0+dHQuZmNwX2NtZF9zZW5kKGxwLCBmc3AsIGZjX2ZjcF9yZWN2KTsKKwlzcGluX2xvY2tfaXJxKGxwLT5ob3N0LT5ob3N0X2xvY2spOworCWlmIChyYykKKwkJbGlzdF9kZWwoJmZzcC0+bGlzdCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmNfZmNwX2NtZF9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsCisJCQkgICB2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLAorCQkJCQlzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCQl2b2lkICphcmcpKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX3NlcSAqc2VxOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2YoZnNwLT5jZGJfY21kKTsKKwlpbnQgcmMgPSAwOworCisJaWYgKGZjX2ZjcF9sb2NrX3BrdChmc3ApKQorCQlyZXR1cm4gMDsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHAsIHNpemVvZihmc3AtPmNkYl9jbWQpKTsKKwlpZiAoIWZwKSB7CisJCXJjID0gLTE7CisJCWdvdG8gdW5sb2NrOworCX0KKworCW1lbWNweShmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKSwgJmZzcC0+Y2RiX2NtZCwgbGVuKTsKKwlmcl9jbWQoZnApID0gZnNwLT5jbWQ7CisJcnBvcnQgPSBmc3AtPnJwb3J0OworCWZzcC0+bWF4X3BheWxvYWQgPSBycG9ydC0+bWF4ZnJhbWVfc2l6ZTsKKwlycCA9IHJwb3J0LT5kZF9kYXRhOworCisJZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRERfVU5TT0xfQ01ELCBycG9ydC0+cG9ydF9pZCwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChycC0+bG9jYWxfcG9ydC0+aG9zdCksIEZDX1RZUEVfRkNQLAorCQkgICAgICAgRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKKworCXNlcSA9IGxwLT50dC5leGNoX3NlcV9zZW5kKGxwLCBmcCwgcmVzcCwgZmNfZmNwX3BrdF9kZXN0cm95LCBmc3AsIDApOworCWlmICghc2VxKSB7CisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQlyYyA9IC0xOworCQlnb3RvIHVubG9jazsKKwl9CisJZnNwLT5sYXN0X3BrdF90aW1lID0gamlmZmllczsKKwlmc3AtPnNlcV9wdHIgPSBzZXE7CisJZmNfZmNwX3BrdF9ob2xkKGZzcCk7CS8qIGhvbGQgZm9yIGZjX2ZjcF9wa3RfZGVzdHJveSAqLworCisJc2V0dXBfdGltZXIoJmZzcC0+dGltZXIsIGZjX2ZjcF90aW1lb3V0LCAodW5zaWduZWQgbG9uZylmc3ApOworCWZjX2ZjcF90aW1lcl9zZXQoZnNwLAorCQkJIChmc3AtPnRndF9mbGFncyAmIEZDX1JQX0ZMQUdTX1JFQ19TVVBQT1JURUQpID8KKwkJCSBGQ19TQ1NJX1JFQ19UT1YgOiBGQ19TQ1NJX0VSX1RJTUVPVVQpOwordW5sb2NrOgorCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogdHJhbnNwb3J0IGVycm9yIGhhbmRsZXIKKyAqLworc3RhdGljIHZvaWQgZmNfZmNwX2Vycm9yKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJaW50IGVycm9yID0gUFRSX0VSUihmcCk7CisKKwlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCisJCXJldHVybjsKKworCXN3aXRjaCAoZXJyb3IpIHsKKwljYXNlIC1GQ19FWF9DTE9TRUQ6CisJCWZjX2ZjcF9yZXRyeV9jbWQoZnNwKTsKKwkJZ290byB1bmxvY2s7CisJZGVmYXVsdDoKKwkJRkNfREJHKCJ1bmtub3duIGVycm9yICVsZFxuIiwgUFRSX0VSUihmcCkpOworCX0KKwkvKgorCSAqIGNsZWFyIGFib3J0IHBlbmRpbmcsIGJlY2F1c2UgdGhlIGxvd2VyIGxheWVyCisJICogZGVjaWRlZCB0byBmb3JjZSBjb21wbGV0aW9uLgorCSAqLworCWZzcC0+c3RhdGUgJj0gfkZDX1NSQl9BQk9SVF9QRU5ESU5HOworCWZzcC0+c3RhdHVzX2NvZGUgPSBGQ19DTURfUExPR087CisJZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChmc3ApOwordW5sb2NrOgorCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7Cit9CisKKy8qCisgKiBTY3NpIGFib3J0IGhhbmRsZXItIGNhbGxzIHRvIHNlbmQgYW4gYWJvcnQKKyAqIGFuZCB0aGVuIHdhaXQgZm9yIGFib3J0IGNvbXBsZXRpb24KKyAqLworc3RhdGljIGludCBmY19mY3BfcGt0X2Fib3J0KHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJaW50IHJjID0gRkFJTEVEOworCisJaWYgKGZjX2ZjcF9zZW5kX2Fib3J0KGZzcCkpCisJCXJldHVybiBGQUlMRUQ7CisKKwlpbml0X2NvbXBsZXRpb24oJmZzcC0+dG1fZG9uZSk7CisJZnNwLT53YWl0X2Zvcl9jb21wID0gMTsKKworCXNwaW5fdW5sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmc3AtPnRtX2RvbmUsIEZDX1NDU0lfVE1fVE9WKTsKKwlzcGluX2xvY2tfYmgoJmZzcC0+c2NzaV9wa3RfbG9jayk7CisJZnNwLT53YWl0X2Zvcl9jb21wID0gMDsKKworCWlmICghcmMpIHsKKwkJRkNfREJHKCJ0YXJnZXQgYWJvcnQgY21kICBmYWlsZWRcbiIpOworCQlyYyA9IEZBSUxFRDsKKwl9IGVsc2UgaWYgKGZzcC0+c3RhdGUgJiBGQ19TUkJfQUJPUlRFRCkgeworCQlGQ19EQkcoInRhcmdldCBhYm9ydCBjbWQgIHBhc3NlZFxuIik7CisJCXJjID0gU1VDQ0VTUzsKKwkJZmNfZmNwX2NvbXBsZXRlX2xvY2tlZChmc3ApOworCX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFJldHJ5IExVTiByZXNldCBhZnRlciByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworc3RhdGljIHZvaWQgZmNfbHVuX3Jlc2V0X3NlbmQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBmY19mY3BfcGt0ICpmc3AgPSAoc3RydWN0IGZjX2ZjcF9wa3QgKilkYXRhOworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBmc3AtPmxwOworCWlmIChscC0+dHQuZmNwX2NtZF9zZW5kKGxwLCBmc3AsIGZjX3RtX2RvbmUpKSB7CisJCWlmIChmc3AtPnJlY292X3JldHJ5KysgPj0gRkNfTUFYX1JFQ09WX1JFVFJZKQorCQkJcmV0dXJuOworCQlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCisJCQlyZXR1cm47CisJCXNldHVwX3RpbWVyKCZmc3AtPnRpbWVyLCBmY19sdW5fcmVzZXRfc2VuZCwgKHVuc2lnbmVkIGxvbmcpZnNwKTsKKwkJZmNfZmNwX3RpbWVyX3NldChmc3AsIEZDX1NDU0lfUkVDX1RPVik7CisJCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7CisJfQorfQorCisvKgorICogU2NzaSBkZXZpY2UgcmVzZXQgaGFuZGxlci0gc2VuZCBhIExVTiBSRVNFVCB0byB0aGUgZGV2aWNlCisgKiBhbmQgd2FpdCBmb3IgcmVzZXQgcmVwbHkKKyAqLworc3RhdGljIGludCBmY19sdW5fcmVzZXQoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwKKwkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGx1bikKK3sKKwlpbnQgcmM7CisKKwlmc3AtPmNkYl9jbWQuZmNfZGwgPSBodG9ubChmc3AtPmRhdGFfbGVuKTsKKwlmc3AtPmNkYl9jbWQuZmNfdG1fZmxhZ3MgPSBGQ1BfVE1GX0xVTl9SRVNFVDsKKwlpbnRfdG9fc2NzaWx1bihsdW4sIChzdHJ1Y3Qgc2NzaV9sdW4gKilmc3AtPmNkYl9jbWQuZmNfbHVuKTsKKworCWZzcC0+d2FpdF9mb3JfY29tcCA9IDE7CisJaW5pdF9jb21wbGV0aW9uKCZmc3AtPnRtX2RvbmUpOworCisJZmNfbHVuX3Jlc2V0X3NlbmQoKHVuc2lnbmVkIGxvbmcpZnNwKTsKKworCS8qCisJICogd2FpdCBmb3IgY29tcGxldGlvbiBvZiByZXNldAorCSAqIGFmdGVyIHRoYXQgbWFrZSBzdXJlIGFsbCBjb21tYW5kcyBhcmUgdGVybWluYXRlZAorCSAqLworCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmc3AtPnRtX2RvbmUsIEZDX1NDU0lfVE1fVE9WKTsKKworCXNwaW5fbG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKwlmc3AtPnN0YXRlIHw9IEZDX1NSQl9DT01QTDsKKwlzcGluX3VubG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKworCWRlbF90aW1lcl9zeW5jKCZmc3AtPnRpbWVyKTsKKworCXNwaW5fbG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKwlpZiAoZnNwLT5zZXFfcHRyKSB7CisJCWxwLT50dC5leGNoX2RvbmUoZnNwLT5zZXFfcHRyKTsKKwkJZnNwLT5zZXFfcHRyID0gTlVMTDsKKwl9CisJZnNwLT53YWl0X2Zvcl9jb21wID0gMDsKKwlzcGluX3VubG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKworCWlmICghcmMpIHsKKwkJRkNfREJHKCJsdW4gcmVzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBjZGJfc3RhdHVzIGhvbGRzIHRoZSB0bWYncyByc3AgY29kZSAqLworCWlmIChmc3AtPmNkYl9zdGF0dXMgIT0gRkNQX1RNRl9DTVBMKQorCQlyZXR1cm4gRkFJTEVEOworCisJRkNfREJHKCJsdW4gcmVzZXQgdG8gbHVuICV1IGNvbXBsZXRlZFxuIiwgbHVuKTsKKwlmY19mY3BfY2xlYW51cF9lYWNoX2NtZChscCwgaWQsIGx1biwgRkNfQ01EX0FCT1JURUQpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogVGFzayBNYW5hZ21lbnQgcmVzcG9uc2UgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBmY190bV9kb25lKHN0cnVjdCBmY19zZXEgKnNlcSwgc3RydWN0IGZjX2ZyYW1lICpmcCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBmY19mY3BfcGt0ICpmc3AgPSBhcmc7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbiBlcnJvciBqdXN0IGxldCBpdCB0aW1lb3V0IG9yIHdhaXQKKwkJICogZm9yIFRNRiB0byBiZSBhYm9ydGVkIGlmIGl0IHRpbWVkb3V0LgorCQkgKgorCQkgKiBzY3NpLWVoIHdpbGwgZXNjYWxhdGUgZm9yIHdoZW4gZWl0aGVyIGhhcHBlbnMuCisJCSAqLworCQlyZXR1cm47CisJfQorCisJaWYgKGZjX2ZjcF9sb2NrX3BrdChmc3ApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHJhY2VkIHdpdGggZWggdGltZW91dCBoYW5kbGVyLgorCSAqLworCWlmICghZnNwLT5zZXFfcHRyIHx8ICFmc3AtPndhaXRfZm9yX2NvbXApIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmZzcC0+c2NzaV9wa3RfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCWlmIChmaC0+ZmhfdHlwZSAhPSBGQ19UWVBFX0JMUykKKwkJZmNfZmNwX3Jlc3AoZnNwLCBmcCk7CisJZnNwLT5zZXFfcHRyID0gTlVMTDsKKwlmc3AtPmxwLT50dC5leGNoX2RvbmUoc2VxKTsKKwlmY19mcmFtZV9mcmVlKGZwKTsKKwlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworfQorCitzdGF0aWMgdm9pZCBmY19mY3BfY2xlYW51cChzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCWZjX2ZjcF9jbGVhbnVwX2VhY2hfY21kKGxwLCAtMSwgLTEsIEZDX0VSUk9SKTsKK30KKworLyoKKyAqIGZjX2ZjcF90aW1lb3V0OiBjYWxsZWQgYnkgT1MgdGltZXIgZnVuY3Rpb24uCisgKgorICogVGhlIHRpbWVyIGhhcyBiZWVuIGluYWN0aXZhdGVkIGFuZCBtdXN0IGJlIHJlYWN0aXZhdGVkIGlmIGRlc2lyZWQKKyAqIHVzaW5nIGZjX2ZjcF90aW1lcl9zZXQoKS4KKyAqCisgKiBBbGdvcml0aG06CisgKgorICogSWYgUkVDIGlzIHN1cHBvcnRlZCwganVzdCBpc3N1ZSBpdCwgYW5kIHJldHVybi4gIFRoZSBSRUMgZXhjaGFuZ2Ugd2lsbAorICogY29tcGxldGUgb3IgdGltZSBvdXQsIGFuZCByZWNvdmVyeSBjYW4gY29udGludWUgYXQgdGhhdCBwb2ludC4KKyAqCisgKiBPdGhlcndpc2UsIGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCB3aXRob3V0IGFsbCB0aGUgZGF0YSwKKyAqIGl0IGhhcyBiZWVuIEVSX1RJTUVPVVQgc2luY2UgdGhlIHJlc3BvbnNlIHdhcyByZWNlaXZlZC4KKyAqCisgKiBJZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkLAorICogd2Ugc2VlIGlmIGRhdGEgd2FzIHJlY2VpdmVkIHJlY2VudGx5LiAgSWYgaXQgaGFzIGJlZW4sIHdlIGNvbnRpbnVlIHdhaXRpbmcsCisgKiBvdGhlcndpc2UsIHdlIGFib3J0IHRoZSBjb21tYW5kLgorICovCitzdGF0aWMgdm9pZCBmY19mY3BfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCA9IChzdHJ1Y3QgZmNfZmNwX3BrdCAqKWRhdGE7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IGZzcC0+cnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwID0gcnBvcnQtPmRkX2RhdGE7CisKKwlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCisJCXJldHVybjsKKworCWlmIChmc3AtPmNkYl9jbWQuZmNfdG1fZmxhZ3MpCisJCWdvdG8gdW5sb2NrOworCisJZnNwLT5zdGF0ZSB8PSBGQ19TUkJfRkNQX1BST0NFU1NJTkdfVE1POworCisJaWYgKHJwLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFQ19TVVBQT1JURUQpCisJCWZjX2ZjcF9yZWMoZnNwKTsKKwllbHNlIGlmICh0aW1lX2FmdGVyX2VxKGZzcC0+bGFzdF9wa3RfdGltZSArIChGQ19TQ1NJX0VSX1RJTUVPVVQgLyAyKSwKKwkJCSAgICAgICBqaWZmaWVzKSkKKwkJZmNfZmNwX3RpbWVyX3NldChmc3AsIEZDX1NDU0lfRVJfVElNRU9VVCk7CisJZWxzZSBpZiAoZnNwLT5zdGF0ZSAmIEZDX1NSQl9SQ1ZfU1RBVFVTKQorCQlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7CisJZWxzZQorCQlmY190aW1lb3V0X2Vycm9yKGZzcCk7CisJZnNwLT5zdGF0ZSAmPSB+RkNfU1JCX0ZDUF9QUk9DRVNTSU5HX1RNTzsKK3VubG9jazoKKwlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworfQorCisvKgorICogU2VuZCBhIFJFQyBFTFMgcmVxdWVzdAorICovCitzdGF0aWMgdm9pZCBmY19mY3BfcmVjKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOworCisJbHAgPSBmc3AtPmxwOworCXJwb3J0ID0gZnNwLT5ycG9ydDsKKwlycCA9IHJwb3J0LT5kZF9kYXRhOworCWlmICghZnNwLT5zZXFfcHRyIHx8IHJwLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9SRUFEWSkgeworCQlmc3AtPnN0YXR1c19jb2RlID0gRkNfSFJEX0VSUk9SOworCQlmc3AtPmlvX3N0YXR1cyA9IFNVR0dFU1RfUkVUUlkgPDwgMjQ7CisJCWZjX2ZjcF9jb21wbGV0ZV9sb2NrZWQoZnNwKTsKKwkJcmV0dXJuOworCX0KKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwLCBzaXplb2Yoc3RydWN0IGZjX2Vsc19yZWMpKTsKKwlpZiAoIWZwKQorCQlnb3RvIHJldHJ5OworCisJZnJfc2VxKGZwKSA9IGZzcC0+c2VxX3B0cjsKKwlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVRLCBycG9ydC0+cG9ydF9pZCwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChycC0+bG9jYWxfcG9ydC0+aG9zdCksIEZDX1RZUEVfRUxTLAorCQkgICAgICAgRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKKwlpZiAobHAtPnR0LmVsc2N0X3NlbmQobHAsIHJwb3J0LCBmcCwgRUxTX1JFQywgZmNfZmNwX3JlY19yZXNwLAorCQkJICAgICAgZnNwLCBqaWZmaWVzX3RvX21zZWNzKEZDX1NDU0lfUkVDX1RPVikpKSB7CisJCWZjX2ZjcF9wa3RfaG9sZChmc3ApOwkJLyogaG9sZCB3aGlsZSBSRUMgb3V0c3RhbmRpbmcgKi8KKwkJcmV0dXJuOworCX0KKwlmY19mcmFtZV9mcmVlKGZwKTsKK3JldHJ5OgorCWlmIChmc3AtPnJlY292X3JldHJ5KysgPCBGQ19NQVhfUkVDT1ZfUkVUUlkpCisJCWZjX2ZjcF90aW1lcl9zZXQoZnNwLCBGQ19TQ1NJX1JFQ19UT1YpOworCWVsc2UKKwkJZmNfdGltZW91dF9lcnJvcihmc3ApOworfQorCisvKgorICogUmVjZWl2ZSBoYW5kbGVyIGZvciBSRUMgRUxTIGZyYW1lCisgKiBpZiBpdCBpcyBhIHJlamVjdCB0aGVuIGxldCB0aGUgc2NzaSBsYXllciB0byBoYW5kbGUKKyAqIHRoZSB0aW1lb3V0LiBpZiBpdCBpcyBhIExTX0FDQyB0aGVuIGlmIHRoZSBpbyB3YXMgbm90IGNvbXBsZXRlZAorICogdGhlbiBzZXQgdGhlIHRpbWVvdXQgYW5kIHJldHVybiBvdGhlcndpc2UgY29tcGxldGUgdGhlIGV4Y2hhbmdlCisgKiBhbmQgdGVsbCB0aGUgc2NzaSBsYXllciB0byByZXN0YXJ0IHRoZSBJL08uCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9yZWNfcmVzcChzdHJ1Y3QgZmNfc2VxICpzZXEsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwID0gKHN0cnVjdCBmY19mY3BfcGt0ICopYXJnOworCXN0cnVjdCBmY19lbHNfcmVjX2FjYyAqcmVjcDsKKwlzdHJ1Y3QgZmNfZWxzX2xzX3JqdCAqcmp0OworCXUzMiBlX3N0YXQ7CisJdTggb3Bjb2RlOworCXUzMiBvZmZzZXQ7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGF0YV9kaXI7CisJZW51bSBmY19yY3RsIHJfY3RsOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKworCWlmIChJU19FUlIoZnApKSB7CisJCWZjX2ZjcF9yZWNfZXJyb3IoZnNwLCBmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmNfZmNwX2xvY2tfcGt0KGZzcCkpCisJCWdvdG8gb3V0OworCisJZnNwLT5yZWNvdl9yZXRyeSA9IDA7CisJb3Bjb2RlID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CisJaWYgKG9wY29kZSA9PSBFTFNfTFNfUkpUKSB7CisJCXJqdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJqdCkpOworCQlzd2l0Y2ggKHJqdC0+ZXJfcmVhc29uKSB7CisJCWRlZmF1bHQ6CisJCQlGQ19ERUJVR19GQ1AoImRldmljZSAleCB1bmV4cGVjdGVkIFJFQyByZWplY3QgIgorCQkJCSAgICAgInJlYXNvbiAlZCBleHBsICVkXG4iLAorCQkJCSAgICAgZnNwLT5ycG9ydC0+cG9ydF9pZCwgcmp0LT5lcl9yZWFzb24sCisJCQkJICAgICByanQtPmVyX2V4cGxhbik7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBFTFNfUkpUX1VOU1VQOgorCQkJRkNfREVCVUdfRkNQKCJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBSRUNcbiIpOworCQkJcnAgPSBmc3AtPnJwb3J0LT5kZF9kYXRhOworCQkJLyoKKwkJCSAqIGlmIHdlIGRvIG5vdCBzcHBvcnQgUkVDcyBvciBnb3Qgc29tZSBib2d1cworCQkJICogcmVhc29uIHRoZW4gcmVzZXR1cCB0aW1lciBzbyB3ZSBjaGVjayBmb3IKKwkJCSAqIG1ha2luZyBwcm9ncmVzcy4KKwkJCSAqLworCQkJcnAtPmZsYWdzICY9IH5GQ19SUF9GTEFHU19SRUNfU1VQUE9SVEVEOworCQkJZmNfZmNwX3RpbWVyX3NldChmc3AsIEZDX1NDU0lfRVJfVElNRU9VVCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfUkpUX0xPR0lDOgorCQljYXNlIEVMU19SSlRfVU5BQjoKKwkJCS8qCisJCQkgKiBJZiBubyBkYXRhIHRyYW5zZmVyLCB0aGUgY29tbWFuZCBmcmFtZSBnb3QgZHJvcHBlZAorCQkJICogc28gd2UganVzdCByZXRyeS4gIElmIGRhdGEgd2FzIHRyYW5zZmVycmVkLCB3ZQorCQkJICogbG9zdCB0aGUgcmVzcG9uc2UgYnV0IHRoZSB0YXJnZXQgaGFzIG5vIHJlY29yZCwKKwkJCSAqIHNvIHdlIGFib3J0IGFuZCByZXRyeS4KKwkJCSAqLworCQkJaWYgKHJqdC0+ZXJfZXhwbGFuID09IEVMU19FWFBMX09YSURfUlhJRCAmJgorCQkJICAgIGZzcC0+eGZlcl9sZW4gPT0gMCkgeworCQkJCWZjX2ZjcF9yZXRyeV9jbWQoZnNwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZjX3RpbWVvdXRfZXJyb3IoZnNwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChvcGNvZGUgPT0gRUxTX0xTX0FDQykgeworCQlpZiAoZnNwLT5zdGF0ZSAmIEZDX1NSQl9BQk9SVEVEKQorCQkJZ290byB1bmxvY2tfb3V0OworCisJCWRhdGFfZGlyID0gZnNwLT5jbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCQlyZWNwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcmVjcCkpOworCQlvZmZzZXQgPSBudG9obChyZWNwLT5yZWNhX2ZjNHZhbHVlKTsKKwkJZV9zdGF0ID0gbnRvaGwocmVjcC0+cmVjYV9lX3N0YXQpOworCisJCWlmIChlX3N0YXQgJiBFU0JfU1RfQ09NUExFVEUpIHsKKworCQkJLyoKKwkJCSAqIFRoZSBleGNoYW5nZSBpcyBjb21wbGV0ZS4KKwkJCSAqCisJCQkgKiBGb3Igb3V0cHV0LCB3ZSBtdXN0J3ZlIGxvc3QgdGhlIHJlc3BvbnNlLgorCQkJICogRm9yIGlucHV0LCBhbGwgZGF0YSBtdXN0J3ZlIGJlZW4gc2VudC4KKwkJCSAqIFdlIGxvc3QgbWF5IGhhdmUgbG9zdCB0aGUgcmVzcG9uc2UKKwkJCSAqIChhbmQgYSBjb25maXJtYXRpb24gd2FzIHJlcXVlc3RlZCkgYW5kIG1heWJlCisJCQkgKiBzb21lIGRhdGEuCisJCQkgKgorCQkJICogSWYgYWxsIGRhdGEgcmVjZWl2ZWQsIHNlbmQgU1JSCisJCQkgKiBhc2tpbmcgZm9yIHJlc3BvbnNlLgkgSWYgcGFydGlhbCBkYXRhIHJlY2VpdmVkLAorCQkJICogb3IgZ2FwcywgU1JSIHJlcXVlc3RzIGRhdGEgYXQgc3RhcnQgb2YgZ2FwLgorCQkJICogUmVjb3ZlcnkgdmlhIFNSUiByZWxpZXMgb24gaW4tb3JkZXItZGVsaXZlcnkuCisJCQkgKi8KKwkJCWlmIChkYXRhX2RpciA9PSBETUFfVE9fREVWSUNFKSB7CisJCQkJcl9jdGwgPSBGQ19SQ1RMX0REX0NNRF9TVEFUVVM7CisJCQl9IGVsc2UgaWYgKGZzcC0+eGZlcl9jb250aWdfZW5kID09IG9mZnNldCkgeworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9DTURfU1RBVFVTOworCQkJfSBlbHNlIHsKKwkJCQlvZmZzZXQgPSBmc3AtPnhmZXJfY29udGlnX2VuZDsKKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfU09MX0RBVEE7CisJCQl9CisJCQlmY19mY3Bfc3JyKGZzcCwgcl9jdGwsIG9mZnNldCk7CisJCX0gZWxzZSBpZiAoZV9zdGF0ICYgRVNCX1NUX1NFUV9JTklUKSB7CisKKwkJCS8qCisJCQkgKiBUaGUgcmVtb3RlIHBvcnQgaGFzIHRoZSBpbml0aWF0aXZlLCBzbyBqdXN0CisJCQkgKiBrZWVwIHdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlLgorCQkJICovCisJCQlmY19mY3BfdGltZXJfc2V0KGZzcCwgRkNfU0NTSV9SRUNfVE9WKTsKKwkJfSBlbHNlIHsKKworCQkJLyoKKwkJCSAqIFRoZSBleGNoYW5nZSBpcyBpbmNvbXBsZXRlLCB3ZSBoYXZlIHNlcS4gaW5pdGlhdGl2ZS4KKwkJCSAqIExvc3QgcmVzcG9uc2Ugd2l0aCByZXF1ZXN0ZWQgY29uZmlybWF0aW9uLAorCQkJICogbG9zdCBjb25maXJtYXRpb24sIGxvc3QgdHJhbnNmZXIgcmVhZHkgb3IKKwkJCSAqIGxvc3Qgd3JpdGUgZGF0YS4KKwkJCSAqCisJCQkgKiBGb3Igb3V0cHV0LCBpZiBub3QgYWxsIGRhdGEgd2FzIHJlY2VpdmVkLCBhc2sKKwkJCSAqIGZvciB0cmFuc2ZlciByZWFkeSB0byBiZSByZXBlYXRlZC4KKwkJCSAqCisJCQkgKiBJZiB3ZSByZWNlaXZlZCBvciBzZW50IGFsbCB0aGUgZGF0YSwgc2VuZCBTUlIgdG8KKwkJCSAqIHJlcXVlc3QgcmVzcG9uc2UuCisJCQkgKgorCQkJICogSWYgd2UgbG9zdCBhIHJlc3BvbnNlLCB3ZSBtYXkgaGF2ZSBsb3N0IHNvbWUgcmVhZAorCQkJICogZGF0YSBhcyB3ZWxsLgorCQkJICovCisJCQlyX2N0bCA9IEZDX1JDVExfRERfU09MX0RBVEE7CisJCQlpZiAoZGF0YV9kaXIgPT0gRE1BX1RPX0RFVklDRSkgeworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9DTURfU1RBVFVTOworCQkJCWlmIChvZmZzZXQgPCBmc3AtPmRhdGFfbGVuKQorCQkJCQlyX2N0bCA9IEZDX1JDVExfRERfREFUQV9ERVNDOworCQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gZnNwLT54ZmVyX2NvbnRpZ19lbmQpIHsKKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfQ01EX1NUQVRVUzsKKwkJCX0gZWxzZSBpZiAoZnNwLT54ZmVyX2NvbnRpZ19lbmQgPCBvZmZzZXQpIHsKKwkJCQlvZmZzZXQgPSBmc3AtPnhmZXJfY29udGlnX2VuZDsKKwkJCX0KKwkJCWZjX2ZjcF9zcnIoZnNwLCByX2N0bCwgb2Zmc2V0KTsKKwkJfQorCX0KK3VubG9ja19vdXQ6CisJZmNfZmNwX3VubG9ja19wa3QoZnNwKTsKK291dDoKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsJLyogZHJvcCBob2xkIGZvciBvdXRzdGFuZGluZyBSRUMgKi8KKwlmY19mcmFtZV9mcmVlKGZwKTsKK30KKworLyoKKyAqIEhhbmRsZSBlcnJvciByZXNwb25zZSBvciB0aW1lb3V0IGZvciBSRUMgZXhjaGFuZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9yZWNfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlpbnQgZXJyb3IgPSBQVFJfRVJSKGZwKTsKKworCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGVycm9yKSB7CisJY2FzZSAtRkNfRVhfQ0xPU0VEOgorCQlmY19mY3BfcmV0cnlfY21kKGZzcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRkNfREJHKCJSRUMgJXAgZmlkICV4IGVycm9yIHVuZXhwZWN0ZWQgZXJyb3IgJWRcbiIsCisJCSAgICAgICBmc3AsIGZzcC0+cnBvcnQtPnBvcnRfaWQsIGVycm9yKTsKKwkJZnNwLT5zdGF0dXNfY29kZSA9IEZDX0NNRF9QTE9HTzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIC1GQ19FWF9USU1FT1VUOgorCQkvKgorCQkgKiBBc3N1bWUgUkVDIG9yIExTX0FDQyB3YXMgbG9zdC4KKwkJICogVGhlIGV4Y2hhbmdlIG1hbmFnZXIgd2lsbCBoYXZlIGFib3J0ZWQgUkVDLCBzbyByZXRyeS4KKwkJICovCisJCUZDX0RCRygiUkVDIGZpZCAleCBlcnJvciBlcnJvciAlZCByZXRyeSAlZC8lZFxuIiwKKwkJICAgICAgIGZzcC0+cnBvcnQtPnBvcnRfaWQsIGVycm9yLCBmc3AtPnJlY292X3JldHJ5LAorCQkgICAgICAgRkNfTUFYX1JFQ09WX1JFVFJZKTsKKwkJaWYgKGZzcC0+cmVjb3ZfcmV0cnkrKyA8IEZDX01BWF9SRUNPVl9SRVRSWSkKKwkJCWZjX2ZjcF9yZWMoZnNwKTsKKwkJZWxzZQorCQkJZmNfdGltZW91dF9lcnJvcihmc3ApOworCQlicmVhazsKKwl9CisJZmNfZmNwX3VubG9ja19wa3QoZnNwKTsKK291dDoKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsJLyogZHJvcCBob2xkIGZvciBvdXRzdGFuZGluZyBSRUMgKi8KK30KKworLyoKKyAqIFRpbWUgb3V0IGVycm9yIHJvdXRpbmU6CisgKiBhYm9ydCdzIHRoZSBJL08gY2xvc2UgdGhlIGV4Y2hhbmdlIGFuZAorICogc2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiB0byBzY3NpIGxheWVyCisgKi8KK3N0YXRpYyB2b2lkIGZjX3RpbWVvdXRfZXJyb3Ioc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlmc3AtPnN0YXR1c19jb2RlID0gRkNfQ01EX1RJTUVfT1VUOworCWZzcC0+Y2RiX3N0YXR1cyA9IDA7CisJZnNwLT5pb19zdGF0dXMgPSAwOworCS8qCisJICogaWYgdGhpcyBmYWlscyB0aGVuIHdlIGxldCB0aGUgc2NzaSBjb21tYW5kIHRpbWVyIGZpcmUgYW5kCisJICogc2NzaS1tbCBlc2NhbGF0ZS4KKwkgKi8KKwlmY19mY3Bfc2VuZF9hYm9ydChmc3ApOworfQorCisvKgorICogU2VxdWVuY2UgcmV0cmFuc21pc3Npb24gcmVxdWVzdC4KKyAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHJlY2VpdmluZyBzdGF0dXMgYnV0IGluc3VmZmljaWVudCBkYXRhLCBvcgorICogd2hlbiBleHBlY3Rpbmcgc3RhdHVzIGJ1dCB0aGUgcmVxdWVzdCBoYXMgdGltZWQgb3V0LgorICovCitzdGF0aWMgdm9pZCBmY19mY3Bfc3JyKHN0cnVjdCBmY19mY3BfcGt0ICpmc3AsIGVudW0gZmNfcmN0bCByX2N0bCwgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gZnNwLT5scDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChmc3AtPnNlcV9wdHIpOworCXN0cnVjdCBmY19zZXEgKnNlcTsKKwlzdHJ1Y3QgZmNwX3NyciAqc3JyOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJdTggY2RiX29wOworCisJcnBvcnQgPSBmc3AtPnJwb3J0OworCXJwID0gcnBvcnQtPmRkX2RhdGE7CisJY2RiX29wID0gZnNwLT5jZGJfY21kLmZjX2NkYlswXTsKKworCWlmICghKHJwLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFVFJZKSB8fCBycC0+cnBfc3RhdGUgIT0gUlBPUlRfU1RfUkVBRFkpCisJCWdvdG8gcmV0cnk7CQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLworCWZwID0gZmNfZnJhbWVfYWxsb2MobHAsIHNpemVvZigqc3JyKSk7CisJaWYgKCFmcCkKKwkJZ290byByZXRyeTsKKworCXNyciA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnNycikpOworCW1lbXNldChzcnIsIDAsIHNpemVvZigqc3JyKSk7CisJc3JyLT5zcnJfb3AgPSBFTFNfU1JSOworCXNyci0+c3JyX294X2lkID0gaHRvbnMoZXAtPm94aWQpOworCXNyci0+c3JyX3J4X2lkID0gaHRvbnMoZXAtPnJ4aWQpOworCXNyci0+c3JyX3JfY3RsID0gcl9jdGw7CisJc3JyLT5zcnJfcmVsX29mZiA9IGh0b25sKG9mZnNldCk7CisKKwlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFM0X1JFUSwgcnBvcnQtPnBvcnRfaWQsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQocnAtPmxvY2FsX3BvcnQtPmhvc3QpLCBGQ19UWVBFX0ZDUCwKKwkJICAgICAgIEZDX0ZDX0ZJUlNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CisKKwlzZXEgPSBscC0+dHQuZXhjaF9zZXFfc2VuZChscCwgZnAsIGZjX2ZjcF9zcnJfcmVzcCwgTlVMTCwKKwkJCQkgICBmc3AsIGppZmZpZXNfdG9fbXNlY3MoRkNfU0NTSV9SRUNfVE9WKSk7CisJaWYgKCFzZXEpIHsKKwkJZmNfZnJhbWVfZnJlZShmcCk7CisJCWdvdG8gcmV0cnk7CisJfQorCWZzcC0+cmVjb3Zfc2VxID0gc2VxOworCWZzcC0+eGZlcl9sZW4gPSBvZmZzZXQ7CisJZnNwLT54ZmVyX2NvbnRpZ19lbmQgPSBvZmZzZXQ7CisJZnNwLT5zdGF0ZSAmPSB+RkNfU1JCX1JDVl9TVEFUVVM7CisJZmNfZmNwX3BrdF9ob2xkKGZzcCk7CQkvKiBob2xkIGZvciBvdXRzdGFuZGluZyBTUlIgKi8KKwlyZXR1cm47CityZXRyeToKKwlmY19mY3BfcmV0cnlfY21kKGZzcCk7Cit9CisKKy8qCisgKiBIYW5kbGUgcmVzcG9uc2UgZnJvbSBTUlIuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2ZjcF9zcnJfcmVzcChzdHJ1Y3QgZmNfc2VxICpzZXEsIHN0cnVjdCBmY19mcmFtZSAqZnAsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwID0gYXJnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCisJaWYgKElTX0VSUihmcCkpIHsKKwkJZmNfZmNwX3Nycl9lcnJvcihmc3AsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkKKwkJZ290byBvdXQ7CisKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCS8qCisJICogQlVHPyBmY19mY3Bfc3JyX2Vycm9yIGNhbGxzIGV4Y2hfZG9uZSB3aGljaCB3b3VsZCByZWxlYXNlCisJICogdGhlIGVwLiBCdXQgaWYgZmNfZmNwX3Nycl9lcnJvciBoYWQgZ290IC1GQ19FWF9USU1FT1VULAorCSAqIHRoZW4gZmNfZXhjaF90aW1lb3V0IHdvdWxkIGJlIHNlbmRpbmcgYW4gYWJvcnQuIFRoZSBleGNoX2RvbmUKKwkgKiBjYWxsIGJ5IGZjX2ZjcF9zcnJfZXJyb3Igd291bGQgcHJldmVudCBmY19leGNoLmMgZnJvbSBzZWVpbmcKKwkgKiBhbiBhYm9ydCByZXNwb25zZSB0aG91Z2guCisJICovCisJaWYgKGZoLT5maF90eXBlID09IEZDX1RZUEVfQkxTKSB7CisJCWZjX2ZjcF91bmxvY2tfcGt0KGZzcCk7CisJCXJldHVybjsKKwl9CisKKwlmc3AtPnJlY292X3NlcSA9IE5VTEw7CisJc3dpdGNoIChmY19mcmFtZV9wYXlsb2FkX29wKGZwKSkgeworCWNhc2UgRUxTX0xTX0FDQzoKKwkJZnNwLT5yZWNvdl9yZXRyeSA9IDA7CisJCWZjX2ZjcF90aW1lcl9zZXQoZnNwLCBGQ19TQ1NJX1JFQ19UT1YpOworCQlicmVhazsKKwljYXNlIEVMU19MU19SSlQ6CisJZGVmYXVsdDoKKwkJZmNfdGltZW91dF9lcnJvcihmc3ApOworCQlicmVhazsKKwl9CisJZmNfZmNwX3VubG9ja19wa3QoZnNwKTsKKwlmc3AtPmxwLT50dC5leGNoX2RvbmUoc2VxKTsKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsJLyogZHJvcCBob2xkIGZvciBvdXRzdGFuZGluZyBTUlIgKi8KK30KKworc3RhdGljIHZvaWQgZmNfZmNwX3Nycl9lcnJvcihzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCWlmIChmY19mY3BfbG9ja19wa3QoZnNwKSkKKwkJZ290byBvdXQ7CisJZnNwLT5scC0+dHQuZXhjaF9kb25lKGZzcC0+cmVjb3Zfc2VxKTsKKwlmc3AtPnJlY292X3NlcSA9IE5VTEw7CisJc3dpdGNoIChQVFJfRVJSKGZwKSkgeworCWNhc2UgLUZDX0VYX1RJTUVPVVQ6CisJCWlmIChmc3AtPnJlY292X3JldHJ5KysgPCBGQ19NQVhfUkVDT1ZfUkVUUlkpCisJCQlmY19mY3BfcmVjKGZzcCk7CisJCWVsc2UKKwkJCWZjX3RpbWVvdXRfZXJyb3IoZnNwKTsKKwkJYnJlYWs7CisJY2FzZSAtRkNfRVhfQ0xPU0VEOgkJCS8qIGUuZy4sIGxpbmsgZmFpbHVyZSAqLworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlmY19mY3BfcmV0cnlfY21kKGZzcCk7CisJCWJyZWFrOworCX0KKwlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworb3V0OgorCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOwkvKiBkcm9wIGhvbGQgZm9yIG91dHN0YW5kaW5nIFNSUiAqLworfQorCitzdGF0aWMgaW5saW5lIGludCBmY19mY3BfbHBvcnRfcXVldWVfcmVhZHkoc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwkvKiBsb2NrID8gKi8KKwlyZXR1cm4gKGxwLT5zdGF0ZSA9PSBMUE9SVF9TVF9SRUFEWSkgJiYgKGxwLT5saW5rX3N0YXR1cyAmIEZDX0xJTktfVVApOworfQorCisvKioKKyAqIGZjX3F1ZXVlY29tbWFuZCAtIFRoZSBxdWV1ZWNvbW1hbmQgZnVuY3Rpb24gb2YgdGhlIHNjc2kgdGVtcGxhdGUKKyAqIEBjbWQ6CXN0cnVjdCBzY3NpX2NtbmQgdG8gYmUgZXhlY3V0ZWQKKyAqIEBkb25lOglDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBjbWQgaXMgY29tcGxldGVkCisgKgorICogdGhpcyBpcyB0aGUgaS9vIHN0cmF0ZWd5IHJvdXRpbmUsIGNhbGxlZCBieSB0aGUgc2NzaSBsYXllcgorICogdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIGhvbGRpbmcgdGhlIGhvc3RfbG9jay4KKyAqLworaW50IGZjX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2NfY21kLT5kZXZpY2UpKTsKKwlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKKwlpbnQgcnZhbDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CisKKwlscCA9IHNob3N0X3ByaXYoc2NfY21kLT5kZXZpY2UtPmhvc3QpOworCisJcnZhbCA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKKwlpZiAocnZhbCkgeworCQlzY19jbWQtPnJlc3VsdCA9IHJ2YWw7CisJCWRvbmUoc2NfY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEqKHN0cnVjdCBmY19yZW1vdGVfcG9ydCAqKilycG9ydC0+ZGRfZGF0YSkgeworCQkvKgorCQkgKiBycG9ydCBpcyB0cmFuc2l0aW9uaW5nIGZyb20gYmxvY2tlZC9kZWxldGVkIHRvCisJCSAqIG9ubGluZQorCQkgKi8KKwkJc2NfY21kLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQlkb25lKHNjX2NtZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJwID0gcnBvcnQtPmRkX2RhdGE7CisKKwlpZiAoIWZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShscCkpIHsKKwkJcmMgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlmc3AgPSBmY19mY3BfcGt0X2FsbG9jKGxwLCBHRlBfQVRPTUlDKTsKKwlpZiAoZnNwID09IE5VTEwpIHsKKwkJcmMgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGJ1aWxkIHRoZSBsaWJmYyByZXF1ZXN0IHBrdAorCSAqLworCWZzcC0+Y21kID0gc2NfY21kOwkvKiBzYXZlIHRoZSBjbWQgKi8KKwlmc3AtPmxwID0gbHA7CQkvKiBzYXZlIHRoZSBzb2Z0YyBwdHIgKi8KKwlmc3AtPnJwb3J0ID0gcnBvcnQ7CS8qIHNldCB0aGUgcmVtb3RlIHBvcnQgcHRyICovCisJc2NfY21kLT5zY3NpX2RvbmUgPSBkb25lOworCisJLyoKKwkgKiBzZXQgdXAgdGhlIHRyYW5zZmVyIGxlbmd0aAorCSAqLworCWZzcC0+ZGF0YV9sZW4gPSBzY3NpX2J1ZmZsZW4oc2NfY21kKTsKKwlmc3AtPnhmZXJfbGVuID0gMDsKKworCS8qCisJICogc2V0dXAgdGhlIGRhdGEgZGlyZWN0aW9uCisJICovCisJc3RhdHMgPSBscC0+ZGV2X3N0YXRzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJaWYgKHNjX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCWZzcC0+cmVxX2ZsYWdzID0gRkNfU1JCX1JFQUQ7CisJCXN0YXRzLT5JbnB1dFJlcXVlc3RzKys7CisJCXN0YXRzLT5JbnB1dE1lZ2FieXRlcyA9IGZzcC0+ZGF0YV9sZW47CisJfSBlbHNlIGlmIChzY19jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJZnNwLT5yZXFfZmxhZ3MgPSBGQ19TUkJfV1JJVEU7CisJCXN0YXRzLT5PdXRwdXRSZXF1ZXN0cysrOworCQlzdGF0cy0+T3V0cHV0TWVnYWJ5dGVzID0gZnNwLT5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlmc3AtPnJlcV9mbGFncyA9IDA7CisJCXN0YXRzLT5Db250cm9sUmVxdWVzdHMrKzsKKwl9CisKKwlmc3AtPnRndF9mbGFncyA9IHJwLT5mbGFnczsKKworCWluaXRfdGltZXIoJmZzcC0+dGltZXIpOworCWZzcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWZzcDsKKworCS8qCisJICogc2VuZCBpdCB0byB0aGUgbG93ZXIgbGF5ZXIKKwkgKiBpZiB3ZSBnZXQgLTEgcmV0dXJuIHRoZW4gcHV0IHRoZSByZXF1ZXN0IGluIHRoZSBwZW5kaW5nCisJICogcXVldWUuCisJICovCisJcnZhbCA9IGZjX2ZjcF9wa3Rfc2VuZChscCwgZnNwKTsKKwlpZiAocnZhbCAhPSAwKSB7CisJCWZzcC0+c3RhdGUgPSBGQ19TUkJfRlJFRTsKKwkJZmNfZmNwX3BrdF9yZWxlYXNlKGZzcCk7CisJCXJjID0gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChmY19xdWV1ZWNvbW1hbmQpOworCisvKioKKyAqIGZjX2lvX2NvbXBsIC0gIEhhbmRsZSByZXNwb25zZXMgZm9yIGNvbXBsZXRlZCBjb21tYW5kcworICogQGZzcDoJc2NzaSBwYWNrZXQKKyAqCisgKiBUcmFuc2xhdGVzIGEgZXJyb3IgdG8gYSBMaW51eCBTQ1NJIGVycm9yLgorICoKKyAqIFRoZSBmY3AgcGFja2V0IGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4gY2FsbGluZy4KKyAqLworc3RhdGljIHZvaWQgZmNfaW9fY29tcGwoc3RydWN0IGZjX2ZjcF9wa3QgKmZzcCkKK3sKKwlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQ7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnNwLT5zdGF0ZSB8PSBGQ19TUkJfQ09NUEw7CisJaWYgKCEoZnNwLT5zdGF0ZSAmIEZDX1NSQl9GQ1BfUFJPQ0VTU0lOR19UTU8pKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZmc3AtPnNjc2lfcGt0X2xvY2spOworCQlkZWxfdGltZXJfc3luYygmZnNwLT50aW1lcik7CisJCXNwaW5fbG9ja19iaCgmZnNwLT5zY3NpX3BrdF9sb2NrKTsKKwl9CisKKwlscCA9IGZzcC0+bHA7CisJc2kgPSBmY19nZXRfc2NzaV9pbnRlcm5hbChscCk7CisJc3Bpbl9sb2NrX2lycXNhdmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmICghZnNwLT5jbWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShscC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGlmIGEgY29tbWFuZCB0aW1lZCBvdXQgd2hpbGUgd2UgaGFkIHRvIHRyeSBhbmQgdGhyb3R0bGUgSU8KKwkgKiBhbmQgaXQgaXMgbm93IGdldHRpbmcgY2xlYW5lZCB1cCwgdGhlbiB3ZSBhcmUgYWJvdXQgdG8KKwkgKiB0cnkgYWdhaW4gc28gY2xlYXIgdGhlIHRocm90dGxlZCBmbGFnIGluY2FzZSB3ZSBnZXQgbW9yZQorCSAqIHRpbWUgb3V0cy4KKwkgKi8KKwlpZiAoc2ktPnRocm90dGxlZCAmJiBmc3AtPnN0YXRlICYgRkNfU1JCX05PTUVNKQorCQlzaS0+dGhyb3R0bGVkID0gMDsKKworCXNjX2NtZCA9IGZzcC0+Y21kOworCWZzcC0+Y21kID0gTlVMTDsKKworCWlmICghc2NfY21kLT5TQ3AucHRyKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJQ01EX1NDU0lfU1RBVFVTKHNjX2NtZCkgPSBmc3AtPmNkYl9zdGF0dXM7CisJc3dpdGNoIChmc3AtPnN0YXR1c19jb2RlKSB7CisJY2FzZSBGQ19DT01QTEVURToKKwkJaWYgKGZzcC0+Y2RiX3N0YXR1cyA9PSAwKSB7CisJCQkvKgorCQkJICogZ29vZCBJL08gc3RhdHVzCisJCQkgKi8KKwkJCXNjX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJaWYgKGZzcC0+c2NzaV9yZXNpZCkKKwkJCQlDTURfUkVTSURfTEVOKHNjX2NtZCkgPSBmc3AtPnNjc2lfcmVzaWQ7CisJCX0gZWxzZSBpZiAoZnNwLT5jZGJfc3RhdHVzID09IFFVRVVFX0ZVTEwpIHsKKwkJCXN0cnVjdCBzY3NpX2RldmljZSAqdG1wX3NkZXY7CisJCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzY19jbWQtPmRldmljZTsKKworCQkJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHRtcF9zZGV2LCBzZGV2LT5ob3N0KSB7CisJCQkJaWYgKHRtcF9zZGV2LT5pZCAhPSBzZGV2LT5pZCkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAodG1wX3NkZXYtPnF1ZXVlX2RlcHRoID4gMSkgeworCQkJCQlzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwodG1wX3NkZXYsCisJCQkJCQkJICAgICAgdG1wX3NkZXYtPgorCQkJCQkJCSAgICAgIHF1ZXVlX2RlcHRoIC0gMSk7CisJCQkJfQorCQkJfQorCQkJc2NfY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IGZzcC0+Y2RiX3N0YXR1czsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiB0cmFuc3BvcnQgbGV2ZWwgSS9PIHdhcyBvayBidXQgc2NzaQorCQkJICogaGFzIG5vbiB6ZXJvIHN0YXR1cworCQkJICovCisJCQlzY19jbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgZnNwLT5jZGJfc3RhdHVzOworCQl9CisJCWJyZWFrOworCWNhc2UgRkNfRVJST1I6CisJCXNjX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlicmVhazsKKwljYXNlIEZDX0RBVEFfVU5EUlVOOgorCQlpZiAoZnNwLT5jZGJfc3RhdHVzID09IDApIHsKKwkJCS8qCisJCQkgKiBzY3NpIHN0YXR1cyBpcyBnb29kIGJ1dCB0cmFuc3BvcnQgbGV2ZWwKKwkJCSAqIHVuZGVycnVuLiBmb3IgcmVhZCBpdCBzaG91bGQgYmUgYW4gZXJyb3I/PworCQkJICovCisJCQlzY19jbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgZnNwLT5jZGJfc3RhdHVzOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHNjc2kgZ290IHVuZGVycnVuLCB0aGlzIGlzIGFuIGVycm9yCisJCQkgKi8KKwkJCUNNRF9SRVNJRF9MRU4oc2NfY21kKSA9IGZzcC0+c2NzaV9yZXNpZDsKKwkJCXNjX2NtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNikgfCBmc3AtPmNkYl9zdGF0dXM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBGQ19EQVRBX09WUlJVTjoKKwkJLyoKKwkJICogb3ZlcnJ1biBpcyBhbiBlcnJvcgorCQkgKi8KKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KSB8IGZzcC0+Y2RiX3N0YXR1czsKKwkJYnJlYWs7CisJY2FzZSBGQ19DTURfQUJPUlRFRDoKKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KSB8IGZzcC0+aW9fc3RhdHVzOworCQlicmVhazsKKwljYXNlIEZDX0NNRF9USU1FX09VVDoKKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX0JVU19CVVNZIDw8IDE2KSB8IGZzcC0+aW9fc3RhdHVzOworCQlicmVhazsKKwljYXNlIEZDX0NNRF9SRVNFVDoKKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJYnJlYWs7CisJY2FzZSBGQ19IUkRfRVJST1I6CisJCXNjX2NtZC0+cmVzdWx0ID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2NfY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJYnJlYWs7CisJfQorCisJbGlzdF9kZWwoJmZzcC0+bGlzdCk7CisJc2NfY21kLT5TQ3AucHRyID0gTlVMTDsKKwlzY19jbWQtPnNjc2lfZG9uZShzY19jbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyogcmVsZWFzZSByZWYgZnJvbSBpbml0aWFsIGFsbG9jYXRpb24gaW4gcXVldWUgY29tbWFuZCAqLworCWZjX2ZjcF9wa3RfcmVsZWFzZShmc3ApOworfQorCisvKioKKyAqIGZjX2ZjcF9jb21wbGV0ZSAtIGNvbXBsZXRlIHByb2Nlc3Npbmcgb2YgYSBmY3AgcGFja2V0CisgKiBAZnNwOglmY3AgcGFja2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgaWYgYSBmc3AgdGltZXIgaXMgcGVuZGluZy4KKyAqIFRoZSBob3N0IGxvY2sgbXVzdCBub3QgYmUgaGVsZCBieSBjYWxsZXIuCisgKi8KK3ZvaWQgZmNfZmNwX2NvbXBsZXRlKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApCit7CisJaWYgKGZjX2ZjcF9sb2NrX3BrdChmc3ApKQorCQlyZXR1cm47CisKKwlmY19mY3BfY29tcGxldGVfbG9ja2VkKGZzcCk7CisJZmNfZmNwX3VubG9ja19wa3QoZnNwKTsKK30KK0VYUE9SVF9TWU1CT0woZmNfZmNwX2NvbXBsZXRlKTsKKworLyoqCisgKiBmY19laF9hYm9ydCAtIEFib3J0IGEgY29tbWFuZC4uLmZyb20gc2NzaSBob3N0IHRlbXBsYXRlCisgKiBAc2NfY21kOglzY3NpIGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKiBzZW5kIEFCVFMgdG8gdGhlIHRhcmdldCBkZXZpY2UgIGFuZCB3YWl0IGZvciB0aGUgcmVzcG9uc2UKKyAqIHNjX2NtZCBpcyB0aGUgcG9pbnRlciB0byB0aGUgY29tbWFuZCB0byBiZSBhYm9ydGVkLgorICovCitpbnQgZmNfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKQoreworCXN0cnVjdCBmY19mY3BfcGt0ICpmc3A7CisJc3RydWN0IGZjX2xwb3J0ICpscDsKKwlpbnQgcmMgPSBGQUlMRUQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxwID0gc2hvc3RfcHJpdihzY19jbWQtPmRldmljZS0+aG9zdCk7CisJaWYgKGxwLT5zdGF0ZSAhPSBMUE9SVF9TVF9SRUFEWSkKKwkJcmV0dXJuIHJjOworCWVsc2UgaWYgKCEobHAtPmxpbmtfc3RhdHVzICYgRkNfTElOS19VUCkpCisJCXJldHVybiByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKGxwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlmc3AgPSBDTURfU1Aoc2NfY21kKTsKKwlpZiAoIWZzcCkgeworCQkvKiBjb21tYW5kIGNvbXBsZXRlZCB3aGlsZSBzY3NpIGVoIHdhcyBzZXR0aW5nIHVwICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJLyogZ3JhYiBhIHJlZiBzbyB0aGUgZnNwIGFuZCBzY19jbWQgY2Fubm90IGJlIHJlbGFzZWQgZnJvbSB1bmRlciB1cyAqLworCWZjX2ZjcF9wa3RfaG9sZChmc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKGZjX2ZjcF9sb2NrX3BrdChmc3ApKSB7CisJCS8qIGNvbXBsZXRlZCB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRpbWVyIHRvIGJlIGRlbGV0ZWQgKi8KKwkJcmMgPSBTVUNDRVNTOworCQlnb3RvIHJlbGVhc2VfcGt0OworCX0KKworCXJjID0gZmNfZmNwX3BrdF9hYm9ydChscCwgZnNwKTsKKwlmY19mY3BfdW5sb2NrX3BrdChmc3ApOworCityZWxlYXNlX3BrdDoKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2VoX2Fib3J0KTsKKworLyoqCisgKiBmY19laF9kZXZpY2VfcmVzZXQ6IFJlc2V0IGEgc2luZ2xlIExVTgorICogQHNjX2NtZDoJc2NzaSBjb21tYW5kCisgKgorICogU2V0IGZyb20gc2NzaSBob3N0IHRlbXBsYXRlIHRvIHNlbmQgdG0gY21kIHRvIHRoZSB0YXJnZXQgYW5kIHdhaXQgZm9yIHRoZQorICogcmVzcG9uc2UuCisgKi8KK2ludCBmY19laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKQoreworCXN0cnVjdCBmY19scG9ydCAqbHA7CisJc3RydWN0IGZjX2ZjcF9wa3QgKmZzcDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzY19jbWQtPmRldmljZSkpOworCWludCByYyA9IEZBSUxFRDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnA7CisJaW50IHJ2YWw7CisKKwlydmFsID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpOworCWlmIChydmFsKQorCQlnb3RvIG91dDsKKworCXJwID0gcnBvcnQtPmRkX2RhdGE7CisJbHAgPSBzaG9zdF9wcml2KHNjX2NtZC0+ZGV2aWNlLT5ob3N0KTsKKworCWlmIChscC0+c3RhdGUgIT0gTFBPUlRfU1RfUkVBRFkpCisJCXJldHVybiByYzsKKworCWZzcCA9IGZjX2ZjcF9wa3RfYWxsb2MobHAsIEdGUF9OT0lPKTsKKwlpZiAoZnNwID09IE5VTEwpIHsKKwkJRkNfREJHKCJjb3VsZCBub3QgYWxsb2NhdGUgc2NzaV9wa3RcbiIpOworCQlzY19jbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBsaWJmYyByZXF1ZXN0IHBrdC4gRG8gbm90IHNldCB0aGUgc2NzaSBjbW5kLCBiZWNhdXNlCisJICogdGhlIHNjIHBhc3NlZCBpbiBpcyBub3Qgc2V0dXAgZm9yIGV4ZWN1dGlvbiBsaWtlIHdoZW4gc2VudAorCSAqIHRocm91Z2ggdGhlIHF1ZXVlY29tbWFuZCBjYWxsb3V0LgorCSAqLworCWZzcC0+bHAgPSBscDsJCS8qIHNhdmUgdGhlIHNvZnRjIHB0ciAqLworCWZzcC0+cnBvcnQgPSBycG9ydDsJLyogc2V0IHRoZSByZW1vdGUgcG9ydCBwdHIgKi8KKworCS8qCisJICogZmx1c2ggb3V0c3RhbmRpbmcgY29tbWFuZHMKKwkgKi8KKwlyYyA9IGZjX2x1bl9yZXNldChscCwgZnNwLCBzY21kX2lkKHNjX2NtZCksIHNjX2NtZC0+ZGV2aWNlLT5sdW4pOworCWZzcC0+c3RhdGUgPSBGQ19TUkJfRlJFRTsKKwlmY19mY3BfcGt0X3JlbGVhc2UoZnNwKTsKKworb3V0OgorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0woZmNfZWhfZGV2aWNlX3Jlc2V0KTsKKworLyoqCisgKiBmY19laF9ob3N0X3Jlc2V0IC0gVGhlIHJlc2V0IGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIHBvcnRzIG9uIHRoZSBob3N0LgorICogQHNjX2NtZDoJc2NzaSBjb21tYW5kCisgKi8KK2ludCBmY19laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNjX2NtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBzaG9zdF9wcml2KHNob3N0KTsKKwl1bnNpZ25lZCBsb25nIHdhaXRfdG1vOworCisJbHAtPnR0Lmxwb3J0X3Jlc2V0KGxwKTsKKwl3YWl0X3RtbyA9IGppZmZpZXMgKyBGQ19IT1NUX1JFU0VUX1RJTUVPVVQ7CisJd2hpbGUgKCFmY19mY3BfbHBvcnRfcXVldWVfcmVhZHkobHApICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHdhaXRfdG1vKSkKKwkJbXNsZWVwKDEwMDApOworCisJaWYgKGZjX2ZjcF9scG9ydF9xdWV1ZV9yZWFkeShscCkpIHsKKwkJc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgc2hvc3QsICJIb3N0IHJlc2V0IHN1Y2NlZWRlZC5cbiIpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBzaG9zdCwgIkhvc3QgcmVzZXQgZmFpbGVkLiAiCisJCQkgICAgICJscG9ydCBub3QgcmVhZHkuXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGZjX2VoX2hvc3RfcmVzZXQpOworCisvKioKKyAqIGZjX3NsYXZlX2FsbG9jIC0gY29uZmlndXJlIHF1ZXVlIGRlcHRoCisgKiBAc2RldjoJc2NzaSBkZXZpY2UKKyAqCisgKiBDb25maWd1cmVzIHF1ZXVlIGRlcHRoIGJhc2VkIG9uIGhvc3QncyBjbWRfcGVyX2xlbi4gSWYgbm90IHNldAorICogdGhlbiB3ZSB1c2UgdGhlIGxpYmZjIGRlZmF1bHQuCisgKi8KK2ludCBmY19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2RldikpOworCWludCBxdWV1ZV9kZXB0aDsKKworCWlmICghcnBvcnQgfHwgZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jbWRfcGVyX2x1bikKKwkJCXF1ZXVlX2RlcHRoID0gc2Rldi0+aG9zdC0+aG9zdHQtPmNtZF9wZXJfbHVuOworCQllbHNlCisJCQlxdWV1ZV9kZXB0aCA9IEZDX0ZDUF9ERkxUX1FVRVVFX0RFUFRIOworCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBxdWV1ZV9kZXB0aCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19zbGF2ZV9hbGxvYyk7CisKK2ludCBmY19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoKQoreworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpLCBxZGVwdGgpOworCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKK30KK0VYUE9SVF9TWU1CT0woZmNfY2hhbmdlX3F1ZXVlX2RlcHRoKTsKKworaW50IGZjX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRhZ190eXBlKQoreworCWlmIChzZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIHRhZ190eXBlKTsKKwkJaWYgKHRhZ190eXBlKQorCQkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2Rldiwgc2Rldi0+cXVldWVfZGVwdGgpOworCQllbHNlCisJCQlzY3NpX2RlYWN0aXZhdGVfdGNxKHNkZXYsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwl9IGVsc2UKKwkJdGFnX3R5cGUgPSAwOworCisJcmV0dXJuIHRhZ190eXBlOworfQorRVhQT1JUX1NZTUJPTChmY19jaGFuZ2VfcXVldWVfdHlwZSk7CisKK3ZvaWQgZmNfZmNwX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlzdHJ1Y3QgZmNfZmNwX2ludGVybmFsICpzaSA9IGZjX2dldF9zY3NpX2ludGVybmFsKGxwKTsKKworCWlmICghbGlzdF9lbXB0eSgmc2ktPnNjc2lfcGt0X3F1ZXVlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJMZWFrZWQgc2NzaSBwYWNrZXRzLlxuIik7CisKKwltZW1wb29sX2Rlc3Ryb3koc2ktPnNjc2lfcGt0X3Bvb2wpOworCWtmcmVlKHNpKTsKKwlscC0+c2NzaV9wcml2ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZmNwX2Rlc3Ryb3kpOworCitpbnQgZmNfZmNwX2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGZjX2ZjcF9pbnRlcm5hbCAqc2k7CisKKwlpZiAoIWxwLT50dC5mY3BfY21kX3NlbmQpCisJCWxwLT50dC5mY3BfY21kX3NlbmQgPSBmY19mY3BfY21kX3NlbmQ7CisKKwlpZiAoIWxwLT50dC5mY3BfY2xlYW51cCkKKwkJbHAtPnR0LmZjcF9jbGVhbnVwID0gZmNfZmNwX2NsZWFudXA7CisKKwlpZiAoIWxwLT50dC5mY3BfYWJvcnRfaW8pCisJCWxwLT50dC5mY3BfYWJvcnRfaW8gPSBmY19mY3BfYWJvcnRfaW87CisKKwlzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmY19mY3BfaW50ZXJuYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlscC0+c2NzaV9wcml2ID0gc2k7CisJSU5JVF9MSVNUX0hFQUQoJnNpLT5zY3NpX3BrdF9xdWV1ZSk7CisKKwlzaS0+c2NzaV9wa3RfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbCgyLCBzY3NpX3BrdF9jYWNoZXApOworCWlmICghc2ktPnNjc2lfcGt0X3Bvb2wpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfaW50ZXJuYWw7CisJfQorCXJldHVybiAwOworCitmcmVlX2ludGVybmFsOgorCWtmcmVlKHNpKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2ZjcF9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgbGliZmNfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXNjc2lfcGt0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJsaWJmY19mY3BfcGt0IiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZmNfZmNwX3BrdCksCisJCQkJCSAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmIChzY3NpX3BrdF9jYWNoZXAgPT0gTlVMTCkgeworCQlGQ19EQkcoIlVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgY2FjaGUuLi5tb2R1bGUgbG9hZCBmYWlsZWQhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJjID0gZmNfc2V0dXBfZXhjaF9tZ3IoKTsKKwlpZiAocmMpCisJCWdvdG8gZGVzdHJveV9wa3RfY2FjaGU7CisKKwlyYyA9IGZjX3NldHVwX3Jwb3J0KCk7CisJaWYgKHJjKQorCQlnb3RvIGRlc3Ryb3lfZW07CisKKwlyZXR1cm4gcmM7CitkZXN0cm95X2VtOgorCWZjX2Rlc3Ryb3lfZXhjaF9tZ3IoKTsKK2Rlc3Ryb3lfcGt0X2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShzY3NpX3BrdF9jYWNoZXApOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxpYmZjX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koc2NzaV9wa3RfY2FjaGVwKTsKKwlmY19kZXN0cm95X2V4Y2hfbWdyKCk7CisJZmNfZGVzdHJveV9ycG9ydCgpOworfQorCittb2R1bGVfaW5pdChsaWJmY19pbml0KTsKK21vZHVsZV9leGl0KGxpYmZjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZyYW1lLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZyYW1lLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKy8qCisgKiBGcmFtZSBhbGxvY2F0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPHNjc2kvZmNfZnJhbWUuaD4KKworLyoKKyAqIENoZWNrIHRoZSBDUkMgaW4gYSBmcmFtZS4KKyAqLwordTMyIGZjX2ZyYW1lX2NyY19jaGVjayhzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXUzMiBjcmM7CisJdTMyIGVycm9yOworCWNvbnN0IHU4ICpicDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJV0FSTl9PTighZmNfZnJhbWVfaXNfbGluZWFyKGZwKSk7CisJZnJfZmxhZ3MoZnApICY9IH5GQ1BIRl9DUkNfVU5DSEVDS0VEOworCWxlbiA9IChmcl9sZW4oZnApICsgMykgJiB+MzsJLyogcm91bmQgdXAgbGVuZ3RoIHRvIGluY2x1ZGUgZmlsbCAqLworCWJwID0gKGNvbnN0IHU4ICopIGZyX2hkcihmcCk7CisJY3JjID0gfmNyYzMyKH4wLCBicCwgbGVuKTsKKwllcnJvciA9IGNyYyBeIGZyX2NyYyhmcCk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTChmY19mcmFtZV9jcmNfY2hlY2spOworCisvKgorICogQWxsb2NhdGUgYSBmcmFtZSBpbnRlbmRlZCB0byBiZSBzZW50IHZpYSBmY29lX3htaXQuCisgKiBHZXQgYW4gc2tfYnVmZiBmb3IgdGhlIGZyYW1lIGFuZCBzZXQgdGhlIGxlbmd0aC4KKyAqLworc3RydWN0IGZjX2ZyYW1lICpfX2ZjX2ZyYW1lX2FsbG9jKHNpemVfdCBsZW4pCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJV0FSTl9PTigobGVuICUgc2l6ZW9mKHUzMikpICE9IDApOworCWxlbiArPSBzaXplb2Yoc3RydWN0IGZjX2ZyYW1lX2hlYWRlcik7CisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBGQ19GUkFNRV9IRUFEUk9PTSArIEZDX0ZSQU1FX1RBSUxST09NKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisJZnAgPSAoc3RydWN0IGZjX2ZyYW1lICopIHNrYjsKKwlmY19mcmFtZV9pbml0KGZwKTsKKwlza2JfcmVzZXJ2ZShza2IsIEZDX0ZSQU1FX0hFQURST09NKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKKwlyZXR1cm4gZnA7Cit9CitFWFBPUlRfU1lNQk9MKF9fZmNfZnJhbWVfYWxsb2MpOworCisKK3N0cnVjdCBmY19mcmFtZSAqZmNfZnJhbWVfYWxsb2NfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzaXplX3QgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzaXplX3QgZmlsbDsKKworCWZpbGwgPSBwYXlsb2FkX2xlbiAlIDQ7CisJaWYgKGZpbGwgIT0gMCkKKwkJZmlsbCA9IDQgLSBmaWxsOworCWZwID0gX19mY19mcmFtZV9hbGxvYyhwYXlsb2FkX2xlbiArIGZpbGwpOworCWlmIChmcCkgeworCQltZW1zZXQoKGNoYXIgKikgZnJfaGRyKGZwKSArIHBheWxvYWRfbGVuLCAwLCBmaWxsKTsKKwkJLyogdHJpbSBpcyBPSywgd2UganVzdCBhbGxvY2F0ZWQgaXQgc28gdGhlcmUgYXJlIG5vIGZyYWdtZW50cyAqLworCQlza2JfdHJpbShmcF9za2IoZnApLAorCQkJIHBheWxvYWRfbGVuICsgc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpKTsKKwl9CisJcmV0dXJuIGZwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjliZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKQEAgLTAsMCArMSwxNjA0IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworLyoKKyAqIFBPUlQgTE9DS0lORyBOT1RFUworICoKKyAqIFRoZXNlIGNvbW1lbnRzIG9ubHkgYXBwbHkgdG8gdGhlICdwb3J0IGNvZGUnIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBscG9ydCwKKyAqIGRpc2MgYW5kIHJwb3J0IGJsb2Nrcy4KKyAqCisgKiBNT1RJVkFUSU9OCisgKgorICogVGhlIGxwb3J0LCBkaXNjIGFuZCBycG9ydCBibG9ja3MgYWxsIGhhdmUgbXV0ZXhlcyB0aGF0IGFyZSB1c2VkIHRvIHByb3RlY3QKKyAqIHRob3NlIG9iamVjdHMuIFRoZSBtYWluIG1vdGl2YXRpb24gZm9yIHRoZXNlIGxvY2tzIGlzIHRvIHByZXZlbnQgZnJvbQorICogaGF2aW5nIGFuIGxwb3J0IHJlc2V0IGp1c3QgYmVmb3JlIHdlIHNlbmQgYSBmcmFtZS4gSW4gdGhhdCBzY2VuYXJpbyB0aGUKKyAqIGxwb3J0J3MgRklEIHdvdWxkIGdldCBzZXQgdG8gemVybyBhbmQgdGhlbiB3ZSdkIHNlbmQgYSBmcmFtZSB3aXRoIGFuCisgKiBpbnZhbGlkIFNJRC4gV2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IHN0YXRlcyBkb24ndCBjaGFuZ2UgdW5leHBlY3RlZGx5CisgKiB3aGlsZSBwcm9jZXNzaW5nIGFub3RoZXIgc3RhdGUuCisgKgorICogSEVJUkFSQ0hZCisgKgorICogVGhlIGZvbGxvd2luZyBoZWlyYXJjaHkgZGVmaW5lcyB0aGUgbG9ja2luZyBydWxlcy4gQSBncmVhdGVyIGxvY2sKKyAqIG1heSBiZSBoZWxkIGJlZm9yZSBhY3F1aXJpbmcgYSBsZXNzZXIgbG9jaywgYnV0IGEgbGVzc2VyIGxvY2sgc2hvdWxkIG5ldmVyCisgKiBiZSBoZWxkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBhIGdyZWF0ZXIgbG9jay4gSGVyZSBpcyB0aGUgaGVpcmFyY2h5LQorICoKKyAqIGxwb3J0ID4gZGlzYywgbHBvcnQgPiBycG9ydCwgZGlzYyA+IHJwb3J0CisgKgorICogQ0FMTEJBQ0tTCisgKgorICogVGhlIGNhbGxiYWNrcyBjYXVzZSBjb21wbGljYXRpb25zIHdpdGggdGhpcyBzY2hlbWUuIFRoZXJlIGlzIGEgY2FsbGJhY2sKKyAqIGZyb20gdGhlIHJwb3J0ICh0byBlaXRoZXIgbHBvcnQgb3IgZGlzYykgYW5kIGEgY2FsbGJhY2sgZnJvbSBkaXNjCisgKiAodG8gdGhlIGxwb3J0KS4KKyAqCisgKiBBcyBycG9ydHMgZXhpdCB0aGUgcnBvcnQgc3RhdGUgbWFjaGluZSBhIGNhbGxiYWNrIGlzIG1hZGUgdG8gdGhlIG93bmVyIG9mCisgKiB0aGUgcnBvcnQgdG8gbm90aWZ5IHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gU2luY2UgdGhlIGNhbGxiYWNrIGlzIGxpa2VseSB0bworICogY2F1c2UgdGhlIGxwb3J0IG9yIGRpc2MgdG8gZ3JhYiBpdHMgbG9jayB3ZSBjYW5ub3QgaG9sZCB0aGUgcnBvcnQgbG9jaworICogd2hpbGUgbWFraW5nIHRoZSBjYWxsYmFjay4gVG8gZW5zdXJlIHRoYXQgdGhlIHJwb3J0IGlzIG5vdCBmcmVlJ2Qgd2hpbGUKKyAqIHByb2Nlc3NpbmcgdGhlIGNhbGxiYWNrIHRoZSBycG9ydCBjYWxsYmFja3MgYXJlIHNlcmlhbGl6ZWQgdGhyb3VnaCBhCisgKiBzaW5nbGUtdGhyZWFkZWQgd29ya3F1ZXVlLiBBbiBycG9ydCB3b3VsZCBuZXZlciBiZSBmcmVlJ2Qgd2hpbGUgaW4gYQorICogY2FsbGJhY2sgaGFuZGxlciBiZWN1YXNlIG5vIG90aGVyIHJwb3J0IHdvcmsgaW4gdGhpcyBxdWV1ZSBjYW4gYmUgZXhlY3V0ZWQKKyAqIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogV2hlbiBkaXNjb3Zlcnkgc3VjY2VlZHMgb3IgZmFpbHMgYSBjYWxsYmFjayBpcyBtYWRlIHRvIHRoZSBscG9ydCBhcworICogbm90aWZpY2F0aW9uLiBDdXJyZW50bHksIHN1Y2Nlc2Z1bCBkaXNjb3ZlcnkgY2F1c2VzIHRoZSBscG9ydCB0byB0YWtlIG5vCisgKiBhY3Rpb24uIEEgZmFpbHVyZSB3aWxsIGNhdXNlIHRoZSBscG9ydCB0byByZXNldC4gVGhlcmUgaXMgbGlrZWx5IGEgY2lyY3VsYXIKKyAqIGxvY2tpbmcgcHJvYmxlbSB3aXRoIHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KKworLyoKKyAqIExQT1JUIExPQ0tJTkcKKyAqCisgKiBUaGUgY3JpdGljYWwgc2VjdGlvbnMgcHJvdGVjdGVkIGJ5IHRoZSBscG9ydCdzIG11dGV4IGFyZSBxdWl0ZSBicm9hZCBhbmQKKyAqIG1heSBiZSBpbXByb3ZlZCB1cG9uIGluIHRoZSBmdXR1cmUuIFRoZSBscG9ydCBjb2RlIGFuZCBpdHMgbG9ja2luZyBkb2Vzbid0CisgKiBpbmZsdWVuY2UgdGhlIEkvTyBwYXRoLCBzbyBleGNlc3NpdmUgbG9ja2luZyBkb2Vzbid0IHBlbmFsaXplIEkvTworICogcGVyZm9ybWFuY2UuCisgKgorICogVGhlIHN0cmF0ZWd5IGlzIHRvIGxvY2sgd2hlbmV2ZXIgcHJvY2Vzc2luZyBhIHJlcXVlc3Qgb3IgcmVzcG9uc2UuIE5vdGUKKyAqIHRoYXQgZXZlcnkgX2VudGVyXyogZnVuY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBzdGF0ZSBjaGFuZ2UuIFRoZXkgZ2VuZXJhbGx5CisgKiBjaGFuZ2UgdGhlIGxwb3J0cyBzdGF0ZSBhbmQgdGhlbiBzZW5kIGEgcmVxdWVzdCBvdXQgb24gdGhlIHdpcmUuIFdlIGxvY2sKKyAqIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgdG8gcHJvdGVjdCB0aGF0IHN0YXRlIGNoYW5nZS4gVGhpcworICogbWVhbnMgdGhhdCB0aGUgZW50cnkgcG9pbnRzIGludG8gdGhlIGxwb3J0IGJsb2NrIG1hbmFnZSB0aGUgbG9ja3Mgd2hpbGUKKyAqIHRoZSBzdGF0ZSBtYWNoaW5lIGNhbiB0cmFuc2l0aW9uIGJldHdlZW4gc3RhdGVzIChpLmUuIF9lbnRlcl8qIGZ1bmN0aW9ucykKKyAqIHdoaWxlIGFsd2F5cyBzdGF5aW5nIHByb3RlY3RlZC4KKyAqCisgKiBXaGVuIGhhbmRsaW5nIHJlc3BvbnNlcyB3ZSBhbHNvIGhvbGQgdGhlIGxwb3J0IG11dGV4IGJyb2FkbHkuIFdoZW4gdGhlCisgKiBscG9ydCByZWNlaXZlcyB0aGUgcmVzcG9uc2UgZnJhbWUgaXQgbG9ja3MgdGhlIG11dGV4IGFuZCB0aGVuIGNhbGxzIHRoZQorICogYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIHBhcnRpY3VhciByZXNwb25zZS4gR2VuZXJhbGx5IGEgcmVzcG9uc2Ugd2lsbAorICogdHJpZ2dlciBhIHN0YXRlIGNoYW5nZSBhbmQgc28gdGhlIGxvY2sgbXVzdCBhbHJlYWR5IGJlIGhlbGQuCisgKgorICogUmV0cmllcyBhbHNvIGhhdmUgdG8gY29uc2lkZXIgdGhlIGxvY2tpbmcuIFRoZSByZXRyaWVzIG9jY3VyIGZyb20gYSB3b3JrCisgKiBjb250ZXh0IGFuZCB0aGUgd29yayBmdW5jdGlvbiB3aWxsIGxvY2sgdGhlIGxwb3J0IGFuZCB0aGVuIHJldHJ5IHRoZSBzdGF0ZQorICogKGkuZS4gX2VudGVyXyogZnVuY3Rpb24pLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPHNjc2kvZmMvZmNfZ3MuaD4KKworI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjX2VuY29kZS5oPgorCisvKiBGYWJyaWMgSURzIHRvIHVzZSBmb3IgcG9pbnQtdG8tcG9pbnQgbW9kZSwgY2hvc2VuIG9uIHdoaW1zLiAqLworI2RlZmluZSBGQ19MT0NBTF9QVFBfRklEX0xPICAgMHgwMTAxMDEKKyNkZWZpbmUgRkNfTE9DQUxfUFRQX0ZJRF9ISSAgIDB4MDEwMTAyCisKKyNkZWZpbmUJRE5TX0RFTEFZCSAgICAgIDMgLyogRGlzY292ZXJ5IGRlbGF5IGFmdGVyIFJTQ04gKGluIHNlY29uZHMpKi8KKworc3RhdGljIGludCBmY19scG9ydF9kZWJ1ZzsKKworI2RlZmluZSBGQ19ERUJVR19MUE9SVChmbXQuLi4pCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKGZjX2xwb3J0X2RlYnVnKQkJXAorCQkJRkNfREJHKGZtdCk7CQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZmNfbHBvcnRfZXJyb3Ioc3RydWN0IGZjX2xwb3J0ICosIHN0cnVjdCBmY19mcmFtZSAqKTsKKworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfcmVzZXQoc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfZmxvZ2koc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfZG5zKHN0cnVjdCBmY19scG9ydCAqKTsKK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX3Jwbl9pZChzdHJ1Y3QgZmNfbHBvcnQgKik7CitzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9yZnRfaWQoc3RydWN0IGZjX2xwb3J0ICopOworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfc2NyKHN0cnVjdCBmY19scG9ydCAqKTsKK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX3JlYWR5KHN0cnVjdCBmY19scG9ydCAqKTsKK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2VudGVyX2xvZ28oc3RydWN0IGZjX2xwb3J0ICopOworCitzdGF0aWMgY29uc3QgY2hhciAqZmNfbHBvcnRfc3RhdGVfbmFtZXNbXSA9IHsKKwlbTFBPUlRfU1RfTk9ORV0gPSAgICAgIm5vbmUiLAorCVtMUE9SVF9TVF9GTE9HSV0gPSAgICAiRkxPR0kiLAorCVtMUE9SVF9TVF9ETlNdID0gICAgICAiZE5TIiwKKwlbTFBPUlRfU1RfUlBOX0lEXSA9ICAgIlJQTl9JRCIsCisJW0xQT1JUX1NUX1JGVF9JRF0gPSAgICJSRlRfSUQiLAorCVtMUE9SVF9TVF9TQ1JdID0gICAgICAiU0NSIiwKKwlbTFBPUlRfU1RfUkVBRFldID0gICAgIlJlYWR5IiwKKwlbTFBPUlRfU1RfTE9HT10gPSAgICAgIkxPR08iLAorCVtMUE9SVF9TVF9SRVNFVF0gPSAgICAicmVzZXQiLAorfTsKKworc3RhdGljIGludCBmY19mcmFtZV9kcm9wKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJZmNfZnJhbWVfZnJlZShmcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNfbHBvcnRfcnBvcnRfY2FsbGJhY2sgLSBFdmVudCBoYW5kbGVyIGZvciBycG9ydCBldmVudHMKKyAqIEBscG9ydDogVGhlIGxwb3J0IHdoaWNoIGlzIHJlY2VpdmluZyB0aGUgZXZlbnQKKyAqIEBycG9ydDogVGhlIHJwb3J0IHdoaWNoIHRoZSBldmVudCBoYXMgb2NjdXJlZCBvbgorICogQGV2ZW50OiBUaGUgZXZlbnQgdGhhdCBvY2N1cmVkCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBzaG91bGQgbm90IGJlIGhlbGQgd2hlbiBjYWxsaW5nCisgKgkJIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZjX2xwb3J0X3Jwb3J0X2NhbGxiYWNrKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCQkJICAgIHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsCisJCQkJICAgIGVudW0gZmNfcnBvcnRfZXZlbnQgZXZlbnQpCit7CisJRkNfREVCVUdfTFBPUlQoIlJlY2VpdmVkIGEgJWQgZXZlbnQgZm9yIHBvcnQgKCU2eClcbiIsIGV2ZW50LAorCQkgICAgICAgcnBvcnQtPnBvcnRfaWQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUlBPUlRfRVZfQ1JFQVRFRDoKKwkJaWYgKHJwb3J0LT5wb3J0X2lkID09IEZDX0ZJRF9ESVJfU0VSVikgeworCQkJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwkJCWlmIChscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfRE5TKSB7CisJCQkJbHBvcnQtPmRuc19ycCA9IHJwb3J0OworCQkJCWZjX2xwb3J0X2VudGVyX3Jwbl9pZChscG9ydCk7CisJCQl9IGVsc2UgeworCQkJCUZDX0RFQlVHX0xQT1JUKCJSZWNlaXZlZCBhbiBDUkVBVEVEIGV2ZW50IG9uICIKKwkJCQkJICAgICAgICJwb3J0ICglNngpIGZvciB0aGUgZGlyZWN0b3J5ICIKKwkJCQkJICAgICAgICJzZXJ2ZXIsIGJ1dCB0aGUgbHBvcnQgaXMgbm90ICIKKwkJCQkJICAgICAgICJpbiB0aGUgRE5TIHN0YXRlLCBpdCdzIGluIHRoZSAiCisJCQkJCSAgICAgICAiJWQgc3RhdGUiLCBycG9ydC0+cG9ydF9pZCwKKwkJCQkJICAgICAgIGxwb3J0LT5zdGF0ZSk7CisJCQkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihycG9ydCk7CisJCQl9CisJCQltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisJCX0gZWxzZQorCQkJRkNfREVCVUdfTFBPUlQoIlJlY2VpdmVkIGFuIGV2ZW50IGZvciBwb3J0ICglNngpICIKKwkJCQkgICAgICAgIndoaWNoIGlzIG5vdCB0aGUgZGlyZWN0b3J5IHNlcnZlclxuIiwKKwkJCQkgICAgICAgcnBvcnQtPnBvcnRfaWQpOworCQlicmVhazsKKwljYXNlIFJQT1JUX0VWX0xPR086CisJY2FzZSBSUE9SVF9FVl9GQUlMRUQ6CisJY2FzZSBSUE9SVF9FVl9TVE9QOgorCQlpZiAocnBvcnQtPnBvcnRfaWQgPT0gRkNfRklEX0RJUl9TRVJWKSB7CisJCQltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCQkJbHBvcnQtPmRuc19ycCA9IE5VTEw7CisJCQltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwkJfSBlbHNlCisJCQlGQ19ERUJVR19MUE9SVCgiUmVjZWl2ZWQgYW4gZXZlbnQgZm9yIHBvcnQgKCU2eCkgIgorCQkJCSAgICAgICAid2hpY2ggaXMgbm90IHRoZSBkaXJlY3Rvcnkgc2VydmVyXG4iLAorCQkJCSAgICAgICBycG9ydC0+cG9ydF9pZCk7CisJCWJyZWFrOworCWNhc2UgUlBPUlRfRVZfTk9ORToKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGZjX2xwb3J0X3N0YXRlIC0gUmV0dXJuIGEgc3RyaW5nIHdoaWNoIHJlcHJlc2VudHMgdGhlIGxwb3J0J3Mgc3RhdGUKKyAqIEBscG9ydDogVGhlIGxwb3J0IHdob3NlIHN0YXRlIGlzIHRvIGNvbnZlcnRlZCB0byBhIHN0cmluZworICovCitzdGF0aWMgY29uc3QgY2hhciAqZmNfbHBvcnRfc3RhdGUoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwljb25zdCBjaGFyICpjcDsKKworCWNwID0gZmNfbHBvcnRfc3RhdGVfbmFtZXNbbHBvcnQtPnN0YXRlXTsKKwlpZiAoIWNwKQorCQljcCA9ICJ1bmtub3duIjsKKwlyZXR1cm4gY3A7Cit9CisKKy8qKgorICogZmNfbHBvcnRfcHRwX3NldHVwIC0gQ3JlYXRlIGFuIHJwb3J0IGZvciBwb2ludC10by1wb2ludCBtb2RlCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB0byBhdHRhY2ggdGhlIHB0cCBycG9ydCB0bworICogQGZpZDogVGhlIEZJRCBvZiB0aGUgcHRwIHJwb3J0CisgKiBAcmVtb3RlX3d3cG46IFRoZSBXV1BOIG9mIHRoZSBwdHAgcnBvcnQKKyAqIEByZW1vdGVfd3dubjogVGhlIFdXTk4gb2YgdGhlIHB0cCBycG9ydAorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9wdHBfc2V0dXAoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKKwkJCSAgICAgICB1MzIgcmVtb3RlX2ZpZCwgdTY0IHJlbW90ZV93d3BuLAorCQkJICAgICAgIHU2NCByZW1vdGVfd3dubikKK3sKKwlzdHJ1Y3QgZmNfZGlzY19wb3J0IGRwOworCisJZHAubHAgPSBscG9ydDsKKwlkcC5pZHMucG9ydF9pZCA9IHJlbW90ZV9maWQ7CisJZHAuaWRzLnBvcnRfbmFtZSA9IHJlbW90ZV93d3BuOworCWRwLmlkcy5ub2RlX25hbWUgPSByZW1vdGVfd3dubjsKKwlkcC5pZHMucm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CisKKwlpZiAobHBvcnQtPnB0cF9ycCkgeworCQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKGxwb3J0LT5wdHBfcnApOworCQlscG9ydC0+cHRwX3JwID0gTlVMTDsKKwl9CisKKwlscG9ydC0+cHRwX3JwID0gZmNfcnBvcnRfcm9ndWVfY3JlYXRlKCZkcCk7CisKKwlscG9ydC0+dHQucnBvcnRfbG9naW4obHBvcnQtPnB0cF9ycCk7CisKKwlmY19scG9ydF9lbnRlcl9yZWFkeShscG9ydCk7Cit9CisKK3ZvaWQgZmNfZ2V0X2hvc3RfcG9ydF90eXBlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCS8qIFRPRE8gLSBjdXJyZW50bHkganVzdCBOUE9SVCAqLworCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX05QT1JUOworfQorRVhQT1JUX1NZTUJPTChmY19nZXRfaG9zdF9wb3J0X3R5cGUpOworCit2b2lkIGZjX2dldF9ob3N0X3BvcnRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscCA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJaWYgKChscC0+bGlua19zdGF0dXMgJiBGQ19MSU5LX1VQKSA9PSBGQ19MSU5LX1VQKQorCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX09OTElORTsKKwllbHNlCisJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfT0ZGTElORTsKK30KK0VYUE9SVF9TWU1CT0woZmNfZ2V0X2hvc3RfcG9ydF9zdGF0ZSk7CisKK3ZvaWQgZmNfZ2V0X2hvc3Rfc3BlZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBscG9ydC0+bGlua19zcGVlZDsKK30KK0VYUE9SVF9TWU1CT0woZmNfZ2V0X2hvc3Rfc3BlZWQpOworCitzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY19nZXRfaG9zdF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpmY29lX3N0YXRzOworCXN0cnVjdCBmY19scG9ydCAqbHAgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlzdHJ1Y3QgdGltZXNwZWMgdjAsIHYxOworCisJZmNvZV9zdGF0cyA9ICZscC0+aG9zdF9zdGF0czsKKwltZW1zZXQoZmNvZV9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MpKTsKKworCWppZmZpZXNfdG9fdGltZXNwZWMoamlmZmllcywgJnYwKTsKKwlqaWZmaWVzX3RvX3RpbWVzcGVjKGxwLT5ib290X3RpbWUsICZ2MSk7CisJZmNvZV9zdGF0cy0+c2Vjb25kc19zaW5jZV9sYXN0X3Jlc2V0ID0gKHYwLnR2X3NlYyAtIHYxLnR2X3NlYyk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpzdGF0cyA9IGxwLT5kZXZfc3RhdHNbaV07CisJCWlmIChzdGF0cyA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZjb2Vfc3RhdHMtPnR4X2ZyYW1lcyArPSBzdGF0cy0+VHhGcmFtZXM7CisJCWZjb2Vfc3RhdHMtPnR4X3dvcmRzICs9IHN0YXRzLT5UeFdvcmRzOworCQlmY29lX3N0YXRzLT5yeF9mcmFtZXMgKz0gc3RhdHMtPlJ4RnJhbWVzOworCQlmY29lX3N0YXRzLT5yeF93b3JkcyArPSBzdGF0cy0+UnhXb3JkczsKKwkJZmNvZV9zdGF0cy0+ZXJyb3JfZnJhbWVzICs9IHN0YXRzLT5FcnJvckZyYW1lczsKKwkJZmNvZV9zdGF0cy0+aW52YWxpZF9jcmNfY291bnQgKz0gc3RhdHMtPkludmFsaWRDUkNDb3VudDsKKwkJZmNvZV9zdGF0cy0+ZmNwX2lucHV0X3JlcXVlc3RzICs9IHN0YXRzLT5JbnB1dFJlcXVlc3RzOworCQlmY29lX3N0YXRzLT5mY3Bfb3V0cHV0X3JlcXVlc3RzICs9IHN0YXRzLT5PdXRwdXRSZXF1ZXN0czsKKwkJZmNvZV9zdGF0cy0+ZmNwX2NvbnRyb2xfcmVxdWVzdHMgKz0gc3RhdHMtPkNvbnRyb2xSZXF1ZXN0czsKKwkJZmNvZV9zdGF0cy0+ZmNwX2lucHV0X21lZ2FieXRlcyArPSBzdGF0cy0+SW5wdXRNZWdhYnl0ZXM7CisJCWZjb2Vfc3RhdHMtPmZjcF9vdXRwdXRfbWVnYWJ5dGVzICs9IHN0YXRzLT5PdXRwdXRNZWdhYnl0ZXM7CisJCWZjb2Vfc3RhdHMtPmxpbmtfZmFpbHVyZV9jb3VudCArPSBzdGF0cy0+TGlua0ZhaWx1cmVDb3VudDsKKwl9CisJZmNvZV9zdGF0cy0+bGlwX2NvdW50ID0gLTE7CisJZmNvZV9zdGF0cy0+bm9zX2NvdW50ID0gLTE7CisJZmNvZV9zdGF0cy0+bG9zc19vZl9zeW5jX2NvdW50ID0gLTE7CisJZmNvZV9zdGF0cy0+bG9zc19vZl9zaWduYWxfY291bnQgPSAtMTsKKwlmY29lX3N0YXRzLT5wcmltX3NlcV9wcm90b2NvbF9lcnJfY291bnQgPSAtMTsKKwlmY29lX3N0YXRzLT5kdW1wZWRfZnJhbWVzID0gLTE7CisJcmV0dXJuIGZjb2Vfc3RhdHM7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2dldF9ob3N0X3N0YXRzKTsKKworLyoKKyAqIEZpbGwgaW4gRkxPR0kgY29tbWFuZCBmb3IgcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQKK2ZjX2xwb3J0X2Zsb2dpX2ZpbGwoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2Vsc19mbG9naSAqZmxvZ2ksCisJCSAgICB1bnNpZ25lZCBpbnQgb3ApCit7CisJc3RydWN0IGZjX2Vsc19jc3AgKnNwOworCXN0cnVjdCBmY19lbHNfY3NzcCAqY3A7CisKKwltZW1zZXQoZmxvZ2ksIDAsIHNpemVvZigqZmxvZ2kpKTsKKwlmbG9naS0+ZmxfY21kID0gKHU4KSBvcDsKKwlwdXRfdW5hbGlnbmVkX2JlNjQobHBvcnQtPnd3cG4sICZmbG9naS0+Zmxfd3dwbik7CisJcHV0X3VuYWxpZ25lZF9iZTY0KGxwb3J0LT53d25uLCAmZmxvZ2ktPmZsX3d3bm4pOworCXNwID0gJmZsb2dpLT5mbF9jc3A7CisJc3AtPnNwX2hpX3ZlciA9IDB4MjA7CisJc3AtPnNwX2xvX3ZlciA9IDB4MjA7CisJc3AtPnNwX2JiX2NyZWQgPSBodG9ucygxMCk7CS8qIHRoaXMgZ2V0cyBzZXQgYnkgZ2F0ZXdheSAqLworCXNwLT5zcF9iYl9kYXRhID0gaHRvbnMoKHUxNikgbHBvcnQtPm1mcyk7CisJY3AgPSAmZmxvZ2ktPmZsX2Nzc3BbMyAtIDFdOwkvKiBjbGFzcyAzIHBhcmFtZXRlcnMgKi8KKwljcC0+Y3BfY2xhc3MgPSBodG9ucyhGQ19DUENfVkFMSUQgfCBGQ19DUENfU0VRKTsKKwlpZiAob3AgIT0gRUxTX0ZMT0dJKSB7CisJCXNwLT5zcF9mZWF0dXJlcyA9IGh0b25zKEZDX1NQX0ZUX0NJUk8pOworCQlzcC0+c3BfdG90X3NlcSA9IGh0b25zKDI1NSk7CS8qIHNlcS4gd2UgYWNjZXB0ICovCisJCXNwLT5zcF9yZWxfb2ZmID0gaHRvbnMoMHgxZik7CisJCXNwLT5zcF9lX2RfdG92ID0gaHRvbmwobHBvcnQtPmVfZF90b3YpOworCisJCWNwLT5jcF9yZGZzID0gaHRvbnMoKHUxNikgbHBvcnQtPm1mcyk7CisJCWNwLT5jcF9jb25fc2VxID0gaHRvbnMoMjU1KTsKKwkJY3AtPmNwX29wZW5fc2VxID0gMTsKKwl9Cit9CisKKy8qCisgKiBBZGQgYSBzdXBwb3J0ZWQgRkMtNCB0eXBlLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9hZGRfZmM0X3R5cGUoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgZW51bSBmY19maF90eXBlIHR5cGUpCit7CisJX19iZTMyICptcDsKKworCW1wID0gJmxwb3J0LT5mY3RzLmZmX3R5cGVfbWFwW3R5cGUgLyBGQ19OU19CUFddOworCSptcCA9IGh0b25sKG50b2hsKCptcCkgfCAxVUwgPDwgKHR5cGUgJSBGQ19OU19CUFcpKTsKK30KKworLyoqCisgKiBmY19scG9ydF9yZWN2X3JsaXJfcmVxIC0gSGFuZGxlIHJlY2VpdmVkIFJlZ2lzdGVyZWQgTGluayBJbmNpZGVudCBSZXBvcnQuCisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIFJMSVIKKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUkxJUiBleGNoYW5nZQorICogQGZwOiBSTElSIHJlcXVlc3QgZnJhbWUKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9ybGlyX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCUZDX0RFQlVHX0xQT1JUKCJSZWNlaXZlZCBSTElSIHJlcXVlc3Qgd2hpbGUgaW4gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOworCisJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19BQ0MsIE5VTEwpOworCWZjX2ZyYW1lX2ZyZWUoZnApOworfQorCisvKioKKyAqIGZjX2xwb3J0X3JlY3ZfZWNob19yZXEgLSBIYW5kbGUgcmVjZWl2ZWQgRUNITyByZXF1ZXN0CisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIEVDSE8KKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgRUNITyBleGNoYW5nZQorICogQGZwOiBFQ0hPIHJlcXVlc3QgZnJhbWUKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9lY2hvX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICppbl9mcCwKKwkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gZmNfc2VxX2V4Y2goc3ApOworCXVuc2lnbmVkIGludCBsZW47CisJdm9pZCAqcHA7CisJdm9pZCAqZHA7CisJdTMyIGZfY3RsOworCisJRkNfREVCVUdfTFBPUlQoIlJlY2VpdmVkIFJMSVIgcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKKwkJICAgICAgIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlsZW4gPSBmcl9sZW4oaW5fZnApIC0gc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpOworCXBwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoaW5fZnAsIGxlbik7CisKKwlpZiAobGVuIDwgc2l6ZW9mKF9fYmUzMikpCisJCWxlbiA9IHNpemVvZihfX2JlMzIpOworCisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgbGVuKTsKKwlpZiAoZnApIHsKKwkJZHAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKKwkJbWVtY3B5KGRwLCBwcCwgbGVuKTsKKwkJKigodTMyICopZHApID0gaHRvbmwoRUxTX0xTX0FDQyA8PCAyNCk7CisJCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKKwkJZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVE7CisJCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0VMU19SRVAsIGVwLT5kaWQsIGVwLT5zaWQsCisJCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKKwkJbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCX0KKwlmY19mcmFtZV9mcmVlKGluX2ZwKTsKK30KKworLyoqCisgKiBmY19scG9ydF9yZWN2X2VjaG9fcmVxIC0gSGFuZGxlIHJlY2VpdmVkIFJlcXVlc3QgTm9kZSBJRCBkYXRhIHJlcXVlc3QKKyAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgUk5JRAorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBSTklEIGV4Y2hhbmdlCisgKiBAZnA6IFJOSUQgcmVxdWVzdCBmcmFtZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9yZWN2X3JuaWRfcmVxKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmluX2ZwLAorCQkJCSAgIHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CisJc3RydWN0IGZjX2Vsc19ybmlkICpyZXE7CisJc3RydWN0IHsKKwkJc3RydWN0IGZjX2Vsc19ybmlkX3Jlc3Agcm5pZDsKKwkJc3RydWN0IGZjX2Vsc19ybmlkX2NpZCBjaWQ7CisJCXN0cnVjdCBmY19lbHNfcm5pZF9nZW4gZ2VuOworCX0gKnJwOworCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7CisJdTggZm10OworCXNpemVfdCBsZW47CisJdTMyIGZfY3RsOworCisJRkNfREVCVUdfTFBPUlQoIlJlY2VpdmVkIFJOSUQgcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKKwkJICAgICAgIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlyZXEgPSBmY19mcmFtZV9wYXlsb2FkX2dldChpbl9mcCwgc2l6ZW9mKCpyZXEpKTsKKwlpZiAoIXJlcSkgeworCQlyanRfZGF0YS5mcCA9IE5VTEw7CisJCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfTE9HSUM7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCX0gZWxzZSB7CisJCWZtdCA9IHJlcS0+cm5pZF9mbXQ7CisJCWxlbiA9IHNpemVvZigqcnApOworCQlpZiAoZm10ICE9IEVMU19STklERl9HRU4gfHwKKwkJICAgIG50b2hsKGxwb3J0LT5ybmlkX2dlbi5ybmlkX2F0eXBlKSA9PSAwKSB7CisJCQlmbXQgPSBFTFNfUk5JREZfTk9ORTsJLyogbm90aGluZyB0byBwcm92aWRlICovCisJCQlsZW4gLT0gc2l6ZW9mKHJwLT5nZW4pOworCQl9CisJCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGxlbik7CisJCWlmIChmcCkgeworCQkJcnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKKwkJCW1lbXNldChycCwgMCwgbGVuKTsKKwkJCXJwLT5ybmlkLnJuaWRfY21kID0gRUxTX0xTX0FDQzsKKwkJCXJwLT5ybmlkLnJuaWRfZm10ID0gZm10OworCQkJcnAtPnJuaWQucm5pZF9jaWRfbGVuID0gc2l6ZW9mKHJwLT5jaWQpOworCQkJcnAtPmNpZC5ybmlkX3d3cG4gPSBodG9ubGwobHBvcnQtPnd3cG4pOworCQkJcnAtPmNpZC5ybmlkX3d3bm4gPSBodG9ubGwobHBvcnQtPnd3bm4pOworCQkJaWYgKGZtdCA9PSBFTFNfUk5JREZfR0VOKSB7CisJCQkJcnAtPnJuaWQucm5pZF9zaWRfbGVuID0gc2l6ZW9mKHJwLT5nZW4pOworCQkJCW1lbWNweSgmcnAtPmdlbiwgJmxwb3J0LT5ybmlkX2dlbiwKKwkJCQkgICAgICAgc2l6ZW9mKHJwLT5nZW4pKTsKKwkJCX0KKwkJCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKKwkJCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVE7CisJCQlmX2N0bCB8PSBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQ7CisJCQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAorCQkJCSAgICAgICBGQ19UWVBFX0VMUywgZl9jdGwsIDApOworCQkJbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCQl9CisJfQorCWZjX2ZyYW1lX2ZyZWUoaW5fZnApOworfQorCisvKioKKyAqIGZjX2xwb3J0X3JlY3ZfYWRpc2NfcmVxIC0gSGFuZGxlIHJlY2VpdmVkIEFkZHJlc3MgRGlzY292ZXJ5IFJlcXVlc3QKKyAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHJlY2lldmluZyB0aGUgQURJU0MKKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgQURJU0MgZXhjaGFuZ2UKKyAqIEBmcDogQURJU0MgcmVxdWVzdCBmcmFtZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9hZGlzY19yZXEoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqaW5fZnAsCisJCQkJICAgIHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChzcCk7CisJc3RydWN0IGZjX2Vsc19hZGlzYyAqcmVxLCAqcnA7CisJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKKwlzaXplX3QgbGVuOworCXUzMiBmX2N0bDsKKworCUZDX0RFQlVHX0xQT1JUKCJSZWNlaXZlZCBBRElTQyByZXF1ZXN0IHdoaWxlIGluIHN0YXRlICVzXG4iLAorCQkgICAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKworCXJlcSA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGluX2ZwLCBzaXplb2YoKnJlcSkpOworCWlmICghcmVxKSB7CisJCXJqdF9kYXRhLmZwID0gTlVMTDsKKwkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9MT0dJQzsKKwkJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKKwkJbHBvcnQtPnR0LnNlcV9lbHNfcnNwX3NlbmQoc3AsIEVMU19MU19SSlQsICZyanRfZGF0YSk7CisJfSBlbHNlIHsKKwkJbGVuID0gc2l6ZW9mKCpycCk7CisJCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGxlbik7CisJCWlmIChmcCkgeworCQkJcnAgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgbGVuKTsKKwkJCW1lbXNldChycCwgMCwgbGVuKTsKKwkJCXJwLT5hZGlzY19jbWQgPSBFTFNfTFNfQUNDOworCQkJcnAtPmFkaXNjX3d3cG4gPSBodG9ubGwobHBvcnQtPnd3cG4pOworCQkJcnAtPmFkaXNjX3d3bm4gPSBodG9ubGwobHBvcnQtPnd3bm4pOworCQkJaHRvbjI0KHJwLT5hZGlzY19wb3J0X2lkLAorCQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCQkJc3AgPSBscG9ydC0+dHQuc2VxX3N0YXJ0X25leHQoc3ApOworCQkJZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUTsKKwkJCWZfY3RsIHw9IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKKwkJCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0VMU19SRVAsIGVwLT5kaWQsIGVwLT5zaWQsCisJCQkJICAgICAgIEZDX1RZUEVfRUxTLCBmX2N0bCwgMCk7CisJCQlscG9ydC0+dHQuc2VxX3NlbmQobHBvcnQsIHNwLCBmcCk7CisJCX0KKwl9CisJZmNfZnJhbWVfZnJlZShpbl9mcCk7Cit9CisKKy8qKgorICogZmNfbHBvcnRfcmVjdl9sb2dvX3JlcSAtIEhhbmRsZSByZWNlaXZlZCBmYWJyaWMgTE9HTyByZXF1ZXN0CisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCByZWNpZXZpbmcgdGhlIExPR08KKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgTE9HTyBleGNoYW5nZQorICogQGZwOiBMT0dPIHJlcXVlc3QgZnJhbWUKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4ZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcmVjdl9sb2dvX3JlcShzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkgICBzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfQUNDLCBOVUxMKTsKKwlmY19scG9ydF9lbnRlcl9yZXNldChscG9ydCk7CisJZmNfZnJhbWVfZnJlZShmcCk7Cit9CisKKy8qKgorICogZmNfZmFicmljX2xvZ2luIC0gU3RhcnQgdGhlIGxwb3J0IHN0YXRlIG1hY2hpbmUKKyAqIEBscG9ydDogVGhlIGxwb3J0IHRoYXQgc2hvdWxkIGxvZyBpbnRvIHRoZSBmYWJyaWMKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAqCQkgd2l0aCB0aGUgbHBvcnQgbG9jayBoZWxkLgorICovCitpbnQgZmNfZmFicmljX2xvZ2luKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJaW50IHJjID0gLTE7CisKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCWlmIChscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfTk9ORSkgeworCQlmY19scG9ydF9lbnRlcl9yZXNldChscG9ydCk7CisJCXJjID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChmY19mYWJyaWNfbG9naW4pOworCisvKioKKyAqIGZjX2xpbmt1cCAtIEhhbmRsZXIgZm9yIHRyYW5zcG9ydCBsaW5rdXAgZXZlbnRzCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB3aG9zZSBsaW5rIGlzIHVwCisgKi8KK3ZvaWQgZmNfbGlua3VwKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJRkNfREVCVUdfTFBPUlQoIkxpbmsgaXMgdXAgZm9yIHBvcnQgKCU2eClcbiIsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKKworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisJaWYgKChscG9ydC0+bGlua19zdGF0dXMgJiBGQ19MSU5LX1VQKSAhPSBGQ19MSU5LX1VQKSB7CisJCWxwb3J0LT5saW5rX3N0YXR1cyB8PSBGQ19MSU5LX1VQOworCisJCWlmIChscG9ydC0+c3RhdGUgPT0gTFBPUlRfU1RfUkVTRVQpCisJCQlmY19scG9ydF9lbnRlcl9mbG9naShscG9ydCk7CisJfQorCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woZmNfbGlua3VwKTsKKworLyoqCisgKiBmY19saW5rZG93biAtIEhhbmRsZXIgZm9yIHRyYW5zcG9ydCBsaW5rZG93biBldmVudHMKKyAqIEBscG9ydDogVGhlIGxwb3J0IHdob3NlIGxpbmsgaXMgZG93bgorICovCit2b2lkIGZjX2xpbmtkb3duKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlGQ19ERUJVR19MUE9SVCgiTGluayBpcyBkb3duIGZvciBwb3J0ICglNngpXG4iLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisKKwlpZiAoKGxwb3J0LT5saW5rX3N0YXR1cyAmIEZDX0xJTktfVVApID09IEZDX0xJTktfVVApIHsKKwkJbHBvcnQtPmxpbmtfc3RhdHVzICY9IH4oRkNfTElOS19VUCk7CisJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKKwkJbHBvcnQtPnR0LmZjcF9jbGVhbnVwKGxwb3J0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChmY19saW5rZG93bik7CisKKy8qKgorICogZmNfcGF1c2UgLSBQYXVzZSB0aGUgZmxvdyBvZiBmcmFtZXMKKyAqIEBscG9ydDogVGhlIGxwb3J0IHRvIGJlIHBhdXNlZAorICovCit2b2lkIGZjX3BhdXNlKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlscG9ydC0+bGlua19zdGF0dXMgfD0gRkNfUEFVU0U7CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChmY19wYXVzZSk7CisKKy8qKgorICogZmNfdW5wYXVzZSAtIFVucGF1c2UgdGhlIGZsb3cgb2YgZnJhbWVzCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB0byBiZSB1bnBhdXNlZAorICovCit2b2lkIGZjX3VucGF1c2Uoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCWxwb3J0LT5saW5rX3N0YXR1cyAmPSB+KEZDX1BBVVNFKTsKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3VucGF1c2UpOworCisvKioKKyAqIGZjX2ZhYnJpY19sb2dvZmYgLSBMb2dvdXQgb2YgdGhlIGZhYnJpYworICogQGxwb3J0OgkgICAgICBmY19scG9ydCBwb2ludGVyIHRvIGxvZ29mZiB0aGUgZmFicmljCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUKKyAqKi8KK2ludCBmY19mYWJyaWNfbG9nb2ZmKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJbHBvcnQtPnR0LmRpc2Nfc3RvcF9maW5hbChscG9ydCk7CisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlmY19scG9ydF9lbnRlcl9sb2dvKGxwb3J0KTsKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2ZhYnJpY19sb2dvZmYpOworCisvKioKKyAqIGZjX2xwb3J0X2Rlc3Ryb3kgLSB1bnJlZ2lzdGVyIGEgZmNfbHBvcnQKKyAqIEBscG9ydDoJICAgICAgZmNfbHBvcnQgcG9pbnRlciB0byB1bnJlZ2lzdGVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJTm9uZQorICogTm90ZToKKyAqIGV4aXQgcm91dGluZSBmb3IgZmNfbHBvcnQgaW5zdGFuY2UKKyAqIGNsZWFuLXVwIGFsbCB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICogYW5kIGZyZWUgdXAgb3RoZXIgc3lzdGVtIHJlc291cmNlcy4KKyAqCisgKiovCitpbnQgZmNfbHBvcnRfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCWxwb3J0LT50dC5mcmFtZV9zZW5kID0gZmNfZnJhbWVfZHJvcDsKKwlscG9ydC0+dHQuZmNwX2Fib3J0X2lvKGxwb3J0KTsKKwlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQobHBvcnQtPmVtcCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2xwb3J0X2Rlc3Ryb3kpOworCisvKioKKyAqIGZjX3NldF9tZnMgLSBzZXRzIHVwIHRoZSBtZnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZjX2xwb3J0CisgKiBAbHBvcnQ6IGZjX2xwb3J0IHBvaW50ZXIgdG8gdW5yZWdpc3RlcgorICogQG1mczogdGhlIG5ldyBtZnMgZm9yIGZjX2xwb3J0CisgKgorICogU2V0IG1mcyBmb3IgdGhlIGdpdmVuIGZjX2xwb3J0IHRvIHRoZSBuZXcgbWZzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcworICoKKyAqKi8KK2ludCBmY19zZXRfbWZzKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHUzMiBtZnMpCit7CisJdW5zaWduZWQgaW50IG9sZF9tZnM7CisJaW50IHJjID0gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwlvbGRfbWZzID0gbHBvcnQtPm1mczsKKworCWlmIChtZnMgPj0gRkNfTUlOX01BWF9GUkFNRSkgeworCQltZnMgJj0gfjM7CisJCWlmIChtZnMgPiBGQ19NQVhfRlJBTUUpCisJCQltZnMgPSBGQ19NQVhfRlJBTUU7CisJCW1mcyAtPSBzaXplb2Yoc3RydWN0IGZjX2ZyYW1lX2hlYWRlcik7CisJCWxwb3J0LT5tZnMgPSBtZnM7CisJCXJjID0gMDsKKwl9CisKKwlpZiAoIXJjICYmIG1mcyA8IG9sZF9tZnMpCisJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKKworCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0woZmNfc2V0X21mcyk7CisKKy8qKgorICogZmNfbHBvcnRfZGlzY19jYWxsYmFjayAtIENhbGxiYWNrIGZvciBkaXNjb3ZlcnkgZXZlbnRzCisgKiBAbHBvcnQ6IEZDIGxvY2FsIHBvcnQKKyAqIEBldmVudDogVGhlIGRpc2NvdmVyeSBldmVudAorICovCit2b2lkIGZjX2xwb3J0X2Rpc2NfY2FsbGJhY2soc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgZW51bSBmY19kaXNjX2V2ZW50IGV2ZW50KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIERJU0NfRVZfU1VDQ0VTUzoKKwkJRkNfREVCVUdfTFBPUlQoIkdvdCBhIFNVQ0NFU1MgZXZlbnQgZm9yIHBvcnQgKCU2eClcbiIsCisJCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJCWJyZWFrOworCWNhc2UgRElTQ19FVl9GQUlMRUQ6CisJCUZDX0RFQlVHX0xQT1JUKCJHb3QgYSBGQUlMRUQgZXZlbnQgZm9yIHBvcnQgKCU2eClcbiIsCisJCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKKwkJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCQlicmVhazsKKwljYXNlIERJU0NfRVZfTk9ORToKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGZjX3Jwb3J0X2VudGVyX3JlYWR5IC0gRW50ZXIgdGhlIHJlYWR5IHN0YXRlIGFuZCBzdGFydCBkaXNjb3ZlcnkKKyAqIEBscG9ydDogRmlicmUgQ2hhbm5lbCBsb2NhbCBwb3J0IHRoYXQgaXMgcmVhZHkKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfcmVhZHkoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlGQ19ERUJVR19MUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIFJlYWR5IGZyb20gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpLCBmY19scG9ydF9zdGF0ZShscG9ydCkpOworCisJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX1JFQURZKTsKKworCWxwb3J0LT50dC5kaXNjX3N0YXJ0KGZjX2xwb3J0X2Rpc2NfY2FsbGJhY2ssIGxwb3J0KTsKK30KKworLyoqCisgKiBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcSAtIFJlY2VpdmUgYSBGTE9HSSByZXF1ZXN0CisgKiBAc3BfaW46IFRoZSBzZXF1ZW5jZSB0aGUgRkxPR0kgaXMgb24KKyAqIEByeF9mcDogVGhlIGZyYW1lIHRoZSBGTE9HSSBpcyBpbgorICogQGxwb3J0OiBUaGUgbHBvcnQgdGhhdCByZWNpZXZlZCB0aGUgcmVxdWVzdAorICoKKyAqIEEgcmVjZWl2ZWQgRkxPR0kgcmVxdWVzdCBpbmRpY2F0ZXMgYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uLgorICogQWNjZXB0IGl0IHdpdGggdGhlIGNvbW1vbiBzZXJ2aWNlIHBhcmFtZXRlcnMgaW5kaWNhdGluZyBvdXIgTiBwb3J0LgorICogU2V0IHVwIHRvIGRvIGEgUExPR0kgaWYgd2UgaGF2ZSB0aGUgaGlnaGVyLW51bWJlciBXV1BOLgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcShzdHJ1Y3QgZmNfc2VxICpzcF9pbiwKKwkJCQkgICAgc3RydWN0IGZjX2ZyYW1lICpyeF9mcCwKKwkJCQkgICAgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19zZXEgKnNwOworCXN0cnVjdCBmY19leGNoICplcDsKKwlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpmbHA7CisJc3RydWN0IGZjX2Vsc19mbG9naSAqbmV3X2ZscDsKKwl1NjQgcmVtb3RlX3d3cG47CisJdTMyIHJlbW90ZV9maWQ7CisJdTMyIGxvY2FsX2ZpZDsKKwl1MzIgZl9jdGw7CisKKwlGQ19ERUJVR19MUE9SVCgiUmVjZWl2ZWQgRkxPR0kgcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKKwkJICAgICAgIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQocnhfZnApOworCXJlbW90ZV9maWQgPSBudG9oMjQoZmgtPmZoX3NfaWQpOworCWZscCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KHJ4X2ZwLCBzaXplb2YoKmZscCkpOworCWlmICghZmxwKQorCQlnb3RvIG91dDsKKwlyZW1vdGVfd3dwbiA9IGdldF91bmFsaWduZWRfYmU2NCgmZmxwLT5mbF93d3BuKTsKKwlpZiAocmVtb3RlX3d3cG4gPT0gbHBvcnQtPnd3cG4pIHsKKwkJRkNfREJHKCJGTE9HSSBmcm9tIHBvcnQgd2l0aCBzYW1lIFdXUE4gJWxseCAiCisJCSAgICAgICAicG9zc2libGUgY29uZmlndXJhdGlvbiBlcnJvclxuIiwgcmVtb3RlX3d3cG4pOworCQlnb3RvIG91dDsKKwl9CisJRkNfREJHKCJGTE9HSSBmcm9tIHBvcnQgV1dQTiAlbGx4XG4iLCByZW1vdGVfd3dwbik7CisKKwkvKgorCSAqIFhYWCB3aGF0IGlzIHRoZSByaWdodCB0aGluZyB0byBkbyBmb3IgRklEcz8KKwkgKiBUaGUgb3JpZ2luYXRvciBtaWdodCBleHBlY3Qgb3VyIFNfSUQgdG8gYmUgMHhmZmZmZmUuCisJICogQnV0IGlmIHNvLCBib3RoIG9mIHVzIGNvdWxkIGVuZCB1cCB3aXRoIHRoZSBzYW1lIEZJRC4KKwkgKi8KKwlsb2NhbF9maWQgPSBGQ19MT0NBTF9QVFBfRklEX0xPOworCWlmIChyZW1vdGVfd3dwbiA8IGxwb3J0LT53d3BuKSB7CisJCWxvY2FsX2ZpZCA9IEZDX0xPQ0FMX1BUUF9GSURfSEk7CisJCWlmICghcmVtb3RlX2ZpZCB8fCByZW1vdGVfZmlkID09IGxvY2FsX2ZpZCkKKwkJCXJlbW90ZV9maWQgPSBGQ19MT0NBTF9QVFBfRklEX0xPOworCX0gZWxzZSBpZiAoIXJlbW90ZV9maWQpIHsKKwkJcmVtb3RlX2ZpZCA9IEZDX0xPQ0FMX1BUUF9GSURfSEk7CisJfQorCisJZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSA9IGxvY2FsX2ZpZDsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqZmxwKSk7CisJaWYgKGZwKSB7CisJCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KGZyX3NlcShyeF9mcCkpOworCQluZXdfZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CisJCWZjX2xwb3J0X2Zsb2dpX2ZpbGwobHBvcnQsIG5ld19mbHAsIEVMU19GTE9HSSk7CisJCW5ld19mbHAtPmZsX2NtZCA9ICh1OCkgRUxTX0xTX0FDQzsKKworCQkvKgorCQkgKiBTZW5kIHRoZSByZXNwb25zZS4gIElmIHRoaXMgZmFpbHMsIHRoZSBvcmlnaW5hdG9yIHNob3VsZAorCQkgKiByZXBlYXQgdGhlIHNlcXVlbmNlLgorCQkgKi8KKwkJZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUSB8IEZDX0ZDX0VORF9TRVE7CisJCWVwID0gZmNfc2VxX2V4Y2goc3ApOworCQlmY19maWxsX2ZjX2hkcihmcCwgRkNfUkNUTF9FTFNfUkVQLCBlcC0+ZGlkLCBlcC0+c2lkLAorCQkJICAgICAgIEZDX1RZUEVfRUxTLCBmX2N0bCwgMCk7CisJCWxwb3J0LT50dC5zZXFfc2VuZChscG9ydCwgc3AsIGZwKTsKKworCX0gZWxzZSB7CisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisJfQorCWZjX2xwb3J0X3B0cF9zZXR1cChscG9ydCwgcmVtb3RlX2ZpZCwgcmVtb3RlX3d3cG4sCisJCQkgICBnZXRfdW5hbGlnbmVkX2JlNjQoJmZscC0+Zmxfd3dubikpOworCisJbHBvcnQtPnR0LmRpc2Nfc3RhcnQoZmNfbHBvcnRfZGlzY19jYWxsYmFjaywgbHBvcnQpOworCitvdXQ6CisJc3AgPSBmcl9zZXEocnhfZnApOworCWZjX2ZyYW1lX2ZyZWUocnhfZnApOworfQorCisvKioKKyAqIGZjX2xwb3J0X3JlY3ZfcmVxIC0gVGhlIGdlbmVyaWMgbHBvcnQgcmVxdWVzdCBoYW5kbGVyCisgKiBAbHBvcnQ6IFRoZSBscG9ydCB0aGF0IHJlY2VpdmVkIHRoZSByZXF1ZXN0CisgKiBAc3A6IFRoZSBzZXF1ZW5jZSB0aGUgcmVxdWVzdCBpcyBvbgorICogQGZwOiBUaGUgZnJhbWUgdGhlIHJlcXVlc3QgaXMgaW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VlIGlmIHRoZSBscG9ydCBoYW5kbGVzIHRoZSByZXF1ZXN0IG9yCisgKiBpZiBhbiBycG9ydCBzaG91bGQgaGFuZGxlIHRoZSByZXF1ZXN0LgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBscG9ydAorICoJCSBsb2NrIGhlbGQgYmVjdWFzZSBpdCB3aWxsIGdyYWIgdGhlIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGZjX2xwb3J0X3JlY3ZfcmVxKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19zZXEgKnNwLAorCQkJICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCXZvaWQgKCpyZWN2KSAoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgc3RydWN0IGZjX2xwb3J0ICopOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJdTMyIHNfaWQ7CisJdTMyIGRfaWQ7CisJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKKworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwkvKgorCSAqIEhhbmRsZSBzcGVjaWFsIEVMUyBjYXNlcyBsaWtlIEZMT0dJLCBMT0dPLCBhbmQKKwkgKiBSU0NOIGhlcmUuICBUaGVzZSBkb24ndCByZXF1aXJlIGEgc2Vzc2lvbi4KKwkgKiBFdmVuIGlmIHdlIGhhZCBhIHNlc3Npb24sIGl0IG1pZ2h0IG5vdCBiZSByZWFkeS4KKwkgKi8KKwlpZiAoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9FTFMgJiYgZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSkgeworCQkvKgorCQkgKiBDaGVjayBvcGNvZGUuCisJCSAqLworCQlyZWN2ID0gTlVMTDsKKwkJc3dpdGNoIChmY19mcmFtZV9wYXlsb2FkX29wKGZwKSkgeworCQljYXNlIEVMU19GTE9HSToKKwkJCXJlY3YgPSBmY19scG9ydF9yZWN2X2Zsb2dpX3JlcTsKKwkJCWJyZWFrOworCQljYXNlIEVMU19MT0dPOgorCQkJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkJCWlmIChudG9oMjQoZmgtPmZoX3NfaWQpID09IEZDX0ZJRF9GTE9HSSkKKwkJCQlyZWN2ID0gZmNfbHBvcnRfcmVjdl9sb2dvX3JlcTsKKwkJCWJyZWFrOworCQljYXNlIEVMU19SU0NOOgorCQkJcmVjdiA9IGxwb3J0LT50dC5kaXNjX3JlY3ZfcmVxOworCQkJYnJlYWs7CisJCWNhc2UgRUxTX0VDSE86CisJCQlyZWN2ID0gZmNfbHBvcnRfcmVjdl9lY2hvX3JlcTsKKwkJCWJyZWFrOworCQljYXNlIEVMU19STElSOgorCQkJcmVjdiA9IGZjX2xwb3J0X3JlY3Zfcmxpcl9yZXE7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfUk5JRDoKKwkJCXJlY3YgPSBmY19scG9ydF9yZWN2X3JuaWRfcmVxOworCQkJYnJlYWs7CisJCWNhc2UgRUxTX0FESVNDOgorCQkJcmVjdiA9IGZjX2xwb3J0X3JlY3ZfYWRpc2NfcmVxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVjdikKKwkJCXJlY3Yoc3AsIGZwLCBscG9ydCk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZpbmQgc2Vzc2lvbi4KKwkJCSAqIElmIHRoaXMgaXMgYSBuZXcgaW5jb21pbmcgUExPR0ksIHdlIHdvbid0IGZpbmQgaXQuCisJCQkgKi8KKwkJCXNfaWQgPSBudG9oMjQoZmgtPmZoX3NfaWQpOworCQkJZF9pZCA9IG50b2gyNChmaC0+ZmhfZF9pZCk7CisKKwkJCXJwb3J0ID0gbHBvcnQtPnR0LnJwb3J0X2xvb2t1cChscG9ydCwgc19pZCk7CisJCQlpZiAocnBvcnQpCisJCQkJbHBvcnQtPnR0LnJwb3J0X3JlY3ZfcmVxKHNwLCBmcCwgcnBvcnQpOworCQkJZWxzZSB7CisJCQkJcmp0X2RhdGEuZnAgPSBOVUxMOworCQkJCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5BQjsKKwkJCQlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9OT05FOworCQkJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLAorCQkJCQkJCSAgIEVMU19MU19SSlQsCisJCQkJCQkJICAgJnJqdF9kYXRhKTsKKwkJCQlmY19mcmFtZV9mcmVlKGZwKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCUZDX0RCRygiZHJvcHBpbmcgaW52YWxpZCBmcmFtZSAoZW9mICV4KVxuIiwgZnJfZW9mKGZwKSk7CisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCX0KKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwkvKgorCSAqICBUaGUgY29tbW9uIGV4Y2hfZG9uZSBmb3IgYWxsIHJlcXVlc3QgbWF5IG5vdCBiZSBnb29kCisJICogIGlmIGFueSByZXF1ZXN0IHJlcXVpcmVzIGxvbmdlciBob2xkIG9uIGV4aGFuZ2UuIFhYWAorCSAqLworCWxwb3J0LT50dC5leGNoX2RvbmUoc3ApOworfQorCisvKioKKyAqIGZjX2xwb3J0X3Jlc2V0IC0gUmVzZXQgYW4gbHBvcnQKKyAqIEBscG9ydDogVGhlIGxwb3J0IHdoaWNoIHNob3VsZCBiZSByZXNldAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAqCQkgbHBvcnQgbG9jayBoZWxkLgorICovCitpbnQgZmNfbHBvcnRfcmVzZXQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2xwb3J0X3Jlc2V0KTsKKworLyoqCisgKiBmY19ycG9ydF9lbnRlcl9yZXNldCAtIFJlc2V0IHRoZSBsb2NhbCBwb3J0CisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byBiZSByZXNldAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9yZXNldChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCUZDX0RFQlVHX0xQT1JUKCJQb3J0ICglNngpIGVudGVyZWQgUkVTRVQgc3RhdGUgZnJvbSAlcyBzdGF0ZVxuIiwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlmY19scG9ydF9zdGF0ZV9lbnRlcihscG9ydCwgTFBPUlRfU1RfUkVTRVQpOworCisJaWYgKGxwb3J0LT5kbnNfcnApCisJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYobHBvcnQtPmRuc19ycCk7CisKKwlpZiAobHBvcnQtPnB0cF9ycCkgeworCQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKGxwb3J0LT5wdHBfcnApOworCQlscG9ydC0+cHRwX3JwID0gTlVMTDsKKwl9CisKKwlscG9ydC0+dHQuZGlzY19zdG9wKGxwb3J0KTsKKworCWxwb3J0LT50dC5leGNoX21ncl9yZXNldChscG9ydC0+ZW1wLCAwLCAwKTsKKwlmY19ob3N0X2ZhYnJpY19uYW1lKGxwb3J0LT5ob3N0KSA9IDA7CisJZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSA9IDA7CisKKwlpZiAoKGxwb3J0LT5saW5rX3N0YXR1cyAmIEZDX0xJTktfVVApID09IEZDX0xJTktfVVApCisJCWZjX2xwb3J0X2VudGVyX2Zsb2dpKGxwb3J0KTsKK30KKworLyoqCisgKiBmY19scG9ydF9lcnJvciAtIEhhbmRsZXIgZm9yIGFueSBlcnJvcnMKKyAqIEBscG9ydDogVGhlIGZjX2xwb3J0IG9iamVjdAorICogQGZwOiBUaGUgZnJhbWUgcG9pbnRlcgorICoKKyAqIElmIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5IGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsdXJlCisgKiB0aGVuIHdhaXQgZm9yIGhhbGYgYSBzZWNvbmQgYW5kIHJldHJ5LCBvdGhlcndpc2UgcmV0cnkKKyAqIGFmdGVyIHRoZSBlX2RfdG92IHRpbWUuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2xwb3J0X2Vycm9yKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJRkNfREVCVUdfTFBPUlQoIkVycm9yICVsZCBpbiBzdGF0ZSAlcywgcmV0cmllcyAlZFxuIiwKKwkJICAgICAgIFBUUl9FUlIoZnApLCBmY19scG9ydF9zdGF0ZShscG9ydCksCisJCSAgICAgICBscG9ydC0+cmV0cnlfY291bnQpOworCisJaWYgKCFmcCB8fCBQVFJfRVJSKGZwKSA9PSAtRkNfRVhfVElNRU9VVCkgeworCQkvKgorCQkgKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCBvciB0aGUgZXhjaGFuZ2UgdGltZWQgb3V0LgorCQkgKiAgUmV0cnkgYWZ0ZXIgZGVsYXkKKwkJICovCisJCWlmIChscG9ydC0+cmV0cnlfY291bnQgPCBscG9ydC0+bWF4X3JldHJ5X2NvdW50KSB7CisJCQlscG9ydC0+cmV0cnlfY291bnQrKzsKKwkJCWlmICghZnApCisJCQkJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJCQllbHNlCisJCQkJZGVsYXkgPQltc2Vjc190b19qaWZmaWVzKGxwb3J0LT5lX2RfdG92KTsKKworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZscG9ydC0+cmV0cnlfd29yaywgZGVsYXkpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChscG9ydC0+c3RhdGUpIHsKKwkJCWNhc2UgTFBPUlRfU1RfTk9ORToKKwkJCWNhc2UgTFBPUlRfU1RfUkVBRFk6CisJCQljYXNlIExQT1JUX1NUX1JFU0VUOgorCQkJY2FzZSBMUE9SVF9TVF9SUE5fSUQ6CisJCQljYXNlIExQT1JUX1NUX1JGVF9JRDoKKwkJCWNhc2UgTFBPUlRfU1RfU0NSOgorCQkJY2FzZSBMUE9SVF9TVF9ETlM6CisJCQljYXNlIExQT1JUX1NUX0ZMT0dJOgorCQkJY2FzZSBMUE9SVF9TVF9MT0dPOgorCQkJCWZjX2xwb3J0X2VudGVyX3Jlc2V0KGxwb3J0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBmY19scG9ydF9yZnRfaWRfcmVzcCAtIEhhbmRsZSByZXNwb25zZSB0byBSZWdpc3RlciBGaWJyZQorICoJCQkgIENoYW5uZWwgVHlwZXMgYnkgSUQgKFJQTl9JRCkgcmVxdWVzdAorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIFJQTl9JRCBleGNoYW5nZQorICogQGZwOiByZXNwb25zZSBmcmFtZQorICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbHBvcnQgbG9jaworICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcgorICogYW5kIHRoZW4gdW5sb2NrIHRoZSBscG9ydC4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcmZ0X2lkX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJIHZvaWQgKmxwX2FyZykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gbHBfYXJnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19jdF9oZHIgKmN0OworCisJaWYgKGZwID09IEVSUl9QVFIoLUZDX0VYX0NMT1NFRCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwlGQ19ERUJVR19MUE9SVCgiUmVjZWl2ZWQgYSBSRlRfSUQgcmVzcG9uc2VcbiIpOworCisJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SRlRfSUQpIHsKKwkJRkNfREJHKCJSZWNlaXZlZCBhIFJGVF9JRCByZXNwb25zZSwgYnV0IGluIHN0YXRlICVzXG4iLAorCQkgICAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKElTX0VSUihmcCkpIHsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwljdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmN0KSk7CisKKwlpZiAoZmggJiYgY3QgJiYgZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9DVCAmJgorCSAgICBjdC0+Y3RfZnNfdHlwZSA9PSBGQ19GU1RfRElSICYmCisJICAgIGN0LT5jdF9mc19zdWJ0eXBlID09IEZDX05TX1NVQlRZUEUgJiYKKwkgICAgbnRvaHMoY3QtPmN0X2NtZCkgPT0gRkNfRlNfQUNDKQorCQlmY19scG9ydF9lbnRlcl9zY3IobHBvcnQpOworCWVsc2UKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Cit9CisKKy8qKgorICogZmNfbHBvcnRfcnBuX2lkX3Jlc3AgLSBIYW5kbGUgcmVzcG9uc2UgdG8gUmVnaXN0ZXIgUG9ydAorICoJCQkgIE5hbWUgYnkgSUQgKFJQTl9JRCkgcmVxdWVzdAorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIFJQTl9JRCBleGNoYW5nZQorICogQGZwOiByZXNwb25zZSBmcmFtZQorICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbHBvcnQgbG9jaworICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19scG9ydF9lcnJvcgorICogYW5kIHRoZW4gdW5sb2NrIHRoZSBscG9ydC4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfcnBuX2lkX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJIHZvaWQgKmxwX2FyZykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gbHBfYXJnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19jdF9oZHIgKmN0OworCisJaWYgKGZwID09IEVSUl9QVFIoLUZDX0VYX0NMT1NFRCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisKKwlGQ19ERUJVR19MUE9SVCgiUmVjZWl2ZWQgYSBSUE5fSUQgcmVzcG9uc2VcbiIpOworCisJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SUE5fSUQpIHsKKwkJRkNfREJHKCJSZWNlaXZlZCBhIFJQTl9JRCByZXNwb25zZSwgYnV0IGluIHN0YXRlICVzXG4iLAorCQkgICAgICAgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKElTX0VSUihmcCkpIHsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwljdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmN0KSk7CisJaWYgKGZoICYmIGN0ICYmIGZoLT5maF90eXBlID09IEZDX1RZUEVfQ1QgJiYKKwkgICAgY3QtPmN0X2ZzX3R5cGUgPT0gRkNfRlNUX0RJUiAmJgorCSAgICBjdC0+Y3RfZnNfc3VidHlwZSA9PSBGQ19OU19TVUJUWVBFICYmCisJICAgIG50b2hzKGN0LT5jdF9jbWQpID09IEZDX0ZTX0FDQykKKwkJZmNfbHBvcnRfZW50ZXJfcmZ0X2lkKGxwb3J0KTsKKwllbHNlCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Cit9CisKKy8qKgorICogZmNfbHBvcnRfc2NyX3Jlc3AgLSBIYW5kbGUgcmVzcG9uc2UgdG8gU3RhdGUgQ2hhbmdlIFJlZ2lzdGVyIChTQ1IpIHJlcXVlc3QKKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiBTQ1IgZXhjaGFuZ2UKKyAqIEBmcDogcmVzcG9uc2UgZnJhbWUKKyAqIEBscF9hcmc6IEZpYnJlIENoYW5uZWwgbHBvcnQgcG9ydCBpbnN0YW5jZSB0aGF0IHNlbnQgdGhlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0CisgKgorICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIGxwb3J0IGxvY2sKKyAqIGhlbGQsIGJ1dCBpdCB3aWxsIGxvY2ssIGNhbGwgYW4gX2VudGVyXyogZnVuY3Rpb24gb3IgZmNfbHBvcnRfZXJyb3IKKyAqIGFuZCB0aGVuIHVubG9jayB0aGUgbHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX2xwb3J0X3Njcl9yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJICAgICAgdm9pZCAqbHBfYXJnKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBscF9hcmc7CisJdTggb3A7CisKKwlpZiAoZnAgPT0gRVJSX1BUUigtRkNfRVhfQ0xPU0VEKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKworCUZDX0RFQlVHX0xQT1JUKCJSZWNlaXZlZCBhIFNDUiByZXNwb25zZVxuIik7CisKKwlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1NDUikgeworCQlGQ19EQkcoIlJlY2VpdmVkIGEgU0NSIHJlc3BvbnNlLCBidXQgaW4gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworCQlnb3RvIGVycjsKKwl9CisKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDKQorCQlmY19scG9ydF9lbnRlcl9yZWFkeShscG9ydCk7CisJZWxzZQorCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworCitvdXQ6CisJZmNfZnJhbWVfZnJlZShmcCk7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorCisvKioKKyAqIGZjX2xwb3J0X2VudGVyX3NjciAtIFNlbmQgYSBTdGF0ZSBDaGFuZ2UgUmVnaXN0ZXIgKFNDUikgcmVxdWVzdAorICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgdG8gcmVnaXN0ZXIgZm9yIHN0YXRlIGNoYW5nZXMKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfc2NyKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKworCUZDX0RFQlVHX0xQT1JUKCJQb3J0ICglNngpIGVudGVyZWQgU0NSIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpLCBmY19scG9ydF9zdGF0ZShscG9ydCkpOworCisJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX1NDUik7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19zY3IpKTsKKwlpZiAoIWZwKSB7CisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBOVUxMLCBmcCwgRUxTX1NDUiwKKwkJCQkgIGZjX2xwb3J0X3Njcl9yZXNwLCBscG9ydCwgbHBvcnQtPmVfZF90b3YpKQorCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworfQorCisvKioKKyAqIGZjX2xwb3J0X2VudGVyX3JmdF9pZCAtIFJlZ2lzdGVyIEZDNC10eXBlcyB3aXRoIHRoZSBuYW1lIHNlcnZlcgorICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgdG8gcmVnaXN0ZXIKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfcmZ0X2lkKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfbnNfZnRzICpscHM7CisJaW50IGk7CisKKwlGQ19ERUJVR19MUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIFJGVF9JRCBzdGF0ZSBmcm9tICVzIHN0YXRlXG4iLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSwgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKworCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBMUE9SVF9TVF9SRlRfSUQpOworCisJbHBzID0gJmxwb3J0LT5mY3RzOworCWkgPSBzaXplb2YobHBzLT5mZl90eXBlX21hcCkgLyBzaXplb2YobHBzLT5mZl90eXBlX21hcFswXSk7CisJd2hpbGUgKC0taSA+PSAwKQorCQlpZiAobnRvaGwobHBzLT5mZl90eXBlX21hcFtpXSkgIT0gMCkKKwkJCWJyZWFrOworCWlmIChpIDwgMCkgeworCQkvKiBub3RoaW5nIHRvIHJlZ2lzdGVyLCBtb3ZlIG9uIHRvIFNDUiAqLworCQlmY19scG9ydF9lbnRlcl9zY3IobHBvcnQpOworCQlyZXR1cm47CisJfQorCisJZnAgPSBmY19mcmFtZV9hbGxvYyhscG9ydCwgc2l6ZW9mKHN0cnVjdCBmY19jdF9oZHIpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGZjX25zX3JmdCkpOworCWlmICghZnApIHsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIE5VTEwsIGZwLCBGQ19OU19SRlRfSUQsCisJCQkJICBmY19scG9ydF9yZnRfaWRfcmVzcCwKKwkJCQkgIGxwb3J0LCBscG9ydC0+ZV9kX3RvdikpCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfcmZ0X2lkIC0gUmVnaXN0ZXIgcG9ydCBuYW1lIHdpdGggdGhlIG5hbWUgc2VydmVyCisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byByZWdpc3RlcgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9ycG5faWQoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCisJRkNfREVCVUdfTFBPUlQoIlBvcnQgKCU2eCkgZW50ZXJlZCBSUE5fSUQgc3RhdGUgZnJvbSAlcyBzdGF0ZVxuIiwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlmY19scG9ydF9zdGF0ZV9lbnRlcihscG9ydCwgTFBPUlRfU1RfUlBOX0lEKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihzdHJ1Y3QgZmNfY3RfaGRyKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBmY19uc19ybl9pZCkpOworCWlmICghZnApIHsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIE5VTEwsIGZwLCBGQ19OU19SUE5fSUQsCisJCQkJICBmY19scG9ydF9ycG5faWRfcmVzcCwKKwkJCQkgIGxwb3J0LCBscG9ydC0+ZV9kX3RvdikpCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmNfcnBvcnRfb3BlcmF0aW9ucyBmY19scG9ydF9ycG9ydF9vcHMgPSB7CisJLmV2ZW50X2NhbGxiYWNrID0gZmNfbHBvcnRfcnBvcnRfY2FsbGJhY2ssCit9OworCisvKioKKyAqIGZjX3Jwb3J0X2VudGVyX2RucyAtIENyZWF0ZSBhIHJwb3J0IHRvIHRoZSBuYW1lIHNlcnZlcgorICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgcmVxdWVzdGluZyBhIHJwb3J0IGZvciB0aGUgbmFtZSBzZXJ2ZXIKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBscG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfZW50ZXJfZG5zKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGE7CisJc3RydWN0IGZjX2Rpc2NfcG9ydCBkcDsKKworCWRwLmlkcy5wb3J0X2lkID0gRkNfRklEX0RJUl9TRVJWOworCWRwLmlkcy5wb3J0X25hbWUgPSAtMTsKKwlkcC5pZHMubm9kZV9uYW1lID0gLTE7CisJZHAuaWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOworCWRwLmxwID0gbHBvcnQ7CisKKwlGQ19ERUJVR19MUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIEROUyBzdGF0ZSBmcm9tICVzIHN0YXRlXG4iLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSwgZmNfbHBvcnRfc3RhdGUobHBvcnQpKTsKKworCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBMUE9SVF9TVF9ETlMpOworCisJcnBvcnQgPSBmY19ycG9ydF9yb2d1ZV9jcmVhdGUoJmRwKTsKKwlpZiAoIXJwb3J0KQorCQlnb3RvIGVycjsKKworCXJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJcmRhdGEtPm9wcyA9ICZmY19scG9ydF9ycG9ydF9vcHM7CisJbHBvcnQtPnR0LnJwb3J0X2xvZ2luKHJwb3J0KTsKKwlyZXR1cm47CisKK2VycjoKKwlmY19scG9ydF9lcnJvcihscG9ydCwgTlVMTCk7Cit9CisKKy8qKgorICogZmNfbHBvcnRfdGltZW91dCAtIEhhbmRsZXIgZm9yIHRoZSByZXRyeV93b3JrIHRpbWVyLgorICogQHdvcms6IFRoZSB3b3JrIHN0cnVjdCBvZiB0aGUgZmNfbHBvcnQKKyAqLworc3RhdGljIHZvaWQgZmNfbHBvcnRfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNfbHBvcnQsCisJCQkgICAgIHJldHJ5X3dvcmsud29yayk7CisKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCisJc3dpdGNoIChscG9ydC0+c3RhdGUpIHsKKwljYXNlIExQT1JUX1NUX05PTkU6CisJY2FzZSBMUE9SVF9TVF9SRUFEWToKKwljYXNlIExQT1JUX1NUX1JFU0VUOgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwljYXNlIExQT1JUX1NUX0ZMT0dJOgorCQlmY19scG9ydF9lbnRlcl9mbG9naShscG9ydCk7CisJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfRE5TOgorCQlmY19scG9ydF9lbnRlcl9kbnMobHBvcnQpOworCQlicmVhazsKKwljYXNlIExQT1JUX1NUX1JQTl9JRDoKKwkJZmNfbHBvcnRfZW50ZXJfcnBuX2lkKGxwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBMUE9SVF9TVF9SRlRfSUQ6CisJCWZjX2xwb3J0X2VudGVyX3JmdF9pZChscG9ydCk7CisJCWJyZWFrOworCWNhc2UgTFBPUlRfU1RfU0NSOgorCQlmY19scG9ydF9lbnRlcl9zY3IobHBvcnQpOworCQlicmVhazsKKwljYXNlIExQT1JUX1NUX0xPR086CisJCWZjX2xwb3J0X2VudGVyX2xvZ28obHBvcnQpOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Cit9CisKKy8qKgorICogZmNfbHBvcnRfbG9nb19yZXNwIC0gSGFuZGxlIHJlc3BvbnNlIHRvIExPR08gcmVxdWVzdAorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIExPR08gZXhjaGFuZ2UKKyAqIEBmcDogcmVzcG9uc2UgZnJhbWUKKyAqIEBscF9hcmc6IEZpYnJlIENoYW5uZWwgbHBvcnQgcG9ydCBpbnN0YW5jZSB0aGF0IHNlbnQgdGhlIExPR08gcmVxdWVzdAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBscG9ydCBsb2NrCisgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX2xwb3J0X2Vycm9yCisgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIGxwb3J0LgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9sb2dvX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkgICAgICAgdm9pZCAqbHBfYXJnKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBscF9hcmc7CisJdTggb3A7CisKKwlpZiAoZnAgPT0gRVJSX1BUUigtRkNfRVhfQ0xPU0VEKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKworCUZDX0RFQlVHX0xQT1JUKCJSZWNlaXZlZCBhIExPR08gcmVzcG9uc2VcbiIpOworCisJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9MT0dPKSB7CisJCUZDX0RCRygiUmVjZWl2ZWQgYSBMT0dPIHJlc3BvbnNlLCBidXQgaW4gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19scG9ydF9zdGF0ZShscG9ydCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworCQlnb3RvIGVycjsKKwl9CisKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDKQorCQlmY19scG9ydF9lbnRlcl9yZXNldChscG9ydCk7CisJZWxzZQorCQlmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworCitvdXQ6CisJZmNfZnJhbWVfZnJlZShmcCk7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorCisvKioKKyAqIGZjX3Jwb3J0X2VudGVyX2xvZ28gLSBMb2dvdXQgb2YgdGhlIGZhYnJpYworICogQGxwb3J0OiBGaWJyZSBDaGFubmVsIGxvY2FsIHBvcnQgdG8gYmUgbG9nZ2VkIG91dAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9lbnRlcl9sb2dvKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfZWxzX2xvZ28gKmxvZ287CisKKwlGQ19ERUJVR19MUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIExPR08gc3RhdGUgZnJvbSAlcyBzdGF0ZVxuIiwKKwkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCksIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisKKwlmY19scG9ydF9zdGF0ZV9lbnRlcihscG9ydCwgTFBPUlRfU1RfTE9HTyk7CisKKwkvKiBETlMgc2Vzc2lvbiBzaG91bGQgYmUgY2xvc2VkIHNvIHdlIGNhbiByZWxlYXNlIGl0IGhlcmUgKi8KKwlpZiAobHBvcnQtPmRuc19ycCkKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihscG9ydC0+ZG5zX3JwKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqbG9nbykpOworCWlmICghZnApIHsKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIE5VTEwsIGZwLCBFTFNfTE9HTywgZmNfbHBvcnRfbG9nb19yZXNwLAorCQkJCSAgbHBvcnQsIGxwb3J0LT5lX2RfdG92KSkKKwkJZmNfbHBvcnRfZXJyb3IobHBvcnQsIGZwKTsKK30KKworLyoqCisgKiBmY19scG9ydF9mbG9naV9yZXNwIC0gSGFuZGxlIHJlc3BvbnNlIHRvIEZMT0dJIHJlcXVlc3QKKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiBGTE9HSSBleGNoYW5nZQorICogQGZwOiByZXNwb25zZSBmcmFtZQorICogQGxwX2FyZzogRmlicmUgQ2hhbm5lbCBscG9ydCBwb3J0IGluc3RhbmNlIHRoYXQgc2VudCB0aGUgRkxPR0kgcmVxdWVzdAorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBscG9ydCBsb2NrCisgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX2xwb3J0X2Vycm9yCisgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIGxwb3J0LgorICovCitzdGF0aWMgdm9pZCBmY19scG9ydF9mbG9naV9yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCXZvaWQgKmxwX2FyZykKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gbHBfYXJnOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscDsKKwl1MzIgZGlkOworCXUxNiBjc3BfZmxhZ3M7CisJdW5zaWduZWQgaW50IHJfYV90b3Y7CisJdW5zaWduZWQgaW50IGVfZF90b3Y7CisJdTE2IG1mczsKKworCWlmIChmcCA9PSBFUlJfUFRSKC1GQ19FWF9DTE9TRUQpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCisJRkNfREVCVUdfTFBPUlQoIlJlY2VpdmVkIGEgRkxPR0kgcmVzcG9uc2VcbiIpOworCisJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9GTE9HSSkgeworCQlGQ19EQkcoIlJlY2VpdmVkIGEgRkxPR0kgcmVzcG9uc2UsIGJ1dCBpbiBzdGF0ZSAlc1xuIiwKKwkJICAgICAgIGZjX2xwb3J0X3N0YXRlKGxwb3J0KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChJU19FUlIoZnApKSB7CisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisJCWdvdG8gZXJyOworCX0KKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJZGlkID0gbnRvaDI0KGZoLT5maF9kX2lkKTsKKwlpZiAoZmNfZnJhbWVfcGF5bG9hZF9vcChmcCkgPT0gRUxTX0xTX0FDQyAmJiBkaWQgIT0gMCkgeworCisJCUZDX0RFQlVHX0xQT1JUKCJBc3NpZ25lZCBmaWQgJXhcbiIsIGRpZCk7CisJCWZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkgPSBkaWQ7CisKKwkJZmxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxwKSk7CisJCWlmIChmbHApIHsKKwkJCW1mcyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2JiX2RhdGEpICYKKwkJCQlGQ19TUF9CQl9EQVRBX01BU0s7CisJCQlpZiAobWZzID49IEZDX1NQX01JTl9NQVhfUEFZTE9BRCAmJgorCQkJICAgIG1mcyA8IGxwb3J0LT5tZnMpCisJCQkJbHBvcnQtPm1mcyA9IG1mczsKKwkJCWNzcF9mbGFncyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2ZlYXR1cmVzKTsKKwkJCXJfYV90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9yX2FfdG92KTsKKwkJCWVfZF90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9lX2RfdG92KTsKKwkJCWlmIChjc3BfZmxhZ3MgJiBGQ19TUF9GVF9FRFRSKQorCQkJCWVfZF90b3YgLz0gMTAwMDAwMDsKKwkJCWlmICgoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRlBPUlQpID09IDApIHsKKwkJCQlpZiAoZV9kX3RvdiA+IGxwb3J0LT5lX2RfdG92KQorCQkJCQlscG9ydC0+ZV9kX3RvdiA9IGVfZF90b3Y7CisJCQkJbHBvcnQtPnJfYV90b3YgPSAyICogZV9kX3RvdjsKKwkJCQlGQ19EQkcoIlBvaW50LXRvLVBvaW50IG1vZGVcbiIpOworCQkJCWZjX2xwb3J0X3B0cF9zZXR1cChscG9ydCwgbnRvaDI0KGZoLT5maF9zX2lkKSwKKwkJCQkJCSAgIGdldF91bmFsaWduZWRfYmU2NCgKKwkJCQkJCQkgICAmZmxwLT5mbF93d3BuKSwKKwkJCQkJCSAgIGdldF91bmFsaWduZWRfYmU2NCgKKwkJCQkJCQkgICAmZmxwLT5mbF93d25uKSk7CisJCQl9IGVsc2UgeworCQkJCWxwb3J0LT5lX2RfdG92ID0gZV9kX3RvdjsKKwkJCQlscG9ydC0+cl9hX3RvdiA9IHJfYV90b3Y7CisJCQkJZmNfaG9zdF9mYWJyaWNfbmFtZShscG9ydC0+aG9zdCkgPQorCQkJCQlnZXRfdW5hbGlnbmVkX2JlNjQoJmZscC0+Zmxfd3dubik7CisJCQkJZmNfbHBvcnRfZW50ZXJfZG5zKGxwb3J0KTsKKwkJCX0KKwkJfQorCisJCWlmIChmbHApIHsKKwkJCWNzcF9mbGFncyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2ZlYXR1cmVzKTsKKwkJCWlmICgoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRlBPUlQpID09IDApIHsKKwkJCQlscG9ydC0+dHQuZGlzY19zdGFydChmY19scG9ydF9kaXNjX2NhbGxiYWNrLAorCQkJCQkJICAgICBscG9ydCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlGQ19EQkcoImJhZCBGTE9HSSByZXNwb25zZVxuIik7CisJfQorCitvdXQ6CisJZmNfZnJhbWVfZnJlZShmcCk7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworfQorCisvKioKKyAqIGZjX3Jwb3J0X2VudGVyX2Zsb2dpIC0gU2VuZCBhIEZMT0dJIHJlcXVlc3QgdG8gdGhlIGZhYnJpYyBtYW5hZ2VyCisgKiBAbHBvcnQ6IEZpYnJlIENoYW5uZWwgbG9jYWwgcG9ydCB0byBiZSBsb2dnZWQgaW4gdG8gdGhlIGZhYnJpYworICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIGxwb3J0IGxvY2sgaXMgZXhwZWN0ZWQgdG8gYmUgaGVsZCBiZWZvcmUgY2FsbGluZworICogdGhpcyByb3V0aW5lLgorICovCit2b2lkIGZjX2xwb3J0X2VudGVyX2Zsb2dpKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKworCUZDX0RFQlVHX0xQT1JUKCJQcm9jZXNzaW5nIEZMT0dJIHN0YXRlXG4iKTsKKworCWZjX2xwb3J0X3N0YXRlX2VudGVyKGxwb3J0LCBMUE9SVF9TVF9GTE9HSSk7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19mbG9naSkpOworCWlmICghZnApCisJCXJldHVybiBmY19scG9ydF9lcnJvcihscG9ydCwgZnApOworCisJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgTlVMTCwgZnAsIEVMU19GTE9HSSwKKwkJCQkgIGZjX2xwb3J0X2Zsb2dpX3Jlc3AsIGxwb3J0LCBscG9ydC0+ZV9kX3RvdikpCisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7Cit9CisKKy8qIENvbmZpZ3VyZSBhIGZjX2xwb3J0ICovCitpbnQgZmNfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJSU5JVF9ERUxBWUVEX1dPUksoJmxwb3J0LT5yZXRyeV93b3JrLCBmY19scG9ydF90aW1lb3V0KTsKKwltdXRleF9pbml0KCZscG9ydC0+bHBfbXV0ZXgpOworCisJZmNfbHBvcnRfc3RhdGVfZW50ZXIobHBvcnQsIExQT1JUX1NUX05PTkUpOworCisJZmNfbHBvcnRfYWRkX2ZjNF90eXBlKGxwb3J0LCBGQ19UWVBFX0ZDUCk7CisJZmNfbHBvcnRfYWRkX2ZjNF90eXBlKGxwb3J0LCBGQ19UWVBFX0NUKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19scG9ydF9jb25maWcpOworCitpbnQgZmNfbHBvcnRfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCWlmICghbHBvcnQtPnR0Lmxwb3J0X3JlY3YpCisJCWxwb3J0LT50dC5scG9ydF9yZWN2ID0gZmNfbHBvcnRfcmVjdl9yZXE7CisKKwlpZiAoIWxwb3J0LT50dC5scG9ydF9yZXNldCkKKwkJbHBvcnQtPnR0Lmxwb3J0X3Jlc2V0ID0gZmNfbHBvcnRfcmVzZXQ7CisKKwlmY19ob3N0X3BvcnRfdHlwZShscG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9OUE9SVDsKKwlmY19ob3N0X25vZGVfbmFtZShscG9ydC0+aG9zdCkgPSBscG9ydC0+d3dubjsKKwlmY19ob3N0X3BvcnRfbmFtZShscG9ydC0+aG9zdCkgPSBscG9ydC0+d3dwbjsKKwlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKGxwb3J0LT5ob3N0KSA9IEZDX0NPU19DTEFTUzM7CisJbWVtc2V0KGZjX2hvc3Rfc3VwcG9ydGVkX2ZjNHMobHBvcnQtPmhvc3QpLCAwLAorCSAgICAgICBzaXplb2YoZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhscG9ydC0+aG9zdCkpKTsKKwlmY19ob3N0X3N1cHBvcnRlZF9mYzRzKGxwb3J0LT5ob3N0KVsyXSA9IDE7CisJZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhscG9ydC0+aG9zdClbN10gPSAxOworCisJLyogVGhpcyB2YWx1ZSBpcyBhbHNvIHVuY2hhbmdpbmcgKi8KKwltZW1zZXQoZmNfaG9zdF9hY3RpdmVfZmM0cyhscG9ydC0+aG9zdCksIDAsCisJICAgICAgIHNpemVvZihmY19ob3N0X2FjdGl2ZV9mYzRzKGxwb3J0LT5ob3N0KSkpOworCWZjX2hvc3RfYWN0aXZlX2ZjNHMobHBvcnQtPmhvc3QpWzJdID0gMTsKKwlmY19ob3N0X2FjdGl2ZV9mYzRzKGxwb3J0LT5ob3N0KVs3XSA9IDE7CisJZmNfaG9zdF9tYXhmcmFtZV9zaXplKGxwb3J0LT5ob3N0KSA9IGxwb3J0LT5tZnM7CisJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKGxwb3J0LT5ob3N0KSA9IDA7CisJaWYgKGxwb3J0LT5saW5rX3N1cHBvcnRlZF9zcGVlZHMgJiBGQ19QT1JUU1BFRURfMUdCSVQpCisJCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhscG9ydC0+aG9zdCkgfD0gRkNfUE9SVFNQRUVEXzFHQklUOworCWlmIChscG9ydC0+bGlua19zdXBwb3J0ZWRfc3BlZWRzICYgRkNfUE9SVFNQRUVEXzEwR0JJVCkKKwkJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKGxwb3J0LT5ob3N0KSB8PSBGQ19QT1JUU1BFRURfMTBHQklUOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX2xwb3J0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzgwZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKQEAgLTAsMCArMSwxMjkxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKy8qCisgKiBSUE9SVCBHRU5FUkFMIElORk8KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHByb2Nlc3NpbmcgcmVnYXJkaW5nIGZjX3Jwb3J0cy4gSXQgY29udGFpbnMgdGhlCisgKiBycG9ydCBzdGF0ZSBtYWNoaW5lIGFuZCBkb2VzIGFsbCBycG9ydCBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0cmFuc3BvcnQgY2xhc3MuCisgKiBUaGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgcGxhY2VzIGluIGxpYmZjIHRoYXQgaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB0aGUKKyAqIHRyYW5zcG9ydCBjbGFzcyBpbiByZWdhcmRzIHRvIGFkZGluZyBhbmQgZGVsZXRpbmcgcnBvcnRzLgorICoKKyAqIGZjX3Jwb3J0J3MgcmVwcmVzZW50IE5fUG9ydCdzIHdpdGhpbiB0aGUgZmFicmljLgorICovCisKKy8qCisgKiBSUE9SVCBMT0NLSU5HCisgKgorICogVGhlIHJwb3J0IHNob3VsZCBuZXZlciBob2xkIHRoZSBycG9ydCBtdXRleCBhbmQgdGhlbiBhdHRlbXB0IHRvIGFjcXVpcmUKKyAqIGVpdGhlciB0aGUgbHBvcnQgb3IgZGlzYyBtdXRleGVzLiBUaGUgcnBvcnQncyBtdXRleCBpcyBjb25zaWRlcmVkIGxlc3NlcgorICogdGhhbiBib3RoIHRoZSBscG9ydCdzIG11dGV4IGFuZCB0aGUgZGlzYyBtdXRleC4gUmVmZXIgdG8gZmNfbHBvcnQuYyBmb3IKKyAqIG1vcmUgY29tbWVudHMgb24gdGhlIGhlaXJhcmNoeS4KKyAqCisgKiBUaGUgbG9ja2luZyBzdHJhdGVneSBpcyBzaW1pbGFyIHRvIHRoZSBscG9ydCdzIHN0cmF0ZWd5LiBUaGUgbG9jayBwcm90ZWN0cworICogdGhlIHJwb3J0J3Mgc3RhdGVzIGFuZCBpcyBoZWxkIGFuZCByZWxlYXNlZCBieSB0aGUgZW50cnkgcG9pbnRzIHRvIHRoZSBycG9ydAorICogYmxvY2suIEFsbCBfZW50ZXJfKiBmdW5jdGlvbnMgY29ycmVzcG9uZCB0byBycG9ydCBzdGF0ZXMgYW5kIGV4cGVjdCB0aGUgcnBvcnQKKyAqIG11dGV4IHRvIGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0aGVtLiBUaGlzIG1lYW5zIHRoYXQgcnBvcnRzIG9ubHkgaGFuZGxlCisgKiBvbmUgcmVxdWVzdCBvciByZXNwb25zZSBhdCBhIHRpbWUsIHNpbmNlIHRoZXkncmUgbm90IGNyaXRpY2FsIGZvciB0aGUgSS9PCisgKiBwYXRoIHRoaXMgcG90ZW50aWFsIG92ZXItdXNlIG9mIHRoZSBtdXRleCBpcyBhY2NlcHRhYmxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CisjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KKworc3RhdGljIGludCBmY19ycG9ydF9kZWJ1ZzsKKworI2RlZmluZSBGQ19ERUJVR19SUE9SVChmbXQuLi4pCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKGZjX3Jwb3J0X2RlYnVnKQkJXAorCQkJRkNfREJHKGZtdCk7CQlcCisJfSB3aGlsZSAoMCkKKworc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJwb3J0X2V2ZW50X3F1ZXVlOworCitzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9wbG9naShzdHJ1Y3QgZmNfcnBvcnQgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9wcmxpKHN0cnVjdCBmY19ycG9ydCAqKTsKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX3J0dihzdHJ1Y3QgZmNfcnBvcnQgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9yZWFkeShzdHJ1Y3QgZmNfcnBvcnQgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9lbnRlcl9sb2dvKHN0cnVjdCBmY19ycG9ydCAqKTsKKworc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEoc3RydWN0IGZjX3Jwb3J0ICosCisJCQkJICAgIHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfcnBvcnRfcmVjdl9wcmxpX3JlcShzdHJ1Y3QgZmNfcnBvcnQgKiwKKwkJCQkgICBzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqKTsKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfcHJsb19yZXEoc3RydWN0IGZjX3Jwb3J0ICosCisJCQkJICAgc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X2xvZ29fcmVxKHN0cnVjdCBmY19ycG9ydCAqLAorCQkJCSAgIHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfcnBvcnRfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBmY19ycG9ydF9lcnJvcihzdHJ1Y3QgZmNfcnBvcnQgKiwgc3RydWN0IGZjX2ZyYW1lICopOworc3RhdGljIHZvaWQgZmNfcnBvcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CisKK3N0YXRpYyBjb25zdCBjaGFyICpmY19ycG9ydF9zdGF0ZV9uYW1lc1tdID0geworCVtSUE9SVF9TVF9OT05FXSA9ICJOb25lIiwKKwlbUlBPUlRfU1RfSU5JVF0gPSAiSW5pdCIsCisJW1JQT1JUX1NUX1BMT0dJXSA9ICJQTE9HSSIsCisJW1JQT1JUX1NUX1BSTEldID0gIlBSTEkiLAorCVtSUE9SVF9TVF9SVFZdID0gIlJUViIsCisJW1JQT1JUX1NUX1JFQURZXSA9ICJSZWFkeSIsCisJW1JQT1JUX1NUX0xPR09dID0gIkxPR08iLAorfTsKKworc3RhdGljIHZvaWQgZmNfcnBvcnRfcm9ndWVfZGVzdHJveShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IGRldl90b19ycG9ydChkZXYpOworCUZDX0RFQlVHX1JQT1JUKCJEZXN0cm95aW5nIHJvZ3VlIHJwb3J0ICglNngpXG4iLCBycG9ydC0+cG9ydF9pZCk7CisJa2ZyZWUocnBvcnQpOworfQorCitzdHJ1Y3QgZmNfcnBvcnQgKmZjX3Jwb3J0X3JvZ3VlX2NyZWF0ZShzdHJ1Y3QgZmNfZGlzY19wb3J0ICpkcCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YTsKKwlycG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCpycG9ydCkgKyBzaXplb2YoKnJkYXRhKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJwb3J0KQorCQlyZXR1cm4gTlVMTDsKKworCXJkYXRhID0gUlBPUlRfVE9fUFJJVihycG9ydCk7CisKKwlycG9ydC0+ZGRfZGF0YSA9IHJkYXRhOworCXJwb3J0LT5wb3J0X2lkID0gZHAtPmlkcy5wb3J0X2lkOworCXJwb3J0LT5wb3J0X25hbWUgPSBkcC0+aWRzLnBvcnRfbmFtZTsKKwlycG9ydC0+bm9kZV9uYW1lID0gZHAtPmlkcy5ub2RlX25hbWU7CisJcnBvcnQtPnJvbGVzID0gZHAtPmlkcy5yb2xlczsKKwlycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9IEZDX01JTl9NQVhfUEFZTE9BRDsKKwkvKgorCSAqIE5vdGU6IGFsbCB0aGlzIGxpYmZjIHJvZ3VlIHJwb3J0IGNvZGUgd2lsbCBiZSByZW1vdmVkIGZvcgorCSAqIHVwc3RyZWFtIHNvIGl0IGZpbmUgdGhhdCB0aGlzIGlzIHJlYWxseSB1Z2x5IGFuZCBoYWNreSByaWdodCBub3cuCisJICovCisJZGV2aWNlX2luaXRpYWxpemUoJnJwb3J0LT5kZXYpOworCXJwb3J0LT5kZXYucmVsZWFzZSA9IGZjX3Jwb3J0X3JvZ3VlX2Rlc3Ryb3k7CisKKwltdXRleF9pbml0KCZyZGF0YS0+cnBfbXV0ZXgpOworCXJkYXRhLT5sb2NhbF9wb3J0ID0gZHAtPmxwOworCXJkYXRhLT50cmFuc19zdGF0ZSA9IEZDX1BPUlRTVEFURV9ST0dVRTsKKwlyZGF0YS0+cnBfc3RhdGUgPSBSUE9SVF9TVF9JTklUOworCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX05PTkU7CisJcmRhdGEtPmZsYWdzID0gRkNfUlBfRkxBR1NfUkVDX1NVUFBPUlRFRDsKKwlyZGF0YS0+b3BzID0gTlVMTDsKKwlyZGF0YS0+ZV9kX3RvdiA9IGRwLT5scC0+ZV9kX3RvdjsKKwlyZGF0YS0+cl9hX3RvdiA9IGRwLT5scC0+cl9hX3RvdjsKKwlJTklUX0RFTEFZRURfV09SSygmcmRhdGEtPnJldHJ5X3dvcmssIGZjX3Jwb3J0X3RpbWVvdXQpOworCUlOSVRfV09SSygmcmRhdGEtPmV2ZW50X3dvcmssIGZjX3Jwb3J0X3dvcmspOworCS8qCisJICogRm9yIGdvb2QgbWVhc3VyZSwgYnV0IG5vdCBuZWNlc3NhcnkgYXMgd2Ugc2hvdWxkIG9ubHkKKwkgKiBhZGQgUkVBTCBycG9ydCB0byB0aGUgbHBvcnQgbGlzdC4KKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcmRhdGEtPnBlZXJzKTsKKworCXJldHVybiBycG9ydDsKK30KKworLyoqCisgKiBmY19ycG9ydF9zdGF0ZSAtIHJldHVybiBhIHN0cmluZyBmb3IgdGhlIHN0YXRlIHRoZSBycG9ydCBpcyBpbgorICogQHJwb3J0OiBUaGUgcnBvcnQgd2hvc2Ugc3RhdGUgd2Ugd2FudCB0byBnZXQgYSBzdHJpbmcgZm9yCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpmY19ycG9ydF9zdGF0ZShzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQoreworCWNvbnN0IGNoYXIgKmNwOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCisJY3AgPSBmY19ycG9ydF9zdGF0ZV9uYW1lc1tyZGF0YS0+cnBfc3RhdGVdOworCWlmICghY3ApCisJCWNwID0gIlVua25vd24iOworCXJldHVybiBjcDsKK30KKworLyoqCisgKiBmY19zZXRfcnBvcnRfbG9zc190bW8gLSBTZXQgdGhlIHJlbW90ZSBwb3J0IGxvc3MgdGltZW91dCBpbiBzZWNvbmRzLgorICogQHJwb3J0OiBQb2ludGVyIHRvIEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgc3RydWN0dXJlCisgKiBAdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzCisgKi8KK3ZvaWQgZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHUzMiB0aW1lb3V0KQoreworCWlmICh0aW1lb3V0KQorCQlycG9ydC0+ZGV2X2xvc3NfdG1vID0gdGltZW91dCArIDU7CisJZWxzZQorCQlycG9ydC0+ZGV2X2xvc3NfdG1vID0gMzA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3NldF9ycG9ydF9sb3NzX3Rtbyk7CisKKy8qKgorICogZmNfcGxvZ2lfZ2V0X21heGZyYW1lIC0gR2V0IG1heCBwYXlsb2FkIGZyb20gdGhlIGNvbW1vbiBzZXJ2aWNlIHBhcmFtZXRlcnMKKyAqIEBmbHA6IEZMT0dJIHBheWxvYWQgc3RydWN0dXJlCisgKiBAbWF4dmFsOiB1cHBlciBsaW1pdCwgbWF5IGJlIGxlc3MgdGhhbiB3aGF0IGlzIGluIHRoZSBzZXJ2aWNlIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZmNfcGxvZ2lfZ2V0X21heGZyYW1lKHN0cnVjdCBmY19lbHNfZmxvZ2kgKmZscCwgdW5zaWduZWQgaW50IG1heHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWZzOworCisJLyoKKwkgKiBHZXQgbWF4IHBheWxvYWQgZnJvbSB0aGUgY29tbW9uIHNlcnZpY2UgcGFyYW1ldGVycyBhbmQgdGhlCisJICogY2xhc3MgMyByZWNlaXZlIGRhdGEgZmllbGQgc2l6ZS4KKwkgKi8KKwltZnMgPSBudG9ocyhmbHAtPmZsX2NzcC5zcF9iYl9kYXRhKSAmIEZDX1NQX0JCX0RBVEFfTUFTSzsKKwlpZiAobWZzID49IEZDX1NQX01JTl9NQVhfUEFZTE9BRCAmJiBtZnMgPCBtYXh2YWwpCisJCW1heHZhbCA9IG1mczsKKwltZnMgPSBudG9ocyhmbHAtPmZsX2Nzc3BbMyAtIDFdLmNwX3JkZnMpOworCWlmIChtZnMgPj0gRkNfU1BfTUlOX01BWF9QQVlMT0FEICYmIG1mcyA8IG1heHZhbCkKKwkJbWF4dmFsID0gbWZzOworCXJldHVybiBtYXh2YWw7Cit9CisKKy8qKgorICogZmNfcnBvcnRfc3RhdGVfZW50ZXIgLSBDaGFuZ2UgdGhlIHJwb3J0J3Mgc3RhdGUKKyAqIEBycG9ydDogVGhlIHJwb3J0IHdob3NlIHN0YXRlIHNob3VsZCBjaGFuZ2UKKyAqIEBuZXc6IFRoZSBuZXcgc3RhdGUgb2YgdGhlIHJwb3J0CisgKgorICogTG9ja2luZyBOb3RlOiBDYWxsZWQgd2l0aCB0aGUgcnBvcnQgbG9jayBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3N0YXRlX2VudGVyKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsCisJCQkJIGVudW0gZmNfcnBvcnRfc3RhdGUgbmV3KQoreworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCWlmIChyZGF0YS0+cnBfc3RhdGUgIT0gbmV3KQorCQlyZGF0YS0+cmV0cmllcyA9IDA7CisJcmRhdGEtPnJwX3N0YXRlID0gbmV3OworfQorCitzdGF0aWMgdm9pZCBmY19ycG9ydF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYsIGV2ZW50X3dvcmspOworCWVudW0gZmNfcnBvcnRfZXZlbnQgZXZlbnQ7CisJZW51bSBmY19ycG9ydF90cmFuc19zdGF0ZSB0cmFuc19zdGF0ZTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGZjX3Jwb3J0X29wZXJhdGlvbnMgKnJwb3J0X29wczsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gUFJJVl9UT19SUE9SVChyZGF0YSk7CisKKwltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCWV2ZW50ID0gcmRhdGEtPmV2ZW50OworCXJwb3J0X29wcyA9IHJkYXRhLT5vcHM7CisKKwlpZiAoZXZlbnQgPT0gUlBPUlRfRVZfQ1JFQVRFRCkgeworCQlzdHJ1Y3QgZmNfcnBvcnQgKm5ld19ycG9ydDsKKwkJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKm5ld19yZGF0YTsKKwkJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIGlkczsKKworCQlpZHMucG9ydF9pZCA9IHJwb3J0LT5wb3J0X2lkOworCQlpZHMucm9sZXMgPSBycG9ydC0+cm9sZXM7CisJCWlkcy5wb3J0X25hbWUgPSBycG9ydC0+cG9ydF9uYW1lOworCQlpZHMubm9kZV9uYW1lID0gcnBvcnQtPm5vZGVfbmFtZTsKKworCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwkJbmV3X3Jwb3J0ID0gZmNfcmVtb3RlX3BvcnRfYWRkKGxwb3J0LT5ob3N0LCAwLCAmaWRzKTsKKwkJaWYgKG5ld19ycG9ydCkgeworCQkJLyoKKwkJCSAqIFN3aXRjaCBmcm9tIHRoZSByb2d1ZSBycG9ydCB0byB0aGUgcnBvcnQKKwkJCSAqIHJldHVybmVkIGJ5IHRoZSBGQyBjbGFzcy4KKwkJCSAqLworCQkJbmV3X3Jwb3J0LT5tYXhmcmFtZV9zaXplID0gcnBvcnQtPm1heGZyYW1lX3NpemU7CisKKwkJCW5ld19yZGF0YSA9IG5ld19ycG9ydC0+ZGRfZGF0YTsKKwkJCW5ld19yZGF0YS0+ZV9kX3RvdiA9IHJkYXRhLT5lX2RfdG92OworCQkJbmV3X3JkYXRhLT5yX2FfdG92ID0gcmRhdGEtPnJfYV90b3Y7CisJCQluZXdfcmRhdGEtPm9wcyA9IHJkYXRhLT5vcHM7CisJCQluZXdfcmRhdGEtPmxvY2FsX3BvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKKwkJCW5ld19yZGF0YS0+ZmxhZ3MgPSBGQ19SUF9GTEFHU19SRUNfU1VQUE9SVEVEOworCQkJbmV3X3JkYXRhLT50cmFuc19zdGF0ZSA9IEZDX1BPUlRTVEFURV9SRUFMOworCQkJbXV0ZXhfaW5pdCgmbmV3X3JkYXRhLT5ycF9tdXRleCk7CisJCQlJTklUX0RFTEFZRURfV09SSygmbmV3X3JkYXRhLT5yZXRyeV93b3JrLAorCQkJCQkgIGZjX3Jwb3J0X3RpbWVvdXQpOworCQkJSU5JVF9MSVNUX0hFQUQoJm5ld19yZGF0YS0+cGVlcnMpOworCQkJSU5JVF9XT1JLKCZuZXdfcmRhdGEtPmV2ZW50X3dvcmssIGZjX3Jwb3J0X3dvcmspOworCisJCQlmY19ycG9ydF9zdGF0ZV9lbnRlcihuZXdfcnBvcnQsIFJQT1JUX1NUX1JFQURZKTsKKwkJfSBlbHNlIHsKKwkJCUZDX0RCRygiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgcnBvcnQgZm9yIHBvcnQgIgorCQkJICAgICAgICIoJTZ4KS5cbiIsIGlkcy5wb3J0X2lkKTsKKwkJCWV2ZW50ID0gUlBPUlRfRVZfRkFJTEVEOworCQl9CisJCXB1dF9kZXZpY2UoJnJwb3J0LT5kZXYpOworCQlycG9ydCA9IG5ld19ycG9ydDsKKwkJcmRhdGEgPSBuZXdfcnBvcnQtPmRkX2RhdGE7CisJCWlmIChycG9ydF9vcHMtPmV2ZW50X2NhbGxiYWNrKQorCQkJcnBvcnRfb3BzLT5ldmVudF9jYWxsYmFjayhscG9ydCwgcnBvcnQsIGV2ZW50KTsKKwl9IGVsc2UgaWYgKChldmVudCA9PSBSUE9SVF9FVl9GQUlMRUQpIHx8CisJCSAgIChldmVudCA9PSBSUE9SVF9FVl9MT0dPKSB8fAorCQkgICAoZXZlbnQgPT0gUlBPUlRfRVZfU1RPUCkpIHsKKwkJdHJhbnNfc3RhdGUgPSByZGF0YS0+dHJhbnNfc3RhdGU7CisJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKwkJaWYgKHJwb3J0X29wcy0+ZXZlbnRfY2FsbGJhY2spCisJCQlycG9ydF9vcHMtPmV2ZW50X2NhbGxiYWNrKGxwb3J0LCBycG9ydCwgZXZlbnQpOworCQlpZiAodHJhbnNfc3RhdGUgPT0gRkNfUE9SVFNUQVRFX1JPR1VFKQorCQkJcHV0X2RldmljZSgmcnBvcnQtPmRldik7CisJCWVsc2UKKwkJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShycG9ydCk7CisJfSBlbHNlCisJCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKK30KKworLyoqCisgKiBmY19ycG9ydF9sb2dpbiAtIFN0YXJ0IHRoZSByZW1vdGUgcG9ydCBsb2dpbiBzdGF0ZSBtYWNoaW5lCisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQKKyAqCisgKiBMb2NraW5nIE5vdGU6IENhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrIGhlbGQuIFRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgaG9sZCB0aGUgcnBvcnQgbG9jaywgY2FsbCBhbiBfZW50ZXJfKgorICogZnVuY3Rpb24gYW5kIHRoZW4gdW5sb2NrIHRoZSBycG9ydC4KKyAqLworaW50IGZjX3Jwb3J0X2xvZ2luKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisKKwltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCisJRkNfREVCVUdfUlBPUlQoIkxvZ2luIHRvIHBvcnQgKCU2eClcbiIsIHJwb3J0LT5wb3J0X2lkKTsKKworCWZjX3Jwb3J0X2VudGVyX3Bsb2dpKHJwb3J0KTsKKworCW11dGV4X3VubG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZjX3Jwb3J0X2xvZ29mZiAtIExvZ29mZiBhbmQgcmVtb3ZlIGFuIHJwb3J0CisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdG8gYmUgcmVtb3ZlZAorICoKKyAqIExvY2tpbmcgTm90ZTogQ2FsbGVkIHdpdGhvdXQgdGhlIHJwb3J0IGxvY2sgaGVsZC4gVGhpcworICogZnVuY3Rpb24gd2lsbCBob2xkIHRoZSBycG9ydCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qCisgKiBmdW5jdGlvbiBhbmQgdGhlbiB1bmxvY2sgdGhlIHJwb3J0LgorICovCitpbnQgZmNfcnBvcnRfbG9nb2ZmKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisKKwltdXRleF9sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCisJRkNfREVCVUdfUlBPUlQoIlJlbW92ZSBwb3J0ICglNngpXG4iLCBycG9ydC0+cG9ydF9pZCk7CisKKwlmY19ycG9ydF9lbnRlcl9sb2dvKHJwb3J0KTsKKworCS8qCisJICogQ2hhbmdlIHRoZSBzdGF0ZSB0byBOT05FIHNvIHRoYXQgd2UgZGlzY2FyZAorCSAqIHRoZSByZXNwb25zZS4KKwkgKi8KKwlmY19ycG9ydF9zdGF0ZV9lbnRlcihycG9ydCwgUlBPUlRfU1RfTk9ORSk7CisKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkYXRhLT5yZXRyeV93b3JrKTsKKworCW11dGV4X2xvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwlyZGF0YS0+ZXZlbnQgPSBSUE9SVF9FVl9TVE9QOworCXF1ZXVlX3dvcmsocnBvcnRfZXZlbnRfcXVldWUsICZyZGF0YS0+ZXZlbnRfd29yayk7CisKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmY19ycG9ydF9lbnRlcl9yZWFkeSAtIFRoZSBycG9ydCBpcyByZWFkeQorICogQHJwb3J0OiBGaWJyZSBDaGFubmVsIHJlbW90ZSBwb3J0IHRoYXQgaXMgcmVhZHkKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfZW50ZXJfcmVhZHkoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKworCWZjX3Jwb3J0X3N0YXRlX2VudGVyKHJwb3J0LCBSUE9SVF9TVF9SRUFEWSk7CisKKwlGQ19ERUJVR19SUE9SVCgiUG9ydCAoJTZ4KSBpcyBSZWFkeVxuIiwgcnBvcnQtPnBvcnRfaWQpOworCisJcmRhdGEtPmV2ZW50ID0gUlBPUlRfRVZfQ1JFQVRFRDsKKwlxdWV1ZV93b3JrKHJwb3J0X2V2ZW50X3F1ZXVlLCAmcmRhdGEtPmV2ZW50X3dvcmspOworfQorCisvKioKKyAqIGZjX3Jwb3J0X3RpbWVvdXQgLSBIYW5kbGVyIGZvciB0aGUgcmV0cnlfd29yayB0aW1lci4KKyAqIEB3b3JrOiBUaGUgd29yayBzdHJ1Y3Qgb2YgdGhlIGZjX3Jwb3J0X2xpYmZjX3ByaXYKKyAqCisgKiBMb2NraW5nIE5vdGU6IENhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrIGhlbGQuIFRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgaG9sZCB0aGUgcnBvcnQgbG9jaywgY2FsbCBhbiBfZW50ZXJfKgorICogZnVuY3Rpb24gYW5kIHRoZW4gdW5sb2NrIHRoZSBycG9ydC4KKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2LCByZXRyeV93b3JrLndvcmspOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBQUklWX1RPX1JQT1JUKHJkYXRhKTsKKworCW11dGV4X2xvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwlzd2l0Y2ggKHJkYXRhLT5ycF9zdGF0ZSkgeworCWNhc2UgUlBPUlRfU1RfUExPR0k6CisJCWZjX3Jwb3J0X2VudGVyX3Bsb2dpKHJwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9QUkxJOgorCQlmY19ycG9ydF9lbnRlcl9wcmxpKHJwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9SVFY6CisJCWZjX3Jwb3J0X2VudGVyX3J0dihycG9ydCk7CisJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfTE9HTzoKKwkJZmNfcnBvcnRfZW50ZXJfbG9nbyhycG9ydCk7CisJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfUkVBRFk6CisJY2FzZSBSUE9SVF9TVF9JTklUOgorCWNhc2UgUlBPUlRfU1RfTk9ORToKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyZGF0YS0+cnBfbXV0ZXgpOworCXB1dF9kZXZpY2UoJnJwb3J0LT5kZXYpOworfQorCisvKioKKyAqIGZjX3Jwb3J0X2Vycm9yIC0gSGFuZGxlciBmb3IgYW55IGVycm9ycworICogQHJwb3J0OiBUaGUgZmNfcnBvcnQgb2JqZWN0CisgKiBAZnA6IFRoZSBmcmFtZSBwb2ludGVyCisgKgorICogSWYgdGhlIGVycm9yIHdhcyBjYXVzZWQgYnkgYSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmUKKyAqIHRoZW4gd2FpdCBmb3IgaGFsZiBhIHNlY29uZCBhbmQgcmV0cnksIG90aGVyd2lzZSByZXRyeQorICogaW1tZWRpYXRlbHkuCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZQorICogY2FsbGluZyB0aGlzIHJvdXRpbmUKKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfZXJyb3Ioc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCUZDX0RFQlVHX1JQT1JUKCJFcnJvciAlbGQgaW4gc3RhdGUgJXMsIHJldHJpZXMgJWRcbiIsCisJCSAgICAgICBQVFJfRVJSKGZwKSwgZmNfcnBvcnRfc3RhdGUocnBvcnQpLCByZGF0YS0+cmV0cmllcyk7CisKKwlpZiAoIWZwIHx8IFBUUl9FUlIoZnApID09IC1GQ19FWF9USU1FT1VUKSB7CisJCS8qCisJCSAqIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yIHRoZSBleGNoYW5nZSB0aW1lZCBvdXQuCisJCSAqICBSZXRyeSBhZnRlciBkZWxheQorCQkgKi8KKwkJaWYgKHJkYXRhLT5yZXRyaWVzIDwgcmRhdGEtPmxvY2FsX3BvcnQtPm1heF9yZXRyeV9jb3VudCkgeworCQkJcmRhdGEtPnJldHJpZXMrKzsKKwkJCWlmICghZnApCisJCQkJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJCQlnZXRfZGV2aWNlKCZycG9ydC0+ZGV2KTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRhdGEtPnJldHJ5X3dvcmssIGRlbGF5KTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAocmRhdGEtPnJwX3N0YXRlKSB7CisJCQljYXNlIFJQT1JUX1NUX1BMT0dJOgorCQkJY2FzZSBSUE9SVF9TVF9QUkxJOgorCQkJY2FzZSBSUE9SVF9TVF9MT0dPOgorCQkJCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX0ZBSUxFRDsKKwkJCQlxdWV1ZV93b3JrKHJwb3J0X2V2ZW50X3F1ZXVlLAorCQkJCQkgICAmcmRhdGEtPmV2ZW50X3dvcmspOworCQkJCWJyZWFrOworCQkJY2FzZSBSUE9SVF9TVF9SVFY6CisJCQkJZmNfcnBvcnRfZW50ZXJfcmVhZHkocnBvcnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSUE9SVF9TVF9OT05FOgorCQkJY2FzZSBSUE9SVF9TVF9SRUFEWToKKwkJCWNhc2UgUlBPUlRfU1RfSU5JVDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBmY19ycG9ydF9wbG9naV9yZWN2X3Jlc3AgLSBIYW5kbGUgaW5jb21pbmcgRUxTIFBMT0dJIHJlc3BvbnNlCisgKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIFBMT0dJIGV4Y2hhbmdlCisgKiBAZnA6IHJlc3BvbnNlIGZyYW1lCisgKiBAcnBfYXJnOiBGaWJyZSBDaGFubmVsIHJlbW90ZSBwb3J0CisgKgorICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHJwb3J0IGxvY2sKKyAqIGhlbGQsIGJ1dCBpdCB3aWxsIGxvY2ssIGNhbGwgYW4gX2VudGVyXyogZnVuY3Rpb24gb3IgZmNfcnBvcnRfZXJyb3IKKyAqIGFuZCB0aGVuIHVubG9jayB0aGUgcnBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3Bsb2dpX3Jlc3Aoc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJdm9pZCAqcnBfYXJnKQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBycF9hcmc7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCXN0cnVjdCBmY19lbHNfZmxvZ2kgKnBscDsKKwl1bnNpZ25lZCBpbnQgdG92OworCXUxNiBjc3Bfc2VxOworCXUxNiBjc3NwX3NlcTsKKwl1OCBvcDsKKworCW11dGV4X2xvY2soJnJkYXRhLT5ycF9tdXRleCk7CisKKwlGQ19ERUJVR19SUE9SVCgiUmVjZWl2ZWQgYSBQTE9HSSByZXNwb25zZSBmcm9tIHBvcnQgKCU2eClcbiIsCisJCSAgICAgICBycG9ydC0+cG9ydF9pZCk7CisKKwlpZiAocmRhdGEtPnJwX3N0YXRlICE9IFJQT1JUX1NUX1BMT0dJKSB7CisJCUZDX0RCRygiUmVjZWl2ZWQgYSBQTE9HSSByZXNwb25zZSwgYnV0IGluIHN0YXRlICVzXG4iLAorCQkgICAgICAgZmNfcnBvcnRfc3RhdGUocnBvcnQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKElTX0VSUihmcCkpIHsKKwkJZmNfcnBvcnRfZXJyb3IocnBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJb3AgPSBmY19mcmFtZV9wYXlsb2FkX29wKGZwKTsKKwlpZiAob3AgPT0gRUxTX0xTX0FDQyAmJgorCSAgICAocGxwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcGxwKSkpICE9IE5VTEwpIHsKKwkJcnBvcnQtPnBvcnRfbmFtZSA9IGdldF91bmFsaWduZWRfYmU2NCgmcGxwLT5mbF93d3BuKTsKKwkJcnBvcnQtPm5vZGVfbmFtZSA9IGdldF91bmFsaWduZWRfYmU2NCgmcGxwLT5mbF93d25uKTsKKworCQl0b3YgPSBudG9obChwbHAtPmZsX2NzcC5zcF9lX2RfdG92KTsKKwkJaWYgKG50b2hzKHBscC0+ZmxfY3NwLnNwX2ZlYXR1cmVzKSAmIEZDX1NQX0ZUX0VEVFIpCisJCQl0b3YgLz0gMTAwMDsKKwkJaWYgKHRvdiA+IHJkYXRhLT5lX2RfdG92KQorCQkJcmRhdGEtPmVfZF90b3YgPSB0b3Y7CisJCWNzcF9zZXEgPSBudG9ocyhwbHAtPmZsX2NzcC5zcF90b3Rfc2VxKTsKKwkJY3NzcF9zZXEgPSBudG9ocyhwbHAtPmZsX2Nzc3BbMyAtIDFdLmNwX2Nvbl9zZXEpOworCQlpZiAoY3NzcF9zZXEgPCBjc3Bfc2VxKQorCQkJY3NwX3NlcSA9IGNzc3Bfc2VxOworCQlyZGF0YS0+bWF4X3NlcSA9IGNzcF9zZXE7CisJCXJwb3J0LT5tYXhmcmFtZV9zaXplID0KKwkJCWZjX3Bsb2dpX2dldF9tYXhmcmFtZShwbHAsIGxwb3J0LT5tZnMpOworCisJCS8qCisJCSAqIElmIHRoZSBycG9ydCBpcyBvbmUgb2YgdGhlIHdlbGwga25vd24gYWRkcmVzc2VzCisJCSAqIHdlIHNraXAgUFJMSSBhbmQgUlRWIGFuZCBnbyBzdHJhaWdodCB0byBSRUFEWS4KKwkJICovCisJCWlmIChycG9ydC0+cG9ydF9pZCA+PSBGQ19GSURfRE9NX01HUikKKwkJCWZjX3Jwb3J0X2VudGVyX3JlYWR5KHJwb3J0KTsKKwkJZWxzZQorCQkJZmNfcnBvcnRfZW50ZXJfcHJsaShycG9ydCk7CisJfSBlbHNlCisJCWZjX3Jwb3J0X2Vycm9yKHJwb3J0LCBmcCk7CisKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJcHV0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfcGxvZ2kgLSBTZW5kIFBvcnQgTG9naW4gKFBMT0dJKSByZXF1ZXN0IHRvIHBlZXIKKyAqIEBycG9ydDogRmlicmUgQ2hhbm5lbCByZW1vdGUgcG9ydCB0byBzZW5kIFBMT0dJIHRvCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX3Bsb2dpKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisKKwlGQ19ERUJVR19SUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIFBMT0dJIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJCSAgICAgICBycG9ydC0+cG9ydF9pZCwgZmNfcnBvcnRfc3RhdGUocnBvcnQpKTsKKworCWZjX3Jwb3J0X3N0YXRlX2VudGVyKHJwb3J0LCBSUE9SVF9TVF9QTE9HSSk7CisKKwlycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9IEZDX01JTl9NQVhfUEFZTE9BRDsKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2Yoc3RydWN0IGZjX2Vsc19mbG9naSkpOworCWlmICghZnApIHsKKwkJZmNfcnBvcnRfZXJyb3IocnBvcnQsIGZwKTsKKwkJcmV0dXJuOworCX0KKwlyZGF0YS0+ZV9kX3RvdiA9IGxwb3J0LT5lX2RfdG92OworCisJaWYgKCFscG9ydC0+dHQuZWxzY3Rfc2VuZChscG9ydCwgcnBvcnQsIGZwLCBFTFNfUExPR0ksCisJCQkJICBmY19ycG9ydF9wbG9naV9yZXNwLCBycG9ydCwgbHBvcnQtPmVfZF90b3YpKQorCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCWVsc2UKKwkJZ2V0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfcHJsaV9yZXNwIC0gUHJvY2VzcyBMb2dpbiAoUFJMSSkgcmVzcG9uc2UgaGFuZGxlcgorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBQUkxJIGV4Y2hhbmdlCisgKiBAZnA6IHJlc3BvbnNlIGZyYW1lCisgKiBAcnBfYXJnOiBGaWJyZSBDaGFubmVsIHJlbW90ZSBwb3J0CisgKgorICogTG9ja2luZyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHJwb3J0IGxvY2sKKyAqIGhlbGQsIGJ1dCBpdCB3aWxsIGxvY2ssIGNhbGwgYW4gX2VudGVyXyogZnVuY3Rpb24gb3IgZmNfcnBvcnRfZXJyb3IKKyAqIGFuZCB0aGVuIHVubG9jayB0aGUgcnBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3BybGlfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgICB2b2lkICpycF9hcmcpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHJwX2FyZzsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZmNfZWxzX3BybGkgcHJsaTsKKwkJc3RydWN0IGZjX2Vsc19zcHAgc3BwOworCX0gKnBwOworCXUzMiByb2xlcyA9IEZDX1JQT1JUX1JPTEVfVU5LTk9XTjsKKwl1MzIgZmNwX3Bhcm0gPSAwOworCXU4IG9wOworCisJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCUZDX0RFQlVHX1JQT1JUKCJSZWNlaXZlZCBhIFBSTEkgcmVzcG9uc2UgZnJvbSBwb3J0ICglNngpXG4iLAorCQkgICAgICAgcnBvcnQtPnBvcnRfaWQpOworCisJaWYgKHJkYXRhLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9QUkxJKSB7CisJCUZDX0RCRygiUmVjZWl2ZWQgYSBQUkxJIHJlc3BvbnNlLCBidXQgaW4gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19ycG9ydF9zdGF0ZShycG9ydCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCQlnb3RvIGVycjsKKwl9CisKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDKSB7CisJCXBwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcHApKTsKKwkJaWYgKHBwICYmIHBwLT5wcmxpLnBybGlfc3BwX2xlbiA+PSBzaXplb2YocHAtPnNwcCkpIHsKKwkJCWZjcF9wYXJtID0gbnRvaGwocHAtPnNwcC5zcHBfcGFyYW1zKTsKKwkJCWlmIChmY3BfcGFybSAmIEZDUF9TUFBGX1JFVFJZKQorCQkJCXJkYXRhLT5mbGFncyB8PSBGQ19SUF9GTEFHU19SRVRSWTsKKwkJfQorCisJCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19DTEFTUzM7CisJCWlmIChmY3BfcGFybSAmIEZDUF9TUFBGX0lOSVRfRkNOKQorCQkJcm9sZXMgfD0gRkNfUlBPUlRfUk9MRV9GQ1BfSU5JVElBVE9SOworCQlpZiAoZmNwX3Bhcm0gJiBGQ1BfU1BQRl9UQVJHX0ZDTikKKwkJCXJvbGVzIHw9IEZDX1JQT1JUX1JPTEVfRkNQX1RBUkdFVDsKKworCQlycG9ydC0+cm9sZXMgPSByb2xlczsKKwkJZmNfcnBvcnRfZW50ZXJfcnR2KHJwb3J0KTsKKworCX0gZWxzZSB7CisJCUZDX0RCRygiQmFkIEVMUyByZXNwb25zZVxuIik7CisJCXJkYXRhLT5ldmVudCA9IFJQT1JUX0VWX0ZBSUxFRDsKKwkJcXVldWVfd29yayhycG9ydF9ldmVudF9xdWV1ZSwgJnJkYXRhLT5ldmVudF93b3JrKTsKKwl9CisKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJcHV0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfbG9nb19yZXNwIC0gTG9nb3V0IChMT0dPKSByZXNwb25zZSBoYW5kbGVyCisgKiBAc3A6IGN1cnJlbnQgc2VxdWVuY2UgaW4gdGhlIExPR08gZXhjaGFuZ2UKKyAqIEBmcDogcmVzcG9uc2UgZnJhbWUKKyAqIEBycF9hcmc6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQKKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgcnBvcnQgbG9jaworICogaGVsZCwgYnV0IGl0IHdpbGwgbG9jaywgY2FsbCBhbiBfZW50ZXJfKiBmdW5jdGlvbiBvciBmY19ycG9ydF9lcnJvcgorICogYW5kIHRoZW4gdW5sb2NrIHRoZSBycG9ydC4KKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfbG9nb19yZXNwKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJICAgICAgIHZvaWQgKnJwX2FyZykKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcnBfYXJnOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCXU4IG9wOworCisJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCUZDX0RFQlVHX1JQT1JUKCJSZWNlaXZlZCBhIExPR08gcmVzcG9uc2UgZnJvbSBwb3J0ICglNngpXG4iLAorCQkgICAgICAgcnBvcnQtPnBvcnRfaWQpOworCisJaWYgKElTX0VSUihmcCkpIHsKKwkJZmNfcnBvcnRfZXJyb3IocnBvcnQsIGZwKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHJkYXRhLT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9MT0dPKSB7CisJCUZDX0RFQlVHX1JQT1JUKCJSZWNlaXZlZCBhIExPR08gcmVzcG9uc2UsIGJ1dCBpbiBzdGF0ZSAlc1xuIiwKKwkJCSAgICAgICBmY19ycG9ydF9zdGF0ZShycG9ydCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDKSB7CisJCWZjX3Jwb3J0X2VudGVyX3J0dihycG9ydCk7CisJfSBlbHNlIHsKKwkJRkNfREJHKCJCYWQgRUxTIHJlc3BvbnNlXG4iKTsKKwkJcmRhdGEtPmV2ZW50ID0gUlBPUlRfRVZfTE9HTzsKKwkJcXVldWVfd29yayhycG9ydF9ldmVudF9xdWV1ZSwgJnJkYXRhLT5ldmVudF93b3JrKTsKKwl9CisKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJcHV0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfcHJsaSAtIFNlbmQgUHJvY2VzcyBMb2dpbiAoUFJMSSkgcmVxdWVzdCB0byBwZWVyCisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdG8gc2VuZCBQUkxJIHRvCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleHBlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2VudGVyX3BybGkoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IHsKKwkJc3RydWN0IGZjX2Vsc19wcmxpIHBybGk7CisJCXN0cnVjdCBmY19lbHNfc3BwIHNwcDsKKwl9ICpwcDsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCisJRkNfREVCVUdfUlBPUlQoIlBvcnQgKCU2eCkgZW50ZXJlZCBQUkxJIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJCSAgICAgICBycG9ydC0+cG9ydF9pZCwgZmNfcnBvcnRfc3RhdGUocnBvcnQpKTsKKworCWZjX3Jwb3J0X3N0YXRlX2VudGVyKHJwb3J0LCBSUE9SVF9TVF9QUkxJKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqcHApKTsKKwlpZiAoIWZwKSB7CisJCWZjX3Jwb3J0X2Vycm9yKHJwb3J0LCBmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBycG9ydCwgZnAsIEVMU19QUkxJLAorCQkJCSAgZmNfcnBvcnRfcHJsaV9yZXNwLCBycG9ydCwgbHBvcnQtPmVfZF90b3YpKQorCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCWVsc2UKKwkJZ2V0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZWxzX3J0dl9yZXNwIC0gUmVxdWVzdCBUaW1lb3V0IFZhbHVlIHJlc3BvbnNlIGhhbmRsZXIKKyAqIEBzcDogY3VycmVudCBzZXF1ZW5jZSBpbiB0aGUgUlRWIGV4Y2hhbmdlCisgKiBAZnA6IHJlc3BvbnNlIGZyYW1lCisgKiBAcnBfYXJnOiBGaWJyZSBDaGFubmVsIHJlbW90ZSBwb3J0CisgKgorICogTWFueSB0YXJnZXRzIGRvbid0IHNlZW0gdG8gc3VwcG9ydCB0aGlzLgorICoKKyAqIExvY2tpbmcgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBycG9ydCBsb2NrCisgKiBoZWxkLCBidXQgaXQgd2lsbCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qIGZ1bmN0aW9uIG9yIGZjX3Jwb3J0X2Vycm9yCisgKiBhbmQgdGhlbiB1bmxvY2sgdGhlIHJwb3J0LgorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9ydHZfcmVzcChzdHJ1Y3QgZmNfc2VxICpzcCwgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCSAgICAgIHZvaWQgKnJwX2FyZykKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcnBfYXJnOworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCXU4IG9wOworCisJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCUZDX0RFQlVHX1JQT1JUKCJSZWNlaXZlZCBhIFJUViByZXNwb25zZSBmcm9tIHBvcnQgKCU2eClcbiIsCisJCSAgICAgICBycG9ydC0+cG9ydF9pZCk7CisKKwlpZiAocmRhdGEtPnJwX3N0YXRlICE9IFJQT1JUX1NUX1JUVikgeworCQlGQ19EQkcoIlJlY2VpdmVkIGEgUlRWIHJlc3BvbnNlLCBidXQgaW4gc3RhdGUgJXNcbiIsCisJCSAgICAgICBmY19ycG9ydF9zdGF0ZShycG9ydCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVNfRVJSKGZwKSkgeworCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCQlnb3RvIGVycjsKKwl9CisKKwlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcCA9PSBFTFNfTFNfQUNDKSB7CisJCXN0cnVjdCBmY19lbHNfcnR2X2FjYyAqcnR2OworCQl1MzIgdG9xOworCQl1MzIgdG92OworCisJCXJ0diA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJ0dikpOworCQlpZiAocnR2KSB7CisJCQl0b3EgPSBudG9obChydHYtPnJ0dl90b3EpOworCQkJdG92ID0gbnRvaGwocnR2LT5ydHZfcl9hX3Rvdik7CisJCQlpZiAodG92ID09IDApCisJCQkJdG92ID0gMTsKKwkJCXJkYXRhLT5yX2FfdG92ID0gdG92OworCQkJdG92ID0gbnRvaGwocnR2LT5ydHZfZV9kX3Rvdik7CisJCQlpZiAodG9xICYgRkNfRUxTX1JUVl9FRFJFUykKKwkJCQl0b3YgLz0gMTAwMDAwMDsKKwkJCWlmICh0b3YgPT0gMCkKKwkJCQl0b3YgPSAxOworCQkJcmRhdGEtPmVfZF90b3YgPSB0b3Y7CisJCX0KKwl9CisKKwlmY19ycG9ydF9lbnRlcl9yZWFkeShycG9ydCk7CisKK291dDoKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2VycjoKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CisJcHV0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfcnR2IC0gU2VuZCBSZXF1ZXN0IFRpbWVvdXQgVmFsdWUgKFJUVikgcmVxdWVzdCB0byBwZWVyCisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdG8gc2VuZCBSVFYgdG8KKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfZW50ZXJfcnR2KHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisKKwlGQ19ERUJVR19SUE9SVCgiUG9ydCAoJTZ4KSBlbnRlcmVkIFJUViBzdGF0ZSBmcm9tICVzIHN0YXRlXG4iLAorCQkgICAgICAgcnBvcnQtPnBvcnRfaWQsIGZjX3Jwb3J0X3N0YXRlKHJwb3J0KSk7CisKKwlmY19ycG9ydF9zdGF0ZV9lbnRlcihycG9ydCwgUlBPUlRfU1RfUlRWKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX3J0dikpOworCWlmICghZnApIHsKKwkJZmNfcnBvcnRfZXJyb3IocnBvcnQsIGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbHBvcnQtPnR0LmVsc2N0X3NlbmQobHBvcnQsIHJwb3J0LCBmcCwgRUxTX1JUViwKKwkJCQkgICAgIGZjX3Jwb3J0X3J0dl9yZXNwLCBycG9ydCwgbHBvcnQtPmVfZF90b3YpKQorCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCWVsc2UKKwkJZ2V0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKy8qKgorICogZmNfcnBvcnRfZW50ZXJfbG9nbyAtIFNlbmQgTG9nb3V0IChMT0dPKSByZXF1ZXN0IHRvIHBlZXIKKyAqIEBycG9ydDogRmlicmUgQ2hhbm5lbCByZW1vdGUgcG9ydCB0byBzZW5kIExPR08gdG8KKyAqCisgKiBMb2NraW5nIE5vdGU6IFRoZSBycG9ydCBsb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgZmNfcnBvcnRfZW50ZXJfbG9nbyhzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQoreworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCisJRkNfREVCVUdfUlBPUlQoIlBvcnQgKCU2eCkgZW50ZXJlZCBMT0dPIHN0YXRlIGZyb20gJXMgc3RhdGVcbiIsCisJCSAgICAgICBycG9ydC0+cG9ydF9pZCwgZmNfcnBvcnRfc3RhdGUocnBvcnQpKTsKKworCWZjX3Jwb3J0X3N0YXRlX2VudGVyKHJwb3J0LCBSUE9SVF9TVF9MT0dPKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX2xvZ28pKTsKKwlpZiAoIWZwKSB7CisJCWZjX3Jwb3J0X2Vycm9yKHJwb3J0LCBmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWxwb3J0LT50dC5lbHNjdF9zZW5kKGxwb3J0LCBycG9ydCwgZnAsIEVMU19MT0dPLAorCQkJCSAgZmNfcnBvcnRfbG9nb19yZXNwLCBycG9ydCwgbHBvcnQtPmVfZF90b3YpKQorCQlmY19ycG9ydF9lcnJvcihycG9ydCwgZnApOworCWVsc2UKKwkJZ2V0X2RldmljZSgmcnBvcnQtPmRldik7Cit9CisKKworLyoqCisgKiBmY19ycG9ydF9yZWN2X3JlcSAtIFJlY2VpdmUgYSByZXF1ZXN0IGZyb20gYSBycG9ydAorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBQTE9HSSBleGNoYW5nZQorICogQGZwOiByZXNwb25zZSBmcmFtZQorICogQHJwX2FyZzogRmlicmUgQ2hhbm5lbCByZW1vdGUgcG9ydAorICoKKyAqIExvY2tpbmcgTm90ZTogQ2FsbGVkIHdpdGhvdXQgdGhlIHJwb3J0IGxvY2sgaGVsZC4gVGhpcworICogZnVuY3Rpb24gd2lsbCBob2xkIHRoZSBycG9ydCBsb2NrLCBjYWxsIGFuIF9lbnRlcl8qCisgKiBmdW5jdGlvbiBhbmQgdGhlbiB1bmxvY2sgdGhlIHJwb3J0LgorICovCit2b2lkIGZjX3Jwb3J0X3JlY3ZfcmVxKHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkgICAgICAgc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKKwlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIGVsc19kYXRhOworCXU4IG9wOworCisJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKKworCWVsc19kYXRhLmZwID0gTlVMTDsKKwllbHNfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9OT05FOworCWVsc19kYXRhLnJlYXNvbiA9IEVMU19SSlRfTk9ORTsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisKKwlpZiAoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSAmJiBmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0VMUykgeworCQlvcCA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCQlzd2l0Y2ggKG9wKSB7CisJCWNhc2UgRUxTX1BMT0dJOgorCQkJZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEocnBvcnQsIHNwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfUFJMSToKKwkJCWZjX3Jwb3J0X3JlY3ZfcHJsaV9yZXEocnBvcnQsIHNwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfUFJMTzoKKwkJCWZjX3Jwb3J0X3JlY3ZfcHJsb19yZXEocnBvcnQsIHNwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfTE9HTzoKKwkJCWZjX3Jwb3J0X3JlY3ZfbG9nb19yZXEocnBvcnQsIHNwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBFTFNfUlJROgorCQkJZWxzX2RhdGEuZnAgPSBmcDsKKwkJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfUlJRLCAmZWxzX2RhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgRUxTX1JFQzoKKwkJCWVsc19kYXRhLmZwID0gZnA7CisJCQlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChzcCwgRUxTX1JFQywgJmVsc19kYXRhKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZWxzX2RhdGEucmVhc29uID0gRUxTX1JKVF9VTlNVUDsKKwkJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmZWxzX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7Cit9CisKKy8qKgorICogZmNfcnBvcnRfcmVjdl9wbG9naV9yZXEgLSBIYW5kbGUgaW5jb21pbmcgUG9ydCBMb2dpbiAoUExPR0kpIHJlcXVlc3QKKyAqIEBycG9ydDogRmlicmUgQ2hhbm5lbCByZW1vdGUgcG9ydCB0aGF0IGluaXRpYXRlZCBQTE9HSQorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBQTE9HSSBleGNoYW5nZQorICogQGZwOiBQTE9HSSByZXF1ZXN0IGZyYW1lCisgKgorICogTG9ja2luZyBOb3RlOiBUaGUgcnBvcnQgbG9jayBpcyBleGVjdGVkIHRvIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3JlY3ZfcGxvZ2lfcmVxKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsCisJCQkJICAgIHN0cnVjdCBmY19zZXEgKnNwLCBzdHJ1Y3QgZmNfZnJhbWUgKnJ4X2ZwKQoreworCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpyZGF0YSA9IHJwb3J0LT5kZF9kYXRhOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwID0gcnhfZnA7CisJc3RydWN0IGZjX2V4Y2ggKmVwOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCBmY19lbHNfZmxvZ2kgKnBsOworCXN0cnVjdCBmY19zZXFfZWxzX2RhdGEgcmp0X2RhdGE7CisJdTMyIHNpZDsKKwl1NjQgd3dwbjsKKwl1NjQgd3dubjsKKwllbnVtIGZjX2Vsc19yanRfcmVhc29uIHJlamVjdCA9IDA7CisJdTMyIGZfY3RsOworCXJqdF9kYXRhLmZwID0gTlVMTDsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisKKwlGQ19ERUJVR19SUE9SVCgiUmVjZWl2ZWQgUExPR0kgcmVxdWVzdCBmcm9tIHBvcnQgKCU2eCkgIgorCQkgICAgICAgIndoaWxlIGluIHN0YXRlICVzXG4iLCBudG9oMjQoZmgtPmZoX3NfaWQpLAorCQkgICAgICAgZmNfcnBvcnRfc3RhdGUocnBvcnQpKTsKKworCXNpZCA9IG50b2gyNChmaC0+Zmhfc19pZCk7CisJcGwgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpwbCkpOworCWlmICghcGwpIHsKKwkJRkNfREJHKCJpbmNvbWluZyBQTE9HSSBmcm9tICV4IHRvbyBzaG9ydFxuIiwgc2lkKTsKKwkJV0FSTl9PTigxKTsKKwkJLyogWFhYIFRCRDogc2VuZCByZWplY3Q/ICovCisJCWZjX2ZyYW1lX2ZyZWUoZnApOworCQlyZXR1cm47CisJfQorCXd3cG4gPSBnZXRfdW5hbGlnbmVkX2JlNjQoJnBsLT5mbF93d3BuKTsKKwl3d25uID0gZ2V0X3VuYWxpZ25lZF9iZTY0KCZwbC0+Zmxfd3dubik7CisKKwkvKgorCSAqIElmIHRoZSBzZXNzaW9uIHdhcyBqdXN0IGNyZWF0ZWQsIHBvc3NpYmx5IGR1ZSB0byB0aGUgaW5jb21pbmcgUExPR0ksCisJICogc2V0IHRoZSBzdGF0ZSBhcHByb3ByaWF0ZWx5IGFuZCBhY2NlcHQgdGhlIFBMT0dJLgorCSAqCisJICogSWYgd2UgaGFkIGFsc28gc2VudCBhIFBMT0dJLCBhbmQgaWYgdGhlIHJlY2VpdmVkIFBMT0dJIGlzIGZyb20gYQorCSAqIGhpZ2hlciBXV1BOLCB3ZSBhY2NlcHQgaXQsIG90aGVyd2lzZSBhbiBMU19SSlQgaXMgc2VudCB3aXRoIHJlYXNvbgorCSAqICJjb21tYW5kIGFscmVhZHkgaW4gcHJvZ3Jlc3MiLgorCSAqCisJICogWFhYIFRCRDogSWYgdGhlIHNlc3Npb24gd2FzIHJlYWR5IGJlZm9yZSwgdGhlIFBMT0dJIHNob3VsZCByZXN1bHQgaW4KKwkgKiBhbGwgb3V0c3RhbmRpbmcgZXhjaGFuZ2VzIGJlaW5nIHJlc2V0LgorCSAqLworCXN3aXRjaCAocmRhdGEtPnJwX3N0YXRlKSB7CisJY2FzZSBSUE9SVF9TVF9JTklUOgorCQlGQ19ERUJVR19SUE9SVCgiaW5jb21pbmcgUExPR0kgZnJvbSAlNnggd3dwbiAlbGx4IHN0YXRlIElOSVQgIgorCQkJICAgICAgICItIHJlamVjdFxuIiwgc2lkLCB3d3BuKTsKKwkJcmVqZWN0ID0gRUxTX1JKVF9VTlNVUDsKKwkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9QTE9HSToKKwkJRkNfREVCVUdfUlBPUlQoImluY29taW5nIFBMT0dJIGZyb20gJXggaW4gUExPR0kgc3RhdGUgJWRcbiIsCisJCQkgICAgICAgc2lkLCByZGF0YS0+cnBfc3RhdGUpOworCQlpZiAod3dwbiA8IGxwb3J0LT53d3BuKQorCQkJcmVqZWN0ID0gRUxTX1JKVF9JTlBST0c7CisJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfUFJMSToKKwljYXNlIFJQT1JUX1NUX1JFQURZOgorCQlGQ19ERUJVR19SUE9SVCgiaW5jb21pbmcgUExPR0kgZnJvbSAleCBpbiBsb2dnZWQtaW4gc3RhdGUgJWQgIgorCQkJICAgICAgICItIGlnbm9yZWQgZm9yIG5vd1xuIiwgc2lkLCByZGF0YS0+cnBfc3RhdGUpOworCQkvKiBYWFggVEJEIC0gc2hvdWxkIHJlc2V0ICovCisJCWJyZWFrOworCWNhc2UgUlBPUlRfU1RfTk9ORToKKwlkZWZhdWx0OgorCQlGQ19ERUJVR19SUE9SVCgiaW5jb21pbmcgUExPR0kgZnJvbSAleCBpbiB1bmV4cGVjdGVkICIKKwkJCSAgICAgICAic3RhdGUgJWRcbiIsIHNpZCwgcmRhdGEtPnJwX3N0YXRlKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlamVjdCkgeworCQlyanRfZGF0YS5yZWFzb24gPSByZWplY3Q7CisJCXJqdF9kYXRhLmV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCQlmY19mcmFtZV9mcmVlKGZwKTsKKwl9IGVsc2UgeworCQlmcCA9IGZjX2ZyYW1lX2FsbG9jKGxwb3J0LCBzaXplb2YoKnBsKSk7CisJCWlmIChmcCA9PSBOVUxMKSB7CisJCQlmcCA9IHJ4X2ZwOworCQkJcmp0X2RhdGEucmVhc29uID0gRUxTX1JKVF9VTkFCOworCQkJcmp0X2RhdGEuZXhwbGFuID0gRUxTX0VYUExfTk9ORTsKKwkJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCQkJZmNfZnJhbWVfZnJlZShmcCk7CisJCX0gZWxzZSB7CisJCQlzcCA9IGxwb3J0LT50dC5zZXFfc3RhcnRfbmV4dChzcCk7CisJCQlXQVJOX09OKCFzcCk7CisJCQlmY19ycG9ydF9zZXRfbmFtZShycG9ydCwgd3dwbiwgd3dubik7CisKKwkJCS8qCisJCQkgKiBHZXQgc2Vzc2lvbiBwYXlsb2FkIHNpemUgZnJvbSBpbmNvbWluZyBQTE9HSS4KKwkJCSAqLworCQkJcnBvcnQtPm1heGZyYW1lX3NpemUgPQorCQkJCWZjX3Bsb2dpX2dldF9tYXhmcmFtZShwbCwgbHBvcnQtPm1mcyk7CisJCQlmY19mcmFtZV9mcmVlKHJ4X2ZwKTsKKwkJCWZjX3Bsb2dpX2ZpbGwobHBvcnQsIGZwLCBFTFNfTFNfQUNDKTsKKworCQkJLyoKKwkJCSAqIFNlbmQgTFNfQUNDLgkgSWYgdGhpcyBmYWlscywKKwkJCSAqIHRoZSBvcmlnaW5hdG9yIHNob3VsZCByZXRyeS4KKwkJCSAqLworCQkJZl9jdGwgPSBGQ19GQ19FWF9DVFggfCBGQ19GQ19MQVNUX1NFUTsKKwkJCWZfY3RsIHw9IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKKwkJCWVwID0gZmNfc2VxX2V4Y2goc3ApOworCQkJZmNfZmlsbF9mY19oZHIoZnAsIEZDX1JDVExfRUxTX1JFUCwgZXAtPmRpZCwgZXAtPnNpZCwKKwkJCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKKwkJCWxwb3J0LT50dC5zZXFfc2VuZChscG9ydCwgc3AsIGZwKTsKKwkJCWlmIChyZGF0YS0+cnBfc3RhdGUgPT0gUlBPUlRfU1RfUExPR0kpCisJCQkJZmNfcnBvcnRfZW50ZXJfcHJsaShycG9ydCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZmNfcnBvcnRfcmVjdl9wcmxpX3JlcSAtIEhhbmRsZSBpbmNvbWluZyBQcm9jZXNzIExvZ2luIChQUkxJKSByZXF1ZXN0CisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdGhhdCBpbml0aWF0ZWQgUFJMSQorICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBQUkxJIGV4Y2hhbmdlCisgKiBAZnA6IFBSTEkgcmVxdWVzdCBmcmFtZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X3BybGlfcmVxKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsCisJCQkJICAgc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqcnhfZnApCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCXN0cnVjdCBmY19leGNoICplcDsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCXN0cnVjdCB7CisJCXN0cnVjdCBmY19lbHNfcHJsaSBwcmxpOworCQlzdHJ1Y3QgZmNfZWxzX3NwcCBzcHA7CisJfSAqcHA7CisJc3RydWN0IGZjX2Vsc19zcHAgKnJzcHA7CS8qIHJlcXVlc3Qgc2VydmljZSBwYXJhbSBwYWdlICovCisJc3RydWN0IGZjX2Vsc19zcHAgKnNwcDsJLyogcmVzcG9uc2Ugc3BwICovCisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgcGxlbjsKKwllbnVtIGZjX2Vsc19yanRfcmVhc29uIHJlYXNvbiA9IEVMU19SSlRfVU5BQjsKKwllbnVtIGZjX2Vsc19yanRfZXhwbGFuIGV4cGxhbiA9IEVMU19FWFBMX05PTkU7CisJZW51bSBmY19lbHNfc3BwX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHJqdF9kYXRhOworCXUzMiBmX2N0bDsKKwl1MzIgZmNwX3Bhcm07CisJdTMyIHJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOworCXJqdF9kYXRhLmZwID0gTlVMTDsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChyeF9mcCk7CisKKwlGQ19ERUJVR19SUE9SVCgiUmVjZWl2ZWQgUFJMSSByZXF1ZXN0IGZyb20gcG9ydCAoJTZ4KSAiCisJCSAgICAgICAid2hpbGUgaW4gc3RhdGUgJXNcbiIsIG50b2gyNChmaC0+Zmhfc19pZCksCisJCSAgICAgICBmY19ycG9ydF9zdGF0ZShycG9ydCkpOworCisJc3dpdGNoIChyZGF0YS0+cnBfc3RhdGUpIHsKKwljYXNlIFJQT1JUX1NUX1BSTEk6CisJY2FzZSBSUE9SVF9TVF9SRUFEWToKKwkJcmVhc29uID0gRUxTX1JKVF9OT05FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJbGVuID0gZnJfbGVuKHJ4X2ZwKSAtIHNpemVvZigqZmgpOworCXBwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQocnhfZnAsIHNpemVvZigqcHApKTsKKwlpZiAocHAgPT0gTlVMTCkgeworCQlyZWFzb24gPSBFTFNfUkpUX1BST1Q7CisJCWV4cGxhbiA9IEVMU19FWFBMX0lOVl9MRU47CisJfSBlbHNlIHsKKwkJcGxlbiA9IG50b2hzKHBwLT5wcmxpLnBybGlfbGVuKTsKKwkJaWYgKChwbGVuICUgNCkgIT0gMCB8fCBwbGVuID4gbGVuKSB7CisJCQlyZWFzb24gPSBFTFNfUkpUX1BST1Q7CisJCQlleHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOworCQl9IGVsc2UgaWYgKHBsZW4gPCBsZW4pIHsKKwkJCWxlbiA9IHBsZW47CisJCX0KKwkJcGxlbiA9IHBwLT5wcmxpLnBybGlfc3BwX2xlbjsKKwkJaWYgKChwbGVuICUgNCkgIT0gMCB8fCBwbGVuIDwgc2l6ZW9mKCpzcHApIHx8CisJCSAgICBwbGVuID4gbGVuIHx8IGxlbiA8IHNpemVvZigqcHApKSB7CisJCQlyZWFzb24gPSBFTFNfUkpUX1BST1Q7CisJCQlleHBsYW4gPSBFTFNfRVhQTF9JTlZfTEVOOworCQl9CisJCXJzcHAgPSAmcHAtPnNwcDsKKwl9CisJaWYgKHJlYXNvbiAhPSBFTFNfUkpUX05PTkUgfHwKKwkgICAgKGZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIGxlbikpID09IE5VTEwpIHsKKwkJcmp0X2RhdGEucmVhc29uID0gcmVhc29uOworCQlyanRfZGF0YS5leHBsYW4gPSBleHBsYW47CisJCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCX0gZWxzZSB7CisJCXNwID0gbHBvcnQtPnR0LnNlcV9zdGFydF9uZXh0KHNwKTsKKwkJV0FSTl9PTighc3ApOworCQlwcCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBsZW4pOworCQlXQVJOX09OKCFwcCk7CisJCW1lbXNldChwcCwgMCwgbGVuKTsKKwkJcHAtPnBybGkucHJsaV9jbWQgPSBFTFNfTFNfQUNDOworCQlwcC0+cHJsaS5wcmxpX3NwcF9sZW4gPSBwbGVuOworCQlwcC0+cHJsaS5wcmxpX2xlbiA9IGh0b25zKGxlbik7CisJCWxlbiAtPSBzaXplb2Yoc3RydWN0IGZjX2Vsc19wcmxpKTsKKworCQkvKgorCQkgKiBHbyB0aHJvdWdoIGFsbCB0aGUgc2VydmljZSBwYXJhbWV0ZXIgcGFnZXMgYW5kIGJ1aWxkCisJCSAqIHJlc3BvbnNlLiAgSWYgcGxlbiBpbmRpY2F0ZXMgbG9uZ2VyIFNQUCB0aGFuIHN0YW5kYXJkLAorCQkgKiB1c2UgdGhhdC4gIFRoZSBlbnRpcmUgcmVzcG9uc2UgaGFzIGJlZW4gcHJlLWNsZWFyZWQgYWJvdmUuCisJCSAqLworCQlzcHAgPSAmcHAtPnNwcDsKKwkJd2hpbGUgKGxlbiA+PSBwbGVuKSB7CisJCQlzcHAtPnNwcF90eXBlID0gcnNwcC0+c3BwX3R5cGU7CisJCQlzcHAtPnNwcF90eXBlX2V4dCA9IHJzcHAtPnNwcF90eXBlX2V4dDsKKwkJCXNwcC0+c3BwX2ZsYWdzID0gcnNwcC0+c3BwX2ZsYWdzICYgRkNfU1BQX0VTVF9JTUdfUEFJUjsKKwkJCXJlc3AgPSBGQ19TUFBfUkVTUF9BQ0s7CisJCQlpZiAocnNwcC0+c3BwX2ZsYWdzICYgRkNfU1BQX1JQQV9WQUwpCisJCQkJcmVzcCA9IEZDX1NQUF9SRVNQX05PX1BBOworCQkJc3dpdGNoIChyc3BwLT5zcHBfdHlwZSkgeworCQkJY2FzZSAwOgkvKiBjb21tb24gdG8gYWxsIEZDLTQgdHlwZXMgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgRkNfVFlQRV9GQ1A6CisJCQkJZmNwX3Bhcm0gPSBudG9obChyc3BwLT5zcHBfcGFyYW1zKTsKKwkJCQlpZiAoZmNwX3Bhcm0gKiBGQ1BfU1BQRl9SRVRSWSkKKwkJCQkJcmRhdGEtPmZsYWdzIHw9IEZDX1JQX0ZMQUdTX1JFVFJZOworCQkJCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19DTEFTUzM7CisJCQkJaWYgKGZjcF9wYXJtICYgRkNQX1NQUEZfSU5JVF9GQ04pCisJCQkJCXJvbGVzIHw9IEZDX1JQT1JUX1JPTEVfRkNQX0lOSVRJQVRPUjsKKwkJCQlpZiAoZmNwX3Bhcm0gJiBGQ1BfU1BQRl9UQVJHX0ZDTikKKwkJCQkJcm9sZXMgfD0gRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUOworCQkJCXJwb3J0LT5yb2xlcyA9IHJvbGVzOworCisJCQkJc3BwLT5zcHBfcGFyYW1zID0KKwkJCQkJaHRvbmwobHBvcnQtPnNlcnZpY2VfcGFyYW1zKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmVzcCA9IEZDX1NQUF9SRVNQX0lOVkw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcHAtPnNwcF9mbGFncyB8PSByZXNwOworCQkJbGVuIC09IHBsZW47CisJCQlyc3BwID0gKHN0cnVjdCBmY19lbHNfc3BwICopKChjaGFyICopcnNwcCArIHBsZW4pOworCQkJc3BwID0gKHN0cnVjdCBmY19lbHNfc3BwICopKChjaGFyICopc3BwICsgcGxlbik7CisJCX0KKworCQkvKgorCQkgKiBTZW5kIExTX0FDQy4JIElmIHRoaXMgZmFpbHMsIHRoZSBvcmlnaW5hdG9yIHNob3VsZCByZXRyeS4KKwkJICovCisJCWZfY3RsID0gRkNfRkNfRVhfQ1RYIHwgRkNfRkNfTEFTVF9TRVE7CisJCWZfY3RsIHw9IEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVDsKKwkJZXAgPSBmY19zZXFfZXhjaChzcCk7CisJCWZjX2ZpbGxfZmNfaGRyKGZwLCBGQ19SQ1RMX0VMU19SRVAsIGVwLT5kaWQsIGVwLT5zaWQsCisJCQkgICAgICAgRkNfVFlQRV9FTFMsIGZfY3RsLCAwKTsKKwkJbHBvcnQtPnR0LnNlcV9zZW5kKGxwb3J0LCBzcCwgZnApOworCisJCS8qCisJCSAqIEdldCBsb2NrIGFuZCByZS1jaGVjayBzdGF0ZS4KKwkJICovCisJCXN3aXRjaCAocmRhdGEtPnJwX3N0YXRlKSB7CisJCWNhc2UgUlBPUlRfU1RfUFJMSToKKwkJCWZjX3Jwb3J0X2VudGVyX3JlYWR5KHJwb3J0KTsKKwkJCWJyZWFrOworCQljYXNlIFJQT1JUX1NUX1JFQURZOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlmY19mcmFtZV9mcmVlKHJ4X2ZwKTsKK30KKworLyoqCisgKiBmY19ycG9ydF9yZWN2X3BybG9fcmVxIC0gSGFuZGxlIGluY29taW5nIFByb2Nlc3MgTG9nb3V0IChQUkxPKSByZXF1ZXN0CisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdGhhdCBpbml0aWF0ZWQgUFJMTworICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBQUkxPIGV4Y2hhbmdlCisgKiBAZnA6IFBSTE8gcmVxdWVzdCBmcmFtZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X3BybG9fcmVxKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHN0cnVjdCBmY19zZXEgKnNwLAorCQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX3NlcV9lbHNfZGF0YSByanRfZGF0YTsKKworCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisKKwlGQ19ERUJVR19SUE9SVCgiUmVjZWl2ZWQgUFJMTyByZXF1ZXN0IGZyb20gcG9ydCAoJTZ4KSAiCisJCSAgICAgICAid2hpbGUgaW4gc3RhdGUgJXNcbiIsIG50b2gyNChmaC0+Zmhfc19pZCksCisJCSAgICAgICBmY19ycG9ydF9zdGF0ZShycG9ydCkpOworCisJcmp0X2RhdGEuZnAgPSBOVUxMOworCXJqdF9kYXRhLnJlYXNvbiA9IEVMU19SSlRfVU5BQjsKKwlyanRfZGF0YS5leHBsYW4gPSBFTFNfRVhQTF9OT05FOworCWxwb3J0LT50dC5zZXFfZWxzX3JzcF9zZW5kKHNwLCBFTFNfTFNfUkpULCAmcmp0X2RhdGEpOworCWZjX2ZyYW1lX2ZyZWUoZnApOworfQorCisvKioKKyAqIGZjX3Jwb3J0X3JlY3ZfbG9nb19yZXEgLSBIYW5kbGUgaW5jb21pbmcgTG9nb3V0IChMT0dPKSByZXF1ZXN0CisgKiBAcnBvcnQ6IEZpYnJlIENoYW5uZWwgcmVtb3RlIHBvcnQgdGhhdCBpbml0aWF0ZWQgTE9HTworICogQHNwOiBjdXJyZW50IHNlcXVlbmNlIGluIHRoZSBMT0dPIGV4Y2hhbmdlCisgKiBAZnA6IExPR08gcmVxdWVzdCBmcmFtZQorICoKKyAqIExvY2tpbmcgTm90ZTogVGhlIHJwb3J0IGxvY2sgaXMgZXhlY3RlZCB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmY19ycG9ydF9yZWN2X2xvZ29fcmVxKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHN0cnVjdCBmY19zZXEgKnNwLAorCQkJCSAgIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CisJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJkYXRhID0gcnBvcnQtPmRkX2RhdGE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKworCUZDX0RFQlVHX1JQT1JUKCJSZWNlaXZlZCBMT0dPIHJlcXVlc3QgZnJvbSBwb3J0ICglNngpICIKKwkJICAgICAgICJ3aGlsZSBpbiBzdGF0ZSAlc1xuIiwgbnRvaDI0KGZoLT5maF9zX2lkKSwKKwkJICAgICAgIGZjX3Jwb3J0X3N0YXRlKHJwb3J0KSk7CisKKwlyZGF0YS0+ZXZlbnQgPSBSUE9SVF9FVl9MT0dPOworCXF1ZXVlX3dvcmsocnBvcnRfZXZlbnRfcXVldWUsICZyZGF0YS0+ZXZlbnRfd29yayk7CisKKwlscG9ydC0+dHQuc2VxX2Vsc19yc3Bfc2VuZChzcCwgRUxTX0xTX0FDQywgTlVMTCk7CisJZmNfZnJhbWVfZnJlZShmcCk7Cit9CisKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2ZsdXNoX3F1ZXVlKHZvaWQpCit7CisJZmx1c2hfd29ya3F1ZXVlKHJwb3J0X2V2ZW50X3F1ZXVlKTsKK30KKworCitpbnQgZmNfcnBvcnRfaW5pdChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQoreworCWlmICghbHBvcnQtPnR0LnJwb3J0X2xvZ2luKQorCQlscG9ydC0+dHQucnBvcnRfbG9naW4gPSBmY19ycG9ydF9sb2dpbjsKKworCWlmICghbHBvcnQtPnR0LnJwb3J0X2xvZ29mZikKKwkJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZiA9IGZjX3Jwb3J0X2xvZ29mZjsKKworCWlmICghbHBvcnQtPnR0LnJwb3J0X3JlY3ZfcmVxKQorCQlscG9ydC0+dHQucnBvcnRfcmVjdl9yZXEgPSBmY19ycG9ydF9yZWN2X3JlcTsKKworCWlmICghbHBvcnQtPnR0LnJwb3J0X2ZsdXNoX3F1ZXVlKQorCQlscG9ydC0+dHQucnBvcnRfZmx1c2hfcXVldWUgPSBmY19ycG9ydF9mbHVzaF9xdWV1ZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19ycG9ydF9pbml0KTsKKworaW50IGZjX3NldHVwX3Jwb3J0KCkKK3sKKwlycG9ydF9ldmVudF9xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmY19ycG9ydF9lcSIpOworCWlmICghcnBvcnRfZXZlbnRfcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmY19zZXR1cF9ycG9ydCk7CisKK3ZvaWQgZmNfZGVzdHJveV9ycG9ydCgpCit7CisJZGVzdHJveV93b3JrcXVldWUocnBvcnRfZXZlbnRfcXVldWUpOworfQorRVhQT1JUX1NZTUJPTChmY19kZXN0cm95X3Jwb3J0KTsKKwordm9pZCBmY19ycG9ydF90ZXJtaW5hdGVfaW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcmRhdGEgPSBycG9ydC0+ZGRfZGF0YTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CisKKwlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQobHBvcnQtPmVtcCwgMCwgcnBvcnQtPnBvcnRfaWQpOworCWxwb3J0LT50dC5leGNoX21ncl9yZXNldChscG9ydC0+ZW1wLCBycG9ydC0+cG9ydF9pZCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3Jwb3J0X3Rlcm1pbmF0ZV9pbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCmluZGV4IDNmZGVlNzMuLjcyMjViNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCkBAIC04OCwzNCArODgsNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3VwZGF0ZV9jbWRzbik7CiAKLXZvaWQgaXNjc2lfcHJlcF91bnNvbGljaXRfZGF0YV9wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssCi0JCQkJICAgc3RydWN0IGlzY3NpX2RhdGEgKmhkcikKKy8qKgorICogaXNjc2lfcHJlcF9kYXRhX291dF9wZHUgLSBpbml0aWFsaXplIERhdGEtT3V0CisgKiBAdGFzazogc2NzaSBjb21tYW5kIHRhc2sKKyAqIEByMnQ6IFIyVCBpbmZvCisgKiBAaGRyOiBpc2NzaSBkYXRhIGluIHBkdQorICoKKyAqIE5vdGVzOgorICoJSW5pdGlhbGl6ZSBEYXRhLU91dCB3aXRoaW4gdGhpcyBSMlQgc2VxdWVuY2UgYW5kIGZpbmRzCisgKglwcm9wZXIgZGF0YV9vZmZzZXQgd2l0aGluIHRoaXMgU0NTSSBjb21tYW5kLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggY29ubmVjdGlvbiBsb2NrIHRha2VuLgorICoqLwordm9pZCBpc2NzaV9wcmVwX2RhdGFfb3V0X3BkdShzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQsCisJCQkgICBzdHJ1Y3QgaXNjc2lfZGF0YSAqaGRyKQogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGFzay0+Y29ubjsKKwl1bnNpZ25lZCBpbnQgbGVmdCA9IHIydC0+ZGF0YV9sZW5ndGggLSByMnQtPnNlbnQ7CisKKwl0YXNrLT5oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9kYXRhKTsKIAogCW1lbXNldChoZHIsIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfZGF0YSkpOwotCWhkci0+dHR0ID0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKTsKLQloZHItPmRhdGFzbiA9IGNwdV90b19iZTMyKHRhc2stPnVuc29sX2RhdGFzbik7Ci0JdGFzay0+dW5zb2xfZGF0YXNuKys7CisJaGRyLT50dHQgPSByMnQtPnR0dDsKKwloZHItPmRhdGFzbiA9IGNwdV90b19iZTMyKHIydC0+ZGF0YXNuKTsKKwlyMnQtPmRhdGFzbisrOwogCWhkci0+b3Bjb2RlID0gSVNDU0lfT1BfU0NTSV9EQVRBX09VVDsKLQltZW1jcHkoaGRyLT5sdW4sIHRhc2stPmhkci0+bHVuLCBzaXplb2YoaGRyLT5sdW4pKTsKLQotCWhkci0+aXR0ID0gdGFzay0+aGRyLT5pdHQ7Ci0JaGRyLT5leHBfc3RhdHNuID0gY3B1X3RvX2JlMzIoY29ubi0+ZXhwX3N0YXRzbik7Ci0JaGRyLT5vZmZzZXQgPSBjcHVfdG9fYmUzMih0YXNrLT51bnNvbF9vZmZzZXQpOwotCi0JaWYgKHRhc2stPnVuc29sX2NvdW50ID4gY29ubi0+bWF4X3htaXRfZGxlbmd0aCkgeworCW1lbWNweShoZHItPmx1biwgdGFzay0+bHVuLCBzaXplb2YoaGRyLT5sdW4pKTsKKwloZHItPml0dCA9IHRhc2stPmhkcl9pdHQ7CisJaGRyLT5leHBfc3RhdHNuID0gcjJ0LT5leHBfc3RhdHNuOworCWhkci0+b2Zmc2V0ID0gY3B1X3RvX2JlMzIocjJ0LT5kYXRhX29mZnNldCArIHIydC0+c2VudCk7CisJaWYgKGxlZnQgPiBjb25uLT5tYXhfeG1pdF9kbGVuZ3RoKSB7CiAJCWh0b24yNChoZHItPmRsZW5ndGgsIGNvbm4tPm1heF94bWl0X2RsZW5ndGgpOwotCQl0YXNrLT5kYXRhX2NvdW50ID0gY29ubi0+bWF4X3htaXRfZGxlbmd0aDsKLQkJdGFzay0+dW5zb2xfb2Zmc2V0ICs9IHRhc2stPmRhdGFfY291bnQ7CisJCXIydC0+ZGF0YV9jb3VudCA9IGNvbm4tPm1heF94bWl0X2RsZW5ndGg7CiAJCWhkci0+ZmxhZ3MgPSAwOwogCX0gZWxzZSB7Ci0JCWh0b24yNChoZHItPmRsZW5ndGgsIHRhc2stPnVuc29sX2NvdW50KTsKLQkJdGFzay0+ZGF0YV9jb3VudCA9IHRhc2stPnVuc29sX2NvdW50OworCQlodG9uMjQoaGRyLT5kbGVuZ3RoLCBsZWZ0KTsKKwkJcjJ0LT5kYXRhX2NvdW50ID0gbGVmdDsKIAkJaGRyLT5mbGFncyA9IElTQ1NJX0ZMQUdfQ01EX0ZJTkFMOwogCX0KKwljb25uLT5kYXRhb3V0X3BkdXNfY250Kys7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9wcmVwX3Vuc29saWNpdF9kYXRhX3BkdSk7CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9wcmVwX2RhdGFfb3V0X3BkdSk7CiAKIHN0YXRpYyBpbnQgaXNjc2lfYWRkX2hkcihzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaywgdW5zaWduZWQgbGVuKQogewpAQCAtMjA2LDExICsyMTksMjQgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwotCXN0cnVjdCBpc2NzaV9jbWQgKmhkciA9IHRhc2stPmhkcjsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRhc2stPnNjOworCXN0cnVjdCBpc2NzaV9jbWQgKmhkcjsKIAl1bnNpZ25lZCBoZHJsZW5ndGgsIGNtZF9sZW47CisJaXR0X3QgaXR0OwogCWludCByYzsKIAorCXJjID0gY29ubi0+c2Vzc2lvbi0+dHQtPmFsbG9jX3BkdSh0YXNrLCBJU0NTSV9PUF9TQ1NJX0NNRCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaGRyID0gKHN0cnVjdCBpc2NzaV9jbWQgKikgdGFzay0+aGRyOworCWl0dCA9IGhkci0+aXR0OworCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisKKwlpZiAoc2Vzc2lvbi0+dHQtPnBhcnNlX3BkdV9pdHQpCisJCWhkci0+aXR0ID0gdGFzay0+aGRyX2l0dCA9IGl0dDsKKwllbHNlCisJCWhkci0+aXR0ID0gdGFzay0+aGRyX2l0dCA9IGJ1aWxkX2l0dCh0YXNrLT5pdHQsCisJCQkJCQkgICAgIHRhc2stPmNvbm4tPnNlc3Npb24tPmFnZSk7CiAJdGFzay0+aGRyX2xlbiA9IDA7CiAJcmMgPSBpc2NzaV9hZGRfaGRyKHRhc2ssIHNpemVvZigqaGRyKSk7CiAJaWYgKHJjKQpAQCAtMjE4LDggKzI0NCw4IEBACiAJaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX0NNRDsKIAloZHItPmZsYWdzID0gSVNDU0lfQVRUUl9TSU1QTEU7CiAJaW50X3RvX3Njc2lsdW4oc2MtPmRldmljZS0+bHVuLCAoc3RydWN0IHNjc2lfbHVuICopaGRyLT5sdW4pOwotCWhkci0+aXR0ID0gYnVpbGRfaXR0KHRhc2stPml0dCwgc2Vzc2lvbi0+YWdlKTsKLQloZHItPmNtZHNuID0gY3B1X3RvX2JlMzIoc2Vzc2lvbi0+Y21kc24pOworCW1lbWNweSh0YXNrLT5sdW4sIGhkci0+bHVuLCBzaXplb2YodGFzay0+bHVuKSk7CisJaGRyLT5jbWRzbiA9IHRhc2stPmNtZHNuID0gY3B1X3RvX2JlMzIoc2Vzc2lvbi0+Y21kc24pOwogCXNlc3Npb24tPmNtZHNuKys7CiAJaGRyLT5leHBfc3RhdHNuID0gY3B1X3RvX2JlMzIoY29ubi0+ZXhwX3N0YXRzbik7CiAJY21kX2xlbiA9IHNjLT5jbWRfbGVuOwpAQCAtMjQyLDYgKzI2OCw4IEBACiAJfQogCWlmIChzYy0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQl1bnNpZ25lZCBvdXRfbGVuID0gc2NzaV9vdXQoc2MpLT5sZW5ndGg7CisJCXN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqcjJ0ID0gJnRhc2stPnVuc29sX3IydDsKKwogCQloZHItPmRhdGFfbGVuZ3RoID0gY3B1X3RvX2JlMzIob3V0X2xlbik7CiAJCWhkci0+ZmxhZ3MgfD0gSVNDU0lfRkxBR19DTURfV1JJVEU7CiAJCS8qCkBAIC0yNTQsMTMgKzI4MiwxMSBAQAogCQkgKgkJCXdpdGhvdXQJUjJUIGFjayByaWdodCBhZnRlcgogCQkgKgkJCWltbWVkaWF0ZSBkYXRhCiAJCSAqCi0JCSAqCXIydF9kYXRhX2NvdW50CWJ5dGVzIHRvIGJlIHNlbnQgdmlhIFIyVCBhY2sncworCQkgKglyMnQgZGF0YV9sZW5ndGggYnl0ZXMgdG8gYmUgc2VudCB2aWEgUjJUIGFjaydzCiAJCSAqCiAJCSAqICAgICAgcGFkX2NvdW50ICAgICAgIGJ5dGVzIHRvIGJlIHNlbnQgYXMgemVyby1wYWRkaW5nCiAJCSAqLwotCQl0YXNrLT51bnNvbF9jb3VudCA9IDA7Ci0JCXRhc2stPnVuc29sX29mZnNldCA9IDA7Ci0JCXRhc2stPnVuc29sX2RhdGFzbiA9IDA7CisJCW1lbXNldChyMnQsIDAsIHNpemVvZigqcjJ0KSk7CiAKIAkJaWYgKHNlc3Npb24tPmltbV9kYXRhX2VuKSB7CiAJCQlpZiAob3V0X2xlbiA+PSBzZXNzaW9uLT5maXJzdF9idXJzdCkKQEAgLTI3NCwxMiArMzAwLDE0IEBACiAJCQl6ZXJvX2RhdGEoaGRyLT5kbGVuZ3RoKTsKIAogCQlpZiAoIXNlc3Npb24tPmluaXRpYWxfcjJ0X2VuKSB7Ci0JCQl0YXNrLT51bnNvbF9jb3VudCA9IG1pbihzZXNzaW9uLT5maXJzdF9idXJzdCwgb3V0X2xlbikKLQkJCQkJCQkgICAgIC0gdGFzay0+aW1tX2NvdW50OwotCQkJdGFzay0+dW5zb2xfb2Zmc2V0ID0gdGFzay0+aW1tX2NvdW50OworCQkJcjJ0LT5kYXRhX2xlbmd0aCA9IG1pbihzZXNzaW9uLT5maXJzdF9idXJzdCwgb3V0X2xlbikgLQorCQkJCQkgICAgICAgdGFzay0+aW1tX2NvdW50OworCQkJcjJ0LT5kYXRhX29mZnNldCA9IHRhc2stPmltbV9jb3VudDsKKwkJCXIydC0+dHR0ID0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKTsKKwkJCXIydC0+ZXhwX3N0YXRzbiA9IGNwdV90b19iZTMyKGNvbm4tPmV4cF9zdGF0c24pOwogCQl9CiAKLQkJaWYgKCF0YXNrLT51bnNvbF9jb3VudCkKKwkJaWYgKCF0YXNrLT51bnNvbF9yMnQuZGF0YV9sZW5ndGgpCiAJCQkvKiBObyB1bnNvbGljaXQgRGF0YS1PdXQncyAqLwogCQkJaGRyLT5mbGFncyB8PSBJU0NTSV9GTEFHX0NNRF9GSU5BTDsKIAl9IGVsc2UgewpAQCAtMzAwLDggKzMyOCw3IEBACiAJV0FSTl9PTihoZHJsZW5ndGggPj0gMjU2KTsKIAloZHItPmhsZW5ndGggPSBoZHJsZW5ndGggJiAweEZGOwogCi0JaWYgKGNvbm4tPnNlc3Npb24tPnR0LT5pbml0X3Rhc2sgJiYKLQkgICAgY29ubi0+c2Vzc2lvbi0+dHQtPmluaXRfdGFzayh0YXNrKSkKKwlpZiAoc2Vzc2lvbi0+dHQtPmluaXRfdGFzayAmJiBzZXNzaW9uLT50dC0+aW5pdF90YXNrKHRhc2spKQogCQlyZXR1cm4gLUVJTzsKIAogCXRhc2stPnN0YXRlID0gSVNDU0lfVEFTS19SVU5OSU5HOwpAQCAtMzMyLDYgKzM1OSw3IEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gdGFzay0+c2M7CiAKKwlzZXNzaW9uLT50dC0+Y2xlYW51cF90YXNrKHRhc2spOwogCWxpc3RfZGVsX2luaXQoJnRhc2stPnJ1bm5pbmcpOwogCXRhc2stPnN0YXRlID0gSVNDU0lfVEFTS19DT01QTEVURUQ7CiAJdGFzay0+c2MgPSBOVUxMOwpAQCAtNDAyLDggKzQzMCw2IEBACiAJCSAqIHRoZSBjbWQgaW4gdGhlIHNlcXVlbmNpbmcKIAkJICovCiAJCWNvbm4tPnNlc3Npb24tPnF1ZXVlZF9jbWRzbi0tOwotCWVsc2UKLQkJY29ubi0+c2Vzc2lvbi0+dHQtPmNsZWFudXBfdGFzayhjb25uLCB0YXNrKTsKIAogCXNjLT5yZXN1bHQgPSBlcnI7CiAJaWYgKCFzY3NpX2JpZGlfY21uZChzYykpCkBAIC00MjMsNyArNDQ5LDcgQEAKIAkJCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0Jc3RydWN0IGlzY3NpX2hkciAqaGRyID0gKHN0cnVjdCBpc2NzaV9oZHIgKil0YXNrLT5oZHI7CisJc3RydWN0IGlzY3NpX2hkciAqaGRyID0gdGFzay0+aGRyOwogCXN0cnVjdCBpc2NzaV9ub3BvdXQgKm5vcCA9IChzdHJ1Y3QgaXNjc2lfbm9wb3V0ICopaGRyOwogCiAJaWYgKGNvbm4tPnNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX0xPR0dJTkdfT1VUKQpAQCAtNDM3LDcgKzQ2Myw2IEBACiAJICovCiAJbm9wLT5jbWRzbiA9IGNwdV90b19iZTMyKHNlc3Npb24tPmNtZHNuKTsKIAlpZiAoaGRyLT5pdHQgIT0gUkVTRVJWRURfSVRUKSB7Ci0JCWhkci0+aXR0ID0gYnVpbGRfaXR0KHRhc2stPml0dCwgc2Vzc2lvbi0+YWdlKTsKIAkJLyoKIAkJICogVE9ETzogV2UgYWx3YXlzIHVzZSBpbW1lZGlhdGUsIHNvIHdlIG5ldmVyIGhpdCB0aGlzLgogCQkgKiBJZiB3ZSBzdGFydCB0byBzZW5kIHRtZnMgb3Igbm9wcyBhcyBub24taW1tZWRpYXRlIHRoZW4KQEAgLTQ1MCwxMiArNDc1LDEzIEBACiAJCX0KIAl9CiAKLQlpZiAoc2Vzc2lvbi0+dHQtPmluaXRfdGFzaykKLQkJc2Vzc2lvbi0+dHQtPmluaXRfdGFzayh0YXNrKTsKKwlpZiAoc2Vzc2lvbi0+dHQtPmluaXRfdGFzayAmJiBzZXNzaW9uLT50dC0+aW5pdF90YXNrKHRhc2spKQorCQlyZXR1cm4gLUVJTzsKIAogCWlmICgoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSykgPT0gSVNDU0lfT1BfTE9HT1VUKQogCQlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NUQVRFX0xPR0dJTkdfT1VUOwogCisJdGFzay0+c3RhdGUgPSBJU0NTSV9UQVNLX1JVTk5JTkc7CiAJbGlzdF9tb3ZlX3RhaWwoJnRhc2stPnJ1bm5pbmcsICZjb25uLT5tZ210X3J1bl9saXN0KTsKIAlkZWJ1Z19zY3NpKCJtZ210cGR1IFtvcCAweCV4IGhkci0+aXR0IDB4JXggZGF0YWxlbiAlZF1cbiIsCiAJCSAgIGhkci0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0ssIGhkci0+aXR0LApAQCAtNDY5LDYgKzQ5NSw3IEBACiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCXN0cnVjdCBpc2NzaV90YXNrICp0YXNrOworCWl0dF90IGl0dDsKIAogCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TVEFURV9URVJNSU5BVEUpCiAJCXJldHVybiBOVUxMOwpAQCAtNTA1LDIzICs1MzIsNDcgQEAKIAl9IGVsc2UKIAkJdGFzay0+ZGF0YV9jb3VudCA9IDA7CiAKKwlpZiAoY29ubi0+c2Vzc2lvbi0+dHQtPmFsbG9jX3BkdSh0YXNrLCBoZHItPm9wY29kZSkpIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJDb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSAicGR1IGZvciBtZ210IHRhc2suXG4iKTsKKwkJZ290byByZXF1ZXVlX3Rhc2s7CisJfQorCWl0dCA9IHRhc2stPmhkci0+aXR0OworCXRhc2stPmhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcik7CiAJbWVtY3B5KHRhc2stPmhkciwgaGRyLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOworCisJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkgeworCQlpZiAoc2Vzc2lvbi0+dHQtPnBhcnNlX3BkdV9pdHQpCisJCQl0YXNrLT5oZHItPml0dCA9IGl0dDsKKwkJZWxzZQorCQkJdGFzay0+aGRyLT5pdHQgPSBidWlsZF9pdHQodGFzay0+aXR0LAorCQkJCQkJICAgdGFzay0+Y29ubi0+c2Vzc2lvbi0+YWdlKTsKKwl9CisKIAlJTklUX0xJU1RfSEVBRCgmdGFzay0+cnVubmluZyk7CiAJbGlzdF9hZGRfdGFpbCgmdGFzay0+cnVubmluZywgJmNvbm4tPm1nbXRxdWV1ZSk7CiAKIAlpZiAoc2Vzc2lvbi0+dHQtPmNhcHMgJiBDQVBfREFUQV9QQVRIX09GRkxPQUQpIHsKLQkJaWYgKGlzY3NpX3ByZXBfbWdtdF90YXNrKGNvbm4sIHRhc2spKSB7Ci0JCQlfX2lzY3NpX3B1dF90YXNrKHRhc2spOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwkJaWYgKGlzY3NpX3ByZXBfbWdtdF90YXNrKGNvbm4sIHRhc2spKQorCQkJZ290byBmcmVlX3Rhc2s7CiAKIAkJaWYgKHNlc3Npb24tPnR0LT54bWl0X3Rhc2sodGFzaykpCi0JCQl0YXNrID0gTlVMTDsKKwkJCWdvdG8gZnJlZV90YXNrOwogCiAJfSBlbHNlCiAJCXNjc2lfcXVldWVfd29yayhjb25uLT5zZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwogCiAJcmV0dXJuIHRhc2s7CisKK2ZyZWVfdGFzazoKKwlfX2lzY3NpX3B1dF90YXNrKHRhc2spOworCXJldHVybiBOVUxMOworCityZXF1ZXVlX3Rhc2s6CisJaWYgKHRhc2sgIT0gY29ubi0+bG9naW5fdGFzaykKKwkJX19rZmlmb19wdXQoc2Vzc2lvbi0+Y21kcG9vbC5xdWV1ZSwgKHZvaWQqKSZ0YXNrLAorCQkJICAgIHNpemVvZih2b2lkKikpOworCXJldHVybiBOVUxMOwogfQogCiBpbnQgaXNjc2lfY29ubl9zZW5kX3BkdShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIsCkBAIC03MDksNyArNzYwLDYgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfcmVqZWN0ICpyZWplY3QgPSAoc3RydWN0IGlzY3NpX3JlamVjdCAqKWhkcjsKIAlzdHJ1Y3QgaXNjc2lfaGRyIHJlamVjdGVkX3BkdTsKLQl1aW50MzJfdCBpdHQ7CiAKIAljb25uLT5leHBfc3RhdHNuID0gYmUzMl90b19jcHUocmVqZWN0LT5zdGF0c24pICsgMTsKIApAQCAtNzE5LDEwICs3NjksOSBAQAogCiAJCWlmIChudG9oMjQocmVqZWN0LT5kbGVuZ3RoKSA+PSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpIHsKIAkJCW1lbWNweSgmcmVqZWN0ZWRfcGR1LCBkYXRhLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwotCQkJaXR0ID0gZ2V0X2l0dChyZWplY3RlZF9wZHUuaXR0KTsKIAkJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAotCQkJCQkgICJpdHQgMHgleCBoYWQgcGR1IChvcCAweCV4KSByZWplY3RlZCAiCi0JCQkJCSAgImR1ZSB0byBEYXRhRGlnZXN0IGVycm9yLlxuIiwgaXR0LAorCQkJCQkgICJwZHUgKG9wIDB4JXgpIHJlamVjdGVkICIKKwkJCQkJICAiZHVlIHRvIERhdGFEaWdlc3QgZXJyb3IuXG4iLAogCQkJCQkgIHJlamVjdGVkX3BkdS5vcGNvZGUpOwogCQl9CiAJfQpAQCAtNzQyLDEyICs3OTEsMTUgQEAKIHN0YXRpYyBzdHJ1Y3QgaXNjc2lfdGFzayAqaXNjc2lfaXR0X3RvX3Rhc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGl0dF90IGl0dCkKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0JdWludDMyX3QgaTsKKwlpbnQgaTsKIAogCWlmIChpdHQgPT0gUkVTRVJWRURfSVRUKQogCQlyZXR1cm4gTlVMTDsKIAotCWkgPSBnZXRfaXR0KGl0dCk7CisJaWYgKHNlc3Npb24tPnR0LT5wYXJzZV9wZHVfaXR0KQorCQlzZXNzaW9uLT50dC0+cGFyc2VfcGR1X2l0dChjb25uLCBpdHQsICZpLCBOVUxMKTsKKwllbHNlCisJCWkgPSBnZXRfaXR0KGl0dCk7CiAJaWYgKGkgPj0gc2Vzc2lvbi0+Y21kc19tYXgpCiAJCXJldHVybiBOVUxMOwogCkBAIC05MjIsMjAgKzk3NCwyNSBAQAogaW50IGlzY3NpX3ZlcmlmeV9pdHQoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIGl0dF90IGl0dCkKIHsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0JdWludDMyX3QgaTsKKwlpbnQgYWdlID0gMCwgaSA9IDA7CiAKIAlpZiAoaXR0ID09IFJFU0VSVkVEX0lUVCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoKChfX2ZvcmNlIHUzMilpdHQgJiBJU0NTSV9BR0VfTUFTSykgIT0KLQkgICAgKHNlc3Npb24tPmFnZSA8PCBJU0NTSV9BR0VfU0hJRlQpKSB7CisJaWYgKHNlc3Npb24tPnR0LT5wYXJzZV9wZHVfaXR0KQorCQlzZXNzaW9uLT50dC0+cGFyc2VfcGR1X2l0dChjb25uLCBpdHQsICZpLCAmYWdlKTsKKwllbHNlIHsKKwkJaSA9IGdldF9pdHQoaXR0KTsKKwkJYWdlID0gKChfX2ZvcmNlIHUzMilpdHQgPj4gSVNDU0lfQUdFX1NISUZUKSAmIElTQ1NJX0FHRV9NQVNLOworCX0KKworCWlmIChhZ2UgIT0gc2Vzc2lvbi0+YWdlKSB7CiAJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAogCQkJCSAgInJlY2VpdmVkIGl0dCAleCBleHBlY3RlZCBzZXNzaW9uIGFnZSAoJXgpXG4iLAogCQkJCSAgKF9fZm9yY2UgdTMyKWl0dCwgc2Vzc2lvbi0+YWdlKTsKIAkJcmV0dXJuIElTQ1NJX0VSUl9CQURfSVRUOwogCX0KIAotCWkgPSBnZXRfaXR0KGl0dCk7CiAJaWYgKGkgPj0gc2Vzc2lvbi0+Y21kc19tYXgpIHsKIAkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCiAJCQkJICAicmVjZWl2ZWQgaW52YWxpZCBpdHQgaW5kZXggJXUgKG1heCBjbWRzICIKQEAgLTExMzYsOCArMTE5MywxMyBAQAogCQkJZmFpbF9jb21tYW5kKGNvbm4sIGNvbm4tPnRhc2ssIERJRF9JTU1fUkVUUlkgPDwgMTYpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKGlzY3NpX3ByZXBfc2NzaV9jbWRfcGR1KGNvbm4tPnRhc2spKSB7Ci0JCQlmYWlsX2NvbW1hbmQoY29ubiwgY29ubi0+dGFzaywgRElEX0FCT1JUIDw8IDE2KTsKKwkJcmMgPSBpc2NzaV9wcmVwX3Njc2lfY21kX3BkdShjb25uLT50YXNrKTsKKwkJaWYgKHJjKSB7CisJCQlpZiAocmMgPT0gLUVOT01FTSkgeworCQkJCWNvbm4tPnRhc2sgPSBOVUxMOworCQkJCWdvdG8gYWdhaW47CisJCQl9IGVsc2UKKwkJCQlmYWlsX2NvbW1hbmQoY29ubiwgY29ubi0+dGFzaywgRElEX0FCT1JUIDw8IDE2KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXJjID0gaXNjc2lfeG1pdF90YXNrKGNvbm4pOwpAQCAtMTE5NSw2ICsxMjU3LDI2IEBACiAJfSB3aGlsZSAocmMgPj0gMCB8fCByYyA9PSAtRUFHQUlOKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNjc2lfdGFzayAqaXNjc2lfYWxsb2NfdGFzayhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKKwkJCQkJCSAgc3RydWN0IHNjc2lfY21uZCAqc2MpCit7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisKKwlpZiAoIV9fa2ZpZm9fZ2V0KGNvbm4tPnNlc3Npb24tPmNtZHBvb2wucXVldWUsCisJCQkgKHZvaWQgKikgJnRhc2ssIHNpemVvZih2b2lkICopKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzYy0+U0NwLnBoYXNlID0gY29ubi0+c2Vzc2lvbi0+YWdlOworCXNjLT5TQ3AucHRyID0gKGNoYXIgKikgdGFzazsKKworCWF0b21pY19zZXQoJnRhc2stPnJlZmNvdW50LCAxKTsKKwl0YXNrLT5zdGF0ZSA9IElTQ1NJX1RBU0tfUEVORElORzsKKwl0YXNrLT5jb25uID0gY29ubjsKKwl0YXNrLT5zYyA9IHNjOworCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5ydW5uaW5nKTsKKwlyZXR1cm4gdGFzazsKK30KKwogZW51bSB7CiAJRkFJTFVSRV9CQURfSE9TVCA9IDEsCiAJRkFJTFVSRV9TRVNTSU9OX0ZBSUxFRCwKQEAgLTEyODEsMzMgKzEzNjMsMjcgQEAKIAkJZ290byByZWplY3Q7CiAJfQogCi0JaWYgKCFfX2tmaWZvX2dldChzZXNzaW9uLT5jbWRwb29sLnF1ZXVlLCAodm9pZCopJnRhc2ssCi0JCQkgc2l6ZW9mKHZvaWQqKSkpIHsKKwl0YXNrID0gaXNjc2lfYWxsb2NfdGFzayhjb25uLCBzYyk7CisJaWYgKCF0YXNrKSB7CiAJCXJlYXNvbiA9IEZBSUxVUkVfT09NOwogCQlnb3RvIHJlamVjdDsKIAl9Ci0Jc2MtPlNDcC5waGFzZSA9IHNlc3Npb24tPmFnZTsKLQlzYy0+U0NwLnB0ciA9IChjaGFyICopdGFzazsKLQotCWF0b21pY19zZXQoJnRhc2stPnJlZmNvdW50LCAxKTsKLQl0YXNrLT5zdGF0ZSA9IElTQ1NJX1RBU0tfUEVORElORzsKLQl0YXNrLT5jb25uID0gY29ubjsKLQl0YXNrLT5zYyA9IHNjOwotCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5ydW5uaW5nKTsKIAlsaXN0X2FkZF90YWlsKCZ0YXNrLT5ydW5uaW5nLCAmY29ubi0+eG1pdHF1ZXVlKTsKIAogCWlmIChzZXNzaW9uLT50dC0+Y2FwcyAmIENBUF9EQVRBX1BBVEhfT0ZGTE9BRCkgewotCQlpZiAoaXNjc2lfcHJlcF9zY3NpX2NtZF9wZHUodGFzaykpIHsKLQkJCXNjLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCQlzYy0+c2NzaV9kb25lID0gTlVMTDsKLQkJCWlzY3NpX2NvbXBsZXRlX2NvbW1hbmQodGFzayk7Ci0JCQlnb3RvIGZhdWx0OworCQlyZWFzb24gPSBpc2NzaV9wcmVwX3Njc2lfY21kX3BkdSh0YXNrKTsKKwkJaWYgKHJlYXNvbikgeworCQkJaWYgKHJlYXNvbiA9PSAtRU5PTUVNKSB7CisJCQkJcmVhc29uID0gRkFJTFVSRV9PT007CisJCQkJZ290byBwcmVwZF9yZWplY3Q7CisJCQl9IGVsc2UgeworCQkJCXNjLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJZ290byBwcmVwZF9mYXVsdDsKKwkJCX0KIAkJfQogCQlpZiAoc2Vzc2lvbi0+dHQtPnhtaXRfdGFzayh0YXNrKSkgewotCQkJc2MtPnNjc2lfZG9uZSA9IE5VTEw7Ci0JCQlpc2NzaV9jb21wbGV0ZV9jb21tYW5kKHRhc2spOwogCQkJcmVhc29uID0gRkFJTFVSRV9TRVNTSU9OX05PVF9SRUFEWTsKLQkJCWdvdG8gcmVqZWN0OworCQkJZ290byBwcmVwZF9yZWplY3Q7CiAJCX0KIAl9IGVsc2UKIAkJc2NzaV9xdWV1ZV93b3JrKHNlc3Npb24tPmhvc3QsICZjb25uLT54bWl0d29yayk7CkBAIC0xMzE3LDEyICsxMzkzLDE4IEBACiAJc3Bpbl9sb2NrKGhvc3QtPmhvc3RfbG9jayk7CiAJcmV0dXJuIDA7CiAKK3ByZXBkX3JlamVjdDoKKwlzYy0+c2NzaV9kb25lID0gTlVMTDsKKwlpc2NzaV9jb21wbGV0ZV9jb21tYW5kKHRhc2spOwogcmVqZWN0OgogCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIAlkZWJ1Z19zY3NpKCJjbWQgMHgleCByZWplY3RlZCAoJWQpXG4iLCBzYy0+Y21uZFswXSwgcmVhc29uKTsKIAlzcGluX2xvY2soaG9zdC0+aG9zdF9sb2NrKTsKIAlyZXR1cm4gU0NTSV9NTFFVRVVFX1RBUkdFVF9CVVNZOwogCitwcmVwZF9mYXVsdDoKKwlzYy0+c2NzaV9kb25lID0gTlVMTDsKKwlpc2NzaV9jb21wbGV0ZV9jb21tYW5kKHRhc2spOwogZmF1bHQ6CiAJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwogCWRlYnVnX3Njc2koImlzY3NpOiBjbWQgMHgleCBpcyBub3QgcXVldWVkICglZClcbiIsIHNjLT5jbW5kWzBdLCByZWFzb24pOwpAQCAtMTYzNCw5ICsxNzE2LDkgQEAKIAloZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfVE1GVU5DIHwgSVNDU0lfT1BfSU1NRURJQVRFOwogCWhkci0+ZmxhZ3MgPSBJU0NTSV9UTV9GVU5DX0FCT1JUX1RBU0sgJiBJU0NTSV9GTEFHX1RNX0ZVTkNfTUFTSzsKIAloZHItPmZsYWdzIHw9IElTQ1NJX0ZMQUdfQ01EX0ZJTkFMOwotCW1lbWNweShoZHItPmx1biwgdGFzay0+aGRyLT5sdW4sIHNpemVvZihoZHItPmx1bikpOwotCWhkci0+cnR0ID0gdGFzay0+aGRyLT5pdHQ7Ci0JaGRyLT5yZWZjbWRzbiA9IHRhc2stPmhkci0+Y21kc247CisJbWVtY3B5KGhkci0+bHVuLCB0YXNrLT5sdW4sIHNpemVvZihoZHItPmx1bikpOworCWhkci0+cnR0ID0gdGFzay0+aGRyX2l0dDsKKwloZHItPnJlZmNtZHNuID0gdGFzay0+Y21kc247CiB9CiAKIGludCBpc2NzaV9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKQEAgLTIyMjMsNyArMjMwNSw4IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAotCWRhdGEgPSBrbWFsbG9jKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkgZ2V0X29yZGVyKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOKSk7CiAJaWYgKCFkYXRhKQogCQlnb3RvIGxvZ2luX3Rhc2tfZGF0YV9hbGxvY19mYWlsOwogCWNvbm4tPmxvZ2luX3Rhc2stPmRhdGEgPSBjb25uLT5kYXRhID0gZGF0YTsKQEAgLTIyOTQsNyArMjM3Nyw4IEBACiAJaXNjc2lfc3VzcGVuZF90eChjb25uKTsKIAogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0Ja2ZyZWUoY29ubi0+ZGF0YSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgY29ubi0+ZGF0YSwKKwkJICAgZ2V0X29yZGVyKElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOKSk7CiAJa2ZyZWUoY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKIAlfX2tmaWZvX3B1dChzZXNzaW9uLT5jbWRwb29sLnF1ZXVlLCAodm9pZCopJmNvbm4tPmxvZ2luX3Rhc2ssCiAJCSAgICBzaXplb2Yodm9pZCopKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ1ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCkBAIC0wLDAgKzEsMTE2MyBAQAorLyoKKyAqIGlTQ1NJIG92ZXIgVENQL0lQIERhdGEtUGF0aCBsaWIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRG1pdHJ5IFl1c3Vwb3YKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbGV4IEFpem1hbgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwNiBNaWtlIENocmlzdGllCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIG1haW50YWluZWQgYnkgb3Blbi1pc2NzaUBnb29nbGVncm91cHMuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENyZWRpdHM6CisgKglDaHJpc3RvcGggSGVsbHdpZworICoJRlVKSVRBIFRvbW9ub3JpCisgKglBcm5lIFJlZGxpY2gKKyAqCVpoZW55dSBXYW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorCisjaW5jbHVkZSAiaXNjc2lfdGNwLmgiCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgQ2hyaXN0aWUgPG1pY2hhZWxjQGNzLndpc2MuZWR1PiwgIgorCSAgICAgICJEbWl0cnkgWXVzdXBvdiA8ZG1pdHJ5X3l1c0B5YWhvby5jb20+LCAiCisJICAgICAgIkFsZXggQWl6bWFuIDxpdG43ODBAeWFob28uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpU0NTSS9UQ1AgZGF0YS1wYXRoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjdW5kZWYgREVCVUdfVENQCisKKyNpZmRlZiBERUJVR19UQ1AKKyNkZWZpbmUgZGVidWdfdGNwKGZtdC4uLikgcHJpbnRrKEtFUk5fSU5GTyAidGNwOiAiIGZtdCkKKyNlbHNlCisjZGVmaW5lIGRlYnVnX3RjcChmbXQuLi4pCisjZW5kaWYKKworc3RhdGljIGludCBpc2NzaV90Y3BfaGRyX3JlY3ZfZG9uZShzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uLAorCQkJCSAgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KTsKKworLyoKKyAqIFNjYXR0ZXJsaXN0IGhhbmRsaW5nOiBpbnNpZGUgdGhlIGlzY3NpX3NlZ21lbnQsIHdlCisgKiByZW1lbWJlciBhbiBpbmRleCBpbnRvIHRoZSBzY2F0dGVybGlzdCwgYW5kIHNldCBkYXRhL3NpemUKKyAqIHRvIHRoZSBjdXJyZW50IHNjYXR0ZXJsaXN0IGVudHJ5LiBGb3IgaGlnaG1lbSBwYWdlcywgd2UKKyAqIGttYXAgYXMgbmVlZGVkLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcGFnZSBpcyB1bm1hcHBlZCB3aGVuIHdlIHJldHVybiBmcm9tCisgKiBUQ1AncyBkYXRhX3JlYWR5IGhhbmRsZXIsIHNvIHdlIG1heSBlbmQgdXAgbWFwcGluZyBhbmQKKyAqIHVubWFwcGluZyB0aGUgc2FtZSBwYWdlIHJlcGVhdGVkbHkuIFRoZSB3aG9sZSByZWFzb24KKyAqIGZvciB0aGlzIGlzIHRoYXQgd2Ugc2hvdWxkbid0IGtlZXAgdGhlIHBhZ2UgbWFwcGVkCisgKiBvdXRzaWRlIHRoZSBzb2Z0aXJxLgorICovCisKKy8qKgorICogaXNjc2lfdGNwX3NlZ21lbnRfaW5pdF9zZyAtIGluaXQgaW5kaWNhdGVkIHNjYXR0ZXJsaXN0IGVudHJ5CisgKiBAc2VnbWVudDogdGhlIGJ1ZmZlciBvYmplY3QKKyAqIEBzZzogc2NhdHRlcmxpc3QKKyAqIEBvZmZzZXQ6IGJ5dGUgb2Zmc2V0IGludG8gdGhhdCBzZyBlbnRyeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgc2VnbWVudCBzbyB0aGF0IHN1YnNlcXVlbnQKKyAqIGRhdGEgaXMgY29waWVkIHRvIHRoZSBpbmRpY2F0ZWQgc2cgZW50cnksIGF0IHRoZSBnaXZlbgorICogb2Zmc2V0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lzY3NpX3RjcF9zZWdtZW50X2luaXRfc2coc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc2VnbWVudC0+c2cgPSBzZzsKKwlzZWdtZW50LT5zZ19vZmZzZXQgPSBvZmZzZXQ7CisJc2VnbWVudC0+c2l6ZSA9IG1pbihzZy0+bGVuZ3RoIC0gb2Zmc2V0LAorCQkJICAgIHNlZ21lbnQtPnRvdGFsX3NpemUgLSBzZWdtZW50LT50b3RhbF9jb3BpZWQpOworCXNlZ21lbnQtPmRhdGEgPSBOVUxMOworfQorCisvKioKKyAqIGlzY3NpX3RjcF9zZWdtZW50X21hcCAtIG1hcCB0aGUgY3VycmVudCBTL0cgcGFnZQorICogQHNlZ21lbnQ6IGlzY3NpX3NlZ21lbnQKKyAqIEByZWN2OiAxIGlmIGNhbGxlZCBmcm9tIHJlY3YgcGF0aAorICoKKyAqIFdlIG9ubHkgbmVlZCB0byBwb3NzaWJseSBrbWFwIGRhdGEgaWYgc2NhdHRlciBsaXN0cyBhcmUgYmVpbmcgdXNlZCwKKyAqIGJlY2F1c2UgdGhlIGlzY3NpIHBhc3N0aHJvdWdoIGFuZCBpbnRlcm5hbCBJTyBwYXRocyB3aWxsIG5ldmVyIHVzZSBoaWdoCisgKiBtZW0gcGFnZXMuCisgKi8KK3N0YXRpYyB2b2lkIGlzY3NpX3RjcF9zZWdtZW50X21hcChzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwgaW50IHJlY3YpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCWlmIChzZWdtZW50LT5kYXRhICE9IE5VTEwgfHwgIXNlZ21lbnQtPnNnKQorCQlyZXR1cm47CisKKwlzZyA9IHNlZ21lbnQtPnNnOworCUJVR19PTihzZWdtZW50LT5zZ19tYXBwZWQpOworCUJVR19PTihzZy0+bGVuZ3RoID09IDApOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gb25lIGl0IGlzIG9rIHRvIHNlbmQKKwkgKiB0byB0aGUgbmV0d29yayBsYXllcidzIHplcm8gY29weSBzZW5kIHBhdGguIElmIG5vdCB3ZQorCSAqIGhhdmUgdG8gZ28gdGhlIHNsb3cgc2VuZG1zZyBwYXRoLiBXZSBhbHdheXMgbWFwIGZvciB0aGUKKwkgKiByZWN2IHBhdGguCisJICovCisJaWYgKHBhZ2VfY291bnQoc2dfcGFnZShzZykpID49IDEgJiYgIXJlY3YpCisJCXJldHVybjsKKworCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3NlZ21lbnRfbWFwICVzICVwXG4iLCByZWN2ID8gInJlY3YiIDogInhtaXQiLAorCQkgIHNlZ21lbnQpOworCXNlZ21lbnQtPnNnX21hcHBlZCA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9TT0ZUSVJRMCk7CisJc2VnbWVudC0+ZGF0YSA9IHNlZ21lbnQtPnNnX21hcHBlZCArIHNnLT5vZmZzZXQgKyBzZWdtZW50LT5zZ19vZmZzZXQ7Cit9CisKK3ZvaWQgaXNjc2lfdGNwX3NlZ21lbnRfdW5tYXAoc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQpCit7CisJZGVidWdfdGNwKCJpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCAlcFxuIiwgc2VnbWVudCk7CisKKwlpZiAoc2VnbWVudC0+c2dfbWFwcGVkKSB7CisJCWRlYnVnX3RjcCgiaXNjc2lfdGNwX3NlZ21lbnRfdW5tYXAgdmFsaWRcbiIpOworCQlrdW5tYXBfYXRvbWljKHNlZ21lbnQtPnNnX21hcHBlZCwgS01fU09GVElSUTApOworCQlzZWdtZW50LT5zZ19tYXBwZWQgPSBOVUxMOworCQlzZWdtZW50LT5kYXRhID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3Bfc2VnbWVudF91bm1hcCk7CisKKy8qCisgKiBTcGxpY2UgdGhlIGRpZ2VzdCBidWZmZXIgaW50byB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXNjc2lfdGNwX3NlZ21lbnRfc3BsaWNlX2RpZ2VzdChzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwgdm9pZCAqZGlnZXN0KQoreworCXNlZ21lbnQtPmRhdGEgPSBkaWdlc3Q7CisJc2VnbWVudC0+ZGlnZXN0X2xlbiA9IElTQ1NJX0RJR0VTVF9TSVpFOworCXNlZ21lbnQtPnRvdGFsX3NpemUgKz0gSVNDU0lfRElHRVNUX1NJWkU7CisJc2VnbWVudC0+c2l6ZSA9IElTQ1NJX0RJR0VTVF9TSVpFOworCXNlZ21lbnQtPmNvcGllZCA9IDA7CisJc2VnbWVudC0+c2cgPSBOVUxMOworCXNlZ21lbnQtPmhhc2ggPSBOVUxMOworfQorCisvKioKKyAqIGlzY3NpX3RjcF9zZWdtZW50X2RvbmUgLSBjaGVjayB3aGV0aGVyIHRoZSBzZWdtZW50IGlzIGNvbXBsZXRlCisgKiBAdGNwX2Nvbm46IGlzY3NpIHRjcCBjb25uZWN0aW9uCisgKiBAc2VnbWVudDogaXNjc2kgc2VnbWVudCB0byBjaGVjaworICogQHJlY3Y6IHNldCB0byBvbmUgb2YgdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgcmVjdiBwYXRoCisgKiBAY29waWVkOiBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKgorICogQ2hlY2sgaWYgd2UncmUgZG9uZSByZWNlaXZpbmcgdGhpcyBzZWdtZW50LiBJZiB0aGUgcmVjZWl2ZQorICogYnVmZmVyIGlzIGZ1bGwgYnV0IHdlIGV4cGVjdCBtb3JlIGRhdGEsIG1vdmUgb24gdG8gdGhlCisgKiBuZXh0IGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdC4KKyAqCisgKiBJZiB0aGUgYW1vdW50IG9mIGRhdGEgd2UgcmVjZWl2ZWQgaXNuJ3QgYSBtdWx0aXBsZSBvZiA0LAorICogd2Ugd2lsbCB0cmFuc3BhcmVudGx5IHJlY2VpdmUgdGhlIHBhZCBieXRlcywgdG9vLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSByZS1lbnRyYW50LgorICovCitpbnQgaXNjc2lfdGNwX3NlZ21lbnRfZG9uZShzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uLAorCQkJICAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsIGludCByZWN2LAorCQkJICAgdW5zaWduZWQgY29waWVkKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZGJ1ZltJU0NTSV9QQURfTEVOXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJdW5zaWduZWQgaW50IHBhZDsKKworCWRlYnVnX3RjcCgiY29waWVkICV1ICV1IHNpemUgJXUgJXNcbiIsIHNlZ21lbnQtPmNvcGllZCwgY29waWVkLAorCQkgIHNlZ21lbnQtPnNpemUsIHJlY3YgPyAicmVjdiIgOiAieG1pdCIpOworCWlmIChzZWdtZW50LT5oYXNoICYmIGNvcGllZCkgeworCQkvKgorCQkgKiBJZiBhIHNlZ21lbnQgaXMga21hcGQgd2UgbXVzdCB1bm1hcCBpdCBiZWZvcmUgc2VuZGluZworCQkgKiB0byB0aGUgY3J5cHRvIGxheWVyIHNpbmNlIHRoYXQgd2lsbCB0cnkgdG8ga21hcCBpdCBhZ2Fpbi4KKwkJICovCisJCWlzY3NpX3RjcF9zZWdtZW50X3VubWFwKHNlZ21lbnQpOworCisJCWlmICghc2VnbWVudC0+ZGF0YSkgeworCQkJc2dfaW5pdF90YWJsZSgmc2csIDEpOworCQkJc2dfc2V0X3BhZ2UoJnNnLCBzZ19wYWdlKHNlZ21lbnQtPnNnKSwgY29waWVkLAorCQkJCSAgICBzZWdtZW50LT5jb3BpZWQgKyBzZWdtZW50LT5zZ19vZmZzZXQgKworCQkJCQkJCXNlZ21lbnQtPnNnLT5vZmZzZXQpOworCQl9IGVsc2UKKwkJCXNnX2luaXRfb25lKCZzZywgc2VnbWVudC0+ZGF0YSArIHNlZ21lbnQtPmNvcGllZCwKKwkJCQkgICAgY29waWVkKTsKKwkJY3J5cHRvX2hhc2hfdXBkYXRlKHNlZ21lbnQtPmhhc2gsICZzZywgY29waWVkKTsKKwl9CisKKwlzZWdtZW50LT5jb3BpZWQgKz0gY29waWVkOworCWlmIChzZWdtZW50LT5jb3BpZWQgPCBzZWdtZW50LT5zaXplKSB7CisJCWlzY3NpX3RjcF9zZWdtZW50X21hcChzZWdtZW50LCByZWN2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VnbWVudC0+dG90YWxfY29waWVkICs9IHNlZ21lbnQtPmNvcGllZDsKKwlzZWdtZW50LT5jb3BpZWQgPSAwOworCXNlZ21lbnQtPnNpemUgPSAwOworCisJLyogVW5tYXAgdGhlIGN1cnJlbnQgc2NhdHRlcmxpc3QgcGFnZSwgaWYgdGhlcmUgaXMgb25lLiAqLworCWlzY3NpX3RjcF9zZWdtZW50X3VubWFwKHNlZ21lbnQpOworCisJLyogRG8gd2UgaGF2ZSBtb3JlIHNjYXR0ZXJsaXN0IGVudHJpZXM/ICovCisJZGVidWdfdGNwKCJ0b3RhbCBjb3BpZWQgJXUgdG90YWwgc2l6ZSAldVxuIiwgc2VnbWVudC0+dG90YWxfY29waWVkLAorCQkgICBzZWdtZW50LT50b3RhbF9zaXplKTsKKwlpZiAoc2VnbWVudC0+dG90YWxfY29waWVkIDwgc2VnbWVudC0+dG90YWxfc2l6ZSkgeworCQkvKiBQcm9jZWVkIHRvIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdC4gKi8KKwkJaXNjc2lfdGNwX3NlZ21lbnRfaW5pdF9zZyhzZWdtZW50LCBzZ19uZXh0KHNlZ21lbnQtPnNnKSwKKwkJCQkJICAwKTsKKwkJaXNjc2lfdGNwX3NlZ21lbnRfbWFwKHNlZ21lbnQsIHJlY3YpOworCQlCVUdfT04oc2VnbWVudC0+c2l6ZSA9PSAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRG8gd2UgbmVlZCB0byBoYW5kbGUgcGFkZGluZz8gKi8KKwlpZiAoISh0Y3BfY29ubi0+aXNjc2lfY29ubi0+c2Vzc2lvbi0+dHQtPmNhcHMgJiBDQVBfUEFERElOR19PRkZMT0FEKSkgeworCQlwYWQgPSBpc2NzaV9wYWRkaW5nKHNlZ21lbnQtPnRvdGFsX2NvcGllZCk7CisJCWlmIChwYWQgIT0gMCkgeworCQkJZGVidWdfdGNwKCJjb25zdW1lICVkIHBhZCBieXRlc1xuIiwgcGFkKTsKKwkJCXNlZ21lbnQtPnRvdGFsX3NpemUgKz0gcGFkOworCQkJc2VnbWVudC0+c2l6ZSA9IHBhZDsKKwkJCXNlZ21lbnQtPmRhdGEgPSBwYWRidWY7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogU2V0IHVzIHVwIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGRhdGEgZGlnZXN0LiBoZHIgZGlnZXN0CisJICogaXMgY29tcGxldGVseSBoYW5kbGVkIGluIGhkciBkb25lIGZ1bmN0aW9uLgorCSAqLworCWlmIChzZWdtZW50LT5oYXNoKSB7CisJCWNyeXB0b19oYXNoX2ZpbmFsKHNlZ21lbnQtPmhhc2gsIHNlZ21lbnQtPmRpZ2VzdCk7CisJCWlzY3NpX3RjcF9zZWdtZW50X3NwbGljZV9kaWdlc3Qoc2VnbWVudCwKKwkJCQkgcmVjdiA/IHNlZ21lbnQtPnJlY3ZfZGlnZXN0IDogc2VnbWVudC0+ZGlnZXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3Bfc2VnbWVudF9kb25lKTsKKworLyoqCisgKiBpc2NzaV90Y3Bfc2VnbWVudF9yZWN2IC0gY29weSBkYXRhIHRvIHNlZ21lbnQKKyAqIEB0Y3BfY29ubjogdGhlIGlTQ1NJIFRDUCBjb25uZWN0aW9uCisgKiBAc2VnbWVudDogdGhlIGJ1ZmZlciB0byBjb3B5IHRvCisgKiBAcHRyOiBkYXRhIHBvaW50ZXIKKyAqIEBsZW46IGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIHVwIHRvIEBsZW4gYnl0ZXMgdG8gdGhlCisgKiBnaXZlbiBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIGNvbnN1bWVkLCB3aGljaCBjYW4gYWN0dWFsbHkgYmUgbGVzcyB0aGFuIEBsZW4uCisgKgorICogSWYgaGFzaCBkaWdlc3QgaXMgZW5hYmxlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIHRoZQorICogaGFzaCB3aGlsZSBjb3B5aW5nLgorICogQ29tYmluaW5nIHRoZXNlIHR3byBvcGVyYXRpb25zIGRvZXNuJ3QgYnV5IHVzIGEgbG90ICh5ZXQpLAorICogYnV0IGluIHRoZSBmdXR1cmUgd2UgY291bGQgaW1wbGVtZW50IGNvbWJpbmVkIGNvcHkrY3JjLAorICoganVzdCB3YXkgd2UgZG8gZm9yIG5ldHdvcmsgbGF5ZXIgY2hlY2tzdW1zLgorICovCitzdGF0aWMgaW50Citpc2NzaV90Y3Bfc2VnbWVudF9yZWN2KHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCisJCSAgICAgICBzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwgY29uc3Qgdm9pZCAqcHRyLAorCQkgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgY29weSA9IDAsIGNvcGllZCA9IDA7CisKKwl3aGlsZSAoIWlzY3NpX3RjcF9zZWdtZW50X2RvbmUodGNwX2Nvbm4sIHNlZ21lbnQsIDEsIGNvcHkpKSB7CisJCWlmIChjb3BpZWQgPT0gbGVuKSB7CisJCQlkZWJ1Z190Y3AoImlzY3NpX3RjcF9zZWdtZW50X3JlY3YgY29waWVkICVkIGJ5dGVzXG4iLAorCQkJCSAgbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY29weSA9IG1pbihsZW4gLSBjb3BpZWQsIHNlZ21lbnQtPnNpemUgLSBzZWdtZW50LT5jb3BpZWQpOworCQlkZWJ1Z190Y3AoImlzY3NpX3RjcF9zZWdtZW50X3JlY3YgY29weWluZyAlZFxuIiwgY29weSk7CisJCW1lbWNweShzZWdtZW50LT5kYXRhICsgc2VnbWVudC0+Y29waWVkLCBwdHIgKyBjb3BpZWQsIGNvcHkpOworCQljb3BpZWQgKz0gY29weTsKKwl9CisJcmV0dXJuIGNvcGllZDsKK30KKworaW5saW5lIHZvaWQKK2lzY3NpX3RjcF9kZ3N0X2hlYWRlcihzdHJ1Y3QgaGFzaF9kZXNjICpoYXNoLCBjb25zdCB2b2lkICpoZHIsIHNpemVfdCBoZHJsZW4sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0W0lTQ1NJX0RJR0VTVF9TSVpFXSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwlzZ19pbml0X29uZSgmc2csIGhkciwgaGRybGVuKTsKKwljcnlwdG9faGFzaF9kaWdlc3QoaGFzaCwgJnNnLCBoZHJsZW4sIGRpZ2VzdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3BfZGdzdF9oZWFkZXIpOworCitzdGF0aWMgaW5saW5lIGludAoraXNjc2lfdGNwX2Rnc3RfdmVyaWZ5KHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCisJCSAgICAgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQoreworCWlmICghc2VnbWVudC0+ZGlnZXN0X2xlbikKKwkJcmV0dXJuIDE7CisKKwlpZiAobWVtY21wKHNlZ21lbnQtPnJlY3ZfZGlnZXN0LCBzZWdtZW50LT5kaWdlc3QsCisJCSAgIHNlZ21lbnQtPmRpZ2VzdF9sZW4pKSB7CisJCWRlYnVnX3Njc2koImRpZ2VzdCBtaXNtYXRjaFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCBzZWdtZW50IGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXNjc2lfc2VnbWVudF9pbml0KHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50LCBzaXplX3Qgc2l6ZSwKKwkJICAgICBpc2NzaV9zZWdtZW50X2RvbmVfZm5fdCAqZG9uZSwgc3RydWN0IGhhc2hfZGVzYyAqaGFzaCkKK3sKKwltZW1zZXQoc2VnbWVudCwgMCwgc2l6ZW9mKCpzZWdtZW50KSk7CisJc2VnbWVudC0+dG90YWxfc2l6ZSA9IHNpemU7CisJc2VnbWVudC0+ZG9uZSA9IGRvbmU7CisKKwlpZiAoaGFzaCkgeworCQlzZWdtZW50LT5oYXNoID0gaGFzaDsKKwkJY3J5cHRvX2hhc2hfaW5pdChoYXNoKTsKKwl9Cit9CisKK2lubGluZSB2b2lkCitpc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50LCB2b2lkICpkYXRhLAorCQkJICBzaXplX3Qgc2l6ZSwgaXNjc2lfc2VnbWVudF9kb25lX2ZuX3QgKmRvbmUsCisJCQkgIHN0cnVjdCBoYXNoX2Rlc2MgKmhhc2gpCit7CisJX19pc2NzaV9zZWdtZW50X2luaXQoc2VnbWVudCwgc2l6ZSwgZG9uZSwgaGFzaCk7CisJc2VnbWVudC0+ZGF0YSA9IGRhdGE7CisJc2VnbWVudC0+c2l6ZSA9IHNpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKTsKKworaW5saW5lIGludAoraXNjc2lfc2VnbWVudF9zZWVrX3NnKHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50LAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2xpc3QsIHVuc2lnbmVkIGludCBzZ19jb3VudCwKKwkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsCisJCSAgICAgIGlzY3NpX3NlZ21lbnRfZG9uZV9mbl90ICpkb25lLCBzdHJ1Y3QgaGFzaF9kZXNjICpoYXNoKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IGk7CisKKwlkZWJ1Z19zY3NpKCJpc2NzaV9zZWdtZW50X3NlZWtfc2cgb2Zmc2V0ICV1IHNpemUgJWxsdVxuIiwKKwkJICBvZmZzZXQsIHNpemUpOworCV9faXNjc2lfc2VnbWVudF9pbml0KHNlZ21lbnQsIHNpemUsIGRvbmUsIGhhc2gpOworCWZvcl9lYWNoX3NnKHNnX2xpc3QsIHNnLCBzZ19jb3VudCwgaSkgeworCQlkZWJ1Z19zY3NpKCJzZyAlZCwgbGVuICV1IG9mZnNldCAldVxuIiwgaSwgc2ctPmxlbmd0aCwKKwkJCSAgIHNnLT5vZmZzZXQpOworCQlpZiAob2Zmc2V0IDwgc2ctPmxlbmd0aCkgeworCQkJaXNjc2lfdGNwX3NlZ21lbnRfaW5pdF9zZyhzZWdtZW50LCBzZywgb2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisJCW9mZnNldCAtPSBzZy0+bGVuZ3RoOworCX0KKworCXJldHVybiBJU0NTSV9FUlJfREFUQV9PRkZTRVQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zZWdtZW50X3NlZWtfc2cpOworCisvKioKKyAqIGlzY3NpX3RjcF9oZHJfcmVjdl9wcmVwIC0gcHJlcCBzZWdtZW50IGZvciBoZHIgcmVjZXB0aW9uCisgKiBAdGNwX2Nvbm46IGlzY3NpIGNvbm5lY3Rpb24gdG8gcHJlcCBmb3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBwYXNzZXMgTlVMTCBmb3IgdGhlIGhhc2ggYXJndW1lbnQsIGJlY2F1c2Ugd2hlbiB0aGlzCisgKiBmdW5jdGlvbiBpcyBjYWxsZWQgd2UgZG8gbm90IHlldCBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSBoZWFkZXIgYW5kIHdhbnQKKyAqIHRvIGRlbGF5IHRoZSBkaWdlc3QgcHJvY2Vzc2luZyB1bnRpbCB3ZSBrbm93IHRoYXQuCisgKi8KK3ZvaWQgaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAoc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubikKK3sKKwlkZWJ1Z190Y3AoImlzY3NpX3RjcF9oZHJfcmVjdl9wcmVwKCVwJXMpXG4iLCB0Y3BfY29ubiwKKwkJICB0Y3BfY29ubi0+aXNjc2lfY29ubi0+aGRyZGdzdF9lbiA/ICIsIGRpZ2VzdCBlbmFibGVkIiA6ICIiKTsKKwlpc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKCZ0Y3BfY29ubi0+aW4uc2VnbWVudCwKKwkJCQl0Y3BfY29ubi0+aW4uaGRyX2J1Ziwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpLAorCQkJCWlzY3NpX3RjcF9oZHJfcmVjdl9kb25lLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9oZHJfcmVjdl9wcmVwKTsKKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyByZXBseSB0byBhbnkgb3RoZXIgdHlwZSBvZiBjb21tYW5kCisgKi8KK3N0YXRpYyBpbnQKK2lzY3NpX3RjcF9kYXRhX3JlY3ZfZG9uZShzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uLAorCQkJIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGNwX2Nvbm4tPmlzY3NpX2Nvbm47CisJaW50IHJjID0gMDsKKworCWlmICghaXNjc2lfdGNwX2Rnc3RfdmVyaWZ5KHRjcF9jb25uLCBzZWdtZW50KSkKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBX0RHU1Q7CisKKwlyYyA9IGlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCB0Y3BfY29ubi0+aW4uaGRyLAorCQkJY29ubi0+ZGF0YSwgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAodGNwX2Nvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraXNjc2lfdGNwX2RhdGFfcmVjdl9wcmVwKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4pCit7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSB0Y3BfY29ubi0+aXNjc2lfY29ubjsKKwlzdHJ1Y3QgaGFzaF9kZXNjICpyeF9oYXNoID0gTlVMTDsKKworCWlmIChjb25uLT5kYXRhZGdzdF9lbiAmCisJICAgICEoY29ubi0+c2Vzc2lvbi0+dHQtPmNhcHMgJiBDQVBfRElHRVNUX09GRkxPQUQpKQorCQlyeF9oYXNoID0gdGNwX2Nvbm4tPnJ4X2hhc2g7CisKKwlpc2NzaV9zZWdtZW50X2luaXRfbGluZWFyKCZ0Y3BfY29ubi0+aW4uc2VnbWVudCwKKwkJCQljb25uLT5kYXRhLCB0Y3BfY29ubi0+aW4uZGF0YWxlbiwKKwkJCQlpc2NzaV90Y3BfZGF0YV9yZWN2X2RvbmUsIHJ4X2hhc2gpOworfQorCisvKioKKyAqIGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2sgLSBmcmVlIHRjcF90YXNrIHJlc291cmNlcworICogQHRhc2s6IGlzY3NpIHRhc2sKKyAqCisgKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jaworICovCit2b2lkIGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3IydF9pbmZvICpyMnQ7CisKKwkvKiBub3RoaW5nIHRvIGRvIGZvciBtZ210IG9yIHBlbmRpbmcgdGFza3MgKi8KKwlpZiAoIXRhc2stPnNjIHx8IHRhc2stPnN0YXRlID09IElTQ1NJX1RBU0tfUEVORElORykKKwkJcmV0dXJuOworCisJLyogZmx1c2ggdGFzaydzIHIydCBxdWV1ZXMgKi8KKwl3aGlsZSAoX19rZmlmb19nZXQodGNwX3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnIydCwgc2l6ZW9mKHZvaWQqKSkpIHsKKwkJX19rZmlmb19wdXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAorCQkJICAgIHNpemVvZih2b2lkKikpOworCQlkZWJ1Z19zY3NpKCJpc2NzaV90Y3BfY2xlYW51cF90YXNrIHBlbmRpbmcgcjJ0IGRyb3BwZWRcbiIpOworCX0KKworCXIydCA9IHRjcF90YXNrLT5yMnQ7CisJaWYgKHIydCAhPSBOVUxMKSB7CisJCV9fa2ZpZm9fcHV0KHRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKKwkJCSAgICBzaXplb2Yodm9pZCopKTsKKwkJdGNwX3Rhc2stPnIydCA9IE5VTEw7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdGNwX2NsZWFudXBfdGFzayk7CisKKy8qKgorICogaXNjc2lfdGNwX2RhdGFfaW4gLSBTQ1NJIERhdGEtSW4gUmVzcG9uc2UgcHJvY2Vzc2luZworICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KKyAqIEB0YXNrOiBzY3NpIGNvbW1hbmQgdGFzaworICovCitzdGF0aWMgaW50IGlzY3NpX3RjcF9kYXRhX2luKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfZGF0YV9yc3AgKnJoZHIgPSAoc3RydWN0IGlzY3NpX2RhdGFfcnNwICopdGNwX2Nvbm4tPmluLmhkcjsKKwlpbnQgZGF0YXNuID0gYmUzMl90b19jcHUocmhkci0+ZGF0YXNuKTsKKwl1bnNpZ25lZCB0b3RhbF9pbl9sZW5ndGggPSBzY3NpX2luKHRhc2stPnNjKS0+bGVuZ3RoOworCisJaXNjc2lfdXBkYXRlX2NtZHNuKGNvbm4tPnNlc3Npb24sIChzdHJ1Y3QgaXNjc2lfbm9waW4qKXJoZHIpOworCWlmICh0Y3BfY29ubi0+aW4uZGF0YWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICh0Y3BfdGFzay0+ZXhwX2RhdGFzbiAhPSBkYXRhc24pIHsKKwkJZGVidWdfdGNwKCIlczogdGFzay0+ZXhwX2RhdGFzbiglZCkgIT0gcmhkci0+ZGF0YXNuKCVkKVxuIiwKKwkJICAgICAgICAgIF9fZnVuY19fLCB0Y3BfdGFzay0+ZXhwX2RhdGFzbiwgZGF0YXNuKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBU047CisJfQorCisJdGNwX3Rhc2stPmV4cF9kYXRhc24rKzsKKworCXRjcF90YXNrLT5kYXRhX29mZnNldCA9IGJlMzJfdG9fY3B1KHJoZHItPm9mZnNldCk7CisJaWYgKHRjcF90YXNrLT5kYXRhX29mZnNldCArIHRjcF9jb25uLT5pbi5kYXRhbGVuID4gdG90YWxfaW5fbGVuZ3RoKSB7CisJCWRlYnVnX3RjcCgiJXM6IGRhdGFfb2Zmc2V0KCVkKSArIGRhdGFfbGVuKCVkKSA+IHRvdGFsX2xlbmd0aF9pbiglZClcbiIsCisJCSAgICAgICAgICBfX2Z1bmNfXywgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAorCQkgICAgICAgICAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sIHRvdGFsX2luX2xlbmd0aCk7CisJCXJldHVybiBJU0NTSV9FUlJfREFUQV9PRkZTRVQ7CisJfQorCisJY29ubi0+ZGF0YWluX3BkdXNfY250Kys7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNjc2lfdGNwX3IydF9yc3AgLSBpU0NTSSBSMlQgUmVzcG9uc2UgcHJvY2Vzc2luZworICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KKyAqIEB0YXNrOiBzY3NpIGNvbW1hbmQgdGFzaworICovCitzdGF0aWMgaW50IGlzY3NpX3RjcF9yMnRfcnNwKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CisJc3RydWN0IGlzY3NpX3RjcF90YXNrICp0Y3BfdGFzayA9IHRhc2stPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3IydF9yc3AgKnJoZHIgPSAoc3RydWN0IGlzY3NpX3IydF9yc3AgKil0Y3BfY29ubi0+aW4uaGRyOworCXN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqcjJ0OworCWludCByMnRzbiA9IGJlMzJfdG9fY3B1KHJoZHItPnIydHNuKTsKKwlpbnQgcmM7CisKKwlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMnQgd2l0aCBkYXRhbGVuICVkXG4iLAorCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOworCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47CisJfQorCisJaWYgKHRjcF90YXNrLT5leHBfZGF0YXNuICE9IHIydHNuKXsKKwkJZGVidWdfdGNwKCIlczogdGFzay0+ZXhwX2RhdGFzbiglZCkgIT0gcmhkci0+cjJ0c24oJWQpXG4iLAorCQkgICAgICAgICAgX19mdW5jX18sIHRjcF90YXNrLT5leHBfZGF0YXNuLCByMnRzbik7CisJCXJldHVybiBJU0NTSV9FUlJfUjJUU047CisJfQorCisJLyogZmlsbC1pbiBuZXcgUjJUIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayAqLworCWlzY3NpX3VwZGF0ZV9jbWRzbihzZXNzaW9uLCAoc3RydWN0IGlzY3NpX25vcGluKilyaGRyKTsKKworCWlmICghdGFzay0+c2MgfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fSU5GTywgY29ubiwKKwkJCQkgICJkcm9wcGluZyBSMlQgaXR0ICVkIGluIHJlY292ZXJ5LlxuIiwKKwkJCQkgIHRhc2stPml0dCk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gX19rZmlmb19nZXQodGNwX3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKKwlpZiAoIXJjKSB7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLCAiQ291bGQgbm90IGFsbG9jYXRlIFIyVC4gIgorCQkJCSAgIlRhcmdldCBoYXMgc2VudCBtb3JlIFIyVHMgdGhhbiBpdCAiCisJCQkJICAibmVnb3RpYXRlZCBmb3Igb3IgZHJpdmVyIGhhcyBoYXMgbGVha2VkLlxuIik7CisJCXJldHVybiBJU0NTSV9FUlJfUFJPVE87CisJfQorCisJcjJ0LT5leHBfc3RhdHNuID0gcmhkci0+c3RhdHNuOworCXIydC0+ZGF0YV9sZW5ndGggPSBiZTMyX3RvX2NwdShyaGRyLT5kYXRhX2xlbmd0aCk7CisJaWYgKHIydC0+ZGF0YV9sZW5ndGggPT0gMCkgeworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOworCQlfX2tmaWZvX3B1dCh0Y3BfdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQqKSZyMnQsCisJCQkgICAgc2l6ZW9mKHZvaWQqKSk7CisJCXJldHVybiBJU0NTSV9FUlJfREFUQUxFTjsKKwl9CisKKwlpZiAocjJ0LT5kYXRhX2xlbmd0aCA+IHNlc3Npb24tPm1heF9idXJzdCkKKwkJZGVidWdfc2NzaSgiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhbmQgbWF4IGJ1cnN0ICV1LiIKKwkJCSAgICJBdHRlbXB0aW5nIHRvIGV4ZWN1dGUgcmVxdWVzdC5cbiIsCisJCQkgICAgcjJ0LT5kYXRhX2xlbmd0aCwgc2Vzc2lvbi0+bWF4X2J1cnN0KTsKKworCXIydC0+ZGF0YV9vZmZzZXQgPSBiZTMyX3RvX2NwdShyaGRyLT5kYXRhX29mZnNldCk7CisJaWYgKHIydC0+ZGF0YV9vZmZzZXQgKyByMnQtPmRhdGFfbGVuZ3RoID4gc2NzaV9vdXQodGFzay0+c2MpLT5sZW5ndGgpIHsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhdCBvZmZzZXQgJXUgIgorCQkJCSAgImFuZCB0b3RhbCBsZW5ndGggJWRcbiIsIHIydC0+ZGF0YV9sZW5ndGgsCisJCQkJICByMnQtPmRhdGFfb2Zmc2V0LCBzY3NpX291dCh0YXNrLT5zYyktPmxlbmd0aCk7CisJCV9fa2ZpZm9fcHV0KHRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLCAodm9pZCopJnIydCwKKwkJCSAgICBzaXplb2Yodm9pZCopKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOworCX0KKworCXIydC0+dHR0ID0gcmhkci0+dHR0OyAvKiBubyBmbGlwICovCisJcjJ0LT5kYXRhc24gPSAwOworCXIydC0+c2VudCA9IDA7CisKKwl0Y3BfdGFzay0+ZXhwX2RhdGFzbiA9IHIydHNuICsgMTsKKwlfX2tmaWZvX3B1dCh0Y3BfdGFzay0+cjJ0cXVldWUsICh2b2lkKikmcjJ0LCBzaXplb2Yodm9pZCopKTsKKwljb25uLT5yMnRfcGR1c19jbnQrKzsKKworCWlzY3NpX3JlcXVldWVfdGFzayh0YXNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBpbmNvbWluZyByZXBseSB0byBEYXRhSW4gY29tbWFuZAorICovCitzdGF0aWMgaW50Citpc2NzaV90Y3BfcHJvY2Vzc19kYXRhX2luKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCisJCQkgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gdGNwX2Nvbm4tPmlzY3NpX2Nvbm47CisJc3RydWN0IGlzY3NpX2hkciAqaGRyID0gdGNwX2Nvbm4tPmluLmhkcjsKKwlpbnQgcmM7CisKKwlpZiAoIWlzY3NpX3RjcF9kZ3N0X3ZlcmlmeSh0Y3BfY29ubiwgc2VnbWVudCkpCisJCXJldHVybiBJU0NTSV9FUlJfREFUQV9ER1NUOworCisJLyogY2hlY2sgZm9yIG5vbi1leGNlcHRpb25hbCBzdGF0dXMgKi8KKwlpZiAoaGRyLT5mbGFncyAmIElTQ1NJX0ZMQUdfREFUQV9TVEFUVVMpIHsKKwkJcmMgPSBpc2NzaV9jb21wbGV0ZV9wZHUoY29ubiwgdGNwX2Nvbm4tPmluLmhkciwgTlVMTCwgMCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlpc2NzaV90Y3BfaGRyX3JlY3ZfcHJlcCh0Y3BfY29ubik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNjc2lfdGNwX2hkcl9kaXNzZWN0IC0gcHJvY2VzcyBQRFUgaGVhZGVyCisgKiBAY29ubjogaVNDU0kgY29ubmVjdGlvbgorICogQGhkcjogUERVIGhlYWRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgdGhlIGhlYWRlciBvZiB0aGUgUERVIHJlY2VpdmVkLAorICogYW5kIHBlcmZvcm1zIHNldmVyYWwgc2FuaXR5IGNoZWNrcy4gSWYgdGhlIFBEVSBpcyBhY2NvbXBhbmllZAorICogYnkgZGF0YSwgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIHNldCB1cCB0byBjb3B5IHRoZSBpbmNvbWluZyBkYXRhCisgKiB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4KKyAqLworc3RhdGljIGludAoraXNjc2lfdGNwX2hkcl9kaXNzZWN0KHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3QgaXNjc2lfaGRyICpoZHIpCit7CisJaW50IHJjID0gMCwgb3Bjb2RlLCBhaHNsZW47CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisKKwkvKiB2ZXJpZnkgUERVIGxlbmd0aCAqLworCXRjcF9jb25uLT5pbi5kYXRhbGVuID0gbnRvaDI0KGhkci0+ZGxlbmd0aCk7CisJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuID4gY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCkgeworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkgICJpc2NzaV90Y3A6IGRhdGFsZW4gJWQgPiAlZFxuIiwKKwkJCQkgIHRjcF9jb25uLT5pbi5kYXRhbGVuLCBjb25uLT5tYXhfcmVjdl9kbGVuZ3RoKTsKKwkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOworCX0KKworCS8qIEFkZGl0aW9uYWwgaGVhZGVyIHNlZ21lbnRzLiBTbyBmYXIsIHdlIGRvbid0CisJICogcHJvY2VzcyBhZGRpdGlvbmFsIGhlYWRlcnMuCisJICovCisJYWhzbGVuID0gaGRyLT5obGVuZ3RoIDw8IDI7CisKKwlvcGNvZGUgPSBoZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLOworCS8qIHZlcmlmeSBpdHQgKGl0dCBlbmNvZGluZzogYWdlK2NpZCtpdHQpICovCisJcmMgPSBpc2NzaV92ZXJpZnlfaXR0KGNvbm4sIGhkci0+aXR0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWRlYnVnX3RjcCgib3Bjb2RlIDB4JXggYWhzbGVuICVkIGRhdGFsZW4gJWRcbiIsCisJCSAgb3Bjb2RlLCBhaHNsZW4sIHRjcF9jb25uLT5pbi5kYXRhbGVuKTsKKworCXN3aXRjaChvcGNvZGUpIHsKKwljYXNlIElTQ1NJX09QX1NDU0lfREFUQV9JTjoKKwkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7CisJCWlmICghdGFzaykKKwkJCXJjID0gSVNDU0lfRVJSX0JBRF9JVFQ7CisJCWVsc2UKKwkJCXJjID0gaXNjc2lfdGNwX2RhdGFfaW4oY29ubiwgdGFzayk7CisJCWlmIChyYykgeworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKKwkJCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCQkJc3RydWN0IGhhc2hfZGVzYyAqcnhfaGFzaCA9IE5VTEw7CisJCQlzdHJ1Y3Qgc2NzaV9kYXRhX2J1ZmZlciAqc2RiID0gc2NzaV9pbih0YXNrLT5zYyk7CisKKwkJCS8qCisJCQkgKiBTZXR1cCBjb3B5IG9mIERhdGEtSW4gaW50byB0aGUgU2NzaV9DbW5kCisJCQkgKiBTY2F0dGVybGlzdCBjYXNlOgorCQkJICogV2Ugc2V0IHVwIHRoZSBpc2NzaV9zZWdtZW50IHRvIHBvaW50IHRvIHRoZSBuZXh0CisJCQkgKiBzY2F0dGVybGlzdCBlbnRyeSB0byBjb3B5IHRvLiBBcyB3ZSBnbyBhbG9uZywKKwkJCSAqIHdlIG1vdmUgb24gdG8gdGhlIG5leHQgc2NhdHRlcmxpc3QgZW50cnkgYW5kCisJCQkgKiB1cGRhdGUgdGhlIGRpZ2VzdCBwZXItZW50cnkuCisJCQkgKi8KKwkJCWlmIChjb25uLT5kYXRhZGdzdF9lbiAmJgorCQkJICAgICEoY29ubi0+c2Vzc2lvbi0+dHQtPmNhcHMgJiBDQVBfRElHRVNUX09GRkxPQUQpKQorCQkJCXJ4X2hhc2ggPSB0Y3BfY29ubi0+cnhfaGFzaDsKKworCQkJZGVidWdfdGNwKCJpc2NzaV90Y3BfYmVnaW5fZGF0YV9pbiglcCwgb2Zmc2V0PSVkLCAiCisJCQkJICAiZGF0YWxlbj0lZClcbiIsIHRjcF9jb25uLAorCQkJCSAgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAorCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4pOworCQkJcmMgPSBpc2NzaV9zZWdtZW50X3NlZWtfc2coJnRjcF9jb25uLT5pbi5zZWdtZW50LAorCQkJCQkJICAgc2RiLT50YWJsZS5zZ2wsCisJCQkJCQkgICBzZGItPnRhYmxlLm5lbnRzLAorCQkJCQkJICAgdGNwX3Rhc2stPmRhdGFfb2Zmc2V0LAorCQkJCQkJICAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sCisJCQkJCQkgICBpc2NzaV90Y3BfcHJvY2Vzc19kYXRhX2luLAorCQkJCQkJICAgcnhfaGFzaCk7CisJCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmMgPSBfX2lzY3NpX2NvbXBsZXRlX3BkdShjb25uLCBoZHIsIE5VTEwsIDApOworCQlzcGluX3VubG9jaygmY29ubi0+c2Vzc2lvbi0+bG9jayk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfT1BfU0NTSV9DTURfUlNQOgorCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKKwkJCWlzY3NpX3RjcF9kYXRhX3JlY3ZfcHJlcCh0Y3BfY29ubik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyYyA9IGlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCBoZHIsIE5VTEwsIDApOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX1IyVDoKKwkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKwkJdGFzayA9IGlzY3NpX2l0dF90b19jdGFzayhjb25uLCBoZHItPml0dCk7CisJCWlmICghdGFzaykKKwkJCXJjID0gSVNDU0lfRVJSX0JBRF9JVFQ7CisJCWVsc2UgaWYgKGFoc2xlbikKKwkJCXJjID0gSVNDU0lfRVJSX0FIU0xFTjsKKwkJZWxzZSBpZiAodGFzay0+c2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCQlyYyA9IGlzY3NpX3RjcF9yMnRfcnNwKGNvbm4sIHRhc2spOworCQllbHNlCisJCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKKwkJc3Bpbl91bmxvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX0xPR0lOX1JTUDoKKwljYXNlIElTQ1NJX09QX1RFWFRfUlNQOgorCWNhc2UgSVNDU0lfT1BfUkVKRUNUOgorCWNhc2UgSVNDU0lfT1BfQVNZTkNfRVZFTlQ6CisJCS8qCisJCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgY291bGQgZ2V0IGEgUERVIHdpdGggYSBidWZmZXIgbGFyZ2VyCisJCSAqIHRoYW4gOEssIGJ1dCB0aGVyZSBhcmUgbm8gdGFyZ2V0cyB0aGF0IGN1cnJlbnRseSBkbyB0aGlzLgorCQkgKiBGb3Igbm93IHdlIGZhaWwgdW50aWwgd2UgZmluZCBhIHZlbmRvciB0aGF0IG5lZWRzIGl0CisJCSAqLworCQlpZiAoSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4gPCB0Y3BfY29ubi0+aW4uZGF0YWxlbikgeworCQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJCSAgImlzY3NpX3RjcDogcmVjZWl2ZWQgYnVmZmVyIG9mICIKKwkJCQkJICAibGVuICV1IGJ1dCBjb25uIGJ1ZmZlciBpcyBvbmx5ICV1ICIKKwkJCQkJICAiKG9wY29kZSAlMHgpXG4iLAorCQkJCQkgIHRjcF9jb25uLT5pbi5kYXRhbGVuLAorCQkJCQkgIElTQ1NJX0RFRl9NQVhfUkVDVl9TRUdfTEVOLCBvcGNvZGUpOworCQkJcmMgPSBJU0NTSV9FUlJfUFJPVE87CisJCQlicmVhazsKKwkJfQorCisJCS8qIElmIHRoZXJlJ3MgZGF0YSBjb21pbmcgaW4gd2l0aCB0aGUgcmVzcG9uc2UsCisJCSAqIHJlY2VpdmUgaXQgdG8gdGhlIGNvbm5lY3Rpb24ncyBidWZmZXIuCisJCSAqLworCQlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4pIHsKKwkJCWlzY3NpX3RjcF9kYXRhX3JlY3ZfcHJlcCh0Y3BfY29ubik7CisJCQlyZXR1cm4gMDsKKwkJfQorCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgSVNDU0lfT1BfTE9HT1VUX1JTUDoKKwljYXNlIElTQ1NJX09QX05PT1BfSU46CisJY2FzZSBJU0NTSV9PUF9TQ1NJX1RNRlVOQ19SU1A6CisJCXJjID0gaXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIGhkciwgTlVMTCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CisJCWJyZWFrOworCX0KKworCWlmIChyYyA9PSAwKSB7CisJCS8qIEFueXRoaW5nIHRoYXQgY29tZXMgd2l0aCBkYXRhIHNob3VsZCBoYXZlCisJCSAqIGJlZW4gaGFuZGxlZCBhYm92ZS4gKi8KKwkJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuKQorCQkJcmV0dXJuIElTQ1NJX0VSUl9QUk9UTzsKKwkJaXNjc2lfdGNwX2hkcl9yZWN2X3ByZXAodGNwX2Nvbm4pOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpc2NzaV90Y3BfaGRyX3JlY3ZfZG9uZSAtIHByb2Nlc3MgUERVIGhlYWRlcgorICoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgUERVIGhlYWRlciBoYXMKKyAqIGJlZW4gcmVjZWl2ZWQuIElmIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYWRkaXRpb25hbAorICogaGVhZGVyIHNlZ21lbnRzLCB3ZSBnbyBiYWNrIGZvciBtb3JlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK2lzY3NpX3RjcF9oZHJfcmVjdl9kb25lKHN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4sCisJCQlzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCkKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRjcF9jb25uLT5pc2NzaV9jb25uOworCXN0cnVjdCBpc2NzaV9oZHIgKmhkcjsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGhlYWRlciBzZWdtZW50cworCSAqICpwcmlvciogdG8gY29tcHV0aW5nIHRoZSBkaWdlc3QsIGJlY2F1c2Ugd2UKKwkgKiBtYXkgbmVlZCB0byBnbyBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIG1vcmUuCisJICovCisJaGRyID0gKHN0cnVjdCBpc2NzaV9oZHIgKikgdGNwX2Nvbm4tPmluLmhkcl9idWY7CisJaWYgKHNlZ21lbnQtPmNvcGllZCA9PSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikgJiYgaGRyLT5obGVuZ3RoKSB7CisJCS8qIEJ1bXAgdGhlIGhlYWRlciBsZW5ndGggLSB0aGUgY2FsbGVyIHdpbGwKKwkJICoganVzdCBsb29wIGFyb3VuZCBhbmQgZ2V0IHRoZSBBSFMgZm9yIHVzLCBhbmQKKwkJICogY2FsbCBhZ2Fpbi4gKi8KKwkJdW5zaWduZWQgaW50IGFoc2xlbiA9IGhkci0+aGxlbmd0aCA8PCAyOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyAqLworCQlpZiAoc2l6ZW9mKCpoZHIpICsgYWhzbGVuID4gc2l6ZW9mKHRjcF9jb25uLT5pbi5oZHJfYnVmKSkKKwkJCXJldHVybiBJU0NTSV9FUlJfQUhTTEVOOworCisJCXNlZ21lbnQtPnRvdGFsX3NpemUgKz0gYWhzbGVuOworCQlzZWdtZW50LT5zaXplICs9IGFoc2xlbjsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UncmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBoZWFkZXIuIFNlZSBpZiB3ZSdyZSBkb2luZworCSAqIGhlYWRlciBkaWdlc3RzOyBpZiBzbywgc2V0IHVwIHRoZSByZWN2X2RpZ2VzdCBidWZmZXIKKwkgKiBhbmQgZ28gYmFjayBmb3IgbW9yZS4gKi8KKwlpZiAoY29ubi0+aGRyZGdzdF9lbiAmJgorCSAgICAhKGNvbm4tPnNlc3Npb24tPnR0LT5jYXBzICYgQ0FQX0RJR0VTVF9PRkZMT0FEKSkgeworCQlpZiAoc2VnbWVudC0+ZGlnZXN0X2xlbiA9PSAwKSB7CisJCQkvKgorCQkJICogRXZlbiBpZiB3ZSBvZmZsb2FkIHRoZSBkaWdlc3QgcHJvY2Vzc2luZyB3ZQorCQkJICogc3BsaWNlIGl0IGluIHNvIHdlIGNhbiBpbmNyZW1lbnQgdGhlIHNrYi9zZWdtZW50CisJCQkgKiBjb3VudGVycyBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIGRhdGEgc2VnbWVudC4KKwkJCSAqLworCQkJaXNjc2lfdGNwX3NlZ21lbnRfc3BsaWNlX2RpZ2VzdChzZWdtZW50LAorCQkJCQkJCXNlZ21lbnQtPnJlY3ZfZGlnZXN0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaXNjc2lfdGNwX2Rnc3RfaGVhZGVyKHRjcF9jb25uLT5yeF9oYXNoLCBoZHIsCisJCQkJICAgICAgc2VnbWVudC0+dG90YWxfY29waWVkIC0gSVNDU0lfRElHRVNUX1NJWkUsCisJCQkJICAgICAgc2VnbWVudC0+ZGlnZXN0KTsKKworCQlpZiAoIWlzY3NpX3RjcF9kZ3N0X3ZlcmlmeSh0Y3BfY29ubiwgc2VnbWVudCkpCisJCQlyZXR1cm4gSVNDU0lfRVJSX0hEUl9ER1NUOworCX0KKworCXRjcF9jb25uLT5pbi5oZHIgPSBoZHI7CisJcmV0dXJuIGlzY3NpX3RjcF9oZHJfZGlzc2VjdChjb25uLCBoZHIpOworfQorCisvKioKKyAqIGlzY3NpX3RjcF9yZWN2X3NlZ21lbnRfaXNfaGRyIC0gdGVzdHMgaWYgd2UgYXJlIHJlYWRpbmcgaW4gYSBoZWFkZXIKKyAqIEB0Y3BfY29ubjogaXNjc2kgdGNwIGNvbm4KKyAqCisgKiByZXR1cm5zIG5vbiB6ZXJvIGlmIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBvciBzZXR1cCB0byBwcm9jZXNzCisgKiBhIGhlYWRlci4KKyAqLworaW5saW5lIGludCBpc2NzaV90Y3BfcmVjdl9zZWdtZW50X2lzX2hkcihzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uKQoreworCXJldHVybiB0Y3BfY29ubi0+aW4uc2VnbWVudC5kb25lID09IGlzY3NpX3RjcF9oZHJfcmVjdl9kb25lOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdGNwX3JlY3Zfc2VnbWVudF9pc19oZHIpOworCisvKioKKyAqIGlzY3NpX3RjcF9yZWN2X3NrYiAtIFByb2Nlc3Mgc2tiCisgKiBAY29ubjogaXNjc2kgY29ubmVjdGlvbgorICogQHNrYjogbmV0d29yayBidWZmZXIgd2l0aCBoZWFkZXIgYW5kL29yIGRhdGEgc2VnbWVudAorICogQG9mZnNldDogb2Zmc2V0IGluIHNrYgorICogQG9mZmxvYWQ6IGJvb2wgaW5kaWNhdGluZyBpZiB0cmFuc2ZlciB3YXMgb2ZmbG9hZGVkCisgKgorICogV2lsbCByZXR1cm4gc3RhdHVzIG9mIHRyYW5zZmVyIGluIHN0YXR1cy4gQW5kIHdpbGwgcmV0dXJuCisgKiBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgorICovCitpbnQgaXNjc2lfdGNwX3JlY3Zfc2tiKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgYm9vbCBvZmZsb2FkZWQsIGludCAqc3RhdHVzKQoreworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50ID0gJnRjcF9jb25uLT5pbi5zZWdtZW50OworCXN0cnVjdCBza2Jfc2VxX3N0YXRlIHNlcTsKKwl1bnNpZ25lZCBpbnQgY29uc3VtZWQgPSAwOworCWludCByYyA9IDA7CisKKwlkZWJ1Z190Y3AoImluICVkIGJ5dGVzXG4iLCBza2ItPmxlbiAtIG9mZnNldCk7CisKKwlpZiAodW5saWtlbHkoY29ubi0+c3VzcGVuZF9yeCkpIHsKKwkJZGVidWdfdGNwKCJjb25uICVkIFJ4IHN1c3BlbmRlZCFcbiIsIGNvbm4tPmlkKTsKKwkJKnN0YXR1cyA9IElTQ1NJX1RDUF9TVVNQRU5ERUQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChvZmZsb2FkZWQpIHsKKwkJc2VnbWVudC0+dG90YWxfY29waWVkID0gc2VnbWVudC0+dG90YWxfc2l6ZTsKKwkJZ290byBzZWdtZW50X2RvbmU7CisJfQorCisJc2tiX3ByZXBhcmVfc2VxX3JlYWQoc2tiLCBvZmZzZXQsIHNrYi0+bGVuLCAmc2VxKTsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBpbnQgYXZhaWw7CisJCWNvbnN0IHU4ICpwdHI7CisKKwkJYXZhaWwgPSBza2Jfc2VxX3JlYWQoY29uc3VtZWQsICZwdHIsICZzZXEpOworCQlpZiAoYXZhaWwgPT0gMCkgeworCQkJZGVidWdfdGNwKCJubyBtb3JlIGRhdGEgYXZhaWwuIENvbnN1bWVkICVkXG4iLAorCQkJCSAgY29uc3VtZWQpOworCQkJKnN0YXR1cyA9IElTQ1NJX1RDUF9TS0JfRE9ORTsKKwkJCXNrYl9hYm9ydF9zZXFfcmVhZCgmc2VxKTsKKwkJCWdvdG8gc2tiX2RvbmU7CisJCX0KKwkJQlVHX09OKHNlZ21lbnQtPmNvcGllZCA+PSBzZWdtZW50LT5zaXplKTsKKworCQlkZWJ1Z190Y3AoInNrYiAlcCBwdHI9JXAgYXZhaWw9JXVcbiIsIHNrYiwgcHRyLCBhdmFpbCk7CisJCXJjID0gaXNjc2lfdGNwX3NlZ21lbnRfcmVjdih0Y3BfY29ubiwgc2VnbWVudCwgcHRyLCBhdmFpbCk7CisJCUJVR19PTihyYyA9PSAwKTsKKwkJY29uc3VtZWQgKz0gcmM7CisKKwkJaWYgKHNlZ21lbnQtPnRvdGFsX2NvcGllZCA+PSBzZWdtZW50LT50b3RhbF9zaXplKSB7CisJCQlza2JfYWJvcnRfc2VxX3JlYWQoJnNlcSk7CisJCQlnb3RvIHNlZ21lbnRfZG9uZTsKKwkJfQorCX0KKworc2VnbWVudF9kb25lOgorCSpzdGF0dXMgPSBJU0NTSV9UQ1BfU0VHTUVOVF9ET05FOworCWRlYnVnX3RjcCgic2VnbWVudCBkb25lXG4iKTsKKwlyYyA9IHNlZ21lbnQtPmRvbmUodGNwX2Nvbm4sIHNlZ21lbnQpOworCWlmIChyYyAhPSAwKSB7CisJCSpzdGF0dXMgPSBJU0NTSV9UQ1BfQ09OTl9FUlI7CisJCWRlYnVnX3RjcCgiRXJyb3IgcmVjZWl2aW5nIFBEVSwgZXJybm89JWRcbiIsIHJjKTsKKwkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIHJjKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFRoZSBkb25lKCkgZnVuY3Rpb25zIHNldHMgdXAgdGhlIG5leHQgc2VnbWVudC4gKi8KKworc2tiX2RvbmU6CisJY29ubi0+cnhkYXRhX29jdGV0cyArPSBjb25zdW1lZDsKKwlyZXR1cm4gY29uc3VtZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3BfcmVjdl9za2IpOworCisvKioKKyAqIGlzY3NpX3RjcF90YXNrX2luaXQgLSBJbml0aWFsaXplIGlTQ1NJIFNDU0lfUkVBRCBvciBTQ1NJX1dSSVRFIGNvbW1hbmRzCisgKiBAY29ubjogaXNjc2kgY29ubmVjdGlvbgorICogQHRhc2s6IHNjc2kgY29tbWFuZCB0YXNrCisgKiBAc2M6IHNjc2kgY29tbWFuZAorICovCitpbnQgaXNjc2lfdGNwX3Rhc2tfaW5pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IHRhc2stPmNvbm47CisJc3RydWN0IHNjc2lfY21uZCAqc2MgPSB0YXNrLT5zYzsKKwlpbnQgZXJyOworCisJaWYgKCFzYykgeworCQkvKgorCQkgKiBtZ210IHRhc2tzIGRvIG5vdCBoYXZlIGEgc2NhdHRlcmxpc3Qgc2luY2UgdGhleSBjb21lCisJCSAqIGluIGZyb20gdGhlIGlzY3NpIGludGVyZmFjZS4KKwkJICovCisJCWRlYnVnX3Njc2koIm10YXNrIGRlcSBbY2lkICVkIGl0dCAweCV4XVxuIiwgY29ubi0+aWQsCisJCQkgICB0YXNrLT5pdHQpOworCisJCXJldHVybiBjb25uLT5zZXNzaW9uLT50dC0+aW5pdF9wZHUodGFzaywgMCwgdGFzay0+ZGF0YV9jb3VudCk7CisJfQorCisJQlVHX09OKF9fa2ZpZm9fbGVuKHRjcF90YXNrLT5yMnRxdWV1ZSkpOworCXRjcF90YXNrLT5leHBfZGF0YXNuID0gMDsKKworCS8qIFByZXBhcmUgUERVLCBvcHRpb25hbGx5IHcvIGltbWVkaWF0ZSBkYXRhICovCisJZGVidWdfc2NzaSgidGFzayBkZXEgW2NpZCAlZCBpdHQgMHgleCBpbW0gJWQgdW5zb2wgJWRdXG4iLAorCQkgICAgY29ubi0+aWQsIHRhc2stPml0dCwgdGFzay0+aW1tX2NvdW50LAorCQkgICAgdGFzay0+dW5zb2xfcjJ0LmRhdGFfbGVuZ3RoKTsKKworCWVyciA9IGNvbm4tPnNlc3Npb24tPnR0LT5pbml0X3BkdSh0YXNrLCAwLCB0YXNrLT5pbW1fY291bnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJdGFzay0+aW1tX2NvdW50ID0gMDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF90YXNrX2luaXQpOworCitzdGF0aWMgc3RydWN0IGlzY3NpX3IydF9pbmZvICppc2NzaV90Y3BfZ2V0X2N1cnJfcjJ0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfdGNwX3Rhc2sgKnRjcF90YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydCA9IE5VTEw7CisKKwlpZiAoaXNjc2lfdGFza19oYXNfdW5zb2xfZGF0YSh0YXNrKSkKKwkJcjJ0ID0gJnRhc2stPnVuc29sX3IydDsKKwllbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJaWYgKHRjcF90YXNrLT5yMnQpIHsKKwkJCXIydCA9IHRjcF90YXNrLT5yMnQ7CisJCQkvKiBDb250aW51ZSB3aXRoIHRoaXMgUjJUPyAqLworCQkJaWYgKHIydC0+ZGF0YV9sZW5ndGggPD0gcjJ0LT5zZW50KSB7CisJCQkJZGVidWdfc2NzaSgiICBkb25lIHdpdGggcjJ0ICVwXG4iLCByMnQpOworCQkJCV9fa2ZpZm9fcHV0KHRjcF90YXNrLT5yMnRwb29sLnF1ZXVlLAorCQkJCQkgICAgKHZvaWQgKikmdGNwX3Rhc2stPnIydCwKKwkJCQkJICAgIHNpemVvZih2b2lkICopKTsKKwkJCQl0Y3BfdGFzay0+cjJ0ID0gcjJ0ID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCWlmIChyMnQgPT0gTlVMTCkgeworCQkJX19rZmlmb19nZXQodGNwX3Rhc2stPnIydHF1ZXVlLAorCQkJCSAgICAodm9pZCAqKSZ0Y3BfdGFzay0+cjJ0LCBzaXplb2Yodm9pZCAqKSk7CisJCQlyMnQgPSB0Y3BfdGFzay0+cjJ0OworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcjJ0OworfQorCisvKioKKyAqIGlzY3NpX3RjcF90YXNrX3htaXQgLSB4bWl0IG5vcm1hbCBQRFUgdGFzaworICogQHRhc2s6IGlzY3NpIGNvbW1hbmQgdGFzaworICoKKyAqIFdlJ3JlIGV4cGVjdGVkIHRvIHJldHVybiAwIHdoZW4gZXZlcnl0aGluZyB3YXMgdHJhbnNtaXR0ZWQgc3VjY2VzZnVsbHksCisgKiAtRUFHQUlOIGlmIHRoZXJlJ3Mgc3RpbGwgZGF0YSBpbiB0aGUgcXVldWUsIG9yICE9IDAgZm9yIGFueSBvdGhlciBraW5kCisgKiBvZiBlcnJvci4KKyAqLworaW50IGlzY3NpX3RjcF90YXNrX3htaXQoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSB0YXNrLT5jb25uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8gKnIydDsKKwlpbnQgcmMgPSAwOworCitmbHVzaDoKKwkvKiBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIGZpcnN0LiAqLworCXJjID0gc2Vzc2lvbi0+dHQtPnhtaXRfcGR1KHRhc2spOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIG1nbXQgY29tbWFuZCAqLworCWlmICghdGFzay0+c2MpIHsKKwkJaWYgKHRhc2stPmhkci0+aXR0ID09IFJFU0VSVkVEX0lUVCkKKwkJCWlzY3NpX3B1dF90YXNrKHRhc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBcmUgd2UgZG9uZSBhbHJlYWR5PyAqLworCWlmICh0YXNrLT5zYy0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKKwkJcmV0dXJuIDA7CisKKwlyMnQgPSBpc2NzaV90Y3BfZ2V0X2N1cnJfcjJ0KHRhc2spOworCWlmIChyMnQgPT0gTlVMTCkgeworCQkvKiBXYWl0aW5nIGZvciBtb3JlIFIyVHMgdG8gYXJyaXZlLiAqLworCQlkZWJ1Z190Y3AoIm5vIFIyVHMgeWV0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBjb25uLT5zZXNzaW9uLT50dC0+YWxsb2NfcGR1KHRhc2ssIElTQ1NJX09QX1NDU0lfREFUQV9PVVQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlzY3NpX3ByZXBfZGF0YV9vdXRfcGR1KHRhc2ssIHIydCwgKHN0cnVjdCBpc2NzaV9kYXRhICopIHRhc2stPmhkcik7CisKKwlkZWJ1Z19zY3NpKCJzb2wgZG91dCAlcCBbZHNuICVkIGl0dCAweCV4IGRvZmYgJWQgZGxlbiAlZF1cbiIsCisJCSAgIHIydCwgcjJ0LT5kYXRhc24gLSAxLCB0YXNrLT5oZHItPml0dCwKKwkJICAgcjJ0LT5kYXRhX29mZnNldCArIHIydC0+c2VudCwgcjJ0LT5kYXRhX2NvdW50KTsKKworCXJjID0gY29ubi0+c2Vzc2lvbi0+dHQtPmluaXRfcGR1KHRhc2ssIHIydC0+ZGF0YV9vZmZzZXQgKyByMnQtPnNlbnQsCisJCQkJCSByMnQtPmRhdGFfY291bnQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXIydC0+c2VudCArPSByMnQtPmRhdGFfY291bnQ7CisJZ290byBmbHVzaDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF90YXNrX3htaXQpOworCitzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKgoraXNjc2lfdGNwX2Nvbm5fc2V0dXAoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbiwgaW50IGRkX2RhdGFfc2l6ZSwKKwkJICAgICAgdWludDMyX3QgY29ubl9pZHgpCisKK3sKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOworCXN0cnVjdCBpc2NzaV90Y3BfY29ubiAqdGNwX2Nvbm47CisKKwljbHNfY29ubiA9IGlzY3NpX2Nvbm5fc2V0dXAoY2xzX3Nlc3Npb24sIHNpemVvZigqdGNwX2Nvbm4pLCBjb25uX2lkeCk7CisJaWYgKCFjbHNfY29ubikKKwkJcmV0dXJuIE5VTEw7CisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCS8qCisJICogZHVlIHRvIHN0cmFuZ2UgaXNzdWVzIHdpdGggaXNlciB0aGVzZSBhcmUgbm90IHNldAorCSAqIGluIGlzY3NpX2Nvbm5fc2V0dXAKKwkgKi8KKwljb25uLT5tYXhfcmVjdl9kbGVuZ3RoID0gSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU47CisKKwl0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisJdGNwX2Nvbm4tPmlzY3NpX2Nvbm4gPSBjb25uOworCisJdGNwX2Nvbm4tPmRkX2RhdGEgPSBremFsbG9jKGRkX2RhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0Y3BfY29ubi0+ZGRfZGF0YSkgeworCQlpc2NzaV9jb25uX3RlYXJkb3duKGNsc19jb25uKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBjbHNfY29ubjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9jb25uX3NldHVwKTsKKwordm9pZCBpc2NzaV90Y3BfY29ubl90ZWFyZG93bihzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7CisKKwlrZnJlZSh0Y3BfY29ubi0+ZGRfZGF0YSk7CisJaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV90Y3BfY29ubl90ZWFyZG93bik7CisKK2ludCBpc2NzaV90Y3BfcjJ0cG9vbF9hbGxvYyhzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlpbnQgaTsKKwlpbnQgY21kX2k7CisKKwkvKgorCSAqIGluaXRpYWxpemUgcGVyLXRhc2s6IFIyVCBwb29sIGFuZCB4bWl0IHF1ZXVlCisJICovCisJZm9yIChjbWRfaSA9IDA7IGNtZF9pIDwgc2Vzc2lvbi0+Y21kc19tYXg7IGNtZF9pKyspIHsKKwkgICAgICAgIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrID0gc2Vzc2lvbi0+Y21kc1tjbWRfaV07CisJCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCisJCS8qCisJCSAqIHByZS1hbGxvY2F0ZWQgeDIgYXMgbXVjaCByMnRzIHRvIGhhbmRsZSByYWNlIHdoZW4KKwkJICogdGFyZ2V0IGFja3MgRGF0YU91dCBmYXN0ZXIgdGhhbiB3ZSBkYXRhX3htaXQoKSBxdWV1ZXMKKwkJICogY291bGQgcmVwbGVuaXNoIHIydHF1ZXVlLgorCQkgKi8KKworCQkvKiBSMlQgcG9vbCAqLworCQlpZiAoaXNjc2lfcG9vbF9pbml0KCZ0Y3BfdGFzay0+cjJ0cG9vbCwKKwkJCQkgICAgc2Vzc2lvbi0+bWF4X3IydCAqIDIsIE5VTEwsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfcjJ0X2luZm8pKSkgeworCQkJZ290byByMnRfYWxsb2NfZmFpbDsKKwkJfQorCisJCS8qIFIyVCB4bWl0IHF1ZXVlICovCisJCXRjcF90YXNrLT5yMnRxdWV1ZSA9IGtmaWZvX2FsbG9jKAorCQkgICAgICBzZXNzaW9uLT5tYXhfcjJ0ICogNCAqIHNpemVvZih2b2lkKiksIEdGUF9LRVJORUwsIE5VTEwpOworCQlpZiAodGNwX3Rhc2stPnIydHF1ZXVlID09IEVSUl9QVFIoLUVOT01FTSkpIHsKKwkJCWlzY3NpX3Bvb2xfZnJlZSgmdGNwX3Rhc2stPnIydHBvb2wpOworCQkJZ290byByMnRfYWxsb2NfZmFpbDsKKwkJfQorCX0KKworCXJldHVybiAwOworCityMnRfYWxsb2NfZmFpbDoKKwlmb3IgKGkgPSAwOyBpIDwgY21kX2k7IGkrKykgeworCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayA9IHNlc3Npb24tPmNtZHNbaV07CisJCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCisJCWtmaWZvX2ZyZWUodGNwX3Rhc2stPnIydHF1ZXVlKTsKKwkJaXNjc2lfcG9vbF9mcmVlKCZ0Y3BfdGFzay0+cjJ0cG9vbCk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdGNwX3IydHBvb2xfYWxsb2MpOworCit2b2lkIGlzY3NpX3RjcF9yMnRwb29sX2ZyZWUoc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2Vzc2lvbi0+Y21kc19tYXg7IGkrKykgeworCQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayA9IHNlc3Npb24tPmNtZHNbaV07CisJCXN0cnVjdCBpc2NzaV90Y3BfdGFzayAqdGNwX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOworCisJCWtmaWZvX2ZyZWUodGNwX3Rhc2stPnIydHF1ZXVlKTsKKwkJaXNjc2lfcG9vbF9mcmVlKCZ0Y3BfdGFzay0+cjJ0cG9vbCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfdGNwX3IydHBvb2xfZnJlZSk7CisKK3ZvaWQgaXNjc2lfdGNwX2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkgICAgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisKKwlzdGF0cy0+dHhkYXRhX29jdGV0cyA9IGNvbm4tPnR4ZGF0YV9vY3RldHM7CisJc3RhdHMtPnJ4ZGF0YV9vY3RldHMgPSBjb25uLT5yeGRhdGFfb2N0ZXRzOworCXN0YXRzLT5zY3NpY21kX3BkdXMgPSBjb25uLT5zY3NpY21kX3BkdXNfY250OworCXN0YXRzLT5kYXRhb3V0X3BkdXMgPSBjb25uLT5kYXRhb3V0X3BkdXNfY250OworCXN0YXRzLT5zY3NpcnNwX3BkdXMgPSBjb25uLT5zY3NpcnNwX3BkdXNfY250OworCXN0YXRzLT5kYXRhaW5fcGR1cyA9IGNvbm4tPmRhdGFpbl9wZHVzX2NudDsKKwlzdGF0cy0+cjJ0X3BkdXMgPSBjb25uLT5yMnRfcGR1c19jbnQ7CisJc3RhdHMtPnRtZmNtZF9wZHVzID0gY29ubi0+dG1mY21kX3BkdXNfY250OworCXN0YXRzLT50bWZyc3BfcGR1cyA9IGNvbm4tPnRtZnJzcF9wZHVzX2NudDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3RjcF9jb25uX2dldF9zdGF0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggNjBhOWU2ZS4uZGNiYTI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMjksOCArMjksMTAgQEAKICNkZWZpbmUgTFBGQ19NQVhfTlNfUkVUUlkJMwkvKiBOdW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgdG8gY29udGFjdAogCQkJCQkgICB0aGUgTmFtZVNlcnZlciAgYmVmb3JlIGdpdmluZyB1cC4gKi8KICNkZWZpbmUgTFBGQ19DTURfUEVSX0xVTgkzCS8qIG1heCBvdXRzdGFuZGluZyBjbWRzIHBlciBsdW4gKi8KLSNkZWZpbmUgTFBGQ19ERUZBVUxUX1NHX1NFR19DTlQJNjQJLyogc2cgZWxlbWVudCBjb3VudCBwZXIgc2NzaSBjbW5kICovCi0jZGVmaW5lIExQRkNfTUFYX1NHX1NFR19DTlQJMjU2CS8qIHNnIGVsZW1lbnQgY291bnQgcGVyIHNjc2kgY21uZCAqLworI2RlZmluZSBMUEZDX0RFRkFVTFRfU0dfU0VHX0NOVCA2NAkvKiBzZyBlbGVtZW50IGNvdW50IHBlciBzY3NpIGNtbmQgKi8KKyNkZWZpbmUgTFBGQ19ERUZBVUxUX1BST1RfU0dfU0VHX0NOVCA0MDk2IC8qIHNnIHByb3RlY3Rpb24gZWxlbWVudHMgY291bnQgKi8KKyNkZWZpbmUgTFBGQ19NQVhfU0dfU0VHX0NOVAk0MDk2CS8qIHNnIGVsZW1lbnQgY291bnQgcGVyIHNjc2kgY21uZCAqLworI2RlZmluZSBMUEZDX01BWF9QUk9UX1NHX1NFR19DTlQgNDA5NgkvKiBwcm90IHNnIGVsZW1lbnQgY291bnQgcGVyIHNjc2kgY21kKi8KICNkZWZpbmUgTFBGQ19JT0NCX0xJU1RfQ05UCTIyNTAJLyogbGlzdCBvZiBJT0NCcyBmb3IgZmFzdC1wYXRoIHVzYWdlLiAqLwogI2RlZmluZSBMUEZDX1FfUkFNUF9VUF9JTlRFUlZBTCAxMjAgICAgIC8qIGx1biBxX2RlcHRoIHJhbXAgdXAgaW50ZXJ2YWwgKi8KICNkZWZpbmUgTFBGQ19WTkFNRV9MRU4JCTEwMAkvKiB2cG9ydCBzeW1ib2xpYyBuYW1lIGxlbmd0aCAqLwpAQCAtMzU0LDggKzM1Niw2IEBACiAJdWludDhfdCBsb2FkX2ZsYWc7CiAjZGVmaW5lIEZDX0xPQURJTkcJCTB4MQkvKiBIQkEgaW4gcHJvY2VzcyBvZiBsb2FkaW5nIGRydnIgKi8KICNkZWZpbmUgRkNfVU5MT0FESU5HCQkweDIJLyogSEJBIGluIHByb2Nlc3Mgb2YgdW5sb2FkaW5nIGRydnIgKi8KLQljaGFyICAqdm5hbWU7CQkgICAgICAgIC8qIEFwcGxpY2F0aW9uIGFzc2lnbmVkIG5hbWUgKi8KLQogCS8qIFZwb3J0IENvbmZpZyBQYXJhbWV0ZXJzICovCiAJdWludDMyX3QgY2ZnX3NjYW5fZG93bjsKIAl1aW50MzJfdCBjZmdfbHVuX3F1ZXVlX2RlcHRoOwpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIAlzdHJ1Y3QgZmNfdnBvcnQgKmZjX3Zwb3J0OwogCi0jaWZkZWYgQ09ORklHX0xQRkNfREVCVUdfRlMKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZGlzY190cmM7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfbm9kZWxpc3Q7CiAJc3RydWN0IGRlbnRyeSAqdnBvcnRfZGVidWdmc19yb290OwpAQCAtNDI4LDYgKzQyOCw3IEBACiAjZGVmaW5lIExQRkNfU0xJM19WUE9SVF9URUFSRE9XTgkweDA0CiAjZGVmaW5lIExQRkNfU0xJM19DUlBfRU5BQkxFRAkJMHgwOAogI2RlZmluZSBMUEZDX1NMSTNfSU5CX0VOQUJMRUQJCTB4MTAKKyNkZWZpbmUgTFBGQ19TTEkzX0JHX0VOQUJMRUQJCTB4MjAKIAl1aW50MzJfdCBpb2NiX2NtZF9zaXplOwogCXVpbnQzMl90IGlvY2JfcnNwX3NpemU7CiAKQEAgLTUwMSwxMiArNTAyLDE0IEBACiAJdWludDMyX3QgY2ZnX3BvbGxfdG1vOwogCXVpbnQzMl90IGNmZ191c2VfbXNpOwogCXVpbnQzMl90IGNmZ19zZ19zZWdfY250OworCXVpbnQzMl90IGNmZ19wcm90X3NnX3NlZ19jbnQ7CiAJdWludDMyX3QgY2ZnX3NnX2RtYV9idWZfc2l6ZTsKIAl1aW50NjRfdCBjZmdfc29mdF93d25uOwogCXVpbnQ2NF90IGNmZ19zb2Z0X3d3cG47CiAJdWludDMyX3QgY2ZnX2hiYV9xdWV1ZV9kZXB0aDsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9yZXNldDsKIAl1aW50MzJfdCBjZmdfZW5hYmxlX2hiYV9oZWFydGJlYXQ7CisJdWludDMyX3QgY2ZnX2VuYWJsZV9iZzsKIAogCWxwZmNfdnBkX3QgdnBkOwkJLyogdml0YWwgcHJvZHVjdCBkYXRhICovCiAKQEAgLTU3Miw2ICs1NzUsOSBAQAogCXVpbnQ2NF90IGZjNElucHV0UmVxdWVzdHM7CiAJdWludDY0X3QgZmM0T3V0cHV0UmVxdWVzdHM7CiAJdWludDY0X3QgZmM0Q29udHJvbFJlcXVlc3RzOworCXVpbnQ2NF90IGJnX2d1YXJkX2Vycl9jbnQ7CisJdWludDY0X3QgYmdfYXBwdGFnX2Vycl9jbnQ7CisJdWludDY0X3QgYmdfcmVmdGFnX2Vycl9jbnQ7CiAKIAlzdHJ1Y3QgbHBmY19zeXNmc19tYm94IHN5c2ZzX21ib3g7CiAKQEAgLTU5NCw2ICs2MDAsOCBAQAogCiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBsaW5rX3N0YXRzOwogCWVudW0gaW50cl90eXBlX3QgaW50cl90eXBlOworCXVpbnQzMl90IGludHJfbW9kZTsKKyNkZWZpbmUgTFBGQ19JTlRSX0VSUk9SCTB4RkZGRkZGRkYKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbTFBGQ19NU0lYX1ZFQ1RPUlNdOwogCiAJc3RydWN0IGxpc3RfaGVhZCBwb3J0X2xpc3Q7CkBAIC02MTMsMTIgKzYyMSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF9yc3JjX2Vycm9yX3RpbWU7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3JhbXBfZG93bl90aW1lOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9yYW1wX3VwX3RpbWU7Ci0jaWZkZWYgQ09ORklHX0xQRkNfREVCVUdfRlMKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAJc3RydWN0IGRlbnRyeSAqaGJhX2RlYnVnZnNfcm9vdDsKIAlhdG9taWNfdCBkZWJ1Z2ZzX3Zwb3J0X2NvdW50OwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2hicWluZm87CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZHVtcEhvc3RTbGltOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBIQkFTbGltOworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBEYXRhOyAgIC8qIEJsb2NrR3VhcmQgQlBMKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kdW1wRGlmOyAgICAvKiBCbG9ja0d1YXJkIEJQTCovCiAJc3RydWN0IGRlbnRyeSAqZGVidWdfc2xvd19yaW5nX3RyYzsKIAlzdHJ1Y3QgbHBmY19kZWJ1Z2ZzX3RyYyAqc2xvd19yaW5nX3RyYzsKIAlhdG9taWNfdCBzbG93X3JpbmdfdHJjX2NudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggYWEzZDYyNy4uNDBjZjBmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTk2LDYgKzk2LDYxIEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCBMUEZDX01PRFVMRV9ERVNDICJcbiIpOwogfQogCitzdGF0aWMgc3NpemVfdAorbHBmY19iZ19pbmZvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKworCWlmIChwaGJhLT5jZmdfZW5hYmxlX2JnKQorCQlpZiAocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX0JHX0VOQUJMRUQpCisJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJCbG9ja0d1YXJkIEVuYWJsZWRcbiIpOworCQllbHNlCisJCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCQkJCSJCbG9ja0d1YXJkIE5vdCBTdXBwb3J0ZWRcbiIpOworCWVsc2UKKwkJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwKKwkJCQkJIkJsb2NrR3VhcmQgRGlzYWJsZWRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdAorbHBmY19iZ19ndWFyZF9lcnJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaGJhLT5iZ19ndWFyZF9lcnJfY250KTsKK30KKworc3RhdGljIHNzaXplX3QKK2xwZmNfYmdfYXBwdGFnX2Vycl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBoYmEtPmJnX2FwcHRhZ19lcnJfY250KTsKK30KKworc3RhdGljIHNzaXplX3QKK2xwZmNfYmdfcmVmdGFnX2Vycl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBoYmEtPmJnX3JlZnRhZ19lcnJfY250KTsKK30KKwogLyoqCiAgKiBscGZjX2luZm9fc2hvdzogUmV0dXJuIHNvbWUgcGNpIGluZm8gYWJvdXQgdGhlIGhvc3QgaW4gYXNjaWkuCiAgKiBAZGV2OiBjbGFzcyBjb252ZXJ0ZWQgdG8gYSBTY3NpX2hvc3Qgc3RydWN0dXJlLgpAQCAtMTQ4NSw2ICsxNTQwLDEwIEBACiBzdGF0aWMgREVWSUNFX0FUVFIobHBmY18jI25hbWUsIFNfSVJVR08gfCBTX0lXVVNSLFwKIAkJICAgbHBmY18jI25hbWUjI19zaG93LCBscGZjXyMjbmFtZSMjX3N0b3JlKQogCitzdGF0aWMgREVWSUNFX0FUVFIoYmdfaW5mbywgU19JUlVHTywgbHBmY19iZ19pbmZvX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGJnX2d1YXJkX2VyciwgU19JUlVHTywgbHBmY19iZ19ndWFyZF9lcnJfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmdfYXBwdGFnX2VyciwgU19JUlVHTywgbHBmY19iZ19hcHB0YWdfZXJyX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGJnX3JlZnRhZ19lcnIsIFNfSVJVR08sIGxwZmNfYmdfcmVmdGFnX2Vycl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihpbmZvLCBTX0lSVUdPLCBscGZjX2luZm9fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsbnVtLCBTX0lSVUdPLCBscGZjX3NlcmlhbG51bV9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihtb2RlbGRlc2MsIFNfSVJVR08sIGxwZmNfbW9kZWxkZXNjX3Nob3csIE5VTEwpOwpAQCAtMTk3MCw2ICsyMDI5LDcgQEAKICMgTE9HX0xJTktfRVZFTlQgICAgICAgICAgICAgICAgMHgxMCAgICAgICBMaW5rIGV2ZW50cwogIyBMT0dfRkNQICAgICAgICAgICAgICAgICAgICAgICAweDQwICAgICAgIEZDUCB0cmFmZmljIGhpc3RvcnkKICMgTE9HX05PREUgICAgICAgICAgICAgICAgICAgICAgMHg4MCAgICAgICBOb2RlIHRhYmxlIGV2ZW50cworIyBMT0dfQkcgICAgICAgICAgICAgICAgICAgICAgICAweDIwMCAgICAgIEJsb2NrQnVhcmQgZXZlbnRzCiAjIExPR19NSVNDICAgICAgICAgICAgICAgICAgICAgIDB4NDAwICAgICAgTWlzY2VsbGFuZW91cyBldmVudHMKICMgTE9HX1NMSSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAgICAgICBTTEkgZXZlbnRzCiAjIExPR19GQ1BfRVJST1IgICAgICAgICAgICAgICAgIDB4MTAwMCAgICAgT25seSBsb2cgRkNQIGVycm9ycwpAQCAtMjc2OSw2ICsyODI5LDQyIEBACiBMUEZDX0FUVFJfUihlbmFibGVfaGJhX2hlYXJ0YmVhdCwgMSwgMCwgMSwgIkVuYWJsZSBIQkEgSGVhcnRiZWF0LiIpOwogCiAvKgorIyBscGZjX2VuYWJsZV9iZzogRW5hYmxlIEJsb2NrR3VhcmQgKEVtdWxleCdzIEltcGxlbWVudGF0aW9uIG9mIFQxMC1ESUYpCisjICAgICAgIDAgID0gQmxvY2tHdWFyZCBkaXNhYmxlZCAoZGVmYXVsdCkKKyMgICAgICAgMSAgPSBCbG9ja0d1YXJkIGVuYWJsZWQKKyMgVmFsdWUgcmFuZ2UgaXMgWzAsMV0uIERlZmF1bHQgdmFsdWUgaXMgMC4KKyovCitMUEZDX0FUVFJfUihlbmFibGVfYmcsIDAsIDAsIDEsICJFbmFibGUgQmxvY2tHdWFyZCBTdXBwb3J0Iik7CisKKworLyoKKyMgbHBmY19wcm90X21hc2s6IGkKKyMJLSBCaXQgbWFzayBvZiBob3N0IHByb3RlY3Rpb24gY2FwYWJpbGl0aWVzIHVzZWQgdG8gcmVnaXN0ZXIgd2l0aCB0aGUKKyMJICBTQ1NJIG1pZC1sYXllcgorIyAJLSBPbmx5IG1lYW5pbmdmdWwgaWYgQkcgaXMgdHVybmVkIG9uIChscGZjX2VuYWJsZV9iZz0xKS4KKyMJLSBBbGxvd3MgeW91IHRvIHVsdGltYXRlbHkgc3BlY2lmeSB3aGljaCBwcm9maWxlcyB0byB1c2UKKyMJLSBEZWZhdWx0IHdpbGwgcmVzdWx0IGluIHJlZ2lzdGVyaW5nIGNhcGFiaWxpdGllcyBmb3IgYWxsIHByb2ZpbGVzLgorIworKi8KK3Vuc2lnbmVkIGludCBscGZjX3Byb3RfbWFzayA9ICAgU0hPU1RfRElYX1RZUEUwX1BST1RFQ1RJT047CisKK21vZHVsZV9wYXJhbShscGZjX3Byb3RfbWFzaywgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxwZmNfcHJvdF9tYXNrLCAiaG9zdCBwcm90ZWN0aW9uIG1hc2siKTsKKworLyoKKyMgbHBmY19wcm90X2d1YXJkOiBpCisjCS0gQml0IG1hc2sgb2YgcHJvdGVjdGlvbiBndWFyZCB0eXBlcyB0byByZWdpc3RlciB3aXRoIHRoZSBTQ1NJIG1pZC1sYXllcgorIyAJLSBHdWFyZCB0eXBlcyBhcmUgY3VycmVudGx5IGVpdGhlciAxKSBJUCBjaGVja3N1bSAyKSBUMTAtRElGIENSQworIwktIEFsbG93cyB5b3UgdG8gdWx0aW1hdGVseSBzcGVjaWZ5IHdoaWNoIHByb2ZpbGVzIHRvIHVzZQorIwktIERlZmF1bHQgd2lsbCByZXN1bHQgaW4gcmVnaXN0ZXJpbmcgY2FwYWJpbGl0aWVzIGZvciBhbGwgZ3VhcmQgdHlwZXMKKyMKKyovCit1bnNpZ25lZCBjaGFyIGxwZmNfcHJvdF9ndWFyZCA9IFNIT1NUX0RJWF9HVUFSRF9JUDsKK21vZHVsZV9wYXJhbShscGZjX3Byb3RfZ3VhcmQsIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhscGZjX3Byb3RfZ3VhcmQsICJob3N0IHByb3RlY3Rpb24gZ3VhcmQgdHlwZSIpOworCisKKy8qCiAgKiBscGZjX3NnX3NlZ19jbnQ6IEluaXRpYWwgTWF4aW11bSBETUEgU2VnbWVudCBDb3VudAogICogVGhpcyB2YWx1ZSBjYW4gYmUgc2V0IHRvIHZhbHVlcyBiZXR3ZWVuIDY0IGFuZCAyNTYuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCiAgKiA2NCwgYnV0IG1heSBiZSBpbmNyZWFzZWQgdG8gYWxsb3cgZm9yIGxhcmdlciBNYXggSS9PIHNpemVzLiBUaGUgc2NzaSBsYXllcgpAQCAtMjc3Nyw3ICsyODczLDE1IEBACiBMUEZDX0FUVFJfUihzZ19zZWdfY250LCBMUEZDX0RFRkFVTFRfU0dfU0VHX0NOVCwgTFBGQ19ERUZBVUxUX1NHX1NFR19DTlQsCiAJICAgIExQRkNfTUFYX1NHX1NFR19DTlQsICJNYXggU2NhdHRlciBHYXRoZXIgU2VnbWVudCBDb3VudCIpOwogCitMUEZDX0FUVFJfUihwcm90X3NnX3NlZ19jbnQsIExQRkNfREVGQVVMVF9QUk9UX1NHX1NFR19DTlQsCisJCUxQRkNfREVGQVVMVF9QUk9UX1NHX1NFR19DTlQsIExQRkNfTUFYX1BST1RfU0dfU0VHX0NOVCwKKwkJIk1heCBQcm90ZWN0aW9uIFNjYXR0ZXIgR2F0aGVyIFNlZ21lbnQgQ291bnQiKTsKKwogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmxwZmNfaGJhX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2JnX2luZm8sCisJJmRldl9hdHRyX2JnX2d1YXJkX2VyciwKKwkmZGV2X2F0dHJfYmdfYXBwdGFnX2VyciwKKwkmZGV2X2F0dHJfYmdfcmVmdGFnX2VyciwKIAkmZGV2X2F0dHJfaW5mbywKIAkmZGV2X2F0dHJfc2VyaWFsbnVtLAogCSZkZXZfYXR0cl9tb2RlbGRlc2MsCkBAIC0yODI1LDYgKzI5MjksNyBAQAogCSZkZXZfYXR0cl9scGZjX3BvbGwsCiAJJmRldl9hdHRyX2xwZmNfcG9sbF90bW8sCiAJJmRldl9hdHRyX2xwZmNfdXNlX21zaSwKKwkmZGV2X2F0dHJfbHBmY19lbmFibGVfYmcsCiAJJmRldl9hdHRyX2xwZmNfc29mdF93d25uLAogCSZkZXZfYXR0cl9scGZjX3NvZnRfd3dwbiwKIAkmZGV2X2F0dHJfbHBmY19zb2Z0X3d3bl9lbmFibGUsCkBAIC0yODMzLDYgKzI5MzgsNyBAQAogCSZkZXZfYXR0cl9scGZjX3NnX3NlZ19jbnQsCiAJJmRldl9hdHRyX2xwZmNfbWF4X3Njc2ljbXBsX3RpbWUsCiAJJmRldl9hdHRyX2xwZmNfc3RhdF9kYXRhX2N0cmwsCisJJmRldl9hdHRyX2xwZmNfcHJvdF9zZ19zZWdfY250LAogCU5VTEwsCiB9OwogCkBAIC0zMjgyLDI1ICszMzg4LDI4IEBACiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYua29iaiwKKwkJCQkgICAgICAmc3lzZnNfZHJ2cl9zdGF0X2RhdGFfYXR0cik7CisKKwkvKiBWaXJ0dWFsIHBvcnRzIGRvIG5vdCBuZWVkIGN0cmxfcmVnIGFuZCBtYm94ICovCisJaWYgKGVycm9yIHx8IHZwb3J0LT5wb3J0X3R5cGUgPT0gTFBGQ19OUElWX1BPUlQpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYua29iaiwKIAkJCQkgICAgICAmc3lzZnNfY3RscmVnX2F0dHIpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JlbW92ZV9zdGF0X2F0dHI7CiAKIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2hvc3QtPnNob3N0X2Rldi5rb2JqLAogCQkJCSAgICAgICZzeXNmc19tYm94X2F0dHIpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfcmVtb3ZlX2N0bHJlZ19hdHRyOwogCi0JZXJyb3IgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYua29iaiwKLQkJCQkgICAgICAmc3lzZnNfZHJ2cl9zdGF0X2RhdGFfYXR0cik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9yZW1vdmVfbWJveF9hdHRyOwotCiAJcmV0dXJuIDA7Ci1vdXRfcmVtb3ZlX21ib3hfYXR0cjoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYua29iaiwgJnN5c2ZzX21ib3hfYXR0cik7CiBvdXRfcmVtb3ZlX2N0bHJlZ19hdHRyOgogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmc2hvc3QtPnNob3N0X2Rldi5rb2JqLCAmc3lzZnNfY3RscmVnX2F0dHIpOworb3V0X3JlbW92ZV9zdGF0X2F0dHI6CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzaG9zdC0+c2hvc3RfZGV2LmtvYmosCisJCQkmc3lzZnNfZHJ2cl9zdGF0X2RhdGFfYXR0cik7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzMxNSw2ICszNDI0LDkgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGxwZmNfc2hvc3RfZnJvbV92cG9ydCh2cG9ydCk7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzaG9zdC0+c2hvc3RfZGV2LmtvYmosCiAJCSZzeXNmc19kcnZyX3N0YXRfZGF0YV9hdHRyKTsKKwkvKiBWaXJ0dWFsIHBvcnRzIGRvIG5vdCBuZWVkIGN0cmxfcmVnIGFuZCBtYm94ICovCisJaWYgKHZwb3J0LT5wb3J0X3R5cGUgPT0gTFBGQ19OUElWX1BPUlQpCisJCXJldHVybjsKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNob3N0LT5zaG9zdF9kZXYua29iaiwgJnN5c2ZzX21ib3hfYXR0cik7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzaG9zdC0+c2hvc3RfZGV2LmtvYmosICZzeXNmc19jdGxyZWdfYXR0cik7CiB9CkBAIC0zNzkyLDYgKzM5MDQsMjMgQEAKIAlscGZjX3Jwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCApCQlcCiBzdGF0aWMgRkNfUlBPUlRfQVRUUihmaWVsZCwgU19JUlVHTywgbHBmY19zaG93X3Jwb3J0XyMjZmllbGQsIE5VTEwpCiAKKy8qKgorICogbHBmY19zZXRfdnBvcnRfc3ltYm9saWNfbmFtZTogU2V0IHRoZSB2cG9ydCdzIHN5bWJvbGljIG5hbWUuCisgKiBAZmNfdnBvcnQ6IFRoZSBmY192cG9ydCB3aG8ncyBzeW1ib2xpYyBuYW1lIGhhcyBiZWVuIGNoYW5nZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBAZmNfdnBvcnQncyBzeW1ib2xpYyBuYW1lCisgKiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIGZ1bmN0aW9uIHJlLXJlZ2lzdGVycyB0aGUgc3ltYm9saWMgbmFtZSB3aXRoIHRoZQorICogc3dpdGNoIHRvIHByb3BvZ2F0ZSB0aGUgY2hhbmdlIGludG8gdGhlIGZhYnJpYyBpZiB0aGUgdnBvcnQgaXMgYWN0aXZlLgorICoqLworc3RhdGljIHZvaWQKK2xwZmNfc2V0X3Zwb3J0X3N5bWJvbGljX25hbWUoc3RydWN0IGZjX3Zwb3J0ICpmY192cG9ydCkKK3sKKwlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAqKHN0cnVjdCBscGZjX3Zwb3J0ICoqKWZjX3Zwb3J0LT5kZF9kYXRhOworCisJaWYgKHZwb3J0LT5wb3J0X3N0YXRlID09IExQRkNfVlBPUlRfUkVBRFkpCisJCWxwZmNfbnNfY21kKHZwb3J0LCBTTElfQ1ROU19SU1BOX0lELCAwLCAwKTsKK30KIAogc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIGxwZmNfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKIAkvKiBmaXhlZCBhdHRyaWJ1dGVzIHRoZSBkcml2ZXIgc3VwcG9ydHMgKi8KQEAgLTM4MDEsNiArMzkzMCw3IEBACiAJLnNob3dfaG9zdF9zdXBwb3J0ZWRfZmM0cyA9IDEsCiAJLnNob3dfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzID0gMSwKIAkuc2hvd19ob3N0X21heGZyYW1lX3NpemUgPSAxLAorCS5zaG93X2hvc3Rfc3ltYm9saWNfbmFtZSA9IDEsCiAKIAkvKiBkeW5hbWljIGF0dHJpYnV0ZXMgdGhlIGRyaXZlciBzdXBwb3J0cyAqLwogCS5nZXRfaG9zdF9wb3J0X2lkID0gbHBmY19nZXRfaG9zdF9wb3J0X2lkLApAQCAtMzg1MCw2ICszOTgwLDEwIEBACiAJLnRlcm1pbmF0ZV9ycG9ydF9pbyA9IGxwZmNfdGVybWluYXRlX3Jwb3J0X2lvLAogCiAJLmRkX2ZjdnBvcnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHBmY192cG9ydCAqKSwKKworCS52cG9ydF9kaXNhYmxlID0gbHBmY192cG9ydF9kaXNhYmxlLAorCisJLnNldF92cG9ydF9zeW1ib2xpY19uYW1lID0gbHBmY19zZXRfdnBvcnRfc3ltYm9saWNfbmFtZSwKIH07CiAKIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBscGZjX3Zwb3J0X3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CkBAIC0zODYwLDYgKzM5OTQsNyBAQAogCS5zaG93X2hvc3Rfc3VwcG9ydGVkX2ZjNHMgPSAxLAogCS5zaG93X2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyA9IDEsCiAJLnNob3dfaG9zdF9tYXhmcmFtZV9zaXplID0gMSwKKwkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAogCiAJLyogZHluYW1pYyBhdHRyaWJ1dGVzIHRoZSBkcml2ZXIgc3VwcG9ydHMgKi8KIAkuZ2V0X2hvc3RfcG9ydF9pZCA9IGxwZmNfZ2V0X2hvc3RfcG9ydF9pZCwKQEAgLTM5MDgsNiArNDA0Myw4IEBACiAJLnRlcm1pbmF0ZV9ycG9ydF9pbyA9IGxwZmNfdGVybWluYXRlX3Jwb3J0X2lvLAogCiAJLnZwb3J0X2Rpc2FibGUgPSBscGZjX3Zwb3J0X2Rpc2FibGUsCisKKwkuc2V0X3Zwb3J0X3N5bWJvbGljX25hbWUgPSBscGZjX3NldF92cG9ydF9zeW1ib2xpY19uYW1lLAogfTsKIAogLyoqCkBAIC0zOTMwLDEzICs0MDY3LDEyIEBACiAJbHBmY191c2VfbXNpX2luaXQocGhiYSwgbHBmY191c2VfbXNpKTsKIAlscGZjX2VuYWJsZV9oYmFfcmVzZXRfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9oYmFfcmVzZXQpOwogCWxwZmNfZW5hYmxlX2hiYV9oZWFydGJlYXRfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9oYmFfaGVhcnRiZWF0KTsKKwlscGZjX2VuYWJsZV9iZ19pbml0KHBoYmEsIGxwZmNfZW5hYmxlX2JnKTsKIAlwaGJhLT5jZmdfcG9sbCA9IGxwZmNfcG9sbDsKIAlwaGJhLT5jZmdfc29mdF93d25uID0gMEw7CiAJcGhiYS0+Y2ZnX3NvZnRfd3dwbiA9IDBMOwogCWxwZmNfc2dfc2VnX2NudF9pbml0KHBoYmEsIGxwZmNfc2dfc2VnX2NudCk7Ci0JLyogQWxzbyByZWluaXRpYWxpemUgdGhlIGhvc3QgdGVtcGxhdGVzIHdpdGggbmV3IHZhbHVlcy4gKi8KLQlscGZjX3Zwb3J0X3RlbXBsYXRlLnNnX3RhYmxlc2l6ZSA9IHBoYmEtPmNmZ19zZ19zZWdfY250OwotCWxwZmNfdGVtcGxhdGUuc2dfdGFibGVzaXplID0gcGhiYS0+Y2ZnX3NnX3NlZ19jbnQ7CisJbHBmY19wcm90X3NnX3NlZ19jbnRfaW5pdChwaGJhLCBscGZjX3Byb3Rfc2dfc2VnX2NudCk7CiAJLyoKIAkgKiBTaW5jZSB0aGUgc2dfdGFibGVzaXplIGlzIG1vZHVsZSBwYXJhbWV0ZXIsIHRoZSBzZ19kbWFfYnVmX3NpemUKIAkgKiB1c2VkIHRvIGNyZWF0ZSB0aGUgc2dfZG1hX2J1Zl9wb29sIG11c3QgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZC4KQEAgLTM5NDUsNiArNDA4MSwxNyBAQAogCXBoYmEtPmNmZ19zZ19kbWFfYnVmX3NpemUgPSBzaXplb2Yoc3RydWN0IGZjcF9jbW5kKSArCiAJCQlzaXplb2Yoc3RydWN0IGZjcF9yc3ApICsKIAkJCSgocGhiYS0+Y2ZnX3NnX3NlZ19jbnQgKyAyKSAqIHNpemVvZihzdHJ1Y3QgdWxwX2JkZTY0KSk7CisKKwlpZiAocGhiYS0+Y2ZnX2VuYWJsZV9iZykgeworCQlwaGJhLT5jZmdfc2dfc2VnX2NudCA9IExQRkNfTUFYX1NHX1NFR19DTlQ7CisJCXBoYmEtPmNmZ19zZ19kbWFfYnVmX3NpemUgKz0KKwkJCXBoYmEtPmNmZ19wcm90X3NnX3NlZ19jbnQgKiBzaXplb2Yoc3RydWN0IHVscF9iZGU2NCk7CisJfQorCisJLyogQWxzbyByZWluaXRpYWxpemUgdGhlIGhvc3QgdGVtcGxhdGVzIHdpdGggbmV3IHZhbHVlcy4gKi8KKwlscGZjX3Zwb3J0X3RlbXBsYXRlLnNnX3RhYmxlc2l6ZSA9IHBoYmEtPmNmZ19zZ19zZWdfY250OworCWxwZmNfdGVtcGxhdGUuc2dfdGFibGVzaXplID0gcGhiYS0+Y2ZnX3NnX3NlZ19jbnQ7CisKIAlscGZjX2hiYV9xdWV1ZV9kZXB0aF9pbml0KHBoYmEsIGxwZmNfaGJhX3F1ZXVlX2RlcHRoKTsKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCmluZGV4IDA0NGVmNDAuLjA3ZjQ5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIHN0cnVjdCBmY19ycG9ydDsKIHZvaWQgbHBmY19kdW1wX21lbShzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICosIHVpbnQxNl90KTsKK3ZvaWQgbHBmY19kdW1wX3dha2V1cF9wYXJhbShzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwogdm9pZCBscGZjX3JlYWRfbnYoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIHZvaWQgbHBmY19jb25maWdfYXN5bmMoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqLCB1aW50MzJfdCk7CiAKQEAgLTI4NCwxMiArMjg1LDI0IEBACiAJdWludDMyX3QsIHVpbnQzMl90KTsKIGV4dGVybiBzdHJ1Y3QgbHBmY19oYnFfaW5pdCAqbHBmY19oYnFfZGVmc1tdOwogCisvKiBleHRlcm5zIEJsb2NrR3VhcmQgKi8KK2V4dGVybiBjaGFyICpfZHVtcF9idWZfZGF0YTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9kdW1wX2J1Zl9kYXRhX29yZGVyOworZXh0ZXJuIGNoYXIgKl9kdW1wX2J1Zl9kaWY7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfZHVtcF9idWZfZGlmX29yZGVyOworZXh0ZXJuIHNwaW5sb2NrX3QgX2R1bXBfYnVmX2xvY2s7CitleHRlcm4gaW50IF9kdW1wX2J1Zl9kb25lOworZXh0ZXJuIHNwaW5sb2NrX3QgcGdjbnRfbG9jazsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcGdjbnQ7CitleHRlcm4gdW5zaWduZWQgaW50IGxwZmNfcHJvdF9tYXNrOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbHBmY19wcm90X2d1YXJkOworCiAvKiBJbnRlcmZhY2UgZXhwb3J0ZWQgYnkgZmFicmljIGlvY2Igc2NoZWR1bGVyICovCiB2b2lkIGxwZmNfZmFicmljX2Fib3J0X25wb3J0KHN0cnVjdCBscGZjX25vZGVsaXN0ICopOwogdm9pZCBscGZjX2ZhYnJpY19hYm9ydF9oYmEoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX2ZhYnJpY19ibG9ja190aW1lb3V0KHVuc2lnbmVkIGxvbmcpOwogdm9pZCBscGZjX3VuYmxvY2tfZmFicmljX2lvY2JzKHN0cnVjdCBscGZjX2hiYSAqKTsKLXZvaWQgbHBmY19hZGp1c3RfcXVldWVfZGVwdGgoc3RydWN0IGxwZmNfaGJhICopOwordm9pZCBscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19yYW1wX2Rvd25fcXVldWVfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19zY3NpX2Rldl9ibG9jayhzdHJ1Y3QgbHBmY19oYmEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKaW5kZXggMjZkYWU4Yi4uODk2YzdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwpAQCAtNTYwLDE4ICs1NjAsMjUgQEAKIAkJaXJzcC0+dWxwU3RhdHVzLCBpcnNwLT51bi51bHBXb3JkWzRdLCB2cG9ydC0+ZmNfbnNfcmV0cnkpOwogCiAJLyogRG9uJ3QgYm90aGVyIHByb2Nlc3NpbmcgcmVzcG9uc2UgaWYgdnBvcnQgaXMgYmVpbmcgdG9ybiBkb3duLiAqLwotCWlmICh2cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKQorCWlmICh2cG9ydC0+bG9hZF9mbGFnICYgRkNfVU5MT0FESU5HKSB7CisJCWlmICh2cG9ydC0+ZmNfZmxhZyAmIEZDX1JTQ05fTU9ERSkKKwkJCWxwZmNfZWxzX2ZsdXNoX3JzY24odnBvcnQpOwogCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAobHBmY19lbHNfY2hrX2xhdHQodnBvcnQpKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0RJU0NPVkVSWSwKIAkJCQkgIjAyMTYgTGluayBldmVudCBkdXJpbmcgTlMgcXVlcnlcbiIpOworCQlpZiAodnBvcnQtPmZjX2ZsYWcgJiBGQ19SU0NOX01PREUpCisJCQlscGZjX2Vsc19mbHVzaF9yc2NuKHZwb3J0KTsKIAkJbHBmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAobHBmY19lcnJvcl9sb3N0X2xpbmsoaXJzcCkpIHsKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRElTQ09WRVJZLAogCQkJCSAiMDIyNiBOUyBxdWVyeSBmYWlsZWQgZHVlIHRvIGxpbmsgZXZlbnRcbiIpOworCQlpZiAodnBvcnQtPmZjX2ZsYWcgJiBGQ19SU0NOX01PREUpCisJCQlscGZjX2Vsc19mbHVzaF9yc2NuKHZwb3J0KTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChpcnNwLT51bHBTdGF0dXMpIHsKQEAgLTU4Nyw2ICs1OTQsOCBAQAogCQkJaWYgKHJjID09IDApCiAJCQkJZ290byBvdXQ7CiAJCX0KKwkJaWYgKHZwb3J0LT5mY19mbGFnICYgRkNfUlNDTl9NT0RFKQorCQkJbHBmY19lbHNfZmx1c2hfcnNjbih2cG9ydCk7CiAJCWxwZmNfdnBvcnRfc2V0X3N0YXRlKHZwb3J0LCBGQ19WUE9SVF9GQUlMRUQpOwogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKIAkJCQkgIjAyNTcgR0lEX0ZUIFF1ZXJ5IGVycm9yOiAweCV4IDB4JXhcbiIsCkBAIC0xMDA4LDggKzEwMTcsMTAgQEAKIAlpZiAobiA8IHNpemUpCiAJCW4gKz0gc25wcmludGYoc3ltYm9sICsgbiwgc2l6ZSAtIG4sICIgVlBvcnQtJWQiLCB2cG9ydC0+dnBpKTsKIAotCWlmIChuIDwgc2l6ZSAmJiB2cG9ydC0+dm5hbWUpCi0JCW4gKz0gc25wcmludGYoc3ltYm9sICsgbiwgc2l6ZSAtIG4sICIgVk5hbWUtJXMiLCB2cG9ydC0+dm5hbWUpOworCWlmIChuIDwgc2l6ZSAmJgorCSAgICBzdHJsZW4odnBvcnQtPmZjX3Zwb3J0LT5zeW1ib2xpY19uYW1lKSkKKwkJbiArPSBzbnByaW50ZihzeW1ib2wgKyBuLCBzaXplIC0gbiwgIiBWTmFtZS0lcyIsCisJCQkgICAgICB2cG9ydC0+ZmNfdnBvcnQtPnN5bWJvbGljX25hbWUpOwogCXJldHVybiBuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCmluZGV4IDc3MTkyMGIuLmI2MTVlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSAibHBmY19jb21wYXQuaCIKICNpbmNsdWRlICJscGZjX2RlYnVnZnMuaCIKIAotI2lmZGVmIENPTkZJR19MUEZDX0RFQlVHX0ZTCisjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUwogLyoqCiAgKiBkZWJ1Z2ZzIGludGVyZmFjZQogICoKQEAgLTYxOCw3ICs2MTgsNyBAQAogbHBmY19kZWJ1Z2ZzX2Rpc2NfdHJjKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgaW50IG1hc2ssIGNoYXIgKmZtdCwKIAl1aW50MzJfdCBkYXRhMSwgdWludDMyX3QgZGF0YTIsIHVpbnQzMl90IGRhdGEzKQogewotI2lmZGVmIENPTkZJR19MUEZDX0RFQlVHX0ZTCisjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUwogCXN0cnVjdCBscGZjX2RlYnVnZnNfdHJjICpkdHA7CiAJaW50IGluZGV4OwogCkBAIC02NTksNyArNjU5LDcgQEAKIGxwZmNfZGVidWdmc19zbG93X3JpbmdfdHJjKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgY2hhciAqZm10LAogCXVpbnQzMl90IGRhdGExLCB1aW50MzJfdCBkYXRhMiwgdWludDMyX3QgZGF0YTMpCiB7Ci0jaWZkZWYgQ09ORklHX0xQRkNfREVCVUdfRlMKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAJc3RydWN0IGxwZmNfZGVidWdmc190cmMgKmR0cDsKIAlpbnQgaW5kZXg7CiAKQEAgLTY4MCw3ICs2ODAsNyBAQAogCXJldHVybjsKIH0KIAotI2lmZGVmIENPTkZJR19MUEZDX0RFQlVHX0ZTCisjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUwogLyoqCiAgKiBscGZjX2RlYnVnZnNfZGlzY190cmNfb3BlbiAtIE9wZW4gdGhlIGRpc2NvdmVyeSB0cmFjZSBsb2cuCiAgKiBAaW5vZGU6IFRoZSBpbm9kZSBwb2ludGVyIHRoYXQgY29udGFpbnMgYSB2cG9ydCBwb2ludGVyLgpAQCAtOTA3LDYgKzkwNyw5MSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludAorbHBmY19kZWJ1Z2ZzX2R1bXBEYXRhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnOworCWludCByYyA9IC1FTk9NRU07CisKKwlpZiAoIV9kdW1wX2J1Zl9kYXRhKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGVidWcgPSBrbWFsbG9jKHNpemVvZigqZGVidWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnKQorCQlnb3RvIG91dDsKKworCS8qIFJvdW5kIHRvIHBhZ2UgYm91bmRyeSAqLworCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEICVzOiBfZHVtcF9idWZfZGF0YT0weCVwXG4iLAorCQkJX19mdW5jX18sIF9kdW1wX2J1Zl9kYXRhKTsKKwlkZWJ1Zy0+YnVmZmVyID0gX2R1bXBfYnVmX2RhdGE7CisJaWYgKCFkZWJ1Zy0+YnVmZmVyKSB7CisJCWtmcmVlKGRlYnVnKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGVidWctPmxlbiA9ICgxIDw8IF9kdW1wX2J1Zl9kYXRhX29yZGVyKSA8PCBQQUdFX1NISUZUOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRlYnVnOworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorbHBmY19kZWJ1Z2ZzX2R1bXBEaWZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWc7CisJaW50IHJjID0gLUVOT01FTTsKKworCWlmICghX2R1bXBfYnVmX2RpZikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWRlYnVnID0ga21hbGxvYyhzaXplb2YoKmRlYnVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWJ1ZykKKwkJZ290byBvdXQ7CisKKwkvKiBSb3VuZCB0byBwYWdlIGJvdW5kcnkgKi8KKwlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCAlczogX2R1bXBfYnVmX2RpZj0weCVwIGZpbGU9JXNcbiIsIF9fZnVuY19fLAorCSAgICAgICBfZHVtcF9idWZfZGlmLCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWRlYnVnLT5idWZmZXIgPSBfZHVtcF9idWZfZGlmOworCWlmICghZGVidWctPmJ1ZmZlcikgeworCQlrZnJlZShkZWJ1Zyk7CisJCWdvdG8gb3V0OworCX0KKworCWRlYnVnLT5sZW4gPSAoMSA8PCBfZHVtcF9idWZfZGlmX29yZGVyKSA8PCBQQUdFX1NISUZUOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRlYnVnOworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QKK2xwZmNfZGVidWdmc19kdW1wRGF0YURpZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJLyoKKwkgKiBUaGUgRGF0YS9ESUYgYnVmZmVycyBvbmx5IHNhdmUgb25lIGZhaWxpbmcgSU8KKwkgKiBUaGUgd3JpdGUgb3AgaXMgdXNlZCBhcyBhIHJlc2V0IG1lY2hhbmlzbSBhZnRlciBhbiBJTyBoYXMKKwkgKiBhbHJlYWR5IGJlZW4gc2F2ZWQgdG8gdGhlIG5leHQgb25lIGNhbiBiZSBzYXZlZAorCSAqLworCXNwaW5fbG9jaygmX2R1bXBfYnVmX2xvY2spOworCisJbWVtc2V0KCh2b2lkICopX2R1bXBfYnVmX2RhdGEsIDAsCisJCQkoKDEgPDwgUEFHRV9TSElGVCkgPDwgX2R1bXBfYnVmX2RhdGFfb3JkZXIpKTsKKwltZW1zZXQoKHZvaWQgKilfZHVtcF9idWZfZGlmLCAwLAorCQkJKCgxIDw8IFBBR0VfU0hJRlQpIDw8IF9kdW1wX2J1Zl9kaWZfb3JkZXIpKTsKKworCV9kdW1wX2J1Zl9kb25lID0gMDsKKworCXNwaW5fdW5sb2NrKCZfZHVtcF9idWZfbG9jayk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCisKKwogLyoqCiAgKiBscGZjX2RlYnVnZnNfbm9kZWxpc3Rfb3BlbiAtIE9wZW4gdGhlIG5vZGVsaXN0IGRlYnVnZnMgZmlsZS4KICAqIEBpbm9kZTogVGhlIGlub2RlIHBvaW50ZXIgdGhhdCBjb250YWlucyBhIHZwb3J0IHBvaW50ZXIuCkBAIC0xMDM1LDYgKzExMjAsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorbHBmY19kZWJ1Z2ZzX2R1bXBEYXRhRGlmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZGVidWctPmJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUoZGVidWcpOworCisJcmV0dXJuIDA7Cit9CisKICN1bmRlZiBscGZjX2RlYnVnZnNfb3BfZGlzY190cmMKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfZGVidWdmc19vcF9kaXNjX3RyYyA9IHsKIAkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCkBAIC0xMDgwLDYgKzExNzYsMjYgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19kZWJ1Z2ZzX3JlbGVhc2UsCiB9OwogCisjdW5kZWYgbHBmY19kZWJ1Z2ZzX29wX2R1bXBEYXRhCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2RlYnVnZnNfb3BfZHVtcERhdGEgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgICAgICBscGZjX2RlYnVnZnNfZHVtcERhdGFfb3BlbiwKKwkubGxzZWVrID0gICAgICAgbHBmY19kZWJ1Z2ZzX2xzZWVrLAorCS5yZWFkID0gICAgICAgICBscGZjX2RlYnVnZnNfcmVhZCwKKwkud3JpdGUgPQlscGZjX2RlYnVnZnNfZHVtcERhdGFEaWZfd3JpdGUsCisJLnJlbGVhc2UgPSAgICAgIGxwZmNfZGVidWdmc19kdW1wRGF0YURpZl9yZWxlYXNlLAorfTsKKworI3VuZGVmIGxwZmNfZGVidWdmc19vcF9kdW1wRGlmCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2RlYnVnZnNfb3BfZHVtcERpZiA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICAgICAgIGxwZmNfZGVidWdmc19kdW1wRGlmX29wZW4sCisJLmxsc2VlayA9ICAgICAgIGxwZmNfZGVidWdmc19sc2VlaywKKwkucmVhZCA9ICAgICAgICAgbHBmY19kZWJ1Z2ZzX3JlYWQsCisJLndyaXRlID0JbHBmY19kZWJ1Z2ZzX2R1bXBEYXRhRGlmX3dyaXRlLAorCS5yZWxlYXNlID0gICAgICBscGZjX2RlYnVnZnNfZHVtcERhdGFEaWZfcmVsZWFzZSwKK307CisKICN1bmRlZiBscGZjX2RlYnVnZnNfb3Bfc2xvd19yaW5nX3RyYwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19kZWJ1Z2ZzX29wX3Nsb3dfcmluZ190cmMgPSB7CiAJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLApAQCAtMTEwNiw3ICsxMjIyLDcgQEAKIGlubGluZSB2b2lkCiBscGZjX2RlYnVnZnNfaW5pdGlhbGl6ZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQpCiB7Ci0jaWZkZWYgQ09ORklHX0xQRkNfREVCVUdfRlMKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAJc3RydWN0IGxwZmNfaGJhICAgKnBoYmEgPSB2cG9ydC0+cGhiYTsKIAljaGFyIG5hbWVbNjRdOwogCXVpbnQzMl90IG51bSwgaTsKQEAgLTExNzYsNiArMTI5MiwzMiBAQAogCQkJZ290byBkZWJ1Z19mYWlsZWQ7CiAJCX0KIAorCQkvKiBTZXR1cCBkdW1wRGF0YSAqLworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJkdW1wRGF0YSIpOworCQlwaGJhLT5kZWJ1Z19kdW1wRGF0YSA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJCSBwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJCSBwaGJhLCAmbHBmY19kZWJ1Z2ZzX29wX2R1bXBEYXRhKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z19kdW1wRGF0YSkgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODAwIENhbm5vdCBjcmVhdGUgZGVidWdmcyBkdW1wRGF0YVxuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCisJCS8qIFNldHVwIGR1bXBEaWYgKi8KKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZHVtcERpZiIpOworCQlwaGJhLT5kZWJ1Z19kdW1wRGlmID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQkJIHBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QsCisJCQkJIHBoYmEsICZscGZjX2RlYnVnZnNfb3BfZHVtcERpZik7CisJCWlmICghcGhiYS0+ZGVidWdfZHVtcERpZikgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODAxIENhbm5vdCBjcmVhdGUgZGVidWdmcyBkdW1wRGlmXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisKKworCiAJCS8qIFNldHVwIHNsb3cgcmluZyB0cmFjZSAqLwogCQlpZiAobHBmY19kZWJ1Z2ZzX21heF9zbG93X3JpbmdfdHJjKSB7CiAJCQludW0gPSBscGZjX2RlYnVnZnNfbWF4X3Nsb3dfcmluZ190cmMgLSAxOwpAQCAtMTMwNSw3ICsxNDQ3LDcgQEAKIGlubGluZSB2b2lkCiBscGZjX2RlYnVnZnNfdGVybWluYXRlKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCkKIHsKLSNpZmRlZiBDT05GSUdfTFBGQ19ERUJVR19GUworI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCiAJaWYgKHZwb3J0LT5kaXNjX3RyYykgewpAQCAtMTM0MCw2ICsxNDgyLDE2IEBACiAJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5kZWJ1Z19kdW1wSG9zdFNsaW0pOyAvKiBIb3N0U2xpbSAqLwogCQkJcGhiYS0+ZGVidWdfZHVtcEhvc3RTbGltID0gTlVMTDsKIAkJfQorCQlpZiAocGhiYS0+ZGVidWdfZHVtcERhdGEpIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX2R1bXBEYXRhKTsgLyogZHVtcERhdGEgKi8KKwkJCXBoYmEtPmRlYnVnX2R1bXBEYXRhID0gTlVMTDsKKwkJfQorCisJCWlmIChwaGJhLT5kZWJ1Z19kdW1wRGlmKSB7CisJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5kZWJ1Z19kdW1wRGlmKTsgLyogZHVtcERpZiAqLworCQkJcGhiYS0+ZGVidWdfZHVtcERpZiA9IE5VTEw7CisJCX0KKwogCQlpZiAocGhiYS0+c2xvd19yaW5nX3RyYykgewogCQkJa2ZyZWUocGhiYS0+c2xvd19yaW5nX3RyYyk7CiAJCQlwaGJhLT5zbG93X3JpbmdfdHJjID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKaW5kZXggMzFlODZhNS4uMDNjNzMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpZm5kZWYgX0hfTFBGQ19ERUJVR19GUwogI2RlZmluZSBfSF9MUEZDX0RFQlVHX0ZTCiAKLSNpZmRlZiBDT05GSUdfTFBGQ19ERUJVR19GUworI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKIHN0cnVjdCBscGZjX2RlYnVnZnNfdHJjIHsKIAljaGFyICpmbXQ7CiAJdWludDMyX3QgZGF0YTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCA2MzBiZDI4Li5hOGYzMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTIyMSw3ICsyMjEsMTEgQEAKIAkJLyogRm9yIEVMU19SRVFVRVNUNjRfQ1IsIHVzZSB0aGUgVlBJIGJ5IGRlZmF1bHQgKi8KIAkJaWNtZC0+dWxwQ29udGV4dCA9IHZwb3J0LT52cGk7CiAJCWljbWQtPnVscEN0X2ggPSAwOwotCQlpY21kLT51bHBDdF9sID0gMTsKKwkJLyogVGhlIENUIGZpZWxkIG11c3QgYmUgMD1JTlZBTElEX1JQSSBmb3IgdGhlIEVDSE8gY21kICovCisJCWlmIChlbHNjbWQgPT0gRUxTX0NNRF9FQ0hPKQorCQkJaWNtZC0+dWxwQ3RfbCA9IDA7IC8qIGNvbnRleHQgPSBpbnZhbGlkIFJQSSAqLworCQllbHNlCisJCQlpY21kLT51bHBDdF9sID0gMTsgLyogY29udGV4dCA9IFZQSSAqLwogCX0KIAogCWJwbCA9IChzdHJ1Y3QgdWxwX2JkZTY0ICopIHBidWZsaXN0LT52aXJ0OwpAQCAtMjcxLDcgKzI3NSw4IEBACiAJcmV0dXJuIGVsc2lvY2I7CiAKIGVsc19pb2NiX2ZyZWVfcGJ1Zl9leGl0OgotCWxwZmNfbWJ1Zl9mcmVlKHBoYmEsIHByc3AtPnZpcnQsIHByc3AtPnBoeXMpOworCWlmIChleHBlY3RSc3ApCisJCWxwZmNfbWJ1Zl9mcmVlKHBoYmEsIHByc3AtPnZpcnQsIHByc3AtPnBoeXMpOwogCWtmcmVlKHBidWZsaXN0KTsKIAogZWxzX2lvY2JfZnJlZV9wcnNwX2V4aXQ6CkBAIC0yNDY4LDYgKzI0NzMsMTUgQEAKIAljYXNlIElPU1RBVF9MT0NBTF9SRUpFQ1Q6CiAJCXN3aXRjaCAoKGlyc3AtPnVuLnVscFdvcmRbNF0gJiAweGZmKSkgewogCQljYXNlIElPRVJSX0xPT1BfT1BFTl9GQUlMVVJFOgorCQkJaWYgKGNtZCA9PSBFTFNfQ01EX0ZMT0dJKSB7CisJCQkJaWYgKFBDSV9ERVZJQ0VfSURfSE9STkVUID09CisJCQkJCXBoYmEtPnBjaWRldi0+ZGV2aWNlKSB7CisJCQkJCXBoYmEtPmZjX3RvcG9sb2d5ID0gVE9QT0xPR1lfTE9PUDsKKwkJCQkJcGhiYS0+cHBvcnQtPmZjX215RElEID0gMDsKKwkJCQkJcGhiYS0+YWxwYV9tYXBbMF0gPSAwOworCQkJCQlwaGJhLT5hbHBhX21hcFsxXSA9IDA7CisJCQkJfQorCQkJfQogCQkJaWYgKGNtZCA9PSBFTFNfQ01EX1BMT0dJICYmIGNtZGlvY2ItPnJldHJ5ID09IDApCiAJCQkJZGVsYXkgPSAxMDAwOwogCQkJcmV0cnkgPSAxOwpAQCAtMzgyMywyNyArMzgzNywyMSBAQAogCQl3aGlsZSAocGF5bG9hZF9sZW4pIHsKIAkJCXJzY25fZGlkLnVuLndvcmQgPSBiZTMyX3RvX2NwdSgqbHArKyk7CiAJCQlwYXlsb2FkX2xlbiAtPSBzaXplb2YodWludDMyX3QpOwotCQkJc3dpdGNoIChyc2NuX2RpZC51bi5iLnJlc3YpIHsKLQkJCWNhc2UgMDoJLyogU2luZ2xlIE5fUG9ydCBJRCBlZmZlY3RlZCAqLworCQkJc3dpdGNoIChyc2NuX2RpZC51bi5iLnJlc3YgJiBSU0NOX0FERFJFU1NfRk9STUFUX01BU0spIHsKKwkJCWNhc2UgUlNDTl9BRERSRVNTX0ZPUk1BVF9QT1JUOgogCQkJCWlmIChuc19kaWQudW4ud29yZCA9PSByc2NuX2RpZC51bi53b3JkKQogCQkJCQlnb3RvIHJldHVybl9kaWRfb3V0OwogCQkJCWJyZWFrOwotCQkJY2FzZSAxOgkvKiBXaG9sZSBOX1BvcnQgQXJlYSBlZmZlY3RlZCAqLworCQkJY2FzZSBSU0NOX0FERFJFU1NfRk9STUFUX0FSRUE6CiAJCQkJaWYgKChuc19kaWQudW4uYi5kb21haW4gPT0gcnNjbl9kaWQudW4uYi5kb21haW4pCiAJCQkJICAgICYmIChuc19kaWQudW4uYi5hcmVhID09IHJzY25fZGlkLnVuLmIuYXJlYSkpCiAJCQkJCWdvdG8gcmV0dXJuX2RpZF9vdXQ7CiAJCQkJYnJlYWs7Ci0JCQljYXNlIDI6CS8qIFdob2xlIE5fUG9ydCBEb21haW4gZWZmZWN0ZWQgKi8KKwkJCWNhc2UgUlNDTl9BRERSRVNTX0ZPUk1BVF9ET01BSU46CiAJCQkJaWYgKG5zX2RpZC51bi5iLmRvbWFpbiA9PSByc2NuX2RpZC51bi5iLmRvbWFpbikKIAkJCQkJZ290byByZXR1cm5fZGlkX291dDsKIAkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogVW5rbm93biBJZGVudGlmaWVyIGluIFJTQ04gbm9kZSAqLwotCQkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRElTQ09WRVJZLAotCQkJCQkJICIwMjE3IFVua25vd24gSWRlbnRpZmllciBpbiAiCi0JCQkJCQkgIlJTQ04gcGF5bG9hZCBEYXRhOiB4JXhcbiIsCi0JCQkJCQkgcnNjbl9kaWQudW4ud29yZCk7Ci0JCQljYXNlIDM6CS8qIFdob2xlIEZhYnJpYyBlZmZlY3RlZCAqLworCQkJY2FzZSBSU0NOX0FERFJFU1NfRk9STUFUX0ZBQlJJQzoKIAkJCQlnb3RvIHJldHVybl9kaWRfb3V0OwogCQkJfQogCQl9CkBAIC0zODg3LDYgKzM4OTUsNDkgQEAKIH0KIAogLyoqCisgKiBscGZjX3NlbmRfcnNjbl9ldmVudDogU2VuZCBhbiBSU0NOIGV2ZW50IHRvIG1hbmFnZW1lbnQgYXBwbGljYXRpb24uCisgKiBAdnBvcnQ6IHBvaW50ZXIgdG8gYSBob3N0IHZpcnR1YWwgTl9Qb3J0IGRhdGEgc3RydWN0dXJlLgorICogQGNtZGlvY2I6IHBvaW50ZXIgdG8gbHBmYyBjb21tYW5kIGlvY2IgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogbHBmY19zZW5kX3JzY25fZXZlbnQgc2VuZHMgYW4gUlNDTiBuZXRsaW5rIGV2ZW50IHRvIG1hbmFnZW1lbnQKKyAqIGFwcGxpY2F0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2xwZmNfc2VuZF9yc2NuX2V2ZW50KHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKKwkJc3RydWN0IGxwZmNfaW9jYnEgKmNtZGlvY2IpCit7CisJc3RydWN0IGxwZmNfZG1hYnVmICpwY21kOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gbHBmY19zaG9zdF9mcm9tX3Zwb3J0KHZwb3J0KTsKKwl1aW50MzJfdCAqcGF5bG9hZF9wdHI7CisJdWludDMyX3QgcGF5bG9hZF9sZW47CisJc3RydWN0IGxwZmNfcnNjbl9ldmVudF9oZWFkZXIgKnJzY25fZXZlbnRfZGF0YTsKKworCXBjbWQgPSAoc3RydWN0IGxwZmNfZG1hYnVmICopIGNtZGlvY2ItPmNvbnRleHQyOworCXBheWxvYWRfcHRyID0gKHVpbnQzMl90ICopIHBjbWQtPnZpcnQ7CisJcGF5bG9hZF9sZW4gPSBiZTMyX3RvX2NwdSgqcGF5bG9hZF9wdHIgJiB+RUxTX0NNRF9NQVNLKTsKKworCXJzY25fZXZlbnRfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBscGZjX3JzY25fZXZlbnRfaGVhZGVyKSArCisJCXBheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJzY25fZXZlbnRfZGF0YSkgeworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKKwkJCSIwMTQ3IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJTQ04gZXZlbnRcbiIpOworCQlyZXR1cm47CisJfQorCXJzY25fZXZlbnRfZGF0YS0+ZXZlbnRfdHlwZSA9IEZDX1JFR19SU0NOX0VWRU5UOworCXJzY25fZXZlbnRfZGF0YS0+cGF5bG9hZF9sZW5ndGggPSBwYXlsb2FkX2xlbjsKKwltZW1jcHkocnNjbl9ldmVudF9kYXRhLT5yc2NuX3BheWxvYWQsIHBheWxvYWRfcHRyLAorCQlwYXlsb2FkX2xlbik7CisKKwlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LAorCQlmY19nZXRfZXZlbnRfbnVtYmVyKCksCisJCXNpemVvZihzdHJ1Y3QgbHBmY19lbHNfZXZlbnRfaGVhZGVyKSArIHBheWxvYWRfbGVuLAorCQkoY2hhciAqKXJzY25fZXZlbnRfZGF0YSwKKwkJTFBGQ19OTF9WRU5ET1JfSUQpOworCisJa2ZyZWUocnNjbl9ldmVudF9kYXRhKTsKK30KKworLyoqCiAgKiBscGZjX2Vsc19yY3ZfcnNjbjogUHJvY2VzcyBhbiB1bnNvbGljaXRlZCByc2NuIGlvY2IuCiAgKiBAdnBvcnQ6IHBvaW50ZXIgdG8gYSBob3N0IHZpcnR1YWwgTl9Qb3J0IGRhdGEgc3RydWN0dXJlLgogICogQGNtZGlvY2I6IHBvaW50ZXIgdG8gbHBmYyBjb21tYW5kIGlvY2IgZGF0YSBzdHJ1Y3R1cmUuCkBAIC0zOTMzLDYgKzM5ODQsMTAgQEAKIAkJCSAiMDIxNCBSU0NOIHJlY2VpdmVkIERhdGE6IHgleCB4JXggeCV4IHgleFxuIiwKIAkJCSB2cG9ydC0+ZmNfZmxhZywgcGF5bG9hZF9sZW4sICpscCwKIAkJCSB2cG9ydC0+ZmNfcnNjbl9pZF9jbnQpOworCisJLyogU2VuZCBhbiBSU0NOIGV2ZW50IHRvIHRoZSBtYW5hZ2VtZW50IGFwcGxpY2F0aW9uICovCisJbHBmY19zZW5kX3JzY25fZXZlbnQodnBvcnQsIGNtZGlvY2IpOworCiAJZm9yIChpID0gMDsgaSA8IHBheWxvYWRfbGVuL3NpemVvZih1aW50MzJfdCk7IGkrKykKIAkJZmNfaG9zdF9wb3N0X2V2ZW50KHNob3N0LCBmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCQlGQ0hfRVZUX1JTQ04sIGxwW2ldKTsKQEAgLTQ4ODQsMTAgKzQ5MzksNiBAQAogCXVpbnQzMl90IHRpbWVvdXQ7CiAJdWludDMyX3QgcmVtb3RlX0lEID0gMHhmZmZmZmZmZjsKIAotCS8qIElmIHRoZSB0aW1lciBpcyBhbHJlYWR5IGNhbmNlbGVkIGRvIG5vdGhpbmcgKi8KLQlpZiAoKHZwb3J0LT53b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX0VMU19UTU8pID09IDApIHsKLQkJcmV0dXJuOwotCX0KIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAl0aW1lb3V0ID0gKHVpbnQzMl90KShwaGJhLT5mY19yYXRvdiA8PCAxKTsKIApAQCAtNTEyOCw3ICs1MTc5LDcgQEAKIAkJCWZjX2dldF9ldmVudF9udW1iZXIoKSwKIAkJCXNpemVvZihsc3JqdF9ldmVudCksCiAJCQkoY2hhciAqKSZsc3JqdF9ldmVudCwKLQkJCVNDU0lfTkxfVklEX1RZUEVfUENJIHwgUENJX1ZFTkRPUl9JRF9FTVVMRVgpOworCQkJTFBGQ19OTF9WRU5ET1JfSUQpOwogCQlyZXR1cm47CiAJfQogCWlmICgocnNwaW9jYnAtPmlvY2IudWxwU3RhdHVzID09IElPU1RBVF9OUE9SVF9CU1kpIHx8CkBAIC01MTQ2LDcgKzUxOTcsNyBAQAogCQkJZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQkJc2l6ZW9mKGZhYnJpY19ldmVudCksCiAJCQkoY2hhciAqKSZmYWJyaWNfZXZlbnQsCi0JCQlTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfRU1VTEVYKTsKKwkJCUxQRkNfTkxfVkVORE9SX0lEKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTE2NCwzMiArNTIxNSw2OCBAQAogc3RhdGljIHZvaWQKIGxwZmNfc2VuZF9lbHNfZXZlbnQoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkgICAgc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHAsCi0JCSAgICB1aW50MzJfdCBjbWQpCisJCSAgICB1aW50MzJfdCAqcGF5bG9hZCkKIHsKLQlzdHJ1Y3QgbHBmY19lbHNfZXZlbnRfaGVhZGVyIGVsc19kYXRhOworCXN0cnVjdCBscGZjX2Vsc19ldmVudF9oZWFkZXIgKmVsc19kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgbHBmY19sb2dvX2V2ZW50ICpsb2dvX2RhdGEgPSBOVUxMOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gbHBmY19zaG9zdF9mcm9tX3Zwb3J0KHZwb3J0KTsKIAotCWVsc19kYXRhLmV2ZW50X3R5cGUgPSBGQ19SRUdfRUxTX0VWRU5UOwotCXN3aXRjaCAoY21kKSB7CisJaWYgKCpwYXlsb2FkID09IEVMU19DTURfTE9HTykgeworCQlsb2dvX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbHBmY19sb2dvX2V2ZW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbG9nb19kYXRhKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0VMUywKKwkJCQkiMDE0OCBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkiZm9yIExPR08gZXZlbnRcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWVsc19kYXRhID0gJmxvZ29fZGF0YS0+aGVhZGVyOworCX0gZWxzZSB7CisJCWVsc19kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxwZmNfZWxzX2V2ZW50X2hlYWRlciksCisJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbHNfZGF0YSkgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19FTFMsCisJCQkJIjAxNDkgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkJImZvciBFTFMgZXZlbnRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc19kYXRhLT5ldmVudF90eXBlID0gRkNfUkVHX0VMU19FVkVOVDsKKwlzd2l0Y2ggKCpwYXlsb2FkKSB7CiAJY2FzZSBFTFNfQ01EX1BMT0dJOgotCQllbHNfZGF0YS5zdWJjYXRlZ29yeSA9IExQRkNfRVZFTlRfUExPR0lfUkNWOworCQllbHNfZGF0YS0+c3ViY2F0ZWdvcnkgPSBMUEZDX0VWRU5UX1BMT0dJX1JDVjsKIAkJYnJlYWs7CiAJY2FzZSBFTFNfQ01EX1BSTE86Ci0JCWVsc19kYXRhLnN1YmNhdGVnb3J5ID0gTFBGQ19FVkVOVF9QUkxPX1JDVjsKKwkJZWxzX2RhdGEtPnN1YmNhdGVnb3J5ID0gTFBGQ19FVkVOVF9QUkxPX1JDVjsKIAkJYnJlYWs7CiAJY2FzZSBFTFNfQ01EX0FESVNDOgotCQllbHNfZGF0YS5zdWJjYXRlZ29yeSA9IExQRkNfRVZFTlRfQURJU0NfUkNWOworCQllbHNfZGF0YS0+c3ViY2F0ZWdvcnkgPSBMUEZDX0VWRU5UX0FESVNDX1JDVjsKKwkJYnJlYWs7CisJY2FzZSBFTFNfQ01EX0xPR086CisJCWVsc19kYXRhLT5zdWJjYXRlZ29yeSA9IExQRkNfRVZFTlRfTE9HT19SQ1Y7CisJCS8qIENvcHkgdGhlIFdXUE4gaW4gdGhlIExPR08gcGF5bG9hZCAqLworCQltZW1jcHkobG9nb19kYXRhLT5sb2dvX3d3cG4sICZwYXlsb2FkWzJdLAorCQkJc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KLQltZW1jcHkoZWxzX2RhdGEud3dwbiwgJm5kbHAtPm5scF9wb3J0bmFtZSwgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKLQltZW1jcHkoZWxzX2RhdGEud3dubiwgJm5kbHAtPm5scF9ub2RlbmFtZSwgc2l6ZW9mKHN0cnVjdCBscGZjX25hbWUpKTsKLQlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LAotCQlmY19nZXRfZXZlbnRfbnVtYmVyKCksCi0JCXNpemVvZihlbHNfZGF0YSksCi0JCShjaGFyICopJmVsc19kYXRhLAotCQlTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfRU1VTEVYKTsKKwltZW1jcHkoZWxzX2RhdGEtPnd3cG4sICZuZGxwLT5ubHBfcG9ydG5hbWUsIHNpemVvZihzdHJ1Y3QgbHBmY19uYW1lKSk7CisJbWVtY3B5KGVsc19kYXRhLT53d25uLCAmbmRscC0+bmxwX25vZGVuYW1lLCBzaXplb2Yoc3RydWN0IGxwZmNfbmFtZSkpOworCWlmICgqcGF5bG9hZCA9PSBFTFNfQ01EX0xPR08pIHsKKwkJZmNfaG9zdF9wb3N0X3ZlbmRvcl9ldmVudChzaG9zdCwKKwkJCWZjX2dldF9ldmVudF9udW1iZXIoKSwKKwkJCXNpemVvZihzdHJ1Y3QgbHBmY19sb2dvX2V2ZW50KSwKKwkJCShjaGFyICopbG9nb19kYXRhLAorCQkJTFBGQ19OTF9WRU5ET1JfSUQpOworCQlrZnJlZShsb2dvX2RhdGEpOworCX0gZWxzZSB7CisJCWZjX2hvc3RfcG9zdF92ZW5kb3JfZXZlbnQoc2hvc3QsCisJCQlmY19nZXRfZXZlbnRfbnVtYmVyKCksCisJCQlzaXplb2Yoc3RydWN0IGxwZmNfZWxzX2V2ZW50X2hlYWRlciksCisJCQkoY2hhciAqKWVsc19kYXRhLAorCQkJTFBGQ19OTF9WRU5ET1JfSUQpOworCQlrZnJlZShlbHNfZGF0YSk7CisJfQogCiAJcmV0dXJuOwogfQpAQCAtNTI5Niw3ICs1MzgzLDcgQEAKIAkJcGhiYS0+ZmNfc3RhdC5lbHNSY3ZQTE9HSSsrOwogCQluZGxwID0gbHBmY19wbG9naV9jb25maXJtX25wb3J0KHBoYmEsIHBheWxvYWQsIG5kbHApOwogCi0JCWxwZmNfc2VuZF9lbHNfZXZlbnQodnBvcnQsIG5kbHAsIGNtZCk7CisJCWxwZmNfc2VuZF9lbHNfZXZlbnQodnBvcnQsIG5kbHAsIHBheWxvYWQpOwogCQlpZiAodnBvcnQtPnBvcnRfc3RhdGUgPCBMUEZDX0RJU0NfQVVUSCkgewogCQkJaWYgKCEocGhiYS0+cHBvcnQtPmZjX2ZsYWcgJiBGQ19QVDJQVCkgfHwKIAkJCQkocGhiYS0+cHBvcnQtPmZjX2ZsYWcgJiBGQ19QVDJQVF9QTE9HSSkpIHsKQEAgLTUzMzQsNiArNTQyMSw3IEBACiAJCQlkaWQsIHZwb3J0LT5wb3J0X3N0YXRlLCBuZGxwLT5ubHBfZmxhZyk7CiAKIAkJcGhiYS0+ZmNfc3RhdC5lbHNSY3ZMT0dPKys7CisJCWxwZmNfc2VuZF9lbHNfZXZlbnQodnBvcnQsIG5kbHAsIHBheWxvYWQpOwogCQlpZiAodnBvcnQtPnBvcnRfc3RhdGUgPCBMUEZDX0RJU0NfQVVUSCkgewogCQkJcmp0X2VyciA9IExTUkpUX1VOQUJMRV9UUEM7CiAJCQlicmVhazsKQEAgLTUzNDYsNyArNTQzNCw3IEBACiAJCQlkaWQsIHZwb3J0LT5wb3J0X3N0YXRlLCBuZGxwLT5ubHBfZmxhZyk7CiAKIAkJcGhiYS0+ZmNfc3RhdC5lbHNSY3ZQUkxPKys7Ci0JCWxwZmNfc2VuZF9lbHNfZXZlbnQodnBvcnQsIG5kbHAsIGNtZCk7CisJCWxwZmNfc2VuZF9lbHNfZXZlbnQodnBvcnQsIG5kbHAsIHBheWxvYWQpOwogCQlpZiAodnBvcnQtPnBvcnRfc3RhdGUgPCBMUEZDX0RJU0NfQVVUSCkgewogCQkJcmp0X2VyciA9IExTUkpUX1VOQUJMRV9UUEM7CiAJCQlicmVhazsKQEAgLTUzNjQsNyArNTQ1Miw3IEBACiAJCQkiUkNWIEFESVNDOiAgICAgICBkaWQ6eCV4L3N0ZTp4JXggZmxnOngleCIsCiAJCQlkaWQsIHZwb3J0LT5wb3J0X3N0YXRlLCBuZGxwLT5ubHBfZmxhZyk7CiAKLQkJbHBmY19zZW5kX2Vsc19ldmVudCh2cG9ydCwgbmRscCwgY21kKTsKKwkJbHBmY19zZW5kX2Vsc19ldmVudCh2cG9ydCwgbmRscCwgcGF5bG9hZCk7CiAJCXBoYmEtPmZjX3N0YXQuZWxzUmN2QURJU0MrKzsKIAkJaWYgKHZwb3J0LT5wb3J0X3N0YXRlIDwgTFBGQ19ESVNDX0FVVEgpIHsKIAkJCXJqdF9lcnIgPSBMU1JKVF9VTkFCTEVfVFBDOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCBhMWE3MGQ5Li44YzY0NDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAJCQlldnRfZGF0YV9zaXplID0gc2l6ZW9mKGZhc3RfZXZ0X2RhdGEtPnVuLgogCQkJCXJlYWRfY2hlY2tfZXJyb3IpOwogCQl9IGVsc2UgaWYgKChldnRfc3ViX2NhdGVnb3J5ID09IExQRkNfRVZFTlRfRkFCUklDX0JVU1kpIHx8Ci0JCQkoZXZ0X3N1Yl9jYXRlZ29yeSA9PSBJT1NUQVRfTlBPUlRfQlNZKSkgeworCQkJKGV2dF9zdWJfY2F0ZWdvcnkgPT0gTFBGQ19FVkVOVF9QT1JUX0JVU1kpKSB7CiAJCQlldnRfZGF0YSA9IChjaGFyICopICZmYXN0X2V2dF9kYXRhLT51bi5mYWJyaWNfZXZ0OwogCQkJZXZ0X2RhdGFfc2l6ZSA9IHNpemVvZihmYXN0X2V2dF9kYXRhLT51bi5mYWJyaWNfZXZ0KTsKIAkJfSBlbHNlIHsKQEAgLTM4Nyw3ICszODcsNyBAQAogCQlmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCWV2dF9kYXRhX3NpemUsCiAJCWV2dF9kYXRhLAotCQlTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfRU1VTEVYKTsKKwkJTFBGQ19OTF9WRU5ET1JfSUQpOwogCiAJbHBmY19mcmVlX2Zhc3RfZXZ0KHBoYmEsIGZhc3RfZXZ0X2RhdGEpOwogCXJldHVybjsKQEAgLTU4NSwyMCArNTg1LDI1IEBACiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCXBoYmEtPmRhdGFfZmxhZ3MgPSAwOwogCi0Jd2hpbGUgKDEpIHsKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQkvKiB3YWl0IGFuZCBjaGVjayB3b3JrZXIgcXVldWUgYWN0aXZpdGllcyAqLwogCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwaGJhLT53b3JrX3dhaXRxLAogCQkJCQkodGVzdF9hbmRfY2xlYXJfYml0KExQRkNfREFUQV9SRUFEWSwKIAkJCQkJCQkgICAgJnBoYmEtPmRhdGFfZmxhZ3MpCiAJCQkJCSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKTsKLQkJQlVHX09OKHJjKTsKLQotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkvKiBTaWduYWwgd2FrZXVwIHNoYWxsIHRlcm1pbmF0ZSB0aGUgd29ya2VyIHRocmVhZCAqLworCQlpZiAocmMpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0VMUywKKwkJCQkJIjA0MzMgV2FrZXVwIG9uIHNpZ25hbDogcmM9eCV4XG4iLCByYyk7CiAJCQlicmVhazsKKwkJfQogCiAJCS8qIEF0dGVuZCBwZW5kaW5nIGxwZmMgZGF0YSBwcm9jZXNzaW5nICovCiAJCWxwZmNfd29ya19kb25lKHBoYmEpOwogCX0KKwlwaGJhLT53b3JrZXJfdGhyZWFkID0gTlVMTDsKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRUxTLAorCQkJIjA0MzIgV29ya2VyIHRocmVhZCBzdG9wcGVkLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NTIsNiArMTg1NywzMiBAQAogCWxwZmNfbmxwX3N0YXRlX2NsZWFudXAodnBvcnQsIG5kbHAsIG5kbHAtPm5scF9zdGF0ZSwKIAkJCQlOTFBfU1RFX1VOVVNFRF9OT0RFKTsKIH0KKy8qKgorICogbHBmY19pbml0aWFsaXplX25vZGU6IEluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBub2RlIG9iamVjdC4KKyAqIEB2cG9ydDogUG9pbnRlciB0byBWaXJ0dWFsIFBvcnQgb2JqZWN0LgorICogQG5kbHA6IFBvaW50ZXIgdG8gRkMgbm9kZSBvYmplY3QuCisgKiBAZGlkOiBGQ19JRCBvZiB0aGUgbm9kZS4KKyAqCVRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aGVuIG5vZGUgb2JqZWN0IG5lZWQgdG8KKyAqIGJlIGluaXRpYWxpemVkLiBJdCBpbml0aWFsaXplcyBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgbm9kZQorICogb2JqZWN0LgorICoqLworc3RhdGljIGlubGluZSB2b2lkCitscGZjX2luaXRpYWxpemVfbm9kZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsIHN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwLAorCXVpbnQzMl90IGRpZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmbmRscC0+ZWxzX3JldHJ5X2V2dC5ldnRfbGlzdHApOworCUlOSVRfTElTVF9IRUFEKCZuZGxwLT5kZXZfbG9zc19ldnQuZXZ0X2xpc3RwKTsKKwlpbml0X3RpbWVyKCZuZGxwLT5ubHBfZGVsYXlmdW5jKTsKKwluZGxwLT5ubHBfZGVsYXlmdW5jLmZ1bmN0aW9uID0gbHBmY19lbHNfcmV0cnlfZGVsYXk7CisJbmRscC0+bmxwX2RlbGF5ZnVuYy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbmRscDsKKwluZGxwLT5ubHBfRElEID0gZGlkOworCW5kbHAtPnZwb3J0ID0gdnBvcnQ7CisJbmRscC0+bmxwX3NpZCA9IE5MUF9OT19TSUQ7CisJa3JlZl9pbml0KCZuZGxwLT5rcmVmKTsKKwlOTFBfSU5UX05PREVfQUNUKG5kbHApOworCWF0b21pY19zZXQoJm5kbHAtPmNtZF9wZW5kaW5nLCAwKTsKKwluZGxwLT5jbWRfcWRlcHRoID0gTFBGQ19NQVhfVEdUX1FERVBUSDsKK30KIAogc3RydWN0IGxwZmNfbm9kZWxpc3QgKgogbHBmY19lbmFibGVfbm9kZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsIHN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwLApAQCAtMTg5MiwxNyArMTkyMyw3IEBACiAJLyogcmUtaW5pdGlhbGl6ZSBuZGxwIGV4Y2VwdCBvZiBuZGxwIGxpbmtlZCBsaXN0IHBvaW50ZXIgKi8KIAltZW1zZXQoKCgoY2hhciAqKW5kbHApICsgc2l6ZW9mIChzdHJ1Y3QgbGlzdF9oZWFkKSksIDAsCiAJCXNpemVvZiAoc3RydWN0IGxwZmNfbm9kZWxpc3QpIC0gc2l6ZW9mIChzdHJ1Y3QgbGlzdF9oZWFkKSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm5kbHAtPmVsc19yZXRyeV9ldnQuZXZ0X2xpc3RwKTsKLQlJTklUX0xJU1RfSEVBRCgmbmRscC0+ZGV2X2xvc3NfZXZ0LmV2dF9saXN0cCk7Ci0JaW5pdF90aW1lcigmbmRscC0+bmxwX2RlbGF5ZnVuYyk7Ci0JbmRscC0+bmxwX2RlbGF5ZnVuYy5mdW5jdGlvbiA9IGxwZmNfZWxzX3JldHJ5X2RlbGF5OwotCW5kbHAtPm5scF9kZWxheWZ1bmMuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5kbHA7Ci0JbmRscC0+bmxwX0RJRCA9IGRpZDsKLQluZGxwLT52cG9ydCA9IHZwb3J0OwotCW5kbHAtPm5scF9zaWQgPSBOTFBfTk9fU0lEOwotCS8qIG5kbHAgbWFuYWdlbWVudCByZS1pbml0aWFsaXplICovCi0Ja3JlZl9pbml0KCZuZGxwLT5rcmVmKTsKLQlOTFBfSU5UX05PREVfQUNUKG5kbHApOworCWxwZmNfaW5pdGlhbGl6ZV9ub2RlKHZwb3J0LCBuZGxwLCBkaWQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+bmRscF9sb2NrLCBmbGFncyk7CiAKQEAgLTMxMTYsMTkgKzMxMzcsOSBAQAogCSAgICAgIHVpbnQzMl90IGRpZCkKIHsKIAltZW1zZXQobmRscCwgMCwgc2l6ZW9mIChzdHJ1Y3QgbHBmY19ub2RlbGlzdCkpOwotCUlOSVRfTElTVF9IRUFEKCZuZGxwLT5lbHNfcmV0cnlfZXZ0LmV2dF9saXN0cCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm5kbHAtPmRldl9sb3NzX2V2dC5ldnRfbGlzdHApOwotCWluaXRfdGltZXIoJm5kbHAtPm5scF9kZWxheWZ1bmMpOwotCW5kbHAtPm5scF9kZWxheWZ1bmMuZnVuY3Rpb24gPSBscGZjX2Vsc19yZXRyeV9kZWxheTsKLQluZGxwLT5ubHBfZGVsYXlmdW5jLmRhdGEgPSAodW5zaWduZWQgbG9uZyluZGxwOwotCW5kbHAtPm5scF9ESUQgPSBkaWQ7Ci0JbmRscC0+dnBvcnQgPSB2cG9ydDsKLQluZGxwLT5ubHBfc2lkID0gTkxQX05PX1NJRDsKKworCWxwZmNfaW5pdGlhbGl6ZV9ub2RlKHZwb3J0LCBuZGxwLCBkaWQpOwogCUlOSVRfTElTVF9IRUFEKCZuZGxwLT5ubHBfbGlzdHApOwotCWtyZWZfaW5pdCgmbmRscC0+a3JlZik7Ci0JTkxQX0lOVF9OT0RFX0FDVChuZGxwKTsKLQlhdG9taWNfc2V0KCZuZGxwLT5jbWRfcGVuZGluZywgMCk7Ci0JbmRscC0+Y21kX3FkZXB0aCA9IExQRkNfTUFYX1RHVF9RREVQVEg7CiAKIAlscGZjX2RlYnVnZnNfZGlzY190cmModnBvcnQsIExQRkNfRElTQ19UUkNfTk9ERSwKIAkJIm5vZGUgaW5pdDogICAgICAgZGlkOngleCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKaW5kZXggNWRlNWRhYi4uNDE2OGM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaApAQCAtNjUsNiArNjUsOSBAQAogI2RlZmluZSBTTEkzX0lPQ0JfUlNQX1NJWkUJNjQKIAogCisvKiB2ZW5kb3IgSUQgdXNlZCBpbiBTQ1NJIG5ldGxpbmsgY2FsbHMgKi8KKyNkZWZpbmUgTFBGQ19OTF9WRU5ET1JfSUQgKFNDU0lfTkxfVklEX1RZUEVfUENJIHwgUENJX1ZFTkRPUl9JRF9FTVVMRVgpCisKIC8qIENvbW1vbiBUcmFuc3BvcnQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgKi8KIAogdW5pb24gQ3RSZXZpc2lvbklkIHsKQEAgLTg2Niw2ICs4NjksMTIgQEAKIAl9IHVuOwogfSBEX0lEOwogCisjZGVmaW5lIFJTQ05fQUREUkVTU19GT1JNQVRfUE9SVAkweDAKKyNkZWZpbmUgUlNDTl9BRERSRVNTX0ZPUk1BVF9BUkVBCTB4MQorI2RlZmluZSBSU0NOX0FERFJFU1NfRk9STUFUX0RPTUFJTgkweDIKKyNkZWZpbmUgUlNDTl9BRERSRVNTX0ZPUk1BVF9GQUJSSUMJMHgzCisjZGVmaW5lIFJTQ05fQUREUkVTU19GT1JNQVRfTUFTSwkweDMKKwogLyoKICAqICBTdHJ1Y3R1cmUgdG8gZGVmaW5lIGFsbCBFTFMgUGF5bG9hZCB0eXBlcwogICovCkBAIC0xNTM1LDYgKzE1NDQsMTA4IEBACiAJdWludDMyX3QgdWxwSW9UYWczMjsJLyogQ2FuIGJlIHVzZWQgZm9yIDMyIGJpdCBJL08gVGFnICovCiB9IFVMUF9CREw7CiAKKy8qCisgKiBCbG9ja0d1YXJkIERlZmluaXRpb25zCisgKi8KKworZW51bSBscGZjX3Byb3RncnBfdHlwZSB7CisJTFBGQ19QR19UWVBFX0lOVkFMSUQgPSAwLCAvKiB1c2VkIHRvIGluZGljYXRlIGVycm9ycyAgICAgICAgICAgICAgICAgICovCisJTFBGQ19QR19UWVBFX05PX0RJRiwJICAvKiBubyBESUYgZGF0YSBwb2ludGVkIHRvIGJ5IHByb3QgZ3JwICAgICAgICovCisJTFBGQ19QR19UWVBFX0VNQkRfRElGLAkgIC8qIERJRiBpcyBlbWJlZGRlZCAoaW5saW5lKSB3aXRoIGRhdGEgICAgICAgKi8KKwlMUEZDX1BHX1RZUEVfRElGX0JVRgkgIC8qIERJRiBoYXMgaXRzIG93biBzY2F0dGVyL2dhdGhlciBsaXN0ICAgICAgKi8KK307CisKKy8qIFBERSBEZXNjcmlwdG9ycyAqLworI2RlZmluZSBMUEZDX1BERTFfREVTQ1JJUFRPUgkJMHg4MQorI2RlZmluZSBMUEZDX1BERTJfREVTQ1JJUFRPUgkJMHg4MgorI2RlZmluZSBMUEZDX1BERTNfREVTQ1JJUFRPUgkJMHg4MworCisvKiBCbG9ja0d1YXJkIFByb2ZpbGVzICovCitlbnVtIGxwZmNfYmdfcHJvZl9jb2RlcyB7CisJTFBGQ19QUk9GX0lOVkFMSUQsCisJTFBGQ19QUk9GX0ExCT0gMTI4LAkvKiBGdWxsIFByb3RlY3Rpb24JCQkgICAgICAqLworCUxQRkNfUFJPRl9BMiwJCS8qIERpc2FibGVkIFByb3RlY3Rpb24gQ2hlY2tzOkEyfkE0ICAgICAgICAgICAqLworCUxQRkNfUFJPRl9BMywKKwlMUEZDX1BST0ZfQTQsCisJTFBGQ19QUk9GX0IxLAkJLyogRW1iZWRkZWQgRElGczogQjF+QjMJICAgICAgICAgICAgICAgICAgICAgICovCisJTFBGQ19QUk9GX0IyLAorCUxQRkNfUFJPRl9CMywKKwlMUEZDX1BST0ZfQzEsCQkvKiBTZXBhcmF0ZSBESUZzOiBDMX5DMyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlMUEZDX1BST0ZfQzIsCisJTFBGQ19QUk9GX0MzLAorCUxQRkNfUFJPRl9EMSwJCS8qIEZ1bGwgUHJvdGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCUxQRkNfUFJPRl9EMiwJCS8qIFBhcnRpYWwgUHJvdGVjdGlvbiAmIENoZWNrIERpc2FibGluZyAgICAgICAqLworCUxQRkNfUFJPRl9EMywKKwlMUEZDX1BST0ZfRTEsCQkvKiBFMX5FNDpvdXQgLSBjaGVjay1vbmx5LCBpbiAtIHVwZGF0ZSBhcHB0YWcgKi8KKwlMUEZDX1BST0ZfRTIsCisJTFBGQ19QUk9GX0UzLAorCUxQRkNfUFJPRl9FNCwKKwlMUEZDX1BST0ZfRjEsCQkvKiBGdWxsIFRyYW5zbGF0aW9uIC0gRjEgUHJvdCBEZXNjcmlwdG9yICAgICAgKi8KKwkJCQkvKiBGMSBUcmFuc2xhdGlvbiBCREUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlMUEZDX1BST0ZfQU5UMSwJCS8qIFRDUCBjaGVja3N1bSwgRElGIGlubGluZSB3aXRoIGRhdGEgYnVmZmVycyAqLworCUxQRkNfUFJPRl9BU1QxLAkJLyogVENQIGNoZWNrc3VtLCBESUYgc3BsaXQgZnJvbSBkYXRhIGJ1ZmZlciAgICovCisJTFBGQ19QUk9GX0FOVDIsCisJTFBGQ19QUk9GX0FTVDIKK307CisKKy8qIEJsb2NrR3VhcmQgZXJyb3ItY29udHJvbCBkZWZpbmVzICovCisjZGVmaW5lIEJHX0VDX1NUT1BfRVJSCQkJMHgwMAorI2RlZmluZSBCR19FQ19DT05UX0VSUgkJCTB4MDEKKyNkZWZpbmUgQkdfRUNfSUdOX1VOSU5JVF9TVE9QX0VSUgkweDEwCisjZGVmaW5lIEJHX0VDX0lHTl9VTklOSVRfQ09OVF9FUlIJMHgxMQorCisvKiBQREUgKFByb3RlY3Rpb24gRGVzY3JpcHRvciBFbnRyeSkgd29yZCAwIGJpdCBtYXNrcyBhbmQgc2hpZnRzICovCisjZGVmaW5lIFBERV9ERVNDX1RZUEVfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBQREVfREVTQ19UWVBFX1NISUZUCQkyNAorI2RlZmluZSBQREVfQkdfUFJPRklMRV9NQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIFBERV9CR19QUk9GSUxFX1NISUZUCQkxNgorI2RlZmluZSBQREVfQkxPQ0tfTEVOX01BU0sJCTB4MDAwMGZmZmMKKyNkZWZpbmUgUERFX0JMT0NLX0xFTl9TSElGVAkJMgorI2RlZmluZSBQREVfRVJSX0NUUkxfTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBQREVfRVJSX0NUUkxfU0hJRlQJCTAKKy8qIFBERSB3b3JkIDEgYml0IG1hc2tzIGFuZCBzaGlmdHMgKi8KKyNkZWZpbmUgUERFX0FQUFRBR19NQVNLX01BU0sJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgUERFX0FQUFRBR19NQVNLX1NISUZUCQkxNgorI2RlZmluZSBQREVfQVBQVEFHX1ZBTF9NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIFBERV9BUFBUQUdfVkFMX1NISUZUCQkwCitzdHJ1Y3QgbHBmY19wZGUgeworCXVpbnQzMl90IHBhcm1zOyAgICAgLyogYml0ZmllbGRzIG9mIGRlc2NyaXB0b3IsIHByb2YsIGxlbiwgYW5kIGVjICovCisJdWludDMyX3QgYXBwdGFnOyAgICAvKiBiaXRmaWVsZHMgb2YgYXBwIHRhZyBtYXNrYW5kIGFwcCB0YWcgdmFsdWUgKi8KKwl1aW50MzJfdCByZWZ0YWc7ICAgIC8qIHJlZmVyZW5jZSB0YWcgb2NjdXB5aW5nIGFsbCAzMiBiaXRzICAgICAgICAqLworfTsKKworLyogaW5saW5lIGZ1bmN0aW9uIHRvIHNldCBmaWVsZHMgaW4gcGFybXMgb2YgUERFICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2xwZmNfcGRlX3NldF9iZ19wYXJtcyhzdHJ1Y3QgbHBmY19wZGUgKnAsIHU4IGRlc2MsIHU4IHByb2YsIHUxNiBsZW4sIHU4IGVjKQoreworCXVpbnQzMl90ICp3cCA9ICZwLT5wYXJtczsKKworCS8qIHNwZWMgaW5kaWNhdGVzIHRoYXQgYWRhcHRlciBhcHBlbmRzIHR3byAwJ3MgdG8gbGVuZ3RoIGZpZWxkICovCisJbGVuID0gbGVuID4+IDI7CisKKwkqd3AgJj0gMDsKKwkqd3AgfD0gKChkZXNjIDw8IFBERV9ERVNDX1RZUEVfU0hJRlQpICYgUERFX0RFU0NfVFlQRV9NQVNLKTsKKwkqd3AgfD0gKChwcm9mIDw8IFBERV9CR19QUk9GSUxFX1NISUZUKSAmIFBERV9CR19QUk9GSUxFX01BU0spOworCSp3cCB8PSAoKGxlbiA8PCBQREVfQkxPQ0tfTEVOX1NISUZUKSAmIFBERV9CTE9DS19MRU5fTUFTSyk7CisJKndwIHw9ICgoZWMgPDwgUERFX0VSUl9DVFJMX1NISUZUKSAmIFBERV9FUlJfQ1RSTF9NQVNLKTsKKwkqd3AgPSBsZTMyX3RvX2NwdSgqd3ApOworfQorCisvKiBpbmxpbmUgZnVuY3Rpb24gdG8gc2V0IGFwcHRhZyBhbmQgcmVmdGFnIGZpZWxkcyBvZiBQREUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbHBmY19wZGVfc2V0X2RpZl9wYXJtcyhzdHJ1Y3QgbHBmY19wZGUgKnAsIHUxNiBhcHB0YWdtYXNrLCB1MTYgYXBwdGFndmFsLAorCQl1MzIgcmVmdGFnKQoreworCXVpbnQzMl90ICp3cCA9ICZwLT5hcHB0YWc7CisJKndwICY9IDA7CisJKndwIHw9ICgoYXBwdGFnbWFzayA8PCBQREVfQVBQVEFHX01BU0tfU0hJRlQpICYgUERFX0FQUFRBR19NQVNLX01BU0spOworCSp3cCB8PSAoKGFwcHRhZ3ZhbCA8PCBQREVfQVBQVEFHX1ZBTF9TSElGVCkgJiBQREVfQVBQVEFHX1ZBTF9NQVNLKTsKKwkqd3AgPSBsZTMyX3RvX2NwdSgqd3ApOworCXdwID0gJnAtPnJlZnRhZzsKKwkqd3AgPSBsZTMyX3RvX2NwdShyZWZ0YWcpOworfQorCisKIC8qIFN0cnVjdHVyZSBmb3IgTUIgQ29tbWFuZCBMT0FEX1NNIGFuZCBET1dOX0xPQUQgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMjM1OSw2ICsyNDcwLDMwIEBACiAjZGVmaW5lICBETVBfUlNQX09GRlNFVCAgICAgICAgICAweDE0ICAgLyogd29yZCA1IGNvbnRhaW5zIGZpcnN0IHdvcmQgb2YgcnNwICovCiAjZGVmaW5lICBETVBfUlNQX1NJWkUgICAgICAgICAgICAweDZDICAgLyogbWF4aW11bSBvZiAyNyB3b3JkcyBvZiByc3AgZGF0YSAqLwogCisjZGVmaW5lICBXQUtFX1VQX1BBUk1TX1JFR0lPTl9JRCAgICA0CisjZGVmaW5lICBXQUtFX1VQX1BBUk1TX1dPUkRfU0laRSAgIDE1CisKKy8qIE9wdGlvbiByb20gdmVyc2lvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwcm9nX2lkIHsKKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKwl1aW50OF90ICB0eXBlOworCXVpbnQ4X3QgIGlkOworCXVpbnQzMl90IHZlcjo0OyAgLyogTWFqb3IgVmVyc2lvbiAqLworCXVpbnQzMl90IHJldjo0OyAgLyogUmV2aXNpb24gKi8KKwl1aW50MzJfdCBsZXY6MjsgIC8qIExldmVsICovCisJdWludDMyX3QgZGlzdDoyOyAvKiBEaXN0IFR5cGUgKi8KKwl1aW50MzJfdCBudW06NDsgIC8qIG51bWJlciBhZnRlciBkaXN0IHR5cGUgKi8KKyNlbHNlIC8qICBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQgKi8KKwl1aW50MzJfdCBudW06NDsgIC8qIG51bWJlciBhZnRlciBkaXN0IHR5cGUgKi8KKwl1aW50MzJfdCBkaXN0OjI7IC8qIERpc3QgVHlwZSAqLworCXVpbnQzMl90IGxldjoyOyAgLyogTGV2ZWwgKi8KKwl1aW50MzJfdCByZXY6NDsgIC8qIFJldmlzaW9uICovCisJdWludDMyX3QgdmVyOjQ7ICAvKiBNYWpvciBWZXJzaW9uICovCisJdWludDhfdCAgaWQ7CisJdWludDhfdCAgdHlwZTsKKyNlbmRpZgorfTsKKwogLyogU3RydWN0dXJlIGZvciBNQiBDb21tYW5kIFVQREFURV9DRkcgKDB4MUIpICovCiAKIHN0cnVjdCB1cGRhdGVfY2ZnX3ZhciB7CkBAIC0yNTUyLDExICsyNjg3LDE5IEBACiAKIAl1aW50MzJfdCBwY2JMb3c7ICAgICAgIC8qIGJpdCAzMTowICBvZiBtZW1vcnkgYmFzZWQgcG9ydCBjb25maWcgYmxvY2sgKi8KIAl1aW50MzJfdCBwY2JIaWdoOyAgICAgIC8qIGJpdCA2MzozMiBvZiBtZW1vcnkgYmFzZWQgcG9ydCBjb25maWcgYmxvY2sgKi8KLQl1aW50MzJfdCBoYmFpbml0WzZdOworCXVpbnQzMl90IGhiYWluaXRbNV07CisjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisJdWludDMyX3QgaHBzCSAgIDogIDE7IC8qIGJpdCAzMSB3b3JkOSBIb3N0IFBvaW50ZXIgaW4gc2xpbSAqLworCXVpbnQzMl90IHJzdmQJICAgOiAzMTsgLyogbGVhc3Qgc2lnbmlmaWNhbnQgMzEgYml0cyBvZiB3b3JkIDkgKi8KKyNlbHNlICAgLyogIF9fTElUVExFX0VORElBTiAqLworCXVpbnQzMl90IHJzdmQgICAgICA6IDMxOyAvKiBsZWFzdCBzaWduaWZpY2FudCAzMSBiaXRzIG9mIHdvcmQgOSAqLworCXVpbnQzMl90IGhwcwkgICA6ICAxOyAvKiBiaXQgMzEgd29yZDkgSG9zdCBQb2ludGVyIGluIHNsaW0gKi8KKyNlbmRpZgogCiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECi0JdWludDMyX3QgcnN2ZCAgICAgIDogMjQ7ICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1aW50MzJfdCBjbXYJICAgOiAgMTsgIC8qIENvbmZpZ3VyZSBNYXggVlBJcyAgICAgICAgICAgICAgICAgICAqLworCXVpbnQzMl90IHJzdmQxICAgICA6IDIzOyAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdWludDMyX3QgY2JnICAgICAgIDogIDE7ICAvKiBDb25maWd1cmUgQmxvY2tHdWFyZCAgICAgICAgICAgICAgICAgKi8KKwl1aW50MzJfdCBjbXYgICAgICAgOiAgMTsgIC8qIENvbmZpZ3VyZSBNYXggVlBJcyAgICAgICAgICAgICAgICAgICAqLwogCXVpbnQzMl90IGNjcnAgICAgICA6ICAxOyAgLyogQ29uZmlnIENvbW1hbmQgUmluZyBQb2xsaW5nICAgICAgICAgICovCiAJdWludDMyX3QgY3NhaCAgICAgIDogIDE7ICAvKiBDb25maWd1cmUgU3luY2hyb25vdXMgQWJvcnQgSGFuZGxpbmcgKi8KIAl1aW50MzJfdCBjaGJzICAgICAgOiAgMTsgIC8qIENvZmlndXJlIEhvc3QgQmFja2luZyBzdG9yZSAgICAgICAgICAqLwpAQCAtMjU3MywxMCArMjcxNiwxMiBAQAogCXVpbnQzMl90IGNzYWggICAgICA6ICAxOyAgLyogQ29uZmlndXJlIFN5bmNocm9ub3VzIEFib3J0IEhhbmRsaW5nICovCiAJdWludDMyX3QgY2NycCAgICAgIDogIDE7ICAvKiBDb25maWcgQ29tbWFuZCBSaW5nIFBvbGxpbmcgICAgICAgICAgKi8KIAl1aW50MzJfdCBjbXYJICAgOiAgMTsgIC8qIENvbmZpZ3VyZSBNYXggVlBJcyAgICAgICAgICAgICAgICAgICAqLwotCXVpbnQzMl90IHJzdmQgICAgICA6IDI0OyAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdWludDMyX3QgY2JnICAgICAgIDogIDE7ICAvKiBDb25maWd1cmUgQmxvY2tHdWFyZCAgICAgICAgICAgICAgICAgKi8KKwl1aW50MzJfdCByc3ZkMSAgICAgOiAyMzsgIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2VuZGlmCiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECi0JdWludDMyX3QgcnN2ZDIgICAgIDogMjQ7ICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1aW50MzJfdCByc3ZkMiAgICAgOiAyMzsgIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVpbnQzMl90IGdiZyAgICAgICA6ICAxOyAgLyogR3JhbnQgQmxvY2tHdWFyZCAgICAgICAgICAgICAgICAgICAgICovCiAJdWludDMyX3QgZ212CSAgIDogIDE7ICAvKiBHcmFudCBNYXggVlBJcyAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1aW50MzJfdCBnY3JwCSAgIDogIDE7ICAvKiBHcmFudCBDb21tYW5kIFJpbmcgUG9sbGluZyAgICAgICAgICAgKi8KIAl1aW50MzJfdCBnc2FoCSAgIDogIDE7ICAvKiBHcmFudCBTeW5jaHJvbm91cyBBYm9ydCBIYW5kbGluZyAgICAgKi8KQEAgLTI1OTQsNyArMjczOSw4IEBACiAJdWludDMyX3QgZ3NhaAkgICA6ICAxOyAgLyogR3JhbnQgU3luY2hyb25vdXMgQWJvcnQgSGFuZGxpbmcgICAgICovCiAJdWludDMyX3QgZ2NycAkgICA6ICAxOyAgLyogR3JhbnQgQ29tbWFuZCBSaW5nIFBvbGxpbmcgICAgICAgICAgICovCiAJdWludDMyX3QgZ212CSAgIDogIDE7ICAvKiBHcmFudCBNYXggVlBJcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1aW50MzJfdCByc3ZkMiAgICAgOiAyNDsgIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVpbnQzMl90IGdiZyAgICAgICA6ICAxOyAgLyogR3JhbnQgQmxvY2tHdWFyZCAgICAgICAgICAgICAgICAgICAgICovCisJdWludDMyX3QgcnN2ZDIgICAgIDogMjM7ICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNlbmRpZgogCiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECkBAIC0zMjE0LDYgKzMzNjAsOTQgQEAKIAlzdHJ1Y3QgbHBmY19oYnFfZW50cnkJYnVmZls1XTsKIH07CiAKK3N0cnVjdCBzbGkzX2JnX2ZpZWxkcyB7CisJdWludDMyX3QgZmlsbGVyWzZdOwkvKiB3b3JkIDgtMTMgaW4gSU9DQiAqLworCXVpbnQzMl90IGJnaG07CQkvKiB3b3JkIDE0IC0gQmxvY2tHdWFyZCBIaWdoIFdhdGVyIE1hcmsgKi8KKy8qIEJpdGZpZWxkcyBmb3IgYmdzdGF0IChCbG9ja0d1YXJkIFN0YXR1cyAtIHdvcmQgMTUgb2YgSU9DQikgKi8KKyNkZWZpbmUgQkdTX0JJRElSX0JHX1BST0ZfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBCR1NfQklESVJfQkdfUFJPRl9TSElGVAkJMjQKKyNkZWZpbmUgQkdTX0JJRElSX0VSUl9DT05EX0ZMQUdTX01BU0sJMHgwMDNmMDAwMAorI2RlZmluZSBCR1NfQklESVJfRVJSX0NPTkRfU0hJRlQJMTYKKyNkZWZpbmUgQkdTX0JHX1BST0ZJTEVfTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBCR1NfQkdfUFJPRklMRV9TSElGVAkJOAorI2RlZmluZSBCR1NfSU5WQUxJRF9QUk9GX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQkdTX0lOVkFMSURfUFJPRl9TSElGVAkJNQorI2RlZmluZSBCR1NfVU5JTklUX0RJRl9CTE9DS19NQVNLCTB4MDAwMDAwMTAKKyNkZWZpbmUgQkdTX1VOSU5JVF9ESUZfQkxPQ0tfU0hJRlQJNAorI2RlZmluZSBCR1NfSElfV0FURVJfTUFSS19QUkVTRU5UX01BU0sJMHgwMDAwMDAwOAorI2RlZmluZSBCR1NfSElfV0FURVJfTUFSS19QUkVTRU5UX1NISUZUCTMKKyNkZWZpbmUgQkdTX1JFRlRBR19FUlJfTUFTSwkJMHgwMDAwMDAwNAorI2RlZmluZSBCR1NfUkVGVEFHX0VSUl9TSElGVAkJMgorI2RlZmluZSBCR1NfQVBQVEFHX0VSUl9NQVNLCQkweDAwMDAwMDAyCisjZGVmaW5lIEJHU19BUFBUQUdfRVJSX1NISUZUCQkxCisjZGVmaW5lIEJHU19HVUFSRF9FUlJfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBCR1NfR1VBUkRfRVJSX1NISUZUCQkwCisJdWludDMyX3QgYmdzdGF0OwkvKiB3b3JkIDE1IC0gQmxvY2tHdWFyZCBTdGF0dXMgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2xwZmNfYmdzX2dldF9iaWRpcl9iZ19wcm9mKHVpbnQzMl90IGJnc3RhdCkKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGJnc3RhdCkgJiBCR1NfQklESVJfQkdfUFJPRl9NQVNLKSA+PgorCQkJCUJHU19CSURJUl9CR19QUk9GX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitscGZjX2Jnc19nZXRfYmlkaXJfZXJyX2NvbmQodWludDMyX3QgYmdzdGF0KQoreworCXJldHVybiAobGUzMl90b19jcHUoYmdzdGF0KSAmIEJHU19CSURJUl9FUlJfQ09ORF9GTEFHU19NQVNLKSA+PgorCQkJCUJHU19CSURJUl9FUlJfQ09ORF9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorbHBmY19iZ3NfZ2V0X2JnX3Byb2YodWludDMyX3QgYmdzdGF0KQoreworCXJldHVybiAobGUzMl90b19jcHUoYmdzdGF0KSAmIEJHU19CR19QUk9GSUxFX01BU0spID4+CisJCQkJQkdTX0JHX1BST0ZJTEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2xwZmNfYmdzX2dldF9pbnZhbGlkX3Byb2YodWludDMyX3QgYmdzdGF0KQoreworCXJldHVybiAobGUzMl90b19jcHUoYmdzdGF0KSAmIEJHU19JTlZBTElEX1BST0ZfTUFTSykgPj4KKwkJCQlCR1NfSU5WQUxJRF9QUk9GX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitscGZjX2Jnc19nZXRfdW5pbml0X2RpZl9ibG9jayh1aW50MzJfdCBiZ3N0YXQpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShiZ3N0YXQpICYgQkdTX1VOSU5JVF9ESUZfQkxPQ0tfTUFTSykgPj4KKwkJCQlCR1NfVU5JTklUX0RJRl9CTE9DS19TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorbHBmY19iZ3NfZ2V0X2hpX3dhdGVyX21hcmtfcHJlc2VudCh1aW50MzJfdCBiZ3N0YXQpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShiZ3N0YXQpICYgQkdTX0hJX1dBVEVSX01BUktfUFJFU0VOVF9NQVNLKSA+PgorCQkJCUJHU19ISV9XQVRFUl9NQVJLX1BSRVNFTlRfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2xwZmNfYmdzX2dldF9yZWZ0YWdfZXJyKHVpbnQzMl90IGJnc3RhdCkKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGJnc3RhdCkgJiBCR1NfUkVGVEFHX0VSUl9NQVNLKSA+PgorCQkJCUJHU19SRUZUQUdfRVJSX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitscGZjX2Jnc19nZXRfYXBwdGFnX2Vycih1aW50MzJfdCBiZ3N0YXQpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShiZ3N0YXQpICYgQkdTX0FQUFRBR19FUlJfTUFTSykgPj4KKwkJCQlCR1NfQVBQVEFHX0VSUl9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorbHBmY19iZ3NfZ2V0X2d1YXJkX2Vycih1aW50MzJfdCBiZ3N0YXQpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShiZ3N0YXQpICYgQkdTX0dVQVJEX0VSUl9NQVNLKSA+PgorCQkJCUJHU19HVUFSRF9FUlJfU0hJRlQ7Cit9CisKICNkZWZpbmUgTFBGQ19FWFRfREFUQV9CREVfQ09VTlQgMwogc3RydWN0IGZjcF9pcndfZXh0IHsKIAl1aW50MzJfdAlpb190YWc2NF9sb3c7CkBAIC0zMzIyLDYgKzM1NTYsOSBAQAogCQlzdHJ1Y3QgcXVlX3hyaTY0Y3hfZXh0X2ZpZWxkcyBxdWVfeHJpNjRjeF9leHRfd29yZHM7CiAJCXN0cnVjdCBmY3BfaXJ3X2V4dCBmY3BfZXh0OwogCQl1aW50MzJfdCBzbGkzV29yZHNbMjRdOyAvKiA5NiBleHRyYSBieXRlcyBmb3IgU0xJLTMgKi8KKworCQkvKiB3b3JkcyA4LTE1IGZvciBCbG9ja0d1YXJkICovCisJCXN0cnVjdCBzbGkzX2JnX2ZpZWxkcyBzbGkzX2JnOwogCX0gdW5zbGkzOwogCiAjZGVmaW5lIHVscEN0X2ggdWxwWFMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggOTA5YmUzMy4uNGM3NzAzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTQ1LDYgKzQ1LDEyIEBACiAjaW5jbHVkZSAibHBmY192cG9ydC5oIgogI2luY2x1ZGUgImxwZmNfdmVyc2lvbi5oIgogCitjaGFyICpfZHVtcF9idWZfZGF0YTsKK3Vuc2lnbmVkIGxvbmcgX2R1bXBfYnVmX2RhdGFfb3JkZXI7CitjaGFyICpfZHVtcF9idWZfZGlmOwordW5zaWduZWQgbG9uZyBfZHVtcF9idWZfZGlmX29yZGVyOworc3BpbmxvY2tfdCBfZHVtcF9idWZfbG9jazsKKwogc3RhdGljIGludCBscGZjX3BhcnNlX3ZwZChzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDhfdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgbHBmY19nZXRfaGJhX21vZGVsX2Rlc2Moc3RydWN0IGxwZmNfaGJhICosIHVpbnQ4X3QgKiwgdWludDhfdCAqKTsKIHN0YXRpYyBpbnQgbHBmY19wb3N0X3Jjdl9idWYoc3RydWN0IGxwZmNfaGJhICopOwpAQCAtMjM2LDYgKzI0Miw1MSBAQAogfQogCiAvKioKKyAqIGxwZmNfZHVtcF93YWtldXBfcGFyYW1fY21wbDogQ29tcGxldGlvbiBoYW5kbGVyIGZvciBkdW1wIG1lbW9yeSBtYWlsYm94CisgKiAgICAgY29tbWFuZCB1c2VkIGZvciBnZXR0aW5nIHdha2UgdXAgcGFyYW1ldGVycy4KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQHBtYm94cTogcG9pbnRlciB0byB0aGUgZHJpdmVyIGludGVybmFsIHF1ZXVlIGVsZW1lbnQgZm9yIG1haWxib3ggY29tbWFuZC4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGR1bXAgbWFpbGJveCBjb21tYW5kIGZvciBnZXR0aW5nCisgKiB3YWtlIHVwIHBhcmFtZXRlcnMuIFdoZW4gdGhpcyBjb21tYW5kIGNvbXBsZXRlLCB0aGUgcmVzcG9uc2UgY29udGFpbgorICogT3B0aW9uIHJvbSB2ZXJzaW9uIG9mIHRoZSBIQkEuIFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlIHRoZSB2ZXJzaW9uIG51bWJlcgorICogaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZyBhbmQgc3RvcmUgaXQgaW4gT3B0aW9uUk9NVmVyc2lvbi4KKyAqKi8KK3N0YXRpYyB2b2lkCitscGZjX2R1bXBfd2FrZXVwX3BhcmFtX2NtcGwoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKnBtYm94cSkKK3sKKwlzdHJ1Y3QgcHJvZ19pZCAqcHJnOworCXVpbnQzMl90IHByb2dfaWRfd29yZDsKKwljaGFyIGRpc3QgPSAnICc7CisJLyogY2hhcmFjdGVyIGFycmF5IHVzZWQgZm9yIGRlY29kaW5nIGRpc3QgdHlwZS4gKi8KKwljaGFyIGRpc3RfY2hhcltdID0gIm5hYngiOworCisJaWYgKHBtYm94cS0+bWIubWJ4U3RhdHVzICE9IE1CWF9TVUNDRVNTKSB7CisJCW1lbXBvb2xfZnJlZShwbWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCQlyZXR1cm47CisJfQorCisJcHJnID0gKHN0cnVjdCBwcm9nX2lkICopICZwcm9nX2lkX3dvcmQ7CisKKwkvKiB3b3JkIDcgY29udGFpbiBvcHRpb24gcm9tIHZlcnNpb24gKi8KKwlwcm9nX2lkX3dvcmQgPSBwbWJveHEtPm1iLnVuLnZhcldvcmRzWzddOworCisJLyogRGVjb2RlIHRoZSBPcHRpb24gcm9tIHZlcnNpb24gd29yZCB0byBhIHJlYWRhYmxlIHN0cmluZyAqLworCWlmIChwcmctPmRpc3QgPCA0KQorCQlkaXN0ID0gZGlzdF9jaGFyW3ByZy0+ZGlzdF07CisKKwlpZiAoKHByZy0+ZGlzdCA9PSAzKSAmJiAocHJnLT5udW0gPT0gMCkpCisJCXNwcmludGYocGhiYS0+T3B0aW9uUk9NVmVyc2lvbiwgIiVkLiVkJWQiLAorCQkJcHJnLT52ZXIsIHByZy0+cmV2LCBwcmctPmxldik7CisJZWxzZQorCQlzcHJpbnRmKHBoYmEtPk9wdGlvblJPTVZlcnNpb24sICIlZC4lZCVkJWMlZCIsCisJCQlwcmctPnZlciwgcHJnLT5yZXYsIHByZy0+bGV2LAorCQkJZGlzdCwgcHJnLT5udW0pOworCW1lbXBvb2xfZnJlZShwbWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOworCXJldHVybjsKK30KKworLyoqCiAgKiBscGZjX2NvbmZpZ19wb3J0X3Bvc3Q6IFBlcmZvcm0gbHBmYyBpbml0aWFsaXphdGlvbiBhZnRlciBjb25maWcgcG9ydC4KICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICoKQEAgLTQ4Miw2ICs1MzMsMjAgQEAKIAkJCQlyYyk7CiAJCW1lbXBvb2xfZnJlZShwbWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCX0KKworCS8qIEdldCBPcHRpb24gcm9tIHZlcnNpb24gKi8KKwlwbWIgPSBtZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9LRVJORUwpOworCWxwZmNfZHVtcF93YWtldXBfcGFyYW0ocGhiYSwgcG1iKTsKKwlwbWItPm1ib3hfY21wbCA9IGxwZmNfZHVtcF93YWtldXBfcGFyYW1fY21wbDsKKwlwbWItPnZwb3J0ID0gcGhiYS0+cHBvcnQ7CisJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIHBtYiwgTUJYX05PV0FJVCk7CisKKwlpZiAoKHJjICE9IE1CWF9CVVNZKSAmJiAocmMgIT0gTUJYX1NVQ0NFU1MpKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsICIwNDM1IEFkYXB0ZXIgZmFpbGVkICIKKwkJCQkidG8gZ2V0IE9wdGlvbiBST00gdmVyc2lvbiBzdGF0dXMgeCV4XG4uIiwgcmMpOworCQltZW1wb29sX2ZyZWUocG1iLCBwaGJhLT5tYm94X21lbV9wb29sKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjg2LDExICs3NTEsNiBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2spOwotCS8qIElmIHRoZSB0aW1lciBpcyBhbHJlYWR5IGNhbmNlbGVkIGRvIG5vdGhpbmcgKi8KLQlpZiAoIShwaGJhLT5wcG9ydC0+d29ya19wb3J0X2V2ZW50cyAmIFdPUktFUl9IQl9UTU8pKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrKTsKLQkJcmV0dXJuOwotCX0KIAogCWlmICh0aW1lX2FmdGVyKHBoYmEtPmxhc3RfY29tcGxldGlvbl90aW1lICsgTFBGQ19IQl9NQk9YX0lOVEVSVkFMICogSFosCiAJCWppZmZpZXMpKSB7CkBAIC04MzMsOCArODkzLDcgQEAKIAlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LCBmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCQkJICBzaXplb2YoYm9hcmRfZXZlbnQpLAogCQkJCSAgKGNoYXIgKikgJmJvYXJkX2V2ZW50LAotCQkJCSAgU0NTSV9OTF9WSURfVFlQRV9QQ0kKLQkJCQkgIHwgUENJX1ZFTkRPUl9JRF9FTVVMRVgpOworCQkJCSAgTFBGQ19OTF9WRU5ET1JfSUQpOwogCiAJaWYgKHBoYmEtPndvcmtfaHMgJiBIU19GRkVSNikgewogCQkvKiBSZS1lc3RhYmxpc2hpbmcgTGluayAqLwpAQCAtMTk4NCw2ICsyMDQzLDcgQEAKIAlzaG9zdC0+bWF4X2x1biA9IHZwb3J0LT5jZmdfbWF4X2x1bnM7CiAJc2hvc3QtPnRoaXNfaWQgPSAtMTsKIAlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKKwogCS8qCiAJICogU2V0IGluaXRpYWwgY2FuX3F1ZXVlIHZhbHVlIHNpbmNlIDAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBhbmQKIAkgKiBzY3NpX2FkZF9ob3N0IHdpbGwgZmFpbC4gVGhpcyB3aWxsIGJlIGFkanVzdGVkIGxhdGVyIGJhc2VkIG9uIHRoZQpAQCAtMjA0Miw4ICsyMTAyLDYgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGxwZmNfc2hvc3RfZnJvbV92cG9ydCh2cG9ydCk7CiAJc3RydWN0IGxwZmNfaGJhICAqcGhiYSA9IHZwb3J0LT5waGJhOwogCi0Ja2ZyZWUodnBvcnQtPnZuYW1lKTsKLQogCWxwZmNfZGVidWdmc190ZXJtaW5hdGUodnBvcnQpOwogCWZjX3JlbW92ZV9ob3N0KHNob3N0KTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKQEAgLTIyMjYsOCArMjI4NCw3IEBACiAJCQkJQVJSQVlfU0laRShwaGJhLT5tc2l4X2VudHJpZXMpKTsKIAlpZiAocmMpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCi0JCQkJIjA0MjAgRW5hYmxlIE1TSS1YIGZhaWxlZCAoJWQpLCBjb250aW51aW5nICIKLQkJCQkid2l0aCBNU0lcbiIsIHJjKTsKKwkJCQkiMDQyMCBQQ0kgZW5hYmxlIE1TSS1YIGZhaWxlZCAoJWQpXG4iLCByYyk7CiAJCWdvdG8gbXNpX2ZhaWxfb3V0OwogCX0gZWxzZQogCQlmb3IgKGkgPSAwOyBpIDwgTFBGQ19NU0lYX1ZFQ1RPUlM7IGkrKykKQEAgLTIyNDQsOSArMjMwMSw5IEBACiAJcmMgPSByZXF1ZXN0X2lycShwaGJhLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCAmbHBmY19zcF9pbnRyX2hhbmRsZXIsCiAJCQkgSVJRRl9TSEFSRUQsIExQRkNfU1BfRFJJVkVSX0hBTkRMRVJfTkFNRSwgcGhiYSk7CiAJaWYgKHJjKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19JTklULAogCQkJCSIwNDIxIE1TSS1YIHNsb3ctcGF0aCByZXF1ZXN0X2lycSBmYWlsZWQgIgotCQkJCSIoJWQpLCBjb250aW51aW5nIHdpdGggTVNJXG4iLCByYyk7CisJCQkJIiglZClcbiIsIHJjKTsKIAkJZ290byBtc2lfZmFpbF9vdXQ7CiAJfQogCkBAIC0yMjU1LDkgKzIzMTIsOSBAQAogCQkJIElSUUZfU0hBUkVELCBMUEZDX0ZQX0RSSVZFUl9IQU5ETEVSX05BTUUsIHBoYmEpOwogCiAJaWYgKHJjKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19JTklULAogCQkJCSIwNDI5IE1TSS1YIGZhc3QtcGF0aCByZXF1ZXN0X2lycSBmYWlsZWQgIgotCQkJCSIoJWQpLCBjb250aW51aW5nIHdpdGggTVNJXG4iLCByYyk7CisJCQkJIiglZClcbiIsIHJjKTsKIAkJZ290byBpcnFfZmFpbF9vdXQ7CiAJfQogCkBAIC0yMjc4LDcgKzIzMzUsNyBAQAogCQlnb3RvIG1ieF9mYWlsX291dDsKIAlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgcG1iLCBNQlhfUE9MTCk7CiAJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1gsCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19NQk9YLAogCQkJCSIwMzUxIENvbmZpZyBNU0kgbWFpbGJveCBjb21tYW5kIGZhaWxlZCwgIgogCQkJCSJtYnhDbWQgeCV4LCBtYnhTdGF0dXMgeCV4XG4iLAogCQkJCXBtYi0+bWIubWJ4Q29tbWFuZCwgcG1iLT5tYi5tYnhTdGF0dXMpOwpAQCAtMjMyNyw2ICsyMzg0LDE5NSBAQAogfQogCiAvKioKKyAqIGxwZmNfZW5hYmxlX21zaTogRW5hYmxlIE1TSSBpbnRlcnJ1cHQgbW9kZS4KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGVuYWJsZSB0aGUgTVNJIGludGVycnVwdCBtb2RlLiBUaGUga2VybmVsCisgKiBmdW5jdGlvbiBwY2lfZW5hYmxlX21zaSgpIGlzIGNhbGxlZCB0byBlbmFibGUgdGhlIE1TSSB2ZWN0b3IuIFRoZQorICogZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgcmVxdWVzdF9pcnEoKSB0byByZWdpc3RlcgorICogTVNJIHZlY3RvciB3aXRoIGEgaW50ZXJydXB0IHRoZSBoYW5kbGVyLCB3aGljaCBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAJMCAtIHN1Y2Vzc2Z1bAorICogCW90aGVyIHZhbHVlcyAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK2xwZmNfZW5hYmxlX21zaShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX21zaShwaGJhLT5wY2lkZXYpOworCWlmICghcmMpCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJCSIwNDYyIFBDSSBlbmFibGUgTVNJIG1vZGUgc3VjY2Vzcy5cbiIpOworCWVsc2UgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKKwkJCQkiMDQ3MSBQQ0kgZW5hYmxlIE1TSSBtb2RlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHJlcXVlc3RfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBscGZjX2ludHJfaGFuZGxlciwKKwkJCSBJUlFGX1NIQVJFRCwgTFBGQ19EUklWRVJfTkFNRSwgcGhiYSk7CisJaWYgKHJjKSB7CisJCXBjaV9kaXNhYmxlX21zaShwaGJhLT5wY2lkZXYpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfSU5JVCwKKwkJCQkiMDQ3OCBNU0kgcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGxwZmNfZGlzYWJsZV9tc2k6IERpc2FibGUgTVNJIGludGVycnVwdCBtb2RlLgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gZGlzYWJsZSB0aGUgTVNJIGludGVycnVwdCBtb2RlLiBUaGUgZHJpdmVyCisgKiBjYWxscyBmcmVlX2lycSgpIG9uIE1TSSB2ZWN0b3IgaXQgaGFzIGRvbmUgcmVxdWVzdF9pcnEoKSBvbiBiZWZvcmUKKyAqIGNhbGxpbmcgcGNpX2Rpc2FibGVfbXNpKCkuIEZhaWx1cmUgdG8gZG8gc28gcmVzdWx0cyBpbiBhIEJVR19PTigpIGFuZAorICogYSBkZXZpY2Ugd2lsbCBiZSBsZWZ0IHdpdGggTVNJIGVuYWJsZWQgYW5kIGxlYWtzIGl0cyB2ZWN0b3IuCisgKi8KKworc3RhdGljIHZvaWQKK2xwZmNfZGlzYWJsZV9tc2koc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCWZyZWVfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBwaGJhKTsKKwlwY2lfZGlzYWJsZV9tc2kocGhiYS0+cGNpZGV2KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbHBmY19sb2dfaW50cl9tb2RlOiBMb2cgdGhlIGFjdGl2ZSBpbnRlcnJ1cHQgbW9kZQorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAaW50cl9tb2RlOiBhY3RpdmUgaW50ZXJydXB0IG1vZGUgYWRvcHRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXQgaW52b2tlZCB0byBsb2cgdGhlIGN1cnJlbnRseSB1c2VkIGFjdGl2ZSBpbnRlcnJ1cHQgbW9kZQorICogdG8gdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQKK2xwZmNfbG9nX2ludHJfbW9kZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQzMl90IGludHJfbW9kZSkKK3sKKwlzd2l0Y2ggKGludHJfbW9kZSkgeworCWNhc2UgMDoKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCisJCQkJIjA0NzAgRW5hYmxlIElOVHggaW50ZXJydXB0IG1vZGUuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKKwkJCQkiMDQ4MSBFbmFibGVkIE1TSSBpbnRlcnJ1cHQgbW9kZS5cbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJCSIwNDgwIEVuYWJsZWQgTVNJLVggaW50ZXJydXB0IG1vZGUuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDQ4MiBJbGxlZ2FsIGludGVycnVwdCBtb2RlLlxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitscGZjX3N0b3BfcG9ydChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJLyogQ2xlYXIgYWxsIGludGVycnVwdCBlbmFibGUgY29uZGl0aW9ucyAqLworCXdyaXRlbCgwLCBwaGJhLT5IQ3JlZ2FkZHIpOworCXJlYWRsKHBoYmEtPkhDcmVnYWRkcik7IC8qIGZsdXNoICovCisJLyogQ2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBwaGJhLT5IQXJlZ2FkZHIpOworCXJlYWRsKHBoYmEtPkhBcmVnYWRkcik7IC8qIGZsdXNoICovCisKKwkvKiBSZXNldCBzb21lIEhCQSBTTEkgc2V0dXAgc3RhdGVzICovCisJbHBmY19zdG9wX3BoYmFfdGltZXJzKHBoYmEpOworCXBoYmEtPnBwb3J0LT53b3JrX3BvcnRfZXZlbnRzID0gMDsKKworCXJldHVybjsKK30KKworLyoqCisgKiBscGZjX2VuYWJsZV9pbnRyOiBFbmFibGUgZGV2aWNlIGludGVycnVwdC4KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGVuYWJsZSBkZXZpY2UgaW50ZXJydXB0IGFuZCBhc3NvY2lhdGUgZHJpdmVyJ3MKKyAqIGludGVycnVwdCBoYW5kbGVyKHMpIHRvIGludGVycnVwdCB2ZWN0b3IocykuIERlcGVuZHMgb24gdGhlIGludGVycnVwdAorICogbW9kZSBjb25maWd1cmVkIHRvIHRoZSBkcml2ZXIsIHRoZSBkcml2ZXIgd2lsbCB0cnkgdG8gZmFsbGJhY2sgZnJvbSB0aGUKKyAqIGNvbmZpZ3VyZWQgaW50ZXJydXB0IG1vZGUgdG8gYW4gaW50ZXJydXB0IG1vZGUgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogcGxhdGZvcm0sIGtlcm5lbCwgYW5kIGRldmljZSBpbiB0aGUgb3JkZXIgb2Y6IE1TSS1YIC0+IE1TSSAtPiBJUlEuCisgKgorICogUmV0dXJuIGNvZGVzCisgKiAgIDAgLSBzdWNlc3NmdWwKKyAqICAgb3RoZXIgdmFsdWVzIC0gZXJyb3IKKyAqKi8KK3N0YXRpYyB1aW50MzJfdAorbHBmY19lbmFibGVfaW50cihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQzMl90IGNmZ19tb2RlKQoreworCXVpbnQzMl90IGludHJfbW9kZSA9IExQRkNfSU5UUl9FUlJPUjsKKwlpbnQgcmV0dmFsOworCisJaWYgKGNmZ19tb2RlID09IDIpIHsKKwkJLyogTmVlZCB0byBpc3N1ZSBjb25mX3BvcnQgbWJveCBjbWQgYmVmb3JlIGNvbmZfbXNpIG1ib3ggY21kICovCisJCXJldHZhbCA9IGxwZmNfc2xpX2NvbmZpZ19wb3J0KHBoYmEsIDMpOworCQlpZiAoIXJldHZhbCkgeworCQkJLyogTm93LCB0cnkgdG8gZW5hYmxlIE1TSS1YIGludGVycnVwdCBtb2RlICovCisJCQlyZXR2YWwgPSBscGZjX2VuYWJsZV9tc2l4KHBoYmEpOworCQkJaWYgKCFyZXR2YWwpIHsKKwkJCQkvKiBJbmRpY2F0ZSBpbml0aWFsaXphdGlvbiB0byBNU0ktWCBtb2RlICovCisJCQkJcGhiYS0+aW50cl90eXBlID0gTVNJWDsKKwkJCQlpbnRyX21vZGUgPSAyOworCQkJfQorCQl9CisJfQorCisJLyogRmFsbGJhY2sgdG8gTVNJIGlmIE1TSS1YIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworCWlmIChjZmdfbW9kZSA+PSAxICYmIHBoYmEtPmludHJfdHlwZSA9PSBOT05FKSB7CisJCXJldHZhbCA9IGxwZmNfZW5hYmxlX21zaShwaGJhKTsKKwkJaWYgKCFyZXR2YWwpIHsKKwkJCS8qIEluZGljYXRlIGluaXRpYWxpemF0aW9uIHRvIE1TSSBtb2RlICovCisJCQlwaGJhLT5pbnRyX3R5cGUgPSBNU0k7CisJCQlpbnRyX21vZGUgPSAxOworCQl9CisJfQorCisJLyogRmFsbGJhY2sgdG8gSU5UeCBpZiBib3RoIE1TSS1YL01TSSBpbml0YWxpemF0aW9uIGZhaWxlZCAqLworCWlmIChwaGJhLT5pbnRyX3R5cGUgPT0gTk9ORSkgeworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShwaGJhLT5wY2lkZXYtPmlycSwgbHBmY19pbnRyX2hhbmRsZXIsCisJCQkJICAgICBJUlFGX1NIQVJFRCwgTFBGQ19EUklWRVJfTkFNRSwgcGhiYSk7CisJCWlmICghcmV0dmFsKSB7CisJCQkvKiBJbmRpY2F0ZSBpbml0aWFsaXphdGlvbiB0byBJTlR4IG1vZGUgKi8KKwkJCXBoYmEtPmludHJfdHlwZSA9IElOVHg7CisJCQlpbnRyX21vZGUgPSAwOworCQl9CisJfQorCXJldHVybiBpbnRyX21vZGU7Cit9CisKKy8qKgorICogbHBmY19kaXNhYmxlX2ludHI6IERpc2FibGUgZGV2aWNlIGludGVycnVwdC4KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGRpc2FibGUgZGV2aWNlIGludGVycnVwdCBhbmQgZGlzYXNzb2NpYXRlIHRoZQorICogZHJpdmVyJ3MgaW50ZXJydXB0IGhhbmRsZXIocykgZnJvbSBpbnRlcnJ1cHQgdmVjdG9yKHMpLiBEZXBlbmRpbmcgb24gdGhlCisgKiBpbnRlcnJ1cHQgbW9kZSwgdGhlIGRyaXZlciB3aWxsIHJlbGVhc2UgdGhlIGludGVycnVwdCB2ZWN0b3IocykgZm9yIHRoZQorICogbWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQuCisgKiovCitzdGF0aWMgdm9pZAorbHBmY19kaXNhYmxlX2ludHIoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCS8qIERpc2FibGUgdGhlIGN1cnJlbnRseSBpbml0aWFsaXplZCBpbnRlcnJ1cHQgbW9kZSAqLworCWlmIChwaGJhLT5pbnRyX3R5cGUgPT0gTVNJWCkKKwkJbHBmY19kaXNhYmxlX21zaXgocGhiYSk7CisJZWxzZSBpZiAocGhiYS0+aW50cl90eXBlID09IE1TSSkKKwkJbHBmY19kaXNhYmxlX21zaShwaGJhKTsKKwllbHNlIGlmIChwaGJhLT5pbnRyX3R5cGUgPT0gSU5UeCkKKwkJZnJlZV9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIHBoYmEpOworCisJLyogUmVzZXQgaW50ZXJydXB0IG1hbmFnZW1lbnQgc3RhdGVzICovCisJcGhiYS0+aW50cl90eXBlID0gTk9ORTsKKwlwaGJhLT5zbGkuc2xpc3RhdC5zbGlfaW50ciA9IDA7CisKKwlyZXR1cm47Cit9CisKKy8qKgogICogbHBmY19wY2lfcHJvYmVfb25lOiBscGZjIFBDSSBwcm9iZSBmdW5jIHRvIHJlZ2lzdGVyIGRldmljZSB0byBQQ0kgc3Vic3lzdGVtLgogICogQHBkZXY6IHBvaW50ZXIgdG8gUENJIGRldmljZQogICogQHBpZDogcG9pbnRlciB0byBQQ0kgZGV2aWNlIGlkZW50aWZpZXIKQEAgLTIzNTYsNiArMjYwMiw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFViwgcmV0dmFsOwogCWludCAgaSwgaGJxX2NvdW50OwogCXVpbnQxNl90IGlvdGFnOworCXVpbnQzMl90IGNmZ19tb2RlLCBpbnRyX21vZGU7CiAJaW50IGJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pOwogCXN0cnVjdCBscGZjX2FkYXB0ZXJfZXZlbnRfaGVhZGVyIGFkYXB0ZXJfZXZlbnQ7CiAKQEAgLTI0MDksNiArMjY1Niw3IEBACiAJcGhiYS0+ZXJhdHRfcG9sbC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHBoYmE7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlwY2lfdHJ5X3NldF9td2kocGRldik7CiAKIAlpZiAocGNpX3NldF9kbWFfbWFzayhwaGJhLT5wY2lkZXYsIERNQV82NEJJVF9NQVNLKSAhPSAwKQpAQCAtMjU1Nyw3ICsyODA1LDYgQEAKIAlscGZjX2RlYnVnZnNfaW5pdGlhbGl6ZSh2cG9ydCk7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgc2hvc3QpOwotCXBoYmEtPmludHJfdHlwZSA9IE5PTkU7CiAKIAlwaGJhLT5NQnNsaW1hZGRyID0gcGhiYS0+c2xpbV9tZW1tYXBfcDsKIAlwaGJhLT5IQXJlZ2FkZHIgPSBwaGJhLT5jdHJsX3JlZ3NfbWVtbWFwX3AgKyBIQV9SRUdfT0ZGU0VUOwpAQCAtMjU2NSw2MyArMjgxMiw1OCBAQAogCXBoYmEtPkhTcmVnYWRkciA9IHBoYmEtPmN0cmxfcmVnc19tZW1tYXBfcCArIEhTX1JFR19PRkZTRVQ7CiAJcGhiYS0+SENyZWdhZGRyID0gcGhiYS0+Y3RybF9yZWdzX21lbW1hcF9wICsgSENfUkVHX09GRlNFVDsKIAotCS8qIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGludGVycnVwdCAqLwotCWlmIChwaGJhLT5jZmdfdXNlX21zaSA9PSAyKSB7Ci0JCS8qIE5lZWQgdG8gaXNzdWUgY29uZl9wb3J0IG1ib3ggY21kIGJlZm9yZSBjb25mX21zaSBtYm94IGNtZCAqLwotCQllcnJvciA9IGxwZmNfc2xpX2NvbmZpZ19wb3J0KHBoYmEsIDMpOwotCQlpZiAoZXJyb3IpCi0JCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKLQkJCQkiMDQyNyBGaXJtd2FyZSBub3QgY2FwYWJsZSBvZiBTTEkgMyBtb2RlLlxuIik7Ci0JCWVsc2UgewotCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCi0JCQkJIjA0MjYgRmlybXdhcmUgY2FwYWJsZSBvZiBTTEkgMyBtb2RlLlxuIik7Ci0JCQkvKiBOb3csIHRyeSB0byBlbmFibGUgTVNJLVggaW50ZXJydXB0IG1vZGUgKi8KLQkJCWVycm9yID0gbHBmY19lbmFibGVfbXNpeChwaGJhKTsKLQkJCWlmICghZXJyb3IpIHsKLQkJCQlwaGJhLT5pbnRyX3R5cGUgPSBNU0lYOwotCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAotCQkJCQkJIjA0MzAgZW5hYmxlIE1TSS1YIG1vZGUuXG4iKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEZhbGxiYWNrIHRvIE1TSSBpZiBNU0ktWCBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLQlpZiAocGhiYS0+Y2ZnX3VzZV9tc2kgPj0gMSAmJiBwaGJhLT5pbnRyX3R5cGUgPT0gTk9ORSkgewotCQlyZXR2YWwgPSBwY2lfZW5hYmxlX21zaShwaGJhLT5wY2lkZXYpOwotCQlpZiAoIXJldHZhbCkgewotCQkJcGhiYS0+aW50cl90eXBlID0gTVNJOwotCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCi0JCQkJCSIwNDczIGVuYWJsZSBNU0kgbW9kZS5cbiIpOwotCQl9IGVsc2UKLQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAotCQkJCQkiMDQ1MiBlbmFibGUgSVJRIG1vZGUuXG4iKTsKLQl9Ci0KLQkvKiBNU0ktWCBpcyB0aGUgb25seSBjYXNlIHRoZSBkb2Vzbid0IG5lZWQgdG8gY2FsbCByZXF1ZXN0X2lycSAqLwotCWlmIChwaGJhLT5pbnRyX3R5cGUgIT0gTVNJWCkgewotCQlyZXR2YWwgPSByZXF1ZXN0X2lycShwaGJhLT5wY2lkZXYtPmlycSwgbHBmY19pbnRyX2hhbmRsZXIsCi0JCQkJICAgICBJUlFGX1NIQVJFRCwgTFBGQ19EUklWRVJfTkFNRSwgcGhiYSk7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsICIwNDUxIEVuYWJsZSAiCi0JCQkJCSJpbnRlcnJ1cHQgaGFuZGxlciBmYWlsZWRcbiIpOwotCQkJZXJyb3IgPSByZXR2YWw7Ci0JCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKLQkJfSBlbHNlIGlmIChwaGJhLT5pbnRyX3R5cGUgIT0gTVNJKQotCQkJcGhiYS0+aW50cl90eXBlID0gSU5UeDsKLQl9Ci0KKwkvKiBDb25maWd1cmUgc3lzZnMgYXR0cmlidXRlcyAqLwogCWlmIChscGZjX2FsbG9jX3N5c2ZzX2F0dHIodnBvcnQpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjE0NzYgRmFpbGVkIHRvIGFsbG9jYXRlIHN5c2ZzIGF0dHJcbiIpOwogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfaXJxOworCQlnb3RvIG91dF9kZXN0cm95X3BvcnQ7CiAJfQogCi0JaWYgKGxwZmNfc2xpX2hiYV9zZXR1cChwaGJhKSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCSIxNDc3IEZhaWxlZCB0byBzZXQgdXAgaGJhXG4iKTsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIG91dF9yZW1vdmVfZGV2aWNlOworCWNmZ19tb2RlID0gcGhiYS0+Y2ZnX3VzZV9tc2k7CisJd2hpbGUgKHRydWUpIHsKKwkJLyogQ29uZmlndXJlIGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJCWludHJfbW9kZSA9IGxwZmNfZW5hYmxlX2ludHIocGhiYSwgY2ZnX21vZGUpOworCQlpZiAoaW50cl9tb2RlID09IExQRkNfSU5UUl9FUlJPUikgeworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkJIjA0MjYgRmFpbGVkIHRvIGVuYWJsZSBpbnRlcnJ1cHQuXG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfc3lzZnNfYXR0cjsKKwkJfQorCQkvKiBIQkEgU0xJIHNldHVwICovCisJCWlmIChscGZjX3NsaV9oYmFfc2V0dXAocGhiYSkpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIxNDc3IEZhaWxlZCB0byBzZXQgdXAgaGJhXG4iKTsKKwkJCWVycm9yID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X3JlbW92ZV9kZXZpY2U7CisJCX0KKworCQkvKiBXYWl0IDUwbXMgZm9yIHRoZSBpbnRlcnJ1cHRzIG9mIHByZXZpb3VzIG1haWxib3ggY29tbWFuZHMgKi8KKwkJbXNsZWVwKDUwKTsKKwkJLyogQ2hlY2sgYWN0aXZlIGludGVycnVwdHMgcmVjZWl2ZWQgKi8KKwkJaWYgKHBoYmEtPnNsaS5zbGlzdGF0LnNsaV9pbnRyID4gTFBGQ19NU0lYX1ZFQ1RPUlMpIHsKKwkJCS8qIExvZyB0aGUgY3VycmVudCBhY3RpdmUgaW50ZXJydXB0IG1vZGUgKi8KKwkJCXBoYmEtPmludHJfbW9kZSA9IGludHJfbW9kZTsKKwkJCWxwZmNfbG9nX2ludHJfbW9kZShwaGJhLCBpbnRyX21vZGUpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKKwkJCQkJIjA0NTEgQ29uZmlndXJlIGludGVycnVwdCBtb2RlICglZCkgIgorCQkJCQkiZmFpbGVkIGFjdGl2ZSBpbnRlcnJ1cHQgdGVzdC5cbiIsCisJCQkJCWludHJfbW9kZSk7CisJCQlpZiAoaW50cl9tb2RlID09IDApIHsKKwkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkJIjA0NzkgRmFpbGVkIHRvIGVuYWJsZSAiCisJCQkJCQkiaW50ZXJydXB0LlxuIik7CisJCQkJZXJyb3IgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0X3JlbW92ZV9kZXZpY2U7CisJCQl9CisJCQkvKiBTdG9wIEhCQSBTTEkgc2V0dXBzICovCisJCQlscGZjX3N0b3BfcG9ydChwaGJhKTsKKwkJCS8qIERpc2FibGUgdGhlIGN1cnJlbnQgaW50ZXJydXB0IG1vZGUgKi8KKwkJCWxwZmNfZGlzYWJsZV9pbnRyKHBoYmEpOworCQkJLyogVHJ5IG5leHQgbGV2ZWwgb2YgaW50ZXJydXB0IG1vZGUgKi8KKwkJCWNmZ19tb2RlID0gLS1pbnRyX21vZGU7CisJCX0KIAl9CiAKIAkvKgpAQCAtMjYyOSw2ICsyODcxLDc1IEBACiAJICogdGhlIHZhbHVlIG9mIGNhbl9xdWV1ZS4KIAkgKi8KIAlzaG9zdC0+Y2FuX3F1ZXVlID0gcGhiYS0+Y2ZnX2hiYV9xdWV1ZV9kZXB0aCAtIDEwOworCWlmIChwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfQkdfRU5BQkxFRCkgeworCisJCWlmIChscGZjX3Byb3RfbWFzayAmJiBscGZjX3Byb3RfZ3VhcmQpIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJCQkiMTQ3OCBSZWdpc3RlcmluZyBCbG9ja0d1YXJkIHdpdGggdGhlICIKKwkJCQkJIlNDU0kgbGF5ZXJcbiIpOworCisJCQlzY3NpX2hvc3Rfc2V0X3Byb3Qoc2hvc3QsIGxwZmNfcHJvdF9tYXNrKTsKKwkJCXNjc2lfaG9zdF9zZXRfZ3VhcmQoc2hvc3QsIGxwZmNfcHJvdF9ndWFyZCk7CisJCX0KKwl9CisKKwlpZiAoIV9kdW1wX2J1Zl9kYXRhKSB7CisJCWludCBwYWdlY250ID0gMTA7CisJCXdoaWxlIChwYWdlY250KSB7CisJCQlzcGluX2xvY2tfaW5pdCgmX2R1bXBfYnVmX2xvY2spOworCQkJX2R1bXBfYnVmX2RhdGEgPQorCQkJCShjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgcGFnZWNudCk7CisJCQlpZiAoX2R1bXBfYnVmX2RhdGEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBhbGxvY2F0ZWQgJWQgcGFnZXMgZm9yICIKKwkJCQkJCSJfZHVtcF9idWZfZGF0YSBhdCAweCVwXG4iLAorCQkJCQkJKDEgPDwgcGFnZWNudCksIF9kdW1wX2J1Zl9kYXRhKTsKKwkJCQlfZHVtcF9idWZfZGF0YV9vcmRlciA9IHBhZ2VjbnQ7CisJCQkJbWVtc2V0KF9kdW1wX2J1Zl9kYXRhLCAwLCAoKDEgPDwgUEFHRV9TSElGVCkKKwkJCQkJCQkgICA8PCBwYWdlY250KSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS0tcGFnZWNudDsKKwkJCX0KKworCQl9CisKKwkJaWYgKCFfZHVtcF9idWZfZGF0YV9vcmRlcikKKwkJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SIHVuYWJsZSB0byBhbGxvY2F0ZSAiCisJCQkJCSJtZW1vcnkgZm9yIGhleGR1bXBcbiIpOworCisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgYWxyZWFkeSBhbGxvY2F0ZWQgX2R1bXBfYnVmX2RhdGE9MHglcCIKKwkJICAgICAgICJcbiIsIF9kdW1wX2J1Zl9kYXRhKTsKKwl9CisKKworCWlmICghX2R1bXBfYnVmX2RpZikgeworCQlpbnQgcGFnZWNudCA9IDEwOworCQl3aGlsZSAocGFnZWNudCkgeworCQkJX2R1bXBfYnVmX2RpZiA9CisJCQkJKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlY250KTsKKwkJCWlmIChfZHVtcF9idWZfZGlmKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgYWxsb2NhdGVkICVkIHBhZ2VzIGZvciAiCisJCQkJCQkiX2R1bXBfYnVmX2RpZiBhdCAweCVwXG4iLAorCQkJCQkJKDEgPDwgcGFnZWNudCksIF9kdW1wX2J1Zl9kaWYpOworCQkJCV9kdW1wX2J1Zl9kaWZfb3JkZXIgPSBwYWdlY250OworCQkJCW1lbXNldChfZHVtcF9idWZfZGlmLCAwLCAoKDEgPDwgUEFHRV9TSElGVCkKKwkJCQkJCQkgIDw8IHBhZ2VjbnQpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLS1wYWdlY250OworCQkJfQorCisJCX0KKworCQlpZiAoIV9kdW1wX2J1Zl9kaWZfb3JkZXIpCisJCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBFUlJPUiB1bmFibGUgdG8gYWxsb2NhdGUgIgorCQkJCQkibWVtb3J5IGZvciBoZXhkdW1wXG4iKTsKKworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIGFscmVhZHkgYWxsb2NhdGVkIF9kdW1wX2J1Zl9kaWY9MHglcFxuIiwKKwkJCQlfZHVtcF9idWZfZGlmKTsKKwl9CiAKIAlscGZjX2hvc3RfYXR0cmliX2luaXQoc2hvc3QpOwogCkBAIC0yNjQ2LDI5ICsyOTU3LDIyIEBACiAJZmNfaG9zdF9wb3N0X3ZlbmRvcl9ldmVudChzaG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQlzaXplb2YoYWRhcHRlcl9ldmVudCksCiAJCShjaGFyICopICZhZGFwdGVyX2V2ZW50LAotCQlTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfRU1VTEVYKTsKLQotCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKwkJTFBGQ19OTF9WRU5ET1JfSUQpOwogCiAJcmV0dXJuIDA7CiAKIG91dF9yZW1vdmVfZGV2aWNlOgotCWxwZmNfZnJlZV9zeXNmc19hdHRyKHZwb3J0KTsKIAlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogCXZwb3J0LT5sb2FkX2ZsYWcgfD0gRkNfVU5MT0FESU5HOwogCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKLW91dF9mcmVlX2lycToKIAlscGZjX3N0b3BfcGhiYV90aW1lcnMocGhiYSk7CiAJcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9ldmVudHMgPSAwOwotCi0JaWYgKHBoYmEtPmludHJfdHlwZSA9PSBNU0lYKQotCQlscGZjX2Rpc2FibGVfbXNpeChwaGJhKTsKLQllbHNlCi0JCWZyZWVfaXJxKHBoYmEtPnBjaWRldi0+aXJxLCBwaGJhKTsKLQotb3V0X2Rpc2FibGVfbXNpOgotCWlmIChwaGJhLT5pbnRyX3R5cGUgPT0gTVNJKQotCQlwY2lfZGlzYWJsZV9tc2kocGhiYS0+cGNpZGV2KTsKKwlscGZjX2Rpc2FibGVfaW50cihwaGJhKTsKKwlscGZjX3NsaV9oYmFfZG93bihwaGJhKTsKKwlscGZjX3NsaV9icmRyZXN0YXJ0KHBoYmEpOworb3V0X2ZyZWVfc3lzZnNfYXR0cjoKKwlscGZjX2ZyZWVfc3lzZnNfYXR0cih2cG9ydCk7CitvdXRfZGVzdHJveV9wb3J0OgogCWRlc3Ryb3lfcG9ydCh2cG9ydCk7CiBvdXRfa3RocmVhZF9zdG9wOgogCWt0aHJlYWRfc3RvcChwaGJhLT53b3JrZXJfdGhyZWFkKTsKQEAgLTI3MDksNyArMzAxMyw3IEBACiAgKiBAcGRldjogcG9pbnRlciB0byBQQ0kgZGV2aWNlCiAgKgogICogVGhpcyByb3V0aW5lIGlzIHRvIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGtlcm5lbCdzIFBDSSBzdWJzeXN0ZW0uIFdoZW4gYW4KLSAqIEVtdWxleCBIQkEgaXMgcmVtb3ZlZCBmcm9tIFBDSSBidXMuIEl0IHBlcmZvcm0gYWxsIHRoZSBuZWNlc3NhcnkgY2xlYW51cAorICogRW11bGV4IEhCQSBpcyByZW1vdmVkIGZyb20gUENJIGJ1cywgaXQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkgY2xlYW51cAogICogZm9yIHRoZSBIQkEgZGV2aWNlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgUENJIHN1YnN5c3RlbSBwcm9wZXJseS4KICAqKi8KIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdApAQCAtMjcxNywxOCArMzAyMSwyNyBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBscGZjX3Zwb3J0ICoqdnBvcnRzOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7CisJaW50IGk7CiAJaW50IGJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pOwogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJdnBvcnQtPmxvYWRfZmxhZyB8PSBGQ19VTkxPQURJTkc7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAotCWtmcmVlKHZwb3J0LT52bmFtZSk7CiAJbHBmY19mcmVlX3N5c2ZzX2F0dHIodnBvcnQpOwogCiAJa3RocmVhZF9zdG9wKHBoYmEtPndvcmtlcl90aHJlYWQpOwogCisJLyogUmVsZWFzZSBhbGwgdGhlIHZwb3J0cyBhZ2FpbnN0IHRoaXMgcGh5c2ljYWwgcG9ydCAqLworCXZwb3J0cyA9IGxwZmNfY3JlYXRlX3Zwb3J0X3dvcmtfYXJyYXkocGhiYSk7CisJaWYgKHZwb3J0cyAhPSBOVUxMKQorCQlmb3IgKGkgPSAxOyBpIDw9IHBoYmEtPm1heF92cGkgJiYgdnBvcnRzW2ldICE9IE5VTEw7IGkrKykKKwkJCWZjX3Zwb3J0X3Rlcm1pbmF0ZSh2cG9ydHNbaV0tPmZjX3Zwb3J0KTsKKwlscGZjX2Rlc3Ryb3lfdnBvcnRfd29ya19hcnJheShwaGJhLCB2cG9ydHMpOworCisJLyogUmVtb3ZlIEZDIGhvc3QgYW5kIHRoZW4gU0NTSSBob3N0IHdpdGggdGhlIHBoeXNpY2FsIHBvcnQgKi8KIAlmY19yZW1vdmVfaG9zdChzaG9zdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CiAJbHBmY19jbGVhbnVwKHZwb3J0KTsKQEAgLTI3NDgsMTMgKzMwNjEsOCBAQAogCiAJbHBmY19kZWJ1Z2ZzX3Rlcm1pbmF0ZSh2cG9ydCk7CiAKLQlpZiAocGhiYS0+aW50cl90eXBlID09IE1TSVgpCi0JCWxwZmNfZGlzYWJsZV9tc2l4KHBoYmEpOwotCWVsc2UgewotCQlmcmVlX2lycShwaGJhLT5wY2lkZXYtPmlycSwgcGhiYSk7Ci0JCWlmIChwaGJhLT5pbnRyX3R5cGUgPT0gTVNJKQotCQkJcGNpX2Rpc2FibGVfbXNpKHBoYmEtPnBjaWRldik7Ci0JfQorCS8qIERpc2FibGUgaW50ZXJydXB0ICovCisJbHBmY19kaXNhYmxlX2ludHIocGhiYSk7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJc2NzaV9ob3N0X3B1dChzaG9zdCk7CkBAIC0yNzg2LDYgKzMwOTQsMTE1IEBACiB9CiAKIC8qKgorICogbHBmY19wY2lfc3VzcGVuZF9vbmU6IGxwZmMgUENJIGZ1bmMgdG8gc3VzcGVuZCBkZXZpY2UgZm9yIHBvd2VyIG1hbmFnZW1lbnQuCisgKiBAcGRldjogcG9pbnRlciB0byBQQ0kgZGV2aWNlCisgKiBAbXNnOiBwb3dlciBtYW5hZ2VtZW50IG1lc3NhZ2UKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdG8gYmUgcmVnaXN0ZXJlZCB0byB0aGUga2VybmVsJ3MgUENJIHN1YnN5c3RlbSB0byBzdXBwb3J0CisgKiBzeXN0ZW0gUG93ZXIgTWFuYWdlbWVudCAoUE0pLiBXaGVuIFBNIGludm9rZXMgdGhpcyBtZXRob2QsIGl0IHF1aWVzY2VzIHRoZQorICogZGV2aWNlIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIncyB3b3JrZXIgdGhyZWFkIGZvciB0aGUgZGV2aWNlLCB0dXJuaW5nIG9mZgorICogZGV2aWNlJ3MgaW50ZXJydXB0IGFuZCBETUEsIGFuZCBicmluZyB0aGUgZGV2aWNlIG9mZmxpbmUuIE5vdGUgdGhhdCBhcyB0aGUKKyAqIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBtaW5pbXVtIFBNIHJlcXVpcmVtZW50cyB0byBhIHBvd2VyLWF3YXJlIGRyaXZlcidzIFBNCisgKiBzdXBwb3J0IGZvciBzdXNwZW5kL3Jlc3VtZSAtLSBhbGwgdGhlIHBvc3NpYmxlIFBNIG1lc3NhZ2VzIChTVVNQRU5ELAorICogSElCRVJOQVRFLCBGUkVFWkUpIHRvIHRoZSBzdXNwZW5kKCkgbWV0aG9kIGNhbGwgd2lsbCBiZSB0cmVhdGVkIGFzIFNVU1BFTkQKKyAqIGFuZCB0aGUgZHJpdmVyIHdpbGwgZnVsbHkgcmVpbml0aWFsaXplIGl0cyBkZXZpY2UgZHVyaW5nIHJlc3VtZSgpIG1ldGhvZAorICogY2FsbCwgdGhlIGRyaXZlciB3aWxsIHNldCBkZXZpY2UgdG8gUENJX0QzaG90IHN0YXRlIGluIFBDSSBjb25maWcgc3BhY2UKKyAqIGluc3RlYWQgb2Ygc2V0dGluZyBpdCBhY2NvcmRpbmcgdG8gdGhlIEBtc2cgcHJvdmlkZWQgYnkgdGhlIFBNLgorICoKKyAqIFJldHVybiBjb2RlCisgKiAgIDAgLSBkcml2ZXIgc3VzcGVuZGVkIHRoZSBkZXZpY2UKKyAqICAgRXJyb3Igb3RoZXJ3aXNlCisgKiovCitzdGF0aWMgaW50CitscGZjX3BjaV9zdXNwZW5kX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAorCQkJIjA0NzMgUENJIGRldmljZSBQb3dlciBNYW5hZ2VtZW50IHN1c3BlbmQuXG4iKTsKKworCS8qIEJyaW5nIGRvd24gdGhlIGRldmljZSAqLworCWxwZmNfb2ZmbGluZV9wcmVwKHBoYmEpOworCWxwZmNfb2ZmbGluZShwaGJhKTsKKwlrdGhyZWFkX3N0b3AocGhiYS0+d29ya2VyX3RocmVhZCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdCBmcm9tIGRldmljZSAqLworCWxwZmNfZGlzYWJsZV9pbnRyKHBoYmEpOworCisJLyogU2F2ZSBkZXZpY2Ugc3RhdGUgdG8gUENJIGNvbmZpZyBzcGFjZSAqLworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGxwZmNfcGNpX3Jlc3VtZV9vbmU6IGxwZmMgUENJIGZ1bmMgdG8gcmVzdW1lIGRldmljZSBmb3IgcG93ZXIgbWFuYWdlbWVudC4KKyAqIEBwZGV2OiBwb2ludGVyIHRvIFBDSSBkZXZpY2UKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdG8gYmUgcmVnaXN0ZXJlZCB0byB0aGUga2VybmVsJ3MgUENJIHN1YnN5c3RlbSB0byBzdXBwb3J0CisgKiBzeXN0ZW0gUG93ZXIgTWFuYWdlbWVudCAoUE0pLiBXaGVuIFBNIGludm9rZXMgdGhpcyBtZXRob2QsIGl0IHJlc3RvcmVzCisgKiB0aGUgZGV2aWNlJ3MgUENJIGNvbmZpZyBzcGFjZSBzdGF0ZSBhbmQgZnVsbHkgcmVpbml0aWFsaXplcyB0aGUgZGV2aWNlCisgKiBhbmQgYnJpbmdzIGl0IG9ubGluZS4gTm90ZSB0aGF0IGFzIHRoZSBkcml2ZXIgaW1wbGVtZW50cyB0aGUgbWluaW11bSBQTQorICogcmVxdWlyZW1lbnRzIHRvIGEgcG93ZXItYXdhcmUgZHJpdmVyJ3MgUE0gZm9yIHN1c3BlbmQvcmVzdW1lIC0tIGFsbAorICogdGhlIHBvc3NpYmxlIFBNIG1lc3NhZ2VzIChTVVNQRU5ELCBISUJFUk5BVEUsIEZSRUVaRSkgdG8gdGhlIHN1c3BlbmQoKQorICogbWV0aG9kIGNhbGwgd2lsbCBiZSB0cmVhdGVkIGFzIFNVU1BFTkQgYW5kIHRoZSBkcml2ZXIgd2lsbCBmdWxseQorICogcmVpbml0aWFsaXplIGl0cyBkZXZpY2UgZHVyaW5nIHJlc3VtZSgpIG1ldGhvZCBjYWxsLCB0aGUgZGV2aWNlIHdpbGwgYmUKKyAqIHNldCB0byBQQ0lfRDAgZGlyZWN0bHkgaW4gUENJIGNvbmZpZyBzcGFjZSBiZWZvcmUgcmVzdG9yaW5nIHRoZSBzdGF0ZS4KKyAqCisgKiBSZXR1cm4gY29kZQorICogICAwIC0gZHJpdmVyIHN1c3BlbmRlZCB0aGUgZGV2aWNlCisgKiAgIEVycm9yIG90aGVyd2lzZQorICoqLworc3RhdGljIGludAorbHBmY19wY2lfcmVzdW1lX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoKHN0cnVjdCBscGZjX3Zwb3J0ICopc2hvc3QtPmhvc3RkYXRhKS0+cGhiYTsKKwl1aW50MzJfdCBpbnRyX21vZGU7CisJaW50IGVycm9yOworCisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCisJCQkiMDQ1MiBQQ0kgZGV2aWNlIFBvd2VyIE1hbmFnZW1lbnQgcmVzdW1lLlxuIik7CisKKwkvKiBSZXN0b3JlIGRldmljZSBzdGF0ZSBmcm9tIFBDSSBjb25maWcgc3BhY2UgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJaWYgKHBkZXYtPmlzX2J1c21hc3RlcikKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBTdGFydHVwIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgYWRhcHRlci4gKi8KKwlwaGJhLT53b3JrZXJfdGhyZWFkID0ga3RocmVhZF9ydW4obHBmY19kb193b3JrLCBwaGJhLAorCQkJCQkibHBmY193b3JrZXJfJWQiLCBwaGJhLT5icmRfbm8pOworCWlmIChJU19FUlIocGhiYS0+d29ya2VyX3RocmVhZCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHBoYmEtPndvcmtlcl90aHJlYWQpOworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwNDM0IFBNIHJlc3VtZSBmYWlsZWQgdG8gc3RhcnQgd29ya2VyICIKKwkJCQkidGhyZWFkOiBlcnJvcj14JXguXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBDb25maWd1cmUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpbnRyX21vZGUgPSBscGZjX2VuYWJsZV9pbnRyKHBoYmEsIHBoYmEtPmludHJfbW9kZSk7CisJaWYgKGludHJfbW9kZSA9PSBMUEZDX0lOVFJfRVJST1IpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDQzMCBQTSByZXN1bWUgRmFpbGVkIHRvIGVuYWJsZSBpbnRlcnJ1cHRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UKKwkJcGhiYS0+aW50cl9tb2RlID0gaW50cl9tb2RlOworCisJLyogUmVzdGFydCBIQkEgYW5kIGJyaW5nIGl0IG9ubGluZSAqLworCWxwZmNfc2xpX2JyZHJlc3RhcnQocGhiYSk7CisJbHBmY19vbmxpbmUocGhiYSk7CisKKwkvKiBMb2cgdGhlIGN1cnJlbnQgYWN0aXZlIGludGVycnVwdCBtb2RlICovCisJbHBmY19sb2dfaW50cl9tb2RlKHBoYmEsIHBoYmEtPmludHJfbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBscGZjX2lvX2Vycm9yX2RldGVjdGVkOiBEcml2ZXIgbWV0aG9kIGZvciBoYW5kbGluZyBQQ0kgSS9PIGVycm9yIGRldGVjdGVkLgogICogQHBkZXY6IHBvaW50ZXIgdG8gUENJIGRldmljZS4KICAqIEBzdGF0ZTogdGhlIGN1cnJlbnQgUENJIGNvbm5lY3Rpb24gc3RhdGUuCkBAIC0yODI4LDEzICszMjQ1LDggQEAKIAlwcmluZyA9ICZwc2xpLT5yaW5nW3BzbGktPmZjcF9yaW5nXTsKIAlscGZjX3NsaV9hYm9ydF9pb2NiX3JpbmcocGhiYSwgcHJpbmcpOwogCi0JaWYgKHBoYmEtPmludHJfdHlwZSA9PSBNU0lYKQotCQlscGZjX2Rpc2FibGVfbXNpeChwaGJhKTsKLQllbHNlIHsKLQkJZnJlZV9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIHBoYmEpOwotCQlpZiAocGhiYS0+aW50cl90eXBlID09IE1TSSkKLQkJCXBjaV9kaXNhYmxlX21zaShwaGJhLT5wY2lkZXYpOwotCX0KKwkvKiBEaXNhYmxlIGludGVycnVwdCAqLworCWxwZmNfZGlzYWJsZV9pbnRyKHBoYmEpOwogCiAJLyogUmVxdWVzdCBhIHNsb3QgcmVzZXQuICovCiAJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CkBAIC0yODYyLDcgKzMyNzQsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9ICgoc3RydWN0IGxwZmNfdnBvcnQgKilzaG9zdC0+aG9zdGRhdGEpLT5waGJhOwogCXN0cnVjdCBscGZjX3NsaSAqcHNsaSA9ICZwaGJhLT5zbGk7Ci0JaW50IGVycm9yLCByZXR2YWw7CisJdWludDMyX3QgaW50cl9tb2RlOwogCiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJyZWNvdmVyaW5nIGZyb20gYSBzbG90IHJlc2V0LlxuIik7CiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KSkgewpAQCAtMjg3MSw2MSArMzI4MywzMSBAQAogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIAl9CiAKLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlpZiAocGRldi0+aXNfYnVzbWFzdGVyKQorCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCXBzbGktPnNsaV9mbGFnICY9IH5MUEZDX1NMSTJfQUNUSVZFOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKLQkvKiBFbmFibGUgY29uZmlndXJlZCBpbnRlcnJ1cHQgbWV0aG9kICovCi0JcGhiYS0+aW50cl90eXBlID0gTk9ORTsKLQlpZiAocGhiYS0+Y2ZnX3VzZV9tc2kgPT0gMikgewotCQkvKiBOZWVkIHRvIGlzc3VlIGNvbmZfcG9ydCBtYm94IGNtZCBiZWZvcmUgY29uZl9tc2kgbWJveCBjbWQgKi8KLQkJZXJyb3IgPSBscGZjX3NsaV9jb25maWdfcG9ydChwaGJhLCAzKTsKLQkJaWYgKGVycm9yKQotCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCi0JCQkJIjA0NzggRmlybXdhcmUgbm90IGNhcGFibGUgb2YgU0xJIDMgbW9kZS5cbiIpOwotCQllbHNlIHsKLQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAotCQkJCSIwNDc5IEZpcm13YXJlIGNhcGFibGUgb2YgU0xJIDMgbW9kZS5cbiIpOwotCQkJLyogTm93LCB0cnkgdG8gZW5hYmxlIE1TSS1YIGludGVycnVwdCBtb2RlICovCi0JCQllcnJvciA9IGxwZmNfZW5hYmxlX21zaXgocGhiYSk7Ci0JCQlpZiAoIWVycm9yKSB7Ci0JCQkJcGhiYS0+aW50cl90eXBlID0gTVNJWDsKLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKLQkJCQkJCSIwNDgwIGVuYWJsZSBNU0ktWCBtb2RlLlxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBGYWxsYmFjayB0byBNU0kgaWYgTVNJLVggaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0JaWYgKHBoYmEtPmNmZ191c2VfbXNpID49IDEgJiYgcGhiYS0+aW50cl90eXBlID09IE5PTkUpIHsKLQkJcmV0dmFsID0gcGNpX2VuYWJsZV9tc2kocGhiYS0+cGNpZGV2KTsKLQkJaWYgKCFyZXR2YWwpIHsKLQkJCXBoYmEtPmludHJfdHlwZSA9IE1TSTsKLQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19JTklULAotCQkJCQkiMDQ4MSBlbmFibGUgTVNJIG1vZGUuXG4iKTsKLQkJfSBlbHNlCi0JCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfSU5JVCwKLQkJCQkJIjA0NzAgZW5hYmxlIElSUSBtb2RlLlxuIik7Ci0JfQotCi0JLyogTVNJLVggaXMgdGhlIG9ubHkgY2FzZSB0aGUgZG9lc24ndCBuZWVkIHRvIGNhbGwgcmVxdWVzdF9pcnEgKi8KLQlpZiAocGhiYS0+aW50cl90eXBlICE9IE1TSVgpIHsKLQkJcmV0dmFsID0gcmVxdWVzdF9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIGxwZmNfaW50cl9oYW5kbGVyLAotCQkJCSAgICAgSVJRRl9TSEFSRUQsIExQRkNfRFJJVkVSX05BTUUsIHBoYmEpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJCQkiMDQ3MSBFbmFibGUgaW50ZXJydXB0IGhhbmRsZXIgIgotCQkJCQkiZmFpbGVkXG4iKTsKLQkJfSBlbHNlIGlmIChwaGJhLT5pbnRyX3R5cGUgIT0gTVNJKQotCQkJcGhiYS0+aW50cl90eXBlID0gSU5UeDsKLQl9CisJLyogQ29uZmlndXJlIGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJaW50cl9tb2RlID0gbHBmY19lbmFibGVfaW50cihwaGJhLCBwaGJhLT5pbnRyX21vZGUpOworCWlmIChpbnRyX21vZGUgPT0gTFBGQ19JTlRSX0VSUk9SKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjA0MjcgQ2Fubm90IHJlLWVuYWJsZSBpbnRlcnJ1cHQgYWZ0ZXIgIgorCQkJCSJzbG90IHJlc2V0LlxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0gZWxzZQorCQlwaGJhLT5pbnRyX21vZGUgPSBpbnRyX21vZGU7CiAKIAkvKiBUYWtlIGRldmljZSBvZmZsaW5lOyB0aGlzIHdpbGwgcGVyZm9ybSBjbGVhbnVwICovCiAJbHBmY19vZmZsaW5lKHBoYmEpOwogCWxwZmNfc2xpX2JyZHJlc3RhcnQocGhiYSk7CiAKKwkvKiBMb2cgdGhlIGN1cnJlbnQgYWN0aXZlIGludGVycnVwdCBtb2RlICovCisJbHBmY19sb2dfaW50cl9tb2RlKHBoYmEsIHBoYmEtPmludHJfbW9kZSk7CisKIAlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwogfQogCkBAIC0zMDM3LDYgKzM0MTksOCBAQAogCS5pZF90YWJsZQk9IGxwZmNfaWRfdGFibGUsCiAJLnByb2JlCQk9IGxwZmNfcGNpX3Byb2JlX29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGxwZmNfcGNpX3JlbW92ZV9vbmUpLAorCS5zdXNwZW5kICAgICAgICA9IGxwZmNfcGNpX3N1c3BlbmRfb25lLAorCS5yZXN1bWUgICAgICAgICA9IGxwZmNfcGNpX3Jlc3VtZV9vbmUsCiAJLmVycl9oYW5kbGVyICAgID0gJmxwZmNfZXJyX2hhbmRsZXIsCiB9OwogCkBAIC0zMTAwLDYgKzM0ODQsMTkgQEAKIAlmY19yZWxlYXNlX3RyYW5zcG9ydChscGZjX3RyYW5zcG9ydF90ZW1wbGF0ZSk7CiAJaWYgKGxwZmNfZW5hYmxlX25waXYpCiAJCWZjX3JlbGVhc2VfdHJhbnNwb3J0KGxwZmNfdnBvcnRfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlpZiAoX2R1bXBfYnVmX2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgZnJlZWluZyAlbHUgcGFnZXMgZm9yIF9kdW1wX2J1Zl9kYXRhICIKKwkJCQkiYXQgMHglcFxuIiwKKwkJCQkoMUwgPDwgX2R1bXBfYnVmX2RhdGFfb3JkZXIpLCBfZHVtcF9idWZfZGF0YSk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpX2R1bXBfYnVmX2RhdGEsIF9kdW1wX2J1Zl9kYXRhX29yZGVyKTsKKwl9CisKKwlpZiAoX2R1bXBfYnVmX2RpZikgeworCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBmcmVlaW5nICVsdSBwYWdlcyBmb3IgX2R1bXBfYnVmX2RpZiAiCisJCQkJImF0IDB4JXBcbiIsCisJCQkJKDFMIDw8IF9kdW1wX2J1Zl9kaWZfb3JkZXIpLCBfZHVtcF9idWZfZGlmKTsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylfZHVtcF9idWZfZGlmLCBfZHVtcF9idWZfZGlmX29yZGVyKTsKKwl9CiB9CiAKIG1vZHVsZV9pbml0KGxwZmNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaAppbmRleCAzOWZkMmI4Li5hODViN2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbG9nbXNnLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgTE9HX0ZDUCAgICAgICAgICAgICAgICAgICAgICAgMHg0MAkvKiBGQ1AgdHJhZmZpYyBoaXN0b3J5ICovCiAjZGVmaW5lIExPR19OT0RFICAgICAgICAgICAgICAgICAgICAgIDB4ODAJLyogTm9kZSB0YWJsZSBldmVudHMgKi8KICNkZWZpbmUgTE9HX1RFTVAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAJLyogVGVtcGVyYXR1cmUgc2Vuc29yIGV2ZW50cyAqLworI2RlZmluZSBMT0dfQkcJCQkgICAgICAweDIwMAkvKiBCbG9ja0J1YXJkIGV2ZW50cyAqLwogI2RlZmluZSBMT0dfTUlTQyAgICAgICAgICAgICAgICAgICAgICAweDQwMAkvKiBNaXNjZWxsYW5lb3VzIGV2ZW50cyAqLwogI2RlZmluZSBMT0dfU0xJICAgICAgICAgICAgICAgICAgICAgICAweDgwMAkvKiBTTEkgZXZlbnRzICovCiAjZGVmaW5lIExPR19GQ1BfRVJST1IgICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBsb2cgZXJyb3JzLCBub3QgdW5kZXJydW5zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCmluZGV4IDc0NjVmZTcuLjM0ZWViMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCkBAIC03Nyw2ICs3NywzOCBAQAogfQogCiAvKioKKyAqIGxwZmNfZHVtcF9tZW06IFByZXBhcmUgYSBtYWlsYm94IGNvbW1hbmQgZm9yIHJldHJpZXZpbmcgd2FrZXVwIHBhcmFtcy4KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQHBtYjogcG9pbnRlciB0byB0aGUgZHJpdmVyIGludGVybmFsIHF1ZXVlIGVsZW1lbnQgZm9yIG1haWxib3ggY29tbWFuZC4KKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlIGEgZHVtcCBtZW1vcnkgbWFpbGJveCBjb21tYW5kIHRvIGR1bXAgd2FrZSB1cAorICogcGFyYW1ldGVycy4KKyAqLwordm9pZAorbHBmY19kdW1wX3dha2V1cF9wYXJhbShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIExQRkNfTUJPWFFfdCAqcG1iKQoreworCU1BSUxCT1hfdCAqbWI7CisJdm9pZCAqY3R4OworCisJbWIgPSAmcG1iLT5tYjsKKwkvKiBTYXZlIGNvbnRleHQgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBhZnRlciBtZW1zZXQgKi8KKwljdHggPSBwbWItPmNvbnRleHQyOworCisJLyogU2V0dXAgdG8gZHVtcCBWUEQgcmVnaW9uICovCisJbWVtc2V0KHBtYiwgMCwgc2l6ZW9mKExQRkNfTUJPWFFfdCkpOworCW1iLT5tYnhDb21tYW5kID0gTUJYX0RVTVBfTUVNT1JZOworCW1iLT5tYnhPd25lciA9IE9XTl9IT1NUOworCW1iLT51bi52YXJEbXAuY3YgPSAxOworCW1iLT51bi52YXJEbXAudHlwZSA9IERNUF9OVl9QQVJBTVM7CisJbWItPnVuLnZhckRtcC5lbnRyeV9pbmRleCA9IDA7CisJbWItPnVuLnZhckRtcC5yZWdpb25faWQgPSBXQUtFX1VQX1BBUk1TX1JFR0lPTl9JRDsKKwltYi0+dW4udmFyRG1wLndvcmRfY250ID0gV0FLRV9VUF9QQVJNU19XT1JEX1NJWkU7CisJbWItPnVuLnZhckRtcC5jbyA9IDA7CisJbWItPnVuLnZhckRtcC5yZXNwX29mZnNldCA9IDA7CisJcG1iLT5jb250ZXh0MiA9IGN0eDsKKwlyZXR1cm47Cit9CisKKy8qKgogICogbHBmY19yZWFkX252OiBQcmVwYXJlIGEgbWFpbGJveCBjb21tYW5kIGZvciByZWFkaW5nIEhCQSdzIE5WUkFNIHBhcmFtLgogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKiBAcG1iOiBwb2ludGVyIHRvIHRoZSBkcml2ZXIgaW50ZXJuYWwgcXVldWUgZWxlbWVudCBmb3IgbWFpbGJveCBjb21tYW5kLgpAQCAtMTA2MSw5ICsxMDkzLDE0IEBACiAJbWItPnVuLnZhckNmZ1BvcnQucGNiTG93ID0gcHV0UGFkZHJMb3cocGRtYV9hZGRyKTsKIAltYi0+dW4udmFyQ2ZnUG9ydC5wY2JIaWdoID0gcHV0UGFkZHJIaWdoKHBkbWFfYWRkcik7CiAKKwkvKiBBbHdheXMgSG9zdCBHcm91cCBQb2ludGVyIGlzIGluIFNMSU0gKi8KKwltYi0+dW4udmFyQ2ZnUG9ydC5ocHMgPSAxOworCiAJLyogSWYgSEJBIHN1cHBvcnRzIFNMST0zIGFzayBmb3IgaXQgKi8KIAogCWlmIChwaGJhLT5zbGlfcmV2ID09IDMgJiYgcGhiYS0+dnBkLnNsaTNGZWF0LmNlcmJtKSB7CisJCWlmIChwaGJhLT5jZmdfZW5hYmxlX2JnKQorCQkJbWItPnVuLnZhckNmZ1BvcnQuY2JnID0gMTsgLyogY29uZmlndXJlIEJsb2NrR3VhcmQgKi8KIAkJbWItPnVuLnZhckNmZ1BvcnQuY2VyYm0gPSAxOyAvKiBSZXF1ZXN0IEhCUXMgKi8KIAkJbWItPnVuLnZhckNmZ1BvcnQuY2NycCA9IDE7IC8qIENvbW1hbmQgUmluZyBQb2xsaW5nICovCiAJCW1iLT51bi52YXJDZmdQb3J0LmNpbmIgPSAxOyAvKiBJbnRlcnJ1cHQgTm90aWZpY2F0aW9uIEJsb2NrICovCkBAIC0xMTYzLDE2ICsxMjAwLDExIEBACiAJCQkJICAgIHNpemVvZigqcGhiYS0+aG9zdF9ncCkpOwogCX0KIAotCS8qIFNldHVwIFBvcnQgR3JvdXAgcmluZyBwb2ludGVyICovCi0JaWYgKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19JTkJfRU5BQkxFRCkgewotCQlwZ3Bfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGxwZmNfc2xpMl9zbGltLAotCQkJCSAgICAgIG1ieC51cy5zM19pbmJfcGdwLnBvcnQpOwotCQlwaGJhLT5oYnFfZ2V0ID0gcGhiYS0+bWJveC0+dXMuczNfaW5iX3BncC5oYnFfZ2V0OwotCX0gZWxzZSBpZiAocGhiYS0+c2xpX3JldiA9PSAzKSB7CisJLyogU2V0dXAgUG9ydCBHcm91cCBvZmZzZXQgKi8KKwlpZiAocGhiYS0+c2xpX3JldiA9PSAzKQogCQlwZ3Bfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGxwZmNfc2xpMl9zbGltLAogCQkJCSAgICAgIG1ieC51cy5zM19wZ3AucG9ydCk7Ci0JCXBoYmEtPmhicV9nZXQgPSBwaGJhLT5tYm94LT51cy5zM19wZ3AuaGJxX2dldDsKLQl9IGVsc2UKKwllbHNlCiAJCXBncF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbHBmY19zbGkyX3NsaW0sIG1ieC51cy5zMi5wb3J0KTsKIAlwZG1hX2FkZHIgPSBwaGJhLT5zbGltMnAucGh5cyArIHBncF9vZmZzZXQ7CiAJcGhiYS0+cGNiLT5wZ3BBZGRySGlnaCA9IHB1dFBhZGRySGlnaChwZG1hX2FkZHIpOwpAQCAtMTI4NSwxMCArMTMxNywxMiBAQAogdm9pZAogbHBmY19tYm94X2NtcGxfcHV0KHN0cnVjdCBscGZjX2hiYSAqIHBoYmEsIExQRkNfTUJPWFFfdCAqIG1icSkKIHsKKwl1bnNpZ25lZCBsb25nIGlmbGFnOworCiAJLyogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRvIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCi0Jc3Bpbl9sb2NrKCZwaGJhLT5oYmFsb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCWxpc3RfYWRkX3RhaWwoJm1icS0+bGlzdCwgJnBoYmEtPnNsaS5tYm94cV9jbXBsKTsKLQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ubC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ubC5oCmluZGV4IDFhY2NiNWEuLjI3ZDFhODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbmwuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25sLmgKQEAgLTIyLDE4ICsyMiwyMCBAQAogI2RlZmluZSBGQ19SRUdfTElOS19FVkVOVAkJMHgwMDAxCS8qIGxpbmsgdXAgLyBkb3duIGV2ZW50cyAqLwogI2RlZmluZSBGQ19SRUdfUlNDTl9FVkVOVAkJMHgwMDAyCS8qIFJTQ04gZXZlbnRzICovCiAjZGVmaW5lIEZDX1JFR19DVF9FVkVOVAkJCTB4MDAwNAkvKiBDVCByZXF1ZXN0IGV2ZW50cyAqLwotI2RlZmluZSBGQ19SRUdfRFVNUF9FVkVOVAkJMHgwMDA4CS8qIER1bXAgZXZlbnRzICovCi0jZGVmaW5lIEZDX1JFR19URU1QRVJBVFVSRV9FVkVOVAkweDAwMTAJLyogdGVtcGVyYXR1cmUgZXZlbnRzICovCi0jZGVmaW5lIEZDX1JFR19FTFNfRVZFTlQJCTB4MDAyMAkvKiBscGZjIGVscyBldmVudHMgKi8KLSNkZWZpbmUgRkNfUkVHX0ZBQlJJQ19FVkVOVAkJMHgwMDQwCS8qIGxwZmMgZmFicmljIGV2ZW50cyAqLwotI2RlZmluZSBGQ19SRUdfU0NTSV9FVkVOVAkJMHgwMDgwCS8qIGxwZmMgc2NzaSBldmVudHMgKi8KLSNkZWZpbmUgRkNfUkVHX0JPQVJEX0VWRU5UCQkweDAxMDAJLyogbHBmYyBib2FyZCBldmVudHMgKi8KLSNkZWZpbmUgRkNfUkVHX0FEQVBURVJfRVZFTlQJCTB4MDIwMAkvKiBscGZjIGFkYXB0ZXIgZXZlbnRzICovCisjZGVmaW5lIEZDX1JFR19EVU1QX0VWRU5UCQkweDAwMTAJLyogRHVtcCBldmVudHMgKi8KKyNkZWZpbmUgRkNfUkVHX1RFTVBFUkFUVVJFX0VWRU5UCTB4MDAyMAkvKiB0ZW1wZXJhdHVyZSBldmVudHMgKi8KKyNkZWZpbmUgRkNfUkVHX1ZQT1JUUlNDTl9FVkVOVAkJMHgwMDQwCS8qIFZwb3J0IFJTQ04gZXZlbnRzICovCisjZGVmaW5lIEZDX1JFR19FTFNfRVZFTlQJCTB4MDA4MAkvKiBscGZjIGVscyBldmVudHMgKi8KKyNkZWZpbmUgRkNfUkVHX0ZBQlJJQ19FVkVOVAkJMHgwMTAwCS8qIGxwZmMgZmFicmljIGV2ZW50cyAqLworI2RlZmluZSBGQ19SRUdfU0NTSV9FVkVOVAkJMHgwMjAwCS8qIGxwZmMgc2NzaSBldmVudHMgKi8KKyNkZWZpbmUgRkNfUkVHX0JPQVJEX0VWRU5UCQkweDA0MDAJLyogbHBmYyBib2FyZCBldmVudHMgKi8KKyNkZWZpbmUgRkNfUkVHX0FEQVBURVJfRVZFTlQJCTB4MDgwMAkvKiBscGZjIGFkYXB0ZXIgZXZlbnRzICovCiAjZGVmaW5lIEZDX1JFR19FVkVOVF9NQVNLCQkoRkNfUkVHX0xJTktfRVZFTlQgfCBcCiAJCQkJCQlGQ19SRUdfUlNDTl9FVkVOVCB8IFwKIAkJCQkJCUZDX1JFR19DVF9FVkVOVCB8IFwKIAkJCQkJCUZDX1JFR19EVU1QX0VWRU5UIHwgXAogCQkJCQkJRkNfUkVHX1RFTVBFUkFUVVJFX0VWRU5UIHwgXAorCQkJCQkJRkNfUkVHX1ZQT1JUUlNDTl9FVkVOVCB8IFwKIAkJCQkJCUZDX1JFR19FTFNfRVZFTlQgfCBcCiAJCQkJCQlGQ19SRUdfRkFCUklDX0VWRU5UIHwgXAogCQkJCQkJRkNfUkVHX1NDU0lfRVZFTlQgfCBcCkBAIC01Miw2ICs1NCwxMyBAQAogICogVGhlIHBheWxvYWQgc2VudCB2aWEgdGhlIGZjIHRyYW5zcG9ydCBpcyBvbmUtd2F5IGRyaXZlci0+YXBwbGljYXRpb24uCiAgKi8KIAorLyogUlNDTiBldmVudCBoZWFkZXIgKi8KK3N0cnVjdCBscGZjX3JzY25fZXZlbnRfaGVhZGVyIHsKKwl1aW50MzJfdCBldmVudF90eXBlOworCXVpbnQzMl90IHBheWxvYWRfbGVuZ3RoOyAvKiBSU0NOIGRhdGEgbGVuZ3RoIGluIGJ5dGVzICovCisJdWludDMyX3QgcnNjbl9wYXlsb2FkW107Cit9OworCiAvKiBlbHMgZXZlbnQgaGVhZGVyICovCiBzdHJ1Y3QgbHBmY19lbHNfZXZlbnRfaGVhZGVyIHsKIAl1aW50MzJfdCBldmVudF90eXBlOwpAQCAtNjUsNiArNzQsNyBAQAogI2RlZmluZSBMUEZDX0VWRU5UX1BSTE9fUkNWCQkweDAyCiAjZGVmaW5lIExQRkNfRVZFTlRfQURJU0NfUkNWCQkweDA0CiAjZGVmaW5lIExQRkNfRVZFTlRfTFNSSlRfUkNWCQkweDA4CisjZGVmaW5lIExQRkNfRVZFTlRfTE9HT19SQ1YJCTB4MTAKIAogLyogc3BlY2lhbCBlbHMgbHNyanQgZXZlbnQgKi8KIHN0cnVjdCBscGZjX2xzcmp0X2V2ZW50IHsKQEAgLTc0LDYgKzg0LDExIEBACiAJdWludDMyX3QgZXhwbGFuYXRpb247CiB9OwogCisvKiBzcGVjaWFsIGVscyBsb2dvIGV2ZW50ICovCitzdHJ1Y3QgbHBmY19sb2dvX2V2ZW50IHsKKwlzdHJ1Y3QgbHBmY19lbHNfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwl1aW50OF90IGxvZ29fd3dwbls4XTsKK307CiAKIC8qIGZhYnJpYyBldmVudCBoZWFkZXIgKi8KIHN0cnVjdCBscGZjX2ZhYnJpY19ldmVudF9oZWFkZXIgewpAQCAtMTI1LDYgKzE0MCw3IEBACiAvKiBzcGVjaWFsIGNhc2Ugc2NzaSBjaGVjayBjb25kaXRpb24gZXZlbnQgKi8KIHN0cnVjdCBscGZjX3Njc2lfY2hlY2tfY29uZGl0aW9uX2V2ZW50IHsKIAlzdHJ1Y3QgbHBmY19zY3NpX2V2ZW50X2hlYWRlciBzY3NpX2V2ZW50OworCXVpbnQ4X3Qgb3Bjb2RlOwogCXVpbnQ4X3Qgc2Vuc2Vfa2V5OwogCXVpbnQ4X3QgYXNjOwogCXVpbnQ4X3QgYXNjcTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCmluZGV4IDBjMjVkOTcuLjhmNTQ4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwpAQCAtMTkyOSwxMCArMTkyOSwxMCBAQAogCWlmICh2cG9ydC0+ZmNfZmxhZyAmIEZDX1JTQ05fREVGRVJSRUQpCiAJCXJldHVybiBuZGxwLT5ubHBfc3RhdGU7CiAKKwlscGZjX2NhbmNlbF9yZXRyeV9kZWxheV90bW8odnBvcnQsIG5kbHApOwogCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJbmRscC0+bmxwX2ZsYWcgJj0gfihOTFBfTk9ERVZfUkVNT1ZFIHwgTkxQX05QUl8yQl9ESVNDKTsKIAlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7Ci0JbHBmY19jYW5jZWxfcmV0cnlfZGVsYXlfdG1vKHZwb3J0LCBuZGxwKTsKIAlyZXR1cm4gbmRscC0+bmxwX3N0YXRlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCmluZGV4IGJkMTg2NzQuLmIxMDNiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCkBAIC0xOCwxMyArMTgsMTQgQEAKICAqIG1vcmUgZGV0YWlscywgYSBjb3B5IG9mIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSBDT1BZSU5HICAqCiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgcGFja2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CkBAIC00Myw2ICs0NCw3MyBAQAogI2RlZmluZSBMUEZDX1JFU0VUX1dBSVQgIDIKICNkZWZpbmUgTFBGQ19BQk9SVF9XQUlUICAyCiAKK2ludCBfZHVtcF9idWZfZG9uZTsKKworc3RhdGljIGNoYXIgKmRpZl9vcF9zdHJbXSA9IHsKKwkiU0NTSV9QUk9UX05PUk1BTCIsCisJIlNDU0lfUFJPVF9SRUFEX0lOU0VSVCIsCisJIlNDU0lfUFJPVF9XUklURV9TVFJJUCIsCisJIlNDU0lfUFJPVF9SRUFEX1NUUklQIiwKKwkiU0NTSV9QUk9UX1dSSVRFX0lOU0VSVCIsCisJIlNDU0lfUFJPVF9SRUFEX1BBU1MiLAorCSJTQ1NJX1BST1RfV1JJVEVfUEFTUyIsCisJIlNDU0lfUFJPVF9SRUFEX0NPTlZFUlQiLAorCSJTQ1NJX1BST1RfV1JJVEVfQ09OVkVSVCIKK307CisKK3N0YXRpYyB2b2lkCitscGZjX2RlYnVnX3NhdmVfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQoreworCXZvaWQgKnNyYywgKmRzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZGUgPSBzY3NpX3NnbGlzdChjbW5kKTsKKworCWlmICghX2R1bXBfYnVmX2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQgRVJST1IgJXMgX2R1bXBfYnVmX2RhdGEgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKworCWlmICghc2dkZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRCBFUlJPUjogZGF0YSBzY2F0dGVybGlzdCBpcyBudWxsXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRzdCA9ICh2b2lkICopIF9kdW1wX2J1Zl9kYXRhOworCXdoaWxlIChzZ2RlKSB7CisJCXNyYyA9IHNnX3ZpcnQoc2dkZSk7CisJCW1lbWNweShkc3QsIHNyYywgc2dkZS0+bGVuZ3RoKTsKKwkJZHN0ICs9IHNnZGUtPmxlbmd0aDsKKwkJc2dkZSA9IHNnX25leHQoc2dkZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbHBmY19kZWJ1Z19zYXZlX2RpZihzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQoreworCXZvaWQgKnNyYywgKmRzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZGUgPSBzY3NpX3Byb3Rfc2dsaXN0KGNtbmQpOworCisJaWYgKCFfZHVtcF9idWZfZGlmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SICVzIF9kdW1wX2J1Zl9kYXRhIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKCFzZ2RlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SOiBwcm90IHNjYXR0ZXJsaXN0IGlzIG51bGxcbiIpOworCQlyZXR1cm47CisJfQorCisJZHN0ID0gX2R1bXBfYnVmX2RpZjsKKwl3aGlsZSAoc2dkZSkgeworCQlzcmMgPSBzZ192aXJ0KHNnZGUpOworCQltZW1jcHkoZHN0LCBzcmMsIHNnZGUtPmxlbmd0aCk7CisJCWRzdCArPSBzZ2RlLT5sZW5ndGg7CisJCXNnZGUgPSBzZ19uZXh0KHNnZGUpOworCX0KK30KKwogLyoqCiAgKiBscGZjX3VwZGF0ZV9zdGF0czogVXBkYXRlIHN0YXRpc3RpY2FsIGRhdGEgZm9yIHRoZSBjb21tYW5kIGNvbXBsZXRpb24uCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgb2JqZWN0LgpAQCAtNjYsNiArMTM0LDggQEAKIAlpZiAoY21kLT5yZXN1bHQpCiAJCXJldHVybjsKIAorCWxhdGVuY3kgPSBqaWZmaWVzX3RvX21zZWNzKChsb25nKWppZmZpZXMgLSAobG9uZylscGZjX2NtZC0+c3RhcnRfdGltZSk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJaWYgKCF2cG9ydC0+c3RhdF9kYXRhX2VuYWJsZWQgfHwKIAkJdnBvcnQtPnN0YXRfZGF0YV9ibG9ja2VkIHx8CkBAIC03NCwxMyArMTQ0LDE1IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQotCWxhdGVuY3kgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBscGZjX2NtZC0+c3RhcnRfdGltZSk7CiAKIAlpZiAocGhiYS0+YnVja2V0X3R5cGUgPT0gTFBGQ19MSU5FQVJfQlVDS0VUKSB7CiAJCWkgPSAobGF0ZW5jeSArIHBoYmEtPmJ1Y2tldF9zdGVwIC0gMSAtIHBoYmEtPmJ1Y2tldF9iYXNlKS8KIAkJCXBoYmEtPmJ1Y2tldF9zdGVwOwotCQlpZiAoaSA+PSBMUEZDX01BWF9CVUNLRVRfQ09VTlQpCi0JCQlpID0gTFBGQ19NQVhfQlVDS0VUX0NPVU5UOworCQkvKiBjaGVjayBhcnJheSBzdWJzY3JpcHQgYm91bmRzICovCisJCWlmIChpIDwgMCkKKwkJCWkgPSAwOworCQllbHNlIGlmIChpID49IExQRkNfTUFYX0JVQ0tFVF9DT1VOVCkKKwkJCWkgPSBMUEZDX01BWF9CVUNLRVRfQ09VTlQgLSAxOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBMUEZDX01BWF9CVUNLRVRfQ09VTlQtMTsgaSsrKQogCQkJaWYgKGxhdGVuY3kgPD0gKHBoYmEtPmJ1Y2tldF9iYXNlICsKQEAgLTkyLDcgKzE2NCw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiB9CiAKLQogLyoqCiAgKiBscGZjX3NlbmRfc2Rldl9xdWV1ZWRlcHRoX2NoYW5nZV9ldmVudDogUG9zdHMgYSBxdWV1ZWRlcHRoIGNoYW5nZQogICogICAgICAgICAgICAgICAgICAgZXZlbnQuCkBAIC0xNDgsMTIgKzIxOSwxOSBAQAogCXJldHVybjsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggbm8gbG9jayBoZWxkIHdoZW4gdGhlcmUgaXMgYSByZXNvdXJjZQotICogZXJyb3IgaW4gZHJpdmVyIG9yIGluIGZpcm13YXJlLgotICovCisvKioKKyAqIGxwZmNfcmFtcGRvd25fcXVldWVfZGVwdGg6IFBvc3QgUkFNUF9ET1dOX1FVRVVFIGV2ZW50IHRvIHdvcmtlciB0aHJlYWQuCisgKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyByZXNvdXJjZSBlcnJvciBpbiBkcml2ZXIgb3IgZmlybXdhcmUuCisgKiBUaGlzIHJvdXRpbmUgcG9zdHMgV09SS0VSX1JBTVBfRE9XTl9RVUVVRSBldmVudCBmb3IgQHBoYmEuIFRoaXMgcm91dGluZQorICogcG9zdHMgYXQgbW9zdCAxIGV2ZW50IGVhY2ggc2Vjb25kLiBUaGlzIHJvdXRpbmUgd2FrZXMgdXAgd29ya2VyIHRocmVhZCBvZgorICogQHBoYmEgdG8gcHJvY2VzcyBXT1JLRVJfUkFNX0RPV05fRVZFTlQgZXZlbnQuCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBubyBsb2NrIGhlbGQuCisgKiovCiB2b2lkCi1scGZjX2FkanVzdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCitscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQzMl90IGV2dF9wb3N0ZWQ7CkBAIC0xODIsMTAgKzI2MCwxNyBAQAogCXJldHVybjsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggbm8gbG9jayBoZWxkIHdoZW4gdGhlcmUgaXMgYSBzdWNjZXNzZnVsCi0gKiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbi4KLSAqLworLyoqCisgKiBscGZjX3JhbXB1cF9xdWV1ZV9kZXB0aDogUG9zdCBSQU1QX1VQX1FVRVVFIGV2ZW50IGZvciB3b3JrZXIgdGhyZWFkLgorICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcG9zdCBXT1JLRVJfUkFNUF9VUF9RVUVVRSBldmVudCBmb3IgQHBoYmEgdnBvcnQuIFRoaXMgcm91dGluZQorICogcG9zdCBhdCBtb3N0IDEgZXZlbnQgZXZlcnkgNSBtaW51dGUgYWZ0ZXIgbGFzdF9yYW1wX3VwX3RpbWUgb3IKKyAqIGxhc3RfcnNyY19lcnJvcl90aW1lLiAgVGhpcyByb3V0aW5lIHdha2VzIHVwIHdvcmtlciB0aHJlYWQgb2YgQHBoYmEKKyAqIHRvIHByb2Nlc3MgV09SS0VSX1JBTV9ET1dOX0VWRU5UIGV2ZW50LgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggbm8gbG9jayBoZWxkLgorICoqLwogc3RhdGljIGlubGluZSB2b2lkCiBscGZjX3JhbXB1cF9xdWV1ZV9kZXB0aChzdHJ1Y3QgbHBmY192cG9ydCAgKnZwb3J0LAogCQkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQpAQCAtMjE3LDYgKzMwMiwxNCBAQAogCXJldHVybjsKIH0KIAorLyoqCisgKiBscGZjX3JhbXBfZG93bl9xdWV1ZV9oYW5kbGVyOiBXT1JLRVJfUkFNUF9ET1dOX1FVRVVFIGV2ZW50IGhhbmRsZXIuCisgKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gIHByb2Nlc3MgV09SS0VSX1JBTVBfRE9XTl9RVUVVRSBldmVudCBmb3Igd29ya2VyCisgKiB0aHJlYWQuVGhpcyByb3V0aW5lIHJlZHVjZXMgcXVldWUgZGVwdGggZm9yIGFsbCBzY3NpIGRldmljZSBvbiBlYWNoIHZwb3J0CisgKiBhc3NvY2lhdGVkIHdpdGggQHBoYmEuCisgKiovCiB2b2lkCiBscGZjX3JhbXBfZG93bl9xdWV1ZV9oYW5kbGVyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKQEAgLTI2Nyw2ICszNjAsMTUgQEAKIAlhdG9taWNfc2V0KCZwaGJhLT5udW1fY21kX3N1Y2Nlc3MsIDApOwogfQogCisvKioKKyAqIGxwZmNfcmFtcF91cF9xdWV1ZV9oYW5kbGVyOiBXT1JLRVJfUkFNUF9VUF9RVUVVRSBldmVudCBoYW5kbGVyLgorICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvICBwcm9jZXNzIFdPUktFUl9SQU1QX1VQX1FVRVVFIGV2ZW50IGZvciB3b3JrZXIKKyAqIHRocmVhZC5UaGlzIHJvdXRpbmUgaW5jcmVhc2VzIHF1ZXVlIGRlcHRoIGZvciBhbGwgc2NzaSBkZXZpY2Ugb24gZWFjaCB2cG9ydAorICogYXNzb2NpYXRlZCB3aXRoIEBwaGJhIGJ5IDEuIFRoaXMgcm91dGluZSBhbHNvIHNldHMgQHBoYmEgbnVtX3JzcmNfZXJyIGFuZAorICogbnVtX2NtZF9zdWNjZXNzIHRvIHplcm8uCisgKiovCiB2b2lkCiBscGZjX3JhbXBfdXBfcXVldWVfaGFuZGxlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CkBAIC0zMzYsMTQgKzQzOCwyMSBAQAogCWxwZmNfZGVzdHJveV92cG9ydF93b3JrX2FycmF5KHBoYmEsIHZwb3J0cyk7CiB9CiAKLS8qCisvKioKKyAqIGxwZmNfbmV3X3Njc2lfYnVmOiBTY3NpIGJ1ZmZlciBhbGxvY2F0b3IuCisgKiBAdnBvcnQ6IFRoZSB2aXJ0dWFsIHBvcnQgZm9yIHdoaWNoIHRoaXMgY2FsbCBiZWluZyBleGVjdXRlZC4KKyAqCiAgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGEgc2NzaSBidWZmZXIsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5CiAgKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhdGUgYSBTQ1NJIEkvTy4gIFRoZSBub24tRE1BYWJsZSBidWZmZXIgcmVnaW9uCiAgKiBjb250YWlucyBpbmZvcm1hdGlvbiB0byBidWlsZCB0aGUgSU9DQi4gIFRoZSBETUFhYmxlIHJlZ2lvbiBjb250YWlucwotICogbWVtb3J5IGZvciB0aGUgRkNQIENNTkQsIEZDUCBSU1AsIGFuZCB0aGUgaW5pdGFsIEJQTC4gIEluIGFkZGl0aW9uIHRvCi0gKiBhbGxvY2F0aW5nIG1lbWVvcnksIHRoZSBGQ1AgQ01ORCBhbmQgRkNQIFJTUCBCREVzIGFyZSBzZXR1cCBpbiB0aGUgQlBMCisgKiBtZW1vcnkgZm9yIHRoZSBGQ1AgQ01ORCwgRkNQIFJTUCwgYW5kIHRoZSBpbml0aWFsIEJQTC4gIEluIGFkZGl0aW9uIHRvCisgKiBhbGxvY2F0aW5nIG1lbW9yeSwgdGhlIEZDUCBDTU5EIGFuZCBGQ1AgUlNQIEJERXMgYXJlIHNldHVwIGluIHRoZSBCUEwKICAqIGFuZCB0aGUgQlBMIEJERSBpcyBzZXR1cCBpbiB0aGUgSU9DQi4KLSAqLworICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgTlVMTCAtIEVycm9yCisgKiAgIFBvaW50ZXIgdG8gbHBmY19zY3NpX2J1ZiBkYXRhIHN0cnVjdHVyZSAtIFN1Y2Nlc3MKKyAqKi8KIHN0YXRpYyBzdHJ1Y3QgbHBmY19zY3NpX2J1ZiAqCiBscGZjX25ld19zY3NpX2J1ZihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQpCiB7CkBAIC00MDcsMTQgKzUxNiwxNCBAQAogCWJwbFswXS5hZGRyTG93ID0gbGUzMl90b19jcHUocHV0UGFkZHJMb3cocGRtYV9waHlzX2ZjcF9jbWQpKTsKIAlicGxbMF0udHVzLmYuYmRlU2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmNwX2NtbmQpOwogCWJwbFswXS50dXMuZi5iZGVGbGFncyA9IEJVRkZfVFlQRV9CREVfNjQ7Ci0JYnBsWzBdLnR1cy53ID0gbGUzMl90b19jcHUoYnBsLT50dXMudyk7CisJYnBsWzBdLnR1cy53ID0gbGUzMl90b19jcHUoYnBsWzBdLnR1cy53KTsKIAogCS8qIFNldHVwIHRoZSBwaHlzaWNhbCByZWdpb24gZm9yIHRoZSBGQ1AgUlNQICovCiAJYnBsWzFdLmFkZHJIaWdoID0gbGUzMl90b19jcHUocHV0UGFkZHJIaWdoKHBkbWFfcGh5c19mY3BfcnNwKSk7CiAJYnBsWzFdLmFkZHJMb3cgPSBsZTMyX3RvX2NwdShwdXRQYWRkckxvdyhwZG1hX3BoeXNfZmNwX3JzcCkpOwogCWJwbFsxXS50dXMuZi5iZGVTaXplID0gc2l6ZW9mKHN0cnVjdCBmY3BfcnNwKTsKIAlicGxbMV0udHVzLmYuYmRlRmxhZ3MgPSBCVUZGX1RZUEVfQkRFXzY0OwotCWJwbFsxXS50dXMudyA9IGxlMzJfdG9fY3B1KGJwbC0+dHVzLncpOworCWJwbFsxXS50dXMudyA9IGxlMzJfdG9fY3B1KGJwbFsxXS50dXMudyk7CiAKIAkvKgogCSAqIFNpbmNlIHRoZSBJT0NCIGZvciB0aGUgRkNQIEkvTyBpcyBidWlsdCBpbnRvIHRoaXMgbHBmY19zY3NpX2J1ZiwKQEAgLTQyMiw3ICs1MzEsOCBAQAogCSAqLwogCWlvY2IgPSAmcHNiLT5jdXJfaW9jYnEuaW9jYjsKIAlpb2NiLT51bi5mY3BpNjQuYmRsLnVscElvVGFnMzIgPSAwOwotCWlmIChwaGJhLT5zbGlfcmV2ID09IDMpIHsKKwlpZiAoKHBoYmEtPnNsaV9yZXYgPT0gMykgJiYKKwkgICAgIShwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfQkdfRU5BQkxFRCkpIHsKIAkJLyogZmlsbCBpbiBpbW1lZGlhdGUgZmNwIGNvbW1hbmQgQkRFICovCiAJCWlvY2ItPnVuLmZjcGk2NC5iZGwuYmRlRmxhZ3MgPSBCVUZGX1RZUEVfQkRFX0lNTUVEOwogCQlpb2NiLT51bi5mY3BpNjQuYmRsLmJkZVNpemUgPSBzaXplb2Yoc3RydWN0IGZjcF9jbW5kKTsKQEAgLTQ1Miw2ICs1NjIsMTcgQEAKIAlyZXR1cm4gcHNiOwogfQogCisvKioKKyAqIGxwZmNfZ2V0X3Njc2lfYnVmOiBHZXQgYSBzY3NpIGJ1ZmZlciBmcm9tIGxwZmNfc2NzaV9idWZfbGlzdCBsaXN0IG9mIEhiYS4KKyAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCisgKgorICogVGhpcyByb3V0aW5lIHJlbW92ZXMgYSBzY3NpIGJ1ZmZlciBmcm9tIGhlYWQgb2YgQHBoYmEgbHBmY19zY3NpX2J1Zl9saXN0IGxpc3QKKyAqIGFuZCByZXR1cm5zIHRvIGNhbGxlci4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIE5VTEwgLSBFcnJvcgorICogICBQb2ludGVyIHRvIGxwZmNfc2NzaV9idWYgLSBTdWNjZXNzCisgKiovCiBzdGF0aWMgc3RydWN0IGxwZmNfc2NzaV9idWYqCiBscGZjX2dldF9zY3NpX2J1ZihzdHJ1Y3QgbHBmY19oYmEgKiBwaGJhKQogewpAQCAtNDY0LDExICs1ODUsMjAgQEAKIAlpZiAobHBmY19jbWQpIHsKIAkJbHBmY19jbWQtPnNlZ19jbnQgPSAwOwogCQlscGZjX2NtZC0+bm9uc2dfcGh5cyA9IDA7CisJCWxwZmNfY21kLT5wcm90X3NlZ19jbnQgPSAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5zY3NpX2J1Zl9saXN0X2xvY2ssIGlmbGFnKTsKIAlyZXR1cm4gIGxwZmNfY21kOwogfQogCisvKioKKyAqIGxwZmNfcmVsZWFzZV9zY3NpX2J1ZjogUmV0dXJuIGEgc2NzaSBidWZmZXIgYmFjayB0byBoYmEgbHBmY19zY3NpX2J1Zl9saXN0IGxpc3QuCisgKiBAcGhiYTogVGhlIEhiYSBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgorICogQHBzYjogVGhlIHNjc2kgYnVmZmVyIHdoaWNoIGlzIGJlaW5nIHJlbGVhc2VkLgorICoKKyAqIFRoaXMgcm91dGluZSByZWxlYXNlcyBAcHNiIHNjc2kgYnVmZmVyIGJ5IGFkZGluZyBpdCB0byB0YWlsIG9mIEBwaGJhCisgKiBscGZjX3Njc2lfYnVmX2xpc3QgbGlzdC4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX3JlbGVhc2Vfc2NzaV9idWYoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19zY3NpX2J1ZiAqcHNiKQogewpAQCAtNDgwLDYgKzYxMCwyMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPnNjc2lfYnVmX2xpc3RfbG9jaywgaWZsYWcpOwogfQogCisvKioKKyAqIGxwZmNfc2NzaV9wcmVwX2RtYV9idWY6IFJvdXRpbmUgdG8gZG8gRE1BIG1hcHBpbmcgZm9yIHNjc2kgYnVmZmVyLgorICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqIEBscGZjX2NtZDogVGhlIHNjc2kgYnVmZmVyIHdoaWNoIGlzIGdvaW5nIHRvIGJlIG1hcHBlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgcGNpIGRtYSBtYXBwaW5nIGZvciBzY2F0dGVyLWdhdGhlciBsaXN0IG9mIHNjc2kgY21uZAorICogZmllbGQgb2YgQGxwZmNfY21kLiBUaGlzIHJvdXRpbmUgc2NhbnMgdGhyb3VnaCBzZyBlbGVtZW50cyBhbmQgZm9ybWF0IHRoZQorICogYmRlYS4gVGhpcyByb3V0aW5lIGFsc28gaW5pdGlhbGl6ZXMgYWxsIElPQ0IgZmllbGRzIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24KKyAqIHNjc2kgY29tbWFuZCByZXF1ZXN0IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIDEgLSBFcnJvcgorICogICAwIC0gU3VjY2VzcworICoqLwogc3RhdGljIGludAogbHBmY19zY3NpX3ByZXBfZG1hX2J1ZihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpscGZjX2NtZCkKIHsKQEAgLTUxNiw3ICs2NjAsNyBAQAogCQlscGZjX2NtZC0+c2VnX2NudCA9IG5zZWc7CiAJCWlmIChscGZjX2NtZC0+c2VnX2NudCA+IHBoYmEtPmNmZ19zZ19zZWdfY250KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUb28gbWFueSBzZyBzZWdtZW50cyBmcm9tICIKLQkJCSAgICAgICAiZG1hX21hcF9zZy4gIENvbmZpZyAlZCwgc2VnX2NudCAlZCIsCisJCQkgICAgICAgImRtYV9tYXBfc2cuICBDb25maWcgJWQsIHNlZ19jbnQgJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHBoYmEtPmNmZ19zZ19zZWdfY250LAogCQkJICAgICAgIGxwZmNfY21kLT5zZWdfY250KTsKIAkJCXNjc2lfZG1hX3VubWFwKHNjc2lfY21uZCk7CkBAIC01MzUsNiArNjc5LDcgQEAKIAkJc2NzaV9mb3JfZWFjaF9zZyhzY3NpX2NtbmQsIHNnZWwsIG5zZWcsIG51bV9iZGUpIHsKIAkJCXBoeXNhZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dlbCk7CiAJCQlpZiAocGhiYS0+c2xpX3JldiA9PSAzICYmCisJCQkgICAgIShwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfQkdfRU5BQkxFRCkgJiYKIAkJCSAgICBuc2VnIDw9IExQRkNfRVhUX0RBVEFfQkRFX0NPVU5UKSB7CiAJCQkJZGF0YV9iZGUtPnR1cy5mLmJkZUZsYWdzID0gQlVGRl9UWVBFX0JERV82NDsKIAkJCQlkYXRhX2JkZS0+dHVzLmYuYmRlU2l6ZSA9IHNnX2RtYV9sZW4oc2dlbCk7CkBAIC01NjAsNyArNzA1LDggQEAKIAkgKiBleHBsaWNpdGx5IHJlaW5pdGlhbGl6ZWQgYW5kIGZvciBTTEktMyB0aGUgZXh0ZW5kZWQgYmRlIGNvdW50IGlzCiAJICogZXhwbGljaXRseSByZWluaXRpYWxpemVkIHNpbmNlIGFsbCBpb2NiIG1lbW9yeSByZXNvdXJjZXMgYXJlIHJldXNlZC4KIAkgKi8KLQlpZiAocGhiYS0+c2xpX3JldiA9PSAzKSB7CisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gMyAmJgorCSAgICAhKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19CR19FTkFCTEVEKSkgewogCQlpZiAobnVtX2JkZSA+IExQRkNfRVhUX0RBVEFfQkRFX0NPVU5UKSB7CiAJCQkvKgogCQkJICogVGhlIGV4dGVuZGVkIElPQ0IgZm9ybWF0IGNhbiBvbmx5IGZpdCAzIEJERSBvciBhIEJQTC4KQEAgLTU4Nyw5ICs3MzMsNjg1IEBACiAJCQkoKG51bV9iZGUgKyAyKSAqIHNpemVvZihzdHJ1Y3QgdWxwX2JkZTY0KSk7CiAJfQogCWZjcF9jbW5kLT5mY3BEbCA9IGNwdV90b19iZTMyKHNjc2lfYnVmZmxlbihzY3NpX2NtbmQpKTsKKworCS8qCisJICogRHVlIHRvIGRpZmZlcmVuY2UgaW4gZGF0YSBsZW5ndGggYmV0d2VlbiBESUYvbm9uLURJRiBwYXRocywKKwkgKiB3ZSBuZWVkIHRvIHNldCB3b3JkIDQgb2YgSU9DQiBoZXJlCisJICovCisJaW9jYl9jbWQtPnVuLmZjcGkuZmNwaV9wYXJtID0gbGUzMl90b19jcHUoc2NzaV9idWZmbGVuKHNjc2lfY21uZCkpOwogCXJldHVybiAwOwogfQogCisvKgorICogR2l2ZW4gYSBzY3NpIGNtbmQsIGRldGVybWluZSB0aGUgQmxvY2tHdWFyZCBwcm9maWxlIHRvIGJlIHVzZWQKKyAqIHdpdGggdGhlIGNtZAorICovCitzdGF0aWMgaW50CitscGZjX3NjX3RvX3NsaV9wcm9mKHN0cnVjdCBzY3NpX2NtbmQgKnNjKQoreworCXVpbnQ4X3QgZ3VhcmRfdHlwZSA9IHNjc2lfaG9zdF9nZXRfZ3VhcmQoc2MtPmRldmljZS0+aG9zdCk7CisJdWludDhfdCByZXRfcHJvZiA9IExQRkNfUFJPRl9JTlZBTElEOworCisJaWYgKGd1YXJkX3R5cGUgPT0gU0hPU1RfRElYX0dVQVJEX0lQKSB7CisJCXN3aXRjaCAoc2NzaV9nZXRfcHJvdF9vcChzYykpIHsKKwkJY2FzZSBTQ1NJX1BST1RfUkVBRF9JTlNFUlQ6CisJCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1NUUklQOgorCQkJcmV0X3Byb2YgPSBMUEZDX1BST0ZfQVNUMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSV9QUk9UX1JFQURfU1RSSVA6CisJCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0lOU0VSVDoKKwkJCXJldF9wcm9mID0gTFBGQ19QUk9GX0ExOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1NJX1BST1RfUkVBRF9DT05WRVJUOgorCQljYXNlIFNDU0lfUFJPVF9XUklURV9DT05WRVJUOgorCQkJcmV0X3Byb2YgPSBMUEZDX1BST0ZfQVNUMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSV9QUk9UX1JFQURfUEFTUzoKKwkJY2FzZSBTQ1NJX1BST1RfV1JJVEVfUEFTUzoKKwkJY2FzZSBTQ1NJX1BST1RfTk9STUFMOgorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCisJCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpLCBndWFyZF90eXBlKTsKKwkJCWJyZWFrOworCisJCX0KKwl9IGVsc2UgaWYgKGd1YXJkX3R5cGUgPT0gU0hPU1RfRElYX0dVQVJEX0NSQykgeworCQlzd2l0Y2ggKHNjc2lfZ2V0X3Byb3Rfb3Aoc2MpKSB7CisJCWNhc2UgU0NTSV9QUk9UX1JFQURfU1RSSVA6CisJCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0lOU0VSVDoKKwkJCXJldF9wcm9mID0gTFBGQ19QUk9GX0ExOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1NJX1BST1RfUkVBRF9QQVNTOgorCQljYXNlIFNDU0lfUFJPVF9XUklURV9QQVNTOgorCQkJcmV0X3Byb2YgPSBMUEZDX1BST0ZfQzE7CisJCQlicmVhazsKKworCQljYXNlIFNDU0lfUFJPVF9SRUFEX0NPTlZFUlQ6CisJCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQ6CisJCWNhc2UgU0NTSV9QUk9UX1JFQURfSU5TRVJUOgorCQljYXNlIFNDU0lfUFJPVF9XUklURV9TVFJJUDoKKwkJY2FzZSBTQ1NJX1BST1RfTk9STUFMOgorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCisJCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpLCBndWFyZF90eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogdW5zdXBwb3J0ZWQgZm9ybWF0ICovCisJCUJVRygpOworCX0KKworCXJldHVybiByZXRfcHJvZjsKK30KKworc3RydWN0IHNjc2lfZGlmX3R1cGxlIHsKKwlfX2JlMTYgZ3VhcmRfdGFnOyAgICAgICAvKiBDaGVja3N1bSAqLworCV9fYmUxNiBhcHBfdGFnOyAgICAgICAgIC8qIE9wYXF1ZSBzdG9yYWdlICovCisJX19iZTMyIHJlZl90YWc7ICAgICAgICAgLyogVGFyZ2V0IExCQSBvciBpbmRpcmVjdCBMQkEgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2xwZmNfY21kX2Jsa3NpemUoc3RydWN0IHNjc2lfY21uZCAqc2MpCit7CisJcmV0dXJuIHNjLT5kZXZpY2UtPnNlY3Rvcl9zaXplOworfQorCisvKioKKyAqIGxwZmNfZ2V0X2NtZF9kaWZfcGFybXMgLSBFeHRyYWN0IERJRiBwYXJhbWV0ZXJzIGZyb20gU0NTSSBjb21tYW5kCisgKiBAc2M6ICAgICAgICAgICAgIGluOiBTQ1NJIGNvbW1hbmQKKyAqIEBhcHB0YWdtYXNrICAgICAgb3V0OiBhcHAgdGFnIG1hc2sKKyAqIEBhcHB0YWd2YWwgICAgICAgb3V0OiBhcHAgdGFnIHZhbHVlCisgKiBAcmVmdGFnICAgICAgICAgIG91dDogcmVmIHRhZyAocmVmZXJlbmNlIHRhZykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRXh0cmFjdCBESUYgcGFyYW10ZXJzIGZyb20gdGhlIGNvbW1hbmQgaWYgcG9zc2libGUuICBPdGhlcndpc2UsCisgKiAgIHVzZSBkZWZhdWx0IHBhcmF0bWVycy4KKyAqCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK2xwZmNfZ2V0X2NtZF9kaWZfcGFybXMoc3RydWN0IHNjc2lfY21uZCAqc2MsIHVpbnQxNl90ICphcHB0YWdtYXNrLAorCQl1aW50MTZfdCAqYXBwdGFndmFsLCB1aW50MzJfdCAqcmVmdGFnKQoreworCXN0cnVjdCAgc2NzaV9kaWZfdHVwbGUgKnNwdDsKKwl1bnNpZ25lZCBjaGFyIG9wID0gc2NzaV9nZXRfcHJvdF9vcChzYyk7CisJdW5zaWduZWQgaW50IHByb3RjbnQgPSBzY3NpX3Byb3Rfc2dfY291bnQoc2MpOworCXN0YXRpYyBpbnQgY250OworCisJaWYgKHByb3RjbnQgJiYgKG9wID09IFNDU0lfUFJPVF9XUklURV9TVFJJUCB8fAorCQkJCW9wID09IFNDU0lfUFJPVF9XUklURV9QQVNTIHx8CisJCQkJb3AgPT0gU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQpKSB7CisKKwkJY250Kys7CisJCXNwdCA9IHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNjc2lfcHJvdF9zZ2xpc3Qoc2MpKSkgKworCQkJc2NzaV9wcm90X3NnbGlzdChzYylbMF0ub2Zmc2V0OworCQkqYXBwdGFnbWFzayA9IDA7CisJCSphcHB0YWd2YWwgPSAwOworCQkqcmVmdGFnID0gY3B1X3RvX2JlMzIoc3B0LT5yZWZfdGFnKTsKKworCX0gZWxzZSB7CisJCS8qIFNCQyBkZWZpbmVzIHJlZiB0YWcgdG8gYmUgbG93ZXIgMzJiaXRzIG9mIExCQSAqLworCQkqcmVmdGFnID0gKHVpbnQzMl90KSAoMHhmZmZmZmZmZiAmIHNjc2lfZ2V0X2xiYShzYykpOworCQkqYXBwdGFnbWFzayA9IDA7CisJCSphcHB0YWd2YWwgPSAwOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBidWZmZXIgbGlzdCBmb3IgcHJvdGVjdGlvbiBncm91cHMgb2YKKyAqIHR5cGUgTFBGQ19QR19UWVBFX05PX0RJRgorICoKKyAqIFRoaXMgaXMgdXN1YWxseSB1c2VkIHdoZW4gdGhlIEhCQSBpcyBpbnN0cnVjdGVkIHRvIGdlbmVyYXRlCisgKiBESUZzIGFuZCBpbnNlcnQgdGhlbSBpbnRvIGRhdGEgc3RyZWFtIChvciBzdHJpcCBESUYgZnJvbQorICogaW5jb21pbmcgZGF0YSBzdHJlYW0pCisgKgorICogVGhlIGJ1ZmZlciBsaXN0IGNvbnNpc3RzIG9mIGp1c3Qgb25lIHByb3RlY3Rpb24gZ3JvdXAgZGVzY3JpYmVkCisgKiBiZWxvdzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgc3RhcnQgb2YgcHJvdCBncm91cCAgLS0+ICAgICB8ICAgICAgICAgIFBERV8xICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgRGF0YSBCREUgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8bW9yZSBEYXRhIEJERSdzIC4uLiAob3B0KXwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBAc2M6IHBvaW50ZXIgdG8gc2NzaSBjb21tYW5kIHdlJ3JlIHdvcmtpbmcgb24KKyAqIEBicGw6IHBvaW50ZXIgdG8gYnVmZmVyIGxpc3QgZm9yIHByb3RlY3Rpb24gZ3JvdXBzCisgKiBAZGF0YWNudDogbnVtYmVyIG9mIHNlZ21lbnRzIG9mIGRhdGEgdGhhdCBoYXZlIGJlZW4gZG1hIG1hcHBlZAorICoKKyAqIE5vdGU6IERhdGEgcy9nIGJ1ZmZlcnMgaGF2ZSBiZWVuIGRtYSBtYXBwZWQKKyAqLworc3RhdGljIGludAorbHBmY19iZ19zZXR1cF9icGwoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzYywKKwkJc3RydWN0IHVscF9iZGU2NCAqYnBsLCBpbnQgZGF0YXNlZ2NudCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZGUgPSBOVUxMOyAvKiBzL2cgZGF0YSBlbnRyeSAqLworCXN0cnVjdCBscGZjX3BkZSAqcGRlMSA9IE5VTEw7CisJZG1hX2FkZHJfdCBwaHlzYWRkcjsKKwlpbnQgaSA9IDAsIG51bV9iZGUgPSAwOworCWludCBkYXRhZGlyID0gc2MtPnNjX2RhdGFfZGlyZWN0aW9uOworCWludCBwcm9mID0gTFBGQ19QUk9GX0lOVkFMSUQ7CisJdW5zaWduZWQgYmxrc2l6ZTsKKwl1aW50MzJfdCByZWZ0YWc7CisJdWludDE2X3QgYXBwdGFnbWFzaywgYXBwdGFndmFsOworCisJcGRlMSA9IChzdHJ1Y3QgbHBmY19wZGUgKikgYnBsOworCXByb2YgPSBscGZjX3NjX3RvX3NsaV9wcm9mKHNjKTsKKworCWlmIChwcm9mID09IExQRkNfUFJPRl9JTlZBTElEKQorCQlnb3RvIG91dDsKKworCS8qIGV4dHJhY3Qgc29tZSBpbmZvIGZyb20gdGhlIHNjc2kgY29tbWFuZCBmb3IgUERFMSovCisJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2MpOworCWxwZmNfZ2V0X2NtZF9kaWZfcGFybXMoc2MsICZhcHB0YWdtYXNrLCAmYXBwdGFndmFsLCAmcmVmdGFnKTsKKworCS8qIHNldHVwIFBERTEgd2l0aCB3aGF0IHdlIGhhdmUgKi8KKwlscGZjX3BkZV9zZXRfYmdfcGFybXMocGRlMSwgTFBGQ19QREUxX0RFU0NSSVBUT1IsIHByb2YsIGJsa3NpemUsCisJCQlCR19FQ19TVE9QX0VSUik7CisJbHBmY19wZGVfc2V0X2RpZl9wYXJtcyhwZGUxLCBhcHB0YWdtYXNrLCBhcHB0YWd2YWwsIHJlZnRhZyk7CisKKwludW1fYmRlKys7CisJYnBsKys7CisKKwkvKiBhc3N1bXB0aW9uOiBjYWxsZXIgaGFzIGFscmVhZHkgcnVuIGRtYV9tYXBfc2cgb24gY29tbWFuZCBkYXRhICovCisJc2NzaV9mb3JfZWFjaF9zZyhzYywgc2dkZSwgZGF0YXNlZ2NudCwgaSkgeworCQlwaHlzYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnZGUpOworCQlicGwtPmFkZHJMb3cgPSBsZTMyX3RvX2NwdShwdXRQYWRkckxvdyhwaHlzYWRkcikpOworCQlicGwtPmFkZHJIaWdoID0gbGUzMl90b19jcHUocHV0UGFkZHJIaWdoKHBoeXNhZGRyKSk7CisJCWJwbC0+dHVzLmYuYmRlU2l6ZSA9IHNnX2RtYV9sZW4oc2dkZSk7CisJCWlmIChkYXRhZGlyID09IERNQV9UT19ERVZJQ0UpCisJCQlicGwtPnR1cy5mLmJkZUZsYWdzID0gQlVGRl9UWVBFX0JERV82NDsKKwkJZWxzZQorCQkJYnBsLT50dXMuZi5iZGVGbGFncyA9IEJVRkZfVFlQRV9CREVfNjRJOworCQlicGwtPnR1cy53ID0gbGUzMl90b19jcHUoYnBsLT50dXMudyk7CisJCWJwbCsrOworCQludW1fYmRlKys7CisJfQorCitvdXQ6CisJcmV0dXJuIG51bV9iZGU7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYnVmZmVyIGxpc3QgZm9yIHByb3RlY3Rpb24gZ3JvdXBzIG9mCisgKiB0eXBlIExQRkNfUEdfVFlQRV9ESUZfQlVGCisgKgorICogVGhpcyBpcyB1c3VhbGx5IHVzZWQgd2hlbiBESUZzIGFyZSBpbiB0aGVpciBvd24gYnVmZmVycywKKyAqIHNlcGFyYXRlIGZyb20gdGhlIGRhdGEuIFRoZSBIQkEgY2FuIHRoZW4gYnkgaW5zdHJ1Y3RlZAorICogdG8gcGxhY2UgdGhlIERJRnMgaW4gdGhlIG91dGdvaW5nIHN0cmVhbS4gIEZvciByZWFkIG9wZXJhdGlvbnMsCisgKiBUaGUgSEJBIGNvdWxkIGV4dHJhY3QgdGhlIERJRnMgYW5kIHBsYWNlIGl0IGluIERJRiBidWZmZXJzLgorICoKKyAqIFRoZSBidWZmZXIgbGlzdCBmb3IgdGhpcyB0eXBlIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIG9mIHRoZQorICogcHJvdGVjdGlvbiBncm91cHMgZGVzY3JpYmVkIGJlbG93OgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgc3RhcnQgb2YgZmlyc3QgcHJvdCBncm91cCAgLS0+ICAgfCAgICAgICAgICBQREVfMSAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgUERFXzMgKFByb3QgQkRFKSAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIERhdGEgQkRFICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfG1vcmUgRGF0YSBCREUncyAuLi4gKG9wdCl8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICBzdGFydCBvZiBuZXcgIHByb3QgZ3JvdXAgIC0tPiAgICB8ICAgICAgICAgIFBERV8xICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgLi4uICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBAc2M6IHBvaW50ZXIgdG8gc2NzaSBjb21tYW5kIHdlJ3JlIHdvcmtpbmcgb24KKyAqIEBicGw6IHBvaW50ZXIgdG8gYnVmZmVyIGxpc3QgZm9yIHByb3RlY3Rpb24gZ3JvdXBzCisgKiBAZGF0YWNudDogbnVtYmVyIG9mIHNlZ21lbnRzIG9mIGRhdGEgdGhhdCBoYXZlIGJlZW4gZG1hIG1hcHBlZAorICogQHByb3RjbnQ6IG51bWJlciBvZiBzZWdtZW50IG9mIHByb3RlY3Rpb24gZGF0YSB0aGF0IGhhdmUgYmVlbiBkbWEgbWFwcGVkCisgKgorICogTm90ZTogSXQgaXMgYXNzdW1lZCB0aGF0IGJvdGggZGF0YSBhbmQgcHJvdGVjdGlvbiBzL2cgYnVmZmVycyBoYXZlIGJlZW4KKyAqICAgICAgIG1hcHBlZCBmb3IgRE1BCisgKi8KK3N0YXRpYyBpbnQKK2xwZmNfYmdfc2V0dXBfYnBsX3Byb3Qoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzYywKKwkJc3RydWN0IHVscF9iZGU2NCAqYnBsLCBpbnQgZGF0YWNudCwgaW50IHByb3RjbnQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2RlID0gTlVMTDsgLyogcy9nIGRhdGEgZW50cnkgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncGUgPSBOVUxMOyAvKiBzL2cgcHJvdCBlbnRyeSAqLworCXN0cnVjdCBscGZjX3BkZSAqcGRlMSA9IE5VTEw7CisJc3RydWN0IHVscF9iZGU2NCAqcHJvdF9iZGUgPSBOVUxMOworCWRtYV9hZGRyX3QgZGF0YXBoeXNhZGRyLCBwcm90cGh5c2FkZHI7CisJdW5zaWduZWQgc2hvcnQgY3Vycl9kYXRhID0gMCwgY3Vycl9wcm90ID0gMDsKKwl1bnNpZ25lZCBpbnQgc3BsaXRfb2Zmc2V0LCBwcm90Z3JvdXBfbGVuOworCXVuc2lnbmVkIGludCBwcm90Z3JwX2Jsa3MsIHByb3RncnBfYnl0ZXM7CisJdW5zaWduZWQgaW50IHJlbWFpbmRlciwgc3VidG90YWw7CisJaW50IHByb2YgPSBMUEZDX1BST0ZfSU5WQUxJRDsKKwlpbnQgZGF0YWRpciA9IHNjLT5zY19kYXRhX2RpcmVjdGlvbjsKKwl1bnNpZ25lZCBjaGFyIHBnZG9uZSA9IDAsIGFsbGRvbmUgPSAwOworCXVuc2lnbmVkIGJsa3NpemU7CisJdWludDMyX3QgcmVmdGFnOworCXVpbnQxNl90IGFwcHRhZ21hc2ssIGFwcHRhZ3ZhbDsKKwlpbnQgbnVtX2JkZSA9IDA7CisKKwlzZ3BlID0gc2NzaV9wcm90X3NnbGlzdChzYyk7CisJc2dkZSA9IHNjc2lfc2dsaXN0KHNjKTsKKworCWlmICghc2dwZSB8fCAhc2dkZSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19GQ1AsCisJCQkJIjkwMjAgSW52YWxpZCBzL2cgZW50cnk6IGRhdGE9MHglcCBwcm90PTB4JXBcbiIsCisJCQkJc2dwZSwgc2dkZSk7CisJCXJldHVybiAwOworCX0KKworCXByb2YgPSBscGZjX3NjX3RvX3NsaV9wcm9mKHNjKTsKKwlpZiAocHJvZiA9PSBMUEZDX1BST0ZfSU5WQUxJRCkKKwkJZ290byBvdXQ7CisKKwkvKiBleHRyYWN0IHNvbWUgaW5mbyBmcm9tIHRoZSBzY3NpIGNvbW1hbmQgZm9yIFBERTEqLworCWJsa3NpemUgPSBscGZjX2NtZF9ibGtzaXplKHNjKTsKKwlscGZjX2dldF9jbWRfZGlmX3Bhcm1zKHNjLCAmYXBwdGFnbWFzaywgJmFwcHRhZ3ZhbCwgJnJlZnRhZyk7CisKKwlzcGxpdF9vZmZzZXQgPSAwOworCWRvIHsKKwkJLyogc2V0dXAgdGhlIGZpcnN0IFBERV8xICovCisJCXBkZTEgPSAoc3RydWN0IGxwZmNfcGRlICopIGJwbDsKKworCQlscGZjX3BkZV9zZXRfYmdfcGFybXMocGRlMSwgTFBGQ19QREUxX0RFU0NSSVBUT1IsIHByb2YsIGJsa3NpemUsCisJCQkJQkdfRUNfU1RPUF9FUlIpOworCQlscGZjX3BkZV9zZXRfZGlmX3Bhcm1zKHBkZTEsIGFwcHRhZ21hc2ssIGFwcHRhZ3ZhbCwgcmVmdGFnKTsKKworCQludW1fYmRlKys7CisJCWJwbCsrOworCisJCS8qIHNldHVwIHRoZSBmaXJzdCBCREUgdGhhdCBwb2ludHMgdG8gcHJvdGVjdGlvbiBidWZmZXIgKi8KKwkJcHJvdF9iZGUgPSAoc3RydWN0IHVscF9iZGU2NCAqKSBicGw7CisJCXByb3RwaHlzYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNncGUpOworCQlwcm90X2JkZS0+YWRkckxvdyA9IGxlMzJfdG9fY3B1KHB1dFBhZGRyTG93KHByb3RwaHlzYWRkcikpOworCQlwcm90X2JkZS0+YWRkckhpZ2ggPSBsZTMyX3RvX2NwdShwdXRQYWRkckhpZ2gocHJvdHBoeXNhZGRyKSk7CisJCXByb3Rncm91cF9sZW4gPSBzZ19kbWFfbGVuKHNncGUpOworCisKKwkJLyogbXVzdCBiZSBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoZSBESUYgYmxvY2sgbGVuZ3RoICovCisJCUJVR19PTihwcm90Z3JvdXBfbGVuICUgOCk7CisKKwkJcHJvdGdycF9ibGtzID0gcHJvdGdyb3VwX2xlbiAvIDg7CisJCXByb3RncnBfYnl0ZXMgPSBwcm90Z3JwX2Jsa3MgKiBibGtzaXplOworCisJCXByb3RfYmRlLT50dXMuZi5iZGVTaXplID0gcHJvdGdyb3VwX2xlbjsKKwkJaWYgKGRhdGFkaXIgPT0gRE1BX1RPX0RFVklDRSkKKwkJCXByb3RfYmRlLT50dXMuZi5iZGVGbGFncyA9IEJVRkZfVFlQRV9CREVfNjQ7CisJCWVsc2UKKwkJCXByb3RfYmRlLT50dXMuZi5iZGVGbGFncyA9IEJVRkZfVFlQRV9CREVfNjRJOworCQlwcm90X2JkZS0+dHVzLncgPSBsZTMyX3RvX2NwdShicGwtPnR1cy53KTsKKworCQljdXJyX3Byb3QrKzsKKwkJbnVtX2JkZSsrOworCisJCS8qIHNldHVwIEJERSdzIGZvciBkYXRhIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggRElGIGRhdGEgKi8KKwkJcGdkb25lID0gMDsKKwkJc3VidG90YWwgPSAwOyAvKiB0b3RhbCBieXRlcyBwcm9jZXNzZWQgZm9yIGN1cnJlbnQgcHJvdCBncnAgKi8KKwkJd2hpbGUgKCFwZ2RvbmUpIHsKKwkJCWlmICghc2dkZSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgSW52YWxpZCBkYXRhIHNlZ21lbnRcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicGwrKzsKKwkJCWRhdGFwaHlzYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnZGUpICsgc3BsaXRfb2Zmc2V0OworCQkJYnBsLT5hZGRyTG93ID0gbGUzMl90b19jcHUocHV0UGFkZHJMb3coZGF0YXBoeXNhZGRyKSk7CisJCQlicGwtPmFkZHJIaWdoID0gbGUzMl90b19jcHUocHV0UGFkZHJIaWdoKGRhdGFwaHlzYWRkcikpOworCisJCQlyZW1haW5kZXIgPSBzZ19kbWFfbGVuKHNnZGUpIC0gc3BsaXRfb2Zmc2V0OworCisJCQlpZiAoKHN1YnRvdGFsICsgcmVtYWluZGVyKSA8PSBwcm90Z3JwX2J5dGVzKSB7CisJCQkJLyogd2UgY2FuIHVzZSB0aGlzIHdob2xlIGJ1ZmZlciAqLworCQkJCWJwbC0+dHVzLmYuYmRlU2l6ZSA9IHJlbWFpbmRlcjsKKwkJCQlzcGxpdF9vZmZzZXQgPSAwOworCisJCQkJaWYgKChzdWJ0b3RhbCArIHJlbWFpbmRlcikgPT0gcHJvdGdycF9ieXRlcykKKwkJCQkJcGdkb25lID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbXVzdCBzcGxpdCB0aGlzIGJ1ZmZlciB3aXRoIG5leHQgcHJvdCBncnAgKi8KKwkJCQlicGwtPnR1cy5mLmJkZVNpemUgPSBwcm90Z3JwX2J5dGVzIC0gc3VidG90YWw7CisJCQkJc3BsaXRfb2Zmc2V0ICs9IGJwbC0+dHVzLmYuYmRlU2l6ZTsKKwkJCX0KKworCQkJc3VidG90YWwgKz0gYnBsLT50dXMuZi5iZGVTaXplOworCisJCQlpZiAoZGF0YWRpciA9PSBETUFfVE9fREVWSUNFKQorCQkJCWJwbC0+dHVzLmYuYmRlRmxhZ3MgPSBCVUZGX1RZUEVfQkRFXzY0OworCQkJZWxzZQorCQkJCWJwbC0+dHVzLmYuYmRlRmxhZ3MgPSBCVUZGX1RZUEVfQkRFXzY0STsKKwkJCWJwbC0+dHVzLncgPSBsZTMyX3RvX2NwdShicGwtPnR1cy53KTsKKworCQkJbnVtX2JkZSsrOworCQkJY3Vycl9kYXRhKys7CisKKwkJCWlmIChzcGxpdF9vZmZzZXQpCisJCQkJYnJlYWs7CisKKwkJCS8qIE1vdmUgdG8gdGhlIG5leHQgcy9nIHNlZ21lbnQgaWYgcG9zc2libGUgKi8KKwkJCXNnZGUgPSBzZ19uZXh0KHNnZGUpOworCQl9CisKKwkJLyogYXJlIHdlIGRvbmUgPyAqLworCQlpZiAoY3Vycl9wcm90ID09IHByb3RjbnQpIHsKKwkJCWFsbGRvbmUgPSAxOworCQl9IGVsc2UgaWYgKGN1cnJfcHJvdCA8IHByb3RjbnQpIHsKKwkJCS8qIGFkdmFuY2UgdG8gbmV4dCBwcm90IGJ1ZmZlciAqLworCQkJc2dwZSA9IHNnX25leHQoc2dwZSk7CisJCQlicGwrKzsKKworCQkJLyogdXBkYXRlIHRoZSByZWZlcmVuY2UgdGFnICovCisJCQlyZWZ0YWcgKz0gcHJvdGdycF9ibGtzOworCQl9IGVsc2UgeworCQkJLyogaWYgd2UncmUgaGVyZSwgd2UgaGF2ZSBhIGJ1ZyAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQ6IGJ1ZyBpbiAlc1xuIiwgX19mdW5jX18pOworCQl9CisKKwl9IHdoaWxlICghYWxsZG9uZSk7CisKK291dDoKKworCisJcmV0dXJuIG51bV9iZGU7Cit9CisvKgorICogR2l2ZW4gYSBTQ1NJIGNvbW1hbmQgdGhhdCBzdXBwb3J0cyBESUYsIGRldGVybWluZSBjb21wb3NpdGlvbiBvZiBwcm90ZWN0aW9uCisgKiBncm91cHMgaW52b2x2ZWQgaW4gc2V0dGluZyB1cCBidWZmZXIgbGlzdHMKKyAqCisgKiBSZXR1cm5zOgorICoJCQkgICAgICBmb3IgRElGIChmb3IgYm90aCByZWFkIGFuZCB3cml0ZSkKKyAqICovCitzdGF0aWMgaW50CitscGZjX3Byb3RfZ3JvdXBfdHlwZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBzY3NpX2NtbmQgKnNjKQoreworCWludCByZXQgPSBMUEZDX1BHX1RZUEVfSU5WQUxJRDsKKwl1bnNpZ25lZCBjaGFyIG9wID0gc2NzaV9nZXRfcHJvdF9vcChzYyk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBTQ1NJX1BST1RfUkVBRF9TVFJJUDoKKwljYXNlIFNDU0lfUFJPVF9XUklURV9JTlNFUlQ6CisJCXJldCA9IExQRkNfUEdfVFlQRV9OT19ESUY7CisJCWJyZWFrOworCWNhc2UgU0NTSV9QUk9UX1JFQURfSU5TRVJUOgorCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1NUUklQOgorCWNhc2UgU0NTSV9QUk9UX1JFQURfUEFTUzoKKwljYXNlIFNDU0lfUFJPVF9XUklURV9QQVNTOgorCWNhc2UgU0NTSV9QUk9UX1dSSVRFX0NPTlZFUlQ6CisJY2FzZSBTQ1NJX1BST1RfUkVBRF9DT05WRVJUOgorCQlyZXQgPSBMUEZDX1BHX1RZUEVfRElGX0JVRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRkNQLAorCQkJCSI5MDIxIFVuc3VwcG9ydGVkIHByb3RlY3Rpb24gb3A6JWRcbiIsIG9wKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHByb3RlY3Rpb24vRElGIGF3YXJlIHZlcnNpb24gb2YKKyAqIGxwZmNfc2NzaV9wcmVwX2RtYV9idWYoKS4gSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNvbWJpbmUgdGhlCisgKiB0d28gZnVuY3Rpb25zIGV2ZW50dWFsbHksIGJ1dCBmb3Igbm93LCBpdCdzIGhlcmUKKyAqLworc3RhdGljIGludAorbHBmY19iZ19zY3NpX3ByZXBfZG1hX2J1ZihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCXN0cnVjdCBscGZjX3Njc2lfYnVmICpscGZjX2NtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtbmQgPSBscGZjX2NtZC0+cENtZDsKKwlzdHJ1Y3QgZmNwX2NtbmQgKmZjcF9jbW5kID0gbHBmY19jbWQtPmZjcF9jbW5kOworCXN0cnVjdCB1bHBfYmRlNjQgKmJwbCA9IGxwZmNfY21kLT5mY3BfYnBsOworCUlPQ0JfdCAqaW9jYl9jbWQgPSAmbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiOworCXVpbnQzMl90IG51bV9iZGUgPSAwOworCWludCBkYXRhc2VnY250LCBwcm90c2VnY250LCBkYXRhZGlyID0gc2NzaV9jbW5kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwlpbnQgcHJvdF9ncm91cF90eXBlID0gMDsKKwlpbnQgZGlmbGVuLCBmY3BkbDsKKwl1bnNpZ25lZCBibGtzaXplOworCisJLyoKKwkgKiBTdGFydCB0aGUgbHBmYyBjb21tYW5kIHByZXAgYnkgYnVtcGluZyB0aGUgYnBsIGJleW9uZCBmY3BfY21uZAorCSAqICBmY3BfcnNwIHJlZ2lvbnMgdG8gdGhlIGZpcnN0IGRhdGEgYmRlIGVudHJ5CisJICovCisJYnBsICs9IDI7CisJaWYgKHNjc2lfc2dfY291bnQoc2NzaV9jbW5kKSkgeworCQkvKgorCQkgKiBUaGUgZHJpdmVyIHN0b3JlcyB0aGUgc2VnbWVudCBjb3VudCByZXR1cm5lZCBmcm9tIHBjaV9tYXBfc2cKKwkJICogYmVjYXVzZSB0aGlzIGEgY291bnQgb2YgZG1hLW1hcHBpbmdzIHVzZWQgdG8gbWFwIHRoZSB1c2Vfc2cKKwkJICogcGFnZXMuICBUaGV5IGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBmb3IgdGhvc2UKKwkJICogYXJjaGl0ZWN0dXJlcyB0aGF0IGltcGxlbWVudCBhbiBJT01NVS4KKwkJICovCisJCWRhdGFzZWdjbnQgPSBkbWFfbWFwX3NnKCZwaGJhLT5wY2lkZXYtPmRldiwKKwkJCQkJc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSwKKwkJCQkJc2NzaV9zZ19jb3VudChzY3NpX2NtbmQpLCBkYXRhZGlyKTsKKwkJaWYgKHVubGlrZWx5KCFkYXRhc2VnY250KSkKKwkJCXJldHVybiAxOworCisJCWxwZmNfY21kLT5zZWdfY250ID0gZGF0YXNlZ2NudDsKKwkJaWYgKGxwZmNfY21kLT5zZWdfY250ID4gcGhiYS0+Y2ZnX3NnX3NlZ19jbnQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtYW55IHNnIHNlZ21lbnRzIGZyb20gIgorCQkJCQkiZG1hX21hcF9zZy4gIENvbmZpZyAlZCwgc2VnX2NudCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHBoYmEtPmNmZ19zZ19zZWdfY250LAorCQkJCQlscGZjX2NtZC0+c2VnX2NudCk7CisJCQlzY3NpX2RtYV91bm1hcChzY3NpX2NtbmQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlwcm90X2dyb3VwX3R5cGUgPSBscGZjX3Byb3RfZ3JvdXBfdHlwZShwaGJhLCBzY3NpX2NtbmQpOworCisJCXN3aXRjaCAocHJvdF9ncm91cF90eXBlKSB7CisJCWNhc2UgTFBGQ19QR19UWVBFX05PX0RJRjoKKwkJCW51bV9iZGUgPSBscGZjX2JnX3NldHVwX2JwbChwaGJhLCBzY3NpX2NtbmQsIGJwbCwKKwkJCQkJZGF0YXNlZ2NudCk7CisJCQkvKiB3ZSBzaG91ZCBoYXZlIDIgb3IgbW9yZSBlbnRyaWVzIGluIGJ1ZmZlciBsaXN0ICovCisJCQlpZiAobnVtX2JkZSA8IDIpCisJCQkJZ290byBlcnI7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX1BHX1RZUEVfRElGX0JVRjp7CisJCQkvKgorCQkJICogVGhpcyB0eXBlIGluZGljYXRlcyB0aGF0IHByb3RlY3Rpb24gYnVmZmVycyBhcmUKKwkJCSAqIHBhc3NlZCB0byB0aGUgZHJpdmVyLCBzbyB0aGF0IG5lZWRzIHRvIGJlIHByZXBhcmVkCisJCQkgKiBmb3IgRE1BCisJCQkgKi8KKwkJCXByb3RzZWdjbnQgPSBkbWFfbWFwX3NnKCZwaGJhLT5wY2lkZXYtPmRldiwKKwkJCQkJc2NzaV9wcm90X3NnbGlzdChzY3NpX2NtbmQpLAorCQkJCQlzY3NpX3Byb3Rfc2dfY291bnQoc2NzaV9jbW5kKSwgZGF0YWRpcik7CisJCQlpZiAodW5saWtlbHkoIXByb3RzZWdjbnQpKSB7CisJCQkJc2NzaV9kbWFfdW5tYXAoc2NzaV9jbW5kKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJbHBmY19jbWQtPnByb3Rfc2VnX2NudCA9IHByb3RzZWdjbnQ7CisJCQlpZiAobHBmY19jbWQtPnByb3Rfc2VnX2NudAorCQkJICAgID4gcGhiYS0+Y2ZnX3Byb3Rfc2dfc2VnX2NudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtYW55IHByb3Qgc2cgc2VnbWVudHMgIgorCQkJCQkJImZyb20gZG1hX21hcF9zZy4gIENvbmZpZyAlZCwiCisJCQkJCQkicHJvdF9zZWdfY250ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCXBoYmEtPmNmZ19wcm90X3NnX3NlZ19jbnQsCisJCQkJCQlscGZjX2NtZC0+cHJvdF9zZWdfY250KTsKKwkJCQlkbWFfdW5tYXBfc2coJnBoYmEtPnBjaWRldi0+ZGV2LAorCQkJCQkgICAgIHNjc2lfcHJvdF9zZ2xpc3Qoc2NzaV9jbW5kKSwKKwkJCQkJICAgICBzY3NpX3Byb3Rfc2dfY291bnQoc2NzaV9jbW5kKSwKKwkJCQkJICAgICBkYXRhZGlyKTsKKwkJCQlzY3NpX2RtYV91bm1hcChzY3NpX2NtbmQpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQludW1fYmRlID0gbHBmY19iZ19zZXR1cF9icGxfcHJvdChwaGJhLCBzY3NpX2NtbmQsIGJwbCwKKwkJCQkJZGF0YXNlZ2NudCwgcHJvdHNlZ2NudCk7CisJCQkvKiB3ZSBzaG91ZCBoYXZlIDMgb3IgbW9yZSBlbnRyaWVzIGluIGJ1ZmZlciBsaXN0ICovCisJCQlpZiAobnVtX2JkZSA8IDMpCisJCQkJZ290byBlcnI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIExQRkNfUEdfVFlQRV9JTlZBTElEOgorCQlkZWZhdWx0OgorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRkNQLAorCQkJCQkiOTAyMiBVbmV4cGVjdGVkIHByb3RlY3Rpb24gZ3JvdXAgJWlcbiIsCisJCQkJCXByb3RfZ3JvdXBfdHlwZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogRmluaXNoIGluaXRpYWxpemluZyB0aG9zZSBJT0NCIGZpZWxkcyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gdGhlCisJICogc2NzaV9jbW5kIHJlcXVlc3RfYnVmZmVyLiAgTm90ZSB0aGF0IHRoZSBiZGVTaXplIGlzIGV4cGxpY2l0bHkKKwkgKiByZWluaXRpYWxpemVkIHNpbmNlIGFsbCBpb2NiIG1lbW9yeSByZXNvdXJjZXMgYXJlIHVzZWQgbWFueSB0aW1lcworCSAqIGZvciB0cmFuc21pdCwgcmVjZWl2ZSwgYW5kIGNvbnRpbnVhdGlvbiBicGwncy4KKwkgKi8KKwlpb2NiX2NtZC0+dW4uZmNwaTY0LmJkbC5iZGVTaXplID0gKDIgKiBzaXplb2Yoc3RydWN0IHVscF9iZGU2NCkpOworCWlvY2JfY21kLT51bi5mY3BpNjQuYmRsLmJkZVNpemUgKz0gKG51bV9iZGUgKiBzaXplb2Yoc3RydWN0IHVscF9iZGU2NCkpOworCWlvY2JfY21kLT51bHBCZGVDb3VudCA9IDE7CisJaW9jYl9jbWQtPnVscExlID0gMTsKKworCWZjcGRsID0gc2NzaV9idWZmbGVuKHNjc2lfY21uZCk7CisKKwlpZiAoc2NzaV9nZXRfcHJvdF90eXBlKHNjc2lfY21uZCkgPT0gU0NTSV9QUk9UX0RJRl9UWVBFMSkgeworCQkvKgorCQkgKiBXZSBhcmUgaW4gRElGIFR5cGUgMSBtb2RlCisJCSAqIEV2ZXJ5IGRhdGEgYmxvY2sgaGFzIGEgOCBieXRlIERJRiAodHJhaWxlcikKKwkJICogYXR0YWNoZWQgdG8gaXQuICBNdXN0IGFqdXN0IEZDUCBkYXRhIGxlbmd0aAorCQkgKi8KKwkJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2NzaV9jbW5kKTsKKwkJZGlmbGVuID0gKGZjcGRsIC8gYmxrc2l6ZSkgKiA4OworCQlmY3BkbCArPSBkaWZsZW47CisJfQorCWZjcF9jbW5kLT5mY3BEbCA9IGJlMzJfdG9fY3B1KGZjcGRsKTsKKworCS8qCisJICogRHVlIHRvIGRpZmZlcmVuY2UgaW4gZGF0YSBsZW5ndGggYmV0d2VlbiBESUYvbm9uLURJRiBwYXRocywKKwkgKiB3ZSBuZWVkIHRvIHNldCB3b3JkIDQgb2YgSU9DQiBoZXJlCisJICovCisJaW9jYl9jbWQtPnVuLmZjcGkuZmNwaV9wYXJtID0gZmNwZGw7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19GQ1AsCisJCQkiOTAyMyBDb3VsZCBub3Qgc2V0dXAgYWxsIG5lZWRlZCBCREUncyIKKwkJCSJwcm90X2dyb3VwX3R5cGU9JWQsIG51bV9iZGU9JWRcbiIsCisJCQlwcm90X2dyb3VwX3R5cGUsIG51bV9iZGUpOworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIEJsb2NrR3VhcmQgZXJyb3JzIGRldGVjdGVkIGJ5CisgKiB0aGUgSEJBLiAgSW4gY2FzZSBvZiBlcnJvcnMsIHRoZSBBU0MvQVNDUSBmaWVsZHMgaW4gdGhlCisgKiBzZW5zZSBidWZmZXIgd2lsbCBiZSBzZXQgYWNjb3JkaW5nbHksIHBhaXJlZCB3aXRoCisgKiBJTExFR0FMX1JFUVVFU1QgdG8gc2lnbmFsIHRvIHRoZSBrZXJuZWwgdGhhdCB0aGUgSEJBCisgKiBkZXRlY3RlZCBjb3JydXB0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIE5vIGVycm9yIGZvdW5kCisgKiAgMSAtIEJsb2NrR3VhcmQgZXJyb3IgZm91bmQKKyAqIC0xIC0gSW50ZXJuYWwgZXJyb3IgKGJhZCBwcm9maWxlLCAuLi5ldGMpCisgKi8KK3N0YXRpYyBpbnQKK2xwZmNfcGFyc2VfYmdfZXJyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kLAorCQkJc3RydWN0IGxwZmNfaW9jYnEgKnBJb2NiT3V0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGxwZmNfY21kLT5wQ21kOworCXN0cnVjdCBzbGkzX2JnX2ZpZWxkcyAqYmdmID0gJnBJb2NiT3V0LT5pb2NiLnVuc2xpMy5zbGkzX2JnOworCWludCByZXQgPSAwOworCXVpbnQzMl90IGJnaG0gPSBiZ2YtPmJnaG07CisJdWludDMyX3QgYmdzdGF0ID0gYmdmLT5iZ3N0YXQ7CisJdWludDY0X3QgZmFpbGluZ19zZWN0b3IgPSAwOworCisJcHJpbnRrKEtFUk5fRVJSICJCRyBFUlJPUiBpbiBjbWQgMHgleCBsYmEgMHglbGx4IGJsayBjbnQgMHglbHggIgorCQkJImJnc3RhdD0weCV4IGJnaG09MHgleFxuIiwKKwkJCWNtZC0+Y21uZFswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2dldF9sYmEoY21kKSwKKwkJCWNtZC0+cmVxdWVzdC0+bnJfc2VjdG9ycywgYmdzdGF0LCBiZ2htKTsKKworCXNwaW5fbG9jaygmX2R1bXBfYnVmX2xvY2spOworCWlmICghX2R1bXBfYnVmX2RvbmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTYXZpbmcgRGF0YSBmb3IgJXUgYmxvY2tzIHRvIGRlYnVnZnNcbiIsCisJCQkJKGNtZC0+Y21uZFs3XSA8PCA4IHwgY21kLT5jbW5kWzhdKSk7CisJCWxwZmNfZGVidWdfc2F2ZV9kYXRhKGNtZCk7CisKKwkJLyogSWYgd2UgaGF2ZSBhIHByb3Qgc2dsLCBzYXZlIHRoZSBESUYgYnVmZmVyICovCisJCWlmIChscGZjX3Byb3RfZ3JvdXBfdHlwZShwaGJhLCBjbWQpID09CisJCQkJTFBGQ19QR19UWVBFX0RJRl9CVUYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU2F2aW5nIERJRiBmb3IgJXUgYmxvY2tzIHRvIGRlYnVnZnNcbiIsCisJCQkJCShjbWQtPmNtbmRbN10gPDwgOCB8IGNtZC0+Y21uZFs4XSkpOworCQkJbHBmY19kZWJ1Z19zYXZlX2RpZihjbWQpOworCQl9CisKKwkJX2R1bXBfYnVmX2RvbmUgPSAxOworCX0KKwlzcGluX3VubG9jaygmX2R1bXBfYnVmX2xvY2spOworCisJaWYgKGxwZmNfYmdzX2dldF9pbnZhbGlkX3Byb2YoYmdzdGF0KSkgeworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0VSUk9SLCAwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEJsb2NrR3VhcmQgcHJvZmlsZS4gYmdzdGF0OjB4JXhcbiIsCisJCQkJYmdzdGF0KTsKKwkJcmV0ID0gKC0xKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxwZmNfYmdzX2dldF91bmluaXRfZGlmX2Jsb2NrKGJnc3RhdCkpIHsKKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9FUlJPUiwgMCk7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBCbG9ja0d1YXJkIERJRiBCbG9jay4gYmdzdGF0OjB4JXhcbiIsCisJCQkJYmdzdGF0KTsKKwkJcmV0ID0gKC0xKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxwZmNfYmdzX2dldF9ndWFyZF9lcnIoYmdzdGF0KSkgeworCQlyZXQgPSAxOworCisJCXNjc2lfYnVpbGRfc2Vuc2VfYnVmZmVyKDEsIGNtZC0+c2Vuc2VfYnVmZmVyLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJMHgxMCwgMHgxKTsKKwkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFfFNVR0dFU1RfRElFKSA8PCAyNAorCQkJfCBTY3NpUmVzdWx0KERJRF9BQk9SVCwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKTsKKwkJcGhiYS0+YmdfZ3VhcmRfZXJyX2NudCsrOworCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRDogZ3VhcmRfdGFnIGVycm9yXG4iKTsKKwl9CisKKwlpZiAobHBmY19iZ3NfZ2V0X3JlZnRhZ19lcnIoYmdzdGF0KSkgeworCQlyZXQgPSAxOworCisJCXNjc2lfYnVpbGRfc2Vuc2VfYnVmZmVyKDEsIGNtZC0+c2Vuc2VfYnVmZmVyLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJMHgxMCwgMHgzKTsKKwkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFfFNVR0dFU1RfRElFKSA8PCAyNAorCQkJfCBTY3NpUmVzdWx0KERJRF9BQk9SVCwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKTsKKworCQlwaGJhLT5iZ19yZWZ0YWdfZXJyX2NudCsrOworCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRDogcmVmX3RhZyBlcnJvclxuIik7CisJfQorCisJaWYgKGxwZmNfYmdzX2dldF9hcHB0YWdfZXJyKGJnc3RhdCkpIHsKKwkJcmV0ID0gMTsKKworCQlzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcigxLCBjbWQtPnNlbnNlX2J1ZmZlciwgSUxMRUdBTF9SRVFVRVNULAorCQkJCTB4MTAsIDB4Mik7CisJCWNtZC0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRXxTVUdHRVNUX0RJRSkgPDwgMjQKKwkJCXwgU2NzaVJlc3VsdChESURfQUJPUlQsIFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTik7CisKKwkJcGhiYS0+YmdfYXBwdGFnX2Vycl9jbnQrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTEtHUkQ6IGFwcF90YWcgZXJyb3JcbiIpOworCX0KKworCWlmIChscGZjX2Jnc19nZXRfaGlfd2F0ZXJfbWFya19wcmVzZW50KGJnc3RhdCkpIHsKKwkJLyoKKwkJICogc2V0dXAgc2Vuc2UgZGF0YSBkZXNjcmlwdG9yIDAgcGVyIFNQQy00IGFzIGFuIGluZm9ybWF0aW9uCisJCSAqIGZpZWxkLCBhbmQgcHV0IHRoZSBmYWlsaW5nIExCQSBpbiBpdAorCQkgKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbOF0gPSAwOyAgICAgLyogSW5mb3JtYXRpb24gKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbOV0gPSAweGE7ICAgLyogQWRkLiBsZW5ndGggKi8KKwkJZG9fZGl2KGJnaG0sIGNtZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSk7CisKKwkJZmFpbGluZ19zZWN0b3IgPSBzY3NpX2dldF9sYmEoY21kKTsKKwkJZmFpbGluZ19zZWN0b3IgKz0gYmdobTsKKworCQlwdXRfdW5hbGlnbmVkX2JlNjQoZmFpbGluZ19zZWN0b3IsICZjbWQtPnNlbnNlX2J1ZmZlclsxMF0pOworCX0KKworCWlmICghcmV0KSB7CisJCS8qIE5vIGVycm9yIHdhcyByZXBvcnRlZCAtIHByb2JsZW0gaW4gRlc/ICovCisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfRVJST1IsIDApOworCQlwcmludGsoS0VSTl9FUlIgIkJMS0dSRDogbm8gZXJyb3JzIHJlcG9ydGVkIVxuIik7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBscGZjX3NlbmRfc2NzaV9lcnJvcl9ldmVudDogUG9zdHMgYW4gZXZlbnQgd2hlbiB0aGVyZSBpcyBTQ1NJIGVycm9yLgogICogQHBoYmE6IFBvaW50ZXIgdG8gaGJhIGNvbnRleHQgb2JqZWN0LgpAQCAtNjgxLDYgKzE1MDMsMTUgQEAKIAlscGZjX3dvcmtlcl93YWtlX3VwKHBoYmEpOwogCXJldHVybjsKIH0KKworLyoqCisgKiBscGZjX3Njc2lfdW5wcmVwX2RtYV9idWY6IFJvdXRpbmUgdG8gdW4tbWFwIERNQSBtYXBwaW5nIG9mIHNjYXR0ZXIgZ2F0aGVyLgorICogQHBoYmE6IFRoZSBIYmEgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqIEBwc2I6IFRoZSBzY3NpIGJ1ZmZlciB3aGljaCBpcyBnb2luZyB0byBiZSB1bi1tYXBwZWQuCisgKgorICogVGhpcyByb3V0aW5lIGRvZXMgRE1BIHVuLW1hcHBpbmcgb2Ygc2NhdHRlciBnYXRoZXIgbGlzdCBvZiBzY3NpIGNvbW1hbmQKKyAqIGZpZWxkIG9mIEBscGZjX2NtZC4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX3Njc2lfdW5wcmVwX2RtYV9idWYoc3RydWN0IGxwZmNfaGJhICogcGhiYSwgc3RydWN0IGxwZmNfc2NzaV9idWYgKiBwc2IpCiB7CkBAIC02OTIsOCArMTUyMywyMiBAQAogCSAqLwogCWlmIChwc2ItPnNlZ19jbnQgPiAwKQogCQlzY3NpX2RtYV91bm1hcChwc2ItPnBDbWQpOworCWlmIChwc2ItPnByb3Rfc2VnX2NudCA+IDApCisJCWRtYV91bm1hcF9zZygmcGhiYS0+cGNpZGV2LT5kZXYsIHNjc2lfcHJvdF9zZ2xpc3QocHNiLT5wQ21kKSwKKwkJCQlzY3NpX3Byb3Rfc2dfY291bnQocHNiLT5wQ21kKSwKKwkJCQlwc2ItPnBDbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKIH0KIAorLyoqCisgKiBscGZjX2hhbmRsZXJfZmNwX2VycjogRkNQIHJlc3BvbnNlIGhhbmRsZXIuCisgKiBAdnBvcnQ6IFRoZSB2aXJ0dWFsIHBvcnQgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqIEBscGZjX2NtZDogUG9pbnRlciB0byBscGZjX3Njc2lfYnVmIGRhdGEgc3RydWN0dXJlLgorICogQHJzcF9pb2NiOiBUaGUgcmVzcG9uc2UgSU9DQiB3aGljaCBjb250YWlucyBGQ1AgZXJyb3IuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwcm9jZXNzIHJlc3BvbnNlIElPQ0Igd2l0aCBzdGF0dXMgZmllbGQKKyAqIElPU1RBVF9GQ1BfUlNQX0VSUk9SLiBUaGlzIHJvdXRpbmUgc2V0cyByZXN1bHQgZmllbGQgb2Ygc2NzaSBjb21tYW5kCisgKiBiYXNlZCB1cG9uIFNDU0kgYW5kIEZDUCBlcnJvci4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX2hhbmRsZV9mY3BfZXJyKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kLAogCQkgICAgc3RydWN0IGxwZmNfaW9jYnEgKnJzcF9pb2NiKQpAQCAtNzM1LDcgKzE1ODAsNyBAQAogCQlsb2dpdCA9IExPR19GQ1A7CiAKIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIGxvZ2l0LAotCQkJICIwNzMwIEZDUCBjb21tYW5kIHgleCBmYWlsZWQ6IHgleCBTTlMgeCV4IHgleCAiCisJCQkgIjkwMjQgRkNQIGNvbW1hbmQgeCV4IGZhaWxlZDogeCV4IFNOUyB4JXggeCV4ICIKIAkJCSAiRGF0YTogeCV4IHgleCB4JXggeCV4IHgleFxuIiwKIAkJCSBjbW5kLT5jbW5kWzBdLCBzY3NpX3N0YXR1cywKIAkJCSBiZTMyX3RvX2NwdSgqbHApLCBiZTMyX3RvX2NwdSgqKGxwICsgMykpLCByZXNwX2luZm8sCkBAIC03NTgsNyArMTYwMyw3IEBACiAJCXNjc2lfc2V0X3Jlc2lkKGNtbmQsIGJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpKTsKIAogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1AsCi0JCQkJICIwNzE2IEZDUCBSZWFkIFVuZGVycnVuLCBleHBlY3RlZCAlZCwgIgorCQkJCSAiOTAyNSBGQ1AgUmVhZCBVbmRlcnJ1biwgZXhwZWN0ZWQgJWQsICIKIAkJCQkgInJlc2lkdWFsICVkIERhdGE6IHgleCB4JXggeCV4XG4iLAogCQkJCSBiZTMyX3RvX2NwdShmY3BjbWQtPmZjcERsKSwKIAkJCQkgc2NzaV9nZXRfcmVzaWQoY21uZCksIGZjcGlfcGFybSwgY21uZC0+Y21uZFswXSwKQEAgLTc3NCw3ICsxNjE5LDcgQEAKIAkJCShzY3NpX2dldF9yZXNpZChjbW5kKSAhPSBmY3BpX3Bhcm0pKSB7CiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsCiAJCQkJCSBMT0dfRkNQIHwgTE9HX0ZDUF9FUlJPUiwKLQkJCQkJICIwNzM1IEZDUCBSZWFkIENoZWNrIEVycm9yICIKKwkJCQkJICI5MDI2IEZDUCBSZWFkIENoZWNrIEVycm9yICIKIAkJCQkJICJhbmQgVW5kZXJydW4gRGF0YTogeCV4IHgleCB4JXggeCV4XG4iLAogCQkJCQkgYmUzMl90b19jcHUoZmNwY21kLT5mY3BEbCksCiAJCQkJCSBzY3NpX2dldF9yZXNpZChjbW5kKSwgZmNwaV9wYXJtLApAQCAtNzkzLDcgKzE2MzgsNyBAQAogCQkgICAgKHNjc2lfYnVmZmxlbihjbW5kKSAtIHNjc2lfZ2V0X3Jlc2lkKGNtbmQpCiAJCSAgICAgPCBjbW5kLT51bmRlcmZsb3cpKSB7CiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1AsCi0JCQkJCSAiMDcxNyBGQ1AgY29tbWFuZCB4JXggcmVzaWR1YWwgIgorCQkJCQkgIjkwMjcgRkNQIGNvbW1hbmQgeCV4IHJlc2lkdWFsICIKIAkJCQkJICJ1bmRlcnJ1biBjb252ZXJ0ZWQgdG8gZXJyb3IgIgogCQkJCQkgIkRhdGE6IHgleCB4JXggeCV4XG4iLAogCQkJCQkgY21uZC0+Y21uZFswXSwgc2NzaV9idWZmbGVuKGNtbmQpLApAQCAtODAyLDcgKzE2NDcsNyBAQAogCQl9CiAJfSBlbHNlIGlmIChyZXNwX2luZm8gJiBSRVNJRF9PVkVSKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0ZDUCwKLQkJCQkgIjA3MjAgRkNQIGNvbW1hbmQgeCV4IHJlc2lkdWFsIG92ZXJydW4gZXJyb3IuICIKKwkJCQkgIjkwMjggRkNQIGNvbW1hbmQgeCV4IHJlc2lkdWFsIG92ZXJydW4gZXJyb3IuICIKIAkJCQkgIkRhdGE6IHgleCB4JXggXG4iLCBjbW5kLT5jbW5kWzBdLAogCQkJCSBzY3NpX2J1ZmZsZW4oY21uZCksIHNjc2lfZ2V0X3Jlc2lkKGNtbmQpKTsKIAkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CkBAIC04MTQsNyArMTY1OSw3IEBACiAJfSBlbHNlIGlmICgoc2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfR09PRCkgJiYgZmNwaV9wYXJtICYmCiAJCQkoY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19GQ1AgfCBMT0dfRkNQX0VSUk9SLAotCQkJCSAiMDczNCBGQ1AgUmVhZCBDaGVjayBFcnJvciBEYXRhOiAiCisJCQkJICI5MDI5IEZDUCBSZWFkIENoZWNrIEVycm9yIERhdGE6ICIKIAkJCQkgIngleCB4JXggeCV4IHgleFxuIiwKIAkJCQkgYmUzMl90b19jcHUoZmNwY21kLT5mY3BEbCksCiAJCQkJIGJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpLApAQCAtODI4LDYgKzE2NzMsMTYgQEAKIAlscGZjX3NlbmRfc2NzaV9lcnJvcl9ldmVudCh2cG9ydC0+cGhiYSwgdnBvcnQsIGxwZmNfY21kLCByc3BfaW9jYik7CiB9CiAKKy8qKgorICogbHBmY19zY3NpX2NtZF9pb2NiX2NtcGw6IFNjc2kgY21uZCBJT0NCIGNvbXBsZXRpb24gcm91dGluZS4KKyAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCisgKiBAcElvY2JJbjogVGhlIGNvbW1hbmQgSU9DQlEgZm9yIHRoZSBzY3NpIGNtbmQuCisgKiBAcElvY2JPdXQ6IFRoZSByZXNwb25zZSBJT0NCUSBmb3IgdGhlIHNjc2kgY21uZCAuCisgKgorICogVGhpcyByb3V0aW5lIGFzc2lnbnMgc2NzaSBjb21tYW5kIHJlc3VsdCBieSBsb29raW5nIGludG8gcmVzcG9uc2UgSU9DQgorICogc3RhdHVzIGZpZWxkIGFwcHJvcHJpYXRlbHkuIFRoaXMgcm91dGluZSBoYW5kbGVzIFFVRVVFIEZVTEwgY29uZGl0aW9uIGFzCisgKiB3ZWxsIGJ5IHJhbXBpbmcgZG93biBkZXZpY2UgcXVldWUgZGVwdGguCisgKiovCiBzdGF0aWMgdm9pZAogbHBmY19zY3NpX2NtZF9pb2NiX2NtcGwoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19pb2NicSAqcElvY2JJbiwKIAkJCXN0cnVjdCBscGZjX2lvY2JxICpwSW9jYk91dCkKQEAgLTg0Niw3ICsxNzAxLDggQEAKIAogCWxwZmNfY21kLT5yZXN1bHQgPSBwSW9jYk91dC0+aW9jYi51bi51bHBXb3JkWzRdOwogCWxwZmNfY21kLT5zdGF0dXMgPSBwSW9jYk91dC0+aW9jYi51bHBTdGF0dXM7Ci0JYXRvbWljX2RlYygmcG5vZGUtPmNtZF9wZW5kaW5nKTsKKwlpZiAocG5vZGUgJiYgTkxQX0NIS19OT0RFX0FDVChwbm9kZSkpCisJCWF0b21pY19kZWMoJnBub2RlLT5jbWRfcGVuZGluZyk7CiAKIAlpZiAobHBmY19jbWQtPnN0YXR1cykgewogCQlpZiAobHBmY19jbWQtPnN0YXR1cyA9PSBJT1NUQVRfTE9DQUxfUkVKRUNUICYmCkBAIC04NTYsNyArMTcxMiw3IEBACiAJCQlscGZjX2NtZC0+c3RhdHVzID0gSU9TVEFUX0RFRkFVTFQ7CiAKIAkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQLAotCQkJCSAiMDcyOSBGQ1AgY21kIHgleCBmYWlsZWQgPCVkLyVkPiAiCisJCQkJICI5MDMwIEZDUCBjbWQgeCV4IGZhaWxlZCA8JWQvJWQ+ICIKIAkJCQkgInN0YXR1czogeCV4IHJlc3VsdDogeCV4IERhdGE6IHgleCB4JXhcbiIsCiAJCQkJIGNtZC0+Y21uZFswXSwKIAkJCQkgY21kLT5kZXZpY2UgPyBjbWQtPmRldmljZS0+aWQgOiAweGZmZmYsCkBAIC05MDQsNyArMTc2MCwyOCBAQAogCQkJICAgIGxwZmNfY21kLT5yZXN1bHQgPT0gSU9FUlJfQUJPUlRfUkVRVUVTVEVEKSB7CiAJCQkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9SRVFVRVVFLCAwKTsKIAkJCQlicmVhazsKLQkJCX0gLyogZWxzZTogZmFsbCB0aHJvdWdoICovCisJCQl9CisKKwkJCWlmICgobHBmY19jbWQtPnJlc3VsdCA9PSBJT0VSUl9SWF9ETUFfRkFJTEVEIHx8CisJCQkgICAgIGxwZmNfY21kLT5yZXN1bHQgPT0gSU9FUlJfVFhfRE1BX0ZBSUxFRCkgJiYKKwkJCSAgICAgcElvY2JPdXQtPmlvY2IudW5zbGkzLnNsaTNfYmcuYmdzdGF0KSB7CisJCQkJaWYgKHNjc2lfZ2V0X3Byb3Rfb3AoY21kKSAhPSBTQ1NJX1BST1RfTk9STUFMKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoaXMgaXMgYSByZXNwb25zZSBmb3IgYSBCRyBlbmFibGVkCisJCQkJCSAqIGNtZC4gUGFyc2UgQkcgZXJyb3IKKwkJCQkJICovCisJCQkJCWxwZmNfcGFyc2VfYmdfZXJyKHBoYmEsIGxwZmNfY21kLAorCQkJCQkJCXBJb2NiT3V0KTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLAorCQkJCQkJCUxPR19CRywKKwkJCQkJCQkiOTAzMSBub24temVybyBCR1NUQVQgIgorCQkJCQkJCSJvbiB1bnByb3RlY3RlZCBjbWQiKTsKKwkJCQl9CisJCQl9CisKKwkJLyogZWxzZTogZmFsbCB0aHJvdWdoICovCiAJCWRlZmF1bHQ6CiAJCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0VSUk9SLCAwKTsKIAkJCWJyZWFrOwpAQCAtOTM2LDIzICsxODEzLDMxIEBACiAJICAgdGltZV9hZnRlcihqaWZmaWVzLCBscGZjX2NtZC0+c3RhcnRfdGltZSArCiAJCW1zZWNzX3RvX2ppZmZpZXModnBvcnQtPmNmZ19tYXhfc2NzaWNtcGxfdGltZSkpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKHNkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlpZiAoKHBub2RlLT5jbWRfcWRlcHRoID4gYXRvbWljX3JlYWQoJnBub2RlLT5jbWRfcGVuZGluZykgJiYKLQkJICAgIChhdG9taWNfcmVhZCgmcG5vZGUtPmNtZF9wZW5kaW5nKSA+IExQRkNfTUlOX1RHVF9RREVQVEgpICYmCi0JCSAgICAoKGNtZC0+Y21uZFswXSA9PSBSRUFEXzEwKSB8fCAoY21kLT5jbW5kWzBdID09IFdSSVRFXzEwKSkpKQotCQkJcG5vZGUtPmNtZF9xZGVwdGggPSBhdG9taWNfcmVhZCgmcG5vZGUtPmNtZF9wZW5kaW5nKTsKKwkJaWYgKHBub2RlICYmIE5MUF9DSEtfTk9ERV9BQ1QocG5vZGUpKSB7CisJCQlpZiAocG5vZGUtPmNtZF9xZGVwdGggPgorCQkJCWF0b21pY19yZWFkKCZwbm9kZS0+Y21kX3BlbmRpbmcpICYmCisJCQkJKGF0b21pY19yZWFkKCZwbm9kZS0+Y21kX3BlbmRpbmcpID4KKwkJCQlMUEZDX01JTl9UR1RfUURFUFRIKSAmJgorCQkJCSgoY21kLT5jbW5kWzBdID09IFJFQURfMTApIHx8CisJCQkJKGNtZC0+Y21uZFswXSA9PSBXUklURV8xMCkpKQorCQkJCXBub2RlLT5jbWRfcWRlcHRoID0KKwkJCQkJYXRvbWljX3JlYWQoJnBub2RlLT5jbWRfcGVuZGluZyk7CiAKLQkJcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgPSBqaWZmaWVzOworCQkJcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgPSBqaWZmaWVzOworCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIGlmICgocG5vZGUtPmNtZF9xZGVwdGggPCBMUEZDX01BWF9UR1RfUURFUFRIKSAmJgorCX0gZWxzZSBpZiAocG5vZGUgJiYgTkxQX0NIS19OT0RFX0FDVChwbm9kZSkpIHsKKwkJaWYgKChwbm9kZS0+Y21kX3FkZXB0aCA8IExQRkNfTUFYX1RHVF9RREVQVEgpICYmCiAJCSAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgKwotCQkJbXNlY3NfdG9famlmZmllcyhMUEZDX1RHVFFfSU5URVJWQUwpKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZShzZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJcG5vZGUtPmNtZF9xZGVwdGggKz0gcG5vZGUtPmNtZF9xZGVwdGggKgotCQkJTFBGQ19UR1RRX1JBTVBVUF9QQ0VOVCAvIDEwMDsKLQkJaWYgKHBub2RlLT5jbWRfcWRlcHRoID4gTFBGQ19NQVhfVEdUX1FERVBUSCkKLQkJCXBub2RlLT5jbWRfcWRlcHRoID0gTFBGQ19NQVhfVEdUX1FERVBUSDsKLQkJcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgPSBqaWZmaWVzOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNkZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhMUEZDX1RHVFFfSU5URVJWQUwpKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlwbm9kZS0+Y21kX3FkZXB0aCArPSBwbm9kZS0+Y21kX3FkZXB0aCAqCisJCQkJTFBGQ19UR1RRX1JBTVBVUF9QQ0VOVCAvIDEwMDsKKwkJCWlmIChwbm9kZS0+Y21kX3FkZXB0aCA+IExQRkNfTUFYX1RHVF9RREVQVEgpCisJCQkJcG5vZGUtPmNtZF9xZGVwdGggPSBMUEZDX01BWF9UR1RfUURFUFRIOworCQkJcG5vZGUtPmxhc3RfY2hhbmdlX3RpbWUgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJfQogCX0KIAogCWxwZmNfc2NzaV91bnByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CkBAIC0xMDY3LDYgKzE5NTIsMTUgQEAKIAl9CiB9CiAKKy8qKgorICogbHBmY19zY3NpX3ByZXBfY21uZDogIFJvdXRpbmUgdG8gY29udmVydCBzY3NpIGNtbmQgdG8gRkNQIGluZm9ybWF0aW9uIHVuaXQuCisgKiBAdnBvcnQ6IFRoZSB2aXJ0dWFsIHBvcnQgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqIEBscGZjX2NtZDogVGhlIHNjc2kgY29tbWFuZCB3aGljaCBuZWVkcyB0byBzZW5kLgorICogQHBub2RlOiBQb2ludGVyIHRvIGxwZmNfbm9kZWxpc3QuCisgKgorICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGZjcF9jbW5kIGFuZCBpb2NiIGRhdGEgc3RydWN0dXJlIGZyb20gc2NzaSBjb21tYW5kCisgKiB0byB0cmFuc2Zlci4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX3Njc2lfcHJlcF9jbW5kKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kLAogCQkgICAgc3RydWN0IGxwZmNfbm9kZWxpc3QgKnBub2RlKQpAQCAtMTEyMiw3ICsyMDE2LDYgQEAKIAkJfSBlbHNlIHsKIAkJCWlvY2JfY21kLT51bHBDb21tYW5kID0gQ01EX0ZDUF9JUkVBRDY0X0NSOwogCQkJaW9jYl9jbWQtPnVscFBVID0gUEFSTV9SRUFEX0NIRUNLOwotCQkJaW9jYl9jbWQtPnVuLmZjcGkuZmNwaV9wYXJtID0gc2NzaV9idWZmbGVuKHNjc2lfY21uZCk7CiAJCQlmY3BfY21uZC0+ZmNwQ250bDMgPSBSRUFEX0RBVEE7CiAJCQlwaGJhLT5mYzRJbnB1dFJlcXVlc3RzKys7CiAJCX0KQEAgLTExMzMsNyArMjAyNiw4IEBACiAJCWZjcF9jbW5kLT5mY3BDbnRsMyA9IDA7CiAJCXBoYmEtPmZjNENvbnRyb2xSZXF1ZXN0cysrOwogCX0KLQlpZiAocGhiYS0+c2xpX3JldiA9PSAzKQorCWlmIChwaGJhLT5zbGlfcmV2ID09IDMgJiYKKwkgICAgIShwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfQkdfRU5BQkxFRCkpCiAJCWxwZmNfZmNwY21kX3RvX2lvY2IoaW9jYl9jbWQtPnVuc2xpMy5mY3BfZXh0LmljZCwgZmNwX2NtbmQpOwogCS8qCiAJICogRmluaXNoIGluaXRpYWxpemluZyB0aG9zZSBJT0NCIGZpZWxkcyB0aGF0IGFyZSBpbmRlcGVuZGVudApAQCAtMTE1Miw2ICsyMDQ2LDE5IEBACiAJcGlvY2JxLT52cG9ydCA9IHZwb3J0OwogfQogCisvKioKKyAqIGxwZmNfc2NzaV9wcmVwX3Rhc2tfbWdtdF9jbW5kOiBDb252ZXJ0IHNjc2kgVE0gY21uZCB0byBGQ1AgaW5mb3JtYXRpb24gdW5pdC4KKyAqIEB2cG9ydDogVGhlIHZpcnR1YWwgcG9ydCBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgorICogQGxwZmNfY21kOiBQb2ludGVyIHRvIGxwZmNfc2NzaV9idWYgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAbHVuOiBMb2dpY2FsIHVuaXQgbnVtYmVyLgorICogQHRhc2tfbWdtdF9jbWQ6IFNDU0kgdGFzayBtYW5hZ2VtZW50IGNvbW1hbmQuCisgKgorICogVGhpcyByb3V0aW5lIGNyZWF0ZXMgRkNQIGluZm9ybWF0aW9uIHVuaXQgY29ycmVzcG9uZGluZyB0byBAdGFza19tZ210X2NtZC4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIDAgLSBFcnJvcgorICogICAxIC0gU3VjY2VzcworICoqLwogc3RhdGljIGludAogbHBmY19zY3NpX3ByZXBfdGFza19tZ210X2NtZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgIHN0cnVjdCBscGZjX3Njc2lfYnVmICpscGZjX2NtZCwKQEAgLTExNzgsNyArMjA4NSw4IEBACiAJbWVtc2V0KGZjcF9jbW5kLCAwLCBzaXplb2Yoc3RydWN0IGZjcF9jbW5kKSk7CiAJaW50X3RvX3Njc2lsdW4obHVuLCAmZmNwX2NtbmQtPmZjcF9sdW4pOwogCWZjcF9jbW5kLT5mY3BDbnRsMiA9IHRhc2tfbWdtdF9jbWQ7Ci0JaWYgKHZwb3J0LT5waGJhLT5zbGlfcmV2ID09IDMpCisJaWYgKHZwb3J0LT5waGJhLT5zbGlfcmV2ID09IDMgJiYKKwkgICAgISh2cG9ydC0+cGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX0JHX0VOQUJMRUQpKQogCQlscGZjX2ZjcGNtZF90b19pb2NiKHBpb2NiLT51bnNsaTMuZmNwX2V4dC5pY2QsIGZjcF9jbW5kKTsKIAlwaW9jYi0+dWxwQ29tbWFuZCA9IENNRF9GQ1BfSUNNTkQ2NF9DUjsKIAlwaW9jYi0+dWxwQ29udGV4dCA9IG5kbHAtPm5scF9ycGk7CkBAIC0xMjAxLDYgKzIxMDksMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyoqCisgKiBscGNfdGFza21nbXRfZGVmX2NtcGw6IElPQ0IgY29tcGxldGlvbiByb3V0aW5lIGZvciB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZC4KKyAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCisgKiBAY21kaW9jYnE6IFBvaW50ZXIgdG8gbHBmY19pb2NicSBkYXRhIHN0cnVjdHVyZS4KKyAqIEByc3Bpb2NicTogUG9pbnRlciB0byBscGZjX2lvY2JxIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBJT0NCIGNvbXBsZXRpb24gcm91dGluZSBmb3IgZGV2aWNlIHJlc2V0IGFuZCB0YXJnZXQgcmVzZXQKKyAqIHJvdXRpbmUuIFRoaXMgcm91dGluZSByZWxlYXNlIHNjc2kgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBscGZjX2NtZC4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX3Rza21nbXRfZGVmX2NtcGwoc3RydWN0IGxwZmNfaGJhICpwaGJhLAogCQkJc3RydWN0IGxwZmNfaW9jYnEgKmNtZGlvY2JxLApAQCAtMTIxMyw2ICsyMTMwLDIwIEBACiAJcmV0dXJuOwogfQogCisvKioKKyAqIGxwZmNfc2NzaV90Z3RfcmVzZXQ6IFRhcmdldCByZXNldCBoYW5kbGVyLgorICogQGxwZmNfY21kOiBQb2ludGVyIHRvIGxwZmNfc2NzaV9idWYgZGF0YSBzdHJ1Y3R1cmUKKyAqIEB2cG9ydDogVGhlIHZpcnR1YWwgcG9ydCBmb3Igd2hpY2ggdGhpcyBjYWxsIGlzIGJlaW5nIGV4ZWN1dGVkLgorICogQHRndF9pZDogVGFyZ2V0IElELgorICogQGx1bjogTHVuIG51bWJlci4KKyAqIEByZGF0YTogUG9pbnRlciB0byBscGZjX3Jwb3J0X2RhdGEuCisgKgorICogVGhpcyByb3V0aW5lIGlzc3VlcyBhIFRBUkdFVCBSRVNFVCBpb2NiIHRvIHJlc2V0IGEgdGFyZ2V0IHdpdGggQHRndF9pZCBJRC4KKyAqCisgKiBSZXR1cm4gQ29kZToKKyAqICAgMHgyMDAzIC0gRXJyb3IKKyAqICAgMHgyMDAyIC0gU3VjY2Vzcy4KKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfc2NzaV90Z3RfcmVzZXQoc3RydWN0IGxwZmNfc2NzaV9idWYgKmxwZmNfY21kLCBzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCSAgICB1bnNpZ25lZCAgdGd0X2lkLCB1bnNpZ25lZCBpbnQgbHVuLApAQCAtMTI2Niw2ICsyMTk3LDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBscGZjX2luZm86IEluZm8gZW50cnkgcG9pbnQgb2Ygc2NzaV9ob3N0X3RlbXBsYXRlIGRhdGEgc3RydWN0dXJlLgorICogQGhvc3Q6IFRoZSBzY3NpIGhvc3QgZm9yIHdoaWNoIHRoaXMgY2FsbCBpcyBiZWluZyBleGVjdXRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcHJvdmlkZXMgbW9kdWxlIGluZm9ybWF0aW9uIGFib3V0IGhiYS4KKyAqCisgKiBSZXV0cm4gY29kZToKKyAqICAgUG9pbnRlciB0byBjaGFyIC0gU3VjY2Vzcy4KKyAqKi8KIGNvbnN0IGNoYXIgKgogbHBmY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCiB7CkBAIC0xMjk1LDYgKzIyMzUsMTMgQEAKIAlyZXR1cm4gbHBmY2luZm9idWY7CiB9CiAKKy8qKgorICogbHBmY19wb2xsX3JlYXJtX3RpbWU6IFJvdXRpbmUgdG8gbW9kaWZ5IGZjcF9wb2xsIHRpbWVyIG9mIGhiYS4KKyAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCisgKgorICogVGhpcyByb3V0aW5lIG1vZGlmaWVzIGZjcF9wb2xsX3RpbWVyICBmaWVsZCBvZiBAcGhiYSBieSBjZmdfcG9sbF90bW8uCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBjZmdfcG9sbF90bW8gaXMgMTAgbWlsbGlzZWNvbmRzLgorICoqLwogc3RhdGljIF9faW5saW5lX18gdm9pZCBscGZjX3BvbGxfcmVhcm1fdGltZXIoc3RydWN0IGxwZmNfaGJhICogcGhiYSkKIHsKIAl1bnNpZ25lZCBsb25nICBwb2xsX3Rtb19leHBpcmVzID0KQEAgLTEzMDUsMTEgKzIyNTIsMjUgQEAKIAkJCSAgcG9sbF90bW9fZXhwaXJlcyk7CiB9CiAKKy8qKgorICogbHBmY19wb2xsX3N0YXJ0X3RpbWVyOiBSb3V0aW5lIHRvIHN0YXJ0IGZjcF9wb2xsX3RpbWVyIG9mIEhCQS4KKyAqIEBwaGJhOiBUaGUgSGJhIGZvciB3aGljaCB0aGlzIGNhbGwgaXMgYmVpbmcgZXhlY3V0ZWQuCisgKgorICogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgZmNwX3BvbGxfdGltZXIgb2YgQHBoYmEuCisgKiovCiB2b2lkIGxwZmNfcG9sbF9zdGFydF90aW1lcihzdHJ1Y3QgbHBmY19oYmEgKiBwaGJhKQogewogCWxwZmNfcG9sbF9yZWFybV90aW1lcihwaGJhKTsKIH0KIAorLyoqCisgKiBscGZjX3BvbGxfdGltZW91dDogUmVzdGFydCBwb2xsaW5nIHRpbWVyLgorICogQHB0cjogTWFwIHRvIGxwZmNfaGJhIGRhdGEgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogVGhpcyByb3V0aW5lIHJlc3RhcnRzIGZjcF9wb2xsIHRpbWVyLCB3aGVuIEZDUCByaW5nICBwb2xsaW5nIGlzIGVuYWJsZQorICogYW5kIEZDUCBSaW5nIGludGVycnVwdCBpcyBkaXNhYmxlLgorICoqLworCiB2b2lkIGxwZmNfcG9sbF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgcHRyKQogewogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKikgcHRyOwpAQCAtMTMyMSw2ICsyMjgyLDIwIEBACiAJfQogfQogCisvKioKKyAqIGxwZmNfcXVldWVjb21tYW5kOiBRdWV1ZWNvbW1hbmQgZW50cnkgcG9pbnQgb2YgU2NzaSBIb3N0IFRlbXBsYXRlciBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKiBAY21uZDogUG9pbnRlciB0byBzY3NpX2NtbmQgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZG9uZTogUG9pbnRlciB0byBkb25lIHJvdXRpbmUuCisgKgorICogRHJpdmVyIHJlZ2lzdGVycyB0aGlzIHJvdXRpbmUgdG8gc2NzaSBtaWRsYXllciB0byBzdWJtaXQgYSBAY21kIHRvIHByb2Nlc3MuCisgKiBUaGlzIHJvdXRpbmUgcHJlcGFyZXMgYW4gSU9DQiBmcm9tIHNjc2kgY29tbWFuZCBhbmQgcHJvdmlkZXMgdG8gZmlybXdhcmUuCisgKiBUaGUgQGRvbmUgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciBkcml2ZXIgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgY29tbWFuZC4KKyAqCisgKiBSZXR1cm4gdmFsdWUgOgorICogICAwIC0gU3VjY2VzcworICogICBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZIC0gQmxvY2sgYWxsIGRldmljZXMgc2VydmVkIGJ5IHRoaXMgaG9zdCB0ZW1wb3JhcmlseS4KKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKQEAgLTEzNDAsNiArMjMxNSwxNyBAQAogCQlnb3RvIG91dF9mYWlsX2NvbW1hbmQ7CiAJfQogCisJaWYgKCEocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX0JHX0VOQUJMRUQpICYmCisJCXNjc2lfZ2V0X3Byb3Rfb3AoY21uZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgeworCisJCXByaW50ayhLRVJOX0VSUiAiQkxLR1JEIEVSUk9SOiByY3ZkIHByb3RlY3RlZCBjbWQ6JTAyeCBvcDolMDJ4ICIKKwkJCQkic3RyPSVzIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZm9yIEJsb2NrR3VhcmQgLSAiCisJCQkJIlJlamVjdGluZyBjb21tYW5kXG4iLAorCQkJCWNtbmQtPmNtbmRbMF0sIHNjc2lfZ2V0X3Byb3Rfb3AoY21uZCksCisJCQkJZGlmX29wX3N0cltzY3NpX2dldF9wcm90X29wKGNtbmQpXSk7CisJCWdvdG8gb3V0X2ZhaWxfY29tbWFuZDsKKwl9CisKIAkvKgogCSAqIENhdGNoIHJhY2Ugd2hlcmUgb3VyIG5vZGUgaGFzIHRyYW5zaXRpb25lZCwgYnV0IHRoZQogCSAqIHRyYW5zcG9ydCBpcyBzdGlsbCB0cmFuc2l0aW9uaW5nLgpAQCAtMTM0OCwxMiArMjMzNCwxMyBAQAogCQljbW5kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9UUkFOU1BPUlRfRElTUlVQVEVELCAwKTsKIAkJZ290byBvdXRfZmFpbF9jb21tYW5kOwogCX0KLQlpZiAoYXRvbWljX3JlYWQoJm5kbHAtPmNtZF9wZW5kaW5nKSA+PSBuZGxwLT5jbWRfcWRlcHRoKQorCWlmICh2cG9ydC0+Y2ZnX21heF9zY3NpY21wbF90aW1lICYmCisJCShhdG9taWNfcmVhZCgmbmRscC0+Y21kX3BlbmRpbmcpID49IG5kbHAtPmNtZF9xZGVwdGgpKQogCQlnb3RvIG91dF9ob3N0X2J1c3k7CiAKIAlscGZjX2NtZCA9IGxwZmNfZ2V0X3Njc2lfYnVmKHBoYmEpOwogCWlmIChscGZjX2NtZCA9PSBOVUxMKSB7Ci0JCWxwZmNfYWRqdXN0X3F1ZXVlX2RlcHRoKHBoYmEpOworCQlscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoKHBoYmEpOwogCiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0ZDUCwKIAkJCQkgIjA3MDcgZHJpdmVyJ3MgYnVmZmVyIHBvb2wgaXMgZW1wdHksICIKQEAgLTEzNjEsNyArMjM0OCw2IEBACiAJCWdvdG8gb3V0X2hvc3RfYnVzeTsKIAl9CiAKLQlscGZjX2NtZC0+c3RhcnRfdGltZSA9IGppZmZpZXM7CiAJLyoKIAkgKiBTdG9yZSB0aGUgbWlkbGF5ZXIncyBjb21tYW5kIHN0cnVjdHVyZSBmb3IgdGhlIGNvbXBsZXRpb24gcGhhc2UKIAkgKiBhbmQgY29tcGxldGUgdGhlIGNvbW1hbmQgaW5pdGlhbGl6YXRpb24uCkBAIC0xMzczLDcgKzIzNTksNjUgQEAKIAljbW5kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilscGZjX2NtZDsKIAljbW5kLT5zY3NpX2RvbmUgPSBkb25lOwogCi0JZXJyID0gbHBmY19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CisJaWYgKHNjc2lfZ2V0X3Byb3Rfb3AoY21uZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgeworCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkiOTAzMyBCTEtHUkQ6IHJjdmQgcHJvdGVjdGVkIGNtZDolMDJ4IG9wOiUwMnggIgorCQkJCSJzdHI9JXNcbiIsCisJCQkJY21uZC0+Y21uZFswXSwgc2NzaV9nZXRfcHJvdF9vcChjbW5kKSwKKwkJCQlkaWZfb3Bfc3RyW3Njc2lfZ2V0X3Byb3Rfb3AoY21uZCldKTsKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCisJCQkJIjkwMzQgQkxLR1JEOiBDREI6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiCisJCQkJIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsCisJCQkJY21uZC0+Y21uZFswXSwgY21uZC0+Y21uZFsxXSwgY21uZC0+Y21uZFsyXSwKKwkJCQljbW5kLT5jbW5kWzNdLCBjbW5kLT5jbW5kWzRdLCBjbW5kLT5jbW5kWzVdLAorCQkJCWNtbmQtPmNtbmRbNl0sIGNtbmQtPmNtbmRbN10sIGNtbmQtPmNtbmRbOF0sCisJCQkJY21uZC0+Y21uZFs5XSk7CisJCWlmIChjbW5kLT5jbW5kWzBdID09IFJFQURfMTApCisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkJIjkwMzUgQkxLR1JEOiBSRUFEIEAgc2VjdG9yICVsbHUsICIKKwkJCQkJICJjb3VudCAlbHVcbiIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKKwkJCQkJY21uZC0+cmVxdWVzdC0+bnJfc2VjdG9ycyk7CisJCWVsc2UgaWYgKGNtbmQtPmNtbmRbMF0gPT0gV1JJVEVfMTApCisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkJIjkwMzYgQkxLR1JEOiBXUklURSBAIHNlY3RvciAlbGx1LCAiCisJCQkJCSJjb3VudCAlbHUgY21kPSVwXG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKKwkJCQkJY21uZC0+cmVxdWVzdC0+bnJfc2VjdG9ycywKKwkJCQkJY21uZCk7CisKKwkJZXJyID0gbHBmY19iZ19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CisJfSBlbHNlIHsKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCisJCQkJIjkwMzggQkxLR1JEOiByY3ZkIHVucHJvdGVjdGVkIGNtZDolMDJ4IG9wOiUwMngiCisJCQkJIiBzdHI9JXNcbiIsCisJCQkJY21uZC0+Y21uZFswXSwgc2NzaV9nZXRfcHJvdF9vcChjbW5kKSwKKwkJCQlkaWZfb3Bfc3RyW3Njc2lfZ2V0X3Byb3Rfb3AoY21uZCldKTsKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfQkcsCisJCQkJICI5MDM5IEJMS0dSRDogQ0RCOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJCSAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKKwkJCQkgY21uZC0+Y21uZFswXSwgY21uZC0+Y21uZFsxXSwgY21uZC0+Y21uZFsyXSwKKwkJCQkgY21uZC0+Y21uZFszXSwgY21uZC0+Y21uZFs0XSwgY21uZC0+Y21uZFs1XSwKKwkJCQkgY21uZC0+Y21uZFs2XSwgY21uZC0+Y21uZFs3XSwgY21uZC0+Y21uZFs4XSwKKwkJCQkgY21uZC0+Y21uZFs5XSk7CisJCWlmIChjbW5kLT5jbW5kWzBdID09IFJFQURfMTApCisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKKwkJCQkJICI5MDQwIGRiZzogUkVBRCBAIHNlY3RvciAlbGx1LCAiCisJCQkJCSAiY291bnQgJWx1XG4iLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2dldF9sYmEoY21uZCksCisJCQkJCSBjbW5kLT5yZXF1ZXN0LT5ucl9zZWN0b3JzKTsKKwkJZWxzZSBpZiAoY21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAorCQkJCQkgIjkwNDEgZGJnOiBXUklURSBAIHNlY3RvciAlbGx1LCAiCisJCQkJCSAiY291bnQgJWx1IGNtZD0lcFxuIiwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpc2NzaV9nZXRfbGJhKGNtbmQpLAorCQkJCQkgY21uZC0+cmVxdWVzdC0+bnJfc2VjdG9ycywgY21uZCk7CisJCWVsc2UKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAorCQkJCQkgIjkwNDIgZGJnOiBwYXJzZXIgbm90IGltcGxlbWVudGVkXG4iKTsKKwkJZXJyID0gbHBmY19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CisJfQorCiAJaWYgKGVycikKIAkJZ290byBvdXRfaG9zdF9idXN5X2ZyZWVfYnVmOwogCkBAIC0xMzgyLDkgKzI0MjYsMTAgQEAKIAlhdG9taWNfaW5jKCZuZGxwLT5jbWRfcGVuZGluZyk7CiAJZXJyID0gbHBmY19zbGlfaXNzdWVfaW9jYihwaGJhLCAmcGhiYS0+c2xpLnJpbmdbcHNsaS0+ZmNwX3JpbmddLAogCQkJCSAgJmxwZmNfY21kLT5jdXJfaW9jYnEsIFNMSV9JT0NCX1JFVF9JT0NCKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJYXRvbWljX2RlYygmbmRscC0+Y21kX3BlbmRpbmcpOwogCQlnb3RvIG91dF9ob3N0X2J1c3lfZnJlZV9idWY7Ci0KKwl9CiAJaWYgKHBoYmEtPmNmZ19wb2xsICYgRU5BQkxFX0ZDUF9SSU5HX1BPTExJTkcpIHsKIAkJbHBmY19zbGlfcG9sbF9mY3BfcmluZyhwaGJhKTsKIAkJaWYgKHBoYmEtPmNmZ19wb2xsICYgRElTQUJMRV9GQ1BfUklOR19JTlQpCkBAIC0xMzk0LDcgKzI0MzksNiBAQAogCXJldHVybiAwOwogCiAgb3V0X2hvc3RfYnVzeV9mcmVlX2J1ZjoKLQlhdG9taWNfZGVjKCZuZGxwLT5jbWRfcGVuZGluZyk7CiAJbHBmY19zY3NpX3VucHJlcF9kbWFfYnVmKHBoYmEsIGxwZmNfY21kKTsKIAlscGZjX3JlbGVhc2Vfc2NzaV9idWYocGhiYSwgbHBmY19jbWQpOwogIG91dF9ob3N0X2J1c3k6CkBAIC0xNDA1LDYgKzI0NDksMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBscGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXI6IFJvdXRpbmUgdG8gYmxvY2sgZXJyb3IgIGhhbmRsZXIuCisgKiBAY21uZDogUG9pbnRlciB0byBzY3NpX2NtbmQgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogIFRoaXMgcm91dGluZSBibG9ja3MgZXhlY3V0aW9uIHRpbGwgZmNfcnBvcnQgc3RhdGUgaXMgbm90IEZDX1BPUlNUQVRfQkxDT0VLRC4KKyAqKi8KIHN0YXRpYyB2b2lkCiBscGZjX2Jsb2NrX2Vycm9yX2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKIHsKQEAgLTE0MjEsNiArMjQ3MSwxNyBAQAogCXJldHVybjsKIH0KIAorLyoqCisgKiBscGZjX2Fib3J0X2hhbmRsZXI6IEVoX2Fib3J0X2hhbmRsZXIgZW50cnkgcG9pbnQgb2YgU2NzaSBIb3N0IFRlbXBsYXRlIGRhdGEKKyAqc3RydWN0dXJlLgorICogQGNtbmQ6IFBvaW50ZXIgdG8gc2NzaV9jbW5kIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBhYm9ydHMgQGNtbmQgcGVuZGluZyBpbiBiYXNlIGRyaXZlci4KKyAqCisgKiBSZXR1cm4gY29kZSA6CisgKiAgIDB4MjAwMyAtIEVycm9yCisgKiAgIDB4MjAwMiAtIFN1Y2Nlc3MKKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQogewpAQCAtMTUxNiw2ICsyNTc3LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBscGZjX2RldmljZV9yZXNldF9oYW5kbGVyOiBlaF9kZXZpY2VfcmVzZXQgZW50cnkgcG9pbnQgb2YgU2NzaSBIb3N0IFRlbXBsYXRlCisgKmRhdGEgc3RydWN0dXJlLgorICogQGNtbmQ6IFBvaW50ZXIgdG8gc2NzaV9jbW5kIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBkb2VzIGEgZGV2aWNlIHJlc2V0IGJ5IHNlbmRpbmcgYSBUQVJHRVRfUkVTRVQgdGFzayBtYW5hZ2VtZW50CisgKiBjb21tYW5kLgorICoKKyAqIFJldHVybiBjb2RlIDoKKyAqICAweDIwMDMgLSBFcnJvcgorICogIDBleDIwMDIgLSBTdWNjZXNzCisgKiovCiBzdGF0aWMgaW50CiBscGZjX2RldmljZV9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtbmQpCiB7CkBAIC0xNTYwLDcgKzI2MzMsNyBAQAogCQlmY19nZXRfZXZlbnRfbnVtYmVyKCksCiAJCXNpemVvZihzY3NpX2V2ZW50KSwKIAkJKGNoYXIgKikmc2NzaV9ldmVudCwKLQkJU0NTSV9OTF9WSURfVFlQRV9QQ0kgfCBQQ0lfVkVORE9SX0lEX0VNVUxFWCk7CisJCUxQRkNfTkxfVkVORE9SX0lEKTsKIAogCWlmICghcmRhdGEgfHwgcG5vZGUtPm5scF9zdGF0ZSAhPSBOTFBfU1RFX01BUFBFRF9OT0RFKSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfRkNQLApAQCAtMTYzMyw2ICsyNzA2LDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBscGZjX2J1c19yZXNldF9oYW5kbGVyOiBlaF9idXNfcmVzZXRfaGFuZGxlciBlbnRyeSBwb2ludCBvZiBTY3NpIEhvc3QKKyAqIFRlbXBsYXRlIGRhdGEgc3RydWN0dXJlLgorICogQGNtbmQ6IFBvaW50ZXIgdG8gc2NzaV9jbW5kIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBkb2VzIHRhcmdldCByZXNldCB0byBhbGwgdGFyZ2V0IG9uIEBjbW5kLT5kZXZpY2UtPmhvc3QuCisgKgorICogUmV0dXJuIENvZGU6CisgKiAgIDB4MjAwMyAtIEVycm9yCisgKiAgIDB4MjAwMiAtIFN1Y2Nlc3MKKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21uZCkKIHsKQEAgLTE2NTcsNyArMjc0MSw3IEBACiAJCWZjX2dldF9ldmVudF9udW1iZXIoKSwKIAkJc2l6ZW9mKHNjc2lfZXZlbnQpLAogCQkoY2hhciAqKSZzY3NpX2V2ZW50LAotCQlTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfRU1VTEVYKTsKKwkJTFBGQ19OTF9WRU5ET1JfSUQpOwogCiAJbHBmY19ibG9ja19lcnJvcl9oYW5kbGVyKGNtbmQpOwogCS8qCkBAIC0xNzIzLDYgKzI4MDcsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGxwZmNfc2xhdmVfYWxsb2M6IHNsYXZlX2FsbG9jIGVudHJ5IHBvaW50IG9mIFNjc2kgSG9zdCBUZW1wbGF0ZSBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKiBAc2RldjogUG9pbnRlciB0byBzY3NpX2RldmljZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcG9wdWxhdGVzIHRoZSBjbWRzX3Blcl9sdW4gY291bnQgKyAyIHNjc2lfYnVmcyBpbnRvICB0aGlzIGhvc3QncworICogZ2xvYmFsbHkgYXZhaWxhYmxlIGxpc3Qgb2Ygc2NzaSBidWZmZXJzLiBUaGlzIHJvdXRpbmUgYWxzbyBtYWtlcyBzdXJlIHNjc2kKKyAqIGJ1ZmZlciBpcyBub3QgYWxsb2NhdGVkIG1vcmUgdGhhbiBIQkEgbGltaXQgY29udmV5ZWQgdG8gbWlkbGF5ZXIuIFRoaXMgbGlzdAorICogb2Ygc2NzaSBidWZmZXIgZXhpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGRyaXZlci4KKyAqCisgKiBSZXR1cm4gY29kZXM6CisgKiAgIG5vbi0wIC0gRXJyb3IKKyAqICAgMCAtIFN1Y2Nlc3MKKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewpAQCAtMTc4NCw2ICsyODgyLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogbHBmY19zbGF2ZV9jb25maWd1cmU6IHNsYXZlX2NvbmZpZ3VyZSBlbnRyeSBwb2ludCBvZiBTY3NpIEhvc3QgVGVtcGxhdGVyIGRhdGEKKyAqICBzdHJ1Y3R1cmUuCisgKiBAc2RldjogUG9pbnRlciB0byBzY3NpX2RldmljZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY29uZmlndXJlcyBmb2xsb3dpbmcgaXRlbXMKKyAqICAgLSBUYWcgY29tbWFuZCBxdWV1aW5nIHN1cHBvcnQgZm9yIEBzZGV2IGlmIHN1cHBvcnRlZC4KKyAqICAgLSBEZXYgbG9zcyB0aW1lIG91dCB2YWx1ZSBvZiBmY19ycG9ydC4KKyAqICAgLSBFbmFibGUgU0xJIHBvbGxpbmcgZm9yIGZjcCByaW5nIGlmIEVOQUJMRV9GQ1BfUklOR19QT0xMSU5HIGZsYWcgaXMgc2V0LgorICoKKyAqIFJldHVybiBjb2RlczoKKyAqICAgMCAtIFN1Y2Nlc3MKKyAqKi8KIHN0YXRpYyBpbnQKIGxwZmNfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKQEAgLTE4MTMsNiArMjkyNCwxMiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGxwZmNfc2xhdmVfZGVzdHJveTogc2xhdmVfZGVzdHJveSBlbnRyeSBwb2ludCBvZiBTSFQgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAc2RldjogUG9pbnRlciB0byBzY3NpX2RldmljZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2V0cyBAc2RldiBob3N0YXRkYXRhIGZpbGVkIHRvIG51bGwuCisgKiovCiBzdGF0aWMgdm9pZAogbHBmY19zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKaW5kZXggNDM3ZjE4Mi4uYzdjNDQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmgKQEAgLTEyNCw2ICsxMjQsOCBAQAogCXVpbnQzMl90ICAgc2VnX2NudDsJLyogTnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIHNlZ21lbnRzIHJldHVybmVkIGJ5CiAJCQkJICogZG1hX21hcF9zZy4gIFRoZSBkcml2ZXIgbmVlZHMgdGhpcyBmb3IgY2FsbHMKIAkJCQkgKiB0byBkbWFfdW5tYXBfc2cuICovCisJdWludDMyX3QgcHJvdF9zZWdfY250OyAgLyogc2VnX2NudCdzIGNvdW50ZXJwYXJ0IGZvciBwcm90ZWN0aW9uIGRhdGEgKi8KKwogCWRtYV9hZGRyX3Qgbm9uc2dfcGh5czsJLyogTm9uIHNjYXR0ZXItZ2F0aGVyIHBoeXNpY2FsIGFkZHJlc3MuICovCiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggOGFiNWJhYi4uMDFkZmRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC01NDIsNiArNTQyLDcgQEAKIAkgKi8KIAluZXh0aW9jYi0+aW9jYi51bHBJb1RhZyA9IChuZXh0aW9jYi0+aW9jYl9jbXBsKSA/IG5leHRpb2NiLT5pb3RhZyA6IDA7CiAKKwogCWlmIChwcmluZy0+cmluZ25vID09IExQRkNfRUxTX1JJTkcpIHsKIAkJbHBmY19kZWJ1Z2ZzX3Nsb3dfcmluZ190cmMocGhiYSwKIAkJCSJJT0NCIGNtZCByaW5nOiAgIHdkNDp4JTA4eCB3ZDY6eCUwOHggd2Q3OnglMDh4IiwKQEAgLTEyNTksNjggKzEyNjAsNiBAQAogfQogCiAvKioKLSAqIGxwZmNfc2xpX3JlcGxhY2VfaGJxYnVmZjogUmVwbGFjZSB0aGUgSEJRIGJ1ZmZlciB3aXRoIGEgbmV3IGJ1ZmZlci4KLSAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KLSAqIEB0YWc6IFRhZyBmb3IgdGhlIEhCUSBidWZmZXIuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB1bnNvbGljaXRlZCBldmVudCBoYW5kbGVyIGNvZGUgcGF0aCB0byBnZXQgdGhlCi0gKiBIQlEgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBhbiB1bnNvbGljaXRlZCBpb2NiLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoCi0gKiBubyBsb2NrIGhlbGQuIEl0IHJldHVybnMgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhZyBhbmQgcG9zdHMKLSAqIGFub3RoZXIgYnVmZmVyIHRvIHRoZSBmaXJtd2FyZS4gTm90ZSB0aGF0IHRoZSBuZXcgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkCi0gKiBiZWZvcmUgdGFraW5nIHRoZSBoYmFsb2NrIGFuZCB0aGF0IHRoZSBoYmEgbG9jayBtdXN0IGJlIGhlbGQgdW50aWwgaXQgaXMKLSAqIGZpbmlzaGVkIHdpdGggdGhlIGhicSBlbnRyeSBzd2FwLgotICoqLwotc3RhdGljIHN0cnVjdCBscGZjX2RtYWJ1ZiAqCi1scGZjX3NsaV9yZXBsYWNlX2hicWJ1ZmYoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MzJfdCB0YWcpCi17Ci0Jc3RydWN0IGhicV9kbWFidWYgKmhicV9lbnRyeSwgKm5ld19oYnFfZW50cnk7Ci0JdWludDMyX3QgaGJxbm87Ci0Jdm9pZCAqdmlydDsJCS8qIHZpcnR1YWwgYWRkcmVzcyBwdHIgKi8KLQlkbWFfYWRkcl90IHBoeXM7CS8qIG1hcHBlZCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWhicW5vID0gdGFnID4+IDE2OwotCW5ld19oYnFfZW50cnkgPSAocGhiYS0+aGJxc1toYnFub10uaGJxX2FsbG9jX2J1ZmZlcikocGhiYSk7Ci0JLyogQ2hlY2sgd2hldGhlciBIQlEgaXMgc3RpbGwgaW4gdXNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKLQlpZiAoIXBoYmEtPmhicV9pbl91c2UpIHsKLQkJaWYgKG5ld19oYnFfZW50cnkpCi0JCQkocGhiYS0+aGJxc1toYnFub10uaGJxX2ZyZWVfYnVmZmVyKShwaGJhLAotCQkJCQkJCSAgICBuZXdfaGJxX2VudHJ5KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQloYnFfZW50cnkgPSBscGZjX3NsaV9oYnFidWZfZmluZChwaGJhLCB0YWcpOwotCWlmIChoYnFfZW50cnkgPT0gTlVMTCkgewotCQlpZiAobmV3X2hicV9lbnRyeSkKLQkJCShwaGJhLT5oYnFzW2hicW5vXS5oYnFfZnJlZV9idWZmZXIpKHBoYmEsCi0JCQkJCQkJICAgIG5ld19oYnFfZW50cnkpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBmbGFncyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsaXN0X2RlbCgmaGJxX2VudHJ5LT5kYnVmLmxpc3QpOwotCi0JaWYgKG5ld19oYnFfZW50cnkgPT0gTlVMTCkgewotCQlsaXN0X2FkZF90YWlsKCZoYnFfZW50cnktPmRidWYubGlzdCwgJnBoYmEtPmhicWJ1Zl9pbl9saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gJmhicV9lbnRyeS0+ZGJ1ZjsKLQl9Ci0JbmV3X2hicV9lbnRyeS0+dGFnID0gLTE7Ci0JcGh5cyA9IG5ld19oYnFfZW50cnktPmRidWYucGh5czsKLQl2aXJ0ID0gbmV3X2hicV9lbnRyeS0+ZGJ1Zi52aXJ0OwotCW5ld19oYnFfZW50cnktPmRidWYucGh5cyA9IGhicV9lbnRyeS0+ZGJ1Zi5waHlzOwotCW5ld19oYnFfZW50cnktPmRidWYudmlydCA9IGhicV9lbnRyeS0+ZGJ1Zi52aXJ0OwotCWhicV9lbnRyeS0+ZGJ1Zi5waHlzID0gcGh5czsKLQloYnFfZW50cnktPmRidWYudmlydCA9IHZpcnQ7Ci0JbHBmY19zbGlfZnJlZV9oYnEocGhiYSwgaGJxX2VudHJ5KTsKLQlsaXN0X2FkZF90YWlsKCZuZXdfaGJxX2VudHJ5LT5kYnVmLmxpc3QsICZwaGJhLT5oYnFidWZfaW5fbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuICZuZXdfaGJxX2VudHJ5LT5kYnVmOwotfQotCi0vKioKICAqIGxwZmNfc2xpX2dldF9idWZmOiBHZXQgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlciB0YWcuCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCiAgKiBAcHJpbmc6IFBvaW50ZXIgdG8gZHJpdmVyIFNMSSByaW5nIG9iamVjdC4KQEAgLTEzMzQsMTMgKzEyNzMsMTcgQEAKICAqKi8KIHN0YXRpYyBzdHJ1Y3QgbHBmY19kbWFidWYgKgogbHBmY19zbGlfZ2V0X2J1ZmYoc3RydWN0IGxwZmNfaGJhICpwaGJhLAotCQkJc3RydWN0IGxwZmNfc2xpX3JpbmcgKnByaW5nLAotCQkJdWludDMyX3QgdGFnKQorCQkgIHN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZywKKwkJICB1aW50MzJfdCB0YWcpCiB7CisJc3RydWN0IGhicV9kbWFidWYgKmhicV9lbnRyeTsKKwogCWlmICh0YWcgJiBRVUVfQlVGVEFHX0JJVCkKIAkJcmV0dXJuIGxwZmNfc2xpX3JpbmdfdGFnZ2VkYnVmX2dldChwaGJhLCBwcmluZywgdGFnKTsKLQllbHNlCi0JCXJldHVybiBscGZjX3NsaV9yZXBsYWNlX2hicWJ1ZmYocGhiYSwgdGFnKTsKKwloYnFfZW50cnkgPSBscGZjX3NsaV9oYnFidWZfZmluZChwaGJhLCB0YWcpOworCWlmICghaGJxX2VudHJ5KQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmhicV9lbnRyeS0+ZGJ1ZjsKIH0KIAogCkBAIC0xMzcyLDggKzEzMTUsNiBAQAogCW1hdGNoID0gMDsKIAlpcnNwID0gJihzYXZlcS0+aW9jYik7CiAKLQlpZiAoaXJzcC0+dWxwU3RhdHVzID09IElPU1RBVF9ORUVEX0JVRkZFUikKLQkJcmV0dXJuIDE7CiAJaWYgKGlyc3AtPnVscENvbW1hbmQgPT0gQ01EX0FTWU5DX1NUQVRVUykgewogCQlpZiAocHJpbmctPmxwZmNfc2xpX3Jjdl9hc3luY19zdGF0dXMpCiAJCQlwcmluZy0+bHBmY19zbGlfcmN2X2FzeW5jX3N0YXR1cyhwaGJhLCBwcmluZywgc2F2ZXEpOwpAQCAtMTk4Miw3ICsxOTIzLDcgQEAKIAkJCWlmICgoaXJzcC0+dWxwU3RhdHVzID09IElPU1RBVF9MT0NBTF9SRUpFQ1QpICYmCiAJCQkJKGlyc3AtPnVuLnVscFdvcmRbNF0gPT0gSU9FUlJfTk9fUkVTT1VSQ0VTKSkgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKLQkJCQlscGZjX2FkanVzdF9xdWV1ZV9kZXB0aChwaGJhKTsKKwkJCQlscGZjX3JhbXBkb3duX3F1ZXVlX2RlcHRoKHBoYmEpOwogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCQl9CiAKQEAgLTIyMjUsNyArMjE2Niw3IEBACiAJCQlpZiAoKGlyc3AtPnVscFN0YXR1cyA9PSBJT1NUQVRfTE9DQUxfUkVKRUNUKSAmJgogCQkJICAgICAoaXJzcC0+dW4udWxwV29yZFs0XSA9PSBJT0VSUl9OT19SRVNPVVJDRVMpKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwotCQkJCWxwZmNfYWRqdXN0X3F1ZXVlX2RlcHRoKHBoYmEpOworCQkJCWxwZmNfcmFtcGRvd25fcXVldWVfZGVwdGgocGhiYSk7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAkJCX0KIApAQCAtMjc5MCw3ICsyNzMxLDYgQEAKIHsKIAlNQUlMQk9YX3QgKm1iOwogCXN0cnVjdCBscGZjX3NsaSAqcHNsaTsKLQl1aW50MTZfdCBza2lwX3Bvc3Q7CiAJdm9sYXRpbGUgdWludDMyX3Qgd29yZDA7CiAJdm9pZCBfX2lvbWVtICp0b19zbGltOwogCkBAIC0yODE1LDEzICsyNzU1LDEwIEBACiAJcmVhZGwodG9fc2xpbSk7IC8qIGZsdXNoICovCiAKIAkvKiBPbmx5IHNraXAgcG9zdCBhZnRlciBmY19mZmluaXQgaXMgY29tcGxldGVkICovCi0JaWYgKHBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlKSB7Ci0JCXNraXBfcG9zdCA9IDE7CisJaWYgKHBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlKQogCQl3b3JkMCA9IDE7CS8qIFRoaXMgaXMgcmVhbGx5IHNldHRpbmcgdXAgd29yZDEgKi8KLQl9IGVsc2UgewotCQlza2lwX3Bvc3QgPSAwOworCWVsc2UKIAkJd29yZDAgPSAwOwkvKiBUaGlzIGlzIHJlYWxseSBzZXR0aW5nIHVwIHdvcmQxICovCi0JfQogCXRvX3NsaW0gPSBwaGJhLT5NQnNsaW1hZGRyICsgc2l6ZW9mICh1aW50MzJfdCk7CiAJd3JpdGVsKCoodWludDMyX3QgKikgbWIsIHRvX3NsaW0pOwogCXJlYWRsKHRvX3NsaW0pOyAvKiBmbHVzaCAqLwpAQCAtMjgzNSwxMCArMjc3Miw4IEBACiAJbWVtc2V0KCZwc2xpLT5sbmtfc3RhdF9vZmZzZXRzLCAwLCBzaXplb2YocHNsaS0+bG5rX3N0YXRfb2Zmc2V0cykpOwogCXBzbGktPnN0YXRzX3N0YXJ0ID0gZ2V0X3NlY29uZHMoKTsKIAotCWlmIChza2lwX3Bvc3QpCi0JCW1kZWxheSgxMDApOwotCWVsc2UKLQkJbWRlbGF5KDIwMDApOworCS8qIEdpdmUgdGhlIElOSVRGRiBhbmQgUG9zdCB0aW1lIHRvIHNldHRsZS4gKi8KKwltZGVsYXkoMTAwKTsKIAogCWxwZmNfaGJhX2Rvd25fcG9zdChwaGJhKTsKIApAQCAtMzA4NCw3ICszMDE5LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJcGhiYS0+cHBvcnQtPnBvcnRfc3RhdGUgPSBMUEZDX1ZQT1JUX1VOS05PV047CiAJCWxwZmNfc2xpX2JyZHJlc3RhcnQocGhiYSk7Ci0JCW1zbGVlcCgyNTAwKTsKIAkJcmMgPSBscGZjX3NsaV9jaGlwc2V0X2luaXQocGhiYSk7CiAJCWlmIChyYykKIAkJCWJyZWFrOwpAQCAtMzExMSw3ICszMDQ1LDggQEAKIAkJcGhiYS0+c2xpM19vcHRpb25zICY9IH4oTFBGQ19TTEkzX05QSVZfRU5BQkxFRCB8CiAJCQkJCUxQRkNfU0xJM19IQlFfRU5BQkxFRCB8CiAJCQkJCUxQRkNfU0xJM19DUlBfRU5BQkxFRCB8Ci0JCQkJCUxQRkNfU0xJM19JTkJfRU5BQkxFRCk7CisJCQkJCUxQRkNfU0xJM19JTkJfRU5BQkxFRCB8CisJCQkJCUxQRkNfU0xJM19CR19FTkFCTEVEKTsKIAkJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIwNDQyIEFkYXB0ZXIgZmFpbGVkIHRvIGluaXQsIG1ieENtZCB4JXggIgpAQCAtMzE0NCwxNyArMzA3OSwyOSBAQAogCQkJcGhiYS0+c2xpM19vcHRpb25zIHw9IExQRkNfU0xJM19DUlBfRU5BQkxFRDsKIAkJaWYgKHBtYi0+bWIudW4udmFyQ2ZnUG9ydC5naW5iKSB7CiAJCQlwaGJhLT5zbGkzX29wdGlvbnMgfD0gTFBGQ19TTEkzX0lOQl9FTkFCTEVEOworCQkJcGhiYS0+aGJxX2dldCA9IHBoYmEtPm1ib3gtPnVzLnMzX2luYl9wZ3AuaGJxX2dldDsKIAkJCXBoYmEtPnBvcnRfZ3AgPSBwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLnBvcnQ7CiAJCQlwaGJhLT5pbmJfaGFfY29weSA9ICZwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLmhhX2NvcHk7CiAJCQlwaGJhLT5pbmJfY291bnRlciA9ICZwaGJhLT5tYm94LT51cy5zM19pbmJfcGdwLmNvdW50ZXI7CiAJCQlwaGJhLT5pbmJfbGFzdF9jb3VudGVyID0KIAkJCQkJcGhiYS0+bWJveC0+dXMuczNfaW5iX3BncC5jb3VudGVyOwogCQl9IGVsc2UgeworCQkJcGhiYS0+aGJxX2dldCA9IHBoYmEtPm1ib3gtPnVzLnMzX3BncC5oYnFfZ2V0OwogCQkJcGhiYS0+cG9ydF9ncCA9IHBoYmEtPm1ib3gtPnVzLnMzX3BncC5wb3J0OwogCQkJcGhiYS0+aW5iX2hhX2NvcHkgPSBOVUxMOwogCQkJcGhiYS0+aW5iX2NvdW50ZXIgPSBOVUxMOwogCQl9CisKKwkJaWYgKHBoYmEtPmNmZ19lbmFibGVfYmcpIHsKKwkJCWlmIChwbWItPm1iLnVuLnZhckNmZ1BvcnQuZ2JnKQorCQkJCXBoYmEtPnNsaTNfb3B0aW9ucyB8PSBMUEZDX1NMSTNfQkdfRU5BQkxFRDsKKwkJCWVsc2UKKwkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkJIjA0NDMgQWRhcHRlciBkaWQgbm90IGdyYW50ICIKKwkJCQkJCSJCbG9ja0d1YXJkXG4iKTsKKwkJfQogCX0gZWxzZSB7CisJCXBoYmEtPmhicV9nZXQgPSBOVUxMOwogCQlwaGJhLT5wb3J0X2dwID0gcGhiYS0+bWJveC0+dXMuczIucG9ydDsKIAkJcGhiYS0+aW5iX2hhX2NvcHkgPSBOVUxMOwogCQlwaGJhLT5pbmJfY291bnRlciA9IE5VTEw7CkBAIC0zMzA1LDEwICszMjUyLDYgQEAKIAlzdHJ1Y3QgbHBmY19zbGkgKnBzbGkgPSAmcGhiYS0+c2xpOwogCXN0cnVjdCBscGZjX3NsaV9yaW5nICpwcmluZzsKIAotCWlmICghKHBoYmEtPnBwb3J0LT53b3JrX3BvcnRfZXZlbnRzICYgV09SS0VSX01CT1hfVE1PKSkgewotCQlyZXR1cm47Ci0JfQotCiAJLyogTWJveCBjbWQgPG1ieENvbW1hbmQ+IHRpbWVvdXQgKi8KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCSIwMzEwIE1haWxib3ggY29tbWFuZCB4JXggdGltZW91dCBEYXRhOiB4JXggeCV4IHglcFxuIiwKQEAgLTQwMDUsNyArMzk0OCw3IEBACiAJc2hvc3QgPSBscGZjX3Nob3N0X2Zyb21fdnBvcnQocGhiYS0+cHBvcnQpOwogCWZjX2hvc3RfcG9zdF92ZW5kb3JfZXZlbnQoc2hvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKIAkJc2l6ZW9mKHRlbXBfZXZlbnRfZGF0YSksIChjaGFyICopICZ0ZW1wX2V2ZW50X2RhdGEsCi0JCVNDU0lfTkxfVklEX1RZUEVfUENJIHwgUENJX1ZFTkRPUl9JRF9FTVVMRVgpOworCQlMUEZDX05MX1ZFTkRPUl9JRCk7CiAKIH0KIApAQCAtNTE4NCw2ICs1MTI3LDEwIEBACiB7CiAJdWludDMyX3QgaGFfY29weTsKIAorCS8qIElmIFBDSSBjaGFubmVsIGlzIG9mZmxpbmUsIGRvbid0IHByb2Nlc3MgaXQgKi8KKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShwaGJhLT5wY2lkZXYpKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBJZiBzb21lYm9keSBpcyB3YWl0aW5nIHRvIGhhbmRsZSBhbiBlcmF0dCwgZG9uJ3QgcHJvY2VzcyBpdAogCSAqIGhlcmUuIFRoZSBicmRraWxsIGZ1bmN0aW9uIHdpbGwgZG8gdGhpcy4KIAkgKi8KQEAgLTUyNDIsNiArNTE4OSw3IEBACiAJdWludDMyX3QgaGFfY29weTsKIAl1aW50MzJfdCB3b3JrX2hhX2NvcHk7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBpZmxhZzsKIAl1aW50MzJfdCBjb250cm9sOwogCiAJTUFJTEJPWF90ICptYm94LCAqcG1ib3g7CkBAIC01Mjc0LDcgKzUyMjIsNyBAQAogCQlpZiAodW5saWtlbHkocGhiYS0+bGlua19zdGF0ZSA8IExQRkNfTElOS19ET1dOKSkKIAkJCXJldHVybiBJUlFfTk9ORTsKIAkJLyogTmVlZCB0byByZWFkIEhBIFJFRyBmb3Igc2xvdy1wYXRoIGV2ZW50cyAqLwotCQlzcGluX2xvY2soJnBoYmEtPmhiYWxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQloYV9jb3B5ID0gcmVhZGwocGhiYS0+SEFyZWdhZGRyKTsKIAkJLyogSWYgc29tZWJvZHkgaXMgd2FpdGluZyB0byBoYW5kbGUgYW4gZXJhdHQgZG9uJ3QgcHJvY2VzcyBpdAogCQkgKiBoZXJlLiBUaGUgYnJka2lsbCBmdW5jdGlvbiB3aWxsIGRvIHRoaXMuCkBAIC01Mjk0LDcgKzUyNDIsNyBAQAogCQl3cml0ZWwoKGhhX2NvcHkgJiAoSEFfTUJBVFQgfCBIQV9SMl9DTFJfTVNLKSksCiAJCQlwaGJhLT5IQXJlZ2FkZHIpOwogCQlyZWFkbChwaGJhLT5IQXJlZ2FkZHIpOyAvKiBmbHVzaCAqLwotCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAl9IGVsc2UKIAkJaGFfY29weSA9IHBoYmEtPmhhX2NvcHk7CiAKQEAgLTUzMDcsMTMgKzUyNTUsMTMgQEAKIAkJCQkgKiBUdXJuIG9mZiBMaW5rIEF0dGVudGlvbiBpbnRlcnJ1cHRzCiAJCQkJICogdW50aWwgQ0xFQVJfTEEgZG9uZQogCQkJCSAqLwotCQkJCXNwaW5fbG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAkJCQlwaGJhLT5zbGkuc2xpX2ZsYWcgJj0gfkxQRkNfUFJPQ0VTU19MQTsKIAkJCQljb250cm9sID0gcmVhZGwocGhiYS0+SENyZWdhZGRyKTsKIAkJCQljb250cm9sICY9IH5IQ19MQUlOVF9FTkE7CiAJCQkJd3JpdGVsKGNvbnRyb2wsIHBoYmEtPkhDcmVnYWRkcik7CiAJCQkJcmVhZGwocGhiYS0+SENyZWdhZGRyKTsgLyogZmx1c2ggKi8KLQkJCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQkJfQogCQkJZWxzZQogCQkJCXdvcmtfaGFfY29weSAmPSB+SEFfTEFUVDsKQEAgLTUzMjgsNyArNTI3Niw3IEBACiAJCQkJKEhBX1JYTUFTSyAgPDwgKDQqTFBGQ19FTFNfUklORykpKTsKIAkJCXN0YXR1cyA+Pj0gKDQqTFBGQ19FTFNfUklORyk7CiAJCQlpZiAoc3RhdHVzICYgSEFfUlhNQVNLKSB7Ci0JCQkJc3Bpbl9sb2NrKCZwaGJhLT5oYmFsb2NrKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQkJCWNvbnRyb2wgPSByZWFkbChwaGJhLT5IQ3JlZ2FkZHIpOwogCiAJCQkJbHBmY19kZWJ1Z2ZzX3Nsb3dfcmluZ190cmMocGhiYSwKQEAgLTUzNTcsMTAgKzUzMDUsMTAgQEAKIAkJCQkJCSh1aW50MzJfdCkoKHVuc2lnbmVkIGxvbmcpCiAJCQkJCQkmcGhiYS0+d29ya193YWl0cSkpOwogCQkJCX0KLQkJCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQkJfQogCQl9Ci0JCXNwaW5fbG9jaygmcGhiYS0+aGJhbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCWlmICh3b3JrX2hhX2NvcHkgJiBIQV9FUkFUVCkKIAkJCWxwZmNfc2xpX3JlYWRfaHMocGhiYSk7CiAJCWlmICgod29ya19oYV9jb3B5ICYgSEFfTUJBVFQpICYmIChwaGJhLT5zbGkubWJveF9hY3RpdmUpKSB7CkBAIC01MzcyLDcgKzUzMjAsNyBAQAogCQkJLyogRmlyc3QgY2hlY2sgb3V0IHRoZSBzdGF0dXMgd29yZCAqLwogCQkJbHBmY19zbGlfcGNpbWVtX2Jjb3B5KG1ib3gsIHBtYm94LCBzaXplb2YodWludDMyX3QpKTsKIAkJCWlmIChwbWJveC0+bWJ4T3duZXIgIT0gT1dOX0hPU1QpIHsKLQkJCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQkJCS8qCiAJCQkJICogU3RyYXkgTWFpbGJveCBJbnRlcnJ1cHQsIG1ieENvbW1hbmQgPGNtZD4KIAkJCQkgKiBtYnhTdGF0dXMgPHN0YXR1cz4KQEAgLTUzODksNyArNTMzNyw3IEBACiAJCQkJd29ya19oYV9jb3B5ICY9IH5IQV9NQkFUVDsKIAkJCX0gZWxzZSB7CiAJCQkJcGhiYS0+c2xpLm1ib3hfYWN0aXZlID0gTlVMTDsKLQkJCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQkJCXBoYmEtPmxhc3RfY29tcGxldGlvbl90aW1lID0gamlmZmllczsKIAkJCQlkZWxfdGltZXIoJnBoYmEtPnNsaS5tYm94X3Rtbyk7CiAJCQkJaWYgKHBtYi0+bWJveF9jbXBsKSB7CkBAIC01NDM4LDE0ICs1Mzg2LDE4IEBACiAJCQkJCQlnb3RvIHNlbmRfY3VycmVudF9tYm94OwogCQkJCQl9CiAJCQkJfQotCQkJCXNwaW5fbG9jaygmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCQkJCSZwaGJhLT5wcG9ydC0+d29ya19wb3J0X2xvY2ssCisJCQkJCQlpZmxhZyk7CiAJCQkJcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9ldmVudHMgJj0KIAkJCQkJfldPUktFUl9NQk9YX1RNTzsKLQkJCQlzcGluX3VubG9jaygmcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9sb2NrKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkJJnBoYmEtPnBwb3J0LT53b3JrX3BvcnRfbG9jaywKKwkJCQkJCWlmbGFnKTsKIAkJCQlscGZjX21ib3hfY21wbF9wdXQocGhiYSwgcG1iKTsKIAkJCX0KIAkJfSBlbHNlCi0JCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAKIAkJaWYgKCh3b3JrX2hhX2NvcHkgJiBIQV9NQkFUVCkgJiYKIAkJICAgIChwaGJhLT5zbGkubWJveF9hY3RpdmUgPT0gTlVMTCkpIHsKQEAgLTU0NjEsOSArNTQxMyw5IEBACiAJCQkJCQkiTUJYX1NVQ0NFU1MiKTsKIAkJfQogCi0JCXNwaW5fbG9jaygmcGhiYS0+aGJhbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCXBoYmEtPndvcmtfaGEgfD0gd29ya19oYV9jb3B5OwotCQlzcGluX3VubG9jaygmcGhiYS0+aGJhbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAkJbHBmY193b3JrZXJfd2FrZV91cChwaGJhKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNTQ5NSw2ICs1NDQ3LDcgQEAKIAlzdHJ1Y3QgbHBmY19oYmEgICpwaGJhOwogCXVpbnQzMl90IGhhX2NvcHk7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBpZmxhZzsKIAogCS8qIEdldCB0aGUgZHJpdmVyJ3MgcGhiYSBzdHJ1Y3R1cmUgZnJvbSB0aGUgZGV2X2lkIGFuZAogCSAqIGFzc3VtZSB0aGUgSEJBIGlzIG5vdCBpbnRlcnJ1cHRpbmcuCkBAIC01NTIwLDExICs1NDczLDExIEBACiAJCS8qIE5lZWQgdG8gcmVhZCBIQSBSRUcgZm9yIEZDUCByaW5nIGFuZCBvdGhlciByaW5nIGV2ZW50cyAqLwogCQloYV9jb3B5ID0gcmVhZGwocGhiYS0+SEFyZWdhZGRyKTsKIAkJLyogQ2xlYXIgdXAgb25seSBhdHRlbnRpb24gc291cmNlIHJlbGF0ZWQgdG8gZmFzdC1wYXRoICovCi0JCXNwaW5fbG9jaygmcGhiYS0+aGJhbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCXdyaXRlbCgoaGFfY29weSAmIChIQV9SMF9DTFJfTVNLIHwgSEFfUjFfQ0xSX01TSykpLAogCQkJcGhiYS0+SEFyZWdhZGRyKTsKIAkJcmVhZGwocGhiYS0+SEFyZWdhZGRyKTsgLyogZmx1c2ggKi8KLQkJc3Bpbl91bmxvY2soJnBoYmEtPmhiYWxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJfSBlbHNlCiAJCWhhX2NvcHkgPSBwaGJhLT5oYV9jb3B5OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCmluZGV4IGNjNDNlOWQuLjdlMzJlOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgcGFja2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4yLjgiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy4wIgogCiAjZGVmaW5lIExQRkNfRFJJVkVSX05BTUUJCSJscGZjIgogI2RlZmluZSBMUEZDX1NQX0RSSVZFUl9IQU5ETEVSX05BTUUJImxwZmM6c3AiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMKaW5kZXggYTdkZTFjYy4uNjNiNTRjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYwpAQCAtMjg4LDEwICsyODgsOCBAQAogCWludCB2cGk7CiAJaW50IHJjID0gVlBPUlRfRVJST1I7CiAJaW50IHN0YXR1czsKLQlpbnQgc2l6ZTsKIAotCWlmICgocGhiYS0+c2xpX3JldiA8IDMpIHx8Ci0JCSEocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX05QSVZfRU5BQkxFRCkpIHsKKwlpZiAoKHBoYmEtPnNsaV9yZXYgPCAzKSB8fCAhKHBoYmEtPmNmZ19lbmFibGVfbnBpdikpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfVlBPUlQsCiAJCQkJIjE4MDggQ3JlYXRlIFZQT1JUIGZhaWxlZDogIgogCQkJCSJOUElWIGlzIG5vdCBlbmFibGVkOiBTTEltb2RlOiVkXG4iLApAQCAtMzUxLDIwICszNDksNiBAQAogCiAJbWVtY3B5KHZwb3J0LT5mY19wb3J0bmFtZS51Lnd3biwgdnBvcnQtPmZjX3NwYXJhbS5wb3J0TmFtZS51Lnd3biwgOCk7CiAJbWVtY3B5KHZwb3J0LT5mY19ub2RlbmFtZS51Lnd3biwgdnBvcnQtPmZjX3NwYXJhbS5ub2RlTmFtZS51Lnd3biwgOCk7Ci0Jc2l6ZSA9IHN0cm5sZW4oZmNfdnBvcnQtPnN5bWJvbGljX25hbWUsIExQRkNfVk5BTUVfTEVOKTsKLQlpZiAoc2l6ZSkgewotCQl2cG9ydC0+dm5hbWUgPSBremFsbG9jKHNpemUrMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdnBvcnQtPnZuYW1lKSB7Ci0JCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX1ZQT1JULAotCQkJCQkgIjE4MTQgQ3JlYXRlIFZQT1JUIGZhaWxlZC4gIgotCQkJCQkgInZuYW1lIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7Ci0JCQlyYyA9IFZQT1JUX0VSUk9SOwotCQkJbHBmY19mcmVlX3ZwaShwaGJhLCB2cGkpOwotCQkJZGVzdHJveV9wb3J0KHZwb3J0KTsKLQkJCWdvdG8gZXJyb3Jfb3V0OwotCQl9Ci0JCW1lbWNweSh2cG9ydC0+dm5hbWUsIGZjX3Zwb3J0LT5zeW1ib2xpY19uYW1lLCBzaXplKzEpOwotCX0KIAlpZiAoZmNfdnBvcnQtPm5vZGVfbmFtZSAhPSAwKQogCQl1NjRfdG9fd3duKGZjX3Zwb3J0LT5ub2RlX25hbWUsIHZwb3J0LT5mY19ub2RlbmFtZS51Lnd3bik7CiAJaWYgKGZjX3Zwb3J0LT5wb3J0X25hbWUgIT0gMCkKQEAgLTM5NCw2ICszNzgsOSBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKKwkvKiBDcmVhdGUgYmluYXJ5IHN5c2ZzIGF0dHJpYnV0ZSBmb3IgdnBvcnQgKi8KKwlscGZjX2FsbG9jX3N5c2ZzX2F0dHIodnBvcnQpOworCiAJKihzdHJ1Y3QgbHBmY192cG9ydCAqKilmY192cG9ydC0+ZGRfZGF0YSA9IHZwb3J0OwogCXZwb3J0LT5mY192cG9ydCA9IGZjX3Zwb3J0OwogCkBAIC00MDUsNiArMzkyLDcgQEAKIAl9CiAKIAlpZiAoZGlzYWJsZSkgeworCQlscGZjX3Zwb3J0X3NldF9zdGF0ZSh2cG9ydCwgRkNfVlBPUlRfRElTQUJMRUQpOwogCQlyYyA9IFZQT1JUX09LOwogCQlnb3RvIG91dDsKIAl9CkBAIC01ODcsOCArNTc1LDEyIEBACiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJdnBvcnQtPmxvYWRfZmxhZyB8PSBGQ19VTkxPQURJTkc7CiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQlrZnJlZSh2cG9ydC0+dm5hbWUpOworCisJbHBmY19mcmVlX3N5c2ZzX2F0dHIodnBvcnQpOworCiAJbHBmY19kZWJ1Z2ZzX3Rlcm1pbmF0ZSh2cG9ydCk7CisKKwkvKiBSZW1vdmUgRkMgaG9zdCBhbmQgdGhlbiBTQ1NJIGhvc3Qgd2l0aCB0aGUgdnBvcnQgKi8KIAlmY19yZW1vdmVfaG9zdChscGZjX3Nob3N0X2Zyb21fdnBvcnQodnBvcnQpKTsKIAlzY3NpX3JlbW92ZV9ob3N0KGxwZmNfc2hvc3RfZnJvbV92cG9ydCh2cG9ydCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwppbmRleCA4ODc2ODJhLi5jMjRlODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKQEAgLTUzLDcgKzUzLDggQEAKIAl2b2lkIF9faW9tZW0gKnBkbWFfaW87CiAJaW50IGVycm9yOwogfTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbnRlcm5hbF9lc3AsICpleHRlcm5hbF9lc3A7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW50ZXJuYWxfcGRldiwgKmV4dGVybmFsX3BkZXY7CitzdGF0aWMgc3RydWN0IGVzcCAqZXNwX2NoaXBzWzJdOwogCiAjZGVmaW5lIE1BQ19FU1BfR0VUX1BSSVYoZXNwKSAoKHN0cnVjdCBtYWNfZXNwX3ByaXYgKikgXAogCQkJICAgICAgIHBsYXRmb3JtX2dldF9kcnZkYXRhKChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopIFwKQEAgLTE3MCw3ICsxNzEsNyBAQAogCiAjZGVmaW5lIE1BQ19FU1BfUERNQV9MT09QKG9wZXJhbmRzKSBcCiAJYXNtIHZvbGF0aWxlICggXAotCSAgICAgIiAgICAgICB0c3R3ICUyICAgICAgICAgICAgICAgICAgIFxuIiBcCisJICAgICAiICAgICAgIHRzdHcgJTEgICAgICAgICAgICAgICAgICAgXG4iIFwKIAkgICAgICIgICAgICAgamJlcSAyMGYgICAgICAgICAgICAgICAgICBcbiIgXAogCSAgICAgIjE6ICAgICBtb3ZldyAiIG9wZXJhbmRzICIgICAgICAgIFxuIiBcCiAJICAgICAiMjogICAgIG1vdmV3ICIgb3BlcmFuZHMgIiAgICAgICAgXG4iIFwKQEAgLTE4OCwxNCArMTg5LDE0IEBACiAJICAgICAiMTQ6ICAgIG1vdmV3ICIgb3BlcmFuZHMgIiAgICAgICAgXG4iIFwKIAkgICAgICIxNTogICAgbW92ZXcgIiBvcGVyYW5kcyAiICAgICAgICBcbiIgXAogCSAgICAgIjE2OiAgICBtb3ZldyAiIG9wZXJhbmRzICIgICAgICAgIFxuIiBcCi0JICAgICAiICAgICAgIHN1YnF3ICMxLCUyICAgICAgICAgICAgICAgXG4iIFwKKwkgICAgICIgICAgICAgc3VicXcgIzEsJTEgICAgICAgICAgICAgICBcbiIgXAogCSAgICAgIiAgICAgICBqYm5lIDFiICAgICAgICAgICAgICAgICAgIFxuIiBcCi0JICAgICAiMjA6ICAgIHRzdHcgJTMgICAgICAgICAgICAgICAgICAgXG4iIFwKKwkgICAgICIyMDogICAgdHN0dyAlMiAgICAgICAgICAgICAgICAgICBcbiIgXAogCSAgICAgIiAgICAgICBqYmVxIDMwZiAgICAgICAgICAgICAgICAgIFxuIiBcCiAJICAgICAiMjE6ICAgIG1vdmV3ICIgb3BlcmFuZHMgIiAgICAgICAgXG4iIFwKLQkgICAgICIgICAgICAgc3VicXcgIzEsJTMgICAgICAgICAgICAgICBcbiIgXAorCSAgICAgIiAgICAgICBzdWJxdyAjMSwlMiAgICAgICAgICAgICAgIFxuIiBcCiAJICAgICAiICAgICAgIGpibmUgMjFiICAgICAgICAgICAgICAgICAgXG4iIFwKLQkgICAgICIzMDogICAgdHN0dyAlNCAgICAgICAgICAgICAgICAgICBcbiIgXAorCSAgICAgIjMwOiAgICB0c3R3ICUzICAgICAgICAgICAgICAgICAgIFxuIiBcCiAJICAgICAiICAgICAgIGpiZXEgNDBmICAgICAgICAgICAgICAgICAgXG4iIFwKIAkgICAgICIzMTogICAgbW92ZWIgIiBvcGVyYW5kcyAiICAgICAgICBcbiIgXAogCSAgICAgIjMyOiAgICBub3AgICAgICAgICAgICAgICAgICAgICAgIFxuIiBcCkBAIC0yMjMsOCArMjI0LDggQEAKIAkgICAgICIgICAgICAgLmxvbmcgIDMxYiw0MGIgICAgICAgICAgICBcbiIgXAogCSAgICAgIiAgICAgICAubG9uZyAgMzJiLDQwYiAgICAgICAgICAgIFxuIiBcCiAJICAgICAiICAgICAgIC5wcmV2aW91cyAgICAgICAgICAgICAgICAgXG4iIFwKLQkgICAgIDogIithIiAoYWRkcikgXAotCSAgICAgOiAiYSIgKG1lcC0+cGRtYV9pbyksICJyIiAoY291bnQzMiksICJyIiAoY291bnQyKSwgImciIChlc3BfY291bnQpKQorCSAgICAgOiAiK2EiIChhZGRyKSwgIityIiAoY291bnQzMiksICIrciIgKGNvdW50MikgXAorCSAgICAgOiAiZyIgKGNvdW50MSksICJhIiAobWVwLT5wZG1hX2lvKSkKIAogc3RhdGljIHZvaWQgbWFjX2VzcF9zZW5kX3BkbWFfY21kKHN0cnVjdCBlc3AgKmVzcCwgdTMyIGFkZHIsIHUzMiBlc3BfY291bnQsCiAJCQkJICB1MzIgZG1hX2NvdW50LCBpbnQgd3JpdGUsIHU4IGNtZCkKQEAgLTI0NywxOSArMjQ4LDIwIEBACiAJZG8gewogCQl1bnNpZ25lZCBpbnQgY291bnQzMiA9IGVzcF9jb3VudCA+PiA1OwogCQl1bnNpZ25lZCBpbnQgY291bnQyID0gKGVzcF9jb3VudCAmIDB4MUYpID4+IDE7CisJCXVuc2lnbmVkIGludCBjb3VudDEgPSBlc3BfY291bnQgJiAxOwogCQl1bnNpZ25lZCBpbnQgc3RhcnRfYWRkciA9IGFkZHI7CiAKIAkJaWYgKG1hY19lc3Bfd2FpdF9mb3JfZHJlcShlc3ApKQogCQkJYnJlYWs7CiAKIAkJaWYgKHdyaXRlKSB7Ci0JCQlNQUNfRVNQX1BETUFfTE9PUCgiJTFALCUwQCsiKTsKKwkJCU1BQ19FU1BfUERNQV9MT09QKCIlNEAsJTBAKyIpOwogCiAJCQllc3BfY291bnQgLT0gYWRkciAtIHN0YXJ0X2FkZHI7CiAJCX0gZWxzZSB7CiAJCQl1bnNpZ25lZCBpbnQgbjsKIAotCQkJTUFDX0VTUF9QRE1BX0xPT1AoIiUwQCssJTFAIik7CisJCQlNQUNfRVNQX1BETUFfTE9PUCgiJTBAKywlNEAiKTsKIAogCQkJaWYgKG1hY19lc3Bfd2FpdF9mb3JfZW1wdHlfZmlmbyhlc3ApKQogCQkJCWJyZWFrOwpAQCAtNDQyLDYgKzQ0NCwzMiBAQAogCXJldHVybiBkbWFfbGVuID4gMHhGRkZGID8gMHhGRkZGIDogZG1hX2xlbjsKIH0KIAorc3RhdGljIGlycXJldHVybl90IG1hY19zY3NpX2VzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlpbnQgZ290X2ludHI7CisKKwkvKgorCSAqIFRoaXMgaXMgYW4gZWRnZSB0cmlnZ2VyZWQgSVJRLCBzbyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8KKwkgKiBhdm9pZCBtaXNzaW5nIGEgdHJhbnNpdGlvbiB3aGVuIGl0IGlzIHNoYXJlZCBieSB0d28gRVNQIGRldmljZXMuCisJICovCisKKwlkbyB7CisJCWdvdF9pbnRyID0gMDsKKwkJaWYgKGVzcF9jaGlwc1swXSAmJgorCQkgICAgKG1hY19lc3BfcmVhZDgoZXNwX2NoaXBzWzBdLCBFU1BfU1RBVFVTKSAmIEVTUF9TVEFUX0lOVFIpKSB7CisJCQkodm9pZClzY3NpX2VzcF9pbnRyKGlycSwgZXNwX2NoaXBzWzBdKTsKKwkJCWdvdF9pbnRyID0gMTsKKwkJfQorCQlpZiAoZXNwX2NoaXBzWzFdICYmCisJCSAgICAobWFjX2VzcF9yZWFkOChlc3BfY2hpcHNbMV0sIEVTUF9TVEFUVVMpICYgRVNQX1NUQVRfSU5UUikpIHsKKwkJCSh2b2lkKXNjc2lfZXNwX2ludHIoaXJxLCBlc3BfY2hpcHNbMV0pOworCQkJZ290X2ludHIgPSAxOworCQl9CisJfSB3aGlsZSAoZ290X2ludHIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgc3RydWN0IGVzcF9kcml2ZXJfb3BzIG1hY19lc3Bfb3BzID0gewogCS5lc3Bfd3JpdGU4ICAgICAgID0gbWFjX2VzcF93cml0ZTgsCiAJLmVzcF9yZWFkOCAgICAgICAgPSBtYWNfZXNwX3JlYWQ4LApAQCAtNTU2LDEwICs1ODQsMTYgQEAKIAl9CiAKIAlob3N0LT5pcnEgPSBJUlFfTUFDX1NDU0k7Ci0JZXJyID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBzY3NpX2VzcF9pbnRyLCBJUlFGX1NIQVJFRCwgIk1hYyBFU1AiLAotCQkJICBlc3ApOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZhaWxfZnJlZV9wcml2OworCWVzcF9jaGlwc1tkZXYtPmlkXSA9IGVzcDsKKwltYigpOworCWlmIChlc3BfY2hpcHNbIWRldi0+aWRdID09IE5VTEwpIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBtYWNfc2NzaV9lc3BfaW50ciwgMCwKKwkJICAgICAgICAgICAgICAgICAgIk1hYyBFU1AiLCBOVUxMKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWVzcF9jaGlwc1tkZXYtPmlkXSA9IE5VTEw7CisJCQlnb3RvIGZhaWxfZnJlZV9wcml2OworCQl9CisJfQogCiAJZXJyID0gc2NzaV9lc3BfcmVnaXN0ZXIoZXNwLCAmZGV2LT5kZXYpOwogCWlmIChlcnIpCkBAIC01NjgsNyArNjAyLDggQEAKIAlyZXR1cm4gMDsKIAogZmFpbF9mcmVlX2lycToKLQlmcmVlX2lycShob3N0LT5pcnEsIGVzcCk7CisJaWYgKGVzcF9jaGlwc1shZGV2LT5pZF0gPT0gTlVMTCkKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBlc3ApOwogZmFpbF9mcmVlX3ByaXY6CiAJa2ZyZWUobWVwKTsKIGZhaWxfZnJlZV9jb21tYW5kX2Jsb2NrOgpAQCAtNTg3LDcgKzYyMiw5IEBACiAKIAlzY3NpX2VzcF91bnJlZ2lzdGVyKGVzcCk7CiAKLQlmcmVlX2lycShpcnEsIGVzcCk7CisJZXNwX2NoaXBzW2Rldi0+aWRdID0gTlVMTDsKKwlpZiAoIShlc3BfY2hpcHNbMF0gfHwgZXNwX2NoaXBzWzFdKSkKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKIAogCWtmcmVlKG1lcCk7CiAKQEAgLTYxNCwxOSArNjUxLDE4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWludGVybmFsX2VzcCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZfTU9EVUxFX05BTUUsIDApOwotCWlmIChpbnRlcm5hbF9lc3AgJiYgcGxhdGZvcm1fZGV2aWNlX2FkZChpbnRlcm5hbF9lc3ApKSB7Ci0JCXBsYXRmb3JtX2RldmljZV9wdXQoaW50ZXJuYWxfZXNwKTsKLQkJaW50ZXJuYWxfZXNwID0gTlVMTDsKKwlpbnRlcm5hbF9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVl9NT0RVTEVfTkFNRSwgMCk7CisJaWYgKGludGVybmFsX3BkZXYgJiYgcGxhdGZvcm1fZGV2aWNlX2FkZChpbnRlcm5hbF9wZGV2KSkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGludGVybmFsX3BkZXYpOworCQlpbnRlcm5hbF9wZGV2ID0gTlVMTDsKKwl9CisJZXh0ZXJuYWxfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZfTU9EVUxFX05BTUUsIDEpOworCWlmIChleHRlcm5hbF9wZGV2ICYmIHBsYXRmb3JtX2RldmljZV9hZGQoZXh0ZXJuYWxfcGRldikpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChleHRlcm5hbF9wZGV2KTsKKwkJZXh0ZXJuYWxfcGRldiA9IE5VTEw7CiAJfQogCi0JZXh0ZXJuYWxfZXNwID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVl9NT0RVTEVfTkFNRSwgMSk7Ci0JaWYgKGV4dGVybmFsX2VzcCAmJiBwbGF0Zm9ybV9kZXZpY2VfYWRkKGV4dGVybmFsX2VzcCkpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3B1dChleHRlcm5hbF9lc3ApOwotCQlleHRlcm5hbF9lc3AgPSBOVUxMOwotCX0KLQotCWlmIChpbnRlcm5hbF9lc3AgfHwgZXh0ZXJuYWxfZXNwKSB7CisJaWYgKGludGVybmFsX3BkZXYgfHwgZXh0ZXJuYWxfcGRldikgewogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXNwX21hY19kcml2ZXIpOwpAQCAtNjM4LDEzICs2NzQsMTMgQEAKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXNwX21hY19kcml2ZXIpOwogCi0JaWYgKGludGVybmFsX2VzcCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihpbnRlcm5hbF9lc3ApOwotCQlpbnRlcm5hbF9lc3AgPSBOVUxMOworCWlmIChpbnRlcm5hbF9wZGV2KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGludGVybmFsX3BkZXYpOworCQlpbnRlcm5hbF9wZGV2ID0gTlVMTDsKIAl9Ci0JaWYgKGV4dGVybmFsX2VzcCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihleHRlcm5hbF9lc3ApOwotCQlleHRlcm5hbF9lc3AgPSBOVUxMOworCWlmIChleHRlcm5hbF9wZGV2KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV4dGVybmFsX3BkZXYpOworCQlleHRlcm5hbF9wZGV2ID0gTlVMTDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9uc3AzMi5jIGIvZHJpdmVycy9zY3NpL25zcDMyLmMKaW5kZXggMjIwNTJiYi4uZDA2ZWM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL25zcDMyLmMKKysrIGIvZHJpdmVycy9zY3NpL25zcDMyLmMKQEAgLTM0MDEsOCArMzQwMSw3IEBACiAJZGF0YS0+SXJxTnVtYmVyICAgPSBwZGV2LT5pcnE7CiAJZGF0YS0+QmFzZUFkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJZGF0YS0+TnVtQWRkcmVzcyAgPSBwY2lfcmVzb3VyY2VfbGVuICAocGRldiwgMCk7Ci0JZGF0YS0+TW1pb0FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAotCQkJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbiAgKHBkZXYsIDEpKTsKKwlkYXRhLT5NbWlvQWRkcmVzcyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAxKTsKIAlkYXRhLT5NbWlvTGVuZ3RoICA9IHBjaV9yZXNvdXJjZV9sZW4gIChwZGV2LCAxKTsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKaW5kZXggYjZjZDEyYi4uOGNiOTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCkBAIC00Mjk0LDggKzQyOTQsNyBAQAogCWVycm9yID0gLUVOT0RFVjsKIAogI2lmIE1FTU9SWV9NQVBQRURfSU8KLQloYS0+bW1wYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAxKSwKLQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDEpKTsKKwloYS0+bW1wYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihoYS0+cGRldiwgMSk7CiAJaWYgKCFoYS0+bW1wYmFzZSkgewogCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBVbmFibGUgdG8gbWFwIEkvTyBtZW1vcnlcbiIpOwogCQlnb3RvIGVycm9yX2ZyZWVfcmVzcG9uc2VfcmluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGVkNzMxOTYuLmNkNTM2MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMTksOCArMTksOSBAQAogCQkJICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAogCQkJICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKGhhLT5md19kdW1wX3JlYWRpbmcgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC0zNCw4ICszNSw5IEBACiAJCQkgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAogCQkJICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcmVhZGluZzsKIAogCWlmIChvZmYgIT0gMCkKQEAgLTQ4LDcgKzUwLDcgQEAKIAkJCWJyZWFrOwogCiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkdW1wIGNsZWFyZWQgb24gKCVsZCkuXG4iLCBoYS0+aG9zdF9ubyk7CisJCSAgICAiRmlybXdhcmUgZHVtcCBjbGVhcmVkIG9uICglbGQpLlxuIiwgdmhhLT5ob3N0X25vKTsKIAogCQloYS0+ZndfZHVtcF9yZWFkaW5nID0gMDsKIAkJaGEtPmZ3X2R1bXBlZCA9IDA7CkBAIC01OSwxNCArNjEsMTQgQEAKIAogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJICAgICJSYXcgZmlybXdhcmUgZHVtcCByZWFkeSBmb3IgcmVhZCBvbiAoJWxkKS5cbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8pOworCQkJICAgIHZoYS0+aG9zdF9ubyk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlxbGEyeDAwX2FsbG9jX2Z3X2R1bXAoaGEpOworCQlxbGEyeDAwX2FsbG9jX2Z3X2R1bXAodmhhKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlxbGEyeDAwX3N5c3RlbV9lcnJvcihoYSk7CisJCXFsYTJ4MDBfc3lzdGVtX2Vycm9yKHZoYSk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gKGNvdW50KTsKQEAgLTg3LDggKzg5LDkgQEAKIAkJCSBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQkgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gMDsKQEAgLTEwMyw4ICsxMDYsOSBAQAogCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQkgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MTZfdAljbnQ7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgIT0gaGEtPm52cmFtX3NpemUpCkBAIC0xMzQsMTEgKzEzOCwxMSBAQAogCX0KIAogCS8qIFdyaXRlIE5WUkFNLiAqLwotCWhhLT5pc3Bfb3BzLT53cml0ZV9udnJhbShoYSwgKHVpbnQ4X3QgKilidWYsIGhhLT5udnJhbV9iYXNlLCBjb3VudCk7Ci0JaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0oaGEsICh1aW50OF90ICopaGEtPm52cmFtLCBoYS0+bnZyYW1fYmFzZSwKKwloYS0+aXNwX29wcy0+d3JpdGVfbnZyYW0odmhhLCAodWludDhfdCAqKWJ1ZiwgaGEtPm52cmFtX2Jhc2UsIGNvdW50KTsKKwloYS0+aXNwX29wcy0+cmVhZF9udnJhbSh2aGEsICh1aW50OF90ICopaGEtPm52cmFtLCBoYS0+bnZyYW1fYmFzZSwKIAkgICAgY291bnQpOwogCi0Jc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCiAJcmV0dXJuIChjb3VudCk7CiB9CkBAIC0xNTgsOCArMTYyLDkgQEAKIAkJCSAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAogCQkJICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcpCiAJCXJldHVybiAwOwpAQCAtMTczLDggKzE3OCw5IEBACiAJCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQkgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjAzLDggKzIwOSwxMCBAQAogCQkJICAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKIAkJCSAgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKIAl1aW50MzJfdCBzdGFydCA9IDA7CiAJdWludDMyX3Qgc2l6ZSA9IGhhLT5vcHRyb21fc2l6ZTsKIAlpbnQgdmFsLCB2YWxpZDsKQEAgLTI2Miw3ICsyNzAsNyBAQAogCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpKTsKIAogCQltZW1zZXQoaGEtPm9wdHJvbV9idWZmZXIsIDAsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwotCQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20oaGEsIGhhLT5vcHRyb21fYnVmZmVyLAorCQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCBoYS0+b3B0cm9tX2J1ZmZlciwKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgpAQCAtMzMzLDcgKzM0MSw3IEBACiAJCSAgICAiV3JpdGluZyBmbGFzaCByZWdpb24gLS0gMHgleC8weCV4LlxuIiwKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKSk7CiAKLQkJaGEtPmlzcF9vcHMtPndyaXRlX29wdHJvbShoYSwgaGEtPm9wdHJvbV9idWZmZXIsCisJCWhhLT5pc3Bfb3BzLT53cml0ZV9vcHRyb20odmhhLCBoYS0+b3B0cm9tX2J1ZmZlciwKIAkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM1Niw4ICszNjQsOSBAQAogCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAogCQkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gMDsKQEAgLTM3MSwxNSArMzgwLDE2IEBACiAJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc2hvc3RfcHJpdihkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgIT0gaGEtPnZwZF9zaXplKQogCQlyZXR1cm4gMDsKIAogCS8qIFdyaXRlIE5WUkFNLiAqLwotCWhhLT5pc3Bfb3BzLT53cml0ZV9udnJhbShoYSwgKHVpbnQ4X3QgKilidWYsIGhhLT52cGRfYmFzZSwgY291bnQpOwotCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKGhhLCAodWludDhfdCAqKWhhLT52cGQsIGhhLT52cGRfYmFzZSwgY291bnQpOworCWhhLT5pc3Bfb3BzLT53cml0ZV9udnJhbSh2aGEsICh1aW50OF90ICopYnVmLCBoYS0+dnBkX2Jhc2UsIGNvdW50KTsKKwloYS0+aXNwX29wcy0+cmVhZF9udnJhbSh2aGEsICh1aW50OF90ICopaGEtPnZwZCwgaGEtPnZwZF9iYXNlLCBjb3VudCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zOTksOCArNDA5LDkgQEAKIAkJICAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKIAkJICAgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHNob3N0X3ByaXYoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MTZfdCBpdGVyLCBhZGRyLCBvZmZzZXQ7CiAJaW50IHJ2YWw7CiAKQEAgLTQyOSw3ICs0NDAsNyBAQAogCQkJb2Zmc2V0ID0gMDsKIAkJfQogCi0JCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKGhhLCBoYS0+c2ZwX2RhdGFfZG1hLCBhZGRyLCBvZmZzZXQsCisJCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgaGEtPnNmcF9kYXRhX2RtYSwgYWRkciwgb2Zmc2V0LAogCQkgICAgU0ZQX0JMT0NLX1NJWkUpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLApAQCAtNDY5LDMwICs0ODAsMzEgQEAKIH07CiAKIHZvaWQKLXFsYTJ4MDBfYWxsb2Nfc3lzZnNfYXR0cihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBoYS0+aG9zdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gdmhhLT5ob3N0OwogCXN0cnVjdCBzeXNmc19lbnRyeSAqaXRlcjsKIAlpbnQgcmV0OwogCiAJZm9yIChpdGVyID0gYmluX2ZpbGVfZW50cmllczsgaXRlci0+bmFtZTsgaXRlcisrKSB7Ci0JCWlmIChpdGVyLT5pczRHQnBfb25seSAmJiAhSVNfRldJMl9DQVBBQkxFKGhhKSkKKwkJaWYgKGl0ZXItPmlzNEdCcF9vbmx5ICYmICFJU19GV0kyX0NBUEFCTEUodmhhLT5odykpCiAJCQljb250aW51ZTsKIAogCQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAogCQkgICAgaXRlci0+YXR0cik7CiAJCWlmIChyZXQpCi0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywKIAkJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlcyBiaW5hcnkgYXR0cmlidXRlICIKIAkJCSAgICAiKCVkKS5cbiIsIGl0ZXItPm5hbWUsIHJldCk7CiAJfQogfQogCiB2b2lkCi1xbGEyeDAwX2ZyZWVfc3lzZnNfYXR0cihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9mcmVlX3N5c2ZzX2F0dHIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGhhLT5ob3N0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSB2aGEtPmhvc3Q7CiAJc3RydWN0IHN5c2ZzX2VudHJ5ICppdGVyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJZm9yIChpdGVyID0gYmluX2ZpbGVfZW50cmllczsgaXRlci0+bmFtZTsgaXRlcisrKSB7CiAJCWlmIChpdGVyLT5pczRHQnBfb25seSAmJiAhSVNfRldJMl9DQVBBQkxFKGhhKSkKQEAgLTUwMyw3ICs1MTUsNyBAQAogCX0KIAogCWlmIChoYS0+YmVhY29uX2JsaW5rX2xlZCA9PSAxKQotCQloYS0+aXNwX29wcy0+YmVhY29uX29mZihoYSk7CisJCWhhLT5pc3Bfb3BzLT5iZWFjb25fb2ZmKHZoYSk7CiB9CiAKIC8qIFNjc2lfSG9zdCBhdHRyaWJ1dGVzLiAqLwpAQCAtNTE5LDIyICs1MzEsMjQgQEAKIHFsYTJ4MDBfZndfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7Ci0JY2hhciBmd19zdHJbMzBdOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwljaGFyIGZ3X3N0clsxMjhdOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCi0JICAgIGhhLT5pc3Bfb3BzLT5md192ZXJzaW9uX3N0cihoYSwgZndfc3RyKSk7CisJICAgIGhhLT5pc3Bfb3BzLT5md192ZXJzaW9uX3N0cih2aGEsIGZ3X3N0cikpOwogfQogCiBzdGF0aWMgc3NpemVfdAogcWxhMngwMF9zZXJpYWxfbnVtX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdWludDMyX3Qgc247CiAKIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewotCQlxbGEyeHh4X2dldF92cGRfZmllbGQoaGEsICJTTiIsIGJ1ZiwgUEFHRV9TSVpFKTsKKwkJcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKHZoYSwgIlNOIiwgYnVmLCBQQUdFX1NJWkUpOwogCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgYnVmKTsKIAl9CiAKQEAgLTU0NywxNSArNTYxLDE2IEBACiBxbGEyeDAwX2lzcF9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICAgICAgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIklTUCUwNFhcbiIsIGhhLT5wZGV2LT5kZXZpY2UpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJJU1AlMDRYXG4iLCB2aGEtPmh3LT5wZGV2LT5kZXZpY2UpOwogfQogCiBzdGF0aWMgc3NpemVfdAogcWxhMngwMF9pc3BfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAogCSAgICBoYS0+cHJvZHVjdF9pZFswXSwgaGEtPnByb2R1Y3RfaWRbMV0sIGhhLT5wcm9kdWN0X2lkWzJdLAogCSAgICBoYS0+cHJvZHVjdF9pZFszXSk7CkBAIC01NjUsNDMgKzU4MCw0NCBAQAogcWxhMngwMF9tb2RlbF9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgaGEtPm1vZGVsX251bWJlcik7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCB2aGEtPmh3LT5tb2RlbF9udW1iZXIpOwogfQogCiBzdGF0aWMgc3NpemVfdAogcWxhMngwMF9tb2RlbF9kZXNjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCi0JICAgIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2M6ICIiKTsKKwkgICAgdmhhLT5ody0+bW9kZWxfZGVzYyA/IHZoYS0+aHctPm1vZGVsX2Rlc2MgOiAiIik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CiBxbGEyeDAwX3BjaV9pbmZvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICAgICAgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKIAljaGFyIHBjaV9pbmZvWzMwXTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAotCSAgICBoYS0+aXNwX29wcy0+cGNpX2luZm9fc3RyKGhhLCBwY2lfaW5mbykpOworCSAgICB2aGEtPmh3LT5pc3Bfb3BzLT5wY2lfaW5mb19zdHIodmhhLCBwY2lfaW5mbykpOwogfQogCiBzdGF0aWMgc3NpemVfdAogcWxhMngwMF9saW5rX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IGxlbiA9IDA7CiAKLQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04gfHwKLQkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpCisJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTiB8fAorCSAgICBhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpCiAJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiTGluayBEb3duXG4iKTsKLQllbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfUkVBRFkgfHwKLQkgICAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwllbHNlIGlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX1JFQURZIHx8CisJICAgIHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKIAkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJVbmtub3duIExpbmsgU3RhdGVcbiIpOwogCWVsc2UgewogCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIkxpbmsgVXAgLSAiKTsKQEAgLTYzMiwxMCArNjQ4LDEwIEBACiBxbGEyeDAwX3ppb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCSBjaGFyICpidWYpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOwogCWludCBsZW4gPSAwOwogCi0Jc3dpdGNoIChoYS0+emlvX21vZGUpIHsKKwlzd2l0Y2ggKHZoYS0+aHctPnppb19tb2RlKSB7CiAJY2FzZSBRTEFfWklPX01PREVfNjoKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIk1vZGUgNlxuIik7CiAJCWJyZWFrOwpAQCAtNjUwLDcgKzY2Niw4IEBACiBxbGEyeDAwX3ppb19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgdmFsID0gMDsKIAl1aW50MTZfdCB6aW9fbW9kZTsKIApAQCAtNjY4LDcgKzY4NSw3IEBACiAJLyogVXBkYXRlIHBlci1oYmEgdmFsdWVzIGFuZCBxdWV1ZSBhIHJlc2V0LiAqLwogCWlmICh6aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEIHx8IGhhLT56aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEKSB7CiAJCWhhLT56aW9fbW9kZSA9IHppb19tb2RlOwotCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCX0KIAlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CkBAIC02NzcsMTYgKzY5NCwxNiBAQAogcWxhMngwMF96aW9fdGltZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICAgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkIHVzXG4iLCBoYS0+emlvX3RpbWVyICogMTAwKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCB1c1xuIiwgdmhhLT5ody0+emlvX3RpbWVyICogMTAwKTsKIH0KIAogc3RhdGljIHNzaXplX3QKIHFsYTJ4MDBfemlvX3RpbWVyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CiAJaW50IHZhbCA9IDA7CiAJdWludDE2X3QgemlvX3RpbWVyOwogCkBAIC02OTYsNyArNzEzLDcgQEAKIAkJcmV0dXJuIC1FUkFOR0U7CiAKIAl6aW9fdGltZXIgPSAodWludDE2X3QpKHZhbCAvIDEwMCk7Ci0JaGEtPnppb190aW1lciA9IHppb190aW1lcjsKKwl2aGEtPmh3LT56aW9fdGltZXIgPSB6aW9fdGltZXI7CiAKIAlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CkBAIC03MDUsMTAgKzcyMiwxMCBAQAogcWxhMngwMF9iZWFjb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKIAlpbnQgbGVuID0gMDsKIAotCWlmIChoYS0+YmVhY29uX2JsaW5rX2xlZCkKKwlpZiAodmhhLT5ody0+YmVhY29uX2JsaW5rX2xlZCkKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIkVuYWJsZWRcbiIpOwogCWVsc2UKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFLWxlbiwgIkRpc2FibGVkXG4iKTsKQEAgLTcxOSwxNCArNzM2LDE1IEBACiBxbGEyeDAwX2JlYWNvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgdmFsID0gMDsKIAlpbnQgcnZhbDsKIAogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiQWJvcnQgSVNQIGFjdGl2ZSAtLSBpZ25vcmluZyBiZWFjb24gcmVxdWVzdC5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNzM2LDkgKzc1NCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHZhbCkKLQkJcnZhbCA9IGhhLT5pc3Bfb3BzLT5iZWFjb25fb24oaGEpOworCQlydmFsID0gaGEtPmlzcF9vcHMtPmJlYWNvbl9vbih2aGEpOwogCWVsc2UKLQkJcnZhbCA9IGhhLT5pc3Bfb3BzLT5iZWFjb25fb2ZmKGhhKTsKKwkJcnZhbCA9IGhhLT5pc3Bfb3BzLT5iZWFjb25fb2ZmKHZoYSk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJY291bnQgPSAwOwpAQCAtNzUwLDggKzc2OCw4IEBACiBxbGEyeDAwX29wdHJvbV9iaW9zX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7Ci0KKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAyZFxuIiwgaGEtPmJpb3NfcmV2aXNpb25bMV0sCiAJICAgIGhhLT5iaW9zX3JldmlzaW9uWzBdKTsKIH0KQEAgLTc2MCw4ICs3NzgsOCBAQAogcWxhMngwMF9vcHRyb21fZWZpX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKLQorCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbGFzc190b19zaG9zdChkZXYpKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZC4lMDJkXG4iLCBoYS0+ZWZpX3JldmlzaW9uWzFdLAogCSAgICBoYS0+ZWZpX3JldmlzaW9uWzBdKTsKIH0KQEAgLTc3MCw4ICs3ODgsOCBAQAogcWxhMngwMF9vcHRyb21fZmNvZGVfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7Ci0KKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAyZFxuIiwgaGEtPmZjb2RlX3JldmlzaW9uWzFdLAogCSAgICBoYS0+ZmNvZGVfcmV2aXNpb25bMF0pOwogfQpAQCAtNzgwLDggKzc5OCw4IEBACiBxbGEyeDAwX29wdHJvbV9md192ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7Ci0KKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAyZC4lMDJkICVkXG4iLAogCSAgICBoYS0+ZndfcmV2aXNpb25bMF0sIGhhLT5md19yZXZpc2lvblsxXSwgaGEtPmZ3X3JldmlzaW9uWzJdLAogCSAgICBoYS0+ZndfcmV2aXNpb25bM10pOwpAQCAtNzkxLDggKzgwOSw4IEBACiBxbGEyeDAwX3RvdGFsX2lzcF9hYm9ydHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOwotCisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAogCSAgICBoYS0+cWxhX3N0YXRzLnRvdGFsX2lzcF9hYm9ydHMpOwogfQpAQCAtODQ4LDE2ICs4NjYsMTcgQEAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2dldF9ob3N0X3BvcnRfaWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CiAKLQlmY19ob3N0X3BvcnRfaWQoc2hvc3QpID0gaGEtPmRfaWQuYi5kb21haW4gPDwgMTYgfAotCSAgICBoYS0+ZF9pZC5iLmFyZWEgPDwgOCB8IGhhLT5kX2lkLmIuYWxfcGE7CisJZmNfaG9zdF9wb3J0X2lkKHNob3N0KSA9IHZoYS0+ZF9pZC5iLmRvbWFpbiA8PCAxNiB8CisJICAgIHZoYS0+ZF9pZC5iLmFyZWEgPDwgOCB8IHZoYS0+ZF9pZC5iLmFsX3BhOwogfQogCiBzdGF0aWMgdm9pZAogcWxhMngwMF9nZXRfaG9zdF9zcGVlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX3BhcmVudChzaG9zdF9wcml2KHNob3N0KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9ICgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKikKKwkJCQkJKHNob3N0X3ByaXYoc2hvc3QpKSktPmh3OwogCXUzMiBzcGVlZCA9IEZDX1BPUlRTUEVFRF9VTktOT1dOOwogCiAJc3dpdGNoIChoYS0+bGlua19kYXRhX3JhdGUpIHsKQEAgLTg4MCwxNCArODk5LDE0IEBACiBzdGF0aWMgdm9pZAogcWxhMngwMF9nZXRfaG9zdF9wb3J0X3R5cGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJdWludDMyX3QgcG9ydF90eXBlID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKIAotCWlmIChoYS0+cGFyZW50KSB7CisJaWYgKHZoYS0+dnBfaWR4KSB7CiAJCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX05QSVY7CiAJCXJldHVybjsKIAl9Ci0Jc3dpdGNoIChoYS0+Y3VycmVudF90b3BvbG9neSkgeworCXN3aXRjaCAodmhhLT5ody0+Y3VycmVudF90b3BvbG9neSkgewogCWNhc2UgSVNQX0NGR19OTDoKIAkJcG9ydF90eXBlID0gRkNfUE9SVFRZUEVfTFBPUlQ7CiAJCWJyZWFrOwpAQCAtOTA4LDExICs5MjcsMTEgQEAKIHFsYTJ4MDBfZ2V0X3N0YXJnZXRfbm9kZV9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihob3N0KTsKIAlmY19wb3J0X3QgKmZjcG9ydDsKIAl1NjQgbm9kZV9uYW1lID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewogCQlpZiAoZmNwb3J0LT5ycG9ydCAmJgogCQkgICAgc3RhcmdldC0+aWQgPT0gZmNwb3J0LT5ycG9ydC0+c2NzaV90YXJnZXRfaWQpIHsKIAkJCW5vZGVfbmFtZSA9IHd3bl90b191NjQoZmNwb3J0LT5ub2RlX25hbWUpOwpAQCAtOTI3LDExICs5NDYsMTEgQEAKIHFsYTJ4MDBfZ2V0X3N0YXJnZXRfcG9ydF9uYW1lKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihob3N0KTsKIAlmY19wb3J0X3QgKmZjcG9ydDsKIAl1NjQgcG9ydF9uYW1lID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewogCQlpZiAoZmNwb3J0LT5ycG9ydCAmJgogCQkgICAgc3RhcmdldC0+aWQgPT0gZmNwb3J0LT5ycG9ydC0+c2NzaV90YXJnZXRfaWQpIHsKIAkJCXBvcnRfbmFtZSA9IHd3bl90b191NjQoZmNwb3J0LT5wb3J0X25hbWUpOwpAQCAtOTQ2LDExICs5NjUsMTEgQEAKIHFsYTJ4MDBfZ2V0X3N0YXJnZXRfcG9ydF9pZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoaG9zdCk7CiAJZmNfcG9ydF90ICpmY3BvcnQ7CiAJdWludDMyX3QgcG9ydF9pZCA9IH4wVTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewogCQlpZiAoZmNwb3J0LT5ycG9ydCAmJgogCQkgICAgc3RhcmdldC0+aWQgPT0gZmNwb3J0LT5ycG9ydC0+c2NzaV90YXJnZXRfaWQpIHsKIAkJCXBvcnRfaWQgPSBmY3BvcnQtPmRfaWQuYi5kb21haW4gPDwgMTYgfApAQCAtOTk5LDkgKzEwMTgsOSBAQAogCSAqIGZpbmFsIGNsZWFudXAgb2YgZmlybXdhcmUgcmVzb3VyY2VzIChQQ0JzIGFuZCBYQ0JzKS4KIAkgKi8KIAlpZiAoZmNwb3J0LT5sb29wX2lkICE9IEZDX05PX0xPT1BfSUQpIHsKLQkJZmNwb3J0LT5oYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dChmY3BvcnQtPmhhLCBmY3BvcnQtPmxvb3BfaWQsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CisJCWZjcG9ydC0+dmhhLT5ody0+aXNwX29wcy0+ZmFicmljX2xvZ291dChmY3BvcnQtPnZoYSwKKwkJCWZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOwogCX0KIApAQCAtMTAxMSwxNiArMTAzMCwxOCBAQAogc3RhdGljIGludAogcWxhMngwMF9pc3N1ZV9saXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CiAKLQlxbGEyeDAwX2xvb3BfcmVzZXQoaGEpOworCXFsYTJ4MDBfbG9vcF9yZXNldCh2aGEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqCiBxbGEyeDAwX2dldF9mY19ob3N0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfcGFyZW50KHNob3N0X3ByaXYoc2hvc3QpKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJaW50IHJ2YWw7CiAJc3RydWN0IGxpbmtfc3RhdGlzdGljcyAqc3RhdHM7CiAJZG1hX2FkZHJfdCBzdGF0c19kbWE7CkBAIC0xMDMyLDIxICsxMDUzLDIxIEBACiAJc3RhdHMgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnN0YXRzX2RtYSk7CiAJaWYgKHN0YXRzID09IE5VTEwpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5LlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAJbWVtc2V0KHN0YXRzLCAwLCBETUFfUE9PTF9TSVpFKTsKIAogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCXJ2YWwgPSBxbGEyNHh4X2dldF9pc3Bfc3RhdHMoaGEsIHN0YXRzLCBzdGF0c19kbWEpOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1JFQURZICYmCi0JCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpICYmCi0JCSAgICAhdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpICYmCisJCXJ2YWwgPSBxbGEyNHh4X2dldF9pc3Bfc3RhdHMoYmFzZV92aGEsIHN0YXRzLCBzdGF0c19kbWEpOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1JFQURZICYmCisJCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpICYmCisJCSAgICAhdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpICYmCiAJCSAgICAhaGEtPmRwY19hY3RpdmUpIHsKIAkJLyogTXVzdCBiZSBpbiBhICdSRUFEWScgc3RhdGUgZm9yIHN0YXRpc3RpY3MgcmV0cmlldmFsLiAqLwotCQlydmFsID0gcWxhMngwMF9nZXRfbGlua19zdGF0dXMoaGEsIGhhLT5sb29wX2lkLCBzdGF0cywKLQkJICAgIHN0YXRzX2RtYSk7CisJCXJ2YWwgPSBxbGEyeDAwX2dldF9saW5rX3N0YXR1cyhiYXNlX3ZoYSwgYmFzZV92aGEtPmxvb3BfaWQsCisJCQkJCQlzdGF0cywgc3RhdHNfZG1hKTsKIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKQEAgLTEwNzcsMjkgKzEwOTgsMjkgQEAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2dldF9ob3N0X3N5bWJvbGljX25hbWUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CiAKLQlxbGEyeDAwX2dldF9zeW1fbm9kZV9uYW1lKGhhLCBmY19ob3N0X3N5bWJvbGljX25hbWUoc2hvc3QpKTsKKwlxbGEyeDAwX2dldF9zeW1fbm9kZV9uYW1lKHZoYSwgZmNfaG9zdF9zeW1ib2xpY19uYW1lKHNob3N0KSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX3NldF9ob3N0X3N5c3RlbV9ob3N0bmFtZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KHNob3N0KTsKIAotCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwlzZXRfYml0KFJFR0lTVEVSX0ZETUlfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogcWxhMngwMF9nZXRfaG9zdF9mYWJyaWNfbmFtZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KHNob3N0KTsKIAl1NjQgbm9kZV9uYW1lOwogCi0JaWYgKGhhLT5kZXZpY2VfZmxhZ3MgJiBTV0lUQ0hfRk9VTkQpCi0JCW5vZGVfbmFtZSA9IHd3bl90b191NjQoaGEtPmZhYnJpY19ub2RlX25hbWUpOworCWlmICh2aGEtPmRldmljZV9mbGFncyAmIFNXSVRDSF9GT1VORCkKKwkJbm9kZV9uYW1lID0gd3duX3RvX3U2NCh2aGEtPmZhYnJpY19ub2RlX25hbWUpOwogCWVsc2UKLQkJbm9kZV9uYW1lID0gd3duX3RvX3U2NChoYS0+bm9kZV9uYW1lKTsKKwkJbm9kZV9uYW1lID0gd3duX3RvX3U2NCh2aGEtPm5vZGVfbmFtZSk7CiAKIAlmY19ob3N0X2ZhYnJpY19uYW1lKHNob3N0KSA9IG5vZGVfbmFtZTsKIH0KQEAgLTExMDcsMTEgKzExMjgsMTIgQEAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2dldF9ob3N0X3BvcnRfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9wYXJlbnQoc2hvc3RfcHJpdihzaG9zdCkpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKHZoYS0+aHctPnBkZXYpOwogCi0JaWYgKCFoYS0+ZmxhZ3Mub25saW5lKQorCWlmICghYmFzZV92aGEtPmZsYWdzLm9ubGluZSkKIAkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9PRkZMSU5FOwotCWVsc2UgaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9USU1FT1VUKQorCWVsc2UgaWYgKGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9USU1FT1VUKQogCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX1VOS05PV047CiAJZWxzZQogCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX09OTElORTsKQEAgLTExMjEsOCArMTE0MywxMSBAQAogcWxhMjR4eF92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICpmY192cG9ydCwgYm9vbCBkaXNhYmxlKQogewogCWludAlyZXQgPSAwOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGZjX3Zwb3J0LT5zaG9zdCk7Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGE7CisJaW50CWNudCA9IDA7CisJdWludDhfdAlxb3MgPSBRTEFfREVGQVVMVF9RVUVfUU9TOworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBzaG9zdF9wcml2KGZjX3Zwb3J0LT5zaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBOVUxMOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBiYXNlX3ZoYS0+aHc7CiAKIAlyZXQgPSBxbGEyNHh4X3Zwb3J0X2NyZWF0ZV9yZXFfc2FuaXR5X2NoZWNrKGZjX3Zwb3J0KTsKIAlpZiAocmV0KSB7CkBAIC0xMTQ0LDE4ICsxMTY5LDE5IEBACiAJCWF0b21pY19zZXQoJnZoYS0+dnBfc3RhdGUsIFZQX0ZBSUxFRCk7CiAKIAkvKiByZWFkeSB0byBjcmVhdGUgdnBvcnQgKi8KLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLCAiVlAgZW50cnkgaWQgJWQgYXNzaWduZWQuXG4iLCB2aGEtPnZwX2lkeCk7CisJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJWUCBlbnRyeSBpZCAlZCBhc3NpZ25lZC5cbiIsCisJCQkJCQkJdmhhLT52cF9pZHgpOwogCiAJLyogaW5pdGlhbGl6ZWQgdnBvcnQgc3RhdGVzICovCiAJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwogCXZoYS0+dnBfZXJyX3N0YXRlPSAgVlBfRVJSX1BPUlREV047CiAJdmhhLT52cF9wcmV2X2Vycl9zdGF0ZT0gIFZQX0VSUl9VTktXTjsKIAkvKiBDaGVjayBpZiBwaHlzaWNhbCBoYSBwb3J0IGlzIFVwICovCi0JaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOIHx8Ci0JICAgIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJaWYgKGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOIHx8CisJICAgIGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CiAJCS8qIERvbid0IHJldHJ5IG9yIGF0dGVtcHQgbG9naW4gb2YgdGhpcyB2aXJ0dWFsIHBvcnQgKi8KIAkJREVCVUcxNShwcmludGsgKCJzY3NpKCVsZCk6IHBwb3J0IGxvb3Bfc3RhdGUgaXMgbm90IFVQLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RFQUQpOwogCQlpZiAoIWRpc2FibGUpCiAJCQlmY192cG9ydF9zZXRfc3RhdGUoZmNfdnBvcnQsIEZDX1ZQT1JUX0xJTktET1dOKTsKQEAgLTExNzEsMTggKzExOTcsMzIgQEAKIAlmY19ob3N0X25vZGVfbmFtZSh2aGEtPmhvc3QpID0gd3duX3RvX3U2NCh2aGEtPm5vZGVfbmFtZSk7CiAJZmNfaG9zdF9wb3J0X25hbWUodmhhLT5ob3N0KSA9IHd3bl90b191NjQodmhhLT5wb3J0X25hbWUpOwogCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXModmhhLT5ob3N0KSA9Ci0JCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoaGEtPmhvc3QpOworCQlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKGJhc2VfdmhhLT5ob3N0KTsKIAlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHModmhhLT5ob3N0KSA9Ci0JCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhoYS0+aG9zdCk7CisJCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhiYXNlX3ZoYS0+aG9zdCk7CiAKIAlxbGEyNHh4X3Zwb3J0X2Rpc2FibGUoZmNfdnBvcnQsIGRpc2FibGUpOwogCisJLyogQ3JlYXRlIGEgcXVldWUgcGFpciBmb3IgdGhlIHZwb3J0ICovCisJaWYgKGhhLT5tcWVuYWJsZSkgeworCQlpZiAoaGEtPm5waXZfaW5mbykgeworCQkJZm9yICg7IGNudCA8IGhhLT5udnJhbV9ucGl2X3NpemU7IGNudCsrKSB7CisJCQkJaWYgKGhhLT5ucGl2X2luZm9bY250XS5wb3J0X25hbWUgPT0KKwkJCQkJdmhhLT5wb3J0X25hbWUgJiYKKwkJCQkJaGEtPm5waXZfaW5mb1tjbnRdLm5vZGVfbmFtZSA9PQorCQkJCQl2aGEtPm5vZGVfbmFtZSkgeworCQkJCQlxb3MgPSBoYS0+bnBpdl9pbmZvW2NudF0ucV9xb3M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlxbGEyNXh4X2NyZWF0ZV9xdWV1ZXModmhhLCBxb3MpOworCX0KKwogCXJldHVybiAwOwogdnBvcnRfY3JlYXRlX2ZhaWxlZF8yOgogCXFsYTI0eHhfZGlzYWJsZV92cCh2aGEpOwogCXFsYTI0eHhfZGVhbGxvY2F0ZV92cF9pZCh2aGEpOwotCWtmcmVlKHZoYS0+cG9ydF9uYW1lKTsKLQlrZnJlZSh2aGEtPm5vZGVfbmFtZSk7CiAJc2NzaV9ob3N0X3B1dCh2aGEtPmhvc3QpOwogCXJldHVybiBGQ19WUE9SVF9GQUlMRUQ7CiB9CkBAIC0xMTkxLDE3ICsxMjMxLDM0IEBACiBxbGEyNHh4X3Zwb3J0X2RlbGV0ZShzdHJ1Y3QgZmNfdnBvcnQgKmZjX3Zwb3J0KQogewogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gZmNfdnBvcnQtPmRkX2RhdGE7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KHZoYSk7CisJZmNfcG9ydF90ICpmY3BvcnQsICp0ZmNwb3J0OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQxNl90IGlkID0gdmhhLT52cF9pZHg7CiAKIAl3aGlsZSAodGVzdF9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmcGhhLT5kcGNfZmxhZ3MpKQorCSAgICB0ZXN0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKIAkJbXNsZWVwKDEwMDApOwogCi0JcWxhMjR4eF9kaXNhYmxlX3ZwKHZoYSk7Ci0JcWxhMjR4eF9kZWFsbG9jYXRlX3ZwX2lkKHZoYSk7CisJaWYgKGhhLT5tcWVuYWJsZSkgeworCQlpZiAocWxhMjV4eF9kZWxldGVfcXVldWVzKHZoYSwgMCkgIT0gUUxBX1NVQ0NFU1MpCisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJIlF1ZXVlIGRlbGV0ZSBmYWlsZWQuXG4iKTsKKwkJdmhhLT5yZXFfcXVlc1swXSA9IGhhLT5yZXFfcV9tYXBbMF0tPmlkOworCX0KIAotCWtmcmVlKHZoYS0+bm9kZV9uYW1lKTsKLQlrZnJlZSh2aGEtPnBvcnRfbmFtZSk7CisJcWxhMjR4eF9kaXNhYmxlX3ZwKHZoYSk7CisKKwlmY19yZW1vdmVfaG9zdCh2aGEtPmhvc3QpOworCisJc2NzaV9yZW1vdmVfaG9zdCh2aGEtPmhvc3QpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgdGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmZmNwb3J0LT5saXN0KTsKKwkJa2ZyZWUoZmNwb3J0KTsKKwkJZmNwb3J0ID0gTlVMTDsKKwl9CisKKwlxbGEyNHh4X2RlYWxsb2NhdGVfdnBfaWQodmhhKTsKIAogCWlmICh2aGEtPnRpbWVyX2FjdGl2ZSkgewogCQlxbGEyeDAwX3ZwX3N0b3BfdGltZXIodmhhKTsKQEAgLTEyMTAsMTIgKzEyNjcsOCBAQAogCQkgICAgdmhhLT5ob3N0X25vLCB2aGEtPnZwX2lkeCwgdmhhKSk7CiAgICAgICAgIH0KIAotCWZjX3JlbW92ZV9ob3N0KHZoYS0+aG9zdCk7Ci0KLQlzY3NpX3JlbW92ZV9ob3N0KHZoYS0+aG9zdCk7Ci0KIAlzY3NpX2hvc3RfcHV0KHZoYS0+aG9zdCk7Ci0KKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJ2cG9ydCAlZCBkZWxldGVkXG4iLCBpZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMTgsMTUgKzEzNzEsMTYgQEAKIH07CiAKIHZvaWQKLXFsYTJ4MDBfaW5pdF9ob3N0X2F0dHIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfaW5pdF9ob3N0X2F0dHIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdTMyIHNwZWVkID0gRkNfUE9SVFNQRUVEX1VOS05PV047CiAKLQlmY19ob3N0X25vZGVfbmFtZShoYS0+aG9zdCkgPSB3d25fdG9fdTY0KGhhLT5ub2RlX25hbWUpOwotCWZjX2hvc3RfcG9ydF9uYW1lKGhhLT5ob3N0KSA9IHd3bl90b191NjQoaGEtPnBvcnRfbmFtZSk7Ci0JZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyhoYS0+aG9zdCkgPSBGQ19DT1NfQ0xBU1MzOwotCWZjX2hvc3RfbWF4X25waXZfdnBvcnRzKGhhLT5ob3N0KSA9IGhhLT5tYXhfbnBpdl92cG9ydHM7OwotCWZjX2hvc3RfbnBpdl92cG9ydHNfaW51c2UoaGEtPmhvc3QpID0gaGEtPmN1cl92cG9ydF9jb3VudDsKKwlmY19ob3N0X25vZGVfbmFtZSh2aGEtPmhvc3QpID0gd3duX3RvX3U2NCh2aGEtPm5vZGVfbmFtZSk7CisJZmNfaG9zdF9wb3J0X25hbWUodmhhLT5ob3N0KSA9IHd3bl90b191NjQodmhhLT5wb3J0X25hbWUpOworCWZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXModmhhLT5ob3N0KSA9IEZDX0NPU19DTEFTUzM7CisJZmNfaG9zdF9tYXhfbnBpdl92cG9ydHModmhhLT5ob3N0KSA9IGhhLT5tYXhfbnBpdl92cG9ydHM7CisJZmNfaG9zdF9ucGl2X3Zwb3J0c19pbnVzZSh2aGEtPmhvc3QpID0gaGEtPmN1cl92cG9ydF9jb3VudDsKIAogCWlmIChJU19RTEEyNVhYKGhhKSkKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfOEdCSVQgfCBGQ19QT1JUU1BFRURfNEdCSVQgfApAQCAtMTMzOCw1ICsxMzkyLDUgQEAKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMkdCSVQgfCBGQ19QT1JUU1BFRURfMUdCSVQ7CiAJZWxzZQogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xR0JJVDsKLQlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMoaGEtPmhvc3QpID0gc3BlZWQ7CisJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHZoYS0+aG9zdCkgPSBzcGVlZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCA1MTBiYTY0Li4xY2Y3Nzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMnh4eF9wcmVwX2R1bXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IHFsYTJ4eHhfZndfZHVtcCAqZndfZHVtcCkKK3FsYTJ4eHhfcHJlcF9kdW1wKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAgKmZ3X2R1bXApCiB7CiAJZndfZHVtcC0+ZndfbWFqb3JfdmVyc2lvbiA9IGh0b25sKGhhLT5md19tYWpvcl92ZXJzaW9uKTsKIAlmd19kdW1wLT5md19taW5vcl92ZXJzaW9uID0gaHRvbmwoaGEtPmZ3X21pbm9yX3ZlcnNpb24pOwpAQCAtMjMsMjIgKzIzLDI0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqCi1xbGEyeHh4X2NvcHlfcXVldWVzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHZvaWQgKnB0cikKK3FsYTJ4eHhfY29weV9xdWV1ZXMoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdm9pZCAqcHRyKQogeworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOworCXN0cnVjdCByc3BfcXVlICpyc3AgPSBoYS0+cnNwX3FfbWFwWzBdOwogCS8qIFJlcXVlc3QgcXVldWUuICovCi0JbWVtY3B5KHB0ciwgaGEtPnJlcXVlc3RfcmluZywgaGEtPnJlcXVlc3RfcV9sZW5ndGggKgorCW1lbWNweShwdHIsIHJlcS0+cmluZywgcmVxLT5sZW5ndGggKgogCSAgICBzaXplb2YocmVxdWVzdF90KSk7CiAKIAkvKiBSZXNwb25zZSBxdWV1ZS4gKi8KLQlwdHIgKz0gaGEtPnJlcXVlc3RfcV9sZW5ndGggKiBzaXplb2YocmVxdWVzdF90KTsKLQltZW1jcHkocHRyLCBoYS0+cmVzcG9uc2VfcmluZywgaGEtPnJlc3BvbnNlX3FfbGVuZ3RoICAqCisJcHRyICs9IHJlcS0+bGVuZ3RoICogc2l6ZW9mKHJlcXVlc3RfdCk7CisJbWVtY3B5KHB0ciwgcnNwLT5yaW5nLCByc3AtPmxlbmd0aCAgKgogCSAgICBzaXplb2YocmVzcG9uc2VfdCkpOwogCi0JcmV0dXJuIHB0ciArIChoYS0+cmVzcG9uc2VfcV9sZW5ndGggKiBzaXplb2YocmVzcG9uc2VfdCkpOworCXJldHVybiBwdHIgKyAocnNwLT5sZW5ndGggKiBzaXplb2YocmVzcG9uc2VfdCkpOwogfQogCiBzdGF0aWMgaW50Ci1xbGEyNHh4X2R1bXBfcmFtKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpyYW0sCitxbGEyNHh4X2R1bXBfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpyYW0sCiAgICAgdWludDMyX3QgcmFtX2R3b3Jkcywgdm9pZCAqKm54dCkKIHsKIAlpbnQgcnZhbDsKQEAgLTExMiw3ICsxMTQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyNHh4X2R1bXBfbWVtb3J5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90ICpjb2RlX3JhbSwKK3FsYTI0eHhfZHVtcF9tZW1vcnkoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgKmNvZGVfcmFtLAogICAgIHVpbnQzMl90IGNyYW1fc2l6ZSwgdm9pZCAqKm54dCkKIHsKIAlpbnQgcnZhbDsKQEAgLTE2Myw3ICsxNjUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyNHh4X3NvZnRfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTI0eHhfc29mdF9yZXNldChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CiAJdWludDMyX3QgY250OwpAQCAtMjE1LDggKzIxNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLXFsYTJ4eHhfZHVtcF9yYW0oc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDE2X3QgKnJhbSwKLSAgICB1aW50MzJfdCByYW1fd29yZHMsIHZvaWQgKipueHQpCitxbGEyeHh4X2R1bXBfcmFtKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQxNl90ICpyYW0sCisgICAgdWludDE2X3QgcmFtX3dvcmRzLCB2b2lkICoqbnh0KQogewogCWludCBydmFsOwogCXVpbnQzMl90IGNudCwgc3RhdCwgdGltZXIsIHdvcmRzLCBpZHg7CkBAIC0zMTQsMTYgKzMxNiwxNyBAQAogICogQGhhcmR3YXJlX2xvY2tlZDogQ2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlX2xvY2sKICAqLwogdm9pZAotcWxhMjMwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCitxbGEyMzAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCiB7CiAJaW50CQlydmFsOwogCXVpbnQzMl90CWNudDsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MTZfdCBfX2lvbWVtICpkbXBfcmVnOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJc3RydWN0IHFsYTIzMDBfZndfZHVtcAkqZnc7CiAJdm9pZAkJKm54dDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJZmxhZ3MgPSAwOwogCkBAIC00NjgsNyArNDcxLDcgQEAKIAl9IGVsc2UgewogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOworCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKIAkJaGEtPmZ3X2R1bXBlZCA9IDE7CiAJfQogCkBAIC00ODMsMTYgKzQ4NiwxOCBAQAogICogQGhhcmR3YXJlX2xvY2tlZDogQ2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlX2xvY2sKICAqLwogdm9pZAotcWxhMjEwMF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCitxbGEyMTAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCiB7CiAJaW50CQlydmFsOwogCXVpbnQzMl90CWNudCwgdGltZXI7CiAJdWludDE2X3QJcmlzY19hZGRyZXNzOwogCXVpbnQxNl90CW1iMCwgbWIyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MTZfdCBfX2lvbWVtICpkbXBfcmVnOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJc3RydWN0IHFsYTIxMDBfZndfZHVtcAkqZnc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJpc2NfYWRkcmVzcyA9IDA7CiAJbWIwID0gbWIyID0gMDsKQEAgLTY3Myw3ICs2NzgsNyBAQAogCX0gZWxzZSB7CiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXApLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7CisJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOwogCQloYS0+ZndfZHVtcGVkID0gMTsKIAl9CiAKQEAgLTY4MywxMiArNjg4LDEyIEBACiB9CiAKIHZvaWQKLXFsYTI0eHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQorcWxhMjR4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQogewogCWludAkJcnZhbDsKIAl1aW50MzJfdAljbnQ7CiAJdWludDMyX3QJcmlzY19hZGRyZXNzOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAJdWludDMyX3QgX19pb21lbSAqZG1wX3JlZzsKIAl1aW50MzJfdAkqaXRlcl9yZWc7CkBAIC02OTcsNiArNzAyLDcgQEAKIAlzdHJ1Y3QgcWxhMjR4eF9md19kdW1wICpmdzsKIAl1aW50MzJfdAlleHRfbWVtX2NudDsKIAl2b2lkCQkqbnh0OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlyaXNjX2FkZHJlc3MgPSBleHRfbWVtX2NudCA9IDA7CiAJZmxhZ3MgPSAwOwpAQCAtOTE5LDcgKzkyNSw3IEBACiAJfSBlbHNlIHsKIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKKwkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7CiAJCWhhLT5md19kdW1wZWQgPSAxOwogCX0KIApAQCAtOTI5LDEzICs5MzUsMTQgQEAKIH0KIAogdm9pZAotcWxhMjV4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCitxbGEyNXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBoYXJkd2FyZV9sb2NrZWQpCiB7CiAJaW50CQlydmFsOwogCXVpbnQzMl90CWNudDsKIAl1aW50MzJfdAlyaXNjX2FkZHJlc3M7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnMjU7CiAJdWludDMyX3QgX19pb21lbSAqZG1wX3JlZzsKIAl1aW50MzJfdAkqaXRlcl9yZWc7CiAJdWludDE2X3QgX19pb21lbSAqbWJ4X3JlZzsKQEAgLTk0NCw2ICs5NTEsMTEgQEAKIAl1aW50MzJfdAlleHRfbWVtX2NudDsKIAl2b2lkCQkqbnh0OwogCXN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbiAqZmNlYzsKKwlzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbiAqbXEgPSBOVUxMOworCXVpbnQzMl90CXFyZWdfc2l6ZTsKKwl1aW50OF90CQlyZXFfY250LCByc3BfY250LCBxdWVfY250OworCXVpbnQzMl90CXF1ZV9pZHg7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJpc2NfYWRkcmVzcyA9IGV4dF9tZW1fY250ID0gMDsKIAlmbGFncyA9IDA7CkBAIC05ODgsNiArMTAwMCwyOSBAQAogCWZ3LT5wY2llX3JlZ3NbMV0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CiAJZnctPnBjaWVfcmVnc1syXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKSk7CiAJZnctPnBjaWVfcmVnc1szXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KSk7CisKKwkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KKwlpZiAoaGEtPm1xZW5hYmxlKSB7CisJCXFyZWdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7CisJCW1xID0ga3phbGxvYyhxcmVnX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1xKQorCQkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisJCXJlcV9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOworCQlyc3BfY250ID0gZmluZF9maXJzdF96ZXJvX2JpdChoYS0+cnNwX3FpZF9tYXAsIGhhLT5tYXhfcXVldWVzKTsKKwkJcXVlX2NudCA9IHJlcV9jbnQgPiByc3BfY250ID8gcmVxX2NudCA6IHJzcF9jbnQ7CisJCW1xLT5jb3VudCA9IGh0b25sKHF1ZV9jbnQpOworCQltcS0+Y2hhaW5fc2l6ZSA9IGh0b25sKHFyZWdfc2l6ZSk7CisJCW1xLT50eXBlID0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX01RKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBxdWVfY250OyBjbnQrKykgeworCQkJcmVnMjUgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopICgodm9pZCAqKQorCQkJCWhhLT5tcWlvYmFzZSArIGNudCAqIFFMQV9RVUVfUEFHRSk7CisJCQlxdWVfaWR4ID0gY250ICogNDsKKwkJCW1xLT5xcmVnc1txdWVfaWR4XSA9IGh0b25sKHJlZzI1LT5yZXFfcV9pbik7CisJCQltcS0+cXJlZ3NbcXVlX2lkeCsxXSA9IGh0b25sKHJlZzI1LT5yZXFfcV9vdXQpOworCQkJbXEtPnFyZWdzW3F1ZV9pZHgrMl0gPSBodG9ubChyZWcyNS0+cnNwX3FfaW4pOworCQkJbXEtPnFyZWdzW3F1ZV9pZHgrM10gPSBodG9ubChyZWcyNS0+cnNwX3Ffb3V0KTsKKwkJfQorCX0KIAlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3csIDB4MDApOwogCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KTsKIApAQCAtMTIyNSw3ICsxMjYwLDE0IEBACiAKIAloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7CiAKLQlmY2VjID0gbnh0ICsgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKTsKKwlpZiAoaGEtPm1xZW5hYmxlKSB7CisJCW54dCA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7CisJCW1lbWNweShueHQsIG1xLCBxcmVnX3NpemUpOworCQlrZnJlZShtcSk7CisJCWZjZWMgPSBueHQgKyBxcmVnX3NpemU7CisJfSBlbHNlIHsKKwkJZmNlYyA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7CisJfQogCWZjZWMtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fRkNFIHwgRFVNUF9DSEFJTl9MQVNUKTsKIAlmY2VjLT5jaGFpbl9zaXplID0gaHRvbmwoc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbikgKwogCSAgICBmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOwpAQCAtMTI0OCw3ICsxMjkwLDcgQEAKIAl9IGVsc2UgewogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOworCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKIAkJaGEtPmZ3X2R1bXBlZCA9IDE7CiAJfQogCkBAIC0xMjU2LDE1ICsxMjk4LDE1IEBACiAJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiB9Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIERlYnVnIEZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotcWxhMngwMF9kdW1wX3JlZ3Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZzI0ID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCXVpbnQxNl90IF9faW9tZW0gKm1ieF9yZWc7CkBAIC0xMjc0LDcgKzEzMTYsNyBAQAogCiAJcHJpbnRrKCJNYWlsYm94IHJlZ2lzdGVyczpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCXByaW50aygic2NzaSglbGQpOiBtYm94ICVkIDB4JTA0eCBcbiIsIGhhLT5ob3N0X25vLCBpLAorCQlwcmludGsoInNjc2koJWxkKTogbWJveCAlZCAweCUwNHggXG4iLCB2aGEtPmhvc3Rfbm8sIGksCiAJCSAgICBSRF9SRUdfV09SRChtYnhfcmVnKyspKTsKIH0KIApAQCAtMTMwMiwzICsxMzQ0LDUgQEAKIAlpZiAoY250ICUgMTYpCiAJCXByaW50aygiXG4iKTsKIH0KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggMmU5YzBjMC4uYzE3OTRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtNCw2ICs0LDkgQEAKICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCisKKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKIC8qCiAgKiBEcml2ZXIgZGVidWcgZGVmaW5pdGlvbnMuCiAgKi8KQEAgLTIzLDYgKzI2LDcgQEAKIC8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTQgKi8gLyogT3V0cHV0IFJTQ04gdHJhY2UgbXNncyAqLwogLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xNSAqLyAvKiBPdXRwdXQgTlBJViB0cmFjZSBtc2dzICovCiAvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE2ICovIC8qIE91dHB1dCBJU1A4NFhYIHRyYWNlIG1zZ3MgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTcgKi8gLyogT3V0cHV0IE1VTFRJLVEgdHJhY2UgbWVzc2FnZXMgKi8KIAogLyoKICogTWFjcm9zIHVzZSBmb3IgZGVidWdnaW5nIHRoZSBkcml2ZXIuCkBAIC00Myw2ICs0Nyw3IEBACiAjZGVmaW5lIERFQlVHMl8xMSh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAjZGVmaW5lIERFQlVHMl8xMyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAjZGVmaW5lIERFQlVHMl8xNih4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8xNyh4KSAJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQogCiAjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKQogI2RlZmluZSBERUJVRzMoeCkJZG8ge3g7fSB3aGlsZSAoMCkKQEAgLTEyNyw3ICsxMzIsNiBAQAogI2Vsc2UKICNkZWZpbmUgREVCVUcxNih4KQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgotCiAvKgogICogRmlybXdhcmUgRHVtcCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgogICovCkBAIC0yNjYsOCArMjcwLDE3IEBACiAJdWludDMyX3QgZXJlZ3NbOF07CiB9OwogCitzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbiB7CisJdWludDMyX3QgdHlwZTsKKwl1aW50MzJfdCBjaGFpbl9zaXplOworCisJdWludDMyX3QgY291bnQ7CisJdWludDMyX3QgcXJlZ3NbNCAqIFFMQV9NUV9TSVpFXTsKK307CisKICNkZWZpbmUgRFVNUF9DSEFJTl9WQVJJQU5UCTB4ODAwMDAwMDAKICNkZWZpbmUgRFVNUF9DSEFJTl9GQ0UJCTB4N0ZGRkZBRjAKKyNkZWZpbmUgRFVNUF9DSEFJTl9NUQkJMHg3RkZGRkFGMQogI2RlZmluZSBEVU1QX0NIQUlOX0xBU1QJCTB4ODAwMDAwMDAKIAogc3RydWN0IHFsYTJ4eHhfZndfZHVtcCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKaW5kZXggYjk3MTk0MC4uYTI5Yzk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaApAQCAtMTgxLDExICsxODEsMTQgQEAKICNkZWZpbmUgUkVTUE9OU0VfRU5UUllfQ05UXzIxMDAJCTY0CS8qIE51bWJlciBvZiByZXNwb25zZSBlbnRyaWVzLiovCiAjZGVmaW5lIFJFU1BPTlNFX0VOVFJZX0NOVF8yMzAwCQk1MTIJLyogTnVtYmVyIG9mIHJlc3BvbnNlIGVudHJpZXMuKi8KIAorc3RydWN0IHJlcV9xdWU7CisKIC8qCiAgKiBTQ1NJIFJlcXVlc3QgQmxvY2sKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc3JiIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CS8qIEhBIHRoZSBTUCBpcyBxdWV1ZWQgb24gKi8KKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhOwkvKiBIQSB0aGUgU1AgaXMgcXVldWVkIG9uICovCisJc3RydWN0IHJlcV9xdWUgKnF1ZTsKIAlzdHJ1Y3QgZmNfcG9ydCAqZmNwb3J0OwogCiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwkJLyogTGludXggU0NTSSBjb21tYW5kIHBrdCAqLwpAQCAtMzY5LDkgKzM3MiwxNyBAQAogCX0gdV9lbmQ7CiB9OwogCitzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgeworCXZvbGF0aWxlIHVpbnQzMl90IHJlcV9xX2luOworCXZvbGF0aWxlIHVpbnQzMl90IHJlcV9xX291dDsKKwl2b2xhdGlsZSB1aW50MzJfdCByc3BfcV9pbjsKKwl2b2xhdGlsZSB1aW50MzJfdCByc3BfcV9vdXQ7Cit9OworCiB0eXBlZGVmIHVuaW9uIHsKIAkJc3RydWN0IGRldmljZV9yZWdfMnh4eCBpc3A7CiAJCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggaXNwMjQ7CisJCXN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSBpc3AyNW1xOwogfSBkZXZpY2VfcmVnX3Q7CiAKICNkZWZpbmUgSVNQX1JFUV9RX0lOKGhhLCByZWcpIFwKQEAgLTE1MjQsNyArMTUzNSw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IGZjX3BvcnQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYTsKIAogCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKIAl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CkBAIC0xNTUwLDcgKzE1NjEsNiBAQAogCXVuc2lnbmVkIGxvbmcgbGFzdF9xdWV1ZV9mdWxsOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9yYW1wX3VwOwogCi0Jc3RydWN0IGxpc3RfaGVhZCB2cF9mY3BvcnQ7CiAJdWludDE2X3QgdnBfaWR4OwogfSBmY19wb3J0X3Q7CiAKQEAgLTIwMzcsNiArMjA0Nyw4IEBACiAjZGVmaW5lIFZQX1JFVF9DT0RFX05PX01FTQkJNQogI2RlZmluZSBWUF9SRVRfQ09ERV9OT1RfRk9VTkQJCTYKIAorc3RydWN0IHFsYV9od19kYXRhOworCiAvKgogICogSVNQIG9wZXJhdGlvbnMKICAqLwpAQCAtMjA1NSwxMCArMjA2NywxMSBAQAogCWNoYXIgKiAoKmZ3X3ZlcnNpb25fc3RyKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgY2hhciAqKTsKIAogCWlycV9oYW5kbGVyX3QgaW50cl9oYW5kbGVyOwotCXZvaWQgKCplbmFibGVfaW50cnMpIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKLQl2b2lkICgqZGlzYWJsZV9pbnRycykgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworCXZvaWQgKCplbmFibGVfaW50cnMpIChzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CisJdm9pZCAoKmRpc2FibGVfaW50cnMpIChzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CiAKLQlpbnQgKCphYm9ydF9jb21tYW5kKSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3JiX3QgKik7CisJaW50ICgqYWJvcnRfY29tbWFuZCkgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHNyYl90ICosCisJCXN0cnVjdCByZXFfcXVlICopOwogCWludCAoKnRhcmdldF9yZXNldCkgKHN0cnVjdCBmY19wb3J0ICosIHVuc2lnbmVkIGludCk7CiAJaW50ICgqbHVuX3Jlc2V0KSAoc3RydWN0IGZjX3BvcnQgKiwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCpmYWJyaWNfbG9naW4pIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MTZfdCwgdWludDhfdCwKQEAgLTIwODksNiArMjEwMiwxMCBAQAogCQl1aW50MzJfdCk7CiAKIAlpbnQgKCpnZXRfZmxhc2hfdmVyc2lvbikgKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHZvaWQgKik7CisJaW50ICgqc3RhcnRfc2NzaSkgKHNyYl90ICopOworCXZvaWQgKCp3cnRfcmVxX3JlZykgKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MTZfdCwgdWludDE2X3QpOworCXZvaWQgKCp3cnRfcnNwX3JlZykgKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MTZfdCwgdWludDE2X3QpOworCXVpbnQxNl90ICgqcmRfcmVxX3JlZykgKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MTZfdCk7CiB9OwogCiAvKiBNU0ktWCBTdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTAwLDE2ICsyMTE3LDE4IEBACiAjZGVmaW5lIFFMQV9NU0lYX0RFRkFVTFQJMHgwMAogI2RlZmluZSBRTEFfTVNJWF9SU1BfUQkJMHgwMQogCi0jZGVmaW5lIFFMQV9NU0lYX0VOVFJJRVMJMgogI2RlZmluZSBRTEFfTUlEWF9ERUZBVUxUCTAKICNkZWZpbmUgUUxBX01JRFhfUlNQX1EJCTEKKyNkZWZpbmUgUUxBX1BDSV9NU0lYX0NPTlRST0wJMHhhMgogCiBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdDsKK3N0cnVjdCByc3BfcXVlOwogCiBzdHJ1Y3QgcWxhX21zaXhfZW50cnkgewogCWludCBoYXZlX2lycTsKLQl1aW50MzJfdCBtc2l4X3ZlY3RvcjsKLQl1aW50MTZfdCBtc2l4X2VudHJ5OworCXVpbnQzMl90IHZlY3RvcjsKKwl1aW50MTZfdCBlbnRyeTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogfTsKIAogI2RlZmluZQlXQVRDSF9JTlRFUlZBTAkJMSAgICAgICAvKiBudW1iZXIgb2Ygc2Vjb25kcyAqLwpAQCAtMjE2MCwyMDggKzIxNzksMTM3IEBACiAJdWludDY0X3Qgb3V0cHV0X2J5dGVzOwogfTsKIAorLyogTXVsdGkgcXVldWUgc3VwcG9ydCAqLworI2RlZmluZSBNQkNfSU5JVElBTElaRV9NVUxUSVEgMHgxZgorI2RlZmluZSBRTEFfUVVFX1BBR0UgMFgxMDAwCisjZGVmaW5lIFFMQV9NUV9TSVpFIDMyCisjZGVmaW5lIFFMQV9NQVhfSE9TVF9RVUVTIDE2CisjZGVmaW5lIFFMQV9NQVhfUVVFVUVTIDI1NgorI2RlZmluZSBJU1BfUVVFX1JFRyhoYSwgaWQpIFwKKwkoKGhhLT5tcWVuYWJsZSkgPyBcCisJKCh2b2lkICopKGhhLT5tcWlvYmFzZSkgK1wKKwkoUUxBX1FVRV9QQUdFICogaWQpKSA6XAorCSgodm9pZCAqKShoYS0+aW9iYXNlKSkpCisjZGVmaW5lIFFMQV9SRVFfUVVFX0lEKHRhZykgXAorCSgodGFnIDwgUUxBX01BWF9RVUVVRVMgJiYgdGFnID4gMCkgPyB0YWcgOiAwKQorI2RlZmluZSBRTEFfREVGQVVMVF9RVUVfUU9TIDUKKyNkZWZpbmUgUUxBX1BSRUNPTkZJR19WUE9SVFMgMzIKKyNkZWZpbmUgUUxBX01BWF9WUE9SVFNfUUxBMjRYWAkxMjgKKyNkZWZpbmUgUUxBX01BWF9WUE9SVFNfUUxBMjVYWAkyNTYKKy8qIFJlc3BvbnNlIHF1ZXVlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgcnNwX3F1ZSB7CisJZG1hX2FkZHJfdCAgZG1hOworCXJlc3BvbnNlX3QgKnJpbmc7CisJcmVzcG9uc2VfdCAqcmluZ19wdHI7CisJdWludDE2X3QgIHJpbmdfaW5kZXg7CisJdWludDE2X3QgIG91dF9wdHI7CisJdWludDE2X3QgIGxlbmd0aDsKKwl1aW50MTZfdCAgb3B0aW9uczsKKwl1aW50MTZfdCAgcmlkOworCXVpbnQxNl90ICBpZDsKKwl1aW50MTZfdCAgdnBfaWR4OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaHc7CisJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICptc2l4OworCXN0cnVjdCByZXFfcXVlICpyZXE7Cit9OworCisvKiBSZXF1ZXN0IHF1ZXVlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgcmVxX3F1ZSB7CisJZG1hX2FkZHJfdCAgZG1hOworCXJlcXVlc3RfdCAqcmluZzsKKwlyZXF1ZXN0X3QgKnJpbmdfcHRyOworCXVpbnQxNl90ICByaW5nX2luZGV4OworCXVpbnQxNl90ICBpbl9wdHI7CisJdWludDE2X3QgIGNudDsKKwl1aW50MTZfdCAgbGVuZ3RoOworCXVpbnQxNl90ICBvcHRpb25zOworCXVpbnQxNl90ICByaWQ7CisJdWludDE2X3QgIGlkOworCXVpbnQxNl90ICBxb3M7CisJdWludDE2X3QgIHZwX2lkeDsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOworCXNyYl90ICpvdXRzdGFuZGluZ19jbWRzW01BWF9PVVRTVEFORElOR19DT01NQU5EU107CisJdWludDMyX3QgY3VycmVudF9vdXRzdGFuZGluZ19jbWQ7CisJaW50IG1heF9xX2RlcHRoOworfTsKKwogLyoKLSAqIExpbnV4IEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JLyogQ29tbW9ubHkgdXNlZCBmbGFncyBhbmQgc3RhdGUgaW5mb3JtYXRpb24uICovCi0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKLQlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKLQotCXVuc2lnbmVkIGxvbmcJaG9zdF9ubzsKKyAqIFFsb2dpYyBob3N0IGFkYXB0ZXIgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUuCisqLworc3RydWN0IHFsYV9od19kYXRhIHsKKwlzdHJ1Y3QgcGNpX2RldiAgKnBkZXY7CisJLyogU1JCIGNhY2hlLiAqLworI2RlZmluZSBTUkJfTUlOX1JFUSAgICAgMTI4CisJbWVtcG9vbF90ICAgICAgICpzcmJfbWVtcG9vbDsKIAogCXZvbGF0aWxlIHN0cnVjdCB7Ci0JCXVpbnQzMl90CWluaXRfZG9uZQkJOjE7Ci0JCXVpbnQzMl90CW9ubGluZQkJCToxOwogCQl1aW50MzJfdAltYm94X2ludAkJOjE7CiAJCXVpbnQzMl90CW1ib3hfYnVzeQkJOjE7Ci0JCXVpbnQzMl90CXJzY25fcXVldWVfb3ZlcmZsb3cJOjE7Ci0JCXVpbnQzMl90CXJlc2V0X2FjdGl2ZQkJOjE7Ci0KLQkJdWludDMyX3QJbWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luIDoxOwotICAgICAgICAgICAgICAgIHVpbnQzMl90CXByb2Nlc3NfcmVzcG9uc2VfcXVldWUJOjE7CiAKIAkJdWludDMyX3QJZGlzYWJsZV9yaXNjX2NvZGVfbG9hZAk6MTsKIAkJdWludDMyX3QJZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcJOjE7CiAJCXVpbnQzMl90CWVuYWJsZV9saXBfcmVzZXQJOjE7Ci0JCXVpbnQzMl90CWVuYWJsZV9saXBfZnVsbF9sb2dpbgk6MTsKIAkJdWludDMyX3QJZW5hYmxlX3RhcmdldF9yZXNldAk6MTsKKwkJdWludDMyX3QJZW5hYmxlX2xpcF9mdWxsX2xvZ2luCToxOwogCQl1aW50MzJfdAllbmFibGVfbGVkX3NjaGVtZQk6MTsKIAkJdWludDMyX3QJaW50YV9lbmFibGVkCQk6MTsKIAkJdWludDMyX3QJbXNpX2VuYWJsZWQJCToxOwogCQl1aW50MzJfdAltc2l4X2VuYWJsZWQJCToxOwogCQl1aW50MzJfdAlkaXNhYmxlX3NlcmRlcwkJOjE7CiAJCXVpbnQzMl90CWdwc2Nfc3VwcG9ydGVkCQk6MTsKLQkJdWludDMyX3QgICAgICAgIHZzYW5fZW5hYmxlZCAgICAgICAgICAgIDoxOworCQl1aW50MzJfdAl2c2FuX2VuYWJsZWQJCToxOwogCQl1aW50MzJfdAlucGl2X3N1cHBvcnRlZAkJOjE7CiAJCXVpbnQzMl90CWZjZV9lbmFibGVkCQk6MTsKLQkJdWludDMyX3QJaHdfZXZlbnRfbWFya2VyX2ZvdW5kCToxOworCQl1aW50MzJfdAlod19ldmVudF9tYXJrZXJfZm91bmQ6MTsKIAl9IGZsYWdzOwogCi0JYXRvbWljX3QJbG9vcF9zdGF0ZTsKLSNkZWZpbmUgTE9PUF9USU1FT1VUCTEKLSNkZWZpbmUgTE9PUF9ET1dOCTIKLSNkZWZpbmUgTE9PUF9VUAkJMwotI2RlZmluZSBMT09QX1VQREFURQk0Ci0jZGVmaW5lIExPT1BfUkVBRFkJNQotI2RlZmluZSBMT09QX0RFQUQJNgotCi0JdW5zaWduZWQgbG9uZyAgIGRwY19mbGFnczsKLSNkZWZpbmUJUkVTRVRfTUFSS0VSX05FRURFRAkwCS8qIFNlbmQgbWFya2VyIHRvIElTUC4gKi8KLSNkZWZpbmUJUkVTRVRfQUNUSVZFCQkxCi0jZGVmaW5lCUlTUF9BQk9SVF9ORUVERUQJMgkvKiBJbml0aWF0ZSBJU1AgYWJvcnQuICovCi0jZGVmaW5lCUFCT1JUX0lTUF9BQ1RJVkUJMwkvKiBJU1AgYWJvcnQgaW4gcHJvZ3Jlc3MuICovCi0jZGVmaW5lCUxPT1BfUkVTWU5DX05FRURFRAk0CS8qIERldmljZSBSZXN5bmMgbmVlZGVkLiAqLwotI2RlZmluZQlMT09QX1JFU1lOQ19BQ1RJVkUJNQotI2RlZmluZSBMT0NBTF9MT09QX1VQREFURSAgICAgICA2CS8qIFBlcmZvcm0gYSBsb2NhbCBsb29wIHVwZGF0ZS4gKi8KLSNkZWZpbmUgUlNDTl9VUERBVEUgICAgICAgICAgICAgNwkvKiBQZXJmb3JtIGFuIFJTQ04gdXBkYXRlLiAqLwotI2RlZmluZSBNQUlMQk9YX1JFVFJZICAgICAgICAgICA4Ci0jZGVmaW5lIElTUF9SRVNFVF9ORUVERUQgICAgICAgIDkJLyogSW5pdGlhdGUgYSBJU1AgcmVzZXQuICovCi0jZGVmaW5lIEZBSUxPVkVSX0VWRU5UX05FRURFRCAgIDEwCi0jZGVmaW5lIEZBSUxPVkVSX0VWRU5UCQkxMQotI2RlZmluZSBGQUlMT1ZFUl9ORUVERUQgICAJMTIKLSNkZWZpbmUgU0NTSV9SRVNUQVJUX05FRURFRAkxMwkvKiBQcm9jZXNzZXMgU0NTSSByZXRyeSBxdWV1ZS4gKi8KLSNkZWZpbmUgUE9SVF9SRVNUQVJUX05FRURFRAkxNAkvKiBQcm9jZXNzZXMgUmV0cnkgcXVldWUuICovCi0jZGVmaW5lIFJFU1RBUlRfUVVFVUVTX05FRURFRAkxNQkvKiBSZXN0YXJ0cyB0aGUgTHVuIHF1ZXVlLiAqLwotI2RlZmluZSBBQk9SVF9RVUVVRVNfTkVFREVECTE2Ci0jZGVmaW5lIFJFTE9HSU5fTkVFREVECSAgICAgICAgMTcKLSNkZWZpbmUgTE9HSU5fUkVUUllfTkVFREVECTE4CS8qIEluaXRpYXRlIHJlcXVpcmVkIGZhYnJpYyBsb2dpbnMuICovCi0jZGVmaW5lIFJFR0lTVEVSX0ZDNF9ORUVERUQJMTkJLyogU05TIEZDNCByZWdpc3RyYXRpb24gcmVxdWlyZWQuICovCi0jZGVmaW5lIElTUF9BQk9SVF9SRVRSWSAgICAgICAgIDIwICAgICAgLyogSVNQIGFib3J0ZWQuICovCi0jZGVmaW5lIEZDUE9SVF9SRVNDQU5fTkVFREVECTIxICAgICAgLyogSU8gZGVzY3JpcHRvciBwcm9jZXNzaW5nIG5lZWRlZCAqLwotI2RlZmluZSBJT0RFU0NfUFJPQ0VTU19ORUVERUQJMjIgICAgICAvKiBJTyBkZXNjcmlwdG9yIHByb2Nlc3NpbmcgbmVlZGVkICovCi0jZGVmaW5lIElPQ1RMX0VSUk9SX1JFQ09WRVJZCTIzCi0jZGVmaW5lIExPT1BfUkVTRVRfTkVFREVECTI0Ci0jZGVmaW5lIEJFQUNPTl9CTElOS19ORUVERUQJMjUKLSNkZWZpbmUgUkVHSVNURVJfRkRNSV9ORUVERUQJMjYKLSNkZWZpbmUgRkNQT1JUX1VQREFURV9ORUVERUQJMjcKLSNkZWZpbmUgVlBfRFBDX05FRURFRAkJMjgJLyogd2FrZSB1cCBmb3IgVlAgZHBjIGhhbmRsaW5nICovCi0jZGVmaW5lIFVOTE9BRElORwkJMjkKLSNkZWZpbmUgTlBJVl9DT05GSUdfTkVFREVECTMwCi0KLQl1aW50MzJfdAlkZXZpY2VfZmxhZ3M7Ci0jZGVmaW5lIERGTEdfTE9DQUxfREVWSUNFUwkJQklUXzAKLSNkZWZpbmUgREZMR19SRVRSWV9MT0NBTF9ERVZJQ0VTCUJJVF8xCi0jZGVmaW5lIERGTEdfRkFCUklDX0RFVklDRVMJCUJJVF8yCi0jZGVmaW5lCVNXSVRDSF9GT1VORAkJCUJJVF8zCi0jZGVmaW5lCURGTEdfTk9fQ0FCTEUJCQlCSVRfNAotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIJMHgyNTMyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDg0MzIJMHg4NDMyCi0JdWludDMyX3QJZGV2aWNlX3R5cGU7Ci0jZGVmaW5lIERUX0lTUDIxMDAJCQlCSVRfMAotI2RlZmluZSBEVF9JU1AyMjAwCQkJQklUXzEKLSNkZWZpbmUgRFRfSVNQMjMwMAkJCUJJVF8yCi0jZGVmaW5lIERUX0lTUDIzMTIJCQlCSVRfMwotI2RlZmluZSBEVF9JU1AyMzIyCQkJQklUXzQKLSNkZWZpbmUgRFRfSVNQNjMxMgkJCUJJVF81Ci0jZGVmaW5lIERUX0lTUDYzMjIJCQlCSVRfNgotI2RlZmluZSBEVF9JU1AyNDIyCQkJQklUXzcKLSNkZWZpbmUgRFRfSVNQMjQzMgkJCUJJVF84Ci0jZGVmaW5lIERUX0lTUDU0MjIJCQlCSVRfOQotI2RlZmluZSBEVF9JU1A1NDMyCQkJQklUXzEwCi0jZGVmaW5lIERUX0lTUDI1MzIJCQlCSVRfMTEKLSNkZWZpbmUgRFRfSVNQODQzMgkJCUJJVF8xMgotI2RlZmluZSBEVF9JU1BfTEFTVAkJCShEVF9JU1A4NDMyIDw8IDEpCi0KLSNkZWZpbmUgRFRfSUlETUEJCQlCSVRfMjYKLSNkZWZpbmUgRFRfRldJMgkJCQlCSVRfMjcKLSNkZWZpbmUgRFRfWklPX1NVUFBPUlRFRAkJQklUXzI4Ci0jZGVmaW5lIERUX09FTV8wMDEJCQlCSVRfMjkKLSNkZWZpbmUgRFRfSVNQMjIwMEEJCQlCSVRfMzAKLSNkZWZpbmUgRFRfRVhURU5ERURfSURTCQkJQklUXzMxCi0KLSNkZWZpbmUgRFRfTUFTSyhoYSkJKChoYSktPmRldmljZV90eXBlICYgKERUX0lTUF9MQVNUIC0gMSkpCi0jZGVmaW5lIElTX1FMQTIxMDAoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIxMDApCi0jZGVmaW5lIElTX1FMQTIyMDAoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIyMDApCi0jZGVmaW5lIElTX1FMQTIzMDAoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIzMDApCi0jZGVmaW5lIElTX1FMQTIzMTIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIzMTIpCi0jZGVmaW5lIElTX1FMQTIzMjIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDIzMjIpCi0jZGVmaW5lIElTX1FMQTYzMTIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDYzMTIpCi0jZGVmaW5lIElTX1FMQTYzMjIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDYzMjIpCi0jZGVmaW5lIElTX1FMQTI0MjIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDI0MjIpCi0jZGVmaW5lIElTX1FMQTI0MzIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDI0MzIpCi0jZGVmaW5lIElTX1FMQTU0MjIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDU0MjIpCi0jZGVmaW5lIElTX1FMQTU0MzIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDU0MzIpCi0jZGVmaW5lIElTX1FMQTI1MzIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDI1MzIpCi0jZGVmaW5lIElTX1FMQTg0MzIoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDg0MzIpCi0KLSNkZWZpbmUgSVNfUUxBMjNYWChoYSkJKElTX1FMQTIzMDAoaGEpIHx8IElTX1FMQTIzMTIoaGEpIHx8IElTX1FMQTIzMjIoaGEpIHx8IFwKLSAgICAJCQkgSVNfUUxBNjMxMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCi0jZGVmaW5lIElTX1FMQTI0WFgoaGEpCShJU19RTEEyNDIyKGhhKSB8fCBJU19RTEEyNDMyKGhhKSkKLSNkZWZpbmUgSVNfUUxBNTRYWChoYSkJKElTX1FMQTU0MjIoaGEpIHx8IElTX1FMQTU0MzIoaGEpKQotI2RlZmluZSBJU19RTEEyNVhYKGhhKQkoSVNfUUxBMjUzMihoYSkpCi0jZGVmaW5lIElTX1FMQTg0WFgoaGEpCShJU19RTEE4NDMyKGhhKSkKLSNkZWZpbmUgSVNfUUxBMjRYWF9UWVBFKGhhKQkoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBNTRYWChoYSkgfHwgXAotCQkJSVNfUUxBODRYWChoYSkpCi0KLSNkZWZpbmUgSVNfSUlETUFfQ0FQQUJMRShoYSkJKChoYSktPmRldmljZV90eXBlICYgRFRfSUlETUEpCi0jZGVmaW5lIElTX0ZXSTJfQ0FQQUJMRShoYSkJKChoYSktPmRldmljZV90eXBlICYgRFRfRldJMikKLSNkZWZpbmUgSVNfWklPX1NVUFBPUlRFRChoYSkJKChoYSktPmRldmljZV90eXBlICYgRFRfWklPX1NVUFBPUlRFRCkKLSNkZWZpbmUgSVNfT0VNXzAwMShoYSkJCSgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX09FTV8wMDEpCi0jZGVmaW5lIEhBU19FWFRFTkRFRF9JRFMoaGEpCSgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0VYVEVOREVEX0lEUykKLQotCS8qIFNSQiBjYWNoZS4gKi8KLSNkZWZpbmUgU1JCX01JTl9SRVEJMTI4Ci0JbWVtcG9vbF90CSpzcmJfbWVtcG9vbDsKLQogCS8qIFRoaXMgc3BpbmxvY2sgaXMgdXNlZCB0byBwcm90ZWN0ICJpbyB0cmFuc2FjdGlvbnMiLCB5b3UgbXVzdAotCSAqIGFjcXVpcmUgaXQgYmVmb3JlIGRvaW5nIGFueSBJTyB0byB0aGUgY2FyZCwgZWcgd2l0aCBSRF9SRUcqKCkgYW5kCi0JICogV1JUX1JFRyooKSBmb3IgdGhlIGR1cmF0aW9uIG9mIHlvdXIgZW50aXJlIGNvbW1hbmR0cmFuc2FjdGlvbi4KLQkgKgotCSAqIFRoaXMgc3BpbmxvY2sgaXMgb2YgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgaW8gcmVxdWVzdCBsb2NrLgotCSAqLworCSogYWNxdWlyZSBpdCBiZWZvcmUgZG9pbmcgYW55IElPIHRvIHRoZSBjYXJkLCBlZyB3aXRoIFJEX1JFRyooKSBhbmQKKwkqIFdSVF9SRUcqKCkgZm9yIHRoZSBkdXJhdGlvbiBvZiB5b3VyIGVudGlyZSBjb21tYW5kdHJhbnNhY3Rpb24uCisJKgorCSogVGhpcyBzcGlubG9jayBpcyBvZiBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBpbyByZXF1ZXN0IGxvY2suCisJKi8KIAotCXNwaW5sb2NrX3QJCWhhcmR3YXJlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCisJc3BpbmxvY2tfdAloYXJkd2FyZV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAlpbnQJCWJhcnM7CiAJaW50CQltZW1fb25seTsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqaW9iYXNlOwkJLyogQmFzZSBJL08gYWRkcmVzcyAqLworCWRldmljZV9yZWdfdCBfX2lvbWVtICppb2Jhc2U7ICAgICAgICAgICAvKiBCYXNlIEkvTyBhZGRyZXNzICovCiAJcmVzb3VyY2Vfc2l6ZV90IHBpb19hZGRyZXNzOwotI2RlZmluZSBNSU5fSU9CQVNFX0xFTgkJMHgxMDAKIAotCS8qIElTUCByaW5nIGxvY2ssIHJpbmdzLCBhbmQgaW5kZXhlcyAqLwotCWRtYV9hZGRyX3QJcmVxdWVzdF9kbWE7ICAgICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzLiAqLwotCXJlcXVlc3RfdCAgICAgICAqcmVxdWVzdF9yaW5nOyAgICAgIC8qIEJhc2UgdmlydHVhbCBhZGRyZXNzICovCi0JcmVxdWVzdF90ICAgICAgICpyZXF1ZXN0X3JpbmdfcHRyOyAgLyogQ3VycmVudCBhZGRyZXNzLiAqLwotCXVpbnQxNl90ICAgICAgICByZXFfcmluZ19pbmRleDsgICAgIC8qIEN1cnJlbnQgaW5kZXguICovCi0JdWludDE2X3QgICAgICAgIHJlcV9xX2NudDsgICAgICAgICAgLyogTnVtYmVyIG9mIGF2YWlsYWJsZSBlbnRyaWVzLiAqLwotCXVpbnQxNl90CXJlcXVlc3RfcV9sZW5ndGg7CisjZGVmaW5lIE1JTl9JT0JBU0VfTEVOICAgICAgICAgIDB4MTAwCisvKiBNdWx0aSBxdWV1ZSBkYXRhIHN0cnVjdHMgKi8KKwlkZXZpY2VfcmVnX3QgICAgKm1xaW9iYXNlOworCXVpbnQxNl90ICAgICAgICBtc2l4X2NvdW50OworCXVpbnQ4X3QgICAgICAgICBtcWVuYWJsZTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqKnJlcV9xX21hcDsKKwlzdHJ1Y3QgcnNwX3F1ZSAqKnJzcF9xX21hcDsKKwl1bnNpZ25lZCBsb25nIHJlcV9xaWRfbWFwWyhRTEFfTUFYX1FVRVVFUyAvIDgpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwl1bnNpZ25lZCBsb25nIHJzcF9xaWRfbWFwWyhRTEFfTUFYX1FVRVVFUyAvIDgpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwl1aW50MTZfdCAJbWF4X3F1ZXVlczsKKwlzdHJ1Y3QgcWxhX25waXZfZW50cnkgKm5waXZfaW5mbzsKKwl1aW50MTZfdAludnJhbV9ucGl2X3NpemU7CiAKLQlkbWFfYWRkcl90CXJlc3BvbnNlX2RtYTsgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcy4gKi8KLQlyZXNwb25zZV90ICAgICAgKnJlc3BvbnNlX3Jpbmc7ICAgICAvKiBCYXNlIHZpcnR1YWwgYWRkcmVzcyAqLwotCXJlc3BvbnNlX3QgICAgICAqcmVzcG9uc2VfcmluZ19wdHI7IC8qIEN1cnJlbnQgYWRkcmVzcy4gKi8KLQl1aW50MTZfdCAgICAgICAgcnNwX3JpbmdfaW5kZXg7ICAgICAvKiBDdXJyZW50IGluZGV4LiAqLwotCXVpbnQxNl90CXJlc3BvbnNlX3FfbGVuZ3RoOworCXVpbnQxNl90ICAgICAgICBzd2l0Y2hfY2FwOworI2RlZmluZSBGTE9HSV9TRVFfREVMICAgICAgICAgICBCSVRfOAorI2RlZmluZSBGTE9HSV9NSURfU1VQUE9SVCAgICAgICBCSVRfMTAKKyNkZWZpbmUgRkxPR0lfVlNBTl9TVVBQT1JUICAgICAgQklUXzEyCisjZGVmaW5lIEZMT0dJX1NQX1NVUFBPUlQgICAgICAgIEJJVF8xMworCS8qIFRpbWVvdXQgdGltZXJzLiAqLworCXVpbnQ4X3QgCWxvb3BfZG93bl9hYm9ydF90aW1lOyAgICAvKiBwb3J0IGRvd24gdGltZXIgKi8KKwlhdG9taWNfdAlsb29wX2Rvd25fdGltZXI7ICAgICAgICAgLyogbG9vcCBkb3duIHRpbWVyICovCisJdWludDhfdAkJbGlua19kb3duX3RpbWVvdXQ7ICAgICAgIC8qIGxpbmsgZG93biB0aW1lb3V0ICovCisJdWludDE2X3QJbWF4X2xvb3BfaWQ7CiAKLQlzdHJ1Y3QgaXNwX29wZXJhdGlvbnMgKmlzcF9vcHM7Ci0KLQkvKiBPdXRzdGFuZGluZ3MgSVNQIGNvbW1hbmRzLiAqLwotCXNyYl90CQkqb3V0c3RhbmRpbmdfY21kc1tNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFNdOwotCXVpbnQzMl90CWN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOwotCXNyYl90CQkqc3RhdHVzX3NyYjsJLyogU3RhdHVzIGNvbnRpbnVhdGlvbiBlbnRyeS4gKi8KLQotCS8qIElTUCBjb25maWd1cmF0aW9uIGRhdGEuICovCi0JdWludDE2X3QJbG9vcF9pZDsJCS8qIEhvc3QgYWRhcHRlciBsb29wIGlkICovCi0JdWludDE2X3QJc3dpdGNoX2NhcDsKLSNkZWZpbmUgRkxPR0lfU0VRX0RFTAkJQklUXzgKLSNkZWZpbmUgRkxPR0lfTUlEX1NVUFBPUlQJQklUXzEwCi0jZGVmaW5lIEZMT0dJX1ZTQU5fU1VQUE9SVAlCSVRfMTIKLSNkZWZpbmUgRkxPR0lfU1BfU1VQUE9SVAlCSVRfMTMKIAl1aW50MTZfdAlmYl9yZXY7Ci0KLQlwb3J0X2lkX3QJZF9pZDsJCQkvKiBIb3N0IGFkYXB0ZXIgcG9ydCBpZCAqLwogCXVpbnQxNl90CW1heF9wdWJsaWNfbG9vcF9pZHM7Ci0JdWludDE2X3QJbWluX2V4dGVybmFsX2xvb3BpZDsJLyogRmlyc3QgZXh0ZXJuYWwgbG9vcCBJZCAqLworCXVpbnQxNl90CW1pbl9leHRlcm5hbF9sb29waWQ7ICAgIC8qIEZpcnN0IGV4dGVybmFsIGxvb3AgSWQgKi8KIAogI2RlZmluZSBQT1JUX1NQRUVEX1VOS05PV04gMHhGRkZGCi0jZGVmaW5lIFBPUlRfU1BFRURfMUdCCTB4MDAKLSNkZWZpbmUgUE9SVF9TUEVFRF8yR0IJMHgwMQotI2RlZmluZSBQT1JUX1NQRUVEXzRHQgkweDAzCi0jZGVmaW5lIFBPUlRfU1BFRURfOEdCCTB4MDQKLQl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsJCS8qIEYvVyBvcGVyYXRpbmcgc3BlZWQgKi8KKyNkZWZpbmUgUE9SVF9TUEVFRF8xR0IgIDB4MDAKKyNkZWZpbmUgUE9SVF9TUEVFRF8yR0IgIDB4MDEKKyNkZWZpbmUgUE9SVF9TUEVFRF80R0IgIDB4MDMKKyNkZWZpbmUgUE9SVF9TUEVFRF84R0IgIDB4MDQKKwl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsgICAgICAgICAvKiBGL1cgb3BlcmF0aW5nIHNwZWVkICovCiAKIAl1aW50OF90CQljdXJyZW50X3RvcG9sb2d5OwogCXVpbnQ4X3QJCXByZXZfdG9wb2xvZ3k7CkBAIC0yMzcwLDE1ICsyMzE4LDY5IEBACiAjZGVmaW5lIElTUF9DRkdfRkwJNAogI2RlZmluZSBJU1BfQ0ZHX0YJOAogCi0JdWludDhfdAkJb3BlcmF0aW5nX21vZGU7CQkvKiBGL1cgb3BlcmF0aW5nIG1vZGUgKi8KKwl1aW50OF90CQlvcGVyYXRpbmdfbW9kZTsgICAgICAgICAvKiBGL1cgb3BlcmF0aW5nIG1vZGUgKi8KICNkZWZpbmUgTE9PUCAgICAgIDAKICNkZWZpbmUgUDJQICAgICAgIDEKICNkZWZpbmUgTE9PUF9QMlAgIDIKICNkZWZpbmUgUDJQX0xPT1AgIDMKLQotICAgICAgICB1aW50OF90CQltYXJrZXJfbmVlZGVkOwotCiAJdWludDhfdAkJaW50ZXJydXB0c19vbjsKKwl1aW50MzJfdAlpc3BfYWJvcnRfY250OworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIgICAgMHgyNTMyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDg0MzIgICAgMHg4NDMyCisJdWludDMyX3QJZGV2aWNlX3R5cGU7CisjZGVmaW5lIERUX0lTUDIxMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKKyNkZWZpbmUgRFRfSVNQMjIwMCAgICAgICAgICAgICAgICAgICAgICBCSVRfMQorI2RlZmluZSBEVF9JU1AyMzAwICAgICAgICAgICAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIERUX0lTUDIzMTIgICAgICAgICAgICAgICAgICAgICAgQklUXzMKKyNkZWZpbmUgRFRfSVNQMjMyMiAgICAgICAgICAgICAgICAgICAgICBCSVRfNAorI2RlZmluZSBEVF9JU1A2MzEyICAgICAgICAgICAgICAgICAgICAgIEJJVF81CisjZGVmaW5lIERUX0lTUDYzMjIgICAgICAgICAgICAgICAgICAgICAgQklUXzYKKyNkZWZpbmUgRFRfSVNQMjQyMiAgICAgICAgICAgICAgICAgICAgICBCSVRfNworI2RlZmluZSBEVF9JU1AyNDMyICAgICAgICAgICAgICAgICAgICAgIEJJVF84CisjZGVmaW5lIERUX0lTUDU0MjIgICAgICAgICAgICAgICAgICAgICAgQklUXzkKKyNkZWZpbmUgRFRfSVNQNTQzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKKyNkZWZpbmUgRFRfSVNQMjUzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTEKKyNkZWZpbmUgRFRfSVNQODQzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKKyNkZWZpbmUgRFRfSVNQX0xBU1QgICAgICAgICAgICAgICAgICAgICAoRFRfSVNQODQzMiA8PCAxKQorCisjZGVmaW5lIERUX0lJRE1BICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI2CisjZGVmaW5lIERUX0ZXSTIgICAgICAgICAgICAgICAgICAgICAgICAgQklUXzI3CisjZGVmaW5lIERUX1pJT19TVVBQT1JURUQgICAgICAgICAgICAgICAgQklUXzI4CisjZGVmaW5lIERUX09FTV8wMDEgICAgICAgICAgICAgICAgICAgICAgQklUXzI5CisjZGVmaW5lIERUX0lTUDIyMDBBICAgICAgICAgICAgICAgICAgICAgQklUXzMwCisjZGVmaW5lIERUX0VYVEVOREVEX0lEUyAgICAgICAgICAgICAgICAgQklUXzMxCisjZGVmaW5lIERUX01BU0soaGEpICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiAoRFRfSVNQX0xBU1QgLSAxKSkKKyNkZWZpbmUgSVNfUUxBMjEwMChoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDIxMDApCisjZGVmaW5lIElTX1FMQTIyMDAoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1AyMjAwKQorI2RlZmluZSBJU19RTEEyMzAwKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQMjMwMCkKKyNkZWZpbmUgSVNfUUxBMjMxMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDIzMTIpCisjZGVmaW5lIElTX1FMQTIzMjIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1AyMzIyKQorI2RlZmluZSBJU19RTEE2MzEyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQNjMxMikKKyNkZWZpbmUgSVNfUUxBNjMyMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDYzMjIpCisjZGVmaW5lIElTX1FMQTI0MjIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1AyNDIyKQorI2RlZmluZSBJU19RTEEyNDMyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQMjQzMikKKyNkZWZpbmUgSVNfUUxBNTQyMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDU0MjIpCisjZGVmaW5lIElTX1FMQTU0MzIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1A1NDMyKQorI2RlZmluZSBJU19RTEEyNTMyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQMjUzMikKKyNkZWZpbmUgSVNfUUxBODQzMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDg0MzIpCisKKyNkZWZpbmUgSVNfUUxBMjNYWChoYSkgIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEEyMzIyKGhhKSB8fCBcCisJCQlJU19RTEE2MzEyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKKyNkZWZpbmUgSVNfUUxBMjRYWChoYSkgIChJU19RTEEyNDIyKGhhKSB8fCBJU19RTEEyNDMyKGhhKSkKKyNkZWZpbmUgSVNfUUxBNTRYWChoYSkgIChJU19RTEE1NDIyKGhhKSB8fCBJU19RTEE1NDMyKGhhKSkKKyNkZWZpbmUgSVNfUUxBMjVYWChoYSkgIChJU19RTEEyNTMyKGhhKSkKKyNkZWZpbmUgSVNfUUxBODRYWChoYSkgIChJU19RTEE4NDMyKGhhKSkKKyNkZWZpbmUgSVNfUUxBMjRYWF9UWVBFKGhhKSAgICAgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpIHx8IFwKKwkJCQlJU19RTEE4NFhYKGhhKSkKKyNkZWZpbmUgSVNfUUxBMlhYWF9NSURUWVBFKGhhKQkoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBODRYWChoYSkgfHwgXAorCQkJCUlTX1FMQTI1WFgoaGEpKQorCisjZGVmaW5lIElTX0lJRE1BX0NBUEFCTEUoaGEpICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0lJRE1BKQorI2RlZmluZSBJU19GV0kyX0NBUEFCTEUoaGEpICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9GV0kyKQorI2RlZmluZSBJU19aSU9fU1VQUE9SVEVEKGhhKSAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9aSU9fU1VQUE9SVEVEKQorI2RlZmluZSBJU19PRU1fMDAxKGhhKSAgICAgICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9PRU1fMDAxKQorI2RlZmluZSBIQVNfRVhURU5ERURfSURTKGhhKSAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9FWFRFTkRFRF9JRFMpCiAKIAkvKiBIQkEgc2VyaWFsIG51bWJlciAqLwogCXVpbnQ4X3QJCXNlcmlhbDA7CkBAIC0yMzg2LDggKzIzODgsOCBAQAogCXVpbnQ4X3QJCXNlcmlhbDI7CiAKIAkvKiBOVlJBTSBjb25maWd1cmF0aW9uIGRhdGEgKi8KLSNkZWZpbmUgTUFYX05WUkFNX1NJWkUJNDA5NgotI2RlZmluZSBWUERfT0ZGU0VUCU1BWF9OVlJBTV9TSVpFIC8gMgorI2RlZmluZSBNQVhfTlZSQU1fU0laRSAgNDA5NgorI2RlZmluZSBWUERfT0ZGU0VUICAgICAgTUFYX05WUkFNX1NJWkUgLyAyCiAJdWludDE2X3QJbnZyYW1fc2l6ZTsKIAl1aW50MTZfdAludnJhbV9iYXNlOwogCXZvaWQJCSpudnJhbTsKQEAgLTI0MDEsMjIgKzI0MDMsOCBAQAogCXVpbnQxNl90CXJfYV90b3Y7CiAJaW50CQlwb3J0X2Rvd25fcmV0cnlfY291bnQ7CiAJdWludDhfdAkJbWJ4X2NvdW50OwotCXVpbnQxNl90CWxhc3RfbG9vcF9pZDsKLQl1aW50MTZfdAltZ210X3N2cl9sb29wX2lkOwogCi0gICAgICAgIHVpbnQzMl90CWxvZ2luX3JldHJ5X2NvdW50OwotCWludAkJbWF4X3FfZGVwdGg7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkCXdvcmtfbGlzdDsKLQotCS8qIEZpYnJlIENoYW5uZWwgRGV2aWNlIExpc3QuICovCi0Jc3RydWN0IGxpc3RfaGVhZAlmY3BvcnRzOwotCi0JLyogUlNDTiBxdWV1ZS4gKi8KLQl1aW50MzJfdCByc2NuX3F1ZXVlW01BWF9SU0NOX0NPVU5UXTsKLQl1aW50OF90IHJzY25faW5fcHRyOwotCXVpbnQ4X3QgcnNjbl9vdXRfcHRyOwotCisJdWludDMyX3QJbG9naW5fcmV0cnlfY291bnQ7CiAJLyogU05TIGNvbW1hbmQgaW50ZXJmYWNlcy4gKi8KIAltc19pb2NiX2VudHJ5X3QJCSptc19pb2NiOwogCWRtYV9hZGRyX3QJCW1zX2lvY2JfZG1hOwpAQCAtMjQyNiwyOCArMjQxNCwyMCBAQAogCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKIAlkbWFfYWRkcl90CQlzbnNfY21kX2RtYTsKIAotI2RlZmluZSBTRlBfREVWX1NJWkUJMjU2Ci0jZGVmaW5lIFNGUF9CTE9DS19TSVpFCTY0Ci0Jdm9pZAkJCSpzZnBfZGF0YTsKLQlkbWFfYWRkcl90CQlzZnBfZGF0YV9kbWE7CisjZGVmaW5lIFNGUF9ERVZfU0laRSAgICAyNTYKKyNkZWZpbmUgU0ZQX0JMT0NLX1NJWkUgIDY0CisJdm9pZAkJKnNmcF9kYXRhOworCWRtYV9hZGRyX3QJc2ZwX2RhdGFfZG1hOwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSpkcGNfdGhyZWFkOwogCXVpbnQ4X3QgZHBjX2FjdGl2ZTsgICAgICAgICAgICAgICAgICAvKiBEUEMgcm91dGluZSBpcyBhY3RpdmUgKi8KIAotCS8qIFRpbWVvdXQgdGltZXJzLiAqLwotCXVpbnQ4X3QgICAgICAgICBsb29wX2Rvd25fYWJvcnRfdGltZTsgICAgLyogcG9ydCBkb3duIHRpbWVyICovCi0JYXRvbWljX3QgICAgICAgIGxvb3BfZG93bl90aW1lcjsgICAgICAgICAvKiBsb29wIGRvd24gdGltZXIgKi8KLQl1aW50OF90ICAgICAgICAgbGlua19kb3duX3RpbWVvdXQ7ICAgICAgIC8qIGxpbmsgZG93biB0aW1lb3V0ICovCi0KLQl1aW50MzJfdCAgICAgICAgdGltZXJfYWN0aXZlOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICB0aW1lcjsKLQogCWRtYV9hZGRyX3QJZ2lkX2xpc3RfZG1hOwogCXN0cnVjdCBnaWRfbGlzdF9pbmZvICpnaWRfbGlzdDsKIAlpbnQJCWdpZF9saXN0X2luZm9fc2l6ZTsKIAogCS8qIFNtYWxsIERNQSBwb29sIGFsbG9jYXRpb25zIC0tIG1heGltdW0gMjU2IGJ5dGVzIGluIGxlbmd0aC4gKi8KLSNkZWZpbmUgRE1BX1BPT0xfU0laRQkyNTYKKyNkZWZpbmUgRE1BX1BPT0xfU0laRSAgIDI1NgogCXN0cnVjdCBkbWFfcG9vbCAqc19kbWFfcG9vbDsKIAogCWRtYV9hZGRyX3QJaW5pdF9jYl9kbWE7CkBAIC0yNDU5LDE3ICsyNDM5LDE3IEBACiAKIAltYnhfY21kX3QJKm1jcDsKIAl1bnNpZ25lZCBsb25nCW1ieF9jbWRfZmxhZ3M7Ci0jZGVmaW5lIE1CWF9JTlRFUlJVUFQJMQotI2RlZmluZSBNQlhfSU5UUl9XQUlUCTIKKyNkZWZpbmUgTUJYX0lOVEVSUlVQVAkJMQorI2RlZmluZSBNQlhfSU5UUl9XQUlUCQkyCiAjZGVmaW5lIE1CWF9VUERBVEVfRkxBU0hfQUNUSVZFCTMKIAotCXN0cnVjdCBtdXRleCB2cG9ydF9sb2NrOwkvKiBWaXJ0dWFsIHBvcnQgc3luY2hyb25pemF0aW9uICovCi0Jc3RydWN0IGNvbXBsZXRpb24gbWJ4X2NtZF9jb21wOwkvKiBTZXJpYWxpemUgbWJ4IGFjY2VzcyAqLworCXN0cnVjdCBtdXRleCB2cG9ydF9sb2NrOyAgICAgICAgLyogVmlydHVhbCBwb3J0IHN5bmNocm9uaXphdGlvbiAqLworCXN0cnVjdCBjb21wbGV0aW9uIG1ieF9jbWRfY29tcDsgLyogU2VyaWFsaXplIG1ieCBhY2Nlc3MgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbiBtYnhfaW50cl9jb21wOyAgLyogVXNlZCBmb3IgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KIAogCXVpbnQzMl90CW1ieF9mbGFnczsKICNkZWZpbmUgIE1CWF9JTl9QUk9HUkVTUwlCSVRfMAotI2RlZmluZSAgTUJYX0JVU1kJCUJJVF8xCS8qIEdvdCB0aGUgQWNjZXNzICovCisjZGVmaW5lICBNQlhfQlVTWQkJQklUXzEgICAvKiBHb3QgdGhlIEFjY2VzcyAqLwogI2RlZmluZSAgTUJYX1NMRUVQSU5HX09OX1NFTQlCSVRfMgogI2RlZmluZSAgTUJYX1BPTExJTkdfRk9SX0NPTVAJQklUXzMKICNkZWZpbmUgIE1CWF9DT01QTEVURUQJCUJJVF80CkBAIC0yNDg4LDcgKzI0NjgsNyBAQAogI2RlZmluZSBSSVNDX1NUQVJUX0FERFJFU1NfMjMwMCAweDgwMAogI2RlZmluZSBSSVNDX1NUQVJUX0FERFJFU1NfMjQwMCAweDEwMDAwMAogCi0JdWludDE2X3QJZndfb3B0aW9uc1sxNl07CQkvKiBzbG90czogMSwyLDMsMTAsMTEgKi8KKwl1aW50MTZfdAlmd19vcHRpb25zWzE2XTsgICAgICAgICAvKiBzbG90czogMSwyLDMsMTAsMTEgKi8KIAl1aW50OF90CQlmd19zZXJpYWxsaW5rX29wdGlvbnNbNF07CiAJdWludDE2X3QJZndfc2VyaWFsbGlua19vcHRpb25zMjRbNF07CiAKQEAgLTI1MDksMTAgKzI0ODksMTAgQEAKIAl1aW50NjRfdAlmY2Vfd3IsIGZjZV9yZDsKIAlzdHJ1Y3QgbXV0ZXgJZmNlX211dGV4OwogCisJdWludDMyX3QJaHdfZXZlbnRfc3RhcnQ7CiAJdWludDMyX3QJaHdfZXZlbnRfcHRyOwogCXVpbnQzMl90CWh3X2V2ZW50X3BhdXNlX2Vycm9yczsKIAotCXVpbnQ4X3QJCWhvc3Rfc3RyWzE2XTsKIAl1aW50MzJfdAlwY2lfYXR0cjsKIAl1aW50MTZfdAljaGlwX3JldmlzaW9uOwogCkBAIC0yNTIzLDExICsyNTAzLDYgQEAKIAljaGFyCQltb2RlbF9kZXNjWzgwXTsKIAl1aW50OF90CQlhZGFwdGVyX2lkWzE2KzFdOwogCi0JdWludDhfdAkJKm5vZGVfbmFtZTsKLQl1aW50OF90CQkqcG9ydF9uYW1lOwotCXVpbnQ4X3QJCWZhYnJpY19ub2RlX25hbWVbV1dOX1NJWkVdOwotCXVpbnQzMl90ICAgIGlzcF9hYm9ydF9jbnQ7Ci0KIAkvKiBPcHRpb24gUk9NIGluZm9ybWF0aW9uLiAqLwogCWNoYXIJCSpvcHRyb21fYnVmZmVyOwogCXVpbnQzMl90CW9wdHJvbV9zaXplOwpAQCAtMjUzOCwxMyArMjUxMywxMyBAQAogCXVpbnQzMl90CW9wdHJvbV9yZWdpb25fc3RhcnQ7CiAJdWludDMyX3QJb3B0cm9tX3JlZ2lvbl9zaXplOwogCi0gICAgICAgIC8qIFBDSSBleHBhbnNpb24gUk9NIGltYWdlIGluZm9ybWF0aW9uLiAqLworLyogUENJIGV4cGFuc2lvbiBST00gaW1hZ2UgaW5mb3JtYXRpb24uICovCiAjZGVmaW5lIFJPTV9DT0RFX1RZUEVfQklPUwkwCiAjZGVmaW5lIFJPTV9DT0RFX1RZUEVfRkNPREUJMQogI2RlZmluZSBST01fQ09ERV9UWVBFX0VGSQkzCi0JdWludDhfdAkJYmlvc19yZXZpc2lvblsyXTsKLQl1aW50OF90CQllZmlfcmV2aXNpb25bMl07Ci0JdWludDhfdAkJZmNvZGVfcmV2aXNpb25bMTZdOworCXVpbnQ4X3QgCWJpb3NfcmV2aXNpb25bMl07CisJdWludDhfdCAJZWZpX3JldmlzaW9uWzJdOworCXVpbnQ4X3QgCWZjb2RlX3JldmlzaW9uWzE2XTsKIAl1aW50MzJfdAlmd19yZXZpc2lvbls0XTsKIAogCXVpbnQzMl90CWZkdF93cnRfZGlzYWJsZTsKQEAgLTI1NTMsMzkgKzI1MjgsMTQ0IEBACiAJdWludDMyX3QJZmR0X3VucHJvdGVjdF9zZWNfY21kOwogCXVpbnQzMl90CWZkdF9wcm90ZWN0X3NlY19jbWQ7CiAKLQl1aW50MzJfdAlmbHRfcmVnaW9uX2ZsdDsKLQl1aW50MzJfdAlmbHRfcmVnaW9uX2ZkdDsKLQl1aW50MzJfdAlmbHRfcmVnaW9uX2Jvb3Q7Ci0JdWludDMyX3QJZmx0X3JlZ2lvbl9mdzsKLQl1aW50MzJfdAlmbHRfcmVnaW9uX3ZwZF9udnJhbTsKLQl1aW50MzJfdAlmbHRfcmVnaW9uX2h3X2V2ZW50OwotCXVpbnQzMl90CWZsdF9yZWdpb25fbnBpdl9jb25mOworCXVpbnQzMl90ICAgICAgICBmbHRfcmVnaW9uX2ZsdDsKKwl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9mZHQ7CisJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fYm9vdDsKKwl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9mdzsKKwl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl92cGRfbnZyYW07CisJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25faHdfZXZlbnQ7CisJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fbnBpdl9jb25mOwogCiAJLyogTmVlZGVkIGZvciBCRUFDT04gKi8KLQl1aW50MTZfdAliZWFjb25fYmxpbmtfbGVkOwotCXVpbnQ4X3QJCWJlYWNvbl9jb2xvcl9zdGF0ZTsKKwl1aW50MTZfdCAgICAgICAgYmVhY29uX2JsaW5rX2xlZDsKKwl1aW50OF90ICAgICAgICAgYmVhY29uX2NvbG9yX3N0YXRlOwogI2RlZmluZSBRTEFfTEVEX0dSTl9PTgkJMHgwMQogI2RlZmluZSBRTEFfTEVEX1lMV19PTgkJMHgwMgogI2RlZmluZSBRTEFfTEVEX0FCUl9PTgkJMHgwNAogI2RlZmluZSBRTEFfTEVEX0FMTF9PTgkJMHgwNwkvKiB5ZWxsb3csIGdyZWVuLCBhbWJlci4gKi8KIAkJCQkJLyogSVNQMjMyMjogcmVkLCBncmVlbiwgYW1iZXIuICovCi0KLQl1aW50MTZfdAl6aW9fbW9kZTsKLQl1aW50MTZfdAl6aW9fdGltZXI7CisJdWludDE2X3QgICAgICAgIHppb19tb2RlOworCXVpbnQxNl90ICAgICAgICB6aW9fdGltZXI7CiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyBmY19ob3N0X3N0YXQ7CiAKLQlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgbXNpeF9lbnRyaWVzW1FMQV9NU0lYX0VOVFJJRVNdOworCXN0cnVjdCBxbGFfbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwogCi0Jc3RydWN0IGxpc3RfaGVhZAl2cF9saXN0OwkvKiBsaXN0IG9mIFZQICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgdnBfbGlzdDsgICAgICAgIC8qIGxpc3Qgb2YgVlAgKi8KKwl1bnNpZ25lZCBsb25nICAgdnBfaWR4X21hcFsoTUFYX01VTFRJX0lEX0ZBQlJJQyAvIDgpIC8KKwkJCXNpemVvZih1bnNpZ25lZCBsb25nKV07CisJdWludDE2X3QgICAgICAgIG51bV92aG9zdHM7ICAgICAvKiBudW1iZXIgb2YgdnBvcnRzIGNyZWF0ZWQgKi8KKwl1aW50MTZfdCAgICAgICAgbnVtX3ZzYW5zOyAgICAgIC8qIG51bWJlciBvZiB2c2FuIGNyZWF0ZWQgKi8KKwl1aW50MTZfdCAgICAgICAgbWF4X25waXZfdnBvcnRzOyAgICAgICAgLyogNjMgb3IgMTI1IHBlciB0b3BvbG90eSAqLworCWludCAgICAgICAgICAgICBjdXJfdnBvcnRfY291bnQ7CisKKwlzdHJ1Y3QgcWxhX2NoaXBfc3RhdGVfODR4eCAqY3M4NHh4OworCXN0cnVjdCBxbGFfc3RhdGlzdGljcyBxbGFfc3RhdHM7CisJc3RydWN0IGlzcF9vcGVyYXRpb25zICppc3Bfb3BzOworfTsKKworLyoKKyAqIFFsb2dpYyBzY3NpIGhvc3Qgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNjc2lfcWxhX2hvc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZwX2ZjcG9ydHM7CS8qIGxpc3Qgb2YgZmNwb3J0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgd29ya19saXN0OworCS8qIENvbW1vbmx5IHVzZWQgZmxhZ3MgYW5kIHN0YXRlIGluZm9ybWF0aW9uLiAqLworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJdW5zaWduZWQgbG9uZwlob3N0X25vOworCXVpbnQ4X3QJCWhvc3Rfc3RyWzE2XTsKKworCXZvbGF0aWxlIHN0cnVjdCB7CisJCXVpbnQzMl90CWluaXRfZG9uZQkJOjE7CisJCXVpbnQzMl90CW9ubGluZQkJCToxOworCQl1aW50MzJfdAlyc2NuX3F1ZXVlX292ZXJmbG93CToxOworCQl1aW50MzJfdAlyZXNldF9hY3RpdmUJCToxOworCisJCXVpbnQzMl90CW1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA6MTsKKwkJdWludDMyX3QJcHJvY2Vzc19yZXNwb25zZV9xdWV1ZQk6MTsKKwl9IGZsYWdzOworCisJYXRvbWljX3QJbG9vcF9zdGF0ZTsKKyNkZWZpbmUgTE9PUF9USU1FT1VUCTEKKyNkZWZpbmUgTE9PUF9ET1dOCTIKKyNkZWZpbmUgTE9PUF9VUAkJMworI2RlZmluZSBMT09QX1VQREFURQk0CisjZGVmaW5lIExPT1BfUkVBRFkJNQorI2RlZmluZSBMT09QX0RFQUQJNgorCisJdW5zaWduZWQgbG9uZyAgIGRwY19mbGFnczsKKyNkZWZpbmUgUkVTRVRfTUFSS0VSX05FRURFRAkwCS8qIFNlbmQgbWFya2VyIHRvIElTUC4gKi8KKyNkZWZpbmUgUkVTRVRfQUNUSVZFCQkxCisjZGVmaW5lIElTUF9BQk9SVF9ORUVERUQJMgkvKiBJbml0aWF0ZSBJU1AgYWJvcnQuICovCisjZGVmaW5lIEFCT1JUX0lTUF9BQ1RJVkUJMwkvKiBJU1AgYWJvcnQgaW4gcHJvZ3Jlc3MuICovCisjZGVmaW5lIExPT1BfUkVTWU5DX05FRURFRAk0CS8qIERldmljZSBSZXN5bmMgbmVlZGVkLiAqLworI2RlZmluZSBMT09QX1JFU1lOQ19BQ1RJVkUJNQorI2RlZmluZSBMT0NBTF9MT09QX1VQREFURQk2CS8qIFBlcmZvcm0gYSBsb2NhbCBsb29wIHVwZGF0ZS4gKi8KKyNkZWZpbmUgUlNDTl9VUERBVEUJCTcJLyogUGVyZm9ybSBhbiBSU0NOIHVwZGF0ZS4gKi8KKyNkZWZpbmUgTUFJTEJPWF9SRVRSWQkJOAorI2RlZmluZSBJU1BfUkVTRVRfTkVFREVECTkJLyogSW5pdGlhdGUgYSBJU1AgcmVzZXQuICovCisjZGVmaW5lIEZBSUxPVkVSX0VWRU5UX05FRURFRAkxMAorI2RlZmluZSBGQUlMT1ZFUl9FVkVOVAkJMTEKKyNkZWZpbmUgRkFJTE9WRVJfTkVFREVECQkxMgorI2RlZmluZSBTQ1NJX1JFU1RBUlRfTkVFREVECTEzCS8qIFByb2Nlc3NlcyBTQ1NJIHJldHJ5IHF1ZXVlLiAqLworI2RlZmluZSBQT1JUX1JFU1RBUlRfTkVFREVECTE0CS8qIFByb2Nlc3NlcyBSZXRyeSBxdWV1ZS4gKi8KKyNkZWZpbmUgUkVTVEFSVF9RVUVVRVNfTkVFREVECTE1CS8qIFJlc3RhcnRzIHRoZSBMdW4gcXVldWUuICovCisjZGVmaW5lIEFCT1JUX1FVRVVFU19ORUVERUQJMTYKKyNkZWZpbmUgUkVMT0dJTl9ORUVERUQJCTE3CisjZGVmaW5lIExPR0lOX1JFVFJZX05FRURFRAkxOAkvKiBJbml0aWF0ZSByZXF1aXJlZCBmYWJyaWMgbG9naW5zLiAqLworI2RlZmluZSBSRUdJU1RFUl9GQzRfTkVFREVECTE5CS8qIFNOUyBGQzQgcmVnaXN0cmF0aW9uIHJlcXVpcmVkLiAqLworI2RlZmluZSBJU1BfQUJPUlRfUkVUUlkJCTIwCS8qIElTUCBhYm9ydGVkLiAqLworI2RlZmluZSBGQ1BPUlRfUkVTQ0FOX05FRURFRAkyMQkvKiBJTyBkZXNjcmlwdG9yIHByb2Nlc3NpbmcgbmVlZGVkICovCisjZGVmaW5lIElPREVTQ19QUk9DRVNTX05FRURFRAkyMgkvKiBJTyBkZXNjcmlwdG9yIHByb2Nlc3NpbmcgbmVlZGVkICovCisjZGVmaW5lIElPQ1RMX0VSUk9SX1JFQ09WRVJZCTIzCisjZGVmaW5lIExPT1BfUkVTRVRfTkVFREVECTI0CisjZGVmaW5lIEJFQUNPTl9CTElOS19ORUVERUQJMjUKKyNkZWZpbmUgUkVHSVNURVJfRkRNSV9ORUVERUQJMjYKKyNkZWZpbmUgRkNQT1JUX1VQREFURV9ORUVERUQJMjcKKyNkZWZpbmUgVlBfRFBDX05FRURFRAkJMjgJLyogd2FrZSB1cCBmb3IgVlAgZHBjIGhhbmRsaW5nICovCisjZGVmaW5lIFVOTE9BRElORwkJMjkKKyNkZWZpbmUgTlBJVl9DT05GSUdfTkVFREVECTMwCisKKwl1aW50MzJfdAlkZXZpY2VfZmxhZ3M7CisjZGVmaW5lIERGTEdfTE9DQUxfREVWSUNFUwkJQklUXzAKKyNkZWZpbmUgREZMR19SRVRSWV9MT0NBTF9ERVZJQ0VTCUJJVF8xCisjZGVmaW5lIERGTEdfRkFCUklDX0RFVklDRVMJCUJJVF8yCisjZGVmaW5lIFNXSVRDSF9GT1VORAkJCUJJVF8zCisjZGVmaW5lIERGTEdfTk9fQ0FCTEUJCQlCSVRfNAorCisJc3JiX3QJCSpzdGF0dXNfc3JiOwkvKiBTdGF0dXMgY29udGludWF0aW9uIGVudHJ5LiAqLworCisJLyogSVNQIGNvbmZpZ3VyYXRpb24gZGF0YS4gKi8KKwl1aW50MTZfdAlsb29wX2lkOwkJLyogSG9zdCBhZGFwdGVyIGxvb3AgaWQgKi8KKworCXBvcnRfaWRfdAlkX2lkOwkJCS8qIEhvc3QgYWRhcHRlciBwb3J0IGlkICovCisJdWludDhfdAkJbWFya2VyX25lZWRlZDsKKwl1aW50MTZfdAltZ210X3N2cl9sb29wX2lkOworCisKKworCS8qIFJTQ04gcXVldWUuICovCisJdWludDMyX3QgcnNjbl9xdWV1ZVtNQVhfUlNDTl9DT1VOVF07CisJdWludDhfdCByc2NuX2luX3B0cjsKKwl1aW50OF90IHJzY25fb3V0X3B0cjsKKworCS8qIFRpbWVvdXQgdGltZXJzLiAqLworCXVpbnQ4X3QgICAgICAgICBsb29wX2Rvd25fYWJvcnRfdGltZTsgICAgLyogcG9ydCBkb3duIHRpbWVyICovCisJYXRvbWljX3QgICAgICAgIGxvb3BfZG93bl90aW1lcjsgICAgICAgICAvKiBsb29wIGRvd24gdGltZXIgKi8KKwl1aW50OF90ICAgICAgICAgbGlua19kb3duX3RpbWVvdXQ7ICAgICAgIC8qIGxpbmsgZG93biB0aW1lb3V0ICovCisKKwl1aW50MzJfdCAgICAgICAgdGltZXJfYWN0aXZlOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICB0aW1lcjsKKworCXVpbnQ4X3QJCW5vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdAkJcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90CQlmYWJyaWNfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MzJfdCAgIAl2cF9hYm9ydF9jbnQ7CisKIAlzdHJ1Y3QgZmNfdnBvcnQJKmZjX3Zwb3J0OwkvKiBob2xkcyBmY192cG9ydCAqIGZvciBlYWNoIHZwb3J0ICovCi0JdW5zaWduZWQgbG9uZwl2cF9pZHhfbWFwWyhNQVhfTVVMVElfSURfRkFCUklDIC8gOCkgLyBzaXplb2YodW5zaWduZWQgbG9uZyldOwotCXVpbnQxNl90ICAgICAgICBudW1fdmhvc3RzOwkvKiBudW1iZXIgb2YgdnBvcnRzIGNyZWF0ZWQgKi8KLQl1aW50MTZfdCAgICAgICAgbnVtX3ZzYW5zOwkvKiBudW1iZXIgb2YgdnNhbiBjcmVhdGVkICovCiAJdWludDE2X3QgICAgICAgIHZwX2lkeDsJCS8qIHZwb3J0IElEICovCiAKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdAkqcGFyZW50OwkvKiBob2xkcyBwcG9ydCAqLwogCXVuc2lnbmVkIGxvbmcJCXZwX2ZsYWdzOwotCXN0cnVjdCBsaXN0X2hlYWQJdnBfZmNwb3J0czsJLyogbGlzdCBvZiBmY3BvcnRzICovCiAjZGVmaW5lIFZQX0lEWF9BQ1FVSVJFRAkJMAkvKiBiaXQgbm8gMCAqLwogI2RlZmluZSBWUF9DUkVBVEVfTkVFREVECTEKICNkZWZpbmUgVlBfQklORF9ORUVERUQJCTIKQEAgLTI2MDQsMTQgKzI2ODQsMTAgQEAKICNkZWZpbmUgVlBfRVJSX0ZBQl9OT1JFU09VUkNFUwkzCiAjZGVmaW5lIFZQX0VSUl9GQUJfTE9HT1VUCTQKICNkZWZpbmUgVlBfRVJSX0FEQVBfTk9SRVNPVVJDRVMJNQotCXVpbnQxNl90CW1heF9ucGl2X3Zwb3J0czsJLyogNjMgb3IgMTI1IHBlciB0b3BvbG90eSAqLwotCWludAkJY3VyX3Zwb3J0X2NvdW50OwotCi0Jc3RydWN0IHFsYV9jaGlwX3N0YXRlXzg0eHggKmNzODR4eDsKLQlzdHJ1Y3QgcWxhX3N0YXRpc3RpY3MgcWxhX3N0YXRzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaHc7CisJaW50CXJlcV9xdWVzW1FMQV9NQVhfSE9TVF9RVUVTXTsKIH0gc2NzaV9xbGFfaG9zdF90OwogCi0KIC8qCiAgKiBNYWNyb3MgdG8gaGVscCBjb2RlLCBtYWludGFpbiwgZXRjLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKaW5kZXggNTYxYTQ0MS4uMGUzNjZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwpAQCAtMTUsMTAgKzE1LDExIEBACiBzdGF0aWMgaW50CiBxbGEyeDAwX2Rmc19mY2Vfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gcy0+cHJpdmF0ZTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHMtPnByaXZhdGU7CiAJdWludDMyX3QgY250OwogCXVpbnQzMl90ICpmY2U7CiAJdWludDY0X3QgZmNlX3N0YXJ0OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJbXV0ZXhfbG9jaygmaGEtPmZjZV9tdXRleCk7CiAKQEAgLTUxLDcgKzUyLDggQEAKIHN0YXRpYyBpbnQKIHFsYTJ4MDBfZGZzX2ZjZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcnZhbDsKIAogCWlmICghaGEtPmZsYWdzLmZjZV9lbmFibGVkKQpAQCAtNjAsNyArNjIsNyBAQAogCW11dGV4X2xvY2soJmhhLT5mY2VfbXV0ZXgpOwogCiAJLyogUGF1c2UgdHJhY2luZyB0byBmbHVzaCBGQ0UgYnVmZmVycy4gKi8KLQlydmFsID0gcWxhMngwMF9kaXNhYmxlX2ZjZV90cmFjZShoYSwgJmhhLT5mY2Vfd3IsICZoYS0+ZmNlX3JkKTsKKwlydmFsID0gcWxhMngwMF9kaXNhYmxlX2ZjZV90cmFjZSh2aGEsICZoYS0+ZmNlX3dyLCAmaGEtPmZjZV9yZCk7CiAJaWYgKHJ2YWwpCiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gZGlzYWJsZSBGQ0UgKCVkKS5cbiIsIHJ2YWwpOwpAQCAtNzUsNyArNzcsOCBAQAogc3RhdGljIGludAogcWxhMngwMF9kZnNfZmNlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IGlub2RlLT5pX3ByaXZhdGU7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCBydmFsOwogCiAJaWYgKGhhLT5mbGFncy5mY2VfZW5hYmxlZCkKQEAgLTg2LDcgKzg5LDcgQEAKIAkvKiBSZS1lbmFibGUgRkNFIHRyYWNpbmcuICovCiAJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMTsKIAltZW1zZXQoaGEtPmZjZSwgMCwgZmNlX2NhbGNfc2l6ZShoYS0+ZmNlX2J1ZnMpKTsKLQlydmFsID0gcWxhMngwMF9lbmFibGVfZmNlX3RyYWNlKGhhLCBoYS0+ZmNlX2RtYSwgaGEtPmZjZV9idWZzLAorCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9mY2VfdHJhY2UodmhhLCBoYS0+ZmNlX2RtYSwgaGEtPmZjZV9idWZzLAogCSAgICBoYS0+ZmNlX21iLCAmaGEtPmZjZV9idWZzKTsKIAlpZiAocnZhbCkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCkBAIC0xMDcsOCArMTEwLDkgQEAKIH07CiAKIGludAotcWxhMngwMF9kZnNfc2V0dXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZGZzX3NldHVwKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWlmICghSVNfUUxBMjVYWChoYSkpCiAJCWdvdG8gb3V0OwogCWlmICghaGEtPmZjZSkKQEAgLTEzMCw3ICsxMzQsNyBAQAogCQlnb3RvIGNyZWF0ZV9ub2RlczsKIAogCW11dGV4X2luaXQoJmhhLT5mY2VfbXV0ZXgpOwotCWhhLT5kZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGhhLT5ob3N0X3N0ciwgcWxhMngwMF9kZnNfcm9vdCk7CisJaGEtPmRmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIodmhhLT5ob3N0X3N0ciwgcWxhMngwMF9kZnNfcm9vdCk7CiAJaWYgKCFoYS0+ZGZzX2RpcikgewogCQlxbGFfcHJpbnRrKEtFUk5fTk9USUNFLCBoYSwKIAkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gY3JlYXRlIGhhIGRpcmVjdG9yeS5cbiIpOwpAQCAtMTUyLDggKzE1Niw5IEBACiB9CiAKIGludAotcWxhMngwMF9kZnNfcmVtb3ZlKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2Rmc19yZW1vdmUoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaWYgKGhhLT5kZnNfZmNlKSB7CiAJCWRlYnVnZnNfcmVtb3ZlKGhhLT5kZnNfZmNlKTsKIAkJaGEtPmRmc19mY2UgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaAppbmRleCBkMWQxNDIwLi5lZTFmMWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaApAQCAtMjk5LDcgKzI5OSw4IEBACiAJdWludDMyX3QgcmVzcG9uc2VfcV9hZGRyZXNzWzJdOwogCXVpbnQzMl90IHByaW9fcmVxdWVzdF9xX2FkZHJlc3NbMl07CiAKLQl1aW50OF90IHJlc2VydmVkXzJbOF07CisJdWludDE2X3QgbXNpeDsKKwl1aW50OF90IHJlc2VydmVkXzJbNl07CiAKIAl1aW50MTZfdCBhdGlvX3FfaW5wb2ludGVyOwogCXVpbnQxNl90IGF0aW9fcV9sZW5ndGg7CkBAIC0zNzIsOCArMzczLDkgQEAKIAkgKiBCSVQgMTctMzEgPSBSZXNlcnZlZAogCSAqLwogCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMzsKLQotCXVpbnQ4X3QgIHJlc2VydmVkXzNbMjRdOworCXVpbnQxNl90IHFvczsKKwl1aW50MTZfdCByaWQ7CisJdWludDhfdCAgcmVzZXJ2ZWRfM1syMF07CiB9OwogCiAvKgpAQCAtNzU0LDcgKzc1Niw4IEBACiAKIAl1aW50MzJfdCBoYW5kbGVfdG9fYWJvcnQ7CS8qIFN5c3RlbSBoYW5kbGUgdG8gYWJvcnQuICovCiAKLQl1aW50OF90IHJlc2VydmVkXzFbMzJdOworCXVpbnQxNl90IHJlcV9xdWVfbm87CisJdWludDhfdCByZXNlcnZlZF8xWzMwXTsKIAogCXVpbnQ4X3QgcG9ydF9pZFszXTsJCS8qIFBvcnRJRCBvZiBkZXN0aW5hdGlvbiBwb3J0LiAqLwogCXVpbnQ4X3QgdnBfaW5kZXg7CkBAIC0xMjU4LDcgKzEyNjEsOCBAQAogc3RydWN0IHFsYV9ucGl2X2VudHJ5IHsKIAl1aW50MTZfdCBmbGFnczsKIAl1aW50MTZfdCB2Zl9pZDsKLQl1aW50MTZfdCBxb3M7CisJdWludDhfdCBxX3FvczsKKwl1aW50OF90IGZfcW9zOwogCXVpbnQxNl90IHVudXNlZDE7CiAJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOwogCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAppbmRleCA3NTNkYmU2Li4wMDExZTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC02Myw2ICs2Myw3IEBACiBleHRlcm4gaW50IHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOwogZXh0ZXJuIGludCBxbDJ4cWZ1bGxyYW1wdXA7CiBleHRlcm4gaW50IHFsMnhpaWRtYWVuYWJsZTsKK2V4dGVybiBpbnQgcWwyeG1heHF1ZXVlczsKIAogZXh0ZXJuIGludCBxbGEyeDAwX2xvb3BfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9hYm9ydF9hbGxfY21kcyhzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKQEAgLTcyLDcgKzczLDEwIEBACiAgICAgdWludDE2X3QsIHVpbnQxNl90KTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9hYm9ydF9mY3BvcnRfY21kcyhmY19wb3J0X3QgKik7Ci0KK2V4dGVybiBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqcWxhMngwMF9jcmVhdGVfaG9zdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICosCisJc3RydWN0IHFsYV9od19kYXRhICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9mcmVlX2hvc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX3JlbG9naW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiAvKgogICogR2xvYmFsIEZ1bmN0aW9ucyBpbiBxbGFfbWlkLmMgc291cmNlIGZpbGUuCiAgKi8KQEAgLTk0LDcgKzk4LDcgQEAKIGV4dGVybiBpbnQgcWxhMjR4eF92cG9ydF9jcmVhdGVfcmVxX3Nhbml0eV9jaGVjayhzdHJ1Y3QgZmNfdnBvcnQgKik7CiBleHRlcm4gc2NzaV9xbGFfaG9zdF90ICogcWxhMjR4eF9jcmVhdGVfdmhvc3Qoc3RydWN0IGZjX3Zwb3J0ICopOwogCi1leHRlcm4gdm9pZCBxbGEyeDAwX3NwX2NvbXBsKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfc3BfY29tcGwoc3RydWN0IHFsYV9od19kYXRhICosIHNyYl90ICopOwogCiBleHRlcm4gY2hhciAqcWxhMngwMF9nZXRfZndfdmVyc2lvbl9zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgY2hhciAqKTsKIApAQCAtMTA1LDEwICsxMDksMTEgQEAKIAogZXh0ZXJuIGludCBxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoc2NzaV9xbGFfaG9zdF90ICopOwogCi1leHRlcm4gdm9pZCBxbGEyeHh4X3dha2VfZHBjKHNjc2lfcWxhX2hvc3RfdCAqKTsKLWV4dGVybiB2b2lkIHFsYTJ4MDBfYWxlcnRfYWxsX3ZwcyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKik7Ci1leHRlcm4gdm9pZCBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqKTsKLWV4dGVybiB2b2lkIHFsYTJ4MDBfdnBfYWJvcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4eHhfd2FrZV9kcGMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2FsZXJ0X2FsbF92cHMoc3RydWN0IHJzcF9xdWUgKiwgdWludDE2X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgcnNwX3F1ZSAqLAorCXVpbnQxNl90ICopOworZXh0ZXJuIGludCAgcWxhMngwMF92cF9hYm9ydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICopOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2lvY2IuYyBzb3VyY2UgZmlsZS4KQEAgLTExOSw4ICsxMjQsMTAgQEAKIGV4dGVybiB2b2lkIHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic182NChzcmJfdCAqLCBjbWRfZW50cnlfdCAqLCB1aW50MTZfdCk7CiBleHRlcm4gaW50IHFsYTJ4MDBfc3RhcnRfc2NzaShzcmJfdCAqc3ApOwogZXh0ZXJuIGludCBxbGEyNHh4X3N0YXJ0X3Njc2koc3JiX3QgKnNwKTsKLWludCBxbGEyeDAwX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50OF90KTsKLWludCBfX3FsYTJ4MDBfbWFya2VyKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOworaW50IHFsYTJ4MDBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICosIHN0cnVjdCByc3BfcXVlICosCisJCQkJCQl1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOworaW50IF9fcWxhMngwMF9tYXJrZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlcV9xdWUgKiwgc3RydWN0IHJzcF9xdWUgKiwKKwkJCQkJCXVpbnQxNl90LCB1aW50MTZfdCwgdWludDhfdCk7CiAKIC8qCiAgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfbWJ4LmMgc291cmNlIGZpbGUuCkBAIC0xNTQsNyArMTYxLDcgQEAKIHFsYTJ4MDBfaXNzdWVfaW9jYihzY3NpX3FsYV9ob3N0X3QgKiwgdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogCiBleHRlcm4gaW50Ci1xbGEyeDAwX2Fib3J0X2NvbW1hbmQoc2NzaV9xbGFfaG9zdF90ICosIHNyYl90ICopOworcWxhMngwMF9hYm9ydF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqLCBzdHJ1Y3QgcmVxX3F1ZSAqKTsKIAogZXh0ZXJuIGludAogcWxhMngwMF9hYm9ydF90YXJnZXQoc3RydWN0IGZjX3BvcnQgKiwgdW5zaWduZWQgaW50KTsKQEAgLTIyNSw3ICsyMzIsNyBAQAogcWxhMjR4eF9nZXRfaXNwX3N0YXRzKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgbGlua19zdGF0aXN0aWNzICosCiAgICAgZG1hX2FkZHJfdCk7CiAKLWV4dGVybiBpbnQgcWxhMjR4eF9hYm9ydF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsKK2V4dGVybiBpbnQgcWxhMjR4eF9hYm9ydF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqLCBzdHJ1Y3QgcmVxX3F1ZSAqKTsKIGV4dGVybiBpbnQgcWxhMjR4eF9hYm9ydF90YXJnZXQoc3RydWN0IGZjX3BvcnQgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgcWxhMjR4eF9sdW5fcmVzZXQoc3RydWN0IGZjX3BvcnQgKiwgdW5zaWduZWQgaW50KTsKIApAQCAtMjY0LDEwICsyNzEsMTAgQEAKIGV4dGVybiBpcnFyZXR1cm5fdCBxbGEyMTAwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKik7CiBleHRlcm4gaXJxcmV0dXJuX3QgcWxhMjMwMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICopOwogZXh0ZXJuIGlycXJldHVybl90IHFsYTI0eHhfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIHFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKLWV4dGVybiB2b2lkIHFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3QgcnNwX3F1ZSAqKTsKK2V4dGVybiB2b2lkIHFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3QgcnNwX3F1ZSAqKTsKIAotZXh0ZXJuIGludCBxbGEyeDAwX3JlcXVlc3RfaXJxcyhzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfcmVxdWVzdF9pcnFzKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCBzdHJ1Y3QgcnNwX3F1ZSAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZnJlZV9pcnFzKHNjc2lfcWxhX2hvc3RfdCAqKTsKIAogLyoKQEAgLTM2Nyw0ICszNzQsMjcgQEAKICAqLwogZXh0ZXJuIGludCBxbGEyeDAwX2Rmc19zZXR1cChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTJ4MDBfZGZzX3JlbW92ZShzY3NpX3FsYV9ob3N0X3QgKik7CisKKy8qIEdsb2JhIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIG11bHRpLXEgKi8KK2V4dGVybiBpbnQgcWxhMjV4eF9yZXF1ZXN0X2lycShzdHJ1Y3QgcnNwX3F1ZSAqKTsKK2V4dGVybiBpbnQgcWxhMjV4eF9pbml0X3JlcV9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlcV9xdWUgKiwKKwl1aW50OF90KTsKK2V4dGVybiBpbnQgcWxhMjV4eF9pbml0X3JzcF9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJzcF9xdWUgKiwKKwl1aW50OF90KTsKK2V4dGVybiBpbnQgcWxhMjV4eF9jcmVhdGVfcmVxX3F1ZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdWludDE2X3QsIHVpbnQ4X3QsCisJdWludDE2X3QsIHVpbnQ4X3QsIHVpbnQ4X3QpOworZXh0ZXJuIGludCBxbGEyNXh4X2NyZWF0ZV9yc3BfcXVlKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MTZfdCwgdWludDhfdCwKKwl1aW50MTZfdCk7CitleHRlcm4gaW50IHFsYTI1eHhfdXBkYXRlX3JlcV9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDhfdCwgdWludDhfdCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX2luaXRfcmVzcG9uc2VfcV9lbnRyaWVzKHN0cnVjdCByc3BfcXVlICopOworZXh0ZXJuIGludCBxbGEyNXh4X2RlbGV0ZV9yZXFfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICopOworZXh0ZXJuIGludCBxbGEyNXh4X2RlbGV0ZV9yc3BfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByc3BfcXVlICopOworZXh0ZXJuIGludCBxbGEyNXh4X2NyZWF0ZV9xdWV1ZXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDhfdCk7CitleHRlcm4gaW50IHFsYTI1eHhfZGVsZXRlX3F1ZXVlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50OF90KTsKK2V4dGVybiB1aW50MTZfdCBxbGEyNHh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90KTsKK2V4dGVybiB1aW50MTZfdCBxbGEyNXh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90KTsKK2V4dGVybiB2b2lkIHFsYTI0eHhfd3J0X3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90LCB1aW50MTZfdCk7CitleHRlcm4gdm9pZCBxbGEyNXh4X3dydF9yZXFfcmVnKHN0cnVjdCBxbGFfaHdfZGF0YSAqLCB1aW50MTZfdCwgdWludDE2X3QpOworZXh0ZXJuIHZvaWQgcWxhMjV4eF93cnRfcnNwX3JlZyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKiwgdWludDE2X3QsIHVpbnQxNl90KTsKK2V4dGVybiB2b2lkIHFsYTI0eHhfd3J0X3JzcF9yZWcoc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90LCB1aW50MTZfdCk7CiAjZW5kaWYgLyogX1FMQV9HQkxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwppbmRleCBjMmE0YmZiLi4wYTZmNzI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTIyLDggKzIyLDkgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBAaGEncyBtc19pb2NiLgogICovCiB2b2lkICoKLXFsYTJ4MDBfcHJlcF9tc19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLCB1aW50MzJfdCByc3Bfc2l6ZSkKK3FsYTJ4MDBfcHJlcF9tc19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCByZXFfc2l6ZSwgdWludDMyX3QgcnNwX3NpemUpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfaW9jYl9lbnRyeV90ICptc19wa3Q7CiAKIAltc19wa3QgPSBoYS0+bXNfaW9jYjsKQEAgLTU5LDggKzYwLDkgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBAaGEncyBtc19pb2NiLgogICovCiB2b2lkICoKLXFsYTI0eHhfcHJlcF9tc19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLCB1aW50MzJfdCByc3Bfc2l6ZSkKK3FsYTI0eHhfcHJlcF9tc19pb2NiKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCByZXFfc2l6ZSwgdWludDMyX3QgcnNwX3NpemUpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGN0X2VudHJ5XzI0eHggKmN0X3BrdDsKIAogCWN0X3BrdCA9IChzdHJ1Y3QgY3RfZW50cnlfMjR4eCAqKWhhLT5tc19pb2NiOwpAQCAtODIsNyArODQsNyBAQAogCWN0X3BrdC0+ZHNlZ18xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKIAljdF9wa3QtPmRzZWdfMV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CiAJY3RfcGt0LT5kc2VnXzFfbGVuID0gY3RfcGt0LT5yc3BfYnl0ZV9jb3VudDsKLQljdF9wa3QtPnZwX2luZGV4ID0gaGEtPnZwX2lkeDsKKwljdF9wa3QtPnZwX2luZGV4ID0gdmhhLT52cF9pZHg7CiAKIAlyZXR1cm4gKGN0X3BrdCk7CiB9CkBAIC0xMTAsMTYgKzExMiwxNyBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2Noa19tc19zdGF0dXMoc2NzaV9xbGFfaG9zdF90ICpoYSwgbXNfaW9jYl9lbnRyeV90ICptc19wa3QsCitxbGEyeDAwX2Noa19tc19zdGF0dXMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIG1zX2lvY2JfZW50cnlfdCAqbXNfcGt0LAogICAgIHN0cnVjdCBjdF9zbnNfcnNwICpjdF9yc3AsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCiB7CiAJaW50IHJ2YWw7CiAJdWludDE2X3QgY29tcF9zdGF0dXM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAlpZiAobXNfcGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogJXMgZmFpbGVkLCBlcnJvciBzdGF0dXMgKCV4KS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcm91dGluZSwgbXNfcGt0LT5lbnRyeV9zdGF0dXMpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcm91dGluZSwgbXNfcGt0LT5lbnRyeV9zdGF0dXMpKTsKIAl9IGVsc2UgewogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJCWNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUoCkBAIC0xMzMsNyArMTM2LDcgQEAKIAkJCWlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQogCQkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgewogCQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiAlcyBmYWlsZWQsICIKLQkJCQkgICAgInJlamVjdGVkIHJlcXVlc3Q6XG4iLCBoYS0+aG9zdF9ubywKKwkJCQkgICAgInJlamVjdGVkIHJlcXVlc3Q6XG4iLCB2aGEtPmhvc3Rfbm8sCiAJCQkJICAgIHJvdXRpbmUpKTsKIAkJCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKAogCQkJCSAgICAodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKQEAgLTE0NCw3ICsxNDcsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogJXMgZmFpbGVkLCBjb21wbGV0aW9uICIKLQkJCSAgICAic3RhdHVzICgleCkuXG4iLCBoYS0+aG9zdF9ubywgcm91dGluZSwKKwkJCSAgICAic3RhdHVzICgleCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJvdXRpbmUsCiAJCQkgICAgY29tcF9zdGF0dXMpKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjAsMjEgKzE2MywyMSBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMngwMF9nYV9ueHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCitxbGEyeDAwX2dhX254dChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgZmNfcG9ydF90ICpmY3BvcnQpCiB7CiAJaW50CQlydmFsOwogCiAJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCXJldHVybiAocWxhMngwMF9zbnNfZ2Ffbnh0KGhhLCBmY3BvcnQpKTsKLQl9CisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQlyZXR1cm4gcWxhMngwMF9zbnNfZ2Ffbnh0KHZoYSwgZmNwb3J0KTsKIAogCS8qIElzc3VlIEdBX05YVCAqLwogCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KLQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKGhhLCBHQV9OWFRfUkVRX1NJWkUsCisJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYih2aGEsIEdBX05YVF9SRVFfU0laRSwKIAkgICAgR0FfTlhUX1JTUF9TSVpFKTsKIAogCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLwpAQCAtMTg4LDEzICsxOTEsMTMgQEAKIAljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMl0gPSBmY3BvcnQtPmRfaWQuYi5hbF9wYTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiR0FfTlhUIikgIT0KKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJHQV9OWFQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewpAQCAtMjE2LDcgKzIxOSw3IEBACiAJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKIAkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLAorCQkgICAgdmhhLT5ob3N0X25vLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9kZV9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1lWzNdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLApAQCAtMjQyLDcgKzI0NSw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyeDAwX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCitxbGEyeDAwX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3dfaW5mb190ICpsaXN0KQogewogCWludAkJcnZhbDsKIAl1aW50MTZfdAlpOwpAQCAtMjUyLDE2ICsyNTUsMTYgQEAKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCiAJc3RydWN0IGN0X3Nuc19naWRfcHRfZGF0YSAqZ2lkX2RhdGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKLQkJcmV0dXJuIChxbGEyeDAwX3Nuc19naWRfcHQoaGEsIGxpc3QpKTsKLQl9CisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQlyZXR1cm4gcWxhMngwMF9zbnNfZ2lkX3B0KHZoYSwgbGlzdCk7CiAKIAlnaWRfZGF0YSA9IE5VTEw7CiAKIAkvKiBJc3N1ZSBHSURfUFQgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCi0JbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYihoYSwgR0lEX1BUX1JFUV9TSVpFLAorCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2lvY2IodmhhLCBHSURfUFRfUkVRX1NJWkUsCiAJICAgIEdJRF9QVF9SU1BfU0laRSk7CiAKIAkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KQEAgLTI3MywxMyArMjc2LDEzIEBACiAJY3RfcmVxLT5yZXEuZ2lkX3B0LnBvcnRfdHlwZSA9IE5TX05YX1BPUlRfVFlQRTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiR0lEX1BUIikgIT0KKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJHSURfUFQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewpAQCAtMzIwLDcgKzMyMyw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyeDAwX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCitxbGEyeDAwX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3dfaW5mb190ICpsaXN0KQogewogCWludAkJcnZhbDsKIAl1aW50MTZfdAlpOwpAQCAtMzI4LDE1ICszMzEsMTUgQEAKIAltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKLQkJcmV0dXJuIChxbGEyeDAwX3Nuc19ncG5faWQoaGEsIGxpc3QpKTsKLQl9CisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQlyZXR1cm4gcWxhMngwMF9zbnNfZ3BuX2lkKHZoYSwgbGlzdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgewogCQkvKiBJc3N1ZSBHUE5fSUQgKi8KIAkJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLwotCQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKGhhLCBHUE5fSURfUkVRX1NJWkUsCisJCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2lvY2IodmhhLCBHUE5fSURfUkVRX1NJWkUsCiAJCSAgICBHUE5fSURfUlNQX1NJWkUpOwogCiAJCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLwpAQCAtMzUwLDEzICszNTMsMTMgQEAKIAkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzJdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7CiAKIAkJLyogRXhlY3V0ZSBNUyBJT0NCICovCi0JCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCiAJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKGhhLCBtc19wa3QsIGN0X3JzcCwKKwkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLAogCQkgICAgIkdQTl9JRCIpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKQEAgLTM4MSwyMyArMzg0LDIyIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyeDAwX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCitxbGEyeDAwX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3dfaW5mb190ICpsaXN0KQogewogCWludAkJcnZhbDsKIAl1aW50MTZfdAlpOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCi0JaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCXJldHVybiAocWxhMngwMF9zbnNfZ25uX2lkKGhhLCBsaXN0KSk7Ci0JfQorCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJcmV0dXJuIHFsYTJ4MDBfc25zX2dubl9pZCh2aGEsIGxpc3QpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKIAkJLyogSXNzdWUgR05OX0lEICovCiAJCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KLQkJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYihoYSwgR05OX0lEX1JFUV9TSVpFLAorCQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKHZoYSwgR05OX0lEX1JFUV9TSVpFLAogCQkgICAgR05OX0lEX1JTUF9TSVpFKTsKIAogCQkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KQEAgLTQxMSwxMyArNDEzLDEzIEBACiAJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsyXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOwogCiAJCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKIAkJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCS8qRU1QVFkqLwogCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAiCi0JCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOwotCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsCisJCQkgICAgIiglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwKIAkJICAgICJHTk5fSUQiKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0gZWxzZSB7CkBAIC00MjksNyArNDMxLDcgQEAKIAkJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCiAJCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCQkJICAgIGhhLT5ob3N0X25vLAorCQkJICAgIHZoYS0+aG9zdF9ubywKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVswXSwgbGlzdFtpXS5ub2RlX25hbWVbMV0sCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMl0sIGxpc3RbaV0ubm9kZV9uYW1lWzNdLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzRdLCBsaXN0W2ldLm5vZGVfbmFtZVs1XSwKQEAgLTQ1NywyMSArNDU5LDIwIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyeDAwX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9yZnRfaWQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50CQlydmFsOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCi0JaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCXJldHVybiAocWxhMngwMF9zbnNfcmZ0X2lkKGhhKSk7Ci0JfQorCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJcmV0dXJuIHFsYTJ4MDBfc25zX3JmdF9pZCh2aGEpOwogCiAJLyogSXNzdWUgUkZUX0lEICovCiAJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLwotCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2lvY2IoaGEsIFJGVF9JRF9SRVFfU0laRSwKKwltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKHZoYSwgUkZUX0lEX1JFUV9TSVpFLAogCSAgICBSRlRfSURfUlNQX1NJWkUpOwogCiAJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCkBAIC00ODAsMjUgKzQ4MSwyNSBAQAogCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKIAogCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIHBvcnRfaWQsIEZDLTQgdHlwZXMgKi8KLQljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFswXSA9IGhhLT5kX2lkLmIuZG9tYWluOwotCWN0X3JlcS0+cmVxLnJmdF9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOwotCWN0X3JlcS0+cmVxLnJmdF9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKKwljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFswXSA9IHZoYS0+ZF9pZC5iLmRvbWFpbjsKKwljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFsxXSA9IHZoYS0+ZF9pZC5iLmFyZWE7CisJY3RfcmVxLT5yZXEucmZ0X2lkLnBvcnRfaWRbMl0gPSB2aGEtPmRfaWQuYi5hbF9wYTsKIAogCWN0X3JlcS0+cmVxLnJmdF9pZC5mYzRfdHlwZXNbMl0gPSAweDAxOwkJLyogRkNQLTMgKi8KIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiUkZUX0lEIikgIT0KKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJSRlRfSUQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtNTExLDIzICs1MTIsMjMgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBpbnQKLXFsYTJ4MDBfcmZmX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3JmZl9pZChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQJCXJ2YWw7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CiAKIAlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgY2FsbCB1bnN1cHBvcnRlZCBvbiAiCi0JCSAgICAiSVNQMjEwMC9JU1AyMjAwLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJJU1AyMTAwL0lTUDIyMDAuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CiAJfQogCiAJLyogSXNzdWUgUkZGX0lEICovCiAJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLwotCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2lvY2IoaGEsIFJGRl9JRF9SRVFfU0laRSwKKwltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKHZoYSwgUkZGX0lEX1JFUV9TSVpFLAogCSAgICBSRkZfSURfUlNQX1NJWkUpOwogCiAJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCkBAIC01MzYsMjYgKzUzNywyNiBAQAogCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKIAogCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIHBvcnRfaWQsIEZDLTQgZmVhdHVyZSwgRkMtNCB0eXBlICovCi0JY3RfcmVxLT5yZXEucmZmX2lkLnBvcnRfaWRbMF0gPSBoYS0+ZF9pZC5iLmRvbWFpbjsKLQljdF9yZXEtPnJlcS5yZmZfaWQucG9ydF9pZFsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKLQljdF9yZXEtPnJlcS5yZmZfaWQucG9ydF9pZFsyXSA9IGhhLT5kX2lkLmIuYWxfcGE7CisJY3RfcmVxLT5yZXEucmZmX2lkLnBvcnRfaWRbMF0gPSB2aGEtPmRfaWQuYi5kb21haW47CisJY3RfcmVxLT5yZXEucmZmX2lkLnBvcnRfaWRbMV0gPSB2aGEtPmRfaWQuYi5hcmVhOworCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzJdID0gdmhhLT5kX2lkLmIuYWxfcGE7CiAKIAljdF9yZXEtPnJlcS5yZmZfaWQuZmM0X2ZlYXR1cmUgPSBCSVRfMTsKIAljdF9yZXEtPnJlcS5yZmZfaWQuZmM0X3R5cGUgPSAweDA4OwkJLyogU0NTSSAtIEZDUCAqLwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCi0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKLQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsICJSRkZfSUQiKSAhPQorCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJGRl9JRCIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC01NjgsMjEgKzU2OSwyMCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMngwMF9ybm5faWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcnZhbDsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OwogCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CiAJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKIAotCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewotCQlyZXR1cm4gKHFsYTJ4MDBfc25zX3Jubl9pZChoYSkpOwotCX0KKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXJldHVybiBxbGEyeDAwX3Nuc19ybm5faWQodmhhKTsKIAogCS8qIElzc3VlIFJOTl9JRCAqLwogCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KLQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKGhhLCBSTk5fSURfUkVRX1NJWkUsCisJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYih2aGEsIFJOTl9JRF9SRVFfU0laRSwKIAkgICAgUk5OX0lEX1JTUF9TSVpFKTsKIAogCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLwpAQCAtNTkxLDMzICs1OTEsMzQgQEAKIAljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CiAKIAkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBub2RlX25hbWUgKi8KLQljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFswXSA9IGhhLT5kX2lkLmIuZG9tYWluOwotCWN0X3JlcS0+cmVxLnJubl9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOwotCWN0X3JlcS0+cmVxLnJubl9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKKwljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFswXSA9IHZoYS0+ZF9pZC5iLmRvbWFpbjsKKwljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFsxXSA9IHZoYS0+ZF9pZC5iLmFyZWE7CisJY3RfcmVxLT5yZXEucm5uX2lkLnBvcnRfaWRbMl0gPSB2aGEtPmRfaWQuYi5hbF9wYTsKIAotCW1lbWNweShjdF9yZXEtPnJlcS5ybm5faWQubm9kZV9uYW1lLCBoYS0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KGN0X3JlcS0+cmVxLnJubl9pZC5ub2RlX25hbWUsIHZoYS0+bm9kZV9uYW1lLCBXV05fU0laRSk7CiAKIAkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KLQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOwotCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKGhhLCBtc19wa3QsIGN0X3JzcCwgIlJOTl9JRCIpICE9CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUk5OX0lEIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKIH0KIAogdm9pZAotcWxhMngwMF9nZXRfc3ltX25vZGVfbmFtZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICpzbm4pCitxbGEyeDAwX2dldF9zeW1fbm9kZV9uYW1lKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50OF90ICpzbm4pCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3ByaW50Zihzbm4sICIlcyBGVzp2JWQuJTAyZC4lMDJkIERWUjp2JXMiLGhhLT5tb2RlbF9udW1iZXIsCiAJICAgIGhhLT5md19tYWpvcl92ZXJzaW9uLCBoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkgICAgaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sIHFsYTJ4MDBfdmVyc2lvbl9zdHIpOwpAQCAtNjMwLDIzICs2MzEsMjQgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBpbnQKLXFsYTJ4MDBfcnNubl9ubihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9yc25uX25uKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CiAKIAlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSU05OX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gIgotCQkgICAgIklTUDIxMDAvSVNQMjIwMC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCSAgICAiSVNQMjEwMC9JU1AyMjAwLlxuIiwgdmhhLT5ob3N0X25vKSk7CiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCX0KIAogCS8qIElzc3VlIFJTTk5fTk4gKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCiAJLyogICBSZXF1ZXN0IHNpemUgYWRqdXN0ZWQgYWZ0ZXIgQ1QgcHJlcGFyYXRpb24gKi8KLQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKGhhLCAwLCBSU05OX05OX1JTUF9TSVpFKTsKKwltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19pb2NiKHZoYSwgMCwgUlNOTl9OTl9SU1BfU0laRSk7CiAKIAkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KIAljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgUlNOTl9OTl9DTUQsCkBAIC02NTQsMTAgKzY1NiwxMCBAQAogCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKIAogCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIG5vZGVfbmFtZSwgc3ltYm9saWMgbm9kZV9uYW1lLCBzaXplICovCi0JbWVtY3B5KGN0X3JlcS0+cmVxLnJzbm5fbm4ubm9kZV9uYW1lLCBoYS0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KGN0X3JlcS0+cmVxLnJzbm5fbm4ubm9kZV9uYW1lLCB2aGEtPm5vZGVfbmFtZSwgV1dOX1NJWkUpOwogCiAJLyogUHJlcGFyZSB0aGUgU3ltYm9saWMgTm9kZSBOYW1lICovCi0JcWxhMngwMF9nZXRfc3ltX25vZGVfbmFtZShoYSwgY3RfcmVxLT5yZXEucnNubl9ubi5zeW1fbm9kZV9uYW1lKTsKKwlxbGEyeDAwX2dldF9zeW1fbm9kZV9uYW1lKHZoYSwgY3RfcmVxLT5yZXEucnNubl9ubi5zeW1fbm9kZV9uYW1lKTsKIAogCS8qIENhbGN1bGF0ZSBTTk4gbGVuZ3RoICovCiAJY3RfcmVxLT5yZXEucnNubl9ubi5uYW1lX2xlbiA9CkBAIC02NjksMTggKzY3MSwxOCBAQAogCW1zX3BrdC0+ZHNlZ19yZXFfbGVuZ3RoID0gbXNfcGt0LT5yZXFfYnl0ZWNvdW50OwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCi0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiUlNOTl9OTiIpICE9CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUlNOTl9OTiIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtNjk2LDExICs2OTgsMTIgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBAaGEncyBzbnNfY21kLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzbnNfY21kX3BrdCAqCi1xbGEyeDAwX3ByZXBfc25zX2NtZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBjbWQsIHVpbnQxNl90IHNjbWRfbGVuLAorcWxhMngwMF9wcmVwX3Nuc19jbWQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGNtZCwgdWludDE2X3Qgc2NtZF9sZW4sCiAgICAgdWludDE2X3QgZGF0YV9zaXplKQogewogCXVpbnQxNl90CQl3YzsKIAlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlzbnNfY21kID0gaGEtPnNuc19jbWQ7CiAJbWVtc2V0KHNuc19jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKQEAgLTcyNiwxNSArNzI5LDE1IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9zbnNfZ2Ffbnh0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQorcWxhMngwMF9zbnNfZ2Ffbnh0KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKIHsKIAlpbnQJCXJ2YWw7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3Qgc25zX2NtZF9wa3QJKnNuc19jbWQ7CiAKIAkvKiBJc3N1ZSBHQV9OWFQuICovCiAJLyogUHJlcGFyZSBTTlMgY29tbWFuZCByZXF1ZXN0LiAqLwotCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgR0FfTlhUX0NNRCwgR0FfTlhUX1NOU19TQ01EX0xFTiwKKwlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQodmhhLCBHQV9OWFRfQ01ELCBHQV9OWFRfU05TX1NDTURfTEVOLAogCSAgICBHQV9OWFRfU05TX0RBVEFfU0laRSk7CiAKIAkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLwpAQCAtNzQzLDE2ICs3NDYsMTYgQEAKIAlzbnNfY21kLT5wLmNtZC5wYXJhbVsyXSA9IGZjcG9ydC0+ZF9pZC5iLmRvbWFpbjsKIAogCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCi0JcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwgR0FfTlhUX1NOU19DTURfU0laRSAvIDIsCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnModmhhLCBoYS0+c25zX2NtZF9kbWEsIEdBX05YVF9TTlNfQ01EX1NJWkUgLyAyLAogCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5nYW5fZGF0YVs4XSAhPSAweDgwIHx8CiAJICAgIHNuc19jbWQtPnAuZ2FuX2RhdGFbOV0gIT0gMHgwMikgewogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgotCQkgICAgImdhX254dF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQkgICAgImdhX254dF9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdhbl9kYXRhLCAxNikpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewpAQCAtNzcyLDcgKzc3NSw3IEBACiAJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKIAkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLAorCQkgICAgdmhhLT5ob3N0X25vLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9kZV9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1lWzNdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLApAQCAtODAwLDMzICs4MDMsMzMgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX3Nuc19naWRfcHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQorcWxhMngwMF9zbnNfZ2lkX3B0KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzd19pbmZvX3QgKmxpc3QpCiB7CiAJaW50CQlydmFsOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdWludDE2X3QJaTsKIAl1aW50OF90CQkqZW50cnk7CiAJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOwogCiAJLyogSXNzdWUgR0lEX1BULiAqLwogCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KLQlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIEdJRF9QVF9DTUQsIEdJRF9QVF9TTlNfU0NNRF9MRU4sCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKHZoYSwgR0lEX1BUX0NNRCwgR0lEX1BUX1NOU19TQ01EX0xFTiwKIAkgICAgR0lEX1BUX1NOU19EQVRBX1NJWkUpOwogCiAJLyogUHJlcGFyZSBTTlMgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydF90eXBlLiAqLwogCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gTlNfTlhfUE9SVF9UWVBFOwogCiAJLyogRXhlY3V0ZSBTTlMgY29tbWFuZC4gKi8KLQlydmFsID0gcWxhMngwMF9zZW5kX3NucyhoYSwgaGEtPnNuc19jbWRfZG1hLCBHSURfUFRfU05TX0NNRF9TSVpFIC8gMiwKKwlydmFsID0gcWxhMngwMF9zZW5kX3Nucyh2aGEsIGhhLT5zbnNfY21kX2RtYSwgR0lEX1BUX1NOU19DTURfU0laRSAvIDIsCiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdpZF9kYXRhWzhdICE9IDB4ODAgfHwKIAkgICAgc25zX2NtZC0+cC5naWRfZGF0YVs5XSAhPSAweDAyKSB7CiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCi0JCSAgICAiZ2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCSAgICAiZ2lkX3JzcDpcbiIsIHZoYS0+aG9zdF9ubykpOwogCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ2lkX2RhdGEsIDE2KSk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CkBAIC04NjcsMTcgKzg3MCwxNyBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfc25zX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCitxbGEyeDAwX3Nuc19ncG5faWQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN3X2luZm9fdCAqbGlzdCkKIHsKIAlpbnQJCXJ2YWw7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MTZfdAlpOwogCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CiAJCS8qIElzc3VlIEdQTl9JRCAqLwogCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCi0JCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgR1BOX0lEX0NNRCwKKwkJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKHZoYSwgR1BOX0lEX0NNRCwKIAkJICAgIEdQTl9JRF9TTlNfU0NNRF9MRU4sIEdQTl9JRF9TTlNfREFUQV9TSVpFKTsKIAogCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLwpAQCAtODg2LDE2ICs4ODksMTYgQEAKIAkJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBsaXN0W2ldLmRfaWQuYi5kb21haW47CiAKIAkJLyogRXhlY3V0ZSBTTlMgY29tbWFuZC4gKi8KLQkJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwKKwkJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnModmhhLCBoYS0+c25zX2NtZF9kbWEsCiAJCSAgICBHUE5fSURfU05TX0NNRF9TSVpFIC8gMiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCiAJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIFNlbmQgU05TIGZhaWxlZCAiCi0JCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJICAgICIoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5ncG5fZGF0YVs4XSAhPSAweDgwIHx8CiAJCSAgICBzbnNfY21kLT5wLmdwbl9kYXRhWzldICE9IDB4MDIpIHsKIAkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUE5fSUQgZmFpbGVkLCByZWplY3RlZCAiCi0JCQkgICAgInJlcXVlc3QsIGdwbl9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQkJICAgICJyZXF1ZXN0LCBncG5fcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7CiAJCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ3BuX2RhdGEsIDE2KSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKQEAgLTkyMiwxNyArOTI1LDE3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9zbnNfZ25uX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3FsYTJ4MDBfc25zX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3dfaW5mb190ICpsaXN0KQogewogCWludAkJcnZhbDsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXVpbnQxNl90CWk7CiAJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKIAkJLyogSXNzdWUgR05OX0lEICovCiAJCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KLQkJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBHTk5fSURfQ01ELAorCQlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQodmhhLCBHTk5fSURfQ01ELAogCQkgICAgR05OX0lEX1NOU19TQ01EX0xFTiwgR05OX0lEX1NOU19EQVRBX1NJWkUpOwogCiAJCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfaWQuICovCkBAIC05NDEsMTYgKzk0NCwxNiBAQAogCQlzbnNfY21kLT5wLmNtZC5wYXJhbVsyXSA9IGxpc3RbaV0uZF9pZC5iLmRvbWFpbjsKIAogCQkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLwotCQlydmFsID0gcWxhMngwMF9zZW5kX3NucyhoYSwgaGEtPnNuc19jbWRfZG1hLAorCQlydmFsID0gcWxhMngwMF9zZW5kX3Nucyh2aGEsIGhhLT5zbnNfY21kX2RtYSwKIAkJICAgIEdOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLCBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KIAkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgU2VuZCBTTlMgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCQkgICAgIiglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAkJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdubl9kYXRhWzhdICE9IDB4ODAgfHwKIAkJICAgIHNuc19jbWQtPnAuZ25uX2RhdGFbOV0gIT0gMHgwMikgewogCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBmYWlsZWQsIHJlamVjdGVkICIKLQkJCSAgICAicmVxdWVzdCwgZ25uX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCQkgICAgInJlcXVlc3QsIGdubl9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5nbm5fZGF0YSwgMTYpKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewpAQCAtOTYyLDcgKzk2NSw3IEBACiAJCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKIAkJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCSAgICB2aGEtPmhvc3Rfbm8sCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMF0sIGxpc3RbaV0ubm9kZV9uYW1lWzFdLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzJdLCBsaXN0W2ldLm5vZGVfbmFtZVszXSwKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVs0XSwgbGlzdFtpXS5ub2RlX25hbWVbNV0sCkBAIC05OTIsNDAgKzk5NSw0MCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfc25zX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9zbnNfcmZ0X2lkKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcnZhbDsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKIAogCS8qIElzc3VlIFJGVF9JRC4gKi8KIAkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCi0Jc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBSRlRfSURfQ01ELCBSRlRfSURfU05TX1NDTURfTEVOLAorCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZCh2aGEsIFJGVF9JRF9DTUQsIFJGVF9JRF9TTlNfU0NNRF9MRU4sCiAJICAgIFJGVF9JRF9TTlNfREFUQV9TSVpFKTsKIAogCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfaWQsIEZDLTQgdHlwZXMgKi8KLQlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IGhhLT5kX2lkLmIuYWxfcGE7Ci0Jc25zX2NtZC0+cC5jbWQucGFyYW1bMV0gPSBoYS0+ZF9pZC5iLmFyZWE7Ci0Jc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBoYS0+ZF9pZC5iLmRvbWFpbjsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IHZoYS0+ZF9pZC5iLmFsX3BhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gdmhhLT5kX2lkLmIuYXJlYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsyXSA9IHZoYS0+ZF9pZC5iLmRvbWFpbjsKIAogCXNuc19jbWQtPnAuY21kLnBhcmFtWzVdID0gMHgwMTsJCQkvKiBGQ1AtMyAqLwogCiAJLyogRXhlY3V0ZSBTTlMgY29tbWFuZC4gKi8KLQlydmFsID0gcWxhMngwMF9zZW5kX3NucyhoYSwgaGEtPnNuc19jbWRfZG1hLCBSRlRfSURfU05TX0NNRF9TSVpFIC8gMiwKKwlydmFsID0gcWxhMngwMF9zZW5kX3Nucyh2aGEsIGhhLT5zbnNfY21kX2RtYSwgUkZUX0lEX1NOU19DTURfU0laRSAvIDIsCiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIGlmIChzbnNfY21kLT5wLnJmdF9kYXRhWzhdICE9IDB4ODAgfHwKIAkgICAgc25zX2NtZC0+cC5yZnRfZGF0YVs5XSAhPSAweDAyKSB7CiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCi0JCSAgICAicmZ0X3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCSAgICAicmZ0X3JzcDpcbiIsIHZoYS0+aG9zdF9ubykpOwogCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucmZ0X2RhdGEsIDE2KSk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC0xMDQxLDQ3ICsxMDQ0LDQ3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9zbnNfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3Nuc19ybm5faWQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50CQlydmFsOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOwogCiAJLyogSXNzdWUgUk5OX0lELiAqLwogCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KLQlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIFJOTl9JRF9DTUQsIFJOTl9JRF9TTlNfU0NNRF9MRU4sCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKHZoYSwgUk5OX0lEX0NNRCwgUk5OX0lEX1NOU19TQ01EX0xFTiwKIAkgICAgUk5OX0lEX1NOU19EQVRBX1NJWkUpOwogCiAJLyogUHJlcGFyZSBTTlMgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydF9pZCwgbm9kZW5hbWUuICovCi0Jc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBoYS0+ZF9pZC5iLmFsX3BhOwotCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gaGEtPmRfaWQuYi5hcmVhOwotCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gaGEtPmRfaWQuYi5kb21haW47CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSB2aGEtPmRfaWQuYi5hbF9wYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IHZoYS0+ZF9pZC5iLmFyZWE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSB2aGEtPmRfaWQuYi5kb21haW47CiAKLQlzbnNfY21kLT5wLmNtZC5wYXJhbVs0XSA9IGhhLT5ub2RlX25hbWVbN107Ci0Jc25zX2NtZC0+cC5jbWQucGFyYW1bNV0gPSBoYS0+bm9kZV9uYW1lWzZdOwotCXNuc19jbWQtPnAuY21kLnBhcmFtWzZdID0gaGEtPm5vZGVfbmFtZVs1XTsKLQlzbnNfY21kLT5wLmNtZC5wYXJhbVs3XSA9IGhhLT5ub2RlX25hbWVbNF07Ci0Jc25zX2NtZC0+cC5jbWQucGFyYW1bOF0gPSBoYS0+bm9kZV9uYW1lWzNdOwotCXNuc19jbWQtPnAuY21kLnBhcmFtWzldID0gaGEtPm5vZGVfbmFtZVsyXTsKLQlzbnNfY21kLT5wLmNtZC5wYXJhbVsxMF0gPSBoYS0+bm9kZV9uYW1lWzFdOwotCXNuc19jbWQtPnAuY21kLnBhcmFtWzExXSA9IGhhLT5ub2RlX25hbWVbMF07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bNF0gPSB2aGEtPm5vZGVfbmFtZVs3XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs1XSA9IHZoYS0+bm9kZV9uYW1lWzZdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzZdID0gdmhhLT5ub2RlX25hbWVbNV07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bN10gPSB2aGEtPm5vZGVfbmFtZVs0XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs4XSA9IHZoYS0+bm9kZV9uYW1lWzNdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzldID0gdmhhLT5ub2RlX25hbWVbMl07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMTBdID0gdmhhLT5ub2RlX25hbWVbMV07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMTFdID0gdmhhLT5ub2RlX25hbWVbMF07CiAKIAkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLwotCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsIFJOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLAorCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKHZoYSwgaGEtPnNuc19jbWRfZG1hLCBSTk5fSURfU05TX0NNRF9TSVpFIC8gMiwKIAkgICAgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgaWYgKHNuc19jbWQtPnAucm5uX2RhdGFbOF0gIT0gMHg4MCB8fAogCSAgICBzbnNfY21kLT5wLnJubl9kYXRhWzldICE9IDB4MDIpIHsKIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKLQkJICAgICJybm5fcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJybm5fcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7CiAJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5ybm5fZGF0YSwgMTYpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTEwOTQsMjUgKzEwOTcsMjUgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX21nbXRfc3ZyX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX21nbXRfc3ZyX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCByZXQ7CiAJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlyZXQgPSBRTEFfU1VDQ0VTUzsKLQlpZiAoaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbikKKwlpZiAodmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4pCiAJCXJldHVybiByZXQ7CiAKLQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKGhhLCBoYS0+bWdtdF9zdnJfbG9vcF9pZCwgMHhmZiwgMHhmZiwgMHhmYSwKKwloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKHZoYSwgdmhhLT5tZ210X3N2cl9sb29wX2lkLCAweGZmLCAweGZmLCAweGZhLAogCSAgICBtYiwgQklUXzEpOwogCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewogCQlERUJVRzJfMTMocHJpbnRrKCIlcyglbGQpOiBGYWlsZWQgTUFOQUdFTUVOVF9TRVJWRVIgbG9naW46ICIKIAkJICAgICJsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4IG1iWzZdPSV4IG1iWzddPSV4XG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBoYS0+bWdtdF9zdnJfbG9vcF9pZCwgbWJbMF0sIG1iWzFdLAorCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgdmhhLT5tZ210X3N2cl9sb29wX2lkLCBtYlswXSwgbWJbMV0sCiAJCSAgICBtYlsyXSwgbWJbNl0sIG1iWzddKSk7CiAJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlCi0JCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAxOworCQl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDE7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEyNiwxNyArMTEyOSwxNyBAQAogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEBoYSdzIG1zX2lvY2IuCiAgKi8KIHZvaWQgKgotcWxhMngwMF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByZXFfc2l6ZSwKK3FsYTJ4MDBfcHJlcF9tc19mZG1pX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90IHJlcV9zaXplLAogICAgIHVpbnQzMl90IHJzcF9zaXplKQogewogCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfcGt0ID0gaGEtPm1zX2lvY2I7CiAJbWVtc2V0KG1zX3BrdCwgMCwgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCiAJbXNfcGt0LT5lbnRyeV90eXBlID0gTVNfSU9DQl9UWVBFOwogCW1zX3BrdC0+ZW50cnlfY291bnQgPSAxOwotCVNFVF9UQVJHRVRfSUQoaGEsIG1zX3BrdC0+bG9vcF9pZCwgaGEtPm1nbXRfc3ZyX2xvb3BfaWQpOworCVNFVF9UQVJHRVRfSUQoaGEsIG1zX3BrdC0+bG9vcF9pZCwgdmhhLT5tZ210X3N2cl9sb29wX2lkKTsKIAltc19wa3QtPmNvbnRyb2xfZmxhZ3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1JFQUQgfCBDRl9IRUFEX1RBRyk7CiAJbXNfcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoaGEtPnJfYV90b3YgLyAxMCAqIDIpOwogCW1zX3BrdC0+Y21kX2RzZF9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CkBAIC0xMTY0LDE3ICsxMTY3LDE4IEBACiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3MgbXNfaW9jYi4KICAqLwogdm9pZCAqCi1xbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLAorcWxhMjR4eF9wcmVwX21zX2ZkbWlfaW9jYihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgcmVxX3NpemUsCiAgICAgdWludDMyX3QgcnNwX3NpemUpCiB7CiAJc3RydWN0IGN0X2VudHJ5XzI0eHggKmN0X3BrdDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWN0X3BrdCA9IChzdHJ1Y3QgY3RfZW50cnlfMjR4eCAqKWhhLT5tc19pb2NiOwogCW1lbXNldChjdF9wa3QsIDAsIHNpemVvZihzdHJ1Y3QgY3RfZW50cnlfMjR4eCkpOwogCiAJY3RfcGt0LT5lbnRyeV90eXBlID0gQ1RfSU9DQl9UWVBFOwogCWN0X3BrdC0+ZW50cnlfY291bnQgPSAxOwotCWN0X3BrdC0+bnBvcnRfaGFuZGxlID0gY3B1X3RvX2xlMTYoaGEtPm1nbXRfc3ZyX2xvb3BfaWQpOworCWN0X3BrdC0+bnBvcnRfaGFuZGxlID0gY3B1X3RvX2xlMTYodmhhLT5tZ210X3N2cl9sb29wX2lkKTsKIAljdF9wa3QtPnRpbWVvdXQgPSBjcHVfdG9fbGUxNihoYS0+cl9hX3RvdiAvIDEwICogMik7CiAJY3RfcGt0LT5jbWRfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKIAljdF9wa3QtPnJzcF9kc2RfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOwpAQCAtMTE4OCwxNCArMTE5MiwxNSBAQAogCWN0X3BrdC0+ZHNlZ18xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKIAljdF9wa3QtPmRzZWdfMV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CiAJY3RfcGt0LT5kc2VnXzFfbGVuID0gY3RfcGt0LT5yc3BfYnl0ZV9jb3VudDsKLQljdF9wa3QtPnZwX2luZGV4ID0gaGEtPnZwX2lkeDsKKwljdF9wa3QtPnZwX2luZGV4ID0gdmhhLT52cF9pZHg7CiAKIAlyZXR1cm4gY3RfcGt0OwogfQogCiBzdGF0aWMgaW5saW5lIG1zX2lvY2JfZW50cnlfdCAqCi1xbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgcmVxX3NpemUpCitxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90IHJlcV9zaXplKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0ID0gaGEtPm1zX2lvY2I7CiAJc3RydWN0IGN0X2VudHJ5XzI0eHggKmN0X3BrdCA9IChzdHJ1Y3QgY3RfZW50cnlfMjR4eCAqKWhhLT5tc19pb2NiOwogCkBAIC0xMjQwLDcgKzEyNDUsNyBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfZmRtaV9yaGJhKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2ZkbWlfcmhiYShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbCwgYWxlbjsKIAl1aW50MzJfdCBzaXplLCBzbjsKQEAgLTEyNTAsMTEgKzEyNTUsMTIgQEAKIAlzdHJ1Y3QgY3Rfc25zX3JzcCAqY3RfcnNwOwogCXVpbnQ4X3QgKmVudHJpZXM7CiAJc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKmVpdGVyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogSXNzdWUgUkhCQSAqLwogCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KIAkvKiAgIFJlcXVlc3Qgc2l6ZSBhZGp1c3RlZCBhZnRlciBDVCBwcmVwYXJhdGlvbiAqLwotCW1zX3BrdCA9IGhhLT5pc3Bfb3BzLT5wcmVwX21zX2ZkbWlfaW9jYihoYSwgMCwgUkhCQV9SU1BfU0laRSk7CisJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfZmRtaV9pb2NiKHZoYSwgMCwgUkhCQV9SU1BfU0laRSk7CiAKIAkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KIAljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfZmRtaV9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBSSEJBX0NNRCwKQEAgLTEyNjIsOSArMTI2OCw5IEBACiAJY3RfcnNwID0gJmhhLT5jdF9zbnMtPnAucnNwOwogCiAJLyogUHJlcGFyZSBGRE1JIGNvbW1hbmQgYXJndW1lbnRzIC0tIGF0dHJpYnV0ZSBibG9jaywgYXR0cmlidXRlcy4gKi8KLQltZW1jcHkoY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllciwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCW1lbWNweShjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyLCB2aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOwogCWN0X3JlcS0+cmVxLnJoYmEuZW50cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpOwotCW1lbWNweShjdF9yZXEtPnJlcS5yaGJhLnBvcnRfbmFtZSwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCW1lbWNweShjdF9yZXEtPnJlcS5yaGJhLnBvcnRfbmFtZSwgdmhhLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKIAlzaXplID0gMiAqIFdXTl9TSVpFICsgNCArIDQ7CiAKIAkvKiBBdHRyaWJ1dGVzICovCkBAIC0xMjc2LDExICsxMjgyLDExIEBACiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKIAllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfTk9ERV9OQU1FKTsKIAllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgV1dOX1NJWkUpOwotCW1lbWNweShlaXRlci0+YS5ub2RlX25hbWUsIGhhLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwltZW1jcHkoZWl0ZXItPmEubm9kZV9uYW1lLCB2aGEtPm5vZGVfbmFtZSwgV1dOX1NJWkUpOwogCXNpemUgKz0gNCArIFdXTl9TSVpFOwogCiAJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE5PREVOQU1FPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwKLQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5ub2RlX25hbWVbMF0sIGVpdGVyLT5hLm5vZGVfbmFtZVsxXSwgZWl0ZXItPmEubm9kZV9uYW1lWzJdLAogCSAgICBlaXRlci0+YS5ub2RlX25hbWVbM10sIGVpdGVyLT5hLm5vZGVfbmFtZVs0XSwgZWl0ZXItPmEubm9kZV9uYW1lWzVdLAogCSAgICBlaXRlci0+YS5ub2RlX25hbWVbNl0sIGVpdGVyLT5hLm5vZGVfbmFtZVs3XSkpOwpAQCAtMTI5NCw3ICsxMzAwLDcgQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTUFOVUZBQ1RVUkVSPSVzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQU5VRkFDVFVSRVI9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5tYW51ZmFjdHVyZXIpKTsKIAogCS8qIFNlcmlhbCBudW1iZXIuICovCkBAIC0xMzA3LDcgKzEzMTMsNyBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBTRVJJQUxOTz0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU0VSSUFMTk89JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5zZXJpYWxfbnVtKSk7CiAKIAkvKiBNb2RlbCBuYW1lLiAqLwpAQCAtMTMxOSw3ICsxMzI1LDcgQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTU9ERUxfTkFNRT0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTU9ERUxfTkFNRT0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJICAgIGVpdGVyLT5hLm1vZGVsKSk7CiAKIAkvKiBNb2RlbCBkZXNjcmlwdGlvbi4gKi8KQEAgLTEzMzIsNyArMTMzOCw3IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1PREVMX0RFU0M9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1PREVMX0RFU0M9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5tb2RlbF9kZXNjKSk7CiAKIAkvKiBIYXJkd2FyZSB2ZXJzaW9uLiAqLwpAQCAtMTM0NCw3ICsxMzUwLDcgQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogSEFSRFdBUkVWRVI9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEhBUkRXQVJFVkVSPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkgICAgZWl0ZXItPmEuaHdfdmVyc2lvbikpOwogCiAJLyogRHJpdmVyIHZlcnNpb24uICovCkBAIC0xMzU2LDcgKzEzNjIsNyBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBEUklWRVJWRVI9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERSSVZFUlZFUj0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJICAgIGVpdGVyLT5hLmRyaXZlcl92ZXJzaW9uKSk7CiAKIAkvKiBPcHRpb24gUk9NIHZlcnNpb24uICovCkBAIC0xMzY4LDI3ICsxMzc0LDI3IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE9QVFJPTVZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogT1BUUk9NVkVSPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkgICAgZWl0ZXItPmEub3JvbV92ZXJzaW9uKSk7CiAKIAkvKiBGaXJtd2FyZSB2ZXJzaW9uICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKIAllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9IQkFfRklSTVdBUkVfVkVSU0lPTik7Ci0JaGEtPmlzcF9vcHMtPmZ3X3ZlcnNpb25fc3RyKGhhLCBlaXRlci0+YS5md192ZXJzaW9uKTsKKwloYS0+aXNwX29wcy0+ZndfdmVyc2lvbl9zdHIodmhhLCBlaXRlci0+YS5md192ZXJzaW9uKTsKIAlhbGVuID0gc3RybGVuKGVpdGVyLT5hLmZ3X3ZlcnNpb24pOwogCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OwogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBGSVJNV0FSRVZFUj0lcy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwlERUJVRzEzKHByaW50aygiJXMoJWxkKTogRklSTVdBUkVWRVI9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5md192ZXJzaW9uKSk7CiAKIAkvKiBVcGRhdGUgTVMgcmVxdWVzdCBzaXplLiAqLwotCXFsYTJ4MDBfdXBkYXRlX21zX2ZkbWlfaW9jYihoYSwgc2l6ZSArIDE2KTsKKwlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IodmhhLCBzaXplICsgMTYpOwogCiAJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFJIQkEgaWRlbnRpZmllcj0iCiAJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwgX19mdW5jX18sCi0JICAgIGhhLT5ob3N0X25vLCBjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyWzBdLAorCSAgICB2aGEtPmhvc3Rfbm8sIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMF0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMV0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMl0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbM10sCkBAIC0xMzk5LDI1ICsxNDA1LDI1IEBACiAJREVCVUcxMyhxbGEyeDAwX2R1bXBfYnVmZmVyKGVudHJpZXMsIHNpemUpKTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJIQkEgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOwotCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKGhhLCBtc19wa3QsIGN0X3JzcCwgIlJIQkEiKSAhPQorCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJIQkEiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJaWYgKGN0X3JzcC0+aGVhZGVyLnJlYXNvbl9jb2RlID09IENUX1JFQVNPTl9DQU5OT1RfUEVSRk9STSAmJgogCQkgICAgY3RfcnNwLT5oZWFkZXIuZXhwbGFuYXRpb25fY29kZSA9PQogCQkgICAgQ1RfRVhQTF9BTFJFQURZX1JFR0lTVEVSRUQpIHsKIAkJCURFQlVHMl8xMyhwcmludGsoIiVzKCVsZCk6IEhCQSBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iLAotCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAkJCXJ2YWwgPSBRTEFfQUxSRUFEWV9SRUdJU1RFUkVEOwogCQl9CiAJfSBlbHNlIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSSEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTQzMCwxNyArMTQzNiwxNyBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfZmRtaV9kaGJhKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2ZkbWlfZGhiYShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCW1zX2lvY2JfZW50cnlfdCAqbXNfcGt0OwogCXN0cnVjdCBjdF9zbnNfcmVxICpjdF9yZXE7CiAJc3RydWN0IGN0X3Nuc19yc3AgKmN0X3JzcDsKIAogCS8qIElzc3VlIFJQQSAqLwogCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KLQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19mZG1pX2lvY2IoaGEsIERIQkFfUkVRX1NJWkUsCisJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfZmRtaV9pb2NiKHZoYSwgREhCQV9SRVFfU0laRSwKIAkgICAgREhCQV9SU1BfU0laRSk7CiAKIAkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KQEAgLTE0NDksMjggKzE0NTUsMjggQEAKIAljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CiAKIAkvKiBQcmVwYXJlIEZETUkgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydG5hbWUuICovCi0JbWVtY3B5KGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lLCBoYS0+cG9ydF9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lLCB2aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOwogCiAJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERIQkEgcG9ydG5hbWU9IgotCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzBdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVsxXSwKIAkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbMl0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzNdLAogCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs0XSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNV0sCiAJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzZdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs3XSkpOwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCi0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogREhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiREhCQSIpICE9CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiREhCQSIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogREhCQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE0ODMsMTEgKzE0ODksMTEgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2ZkbWlfcnBhKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2ZkbWlfcnBhKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsLCBhbGVuOwogCXVpbnQzMl90IHNpemUsIG1heF9mcmFtZV9zaXplOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfaW9jYl9lbnRyeV90ICptc19wa3Q7CiAJc3RydWN0IGN0X3Nuc19yZXEgKmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcCAqY3RfcnNwOwpAQCAtMTQ5OCw3ICsxNTA0LDcgQEAKIAkvKiBJc3N1ZSBSUEEgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCiAJLyogICBSZXF1ZXN0IHNpemUgYWRqdXN0ZWQgYWZ0ZXIgQ1QgcHJlcGFyYXRpb24gKi8KLQltc19wa3QgPSBoYS0+aXNwX29wcy0+cHJlcF9tc19mZG1pX2lvY2IoaGEsIDAsIFJQQV9SU1BfU0laRSk7CisJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfZmRtaV9pb2NiKHZoYSwgMCwgUlBBX1JTUF9TSVpFKTsKIAogCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLwogCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9mZG1pX3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIFJQQV9DTUQsCkBAIC0xNTA2LDcgKzE1MTIsNyBAQAogCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKIAogCS8qIFByZXBhcmUgRkRNSSBjb21tYW5kIGFyZ3VtZW50cyAtLSBhdHRyaWJ1dGUgYmxvY2ssIGF0dHJpYnV0ZXMuICovCi0JbWVtY3B5KGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWUsIGhhLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwltZW1jcHkoY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZSwgdmhhLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKIAlzaXplID0gV1dOX1NJWkUgKyA0OwogCiAJLyogQXR0cmlidXRlcyAqLwpAQCAtMTUyMSw4ICsxNTI3LDkgQEAKIAllaXRlci0+YS5mYzRfdHlwZXNbMl0gPSAweDAxOwogCXNpemUgKz0gNCArIDMyOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEZDNF9UWVBFUz0lMDJ4ICUwMnguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLmZjNF90eXBlc1syXSwgZWl0ZXItPmEuZmM0X3R5cGVzWzFdKSk7CisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEZDNF9UWVBFUz0lMDJ4ICUwMnguXG4iLCBfX2Z1bmNfXywKKwkJdmhhLT5ob3N0X25vLCBlaXRlci0+YS5mYzRfdHlwZXNbMl0sCisJCWVpdGVyLT5hLmZjNF90eXBlc1sxXSkpOwogCiAJLyogU3VwcG9ydGVkIHNwZWVkLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTU0NCw3ICsxNTUxLDcgQEAKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xR0IpOwogCXNpemUgKz0gNCArIDQ7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU1VQUE9SVEVEX1NQRUVEPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBTVVBQT1JURURfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5zdXBfc3BlZWQpKTsKIAogCS8qIEN1cnJlbnQgc3BlZWQuICovCkBAIC0xNTc1LDcgKzE1ODIsNyBAQAogCX0KIAlzaXplICs9IDQgKyA0OwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IENVUlJFTlRfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IENVUlJFTlRfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCSAgICBlaXRlci0+YS5jdXJfc3BlZWQpKTsKIAogCS8qIE1heCBmcmFtZSBzaXplLiAqLwpAQCAtMTU4OCw3ICsxNTk1LDcgQEAKIAllaXRlci0+YS5tYXhfZnJhbWVfc2l6ZSA9IGNwdV90b19iZTMyKG1heF9mcmFtZV9zaXplKTsKIAlzaXplICs9IDQgKyA0OwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1BWF9GUkFNRV9TSVpFPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQVhfRlJBTUVfU0laRT0leC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJICAgIGVpdGVyLT5hLm1heF9mcmFtZV9zaXplKSk7CiAKIAkvKiBPUyBkZXZpY2UgbmFtZS4gKi8KQEAgLTE2MDAsMzIgKzE2MDcsMzIgQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogT1NfREVWSUNFX05BTUU9JXMuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE9TX0RFVklDRV9OQU1FPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkgICAgZWl0ZXItPmEub3NfZGV2X25hbWUpKTsKIAogCS8qIEhvc3RuYW1lLiAqLwotCWlmIChzdHJsZW4oZmNfaG9zdF9zeXN0ZW1faG9zdG5hbWUoaGEtPmhvc3QpKSkgeworCWlmIChzdHJsZW4oZmNfaG9zdF9zeXN0ZW1faG9zdG5hbWUodmhhLT5ob3N0KSkpIHsKIAkJY3RfcmVxLT5yZXEucnBhLmF0dHJzLmNvdW50ID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX0FUVFJfQ09VTlQpOwogCQllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKIAkJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9IT1NUX05BTUUpOwogCQlzbnByaW50ZihlaXRlci0+YS5ob3N0X25hbWUsIHNpemVvZihlaXRlci0+YS5ob3N0X25hbWUpLAotCQkgICAgIiVzIiwgZmNfaG9zdF9zeXN0ZW1faG9zdG5hbWUoaGEtPmhvc3QpKTsKKwkJICAgICIlcyIsIGZjX2hvc3Rfc3lzdGVtX2hvc3RuYW1lKHZoYS0+aG9zdCkpOwogCQlhbGVuID0gc3RybGVuKGVpdGVyLT5hLmhvc3RfbmFtZSk7CiAJCWFsZW4gKz0gKGFsZW4gJiAzKSA/ICg0IC0gKGFsZW4gJiAzKSkgOiA0OwogCQllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCQlzaXplICs9IDQgKyBhbGVuOwogCiAJCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBIT1NUTkFNRT0lcy5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGVpdGVyLT5hLmhvc3RfbmFtZSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBlaXRlci0+YS5ob3N0X25hbWUpKTsKIAl9CiAKIAkvKiBVcGRhdGUgTVMgcmVxdWVzdCBzaXplLiAqLwotCXFsYTJ4MDBfdXBkYXRlX21zX2ZkbWlfaW9jYihoYSwgc2l6ZSArIDE2KTsKKwlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IodmhhLCBzaXplICsgMTYpOwogCiAJREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFJQQSBwb3J0bmFtZT0iCiAJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwgX19mdW5jX18sCi0JICAgIGhhLT5ob3N0X25vLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzBdLAorCSAgICB2aGEtPmhvc3Rfbm8sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMF0sCiAJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMl0sCiAJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbM10sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNF0sCiAJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNl0sCkBAIC0xNjMzLDE4ICsxNjQwLDE4IEBACiAJREVCVUcxMyhxbGEyeDAwX2R1bXBfYnVmZmVyKGVudHJpZXMsIHNpemUpKTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLCAiUlBBIikgIT0KKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJSUEEiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE2NTcsMzQgKzE2NjQsMjggQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBpbnQKLXFsYTJ4MDBfZmRtaV9yZWdpc3RlcihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9mZG1pX3JlZ2lzdGVyKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsOwogCi0JaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRkRNSSB1bnN1cHBvcnRlZCBvbiAiCi0JCSAgICAiSVNQMjEwMC9JU1AyMjAwLlxuIiwgaGEtPmhvc3Rfbm8pKTsKLQkJcmV0dXJuIFFMQV9TVUNDRVNTOwotCX0KLQotCXJ2YWwgPSBxbGEyeDAwX21nbXRfc3ZyX2xvZ2luKGhhKTsKKwlydmFsID0gcWxhMngwMF9tZ210X3N2cl9sb2dpbih2aGEpOwogCWlmIChydmFsKQogCQlyZXR1cm4gcnZhbDsKIAotCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfcmhiYShoYSk7CisJcnZhbCA9IHFsYTJ4MDBfZmRtaV9yaGJhKHZoYSk7CiAJaWYgKHJ2YWwpIHsKIAkJaWYgKHJ2YWwgIT0gUUxBX0FMUkVBRFlfUkVHSVNURVJFRCkKIAkJCXJldHVybiBydmFsOwogCi0JCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfZGhiYShoYSk7CisJCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfZGhiYSh2aGEpOwogCQlpZiAocnZhbCkKIAkJCXJldHVybiBydmFsOwogCi0JCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfcmhiYShoYSk7CisJCXJ2YWwgPSBxbGEyeDAwX2ZkbWlfcmhiYSh2aGEpOwogCQlpZiAocnZhbCkKIAkJCXJldHVybiBydmFsOwogCX0KLQlydmFsID0gcWxhMngwMF9mZG1pX3JwYShoYSk7CisJcnZhbCA9IHFsYTJ4MDBfZmRtaV9ycGEodmhhKTsKIAogCXJldHVybiBydmFsOwogfQpAQCAtMTY5NywxMSArMTY5OCwxMSBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMngwMF9nZnBuX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3FsYTJ4MDBfZ2Zwbl9pZChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3dfaW5mb190ICpsaXN0KQogewogCWludAkJcnZhbDsKIAl1aW50MTZfdAlpOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwpAQCAtMTcxMiw3ICsxNzEzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgewogCQkvKiBJc3N1ZSBHRlBOX0lEICovCiAJCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KLQkJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYihoYSwgR0ZQTl9JRF9SRVFfU0laRSwKKwkJbXNfcGt0ID0gaGEtPmlzcF9vcHMtPnByZXBfbXNfaW9jYih2aGEsIEdGUE5fSURfUkVRX1NJWkUsCiAJCSAgICBHRlBOX0lEX1JTUF9TSVpFKTsKIAogCQkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KQEAgLTE3MjYsMTMgKzE3MjcsMTMgQEAKIAkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzJdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7CiAKIAkJLyogRXhlY3V0ZSBNUyBJT0NCICovCi0JCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCiAJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0ZQTl9JRCBpc3N1ZSBJT0NCICIKLQkJCSAgICAiZmFpbGVkICglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOwotCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyhoYSwgbXNfcGt0LCBjdF9yc3AsCisJCQkgICAgImZhaWxlZCAoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCiAJCSAgICAiR0ZQTl9JRCIpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKQEAgLTE3NTAsMTcgKzE3NTEsMTcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICoKLXFsYTI0eHhfcHJlcF9tc19mbV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IHJlcV9zaXplLAorcWxhMjR4eF9wcmVwX21zX2ZtX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90IHJlcV9zaXplLAogICAgIHVpbnQzMl90IHJzcF9zaXplKQogewogCXN0cnVjdCBjdF9lbnRyeV8yNHh4ICpjdF9wa3Q7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAljdF9wa3QgPSAoc3RydWN0IGN0X2VudHJ5XzI0eHggKiloYS0+bXNfaW9jYjsKIAltZW1zZXQoY3RfcGt0LCAwLCBzaXplb2Yoc3RydWN0IGN0X2VudHJ5XzI0eHgpKTsKIAogCWN0X3BrdC0+ZW50cnlfdHlwZSA9IENUX0lPQ0JfVFlQRTsKIAljdF9wa3QtPmVudHJ5X2NvdW50ID0gMTsKLQljdF9wa3QtPm5wb3J0X2hhbmRsZSA9IGNwdV90b19sZTE2KGhhLT5tZ210X3N2cl9sb29wX2lkKTsKKwljdF9wa3QtPm5wb3J0X2hhbmRsZSA9IGNwdV90b19sZTE2KHZoYS0+bWdtdF9zdnJfbG9vcF9pZCk7CiAJY3RfcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoaGEtPnJfYV90b3YgLyAxMCAqIDIpOwogCWN0X3BrdC0+Y21kX2RzZF9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CiAJY3RfcGt0LT5yc3BfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKQEAgLTE3NzQsNyArMTc3NSw3IEBACiAJY3RfcGt0LT5kc2VnXzFfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+Y3Rfc25zX2RtYSkpOwogCWN0X3BrdC0+ZHNlZ18xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPmN0X3Nuc19kbWEpKTsKIAljdF9wa3QtPmRzZWdfMV9sZW4gPSBjdF9wa3QtPnJzcF9ieXRlX2NvdW50OwotCWN0X3BrdC0+dnBfaW5kZXggPSBoYS0+dnBfaWR4OworCWN0X3BrdC0+dnBfaW5kZXggPSB2aGEtPnZwX2lkeDsKIAogCXJldHVybiBjdF9wa3Q7CiB9CkBAIC0xODAzLDExICsxODA0LDExIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyeDAwX2dwc2Moc2NzaV9xbGFfaG9zdF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQorcWxhMngwMF9ncHNjKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzd19pbmZvX3QgKmxpc3QpCiB7CiAJaW50CQlydmFsOwogCXVpbnQxNl90CWk7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CkBAIC0xODE3LDE0ICsxODE4LDE0IEBACiAJaWYgKCFoYS0+ZmxhZ3MuZ3BzY19zdXBwb3J0ZWQpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JcnZhbCA9IHFsYTJ4MDBfbWdtdF9zdnJfbG9naW4oaGEpOworCXJ2YWwgPSBxbGEyeDAwX21nbXRfc3ZyX2xvZ2luKHZoYSk7CiAJaWYgKHJ2YWwpCiAJCXJldHVybiBydmFsOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKIAkJLyogSXNzdWUgR0ZQTl9JRCAqLwogCQkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCi0JCW1zX3BrdCA9IHFsYTI0eHhfcHJlcF9tc19mbV9pb2NiKGhhLCBHUFNDX1JFUV9TSVpFLAorCQltc19wa3QgPSBxbGEyNHh4X3ByZXBfbXNfZm1faW9jYih2aGEsIEdQU0NfUkVRX1NJWkUsCiAJCSAgICBHUFNDX1JTUF9TSVpFKTsKIAogCQkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KQEAgLTE4MzcsMTMgKzE4MzgsMTMgQEAKIAkJICAgIFdXTl9TSVpFKTsKIAogCQkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KLQkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KIAkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUFNDIGlzc3VlIElPQ0IgIgotCQkJICAgICJmYWlsZWQgKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7Ci0JCX0gZWxzZSBpZiAoKHJ2YWwgPSBxbGEyeDAwX2Noa19tc19zdGF0dXMoaGEsIG1zX3BrdCwgY3RfcnNwLAorCQkJICAgICJmYWlsZWQgKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKChydmFsID0gcWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCiAJCSAgICAiR1BTQyIpKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJLyogRk0gY29tbWFuZCB1bnN1cHBvcnRlZD8gKi8KIAkJCWlmIChydmFsID09IFFMQV9JTlZBTElEX0NPTU1BTkQgJiYKQEAgLTE4NTMsNyArMTg1NCw3IEBACiAJCQkJQ1RfUkVBU09OX0NPTU1BTkRfVU5TVVBQT1JURUQpKSB7CiAJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBHUFNDIGNvbW1hbmQgIgogCQkJCSAgICAidW5zdXBwb3J0ZWQsIGRpc2FibGluZyBxdWVyeS4uLlxuIiwKLQkJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCQkJaGEtPmZsYWdzLmdwc2Nfc3VwcG9ydGVkID0gMDsKIAkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCQlicmVhazsKQEAgLTE4NzgsNyArMTg3OSw3IEBACiAKIAkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUFNDIGV4dCBlbnRyeSAtICIKIAkJCSAgICAiZnBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNwZWVkcz0lMDR4ICIKLQkJCSAgICAic3BlZWQ9JTA0eC5cbiIsIGhhLT5ob3N0X25vLAorCQkJICAgICJzcGVlZD0lMDR4LlxuIiwgdmhhLT5ob3N0X25vLAogCQkJICAgIGxpc3RbaV0uZmFicmljX3BvcnRfbmFtZVswXSwKIAkJCSAgICBsaXN0W2ldLmZhYnJpY19wb3J0X25hbWVbMV0sCiAJCQkgICAgbGlzdFtpXS5mYWJyaWNfcG9ydF9uYW1lWzJdLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggNDIxOGYyMC4uNTJlZDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC01LDYgKzUsNyBAQAogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgInFsYV9kZWYuaCIKKyNpbmNsdWRlICJxbGFfZ2JsLmgiCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KQEAgLTIxLDcgKzIyLDYgQEAKIHN0YXRpYyBpbnQgcWxhMngwMF9pc3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICopOwogc3RhdGljIHZvaWQgcWxhMngwMF9yZXNpemVfcmVxdWVzdF9xKHNjc2lfcWxhX2hvc3RfdCAqKTsKIHN0YXRpYyBpbnQgcWxhMngwMF9zZXR1cF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqKTsKLXN0YXRpYyB2b2lkIHFsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoc2NzaV9xbGFfaG9zdF90ICopOwogc3RhdGljIGludCBxbGEyeDAwX2luaXRfcmluZ3Moc2NzaV9xbGFfaG9zdF90ICopOwogc3RhdGljIGludCBxbGEyeDAwX2Z3X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqKTsKIHN0YXRpYyBpbnQgcWxhMngwMF9jb25maWd1cmVfaGJhKHNjc2lfcWxhX2hvc3RfdCAqKTsKQEAgLTM1LDEwICszNSwxMSBAQAogCiBzdGF0aWMgaW50IHFsYTJ4MDBfcmVzdGFydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICopOwogCi1zdGF0aWMgaW50IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmRldik7CitzdGF0aWMgaW50IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICopOwogCiBzdGF0aWMgc3RydWN0IHFsYV9jaGlwX3N0YXRlXzg0eHggKnFsYTg0eHhfZ2V0X2NoaXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBzdGF0aWMgaW50IHFsYTg0eHhfaW5pdF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMjV4eF9pbml0X3F1ZXVlcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgUUxvZ2ljIElTUDJ4MDAgSGFyZHdhcmUgU3VwcG9ydCBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICovCkBAIC01NSw3NyArNTYsODEgQEAKICogICAgICAwID0gc3VjY2VzcwogKi8KIGludAotcWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAlydmFsOwotCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAJLyogQ2xlYXIgYWRhcHRlciBmbGFncy4gKi8KLQloYS0+ZmxhZ3Mub25saW5lID0gMDsKLQloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMDsKLQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7Ci0JYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7Ci0JaGEtPmRldmljZV9mbGFncyA9IERGTEdfTk9fQ0FCTEU7Ci0JaGEtPmRwY19mbGFncyA9IDA7Ci0JaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7Ci0JaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCXZoYS0+ZmxhZ3Mub25saW5lID0gMDsKKwl2aGEtPmZsYWdzLnJlc2V0X2FjdGl2ZSA9IDA7CisJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CisJdmhhLT5kZXZpY2VfZmxhZ3MgPSBERkxHX05PX0NBQkxFOworCXZoYS0+ZHBjX2ZsYWdzID0gMDsKKwl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisJdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKIAloYS0+bWJ4X2ZsYWdzID0gMDsKIAloYS0+aXNwX2Fib3J0X2NudCA9IDA7CiAJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOwotCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwlzZXRfYml0KFJFR0lTVEVSX0ZETUlfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCisJc2V0X2JpdCgwLCBoYS0+cmVxX3FpZF9tYXApOworCXNldF9iaXQoMCwgaGEtPnJzcF9xaWRfbWFwKTsKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyaW5nIFBDSSBzcGFjZS4uLlxuIik7Ci0JcnZhbCA9IGhhLT5pc3Bfb3BzLT5wY2lfY29uZmlnKGhhKTsKKwlydmFsID0gaGEtPmlzcF9vcHMtPnBjaV9jb25maWcodmhhKTsKIAlpZiAocnZhbCkgewogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBjb25maWd1cmUgUENJIHNwYWNlLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIChydmFsKTsKIAl9CiAKLQloYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSk7CisJaGEtPmlzcF9vcHMtPnJlc2V0X2NoaXAodmhhKTsKIAotCXJ2YWwgPSBxbGEyeHh4X2dldF9mbGFzaF9pbmZvKGhhKTsKKwlydmFsID0gcWxhMnh4eF9nZXRfZmxhc2hfaW5mbyh2aGEpOwogCWlmIChydmFsKSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIHZhbGlkYXRlIEZMQVNIIGRhdGEuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlyZXR1cm4gKHJ2YWwpOwogCX0KIAotCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbihoYSwgaGEtPnJlcXVlc3RfcmluZyk7CisJaGEtPmlzcF9vcHMtPmdldF9mbGFzaF92ZXJzaW9uKHZoYSwgcmVxLT5yaW5nKTsKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyZSBOVlJBTSBwYXJhbWV0ZXJzLi4uXG4iKTsKIAotCWhhLT5pc3Bfb3BzLT5udnJhbV9jb25maWcoaGEpOworCWhhLT5pc3Bfb3BzLT5udnJhbV9jb25maWcodmhhKTsKIAogCWlmIChoYS0+ZmxhZ3MuZGlzYWJsZV9zZXJkZXMpIHsKIAkJLyogTWFzayBIQkEgdmlhIE5WUkFNIHNldHRpbmdzPyAqLwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJNYXNraW5nIEhCQSBXV1BOICIKIAkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAodmlhIE5WUkFNKS5cbiIsCi0JCSAgICBoYS0+cG9ydF9uYW1lWzBdLCBoYS0+cG9ydF9uYW1lWzFdLAotCQkgICAgaGEtPnBvcnRfbmFtZVsyXSwgaGEtPnBvcnRfbmFtZVszXSwKLQkJICAgIGhhLT5wb3J0X25hbWVbNF0sIGhhLT5wb3J0X25hbWVbNV0sCi0JCSAgICBoYS0+cG9ydF9uYW1lWzZdLCBoYS0+cG9ydF9uYW1lWzddKTsKKwkJICAgIHZoYS0+cG9ydF9uYW1lWzBdLCB2aGEtPnBvcnRfbmFtZVsxXSwKKwkJICAgIHZoYS0+cG9ydF9uYW1lWzJdLCB2aGEtPnBvcnRfbmFtZVszXSwKKwkJICAgIHZoYS0+cG9ydF9uYW1lWzRdLCB2aGEtPnBvcnRfbmFtZVs1XSwKKwkJICAgIHZoYS0+cG9ydF9uYW1lWzZdLCB2aGEtPnBvcnRfbmFtZVs3XSk7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlZlcmlmeWluZyBsb2FkZWQgUklTQyBjb2RlLi4uXG4iKTsKIAotCWlmIChxbGEyeDAwX2lzcF9maXJtd2FyZShoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcnZhbCA9IGhhLT5pc3Bfb3BzLT5jaGlwX2RpYWcoaGEpOworCWlmIChxbGEyeDAwX2lzcF9maXJtd2FyZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSBoYS0+aXNwX29wcy0+Y2hpcF9kaWFnKHZoYSk7CiAJCWlmIChydmFsKQogCQkJcmV0dXJuIChydmFsKTsKLQkJcnZhbCA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CisJCXJ2YWwgPSBxbGEyeDAwX3NldHVwX2NoaXAodmhhKTsKIAkJaWYgKHJ2YWwpCiAJCQlyZXR1cm4gKHJ2YWwpOwogCX0KIAlpZiAoSVNfUUxBODRYWChoYSkpIHsKLQkJaGEtPmNzODR4eCA9IHFsYTg0eHhfZ2V0X2NoaXAoaGEpOworCQloYS0+Y3M4NHh4ID0gcWxhODR4eF9nZXRfY2hpcCh2aGEpOwogCQlpZiAoIWhhLT5jczg0eHgpIHsKIAkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAogCQkJICAgICJVbmFibGUgdG8gY29uZmlndXJlIElTUDg0WFguXG4iKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CiAJfQotCXJ2YWwgPSBxbGEyeDAwX2luaXRfcmluZ3MoaGEpOworCXJ2YWwgPSBxbGEyeDAwX2luaXRfcmluZ3ModmhhKTsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0xMzcsMTAgKzE0MiwxMSBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMjEwMF9wY2lfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyMTAwX3BjaV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDE2X3QgdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAogCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKQEAgLTE2NywxMSArMTczLDEyIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyMzAwX3BjaV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTIzMDBfcGNpX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAl1aW50MTZfdAl3OwogCXVuc2lnbmVkIGxvbmcgICBmbGFncyA9IDA7CiAJdWludDMyX3QJY250OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAogCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKQEAgLTI0OCwxMCArMjU1LDExIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50Ci1xbGEyNHh4X3BjaV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTI0eHhfcGNpX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAl1aW50MTZfdCB3OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCiAJcGNpX3NldF9tYXN0ZXIoaGEtPnBkZXYpOwpAQCAtMjkxLDkgKzI5OSwxMCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMjV4eF9wY2lfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyNXh4X3BjaV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDE2X3QgdzsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKIAlwY2lfdHJ5X3NldF9td2koaGEtPnBkZXYpOwpAQCAtMzIxLDMyICszMzAsMzMgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2lzcF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9pc3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50ICBydmFsOwogCXVpbnQxNl90IGxvb3BfaWQsIHRvcG8sIHN3X2NhcDsKIAl1aW50OF90IGRvbWFpbiwgYXJlYSwgYWxfcGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAkvKiBBc3N1bWUgbG9hZGluZyByaXNjIGNvZGUgKi8KIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCWlmIChoYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCkgewogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJJU0MgQ09ERSBOT1QgbG9hZGVkXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIENPREUgTk9UIGxvYWRlZFxuIik7CiAKIAkJLyogVmVyaWZ5IGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuICovCi0JCXJ2YWwgPSBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShoYSwgaGEtPmZ3X3NyaXNjX2FkZHJlc3MpOworCQlydmFsID0gcWxhMngwMF92ZXJpZnlfY2hlY2tzdW0odmhhLCBoYS0+Zndfc3Jpc2NfYWRkcmVzcyk7CiAJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCQkvKiBBbmQsIHZlcmlmeSB3ZSBhcmUgbm90IGluIFJPTSBjb2RlLiAqLwotCQkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoaGEsICZsb29wX2lkLCAmYWxfcGEsCisJCQlydmFsID0gcWxhMngwMF9nZXRfYWRhcHRlcl9pZCh2aGEsICZsb29wX2lkLCAmYWxfcGEsCiAJCQkgICAgJmFyZWEsICZkb21haW4sICZ0b3BvLCAmc3dfY2FwKTsKIAkJfQogCX0KIAogCWlmIChydmFsKSB7CiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiAqKioqIExvYWQgUklTQyBjb2RlICoqKipcbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTM1OSw5ICszNjksMTAgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiB2b2lkCi1xbGEyeDAwX3Jlc2V0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfcmVzZXRfY2hpcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MzJfdAljbnQ7CiAJdWludDE2X3QJY21kOwpAQCAtNDk5LDEwICs1MTAsMTEgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTI0eHhfcmVzZXRfcmlzYyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF9yZXNldF9yaXNjKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBod19ldnQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCXVpbnQzMl90IGNudCwgZDI7CiAJdWludDE2X3Qgd2Q7CkBAIC01NDEsNyArNTUzLDcgQEAKIAkJYmFycmllcigpOwogCX0KIAlpZiAoY250ID09IDAgfHwgaHdfZXZ0KQotCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyhoYSwgSFdfRVZFTlRfUkVTRVRfRVJSLAorCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyh2aGEsIEhXX0VWRU5UX1JFU0VUX0VSUiwKIAkJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxKSwgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpLAogCQkgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDMpKTsKIApAQCAtNTcxLDEyICs1ODMsMTMgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiB2b2lkCi1xbGEyNHh4X3Jlc2V0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTI0eHhfcmVzZXRfY2hpcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAloYS0+aXNwX29wcy0+ZGlzYWJsZV9pbnRycyhoYSk7CiAKIAkvKiBQZXJmb3JtIFJJU0MgcmVzZXQuICovCi0JcWxhMjR4eF9yZXNldF9yaXNjKGhhKTsKKwlxbGEyNHh4X3Jlc2V0X3Jpc2ModmhhKTsKIH0KIAogLyoqCkBAIC01ODYsMjAgKzU5OSwyMiBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludAotcWxhMngwMF9jaGlwX2RpYWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfY2hpcF9kaWFnKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CiAJdWludDE2X3QJZGF0YTsKIAl1aW50MzJfdAljbnQ7CiAJdWludDE2X3QJbWJbNV07CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKIAkvKiBBc3N1bWUgYSBmYWlsZWQgc3RhdGUgKi8KIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogVGVzdGluZyBkZXZpY2UgYXQgJWx4LlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8sICh1X2xvbmcpJnJlZy0+Zmxhc2hfYWRkcmVzcykpOworCSAgICB2aGEtPmhvc3Rfbm8sICh1X2xvbmcpJnJlZy0+Zmxhc2hfYWRkcmVzcykpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKQEAgLTY2MiwxNyArNjc3LDE3IEBACiAJaGEtPnByb2R1Y3RfaWRbM10gPSBtYls0XTsKIAogCS8qIEFkanVzdCBmdyBSSVNDIHRyYW5zZmVyIHNpemUgKi8KLQlpZiAoaGEtPnJlcXVlc3RfcV9sZW5ndGggPiAxMDI0KQorCWlmIChyZXEtPmxlbmd0aCA+IDEwMjQpCiAJCWhhLT5md190cmFuc2Zlcl9zaXplID0gUkVRVUVTVF9FTlRSWV9TSVpFICogMTAyNDsKIAllbHNlCiAJCWhhLT5md190cmFuc2Zlcl9zaXplID0gUkVRVUVTVF9FTlRSWV9TSVpFICoKLQkJICAgIGhhLT5yZXF1ZXN0X3FfbGVuZ3RoOworCQkgICAgcmVxLT5sZW5ndGg7CiAKIAlpZiAoSVNfUUxBMjIwMChoYSkgJiYKIAkgICAgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNykgPT0gUUxBMjIwMEFfUklTQ19ST01fVkVSKSB7CiAJCS8qIExpbWl0IGZpcm13YXJlIHRyYW5zZmVyIHNpemUgd2l0aCBhIDIyMDBBICovCiAJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRm91bmQgUUxBMjIwMEEgY2hpcC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUDIyMDBBOwogCQloYS0+ZndfdHJhbnNmZXJfc2l6ZSA9IDEyODsKQEAgLTY4MSwxMSArNjk2LDExIEBACiAJLyogV3JhcCBJbmNvbWluZyBNYWlsYm94ZXMgVGVzdC4gKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBDaGVja2luZyBtYWlsYm94ZXMuXG4iLCBoYS0+aG9zdF9ubykpOwotCXJ2YWwgPSBxbGEyeDAwX21ieF9yZWdfdGVzdChoYSk7CisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBDaGVja2luZyBtYWlsYm94ZXMuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlydmFsID0gcWxhMngwMF9tYnhfcmVnX3Rlc3QodmhhKTsKIAlpZiAocnZhbCkgewogCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iKTsKIAl9CkBAIC02OTgsNyArNzEzLDcgQEAKIGNoaXBfZGlhZ19mYWlsZWQ6CiAJaWYgKHJ2YWwpCiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBDaGlwIGRpYWdub3N0aWNzICoqKiogRkFJTEVEICIKLQkJICAgICIqKioqXG4iLCBoYS0+aG9zdF9ubykpOworCQkgICAgIioqKipcbiIsIHZoYS0+aG9zdF9ubykpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtNzEyLDE5ICs3MjcsMjEgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBpbnQKLXFsYTI0eHhfY2hpcF9kaWFnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyNHh4X2NoaXBfZGlhZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAogCS8qIFBlcmZvcm0gUklTQyByZXNldC4gKi8KLQlxbGEyNHh4X3Jlc2V0X3Jpc2MoaGEpOworCXFsYTI0eHhfcmVzZXRfcmlzYyh2aGEpOwogCi0JaGEtPmZ3X3RyYW5zZmVyX3NpemUgPSBSRVFVRVNUX0VOVFJZX1NJWkUgKiBoYS0+cmVxdWVzdF9xX2xlbmd0aDsKKwloYS0+ZndfdHJhbnNmZXJfc2l6ZSA9IFJFUVVFU1RfRU5UUllfU0laRSAqIHJlcS0+bGVuZ3RoOwogCi0JcnZhbCA9IHFsYTJ4MDBfbWJ4X3JlZ190ZXN0KGhhKTsKKwlydmFsID0gcWxhMngwMF9tYnhfcmVnX3Rlc3QodmhhKTsKIAlpZiAocnZhbCkgewogCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iKTsKIAl9IGVsc2UgewpAQCAtNzM2LDEzICs3NTMsMTYgQEAKIH0KIAogdm9pZAotcWxhMngwMF9hbGxvY19md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2FsbG9jX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7CiAJdWludDMyX3QgZHVtcF9zaXplLCBmaXhlZF9zaXplLCBtZW1fc2l6ZSwgcmVxX3Ffc2l6ZSwgcnNwX3Ffc2l6ZSwKLQkgICAgZWZ0X3NpemUsIGZjZV9zaXplOworCSAgICBlZnRfc2l6ZSwgZmNlX3NpemUsIG1xX3NpemU7CiAJZG1hX2FkZHJfdCB0Y19kbWE7CiAJdm9pZCAqdGM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CiAKIAlpZiAoaGEtPmZ3X2R1bXApIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLApAQCAtNzUxLDcgKzc3MSw3IEBACiAJfQogCiAJaGEtPmZ3X2R1bXBlZCA9IDA7Ci0JZml4ZWRfc2l6ZSA9IG1lbV9zaXplID0gZWZ0X3NpemUgPSBmY2Vfc2l6ZSA9IDA7CisJZml4ZWRfc2l6ZSA9IG1lbV9zaXplID0gZWZ0X3NpemUgPSBmY2Vfc2l6ZSA9IG1xX3NpemUgPSAwOwogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewogCQlmaXhlZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyMTAwX2Z3X2R1bXApOwogCX0gZWxzZSBpZiAoSVNfUUxBMjNYWChoYSkpIHsKQEAgLTc2MCwxMCArNzgwLDEyIEBACiAJCSAgICBzaXplb2YodWludDE2X3QpOwogCX0gZWxzZSBpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewogCQlmaXhlZF9zaXplID0gSVNfUUxBMjVYWChoYSkgPwotCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHFsYTI1eHhfZndfZHVtcCwgZXh0X21lbSk6Ci0JCSAgICBvZmZzZXRvZihzdHJ1Y3QgcWxhMjR4eF9md19kdW1wLCBleHRfbWVtKTsKKwkJCW9mZnNldG9mKHN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAsIGV4dF9tZW0pIDoKKwkJCW9mZnNldG9mKHN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAsIGV4dF9tZW0pOwogCQltZW1fc2l6ZSA9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDEwMDAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MzJfdCk7CisJCWlmIChoYS0+bXFlbmFibGUpCisJCQltcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X21xX2NoYWluKTsKIAogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwogCQlpZiAoIUlTX1FMQTI1WFgoaGEpKQpAQCAtNzc4LDcgKzgwMCw3IEBACiAJCX0KIAogCQltZW1zZXQodGMsIDAsIEZDRV9TSVpFKTsKLQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2ZjZV90cmFjZShoYSwgdGNfZG1hLCBGQ0VfTlVNX0JVRkZFUlMsCisJCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9mY2VfdHJhY2UodmhhLCB0Y19kbWEsIEZDRV9OVU1fQlVGRkVSUywKIAkJICAgIGhhLT5mY2VfbWIsICZoYS0+ZmNlX2J1ZnMpOwogCQlpZiAocnZhbCkgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgpAQCAtODA3LDcgKzgyOSw3IEBACiAJCX0KIAogCQltZW1zZXQodGMsIDAsIEVGVF9TSVpFKTsKLQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2VmdF90cmFjZShoYSwgdGNfZG1hLCBFRlRfTlVNX0JVRkZFUlMpOworCQlydmFsID0gcWxhMngwMF9lbmFibGVfZWZ0X3RyYWNlKHZoYSwgdGNfZG1hLCBFRlRfTlVNX0JVRkZFUlMpOwogCQlpZiAocnZhbCkgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgogCQkJICAgICJFRlQgKCVkKS5cbiIsIHJ2YWwpOwpAQCAtODI0LDEyICs4NDYsMTIgQEAKIAkJaGEtPmVmdCA9IHRjOwogCX0KIGNvbnRfYWxsb2M6Ci0JcmVxX3Ffc2l6ZSA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICogc2l6ZW9mKHJlcXVlc3RfdCk7Ci0JcnNwX3Ffc2l6ZSA9IGhhLT5yZXNwb25zZV9xX2xlbmd0aCAqIHNpemVvZihyZXNwb25zZV90KTsKKwlyZXFfcV9zaXplID0gcmVxLT5sZW5ndGggKiBzaXplb2YocmVxdWVzdF90KTsKKwlyc3BfcV9zaXplID0gcnNwLT5sZW5ndGggKiBzaXplb2YocmVzcG9uc2VfdCk7CiAKIAlkdW1wX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMnh4eF9md19kdW1wLCBpc3ApOwogCWR1bXBfc2l6ZSArPSBmaXhlZF9zaXplICsgbWVtX3NpemUgKyByZXFfcV9zaXplICsgcnNwX3Ffc2l6ZSArCi0JICAgIGVmdF9zaXplICsgZmNlX3NpemU7CisJICAgIG1xX3NpemUgKyBlZnRfc2l6ZSArIGZjZV9zaXplOwogCiAJaGEtPmZ3X2R1bXAgPSB2bWFsbG9jKGR1bXBfc2l6ZSk7CiAJaWYgKCFoYS0+ZndfZHVtcCkgewpAQCAtODQ0LDcgKzg2Niw2IEBACiAJCX0KIAkJcmV0dXJuOwogCX0KLQogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsbG9jYXRlZCAoJWQgS0IpIGZvciBmaXJtd2FyZSBkdW1wLi4uXG4iLAogCSAgICBkdW1wX3NpemUgLyAxMDI0KTsKIApAQCAtODc1LDI3ICs4OTYsMjkgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9yZXNpemVfcmVxdWVzdF9xKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3Jlc2l6ZV9yZXF1ZXN0X3Eoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7CiAJdWludDE2X3QgZndfaW9jYl9jbnQgPSAwOwogCXVpbnQxNl90IHJlcXVlc3RfcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yWFhYX0VYVF9NRU07CiAJZG1hX2FkZHJfdCByZXF1ZXN0X2RtYTsKIAlyZXF1ZXN0X3QgKnJlcXVlc3RfcmluZzsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAogCS8qIFZhbGlkIG9ubHkgb24gcmVjZW50IElTUHMuICovCiAJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQogCQlyZXR1cm47CiAKIAkvKiBSZXRyaWV2ZSBJT0NCIGNvdW50cyBhdmFpbGFibGUgdG8gdGhlIGZpcm13YXJlLiAqLwotCXJ2YWwgPSBxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKGhhLCBOVUxMLCBOVUxMLCBOVUxMLCAmZndfaW9jYl9jbnQsCi0JICAgICZoYS0+bWF4X25waXZfdnBvcnRzKTsKKwlydmFsID0gcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cyh2aGEsIE5VTEwsIE5VTEwsIE5VTEwsICZmd19pb2NiX2NudCwKKwkJCQkJJmhhLT5tYXhfbnBpdl92cG9ydHMpOwogCWlmIChydmFsKQogCQlyZXR1cm47CiAJLyogTm8gcG9pbnQgaW4gY29udGludWluZyBpZiBjdXJyZW50IHNldHRpbmdzIGFyZSBzdWZmaWNpZW50LiAqLwogCWlmIChmd19pb2NiX2NudCA8IDEwMjQpCiAJCXJldHVybjsKLQlpZiAoaGEtPnJlcXVlc3RfcV9sZW5ndGggPj0gcmVxdWVzdF9xX2xlbmd0aCkKKwlpZiAocmVxLT5sZW5ndGggPj0gcmVxdWVzdF9xX2xlbmd0aCkKIAkJcmV0dXJuOwogCiAJLyogQXR0ZW1wdCB0byBjbGFpbSBsYXJnZXIgYXJlYSBmb3IgcmVxdWVzdCBxdWV1ZS4gKi8KQEAgLTkwOSwxNyArOTMyLDE3IEBACiAJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRXh0ZW5kZWQgbWVtb3J5IGRldGVjdGVkICglZCBLQikuLi5cbiIsCiAJICAgIChoYS0+ZndfbWVtb3J5X3NpemUgKyAxKSAvIDEwMjQpOwogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJlc2l6aW5nIHJlcXVlc3QgcXVldWUgZGVwdGggIgotCSAgICAiKCVkIC0+ICVkKS4uLlxuIiwgaGEtPnJlcXVlc3RfcV9sZW5ndGgsIHJlcXVlc3RfcV9sZW5ndGgpOworCSAgICAiKCVkIC0+ICVkKS4uLlxuIiwgcmVxLT5sZW5ndGgsIHJlcXVlc3RfcV9sZW5ndGgpOwogCiAJLyogQ2xlYXIgb2xkIGFsbG9jYXRpb25zLiAqLwogCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCSAgICAoaGEtPnJlcXVlc3RfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLCBoYS0+cmVxdWVzdF9yaW5nLAotCSAgICBoYS0+cmVxdWVzdF9kbWEpOworCSAgICAocmVxLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLCByZXEtPnJpbmcsCisJICAgIHJlcS0+ZG1hKTsKIAogCS8qIEJlZ2luIHVzaW5nIGxhcmdlciBxdWV1ZS4gKi8KLQloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IHJlcXVlc3RfcV9sZW5ndGg7Ci0JaGEtPnJlcXVlc3RfcmluZyA9IHJlcXVlc3RfcmluZzsKLQloYS0+cmVxdWVzdF9kbWEgPSByZXF1ZXN0X2RtYTsKKwlyZXEtPmxlbmd0aCA9IHJlcXVlc3RfcV9sZW5ndGg7CisJcmVxLT5yaW5nID0gcmVxdWVzdF9yaW5nOworCXJlcS0+ZG1hID0gcmVxdWVzdF9kbWE7CiB9CiAKIC8qKgpAQCAtOTI5LDEwICs5NTIsMTEgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX3NldHVwX2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfc2V0dXBfY2hpcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKIAl1aW50MzJfdCBzcmlzY19hZGRyZXNzID0gMDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtOTQ1LDI4ICs5NjksMjcgQEAKIAl9CiAKIAkvKiBMb2FkIGZpcm13YXJlIHNlcXVlbmNlcyAqLwotCXJ2YWwgPSBoYS0+aXNwX29wcy0+bG9hZF9yaXNjKGhhLCAmc3Jpc2NfYWRkcmVzcyk7CisJcnZhbCA9IGhhLT5pc3Bfb3BzLT5sb2FkX3Jpc2ModmhhLCAmc3Jpc2NfYWRkcmVzcyk7CiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFZlcmlmeWluZyBDaGVja3N1bSBvZiBsb2FkZWQgUklTQyAiCi0JCSAgICAiY29kZS5cbiIsIGhhLT5ob3N0X25vKSk7CisJCSAgICAiY29kZS5cbiIsIHZoYS0+aG9zdF9ubykpOwogCi0JCXJ2YWwgPSBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShoYSwgc3Jpc2NfYWRkcmVzcyk7CisJCXJ2YWwgPSBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bSh2aGEsIHNyaXNjX2FkZHJlc3MpOwogCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewogCQkJLyogU3RhcnQgZmlybXdhcmUgZXhlY3V0aW9uLiAqLwogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IENoZWNrc3VtIE9LLCBzdGFydCAiCi0JCQkgICAgImZpcm13YXJlLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICAiZmlybXdhcmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAotCQkJcnZhbCA9IHFsYTJ4MDBfZXhlY3V0ZV9mdyhoYSwgc3Jpc2NfYWRkcmVzcyk7CisJCQlydmFsID0gcWxhMngwMF9leGVjdXRlX2Z3KHZoYSwgc3Jpc2NfYWRkcmVzcyk7CiAJCQkvKiBSZXRyaWV2ZSBmaXJtd2FyZSBpbmZvcm1hdGlvbi4gKi8KIAkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIGhhLT5md19tYWpvcl92ZXJzaW9uID09IDApIHsKLQkJCQlxbGEyeDAwX2dldF9md192ZXJzaW9uKGhhLAorCQkJCXFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24odmhhLAogCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCiAJCQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAogCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUpOwogCQkJCWhhLT5mbGFncy5ucGl2X3N1cHBvcnRlZCA9IDA7Ci0JCQkJaWYgKChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEEyNVhYKGhhKSB8fAotCQkJCSAgICAgSVNfUUxBODRYWChoYSkpICYmCisJCQkJaWYgKElTX1FMQTJYWFhfTUlEVFlQRShoYSkgJiYKIAkJCQkJIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8yKSkgewogCQkJCQloYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgPSAxOwogCQkJCQlpZiAoKCFoYS0+bWF4X25waXZfdnBvcnRzKSB8fApAQCAtOTc1LDE1ICs5OTgsMTUgQEAKIAkJCQkJCWhhLT5tYXhfbnBpdl92cG9ydHMgPQogCQkJCQkJICAgIE1JTl9NVUxUSV9JRF9GQUJSSUMgLSAxOwogCQkJCX0KLQkJCQlxbGEyeDAwX3Jlc2l6ZV9yZXF1ZXN0X3EoaGEpOworCQkJCXFsYTJ4MDBfcmVzaXplX3JlcXVlc3RfcSh2aGEpOwogCiAJCQkJaWYgKHFsMnhhbGxvY2Z3ZHVtcCkKLQkJCQkJcWxhMngwMF9hbGxvY19md19kdW1wKGhhKTsKKwkJCQkJcWxhMngwMF9hbGxvY19md19kdW1wKHZoYSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICJzY3NpKCVsZCk6IElTUCBGaXJtd2FyZSBmYWlsZWQgY2hlY2tzdW0uXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCX0KIAl9CiAKQEAgLTEwMDIsNyArMTAyNSw3IEBACiAKIAlpZiAocnZhbCkgewogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogU2V0dXAgY2hpcCAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTAxNywxNCArMTA0MCwxNCBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgdm9pZAotcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhzY3NpX3FsYV9ob3N0X3QgKmhhKQordm9pZAorcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogewogCXVpbnQxNl90IGNudDsKIAlyZXNwb25zZV90ICpwa3Q7CiAKLQlwa3QgPSBoYS0+cmVzcG9uc2VfcmluZ19wdHI7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+cmVzcG9uc2VfcV9sZW5ndGg7IGNudCsrKSB7CisJcGt0ID0gcnNwLT5yaW5nX3B0cjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHJzcC0+bGVuZ3RoOyBjbnQrKykgewogCQlwa3QtPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKIAkJcGt0Kys7CiAJfQpAQCAtMTAzOCwxOSArMTA2MSwyMCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHZvaWQKLXFsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDE2X3Qgc3dpbmcsIGVtcGhhc2lzLCB0eF9zZW5zLCByeF9zZW5zOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJbWVtc2V0KGhhLT5md19vcHRpb25zLCAwLCBzaXplb2YoaGEtPmZ3X29wdGlvbnMpKTsKLQlxbGEyeDAwX2dldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucyk7CisJcWxhMngwMF9nZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKTsKIAogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKIAkJcmV0dXJuOwogCiAJLyogU2VyaWFsIExpbmsgb3B0aW9ucy4gKi8KIAlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFNlcmlhbCBsaW5rIG9wdGlvbnM6XG4iLAotCSAgICBoYS0+aG9zdF9ubykpOworCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAlERUJVRzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zLAogCSAgICBzaXplb2YoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucykpKTsKIApAQCAtMTEwOCwxOSArMTEzMiwyMCBAQAogCQloYS0+Zndfb3B0aW9uc1syXSB8PSBCSVRfMTM7CiAKIAkvKiBVcGRhdGUgZmlybXdhcmUgb3B0aW9ucy4gKi8KLQlxbGEyeDAwX3NldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucyk7CisJcWxhMngwMF9zZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKTsKIH0KIAogdm9pZAotcWxhMjR4eF91cGRhdGVfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF91cGRhdGVfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCS8qIFVwZGF0ZSBTZXJpYWwgTGluayBvcHRpb25zLiAqLwogCWlmICgobGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzBdKSAmIEJJVF8wKSA9PSAwKQogCQlyZXR1cm47CiAKLQlydmFsID0gcWxhMngwMF9zZXRfc2VyZGVzX3BhcmFtcyhoYSwKKwlydmFsID0gcWxhMngwMF9zZXRfc2VyZGVzX3BhcmFtcyh2aGEsCiAJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFsxXSksCiAJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFsyXSksCiAJICAgIGxlMTZfdG9fY3B1KGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMyNFszXSkpOwpAQCAtMTEzMSwxOSArMTE1NiwyMiBAQAogfQogCiB2b2lkCi1xbGEyeDAwX2NvbmZpZ19yaW5ncyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCitxbGEyeDAwX2NvbmZpZ19yaW5ncyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKIAogCS8qIFNldHVwIHJpbmcgcGFyYW1ldGVycyBpbiBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLiAqLwogCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3Ffb3V0cG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CiAJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfaW5wb2ludGVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKLQloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX2xlbmd0aCA9IGNwdV90b19sZTE2KGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKTsKLQloYS0+aW5pdF9jYi0+cmVzcG9uc2VfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihoYS0+cmVzcG9uc2VfcV9sZW5ndGgpOwotCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+cmVxdWVzdF9kbWEpKTsKLQloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnJlcXVlc3RfZG1hKSk7Ci0JaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+cmVzcG9uc2VfZG1hKSk7Ci0JaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+cmVzcG9uc2VfZG1hKSk7CisJaGEtPmluaXRfY2ItPnJlcXVlc3RfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihyZXEtPmxlbmd0aCk7CisJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYocnNwLT5sZW5ndGgpOworCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChyZXEtPmRtYSkpOworCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChyZXEtPmRtYSkpOworCWhhLT5pbml0X2NiLT5yZXNwb25zZV9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocnNwLT5kbWEpKTsKKwloYS0+aW5pdF9jYi0+cmVzcG9uc2VfcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKHJzcC0+ZG1hKSk7CiAKIAlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCByZWcpLCAwKTsKIAlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX09VVChoYSwgcmVnKSwgMCk7CkBAIC0xMTUzLDI3ICsxMTgxLDYyIEBACiB9CiAKIHZvaWQKLXFsYTI0eHhfY29uZmlnX3JpbmdzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTI0eHhfY29uZmlnX3JpbmdzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7Ci0Jc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IElTUF9RVUVfUkVHKGhhLCAwKTsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKmlvcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKKwlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgKm1zaXg7CiAJc3RydWN0IGluaXRfY2JfMjR4eCAqaWNiOworCXVpbnQxNl90IHJpZCA9IDA7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CiAKLQkvKiBTZXR1cCByaW5nIHBhcmFtZXRlcnMgaW4gaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4gKi8KKy8qIFNldHVwIHJpbmcgcGFyYW1ldGVycyBpbiBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLiAqLwogCWljYiA9IChzdHJ1Y3QgaW5pdF9jYl8yNHh4ICopaGEtPmluaXRfY2I7CiAJaWNiLT5yZXF1ZXN0X3Ffb3V0cG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CiAJaWNiLT5yZXNwb25zZV9xX2lucG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7Ci0JaWNiLT5yZXF1ZXN0X3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYoaGEtPnJlcXVlc3RfcV9sZW5ndGgpOwotCWljYi0+cmVzcG9uc2VfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihoYS0+cmVzcG9uc2VfcV9sZW5ndGgpOwotCWljYi0+cmVxdWVzdF9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnJlcXVlc3RfZG1hKSk7Ci0JaWNiLT5yZXF1ZXN0X3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+cmVxdWVzdF9kbWEpKTsKLQlpY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+cmVzcG9uc2VfZG1hKSk7Ci0JaWNiLT5yZXNwb25zZV9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnJlc3BvbnNlX2RtYSkpOworCWljYi0+cmVxdWVzdF9xX2xlbmd0aCA9IGNwdV90b19sZTE2KHJlcS0+bGVuZ3RoKTsKKwlpY2ItPnJlc3BvbnNlX3FfbGVuZ3RoID0gY3B1X3RvX2xlMTYocnNwLT5sZW5ndGgpOworCWljYi0+cmVxdWVzdF9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocmVxLT5kbWEpKTsKKwlpY2ItPnJlcXVlc3RfcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKHJlcS0+ZG1hKSk7CisJaWNiLT5yZXNwb25zZV9xX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QocnNwLT5kbWEpKTsKKwlpY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChyc3AtPmRtYSkpOwogCi0JV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9pbiwgMCk7Ci0JV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9vdXQsIDApOwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+cnNwX3FfaW4sIDApOwotCVdSVF9SRUdfRFdPUkQoJnJlZy0+cnNwX3Ffb3V0LCAwKTsKLQlSRF9SRUdfRFdPUkQoJnJlZy0+cnNwX3Ffb3V0KTsKKwlpZiAoaGEtPm1xZW5hYmxlKSB7CisJCWljYi0+cW9zID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihRTEFfREVGQVVMVF9RVUVfUU9TKTsKKwkJaWNiLT5yaWQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHJpZCk7CisJCWlmIChoYS0+ZmxhZ3MubXNpeF9lbmFibGVkKSB7CisJCQltc2l4ID0gJmhhLT5tc2l4X2VudHJpZXNbMV07CisJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fSU5GTworCQkJIlJlaXN0ZXJpbmcgdmVjdG9yIDB4JXggZm9yIGJhc2UgcXVlXG4iLCBtc2l4LT5lbnRyeSkpOworCQkJaWNiLT5tc2l4ID0gY3B1X3RvX2xlMTYobXNpeC0+ZW50cnkpOworCQl9CisJCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KKwkJaWYgKE1TQihyaWQpKQorCQkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0KKwkJCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF8xOSk7CisJCS8qIFVzZSBhbHRlcm5hdGUgUENJIGRldmZuICovCisJCWlmIChMU0IocmlkKSkKKwkJCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yIHw9CisJCQkJX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTgpOworCisJCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yIHw9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzIyKTsKKwkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0gX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMjMpOworCQloYS0+cnNwX3FfbWFwWzBdLT5vcHRpb25zID0gaWNiLT5maXJtd2FyZV9vcHRpb25zXzI7CisKKwkJV1JUX1JFR19EV09SRCgmcmVnLT5pc3AyNW1xLnJlcV9xX2luLCAwKTsKKwkJV1JUX1JFR19EV09SRCgmcmVnLT5pc3AyNW1xLnJlcV9xX291dCwgMCk7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjVtcS5yc3BfcV9pbiwgMCk7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjVtcS5yc3BfcV9vdXQsIDApOworCX0gZWxzZSB7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucmVxX3FfaW4sIDApOworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LnJlcV9xX291dCwgMCk7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucnNwX3FfaW4sIDApOworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LnJzcF9xX291dCwgMCk7CisJfQorCS8qIFBDSSBwb3N0aW5nICovCisJUkRfUkVHX0RXT1JEKCZpb3JlZy0+aGNjcik7CiB9CiAKIC8qKgpAQCAtMTE4NiwxMSArMTI0OSwxNCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfaW5pdF9yaW5ncyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9pbml0X3JpbmdzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAlydmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCWludCBjbnQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CiAJc3RydWN0IG1pZF9pbml0X2NiXzI0eHggKm1pZF9pbml0X2NiID0KIAkgICAgKHN0cnVjdCBtaWRfaW5pdF9jYl8yNHh4ICopIGhhLT5pbml0X2NiOwogCkBAIC0xMTk4LDQ1ICsxMjY0LDQ1IEBACiAKIAkvKiBDbGVhciBvdXRzdGFuZGluZyBjb21tYW5kcyBhcnJheS4gKi8KIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspCi0JCWhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBOVUxMOworCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CiAKLQloYS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSAwOworCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSAwOwogCiAJLyogQ2xlYXIgUlNDTiBxdWV1ZS4gKi8KLQloYS0+cnNjbl9pbl9wdHIgPSAwOwotCWhhLT5yc2NuX291dF9wdHIgPSAwOworCXZoYS0+cnNjbl9pbl9wdHIgPSAwOworCXZoYS0+cnNjbl9vdXRfcHRyID0gMDsKIAogCS8qIEluaXRpYWxpemUgZmlybXdhcmUuICovCi0JaGEtPnJlcXVlc3RfcmluZ19wdHIgID0gaGEtPnJlcXVlc3RfcmluZzsKLQloYS0+cmVxX3JpbmdfaW5kZXggICAgPSAwOwotCWhhLT5yZXFfcV9jbnQgICAgICAgICA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoOwotCWhhLT5yZXNwb25zZV9yaW5nX3B0ciA9IGhhLT5yZXNwb25zZV9yaW5nOwotCWhhLT5yc3BfcmluZ19pbmRleCAgICA9IDA7CisJcmVxLT5yaW5nX3B0ciAgPSByZXEtPnJpbmc7CisJcmVxLT5yaW5nX2luZGV4ICAgID0gMDsKKwlyZXEtPmNudCAgICAgID0gcmVxLT5sZW5ndGg7CisJcnNwLT5yaW5nX3B0ciA9IHJzcC0+cmluZzsKKwlyc3AtPnJpbmdfaW5kZXggICAgPSAwOwogCiAJLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZSBlbnRyaWVzICovCi0JcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhoYSk7CisJcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhyc3ApOwogCi0JaGEtPmlzcF9vcHMtPmNvbmZpZ19yaW5ncyhoYSk7CisJaGEtPmlzcF9vcHMtPmNvbmZpZ19yaW5ncyh2aGEpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCS8qIFVwZGF0ZSBhbnkgSVNQIHNwZWNpZmljIGZpcm13YXJlIG9wdGlvbnMgYmVmb3JlIGluaXRpYWxpemF0aW9uLiAqLwotCWhhLT5pc3Bfb3BzLT51cGRhdGVfZndfb3B0aW9ucyhoYSk7CisJaGEtPmlzcF9vcHMtPnVwZGF0ZV9md19vcHRpb25zKHZoYSk7CiAKLQlERUJVRyhwcmludGsoInNjc2koJWxkKTogSXNzdWUgaW5pdCBmaXJtd2FyZS5cbiIsIGhhLT5ob3N0X25vKSk7CisJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IElzc3VlIGluaXQgZmlybXdhcmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAogCWlmIChoYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQpCiAJCW1pZF9pbml0X2NiLT5jb3VudCA9IGNwdV90b19sZTE2KGhhLT5tYXhfbnBpdl92cG9ydHMpOwogCiAJbWlkX2luaXRfY2ItPm9wdGlvbnMgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KEJJVF8xKTsKIAotCXJ2YWwgPSBxbGEyeDAwX2luaXRfZmlybXdhcmUoaGEsIGhhLT5pbml0X2NiX3NpemUpOworCXJ2YWwgPSBxbGEyeDAwX2luaXRfZmlybXdhcmUodmhhLCBoYS0+aW5pdF9jYl9zaXplKTsKIAlpZiAocnZhbCkgewogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogSW5pdCBmaXJtd2FyZSAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9IGVsc2UgewogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEluaXQgZmlybXdhcmUgLS0gc3VjY2Vzcy5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTEyNDksMTMgKzEzMTUsMTQgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2Z3X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2Z3X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludAkJcnZhbDsKIAl1bnNpZ25lZCBsb25nCXd0aW1lLCBtdGltZSwgY3M4NHh4X3RpbWU7CiAJdWludDE2X3QJbWluX3dhaXQ7CS8qIE1pbmltdW0gd2FpdCB0aW1lIGlmIGxvb3AgaXMgZG93biAqLwogCXVpbnQxNl90CXdhaXRfdGltZTsJLyogV2FpdCB0aW1lIGlmIGxvb3AgaXMgY29taW5nIHJlYWR5ICovCiAJdWludDE2X3QJc3RhdGVbM107CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKQEAgLTEyNzcsMjkgKzEzNDQsMjkgQEAKIAl3dGltZSA9IGppZmZpZXMgKyAod2FpdF90aW1lICogSFopOwogCiAJLyogV2FpdCBmb3IgSVNQIHRvIGZpbmlzaCBMSVAgKi8KLQlpZiAoIWhhLT5mbGFncy5pbml0X2RvbmUpCisJaWYgKCF2aGEtPmZsYWdzLmluaXRfZG9uZSkKICAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIldhaXRpbmcgZm9yIExJUCB0byBjb21wbGV0ZS4uLlxuIik7CiAKIAlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFdhaXRpbmcgZm9yIExJUCB0byBjb21wbGV0ZS4uLlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAlkbyB7Ci0JCXJ2YWwgPSBxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShoYSwgc3RhdGUpOworCQlydmFsID0gcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUodmhhLCBzdGF0ZSk7CiAJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCQlpZiAoc3RhdGVbMF0gPCBGU1RBVEVfTE9TU19PRl9TWU5DKSB7Ci0JCQkJaGEtPmRldmljZV9mbGFncyAmPSB+REZMR19OT19DQUJMRTsKKwkJCQl2aGEtPmRldmljZV9mbGFncyAmPSB+REZMR19OT19DQUJMRTsKIAkJCX0KIAkJCWlmIChJU19RTEE4NFhYKGhhKSAmJiBzdGF0ZVswXSAhPSBGU1RBVEVfUkVBRFkpIHsKIAkJCQlERUJVRzE2KHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCAiCi0JCQkJICAgICI4NHh4PSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHN0YXRlWzBdLAorCQkJCSAgICAiODR4eD0leC5cbiIsIHZoYS0+aG9zdF9ubywgc3RhdGVbMF0sCiAJCQkJICAgIHN0YXRlWzJdKSk7CiAJCQkJaWYgKChzdGF0ZVsyXSAmIEZTVEFURV9MT0dHRURfSU4pICYmCiAJCQkJICAgICAoc3RhdGVbMl0gJiBGU1RBVEVfV0FJVElOR19GT1JfVkVSSUZZKSkgewogCQkJCQlERUJVRzE2KHByaW50aygic2NzaSglbGQpOiBTZW5kaW5nICIKLQkJCQkJICAgICJ2ZXJpZnkgaW9jYi5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQkJCSAgICAidmVyaWZ5IGlvY2IuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAogCQkJCQljczg0eHhfdGltZSA9IGppZmZpZXM7Ci0JCQkJCXJ2YWwgPSBxbGE4NHh4X2luaXRfY2hpcChoYSk7CisJCQkJCXJ2YWwgPSBxbGE4NHh4X2luaXRfY2hpcCh2aGEpOwogCQkJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJCQkJCWJyZWFrOwogCkBAIC0xMzA5LDEzICsxMzc2LDEzIEBACiAJCQkJCW10aW1lICs9IGNzODR4eF90aW1lOwogCQkJCQlERUJVRzE2KHByaW50aygic2NzaSglbGQpOiBJbmNyZWFzaW5nICIKIAkJCQkJICAgICJ3YWl0IHRpbWUgYnkgJWxkLiBOZXcgdGltZSAlbGRcbiIsCi0JCQkJCSAgICBoYS0+aG9zdF9ubywgY3M4NHh4X3RpbWUsIHd0aW1lKSk7CisJCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGNzODR4eF90aW1lLCB3dGltZSkpOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoc3RhdGVbMF0gPT0gRlNUQVRFX1JFQURZKSB7CiAJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IEYvVyBSZWFkeSAtIE9LIFxuIiwKLQkJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCQkgICAgdmhhLT5ob3N0X25vKSk7CiAKLQkJCQlxbGEyeDAwX2dldF9yZXRyeV9jbnQoaGEsICZoYS0+cmV0cnlfY291bnQsCisJCQkJcWxhMngwMF9nZXRfcmV0cnlfY250KHZoYSwgJmhhLT5yZXRyeV9jb3VudCwKIAkJCQkgICAgJmhhLT5sb2dpbl90aW1lb3V0LCAmaGEtPnJfYV90b3YpOwogCiAJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwpAQCAtMTMyNCw3ICsxMzkxLDcgQEAKIAogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpICYmCiAJCQkgICAgc3RhdGVbMF0gIT0gRlNUQVRFX1JFQURZKSB7CiAJCQkJLyogTG9vcCBkb3duLiBUaW1lb3V0IG9uIG1pbl93YWl0IGZvciBzdGF0ZXMKIAkJCQkgKiBvdGhlciB0aGFuIFdhaXQgZm9yIExvZ2luLgpAQCAtMTMzMyw3ICsxNDAwLDcgQEAKIAkJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJCQkgICAgIkNhYmxlIGlzIHVucGx1Z2dlZC4uLlxuIik7CiAKLQkJCQkJaGEtPmRldmljZV9mbGFncyB8PSBERkxHX05PX0NBQkxFOworCQkJCQl2aGEtPmRldmljZV9mbGFncyB8PSBERkxHX05PX0NBQkxFOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0xMzUwLDE1ICsxNDE3LDE1IEBACiAJCW1zbGVlcCg1MDApOwogCiAJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogZndfc3RhdGU9JXggY3VyciB0aW1lPSVseC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgc3RhdGVbMF0sIGppZmZpZXMpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgc3RhdGVbMF0sIGppZmZpZXMpKTsKIAl9IHdoaWxlICgxKTsKIAogCURFQlVHKHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCBjdXJyIHRpbWU9JWx4LlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8sIHN0YXRlWzBdLCBqaWZmaWVzKSk7CisJICAgIHZoYS0+aG9zdF9ubywgc3RhdGVbMF0sIGppZmZpZXMpKTsKIAogCWlmIChydmFsKSB7CiAJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGaXJtd2FyZSByZWFkeSAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTM3OCw3ICsxNDQ1LDcgQEAKICogICAgICBLZXJuZWwgY29udGV4dC4KICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2NvbmZpZ3VyZV9oYmEoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfY29uZmlndXJlX2hiYShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgICAgICAgcnZhbDsKIAl1aW50MTZfdCAgICAgIGxvb3BfaWQ7CkBAIC0xMzg4LDE5ICsxNDU1LDIwIEBACiAJdWludDhfdCAgICAgICBhcmVhOwogCXVpbnQ4X3QgICAgICAgZG9tYWluOwogCWNoYXIJCWNvbm5lY3RfdHlwZVsyMl07CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAkvKiBHZXQgaG9zdCBhZGRyZXNzZXMuICovCi0JcnZhbCA9IHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoaGEsCisJcnZhbCA9IHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQodmhhLAogCSAgICAmbG9vcF9pZCwgJmFsX3BhLCAmYXJlYSwgJmRvbWFpbiwgJnRvcG8sICZzd19jYXApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCWlmIChMT09QX1RSQU5TSVRJT04oaGEpIHx8IGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQlpZiAoTE9PUF9UUkFOU0lUSU9OKHZoYSkgfHwgYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CiAJCSAgICAocnZhbCA9PSBRTEFfQ09NTUFORF9FUlJPUiAmJiBsb29wX2lkID09IDB4NykpIHsKIAkJCURFQlVHMihwcmludGsoIiVzKCVsZCkgTG9vcCBpcyBpbiBhIHRyYW5zaXRpb24gc3RhdGVcbiIsCi0JCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQl9IGVsc2UgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJICAgICJFUlJPUiAtLSBVbmFibGUgdG8gZ2V0IGhvc3QgbG9vcCBJRC5cbiIpOwotCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCX0KIAkJcmV0dXJuIChydmFsKTsKIAl9CkBAIC0xNDExLDcgKzE0NzksNyBAQAogCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwogCX0KIAotCWhhLT5sb29wX2lkID0gbG9vcF9pZDsKKwl2aGEtPmxvb3BfaWQgPSBsb29wX2lkOwogCiAJLyogaW5pdGlhbGl6ZSAqLwogCWhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkID0gU05TX0ZJUlNUX0xPT1BfSUQ7CkBAIC0xNDIxLDE0ICsxNDg5LDE0IEBACiAJc3dpdGNoICh0b3BvKSB7CiAJY2FzZSAwOgogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBOTCB0b3BvbG9neS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OTDsKIAkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihMb29wKSIpOwogCQlicmVhazsKIAogCWNhc2UgMToKIAkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gRkwgdG9wb2xvZ3kuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQloYS0+c3dpdGNoX2NhcCA9IHN3X2NhcDsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX0ZMOwogCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKEZMX1BvcnQpIik7CkBAIC0xNDM2LDcgKzE1MDQsNyBAQAogCiAJY2FzZSAyOgogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBOIFAyUCB0b3BvbG9neS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCWhhLT5vcGVyYXRpbmdfbW9kZSA9IFAyUDsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX047CiAJCXN0cmNweShjb25uZWN0X3R5cGUsICIoTl9Qb3J0LXRvLU5fUG9ydCkiKTsKQEAgLTE0NDQsNyArMTUxMiw3IEBACiAKIAljYXNlIDM6CiAJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIEYgUDJQIHRvcG9sb2d5LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJaGEtPnN3aXRjaF9jYXAgPSBzd19jYXA7CiAJCWhhLT5vcGVyYXRpbmdfbW9kZSA9IFAyUDsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX0Y7CkBAIC0xNDU0LDcgKzE1MjIsNyBAQAogCWRlZmF1bHQ6CiAJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIHVua25vd24gdG9wb2xvZ3kgJXguICIKIAkJICAgICJVc2luZyBOTC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgdG9wbykpOworCQkgICAgdmhhLT5ob3N0X25vLCB0b3BvKSk7CiAJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OTDsKIAkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihMb29wKSIpOwogCQlicmVhazsKQEAgLTE0NjIsMjkgKzE1MzAsMzEgQEAKIAogCS8qIFNhdmUgSG9zdCBwb3J0IGFuZCBsb29wIElELiAqLwogCS8qIGJ5dGUgb3JkZXIgLSBCaWcgRW5kaWFuICovCi0JaGEtPmRfaWQuYi5kb21haW4gPSBkb21haW47Ci0JaGEtPmRfaWQuYi5hcmVhID0gYXJlYTsKLQloYS0+ZF9pZC5iLmFsX3BhID0gYWxfcGE7CisJdmhhLT5kX2lkLmIuZG9tYWluID0gZG9tYWluOworCXZoYS0+ZF9pZC5iLmFyZWEgPSBhcmVhOworCXZoYS0+ZF9pZC5iLmFsX3BhID0gYWxfcGE7CiAKLQlpZiAoIWhhLT5mbGFncy5pbml0X2RvbmUpCisJaWYgKCF2aGEtPmZsYWdzLmluaXRfZG9uZSkKICAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgICJUb3BvbG9neSAtICVzLCBIb3N0IExvb3AgYWRkcmVzcyAweCV4XG4iLAotIAkJICAgIGNvbm5lY3RfdHlwZSwgaGEtPmxvb3BfaWQpOworCQkgICAgY29ubmVjdF90eXBlLCB2aGEtPmxvb3BfaWQpOwogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEZBSUxFRC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGQUlMRUQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAl9IGVsc2UgewotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4ocnZhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMngwMF9zZXRfbW9kZWxfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICptb2RlbCwgc2l6ZV90IGxlbiwgY2hhciAqZGVmKQorcWxhMngwMF9zZXRfbW9kZWxfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDhfdCAqbW9kZWwsIHNpemVfdCBsZW4sCisJY2hhciAqZGVmKQogewogCWNoYXIgKnN0LCAqZW47CiAJdWludDE2X3QgaW5kZXg7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAobWVtY21wKG1vZGVsLCBCSU5aRVJPLCBsZW4pICE9IDApIHsKIAkJc3RybmNweShoYS0+bW9kZWxfbnVtYmVyLCBtb2RlbCwgbGVuKTsKQEAgLTE1MTYsMTYgKzE1ODYsMTcgQEAKIAkJfQogCX0KIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKLQkJcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKGhhLCAiXHg4MiIsIGhhLT5tb2RlbF9kZXNjLAorCQlxbGEyeHh4X2dldF92cGRfZmllbGQodmhhLCAiXHg4MiIsIGhhLT5tb2RlbF9kZXNjLAogCQkgICAgc2l6ZW9mKGhhLT5tb2RlbF9kZXNjKSk7CiB9CiAKIC8qIE9uIHNwYXJjIHN5c3RlbXMsIG9idGFpbiBwb3J0IGFuZCBub2RlIFdXTiBmcm9tIGZpcm13YXJlCiAgKiBwcm9wZXJ0aWVzLgogICovCi1zdGF0aWMgdm9pZCBxbGEyeHh4X252cmFtX3d3bl9mcm9tX29mdyhzY3NpX3FsYV9ob3N0X3QgKmhhLCBudnJhbV90ICpudikKK3N0YXRpYyB2b2lkIHFsYTJ4eHhfbnZyYW1fd3duX2Zyb21fb2Z3KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBudnJhbV90ICpudikKIHsKICNpZmRlZiBDT05GSUdfU1BBUkMKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGhhLT5wZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CiAJY29uc3QgdTggKnZhbDsKQEAgLTE1NTUsMTIgKzE2MjYsMTMgQEAKICogICAgICAwID0gc3VjY2Vzcy4KICovCiBpbnQKLXFsYTJ4MDBfbnZyYW1fY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX252cmFtX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgICAgICAgICAgICAgcnZhbDsKIAl1aW50OF90ICAgICAgICAgY2hrc3VtID0gMDsKIAl1aW50MTZfdCAgICAgICAgY250OwogCXVpbnQ4X3QgICAgICAgICAqZHB0cjEsICpkcHRyMjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbml0X2NiX3QgICAgICAgKmljYiA9IGhhLT5pbml0X2NiOwogCW52cmFtX3QgICAgICAgICAqbnYgPSBoYS0+bnZyYW07CiAJdWludDhfdCAgICAgICAgICpwdHIgPSBoYS0+bnZyYW07CkBAIC0xNTc2LDExICsxNjQ4LDExIEBACiAJCQloYS0+bnZyYW1fYmFzZSA9IDB4ODA7CiAKIAkvKiBHZXQgTlZSQU0gZGF0YSBhbmQgY2FsY3VsYXRlIGNoZWNrc3VtLiAqLwotCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKGhhLCBwdHIsIGhhLT5udnJhbV9iYXNlLCBoYS0+bnZyYW1fc2l6ZSk7CisJaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0odmhhLCBwdHIsIGhhLT5udnJhbV9iYXNlLCBoYS0+bnZyYW1fc2l6ZSk7CiAJZm9yIChjbnQgPSAwLCBjaGtzdW0gPSAwOyBjbnQgPCBoYS0+bnZyYW1fc2l6ZTsgY250KyspCiAJCWNoa3N1bSArPSAqcHRyKys7CiAKLQlERUJVRzUocHJpbnRrKCJzY3NpKCVsZCk6IENvbnRlbnRzIG9mIE5WUkFNXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIHZoYS0+aG9zdF9ubykpOwogCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKSk7CiAKIAkvKiBCYWQgTlZSQU0gZGF0YSwgc2V0IGRlZmF1bHRzIHBhcmFtZXRlcnMuICovCkBAIC0xNTk0LDcgKzE2NjYsNyBAQAogCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKIAogCQlpZiAoY2hrc3VtKQotCQkJcWxhMnh4eF9od19ldmVudF9sb2coaGEsIEhXX0VWRU5UX05WUkFNX0NIS1NVTV9FUlIsIDAsCisJCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyh2aGEsIEhXX0VWRU5UX05WUkFNX0NIS1NVTV9FUlIsIDAsCiAJCQkgICAgTVNXKGNoa3N1bSksIExTVyhjaGtzdW0pKTsKIAogCQkvKgpAQCAtMTYzMSw3ICsxNzAzLDcgQEAKIAkJbnYtPnBvcnRfbmFtZVszXSA9IDIyNDsKIAkJbnYtPnBvcnRfbmFtZVs0XSA9IDEzOTsKIAotCQlxbGEyeHh4X252cmFtX3d3bl9mcm9tX29mdyhoYSwgbnYpOworCQlxbGEyeHh4X252cmFtX3d3bl9mcm9tX29mdyh2aGEsIG52KTsKIAogCQludi0+bG9naW5fdGltZW91dCA9IDQ7CiAKQEAgLTE2ODQsNyArMTc1Niw3IEBACiAJCQkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyMzAwIik7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlxbGEyeDAwX3NldF9tb2RlbF9pbmZvKGhhLCBudi0+bW9kZWxfbnVtYmVyLAorCQkJcWxhMngwMF9zZXRfbW9kZWxfaW5mbyh2aGEsIG52LT5tb2RlbF9udW1iZXIsCiAJCQkgICAgc2l6ZW9mKG52LT5tb2RlbF9udW1iZXIpLCAiUUxBMjN4eCIpOwogCQl9CiAJfSBlbHNlIGlmIChJU19RTEEyMjAwKGhhKSkgewpAQCAtMTc2MCw4ICsxODMyLDggQEAKIAloYS0+c2VyaWFsMCA9IGljYi0+cG9ydF9uYW1lWzVdOwogCWhhLT5zZXJpYWwxID0gaWNiLT5wb3J0X25hbWVbNl07CiAJaGEtPnNlcmlhbDIgPSBpY2ItPnBvcnRfbmFtZVs3XTsKLQloYS0+bm9kZV9uYW1lID0gaWNiLT5ub2RlX25hbWU7Ci0JaGEtPnBvcnRfbmFtZSA9IGljYi0+cG9ydF9uYW1lOworCW1lbWNweSh2aGEtPm5vZGVfbmFtZSwgaWNiLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwltZW1jcHkodmhhLT5wb3J0X25hbWUsIGljYi0+cG9ydF9uYW1lLCBXV05fU0laRSk7CiAKIAlpY2ItPmV4ZWN1dGlvbl90aHJvdHRsZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhGRkZGKTsKIApAQCAtMTgyOSwxMCArMTkwMSwxMCBAQAogCQlpY2ItPnJlc3BvbnNlX2FjY3VtdWxhdGlvbl90aW1lciA9IDM7CiAJCWljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyID0gNTsKIAotCQloYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CisJCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CiAJfSBlbHNlIHsKIAkJLyogRW5hYmxlIFpJTy4gKi8KLQkJaWYgKCFoYS0+ZmxhZ3MuaW5pdF9kb25lKSB7CisJCWlmICghdmhhLT5mbGFncy5pbml0X2RvbmUpIHsKIAkJCWhhLT56aW9fbW9kZSA9IGljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJgogCQkJICAgIChCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7CiAJCQloYS0+emlvX3RpbWVyID0gaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPwpAQCAtMTg0MCwxMiArMTkxMiwxMiBAQAogCQl9CiAJCWljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJj0KIAkJICAgIH4oQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOwotCQloYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDA7CisJCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDA7CiAJCWlmIChoYS0+emlvX21vZGUgIT0gUUxBX1pJT19ESVNBQkxFRCkgewogCQkJaGEtPnppb19tb2RlID0gUUxBX1pJT19NT0RFXzY7CiAKIAkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgIgotCQkJICAgICJkZWxheSAoJWQgdXMpLlxuIiwgaGEtPmhvc3Rfbm8sIGhhLT56aW9fbW9kZSwKKwkJCSAgICAiZGVsYXkgKCVkIHVzKS5cbiIsIHZoYS0+aG9zdF9ubywgaGEtPnppb19tb2RlLAogCQkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKIAkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJCSAgICAiWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgKCVkIHVzKS5cbiIsCkBAIC0xODUzLDEzICsxOTI1LDEzIEBACiAKIAkJCWljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gfD0gKHVpbnQ4X3QpaGEtPnppb19tb2RlOwogCQkJaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPSAodWludDhfdCloYS0+emlvX3RpbWVyOwotCQkJaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAxOworCQkJdmhhLT5mbGFncy5wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlID0gMTsKIAkJfQogCX0KIAogCWlmIChydmFsKSB7CiAJCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgdmhhLT5ob3N0X25vKSk7CiAJfQogCXJldHVybiAocnZhbCk7CiB9CkBAIC0xODcwLDEwICsxOTQyLDEwIEBACiAJZmNfcG9ydF90ICpmY3BvcnQgPSBkYXRhOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CiAKLQlzcGluX2xvY2tfaXJxKGZjcG9ydC0+aGEtPmhvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycShmY3BvcnQtPnZoYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAlycG9ydCA9IGZjcG9ydC0+ZHJwb3J0OwogCWZjcG9ydC0+ZHJwb3J0ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoZmNwb3J0LT5oYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoZmNwb3J0LT52aGEtPmhvc3QtPmhvc3RfbG9jayk7CiAJaWYgKHJwb3J0KQogCQlmY19yZW1vdGVfcG9ydF9kZWxldGUocnBvcnQpOwogfQpAQCAtMTg4Niw3ICsxOTU4LDcgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgZmNwb3J0LCBvciBOVUxMLCBpZiBub25lIGF2YWlsYWJsZS4KICAqLwogc3RhdGljIGZjX3BvcnRfdCAqCi1xbGEyeDAwX2FsbG9jX2ZjcG9ydChzY3NpX3FsYV9ob3N0X3QgKmhhLCBnZnBfdCBmbGFncykKK3FsYTJ4MDBfYWxsb2NfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBnZnBfdCBmbGFncykKIHsKIAlmY19wb3J0X3QgKmZjcG9ydDsKIApAQCAtMTg5NSw4ICsxOTY3LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBTZXR1cCBmY3BvcnQgdGVtcGxhdGUgc3RydWN0dXJlLiAqLwotCWZjcG9ydC0+aGEgPSBoYTsKLQlmY3BvcnQtPnZwX2lkeCA9IGhhLT52cF9pZHg7CisJZmNwb3J0LT52aGEgPSB2aGE7CisJZmNwb3J0LT52cF9pZHggPSB2aGEtPnZwX2lkeDsKIAlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9VTktOT1dOOwogCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CiAJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX1VOQ09ORklHVVJFRCk7CkBAIC0xOTE5LDEwMSArMTk5MSw5NyBAQAogICogICAgICAyID0gZGF0YWJhc2Ugd2FzIGZ1bGwgYW5kIGRldmljZSB3YXMgbm90IGNvbmZpZ3VyZWQuCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfY29uZmlndXJlX2xvb3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfY29uZmlndXJlX2xvb3Aoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50ICBydmFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHNhdmVfZmxhZ3M7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKIAkvKiBHZXQgSW5pdGlhdG9yIElEICovCi0JaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncykpIHsKLQkJcnZhbCA9IHFsYTJ4MDBfY29uZmlndXJlX2hiYShoYSk7CisJaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9oYmEodmhhKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gY29uZmlndXJlIEhCQS5cbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJCXJldHVybiAocnZhbCk7CiAJCX0KIAl9CiAKLQlzYXZlX2ZsYWdzID0gZmxhZ3MgPSBoYS0+ZHBjX2ZsYWdzOworCXNhdmVfZmxhZ3MgPSBmbGFncyA9IHZoYS0+ZHBjX2ZsYWdzOwogCURFQlVHKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgbG9vcCAtLSBkcGMgZmxhZ3MgPTB4JWx4XG4iLAotCSAgICBoYS0+aG9zdF9ubywgZmxhZ3MpKTsKKwkgICAgdmhhLT5ob3N0X25vLCBmbGFncykpOwogCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIGJvdGggYW4gUlNDTiBhbmQgUE9SVCBVUERBVEUgcGVuZGluZyB0aGVuIGhhbmRsZSB0aGVtCiAJICogYm90aCBhdCB0aGUgc2FtZSB0aW1lLgogCSAqLwotCWNsZWFyX2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOwotCWNsZWFyX2JpdChSU0NOX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCWNsZWFyX2JpdChMT0NBTF9MT09QX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwljbGVhcl9iaXQoUlNDTl9VUERBVEUsICZ2aGEtPmRwY19mbGFncyk7CiAKIAkvKiBEZXRlcm1pbmUgd2hhdCB3ZSBuZWVkIHRvIGRvICovCiAJaWYgKGhhLT5jdXJyZW50X3RvcG9sb2d5ID09IElTUF9DRkdfRkwgJiYKIAkgICAgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmZmxhZ3MpKSkgewogCi0JCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKwkJdmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKIAkJc2V0X2JpdChSU0NOX1VQREFURSwgJmZsYWdzKTsKIAogCX0gZWxzZSBpZiAoaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0gSVNQX0NGR19GICYmCiAJICAgICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKSkpIHsKIAotCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisJCXZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CiAJCXNldF9iaXQoUlNDTl9VUERBVEUsICZmbGFncyk7CiAJCWNsZWFyX2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKTsKIAogCX0gZWxzZSBpZiAoaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0gSVNQX0NGR19OKSB7CiAJCWNsZWFyX2JpdChSU0NOX1VQREFURSwgJmZsYWdzKTsKIAotCX0gZWxzZSBpZiAoIWhhLT5mbGFncy5vbmxpbmUgfHwKKwl9IGVsc2UgaWYgKCF2aGEtPmZsYWdzLm9ubGluZSB8fAogCSAgICAodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmZsYWdzKSkpIHsKIAotCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisJCXZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CiAJCXNldF9iaXQoUlNDTl9VUERBVEUsICZmbGFncyk7CiAJCXNldF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZmbGFncyk7CiAJfQogCiAJaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmZmxhZ3MpKSB7Ci0JCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKQogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JCX0gZWxzZSB7Ci0JCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcChoYSk7Ci0JCX0KKwkJZWxzZQorCQkJcnZhbCA9IHFsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3AodmhhKTsKIAl9CiAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyAmJiB0ZXN0X2JpdChSU0NOX1VQREFURSwgJmZsYWdzKSkgewotCQlpZiAoTE9PUF9UUkFOU0lUSU9OKGhhKSkgeworCQlpZiAoTE9PUF9UUkFOU0lUSU9OKHZoYSkpCiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQkJfSBlbHNlIHsKLQkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMoaGEpOwotCQl9CisJCWVsc2UKKwkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWModmhhKTsKIAl9CiAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewotCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8Ci0JCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKLQkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1JFQURZKTsKKwkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9SRUFEWSk7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMT09QIFJFQURZXG4iLCBoYS0+aG9zdF9ubykpOworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExPT1AgUkVBRFlcbiIsIHZoYS0+aG9zdF9ubykpOwogCQl9CiAJfQogCiAJaWYgKHJ2YWwpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiAqKiogRkFJTEVEICoqKlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0gZWxzZSB7CiAJCURFQlVHMyhwcmludGsoIiVzOiBleGl0aW5nIG5vcm1hbGx5XG4iLCBfX2Z1bmNfXykpOwogCX0KIAogCS8qIFJlc3RvcmUgc3RhdGUgaWYgYSByZXN5bmMgZXZlbnQgb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcgKi8KLQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnNhdmVfZmxhZ3MpKQotCQkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOwotCQlpZiAodGVzdF9iaXQoUlNDTl9VUERBVEUsICZzYXZlX2ZsYWdzKSkgewotCQkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAxOwotCQkJc2V0X2JpdChSU0NOX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOwotCQl9CisJCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpOworCQlpZiAodGVzdF9iaXQoUlNDTl9VUERBVEUsICZzYXZlX2ZsYWdzKSkKKwkJCXNldF9iaXQoUlNDTl9VUERBVEUsICZ2aGEtPmRwY19mbGFncyk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTIwMzIsNyArMjEwMCw3IEBACiAgKgkwID0gc3VjY2Vzcy4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQJCXJ2YWwsIHJ2YWwyOwogCWludAkJZm91bmRfZGV2czsKQEAgLTIwNDQsMTggKzIxMTIsMTggQEAKIAljaGFyCQkqaWRfaXRlcjsKIAl1aW50MTZfdAlsb29wX2lkOwogCXVpbnQ4X3QJCWRvbWFpbiwgYXJlYSwgYWxfcGE7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWZvdW5kX2RldnMgPSAwOwogCW5ld19mY3BvcnQgPSBOVUxMOwogCWVudHJpZXMgPSBNQVhfRklCUkVfREVWSUNFUzsKIAotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogR2V0dGluZyBGQ0FMIHBvc2l0aW9uIG1hcFxuIiwgaGEtPmhvc3Rfbm8pKTsKLQlERUJVRzMocWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAoaGEsIE5VTEwpKTsKKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEdldHRpbmcgRkNBTCBwb3NpdGlvbiBtYXBcbiIsIHZoYS0+aG9zdF9ubykpOworCURFQlVHMyhxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcCh2aGEsIE5VTEwpKTsKIAogCS8qIEdldCBsaXN0IG9mIGxvZ2dlZCBpbiBkZXZpY2VzLiAqLwogCW1lbXNldChoYS0+Z2lkX2xpc3QsIDAsIEdJRF9MSVNUX1NJWkUpOwotCXJ2YWwgPSBxbGEyeDAwX2dldF9pZF9saXN0KGhhLCBoYS0+Z2lkX2xpc3QsIGhhLT5naWRfbGlzdF9kbWEsCisJcnZhbCA9IHFsYTJ4MDBfZ2V0X2lkX2xpc3QodmhhLCBoYS0+Z2lkX2xpc3QsIGhhLT5naWRfbGlzdF9kbWEsCiAJICAgICZlbnRyaWVzKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CkBAIC0yMDY2LDcgKzIxMzQsNyBAQAogCSAgICBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBnaWRfbGlzdF9pbmZvKSkpOwogCiAJLyogQWxsb2NhdGUgdGVtcG9yYXJ5IGZjcG9ydCBmb3IgYW55IG5ldyBmY3BvcnRzIGRpc2NvdmVyZWQuICovCi0JbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CiAJCXJ2YWwgPSBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CkBAIC0yMDc2LDE3ICsyMTQ0LDE0IEBACiAJLyoKIAkgKiBNYXJrIGxvY2FsIGRldmljZXMgdGhhdCB3ZXJlIHByZXNlbnQgd2l0aCBGQ0ZfREVWSUNFX0xPU1QgZm9yIG5vdy4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnBoYS0+ZmNwb3J0cywgbGlzdCkgewotCQlpZiAoZmNwb3J0LT52cF9pZHggIT0gaGEtPnZwX2lkeCkKLQkJCWNvbnRpbnVlOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZ2aGEtPnZwX2ZjcG9ydHMsIGxpc3QpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfT05MSU5FICYmCiAJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfQlJPQURDQVNUICYmCiAJCSAgICAoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSA9PSAwKSB7CiAKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBNYXJraW5nIHBvcnQgbG9zdCwgIgogCQkJICAgICJsb29wX2lkPTB4JTA0eFxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkKSk7CisJCQkgICAgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQpKTsKIAogCQkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKIAkJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9GQVJQX0RPTkU7CkBAIC0yMTEzLDcgKzIxNzgsNyBAQAogCiAJCS8qIEJ5cGFzcyBpZiBub3Qgc2FtZSBkb21haW4gYW5kIGFyZWEgb2YgYWRhcHRlci4gKi8KIAkJaWYgKGFyZWEgJiYgZG9tYWluICYmCi0JCSAgICAoYXJlYSAhPSBoYS0+ZF9pZC5iLmFyZWEgfHwgZG9tYWluICE9IGhhLT5kX2lkLmIuZG9tYWluKSkKKwkJICAgIChhcmVhICE9IHZoYS0+ZF9pZC5iLmFyZWEgfHwgZG9tYWluICE9IHZoYS0+ZF9pZC5iLmRvbWFpbikpCiAJCQljb250aW51ZTsKIAogCQkvKiBCeXBhc3MgaW52YWxpZCBsb2NhbCBsb29wIElELiAqLwpAQCAtMjEyNSwyNiArMjE5MCwyMyBAQAogCQluZXdfZmNwb3J0LT5kX2lkLmIuYXJlYSA9IGFyZWE7CiAJCW5ld19mY3BvcnQtPmRfaWQuYi5hbF9wYSA9IGFsX3BhOwogCQluZXdfZmNwb3J0LT5sb29wX2lkID0gbG9vcF9pZDsKLQkJbmV3X2ZjcG9ydC0+dnBfaWR4ID0gaGEtPnZwX2lkeDsKLQkJcnZhbDIgPSBxbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlKGhhLCBuZXdfZmNwb3J0LCAwKTsKKwkJbmV3X2ZjcG9ydC0+dnBfaWR4ID0gdmhhLT52cF9pZHg7CisJCXJ2YWwyID0gcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZSh2aGEsIG5ld19mY3BvcnQsIDApOwogCQlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIHJldHJpZXZlIGZjcG9ydCAiCiAJCQkgICAgImluZm9ybWF0aW9uIC0tIGdldF9wb3J0X2RhdGFiYXNlPSV4LCAiCiAJCQkgICAgImxvb3BfaWQ9MHglMDR4XG4iLAotCQkJICAgIGhhLT5ob3N0X25vLCBydmFsMiwgbmV3X2ZjcG9ydC0+bG9vcF9pZCkpOworCQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbDIsIG5ld19mY3BvcnQtPmxvb3BfaWQpKTsKIAkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogU2NoZWR1bGluZyByZXN5bmMuLi5cbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8pKTsKLQkJCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIG1hdGNoaW5nIGRldmljZSBpbiBwb3J0IGxpc3QuICovCiAJCWZvdW5kID0gMDsKIAkJZmNwb3J0ID0gTlVMTDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZwaGEtPmZjcG9ydHMsIGxpc3QpIHsKLQkJCWlmIChmY3BvcnQtPnZwX2lkeCAhPSBoYS0+dnBfaWR4KQotCQkJCWNvbnRpbnVlOwotCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CiAJCQlpZiAobWVtY21wKG5ld19mY3BvcnQtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsCiAJCQkgICAgV1dOX1NJWkUpKQogCQkJCWNvbnRpbnVlOwpAQCAtMjE2NCwxNyArMjIyNiwxNSBAQAogCQlpZiAoIWZvdW5kKSB7CiAJCQkvKiBOZXcgZGV2aWNlLCBhZGQgdG8gZmNwb3J0cyBsaXN0LiAqLwogCQkJbmV3X2ZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9QRVJTSVNURU5UX0JPVU5EOwotCQkJaWYgKGhhLT5wYXJlbnQpIHsKLQkJCQluZXdfZmNwb3J0LT5oYSA9IGhhOwotCQkJCW5ld19mY3BvcnQtPnZwX2lkeCA9IGhhLT52cF9pZHg7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmbmV3X2ZjcG9ydC0+dnBfZmNwb3J0LAotCQkJCSAgICAmaGEtPnZwX2ZjcG9ydHMpOworCQkJaWYgKHZoYS0+dnBfaWR4KSB7CisJCQkJbmV3X2ZjcG9ydC0+dmhhID0gdmhhOworCQkJCW5ld19mY3BvcnQtPnZwX2lkeCA9IHZoYS0+dnBfaWR4OwogCQkJfQotCQkJbGlzdF9hZGRfdGFpbCgmbmV3X2ZjcG9ydC0+bGlzdCwgJnBoYS0+ZmNwb3J0cyk7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfZmNwb3J0LT5saXN0LCAmdmhhLT52cF9mY3BvcnRzKTsKIAogCQkJLyogQWxsb2NhdGUgYSBuZXcgcmVwbGFjZW1lbnQgZmNwb3J0LiAqLwogCQkJZmNwb3J0ID0gbmV3X2ZjcG9ydDsKLQkJCW5ld19mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX2ZjcG9ydChoYSwgR0ZQX0tFUk5FTCk7CisJCQluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKIAkJCQlydmFsID0gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJCQkJZ290byBjbGVhbnVwX2FsbG9jYXRpb247CkBAIC0yMTg1LDcgKzIyNDUsNyBAQAogCQkvKiBCYXNlIGlJRE1BIHNldHRpbmdzIG9uIEhCQSBwb3J0IHNwZWVkLiAqLwogCQlmY3BvcnQtPmZwX3NwZWVkID0gaGEtPmxpbmtfZGF0YV9yYXRlOwogCi0JCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydChoYSwgZmNwb3J0KTsKKwkJcWxhMngwMF91cGRhdGVfZmNwb3J0KHZoYSwgZmNwb3J0KTsKIAogCQlmb3VuZF9kZXZzKys7CiAJfQpAQCAtMjE5NSwyNCArMjI1NSwyNSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgbG9jYWwgbG9vcCBlcnJvciBleGl0OiAiCi0JCSAgICAicnZhbD0leFxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgICJydmFsPSV4XG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9CiAKIAlpZiAoZm91bmRfZGV2cykgewotCQloYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfTE9DQUxfREVWSUNFUzsKLQkJaGEtPmRldmljZV9mbGFncyAmPSB+REZMR19SRVRSWV9MT0NBTF9ERVZJQ0VTOworCQl2aGEtPmRldmljZV9mbGFncyB8PSBERkxHX0xPQ0FMX0RFVklDRVM7CisJCXZoYS0+ZGV2aWNlX2ZsYWdzICY9IH5ERkxHX1JFVFJZX0xPQ0FMX0RFVklDRVM7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLXFsYTJ4MDBfaWlkbWFfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQorcWxhMngwMF9paWRtYV9mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0KQogewogI2RlZmluZSBMU19VTktOT1dOICAgICAgMgogCXN0YXRpYyBjaGFyICpsaW5rX3NwZWVkc1s1XSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIgfTsKIAlpbnQgcnZhbDsKIAl1aW50MTZfdCBtYls2XTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmICghSVNfSUlETUFfQ0FQQUJMRShoYSkpCiAJCXJldHVybjsKQEAgLTIyMjEsMTIgKzIyODIsMTIgQEAKIAkgICAgZmNwb3J0LT5mcF9zcGVlZCA+IGhhLT5saW5rX2RhdGFfcmF0ZSkKIAkJcmV0dXJuOwogCi0JcnZhbCA9IHFsYTJ4MDBfc2V0X2lkbWFfc3BlZWQoaGEsIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5mcF9zcGVlZCwKKwlydmFsID0gcWxhMngwMF9zZXRfaWRtYV9zcGVlZCh2aGEsIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5mcF9zcGVlZCwKIAkgICAgbWIpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGFkanVzdCBpSURNQSAiCiAJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggLS0gJTA0eCAleCAlMDR4ICUwNHguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+cG9ydF9uYW1lWzBdLCBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJICAgIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLCBydmFsLApAQCAtMjI0NCwxMCArMjMwNSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotcWxhMngwMF9yZWdfcmVtb3RlX3BvcnQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCitxbGEyeDAwX3JlZ19yZW1vdGVfcG9ydChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgZmNfcG9ydF90ICpmY3BvcnQpCiB7CiAJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIHJwb3J0X2lkczsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKGZjcG9ydC0+ZHJwb3J0KQogCQlxbGEyeDAwX3Jwb3J0X2RlbChmY3BvcnQpOwpAQCAtMjI1NywxNSArMjMxOSwxNSBAQAogCXJwb3J0X2lkcy5wb3J0X2lkID0gZmNwb3J0LT5kX2lkLmIuZG9tYWluIDw8IDE2IHwKIAkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSA8PCA4IHwgZmNwb3J0LT5kX2lkLmIuYWxfcGE7CiAJcnBvcnRfaWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOwotCWZjcG9ydC0+cnBvcnQgPSBycG9ydCA9IGZjX3JlbW90ZV9wb3J0X2FkZChoYS0+aG9zdCwgMCwgJnJwb3J0X2lkcyk7CisJZmNwb3J0LT5ycG9ydCA9IHJwb3J0ID0gZmNfcmVtb3RlX3BvcnRfYWRkKHZoYS0+aG9zdCwgMCwgJnJwb3J0X2lkcyk7CiAJaWYgKCFycG9ydCkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGZjIHJlbW90ZSBwb3J0IVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jc3Bpbl9sb2NrX2lycShmY3BvcnQtPmhhLT5ob3N0LT5ob3N0X2xvY2spOworCXNwaW5fbG9ja19pcnEoZmNwb3J0LT52aGEtPmhvc3QtPmhvc3RfbG9jayk7CiAJKigoZmNfcG9ydF90ICoqKXJwb3J0LT5kZF9kYXRhKSA9IGZjcG9ydDsKLQlzcGluX3VubG9ja19pcnEoZmNwb3J0LT5oYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoZmNwb3J0LT52aGEtPmhvc3QtPmhvc3RfbG9jayk7CiAKIAlycG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgPSBmY3BvcnQtPnN1cHBvcnRlZF9jbGFzc2VzOwogCkBAIC0yMjkzLDIzICsyMzU1LDIzIEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogdm9pZAotcWxhMngwMF91cGRhdGVfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQorcWxhMngwMF91cGRhdGVfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JZmNwb3J0LT5oYSA9IGhhOworCWZjcG9ydC0+dmhhID0gdmhhOwogCWZjcG9ydC0+bG9naW5fcmV0cnkgPSAwOwotCWZjcG9ydC0+cG9ydF9sb2dpbl9yZXRyeV9jb3VudCA9IHBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICoKKwlmY3BvcnQtPnBvcnRfbG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICoKIAkgICAgUE9SVF9SRVRSWV9USU1FOwotCWF0b21pY19zZXQoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyLCBwaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCAqCisJYXRvbWljX3NldCgmZmNwb3J0LT5wb3J0X2Rvd25fdGltZXIsIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKgogCSAgICBQT1JUX1JFVFJZX1RJTUUpOwogCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9MT0dJTl9ORUVERUQ7CiAKLQlxbGEyeDAwX2lpZG1hX2ZjcG9ydChoYSwgZmNwb3J0KTsKKwlxbGEyeDAwX2lpZG1hX2ZjcG9ydCh2aGEsIGZjcG9ydCk7CiAKIAlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKIAotCXFsYTJ4MDBfcmVnX3JlbW90ZV9wb3J0KGhhLCBmY3BvcnQpOworCXFsYTJ4MDBfcmVnX3JlbW90ZV9wb3J0KHZoYSwgZmNwb3J0KTsKIH0KIAogLyoKQEAgLTIzMjQsNyArMjM4Niw3IEBACiAgKiAgICAgIEJJVF8wID0gZXJyb3IKICAqLwogc3RhdGljIGludAotcWxhMngwMF9jb25maWd1cmVfZmFicmljKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50CXJ2YWwsIHJ2YWwyOwogCWZjX3BvcnRfdAkqZmNwb3J0LCAqZmNwdGVtcDsKQEAgLTIzMzIsMjUgKzIzOTQsMjYgQEAKIAl1aW50MTZfdAltYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKIAl1aW50MTZfdAlsb29wX2lkOwogCUxJU1RfSEVBRChuZXdfZmNwb3J0cyk7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJLyogSWYgRkwgcG9ydCBleGlzdHMsIHRoZW4gU05TIGlzIHByZXNlbnQgKi8KIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJbG9vcF9pZCA9IE5QSF9GX1BPUlQ7CiAJZWxzZQogCQlsb29wX2lkID0gU05TX0ZMX1BPUlQ7Ci0JcnZhbCA9IHFsYTJ4MDBfZ2V0X3BvcnRfbmFtZShoYSwgbG9vcF9pZCwgaGEtPmZhYnJpY19ub2RlX25hbWUsIDEpOworCXJ2YWwgPSBxbGEyeDAwX2dldF9wb3J0X25hbWUodmhhLCBsb29wX2lkLCB2aGEtPmZhYnJpY19ub2RlX25hbWUsIDEpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTUJDX0dFVF9QT1JUX05BTUUgRmFpbGVkLCBObyBGTCAiCi0JCSAgICAiUG9ydFxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJQb3J0XG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAotCQloYS0+ZGV2aWNlX2ZsYWdzICY9IH5TV0lUQ0hfRk9VTkQ7CisJCXZoYS0+ZGV2aWNlX2ZsYWdzICY9IH5TV0lUQ0hfRk9VTkQ7CiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCX0KLQloYS0+ZGV2aWNlX2ZsYWdzIHw9IFNXSVRDSF9GT1VORDsKKwl2aGEtPmRldmljZV9mbGFncyB8PSBTV0lUQ0hfRk9VTkQ7CiAKIAkvKiBNYXJrIGRldmljZXMgdGhhdCBuZWVkIHJlLXN5bmNocm9uaXphdGlvbi4gKi8KLQlydmFsMiA9IHFsYTJ4MDBfZGV2aWNlX3Jlc3luYyhoYSk7CisJcnZhbDIgPSBxbGEyeDAwX2RldmljZV9yZXN5bmModmhhKTsKIAlpZiAocnZhbDIgPT0gUUxBX1JTQ05TX0hBTkRMRUQpIHsKIAkJLyogTm8gcG9pbnQgZG9pbmcgdGhlIHNjYW4sIGp1c3QgY29udGludWUuICovCiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwpAQCAtMjM1OCwxNSArMjQyMSwxNSBAQAogCWRvIHsKIAkJLyogRkRNSSBzdXBwb3J0LiAqLwogCQlpZiAocWwyeGZkbWllbmFibGUgJiYKLQkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQotCQkJcWxhMngwMF9mZG1pX3JlZ2lzdGVyKGhhKTsKKwkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKKwkJCXFsYTJ4MDBfZmRtaV9yZWdpc3Rlcih2aGEpOwogCiAJCS8qIEVuc3VyZSB3ZSBhcmUgbG9nZ2VkIGludG8gdGhlIFNOUy4gKi8KIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCQlsb29wX2lkID0gTlBIX1NOUzsKIAkJZWxzZQogCQkJbG9vcF9pZCA9IFNJTVBMRV9OQU1FX1NFUlZFUjsKLQkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dpbihoYSwgbG9vcF9pZCwgMHhmZiwgMHhmZiwKKwkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dpbih2aGEsIGxvb3BfaWQsIDB4ZmYsIDB4ZmYsCiAJCSAgICAweGZjLCBtYiwgQklUXzEgfCBCSVRfMCk7CiAJCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewogCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKQEAgLTIzNzYsMjkgKzI0MzksMjkgQEAKIAkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCQl9CiAKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKLQkJCWlmIChxbGEyeDAwX3JmdF9pZChoYSkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlpZiAocWxhMngwMF9yZnRfaWQodmhhKSkgewogCQkJCS8qIEVNUFRZICovCiAJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBGQy00ICIKLQkJCQkgICAgIlRZUEUgZmFpbGVkLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCQkgICAgIlRZUEUgZmFpbGVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CiAJCQl9Ci0JCQlpZiAocWxhMngwMF9yZmZfaWQoaGEpKSB7CisJCQlpZiAocWxhMngwMF9yZmZfaWQodmhhKSkgewogCQkJCS8qIEVNUFRZICovCiAJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBGQy00ICIKLQkJCQkgICAgIkZlYXR1cmVzIGZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQkJICAgICJGZWF0dXJlcyBmYWlsZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAkJCX0KLQkJCWlmIChxbGEyeDAwX3Jubl9pZChoYSkpIHsKKwkJCWlmIChxbGEyeDAwX3Jubl9pZCh2aGEpKSB7CiAJCQkJLyogRU1QVFkgKi8KIAkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIE5vZGUgTmFtZSAiCi0JCQkJICAgICJmYWlsZWQuXG4iLCBoYS0+aG9zdF9ubykpOwotCQkJfSBlbHNlIGlmIChxbGEyeDAwX3Jzbm5fbm4oaGEpKSB7CisJCQkJICAgICJmYWlsZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCX0gZWxzZSBpZiAocWxhMngwMF9yc25uX25uKHZoYSkpIHsKIAkJCQkvKiBFTVBUWSAqLwogCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgU3ltYm9saWMgIgotCQkJCSAgICAiTm9kZSBOYW1lIGZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQkJICAgICJOb2RlIE5hbWUgZmFpbGVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CiAJCQl9CiAJCX0KIAotCQlydmFsID0gcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cyhoYSwgJm5ld19mY3BvcnRzKTsKKwkJcnZhbCA9IHFsYTJ4MDBfZmluZF9hbGxfZmFicmljX2RldnModmhhLCAmbmV3X2ZjcG9ydHMpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJCWJyZWFrOwogCkBAIC0yNDA2LDI0ICsyNDY5LDIxIEBACiAJCSAqIExvZ291dCBhbGwgcHJldmlvdXMgZmFicmljIGRldmljZXMgbWFya2VkIGxvc3QsIGV4Y2VwdAogCQkgKiB0YXBlIGRldmljZXMuCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnBoYS0+ZmNwb3J0cywgbGlzdCkgewotCQkJaWYgKGZjcG9ydC0+dnBfaWR4ICE9aGEtPnZwX2lkeCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKIAkJCQlicmVhazsKIAogCQkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpID09IDApCiAJCQkJY29udGludWU7CiAKIAkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9MT1NUKSB7Ci0JCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsCisJCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LAogCQkJCSAgICBxbDJ4cGxvZ2lhYnNlbnRkZXZpY2UsIDApOwogCQkJCWlmIChmY3BvcnQtPmxvb3BfaWQgIT0gRkNfTk9fTE9PUF9JRCAmJgogCQkJCSAgICAoZmNwb3J0LT5mbGFncyAmIEZDRl9UQVBFX1BSRVNFTlQpID09IDAgJiYKIAkJCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0lOSVRJQVRPUiAmJgogCQkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfQlJPQURDQVNUKSB7Ci0JCQkJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9nb3V0KGhhLAorCQkJCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dCh2aGEsCiAJCQkJCSAgICBmY3BvcnQtPmxvb3BfaWQsCiAJCQkJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sCiAJCQkJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLApAQCAtMjQzNCwxOCArMjQ5NCwxNSBAQAogCQl9CiAKIAkJLyogU3RhcnRpbmcgZnJlZSBsb29wIElELiAqLwotCQluZXh0X2xvb3BpZCA9IHBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKKwkJbmV4dF9sb29waWQgPSBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKIAogCQkvKgogCQkgKiBTY2FuIHRocm91Z2ggb3VyIHBvcnQgbGlzdCBhbmQgbG9naW4gZW50cmllcyB0aGF0IG5lZWQgdG8gYmUKIAkJICogbG9nZ2VkIGluLgogCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZwaGEtPmZjcG9ydHMsIGxpc3QpIHsKLQkJCWlmIChmY3BvcnQtPnZwX2lkeCAhPSBoYS0+dnBfaWR4KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8Ci0JCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkJICAgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKIAkJCQlicmVhazsKIAogCQkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpID09IDAgfHwKQEAgLTI0NTUsMTQgKzI1MTIsMTQgQEAKIAkJCWlmIChmY3BvcnQtPmxvb3BfaWQgPT0gRkNfTk9fTE9PUF9JRCkgewogCQkJCWZjcG9ydC0+bG9vcF9pZCA9IG5leHRfbG9vcGlkOwogCQkJCXJ2YWwgPSBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQoCi0JCQkJICAgIHRvX3FsYV9wYXJlbnQoaGEpLCBmY3BvcnQpOworCQkJCSAgICBiYXNlX3ZoYSwgZmNwb3J0KTsKIAkJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCQkvKiBSYW4gb3V0IG9mIElEcyB0byB1c2UgKi8KIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQkJLyogTG9naW4gYW5kIHVwZGF0ZSBkYXRhYmFzZSAqLwotCQkJcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKGhhLCBmY3BvcnQsICZuZXh0X2xvb3BpZCk7CisJCQlxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4odmhhLCBmY3BvcnQsICZuZXh0X2xvb3BpZCk7CiAJCX0KIAogCQkvKiBFeGl0IGlmIG91dCBvZiBsb29wIElEcy4gKi8KQEAgLTI0NzQsMzEgKzI1MzEsMjYgQEAKIAkJICogTG9naW4gYW5kIGFkZCB0aGUgbmV3IGRldmljZXMgdG8gb3VyIHBvcnQgbGlzdC4KIAkJICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY3BvcnQsIGZjcHRlbXAsICZuZXdfZmNwb3J0cywgbGlzdCkgewotCQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAotCQkJICAgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikgfHwKKwkJCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCiAJCQkJYnJlYWs7CiAKIAkJCS8qIEZpbmQgYSBuZXcgbG9vcCBJRCB0byB1c2UuICovCiAJCQlmY3BvcnQtPmxvb3BfaWQgPSBuZXh0X2xvb3BpZDsKLQkJCXJ2YWwgPSBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQodG9fcWxhX3BhcmVudChoYSksCi0JCQkgICAgZmNwb3J0KTsKKwkJCXJ2YWwgPSBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQoYmFzZV92aGEsIGZjcG9ydCk7CiAJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCS8qIFJhbiBvdXQgb2YgSURzIHRvIHVzZSAqLwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBMb2dpbiBhbmQgdXBkYXRlIGRhdGFiYXNlICovCi0JCQlxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4oaGEsIGZjcG9ydCwgJm5leHRfbG9vcGlkKTsKKwkJCXFsYTJ4MDBfZmFicmljX2Rldl9sb2dpbih2aGEsIGZjcG9ydCwgJm5leHRfbG9vcGlkKTsKIAotCQkJaWYgKGhhLT5wYXJlbnQpIHsKLQkJCQlmY3BvcnQtPmhhID0gaGE7Ci0JCQkJZmNwb3J0LT52cF9pZHggPSBoYS0+dnBfaWR4OwotCQkJCWxpc3RfYWRkX3RhaWwoJmZjcG9ydC0+dnBfZmNwb3J0LAotCQkJCSAgICAmaGEtPnZwX2ZjcG9ydHMpOwotCQkJCWxpc3RfbW92ZV90YWlsKCZmY3BvcnQtPmxpc3QsCi0JCQkJICAgICZoYS0+cGFyZW50LT5mY3BvcnRzKTsKLQkJCX0gZWxzZQotCQkJCWxpc3RfbW92ZV90YWlsKCZmY3BvcnQtPmxpc3QsICZoYS0+ZmNwb3J0cyk7CisJCQlpZiAodmhhLT52cF9pZHgpIHsKKwkJCQlmY3BvcnQtPnZoYSA9IHZoYTsKKwkJCQlmY3BvcnQtPnZwX2lkeCA9IHZoYS0+dnBfaWR4OworCQkJfQorCQkJbGlzdF9tb3ZlX3RhaWwoJmZjcG9ydC0+bGlzdCwgJnZoYS0+dnBfZmNwb3J0cyk7CiAJCX0KIAl9IHdoaWxlICgwKTsKIApAQCAtMjUxMCw3ICsyNTYyLDcgQEAKIAogCWlmIChydmFsKSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGZhYnJpYyBlcnJvciBleGl0OiAiCi0JCSAgICAicnZhbD0lZFxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgICJydmFsPSVkXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMjUzMSw3ICsyNTgzLDggQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2ZpbmRfYWxsX2ZhYnJpY19kZXZzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBsaXN0X2hlYWQgKm5ld19mY3BvcnRzKQorcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfZmNwb3J0cykKIHsKIAlpbnQJCXJ2YWw7CiAJdWludDE2X3QJbG9vcF9pZDsKQEAgLTI1NDIsMTEgKzI1OTUsOCBAQAogCWludAkJc3dsX2lkeDsKIAlpbnQJCWZpcnN0X2RldiwgbGFzdF9kZXY7CiAJcG9ydF9pZF90CXdyYXAsIG54dF9kX2lkOwotCWludCAJCXZwX2luZGV4OwotCWludAkJZW1wdHlfdnBfaW5kZXg7Ci0JaW50CQlmb3VuZF92cDsKLQlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2cCwgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIApAQCAtMjU1NSw0MyArMjYwNSw0MiBAQAogCWlmICghc3dsKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBhbGxvY2F0aW9ucyBmYWlsZWQsIGZhbGxiYWNrICIKLQkJICAgICJvbiBHQV9OWFRcbiIsIGhhLT5ob3N0X25vKSk7CisJCSAgICAib24gR0FfTlhUXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAl9IGVsc2UgewotCQlpZiAocWxhMngwMF9naWRfcHQoaGEsIHN3bCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJaWYgKHFsYTJ4MDBfZ2lkX3B0KHZoYSwgc3dsKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJa2ZyZWUoc3dsKTsKIAkJCXN3bCA9IE5VTEw7Ci0JCX0gZWxzZSBpZiAocWxhMngwMF9ncG5faWQoaGEsIHN3bCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJfSBlbHNlIGlmIChxbGEyeDAwX2dwbl9pZCh2aGEsIHN3bCkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCWtmcmVlKHN3bCk7CiAJCQlzd2wgPSBOVUxMOwotCQl9IGVsc2UgaWYgKHFsYTJ4MDBfZ25uX2lkKGhhLCBzd2wpICE9IFFMQV9TVUNDRVNTKSB7CisJCX0gZWxzZSBpZiAocWxhMngwMF9nbm5faWQodmhhLCBzd2wpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlrZnJlZShzd2wpOwogCQkJc3dsID0gTlVMTDsKIAkJfSBlbHNlIGlmIChxbDJ4aWlkbWFlbmFibGUgJiYKLQkJICAgIHFsYTJ4MDBfZ2Zwbl9pZChoYSwgc3dsKSA9PSBRTEFfU1VDQ0VTUykgewotCQkJcWxhMngwMF9ncHNjKGhhLCBzd2wpOworCQkgICAgcWxhMngwMF9nZnBuX2lkKHZoYSwgc3dsKSA9PSBRTEFfU1VDQ0VTUykgeworCQkJcWxhMngwMF9ncHNjKHZoYSwgc3dsKTsKIAkJfQogCX0KIAlzd2xfaWR4ID0gMDsKIAogCS8qIEFsbG9jYXRlIHRlbXBvcmFyeSBmY3BvcnQgZm9yIGFueSBuZXcgZmNwb3J0cyBkaXNjb3ZlcmVkLiAqLwotCW5ld19mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX2ZjcG9ydChoYSwgR0ZQX0tFUk5FTCk7CisJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHZoYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5ld19mY3BvcnQgPT0gTlVMTCkgewogCQlrZnJlZShzd2wpOwogCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKIAl9CiAJbmV3X2ZjcG9ydC0+ZmxhZ3MgfD0gKEZDRl9GQUJSSUNfREVWSUNFIHwgRkNGX0xPR0lOX05FRURFRCk7Ci0JbmV3X2ZjcG9ydC0+dnBfaWR4ID0gaGEtPnZwX2lkeDsKIAkvKiBTZXQgc3RhcnQgcG9ydCBJRCBzY2FuIGF0IGFkYXB0ZXIgSUQuICovCiAJZmlyc3RfZGV2ID0gMTsKIAlsYXN0X2RldiA9IDA7CiAKIAkvKiBTdGFydGluZyBmcmVlIGxvb3AgSUQuICovCi0JbG9vcF9pZCA9IHBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKLQlmb3IgKDsgbG9vcF9pZCA8PSBoYS0+bGFzdF9sb29wX2lkOyBsb29wX2lkKyspIHsKLQkJaWYgKHFsYTJ4MDBfaXNfcmVzZXJ2ZWRfaWQoaGEsIGxvb3BfaWQpKQorCWxvb3BfaWQgPSBoYS0+bWluX2V4dGVybmFsX2xvb3BpZDsKKwlmb3IgKDsgbG9vcF9pZCA8PSBoYS0+bWF4X2xvb3BfaWQ7IGxvb3BfaWQrKykgeworCQlpZiAocWxhMngwMF9pc19yZXNlcnZlZF9pZCh2aGEsIGxvb3BfaWQpKQogCQkJY29udGludWU7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fCBMT09QX1RSQU5TSVRJT04oaGEpKQorCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fCBMT09QX1RSQU5TSVRJT04odmhhKSkKIAkJCWJyZWFrOwogCiAJCWlmIChzd2wgIT0gTlVMTCkgewpAQCAtMjYxNCw3ICsyNjYzLDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIFNlbmQgR0FfTlhUIHRvIHRoZSBzd2l0Y2ggKi8KLQkJCXJ2YWwgPSBxbGEyeDAwX2dhX254dChoYSwgbmV3X2ZjcG9ydCk7CisJCQlydmFsID0gcWxhMngwMF9nYV9ueHQodmhhLCBuZXdfZmNwb3J0KTsKIAkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJCSAgICAiU05TIHNjYW4gZmFpbGVkIC0tIGFzc3VtaW5nIHplcm8tZW50cnkgIgpAQCAtMjYzNSw0NCArMjY4NCwzMSBAQAogCQkJZmlyc3RfZGV2ID0gMDsKIAkJfSBlbHNlIGlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSB3cmFwLmIyNCkgewogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBkZXZpY2Ugd3JhcCAoJTAyeCUwMnglMDJ4KVxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgbmV3X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICB2aGEtPmhvc3Rfbm8sIG5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4sCiAJCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFyZWEsIG5ld19mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBCeXBhc3MgaWYgc2FtZSBwaHlzaWNhbCBhZGFwdGVyLiAqLwotCQlpZiAobmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPT0gcGhhLT5kX2lkLmIyNCkKKwkJaWYgKG5ld19mY3BvcnQtPmRfaWQuYjI0ID09IGJhc2VfdmhhLT5kX2lkLmIyNCkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIEJ5cGFzcyB2aXJ0dWFsIHBvcnRzIG9mIHRoZSBzYW1lIGhvc3QuICovCi0JCWlmIChwaGEtPm51bV92aG9zdHMpIHsKLQkJCWZvcl9lYWNoX21hcHBlZF92cF9pZHgocGhhLCB2cF9pbmRleCkgewotCQkJCWVtcHR5X3ZwX2luZGV4ID0gMTsKLQkJCQlmb3VuZF92cCA9IDA7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aGEsICZwaGEtPnZwX2xpc3QsCi0JCQkJICAgIHZwX2xpc3QpIHsKLQkJCQkJaWYgKHZwX2luZGV4ID09IHZoYS0+dnBfaWR4KSB7Ci0JCQkJCQllbXB0eV92cF9pbmRleCA9IDA7Ci0JCQkJCQlmb3VuZF92cCA9IDE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChlbXB0eV92cF9pbmRleCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoZm91bmRfdnAgJiYKLQkJCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPT0gdmhhLT5kX2lkLmIyNCkKKwkJZm91bmQgPSAwOworCQlpZiAoaGEtPm51bV92aG9zdHMpIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkgeworCQkJCWlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSB2cC0+ZF9pZC5iMjQpIHsKKwkJCQkJZm91bmQgPSAxOwogCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9Ci0KLQkJCWlmICh2cF9pbmRleCA8PSBwaGEtPm1heF9ucGl2X3Zwb3J0cykKKwkJCWlmIChmb3VuZCkKIAkJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIEJ5cGFzcyBpZiBzYW1lIGRvbWFpbiBhbmQgYXJlYSBvZiBhZGFwdGVyLiAqLwogCQlpZiAoKChuZXdfZmNwb3J0LT5kX2lkLmIyNCAmIDB4ZmZmZjAwKSA9PQotCQkgICAgKGhhLT5kX2lkLmIyNCAmIDB4ZmZmZjAwKSkgJiYgaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0KKwkJICAgICh2aGEtPmRfaWQuYjI0ICYgMHhmZmZmMDApKSAmJiBoYS0+Y3VycmVudF90b3BvbG9neSA9PQogCQkJSVNQX0NGR19GTCkKIAkJCSAgICBjb250aW51ZTsKIApAQCAtMjY4Miw5ICsyNzE4LDcgQEAKIAogCQkvKiBMb2NhdGUgbWF0Y2hpbmcgZGV2aWNlIGluIGRhdGFiYXNlLiAqLwogCQlmb3VuZCA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmcGhhLT5mY3BvcnRzLCBsaXN0KSB7Ci0JCQlpZiAobmV3X2ZjcG9ydC0+dnBfaWR4ICE9IGZjcG9ydC0+dnBfaWR4KQotCQkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgewogCQkJaWYgKG1lbWNtcChuZXdfZmNwb3J0LT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLAogCQkJICAgIFdXTl9TSVpFKSkKIAkJCQljb250aW51ZTsKQEAgLTI3MjgsNyArMjc2Miw3IEBACiAJCQkgICAgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfVEFQRV9QUkVTRU5UKSA9PSAwICYmCiAJCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0lOSVRJQVRPUiAmJgogCQkJICAgIGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9CUk9BRENBU1QpIHsKLQkJCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkLAorCQkJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9nb3V0KHZoYSwgZmNwb3J0LT5sb29wX2lkLAogCQkJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCiAJCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAkJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOwpAQCAtMjczOSwyNyArMjc3MywyNSBAQAogCiAJCWlmIChmb3VuZCkKIAkJCWNvbnRpbnVlOwotCiAJCS8qIElmIGRldmljZSB3YXMgbm90IGluIG91ciBmY3BvcnRzIGxpc3QsIHRoZW4gYWRkIGl0LiAqLwogCQlsaXN0X2FkZF90YWlsKCZuZXdfZmNwb3J0LT5saXN0LCBuZXdfZmNwb3J0cyk7CiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgcmVwbGFjZW1lbnQgZmNwb3J0LiAqLwogCQlueHRfZF9pZC5iMjQgPSBuZXdfZmNwb3J0LT5kX2lkLmIyNDsKLQkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KGhhLCBHRlBfS0VSTkVMKTsKKwkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHZoYSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKIAkJCWtmcmVlKHN3bCk7CiAJCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKIAkJfQogCQluZXdfZmNwb3J0LT5mbGFncyB8PSAoRkNGX0ZBQlJJQ19ERVZJQ0UgfCBGQ0ZfTE9HSU5fTkVFREVEKTsKIAkJbmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPSBueHRfZF9pZC5iMjQ7Ci0JCW5ld19mY3BvcnQtPnZwX2lkeCA9IGhhLT52cF9pZHg7CiAJfQogCiAJa2ZyZWUoc3dsKTsKIAlrZnJlZShuZXdfZmNwb3J0KTsKIAogCWlmICghbGlzdF9lbXB0eShuZXdfZmNwb3J0cykpCi0JCWhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19GQUJSSUNfREVWSUNFUzsKKwkJdmhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19GQUJSSUNfREVWSUNFUzsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0yNzc5LDEzICsyODExLDE0IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9maW5kX25ld19sb29wX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZGV2KQorcWxhMngwMF9maW5kX25ld19sb29wX2lkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmRldikKIHsKIAlpbnQJcnZhbDsKIAlpbnQJZm91bmQ7CiAJZmNfcG9ydF90ICpmY3BvcnQ7CiAJdWludDE2X3QgZmlyc3RfbG9vcF9pZDsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2cDsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIApAQCAtMjc5NCwxNyArMjgyNywxNSBAQAogCiAJZm9yICg7OykgewogCQkvKiBTa2lwIGxvb3AgSUQgaWYgYWxyZWFkeSB1c2VkIGJ5IGFkYXB0ZXIuICovCi0JCWlmIChkZXYtPmxvb3BfaWQgPT0gaGEtPmxvb3BfaWQpIHsKKwkJaWYgKGRldi0+bG9vcF9pZCA9PSB2aGEtPmxvb3BfaWQpCiAJCQlkZXYtPmxvb3BfaWQrKzsKLQkJfQogCiAJCS8qIFNraXAgcmVzZXJ2ZWQgbG9vcCBJRHMuICovCi0JCXdoaWxlIChxbGEyeDAwX2lzX3Jlc2VydmVkX2lkKGhhLCBkZXYtPmxvb3BfaWQpKSB7CisJCXdoaWxlIChxbGEyeDAwX2lzX3Jlc2VydmVkX2lkKHZoYSwgZGV2LT5sb29wX2lkKSkKIAkJCWRldi0+bG9vcF9pZCsrOwotCQl9CiAKIAkJLyogUmVzZXQgbG9vcCBJRCBpZiBwYXNzZWQgdGhlIGVuZC4gKi8KLQkJaWYgKGRldi0+bG9vcF9pZCA+IGhhLT5sYXN0X2xvb3BfaWQpIHsKKwkJaWYgKGRldi0+bG9vcF9pZCA+IGhhLT5tYXhfbG9vcF9pZCkgewogCQkJLyogZmlyc3QgbG9vcCBJRC4gKi8KIAkJCWRldi0+bG9vcF9pZCA9IGhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkOwogCQl9CkBAIC0yODEyLDEyICsyODQzLDE3IEBACiAJCS8qIENoZWNrIGZvciBsb29wIElEIGJlaW5nIGFscmVhZHkgaW4gdXNlLiAqLwogCQlmb3VuZCA9IDA7CiAJCWZjcG9ydCA9IE5VTEw7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmcGhhLT5mY3BvcnRzLCBsaXN0KSB7Ci0JCQlpZiAoZmNwb3J0LT5sb29wX2lkID09IGRldi0+bG9vcF9pZCAmJiBmY3BvcnQgIT0gZGV2KSB7Ci0JCQkJLyogSUQgcG9zc2libHkgaW4gdXNlICovCi0JCQkJZm91bmQrKzsKLQkJCQlicmVhazsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJmhhLT52cF9saXN0LCBsaXN0KSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZwLT52cF9mY3BvcnRzLCBsaXN0KSB7CisJCQkJaWYgKGZjcG9ydC0+bG9vcF9pZCA9PSBkZXYtPmxvb3BfaWQgJiYKKwkJCQkJCQkJZmNwb3J0ICE9IGRldikgeworCQkJCQkvKiBJRCBwb3NzaWJseSBpbiB1c2UgKi8KKwkJCQkJZm91bmQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQorCQkJaWYgKGZvdW5kKQorCQkJCWJyZWFrOwogCQl9CiAKIAkJLyogSWYgbm90IGluIHVzZSB0aGVuIGl0IGlzIGZyZWUgdG8gdXNlLiAqLwpAQCAtMjg1MCw3ICsyODg2LDcgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2RldmljZV9yZXN5bmMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZGV2aWNlX3Jlc3luYyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQJcnZhbDsKIAl1aW50MzJfdCBtYXNrOwpAQCAtMjg1OSwxNCArMjg5NSwxMyBAQAogCXVpbnQ4X3QgcnNjbl9vdXRfaXRlcjsKIAl1aW50OF90IGZvcm1hdDsKIAlwb3J0X2lkX3QgZF9pZDsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOwogCiAJcnZhbCA9IFFMQV9SU0NOU19IQU5ETEVEOwogCi0Jd2hpbGUgKGhhLT5yc2NuX291dF9wdHIgIT0gaGEtPnJzY25faW5fcHRyIHx8Ci0JICAgIGhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93KSB7CisJd2hpbGUgKHZoYS0+cnNjbl9vdXRfcHRyICE9IHZoYS0+cnNjbl9pbl9wdHIgfHwKKwkgICAgdmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93KSB7CiAKLQkJcnNjbl9lbnRyeSA9IGhhLT5yc2NuX3F1ZXVlW2hhLT5yc2NuX291dF9wdHJdOworCQlyc2NuX2VudHJ5ID0gdmhhLT5yc2NuX3F1ZXVlW3ZoYS0+cnNjbl9vdXRfcHRyXTsKIAkJZm9ybWF0ID0gTVNCKE1TVyhyc2NuX2VudHJ5KSk7CiAJCWRfaWQuYi5kb21haW4gPSBMU0IoTVNXKHJzY25fZW50cnkpKTsKIAkJZF9pZC5iLmFyZWEgPSBNU0IoTFNXKHJzY25fZW50cnkpKTsKQEAgLTI4NzQsMzcgKzI5MDksMzcgQEAKIAogCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUlNDTiBxdWV1ZSBlbnRyeVslZF0gPSAiCiAJCSAgICAiWyUwMngvJTAyeCUwMnglMDJ4XS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgaGEtPnJzY25fb3V0X3B0ciwgZm9ybWF0LCBkX2lkLmIuZG9tYWluLAorCQkgICAgdmhhLT5ob3N0X25vLCB2aGEtPnJzY25fb3V0X3B0ciwgZm9ybWF0LCBkX2lkLmIuZG9tYWluLAogCQkgICAgZF9pZC5iLmFyZWEsIGRfaWQuYi5hbF9wYSkpOwogCi0JCWhhLT5yc2NuX291dF9wdHIrKzsKLQkJaWYgKGhhLT5yc2NuX291dF9wdHIgPT0gTUFYX1JTQ05fQ09VTlQpCi0JCQloYS0+cnNjbl9vdXRfcHRyID0gMDsKKwkJdmhhLT5yc2NuX291dF9wdHIrKzsKKwkJaWYgKHZoYS0+cnNjbl9vdXRfcHRyID09IE1BWF9SU0NOX0NPVU5UKQorCQkJdmhhLT5yc2NuX291dF9wdHIgPSAwOwogCiAJCS8qIFNraXAgZHVwbGljYXRlIGVudHJpZXMuICovCi0JCWZvciAocnNjbl9vdXRfaXRlciA9IGhhLT5yc2NuX291dF9wdHI7Ci0JCSAgICAhaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgJiYKLQkJICAgIHJzY25fb3V0X2l0ZXIgIT0gaGEtPnJzY25faW5fcHRyOworCQlmb3IgKHJzY25fb3V0X2l0ZXIgPSB2aGEtPnJzY25fb3V0X3B0cjsKKwkJICAgICF2aGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgJiYKKwkJICAgIHJzY25fb3V0X2l0ZXIgIT0gdmhhLT5yc2NuX2luX3B0cjsKIAkJICAgIHJzY25fb3V0X2l0ZXIgPSAocnNjbl9vdXRfaXRlciA9PQogCQkJKE1BWF9SU0NOX0NPVU5UIC0gMSkpID8gMDogcnNjbl9vdXRfaXRlciArIDEpIHsKIAotCQkJaWYgKHJzY25fZW50cnkgIT0gaGEtPnJzY25fcXVldWVbcnNjbl9vdXRfaXRlcl0pCisJCQlpZiAocnNjbl9lbnRyeSAhPSB2aGEtPnJzY25fcXVldWVbcnNjbl9vdXRfaXRlcl0pCiAJCQkJYnJlYWs7CiAKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBTa2lwcGluZyBkdXBsaWNhdGUgUlNDTiBxdWV1ZSAiCi0JCQkgICAgImVudHJ5IGZvdW5kIGF0IFslZF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgICAiZW50cnkgZm91bmQgYXQgWyVkXS5cbiIsIHZoYS0+aG9zdF9ubywKIAkJCSAgICByc2NuX291dF9pdGVyKSk7CiAKLQkJCWhhLT5yc2NuX291dF9wdHIgPSByc2NuX291dF9pdGVyOworCQkJdmhhLT5yc2NuX291dF9wdHIgPSByc2NuX291dF9pdGVyOwogCQl9CiAKIAkJLyogUXVldWUgb3ZlcmZsb3csIHNldCBzd2l0Y2ggZGVmYXVsdCBjYXNlLiAqLwotCQlpZiAoaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cpIHsKKwkJaWYgKHZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdykgewogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRldmljZV9yZXN5bmM6IHJzY24gIgotCQkJICAgICJvdmVyZmxvdy5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQkgICAgIm92ZXJmbG93LlxuIiwgdmhhLT5ob3N0X25vKSk7CiAKIAkJCWZvcm1hdCA9IDM7Ci0JCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDA7CisJCQl2aGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAwOwogCQl9CiAKIAkJc3dpdGNoIChmb3JtYXQpIHsKQEAgLTI5MjAsMTYgKzI5NTUsMTMgQEAKIAkJZGVmYXVsdDoKIAkJCW1hc2sgPSAweDA7CiAJCQlkX2lkLmIyNCA9IDA7Ci0JCQloYS0+cnNjbl9vdXRfcHRyID0gaGEtPnJzY25faW5fcHRyOworCQkJdmhhLT5yc2NuX291dF9wdHIgPSB2aGEtPnJzY25faW5fcHRyOwogCQkJYnJlYWs7CiAJCX0KIAogCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZwaGEtPmZjcG9ydHMsIGxpc3QpIHsKLQkJCWlmIChmY3BvcnQtPnZwX2lkeCAhPSBoYS0+dnBfaWR4KQotCQkJCWNvbnRpbnVlOwotCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CiAJCQlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCB8fAogCQkJICAgIChmY3BvcnQtPmRfaWQuYjI0ICYgbWFzaykgIT0gZF9pZC5iMjQgfHwKIAkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfQlJPQURDQVNUKQpAQCAtMjkzOCw3ICsyOTcwLDcgQEAKIAkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkgewogCQkJCWlmIChmb3JtYXQgIT0gMyB8fAogCQkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfSU5JVElBVE9SKSB7Ci0JCQkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChoYSwgZmNwb3J0LAorCQkJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QodmhhLCBmY3BvcnQsCiAJCQkJCSAgICAwLCAwKTsKIAkJCQl9CiAJCQl9CkBAIC0yOTY1LDMwICsyOTk3LDMxIEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LAorcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICB1aW50MTZfdCAqbmV4dF9sb29waWQpCiB7CiAJaW50CXJ2YWw7CiAJaW50CXJldHJ5OwogCXVpbnQ4X3Qgb3B0czsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlyZXRyeSA9IDA7CiAKLQlydmFsID0gcWxhMngwMF9mYWJyaWNfbG9naW4oaGEsIGZjcG9ydCwgbmV4dF9sb29waWQpOworCXJ2YWwgPSBxbGEyeDAwX2ZhYnJpY19sb2dpbih2aGEsIGZjcG9ydCwgbmV4dF9sb29waWQpOwogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCS8qIFNlbmQgYW4gQURJU0MgdG8gdGFwZSBkZXZpY2VzLiovCiAJCW9wdHMgPSAwOwogCQlpZiAoZmNwb3J0LT5mbGFncyAmIEZDRl9UQVBFX1BSRVNFTlQpCiAJCQlvcHRzIHw9IEJJVF8xOwotCQlydmFsID0gcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZShoYSwgZmNwb3J0LCBvcHRzKTsKKwkJcnZhbCA9IHFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UodmhhLCBmY3BvcnQsIG9wdHMpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dvdXQoaGEsIGZjcG9ydC0+bG9vcF9pZCwKKwkJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9nb3V0KHZoYSwgZmNwb3J0LT5sb29wX2lkLAogCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKIAkJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7Ci0JCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydCwgMSwgMCk7CisJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QodmhhLCBmY3BvcnQsIDEsIDApOwogCQl9IGVsc2UgewotCQkJcWxhMngwMF91cGRhdGVfZmNwb3J0KGhhLCBmY3BvcnQpOworCQkJcWxhMngwMF91cGRhdGVfZmNwb3J0KHZoYSwgZmNwb3J0KTsKIAkJfQogCX0KIApAQCAtMzAxMCwxMyArMzA0MywxNCBAQAogICogICAgICAzIC0gRmF0YWwgZXJyb3IKICAqLwogaW50Ci1xbGEyeDAwX2ZhYnJpY19sb2dpbihzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKK3FsYTJ4MDBfZmFicmljX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICB1aW50MTZfdCAqbmV4dF9sb29waWQpCiB7CiAJaW50CXJ2YWw7CiAJaW50CXJldHJ5OwogCXVpbnQxNl90IHRtcF9sb29waWQ7CiAJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlyZXRyeSA9IDA7CiAJdG1wX2xvb3BpZCA9IDA7CkBAIC0zMDI0LDExICszMDU4LDExIEBACiAJZm9yICg7OykgewogCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVHJ5aW5nIEZhYnJpYyBMb2dpbiB3L2xvb3AgaWQgMHglMDR4ICIKICAJCSAgICAiZm9yIHBvcnQgJTAyeCUwMnglMDJ4LlxuIiwKLSAJCSAgICBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCSAgICB2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAogCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKIAogCQkvKiBMb2dpbiBmY3BvcnQgb24gc3dpdGNoLiAqLwotCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKGhhLCBmY3BvcnQtPmxvb3BfaWQsCisJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9naW4odmhhLCBmY3BvcnQtPmxvb3BfaWQsCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbWIsIEJJVF8wKTsKIAkJaWYgKG1iWzBdID09IE1CU19QT1JUX0lEX1VTRUQpIHsKQEAgLTMwODQsNyArMzExOCw3IEBACiAJCQkgKiBMb29wIElEIGFscmVhZHkgdXNlZCwgdHJ5IG5leHQgbG9vcCBJRC4KIAkJCSAqLwogCQkJZmNwb3J0LT5sb29wX2lkKys7Ci0JCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKGhhLCBmY3BvcnQpOworCQkJcnZhbCA9IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZCh2aGEsIGZjcG9ydCk7CiAJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCS8qIFJhbiBvdXQgb2YgbG9vcCBJRHMgdG8gdXNlICovCiAJCQkJYnJlYWs7CkBAIC0zMDk2LDEwICszMTMwLDEwIEBACiAJCQkgKiBkZWFkLgogCQkJICovCiAJCQkqbmV4dF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7Ci0JCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkLAorCQkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dvdXQodmhhLCBmY3BvcnQtPmxvb3BfaWQsCiAJCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAogCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKLQkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChoYSwgZmNwb3J0LCAxLCAwKTsKKwkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdCh2aGEsIGZjcG9ydCwgMSwgMCk7CiAKIAkJCXJ2YWwgPSAxOwogCQkJYnJlYWs7CkBAIC0zMTA5LDEyICszMTQzLDEyIEBACiAJCQkgKi8KIAkJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBwb3J0X2lkPSUwMnglMDJ4JTAyeCAiCiAgCQkJICAgICJsb29wX2lkPSV4IGppZmZpZXM9JWx4LlxuIiwKLSAJCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBtYlswXSwKKwkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBtYlswXSwKIAkJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCiAJCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGZjcG9ydC0+bG9vcF9pZCwgamlmZmllcykpOwogCiAJCQkqbmV4dF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7Ci0JCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkLAorCQkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dvdXQodmhhLCBmY3BvcnQtPmxvb3BfaWQsCiAJCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAogCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAkJCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CkBAIC0zMTQyLDEzICszMTc2LDEzIEBACiAgKiAgICAgIDMgLSBGYXRhbCBlcnJvcgogICovCiBpbnQKLXFsYTJ4MDBfbG9jYWxfZGV2aWNlX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQorcWxhMngwMF9sb2NhbF9kZXZpY2VfbG9naW4oc2NzaV9xbGFfaG9zdF90ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0KQogewogCWludAkJcnZhbDsKIAl1aW50MTZfdAltYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKIAogCW1lbXNldChtYiwgMCwgc2l6ZW9mKG1iKSk7Ci0JcnZhbCA9IHFsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKGhhLCBmY3BvcnQsIG1iLCBCSVRfMCk7CisJcnZhbCA9IHFsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKHZoYSwgZmNwb3J0LCBtYiwgQklUXzApOwogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCS8qIEludGVycm9nYXRlIG1haWxib3ggcmVnaXN0ZXJzIGZvciBhbnkgZXJyb3JzICovCiAJCWlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9FUlJPUikKQEAgLTMxNzIsNTcgKzMyMDYsNTcgQEAKICAqICAgICAgMCA9IHN1Y2Nlc3MKICAqLwogaW50Ci1xbGEyeDAwX2xvb3BfcmVzeW5jKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2xvb3BfcmVzeW5jKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewotCWludCAgIHJ2YWw7CisJaW50IHJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAl1aW50MzJfdCB3YWl0X3RpbWU7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CiAKLQlydmFsID0gUUxBX1NVQ0NFU1M7Ci0KLQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUERBVEUpOwotCWNsZWFyX2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKTsKLQlpZiAoaGEtPmZsYWdzLm9ubGluZSkgewotCQlpZiAoIShydmFsID0gcWxhMngwMF9md19yZWFkeShoYSkpKSB7CisJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CisJY2xlYXJfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwlpZiAodmhhLT5mbGFncy5vbmxpbmUpIHsKKwkJaWYgKCEocnZhbCA9IHFsYTJ4MDBfZndfcmVhZHkodmhhKSkpIHsKIAkJCS8qIFdhaXQgYXQgbW9zdCBNQVhfVEFSR0VUIFJTQ05zIGZvciBhIHN0YWJsZSBsaW5rLiAqLwogCQkJd2FpdF90aW1lID0gMjU2OwogCQkJZG8gewotCQkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CisJCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CiAKIAkJCQkvKiBJc3N1ZSBhIG1hcmtlciBhZnRlciBGVyBiZWNvbWVzIHJlYWR5LiAqLwotCQkJCXFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCk7Ci0JCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCQkJCXFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsCisJCQkJCU1LX1NZTkNfQUxMKTsKKwkJCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwogCiAJCQkJLyogUmVtYXAgZGV2aWNlcyBvbiBMb29wLiAqLwotCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQljbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCi0JCQkJcWxhMngwMF9jb25maWd1cmVfbG9vcChoYSk7CisJCQkJcWxhMngwMF9jb25maWd1cmVfbG9vcCh2aGEpOwogCQkJCXdhaXRfdGltZS0tOwotCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgotCQkJCSEodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgotCQkJCXdhaXRfdGltZSAmJgotCQkJCSh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkpOworCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCQkhKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCisJCQkJJiYgd2FpdF90aW1lICYmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsCisJCQkJJnZoYS0+ZHBjX2ZsYWdzKSkpOwogCQl9CiAJfQogCi0JaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKQogCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwotCX0KIAotCWlmIChydmFsKSB7CisJaWYgKHJ2YWwpCiAJCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKLQl9CiAKIAlyZXR1cm4gKHJ2YWwpOwogfQogCiB2b2lkCi1xbGEyeDAwX3VwZGF0ZV9mY3BvcnRzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3VwZGF0ZV9mY3BvcnRzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWZjX3BvcnRfdCAqZmNwb3J0OwogCiAJLyogR28gd2l0aCBkZWZlcnJlZCByZW1vdmFsIG9mIHJwb3J0IHJlZmVyZW5jZXMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkKLQkJaWYgKGZjcG9ydC0+ZHJwb3J0ICYmCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZ2aGEtPnZwX2ZjcG9ydHMsIGxpc3QpCisJCWlmIChmY3BvcnQgJiYgZmNwb3J0LT5kcnBvcnQgJiYKIAkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfVU5DT05GSUdVUkVEKQogCQkJcWxhMngwMF9ycG9ydF9kZWwoZmNwb3J0KTsKIH0KQEAgLTMyMzgsNjMgKzMyNzIsNjUgQEAKICogICAgICAwID0gc3VjY2VzcwogKi8KIGludAotcWxhMngwMF9hYm9ydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfYWJvcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsOwogCXVpbnQ4X3QgICAgICAgIHN0YXR1cyA9IDA7Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZwOworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwogCi0JaWYgKGhhLT5mbGFncy5vbmxpbmUpIHsKLQkJaGEtPmZsYWdzLm9ubGluZSA9IDA7Ci0JCWNsZWFyX2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJaWYgKHZoYS0+ZmxhZ3Mub25saW5lKSB7CisJCXZoYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWhhLT5xbGFfc3RhdHMudG90YWxfaXNwX2Fib3J0cysrOwogCiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgICJQZXJmb3JtaW5nIElTUCBlcnJvciByZWNvdmVyeSAtIGhhPSAlcC5cbiIsIGhhKTsKLQkJaGEtPmlzcF9vcHMtPnJlc2V0X2NoaXAoaGEpOworCQloYS0+aXNwX29wcy0+cmVzZXRfY2hpcCh2aGEpOwogCi0JCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7Ci0JCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKLQkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAwKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodmhhLCAmaGEtPnZwX2xpc3QsIHZwX2xpc3QpCi0JCQkgICAgICAgcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QodmhhLCAwKTsKKwkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QodmhhLCAwKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkKKwkJCSAgICAgICBxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdCh2cCwgMCk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSkKLQkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLAorCQkJaWYgKCFhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpKQorCQkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLAogCQkJCSAgICBMT09QX0RPV05fVElNRSk7CiAJCX0KIAogCQkvKiBSZXF1ZXVlIGFsbCBjb21tYW5kcyBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCi0JCXFsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoaGEsIERJRF9SRVNFVCA8PCAxNik7CisJCXFsYTJ4MDBfYWJvcnRfYWxsX2NtZHModmhhLCBESURfUkVTRVQgPDwgMTYpOwogCi0JCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbihoYSwgaGEtPnJlcXVlc3RfcmluZyk7CisJCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbih2aGEsIHJlcS0+cmluZyk7CiAKLQkJaGEtPmlzcF9vcHMtPm52cmFtX2NvbmZpZyhoYSk7CisJCWhhLT5pc3Bfb3BzLT5udnJhbV9jb25maWcodmhhKTsKIAotCQlpZiAoIXFsYTJ4MDBfcmVzdGFydF9pc3AoaGEpKSB7Ci0JCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlpZiAoIXFsYTJ4MDBfcmVzdGFydF9pc3AodmhhKSkgeworCQkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKLQkJCWlmICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpKSB7CisJCQlpZiAoIWF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpIHsKIAkJCQkvKgogCQkJCSAqIElzc3VlIG1hcmtlciBjb21tYW5kIG9ubHkgd2hlbiB3ZSBhcmUgZ29pbmcKIAkJCQkgKiB0byBzdGFydCB0aGUgSS9PIC4KIAkJCQkgKi8KLQkJCQloYS0+bWFya2VyX25lZWRlZCA9IDE7CisJCQkJdmhhLT5tYXJrZXJfbmVlZGVkID0gMTsKIAkJCX0KIAotCQkJaGEtPmZsYWdzLm9ubGluZSA9IDE7CisJCQl2aGEtPmZsYWdzLm9ubGluZSA9IDE7CiAKIAkJCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOwogCiAJCQloYS0+aXNwX2Fib3J0X2NudCA9IDA7Ci0JCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmaGEtPmRwY19mbGFncyk7CisJCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpOwogCiAJCQlpZiAoaGEtPmZjZSkgewogCQkJCWhhLT5mbGFncy5mY2VfZW5hYmxlZCA9IDE7CiAJCQkJbWVtc2V0KGhhLT5mY2UsIDAsCiAJCQkJICAgIGZjZV9jYWxjX3NpemUoaGEtPmZjZV9idWZzKSk7Ci0JCQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2ZjZV90cmFjZShoYSwKKwkJCQlydmFsID0gcWxhMngwMF9lbmFibGVfZmNlX3RyYWNlKHZoYSwKIAkJCQkgICAgaGEtPmZjZV9kbWEsIGhhLT5mY2VfYnVmcywgaGEtPmZjZV9tYiwKIAkJCQkgICAgJmhhLT5mY2VfYnVmcyk7CiAJCQkJaWYgKHJ2YWwpIHsKQEAgLTMzMDcsNyArMzM0Myw3IEBACiAKIAkJCWlmIChoYS0+ZWZ0KSB7CiAJCQkJbWVtc2V0KGhhLT5lZnQsIDAsIEVGVF9TSVpFKTsKLQkJCQlydmFsID0gcWxhMngwMF9lbmFibGVfZWZ0X3RyYWNlKGhhLAorCQkJCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9lZnRfdHJhY2UodmhhLAogCQkJCSAgICBoYS0+ZWZ0X2RtYSwgRUZUX05VTV9CVUZGRVJTKTsKIAkJCQlpZiAocnZhbCkgewogCQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCkBAIC0zMzE2LDggKzMzNTIsOCBAQAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsJLyogZmFpbGVkIHRoZSBJU1AgYWJvcnQgKi8KLQkJCWhhLT5mbGFncy5vbmxpbmUgPSAxOwotCQkJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQl2aGEtPmZsYWdzLm9ubGluZSA9IDE7CisJCQlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQkJaWYgKGhhLT5pc3BfYWJvcnRfY250ID09IDApIHsKICAJCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkIC0gIgpAQCAtMzMyNiwzNyArMzM2Miw0MSBAQAogCQkJCQkgKiBUaGUgbmV4dCBjYWxsIGRpc2FibGVzIHRoZSBib2FyZAogCQkJCQkgKiBjb21wbGV0ZWx5LgogCQkJCQkgKi8KLQkJCQkJaGEtPmlzcF9vcHMtPnJlc2V0X2FkYXB0ZXIoaGEpOwotCQkJCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJCQkJaGEtPmlzcF9vcHMtPnJlc2V0X2FkYXB0ZXIodmhhKTsKKwkJCQkJdmhhLT5mbGFncy5vbmxpbmUgPSAwOwogCQkJCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLAotCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpOworCQkJCQkgICAgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQkJc3RhdHVzID0gMDsKIAkJCQl9IGVsc2UgeyAvKiBzY2hlZHVsZSBhbm90aGVyIElTUCBhYm9ydCAqLwogCQkJCQloYS0+aXNwX2Fib3J0X2NudC0tOwogCQkJCQlERUJVRyhwcmludGsoInFsYSVsZDogSVNQIGFib3J0IC0gIgogCQkJCQkgICAgInJldHJ5IHJlbWFpbmluZyAlZFxuIiwKLQkJCQkJICAgIGhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCkpOworCQkJCQkgICAgdmhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCkpOwogCQkJCQlzdGF0dXMgPSAxOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaGEtPmlzcF9hYm9ydF9jbnQgPSBNQVhfUkVUUklFU19PRl9JU1BfQUJPUlQ7CiAJCQkJREVCVUcocHJpbnRrKCJxbGEyeDAwKCVsZCk6IElTUCBlcnJvciByZWNvdmVyeSAiCiAJCQkJICAgICItIHJldHJ5aW5nICglZCkgbW9yZSB0aW1lc1xuIiwKLQkJCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KSk7Ci0JCQkJc2V0X2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkgICAgdmhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCkpOworCQkJCXNldF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCXN0YXR1cyA9IDE7CiAJCQl9CiAJCX0KIAogCX0KIAotCWlmIChzdGF0dXMpIHsKKwlpZiAoIXN0YXR1cykgeworCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCQkJInFsYTJ4MDBfYWJvcnRfaXNwKCVsZCk6IHN1Y2NlZWRlZC5cbiIsCisJCQkJdmhhLT5ob3N0X25vKSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkgeworCQkJaWYgKHZwLT52cF9pZHgpCisJCQkJcWxhMngwMF92cF9hYm9ydF9pc3AodnApOworCQl9CisJfSBlbHNlIHsKIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJInFsYTJ4MDBfYWJvcnRfaXNwOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKLQl9IGVsc2UgewotCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkJInFsYTJ4MDBfYWJvcnRfaXNwKCVsZCk6IGV4aXRpbmcuXG4iLAotCQkJCWhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuKHN0YXR1cyk7CkBAIC0zMzczLDQyICszNDEzLDUwIEBACiAqICAgICAgMCA9IHN1Y2Nlc3MKICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX3Jlc3RhcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3Jlc3RhcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCXVpbnQ4X3QJCXN0YXR1cyA9IDA7CiAJdWludDMyX3Qgd2FpdF90aW1lOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOworCXN0cnVjdCByc3BfcXVlICpyc3AgPSBoYS0+cnNwX3FfbWFwWzBdOwogCiAJLyogSWYgZmlybXdhcmUgbmVlZHMgdG8gYmUgbG9hZGVkICovCi0JaWYgKHFsYTJ4MDBfaXNwX2Zpcm13YXJlKGhhKSkgewotCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKLQkJaWYgKCEoc3RhdHVzID0gaGEtPmlzcF9vcHMtPmNoaXBfZGlhZyhoYSkpKQotCQkJc3RhdHVzID0gcWxhMngwMF9zZXR1cF9jaGlwKGhhKTsKKwlpZiAocWxhMngwMF9pc3BfZmlybXdhcmUodmhhKSkgeworCQl2aGEtPmZsYWdzLm9ubGluZSA9IDA7CisJCXN0YXR1cyA9IGhhLT5pc3Bfb3BzLT5jaGlwX2RpYWcodmhhKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlzdGF0dXMgPSBxbGEyeDAwX3NldHVwX2NoaXAodmhhKTsKIAl9CiAKLQlpZiAoIXN0YXR1cyAmJiAhKHN0YXR1cyA9IHFsYTJ4MDBfaW5pdF9yaW5ncyhoYSkpKSB7Ci0JCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCWlmICghKHN0YXR1cyA9IHFsYTJ4MDBfZndfcmVhZHkoaGEpKSkgeworCWlmICghc3RhdHVzICYmICEoc3RhdHVzID0gcWxhMngwMF9pbml0X3JpbmdzKHZoYSkpKSB7CisJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQkvKiBJbml0aWFsaXplIHRoZSBxdWV1ZXMgaW4gdXNlICovCisJCXFsYTI1eHhfaW5pdF9xdWV1ZXMoaGEpOworCisJCXN0YXR1cyA9IHFsYTJ4MDBfZndfcmVhZHkodmhhKTsKKwkJaWYgKCFzdGF0dXMpIHsKIAkJCURFQlVHKHByaW50aygiJXMoKTogU3RhcnQgY29uZmlndXJlIGxvb3AsICIKIAkJCSAgICAic3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpKTsKIAogCQkJLyogSXNzdWUgYSBtYXJrZXIgYWZ0ZXIgRlcgYmVjb21lcyByZWFkeS4gKi8KLQkJCXFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCk7CisJCQlxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCk7CiAKLQkJCWhhLT5mbGFncy5vbmxpbmUgPSAxOworCQkJdmhhLT5mbGFncy5vbmxpbmUgPSAxOwogCQkJLyogV2FpdCBhdCBtb3N0IE1BWF9UQVJHRVQgUlNDTnMgZm9yIGEgc3RhYmxlIGxpbmsuICovCiAJCQl3YWl0X3RpbWUgPSAyNTY7CiAJCQlkbyB7Ci0JCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJCXFsYTJ4MDBfY29uZmlndXJlX2xvb3AoaGEpOworCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCQkJcWxhMngwMF9jb25maWd1cmVfbG9vcCh2aGEpOwogCQkJCXdhaXRfdGltZS0tOwotCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgotCQkJCSEodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgotCQkJCXdhaXRfdGltZSAmJgotCQkJCSh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkpOworCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCQkhKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCisJCQkJJiYgd2FpdF90aW1lICYmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsCisJCQkJJnZoYS0+ZHBjX2ZsYWdzKSkpOwogCQl9CiAKIAkJLyogaWYgbm8gY2FibGUgdGhlbiBhc3N1bWUgaXQncyBnb29kICovCi0JCWlmICgoaGEtPmRldmljZV9mbGFncyAmIERGTEdfTk9fQ0FCTEUpKQorCQlpZiAoKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpCiAJCQlzdGF0dXMgPSAwOwogCiAJCURFQlVHKHByaW50aygiJXMoKTogQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleFxuIiwKQEAgLTM0MTgsNiArMzQ2Niw0NiBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAorc3RhdGljIGludAorcWxhMjV4eF9pbml0X3F1ZXVlcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQoreworCXN0cnVjdCByc3BfcXVlICpyc3AgPSBOVUxMOworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisJaW50IHJldCA9IC0xOworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGhhLT5tYXhfcXVldWVzOyBpKyspIHsKKwkJcnNwID0gaGEtPnJzcF9xX21hcFtpXTsKKwkJaWYgKHJzcCkgeworCQkJcnNwLT5vcHRpb25zICY9IH5CSVRfMDsKKwkJCXJldCA9IHFsYTI1eHhfaW5pdF9yc3BfcXVlKGJhc2VfdmhhLCByc3AsIHJzcC0+b3B0aW9ucyk7CisJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKQorCQkJCURFQlVHMl8xNyhwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlcyBSc3AgcXVlOiVkIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCXJzcC0+aWQpKTsKKwkJCWVsc2UKKwkJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXMgUnNwIHF1ZTolZCBpbml0ZWRcbiIsIF9fZnVuY19fLAorCQkJCQkJcnNwLT5pZCkpOworCQl9CisJCXJlcSA9IGhhLT5yZXFfcV9tYXBbaV07CisJCWlmIChyZXEpIHsKKwkJCXJlcS0+b3B0aW9ucyAmPSB+QklUXzA7CisJCQlyZXQgPSBxbGEyNXh4X2luaXRfcmVxX3F1ZShiYXNlX3ZoYSwgcmVxLCByZXEtPm9wdGlvbnMpOworCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKKwkJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiJXMgUmVxIHF1ZTolZCBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18sCisJCQkJCQlyZXEtPmlkKSk7CisJCQllbHNlCisJCQkJREVCVUcyXzE3KHByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIiVzIFJzcCBxdWU6JWQgaW5pdGVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCXJlcS0+aWQpKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKgogKiBxbGEyeDAwX3Jlc2V0X2FkYXB0ZXIKICogICAgICBSZXNldCBhZGFwdGVyLgpAQCAtMzQyNiwxMiArMzUxNCwxMyBAQAogKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgogKi8KIHZvaWQKLXFsYTJ4MDBfcmVzZXRfYWRhcHRlcihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9yZXNldF9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAotCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCXZoYS0+ZmxhZ3Mub25saW5lID0gMDsKIAloYS0+aXNwX29wcy0+ZGlzYWJsZV9pbnRycyhoYSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKQEAgLTM0NDMsMTIgKzM1MzIsMTMgQEAKIH0KIAogdm9pZAotcWxhMjR4eF9yZXNldF9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyNHh4X3Jlc2V0X2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKLQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwl2aGEtPmZsYWdzLm9ubGluZSA9IDA7CiAJaGEtPmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0zNDYyLDkgKzM1NTIsMTEgQEAKIC8qIE9uIHNwYXJjIHN5c3RlbXMsIG9idGFpbiBwb3J0IGFuZCBub2RlIFdXTiBmcm9tIGZpcm13YXJlCiAgKiBwcm9wZXJ0aWVzLgogICovCi1zdGF0aWMgdm9pZCBxbGEyNHh4X252cmFtX3d3bl9mcm9tX29mdyhzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgbnZyYW1fMjR4eCAqbnYpCitzdGF0aWMgdm9pZCBxbGEyNHh4X252cmFtX3d3bl9mcm9tX29mdyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlzdHJ1Y3QgbnZyYW1fMjR4eCAqbnYpCiB7CiAjaWZkZWYgQ09ORklHX1NQQVJDCisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBoYS0+cGRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwogCWNvbnN0IHU4ICp2YWw7CkBAIC0zNDgxLDcgKzM1NzMsNyBAQAogfQogCiBpbnQKLXFsYTI0eHhfbnZyYW1fY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyNHh4X252cmFtX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgICBydmFsOwogCXN0cnVjdCBpbml0X2NiXzI0eHggKmljYjsKQEAgLTM0OTAsNiArMzU4Miw3IEBACiAJdWludDhfdCAgKmRwdHIxLCAqZHB0cjI7CiAJdWludDMyX3QgY2hrc3VtOwogCXVpbnQxNl90IGNudDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlpY2IgPSAoc3RydWN0IGluaXRfY2JfMjR4eCAqKWhhLT5pbml0X2NiOwpAQCAtMzUwNywxMiArMzYwMCwxMiBAQAogCiAJLyogR2V0IFZQRCBkYXRhIGludG8gY2FjaGUgKi8KIAloYS0+dnBkID0gaGEtPm52cmFtICsgVlBEX09GRlNFVDsKLQloYS0+aXNwX29wcy0+cmVhZF9udnJhbShoYSwgKHVpbnQ4X3QgKiloYS0+dnBkLAorCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKiloYS0+dnBkLAogCSAgICBoYS0+bnZyYW1fYmFzZSAtIEZBX05WUkFNX0ZVTkMwX0FERFIsIEZBX05WUkFNX1ZQRF9TSVpFICogNCk7CiAKIAkvKiBHZXQgTlZSQU0gZGF0YSBpbnRvIGNhY2hlIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW0uICovCiAJZHB0ciA9ICh1aW50MzJfdCAqKW52OwotCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKGhhLCAodWludDhfdCAqKWRwdHIsIGhhLT5udnJhbV9iYXNlLAorCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKilkcHRyLCBoYS0+bnZyYW1fYmFzZSwKIAkgICAgaGEtPm52cmFtX3NpemUpOwogCWZvciAoY250ID0gMCwgY2hrc3VtID0gMDsgY250IDwgaGEtPm52cmFtX3NpemUgPj4gMjsgY250KyspCiAJCWNoa3N1bSArPSBsZTMyX3RvX2NwdSgqZHB0cisrKTsKQEAgLTM1NTcsNyArMzY1MCw3IEBACiAJCW52LT5ub2RlX25hbWVbNV0gPSAweDFjOwogCQludi0+bm9kZV9uYW1lWzZdID0gMHg1NTsKIAkJbnYtPm5vZGVfbmFtZVs3XSA9IDB4ODY7Ci0JCXFsYTI0eHhfbnZyYW1fd3duX2Zyb21fb2Z3KGhhLCBudik7CisJCXFsYTI0eHhfbnZyYW1fd3duX2Zyb21fb2Z3KHZoYSwgbnYpOwogCQludi0+bG9naW5fcmV0cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDgpOwogCQludi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKIAkJbnYtPmxvZ2luX3RpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOwpAQCAtMzU3Nyw3ICszNjcwLDcgQEAKIAl9CiAKIAkvKiBSZXNldCBJbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrICovCi0JbWVtc2V0KGljYiwgMCwgc2l6ZW9mKHN0cnVjdCBpbml0X2NiXzI0eHgpKTsKKwltZW1zZXQoaWNiLCAwLCBoYS0+aW5pdF9jYl9zaXplKTsKIAogCS8qIENvcHkgMXN0IHNlZ21lbnQuICovCiAJZHB0cjEgPSAodWludDhfdCAqKWljYjsKQEAgLTM2MDAsNyArMzY5Myw3IEBACiAJLyoKIAkgKiBTZXR1cCBkcml2ZXIgTlZSQU0gb3B0aW9ucy4KIAkgKi8KLQlxbGEyeDAwX3NldF9tb2RlbF9pbmZvKGhhLCBudi0+bW9kZWxfbmFtZSwgc2l6ZW9mKG52LT5tb2RlbF9uYW1lKSwKKwlxbGEyeDAwX3NldF9tb2RlbF9pbmZvKHZoYSwgbnYtPm1vZGVsX25hbWUsIHNpemVvZihudi0+bW9kZWxfbmFtZSksCiAJICAgICJRTEEyNDYyIik7CiAKIAkvKiBVc2UgYWx0ZXJuYXRlIFdXTj8gKi8KQEAgLTM2MzksOCArMzczMiw4IEBACiAJaGEtPnNlcmlhbDAgPSBpY2ItPnBvcnRfbmFtZVs1XTsKIAloYS0+c2VyaWFsMSA9IGljYi0+cG9ydF9uYW1lWzZdOwogCWhhLT5zZXJpYWwyID0gaWNiLT5wb3J0X25hbWVbN107Ci0JaGEtPm5vZGVfbmFtZSA9IGljYi0+bm9kZV9uYW1lOwotCWhhLT5wb3J0X25hbWUgPSBpY2ItPnBvcnRfbmFtZTsKKwltZW1jcHkodmhhLT5ub2RlX25hbWUsIGljYi0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KHZoYS0+cG9ydF9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOwogCiAJaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CiAKQEAgLTM2OTUsNyArMzc4OCw3IEBACiAJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IHFsMnhsb2dpbnJldHJ5Y291bnQ7CiAKIAkvKiBFbmFibGUgWklPLiAqLwotCWlmICghaGEtPmZsYWdzLmluaXRfZG9uZSkgeworCWlmICghdmhhLT5mbGFncy5pbml0X2RvbmUpIHsKIAkJaGEtPnppb19tb2RlID0gbGUzMl90b19jcHUoaWNiLT5maXJtd2FyZV9vcHRpb25zXzIpICYKIAkJICAgIChCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7CiAJCWhhLT56aW9fdGltZXIgPSBsZTE2X3RvX2NwdShpY2ItPmludGVycnVwdF9kZWxheV90aW1lcikgPwpAQCAtMzcwMywxMiArMzc5NiwxMiBAQAogCX0KIAlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiAmPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKAogCSAgICB+KEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKSk7Ci0JaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAwOworCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDA7CiAJaWYgKGhhLT56aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEKSB7CiAJCWhhLT56aW9fbW9kZSA9IFFMQV9aSU9fTU9ERV82OwogCiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgIgotCQkgICAgIiglZCB1cykuXG4iLCBoYS0+aG9zdF9ubywgaGEtPnppb19tb2RlLAorCQkgICAgIiglZCB1cykuXG4iLCB2aGEtPmhvc3Rfbm8sIGhhLT56aW9fbW9kZSwKIAkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkgICAgIlpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICglZCB1cykuXG4iLApAQCAtMzcxNywzNiArMzgxMCwzNyBAQAogCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiB8PSBjcHVfdG9fbGUzMigKIAkJICAgICh1aW50MzJfdCloYS0+emlvX21vZGUpOwogCQlpY2ItPmludGVycnVwdF9kZWxheV90aW1lciA9IGNwdV90b19sZTE2KGhhLT56aW9fdGltZXIpOwotCQloYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CisJCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CiAJfQogCiAJaWYgKHJ2YWwpIHsKIAkJREVCVUcyXzMocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkKTogTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQhXG4iLCBoYS0+aG9zdF9ubykpOworCQkgICAgInNjc2koJWxkKTogTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQhXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAJcmV0dXJuIChydmFsKTsKIH0KIAogc3RhdGljIGludAotcWxhMjR4eF9sb2FkX3Jpc2NfZmxhc2goc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgKnNyaXNjX2FkZHIpCitxbGEyNHh4X2xvYWRfcmlzY19mbGFzaChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgKnNyaXNjX2FkZHIpCiB7Ci0JaW50CXJ2YWw7CisJaW50CXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlpbnQJc2VnbWVudHMsIGZyYWdtZW50OwogCXVpbnQzMl90IGZhZGRyOwogCXVpbnQzMl90ICpkY29kZSwgZGxlbjsKIAl1aW50MzJfdCByaXNjX2FkZHI7CiAJdWludDMyX3QgcmlzY19zaXplOwogCXVpbnQzMl90IGk7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKIAlzZWdtZW50cyA9IEZBX1JJU0NfQ09ERV9TRUdNRU5UUzsKIAlmYWRkciA9IGhhLT5mbHRfcmVnaW9uX2Z3OwotCWRjb2RlID0gKHVpbnQzMl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlkY29kZSA9ICh1aW50MzJfdCAqKXJlcS0+cmluZzsKIAkqc3Jpc2NfYWRkciA9IDA7CiAKIAkvKiBWYWxpZGF0ZSBmaXJtd2FyZSBpbWFnZSBieSBjaGVja2luZyB2ZXJzaW9uLiAqLwotCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgZmFkZHIgKyA0LCA0KTsKKwlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YSh2aGEsIGRjb2RlLCBmYWRkciArIDQsIDQpOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCWRjb2RlW2ldID0gYmUzMl90b19jcHUoZGNvZGVbaV0pOwogCWlmICgoZGNvZGVbMF0gPT0gMHhmZmZmZmZmZiAmJiBkY29kZVsxXSA9PSAweGZmZmZmZmZmICYmCkBAIC0zNzY0LDcgKzM4NTgsNyBAQAogCiAJd2hpbGUgKHNlZ21lbnRzICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJLyogUmVhZCBzZWdtZW50J3MgbG9hZCBpbmZvcm1hdGlvbi4gKi8KLQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRjb2RlLCBmYWRkciwgNCk7CisJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIGZhZGRyLCA0KTsKIAogCQlyaXNjX2FkZHIgPSBiZTMyX3RvX2NwdShkY29kZVsyXSk7CiAJCSpzcmlzY19hZGRyID0gKnNyaXNjX2FkZHIgPT0gMCA/IHJpc2NfYWRkciA6ICpzcmlzY19hZGRyOwpAQCAtMzc3OCwxNyArMzg3MiwxNyBAQAogCiAJCQlERUJVRzcocHJpbnRrKCJzY3NpKCVsZCk6IExvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjICIKIAkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIGR3b3JkcyAweCV4LCBvZmZzZXQgMHgleC5cbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8sIHJpc2NfYWRkciwgZGxlbiwgZmFkZHIpKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8sIHJpc2NfYWRkciwgZGxlbiwgZmFkZHIpKTsKIAotCQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRjb2RlLCBmYWRkciwgZGxlbik7CisJCQlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YSh2aGEsIGRjb2RlLCBmYWRkciwgZGxlbik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgZGxlbjsgaSsrKQogCQkJCWRjb2RlW2ldID0gc3dhYjMyKGRjb2RlW2ldKTsKIAotCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyLAorCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0odmhhLCByZXEtPmRtYSwgcmlzY19hZGRyLAogCQkJICAgIGRsZW4pOwogCQkJaWYgKHJ2YWwpIHsKIAkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTpbRVJST1JdIEZhaWxlZCB0byBsb2FkICIKLQkJCQkgICAgInNlZ21lbnQgJWQgb2YgZmlybXdhcmVcbiIsIGhhLT5ob3N0X25vLAorCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgdmhhLT5ob3N0X25vLAogCQkJCSAgICBmcmFnbWVudCkpOwogCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiAiCkBAIC0zODEyLDE2ICszOTA2LDE4IEBACiAjZGVmaW5lIFFMQV9GV19VUkwgImZ0cDovL2Z0cC5xbG9naWMuY29tL291dGdvaW5nL2xpbnV4L2Zpcm13YXJlLyIKIAogaW50Ci1xbGEyeDAwX2xvYWRfcmlzYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCAqc3Jpc2NfYWRkcikKK3FsYTJ4MDBfbG9hZF9yaXNjKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCAqc3Jpc2NfYWRkcikKIHsKIAlpbnQJcnZhbDsKIAlpbnQJaSwgZnJhZ21lbnQ7CiAJdWludDE2X3QgKndjb2RlLCAqZndjb2RlOwogCXVpbnQzMl90IHJpc2NfYWRkciwgcmlzY19zaXplLCBmd2NsZW4sIHdsZW4sICpzZWc7CiAJc3RydWN0IGZ3X2Jsb2IgKmJsb2I7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKIAkvKiBMb2FkIGZpcm13YXJlIGJsb2IuICovCi0JYmxvYiA9IHFsYTJ4MDBfcmVxdWVzdF9maXJtd2FyZShoYSk7CisJYmxvYiA9IHFsYTJ4MDBfcmVxdWVzdF9maXJtd2FyZSh2aGEpOwogCWlmICghYmxvYikgewogCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZpcm13YXJlIGltYWdlIHVuYXZhaWxhYmxlLlxuIik7CiAJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmlybXdhcmUgaW1hZ2VzIGNhbiBiZSByZXRyaWV2ZWQgIgpAQCAtMzgzMSw3ICszOTI3LDcgQEAKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAotCXdjb2RlID0gKHVpbnQxNl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwl3Y29kZSA9ICh1aW50MTZfdCAqKXJlcS0+cmluZzsKIAkqc3Jpc2NfYWRkciA9IDA7CiAJZndjb2RlID0gKHVpbnQxNl90ICopYmxvYi0+ZnctPmRhdGE7CiAJZndjbGVuID0gMDsKQEAgLTM4NzgsMTcgKzM5NzQsMTcgQEAKIAkJCQl3bGVuID0gcmlzY19zaXplOwogCiAJCQlERUJVRzcocHJpbnRrKCJzY3NpKCVsZCk6IExvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjICIKLQkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIHdvcmRzIDB4JXguXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIHdvcmRzIDB4JXguXG4iLCB2aGEtPmhvc3Rfbm8sCiAJCQkgICAgcmlzY19hZGRyLCB3bGVuKSk7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCB3bGVuOyBpKyspCiAJCQkJd2NvZGVbaV0gPSBzd2FiMTYoZndjb2RlW2ldKTsKIAotCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyLAorCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0odmhhLCByZXEtPmRtYSwgcmlzY19hZGRyLAogCQkJICAgIHdsZW4pOwogCQkJaWYgKHJ2YWwpIHsKIAkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTpbRVJST1JdIEZhaWxlZCB0byBsb2FkICIKLQkJCQkgICAgInNlZ21lbnQgJWQgb2YgZmlybXdhcmVcbiIsIGhhLT5ob3N0X25vLAorCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgdmhhLT5ob3N0X25vLAogCQkJCSAgICBmcmFnbWVudCkpOwogCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiAiCkBAIC0zOTEyLDcgKzQwMDgsNyBAQAogfQogCiBpbnQKLXFsYTI0eHhfbG9hZF9yaXNjKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90ICpzcmlzY19hZGRyKQorcWxhMjR4eF9sb2FkX3Jpc2Moc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90ICpzcmlzY19hZGRyKQogewogCWludAlydmFsOwogCWludAlzZWdtZW50cywgZnJhZ21lbnQ7CkBAIC0zOTIyLDkgKzQwMTgsMTEgQEAKIAl1aW50MzJfdCBpOwogCXN0cnVjdCBmd19ibG9iICpibG9iOwogCXVpbnQzMl90ICpmd2NvZGUsIGZ3Y2xlbjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAogCS8qIExvYWQgZmlybXdhcmUgYmxvYi4gKi8KLQlibG9iID0gcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKGhhKTsKKwlibG9iID0gcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKHZoYSk7CiAJaWYgKCFibG9iKSB7CiAJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmlybXdhcmUgaW1hZ2UgdW5hdmFpbGFibGUuXG4iKTsKIAkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICJGaXJtd2FyZSBpbWFnZXMgY2FuIGJlIHJldHJpZXZlZCAiCkBAIC0zOTMzLDEzICs0MDMxLDEzIEBACiAJCS8qIFRyeSB0byBsb2FkIFJJU0MgY29kZSBmcm9tIGZsYXNoLiAqLwogCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkF0dGVtcHRpbmcgdG8gbG9hZCAocG90ZW50aWFsbHkgIgogCQkgICAgIm91dGRhdGVkKSBmaXJtd2FyZSBmcm9tIGZsYXNoLlxuIik7Ci0JCXJldHVybiBxbGEyNHh4X2xvYWRfcmlzY19mbGFzaChoYSwgc3Jpc2NfYWRkcik7CisJCXJldHVybiBxbGEyNHh4X2xvYWRfcmlzY19mbGFzaCh2aGEsIHNyaXNjX2FkZHIpOwogCX0KIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAogCXNlZ21lbnRzID0gRkFfUklTQ19DT0RFX1NFR01FTlRTOwotCWRjb2RlID0gKHVpbnQzMl90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlkY29kZSA9ICh1aW50MzJfdCAqKXJlcS0+cmluZzsKIAkqc3Jpc2NfYWRkciA9IDA7CiAJZndjb2RlID0gKHVpbnQzMl90ICopYmxvYi0+ZnctPmRhdGE7CiAJZndjbGVuID0gMDsKQEAgLTM5ODcsMTcgKzQwODUsMTcgQEAKIAkJCQlkbGVuID0gcmlzY19zaXplOwogCiAJCQlERUJVRzcocHJpbnRrKCJzY3NpKCVsZCk6IExvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjICIKLQkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIGR3b3JkcyAweCV4LlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkgICAgImFkZHIgJXgsIG51bWJlciBvZiBkd29yZHMgMHgleC5cbiIsIHZoYS0+aG9zdF9ubywKIAkJCSAgICByaXNjX2FkZHIsIGRsZW4pKTsKIAogCQkJZm9yIChpID0gMDsgaSA8IGRsZW47IGkrKykKIAkJCQlkY29kZVtpXSA9IHN3YWIzMihmd2NvZGVbaV0pOwogCi0JCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbShoYSwgaGEtPnJlcXVlc3RfZG1hLCByaXNjX2FkZHIsCisJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIHJlcS0+ZG1hLCByaXNjX2FkZHIsCiAJCQkgICAgZGxlbik7CiAJCQlpZiAocnZhbCkgewogCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgotCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJICAgICJzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLCB2aGEtPmhvc3Rfbm8sCiAJCQkJICAgIGZyYWdtZW50KSk7CiAJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gbG9hZCBzZWdtZW50ICVkIG9mICIKQEAgLTQwMjEsNDkgKzQxMTksNTMgQEAKIH0KIAogdm9pZAotcWxhMngwMF90cnlfdG9fc3RvcF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF90cnlfdG9fc3RvcF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcmV0LCByZXRyaWVzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm47CiAJaWYgKCFoYS0+ZndfbWFqb3JfdmVyc2lvbikKIAkJcmV0dXJuOwogCi0JcmV0ID0gcWxhMngwMF9zdG9wX2Zpcm13YXJlKGhhKTsKKwlyZXQgPSBxbGEyeDAwX3N0b3BfZmlybXdhcmUodmhhKTsKIAlmb3IgKHJldHJpZXMgPSA1OyByZXQgIT0gUUxBX1NVQ0NFU1MgJiYgcmV0ICE9IFFMQV9GVU5DVElPTl9USU1FT1VUICYmCiAJICAgIHJldHJpZXMgOyByZXRyaWVzLS0pIHsKLQkJaGEtPmlzcF9vcHMtPnJlc2V0X2NoaXAoaGEpOwotCQlpZiAoaGEtPmlzcF9vcHMtPmNoaXBfZGlhZyhoYSkgIT0gUUxBX1NVQ0NFU1MpCisJCWhhLT5pc3Bfb3BzLT5yZXNldF9jaGlwKHZoYSk7CisJCWlmIChoYS0+aXNwX29wcy0+Y2hpcF9kaWFnKHZoYSkgIT0gUUxBX1NVQ0NFU1MpCiAJCQljb250aW51ZTsKLQkJaWYgKHFsYTJ4MDBfc2V0dXBfY2hpcChoYSkgIT0gUUxBX1NVQ0NFU1MpCisJCWlmIChxbGEyeDAwX3NldHVwX2NoaXAodmhhKSAhPSBRTEFfU1VDQ0VTUykKIAkJCWNvbnRpbnVlOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiQXR0ZW1wdGluZyByZXRyeSBvZiBzdG9wLWZpcm13YXJlIGNvbW1hbmQuLi5cbiIpOwotCQlyZXQgPSBxbGEyeDAwX3N0b3BfZmlybXdhcmUoaGEpOworCQlyZXQgPSBxbGEyeDAwX3N0b3BfZmlybXdhcmUodmhhKTsKIAl9CiB9CiAKIGludAotcWxhMjR4eF9jb25maWd1cmVfdmhiYShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF9jb25maWd1cmVfdmhiYShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOwogCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CiAKLQlpZiAoIWhhLT5wYXJlbnQpCisJaWYgKCF2aGEtPnZwX2lkeCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlydmFsID0gcWxhMngwMF9md19yZWFkeShoYS0+cGFyZW50KTsKKwlydmFsID0gcWxhMngwMF9md19yZWFkeShiYXNlX3ZoYSk7CiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJcWxhMngwMF9tYXJrZXIoaGEsIDAsIDAsIE1LX1NZTkNfQUxMKTsKKwkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCXFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsIE1LX1NZTkNfQUxMKTsKIAl9CiAKLQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKKwl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CiAKIAkvKiBMb2dpbiB0byBTTlMgZmlyc3QgKi8KLQlxbGEyNHh4X2xvZ2luX2ZhYnJpYyhoYS0+cGFyZW50LCBOUEhfU05TLCAweGZmLCAweGZmLCAweGZjLAotCSAgICBtYiwgQklUXzEpOworCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9naW4odmhhLCBOUEhfU05TLCAweGZmLCAweGZmLCAweGZjLCBtYiwgQklUXzEpOwogCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewogCQlERUJVRzE1KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKIAkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4ICIKQEAgLTQwNzIsMTEgKzQxNzQsMTEgQEAKIAkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKIAl9CiAKLQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCAwKTsKLQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUCk7Ci0Jc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7Ci0JcnZhbCA9IHFsYTJ4MDBfbG9vcF9yZXN5bmMoaGEtPnBhcmVudCk7CisJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIDApOworCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUCk7CisJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwlydmFsID0gcWxhMngwMF9sb29wX3Jlc3luYyhiYXNlX3ZoYSk7CiAKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTQwODcsOSArNDE4OSwxMCBAQAogc3RhdGljIERFRklORV9NVVRFWChxbGFfY3M4NHh4X211dGV4KTsKIAogc3RhdGljIHN0cnVjdCBxbGFfY2hpcF9zdGF0ZV84NHh4ICoKLXFsYTg0eHhfZ2V0X2NoaXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorcWxhODR4eF9nZXRfY2hpcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogewogCXN0cnVjdCBxbGFfY2hpcF9zdGF0ZV84NHh4ICpjczg0eHg7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAltdXRleF9sb2NrKCZxbGFfY3M4NHh4X211dGV4KTsKIApAQCAtNDEyOSwyMSArNDIzMiwyMyBAQAogfQogCiB2b2lkCi1xbGE4NHh4X3B1dF9jaGlwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTg0eHhfcHV0X2NoaXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpZiAoaGEtPmNzODR4eCkKIAkJa3JlZl9wdXQoJmhhLT5jczg0eHgtPmtyZWYsIF9fcWxhODR4eF9jaGlwX3JlbGVhc2UpOwogfQogCiBzdGF0aWMgaW50Ci1xbGE4NHh4X2luaXRfY2hpcChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhODR4eF9pbml0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7CiAJdWludDE2X3Qgc3RhdHVzWzJdOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJbXV0ZXhfbG9jaygmaGEtPmNzODR4eC0+ZndfdXBkYXRlX211dGV4KTsKIAotCXJ2YWwgPSBxbGE4NHh4X3ZlcmlmeV9jaGlwKGhhLCBzdGF0dXMpOworCXJ2YWwgPSBxbGE4NHh4X3ZlcmlmeV9jaGlwKHZoYSwgc3RhdHVzKTsKIAogCW11dGV4X3VubG9jaygmaGEtPmNzODR4eC0+ZndfdXBkYXRlX211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCmluZGV4IGU5MGFmYWQuLjVlMGE3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKQEAgLTMyLDQ3ICszMiwxNSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTJ4MDBfcG9sbChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9wb2xsKHN0cnVjdCByc3BfcXVlICpyc3ApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSByc3AtPmh3OwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQloYS0+aXNwX29wcy0+aW50cl9oYW5kbGVyKDAsIGhhKTsKKwloYS0+aXNwX29wcy0+aW50cl9oYW5kbGVyKDAsIHJzcCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBzY3NpX3FsYV9ob3N0X3QgKgotdG9fcWxhX3BhcmVudChzY3NpX3FsYV9ob3N0X3QgKmhhKQotewotCXJldHVybiBoYS0+cGFyZW50ID8gaGEtPnBhcmVudCA6IGhhOwotfQotCi0vKioKLSAqIHFsYTJ4MDBfaXNzdWVfbWFya2VyKCkgLSBJc3N1ZSBhIE1hcmtlciBJT0NCIGlmIG5lY2Vzc2FyeS4KLSAqIEBoYTogSEEgY29udGV4dAotICogQGhhX2xvY2tlZDogaXMgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIGhhcmR3YXJlIGxvY2sKLSAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cnJlZCwgZWxzZSB6ZXJvLgotICovCi1zdGF0aWMgaW5saW5lIGludAotcWxhMngwMF9pc3N1ZV9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGhhX2xvY2tlZCkKLXsKLQkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLwotCWlmIChoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7Ci0JCWlmIChoYV9sb2NrZWQpIHsKLQkJCWlmIChfX3FsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KLQkJCSAgICBRTEFfU1VDQ0VTUykKLQkJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwotCQl9IGVsc2UgewotCQkJaWYgKHFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KLQkJCSAgICBRTEFfU1VDQ0VTUykKLQkJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwotCQl9Ci0JCWhhLT5tYXJrZXJfbmVlZGVkID0gMDsKLQl9Ci0JcmV0dXJuIChRTEFfU1VDQ0VTUyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdWludDhfdCAqCiBob3N0X3RvX2ZjcF9zd2FwKHVpbnQ4X3QgKmZjcCwgdWludDMyX3QgYnNpemUpCiB7CkBAIC04NywxMSArNTUsMTIgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXFsYTJ4MDBfaXNfcmVzZXJ2ZWRfaWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCkKK3FsYTJ4MDBfaXNfcmVzZXJ2ZWRfaWQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGxvb3BfaWQpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiAobG9vcF9pZCA+IE5QSF9MQVNUX0hBTkRMRSk7CiAKLQlyZXR1cm4gKChsb29wX2lkID4gaGEtPmxhc3RfbG9vcF9pZCAmJiBsb29wX2lkIDwgU05TX0ZJUlNUX0xPT1BfSUQpIHx8CisJcmV0dXJuICgobG9vcF9pZCA+IGhhLT5tYXhfbG9vcF9pZCAmJiBsb29wX2lkIDwgU05TX0ZJUlNUX0xPT1BfSUQpIHx8CiAJICAgIGxvb3BfaWQgPT0gTUFOQUdFTUVOVF9TRVJWRVIgfHwgbG9vcF9pZCA9PSBCUk9BRENBU1QpOwotfTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCmluZGV4IDg1YmMwYTQuLjViZWRjOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwpAQCAtMTEsOCArMTEsOSBAQAogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogCi1zdGF0aWMgcmVxdWVzdF90ICpxbGEyeDAwX3JlcV9wa3Qoc2NzaV9xbGFfaG9zdF90ICpoYSk7Ci1zdGF0aWMgdm9pZCBxbGEyeDAwX2lzcF9jbWQoc2NzaV9xbGFfaG9zdF90ICpoYSk7CitzdGF0aWMgcmVxdWVzdF90ICpxbGEyeDAwX3JlcV9wa3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlcV9xdWUgKiwKKwkJCQkJCQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfaXNwX2NtZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3QgcmVxX3F1ZSAqKTsKIAogLyoqCiAgKiBxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKCkgLSBEZXRlcm1pbmUgY29udHJvbF9mbGFnIGRhdGEgZGlyZWN0aW9uLgpAQCAtMzAsMTEgKzMxLDExIEBACiAJLyogU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiAqLwogCWlmIChzcC0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCWNmbGFncyA9IENGX1dSSVRFOwotCQlzcC0+ZmNwb3J0LT5oYS0+cWxhX3N0YXRzLm91dHB1dF9ieXRlcyArPQorCQlzcC0+ZmNwb3J0LT52aGEtPmh3LT5xbGFfc3RhdHMub3V0cHV0X2J5dGVzICs9CiAJCSAgICBzY3NpX2J1ZmZsZW4oc3AtPmNtZCk7CiAJfSBlbHNlIGlmIChzcC0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKIAkJY2ZsYWdzID0gQ0ZfUkVBRDsKLQkJc3AtPmZjcG9ydC0+aGEtPnFsYV9zdGF0cy5pbnB1dF9ieXRlcyArPQorCQlzcC0+ZmNwb3J0LT52aGEtPmh3LT5xbGFfc3RhdHMuaW5wdXRfYnl0ZXMgKz0KIAkJICAgIHNjc2lfYnVmZmxlbihzcC0+Y21kKTsKIAl9CiAJcmV0dXJuIChjZmxhZ3MpOwpAQCAtOTEsMjAgKzkyLDE5IEBACiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQ29udGludWF0aW9uIFR5cGUgMCBJT0NCIHBhY2tldC4KICAqLwogc3RhdGljIGlubGluZSBjb250X2VudHJ5X3QgKgotcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYihzdHJ1Y3QgcmVxX3F1ZSAqcmVxLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogewogCWNvbnRfZW50cnlfdCAqY29udF9wa3Q7Ci0KIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KLQloYS0+cmVxX3JpbmdfaW5kZXgrKzsKLQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7Ci0JCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7Ci0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwlyZXEtPnJpbmdfaW5kZXgrKzsKKwlpZiAocmVxLT5yaW5nX2luZGV4ID09IHJlcS0+bGVuZ3RoKSB7CisJCXJlcS0+cmluZ19pbmRleCA9IDA7CisJCXJlcS0+cmluZ19wdHIgPSByZXEtPnJpbmc7CiAJfSBlbHNlIHsKLQkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKwkJcmVxLT5yaW5nX3B0cisrOwogCX0KIAotCWNvbnRfcGt0ID0gKGNvbnRfZW50cnlfdCAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCWNvbnRfcGt0ID0gKGNvbnRfZW50cnlfdCAqKXJlcS0+cmluZ19wdHI7CiAKIAkvKiBMb2FkIHBhY2tldCBkZWZhdWx0cy4gKi8KIAkqKCh1aW50MzJfdCAqKSgmY29udF9wa3QtPmVudHJ5X3R5cGUpKSA9CkBAIC0xMjAsMjAgKzEyMCwyMCBAQAogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbnRpbnVhdGlvbiB0eXBlIDEgSU9DQiBwYWNrZXQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgY29udF9hNjRfZW50cnlfdCAqCi1xbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHN0cnVjdCByZXFfcXVlICpyZXEsIHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWNvbnRfYTY0X2VudHJ5X3QgKmNvbnRfcGt0OwogCiAJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCi0JaGEtPnJlcV9yaW5nX2luZGV4Kys7Ci0JaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBoYS0+cmVxdWVzdF9xX2xlbmd0aCkgewotCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOwotCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJcmVxLT5yaW5nX2luZGV4Kys7CisJaWYgKHJlcS0+cmluZ19pbmRleCA9PSByZXEtPmxlbmd0aCkgeworCQlyZXEtPnJpbmdfaW5kZXggPSAwOworCQlyZXEtPnJpbmdfcHRyID0gcmVxLT5yaW5nOwogCX0gZWxzZSB7Ci0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisJCXJlcS0+cmluZ19wdHIrKzsKIAl9CiAKLQljb250X3BrdCA9IChjb250X2E2NF9lbnRyeV90ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisJY29udF9wa3QgPSAoY29udF9hNjRfZW50cnlfdCAqKXJlcS0+cmluZ19wdHI7CiAKIAkvKiBMb2FkIHBhY2tldCBkZWZhdWx0cy4gKi8KIAkqKCh1aW50MzJfdCAqKSgmY29udF9wa3QtPmVudHJ5X3R5cGUpKSA9CkBAIC0xNTUsMTAgKzE1NSwxMSBAQAogewogCXVpbnQxNl90CWF2YWlsX2RzZHM7CiAJdWludDMyX3QJKmN1cl9kc2Q7Ci0Jc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlzY3NpX3FsYV9ob3N0X3QJKnZoYTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgaTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOwogCiAJY21kID0gc3AtPmNtZDsKIApAQCAtMTcyLDcgKzE3Myw4IEBACiAJCXJldHVybjsKIAl9CiAKLQloYSA9IHNwLT5oYTsKKwl2aGEgPSBzcC0+dmhhOworCXJlcSA9IHNwLT5xdWU7CiAKIAljbWRfcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oc3ApKTsKIApAQCAtMTkwLDcgKzE5Miw3IEBACiAJCQkgKiBTZXZlbiBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnRpbnVhdGlvbgogCQkJICogVHlwZSAwIElPQ0IuCiAJCQkgKi8KLQkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYihoYSk7CisJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUwX2lvY2IocmVxLCB2aGEpOwogCQkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKSZjb250X3BrdC0+ZHNlZ18wX2FkZHJlc3M7CiAJCQlhdmFpbF9kc2RzID0gNzsKIAkJfQpAQCAtMjE0LDEwICsyMTYsMTEgQEAKIHsKIAl1aW50MTZfdAlhdmFpbF9kc2RzOwogCXVpbnQzMl90CSpjdXJfZHNkOwotCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc2NzaV9xbGFfaG9zdF90CSp2aGE7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IGk7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAogCWNtZCA9IHNwLT5jbWQ7CiAKQEAgLTIzMSw3ICsyMzQsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaGEgPSBzcC0+aGE7CisJdmhhID0gc3AtPnZoYTsKKwlyZXEgPSBzcC0+cXVlOwogCiAJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHNwKSk7CiAKQEAgLTI1MCw3ICsyNTQsNyBAQAogCQkJICogRml2ZSBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnRpbnVhdGlvbgogCQkJICogVHlwZSAxIElPQ0IuCiAJCQkgKi8KLQkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYihoYSk7CisJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IocmVxLCB2aGEpOwogCQkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKWNvbnRfcGt0LT5kc2VnXzBfYWRkcmVzczsKIAkJCWF2YWlsX2RzZHMgPSA1OwogCQl9CkBAIC0yNzQsNyArMjc4LDcgQEAKIHsKIAlpbnQJCXJldCwgbnNlZzsKIAl1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0Jc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlzY3NpX3FsYV9ob3N0X3QJKnZoYTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJdWludDMyX3QJKmNscl9wdHI7CiAJdWludDMyX3QgICAgICAgIGluZGV4OwpAQCAtMjg0LDMzICsyODgsMzkgQEAKIAl1aW50MTZfdAlyZXFfY250OwogCXVpbnQxNl90CXRvdF9kc2RzOwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCiAJLyogU2V0dXAgZGV2aWNlIHBvaW50ZXJzLiAqLwogCXJldCA9IDA7Ci0JaGEgPSBzcC0+aGE7CisJdmhhID0gc3AtPnZoYTsKKwloYSA9IHZoYS0+aHc7CiAJcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAljbWQgPSBzcC0+Y21kOworCXJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJcnNwID0gaGEtPnJzcF9xX21hcFswXTsKIAkvKiBTbyB3ZSBrbm93IHdlIGhhdmVuJ3QgcGNpX21hcCdlZCBhbnl0aGluZyB5ZXQgKi8KIAl0b3RfZHNkcyA9IDA7CiAKIAkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLwotCWlmIChoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7Ci0JCWlmIChxbGEyeDAwX21hcmtlcihoYSwgMCwgMCwgTUtfU1lOQ19BTEwpICE9IFFMQV9TVUNDRVNTKSB7CisJaWYgKHZoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7CisJCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkKKwkJCQkJCQkhPSBRTEFfU1VDQ0VTUykKIAkJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7Ci0JCX0KLQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwogCX0KIAogCS8qIEFjcXVpcmUgcmluZyBzcGVjaWZpYyBsb2NrICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAkvKiBDaGVjayBmb3Igcm9vbSBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCi0JaGFuZGxlID0gaGEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOworCWhhbmRsZSA9IHJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQ7CiAJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBpbmRleCsrKSB7CiAJCWhhbmRsZSsrOwogCQlpZiAoaGFuZGxlID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKIAkJCWhhbmRsZSA9IDE7Ci0JCWlmICghaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSkKKwkJaWYgKCFyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSkKIAkJCWJyZWFrOwogCX0KIAlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQpAQCAtMzI5LDI1ICszMzksMjYgQEAKIAogCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlcXVlc3QgZW50cmllcyBuZWVkZWQuICovCiAJcmVxX2NudCA9IGhhLT5pc3Bfb3BzLT5jYWxjX3JlcV9lbnRyaWVzKHRvdF9kc2RzKTsKLQlpZiAoaGEtPnJlcV9xX2NudCA8IChyZXFfY250ICsgMikpIHsKKwlpZiAocmVxLT5jbnQgPCAocmVxX2NudCArIDIpKSB7CiAJCWNudCA9IFJEX1JFR19XT1JEX1JFTEFYRUQoSVNQX1JFUV9RX09VVChoYSwgcmVnKSk7Ci0JCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCi0JCQloYS0+cmVxX3FfY250ID0gY250IC0gaGEtPnJlcV9yaW5nX2luZGV4OworCQlpZiAocmVxLT5yaW5nX2luZGV4IDwgY250KQorCQkJcmVxLT5jbnQgPSBjbnQgLSByZXEtPnJpbmdfaW5kZXg7CiAJCWVsc2UKLQkJCWhhLT5yZXFfcV9jbnQgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCAtCi0JCQkgICAgKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CisJCQlyZXEtPmNudCA9IHJlcS0+bGVuZ3RoIC0KKwkJCSAgICAocmVxLT5yaW5nX2luZGV4IC0gY250KTsKIAl9Ci0JaWYgKGhhLT5yZXFfcV9jbnQgPCAocmVxX2NudCArIDIpKQorCWlmIChyZXEtPmNudCA8IChyZXFfY250ICsgMikpCiAJCWdvdG8gcXVldWluZ19lcnJvcjsKIAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0ICovCi0JaGEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gaGFuZGxlOwotCWhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKLQlzcC0+aGEgPSBoYTsKKwlyZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gaGFuZGxlOworCXJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID0gc3A7CisJc3AtPnZoYSA9IHZoYTsKKwlzcC0+cXVlID0gcmVxOwogCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKWhhbmRsZTsKLQloYS0+cmVxX3FfY250IC09IHJlcV9jbnQ7CisJcmVxLT5jbnQgLT0gcmVxX2NudDsKIAotCWNtZF9wa3QgPSAoY21kX2VudHJ5X3QgKiloYS0+cmVxdWVzdF9yaW5nX3B0cjsKKwljbWRfcGt0ID0gKGNtZF9lbnRyeV90ICopcmVxLT5yaW5nX3B0cjsKIAljbWRfcGt0LT5oYW5kbGUgPSBoYW5kbGU7CiAJLyogWmVybyBvdXQgcmVtYWluaW5nIHBvcnRpb24gb2YgcGFja2V0LiAqLwogCWNscl9wdHIgPSAodWludDMyX3QgKiljbWRfcGt0ICsgMjsKQEAgLTM3MywyMyArMzg0LDIzIEBACiAJd21iKCk7CiAKIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KLQloYS0+cmVxX3JpbmdfaW5kZXgrKzsKLQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7Ci0JCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7Ci0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwlyZXEtPnJpbmdfaW5kZXgrKzsKKwlpZiAocmVxLT5yaW5nX2luZGV4ID09IHJlcS0+bGVuZ3RoKSB7CisJCXJlcS0+cmluZ19pbmRleCA9IDA7CisJCXJlcS0+cmluZ19wdHIgPSByZXEtPnJpbmc7CiAJfSBlbHNlCi0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisJCXJlcS0+cmluZ19wdHIrKzsKIAogCXNwLT5mbGFncyB8PSBTUkJfRE1BX1ZBTElEOwogCiAJLyogU2V0IGNoaXAgbmV3IHJpbmcgaW5kZXguICovCi0JV1JUX1JFR19XT1JEKElTUF9SRVFfUV9JTihoYSwgcmVnKSwgaGEtPnJlcV9yaW5nX2luZGV4KTsKKwlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCByZWcpLCByZXEtPnJpbmdfaW5kZXgpOwogCVJEX1JFR19XT1JEX1JFTEFYRUQoSVNQX1JFUV9RX0lOKGhhLCByZWcpKTsJLyogUENJIFBvc3RpbmcuICovCiAKIAkvKiBNYW5hZ2UgdW5wcm9jZXNzZWQgUklPL1pJTyBjb21tYW5kcyBpbiByZXNwb25zZSBxdWV1ZS4gKi8KLQlpZiAoaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgJiYKLQkgICAgaGEtPnJlc3BvbnNlX3JpbmdfcHRyLT5zaWduYXR1cmUgIT0gUkVTUE9OU0VfUFJPQ0VTU0VEKQotCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCWlmICh2aGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgJiYKKwkgICAgcnNwLT5yaW5nX3B0ci0+c2lnbmF0dXJlICE9IFJFU1BPTlNFX1BST0NFU1NFRCkKKwkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHJzcCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAoUUxBX1NVQ0NFU1MpOwpAQCAtNDE1LDE4ICs0MjYsMjAgQEAKICAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VycmVkLCBlbHNlIHplcm8uCiAgKi8KIGludAotX19xbGEyeDAwX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50MTZfdCBsdW4sCi0gICAgdWludDhfdCB0eXBlKQorX19xbGEyeDAwX21hcmtlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAorCQkJc3RydWN0IHJzcF9xdWUgKnJzcCwgdWludDE2X3QgbG9vcF9pZCwKKwkJCXVpbnQxNl90IGx1biwgdWludDhfdCB0eXBlKQogewogCW1ya19lbnRyeV90ICptcms7CiAJc3RydWN0IG1ya19lbnRyeV8yNHh4ICptcmsyNDsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJbXJrMjQgPSBOVUxMOwotCW1yayA9IChtcmtfZW50cnlfdCAqKXFsYTJ4MDBfcmVxX3BrdChwaGEpOworCW1yayA9IChtcmtfZW50cnlfdCAqKXFsYTJ4MDBfcmVxX3BrdCh2aGEsIHJlcSwgcnNwKTsKIAlpZiAobXJrID09IE5VTEwpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgTWFya2VyIElPQ0IuXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAogCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwogCX0KQEAgLTQ0MCw3ICs0NTMsNyBAQAogCQkJbXJrMjQtPmx1blsxXSA9IExTQihsdW4pOwogCQkJbXJrMjQtPmx1blsyXSA9IE1TQihsdW4pOwogCQkJaG9zdF90b19mY3Bfc3dhcChtcmsyNC0+bHVuLCBzaXplb2YobXJrMjQtPmx1bikpOwotCQkJbXJrMjQtPnZwX2luZGV4ID0gaGEtPnZwX2lkeDsKKwkJCW1yazI0LT52cF9pbmRleCA9IHZoYS0+dnBfaWR4OwogCQl9IGVsc2UgewogCQkJU0VUX1RBUkdFVF9JRChoYSwgbXJrLT50YXJnZXQsIGxvb3BfaWQpOwogCQkJbXJrLT5sdW4gPSBjcHVfdG9fbGUxNihsdW4pOwpAQCAtNDQ4LDIyICs0NjEsMjIgQEAKIAl9CiAJd21iKCk7CiAKLQlxbGEyeDAwX2lzcF9jbWQocGhhKTsKKwlxbGEyeDAwX2lzcF9jbWQodmhhLCByZXEpOwogCiAJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CiB9CiAKIGludAotcWxhMngwMF9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDE2X3QgbHVuLAotICAgIHVpbnQ4X3QgdHlwZSkKK3FsYTJ4MDBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCisJCXN0cnVjdCByc3BfcXVlICpyc3AsIHVpbnQxNl90IGxvb3BfaWQsIHVpbnQxNl90IGx1biwKKwkJdWludDhfdCB0eXBlKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSBfX3FsYTJ4MDBfbWFya2VyKGhhLCBsb29wX2lkLCBsdW4sIHR5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGEtPmh3LT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcmV0ID0gX19xbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCBsb29wX2lkLCBsdW4sIHR5cGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoYS0+aHctPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAocmV0KTsKIH0KQEAgLTQ3Nyw5ICs0OTAsMTEgQEAKICAqIFJldHVybnMgTlVMTCBpZiBmdW5jdGlvbiBmYWlsZWQsIGVsc2UsIGEgcG9pbnRlciB0byB0aGUgcmVxdWVzdCBwYWNrZXQuCiAgKi8KIHN0YXRpYyByZXF1ZXN0X3QgKgotcWxhMngwMF9yZXFfcGt0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3JlcV9wa3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwKKwkJc3RydWN0IHJzcF9xdWUgKnJzcCkKIHsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gSVNQX1FVRV9SRUcoaGEsIHJlcS0+aWQpOwogCXJlcXVlc3RfdAkqcGt0ID0gTlVMTDsKIAl1aW50MTZfdAljbnQ7CiAJdWludDMyX3QJKmR3b3JkX3B0cjsKQEAgLTQ4OCwyNCArNTAzLDI5IEBACiAKIAkvKiBXYWl0IDEgc2Vjb25kIGZvciBzbG90LiAqLwogCWZvciAodGltZXIgPSBIWjsgdGltZXI7IHRpbWVyLS0pIHsKLQkJaWYgKChyZXFfY250ICsgMikgPj0gaGEtPnJlcV9xX2NudCkgeworCQlpZiAoKHJlcV9jbnQgKyAyKSA+PSByZXEtPmNudCkgewogCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmcmVlIHJlcXVlc3QgZW50cmllcy4gKi8KLQkJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQotCQkJCWNudCA9ICh1aW50MTZfdClSRF9SRUdfRFdPUkQoCi0JCQkJICAgICZyZWctPmlzcDI0LnJlcV9xX291dCk7CisJCQlpZiAoaGEtPm1xZW5hYmxlKQorCQkJCWNudCA9ICh1aW50MTZfdCkKKwkJCQkJUkRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucmVxX3Ffb3V0KTsKKwkJCWVsc2UgeworCQkJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQorCQkJCQljbnQgPSAodWludDE2X3QpUkRfUkVHX0RXT1JEKAorCQkJCQkJJnJlZy0+aXNwMjQucmVxX3Ffb3V0KTsKKwkJCQllbHNlCisJCQkJCWNudCA9IHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIoCisJCQkJCQlJU1BfUkVRX1FfT1VUKGhhLCAmcmVnLT5pc3ApKTsKKwkJCX0KKwkJCWlmICAocmVxLT5yaW5nX2luZGV4IDwgY250KQorCQkJCXJlcS0+Y250ID0gY250IC0gcmVxLT5yaW5nX2luZGV4OwogCQkJZWxzZQotCQkJCWNudCA9IHFsYTJ4MDBfZGVib3VuY2VfcmVnaXN0ZXIoCi0JCQkJICAgIElTUF9SRVFfUV9PVVQoaGEsICZyZWctPmlzcCkpOwotCQkJaWYgIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCi0JCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKLQkJCWVsc2UKLQkJCQloYS0+cmVxX3FfY250ID0gaGEtPnJlcXVlc3RfcV9sZW5ndGggLQotCQkJCSAgICAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwkJCQlyZXEtPmNudCA9IHJlcS0+bGVuZ3RoIC0KKwkJCQkgICAgKHJlcS0+cmluZ19pbmRleCAtIGNudCk7CiAJCX0KIAkJLyogSWYgcm9vbSBmb3IgcmVxdWVzdCBpbiByZXF1ZXN0IHJpbmcuICovCi0JCWlmICgocmVxX2NudCArIDIpIDwgaGEtPnJlcV9xX2NudCkgewotCQkJaGEtPnJlcV9xX2NudC0tOwotCQkJcGt0ID0gaGEtPnJlcXVlc3RfcmluZ19wdHI7CisJCWlmICgocmVxX2NudCArIDIpIDwgcmVxLT5jbnQpIHsKKwkJCXJlcS0+Y250LS07CisJCQlwa3QgPSByZXEtPnJpbmdfcHRyOwogCiAJCQkvKiBaZXJvIG91dCBwYWNrZXQuICovCiAJCQlkd29yZF9wdHIgPSAodWludDMyX3QgKilwa3Q7CkBAIC01MTMsNyArNTMzLDcgQEAKIAkJCQkqZHdvcmRfcHRyKysgPSAwOwogCiAJCQkvKiBTZXQgc3lzdGVtIGRlZmluZWQgZmllbGQuICovCi0JCQlwa3QtPnN5c19kZWZpbmUgPSAodWludDhfdCloYS0+cmVxX3JpbmdfaW5kZXg7CisJCQlwa3QtPnN5c19kZWZpbmUgPSAodWludDhfdClyZXEtPnJpbmdfaW5kZXg7CiAKIAkJCS8qIFNldCBlbnRyeSBjb3VudC4gKi8KIAkJCXBrdC0+ZW50cnlfY291bnQgPSAxOwpAQCAtNTIyLDE1ICs1NDIsMTQgQEAKIAkJfQogCiAJCS8qIFJlbGVhc2UgcmluZyBzcGVjaWZpYyBsb2NrICovCi0JCXNwaW5fdW5sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwogCiAJCXVkZWxheSgyKTsgICAvKiAyIHVzICovCiAKIAkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KIAkJLyogRHVyaW5nIGluaXQgd2UgaXNzdWUgbWFya2VyIGRpcmVjdGx5ICovCi0JCWlmICghaGEtPm1hcmtlcl9uZWVkZWQgJiYgIWhhLT5mbGFncy5pbml0X2RvbmUpCi0JCQlxbGEyeDAwX3BvbGwoaGEpOwotCisJCWlmICghdmhhLT5tYXJrZXJfbmVlZGVkICYmICF2aGEtPmZsYWdzLmluaXRfZG9uZSkKKwkJCXFsYTJ4MDBfcG9sbChyc3ApOwogCQlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CiAJfQogCWlmICghcGt0KSB7CkBAIC01NDcsMjkgKzU2NiwzOCBAQAogICogTm90ZTogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIGhhcmR3YXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9pc3BfY21kKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2lzcF9jbWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSkKIHsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gSVNQX1FVRV9SRUcoaGEsIHJlcS0+aWQpOworCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqaW9yZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCiAJREVCVUc1KHByaW50aygiJXMoKTogSU9DQiBkYXRhOlxuIiwgX19mdW5jX18pKTsKIAlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcigKLQkgICAgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nX3B0ciwgUkVRVUVTVF9FTlRSWV9TSVpFKSk7CisJICAgICh1aW50OF90ICopcmVxLT5yaW5nX3B0ciwgUkVRVUVTVF9FTlRSWV9TSVpFKSk7CiAKIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KLQloYS0+cmVxX3JpbmdfaW5kZXgrKzsKLQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7Ci0JCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7Ci0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwlyZXEtPnJpbmdfaW5kZXgrKzsKKwlpZiAocmVxLT5yaW5nX2luZGV4ID09IHJlcS0+bGVuZ3RoKSB7CisJCXJlcS0+cmluZ19pbmRleCA9IDA7CisJCXJlcS0+cmluZ19wdHIgPSByZXEtPnJpbmc7CiAJfSBlbHNlCi0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisJCXJlcS0+cmluZ19wdHIrKzsKIAogCS8qIFNldCBjaGlwIG5ldyByaW5nIGluZGV4LiAqLwotCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucmVxX3FfaW4sIGhhLT5yZXFfcmluZ19pbmRleCk7Ci0JCVJEX1JFR19EV09SRF9SRUxBWEVEKCZyZWctPmlzcDI0LnJlcV9xX2luKTsKLQl9IGVsc2UgewotCQlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCAmcmVnLT5pc3ApLCBoYS0+cmVxX3JpbmdfaW5kZXgpOwotCQlSRF9SRUdfV09SRF9SRUxBWEVEKElTUF9SRVFfUV9JTihoYSwgJnJlZy0+aXNwKSk7CisJaWYgKGhhLT5tcWVuYWJsZSkgeworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucmVxX3FfaW4sIHJlcS0+cmluZ19pbmRleCk7CisJCVJEX1JFR19EV09SRCgmaW9yZWctPmhjY3IpOworCX0KKwllbHNlIHsKKwkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKKwkJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucmVxX3FfaW4sIHJlcS0+cmluZ19pbmRleCk7CisJCQlSRF9SRUdfRFdPUkRfUkVMQVhFRCgmcmVnLT5pc3AyNC5yZXFfcV9pbik7CisJCX0gZWxzZSB7CisJCQlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCAmcmVnLT5pc3ApLAorCQkJCXJlcS0+cmluZ19pbmRleCk7CisJCQlSRF9SRUdfV09SRF9SRUxBWEVEKElTUF9SRVFfUV9JTihoYSwgJnJlZy0+aXNwKSk7CisJCX0KIAl9CiAKIH0KQEAgLTYxMCwxMCArNjM4LDExIEBACiB7CiAJdWludDE2X3QJYXZhaWxfZHNkczsKIAl1aW50MzJfdAkqY3VyX2RzZDsKLQlzY3NpX3FsYV9ob3N0X3QJKmhhOworCXNjc2lfcWxhX2hvc3RfdAkqdmhhOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOworCXN0cnVjdCByZXFfcXVlICpyZXE7CiAKIAljbWQgPSBzcC0+Y21kOwogCkBAIC02MjcsMTggKzY1NiwxOSBAQAogCQlyZXR1cm47CiAJfQogCi0JaGEgPSBzcC0+aGE7CisJdmhhID0gc3AtPnZoYTsKKwlyZXEgPSBzcC0+cXVlOwogCiAJLyogU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiAqLwogCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKIAkJY21kX3BrdC0+dGFza19tZ210X2ZsYWdzID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoVE1GX1dSSVRFX0RBVEEpOwotCQlzcC0+ZmNwb3J0LT5oYS0+cWxhX3N0YXRzLm91dHB1dF9ieXRlcyArPQorCQlzcC0+ZmNwb3J0LT52aGEtPmh3LT5xbGFfc3RhdHMub3V0cHV0X2J5dGVzICs9CiAJCSAgICBzY3NpX2J1ZmZsZW4oc3AtPmNtZCk7CiAJfSBlbHNlIGlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgewogCQljbWRfcGt0LT50YXNrX21nbXRfZmxhZ3MgPQogCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihUTUZfUkVBRF9EQVRBKTsKLQkJc3AtPmZjcG9ydC0+aGEtPnFsYV9zdGF0cy5pbnB1dF9ieXRlcyArPQorCQlzcC0+ZmNwb3J0LT52aGEtPmh3LT5xbGFfc3RhdHMuaW5wdXRfYnl0ZXMgKz0KIAkJICAgIHNjc2lfYnVmZmxlbihzcC0+Y21kKTsKIAl9CiAKQEAgLTY1OCw3ICs2ODgsNyBAQAogCQkJICogRml2ZSBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnRpbnVhdGlvbgogCQkJICogVHlwZSAxIElPQ0IuCiAJCQkgKi8KLQkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYihoYSk7CisJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IocmVxLCB2aGEpOwogCQkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKWNvbnRfcGt0LT5kc2VnXzBfYWRkcmVzczsKIAkJCWF2YWlsX2RzZHMgPSA1OwogCQl9CkBAIC02ODMsOCArNzEzLDYgQEAKIHsKIAlpbnQJCXJldCwgbnNlZzsKIAl1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0Jc2NzaV9xbGFfaG9zdF90CSpoYSwgKnBoYTsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAJdWludDMyX3QJKmNscl9wdHI7CiAJdWludDMyX3QgICAgICAgIGluZGV4OwogCXVpbnQzMl90CWhhbmRsZTsKQEAgLTY5MiwzNSArNzIwLDQ1IEBACiAJdWludDE2X3QJY250OwogCXVpbnQxNl90CXJlcV9jbnQ7CiAJdWludDE2X3QJdG90X2RzZHM7Ci0Jc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IE5VTEw7CisJc3RydWN0IHJzcF9xdWUgKnJzcCA9IE5VTEw7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3AtPmNtZDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc3AtPnZoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MTZfdCBxdWVfaWQ7CiAKIAkvKiBTZXR1cCBkZXZpY2UgcG9pbnRlcnMuICovCiAJcmV0ID0gMDsKLQloYSA9IHNwLT5oYTsKLQlwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKLQlyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7Ci0JY21kID0gc3AtPmNtZDsKKwlxdWVfaWQgPSB2aGEtPnJlcV9xdWVzWzBdOworCisJcmVxID0gaGEtPnJlcV9xX21hcFtxdWVfaWRdOworCXNwLT5xdWUgPSByZXE7CisKKwlpZiAocmVxLT5yc3ApCisJCXJzcCA9IHJlcS0+cnNwOworCWVsc2UKKwkJcnNwID0gaGEtPnJzcF9xX21hcFtxdWVfaWRdOwogCS8qIFNvIHdlIGtub3cgd2UgaGF2ZW4ndCBwY2lfbWFwJ2VkIGFueXRoaW5nIHlldCAqLwogCXRvdF9kc2RzID0gMDsKIAogCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkICovCi0JaWYgKGhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKLQkJaWYgKHFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwlpZiAodmhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKKwkJaWYgKHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsIE1LX1NZTkNfQUxMKQorCQkJCQkJCSE9IFFMQV9TVUNDRVNTKQogCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JCX0KLQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwogCX0KIAogCS8qIEFjcXVpcmUgcmluZyBzcGVjaWZpYyBsb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJLyogQ2hlY2sgZm9yIHJvb20gaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLwotCWhhbmRsZSA9IGhhLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZDsKKwloYW5kbGUgPSByZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOwogCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaW5kZXgrKykgewogCQloYW5kbGUrKzsKIAkJaWYgKGhhbmRsZSA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCiAJCQloYW5kbGUgPSAxOwotCQlpZiAoIWhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0pCisJCWlmICghcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0pCiAJCQlicmVhazsKIAl9CiAJaWYgKGluZGV4ID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKQEAgLTczOCwyNSArNzc2LDI2IEBACiAJdG90X2RzZHMgPSBuc2VnOwogCiAJcmVxX2NudCA9IHFsYTI0eHhfY2FsY19pb2Nicyh0b3RfZHNkcyk7Ci0JaWYgKGhhLT5yZXFfcV9jbnQgPCAocmVxX2NudCArIDIpKSB7Ci0JCWNudCA9ICh1aW50MTZfdClSRF9SRUdfRFdPUkRfUkVMQVhFRCgmcmVnLT5yZXFfcV9vdXQpOwotCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQotCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwlpZiAocmVxLT5jbnQgPCAocmVxX2NudCArIDIpKSB7CisJCWNudCA9IGhhLT5pc3Bfb3BzLT5yZF9yZXFfcmVnKGhhLCByZXEtPmlkKTsKKworCQlpZiAocmVxLT5yaW5nX2luZGV4IDwgY250KQorCQkJcmVxLT5jbnQgPSBjbnQgLSByZXEtPnJpbmdfaW5kZXg7CiAJCWVsc2UKLQkJCWhhLT5yZXFfcV9jbnQgPSBoYS0+cmVxdWVzdF9xX2xlbmd0aCAtCi0JCQkJKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CisJCQlyZXEtPmNudCA9IHJlcS0+bGVuZ3RoIC0KKwkJCQkocmVxLT5yaW5nX2luZGV4IC0gY250KTsKIAl9Ci0JaWYgKGhhLT5yZXFfcV9jbnQgPCAocmVxX2NudCArIDIpKQorCWlmIChyZXEtPmNudCA8IChyZXFfY250ICsgMikpCiAJCWdvdG8gcXVldWluZ19lcnJvcjsKIAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0LiAqLwotCWhhLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKLQloYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID0gc3A7Ci0Jc3AtPmhhID0gaGE7CisJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKKwlyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9IHNwOworCXNwLT52aGEgPSB2aGE7CiAJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopKHVuc2lnbmVkIGxvbmcpaGFuZGxlOwotCWhhLT5yZXFfcV9jbnQgLT0gcmVxX2NudDsKKwlyZXEtPmNudCAtPSByZXFfY250OwogCi0JY21kX3BrdCA9IChzdHJ1Y3QgY21kX3R5cGVfNyAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCWNtZF9wa3QgPSAoc3RydWN0IGNtZF90eXBlXzcgKilyZXEtPnJpbmdfcHRyOwogCWNtZF9wa3QtPmhhbmRsZSA9IGhhbmRsZTsKIAogCS8qIFplcm8gb3V0IHJlbWFpbmluZyBwb3J0aW9uIG9mIHBhY2tldC4gKi8KQEAgLTc4OSwzMiArODI4LDYzIEBACiAJd21iKCk7CiAKIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KLQloYS0+cmVxX3JpbmdfaW5kZXgrKzsKLQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7Ci0JCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7Ci0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwlyZXEtPnJpbmdfaW5kZXgrKzsKKwlpZiAocmVxLT5yaW5nX2luZGV4ID09IHJlcS0+bGVuZ3RoKSB7CisJCXJlcS0+cmluZ19pbmRleCA9IDA7CisJCXJlcS0+cmluZ19wdHIgPSByZXEtPnJpbmc7CiAJfSBlbHNlCi0JCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisJCXJlcS0+cmluZ19wdHIrKzsKIAogCXNwLT5mbGFncyB8PSBTUkJfRE1BX1ZBTElEOwogCiAJLyogU2V0IGNoaXAgbmV3IHJpbmcgaW5kZXguICovCi0JV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9pbiwgaGEtPnJlcV9yaW5nX2luZGV4KTsKLQlSRF9SRUdfRFdPUkRfUkVMQVhFRCgmcmVnLT5yZXFfcV9pbik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwloYS0+aXNwX29wcy0+d3J0X3JlcV9yZWcoaGEsIHJlcS0+aWQsIHJlcS0+cmluZ19pbmRleCk7CiAKIAkvKiBNYW5hZ2UgdW5wcm9jZXNzZWQgUklPL1pJTyBjb21tYW5kcyBpbiByZXNwb25zZSBxdWV1ZS4gKi8KLQlpZiAoaGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgJiYKLQkgICAgaGEtPnJlc3BvbnNlX3JpbmdfcHRyLT5zaWduYXR1cmUgIT0gUkVTUE9OU0VfUFJPQ0VTU0VEKQotCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCWlmICh2aGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgJiYKKwkJcnNwLT5yaW5nX3B0ci0+c2lnbmF0dXJlICE9IFJFU1BPTlNFX1BST0NFU1NFRCkKKwkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHJzcCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogcXVldWluZ19lcnJvcjoKIAlpZiAodG90X2RzZHMpCiAJCXNjc2lfZG1hX3VubWFwKGNtZCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiB9CisKK3VpbnQxNl90CitxbGEyNHh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQpCit7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9ICh2b2lkICopIGhhLT5pb2Jhc2U7CisJcmV0dXJuIFJEX1JFR19EV09SRF9SRUxBWEVEKCZyZWctPmlzcDI0LnJlcV9xX291dCk7Cit9CisKK3VpbnQxNl90CitxbGEyNXh4X3JkX3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQpCit7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9ICh2b2lkICopIGhhLT5tcWlvYmFzZSArIFFMQV9RVUVfUEFHRSAqIGlkOworCXJldHVybiBSRF9SRUdfRFdPUkRfUkVMQVhFRCgmcmVnLT5pc3AyNW1xLnJlcV9xX291dCk7Cit9CisKK3ZvaWQKK3FsYTI0eHhfd3J0X3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQsIHVpbnQxNl90IGluZGV4KQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSAodm9pZCAqKSBoYS0+aW9iYXNlOworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucmVxX3FfaW4sIGluZGV4KTsKKwlSRF9SRUdfRFdPUkRfUkVMQVhFRCgmcmVnLT5pc3AyNC5yZXFfcV9pbik7Cit9CisKK3ZvaWQKK3FsYTI1eHhfd3J0X3JlcV9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQsIHVpbnQxNl90IGluZGV4KQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSAodm9pZCAqKSBoYS0+bXFpb2Jhc2UgKyBRTEFfUVVFX1BBR0UgKiBpZDsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKmlvcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucmVxX3FfaW4sIGluZGV4KTsKKwlSRF9SRUdfRFdPUkQoJmlvcmVnLT5oY2NyKTsgLyogUENJIHBvc3RpbmcgKi8KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IGE3NmVmZDkuLmQ1ZmI3OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTEwLDEwICsxMCwxMyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogc3RhdGljIHZvaWQgcWxhMngwMF9tYnhfY29tcGxldGlvbihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QpOwotc3RhdGljIHZvaWQgcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90KTsKLXN0YXRpYyB2b2lkIHFsYTJ4MDBfc3RhdHVzX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCB2b2lkICopOworc3RhdGljIHZvaWQgcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosCisJc3RydWN0IHJlcV9xdWUgKiwgdWludDMyX3QpOworc3RhdGljIHZvaWQgcWxhMngwMF9zdGF0dXNfZW50cnkoc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCByc3BfcXVlICosIHZvaWQgKik7CiBzdGF0aWMgdm9pZCBxbGEyeDAwX3N0YXR1c19jb250X2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHNfY29udF9lbnRyeV90ICopOwotc3RhdGljIHZvaWQgcWxhMngwMF9lcnJvcl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKiwgc3RzX2VudHJ5X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX2Vycm9yX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgcnNwX3F1ZSAqLAorCXN0c19lbnRyeV90ICopOworc3RhdGljIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpxbGEyeDAwX2dldF9yc3BfaG9zdChzdHJ1Y3QgcnNwX3F1ZSAqKTsKIAogLyoqCiAgKiBxbGEyMTAwX2ludHJfaGFuZGxlcigpIC0gUHJvY2VzcyBpbnRlcnJ1cHRzIGZvciB0aGUgSVNQMjEwMCBhbmQgSVNQMjIwMC4KQEAgLTI3LDI0ICszMCwyOCBAQAogaXJxcmV0dXJuX3QKIHFsYTIxMDBfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QJKmhhOworCXNjc2lfcWxhX2hvc3RfdAkqdmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWc7CiAJaW50CQlzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwlpdGVyOwogCXVpbnQxNl90CWhjY3I7CiAJdWludDE2X3QJbWJbNF07CisJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBkZXZfaWQ7Ci0JaWYgKCFoYSkgeworCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CisJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCk6IE5VTEwgaG9zdCBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCSAgICAiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAoSVJRX05PTkUpOwogCX0KIAorCWhhID0gcnNwLT5odzsKIAlyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXN0YXR1cyA9IDA7CiAKIAlzcGluX2xvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwl2aGEgPSBxbGEyeDAwX2dldF9yc3BfaG9zdChyc3ApOwogCWZvciAoaXRlciA9IDUwOyBpdGVyLS07ICkgewogCQloY2NyID0gUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CiAJCWlmIChoY2NyICYgSENDUl9SSVNDX1BBVVNFKSB7CkBAIC01OSw4ICs2Niw4IEBACiAJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKIAkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwogCi0JCQloYS0+aXNwX29wcy0+ZndfZHVtcChoYSwgMSk7Ci0JCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWhhLT5pc3Bfb3BzLT5md19kdW1wKHZoYSwgMSk7CisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICgoUkRfUkVHX1dPUkQoJnJlZy0+aXN0YXR1cykgJiBJU1JfUklTQ19JTlQpID09IDApCiAJCQlicmVhazsKQEAgLTcyLDI0ICs3OSwyNCBAQAogCQkJLyogR2V0IG1haWxib3ggZGF0YS4gKi8KIAkJCW1iWzBdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CiAJCQlpZiAobWJbMF0gPiAweDNmZmYgJiYgbWJbMF0gPCAweDgwMDApIHsKLQkJCQlxbGEyeDAwX21ieF9jb21wbGV0aW9uKGhhLCBtYlswXSk7CisJCQkJcWxhMngwMF9tYnhfY29tcGxldGlvbih2aGEsIG1iWzBdKTsKIAkJCQlzdGF0dXMgfD0gTUJYX0lOVEVSUlVQVDsKIAkJCX0gZWxzZSBpZiAobWJbMF0gPiAweDdmZmYgJiYgbWJbMF0gPCAweGMwMDApIHsKIAkJCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOwogCQkJCW1iWzJdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CiAJCQkJbWJbM10gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAzKTsKLQkJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KGhhLCBtYik7CisJCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIHJzcCwgbWIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKkVNUFRZKi8KIAkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCAiCiAJCQkJICAgICJpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKLQkJCQkgICAgaGEtPmhvc3Rfbm8sIG1iWzBdKSk7CisJCQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMF0pKTsKIAkJCX0KIAkJCS8qIFJlbGVhc2UgbWFpbGJveCByZWdpc3RlcnMuICovCiAJCQlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKIAkJCVJEX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSk7CiAJCX0gZWxzZSB7Ci0JCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHJzcCk7CiAKIAkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CiAJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKQEAgLTExOCwyNSArMTI1LDI5IEBACiBpcnFyZXR1cm5fdAogcWxhMjMwMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc2NzaV9xbGFfaG9zdF90CSp2aGE7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWc7CiAJaW50CQlzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwlpdGVyOwogCXVpbnQzMl90CXN0YXQ7CiAJdWludDE2X3QJaGNjcjsKIAl1aW50MTZfdAltYls0XTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CiAKLQloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgZGV2X2lkOwotCWlmICghaGEpIHsKKwlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOworCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcygpOiBOVUxMIGhvc3QgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gKElSUV9OT05FKTsKIAl9CiAKKwloYSA9IHJzcC0+aHc7CiAJcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAlzdGF0dXMgPSAwOwogCiAJc3Bpbl9sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJdmhhID0gcWxhMngwMF9nZXRfcnNwX2hvc3QocnNwKTsKIAlmb3IgKGl0ZXIgPSA1MDsgaXRlci0tOyApIHsKIAkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zdGF0dXMpOwogCQlpZiAoc3RhdCAmIEhTUl9SSVNDX1BBVVNFRCkgewpAQCAtMTU5LDggKzE3MCw4IEBACiAJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKIAkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwogCi0JCQloYS0+aXNwX29wcy0+ZndfZHVtcChoYSwgMSk7Ci0JCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWhhLT5pc3Bfb3BzLT5md19kdW1wKHZoYSwgMSk7CisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICgoc3RhdCAmIEhTUl9SSVNDX0lOVCkgPT0gMCkKIAkJCWJyZWFrOwpAQCAtMTcwLDcgKzE4MSw3IEBACiAJCWNhc2UgMHgyOgogCQljYXNlIDB4MTA6CiAJCWNhc2UgMHgxMToKLQkJCXFsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oaGEsIE1TVyhzdGF0KSk7CisJCQlxbGEyeDAwX21ieF9jb21wbGV0aW9uKHZoYSwgTVNXKHN0YXQpKTsKIAkJCXN0YXR1cyB8PSBNQlhfSU5URVJSVVBUOwogCiAJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLwpAQCAtMTgxLDI2ICsxOTIsMjYgQEAKIAkJCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CiAJCQltYlsyXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOwogCQkJbWJbM10gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAzKTsKLQkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1iKTsKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQodmhhLCByc3AsIG1iKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTM6Ci0JCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHJzcCk7CiAJCQlicmVhazsKIAkJY2FzZSAweDE1OgogCQkJbWJbMF0gPSBNQkFfQ01QTFRfMV8xNkJJVDsKIAkJCW1iWzFdID0gTVNXKHN0YXQpOwotCQkJcWxhMngwMF9hc3luY19ldmVudChoYSwgbWIpOworCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIHJzcCwgbWIpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxNjoKIAkJCW1iWzBdID0gTUJBX1NDU0lfQ09NUExFVElPTjsKIAkJCW1iWzFdID0gTVNXKHN0YXQpOwogCQkJbWJbMl0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKLQkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1iKTsKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQodmhhLCByc3AsIG1iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgIgogCQkJICAgICIoJWQpLlxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CiAJCQlicmVhazsKIAkJfQogCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOwpAQCAtMjIzLDEwICsyMzQsMTEgQEAKICAqIEBtYjA6IE1haWxib3gwIHJlZ2lzdGVyCiAgKi8KIHN0YXRpYyB2b2lkCi1xbGEyeDAwX21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IG1iMCkKK3FsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IG1iMCkKIHsKIAl1aW50MTZfdAljbnQ7CiAJdWludDE2X3QgX19pb21lbSAqd3B0cjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAKIAkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KQEAgLTI0NywxMCArMjU5LDEwIEBACiAKIAlpZiAoaGEtPm1jcCkgewogCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBHb3QgbWFpbGJveCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBoYS0+bWNwLT5tYlswXSkpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgaGEtPm1jcC0+bWJbMF0pKTsKIAl9IGVsc2UgewogCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IE1CWCBwb2ludGVyIEVSUk9SIVxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIH0KIApAQCAtMjYwLDcgKzI3Miw3IEBACiAgKiBAbWI6IE1haWxib3ggcmVnaXN0ZXJzICgwIC0gMykKICAqLwogdm9pZAotcWxhMngwMF9hc3luY19ldmVudChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqbWIpCitxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwLCB1aW50MTZfdCAqbWIpCiB7CiAjZGVmaW5lIExTX1VOS05PV04JMgogCXN0YXRpYyBjaGFyCSpsaW5rX3NwZWVkc1s1XSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIgfTsKQEAgLTI2OCw2ICsyODAsNyBAQAogCXVpbnQxNl90CWhhbmRsZV9jbnQ7CiAJdWludDE2X3QJY250OwogCXVpbnQzMl90CWhhbmRsZXNbNV07CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXVpbnQzMl90CXJzY25fZW50cnksIGhvc3RfcGlkOwogCXVpbnQ4X3QJCXJzY25fcXVldWVfaW5kZXg7CkBAIC0zMjksMTcgKzM0MiwxOSBAQAogCiAJc3dpdGNoIChtYlswXSkgewogCWNhc2UgTUJBX1NDU0lfQ09NUExFVElPTjoJLyogRmFzdCBQb3N0ICovCi0JCWlmICghaGEtPmZsYWdzLm9ubGluZSkKKwkJaWYgKCF2aGEtPmZsYWdzLm9ubGluZSkKIAkJCWJyZWFrOwogCiAJCWZvciAoY250ID0gMDsgY250IDwgaGFuZGxlX2NudDsgY250KyspCi0JCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoaGEsIGhhbmRsZXNbY250XSk7CisJCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QodmhhLCByc3AtPnJlcSwKKwkJCQloYW5kbGVzW2NudF0pOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1JFU0VUOgkJCS8qIFJlc2V0ICovCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFJFU0VULlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUkVTRVQuXG4iLAorCQkJdmhhLT5ob3N0X25vKSk7CiAKLQkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9TWVNURU1fRVJSOgkJLyogU3lzdGVtIEVycm9yICovCkBAIC0zNDcsNzAgKzM2Miw3MCBAQAogCQkgICAgIklTUCBTeXN0ZW0gRXJyb3IgLSBtYngxPSV4aCBtYngyPSV4aCBtYngzPSV4aC5cbiIsCiAJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAotCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsoaGEsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKLQkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAoaGEsIDEpOworCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CisJCWhhLT5pc3Bfb3BzLT5md19kdW1wKHZoYSwgMSk7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJCWlmIChtYlsxXSA9PSAwICYmIG1iWzJdID09IDApIHsKIAkJCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKIAkJCQkgICAgIlVucmVjb3ZlcmFibGUgSGFyZHdhcmUgRXJyb3I6IGFkYXB0ZXIgIgogCQkJCSAgICAibWFya2VkIE9GRkxJTkUhXG4iKTsKLQkJCQloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwkJCQl2aGEtPmZsYWdzLm9ubGluZSA9IDA7CiAJCQl9IGVsc2UKLQkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCX0gZWxzZSBpZiAobWJbMV0gPT0gMCkgewogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJICAgICJVbnJlY292ZXJhYmxlIEhhcmR3YXJlIEVycm9yOiBhZGFwdGVyIG1hcmtlZCAiCiAJCQkgICAgIk9GRkxJTkUhXG4iKTsKLQkJCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCQkJdmhhLT5mbGFncy5vbmxpbmUgPSAwOwogCQl9IGVsc2UKLQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1JFUV9UUkFOU0ZFUl9FUlI6CS8qIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IgKi8KIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvci5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yLlxuIik7CiAKLQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKGhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7Ci0JCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9SU1BfVFJBTlNGRVJfRVJSOgkvKiBSZXNwb25zZSBUcmFuc2ZlciBFcnJvciAqLwogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOwogCi0JCXFsYTJ4MDBfcG9zdF9od2Vfd29yayhoYSwgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbM10pOwotCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKHZoYSwgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbM10pOworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfV0FLRVVQX1RIUkVTOgkJLyogUmVxdWVzdCBRdWV1ZSBXYWtlLXVwICovCiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFdBS0VVUF9USFJFUy5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTElQX09DQ1VSUkVEOgkJLyogTG9vcCBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBMSVAgb2NjdXJyZWQgKCV4KS5cbiIsIGhhLT5ob3N0X25vLAorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IExJUCBvY2N1cnJlZCAoJXgpLlxuIiwgdmhhLT5ob3N0X25vLAogCQkgICAgbWJbMV0pKTsKIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTElQIG9jY3VycmVkICgleCkuXG4iLCBtYlsxXSk7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7Ci0JCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKLQkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKLQkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAxKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KHZoYSwgMSk7CiAJCX0KIAotCQlpZiAoaGEtPnBhcmVudCkgewotCQkJYXRvbWljX3NldCgmaGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOwotCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGhhLT5mY192cG9ydCwgRkNfVlBPUlRfRkFJTEVEKTsKKwkJaWYgKHZoYS0+dnBfaWR4KSB7CisJCQlhdG9taWNfc2V0KCZ2aGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOworCQkJZmNfdnBvcnRfc2V0X3N0YXRlKHZoYS0+ZmNfdnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCX0KIAotCQlzZXRfYml0KFJFR0lTVEVSX0ZDNF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJc2V0X2JpdChSRUdJU1RFUl9GRE1JX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KFJFR0lTVEVSX0ZDNF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKLQkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7Ci0JCXFsYTJ4MDBfcG9zdF9hZW5fd29yayhoYSwgRkNIX0VWVF9MSVAsIG1iWzFdKTsKKwkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsodmhhLCBGQ0hfRVZUX0xJUCwgbWJbMV0pOwogCQlicmVhazsKIAogCWNhc2UgTUJBX0xPT1BfVVA6CQkvKiBMb29wIFVwIEV2ZW50ICovCkBAIC00MjUsNTkgKzQ0MCw1OSBAQAogCQl9CiAKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTE9PUCBVUCAoJXMgR2JwcykuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGxpbmtfc3BlZWQpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgbGlua19zcGVlZCkpOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJMT09QIFVQIGRldGVjdGVkICglcyBHYnBzKS5cbiIsCiAJCSAgICBsaW5rX3NwZWVkKTsKIAotCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKLQkJcWxhMngwMF9wb3N0X2Flbl93b3JrKGhhLCBGQ0hfRVZUX0xJTktVUCwgaGEtPmxpbmtfZGF0YV9yYXRlKTsKKwkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsodmhhLCBGQ0hfRVZUX0xJTktVUCwgaGEtPmxpbmtfZGF0YV9yYXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9MT09QX0RPV046CQkvKiBMb29wIERvd24gRXZlbnQgKi8KIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTE9PUCBET1dOICIKLQkJICAgICIoJXggJXggJXgpLlxuIiwgaGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJICAgICIoJXggJXggJXgpLlxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxPT1AgRE9XTiBkZXRlY3RlZCAoJXggJXggJXgpLlxuIiwKIAkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCi0JCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewotCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7Ci0JCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7Ci0JCQloYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfTk9fQ0FCTEU7Ci0JCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChoYSwgMSk7CisJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKKwkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CisJCQl2aGEtPmRldmljZV9mbGFncyB8PSBERkxHX05PX0NBQkxFOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QodmhhLCAxKTsKIAkJfQogCi0JCWlmIChoYS0+cGFyZW50KSB7Ci0JCQlhdG9taWNfc2V0KCZoYS0+dnBfc3RhdGUsIFZQX0ZBSUxFRCk7Ci0JCQlmY192cG9ydF9zZXRfc3RhdGUoaGEtPmZjX3Zwb3J0LCBGQ19WUE9SVF9GQUlMRUQpOworCQlpZiAodmhhLT52cF9pZHgpIHsKKwkJCWF0b21pY19zZXQoJnZoYS0+dnBfc3RhdGUsIFZQX0ZBSUxFRCk7CisJCQlmY192cG9ydF9zZXRfc3RhdGUodmhhLT5mY192cG9ydCwgRkNfVlBPUlRfRkFJTEVEKTsKIAkJfQogCi0JCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CiAJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IFBPUlRfU1BFRURfVU5LTk9XTjsKLQkJcWxhMngwMF9wb3N0X2Flbl93b3JrKGhhLCBGQ0hfRVZUX0xJTktET1dOLCAwKTsKKwkJcWxhMngwMF9wb3N0X2Flbl93b3JrKHZoYSwgRkNIX0VWVF9MSU5LRE9XTiwgMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTElQX1JFU0VUOgkJLyogTElQIHJlc2V0IG9jY3VycmVkICovCiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIExJUCBSRVNFVCAoJXgpLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBtYlsxXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSkpOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiTElQIHJlc2V0IG9jY3VycmVkICgleCkuXG4iLCBtYlsxXSk7CiAKLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7Ci0JCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKLQkJCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKLQkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAxKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KHZoYSwgMSk7CiAJCX0KIAotCQlpZiAoaGEtPnBhcmVudCkgewotCQkJYXRvbWljX3NldCgmaGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOwotCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGhhLT5mY192cG9ydCwgRkNfVlBPUlRfRkFJTEVEKTsKKwkJaWYgKHZoYS0+dnBfaWR4KSB7CisJCQlhdG9taWNfc2V0KCZ2aGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOworCQkJZmNfdnBvcnRfc2V0X3N0YXRlKHZoYS0+ZmNfdnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCX0KIAotCQlzZXRfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCiAJCWhhLT5vcGVyYXRpbmdfbW9kZSA9IExPT1A7Ci0JCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOwotCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsoaGEsIEZDSF9FVlRfTElQUkVTRVQsIG1iWzFdKTsKKwkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsodmhhLCBGQ0hfRVZUX0xJUFJFU0VULCBtYlsxXSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfUE9JTlRfVE9fUE9JTlQ6CS8qIFBvaW50LXRvLVBvaW50ICovCkBAIC00ODUsMzMgKzUwMCwzMyBAQAogCQkJYnJlYWs7CiAKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgcmVjZWl2ZWQuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCiAJCS8qCiAJCSAqIFVudGlsIHRoZXJlJ3MgYSB0cmFuc2l0aW9uIGZyb20gbG9vcCBkb3duIHRvIGxvb3AgdXAsIHRyZWF0CiAJCSAqIHRoaXMgYXMgbG9vcCBkb3duIG9ubHkuCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKLQkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwotCQkJaWYgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpCi0JCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwKKwkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJaWYgKCFhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpKQorCQkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLAogCQkJCSAgICBMT09QX0RPV05fVElNRSk7Ci0JCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChoYSwgMSk7CisJCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdCh2aGEsIDEpOwogCQl9CiAKLQkJaWYgKGhhLT5wYXJlbnQpIHsKLQkJCWF0b21pY19zZXQoJmhhLT52cF9zdGF0ZSwgVlBfRkFJTEVEKTsKLQkJCWZjX3Zwb3J0X3NldF9zdGF0ZShoYS0+ZmNfdnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CisJCWlmICh2aGEtPnZwX2lkeCkgeworCQkJYXRvbWljX3NldCgmdmhhLT52cF9zdGF0ZSwgVlBfRkFJTEVEKTsKKwkJCWZjX3Zwb3J0X3NldF9zdGF0ZSh2aGEtPmZjX3Zwb3J0LCBGQ19WUE9SVF9GQUlMRUQpOwogCQl9CiAKLQkJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkgewotCQkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCX0KLQkJc2V0X2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkpCisJCQlzZXRfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisKKwkJc2V0X2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KFJFR0lTVEVSX0ZETUlfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCiAJCWhhLT5mbGFncy5ncHNjX3N1cHBvcnRlZCA9IDE7Ci0JCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCQl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfQ0hHX0lOX0NPTk5FQ1RJT046CS8qIENoYW5nZSBpbiBjb25uZWN0aW9uIG1vZGUgKi8KQEAgLTUyMCwxMzQgKzUzNSwxMzcgQEAKIAogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBDaGFuZ2UgSW4gQ29ubmVjdGlvbiAiCiAJCSAgICAicmVjZWl2ZWQuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiQ29uZmlndXJhdGlvbiBjaGFuZ2UgZGV0ZWN0ZWQ6IHZhbHVlPSV4LlxuIiwgbWJbMV0pOwogCi0JCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewotCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7Ci0JCQlpZiAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSkKLQkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLAorCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CisJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CisJCQlpZiAoIWF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpCisJCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsCiAJCQkJICAgIExPT1BfRE9XTl9USU1FKTsKLQkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAxKTsKKwkJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KHZoYSwgMSk7CiAJCX0KIAotCQlpZiAoaGEtPnBhcmVudCkgewotCQkJYXRvbWljX3NldCgmaGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOwotCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGhhLT5mY192cG9ydCwgRkNfVlBPUlRfRkFJTEVEKTsKKwkJaWYgKHZoYS0+dnBfaWR4KSB7CisJCQlhdG9taWNfc2V0KCZ2aGEtPnZwX3N0YXRlLCBWUF9GQUlMRUQpOworCQkJZmNfdnBvcnRfc2V0X3N0YXRlKHZoYS0+ZmNfdnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCX0KIAotCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwotCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1BPUlRfVVBEQVRFOgkJLyogUG9ydCBkYXRhYmFzZSB1cGRhdGUgKi8KKwkJLyogT25seSBoYW5kbGUgU0NOcyBmb3Igb3VyIFZwb3J0IGluZGV4LiAqLworCQlpZiAodmhhLT52cF9pZHggJiYgdmhhLT52cF9pZHggIT0gKG1iWzNdICYgMHhmZikpCisJCQlicmVhazsKKwogCQkvKgogCQkgKiBJZiBQT1JUIFVQREFURSBpcyBnbG9iYWwgKHJlY2VpdmVkIExJUF9PQ0NVUlJFRC9MSVBfUkVTRVQKIAkJICogZXZlbnQgZXRjLiBlYXJsaWVyIGluZGljYXRpbmcgbG9vcCBpcyBkb3duKSB0aGVuIHByb2Nlc3MKIAkJICogaXQuICBPdGhlcndpc2UgaWdub3JlIGl0IGFuZCBXYWl0IGZvciBSU0NOIHRvIGNvbWUgaW4uCiAJCSAqLwotCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCAwKTsKLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOICYmCi0JCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfREVBRCkgeworCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3BfZG93bl90aW1lciwgMCk7CisJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04gJiYKKwkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfREVBRCkgewogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUgIgotCQkJICAgICJpZ25vcmVkICUwNHgvJTA0eC8lMDR4LlxuIiwgaGEtPmhvc3Rfbm8sIG1iWzFdLAorCQkJICAgICJpZ25vcmVkICUwNHgvJTA0eC8lMDR4LlxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwKIAkJCSAgICBtYlsyXSwgbWJbM10pKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCiAJCSAgICAic2NzaSglbGQpOiBQb3J0IGRhdGFiYXNlIGNoYW5nZWQgJTA0eCAlMDR4ICUwNHguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOwogCiAJCS8qCiAJCSAqIE1hcmsgYWxsIGRldmljZXMgYXMgbWlzc2luZyBzbyB3ZSB3aWxsIGxvZ2luIGFnYWluLgogCQkgKi8KLQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfVVApOworCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfVVApOwogCi0JCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAxKTsKKwkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QodmhhLCAxKTsKIAotCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisJCXZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CiAKLQkJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9SU0NOX1VQREFURToJCS8qIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24gKi8KIAkJLyogQ2hlY2sgaWYgdGhlIFZwb3J0IGhhcyBpc3N1ZWQgYSBTQ1IgKi8KLQkJaWYgKGhhLT5wYXJlbnQgJiYgdGVzdF9iaXQoVlBfU0NSX05FRURFRCwgJmhhLT52cF9mbGFncykpCisJCWlmICh2aGEtPnZwX2lkeCAmJiB0ZXN0X2JpdChWUF9TQ1JfTkVFREVELCAmdmhhLT52cF9mbGFncykpCiAJCQlicmVhazsKIAkJLyogT25seSBoYW5kbGUgU0NOcyBmb3Igb3VyIFZwb3J0IGluZGV4LiAqLwotCQlpZiAoaGEtPnBhcmVudCAmJiBoYS0+dnBfaWR4ICE9IChtYlszXSAmIDB4ZmYpKQorCQlpZiAodmhhLT52cF9pZHggJiYgdmhhLT52cF9pZHggIT0gKG1iWzNdICYgMHhmZikpCiAJCQlicmVhazsKLQogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBSU0NSIFVQREFURS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCURFQlVHKHByaW50ayhLRVJOX0lORk8KIAkJICAgICJzY3NpKCVsZCk6IFJTQ04gZGF0YWJhc2UgY2hhbmdlZCAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CiAKIAkJcnNjbl9lbnRyeSA9ICgobWJbMV0gJiAweGZmKSA8PCAxNikgfCBtYlsyXTsKLQkJaG9zdF9waWQgPSAoaGEtPmRfaWQuYi5kb21haW4gPDwgMTYpIHwgKGhhLT5kX2lkLmIuYXJlYSA8PCA4KSB8Ci0JCSAgICBoYS0+ZF9pZC5iLmFsX3BhOworCQlob3N0X3BpZCA9ICh2aGEtPmRfaWQuYi5kb21haW4gPDwgMTYpIHwgKHZoYS0+ZF9pZC5iLmFyZWEgPDwgOCkKKwkJCQl8IHZoYS0+ZF9pZC5iLmFsX3BhOwogCQlpZiAocnNjbl9lbnRyeSA9PSBob3N0X3BpZCkgewogCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICJzY3NpKCVsZCk6IElnbm9yaW5nIFJTQ04gdXBkYXRlIHRvIGxvY2FsIGhvc3QgIgogCQkJICAgICJwb3J0IElEICglMDZ4KVxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgaG9zdF9waWQpKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8sIGhvc3RfcGlkKSk7CiAJCQlicmVhazsKIAkJfQogCiAJCS8qIElnbm9yZSByZXNlcnZlZCBiaXRzIGZyb20gUlNDTi1wYXlsb2FkLiAqLwogCQlyc2NuX2VudHJ5ID0gKChtYlsxXSAmIDB4M2ZmKSA8PCAxNikgfCBtYlsyXTsKLQkJcnNjbl9xdWV1ZV9pbmRleCA9IGhhLT5yc2NuX2luX3B0ciArIDE7CisJCXJzY25fcXVldWVfaW5kZXggPSB2aGEtPnJzY25faW5fcHRyICsgMTsKIAkJaWYgKHJzY25fcXVldWVfaW5kZXggPT0gTUFYX1JTQ05fQ09VTlQpCiAJCQlyc2NuX3F1ZXVlX2luZGV4ID0gMDsKLQkJaWYgKHJzY25fcXVldWVfaW5kZXggIT0gaGEtPnJzY25fb3V0X3B0cikgewotCQkJaGEtPnJzY25fcXVldWVbaGEtPnJzY25faW5fcHRyXSA9IHJzY25fZW50cnk7Ci0JCQloYS0+cnNjbl9pbl9wdHIgPSByc2NuX3F1ZXVlX2luZGV4OworCQlpZiAocnNjbl9xdWV1ZV9pbmRleCAhPSB2aGEtPnJzY25fb3V0X3B0cikgeworCQkJdmhhLT5yc2NuX3F1ZXVlW3ZoYS0+cnNjbl9pbl9wdHJdID0gcnNjbl9lbnRyeTsKKwkJCXZoYS0+cnNjbl9pbl9wdHIgPSByc2NuX3F1ZXVlX2luZGV4OwogCQl9IGVsc2UgewotCQkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAxOworCQkJdmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKIAkJfQogCi0JCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7Ci0JCWF0b21pY19zZXQoJmhhLT5sb29wX2Rvd25fdGltZXIsIDApOwotCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKKwkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CisJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLCAwKTsKKwkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOwogCi0JCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCXNldF9iaXQoUlNDTl9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJcWxhMngwMF9wb3N0X2Flbl93b3JrKGhhLCBGQ0hfRVZUX1JTQ04sIHJzY25fZW50cnkpOworCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChSU0NOX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJcWxhMngwMF9wb3N0X2Flbl93b3JrKHZoYSwgRkNIX0VWVF9SU0NOLCByc2NuX2VudHJ5KTsKIAkJYnJlYWs7CiAKIAkvKiBjYXNlIE1CQV9SSU9fUkVTUE9OU0U6ICovCiAJY2FzZSBNQkFfWklPX1JFU1BPTlNFOgogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCiAJCSAgICAic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKLQkJCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUocnNwKTsKIAkJZWxzZQotCQkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKwkJCXFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShyc3ApOwogCQlicmVhazsKIAogCWNhc2UgTUJBX0RJU0NBUkRfUk5EX0ZSQU1FOgogCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IERpc2NhcmQgUk5EIEZyYW1lIC0tICUwNHggJTA0eCAiCi0JCSAgICAiJTA0eC5cbiIsIGhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCSAgICAiJTA0eC5cbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1RSQUNFX05PVElGSUNBVElPTjoKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBUcmFjZSBOb3RpZmljYXRpb24gLS0gJTA0eCAlMDR4LlxuIiwKLQkJaGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSkpOworCQl2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSkpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX0lTUDg0WFhfQUxFUlQ6CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSVNQODRYWCBBbGVydCBOb3RpZmljYXRpb24gLS0gIgotCQkgICAgIiUwNHggJTA0eCAlMDR4XG4iLCBoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQkgICAgIiUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmNzODR4eC0+YWNjZXNzX2xvY2ssIGZsYWdzKTsKIAkJc3dpdGNoIChtYlsxXSkgewpAQCAtNjgyLDE2ICs3MDAsMjIgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFoYS0+cGFyZW50ICYmIGhhLT5udW1fdmhvc3RzKQotCQlxbGEyeDAwX2FsZXJ0X2FsbF92cHMoaGEsIG1iKTsKKwlpZiAoIXZoYS0+dnBfaWR4ICYmIGhhLT5udW1fdmhvc3RzKQorCQlxbGEyeDAwX2FsZXJ0X2FsbF92cHMocnNwLCBtYik7CiB9CiAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2FkanVzdF9zZGV2X3FkZXB0aF91cChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCiB7CiAJZmNfcG9ydF90ICpmY3BvcnQgPSBkYXRhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKIAotCWlmIChmY3BvcnQtPmhhLT5tYXhfcV9kZXB0aCA8PSBzZGV2LT5xdWV1ZV9kZXB0aCkKKwlyZXEgPSBoYS0+cmVxX3FfbWFwW3ZoYS0+cmVxX3F1ZXNbMF1dOworCWlmICghcmVxKQorCQlyZXR1cm47CisJaWYgKHJlcS0+bWF4X3FfZGVwdGggPD0gc2Rldi0+cXVldWVfZGVwdGgpCiAJCXJldHVybjsKIAogCWlmIChzZGV2LT5vcmRlcmVkX3RhZ3MpCkBAIC03MDMsOSArNzI3LDkgQEAKIAogCWZjcG9ydC0+bGFzdF9yYW1wX3VwID0gamlmZmllczsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgZmNwb3J0LT5oYSwKKwlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZC11cCB0byAlZC5cbiIsCi0JICAgIGZjcG9ydC0+aGEtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCisJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAogCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCkpOwogfQogCkBAIC03MTcsMjAgKzc0MSwyMSBAQAogCWlmICghc2NzaV90cmFja19xdWV1ZV9mdWxsKHNkZXYsIHNkZXYtPnF1ZXVlX2RlcHRoIC0gMSkpCiAJCXJldHVybjsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgZmNwb3J0LT5oYSwKKwlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGZjcG9ydC0+dmhhLT5odywKIAkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogUXVldWUgZGVwdGggYWRqdXN0ZWQtZG93biB0byAlZC5cbiIsCi0JICAgIGZjcG9ydC0+aGEtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCisJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAogCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTJ4MDBfcmFtcF91cF9xdWV1ZV9kZXB0aChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCitxbGEyeDAwX3JhbXBfdXBfcXVldWVfZGVwdGgoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEsCisJCQkJCQkJCXNyYl90ICpzcCkKIHsKIAlmY19wb3J0X3QgKmZjcG9ydDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAKIAlzZGV2ID0gc3AtPmNtZC0+ZGV2aWNlOwotCWlmIChzZGV2LT5xdWV1ZV9kZXB0aCA+PSBoYS0+bWF4X3FfZGVwdGgpCisJaWYgKHNkZXYtPnF1ZXVlX2RlcHRoID49IHJlcS0+bWF4X3FfZGVwdGgpCiAJCXJldHVybjsKIAogCWZjcG9ydCA9IHNwLT5mY3BvcnQ7CkBAIC03NTEsMjUgKzc3NiwyNyBAQAogICogQGluZGV4OiBTUkIgaW5kZXgKICAqLwogc3RhdGljIHZvaWQKLXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGluZGV4KQorcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsCisJCQkJc3RydWN0IHJlcV9xdWUgKnJlcSwgdWludDMyX3QgaW5kZXgpCiB7CiAJc3JiX3QgKnNwOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogVmFsaWRhdGUgaGFuZGxlLiAqLwogCWlmIChpbmRleCA+PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnZhbGlkIFNDU0kgY29tcGxldGlvbiBoYW5kbGUgJWQuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGluZGV4KSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIGluZGV4KSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJICAgICJJbnZhbGlkIFNDU0kgY29tcGxldGlvbiBoYW5kbGUgJWQuXG4iLCBpbmRleCk7CiAKLQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAotCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdOworCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKIAlpZiAoc3ApIHsKIAkJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCi0JCWhhLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XSA9IE5VTEw7CisJCXJlcS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF0gPSBOVUxMOwogCiAJCUNNRF9DT01QTF9TVEFUVVMoc3AtPmNtZCkgPSAwTDsKIAkJQ01EX1NDU0lfU1RBVFVTKHNwLT5jbWQpID0gMEw7CkBAIC03NzcsMTUgKzgwNCwxNSBAQAogCQkvKiBTYXZlIElTUCBjb21wbGV0aW9uIHN0YXR1cyAqLwogCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CiAKLQkJcWxhMngwMF9yYW1wX3VwX3F1ZXVlX2RlcHRoKGhhLCBzcCk7CisJCXFsYTJ4MDBfcmFtcF91cF9xdWV1ZV9kZXB0aCh2aGEsIHJlcSwgc3ApOwogCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7CiAJfSBlbHNlIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnZhbGlkIElTUCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiSW52YWxpZCBJU1AgU0NTSSBjb21wbGV0aW9uIGhhbmRsZVxuIik7CiAKLQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAl9CiB9CiAKQEAgLTc5NCwzMiArODIxLDM2IEBACiAgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKICAqLwogdm9pZAotcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogeworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHJzcC0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXN0c19lbnRyeV90CSpwa3Q7CiAJdWludDE2X3QgICAgICAgIGhhbmRsZV9jbnQ7CiAJdWludDE2X3QgICAgICAgIGNudDsKIAotCWlmICghaGEtPmZsYWdzLm9ubGluZSkKKwl2aGEgPSBxbGEyeDAwX2dldF9yc3BfaG9zdChyc3ApOworCisJaWYgKCF2aGEtPmZsYWdzLm9ubGluZSkKIAkJcmV0dXJuOwogCi0Jd2hpbGUgKGhhLT5yZXNwb25zZV9yaW5nX3B0ci0+c2lnbmF0dXJlICE9IFJFU1BPTlNFX1BST0NFU1NFRCkgewotCQlwa3QgPSAoc3RzX2VudHJ5X3QgKiloYS0+cmVzcG9uc2VfcmluZ19wdHI7CisJd2hpbGUgKHJzcC0+cmluZ19wdHItPnNpZ25hdHVyZSAhPSBSRVNQT05TRV9QUk9DRVNTRUQpIHsKKwkJcGt0ID0gKHN0c19lbnRyeV90ICopcnNwLT5yaW5nX3B0cjsKIAotCQloYS0+cnNwX3JpbmdfaW5kZXgrKzsKLQkJaWYgKGhhLT5yc3BfcmluZ19pbmRleCA9PSBoYS0+cmVzcG9uc2VfcV9sZW5ndGgpIHsKLQkJCWhhLT5yc3BfcmluZ19pbmRleCA9IDA7Ci0JCQloYS0+cmVzcG9uc2VfcmluZ19wdHIgPSBoYS0+cmVzcG9uc2VfcmluZzsKKwkJcnNwLT5yaW5nX2luZGV4Kys7CisJCWlmIChyc3AtPnJpbmdfaW5kZXggPT0gcnNwLT5sZW5ndGgpIHsKKwkJCXJzcC0+cmluZ19pbmRleCA9IDA7CisJCQlyc3AtPnJpbmdfcHRyID0gcnNwLT5yaW5nOwogCQl9IGVsc2UgewotCQkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyKys7CisJCQlyc3AtPnJpbmdfcHRyKys7CiAJCX0KIAogCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewogCQkJREVCVUczKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgdmhhLT5ob3N0X25vKSk7CiAKLQkJCXFsYTJ4MDBfZXJyb3JfZW50cnkoaGEsIHBrdCk7CisJCQlxbGEyeDAwX2Vycm9yX2VudHJ5KHZoYSwgcnNwLCBwa3QpOwogCQkJKChyZXNwb25zZV90ICopcGt0KS0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOwogCQkJd21iKCk7CiAJCQljb250aW51ZTsKQEAgLTgyNywzMSArODU4LDMxIEBACiAKIAkJc3dpdGNoIChwa3QtPmVudHJ5X3R5cGUpIHsKIAkJY2FzZSBTVEFUVVNfVFlQRToKLQkJCXFsYTJ4MDBfc3RhdHVzX2VudHJ5KGhhLCBwa3QpOworCQkJcWxhMngwMF9zdGF0dXNfZW50cnkodmhhLCByc3AsIHBrdCk7CiAJCQlicmVhazsKIAkJY2FzZSBTVEFUVVNfVFlQRV8yMToKIAkJCWhhbmRsZV9jbnQgPSAoKHN0czIxX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVfY291bnQ7CiAJCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhbmRsZV9jbnQ7IGNudCsrKSB7Ci0JCQkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KGhhLAorCQkJCXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdCh2aGEsIHJzcC0+cmVxLAogCQkJCSAgICAoKHN0czIxX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVbY250XSk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBTVEFUVVNfVFlQRV8yMjoKIAkJCWhhbmRsZV9jbnQgPSAoKHN0czIyX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVfY291bnQ7CiAJCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhbmRsZV9jbnQ7IGNudCsrKSB7Ci0JCQkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KGhhLAorCQkJCXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdCh2aGEsIHJzcC0+cmVxLAogCQkJCSAgICAoKHN0czIyX2VudHJ5X3QgKilwa3QpLT5oYW5kbGVbY250XSk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBTVEFUVVNfQ09OVF9UWVBFOgotCQkJcWxhMngwMF9zdGF0dXNfY29udF9lbnRyeShoYSwgKHN0c19jb250X2VudHJ5X3QgKilwa3QpOworCQkJcWxhMngwMF9zdGF0dXNfY29udF9lbnRyeSh2aGEsIChzdHNfY29udF9lbnRyeV90ICopcGt0KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogVHlwZSBOb3QgU3VwcG9ydGVkLiAqLwogCQkJREVCVUc0KHByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAic2NzaSglbGQpOiBSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKIAkJCSAgICAiZW50cnkgc3RhdHVzPSV4LlxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cykpOworCQkJICAgIHZoYS0+aG9zdF9ubywgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cykpOwogCQkJYnJlYWs7CiAJCX0KIAkJKChyZXNwb25zZV90ICopcGt0KS0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOwpAQCAtODU5LDcgKzg5MCw3IEBACiAJfQogCiAJLyogQWRqdXN0IHJpbmcgaW5kZXggKi8KLQlXUlRfUkVHX1dPUkQoSVNQX1JTUF9RX09VVChoYSwgcmVnKSwgaGEtPnJzcF9yaW5nX2luZGV4KTsKKwlXUlRfUkVHX1dPUkQoSVNQX1JTUF9RX09VVChoYSwgcmVnKSwgcnNwLT5yaW5nX2luZGV4KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC04ODEsMTAgKzkxMiwxMCBAQAogCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciArPSBzZW5zZV9sZW47CiAJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoIC09IHNlbnNlX2xlbjsKIAlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoICE9IDApCi0JCXNwLT5mY3BvcnQtPmhhLT5zdGF0dXNfc3JiID0gc3A7CisJCXNwLT5mY3BvcnQtPnZoYS0+c3RhdHVzX3NyYiA9IHNwOwogCiAJREVCVUc1KHByaW50aygiJXMoKTogQ2hlY2sgY29uZGl0aW9uIFNlbnNlIGRhdGEsIHNjc2koJWxkOiVkOiVkOiVkKSAiCi0JICAgICJjbWQ9JXAgcGlkPSVsZFxuIiwgX19mdW5jX18sIHNwLT5mY3BvcnQtPmhhLT5ob3N0X25vLAorCSAgICAiY21kPSVwIHBpZD0lbGRcbiIsIF9fZnVuY19fLCBzcC0+ZmNwb3J0LT52aGEtPmhvc3Rfbm8sCiAJICAgIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNwLAogCSAgICBjcC0+c2VyaWFsX251bWJlcikpOwogCWlmIChzZW5zZV9sZW4pCkBAIC04OTgsNyArOTI5LDcgQEAKICAqIEBwa3Q6IEVudHJ5IHBvaW50ZXIKICAqLwogc3RhdGljIHZvaWQKLXFsYTJ4MDBfc3RhdHVzX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHZvaWQgKnBrdCkKK3FsYTJ4MDBfc3RhdHVzX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwLCB2b2lkICpwa3QpCiB7CiAJc3JiX3QJCSpzcDsKIAlmY19wb3J0X3QJKmZjcG9ydDsKQEAgLTkxMSw2ICs5NDIsOCBAQAogCWludDMyX3QJCXJlc2lkOwogCXVpbnQzMl90CXNlbnNlX2xlbiwgcnNwX2luZm9fbGVuLCByZXNpZF9sZW4sIGZ3X3Jlc2lkX2xlbjsKIAl1aW50OF90CQkqcnNwX2luZm8sICpzZW5zZV9kYXRhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXEgPSByc3AtPnJlcTsKIAogCXN0cyA9IChzdHNfZW50cnlfdCAqKSBwa3Q7CiAJc3RzMjQgPSAoc3RydWN0IHN0c19lbnRyeV8yNHh4ICopIHBrdDsKQEAgLTkyNCwzMSArOTU3LDMxIEBACiAKIAkvKiBGYXN0IHBhdGggY29tcGxldGlvbi4gKi8KIAlpZiAoY29tcF9zdGF0dXMgPT0gQ1NfQ09NUExFVEUgJiYgc2NzaV9zdGF0dXMgPT0gMCkgewotCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoaGEsIHN0cy0+aGFuZGxlKTsKKwkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHZoYSwgcmVxLCBzdHMtPmhhbmRsZSk7CiAKIAkJcmV0dXJuOwogCX0KIAogCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KIAlpZiAoc3RzLT5oYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKLQkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tzdHMtPmhhbmRsZV07Ci0JCWhhLT5vdXRzdGFuZGluZ19jbWRzW3N0cy0+aGFuZGxlXSA9IE5VTEw7CisJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW3N0cy0+aGFuZGxlXTsKKwkJcmVxLT5vdXRzdGFuZGluZ19jbWRzW3N0cy0+aGFuZGxlXSA9IE5VTEw7CiAJfSBlbHNlCiAJCXNwID0gTlVMTDsKIAogCWlmIChzcCA9PSBOVUxMKSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogU3RhdHVzIEVudHJ5IGludmFsaWQgaGFuZGxlLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiU3RhdHVzIEVudHJ5IGludmFsaWQgaGFuZGxlLlxuIik7CiAKLQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCXFsYTJ4eHhfd2FrZV9kcGMoaGEpOworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAkJcmV0dXJuOwogCX0KIAljcCA9IHNwLT5jbWQ7CiAJaWYgKGNwID09IE5VTEwpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb21tYW5kIGFscmVhZHkgcmV0dXJuZWQgYmFjayB0byBPUyAiCi0JCSAgICAicGt0LT5oYW5kbGU9JWQgc3A9JXAuXG4iLCBoYS0+aG9zdF9ubywgc3RzLT5oYW5kbGUsIHNwKSk7CisJCSAgICAicGt0LT5oYW5kbGU9JWQgc3A9JXAuXG4iLCB2aGEtPmhvc3Rfbm8sIHN0cy0+aGFuZGxlLCBzcCkpOwogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiQ29tbWFuZCBpcyBOVUxMOiBhbHJlYWR5IHJldHVybmVkIHRvIE9TIChzcD0lcClcbiIsIHNwKTsKIApAQCAtOTg3LDcgKzEwMjAsNyBAQAogCQlpZiAocnNwX2luZm9fbGVuID4gMyAmJiByc3BfaW5mb1szXSkgewogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQ6JWQ6JWQ6JWQpIEZDUCBJL08gcHJvdG9jb2wgIgogCQkJICAgICJmYWlsdXJlICgleC8lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCkuLi4iCi0JCQkgICAgInJldHJ5aW5nIGNvbW1hbmRcbiIsIGhhLT5ob3N0X25vLAorCQkJICAgICJyZXRyeWluZyBjb21tYW5kXG4iLCB2aGEtPmhvc3Rfbm8sCiAJCQkgICAgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCiAJCQkgICAgY3AtPmRldmljZS0+bHVuLCByc3BfaW5mb19sZW4sIHJzcF9pbmZvWzBdLAogCQkJICAgIHJzcF9pbmZvWzFdLCByc3BfaW5mb1syXSwgcnNwX2luZm9bM10sIHJzcF9pbmZvWzRdLApAQCAtMTAyNSw3ICsxMDU4LDcgQEAKIAkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkJCSAgICJzY3NpKCVsZDolZDolZDolZCk6IE1pZC1sYXllciB1bmRlcmZsb3cgIgogCQkJCQkgICAiZGV0ZWN0ZWQgKCV4IG9mICV4IGJ5dGVzKS4uLnJldHVybmluZyAiCi0JCQkJCSAgICJlcnJvciBzdGF0dXMuXG4iLCBoYS0+aG9zdF9ubywKKwkJCQkJICAgImVycm9yIHN0YXR1cy5cbiIsIHZoYS0+aG9zdF9ubywKIAkJCQkJICAgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCiAJCQkJCSAgIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsCiAJCQkJCSAgIHNjc2lfYnVmZmxlbihjcCkpOwpAQCAtMTAzOSw3ICsxMDcyLDcgQEAKIAkJaWYgKGxzY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMKSB7CiAJCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICJzY3NpKCVsZCk6IFFVRVVFIEZVTEwgc3RhdHVzIGRldGVjdGVkICIKLQkJCSAgICAiMHgleC0weCV4LlxuIiwgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLAorCQkJICAgICIweCV4LTB4JXguXG4iLCB2aGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLAogCQkJICAgIHNjc2lfc3RhdHVzKSk7CiAKIAkJCS8qIEFkanVzdCBxdWV1ZSBkZXB0aCBmb3IgYWxsIGx1bnMgb24gdGhlIHBvcnQuICovCkBAIC0xMDc4LDcgKzExMTEsNyBAQAogCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFVOREVSUlVOIHN0YXR1cyBkZXRlY3RlZCAiCiAJCQkgICAgIjB4JXgtMHgleC4gcmVzaWQ9MHgleCBmd19yZXNpZD0weCV4IGNkYj0weCV4ICIKLQkJCSAgICAib3NfdW5kZXJmbG93PTB4JXhcbiIsIGhhLT5ob3N0X25vLAorCQkJICAgICJvc191bmRlcmZsb3c9MHgleFxuIiwgdmhhLT5ob3N0X25vLAogCQkJICAgIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNvbXBfc3RhdHVzLAogCQkJICAgIHNjc2lfc3RhdHVzLCByZXNpZF9sZW4sIHJlc2lkLCBjcC0+Y21uZFswXSwKIAkJCSAgICBjcC0+dW5kZXJmbG93KSk7CkBAIC0xMDk1LDcgKzExMjgsNyBAQAogCQkJaWYgKGxzY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMKSB7CiAJCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJCQkgICAgInNjc2koJWxkKTogUVVFVUUgRlVMTCBzdGF0dXMgZGV0ZWN0ZWQgIgotCQkJCSAgICAiMHgleC0weCV4LlxuIiwgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLAorCQkJCSAgICAiMHgleC0weCV4LlxuIiwgdmhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywKIAkJCQkgICAgc2NzaV9zdGF0dXMpKTsKIAogCQkJCS8qCkBAIC0xMTI1LDEwICsxMTU4LDEwIEBACiAJCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSkgewogCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkOiVkKSBEcm9wcGVkICIKIAkJCQkJICAgICAgImZyYW1lKHMpIGRldGVjdGVkICgleCBvZiAleCBieXRlcykuLi4iCi0JCQkJCSAgICAgICJyZXRyeWluZyBjb21tYW5kLlxuIiwgaGEtPmhvc3Rfbm8sCi0JCQkJCSAgICAgIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLAotCQkJCQkgICAgICBjcC0+ZGV2aWNlLT5sdW4sIHJlc2lkLAotCQkJCQkgICAgICBzY3NpX2J1ZmZsZW4oY3ApKSk7CisJCQkJCSAgICAgICJyZXRyeWluZyBjb21tYW5kLlxuIiwKKwkJCQkJdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCQljcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLCByZXNpZCwKKwkJCQkJc2NzaV9idWZmbGVuKGNwKSkpOwogCiAJCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKIAkJCQlicmVhazsKQEAgLTExNDAsNyArMTE3Myw3IEBACiAJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJCQkgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBNaWQtbGF5ZXIgdW5kZXJmbG93ICIKIAkJCQkJICAgImRldGVjdGVkICgleCBvZiAleCBieXRlcykuLi5yZXR1cm5pbmcgIgotCQkJCQkgICAiZXJyb3Igc3RhdHVzLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJCSAgICJlcnJvciBzdGF0dXMuXG4iLCB2aGEtPmhvc3Rfbm8sCiAJCQkJCSAgIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLAogCQkJCQkgICBjcC0+ZGV2aWNlLT5sdW4sIHJlc2lkLAogCQkJCQkgICBzY3NpX2J1ZmZsZW4oY3ApKTsKQEAgLTExNTcsNyArMTE5MCw3IEBACiAJY2FzZSBDU19EQVRBX09WRVJSVU46CiAJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCiAJCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBPVkVSUlVOIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXhcbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgY29tcF9zdGF0dXMsCisJCSAgICB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNvbXBfc3RhdHVzLAogCQkgICAgc2NzaV9zdGF0dXMpKTsKIAkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJICAgICJDREI6IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XG4iLApAQCAtMTE4Myw3ICsxMjE2LDcgQEAKIAkJICovCiAJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkKTogc3RhdHVzX2VudHJ5OiBQb3J0IERvd24gIgogCQkgICAgInBpZD0lbGQsIGNvbXBsIHN0YXR1cz0weCV4LCBwb3J0IHN0YXRlPTB4JXhcbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwKKwkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwKIAkJICAgIGNwLT5zZXJpYWxfbnVtYmVyLCBjb21wX3N0YXR1cywKIAkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSkpOwogCkBAIC0xMTk0LDEzICsxMjI3LDEzIEBACiAJCSAqLwogCQljcC0+cmVzdWx0ID0gRElEX1RSQU5TUE9SVF9ESVNSVVBURUQgPDwgMTY7CiAJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkKLQkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChmY3BvcnQtPmhhLCBmY3BvcnQsIDEsIDEpOworCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGZjcG9ydC0+dmhhLCBmY3BvcnQsIDEsIDEpOwogCQlicmVhazsKIAogCWNhc2UgQ1NfUkVTRVQ6CiAJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCiAJCSAgICAic2NzaSglbGQpOiBSRVNFVCBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CiAKIAkJY3AtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKIAkJYnJlYWs7CkBAIC0xMjEzLDcgKzEyNDYsNyBAQAogCQkgKi8KIAkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJICAgICJzY3NpKCVsZCk6IEFCT1JUIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCQkgICAgdmhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKIAogCQljcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwogCQlicmVhazsKQEAgLTEyMjksMjUgKzEyNjIsMjUgQEAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogVElNRU9VVCBzdGF0dXMgZGV0ZWN0ZWQgIgotCQkJICAgICIweCV4LTB4JXhcbiIsIGhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJICAgICIweCV4LTB4JXhcbiIsIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+Y2hhbm5lbCwKIAkJCSAgICBjcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLCBjb21wX3N0YXR1cywKIAkJCSAgICBzY3NpX3N0YXR1cykpOwogCQkJYnJlYWs7CiAJCX0KIAkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IFRJTUVPVVQgc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleCAiCi0JCSAgICAic2ZsYWdzPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAic2ZsYWdzPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5jaGFubmVsLAogCQkgICAgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzLAogCQkgICAgbGUxNl90b19jcHUoc3RzLT5zdGF0dXNfZmxhZ3MpKSk7CiAKIAkJLyogQ2hlY2sgdG8gc2VlIGlmIGxvZ291dCBvY2N1cnJlZC4gKi8KIAkJaWYgKChsZTE2X3RvX2NwdShzdHMtPnN0YXR1c19mbGFncykgJiBTRl9MT0dPVVRfU0VOVCkpCi0JCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoZmNwb3J0LT5oYSwgZmNwb3J0LCAxLCAxKTsKKwkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChmY3BvcnQtPnZoYSwgZmNwb3J0LCAxLCAxKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEVycm9yIGRldGVjdGVkICh1bmtub3duIHN0YXR1cykgIgotCQkgICAgIjB4JXgtMHgleC5cbiIsIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKwkJICAgICIweCV4LTB4JXguXG4iLCB2aGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOwogCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiVW5rbm93biBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKIAkJICAgIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cyk7CkBAIC0xMjU3LDcgKzEyOTAsNyBAQAogCX0KIAogCS8qIFBsYWNlIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4gKi8KLQlpZiAoaGEtPnN0YXR1c19zcmIgPT0gTlVMTCkKKwlpZiAodmhhLT5zdGF0dXNfc3JiID09IE5VTEwpCiAJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKIH0KIApAQCAtMTI2OSwxMCArMTMwMiwxMSBAQAogICogRXh0ZW5kZWQgc2Vuc2UgZGF0YS4KICAqLwogc3RhdGljIHZvaWQKLXFsYTJ4MDBfc3RhdHVzX2NvbnRfZW50cnkoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RzX2NvbnRfZW50cnlfdCAqcGt0KQorcWxhMngwMF9zdGF0dXNfY29udF9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RzX2NvbnRfZW50cnlfdCAqcGt0KQogewogCXVpbnQ4X3QJCXNlbnNlX3N6ID0gMDsKLQlzcmJfdAkJKnNwID0gaGEtPnN0YXR1c19zcmI7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3JiX3QJCSpzcCA9IHZoYS0+c3RhdHVzX3NyYjsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjcDsKIAogCWlmIChzcCAhPSBOVUxMICYmIHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAhPSAwKSB7CkBAIC0xMjg0LDcgKzEzMTgsNyBAQAogCQkJICAgICJjbWQgaXMgTlVMTDogYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3A9JXApXG4iLAogCQkJICAgIHNwKTsKIAotCQkJaGEtPnN0YXR1c19zcmIgPSBOVUxMOworCQkJdmhhLT5zdGF0dXNfc3JiID0gTlVMTDsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0xMzA1LDcgKzEzMzksNyBAQAogCiAJCS8qIFBsYWNlIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4gKi8KIAkJaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCA9PSAwKSB7Ci0JCQloYS0+c3RhdHVzX3NyYiA9IE5VTEw7CisJCQl2aGEtPnN0YXR1c19zcmIgPSBOVUxMOwogCQkJcWxhMngwMF9zcF9jb21wbChoYSwgc3ApOwogCQl9CiAJfQpAQCAtMTMxNywxMCArMTM1MSwxMSBAQAogICogQHBrdDogRW50cnkgcG9pbnRlcgogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9lcnJvcl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHNfZW50cnlfdCAqcGt0KQorcWxhMngwMF9lcnJvcl9lbnRyeShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCwgc3RzX2VudHJ5X3QgKnBrdCkKIHsKIAlzcmJfdCAqc3A7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gcnNwLT5yZXE7CiAjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQogCWlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX09SREVSKQogCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIEVudHJ5IE9yZGVyXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMzM5LDEzICsxMzc0LDEzIEBACiAKIAkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCiAJaWYgKHBrdC0+aGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQotCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXTsKKwkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdOwogCWVsc2UKIAkJc3AgPSBOVUxMOwogCiAJaWYgKHNwKSB7CiAJCS8qIEZyZWUgb3V0c3RhbmRpbmcgY29tbWFuZCBzbG90LiAqLwotCQloYS0+b3V0c3RhbmRpbmdfY21kc1twa3QtPmhhbmRsZV0gPSBOVUxMOworCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdID0gTlVMTDsKIAogCQkvKiBCYWQgcGF5bG9hZCBvciBoZWFkZXIgKi8KIAkJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYKQEAgLTEzNjIsMTIgKzEzOTcsMTIgQEAKIAl9IGVsc2UgaWYgKHBrdC0+ZW50cnlfdHlwZSA9PSBDT01NQU5EX0E2NF9UWVBFIHx8IHBrdC0+ZW50cnlfdHlwZSA9PQogCSAgICBDT01NQU5EX1RZUEUgfHwgcGt0LT5lbnRyeV90eXBlID09IENPTU1BTkRfVFlQRV83KSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRXJyb3IgZW50cnkgLSBpbnZhbGlkIGhhbmRsZVxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkgICAgIkVycm9yIGVudHJ5IC0gaW52YWxpZCBoYW5kbGVcbiIpOwogCi0JCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwotCQlxbGEyeHh4X3dha2VfZHBjKGhhKTsKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJfQogfQogCkBAIC0xMzc3LDEwICsxNDEyLDExIEBACiAgKiBAbWIwOiBNYWlsYm94MCByZWdpc3RlcgogICovCiBzdGF0aWMgdm9pZAotcWxhMjR4eF9tYnhfY29tcGxldGlvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBtYjApCitxbGEyNHh4X21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBtYjApCiB7CiAJdWludDE2X3QJY250OwogCXVpbnQxNl90IF9faW9tZW0gKndwdHI7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKIAkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KQEAgLTEzOTUsMTAgKzE0MzEsMTAgQEAKIAogCWlmIChoYS0+bWNwKSB7CiAJCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IEdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIGhhLT5tY3AtPm1iWzBdKSk7CisJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBoYS0+bWNwLT5tYlswXSkpOwogCX0gZWxzZSB7CiAJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogTUJYIHBvaW50ZXIgRVJST1IhXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogfQogCkBAIC0xNDA3LDMwICsxNDQzLDMzIEBACiAgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKICAqLwogdm9pZAotcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogewotCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSByc3AtPmh3OwogCXN0cnVjdCBzdHNfZW50cnlfMjR4eCAqcGt0OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGE7CiAKLQlpZiAoIWhhLT5mbGFncy5vbmxpbmUpCisJdmhhID0gcWxhMngwMF9nZXRfcnNwX2hvc3QocnNwKTsKKworCWlmICghdmhhLT5mbGFncy5vbmxpbmUpCiAJCXJldHVybjsKIAotCXdoaWxlIChoYS0+cmVzcG9uc2VfcmluZ19wdHItPnNpZ25hdHVyZSAhPSBSRVNQT05TRV9QUk9DRVNTRUQpIHsKLQkJcGt0ID0gKHN0cnVjdCBzdHNfZW50cnlfMjR4eCAqKWhhLT5yZXNwb25zZV9yaW5nX3B0cjsKKwl3aGlsZSAocnNwLT5yaW5nX3B0ci0+c2lnbmF0dXJlICE9IFJFU1BPTlNFX1BST0NFU1NFRCkgeworCQlwa3QgPSAoc3RydWN0IHN0c19lbnRyeV8yNHh4ICopcnNwLT5yaW5nX3B0cjsKIAotCQloYS0+cnNwX3JpbmdfaW5kZXgrKzsKLQkJaWYgKGhhLT5yc3BfcmluZ19pbmRleCA9PSBoYS0+cmVzcG9uc2VfcV9sZW5ndGgpIHsKLQkJCWhhLT5yc3BfcmluZ19pbmRleCA9IDA7Ci0JCQloYS0+cmVzcG9uc2VfcmluZ19wdHIgPSBoYS0+cmVzcG9uc2VfcmluZzsKKwkJcnNwLT5yaW5nX2luZGV4Kys7CisJCWlmIChyc3AtPnJpbmdfaW5kZXggPT0gcnNwLT5sZW5ndGgpIHsKKwkJCXJzcC0+cmluZ19pbmRleCA9IDA7CisJCQlyc3AtPnJpbmdfcHRyID0gcnNwLT5yaW5nOwogCQl9IGVsc2UgewotCQkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyKys7CisJCQlyc3AtPnJpbmdfcHRyKys7CiAJCX0KIAogCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewogCQkJREVCVUczKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgdmhhLT5ob3N0X25vKSk7CiAKLQkJCXFsYTJ4MDBfZXJyb3JfZW50cnkoaGEsIChzdHNfZW50cnlfdCAqKSBwa3QpOworCQkJcWxhMngwMF9lcnJvcl9lbnRyeSh2aGEsIHJzcCwgKHN0c19lbnRyeV90ICopIHBrdCk7CiAJCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CiAJCQl3bWIoKTsKIAkJCWNvbnRpbnVlOwpAQCAtMTQzOCwxMyArMTQ3NywxMyBAQAogCiAJCXN3aXRjaCAocGt0LT5lbnRyeV90eXBlKSB7CiAJCWNhc2UgU1RBVFVTX1RZUEU6Ci0JCQlxbGEyeDAwX3N0YXR1c19lbnRyeShoYSwgcGt0KTsKKwkJCXFsYTJ4MDBfc3RhdHVzX2VudHJ5KHZoYSwgcnNwLCBwa3QpOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVFVTX0NPTlRfVFlQRToKLQkJCXFsYTJ4MDBfc3RhdHVzX2NvbnRfZW50cnkoaGEsIChzdHNfY29udF9lbnRyeV90ICopcGt0KTsKKwkJCXFsYTJ4MDBfc3RhdHVzX2NvbnRfZW50cnkodmhhLCAoc3RzX2NvbnRfZW50cnlfdCAqKXBrdCk7CiAJCQlicmVhazsKIAkJY2FzZSBWUF9SUFRfSURfSU9DQl9UWVBFOgotCQkJcWxhMjR4eF9yZXBvcnRfaWRfYWNxdWlzaXRpb24oaGEsCisJCQlxbGEyNHh4X3JlcG9ydF9pZF9hY3F1aXNpdGlvbih2aGEsCiAJCQkgICAgKHN0cnVjdCB2cF9ycHRfaWRfZW50cnlfMjR4eCAqKXBrdCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTE0NTIsNyArMTQ5MSw3IEBACiAJCQlERUJVRzQocHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICJzY3NpKCVsZCk6IFJlY2VpdmVkIHVua25vd24gcmVzcG9uc2UgcGt0IHR5cGUgJXggIgogCQkJICAgICJlbnRyeSBzdGF0dXM9JXguXG4iLAotCQkJICAgIGhhLT5ob3N0X25vLCBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKSk7CisJCQkgICAgdmhhLT5ob3N0X25vLCBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKSk7CiAJCQlicmVhazsKIAkJfQogCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CkBAIC0xNDYwLDE0ICsxNDk5LDE1IEBACiAJfQogCiAJLyogQWRqdXN0IHJpbmcgaW5kZXggKi8KLQlXUlRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX291dCwgaGEtPnJzcF9yaW5nX2luZGV4KTsKKwloYS0+aXNwX29wcy0+d3J0X3JzcF9yZWcoaGEsIHJzcC0+aWQsIHJzcC0+cmluZ19pbmRleCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeHh4X2NoZWNrX3Jpc2Nfc3RhdHVzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeHh4X2NoZWNrX3Jpc2Nfc3RhdHVzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsOwogCXVpbnQzMl90IGNudDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAogCWlmICghSVNfUUxBMjVYWChoYSkpCkBAIC0xNTIxLDI1ICsxNTYxLDI5IEBACiBpcnFyZXR1cm5fdAogcWxhMjR4eF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc2NzaV9xbGFfaG9zdF90CSp2aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYTsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZzsKIAlpbnQJCXN0YXR1czsKIAl1bnNpZ25lZCBsb25nCWl0ZXI7CiAJdWludDMyX3QJc3RhdDsKIAl1aW50MzJfdAloY2NyOwogCXVpbnQxNl90CW1iWzRdOworCXN0cnVjdCByc3BfcXVlICpyc3A7CiAKLQloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgZGV2X2lkOwotCWlmICghaGEpIHsKKwlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOworCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcygpOiBOVUxMIGhvc3QgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCisJaGEgPSByc3AtPmh3OwogCXJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAlzdGF0dXMgPSAwOwogCiAJc3Bpbl9sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJdmhhID0gcWxhMngwMF9nZXRfcnNwX2hvc3QocnNwKTsKIAlmb3IgKGl0ZXIgPSA1MDsgaXRlci0tOyApIHsKIAkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT5ob3N0X3N0YXR1cyk7CiAJCWlmIChzdGF0ICYgSFNSWF9SSVNDX1BBVVNFRCkgewpAQCAtMTU0Nyw3ICsxNTkxLDcgQEAKIAkJCQlicmVhazsKIAogCQkJaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPT0gMCkKLQkJCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsoaGEsIEhXX0VWRU5UX1BBUklUWV9FUlIsCisJCQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKHZoYSwgSFdfRVZFTlRfUEFSSVRZX0VSUiwKIAkJCQkgICAgMCwgTVNXKHN0YXQpLCBMU1coc3RhdCkpOwogCQkJZWxzZSBpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA8IDB4ZmZmZmZmZmYpCiAJCQkJaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycysrOwpAQCAtMTU1NywxMCArMTYwMSwxMCBAQAogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgIgogCQkJICAgICJEdW1waW5nIGZpcm13YXJlIVxuIiwgaGNjcik7CiAKLQkJCXFsYTJ4eHhfY2hlY2tfcmlzY19zdGF0dXMoaGEpOworCQkJcWxhMnh4eF9jaGVja19yaXNjX3N0YXR1cyh2aGEpOwogCi0JCQloYS0+aXNwX29wcy0+ZndfZHVtcChoYSwgMSk7Ci0JCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWhhLT5pc3Bfb3BzLT5md19kdW1wKHZoYSwgMSk7CisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICgoc3RhdCAmIEhTUlhfUklTQ19JTlQpID09IDApCiAJCQlicmVhazsKQEAgLTE1NzAsNyArMTYxNCw3IEBACiAJCWNhc2UgMHgyOgogCQljYXNlIDB4MTA6CiAJCWNhc2UgMHgxMToKLQkJCXFsYTI0eHhfbWJ4X2NvbXBsZXRpb24oaGEsIE1TVyhzdGF0KSk7CisJCQlxbGEyNHh4X21ieF9jb21wbGV0aW9uKHZoYSwgTVNXKHN0YXQpKTsKIAkJCXN0YXR1cyB8PSBNQlhfSU5URVJSVVBUOwogCiAJCQlicmVhazsKQEAgLTE1NzksMTUgKzE2MjMsMTYgQEAKIAkJCW1iWzFdID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpOwogCQkJbWJbMl0gPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94Mik7CiAJCQltYlszXSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKTsKLQkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1iKTsKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQodmhhLCByc3AsIG1iKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTM6Ci0JCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQljYXNlIDB4MTQ6CisJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUocnNwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgIgogCQkJICAgICIoJWQpLlxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CiAJCQlicmVhazsKIAkJfQogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX0NMUl9SSVNDX0lOVCk7CkBAIC0xNjA3LDE1ICsxNjUyLDIyIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QKIHFsYTI0eHhfbXNpeF9yc3BfcShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhOworCXN0cnVjdCByc3BfcXVlICpyc3A7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWc7CiAKLQloYSA9IGRldl9pZDsKKwlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOworCWlmICghcnNwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWhhID0gcnNwLT5odzsKIAlyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKIAlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CiAKLQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShyc3ApOwogCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwpAQCAtMTYyNCwyMCArMTY3Niw2NCBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKK3FsYTI1eHhfbXNpeF9yc3BfcShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnOworCXVpbnQxNl90IG1zaXhfZGlzYWJsZWRfaGNjciA9IDA7CisKKwlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOworCWlmICghcnNwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwloYSA9IHJzcC0+aHc7CisJcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OworCisJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCisJbXNpeF9kaXNhYmxlZF9oY2NyID0gcnNwLT5vcHRpb25zOworCWlmICghcnNwLT5pZCkKKwkJbXNpeF9kaXNhYmxlZF9oY2NyICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzIyKTsKKwllbHNlCisJCW1zaXhfZGlzYWJsZWRfaGNjciAmPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF82KTsKKworCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShyc3ApOworCisJaWYgKCFtc2l4X2Rpc2FibGVkX2hjY3IpCisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKKworCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKIHFsYTI0eHhfbXNpeF9kZWZhdWx0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QJKmhhOworCXNjc2lfcWxhX2hvc3RfdAkqdmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CisJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZzsKIAlpbnQJCXN0YXR1czsKIAl1aW50MzJfdAlzdGF0OwogCXVpbnQzMl90CWhjY3I7CiAJdWludDE2X3QJbWJbNF07CiAKLQloYSA9IGRldl9pZDsKKwlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOworCWlmICghcnNwKSB7CisJCURFQlVHKHByaW50aygKKwkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwloYSA9IHJzcC0+aHc7CiAJcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCXN0YXR1cyA9IDA7CiAKIAlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJdmhhID0gcWxhMngwMF9nZXRfcnNwX2hvc3QocnNwKTsKIAlkbyB7CiAJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aG9zdF9zdGF0dXMpOwogCQlpZiAoc3RhdCAmIEhTUlhfUklTQ19QQVVTRUQpIHsKQEAgLTE2NDUsNyArMTc0MSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWlmIChoYS0+aHdfZXZlbnRfcGF1c2VfZXJyb3JzID09IDApCi0JCQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKGhhLCBIV19FVkVOVF9QQVJJVFlfRVJSLAorCQkJCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIEhXX0VWRU5UX1BBUklUWV9FUlIsCiAJCQkJICAgIDAsIE1TVyhzdGF0KSwgTFNXKHN0YXQpKTsKIAkJCWVsc2UgaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPCAweGZmZmZmZmZmKQogCQkJCWhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMrKzsKQEAgLTE2NTUsMTAgKzE3NTEsMTAgQEAKIAkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXgsICIKIAkJCSAgICAiRHVtcGluZyBmaXJtd2FyZSFcbiIsIGhjY3IpOwogCi0JCQlxbGEyeHh4X2NoZWNrX3Jpc2Nfc3RhdHVzKGhhKTsKKwkJCXFsYTJ4eHhfY2hlY2tfcmlzY19zdGF0dXModmhhKTsKIAotCQkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAoaGEsIDEpOwotCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQloYS0+aXNwX29wcy0+ZndfZHVtcCh2aGEsIDEpOworCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoKHN0YXQgJiBIU1JYX1JJU0NfSU5UKSA9PSAwKQogCQkJYnJlYWs7CkBAIC0xNjY4LDcgKzE3NjQsNyBAQAogCQljYXNlIDB4MjoKIAkJY2FzZSAweDEwOgogCQljYXNlIDB4MTE6Ci0JCQlxbGEyNHh4X21ieF9jb21wbGV0aW9uKGhhLCBNU1coc3RhdCkpOworCQkJcWxhMjR4eF9tYnhfY29tcGxldGlvbih2aGEsIE1TVyhzdGF0KSk7CiAJCQlzdGF0dXMgfD0gTUJYX0lOVEVSUlVQVDsKIAogCQkJYnJlYWs7CkBAIC0xNjc3LDE1ICsxNzczLDE2IEBACiAJCQltYlsxXSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxKTsKIAkJCW1iWzJdID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpOwogCQkJbWJbM10gPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94Myk7Ci0JCQlxbGEyeDAwX2FzeW5jX2V2ZW50KGhhLCBtYik7CisJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KHZoYSwgcnNwLCBtYik7CiAJCQlicmVhazsKIAkJY2FzZSAweDEzOgotCQkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKwkJY2FzZSAweDE0OgorCQkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHJzcCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICIKIAkJCSAgICAiKCVkKS5cbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CisJCQkgICAgdmhhLT5ob3N0X25vLCBzdGF0ICYgMHhmZikpOwogCQkJYnJlYWs7CiAJCX0KIAkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9DTFJfUklTQ19JTlQpOwpAQCAtMTcxMCw3MCArMTgwNywxMzggQEAKIAlpcnFfaGFuZGxlcl90IGhhbmRsZXI7CiB9OwogCi1zdGF0aWMgc3RydWN0IHFsYV9pbml0X21zaXhfZW50cnkgaW1zaXhfZW50cmllc1tRTEFfTVNJWF9FTlRSSUVTXSA9IHsKLQl7IFFMQV9NU0lYX0RFRkFVTFQsIFFMQV9NSURYX0RFRkFVTFQsCi0JCSJxbGEyeHh4IChkZWZhdWx0KSIsIHFsYTI0eHhfbXNpeF9kZWZhdWx0IH0sCitzdGF0aWMgc3RydWN0IHFsYV9pbml0X21zaXhfZW50cnkgYmFzZV9xdWV1ZSA9IHsKKwkuZW50cnkgPSAwLAorCS5pbmRleCA9IDAsCisJLm5hbWUgPSAicWxhMnh4eCAoZGVmYXVsdCkiLAorCS5oYW5kbGVyID0gcWxhMjR4eF9tc2l4X2RlZmF1bHQsCit9OwogCi0JeyBRTEFfTVNJWF9SU1BfUSwgUUxBX01JRFhfUlNQX1EsCi0JCSJxbGEyeHh4IChyc3BfcSkiLCBxbGEyNHh4X21zaXhfcnNwX3EgfSwKK3N0YXRpYyBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSBiYXNlX3JzcF9xdWV1ZSA9IHsKKwkuZW50cnkgPSAxLAorCS5pbmRleCA9IDEsCisJLm5hbWUgPSAicWxhMnh4eCAocnNwX3EpIiwKKwkuaGFuZGxlciA9IHFsYTI0eHhfbXNpeF9yc3BfcSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSBtdWx0aV9yc3BfcXVldWUgPSB7CisJLmVudHJ5ID0gMSwKKwkuaW5kZXggPSAxLAorCS5uYW1lID0gInFsYTJ4eHggKG11bHRpX3EpIiwKKwkuaGFuZGxlciA9IHFsYTI1eHhfbXNpeF9yc3BfcSwKIH07CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X2Rpc2FibGVfbXNpeChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF9kaXNhYmxlX21zaXgoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgKnFlbnRyeTsKIAotCWZvciAoaSA9IDA7IGkgPCBRTEFfTVNJWF9FTlRSSUVTOyBpKyspIHsKLQkJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbaW1zaXhfZW50cmllc1tpXS5pbmRleF07CisJZm9yIChpID0gMDsgaSA8IGhhLT5tc2l4X2NvdW50OyBpKyspIHsKKwkJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbaV07CiAJCWlmIChxZW50cnktPmhhdmVfaXJxKQotCQkJZnJlZV9pcnEocWVudHJ5LT5tc2l4X3ZlY3RvciwgaGEpOworCQkJZnJlZV9pcnEocWVudHJ5LT52ZWN0b3IsIHFlbnRyeS0+cnNwKTsKIAl9CiAJcGNpX2Rpc2FibGVfbXNpeChoYS0+cGRldik7CisJa2ZyZWUoaGEtPm1zaXhfZW50cmllcyk7CisJaGEtPm1zaXhfZW50cmllcyA9IE5VTEw7CisJaGEtPmZsYWdzLm1zaXhfZW5hYmxlZCA9IDA7CiB9CiAKIHN0YXRpYyBpbnQKLXFsYTI0eHhfZW5hYmxlX21zaXgoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTI0eHhfZW5hYmxlX21zaXgoc3RydWN0IHFsYV9od19kYXRhICpoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCkKIHsKIAlpbnQgaSwgcmV0OwotCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbUUxBX01TSVhfRU5UUklFU107CisJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXM7CiAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICpxZW50cnk7CisJc3RydWN0IHFsYV9pbml0X21zaXhfZW50cnkgKm1zaXhfcXVldWU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUUxBX01TSVhfRU5UUklFUzsgaSsrKQotCQllbnRyaWVzW2ldLmVudHJ5ID0gaW1zaXhfZW50cmllc1tpXS5lbnRyeTsKKwllbnRyaWVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpICogaGEtPm1zaXhfY291bnQsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBwY2lfZW5hYmxlX21zaXgoaGEtPnBkZXYsIGVudHJpZXMsIEFSUkFZX1NJWkUoZW50cmllcykpOworCWZvciAoaSA9IDA7IGkgPCBoYS0+bXNpeF9jb3VudDsgaSsrKQorCQllbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCXJldCA9IHBjaV9lbmFibGVfbXNpeChoYS0+cGRldiwgZW50cmllcywgaGEtPm1zaXhfY291bnQpOwogCWlmIChyZXQpIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk1TSS1YOiBGYWlsZWQgdG8gZW5hYmxlIHN1cHBvcnQgLS0gJWQvJWRcbiIsCi0JCSAgICBRTEFfTVNJWF9FTlRSSUVTLCByZXQpOworCQkJIk1TSS1YOiBGYWlsZWQgdG8gZW5hYmxlIHN1cHBvcnQgLS0gJWQvJWRcbiIKKwkJCSIgUmV0cnkgd2l0aCAlZCB2ZWN0b3JzXG4iLCBoYS0+bXNpeF9jb3VudCwgcmV0LCByZXQpOworCQloYS0+bXNpeF9jb3VudCA9IHJldDsKKwkJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KGhhLT5wZGV2LCBlbnRyaWVzLCBoYS0+bXNpeF9jb3VudCk7CisJCWlmIChyZXQpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIk1TSS1YOiBGYWlsZWQgdG8gZW5hYmxlIgorCQkJCSIgc3VwcG9ydCwgZ2l2aW5nIHVwIC0tICVkLyVkXG4iLAorCQkJCWhhLT5tc2l4X2NvdW50LCByZXQpOworCQkJZ290byBtc2l4X291dDsKKwkJfQorCQloYS0+bWF4X3F1ZXVlcyA9IGhhLT5tc2l4X2NvdW50IC0gMTsKKwl9CisJaGEtPm1zaXhfZW50cmllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGFfbXNpeF9lbnRyeSkgKgorCQkJCWhhLT5tc2l4X2NvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhLT5tc2l4X2VudHJpZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBtc2l4X291dDsKIAl9CiAJaGEtPmZsYWdzLm1zaXhfZW5hYmxlZCA9IDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUUxBX01TSVhfRU5UUklFUzsgaSsrKSB7Ci0JCXFlbnRyeSA9ICZoYS0+bXNpeF9lbnRyaWVzW2ltc2l4X2VudHJpZXNbaV0uaW5kZXhdOwotCQlxZW50cnktPm1zaXhfdmVjdG9yID0gZW50cmllc1tpXS52ZWN0b3I7Ci0JCXFlbnRyeS0+bXNpeF9lbnRyeSA9IGVudHJpZXNbaV0uZW50cnk7CisJZm9yIChpID0gMDsgaSA8IGhhLT5tc2l4X2NvdW50OyBpKyspIHsKKwkJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbaV07CisJCXFlbnRyeS0+dmVjdG9yID0gZW50cmllc1tpXS52ZWN0b3I7CisJCXFlbnRyeS0+ZW50cnkgPSBlbnRyaWVzW2ldLmVudHJ5OwogCQlxZW50cnktPmhhdmVfaXJxID0gMDsKLQkJcmV0ID0gcmVxdWVzdF9pcnEocWVudHJ5LT5tc2l4X3ZlY3RvciwKLQkJICAgIGltc2l4X2VudHJpZXNbaV0uaGFuZGxlciwgMCwgaW1zaXhfZW50cmllc1tpXS5uYW1lLCBoYSk7Ci0JCWlmIChyZXQpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTVNJLVg6IFVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIC0tICV4LyVkLlxuIiwKLQkJCSAgICBpbXNpeF9lbnRyaWVzW2ldLmluZGV4LCByZXQpOwotCQkJcWxhMjR4eF9kaXNhYmxlX21zaXgoaGEpOwotCQkJZ290byBtc2l4X291dDsKLQkJfQotCQlxZW50cnktPmhhdmVfaXJxID0gMTsKKwkJcWVudHJ5LT5yc3AgPSBOVUxMOwogCX0KIAorCS8qIEVuYWJsZSBNU0ktWCBmb3IgQUVOcyBmb3IgcXVldWUgMCAqLworCXFlbnRyeSA9ICZoYS0+bXNpeF9lbnRyaWVzWzBdOworCXJldCA9IHJlcXVlc3RfaXJxKHFlbnRyeS0+dmVjdG9yLCBiYXNlX3F1ZXVlLmhhbmRsZXIsIDAsCisJCQkJCWJhc2VfcXVldWUubmFtZSwgcnNwKTsKKwlpZiAocmV0KSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSJNU0ktWDogVW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgLS0gJXgvJWQuXG4iLAorCQkJcWVudHJ5LT52ZWN0b3IsIHJldCk7CisJCXFsYTI0eHhfZGlzYWJsZV9tc2l4KGhhKTsKKwkJZ290byBtc2l4X291dDsKKwl9CisJcWVudHJ5LT5oYXZlX2lycSA9IDE7CisJcWVudHJ5LT5yc3AgPSByc3A7CisKKwkvKiBFbmFibGUgTVNJLVggdmVjdG9yIGZvciByZXNwb25zZSBxdWV1ZSB1cGRhdGUgZm9yIHF1ZXVlIDAgKi8KKwlpZiAoaGEtPm1heF9xdWV1ZXMgPiAxICYmIGhhLT5tcWlvYmFzZSkgeworCQloYS0+bXFlbmFibGUgPSAxOworCQltc2l4X3F1ZXVlID0gJm11bHRpX3JzcF9xdWV1ZTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSJNUSBlbmFibGVkLCBOdW1iZXIgb2YgUXVldWUgUmVzb3VyY2VzOiAlZCBcbiIsCisJCQkJaGEtPm1heF9xdWV1ZXMpOworCX0gZWxzZSB7CisJCWhhLT5tcWVuYWJsZSA9IDA7CisJCW1zaXhfcXVldWUgPSAmYmFzZV9yc3BfcXVldWU7CisJfQorCisJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbMV07CisJcmV0ID0gcmVxdWVzdF9pcnEocWVudHJ5LT52ZWN0b3IsIG1zaXhfcXVldWUtPmhhbmRsZXIsIDAsCisJCQkJCQltc2l4X3F1ZXVlLT5uYW1lLCByc3ApOworCWlmIChyZXQpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJIk1TSS1YOiBVbmFibGUgdG8gcmVnaXN0ZXIgaGFuZGxlciAtLSAleC8lZC5cbiIsCisJCQlxZW50cnktPnZlY3RvciwgcmV0KTsKKwkJcWxhMjR4eF9kaXNhYmxlX21zaXgoaGEpOworCQloYS0+bXFlbmFibGUgPSAwOworCQlnb3RvIG1zaXhfb3V0OworCX0KKwlxZW50cnktPmhhdmVfaXJxID0gMTsKKwlxZW50cnktPnJzcCA9IHJzcDsKKwogbXNpeF9vdXQ6CisJa2ZyZWUoZW50cmllcyk7CiAJcmV0dXJuIHJldDsKIH0KIAogaW50Ci1xbGEyeDAwX3JlcXVlc3RfaXJxcyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9yZXF1ZXN0X2lycXMoc3RydWN0IHFsYV9od19kYXRhICpoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCkKIHsKIAlpbnQgcmV0OwogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOwpAQCAtMTc4MiwxMSArMTk0NywxMSBAQAogCWlmICghSVNfUUxBMjQzMihoYSkgJiYgIUlTX1FMQTI1MzIoaGEpICYmICFJU19RTEE4NDMyKGhhKSkKIAkJZ290byBza2lwX21zaXg7CiAKLSAgICAgICAgaWYgKElTX1FMQTI0MzIoaGEpICYmIChoYS0+Y2hpcF9yZXZpc2lvbiA8IFFMQV9NU0lYX0NISVBfUkVWXzI0WFggfHwKLQkgICAgIVFMQV9NU0lYX0ZXX01PREVfMShoYS0+ZndfYXR0cmlidXRlcykpKSB7CisJaWYgKElTX1FMQTI0MzIoaGEpICYmIChoYS0+cGRldi0+cmV2aXNpb24gPCBRTEFfTVNJWF9DSElQX1JFVl8yNFhYIHx8CisJCSFRTEFfTVNJWF9GV19NT0RFXzEoaGEtPmZ3X2F0dHJpYnV0ZXMpKSkgewogCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk1TSS1YOiBVbnN1cHBvcnRlZCBJU1AyNDMyICgweCVYLCAweCVYKS5cbiIsCi0JCSAgICBoYS0+Y2hpcF9yZXZpc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpKTsKKwkJIk1TSS1YOiBVbnN1cHBvcnRlZCBJU1AyNDMyICgweCVYLCAweCVYKS5cbiIsCisJCQloYS0+cGRldi0+cmV2aXNpb24sIGhhLT5md19hdHRyaWJ1dGVzKSk7CiAKIAkJZ290byBza2lwX21zaXg7CiAJfQpAQCAtMTgwMyw3ICsxOTY4LDcgQEAKIAkJZ290byBza2lwX21zaTsKIAl9CiAKLQlyZXQgPSBxbGEyNHh4X2VuYWJsZV9tc2l4KGhhKTsKKwlyZXQgPSBxbGEyNHh4X2VuYWJsZV9tc2l4KGhhLCByc3ApOwogCWlmICghcmV0KSB7CiAJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiTVNJLVg6IEVuYWJsZWQgKDB4JVgsIDB4JVgpLlxuIiwgaGEtPmNoaXBfcmV2aXNpb24sCkBAIC0xODI1LDcgKzE5OTAsNyBAQAogc2tpcF9tc2k6CiAKIAlyZXQgPSByZXF1ZXN0X2lycShoYS0+cGRldi0+aXJxLCBoYS0+aXNwX29wcy0+aW50cl9oYW5kbGVyLAotCSAgICBJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCBRTEEyWFhYX0RSSVZFUl9OQU1FLCBoYSk7CisJICAgIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsIFFMQTJYWFhfRFJJVkVSX05BTUUsIHJzcCk7CiAJaWYgKHJldCkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiRmFpbGVkIHRvIHJlc2VydmUgaW50ZXJydXB0ICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKQEAgLTE4MzMsMTAgKzE5OTgsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCWhhLT5mbGFncy5pbnRhX2VuYWJsZWQgPSAxOwotCWhhLT5ob3N0LT5pcnEgPSBoYS0+cGRldi0+aXJxOwogY2xlYXJfcmlzY19pbnRzOgogCi0JaGEtPmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOwogCXNwaW5fbG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LmhjY3IsIEhDQ1JYX0NMUl9IT1NUX0lOVCk7CkBAIC0xODUzLDEzICsyMDE2LDc0IEBACiB9CiAKIHZvaWQKLXFsYTJ4MDBfZnJlZV9pcnFzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2ZyZWVfaXJxcyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKIAogCWlmIChoYS0+ZmxhZ3MubXNpeF9lbmFibGVkKQogCQlxbGEyNHh4X2Rpc2FibGVfbXNpeChoYSk7CiAJZWxzZSBpZiAoaGEtPmZsYWdzLmludGFfZW5hYmxlZCkgewotCQlmcmVlX2lycShoYS0+aG9zdC0+aXJxLCBoYSk7CisJCWZyZWVfaXJxKGhhLT5wZGV2LT5pcnEsIHJzcCk7CiAJCXBjaV9kaXNhYmxlX21zaShoYS0+cGRldik7CiAJfQogfQorCitzdGF0aWMgc3RydWN0IHNjc2lfcWxhX2hvc3QgKgorcWxhMngwMF9nZXRfcnNwX2hvc3Qoc3RydWN0IHJzcF9xdWUgKnJzcCkKK3sKKwlzcmJfdCAqc3A7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHJzcC0+aHc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IE5VTEw7CisJc3RydWN0IHN0c19lbnRyeV8yNHh4ICpwa3Q7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKKworCWlmIChyc3AtPmlkKSB7CisJCXBrdCA9IChzdHJ1Y3Qgc3RzX2VudHJ5XzI0eHggKikgcnNwLT5yaW5nX3B0cjsKKwkJcmVxID0gcnNwLT5yZXE7CisJCWlmIChwa3QgJiYgcGt0LT5oYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXTsKKwkJCWlmIChzcCkKKwkJCQl2aGEgPSBzcC0+dmhhOworCQl9CisJfQorCWlmICghdmhhKQorCS8qIGhhbmRsZSBpdCBpbiBiYXNlIHF1ZXVlICovCisJCXZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisKKwlyZXR1cm4gdmhhOworfQorCitpbnQgcWxhMjV4eF9yZXF1ZXN0X2lycShzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSByc3AtPmh3OworCXN0cnVjdCBxbGFfaW5pdF9tc2l4X2VudHJ5ICppbnRyID0gJm11bHRpX3JzcF9xdWV1ZTsKKwlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgKm1zaXggPSByc3AtPm1zaXg7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKG1zaXgtPnZlY3RvciwgaW50ci0+aGFuZGxlciwgMCwgaW50ci0+bmFtZSwgcnNwKTsKKwlpZiAocmV0KSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSJNU0ktWDogVW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgLS0gJXgvJWQuXG4iLAorCQkJbXNpeC0+dmVjdG9yLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwltc2l4LT5oYXZlX2lycSA9IDE7CisJbXNpeC0+cnNwID0gcnNwOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3FsYTI1eHhfd3J0X3JzcF9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQsIHVpbnQxNl90IGluZGV4KQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSAodm9pZCAqKSBoYS0+bXFpb2Jhc2UgKyBRTEFfUVVFX1BBR0UgKiBpZDsKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI1bXEucnNwX3Ffb3V0LCBpbmRleCk7Cit9CisKK3ZvaWQKK3FsYTI0eHhfd3J0X3JzcF9yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgaWQsIHVpbnQxNl90IGluZGV4KQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSAodm9pZCAqKSBoYS0+aW9iYXNlOworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQucnNwX3Ffb3V0LCBpbmRleCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCAzNDAyNzQ2Li5hOTk5NzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0yOSw3ICsyOSw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoc2NzaV9xbGFfaG9zdF90ICpwdmhhLCBtYnhfY21kX3QgKm1jcCkKK3FsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBtYnhfY21kX3QgKm1jcCkKIHsKIAlpbnQJCXJ2YWw7CiAJdW5zaWduZWQgbG9uZyAgICBmbGFncyA9IDA7CkBAIC00MiwxNSArNDIsMTYgQEAKIAl1aW50MzJfdAljbnQ7CiAJdWludDMyX3QJbWJveGVzOwogCXVuc2lnbmVkIGxvbmcJd2FpdF90aW1lOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfcGFyZW50KHB2aGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcmVnID0gaGEtPmlvYmFzZTsKLQlpb19sb2NrX29uID0gaGEtPmZsYWdzLmluaXRfZG9uZTsKKwlpb19sb2NrX29uID0gYmFzZV92aGEtPmZsYWdzLmluaXRfZG9uZTsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKLQlhYm9ydF9hY3RpdmUgPSB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJYWJvcnRfYWN0aXZlID0gdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgcHZoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAKIAkvKgogCSAqIFdhaXQgZm9yIGFjdGl2ZSBtYWlsYm94IGNvbW1hbmRzIHRvIGZpbmlzaCBieSB3YWl0aW5nIGF0IG1vc3QgdG92CkBAIC02Miw3ICs2Myw3IEBACiAJCSAgICBtY3AtPnRvdiAqIEhaKSkgewogCQkJLyogVGltZW91dCBvY2N1cnJlZC4gUmV0dXJuIGVycm9yLiAqLwogCQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBjbWQgYWNjZXNzIHRpbWVvdXQuICIKLQkJCSAgICAiRXhpdGluZy5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkJICAgICJFeGl0aW5nLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CiAJCX0KIAl9CkBAIC03Miw3ICs3Myw3IEBACiAJaGEtPm1jcCA9IG1jcDsKIAogCURFQlVHMTEocHJpbnRrKCJzY3NpKCVsZCk6IHByZXBhcmUgdG8gaXNzdWUgbWJveCBjbWQ9MHgleC5cbiIsCi0JICAgIGhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CisJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMTAwLDE1ICsxMDEsMTYgQEAKIAogI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMSkKIAlwcmludGsoIiVzKCVsZCk6IExvYWRlZCBNQlggcmVnaXN0ZXJzIChkaXNwbGF5ZWQgaW4gYnl0ZXMpID0gXG4iLAotCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pOworCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pOwogCXFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltY3AtPm1iLCAxNik7CiAJcHJpbnRrKCJcbiIpOwogCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MTApLCAxNik7CiAJcHJpbnRrKCJcbiIpOwogCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MjApLCA4KTsKIAlwcmludGsoIlxuIik7Ci0JcHJpbnRrKCIlcyglbGQpOiBJL08gYWRkcmVzcyA9ICVwLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBvcHRyKTsKLQlxbGEyeDAwX2R1bXBfcmVncyhoYSk7CisJcHJpbnRrKCIlcyglbGQpOiBJL08gYWRkcmVzcyA9ICVwLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAorCQlvcHRyKTsKKwlxbGEyeDAwX2R1bXBfcmVncyhiYXNlX3ZoYSk7CiAjZW5kaWYKIAogCS8qIElzc3VlIHNldCBob3N0IGludGVycnVwdCBjb21tYW5kIHRvIHNlbmQgY21kIG91dC4gKi8KQEAgLTExNyw3ICsxMTksNyBAQAogCiAJLyogVW5sb2NrIG1ieCByZWdpc3RlcnMgYW5kIHdhaXQgZm9yIGludGVycnVwdCAqLwogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBnb2luZyB0byB1bmxvY2sgaXJxICYgd2FpdGluZyBmb3IgaW50ZXJydXB0LiAiCi0JICAgICJqaWZmaWVzPSVseC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgamlmZmllcykpOworCSAgICAiamlmZmllcz0lbHguXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sIGppZmZpZXMpKTsKIAogCS8qIFdhaXQgZm9yIG1ieCBjbWQgY29tcGxldGlvbiB1bnRpbCB0aW1lb3V0ICovCiAKQEAgLTEzNyw3ICsxMzksNyBAQAogCiAJfSBlbHNlIHsKIAkJREVCVUczXzExKHByaW50aygiJXMoJWxkKTogY21kPSV4IFBPTExJTkcgTU9ERS5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGNvbW1hbmQpKTsKKwkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBjb21tYW5kKSk7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LmhjY3IsIEhDQ1JYX1NFVF9IT1NUX0lOVCk7CkBAIC0xNTEsNyArMTUzLDcgQEAKIAkJCQlicmVhazsKIAogCQkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KLQkJCXFsYTJ4MDBfcG9sbChoYSk7CisJCQlxbGEyeDAwX3BvbGwoaGEtPnJzcF9xX21hcFswXSk7CiAKIAkJCWlmIChjb21tYW5kICE9IE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVEICYmCiAJCQkgICAgIWhhLT5mbGFncy5tYm94X2ludCkKQEAgLTE2NCw3ICsxNjYsNyBAQAogCQl1aW50MTZfdCAqaXB0cjI7CiAKIAkJREVCVUczXzExKHByaW50aygiJXMoJWxkKTogY21kICV4IGNvbXBsZXRlZC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGNvbW1hbmQpKTsKKwkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBjb21tYW5kKSk7CiAKIAkJLyogR290IGludGVycnVwdC4gQ2xlYXIgdGhlIGZsYWcuICovCiAJCWhhLT5mbGFncy5tYm94X2ludCA9IDA7CkBAIC0yMDAsMTIgKzIwMiwxMiBAQAogCQkJaWN0cmwgPSBSRF9SRUdfV09SRCgmcmVnLT5pc3AuaWN0cmwpOwogCQl9CiAJCXByaW50aygiJXMoJWxkKTogKioqKiBNQiBDb21tYW5kIFRpbWVvdXQgZm9yIGNtZCAleCAqKioqXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBjb21tYW5kKTsKKwkJICAgIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgY29tbWFuZCk7CiAJCXByaW50aygiJXMoJWxkKTogaWNvbnRyb2w9JXggamlmZmllcz0lbHhcbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGljdHJsLCBqaWZmaWVzKTsKKwkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBpY3RybCwgamlmZmllcyk7CiAJCXByaW50aygiJXMoJWxkKTogKioqIG1haWxib3hbMF0gPSAweCV4ICoqKlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgbWIwKTsKLQkJcWxhMngwMF9kdW1wX3JlZ3MoaGEpOworCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIG1iMCk7CisJCXFsYTJ4MDBfZHVtcF9yZWdzKGJhc2VfdmhhKTsKICNlbmRpZgogCiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKQEAgLTIxOCwxMCArMjIwLDEwIEBACiAKIAlpZiAoYWJvcnRfYWN0aXZlIHx8ICFpb19sb2NrX29uKSB7CiAJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBjaGVja2luZyBmb3IgYWRkaXRpb25hbCByZXNwICIKLQkJICAgICJpbnRlcnJ1cHQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJpbnRlcnJ1cHQuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAogCQkvKiBwb2xsaW5nIG1vZGUgZm9yIG5vbiBpc3BfYWJvcnQgY29tbWFuZHMuICovCi0JCXFsYTJ4MDBfcG9sbChoYSk7CisJCXFsYTJ4MDBfcG9sbChoYS0+cnNwX3FfbWFwWzBdKTsKIAl9CiAKIAlpZiAocnZhbCA9PSBRTEFfRlVOQ1RJT05fVElNRU9VVCAmJgpAQCAtMjI5LDM1ICsyMzEsMzcgQEAKIAkJaWYgKCFpb19sb2NrX29uIHx8IChtY3AtPmZsYWdzICYgSU9DVExfQ01EKSkgewogCQkJLyogbm90IGluIGRwYy4gc2NoZWR1bGUgaXQgZm9yIGRwYyB0byB0YWtlIG92ZXIuICovCiAJCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgc2NoZWR1bGUgIgotCQkJICAgICJpc3BfYWJvcnRfbmVlZGVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkiaXNwX2Fib3J0X25lZWRlZC5cbiIsIF9fZnVuY19fLAorCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBzY2hlZHVsZSAiCi0JCQkgICAgImlzcF9hYm9ydF9uZWVkZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJCSJpc3BfYWJvcnRfbmVlZGVkLlxuIiwgX19mdW5jX18sCisJCQliYXNlX3ZoYS0+aG9zdF9ubykpOwogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJICAgICJNYWlsYm94IGNvbW1hbmQgdGltZW91dCBvY2N1cnJlZC4gU2NoZWR1bGluZyBJU1AgIgogCQkJICAgICJhYm9ydC5cbiIpOwotCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JCQlxbGEyeHh4X3dha2VfZHBjKGhhKTsKKwkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOworCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQl9IGVsc2UgaWYgKCFhYm9ydF9hY3RpdmUpIHsKIAkJCS8qIGNhbGwgYWJvcnQgZGlyZWN0bHkgc2luY2Ugd2UgYXJlIGluIHRoZSBEUEMgdGhyZWFkICovCiAJCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgY2FsbGluZyBhYm9ydF9pc3BcbiIsCi0JCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgY2FsbGluZyAiCi0JCQkgICAgImFib3J0X2lzcFxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkgICAgImFib3J0X2lzcFxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VycmVkLiBJc3N1aW5nIElTUCAiCiAJCQkgICAgImFib3J0LlxuIik7CiAKLQkJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJCWlmIChxbGEyeDAwX2Fib3J0X2lzcChoYSkpIHsKKwkJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOworCQkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWlmIChxbGEyeDAwX2Fib3J0X2lzcChiYXNlX3ZoYSkpIHsKIAkJCQkvKiBGYWlsZWQuIHJldHJ5IGxhdGVyLiAqLwotCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCQkJfQotCQkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IGZpbmlzaGVkIGFib3J0X2lzcFxuIiwgX19mdW5jX18sCi0JCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmaW5pc2hlZCBhYm9ydF9pc3BcbiIsCi0JCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCX0KIAl9CiAKQEAgLTI2NywyNCArMjcxLDI2IEBACiAKIAlpZiAocnZhbCkgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6ICoqKiogRkFJTEVELiBtYngwPSV4LCBtYngxPSV4LCAiCi0JCSAgICAibWJ4Mj0leCwgY21kPSV4ICoqKipcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkJICAgICJtYngyPSV4LCBjbWQ9JXggKioqKlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAogCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwgY29tbWFuZCkpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sCisJCWJhc2VfdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIGludAotcWxhMngwMF9sb2FkX3JhbShzY3NpX3FsYV9ob3N0X3QgKmhhLCBkbWFfYWRkcl90IHJlcV9kbWEsIHVpbnQzMl90IHJpc2NfYWRkciwKK3FsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICp2aGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDMyX3QgcmlzY19hZGRyLAogICAgIHVpbnQzMl90IHJpc2NfY29kZV9zaXplKQogewogCWludCBydmFsOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAlpZiAoTVNXKHJpc2NfYWRkcikgfHwgSVNfRldJMl9DQVBBQkxFKGhhKSkgewogCQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQ7CkBAIC0zMTIsMTMgKzMxOCwxMyBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNDAsMTMgKzM0NiwxNCBAQAogICogICAgIEtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfZXhlY3V0ZV9mdyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByaXNjX2FkZHIpCitxbGEyeDAwX2V4ZWN1dGVfZncoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90IHJpc2NfYWRkcikKIHsKIAlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19FWEVDVVRFX0ZJUk1XQVJFOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0zNjksMTggKzM3NiwxOCBAQAogCiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOwogCX0gZWxzZSB7CiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CiAJCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZSBleGNoYW5nZXM9JXguXG4iLAotCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgbWNwLT5tYlsxXSkpOworCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMV0pKTsKIAkJfSBlbHNlIHsKIAkJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sCi0JCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJfQogCX0KIApAQCAtNDA0LDI4ICs0MTEsMjggQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiB2b2lkCi1xbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICptYWpvciwgdWludDE2X3QgKm1pbm9yLAorcWxhMngwMF9nZXRfZndfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKm1ham9yLCB1aW50MTZfdCAqbWlub3IsCiAgICAgdWludDE2X3QgKnN1Ym1pbm9yLCB1aW50MTZfdCAqYXR0cmlidXRlcywgdWludDMyX3QgKm1lbW9yeSkKIHsKIAlpbnQJCXJ2YWw7CiAJbWJ4X2NtZF90CW1jOwogCW1ieF9jbWRfdAkqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1ZFUlNJT047CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJbWNwLT5mbGFncyA9IDA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAkvKiBSZXR1cm4gbWFpbGJveCBkYXRhLiAqLwogCSptYWpvciA9IG1jcC0+bWJbMV07CiAJKm1pbm9yID0gbWNwLT5tYlsyXTsKIAkqc3VibWlub3IgPSBtY3AtPm1iWzNdOwogCSphdHRyaWJ1dGVzID0gbWNwLT5tYls2XTsKLQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJaWYgKElTX1FMQTIxMDAodmhhLT5odykgfHwgSVNfUUxBMjIwMCh2aGEtPmh3KSkKIAkJKm1lbW9yeSA9IDB4MUZGRkY7CQkJLyogRGVmYXVsdHMgdG8gMTI4S0IuICovCiAJZWxzZQogCQkqbWVtb3J5ID0gKG1jcC0+bWJbNV0gPDwgMTYpIHwgbWNwLT5tYls0XTsKQEAgLTQzMywxMCArNDQwLDEwIEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIH0KIApAQCAtNDU1LDMyICs0NjIsMzIgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgKmZ3b3B0cykKK3FsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90ICpmd29wdHMpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX09QVElPTjsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0gZWxzZSB7CiAJCWZ3b3B0c1swXSA9IG1jcC0+bWJbMF07CiAJCWZ3b3B0c1sxXSA9IG1jcC0+bWJbMV07CiAJCWZ3b3B0c1syXSA9IG1jcC0+bWJbMl07CiAJCWZ3b3B0c1szXSA9IG1jcC0+bWJbM107CiAKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC01MDIsMTMgKzUwOSwxMyBAQAogICoJS2VybmVsIGNvbnRleHQuCiAgKi8KIGludAotcWxhMngwMF9zZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqZndvcHRzKQorcWxhMngwMF9zZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKmZ3b3B0cykKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19TRVRfRklSTVdBUkVfT1BUSU9OOwogCW1jcC0+bWJbMV0gPSBmd29wdHNbMV07CkBAIC01MTYsNyArNTIzLDcgQEAKIAltY3AtPm1iWzNdID0gZndvcHRzWzNdOwogCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8wOwotCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CisJaWYgKElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkgewogCQltY3AtPmluX21iIHw9IE1CWF8xOwogCX0gZWxzZSB7CiAJCW1jcC0+bWJbMTBdID0gZndvcHRzWzEwXTsKQEAgLTUyNiwxNyArNTMzLDE3IEBACiAJfQogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJZndvcHRzWzBdID0gbWNwLT5tYlswXTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCAoJXgvJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNTU4LDEzICs1NjUsMTQgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfbWJ4X3JlZ190ZXN0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX21ieF9yZWdfdGVzdChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9tYnhfcmVnX3Rlc3QoJWxkKTogZW50ZXJlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWJ4X3JlZ190ZXN0KCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfTUFJTEJPWF9SRUdJU1RFUl9URVNUOwogCW1jcC0+bWJbMV0gPSAweEFBQUE7CkBAIC01NzgsNyArNTg2LDcgQEAKIAltY3AtPmluX21iID0gTUJYXzd8TUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewogCQlpZiAobWNwLT5tYlsxXSAhPSAweEFBQUEgfHwgbWNwLT5tYlsyXSAhPSAweDU1NTUgfHwKQEAgLTU5MSw3ICs1OTksNyBAQAogCQkJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPQogCQkJICAgICZoYS0+aW9iYXNlLT5pc3AyNDsKIAotCQkJcWxhMnh4eF9od19ldmVudF9sb2coaGEsIEhXX0VWRU5UX0lTUF9FUlIsIDAsCisJCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyh2aGEsIEhXX0VWRU5UX0lTUF9FUlIsIDAsCiAJCQkgICAgTFNXKFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKSksCiAJCQkgICAgTFNXKFJEX1JFR19EV09SRCgmcmVnLT5pc3RhdHVzKSkpOwogCQl9CkBAIC02MDAsMTEgKzYwOCwxMSBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbWJ4X3JlZ190ZXN0KCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTYyNiwxOCArNjM0LDE4IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByaXNjX2FkZHIpCitxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgcmlzY19hZGRyKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1ZFUklGWV9DSEVDS1NVTTsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfMDsKLQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgeworCWlmIChJU19GV0kyX0NBUEFCTEUodmhhLT5odykpIHsKIAkJbWNwLT5tYlsxXSA9IE1TVyhyaXNjX2FkZHIpOwogCQltY3AtPm1iWzJdID0gTFNXKHJpc2NfYWRkcik7CiAJCW1jcC0+b3V0X21iIHw9IE1CWF8yfE1CWF8xOwpAQCAtNjUwLDE0ICs2NTgsMTQgQEAKIAogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggY2hrIHN1bT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwsIElTX0ZXSTJfQ0FQQUJMRShoYSkgPworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBJU19GV0kyX0NBUEFCTEUodmhhLT5odykgPwogCQkgICAgKG1jcC0+bWJbMl0gPDwgMTYpIHwgbWNwLT5tYlsxXTogbWNwLT5tYlsxXSkpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNjgyLDcgKzY5MCw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9pc3N1ZV9pb2NiX3RpbWVvdXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdm9pZCAqYnVmZmVyLAorcWxhMngwMF9pc3N1ZV9pb2NiX3RpbWVvdXQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHZvaWQgKmJ1ZmZlciwKICAgICBkbWFfYWRkcl90IHBoeXNfYWRkciwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHRvdikKIHsKIAlpbnQJCXJ2YWw7CkBAIC02OTksMzAgKzcwNywyOCBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMDsKIAltY3AtPnRvdiA9IHRvdjsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRyhwcmludGsoInFsYTJ4MDBfaXNzdWVfaW9jYiglbGQpOiBmYWlsZWQgcnZhbCAweCV4XG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKLQkJREVCVUcyKHByaW50aygicWxhMngwMF9pc3N1ZV9pb2NiKCVsZCk6IGZhaWxlZCBydmFsIDB4JXhcbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJc3RzX2VudHJ5X3QgKnN0c19lbnRyeSA9IChzdHNfZW50cnlfdCAqKSBidWZmZXI7CiAKIAkJLyogTWFzayByZXNlcnZlZCBiaXRzLiAqLwogCQlzdHNfZW50cnktPmVudHJ5X3N0YXR1cyAmPQotCQkgICAgSVNfRldJMl9DQVBBQkxFKGhhKSA/IFJGX01BU0tfMjRYWCA6UkZfTUFTSzsKKwkJICAgIElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSA/IFJGX01BU0tfMjRYWCA6IFJGX01BU0s7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIGludAotcWxhMngwMF9pc3N1ZV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHZvaWQgKmJ1ZmZlciwgZG1hX2FkZHJfdCBwaHlzX2FkZHIsCitxbGEyeDAwX2lzc3VlX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICp2aGEsIHZvaWQgKmJ1ZmZlciwgZG1hX2FkZHJfdCBwaHlzX2FkZHIsCiAgICAgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIHFsYTJ4MDBfaXNzdWVfaW9jYl90aW1lb3V0KGhhLCBidWZmZXIsIHBoeXNfYWRkciwgc2l6ZSwKKwlyZXR1cm4gcWxhMngwMF9pc3N1ZV9pb2NiX3RpbWVvdXQodmhhLCBidWZmZXIsIHBoeXNfYWRkciwgc2l6ZSwKIAkgICAgTUJYX1RPVl9TRUNPTkRTKTsKIH0KIApAQCAtNzQxLDIyICs3NDcsMjMgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfYWJvcnRfY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCitxbGEyeDAwX2Fib3J0X2NvbW1hbmQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHNyYl90ICpzcCwgc3RydWN0IHJlcV9xdWUgKnJlcSkKIHsKIAl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOwogCWZjX3BvcnRfdAkqZmNwb3J0OwogCWludAkJcnZhbDsKLQl1aW50MzJfdAloYW5kbGU7CisJdWludDMyX3QJaGFuZGxlID0gMDsKIAltYnhfY21kX3QJbWM7CiAJbWJ4X2NtZF90CSptY3AgPSAmbWM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X2NvbW1hbmQoJWxkKTogZW50ZXJlZC5cbiIsIHZoYS0+aG9zdF9ubykpOwogCiAJZmNwb3J0ID0gc3AtPmZjcG9ydDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWZvciAoaGFuZGxlID0gMTsgaGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBoYW5kbGUrKykgewotCQlpZiAoaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSBzcCkKKwkJaWYgKHJlcS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQogCQkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC03NzgsMTQgKzc4NSwxNCBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfYWJvcnRfY29tbWFuZCglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTc5Nyw0MCArODA0LDQ1IEBACiAJaW50IHJ2YWwsIHJ2YWwyOwogCW1ieF9jbWRfdCAgbWM7CiAJbWJ4X2NtZF90ICAqbWNwID0gJm1jOwotCXNjc2lfcWxhX2hvc3RfdCAqaGE7CisJc2NzaV9xbGFfaG9zdF90ICp2aGE7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgZmNwb3J0LT5oYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGZjcG9ydC0+dmhhLT5ob3N0X25vKSk7CiAKIAlsID0gbDsKLQloYSA9IGZjcG9ydC0+aGE7CisJdmhhID0gZmNwb3J0LT52aGE7CisJcmVxID0gdmhhLT5ody0+cmVxX3FfbWFwWzBdOworCXJzcCA9IHZoYS0+aHctPnJzcF9xX21hcFswXTsKIAltY3AtPm1iWzBdID0gTUJDX0FCT1JUX1RBUkdFVDsKIAltY3AtPm91dF9tYiA9IE1CWF85fE1CWF8yfE1CWF8xfE1CWF8wOwotCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCWlmIChIQVNfRVhURU5ERURfSURTKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQ7CiAJCW1jcC0+bWJbMTBdID0gMDsKIAkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOwogCX0gZWxzZSB7CiAJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQgPDwgODsKIAl9Ci0JbWNwLT5tYlsyXSA9IGhhLT5sb29wX3Jlc2V0X2RlbGF5OwotCW1jcC0+bWJbOV0gPSBoYS0+dnBfaWR4OworCW1jcC0+bWJbMl0gPSB2aGEtPmh3LT5sb29wX3Jlc2V0X2RlbGF5OworCW1jcC0+bWJbOV0gPSB2aGEtPnZwX2lkeDsKIAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0KIAogCS8qIElzc3VlIG1hcmtlciBJT0NCLiAqLwotCXJ2YWwyID0gcWxhMngwMF9tYXJrZXIoaGEsIGZjcG9ydC0+bG9vcF9pZCwgMCwgTUtfU1lOQ19JRCk7CisJcnZhbDIgPSBxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCBmY3BvcnQtPmxvb3BfaWQsIDAsCisJCQkJCQkJTUtfU1lOQ19JRCk7CiAJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIE1hcmtlciBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBydmFsMikpOworCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsMikpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtODQyLDM3ICs4NTQsNDIgQEAKIAlpbnQgcnZhbCwgcnZhbDI7CiAJbWJ4X2NtZF90ICBtYzsKIAltYnhfY21kX3QgICptY3AgPSAmbWM7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOworCXN0cnVjdCByc3BfcXVlICpyc3A7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBmY3BvcnQtPmhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgZmNwb3J0LT52aGEtPmhvc3Rfbm8pKTsKIAotCWhhID0gZmNwb3J0LT5oYTsKKwl2aGEgPSBmY3BvcnQtPnZoYTsKKwlyZXEgPSB2aGEtPmh3LT5yZXFfcV9tYXBbMF07CisJcnNwID0gdmhhLT5ody0+cnNwX3FfbWFwWzBdOwogCW1jcC0+bWJbMF0gPSBNQkNfTFVOX1JFU0VUOwogCW1jcC0+b3V0X21iID0gTUJYXzl8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7Ci0JaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQorCWlmIChIQVNfRVhURU5ERURfSURTKHZoYS0+aHcpKQogCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOwogCWVsc2UKIAkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZCA8PCA4OwogCW1jcC0+bWJbMl0gPSBsOwogCW1jcC0+bWJbM10gPSAwOwotCW1jcC0+bWJbOV0gPSBoYS0+dnBfaWR4OworCW1jcC0+bWJbOV0gPSB2aGEtPnZwX2lkeDsKIAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0KIAogCS8qIElzc3VlIG1hcmtlciBJT0NCLiAqLwotCXJ2YWwyID0gcWxhMngwMF9tYXJrZXIoaGEsIGZjcG9ydC0+bG9vcF9pZCwgbCwgTUtfU1lOQ19JRF9MVU4pOworCXJ2YWwyID0gcWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgZmNwb3J0LT5sb29wX2lkLCBsLAorCQkJCQkJCQlNS19TWU5DX0lEX0xVTik7CiAJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIE1hcmtlciBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBydmFsMikpOworCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsMikpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtODk5LDcgKzkxNiw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9hZGFwdGVyX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICppZCwgdWludDhfdCAqYWxfcGEsCitxbGEyeDAwX2dldF9hZGFwdGVyX2lkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqaWQsIHVpbnQ4X3QgKmFsX3BhLAogICAgIHVpbnQ4X3QgKmFyZWEsIHVpbnQ4X3QgKmRvbWFpbiwgdWludDE2X3QgKnRvcCwgdWludDE2X3QgKnN3X2NhcCkKIHsKIAlpbnQgcnZhbDsKQEAgLTkwNywxNSArOTI0LDE1IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKIAlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfYWRhcHRlcl9pZCglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9BREFQVEVSX0xPT1BfSUQ7Ci0JbWNwLT5tYls5XSA9IGhhLT52cF9pZHg7CisJbWNwLT5tYls5XSA9IHZoYS0+dnBfaWR4OwogCW1jcC0+b3V0X21iID0gTUJYXzl8TUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF85fE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChtY3AtPm1iWzBdID09IE1CU19DT01NQU5EX0VSUk9SKQogCQlydmFsID0gUUxBX0NPTU1BTkRfRVJST1I7CiAJZWxzZSBpZiAobWNwLT5tYlswXSA9PSBNQlNfSU5WQUxJRF9DT01NQU5EKQpAQCAtOTMyLDExICs5NDksMTEgQEAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtOTU4LDcgKzk3NSw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9yZXRyeV9jbnQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDhfdCAqcmV0cnlfY250LCB1aW50OF90ICp0b3YsCitxbGEyeDAwX2dldF9yZXRyeV9jbnQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQ4X3QgKnJldHJ5X2NudCwgdWludDhfdCAqdG92LAogICAgIHVpbnQxNl90ICpyX2FfdG92KQogewogCWludCBydmFsOwpAQCAtOTY3LDE5ICs5ODQsMTkgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9yZXRyeV9jbnQoJWxkKTogZW50ZXJlZC5cbiIsCi0JCQloYS0+aG9zdF9ubykpOworCQkJdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVRSWV9DT1VOVDsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3JldHJ5X2NudCglbGQpOiBmYWlsZWQgPSAleC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CiAJfSBlbHNlIHsKIAkJLyogQ29udmVydCByZXR1cm5lZCBkYXRhIGFuZCBjaGVjayBvdXIgdmFsdWVzLiAqLwogCQkqcl9hX3RvdiA9IG1jcC0+bWJbM10gLyAyOwpAQCAtOTkxLDcgKzEwMDgsNyBAQAogCQl9CiAKIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3JldHJ5X2NudCglbGQpOiBkb25lLiBtYjM9JWQgIgotCQkgICAgInJhdG92PSVkLlxuIiwgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbM10sIHJhdG92KSk7CisJCSAgICAicmF0b3Y9JWQuXG4iLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbM10sIHJhdG92KSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xMDE1LDE0ICsxMDMyLDE1IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2luaXRfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3Qgc2l6ZSkKK3FsYTJ4MDBfaW5pdF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3Qgc2l6ZSkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlERUJVRzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICBoYS0+aG9zdF9ubykpOworCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAogCWlmIChoYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQpCiAJCW1jcC0+bWJbMF0gPSBNQkNfTUlEX0lOSVRJQUxJWkVfRklSTVdBUkU7CkBAIC0xMDQwLDE3ICsxMDU4LDE3IEBACiAJbWNwLT5idWZfc2l6ZSA9IHNpemU7CiAJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGZhaWxlZD0leCAiCiAJCSAgICAibWIwPSV4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfaW5pdF9maXJtd2FyZSglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEwNzMsNyArMTA5MSw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50OF90IG9wdCkKK3FsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2Uoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50OF90IG9wdCkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CkBAIC0xMDgxLDE0ICsxMDk5LDE1IEBACiAJcG9ydF9kYXRhYmFzZV90ICpwZDsKIAlzdHJ1Y3QgcG9ydF9kYXRhYmFzZV8yNHh4ICpwZDI0OwogCWRtYV9hZGRyX3QgcGRfZG1hOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCXBkMjQgPSBOVUxMOwogCXBkID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZwZF9kbWEpOwogCWlmIChwZCAgPT0gTlVMTCkgewogCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBQb3J0IERhdGFiYXNlICIKLQkJICAgICJzdHJ1Y3R1cmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJzdHJ1Y3R1cmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAl9CiAJbWVtc2V0KHBkLCAwLCBtYXgoUE9SVF9EQVRBQkFTRV9TSVpFLCBQT1JUX0RBVEFCQVNFXzI0WFhfU0laRSkpOwpAQCAtMTEwMCw3ICsxMTE5LDcgQEAKIAltY3AtPm1iWzNdID0gTFNXKHBkX2RtYSk7CiAJbWNwLT5tYls2XSA9IE1TVyhNU0QocGRfZG1hKSk7CiAJbWNwLT5tYls3XSA9IExTVyhNU0QocGRfZG1hKSk7Ci0JbWNwLT5tYls5XSA9IGhhLT52cF9pZHg7CisJbWNwLT5tYls5XSA9IHZoYS0+dnBfaWR4OwogCW1jcC0+b3V0X21iID0gTUJYXzl8TUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8wOwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CkBAIC0xMTIwLDcgKzExMzksNyBAQAogCSAgICBQT1JUX0RBVEFCQVNFXzI0WFhfU0laRSA6IFBPUlRfREFUQUJBU0VfU0laRTsKIAltY3AtPmZsYWdzID0gTUJYX0RNQV9JTjsKIAltY3AtPnRvdiA9IChoYS0+bG9naW5fdGltZW91dCAqIDIpICsgKGhhLT5sb2dpbl90aW1lb3V0IC8gMik7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZ3BkX2Vycm9yX291dDsKIApAQCAtMTEzMiw3ICsxMTUxLDcgQEAKIAkJICAgIHBkMjQtPmxhc3RfbG9naW5fc3RhdGUgIT0gUERTX1BSTElfQ09NUExFVEUpIHsKIAkJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IFVuYWJsZSB0byB2ZXJpZnkgIgogCQkJICAgICJsb2dpbi1zdGF0ZSAoJXgvJXgpIGZvciBsb29wX2lkICV4XG4iLAotCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkJICAgIHBkMjQtPmN1cnJlbnRfbG9naW5fc3RhdGUsCiAJCQkgICAgcGQyNC0+bGFzdF9sb2dpbl9zdGF0ZSwgZmNwb3J0LT5sb29wX2lkKSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTExOTIsOSArMTIxMSw5IEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEyMTcsMjEgKzEyMzYsMjEgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpzdGF0ZXMpCitxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgKnN0YXRlcykKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKIAlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIGhhLT5ob3N0X25vKSk7CisJICAgIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfRklSTVdBUkVfU1RBVEU7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAkvKiBSZXR1cm4gZmlybXdhcmUgc3RhdGVzLiAqLwogCXN0YXRlc1swXSA9IG1jcC0+bWJbMV07CkBAIC0xMjQxLDExICsxMjYwLDExIEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogIgotCQkgICAgImZhaWxlZD0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICAiZmFpbGVkPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEyNzAsNyArMTI4OSw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9wb3J0X25hbWUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDhfdCAqbmFtZSwKK3FsYTJ4MDBfZ2V0X3BvcnRfbmFtZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDhfdCAqbmFtZSwKICAgICB1aW50OF90IG9wdCkKIHsKIAlpbnQgcnZhbDsKQEAgLTEyNzgsMTIgKzEyOTcsMTIgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X25hbWUoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIGhhLT5ob3N0X25vKSk7CisJICAgIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfUE9SVF9OQU1FOwotCW1jcC0+bWJbOV0gPSBoYS0+dnBfaWR4OworCW1jcC0+bWJbOV0gPSB2aGEtPnZwX2lkeDsKIAltY3AtPm91dF9tYiA9IE1CWF85fE1CWF8xfE1CWF8wOwotCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCWlmIChIQVNfRVhURU5ERURfSURTKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbMV0gPSBsb29wX2lkOwogCQltY3AtPm1iWzEwXSA9IG9wdDsKIAkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOwpAQCAtMTI5NCwxMiArMTMxMywxMiBAQAogCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBmYWlsZWQ9JXguXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0gZWxzZSB7CiAJCWlmIChuYW1lICE9IE5VTEwpIHsKIAkJCS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBuYW1lIGluIGJpZyBlbmRpYW4uICovCkBAIC0xMzE0LDcgKzEzMzMsNyBAQAogCQl9CiAKIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEzMzYsNDUgKzEzNTUsNDUgQEAKICAqCUtlcm5lbCBjb250ZXh0LgogICovCiBpbnQKLXFsYTJ4MDBfbGlwX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2xpcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCi0JaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKKwlpZiAoSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbMF0gPSBNQkNfTElQX0ZVTExfTE9HSU47CiAJCW1jcC0+bWJbMV0gPSBCSVRfNjsKIAkJbWNwLT5tYlsyXSA9IDA7Ci0JCW1jcC0+bWJbM10gPSBoYS0+bG9vcF9yZXNldF9kZWxheTsKKwkJbWNwLT5tYlszXSA9IHZoYS0+aHctPmxvb3BfcmVzZXRfZGVsYXk7CiAJCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CiAJfSBlbHNlIHsKIAkJbWNwLT5tYlswXSA9IE1CQ19MSVBfUkVTRVQ7CiAJCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7Ci0JCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCQlpZiAoSEFTX0VYVEVOREVEX0lEUyh2aGEtPmh3KSkgewogCQkJbWNwLT5tYlsxXSA9IDB4MDBmZjsKIAkJCW1jcC0+bWJbMTBdID0gMDsKIAkJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKIAkJfSBlbHNlIHsKIAkJCW1jcC0+bWJbMV0gPSAweGZmMDA7CiAJCX0KLQkJbWNwLT5tYlsyXSA9IGhhLT5sb29wX3Jlc2V0X2RlbGF5OworCQltY3AtPm1iWzJdID0gdmhhLT5ody0+bG9vcF9yZXNldF9kZWxheTsKIAkJbWNwLT5tYlszXSA9IDA7CiAJfQogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xMzk5LDcgKzE0MTgsNyBAQAogICoJS2VybmVsIGNvbnRleHQuCiAgKi8KIGludAotcWxhMngwMF9zZW5kX3NucyhzY3NpX3FsYV9ob3N0X3QgKmhhLCBkbWFfYWRkcl90IHNuc19waHlzX2FkZHJlc3MsCitxbGEyeDAwX3NlbmRfc25zKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBkbWFfYWRkcl90IHNuc19waHlzX2FkZHJlc3MsCiAgICAgdWludDE2X3QgY21kX3NpemUsIHNpemVfdCBidWZfc2l6ZSkKIHsKIAlpbnQgcnZhbDsKQEAgLTE0MDcsMTAgKzE0MjYsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICBoYS0+aG9zdF9ubykpOworCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zOiByZXRyeSBjbnQ9JWQgcmF0b3Y9JWQgdG90YWwgIgotCSAgICAidG92PSVkLlxuIiwgaGEtPnJldHJ5X2NvdW50LCBoYS0+bG9naW5fdGltZW91dCwgbWNwLT50b3YpKTsKKwkJInRvdj0lZC5cbiIsIHZoYS0+aHctPnJldHJ5X2NvdW50LCB2aGEtPmh3LT5sb2dpbl90aW1lb3V0LAorCQltY3AtPnRvdikpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19TRU5EX1NOU19DT01NQU5EOwogCW1jcC0+bWJbMV0gPSBjbWRfc2l6ZTsKQEAgLTE0MjIsMjUgKzE0NDIsMjUgQEAKIAltY3AtPmluX21iID0gTUJYXzB8TUJYXzE7CiAJbWNwLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOwogCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVHxNQlhfRE1BX0lOOwotCW1jcC0+dG92ID0gKGhhLT5sb2dpbl90aW1lb3V0ICogMikgKyAoaGEtPmxvZ2luX3RpbWVvdXQgLyAyKTsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJbWNwLT50b3YgPSAodmhhLT5ody0+bG9naW5fdGltZW91dCAqIDIpICsgKHZoYS0+aHctPmxvZ2luX3RpbWVvdXQgLyAyKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggIgotCQkgICAgIm1iWzFdPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJICAgICJtYlsxXT0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4ICIKLQkJICAgICJtYlsxXT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCSAgICAibWJbMV09JXguXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGRvbmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKIH0KIAogaW50Ci1xbGEyNHh4X2xvZ2luX2ZhYnJpYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90IGRvbWFpbiwKK3FsYTI0eHhfbG9naW5fZmFicmljKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90IGRvbWFpbiwKICAgICB1aW50OF90IGFyZWEsIHVpbnQ4X3QgYWxfcGEsIHVpbnQxNl90ICptYiwgdWludDhfdCBvcHQpCiB7CiAJaW50CQlydmFsOwpAQCAtMTQ0OCwxMyArMTQ2OCwxNCBAQAogCXN0cnVjdCBsb2dpb19lbnRyeV8yNHh4ICpsZzsKIAlkbWFfYWRkcl90CWxnX2RtYTsKIAl1aW50MzJfdAlpb3BbMl07CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbGcgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmxnX2RtYSk7CiAJaWYgKGxnID09IE5VTEwpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgTG9naW4gSU9DQi5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQobGcsIDAsIHNpemVvZihzdHJ1Y3QgbG9naW9fZW50cnlfMjR4eCkpOwpAQCAtMTQ3MCwxNCArMTQ5MSwxNCBAQAogCWxnLT5wb3J0X2lkWzBdID0gYWxfcGE7CiAJbGctPnBvcnRfaWRbMV0gPSBhcmVhOwogCWxnLT5wb3J0X2lkWzJdID0gZG9tYWluOwotCWxnLT52cF9pbmRleCA9IGhhLT52cF9pZHg7Ci0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgbGcsIGxnX2RtYSwgMCk7CisJbGctPnZwX2luZGV4ID0gdmhhLT52cF9pZHg7CisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGxnLCBsZ19kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIExvZ2luIElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0gZWxzZSBpZiAobGctPmVudHJ5X3N0YXR1cyAhPSAwKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkJICAgIGxnLT5lbnRyeV9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChsZy0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKQEAgLTE0ODYsNyArMTUwNyw3IEBACiAKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCiAJCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KSAgaW9wYXJhbT0leC8leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGxlMTZfdG9fY3B1KGxnLT5jb21wX3N0YXR1cyksIGlvcFswXSwKKwkJICAgIHZoYS0+aG9zdF9ubywgbGUxNl90b19jcHUobGctPmNvbXBfc3RhdHVzKSwgaW9wWzBdLAogCQkgICAgaW9wWzFdKSk7CiAKIAkJc3dpdGNoIChpb3BbMF0pIHsKQEAgLTE1MTUsNyArMTUzNiw3IEBACiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJCWlvcFswXSA9IGxlMzJfdG9fY3B1KGxnLT5pb19wYXJhbWV0ZXJbMF0pOwogCkBAIC0xNTYyLDE0ICsxNTgzLDE1IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2xvZ2luX2ZhYnJpYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90IGRvbWFpbiwKK3FsYTJ4MDBfbG9naW5fZmFicmljKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90IGRvbWFpbiwKICAgICB1aW50OF90IGFyZWEsIHVpbnQ4X3QgYWxfcGEsIHVpbnQxNl90ICptYiwgdWludDhfdCBvcHQpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvZ2luX2ZhYnJpYyglbGQpOiBlbnRlcmVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0xPR0lOX0ZBQlJJQ19QT1JUOwogCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CkBAIC0xNTg2LDcgKzE2MDgsNyBAQAogCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfMnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IChoYS0+bG9naW5fdGltZW91dCAqIDIpICsgKGhhLT5sb2dpbl90aW1lb3V0IC8gMik7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAkvKiBSZXR1cm4gbWFpbGJveCBzdGF0dXNlcy4gKi8KIAlpZiAobWIgIT0gTlVMTCkgewpAQCAtMTYxMywxMiArMTYzNSwxMiBAQAogCiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGZhaWxlZD0leCAiCi0JCSAgICAibWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwKKwkJICAgICJtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCwKIAkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTY0MSwxOSArMTY2MywyMCBAQAogICoKICAqLwogaW50Ci1xbGEyeDAwX2xvZ2luX2xvY2FsX2RldmljZShzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKK3FsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICB1aW50MTZfdCAqbWJfcmV0LCB1aW50OF90IG9wdCkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKLQkJcmV0dXJuIHFsYTI0eHhfbG9naW5fZmFicmljKGhhLCBmY3BvcnQtPmxvb3BfaWQsCisJCXJldHVybiBxbGEyNHh4X2xvZ2luX2ZhYnJpYyh2aGEsIGZjcG9ydC0+bG9vcF9pZCwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBtYl9yZXQsIG9wdCk7CiAKLQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUczKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfTE9HSU5fTE9PUF9QT1JUOwogCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKQEAgLTE2NjUsNyArMTY4OCw3IEBACiAgCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IChoYS0+bG9naW5fdGltZW91dCAqIDIpICsgKGhhLT5sb2dpbl90aW1lb3V0IC8gMik7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKICAJLyogUmV0dXJuIG1haWxib3ggc3RhdHVzZXMuICovCiAgCWlmIChtYl9yZXQgIT0gTlVMTCkgewpAQCAtMTY4NiwzMyArMTcwOSwzNCBAQAogIAkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAogCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsCisJCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAogCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSkpOwogCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsCisJCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAogCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSkpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKIH0KIAogaW50Ci1xbGEyNHh4X2ZhYnJpY19sb2dvdXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDhfdCBkb21haW4sCitxbGEyNHh4X2ZhYnJpY19sb2dvdXQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGxvb3BfaWQsIHVpbnQ4X3QgZG9tYWluLAogICAgIHVpbnQ4X3QgYXJlYSwgdWludDhfdCBhbF9wYSkKIHsKIAlpbnQJCXJ2YWw7CiAJc3RydWN0IGxvZ2lvX2VudHJ5XzI0eHggKmxnOwogCWRtYV9hZGRyX3QJbGdfZG1hOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCWxnID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZsZ19kbWEpOwogCWlmIChsZyA9PSBOVUxMKSB7CiAJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIExvZ291dCBJT0NCLlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldChsZywgMCwgc2l6ZW9mKHN0cnVjdCBsb2dpb19lbnRyeV8yNHh4KSk7CkBAIC0xNzI1LDI1ICsxNzQ5LDI2IEBACiAJbGctPnBvcnRfaWRbMF0gPSBhbF9wYTsKIAlsZy0+cG9ydF9pZFsxXSA9IGFyZWE7CiAJbGctPnBvcnRfaWRbMl0gPSBkb21haW47Ci0JbGctPnZwX2luZGV4ID0gaGEtPnZwX2lkeDsKLQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBsZywgbGdfZG1hLCAwKTsKKwlsZy0+dnBfaW5kZXggPSB2aGEtPnZwX2lkeDsKKworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBsZywgbGdfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBMb2dvdXQgSU9DQiAiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIGlmIChsZy0+ZW50cnlfc3RhdHVzICE9IDApIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkgICAgbGctPmVudHJ5X3N0YXR1cykpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKGxnLT5jb21wX3N0YXR1cyAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQgJWQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCiAJCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KSAgaW9wYXJhbT0leC8leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIGxlMTZfdG9fY3B1KGxnLT5jb21wX3N0YXR1cyksCisJCSAgICB2aGEtPmhvc3Rfbm8sIHZoYS0+dnBfaWR4LCBsZTE2X3RvX2NwdShsZy0+Y29tcF9zdGF0dXMpLAogCQkgICAgbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclswXSksCiAJCSAgICBsZTMyX3RvX2NwdShsZy0+aW9fcGFyYW1ldGVyWzFdKSkpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBsZywgbGdfZG1hKTsKQEAgLTE3NjgsNyArMTc5Myw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2ZhYnJpY19sb2dvdXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCwgdWludDhfdCBkb21haW4sCitxbGEyeDAwX2ZhYnJpY19sb2dvdXQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGxvb3BfaWQsIHVpbnQ4X3QgZG9tYWluLAogICAgIHVpbnQ4X3QgYXJlYSwgdWludDhfdCBhbF9wYSkKIHsKIAlpbnQgcnZhbDsKQEAgLTE3NzYsMTEgKzE4MDEsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2ZhYnJpY19sb2dvdXQoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIGhhLT5ob3N0X25vKSk7CisJICAgIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19MT0dPVVRfRkFCUklDX1BPUlQ7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKLQlpZiAoSEFTX0VYVEVOREVEX0lEUyhoYSkpIHsKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyh2aGEtPmh3KSkgewogCQltY3AtPm1iWzFdID0gbG9vcF9pZDsKIAkJbWNwLT5tYlsxMF0gPSAwOwogCQltY3AtPm91dF9tYiB8PSBNQlhfMTA7CkBAIC0xNzkxLDE2ICsxODE2LDE2IEBACiAJbWNwLT5pbl9tYiA9IE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCiAJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGZhaWxlZD0leCAiCi0JCSAgICAibWJ4MT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzFdKSk7CisJCSAgICAibWJ4MT0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlsxXSkpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGRvbmUuXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTgyMiwzMyArMTg0NywzMyBAQAogICoJS2VybmVsIGNvbnRleHQuCiAgKi8KIGludAotcWxhMngwMF9mdWxsX2xvZ2luX2xpcChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9mdWxsX2xvZ2luX2xpcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKIAlERUJVRzExKHByaW50aygicWxhMngwMF9mdWxsX2xvZ2luX2xpcCglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0xJUF9GVUxMX0xPR0lOOwotCW1jcC0+bWJbMV0gPSBJU19GV0kyX0NBUEFCTEUoaGEpID8gQklUXzM6IDA7CisJbWNwLT5tYlsxXSA9IElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSA/IEJJVF8zIDogMDsKIAltY3AtPm1iWzJdID0gMDsKIAltY3AtPm1iWzNdID0gMDsKIAltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KIAkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZG9uZS5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xODY3LDcgKzE4OTIsNyBAQAogICoJS2VybmVsIGNvbnRleHQuCiAgKi8KIGludAotcWxhMngwMF9nZXRfaWRfbGlzdChzY3NpX3FsYV9ob3N0X3QgKmhhLCB2b2lkICppZF9saXN0LCBkbWFfYWRkcl90IGlkX2xpc3RfZG1hLAorcWxhMngwMF9nZXRfaWRfbGlzdChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdm9pZCAqaWRfbGlzdCwgZG1hX2FkZHJfdCBpZF9saXN0X2RtYSwKICAgICB1aW50MTZfdCAqZW50cmllcykKIHsKIAlpbnQgcnZhbDsKQEAgLTE4NzUsMjAgKzE5MDAsMjAgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICBoYS0+aG9zdF9ubykpOworCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAogCWlmIChpZF9saXN0ID09IE5VTEwpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfSURfTElTVDsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwotCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CisJaWYgKElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkgewogCQltY3AtPm1iWzJdID0gTVNXKGlkX2xpc3RfZG1hKTsKIAkJbWNwLT5tYlszXSA9IExTVyhpZF9saXN0X2RtYSk7CiAJCW1jcC0+bWJbNl0gPSBNU1coTVNEKGlkX2xpc3RfZG1hKSk7CiAJCW1jcC0+bWJbN10gPSBMU1coTVNEKGlkX2xpc3RfZG1hKSk7CiAJCW1jcC0+bWJbOF0gPSAwOwotCQltY3AtPm1iWzldID0gaGEtPnZwX2lkeDsKKwkJbWNwLT5tYls5XSA9IHZoYS0+dnBfaWR4OwogCQltY3AtPm91dF9tYiB8PSBNQlhfOXxNQlhfOHxNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMjsKIAl9IGVsc2UgewogCQltY3AtPm1iWzFdID0gTVNXKGlkX2xpc3RfZG1hKTsKQEAgLTE5MDAsMTYgKzE5MjUsMTYgQEAKIAltY3AtPmluX21iID0gTUJYXzF8TUJYXzA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IDA7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKIAkJKmVudHJpZXMgPSBtY3AtPm1iWzFdOwogCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfaWRfbGlzdCglbGQpOiBkb25lLlxuIiwKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE5MjksNyArMTk1NCw3IEBACiAgKglLZXJuZWwgY29udGV4dC4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpjdXJfeGNoZ19jbnQsCitxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqY3VyX3hjaGdfY250LAogICAgIHVpbnQxNl90ICpvcmlnX3hjaGdfY250LCB1aW50MTZfdCAqY3VyX2lvY2JfY250LAogICAgIHVpbnQxNl90ICpvcmlnX2lvY2JfY250LCB1aW50MTZfdCAqbWF4X25waXZfdnBvcnRzKQogewpAQCAtMTkzNywyMiArMTk2MiwyMiBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVNPVVJDRV9DT1VOVFM7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzExfE1CWF8xMHxNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCA9ICV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CiAJfSBlbHNlIHsKIAkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuIG1iMT0leCBtYjI9JXggbWIzPSV4IG1iNj0leCAiCi0JCSAgICAibWI3PSV4IG1iMTA9JXggbWIxMT0leC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkJICAgICJtYjc9JXggbWIxMD0leCBtYjExPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkJICAgIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sIG1jcC0+bWJbM10sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10sCiAJCSAgICBtY3AtPm1iWzEwXSwgbWNwLT5tYlsxMV0pKTsKIApAQCAtMTk2NCw3ICsxOTg5LDcgQEAKIAkJCSpjdXJfaW9jYl9jbnQgPSBtY3AtPm1iWzddOwogCQlpZiAob3JpZ19pb2NiX2NudCkKIAkJCSpvcmlnX2lvY2JfY250ID0gbWNwLT5tYlsxMF07Ci0JCWlmIChoYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgJiYgbWF4X25waXZfdnBvcnRzKQorCQlpZiAodmhhLT5ody0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgJiYgbWF4X25waXZfdnBvcnRzKQogCQkJKm1heF9ucGl2X3Zwb3J0cyA9IG1jcC0+bWJbMTFdOwogCX0KIApAQCAtMTk4NywxOCArMjAxMiwxOSBAQAogICoJS2VybmVsIGNvbnRleHQuCiAgKi8KIGludAotcWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgY2hhciAqcG9zX21hcCkKK3FsYTJ4MDBfZ2V0X2ZjYWxfcG9zaXRpb25fbWFwKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBjaGFyICpwb3NfbWFwKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAljaGFyICpwbWFwOwogCWRtYV9hZGRyX3QgcG1hcF9kbWE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlwbWFwID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZwbWFwX2RtYSk7CiAJaWYgKHBtYXAgID09IE5VTEwpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiAqKioqIE1lbSBBbGxvYyBGYWlsZWQgKioqKiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQocG1hcCwgMCwgRkNBTF9NQVBfU0laRSk7CkBAIC0yMDEzLDExICsyMDM5LDExIEBACiAJbWNwLT5idWZfc2l6ZSA9IEZDQUxfTUFQX1NJWkU7CiAJbWNwLT5mbGFncyA9IE1CWF9ETUFfSU47CiAJbWNwLT50b3YgPSAoaGEtPmxvZ2luX3RpbWVvdXQgKiAyKSArIChoYS0+bG9naW5fdGltZW91dCAvIDIpOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IChtYjA9JXgvbWIxPSV4KSBGQy9BTCBQb3NpdGlvbiBNYXAgIgotCQkgICAgInNpemUgKCV4KVxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBtY3AtPm1iWzBdLAorCQkgICAgInNpemUgKCV4KVxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSwKIAkJICAgIG1jcC0+bWJbMV0sICh1bnNpZ25lZClwbWFwWzBdKSk7CiAJCURFQlVHMTEocWxhMngwMF9kdW1wX2J1ZmZlcihwbWFwLCBwbWFwWzBdICsgMSkpOwogCkBAIC0yMDI4LDkgKzIwNTQsOSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTIwNTEsMTUgKzIwNzcsMTYgQEAKICAqCUJJVF8xID0gbWFpbGJveCBlcnJvci4KICAqLwogaW50Ci1xbGEyeDAwX2dldF9saW5rX3N0YXR1cyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLAorcWxhMngwMF9nZXRfbGlua19zdGF0dXMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGxvb3BfaWQsCiAgICAgc3RydWN0IGxpbmtfc3RhdGlzdGljcyAqc3RhdHMsIGRtYV9hZGRyX3Qgc3RhdHNfZG1hKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAl1aW50MzJfdCAqc2l0ZXIsICpkaXRlciwgZHdvcmRzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0xJTktfU1RBVFVTOwogCW1jcC0+bWJbMl0gPSBNU1coc3RhdHNfZG1hKTsKQEAgLTIwODQsMTIgKzIxMTEsMTIgQEAKIAl9CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IElPQ1RMX0NNRDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCWlmIChtY3AtPm1iWzBdICE9IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7CiAJCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGNtZCBmYWlsZWQuIG1ieDA9JXguXG4iLAotCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewogCQkJLyogQ29weSBvdmVyIGRhdGEgLS0gZmlybXdhcmUgZGF0YSBpcyBMRS4gKi8KQEAgLTIxMDEsMTQgKzIxMjgsMTQgQEAKIAl9IGVsc2UgewogCQkvKiBGYWlsZWQuICovCiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIGludAotcWxhMjR4eF9nZXRfaXNwX3N0YXRzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBsaW5rX3N0YXRpc3RpY3MgKnN0YXRzLAorcWxhMjR4eF9nZXRfaXNwX3N0YXRzKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgbGlua19zdGF0aXN0aWNzICpzdGF0cywKICAgICBkbWFfYWRkcl90IHN0YXRzX2RtYSkKIHsKIAlpbnQgcnZhbDsKQEAgLTIxMTYsNyArMjE0Myw3IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJdWludDMyX3QgKnNpdGVyLCAqZGl0ZXIsIGR3b3JkczsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9MSU5LX1BSSVZfU1RBVFM7CiAJbWNwLT5tYlsyXSA9IE1TVyhzdGF0c19kbWEpOwpAQCAtMjEyNCwxOCArMjE1MSwxOCBAQAogCW1jcC0+bWJbNl0gPSBNU1coTVNEKHN0YXRzX2RtYSkpOwogCW1jcC0+bWJbN10gPSBMU1coTVNEKHN0YXRzX2RtYSkpOwogCW1jcC0+bWJbOF0gPSBzaXplb2Yoc3RydWN0IGxpbmtfc3RhdGlzdGljcykgLyA0OwotCW1jcC0+bWJbOV0gPSBoYS0+dnBfaWR4OworCW1jcC0+bWJbOV0gPSB2aGEtPnZwX2lkeDsKIAltY3AtPm1iWzEwXSA9IDA7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMTB8TUJYXzl8TUJYXzh8TUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSBJT0NUTF9DTUQ7Ci0JcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewogCQlpZiAobWNwLT5tYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewogCQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBjbWQgZmFpbGVkLiBtYngwPSV4LlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKIAkJCS8qIENvcHkgb3ZlciBkYXRhIC0tIGZpcm13YXJlIGRhdGEgaXMgTEUuICovCkBAIC0yMTQ3LDE0ICsyMTc0LDE0IEBACiAJfSBlbHNlIHsKIAkJLyogRmFpbGVkLiAqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCX0KIAogCXJldHVybiBydmFsOwogfQogCiBpbnQKLXFsYTI0eHhfYWJvcnRfY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCitxbGEyNHh4X2Fib3J0X2NvbW1hbmQoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHNyYl90ICpzcCwgc3RydWN0IHJlcV9xdWUgKnJlcSkKIHsKIAlpbnQJCXJ2YWw7CiAJZmNfcG9ydF90CSpmY3BvcnQ7CkBAIC0yMTYzLDE4ICsyMTkwLDE4IEBACiAJc3RydWN0IGFib3J0X2VudHJ5XzI0eHggKmFidDsKIAlkbWFfYWRkcl90CWFidF9kbWE7CiAJdWludDMyX3QJaGFuZGxlOwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJZmNwb3J0ID0gc3AtPmZjcG9ydDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaGFuZGxlKyspIHsKLQkJaWYgKHBoYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQorCQlpZiAocmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPT0gc3ApCiAJCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlpZiAoaGFuZGxlID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgewogCQkvKiBDb21tYW5kIG5vdCBmb3VuZC4gKi8KIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC0yMTgzLDcgKzIyMTAsNyBAQAogCWFidCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmYWJ0X2RtYSk7CiAJaWYgKGFidCA9PSBOVUxMKSB7CiAJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIEFib3J0IElPQ0IuXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAl9CiAJbWVtc2V0KGFidCwgMCwgc2l6ZW9mKHN0cnVjdCBhYm9ydF9lbnRyeV8yNHh4KSk7CkBAIC0yMTk2LDIyICsyMjIzLDI1IEBACiAJYWJ0LT5wb3J0X2lkWzFdID0gZmNwb3J0LT5kX2lkLmIuYXJlYTsKIAlhYnQtPnBvcnRfaWRbMl0gPSBmY3BvcnQtPmRfaWQuYi5kb21haW47CiAJYWJ0LT52cF9pbmRleCA9IGZjcG9ydC0+dnBfaWR4OwotCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGFidCwgYWJ0X2RtYSwgMCk7CisKKwlhYnQtPnJlcV9xdWVfbm8gPSBjcHVfdG9fbGUxNihyZXEtPmlkKTsKKworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBhYnQsIGFidF9kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIElPQ0IgKCV4KS5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgaWYgKGFidC0+ZW50cnlfc3RhdHVzICE9IDApIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkgICAgYWJ0LT5lbnRyeV9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChhYnQtPm5wb3J0X2hhbmRsZSAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJCSAgICBsZTE2X3RvX2NwdShhYnQtPm5wb3J0X2hhbmRsZSkpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgYWJ0LCBhYnRfZG1hKTsKQEAgLTIyMzMsMTYgKzIyNjMsMjEgQEAKIAlpbnQJCXJ2YWwsIHJ2YWwyOwogCXN0cnVjdCB0c2tfbWdtdF9jbWQgKnRzazsKIAlkbWFfYWRkcl90CXRza19kbWE7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSwgKnBoYTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhOworCXN0cnVjdCByZXFfcXVlICpyZXE7CisJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGZjcG9ydC0+aGEtPmhvc3Rfbm8pKTsKKwlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBmY3BvcnQtPnZoYS0+aG9zdF9ubykpOwogCi0JaGEgPSBmY3BvcnQtPmhhOwotCXBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOwotCXRzayA9IGRtYV9wb29sX2FsbG9jKHBoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnRza19kbWEpOworCXZoYSA9IGZjcG9ydC0+dmhhOworCWhhID0gdmhhLT5odzsKKwlyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOworCXJzcCA9IGhhLT5yc3BfcV9tYXBbMF07CisJdHNrID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ0c2tfZG1hKTsKIAlpZiAodHNrID09IE5VTEwpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgVGFzayBNYW5hZ2VtZW50ICIKLQkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCSAgICAiSU9DQi5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQodHNrLCAwLCBzaXplb2Yoc3RydWN0IHRza19tZ210X2NtZCkpOwpAQCAtMjI2MiwzNCArMjI5NywzNCBAQAogCQkgICAgc2l6ZW9mKHRzay0+cC50c2subHVuKSk7CiAJfQogCi0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgdHNrLCB0c2tfZG1hLCAwKTsKKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgdHNrLCB0c2tfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSAlcyBSZXNldCBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBuYW1lLCBydmFsKSk7CisJCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG5hbWUsIHJ2YWwpKTsKIAl9IGVsc2UgaWYgKHRzay0+cC5zdHMuZW50cnlfc3RhdHVzICE9IDApIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkgICAgdHNrLT5wLnN0cy5lbnRyeV9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmICh0c2stPnAuc3RzLmNvbXBfc3RhdHVzICE9CiAJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgogCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGhhLT5ob3N0X25vLCBsZTE2X3RvX2NwdSh0c2stPnAuc3RzLmNvbXBfc3RhdHVzKSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBsZTE2X3RvX2NwdSh0c2stPnAuc3RzLmNvbXBfc3RhdHVzKSkpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKIAkvKiBJc3N1ZSBtYXJrZXIgSU9DQi4gKi8KLQlydmFsMiA9IHFsYTJ4MDBfbWFya2VyKGhhLCBmY3BvcnQtPmxvb3BfaWQsIGwsCisJcnZhbDIgPSBxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCBmY3BvcnQtPmxvb3BfaWQsIGwsCiAJICAgIHR5cGUgPT0gVENGX0xVTl9SRVNFVCA/IE1LX1NZTkNfSURfTFVOOiBNS19TWU5DX0lEKTsKIAlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgTWFya2VyIElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwyKSk7CisJCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwyKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCi0JZG1hX3Bvb2xfZnJlZShwaGEtPnNfZG1hX3Bvb2wsIHRzaywgdHNrX2RtYSk7CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgdHNrLCB0c2tfZG1hKTsKIAogCXJldHVybiBydmFsOwogfQpAQCAtMjMwNywyOSArMjM0MiwzMCBAQAogfQogCiBpbnQKLXFsYTJ4MDBfc3lzdGVtX2Vycm9yKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3N5c3RlbV9lcnJvcihzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIUlTX1FMQTIzWFgoaGEpICYmICFJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFTl9TWVNURU1fRVJST1I7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzA7CiAJbWNwLT50b3YgPSA1OwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTIzNDIsMTQgKzIzNzgsMTQgQEAKICAqIFJldHVybnMKICAqLwogaW50Ci1xbGEyeDAwX3NldF9zZXJkZXNfcGFyYW1zKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IHN3X2VtXzFnLAorcWxhMngwMF9zZXRfc2VyZGVzX3BhcmFtcyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3Qgc3dfZW1fMWcsCiAgICAgdWludDE2X3Qgc3dfZW1fMmcsIHVpbnQxNl90IHN3X2VtXzRnKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1NFUkRFU19QQVJBTVM7CiAJbWNwLT5tYlsxXSA9IEJJVF8wOwpAQCAtMjM2MCw2MSArMjM5Niw2MSBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCAoJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwogfQogCiBpbnQKLXFsYTJ4MDBfc3RvcF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9zdG9wX2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSkKKwlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19TVE9QX0ZJUk1XQVJFOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CiAJbWNwLT5pbl9tYiA9IE1CWF8wOwogCW1jcC0+dG92ID0gNTsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIGludAotcWxhMngwMF9lbmFibGVfZWZ0X3RyYWNlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3QgZWZ0X2RtYSwKK3FsYTJ4MDBfZW5hYmxlX2VmdF90cmFjZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgZG1hX2FkZHJfdCBlZnRfZG1hLAogICAgIHVpbnQxNl90IGJ1ZmZlcnMpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQorCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0VGVF9FTkFCTEU7CkBAIC0yNDI4LDI4ICsyNDY0LDI4IEBACiAJbWNwLT5pbl9tYiA9IE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCX0KIAogCXJldHVybiBydmFsOwogfQogCiBpbnQKLXFsYTJ4MDBfZGlzYWJsZV9lZnRfdHJhY2Uoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZGlzYWJsZV9lZnRfdHJhY2Uoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQorCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0VGVF9ESVNBQkxFOwpAQCAtMjQ1NywyOSArMjQ5MywyOSBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKIH0KIAogaW50Ci1xbGEyeDAwX2VuYWJsZV9mY2VfdHJhY2Uoc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCBmY2VfZG1hLAorcWxhMngwMF9lbmFibGVfZmNlX3RyYWNlKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBkbWFfYWRkcl90IGZjZV9kbWEsCiAgICAgdWludDE2X3QgYnVmZmVycywgdWludDE2X3QgKm1iLCB1aW50MzJfdCAqZHdvcmRzKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCWlmICghSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0ZDRV9FTkFCTEU7CkBAIC0yNDk3LDEyICsyNTMzLDEyIEBACiAJbWNwLT5pbl9tYiA9IE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJCWlmIChtYikKIAkJCW1lbWNweShtYiwgbWNwLT5tYiwgOCAqIHNpemVvZigqbWIpKTsKQEAgLTI1MTQsMTYgKzI1NTAsMTYgQEAKIH0KIAogaW50Ci1xbGEyeDAwX2Rpc2FibGVfZmNlX3RyYWNlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ2NF90ICp3ciwgdWludDY0X3QgKnJkKQorcWxhMngwMF9kaXNhYmxlX2ZjZV90cmFjZShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDY0X3QgKndyLCB1aW50NjRfdCAqcmQpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQorCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0ZDRV9ESVNBQkxFOwpAQCAtMjUzMywxMiArMjU2OSwxMiBAQAogCSAgICBNQlhfMXxNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAogCQlpZiAod3IpCiAJCQkqd3IgPSAodWludDY0X3QpIG1jcC0+bWJbNV0gPDwgNDggfApAQCAtMjU1NiwxNyArMjU5MiwxNyBAQAogfQogCiBpbnQKLXFsYTJ4MDBfcmVhZF9zZnAoc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCBzZnBfZG1hLCB1aW50MTZfdCBhZGRyLAorcWxhMngwMF9yZWFkX3NmcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgZG1hX2FkZHJfdCBzZnBfZG1hLCB1aW50MTZfdCBhZGRyLAogICAgIHVpbnQxNl90IG9mZiwgdWludDE2X3QgY291bnQpCiB7CiAJaW50IHJ2YWw7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQorCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1JFQURfU0ZQOwogCW1jcC0+bWJbMV0gPSBhZGRyOwpAQCAtMjU4MSwzMCArMjYxNywzMCBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKIH0KIAogaW50Ci1xbGEyeDAwX3NldF9pZG1hX3NwZWVkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQsCitxbGEyeDAwX3NldF9pZG1hX3NwZWVkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBsb29wX2lkLAogICAgIHVpbnQxNl90IHBvcnRfc3BlZWQsIHVpbnQxNl90ICptYikKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX0lJRE1BX0NBUEFCTEUoaGEpKQorCWlmICghSVNfSUlETUFfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19QT1JUX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gbG9vcF9pZDsKQEAgLTI2MTUsNyArMjY1MSw3IEBACiAJbWNwLT5pbl9tYiA9IE1CWF81fE1CWF80fE1CWF8zfE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJLyogUmV0dXJuIG1haWxib3ggc3RhdHVzZXMuICovCiAJaWYgKG1iICE9IE5VTEwpIHsKQEAgLTI2MjgsMjggKzI2NjQsMjkgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIHZvaWQKLXFsYTI0eHhfcmVwb3J0X2lkX2FjcXVpc2l0aW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEsCitxbGEyNHh4X3JlcG9ydF9pZF9hY3F1aXNpdGlvbihzY3NpX3FsYV9ob3N0X3QgKnZoYSwKIAlzdHJ1Y3QgdnBfcnB0X2lkX2VudHJ5XzI0eHggKnJwdGlkX2VudHJ5KQogewogCXVpbnQ4X3QgdnBfaWR4OwogCXVpbnQxNl90IHN0YXQgPSBsZTE2X3RvX2NwdShycHRpZF9lbnRyeS0+dnBfaWR4KTsKLQlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzY3NpX3FsYV9ob3N0X3QgKnZwOwogCiAJaWYgKHJwdGlkX2VudHJ5LT5lbnRyeV9zdGF0dXMgIT0gMCkKIAkJcmV0dXJuOwogCiAJaWYgKHJwdGlkX2VudHJ5LT5mb3JtYXQgPT0gMCkgewogCQlERUJVRzE1KHByaW50aygiJXM6Zm9ybWF0IDAgOiBzY3NpKCVsZCkgbnVtYmVyIG9mIFZQcyBzZXR1cCAlZCwiCi0JCQkiIG51bWJlciBvZiBWUHMgYWNxdWlyZWQgJWRcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkJCSIgbnVtYmVyIG9mIFZQcyBhY3F1aXJlZCAlZFxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKIAkJCU1TQihycHRpZF9lbnRyeS0+dnBfY291bnQpLCBMU0IocnB0aWRfZW50cnktPnZwX2NvdW50KSkpOwogCQlERUJVRzE1KHByaW50aygiJXMgcHJpbWFyeSBwb3J0IGlkICUwMnglMDJ4JTAyeFxuIiwgX19mdW5jX18sCiAJCQlycHRpZF9lbnRyeS0+cG9ydF9pZFsyXSwgcnB0aWRfZW50cnktPnBvcnRfaWRbMV0sCkBAIC0yNjU4LDcgKzI2OTUsNyBAQAogCQl2cF9pZHggPSBMU0Ioc3RhdCk7CiAJCURFQlVHMTUocHJpbnRrKCIlczpmb3JtYXQgMTogc2NzaSglbGQpOiBWUFslZF0gZW5hYmxlZCAiCiAJCSAgICAiLSBzdGF0dXMgJWQgLSAiCi0JCSAgICAid2l0aCBwb3J0IGlkICUwMnglMDJ4JTAyeFxuIixfX2Z1bmNfXyxoYS0+aG9zdF9ubywKKwkJICAgICJ3aXRoIHBvcnQgaWQgJTAyeCUwMnglMDJ4XG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkgICAgdnBfaWR4LCBNU0Ioc3RhdCksCiAJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFsyXSwgcnB0aWRfZW50cnktPnBvcnRfaWRbMV0sCiAJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFswXSkpOwpAQCAtMjY2OCwyNSArMjcwNSwyNCBAQAogCQlpZiAoTVNCKHN0YXQpID09IDEpCiAJCQlyZXR1cm47CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aGEsICZoYS0+dnBfbGlzdCwgdnBfbGlzdCkKLQkJCWlmICh2cF9pZHggPT0gdmhhLT52cF9pZHgpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkKKwkJCWlmICh2cF9pZHggPT0gdnAtPnZwX2lkeCkKIAkJCQlicmVhazsKLQotCQlpZiAoIXZoYSkKKwkJaWYgKCF2cCkKIAkJCXJldHVybjsKIAotCQl2aGEtPmRfaWQuYi5kb21haW4gPSBycHRpZF9lbnRyeS0+cG9ydF9pZFsyXTsKLQkJdmhhLT5kX2lkLmIuYXJlYSA9ICBycHRpZF9lbnRyeS0+cG9ydF9pZFsxXTsKLQkJdmhhLT5kX2lkLmIuYWxfcGEgPSBycHRpZF9lbnRyeS0+cG9ydF9pZFswXTsKKwkJdnAtPmRfaWQuYi5kb21haW4gPSBycHRpZF9lbnRyeS0+cG9ydF9pZFsyXTsKKwkJdnAtPmRfaWQuYi5hcmVhID0gIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzFdOworCQl2cC0+ZF9pZC5iLmFsX3BhID0gcnB0aWRfZW50cnktPnBvcnRfaWRbMF07CiAKIAkJLyoKIAkJICogQ2Fubm90IGNvbmZpZ3VyZSBoZXJlIGFzIHdlIGFyZSBzdGlsbCBzaXR0aW5nIG9uIHRoZQogCQkgKiByZXNwb25zZSBxdWV1ZS4gSGFuZGxlIGl0IGluIGRwYyBjb250ZXh0LgogCQkgKi8KLQkJc2V0X2JpdChWUF9JRFhfQUNRVUlSRUQsICZ2aGEtPnZwX2ZsYWdzKTsKLQkJc2V0X2JpdChWUF9EUENfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoVlBfSURYX0FDUVVJUkVELCAmdnAtPnZwX2ZsYWdzKTsKKwkJc2V0X2JpdChWUF9EUENfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCi0JCXFsYTJ4eHhfd2FrZV9kcGMoaGEpOworCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJfQogfQogCkBAIC0yNzA5LDE1ICsyNzQ1LDE1IEBACiAJaW50CQlydmFsOwogCXN0cnVjdCB2cF9jb25maWdfZW50cnlfMjR4eCAqdnBtb2Q7CiAJZG1hX2FkZHJfdAl2cG1vZF9kbWE7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCS8qIFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUgcGFyZW50ICovCi0JcGhhID0gdG9fcWxhX3BhcmVudCh2aGEpOwogCi0JdnBtb2QgPSBkbWFfcG9vbF9hbGxvYyhwaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ2cG1vZF9kbWEpOworCXZwbW9kID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ2cG1vZF9kbWEpOwogCWlmICghdnBtb2QpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgTW9kaWZ5IFZQICIKLQkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIHBoYS0+aG9zdF9ubykpOworCQkgICAgIklPQ0IuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAl9CiAKQEAgLTI3MzIsMjYgKzI3NjgsMjcgQEAKIAltZW1jcHkodnBtb2QtPnBvcnRfbmFtZV9pZHgxLCB2aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOwogCXZwbW9kLT5lbnRyeV9jb3VudCA9IDE7CiAKLQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHBoYSwgdnBtb2QsIHZwbW9kX2RtYSwgMCk7CisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihiYXNlX3ZoYSwgdnBtb2QsIHZwbW9kX2RtYSwgMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgVlAgY29uZmlnIElPQ0IiCi0JCQkiKCV4KS5cbiIsIF9fZnVuY19fLCBwaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCSIoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIGlmICh2cG1vZC0+Y29tcF9zdGF0dXMgIT0gMCkgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJCSItLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBwaGEtPmhvc3Rfbm8sCisJCQkiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCiAJCQl2cG1vZC0+Y29tcF9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmICh2cG1vZC0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKIAkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBwaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywKIAkJICAgIGxlMTZfdG9fY3B1KHZwbW9kLT5jb21wX3N0YXR1cykpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKIAkJLyogRU1QVFkgKi8KLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgcGhhLT5ob3N0X25vKSk7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sCisJCQkJCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJZmNfdnBvcnRfc2V0X3N0YXRlKHZoYS0+ZmNfdnBvcnQsIEZDX1ZQT1JUX0lOSVRJQUxJWklORyk7CiAJfQotCWRtYV9wb29sX2ZyZWUocGhhLT5zX2RtYV9wb29sLCB2cG1vZCwgdnBtb2RfZG1hKTsKKwlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCB2cG1vZCwgdnBtb2RfZG1hKTsKIAogCXJldHVybiBydmFsOwogfQpAQCAtMjc3OCwxMSArMjgxNSwxMiBAQAogCWludAkJbWFwLCBwb3M7CiAJc3RydWN0IHZwX2N0cmxfZW50cnlfMjR4eCAgICp2Y2U7CiAJZG1hX2FkZHJfdAl2Y2VfZG1hOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB2aGEtPnBhcmVudDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQJdnBfaW5kZXggPSB2aGEtPnZwX2lkeDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuIEVuYWJsaW5nIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywKLQkgICAgaGEtPmhvc3Rfbm8sIHZwX2luZGV4KSk7CisJICAgIHZoYS0+aG9zdF9ubywgdnBfaW5kZXgpKTsKIAogCWlmICh2cF9pbmRleCA9PSAwIHx8IHZwX2luZGV4ID49IGhhLT5tYXhfbnBpdl92cG9ydHMpCiAJCXJldHVybiBRTEFfUEFSQU1FVEVSX0VSUk9SOwpAQCAtMjc5MSw3ICsyODI5LDcgQEAKIAlpZiAoIXZjZSkgewogCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6ICIKIAkJICAgICJmYWlsZWQgdG8gYWxsb2NhdGUgVlAgQ29udHJvbCBJT0NCLlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubykpOworCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQodmNlLCAwLCBzaXplb2Yoc3RydWN0IHZwX2N0cmxfZW50cnlfMjR4eCkpOwpAQCAtMjgxMCwzMCArMjg0OCwzMCBAQAogCXZjZS0+dnBfaWR4X21hcFttYXBdIHw9IDEgPDwgcG9zOwogCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwogCi0JcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgdmNlLCB2Y2VfZG1hLCAwKTsKKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGJhc2VfdmhhLCB2Y2UsIHZjZV9kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIFZQIGNvbnRyb2wgSU9DQiIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgcnZhbCkpOwogCQlwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWUCBjb250cm9sIElPQ0IiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCk7CisJCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgcnZhbCk7CiAJfSBlbHNlIGlmICh2Y2UtPmVudHJ5X3N0YXR1cyAhPSAwKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAogCQkgICAgdmNlLT5lbnRyeV9zdGF0dXMpKTsKIAkJcHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCisJCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCiAJCSAgICB2Y2UtPmVudHJ5X3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAodmNlLT5jb21wX3N0YXR1cyAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCiAJCSAgICBsZTE2X3RvX2NwdSh2Y2UtPmNvbXBfc3RhdHVzKSkpOwogCQlwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCiAJCSAgICBsZTE2X3RvX2NwdSh2Y2UtPmNvbXBfc3RhdHVzKSk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCX0KIAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHZjZSwgdmNlX2RtYSk7CkBAIC0yODYzLDcgKzI5MDEsNyBAQAogICovCiAKIGludAotcWxhMngwMF9zZW5kX2NoYW5nZV9yZXF1ZXN0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGZvcm1hdCwKK3FsYTJ4MDBfc2VuZF9jaGFuZ2VfcmVxdWVzdChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgZm9ybWF0LAogCQkJICAgIHVpbnQxNl90IHZwX2lkeCkKIHsKIAlpbnQgcnZhbDsKQEAgLTI4ODQsNyArMjkyMiw3IEBACiAJbWNwLT5pbl9tYiA9IE1CWF8wfE1CWF8xOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSAwOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJaWYgKG1jcC0+bWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKQEAgLTI4OTcsMTYgKzI5MzUsMTYgQEAKIH0KIAogaW50Ci1xbGEyeDAwX2R1bXBfcmFtKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDMyX3QgYWRkciwKK3FsYTJ4MDBfZHVtcF9yYW0oc2NzaV9xbGFfaG9zdF90ICp2aGEsIGRtYV9hZGRyX3QgcmVxX2RtYSwgdWludDMyX3QgYWRkciwKICAgICB1aW50MzJfdCBzaXplKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAKLQlpZiAoTVNXKGFkZHIpIHx8IElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKKwlpZiAoTVNXKGFkZHIpIHx8IElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkgewogCQltY3AtPm1iWzBdID0gTUJDX0RVTVBfUklTQ19SQU1fRVhURU5ERUQ7CiAJCW1jcC0+bWJbOF0gPSBNU1coYWRkcik7CiAJCW1jcC0+b3V0X21iID0gTUJYXzh8TUJYXzA7CkBAIC0yOTIwLDcgKzI5NTgsNyBAQAogCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJlcV9kbWEpKTsKIAltY3AtPm1iWzddID0gTFNXKE1TRChyZXFfZG1hKSk7CiAJbWNwLT5vdXRfbWIgfD0gTUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzE7Ci0JaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKKwlpZiAoSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbNF0gPSBNU1coc2l6ZSk7CiAJCW1jcC0+bWJbNV0gPSBMU1coc2l6ZSk7CiAJCW1jcC0+b3V0X21iIHw9IE1CWF81fE1CWF80OwpAQCAtMjkzMiwxMyArMjk3MCwxMyBAQAogCW1jcC0+aW5fbWIgPSBNQlhfMDsKIAltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKIAltY3AtPmZsYWdzID0gMDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yOTU0LDIwICsyOTkyLDIxIEBACiB9OwogCiBpbnQKLXFsYTg0eHhfdmVyaWZ5X2NoaXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCAqc3RhdHVzKQorcWxhODR4eF92ZXJpZnlfY2hpcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50MTZfdCAqc3RhdHVzKQogewogCWludCBydmFsLCByZXRyeTsKIAlzdHJ1Y3QgY3M4NHh4X21nbXRfY21kICptbjsKIAlkbWFfYWRkcl90IG1uX2RtYTsKIAl1aW50MTZfdCBvcHRpb25zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzE2KHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCiAJbW4gPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJm1uX2RtYSk7CiAJaWYgKG1uID09IE5VTEwpIHsKIAkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgVmVyaWZ5IElTUDg0WFggIgotCQkgICAgIklPQ0IuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCkBAIC0yOTg2LDE5ICszMDI1LDE5IEBACiAJCW1uLT5wLnJlcS5vcHRpb25zID0gY3B1X3RvX2xlMTYob3B0aW9ucyk7CiAKIAkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IER1bXAgb2YgVmVyaWZ5IFJlcXVlc3QuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGhhLT5ob3N0X25vKSk7CisJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJREVCVUcxNihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbW4sCiAJCSAgICBzaXplb2YoKm1uKSkpOwogCi0JCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2JfdGltZW91dChoYSwgbW4sIG1uX2RtYSwgMCwgMTIwKTsKKwkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYl90aW1lb3V0KHZoYSwgbW4sIG1uX2RtYSwgMCwgMTIwKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHMl8xNihwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWZXJpZnkgIgotCQkJICAgICJJT0NCICgleCkuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCSAgICAiSU9DQiAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOwogCQkJZ290byB2ZXJpZnlfZG9uZTsKIAkJfQogCiAJCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBEdW1wIG9mIFZlcmlmeSBSZXNwb25zZS5cbiIsIF9fZnVuY19fLAotCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJICAgIHZoYS0+aG9zdF9ubykpOwogCQlERUJVRzE2KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltbiwKIAkJICAgIHNpemVvZigqbW4pKSk7CiAKQEAgLTMwMDYsMjEgKzMwNDUsMjEgQEAKIAkJc3RhdHVzWzFdID0gc3RhdHVzWzBdID09IENTX1ZDU19DSElQX0ZBSUxVUkUgPwogCQkgICAgbGUxNl90b19jcHUobW4tPnAucnNwLmZhaWx1cmVfY29kZSkgOiAwOwogCQlERUJVRzJfMTYocHJpbnRrKCIlcyglbGQpOiBjcz0leCBmYz0leFxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgc3RhdHVzWzBdLCBzdGF0dXNbMV0pKTsKKwkJICAgIHZoYS0+aG9zdF9ubywgc3RhdHVzWzBdLCBzdGF0dXNbMV0pKTsKIAogCQlpZiAoc3RhdHVzWzBdICE9IENTX0NPTVBMRVRFKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWlmICghKG9wdGlvbnMgJiBWQ09fRE9OVF9VUERBVEVfRlcpKSB7CiAJCQkJREVCVUcyXzE2KHByaW50aygiJXMoJWxkKTogRmlybXdhcmUgdXBkYXRlICIKIAkJCQkgICAgImZhaWxlZC4gUmV0cnlpbmcgd2l0aG91dCB1cGRhdGUgIgotCQkJCSAgICAiZmlybXdhcmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJCQkgICAgImZpcm13YXJlLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQkJCW9wdGlvbnMgfD0gVkNPX0RPTlRfVVBEQVRFX0ZXOwogCQkJCW9wdGlvbnMgJj0gflZDT19GT1JDRV9VUERBVEU7CiAJCQkJcmV0cnkgPSAxOwogCQkJfQogCQl9IGVsc2UgewogCQkJREVCVUcyXzE2KHByaW50aygiJXMoJWxkKTogZmlybXdhcmUgdXBkYXRlZCB0byAleC5cbiIsCi0JCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCiAJCQkgICAgbGUzMl90b19jcHUobW4tPnAucnNwLmZ3X3ZlcikpKTsKIAogCQkJLyogTk9URTogd2Ugb25seSB1cGRhdGUgT1AgZmlybXdhcmUuICovCkBAIC0zMDM3LDEwICszMDc2LDExNSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyXzE2KHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9CisKK2ludAorcWxhMjV4eF9pbml0X3JlcV9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHJlcV9xdWUgKnJlcSwKKwl1aW50OF90IG9wdGlvbnMpCit7CisJaW50IHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCW1jcC0+bWJbMF0gPSBNQkNfSU5JVElBTElaRV9NVUxUSVE7CisJbWNwLT5tYlsxXSA9IG9wdGlvbnM7CisJbWNwLT5tYlsyXSA9IE1TVyhMU0QocmVxLT5kbWEpKTsKKwltY3AtPm1iWzNdID0gTFNXKExTRChyZXEtPmRtYSkpOworCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJlcS0+ZG1hKSk7CisJbWNwLT5tYls3XSA9IExTVyhNU0QocmVxLT5kbWEpKTsKKwltY3AtPm1iWzVdID0gcmVxLT5sZW5ndGg7CisJaWYgKHJlcS0+cnNwKQorCQltY3AtPm1iWzEwXSA9IHJlcS0+cnNwLT5pZDsKKwltY3AtPm1iWzEyXSA9IHJlcS0+cW9zOworCW1jcC0+bWJbMTFdID0gcmVxLT52cF9pZHg7CisJbWNwLT5tYlsxM10gPSByZXEtPnJpZDsKKworCXJlZyA9IChzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgKikoKHZvaWQgKikoaGEtPm1xaW9iYXNlKSArCisJCVFMQV9RVUVfUEFHRSAqIHJlcS0+aWQpOworCisJbWNwLT5tYls0XSA9IHJlcS0+aWQ7CisJLyogcXVlIGluIHB0ciBpbmRleCAqLworCW1jcC0+bWJbOF0gPSAwOworCS8qIHF1ZSBvdXQgcHRyIGluZGV4ICovCisJbWNwLT5tYls5XSA9IDA7CisJbWNwLT5vdXRfbWIgPSBNQlhfMTR8TUJYXzEzfE1CWF8xMnxNQlhfMTF8TUJYXzEwfE1CWF85fE1CWF84fE1CWF83fAorCQkJTUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVDsKKwltY3AtPnRvdiA9IDYwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaWYgKCEob3B0aW9ucyAmIEJJVF8wKSkgeworCQlXUlRfUkVHX0RXT1JEKCZyZWctPnJlcV9xX2luLCAwKTsKKwkJV1JUX1JFR19EV09SRCgmcmVnLT5yZXFfcV9vdXQsIDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORyAiJXMoJWxkKTogZmFpbGVkPSV4IG1iMD0leC5cbiIsCisJCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhMjV4eF9pbml0X3JzcF9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCwKKwl1aW50OF90IG9wdGlvbnMpCit7CisJaW50IHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCW1jcC0+bWJbMF0gPSBNQkNfSU5JVElBTElaRV9NVUxUSVE7CisJbWNwLT5tYlsxXSA9IG9wdGlvbnM7CisJbWNwLT5tYlsyXSA9IE1TVyhMU0QocnNwLT5kbWEpKTsKKwltY3AtPm1iWzNdID0gTFNXKExTRChyc3AtPmRtYSkpOworCW1jcC0+bWJbNl0gPSBNU1coTVNEKHJzcC0+ZG1hKSk7CisJbWNwLT5tYls3XSA9IExTVyhNU0QocnNwLT5kbWEpKTsKKwltY3AtPm1iWzVdID0gcnNwLT5sZW5ndGg7CisJbWNwLT5tYlsxMV0gPSByc3AtPnZwX2lkeDsKKwltY3AtPm1iWzE0XSA9IHJzcC0+bXNpeC0+dmVjdG9yOworCW1jcC0+bWJbMTNdID0gcnNwLT5yaWQ7CisKKwlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopKCh2b2lkICopKGhhLT5tcWlvYmFzZSkgKworCQlRTEFfUVVFX1BBR0UgKiByc3AtPmlkKTsKKworCW1jcC0+bWJbNF0gPSByc3AtPmlkOworCS8qIHF1ZSBpbiBwdHIgaW5kZXggKi8KKwltY3AtPm1iWzhdID0gMDsKKwkvKiBxdWUgb3V0IHB0ciBpbmRleCAqLworCW1jcC0+bWJbOV0gPSAwOworCW1jcC0+b3V0X21iID0gTUJYXzE0fE1CWF8xM3xNQlhfMTJ8TUJYXzExfE1CWF8xMHxNQlhfOXxNQlhfOHxNQlhfNworCQkJfE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPmZsYWdzID0gTUJYX0RNQV9PVVQ7CisJbWNwLT50b3YgPSA2MDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWlmICghKG9wdGlvbnMgJiBCSVRfMCkpIHsKKwkJV1JUX1JFR19EV09SRCgmcmVnLT5yc3BfcV9vdXQsIDApOworCQlXUlRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX2luLCAwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORyAiJXMoJWxkKTogZmFpbGVkPSV4ICIKKwkJCSJtYjA9JXguXG4iLCBfX2Z1bmNfXywKKwkJCXZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCXJldHVybiBydmFsOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKaW5kZXggOTM1NjBjZC4uMzg2ZmZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwpAQCAtNSw2ICs1LDcgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTJ4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KICNpbmNsdWRlICJxbGFfZGVmLmgiCisjaW5jbHVkZSAicWxhX2dibC5oIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC0xOCw3ICsxOSw3IEBACiB2b2lkCiBxbGEyeDAwX3ZwX3N0b3BfdGltZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7Ci0JaWYgKHZoYS0+cGFyZW50ICYmIHZoYS0+dGltZXJfYWN0aXZlKSB7CisJaWYgKHZoYS0+dnBfaWR4ICYmIHZoYS0+dGltZXJfYWN0aXZlKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZ2aGEtPnRpbWVyKTsKIAkJdmhhLT50aW1lcl9hY3RpdmUgPSAwOwogCX0KQEAgLTI4LDcgKzI5LDcgQEAKIHFsYTI0eHhfYWxsb2NhdGVfdnBfaWQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDMyX3QgdnBfaWQ7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHZoYS0+cGFyZW50OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogRmluZCBhbiBlbXB0eSBzbG90IGFuZCBhc3NpZ24gYW4gdnBfaWQgKi8KIAltdXRleF9sb2NrKCZoYS0+dnBvcnRfbG9jayk7CkBAIC00NCw3ICs0NSw3IEBACiAJaGEtPm51bV92aG9zdHMrKzsKIAloYS0+Y3VyX3Zwb3J0X2NvdW50Kys7CiAJdmhhLT52cF9pZHggPSB2cF9pZDsKLQlsaXN0X2FkZF90YWlsKCZ2aGEtPnZwX2xpc3QsICZoYS0+dnBfbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmdmhhLT5saXN0LCAmaGEtPnZwX2xpc3QpOwogCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwogCXJldHVybiB2cF9pZDsKIH0KQEAgLTUzLDI0ICs1NCwyNCBAQAogcWxhMjR4eF9kZWFsbG9jYXRlX3ZwX2lkKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCXVpbnQxNl90IHZwX2lkOwotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB2aGEtPnBhcmVudDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKIAl2cF9pZCA9IHZoYS0+dnBfaWR4OwogCWhhLT5udW1fdmhvc3RzLS07CiAJaGEtPmN1cl92cG9ydF9jb3VudC0tOwogCWNsZWFyX2JpdCh2cF9pZCwgaGEtPnZwX2lkeF9tYXApOwotCWxpc3RfZGVsKCZ2aGEtPnZwX2xpc3QpOworCWxpc3RfZGVsKCZ2aGEtPmxpc3QpOwogCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwogfQogCiBzdGF0aWMgc2NzaV9xbGFfaG9zdF90ICoKLXFsYTI0eHhfZmluZF92aG9zdF9ieV9uYW1lKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKnBvcnRfbmFtZSkKK3FsYTI0eHhfZmluZF92aG9zdF9ieV9uYW1lKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQ4X3QgKnBvcnRfbmFtZSkKIHsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKIAogCS8qIExvY2F0ZSBtYXRjaGluZyBkZXZpY2UgaW4gZGF0YWJhc2UuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2aGEsICZoYS0+dnBfbGlzdCwgdnBfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodmhhLCAmaGEtPnZwX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFtZW1jbXAocG9ydF9uYW1lLCB2aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpKQogCQkJcmV0dXJuIHZoYTsKIAl9CkBAIC05NCwxNiArOTUsMTMgQEAKIHFsYTJ4MDBfbWFya192cF9kZXZpY2VzX2RlYWQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJZmNfcG9ydF90ICpmY3BvcnQ7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KHZoYSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnBoYS0+ZmNwb3J0cywgbGlzdCkgewotCQlpZiAoZmNwb3J0LT52cF9pZHggIT0gdmhhLT52cF9pZHgpCi0JCQljb250aW51ZTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CiAJCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCk6IE1hcmtpbmcgcG9ydCBkZWFkLCAiCiAJCSAgICAibG9vcF9pZD0weCUwNHggOiV4XG4iLAogCQkgICAgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+dnBfaWR4KSk7CiAKKwkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9ERUFEKTsKIAkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAwLCAwKTsKIAkJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX1VOQ09ORklHVVJFRCk7CiAJfQpAQCAtMTE4LDcgKzExNiw2IEBACiAJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwogCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CiAKLQkvKiBEZWxldGUgYWxsIHZwJ3MgZmNwb3J0cyBmcm9tIHBhcmVudCdzIGxpc3QgKi8KIAlxbGEyeDAwX21hcmtfdnBfZGV2aWNlc19kZWFkKHZoYSk7CiAJYXRvbWljX3NldCgmdmhhLT52cF9zdGF0ZSwgVlBfRkFJTEVEKTsKIAl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CkBAIC0xMzUsMTEgKzEzMiwxMiBAQAogcWxhMjR4eF9lbmFibGVfdnAoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJldDsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdmhhLT5wYXJlbnQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAkvKiBDaGVjayBpZiBwaHlzaWNhbCBoYSBwb3J0IGlzIFVwICovCi0JaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOICB8fAotCQlhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCApIHsKKwlpZiAoYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04gIHx8CisJCWF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CiAJCXZoYS0+dnBfZXJyX3N0YXRlID0gIFZQX0VSUl9QT1JURFdOOwogCQlmY192cG9ydF9zZXRfc3RhdGUodmhhLT5mY192cG9ydCwgRkNfVlBPUlRfTElOS0RPV04pOwogCQlnb3RvIGVuYWJsZV9mYWlsZWQ7CkBAIC0xNzcsOCArMTc1LDggQEAKIAkgICAgdmhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwogCXJldCA9IHFsYTJ4MDBfc2VuZF9jaGFuZ2VfcmVxdWVzdCh2aGEsIDB4MywgdmhhLT52cF9pZHgpOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcxNShxbGFfcHJpbnRrKEtFUk5fRVJSLCB2aGEsICJGYWlsZWQgdG8gZW5hYmxlIHJlY2VpdmluZyIKLQkJICAgICIgb2YgUlNDTiByZXF1ZXN0czogMHgleFxuIiwgcmV0KSk7CisJCURFQlVHMTUocWxhX3ByaW50ayhLRVJOX0VSUiwgdmhhLT5odywgIkZhaWxlZCB0byBlbmFibGUgIgorCQkgICAgInJlY2VpdmluZyBvZiBSU0NOIHJlcXVlc3RzOiAweCV4XG4iLCByZXQpKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCS8qIENvcnJlc3BvbmRzIHRvIFNDUiBlbmFibGVkICovCkBAIC0xOTQsMjUgKzE5MiwxNCBAQAogfQogCiB2b2lkCi1xbGEyeDAwX2FsZXJ0X2FsbF92cHMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgKm1iKQorcWxhMngwMF9hbGVydF9hbGxfdnBzKHN0cnVjdCByc3BfcXVlICpyc3AsIHVpbnQxNl90ICptYikKIHsKLQlpbnQgaSwgdnBfaWR4X21hdGNoZWQ7CiAJc2NzaV9xbGFfaG9zdF90ICp2aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHJzcC0+aHc7CisJaW50IGkgPSAwOwogCi0JaWYgKGhhLT5wYXJlbnQpCi0JCXJldHVybjsKLQotCWZvcl9lYWNoX21hcHBlZF92cF9pZHgoaGEsIGkpIHsKLQkJdnBfaWR4X21hdGNoZWQgPSAwOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodmhhLCAmaGEtPnZwX2xpc3QsIHZwX2xpc3QpIHsKLQkJCWlmIChpID09IHZoYS0+dnBfaWR4KSB7Ci0JCQkJdnBfaWR4X21hdGNoZWQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZwX2lkeF9tYXRjaGVkKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aGEsICZoYS0+dnBfbGlzdCwgbGlzdCkgeworCQlpZiAodmhhLT52cF9pZHgpIHsKIAkJCXN3aXRjaCAobWJbMF0pIHsKIAkJCWNhc2UgTUJBX0xJUF9PQ0NVUlJFRDoKIAkJCWNhc2UgTUJBX0xPT1BfVVA6CkBAIC0yMjMsMTYgKzIxMCwxNyBAQAogCQkJY2FzZSBNQkFfUE9SVF9VUERBVEU6CiAJCQljYXNlIE1CQV9SU0NOX1VQREFURToKIAkJCQlERUJVRzE1KHByaW50aygic2NzaSglbGQpJXM6IEFzeW5jX2V2ZW50IGZvciIKLQkJCQkgICAgIiBWUFslZF0sIG1iID0gMHgleCwgdmhhPSVwXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIF9fZnVuY19fLGksICptYiwgdmhhKSk7Ci0JCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIG1iKTsKKwkJCQkiIFZQWyVkXSwgbWIgPSAweCV4LCB2aGE9JXBcbiIsCisJCQkJdmhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaSwgKm1iLCB2aGEpKTsKKwkJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KHZoYSwgcnNwLCBtYik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKwkJaSsrOwogCX0KIH0KIAotdm9pZAoraW50CiBxbGEyeDAwX3ZwX2Fib3J0X2lzcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAkvKgpAQCAtMjQ3LDM4ICsyMzUsNTYgQEAKIAkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CiAJfQogCisJLyogVG8gZXhjbHVzaXZlbHkgcmVzZXQgdnBvcnQsIHdlIG5lZWQgdG8gbG9nIGl0IG91dCBmaXJzdC4qLworCWlmICghdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkKKwkJcWxhMjR4eF9jb250cm9sX3ZwKHZoYSwgVkNFX0NPTU1BTkRfRElTQUJMRV9WUFNfTE9HT19BTEwpOworCiAJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogU2NoZWR1bGluZyBlbmFibGUgb2YgVnBvcnQgJWQuLi5cbiIsCiAJICAgIHZoYS0+aG9zdF9ubywgdmhhLT52cF9pZHgpKTsKLQlxbGEyNHh4X2VuYWJsZV92cCh2aGEpOworCXJldHVybiBxbGEyNHh4X2VuYWJsZV92cCh2aGEpOwogfQogCiBzdGF0aWMgaW50CiBxbGEyeDAwX2RvX2RwY192cChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdmhhLT5wYXJlbnQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc2NzaV9xbGFfaG9zdF90ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFZQX0lEWF9BQ1FVSVJFRCwgJnZoYS0+dnBfZmxhZ3MpKSB7CiAJCS8qIFZQIGFjcXVpcmVkLiBjb21wbGV0ZSBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9SRUFEWSkgeworCQlpZiAoYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1JFQURZKSB7CiAJCQlxbGEyNHh4X2NvbmZpZ3VyZV92cCh2aGEpOwogCQl9IGVsc2UgewogCQkJc2V0X2JpdChWUF9JRFhfQUNRVUlSRUQsICZ2aGEtPnZwX2ZsYWdzKTsKLQkJCXNldF9iaXQoVlBfRFBDX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJc2V0X2JpdChWUF9EUENfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCX0KIAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCi0JCXFsYTJ4MDBfdnBfYWJvcnRfaXNwKHZoYSk7CisJaWYgKHRlc3RfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydHModmhhKTsKKwkJY2xlYXJfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCX0KKworCWlmICgodGVzdF9hbmRfY2xlYXJfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSAmJgorCQkhdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpICYmCisJCWF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4oKVxuIiwKKwkJCQkJCXZoYS0+aG9zdF9ubykpOworCQlxbGEyeDAwX3JlbG9naW4odmhhKTsKKworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9wb3J0X2xvZ2luIC0gZW5kXG4iLAorCQkJCQkJCXZoYS0+aG9zdF9ubykpOworCX0KIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCSAgICAoISh0ZXN0X2FuZF9zZXRfYml0KFJFU0VUX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkpKSB7CiAJCWNsZWFyX2JpdChSRVNFVF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncyk7CiAJfQogCi0JaWYgKGF0b21pY19yZWFkKCZ2aGEtPnZwX3N0YXRlKSA9PSBWUF9BQ1RJVkUgJiYKLQkgICAgdGVzdF9hbmRfY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpKSkgewogCQkJcWxhMngwMF9sb29wX3Jlc3luYyh2aGEpOwogCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTI4OSwzOCArMjk1LDMwIEBACiB9CiAKIHZvaWQKLXFsYTJ4MDBfZG9fZHBjX2FsbF92cHMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZG9fZHBjX2FsbF92cHMoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJldDsKLQlpbnQgaSwgdnBfaWR4X21hdGNoZWQ7Ci0Jc2NzaV9xbGFfaG9zdF90ICp2aGE7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc2NzaV9xbGFfaG9zdF90ICp2cDsKIAotCWlmIChoYS0+cGFyZW50KQorCWlmICh2aGEtPnZwX2lkeCkKIAkJcmV0dXJuOwogCWlmIChsaXN0X2VtcHR5KCZoYS0+dnBfbGlzdCkpCiAJCXJldHVybjsKIAotCWNsZWFyX2JpdChWUF9EUENfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJY2xlYXJfYml0KFZQX0RQQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKLQlmb3JfZWFjaF9tYXBwZWRfdnBfaWR4KGhhLCBpKSB7Ci0JCXZwX2lkeF9tYXRjaGVkID0gMDsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZoYSwgJmhhLT52cF9saXN0LCB2cF9saXN0KSB7Ci0JCQlpZiAoaSA9PSB2aGEtPnZwX2lkeCkgewotCQkJCXZwX2lkeF9tYXRjaGVkID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICh2cF9pZHhfbWF0Y2hlZCkKLQkJCXJldCA9IHFsYTJ4MDBfZG9fZHBjX3ZwKHZoYSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJmhhLT52cF9saXN0LCBsaXN0KSB7CisJCWlmICh2cC0+dnBfaWR4KQorCQkJcmV0ID0gcWxhMngwMF9kb19kcGNfdnAodnApOwogCX0KIH0KIAogaW50CiBxbGEyNHh4X3Zwb3J0X2NyZWF0ZV9yZXFfc2FuaXR5X2NoZWNrKHN0cnVjdCBmY192cG9ydCAqZmNfdnBvcnQpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoZmNfdnBvcnQtPnNob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gc2hvc3RfcHJpdihmY192cG9ydC0+c2hvc3QpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBiYXNlX3ZoYS0+aHc7CiAJc2NzaV9xbGFfaG9zdF90ICp2aGE7CiAJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOwogCkBAIC0zMzcsNyArMzM1LDcgQEAKIAogCS8qIENoZWNrIHVwIHVuaXF1ZSBXV1BOICovCiAJdTY0X3RvX3d3bihmY192cG9ydC0+cG9ydF9uYW1lLCBwb3J0X25hbWUpOwotCWlmICghbWVtY21wKHBvcnRfbmFtZSwgaGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpKQorCWlmICghbWVtY21wKHBvcnRfbmFtZSwgYmFzZV92aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpKQogCQlyZXR1cm4gVlBDRVJSX0JBRF9XV047CiAJdmhhID0gcWxhMjR4eF9maW5kX3Zob3N0X2J5X25hbWUoaGEsIHBvcnRfbmFtZSk7CiAJaWYgKHZoYSkKQEAgLTM0Niw3ICszNDQsNyBAQAogCS8qIENoZWNrIHVwIG1heC1ucGl2LXN1cHBvcnRzICovCiAJaWYgKGhhLT5udW1fdmhvc3RzID4gaGEtPm1heF9ucGl2X3Zwb3J0cykgewogCQlERUJVRzE1KHByaW50aygic2NzaSglbGQpOiBudW1fdmhvc3RzICV1ZCBpcyBiaWdnZXIgdGhhbiAiCi0JCSAgICAibWF4X25wdl92cG9ydHMgJXVkLlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICAibWF4X25wdl92cG9ydHMgJXVkLlxuIiwgYmFzZV92aGEtPmhvc3Rfbm8sCiAJCSAgICBoYS0+bnVtX3Zob3N0cywgaGEtPm1heF9ucGl2X3Zwb3J0cykpOwogCQlyZXR1cm4gVlBDRVJSX1VOU1VQUE9SVEVEOwogCX0KQEAgLTM1Niw1OSArMzU0LDM0IEBACiBzY3NpX3FsYV9ob3N0X3QgKgogcWxhMjR4eF9jcmVhdGVfdmhvc3Qoc3RydWN0IGZjX3Zwb3J0ICpmY192cG9ydCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihmY192cG9ydC0+c2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBzaG9zdF9wcml2KGZjX3Zwb3J0LT5zaG9zdCk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IGJhc2VfdmhhLT5odzsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSAmcWxhMjR4eF9kcml2ZXJfdGVtcGxhdGU7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAotCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJnFsYTI0eHhfZHJpdmVyX3RlbXBsYXRlLAotCSAgICBzaXplb2Yoc2NzaV9xbGFfaG9zdF90KSk7Ci0JaWYgKCFob3N0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJxbGEyeHh4OiBzY3NpX2hvc3RfYWxsb2MoKSBmYWlsZWQgZm9yIHZwb3J0XG4iKTsKKwl2aGEgPSBxbGEyeDAwX2NyZWF0ZV9ob3N0KHNodCwgaGEpOworCWlmICghdmhhKSB7CisJCURFQlVHKHByaW50aygicWxhMnh4eDogc2NzaV9ob3N0X2FsbG9jKCkgZmFpbGVkIGZvciB2cG9ydFxuIikpOwogCQlyZXR1cm4oTlVMTCk7CiAJfQogCi0JdmhhID0gc2hvc3RfcHJpdihob3N0KTsKLQotCS8qIGNsb25lIHRoZSBwYXJlbnQgaGJhICovCi0JbWVtY3B5KHZoYSwgaGEsIHNpemVvZiAoc2NzaV9xbGFfaG9zdF90KSk7Ci0KKwlob3N0ID0gdmhhLT5ob3N0OwogCWZjX3Zwb3J0LT5kZF9kYXRhID0gdmhhOwotCi0JdmhhLT5ub2RlX25hbWUgPSBrbWFsbG9jKFdXTl9TSVpFICogc2l6ZW9mKGNoYXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZoYS0+bm9kZV9uYW1lKQotCQlnb3RvIGNyZWF0ZV92aG9zdF9mYWlsZWRfMTsKLQotCXZoYS0+cG9ydF9uYW1lID0ga21hbGxvYyhXV05fU0laRSAqIHNpemVvZihjaGFyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2aGEtPnBvcnRfbmFtZSkKLQkJZ290byBjcmVhdGVfdmhvc3RfZmFpbGVkXzI7Ci0KIAkvKiBOZXcgaG9zdCBpbmZvICovCiAJdTY0X3RvX3d3bihmY192cG9ydC0+bm9kZV9uYW1lLCB2aGEtPm5vZGVfbmFtZSk7CiAJdTY0X3RvX3d3bihmY192cG9ydC0+cG9ydF9uYW1lLCB2aGEtPnBvcnRfbmFtZSk7CiAKLQl2aGEtPmhvc3QgPSBob3N0OwotCXZoYS0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87Ci0JdmhhLT5wYXJlbnQgPSBoYTsKIAl2aGEtPmZjX3Zwb3J0ID0gZmNfdnBvcnQ7CiAJdmhhLT5kZXZpY2VfZmxhZ3MgPSAwOwogCXZoYS0+dnBfaWR4ID0gcWxhMjR4eF9hbGxvY2F0ZV92cF9pZCh2aGEpOwogCWlmICh2aGEtPnZwX2lkeCA+IGhhLT5tYXhfbnBpdl92cG9ydHMpIHsKIAkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogQ291bGRuJ3QgYWxsb2NhdGUgdnBfaWQuXG4iLAogCQkJdmhhLT5ob3N0X25vKSk7Ci0JCWdvdG8gY3JlYXRlX3Zob3N0X2ZhaWxlZF8zOworCQlnb3RvIGNyZWF0ZV92aG9zdF9mYWlsZWQ7CiAJfQogCXZoYS0+bWdtdF9zdnJfbG9vcF9pZCA9IDEwICsgdmhhLT52cF9pZHg7CiAKLQlpbml0X2NvbXBsZXRpb24oJnZoYS0+bWJ4X2NtZF9jb21wKTsKLQljb21wbGV0ZSgmdmhhLT5tYnhfY21kX2NvbXApOwotCWluaXRfY29tcGxldGlvbigmdmhhLT5tYnhfaW50cl9jb21wKTsKLQotCUlOSVRfTElTVF9IRUFEKCZ2aGEtPmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZ2aGEtPmZjcG9ydHMpOwotCUlOSVRfTElTVF9IRUFEKCZ2aGEtPnZwX2ZjcG9ydHMpOwotCUlOSVRfTElTVF9IRUFEKCZ2aGEtPndvcmtfbGlzdCk7Ci0KIAl2aGEtPmRwY19mbGFncyA9IDBMOwogCXNldF9iaXQoUkVHSVNURVJfRkRNSV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJc2V0X2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtNDIzLDcgKzM5Niw5IEBACiAKIAlxbGEyeDAwX3N0YXJ0X3RpbWVyKHZoYSwgcWxhMngwMF90aW1lciwgV0FUQ0hfSU5URVJWQUwpOwogCi0JaG9zdC0+Y2FuX3F1ZXVlID0gdmhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMTI4OworCW1lbXNldCh2aGEtPnJlcV9xdWVzLCAwLCBzaXplb2YodmhhLT5yZXFfcXVlcykgKiBRTEFfTUFYX0hPU1RfUVVFUyk7CisJdmhhLT5yZXFfcXVlc1swXSA9IGhhLT5yZXFfcV9tYXBbMF0tPmlkOworCWhvc3QtPmNhbl9xdWV1ZSA9IGhhLT5yZXFfcV9tYXBbMF0tPmxlbmd0aCArIDEyODsKIAlob3N0LT50aGlzX2lkID0gMjU1OwogCWhvc3QtPmNtZF9wZXJfbHVuID0gMzsKIAlob3N0LT5tYXhfY21kX2xlbiA9IE1BWF9DTURTWjsKQEAgLTQ0MCwxMiArNDE1LDM0MSBAQAogCiAJcmV0dXJuIHZoYTsKIAotY3JlYXRlX3Zob3N0X2ZhaWxlZF8zOgotCWtmcmVlKHZoYS0+cG9ydF9uYW1lKTsKLQotY3JlYXRlX3Zob3N0X2ZhaWxlZF8yOgotCWtmcmVlKHZoYS0+bm9kZV9uYW1lKTsKLQotY3JlYXRlX3Zob3N0X2ZhaWxlZF8xOgorY3JlYXRlX3Zob3N0X2ZhaWxlZDoKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIHZvaWQKK3FsYTI1eHhfZnJlZV9yZXFfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDE2X3QgcXVlX2lkID0gcmVxLT5pZDsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCAocmVxLT5sZW5ndGggKyAxKSAqCisJCXNpemVvZihyZXF1ZXN0X3QpLCByZXEtPnJpbmcsIHJlcS0+ZG1hKTsKKwlyZXEtPnJpbmcgPSBOVUxMOworCXJlcS0+ZG1hID0gMDsKKwlpZiAocXVlX2lkKSB7CisJCWhhLT5yZXFfcV9tYXBbcXVlX2lkXSA9IE5VTEw7CisJCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKKwkJY2xlYXJfYml0KHF1ZV9pZCwgaGEtPnJlcV9xaWRfbWFwKTsKKwkJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisJfQorCWtmcmVlKHJlcSk7CisJcmVxID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3FsYTI1eHhfZnJlZV9yc3BfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByc3BfcXVlICpyc3ApCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDE2X3QgcXVlX2lkID0gcnNwLT5pZDsKKworCWlmIChyc3AtPm1zaXggJiYgcnNwLT5tc2l4LT5oYXZlX2lycSkgeworCQlmcmVlX2lycShyc3AtPm1zaXgtPnZlY3RvciwgcnNwKTsKKwkJcnNwLT5tc2l4LT5oYXZlX2lycSA9IDA7CisJCXJzcC0+bXNpeC0+cnNwID0gTlVMTDsKKwl9CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIChyc3AtPmxlbmd0aCArIDEpICoKKwkJc2l6ZW9mKHJlc3BvbnNlX3QpLCByc3AtPnJpbmcsIHJzcC0+ZG1hKTsKKwlyc3AtPnJpbmcgPSBOVUxMOworCXJzcC0+ZG1hID0gMDsKKwlpZiAocXVlX2lkKSB7CisJCWhhLT5yc3BfcV9tYXBbcXVlX2lkXSA9IE5VTEw7CisJCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKKwkJY2xlYXJfYml0KHF1ZV9pZCwgaGEtPnJzcF9xaWRfbWFwKTsKKwkJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisJfQorCWtmcmVlKHJzcCk7CisJcnNwID0gTlVMTDsKK30KKworaW50CitxbGEyNXh4X2RlbGV0ZV9yZXFfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHN0cnVjdCByZXFfcXVlICpyZXEpCit7CisJaW50IHJldCA9IC0xOworCisJaWYgKHJlcSkgeworCQlyZXEtPm9wdGlvbnMgfD0gQklUXzA7CisJCXJldCA9IHFsYTI1eHhfaW5pdF9yZXFfcXVlKHZoYSwgcmVxLCByZXEtPm9wdGlvbnMpOworCX0KKwlpZiAocmV0ID09IFFMQV9TVUNDRVNTKQorCQlxbGEyNXh4X2ZyZWVfcmVxX3F1ZSh2aGEsIHJlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK3FsYTI1eHhfZGVsZXRlX3JzcF9xdWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHJzcF9xdWUgKnJzcCkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocnNwKSB7CisJCXJzcC0+b3B0aW9ucyB8PSBCSVRfMDsKKwkJcmV0ID0gcWxhMjV4eF9pbml0X3JzcF9xdWUodmhhLCByc3AsIHJzcC0+b3B0aW9ucyk7CisJfQorCWlmIChyZXQgPT0gUUxBX1NVQ0NFU1MpCisJCXFsYTI1eHhfZnJlZV9yc3BfcXVlKHZoYSwgcnNwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBxbGEyNXh4X3VwZGF0ZV9yZXFfcXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHVpbnQ4X3QgcXVlLCB1aW50OF90IHFvcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFtxdWVdOworCisJcmVxLT5vcHRpb25zIHw9IEJJVF8zOworCXJlcS0+cW9zID0gcW9zOworCXJldCA9IHFsYTI1eHhfaW5pdF9yZXFfcXVlKHZoYSwgcmVxLCByZXEtPm9wdGlvbnMpOworCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpCisJCURFQlVHMl8xNyhwcmludGsoS0VSTl9XQVJOSU5HICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7CisJLyogcmVzdG9yZSBvcHRpb25zIGJpdCAqLworCXJlcS0+b3B0aW9ucyAmPSB+QklUXzM7CisJcmV0dXJuIHJldDsKK30KKworCisvKiBEZWxldGUgYWxsIHF1ZXVlcyBmb3IgYSBnaXZlbiB2aG9zdCAqLworaW50CitxbGEyNXh4X2RlbGV0ZV9xdWV1ZXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgdWludDhfdCBxdWVfbm8pCit7CisJaW50IGNudCwgcmV0ID0gMDsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gTlVMTDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWlmIChxdWVfbm8pIHsKKwkvKiBEZWxldGUgcmVxdWVzdCBxdWV1ZSAqLworCQlyZXEgPSBoYS0+cmVxX3FfbWFwW3F1ZV9ub107CisJCWlmIChyZXEpIHsKKwkJCXJzcCA9IHJlcS0+cnNwOworCQkJcmV0ID0gcWxhMjV4eF9kZWxldGVfcmVxX3F1ZSh2aGEsIHJlcSk7CisJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSJDb3VsZG4ndCBkZWxldGUgcmVxIHF1ZSAlZFxuIiwgcmVxLT5pZCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCS8qIERlbGV0ZSBhc3NvY2lhdGVkIHJlc3BvbnNlIHF1ZXVlICovCisJCQlpZiAocnNwKSB7CisJCQkJcmV0ID0gcWxhMjV4eF9kZWxldGVfcnNwX3F1ZSh2aGEsIHJzcCk7CisJCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJCQkiQ291bGRuJ3QgZGVsZXRlIHJzcCBxdWUgJWRcbiIsCisJCQkJCQlyc3AtPmlkKTsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeyAgLyogZGVsZXRlIGFsbCBxdWV1ZXMgb2YgdGhpcyBob3N0ICovCisJCWZvciAoY250ID0gMDsgY250IDwgUUxBX01BWF9IT1NUX1FVRVM7IGNudCsrKSB7CisJCQkvKiBEZWxldGUgcmVxdWVzdCBxdWV1ZXMgKi8KKwkJCXJlcSA9IGhhLT5yZXFfcV9tYXBbdmhhLT5yZXFfcXVlc1tjbnRdXTsKKwkJCWlmIChyZXEgJiYgcmVxLT5pZCkgeworCQkJCXJzcCA9IHJlcS0+cnNwOworCQkJCXJldCA9IHFsYTI1eHhfZGVsZXRlX3JlcV9xdWUodmhhLCByZXEpOworCQkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCQkJIkNvdWxkbid0IGRlbGV0ZSByZXEgcXVlICVkXG4iLAorCQkJCQkJdmhhLT5yZXFfcXVlc1tjbnRdKTsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJdmhhLT5yZXFfcXVlc1tjbnRdID0gaGEtPnJlcV9xX21hcFswXS0+aWQ7CisJCQkvKiBEZWxldGUgYXNzb2NpYXRlZCByZXNwb25zZSBxdWV1ZSAqLworCQkJCWlmIChyc3AgJiYgcnNwLT5pZCkgeworCQkJCQlyZXQgPSBxbGEyNXh4X2RlbGV0ZV9yc3BfcXVlKHZoYSwgcnNwKTsKKwkJCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQkJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCQkJIkNvdWxkbid0IGRlbGV0ZSByc3AgcXVlICVkXG4iLAorCQkJCQkJcnNwLT5pZCk7CisJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlF1ZXVlcyBkZWxldGVkIGZvciB2cG9ydDolZFxuIiwKKwkJdmhhLT52cF9pZHgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorcWxhMjV4eF9jcmVhdGVfcmVxX3F1ZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MTZfdCBvcHRpb25zLAorCXVpbnQ4X3QgdnBfaWR4LCB1aW50MTZfdCByaWQsIHVpbnQ4X3QgcnNwX3F1ZSwgdWludDhfdCBxb3MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IE5VTEw7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKwl1aW50MTZfdCBxdWVfaWQgPSAwOworCisJcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcV9xdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVxID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIKKwkJCSJmb3IgcmVxdWVzdCBxdWVcbiIpOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCisJcmVxLT5sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOworCXJlcS0+cmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCShyZXEtPmxlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCisJCQkmcmVxLT5kbWEsIEdGUF9LRVJORUwpOworCWlmIChyZXEtPnJpbmcgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSByZXF1ZXN0X3JpbmdcbiIpOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCisJbXV0ZXhfbG9jaygmaGEtPnZwb3J0X2xvY2spOworCXF1ZV9pZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJlcV9xaWRfbWFwLCBoYS0+bWF4X3F1ZXVlcyk7CisJaWYgKHF1ZV9pZCA+PSBoYS0+bWF4X3F1ZXVlcykgeworCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTm8gcmVzb3VyY2VzIHRvIGNyZWF0ZSAiCisJCQkgImFkZGl0aW9uYWwgcmVxdWVzdCBxdWV1ZVxuIik7CisJCWdvdG8gcXVlX2ZhaWxlZDsKKwl9CisJc2V0X2JpdChxdWVfaWQsIGhhLT5yZXFfcWlkX21hcCk7CisJaGEtPnJlcV9xX21hcFtxdWVfaWRdID0gcmVxOworCXJlcS0+cmlkID0gcmlkOworCXJlcS0+dnBfaWR4ID0gdnBfaWR4OworCXJlcS0+cW9zID0gcW9zOworCisJaWYgKGhhLT5yc3BfcV9tYXBbcnNwX3F1ZV0pCisJCXJlcS0+cnNwID0gaGEtPnJzcF9xX21hcFtyc3BfcXVlXTsKKwkvKiBVc2UgYWx0ZXJuYXRlIFBDSSBidXMgbnVtYmVyICovCisJaWYgKE1TQihyZXEtPnJpZCkpCisJCW9wdGlvbnMgfD0gQklUXzQ7CisJLyogVXNlIGFsdGVybmF0ZSBQQ0kgZGV2Zm4gKi8KKwlpZiAoTFNCKHJlcS0+cmlkKSkKKwkJb3B0aW9ucyB8PSBCSVRfNTsKKwlyZXEtPm9wdGlvbnMgPSBvcHRpb25zOworCXJlcS0+cmluZ19wdHIgPSByZXEtPnJpbmc7CisJcmVxLT5yaW5nX2luZGV4ID0gMDsKKwlyZXEtPmNudCA9IHJlcS0+bGVuZ3RoOworCXJlcS0+aWQgPSBxdWVfaWQ7CisJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisKKwlyZXQgPSBxbGEyNXh4X2luaXRfcmVxX3F1ZShiYXNlX3ZoYSwgcmVxLCBvcHRpb25zKTsKKwlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQltdXRleF9sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisJCWNsZWFyX2JpdChxdWVfaWQsIGhhLT5yZXFfcWlkX21hcCk7CisJCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCisJcmV0dXJuIHJlcS0+aWQ7CisKK3F1ZV9mYWlsZWQ6CisJcWxhMjV4eF9mcmVlX3JlcV9xdWUoYmFzZV92aGEsIHJlcSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSByZXNwb25zZSBxdWV1ZSAqLworaW50CitxbGEyNXh4X2NyZWF0ZV9yc3BfcXVlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQxNl90IG9wdGlvbnMsCisJdWludDhfdCB2cF9pZHgsIHVpbnQxNl90IHJpZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOworCXVpbnQxNl90IHF1ZV9pZCA9IDA7OworCisJcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzcF9xdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnNwID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IiCisJCQkJIiByZXNwb25zZSBxdWVcbiIpOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCisJcnNwLT5sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMDsKKwlyc3AtPnJpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkocnNwLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKKwkJCSZyc3AtPmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJzcC0+cmluZyA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJlc3BvbnNlX3JpbmdcbiIpOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCisJbXV0ZXhfbG9jaygmaGEtPnZwb3J0X2xvY2spOworCXF1ZV9pZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJzcF9xaWRfbWFwLCBoYS0+bWF4X3F1ZXVlcyk7CisJaWYgKHF1ZV9pZCA+PSBoYS0+bWF4X3F1ZXVlcykgeworCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTm8gcmVzb3VyY2VzIHRvIGNyZWF0ZSAiCisJCQkgImFkZGl0aW9uYWwgcmVzcG9uc2UgcXVldWVcbiIpOworCQlnb3RvIHF1ZV9mYWlsZWQ7CisJfQorCXNldF9iaXQocXVlX2lkLCBoYS0+cnNwX3FpZF9tYXApOworCisJaWYgKGhhLT5mbGFncy5tc2l4X2VuYWJsZWQpCisJCXJzcC0+bXNpeCA9ICZoYS0+bXNpeF9lbnRyaWVzW3F1ZV9pZCArIDFdOworCWVsc2UKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAibXNpeCBub3QgZW5hYmxlZFxuIik7CisKKwloYS0+cnNwX3FfbWFwW3F1ZV9pZF0gPSByc3A7CisJcnNwLT5yaWQgPSByaWQ7CisJcnNwLT52cF9pZHggPSB2cF9pZHg7CisJcnNwLT5odyA9IGhhOworCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KKwlpZiAoTVNCKHJzcC0+cmlkKSkKKwkJb3B0aW9ucyB8PSBCSVRfNDsKKwkvKiBVc2UgYWx0ZXJuYXRlIFBDSSBkZXZmbiAqLworCWlmIChMU0IocnNwLT5yaWQpKQorCQlvcHRpb25zIHw9IEJJVF81OworCXJzcC0+b3B0aW9ucyA9IG9wdGlvbnM7CisJcnNwLT5yaW5nX3B0ciA9IHJzcC0+cmluZzsKKwlyc3AtPnJpbmdfaW5kZXggPSAwOworCXJzcC0+aWQgPSBxdWVfaWQ7CisJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisKKwlyZXQgPSBxbGEyNXh4X3JlcXVlc3RfaXJxKHJzcCk7CisJaWYgKHJldCkKKwkJZ290byBxdWVfZmFpbGVkOworCisJcmV0ID0gcWxhMjV4eF9pbml0X3JzcF9xdWUoYmFzZV92aGEsIHJzcCwgb3B0aW9ucyk7CisJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfbG9jaygmaGEtPnZwb3J0X2xvY2spOworCQljbGVhcl9iaXQocXVlX2lkLCBoYS0+cnNwX3FpZF9tYXApOworCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKKwkJZ290byBxdWVfZmFpbGVkOworCX0KKworCXFsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMocnNwKTsKKworCXJldHVybiByc3AtPmlkOworCitxdWVfZmFpbGVkOgorCXFsYTI1eHhfZnJlZV9yc3BfcXVlKGJhc2VfdmhhLCByc3ApOworCXJldHVybiAwOworfQorCitpbnQKK3FsYTI1eHhfY3JlYXRlX3F1ZXVlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50OF90IHFvcykKK3sKKwl1aW50MTZfdCBvcHRpb25zID0gMDsKKwl1aW50OF90IHJldCA9IDA7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlvcHRpb25zIHw9IEJJVF8xOworCXJldCA9IHFsYTI1eHhfY3JlYXRlX3JzcF9xdWUoaGEsIG9wdGlvbnMsIHZoYS0+dnBfaWR4LCAwKTsKKwlpZiAoIXJldCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJSZXNwb25zZSBRdWUgY3JlYXRlIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJlc3BvbnNlIFF1ZTolZCBjcmVhdGVkLlxuIiwgcmV0KTsKKworCW9wdGlvbnMgPSAwOworCWlmIChxb3MgJiBCSVRfNykKKwkJb3B0aW9ucyB8PSBCSVRfODsKKwlyZXQgPSBxbGEyNXh4X2NyZWF0ZV9yZXFfcXVlKGhhLCBvcHRpb25zLCB2aGEtPnZwX2lkeCwgMCwgcmV0LAorCQkJCQlxb3MgJiB+QklUXzcpOworCWlmIChyZXQpIHsKKwkJdmhhLT5yZXFfcXVlc1swXSA9IHJldDsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUmVxdWVzdCBRdWU6JWQgY3JlYXRlZC5cbiIsIHJldCk7CisJfSBlbHNlCisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlJlcXVlc3QgUXVlIGNyZWF0ZSBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggMzU1NjcyMC4uOGVhOTI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTkyLDcgKzkyLDEyIEBACiAJCSJFbmFibGVzIGlJRE1BIHNldHRpbmdzICIKIAkJIkRlZmF1bHQgaXMgMSAtIHBlcmZvcm0gaUlETUEuIDAgLSBubyBpSURNQS4iKTsKIAotCitpbnQgcWwyeG1heHF1ZXVlcyA9IDE7Cittb2R1bGVfcGFyYW0ocWwyeG1heHF1ZXVlcywgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4bWF4cXVldWVzLAorCQkiRW5hYmxlcyBNUSBzZXR0aW5ncyAiCisJCSJEZWZhdWx0IGlzIDEgZm9yIHNpbmdsZSBxdWV1ZS4gU2V0IGl0IHRvIG51bWJlciBcCisJCQlvZiBxdWV1ZXMgaW4gTVEgbW9kZS4iKTsKIC8qCiAgKiBTQ1NJIGhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzCiAgKi8KQEAgLTE4Myw0MiArMTg4LDEwOCBAQAogICovCiAKIF9faW5saW5lX18gdm9pZAotcWxhMngwMF9zdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB2b2lkICpmdW5jLCB1bnNpZ25lZCBsb25nIGludGVydmFsKQorcWxhMngwMF9zdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdm9pZCAqZnVuYywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKIHsKLQlpbml0X3RpbWVyKCZoYS0+dGltZXIpOwotCWhhLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGludGVydmFsICogSFo7Ci0JaGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyloYTsKLQloYS0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpZnVuYzsKLQlhZGRfdGltZXIoJmhhLT50aW1lcik7Ci0JaGEtPnRpbWVyX2FjdGl2ZSA9IDE7CisJaW5pdF90aW1lcigmdmhhLT50aW1lcik7CisJdmhhLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGludGVydmFsICogSFo7CisJdmhhLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdmhhOworCXZoYS0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpZnVuYzsKKwlhZGRfdGltZXIoJnZoYS0+dGltZXIpOworCXZoYS0+dGltZXJfYWN0aXZlID0gMTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1xbGEyeDAwX3Jlc3RhcnRfdGltZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3FsYTJ4MDBfcmVzdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKIHsKLQltb2RfdGltZXIoJmhhLT50aW1lciwgamlmZmllcyArIGludGVydmFsICogSFopOworCW1vZF90aW1lcigmdmhhLT50aW1lciwgamlmZmllcyArIGludGVydmFsICogSFopOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1xbGEyeDAwX3N0b3BfdGltZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfc3RvcF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKLQlkZWxfdGltZXJfc3luYygmaGEtPnRpbWVyKTsKLQloYS0+dGltZXJfYWN0aXZlID0gMDsKKwlkZWxfdGltZXJfc3luYygmdmhhLT50aW1lcik7CisJdmhhLT50aW1lcl9hY3RpdmUgPSAwOwogfQogCiBzdGF0aWMgaW50IHFsYTJ4MDBfZG9fZHBjKHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgdm9pZCBxbGEyeDAwX3JzdF9hZW4oc2NzaV9xbGFfaG9zdF90ICopOwogCi1zdGF0aWMgaW50IHFsYTJ4MDBfbWVtX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqKTsKLXN0YXRpYyB2b2lkIHFsYTJ4MDBfbWVtX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICpoYSk7Ci1zdGF0aWMgdm9pZCBxbGEyeDAwX3NwX2ZyZWVfZG1hKHNjc2lfcWxhX2hvc3RfdCAqLCBzcmJfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9tZW1fYWxsb2Moc3RydWN0IHFsYV9od19kYXRhICosIHVpbnQxNl90LCB1aW50MTZfdCwKKwlzdHJ1Y3QgcmVxX3F1ZSAqKiwgc3RydWN0IHJzcF9xdWUgKiopOworc3RhdGljIHZvaWQgcWxhMngwMF9tZW1fZnJlZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3NwX2ZyZWVfZG1hKHNyYl90ICopOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBxbGEyeDAwX2FsbG9jX3F1ZXVlcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQoreworCWhhLT5yZXFfcV9tYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxX3F1ZSAqKSAqIGhhLT5tYXhfcXVldWVzLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghaGEtPnJlcV9xX21hcCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxdWVzdCBxdWV1ZSBwdHJzXG4iKTsKKwkJZ290byBmYWlsX3JlcV9tYXA7CisJfQorCisJaGEtPnJzcF9xX21hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc3BfcXVlICopICogaGEtPm1heF9xdWV1ZXMsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFoYS0+cnNwX3FfbWFwKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXNwb25zZSBxdWV1ZSBwdHJzXG4iKTsKKwkJZ290byBmYWlsX3JzcF9tYXA7CisJfQorCXNldF9iaXQoMCwgaGEtPnJzcF9xaWRfbWFwKTsKKwlzZXRfYml0KDAsIGhhLT5yZXFfcWlkX21hcCk7CisJcmV0dXJuIDE7CisKK2ZhaWxfcnNwX21hcDoKKwlrZnJlZShoYS0+cmVxX3FfbWFwKTsKKwloYS0+cmVxX3FfbWFwID0gTlVMTDsKK2ZhaWxfcmVxX21hcDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcWxhMngwMF9mcmVlX3F1ZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxLAorCXN0cnVjdCByc3BfcXVlICpyc3ApCit7CisJaWYgKHJzcCAmJiByc3AtPnJpbmcpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkocnNwLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKKwkJcnNwLT5yaW5nLCByc3AtPmRtYSk7CisKKwlrZnJlZShyc3ApOworCXJzcCA9IE5VTEw7CisJaWYgKHJlcSAmJiByZXEtPnJpbmcpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkocmVxLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLAorCQlyZXEtPnJpbmcsIHJlcS0+ZG1hKTsKKworCWtmcmVlKHJlcSk7CisJcmVxID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcWxhMngwMF9mcmVlX3F1ZXVlcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQoreworCXN0cnVjdCByZXFfcXVlICpyZXE7CisJc3RydWN0IHJzcF9xdWUgKnJzcDsKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+bWF4X3F1ZXVlczsgY250KyspIHsKKwkJcnNwID0gaGEtPnJzcF9xX21hcFtjbnRdOworCQlyZXEgPSBoYS0+cmVxX3FfbWFwW2NudF07CisJCXFsYTJ4MDBfZnJlZV9xdWUoaGEsIHJlcSwgcnNwKTsKKwl9CisJa2ZyZWUoaGEtPnJzcF9xX21hcCk7CisJaGEtPnJzcF9xX21hcCA9IE5VTEw7CisKKwlrZnJlZShoYS0+cmVxX3FfbWFwKTsKKwloYS0+cmVxX3FfbWFwID0gTlVMTDsKK30KIAogc3RhdGljIGNoYXIgKgotcWxhMngwMF9wY2lfaW5mb19zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICpzdHIpCitxbGEyeDAwX3BjaV9pbmZvX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBjaGFyICpzdHIpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RhdGljIGNoYXIgKnBjaV9idXNfbW9kZXNbXSA9IHsKIAkJIjMzIiwgIjY2IiwgIjEwMCIsICIxMzMiLAogCX07CkBAIC0yNDAsOSArMzExLDEwIEBACiB9CiAKIHN0YXRpYyBjaGFyICoKLXFsYTI0eHhfcGNpX2luZm9fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqc3RyKQorcWxhMjR4eF9wY2lfaW5mb19zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgY2hhciAqc3RyKQogewogCXN0YXRpYyBjaGFyICpwY2lfYnVzX21vZGVzW10gPSB7ICIzMyIsICI2NiIsICIxMDAiLCAiMTMzIiwgfTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MzJfdCBwY2lfYnVzOwogCWludCBwY2llX3JlZzsKIApAQCAtMjkwLDkgKzM2MiwxMCBAQAogfQogCiBzdGF0aWMgY2hhciAqCi1xbGEyeDAwX2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqc3RyKQorcWxhMngwMF9md192ZXJzaW9uX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBjaGFyICpzdHIpCiB7CiAJY2hhciB1bl9zdHJbMTBdOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJc3ByaW50ZihzdHIsICIlZC4lMDJkLiUwMmQgIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCiAJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLApAQCAtMzI4LDggKzQwMSw5IEBACiB9CiAKIHN0YXRpYyBjaGFyICoKLXFsYTI0eHhfZndfdmVyc2lvbl9zdHIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICpzdHIpCitxbGEyNHh4X2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGNoYXIgKnN0cikKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzcHJpbnRmKHN0ciwgIiVkLiUwMmQuJTAyZCAiLCBoYS0+ZndfbWFqb3JfdmVyc2lvbiwKIAkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sCiAJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKQEAgLTM1NCwxOCArNDI4LDIwIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgc3JiX3QgKgotcWxhMngwMF9nZXRfbmV3X3NwKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LAorcWxhMngwMF9nZXRfbmV3X3NwKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCXNyYl90ICpzcDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCXNwID0gbWVtcG9vbF9hbGxvYyhoYS0+c3JiX21lbXBvb2wsIEdGUF9BVE9NSUMpOwogCWlmICghc3ApCiAJCXJldHVybiBzcDsKIAotCXNwLT5oYSA9IGhhOworCXNwLT52aGEgPSB2aGE7CiAJc3AtPmZjcG9ydCA9IGZjcG9ydDsKIAlzcC0+Y21kID0gY21kOworCXNwLT5xdWUgPSBoYS0+cmVxX3FfbWFwWzBdOwogCXNwLT5mbGFncyA9IDA7CiAJQ01EX1NQKGNtZCkgPSAodm9pZCAqKXNwOwogCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKQEAgLTM3Niw5ICs0NTIsMTAgQEAKIHN0YXRpYyBpbnQKIHFsYTJ4MDBfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CiAJZmNfcG9ydF90ICpmY3BvcnQgPSAoc3RydWN0IGZjX3BvcnQgKikgY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KGNtZC0+ZGV2aWNlKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3JiX3QgKnNwOwogCWludCBydmFsOwogCkBAIC0zOTksMzMgKzQ3NiwzMyBAQAogCiAJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9ERUFEIHx8Ci0JCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgeworCQkgICAgYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CiAJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQkJZ290byBxY19mYWlsX2NvbW1hbmQ7CiAJCX0KIAkJZ290byBxY190YXJnZXRfYnVzeTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKHZoYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAotCXNwID0gcWxhMngwMF9nZXRfbmV3X3NwKGhhLCBmY3BvcnQsIGNtZCwgZG9uZSk7CisJc3AgPSBxbGEyeDAwX2dldF9uZXdfc3AodmhhLCBmY3BvcnQsIGNtZCwgZG9uZSk7CiAJaWYgKCFzcCkKIAkJZ290byBxY19ob3N0X2J1c3lfbG9jazsKIAotCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3Njc2koc3ApOworCXJ2YWwgPSBoYS0+aXNwX29wcy0+c3RhcnRfc2NzaShzcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gcWNfaG9zdF9idXN5X2ZyZWVfc3A7CiAKLQlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCXNwaW5fbG9ja19pcnEodmhhLT5ob3N0LT5ob3N0X2xvY2spOwogCiAJcmV0dXJuIDA7CiAKIHFjX2hvc3RfYnVzeV9mcmVlX3NwOgotCXFsYTJ4MDBfc3BfZnJlZV9kbWEoaGEsIHNwKTsKKwlxbGEyeDAwX3NwX2ZyZWVfZG1hKHNwKTsKIAltZW1wb29sX2ZyZWUoc3AsIGhhLT5zcmJfbWVtcG9vbCk7CiAKIHFjX2hvc3RfYnVzeV9sb2NrOgotCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycSh2aGEtPmhvc3QtPmhvc3RfbG9jayk7CiAJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CiAKIHFjX3RhcmdldF9idXN5OgpAQCAtNDQxLDE0ICs1MTgsMTUgQEAKIHN0YXRpYyBpbnQKIHFsYTI0eHhfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CiAJZmNfcG9ydF90ICpmY3BvcnQgPSAoc3RydWN0IGZjX3BvcnQgKikgY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KGNtZC0+ZGV2aWNlKSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAlzcmJfdCAqc3A7CiAJaW50IHJ2YWw7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKIAotCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKHBoYS0+cGRldikpKSB7CisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkgewogCQljbWQtPnJlc3VsdCA9IERJRF9SRVFVRVVFIDw8IDE2OwogCQlnb3RvIHFjMjRfZmFpbF9jb21tYW5kOwogCX0KQEAgLTQ2NSwzMyArNTQzLDMzIEBACiAKIAlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQgfHwKLQkJICAgIGF0b21pY19yZWFkKCZwaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgeworCQkgICAgYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKIAkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCQlnb3RvIHFjMjRfZmFpbF9jb21tYW5kOwogCQl9CiAJCWdvdG8gcWMyNF90YXJnZXRfYnVzeTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKHZoYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAotCXNwID0gcWxhMngwMF9nZXRfbmV3X3NwKHBoYSwgZmNwb3J0LCBjbWQsIGRvbmUpOworCXNwID0gcWxhMngwMF9nZXRfbmV3X3NwKGJhc2VfdmhhLCBmY3BvcnQsIGNtZCwgZG9uZSk7CiAJaWYgKCFzcCkKIAkJZ290byBxYzI0X2hvc3RfYnVzeV9sb2NrOwogCi0JcnZhbCA9IHFsYTI0eHhfc3RhcnRfc2NzaShzcCk7CisJcnZhbCA9IGhhLT5pc3Bfb3BzLT5zdGFydF9zY3NpKHNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBxYzI0X2hvc3RfYnVzeV9mcmVlX3NwOwogCi0Jc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKHZoYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAogCXJldHVybiAwOwogCiBxYzI0X2hvc3RfYnVzeV9mcmVlX3NwOgotCXFsYTJ4MDBfc3BfZnJlZV9kbWEocGhhLCBzcCk7Ci0JbWVtcG9vbF9mcmVlKHNwLCBwaGEtPnNyYl9tZW1wb29sKTsKKwlxbGEyeDAwX3NwX2ZyZWVfZG1hKHNwKTsKKwltZW1wb29sX2ZyZWUoc3AsIGhhLT5zcmJfbWVtcG9vbCk7CiAKIHFjMjRfaG9zdF9idXN5X2xvY2s6Ci0Jc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKHZoYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAogcWMyNF90YXJnZXRfYnVzeToKQEAgLTUxMCwxNyArNTg4LDE0IEBACiAgKiAgICBtYXggdGltZS4KICAqCiAgKiBJbnB1dDoKLSAqICAgIGhhID0gYWN0dWFsIGhhIHdob3NlIGRvbmUgcXVldWUgd2lsbCBjb250YWluIHRoZSBjb21tYW5kCi0gKgkgICAgICByZXR1cm5lZCBieSBmaXJtd2FyZS4KICAqICAgIGNtZCA9IFNjc2kgQ29tbWFuZCB0byB3YWl0IG9uLgotICogICAgZmxhZyA9IEFib3J0L1Jlc2V0KEJ1cyBvciBEZXZpY2UgUmVzZXQpCiAgKgogICogUmV0dXJuOgogICogICAgTm90IEZvdW5kIDogMAogICogICAgRm91bmQgOiAxCiAgKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3FsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKICNkZWZpbmUgQUJPUlRfUE9MTElOR19QRVJJT0QJMTAwMAogI2RlZmluZSBBQk9SVF9XQUlUX0lURVIJCSgoMTAgKiAxMDAwKSAvIChBQk9SVF9QT0xMSU5HX1BFUklPRCkpCkBAIC01NTcsMjEgKzYzMiwyMiBAQAogICogICAgRmFpbGVkICAoQWRhcHRlciBpcyBvZmZsaW5lL2Rpc2FibGVkKSA6IDEKICAqLwogaW50Ci1xbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlpbnQJCXJldHVybl9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZwl3YWl0X29ubGluZTsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJd2FpdF9vbmxpbmUgPSBqaWZmaWVzICsgKE1BWF9MT09QX1RJTUVPVVQgKiBIWik7Ci0Jd2hpbGUgKCgodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnBoYS0+ZHBjX2ZsYWdzKSkgfHwKLQkgICAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnBoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZwaGEtPmRwY19mbGFncykgfHwKLQkgICAgcGhhLT5kcGNfYWN0aXZlKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X29ubGluZSkpIHsKKwl3aGlsZSAoKCh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncykpIHx8CisJICAgIHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICBoYS0+ZHBjX2FjdGl2ZSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgd2FpdF9vbmxpbmUpKSB7CiAKIAkJbXNsZWVwKDEwMDApOwogCX0KLQlpZiAocGhhLT5mbGFncy5vbmxpbmUpCisJaWYgKGJhc2VfdmhhLT5mbGFncy5vbmxpbmUpCiAJCXJldHVybl9zdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAllbHNlCiAJCXJldHVybl9zdGF0dXMgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtNTk2LDE5ICs2NzIsMjAgQEAKICAqICAgIEZhaWxlZCAgKExPT1BfTk9UX1JFQURZKSA6IDEKICAqLwogc3RhdGljIGlubGluZSBpbnQKLXFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCWludCAJIHJldHVybl9zdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAl1bnNpZ25lZCBsb25nIGxvb3BfdGltZW91dCA7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCS8qIHdhaXQgZm9yIDUgbWluIGF0IHRoZSBtYXggZm9yIGxvb3AgdG8gYmUgcmVhZHkgKi8KIAlsb29wX3RpbWVvdXQgPSBqaWZmaWVzICsgKE1BWF9MT09QX1RJTUVPVVQgKiBIWik7CiAKLQl3aGlsZSAoKCFhdG9taWNfcmVhZCgmcGhhLT5sb29wX2Rvd25fdGltZXIpICYmCi0JICAgIGF0b21pY19yZWFkKCZwaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTikgfHwKLQkgICAgYXRvbWljX3JlYWQoJnBoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9SRUFEWSkgewotCQlpZiAoYXRvbWljX3JlYWQoJnBoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJd2hpbGUgKCghYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJICAgIGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSB8fAorCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfUkVBRFkpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CiAJCQlyZXR1cm5fc3RhdHVzID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC02MjQsMzUgKzcwMSw0MiBAQAogdm9pZAogcWxhMngwMF9hYm9ydF9mY3BvcnRfY21kcyhmY19wb3J0X3QgKmZjcG9ydCkKIHsKLQlpbnQgY250OworCWludCBjbnQsIHF1ZSwgaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcmJfdCAqc3A7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IGZjcG9ydC0+aGE7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IGZjcG9ydC0+dmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXE7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKSB7Ci0JCXNwID0gcGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07Ci0JCWlmICghc3ApCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZm9yIChxdWUgPSAwOyBxdWUgPCBRTEFfTUFYX0hPU1RfUVVFUzsgcXVlKyspIHsKKwkJaWQgPSB2aGEtPnJlcV9xdWVzW3F1ZV07CisJCXJlcSA9IGhhLT5yZXFfcV9tYXBbaWRdOworCQlpZiAoIXJlcSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoc3AtPmZjcG9ydCAhPSBmY3BvcnQpCi0JCQljb250aW51ZTsKKwkJZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKSB7CisJCQlzcCA9IHJlcS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOworCQkJaWYgKCFzcCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzcC0+ZmNwb3J0ICE9IGZjcG9ydCkKKwkJCQljb250aW51ZTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGhhLT5pc3Bfb3BzLT5hYm9ydF9jb21tYW5kKGhhLCBzcCkpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIkFib3J0IGZhaWxlZCAtLSAgJWx4XG4iLCBzcC0+Y21kLT5zZXJpYWxfbnVtYmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocWxhMngwMF9laF93YWl0X29uX2NvbW1hbmQoaGEsIHNwLT5jbWQpICE9Ci0JCQkgICAgUUxBX1NVQ0NFU1MpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQkJaWYgKGhhLT5pc3Bfb3BzLT5hYm9ydF9jb21tYW5kKHZoYSwgc3AsIHJlcSkpIHsKIAkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiQWJvcnQgZmFpbGVkIHdoaWxlIHdhaXRpbmcgLS0gICVseFxuIiwKLQkJCQkgICAgc3AtPmNtZC0+c2VyaWFsX251bWJlcikpOwotCisJCQkJIkFib3J0IGZhaWxlZCAtLSAgJWx4XG4iLAorCQkJCXNwLT5jbWQtPnNlcmlhbF9udW1iZXIpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKHNwLT5jbWQpICE9CisJCQkJCVFMQV9TVUNDRVNTKQorCQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCQkiQWJvcnQgZmFpbGVkIHdoaWxlIHdhaXRpbmcgLS0gICVseFxuIiwKKwkJCQkJc3AtPmNtZC0+c2VyaWFsX251bWJlcikpOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjkwLDE0ICs3NzQsMTYgQEAKIHN0YXRpYyBpbnQKIHFsYTJ4eHhfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCXNyYl90ICpzcDsKIAlpbnQgcmV0LCBpOwogCXVuc2lnbmVkIGludCBpZCwgbHVuOwogCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHdhaXQgPSAwOwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKKwlzcmJfdCAqc3B0OwogCiAJcWxhMngwMF9ibG9ja19lcnJvcl9oYW5kbGVyKGNtZCk7CiAKQEAgLTcwOSwxMSArNzk1LDE1IEBACiAJaWQgPSBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKIAlzZXJpYWwgPSBjbWQtPnNlcmlhbF9udW1iZXI7CisJc3B0ID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCWlmICghc3B0KQorCQlyZXR1cm4gU1VDQ0VTUzsKKwlyZXEgPSBzcHQtPnF1ZTsKIAogCS8qIENoZWNrIGFjdGl2ZSBsaXN0IGZvciBjb21tYW5kIGNvbW1hbmQuICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDE7IGkgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGkrKykgewotCQlzcCA9IHBoYS0+b3V0c3RhbmRpbmdfY21kc1tpXTsKKwkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbaV07CiAKIAkJaWYgKHNwID09IE5VTEwpCiAJCQljb250aW51ZTsKQEAgLTcyMSwzOCArODExLDM2IEBACiAJCWlmIChzcC0+Y21kICE9IGNtZCkKIAkJCWNvbnRpbnVlOwogCi0JCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGFib3J0aW5nIHNwICVwIGZyb20gUklTQy4gcGlkPSVsZC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHNwLCBzZXJpYWwpKTsKKwkJREVCVUcyKHByaW50aygiJXMoJWxkKTogYWJvcnRpbmcgc3AgJXAgZnJvbSBSSVNDLiIKKwkJIiBwaWQ9JWxkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgc3AsIHNlcmlhbCkpOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQoaGEsIHNwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQodmhhLCBzcCwgcmVxKSkgewogCQkJREVCVUcyKHByaW50aygiJXMoJWxkKTogYWJvcnRfY29tbWFuZCAiCi0JCQkgICAgIm1ieCBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKLQkJCXJldCA9IEZBSUxFRDsKKwkJCSJtYnggZmFpbGVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQl9IGVsc2UgewogCQkJREVCVUczKHByaW50aygiJXMoJWxkKTogYWJvcnRfY29tbWFuZCAiCi0JCQkgICAgIm1ieCBzdWNjZXNzLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQkibWJ4IHN1Y2Nlc3MuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCQl3YWl0ID0gMTsKIAkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQuICovCiAJaWYgKHdhaXQpIHsKLQkJaWYgKHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKGhhLCBjbWQpICE9IFFMQV9TVUNDRVNTKSB7CisJCWlmIChxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChjbWQpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKIAkJCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBBYm9ydCBoYW5kbGVyIHRpbWVkIG91dCAtLSAlbHggIgotCQkJICAgICIleC5cbiIsIGhhLT5ob3N0X25vLCBpZCwgbHVuLCBzZXJpYWwsIHJldCk7CisJCQkgICAgIiV4LlxuIiwgdmhhLT5ob3N0X25vLCBpZCwgbHVuLCBzZXJpYWwsIHJldCk7CiAJCQlyZXQgPSBGQUlMRUQ7CiAJCX0KIAl9CiAKIAlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJICAgICJzY3NpKCVsZDolZDolZCk6IEFib3J0IGNvbW1hbmQgaXNzdWVkIC0tICVkICVseCAleC5cbiIsCi0JICAgIGhhLT5ob3N0X25vLCBpZCwgbHVuLCB3YWl0LCBzZXJpYWwsIHJldCk7CisJICAgIHZoYS0+aG9zdF9ubywgaWQsIGx1biwgd2FpdCwgc2VyaWFsLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc2NCwyMyArODUyLDI3IEBACiB9OwogCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdW5zaWduZWQgaW50IHQsCi0gICAgdW5zaWduZWQgaW50IGwsIGVudW0gbmV4dXNfd2FpdF90eXBlIHR5cGUpCitxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVuc2lnbmVkIGludCB0LAorCXVuc2lnbmVkIGludCBsLCBzcmJfdCAqc3AsIGVudW0gbmV4dXNfd2FpdF90eXBlIHR5cGUpCiB7CiAJaW50IGNudCwgbWF0Y2gsIHN0YXR1czsKLQlzcmJfdCAqc3A7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXE7CiAKIAlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JZm9yIChjbnQgPSAxOyBzdGF0dXMgPT0gUUxBX1NVQ0NFU1MgJiYgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOwotCSAgICBjbnQrKykgewotCQlzcCA9IHBoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOworCWlmICghc3ApCisJCXJldHVybiBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlyZXEgPSBzcC0+cXVlOworCWZvciAoY250ID0gMTsgc3RhdHVzID09IFFMQV9TVUNDRVNTICYmCisJCWNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKKwkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XTsKIAkJaWYgKCFzcCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChoYS0+dnBfaWR4ICE9IHNwLT5mY3BvcnQtPmhhLT52cF9pZHgpCisJCWlmICh2aGEtPnZwX2lkeCAhPSBzcC0+ZmNwb3J0LT52aGEtPnZwX2lkeCkKIAkJCWNvbnRpbnVlOwogCQltYXRjaCA9IDA7CiAJCXN3aXRjaCAodHlwZSkgewpAQCAtNzkyLDE3ICs4ODQsMTcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFdBSVRfTFVOOgogCQkJbWF0Y2ggPSAoc3AtPmNtZC0+ZGV2aWNlLT5pZCA9PSB0ICYmCi0JCQkgICAgc3AtPmNtZC0+ZGV2aWNlLT5sdW4gPT0gbCk7CisJCQkJc3AtPmNtZC0+ZGV2aWNlLT5sdW4gPT0gbCk7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoIW1hdGNoKQogCQkJY29udGludWU7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JCXN0YXR1cyA9IHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKGhhLCBzcC0+Y21kKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlzdGF0dXMgPSBxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChzcC0+Y21kKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtODE4LDcgKzkxMCw3IEBACiBfX3FsYTJ4eHhfZWhfZ2VuZXJpY19yZXNldChjaGFyICpuYW1lLCBlbnVtIG5leHVzX3dhaXRfdHlwZSB0eXBlLAogICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50ICgqZG9fcmVzZXQpKHN0cnVjdCBmY19wb3J0ICosIHVuc2lnbmVkIGludCkpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CiAJZmNfcG9ydF90ICpmY3BvcnQgPSAoc3RydWN0IGZjX3BvcnQgKikgY21kLT5kZXZpY2UtPmhvc3RkYXRhOwogCWludCBlcnI7CiAKQEAgLTgyNywzMSArOTE5LDMxIEBACiAJaWYgKCFmY3BvcnQpCiAJCXJldHVybiBGQUlMRUQ7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIElTU1VFRC5cbiIsCi0JICAgIGhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIG5hbWUpOworCXFsYV9wcmludGsoS0VSTl9JTkZPLCB2aGEtPmh3LCAic2NzaSglbGQ6JWQ6JWQpOiAlcyBSRVNFVCBJU1NVRUQuXG4iLAorCSAgICB2aGEtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgbmFtZSk7CiAKIAllcnIgPSAwOwotCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKQorCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBlaF9yZXNldF9mYWlsZWQ7CiAJZXJyID0gMTsKLQlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKSAhPSBRTEFfU1VDQ0VTUykKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSkgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOwogCWVyciA9IDI7CiAJaWYgKGRvX3Jlc2V0KGZjcG9ydCwgY21kLT5kZXZpY2UtPmx1bikgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOwogCWVyciA9IDM7Ci0JaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyhoYSwgY21kLT5kZXZpY2UtPmlkLAotCSAgICBjbWQtPmRldmljZS0+bHVuLCB0eXBlKSAhPSBRTEFfU1VDQ0VTUykKKwlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgY21kLT5kZXZpY2UtPmlkLAorCSAgICBjbWQtPmRldmljZS0+bHVuLCAoc3JiX3QgKikgQ01EX1NQKGNtZCksIHR5cGUpICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGVoX3Jlc2V0X2ZhaWxlZDsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgU1VDQ0VFREVELlxuIiwKLQkgICAgaGEtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgbmFtZSk7CisJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIFNVQ0NFRURFRC5cbiIsCisJICAgIHZoYS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBuYW1lKTsKIAogCXJldHVybiBTVUNDRVNTOwogCiAgZWhfcmVzZXRfZmFpbGVkOgotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgRkFJTEVEOiAlcy5cbiIsCi0JICAgIGhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIG5hbWUsCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIEZBSUxFRDogJXMuXG4iCisJICAgICwgdmhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIG5hbWUsCiAJICAgIHJlc2V0X2Vycm9yc1tlcnJdKTsKIAlyZXR1cm4gRkFJTEVEOwogfQpAQCAtODU5LDcgKzk1MSw4IEBACiBzdGF0aWMgaW50CiBxbGEyeHh4X2VoX2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlyZXR1cm4gX19xbGEyeHh4X2VoX2dlbmVyaWNfcmVzZXQoIkRFVklDRSIsIFdBSVRfTFVOLCBjbWQsCiAJICAgIGhhLT5pc3Bfb3BzLT5sdW5fcmVzZXQpOwpAQCAtODY4LDcgKzk2MSw4IEBACiBzdGF0aWMgaW50CiBxbGEyeHh4X2VoX3RhcmdldF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlyZXR1cm4gX19xbGEyeHh4X2VoX2dlbmVyaWNfcmVzZXQoIlRBUkdFVCIsIFdBSVRfVEFSR0VULCBjbWQsCiAJICAgIGhhLT5pc3Bfb3BzLT50YXJnZXRfcmVzZXQpOwpAQCAtODkyLDEyICs5ODYsMTIgQEAKIHN0YXRpYyBpbnQKIHFsYTJ4eHhfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7Ci0Jc2NzaV9xbGFfaG9zdF90ICpwaGEgPSB0b19xbGFfcGFyZW50KGhhKTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCWZjX3BvcnRfdCAqZmNwb3J0ID0gKHN0cnVjdCBmY19wb3J0ICopIGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAlpbnQgcmV0ID0gRkFJTEVEOwogCXVuc2lnbmVkIGludCBpZCwgbHVuOwogCXVuc2lnbmVkIGxvbmcgc2VyaWFsOworCXNyYl90ICpzcCA9IChzcmJfdCAqKSBDTURfU1AoY21kKTsKIAogCXFsYTJ4MDBfYmxvY2tfZXJyb3JfaGFuZGxlcihjbWQpOwogCkBAIC05MDgsMjggKzEwMDIsMjggQEAKIAlpZiAoIWZjcG9ydCkKIAkJcmV0dXJuIHJldDsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgInNjc2koJWxkOiVkOiVkKTogTE9PUCBSRVNFVCBJU1NVRUQuXG4iLCBoYS0+aG9zdF9ubywgaWQsIGx1bik7CisJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsCisJICAgICJzY3NpKCVsZDolZDolZCk6IEJVUyBSRVNFVCBJU1NVRUQuXG4iLCB2aGEtPmhvc3Rfbm8sIGlkLCBsdW4pOwogCi0JaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZShoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyKHByaW50aygiJXMgZmFpbGVkOmJvYXJkIGRpc2FibGVkXG4iLF9fZnVuY19fKSk7CiAJCWdvdG8gZWhfYnVzX3Jlc2V0X2RvbmU7CiAJfQogCi0JaWYgKHFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeShoYSkgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJaWYgKHFsYTJ4MDBfbG9vcF9yZXNldChoYSkgPT0gUUxBX1NVQ0NFU1MpCisJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeSh2aGEpID09IFFMQV9TVUNDRVNTKSB7CisJCWlmIChxbGEyeDAwX2xvb3BfcmVzZXQodmhhKSA9PSBRTEFfU1VDQ0VTUykKIAkJCXJldCA9IFNVQ0NFU1M7CiAJfQogCWlmIChyZXQgPT0gRkFJTEVEKQogCQlnb3RvIGVoX2J1c19yZXNldF9kb25lOwogCiAJLyogRmx1c2ggb3V0c3RhbmRpbmcgY29tbWFuZHMuICovCi0JaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyhwaGEsIDAsIDAsIFdBSVRfSE9TVCkgIT0KKwlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwgc3AsIFdBSVRfSE9TVCkgIT0KIAkgICAgUUxBX1NVQ0NFU1MpCiAJCXJldCA9IEZBSUxFRDsKIAogZWhfYnVzX3Jlc2V0X2RvbmU6Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlc2V0ICVzXG4iLCBfX2Z1bmNfXywKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgIiVzOiByZXNldCAlc1xuIiwgX19mdW5jX18sCiAJICAgIChyZXQgPT0gRkFJTEVEKSA/ICJmYWlsZWQiIDogInN1Y2NlZGVkIik7CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTUzLDEyICsxMDQ3LDE0IEBACiBzdGF0aWMgaW50CiBxbGEyeHh4X2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCWZjX3BvcnRfdCAqZmNwb3J0ID0gKHN0cnVjdCBmY19wb3J0ICopIGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcmV0ID0gRkFJTEVEOwogCXVuc2lnbmVkIGludCBpZCwgbHVuOwogCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7CisJc3JiX3QgKnNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcWxhMngwMF9ibG9ja19lcnJvcl9oYW5kbGVyKGNtZCk7CiAKQEAgLTk3MCw5ICsxMDY2LDkgQEAKIAkJcmV0dXJuIHJldDsKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgInNjc2koJWxkOiVkOiVkKTogQURBUFRFUiBSRVNFVCBJU1NVRUQuXG4iLCBoYS0+aG9zdF9ubywgaWQsIGx1bik7CisJICAgICJzY3NpKCVsZDolZDolZCk6IEFEQVBURVIgUkVTRVQgSVNTVUVELlxuIiwgdmhhLT5ob3N0X25vLCBpZCwgbHVuKTsKIAotCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKQorCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBlaF9ob3N0X3Jlc2V0X2xvY2s7CiAKIAkvKgpAQCAtOTgzLDI2ICsxMDc5LDI4IEBACiAJICogZGV2aWNlcyBhcyBsb3N0IGtpY2tpbmcgb2YgdGhlIHBvcnRfZG93bl90aW1lcgogCSAqIHdoaWxlIGRwYyBpcyBzdHVjayBmb3IgdGhlIG1haWxib3ggdG8gY29tcGxldGUuCiAJICovCi0JcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKTsKLQlzZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZwaGEtPmRwY19mbGFncyk7Ci0JaWYgKHFsYTJ4MDBfYWJvcnRfaXNwKHBoYSkpIHsKLQkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZwaGEtPmRwY19mbGFncyk7Ci0JCS8qIGZhaWxlZC4gc2NoZWR1bGUgZHBjIHRvIHRyeSAqLwotCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZwaGEtPmRwY19mbGFncyk7Ci0KLQkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZShoYSkgIT0gUUxBX1NVQ0NFU1MpCisJcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSk7CisJaWYgKHZoYSAhPSBiYXNlX3ZoYSkgeworCQlpZiAocWxhMngwMF92cF9hYm9ydF9pc3AodmhhKSkKIAkJCWdvdG8gZWhfaG9zdF9yZXNldF9sb2NrOworCX0gZWxzZSB7CisJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOworCQlpZiAocWxhMngwMF9hYm9ydF9pc3AoYmFzZV92aGEpKSB7CisJCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOworCQkJLyogZmFpbGVkLiBzY2hlZHVsZSBkcGMgdG8gdHJ5ICovCisJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKKworCQkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKQorCQkJCWdvdG8gZWhfaG9zdF9yZXNldF9sb2NrOworCQl9CisJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJfQotCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmcGhhLT5kcGNfZmxhZ3MpOwogCi0JLyogV2FpdGluZyBmb3Igb3VyIGNvbW1hbmQgaW4gZG9uZV9xdWV1ZSB0byBiZSByZXR1cm5lZCB0byBPUy4qLwotCWlmIChxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMocGhhLCAwLCAwLCBXQUlUX0hPU1QpID09Ci0JICAgIFFMQV9TVUNDRVNTKQorCS8qIFdhaXRpbmcgZm9yIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQgdG8gT1MuKi8KKwlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwgc3AsIFdBSVRfSE9TVCkgPT0KKwkJUUxBX1NVQ0NFU1MpCiAJCXJldCA9IFNVQ0NFU1M7CiAKLQlpZiAoaGEtPnBhcmVudCkKLQkJcWxhMngwMF92cF9hYm9ydF9pc3AoaGEpOwotCiBlaF9ob3N0X3Jlc2V0X2xvY2s6CiAJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlc2V0ICVzXG4iLCBfX2Z1bmNfXywKIAkgICAgKHJldCA9PSBGQUlMRUQpID8gImZhaWxlZCIgOiAic3VjY2VkZWQiKTsKQEAgLTEwMjEsMzUgKzExMTksMzYgQEAKICogICAgICAwID0gc3VjY2VzcwogKi8KIGludAotcWxhMngwMF9sb29wX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2xvb3BfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZmNfcG9ydCAqZmNwb3J0OworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JaWYgKGhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4pIHsKLQkJcmV0ID0gcWxhMngwMF9mdWxsX2xvZ2luX2xpcChoYSk7CisJaWYgKGhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4gJiYgIXZoYS0+dnBfaWR4KSB7CisJCXJldCA9IHFsYTJ4MDBfZnVsbF9sb2dpbl9saXAodmhhKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBidXNfcmVzZXQgZmFpbGVkOiAiCi0JCQkgICAgImZ1bGxfbG9naW5fbGlwPSVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAorCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ6ICIKKwkJCSAgICAiZnVsbF9sb2dpbl9saXA9JWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAogCQkJICAgIHJldCkpOwogCQl9Ci0JCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwotCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7Ci0JCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhLCAwKTsKLQkJcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKTsKKwkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdCh2aGEsIDApOworCQlxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKTsKIAl9CiAKLQlpZiAoaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQpIHsKLQkJcmV0ID0gcWxhMngwMF9saXBfcmVzZXQoaGEpOworCWlmIChoYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCAmJiAhdmhhLT52cF9pZHgpIHsKKwkJcmV0ID0gcWxhMngwMF9saXBfcmVzZXQodmhhKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBidXNfcmVzZXQgZmFpbGVkOiAiCi0JCQkgICAgImxpcF9yZXNldD0lZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcmV0KSk7Ci0JCX0KLQkJcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKTsKKwkJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkOiAiCisJCQkgICAgImxpcF9yZXNldD0lZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJldCkpOworCQl9IGVsc2UKKwkJCXFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeSh2aGEpOwogCX0KIAogCWlmIChoYS0+ZmxhZ3MuZW5hYmxlX3RhcmdldF9yZXNldCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CiAJCQlpZiAoZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX1RBUkdFVCkKIAkJCQljb250aW51ZTsKIApAQCAtMTA1NywzMSArMTE1NiwzNyBAQAogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogYnVzX3Jlc2V0IGZhaWxlZDogIgogCQkJCSAgICAidGFyZ2V0X3Jlc2V0PSVkIGRfaWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJCQkgICAgaGEtPmhvc3Rfbm8sIHJldCwgZmNwb3J0LT5kX2lkLmIyNCkpOworCQkJCSAgICB2aGEtPmhvc3Rfbm8sIHJldCwgZmNwb3J0LT5kX2lkLmIyNCkpOwogCQkJfQogCQl9CiAJfQotCiAJLyogSXNzdWUgbWFya2VyIGNvbW1hbmQgb25seSB3aGVuIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgSS9PICovCi0JaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCXZoYS0+bWFya2VyX25lZWRlZCA9IDE7CiAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKIHZvaWQKLXFsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IHJlcykKK3FsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCByZXMpCiB7Ci0JaW50IGNudDsKKwlpbnQgcXVlLCBjbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcmJfdCAqc3A7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWZvciAoY250ID0gMTsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgewotCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07Ci0JCWlmIChzcCkgewotCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7Ci0JCQlzcC0+Y21kLT5yZXN1bHQgPSByZXM7Ci0JCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7CisJZm9yIChxdWUgPSAwOyBxdWUgPCBRTEFfTUFYX0hPU1RfUVVFUzsgcXVlKyspIHsKKwkJcmVxID0gaGEtPnJlcV9xX21hcFt2aGEtPnJlcV9xdWVzW3F1ZV1dOworCQlpZiAoIXJlcSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKKwkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2NudF07CisJCQlpZiAoc3AgJiYgc3AtPnZoYSA9PSB2aGEpIHsKKwkJCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisJCQkJc3AtPmNtZC0+cmVzdWx0ID0gcmVzOworCQkJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKKwkJCX0KIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMTEwMywxMyArMTIwOCwxNSBAQAogc3RhdGljIGludAogcWxhMnh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KHNkZXYtPmhvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzZGV2LT5ob3N0KTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzZGV2LT5zZGV2X3RhcmdldCk7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKIAlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKLQkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgaGEtPm1heF9xX2RlcHRoKTsKKwkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgcmVxLT5tYXhfcV9kZXB0aCk7CiAJZWxzZQotCQlzY3NpX2RlYWN0aXZhdGVfdGNxKHNkZXYsIGhhLT5tYXhfcV9kZXB0aCk7CisJCXNjc2lfZGVhY3RpdmF0ZV90Y3Eoc2RldiwgcmVxLT5tYXhfcV9kZXB0aCk7CiAKIAlycG9ydC0+ZGV2X2xvc3NfdG1vID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKIApAQCAtMTE1Miw4ICsxMjU5LDkgQEAKICAqIHN1cHBvcnRlZCBhZGRyZXNzaW5nIG1ldGhvZC4KICAqLwogc3RhdGljIHZvaWQKLXFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAkvKiBBc3N1bWUgYSAzMmJpdCBETUEgbWFzay4gKi8KIAloYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPSAwOwogCkBAIC0xMTc0LDcgKzEyODIsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcWxhMngwMF9lbmFibGVfaW50cnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZW5hYmxlX2ludHJzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwpAQCAtMTE4OSw3ICsxMjk3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFsYTJ4MDBfZGlzYWJsZV9pbnRycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9kaXNhYmxlX2ludHJzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwpAQCAtMTIwMyw3ICsxMzExLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFsYTI0eHhfZW5hYmxlX2ludHJzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyNHh4X2VuYWJsZV9pbnRycyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwpAQCAtMTIxNiw3ICsxMzI0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFsYTI0eHhfZGlzYWJsZV9pbnRycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF9kaXNhYmxlX2ludHJzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CkBAIC0xMjYwLDYgKzEzNjgsMTAgQEAKIAkucmVhZF9vcHRyb20JCT0gcWxhMngwMF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhMngwMF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyeDAwX2dldF9mbGFzaF92ZXJzaW9uLAorCS5zdGFydF9zY3NpCQk9IHFsYTJ4MDBfc3RhcnRfc2NzaSwKKwkud3J0X3JlcV9yZWcJCT0gTlVMTCwKKwkud3J0X3JzcF9yZWcJCT0gTlVMTCwKKwkucmRfcmVxX3JlZwkJPSBOVUxMLAogfTsKIAogc3RhdGljIHN0cnVjdCBpc3Bfb3BlcmF0aW9ucyBxbGEyMzAwX2lzcF9vcHMgPSB7CkBAIC0xMjk0LDYgKzE0MDYsMTAgQEAKIAkucmVhZF9vcHRyb20JCT0gcWxhMngwMF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhMngwMF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyeDAwX2dldF9mbGFzaF92ZXJzaW9uLAorCS5zdGFydF9zY3NpCQk9IHFsYTJ4MDBfc3RhcnRfc2NzaSwKKwkud3J0X3JlcV9yZWcJCT0gTlVMTCwKKwkud3J0X3JzcF9yZWcJCT0gTlVMTCwKKwkucmRfcmVxX3JlZwkJPSBOVUxMLAogfTsKIAogc3RhdGljIHN0cnVjdCBpc3Bfb3BlcmF0aW9ucyBxbGEyNHh4X2lzcF9vcHMgPSB7CkBAIC0xMzI4LDYgKzE0NDQsMTAgQEAKIAkucmVhZF9vcHRyb20JCT0gcWxhMjR4eF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhMjR4eF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyNHh4X2dldF9mbGFzaF92ZXJzaW9uLAorCS5zdGFydF9zY3NpCQk9IHFsYTI0eHhfc3RhcnRfc2NzaSwKKwkud3J0X3JlcV9yZWcJCT0gcWxhMjR4eF93cnRfcmVxX3JlZywKKwkud3J0X3JzcF9yZWcJCT0gcWxhMjR4eF93cnRfcnNwX3JlZywKKwkucmRfcmVxX3JlZwkJPSBxbGEyNHh4X3JkX3JlcV9yZWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlzcF9vcGVyYXRpb25zIHFsYTI1eHhfaXNwX29wcyA9IHsKQEAgLTEzNjIsMTAgKzE0ODIsMTQgQEAKIAkucmVhZF9vcHRyb20JCT0gcWxhMjV4eF9yZWFkX29wdHJvbV9kYXRhLAogCS53cml0ZV9vcHRyb20JCT0gcWxhMjR4eF93cml0ZV9vcHRyb21fZGF0YSwKIAkuZ2V0X2ZsYXNoX3ZlcnNpb24JPSBxbGEyNHh4X2dldF9mbGFzaF92ZXJzaW9uLAorCS5zdGFydF9zY3NpCQk9IHFsYTI0eHhfc3RhcnRfc2NzaSwKKwkud3J0X3JlcV9yZWcJCT0gcWxhMjR4eF93cnRfcmVxX3JlZywKKwkud3J0X3JzcF9yZWcJCT0gcWxhMjR4eF93cnRfcnNwX3JlZywKKwkucmRfcmVxX3JlZwkJPSBxbGEyNHh4X3JkX3JlcV9yZWcsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTJ4MDBfc2V0X2lzcF9mbGFncyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9zZXRfaXNwX2ZsYWdzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJaGEtPmRldmljZV90eXBlID0gRFRfRVhURU5ERURfSURTOwogCXN3aXRjaCAoaGEtPnBkZXYtPmRldmljZSkgewpAQCAtMTQ0Nyw5ICsxNTcxLDEwIEBACiB9CiAKIHN0YXRpYyBpbnQKLXFsYTJ4MDBfaW9zcGFjZV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfaW9zcGFjZV9jb25maWcoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlyZXNvdXJjZV9zaXplX3QgcGlvOworCXVpbnQxNl90IG1zaXg7CiAKIAlpZiAocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhoYS0+cGRldiwgaGEtPmJhcnMsCiAJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUpKSB7CkBAIC0xNTAyLDYgKzE2MjcsMzAgQEAKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCisJLyogRGV0ZXJtaW5lIHF1ZXVlIHJlc291cmNlcyAqLworCWhhLT5tYXhfcXVldWVzID0gMTsKKwlpZiAocWwyeG1heHF1ZXVlcyA8PSAxIHx8ICFJU19RTEEyNVhYKGhhKSkKKwkJZ290byBtcWlvYmFzZV9leGl0OworCWhhLT5tcWlvYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAzKSwKKwkJCXBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDMpKTsKKwlpZiAoaGEtPm1xaW9iYXNlKSB7CisJCS8qIFJlYWQgTVNJWCB2ZWN0b3Igc2l6ZSBvZiB0aGUgYm9hcmQgKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFFMQV9QQ0lfTVNJWF9DT05UUk9MLCAmbXNpeCk7CisJCWhhLT5tc2l4X2NvdW50ID0gbXNpeDsKKwkJLyogTWF4IHF1ZXVlcyBhcmUgYm91bmRlZCBieSBhdmFpbGFibGUgbXNpeCB2ZWN0b3JzICovCisJCS8qIHF1ZXVlIDAgdXNlcyB0d28gbXNpeCB2ZWN0b3JzICovCisJCWlmIChoYS0+bXNpeF9jb3VudCAtIDEgPCBxbDJ4bWF4cXVldWVzKQorCQkJaGEtPm1heF9xdWV1ZXMgPSBoYS0+bXNpeF9jb3VudCAtIDE7CisJCWVsc2UgaWYgKHFsMnhtYXhxdWV1ZXMgPiBRTEFfTVFfU0laRSkKKwkJCWhhLT5tYXhfcXVldWVzID0gUUxBX01RX1NJWkU7CisJCWVsc2UKKwkJCWhhLT5tYXhfcXVldWVzID0gcWwyeG1heHF1ZXVlczsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJIk1TSS1YIHZlY3RvciBjb3VudDogJWRcbiIsIG1zaXgpOworCX0KKworbXFpb2Jhc2VfZXhpdDoKKwloYS0+bXNpeF9jb3VudCA9IGhhLT5tYXhfcXVldWVzICsgMTsKIAlyZXR1cm4gKDApOwogCiBpb3NwYWNlX2Vycm9yX2V4aXQ6CkBAIC0xNTExLDI1ICsxNjYwLDI1IEBACiBzdGF0aWMgdm9pZAogcWxhMnh4eF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoc2hvc3QpOwogCi0Jc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7Ci0Jc2V0X2JpdChSU0NOX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOwotCXNldF9iaXQoTlBJVl9DT05GSUdfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwlzZXRfYml0KFJTQ05fVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpOworCXNldF9iaXQoTlBJVl9DT05GSUdfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBxbGEyeHh4X3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KHNob3N0KTsKIAotCWlmICghaGEtPmhvc3QpCisJaWYgKCF2aGEtPmhvc3QpCiAJCXJldHVybiAxOwotCWlmICh0aW1lID4gaGEtPmxvb3BfcmVzZXRfZGVsYXkgKiBIWikKKwlpZiAodGltZSA+IHZoYS0+aHctPmxvb3BfcmVzZXRfZGVsYXkgKiBIWikKIAkJcmV0dXJuIDE7CiAKLQlyZXR1cm4gYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1JFQURZOworCXJldHVybiBhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1JFQURZOwogfQogCiAvKgpAQCAtMTU0MCwxMSArMTY4OSwxNSBAQAogewogCWludAlyZXQgPSAtRU5PREVWOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYTsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gTlVMTDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhOwogCWNoYXIgcGNpX2luZm9bMzBdOwogCWNoYXIgZndfc3RyWzMwXTsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQ7Ci0JaW50IGJhcnMsIG1lbV9vbmx5ID0gMDsKKwlpbnQgYmFycywgbWF4X2lkLCBtZW1fb25seSA9IDA7CisJdWludDE2X3QgcmVxX2xlbmd0aCA9IDAsIHJzcF9sZW5ndGggPSAwOworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOworCXN0cnVjdCByc3BfcXVlICpyc3AgPSBOVUxMOwogCiAJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfSU8pOwogCXNodCA9ICZxbGEyeDAwX2RyaXZlcl90ZW1wbGF0ZTsKQEAgLTE1NzAsMzMgKzE3MjMsMjQgQEAKIAkvKiBUaGlzIG1heSBmYWlsIGJ1dCB0aGF0J3Mgb2sgKi8KIAlwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCi0JaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyhzaHQsIHNpemVvZihzY3NpX3FsYV9ob3N0X3QpKTsKLQlpZiAoaG9zdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJxbGEyeHh4OiBDb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGZyb20gc2NzaSBsYXllciFcbiIpOwotCQlnb3RvIHByb2JlX2Rpc2FibGVfZGV2aWNlOworCWhhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFsYV9od19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYSkgeworCQlERUJVRyhwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhhXG4iKSk7CisJCWdvdG8gcHJvYmVfb3V0OwogCX0KKwloYS0+cGRldiA9IHBkZXY7CiAKIAkvKiBDbGVhciBvdXIgZGF0YSBhcmVhICovCi0JaGEgPSBzaG9zdF9wcml2KGhvc3QpOwotCW1lbXNldChoYSwgMCwgc2l6ZW9mKHNjc2lfcWxhX2hvc3RfdCkpOwotCi0JaGEtPnBkZXYgPSBwZGV2OwotCWhhLT5ob3N0ID0gaG9zdDsKLQloYS0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87Ci0Jc3ByaW50ZihoYS0+aG9zdF9zdHIsICIlc18lbGQiLCBRTEEyWFhYX0RSSVZFUl9OQU1FLCBoYS0+aG9zdF9ubyk7Ci0JaGEtPnBhcmVudCA9IE5VTEw7CiAJaGEtPmJhcnMgPSBiYXJzOwogCWhhLT5tZW1fb25seSA9IG1lbV9vbmx5OwogCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7CiAKIAkvKiBTZXQgSVNQLXR5cGUgaW5mb3JtYXRpb24uICovCiAJcWxhMngwMF9zZXRfaXNwX2ZsYWdzKGhhKTsKLQogCS8qIENvbmZpZ3VyZSBQQ0kgSS9PIHNwYWNlICovCiAJcmV0ID0gcWxhMngwMF9pb3NwYWNlX2NvbmZpZyhoYSk7CiAJaWYgKHJldCkKLQkJZ290byBwcm9iZV9mYWlsZWQ7CisJCWdvdG8gcHJvYmVfaHdfZmFpbGVkOwogCiAJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAogCSAgICAiRm91bmQgYW4gSVNQJTA0WCwgaXJxICVkLCBpb2Jhc2UgMHglcFxuIiwgcGRldi0+ZGV2aWNlLCBwZGV2LT5pcnEsCkBAIC0xNjA0LDk1ICsxNzQ4LDEzNyBAQAogCiAJaGEtPnByZXZfdG9wb2xvZ3kgPSAwOwogCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2YoaW5pdF9jYl90KTsKLQloYS0+bWdtdF9zdnJfbG9vcF9pZCA9IE1BTkFHRU1FTlRfU0VSVkVSICsgaGEtPnZwX2lkeDsKIAloYS0+bGlua19kYXRhX3JhdGUgPSBQT1JUX1NQRUVEX1VOS05PV047CiAJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfMjMwMDsKIAotCWhhLT5tYXhfcV9kZXB0aCA9IE1BWF9RX0RFUFRIOwotCWlmIChxbDJ4bWF4cWRlcHRoICE9IDAgJiYgcWwyeG1heHFkZXB0aCA8PSAweGZmZmZVKQotCQloYS0+bWF4X3FfZGVwdGggPSBxbDJ4bWF4cWRlcHRoOwotCiAJLyogQXNzaWduIElTUCBzcGVjaWZpYyBvcGVyYXRpb25zLiAqLworCW1heF9pZCA9IE1BWF9UQVJHRVRTXzIyMDA7CiAJaWYgKElTX1FMQTIxMDAoaGEpKSB7Ci0JCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTXzIxMDA7CisJCW1heF9pZCA9IE1BWF9UQVJHRVRTXzIxMDA7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXzIxMDA7Ci0JCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjEwMDsKLQkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIxMDA7Ci0JCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIxMDA7Ci0JCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IDMyOworCQlyZXFfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjEwMDsKKwkJcnNwX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMTAwOworCQloYS0+bWF4X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIxMDA7CiAJCWhhLT5naWRfbGlzdF9pbmZvX3NpemUgPSA0OwogCQloYS0+aXNwX29wcyA9ICZxbGEyMTAwX2lzcF9vcHM7CiAJfSBlbHNlIGlmIChJU19RTEEyMjAwKGhhKSkgewotCQlob3N0LT5tYXhfaWQgPSBNQVhfVEFSR0VUU18yMjAwOwogCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKLQkJaGEtPnJlcXVlc3RfcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yMjAwOwotCQloYS0+cmVzcG9uc2VfcV9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKLQkJaGEtPmxhc3RfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjEwMDsKKwkJcmVxX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzIyMDA7CisJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKKwkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjEwMF9pc3Bfb3BzOwogCX0gZWxzZSBpZiAoSVNfUUxBMjNYWChoYSkpIHsKLQkJaG9zdC0+bWF4X2lkID0gTUFYX1RBUkdFVFNfMjIwMDsKIAkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7Ci0JCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjIwMDsKLQkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7Ci0JCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CisJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yMjAwOworCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CisJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjMwMDsKIAkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDY7CiAJCWlmIChJU19RTEEyMzIyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKIAkJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzIzMjI7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIzMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTI0WFhfVFlQRShoYSkpIHsKLQkJaG9zdC0+bWF4X2lkID0gTUFYX1RBUkdFVFNfMjIwMDsKIAkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7Ci0JCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjRYWDsKLQkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7Ci0JCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CisJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOworCQlyc3BfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CisJCWhhLT5tYXhfbG9vcF9pZCA9IFNOU19MQVNUX0xPT1BfSURfMjMwMDsKIAkJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWlkX2luaXRfY2JfMjR4eCk7Ci0JCWhhLT5tZ210X3N2cl9sb29wX2lkID0gMTAgKyBoYS0+dnBfaWR4OwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gODsKIAkJaGEtPm9wdHJvbV9zaXplID0gT1BUUk9NX1NJWkVfMjRYWDsKKwkJaGEtPm52cmFtX25waXZfc2l6ZSA9IFFMQV9NQVhfVlBPUlRTX1FMQTI0WFg7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTI0eHhfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKSB7Ci0JCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTXzIyMDA7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwotCQloYS0+cmVxdWVzdF9xX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7Ci0JCWhhLT5yZXNwb25zZV9xX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMzAwOwotCQloYS0+bGFzdF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMzAwOworCQlyZXFfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjRYWDsKKwkJcnNwX2xlbmd0aCA9IFJFU1BPTlNFX0VOVFJZX0NOVF8yMzAwOworCQloYS0+bWF4X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CiAJCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2Yoc3RydWN0IG1pZF9pbml0X2NiXzI0eHgpOwotCQloYS0+bWdtdF9zdnJfbG9vcF9pZCA9IDEwICsgaGEtPnZwX2lkeDsKIAkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDg7CiAJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzI1WFg7CisJCWhhLT5udnJhbV9ucGl2X3NpemUgPSBRTEFfTUFYX1ZQT1JUU19RTEEyNVhYOwogCQloYS0+aXNwX29wcyA9ICZxbGEyNXh4X2lzcF9vcHM7CiAJfQotCWhvc3QtPmNhbl9xdWV1ZSA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMTI4OwogCiAJbXV0ZXhfaW5pdCgmaGEtPnZwb3J0X2xvY2spOwogCWluaXRfY29tcGxldGlvbigmaGEtPm1ieF9jbWRfY29tcCk7CiAJY29tcGxldGUoJmhhLT5tYnhfY21kX2NvbXApOwogCWluaXRfY29tcGxldGlvbigmaGEtPm1ieF9pbnRyX2NvbXApOwogCi0JSU5JVF9MSVNUX0hFQUQoJmhhLT5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaGEtPmZjcG9ydHMpOwotCUlOSVRfTElTVF9IRUFEKCZoYS0+dnBfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmhhLT53b3JrX2xpc3QpOwotCiAJc2V0X2JpdCgwLCAodW5zaWduZWQgbG9uZyAqKSBoYS0+dnBfaWR4X21hcCk7CiAKLQlxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhoYSk7Ci0JaWYgKHFsYTJ4MDBfbWVtX2FsbG9jKGhhKSkgeworCXJldCA9IHFsYTJ4MDBfbWVtX2FsbG9jKGhhLCByZXFfbGVuZ3RoLCByc3BfbGVuZ3RoLCAmcmVxLCAmcnNwKTsKKwlpZiAoIXJldCkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyXG4iKTsKIAotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwkJZ290byBwcm9iZV9od19mYWlsZWQ7CiAJfQogCi0JaWYgKHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKSkgeworCXJlcS0+bWF4X3FfZGVwdGggPSBNQVhfUV9ERVBUSDsKKwlpZiAocWwyeG1heHFkZXB0aCAhPSAwICYmIHFsMnhtYXhxZGVwdGggPD0gMHhmZmZmVSkKKwkJcmVxLT5tYXhfcV9kZXB0aCA9IHFsMnhtYXhxZGVwdGg7CisKKworCWJhc2VfdmhhID0gcWxhMngwMF9jcmVhdGVfaG9zdChzaHQsIGhhKTsKKwlpZiAoIWJhc2VfdmhhKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJbRVJST1JdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNjc2lfaG9zdFxuIik7CisKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBwcm9iZV9od19mYWlsZWQ7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJhc2VfdmhhKTsKKworCXFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKGJhc2VfdmhhKTsKKworCWhvc3QgPSBiYXNlX3ZoYS0+aG9zdDsKKwliYXNlX3ZoYS0+cmVxX3F1ZXNbMF0gPSByZXEtPmlkOworCWhvc3QtPmNhbl9xdWV1ZSA9IHJlcS0+bGVuZ3RoICsgMTI4OworCWlmIChJU19RTEEyWFhYX01JRFRZUEUoaGEpKQorCQliYXNlX3ZoYS0+bWdtdF9zdnJfbG9vcF9pZCA9IDEwICsgYmFzZV92aGEtPnZwX2lkeDsKKwllbHNlCisJCWJhc2VfdmhhLT5tZ210X3N2cl9sb29wX2lkID0gTUFOQUdFTUVOVF9TRVJWRVIgKworCQkJCQkJYmFzZV92aGEtPnZwX2lkeDsKKwlpZiAoSVNfUUxBMjEwMChoYSkpCisJCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IDMyOworCWhvc3QtPm1heF9pZCA9IG1heF9pZDsKKwlob3N0LT50aGlzX2lkID0gMjU1OworCWhvc3QtPmNtZF9wZXJfbHVuID0gMzsKKwlob3N0LT51bmlxdWVfaWQgPSBob3N0LT5ob3N0X25vOworCWhvc3QtPm1heF9jbWRfbGVuID0gTUFYX0NNRFNaOworCWhvc3QtPm1heF9jaGFubmVsID0gTUFYX0JVU0VTIC0gMTsKKwlob3N0LT5tYXhfbHVuID0gTUFYX0xVTlM7CisJaG9zdC0+dHJhbnNwb3J0dCA9IHFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJLyogU2V0IHVwIHRoZSBpcnFzICovCisJcmV0ID0gcWxhMngwMF9yZXF1ZXN0X2lycXMoaGEsIHJzcCk7CisJaWYgKHJldCkKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisKKwkvKiBBbGxvYyBhcnJheXMgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmluZyBwdHJzICovCisJaWYgKCFxbGEyeDAwX2FsbG9jX3F1ZXVlcyhoYSkpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZSIKKwkJIiBwb2ludGVyc1xuIik7CisJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKwloYS0+cnNwX3FfbWFwWzBdID0gcnNwOworCWhhLT5yZXFfcV9tYXBbMF0gPSByZXE7CisKKwlpZiAoaGEtPm1xZW5hYmxlKSB7CisJCWhhLT5pc3Bfb3BzLT53cnRfcmVxX3JlZyA9IHFsYTI1eHhfd3J0X3JlcV9yZWc7CisJCWhhLT5pc3Bfb3BzLT53cnRfcnNwX3JlZyA9IHFsYTI1eHhfd3J0X3JzcF9yZWc7CisJCWhhLT5pc3Bfb3BzLT5yZF9yZXFfcmVnID0gcWxhMjV4eF9yZF9yZXFfcmVnOworCX0KKworCWlmIChxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlcihiYXNlX3ZoYSkpIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXJcbiIpOwogCiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlciAtICIKIAkJICAgICJBZGFwdGVyIGZsYWdzICV4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBoYS0+ZGV2aWNlX2ZsYWdzKSk7CisJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgYmFzZV92aGEtPmRldmljZV9mbGFncykpOwogCiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gcHJvYmVfZmFpbGVkOwpAQCAtMTcwMiw3ICsxODg4LDcgQEAKIAkgKiBTdGFydHVwIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgYWRhcHRlcgogCSAqLwogCWhhLT5kcGNfdGhyZWFkID0ga3RocmVhZF9jcmVhdGUocWxhMngwMF9kb19kcGMsIGhhLAotCQkJIiVzX2RwYyIsIGhhLT5ob3N0X3N0cik7CisJCQkiJXNfZHBjIiwgYmFzZV92aGEtPmhvc3Rfc3RyKTsKIAlpZiAoSVNfRVJSKGhhLT5kcGNfdGhyZWFkKSkgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiVW5hYmxlIHRvIHN0YXJ0IERQQyB0aHJlYWQhXG4iKTsKQEAgLTE3MTAsMjggKzE4OTYsMTcgQEAKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCi0JaG9zdC0+dGhpc19pZCA9IDI1NTsKLQlob3N0LT5jbWRfcGVyX2x1biA9IDM7Ci0JaG9zdC0+dW5pcXVlX2lkID0gaG9zdC0+aG9zdF9ubzsKLQlob3N0LT5tYXhfY21kX2xlbiA9IE1BWF9DTURTWjsKLQlob3N0LT5tYXhfY2hhbm5lbCA9IE1BWF9CVVNFUyAtIDE7Ci0JaG9zdC0+bWF4X2x1biA9IE1BWF9MVU5TOwotCWhvc3QtPnRyYW5zcG9ydHQgPSBxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZTsKLQotCXJldCA9IHFsYTJ4MDBfcmVxdWVzdF9pcnFzKGhhKTsKLQlpZiAocmV0KQotCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwlsaXN0X2FkZF90YWlsKCZiYXNlX3ZoYS0+bGlzdCwgJmhhLT52cF9saXN0KTsKKwliYXNlX3ZoYS0+aG9zdC0+aXJxID0gaGEtPnBkZXYtPmlycTsKIAogCS8qIEluaXRpYWxpemVkIHRoZSB0aW1lciAqLwotCXFsYTJ4MDBfc3RhcnRfdGltZXIoaGEsIHFsYTJ4MDBfdGltZXIsIFdBVENIX0lOVEVSVkFMKTsKKwlxbGEyeDAwX3N0YXJ0X3RpbWVyKGJhc2VfdmhhLCBxbGEyeDAwX3RpbWVyLCBXQVRDSF9JTlRFUlZBTCk7CiAKIAlERUJVRzIocHJpbnRrKCJERUJVRzogZGV0ZWN0IGhiYSAlbGQgYXQgYWRkcmVzcyA9ICVwXG4iLAotCSAgICBoYS0+aG9zdF9ubywgaGEpKTsKKwkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhKSk7CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaGEpOwotCi0JaGEtPmZsYWdzLmluaXRfZG9uZSA9IDE7Ci0JaGEtPmZsYWdzLm9ubGluZSA9IDE7CisJYmFzZV92aGEtPmZsYWdzLmluaXRfZG9uZSA9IDE7CisJYmFzZV92aGEtPmZsYWdzLm9ubGluZSA9IDE7CiAKIAlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOwogCWlmIChyZXQpCkBAIC0xNzQxLDc2ICsxOTE2LDk4IEBACiAKIAlzY3NpX3NjYW5faG9zdChob3N0KTsKIAotCXFsYTJ4MDBfYWxsb2Nfc3lzZnNfYXR0cihoYSk7CisJcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKGJhc2VfdmhhKTsKIAotCXFsYTJ4MDBfaW5pdF9ob3N0X2F0dHIoaGEpOworCXFsYTJ4MDBfaW5pdF9ob3N0X2F0dHIoYmFzZV92aGEpOwogCi0JcWxhMngwMF9kZnNfc2V0dXAoaGEpOworCXFsYTJ4MDBfZGZzX3NldHVwKGJhc2VfdmhhKTsKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlxuIgogCSAgICAiIFFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXI6ICVzXG4iCiAJICAgICIgIFFMb2dpYyAlcyAtICVzXG4iCiAJICAgICIgIElTUCUwNFg6ICVzIEAgJXMgaGRtYSVjLCBob3N0Iz0lbGQsIGZ3PSVzXG4iLAogCSAgICBxbGEyeDAwX3ZlcnNpb25fc3RyLCBoYS0+bW9kZWxfbnVtYmVyLAotCSAgICBoYS0+bW9kZWxfZGVzYyA/IGhhLT5tb2RlbF9kZXNjOiAiIiwgcGRldi0+ZGV2aWNlLAotCSAgICBoYS0+aXNwX29wcy0+cGNpX2luZm9fc3RyKGhhLCBwY2lfaW5mbyksIHBjaV9uYW1lKHBkZXYpLAotCSAgICBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAnKyc6ICctJywgaGEtPmhvc3Rfbm8sCi0JICAgIGhhLT5pc3Bfb3BzLT5md192ZXJzaW9uX3N0cihoYSwgZndfc3RyKSk7CisJICAgIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2MgOiAiIiwgcGRldi0+ZGV2aWNlLAorCSAgICBoYS0+aXNwX29wcy0+cGNpX2luZm9fc3RyKGJhc2VfdmhhLCBwY2lfaW5mbyksIHBjaV9uYW1lKHBkZXYpLAorCSAgICBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAnKycgOiAnLScsIGJhc2VfdmhhLT5ob3N0X25vLAorCSAgICBoYS0+aXNwX29wcy0+ZndfdmVyc2lvbl9zdHIoYmFzZV92aGEsIGZ3X3N0cikpOwogCiAJcmV0dXJuIDA7CiAKIHByb2JlX2ZhaWxlZDoKLQlxbGEyeDAwX2ZyZWVfZGV2aWNlKGhhKTsKKwlxbGEyeDAwX2ZyZWVfcXVlKGhhLCByZXEsIHJzcCk7CisJcWxhMngwMF9mcmVlX2RldmljZShiYXNlX3ZoYSk7CiAKLQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCXNjc2lfaG9zdF9wdXQoYmFzZV92aGEtPmhvc3QpOwogCi1wcm9iZV9kaXNhYmxlX2RldmljZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Citwcm9iZV9od19mYWlsZWQ6CisJaWYgKGhhLT5pb2Jhc2UpCisJCWlvdW5tYXAoaGEtPmlvYmFzZSk7CisKKwlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGhhLT5wZGV2LCBoYS0+YmFycyk7CisJa2ZyZWUoaGEpOworCWhhID0gTlVMTDsKIAogcHJvYmVfb3V0OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZAogcWxhMngwMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEsICp2aGEsICp0ZW1wOworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEsICp2aGEsICp0ZW1wOworCXN0cnVjdCBxbGFfaHdfZGF0YSAgKmhhOwogCi0JaGEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaGEgPSBiYXNlX3ZoYS0+aHc7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmhhLCB0ZW1wLCAmaGEtPnZwX2xpc3QsIHZwX2xpc3QpCi0JCWZjX3Zwb3J0X3Rlcm1pbmF0ZSh2aGEtPmZjX3Zwb3J0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmhhLCB0ZW1wLCAmaGEtPnZwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHZoYSAmJiB2aGEtPmZjX3Zwb3J0KQorCQkJZmNfdnBvcnRfdGVybWluYXRlKHZoYS0+ZmNfdnBvcnQpOworCX0KIAotCXNldF9iaXQoVU5MT0FESU5HLCAmaGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChVTkxPQURJTkcsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAotCXFsYTJ4MDBfZGZzX3JlbW92ZShoYSk7CisJcWxhMngwMF9kZnNfcmVtb3ZlKGJhc2VfdmhhKTsKIAotCXFsYTg0eHhfcHV0X2NoaXAoaGEpOworCXFsYTg0eHhfcHV0X2NoaXAoYmFzZV92aGEpOwogCi0JcWxhMngwMF9mcmVlX3N5c2ZzX2F0dHIoaGEpOworCXFsYTJ4MDBfZnJlZV9zeXNmc19hdHRyKGJhc2VfdmhhKTsKIAotCWZjX3JlbW92ZV9ob3N0KGhhLT5ob3N0KTsKKwlmY19yZW1vdmVfaG9zdChiYXNlX3ZoYS0+aG9zdCk7CiAKLQlzY3NpX3JlbW92ZV9ob3N0KGhhLT5ob3N0KTsKKwlzY3NpX3JlbW92ZV9ob3N0KGJhc2VfdmhhLT5ob3N0KTsKIAotCXFsYTJ4MDBfZnJlZV9kZXZpY2UoaGEpOworCXFsYTJ4MDBfZnJlZV9kZXZpY2UoYmFzZV92aGEpOwogCi0Jc2NzaV9ob3N0X3B1dChoYS0+aG9zdCk7CisJc2NzaV9ob3N0X3B1dChiYXNlX3ZoYS0+aG9zdCk7CisKKwlpZiAoaGEtPmlvYmFzZSkKKwkJaW91bm1hcChoYS0+aW9iYXNlKTsKKworCWlmIChoYS0+bXFpb2Jhc2UpCisJCWlvdW5tYXAoaGEtPm1xaW9iYXNlKTsKKworCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoaGEtPnBkZXYsIGhhLT5iYXJzKTsKKwlrZnJlZShoYSk7CisJaGEgPSBOVUxMOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQKLXFsYTJ4MDBfZnJlZV9kZXZpY2Uoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZnJlZV9kZXZpY2Uoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7Ci0JcWxhMngwMF9hYm9ydF9hbGxfY21kcyhoYSwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXFsYTJ4MDBfYWJvcnRfYWxsX2NtZHModmhhLCBESURfTk9fQ09OTkVDVCA8PCAxNik7CiAKIAkvKiBEaXNhYmxlIHRpbWVyICovCi0JaWYgKGhhLT50aW1lcl9hY3RpdmUpCi0JCXFsYTJ4MDBfc3RvcF90aW1lcihoYSk7CisJaWYgKHZoYS0+dGltZXJfYWN0aXZlKQorCQlxbGEyeDAwX3N0b3BfdGltZXIodmhhKTsKIAotCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCXZoYS0+ZmxhZ3Mub25saW5lID0gMDsKIAogCS8qIEtpbGwgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCAqLwogCWlmIChoYS0+ZHBjX3RocmVhZCkgewpAQCAtMTgyNSw0NSArMjAyMiw0MSBAQAogCX0KIAogCWlmIChoYS0+ZmxhZ3MuZmNlX2VuYWJsZWQpCi0JCXFsYTJ4MDBfZGlzYWJsZV9mY2VfdHJhY2UoaGEsIE5VTEwsIE5VTEwpOworCQlxbGEyeDAwX2Rpc2FibGVfZmNlX3RyYWNlKHZoYSwgTlVMTCwgTlVMTCk7CiAKIAlpZiAoaGEtPmVmdCkKLQkJcWxhMngwMF9kaXNhYmxlX2VmdF90cmFjZShoYSk7CisJCXFsYTJ4MDBfZGlzYWJsZV9lZnRfdHJhY2UodmhhKTsKIAogCS8qIFN0b3AgY3VycmVudGx5IGV4ZWN1dGluZyBmaXJtd2FyZS4gKi8KLQlxbGEyeDAwX3RyeV90b19zdG9wX2Zpcm13YXJlKGhhKTsKKwlxbGEyeDAwX3RyeV90b19zdG9wX2Zpcm13YXJlKHZoYSk7CiAKIAkvKiB0dXJuLW9mZiBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCiAJaWYgKGhhLT5pbnRlcnJ1cHRzX29uKQogCQloYS0+aXNwX29wcy0+ZGlzYWJsZV9pbnRycyhoYSk7CiAKKwlxbGEyeDAwX2ZyZWVfaXJxcyh2aGEpOworCiAJcWxhMngwMF9tZW1fZnJlZShoYSk7CiAKLQlxbGEyeDAwX2ZyZWVfaXJxcyhoYSk7Ci0KLQkvKiByZWxlYXNlIGlvIHNwYWNlIHJlZ2lzdGVycyAgKi8KLQlpZiAoaGEtPmlvYmFzZSkKLQkJaW91bm1hcChoYS0+aW9iYXNlKTsKLQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKGhhLT5wZGV2LCBoYS0+YmFycyk7CisJcWxhMngwMF9mcmVlX3F1ZXVlcyhoYSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMngwMF9zY2hlZHVsZV9ycG9ydF9kZWwoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKK3FsYTJ4MDBfc2NoZWR1bGVfcnBvcnRfZGVsKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGZjX3BvcnRfdCAqZmNwb3J0LAogICAgIGludCBkZWZlcikKIHsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7CiAKIAlpZiAoIWZjcG9ydC0+cnBvcnQpCiAJCXJldHVybjsKIAogCXJwb3J0ID0gZmNwb3J0LT5ycG9ydDsKIAlpZiAoZGVmZXIpIHsKLQkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSh2aGEtPmhvc3QtPmhvc3RfbG9jayk7CiAJCWZjcG9ydC0+ZHJwb3J0ID0gcnBvcnQ7Ci0JCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKLQkJc2V0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJnBoYS0+ZHBjX2ZsYWdzKTsKLQkJcWxhMnh4eF93YWtlX2RwYyhwaGEpOworCQlzcGluX3VubG9ja19pcnEodmhhLT5ob3N0LT5ob3N0X2xvY2spOworCQlzZXRfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJfSBlbHNlCiAJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShycG9ydCk7CiB9CkBAIC0xODc3LDEzICsyMDcwLDE0IEBACiAgKgogICogQ29udGV4dDoKICAqLwotdm9pZCBxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3Qoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQsCit2b2lkIHFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgZmNfcG9ydF90ICpmY3BvcnQsCiAgICAgaW50IGRvX2xvZ2luLCBpbnQgZGVmZXIpCiB7CiAJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfT05MSU5FICYmCi0JICAgIGhhLT52cF9pZHggPT0gZmNwb3J0LT52cF9pZHgpCi0JCXFsYTJ4MDBfc2NoZWR1bGVfcnBvcnRfZGVsKGhhLCBmY3BvcnQsIGRlZmVyKTsKLQorCSAgICB2aGEtPnZwX2lkeCA9PSBmY3BvcnQtPnZwX2lkeCkgeworCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCQlxbGEyeDAwX3NjaGVkdWxlX3Jwb3J0X2RlbCh2aGEsIGZjcG9ydCwgZGVmZXIpOworCX0KIAkvKgogCSAqIFdlIG1heSBuZWVkIHRvIHJldHJ5IHRoZSBsb2dpbiwgc28gZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUKIAkgKiBwb3J0IGJ1dCBkbyB0aGUgcmV0cmllcy4KQEAgLTE4OTUsMTMgKzIwODksMTMgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGZjcG9ydC0+bG9naW5fcmV0cnkgPT0gMCkgewotCQlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gaGEtPmxvZ2luX3JldHJ5X2NvdW50OwotCQlzZXRfYml0KFJFTE9HSU5fTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWZjcG9ydC0+bG9naW5fcmV0cnkgPSB2aGEtPmh3LT5sb2dpbl9yZXRyeV9jb3VudDsKKwkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAogCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUG9ydCBsb2dpbiByZXRyeTogIgogCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LCAiCiAJCSAgICAiaWQgPSAweCUwNHggcmV0cnkgY250PSVkXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sCisJCSAgICB2aGEtPmhvc3Rfbm8sCiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVswXSwKIAkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sCkBAIC0xOTI5LDEzICsyMTIzLDEyIEBACiAgKiBDb250ZXh0OgogICovCiB2b2lkCi1xbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBpbnQgZGVmZXIpCitxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGRlZmVyKQogewogCWZjX3BvcnRfdCAqZmNwb3J0OwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnBoYS0+ZmNwb3J0cywgbGlzdCkgewotCQlpZiAoaGEtPnZwX2lkeCAhPSBmY3BvcnQtPnZwX2lkeCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJnZoYS0+dnBfZmNwb3J0cywgbGlzdCkgeworCQlpZiAodmhhLT52cF9pZHggIT0gZmNwb3J0LT52cF9pZHgpCiAJCQljb250aW51ZTsKIAkJLyoKIAkJICogTm8gcG9pbnQgaW4gbWFya2luZyB0aGUgZGV2aWNlIGFzIGxvc3QsIGlmIHRoZSBkZXZpY2UgaXMKQEAgLTE5NDMsOSArMjEzNiwxMSBAQAogCQkgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQpCiAJCQljb250aW51ZTsKLQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfT05MSU5FKQotCQkJcWxhMngwMF9zY2hlZHVsZV9ycG9ydF9kZWwoaGEsIGZjcG9ydCwgZGVmZXIpOwotCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUpIHsKKwkJCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19ERVZJQ0VfTE9TVCk7CisJCQlxbGEyeDAwX3NjaGVkdWxlX3Jwb3J0X2RlbCh2aGEsIGZjcG9ydCwgZGVmZXIpOworCQl9IGVsc2UKKwkJCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19ERVZJQ0VfTE9TVCk7CiAJfQogfQogCkBAIC0xOTU4LDEwNSArMjE1MywxNTMgQEAKICogICAgICAhMCAgPSBmYWlsdXJlLgogKi8KIHN0YXRpYyBpbnQKLXFsYTJ4MDBfbWVtX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX21lbV9hbGxvYyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MTZfdCByZXFfbGVuLCB1aW50MTZfdCByc3BfbGVuLAorCXN0cnVjdCByZXFfcXVlICoqcmVxLCBzdHJ1Y3QgcnNwX3F1ZSAqKnJzcCkKIHsKIAljaGFyCW5hbWVbMTZdOwogCi0JaGEtPnJlcXVlc3RfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkgICAgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSwgJmhhLT5yZXF1ZXN0X2RtYSwKLQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoYS0+cmVxdWVzdF9yaW5nKQotCQlnb3RvIGZhaWw7Ci0KLQloYS0+cmVzcG9uc2VfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkgICAgKGhhLT5yZXNwb25zZV9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlc3BvbnNlX3QpLAotCSAgICAmaGEtPnJlc3BvbnNlX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoYS0+cmVzcG9uc2VfcmluZykKLQkJZ290byBmYWlsX2ZyZWVfcmVxdWVzdF9yaW5nOwotCi0JaGEtPmdpZF9saXN0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBHSURfTElTVF9TSVpFLAotCSAgICAmaGEtPmdpZF9saXN0X2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoYS0+Z2lkX2xpc3QpCi0JCWdvdG8gZmFpbF9mcmVlX3Jlc3BvbnNlX3Jpbmc7CisJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihpbml0X2NiX3QpOworCWlmIChJU19RTEEyWFhYX01JRFRZUEUoaGEpKQorCQloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBtaWRfaW5pdF9jYl8yNHh4KTsKIAogCWhhLT5pbml0X2NiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBoYS0+aW5pdF9jYl9zaXplLAotCSAgICAmaGEtPmluaXRfY2JfZG1hLCBHRlBfS0VSTkVMKTsKKwkJJmhhLT5pbml0X2NiX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+aW5pdF9jYikKLQkJZ290byBmYWlsX2ZyZWVfZ2lkX2xpc3Q7CisJCWdvdG8gZmFpbDsKIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyVsZCIsIFFMQTJYWFhfRFJJVkVSX05BTUUsCi0JICAgIGhhLT5ob3N0X25vKTsKLQloYS0+c19kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZShuYW1lLCAmaGEtPnBkZXYtPmRldiwKLQkgICAgRE1BX1BPT0xfU0laRSwgOCwgMCk7Ci0JaWYgKCFoYS0+c19kbWFfcG9vbCkKKwloYS0+Z2lkX2xpc3QgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEdJRF9MSVNUX1NJWkUsCisJCSZoYS0+Z2lkX2xpc3RfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhLT5naWRfbGlzdCkKIAkJZ290byBmYWlsX2ZyZWVfaW5pdF9jYjsKIAogCWhhLT5zcmJfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChTUkJfTUlOX1JFUSwgc3JiX2NhY2hlcCk7CiAJaWYgKCFoYS0+c3JiX21lbXBvb2wpCi0JCWdvdG8gZmFpbF9mcmVlX3NfZG1hX3Bvb2w7CisJCWdvdG8gZmFpbF9mcmVlX2dpZF9saXN0OwogCiAJLyogR2V0IG1lbW9yeSBmb3IgY2FjaGVkIE5WUkFNICovCiAJaGEtPm52cmFtID0ga3phbGxvYyhNQVhfTlZSQU1fU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+bnZyYW0pCiAJCWdvdG8gZmFpbF9mcmVlX3NyYl9tZW1wb29sOwogCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfJWQiLCBRTEEyWFhYX0RSSVZFUl9OQU1FLAorCQloYS0+cGRldi0+ZGV2aWNlKTsKKwloYS0+c19kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZShuYW1lLCAmaGEtPnBkZXYtPmRldiwKKwkJRE1BX1BPT0xfU0laRSwgOCwgMCk7CisJaWYgKCFoYS0+c19kbWFfcG9vbCkKKwkJZ290byBmYWlsX2ZyZWVfbnZyYW07CisKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIFNOUyBjb21tYW5kcyAqLwogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewotCQkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBTTlMgY29tbWFuZHMgKi8KKwkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBTTlMgY29tbWFuZHMgKi8KIAkJaGEtPnNuc19jbWQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCi0JCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSwgJmhhLT5zbnNfY21kX2RtYSwgR0ZQX0tFUk5FTCk7CisJCXNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpLCAmaGEtPnNuc19jbWRfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoYS0+c25zX2NtZCkKLQkJCWdvdG8gZmFpbF9mcmVlX252cmFtOworCQkJZ290byBmYWlsX2RtYV9wb29sOwogCX0gZWxzZSB7Ci0JCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KKwkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBNUyBJT0NCICovCiAJCWhhLT5tc19pb2NiID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCi0JCSAgICAmaGEtPm1zX2lvY2JfZG1hKTsKKwkJCSZoYS0+bXNfaW9jYl9kbWEpOwogCQlpZiAoIWhhLT5tc19pb2NiKQotCQkJZ290byBmYWlsX2ZyZWVfbnZyYW07Ci0KLQkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQ1QgU05TIGNvbW1hbmRzICovCisJCQlnb3RvIGZhaWxfZG1hX3Bvb2w7CisJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQ1QgU05TIGNvbW1hbmRzICovCiAJCWhhLT5jdF9zbnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCi0JCSAgICBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpLCAmaGEtPmN0X3Nuc19kbWEsIEdGUF9LRVJORUwpOworCQkJc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwgJmhhLT5jdF9zbnNfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoYS0+Y3Rfc25zKQogCQkJZ290byBmYWlsX2ZyZWVfbXNfaW9jYjsKIAl9CiAKLQlyZXR1cm4gMDsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgcmluZyAqLworCSpyZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxX3F1ZSksIEdGUF9LRVJORUwpOworCWlmICghKnJlcSkgeworCQlERUJVRyhwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcVxuIikpOworCQlnb3RvIGZhaWxfcmVxOworCX0KKwkoKnJlcSktPmxlbmd0aCA9IHJlcV9sZW47CisJKCpyZXEpLT5yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkoKCpyZXEpLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLAorCQkmKCpyZXEpLT5kbWEsIEdGUF9LRVJORUwpOworCWlmICghKCpyZXEpLT5yaW5nKSB7CisJCURFQlVHKHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxX3JpbmdcbiIpKTsKKwkJZ290byBmYWlsX3JlcV9yaW5nOworCX0KKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3BvbnNlIHJpbmcgKi8KKwkqcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzcF9xdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpyc3ApIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJzcFxuIik7CisJCWdvdG8gZmFpbF9yc3A7CisJfQorCSgqcnNwKS0+aHcgPSBoYTsKKwkoKnJzcCktPmxlbmd0aCA9IHJzcF9sZW47CisJKCpyc3ApLT5yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkoKCpyc3ApLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKKwkJJigqcnNwKS0+ZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoISgqcnNwKS0+cmluZykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnNwX3JpbmdcbiIpOworCQlnb3RvIGZhaWxfcnNwX3Jpbmc7CisJfQorCSgqcmVxKS0+cnNwID0gKnJzcDsKKwkoKnJzcCktPnJlcSA9ICpyZXE7CisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBOVlJBTSBkYXRhIGZvciB2cG9ydHMgKi8KKwlpZiAoaGEtPm52cmFtX25waXZfc2l6ZSkgeworCQloYS0+bnBpdl9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFsYV9ucGl2X2VudHJ5KSAqCisJCQkJCWhhLT5udnJhbV9ucGl2X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWhhLT5ucGl2X2luZm8pIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbnBpdiBpbmZvXG4iKTsKKwkJCWdvdG8gZmFpbF9ucGl2X2luZm87CisJCX0KKwl9IGVsc2UKKwkJaGEtPm5waXZfaW5mbyA9IE5VTEw7CiAKKwlJTklUX0xJU1RfSEVBRCgmaGEtPnZwX2xpc3QpOworCXJldHVybiAxOworCitmYWlsX25waXZfaW5mbzoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgKCgqcnNwKS0+bGVuZ3RoICsgMSkgKgorCQlzaXplb2YocmVzcG9uc2VfdCksICgqcnNwKS0+cmluZywgKCpyc3ApLT5kbWEpOworCSgqcnNwKS0+cmluZyA9IE5VTEw7CisJKCpyc3ApLT5kbWEgPSAwOworZmFpbF9yc3BfcmluZzoKKwlrZnJlZSgqcnNwKTsKK2ZhaWxfcnNwOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCAoKCpyZXEpLT5sZW5ndGggKyAxKSAqCisJCXNpemVvZihyZXF1ZXN0X3QpLCAoKnJlcSktPnJpbmcsICgqcmVxKS0+ZG1hKTsKKwkoKnJlcSktPnJpbmcgPSBOVUxMOworCSgqcmVxKS0+ZG1hID0gMDsKK2ZhaWxfcmVxX3Jpbmc6CisJa2ZyZWUoKnJlcSk7CitmYWlsX3JlcToKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwKKwkJaGEtPmN0X3NucywgaGEtPmN0X3Nuc19kbWEpOworCWhhLT5jdF9zbnMgPSBOVUxMOworCWhhLT5jdF9zbnNfZG1hID0gMDsKIGZhaWxfZnJlZV9tc19pb2NiOgogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEpOwogCWhhLT5tc19pb2NiID0gTlVMTDsKIAloYS0+bXNfaW9jYl9kbWEgPSAwOworZmFpbF9kbWFfcG9vbDoKKwlkbWFfcG9vbF9kZXN0cm95KGhhLT5zX2RtYV9wb29sKTsKKwloYS0+c19kbWFfcG9vbCA9IE5VTEw7CiBmYWlsX2ZyZWVfbnZyYW06CiAJa2ZyZWUoaGEtPm52cmFtKTsKIAloYS0+bnZyYW0gPSBOVUxMOwogZmFpbF9mcmVlX3NyYl9tZW1wb29sOgogCW1lbXBvb2xfZGVzdHJveShoYS0+c3JiX21lbXBvb2wpOwogCWhhLT5zcmJfbWVtcG9vbCA9IE5VTEw7Ci1mYWlsX2ZyZWVfc19kbWFfcG9vbDoKLQlkbWFfcG9vbF9kZXN0cm95KGhhLT5zX2RtYV9wb29sKTsKLQloYS0+c19kbWFfcG9vbCA9IE5VTEw7Ci1mYWlsX2ZyZWVfaW5pdF9jYjoKLQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgaGEtPmluaXRfY2Jfc2l6ZSwgaGEtPmluaXRfY2IsCi0JICAgIGhhLT5pbml0X2NiX2RtYSk7Ci0JaGEtPmluaXRfY2IgPSBOVUxMOwotCWhhLT5pbml0X2NiX2RtYSA9IDA7CiBmYWlsX2ZyZWVfZ2lkX2xpc3Q6CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEdJRF9MSVNUX1NJWkUsIGhhLT5naWRfbGlzdCwKLQkgICAgaGEtPmdpZF9saXN0X2RtYSk7CisJaGEtPmdpZF9saXN0X2RtYSk7CiAJaGEtPmdpZF9saXN0ID0gTlVMTDsKIAloYS0+Z2lkX2xpc3RfZG1hID0gMDsKLWZhaWxfZnJlZV9yZXNwb25zZV9yaW5nOgotCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCAoaGEtPnJlc3BvbnNlX3FfbGVuZ3RoICsgMSkgKgotCSAgICBzaXplb2YocmVzcG9uc2VfdCksIGhhLT5yZXNwb25zZV9yaW5nLCBoYS0+cmVzcG9uc2VfZG1hKTsKLQloYS0+cmVzcG9uc2VfcmluZyA9IE5VTEw7Ci0JaGEtPnJlc3BvbnNlX2RtYSA9IDA7Ci1mYWlsX2ZyZWVfcmVxdWVzdF9yaW5nOgotCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCAoaGEtPnJlcXVlc3RfcV9sZW5ndGggKyAxKSAqCi0JICAgIHNpemVvZihyZXF1ZXN0X3QpLCBoYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOwotCWhhLT5yZXF1ZXN0X3JpbmcgPSBOVUxMOwotCWhhLT5yZXF1ZXN0X2RtYSA9IDA7CitmYWlsX2ZyZWVfaW5pdF9jYjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgaGEtPmluaXRfY2Jfc2l6ZSwgaGEtPmluaXRfY2IsCisJaGEtPmluaXRfY2JfZG1hKTsKKwloYS0+aW5pdF9jYiA9IE5VTEw7CisJaGEtPmluaXRfY2JfZG1hID0gMDsKIGZhaWw6CisJREVCVUcocHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19mdW5jX18pKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMjA2OCwzMiArMjMxMSwyOSBAQAogKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgogKi8KIHN0YXRpYyB2b2lkCi1xbGEyeDAwX21lbV9mcmVlKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX21lbV9mcmVlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqZmNwbCwgKmZjcHRlbXA7Ci0JZmNfcG9ydF90CSpmY3BvcnQ7Ci0KIAlpZiAoaGEtPnNyYl9tZW1wb29sKQogCQltZW1wb29sX2Rlc3Ryb3koaGEtPnNyYl9tZW1wb29sKTsKIAogCWlmIChoYS0+ZmNlKQogCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsIGhhLT5mY2UsCi0JCSAgICBoYS0+ZmNlX2RtYSk7CisJCWhhLT5mY2VfZG1hKTsKIAogCWlmIChoYS0+ZndfZHVtcCkgewogCQlpZiAoaGEtPmVmdCkKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkJICAgIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSksIGhhLT5lZnQsIGhhLT5lZnRfZG1hKTsKKwkJCW50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSksIGhhLT5lZnQsIGhhLT5lZnRfZG1hKTsKIAkJdmZyZWUoaGEtPmZ3X2R1bXApOwogCX0KIAogCWlmIChoYS0+c25zX2NtZCkKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpLAotCQkgICAgaGEtPnNuc19jbWQsIGhhLT5zbnNfY21kX2RtYSk7CisJCWhhLT5zbnNfY21kLCBoYS0+c25zX2NtZF9kbWEpOwogCiAJaWYgKGhhLT5jdF9zbnMpCiAJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpLAotCQkgICAgaGEtPmN0X3NucywgaGEtPmN0X3Nuc19kbWEpOworCQloYS0+Y3Rfc25zLCBoYS0+Y3Rfc25zX2RtYSk7CiAKIAlpZiAoaGEtPnNmcF9kYXRhKQogCQlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+c2ZwX2RhdGEsIGhhLT5zZnBfZGF0YV9kbWEpOwpAQCAtMjEwNCwyMyArMjM0NCwxOCBAQAogCWlmIChoYS0+c19kbWFfcG9vbCkKIAkJZG1hX3Bvb2xfZGVzdHJveShoYS0+c19kbWFfcG9vbCk7CiAKLQlpZiAoaGEtPmluaXRfY2IpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBoYS0+aW5pdF9jYl9zaXplLAotCQkgICAgaGEtPmluaXRfY2IsIGhhLT5pbml0X2NiX2RtYSk7CiAKIAlpZiAoaGEtPmdpZF9saXN0KQogCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgR0lEX0xJU1RfU0laRSwgaGEtPmdpZF9saXN0LAotCQkgICAgaGEtPmdpZF9saXN0X2RtYSk7CisJCWhhLT5naWRfbGlzdF9kbWEpOwogCi0JaWYgKGhhLT5yZXNwb25zZV9yaW5nKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJICAgIChoYS0+cmVzcG9uc2VfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKLQkJICAgIGhhLT5yZXNwb25zZV9yaW5nLCBoYS0+cmVzcG9uc2VfZG1hKTsKIAotCWlmIChoYS0+cmVxdWVzdF9yaW5nKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJICAgIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCi0JCSAgICBoYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOworCWlmIChoYS0+aW5pdF9jYikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGhhLT5pbml0X2NiX3NpemUsCisJCWhhLT5pbml0X2NiLCBoYS0+aW5pdF9jYl9kbWEpOworCXZmcmVlKGhhLT5vcHRyb21fYnVmZmVyKTsKKwlrZnJlZShoYS0+bnZyYW0pOworCWtmcmVlKGhhLT5ucGl2X2luZm8pOwogCiAJaGEtPnNyYl9tZW1wb29sID0gTlVMTDsKIAloYS0+ZWZ0ID0gTlVMTDsKQEAgLTIxMzksMzAgKzIzNzQsNDUgQEAKIAloYS0+Z2lkX2xpc3QgPSBOVUxMOwogCWhhLT5naWRfbGlzdF9kbWEgPSAwOwogCi0JaGEtPnJlc3BvbnNlX3JpbmcgPSBOVUxMOwotCWhhLT5yZXNwb25zZV9kbWEgPSAwOwotCWhhLT5yZXF1ZXN0X3JpbmcgPSBOVUxMOwotCWhhLT5yZXF1ZXN0X2RtYSA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZmNwbCwgZmNwdGVtcCwgJmhhLT5mY3BvcnRzKSB7Ci0JCWZjcG9ydCA9IGxpc3RfZW50cnkoZmNwbCwgZmNfcG9ydF90LCBsaXN0KTsKLQotCQkvKiBmYyBwb3J0cyAqLwotCQlsaXN0X2RlbF9pbml0KCZmY3BvcnQtPmxpc3QpOwotCQlrZnJlZShmY3BvcnQpOwotCX0KLQlJTklUX0xJU1RfSEVBRCgmaGEtPmZjcG9ydHMpOwotCiAJaGEtPmZ3X2R1bXAgPSBOVUxMOwogCWhhLT5md19kdW1wZWQgPSAwOwogCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOworfQogCi0JdmZyZWUoaGEtPm9wdHJvbV9idWZmZXIpOwotCWtmcmVlKGhhLT5udnJhbSk7CitzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqcWxhMngwMF9jcmVhdGVfaG9zdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQsCisJCQkJCQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IE5VTEw7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHNjc2lfcWxhX2hvc3RfdCkpOworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkicWxhMnh4eDogQ291bGRuJ3QgYWxsb2NhdGUgaG9zdCBmcm9tIHNjc2kgbGF5ZXIhXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENsZWFyIG91ciBkYXRhIGFyZWEgKi8KKwl2aGEgPSBzaG9zdF9wcml2KGhvc3QpOworCW1lbXNldCh2aGEsIDAsIHNpemVvZihzY3NpX3FsYV9ob3N0X3QpKTsKKworCXZoYS0+aG9zdCA9IGhvc3Q7CisJdmhhLT5ob3N0X25vID0gaG9zdC0+aG9zdF9ubzsKKwl2aGEtPmh3ID0gaGE7CisKKwlJTklUX0xJU1RfSEVBRCgmdmhhLT52cF9mY3BvcnRzKTsKKwlJTklUX0xJU1RfSEVBRCgmdmhhLT53b3JrX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZ2aGEtPmxpc3QpOworCisJc3ByaW50Zih2aGEtPmhvc3Rfc3RyLCAiJXNfJWxkIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgdmhhLT5ob3N0X25vKTsKKwlyZXR1cm4gdmhhOworCitmYWlsOgorCXJldHVybiB2aGE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcWxhX3dvcmtfZXZ0ICoKLXFsYTJ4MDBfYWxsb2Nfd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGVudW0gcWxhX3dvcmtfdHlwZSB0eXBlLAorcWxhMngwMF9hbGxvY193b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIGVudW0gcWxhX3dvcmtfdHlwZSB0eXBlLAogICAgIGludCBsb2NrZWQpCiB7CiAJc3RydWN0IHFsYV93b3JrX2V2dCAqZTsKQEAgLTIxNzksNDIgKzI0MjksNDIgQEAKIH0KIAogc3RhdGljIGludAotcWxhMngwMF9wb3N0X3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3QgcWxhX3dvcmtfZXZ0ICplLCBpbnQgbG9ja2VkKQorcWxhMngwMF9wb3N0X3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgc3RydWN0IHFsYV93b3JrX2V2dCAqZSwgaW50IGxvY2tlZCkKIHsKIAl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGZsYWdzKTsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFsb2NrZWQpCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmaGEtPndvcmtfbGlzdCk7Ci0JcWxhMnh4eF93YWtlX2RwYyhoYSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZ2aGEtPndvcmtfbGlzdCk7CisJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCWlmICghbG9ja2VkKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKIGludAotcWxhMngwMF9wb3N0X2Flbl93b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgZW51bSBmY19ob3N0X2V2ZW50X2NvZGUgY29kZSwKK3FsYTJ4MDBfcG9zdF9hZW5fd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBlbnVtIGZjX2hvc3RfZXZlbnRfY29kZSBjb2RlLAogICAgIHUzMiBkYXRhKQogewogCXN0cnVjdCBxbGFfd29ya19ldnQgKmU7CiAKLQllID0gcWxhMngwMF9hbGxvY193b3JrKGhhLCBRTEFfRVZUX0FFTiwgMSk7CisJZSA9IHFsYTJ4MDBfYWxsb2Nfd29yayh2aGEsIFFMQV9FVlRfQUVOLCAxKTsKIAlpZiAoIWUpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJZS0+dS5hZW4uY29kZSA9IGNvZGU7CiAJZS0+dS5hZW4uZGF0YSA9IGRhdGE7Ci0JcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKGhhLCBlLCAxKTsKKwlyZXR1cm4gcWxhMngwMF9wb3N0X3dvcmsodmhhLCBlLCAxKTsKIH0KIAogaW50Ci1xbGEyeDAwX3Bvc3RfaHdlX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBjb2RlLCB1aW50MTZfdCBkMSwKK3FsYTJ4MDBfcG9zdF9od2Vfd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50MTZfdCBjb2RlLCB1aW50MTZfdCBkMSwKICAgICB1aW50MTZfdCBkMiwgdWludDE2X3QgZDMpCiB7CiAJc3RydWN0IHFsYV93b3JrX2V2dCAqZTsKIAotCWUgPSBxbGEyeDAwX2FsbG9jX3dvcmsoaGEsIFFMQV9FVlRfSFdFX0xPRywgMSk7CisJZSA9IHFsYTJ4MDBfYWxsb2Nfd29yayh2aGEsIFFMQV9FVlRfSFdFX0xPRywgMSk7CiAJaWYgKCFlKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIApAQCAtMjIyMiwzNiArMjQ3Miw5NSBAQAogCWUtPnUuaHdlLmQxID0gZDE7CiAJZS0+dS5od2UuZDIgPSBkMjsKIAllLT51Lmh3ZS5kMyA9IGQzOwotCXJldHVybiBxbGEyeDAwX3Bvc3Rfd29yayhoYSwgZSwgMSk7CisJcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKHZoYSwgZSwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeDAwX2RvX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorcWxhMngwMF9kb193b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7CiAJc3RydWN0IHFsYV93b3JrX2V2dCAqZTsKLQlzY3NpX3FsYV9ob3N0X3QgKnBoYSA9IHRvX3FsYV9wYXJlbnQoaGEpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0Jc3Bpbl9sb2NrX2lycSgmcGhhLT5oYXJkd2FyZV9sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmhhLT53b3JrX2xpc3QpKSB7Ci0JCWUgPSBsaXN0X2VudHJ5KGhhLT53b3JrX2xpc3QubmV4dCwgc3RydWN0IHFsYV93b3JrX2V2dCwgbGlzdCk7CisJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmdmhhLT53b3JrX2xpc3QpKSB7CisJCWUgPSBsaXN0X2VudHJ5KHZoYS0+d29ya19saXN0Lm5leHQsIHN0cnVjdCBxbGFfd29ya19ldnQsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZlLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwaGEtPmhhcmR3YXJlX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKIAogCQlzd2l0Y2ggKGUtPnR5cGUpIHsKIAkJY2FzZSBRTEFfRVZUX0FFTjoKLQkJCWZjX2hvc3RfcG9zdF9ldmVudChoYS0+aG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAorCQkJZmNfaG9zdF9wb3N0X2V2ZW50KHZoYS0+aG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQkJICAgIGUtPnUuYWVuLmNvZGUsIGUtPnUuYWVuLmRhdGEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUUxBX0VWVF9IV0VfTE9HOgotCQkJcWxhMnh4eF9od19ldmVudF9sb2coaGEsIGUtPnUuaHdlLmNvZGUsIGUtPnUuaHdlLmQxLAorCQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBlLT51Lmh3ZS5jb2RlLCBlLT51Lmh3ZS5kMSwKIAkJCSAgICBlLT51Lmh3ZS5kMiwgZS0+dS5od2UuZDMpOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGUtPmZsYWdzICYgUUxBX0VWVF9GTEFHX0ZSRUUpCiAJCQlrZnJlZShlKTsKLQkJc3Bpbl9sb2NrX2lycSgmcGhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnBoYS0+aGFyZHdhcmVfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7Cit9CisvKiBSZWxvZ2lucyBhbGwgdGhlIGZjcG9ydHMgb2YgYSB2cG9ydAorICogQ29udGV4dDogZHBjIHRocmVhZAorICovCit2b2lkIHFsYTJ4MDBfcmVsb2dpbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCWZjX3BvcnRfdCAgICAgICAqZmNwb3J0OworCXVpbnQ4X3QgICAgICAgICBzdGF0dXM7CisJdWludDE2X3QgICAgICAgIG5leHRfbG9vcGlkID0gMDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyBub3QgT05MSU5FIHRoZW4gdHJ5IHRvIGxvZ2luCisJICogdG8gaXQgaWYgd2UgaGF2ZW4ndCBydW4gb3V0IG9mIHJldHJpZXMuCisJICovCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0KKwkJCUZDU19PTkxJTkUgJiYgZmNwb3J0LT5sb2dpbl9yZXRyeSkgeworCisJCQlpZiAoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSB7CisJCQkJaWYgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfVEFQRV9QUkVTRU5UKQorCQkJCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dCh2aGEsCisJCQkJCQkJZmNwb3J0LT5sb29wX2lkLAorCQkJCQkJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCQkJCQlmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCQkJCWZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKKworCQkJCXN0YXR1cyA9IHFsYTJ4MDBfZmFicmljX2xvZ2luKHZoYSwgZmNwb3J0LAorCQkJCQkJCSZuZXh0X2xvb3BpZCk7CisJCQl9IGVsc2UKKwkJCQlzdGF0dXMgPSBxbGEyeDAwX2xvY2FsX2RldmljZV9sb2dpbih2aGEsCisJCQkJCQkJCWZjcG9ydCk7CisKKwkJCWZjcG9ydC0+bG9naW5fcmV0cnktLTsKKwkJCWlmIChzdGF0dXMgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlmY3BvcnQtPm9sZF9sb29wX2lkID0gZmNwb3J0LT5sb29wX2lkOworCisJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHBvcnQgbG9naW4gT0s6IGxvZ2dlZCAiCisJCQkJImluIElEIDB4JXhcbiIsIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkKSk7CisKKwkJCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQodmhhLCBmY3BvcnQpOworCisJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSAxKSB7CisJCQkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkvKiByZXRyeSB0aGUgbG9naW4gYWdhaW4gKi8KKwkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUmV0cnlpbmciCisJCQkJIiAlZCBsb2dpbiBhZ2FpbiBsb29wX2lkIDB4JXhcbiIsCisJCQkJdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvZ2luX3JldHJ5LAorCQkJCQkJZmNwb3J0LT5sb29wX2lkKSk7CisJCQl9IGVsc2UgeworCQkJCWZjcG9ydC0+bG9naW5fcmV0cnkgPSAwOworCQkJfQorCisJCQlpZiAoZmNwb3J0LT5sb2dpbl9yZXRyeSA9PSAwICYmIHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykKKwkJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOworCQl9CisJCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCisJCQlicmVhazsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI3MSwxNSArMjU4MCwxMSBAQAogcWxhMngwMF9kb19kcGModm9pZCAqZGF0YSkKIHsKIAlpbnQJCXJ2YWw7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYTsKLQlmY19wb3J0X3QJKmZjcG9ydDsKLQl1aW50OF90CQlzdGF0dXM7Ci0JdWludDE2X3QJbmV4dF9sb29waWQ7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYTsKLQlpbnQgICAgICAgICAgICAgaTsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGE7CiAKLQotCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKWRhdGE7CisJaGEgPSAoc3RydWN0IHFsYV9od19kYXRhICopZGF0YTsKKwliYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CiAKQEAgLTIyOTMsMTAgKzI1OTgsMTAgQEAKIAkJREVCVUczKHByaW50aygicWxhMngwMDogRFBDIGhhbmRsZXIgd2FraW5nIHVwXG4iKSk7CiAKIAkJLyogSW5pdGlhbGl6YXRpb24gbm90IHlldCBmaW5pc2hlZC4gRG9uJ3QgZG8gYW55dGhpbmcgeWV0LiAqLwotCQlpZiAoIWhhLT5mbGFncy5pbml0X2RvbmUpCisJCWlmICghYmFzZV92aGEtPmZsYWdzLmluaXRfZG9uZSkKIAkJCWNvbnRpbnVlOwogCi0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRFBDIGhhbmRsZXJcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRFBDIGhhbmRsZXJcbiIsIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAKIAkJaGEtPmRwY19hY3RpdmUgPSAxOwogCkBAIC0yMzA1LDE0OSArMjYxMCw5OCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlxbGEyeDAwX2RvX3dvcmsoaGEpOworCQlxbGEyeDAwX2RvX3dvcmsoYmFzZV92aGEpOwogCi0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwKKwkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkgewogCiAJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiBzY2hlZCAiCiAJCQkgICAgInFsYTJ4MDBfYWJvcnRfaXNwIGhhID0gJXBcbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8sIGhhKSk7CisJCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhKSk7CiAJCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsCi0JCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSkgeworCQkJICAgICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpIHsKIAotCQkJCWlmIChxbGEyeDAwX2Fib3J0X2lzcChoYSkpIHsKKwkJCQlpZiAocWxhMngwMF9hYm9ydF9pc3AoYmFzZV92aGEpKSB7CiAJCQkJCS8qIGZhaWxlZC4gcmV0cnkgbGF0ZXIgKi8KIAkJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELAotCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpOworCQkJCQkgICAgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCQkJCX0KLQkJCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJfQotCi0JCQlmb3JfZWFjaF9tYXBwZWRfdnBfaWR4KGhhLCBpKSB7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aGEsICZoYS0+dnBfbGlzdCwKLQkJCQkgICAgdnBfbGlzdCkgewotCQkJCQlpZiAoaSA9PSB2aGEtPnZwX2lkeCkgewotCQkJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELAotCQkJCQkJICAgICZ2aGEtPmRwY19mbGFncyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KKwkJCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwKKwkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCX0KIAogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYzogcWxhMngwMF9hYm9ydF9pc3AgZW5kXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAkJfQogCi0JCWlmICh0ZXN0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnRzKGhhKTsKLQkJCWNsZWFyX2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlpZiAodGVzdF9iaXQoRkNQT1JUX1VQREFURV9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJcWxhMngwMF91cGRhdGVfZmNwb3J0cyhiYXNlX3ZoYSk7CisJCQljbGVhcl9iaXQoRkNQT1JUX1VQREFURV9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJfQogCi0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpICYmCi0JCSAgICAoISh0ZXN0X2FuZF9zZXRfYml0KFJFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkpIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELAorCQkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSAmJgorCQkgICAgKCEodGVzdF9hbmRfc2V0X2JpdChSRVNFVF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpKSB7CiAKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3Jlc2V0X21hcmtlcigpXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAotCQkJcWxhMngwMF9yc3RfYWVuKGhhKTsKLQkJCWNsZWFyX2JpdChSRVNFVF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXFsYTJ4MDBfcnN0X2FlbihiYXNlX3ZoYSk7CisJCQljbGVhcl9iaXQoUkVTRVRfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCX0KIAogCQkvKiBSZXRyeSBlYWNoIGRldmljZSB1cCB0byBsb2dpbiByZXRyeSBjb3VudCAqLwotCQlpZiAoKHRlc3RfYW5kX2NsZWFyX2JpdChSRUxPR0lOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgotCQkgICAgIXRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpICYmCi0JCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQlpZiAoKHRlc3RfYW5kX2NsZWFyX2JpdChSRUxPR0lOX05FRURFRCwKKwkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkgJiYKKwkJICAgICF0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSAmJgorCQkgICAgYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKIAogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfcG9ydF9sb2dpbigpXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQlxbGEyeDAwX3JlbG9naW4oYmFzZV92aGEpOwogCi0JCQluZXh0X2xvb3BpZCA9IDA7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGUgcG9ydCBpcyBub3QgT05MSU5FIHRoZW4gdHJ5IHRvIGxvZ2luCi0JCQkJICogdG8gaXQgaWYgd2UgaGF2ZW4ndCBydW4gb3V0IG9mIHJldHJpZXMuCi0JCQkJICovCi0JCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FICYmCi0JCQkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnkpIHsKLQotCQkJCQlpZiAoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSB7Ci0JCQkJCQlpZiAoZmNwb3J0LT5mbGFncyAmCi0JCQkJCQkgICAgRkNGX1RBUEVfUFJFU0VOVCkKLQkJCQkJCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dCgKLQkJCQkJCQkgICAgaGEsIGZjcG9ydC0+bG9vcF9pZCwKLQkJCQkJCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAotCQkJCQkJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkJCQkJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7Ci0JCQkJCQlzdGF0dXMgPSBxbGEyeDAwX2ZhYnJpY19sb2dpbigKLQkJCQkJCSAgICBoYSwgZmNwb3J0LCAmbmV4dF9sb29waWQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXN0YXR1cyA9Ci0JCQkJCQkgICAgcWxhMngwMF9sb2NhbF9kZXZpY2VfbG9naW4oCi0JCQkJCQkJaGEsIGZjcG9ydCk7Ci0KLQkJCQkJZmNwb3J0LT5sb2dpbl9yZXRyeS0tOwotCQkJCQlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTKSB7Ci0JCQkJCQlmY3BvcnQtPm9sZF9sb29wX2lkID0gZmNwb3J0LT5sb29wX2lkOwotCi0JCQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcG9ydCBsb2dpbiBPSzogbG9nZ2VkIGluIElEIDB4JXhcbiIsCi0JCQkJCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCkpOwotCi0JCQkJCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoaGEsCi0JCQkJCQkgICAgZmNwb3J0KTsKLQkJCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gMSkgewotCQkJCQkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwotCQkJCQkJLyogcmV0cnkgdGhlIGxvZ2luIGFnYWluICovCi0JCQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUmV0cnlpbmcgJWQgbG9naW4gYWdhaW4gbG9vcF9pZCAweCV4XG4iLAotCQkJCQkJICAgIGhhLT5ob3N0X25vLAotCQkJCQkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnksIGZjcG9ydC0+bG9vcF9pZCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDA7Ci0JCQkJCX0KLQkJCQkJaWYgKGZjcG9ydC0+bG9naW5fcmV0cnkgPT0gMCAmJiBzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpCi0JCQkJCQlmY3BvcnQtPmxvb3BfaWQgPSBGQ19OT19MT09QX0lEOwotCQkJCX0KLQkJCQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCi0JCQkJCWJyZWFrOwotCQkJfQogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfcG9ydF9sb2dpbiAtIGVuZFxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJICAgIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAJCX0KIAotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELAorCQkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkgewogCiAJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb29wX3Jlc3luYygpXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKIAogCQkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChMT09QX1JFU1lOQ19BQ1RJVkUsCi0JCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSkgeworCQkJICAgICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpIHsKIAotCQkJCXJ2YWwgPSBxbGEyeDAwX2xvb3BfcmVzeW5jKGhhKTsKKwkJCQlydmFsID0gcWxhMngwMF9sb29wX3Jlc3luYyhiYXNlX3ZoYSk7CiAKLQkJCQljbGVhcl9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX0FDVElWRSwKKwkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCX0KIAogCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9vcF9yZXN5bmMgLSBlbmRcbiIsCi0JCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCQl9CiAKLQkJaWYgKHRlc3RfYml0KE5QSVZfQ09ORklHX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpICYmCi0JCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfUkVBRFkpIHsKLQkJCWNsZWFyX2JpdChOUElWX0NPTkZJR19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQkJCXFsYTJ4eHhfZmxhc2hfbnBpdl9jb25mKGhhKTsKKwkJaWYgKHRlc3RfYml0KE5QSVZfQ09ORklHX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpICYmCisJCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfUkVBRFkpIHsKKwkJCWNsZWFyX2JpdChOUElWX0NPTkZJR19ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXFsYTJ4eHhfZmxhc2hfbnBpdl9jb25mKGJhc2VfdmhhKTsKIAkJfQogCiAJCWlmICghaGEtPmludGVycnVwdHNfb24pCiAJCQloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKIAotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJFQUNPTl9CTElOS19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKLQkJCWhhLT5pc3Bfb3BzLT5iZWFjb25fYmxpbmsoaGEpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJFQUNPTl9CTElOS19ORUVERUQsCisJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkKKwkJCWhhLT5pc3Bfb3BzLT5iZWFjb25fYmxpbmsoYmFzZV92aGEpOwogCi0JCXFsYTJ4MDBfZG9fZHBjX2FsbF92cHMoaGEpOworCQlxbGEyeDAwX2RvX2RwY19hbGxfdnBzKGJhc2VfdmhhKTsKIAogCQloYS0+ZHBjX2FjdGl2ZSA9IDA7CiAJfSAvKiBFbmQgb2Ygd2hpbGUoMSkgKi8KIAotCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlciBleGl0aW5nXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlciBleGl0aW5nXG4iLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCBub2JvZHkgdHJpZXMgdG8gd2FrZSB1cyB1cCBhZ2Fpbi4KQEAgLTI0NTgsMTEgKzI3MTIsMTIgQEAKIH0KIAogdm9pZAotcWxhMnh4eF93YWtlX2RwYyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMnh4eF93YWtlX2RwYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IGhhLT5kcGNfdGhyZWFkOwogCi0JaWYgKCF0ZXN0X2JpdChVTkxPQURJTkcsICZoYS0+ZHBjX2ZsYWdzKSAmJiB0KQorCWlmICghdGVzdF9iaXQoVU5MT0FESU5HLCAmdmhhLT5kcGNfZmxhZ3MpICYmIHQpCiAJCXdha2VfdXBfcHJvY2Vzcyh0KTsKIH0KIApAQCAtMjQ3NCwyNiArMjcyOSwyNiBAQAogKiAgICAgIGhhICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9yc3RfYWVuKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX3JzdF9hZW4oc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7Ci0JaWYgKGhhLT5mbGFncy5vbmxpbmUgJiYgIWhhLT5mbGFncy5yZXNldF9hY3RpdmUgJiYKLQkgICAgIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgotCSAgICAhKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSkpIHsKKwlpZiAodmhhLT5mbGFncy5vbmxpbmUgJiYgIXZoYS0+ZmxhZ3MucmVzZXRfYWN0aXZlICYmCisJICAgICFhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJICAgICEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkpIHsKIAkJZG8gewotCQkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCiAJCQkvKgogCQkJICogSXNzdWUgbWFya2VyIGNvbW1hbmQgb25seSB3aGVuIHdlIGFyZSBnb2luZyB0byBzdGFydAogCQkJICogdGhlIEkvTy4KIAkJCSAqLwotCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOwotCQl9IHdoaWxlICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCi0JCSAgICAodGVzdF9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSk7CisJCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCQl9IHdoaWxlICghYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgorCQkgICAgKHRlc3RfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeDAwX3NwX2ZyZWVfZG1hKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHNyYl90ICpzcCkKK3FsYTJ4MDBfc3BfZnJlZV9kbWEoc3JiX3QgKnNwKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CiAKQEAgLTI1MDUsMTEgKzI3NjAsMTEgQEAKIH0KIAogdm9pZAotcWxhMngwMF9zcF9jb21wbChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCitxbGEyeDAwX3NwX2NvbXBsKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHNyYl90ICpzcCkKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcC0+Y21kOwogCi0JcWxhMngwMF9zcF9mcmVlX2RtYShoYSwgc3ApOworCXFsYTJ4MDBfc3BfZnJlZV9kbWEoc3ApOwogCiAJbWVtcG9vbF9mcmVlKHNwLCBoYS0+c3JiX21lbXBvb2wpOwogCkBAIC0yNTI1LDcgKzI3ODAsNyBAQAogKiBDb250ZXh0OiBJbnRlcnJ1cHQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQKLXFsYTJ4MDBfdGltZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfdGltZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdW5zaWduZWQgbG9uZwljcHVfZmxhZ3MgPSAwOwogCWZjX3BvcnRfdAkqZmNwb3J0OwpAQCAtMjUzMyw4ICsyNzg4LDggQEAKIAlpbnQJCWluZGV4OwogCXNyYl90CQkqc3A7CiAJaW50CQl0OwotCXNjc2lfcWxhX2hvc3RfdCAqcGhhID0gdG9fcWxhX3BhcmVudChoYSk7Ci0KKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOwogCS8qCiAJICogUG9ydHMgLSBQb3J0IGRvd24gdGltZXIuCiAJICoKQEAgLTI1NDMsNyArMjc5OCw3IEBACiAJICogdGhlIHBvcnQgaXQgbWFya2VkIERFQUQuCiAJICovCiAJdCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7CiAJCWlmIChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfVEFSR0VUKQogCQkJY29udGludWU7CiAKQEAgLTI1NTcsNyArMjgxMiw3IEBACiAKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBmY3BvcnQtJWQgLSBwb3J0IHJldHJ5IGNvdW50OiAiCiAJCQkgICAgIiVkIHJlbWFpbmluZ1xuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCSAgICB2aGEtPmhvc3Rfbm8sCiAJCQkgICAgdCwgYXRvbWljX3JlYWQoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyKSkpOwogCQl9CiAJCXQrKzsKQEAgLTI1NjUsMzAgKzI4MjAsMzIgQEAKIAogCiAJLyogTG9vcCBkb3duIGhhbmRsZXIuICovCi0JaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSA+IDAgJiYKLQkgICAgISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpICYmIGhhLT5mbGFncy5vbmxpbmUpIHsKKwlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSA+IDAgJiYKKwkgICAgISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpKQorCQkmJiB2aGEtPmZsYWdzLm9ubGluZSkgewogCi0JCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgPT0KLQkJICAgIGhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSkgeworCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSA9PQorCQkgICAgdmhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSkgewogCiAJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTG9vcCBEb3duIC0gYWJvcnRpbmcgdGhlICIKIAkJCSAgICAicXVldWVzIGJlZm9yZSB0aW1lIGV4cGlyZVxuIiwKLQkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJICAgIHZoYS0+aG9zdF9ubykpOwogCi0JCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmIGhhLT5saW5rX2Rvd25fdGltZW91dCkKLQkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ERUFEKTsKKwkJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgdmhhLT5saW5rX2Rvd25fdGltZW91dCkKKwkJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfREVBRCk7CiAKIAkJCS8qIFNjaGVkdWxlIGFuIElTUCBhYm9ydCB0byByZXR1cm4gYW55IHRhcGUgY29tbWFuZHMuICovCiAJCQkvKiBOUElWIC0gc2NhbiBwaHlzaWNhbCBwb3J0IG9ubHkgKi8KLQkJCWlmICghaGEtPnBhcmVudCkgeworCQkJaWYgKCF2aGEtPnZwX2lkeCkgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywKIAkJCQkgICAgY3B1X2ZsYWdzKTsKKwkJCQlyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwogCQkJCWZvciAoaW5kZXggPSAxOwogCQkJCSAgICBpbmRleCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsKIAkJCQkgICAgaW5kZXgrKykgewogCQkJCQlmY19wb3J0X3QgKnNmY3A7CiAKLQkJCQkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF07CisJCQkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKIAkJCQkJaWYgKCFzcCkKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQlzZmNwID0gc3AtPmZjcG9ydDsKQEAgLTI1OTYsNjMgKzI4NTMsNjMgQEAKIAkJCQkJCWNvbnRpbnVlOwogCiAJCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwKLQkJCQkJICAgICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkJCQkmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssCi0JCQkJICAgIGNwdV9mbGFncyk7CisJCQkJCQkJCWNwdV9mbGFncyk7CiAJCQl9Ci0JCQlzZXRfYml0KEFCT1JUX1FVRVVFU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXNldF9iaXQoQUJPUlRfUVVFVUVTX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXN0YXJ0X2RwYysrOwogCQl9CiAKIAkJLyogaWYgdGhlIGxvb3AgaGFzIGJlZW4gZG93biBmb3IgNCBtaW51dGVzLCByZWluaXQgYWRhcHRlciAqLwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaGEtPmxvb3BfZG93bl90aW1lcikgIT0gMCkgeworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdmhhLT5sb29wX2Rvd25fdGltZXIpICE9IDApIHsKIAkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMb29wIGRvd24gZXhjZWVkIDQgbWlucyAtICIKIAkJCSAgICAicmVzdGFydGluZyBxdWV1ZXMuXG4iLAotCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkgICAgdmhhLT5ob3N0X25vKSk7CiAKLQkJCXNldF9iaXQoUkVTVEFSVF9RVUVVRVNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQlzZXRfYml0KFJFU1RBUlRfUVVFVUVTX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXN0YXJ0X2RwYysrOwogCi0JCQlpZiAoIShoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkgJiYKLQkJCSAgICAhaGEtPnBhcmVudCkgeworCQkJaWYgKCEodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX05PX0NBQkxFKSAmJgorCQkJICAgICF2aGEtPnZwX2lkeCkgewogCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMb29wIGRvd24gLSAiCiAJCQkJICAgICJhYm9ydGluZyBJU1AuXG4iLAotCQkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCQkJICAgICJMb29wIGRvd24gLSBhYm9ydGluZyBJU1AuXG4iKTsKIAotCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCX0KIAkJfQogCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IExvb3AgRG93biAtIHNlY29uZHMgcmVtYWluaW5nICVkXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sCi0JCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpKTsKKwkJICAgIHZoYS0+aG9zdF9ubywKKwkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpKTsKIAl9CiAKIAkvKiBDaGVjayBpZiBiZWFjb24gTEVEIG5lZWRzIHRvIGJlIGJsaW5rZWQgKi8KIAlpZiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkgewotCQlzZXRfYml0KEJFQUNPTl9CTElOS19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc2V0X2JpdChCRUFDT05fQkxJTktfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlzdGFydF9kcGMrKzsKIAl9CiAKIAkvKiBQcm9jZXNzIGFueSBkZWZlcnJlZCB3b3JrLiAqLwotCWlmICghbGlzdF9lbXB0eSgmaGEtPndvcmtfbGlzdCkpCisJaWYgKCFsaXN0X2VtcHR5KCZ2aGEtPndvcmtfbGlzdCkpCiAJCXN0YXJ0X2RwYysrOwogCiAJLyogU2NoZWR1bGUgdGhlIERQQyByb3V0aW5lIGlmIG5lZWRlZCAqLwotCWlmICgodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwKKwlpZiAoKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHN0YXJ0X2RwYyB8fAotCSAgICB0ZXN0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoQkVBQ09OX0JMSU5LX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KFZQX0RQQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChSRUxPR0lOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSkKLQkJcWxhMnh4eF93YWtlX2RwYyhwaGEpOworCSAgICB0ZXN0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KEJFQUNPTl9CTElOS19ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoVlBfRFBDX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkpCisJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAotCXFsYTJ4MDBfcmVzdGFydF90aW1lcihoYSwgV0FUQ0hfSU5URVJWQUwpOworCXFsYTJ4MDBfcmVzdGFydF90aW1lcih2aGEsIFdBVENIX0lOVEVSVkFMKTsKIH0KIAogLyogRmlybXdhcmUgaW50ZXJmYWNlIHJvdXRpbmVzLiAqLwpAQCAtMjY4NCw4ICsyOTQxLDkgQEAKIH07CiAKIHN0cnVjdCBmd19ibG9iICoKLXFsYTJ4MDBfcmVxdWVzdF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBmd19ibG9iICpibG9iOwogCiAJYmxvYiA9IE5VTEw7CkBAIC0yNzA5LDcgKzI5NjcsNyBAQAogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmJsb2ItPmZ3LCBibG9iLT5uYW1lLCAmaGEtPnBkZXYtPmRldikpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBpbWFnZSAiCi0JCSAgICAiKCVzKS5cbiIsIGhhLT5ob3N0X25vLCBibG9iLT5uYW1lKSk7CisJCSAgICAiKCVzKS5cbiIsIHZoYS0+aG9zdF9ubywgYmxvYi0+bmFtZSkpOwogCQlibG9iLT5mdyA9IE5VTEw7CiAJCWJsb2IgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTI3NTQsNyArMzAxMiw4IEBACiAJaW50IHJpc2NfcGF1c2VkID0gMDsKIAl1aW50MzJfdCBzdGF0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBiYXNlX3ZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnMjQgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKQEAgLTI3NzcsNyArMzAzNiw3IEBACiAJaWYgKHJpc2NfcGF1c2VkKSB7CiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tIG1taW9fZW5hYmxlZCwgIgogCQkgICAgIkR1bXBpbmcgZmlybXdhcmUhXG4iKTsKLQkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAoaGEsIDApOworCQloYS0+aXNwX29wcy0+ZndfZHVtcChiYXNlX3ZoYSwgMCk7CiAKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CiAJfSBlbHNlCkBAIC0yNzg4LDcgKzMwNDcsOCBAQAogcWxhMnh4eF9wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlwY2lfZXJzX3Jlc3VsdF90IHJldCA9IFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBiYXNlX3ZoYS0+aHc7CiAJaW50IHJjOwogCiAJaWYgKGhhLT5tZW1fb25seSkKQEAgLTI4MDQsMTMgKzMwNjQsMTMgQEAKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQlpZiAoaGEtPmlzcF9vcHMtPnBjaV9jb25maWcoaGEpKQorCWlmIChoYS0+aXNwX29wcy0+cGNpX2NvbmZpZyhiYXNlX3ZoYSkpCiAJCXJldHVybiByZXQ7CiAKLQlzZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKLQlpZiAocWxhMngwMF9hYm9ydF9pc3AoaGEpPT0gUUxBX1NVQ0NFU1MpCisJc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CisJaWYgKHFsYTJ4MDBfYWJvcnRfaXNwKGJhc2VfdmhhKSA9PSBRTEFfU1VDQ0VTUykKIAkJcmV0ID0gIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKLQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjgxOCwxMCArMzA3OCwxMSBAQAogc3RhdGljIHZvaWQKIHFsYTJ4eHhfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IGJhc2VfdmhhLT5odzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKTsKKwlyZXQgPSBxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoYmFzZV92aGEpOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCiAJCSAgICAidGhlIGRldmljZSBmYWlsZWQgdG8gcmVzdW1lIEkvTyAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggZTRhZjY3OC4uYzUzOGVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtMTAsMTAgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotc3RhdGljIHVpbnQxNl90IHFsYTJ4MDBfbnZyYW1fcmVxdWVzdChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QpOwotc3RhdGljIHZvaWQgcWxhMngwMF9udl9kZXNlbGVjdChzY3NpX3FsYV9ob3N0X3QgKik7Ci1zdGF0aWMgdm9pZCBxbGEyeDAwX252X3dyaXRlKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7Ci0KIC8qCiAgKiBOVlJBTSBzdXBwb3J0IHJvdXRpbmVzCiAgKi8KQEAgLTIzLDcgKzE5LDcgQEAKICAqIEBoYTogSEEgY29udGV4dAogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9sb2NrX252cmFtX2FjY2VzcyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMngwMF9sb2NrX252cmFtX2FjY2VzcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCXVpbnQxNl90IGRhdGE7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwpAQCAtNTYsNyArNTIsNyBAQAogICogQGhhOiBIQSBjb250ZXh0CiAgKi8KIHN0YXRpYyB2b2lkCi1xbGEyeDAwX3VubG9ja19udnJhbV9hY2Nlc3Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfdW5sb2NrX252cmFtX2FjY2VzcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIApAQCAtNjcsNiArNjMsODQgQEAKIH0KIAogLyoqCisgKiBxbGEyeDAwX252X3dyaXRlKCkgLSBQcmVwYXJlIGZvciBOVlJBTSByZWFkL3dyaXRlIG9wZXJhdGlvbi4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGRhdGE6IFNlcmlhbCBpbnRlcmZhY2Ugc2VsZWN0b3IKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbnZfd3JpdGUoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIGRhdGEgfCBOVlJfU0VMRUNUIHwgTlZSX1dSVF9FTkFCTEUpOworCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCU5WUkFNX0RFTEFZKCk7CisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZSX1NFTEVDVCB8IE5WUl9DTE9DSyB8CisJICAgIE5WUl9XUlRfRU5BQkxFKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WUl9TRUxFQ1QgfCBOVlJfV1JUX0VOQUJMRSk7CisJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkJLyogUENJIFBvc3RpbmcuICovCisJTlZSQU1fREVMQVkoKTsKK30KKworLyoqCisgKiBxbGEyeDAwX252cmFtX3JlcXVlc3QoKSAtIFNlbmRzIHJlYWQgY29tbWFuZCB0byBOVlJBTSBhbmQgZ2V0cyBkYXRhIGZyb20KKyAqCU5WUkFNLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbnZfY21kOiBOVlJBTSBjb21tYW5kCisgKgorICogQml0IGRlZmluaXRpb25zIGZvciBOVlJBTSBjb21tYW5kOgorICoKKyAqCUJpdCAyNiAgICAgPSBzdGFydCBiaXQKKyAqCUJpdCAyNSwgMjQgPSBvcGNvZGUKKyAqCUJpdCAyMy0xNiAgPSBhZGRyZXNzCisgKglCaXQgMTUtMCAgID0gd3JpdGUgZGF0YQorICoKKyAqIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIG52cmFtIEBhZGRyLgorICovCitzdGF0aWMgdWludDE2X3QKK3FsYTJ4MDBfbnZyYW1fcmVxdWVzdChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBudl9jbWQpCit7CisJdWludDhfdAkJY250OworCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKKwl1aW50MTZfdAlkYXRhID0gMDsKKwl1aW50MTZfdAlyZWdfZGF0YTsKKworCS8qIFNlbmQgY29tbWFuZCB0byBOVlJBTS4gKi8KKwludl9jbWQgPDw9IDU7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxMTsgY250KyspIHsKKwkJaWYgKG52X2NtZCAmIEJJVF8zMSkKKwkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7CisJCWVsc2UKKwkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOworCQludl9jbWQgPDw9IDE7CisJfQorCisJLyogUmVhZCBkYXRhIGZyb20gTlZSQU0uICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCAxNjsgY250KyspIHsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfU0VMRUNUIHwgTlZSX0NMT0NLKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJTlZSQU1fREVMQVkoKTsKKwkJZGF0YSA8PD0gMTsKKwkJcmVnX2RhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CisJCWlmIChyZWdfZGF0YSAmIE5WUl9EQVRBX0lOKQorCQkJZGF0YSB8PSBCSVRfMDsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfU0VMRUNUKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJTlZSQU1fREVMQVkoKTsKKwl9CisKKwkvKiBEZXNlbGVjdCBjaGlwLiAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX0RFU0VMRUNUKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworCisJcmV0dXJuIGRhdGE7Cit9CisKKworLyoqCiAgKiBxbGEyeDAwX2dldF9udnJhbV93b3JkKCkgLSBDYWxjdWxhdGVzIHdvcmQgcG9zaXRpb24gaW4gTlZSQU0gYW5kIGNhbGxzIHRoZQogICoJcmVxdWVzdCByb3V0aW5lIHRvIGdldCB0aGUgd29yZCBmcm9tIE5WUkFNLgogICogQGhhOiBIQSBjb250ZXh0CkBAIC03NSw3ICsxNDksNyBAQAogICogUmV0dXJucyB0aGUgd29yZCByZWFkIGZyb20gbnZyYW0gQGFkZHIuCiAgKi8KIHN0YXRpYyB1aW50MTZfdAotcWxhMngwMF9nZXRfbnZyYW1fd29yZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBhZGRyKQorcWxhMngwMF9nZXRfbnZyYW1fd29yZChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyKQogewogCXVpbnQxNl90CWRhdGE7CiAJdWludDMyX3QJbnZfY21kOwpAQCAtODgsMTMgKzE2MiwyNyBAQAogfQogCiAvKioKKyAqIHFsYTJ4MDBfbnZfZGVzZWxlY3QoKSAtIERlc2VsZWN0IE5WUkFNIG9wZXJhdGlvbnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbnZfZGVzZWxlY3Qoc3RydWN0IHFsYV9od19kYXRhICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9ERVNFTEVDVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkJLyogUENJIFBvc3RpbmcuICovCisJTlZSQU1fREVMQVkoKTsKK30KKworLyoqCiAgKiBxbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoKSAtIFdyaXRlIE5WUkFNIGRhdGEuCiAgKiBAaGE6IEhBIGNvbnRleHQKICAqIEBhZGRyOiBBZGRyZXNzIGluIE5WUkFNIHRvIHdyaXRlCiAgKiBAZGF0YTogd29yZCB0byBwcm9ncmFtCiAgKi8KIHN0YXRpYyB2b2lkCi1xbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDE2X3QgZGF0YSkKK3FsYTJ4MDBfd3JpdGVfbnZyYW1fd29yZChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyLCB1aW50MTZfdCBkYXRhKQogewogCWludCBjb3VudDsKIAl1aW50MTZfdCB3b3JkOwpAQCAtMTMyLDcgKzIyMCw3IEBACiAJZG8gewogCQlpZiAoIS0td2FpdF9jbnQpIHsKIAkJCURFQlVHOV8xMChwcmludGsoIiVzKCVsZCk6IE5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CiAJCQlicmVhazsKIAkJfQogCQlOVlJBTV9ERUxBWSgpOwpAQCAtMTUwLDggKzIzOCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLXFsYTJ4MDBfd3JpdGVfbnZyYW1fd29yZF90bW8oc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDE2X3QgZGF0YSwKLSAgICB1aW50MzJfdCB0bW8pCitxbGEyeDAwX3dyaXRlX252cmFtX3dvcmRfdG1vKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsCisJdWludDE2X3QgZGF0YSwgdWludDMyX3QgdG1vKQogewogCWludCByZXQsIGNvdW50OwogCXVpbnQxNl90IHdvcmQ7CkBAIC0yMDksMTAyICsyOTcsMTEgQEAKIH0KIAogLyoqCi0gKiBxbGEyeDAwX252cmFtX3JlcXVlc3QoKSAtIFNlbmRzIHJlYWQgY29tbWFuZCB0byBOVlJBTSBhbmQgZ2V0cyBkYXRhIGZyb20KLSAqCU5WUkFNLgotICogQGhhOiBIQSBjb250ZXh0Ci0gKiBAbnZfY21kOiBOVlJBTSBjb21tYW5kCi0gKgotICogQml0IGRlZmluaXRpb25zIGZvciBOVlJBTSBjb21tYW5kOgotICoKLSAqCUJpdCAyNiAgICAgPSBzdGFydCBiaXQKLSAqCUJpdCAyNSwgMjQgPSBvcGNvZGUKLSAqCUJpdCAyMy0xNiAgPSBhZGRyZXNzCi0gKglCaXQgMTUtMCAgID0gd3JpdGUgZGF0YQotICoKLSAqIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIG52cmFtIEBhZGRyLgotICovCi1zdGF0aWMgdWludDE2X3QKLXFsYTJ4MDBfbnZyYW1fcmVxdWVzdChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBudl9jbWQpCi17Ci0JdWludDhfdAkJY250OwotCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKLQl1aW50MTZfdAlkYXRhID0gMDsKLQl1aW50MTZfdAlyZWdfZGF0YTsKLQotCS8qIFNlbmQgY29tbWFuZCB0byBOVlJBTS4gKi8KLQludl9jbWQgPDw9IDU7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCAxMTsgY250KyspIHsKLQkJaWYgKG52X2NtZCAmIEJJVF8zMSkKLQkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7Ci0JCWVsc2UKLQkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOwotCQludl9jbWQgPDw9IDE7Ci0JfQotCi0JLyogUmVhZCBkYXRhIGZyb20gTlZSQU0uICovCi0JZm9yIChjbnQgPSAwOyBjbnQgPCAxNjsgY250KyspIHsKLQkJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfU0VMRUNUIHwgTlZSX0NMT0NLKTsKLQkJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkvKiBQQ0kgUG9zdGluZy4gKi8KLQkJTlZSQU1fREVMQVkoKTsKLQkJZGF0YSA8PD0gMTsKLQkJcmVnX2RhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7Ci0JCWlmIChyZWdfZGF0YSAmIE5WUl9EQVRBX0lOKQotCQkJZGF0YSB8PSBCSVRfMDsKLQkJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfU0VMRUNUKTsKLQkJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkvKiBQQ0kgUG9zdGluZy4gKi8KLQkJTlZSQU1fREVMQVkoKTsKLQl9Ci0KLQkvKiBEZXNlbGVjdCBjaGlwLiAqLwotCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX0RFU0VMRUNUKTsKLQlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQlOVlJBTV9ERUxBWSgpOwotCi0JcmV0dXJuIChkYXRhKTsKLX0KLQotLyoqCi0gKiBxbGEyeDAwX252X3dyaXRlKCkgLSBDbGVhbiBOVlJBTSBvcGVyYXRpb25zLgotICogQGhhOiBIQSBjb250ZXh0Ci0gKi8KLXN0YXRpYyB2b2lkCi1xbGEyeDAwX252X2Rlc2VsZWN0KHNjc2lfcWxhX2hvc3RfdCAqaGEpCi17Ci0Jc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwotCi0JV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfREVTRUxFQ1QpOwotCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLwotCU5WUkFNX0RFTEFZKCk7Ci19Ci0KLS8qKgotICogcWxhMngwMF9udl93cml0ZSgpIC0gUHJlcGFyZSBmb3IgTlZSQU0gcmVhZC93cml0ZSBvcGVyYXRpb24uCi0gKiBAaGE6IEhBIGNvbnRleHQKLSAqIEBkYXRhOiBTZXJpYWwgaW50ZXJmYWNlIHNlbGVjdG9yCi0gKi8KLXN0YXRpYyB2b2lkCi1xbGEyeDAwX252X3dyaXRlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGRhdGEpCi17Ci0Jc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwotCi0JV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZSX1NFTEVDVCB8IE5WUl9XUlRfRU5BQkxFKTsKLQlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQlOVlJBTV9ERUxBWSgpOwotCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WUl9TRUxFQ1R8IE5WUl9DTE9DSyB8Ci0JICAgIE5WUl9XUlRfRU5BQkxFKTsKLQlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KLQlOVlJBTV9ERUxBWSgpOwotCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WUl9TRUxFQ1QgfCBOVlJfV1JUX0VOQUJMRSk7Ci0JUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkJLyogUENJIFBvc3RpbmcuICovCi0JTlZSQU1fREVMQVkoKTsKLX0KLQotLyoqCiAgKiBxbGEyeDAwX2NsZWFyX252cmFtX3Byb3RlY3Rpb24oKSAtCiAgKiBAaGE6IEhBIGNvbnRleHQKICAqLwogc3RhdGljIGludAotcWxhMngwMF9jbGVhcl9udnJhbV9wcm90ZWN0aW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeDAwX2NsZWFyX252cmFtX3Byb3RlY3Rpb24oc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlpbnQgcmV0LCBzdGF0OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKQEAgLTM1Miw5ICszNDksOCBAQAogCQl3YWl0X2NudCA9IE5WUl9XQUlUX0NOVDsKIAkJZG8gewogCQkJaWYgKCEtLXdhaXRfY250KSB7Ci0JCQkJREVCVUc5XzEwKHByaW50aygiJXMoJWxkKTogTlZSQU0gZGlkbid0IGdvICIKLQkJCQkgICAgInJlYWR5Li4uXG4iLCBfX2Z1bmNfXywKLQkJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJCQlERUJVRzlfMTAocWxhX3ByaW50aygKKwkJCQkgICAgIk5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIikpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJTlZSQU1fREVMQVkoKTsKQEAgLTM3MCw3ICszNjYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcWxhMngwMF9zZXRfbnZyYW1fcHJvdGVjdGlvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCBpbnQgc3RhdCkKK3FsYTJ4MDBfc2V0X252cmFtX3Byb3RlY3Rpb24oc3RydWN0IHFsYV9od19kYXRhICpoYSwgaW50IHN0YXQpCiB7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXVpbnQzMl90IHdvcmQsIHdhaXRfY250OwpAQCAtNDEyLDggKzQwOCw3IEBACiAJd2FpdF9jbnQgPSBOVlJfV0FJVF9DTlQ7CiAJZG8gewogCQlpZiAoIS0td2FpdF9jbnQpIHsKLQkJCURFQlVHOV8xMChwcmludGsoIiVzKCVsZCk6IE5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHOV8xMChxbGFfcHJpbnRrKCJOVlJBTSBkaWRuJ3QgZ28gcmVhZHkuLi5cbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAJCU5WUkFNX0RFTEFZKCk7CkBAIC00NTQsNyArNDQ5LDcgQEAKIH0KIAogc3RhdGljIHVpbnQzMl90Ci1xbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkcikKK3FsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyKQogewogCWludCBydmFsOwogCXVpbnQzMl90IGNudCwgZGF0YTsKQEAgLTQ4MiwyMSArNDc3LDIwIEBACiB9CiAKIHVpbnQzMl90ICoKLXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90ICpkd3B0ciwgdWludDMyX3QgZmFkZHIsCitxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgKmR3cHRyLCB1aW50MzJfdCBmYWRkciwKICAgICB1aW50MzJfdCBkd29yZHMpCiB7CiAJdWludDMyX3QgaTsKLQogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7IGkrKywgZmFkZHIrKykKLQkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCisJCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKHZoYS0+aHcsCiAJCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSkpOwogCiAJcmV0dXJuIGR3cHRyOwogfQogCiBzdGF0aWMgaW50Ci1xbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGRhdGEpCitxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGRhdGEpCiB7CiAJaW50IHJ2YWw7CiAJdWludDMyX3QgY250OwpAQCAtNTE5LDcgKzUxMyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X2dldF9mbGFzaF9tYW51ZmFjdHVyZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDhfdCAqbWFuX2lkLAorcWxhMjR4eF9nZXRfZmxhc2hfbWFudWZhY3R1cmVyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQ4X3QgKm1hbl9pZCwKICAgICB1aW50OF90ICpmbGFzaF9pZCkKIHsKIAl1aW50MzJfdCBpZHM7CkBAIC01NDQsNyArNTM4LDcgQEAKIH0KIAogc3RhdGljIGludAotcWxhMnh4eF9maW5kX2ZsdF9zdGFydChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCAqc3RhcnQpCitxbGEyeHh4X2ZpbmRfZmx0X3N0YXJ0KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCAqc3RhcnQpCiB7CiAJY29uc3QgY2hhciAqbG9jLCAqbG9jYXRpb25zW10gPSB7ICJERUYiLCAiUENJIiB9OwogCXVpbnQzMl90IHBjaWhkciwgcGNpZHM7CkBAIC01NTIsNiArNTQ2LDggQEAKIAl1aW50OF90ICpidWYsICpiY29kZSwgbGFzdF9pbWFnZTsKIAl1aW50MTZfdCBjbnQsIGNoa3N1bSwgKndwdHI7CiAJc3RydWN0IHFsYV9mbHRfbG9jYXRpb24gKmZsdGw7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKIAkvKgogCSAqIEZMVC1sb2NhdGlvbiBzdHJ1Y3R1cmUgcmVzaWRlcyBhZnRlciB0aGUgbGFzdCBQQ0kgcmVnaW9uLgpAQCAtNTYzLDIwICs1NTksMjAgQEAKIAkgICAgRkFfRkxBU0hfTEFZT1VUX0FERFI7CiAKIAkvKiBCZWdpbiB3aXRoIGZpcnN0IFBDSSBleHBhbnNpb24gUk9NIGhlYWRlci4gKi8KLQlidWYgPSAodWludDhfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7Ci0JZGNvZGUgPSAodWludDMyX3QgKiloYS0+cmVxdWVzdF9yaW5nOworCWJ1ZiA9ICh1aW50OF90ICopcmVxLT5yaW5nOworCWRjb2RlID0gKHVpbnQzMl90ICopcmVxLT5yaW5nOwogCXBjaWhkciA9IDA7CiAJbGFzdF9pbWFnZSA9IDE7CiAJZG8gewogCQkvKiBWZXJpZnkgUENJIGV4cGFuc2lvbiBST00gaGVhZGVyLiAqLwotCQlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YShoYSwgZGNvZGUsIHBjaWhkciA+PiAyLCAweDIwKTsKKwkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkY29kZSwgcGNpaGRyID4+IDIsIDB4MjApOwogCQliY29kZSA9IGJ1ZiArIChwY2loZHIgJSA0KTsKIAkJaWYgKGJjb2RlWzB4MF0gIT0gMHg1NSB8fCBiY29kZVsweDFdICE9IDB4YWEpCiAJCQlnb3RvIGVuZDsKIAogCQkvKiBMb2NhdGUgUENJIGRhdGEgc3RydWN0dXJlLiAqLwogCQlwY2lkcyA9IHBjaWhkciArICgoYmNvZGVbMHgxOV0gPDwgOCkgfCBiY29kZVsweDE4XSk7Ci0JCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgcGNpZHMgPj4gMiwgMHgyMCk7CisJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIHBjaWRzID4+IDIsIDB4MjApOwogCQliY29kZSA9IGJ1ZiArIChwY2loZHIgJSA0KTsKIAogCQkvKiBWYWxpZGF0ZSBzaWduYXR1cmUgb2YgUENJIGRhdGEgc3RydWN0dXJlLiAqLwpAQCAtNTkxLDE0ICs1ODcsMTQgQEAKIAl9IHdoaWxlICghbGFzdF9pbWFnZSk7CiAKIAkvKiBOb3cgdmVyaWZ5IEZMVC1sb2NhdGlvbiBzdHJ1Y3R1cmUuICovCi0JZmx0bCA9IChzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbiAqKWhhLT5yZXF1ZXN0X3Jpbmc7Ci0JcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRjb2RlLCBwY2loZHIgPj4gMiwKKwlmbHRsID0gKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uICopcmVxLT5yaW5nOworCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIHBjaWhkciA+PiAyLAogCSAgICBzaXplb2Yoc3RydWN0IHFsYV9mbHRfbG9jYXRpb24pID4+IDIpOwogCWlmIChmbHRsLT5zaWdbMF0gIT0gJ1EnIHx8IGZsdGwtPnNpZ1sxXSAhPSAnRicgfHwKIAkgICAgZmx0bC0+c2lnWzJdICE9ICdMJyB8fCBmbHRsLT5zaWdbM10gIT0gJ1QnKQogCQlnb3RvIGVuZDsKIAotCXdwdHIgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOworCXdwdHIgPSAodWludDE2X3QgKilyZXEtPnJpbmc7CiAJY250ID0gc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uKSA+PiAxOwogCWZvciAoY2hrc3VtID0gMDsgY250OyBjbnQtLSkKIAkJY2hrc3VtICs9IGxlMTZfdG9fY3B1KCp3cHRyKyspOwpAQCAtNjE5LDcgKzYxNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeHh4X2dldF9mbHRfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBmbHRfYWRkcikKK3FsYTJ4eHhfZ2V0X2ZsdF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCBmbHRfYWRkcikKIHsKIAljb25zdCBjaGFyICpsb2MsICpsb2NhdGlvbnNbXSA9IHsgIkRFRiIsICJGTFQiIH07CiAJdWludDE2X3QgKndwdHI7CkBAIC02MjcsMTIgKzYyMywxNCBAQAogCXVpbnQzMl90IHN0YXJ0OwogCXN0cnVjdCBxbGFfZmx0X2hlYWRlciAqZmx0OwogCXN0cnVjdCBxbGFfZmx0X3JlZ2lvbiAqcmVnaW9uOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwogCiAJaGEtPmZsdF9yZWdpb25fZmx0ID0gZmx0X2FkZHI7Ci0Jd3B0ciA9ICh1aW50MTZfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7Ci0JZmx0ID0gKHN0cnVjdCBxbGFfZmx0X2hlYWRlciAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJd3B0ciA9ICh1aW50MTZfdCAqKXJlcS0+cmluZzsKKwlmbHQgPSAoc3RydWN0IHFsYV9mbHRfaGVhZGVyICopcmVxLT5yaW5nOwogCXJlZ2lvbiA9IChzdHJ1Y3QgcWxhX2ZsdF9yZWdpb24gKikmZmx0WzFdOwotCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbShoYSwgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAorCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsICh1aW50OF90ICopcmVxLT5yaW5nLAogCSAgICBmbHRfYWRkciA8PCAyLCBPUFRST01fQlVSU1RfU0laRSk7CiAJaWYgKCp3cHRyID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhmZmZmKSkKIAkJZ290byBub19mbGFzaF9kYXRhOwpAQCAtNzIwLDcgKzcxOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeHh4X2dldF9mZHRfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMnh4eF9nZXRfZmR0X2luZm8oc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAjZGVmaW5lIEZMQVNIX0JMS19TSVpFXzRLCTB4MTAwMAogI2RlZmluZSBGTEFTSF9CTEtfU0laRV8zMksJMHg4MDAwCkBAIC03MzEsMTAgKzcyOSwxMiBAQAogCXN0cnVjdCBxbGFfZmR0X2xheW91dCAqZmR0OwogCXVpbnQ4X3QJbWFuX2lkLCBmbGFzaF9pZDsKIAl1aW50MTZfdCBtaWQsIGZpZDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAotCXdwdHIgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOwotCWZkdCA9IChzdHJ1Y3QgcWxhX2ZkdF9sYXlvdXQgKiloYS0+cmVxdWVzdF9yaW5nOwotCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbShoYSwgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAorCXdwdHIgPSAodWludDE2X3QgKilyZXEtPnJpbmc7CisJZmR0ID0gKHN0cnVjdCBxbGFfZmR0X2xheW91dCAqKXJlcS0+cmluZzsKKwloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCAodWludDhfdCAqKXJlcS0+cmluZywKIAkgICAgaGEtPmZsdF9yZWdpb25fZmR0IDw8IDIsIE9QVFJPTV9CVVJTVF9TSVpFKTsKIAlpZiAoKndwdHIgPT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweGZmZmYpKQogCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CkBAIC04MDcsMzggKzgwNyw0MSBAQAogfQogCiBpbnQKLXFsYTJ4eHhfZ2V0X2ZsYXNoX2luZm8oc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4eHhfZ2V0X2ZsYXNoX2luZm8oc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJldDsKIAl1aW50MzJfdCBmbHRfYWRkcjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAotCXJldCA9IHFsYTJ4eHhfZmluZF9mbHRfc3RhcnQoaGEsICZmbHRfYWRkcik7CisJcmV0ID0gcWxhMnh4eF9maW5kX2ZsdF9zdGFydCh2aGEsICZmbHRfYWRkcik7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKIAkJcmV0dXJuIHJldDsKIAotCXFsYTJ4eHhfZ2V0X2ZsdF9pbmZvKGhhLCBmbHRfYWRkcik7Ci0JcWxhMnh4eF9nZXRfZmR0X2luZm8oaGEpOworCXFsYTJ4eHhfZ2V0X2ZsdF9pbmZvKHZoYSwgZmx0X2FkZHIpOworCXFsYTJ4eHhfZ2V0X2ZkdF9pbmZvKHZoYSk7CiAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKIHZvaWQKLXFsYTJ4eHhfZmxhc2hfbnBpdl9jb25mKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitxbGEyeHh4X2ZsYXNoX25waXZfY29uZihzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKICNkZWZpbmUgTlBJVl9DT05GSUdfU0laRQkoMTYqMTAyNCkKIAl2b2lkICpkYXRhOwogCXVpbnQxNl90ICp3cHRyOwogCXVpbnQxNl90IGNudCwgY2hrc3VtOworCWludCBpOwogCXN0cnVjdCBxbGFfbnBpdl9oZWFkZXIgaGRyOwogCXN0cnVjdCBxbGFfbnBpdl9lbnRyeSAqZW50cnk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgJiYgIUlTX1FMQTI1WFgoaGEpKQogCQlyZXR1cm47CiAKLQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20oaGEsICh1aW50OF90ICopJmhkciwKKwloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCAodWludDhfdCAqKSZoZHIsCiAJICAgIGhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA8PCAyLCBzaXplb2Yoc3RydWN0IHFsYV9ucGl2X2hlYWRlcikpOwogCWlmIChoZHIudmVyc2lvbiA9PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4ZmZmZikpCiAJCXJldHVybjsKQEAgLTg1Nyw3ICs4NjAsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKGhhLCAodWludDhfdCAqKWRhdGEsCisJaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKHZoYSwgKHVpbnQ4X3QgKilkYXRhLAogCSAgICBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPDwgMiwgTlBJVl9DT05GSUdfU0laRSk7CiAKIAljbnQgPSAoc2l6ZW9mKHN0cnVjdCBxbGFfbnBpdl9oZWFkZXIpICsgbGUxNl90b19jcHUoaGRyLmVudHJpZXMpICoKQEAgLTg3NCw3ICs4NzcsNyBAQAogCiAJZW50cnkgPSBkYXRhICsgc2l6ZW9mKHN0cnVjdCBxbGFfbnBpdl9oZWFkZXIpOwogCWNudCA9IGxlMTZfdG9fY3B1KGhkci5lbnRyaWVzKTsKLQlmb3IgKCA7IGNudDsgY250LS0sIGVudHJ5KyspIHsKKwlmb3IgKGkgPSAwOyBjbnQ7IGNudC0tLCBlbnRyeSsrLCBpKyspIHsKIAkJdWludDE2X3QgZmxhZ3M7CiAJCXN0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyB2aWQ7CiAJCXN0cnVjdCBmY192cG9ydCAqdnBvcnQ7CkBAIC04OTIsMjUgKzg5NSwyOSBAQAogCQl2aWQucG9ydF9uYW1lID0gd3duX3RvX3U2NChlbnRyeS0+cG9ydF9uYW1lKTsKIAkJdmlkLm5vZGVfbmFtZSA9IHd3bl90b191NjQoZW50cnktPm5vZGVfbmFtZSk7CiAKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJOUElWWyUwMnhdOiB3d3BuPSVsbHggIgotCQkgICAgInd3bm49JWxseCB2Zl9pZD0weCV4IHFvcz0weCV4LlxuIiwgY250LAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQucG9ydF9uYW1lLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lLAotCQkgICAgbGUxNl90b19jcHUoZW50cnktPnZmX2lkKSwgbGUxNl90b19jcHUoZW50cnktPnFvcykpKTsKKwkJbWVtY3B5KCZoYS0+bnBpdl9pbmZvW2ldLCBlbnRyeSwgc2l6ZW9mKHN0cnVjdCBxbGFfbnBpdl9lbnRyeSkpOwogCi0JCXZwb3J0ID0gZmNfdnBvcnRfY3JlYXRlKGhhLT5ob3N0LCAwLCAmdmlkKTsKLQkJaWYgKCF2cG9ydCkKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIk5QSVYtQ29uZmlnOiBGYWlsZWQgdG8gIgotCQkJICAgICJjcmVhdGUgdnBvcnQgWyUwMnhdOiB3d3BuPSVsbHggd3dubj0lbGx4LlxuIiwgY250LAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLnBvcnRfbmFtZSwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXZpZC5ub2RlX25hbWUpOworCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIk5QSVZbJTAyeF06IHd3cG49JWxseCAiCisJCQkid3dubj0lbGx4IHZmX2lkPTB4JXggUV9xb3M9MHgleCBGX3Fvcz0weCV4LlxuIiwgY250LAorCQkJdmlkLnBvcnRfbmFtZSwgdmlkLm5vZGVfbmFtZSwgbGUxNl90b19jcHUoZW50cnktPnZmX2lkKSwKKwkJCWVudHJ5LT5xX3FvcywgZW50cnktPmZfcW9zKSk7CisKKwkJaWYgKGkgPCBRTEFfUFJFQ09ORklHX1ZQT1JUUykgeworCQkJdnBvcnQgPSBmY192cG9ydF9jcmVhdGUodmhhLT5ob3N0LCAwLCAmdmlkKTsKKwkJCWlmICghdnBvcnQpCisJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSJOUElWLUNvbmZpZzogRmFpbGVkIHRvIGNyZWF0ZSB2cG9ydCBbJTAyeF06ICIKKwkJCQkid3dwbj0lbGx4IHd3bm49JWxseC5cbiIsIGNudCwKKwkJCQl2aWQucG9ydF9uYW1lLCB2aWQubm9kZV9uYW1lKTsKKwkJfQogCX0KIGRvbmU6CiAJa2ZyZWUoZGF0YSk7CisJaGEtPm5waXZfaW5mbyA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X3VucHJvdGVjdF9mbGFzaChzY3NpX3FsYV9ob3N0X3QgKmhhKQorcWxhMjR4eF91bnByb3RlY3RfZmxhc2goc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIApAQCAtOTI5LDcgKzkzNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyNHh4X3Byb3RlY3RfZmxhc2goc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTI0eHhfcHJvdGVjdF9mbGFzaChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCXVpbnQzMl90IGNudDsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKQEAgLTk1NSw3ICs5NjIsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyNHh4X3dyaXRlX2ZsYXNoX2RhdGEoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgKmR3cHRyLCB1aW50MzJfdCBmYWRkciwKK3FsYTI0eHhfd3JpdGVfZmxhc2hfZGF0YShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDMyX3QgKmR3cHRyLCB1aW50MzJfdCBmYWRkciwKICAgICB1aW50MzJfdCBkd29yZHMpCiB7CiAJaW50IHJldDsKQEAgLTk2NSw2ICs5NzIsNyBAQAogCWRtYV9hZGRyX3Qgb3B0cm9tX2RtYTsKIAl2b2lkICpvcHRyb20gPSBOVUxMOwogCXVpbnQzMl90ICpzLCAqZDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCXJldCA9IFFMQV9TVUNDRVNTOwogCkBAIC0xMDAyLDkgKzEwMTAsOCBAQAogCQkJICAgIChmZGF0YSAmIDB4ZmYwMCkgfCgoZmRhdGEgPDwgMTYpICYKIAkJCSAgICAweGZmMDAwMCkgfCAoKGZkYXRhID4+IDE2KSAmIDB4ZmYpKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCQlERUJVRzkocHJpbnRrKCIlcyglbGQpIFVuYWJsZSB0byBmbGFzaCAiCi0JCQkJICAgICJzZWN0b3I6IGFkZHJlc3M9JXguXG4iLCBfX2Z1bmNfXywKLQkJCQkgICAgaGEtPmhvc3Rfbm8sIGZhZGRyKSk7CisJCQkJREVCVUc5KHFsYV9wcmludGsoIlVuYWJsZSB0byBmbGFzaCBzZWN0b3I6ICIKKwkJCQkgICAgImFkZHJlc3M9JXguXG4iLCBmYWRkcikpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xMDE2LDcgKzEwMjMsNyBAQAogCQkJICAgIG1pdGVyIDwgT1BUUk9NX0JVUlNUX0RXT1JEUzsgbWl0ZXIrKywgcysrLCBkKyspCiAJCQkJKnMgPSBjcHVfdG9fbGUzMigqZCk7CiAKLQkJCXJldCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsIG9wdHJvbV9kbWEsCisJCQlyZXQgPSBxbGEyeDAwX2xvYWRfcmFtKHZoYSwgb3B0cm9tX2RtYSwKIAkJCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSwKIAkJCSAgICBPUFRST01fQlVSU1RfRFdPUkRTKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTEwNDQsNyArMTA1MSw3IEBACiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHOShwcmludGsoIiVzKCVsZCkgVW5hYmxlIHRvIHByb2dyYW0gZmxhc2ggIgogCQkJICAgICJhZGRyZXNzPSV4IGRhdGE9JXguXG4iLCBfX2Z1bmNfXywKLQkJCSAgICBoYS0+aG9zdF9ubywgZmFkZHIsICpkd3B0cikpOworCQkJICAgIHZoYS0+aG9zdF9ubywgZmFkZHIsICpkd3B0cikpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTA2NywxMSArMTA3NCwxMiBAQAogfQogCiB1aW50OF90ICoKLXFsYTJ4MDBfcmVhZF9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbmFkZHIsCitxbGEyeDAwX3JlYWRfbnZyYW1fZGF0YShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBuYWRkciwKICAgICB1aW50MzJfdCBieXRlcykKIHsKIAl1aW50MzJfdCBpOwogCXVpbnQxNl90ICp3cHRyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogV29yZCByZWFkcyB0byBOVlJBTSB2aWEgcmVnaXN0ZXJzLiAqLwogCXdwdHIgPSAodWludDE2X3QgKilidWY7CkBAIC0xMDg1LDcgKzEwOTMsNyBAQAogfQogCiB1aW50OF90ICoKLXFsYTI0eHhfcmVhZF9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbmFkZHIsCitxbGEyNHh4X3JlYWRfbnZyYW1fZGF0YShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBuYWRkciwKICAgICB1aW50MzJfdCBieXRlcykKIHsKIAl1aW50MzJfdCBpOwpAQCAtMTA5NCwyMCArMTEwMiwyMSBAQAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwogCWZvciAoaSA9IDA7IGkgPCBieXRlcyA+PiAyOyBpKyssIG5hZGRyKyspCi0JCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAorCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZCh2aGEtPmh3LAogCQkgICAgbnZyYW1fZGF0YV90b19hY2Nlc3NfYWRkcihuYWRkcikpKTsKIAogCXJldHVybiBidWY7CiB9CiAKIGludAotcWxhMngwMF93cml0ZV9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbmFkZHIsCitxbGEyeDAwX3dyaXRlX252cmFtX2RhdGEoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbmFkZHIsCiAgICAgdWludDMyX3QgYnl0ZXMpCiB7CiAJaW50IHJldCwgc3RhdDsKIAl1aW50MzJfdCBpOwogCXVpbnQxNl90ICp3cHRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlyZXQgPSBRTEFfU1VDQ0VTUzsKIApAQCAtMTEzNCwxMiArMTE0MywxMyBAQAogfQogCiBpbnQKLXFsYTI0eHhfd3JpdGVfbnZyYW1fZGF0YShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICpidWYsIHVpbnQzMl90IG5hZGRyLAorcWxhMjR4eF93cml0ZV9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50OF90ICpidWYsIHVpbnQzMl90IG5hZGRyLAogICAgIHVpbnQzMl90IGJ5dGVzKQogewogCWludCByZXQ7CiAJdWludDMyX3QgaTsKIAl1aW50MzJfdCAqZHdwdHI7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAKIAlyZXQgPSBRTEFfU1VDQ0VTUzsKQEAgLTExNjIsOSArMTE3Miw4IEBACiAJCSAgICBudnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKG5hZGRyKSwKIAkJICAgIGNwdV90b19sZTMyKCpkd3B0cikpOwogCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzkocHJpbnRrKCIlcyglbGQpIFVuYWJsZSB0byBwcm9ncmFtICIKLQkJCSAgICAibnZyYW0gYWRkcmVzcz0leCBkYXRhPSV4LlxuIiwgX19mdW5jX18sCi0JCQkgICAgaGEtPmhvc3Rfbm8sIG5hZGRyLCAqZHdwdHIpKTsKKwkJCURFQlVHOShxbGFfcHJpbnRrKCJVbmFibGUgdG8gcHJvZ3JhbSBudnJhbSBhZGRyZXNzPSV4ICIKKwkJCSAgICAiZGF0YT0leC5cbiIsIG5hZGRyLCAqZHdwdHIpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTE4MiwxMSArMTE5MSwxMiBAQAogfQogCiB1aW50OF90ICoKLXFsYTI1eHhfcmVhZF9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbmFkZHIsCitxbGEyNXh4X3JlYWRfbnZyYW1fZGF0YShzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBuYWRkciwKICAgICB1aW50MzJfdCBieXRlcykKIHsKIAl1aW50MzJfdCBpOwogCXVpbnQzMl90ICpkd3B0cjsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwpAQCAtMTE5OSwxOSArMTIwOSwyMCBAQAogfQogCiBpbnQKLXFsYTI1eHhfd3JpdGVfbnZyYW1fZGF0YShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICpidWYsIHVpbnQzMl90IG5hZGRyLAorcWxhMjV4eF93cml0ZV9udnJhbV9kYXRhKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50OF90ICpidWYsIHVpbnQzMl90IG5hZGRyLAogICAgIHVpbnQzMl90IGJ5dGVzKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogI2RlZmluZSBSTVdfQlVGRkVSX1NJWkUJKDY0ICogMTAyNCkKIAl1aW50OF90ICpkYnVmOwogCiAJZGJ1ZiA9IHZtYWxsb2MoUk1XX0JVRkZFUl9TSVpFKTsKIAlpZiAoIWRidWYpCiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKLQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20oaGEsIGRidWYsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA8PCAyLAorCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsIGRidWYsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA8PCAyLAogCSAgICBSTVdfQlVGRkVSX1NJWkUpOwogCW1lbWNweShkYnVmICsgKG5hZGRyIDw8IDIpLCBidWYsIGJ5dGVzKTsKLQloYS0+aXNwX29wcy0+d3JpdGVfb3B0cm9tKGhhLCBkYnVmLCBoYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0gPDwgMiwKKwloYS0+aXNwX29wcy0+d3JpdGVfb3B0cm9tKHZoYSwgZGJ1ZiwgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIDw8IDIsCiAJICAgIFJNV19CVUZGRVJfU0laRSk7CiAJdmZyZWUoZGJ1Zik7CiAKQEAgLTEyMTksNyArMTIzMCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMngwMF9mbGlwX2NvbG9ycyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCAqcGZsYWdzKQorcWxhMngwMF9mbGlwX2NvbG9ycyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MTZfdCAqcGZsYWdzKQogewogCWlmIChJU19RTEEyMzIyKGhhKSkgewogCQkvKiBGbGlwIGFsbCBjb2xvcnMuICovCkBAIC0xMjQ5LDEyICsxMjYwLDEzIEBACiAjZGVmaW5lIFBJT19SRUcoaCwgcikgKChoKS0+cGlvX2FkZHJlc3MgKyBvZmZzZXRvZihzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4LCByKSkKIAogdm9pZAotcWxhMngwMF9iZWFjb25fYmxpbmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorcWxhMngwMF9iZWFjb25fYmxpbmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKIAl1aW50MTZfdCBncGlvX2VuYWJsZTsKIAl1aW50MTZfdCBncGlvX2RhdGE7CiAJdWludDE2X3QgbGVkX2NvbG9yID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMTI5OCwxNyArMTMxMCwxOCBAQAogfQogCiBpbnQKLXFsYTJ4MDBfYmVhY29uX29uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTJ4MDBfYmVhY29uX29uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEpCiB7CiAJdWludDE2X3QgZ3Bpb19lbmFibGU7CiAJdWludDE2X3QgZ3Bpb19kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCiAJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkZPMV9TRVRfRU1QSEFTSVNfU1dJTkc7CiAJaGEtPmZ3X29wdGlvbnNbMV0gfD0gRk8xX0RJU0FCTEVfR1BJTzZfNzsKIAotCWlmIChxbGEyeDAwX3NldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpIHsKKwlpZiAocWxhMngwMF9zZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKSAhPSBRTEFfU1VDQ0VTUykgewogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMTM1NCw5ICsxMzY3LDEwIEBACiB9CiAKIGludAotcWxhMngwMF9iZWFjb25fb2ZmKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTJ4MDBfYmVhY29uX29mZihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogewogCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAloYS0+YmVhY29uX2JsaW5rX2xlZCA9IDA7CiAKQEAgLTEzNjYsMTIgKzEzODAsMTIgQEAKIAllbHNlCiAJCWhhLT5iZWFjb25fY29sb3Jfc3RhdGUgPSBRTEFfTEVEX0dSTl9PTjsKIAotCWhhLT5pc3Bfb3BzLT5iZWFjb25fYmxpbmsoaGEpOwkvKiBUaGlzIHR1cm5zIGdyZWVuIExFRCBvZmYgKi8KKwloYS0+aXNwX29wcy0+YmVhY29uX2JsaW5rKHZoYSk7CS8qIFRoaXMgdHVybnMgZ3JlZW4gTEVEIG9mZiAqLwogCiAJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkZPMV9TRVRfRU1QSEFTSVNfU1dJTkc7CiAJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkZPMV9ESVNBQkxFX0dQSU82Xzc7CiAKLQlydmFsID0gcWxhMngwMF9zZXRfZndfb3B0aW9ucyhoYSwgaGEtPmZ3X29wdGlvbnMpOworCXJ2YWwgPSBxbGEyeDAwX3NldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCiAJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb2ZmKS5cbiIpOwpAQCAtMTM4MCw3ICsxMzk0LDcgQEAKIAogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXFsYTI0eHhfZmxpcF9jb2xvcnMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgKnBmbGFncykKK3FsYTI0eHhfZmxpcF9jb2xvcnMoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDE2X3QgKnBmbGFncykKIHsKIAkvKiBGbGlwIGFsbCBjb2xvcnMuICovCiAJaWYgKGhhLT5iZWFjb25fY29sb3Jfc3RhdGUgPT0gUUxBX0xFRF9BTExfT04pIHsKQEAgLTEzOTUsMTEgKzE0MDksMTIgQEAKIH0KIAogdm9pZAotcWxhMjR4eF9iZWFjb25fYmxpbmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorcWxhMjR4eF9iZWFjb25fYmxpbmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKIAl1aW50MTZfdCBsZWRfY29sb3IgPSAwOwogCXVpbnQzMl90IGdwaW9fZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCiAJLyogU2F2ZSB0aGUgT3JpZ2luYWwgR1BJT0QuICovCkBAIC0xNDI4LDIwICsxNDQzLDIxIEBACiB9CiAKIGludAotcWxhMjR4eF9iZWFjb25fb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQorcWxhMjR4eF9iZWFjb25fb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKIAl1aW50MzJfdCBncGlvX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAogCWlmIChoYS0+YmVhY29uX2JsaW5rX2xlZCA9PSAwKSB7CiAJCS8qIEVuYWJsZSBmaXJtd2FyZSBmb3IgdXBkYXRlICovCiAJCWhhLT5md19vcHRpb25zWzFdIHw9IEFERF9GTzFfRElTQUJMRV9HUElPX0xFRF9DVFJMOwogCi0JCWlmIChxbGEyeDAwX3NldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpCisJCWlmIChxbGEyeDAwX3NldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpICE9IFFMQV9TVUNDRVNTKQogCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQkJaWYgKHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoaGEsIGhhLT5md19vcHRpb25zKSAhPQorCQlpZiAocWxhMngwMF9nZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKSAhPQogCQkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CkBAIC0xNDY5LDE2ICsxNDg1LDE3IEBACiB9CiAKIGludAotcWxhMjR4eF9iZWFjb25fb2ZmKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTI0eHhfYmVhY29uX29mZihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogewogCXVpbnQzMl90IGdwaW9fZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCiAJaGEtPmJlYWNvbl9ibGlua19sZWQgPSAwOwogCWhhLT5iZWFjb25fY29sb3Jfc3RhdGUgPSBRTEFfTEVEX0FMTF9PTjsKIAotCWhhLT5pc3Bfb3BzLT5iZWFjb25fYmxpbmsoaGEpOwkvKiBXaWxsIGZsaXAgdG8gYWxsIG9mZi4gKi8KKwloYS0+aXNwX29wcy0+YmVhY29uX2JsaW5rKHZoYSk7CS8qIFdpbGwgZmxpcCB0byBhbGwgb2ZmLiAqLwogCiAJLyogR2l2ZSBjb250cm9sIGJhY2sgdG8gZmlybXdhcmUuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CkBAIC0xNDkyLDEzICsxNTA5LDEzIEBACiAKIAloYS0+Zndfb3B0aW9uc1sxXSAmPSB+QUREX0ZPMV9ESVNBQkxFX0dQSU9fTEVEX0NUUkw7CiAKLQlpZiAocWxhMngwMF9zZXRfZndfb3B0aW9ucyhoYSwgaGEtPmZ3X29wdGlvbnMpICE9IFFMQV9TVUNDRVNTKSB7CisJaWYgKHFsYTJ4MDBfc2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgZncgb3B0aW9ucyAoYmVhY29uIG9mZikuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCi0JaWYgKHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoaGEsIGhhLT5md19vcHRpb25zKSAhPSBRTEFfU1VDQ0VTUykgeworCWlmIChxbGEyeDAwX2dldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpICE9IFFMQV9TVUNDRVNTKSB7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJICAgICJVbmFibGUgdG8gZ2V0IGZ3IG9wdGlvbnMgKGJlYWNvbiBvZmYpLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMTUxNyw3ICsxNTM0LDcgQEAKICAqIEBoYTogSEEgY29udGV4dAogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9mbGFzaF9lbmFibGUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZmxhc2hfZW5hYmxlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJdWludDE2X3QgZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CkBAIC0xNTMzLDcgKzE1NTAsNyBAQAogICogQGhhOiBIQSBjb250ZXh0CiAgKi8KIHN0YXRpYyB2b2lkCi1xbGEyeDAwX2ZsYXNoX2Rpc2FibGUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3FsYTJ4MDBfZmxhc2hfZGlzYWJsZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogewogCXVpbnQxNl90IGRhdGE7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwpAQCAtMTU1NCw3ICsxNTcxLDcgQEAKICAqIFJldHVybnMgdGhlIGJ5dGUgcmVhZCBmcm9tIGZsYXNoIEBhZGRyLgogICovCiBzdGF0aWMgdWludDhfdAotcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkcikKK3FsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGFkZHIpCiB7CiAJdWludDE2X3QgZGF0YTsKIAl1aW50MTZfdCBiYW5rX3NlbGVjdDsKQEAgLTE2MTUsNyArMTYzMiw3IEBACiAgKiBAZGF0YTogRGF0YSB0byB3cml0ZQogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF93cml0ZV9mbGFzaF9ieXRlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgZGF0YSkKK3FsYTJ4MDBfd3JpdGVfZmxhc2hfYnl0ZShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBhZGRyLCB1aW50OF90IGRhdGEpCiB7CiAJdWludDE2X3QgYmFua19zZWxlY3Q7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwpAQCAtMTY3OCw3ICsxNjk1LDcgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlbHNlIG5vbi16ZXJvLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX3BvbGxfZmxhc2goc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDhfdCBwb2xsX2RhdGEsCitxbGEyeDAwX3BvbGxfZmxhc2goc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgYWRkciwgdWludDhfdCBwb2xsX2RhdGEsCiAgICAgdWludDhfdCBtYW5faWQsIHVpbnQ4X3QgZmxhc2hfaWQpCiB7CiAJaW50IHN0YXR1czsKQEAgLTE3MTgsOCArMTczNSw4IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBub24temVyby4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9wcm9ncmFtX2ZsYXNoX2FkZHJlc3Moc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDhfdCBkYXRhLAotICAgIHVpbnQ4X3QgbWFuX2lkLCB1aW50OF90IGZsYXNoX2lkKQorcWxhMngwMF9wcm9ncmFtX2ZsYXNoX2FkZHJlc3Moc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgYWRkciwKKyAgICB1aW50OF90IGRhdGEsIHVpbnQ4X3QgbWFuX2lkLCB1aW50OF90IGZsYXNoX2lkKQogewogCS8qIFdyaXRlIFByb2dyYW0gQ29tbWFuZCBTZXF1ZW5jZS4gKi8KIAlpZiAoSVNfT0VNXzAwMShoYSkpIHsKQEAgLTE3NTUsNyArMTc3Miw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBub24temVyby4KICAqLwogc3RhdGljIGludAotcWxhMngwMF9lcmFzZV9mbGFzaChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90IG1hbl9pZCwgdWludDhfdCBmbGFzaF9pZCkKK3FsYTJ4MDBfZXJhc2VfZmxhc2goc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDhfdCBtYW5faWQsIHVpbnQ4X3QgZmxhc2hfaWQpCiB7CiAJLyogSW5kaXZpZHVhbCBTZWN0b3IgRXJhc2UgQ29tbWFuZCBTZXF1ZW5jZSAqLwogCWlmIChJU19PRU1fMDAxKGhhKSkgewpAQCAtMTc5MSw3ICsxODA4LDcgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlbHNlIG5vbi16ZXJvLgogICovCiBzdGF0aWMgaW50Ci1xbGEyeDAwX2VyYXNlX2ZsYXNoX3NlY3RvcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBhZGRyLAorcWxhMngwMF9lcmFzZV9mbGFzaF9zZWN0b3Ioc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgYWRkciwKICAgICB1aW50MzJfdCBzZWNfbWFzaywgdWludDhfdCBtYW5faWQsIHVpbnQ4X3QgZmxhc2hfaWQpCiB7CiAJLyogSW5kaXZpZHVhbCBTZWN0b3IgRXJhc2UgQ29tbWFuZCBTZXF1ZW5jZSAqLwpAQCAtMTgxNyw3ICsxODM0LDcgQEAKICAqIEBmbGFzaF9pZDogRmxhc2ggSUQKICAqLwogc3RhdGljIHZvaWQKLXFsYTJ4MDBfZ2V0X2ZsYXNoX21hbnVmYWN0dXJlcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICptYW5faWQsCitxbGEyeDAwX2dldF9mbGFzaF9tYW51ZmFjdHVyZXIoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDhfdCAqbWFuX2lkLAogICAgIHVpbnQ4X3QgKmZsYXNoX2lkKQogewogCXFsYTJ4MDBfd3JpdGVfZmxhc2hfYnl0ZShoYSwgMHg1NTU1LCAweGFhKTsKQEAgLTE4MzEsOCArMTg0OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xbGEyeDAwX3JlYWRfZmxhc2hfZGF0YShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50OF90ICp0bXBfYnVmLCB1aW50MzJfdCBzYWRkciwKLSAgICAgICAgdWludDMyX3QgbGVuZ3RoKQorcWxhMngwMF9yZWFkX2ZsYXNoX2RhdGEoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDhfdCAqdG1wX2J1ZiwKKwl1aW50MzJfdCBzYWRkciwgdWludDMyX3QgbGVuZ3RoKQogewogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MzJfdCBtaWRwb2ludCwgaWxlbmd0aDsKQEAgLTE4NTYsMTQgKzE4NzMsMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1xbGEyeDAwX3N1c3BlbmRfaGJhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTJ4MDBfc3VzcGVuZF9oYmEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKIAlpbnQgY250OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCiAJLyogU3VzcGVuZCBIQkEuICovCi0Jc2NzaV9ibG9ja19yZXF1ZXN0cyhoYS0+aG9zdCk7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOwogCWhhLT5pc3Bfb3BzLT5kaXNhYmxlX2ludHJzKGhhKTsKIAlzZXRfYml0KE1CWF9VUERBVEVfRkxBU0hfQUNUSVZFLCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCkBAIC0xODg0LDI2ICsxOTAyLDI5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcWxhMngwMF9yZXN1bWVfaGJhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3FsYTJ4MDBfcmVzdW1lX2hiYShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQogeworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCiAJLyogUmVzdW1lIEhCQS4gKi8KIAljbGVhcl9iaXQoTUJYX1VQREFURV9GTEFTSF9BQ1RJVkUsICZoYS0+bWJ4X2NtZF9mbGFncyk7Ci0Jc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JcWxhMnh4eF93YWtlX2RwYyhoYSk7Ci0JcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKTsKLQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaGEtPmhvc3QpOworCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CisJcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiB9CiAKIHVpbnQ4X3QgKgotcWxhMngwMF9yZWFkX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCAqYnVmLAorcWxhMngwMF9yZWFkX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHVpbnQ4X3QgKmJ1ZiwKICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbmd0aCkKIHsKIAl1aW50MzJfdCBhZGRyLCBtaWRwb2ludDsKIAl1aW50OF90ICpkYXRhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAogCS8qIFN1c3BlbmQgSEJBLiAqLwotCXFsYTJ4MDBfc3VzcGVuZF9oYmEoaGEpOworCXFsYTJ4MDBfc3VzcGVuZF9oYmEodmhhKTsKIAogCS8qIEdvIHdpdGggcmVhZC4gKi8KIAltaWRwb2ludCA9IGhhLT5vcHRyb21fc2l6ZSAvIDI7CkBAIC0xOTIyLDEzICsxOTQzLDEzIEBACiAJcWxhMngwMF9mbGFzaF9kaXNhYmxlKGhhKTsKIAogCS8qIFJlc3VtZSBIQkEuICovCi0JcWxhMngwMF9yZXN1bWVfaGJhKGhhKTsKKwlxbGEyeDAwX3Jlc3VtZV9oYmEodmhhKTsKIAogCXJldHVybiBidWY7CiB9CiAKIGludAotcWxhMngwMF93cml0ZV9vcHRyb21fZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQ4X3QgKmJ1ZiwKK3FsYTJ4MDBfd3JpdGVfb3B0cm9tX2RhdGEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgdWludDhfdCAqYnVmLAogICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuZ3RoKQogewogCkBAIC0xOTM2LDEwICsxOTU3LDExIEBACiAJdWludDhfdCBtYW5faWQsIGZsYXNoX2lkLCBzZWNfbnVtYmVyLCBkYXRhOwogCXVpbnQxNl90IHdkOwogCXVpbnQzMl90IGFkZHIsIGxpdGVyLCBzZWNfbWFzaywgcmVzdF9hZGRyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAogCS8qIFN1c3BlbmQgSEJBLiAqLwotCXFsYTJ4MDBfc3VzcGVuZF9oYmEoaGEpOworCXFsYTJ4MDBfc3VzcGVuZF9oYmEodmhhKTsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlzZWNfbnVtYmVyID0gMDsKQEAgLTIxMzksNTUgKzIxNjEsNTggQEAKIAlxbGEyeDAwX2ZsYXNoX2Rpc2FibGUoaGEpOwogCiAJLyogUmVzdW1lIEhCQS4gKi8KLQlxbGEyeDAwX3Jlc3VtZV9oYmEoaGEpOworCXFsYTJ4MDBfcmVzdW1lX2hiYSh2aGEpOwogCiAJcmV0dXJuIHJ2YWw7CiB9CiAKIHVpbnQ4X3QgKgotcWxhMjR4eF9yZWFkX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCAqYnVmLAorcWxhMjR4eF9yZWFkX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEsIHVpbnQ4X3QgKmJ1ZiwKICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbmd0aCkKIHsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwogCS8qIFN1c3BlbmQgSEJBLiAqLwotCXNjc2lfYmxvY2tfcmVxdWVzdHMoaGEtPmhvc3QpOworCXNjc2lfYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKIAlzZXRfYml0KE1CWF9VUERBVEVfRkxBU0hfQUNUSVZFLCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCiAJLyogR28gd2l0aCByZWFkLiAqLwotCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCAodWludDMyX3QgKilidWYsIG9mZnNldCA+PiAyLCBsZW5ndGggPj4gMik7CisJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCAodWludDMyX3QgKilidWYsIG9mZnNldCA+PiAyLCBsZW5ndGggPj4gMik7CiAKIAkvKiBSZXN1bWUgSEJBLiAqLwogCWNsZWFyX2JpdChNQlhfVVBEQVRFX0ZMQVNIX0FDVElWRSwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKLQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaGEtPmhvc3QpOworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KIAogaW50Ci1xbGEyNHh4X3dyaXRlX29wdHJvbV9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDhfdCAqYnVmLAorcWxhMjR4eF93cml0ZV9vcHRyb21fZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCB1aW50OF90ICpidWYsCiAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsZW5ndGgpCiB7CiAJaW50IHJ2YWw7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAkvKiBTdXNwZW5kIEhCQS4gKi8KLQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGhhLT5ob3N0KTsKKwlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJc2V0X2JpdChNQlhfVVBEQVRFX0ZMQVNIX0FDVElWRSwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKIAogCS8qIEdvIHdpdGggd3JpdGUuICovCi0JcnZhbCA9IHFsYTI0eHhfd3JpdGVfZmxhc2hfZGF0YShoYSwgKHVpbnQzMl90ICopYnVmLCBvZmZzZXQgPj4gMiwKKwlydmFsID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kYXRhKHZoYSwgKHVpbnQzMl90ICopYnVmLCBvZmZzZXQgPj4gMiwKIAkgICAgbGVuZ3RoID4+IDIpOwogCiAJLyogUmVzdW1lIEhCQSAtLSBSSVNDIHJlc2V0IG5lZWRlZC4gKi8KIAljbGVhcl9iaXQoTUJYX1VQREFURV9GTEFTSF9BQ1RJVkUsICZoYS0+bWJ4X2NtZF9mbGFncyk7Ci0Jc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7Ci0JcWxhMnh4eF93YWtlX2RwYyhoYSk7Ci0JcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKTsKLQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaGEtPmhvc3QpOworCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CisJcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAKIAlyZXR1cm4gcnZhbDsKIH0KIAogdWludDhfdCAqCi1xbGEyNXh4X3JlYWRfb3B0cm9tX2RhdGEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50OF90ICpidWYsCitxbGEyNXh4X3JlYWRfb3B0cm9tX2RhdGEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgdWludDhfdCAqYnVmLAogICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuZ3RoKQogewogCWludCBydmFsOwpAQCAtMjE5NSw2ICsyMjIwLDcgQEAKIAl2b2lkICpvcHRyb207CiAJdWludDhfdCAqcGJ1ZjsKIAl1aW50MzJfdCBmYWRkciwgbGVmdCwgYnVyc3Q7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAob2Zmc2V0ICYgMHhmZmYpCiAJCWdvdG8gc2xvd19yZWFkOwpAQCAtMjIxOSw3ICsyMjQ1LDcgQEAKIAkJaWYgKGJ1cnN0ID4gbGVmdCkKIAkJCWJ1cnN0ID0gbGVmdDsKIAotCQlydmFsID0gcWxhMngwMF9kdW1wX3JhbShoYSwgb3B0cm9tX2RtYSwKKwkJcnZhbCA9IHFsYTJ4MDBfZHVtcF9yYW0odmhhLCBvcHRyb21fZG1hLAogCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksIGJ1cnN0KTsKIAkJaWYgKHJ2YWwpIHsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKQEAgLTIyNDgsNyArMjI3NCw3IEBACiAJcmV0dXJuIGJ1ZjsKIAogc2xvd19yZWFkOgotICAgIHJldHVybiBxbGEyNHh4X3JlYWRfb3B0cm9tX2RhdGEoaGEsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHJldHVybiBxbGEyNHh4X3JlYWRfb3B0cm9tX2RhdGEodmhhLCBidWYsIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAogLyoqCkBAIC0yMjcwLDcgKzIyOTYsNyBAQAogICogUmV0dXJucyBRTEFfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIHJldHJpZXZhbCBvZiB2ZXJzaW9uLgogICovCiBzdGF0aWMgdm9pZAotcWxhMngwMF9nZXRfZmNvZGVfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBwY2lkcykKK3FsYTJ4MDBfZ2V0X2Zjb2RlX3ZlcnNpb24oc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgcGNpZHMpCiB7CiAJaW50IHJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJdWludDMyX3QgaXN0YXJ0LCBpZW5kLCBpdGVyLCB2ZW5kOwpAQCAtMjM0NCwxMyArMjM3MCwxNCBAQAogfQogCiBpbnQKLXFsYTJ4MDBfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICpoYSwgdm9pZCAqbWJ1ZikKK3FsYTJ4MDBfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICp2aGEsIHZvaWQgKm1idWYpCiB7CiAJaW50IHJldCA9IFFMQV9TVUNDRVNTOwogCXVpbnQ4X3QgY29kZV90eXBlLCBsYXN0X2ltYWdlOwogCXVpbnQzMl90IHBjaWhkciwgcGNpZHM7CiAJdWludDhfdCAqZGJ5dGU7CiAJdWludDE2X3QgKmRjb2RlOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCFoYS0+cGlvX2FkZHJlc3MgfHwgIW1idWYpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMjM3MCw4ICsyMzk3LDggQEAKIAkJaWYgKHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2loZHIpICE9IDB4NTUgfHwKIAkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2loZHIgKyAweDAxKSAhPSAweGFhKSB7CiAJCQkvKiBObyBzaWduYXR1cmUgKi8KLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTm8gbWF0Y2hpbmcgUk9NICIKLQkJCSAgICAic2lnbmF0dXJlLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiTm8gbWF0Y2hpbmcgUk9NICIKKwkJCSAgICAic2lnbmF0dXJlLlxuIikpOwogCQkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMzg3LDggKzI0MTQsOCBAQAogCQkgICAgcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWRzICsgMHgyKSAhPSAnSScgfHwKIAkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MykgIT0gJ1InKSB7CiAJCQkvKiBJbmNvcnJlY3QgaGVhZGVyLiAqLwotCQkJREVCVUcyKHByaW50aygiJXMoKTogUENJIGRhdGEgc3RydWN0IG5vdCBmb3VuZCAiCi0JCQkgICAgInBjaXJfYWRyPSV4LlxuIiwgX19mdW5jX18sIHBjaWRzKSk7CisJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUENJIGRhdGEgc3RydWN0IG5vdCAiCisJCQkgICAgImZvdW5kIHBjaXJfYWRyPSV4LlxuIiwgcGNpZHMpKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjQwMiw3ICsyNDI5LDcgQEAKIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEyKTsKIAkJCWhhLT5iaW9zX3JldmlzaW9uWzFdID0KIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEzKTsKLQkJCURFQlVHMyhwcmludGsoIiVzKCk6IHJlYWQgQklPUyAlZC4lZC5cbiIsIF9fZnVuY19fLAorCQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJyZWFkIEJJT1MgJWQuJWQuXG4iLAogCQkJICAgIGhhLT5iaW9zX3JldmlzaW9uWzFdLCBoYS0+Ymlvc19yZXZpc2lvblswXSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgUk9NX0NPREVfVFlQRV9GQ09ERToKQEAgLTI0MTYsMTIgKzI0NDMsMTIgQEAKIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEyKTsKIAkJCWhhLT5lZmlfcmV2aXNpb25bMV0gPQogCQkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MTMpOwotCQkJREVCVUczKHByaW50aygiJXMoKTogcmVhZCBFRkkgJWQuJWQuXG4iLCBfX2Z1bmNfXywKKwkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBFRkkgJWQuJWQuXG4iLAogCQkJICAgIGhhLT5lZmlfcmV2aXNpb25bMV0sIGhhLT5lZmlfcmV2aXNpb25bMF0pKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyKHByaW50aygiJXMoKTogVW5yZWNvZ25pemVkIGNvZGUgdHlwZSAleCBhdCAiCi0JCQkgICAgInBjaWRzICV4LlxuIiwgX19mdW5jX18sIGNvZGVfdHlwZSwgcGNpZHMpKTsKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnJlY29nbml6ZWQgY29kZSAiCisJCQkgICAgInR5cGUgJXggYXQgcGNpZHMgJXguXG4iLCBjb2RlX3R5cGUsIHBjaWRzKSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yNDQxLDE2ICsyNDY4LDE2IEBACiAKIAkJcWxhMngwMF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRieXRlLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQgKyAxMCwKIAkJICAgIDgpOwotCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkdW1waW5nIGZ3IHZlciBmcm9tIGZsYXNoOlxuIiwKLQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgImR1bXBpbmcgZncgdmVyIGZyb20gIgorCQkgICAgImZsYXNoOlxuIikpOwogCQlERUJVRzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWRieXRlLCA4KSk7CiAKIAkJaWYgKChkY29kZVswXSA9PSAweGZmZmYgJiYgZGNvZGVbMV0gPT0gMHhmZmZmICYmCiAJCSAgICBkY29kZVsyXSA9PSAweGZmZmYgJiYgZGNvZGVbM10gPT0gMHhmZmZmKSB8fAogCQkgICAgKGRjb2RlWzBdID09IDAgJiYgZGNvZGVbMV0gPT0gMCAmJiBkY29kZVsyXSA9PSAwICYmCiAJCSAgICBkY29kZVszXSA9PSAwKSkgewotCQkJREVCVUcyKHByaW50aygiJXMoKTogVW5yZWNvZ25pemVkIGZ3IHJldmlzaW9uIGF0ICIKLQkJCSAgICAiJXguXG4iLCBfX2Z1bmNfXywgaGEtPmZsdF9yZWdpb25fZncgKiA0KSk7CisJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5yZWNvZ25pemVkIGZ3ICIKKwkJCSAgICAicmV2aXNpb24gYXQgJXguXG4iLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHZhbHVlcyBhcmUgaW4gYmlnIGVuZGlhbiAqLwogCQkJaGEtPmZ3X3JldmlzaW9uWzBdID0gZGJ5dGVbMF0gPDwgMTYgfCBkYnl0ZVsxXTsKQEAgLTI0NjUsNyArMjQ5Miw3IEBACiB9CiAKIGludAotcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB2b2lkICptYnVmKQorcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdm9pZCAqbWJ1ZikKIHsKIAlpbnQgcmV0ID0gUUxBX1NVQ0NFU1M7CiAJdWludDMyX3QgcGNpaGRyLCBwY2lkczsKQEAgLTI0NzMsNiArMjUwMCw3IEBACiAJdWludDhfdCAqYmNvZGU7CiAJdWludDhfdCBjb2RlX3R5cGUsIGxhc3RfaW1hZ2U7CiAJaW50IGk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIW1idWYpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMjQ4OSwxMiArMjUxNywxMiBAQAogCWxhc3RfaW1hZ2UgPSAxOwogCWRvIHsKIAkJLyogVmVyaWZ5IFBDSSBleHBhbnNpb24gUk9NIGhlYWRlci4gKi8KLQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRjb2RlLCBwY2loZHIgPj4gMiwgMHgyMCk7CisJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIHBjaWhkciA+PiAyLCAweDIwKTsKIAkJYmNvZGUgPSBtYnVmICsgKHBjaWhkciAlIDQpOwogCQlpZiAoYmNvZGVbMHgwXSAhPSAweDU1IHx8IGJjb2RlWzB4MV0gIT0gMHhhYSkgewogCQkJLyogTm8gc2lnbmF0dXJlICovCi0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IE5vIG1hdGNoaW5nIFJPTSAiCi0JCQkgICAgInNpZ25hdHVyZS5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIk5vIG1hdGNoaW5nIFJPTSAiCisJCQkgICAgInNpZ25hdHVyZS5cbiIpKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjUwMiwxNSArMjUzMCwxNSBAQAogCQkvKiBMb2NhdGUgUENJIGRhdGEgc3RydWN0dXJlLiAqLwogCQlwY2lkcyA9IHBjaWhkciArICgoYmNvZGVbMHgxOV0gPDwgOCkgfCBiY29kZVsweDE4XSk7CiAKLQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRjb2RlLCBwY2lkcyA+PiAyLCAweDIwKTsKKwkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkY29kZSwgcGNpZHMgPj4gMiwgMHgyMCk7CiAJCWJjb2RlID0gbWJ1ZiArIChwY2loZHIgJSA0KTsKIAogCQkvKiBWYWxpZGF0ZSBzaWduYXR1cmUgb2YgUENJIGRhdGEgc3RydWN0dXJlLiAqLwogCQlpZiAoYmNvZGVbMHgwXSAhPSAnUCcgfHwgYmNvZGVbMHgxXSAhPSAnQycgfHwKIAkJICAgIGJjb2RlWzB4Ml0gIT0gJ0knIHx8IGJjb2RlWzB4M10gIT0gJ1InKSB7CiAJCQkvKiBJbmNvcnJlY3QgaGVhZGVyLiAqLwotCQkJREVCVUcyKHByaW50aygiJXMoKTogUENJIGRhdGEgc3RydWN0IG5vdCBmb3VuZCAiCi0JCQkgICAgInBjaXJfYWRyPSV4LlxuIiwgX19mdW5jX18sIHBjaWRzKSk7CisJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUENJIGRhdGEgc3RydWN0IG5vdCAiCisJCQkgICAgImZvdW5kIHBjaXJfYWRyPSV4LlxuIiwgcGNpZHMpKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjUyMiwyNiArMjU1MCwyNiBAQAogCQkJLyogSW50ZWwgeDg2LCBQQy1BVCBjb21wYXRpYmxlLiAqLwogCQkJaGEtPmJpb3NfcmV2aXNpb25bMF0gPSBiY29kZVsweDEyXTsKIAkJCWhhLT5iaW9zX3JldmlzaW9uWzFdID0gYmNvZGVbMHgxM107Ci0JCQlERUJVRzMocHJpbnRrKCIlcygpOiByZWFkIEJJT1MgJWQuJWQuXG4iLCBfX2Z1bmNfXywKKwkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBCSU9TICVkLiVkLlxuIiwKIAkJCSAgICBoYS0+Ymlvc19yZXZpc2lvblsxXSwgaGEtPmJpb3NfcmV2aXNpb25bMF0pKTsKIAkJCWJyZWFrOwogCQljYXNlIFJPTV9DT0RFX1RZUEVfRkNPREU6CiAJCQkvKiBPcGVuIEZpcm13YXJlIHN0YW5kYXJkIGZvciBQQ0kgKEZDb2RlKS4gKi8KIAkJCWhhLT5mY29kZV9yZXZpc2lvblswXSA9IGJjb2RlWzB4MTJdOwogCQkJaGEtPmZjb2RlX3JldmlzaW9uWzFdID0gYmNvZGVbMHgxM107Ci0JCQlERUJVRzMocHJpbnRrKCIlcygpOiByZWFkIEZDT0RFICVkLiVkLlxuIiwgX19mdW5jX18sCisJCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgInJlYWQgRkNPREUgJWQuJWQuXG4iLAogCQkJICAgIGhhLT5mY29kZV9yZXZpc2lvblsxXSwgaGEtPmZjb2RlX3JldmlzaW9uWzBdKSk7CiAJCQlicmVhazsKIAkJY2FzZSBST01fQ09ERV9UWVBFX0VGSToKIAkJCS8qIEV4dGVuc2libGUgRmlybXdhcmUgSW50ZXJmYWNlIChFRkkpLiAqLwogCQkJaGEtPmVmaV9yZXZpc2lvblswXSA9IGJjb2RlWzB4MTJdOwogCQkJaGEtPmVmaV9yZXZpc2lvblsxXSA9IGJjb2RlWzB4MTNdOwotCQkJREVCVUczKHByaW50aygiJXMoKTogcmVhZCBFRkkgJWQuJWQuXG4iLCBfX2Z1bmNfXywKKwkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBFRkkgJWQuJWQuXG4iLAogCQkJICAgIGhhLT5lZmlfcmV2aXNpb25bMV0sIGhhLT5lZmlfcmV2aXNpb25bMF0pKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyKHByaW50aygiJXMoKTogVW5yZWNvZ25pemVkIGNvZGUgdHlwZSAleCBhdCAiCi0JCQkgICAgInBjaWRzICV4LlxuIiwgX19mdW5jX18sIGNvZGVfdHlwZSwgcGNpZHMpKTsKKwkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnJlY29nbml6ZWQgY29kZSAiCisJCQkgICAgInR5cGUgJXggYXQgcGNpZHMgJXguXG4iLCBjb2RlX3R5cGUsIHBjaWRzKSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yNTU1LDcgKzI1ODMsNyBAQAogCW1lbXNldChoYS0+ZndfcmV2aXNpb24sIDAsIHNpemVvZihoYS0+ZndfcmV2aXNpb24pKTsKIAlkY29kZSA9IG1idWY7CiAKLQlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YShoYSwgZGNvZGUsIGhhLT5mbHRfcmVnaW9uX2Z3ICsgNCwgNCk7CisJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkY29kZSwgaGEtPmZsdF9yZWdpb25fZncgKyA0LCA0KTsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlkY29kZVtpXSA9IGJlMzJfdG9fY3B1KGRjb2RlW2ldKTsKIApAQCAtMjU2Myw4ICsyNTkxLDggQEAKIAkgICAgZGNvZGVbMl0gPT0gMHhmZmZmZmZmZiAmJiBkY29kZVszXSA9PSAweGZmZmZmZmZmKSB8fAogCSAgICAoZGNvZGVbMF0gPT0gMCAmJiBkY29kZVsxXSA9PSAwICYmIGRjb2RlWzJdID09IDAgJiYKIAkgICAgZGNvZGVbM10gPT0gMCkpIHsKLQkJREVCVUcyKHByaW50aygiJXMoKTogVW5yZWNvZ25pemVkIGZ3IHZlcnNpb24gYXQgJXguXG4iLAotCQkgICAgX19mdW5jX18sIGhhLT5mbHRfcmVnaW9uX2Z3KSk7CisJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnJlY29nbml6ZWQgZncgIgorCQkgICAgInJldmlzaW9uIGF0ICV4LlxuIiwgaGEtPmZsdF9yZWdpb25fZncgKiA0KSk7CiAJfSBlbHNlIHsKIAkJaGEtPmZ3X3JldmlzaW9uWzBdID0gZGNvZGVbMF07CiAJCWhhLT5md19yZXZpc2lvblsxXSA9IGRjb2RlWzFdOwpAQCAtMjU5Myw4ICsyNjIxLDkgQEAKIH0KIAogaW50Ci1xbGEyeHh4X2dldF92cGRfZmllbGQoc2NzaV9xbGFfaG9zdF90ICpoYSwgY2hhciAqa2V5LCBjaGFyICpzdHIsIHNpemVfdCBzaXplKQorcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBjaGFyICprZXksIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCiB7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJdWludDhfdCAqcG9zID0gaGEtPnZwZDsKIAl1aW50OF90ICplbmQgPSBwb3MgKyBoYS0+dnBkX3NpemU7CiAJaW50IGxlbiA9IDA7CkBAIC0yNjIxLDkgKzI2NTAsMTAgQEAKIH0KIAogc3RhdGljIGludAotcWxhMnh4eF9od19ldmVudF9zdG9yZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCAqZmRhdGEpCitxbGEyeHh4X2h3X2V2ZW50X3N0b3JlKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCAqZmRhdGEpCiB7CiAJdWludDMyX3QgZFsyXSwgZmFkZHI7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAkvKiBMb2NhdGUgZmlyc3QgZW1wdHkgZW50cnkuICovCiAJZm9yICg7OykgewpAQCAtMjYzNCw3ICsyNjY0LDcgQEAKIAkJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAkJfQogCi0JCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkLCBoYS0+aHdfZXZlbnRfcHRyLCAyKTsKKwkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkLCBoYS0+aHdfZXZlbnRfcHRyLCAyKTsKIAkJZmFkZHIgPSBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGhhLT5od19ldmVudF9wdHIpOwogCQloYS0+aHdfZXZlbnRfcHRyICs9IEZBX0hXX0VWRU5UX0VOVFJZX1NJWkU7CiAJCWlmIChkWzBdID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikgJiYKQEAgLTI2NTUsMTIgKzI2ODUsMTIgQEAKIH0KIAogaW50Ci1xbGEyeHh4X2h3X2V2ZW50X2xvZyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBjb2RlLCB1aW50MTZfdCBkMSwKK3FsYTJ4eHhfaHdfZXZlbnRfbG9nKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBjb2RlLCB1aW50MTZfdCBkMSwKICAgICB1aW50MTZfdCBkMiwgdWludDE2X3QgZDMpCiB7CiAjZGVmaW5lIFFNQVJLKGEsIGIsIGMsIGQpIFwKICAgICBjcHVfdG9fbGUzMihMU0IoYSkgPDwgMjQgfCBMU0IoYikgPDwgMTYgfCBMU0IoYykgPDwgOCB8IExTQihkKSkKLQorCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCBydmFsOwogCXVpbnQzMl90IG1hcmtlclsyXSwgZmRhdGFbNF07CiAKQEAgLTI2ODEsNyArMjcxMSw3IEBACiAJCS8qIExvY2F0ZSBtYXJrZXIuICovCiAJCWhhLT5od19ldmVudF9wdHIgPSBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudDsKIAkJZm9yICg7OykgewotCQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGZkYXRhLCBoYS0+aHdfZXZlbnRfcHRyLAorCQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBmZGF0YSwgaGEtPmh3X2V2ZW50X3B0ciwKIAkJCSAgICA0KTsKIAkJCWlmIChmZGF0YVswXSA9PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpICYmCiAJCQkgICAgZmRhdGFbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSkKQEAgLTI3MDAsNyArMjczMCw3IEBACiAJCX0KIAkJLyogTm8gbWFya2VyLCB3cml0ZSBpdC4gKi8KIAkJaWYgKCFoYS0+ZmxhZ3MuaHdfZXZlbnRfbWFya2VyX2ZvdW5kKSB7Ci0JCQlydmFsID0gcWxhMnh4eF9od19ldmVudF9zdG9yZShoYSwgbWFya2VyKTsKKwkJCXJ2YWwgPSBxbGEyeHh4X2h3X2V2ZW50X3N0b3JlKHZoYSwgbWFya2VyKTsKIAkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIkhXIGV2ZW50IC0tIEZhaWxlZCBtYXJrZXIgd3JpdGU9JXguIVxuIiwKQEAgLTI3MTQsNyArMjc0NCw3IEBACiAJLyogU3RvcmUgZXJyb3IuICAqLwogCWZkYXRhWzBdID0gY3B1X3RvX2xlMzIoY29kZSA8PCAxNiB8IGQxKTsKIAlmZGF0YVsxXSA9IGNwdV90b19sZTMyKGQyIDw8IDE2IHwgZDMpOwotCXJ2YWwgPSBxbGEyeHh4X2h3X2V2ZW50X3N0b3JlKGhhLCBmZGF0YSk7CisJcnZhbCA9IHFsYTJ4eHhfaHdfZXZlbnRfc3RvcmUodmhhLCBmZGF0YSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJICAgICJIVyBldmVudCAtLSBGYWlsZWQgZXJyb3Igd3JpdGU9JXguIVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IGVlYTY3MjAuLmJlMjJmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtNyw5ICs3LDkgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAyLjAxLWs5IgorI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMi4wMy1rMSIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTIKLSNkZWZpbmUgUUxBX0RSSVZFUl9QQVRDSF9WRVIJMQorI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkzCiAjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jCmluZGV4IGRlN2IzYmMuLjFhZDUxNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYworKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmMKQEAgLTIzLDcgKzIzLDcgQEAKICAgIEZ1bmN0aW9ucyBhcyBzdGFuZGFsb25lLCBsb2FkYWJsZSwgYW5kIFBDTUNJQSBkcml2ZXIsIHRoZSBsYXR0ZXIgZnJvbQogICAgRGF2ZSBIaW5kcycgUENNQ0lBIHBhY2thZ2UuCiAgICAKLSAgIENsZWFuZWQgdXAgMjYvMTAvMjAwMiBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiBhcyBwYXJ0IG9mIHRoZSAyLjUKKyAgIENsZWFuZWQgdXAgMjYvMTAvMjAwMiBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiBhcyBwYXJ0IG9mIHRoZSAyLjUKICAgIFNDU0kgZHJpdmVyIGNsZWFudXAgYW5kIGF1ZGl0LiBUaGlzIGRyaXZlciBzdGlsbCBuZWVkcyB3b3JrIG9uIHRoZQogICAgZm9sbG93aW5nCiAgICAJLQlOb24gdGVybWluYXRpbmcgaGFyZHdhcmUgd2FpdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IGVkZmFmMjQuLjM4MTgzOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJZWxzZQogCQllaF90aW1lZF9vdXQgPSBOVUxMOwogCi0JaWYgKGVoX3RpbWVkX291dCkKKwlpZiAoZWhfdGltZWRfb3V0KSB7CiAJCXJ0biA9IGVoX3RpbWVkX291dChzY21kKTsKIAkJc3dpdGNoIChydG4pIHsKIAkJY2FzZSBCTEtfRUhfTk9UX0hBTkRMRUQ6CkBAIC0xNDQsNiArMTQ0LDcgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBydG47CiAJCX0KKwl9CiAKIAlpZiAodW5saWtlbHkoIXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkpIHsKIAkJc2NtZC0+cmVzdWx0IHw9IERJRF9USU1FX09VVCA8PCAxNjsKQEAgLTE0MDUsOCArMTQwNiw5IEBACiAJCXJldHVybiBBRERfVE9fTUxRVUVVRTsKIAljYXNlIEdPT0Q6CiAJY2FzZSBDT01NQU5EX1RFUk1JTkFURUQ6Ci0JY2FzZSBUQVNLX0FCT1JURUQ6CiAJCXJldHVybiBTVUNDRVNTOworCWNhc2UgVEFTS19BQk9SVEVEOgorCQlnb3RvIG1heWJlX3JldHJ5OwogCWNhc2UgQ0hFQ0tfQ09ORElUSU9OOgogCQlydG4gPSBzY3NpX2NoZWNrX3NlbnNlKHNjbWQpOwogCQlpZiAocnRuID09IE5FRURTX1JFVFJZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKaW5kZXggZGMxY2ZiMi4uMmFlNGY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCkBAIC05NCw3ICs5NCw3IEBACiAJU0NTSV9MT0dfSU9DVEwoMSwgcHJpbnRrKCJUcnlpbmcgaW9jdGwgd2l0aCBzY3NpIGNvbW1hbmQgJWRcbiIsICpjbWQpKTsKIAogCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwKLQkJCQkgICZzc2hkciwgdGltZW91dCwgcmV0cmllcyk7CisJCQkJICAmc3NoZHIsIHRpbWVvdXQsIHJldHJpZXMsIE5VTEwpOwogCiAJU0NTSV9MT0dfSU9DVEwoMiwgcHJpbnRrKCJJb2N0bCByZXR1cm5lZCAgMHgleFxuIiwgcmVzdWx0KSk7CiAKQEAgLTI3MCwxMSArMjcwLDExIEBACiBFWFBPUlRfU1lNQk9MKHNjc2lfaW9jdGwpOwogCiAvKioKLSAqIHNjc2lfbm9uYmxvY2tfaW9jdGwoKSAtIEhhbmRsZSBTR19TQ1NJX1JFU0VUCisgKiBzY3NpX25vbmJsb2NrYWJsZV9pb2N0bCgpIC0gSGFuZGxlIFNHX1NDU0lfUkVTRVQKICAqIEBzZGV2OiBzY3NpIGRldmljZSByZWNlaXZpbmcgaW9jdGwKICAqIEBjbWQ6IE11c3QgYmUgU0NfU0NTSV9SRVNFVAogICogQGFyZzogcG9pbnRlciB0byBpbnQgY29udGFpbmluZyBTR19TQ1NJX1JFU0VUX3tERVZJQ0UsQlVTLEhPU1R9Ci0gKiBAZmlscDogZWl0aGVyIE5VTEwgb3IgYSAmc3RydWN0IGZpbGUgd2hpY2ggbXVzdCBoYXZlIHRoZSBPX05PTkJMT0NLIGZsYWcuCisgKiBAbmRlbGF5OiBmaWxlIG1vZGUgT19OREVMQVkgZmxhZwogICovCiBpbnQgc2NzaV9ub25ibG9ja2FibGVfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLAogCQkJICAgIHZvaWQgX191c2VyICphcmcsIGludCBuZGVsYXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDE0OGQzYWYuLmYyZjUxZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0xODMsMTMgKzE4MywxNSBAQAogICogQHRpbWVvdXQ6CXJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzCiAgKiBAcmV0cmllczoJbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IHJlcXVlc3QKICAqIEBmbGFnczoJb3IgaW50byByZXF1ZXN0IGZsYWdzOworICogQHJlc2lkOglvcHRpb25hbCByZXNpZHVhbCBsZW5ndGgKICAqCiAgKiByZXR1cm5zIHRoZSByZXEtPmVycm9ycyB2YWx1ZSB3aGljaCBpcyB0aGUgc2NzaV9jbW5kIHJlc3VsdAogICogZmllbGQuCiAgKi8KIGludCBzY3NpX2V4ZWN1dGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsCiAJCSBpbnQgZGF0YV9kaXJlY3Rpb24sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKLQkJIHVuc2lnbmVkIGNoYXIgKnNlbnNlLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBmbGFncykKKwkJIHVuc2lnbmVkIGNoYXIgKnNlbnNlLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBmbGFncywKKwkJIGludCAqcmVzaWQpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAlpbnQgd3JpdGUgPSAoZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSk7CkBAIC0yMjQsNiArMjI2LDggQEAKIAlpZiAodW5saWtlbHkocmVxLT5kYXRhX2xlbiA+IDAgJiYgcmVxLT5kYXRhX2xlbiA8PSBidWZmbGVuKSkKIAkJbWVtc2V0KGJ1ZmZlciArIChidWZmbGVuIC0gcmVxLT5kYXRhX2xlbiksIDAsIHJlcS0+ZGF0YV9sZW4pOwogCisJaWYgKHJlc2lkKQorCQkqcmVzaWQgPSByZXEtPmRhdGFfbGVuOwogCXJldCA9IHJlcS0+ZXJyb3JzOwogIG91dDoKIAlibGtfcHV0X3JlcXVlc3QocmVxKTsKQEAgLTIzNSw3ICsyMzksOCBAQAogCiBpbnQgc2NzaV9leGVjdXRlX3JlcShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKIAkJICAgICBpbnQgZGF0YV9kaXJlY3Rpb24sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKLQkJICAgICBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCisJCSAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkciwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLAorCQkgICAgIGludCAqcmVzaWQpCiB7CiAJY2hhciAqc2Vuc2UgPSBOVUxMOwogCWludCByZXN1bHQ7CkBAIC0yNDYsNyArMjUxLDcgQEAKIAkJCXJldHVybiBEUklWRVJfRVJST1IgPDwgMjQ7CiAJfQogCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZShzZGV2LCBjbWQsIGRhdGFfZGlyZWN0aW9uLCBidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICAgICBzZW5zZSwgdGltZW91dCwgcmV0cmllcywgMCk7CisJCQkgICAgICBzZW5zZSwgdGltZW91dCwgcmV0cmllcywgMCwgcmVzaWQpOwogCWlmIChzc2hkcikKIAkJc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgc3NoZHIpOwogCkBAIC04NzUsMTYgKzg4MCwyNCBAQAogICogICAgICAgICAgICAgICh0aGUgbm9ybWFsIGNhc2UgZm9yIG1vc3QgZHJpdmVycyksIHdlIGRvbid0IG5lZWQKICAqICAgICAgICAgICAgICB0aGUgbG9naWMgdG8gZGVhbCB3aXRoIGNsZWFuaW5nIHVwIGFmdGVyd2FyZHMuCiAgKgotICoJCVdlIG11c3QgZG8gb25lIG9mIHNldmVyYWwgdGhpbmdzIGhlcmU6CisgKgkJV2UgbXVzdCBjYWxsIHNjc2lfZW5kX3JlcXVlc3QoKS4gIFRoaXMgd2lsbCBmaW5pc2ggb2ZmCisgKgkJdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VjdG9ycy4gIElmIHdlIGFyZSBkb25lLCB0aGUKKyAqCQljb21tYW5kIGJsb2NrIHdpbGwgYmUgcmVsZWFzZWQgYW5kIHRoZSBxdWV1ZSBmdW5jdGlvbgorICoJCXdpbGwgYmUgZ29vc2VkLiAgSWYgd2UgYXJlIG5vdCBkb25lIHRoZW4gd2UgaGF2ZSB0bworICoJCWZpZ3VyZSBvdXQgd2hhdCB0byBkbyBuZXh0OgogICoKLSAqCQlhKSBDYWxsIHNjc2lfZW5kX3JlcXVlc3QuICBUaGlzIHdpbGwgZmluaXNoIG9mZiB0aGUKLSAqCQkgICBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY3RvcnMuICBJZiB3ZSBhcmUgZG9uZSwgdGhlCi0gKgkJICAgY29tbWFuZCBibG9jayB3aWxsIGJlIHJlbGVhc2VkLCBhbmQgdGhlIHF1ZXVlCi0gKgkJICAgZnVuY3Rpb24gd2lsbCBiZSBnb29zZWQuICBJZiB3ZSBhcmUgbm90IGRvbmUsIHRoZW4KLSAqCQkgICBzY3NpX2VuZF9yZXF1ZXN0IHdpbGwgZGlyZWN0bHkgZ29vc2UgdGhlIHF1ZXVlLgorICoJCWEpIFdlIGNhbiBjYWxsIHNjc2lfcmVxdWV1ZV9jb21tYW5kKCkuICBUaGUgcmVxdWVzdAorICoJCSAgIHdpbGwgYmUgdW5wcmVwYXJlZCBhbmQgcHV0IGJhY2sgb24gdGhlIHF1ZXVlLiAgVGhlbgorICoJCSAgIGEgbmV3IGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGZvciBpdC4gIFRoaXMgc2hvdWxkCisgKgkJICAgYmUgdXNlZCBpZiB3ZSBtYWRlIGZvcndhcmQgcHJvZ3Jlc3MsIG9yIGlmIHdlIHdhbnQKKyAqCQkgICB0byBzd2l0Y2ggZnJvbSBSRUFEKDEwKSB0byBSRUFEKDYpIGZvciBleGFtcGxlLgogICoKLSAqCQliKSBXZSBjYW4ganVzdCB1c2Ugc2NzaV9yZXF1ZXVlX2NvbW1hbmQoKSBoZXJlLiAgVGhpcyB3b3VsZAotICoJCSAgIGJlIHVzZWQgaWYgd2UganVzdCB3YW50ZWQgdG8gcmV0cnksIGZvciBleGFtcGxlLgorICoJCWIpIFdlIGNhbiBjYWxsIHNjc2lfcXVldWVfaW5zZXJ0KCkuICBUaGUgcmVxdWVzdCB3aWxsCisgKgkJICAgYmUgcHV0IGJhY2sgb24gdGhlIHF1ZXVlIGFuZCByZXRyaWVkIHVzaW5nIHRoZSBzYW1lCisgKgkJICAgY29tbWFuZCBhcyBiZWZvcmUsIHBvc3NpYmx5IGFmdGVyIGEgZGVsYXkuCisgKgorICoJCWMpIFdlIGNhbiBjYWxsIGJsa19lbmRfcmVxdWVzdCgpIHdpdGggLUVJTyB0byBmYWlsCisgKgkJICAgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVxdWVzdC4KICAqLwogdm9pZCBzY3NpX2lvX2NvbXBsZXRpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCB1bnNpZ25lZCBpbnQgZ29vZF9ieXRlcykKIHsKQEAgLTg5Niw2ICs5MDksOSBAQAogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKIAlpbnQgc2Vuc2VfdmFsaWQgPSAwOwogCWludCBzZW5zZV9kZWZlcnJlZCA9IDA7CisJZW51bSB7QUNUSU9OX0ZBSUwsIEFDVElPTl9SRVBSRVAsIEFDVElPTl9SRVRSWSwKKwkgICAgICBBQ1RJT05fREVMQVlFRF9SRVRSWX0gYWN0aW9uOworCWNoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKIAogCWlmIChyZXN1bHQpIHsKIAkJc2Vuc2VfdmFsaWQgPSBzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKGNtZCwgJnNzaGRyKTsKQEAgLTk0NywxMCArOTYzLDEzIEBACiAJCXJldHVybjsKIAl0aGlzX2NvdW50ID0gYmxrX3JxX2J5dGVzKHJlcSk7CiAKLQkvKiBnb29kX2J5dGVzID0gMCwgb3IgKGluY2x1c2l2ZSkgdGhlcmUgd2VyZSBsZWZ0b3ZlcnMgYW5kCi0JICogcmVzdWx0ID0gMCwgc28gc2NzaV9lbmRfcmVxdWVzdCBjb3VsZG4ndCByZXRyeS4KLQkgKi8KLQlpZiAoc2Vuc2VfdmFsaWQgJiYgIXNlbnNlX2RlZmVycmVkKSB7CisJaWYgKGhvc3RfYnl0ZShyZXN1bHQpID09IERJRF9SRVNFVCkgeworCQkvKiBUaGlyZCBwYXJ0eSBidXMgcmVzZXQgb3IgcmVzZXQgZm9yIGVycm9yIHJlY292ZXJ5CisJCSAqIHJlYXNvbnMuICBKdXN0IHJldHJ5IHRoZSBjb21tYW5kIGFuZCBzZWUgd2hhdAorCQkgKiBoYXBwZW5zLgorCQkgKi8KKwkJYWN0aW9uID0gQUNUSU9OX1JFVFJZOworCX0gZWxzZSBpZiAoc2Vuc2VfdmFsaWQgJiYgIXNlbnNlX2RlZmVycmVkKSB7CiAJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CiAJCWNhc2UgVU5JVF9BVFRFTlRJT046CiAJCQlpZiAoY21kLT5kZXZpY2UtPnJlbW92YWJsZSkgewpAQCAtOTU4LDE2ICs5NzcsMTUgQEAKIAkJCQkgKiBhbmQgcXVpZXRseSByZWZ1c2UgZnVydGhlciBhY2Nlc3MuCiAJCQkJICovCiAJCQkJY21kLT5kZXZpY2UtPmNoYW5nZWQgPSAxOwotCQkJCXNjc2lfZW5kX3JlcXVlc3QoY21kLCAtRUlPLCB0aGlzX2NvdW50LCAxKTsKLQkJCQlyZXR1cm47CisJCQkJZGVzY3JpcHRpb24gPSAiTWVkaWEgQ2hhbmdlZCI7CisJCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CiAJCQl9IGVsc2UgewogCQkJCS8qIE11c3QgaGF2ZSBiZWVuIGEgcG93ZXIgZ2xpdGNoLCBvciBhCiAJCQkJICogYnVzIHJlc2V0LiAgQ291bGQgbm90IGhhdmUgYmVlbiBhCiAJCQkJICogbWVkaWEgY2hhbmdlLCBzbyB3ZSBqdXN0IHJldHJ5IHRoZQotCQkJCSAqIHJlcXVlc3QgYW5kIHNlZSB3aGF0IGhhcHBlbnMuCisJCQkJICogY29tbWFuZCBhbmQgc2VlIHdoYXQgaGFwcGVucy4KIAkJCQkgKi8KLQkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwotCQkJCXJldHVybjsKKwkJCQlhY3Rpb24gPSBBQ1RJT05fUkVUUlk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CkBAIC05ODMsMjEgKzEwMDEsMTggQEAKIAkJCSAgICBzc2hkci5hc2MgPT0gMHgyMCAmJiBzc2hkci5hc2NxID09IDB4MDApICYmCiAJCQkgICAgKGNtZC0+Y21uZFswXSA9PSBSRUFEXzEwIHx8CiAJCQkgICAgIGNtZC0+Y21uZFswXSA9PSBXUklURV8xMCkpIHsKKwkJCQkvKiBUaGlzIHdpbGwgaXNzdWUgYSBuZXcgNi1ieXRlIGNvbW1hbmQuICovCiAJCQkJY21kLT5kZXZpY2UtPnVzZV8xMF9mb3JfcncgPSAwOwotCQkJCS8qIFRoaXMgd2lsbCBjYXVzZSBhIHJldHJ5IHdpdGggYQotCQkJCSAqIDYtYnl0ZSBjb21tYW5kLgotCQkJCSAqLwotCQkJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7Ci0JCQl9IGVsc2UgaWYgKHNzaGRyLmFzYyA9PSAweDEwKSAvKiBESVggKi8KLQkJCQlzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgLUVJTywgdGhpc19jb3VudCwgMCk7Ci0JCQllbHNlCi0JCQkJc2NzaV9lbmRfcmVxdWVzdChjbWQsIC1FSU8sIHRoaXNfY291bnQsIDEpOwotCQkJcmV0dXJuOworCQkJCWFjdGlvbiA9IEFDVElPTl9SRVBSRVA7CisJCQl9IGVsc2UKKwkJCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKKwkJCWJyZWFrOwogCQljYXNlIEFCT1JURURfQ09NTUFORDoKIAkJCWlmIChzc2hkci5hc2MgPT0gMHgxMCkgeyAvKiBESUYgKi8KLQkJCQlzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgLUVJTywgdGhpc19jb3VudCwgMCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOworCQkJCWRlc2NyaXB0aW9uID0gIkRhdGEgSW50ZWdyaXR5IEZhaWx1cmUiOworCQkJfSBlbHNlCisJCQkJYWN0aW9uID0gQUNUSU9OX1JFVFJZOwogCQkJYnJlYWs7CiAJCWNhc2UgTk9UX1JFQURZOgogCQkJLyogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWNvbWluZwpAQCAtMTAxMiw0OSArMTAyNyw1NyBAQAogCQkJCWNhc2UgMHgwNzogLyogb3BlcmF0aW9uIGluIHByb2dyZXNzICovCiAJCQkJY2FzZSAweDA4OiAvKiBMb25nIHdyaXRlIGluIHByb2dyZXNzICovCiAJCQkJY2FzZSAweDA5OiAvKiBzZWxmIHRlc3QgaW4gcHJvZ3Jlc3MgKi8KLQkJCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKLQkJCQkJcmV0dXJuOwotCQkJCWRlZmF1bHQ6CisJCQkJCWFjdGlvbiA9IEFDVElPTl9ERUxBWUVEX1JFVFJZOwogCQkJCQlicmVhazsKIAkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRlc2NyaXB0aW9uID0gIkRldmljZSBub3QgcmVhZHkiOworCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOwogCQkJfQotCQkJaWYgKCEocmVxLT5jbWRfZmxhZ3MgJiBSRVFfUVVJRVQpKQotCQkJCXNjc2lfY21kX3ByaW50X3NlbnNlX2hkcihjbWQsCi0JCQkJCQkJICJEZXZpY2Ugbm90IHJlYWR5IiwKLQkJCQkJCQkgJnNzaGRyKTsKLQotCQkJc2NzaV9lbmRfcmVxdWVzdChjbWQsIC1FSU8sIHRoaXNfY291bnQsIDEpOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCWNhc2UgVk9MVU1FX09WRVJGTE9XOgotCQkJaWYgKCEocmVxLT5jbWRfZmxhZ3MgJiBSRVFfUVVJRVQpKSB7Ci0JCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsCi0JCQkJCSAgICAiVm9sdW1lIG92ZXJmbG93LCBDREI6ICIpOwotCQkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNtZC0+Y21uZCk7Ci0JCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKLQkJCX0KIAkJCS8qIFNlZSBTU0MzclhYIG9yIGN1cnJlbnQuICovCi0JCQlzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgLUVJTywgdGhpc19jb3VudCwgMSk7Ci0JCQlyZXR1cm47CisJCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgorCQkJZGVzY3JpcHRpb24gPSAiVW5oYW5kbGVkIHNlbnNlIGNvZGUiOworCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CiAJCQlicmVhazsKIAkJfQorCX0gZWxzZSB7CisJCWRlc2NyaXB0aW9uID0gIlVuaGFuZGxlZCBlcnJvciBjb2RlIjsKKwkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CiAJfQotCWlmIChob3N0X2J5dGUocmVzdWx0KSA9PSBESURfUkVTRVQpIHsKLQkJLyogVGhpcmQgcGFydHkgYnVzIHJlc2V0IG9yIHJlc2V0IGZvciBlcnJvciByZWNvdmVyeQotCQkgKiByZWFzb25zLiAgSnVzdCByZXRyeSB0aGUgcmVxdWVzdCBhbmQgc2VlIHdoYXQKLQkJICogaGFwcGVucy4KLQkJICovCi0JCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJlc3VsdCkgeworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEFDVElPTl9GQUlMOgorCQkvKiBHaXZlIHVwIGFuZCBmYWlsIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3QgKi8KIAkJaWYgKCEocmVxLT5jbWRfZmxhZ3MgJiBSRVFfUVVJRVQpKSB7CisJCQlpZiAoZGVzY3JpcHRpb24pCisJCQkJc2NtZF9wcmludGsoS0VSTl9JTkZPLCBjbWQsICIlcyIsCisJCQkJCSAgICBkZXNjcmlwdGlvbik7CiAJCQlzY3NpX3ByaW50X3Jlc3VsdChjbWQpOwogCQkJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpCiAJCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKIAkJfQorCQlibGtfZW5kX3JlcXVlc3QocmVxLCAtRUlPLCBibGtfcnFfYnl0ZXMocmVxKSk7CisJCXNjc2lfbmV4dF9jb21tYW5kKGNtZCk7CisJCWJyZWFrOworCWNhc2UgQUNUSU9OX1JFUFJFUDoKKwkJLyogVW5wcmVwIHRoZSByZXF1ZXN0IGFuZCBwdXQgaXQgYmFjayBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCisJCSAqIEEgbmV3IGNvbW1hbmQgd2lsbCBiZSBwcmVwYXJlZCBhbmQgaXNzdWVkLgorCQkgKi8KKwkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBBQ1RJT05fUkVUUlk6CisJCS8qIFJldHJ5IHRoZSBzYW1lIGNvbW1hbmQgaW1tZWRpYXRlbHkgKi8KKwkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfRUhfUkVUUlkpOworCQlicmVhazsKKwljYXNlIEFDVElPTl9ERUxBWUVEX1JFVFJZOgorCQkvKiBSZXRyeSB0aGUgc2FtZSBjb21tYW5kIGFmdGVyIGEgZGVsYXkgKi8KKwkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOworCQlicmVhazsKIAl9Ci0Jc2NzaV9lbmRfcmVxdWVzdChjbWQsIC1FSU8sIHRoaXNfY291bnQsICFyZXN1bHQpOwogfQogCiBzdGF0aWMgaW50IHNjc2lfaW5pdF9zZ3RhYmxlKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpzZGIsCkBAIC0xOTk4LDcgKzIwMjEsNyBAQAogCX0KIAogCXJldCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfVE9fREVWSUNFLCByZWFsX2J1ZmZlciwgbGVuLAotCQkJICAgICAgIHNzaGRyLCB0aW1lb3V0LCByZXRyaWVzKTsKKwkJCSAgICAgICBzc2hkciwgdGltZW91dCwgcmV0cmllcywgTlVMTCk7CiAJa2ZyZWUocmVhbF9idWZmZXIpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMDYzLDcgKzIwODYsNyBAQAogCW1lbXNldChidWZmZXIsIDAsIGxlbik7CiAKIAlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX0ZST01fREVWSUNFLCBidWZmZXIsIGxlbiwKLQkJCQkgIHNzaGRyLCB0aW1lb3V0LCByZXRyaWVzKTsKKwkJCQkgIHNzaGRyLCB0aW1lb3V0LCByZXRyaWVzLCBOVUxMKTsKIAogCS8qIFRoaXMgY29kZSBsb29rcyBhd2Z1bDogd2hhdCBpdCdzIGRvaW5nIGlzIG1ha2luZyBzdXJlIGFuCiAJICogSUxMRUdBTCBSRVFVRVNUIHNlbnNlIHJldHVybiBpZGVudGlmaWVzIHRoZSBhY3R1YWwgY29tbWFuZApAQCAtMjE0NSw3ICsyMTY4LDcgQEAKIAkvKiB0cnkgdG8gZWF0IHRoZSBVTklUX0FUVEVOVElPTiBpZiB0aGVyZSBhcmUgZW5vdWdoIHJldHJpZXMgKi8KIAlkbyB7CiAJCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwgc3NoZHIsCi0JCQkJCSAgdGltZW91dCwgcmV0cmllcyk7CisJCQkJCSAgdGltZW91dCwgcmV0cmllcywgTlVMTCk7CiAJCWlmIChzZGV2LT5yZW1vdmFibGUgJiYgc2NzaV9zZW5zZV92YWxpZChzc2hkcikgJiYKIAkJICAgIHNzaGRyLT5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCiAJCQlzZGV2LT5jaGFuZ2VkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCBiMTRkYzAyLi4xODQ4NmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlzY3NpX2NtZFs0XSA9IDB4MmE7ICAgICAvKiBzaXplICovCiAJc2NzaV9jbWRbNV0gPSAwOwogCXNjc2lfZXhlY3V0ZV9yZXEoc2Rldiwgc2NzaV9jbWQsIERNQV9GUk9NX0RFVklDRSwgcmVzdWx0LCAweDJhLCBOVUxMLAotCQkJIFNDU0lfVElNRU9VVCwgMyk7CisJCQkgU0NTSV9USU1FT1VULCAzLCBOVUxMKTsKIH0KIAogLyoqCkBAIC01NzMsNiArNTczLDggQEAKIAogCS8qIEVhY2ggcGFzcyBnZXRzIHVwIHRvIHRocmVlIGNoYW5jZXMgdG8gaWdub3JlIFVuaXQgQXR0ZW50aW9uICovCiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzsgKytjb3VudCkgeworCQlpbnQgcmVzaWQ7CisKIAkJbWVtc2V0KHNjc2lfY21kLCAwLCA2KTsKIAkJc2NzaV9jbWRbMF0gPSBJTlFVSVJZOwogCQlzY3NpX2NtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSB0cnlfaW5xdWlyeV9sZW47CkBAIC01ODEsNyArNTgzLDggQEAKIAogCQlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsICBzY3NpX2NtZCwgRE1BX0ZST01fREVWSUNFLAogCQkJCQkgIGlucV9yZXN1bHQsIHRyeV9pbnF1aXJ5X2xlbiwgJnNzaGRyLAotCQkJCQkgIEhaIC8gMiArIEhaICogc2NzaV9pbnFfdGltZW91dCwgMyk7CisJCQkJCSAgSFogLyAyICsgSFogKiBzY3NpX2lucV90aW1lb3V0LCAzLAorCQkJCQkgICZyZXNpZCk7CiAKIAkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBJTlFVSVJZICVzICIKIAkJCQkid2l0aCBjb2RlIDB4JXhcbiIsCkBAIC02MDIsNiArNjA1LDE0IEBACiAJCQkJICAgIChzc2hkci5hc2NxID09IDApKQogCQkJCQljb250aW51ZTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBub3RoaW5nIHdhcyB0cmFuc2ZlcnJlZCwgd2UgdHJ5CisJCQkgKiBhZ2Fpbi4gSXQncyBhIHdvcmthcm91bmQgZm9yIHNvbWUgVVNCCisJCQkgKiBkZXZpY2VzLgorCQkJICovCisJCQlpZiAocmVzaWQgPT0gdHJ5X2lucXVpcnlfbGVuKQorCQkJCWNvbnRpbnVlOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTEzOTAsNyArMTQwMSw3IEBACiAKIAkJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBzY3NpX2NtZCwgRE1BX0ZST01fREVWSUNFLAogCQkJCQkgIGx1bl9kYXRhLCBsZW5ndGgsICZzc2hkciwKLQkJCQkJICBTQ1NJX1RJTUVPVVQgKyA0ICogSFosIDMpOworCQkJCQkgIFNDU0lfVElNRU9VVCArIDQgKiBIWiwgMywgTlVMTCk7CiAKIAkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrIChLRVJOX0lORk8gInNjc2kgc2NhbjogUkVQT1JUIExVTlMiCiAJCQkJIiAlcyAodHJ5ICVkKSByZXN1bHQgMHgleFxuIiwgcmVzdWx0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCmluZGV4IDFlNzFhYmYuLjA2MjMwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCkBAIC0zMDEyLDYgKzMwMTIsMTYgQEAKIAlycG9ydC0+cG9ydF9zdGF0ZSA9IEZDX1BPUlRTVEFURV9OT1RQUkVTRU5UOwogCXJwb3J0LT5mbGFncyAmPSB+RkNfUlBPUlRfRkFTVF9GQUlMX1RJTUVET1VUOwogCisJLyoKKwkgKiBQcmUtZW1wdGl2ZWx5IGtpbGwgSS9PIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSB3b3JrIHF1ZXVlCisJICogaXRlbSB0byB0ZWFyZG93biB0aGUgc3RhcmdldC4gKEZDT0UgbGliRkMgZm9sa3MgcHJlZmVyIHRoaXMKKwkgKiBhbmQgdG8gaGF2ZSB0aGUgcnBvcnRfcG9ydF9pZCBzdGlsbCBzZXQgd2hlbiBpdCdzIGRvbmUpLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWZjX3Rlcm1pbmF0ZV9ycG9ydF9pbyhycG9ydCk7CisKKwlCVUdfT04ocnBvcnQtPnBvcnRfc3RhdGUgIT0gRkNfUE9SVFNUQVRFX05PVFBSRVNFTlQpOworCiAJLyogcmVtb3ZlIHRoZSBpZGVudGlmaWVycyB0aGF0IGFyZW4ndCB1c2VkIGluIHRoZSBjb25zaXN0aW5nIGJpbmRpbmcgKi8KIAlzd2l0Y2ggKGZjX2hvc3QtPnRndGlkX2JpbmRfdHlwZSkgewogCWNhc2UgRkNfVEdUSURfQklORF9CWV9XV1BOOgpAQCAtMzAzNSw5ICszMDQ1LDYgQEAKIAkgKiB3ZW50IGF3YXkgYW5kIGRpZG4ndCBjb21lIGJhY2sgLSB3ZSdsbCByZW1vdmUKIAkgKiBhbGwgYXR0YWNoZWQgc2NzaSBkZXZpY2VzLgogCSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCi0Jc2NzaV90YXJnZXRfdW5ibG9jaygmcnBvcnQtPmRldik7CiAJZmNfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCmluZGV4IDdjMmQyODkuLmY0OWY1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKQEAgLTExMSw4ICsxMTEsOSBAQAogCQkJCSAgICAgIHNlbnNlLCBEVl9USU1FT1VULCAvKiByZXRyaWVzICovIDEsCiAJCQkJICAgICAgUkVRX0ZBSUxGQVNUX0RFViB8CiAJCQkJICAgICAgUkVRX0ZBSUxGQVNUX1RSQU5TUE9SVCB8Ci0JCQkJICAgICAgUkVRX0ZBSUxGQVNUX0RSSVZFUik7Ci0JCWlmIChyZXN1bHQgJiBEUklWRVJfU0VOU0UpIHsKKwkJCQkgICAgICBSRVFfRkFJTEZBU1RfRFJJVkVSLAorCQkJCSAgICAgIE5VTEwpOworCQlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgewogCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyX3RtcDsKIAkJCWlmICghc3NoZHIpCiAJCQkJc3NoZHIgPSAmc3NoZHJfdG1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA1MDgxYjM5Li42MmIyOGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAJCSAqIGZsdXNoIGV2ZXJ5dGhpbmcuCiAJCSAqLwogCQlyZXMgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkcCwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwgJnNzaGRyLAotCQkJCSAgICAgICBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCQkJICAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTLCBOVUxMKTsKIAkJaWYgKHJlcyA9PSAwKQogCQkJYnJlYWs7CiAJfQpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAkJCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNka3AtPmRldmljZSwgY21kLAogCQkJCQkJICAgICAgRE1BX05PTkUsIE5VTEwsIDAsCiAJCQkJCQkgICAgICAmc3NoZHIsIFNEX1RJTUVPVVQsCi0JCQkJCQkgICAgICBTRF9NQVhfUkVUUklFUyk7CisJCQkJCQkgICAgICBTRF9NQVhfUkVUUklFUywgTlVMTCk7CiAKIAkJCS8qCiAJCQkgKiBJZiB0aGUgZHJpdmUgaGFzIGluZGljYXRlZCB0byB1cyB0aGF0IGl0CkBAIC0xMTkyLDcgKzExOTIsOCBAQAogCQkJCQljbWRbNF0gfD0gMSA8PCA0OwogCQkJCXNjc2lfZXhlY3V0ZV9yZXEoc2RrcC0+ZGV2aWNlLCBjbWQsIERNQV9OT05FLAogCQkJCQkJIE5VTEwsIDAsICZzc2hkciwKLQkJCQkJCSBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCQkJCQkgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMsCisJCQkJCQkgTlVMTCk7CiAJCQkJc3BpbnRpbWVfZXhwaXJlID0gamlmZmllcyArIDEwMCAqIEhaOwogCQkJCXNwaW50aW1lID0gMTsKIAkJCX0KQEAgLTEzMDYsNyArMTMwNyw3IEBACiAJCQogCQl0aGVfcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZHAsIGNtZCwgRE1BX0ZST01fREVWSUNFLAogCQkJCQkgICAgICBidWZmZXIsIGxvbmdyYyA/IDEzIDogOCwgJnNzaGRyLAotCQkJCQkgICAgICBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCQkJCSAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTLCBOVUxMKTsKIAogCQlpZiAobWVkaWFfbm90X3ByZXNlbnQoc2RrcCwgJnNzaGRyKSkKIAkJCXJldHVybjsKQEAgLTE5ODYsNyArMTk4Nyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcmVzID0gc2NzaV9leGVjdXRlX3JlcShzZHAsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsICZzc2hkciwKLQkJCSAgICAgICBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisJCQkgICAgICAgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMsIE5VTEwpOwogCWlmIChyZXMpIHsKIAkJc2RfcHJpbnRrKEtFUk5fV0FSTklORywgc2RrcCwgIlNUQVJUX1NUT1AgRkFJTEVEXG4iKTsKIAkJc2RfcHJpbnRfcmVzdWx0KHNka3AsIHJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VzLmMgYi9kcml2ZXJzL3Njc2kvc2VzLmMKaW5kZXggMWJjZjNjMy4uN2YwZGYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Nlcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpAQCAtNzcsNyArNzcsNyBAQAogCX07CiAKIAlyZXR1cm4gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9GUk9NX0RFVklDRSwgYnVmLCBidWZmbGVuLAotCQkJCU5VTEwsIFNFU19USU1FT1VULCBTRVNfUkVUUklFUyk7CisJCQkJTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBzZXNfc2VuZF9kaWFnKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHBhZ2VfY29kZSwKQEAgLTk1LDcgKzk1LDcgQEAKIAl9OwogCiAJcmVzdWx0ID0gc2NzaV9leGVjdXRlX3JlcShzZGV2LCBjbWQsIERNQV9UT19ERVZJQ0UsIGJ1ZiwgYnVmZmxlbiwKLQkJCQkgIE5VTEwsIFNFU19USU1FT1VULCBTRVNfUkVUUklFUyk7CisJCQkJICBOVUxMLCBTRVNfVElNRU9VVCwgU0VTX1JFVFJJRVMsIE5VTEwpOwogCWlmIChyZXN1bHQpCiAJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBzZGV2LCAiU0VORCBESUFHTk9TVElDIHJlc3VsdDogJTh4XG4iLAogCQkJICAgIHJlc3VsdCk7CkBAIC0zNjksNyArMzY5LDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfRlJPTV9ERVZJQ0UsIGJ1ZiwKLQkJCSAgICAgVlBEX0lOUVVJUllfU0laRSwgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTKSkKKwkJCSAgICAgVlBEX0lOUVVJUllfU0laRSwgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTLAorCQkJICAgICBOVUxMKSkKIAkJZ290byBmcmVlOwogCiAJdnBkX2xlbiA9IChidWZbMl0gPDwgOCkgKyBidWZbM107CkBAIC0zODAsNyArMzgxLDcgQEAKIAljbWRbM10gPSB2cGRfbGVuID4+IDg7CiAJY21kWzRdID0gdnBkX2xlbiAmIDB4ZmY7CiAJaWYgKHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfRlJPTV9ERVZJQ0UsIGJ1ZiwKLQkJCSAgICAgdnBkX2xlbiwgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTKSkKKwkJCSAgICAgdnBkX2xlbiwgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTLCBOVUxMKSkKIAkJZ290byBmcmVlOwogCiAJZGVzYyA9IGJ1ZiArIDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuYyBiL2RyaXZlcnMvc2NzaS9zci5jCmluZGV4IDQ1YjY2YjkuLmU3ZmEzY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAlkbyB7CiAJCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX05PTkUsIE5VTEwsCiAJCQkJCSAgICAgIDAsIHNzaGRyLCBTUl9USU1FT1VULAotCQkJCQkgICAgICByZXRyaWVzLS0pOworCQkJCQkgICAgICByZXRyaWVzLS0sIE5VTEwpOwogCQlpZiAoc2NzaV9zZW5zZV92YWxpZChzc2hkcikgJiYKIAkJICAgIHNzaGRyLT5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCiAJCQlzZGV2LT5jaGFuZ2VkID0gMTsKQEAgLTY4MSw3ICs2ODEsNyBAQAogCQkvKiBEbyB0aGUgY29tbWFuZCBhbmQgd2FpdC4uICovCiAJCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKGNkLT5kZXZpY2UsIGNtZCwgRE1BX0ZST01fREVWSUNFLAogCQkJCQkgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpLCBOVUxMLAotCQkJCQkgICAgICBTUl9USU1FT1VULCBNQVhfUkVUUklFUyk7CisJCQkJCSAgICAgIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTLCBOVUxMKTsKIAogCQlyZXRyaWVzLS07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKaW5kZXggYWU4N2QwOC4uZDkyZmY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKCpzZW5zZSkpOwogCXJlc3VsdCA9IHNjc2lfZXhlY3V0ZShTRGV2LCBjZ2MtPmNtZCwgY2djLT5kYXRhX2RpcmVjdGlvbiwKIAkJCSAgICAgIGNnYy0+YnVmZmVyLCBjZ2MtPmJ1ZmxlbiwgKGNoYXIgKilzZW5zZSwKLQkJCSAgICAgIGNnYy0+dGltZW91dCwgSU9DVExfUkVUUklFUywgMCk7CisJCQkgICAgICBjZ2MtPnRpbWVvdXQsIElPQ1RMX1JFVFJJRVMsIDAsIE5VTEwpOwogCiAJc2NzaV9ub3JtYWxpemVfc2Vuc2UoKGNoYXIgKilzZW5zZSwgc2l6ZW9mKCpzZW5zZSksICZzc2hkcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggYzk1OWJkYy4uN2YzZjMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTQ1MSw5ICs0NTEsMjMgQEAKIAkJY29tcGxldGUoU1JwbnQtPndhaXRpbmcpOwogfQogCi1zdGF0aWMgc3RydWN0IHN0X3JlcXVlc3QgKnN0X2FsbG9jYXRlX3JlcXVlc3Qodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgc3RfcmVxdWVzdCAqc3RfYWxsb2NhdGVfcmVxdWVzdChzdHJ1Y3Qgc2NzaV90YXBlICpzdHApCiB7Ci0JcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdF9yZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHN0X3JlcXVlc3QgKnN0cmVxOworCisJc3RyZXEgPSBremFsbG9jKHNpemVvZigqc3RyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RyZXEpCisJCXN0cmVxLT5zdHAgPSBzdHA7CisJZWxzZSB7CisJCURFQkMocHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IFNDU0kgcmVxdWVzdC5cbiIsCisJCQkgICAgdGFwZV9uYW1lKHN0cCkpOyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXN0cC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9IC1FSU5UUjsKKwkJZWxzZQorCQkJc3RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID0gLUVCVVNZOworCX0KKworCXJldHVybiBzdHJlcTsKIH0KIAogc3RhdGljIHZvaWQgc3RfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBzdF9yZXF1ZXN0ICpzdHJlcSkKQEAgLTQ4MSwxOCArNDk1LDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChTUnBudCA9PSBOVUxMKSB7Ci0JCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdCgpOwotCQlpZiAoU1JwbnQgPT0gTlVMTCkgewotCQkJREVCQyggcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IFNDU0kgcmVxdWVzdC5cbiIsCi0JCQkJICAgICB0YXBlX25hbWUoU1RwKSk7ICk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVJTlRSKTsKLQkJCWVsc2UKLQkJCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUJVU1kpOworCWlmICghU1JwbnQpIHsKKwkJU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJCWlmICghU1JwbnQpCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlTUnBudC0+c3RwID0gU1RwOwogCX0KIAogCS8qIElmIGFzeW5jIElPLCBzZXQgbGFzdF9TUnBudC4gVGhpcyBwdHIgdGVsbHMgd3JpdGVfYmVoaW5kX2NoZWNrCkBAIC01MjcsNiArNTMzLDI4IEBACiAJcmV0dXJuIFNScG50OwogfQogCitzdGF0aWMgaW50IHN0X3Njc2lfa2Vybl9leGVjdXRlKHN0cnVjdCBzdF9yZXF1ZXN0ICpzdHJlcSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsIGludCBkYXRhX2RpcmVjdGlvbiwKKwkJCQl2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sIGludCB0aW1lb3V0LAorCQkJCWludCByZXRyaWVzKQoreworCXN0cnVjdCBzY3NpX3RhcGUgKnN0cCA9IHN0cmVxLT5zdHA7CisJaW50IHJldCwgcmVzaWQ7CisKKwlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKKwltZW1jcHkoc3RyZXEtPmNtZCwgY21kLCBzaXplb2Yoc3RyZXEtPmNtZCkpOworCisJcmV0ID0gc2NzaV9leGVjdXRlKHN0cC0+ZGV2aWNlLCBjbWQsIGRhdGFfZGlyZWN0aW9uLCBidWZmZXIsIGJ1ZmZsZW4sCisJCQkgICBzdHJlcS0+c2Vuc2UsIHRpbWVvdXQsIHJldHJpZXMsIDAsICZyZXNpZCk7CisJaWYgKGRyaXZlcl9ieXRlKHJldCkgJiBEUklWRVJfRVJST1IpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBzdHJlcS0+cmVzdWx0ID0gcmV0OworCXN0cC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVzaWQ7CisJc3RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChzdHAsIHN0cmVxKTsKKworCXJldHVybiAwOworfQogCiAvKiBIYW5kbGUgdGhlIHdyaXRlLWJlaGluZCBjaGVja2luZyAod2FpdHMgZm9yIGNvbXBsZXRpb24pLiBSZXR1cm5zIC1FTk9TUEMgaWYKICAgIHdyaXRlIGhhcyBiZWVuIGNvcnJlY3QgYnV0IEVPTSBlYXJseSB3YXJuaW5nIHJlYWNoZWQsIC1FSU8gaWYgd3JpdGUgZW5kZWQgaW4KQEAgLTU5OSw2ICs2MjcsNyBAQAogewogCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlpbnQgcmV0OwogCiAJY21kWzBdID0gU1BBQ0U7CiAJY21kWzFdID0gMHgwMTsJCS8qIFNwYWNlIEZpbGVNYXJrcyAqLwpAQCAtNjEyLDE5ICs2NDEsMjYgQEAKICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMuXG4iLAogCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpKTsKIAotCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCi0JCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOwogCWlmICghU1JwbnQpCi0JCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKIAotCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7Ci0JU1JwbnQgPSBOVUxMOworCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9SRVRSSUVTKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKIAogCWlmICgoU1RwLT5idWZmZXIpLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTdGVwcGluZyBvdmVyIGZpbGVtYXJrICVzIGZhaWxlZC5cbiIsCiAJCSAgIHRhcGVfbmFtZShTVHApLCBmb3J3YXJkID8gImZvcndhcmQiIDogImJhY2t3YXJkIik7CiAKLQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CitvdXQ6CisJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtNjU3LDcgKzY5Myw4IEBACiAJCWNtZFs0XSA9IGJsa3M7CiAKIAkJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCB0cmFuc2ZlciwgRE1BX1RPX0RFVklDRSwKLQkJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1dSSVRFX1JFVFJJRVMsIDEpOworCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9XUklURV9SRVRSSUVTLCAxKTsKIAkJaWYgKCFTUnBudCkKIAkJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIApAQCAtODQ0LDIxICs4ODEsMjQgQEAKIAlpbnQgYXR0ZW50aW9ucywgd2FpdHMsIG1heF93YWl0LCBzY29kZTsKIAlpbnQgcmV0dmFsID0gQ0hLUkVTX1JFQURZLCBuZXdfc2Vzc2lvbiA9IDA7CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07Ci0Jc3RydWN0IHN0X3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQ7CiAJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CiAKKwlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCiAJbWF4X3dhaXQgPSBkb193YWl0ID8gU1RfQkxPQ0tfU0VDT05EUyA6IDA7CiAKIAlmb3IgKGF0dGVudGlvbnM9d2FpdHM9MDsgOyApIHsKIAkJbWVtc2V0KCh2b2lkICopICZjbWRbMF0sIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7Ci0JCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAotCQkJCSAgIFNUcC0+bG9uZ190aW1lb3V0LCBNQVhfUkVBRFlfUkVUUklFUywgMSk7CiAKLQkJaWYgKCFTUnBudCkgewotCQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCQkgICAgICBTVHAtPmxvbmdfdGltZW91dCwKKwkJCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOworCQlpZiAocmV0dmFsKQogCQkJYnJlYWs7Ci0JCX0KIAogCQlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpIHsKIApAQCAtOTAyLDggKzk0Miw4IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChTUnBudCAhPSBOVUxMKQotCQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC05ODAsMTYgKzEwMjAsMjQgQEAKIAkJfQogCX0KIAorCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCWlmICghU1JwbnQpIHsKKwkJcmV0dmFsID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJaWYgKFNUcC0+b21pdF9ibGtsaW1zKQogCQlTVHAtPm1pbl9ibG9jayA9IFNUcC0+bWF4X2Jsb2NrID0gKC0xKTsKIAllbHNlIHsKIAkJbWVtc2V0KCh2b2lkICopICZjbWRbMF0sIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCQljbWRbMF0gPSBSRUFEX0JMT0NLX0xJTUlUUzsKIAotCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCA2LCBETUFfRlJPTV9ERVZJQ0UsCi0JCQkJICAgU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKLQkJaWYgKCFTUnBudCkgewotCQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgNiwKKwkJCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKKwkJaWYgKHJldHZhbCkgeworCQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCkBAIC0xMDEzLDEwICsxMDYxLDEyIEBACiAJY21kWzBdID0gTU9ERV9TRU5TRTsKIAljbWRbNF0gPSAxMjsKIAotCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDEyLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQlTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwotCWlmICghU1JwbnQpIHsKLQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJcmV0dmFsID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgICAgIFNUcC0+YnVmZmVyLT5iX2RhdGEsIDEyLAorCQkJCSAgICAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKKwlpZiAocmV0dmFsKSB7CisJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKQEAgLTEyNDYsMTAgKzEyOTYsMTcgQEAKIAkJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOwogCQljbWRbNF0gPSAxICsgU1RwLT50d29fZm07CiAKLQkJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKLQkJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1dSSVRFX1JFVFJJRVMsIDEpOworCQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKIAkJaWYgKCFTUnBudCkgewotCQkJcmVzdWx0ID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJCQlyZXN1bHQgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJlc3VsdCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCQkgICAgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCQkJICAgICAgTUFYX1dSSVRFX1JFVFJJRVMpOworCQlpZiAocmVzdWx0KSB7CisJCQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMTYzNCw3ICsxNjkxLDggQEAKIAkJY21kWzRdID0gYmxrczsKIAogCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCB0cmFuc2ZlciwgRE1BX1RPX0RFVklDRSwKLQkJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1dSSVRFX1JFVFJJRVMsICFhc3luY193cml0ZSk7CisJCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkJICAgTUFYX1dSSVRFX1JFVFJJRVMsICFhc3luY193cml0ZSk7CiAJCWlmICghU1JwbnQpIHsKIAkJCXJldHZhbCA9IFNUYnAtPnN5c2NhbGxfcmVzdWx0OwogCQkJZ290byBvdXQ7CkBAIC0xODA0LDcgKzE4NjIsOCBAQAogCiAJU1JwbnQgPSAqYVNScG50OwogCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGJ5dGVzLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkgICBNQVhfUkVUUklFUywgMSk7CiAJcmVsZWFzZV9idWZmZXJpbmcoU1RwLCAxKTsKIAkqYVNScG50ID0gU1JwbnQ7CiAJaWYgKCFTUnBudCkKQEAgLTIyMTMsNyArMjI3Miw4IEBACiAJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogTG9uZyB0aW1lb3V0IHNldCB0byAlZCBzZWNvbmRzLlxuIiwgbmFtZSwKIAkJCSAgICAgICAodmFsdWUgJiB+TVRfU1RfU0VUX0xPTkdfVElNRU9VVCkpKTsKIAkJfSBlbHNlIHsKLQkJCVNUcC0+ZGV2aWNlLT50aW1lb3V0ID0gdmFsdWUgKiBIWjsKKwkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLAorCQkJCQkgICAgIHZhbHVlICogSFopOwogCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vcm1hbCB0aW1lb3V0IHNldCB0byAlZCBzZWNvbmRzLlxuIiwKIAkJCQluYW1lLCB2YWx1ZSkgKTsKIAkJfQpAQCAtMjMxMSw3ICsyMzcxLDggQEAKIHN0YXRpYyBpbnQgcmVhZF9tb2RlX3BhZ2Uoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBpbnQgcGFnZSwgaW50IG9taXRfYmxvY2tfZGVzY3MpCiB7CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07Ci0Jc3RydWN0IHN0X3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQ7CisJaW50IHJldDsKIAogCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCWNtZFswXSA9IE1PREVfU0VOU0U7CkBAIC0yMzIwLDE0ICsyMzgxLDE3IEBACiAJY21kWzJdID0gcGFnZTsKIAljbWRbNF0gPSAyNTU7CiAKLQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwKLQkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCAwLCAxKTsKLQlpZiAoU1JwbnQgPT0gTlVMTCkKLQkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCWlmICghU1JwbnQpCisJCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CiAKKwlyZXQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgU1RwLT5idWZmZXItPmJfZGF0YSwgY21kWzRdLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9SRVRSSUVTKTsKIAlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCi0JcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCXJldHVybiByZXQgPyA6IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKIH0KIAogCkBAIC0yMzM1LDkgKzIzOTksOSBAQAogICAgaW4gdGhlIGJ1ZmZlciBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLiBUaGUgbG9uZyB0aW1lb3V0IGlzIHVzZWQgaWYgc2xvdyBpcyBub24temVyby4gKi8KIHN0YXRpYyBpbnQgd3JpdGVfbW9kZV9wYWdlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IHBhZ2UsIGludCBzbG93KQogewotCWludCBwZ287CisJaW50IHBnbywgdGltZW91dCwgcmV0ID0gMDsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKLQlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKIAogCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCWNtZFswXSA9IE1PREVfU0VMRUNUOwpAQCAtMjM1MSwxNCArMjQxNSwyMSBAQAogCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNSF9PRkZfREVWX1NQRUNJRklDXSAmPSB+TUhfQklUX1dQOwogCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtwZ28gKyBNUF9PRkZfUEFHRV9OQlJdICY9IE1QX01TS19QQUdFX05CUjsKIAotCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwKLQkJCSAgIChzbG93ID8gU1RwLT5sb25nX3RpbWVvdXQgOiBTVHAtPmRldmljZS0+dGltZW91dCksIDAsIDEpOwotCWlmIChTUnBudCA9PSBOVUxMKQotCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJaWYgKCFTUnBudCkKKwkJcmV0dXJuIHJldDsKKworCXRpbWVvdXQgPSBzbG93ID8gU1RwLT5sb25nX3RpbWVvdXQgOgorCQlTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKKworCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9UT19ERVZJQ0UsCisJCQkJICAgU1RwLT5idWZmZXItPmJfZGF0YSwgY21kWzRdLCB0aW1lb3V0LCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwogCiAJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAotCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTI0NjQsNyArMjUzNSw3IEBACiAJfQogCWlmIChTVHAtPmltbWVkaWF0ZSkgewogCQljbWRbMV0gPSAxOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0OwogCX0KIAllbHNlCiAJCXRpbWVvdXQgPSBTVHAtPmxvbmdfdGltZW91dDsKQEAgLTI0NzYsMTMgKzI1NDcsMTYgQEAKIAkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBMb2FkaW5nIHRhcGUuXG4iLCBuYW1lKTsKIAkJKTsKIAotCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCi0JCQkgICB0aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCisJcmV0dmFsID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsIHRpbWVvdXQsCisJCQkJICAgICAgTUFYX1JFVFJJRVMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OwogCiAJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7Ci0Jc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAogCWlmICghcmV0dmFsKSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAKQEAgLTI1MDEsNiArMjU3NSw4IEBACiAJCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKIAkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwogCX0KK291dDoKKwlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTI2MzgsNyArMjcxNCw3IEBACiAJCWNtZFsyXSA9IChhcmcgPj4gMTYpOwogCQljbWRbM10gPSAoYXJnID4+IDgpOwogCQljbWRbNF0gPSBhcmc7Ci0JCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0OwogICAgICAgICAgICAgICAgIERFQkMoCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY21kX2luID09IE1UV0VPRikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoU1RfREVCX01TRyAiJXM6IFdyaXRpbmcgJWQgZmlsZW1hcmtzLlxuIiwgbmFtZSwKQEAgLTI2NTYsNyArMjczMiw3IEBACiAJCWNtZFswXSA9IFJFWkVST19VTklUOwogCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKIAkJCWNtZFsxXSA9IDE7CS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKIAkJfQogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBSZXdpbmRpbmcgdGFwZS5cbiIsIG5hbWUpKTsKIAkJZmlsZW5vID0gYmxrbm8gPSBhdF9zbSA9IDA7CkBAIC0yNjY5LDcgKzI3NDUsNyBAQAogCQljbWRbMF0gPSBTVEFSVF9TVE9QOwogCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKIAkJCWNtZFsxXSA9IDE7CS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKIAkJfQogCQljbWRbNF0gPSAzOwogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBSZXRlbnNpb25pbmcgdGFwZS5cbiIsIG5hbWUpKTsKQEAgLTI3MDIsNyArMjc3OCw3IEBACiAJCWNtZFsxXSA9IChhcmcgPyAxIDogMCk7CS8qIExvbmcgZXJhc2Ugd2l0aCBub24temVybyBhcmd1bWVudCAqLwogCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKIAkJCWNtZFsxXSB8PSAyOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisJCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQ7CiAJCX0KIAkJZWxzZQogCQkJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0ICogODsKQEAgLTI3NTQsNyArMjgzMCw3IEBACiAJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVs5XSA9IChsdG1wID4+IDE2KTsKIAkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzEwXSA9IChsdG1wID4+IDgpOwogCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTFdID0gbHRtcDsKLQkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT50aW1lb3V0OworCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQ7CiAgICAgICAgICAgICAgICAgREVCQygKIAkJCWlmIChjbWRfaW4gPT0gTVRTRVRCTEsgfHwgY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspCiAJCQkJcHJpbnRrKFNUX0RFQl9NU0cKQEAgLTI3NzYsMTIgKzI4NTIsMTUgQEAKIAkJcmV0dXJuICgtRU5PU1lTKTsKIAl9CiAKLQlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGRhdGFsZW4sIGRpcmVjdGlvbiwKLQkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKIAlpZiAoIVNScG50KQogCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKLQlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlpb2N0bF9yZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBkaXJlY3Rpb24sCisJCQkJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBkYXRhbGVuLAorCQkJCQkgICAgdGltZW91dCwgTUFYX1JFVFJJRVMpOworCWlmICghaW9jdGxfcmVzdWx0KQorCQlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAogCWlmICghaW9jdGxfcmVzdWx0KSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CkBAIC0yOTQzLDEwICszMDIyLDE3IEBACiAJCWlmICghbG9naWNhbCAmJiAhU1RwLT5zY3NpMl9sb2dpY2FsKQogCQkJc2NtZFsxXSA9IDE7CiAJfQotCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIHNjbWQsIDIwLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQlTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOworCisJU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCisJcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIHNjbWQsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkgICAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCAyMCwKKwkJCQkgICAgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCQkgICAgICBNQVhfUkVBRFlfUkVUUklFUyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CiAKIAlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCB8fAogCSAgICAoU1RwLT5kZXZpY2UtPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCkBAIC0yOTc0LDYgKzMwNjAsNyBAQAogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBHb3QgdGFwZSBwb3MuIGJsayAlZCBwYXJ0ICVkLlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2ssICpwYXJ0aXRpb24pKTsKIAl9CitvdXQ6CiAJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAlTUnBudCA9IE5VTEw7CiAKQEAgLTMwNDUsMTMgKzMxMzIsMTcgQEAKIAl9CiAJaWYgKFNUcC0+aW1tZWRpYXRlKSB7CiAJCXNjbWRbMV0gfD0gMTsJCS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT50aW1lb3V0OworCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQ7CiAJfQogCi0JU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgc2NtZCwgMCwgRE1BX05PTkUsCi0JCQkgICB0aW1lb3V0LCBNQVhfUkVBRFlfUkVUUklFUywgMSk7CisJU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCisJcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIHNjbWQsIERNQV9OT05FLCBOVUxMLCAwLAorCQkJCSAgICAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG91dDsKIAogCVNUcHMtPmRydl9ibG9jayA9IFNUcHMtPmRydl9maWxlID0gKC0xKTsKIAlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKQEAgLTMwNzYsNyArMzE2Nyw3IEBACiAJCQlTVHBzLT5kcnZfYmxvY2sgPSBTVHBzLT5kcnZfZmlsZSA9IDA7CiAJCXJlc3VsdCA9IDA7CiAJfQotCitvdXQ6CiAJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAlTUnBudCA9IE5VTEw7CiAKQEAgLTQwMjksNyArNDEyMCw3IEBACiAJdHBudC0+cGFydGl0aW9uID0gMDsKIAl0cG50LT5uZXdfcGFydGl0aW9uID0gMDsKIAl0cG50LT5uYnJfcGFydGl0aW9ucyA9IDA7Ci0JdHBudC0+ZGV2aWNlLT50aW1lb3V0ID0gU1RfVElNRU9VVDsKKwlibGtfcXVldWVfcnFfdGltZW91dCh0cG50LT5kZXZpY2UtPnJlcXVlc3RfcXVldWUsIFNUX1RJTUVPVVQpOwogCXRwbnQtPmxvbmdfdGltZW91dCA9IFNUX0xPTkdfVElNRU9VVDsKIAl0cG50LT50cnlfZGlvID0gdHJ5X2RpcmVjdF9pbyAmJiAhU0RwLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0ZXguYyBiL2RyaXZlcnMvc2NzaS9zdGV4LmMKaW5kZXggMmZhODMwYy4uYTNhMThhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0ZXguYworKysgYi9kcml2ZXJzL3Njc2kvc3RleC5jCkBAIC0xMTA4LDggKzExMDgsNyBAQAogCQlnb3RvIG91dF9zY3NpX2hvc3RfcHV0OwogCX0KIAotCWhiYS0+bW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaGJhLT5tbWlvX2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCAhaGJhLT5tbWlvX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBtZW1vcnkgbWFwIGZhaWxlZFxuIiwKIAkJCXBjaV9uYW1lKHBkZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M0MTYuYwppbmRleCBmN2QyNzk1Li5lNWMzNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3ltNTNjNDE2LmMKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5jCkBAIC02LDcgKzYsNyBAQAogICogIENoYW5nZXMgOiAKICAqIAogICogIE1hcmNlbG8gVG9zYXR0aSA8bWFyY2Vsb0Bjb25lY3RpdmEuY29tLmJyPiA6IEFkZGVkIGlvX3JlcXVlc3RfbG9jayBsb2NraW5nCi0gKiAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gOiBDbGVhbmVkIHVwIGNvZGUgZm9ybWF0dGluZworICogIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+IDogQ2xlYW5lZCB1cCBjb2RlIGZvcm1hdHRpbmcKICAqCQkJCSBGaXhlZCBhbiBpcnEgbG9ja2luZyBidWcKICAqCQkJCSBBZGRlZCBJU0FQblAgc3VwcG9ydAogICogIEJqb2VybiBBLiBaZWViIDxiemVlYkB6YWJiYWRvei5uZXQ+IDogSW5pdGlhbCBpcnEgbG9ja2luZyB1cGRhdGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYwppbmRleCA2OWFjNmU1Li45YTQyNzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMKQEAgLTI1NzIsOSArMjU3MiwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBkYzM5MF9tb2R1bGVfaW5pdCh2b2lkKQogewotCWlmICghZGlzYWJsZV9jbHVzdGVyaW5nKQorCWlmICghZGlzYWJsZV9jbHVzdGVyaW5nKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkRDMzkwOiBjbHVzdGVyaW5nIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQuIElmIHlvdSBnZXQgcHJvYmxlbXMgbG9hZFxuIik7CiAJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICB3aXRoIFwiZGlzYWJsZV9jbHVzdGVyaW5nPTFcIiBhbmQgcmVwb3J0IHRvIG1haW50YWluZXJzXG4iKTsKKwl9CiAKIAlpZiAodG1zY3NpbVswXSA9PSAtMSB8fCB0bXNjc2ltWzBdID4gMTUpIHsKIAkJdG1zY3NpbVswXSA9IDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jIGIvZHJpdmVycy9zY3NpL3UxNC0zNGYuYwppbmRleCAzMjllYjg3Li42MDFlOTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCisrKyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKQEAgLTExMTEsNyArMTExMSw4IEBACiAKIHN0YXRpYyB2b2lkIG1hcF9kbWEodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7CiAgICB1bnNpZ25lZCBpbnQgZGF0YV9sZW4gPSAwOwotICAgdW5zaWduZWQgaW50IGssIGNvdW50LCBwY2lfZGlyOworICAgdW5zaWduZWQgaW50IGssIHBjaV9kaXI7CisgICBpbnQgY291bnQ7CiAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogICAgc3RydWN0IG1zY3AgKmNwcDsKICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCmluZGV4IGQ0YzEzNTYuLjA5MzYxMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYworKysgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKQEAgLTE0NiwxMyArMTQ2LDEzIEBACiAgKgogICogdXNlIGhvc3QtPmhvc3RfbG9jaywgbm90IGlvX3JlcXVlc3RfbG9jaywgY2xlYW51cHMKICAqCi0gKiAyMDAyLzEwLzA0IC0gQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIDIwMDIvMTAvMDQgLSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqIFVzZSBkZXZfaWQgZm9yIGludGVycnVwdHMsIGtpbGwgX19mdW5jX18gcGFzdGluZwogICogQWRkIGEgbG9jayBmb3IgdGhlIHNjYiBwb29sLCBjbGVhbiB1cCBhbGwgb3RoZXIgY2xpL3N0aSB1c2FnZSBzdHVmZgogICogVXNlIHRoZSBhZGFwdGVyIGxvY2sgZm9yIHRoZSBvdGhlciBwbGFjZXMgd2UgaGFkIHRoZSBjbGkncwogICoKLSAqIDIwMDIvMTAvMDYgLSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogMjAwMi8xMC8wNiAtIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICogU3dpdGNoIHRvIG5ldyBzdHlsZSBlcnJvciBoYW5kbGluZwogICogQ2xlYW4gdXAgZGVsYXkgdG8gdWRlbGF5LCBhbmQgeWllbGRpbmcgc2xlZXBzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCA1NzlkNjNhLi5iNjk1YWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiBjb25maWcgU0VSSUFMX1NBTVNVTkcKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTb0Mgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUk0gJiYgUExBVF9TM0MyNFhYCisJZGVwZW5kcyBvbiBBUk0gJiYgUExBVF9TM0MKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgb24tY2hpcCBVQVJUcyBvbiB0aGUgU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBDUFVzLApAQCAtNDU1LDYgKzQ1NSwxNiBAQAogCSAgcHJvdmlkZSBhbGwgb2YgdGhlc2UgcG9ydHMsIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlcmlhbCBwb3J0CiAJICBwaW5zIGFyZSBjb25maWd1cmVkLgogCitjb25maWcgU0VSSUFMX1NBTVNVTkdfVUFSVFMKKwlpbnQKKwlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HCisJZGVmYXVsdCAyIGlmIEFSQ0hfUzNDMjQwMAorCWRlZmF1bHQgNCBpZiBBUkNIX1MzQzY0WFggfHwgQ1BVX1MzQzI0NDMKKwlkZWZhdWx0IDMKKwloZWxwCisJICBTZWxlY3QgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgVUFSVCBwb3J0cyBmb3IgdGhlIFNhbXN1bmcgUzNDCisJICBzZXJpYWwgZHJpdmVyCisJCiBjb25maWcgU0VSSUFMX1NBTVNVTkdfREVCVUcKIAlib29sICJTYW1zdW5nIFNvQyBzZXJpYWwgZGVidWciCiAJZGVwZW5kcyBvbiBTRVJJQUxfU0FNU1VORyAmJiBERUJVR19MTApAQCAtNTA4LDcgKzUxOCwyMCBAQAogCWhlbHAKIAkgIFNlcmlhbCBwb3J0IHN1cHBvcnQgZm9yIHRoZSBTYW1zdW5nIFMzQzI0NDAgYW5kIFMzQzI0NDIgU29DCiAKK2NvbmZpZyBTRVJJQUxfUzNDMjRBMAorCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0QTAgU2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HICYmIENQVV9TM0MyNEEwCisJZGVmYXVsdCB5IGlmIENQVV9TM0MyNEEwCisJaGVscAorCSAgU2VyaWFsIHBvcnQgc3VwcG9ydCBmb3IgdGhlIFNhbXN1bmcgUzNDMjRBMCBTb0MKIAorY29uZmlnIFNFUklBTF9TM0M2NDAwCisJdHJpc3RhdGUgIlNhbXN1bmcgUzNDNjQwMC9TM0M2NDEwIFNlcmlhbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfU0FNU1VORyAmJiAoQ1BVX1MzQzYwMCB8fCBDUFVfUzNDNjQxMCkKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXJpYWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgU2Ftc3VuZyBTM0M2NDAwIGFuZCBTM0M2NDEwCisJICBTb0NzCiAKIGNvbmZpZyBTRVJJQUxfRFoKIAlib29sICJERUNzdGF0aW9uIERaIHNlcmlhbCBkcml2ZXIiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCmluZGV4IDBjMTdjOGQuLmRmZTc3NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC00MSw2ICs0MSw4IEBACiBvYmotJChDT05GSUdfU0VSSUFMX1MzQzI0MTApICs9IHMzYzI0MTAubwogb2JqLSQoQ09ORklHX1NFUklBTF9TM0MyNDEyKSArPSBzM2MyNDEyLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUzNDMjQ0MCkgKz0gczNjMjQ0MC5vCitvYmotJChDT05GSUdfU0VSSUFMX1MzQzI0QTApICs9IHMzYzI0YTAubworb2JqLSQoQ09ORklHX1NFUklBTF9TM0M2NDAwKSArPSBzM2M2NDAwLm8KIG9iai0kKENPTkZJR19TRVJJQUxfSVAyMl9aSUxPRykgKz0gaXAyMnppbG9nLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTVVYKSArPSBtdXgubwogb2JqLSQoQ09ORklHX1NFUklBTF82ODMyOCkgKz0gNjgzMjhzZXJpYWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCmluZGV4IDcxNTYyNjguLmUzYTVhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKQEAgLTY5Miw3ICs2OTIsNyBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdWFwLT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgIlVBUlRDTEsiKTsKKwl1YXAtPmNsayA9IGNsa19nZXQoJmRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHVhcC0+Y2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKHVhcC0+Y2xrKTsKIAkJZ290byB1bm1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCBiNzE4MDA0Li44YjJiOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC03NTYsNyArNzU2LDcgQEAKIAkJZ290byBmcmVlOwogCX0KIAotCXVhcC0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJVQVJUQ0xLIik7CisJdWFwLT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUih1YXAtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUih1YXAtPmNsayk7CiAJCWdvdG8gdW5tYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCmluZGV4IDNmOTBmMWIuLmE1MDk1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCkBAIC02Niw3ICs2Niw3IEBACiAjZGVmaW5lIE9ORU1TIDB4YjAgLyogT25lIE1pbGxpc2Vjb25kIHJlZ2lzdGVyICovCiAjZGVmaW5lIFVUUyAgIDB4YjQgLyogVUFSVCBUZXN0IFJlZ2lzdGVyICovCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9JTVgKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NWDEpCiAjZGVmaW5lIEJJUFIxIDB4YjAgLyogSW5jcmVtZW50YWwgUHJlc2V0IFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgQklQUjIgMHhiNCAvKiBJbmNyZW1lbnRhbCBQcmVzZXQgUmVnaXN0ZXIgMiAqLwogI2RlZmluZSBCSVBSMyAweGI4IC8qIEluY3JlbWVudGFsIFByZXNldCBSZWdpc3RlciAzICovCkBAIC05Niw3ICs5Niw3IEBACiAjZGVmaW5lICBVQ1IxX1JUU0RFTiAgICAgKDE8PDUpCSAvKiBSVFMgZGVsdGEgaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSAgVUNSMV9TTkRCUksgICAgICgxPDw0KQkgLyogU2VuZCBicmVhayAqLwogI2RlZmluZSAgVUNSMV9URE1BRU4gICAgICgxPDwzKQkgLyogVHJhbnNtaXR0ZXIgcmVhZHkgRE1BIGVuYWJsZSAqLwotI2lmZGVmIENPTkZJR19BUkNIX0lNWAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSU1YKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX01YMSkKICNkZWZpbmUgIFVDUjFfVUFSVENMS0VOICAoMTw8MikJIC8qIFVBUlQgY2xvY2sgZW5hYmxlZCAqLwogI2VuZGlmCiAjaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMgfHwgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIKQEAgLTE4NywxMSArMTg3LDExIEBACiAjZGVmaW5lIE1BWF9JTlRFUk5BTF9JUlEJSU1YX0lSUVMKICNlbmRpZgogCi0jaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMgfHwgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIKKyNpZmRlZiBDT05GSUdfQVJDSF9NWEMKICNkZWZpbmUgU0VSSUFMX0lNWF9NQUpPUiAgICAgICAgMjA3CiAjZGVmaW5lIE1JTk9SX1NUQVJUCSAgICAgICAgMTYKICNkZWZpbmUgREVWX05BTUUJCSJ0dHlteGMiCi0jZGVmaW5lIE1BWF9JTlRFUk5BTF9JUlEJTVhDX01BWF9JTlRfTElORVMKKyNkZWZpbmUgTUFYX0lOVEVSTkFMX0lSUQlNWENfSU5URVJOQUxfSVJRUwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9weGEuYyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCmluZGV4IGFiYzAwYmUuLmY2ZTNiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLXVhcnQuaD4KIAogCiBzdHJ1Y3QgdWFydF9weGFfcG9ydCB7CkBAIC03NjYsNyArNzY3LDcgQEAKIAlpZiAoIXNwb3J0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwb3J0LT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgIlVBUlRDTEsiKTsKKwlzcG9ydC0+Y2xrID0gY2xrX2dldCgmZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoc3BvcnQtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihzcG9ydC0+Y2xrKTsKIAkJZ290byBlcnJfZnJlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0YTAuYyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0YTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmYyZmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjMjRhMC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBsaW51eC9kcml2ZXJzL3NlcmlhbC9zM2MyNGEwLmMKKyAqCisgKiBEcml2ZXIgZm9yIFNhbXN1bmcgUzNDMjRBMCBTb0Mgb25ib2FyZCBVQVJUcy4KKyAqCisgKiBCYXNlZCBvbiBkcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKKyAqCisgKiBBdXRob3I6IFNhbmRlZXAgUGF0aWwgPHNhbmRlZXAucGF0aWxAYXppbmdvLmNvbT4KKyAqCisgKiBCZW4gRG9va3MsIENvcHlyaWdodCAoYykgMjAwMy0yMDA1LDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSAic2Ftc3VuZy5oIgorCitzdGF0aWMgaW50IHMzYzI0YTBfc2VyaWFsX3NldHNvdXJjZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCSAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKKworCWlmIChzdHJjbXAoY2xrLT5uYW1lLCAidWNsayIpID09IDApCisJCXVjb24gfD0gUzNDMjQxMF9VQ09OX1VDTEs7CisJZWxzZQorCQl1Y29uICY9IH5TM0MyNDEwX1VDT05fVUNMSzsKKworCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCB1Y29uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNGEwX3NlcmlhbF9nZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHVjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTik7CisKKwljbGstPmRpdmlzb3IgPSAxOworCWNsay0+bmFtZSA9ICh1Y29uICYgUzNDMjQxMF9VQ09OX1VDTEspID8gInVjbGsiIDogInBjbGsiOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjRhMF9zZXJpYWxfcmVzZXRwb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJICAgIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZykKK3sKKwlkYmcoInMzYzI0YTBfc2VyaWFsX3Jlc2V0cG9ydDogcG9ydD0lcCAoJTA4bHgpLCBjZmc9JXBcbiIsCisJICAgIHBvcnQsIHBvcnQtPm1hcGJhc2UsIGNmZyk7CisKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiwgIGNmZy0+dWNvbik7CisJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VMQ09OLCBjZmctPnVsY29uKTsKKworCS8qIHJlc2V0IGJvdGggZmlmb3MgKi8KKworCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbiB8IFMzQzI0MTBfVUZDT05fUkVTRVRCT1RIKTsKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUZDT04sIGNmZy0+dWZjb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gczNjMjRhMF91YXJ0X2luZiA9IHsKKwkubmFtZQkJPSAiU2Ftc3VuZyBTM0MyNEEwIFVBUlQiLAorCS50eXBlCQk9IFBPUlRfUzNDMjQxMCwKKwkuZmlmb3NpemUJPSAxNiwKKwkucnhfZmlmb21hc2sJPSBTM0MyNEEwX1VGU1RBVF9SWE1BU0ssCisJLnJ4X2ZpZm9zaGlmdAk9IFMzQzI0QTBfVUZTVEFUX1JYU0hJRlQsCisJLnJ4X2ZpZm9mdWxsCT0gUzNDMjRBMF9VRlNUQVRfUlhGVUxMLAorCS50eF9maWZvZnVsbAk9IFMzQzI0QTBfVUZTVEFUX1RYRlVMTCwKKwkudHhfZmlmb21hc2sJPSBTM0MyNEEwX1VGU1RBVF9UWE1BU0ssCisJLnR4X2ZpZm9zaGlmdAk9IFMzQzI0QTBfVUZTVEFUX1RYU0hJRlQsCisJLmdldF9jbGtzcmMJPSBzM2MyNGEwX3NlcmlhbF9nZXRzb3VyY2UsCisJLnNldF9jbGtzcmMJPSBzM2MyNGEwX3NlcmlhbF9zZXRzb3VyY2UsCisJLnJlc2V0X3BvcnQJPSBzM2MyNGEwX3NlcmlhbF9yZXNldHBvcnQsCit9OworCitzdGF0aWMgaW50IHMzYzI0YTBfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gczNjMjR4eF9zZXJpYWxfcHJvYmUoZGV2LCAmczNjMjRhMF91YXJ0X2luZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0YTBfc2VyaWFsX2RydiA9IHsKKwkucHJvYmUJCT0gczNjMjRhMF9zZXJpYWxfcHJvYmUsCisJLnJlbW92ZQkJPSBzM2MyNHh4X3NlcmlhbF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInMzYzI0YTAtdWFydCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzM2MyNHh4X2NvbnNvbGVfaW5pdCgmczNjMjRhMF9zZXJpYWxfZHJ2LCAmczNjMjRhMF91YXJ0X2luZik7CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0YTBfc2VyaWFsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gczNjMjR4eF9zZXJpYWxfaW5pdCgmczNjMjRhMF9zZXJpYWxfZHJ2LCAmczNjMjRhMF91YXJ0X2luZik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzM2MyNGEwX3NlcmlhbF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0YTBfc2VyaWFsX2Rydik7Cit9CisKK21vZHVsZV9pbml0KHMzYzI0YTBfc2VyaWFsX2luaXQpOworbW9kdWxlX2V4aXQoczNjMjRhMF9zZXJpYWxfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3MzYzY0MDAuYyBiL2RyaXZlcnMvc2VyaWFsL3MzYzY0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjkzNmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjNjQwMC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiBsaW51eC9kcml2ZXJzL3NlcmlhbC9zM2M2NDAwLmMKKyAqCisgKiBEcml2ZXIgZm9yIFNhbXN1bmcgUzNDNjQwMCBhbmQgUzNDNjQxMCBTb0Mgb25ib2FyZCBVQVJUcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgIEluYy4KKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorCisjaW5jbHVkZSAic2Ftc3VuZy5oIgorCitzdGF0aWMgaW50IHMzYzY0MDBfc2VyaWFsX3NldHNvdXJjZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCSAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKKworCWlmIChzdHJjbXAoY2xrLT5uYW1lLCAidWNsazAiKSA9PSAwKSB7CisJCXVjb24gJj0gflMzQzY0MDBfVUNPTl9DTEtNQVNLOworCQl1Y29uIHw9IFMzQzY0MDBfVUNPTl9VQ0xLMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChjbGstPm5hbWUsICJ1Y2xrMSIpID09IDApCisJCXVjb24gfD0gUzNDNjQwMF9VQ09OX1VDTEsxOworCWVsc2UgaWYgKHN0cmNtcChjbGstPm5hbWUsICJwY2xrIikgPT0gMCkgeworCQkvKiBTZWUgbm90ZXMgYWJvdXQgdHJhbnNpdGlvbmluZyBmcm9tIFVDTEsgdG8gUENMSyAqLworCQl1Y29uICY9IH5TM0M2NDAwX1VDT05fVUNMSzA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1bmtub3duIGNsb2NrIHNvdXJjZSAlc1xuIiwgY2xrLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04sIHVjb24pOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgczNjNjQwMF9zZXJpYWxfZ2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJICAgIHN0cnVjdCBzM2MyNHh4X3VhcnRfY2xrc3JjICpjbGspCit7CisJdTMyIHVjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTik7CisKKwljbGstPmRpdmlzb3IgPSAxOworCisJc3dpdGNoICh1Y29uICYgUzNDNjQwMF9VQ09OX0NMS01BU0spIHsKKwljYXNlIFMzQzY0MDBfVUNPTl9VQ0xLMDoKKwkJY2xrLT5uYW1lID0gInVjbGswIjsKKwkJYnJlYWs7CisKKwljYXNlIFMzQzY0MDBfVUNPTl9VQ0xLMToKKwkJY2xrLT5uYW1lID0gInVjbGsxIjsKKwkJYnJlYWs7CisKKwljYXNlIFMzQzY0MDBfVUNPTl9QQ0xLOgorCWNhc2UgUzNDNjQwMF9VQ09OX1BDTEsyOgorCQljbGstPm5hbWUgPSAicGNsayI7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzY0MDBfc2VyaWFsX3Jlc2V0cG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJCSAgICBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcpCit7CisJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOworCisJZGJnKCJzM2M2NDAwX3NlcmlhbF9yZXNldHBvcnQ6IHBvcnQ9JXAgKCUwOGx4KSwgY2ZnPSVwXG4iLAorCSAgICBwb3J0LCBwb3J0LT5tYXBiYXNlLCBjZmcpOworCisJLyogZW5zdXJlIHdlIGRvbid0IGNoYW5nZSB0aGUgY2xvY2sgc2V0dGluZ3MuLi4gKi8KKworCXVjb24gJj0gUzNDNjQwMF9VQ09OX0NMS01BU0s7CisKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiwgIHVjb24gfCBjZmctPnVjb24pOworCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VTENPTiwgY2ZnLT51bGNvbik7CisKKwkvKiByZXNldCBib3RoIGZpZm9zICovCisKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUZDT04sIGNmZy0+dWZjb24gfCBTM0MyNDEwX1VGQ09OX1JFU0VUQk9USCk7CisJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VGQ09OLCBjZmctPnVmY29uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHMzYzI0eHhfdWFydF9pbmZvIHMzYzY0MDBfdWFydF9pbmYgPSB7CisJLm5hbWUJCT0gIlNhbXN1bmcgUzNDNjQwMCBVQVJUIiwKKwkudHlwZQkJPSBQT1JUX1MzQzY0MDAsCisJLmZpZm9zaXplCT0gNjQsCisJLnJ4X2ZpZm9tYXNrCT0gUzNDMjQ0MF9VRlNUQVRfUlhNQVNLLAorCS5yeF9maWZvc2hpZnQJPSBTM0MyNDQwX1VGU1RBVF9SWFNISUZULAorCS5yeF9maWZvZnVsbAk9IFMzQzI0NDBfVUZTVEFUX1JYRlVMTCwKKwkudHhfZmlmb2Z1bGwJPSBTM0MyNDQwX1VGU1RBVF9UWEZVTEwsCisJLnR4X2ZpZm9tYXNrCT0gUzNDMjQ0MF9VRlNUQVRfVFhNQVNLLAorCS50eF9maWZvc2hpZnQJPSBTM0MyNDQwX1VGU1RBVF9UWFNISUZULAorCS5nZXRfY2xrc3JjCT0gczNjNjQwMF9zZXJpYWxfZ2V0c291cmNlLAorCS5zZXRfY2xrc3JjCT0gczNjNjQwMF9zZXJpYWxfc2V0c291cmNlLAorCS5yZXNldF9wb3J0CT0gczNjNjQwMF9zZXJpYWxfcmVzZXRwb3J0LAorfTsKKworLyogZGV2aWNlIG1hbmFnZW1lbnQgKi8KKworc3RhdGljIGludCBzM2M2NDAwX3NlcmlhbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJZGJnKCJzM2M2NDAwX3NlcmlhbF9wcm9iZTogZGV2PSVwXG4iLCBkZXYpOworCXJldHVybiBzM2MyNHh4X3NlcmlhbF9wcm9iZShkZXYsICZzM2M2NDAwX3VhcnRfaW5mKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjNjQwMF9zZXJpYWxfZHJ2ID0geworCS5wcm9iZQkJPSBzM2M2NDAwX3NlcmlhbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0eHhfc2VyaWFsX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiczNjNjQwMC11YXJ0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3MzYzI0eHhfY29uc29sZV9pbml0KCZzM2M2NDAwX3NlcmlhbF9kcnYsICZzM2M2NDAwX3VhcnRfaW5mKTsKKworc3RhdGljIGludCBfX2luaXQgczNjNjQwMF9zZXJpYWxfaW5pdCh2b2lkKQoreworCXJldHVybiBzM2MyNHh4X3NlcmlhbF9pbml0KCZzM2M2NDAwX3NlcmlhbF9kcnYsICZzM2M2NDAwX3VhcnRfaW5mKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHMzYzY0MDBfc2VyaWFsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjNjQwMF9zZXJpYWxfZHJ2KTsKK30KKworbW9kdWxlX2luaXQoczNjNjQwMF9zZXJpYWxfaW5pdCk7Cittb2R1bGVfZXhpdChzM2M2NDAwX3NlcmlhbF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFMzQzY0MDAsUzNDNjQxMCBTb0MgU2VyaWFsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYzY0MDAtdWFydCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2Ftc3VuZy5jIGIvZHJpdmVycy9zZXJpYWwvc2Ftc3VuZy5jCmluZGV4IDFlMjE5ZDMuLjQxYWM5NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zYW1zdW5nLmMKQEAgLTQyLDEzICs0MiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAogI2luY2x1ZGUgInNhbXN1bmcuaCIKIApAQCAtNTgsMTkgKzU5LDYgQEAKICNkZWZpbmUgUzNDMjRYWF9TRVJJQUxfTUFKT1IJMjA0CiAjZGVmaW5lIFMzQzI0WFhfU0VSSUFMX01JTk9SCTY0CiAKLS8qIHdlIGNhbiBzdXBwb3J0IDMgdWFydHMsIGJ1dCBub3QgYWx3YXlzIHVzZSB0aGVtICovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MDAKLSNkZWZpbmUgTlJfUE9SVFMgKDIpCi0jZWxzZQotI2RlZmluZSBOUl9QT1JUUyAoMykKLSNlbmRpZgotCi0vKiBwb3J0IGlycSBudW1iZXJzICovCi0KLSNkZWZpbmUgVFhfSVJRKHBvcnQpICgocG9ydCktPmlycSArIDEpCi0jZGVmaW5lIFJYX0lSUShwb3J0KSAoKHBvcnQpLT5pcnEpCi0KIC8qIG1hY3JvcyB0byBjaGFuZ2Ugb25lIHRoaW5nIHRvIGFub3RoZXIgKi8KIAogI2RlZmluZSB0eF9lbmFibGVkKHBvcnQpICgocG9ydCktPnVudXNlZFswXSkKQEAgLTEzNiw4ICsxMjQsMTAgQEAKIAogc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCAqb3VycG9ydCA9IHRvX291cnBvcnQocG9ydCk7CisKIAlpZiAodHhfZW5hYmxlZChwb3J0KSkgewotCQlkaXNhYmxlX2lycShUWF9JUlEocG9ydCkpOworCQlkaXNhYmxlX2lycShvdXJwb3J0LT50eF9pcnEpOwogCQl0eF9lbmFibGVkKHBvcnQpID0gMDsKIAkJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0NPTlNfRkxPVykKIAkJCXMzYzI0eHhfc2VyaWFsX3J4X2VuYWJsZShwb3J0KTsKQEAgLTE0NiwxMSArMTM2LDEzIEBACiAKIHN0YXRpYyB2b2lkIHMzYzI0eHhfc2VyaWFsX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKKwogCWlmICghdHhfZW5hYmxlZChwb3J0KSkgewogCQlpZiAocG9ydC0+ZmxhZ3MgJiBVUEZfQ09OU19GTE9XKQogCQkJczNjMjR4eF9zZXJpYWxfcnhfZGlzYWJsZShwb3J0KTsKIAotCQllbmFibGVfaXJxKFRYX0lSUShwb3J0KSk7CisJCWVuYWJsZV9pcnEob3VycG9ydC0+dHhfaXJxKTsKIAkJdHhfZW5hYmxlZChwb3J0KSA9IDE7CiAJfQogfQpAQCAtMTU4LDkgKzE1MCwxMSBAQAogCiBzdGF0aWMgdm9pZCBzM2MyNHh4X3NlcmlhbF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKKwogCWlmIChyeF9lbmFibGVkKHBvcnQpKSB7CiAJCWRiZygiczNjMjR4eF9zZXJpYWxfc3RvcF9yeDogcG9ydD0lcFxuIiwgcG9ydCk7Ci0JCWRpc2FibGVfaXJxKFJYX0lSUShwb3J0KSk7CisJCWRpc2FibGVfaXJxKG91cnBvcnQtPnJ4X2lycSk7CiAJCXJ4X2VuYWJsZWQocG9ydCkgPSAwOwogCX0KIH0KQEAgLTM4NCwxMyArMzc4LDEzIEBACiAJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKIAogCWlmIChvdXJwb3J0LT50eF9jbGFpbWVkKSB7Ci0JCWZyZWVfaXJxKFRYX0lSUShwb3J0KSwgb3VycG9ydCk7CisJCWZyZWVfaXJxKG91cnBvcnQtPnR4X2lycSwgb3VycG9ydCk7CiAJCXR4X2VuYWJsZWQocG9ydCkgPSAwOwogCQlvdXJwb3J0LT50eF9jbGFpbWVkID0gMDsKIAl9CiAKIAlpZiAob3VycG9ydC0+cnhfY2xhaW1lZCkgewotCQlmcmVlX2lycShSWF9JUlEocG9ydCksIG91cnBvcnQpOworCQlmcmVlX2lycShvdXJwb3J0LT5yeF9pcnEsIG91cnBvcnQpOwogCQlvdXJwb3J0LT5yeF9jbGFpbWVkID0gMDsKIAkJcnhfZW5hYmxlZChwb3J0KSA9IDA7CiAJfQpAQCAtNDA3LDEyICs0MDEsMTEgQEAKIAogCXJ4X2VuYWJsZWQocG9ydCkgPSAxOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoUlhfSVJRKHBvcnQpLAotCQkJICBzM2MyNHh4X3NlcmlhbF9yeF9jaGFycywgMCwKKwlyZXQgPSByZXF1ZXN0X2lycShvdXJwb3J0LT5yeF9pcnEsIHMzYzI0eHhfc2VyaWFsX3J4X2NoYXJzLCAwLAogCQkJICBzM2MyNHh4X3NlcmlhbF9wb3J0bmFtZShwb3J0KSwgb3VycG9ydCk7CiAKIAlpZiAocmV0ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGlycSAlZFxuIiwgUlhfSVJRKHBvcnQpKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZ2V0IGlycSAlZFxuIiwgb3VycG9ydC0+cnhfaXJxKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQyMiwxMiArNDE1LDExIEBACiAKIAl0eF9lbmFibGVkKHBvcnQpID0gMTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKFRYX0lSUShwb3J0KSwKLQkJCSAgczNjMjR4eF9zZXJpYWxfdHhfY2hhcnMsIDAsCisJcmV0ID0gcmVxdWVzdF9pcnEob3VycG9ydC0+dHhfaXJxLCBzM2MyNHh4X3NlcmlhbF90eF9jaGFycywgMCwKIAkJCSAgczNjMjR4eF9zZXJpYWxfcG9ydG5hbWUocG9ydCksIG91cnBvcnQpOwogCiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBnZXQgaXJxICVkXG4iLCBUWF9JUlEocG9ydCkpOworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBnZXQgaXJxICVkXG4iLCBvdXJwb3J0LT50eF9pcnEpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTQ1Miw2ICs0NDQsOCBAQAogewogCXN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCAqb3VycG9ydCA9IHRvX291cnBvcnQocG9ydCk7CiAKKwlvdXJwb3J0LT5wbV9sZXZlbCA9IGxldmVsOworCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgMzoKIAkJaWYgKCFJU19FUlIob3VycG9ydC0+YmF1ZGNsaykgJiYgb3VycG9ydC0+YmF1ZGNsayAhPSBOVUxMKQpAQCAtNjYxLDYgKzY1NSw3IEBACiAKIAkJb3VycG9ydC0+Y2xrc3JjID0gY2xrc3JjOwogCQlvdXJwb3J0LT5iYXVkY2xrID0gY2xrOworCQlvdXJwb3J0LT5iYXVkY2xrX3JhdGUgPSBjbGsgPyBjbGtfZ2V0X3JhdGUoY2xrKSA6IDA7CiAJfQogCiAJc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKQEAgLTc1Miw2ICs3NDcsOCBAQAogCQlyZXR1cm4gIlMzQzI0NDAiOwogCWNhc2UgUE9SVF9TM0MyNDEyOgogCQlyZXR1cm4gIlMzQzI0MTIiOworCWNhc2UgUE9SVF9TM0M2NDAwOgorCQlyZXR1cm4gIlMzQzY0MDAvMTAiOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTgyNywxNCArODI0LDE0IEBACiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHMzYzI0eHhfdWFydF9kcnYgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kZXZfbmFtZQk9ICJzM2MyNDEwX3NlcmlhbCIsCi0JLm5yCQk9IDMsCisJLm5yCQk9IENPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUywKIAkuY29ucwkJPSBTM0MyNFhYX1NFUklBTF9DT05TT0xFLAogCS5kcml2ZXJfbmFtZQk9IFMzQzI0WFhfU0VSSUFMX05BTUUsCiAJLm1ham9yCQk9IFMzQzI0WFhfU0VSSUFMX01BSk9SLAogCS5taW5vcgkJPSBTM0MyNFhYX1NFUklBTF9NSU5PUiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgczNjMjR4eF9zZXJpYWxfcG9ydHNbTlJfUE9SVFNdID0geworc3RhdGljIHN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCBzM2MyNHh4X3NlcmlhbF9wb3J0c1tDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFNdID0gewogCVswXSA9IHsKIAkJLnBvcnQgPSB7CiAJCQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChzM2MyNHh4X3NlcmlhbF9wb3J0c1swXS5wb3J0LmxvY2spLApAQCAtODU5LDcgKzg1Niw3IEBACiAJCQkubGluZQkJPSAxLAogCQl9CiAJfSwKLSNpZiBOUl9QT1JUUyA+IDIKKyNpZiBDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFMgPiAyCiAKIAlbMl0gPSB7CiAJCS5wb3J0ID0gewpAQCAtODcyLDYgKzg2OSwyMCBAQAogCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkJLmxpbmUJCT0gMiwKIAkJfQorCX0sCisjZW5kaWYKKyNpZiBDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFMgPiAzCisJWzNdID0geworCQkucG9ydCA9IHsKKwkJCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHMzYzI0eHhfc2VyaWFsX3BvcnRzWzNdLnBvcnQubG9jayksCisJCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkJLmlycQkJPSBJUlFfUzNDVUFSVF9SWDMsCisJCQkudWFydGNsawk9IDAsCisJCQkuZmlmb3NpemUJPSAxNiwKKwkJCS5vcHMJCT0gJnMzYzI0eHhfc2VyaWFsX29wcywKKwkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJCS5saW5lCQk9IDMsCisJCX0KIAl9CiAjZW5kaWYKIH07CkBAIC04OTAsNiArOTAxLDg5IEBACiAJcmV0dXJuIChpbmZvLT5yZXNldF9wb3J0KShwb3J0LCBjZmcpOwogfQogCisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKKworc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9jcHVmcmVxX3RyYW5zaXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKnBvcnQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisKKwlwb3J0ID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQsIGZyZXFfdHJhbnNpdGlvbik7CisJdXBvcnQgPSAmcG9ydC0+cG9ydDsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiBwb3J0IGlzIGVuYWJsZWQgKi8KKworCWlmIChwb3J0LT5wbV9sZXZlbCAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHRyeSBhbmQgd29yayBvdXQgaWYgdGhlIGJhdWRyYXRlIGlzIGNoYW5naW5nLCB3ZSBjYW4gZGV0ZWN0CisJICogYSBjaGFuZ2UgaW4gcmF0ZSwgYnV0IHdlIGRvIG5vdCBoYXZlIHN1cHBvcnQgZm9yIGRldGVjdGluZworCSAqIGEgZGlzdHVyYmFuY2UgaW4gdGhlIGNsb2NrLXJhdGUgb3ZlciB0aGUgY2hhbmdlLgorCSAqLworCisJaWYgKElTX0VSUihwb3J0LT5jbGspKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAocG9ydC0+YmF1ZGNsa19yYXRlID09IGNsa19nZXRfcmF0ZShwb3J0LT5jbGspKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFKSB7CisJCS8qIHdlIHNob3VsZCByZWFsbHkgc2h1dCB0aGUgcG9ydCBkb3duIHdoaWxzdCB0aGUKKwkJICogZnJlcXVlbmN5IGNoYW5nZSBpcyBpbiBwcm9ncmVzcy4gKi8KKworCX0gZWxzZSBpZiAodmFsID09IENQVUZSRVFfUE9TVENIQU5HRSkgeworCQlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3M7CisJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwkJaWYgKHVwb3J0LT5pbmZvID09IE5VTEwpCisJCQlnb3RvIGV4aXQ7CisKKwkJdHR5ID0gdXBvcnQtPmluZm8tPnBvcnQudHR5OworCisJCWlmICh0dHkgPT0gTlVMTCkKKwkJCWdvdG8gZXhpdDsKKworCQl0ZXJtaW9zID0gdHR5LT50ZXJtaW9zOworCisJCWlmICh0ZXJtaW9zID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyB0ZXJtaW9zP1xuIiwgX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9CisKKwkJczNjMjR4eF9zZXJpYWxfc2V0X3Rlcm1pb3ModXBvcnQsIHRlcm1pb3MsIE5VTEwpOworCX0KKworIGV4aXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHMzYzI0eHhfc2VyaWFsX2NwdWZyZXFfcmVnaXN0ZXIoc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpwb3J0KQoreworCXBvcnQtPmZyZXFfdHJhbnNpdGlvbi5ub3RpZmllcl9jYWxsID0gczNjMjR4eF9zZXJpYWxfY3B1ZnJlcV90cmFuc2l0aW9uOworCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnBvcnQtPmZyZXFfdHJhbnNpdGlvbiwKKwkJCQkJIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X3NlcmlhbF9jcHVmcmVxX2RlcmVnaXN0ZXIoc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpwb3J0KQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcigmcG9ydC0+ZnJlcV90cmFuc2l0aW9uLAorCQkJCSAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgczNjMjR4eF9zZXJpYWxfY3B1ZnJlcV9yZWdpc3RlcihzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X3NlcmlhbF9jcHVmcmVxX2RlcmVnaXN0ZXIoc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpwb3J0KQoreworfQorI2VuZGlmCisKIC8qIHMzYzI0eHhfc2VyaWFsX2luaXRfcG9ydAogICoKICAqIGluaXRpYWxpc2UgYSBzaW5nbGUgc2VyaWFsIHBvcnQgZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlIGdpdmVuCkBAIC05MTQsOCArMTAwOCwxMSBAQAogCWlmIChwb3J0LT5tYXBiYXNlICE9IDApCiAJCXJldHVybiAwOwogCi0JaWYgKGNmZy0+aHdwb3J0ID4gMykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNmZy0+aHdwb3J0ID4gQ09ORklHX1NFUklBTF9TQU1TVU5HX1VBUlRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBvcnQgJWQgYmlnZ2VyIHRoYW4gJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgY2ZnLT5od3BvcnQsIENPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KIAogCS8qIHNldHVwIGluZm8gZm9yIHBvcnQgKi8KIAlwb3J0LT5kZXYJPSAmcGxhdGRldi0+ZGV2OwpAQCAtOTQzLDE4ICsxMDQwLDI2IEBACiAKIAlkYmcoInJlc291cmNlICVwICglbHguLiVseClcbiIsIHJlcywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOwogCi0JcG9ydC0+bWFwYmFzZQk9IHJlcy0+c3RhcnQ7Ci0JcG9ydC0+bWVtYmFzZQk9IFMzQzI0WFhfVkFfVUFSVCArIChyZXMtPnN0YXJ0IC0gUzNDMjRYWF9QQV9VQVJUKTsKKwlwb3J0LT5tYXBiYXNlID0gcmVzLT5zdGFydDsKKwlwb3J0LT5tZW1iYXNlID0gUzNDX1ZBX1VBUlQgKyByZXMtPnN0YXJ0IC0gKFMzQ19QQV9VQVJUICYgMHhmZmYwMDAwMCk7CiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwbGF0ZGV2LCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcG9ydC0+aXJxID0gMDsKLQllbHNlCisJZWxzZSB7CiAJCXBvcnQtPmlycSA9IHJldDsKKwkJb3VycG9ydC0+cnhfaXJxID0gcmV0OworCQlvdXJwb3J0LT50eF9pcnEgPSByZXQgKyAxOworCX0KKwkKKwlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBsYXRkZXYsIDEpOworCWlmIChyZXQgPiAwKQorCQlvdXJwb3J0LT50eF9pcnEgPSByZXQ7CiAKIAlvdXJwb3J0LT5jbGsJPSBjbGtfZ2V0KCZwbGF0ZGV2LT5kZXYsICJ1YXJ0Iik7CiAKLQlkYmcoInBvcnQ6IG1hcD0lMDh4LCBtZW09JTA4eCwgaXJxPSVkLCBjbG9jaz0lbGRcbiIsCi0JICAgIHBvcnQtPm1hcGJhc2UsIHBvcnQtPm1lbWJhc2UsIHBvcnQtPmlycSwgcG9ydC0+dWFydGNsayk7CisJZGJnKCJwb3J0OiBtYXA9JTA4eCwgbWVtPSUwOHgsIGlycT0lZCAoJWQsJWQpLCBjbG9jaz0lbGRcbiIsCisJICAgIHBvcnQtPm1hcGJhc2UsIHBvcnQtPm1lbWJhc2UsIHBvcnQtPmlycSwKKwkgICAgb3VycG9ydC0+cnhfaXJxLCBvdXJwb3J0LT50eF9pcnEsIHBvcnQtPnVhcnRjbGspOwogCiAJLyogcmVzZXQgdGhlIGZpZm9zIChhbmQgc2V0dXAgdGhlIHVhcnQpICovCiAJczNjMjR4eF9zZXJpYWxfcmVzZXRwb3J0KHBvcnQsIGNmZyk7CkBAIC0xMDAyLDYgKzExMDcsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFkZCBjbGtzcmMgYXR0ci5cbiIsIF9fZnVuY19fKTsKIAorCXJldCA9IHMzYzI0eHhfc2VyaWFsX2NwdWZyZXFfcmVnaXN0ZXIob3VycG9ydCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBjcHVmcmVxIG5vdGlmaWVyXG4iKTsKKwogCXJldHVybiAwOwogCiAgcHJvYmVfZXJyOgpAQCAtMTAxNSw2ICsxMTI0LDcgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gczNjMjR4eF9kZXZfdG9fcG9ydCgmZGV2LT5kZXYpOwogCiAJaWYgKHBvcnQpIHsKKwkJczNjMjR4eF9zZXJpYWxfY3B1ZnJlcV9kZXJlZ2lzdGVyKHRvX291cnBvcnQocG9ydCkpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfY2xvY2tfc291cmNlKTsKIAkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnMzYzI0eHhfdWFydF9kcnYsIHBvcnQpOwogCX0KQEAgLTEyMTksNyArMTMyOSw3IEBACiAKIAlwbGF0ZGV2X3B0ciA9IHMzYzI0eHhfdWFydF9kZXZzOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyssIHB0cisrLCBwbGF0ZGV2X3B0cisrKSB7CisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUUzsgaSsrLCBwdHIrKywgcGxhdGRldl9wdHIrKykgewogCQlzM2MyNHh4X3NlcmlhbF9pbml0X3BvcnQocHRyLCBpbmZvLCAqcGxhdGRldl9wdHIpOwogCX0KIApAQCAtMTI0MCw3ICsxMzUwLDcgQEAKIAogCS8qIGlzIHRoaXMgYSB2YWxpZCBwb3J0ICovCiAKLQlpZiAoY28tPmluZGV4ID09IC0xIHx8IGNvLT5pbmRleCA+PSBOUl9QT1JUUykKKwlpZiAoY28tPmluZGV4ID09IC0xIHx8IGNvLT5pbmRleCA+PSBDT05GSUdfU0VSSUFMX1NBTVNVTkdfVUFSVFMpCiAJCWNvLT5pbmRleCA9IDA7CiAKIAlwb3J0ID0gJnMzYzI0eHhfc2VyaWFsX3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuaCBiL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuaAppbmRleCA1YzkyZWJiLi41NzFkNmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zYW1zdW5nLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvc2Ftc3VuZy5oCkBAIC0zMywxMiArMzMsMjEgQEAKIHN0cnVjdCBzM2MyNHh4X3VhcnRfcG9ydCB7CiAJdW5zaWduZWQgY2hhcgkJCXJ4X2NsYWltZWQ7CiAJdW5zaWduZWQgY2hhcgkJCXR4X2NsYWltZWQ7CisJdW5zaWduZWQgaW50CQkJcG1fbGV2ZWw7CisJdW5zaWduZWQgbG9uZwkJCWJhdWRjbGtfcmF0ZTsKKworCXVuc2lnbmVkIGludAkJCXJ4X2lycTsKKwl1bnNpZ25lZCBpbnQJCQl0eF9pcnE7CiAKIAlzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8JKmluZm87CiAJc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMJKmNsa3NyYzsKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKIAlzdHJ1Y3QgY2xrCQkJKmJhdWRjbGs7CiAJc3RydWN0IHVhcnRfcG9ydAkJcG9ydDsKKworI2lmZGVmIENPTkZJR19DUFVfRlJFUQorCXN0cnVjdCBub3RpZmllcl9ibG9jawkJZnJlcV90cmFuc2l0aW9uOworI2VuZGlmCiB9OwogCiAvKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKaW5kZXggNjFkYzhiMy4uYTdiZjAyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCkBAIC00MSw5ICs0MSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogI2RlZmluZSBERVZfTUFKT1IJMjA0CiAjZGVmaW5lIERFVl9NSU5PUgkxNgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IGNmMTJmMmQuLjYxMDRmNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTMyLDggKzMyLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgogCisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1zc3AuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCmluZGV4IGMyNTJjYmEuLjI1NmQxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9yZWdzLXNwaS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KICNpbmNsdWRlIDxtYWNoL3NwaS5oPgogCiBzdHJ1Y3QgczNjMjR4eF9zcGkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKaW5kZXggMmRiYzBkYi4uOGM1MDI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCkBAIC0yMTQ1LDcgKzIxNDUsNyBAQAogCWlmIChpcnEgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRldi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiVURDQ0xLIik7CisJZGV2LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoZGV2LT5jbGspKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIoZGV2LT5jbGspOwogCQlnb3RvIGVycl9jbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYwppbmRleCBjYWEzN2M5Li45NDRlNGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKQEAgLTIyMjYsNyArMjIyNiw3IEBACiAJdWRjLT5kZXYgPSAmcGRldi0+ZGV2OwogCXVkYy0+bWFjaCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JdWRjLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJVRENDTEsiKTsKKwl1ZGMtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUih1ZGMtPmNsaykpIHsKIAkJcmV0dmFsID0gUFRSX0VSUih1ZGMtPmNsayk7CiAJCWdvdG8gZXJyX2NsazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKaW5kZXggMDBiYTA2Yi4uOGQ4ZDY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKQEAgLTUzLDggKzUzLDggQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcmVncy11ZGMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3VkYy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy11ZGMuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgogCiAKICNpbmNsdWRlICJzM2MyNDEwX3VkYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW9yaW9uLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb3Jpb24uYwppbmRleCA1NDE2Y2Y5Li45ZDQ4NzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb3Jpb24uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb3Jpb24uYwpAQCAtMzMsOCArMzMsOSBAQAogLyoKICAqIEltcGxlbWVudCBPcmlvbiBVU0IgY29udHJvbGxlciBzcGVjaWZpY2F0aW9uIGd1aWRlbGluZXMKICAqLwotc3RhdGljIHZvaWQgb3Jpb25fdXNiX3NldHVwKHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgdm9pZCBvcmlvbl91c2JfcGh5X3YxX3NldHVwKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CisJLyogVGhlIGJlbG93IEdMcyBhcmUgYWNjb3JkaW5nIHRvIHRoZSBPcmlvbiBFcnJhdGEgZG9jdW1lbnQgKi8KIAkvKgogCSAqIENsZWFyIGludGVycnVwdCBjYXVzZSBhbmQgbWFzawogCSAqLwpAQCAtMjU4LDkgKzI1OSwxOSBAQAogCQllaGNpX29yaW9uX2NvbmZfbWJ1c193aW5kb3dzKGhjZCwgcGQtPmRyYW0pOwogCiAJLyoKLQkgKiBzZXR1cCBPcmlvbiBVU0IgY29udHJvbGxlcgorCSAqIHNldHVwIE9yaW9uIFVTQiBjb250cm9sbGVyLgogCSAqLwotCW9yaW9uX3VzYl9zZXR1cChoY2QpOworCXN3aXRjaCAocGQtPnBoeV92ZXJzaW9uKSB7CisJY2FzZSBFSENJX1BIWV9OQToJLyogZG9udCBjaGFuZ2UgVVNCIHBoeSBzZXR0aW5ncyAqLworCQlicmVhazsKKwljYXNlIEVIQ0lfUEhZX09SSU9OOgorCQlvcmlvbl91c2JfcGh5X3YxX3NldHVwKGhjZCk7CisJCWJyZWFrOworCWNhc2UgRUhDSV9QSFlfREQ6CisJY2FzZSBFSENJX1BIWV9LVzoKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJPcmlvbiBlaGNpIC1VU0IgcGh5IHZlcnNpb24gaXNuJ3Qgc3VwcG9ydGVkLlxuIik7CisJfQogCiAJZXJyID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCmluZGV4IDkxNjk3YmQuLjRiYmRkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yNSw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxtYWNoL211eC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvZnBnYS5oPgogI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKQEAgLTI1NCw4ICsyNTQsOCBAQAogCiAJCQkvKiBncGlvOSBmb3Igb3ZlcmN1cnJlbnQgZGV0Y3Rpb24gKi8KIAkJCW9tYXBfY2ZnX3JlZyhXOF8xNjEwX0dQSU85KTsKLQkJCW9tYXBfcmVxdWVzdF9ncGlvKDkpOwotCQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oOSwgMSAvKiBJTiAqLyk7CisJCQlncGlvX3JlcXVlc3QoOSwgIk9IQ0kgb3ZlcmN1cnJlbnQiKTsKKwkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KDkpOwogCiAJCQkvKiBmb3IgcGFyYW5vaWEncyBzYWtlOiAgZGlzYWJsZSBVU0IuUFVFTiAqLwogCQkJb21hcF9jZmdfcmVnKFc0X1VTQl9ISUdIWik7CkBAIC00MDcsNyArNDA3LDcgQEAKIAkJcHV0X2RldmljZShvaGNpLT50cmFuc2NlaXZlci0+ZGV2KTsKIAl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkKLQkJb21hcF9mcmVlX2dwaW8oOSk7CisJCWdwaW9fZnJlZSg5KTsKIAlpb3VubWFwKGhjZC0+cmVncyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAJdXNiX3B1dF9oY2QoaGNkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYwppbmRleCBlMjk0ZDQzLi5lNDRkYzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQl1c2JfY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiVVNCQ0xLIik7CisJdXNiX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUih1c2JfY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIodXNiX2Nsayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCBkMGM4MjE5Li42MzcyZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC0zNjIsNyArMzYyLDcgQEAKIAogY29uZmlnIEZCX0FDT1JOCiAJYm9vbCAiQWNvcm4gVklEQyBzdXBwb3J0IgotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgQVJNICYmIChBUkNIX0FDT1JOIHx8IEFSQ0hfQ0xQUzc1MDApCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBBUk0gJiYgQVJDSF9BQ09STgogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKQEAgLTE4MTcsNiArMTgxNywxMSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRkJfUFhBX09WRVJMQVkKKwlib29sICJTdXBwb3J0IFBYQTI3eC9QWEEzeHggT3ZlcmxheShzKSBhcyBmcmFtZWJ1ZmZlciIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZCX1BYQSAmJiAoUFhBMjd4IHx8IFBYQTN4eCkKKwogY29uZmlnIEZCX1BYQV9TTUFSVFBBTkVMCiAJYm9vbCAiUFhBIFNtYXJ0cGFuZWwgTENEIHN1cHBvcnQiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwppbmRleCBhN2ExYzg5Li4yYWM1MmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKQEAgLTM0MywxNCArMzQzLDE0IEBACiB7CiAJaW50IHJldDsKIAotCWZiLT5jbGsgPSBjbGtfZ2V0KCZmYi0+ZGV2LT5kZXYsICJDTENEQ0xLIik7CisJZmItPmNsayA9IGNsa19nZXQoJmZiLT5kZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihmYi0+Y2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKGZiLT5jbGspOwogCQlnb3RvIG91dDsKIAl9CiAKIAlmYi0+ZmIuZml4Lm1taW9fc3RhcnQJPSBmYi0+ZGV2LT5yZXMuc3RhcnQ7Ci0JZmItPmZiLmZpeC5tbWlvX2xlbgk9IFNaXzRLOworCWZiLT5mYi5maXgubW1pb19sZW4JPSA0MDk2OwogCiAJZmItPnJlZ3MgPSBpb3JlbWFwKGZiLT5mYi5maXgubW1pb19zdGFydCwgZmItPmZiLmZpeC5tbWlvX2xlbik7CiAJaWYgKCFmYi0+cmVncykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IDQ0OGQyMDkuLmU2MjEwNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTExMiw2ICsxMTIsMjMgQEAKIHN0YXRpYyBpbnQgCQl2Z2Ffc2Nhbl9saW5lcwkJX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgCXZnYV9yb2xsZWRfb3ZlcjsKIAoraW50IHZnYWNvbl90ZXh0X21vZGVfZm9yY2UgPSAwOworCitib29sIHZnYWNvbl90ZXh0X2ZvcmNlKHZvaWQpCit7CisJcmV0dXJuIHZnYWNvbl90ZXh0X21vZGVfZm9yY2UgPyB0cnVlIDogZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKHZnYWNvbl90ZXh0X2ZvcmNlKTsKKworc3RhdGljIGludCBfX2luaXQgdGV4dF9tb2RlKGNoYXIgKnN0cikKK3sKKwl2Z2Fjb25fdGV4dF9tb2RlX2ZvcmNlID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyogZm9yY2UgdGV4dCBtb2RlIC0gdXNlZCBieSBrZXJuZWwgbW9kZXNldHRpbmcgKi8KK19fc2V0dXAoIm5vbW9kZXNldCIsIHRleHRfbW9kZSk7CisKIHN0YXRpYyBpbnQgX19pbml0IG5vX3Njcm9sbChjaGFyICpzdHIpCiB7CiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYwppbmRleCA0MWQ2MjYzLi4zOWQ1ZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCkBAIC0xNTEzLDcgKzE1MTMsNyBAQAogCiAJaW9wID0gaW9yZW1hcCgweDMwMDAwMDAsIDB4NTAwMCk7CiAJaWYgKGlvcCA9PSBOVUxMKSB7Ci0JCXByb21fcHJpbnRmKCJpZ2E1MDAwOiBjYW5ub3QgbWFwIEkvT1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaWdhNTAwMDogY2Fubm90IG1hcCBJL09cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW14ZmIuYyBiL2RyaXZlcnMvdmlkZW8vaW14ZmIuYwppbmRleCBjY2Q5ODYxLi5kNThjNjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pbXhmYi5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKLSAqCiAgKiAgRnJlZXNjYWxlIGkuTVggRnJhbWUgQnVmZmVyIGRldmljZSBkcml2ZXIKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgKQEAgLTE2LDcgKzE0LDYgQEAKICAqCWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuYXJtLmxpbnV4Lm9yZy51awogICovCiAKLS8vI2RlZmluZSBERUJVRyAxCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTMyLDkgKzI5LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvaW14ZmIuaD4KIAogLyoKQEAgLTQyLDIzICszOCwxNTAgQEAKICAqLwogI2RlZmluZSBERUJVR19WQVIgMQogCi0jaW5jbHVkZSAiaW14ZmIuaCIKKyNkZWZpbmUgRFJJVkVSX05BTUUgImlteC1mYiIKIAotc3RhdGljIHN0cnVjdCBpbXhmYl9yZ2IgZGVmX3JnYl8xNiA9IHsKLQkucmVkCT0geyAub2Zmc2V0ID0gOCwgIC5sZW5ndGggPSA0LCB9LAotCS5ncmVlbgk9IHsgLm9mZnNldCA9IDQsICAubGVuZ3RoID0gNCwgfSwKLQkuYmx1ZQk9IHsgLm9mZnNldCA9IDAsICAubGVuZ3RoID0gNCwgfSwKLQkudHJhbnNwID0geyAub2Zmc2V0ID0gMCwgIC5sZW5ndGggPSAwLCB9LAorI2RlZmluZSBMQ0RDX1NTQQkweDAwCisKKyNkZWZpbmUgTENEQ19TSVpFCTB4MDQKKyNkZWZpbmUgU0laRV9YTUFYKHgpCSgoKCh4KSA+PiA0KSAmIDB4M2YpIDw8IDIwKQorI2RlZmluZSBTSVpFX1lNQVgoeSkJKCh5KSAmIDB4MWZmKQorCisjZGVmaW5lIExDRENfVlBXCTB4MDgKKyNkZWZpbmUgVlBXX1ZQVyh4KQkoKHgpICYgMHgzZmYpCisKKyNkZWZpbmUgTENEQ19DUE9TCTB4MEMKKyNkZWZpbmUgQ1BPU19DQzEJKDE8PDMxKQorI2RlZmluZSBDUE9TX0NDMAkoMTw8MzApCisjZGVmaW5lIENQT1NfT1AJCSgxPDwyOCkKKyNkZWZpbmUgQ1BPU19DWFAoeCkJKCgoeCkgJiAzZmYpIDw8IDE2KQorI2RlZmluZSBDUE9TX0NZUCh5KQkoKHkpICYgMHgxZmYpCisKKyNkZWZpbmUgTENEQ19MQ1dIQgkweDEwCisjZGVmaW5lIExDV0hCX0JLX0VOCSgxPDwzMSkKKyNkZWZpbmUgTENXSEJfQ1codykJKCgodykgJiAweDFmKSA8PCAyNCkKKyNkZWZpbmUgTENXSEJfQ0goaCkJKCgoaCkgJiAweDFmKSA8PCAxNikKKyNkZWZpbmUgTENXSEJfQkQoeCkJKCh4KSAmIDB4ZmYpCisKKyNkZWZpbmUgTENEQ19MQ0hDQwkweDE0CisjZGVmaW5lIExDSENDX0NVUl9DT0xfUihyKSAoKChyKSAmIDB4MWYpIDw8IDExKQorI2RlZmluZSBMQ0hDQ19DVVJfQ09MX0coZykgKCgoZykgJiAweDNmKSA8PCA1KQorI2RlZmluZSBMQ0hDQ19DVVJfQ09MX0IoYikgKChiKSAmIDB4MWYpCisKKyNkZWZpbmUgTENEQ19QQ1IJMHgxOAorCisjZGVmaW5lIExDRENfSENSCTB4MUMKKyNkZWZpbmUgSENSX0hfV0lEVEgoeCkJKCgoeCkgJiAweDNmKSA8PCAyNikKKyNkZWZpbmUgSENSX0hfV0FJVF8xKHgpCSgoKHgpICYgMHhmZikgPDwgOCkKKyNkZWZpbmUgSENSX0hfV0FJVF8yKHgpCSgoeCkgJiAweGZmKQorCisjZGVmaW5lIExDRENfVkNSCTB4MjAKKyNkZWZpbmUgVkNSX1ZfV0lEVEgoeCkJKCgoeCkgJiAweDNmKSA8PCAyNikKKyNkZWZpbmUgVkNSX1ZfV0FJVF8xKHgpCSgoKHgpICYgMHhmZikgPDwgOCkKKyNkZWZpbmUgVkNSX1ZfV0FJVF8yKHgpCSgoeCkgJiAweGZmKQorCisjZGVmaW5lIExDRENfUE9TCTB4MjQKKyNkZWZpbmUgUE9TX1BPUyh4KQkoKHgpICYgMWYpCisKKyNkZWZpbmUgTENEQ19MU0NSMQkweDI4CisvKiBiaXQgZmllbGRzIGluIGlteGZiLmggKi8KKworI2RlZmluZSBMQ0RDX1BXTVIJMHgyQworLyogYml0IGZpZWxkcyBpbiBpbXhmYi5oICovCisKKyNkZWZpbmUgTENEQ19ETUFDUgkweDMwCisvKiBiaXQgZmllbGRzIGluIGlteGZiLmggKi8KKworI2RlZmluZSBMQ0RDX1JNQ1IJMHgzNAorI2RlZmluZSBSTUNSX0xDRENfRU4JKDE8PDEpCisjZGVmaW5lIFJNQ1JfU0VMRl9SRUYJKDE8PDApCisKKyNkZWZpbmUgTENEQ19MQ0RJQ1IJMHgzOAorI2RlZmluZSBMQ0RJQ1JfSU5UX1NZTgkoMTw8MikKKyNkZWZpbmUgTENESUNSX0lOVF9DT04JKDEpCisKKyNkZWZpbmUgTENEQ19MQ0RJU1IJMHg0MAorI2RlZmluZSBMQ0RJU1JfVURSX0VSUgkoMTw8MykKKyNkZWZpbmUgTENESVNSX0VSUl9SRVMJKDE8PDIpCisjZGVmaW5lIExDRElTUl9FT0YJKDE8PDEpCisjZGVmaW5lIExDRElTUl9CT0YJKDE8PDApCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGJpdGZpZWxkcyBmb3IgZWFjaAorICogZGlzcGxheSBkZXB0aCB0aGF0IHdlIHN1cHBvcnQuCisgKi8KK3N0cnVjdCBpbXhmYl9yZ2IgeworCXN0cnVjdCBmYl9iaXRmaWVsZAlyZWQ7CisJc3RydWN0IGZiX2JpdGZpZWxkCWdyZWVuOworCXN0cnVjdCBmYl9iaXRmaWVsZAlibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZAl0cmFuc3A7Cit9OworCitzdHJ1Y3QgaW14ZmJfaW5mbyB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAgKnBkZXY7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKworCXVfaW50CQkJbWF4X2JwcDsKKwl1X2ludAkJCW1heF94cmVzOworCXVfaW50CQkJbWF4X3lyZXM7CisKKwkvKgorCSAqIFRoZXNlIGFyZSB0aGUgYWRkcmVzc2VzIHdlIG1hcHBlZAorCSAqIHRoZSBmcmFtZWJ1ZmZlciBtZW1vcnkgcmVnaW9uIHRvLgorCSAqLworCWRtYV9hZGRyX3QJCW1hcF9kbWE7CisJdV9jaGFyCQkJKm1hcF9jcHU7CisJdV9pbnQJCQltYXBfc2l6ZTsKKworCXVfY2hhcgkJCSpzY3JlZW5fY3B1OworCWRtYV9hZGRyX3QJCXNjcmVlbl9kbWE7CisJdV9pbnQJCQlwYWxldHRlX3NpemU7CisKKwlkbWFfYWRkcl90CQlkYmFyMTsKKwlkbWFfYWRkcl90CQlkYmFyMjsKKworCXVfaW50CQkJcGNyOworCXVfaW50CQkJcHdtcjsKKwl1X2ludAkJCWxzY3IxOworCXVfaW50CQkJZG1hY3I7CisJdV9pbnQJCQljbWFwX2ludmVyc2U6MSwKKwkJCQljbWFwX3N0YXRpYzoxLAorCQkJCXVudXNlZDozMDsKKworCXZvaWQgKCpsY2RfcG93ZXIpKGludCk7CisJdm9pZCAoKmJhY2tsaWdodF9wb3dlcikoaW50KTsKK307CisKKyNkZWZpbmUgSU1YX05BTUUJIklNWCIKKworLyoKKyAqIE1pbmltdW0gWCBhbmQgWSByZXNvbHV0aW9ucworICovCisjZGVmaW5lIE1JTl9YUkVTCTY0CisjZGVmaW5lIE1JTl9ZUkVTCTY0CisKK3N0YXRpYyBzdHJ1Y3QgaW14ZmJfcmdiIGRlZl9yZ2JfMTZfdGZ0ID0geworCS5yZWQJPSB7Lm9mZnNldCA9IDExLCAubGVuZ3RoID0gNSx9LAorCS5ncmVlbgk9IHsub2Zmc2V0ID0gNSwgLmxlbmd0aCA9IDYsfSwKKwkuYmx1ZQk9IHsub2Zmc2V0ID0gMCwgLmxlbmd0aCA9IDUsfSwKKwkudHJhbnNwID0gey5vZmZzZXQgPSAwLCAubGVuZ3RoID0gMCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhmYl9yZ2IgZGVmX3JnYl8xNl9zdG4gPSB7CisJLnJlZAk9IHsub2Zmc2V0ID0gOCwgLmxlbmd0aCA9IDQsfSwKKwkuZ3JlZW4JPSB7Lm9mZnNldCA9IDQsIC5sZW5ndGggPSA0LH0sCisJLmJsdWUJPSB7Lm9mZnNldCA9IDAsIC5sZW5ndGggPSA0LH0sCisJLnRyYW5zcCA9IHsub2Zmc2V0ID0gMCwgLmxlbmd0aCA9IDAsfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW14ZmJfcmdiIGRlZl9yZ2JfOCA9IHsKLQkucmVkCT0geyAub2Zmc2V0ID0gMCwgIC5sZW5ndGggPSA4LCB9LAotCS5ncmVlbgk9IHsgLm9mZnNldCA9IDAsICAubGVuZ3RoID0gOCwgfSwKLQkuYmx1ZQk9IHsgLm9mZnNldCA9IDAsICAubGVuZ3RoID0gOCwgfSwKLQkudHJhbnNwID0geyAub2Zmc2V0ID0gMCwgIC5sZW5ndGggPSAwLCB9LAorCS5yZWQJPSB7Lm9mZnNldCA9IDAsIC5sZW5ndGggPSA4LH0sCisJLmdyZWVuCT0gey5vZmZzZXQgPSAwLCAubGVuZ3RoID0gOCx9LAorCS5ibHVlCT0gey5vZmZzZXQgPSAwLCAubGVuZ3RoID0gOCx9LAorCS50cmFuc3AgPSB7Lm9mZnNldCA9IDAsIC5sZW5ndGggPSAwLH0sCiB9OwogCi1zdGF0aWMgaW50IGlteGZiX2FjdGl2YXRlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBpbXhmYl9hY3RpdmF0ZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAogc3RhdGljIGlubGluZSB1X2ludCBjaGFuX3RvX2ZpZWxkKHVfaW50IGNoYW4sIHN0cnVjdCBmYl9iaXRmaWVsZCAqYmYpCiB7CkBAIC02NywxMCArMTkwLDggQEAKIAlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OwogfQogCi0jZGVmaW5lIExDRENfUEFMRVRURSh4KSBfX1JFRzIoSU1YX0xDRENfQkFTRSsweDgwMCwgKHgpPDwyKQotc3RhdGljIGludAotaW14ZmJfc2V0cGFsZXR0ZXJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKLQkJICAgICAgIHVfaW50IHRyYW5zLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgaW14ZmJfc2V0cGFsZXR0ZXJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJdV9pbnQgdHJhbnMsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBpbXhmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7CiAJdV9pbnQgdmFsLCByZXQgPSAxOwpAQCAtODEsMTQgKzIwMiwxMyBAQAogCQkgICAgICAoQ05WVF9UT0hXKGdyZWVuLDQpIDw8IDQpIHwKIAkJICAgICAgQ05WVF9UT0hXKGJsdWUsICA0KTsKIAotCQlMQ0RDX1BBTEVUVEUocmVnbm8pID0gdmFsOworCQl3cml0ZWwodmFsLCBmYmktPnJlZ3MgKyAweDgwMCArIChyZWdubyA8PCAyKSk7CiAJCXJldCA9IDA7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLWlteGZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKK3N0YXRpYyBpbnQgaW14ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAogCQkgICB1X2ludCB0cmFucywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGlteGZiX2luZm8gKmZiaSA9IGluZm8tPnBhcjsKQEAgLTE0OCwxMSArMjY4LDEwIEBACiAgKiAgICB5cmVzLCB4cmVzX3ZpcnR1YWwsIHlyZXNfdmlydHVhbCwgeG9mZnNldCwgeW9mZnNldCwgZ3JheXNjYWxlLAogICogICAgYml0ZmllbGRzLCBob3Jpem9udGFsIHRpbWluZywgdmVydGljYWwgdGltaW5nLgogICovCi1zdGF0aWMgaW50Ci1pbXhmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQorc3RhdGljIGludCBpbXhmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBpbXhmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7Ci0JaW50IHJnYmlkeDsKKwlzdHJ1Y3QgaW14ZmJfcmdiICpyZ2I7CiAKIAlpZiAodmFyLT54cmVzIDwgTUlOX1hSRVMpCiAJCXZhci0+eHJlcyA9IE1JTl9YUkVTOwpAQCAtMTY4LDIzICsyODcsMjUgQEAKIAlwcl9kZWJ1ZygidmFyLT5iaXRzX3Blcl9waXhlbD0lZFxuIiwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSAxNjoKLQkJcmdiaWR4ID0gUkdCXzE2OworCWRlZmF1bHQ6CisJCWlmIChyZWFkbChmYmktPnJlZ3MgKyBMQ0RDX1BDUikgJiBQQ1JfVEZUKQorCQkJcmdiID0gJmRlZl9yZ2JfMTZfdGZ0OworCQllbHNlCisJCQlyZ2IgPSAmZGVmX3JnYl8xNl9zdG47CiAJCWJyZWFrOwogCWNhc2UgODoKLQkJcmdiaWR4ID0gUkdCXzg7CisJCXJnYiA9ICZkZWZfcmdiXzg7CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJnYmlkeCA9IFJHQl8xNjsKIAl9CiAKIAkvKgogCSAqIENvcHkgdGhlIFJHQiBwYXJhbWV0ZXJzIGZvciB0aGlzIGRpc3BsYXkKIAkgKiBmcm9tIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBhcmFtZXRlcnMuCiAJICovCi0JdmFyLT5yZWQgICAgPSBmYmktPnJnYltyZ2JpZHhdLT5yZWQ7Ci0JdmFyLT5ncmVlbiAgPSBmYmktPnJnYltyZ2JpZHhdLT5ncmVlbjsKLQl2YXItPmJsdWUgICA9IGZiaS0+cmdiW3JnYmlkeF0tPmJsdWU7Ci0JdmFyLT50cmFuc3AgPSBmYmktPnJnYltyZ2JpZHhdLT50cmFuc3A7CisJdmFyLT5yZWQgICAgPSByZ2ItPnJlZDsKKwl2YXItPmdyZWVuICA9IHJnYi0+Z3JlZW47CisJdmFyLT5ibHVlICAgPSByZ2ItPmJsdWU7CisJdmFyLT50cmFuc3AgPSByZ2ItPnRyYW5zcDsKIAogCXByX2RlYnVnKCJSR0JUIGxlbmd0aCA9ICVkOiVkOiVkOiVkXG4iLAogCQl2YXItPnJlZC5sZW5ndGgsIHZhci0+Z3JlZW4ubGVuZ3RoLCB2YXItPmJsdWUubGVuZ3RoLApAQCAtMjIxLDggKzM0Miw3IEBACiAJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfU1RBVElDX1BTRVVET0NPTE9SOwogCX0KIAotCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICoKLQkJCQkgIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CiAJZmJpLT5wYWxldHRlX3NpemUgPSB2YXItPmJpdHNfcGVyX3BpeGVsID09IDggPyAyNTYgOiAxNjsKIAogCWlteGZiX2FjdGl2YXRlX3Zhcih2YXIsIGluZm8pOwpAQCAtMjM1LDIyICszNTUsMjcgQEAKIAlwcl9kZWJ1ZygiRW5hYmxpbmcgTENEIGNvbnRyb2xsZXJcbiIpOwogCiAJLyogaW5pdGlhbGl6ZSBMQ0RDICovCi0JTENEQ19STUNSICY9IH5STUNSX0xDRENfRU47CQkvKiBqdXN0IHRvIGJlIHNhZmUuLi4gKi8KKwl3cml0ZWwocmVhZGwoZmJpLT5yZWdzICsgTENEQ19STUNSKSAmIH5STUNSX0xDRENfRU4sCisJCWZiaS0+cmVncyArIExDRENfUk1DUik7CS8qIGp1c3QgdG8gYmUgc2FmZS4uLiAqLwogCi0JTENEQ19TU0EJPSBmYmktPnNjcmVlbl9kbWE7CisJd3JpdGVsKGZiaS0+c2NyZWVuX2RtYSwgZmJpLT5yZWdzICsgTENEQ19TU0EpOworCiAJLyogcGh5c2ljYWwgc2NyZWVuIHN0YXJ0IGFkZHJlc3MJICAgICovCi0JTENEQ19WUFcJPSBWUFdfVlBXKGZiaS0+bWF4X3hyZXMgKiBmYmktPm1heF9icHAgLyA4IC8gNCk7CisJd3JpdGVsKFZQV19WUFcoZmJpLT5tYXhfeHJlcyAqIGZiaS0+bWF4X2JwcCAvIDggLyA0KSwKKwkJZmJpLT5yZWdzICsgTENEQ19WUFcpOwogCi0JTENEQ19QT1MJPSAweDAwMDAwMDAwOyAgIC8qIHBhbm5pbmcgb2Zmc2V0IDAgKDAgcGl4ZWwgb2Zmc2V0KSAgICAgICAgKi8KKwkvKiBwYW5uaW5nIG9mZnNldCAwICgwIHBpeGVsIG9mZnNldCkgICAgICAgICovCisJd3JpdGVsKDB4MDAwMDAwMDAsIGZiaS0+cmVncyArIExDRENfUE9TKTsKIAogCS8qIGRpc2FibGUgaGFyZHdhcmUgY3Vyc29yICovCi0JTENEQ19DUE9TCSY9IH4oQ1BPU19DQzAgfCBDUE9TX0NDMSk7CisJd3JpdGVsKHJlYWRsKGZiaS0+cmVncyArIExDRENfQ1BPUykgJiB+KENQT1NfQ0MwIHwgQ1BPU19DQzEpLAorCQlmYmktPnJlZ3MgKyBMQ0RDX0NQT1MpOwogCi0JTENEQ19STUNSID0gUk1DUl9MQ0RDX0VOOworCXdyaXRlbChSTUNSX0xDRENfRU4sIGZiaS0+cmVncyArIExDRENfUk1DUik7CiAKLQlpZihmYmktPmJhY2tsaWdodF9wb3dlcikKKwlpZiAoZmJpLT5iYWNrbGlnaHRfcG93ZXIpCiAJCWZiaS0+YmFja2xpZ2h0X3Bvd2VyKDEpOwotCWlmKGZiaS0+bGNkX3Bvd2VyKQorCWlmIChmYmktPmxjZF9wb3dlcikKIAkJZmJpLT5sY2RfcG93ZXIoMSk7CiB9CiAKQEAgLTI1OCwxMiArMzgzLDEyIEBACiB7CiAJcHJfZGVidWcoIkRpc2FibGluZyBMQ0QgY29udHJvbGxlclxuIik7CiAKLQlpZihmYmktPmJhY2tsaWdodF9wb3dlcikKKwlpZiAoZmJpLT5iYWNrbGlnaHRfcG93ZXIpCiAJCWZiaS0+YmFja2xpZ2h0X3Bvd2VyKDApOwotCWlmKGZiaS0+bGNkX3Bvd2VyKQorCWlmIChmYmktPmxjZF9wb3dlcikKIAkJZmJpLT5sY2RfcG93ZXIoMCk7CiAKLQlMQ0RDX1JNQ1IgPSAwOworCXdyaXRlbCgwLCBmYmktPnJlZ3MgKyBMQ0RDX1JNQ1IpOwogfQogCiBzdGF0aWMgaW50IGlteGZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCkBAIC0zNDAsNzQgKzQ2NSwyNiBAQAogCQkJaW5mby0+Zml4LmlkLCB2YXItPmxvd2VyX21hcmdpbik7CiAjZW5kaWYKIAotCUxDRENfSENSCT0gSENSX0hfV0lEVEgodmFyLT5oc3luY19sZW4pIHwKLQkgICAgICAgICAgICAgICAgICBIQ1JfSF9XQUlUXzEodmFyLT5sZWZ0X21hcmdpbikgfAotCQkJICBIQ1JfSF9XQUlUXzIodmFyLT5yaWdodF9tYXJnaW4pOworCXdyaXRlbChIQ1JfSF9XSURUSCh2YXItPmhzeW5jX2xlbikgfAorCQlIQ1JfSF9XQUlUXzEodmFyLT5yaWdodF9tYXJnaW4pIHwKKwkJSENSX0hfV0FJVF8yKHZhci0+bGVmdF9tYXJnaW4pLAorCQlmYmktPnJlZ3MgKyBMQ0RDX0hDUik7CiAKLQlMQ0RDX1ZDUgk9IFZDUl9WX1dJRFRIKHZhci0+dnN5bmNfbGVuKSB8Ci0JICAgICAgICAgICAgICAgICAgVkNSX1ZfV0FJVF8xKHZhci0+dXBwZXJfbWFyZ2luKSB8Ci0JCQkgIFZDUl9WX1dBSVRfMih2YXItPmxvd2VyX21hcmdpbik7CisJd3JpdGVsKFZDUl9WX1dJRFRIKHZhci0+dnN5bmNfbGVuKSB8CisJCVZDUl9WX1dBSVRfMSh2YXItPmxvd2VyX21hcmdpbikgfAorCQlWQ1JfVl9XQUlUXzIodmFyLT51cHBlcl9tYXJnaW4pLAorCQlmYmktPnJlZ3MgKyBMQ0RDX1ZDUik7CiAKLQlMQ0RDX1NJWkUJPSBTSVpFX1hNQVgodmFyLT54cmVzKSB8IFNJWkVfWU1BWCh2YXItPnlyZXMpOwotCUxDRENfUENSCT0gZmJpLT5wY3I7Ci0JTENEQ19QV01SCT0gZmJpLT5wd21yOwotCUxDRENfTFNDUjEJPSBmYmktPmxzY3IxOwotCUxDRENfRE1BQ1IJPSBmYmktPmRtYWNyOworCXdyaXRlbChTSVpFX1hNQVgodmFyLT54cmVzKSB8IFNJWkVfWU1BWCh2YXItPnlyZXMpLAorCQkJZmJpLT5yZWdzICsgTENEQ19TSVpFKTsKKwl3cml0ZWwoZmJpLT5wY3IsIGZiaS0+cmVncyArIExDRENfUENSKTsKKwl3cml0ZWwoZmJpLT5wd21yLCBmYmktPnJlZ3MgKyBMQ0RDX1BXTVIpOworCXdyaXRlbChmYmktPmxzY3IxLCBmYmktPnJlZ3MgKyBMQ0RDX0xTQ1IxKTsKKwl3cml0ZWwoZmJpLT5kbWFjciwgZmJpLT5yZWdzICsgTENEQ19ETUFDUik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaW14ZmJfc2V0dXBfZ3BpbyhzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpKQotewotCWludCB3aWR0aDsKLQotCUxDRENfUk1DUgkmPSB+KFJNQ1JfTENEQ19FTiB8IFJNQ1JfU0VMRl9SRUYpOwotCi0JaWYoIGZiaS0+cGNyICYgUENSX1RGVCApCi0JCXdpZHRoID0gMTY7Ci0JZWxzZQotCQl3aWR0aCA9IDEgPDwgKChmYmktPnBjciA+PiAyOCkgJiAweDMpOwotCi0Jc3dpdGNoKHdpZHRoKSB7Ci0JY2FzZSAxNjoKLQkJaW14X2dwaW9fbW9kZShQRDMwX1BGX0xEMTUpOwotCQlpbXhfZ3Bpb19tb2RlKFBEMjlfUEZfTEQxNCk7Ci0JCWlteF9ncGlvX21vZGUoUEQyOF9QRl9MRDEzKTsKLQkJaW14X2dwaW9fbW9kZShQRDI3X1BGX0xEMTIpOwotCQlpbXhfZ3Bpb19tb2RlKFBEMjZfUEZfTEQxMSk7Ci0JCWlteF9ncGlvX21vZGUoUEQyNV9QRl9MRDEwKTsKLQkJaW14X2dwaW9fbW9kZShQRDI0X1BGX0xEOSk7Ci0JCWlteF9ncGlvX21vZGUoUEQyM19QRl9MRDgpOwotCWNhc2UgODoKLQkJaW14X2dwaW9fbW9kZShQRDIyX1BGX0xENyk7Ci0JCWlteF9ncGlvX21vZGUoUEQyMV9QRl9MRDYpOwotCQlpbXhfZ3Bpb19tb2RlKFBEMjBfUEZfTEQ1KTsKLQkJaW14X2dwaW9fbW9kZShQRDE5X1BGX0xENCk7Ci0JY2FzZSA0OgotCQlpbXhfZ3Bpb19tb2RlKFBEMThfUEZfTEQzKTsKLQkJaW14X2dwaW9fbW9kZShQRDE3X1BGX0xEMik7Ci0JY2FzZSAyOgotCQlpbXhfZ3Bpb19tb2RlKFBEMTZfUEZfTEQxKTsKLQljYXNlIDE6Ci0JCWlteF9ncGlvX21vZGUoUEQxNV9QRl9MRDApOwotCX0KLQotCS8qIGluaXRpYWxpemUgR1BJT3MgKi8KLQlpbXhfZ3Bpb19tb2RlKFBENl9QRl9MU0NMSyk7Ci0JaW14X2dwaW9fbW9kZShQRDExX1BGX0NPTlRSQVNUKTsKLQlpbXhfZ3Bpb19tb2RlKFBEMTRfUEZfRkxNX1ZTWU5DKTsKLQlpbXhfZ3Bpb19tb2RlKFBEMTNfUEZfTFBfSFNZTkMpOwotCWlteF9ncGlvX21vZGUoUEQxMl9QRl9BQ0RfT0UpOwotCi0JLyogVGhlc2UgYXJlIG9ubHkgbmVlZGVkIGZvciBTaGFycCBIUiBURlQgZGlzcGxheXMgKi8KLQlpZiAoZmJpLT5wY3IgJiBQQ1JfU0hBUlApIHsKLQkJaW14X2dwaW9fbW9kZShQRDdfUEZfUkVWKTsKLQkJaW14X2dwaW9fbW9kZShQRDhfUEZfQ0xTKTsKLQkJaW14X2dwaW9fbW9kZShQRDlfUEZfUFMpOwotCQlpbXhfZ3Bpb19tb2RlKFBEMTBfUEZfU1BMX1NQUik7Ci0JfQotfQotCiAjaWZkZWYgQ09ORklHX1BNCiAvKgogICogUG93ZXIgbWFuYWdlbWVudCBob29rcy4gIE5vdGUgdGhhdCB3ZSB3b24ndCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCwKQEAgLTQxNiw3ICs0OTMsOCBAQAogc3RhdGljIGludCBpbXhmYl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBpbXhmYl9pbmZvICpmYmkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCXByX2RlYnVnKCIlc1xuIixfX2Z1bmNfXyk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCWlteGZiX2Rpc2FibGVfY29udHJvbGxlcihmYmkpOwogCXJldHVybiAwOwpAQCAtNDI1LDcgKzUwMyw4IEBACiBzdGF0aWMgaW50IGlteGZiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlteGZiX2luZm8gKmZiaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0JcHJfZGVidWcoIiVzXG4iLF9fZnVuY19fKTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaW14ZmJfZW5hYmxlX2NvbnRyb2xsZXIoZmJpKTsKIAlyZXR1cm4gMDsKQEAgLTQzNSwxNDkgKzUxNCwxMzYgQEAKICNkZWZpbmUgaW14ZmJfcmVzdW1lCU5VTEwKICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdCBpbXhmYl9pbml0X2ZiaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBpbXhmYl9pbml0X2ZiaW5mbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBpbXhmYl9tYWNoX2luZm8gKmluZiA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpID0gaW5mby0+cGFyOwogCiAJcHJfZGVidWcoIiVzXG4iLF9fZnVuY19fKTsKIAotCWluZm8tPnBzZXVkb19wYWxldHRlID0ga21hbGxvYyggc2l6ZW9mKHUzMikgKiAxNiwgR0ZQX0tFUk5FTCk7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBrbWFsbG9jKHNpemVvZih1MzIpICogMTYsIEdGUF9LRVJORUwpOwogCWlmICghaW5mby0+cHNldWRvX3BhbGV0dGUpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWVtc2V0KGZiaSwgMCwgc2l6ZW9mKHN0cnVjdCBpbXhmYl9pbmZvKSk7Ci0JZmJpLT5kZXYgPSBkZXY7CiAKIAlzdHJsY3B5KGluZm8tPmZpeC5pZCwgSU1YX05BTUUsIHNpemVvZihpbmZvLT5maXguaWQpKTsKIAotCWluZm8tPmZpeC50eXBlCT0gRkJfVFlQRV9QQUNLRURfUElYRUxTOworCWluZm8tPmZpeC50eXBlCQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CiAJaW5mby0+Zml4LnR5cGVfYXV4CQk9IDA7CiAJaW5mby0+Zml4LnhwYW5zdGVwCQk9IDA7CiAJaW5mby0+Zml4LnlwYW5zdGVwCQk9IDA7CiAJaW5mby0+Zml4Lnl3cmFwc3RlcAkJPSAwOwotCWluZm8tPmZpeC5hY2NlbAk9IEZCX0FDQ0VMX05PTkU7CisJaW5mby0+Zml4LmFjY2VsCQkJPSBGQl9BQ0NFTF9OT05FOwogCiAJaW5mby0+dmFyLm5vbnN0ZAkJPSAwOwogCWluZm8tPnZhci5hY3RpdmF0ZQkJPSBGQl9BQ1RJVkFURV9OT1c7CiAJaW5mby0+dmFyLmhlaWdodAkJPSAtMTsKIAlpbmZvLT52YXIud2lkdGgJPSAtMTsKIAlpbmZvLT52YXIuYWNjZWxfZmxhZ3MJCT0gMDsKLQlpbmZvLT52YXIudm1vZGUJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCWluZm8tPnZhci52bW9kZQkJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKIAogCWluZm8tPmZib3BzCQkJPSAmaW14ZmJfb3BzOwotCWluZm8tPmZsYWdzCQkJPSBGQklORk9fRkxBR19ERUZBVUxUIHwgRkJJTkZPX1JFQURTX0ZBU1Q7CisJaW5mby0+ZmxhZ3MJCQk9IEZCSU5GT19GTEFHX0RFRkFVTFQgfAorCQkJCQkgIEZCSU5GT19SRUFEU19GQVNUOwogCi0JZmJpLT5yZ2JbUkdCXzE2XQkJPSAmZGVmX3JnYl8xNjsKLQlmYmktPnJnYltSR0JfOF0JCQk9ICZkZWZfcmdiXzg7Ci0KLQlmYmktPm1heF94cmVzCQkJPSBpbmYtPnhyZXM7Ci0JaW5mby0+dmFyLnhyZXMJCQk9IGluZi0+eHJlczsKLQlpbmZvLT52YXIueHJlc192aXJ0dWFsCQk9IGluZi0+eHJlczsKLQlmYmktPm1heF95cmVzCQkJPSBpbmYtPnlyZXM7Ci0JaW5mby0+dmFyLnlyZXMJCQk9IGluZi0+eXJlczsKLQlpbmZvLT52YXIueXJlc192aXJ0dWFsCQk9IGluZi0+eXJlczsKLQlmYmktPm1heF9icHAJCQk9IGluZi0+YnBwOwotCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbAk9IGluZi0+YnBwOwotCWluZm8tPnZhci5ub25zdGQJCT0gaW5mLT5ub25zdGQ7Ci0JaW5mby0+dmFyLnBpeGNsb2NrCQk9IGluZi0+cGl4Y2xvY2s7Ci0JaW5mby0+dmFyLmhzeW5jX2xlbgkJPSBpbmYtPmhzeW5jX2xlbjsKLQlpbmZvLT52YXIubGVmdF9tYXJnaW4JCT0gaW5mLT5sZWZ0X21hcmdpbjsKLQlpbmZvLT52YXIucmlnaHRfbWFyZ2luCQk9IGluZi0+cmlnaHRfbWFyZ2luOwotCWluZm8tPnZhci52c3luY19sZW4JCT0gaW5mLT52c3luY19sZW47Ci0JaW5mby0+dmFyLnVwcGVyX21hcmdpbgkJPSBpbmYtPnVwcGVyX21hcmdpbjsKLQlpbmZvLT52YXIubG93ZXJfbWFyZ2luCQk9IGluZi0+bG93ZXJfbWFyZ2luOwotCWluZm8tPnZhci5zeW5jCQkJPSBpbmYtPnN5bmM7Ci0JaW5mby0+dmFyLmdyYXlzY2FsZQkJPSBpbmYtPmNtYXBfZ3JleXNjYWxlOwotCWZiaS0+Y21hcF9pbnZlcnNlCQk9IGluZi0+Y21hcF9pbnZlcnNlOwotCWZiaS0+Y21hcF9zdGF0aWMJCT0gaW5mLT5jbWFwX3N0YXRpYzsKLQlmYmktPnBjcgkJCT0gaW5mLT5wY3I7Ci0JZmJpLT5sc2NyMQkJCT0gaW5mLT5sc2NyMTsKLQlmYmktPmRtYWNyCQkJPSBpbmYtPmRtYWNyOwotCWZiaS0+cHdtcgkJCT0gaW5mLT5wd21yOwotCWZiaS0+bGNkX3Bvd2VyCQkJPSBpbmYtPmxjZF9wb3dlcjsKLQlmYmktPmJhY2tsaWdodF9wb3dlcgkJPSBpbmYtPmJhY2tsaWdodF9wb3dlcjsKKwlmYmktPm1heF94cmVzCQkJPSBwZGF0YS0+eHJlczsKKwlpbmZvLT52YXIueHJlcwkJCT0gcGRhdGEtPnhyZXM7CisJaW5mby0+dmFyLnhyZXNfdmlydHVhbAkJPSBwZGF0YS0+eHJlczsKKwlmYmktPm1heF95cmVzCQkJPSBwZGF0YS0+eXJlczsKKwlpbmZvLT52YXIueXJlcwkJCT0gcGRhdGEtPnlyZXM7CisJaW5mby0+dmFyLnlyZXNfdmlydHVhbAkJPSBwZGF0YS0+eXJlczsKKwlmYmktPm1heF9icHAJCQk9IHBkYXRhLT5icHA7CisJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsCT0gcGRhdGEtPmJwcDsKKwlpbmZvLT52YXIubm9uc3RkCQk9IHBkYXRhLT5ub25zdGQ7CisJaW5mby0+dmFyLnBpeGNsb2NrCQk9IHBkYXRhLT5waXhjbG9jazsKKwlpbmZvLT52YXIuaHN5bmNfbGVuCQk9IHBkYXRhLT5oc3luY19sZW47CisJaW5mby0+dmFyLmxlZnRfbWFyZ2luCQk9IHBkYXRhLT5sZWZ0X21hcmdpbjsKKwlpbmZvLT52YXIucmlnaHRfbWFyZ2luCQk9IHBkYXRhLT5yaWdodF9tYXJnaW47CisJaW5mby0+dmFyLnZzeW5jX2xlbgkJPSBwZGF0YS0+dnN5bmNfbGVuOworCWluZm8tPnZhci51cHBlcl9tYXJnaW4JCT0gcGRhdGEtPnVwcGVyX21hcmdpbjsKKwlpbmZvLT52YXIubG93ZXJfbWFyZ2luCQk9IHBkYXRhLT5sb3dlcl9tYXJnaW47CisJaW5mby0+dmFyLnN5bmMJCQk9IHBkYXRhLT5zeW5jOworCWluZm8tPnZhci5ncmF5c2NhbGUJCT0gcGRhdGEtPmNtYXBfZ3JleXNjYWxlOworCWZiaS0+Y21hcF9pbnZlcnNlCQk9IHBkYXRhLT5jbWFwX2ludmVyc2U7CisJZmJpLT5jbWFwX3N0YXRpYwkJPSBwZGF0YS0+Y21hcF9zdGF0aWM7CisJZmJpLT5wY3IJCQk9IHBkYXRhLT5wY3I7CisJZmJpLT5sc2NyMQkJCT0gcGRhdGEtPmxzY3IxOworCWZiaS0+ZG1hY3IJCQk9IHBkYXRhLT5kbWFjcjsKKwlmYmktPnB3bXIJCQk9IHBkYXRhLT5wd21yOworCWZiaS0+bGNkX3Bvd2VyCQkJPSBwZGF0YS0+bGNkX3Bvd2VyOworCWZiaS0+YmFja2xpZ2h0X3Bvd2VyCQk9IHBkYXRhLT5iYWNrbGlnaHRfcG93ZXI7CiAJaW5mby0+Zml4LnNtZW1fbGVuCQk9IGZiaS0+bWF4X3hyZXMgKiBmYmktPm1heF95cmVzICoKIAkJCQkJICBmYmktPm1heF9icHAgLyA4OwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiAgICAgIEFsbG9jYXRlcyB0aGUgRFJBTSBtZW1vcnkgZm9yIHRoZSBmcmFtZSBidWZmZXIuICBUaGlzIGJ1ZmZlciBpcwotICoJcmVtYXBwZWQgaW50byBhIG5vbi1jYWNoZWQsIG5vbi1idWZmZXJlZCwgbWVtb3J5IHJlZ2lvbiB0bwotICogICAgICBhbGxvdyBwaXhlbCB3cml0ZXMgdG8gb2NjdXIgd2l0aG91dCBmbHVzaGluZyB0aGUgY2FjaGUuCi0gKiAgICAgIE9uY2UgdGhpcyBhcmVhIGlzIHJlbWFwcGVkLCBhbGwgdmlydHVhbCBtZW1vcnkgYWNjZXNzIHRvIHRoZQotICogICAgICB2aWRlbyBtZW1vcnkgc2hvdWxkIG9jY3VyIGF0IHRoZSBuZXcgcmVnaW9uLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpbXhmYl9tYXBfdmlkZW9fbWVtb3J5KHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBpbXhmYl9pbmZvICpmYmkgPSBpbmZvLT5wYXI7Ci0KLQlmYmktPm1hcF9zaXplID0gUEFHRV9BTElHTihpbmZvLT5maXguc21lbV9sZW4pOwotCWZiaS0+bWFwX2NwdSA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoZmJpLT5kZXYsIGZiaS0+bWFwX3NpemUsCi0JCQkJCSZmYmktPm1hcF9kbWEsR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoZmJpLT5tYXBfY3B1KSB7Ci0JCWluZm8tPnNjcmVlbl9iYXNlID0gZmJpLT5tYXBfY3B1OwotCQlmYmktPnNjcmVlbl9jcHUgPSBmYmktPm1hcF9jcHU7Ci0JCWZiaS0+c2NyZWVuX2RtYSA9IGZiaS0+bWFwX2RtYTsKLQkJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYmktPnNjcmVlbl9kbWE7Ci0JfQotCi0JcmV0dXJuIGZiaS0+bWFwX2NwdSA/IDAgOiAtRU5PTUVNOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbXhmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBpbXhmYl9pbmZvICpmYmk7CiAJc3RydWN0IGZiX2luZm8gKmluZm87Ci0Jc3RydWN0IGlteGZiX21hY2hfaW5mbyAqaW5mOworCXN0cnVjdCBpbXhfZmJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldDsKIAogCXByaW50aygiaS5NWCBGcmFtZWJ1ZmZlciBkcml2ZXJcbiIpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZighcmVzKQorCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmKCFpbmYpIHsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCJObyBwbGF0Zm9ybV9kYXRhIGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGlteGZiX2luZm8pLCAmcGRldi0+ZGV2KTsKLQlpZighaW5mbykKKwlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmJpID0gaW5mby0+cGFyOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAKLQlyZXQgPSBpbXhmYl9pbml0X2ZiaW5mbygmcGRldi0+ZGV2KTsKLQlpZiggcmV0IDwgMCApCisJcmV0ID0gaW14ZmJfaW5pdF9mYmluZm8ocGRldik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZmFpbGVkX2luaXQ7CiAKLQlyZXMgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwgIklNWEZCIik7CisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQlEUklWRVJfTkFNRSk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGZhaWxlZF9yZWdzOworCQlnb3RvIGZhaWxlZF9yZXE7CiAJfQogCi0JaWYgKCFpbmYtPmZpeGVkX3NjcmVlbl9jcHUpIHsKLQkJcmV0ID0gaW14ZmJfbWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKLQkJaWYgKHJldCkgeworCWZiaS0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoZmJpLT5yZWdzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIkNhbm5vdCBtYXAgZnJhbWUgYnVmZmVyIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CisJfQorCisJaWYgKCFwZGF0YS0+Zml4ZWRfc2NyZWVuX2NwdSkgeworCQlmYmktPm1hcF9zaXplID0gUEFHRV9BTElHTihpbmZvLT5maXguc21lbV9sZW4pOworCQlmYmktPm1hcF9jcHUgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKCZwZGV2LT5kZXYsCisJCQkJZmJpLT5tYXBfc2l6ZSwgJmZiaS0+bWFwX2RtYSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFmYmktPm1hcF9jcHUpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBSQU06ICVkXG4iLCByZXQpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbGVkX21hcDsKIAkJfQorCisJCWluZm8tPnNjcmVlbl9iYXNlID0gZmJpLT5tYXBfY3B1OworCQlmYmktPnNjcmVlbl9jcHUgPSBmYmktPm1hcF9jcHU7CisJCWZiaS0+c2NyZWVuX2RtYSA9IGZiaS0+bWFwX2RtYTsKKwkJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYmktPnNjcmVlbl9kbWE7CiAJfSBlbHNlIHsKIAkJLyogRml4ZWQgZnJhbWVidWZmZXIgbWFwcGluZyBlbmFibGVzIGxvY2F0aW9uIG9mIHRoZSBzY3JlZW4gaW4gZVNSQU0gKi8KLQkJZmJpLT5tYXBfY3B1ID0gaW5mLT5maXhlZF9zY3JlZW5fY3B1OwotCQlmYmktPm1hcF9kbWEgPSBpbmYtPmZpeGVkX3NjcmVlbl9kbWE7CisJCWZiaS0+bWFwX2NwdSA9IHBkYXRhLT5maXhlZF9zY3JlZW5fY3B1OworCQlmYmktPm1hcF9kbWEgPSBwZGF0YS0+Zml4ZWRfc2NyZWVuX2RtYTsKIAkJaW5mby0+c2NyZWVuX2Jhc2UgPSBmYmktPm1hcF9jcHU7CiAJCWZiaS0+c2NyZWVuX2NwdSA9IGZiaS0+bWFwX2NwdTsKIAkJZmJpLT5zY3JlZW5fZG1hID0gZmJpLT5tYXBfZG1hOwpAQCAtNTkwLDEyICs2NTYsMTAgQEAKIAkgKi8KIAlpbXhmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbyk7CiAKLQlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAxPDxpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsIDApOworCXJldCA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDEgPDwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBmYWlsZWRfY21hcDsKIAotCWlteGZiX3NldHVwX2dwaW8oZmJpKTsKLQogCWlteGZiX3NldF9wYXIoaW5mbyk7CiAJcmV0ID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTYxMCwyMCArNjc0LDIyIEBACiBmYWlsZWRfcmVnaXN0ZXI6CiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIGZhaWxlZF9jbWFwOgotCWlmICghaW5mLT5maXhlZF9zY3JlZW5fY3B1KQorCWlmICghcGRhdGEtPmZpeGVkX3NjcmVlbl9jcHUpCiAJCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmcGRldi0+ZGV2LGZiaS0+bWFwX3NpemUsZmJpLT5tYXBfY3B1LAotCQkgICAgICAgICAgIGZiaS0+bWFwX2RtYSk7CisJCQlmYmktPm1hcF9kbWEpOwogZmFpbGVkX21hcDoKLQlrZnJlZShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSk7Ci1mYWlsZWRfcmVnczoKKwlpb3VubWFwKGZiaS0+cmVncyk7CitmYWlsZWRfaW9yZW1hcDoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0KTsKK2ZhaWxlZF9yZXE6CisJa2ZyZWUoaW5mby0+cHNldWRvX3BhbGV0dGUpOwogZmFpbGVkX2luaXQ6CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlteGZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgaW14ZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaW14ZmJfaW5mbyAqZmJpID0gaW5mby0+cGFyOwpAQCAtNjM5LDYgKzcwNSw3IEBACiAJa2ZyZWUoaW5mby0+cHNldWRvX3BhbGV0dGUpOwogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAKKwlpb3VubWFwKGZiaS0+cmVncyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCkBAIC02NTMsMTkgKzcyMCwxOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXhmYl9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGlteGZiX3Byb2JlLAogCS5zdXNwZW5kCT0gaW14ZmJfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGlteGZiX3Jlc3VtZSwKLQkucmVtb3ZlCQk9IGlteGZiX3JlbW92ZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlteGZiX3JlbW92ZSksCiAJLnNodXRkb3duCT0gaW14ZmJfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImlteC1mYiIsCisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCiAJfSwKIH07CiAKIGludCBfX2luaXQgaW14ZmJfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlteGZiX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmaW14ZmJfZHJpdmVyLCBpbXhmYl9wcm9iZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpbXhmYl9jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmggYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzdhOGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9pbXhmYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vaW14ZmIuaAotICoKLSAqICBGcmVlc2NhbGUgaS5NWCBGcmFtZSBCdWZmZXIgZGV2aWNlIGRyaXZlcgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgUy5IYXVlciwgUGVuZ3V0cm9uaXgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEVyaWMgQS4gVGhvbWFzCi0gKiAgIEJhc2VkIG9uIGFjb3JuZmIuYyBDb3B5cmlnaHQgKEMpIFJ1c3NlbGwgS2luZy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgYml0ZmllbGRzIGZvciBlYWNoCi0gKiBkaXNwbGF5IGRlcHRoIHRoYXQgd2Ugc3VwcG9ydC4KLSAqLwotc3RydWN0IGlteGZiX3JnYiB7Ci0Jc3RydWN0IGZiX2JpdGZpZWxkCXJlZDsKLQlzdHJ1Y3QgZmJfYml0ZmllbGQJZ3JlZW47Ci0Jc3RydWN0IGZiX2JpdGZpZWxkCWJsdWU7Ci0Jc3RydWN0IGZiX2JpdGZpZWxkCXRyYW5zcDsKLX07Ci0KLSNkZWZpbmUgUkdCXzE2CSgwKQotI2RlZmluZSBSR0JfOAkoMSkKLSNkZWZpbmUgTlJfUkdCCTIKLQotc3RydWN0IGlteGZiX2luZm8gewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IGlteGZiX3JnYgkqcmdiW05SX1JHQl07Ci0KLQl1X2ludAkJCW1heF9icHA7Ci0JdV9pbnQJCQltYXhfeHJlczsKLQl1X2ludAkJCW1heF95cmVzOwotCi0JLyoKLQkgKiBUaGVzZSBhcmUgdGhlIGFkZHJlc3NlcyB3ZSBtYXBwZWQKLQkgKiB0aGUgZnJhbWVidWZmZXIgbWVtb3J5IHJlZ2lvbiB0by4KLQkgKi8KLQlkbWFfYWRkcl90CQltYXBfZG1hOwotCXVfY2hhciAqCQltYXBfY3B1OwotCXVfaW50CQkJbWFwX3NpemU7Ci0KLQl1X2NoYXIgKgkJc2NyZWVuX2NwdTsKLQlkbWFfYWRkcl90CQlzY3JlZW5fZG1hOwotCXVfaW50CQkJcGFsZXR0ZV9zaXplOwotCi0JZG1hX2FkZHJfdAkJZGJhcjE7Ci0JZG1hX2FkZHJfdAkJZGJhcjI7Ci0KLQl1X2ludAkJCXBjcjsKLQl1X2ludAkJCXB3bXI7Ci0JdV9pbnQJCQlsc2NyMTsKLQl1X2ludAkJCWRtYWNyOwotCXVfaW50CQkJY21hcF9pbnZlcnNlOjEsCi0JCQkJY21hcF9zdGF0aWM6MSwKLQkJCQl1bnVzZWQ6MzA7Ci0KLQl2b2lkICgqbGNkX3Bvd2VyKShpbnQpOwotCXZvaWQgKCpiYWNrbGlnaHRfcG93ZXIpKGludCk7Ci19OwotCi0jZGVmaW5lIElNWF9OQU1FCSJJTVgiCi0KLS8qCi0gKiBNaW5pbXVtIFggYW5kIFkgcmVzb2x1dGlvbnMKLSAqLwotI2RlZmluZSBNSU5fWFJFUwk2NAotI2RlZmluZSBNSU5fWVJFUwk2NAotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKaW5kZXggY2M1OWM1Mi4uNDhmZjcwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9weGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuYwpAQCAtMjAsNiArMjAsMTYgQEAKICAqCiAgKglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWsKICAqCisgKiBBZGQgc3VwcG9ydCBmb3Igb3ZlcmxheTEgYW5kIG92ZXJsYXkyIGJhc2VkIG9uIHB4YWZiX292ZXJsYXkuYzoKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiAgICAgMjAwMy8wOC8yNzogPHl1LnRhbmdAaW50ZWwuY29tPgorICogICAgIDIwMDQvMDMvMTA6IDxzdGFubGV5LmNhaUBpbnRlbC5jb20+CisgKiAgICAgMjAwNC8xMC8yODogPHlhbi55aW5AaW50ZWwuY29tPgorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTUwLDcgKzYwLDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2JpdGZpZWxkLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogCkBAIC02NywxNCArNzYsMTYgQEAKIAkJCQkJIExDQ1IwX1NGTSB8IExDQ1IwX0xETSB8IExDQ1IwX0VOQikKIAogI2RlZmluZSBMQ0NSM19JTlZBTElEX0NPTkZJR19NQVNLCShMQ0NSM19IU1AgfCBMQ0NSM19WU1AgfFwKLQkJCQkJIExDQ1IzX1BDRCB8IExDQ1IzX0JQUCkKLQotc3RhdGljIHZvaWQgKCpweGFmYl9iYWNrbGlnaHRfcG93ZXIpKGludCk7Ci1zdGF0aWMgdm9pZCAoKnB4YWZiX2xjZF9wb3dlcikoaW50LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKik7CisJCQkJCSBMQ0NSM19QQ0QgfCBMQ0NSM19CUFAoMHhmKSkKIAogc3RhdGljIGludCBweGFmYl9hY3RpdmF0ZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkJc3RydWN0IHB4YWZiX2luZm8gKik7CiBzdGF0aWMgdm9pZCBzZXRfY3RybHJfc3RhdGUoc3RydWN0IHB4YWZiX2luZm8gKmZiaSwgdV9pbnQgc3RhdGUpOworc3RhdGljIHZvaWQgc2V0dXBfYmFzZV9mcmFtZShzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpLCBpbnQgYnJhbmNoKTsKK3N0YXRpYyBpbnQgc2V0dXBfZnJhbWVfZG1hKHN0cnVjdCBweGFmYl9pbmZvICpmYmksIGludCBkbWEsIGludCBwYWwsCisJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aWRlb19tZW1fc2l6ZSA9IDA7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogbGNkX3JlYWRsKHN0cnVjdCBweGFmYl9pbmZvICpmYmksIHVuc2lnbmVkIGludCBvZmYpCkBAIC0xNTYsNiArMTY3LDEyIEBACiAJCXZhbCB8PSAoKGJsdWUgID4+IDgpICYgMHgwMDAwMDBmYyk7CiAJCSgodTMyICopKGZiaS0+cGFsZXR0ZV9jcHUpKVtyZWdub10gPSB2YWw7CiAJCWJyZWFrOworCWNhc2UgTENDUjRfUEFMX0ZPUl8zOgorCQl2YWwgID0gKChyZWQgICA8PCA4KSAmIDB4MDBmZjAwMDApOworCQl2YWwgfD0gKChncmVlbiA+PiAwKSAmIDB4MDAwMGZmMDApOworCQl2YWwgfD0gKChibHVlICA+PiA4KSAmIDB4MDAwMDAwZmYpOworCQkoKHUzMiAqKShmYmktPnBhbGV0dGVfY3B1KSlbcmVnbm9dID0gdmFsOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIxNiwzNyArMjMzLDExMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiAgcHhhZmJfYnBwX3RvX2xjY3IzKCk6Ci0gKiAgICBDb252ZXJ0IGEgYml0cyBwZXIgcGl4ZWwgdmFsdWUgdG8gdGhlIGNvcnJlY3QgYml0IHBhdHRlcm4gZm9yIExDQ1IzCi0gKi8KLXN0YXRpYyBpbnQgcHhhZmJfYnBwX3RvX2xjY3IzKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorLyogY2FsY3VsYXRlIHBpeGVsIGRlcHRoLCB0cmFuc3BhcmVuY3kgYml0IGluY2x1ZGVkLCA+PTE2YnBwIGZvcm1hdHMgX29ubHlfICovCitzdGF0aWMgaW5saW5lIGludCB2YXJfdG9fZGVwdGgoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCiB7Ci0JaW50IHJldCA9IDA7CisJcmV0dXJuIHZhci0+cmVkLmxlbmd0aCArIHZhci0+Z3JlZW4ubGVuZ3RoICsKKwkJdmFyLT5ibHVlLmxlbmd0aCArIHZhci0+dHJhbnNwLmxlbmd0aDsKK30KKworLyogY2FsY3VsYXRlIDQtYml0IEJQUCB2YWx1ZSBmb3IgTENDUjMgYW5kIE9WTHhDMSAqLworc3RhdGljIGludCBweGFmYl92YXJfdG9fYnBwKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCWludCBicHAgPSAtRUlOVkFMOworCiAJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSAxOiAgcmV0ID0gTENDUjNfMUJQUDsgYnJlYWs7Ci0JY2FzZSAyOiAgcmV0ID0gTENDUjNfMkJQUDsgYnJlYWs7Ci0JY2FzZSA0OiAgcmV0ID0gTENDUjNfNEJQUDsgYnJlYWs7Ci0JY2FzZSA4OiAgcmV0ID0gTENDUjNfOEJQUDsgYnJlYWs7Ci0JY2FzZSAxNjogcmV0ID0gTENDUjNfMTZCUFA7IGJyZWFrOworCWNhc2UgMTogIGJwcCA9IDA7IGJyZWFrOworCWNhc2UgMjogIGJwcCA9IDE7IGJyZWFrOworCWNhc2UgNDogIGJwcCA9IDI7IGJyZWFrOworCWNhc2UgODogIGJwcCA9IDM7IGJyZWFrOworCWNhc2UgMTY6IGJwcCA9IDQ7IGJyZWFrOwogCWNhc2UgMjQ6Ci0JCXN3aXRjaCAodmFyLT5yZWQubGVuZ3RoICsgdmFyLT5ncmVlbi5sZW5ndGggKwotCQkJCXZhci0+Ymx1ZS5sZW5ndGggKyB2YXItPnRyYW5zcC5sZW5ndGgpIHsKLQkJY2FzZSAxODogcmV0ID0gTENDUjNfMThCUFBfUCB8IExDQ1IzX1BERk9SXzM7IGJyZWFrOwotCQljYXNlIDE5OiByZXQgPSBMQ0NSM18xOUJQUF9QOyBicmVhazsKKwkJc3dpdGNoICh2YXJfdG9fZGVwdGgodmFyKSkgeworCQljYXNlIDE4OiBicHAgPSA2OyBicmVhazsgLyogMTgtYml0cy9waXhlbCBwYWNrZWQgKi8KKwkJY2FzZSAxOTogYnBwID0gODsgYnJlYWs7IC8qIDE5LWJpdHMvcGl4ZWwgcGFja2VkICovCisJCWNhc2UgMjQ6IGJwcCA9IDk7IGJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCXN3aXRjaCAodmFyLT5yZWQubGVuZ3RoICsgdmFyLT5ncmVlbi5sZW5ndGggKwotCQkJCXZhci0+Ymx1ZS5sZW5ndGggKyB2YXItPnRyYW5zcC5sZW5ndGgpIHsKLQkJY2FzZSAxODogcmV0ID0gTENDUjNfMThCUFAgfCBMQ0NSM19QREZPUl8zOyBicmVhazsKLQkJY2FzZSAxOTogcmV0ID0gTENDUjNfMTlCUFA7IGJyZWFrOwotCQljYXNlIDI0OiByZXQgPSBMQ0NSM18yNEJQUCB8IExDQ1IzX1BERk9SXzM7IGJyZWFrOwotCQljYXNlIDI1OiByZXQgPSBMQ0NSM18yNUJQUDsgYnJlYWs7CisJCXN3aXRjaCAodmFyX3RvX2RlcHRoKHZhcikpIHsKKwkJY2FzZSAxODogYnBwID0gNTsgYnJlYWs7IC8qIDE4LWJpdHMvcGl4ZWwgdW5wYWNrZWQgKi8KKwkJY2FzZSAxOTogYnBwID0gNzsgYnJlYWs7IC8qIDE5LWJpdHMvcGl4ZWwgdW5wYWNrZWQgKi8KKwkJY2FzZSAyNTogYnBwID0gMTA7IGJyZWFrOwogCQl9CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBicHA7Cit9CisKKy8qCisgKiAgcHhhZmJfdmFyX3RvX2xjY3IzKCk6CisgKiAgICBDb252ZXJ0IGEgYml0cyBwZXIgcGl4ZWwgdmFsdWUgdG8gdGhlIGNvcnJlY3QgYml0IHBhdHRlcm4gZm9yIExDQ1IzCisgKgorICogIE5PVEU6IGZvciBQWEEyN3ggd2l0aCBvdmVybGF5cyBzdXBwb3J0LCB0aGUgTENDUjNfUERGT1JfeCBiaXRzIGhhdmUgYW4KKyAqICBpbXBsaWNhdGlvbiBvZiB0aGUgYWN1dGFsIHVzZSBvZiB0cmFuc3BhcmVuY3kgYml0LCAgd2hpY2ggd2UgaGFuZGxlIGl0CisgKiAgaGVyZSBzZXBhcmF0ZWRseS4gU2VlIFBYQTI3eCBEZXZlbG9wZXIncyBNYW51YWwsIFNlY3Rpb24gPDw3LjQuNiBQaXhlbAorICogIEZvcm1hdHM+PiBmb3IgdGhlIHZhbGlkIGNvbWJpbmF0aW9uIG9mIFBERk9SLCBQQUxfRk9SIGZvciB2YXJpb3VzIEJQUC4KKyAqCisgKiAgVHJhbnNwYXJlbmN5IGZvciBwYWxldHRlIHBpeGVsIGZvcm1hdHMgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LgorICovCitzdGF0aWMgdWludDMyX3QgcHhhZmJfdmFyX3RvX2xjY3IzKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCWludCBicHAgPSBweGFmYl92YXJfdG9fYnBwKHZhcik7CisJdWludDMyX3QgbGNjcjM7CisKKwlpZiAoYnBwIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlsY2NyMyA9IExDQ1IzX0JQUChicHApOworCisJc3dpdGNoICh2YXJfdG9fZGVwdGgodmFyKSkgeworCWNhc2UgMTY6IGxjY3IzIHw9IHZhci0+dHJhbnNwLmxlbmd0aCA/IExDQ1IzX1BERk9SXzMgOiAwOyBicmVhazsKKwljYXNlIDE4OiBsY2NyMyB8PSBMQ0NSM19QREZPUl8zOyBicmVhazsKKwljYXNlIDI0OiBsY2NyMyB8PSB2YXItPnRyYW5zcC5sZW5ndGggPyBMQ0NSM19QREZPUl8yIDogTENDUjNfUERGT1JfMzsKKwkJIGJyZWFrOworCWNhc2UgMTk6CisJY2FzZSAyNTogbGNjcjMgfD0gTENDUjNfUERGT1JfMDsgYnJlYWs7CisJfQorCXJldHVybiBsY2NyMzsKK30KKworI2RlZmluZSBTRVRfUElYRk1UKHYsIHIsIGcsIGIsIHQpCQkJCVwKKyh7CQkJCQkJCQlcCisJKHYpLT50cmFuc3Aub2Zmc2V0ID0gKHQpID8gKHIpICsgKGcpICsgKGIpIDogMDsJCVwKKwkodiktPnRyYW5zcC5sZW5ndGggPSAodCkgPyAodCkgOiAwOwkJCVwKKwkodiktPmJsdWUubGVuZ3RoICAgPSAoYik7ICh2KS0+Ymx1ZS5vZmZzZXQgPSAwOwkJXAorCSh2KS0+Z3JlZW4ubGVuZ3RoICA9IChnKTsgKHYpLT5ncmVlbi5vZmZzZXQgPSAoYik7CVwKKwkodiktPnJlZC5sZW5ndGggICAgPSAocik7ICh2KS0+cmVkLm9mZnNldCA9IChiKSArIChnKTsJXAorfSkKKworLyogc2V0IHRoZSBSR0JUIGJpdGZpZWxkcyBvZiBmYl92YXJfc2NyZWVuaW5mIGFjY29yZGluZyB0bworICogdmFyLT5iaXRzX3Blcl9waXhlbCBhbmQgZ2l2ZW4gZGVwdGgKKyAqLworc3RhdGljIHZvaWQgcHhhZmJfc2V0X3BpeGZtdChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGRlcHRoKQoreworCWlmIChkZXB0aCA9PSAwKQorCQlkZXB0aCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8IDE2KSB7CisJCS8qIGluZGV4ZWQgcGl4ZWwgZm9ybWF0cyAqLworCQl2YXItPnJlZC5vZmZzZXQgICAgPSAwOyB2YXItPnJlZC5sZW5ndGggICAgPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCAgPSAwOyB2YXItPmdyZWVuLmxlbmd0aCAgPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ICAgPSAwOyB2YXItPmJsdWUubGVuZ3RoICAgPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOyB2YXItPnRyYW5zcC5sZW5ndGggPSA4OworCX0KKworCXN3aXRjaCAoZGVwdGgpIHsKKwljYXNlIDE2OiB2YXItPnRyYW5zcC5sZW5ndGggPworCQkgU0VUX1BJWEZNVCh2YXIsIDUsIDUsIDUsIDEpIDoJCS8qIFJHQlQ1NTUgKi8KKwkJIFNFVF9QSVhGTVQodmFyLCA1LCA2LCA1LCAwKTsgYnJlYWs7CS8qIFJHQjU2NSAqLworCWNhc2UgMTg6IFNFVF9QSVhGTVQodmFyLCA2LCA2LCA2LCAwKTsgYnJlYWs7CS8qIFJHQjY2NiAqLworCWNhc2UgMTk6IFNFVF9QSVhGTVQodmFyLCA2LCA2LCA2LCAxKTsgYnJlYWs7CS8qIFJHQlQ2NjYgKi8KKwljYXNlIDI0OiB2YXItPnRyYW5zcC5sZW5ndGggPworCQkgU0VUX1BJWEZNVCh2YXIsIDgsIDgsIDcsIDEpIDoJCS8qIFJHQlQ4ODcgKi8KKwkJIFNFVF9QSVhGTVQodmFyLCA4LCA4LCA4LCAwKTsgYnJlYWs7CS8qIFJHQjg4OCAqLworCWNhc2UgMjU6IFNFVF9QSVhGTVQodmFyLCA4LCA4LCA4LCAxKTsgYnJlYWs7CS8qIFJHQlQ4ODggKi8KKwl9CiB9CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKQEAgLTMwOCw4ICszOTgsNDkgQEAKIAl2YXItPmxvd2VyX21hcmdpbgk9IG1vZGUtPmxvd2VyX21hcmdpbjsKIAl2YXItPnN5bmMJCT0gbW9kZS0+c3luYzsKIAl2YXItPmdyYXlzY2FsZQkJPSBtb2RlLT5jbWFwX2dyZXlzY2FsZTsKLQl2YXItPnhyZXNfdmlydHVhbCAJPSB2YXItPnhyZXM7Ci0JdmFyLT55cmVzX3ZpcnR1YWwJPSB2YXItPnlyZXM7CisKKwkvKiBzZXQgdGhlIGluaXRpYWwgUkdCQSBiaXRmaWVsZHMgKi8KKwlweGFmYl9zZXRfcGl4Zm10KHZhciwgbW9kZS0+ZGVwdGgpOworfQorCitzdGF0aWMgaW50IHB4YWZiX2FkanVzdF90aW1pbmcoc3RydWN0IHB4YWZiX2luZm8gKmZiaSwKKwkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlpbnQgbGluZV9sZW5ndGg7CisKKwl2YXItPnhyZXMgPSBtYXhfdChpbnQsIHZhci0+eHJlcywgTUlOX1hSRVMpOworCXZhci0+eXJlcyA9IG1heF90KGludCwgdmFyLT55cmVzLCBNSU5fWVJFUyk7CisKKwlpZiAoIShmYmktPmxjY3IwICYgTENDUjBfTENEVCkpIHsKKwkJY2xhbXBfdmFsKHZhci0+aHN5bmNfbGVuLCAxLCA2NCk7CisJCWNsYW1wX3ZhbCh2YXItPnZzeW5jX2xlbiwgMSwgNjQpOworCQljbGFtcF92YWwodmFyLT5sZWZ0X21hcmdpbiwgIDEsIDI1NSk7CisJCWNsYW1wX3ZhbCh2YXItPnJpZ2h0X21hcmdpbiwgMSwgMjU1KTsKKwkJY2xhbXBfdmFsKHZhci0+dXBwZXJfbWFyZ2luLCAxLCAyNTUpOworCQljbGFtcF92YWwodmFyLT5sb3dlcl9tYXJnaW4sIDEsIDI1NSk7CisJfQorCisJLyogbWFrZSBzdXJlIGVhY2ggbGluZSBpcyBhbGlnbmVkIG9uIHdvcmQgYm91bmRhcnkgKi8KKwlsaW5lX2xlbmd0aCA9IHZhci0+eHJlcyAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCWxpbmVfbGVuZ3RoID0gQUxJR04obGluZV9sZW5ndGgsIDQpOworCXZhci0+eHJlcyA9IGxpbmVfbGVuZ3RoICogOCAvIHZhci0+Yml0c19wZXJfcGl4ZWw7CisKKwkvKiB3ZSBkb24ndCBzdXBwb3J0IHhwYW4sIGZvcmNlIHhyZXNfdmlydHVhbCB0byBiZSBlcXVhbCB0byB4cmVzICovCisJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisKKwlpZiAodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQorCQl2YXItPnlyZXNfdmlydHVhbCA9IGZiaS0+ZmIuZml4LnNtZW1fbGVuIC8gbGluZV9sZW5ndGg7CisJZWxzZQorCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heCh2YXItPnlyZXNfdmlydHVhbCwgdmFyLT55cmVzKTsKKworCS8qIGNoZWNrIGZvciBsaW1pdHMgKi8KKwlpZiAodmFyLT54cmVzID4gTUFYX1hSRVMgfHwgdmFyLT55cmVzID4gTUFYX1lSRVMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMzI1LDExICs0NTYsNyBAQAogewogCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSAoc3RydWN0IHB4YWZiX2luZm8gKilpbmZvOwogCXN0cnVjdCBweGFmYl9tYWNoX2luZm8gKmluZiA9IGZiaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKHZhci0+eHJlcyA8IE1JTl9YUkVTKQotCQl2YXItPnhyZXMgPSBNSU5fWFJFUzsKLQlpZiAodmFyLT55cmVzIDwgTUlOX1lSRVMpCi0JCXZhci0+eXJlcyA9IE1JTl9ZUkVTOworCWludCBlcnI7CiAKIAlpZiAoaW5mLT5maXhlZF9tb2RlcykgewogCQlzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvICptb2RlOwpAQCAtMzM4LDc0ICs0NjUsMTggQEAKIAkJaWYgKCFtb2RlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXB4YWZiX3NldG1vZGUodmFyLCBtb2RlKTsKLQl9IGVsc2UgewotCQlpZiAodmFyLT54cmVzID4gaW5mLT5tb2Rlcy0+eHJlcykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodmFyLT55cmVzID4gaW5mLT5tb2Rlcy0+eXJlcykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA+IGluZi0+bW9kZXMtPmJwcCkKLQkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXZhci0+eHJlc192aXJ0dWFsID0KLQkJbWF4KHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnhyZXMpOwotCXZhci0+eXJlc192aXJ0dWFsID0KLQkJbWF4KHZhci0+eXJlc192aXJ0dWFsLCB2YXItPnlyZXMpOworCS8qIGRvIGEgdGVzdCBjb252ZXJzaW9uIHRvIEJQUCBmaWVsZHMgdG8gY2hlY2sgdGhlIGNvbG9yIGZvcm1hdHMgKi8KKwllcnIgPSBweGFmYl92YXJfdG9fYnBwKHZhcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKLQkvKgotCSAqIFNldHVwIHRoZSBSR0IgcGFyYW1ldGVycyBmb3IgdGhpcyBkaXNwbGF5LgotCSAqCi0JICogVGhlIHBpeGVsIHBhY2tpbmcgZm9ybWF0IGlzIGRlc2NyaWJlZCBvbiBwYWdlIDctMTEgb2YgdGhlCi0JICogUFhBMlhYIERldmVsb3BlcidzIE1hbnVhbC4KLQkgKi8KLQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAxNikgewotCQl2YXItPnJlZC5vZmZzZXQgICA9IDExOyB2YXItPnJlZC5sZW5ndGggICA9IDU7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsgIHZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKLQkJdmFyLT5ibHVlLm9mZnNldCAgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgPSA1OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSB2YXItPnRyYW5zcC5sZW5ndGggPSAwOwotCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA+IDE2KSB7Ci0JCXN0cnVjdCBweGFmYl9tb2RlX2luZm8gKm1vZGU7CisJcHhhZmJfc2V0X3BpeGZtdCh2YXIsIHZhcl90b19kZXB0aCh2YXIpKTsKIAotCQltb2RlID0gcHhhZmJfZ2V0bW9kZShpbmYsIHZhcik7Ci0JCWlmICghbW9kZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN3aXRjaCAobW9kZS0+ZGVwdGgpIHsKLQkJY2FzZSAxODogLyogUkdCNjY2ICovCi0JCQl2YXItPnRyYW5zcC5vZmZzZXQgPSB2YXItPnRyYW5zcC5sZW5ndGggICAgID0gMDsKLQkJCXZhci0+cmVkLm9mZnNldAkgICA9IDEyOyB2YXItPnJlZC5sZW5ndGggICAgPSA2OwotCQkJdmFyLT5ncmVlbi5vZmZzZXQgID0gNjsgIHZhci0+Z3JlZW4ubGVuZ3RoICA9IDY7Ci0JCQl2YXItPmJsdWUub2Zmc2V0ICAgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgID0gNjsKLQkJCWJyZWFrOwotCQljYXNlIDE5OiAvKiBSR0JUNjY2ICovCi0JCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAxODsgdmFyLT50cmFuc3AubGVuZ3RoID0gMTsKLQkJCXZhci0+cmVkLm9mZnNldAkgICA9IDEyOyB2YXItPnJlZC5sZW5ndGggICAgPSA2OwotCQkJdmFyLT5ncmVlbi5vZmZzZXQgID0gNjsgIHZhci0+Z3JlZW4ubGVuZ3RoICA9IDY7Ci0JCQl2YXItPmJsdWUub2Zmc2V0ICAgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgID0gNjsKLQkJCWJyZWFrOwotCQljYXNlIDI0OiAvKiBSR0I4ODggKi8KLQkJCXZhci0+dHJhbnNwLm9mZnNldCA9IHZhci0+dHJhbnNwLmxlbmd0aCAgICAgPSAwOwotCQkJdmFyLT5yZWQub2Zmc2V0CSAgID0gMTY7IHZhci0+cmVkLmxlbmd0aCAgICA9IDg7Ci0JCQl2YXItPmdyZWVuLm9mZnNldCAgPSA4OyAgdmFyLT5ncmVlbi5sZW5ndGggID0gODsKLQkJCXZhci0+Ymx1ZS5vZmZzZXQgICA9IDA7ICB2YXItPmJsdWUubGVuZ3RoICAgPSA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjU6IC8qIFJHQlQ4ODggKi8KLQkJCXZhci0+dHJhbnNwLm9mZnNldCA9IDI0OyB2YXItPnRyYW5zcC5sZW5ndGggPSAxOwotCQkJdmFyLT5yZWQub2Zmc2V0CSAgID0gMTY7IHZhci0+cmVkLmxlbmd0aCAgICA9IDg7Ci0JCQl2YXItPmdyZWVuLm9mZnNldCAgPSA4OyAgdmFyLT5ncmVlbi5sZW5ndGggID0gODsKLQkJCXZhci0+Ymx1ZS5vZmZzZXQgICA9IDA7ICB2YXItPmJsdWUubGVuZ3RoICAgPSA4OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZhci0+cmVkLm9mZnNldCA9IHZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IHZhci0+dHJhbnNwLm9mZnNldCA9IDA7Ci0JCXZhci0+cmVkLmxlbmd0aCAgID0gODsKLQkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwotCQl2YXItPmJsdWUubGVuZ3RoICA9IDg7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7Ci0JfQorCWVyciA9IHB4YWZiX2FkanVzdF90aW1pbmcoZmJpLCB2YXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAlwcl9kZWJ1ZygicHhhZmI6IGRtYSBwZXJpb2QgPSAlZCBwc1xuIiwKQEAgLTQxNSwxMSArNDg2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB4YWZiX3NldF90cnVlY29sb3IodV9pbnQgaXNfdHJ1ZV9jb2xvcikKLXsKLQkvKiBkbyB5b3VyIG1hY2hpbmUtc3BlY2lmaWMgc2V0dXAgaWYgbmVlZGVkICovCi19Ci0KIC8qCiAgKiBweGFmYl9zZXRfcGFyKCk6CiAgKglTZXQgdGhlIHVzZXIgZGVmaW5lZCBwYXJ0IG9mIHRoZSBkaXNwbGF5IGZvciB0aGUgc3BlY2lmaWVkIGNvbnNvbGUKQEAgLTQ1MiwxMSArNTE4LDYgQEAKIAogCWZiaS0+cGFsZXR0ZV9jcHUgPSAodTE2ICopJmZiaS0+ZG1hX2J1ZmYtPnBhbGV0dGVbMF07CiAKLQkvKgotCSAqIFNldCAoYW55KSBib2FyZCBjb250cm9sIHJlZ2lzdGVyIHRvIGhhbmRsZSBuZXcgY29sb3IgZGVwdGgKLQkgKi8KLQlweGFmYl9zZXRfdHJ1ZWNvbG9yKGZiaS0+ZmIuZml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SKTsKLQogCWlmIChmYmktPmZiLnZhci5iaXRzX3Blcl9waXhlbCA+PSAxNikKIAkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmZiLmNtYXApOwogCWVsc2UKQEAgLTQ2Nyw2ICs1MjgsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBweGFmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9IChzdHJ1Y3QgcHhhZmJfaW5mbyAqKWluZm87CisJaW50IGRtYSA9IERNQV9NQVggKyBETUFfQkFTRTsKKworCWlmIChmYmktPnN0YXRlICE9IENfRU5BQkxFKQorCQlyZXR1cm4gMDsKKworCXNldHVwX2Jhc2VfZnJhbWUoZmJpLCAxKTsKKworCWlmIChmYmktPmxjY3IwICYgTENDUjBfU0RTKQorCQlsY2Rfd3JpdGVsKGZiaSwgRkJSMSwgZmJpLT5mZGFkcltkbWEgKyAxXSB8IDB4MSk7CisKKwlsY2Rfd3JpdGVsKGZiaSwgRkJSMCwgZmJpLT5mZGFkcltkbWFdIHwgMHgxKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHB4YWZiX2JsYW5rKCk6CiAgKglCbGFuayB0aGUgZGlzcGxheSBieSBzZXR0aW5nIGFsbCBwYWxldHRlIHZhbHVlcyB0byB6ZXJvLiAgTm90ZSwgdGhlCkBAIC01MDIsMzIgKzU4MSwzNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpID0gKHN0cnVjdCBweGFmYl9pbmZvICopaW5mbzsKLQl1bnNpZ25lZCBsb25nIG9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQotCWlmIChvZmYgPCBpbmZvLT5maXguc21lbV9sZW4pIHsKLQkJdm1hLT52bV9wZ29mZiArPSBmYmktPnZpZGVvX29mZnNldCAvIFBBR0VfU0laRTsKLQkJcmV0dXJuIGRtYV9tbWFwX3dyaXRlY29tYmluZShmYmktPmRldiwgdm1hLCBmYmktPm1hcF9jcHUsCi0JCQkJCSAgICAgZmJpLT5tYXBfZG1hLCBmYmktPm1hcF9zaXplKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHB4YWZiX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmZiX2NoZWNrX3Zhcgk9IHB4YWZiX2NoZWNrX3ZhciwKIAkuZmJfc2V0X3Bhcgk9IHB4YWZiX3NldF9wYXIsCisJLmZiX3Bhbl9kaXNwbGF5CT0gcHhhZmJfcGFuX2Rpc3BsYXksCiAJLmZiX3NldGNvbHJlZwk9IHB4YWZiX3NldGNvbHJlZywKIAkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogCS5mYl9ibGFuawk9IHB4YWZiX2JsYW5rLAotCS5mYl9tbWFwCT0gcHhhZmJfbW1hcCwKIH07CiAKKyNpZmRlZiBDT05GSUdfRkJfUFhBX09WRVJMQVkKK3N0YXRpYyB2b2lkIG92ZXJsYXkxZmJfc2V0dXAoc3RydWN0IHB4YWZiX2xheWVyICpvZmIpCit7CisJaW50IHNpemUgPSBvZmItPmZiLmZpeC5saW5lX2xlbmd0aCAqIG9mYi0+ZmIudmFyLnlyZXNfdmlydHVhbDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gb2ZiLT52aWRlb19tZW1fcGh5czsKKwlzZXR1cF9mcmFtZV9kbWEob2ZiLT5mYmksIERNQV9PVjEsIFBBTF9OT05FLCBzdGFydCwgc2l6ZSk7Cit9CisKKy8qIERlcGVuZGluZyBvbiB0aGUgZW5hYmxlIHN0YXR1cyBvZiBvdmVybGF5MS8yLCB0aGUgRE1BIHNob3VsZCBiZQorICogdXBkYXRlZCBmcm9tIEZEQURSeCAod2hlbiBkaXNhYmxlZCkgb3IgRkJSeCAod2hlbiBlbmFibGVkKS4KKyAqLworc3RhdGljIHZvaWQgb3ZlcmxheTFmYl9lbmFibGUoc3RydWN0IHB4YWZiX2xheWVyICpvZmIpCit7CisJaW50IGVuYWJsZWQgPSBsY2RfcmVhZGwob2ZiLT5mYmksIE9WTDFDMSkgJiBPVkx4QzFfT0VOOworCXVpbnQzMl90IGZkYWRyMSA9IG9mYi0+ZmJpLT5mZGFkcltETUFfT1YxXSB8IChlbmFibGVkID8gMHgxIDogMCk7CisKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBlbmFibGVkID8gRkJSMSA6IEZEQURSMSwgZmRhZHIxKTsKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBPVkwxQzIsIG9mYi0+Y29udHJvbFsxXSk7CisJbGNkX3dyaXRlbChvZmItPmZiaSwgT1ZMMUMxLCBvZmItPmNvbnRyb2xbMF0gfCBPVkx4QzFfT0VOKTsKK30KKworc3RhdGljIHZvaWQgb3ZlcmxheTFmYl9kaXNhYmxlKHN0cnVjdCBweGFmYl9sYXllciAqb2ZiKQoreworCXVpbnQzMl90IGxjY3I1ID0gbGNkX3JlYWRsKG9mYi0+ZmJpLCBMQ0NSNSk7CisKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBPVkwxQzEsIG9mYi0+Y29udHJvbFswXSAmIH5PVkx4QzFfT0VOKTsKKworCWxjZF93cml0ZWwob2ZiLT5mYmksIExDU1IxLCBMQ1NSMV9CUygxKSk7CisJbGNkX3dyaXRlbChvZmItPmZiaSwgTENDUjUsIGxjY3I1ICYgfkxDU1IxX0JTKDEpKTsKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBGQlIxLCBvZmItPmZiaS0+ZmRhZHJbRE1BX09WMV0gfCAweDMpOworCisJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb2ZiLT5icmFuY2hfZG9uZSwgMSAqIEhaKSA9PSAwKQorCQlwcl93YXJuaW5nKCIlczogdGltZW91dCBkaXNhYmxpbmcgb3ZlcmxheTFcbiIsIF9fZnVuY19fKTsKKworCWxjZF93cml0ZWwob2ZiLT5mYmksIExDQ1I1LCBsY2NyNSk7Cit9CisKK3N0YXRpYyB2b2lkIG92ZXJsYXkyZmJfc2V0dXAoc3RydWN0IHB4YWZiX2xheWVyICpvZmIpCit7CisJaW50IHNpemUsIGRpdiA9IDEsIHBmb3IgPSBOT05TVERfVE9fUEZPUihvZmItPmZiLnZhci5ub25zdGQpOworCXVuc2lnbmVkIGxvbmcgc3RhcnRbM10gPSB7IG9mYi0+dmlkZW9fbWVtX3BoeXMsIDAsIDAgfTsKKworCWlmIChwZm9yID09IE9WRVJMQVlfRk9STUFUX1JHQiB8fCBwZm9yID09IE9WRVJMQVlfRk9STUFUX1lVVjQ0NF9QQUNLRUQpIHsKKwkJc2l6ZSA9IG9mYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICogb2ZiLT5mYi52YXIueXJlc192aXJ0dWFsOworCQlzZXR1cF9mcmFtZV9kbWEob2ZiLT5mYmksIERNQV9PVjJfWSwgLTEsIHN0YXJ0WzBdLCBzaXplKTsKKwl9IGVsc2UgeworCQlzaXplID0gb2ZiLT5mYi52YXIueHJlc192aXJ0dWFsICogb2ZiLT5mYi52YXIueXJlc192aXJ0dWFsOworCQlzd2l0Y2ggKHBmb3IpIHsKKwkJY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0NDRfUExBTkFSOiBkaXYgPSAxOyBicmVhazsKKwkJY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0MjJfUExBTkFSOiBkaXYgPSAyOyBicmVhazsKKwkJY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0MjBfUExBTkFSOiBkaXYgPSA0OyBicmVhazsKKwkJfQorCQlzdGFydFsxXSA9IHN0YXJ0WzBdICsgc2l6ZTsKKwkJc3RhcnRbMl0gPSBzdGFydFsxXSArIHNpemUgLyBkaXY7CisJCXNldHVwX2ZyYW1lX2RtYShvZmItPmZiaSwgRE1BX09WMl9ZLCAgLTEsIHN0YXJ0WzBdLCBzaXplKTsKKwkJc2V0dXBfZnJhbWVfZG1hKG9mYi0+ZmJpLCBETUFfT1YyX0NiLCAtMSwgc3RhcnRbMV0sIHNpemUgLyBkaXYpOworCQlzZXR1cF9mcmFtZV9kbWEob2ZiLT5mYmksIERNQV9PVjJfQ3IsIC0xLCBzdGFydFsyXSwgc2l6ZSAvIGRpdik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvdmVybGF5MmZiX2VuYWJsZShzdHJ1Y3QgcHhhZmJfbGF5ZXIgKm9mYikKK3sKKwlpbnQgcGZvciA9IE5PTlNURF9UT19QRk9SKG9mYi0+ZmIudmFyLm5vbnN0ZCk7CisJaW50IGVuYWJsZWQgPSBsY2RfcmVhZGwob2ZiLT5mYmksIE9WTDJDMSkgJiBPVkx4QzFfT0VOOworCXVpbnQzMl90IGZkYWRyMiA9IG9mYi0+ZmJpLT5mZGFkcltETUFfT1YyX1ldICB8IChlbmFibGVkID8gMHgxIDogMCk7CisJdWludDMyX3QgZmRhZHIzID0gb2ZiLT5mYmktPmZkYWRyW0RNQV9PVjJfQ2JdIHwgKGVuYWJsZWQgPyAweDEgOiAwKTsKKwl1aW50MzJfdCBmZGFkcjQgPSBvZmItPmZiaS0+ZmRhZHJbRE1BX09WMl9Dcl0gfCAoZW5hYmxlZCA/IDB4MSA6IDApOworCisJaWYgKHBmb3IgPT0gT1ZFUkxBWV9GT1JNQVRfUkdCIHx8IHBmb3IgPT0gT1ZFUkxBWV9GT1JNQVRfWVVWNDQ0X1BBQ0tFRCkKKwkJbGNkX3dyaXRlbChvZmItPmZiaSwgZW5hYmxlZCA/IEZCUjIgOiBGREFEUjIsIGZkYWRyMik7CisJZWxzZSB7CisJCWxjZF93cml0ZWwob2ZiLT5mYmksIGVuYWJsZWQgPyBGQlIyIDogRkRBRFIyLCBmZGFkcjIpOworCQlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBlbmFibGVkID8gRkJSMyA6IEZEQURSMywgZmRhZHIzKTsKKwkJbGNkX3dyaXRlbChvZmItPmZiaSwgZW5hYmxlZCA/IEZCUjQgOiBGREFEUjQsIGZkYWRyNCk7CisJfQorCWxjZF93cml0ZWwob2ZiLT5mYmksIE9WTDJDMiwgb2ZiLT5jb250cm9sWzFdKTsKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBPVkwyQzEsIG9mYi0+Y29udHJvbFswXSB8IE9WTHhDMV9PRU4pOworfQorCitzdGF0aWMgdm9pZCBvdmVybGF5MmZiX2Rpc2FibGUoc3RydWN0IHB4YWZiX2xheWVyICpvZmIpCit7CisJdWludDMyX3QgbGNjcjUgPSBsY2RfcmVhZGwob2ZiLT5mYmksIExDQ1I1KTsKKworCWxjZF93cml0ZWwob2ZiLT5mYmksIE9WTDJDMSwgb2ZiLT5jb250cm9sWzBdICYgfk9WTHhDMV9PRU4pOworCisJbGNkX3dyaXRlbChvZmItPmZiaSwgTENTUjEsIExDU1IxX0JTKDIpKTsKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBMQ0NSNSwgbGNjcjUgJiB+TENTUjFfQlMoMikpOworCWxjZF93cml0ZWwob2ZiLT5mYmksIEZCUjIsIG9mYi0+ZmJpLT5mZGFkcltETUFfT1YyX1ldICB8IDB4Myk7CisJbGNkX3dyaXRlbChvZmItPmZiaSwgRkJSMywgb2ZiLT5mYmktPmZkYWRyW0RNQV9PVjJfQ2JdIHwgMHgzKTsKKwlsY2Rfd3JpdGVsKG9mYi0+ZmJpLCBGQlI0LCBvZmItPmZiaS0+ZmRhZHJbRE1BX09WMl9Dcl0gfCAweDMpOworCisJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb2ZiLT5icmFuY2hfZG9uZSwgMSAqIEhaKSA9PSAwKQorCQlwcl93YXJuaW5nKCIlczogdGltZW91dCBkaXNhYmxpbmcgb3ZlcmxheTJcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHN0cnVjdCBweGFmYl9sYXllcl9vcHMgb2ZiX29wc1tdID0geworCVswXSA9IHsKKwkJLmVuYWJsZQkJPSBvdmVybGF5MWZiX2VuYWJsZSwKKwkJLmRpc2FibGUJPSBvdmVybGF5MWZiX2Rpc2FibGUsCisJCS5zZXR1cAkJPSBvdmVybGF5MWZiX3NldHVwLAorCX0sCisJWzFdID0geworCQkuZW5hYmxlCQk9IG92ZXJsYXkyZmJfZW5hYmxlLAorCQkuZGlzYWJsZQk9IG92ZXJsYXkyZmJfZGlzYWJsZSwKKwkJLnNldHVwCQk9IG92ZXJsYXkyZmJfc2V0dXAsCisJfSwKK307CisKK3N0YXRpYyBpbnQgb3ZlcmxheWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCBweGFmYl9sYXllciAqb2ZiID0gKHN0cnVjdCBweGFmYl9sYXllciAqKWluZm87CisKKwkvKiBubyBzdXBwb3J0IGZvciBmcmFtZWJ1ZmZlciBjb25zb2xlIG9uIG92ZXJsYXkgKi8KKwlpZiAodXNlciA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGFsbG93IG9ubHkgb25lIHVzZXIgYXQgYSB0aW1lICovCisJaWYgKGF0b21pY19pbmNfYW5kX3Rlc3QoJm9mYi0+dXNhZ2UpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogdW5ibGFuayB0aGUgYmFzZSBmcmFtZWJ1ZmZlciAqLworCWZiX2JsYW5rKCZvZmItPmZiaS0+ZmIsIEZCX0JMQU5LX1VOQkxBTkspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92ZXJsYXlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlzdHJ1Y3QgcHhhZmJfbGF5ZXIgKm9mYiA9IChzdHJ1Y3QgcHhhZmJfbGF5ZXIqKSBpbmZvOworCisJYXRvbWljX2RlYygmb2ZiLT51c2FnZSk7CisJb2ZiLT5vcHMtPmRpc2FibGUob2ZiKTsKKworCWZyZWVfcGFnZXNfZXhhY3Qob2ZiLT52aWRlb19tZW0sIG9mYi0+dmlkZW9fbWVtX3NpemUpOworCW9mYi0+dmlkZW9fbWVtID0gTlVMTDsKKwlvZmItPnZpZGVvX21lbV9zaXplID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdmVybGF5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBweGFmYl9sYXllciAqb2ZiID0gKHN0cnVjdCBweGFmYl9sYXllciAqKWluZm87CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpiYXNlX3ZhciA9ICZvZmItPmZiaS0+ZmIudmFyOworCWludCB4cG9zLCB5cG9zLCBwZm9yLCBicHA7CisKKwl4cG9zID0gTk9OU1REX1RPX1hQT1ModmFyLT5ub25zdGQpOworCXlwb3MgPSBOT05TVERfVE9fWFBPUyh2YXItPm5vbnN0ZCk7CisJcGZvciA9IE5PTlNURF9UT19QRk9SKHZhci0+bm9uc3RkKTsKKworCWJwcCA9IHB4YWZiX3Zhcl90b19icHAodmFyKTsKKwlpZiAoYnBwIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBubyBzdXBwb3J0IGZvciBZVVYgZm9ybWF0IG9uIG92ZXJsYXkxICovCisJaWYgKG9mYi0+aWQgPT0gT1ZFUkxBWTEgJiYgcGZvciAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGZvciBZVVYgcGFja2VkIGZvcm1hdHMsIGJwcCA9ICdtaW5pbXVtIGJwcCBvZiBZVVYgY29tcG9uZW50cycgKi8KKwlzd2l0Y2ggKHBmb3IpIHsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1JHQjoKKwkJYnBwID0gcHhhZmJfdmFyX3RvX2JwcCh2YXIpOworCQlpZiAoYnBwIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXB4YWZiX3NldF9waXhmbXQodmFyLCB2YXJfdG9fZGVwdGgodmFyKSk7CisJCWJyZWFrOworCWNhc2UgT1ZFUkxBWV9GT1JNQVRfWVVWNDQ0X1BBQ0tFRDogYnBwID0gMjQ7IGJyZWFrOworCWNhc2UgT1ZFUkxBWV9GT1JNQVRfWVVWNDQ0X1BMQU5BUjogYnBwID0gODsgYnJlYWs7CisJY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0MjJfUExBTkFSOiBicHAgPSA0OyBicmVhazsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMF9QTEFOQVI6IGJwcCA9IDI7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGVhY2ggbGluZSBtdXN0IHN0YXJ0IGF0IGEgMzItYml0IHdvcmQgYm91bmRhcnkgKi8KKwlpZiAoKHhwb3MgKiBicHApICUgMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogeHJlcyBtdXN0IGFsaWduIG9uIDMyLWJpdCB3b3JkIGJvdW5kYXJ5ICovCisJdmFyLT54cmVzID0gcm91bmR1cCh2YXItPnhyZXMgKiBicHAsIDMyKSAvIGJwcDsKKworCWlmICgoeHBvcyArIHZhci0+eHJlcyA+IGJhc2VfdmFyLT54cmVzKSB8fAorCSAgICAoeXBvcyArIHZhci0+eXJlcyA+IGJhc2VfdmFyLT55cmVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwl2YXItPnlyZXNfdmlydHVhbCA9IG1heCh2YXItPnlyZXMsIHZhci0+eXJlc192aXJ0dWFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdmVybGF5ZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgcHhhZmJfbGF5ZXIgKm9mYikKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZvZmItPmZiLnZhcjsKKwlpbnQgcGZvciA9IE5PTlNURF9UT19QRk9SKHZhci0+bm9uc3RkKTsKKwlpbnQgc2l6ZSwgYnBwID0gMDsKKworCXN3aXRjaCAocGZvcikgeworCWNhc2UgT1ZFUkxBWV9GT1JNQVRfUkdCOiBicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOyBicmVhazsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQ0NF9QQUNLRUQ6IGJwcCA9IDI0OyBicmVhazsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQ0NF9QTEFOQVI6IGJwcCA9IDI0OyBicmVhazsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMl9QTEFOQVI6IGJwcCA9IDE2OyBicmVhazsKKwljYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMF9QTEFOQVI6IGJwcCA9IDEyOyBicmVhazsKKwl9CisKKwlvZmItPmZiLmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogYnBwIC8gODsKKworCXNpemUgPSBQQUdFX0FMSUdOKG9mYi0+ZmIuZml4LmxpbmVfbGVuZ3RoICogdmFyLT55cmVzX3ZpcnR1YWwpOworCisJLyogZG9uJ3QgcmUtYWxsb2NhdGUgaWYgdGhlIG9yaWdpbmFsIHZpZGVvIG1lbW9yeSBpcyBlbm91Z2ggKi8KKwlpZiAob2ZiLT52aWRlb19tZW0pIHsKKwkJaWYgKG9mYi0+dmlkZW9fbWVtX3NpemUgPj0gc2l6ZSkKKwkJCXJldHVybiAwOworCisJCWZyZWVfcGFnZXNfZXhhY3Qob2ZiLT52aWRlb19tZW0sIG9mYi0+dmlkZW9fbWVtX3NpemUpOworCX0KKworCW9mYi0+dmlkZW9fbWVtID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmIChvZmItPnZpZGVvX21lbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9mYi0+dmlkZW9fbWVtX3BoeXMgPSB2aXJ0X3RvX3BoeXMob2ZiLT52aWRlb19tZW0pOworCW9mYi0+dmlkZW9fbWVtX3NpemUgPSBzaXplOworCisJb2ZiLT5mYi5maXguc21lbV9zdGFydAk9IG9mYi0+dmlkZW9fbWVtX3BoeXM7CisJb2ZiLT5mYi5maXguc21lbV9sZW4JPSBvZmItPmZiLmZpeC5saW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsOworCW9mYi0+ZmIuc2NyZWVuX2Jhc2UJPSBvZmItPnZpZGVvX21lbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdmVybGF5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcHhhZmJfbGF5ZXIgKm9mYiA9IChzdHJ1Y3QgcHhhZmJfbGF5ZXIgKilpbmZvOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKwlpbnQgeHBvcywgeXBvcywgcGZvciwgYnBwLCByZXQ7CisKKwlyZXQgPSBvdmVybGF5ZmJfbWFwX3ZpZGVvX21lbW9yeShvZmIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlicHAgID0gcHhhZmJfdmFyX3RvX2JwcCh2YXIpOworCXhwb3MgPSBOT05TVERfVE9fWFBPUyh2YXItPm5vbnN0ZCk7CisJeXBvcyA9IE5PTlNURF9UT19YUE9TKHZhci0+bm9uc3RkKTsKKwlwZm9yID0gTk9OU1REX1RPX1BGT1IodmFyLT5ub25zdGQpOworCisJb2ZiLT5jb250cm9sWzBdID0gT1ZMeEMxX1BQTCh2YXItPnhyZXMpIHwgT1ZMeEMxX0xQTyh2YXItPnlyZXMpIHwKKwkJCSAgT1ZMeEMxX0JQUChicHApOworCW9mYi0+Y29udHJvbFsxXSA9IE9WTHhDMl9YUE9TKHhwb3MpIHwgT1ZMeEMyX1lQT1MoeXBvcyk7CisKKwlpZiAob2ZiLT5pZCA9PSBPVkVSTEFZMikKKwkJb2ZiLT5jb250cm9sWzFdIHw9IE9WTDJDMl9QRk9SKHBmb3IpOworCisJb2ZiLT5vcHMtPnNldHVwKG9mYik7CisJb2ZiLT5vcHMtPmVuYWJsZShvZmIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyBvdmVybGF5X2ZiX29wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5mYl9vcGVuCQk9IG92ZXJsYXlmYl9vcGVuLAorCS5mYl9yZWxlYXNlCQk9IG92ZXJsYXlmYl9yZWxlYXNlLAorCS5mYl9jaGVja192YXIgCQk9IG92ZXJsYXlmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJCT0gb3ZlcmxheWZiX3NldF9wYXIsCit9OworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9weGFmYl9vdmVybGF5KHN0cnVjdCBweGFmYl9pbmZvICpmYmksCisJCQkJCSBzdHJ1Y3QgcHhhZmJfbGF5ZXIgKm9mYiwgaW50IGlkKQoreworCXNwcmludGYob2ZiLT5mYi5maXguaWQsICJvdmVybGF5JWQiLCBpZCArIDEpOworCisJb2ZiLT5mYi5maXgudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJb2ZiLT5mYi5maXgueHBhbnN0ZXAJCT0gMDsKKwlvZmItPmZiLmZpeC55cGFuc3RlcAkJPSAxOworCisJb2ZiLT5mYi52YXIuYWN0aXZhdGUJCT0gRkJfQUNUSVZBVEVfTk9XOworCW9mYi0+ZmIudmFyLmhlaWdodAkJPSAtMTsKKwlvZmItPmZiLnZhci53aWR0aAkJPSAtMTsKKwlvZmItPmZiLnZhci52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCisJb2ZiLT5mYi5mYm9wcwkJCT0gJm92ZXJsYXlfZmJfb3BzOworCW9mYi0+ZmIuZmxhZ3MJCQk9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJb2ZiLT5mYi5ub2RlCQkJPSAtMTsKKwlvZmItPmZiLnBzZXVkb19wYWxldHRlCQk9IE5VTEw7CisKKwlvZmItPmlkID0gaWQ7CisJb2ZiLT5vcHMgPSAmb2ZiX29wc1tpZF07CisJYXRvbWljX3NldCgmb2ZiLT51c2FnZSwgMCk7CisJb2ZiLT5mYmkgPSBmYmk7CisJaW5pdF9jb21wbGV0aW9uKCZvZmItPmJyYW5jaF9kb25lKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHhhZmJfb3ZlcmxheV9pbml0KHN0cnVjdCBweGFmYl9pbmZvICpmYmkpCit7CisJaW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaW5pdF9weGFmYl9vdmVybGF5KGZiaSwgJmZiaS0+b3ZlcmxheVtpXSwgaSk7CisJCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYmktPm92ZXJsYXlbaV0uZmIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGZiaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG92ZXJsYXkgJWRcbiIsIGkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIG1hc2sgYWxsIElVL0JTL0VPRi9TT0YgaW50ZXJydXB0cyAqLworCWxjZF93cml0ZWwoZmJpLCBMQ0NSNSwgfjApOworCisJLyogcGxhY2Ugb3ZlcmxheShzKSBvbiB0b3Agb2YgYmFzZSAqLworCWZiaS0+bGNjcjAgfD0gTENDUjBfT1VDOworCXByX2luZm8oIlBYQSBPdmVybGF5IGRyaXZlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5IVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBweGFmYl9vdmVybGF5X2V4aXQoc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiaS0+b3ZlcmxheVtpXS5mYik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHB4YWZiX292ZXJsYXlfaW5pdChzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHB4YWZiX292ZXJsYXlfZXhpdChzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKSB7fQorI2VuZGlmIC8qIENPTkZJR19GQl9QWEFfT1ZFUkxBWSAqLworCiAvKgogICogQ2FsY3VsYXRlIHRoZSBQQ0QgdmFsdWUgZnJvbSB0aGUgY2xvY2sgcmF0ZSAoaW4gcGljb3NlY29uZHMpLgogICogV2UgdGFrZSBhY2NvdW50IG9mIHRoZSBQUENSIGNsb2NrIHNldHRpbmcuCkBAIC02MDcsMjIgKzk5NiwyMiBAQAogRVhQT1JUX1NZTUJPTChweGFmYl9nZXRfaHN5bmNfdGltZSk7CiAKIHN0YXRpYyBpbnQgc2V0dXBfZnJhbWVfZG1hKHN0cnVjdCBweGFmYl9pbmZvICpmYmksIGludCBkbWEsIGludCBwYWwsCi0JCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBzaXplKQorCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHB4YWZiX2RtYV9kZXNjcmlwdG9yICpkbWFfZGVzYywgKnBhbF9kZXNjOwogCXVuc2lnbmVkIGludCBkbWFfZGVzY19vZmYsIHBhbF9kZXNjX29mZjsKIAotCWlmIChkbWEgPCAwIHx8IGRtYSA+PSBETUFfTUFYKQorCWlmIChkbWEgPCAwIHx8IGRtYSA+PSBETUFfTUFYICogMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkbWFfZGVzYyA9ICZmYmktPmRtYV9idWZmLT5kbWFfZGVzY1tkbWFdOwogCWRtYV9kZXNjX29mZiA9IG9mZnNldG9mKHN0cnVjdCBweGFmYl9kbWFfYnVmZiwgZG1hX2Rlc2NbZG1hXSk7CiAKLQlkbWFfZGVzYy0+ZnNhZHIgPSBmYmktPnNjcmVlbl9kbWEgKyBvZmZzZXQ7CisJZG1hX2Rlc2MtPmZzYWRyID0gc3RhcnQ7CiAJZG1hX2Rlc2MtPmZpZHIgID0gMDsKIAlkbWFfZGVzYy0+bGRjbWQgPSBzaXplOwogCi0JaWYgKHBhbCA8IDAgfHwgcGFsID49IFBBTF9NQVgpIHsKKwlpZiAocGFsIDwgMCB8fCBwYWwgPj0gUEFMX01BWCAqIDIpIHsKIAkJZG1hX2Rlc2MtPmZkYWRyID0gZmJpLT5kbWFfYnVmZl9waHlzICsgZG1hX2Rlc2Nfb2ZmOwogCQlmYmktPmZkYWRyW2RtYV0gPSBmYmktPmRtYV9idWZmX3BoeXMgKyBkbWFfZGVzY19vZmY7CiAJfSBlbHNlIHsKQEAgLTY0OCw2ICsxMDM3LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNldHVwX2Jhc2VfZnJhbWUoc3RydWN0IHB4YWZiX2luZm8gKmZiaSwgaW50IGJyYW5jaCkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPmZiLnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZmYmktPmZiLmZpeDsKKwlpbnQgbmJ5dGVzLCBkbWEsIHBhbCwgYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCWRtYSA9IERNQV9CQVNFICsgKGJyYW5jaCA/IERNQV9NQVggOiAwKTsKKwlwYWwgPSAoYnBwID49IDE2KSA/IFBBTF9OT05FIDogUEFMX0JBU0UgKyAoYnJhbmNoID8gUEFMX01BWCA6IDApOworCisJbmJ5dGVzID0gZml4LT5saW5lX2xlbmd0aCAqIHZhci0+eXJlczsKKwlvZmZzZXQgPSBmaXgtPmxpbmVfbGVuZ3RoICogdmFyLT55b2Zmc2V0ICsgZmJpLT52aWRlb19tZW1fcGh5czsKKworCWlmIChmYmktPmxjY3IwICYgTENDUjBfU0RTKSB7CisJCW5ieXRlcyA9IG5ieXRlcyAvIDI7CisJCXNldHVwX2ZyYW1lX2RtYShmYmksIGRtYSArIDEsIFBBTF9OT05FLCBvZmZzZXQgKyBuYnl0ZXMsIG5ieXRlcyk7CisJfQorCisJc2V0dXBfZnJhbWVfZG1hKGZiaSwgZG1hLCBwYWwsIG9mZnNldCwgbmJ5dGVzKTsKK30KKwogI2lmZGVmIENPTkZJR19GQl9QWEFfU01BUlRQQU5FTAogc3RhdGljIGludCBzZXR1cF9zbWFydF9kbWEoc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKIHsKQEAgLTcwMSw2ICsxMTExLDcgQEAKIAlsY2Rfd3JpdGVsKGZiaSwgTENDUjEsIGZiaS0+cmVnX2xjY3IxKTsKIAlsY2Rfd3JpdGVsKGZiaSwgTENDUjIsIGZiaS0+cmVnX2xjY3IyKTsKIAlsY2Rfd3JpdGVsKGZiaSwgTENDUjMsIGZiaS0+cmVnX2xjY3IzKTsKKwlsY2Rfd3JpdGVsKGZiaSwgTENDUjQsIGZiaS0+cmVnX2xjY3I0KTsKIAlsY2Rfd3JpdGVsKGZiaSwgRkRBRFIwLCBmYmktPmZkYWRyWzBdKTsKIAlsY2Rfd3JpdGVsKGZiaSwgRkRBRFI2LCBmYmktPmZkYWRyWzZdKTsKIApAQCAtNzI3LDEyICsxMTM4LDE5IEBACiAJaW50IGk7CiAJc3RydWN0IHB4YWZiX2luZm8gKmZiaSA9IGNvbnRhaW5lcl9vZihpbmZvLCBzdHJ1Y3QgcHhhZmJfaW5mbywgZmIpOwogCi0JLyogbGVhdmUgMiBjb21tYW5kcyBmb3IgSU5URVJSVVBUIGFuZCBXQUlUX0ZPUl9TWU5DICovCi0JZm9yIChpID0gMDsgaSA8IG5fY21kczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5fY21kczsgaSsrLCBjbWRzKyspIHsKKwkJLyogaWYgaXQgaXMgYSBzb2Z0d2FyZSBkZWxheSwgZmx1c2ggYW5kIGRlbGF5ICovCisJCWlmICgoKmNtZHMgJiAweGZmMDApID09IFNNQVJUX0NNRF9ERUxBWSkgeworCQkJcHhhZmJfc21hcnRfZmx1c2goaW5mbyk7CisJCQltZGVsYXkoKmNtZHMgJiAweGZmKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbGVhdmUgMiBjb21tYW5kcyBmb3IgSU5URVJSVVBUIGFuZCBXQUlUX0ZPUl9TWU5DICovCiAJCWlmIChmYmktPm5fc21hcnRfY21kcyA9PSBDTURfQlVGRl9TSVpFIC0gOCkKIAkJCXB4YWZiX3NtYXJ0X2ZsdXNoKGluZm8pOwogCi0JCWZiaS0+c21hcnRfY21kc1tmYmktPm5fc21hcnRfY21kcysrXSA9ICpjbWRzKys7CisJCWZiaS0+c21hcnRfY21kc1tmYmktPm5fc21hcnRfY21kcysrXSA9ICpjbWRzOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzY0LDcgKzExODIsOSBAQAogCQlMQ0NSMV9Ib3JTbmNoV2R0aChfX3NtYXJ0X3RpbWluZyh0MywgbGNsaykpOwogCiAJZmJpLT5yZWdfbGNjcjIgPSBMQ0NSMl9EaXNIZ2h0KHZhci0+eXJlcyk7Ci0JZmJpLT5yZWdfbGNjcjMgPSBMQ0NSM19QaXhDbGtEaXYoX19zbWFydF90aW1pbmcodDQsIGxjbGspKTsKKwlmYmktPnJlZ19sY2NyMyA9IGZiaS0+bGNjcjMgfCBMQ0NSM19QaXhDbGtEaXYoX19zbWFydF90aW1pbmcodDQsIGxjbGspKTsKKwlmYmktPnJlZ19sY2NyMyB8PSAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpID8gTENDUjNfSFNQIDogMDsKKwlmYmktPnJlZ19sY2NyMyB8PSAodmFyLT5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSA/IExDQ1IzX1ZTUCA6IDA7CiAKIAkvKiBGSVhNRTogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAqLwogCWZiaS0+cmVnX2NtZGNyID0gMTsKQEAgLTc4OSwxMSArMTIwOSwxNSBAQAogCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQkJY29udGludWU7CiAKKwkJbXV0ZXhfbG9jaygmZmJpLT5jdHJscl9sb2NrKTsKKwogCQlpZiAoZmJpLT5zdGF0ZSA9PSBDX0VOQUJMRSkgewogCQkJaW5mLT5zbWFydF91cGRhdGUoJmZiaS0+ZmIpOwogCQkJY29tcGxldGUoJmZiaS0+cmVmcmVzaF9kb25lKTsKIAkJfQogCisJCW11dGV4X3VubG9jaygmZmJpLT5jdHJscl9sb2NrKTsKKwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDMwICogSFogLyAxMDAwKTsKIAl9CkBAIC04MDQsMTYgKzEyMjgsMjIgQEAKIAogc3RhdGljIGludCBweGFmYl9zbWFydF9pbml0KHN0cnVjdCBweGFmYl9pbmZvICpmYmkpCiB7Ci0JaWYgKCEoZmJpLT5sY2NyMCB8IExDQ1IwX0xDRFQpKQorCWlmICghKGZiaS0+bGNjcjAgJiBMQ0NSMF9MQ0RUKSkKIAkJcmV0dXJuIDA7CiAKKwlmYmktPnNtYXJ0X2NtZHMgPSAodWludDE2X3QgKikgZmJpLT5kbWFfYnVmZi0+Y21kX2J1ZmY7CisJZmJpLT5uX3NtYXJ0X2NtZHMgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZmYmktPmNvbW1hbmRfZG9uZSk7CisJaW5pdF9jb21wbGV0aW9uKCZmYmktPnJlZnJlc2hfZG9uZSk7CisKIAlmYmktPnNtYXJ0X3RocmVhZCA9IGt0aHJlYWRfcnVuKHB4YWZiX3NtYXJ0X3RocmVhZCwgZmJpLAogCQkJCQkibGNkX3JlZnJlc2giKTsKIAlpZiAoSVNfRVJSKGZiaS0+c21hcnRfdGhyZWFkKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gY3JlYXRlIGtlcm5lbCB0aHJlYWRcbiIsCi0JCQkJX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gY3JlYXRlIGtlcm5lbCB0aHJlYWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIFBUUl9FUlIoZmJpLT5zbWFydF90aHJlYWQpOwogCX0KKwogCXJldHVybiAwOwogfQogI2Vsc2UKQEAgLTgyNiw3ICsxMjU2LDkgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfRkJfU01BUlRfUEFORUwgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHhhZmJfc21hcnRfaW5pdChzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMICovCiAKIHN0YXRpYyB2b2lkIHNldHVwX3BhcmFsbGVsX3RpbWluZyhzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpLAogCQkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCkBAIC04NzQsNTEgKzEzMDYsNyBAQAogCQkJICAgICAgc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKIHsKIAl1X2xvbmcgZmxhZ3M7Ci0Jc2l6ZV90IG5ieXRlczsKIAotI2lmIERFQlVHX1ZBUgotCWlmICghKGZiaS0+bGNjcjAgJiBMQ0NSMF9MQ0RUKSkgewotCQlpZiAodmFyLT54cmVzIDwgMTYgfHwgdmFyLT54cmVzID4gMTAyNCkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgeHJlcyAlZFxuIiwKLQkJCQlmYmktPmZiLmZpeC5pZCwgdmFyLT54cmVzKTsKLQkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQljYXNlIDQ6Ci0JCWNhc2UgODoKLQkJY2FzZSAxNjoKLQkJY2FzZSAyNDoKLQkJY2FzZSAzMjoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBiaXQgZGVwdGggJWRcbiIsCi0JCQkgICAgICAgZmJpLT5mYi5maXguaWQsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFyLT5oc3luY19sZW4gPCAxIHx8IHZhci0+aHN5bmNfbGVuID4gNjQpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIGhzeW5jX2xlbiAlZFxuIiwKLQkJCQlmYmktPmZiLmZpeC5pZCwgdmFyLT5oc3luY19sZW4pOwotCQlpZiAodmFyLT5sZWZ0X21hcmdpbiA8IDEgfHwgdmFyLT5sZWZ0X21hcmdpbiA+IDI1NSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgbGVmdF9tYXJnaW4gJWRcbiIsCi0JCQkJZmJpLT5mYi5maXguaWQsIHZhci0+bGVmdF9tYXJnaW4pOwotCQlpZiAodmFyLT5yaWdodF9tYXJnaW4gPCAxIHx8IHZhci0+cmlnaHRfbWFyZ2luID4gMjU1KQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCByaWdodF9tYXJnaW4gJWRcbiIsCi0JCQkJZmJpLT5mYi5maXguaWQsIHZhci0+cmlnaHRfbWFyZ2luKTsKLQkJaWYgKHZhci0+eXJlcyA8IDEgfHwgdmFyLT55cmVzID4gMTAyNCkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgeXJlcyAlZFxuIiwKLQkJCQlmYmktPmZiLmZpeC5pZCwgdmFyLT55cmVzKTsKLQkJaWYgKHZhci0+dnN5bmNfbGVuIDwgMSB8fCB2YXItPnZzeW5jX2xlbiA+IDY0KQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCB2c3luY19sZW4gJWRcbiIsCi0JCQkJZmJpLT5mYi5maXguaWQsIHZhci0+dnN5bmNfbGVuKTsKLQkJaWYgKHZhci0+dXBwZXJfbWFyZ2luIDwgMCB8fCB2YXItPnVwcGVyX21hcmdpbiA+IDI1NSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgdXBwZXJfbWFyZ2luICVkXG4iLAotCQkJCWZiaS0+ZmIuZml4LmlkLCB2YXItPnVwcGVyX21hcmdpbik7Ci0JCWlmICh2YXItPmxvd2VyX21hcmdpbiA8IDAgfHwgdmFyLT5sb3dlcl9tYXJnaW4gPiAyNTUpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIGxvd2VyX21hcmdpbiAlZFxuIiwKLQkJCQlmYmktPmZiLmZpeC5pZCwgdmFyLT5sb3dlcl9tYXJnaW4pOwotCX0KLSNlbmRpZgogCS8qIFVwZGF0ZSBzaGFkb3cgY29weSBhdG9taWNhbGx5ICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCkBAIC05MjksMjMgKzEzMTcsMTMgQEAKICNlbmRpZgogCQlzZXR1cF9wYXJhbGxlbF90aW1pbmcoZmJpLCB2YXIpOwogCisJc2V0dXBfYmFzZV9mcmFtZShmYmksIDApOworCiAJZmJpLT5yZWdfbGNjcjAgPSBmYmktPmxjY3IwIHwKIAkJKExDQ1IwX0xETSB8IExDQ1IwX1NGTSB8IExDQ1IwX0lVTSB8IExDQ1IwX0VGTSB8CiAJCSBMQ0NSMF9RRE0gfCBMQ0NSMF9CTSAgfCBMQ0NSMF9PVU0pOwogCi0JZmJpLT5yZWdfbGNjcjMgfD0gcHhhZmJfYnBwX3RvX2xjY3IzKHZhcik7Ci0KLQluYnl0ZXMgPSB2YXItPnlyZXMgKiBmYmktPmZiLmZpeC5saW5lX2xlbmd0aDsKLQotCWlmICgoZmJpLT5sY2NyMCAmIExDQ1IwX1NEUykgPT0gTENDUjBfRHVhbCkgewotCQluYnl0ZXMgPSBuYnl0ZXMgLyAyOwotCQlzZXR1cF9mcmFtZV9kbWEoZmJpLCBETUFfTE9XRVIsIFBBTF9OT05FLCBuYnl0ZXMsIG5ieXRlcyk7Ci0JfQotCi0JaWYgKCh2YXItPmJpdHNfcGVyX3BpeGVsID49IDE2KSB8fCAoZmJpLT5sY2NyMCAmIExDQ1IwX0xDRFQpKQotCQlzZXR1cF9mcmFtZV9kbWEoZmJpLCBETUFfQkFTRSwgUEFMX05PTkUsIDAsIG5ieXRlcyk7Ci0JZWxzZQotCQlzZXR1cF9mcmFtZV9kbWEoZmJpLCBETUFfQkFTRSwgUEFMX0JBU0UsIDAsIG5ieXRlcyk7CisJZmJpLT5yZWdfbGNjcjMgfD0gcHhhZmJfdmFyX3RvX2xjY3IzKHZhcik7CiAKIAlmYmktPnJlZ19sY2NyNCA9IGxjZF9yZWFkbChmYmksIExDQ1I0KSAmIH5MQ0NSNF9QQUxfRk9SX01BU0s7CiAJZmJpLT5yZWdfbGNjcjQgfD0gKGZiaS0+bGNjcjQgJiBMQ0NSNF9QQUxfRk9SX01BU0spOwpAQCAtOTU5LDYgKzEzMzcsNyBAQAogCSAgICAobGNkX3JlYWRsKGZiaSwgTENDUjEpICE9IGZiaS0+cmVnX2xjY3IxKSB8fAogCSAgICAobGNkX3JlYWRsKGZiaSwgTENDUjIpICE9IGZiaS0+cmVnX2xjY3IyKSB8fAogCSAgICAobGNkX3JlYWRsKGZiaSwgTENDUjMpICE9IGZiaS0+cmVnX2xjY3IzKSB8fAorCSAgICAobGNkX3JlYWRsKGZiaSwgTENDUjQpICE9IGZiaS0+cmVnX2xjY3I0KSB8fAogCSAgICAobGNkX3JlYWRsKGZiaSwgRkRBRFIwKSAhPSBmYmktPmZkYWRyWzBdKSB8fAogCSAgICAobGNkX3JlYWRsKGZiaSwgRkRBRFIxKSAhPSBmYmktPmZkYWRyWzFdKSkKIAkJcHhhZmJfc2NoZWR1bGVfd29yayhmYmksIENfUkVFTkFCTEUpOwpAQCAtOTc2LDY3ICsxMzU1LDE2IEBACiB7CiAJcHJfZGVidWcoInB4YWZiOiBiYWNrbGlnaHQgbyVzXG4iLCBvbiA/ICJuIiA6ICJmZiIpOwogCi0JaWYgKHB4YWZiX2JhY2tsaWdodF9wb3dlcikKLQkJcHhhZmJfYmFja2xpZ2h0X3Bvd2VyKG9uKTsKKwlpZiAoZmJpLT5iYWNrbGlnaHRfcG93ZXIpCisJCWZiaS0+YmFja2xpZ2h0X3Bvd2VyKG9uKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fcHhhZmJfbGNkX3Bvd2VyKHN0cnVjdCBweGFmYl9pbmZvICpmYmksIGludCBvbikKIHsKIAlwcl9kZWJ1ZygicHhhZmI6IExDRCBwb3dlciBvJXNcbiIsIG9uID8gIm4iIDogImZmIik7CiAKLQlpZiAocHhhZmJfbGNkX3Bvd2VyKQotCQlweGFmYl9sY2RfcG93ZXIob24sICZmYmktPmZiLnZhcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YWZiX3NldHVwX2dwaW8oc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKLXsKLQlpbnQgZ3BpbywgbGRkX2JpdHM7Ci0JdW5zaWduZWQgaW50IGxjY3IwID0gZmJpLT5sY2NyMDsKLQotCS8qCi0JICogc2V0dXAgaXMgYmFzZWQgb24gdHlwZSBvZiBwYW5lbCBzdXBwb3J0ZWQKLQkgKi8KLQotCS8qIDQgYml0IGludGVyZmFjZSAqLwotCWlmICgobGNjcjAgJiBMQ0NSMF9DTVMpID09IExDQ1IwX01vbm8gJiYKLQkgICAgKGxjY3IwICYgTENDUjBfU0RTKSA9PSBMQ0NSMF9TbmdsICYmCi0JICAgIChsY2NyMCAmIExDQ1IwX0RQRCkgPT0gTENDUjBfNFBpeE1vbm8pCi0JCWxkZF9iaXRzID0gNDsKLQotCS8qIDggYml0IGludGVyZmFjZSAqLwotCWVsc2UgaWYgKCgobGNjcjAgJiBMQ0NSMF9DTVMpID09IExDQ1IwX01vbm8gJiYKLQkJICAoKGxjY3IwICYgTENDUjBfU0RTKSA9PSBMQ0NSMF9EdWFsIHx8Ci0JCSAgIChsY2NyMCAmIExDQ1IwX0RQRCkgPT0gTENDUjBfOFBpeE1vbm8pKSB8fAotCQkgKChsY2NyMCAmIExDQ1IwX0NNUykgPT0gTENDUjBfQ29sb3IgJiYKLQkJICAobGNjcjAgJiBMQ0NSMF9QQVMpID09IExDQ1IwX1BhcyAmJgotCQkgIChsY2NyMCAmIExDQ1IwX1NEUykgPT0gTENDUjBfU25nbCkpCi0JCWxkZF9iaXRzID0gODsKLQotCS8qIDE2IGJpdCBpbnRlcmZhY2UgKi8KLQllbHNlIGlmICgobGNjcjAgJiBMQ0NSMF9DTVMpID09IExDQ1IwX0NvbG9yICYmCi0JCSAoKGxjY3IwICYgTENDUjBfU0RTKSA9PSBMQ0NSMF9EdWFsIHx8Ci0JCSAgKGxjY3IwICYgTENDUjBfUEFTKSA9PSBMQ0NSMF9BY3QpKQotCQlsZGRfYml0cyA9IDE2OwotCi0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHhhZmJfc2V0dXBfZ3BpbzogdW5hYmxlIHRvIGRldGVybWluZSAiCi0JCQkgICAgICAgImJpdHMgcGVyIHBpeGVsXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoZ3BpbyA9IDU4OyBsZGRfYml0czsgZ3BpbysrLCBsZGRfYml0cy0tKQotCQlweGFfZ3Bpb19tb2RlKGdwaW8gfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0JLyogMTggYml0IGludGVyZmFjZSAqLwotCWlmIChmYmktPmZiLnZhci5iaXRzX3Blcl9waXhlbCA+IDE2KSB7Ci0JCXB4YV9ncGlvX21vZGUoODYgfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0JCXB4YV9ncGlvX21vZGUoODcgfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0JfQotCXB4YV9ncGlvX21vZGUoR1BJTzc0X0xDRF9GQ0xLX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU83NV9MQ0RfTENMS19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNzZfTENEX1BDTEtfTUQpOwotCi0JaWYgKChsY2NyMCAmIExDQ1IwX1BBUykgPT0gMCkKLQkJcHhhX2dwaW9fbW9kZShHUElPNzdfTENEX0FDQklBU19NRCk7CisJaWYgKGZiaS0+bGNkX3Bvd2VyKQorCQlmYmktPmxjZF9wb3dlcihvbiwgJmZiaS0+ZmIudmFyKTsKIH0KIAogc3RhdGljIHZvaWQgcHhhZmJfZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKQEAgLTEwNTYsNiArMTM4NCw3IEBACiAJCXJldHVybjsKIAogCS8qIFNlcXVlbmNlIGZyb20gMTEuNy4xMCAqLworCWxjZF93cml0ZWwoZmJpLCBMQ0NSNCwgZmJpLT5yZWdfbGNjcjQpOwogCWxjZF93cml0ZWwoZmJpLCBMQ0NSMywgZmJpLT5yZWdfbGNjcjMpOwogCWxjZF93cml0ZWwoZmJpLCBMQ0NSMiwgZmJpLT5yZWdfbGNjcjIpOwogCWxjZF93cml0ZWwoZmJpLCBMQ0NSMSwgZmJpLT5yZWdfbGNjcjEpOwpAQCAtMTA5Nyw4ICsxNDI2LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBweGFmYl9oYW5kbGVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpID0gZGV2X2lkOwotCXVuc2lnbmVkIGludCBsY2NyMCwgbGNzciA9IGxjZF9yZWFkbChmYmksIExDU1IpOworCXVuc2lnbmVkIGludCBsY2NyMCwgbGNzciwgbGNzcjE7CiAKKwlsY3NyID0gbGNkX3JlYWRsKGZiaSwgTENTUik7CiAJaWYgKGxjc3IgJiBMQ1NSX0xERCkgewogCQlsY2NyMCA9IGxjZF9yZWFkbChmYmksIExDQ1IwKTsKIAkJbGNkX3dyaXRlbChmYmksIExDQ1IwLCBsY2NyMCB8IExDQ1IwX0xETSk7CkBAIC0xMTA5LDggKzE0MzksMTggQEAKIAlpZiAobGNzciAmIExDU1JfQ01EX0lOVCkKIAkJY29tcGxldGUoJmZiaS0+Y29tbWFuZF9kb25lKTsKICNlbmRpZgotCiAJbGNkX3dyaXRlbChmYmksIExDU1IsIGxjc3IpOworCisjaWZkZWYgQ09ORklHX0ZCX1BYQV9PVkVSTEFZCisJbGNzcjEgPSBsY2RfcmVhZGwoZmJpLCBMQ1NSMSk7CisJaWYgKGxjc3IxICYgTENTUjFfQlMoMSkpCisJCWNvbXBsZXRlKCZmYmktPm92ZXJsYXlbMF0uYnJhbmNoX2RvbmUpOworCisJaWYgKGxjc3IxICYgTENTUjFfQlMoMikpCisJCWNvbXBsZXRlKCZmYmktPm92ZXJsYXlbMV0uYnJhbmNoX2RvbmUpOworCisJbGNkX3dyaXRlbChmYmksIExDU1IxLCBsY3NyMSk7CisjZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTExODEsNyArMTUyMSw2IEBACiAJCWlmIChvbGRfc3RhdGUgPT0gQ19FTkFCTEUpIHsKIAkJCV9fcHhhZmJfbGNkX3Bvd2VyKGZiaSwgMCk7CiAJCQlweGFmYl9kaXNhYmxlX2NvbnRyb2xsZXIoZmJpKTsKLQkJCXB4YWZiX3NldHVwX2dwaW8oZmJpKTsKIAkJCXB4YWZiX2VuYWJsZV9jb250cm9sbGVyKGZiaSk7CiAJCQlfX3B4YWZiX2xjZF9wb3dlcihmYmksIDEpOwogCQl9CkBAIC0xMjA0LDcgKzE1NDMsNiBAQAogCQkgKi8KIAkJaWYgKG9sZF9zdGF0ZSAhPSBDX0VOQUJMRSkgewogCQkJZmJpLT5zdGF0ZSA9IENfRU5BQkxFOwotCQkJcHhhZmJfc2V0dXBfZ3BpbyhmYmkpOwogCQkJcHhhZmJfZW5hYmxlX2NvbnRyb2xsZXIoZmJpKTsKIAkJCV9fcHhhZmJfbGNkX3Bvd2VyKGZiaSwgMSk7CiAJCQlfX3B4YWZiX2JhY2tsaWdodF9wb3dlcihmYmksIDEpOwpAQCAtMTMwMyw3NyArMTY0MSwzNCBAQAogI2RlZmluZSBweGFmYl9yZXN1bWUJTlVMTAogI2VuZGlmCiAKLS8qCi0gKiBweGFmYl9tYXBfdmlkZW9fbWVtb3J5KCk6Ci0gKiAgICAgIEFsbG9jYXRlcyB0aGUgRFJBTSBtZW1vcnkgZm9yIHRoZSBmcmFtZSBidWZmZXIuICBUaGlzIGJ1ZmZlciBpcwotICoJcmVtYXBwZWQgaW50byBhIG5vbi1jYWNoZWQsIG5vbi1idWZmZXJlZCwgbWVtb3J5IHJlZ2lvbiB0bwotICogICAgICBhbGxvdyBwYWxldHRlIGFuZCBwaXhlbCB3cml0ZXMgdG8gb2NjdXIgd2l0aG91dCBmbHVzaGluZyB0aGUKLSAqICAgICAgY2FjaGUuICBPbmNlIHRoaXMgYXJlYSBpcyByZW1hcHBlZCwgYWxsIHZpcnR1YWwgbWVtb3J5Ci0gKiAgICAgIGFjY2VzcyB0byB0aGUgdmlkZW8gbWVtb3J5IHNob3VsZCBvY2N1ciBhdCB0aGUgbmV3IHJlZ2lvbi4KLSAqLwotc3RhdGljIGludCBfX2RldmluaXQgcHhhZmJfbWFwX3ZpZGVvX21lbW9yeShzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKQorc3RhdGljIGludCBfX2RldmluaXQgcHhhZmJfaW5pdF92aWRlb19tZW1vcnkoc3RydWN0IHB4YWZiX2luZm8gKmZiaSkKIHsKLQkvKgotCSAqIFdlIHJlc2VydmUgb25lIHBhZ2UgZm9yIHRoZSBwYWxldHRlLCBwbHVzIHRoZSBzaXplCi0JICogb2YgdGhlIGZyYW1lYnVmZmVyLgotCSAqLwotCWZiaS0+dmlkZW9fb2Zmc2V0ID0gUEFHRV9BTElHTihzaXplb2Yoc3RydWN0IHB4YWZiX2RtYV9idWZmKSk7Ci0JZmJpLT5tYXBfc2l6ZSA9IFBBR0VfQUxJR04oZmJpLT5mYi5maXguc21lbV9sZW4gKyBmYmktPnZpZGVvX29mZnNldCk7Ci0JZmJpLT5tYXBfY3B1ID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShmYmktPmRldiwgZmJpLT5tYXBfc2l6ZSwKLQkJCQkJICAgICAgJmZiaS0+bWFwX2RtYSwgR0ZQX0tFUk5FTCk7CisJaW50IHNpemUgPSBQQUdFX0FMSUdOKGZiaS0+dmlkZW9fbWVtX3NpemUpOwogCi0JaWYgKGZiaS0+bWFwX2NwdSkgewotCQkvKiBwcmV2ZW50IGluaXRpYWwgZ2FyYmFnZSBvbiBzY3JlZW4gKi8KLQkJbWVtc2V0KGZiaS0+bWFwX2NwdSwgMCwgZmJpLT5tYXBfc2l6ZSk7Ci0JCWZiaS0+ZmIuc2NyZWVuX2Jhc2UgPSBmYmktPm1hcF9jcHUgKyBmYmktPnZpZGVvX29mZnNldDsKLQkJZmJpLT5zY3JlZW5fZG1hID0gZmJpLT5tYXBfZG1hICsgZmJpLT52aWRlb19vZmZzZXQ7CisJZmJpLT52aWRlb19tZW0gPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJaWYgKGZiaS0+dmlkZW9fbWVtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCS8qCi0JCSAqIEZJWE1FOiB0aGlzIGlzIGFjdHVhbGx5IHRoZSB3cm9uZyB0aGluZyB0byBwbGFjZSBpbgotCQkgKiBzbWVtX3N0YXJ0LiAgQnV0IGZiZGV2IHN1ZmZlcnMgZnJvbSB0aGUgcHJvYmxlbSB0aGF0Ci0JCSAqIGl0IG5lZWRzIGFuIEFQSSB3aGljaCBkb2Vzbid0IGV4aXN0IChpbiB0aGlzIGNhc2UsCi0JCSAqIGRtYV93cml0ZWNvbWJpbmVfbW1hcCkKLQkJICovCi0JCWZiaS0+ZmIuZml4LnNtZW1fc3RhcnQgPSBmYmktPnNjcmVlbl9kbWE7Ci0JCWZiaS0+cGFsZXR0ZV9zaXplID0gZmJpLT5mYi52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCA/IDI1NiA6IDE2OworCWZiaS0+dmlkZW9fbWVtX3BoeXMgPSB2aXJ0X3RvX3BoeXMoZmJpLT52aWRlb19tZW0pOworCWZiaS0+dmlkZW9fbWVtX3NpemUgPSBzaXplOwogCi0JCWZiaS0+ZG1hX2J1ZmYgPSAodm9pZCAqKSBmYmktPm1hcF9jcHU7Ci0JCWZiaS0+ZG1hX2J1ZmZfcGh5cyA9IGZiaS0+bWFwX2RtYTsKLQkJZmJpLT5wYWxldHRlX2NwdSA9ICh1MTYgKikgZmJpLT5kbWFfYnVmZi0+cGFsZXR0ZTsKKwlmYmktPmZiLmZpeC5zbWVtX3N0YXJ0CT0gZmJpLT52aWRlb19tZW1fcGh5czsKKwlmYmktPmZiLmZpeC5zbWVtX2xlbgk9IGZiaS0+dmlkZW9fbWVtX3NpemU7CisJZmJpLT5mYi5zY3JlZW5fYmFzZQk9IGZiaS0+dmlkZW9fbWVtOwogCi0JICAgICAgICBwcl9kZWJ1ZygicHhhZmI6IHBhbGV0dGVfbWVtX3NpemUgPSAweCUwOHhcbiIsIGZiaS0+cGFsZXR0ZV9zaXplKnNpemVvZih1MTYpKTsKLQotI2lmZGVmIENPTkZJR19GQl9QWEFfU01BUlRQQU5FTAotCQlmYmktPnNtYXJ0X2NtZHMgPSAodWludDE2X3QgKikgZmJpLT5kbWFfYnVmZi0+Y21kX2J1ZmY7Ci0JCWZiaS0+bl9zbWFydF9jbWRzID0gMDsKLSNlbmRpZgotCX0KLQotCXJldHVybiBmYmktPm1hcF9jcHUgPyAwIDogLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgcHhhZmJfZGVjb2RlX21vZGVfaW5mbyhzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpLAotCQkJCSAgIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gKm1vZGVzLAotCQkJCSAgIHVuc2lnbmVkIGludCBudW1fbW9kZXMpCi17Ci0JdW5zaWduZWQgaW50IGksIHNtZW1sZW47Ci0KLQlweGFmYl9zZXRtb2RlKCZmYmktPmZiLnZhciwgJm1vZGVzWzBdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fbW9kZXM7IGkrKykgewotCQlzbWVtbGVuID0gbW9kZXNbaV0ueHJlcyAqIG1vZGVzW2ldLnlyZXMgKiBtb2Rlc1tpXS5icHAgLyA4OwotCQlpZiAoc21lbWxlbiA+IGZiaS0+ZmIuZml4LnNtZW1fbGVuKQotCQkJZmJpLT5mYi5maXguc21lbV9sZW4gPSBzbWVtbGVuOwotCX0KKwlyZXR1cm4gZmJpLT52aWRlb19tZW0gPyAwIDogLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgcHhhZmJfZGVjb2RlX21hY2hfaW5mbyhzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpLAogCQkJCSAgIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gKmluZikKIHsKIAl1bnNpZ25lZCBpbnQgbGNkX2Nvbm4gPSBpbmYtPmxjZF9jb25uOworCXN0cnVjdCBweGFmYl9tb2RlX2luZm8gKm07CisJaW50IGk7CiAKIAlmYmktPmNtYXBfaW52ZXJzZQk9IGluZi0+Y21hcF9pbnZlcnNlOwogCWZiaS0+Y21hcF9zdGF0aWMJPSBpbmYtPmNtYXBfc3RhdGljOworCWZiaS0+bGNjcjQgCQk9IGluZi0+bGNjcjQ7CiAKIAlzd2l0Y2ggKGxjZF9jb25uICYgTENEX1RZUEVfTUFTSykgewogCWNhc2UgTENEX1RZUEVfTU9OT19TVE46CkBAIC0xMzk4LDcgKzE2OTMsNiBAQAogCQkvKiBmYWxsIGJhY2sgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXkgKi8KIAkJZmJpLT5sY2NyMCA9IGluZi0+bGNjcjA7CiAJCWZiaS0+bGNjcjMgPSBpbmYtPmxjY3IzOwotCQlmYmktPmxjY3I0ID0gaW5mLT5sY2NyNDsKIAkJZ290byBkZWNvZGVfbW9kZTsKIAl9CiAKQEAgLTE0MTIsNyArMTcwNiwyMiBAQAogCWZiaS0+bGNjcjMgfD0gKGxjZF9jb25uICYgTENEX1BDTEtfRURHRV9GQUxMKSAgPyBMQ0NSM19QQ1AgOiAwOwogCiBkZWNvZGVfbW9kZToKLQlweGFmYl9kZWNvZGVfbW9kZV9pbmZvKGZiaSwgaW5mLT5tb2RlcywgaW5mLT5udW1fbW9kZXMpOworCXB4YWZiX3NldG1vZGUoJmZiaS0+ZmIudmFyLCAmaW5mLT5tb2Rlc1swXSk7CisKKwkvKiBkZWNpZGUgdmlkZW8gbWVtb3J5IHNpemUgYXMgZm9sbG93czoKKwkgKiAxLiBkZWZhdWx0IHRvIG1vZGUgb2YgbWF4aW11bSByZXNvbHV0aW9uCisJICogMi4gYWxsb3cgcGxhdGZvcm0gdG8gb3ZlcnJpZGUKKwkgKiAzLiBhbGxvdyBtb2R1bGUgcGFyYW1ldGVyIHRvIG92ZXJyaWRlCisJICovCisJZm9yIChpID0gMCwgbSA9ICZpbmYtPm1vZGVzWzBdOyBpIDwgaW5mLT5udW1fbW9kZXM7IGkrKywgbSsrKQorCQlmYmktPnZpZGVvX21lbV9zaXplID0gbWF4X3Qoc2l6ZV90LCBmYmktPnZpZGVvX21lbV9zaXplLAorCQkJCW0tPnhyZXMgKiBtLT55cmVzICogbS0+YnBwIC8gOCk7CisKKwlpZiAoaW5mLT52aWRlb19tZW1fc2l6ZSA+IGZiaS0+dmlkZW9fbWVtX3NpemUpCisJCWZiaS0+dmlkZW9fbWVtX3NpemUgPSBpbmYtPnZpZGVvX21lbV9zaXplOworCisJaWYgKHZpZGVvX21lbV9zaXplID4gZmJpLT52aWRlb19tZW1fc2l6ZSkKKwkJZmJpLT52aWRlb19tZW1fc2l6ZSA9IHZpZGVvX21lbV9zaXplOwogfQogCiBzdGF0aWMgc3RydWN0IHB4YWZiX2luZm8gKiBfX2RldmluaXQgcHhhZmJfaW5pdF9mYmluZm8oc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTQyOSw3ICsxNzM4LDcgQEAKIAltZW1zZXQoZmJpLCAwLCBzaXplb2Yoc3RydWN0IHB4YWZiX2luZm8pKTsKIAlmYmktPmRldiA9IGRldjsKIAotCWZiaS0+Y2xrID0gY2xrX2dldChkZXYsICJMQ0RDTEsiKTsKKwlmYmktPmNsayA9IGNsa19nZXQoZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGZiaS0+Y2xrKSkgewogCQlrZnJlZShmYmkpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE0NDAsNyArMTc0OSw3IEBACiAJZmJpLT5mYi5maXgudHlwZQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKIAlmYmktPmZiLmZpeC50eXBlX2F1eAk9IDA7CiAJZmJpLT5mYi5maXgueHBhbnN0ZXAJPSAwOwotCWZiaS0+ZmIuZml4LnlwYW5zdGVwCT0gMDsKKwlmYmktPmZiLmZpeC55cGFuc3RlcAk9IDE7CiAJZmJpLT5mYi5maXgueXdyYXBzdGVwCT0gMDsKIAlmYmktPmZiLmZpeC5hY2NlbAk9IEZCX0FDQ0VMX05PTkU7CiAKQEAgLTE0NDgsNyArMTc1Nyw3IEBACiAJZmJpLT5mYi52YXIuYWN0aXZhdGUJPSBGQl9BQ1RJVkFURV9OT1c7CiAJZmJpLT5mYi52YXIuaGVpZ2h0CT0gLTE7CiAJZmJpLT5mYi52YXIud2lkdGgJPSAtMTsKLQlmYmktPmZiLnZhci5hY2NlbF9mbGFncwk9IDA7CisJZmJpLT5mYi52YXIuYWNjZWxfZmxhZ3MJPSBGQl9BQ0NFTEZfVEVYVDsKIAlmYmktPmZiLnZhci52bW9kZQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CiAKIAlmYmktPmZiLmZib3BzCQk9ICZweGFmYl9vcHM7CkBAIC0xNDY4LDEwICsxNzc3LDYgQEAKIAlJTklUX1dPUksoJmZiaS0+dGFzaywgcHhhZmJfdGFzayk7CiAJbXV0ZXhfaW5pdCgmZmJpLT5jdHJscl9sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJmZiaS0+ZGlzYWJsZV9kb25lKTsKLSNpZmRlZiBDT05GSUdfRkJfUFhBX1NNQVJUUEFORUwKLQlpbml0X2NvbXBsZXRpb24oJmZiaS0+Y29tbWFuZF9kb25lKTsKLQlpbml0X2NvbXBsZXRpb24oJmZiaS0+cmVmcmVzaF9kb25lKTsKLSNlbmRpZgogCiAJcmV0dXJuIGZiaTsKIH0KQEAgLTE1NDQsNyArMTg0OSw5IEBACiAKIAlzWzBdID0gJ1wwJzsKIAotCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vZGU6IiwgNSkpIHsKKwlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2bWVtOiIsIDUpKSB7CisJCXZpZGVvX21lbV9zaXplID0gbWVtcGFyc2UodGhpc19vcHQgKyA1LCBOVUxMKTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibW9kZToiLCA1KSkgewogCQlyZXR1cm4gcGFyc2Vfb3B0X21vZGUoZGV2LCB0aGlzX29wdCk7CiAJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInBpeGNsb2NrOiIsIDkpKSB7CiAJCW1vZGUtPnBpeGNsb2NrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrOSwgTlVMTCwgMCk7CkBAIC0xNzQ4LDggKzIwNTUsNyBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGZhaWxlZDsKIAl9Ci0JcHhhZmJfYmFja2xpZ2h0X3Bvd2VyID0gaW5mLT5weGFmYl9iYWNrbGlnaHRfcG93ZXI7Ci0JcHhhZmJfbGNkX3Bvd2VyID0gaW5mLT5weGFmYl9sY2RfcG93ZXI7CisKIAlmYmkgPSBweGFmYl9pbml0X2ZiaW5mbygmZGV2LT5kZXYpOwogCWlmICghZmJpKSB7CiAJCS8qIG9ubHkgcmVhc29uIGZvciBweGFmYl9pbml0X2ZiaW5mbyB0byBmYWlsIGlzIGttYWxsb2MgKi8KQEAgLTE3NTgsNiArMjA2NCw5IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAorCWZiaS0+YmFja2xpZ2h0X3Bvd2VyID0gaW5mLT5weGFmYl9iYWNrbGlnaHRfcG93ZXI7CisJZmJpLT5sY2RfcG93ZXIgPSBpbmYtPnB4YWZiX2xjZF9wb3dlcjsKKwogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHIgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CkBAIC0xNzc5LDEyICsyMDg4LDIwIEBACiAJCWdvdG8gZmFpbGVkX2ZyZWVfcmVzOwogCX0KIAotCS8qIEluaXRpYWxpemUgdmlkZW8gbWVtb3J5ICovCi0JcmV0ID0gcHhhZmJfbWFwX3ZpZGVvX21lbW9yeShmYmkpOworCWZiaS0+ZG1hX2J1ZmZfc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZW9mKHN0cnVjdCBweGFmYl9kbWFfYnVmZikpOworCWZiaS0+ZG1hX2J1ZmYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZmJpLT5kZXYsIGZiaS0+ZG1hX2J1ZmZfc2l6ZSwKKwkJCQkmZmJpLT5kbWFfYnVmZl9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmJpLT5kbWFfYnVmZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRE1BXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfZnJlZV9pbzsKKwl9CisKKwlyZXQgPSBweGFmYl9pbml0X3ZpZGVvX21lbW9yeShmYmkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdmlkZW8gUkFNOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWRfZnJlZV9pbzsKKwkJZ290byBmYWlsZWRfZnJlZV9kbWE7CiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOwpAQCAtMTgwMSwxMyArMjExOCwxMiBAQAogCQlnb3RvIGZhaWxlZF9mcmVlX21lbTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfRkJfUFhBX1NNQVJUUEFORUwKIAlyZXQgPSBweGFmYl9zbWFydF9pbml0KGZiaSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHNtYXJ0cGFuZWxcbiIpOwogCQlnb3RvIGZhaWxlZF9mcmVlX2lycTsKIAl9Ci0jZW5kaWYKKwogCS8qCiAJICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb3VyIGNvbG91ciBiaXRmaWVsZAogCSAqIGRlc2NyaXB0b3JzIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGlzZWQuCkBAIC0xODMzLDYgKzIxNDksOCBAQAogCQlnb3RvIGZhaWxlZF9mcmVlX2NtYXA7CiAJfQogCisJcHhhZmJfb3ZlcmxheV9pbml0KGZiaSk7CisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAlmYmktPmZyZXFfdHJhbnNpdGlvbi5ub3RpZmllcl9jYWxsID0gcHhhZmJfZnJlcV90cmFuc2l0aW9uOwogCWZiaS0+ZnJlcV9wb2xpY3kubm90aWZpZXJfY2FsbCA9IHB4YWZiX2ZyZXFfcG9saWN5OwpAQCAtMTg1NSw4ICsyMTczLDEwIEBACiBmYWlsZWRfZnJlZV9pcnE6CiAJZnJlZV9pcnEoaXJxLCBmYmkpOwogZmFpbGVkX2ZyZWVfbWVtOgotCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmZGV2LT5kZXYsIGZiaS0+bWFwX3NpemUsCi0JCQlmYmktPm1hcF9jcHUsIGZiaS0+bWFwX2RtYSk7CisJZnJlZV9wYWdlc19leGFjdChmYmktPnZpZGVvX21lbSwgZmJpLT52aWRlb19tZW1fc2l6ZSk7CitmYWlsZWRfZnJlZV9kbWE6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+ZGV2LCBmYmktPmRtYV9idWZmX3NpemUsCisJCQlmYmktPmRtYV9idWZmLCBmYmktPmRtYV9idWZmX3BoeXMpOwogZmFpbGVkX2ZyZWVfaW86CiAJaW91bm1hcChmYmktPm1taW9fYmFzZSk7CiBmYWlsZWRfZnJlZV9yZXM6CkBAIC0xODgxLDYgKzIyMDEsNyBAQAogCiAJaW5mbyA9ICZmYmktPmZiOwogCisJcHhhZmJfb3ZlcmxheV9leGl0KGZiaSk7CiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAogCXB4YWZiX2Rpc2FibGVfY29udHJvbGxlcihmYmkpOwpAQCAtMTg5MSw4ICsyMjEyLDEwIEBACiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOwogCWZyZWVfaXJxKGlycSwgZmJpKTsKIAotCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmZGV2LT5kZXYsIGZiaS0+bWFwX3NpemUsCi0JCQkJCWZiaS0+bWFwX2NwdSwgZmJpLT5tYXBfZG1hKTsKKwlmcmVlX3BhZ2VzX2V4YWN0KGZiaS0+dmlkZW9fbWVtLCBmYmktPnZpZGVvX21lbV9zaXplKTsKKworCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmZGV2LT5kZXYsIGZiaS0+ZG1hX2J1ZmZfc2l6ZSwKKwkJCWZiaS0+ZG1hX2J1ZmYsIGZiaS0+ZG1hX2J1ZmZfcGh5cyk7CiAKIAlpb3VubWFwKGZiaS0+bW1pb19iYXNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5oIGIvZHJpdmVycy92aWRlby9weGFmYi5oCmluZGV4IDMxNTQxYjguLjIzNTM1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmgKQEAgLTU0LDExICs1NCw1NSBAQAogI2RlZmluZSBQQUxFVFRFX1NJWkUJKDI1NiAqIDQpCiAjZGVmaW5lIENNRF9CVUZGX1NJWkUJKDEwMjQgKiA1MCkKIAorLyogTk9URTogdGhlIHBhbGV0dGUgYW5kIGZyYW1lIGRtYSBkZXNjcmlwdG9ycyBhcmUgZG91YmxlZCB0byBhbGxvdworICogdGhlIDJuZCBzZXQgZm9yIGJyYW5jaCBzZXR0aW5ncyAoRkJSeCkKKyAqLwogc3RydWN0IHB4YWZiX2RtYV9idWZmIHsKIAl1bnNpZ25lZCBjaGFyIHBhbGV0dGVbUEFMX01BWCAqIFBBTEVUVEVfU0laRV07CiAJdWludDE2X3QgY21kX2J1ZmZbQ01EX0JVRkZfU0laRV07Ci0Jc3RydWN0IHB4YWZiX2RtYV9kZXNjcmlwdG9yIHBhbF9kZXNjW1BBTF9NQVhdOwotCXN0cnVjdCBweGFmYl9kbWFfZGVzY3JpcHRvciBkbWFfZGVzY1tETUFfTUFYXTsKKwlzdHJ1Y3QgcHhhZmJfZG1hX2Rlc2NyaXB0b3IgcGFsX2Rlc2NbUEFMX01BWCAqIDJdOworCXN0cnVjdCBweGFmYl9kbWFfZGVzY3JpcHRvciBkbWFfZGVzY1tETUFfTUFYICogMl07Cit9OworCitlbnVtIHsKKwlPVkVSTEFZMSwKKwlPVkVSTEFZMiwKK307CisKK2VudW0geworCU9WRVJMQVlfRk9STUFUX1JHQiA9IDAsCisJT1ZFUkxBWV9GT1JNQVRfWVVWNDQ0X1BBQ0tFRCwKKwlPVkVSTEFZX0ZPUk1BVF9ZVVY0NDRfUExBTkFSLAorCU9WRVJMQVlfRk9STUFUX1lVVjQyMl9QTEFOQVIsCisJT1ZFUkxBWV9GT1JNQVRfWVVWNDIwX1BMQU5BUiwKK307CisKKyNkZWZpbmUgTk9OU1REX1RPX1hQT1MoeCkJKCgoeCkgPj4gMCkgICYgMHgzZmYpCisjZGVmaW5lIE5PTlNURF9UT19ZUE9TKHgpCSgoKHgpID4+IDEwKSAmIDB4M2ZmKQorI2RlZmluZSBOT05TVERfVE9fUEZPUih4KQkoKCh4KSA+PiAyMCkgJiAweDcpCisKK3N0cnVjdCBweGFmYl9sYXllcjsKKworc3RydWN0IHB4YWZiX2xheWVyX29wcyB7CisJdm9pZCAoKmVuYWJsZSkoc3RydWN0IHB4YWZiX2xheWVyICopOworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgcHhhZmJfbGF5ZXIgKik7CisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgcHhhZmJfbGF5ZXIgKik7Cit9OworCitzdHJ1Y3QgcHhhZmJfbGF5ZXIgeworCXN0cnVjdCBmYl9pbmZvCQlmYjsKKwlpbnQJCQlpZDsKKwlhdG9taWNfdAkJdXNhZ2U7CisJdWludDMyX3QJCWNvbnRyb2xbMl07CisKKwlzdHJ1Y3QgcHhhZmJfbGF5ZXJfb3BzCSpvcHM7CisKKwl2b2lkIF9faW9tZW0JCSp2aWRlb19tZW07CisJdW5zaWduZWQgbG9uZwkJdmlkZW9fbWVtX3BoeXM7CisJc2l6ZV90CQkJdmlkZW9fbWVtX3NpemU7CisJc3RydWN0IGNvbXBsZXRpb24JYnJhbmNoX2RvbmU7CisKKwlzdHJ1Y3QgcHhhZmJfaW5mbwkqZmJpOwogfTsKIAogc3RydWN0IHB4YWZiX2luZm8gewpAQCAtNjksMjQgKzExMywxNSBAQAogCXZvaWQgX19pb21lbQkJKm1taW9fYmFzZTsKIAogCXN0cnVjdCBweGFmYl9kbWFfYnVmZgkqZG1hX2J1ZmY7CisJc2l6ZV90CQkJZG1hX2J1ZmZfc2l6ZTsKIAlkbWFfYWRkcl90CQlkbWFfYnVmZl9waHlzOwotCWRtYV9hZGRyX3QJCWZkYWRyW0RNQV9NQVhdOworCWRtYV9hZGRyX3QJCWZkYWRyW0RNQV9NQVggKiAyXTsKIAotCS8qCi0JICogVGhlc2UgYXJlIHRoZSBhZGRyZXNzZXMgd2UgbWFwcGVkCi0JICogdGhlIGZyYW1lYnVmZmVyIG1lbW9yeSByZWdpb24gdG8uCi0JICovCi0JLyogcmF3IG1lbW9yeSBhZGRyZXNzZXMgKi8KLQlkbWFfYWRkcl90CQltYXBfZG1hOwkvKiBwaHlzaWNhbCAqLwotCXVfY2hhciAqCQltYXBfY3B1OwkvKiB2aXJ0dWFsICovCi0JdV9pbnQJCQltYXBfc2l6ZTsKLQotCS8qIGFkZHJlc3NlcyBvZiBwaWVjZXMgcGxhY2VkIGluIHJhdyBidWZmZXIgKi8KLQl1X2NoYXIgKgkJc2NyZWVuX2NwdTsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGZyYW1lIGJ1ZmZlciAqLwotCWRtYV9hZGRyX3QJCXNjcmVlbl9kbWE7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZnJhbWUgYnVmZmVyICovCisJdm9pZCBfX2lvbWVtCQkqdmlkZW9fbWVtOwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgZnJhbWUgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZwkJdmlkZW9fbWVtX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZnJhbWUgYnVmZmVyICovCisJc2l6ZV90CQkJdmlkZW9fbWVtX3NpemU7CS8qIHNpemUgb2YgdGhlIGZyYW1lIGJ1ZmZlciAqLwogCXUxNiAqCQkJcGFsZXR0ZV9jcHU7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBwYWxldHRlIG1lbW9yeSAqLwogCXVfaW50CQkJcGFsZXR0ZV9zaXplOwotCXNzaXplX3QJCQl2aWRlb19vZmZzZXQ7CiAKIAl1X2ludAkJCWxjY3IwOwogCXVfaW50CQkJbGNjcjM7CkBAIC0xMjAsMTAgKzE1NSwxNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqc21hcnRfdGhyZWFkOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfRkJfUFhBX09WRVJMQVkKKwlzdHJ1Y3QgcHhhZmJfbGF5ZXIJb3ZlcmxheVsyXTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWZyZXFfdHJhbnNpdGlvbjsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJZnJlcV9wb2xpY3k7CiAjZW5kaWYKKworCXZvaWQgKCpsY2RfcG93ZXIpKGludCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICopOworCXZvaWQgKCpiYWNrbGlnaHRfcG93ZXIpKGludCk7CiB9OwogCiAjZGVmaW5lIFRPX0lORihwdHIsbWVtYmVyKSBjb250YWluZXJfb2YocHRyLHN0cnVjdCBweGFmYl9pbmZvLG1lbWJlcikKQEAgLTE0OCw0ICsxOTAsMTAgQEAKICNkZWZpbmUgTUlOX1hSRVMJNjQKICNkZWZpbmUgTUlOX1lSRVMJNjQKIAorLyogbWF4aW11bSBYIGFuZCBZIHJlc29sdXRpb25zIC0gbm90ZSB0aGVzZSBhcmUgbGltaXRzIGZyb20gdGhlIHJlZ2lzdGVyCisgKiBiaXRzIGxlbmd0aCBpbnN0ZWFkIG9mIHRoZSByZWFsIG9uZXMKKyAqLworI2RlZmluZSBNQVhfWFJFUwkxMDI0CisjZGVmaW5lIE1BWF9ZUkVTCTEwMjQKKwogI2VuZGlmIC8qIF9fUFhBRkJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMKaW5kZXggYzA1MmJkNC4uMDc2Zjk0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYTExMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgKgktIGNvbnZlcnQgZG1hIGFkZHJlc3MgdHlwZXMgdG8gZG1hX2FkZHJfdAogICoJLSByZW1vdmUgdW51c2VkICdtb250eXBlJyBzdHVmZgogICoJLSByZW1vdmUgcmVkdW5kYW50IHplcm8gaW5pdHMgb2YgaW5pdF92YXIgYWZ0ZXIgdGhlIGluaXRpYWwKLSAqCSAgbWVtemVyby4KKyAqCSAgbWVtc2V0LgogICoJLSByZW1vdmUgYWxsb3dfbW9kZXNldCAoYWNvcm5mYiBpZGVhIGRvZXMgbm90IGJlbG9uZyBoZXJlKQogICoKICAqIDIwMDEvMDUvMjg6IDxybWtAYXJtLmxpbnV4Lm9yZy51az4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpby5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvLmMKaW5kZXggNWI3OGZkMC4uMDE4YzA3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAJLyogQXNzaWduIGEgdW5pcXVlIGRldmljZSBpbmRleCBhbmQgaGVuY2UgbmFtZS4gKi8KIAlkZXYtPmluZGV4ID0gZGV2X2luZGV4Kys7Ci0Jc3ByaW50ZihkZXYtPmRldi5idXNfaWQsICJ2aXJ0aW8ldSIsIGRldi0+aW5kZXgpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJ2aXJ0aW8ldSIsIGRldi0+aW5kZXgpOwogCiAJLyogV2UgYWx3YXlzIHN0YXJ0IGJ5IHJlc2V0dGluZyB0aGUgZGV2aWNlLCBpbiBjYXNlIGEgcHJldmlvdXMKIAkgKiBkcml2ZXIgbWVzc2VkIGl0IHVwLiAgVGhpcyBhbHNvIHRlc3RzIHRoYXQgY29kZSBwYXRoIGEgbGl0dGxlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKaW5kZXggNjJlYWI0My4uNTkyNjgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCkBAIC01Niw2ICs1NiwxNSBAQAogCXsgMCB9LAogfTsKIAorc3RhdGljIHUzMiBwYWdlX3RvX2JhbGxvb25fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7CisKKwlCVUlMRF9CVUdfT04oUEFHRV9TSElGVCA8IFZJUlRJT19CQUxMT09OX1BGTl9TSElGVCk7CisJLyogQ29udmVydCBwZm4gZnJvbSBMaW51eCBwYWdlIHNpemUgdG8gYmFsbG9vbiBwYWdlIHNpemUuICovCisJcmV0dXJuIHBmbiA+PiAoUEFHRV9TSElGVCAtIFZJUlRJT19CQUxMT09OX1BGTl9TSElGVCk7Cit9CisKIHN0YXRpYyB2b2lkIGJhbGxvb25fYWNrKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQogewogCXN0cnVjdCB2aXJ0aW9fYmFsbG9vbiAqdmI7CkBAIC05OSw3ICsxMDgsNyBAQAogCQkJbXNsZWVwKDIwMCk7CiAJCQlicmVhazsKIAkJfQotCQl2Yi0+cGZuc1t2Yi0+bnVtX3BmbnNdID0gcGFnZV90b19wZm4ocGFnZSk7CisJCXZiLT5wZm5zW3ZiLT5udW1fcGZuc10gPSBwYWdlX3RvX2JhbGxvb25fcGZuKHBhZ2UpOwogCQl0b3RhbHJhbV9wYWdlcy0tOwogCQl2Yi0+bnVtX3BhZ2VzKys7CiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZ2Yi0+cGFnZXMpOwpAQCAtMTMyLDcgKzE0MSw3IEBACiAJZm9yICh2Yi0+bnVtX3BmbnMgPSAwOyB2Yi0+bnVtX3BmbnMgPCBudW07IHZiLT5udW1fcGZucysrKSB7CiAJCXBhZ2UgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2Yi0+cGFnZXMsIHN0cnVjdCBwYWdlLCBscnUpOwogCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQkJdmItPnBmbnNbdmItPm51bV9wZm5zXSA9IHBhZ2VfdG9fcGZuKHBhZ2UpOworCQl2Yi0+cGZuc1t2Yi0+bnVtX3BmbnNdID0gcGFnZV90b19iYWxsb29uX3BmbihwYWdlKTsKIAkJdmItPm51bV9wYWdlcy0tOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCmluZGV4IGM3ZGMzN2MuLjI2NWZkZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKQEAgLTc1LDcgKzc1LDcgQEAKICAqIHdvdWxkIG1ha2UgbW9yZSBzZW5zZSBmb3IgdmlydGlvIHRvIG5vdCBpbnNpc3Qgb24gaGF2aW5nIGl0J3Mgb3duIGRldmljZS4gKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIHZpcnRpb19wY2lfcm9vdCA9IHsKIAkucGFyZW50CQk9IE5VTEwsCi0JLmJ1c19pZAkJPSAidmlydGlvLXBjaSIsCisJLmluaXRfbmFtZQk9ICJ2aXJ0aW8tcGNpIiwKIH07CiAKIC8qIENvbnZlcnQgYSBnZW5lcmljIHZpcnRpbyBkZXZpY2UgdG8gb3VyIHN0cnVjdHVyZSAqLwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJc3RydWN0IHZpcnRpb19wY2lfZGV2aWNlICp2cF9kZXYgPSB0b192cF9kZXZpY2UodmRldik7CiAJc3RydWN0IHZpcnRpb19wY2lfdnFfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHNpemU7CiAJdTE2IG51bTsKIAlpbnQgZXJyOwogCkBAIC0yMzcsMTkgKzIzNywyMCBAQAogCWluZm8tPnF1ZXVlX2luZGV4ID0gaW5kZXg7CiAJaW5mby0+bnVtID0gbnVtOwogCi0JaW5mby0+cXVldWUgPSBremFsbG9jKFBBR0VfQUxJR04odnJpbmdfc2l6ZShudW0sUEFHRV9TSVpFKSksIEdGUF9LRVJORUwpOworCXNpemUgPSBQQUdFX0FMSUdOKHZyaW5nX3NpemUobnVtLCBWSVJUSU9fUENJX1ZSSU5HX0FMSUdOKSk7CisJaW5mby0+cXVldWUgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOwogCWlmIChpbmZvLT5xdWV1ZSA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2luZm87CiAJfQogCiAJLyogYWN0aXZhdGUgdGhlIHF1ZXVlICovCi0JaW93cml0ZTMyKHZpcnRfdG9fcGh5cyhpbmZvLT5xdWV1ZSkgPj4gUEFHRV9TSElGVCwKKwlpb3dyaXRlMzIodmlydF90b19waHlzKGluZm8tPnF1ZXVlKSA+PiBWSVJUSU9fUENJX1FVRVVFX0FERFJfU0hJRlQsCiAJCSAgdnBfZGV2LT5pb2FkZHIgKyBWSVJUSU9fUENJX1FVRVVFX1BGTik7CiAKIAkvKiBjcmVhdGUgdGhlIHZyaW5nICovCi0JdnEgPSB2cmluZ19uZXdfdmlydHF1ZXVlKGluZm8tPm51bSwgdmRldiwgaW5mby0+cXVldWUsCi0JCQkJIHZwX25vdGlmeSwgY2FsbGJhY2spOworCXZxID0gdnJpbmdfbmV3X3ZpcnRxdWV1ZShpbmZvLT5udW0sIFZJUlRJT19QQ0lfVlJJTkdfQUxJR04sCisJCQkJIHZkZXYsIGluZm8tPnF1ZXVlLCB2cF9ub3RpZnksIGNhbGxiYWNrKTsKIAlpZiAoIXZxKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2FjdGl2YXRlX3F1ZXVlOwpAQCAtMjY2LDcgKzI2Nyw3IEBACiAKIG91dF9hY3RpdmF0ZV9xdWV1ZToKIAlpb3dyaXRlMzIoMCwgdnBfZGV2LT5pb2FkZHIgKyBWSVJUSU9fUENJX1FVRVVFX1BGTik7Ci0Ja2ZyZWUoaW5mby0+cXVldWUpOworCWZyZWVfcGFnZXNfZXhhY3QoaW5mby0+cXVldWUsIHNpemUpOwogb3V0X2luZm86CiAJa2ZyZWUoaW5mbyk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI3Nyw3ICsyNzgsNyBAQAogewogCXN0cnVjdCB2aXJ0aW9fcGNpX2RldmljZSAqdnBfZGV2ID0gdG9fdnBfZGV2aWNlKHZxLT52ZGV2KTsKIAlzdHJ1Y3QgdmlydGlvX3BjaV92cV9pbmZvICppbmZvID0gdnEtPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzaXplOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZpbmZvLT5ub2RlKTsKQEAgLTI4OSw3ICsyOTAsOCBAQAogCWlvd3JpdGUxNihpbmZvLT5xdWV1ZV9pbmRleCwgdnBfZGV2LT5pb2FkZHIgKyBWSVJUSU9fUENJX1FVRVVFX1NFTCk7CiAJaW93cml0ZTMyKDAsIHZwX2Rldi0+aW9hZGRyICsgVklSVElPX1BDSV9RVUVVRV9QRk4pOwogCi0Ja2ZyZWUoaW5mby0+cXVldWUpOworCXNpemUgPSBQQUdFX0FMSUdOKHZyaW5nX3NpemUoaW5mby0+bnVtLCBWSVJUSU9fUENJX1ZSSU5HX0FMSUdOKSk7CisJZnJlZV9wYWdlc19leGFjdChpbmZvLT5xdWV1ZSwgc2l6ZSk7CiAJa2ZyZWUoaW5mbyk7CiB9CiAKQEAgLTMwNSw2ICszMDcsMjAgQEAKIAkuZmluYWxpemVfZmVhdHVyZXMgPSB2cF9maW5hbGl6ZV9mZWF0dXJlcywKIH07CiAKK3N0YXRpYyB2b2lkIHZpcnRpb19wY2lfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqX2QpCit7CisJc3RydWN0IHZpcnRpb19kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihfZCwgc3RydWN0IHZpcnRpb19kZXZpY2UsIGRldik7CisJc3RydWN0IHZpcnRpb19wY2lfZGV2aWNlICp2cF9kZXYgPSB0b192cF9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHZwX2Rldi0+cGNpX2RldjsKKworCWZyZWVfaXJxKHBjaV9kZXYtPmlycSwgdnBfZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGNpX2RldiwgdnBfZGV2LT5pb2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCWtmcmVlKHZwX2Rldik7Cit9CisKIC8qIHRoZSBQQ0kgcHJvYmluZyBmdW5jdGlvbiAqLwogc3RhdGljIGludCBfX2RldmluaXQgdmlydGlvX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCkBAIC0zMjgsNiArMzQ0LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl2cF9kZXYtPnZkZXYuZGV2LnBhcmVudCA9ICZ2aXJ0aW9fcGNpX3Jvb3Q7CisJdnBfZGV2LT52ZGV2LmRldi5yZWxlYXNlID0gdmlydGlvX3BjaV9yZWxlYXNlX2RldjsKIAl2cF9kZXYtPnZkZXYuY29uZmlnID0gJnZpcnRpb19wY2lfY29uZmlnX29wczsKIAl2cF9kZXYtPnBjaV9kZXYgPSBwY2lfZGV2OwogCUlOSVRfTElTVF9IRUFEKCZ2cF9kZXYtPnZpcnRxdWV1ZXMpOwpAQCAtMzU3LDcgKzM3NCw3IEBACiAKIAkvKiByZWdpc3RlciBhIGhhbmRsZXIgZm9yIHRoZSBxdWV1ZSB3aXRoIHRoZSBQQ0kgZGV2aWNlJ3MgaW50ZXJydXB0ICovCiAJZXJyID0gcmVxdWVzdF9pcnEodnBfZGV2LT5wY2lfZGV2LT5pcnEsIHZwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCi0JCQkgIHZwX2Rldi0+dmRldi5kZXYuYnVzX2lkLCB2cF9kZXYpOworCQkJICBkZXZfbmFtZSgmdnBfZGV2LT52ZGV2LmRldiksIHZwX2Rldik7CiAJaWYgKGVycikKIAkJZ290byBvdXRfc2V0X2RydmRhdGE7CiAKQEAgLTM4NywxMiArNDA0LDYgQEAKIAlzdHJ1Y3QgdmlydGlvX3BjaV9kZXZpY2UgKnZwX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKIAogCXVucmVnaXN0ZXJfdmlydGlvX2RldmljZSgmdnBfZGV2LT52ZGV2KTsKLQlmcmVlX2lycShwY2lfZGV2LT5pcnEsIHZwX2Rldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwotCXBjaV9pb3VubWFwKHBjaV9kZXYsIHZwX2Rldi0+aW9hZGRyKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQlrZnJlZSh2cF9kZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYwppbmRleCA2ZWI1MzAzLi41Nzc3MTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCisrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKQEAgLTI3NCw2ICsyNzQsNyBAQAogfTsKIAogc3RydWN0IHZpcnRxdWV1ZSAqdnJpbmdfbmV3X3ZpcnRxdWV1ZSh1bnNpZ25lZCBpbnQgbnVtLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB2cmluZ19hbGlnbiwKIAkJCQkgICAgICBzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwKIAkJCQkgICAgICB2b2lkICpwYWdlcywKIAkJCQkgICAgICB2b2lkICgqbm90aWZ5KShzdHJ1Y3QgdmlydHF1ZXVlICopLApAQCAtMjkyLDcgKzI5Myw3IEBACiAJaWYgKCF2cSkKIAkJcmV0dXJuIE5VTEw7CiAKLQl2cmluZ19pbml0KCZ2cS0+dnJpbmcsIG51bSwgcGFnZXMsIFBBR0VfU0laRSk7CisJdnJpbmdfaW5pdCgmdnEtPnZyaW5nLCBudW0sIHBhZ2VzLCB2cmluZ19hbGlnbik7CiAJdnEtPnZxLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJdnEtPnZxLnZkZXYgPSB2ZGV2OwogCXZxLT52cS52cV9vcHMgPSAmdnJpbmdfdnFfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IGY3ZjZjZTguLmUzMTkyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTQyLDcgKzQyLDcgQEAKICN1bmRlZiBTM0NfVkFfV0FUQ0hET0cKICNkZWZpbmUgUzNDX1ZBX1dBVENIRE9HICgwKQogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtd2F0Y2hkb2cuaD4KIAogI2RlZmluZSBQRlggInMzYzI0MTAtd2R0OiAiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2ExMTAwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zYTExMDBfd2R0LmMKaW5kZXggZWQwMWU0Yy4uZTE5YjQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zYTExMDBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYTExMDBfd2R0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAKICNpZmRlZiBDT05GSUdfQVJDSF9QWEEKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CkBAIC0zNSw4ICszNiw3IEBACiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2RlZmluZSBPU0NSX0ZSRVEJCUNMT0NLX1RJQ0tfUkFURQotCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvc2NyX2ZyZXE7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzYTExMDB3ZHRfdXNlcnM7CiBzdGF0aWMgaW50IHByZV9tYXJnaW47CiBzdGF0aWMgaW50IGJvb3Rfc3RhdHVzOwpAQCAtMTIzLDEyICsxMjMsMTIgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcHJlX21hcmdpbiA9IE9TQ1JfRlJFUSAqIHRpbWU7CisJCXByZV9tYXJnaW4gPSBvc2NyX2ZyZXEgKiB0aW1lOwogCQlPU01SMyA9IE9TQ1IgKyBwcmVfbWFyZ2luOwogCQkvKmZhbGwgdGhyb3VnaCovCiAKIAljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJldCA9IHB1dF91c2VyKHByZV9tYXJnaW4gLyBPU0NSX0ZSRVEsIHApOworCQlyZXQgPSBwdXRfdXNlcihwcmVfbWFyZ2luIC8gb3Njcl9mcmVxLCBwKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiByZXQ7CkBAIC0xNTUsNiArMTU1LDggQEAKIHsKIAlpbnQgcmV0OwogCisJb3Njcl9mcmVxID0gZ2V0X2Nsb2NrX3RpY2tfcmF0ZSgpOworCiAJLyoKIAkgKiBSZWFkIHRoZSByZXNldCBzdGF0dXMsIGFuZCBzYXZlIGl0IGZvciBsYXRlci4gIElmCiAJICogd2Ugc3VzcGVuZCwgUkNTUiB3aWxsIGJlIGNsZWFyZWQsIGFuZCB0aGUgd2F0Y2hkb2cKQEAgLTE2Miw3ICsxNjQsNyBAQAogCSAqLwogCWJvb3Rfc3RhdHVzID0gKHJlc2V0X3N0YXR1cyAmIFJFU0VUX1NUQVRVU19XQVRDSERPRykgPwogCQkJCVdESU9GX0NBUkRSRVNFVCA6IDA7Ci0JcHJlX21hcmdpbiA9IE9TQ1JfRlJFUSAqIG1hcmdpbjsKKwlwcmVfbWFyZ2luID0gb3Njcl9mcmVxICogbWFyZ2luOwogCiAJcmV0ID0gbWlzY19yZWdpc3Rlcigmc2ExMTAwZG9nX21pc2NkZXYpOwogCWlmIChyZXQgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2V2ZW50cy5jIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKaW5kZXggMWUzYjkzNC4uNDY2MjVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzLmMKKysrIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKQEAgLTE0MSw4ICsxNDEsMTIgQEAKIAlpbnQgaTsKIAogCS8qIEJ5IGRlZmF1bHQgYWxsIGV2ZW50IGNoYW5uZWxzIG5vdGlmeSBDUFUjMC4gKi8KLQlmb3JfZWFjaF9pcnFfZGVzYyhpLCBkZXNjKQorCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisKIAkJZGVzYy0+YWZmaW5pdHkgPSBjcHVtYXNrX29mX2NwdSgwKTsKKwl9CiAjZW5kaWYKIAogCW1lbXNldChjcHVfZXZ0Y2huLCAwLCBzaXplb2YoY3B1X2V2dGNobikpOwpAQCAtMjI5LDE1ICsyMzMsMjAgQEAKIHN0YXRpYyBpbnQgZmluZF91bmJvdW5kX2lycSh2b2lkKQogewogCWludCBpcnE7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJLyogT25seSBhbGxvY2F0ZSBmcm9tIGR5bmlycSByYW5nZSAqLwotCWZvcl9lYWNoX2lycV9ucihpcnEpCisJZm9yIChpcnEgPSAwOyBpcnEgPCBucl9pcnFzOyBpcnErKykKIAkJaWYgKGlycV9iaW5kY291bnRbaXJxXSA9PSAwKQogCQkJYnJlYWs7CiAKIAlpZiAoaXJxID09IG5yX2lycXMpCiAJCXBhbmljKCJObyBhdmFpbGFibGUgSVJRIHRvIGJpbmQgdG86IGluY3JlYXNlIG5yX2lycXMhXG4iKTsKIAorCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19jcHUoaXJxLCAwKTsKKwlpZiAoV0FSTl9PTihkZXNjID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CisKIAlyZXR1cm4gaXJxOwogfQogCkBAIC03OTIsNyArODAxLDcgQEAKIAkJbWFza19ldnRjaG4oZXZ0Y2huKTsKIAogCS8qIE5vIElSUSA8LT4gZXZlbnQtY2hhbm5lbCBtYXBwaW5ncy4gKi8KLQlmb3JfZWFjaF9pcnFfbnIoaXJxKQorCWZvciAoaXJxID0gMDsgaXJxIDwgbnJfaXJxczsgaXJxKyspCiAJCWlycV9pbmZvW2lycV0uZXZ0Y2huID0gMDsgLyogemFwIGV2ZW50LWNoYW5uZWwgYmluZGluZyAqLwogCiAJZm9yIChldnRjaG4gPSAwOyBldnRjaG4gPCBOUl9FVkVOVF9DSEFOTkVMUzsgZXZ0Y2huKyspCkBAIC04MjQsNyArODMzLDcgQEAKIAkJbWFza19ldnRjaG4oaSk7CiAKIAkvKiBEeW5hbWljIElSUSBzcGFjZSBpcyBjdXJyZW50bHkgdW5ib3VuZC4gWmVybyB0aGUgcmVmY250cy4gKi8KLQlmb3JfZWFjaF9pcnFfbnIoaSkKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKQogCQlpcnFfYmluZGNvdW50W2ldID0gMDsKIAogCWlycV9jdHhfaW5pdChzbXBfcHJvY2Vzc29yX2lkKCkpOwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvTWFrZWZpbGUgYi9maXJtd2FyZS9NYWtlZmlsZQppbmRleCA0OTkzYTRiLi42OTY4Mzg4OCAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTE1MCwyNyArMTUwLDE1IEBACiAkKG9iaikvJTogJChvYmopLyUuaWhleCB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQogCSQoY2FsbCBjbWQsaWhleCkKIAotIyBEb24ndCBkZXBlbmQgb24gaWhleDJmdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGFuZCBpdCBhbHJlYWR5IGV4aXN0cy4KLSMgUHV0dGluZyBpdCBhZnRlciB8IGluIHRoZSBkZXBlbmRlbmNpZXMgZG9lc24ndCBzZWVtIHN1ZmZpY2llbnQgd2hlbgotIyB3ZSdyZSBpbnN0YWxsaW5nIGFmdGVyIGEgY3Jvc3MtY29tcGlsZSwgYmVjYXVzZSBpaGV4MmZ3IGhhcyBkZXBlbmRlbmNpZXMKLSMgb24gc3R1ZmYgbGlrZSAvdXNyL2xpYi9nY2MvcHBjNjQtcmVkaGF0LWxpbnV4LzQuMy4wL2luY2x1ZGUvc3RkZGVmLmggYW5kIAotIyB0aHVzIHdhbnRzIHRvIGJlIHJlYnVpbHQuIFdoaWNoIGl0IGNhbid0IGJlLCBpZiB0aGUgcHJlYnVpbHQga2VybmVsIHRyZWUKLSMgaXMgZXhwb3J0ZWQgcmVhZC1vbmx5IGZvciBzb21lb25lIHRvIHJ1biAnbWFrZSBpbnN0YWxsJy4KLWlmZXEgKCQoSU5TVEFMTCk6JCh3aWxkY2FyZCAkKG9iaikvaWhleDJmdyksaW5zdGFsbDokKG9iaikvaWhleDJmdykKLWloZXgyZndfZGVwIDo9Ci1lbHNlCi1paGV4MmZ3X2RlcCA6PSAkKG9iaikvaWhleDJmdwotZW5kaWYKLQogIyAuSEVYIGlzIGFsc28gSW50ZWwgSEVYLCBidXQgd2hlcmUgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIGluIGVhY2ggcmVjb3JkCiAjIGlzIGFjdHVhbGx5IG1lYW5pbmdmdWwsIGJlY2F1c2UgdGhlIGZpcm13YXJlIGhhcyB0byBiZSBsb2FkZWQgaW4gYSBjZXJ0YWluCiAjIG9yZGVyIHJhdGhlciB0aGFuIGFzIGEgc2luZ2xlIGJpbmFyeSBibG9iLiBUaHVzLCB3ZSBjb252ZXJ0IHRoZW0gaW50byBvdXIKICMgbW9yZSBjb21wYWN0IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBpaGV4IHJlY29yZHMgKDxsaW51eC9paGV4Lmg+KQotJChvYmopLyUuZnc6ICQob2JqKS8lLkhFWCAkKGloZXgyZndfZGVwKSB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQorJChvYmopLyUuZnc6ICQob2JqKS8lLkhFWCAkKG9iaikvaWhleDJmdyB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQogCSQoY2FsbCBjbWQsaWhleDJmdykKIAogIyAuSDE2IGlzIG91ciBvd24gbW9kaWZpZWQgZm9ybSBvZiBJbnRlbCBIRVgsIHdpdGggMTYtYml0IGxlbmd0aCBmb3IgcmVjb3Jkcy4KLSQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChpaGV4MmZ3X2RlcCkgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKKyQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChvYmopL2loZXgyZncgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKIAkkKGNhbGwgY21kLGgxNnRvZncpCiAKICQoZmlybXdhcmUtZGlycyk6CmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IGY2NTg0NDEuLmQ2Zjg5ZDMgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC0xOTEsMjMgKzE5MSwxMSBAQAogCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpX19ldmVudCAmIFBBR0VfTUFTSyksIGttKTsgXAogfSB3aGlsZSgwKQogCi0KLS8qIF9fcHV0X2lvY3R4Ci0gKglDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIGFuIGFpbyBjb250ZXh0IGhhcyBnb25lIGF3YXksCi0gKglhbmQgdGhlIHN0cnVjdCBuZWVkcyB0byBiZSBmcmVlZC4KLSAqLwotc3RhdGljIHZvaWQgX19wdXRfaW9jdHgoc3RydWN0IGtpb2N0eCAqY3R4KQorc3RhdGljIHZvaWQgY3R4X3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKKwlzdHJ1Y3Qga2lvY3R4ICpjdHggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGtpb2N0eCwgcmN1X2hlYWQpOwogCXVuc2lnbmVkIG5yX2V2ZW50cyA9IGN0eC0+bWF4X3JlcXM7CiAKLQlCVUdfT04oY3R4LT5yZXFzX2FjdGl2ZSk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZjdHgtPndxKTsKLQljYW5jZWxfd29ya19zeW5jKCZjdHgtPndxLndvcmspOwotCWFpb19mcmVlX3JpbmcoY3R4KTsKLQltbWRyb3AoY3R4LT5tbSk7Ci0JY3R4LT5tbSA9IE5VTEw7Ci0JcHJfZGVidWcoIl9fcHV0X2lvY3R4OiBmcmVlaW5nICVwXG4iLCBjdHgpOwogCWttZW1fY2FjaGVfZnJlZShraW9jdHhfY2FjaGVwLCBjdHgpOwogCiAJaWYgKG5yX2V2ZW50cykgewpAQCAtMjE4LDYgKzIwNiwyMyBAQAogCX0KIH0KIAorLyogX19wdXRfaW9jdHgKKyAqCUNhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgYW4gYWlvIGNvbnRleHQgaGFzIGdvbmUgYXdheSwKKyAqCWFuZCB0aGUgc3RydWN0IG5lZWRzIHRvIGJlIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBfX3B1dF9pb2N0eChzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJQlVHX09OKGN0eC0+cmVxc19hY3RpdmUpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY3R4LT53cSk7CisJY2FuY2VsX3dvcmtfc3luYygmY3R4LT53cS53b3JrKTsKKwlhaW9fZnJlZV9yaW5nKGN0eCk7CisJbW1kcm9wKGN0eC0+bW0pOworCWN0eC0+bW0gPSBOVUxMOworCXByX2RlYnVnKCJfX3B1dF9pb2N0eDogZnJlZWluZyAlcFxuIiwgY3R4KTsKKwljYWxsX3JjdSgmY3R4LT5yY3VfaGVhZCwgY3R4X3JjdV9mcmVlKTsKK30KKwogI2RlZmluZSBnZXRfaW9jdHgoa2lvY3R4KSBkbyB7CQkJCQkJXAogCUJVR19PTihhdG9taWNfcmVhZCgmKGtpb2N0eCktPnVzZXJzKSA8PSAwKTsJCQlcCiAJYXRvbWljX2luYygmKGtpb2N0eCktPnVzZXJzKTsJCQkJCVwKQEAgLTIzNSw2ICsyNDAsNyBAQAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCBraW9jdHggKmN0eDsKKwlpbnQgZGlkX3N5bmMgPSAwOwogCiAJLyogUHJldmVudCBvdmVyZmxvd3MgKi8KIAlpZiAoKG5yX2V2ZW50cyA+ICgweDEwMDAwMDAwVSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKSkgfHwKQEAgLTI2NywyMSArMjczLDMwIEBACiAJCWdvdG8gb3V0X2ZyZWVjdHg7CiAKIAkvKiBsaW1pdCB0aGUgbnVtYmVyIG9mIHN5c3RlbSB3aWRlIGFpb3MgKi8KLQlzcGluX2xvY2soJmFpb19ucl9sb2NrKTsKLQlpZiAoYWlvX25yICsgY3R4LT5tYXhfcmVxcyA+IGFpb19tYXhfbnIgfHwKLQkgICAgYWlvX25yICsgY3R4LT5tYXhfcmVxcyA8IGFpb19ucikKLQkJY3R4LT5tYXhfcmVxcyA9IDA7Ci0JZWxzZQotCQlhaW9fbnIgKz0gY3R4LT5tYXhfcmVxczsKLQlzcGluX3VubG9jaygmYWlvX25yX2xvY2spOworCWRvIHsKKwkJc3Bpbl9sb2NrX2JoKCZhaW9fbnJfbG9jayk7CisJCWlmIChhaW9fbnIgKyBucl9ldmVudHMgPiBhaW9fbWF4X25yIHx8CisJCSAgICBhaW9fbnIgKyBucl9ldmVudHMgPCBhaW9fbnIpCisJCQljdHgtPm1heF9yZXFzID0gMDsKKwkJZWxzZQorCQkJYWlvX25yICs9IGN0eC0+bWF4X3JlcXM7CisJCXNwaW5fdW5sb2NrX2JoKCZhaW9fbnJfbG9jayk7CisJCWlmIChjdHgtPm1heF9yZXFzIHx8IGRpZF9zeW5jKQorCQkJYnJlYWs7CisKKwkJLyogd2FpdCBmb3IgcmN1IGNhbGxiYWNrcyB0byBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgZ2l2aW5nIHVwICovCisJCXN5bmNocm9uaXplX3JjdSgpOworCQlkaWRfc3luYyA9IDE7CisJCWN0eC0+bWF4X3JlcXMgPSBucl9ldmVudHM7CisJfSB3aGlsZSAoMSk7CisKIAlpZiAoY3R4LT5tYXhfcmVxcyA9PSAwKQogCQlnb3RvIG91dF9jbGVhbnVwOwogCiAJLyogbm93IGxpbmsgaW50byBnbG9iYWwgbGlzdC4gKi8KLQl3cml0ZV9sb2NrKCZtbS0+aW9jdHhfbGlzdF9sb2NrKTsKLQljdHgtPm5leHQgPSBtbS0+aW9jdHhfbGlzdDsKLQltbS0+aW9jdHhfbGlzdCA9IGN0eDsKLQl3cml0ZV91bmxvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCXNwaW5fbG9jaygmbW0tPmlvY3R4X2xvY2spOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmY3R4LT5saXN0LCAmbW0tPmlvY3R4X2xpc3QpOworCXNwaW5fdW5sb2NrKCZtbS0+aW9jdHhfbG9jayk7CiAKIAlkcHJpbnRrKCJhaW86IGFsbG9jYXRlZCBpb2N0eCAlcFslbGRdOiBtbT0lcCBtYXNrPTB4JXhcbiIsCiAJCWN0eCwgY3R4LT51c2VyX2lkLCBjdXJyZW50LT5tbSwgY3R4LT5yaW5nX2luZm8ubnIpOwpAQCAtMzc1LDExICszOTAsMTIgQEAKICAqLwogdm9pZCBleGl0X2FpbyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlzdHJ1Y3Qga2lvY3R4ICpjdHggPSBtbS0+aW9jdHhfbGlzdDsKLQltbS0+aW9jdHhfbGlzdCA9IE5VTEw7Ci0Jd2hpbGUgKGN0eCkgewotCQlzdHJ1Y3Qga2lvY3R4ICpuZXh0ID0gY3R4LT5uZXh0OwotCQljdHgtPm5leHQgPSBOVUxMOworCXN0cnVjdCBraW9jdHggKmN0eDsKKworCXdoaWxlICghaGxpc3RfZW1wdHkoJm1tLT5pb2N0eF9saXN0KSkgeworCQljdHggPSBobGlzdF9lbnRyeShtbS0+aW9jdHhfbGlzdC5maXJzdCwgc3RydWN0IGtpb2N0eCwgbGlzdCk7CisJCWhsaXN0X2RlbF9yY3UoJmN0eC0+bGlzdCk7CisKIAkJYWlvX2NhbmNlbF9hbGwoY3R4KTsKIAogCQl3YWl0X2Zvcl9hbGxfYWlvcyhjdHgpOwpAQCAtMzk0LDcgKzQxMCw2IEBACiAJCQkJYXRvbWljX3JlYWQoJmN0eC0+dXNlcnMpLCBjdHgtPmRlYWQsCiAJCQkJY3R4LT5yZXFzX2FjdGl2ZSk7CiAJCXB1dF9pb2N0eChjdHgpOwotCQljdHggPSBuZXh0OwogCX0KIH0KIApAQCAtNTU1LDE5ICs1NzAsMjEgQEAKIAogc3RhdGljIHN0cnVjdCBraW9jdHggKmxvb2t1cF9pb2N0eCh1bnNpZ25lZCBsb25nIGN0eF9pZCkKIHsKLQlzdHJ1Y3Qga2lvY3R4ICppb2N0eDsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBraW9jdHggKmN0eCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAKLQltbSA9IGN1cnJlbnQtPm1tOwotCXJlYWRfbG9jaygmbW0tPmlvY3R4X2xpc3RfbG9jayk7Ci0JZm9yIChpb2N0eCA9IG1tLT5pb2N0eF9saXN0OyBpb2N0eDsgaW9jdHggPSBpb2N0eC0+bmV4dCkKLQkJaWYgKGxpa2VseShpb2N0eC0+dXNlcl9pZCA9PSBjdHhfaWQgJiYgIWlvY3R4LT5kZWFkKSkgewotCQkJZ2V0X2lvY3R4KGlvY3R4KTsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY3R4LCBuLCAmbW0tPmlvY3R4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN0eC0+dXNlcl9pZCA9PSBjdHhfaWQgJiYgIWN0eC0+ZGVhZCkgeworCQkJZ2V0X2lvY3R4KGN0eCk7CiAJCQlicmVhazsKIAkJfQotCXJlYWRfdW5sb2NrKCZtbS0+aW9jdHhfbGlzdF9sb2NrKTsKKwl9CiAKLQlyZXR1cm4gaW9jdHg7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGN0eDsKIH0KIAogLyoKQEAgLTEyMTUsMTkgKzEyMzIsMTQgQEAKIHN0YXRpYyB2b2lkIGlvX2Rlc3Ryb3koc3RydWN0IGtpb2N0eCAqaW9jdHgpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQlzdHJ1Y3Qga2lvY3R4ICoqdG1wOwogCWludCB3YXNfZGVhZDsKIAogCS8qIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdCBpcyBzb21lb25lIGVsc2UgaGFzbid0IGFscmVhZHkgKi8KLQl3cml0ZV9sb2NrKCZtbS0+aW9jdHhfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2soJm1tLT5pb2N0eF9sb2NrKTsKIAl3YXNfZGVhZCA9IGlvY3R4LT5kZWFkOwogCWlvY3R4LT5kZWFkID0gMTsKLQlmb3IgKHRtcCA9ICZtbS0+aW9jdHhfbGlzdDsgKnRtcCAmJiAqdG1wICE9IGlvY3R4OwotCSAgICAgdG1wID0gJigqdG1wKS0+bmV4dCkKLQkJOwotCWlmICgqdG1wKQotCQkqdG1wID0gaW9jdHgtPm5leHQ7Ci0Jd3JpdGVfdW5sb2NrKCZtbS0+aW9jdHhfbGlzdF9sb2NrKTsKKwlobGlzdF9kZWxfcmN1KCZpb2N0eC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJm1tLT5pb2N0eF9sb2NrKTsKIAogCWRwcmludGsoImFpb19yZWxlYXNlKCVwKVxuIiwgaW9jdHgpOwogCWlmIChsaWtlbHkoIXdhc19kZWFkKSkKZGlmZiAtLWdpdCBhL2ZzL2Jpby1pbnRlZ3JpdHkuYyBiL2ZzL2Jpby1pbnRlZ3JpdHkuYwppbmRleCAxOWNhZjdjLi43N2ViYzNjIDEwMDY0NAotLS0gYS9mcy9iaW8taW50ZWdyaXR5LmMKKysrIGIvZnMvYmlvLWludGVncml0eS5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAkgICAgJiYgYmlwLT5iaXBfYnVmICE9IE5VTEwpCiAJCWtmcmVlKGJpcC0+YmlwX2J1Zik7CiAKLQltZW1wb29sX2ZyZWUoYmlwLT5iaXBfdmVjLCBicy0+YnZlY19wb29sc1tiaXAtPmJpcF9wb29sXSk7CisJYnZlY19mcmVlX2JzKGJzLCBiaXAtPmJpcF92ZWMsIGJpcC0+YmlwX3Bvb2wpOwogCW1lbXBvb2xfZnJlZShiaXAsIGJzLT5iaW9faW50ZWdyaXR5X3Bvb2wpOwogCiAJYmlvLT5iaV9pbnRlZ3JpdHkgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCBkZjk5Yzg4Li43MTFjZWUxIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMzEsNyArMzEsMTEgQEAKIAogREVGSU5FX1RSQUNFKGJsb2NrX3NwbGl0KTsKIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiaW9fc2xhYiBfX3JlYWRfbW9zdGx5OworLyoKKyAqIFRlc3QgcGF0Y2ggdG8gaW5saW5lIGEgY2VydGFpbiBudW1iZXIgb2YgYmlfaW9fdmVjJ3MgaW5zaWRlIHRoZSBiaW8KKyAqIGl0c2VsZiwgdG8gc2hyaW5rIGEgYmlvIGRhdGEgYWxsb2NhdGlvbiBmcm9tIHR3byBtZW1wb29sIGNhbGxzIHRvIG9uZQorICovCisjZGVmaW5lIEJJT19JTkxJTkVfVkVDUwkJNAogCiBzdGF0aWMgbWVtcG9vbF90ICpiaW9fc3BsaXRfcG9vbCBfX3JlYWRfbW9zdGx5OwogCkBAIC00MCw5ICs0NCw4IEBACiAgKiBicmVhayBiYWRseSEgY2Fubm90IGJlIGJpZ2dlciB0aGFuIHdoYXQgeW91IGNhbiBmaXQgaW50byBhbgogICogdW5zaWduZWQgc2hvcnQKICAqLwotCiAjZGVmaW5lIEJWKHgpIHsgLm5yX3ZlY3MgPSB4LCAubmFtZSA9ICJiaW92ZWMtIl9fc3RyaW5naWZ5KHgpIH0KLXN0YXRpYyBzdHJ1Y3QgYmlvdmVjX3NsYWIgYnZlY19zbGFic1tCSU9WRUNfTlJfUE9PTFNdIF9fcmVhZF9tb3N0bHkgPSB7CitzdHJ1Y3QgYmlvdmVjX3NsYWIgYnZlY19zbGFic1tCSU9WRUNfTlJfUE9PTFNdIF9fcmVhZF9tb3N0bHkgPSB7CiAJQlYoMSksIEJWKDQpLCBCVigxNiksIEJWKDY0KSwgQlYoMTI4KSwgQlYoQklPX01BWF9QQUdFUyksCiB9OwogI3VuZGVmIEJWCkBAIC01MywxMiArNTYsMTIxIEBACiAgKi8KIHN0cnVjdCBiaW9fc2V0ICpmc19iaW9fc2V0OwogCisvKgorICogT3VyIHNsYWIgcG9vbCBtYW5hZ2VtZW50CisgKi8KK3N0cnVjdCBiaW9fc2xhYiB7CisJc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CisJdW5zaWduZWQgaW50IHNsYWJfcmVmOworCXVuc2lnbmVkIGludCBzbGFiX3NpemU7CisJY2hhciBuYW1lWzhdOworfTsKK3N0YXRpYyBERUZJTkVfTVVURVgoYmlvX3NsYWJfbG9jayk7CitzdGF0aWMgc3RydWN0IGJpb19zbGFiICpiaW9fc2xhYnM7CitzdGF0aWMgdW5zaWduZWQgaW50IGJpb19zbGFiX25yLCBiaW9fc2xhYl9tYXg7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmlvX2ZpbmRfb3JfY3JlYXRlX3NsYWIodW5zaWduZWQgaW50IGV4dHJhX3NpemUpCit7CisJdW5zaWduZWQgaW50IHN6ID0gc2l6ZW9mKHN0cnVjdCBiaW8pICsgZXh0cmFfc2l6ZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYiA9IE5VTEw7CisJc3RydWN0IGJpb19zbGFiICpic2xhYjsKKwl1bnNpZ25lZCBpbnQgaSwgZW50cnkgPSAtMTsKKworCW11dGV4X2xvY2soJmJpb19zbGFiX2xvY2spOworCisJaSA9IDA7CisJd2hpbGUgKGkgPCBiaW9fc2xhYl9ucikgeworCQlzdHJ1Y3QgYmlvX3NsYWIgKmJzbGFiID0gJmJpb19zbGFic1tpXTsKKworCQlpZiAoIWJzbGFiLT5zbGFiICYmIGVudHJ5ID09IC0xKQorCQkJZW50cnkgPSBpOworCQllbHNlIGlmIChic2xhYi0+c2xhYl9zaXplID09IHN6KSB7CisJCQlzbGFiID0gYnNsYWItPnNsYWI7CisJCQlic2xhYi0+c2xhYl9yZWYrKzsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisKKwlpZiAoc2xhYikKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKGJpb19zbGFiX25yID09IGJpb19zbGFiX21heCAmJiBlbnRyeSA9PSAtMSkgeworCQliaW9fc2xhYl9tYXggPDw9IDE7CisJCWJpb19zbGFicyA9IGtyZWFsbG9jKGJpb19zbGFicywKKwkJCQkgICAgIGJpb19zbGFiX21heCAqIHNpemVvZihzdHJ1Y3QgYmlvX3NsYWIpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghYmlvX3NsYWJzKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAoZW50cnkgPT0gLTEpCisJCWVudHJ5ID0gYmlvX3NsYWJfbnIrKzsKKworCWJzbGFiID0gJmJpb19zbGFic1tlbnRyeV07CisKKwlzbnByaW50Zihic2xhYi0+bmFtZSwgc2l6ZW9mKGJzbGFiLT5uYW1lKSwgImJpby0lZCIsIGVudHJ5KTsKKwlzbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoYnNsYWItPm5hbWUsIHN6LCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghc2xhYikKKwkJZ290byBvdXRfdW5sb2NrOworCisJcHJpbnRrKCJiaW86IGNyZWF0ZSBzbGFiIDwlcz4gYXQgJWRcbiIsIGJzbGFiLT5uYW1lLCBlbnRyeSk7CisJYnNsYWItPnNsYWIgPSBzbGFiOworCWJzbGFiLT5zbGFiX3JlZiA9IDE7CisJYnNsYWItPnNsYWJfc2l6ZSA9IHN6Oworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmJpb19zbGFiX2xvY2spOworCXJldHVybiBzbGFiOworfQorCitzdGF0aWMgdm9pZCBiaW9fcHV0X3NsYWIoc3RydWN0IGJpb19zZXQgKmJzKQoreworCXN0cnVjdCBiaW9fc2xhYiAqYnNsYWIgPSBOVUxMOworCXVuc2lnbmVkIGludCBpOworCisJbXV0ZXhfbG9jaygmYmlvX3NsYWJfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmlvX3NsYWJfbnI7IGkrKykgeworCQlpZiAoYnMtPmJpb19zbGFiID09IGJpb19zbGFic1tpXS5zbGFiKSB7CisJCQlic2xhYiA9ICZiaW9fc2xhYnNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChXQVJOKCFic2xhYiwgS0VSTl9FUlIgImJpbzogdW5hYmxlIHRvIGZpbmQgc2xhYiFcbiIpKQorCQlnb3RvIG91dDsKKworCVdBUk5fT04oIWJzbGFiLT5zbGFiX3JlZik7CisKKwlpZiAoLS1ic2xhYi0+c2xhYl9yZWYpCisJCWdvdG8gb3V0OworCisJa21lbV9jYWNoZV9kZXN0cm95KGJzbGFiLT5zbGFiKTsKKwlic2xhYi0+c2xhYiA9IE5VTEw7CisKK291dDoKKwltdXRleF91bmxvY2soJmJpb19zbGFiX2xvY2spOworfQorCiB1bnNpZ25lZCBpbnQgYnZlY19ucl92ZWNzKHVuc2lnbmVkIHNob3J0IGlkeCkKIHsKIAlyZXR1cm4gYnZlY19zbGFic1tpZHhdLm5yX3ZlY3M7CiB9CiAKLXN0cnVjdCBiaW9fdmVjICpidmVjX2FsbG9jX2JzKGdmcF90IGdmcF9tYXNrLCBpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKmlkeCwgc3RydWN0IGJpb19zZXQgKmJzKQordm9pZCBidmVjX2ZyZWVfYnMoc3RydWN0IGJpb19zZXQgKmJzLCBzdHJ1Y3QgYmlvX3ZlYyAqYnYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJQklPX0JVR19PTihpZHggPj0gQklPVkVDX05SX1BPT0xTKTsKKworCWlmIChpZHggPT0gQklPVkVDX01BWF9JRFgpCisJCW1lbXBvb2xfZnJlZShidiwgYnMtPmJ2ZWNfcG9vbCk7CisJZWxzZSB7CisJCXN0cnVjdCBiaW92ZWNfc2xhYiAqYnZzID0gYnZlY19zbGFicyArIGlkeDsKKworCQlrbWVtX2NhY2hlX2ZyZWUoYnZzLT5zbGFiLCBidik7CisJfQorfQorCitzdHJ1Y3QgYmlvX3ZlYyAqYnZlY19hbGxvY19icyhnZnBfdCBnZnBfbWFzaywgaW50IG5yLCB1bnNpZ25lZCBsb25nICppZHgsCisJCQkgICAgICBzdHJ1Y3QgYmlvX3NldCAqYnMpCiB7CiAJc3RydWN0IGJpb192ZWMgKmJ2bDsKIApAQCAtNjcsNjAgKzE3OSw4NSBAQAogCSAqIElmIG5vdCwgdGhpcyBpcyBhIGJpb19rbWFsbG9jKCkgYWxsb2NhdGlvbiBhbmQganVzdCBkbyBhCiAJICoga3phbGxvYygpIGZvciB0aGUgZXhhY3QgbnVtYmVyIG9mIHZlY3MgcmlnaHQgYXdheS4KIAkgKi8KLQlpZiAoYnMpIHsKLQkJLyoKLQkJICogc2VlIGNvbW1lbnQgbmVhciBidmVjX2FycmF5IGRlZmluZSEKLQkJICovCi0JCXN3aXRjaCAobnIpIHsKLQkJY2FzZSAxOgotCQkJKmlkeCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAyIC4uLiA0OgotCQkJKmlkeCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSA1IC4uLiAxNjoKLQkJCSppZHggPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTcgLi4uIDY0OgotCQkJKmlkeCA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSA2NSAuLi4gMTI4OgotCQkJKmlkeCA9IDQ7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjkgLi4uIEJJT19NQVhfUEFHRVM6Ci0JCQkqaWR4ID0gNTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwlpZiAoIWJzKQorCQlidmwgPSBrbWFsbG9jKG5yICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwgZ2ZwX21hc2spOworCisJLyoKKwkgKiBzZWUgY29tbWVudCBuZWFyIGJ2ZWNfYXJyYXkgZGVmaW5lIQorCSAqLworCXN3aXRjaCAobnIpIHsKKwljYXNlIDE6CisJCSppZHggPSAwOworCQlicmVhazsKKwljYXNlIDIgLi4uIDQ6CisJCSppZHggPSAxOworCQlicmVhazsKKwljYXNlIDUgLi4uIDE2OgorCQkqaWR4ID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxNyAuLi4gNjQ6CisJCSppZHggPSAzOworCQlicmVhazsKKwljYXNlIDY1IC4uLiAxMjg6CisJCSppZHggPSA0OworCQlicmVhazsKKwljYXNlIDEyOSAuLi4gQklPX01BWF9QQUdFUzoKKwkJKmlkeCA9IDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogaWR4IG5vdyBwb2ludHMgdG8gdGhlIHBvb2wgd2Ugd2FudCB0byBhbGxvY2F0ZSBmcm9tLiBvbmx5IHRoZQorCSAqIDEtdmVjIGVudHJ5IHBvb2wgaXMgbWVtcG9vbCBiYWNrZWQuCisJICovCisJaWYgKCppZHggPT0gQklPVkVDX01BWF9JRFgpIHsKK2ZhbGxiYWNrOgorCQlidmwgPSBtZW1wb29sX2FsbG9jKGJzLT5idmVjX3Bvb2wsIGdmcF9tYXNrKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJ2cyA9IGJ2ZWNfc2xhYnMgKyAqaWR4OworCQlnZnBfdCBfX2dmcF9tYXNrID0gZ2ZwX21hc2sgJiB+KF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyk7CiAKIAkJLyoKLQkJICogaWR4IG5vdyBwb2ludHMgdG8gdGhlIHBvb2wgd2Ugd2FudCB0byBhbGxvY2F0ZSBmcm9tCisJCSAqIE1ha2UgdGhpcyBhbGxvY2F0aW9uIHJlc3RyaWN0ZWQgYW5kIGRvbid0IGR1bXAgaW5mbyBvbgorCQkgKiBhbGxvY2F0aW9uIGZhaWx1cmVzLCBzaW5jZSB3ZSdsbCBmYWxsYmFjayB0byB0aGUgbWVtcG9vbAorCQkgKiBpbiBjYXNlIG9mIGZhaWx1cmUuCiAJCSAqLwotCQlidmwgPSBtZW1wb29sX2FsbG9jKGJzLT5idmVjX3Bvb2xzWyppZHhdLCBnZnBfbWFzayk7Ci0JCWlmIChidmwpCi0JCQltZW1zZXQoYnZsLCAwLAotCQkJCWJ2ZWNfbnJfdmVjcygqaWR4KSAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOwotCX0gZWxzZQotCQlidmwgPSBremFsbG9jKG5yICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwgZ2ZwX21hc2spOworCQlfX2dmcF9tYXNrIHw9IF9fR0ZQX05PTUVNQUxMT0MgfCBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOOworCisJCS8qCisJCSAqIFRyeSBhIHNsYWIgYWxsb2NhdGlvbi4gSWYgdGhpcyBmYWlscyBhbmQgX19HRlBfV0FJVAorCQkgKiBpcyBzZXQsIHJldHJ5IHdpdGggdGhlIDEtZW50cnkgbWVtcG9vbAorCQkgKi8KKwkJYnZsID0ga21lbV9jYWNoZV9hbGxvYyhidnMtPnNsYWIsIF9fZ2ZwX21hc2spOworCQlpZiAodW5saWtlbHkoIWJ2bCAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkpIHsKKwkJCSppZHggPSBCSU9WRUNfTUFYX0lEWDsKKwkJCWdvdG8gZmFsbGJhY2s7CisJCX0KKwl9CiAKIAlyZXR1cm4gYnZsOwogfQogCi12b2lkIGJpb19mcmVlKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb19zZXQgKmJpb19zZXQpCit2b2lkIGJpb19mcmVlKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb19zZXQgKmJzKQogewotCWlmIChiaW8tPmJpX2lvX3ZlYykgewotCQljb25zdCBpbnQgcG9vbF9pZHggPSBCSU9fUE9PTF9JRFgoYmlvKTsKKwl2b2lkICpwOwogCi0JCUJJT19CVUdfT04ocG9vbF9pZHggPj0gQklPVkVDX05SX1BPT0xTKTsKLQotCQltZW1wb29sX2ZyZWUoYmlvLT5iaV9pb192ZWMsIGJpb19zZXQtPmJ2ZWNfcG9vbHNbcG9vbF9pZHhdKTsKLQl9CisJaWYgKGJpb19oYXNfYWxsb2NhdGVkX3ZlYyhiaW8pKQorCQlidmVjX2ZyZWVfYnMoYnMsIGJpby0+YmlfaW9fdmVjLCBCSU9fUE9PTF9JRFgoYmlvKSk7CiAKIAlpZiAoYmlvX2ludGVncml0eShiaW8pKQotCQliaW9faW50ZWdyaXR5X2ZyZWUoYmlvLCBiaW9fc2V0KTsKKwkJYmlvX2ludGVncml0eV9mcmVlKGJpbywgYnMpOwogCi0JbWVtcG9vbF9mcmVlKGJpbywgYmlvX3NldC0+YmlvX3Bvb2wpOworCS8qCisJICogSWYgd2UgaGF2ZSBmcm9udCBwYWRkaW5nLCBhZGp1c3QgdGhlIGJpbyBwb2ludGVyIGJlZm9yZSBmcmVlaW5nCisJICovCisJcCA9IGJpbzsKKwlpZiAoYnMtPmZyb250X3BhZCkKKwkJcCAtPSBicy0+ZnJvbnRfcGFkOworCisJbWVtcG9vbF9mcmVlKHAsIGJzLT5iaW9fcG9vbCk7CiB9CiAKIC8qCkBAIC0xMzMsNyArMjcwLDggQEAKIAogc3RhdGljIHZvaWQgYmlvX2ttYWxsb2NfZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0Ja2ZyZWUoYmlvLT5iaV9pb192ZWMpOworCWlmIChiaW9faGFzX2FsbG9jYXRlZF92ZWMoYmlvKSkKKwkJa2ZyZWUoYmlvLT5iaV9pb192ZWMpOwogCWtmcmVlKGJpbyk7CiB9CiAKQEAgLTE1NywxNiArMjk1LDIwIEBACiAgKiAgIGZvciBhICZzdHJ1Y3QgYmlvIHRvIGJlY29tZSBmcmVlLiBJZiBhICVOVUxMIEBicyBpcyBwYXNzZWQgaW4sIHdlIHdpbGwKICAqICAgZmFsbCBiYWNrIHRvIGp1c3QgdXNpbmcgQGttYWxsb2MgdG8gYWxsb2NhdGUgdGhlIHJlcXVpcmVkIG1lbW9yeS4KICAqCi0gKiAgIGFsbG9jYXRlIGJpbyBhbmQgaW92ZWNzIGZyb20gdGhlIG1lbW9yeSBwb29scyBzcGVjaWZpZWQgYnkgdGhlCi0gKiAgIGJpb19zZXQgc3RydWN0dXJlLCBvciBAa21hbGxvYyBpZiBub25lIGdpdmVuLgorICogICBOb3RlIHRoYXQgdGhlIGNhbGxlciBtdXN0IHNldCAtPmJpX2Rlc3RydWN0b3Igb24gc3VjY2VzZnVsIHJldHVybgorICogICBvZiBhIGJpbywgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGZyZWVpbmcgb2YgdGhlIGJpbyBvbmNlIHRoZSByZWZlcmVuY2UKKyAqICAgY291bnQgZHJvcHMgdG8gemVyby4KICAqKi8KIHN0cnVjdCBiaW8gKmJpb19hbGxvY19iaW9zZXQoZ2ZwX3QgZ2ZwX21hc2ssIGludCBucl9pb3ZlY3MsIHN0cnVjdCBiaW9fc2V0ICpicykKIHsKLQlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKIAotCWlmIChicykKLQkJYmlvID0gbWVtcG9vbF9hbGxvYyhicy0+YmlvX3Bvb2wsIGdmcF9tYXNrKTsKLQllbHNlCisJaWYgKGJzKSB7CisJCXZvaWQgKnAgPSBtZW1wb29sX2FsbG9jKGJzLT5iaW9fcG9vbCwgZ2ZwX21hc2spOworCisJCWlmIChwKQorCQkJYmlvID0gcCArIGJzLT5mcm9udF9wYWQ7CisJfSBlbHNlCiAJCWJpbyA9IGttYWxsb2Moc2l6ZW9mKCpiaW8pLCBnZnBfbWFzayk7CiAKIAlpZiAobGlrZWx5KGJpbykpIHsKQEAgLTE3Niw3ICszMTgsMTUgQEAKIAkJaWYgKGxpa2VseShucl9pb3ZlY3MpKSB7CiAJCQl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGlkeCk7CiAKLQkJCWJ2bCA9IGJ2ZWNfYWxsb2NfYnMoZ2ZwX21hc2ssIG5yX2lvdmVjcywgJmlkeCwgYnMpOworCQkJaWYgKG5yX2lvdmVjcyA8PSBCSU9fSU5MSU5FX1ZFQ1MpIHsKKwkJCQlpZHggPSAwOworCQkJCWJ2bCA9IGJpby0+YmlfaW5saW5lX3ZlY3M7CisJCQkJbnJfaW92ZWNzID0gQklPX0lOTElORV9WRUNTOworCQkJfSBlbHNlIHsKKwkJCQlidmwgPSBidmVjX2FsbG9jX2JzKGdmcF9tYXNrLCBucl9pb3ZlY3MsICZpZHgsCisJCQkJCQkJYnMpOworCQkJCW5yX2lvdmVjcyA9IGJ2ZWNfbnJfdmVjcyhpZHgpOworCQkJfQogCQkJaWYgKHVubGlrZWx5KCFidmwpKSB7CiAJCQkJaWYgKGJzKQogCQkJCQltZW1wb29sX2ZyZWUoYmlvLCBicy0+YmlvX3Bvb2wpOwpAQCAtMTg2LDcgKzMzNiw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQliaW8tPmJpX2ZsYWdzIHw9IGlkeCA8PCBCSU9fUE9PTF9PRkZTRVQ7Ci0JCQliaW8tPmJpX21heF92ZWNzID0gYnZlY19ucl92ZWNzKGlkeCk7CisJCQliaW8tPmJpX21heF92ZWNzID0gbnJfaW92ZWNzOwogCQl9CiAJCWJpby0+YmlfaW9fdmVjID0gYnZsOwogCX0KQEAgLTEzNDYsMzAgKzE0OTYsMTggQEAKICAqLwogc3RhdGljIGludCBiaW92ZWNfY3JlYXRlX3Bvb2xzKHN0cnVjdCBiaW9fc2V0ICpicywgaW50IHBvb2xfZW50cmllcykKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwID0gYnZlY19zbGFicyArIEJJT1ZFQ19NQVhfSURYOwogCi0JZm9yIChpID0gMDsgaSA8IEJJT1ZFQ19OUl9QT09MUzsgaSsrKSB7Ci0JCXN0cnVjdCBiaW92ZWNfc2xhYiAqYnAgPSBidmVjX3NsYWJzICsgaTsKLQkJbWVtcG9vbF90ICoqYnZwID0gYnMtPmJ2ZWNfcG9vbHMgKyBpOworCWJzLT5idmVjX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2wocG9vbF9lbnRyaWVzLCBicC0+c2xhYik7CisJaWYgKCFicy0+YnZlY19wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQkqYnZwID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKHBvb2xfZW50cmllcywgYnAtPnNsYWIpOwotCQlpZiAoISpidnApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJpb3ZlY19mcmVlX3Bvb2xzKHN0cnVjdCBiaW9fc2V0ICpicykKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBCSU9WRUNfTlJfUE9PTFM7IGkrKykgewotCQltZW1wb29sX3QgKmJ2cCA9IGJzLT5idmVjX3Bvb2xzW2ldOwotCi0JCWlmIChidnApCi0JCQltZW1wb29sX2Rlc3Ryb3koYnZwKTsKLQl9Ci0KKwltZW1wb29sX2Rlc3Ryb3koYnMtPmJ2ZWNfcG9vbCk7CiB9CiAKIHZvaWQgYmlvc2V0X2ZyZWUoc3RydWN0IGJpb19zZXQgKmJzKQpAQCAtMTM3OSwyNSArMTUxNyw0OSBAQAogCiAJYmlvc2V0X2ludGVncml0eV9mcmVlKGJzKTsKIAliaW92ZWNfZnJlZV9wb29scyhicyk7CisJYmlvX3B1dF9zbGFiKGJzKTsKIAogCWtmcmVlKGJzKTsKIH0KIAotc3RydWN0IGJpb19zZXQgKmJpb3NldF9jcmVhdGUoaW50IGJpb19wb29sX3NpemUsIGludCBidmVjX3Bvb2xfc2l6ZSkKKy8qKgorICogYmlvc2V0X2NyZWF0ZSAgLSBDcmVhdGUgYSBiaW9fc2V0CisgKiBAcG9vbF9zaXplOglOdW1iZXIgb2YgYmlvIGFuZCBiaW9fdmVjcyB0byBjYWNoZSBpbiB0aGUgbWVtcG9vbAorICogQGZyb250X3BhZDoJTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGluIGZyb250IG9mIHRoZSByZXR1cm5lZCBiaW8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIFNldCB1cCBhIGJpb19zZXQgdG8gYmUgdXNlZCB3aXRoIEBiaW9fYWxsb2NfYmlvc2V0LiBBbGxvd3MgdGhlIGNhbGxlcgorICogICAgdG8gYXNrIGZvciBhIG51bWJlciBvZiBieXRlcyB0byBiZSBhbGxvY2F0ZWQgaW4gZnJvbnQgb2YgdGhlIGJpby4KKyAqICAgIEZyb250IHBhZCBhbGxvY2F0aW9uIGlzIHVzZWZ1bCBmb3IgZW1iZWRkaW5nIHRoZSBiaW8gaW5zaWRlCisgKiAgICBhbm90aGVyIHN0cnVjdHVyZSwgdG8gYXZvaWQgYWxsb2NhdGluZyBleHRyYSBkYXRhIHRvIGdvIHdpdGggdGhlIGJpby4KKyAqICAgIE5vdGUgdGhhdCB0aGUgYmlvIG11c3QgYmUgZW1iZWRkZWQgYXQgdGhlIEVORCBvZiB0aGF0IHN0cnVjdHVyZSBhbHdheXMsCisgKiAgICBvciB0aGluZ3Mgd2lsbCBicmVhayBiYWRseS4KKyAqLworc3RydWN0IGJpb19zZXQgKmJpb3NldF9jcmVhdGUodW5zaWduZWQgaW50IHBvb2xfc2l6ZSwgdW5zaWduZWQgaW50IGZyb250X3BhZCkKIHsKLQlzdHJ1Y3QgYmlvX3NldCAqYnMgPSBremFsbG9jKHNpemVvZigqYnMpLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBpbnQgYmFja19wYWQgPSBCSU9fSU5MSU5FX1ZFQ1MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpOworCXN0cnVjdCBiaW9fc2V0ICpiczsKIAorCWJzID0ga3phbGxvYyhzaXplb2YoKmJzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFicykKIAkJcmV0dXJuIE5VTEw7CiAKLQlicy0+YmlvX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woYmlvX3Bvb2xfc2l6ZSwgYmlvX3NsYWIpOworCWJzLT5mcm9udF9wYWQgPSBmcm9udF9wYWQ7CisKKwlicy0+YmlvX3NsYWIgPSBiaW9fZmluZF9vcl9jcmVhdGVfc2xhYihmcm9udF9wYWQgKyBiYWNrX3BhZCk7CisJaWYgKCFicy0+YmlvX3NsYWIpIHsKKwkJa2ZyZWUoYnMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlicy0+YmlvX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2wocG9vbF9zaXplLCBicy0+YmlvX3NsYWIpOwogCWlmICghYnMtPmJpb19wb29sKQogCQlnb3RvIGJhZDsKIAotCWlmIChiaW9zZXRfaW50ZWdyaXR5X2NyZWF0ZShicywgYmlvX3Bvb2xfc2l6ZSkpCisJaWYgKGJpb3NldF9pbnRlZ3JpdHlfY3JlYXRlKGJzLCBwb29sX3NpemUpKQogCQlnb3RvIGJhZDsKIAotCWlmICghYmlvdmVjX2NyZWF0ZV9wb29scyhicywgYnZlY19wb29sX3NpemUpKQorCWlmICghYmlvdmVjX2NyZWF0ZV9wb29scyhicywgcG9vbF9zaXplKSkKIAkJcmV0dXJuIGJzOwogCiBiYWQ6CkBAIC0xNDIxLDEyICsxNTgzLDE2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfYmlvKHZvaWQpCiB7Ci0JYmlvX3NsYWIgPSBLTUVNX0NBQ0hFKGJpbywgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMpOworCWJpb19zbGFiX21heCA9IDI7CisJYmlvX3NsYWJfbnIgPSAwOworCWJpb19zbGFicyA9IGt6YWxsb2MoYmlvX3NsYWJfbWF4ICogc2l6ZW9mKHN0cnVjdCBiaW9fc2xhYiksIEdGUF9LRVJORUwpOworCWlmICghYmlvX3NsYWJzKQorCQlwYW5pYygiYmlvOiBjYW4ndCBhbGxvY2F0ZSBiaW9zXG4iKTsKIAogCWJpb19pbnRlZ3JpdHlfaW5pdF9zbGFiKCk7CiAJYmlvdmVjX2luaXRfc2xhYnMoKTsKIAotCWZzX2Jpb19zZXQgPSBiaW9zZXRfY3JlYXRlKEJJT19QT09MX1NJWkUsIDIpOworCWZzX2Jpb19zZXQgPSBiaW9zZXRfY3JlYXRlKEJJT19QT09MX1NJWkUsIDApOwogCWlmICghZnNfYmlvX3NldCkKIAkJcGFuaWMoImJpbzogY2FuJ3QgYWxsb2NhdGUgYmlvc1xuIik7CiAKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggMTAxNzljZi4uNzc2YWUwOSAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTk5LDEwICs5OSwxOCBAQAogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIH0KIAorCitzdGF0aWMgaW50IHF1aWV0X2Vycm9yKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCF0ZXN0X2JpdChCSF9RdWlldCwgJmJoLT5iX3N0YXRlKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKIHN0YXRpYyB2b2lkIGJ1ZmZlcl9pb19lcnJvcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQogCXByaW50ayhLRVJOX0VSUiAiQnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2UgJXMsIGxvZ2ljYWwgYmxvY2sgJUx1XG4iLAogCQkJYmRldm5hbWUoYmgtPmJfYmRldiwgYiksCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwpAQCAtMTQ0LDcgKzE1Miw3IEBACiAJaWYgKHVwdG9kYXRlKSB7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCX0gZWxzZSB7Ci0JCWlmICghYnVmZmVyX2VvcG5vdHN1cHAoYmgpICYmIHByaW50a19yYXRlbGltaXQoKSkgeworCQlpZiAoIWJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSAmJiAhcXVpZXRfZXJyb3IoYmgpKSB7CiAJCQlidWZmZXJfaW9fZXJyb3IoYmgpOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9zdCBwYWdlIHdyaXRlIGR1ZSB0byAiCiAJCQkJCSJJL08gZXJyb3Igb24gJXNcbiIsCkBAIC0zOTQsNyArNDAyLDcgQEAKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJfSBlbHNlIHsKIAkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJaWYgKCFxdWlldF9lcnJvcihiaCkpCiAJCQlidWZmZXJfaW9fZXJyb3IoYmgpOwogCQlTZXRQYWdlRXJyb3IocGFnZSk7CiAJfQpAQCAtNDU1LDcgKzQ2Myw3IEBACiAJaWYgKHVwdG9kYXRlKSB7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCX0gZWxzZSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJaWYgKCFxdWlldF9lcnJvcihiaCkpIHsKIAkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvICIKIAkJCQkJIkkvTyBlcnJvciBvbiAlc1xuIiwKQEAgLTI5MTMsNiArMjkyMSw5IEBACiAJCXNldF9iaXQoQkhfRW9wbm90c3VwcCwgJmJoLT5iX3N0YXRlKTsKIAl9CiAKKwlpZiAodW5saWtlbHkgKHRlc3RfYml0KEJJT19RVUlFVCwmYmlvLT5iaV9mbGFncykpKQorCQlzZXRfYml0KEJIX1F1aWV0LCAmYmgtPmJfc3RhdGUpOworCiAJYmgtPmJfZW5kX2lvKGJoLCB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSk7CiAJYmlvX3B1dChiaW8pOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDFmNTllYTAuLjAyZDJlMTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTc3Myw3ICs3NzMsNiBAQAogCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0c2stPnNpZ25hbDsKIAlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKm9sZHNpZ2hhbmQgPSB0c2stPnNpZ2hhbmQ7CiAJc3BpbmxvY2tfdCAqbG9jayA9ICZvbGRzaWdoYW5kLT5zaWdsb2NrOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyID0gTlVMTDsKIAlpbnQgY291bnQ7CiAKIAlpZiAodGhyZWFkX2dyb3VwX2VtcHR5KHRzaykpCkBAIC04MTEsNyArODEwLDcgQEAKIAkgKiBhbmQgdG8gYXNzdW1lIGl0cyBQSUQ6CiAJICovCiAJaWYgKCF0aHJlYWRfZ3JvdXBfbGVhZGVyKHRzaykpIHsKLQkJbGVhZGVyID0gdHNrLT5ncm91cF9sZWFkZXI7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyID0gdHNrLT5ncm91cF9sZWFkZXI7CiAKIAkJc2lnLT5ub3RpZnlfY291bnQgPSAtMTsJLyogZm9yIGV4aXRfbm90aWZ5KCkgKi8KIAkJZm9yICg7OykgewpAQCAtODYzLDggKzg2Miw5IEBACiAKIAkJQlVHX09OKGxlYWRlci0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSk7CiAJCWxlYWRlci0+ZXhpdF9zdGF0ZSA9IEVYSVRfREVBRDsKLQogCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKworCQlyZWxlYXNlX3Rhc2sobGVhZGVyKTsKIAl9CiAKIAlzaWctPmdyb3VwX2V4aXRfdGFzayA9IE5VTEw7CkBAIC04NzMsOCArODczLDYgQEAKIG5vX3RocmVhZF9ncm91cDoKIAlleGl0X2l0aW1lcnMoc2lnKTsKIAlmbHVzaF9pdGltZXJfc2lnbmFscygpOwotCWlmIChsZWFkZXIpCi0JCXJlbGVhc2VfdGFzayhsZWFkZXIpOwogCiAJaWYgKGF0b21pY19yZWFkKCZvbGRzaWdoYW5kLT5jb3VudCkgIT0gMSkgewogCQlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKm5ld3NpZ2hhbmQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggZTRhMjQxYy4uMDQxNThhZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAkvKiBzbWFsbCBpX2Jsb2NrcyBpbiB2ZnMgaW5vZGU/ICovCiAJaWYgKCFoYXNfaHVnZV9maWxlcyB8fCBzaXplb2YoYmxrY250X3QpIDwgc2l6ZW9mKHU2NCkpIHsKIAkJLyoKLQkJICogQ09ORklHX0xTRiBpcyBub3QgZW5hYmxlZCBpbXBsaWVzIHRoZSBpbm9kZQorCQkgKiBDT05GSUdfTEJEIGlzIG5vdCBlbmFibGVkIGltcGxpZXMgdGhlIGlub2RlCiAJCSAqIGlfYmxvY2sgcmVwcmVzZW50IHRvdGFsIGJsb2NrcyBpbiA1MTIgYnl0ZXMKIAkJICogMzIgPT0gc2l6ZSBvZiB2ZnMgaW5vZGUgaV9ibG9ja3MgKiA4CiAJCSAqLwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKIAogCWlmICghaGFzX2h1Z2VfZmlsZXMgfHwgc2l6ZW9mKGJsa2NudF90KSA8IHNpemVvZih1NjQpKSB7CiAJCS8qCi0JCSAqICFoYXNfaHVnZV9maWxlcyBvciBDT05GSUdfTFNGIGlzIG5vdCBlbmFibGVkCisJCSAqICFoYXNfaHVnZV9maWxlcyBvciBDT05GSUdfTEJEIGlzIG5vdCBlbmFibGVkCiAJCSAqIGltcGxpZXMgdGhlIGlub2RlIGlfYmxvY2sgcmVwcmVzZW50IHRvdGFsIGJsb2NrcyBpbgogCQkgKiA1MTIgYnl0ZXMgMzIgPT0gc2l6ZSBvZiB2ZnMgaW5vZGUgaV9ibG9ja3MgKiA4CiAJCSAqLwpAQCAtMjAyMSwxMyArMjAyMSwxMyBAQAogCWlmIChoYXNfaHVnZV9maWxlcykgewogCQkvKgogCQkgKiBMYXJnZSBmaWxlIHNpemUgZW5hYmxlZCBmaWxlIHN5c3RlbSBjYW4gb25seSBiZQotCQkgKiBtb3VudCBpZiBrZXJuZWwgaXMgYnVpbGQgd2l0aCBDT05GSUdfTFNGCisJCSAqIG1vdW50IGlmIGtlcm5lbCBpcyBidWlsZCB3aXRoIENPTkZJR19MQkQKIAkJICovCiAJCWlmIChzaXplb2Yocm9vdC0+aV9ibG9ja3MpIDwgc2l6ZW9mKHU2NCkgJiYKIAkJCQkhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiAlczogRmlsZXN5c3RlbSB3aXRoIGh1Z2UgIgogCQkJCQkiZmlsZXMgY2Fubm90IGJlIG1vdW50ZWQgcmVhZC13cml0ZSAiCi0JCQkJCSJ3aXRob3V0IENPTkZJR19MU0YuXG4iLCBzYi0+c19pZCk7CisJCQkJCSJ3aXRob3V0IENPTkZJR19MQkQuXG4iLCBzYi0+c19pZCk7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDA0ODdkZGIuLjA5OGEyNDQgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTA4LDgzICsxMDgsOTkgQEAKIAl3YWtlX3VwX2JpdCgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKKy8qKgorICogaW5vZGVfaW5pdF9hbHdheXMgLSBwZXJmb3JtIGlub2RlIHN0cnVjdHVyZSBpbnRpYWxpc2F0aW9uCisgKiBAc2IJCS0gc3VwZXJibG9jayBpbm9kZSBiZWxvbmdzIHRvLgorICogQGlub2RlCS0gaW5vZGUgdG8gaW5pdGlhbGlzZQorICoKKyAqIFRoZXNlIGFyZSBpbml0aWFsaXphdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGRvbmUgb24gZXZlcnkgaW5vZGUKKyAqIGFsbG9jYXRpb24gYXMgdGhlIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpc2VkIGJ5IHNsYWIgYWxsb2NhdGlvbi4KKyAqLworc3RydWN0IGlub2RlICppbm9kZV9pbml0X2Fsd2F5cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGVtcHR5X2FvcHM7CiAJc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGVtcHR5X2lvcHM7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW1wdHlfZm9wczsKKworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICogY29uc3QgbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOworCisJaW5vZGUtPmlfc2IgPSBzYjsKKwlpbm9kZS0+aV9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW5vZGUtPmlfZmxhZ3MgPSAwOworCWF0b21pY19zZXQoJmlub2RlLT5pX2NvdW50LCAxKTsKKwlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOworCWlub2RlLT5pX2ZvcCA9ICZlbXB0eV9mb3BzOworCWlub2RlLT5pX25saW5rID0gMTsKKwlhdG9taWNfc2V0KCZpbm9kZS0+aV93cml0ZWNvdW50LCAwKTsKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2J5dGVzID0gMDsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gMDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwltZW1zZXQoJmlub2RlLT5pX2RxdW90LCAwLCBzaXplb2YoaW5vZGUtPmlfZHF1b3QpKTsKKyNlbmRpZgorCWlub2RlLT5pX3BpcGUgPSBOVUxMOworCWlub2RlLT5pX2JkZXYgPSBOVUxMOworCWlub2RlLT5pX2NkZXYgPSBOVUxMOworCWlub2RlLT5pX3JkZXYgPSAwOworCWlub2RlLT5kaXJ0aWVkX3doZW4gPSAwOworCWlmIChzZWN1cml0eV9pbm9kZV9hbGxvYyhpbm9kZSkpIHsKKwkJaWYgKGlub2RlLT5pX3NiLT5zX29wLT5kZXN0cm95X2lub2RlKQorCQkJaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUoaW5vZGUpOworCQllbHNlCisJCQlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVwLCAoaW5vZGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmlub2RlLT5pX2xvY2spOworCWxvY2tkZXBfc2V0X2NsYXNzKCZpbm9kZS0+aV9sb2NrLCAmc2ItPnNfdHlwZS0+aV9sb2NrX2tleSk7CisKKwltdXRleF9pbml0KCZpbm9kZS0+aV9tdXRleCk7CisJbG9ja2RlcF9zZXRfY2xhc3MoJmlub2RlLT5pX211dGV4LCAmc2ItPnNfdHlwZS0+aV9tdXRleF9rZXkpOworCisJaW5pdF9yd3NlbSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmaW5vZGUtPmlfYWxsb2Nfc2VtLCAmc2ItPnNfdHlwZS0+aV9hbGxvY19zZW1fa2V5KTsKKworCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CisJbWFwcGluZy0+aG9zdCA9IGlub2RlOworCW1hcHBpbmctPmZsYWdzID0gMDsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKKwltYXBwaW5nLT5hc3NvY19tYXBwaW5nID0gTlVMTDsKKwltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSAwOworCisJLyoKKwkgKiBJZiB0aGUgYmxvY2tfZGV2aWNlIHByb3ZpZGVzIGEgYmFja2luZ19kZXZfaW5mbyBmb3IgY2xpZW50CisJICogaW5vZGVzIHRoZW4gdXNlIHRoYXQuICBPdGhlcndpc2UgdGhlIGlub2RlIHNoYXJlIHRoZSBiZGV2J3MKKwkgKiBiYWNraW5nX2Rldl9pbmZvLgorCSAqLworCWlmIChzYi0+c19iZGV2KSB7CisJCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7CisKKwkJYmRpID0gc2ItPnNfYmRldi0+YmRfaW5vZGVfYmFja2luZ19kZXZfaW5mbzsKKwkJaWYgKCFiZGkpCisJCQliZGkgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOworCX0KKwlpbm9kZS0+aV9wcml2YXRlID0gTlVMTDsKKwlpbm9kZS0+aV9tYXBwaW5nID0gbWFwcGluZzsKKworCXJldHVybiBpbm9kZTsKK30KK0VYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9hbHdheXMpOworCitzdGF0aWMgc3RydWN0IGlub2RlICphbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAlpZiAoc2ItPnNfb3AtPmFsbG9jX2lub2RlKQogCQlpbm9kZSA9IHNiLT5zX29wLT5hbGxvY19pbm9kZShzYik7CiAJZWxzZQotCQlpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCQlpbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAotCWlmIChpbm9kZSkgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKLQotCQlpbm9kZS0+aV9zYiA9IHNiOwotCQlpbm9kZS0+aV9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCWlub2RlLT5pX2ZsYWdzID0gMDsKLQkJYXRvbWljX3NldCgmaW5vZGUtPmlfY291bnQsIDEpOwotCQlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOwotCQlpbm9kZS0+aV9mb3AgPSAmZW1wdHlfZm9wczsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCQlhdG9taWNfc2V0KCZpbm9kZS0+aV93cml0ZWNvdW50LCAwKTsKLQkJaW5vZGUtPmlfc2l6ZSA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JCWlub2RlLT5pX2J5dGVzID0gMDsKLQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IDA7Ci0jaWZkZWYgQ09ORklHX1FVT1RBCi0JCW1lbXNldCgmaW5vZGUtPmlfZHF1b3QsIDAsIHNpemVvZihpbm9kZS0+aV9kcXVvdCkpOwotI2VuZGlmCi0JCWlub2RlLT5pX3BpcGUgPSBOVUxMOwotCQlpbm9kZS0+aV9iZGV2ID0gTlVMTDsKLQkJaW5vZGUtPmlfY2RldiA9IE5VTEw7Ci0JCWlub2RlLT5pX3JkZXYgPSAwOwotCQlpbm9kZS0+ZGlydGllZF93aGVuID0gMDsKLQkJaWYgKHNlY3VyaXR5X2lub2RlX2FsbG9jKGlub2RlKSkgewotCQkJaWYgKGlub2RlLT5pX3NiLT5zX29wLT5kZXN0cm95X2lub2RlKQotCQkJCWlub2RlLT5pX3NiLT5zX29wLT5kZXN0cm95X2lub2RlKGlub2RlKTsKLQkJCWVsc2UKLQkJCQlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVwLCAoaW5vZGUpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2luaXQoJmlub2RlLT5pX2xvY2spOwotCQlsb2NrZGVwX3NldF9jbGFzcygmaW5vZGUtPmlfbG9jaywgJnNiLT5zX3R5cGUtPmlfbG9ja19rZXkpOwotCi0JCW11dGV4X2luaXQoJmlub2RlLT5pX211dGV4KTsKLQkJbG9ja2RlcF9zZXRfY2xhc3MoJmlub2RlLT5pX211dGV4LCAmc2ItPnNfdHlwZS0+aV9tdXRleF9rZXkpOwotCi0JCWluaXRfcndzZW0oJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0JCWxvY2tkZXBfc2V0X2NsYXNzKCZpbm9kZS0+aV9hbGxvY19zZW0sICZzYi0+c190eXBlLT5pX2FsbG9jX3NlbV9rZXkpOwotCi0JCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7Ci0gCQltYXBwaW5nLT5ob3N0ID0gaW5vZGU7Ci0JCW1hcHBpbmctPmZsYWdzID0gMDsKLQkJbWFwcGluZ19zZXRfZ2ZwX21hc2sobWFwcGluZywgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRSk7Ci0JCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBOVUxMOwotCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKLQkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gMDsKLQotCQkvKgotCQkgKiBJZiB0aGUgYmxvY2tfZGV2aWNlIHByb3ZpZGVzIGEgYmFja2luZ19kZXZfaW5mbyBmb3IgY2xpZW50Ci0JCSAqIGlub2RlcyB0aGVuIHVzZSB0aGF0LiAgT3RoZXJ3aXNlIHRoZSBpbm9kZSBzaGFyZSB0aGUgYmRldidzCi0JCSAqIGJhY2tpbmdfZGV2X2luZm8uCi0JCSAqLwotCQlpZiAoc2ItPnNfYmRldikgewotCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKLQotCQkJYmRpID0gc2ItPnNfYmRldi0+YmRfaW5vZGVfYmFja2luZ19kZXZfaW5mbzsKLQkJCWlmICghYmRpKQotCQkJCWJkaSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOwotCQl9Ci0JCWlub2RlLT5pX3ByaXZhdGUgPSBOVUxMOwotCQlpbm9kZS0+aV9tYXBwaW5nID0gbWFwcGluZzsKLQl9Ci0JcmV0dXJuIGlub2RlOworCWlmIChpbm9kZSkKKwkJcmV0dXJuIGlub2RlX2luaXRfYWx3YXlzKHNiLCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHZvaWQgZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSAKQEAgLTE5Niw2ICsyMTIsNyBAQAogCWVsc2UKIAkJa21lbV9jYWNoZV9mcmVlKGlub2RlX2NhY2hlcCwgKGlub2RlKSk7CiB9CitFWFBPUlRfU1lNQk9MKGRlc3Ryb3lfaW5vZGUpOwogCiAKIC8qCkBAIC01MzQsNiArNTUxLDQ5IEBACiAJcmV0dXJuIG5vZGUgPyBpbm9kZSA6IE5VTEw7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBoYXNodmFsKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJdG1wID0gKGhhc2h2YWwgKiAodW5zaWduZWQgbG9uZylzYikgXiAoR09MREVOX1JBVElPX1BSSU1FICsgaGFzaHZhbCkgLworCQkJTDFfQ0FDSEVfQllURVM7CisJdG1wID0gdG1wIF4gKCh0bXAgXiBHT0xERU5fUkFUSU9fUFJJTUUpID4+IElfSEFTSEJJVFMpOworCXJldHVybiB0bXAgJiBJX0hBU0hNQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faW5vZGVfYWRkX3RvX2xpc3RzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLAorCQkJc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZXNfc3RhdC5ucl9pbm9kZXMrKzsKKwlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJbGlzdF9hZGQoJmlub2RlLT5pX3NiX2xpc3QsICZzYi0+c19pbm9kZXMpOworCWlmIChoZWFkKQorCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7Cit9CisKKy8qKgorICogaW5vZGVfYWRkX3RvX2xpc3RzIC0gYWRkIGEgbmV3IGlub2RlIHRvIHJlbGV2YW50IGxpc3RzCisgKiBAc2IJCS0gc3VwZXJibG9jayBpbm9kZSBiZWxvbmdzIHRvLgorICogQGlub2RlCS0gaW5vZGUgdG8gbWFyayBpbiB1c2UKKyAqCisgKiBXaGVuIGFuIGlub2RlIGlzIGFsbG9jYXRlZCBpdCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgZm9yLCBhZGRlZCB0byB0aGUgaW4gdXNlCisgKiBsaXN0LCB0aGUgb3duaW5nIHN1cGVyYmxvY2sgYW5kIHRoZSBpbm9kZSBoYXNoLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgdW5kZXIKKyAqIHRoZSBpbm9kZV9sb2NrLCBzbyBleHBvcnQgYSBmdW5jdGlvbiB0byBkbyB0aGlzIHJhdGhlciB0aGFuIHRoZSBpbm9kZSBsb2NrCisgKiBpdHNlbGYuIFdlIGNhbGN1bGF0ZSB0aGUgaGFzaCBsaXN0IHRvIGFkZCB0byBoZXJlIHNvIGl0IGlzIGFsbCBpbnRlcm5hbAorICogd2hpY2ggcmVxdWlyZXMgdGhlIGNhbGxlciB0byBoYXZlIGFscmVhZHkgc2V0IHVwIHRoZSBpbm9kZSBudW1iZXIgaW4gdGhlCisgKiBpbm9kZSB0byBhZGQuCisgKi8KK3ZvaWQgaW5vZGVfYWRkX3RvX2xpc3RzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBpbm9kZS0+aV9pbm8pOworCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlfX2lub2RlX2FkZF90b19saXN0cyhzYiwgaGVhZCwgaW5vZGUpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub2RlX2FkZF90b19saXN0cyk7CisKIC8qKgogICoJbmV3X2lub2RlIAktIG9idGFpbiBhbiBpbm9kZQogICoJQHNiOiBzdXBlcmJsb2NrCkBAIC01NjEsOSArNjIxLDcgQEAKIAlpbm9kZSA9IGFsbG9jX2lub2RlKHNiKTsKIAlpZiAoaW5vZGUpIHsKIAkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKLQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7Ci0JCWxpc3RfYWRkKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfaW5fdXNlKTsKLQkJbGlzdF9hZGQoJmlub2RlLT5pX3NiX2xpc3QsICZzYi0+c19pbm9kZXMpOworCQlfX2lub2RlX2FkZF90b19saXN0cyhzYiwgTlVMTCwgaW5vZGUpOwogCQlpbm9kZS0+aV9pbm8gPSArK2xhc3RfaW5vOwogCQlpbm9kZS0+aV9zdGF0ZSA9IDA7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKQEAgLTYyMiwxMCArNjgwLDcgQEAKIAkJCWlmIChzZXQoaW5vZGUsIGRhdGEpKQogCQkJCWdvdG8gc2V0X2ZhaWxlZDsKIAotCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7Ci0JCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7Ci0JCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlfX2lub2RlX2FkZF90b19saXN0cyhzYiwgaGVhZCwgaW5vZGUpOwogCQkJaW5vZGUtPmlfc3RhdGUgPSBJX0xPQ0t8SV9ORVc7CiAJCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiAKQEAgLTY3MSwxMCArNzI2LDcgQEAKIAkJb2xkID0gZmluZF9pbm9kZV9mYXN0KHNiLCBoZWFkLCBpbm8pOwogCQlpZiAoIW9sZCkgewogCQkJaW5vZGUtPmlfaW5vID0gaW5vOwotCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7Ci0JCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7Ci0JCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlfX2lub2RlX2FkZF90b19saXN0cyhzYiwgaGVhZCwgaW5vZGUpOwogCQkJaW5vZGUtPmlfc3RhdGUgPSBJX0xPQ0t8SV9ORVc7CiAJCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiAKQEAgLTY5OCwxNiArNzUwLDYgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBoYXNodmFsKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JdG1wID0gKGhhc2h2YWwgKiAodW5zaWduZWQgbG9uZylzYikgXiAoR09MREVOX1JBVElPX1BSSU1FICsgaGFzaHZhbCkgLwotCQkJTDFfQ0FDSEVfQllURVM7Ci0JdG1wID0gdG1wIF4gKCh0bXAgXiBHT0xERU5fUkFUSU9fUFJJTUUpID4+IElfSEFTSEJJVFMpOwotCXJldHVybiB0bXAgJiBJX0hBU0hNQVNLOwotfQotCiAvKioKICAqCWl1bmlxdWUgLSBnZXQgYSB1bmlxdWUgaW5vZGUgbnVtYmVyCiAgKglAc2I6IHN1cGVyYmxvY2sKQEAgLTEyOTIsNiArMTMzNCw3IEBACiAJc2NoZWR1bGUoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woaW5vZGVfd2FpdCk7CiAKIC8qCiAgKiBJZiB3ZSB0cnkgdG8gZmluZCBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB3aGlsZSBpdCBpcyBiZWluZwpkaWZmIC0tZ2l0IGEvZnMvamZzL2lub2RlLmMgYi9mcy9qZnMvaW5vZGUuYwppbmRleCAyMTAzMzk3Li5iMDBlZTlmIDEwMDY0NAotLS0gYS9mcy9qZnMvaW5vZGUuYworKysgYi9mcy9qZnMvaW5vZGUuYwpAQCAtNTksOCArNTksMTQgQEAKIAkJaWYgKGlub2RlLT5pX3NpemUgPj0gSURBVEFTSVpFKSB7CiAJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmc19hb3BzOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCWlub2RlLT5pX29wID0gJmpmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQkvKgorCQkJICogVGhlIGlubGluZSBkYXRhIHNob3VsZCBiZSBudWxsLXRlcm1pbmF0ZWQsIGJ1dAorCQkJICogZG9uJ3QgbGV0IG9uLWRpc2sgY29ycnVwdGlvbiBjcmFzaCB0aGUga2VybmVsCisJCQkgKi8KKwkJCUpGU19JUChpbm9kZSktPmlfaW5saW5lW2lub2RlLT5pX3NpemVdID0gJ1wwJzsKKwkJfQogCX0gZWxzZSB7CiAJCWlub2RlLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50bG9jay5jIGIvZnMvbG9ja2QvY2xudGxvY2suYwppbmRleCA4MzA3ZGQ2Li4xZjNiMGZjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50bG9jay5jCisrKyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKIApAQCAtNjAsNyArNjEsNyBAQAogCiAJaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QobmxtX2luaXQtPmFkZHJlc3MsIG5sbV9pbml0LT5hZGRybGVuLAogCQkJCSAgIG5sbV9pbml0LT5wcm90b2NvbCwgbmxtX3ZlcnNpb24sCi0JCQkJICAgbmxtX2luaXQtPmhvc3RuYW1lKTsKKwkJCQkgICBubG1faW5pdC0+aG9zdG5hbWUsIG5sbV9pbml0LT5ub3Jlc3Zwb3J0KTsKIAlpZiAoaG9zdCA9PSBOVUxMKSB7CiAJCWxvY2tkX2Rvd24oKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0xDSyk7CkBAIC0xOTEsMTEgKzE5MiwxNSBAQAogdm9pZAogbmxtY2xudF9yZWNvdmVyeShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCiB7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCiAJaWYgKCFob3N0LT5oX3JlY2xhaW1pbmcrKykgewogCQlubG1fZ2V0X2hvc3QoaG9zdCk7Ci0JCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgaG9zdCwgQ0xPTkVfRlMgfCBDTE9ORV9GSUxFUykgPCAwKQotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCXRhc2sgPSBrdGhyZWFkX3J1bihyZWNsYWltZXIsIGhvc3QsICIlcy1yZWNsYWltIiwgaG9zdC0+aF9uYW1lKTsKKwkJaWYgKElTX0VSUih0YXNrKSkKKwkJCXByaW50ayhLRVJOX0VSUiAibG9ja2Q6IHVuYWJsZSB0byBzcGF3biByZWNsYWltZXIgIgorCQkJCSJ0aHJlYWQuIExvY2tzIGZvciAlcyB3b24ndCBiZSByZWNsYWltZWQhICIKKwkJCQkiKCVsZClcbiIsIGhvc3QtPmhfbmFtZSwgUFRSX0VSUih0YXNrKSk7CiAJfQogfQogCkBAIC0yMDcsNyArMjEyLDYgQEAKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgKm5leHQ7CiAJdTMyIG5zbXN0YXRlOwogCi0JZGFlbW9uaXplKCIlcy1yZWNsYWltIiwgaG9zdC0+aF9uYW1lKTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CiAKIAlkb3duX3dyaXRlKCZob3N0LT5oX3J3c2VtKTsKQEAgLTIzMyw3ICsyMzcsMTIgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmwsIG5leHQsICZob3N0LT5oX3JlY2xhaW0sIGZsX3UubmZzX2ZsLmxpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QpOwogCi0JCS8qIFdoeSBhcmUgd2UgbGVha2luZyBtZW1vcnkgaGVyZT8gLS1va2lyICovCisJCS8qCisJCSAqIHNlbmRpbmcgdGhpcyB0aHJlYWQgYSBTSUdLSUxMIHdpbGwgcmVzdWx0IGluIGFueSB1bnJlY2xhaW1lZAorCQkgKiBsb2NrcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhfZ3JhbnRlZCBsaXN0LiBUaGlzIG1lYW5zIHRoYXQKKwkJICogdGhlIGtlcm5lbCB3aWxsIG5vdCBhdHRlbXB0IHRvIHJlY2xhaW0gdGhlbSBhZ2FpbiBpZiBhIG5ldworCQkgKiByZWNsYWltZXIgdGhyZWFkIGlzIHNwYXduZWQgZm9yIHRoaXMgaG9zdC4KKwkJICovCiAJCWlmIChzaWduYWxsZWQoKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAobmxtY2xudF9yZWNsYWltKGhvc3QsIGZsKSAhPSAwKQpAQCAtMjYxLDUgKzI3MCw1IEBACiAJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKIAlsb2NrZF9kb3duKCk7CiAJdW5sb2NrX2tlcm5lbCgpOwotCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKaW5kZXggZTA1ZDA0NC4uYWJkZWJmNyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvaG9zdC5jCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtNDgsNiArNDgsNyBAQAogCWNvbnN0IHNpemVfdAkJaG9zdG5hbWVfbGVuOwkvKiBpdCdzIGxlbmd0aCAqLwogCWNvbnN0IHN0cnVjdCBzb2NrYWRkcgkqc3JjX3NhcDsJLyogb3VyIGFkZHJlc3MgKG9wdGlvbmFsKSAqLwogCWNvbnN0IHNpemVfdAkJc3JjX2xlbjsJLyogaXQncyBsZW5ndGggKi8KKwljb25zdCBpbnQJCW5vcmVzdnBvcnQ7CS8qIHVzZSBub24tcHJpdiBwb3J0ICovCiB9OwogCiAvKgpAQCAtMjIyLDYgKzIyMyw3IEBACiAJaG9zdC0+aF9uc21zdGF0ZSAgID0gMDsJCQkvKiByZWFsIE5TTSBzdGF0ZSAqLwogCWhvc3QtPmhfbnNtaGFuZGxlICA9IG5zbTsKIAlob3N0LT5oX3NlcnZlcgkgICA9IG5pLT5zZXJ2ZXI7CisJaG9zdC0+aF9ub3Jlc3Zwb3J0ID0gbmktPm5vcmVzdnBvcnQ7CiAJaGxpc3RfYWRkX2hlYWQoJmhvc3QtPmhfaGFzaCwgY2hhaW4pOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2xvY2tvd25lcnMpOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5oX2xvY2spOwpAQCAtMjcyLDYgKzI3NCw3IEBACiAgKiBAcHJvdG9jb2w6IHRyYW5zcG9ydCBwcm90b2NvbCB0byB1c2UKICAqIEB2ZXJzaW9uOiBOTE0gcHJvdG9jb2wgdmVyc2lvbgogICogQGhvc3RuYW1lOiAnXDAnLXRlcm1pbmF0ZWQgaG9zdG5hbWUgb2Ygc2VydmVyCisgKiBAbm9yZXN2cG9ydDogMSBpZiBub24tcHJpdmlsZWdlZCBwb3J0IHNob3VsZCBiZSB1c2VkCiAgKgogICogUmV0dXJucyBhbiBubG1faG9zdCBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHRoZSBwYXNzZWQtaW4KICAqIFtzZXJ2ZXIgYWRkcmVzcywgdHJhbnNwb3J0IHByb3RvY29sLCBOTE0gdmVyc2lvbiwgc2VydmVyIGhvc3RuYW1lXS4KQEAgLTI4MSw3ICsyODQsOSBAQAogc3RydWN0IG5sbV9ob3N0ICpubG1jbG50X2xvb2t1cF9ob3N0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAogCQkJCSAgICAgY29uc3Qgc2l6ZV90IHNhbGVuLAogCQkJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCi0JCQkJICAgICBjb25zdCB1MzIgdmVyc2lvbiwgY29uc3QgY2hhciAqaG9zdG5hbWUpCisJCQkJICAgICBjb25zdCB1MzIgdmVyc2lvbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCSAgICAgaW50IG5vcmVzdnBvcnQpCiB7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyIHNvdXJjZSA9IHsKIAkJLnNhX2ZhbWlseQk9IEFGX1VOU1BFQywKQEAgLTI5Niw2ICszMDEsNyBAQAogCQkuaG9zdG5hbWVfbGVuCT0gc3RybGVuKGhvc3RuYW1lKSwKIAkJLnNyY19zYXAJPSAmc291cmNlLAogCQkuc3JjX2xlbgk9IHNpemVvZihzb3VyY2UpLAorCQkubm9yZXN2cG9ydAk9IG5vcmVzdnBvcnQsCiAJfTsKIAogCWRwcmludGsoImxvY2tkOiAlcyhob3N0PSclcycsIHZlcnM9JXUsIHByb3RvPSVzKVxuIiwgX19mdW5jX18sCkBAIC00MTcsNiArNDIzLDggQEAKIAkJICovCiAJCWlmICghaG9zdC0+aF9zZXJ2ZXIpCiAJCQlhcmdzLmZsYWdzIHw9IFJQQ19DTE5UX0NSRUFURV9IQVJEUlRSWTsKKwkJaWYgKGhvc3QtPmhfbm9yZXN2cG9ydCkKKwkJCWFyZ3MuZmxhZ3MgfD0gUlBDX0NMTlRfQ1JFQVRFX05PTlBSSVZQT1JUOwogCiAJCWNsbnQgPSBycGNfY3JlYXRlKCZhcmdzKTsKIAkJaWYgKCFJU19FUlIoY2xudCkpCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IDU2YjA3NjczLi4yNTJkODAxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmMuYworKysgYi9mcy9sb2NrZC9zdmMuYwpAQCAtNDUsNyArNDUsNyBAQAogc3RhdGljIHN0cnVjdCBzdmNfcHJvZ3JhbQlubG1zdmNfcHJvZ3JhbTsKIAogc3RydWN0IG5sbXN2Y19iaW5kaW5nICoJCW5sbXN2Y19vcHM7Ci1FWFBPUlRfU1lNQk9MKG5sbXN2Y19vcHMpOworRVhQT1JUX1NZTUJPTF9HUEwobmxtc3ZjX29wcyk7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgobmxtc3ZjX211dGV4KTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJCW5sbXN2Y191c2VyczsKQEAgLTMwMCw3ICszMDAsNyBAQAogCW11dGV4X3VubG9jaygmbmxtc3ZjX211dGV4KTsKIAlyZXR1cm4gZXJyb3I7CiB9Ci1FWFBPUlRfU1lNQk9MKGxvY2tkX3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tkX3VwKTsKIAogLyoKICAqIERlY3JlbWVudCB0aGUgdXNlciBjb3VudCBhbmQgYnJpbmcgZG93biBsb2NrZCBpZiB3ZSdyZSB0aGUgbGFzdC4KQEAgLTMyOSw3ICszMjksNyBAQAogb3V0OgogCW11dGV4X3VubG9jaygmbmxtc3ZjX211dGV4KTsKIH0KLUVYUE9SVF9TWU1CT0wobG9ja2RfZG93bik7CitFWFBPUlRfU1lNQk9MX0dQTChsb2NrZF9kb3duKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwppbmRleCBjMmU5Y2ZkLi4zZTYzNGYyYSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CiAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAKQEAgLTE4MiwxMCArMTgzLDM0IEBACiAJbXV0ZXhfdW5sb2NrKCZuZnNfY2FsbGJhY2tfbXV0ZXgpOwogfQogCitzdGF0aWMgaW50IGNoZWNrX2dzc19jYWxsYmFja19wcmluY2lwYWwoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJCQkJc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKnIgPSBjbHAtPmNsX3JwY2NsaWVudDsKKwljaGFyICpwID0gc3ZjX2dzc19wcmluY2lwYWwocnFzdHApOworCisJLyoKKwkgKiBJdCBtaWdodCBqdXN0IGJlIGEgbm9ybWFsIHVzZXIgcHJpbmNpcGFsLCBpbiB3aGljaCBjYXNlCisJICogdXNlcnNwYWNlIHdvbid0IGJvdGhlciB0byB0ZWxsIHVzIHRoZSBuYW1lIGF0IGFsbC4KKwkgKi8KKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RFTklFRDsKKworCS8qIEV4cGVjdCBhIEdTU19DX05UX0hPU1RCQVNFRF9OQU1FIGxpa2UgIm5mc0BzZXJ2ZXJob3N0bmFtZSIgKi8KKworCWlmIChtZW1jbXAocCwgIm5mc0AiLCA0KSAhPSAwKQorCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwlwICs9IDQ7CisJaWYgKHN0cmNtcChwLCByLT5jbF9zZXJ2ZXIpICE9IDApCisJCXJldHVybiBTVkNfREVOSUVEOworCXJldHVybiBTVkNfT0s7Cit9CisKIHN0YXRpYyBpbnQgbmZzX2NhbGxiYWNrX2F1dGhlbnRpY2F0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJUlBDX0lGREVCVUcoY2hhciBidWZbUlBDX01BWF9BRERSQlVGTEVOXSk7CisJaW50IHJldCA9IFNWQ19PSzsKIAogCS8qIERvbid0IHRhbGsgdG8gc3RyYW5nZXJzICovCiAJY2xwID0gbmZzX2ZpbmRfY2xpZW50KHN2Y19hZGRyKHJxc3RwKSwgNCk7CkBAIC0xOTQsMjEgKzIxOSwyMiBAQAogCiAJZHByaW50aygiJXM6ICVzIE5GU3Y0IGNhbGxiYWNrIVxuIiwgX19mdW5jX18sCiAJCQlzdmNfcHJpbnRfYWRkcihycXN0cCwgYnVmLCBzaXplb2YoYnVmKSkpOwotCW5mc19wdXRfY2xpZW50KGNscCk7CiAKIAlzd2l0Y2ggKHJxc3RwLT5ycV9hdXRob3AtPmZsYXZvdXIpIHsKIAkJY2FzZSBSUENfQVVUSF9OVUxMOgogCQkJaWYgKHJxc3RwLT5ycV9wcm9jICE9IENCX05VTEwpCi0JCQkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJCQkJcmV0ID0gU1ZDX0RFTklFRDsKIAkJCWJyZWFrOwogCQljYXNlIFJQQ19BVVRIX1VOSVg6CiAJCQlicmVhazsKIAkJY2FzZSBSUENfQVVUSF9HU1M6Ci0JCQkvKiBGSVhNRTogUlBDU0VDX0dTUyBoYW5kbGluZz8gKi8KKwkJCXJldCA9IGNoZWNrX2dzc19jYWxsYmFja19wcmluY2lwYWwoY2xwLCBycXN0cCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXJldHVybiBTVkNfREVOSUVEOworCQkJcmV0ID0gU1ZDX0RFTklFRDsKIAl9Ci0JcmV0dXJuIFNWQ19PSzsKKwluZnNfcHV0X2NsaWVudChjbHApOworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uZnMvY2xpZW50LmMgYi9mcy9uZnMvY2xpZW50LmMKaW5kZXggNzU0NzYwMC4uOWI3MjhmMyAxMDA2NDQKLS0tIGEvZnMvbmZzL2NsaWVudC5jCisrKyBiL2ZzL25mcy9jbGllbnQuYwpAQCAtMTQzLDcgKzE0Myw2IEBACiAJY2xwLT5jbF9wcm90byA9IGNsX2luaXQtPnByb3RvOwogCiAjaWZkZWYgQ09ORklHX05GU19WNAotCWluaXRfcndzZW0oJmNscC0+Y2xfc2VtKTsKIAlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9kZWxlZ2F0aW9ucyk7CiAJc3Bpbl9sb2NrX2luaXQoJmNscC0+Y2xfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNscC0+Y2xfcmVuZXdkLCBuZnM0X3JlbmV3X3N0YXRlKTsKQEAgLTIyNCwzMSArMjIzLDU0IEBACiAJfQogfQogCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitzdGF0aWMgY29uc3Qgc3RydWN0IGluNl9hZGRyICpuZnNfbWFwX2lwdjRfYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHJfbWFwcGVkKQoreworCXN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlyZXR1cm4gJigoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQoKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJYWRkcl9tYXBwZWQpOworCQkJcmV0dXJuIGFkZHJfbWFwcGVkOworCX0KK30KKworc3RhdGljIGludCBuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2ExLAorCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhMikKK3sKKwljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIxOworCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjI7CisJc3RydWN0IGluNl9hZGRyIGFkZHIxX21hcHBlZDsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjJfbWFwcGVkOworCisJYWRkcjEgPSBuZnNfbWFwX2lwdjRfYWRkcihzYTEsICZhZGRyMV9tYXBwZWQpOworCWlmIChsaWtlbHkoYWRkcjEgIT0gTlVMTCkpIHsKKwkJYWRkcjIgPSBuZnNfbWFwX2lwdjRfYWRkcihzYTIsICZhZGRyMl9tYXBwZWQpOworCQlpZiAobGlrZWx5KGFkZHIyICE9IE5VTEwpKQorCQkJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbChhZGRyMSwgYWRkcjIpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbHNlCiBzdGF0aWMgaW50IG5mc19zb2NrYWRkcl9tYXRjaF9pcGFkZHI0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2ExLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhMikKIHsKIAlyZXR1cm4gc2ExLT5zaW5fYWRkci5zX2FkZHIgPT0gc2EyLT5zaW5fYWRkci5zX2FkZHI7CiB9CiAKLXN0YXRpYyBpbnQgbmZzX3NvY2thZGRyX21hdGNoX2lwYWRkcjYoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2ExLAotCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTIpCi17Ci0JcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmc2ExLT5zaW42X2FkZHIsICZzYTItPnNpbjZfYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgbmZzX3NvY2thZGRyX21hdGNoX2lwYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhMSwKIAkJCQkgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYTIpCiB7Ci0Jc3dpdGNoIChzYTEtPnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJcmV0dXJuIG5mc19zb2NrYWRkcl9tYXRjaF9pcGFkZHI0KChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTEsCi0JCQkJKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhMik7Ci0JY2FzZSBBRl9JTkVUNjoKLQkJcmV0dXJuIG5mc19zb2NrYWRkcl9tYXRjaF9pcGFkZHI2KChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2ExLAotCQkJCShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EyKTsKLQl9Ci0JQlVHKCk7CisJaWYgKHVubGlrZWx5KHNhMS0+c2FfZmFtaWx5ICE9IEFGX0lORVQgfHwgc2EyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkpCisJCXJldHVybiAwOworCXJldHVybiBuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyNCgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2ExLAorCQkJKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhMik7CiB9CisjZW5kaWYKIAogLyoKICAqIEZpbmQgYSBjbGllbnQgYnkgSVAgYWRkcmVzcyBhbmQgcHJvdG9jb2wgdmVyc2lvbgpAQCAtMjcwLDggKzI5Miw2IEBACiAJCWlmIChjbHAtPnJwY19vcHMtPnZlcnNpb24gIT0gbmZzdmVyc2lvbikKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gY2xhcC0+c2FfZmFtaWx5KQotCQkJY29udGludWU7CiAJCS8qIE1hdGNoIG9ubHkgdGhlIElQIGFkZHJlc3MsIG5vdCB0aGUgcG9ydCBudW1iZXIgKi8KIAkJaWYgKCFuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyKGFkZHIsIGNsYXApKQogCQkJY29udGludWU7CkBAIC0zMDUsOCArMzI1LDYgQEAKIAkJaWYgKGNscC0+cnBjX29wcy0+dmVyc2lvbiAhPSBuZnN2ZXJzKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNhcC0+c2FfZmFtaWx5ICE9IGNsYXAtPnNhX2ZhbWlseSkKLQkJCWNvbnRpbnVlOwogCQkvKiBNYXRjaCBvbmx5IHRoZSBJUCBhZGRyZXNzLCBub3QgdGhlIHBvcnQgbnVtYmVyICovCiAJCWlmICghbmZzX3NvY2thZGRyX21hdGNoX2lwYWRkcihzYXAsIGNsYXApKQogCQkJY29udGludWU7CkBAIC00NzAsNyArNDg4LDcgQEAKIHN0YXRpYyBpbnQgbmZzX2NyZWF0ZV9ycGNfY2xpZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCiAJCQkJIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCAqdGltZXBhcm1zLAogCQkJCSBycGNfYXV0aGZsYXZvcl90IGZsYXZvciwKLQkJCQkgaW50IGZsYWdzKQorCQkJCSBpbnQgZGlzY3J0cnksIGludCBub3Jlc3Zwb3J0KQogewogCXN0cnVjdCBycGNfY2xudAkJKmNsbnQgPSBOVUxMOwogCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKQEAgLTQ4Miw5ICs1MDAsMTMgQEAKIAkJLnByb2dyYW0JPSAmbmZzX3Byb2dyYW0sCiAJCS52ZXJzaW9uCT0gY2xwLT5ycGNfb3BzLT52ZXJzaW9uLAogCQkuYXV0aGZsYXZvcgk9IGZsYXZvciwKLQkJLmZsYWdzCQk9IGZsYWdzLAogCX07CiAKKwlpZiAoZGlzY3J0cnkpCisJCWFyZ3MuZmxhZ3MgfD0gUlBDX0NMTlRfQ1JFQVRFX0RJU0NSVFJZOworCWlmIChub3Jlc3Zwb3J0KQorCQlhcmdzLmZsYWdzIHw9IFJQQ19DTE5UX0NSRUFURV9OT05QUklWUE9SVDsKKwogCWlmICghSVNfRVJSKGNscC0+Y2xfcnBjY2xpZW50KSkKIAkJcmV0dXJuIDA7CiAKQEAgLTUyMiw2ICs1NDQsOCBAQAogCQkucHJvdG9jb2wJPSBzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1RDUCA/CiAJCQkJCQlJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQLAogCQkubmZzX3ZlcnNpb24JPSBjbHAtPnJwY19vcHMtPnZlcnNpb24sCisJCS5ub3Jlc3Zwb3J0CT0gc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT1JFU1ZQT1JUID8KKwkJCQkJMSA6IDAsCiAJfTsKIAogCWlmIChubG1faW5pdC5uZnNfdmVyc2lvbiA+IDMpCkBAIC02MjMsNyArNjQ3LDggQEAKIAkgKiBDcmVhdGUgYSBjbGllbnQgUlBDIGhhbmRsZSBmb3IgZG9pbmcgRlNTVEFUIHdpdGggVU5JWCBhdXRoIG9ubHkKIAkgKiAtIFJGQyAyNjIzLCBzZWMgMi4zLjIKIAkgKi8KLQllcnJvciA9IG5mc19jcmVhdGVfcnBjX2NsaWVudChjbHAsIHRpbWVwYXJtcywgUlBDX0FVVEhfVU5JWCwgMCk7CisJZXJyb3IgPSBuZnNfY3JlYXRlX3JwY19jbGllbnQoY2xwLCB0aW1lcGFybXMsIFJQQ19BVVRIX1VOSVgsCisJCQkJICAgICAgMCwgZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9SRVNWUE9SVCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBlcnJvcjsKIAluZnNfbWFya19jbGllbnRfcmVhZHkoY2xwLCBORlNfQ1NfUkVBRFkpOwpAQCAtOTY1LDcgKzk5MCw4IEBACiBzdGF0aWMgaW50IG5mczRfaW5pdF9jbGllbnQoc3RydWN0IG5mc19jbGllbnQgKmNscCwKIAkJY29uc3Qgc3RydWN0IHJwY190aW1lb3V0ICp0aW1lcGFybXMsCiAJCWNvbnN0IGNoYXIgKmlwX2FkZHIsCi0JCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXIpCisJCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXIsCisJCWludCBmbGFncykKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTk3OSw3ICsxMDA1LDcgQEAKIAljbHAtPnJwY19vcHMgPSAmbmZzX3Y0X2NsaWVudG9wczsKIAogCWVycm9yID0gbmZzX2NyZWF0ZV9ycGNfY2xpZW50KGNscCwgdGltZXBhcm1zLCBhdXRoZmxhdm91ciwKLQkJCQkJUlBDX0NMTlRfQ1JFQVRFX0RJU0NSVFJZKTsKKwkJCQkgICAgICAxLCBmbGFncyAmIE5GU19NT1VOVF9OT1JFU1ZQT1JUKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGVycm9yOwogCW1lbWNweShjbHAtPmNsX2lwYWRkciwgaXBfYWRkciwgc2l6ZW9mKGNscC0+Y2xfaXBhZGRyKSk7CkBAIC0xMDMwLDcgKzEwNTYsOCBAQAogCQllcnJvciA9IFBUUl9FUlIoY2xwKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JZXJyb3IgPSBuZnM0X2luaXRfY2xpZW50KGNscCwgdGltZXBhcm1zLCBpcF9hZGRyLCBhdXRoZmxhdm91cik7CisJZXJyb3IgPSBuZnM0X2luaXRfY2xpZW50KGNscCwgdGltZXBhcm1zLCBpcF9hZGRyLCBhdXRoZmxhdm91ciwKKwkJCQkJc2VydmVyLT5mbGFncyk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBlcnJvcl9wdXQ7CiAKQEAgLTEwNTksNiArMTA4NiwxMCBAQAogCW5mc19pbml0X3RpbWVvdXRfdmFsdWVzKCZ0aW1lcGFybXMsIGRhdGEtPm5mc19zZXJ2ZXIucHJvdG9jb2wsCiAJCQlkYXRhLT50aW1lbywgZGF0YS0+cmV0cmFucyk7CiAKKwkvKiBJbml0aWFsaXNlIHRoZSBjbGllbnQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgbW91bnQgZGF0YSAqLworCXNlcnZlci0+ZmxhZ3MgPSBkYXRhLT5mbGFnczsKKwlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9BVE9NSUNfT1BFTjsKKwogCS8qIEdldCBhIGNsaWVudCByZWNvcmQgKi8KIAllcnJvciA9IG5mczRfc2V0X2NsaWVudChzZXJ2ZXIsCiAJCQlkYXRhLT5uZnNfc2VydmVyLmhvc3RuYW1lLApAQCAtMTA3MSwxMCArMTEwMiw2IEBACiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBlcnJvcjsKIAotCS8qIEluaXRpYWxpc2UgdGhlIGNsaWVudCByZXByZXNlbnRhdGlvbiBmcm9tIHRoZSBtb3VudCBkYXRhICovCi0Jc2VydmVyLT5mbGFncyA9IGRhdGEtPmZsYWdzOwotCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0FUT01JQ19PUEVOOwotCiAJaWYgKGRhdGEtPnJzaXplKQogCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOwogCWlmIChkYXRhLT53c2l6ZSkKQEAgLTExNzcsNiArMTIwNCwxMCBAQAogCXBhcmVudF9zZXJ2ZXIgPSBORlNfU0IoZGF0YS0+c2IpOwogCXBhcmVudF9jbGllbnQgPSBwYXJlbnRfc2VydmVyLT5uZnNfY2xpZW50OwogCisJLyogSW5pdGlhbGlzZSB0aGUgY2xpZW50IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlIHBhcmVudCBzZXJ2ZXIgKi8KKwluZnNfc2VydmVyX2NvcHlfdXNlcmRhdGEoc2VydmVyLCBwYXJlbnRfc2VydmVyKTsKKwlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9BVE9NSUNfT1BFTjsKKwogCS8qIEdldCBhIGNsaWVudCByZXByZXNlbnRhdGlvbi4KIAkgKiBOb3RlOiBORlN2NCBhbHdheXMgdXNlcyBUQ1AsICovCiAJZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBkYXRhLT5ob3N0bmFtZSwKQEAgLTExODksMTAgKzEyMjAsNiBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQkvKiBJbml0aWFsaXNlIHRoZSBjbGllbnQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgcGFyZW50IHNlcnZlciAqLwotCW5mc19zZXJ2ZXJfY29weV91c2VyZGF0YShzZXJ2ZXIsIHBhcmVudF9zZXJ2ZXIpOwotCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0FUT01JQ19PUEVOOwotCiAJZXJyb3IgPSBuZnNfaW5pdF9zZXJ2ZXJfcnBjY2xpZW50KHNlcnZlciwgcGFyZW50X3NlcnZlci0+Y2xpZW50LT5jbF90aW1lb3V0LCBkYXRhLT5hdXRoZmxhdm9yKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RlbGVnYXRpb24uYyBiL2ZzL25mcy9kZWxlZ2F0aW9uLmMKaW5kZXggY2M1NjNjZi4uOTY4MjI1YSAxMDA2NDQKLS0tIGEvZnMvbmZzL2RlbGVnYXRpb24uYworKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5jCkBAIC00Myw2ICs0MywyNyBAQAogCQlwdXRfcnBjY3JlZChjcmVkKTsKIH0KIAordm9pZCBuZnNfbWFya19kZWxlZ2F0aW9uX3JlZmVyZW5jZWQoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQoreworCXNldF9iaXQoTkZTX0RFTEVHQVRJT05fUkVGRVJFTkNFRCwgJmRlbGVnYXRpb24tPmZsYWdzKTsKK30KKworaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJaW50IHJldCA9IDA7CisKKwlmbGFncyAmPSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOworCXJjdV9yZWFkX2xvY2soKTsKKwlkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKE5GU19JKGlub2RlKS0+ZGVsZWdhdGlvbik7CisJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCAmJiAoZGVsZWdhdGlvbi0+dHlwZSAmIGZsYWdzKSA9PSBmbGFncykgeworCQluZnNfbWFya19kZWxlZ2F0aW9uX3JlZmVyZW5jZWQoZGVsZWdhdGlvbik7CisJCXJldCA9IDE7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbmZzX2RlbGVnYXRpb25fY2xhaW1fbG9ja3Moc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CkBAIC0xMTksNyArMTQwLDcgQEAKIAlkZWxlZ2F0aW9uLT5tYXhzaXplID0gcmVzLT5tYXhzaXplOwogCW9sZGNyZWQgPSBkZWxlZ2F0aW9uLT5jcmVkOwogCWRlbGVnYXRpb24tPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKLQlkZWxlZ2F0aW9uLT5mbGFncyAmPSB+TkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNOworCWNsZWFyX2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncyk7CiAJTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uX3N0YXRlID0gZGVsZWdhdGlvbi0+dHlwZTsKIAlzbXBfd21iKCk7CiAJcHV0X3JwY2NyZWQob2xkY3JlZCk7CkBAIC0xMzQsMTkgKzE1NSwzNSBAQAogCXJldHVybiByZXM7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5mc19kZWxlZ2F0aW9uX2dyYWJfaW5vZGUoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKKwlpZiAoZGVsZWdhdGlvbi0+aW5vZGUgIT0gTlVMTCkKKwkJaW5vZGUgPSBpZ3JhYihkZWxlZ2F0aW9uLT5pbm9kZSk7CisJc3Bpbl91bmxvY2soJmRlbGVnYXRpb24tPmxvY2spOworCXJldHVybiBpbm9kZTsKK30KKwogc3RhdGljIHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChzdHJ1Y3QgbmZzX2lub2RlICpuZnNpLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKG5mc2ktPmRlbGVnYXRpb24pOwogCiAJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCkKIAkJZ290byBub21hdGNoOworCXNwaW5fbG9jaygmZGVsZWdhdGlvbi0+bG9jayk7CiAJaWYgKHN0YXRlaWQgIT0gTlVMTCAmJiBtZW1jbXAoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhLCBzdGF0ZWlkLT5kYXRhLAogCQkJCXNpemVvZihkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEpKSAhPSAwKQotCQlnb3RvIG5vbWF0Y2g7CisJCWdvdG8gbm9tYXRjaF91bmxvY2s7CiAJbGlzdF9kZWxfcmN1KCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0KTsKKwlkZWxlZ2F0aW9uLT5pbm9kZSA9IE5VTEw7CiAJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5mc2ktPmRlbGVnYXRpb24sIE5VTEwpOworCXNwaW5fdW5sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIAlyZXR1cm4gZGVsZWdhdGlvbjsKK25vbWF0Y2hfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIG5vbWF0Y2g6CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNzIsNiArMjA5LDggQEAKIAlkZWxlZ2F0aW9uLT5jaGFuZ2VfYXR0ciA9IG5mc2ktPmNoYW5nZV9hdHRyOwogCWRlbGVnYXRpb24tPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKIAlkZWxlZ2F0aW9uLT5pbm9kZSA9IGlub2RlOworCWRlbGVnYXRpb24tPmZsYWdzID0gMTw8TkZTX0RFTEVHQVRJT05fUkVGRVJFTkNFRDsKKwlzcGluX2xvY2tfaW5pdCgmZGVsZWdhdGlvbi0+bG9jayk7CiAKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJaWYgKHJjdV9kZXJlZmVyZW5jZShuZnNpLT5kZWxlZ2F0aW9uKSAhPSBOVUxMKSB7CkBAIC0yMjYsMjIgKzI2NSw0NyBAQAogICovCiBzdGF0aWMgaW50IF9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbikKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAogCW5mc19tc3luY19pbm9kZShpbm9kZSk7Ci0JZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CiAJLyogR3VhcmQgYWdhaW5zdCBuZXcgZGVsZWdhdGVkIG9wZW4gY2FsbHMgKi8KIAlkb3duX3dyaXRlKCZuZnNpLT5yd3NlbSk7CiAJbmZzX2RlbGVnYXRpb25fY2xhaW1fb3BlbnMoaW5vZGUsICZkZWxlZ2F0aW9uLT5zdGF0ZWlkKTsKIAl1cF93cml0ZSgmbmZzaS0+cndzZW0pOwotCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKIAluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOwogCiAJcmV0dXJuIG5mc19kb19yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbiwgMSk7CiB9CiAKIC8qCisgKiBSZXR1cm4gYWxsIGRlbGVnYXRpb25zIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgcmV0dXJuCisgKi8KK3ZvaWQgbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKK3Jlc3RhcnQ6CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CisJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwgJmRlbGVnYXRpb24tPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2dyYWJfaW5vZGUoZGVsZWdhdGlvbik7CisJCWlmIChpbm9kZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoTkZTX0koaW5vZGUpLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQorCQkJX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24pOworCQlpcHV0KGlub2RlKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworLyoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZGVsZWdhdGlvbiB3aXRob3V0IHJlY2xhaW1pbmcgb3BlbnMKICAqIG9yIHByb3RlY3RpbmcgYWdhaW5zdCBkZWxlZ2F0aW9uIHJlY2xhaW1zLgogICogSXQgaXMgdGhlcmVmb3JlIHJlYWxseSBvbmx5IHNhZmUgdG8gYmUgY2FsbGVkIGZyb20KQEAgLTI3OSw4MyArMzQzLDU1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQoreworCXNldF9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpOworCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKK30KKwogLyoKICAqIFJldHVybiBhbGwgZGVsZWdhdGlvbnMgYXNzb2NpYXRlZCB0byBhIHN1cGVyIGJsb2NrCiAgKi8KLXZvaWQgbmZzX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgbmZzX3N1cGVyX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NCKHNiKS0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAogCWlmIChjbHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotcmVzdGFydDoKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKLQkJaWYgKGRlbGVnYXRpb24tPmlub2RlLT5pX3NiICE9IHNiKQotCQkJY29udGludWU7Ci0JCWlub2RlID0gaWdyYWIoZGVsZWdhdGlvbi0+aW5vZGUpOwotCQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKE5GU19JKGlub2RlKSwgTlVMTCk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKLQkJCV9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uKTsKLQkJaXB1dChpbm9kZSk7Ci0JCWdvdG8gcmVzdGFydDsKKwkJc3Bpbl9sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKKwkJaWYgKGRlbGVnYXRpb24tPmlub2RlICE9IE5VTEwgJiYgZGVsZWdhdGlvbi0+aW5vZGUtPmlfc2IgPT0gc2IpCisJCQlzZXRfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwgJmRlbGVnYXRpb24tPmZsYWdzKTsKKwkJc3Bpbl91bmxvY2soJmRlbGVnYXRpb24tPmxvY2spOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwluZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMoY2xwKTsKK30KKworc3RhdGljIHZvaWQgbmZzX2NsaWVudF9tYXJrX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwkJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRVRVUk4sICZkZWxlZ2F0aW9uLT5mbGFncyk7CisJCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyBpbnQgbmZzX2RvX2V4cGlyZV9hbGxfZGVsZWdhdGlvbnModm9pZCAqcHRyKQorc3RhdGljIHZvaWQgbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gcHRyOwotCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCi0JYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwotcmVzdGFydDoKLQlpZiAodGVzdF9iaXQoTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiwgJmNscC0+Y2xfc3RhdGUpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICh0ZXN0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSkgPT0gMCkKLQkJZ290byBvdXQ7Ci0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7Ci0JCWlub2RlID0gaWdyYWIoZGVsZWdhdGlvbi0+aW5vZGUpOwotCQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKE5GU19JKGlub2RlKSwgTlVMTCk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGRlbGVnYXRpb24pCi0JCQlfX25mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbik7Ci0JCWlwdXQoaW5vZGUpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotb3V0OgotCW5mc19wdXRfY2xpZW50KGNscCk7Ci0JbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKKwlpZiAodGVzdF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKSkKKwkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKIHZvaWQgbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0KLQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOwotCXRhc2sgPSBrdGhyZWFkX3J1bihuZnNfZG9fZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucywgY2xwLAotCQkJCSIlcy1kZWxlZ3JldHVybiIsCi0JCQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwKLQkJCQkJCQlSUENfRElTUExBWV9BRERSKSk7Ci0JaWYgKCFJU19FUlIodGFzaykpCi0JCXJldHVybjsKLQluZnNfcHV0X2NsaWVudChjbHApOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKGNscCk7CisJbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKIH0KIAogLyoKQEAgLTM2Myw2OCArMzk5LDI5IEBACiAgKi8KIHZvaWQgbmZzX2hhbmRsZV9jYl9wYXRoZG93bihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCiAJaWYgKGNscCA9PSBOVUxMKQogCQlyZXR1cm47Ci1yZXN0YXJ0OgorCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKGNscCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19jbGllbnRfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7Ci0JCWlub2RlID0gaWdyYWIoZGVsZWdhdGlvbi0+aW5vZGUpOwotCQlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChORlNfREVMRUdBVElPTl9SRUZFUkVOQ0VELCAmZGVsZWdhdGlvbi0+ZmxhZ3MpKQogCQkJY29udGludWU7Ci0JCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoTkZTX0koaW5vZGUpLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQotCQkJX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24pOwotCQlpcHV0KGlub2RlKTsKLQkJZ290byByZXN0YXJ0OworCQlzZXRfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwgJmRlbGVnYXRpb24tPmZsYWdzKTsKKwkJc2V0X2JpdChORlM0Q0xOVF9ERUxFR1JFVFVSTiwgJmNscC0+Y2xfc3RhdGUpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RydWN0IHJlY2FsbF90aHJlYWRhcmdzIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7Ci0JY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkOwotCi0Jc3RydWN0IGNvbXBsZXRpb24gc3RhcnRlZDsKLQlpbnQgcmVzdWx0OwotfTsKLQotc3RhdGljIGludCByZWNhbGxfdGhyZWFkKHZvaWQgKmRhdGEpCit2b2lkIG5mc19leHBpcmVfdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7Ci0Jc3RydWN0IHJlY2FsbF90aHJlYWRhcmdzICphcmdzID0gKHN0cnVjdCByZWNhbGxfdGhyZWFkYXJncyAqKWRhdGE7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGlncmFiKGFyZ3MtPmlub2RlKTsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7Ci0Jc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKLQlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247Ci0KLQlkYWVtb25pemUoIm5mc3Y0LWRlbGVncmV0dXJuIik7Ci0KLQluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOwotCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOwotCWRvd25fd3JpdGUoJm5mc2ktPnJ3c2VtKTsKLQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQobmZzaSwgYXJncy0+c3RhdGVpZCk7Ci0JaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKLQkJYXJncy0+cmVzdWx0ID0gMDsKLQllbHNlCi0JCWFyZ3MtPnJlc3VsdCA9IC1FTk9FTlQ7Ci0Jc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JY29tcGxldGUoJmFyZ3MtPnN0YXJ0ZWQpOwotCW5mc19kZWxlZ2F0aW9uX2NsYWltX29wZW5zKGlub2RlLCBhcmdzLT5zdGF0ZWlkKTsKLQl1cF93cml0ZSgmbmZzaS0+cndzZW0pOwotCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKLQluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOwotCi0JaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKLQkJbmZzX2RvX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uLCAxKTsKLQlpcHV0KGlub2RlKTsKLQltb2R1bGVfcHV0X2FuZF9leGl0KDApOworCW5mc19jbGllbnRfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKGNscCk7CisJbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKIH0KIAogLyoKQEAgLTQzMiwyMiArNDI5LDIwIEBACiAgKi8KIGludCBuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQogewotCXN0cnVjdCByZWNhbGxfdGhyZWFkYXJncyBkYXRhID0gewotCQkuaW5vZGUgPSBpbm9kZSwKLQkJLnN0YXRlaWQgPSBzdGF0ZWlkLAotCX07Ci0JaW50IHN0YXR1czsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkYXRhLnN0YXJ0ZWQpOwotCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0Jc3RhdHVzID0ga2VybmVsX3RocmVhZChyZWNhbGxfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfS0VSTkVMKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBvdXRfbW9kdWxlX3B1dDsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLnN0YXJ0ZWQpOwotCXJldHVybiBkYXRhLnJlc3VsdDsKLW91dF9tb2R1bGVfcHV0OgotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCXJldHVybiBzdGF0dXM7CisJcmN1X3JlYWRfbG9jaygpOworCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UoTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uKTsKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IG1lbWNtcChkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHN0YXRlaWQtPmRhdGEsCisJCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSkpICE9IDApIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwluZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihjbHAsIGRlbGVnYXRpb24pOworCXJjdV9yZWFkX3VubG9jaygpOworCW5mc19kZWxlZ2F0aW9uX3J1bl9zdGF0ZV9tYW5hZ2VyKGNscCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00NTksMTAgKzQ1NCwxNCBAQAogCXN0cnVjdCBpbm9kZSAqcmVzID0gTlVMTDsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKLQkJaWYgKG5mc19jb21wYXJlX2ZoKGZoYW5kbGUsICZORlNfSShkZWxlZ2F0aW9uLT5pbm9kZSktPmZoKSA9PSAwKSB7CisJCXNwaW5fbG9jaygmZGVsZWdhdGlvbi0+bG9jayk7CisJCWlmIChkZWxlZ2F0aW9uLT5pbm9kZSAhPSBOVUxMICYmCisJCSAgICBuZnNfY29tcGFyZV9maChmaGFuZGxlLCAmTkZTX0koZGVsZWdhdGlvbi0+aW5vZGUpLT5maCkgPT0gMCkgewogCQkJcmVzID0gaWdyYWIoZGVsZWdhdGlvbi0+aW5vZGUpOwotCQkJYnJlYWs7CiAJCX0KKwkJc3Bpbl91bmxvY2soJmRlbGVnYXRpb24tPmxvY2spOworCQlpZiAocmVzICE9IE5VTEwpCisJCQlicmVhazsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJlczsKQEAgLTQ3Niw3ICs0NzUsNyBAQAogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpCi0JCWRlbGVnYXRpb24tPmZsYWdzIHw9IE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTTsKKwkJc2V0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKQEAgLTQ4NiwxNyArNDg1LDIyIEBACiB2b2lkIG5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiByZXN0YXJ0OgogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgewotCQlpZiAoKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSA9PSAwKQorCQlpZiAodGVzdF9iaXQoTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpID09IDApCisJCQljb250aW51ZTsKKwkJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9ncmFiX2lub2RlKGRlbGVnYXRpb24pOworCQlpZiAoaW5vZGUgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKE5GU19JKGRlbGVnYXRpb24tPmlub2RlKSwgTlVMTCk7CisJCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKE5GU19JKGlub2RlKSwgTlVMTCk7CiAJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKIAkJCW5mc19mcmVlX2RlbGVnYXRpb24oZGVsZWdhdGlvbik7CisJCWlwdXQoaW5vZGUpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RlbGVnYXRpb24uaCBiL2ZzL25mcy9kZWxlZ2F0aW9uLmgKaW5kZXggZjFjNWUyYS4uMDlmMzgzNyAxMDA2NDQKLS0tIGEvZnMvbmZzL2RlbGVnYXRpb24uaAorKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5oCkBAIC0xNywxNCArMTcsMjAgQEAKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAluZnM0X3N0YXRlaWQgc3RhdGVpZDsKLQlpbnQgdHlwZTsKLSNkZWZpbmUgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNIDEKLQlsb25nIGZsYWdzOworCWZtb2RlX3QgdHlwZTsKIAlsb2ZmX3QgbWF4c2l6ZTsKIAlfX3U2NCBjaGFuZ2VfYXR0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKIAorZW51bSB7CisJTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNID0gMCwKKwlORlNfREVMRUdBVElPTl9SRVRVUk4sCisJTkZTX0RFTEVHQVRJT05fUkVGRVJFTkNFRCwKK307CisKIGludCBuZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcyk7CiB2b2lkIG5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcyk7CiBpbnQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtMzIsOSArMzgsMTEgQEAKIHZvaWQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uX25vcmVjbGFpbShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogc3RydWN0IGlub2RlICpuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpOwotdm9pZCBuZnNfcmV0dXJuX2FsbF9kZWxlZ2F0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3ZvaWQgbmZzX3N1cGVyX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiB2b2lkIG5mc19leHBpcmVfYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwordm9pZCBuZnNfZXhwaXJlX3VucmVmZXJlbmNlZF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKIHZvaWQgbmZzX2hhbmRsZV9jYl9wYXRoZG93bihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKK3ZvaWQgbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogCiB2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKIHZvaWQgbmZzX2RlbGVnYXRpb25fcmVhcF91bmNsYWltZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CkBAIC00NSwyMiArNTMsMTEgQEAKIGludCBuZnM0X2xvY2tfZGVsZWdhdGlvbl9yZWNhbGwoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CiBpbnQgbmZzNF9jb3B5X2RlbGVnYXRpb25fc3RhdGVpZChuZnM0X3N0YXRlaWQgKmRzdCwgc3RydWN0IGlub2RlICppbm9kZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQotewotCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKLQlpbnQgcmV0ID0gMDsKLQotCWZsYWdzICY9IEZNT0RFX1JFQUR8Rk1PREVfV1JJVEU7Ci0JcmN1X3JlYWRfbG9jaygpOwotCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UoTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uKTsKLQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMICYmIChkZWxlZ2F0aW9uLT50eXBlICYgZmxhZ3MpID09IGZsYWdzKQotCQlyZXQgPSAxOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiByZXQ7Ci19Cit2b2lkIG5mc19tYXJrX2RlbGVnYXRpb25fcmVmZXJlbmNlZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pOworaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbGFncyk7CiAKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBuZnNfaGF2ZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbGFncykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXIuYyBiL2ZzL25mcy9kaXIuYwppbmRleCAzZTY0Yjk4Li5lMzVjODE5IDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyLmMKKysrIGIvZnMvbmZzL2Rpci5jCkBAIC03OTksNiArNzk5LDkgQEAKIAkJZ290byBvdXRfYmFkOwogCX0KIAorCWlmIChuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKKwkJZ290byBvdXRfc2V0X3ZlcmlmaWVyOworCiAJLyogRm9yY2UgYSBmdWxsIGxvb2sgdXAgaWZmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkICovCiAJaWYgKCFuZnNfaXNfZXhjbHVzaXZlX2NyZWF0ZShkaXIsIG5kKSAmJiBuZnNfY2hlY2tfdmVyaWZpZXIoZGlyLCBkZW50cnkpKSB7CiAJCWlmIChuZnNfbG9va3VwX3ZlcmlmeV9pbm9kZShpbm9kZSwgbmQpKQpAQCAtODE3LDYgKzgyMCw3IEBACiAJaWYgKChlcnJvciA9IG5mc19yZWZyZXNoX2lub2RlKGlub2RlLCAmZmF0dHIpKSAhPSAwKQogCQlnb3RvIG91dF9iYWQ7CiAKK291dF9zZXRfdmVyaWZpZXI6CiAJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CiAgb3V0X3ZhbGlkOgogCWRwdXQocGFyZW50KTsKQEAgLTk3Myw3ICs5NzcsNyBAQAogICogVXNlIGludGVudCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUKICAqIHRoZSBORlN2NC1zdHlsZSBzdGF0ZWZ1bCBPUEVOIGZvciB0aGUgTE9PS1VQIGNhbGwKICAqLwotc3RhdGljIGludCBpc19hdG9taWNfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW50IGlzX2F0b21pY19vcGVuKHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWlmIChuZCA9PSBOVUxMIHx8IG5mc19sb29rdXBfY2hlY2tfaW50ZW50KG5kLCBMT09LVVBfT1BFTikgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC05OTYsNyArMTAwMCw3IEBACiAJCQlkaXItPmlfc2ItPnNfaWQsIGRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCiAJLyogQ2hlY2sgdGhhdCB3ZSBhcmUgaW5kZWVkIHRyeWluZyB0byBvcGVuIHRoaXMgZmlsZSAqLwotCWlmICghaXNfYXRvbWljX29wZW4oZGlyLCBuZCkpCisJaWYgKCFpc19hdG9taWNfb3BlbihuZCkpCiAJCWdvdG8gbm9fb3BlbjsKIAogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBORlNfU0VSVkVSKGRpciktPm5hbWVsZW4pIHsKQEAgLTEwNDcsMTAgKzEwNTEsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmRpcjsKIAlpbnQgb3BlbmZsYWdzLCByZXQgPSAwOwogCisJaWYgKCFpc19hdG9taWNfb3BlbihuZCkpCisJCWdvdG8gbm9fb3BlbjsKIAlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwogCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKLQlpZiAoIWlzX2F0b21pY19vcGVuKGRpciwgbmQpKQotCQlnb3RvIG5vX29wZW47CiAJLyogV2UgY2FuJ3QgY3JlYXRlIG5ldyBmaWxlcyBpbiBuZnNfb3Blbl9yZXZhbGlkYXRlKCksIHNvIHdlCiAJICogb3B0aW1pemUgYXdheSByZXZhbGlkYXRpb24gb2YgbmVnYXRpdmUgZGVudHJpZXMuCiAJICovCkBAIC0xMDYyLDExICsxMDY2LDExIEBACiAKIAkvKiBORlMgb25seSBzdXBwb3J0cyBPUEVOIG9uIHJlZ3VsYXIgZmlsZXMgKi8KIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCWdvdG8gbm9fb3BlbjsKKwkJZ290byBub19vcGVuX2RwdXQ7CiAJb3BlbmZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOwogCS8qIFdlIGNhbm5vdCBkbyBleGNsdXNpdmUgY3JlYXRpb24gb24gYSBwb3NpdGl2ZSBkZW50cnkgKi8KIAlpZiAoKG9wZW5mbGFncyAmIChPX0NSRUFUfE9fRVhDTCkpID09IChPX0NSRUFUfE9fRVhDTCkpCi0JCWdvdG8gbm9fb3BlbjsKKwkJZ290byBub19vcGVuX2RwdXQ7CiAJLyogV2UgY2FuJ3QgY3JlYXRlIG5ldyBmaWxlcywgb3IgdHJ1bmNhdGUgZXhpc3Rpbmcgb25lcyBoZXJlICovCiAJb3BlbmZsYWdzICY9IH4oT19DUkVBVHxPX1RSVU5DKTsKIApAQCAtMTA4MSwxMCArMTA4NSw5IEBACiAJaWYgKCFyZXQpCiAJCWRfZHJvcChkZW50cnkpOwogCXJldHVybiByZXQ7Ci1ub19vcGVuOgorbm9fb3Blbl9kcHV0OgogCWRwdXQocGFyZW50KTsKLQlpZiAoaW5vZGUgIT0gTlVMTCAmJiBuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKLQkJcmV0dXJuIDE7Citub19vcGVuOgogCXJldHVybiBuZnNfbG9va3VwX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CiB9CiAjZW5kaWYgLyogQ09ORklHX05GU1Y0ICovCkBAIC0xNzk0LDcgKzE3OTcsOCBAQAogCWNhY2hlID0gbmZzX2FjY2Vzc19zZWFyY2hfcmJ0cmVlKGlub2RlLCBjcmVkKTsKIAlpZiAoY2FjaGUgPT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JaWYgKCF0aW1lX2luX3JhbmdlKGppZmZpZXMsIGNhY2hlLT5qaWZmaWVzLCBjYWNoZS0+amlmZmllcyArIG5mc2ktPmF0dHJ0aW1lbykpCisJaWYgKCFuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSAmJgorCSAgICAhdGltZV9pbl9yYW5nZV9vcGVuKGppZmZpZXMsIGNhY2hlLT5qaWZmaWVzLCBjYWNoZS0+amlmZmllcyArIG5mc2ktPmF0dHJ0aW1lbykpCiAJCWdvdG8gb3V0X3N0YWxlOwogCXJlcy0+amlmZmllcyA9IGNhY2hlLT5qaWZmaWVzOwogCXJlcy0+Y3JlZCA9IGNhY2hlLT5jcmVkOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCBkMjJlYjM4Li4wYzM4MTY4IDEwMDY0NAotLS0gYS9mcy9uZnMvaW5vZGUuYworKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtNTkyLDcgKzU5Miw3IEBACiAvKgogICogR2l2ZW4gYW4gaW5vZGUsIHNlYXJjaCBmb3IgYW4gb3BlbiBjb250ZXh0IHdpdGggdGhlIGRlc2lyZWQgY2hhcmFjdGVyaXN0aWNzCiAgKi8KLXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnNfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBpbnQgbW9kZSkKK3N0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnNfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBmbW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqcG9zLCAqY3R4ID0gTlVMTDsKQEAgLTcxMiwxNCArNzEyLDcgQEAKIAogCWlmIChuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKIAkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTcGVjaWFsIGNhc2U6IGlmIHRoZSBhdHRyaWJ1dGUgdGltZW91dCBpcyBzZXQgdG8gMCwgdGhlbiBhbHdheXMKLQkgKiAJCSB0cmVhdCB0aGUgY2FjaGUgYXMgaGF2aW5nIGV4cGlyZWQgKHVubGVzcyBob2xkaW5nCi0JICogCQkgYSBkZWxlZ2F0aW9uKS4KLQkgKi8KLQlpZiAobmZzaS0+YXR0cnRpbWVvID09IDApCi0JCXJldHVybiAxOwotCXJldHVybiAhdGltZV9pbl9yYW5nZShqaWZmaWVzLCBuZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMsIG5mc2ktPnJlYWRfY2FjaGVfamlmZmllcyArIG5mc2ktPmF0dHJ0aW1lbyk7CisJcmV0dXJuICF0aW1lX2luX3JhbmdlX29wZW4oamlmZmllcywgbmZzaS0+cmVhZF9jYWNoZV9qaWZmaWVzLCBuZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMgKyBuZnNpLT5hdHRydGltZW8pOwogfQogCiAvKioKQEAgLTExODIsNyArMTE3NSw3IEBACiAJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBub3c7CiAJCW5mc2ktPmF0dHJfZ2VuY291bnQgPSBuZnNfaW5jX2F0dHJfZ2VuZXJhdGlvbl9jb3VudGVyKCk7CiAJfSBlbHNlIHsKLQkJaWYgKCF0aW1lX2luX3JhbmdlKG5vdywgbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCwgbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCArIG5mc2ktPmF0dHJ0aW1lbykpIHsKKwkJaWYgKCF0aW1lX2luX3JhbmdlX29wZW4obm93LCBuZnNpLT5hdHRydGltZW9fdGltZXN0YW1wLCBuZnNpLT5hdHRydGltZW9fdGltZXN0YW1wICsgbmZzaS0+YXR0cnRpbWVvKSkgewogCQkJaWYgKChuZnNpLT5hdHRydGltZW8gPDw9IDEpID4gTkZTX01BWEFUVFJUSU1FTyhpbm9kZSkpCiAJCQkJbmZzaS0+YXR0cnRpbWVvID0gTkZTX01BWEFUVFJUSU1FTyhpbm9kZSk7CiAJCQluZnNpLT5hdHRydGltZW9fdGltZXN0YW1wID0gbm93OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaAppbmRleCBkMjEyZWU0Li4zNDBlZGU4IDEwMDY0NAotLS0gYS9mcy9uZnMvaW50ZXJuYWwuaAorKysgYi9mcy9uZnMvaW50ZXJuYWwuaApAQCAtNjMsNiArNjMsMjAgQEAKIAlzdHJ1Y3Qgc2VjdXJpdHlfbW50X29wdHMgbHNtX29wdHM7CiB9OwogCisvKiBtb3VudF9jbG50LmMgKi8KK3N0cnVjdCBuZnNfbW91bnRfcmVxdWVzdCB7CisJc3RydWN0IHNvY2thZGRyCQkqc2FwOworCXNpemVfdAkJCXNhbGVuOworCWNoYXIJCQkqaG9zdG5hbWU7CisJY2hhcgkJCSpkaXJwYXRoOworCXUzMgkJCXZlcnNpb247CisJdW5zaWduZWQgc2hvcnQJCXByb3RvY29sOworCXN0cnVjdCBuZnNfZmgJCSpmaDsKKwlpbnQJCQlub3Jlc3Zwb3J0OworfTsKKworZXh0ZXJuIGludCBuZnNfbW91bnQoc3RydWN0IG5mc19tb3VudF9yZXF1ZXN0ICppbmZvKTsKKwogLyogY2xpZW50LmMgKi8KIGV4dGVybiBzdHJ1Y3QgcnBjX3Byb2dyYW0gbmZzX3Byb2dyYW07CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9tb3VudF9jbG50LmMgYi9mcy9uZnMvbW91bnRfY2xudC5jCmluZGV4IDA4NmE2ODMuLmNhOTA1YTUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9tb3VudF9jbG50LmMKKysrIGIvZnMvbmZzL21vdW50X2NsbnQuYwpAQCAtMjksNDcgKzI5LDQzIEBACiAKIC8qKgogICogbmZzX21vdW50IC0gT2J0YWluIGFuIE5GUyBmaWxlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIGhvc3QgYW5kIHBhdGgKLSAqIEBhZGRyOiBwb2ludGVyIHRvIHNlcnZlcidzIGFkZHJlc3MKLSAqIEBsZW46IHNpemUgb2Ygc2VydmVyJ3MgYWRkcmVzcwotICogQGhvc3RuYW1lOiBuYW1lIG9mIHNlcnZlciBob3N0LCBvciBOVUxMCi0gKiBAcGF0aDogcG9pbnRlciB0byBzdHJpbmcgY29udGFpbmluZyBleHBvcnQgcGF0aCB0byBtb3VudAotICogQHZlcnNpb246IG1vdW50IHZlcnNpb24gdG8gdXNlIGZvciB0aGlzIHJlcXVlc3QKLSAqIEBwcm90b2NvbDogdHJhbnNwb3J0IHByb3RvY29sIHRvIHVzZSBmb3IgdGhpZSByZXF1ZXN0Ci0gKiBAZmg6IHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcGxhY2UgcmV0dXJuZWQgZmlsZSBoYW5kbGUKKyAqIEBpbmZvOiBwb2ludGVyIHRvIG1vdW50IHJlcXVlc3QgYXJndW1lbnRzCiAgKgogICogVXNlcyBkZWZhdWx0IHRpbWVvdXQgcGFyYW1ldGVycyBzcGVjaWZpZWQgYnkgdW5kZXJseWluZyB0cmFuc3BvcnQuCiAgKi8KLWludCBuZnNfbW91bnQoc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgbGVuLCBjaGFyICpob3N0bmFtZSwgY2hhciAqcGF0aCwKLQkgICAgICBpbnQgdmVyc2lvbiwgaW50IHByb3RvY29sLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK2ludCBuZnNfbW91bnQoc3RydWN0IG5mc19tb3VudF9yZXF1ZXN0ICppbmZvKQogewogCXN0cnVjdCBtbnRfZmhzdGF0dXMJcmVzdWx0ID0gewotCQkuZmgJCT0gZmgKKwkJLmZoCQk9IGluZm8tPmZoCiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnCT0gewotCQkucnBjX2FyZ3AJPSBwYXRoLAorCQkucnBjX2FyZ3AJPSBpbmZvLT5kaXJwYXRoLAogCQkucnBjX3Jlc3AJPSAmcmVzdWx0LAogCX07CiAJc3RydWN0IHJwY19jcmVhdGVfYXJncyBhcmdzID0gewotCQkucHJvdG9jb2wJPSBwcm90b2NvbCwKLQkJLmFkZHJlc3MJPSBhZGRyLAotCQkuYWRkcnNpemUJPSBsZW4sCi0JCS5zZXJ2ZXJuYW1lCT0gaG9zdG5hbWUsCisJCS5wcm90b2NvbAk9IGluZm8tPnByb3RvY29sLAorCQkuYWRkcmVzcwk9IGluZm8tPnNhcCwKKwkJLmFkZHJzaXplCT0gaW5mby0+c2FsZW4sCisJCS5zZXJ2ZXJuYW1lCT0gaW5mby0+aG9zdG5hbWUsCiAJCS5wcm9ncmFtCT0gJm1udF9wcm9ncmFtLAotCQkudmVyc2lvbgk9IHZlcnNpb24sCisJCS52ZXJzaW9uCT0gaW5mby0+dmVyc2lvbiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAotCQkuZmxhZ3MJCT0gMCwKIAl9OwogCXN0cnVjdCBycGNfY2xudAkJKm1udF9jbG50OwogCWludAkJCXN0YXR1czsKIAogCWRwcmludGsoIk5GUzogc2VuZGluZyBNTlQgcmVxdWVzdCBmb3IgJXM6JXNcbiIsCi0JCShob3N0bmFtZSA/IGhvc3RuYW1lIDogInNlcnZlciIpLCBwYXRoKTsKKwkJKGluZm8tPmhvc3RuYW1lID8gaW5mby0+aG9zdG5hbWUgOiAic2VydmVyIiksCisJCQlpbmZvLT5kaXJwYXRoKTsKKworCWlmIChpbmZvLT5ub3Jlc3Zwb3J0KQorCQlhcmdzLmZsYWdzIHw9IFJQQ19DTE5UX0NSRUFURV9OT05QUklWUE9SVDsKIAogCW1udF9jbG50ID0gcnBjX2NyZWF0ZSgmYXJncyk7CiAJaWYgKElTX0VSUihtbnRfY2xudCkpCiAJCWdvdG8gb3V0X2NsbnRfZXJyOwogCi0JaWYgKHZlcnNpb24gPT0gTkZTX01OVDNfVkVSU0lPTikKKwlpZiAoaW5mby0+dmVyc2lvbiA9PSBORlNfTU5UM19WRVJTSU9OKQogCQltc2cucnBjX3Byb2MgPSAmbW50X2NsbnQtPmNsX3Byb2NpbmZvW01PVU5UUFJPQzNfTU5UXTsKIAllbHNlCiAJCW1zZy5ycGNfcHJvYyA9ICZtbnRfY2xudC0+Y2xfcHJvY2luZm9bTU5UUFJPQ19NTlRdOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRfZnMuaCBiL2ZzL25mcy9uZnM0X2ZzLmgKaW5kZXggZWE3OTA2NC4uNGU0ZDMzMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRfZnMuaAorKysgYi9mcy9uZnMvbmZzNF9mcy5oCkBAIC0zOCw4ICszOCwxMiBAQAogICgoZXJyKSAhPSBORlNFUlJfTk9GSUxFSEFORExFKSkKIAogZW51bSBuZnM0X2NsaWVudF9zdGF0ZSB7Ci0JTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiAgPSAwLAorCU5GUzRDTE5UX01BTkFHRVJfUlVOTklORyAgPSAwLAorCU5GUzRDTE5UX0NIRUNLX0xFQVNFLAogCU5GUzRDTE5UX0xFQVNFX0VYUElSRUQsCisJTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsCisJTkZTNENMTlRfUkVDTEFJTV9OT0dSQUNFLAorCU5GUzRDTE5UX0RFTEVHUkVUVVJOLAogfTsKIAogLyoKQEAgLTkwLDEyICs5NCwxOCBAQAogCiAJc3BpbmxvY2tfdAkgICAgIHNvX2xvY2s7CiAJYXRvbWljX3QJICAgICBzb19jb3VudDsKKwl1bnNpZ25lZCBsb25nCSAgICAgc29fZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgc29fc3RhdGVzOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgIHNvX2RlbGVnYXRpb25zOwogCXN0cnVjdCBuZnNfc2VxaWRfY291bnRlciBzb19zZXFpZDsKIAlzdHJ1Y3QgcnBjX3NlcXVlbmNlICBzb19zZXF1ZW5jZTsKIH07CiAKK2VudW0geworCU5GU19PV05FUl9SRUNMQUlNX1JFQk9PVCwKKwlORlNfT1dORVJfUkVDTEFJTV9OT0dSQUNFCit9OworCiAvKgogICogc3RydWN0IG5mczRfc3RhdGUgbWFpbnRhaW5zIHRoZSBjbGllbnQtc2lkZSBzdGF0ZSBmb3IgYSBnaXZlbgogICogKHN0YXRlX293bmVyLGlub2RlKSB0dXBsZSAoT1BFTikgb3Igc3RhdGVfb3duZXIgKExPQ0spLgpAQCAtMTI4LDYgKzEzOCw4IEBACiAJTkZTX09fUkRPTkxZX1NUQVRFLAkJLyogT1BFTiBzdGF0ZWlkIGhhcyByZWFkLW9ubHkgc3RhdGUgKi8KIAlORlNfT19XUk9OTFlfU1RBVEUsCQkvKiBPUEVOIHN0YXRlaWQgaGFzIHdyaXRlLW9ubHkgc3RhdGUgKi8KIAlORlNfT19SRFdSX1NUQVRFLAkJLyogT1BFTiBzdGF0ZWlkIGhhcyByZWFkL3dyaXRlIHN0YXRlICovCisJTkZTX1NUQVRFX1JFQ0xBSU1fUkVCT09ULAkvKiBPUEVOIHN0YXRlaWQgc2VydmVyIHJlYm9vdGVkICovCisJTkZTX1NUQVRFX1JFQ0xBSU1fTk9HUkFDRSwJLyogT1BFTiBzdGF0ZWlkIG5lZWRzIHRvIHJlY292ZXIgc3RhdGUgKi8KIH07CiAKIHN0cnVjdCBuZnM0X3N0YXRlIHsKQEAgLTE0OSw3ICsxNjEsNyBAQAogCXVuc2lnbmVkIGludCBuX3Jkb25seTsJCS8qIE51bWJlciBvZiByZWFkLW9ubHkgcmVmZXJlbmNlcyAqLwogCXVuc2lnbmVkIGludCBuX3dyb25seTsJCS8qIE51bWJlciBvZiB3cml0ZS1vbmx5IHJlZmVyZW5jZXMgKi8KIAl1bnNpZ25lZCBpbnQgbl9yZHdyOwkJLyogTnVtYmVyIG9mIHJlYWQvd3JpdGUgcmVmZXJlbmNlcyAqLwotCWludCBzdGF0ZTsJCQkvKiBTdGF0ZSBvbiB0aGUgc2VydmVyIChSLFcsIG9yIFJXKSAqLworCWZtb2RlX3Qgc3RhdGU7CQkJLyogU3RhdGUgb24gdGhlIHNlcnZlciAoUixXLCBvciBSVykgKi8KIAlhdG9taWNfdCBjb3VudDsKIH07CiAKQEAgLTE1Nyw5ICsxNjksMTIgQEAKIHN0cnVjdCBuZnM0X2V4Y2VwdGlvbiB7CiAJbG9uZyB0aW1lb3V0OwogCWludCByZXRyeTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiB9OwogCiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgeworCWludCBvd25lcl9mbGFnX2JpdDsKKwlpbnQgc3RhdGVfZmxhZ19iaXQ7CiAJaW50ICgqcmVjb3Zlcl9vcGVuKShzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKTsKIAlpbnQgKCpyZWNvdmVyX2xvY2spKHN0cnVjdCBuZnM0X3N0YXRlICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiB9OwpAQCAtMTc0LDcgKzE4OSw2IEBACiAKIAogLyogbmZzNHByb2MuYyAqLwotZXh0ZXJuIGludCBuZnM0X21hcF9lcnJvcnMoaW50IGVycik7CiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCB1MzIsIHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2FzeW5jX3JlbmV3KHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKQEAgLTE4Nyw3ICsyMDEsNyBAQAogCQlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKmZzX2xvY2F0aW9ucywgc3RydWN0IHBhZ2UgKnBhZ2UpOwogCiBleHRlcm4gc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzIG5mczRfcmVib290X3JlY292ZXJ5X29wczsKLWV4dGVybiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9uZXR3b3JrX3BhcnRpdGlvbl9yZWNvdmVyeV9vcHM7CitleHRlcm4gc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzIG5mczRfbm9ncmFjZV9yZWNvdmVyeV9vcHM7CiAKIGV4dGVybiBjb25zdCB1MzIgbmZzNF9mYXR0cl9iaXRtYXBbMl07CiBleHRlcm4gY29uc3QgdTMyIG5mczRfc3RhdGZzX2JpdG1hcFsyXTsKQEAgLTIwMiwxNiArMjE2LDE4IEBACiBleHRlcm4gdm9pZCBuZnM0X3JlbmV3X3N0YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIAogLyogbmZzNHN0YXRlLmMgKi8KLXN0cnVjdCBycGNfY3JlZCAqbmZzNF9nZXRfcmVuZXdfY3JlZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKK3N0cnVjdCBycGNfY3JlZCAqbmZzNF9nZXRfcmVuZXdfY3JlZF9sb2NrZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiAKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqIG5mczRfZ2V0X3N0YXRlX293bmVyKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiB2b2lkIG5mczRfcHV0X3N0YXRlX293bmVyKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICopOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3N0YXRlICogbmZzNF9nZXRfb3Blbl9zdGF0ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKik7CiBleHRlcm4gdm9pZCBuZnM0X3B1dF9vcGVuX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICopOwotZXh0ZXJuIHZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBtb2RlX3QpOwotZXh0ZXJuIHZvaWQgbmZzNF9jbG9zZV9zeW5jKHN0cnVjdCBwYXRoICosIHN0cnVjdCBuZnM0X3N0YXRlICosIG1vZGVfdCk7Ci1leHRlcm4gdm9pZCBuZnM0X3N0YXRlX3NldF9tb2RlX2xvY2tlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBtb2RlX3QpOworZXh0ZXJuIHZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBmbW9kZV90KTsKK2V4dGVybiB2b2lkIG5mczRfY2xvc2Vfc3luYyhzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBmbW9kZV90KTsKK2V4dGVybiB2b2lkIG5mczRfc3RhdGVfc2V0X21vZGVfbG9ja2VkKHN0cnVjdCBuZnM0X3N0YXRlICosIGZtb2RlX3QpOwogZXh0ZXJuIHZvaWQgbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKK2V4dGVybiB2b2lkIG5mczRfc2NoZWR1bGVfc3RhdGVfbWFuYWdlcihzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKK2V4dGVybiBpbnQgbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpOwogZXh0ZXJuIHZvaWQgbmZzNF9wdXRfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApOwogZXh0ZXJuIGludCBuZnM0X3NldF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogZXh0ZXJuIHZvaWQgbmZzNF9jb3B5X3N0YXRlaWQobmZzNF9zdGF0ZWlkICosIHN0cnVjdCBuZnM0X3N0YXRlICosIGZsX293bmVyX3QpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCA4M2U3MDBhLi44ZGRlODRiIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtNjIsMTQgKzYyLDEyIEBACiBzdHJ1Y3QgbmZzNF9vcGVuZGF0YTsKIHN0YXRpYyBpbnQgX25mczRfcHJvY19vcGVuKHN0cnVjdCBuZnM0X29wZW5kYXRhICpkYXRhKTsKIHN0YXRpYyBpbnQgbmZzNF9kb19mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKiwgc3RydWN0IG5mc19maCAqLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqKTsKLXN0YXRpYyBpbnQgbmZzNF9hc3luY19oYW5kbGVfZXJyb3Ioc3RydWN0IHJwY190YXNrICosIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICopOwotc3RhdGljIGludCBuZnM0X2hhbmRsZV9leGNlcHRpb24oY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IGVycm9yY29kZSwgc3RydWN0IG5mczRfZXhjZXB0aW9uICpleGNlcHRpb24pOwotc3RhdGljIGludCBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mc19jbGllbnQgKmNscCk7CitzdGF0aWMgaW50IG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHN0cnVjdCBycGNfdGFzayAqLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKTsKIHN0YXRpYyBpbnQgX25mczRfcHJvY19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cik7CiBzdGF0aWMgaW50IF9uZnM0X3Byb2NfZ2V0YXR0cihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cik7CiAKIC8qIFByZXZlbnQgbGVha3Mgb2YgTkZTdjQgZXJyb3JzIGludG8gdXNlcmxhbmQgKi8KLWludCBuZnM0X21hcF9lcnJvcnMoaW50IGVycikKK3N0YXRpYyBpbnQgbmZzNF9tYXBfZXJyb3JzKGludCBlcnIpCiB7CiAJaWYgKGVyciA8IC0xMDAwKSB7CiAJCWRwcmludGsoIiVzIGNvdWxkIG5vdCBoYW5kbGUgTkZTdjQgZXJyb3IgJWRcbiIsCkBAIC0xOTUsNiArMTkzLDgzIEBACiAJa3VubWFwX2F0b21pYyhzdGFydCwgS01fVVNFUjApOwogfQogCitzdGF0aWMgaW50IG5mczRfd2FpdF9iaXRfa2lsbGFibGUodm9pZCAqd29yZCkKK3sKKwlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc2NoZWR1bGUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJaW50IHJlczsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlyZXMgPSB3YWl0X29uX2JpdCgmY2xwLT5jbF9zdGF0ZSwgTkZTNENMTlRfTUFOQUdFUl9SVU5OSU5HLAorCQkJbmZzNF93YWl0X2JpdF9raWxsYWJsZSwgVEFTS19LSUxMQUJMRSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBuZnM0X2RlbGF5KHN0cnVjdCBycGNfY2xudCAqY2xudCwgbG9uZyAqdGltZW91dCkKK3sKKwlpbnQgcmVzID0gMDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlpZiAoKnRpbWVvdXQgPD0gMCkKKwkJKnRpbWVvdXQgPSBORlM0X1BPTExfUkVUUllfTUlOOworCWlmICgqdGltZW91dCA+IE5GUzRfUE9MTF9SRVRSWV9NQVgpCisJCSp0aW1lb3V0ID0gTkZTNF9QT0xMX1JFVFJZX01BWDsKKwlzY2hlZHVsZV90aW1lb3V0X2tpbGxhYmxlKCp0aW1lb3V0KTsKKwlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwkqdGltZW91dCA8PD0gMTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBUaGlzIGlzIHRoZSBlcnJvciBoYW5kbGluZyByb3V0aW5lIGZvciBwcm9jZXNzZXMgdGhhdCBhcmUgYWxsb3dlZAorICogdG8gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgbmZzNF9oYW5kbGVfZXhjZXB0aW9uKGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGludCBlcnJvcmNvZGUsIHN0cnVjdCBuZnM0X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQoreworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mc19jbGllbnQ7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlID0gZXhjZXB0aW9uLT5zdGF0ZTsKKwlpbnQgcmV0ID0gZXJyb3Jjb2RlOworCisJZXhjZXB0aW9uLT5yZXRyeSA9IDA7CisJc3dpdGNoKGVycm9yY29kZSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAtTkZTNEVSUl9BRE1JTl9SRVZPS0VEOgorCQljYXNlIC1ORlM0RVJSX0JBRF9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX09QRU5NT0RFOgorCQkJaWYgKHN0YXRlID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQluZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9ub2dyYWNlKGNscCwgc3RhdGUpOworCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgorCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3ZlcnkoY2xwKTsKKwkJCXJldCA9IG5mczRfd2FpdF9jbG50X3JlY292ZXIoY2xwKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlleGNlcHRpb24tPnJldHJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIC1ORlM0RVJSX0ZJTEVfT1BFTjoKKwkJY2FzZSAtTkZTNEVSUl9HUkFDRToKKwkJY2FzZSAtTkZTNEVSUl9ERUxBWToKKwkJCXJldCA9IG5mczRfZGVsYXkoc2VydmVyLT5jbGllbnQsICZleGNlcHRpb24tPnRpbWVvdXQpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWJyZWFrOworCQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgorCQkJZXhjZXB0aW9uLT5yZXRyeSA9IDE7CisJfQorCS8qIFdlIGZhaWxlZCB0byBoYW5kbGUgdGhlIGVycm9yICovCisJcmV0dXJuIG5mczRfbWFwX2Vycm9ycyhyZXQpOworfQorCisKIHN0YXRpYyB2b2lkIHJlbmV3X2xlYXNlKGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mc19jbGllbnQ7CkBAIC0yNDgsNyArMzIzLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X29wZW5kYXRhICpuZnM0X29wZW5kYXRhX2FsbG9jKHN0cnVjdCBwYXRoICpwYXRoLAotCQlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsIGludCBmbGFncywKKwkJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCBmbW9kZV90IGZtb2RlLCBpbnQgZmxhZ3MsCiAJCWNvbnN0IHN0cnVjdCBpYXR0ciAqYXR0cnMpCiB7CiAJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGdldF9wYXJlbnQocGF0aC0+ZGVudHJ5KTsKQEAgLTI2OCw3ICszNDMsOCBAQAogCXAtPm93bmVyID0gc3A7CiAJYXRvbWljX2luYygmc3AtPnNvX2NvdW50KTsKIAlwLT5vX2FyZy5maCA9IE5GU19GSChkaXIpOwotCXAtPm9fYXJnLm9wZW5fZmxhZ3MgPSBmbGFncywKKwlwLT5vX2FyZy5vcGVuX2ZsYWdzID0gZmxhZ3M7CisJcC0+b19hcmcuZm1vZGUgPSBmbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAlwLT5vX2FyZy5jbGllbnRpZCA9IHNlcnZlci0+bmZzX2NsaWVudC0+Y2xfY2xpZW50aWQ7CiAJcC0+b19hcmcuaWQgPSBzcC0+c29fb3duZXJfaWQuaWQ7CiAJcC0+b19hcmcubmFtZSA9ICZwLT5wYXRoLmRlbnRyeS0+ZF9uYW1lOwpAQCAtMzI0LDEwICs0MDAsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGNhbl9vcGVuX2NhY2hlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCBtb2RlKQorc3RhdGljIGludCBjYW5fb3Blbl9jYWNoZWQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IG1vZGUsIGludCBvcGVuX21vZGUpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3dpdGNoIChtb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8T19FWENMKSkgeworCisJaWYgKG9wZW5fbW9kZSAmIE9fRVhDTCkKKwkJZ290byBvdXQ7CisJc3dpdGNoIChtb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKSB7CiAJCWNhc2UgRk1PREVfUkVBRDoKIAkJCXJldCB8PSB0ZXN0X2JpdChORlNfT19SRE9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpICE9IDA7CiAJCQlicmVhazsKQEAgLTMzNywyMSArNDE2LDIzIEBACiAJCWNhc2UgRk1PREVfUkVBRHxGTU9ERV9XUklURToKIAkJCXJldCB8PSB0ZXN0X2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSAhPSAwOwogCX0KK291dDoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGNhbl9vcGVuX2RlbGVnYXRlZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sIG1vZGVfdCBvcGVuX2ZsYWdzKQorc3RhdGljIGludCBjYW5fb3Blbl9kZWxlZ2F0ZWQoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uLCBmbW9kZV90IGZtb2RlKQogewotCWlmICgoZGVsZWdhdGlvbi0+dHlwZSAmIG9wZW5fZmxhZ3MpICE9IG9wZW5fZmxhZ3MpCisJaWYgKChkZWxlZ2F0aW9uLT50eXBlICYgZm1vZGUpICE9IGZtb2RlKQogCQlyZXR1cm4gMDsKLQlpZiAoZGVsZWdhdGlvbi0+ZmxhZ3MgJiBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0pCisJaWYgKHRlc3RfYml0KE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSwgJmRlbGVnYXRpb24tPmZsYWdzKSkKIAkJcmV0dXJuIDA7CisJbmZzX21hcmtfZGVsZWdhdGlvbl9yZWZlcmVuY2VkKGRlbGVnYXRpb24pOwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfb3Blbl9zdGF0ZWZsYWdzKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbW9kZV90IG9wZW5fZmxhZ3MpCitzdGF0aWMgdm9pZCB1cGRhdGVfb3Blbl9zdGF0ZWZsYWdzKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZm1vZGVfdCBmbW9kZSkKIHsKLQlzd2l0Y2ggKG9wZW5fZmxhZ3MpIHsKKwlzd2l0Y2ggKGZtb2RlKSB7CiAJCWNhc2UgRk1PREVfV1JJVEU6CiAJCQlzdGF0ZS0+bl93cm9ubHkrKzsKIAkJCWJyZWFrOwpAQCAtMzYxLDE1ICs0NDIsMTUgQEAKIAkJY2FzZSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOgogCQkJc3RhdGUtPm5fcmR3cisrOwogCX0KLQluZnM0X3N0YXRlX3NldF9tb2RlX2xvY2tlZChzdGF0ZSwgc3RhdGUtPnN0YXRlIHwgb3Blbl9mbGFncyk7CisJbmZzNF9zdGF0ZV9zZXRfbW9kZV9sb2NrZWQoc3RhdGUsIHN0YXRlLT5zdGF0ZSB8IGZtb2RlKTsKIH0KIAotc3RhdGljIHZvaWQgbmZzX3NldF9vcGVuX3N0YXRlaWRfbG9ja2VkKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkLCBpbnQgb3Blbl9mbGFncykKK3N0YXRpYyB2b2lkIG5mc19zZXRfb3Blbl9zdGF0ZWlkX2xvY2tlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG5mczRfc3RhdGVpZCAqc3RhdGVpZCwgZm1vZGVfdCBmbW9kZSkKIHsKIAlpZiAodGVzdF9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncykgPT0gMCkKIAkJbWVtY3B5KHN0YXRlLT5zdGF0ZWlkLmRhdGEsIHN0YXRlaWQtPmRhdGEsIHNpemVvZihzdGF0ZS0+c3RhdGVpZC5kYXRhKSk7CiAJbWVtY3B5KHN0YXRlLT5vcGVuX3N0YXRlaWQuZGF0YSwgc3RhdGVpZC0+ZGF0YSwgc2l6ZW9mKHN0YXRlLT5vcGVuX3N0YXRlaWQuZGF0YSkpOwotCXN3aXRjaCAob3Blbl9mbGFncykgeworCXN3aXRjaCAoZm1vZGUpIHsKIAkJY2FzZSBGTU9ERV9SRUFEOgogCQkJc2V0X2JpdChORlNfT19SRE9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOwogCQkJYnJlYWs7CkBAIC0zODEsMTYgKzQ2MiwxNSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbmZzX3NldF9vcGVuX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsIGludCBvcGVuX2ZsYWdzKQorc3RhdGljIHZvaWQgbmZzX3NldF9vcGVuX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsIGZtb2RlX3QgZm1vZGUpCiB7CiAJd3JpdGVfc2VxbG9jaygmc3RhdGUtPnNlcWxvY2spOwotCW5mc19zZXRfb3Blbl9zdGF0ZWlkX2xvY2tlZChzdGF0ZSwgc3RhdGVpZCwgb3Blbl9mbGFncyk7CisJbmZzX3NldF9vcGVuX3N0YXRlaWRfbG9ja2VkKHN0YXRlLCBzdGF0ZWlkLCBmbW9kZSk7CiAJd3JpdGVfc2VxdW5sb2NrKCZzdGF0ZS0+c2VxbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9vcGVuX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RhdGVpZCwgbmZzNF9zdGF0ZWlkICpkZWxlZ19zdGF0ZWlkLCBpbnQgb3Blbl9mbGFncykKK3N0YXRpYyB2b2lkIF9fdXBkYXRlX29wZW5fc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG5mczRfc3RhdGVpZCAqb3Blbl9zdGF0ZWlkLCBjb25zdCBuZnM0X3N0YXRlaWQgKmRlbGVnX3N0YXRlaWQsIGZtb2RlX3QgZm1vZGUpCiB7Ci0Jb3Blbl9mbGFncyAmPSAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiAJLyoKIAkgKiBQcm90ZWN0IHRoZSBjYWxsIHRvIG5mczRfc3RhdGVfc2V0X21vZGVfbG9ja2VkIGFuZAogCSAqIHNlcmlhbGlzZSB0aGUgc3RhdGVpZCB1cGRhdGUKQEAgLTQwMSwyMCArNDgxLDYwIEBACiAJCXNldF9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7CiAJfQogCWlmIChvcGVuX3N0YXRlaWQgIT0gTlVMTCkKLQkJbmZzX3NldF9vcGVuX3N0YXRlaWRfbG9ja2VkKHN0YXRlLCBvcGVuX3N0YXRlaWQsIG9wZW5fZmxhZ3MpOworCQluZnNfc2V0X29wZW5fc3RhdGVpZF9sb2NrZWQoc3RhdGUsIG9wZW5fc3RhdGVpZCwgZm1vZGUpOwogCXdyaXRlX3NlcXVubG9jaygmc3RhdGUtPnNlcWxvY2spOwogCXNwaW5fbG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKLQl1cGRhdGVfb3Blbl9zdGF0ZWZsYWdzKHN0YXRlLCBvcGVuX2ZsYWdzKTsKKwl1cGRhdGVfb3Blbl9zdGF0ZWZsYWdzKHN0YXRlLCBmbW9kZSk7CiAJc3Bpbl91bmxvY2soJnN0YXRlLT5vd25lci0+c29fbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIG5mczRfcmV0dXJuX2luY29tcGF0aWJsZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIG1vZGVfdCBvcGVuX2ZsYWdzKQorc3RhdGljIGludCB1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbmZzNF9zdGF0ZWlkICpvcGVuX3N0YXRlaWQsIG5mczRfc3RhdGVpZCAqZGVsZWdhdGlvbiwgZm1vZGVfdCBmbW9kZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koc3RhdGUtPmlub2RlKTsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnX2N1cjsKKwlpbnQgcmV0ID0gMDsKKworCWZtb2RlICY9IChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkZWxlZ19jdXIgPSByY3VfZGVyZWZlcmVuY2UobmZzaS0+ZGVsZWdhdGlvbik7CisJaWYgKGRlbGVnX2N1ciA9PSBOVUxMKQorCQlnb3RvIG5vX2RlbGVnYXRpb247CisKKwlzcGluX2xvY2soJmRlbGVnX2N1ci0+bG9jayk7CisJaWYgKG5mc2ktPmRlbGVnYXRpb24gIT0gZGVsZWdfY3VyIHx8CisJICAgIChkZWxlZ19jdXItPnR5cGUgJiBmbW9kZSkgIT0gZm1vZGUpCisJCWdvdG8gbm9fZGVsZWdhdGlvbl91bmxvY2s7CisKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQorCQlkZWxlZ2F0aW9uID0gJmRlbGVnX2N1ci0+c3RhdGVpZDsKKwllbHNlIGlmIChtZW1jbXAoZGVsZWdfY3VyLT5zdGF0ZWlkLmRhdGEsIGRlbGVnYXRpb24tPmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKSAhPSAwKQorCQlnb3RvIG5vX2RlbGVnYXRpb25fdW5sb2NrOworCisJbmZzX21hcmtfZGVsZWdhdGlvbl9yZWZlcmVuY2VkKGRlbGVnX2N1cik7CisJX191cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCBvcGVuX3N0YXRlaWQsICZkZWxlZ19jdXItPnN0YXRlaWQsIGZtb2RlKTsKKwlyZXQgPSAxOworbm9fZGVsZWdhdGlvbl91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRlbGVnX2N1ci0+bG9jayk7Citub19kZWxlZ2F0aW9uOgorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKCFyZXQgJiYgb3Blbl9zdGF0ZWlkICE9IE5VTEwpIHsKKwkJX191cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCBvcGVuX3N0YXRlaWQsIE5VTEwsIGZtb2RlKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIG5mczRfcmV0dXJuX2luY29tcGF0aWJsZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGZtb2RlX3QgZm1vZGUpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UoTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uKTsKLQlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IChkZWxlZ2F0aW9uLT50eXBlICYgb3Blbl9mbGFncykgPT0gb3Blbl9mbGFncykgeworCWlmIChkZWxlZ2F0aW9uID09IE5VTEwgfHwgKGRlbGVnYXRpb24tPnR5cGUgJiBmbW9kZSkgPT0gZm1vZGUpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKIAl9CkBAIC00MjcsMjcgKzU0NywyOCBAQAogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSA9IG9wZW5kYXRhLT5zdGF0ZTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koc3RhdGUtPmlub2RlKTsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247Ci0JaW50IG9wZW5fbW9kZSA9IG9wZW5kYXRhLT5vX2FyZy5vcGVuX2ZsYWdzICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8T19FWENMKTsKKwlpbnQgb3Blbl9tb2RlID0gb3BlbmRhdGEtPm9fYXJnLm9wZW5fZmxhZ3MgJiBPX0VYQ0w7CisJZm1vZGVfdCBmbW9kZSA9IG9wZW5kYXRhLT5vX2FyZy5mbW9kZTsKIAluZnM0X3N0YXRlaWQgc3RhdGVpZDsKIAlpbnQgcmV0ID0gLUVBR0FJTjsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQlkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKG5mc2ktPmRlbGVnYXRpb24pOwogCWZvciAoOzspIHsKLQkJaWYgKGNhbl9vcGVuX2NhY2hlZChzdGF0ZSwgb3Blbl9tb2RlKSkgeworCQlpZiAoY2FuX29wZW5fY2FjaGVkKHN0YXRlLCBmbW9kZSwgb3Blbl9tb2RlKSkgewogCQkJc3Bpbl9sb2NrKCZzdGF0ZS0+b3duZXItPnNvX2xvY2spOwotCQkJaWYgKGNhbl9vcGVuX2NhY2hlZChzdGF0ZSwgb3Blbl9tb2RlKSkgewotCQkJCXVwZGF0ZV9vcGVuX3N0YXRlZmxhZ3Moc3RhdGUsIG9wZW5fbW9kZSk7CisJCQlpZiAoY2FuX29wZW5fY2FjaGVkKHN0YXRlLCBmbW9kZSwgb3Blbl9tb2RlKSkgeworCQkJCXVwZGF0ZV9vcGVuX3N0YXRlZmxhZ3Moc3RhdGUsIGZtb2RlKTsKIAkJCQlzcGluX3VubG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKLQkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlnb3RvIG91dF9yZXR1cm5fc3RhdGU7CiAJCQl9CiAJCQlzcGluX3VubG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKIAkJfQotCQlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQorCQlyY3VfcmVhZF9sb2NrKCk7CisJCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UobmZzaS0+ZGVsZWdhdGlvbik7CisJCWlmIChkZWxlZ2F0aW9uID09IE5VTEwgfHwKKwkJICAgICFjYW5fb3Blbl9kZWxlZ2F0ZWQoZGVsZWdhdGlvbiwgZm1vZGUpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWJyZWFrOwotCQlpZiAoIWNhbl9vcGVuX2RlbGVnYXRlZChkZWxlZ2F0aW9uLCBvcGVuX21vZGUpKQotCQkJYnJlYWs7CisJCX0KIAkJLyogU2F2ZSB0aGUgZGVsZWdhdGlvbiAqLwogCQltZW1jcHkoc3RhdGVpZC5kYXRhLCBkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihzdGF0ZWlkLmRhdGEpKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC00NTUsMTkgKzU3NiwxMSBAQAogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIG91dDsKIAkJcmV0ID0gLUVBR0FJTjsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKG5mc2ktPmRlbGVnYXRpb24pOwotCQkvKiBJZiBubyBkZWxlZ2F0aW9uLCB0cnkgYSBjYWNoZWQgb3BlbiAqLwotCQlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCS8qIElzIHRoZSBkZWxlZ2F0aW9uIHN0aWxsIHZhbGlkPyAqLwotCQlpZiAobWVtY21wKHN0YXRlaWQuZGF0YSwgZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhLCBzaXplb2Yoc3RhdGVpZC5kYXRhKSkgIT0gMCkKLQkJCWNvbnRpbnVlOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJdXBkYXRlX29wZW5fc3RhdGVpZChzdGF0ZSwgTlVMTCwgJnN0YXRlaWQsIG9wZW5fbW9kZSk7Ci0JCWdvdG8gb3V0X3JldHVybl9zdGF0ZTsKKworCQkvKiBUcnkgdG8gdXBkYXRlIHRoZSBzdGF0ZWlkIHVzaW5nIHRoZSBkZWxlZ2F0aW9uICovCisJCWlmICh1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCBOVUxMLCAmc3RhdGVpZCwgZm1vZGUpKQorCQkJZ290byBvdXRfcmV0dXJuX3N0YXRlOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIG91dDoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogb3V0X3JldHVybl9zdGF0ZToKQEAgLTQ4MCw3ICs1OTMsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlID0gTlVMTDsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247Ci0JbmZzNF9zdGF0ZWlkICpkZWxlZ19zdGF0ZWlkID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJaWYgKCFkYXRhLT5ycGNfZG9uZSkgewpAQCAtNTA3LDcgKzYxOSw3IEBACiAJCWlmIChkZWxlZ2F0aW9uKQogCQkJZGVsZWdhdGlvbl9mbGFncyA9IGRlbGVnYXRpb24tPmZsYWdzOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKCEoZGVsZWdhdGlvbl9mbGFncyAmIE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSkpCisJCWlmICgoZGVsZWdhdGlvbl9mbGFncyAmIDFVTDw8TkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSA9PSAwKQogCQkJbmZzX2lub2RlX3NldF9kZWxlZ2F0aW9uKHN0YXRlLT5pbm9kZSwKIAkJCQkJZGF0YS0+b3duZXItPnNvX2NyZWQsCiAJCQkJCSZkYXRhLT5vX3Jlcyk7CkBAIC01MTYsMTIgKzYyOCw5IEBACiAJCQkJCWRhdGEtPm93bmVyLT5zb19jcmVkLAogCQkJCQkmZGF0YS0+b19yZXMpOwogCX0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZGVsZWdhdGlvbiA9IHJjdV9kZXJlZmVyZW5jZShORlNfSShpbm9kZSktPmRlbGVnYXRpb24pOwotCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpCi0JCWRlbGVnX3N0YXRlaWQgPSAmZGVsZWdhdGlvbi0+c3RhdGVpZDsKLQl1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCAmZGF0YS0+b19yZXMuc3RhdGVpZCwgZGVsZWdfc3RhdGVpZCwgZGF0YS0+b19hcmcub3Blbl9mbGFncyk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisKKwl1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCAmZGF0YS0+b19yZXMuc3RhdGVpZCwgTlVMTCwKKwkJCWRhdGEtPm9fYXJnLmZtb2RlKTsKIAlpcHV0KGlub2RlKTsKIG91dDoKIAlyZXR1cm4gc3RhdGU7CkBAIC01NTIsNyArNjYxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqb3BlbmRhdGE7CiAKLQlvcGVuZGF0YSA9IG5mczRfb3BlbmRhdGFfYWxsb2MoJmN0eC0+cGF0aCwgc3RhdGUtPm93bmVyLCAwLCBOVUxMKTsKKwlvcGVuZGF0YSA9IG5mczRfb3BlbmRhdGFfYWxsb2MoJmN0eC0+cGF0aCwgc3RhdGUtPm93bmVyLCAwLCAwLCBOVUxMKTsKIAlpZiAob3BlbmRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJb3BlbmRhdGEtPnN0YXRlID0gc3RhdGU7CkBAIC01NjAsMTIgKzY2OSwxMyBAQAogCXJldHVybiBvcGVuZGF0YTsKIH0KIAotc3RhdGljIGludCBuZnM0X29wZW5fcmVjb3Zlcl9oZWxwZXIoc3RydWN0IG5mczRfb3BlbmRhdGEgKm9wZW5kYXRhLCBtb2RlX3Qgb3BlbmZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKK3N0YXRpYyBpbnQgbmZzNF9vcGVuX3JlY292ZXJfaGVscGVyKHN0cnVjdCBuZnM0X29wZW5kYXRhICpvcGVuZGF0YSwgZm1vZGVfdCBmbW9kZSwgc3RydWN0IG5mczRfc3RhdGUgKipyZXMpCiB7CiAJc3RydWN0IG5mczRfc3RhdGUgKm5ld3N0YXRlOwogCWludCByZXQ7CiAKLQlvcGVuZGF0YS0+b19hcmcub3Blbl9mbGFncyA9IG9wZW5mbGFnczsKKwlvcGVuZGF0YS0+b19hcmcub3Blbl9mbGFncyA9IDA7CisJb3BlbmRhdGEtPm9fYXJnLmZtb2RlID0gZm1vZGU7CiAJbWVtc2V0KCZvcGVuZGF0YS0+b19yZXMsIDAsIHNpemVvZihvcGVuZGF0YS0+b19yZXMpKTsKIAltZW1zZXQoJm9wZW5kYXRhLT5jX3JlcywgMCwgc2l6ZW9mKG9wZW5kYXRhLT5jX3JlcykpOwogCW5mczRfaW5pdF9vcGVuZGF0YV9yZXMob3BlbmRhdGEpOwpAQCAtNTc1LDcgKzY4NSw3IEBACiAJbmV3c3RhdGUgPSBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUob3BlbmRhdGEpOwogCWlmIChJU19FUlIobmV3c3RhdGUpKQogCQlyZXR1cm4gUFRSX0VSUihuZXdzdGF0ZSk7Ci0JbmZzNF9jbG9zZV9zdGF0ZSgmb3BlbmRhdGEtPnBhdGgsIG5ld3N0YXRlLCBvcGVuZmxhZ3MpOworCW5mczRfY2xvc2Vfc3RhdGUoJm9wZW5kYXRhLT5wYXRoLCBuZXdzdGF0ZSwgZm1vZGUpOwogCSpyZXMgPSBuZXdzdGF0ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYzMSw3ICs3NDEsNyBAQAogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAlzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqb3BlbmRhdGE7Ci0JaW50IGRlbGVnYXRpb25fdHlwZSA9IDA7CisJZm1vZGVfdCBkZWxlZ2F0aW9uX3R5cGUgPSAwOwogCWludCBzdGF0dXM7CiAKIAlvcGVuZGF0YSA9IG5mczRfb3Blbl9yZWNvdmVyZGF0YV9hbGxvYyhjdHgsIHN0YXRlKTsKQEAgLTY0MSw3ICs3NTEsNyBAQAogCW9wZW5kYXRhLT5vX2FyZy5maCA9IE5GU19GSChzdGF0ZS0+aW5vZGUpOwogCXJjdV9yZWFkX2xvY2soKTsKIAlkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKE5GU19JKHN0YXRlLT5pbm9kZSktPmRlbGVnYXRpb24pOwotCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwgJiYgKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSAhPSAwKQorCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwgJiYgdGVzdF9iaXQoTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpICE9IDApCiAJCWRlbGVnYXRpb25fdHlwZSA9IGRlbGVnYXRpb24tPnR5cGU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJb3BlbmRhdGEtPm9fYXJnLnUuZGVsZWdhdGlvbl90eXBlID0gZGVsZWdhdGlvbl90eXBlOwpAQCAtNzQ0LDcgKzg1NCw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJc3RhdGUgPSBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoZGF0YSk7CiAJaWYgKCFJU19FUlIoc3RhdGUpKQotCQluZnM0X2Nsb3NlX3N0YXRlKCZkYXRhLT5wYXRoLCBzdGF0ZSwgZGF0YS0+b19hcmcub3Blbl9mbGFncyk7CisJCW5mczRfY2xvc2Vfc3RhdGUoJmRhdGEtPnBhdGgsIHN0YXRlLCBkYXRhLT5vX2FyZy5mbW9kZSk7CiBvdXRfZnJlZToKIAluZnM0X29wZW5kYXRhX3B1dChkYXRhKTsKIH0KQEAgLTgwOCwxMiArOTE4LDEyIEBACiAJaWYgKGRhdGEtPnN0YXRlICE9IE5VTEwpIHsKIAkJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCi0JCWlmIChjYW5fb3Blbl9jYWNoZWQoZGF0YS0+c3RhdGUsIGRhdGEtPm9fYXJnLm9wZW5fZmxhZ3MgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURXxPX0VYQ0wpKSkKKwkJaWYgKGNhbl9vcGVuX2NhY2hlZChkYXRhLT5zdGF0ZSwgZGF0YS0+b19hcmcuZm1vZGUsIGRhdGEtPm9fYXJnLm9wZW5fZmxhZ3MpKQogCQkJZ290byBvdXRfbm9fYWN0aW9uOwogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UoTkZTX0koZGF0YS0+c3RhdGUtPmlub2RlKS0+ZGVsZWdhdGlvbik7CiAJCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwgJiYKLQkJICAgKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSA9PSAwKSB7CisJCSAgICB0ZXN0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncykgPT0gMCkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlnb3RvIG91dF9ub19hY3Rpb247CiAJCX0KQEAgLTg3Nyw3ICs5ODcsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCXN0YXRlID0gbmZzNF9vcGVuZGF0YV90b19uZnM0X3N0YXRlKGRhdGEpOwogCWlmICghSVNfRVJSKHN0YXRlKSkKLQkJbmZzNF9jbG9zZV9zdGF0ZSgmZGF0YS0+cGF0aCwgc3RhdGUsIGRhdGEtPm9fYXJnLm9wZW5fZmxhZ3MpOworCQluZnM0X2Nsb3NlX3N0YXRlKCZkYXRhLT5wYXRoLCBzdGF0ZSwgZGF0YS0+b19hcmcuZm1vZGUpOwogb3V0X2ZyZWU6CiAJbmZzNF9vcGVuZGF0YV9wdXQoZGF0YSk7CiB9CkBAIC05NTUsMTAgKzEwNjUsMTEgQEAKIAlpbnQgcmV0OwogCiAJZm9yICg7OykgewotCQlyZXQgPSBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHNlcnZlci0+Y2xpZW50LCBjbHApOworCQlyZXQgPSBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKGNscCk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKSkKKwkJaWYgKCF0ZXN0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChORlM0Q0xOVF9DSEVDS19MRUFTRSwmY2xwLT5jbF9zdGF0ZSkpCiAJCQlicmVhazsKIAkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShjbHApOwogCX0KQEAgLTk5Myw4ICsxMTA0LDkgQEAKIAogCWRvIHsKIAkJZXJyID0gX25mczRfb3Blbl9leHBpcmVkKGN0eCwgc3RhdGUpOwotCQlpZiAoZXJyID09IC1ORlM0RVJSX0RFTEFZKQotCQkJbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwkJaWYgKGVyciAhPSAtTkZTNEVSUl9ERUxBWSkKKwkJCWJyZWFrOworCQluZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLCBlcnIsICZleGNlcHRpb24pOwogCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEwMzEsMTIgKzExNDMsMTEgQEAKIC8qCiAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlZCBuZnM0X3N0YXRlCiAgKi8KLXN0YXRpYyBpbnQgX25mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhdGggKnBhdGgsIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKK3N0YXRpYyBpbnQgX25mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhdGggKnBhdGgsIGZtb2RlX3QgZm1vZGUsIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAgKnNwOwogCXN0cnVjdCBuZnM0X3N0YXRlICAgICAqc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBuZnNfc2VydmVyICAgICAgICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqb3BlbmRhdGE7CiAJaW50IHN0YXR1czsKIApAQCAtMTA1MCwxMiArMTE2MSwxMSBAQAogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBlcnJfcHV0X3N0YXRlX293bmVyOwogCWlmIChwYXRoLT5kZW50cnktPmRfaW5vZGUgIT0gTlVMTCkKLQkJbmZzNF9yZXR1cm5faW5jb21wYXRpYmxlX2RlbGVnYXRpb24ocGF0aC0+ZGVudHJ5LT5kX2lub2RlLCBmbGFncyAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7Ci0JZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJCW5mczRfcmV0dXJuX2luY29tcGF0aWJsZV9kZWxlZ2F0aW9uKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZSwgZm1vZGUpOwogCXN0YXR1cyA9IC1FTk9NRU07Ci0Jb3BlbmRhdGEgPSBuZnM0X29wZW5kYXRhX2FsbG9jKHBhdGgsIHNwLCBmbGFncywgc2F0dHIpOworCW9wZW5kYXRhID0gbmZzNF9vcGVuZGF0YV9hbGxvYyhwYXRoLCBzcCwgZm1vZGUsIGZsYWdzLCBzYXR0cik7CiAJaWYgKG9wZW5kYXRhID09IE5VTEwpCi0JCWdvdG8gZXJyX3JlbGVhc2VfcndzZW07CisJCWdvdG8gZXJyX3B1dF9zdGF0ZV9vd25lcjsKIAogCWlmIChwYXRoLT5kZW50cnktPmRfaW5vZGUgIT0gTlVMTCkKIAkJb3BlbmRhdGEtPnN0YXRlID0gbmZzNF9nZXRfb3Blbl9zdGF0ZShwYXRoLT5kZW50cnktPmRfaW5vZGUsIHNwKTsKQEAgLTEwNzMsMTMgKzExODMsMTAgQEAKIAkJZ290byBlcnJfb3BlbmRhdGFfcHV0OwogCW5mczRfb3BlbmRhdGFfcHV0KG9wZW5kYXRhKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7Ci0JdXBfcmVhZCgmY2xwLT5jbF9zZW0pOwogCSpyZXMgPSBzdGF0ZTsKIAlyZXR1cm4gMDsKIGVycl9vcGVuZGF0YV9wdXQ6CiAJbmZzNF9vcGVuZGF0YV9wdXQob3BlbmRhdGEpOwotZXJyX3JlbGVhc2VfcndzZW06Ci0JdXBfcmVhZCgmY2xwLT5jbF9zZW0pOwogZXJyX3B1dF9zdGF0ZV9vd25lcjoKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CiBvdXRfZXJyOgpAQCAtMTA4OCwxNCArMTE5NSwxNCBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqbmZzNF9kb19vcGVuKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IGZsYWdzLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGUgKm5mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhdGggKnBhdGgsIGZtb2RlX3QgZm1vZGUsIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkKQogewogCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CiAJc3RydWN0IG5mczRfc3RhdGUgKnJlczsKIAlpbnQgc3RhdHVzOwogCiAJZG8gewotCQlzdGF0dXMgPSBfbmZzNF9kb19vcGVuKGRpciwgcGF0aCwgZmxhZ3MsIHNhdHRyLCBjcmVkLCAmcmVzKTsKKwkJc3RhdHVzID0gX25mczRfZG9fb3BlbihkaXIsIHBhdGgsIGZtb2RlLCBmbGFncywgc2F0dHIsIGNyZWQsICZyZXMpOwogCQlpZiAoc3RhdHVzID09IDApCiAJCQlicmVhazsKIAkJLyogTk9URTogQkFEX1NFUUlEIG1lYW5zIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBkaXNhZ3JlZSBhYm91dCB0aGUKQEAgLTEyMzAsMTAgKzEzMzcsMTMgQEAKIAkJCXJlbmV3X2xlYXNlKHNlcnZlciwgY2FsbGRhdGEtPnRpbWVzdGFtcCk7CiAJCQlicmVhazsKIAkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX0JBRF9TVEFURUlEOgogCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6Ci0JCQlicmVhazsKKwkJCWlmIChjYWxsZGF0YS0+YXJnLmZtb2RlID09IDApCisJCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgc2VydmVyKSA9PSAtRUFHQUlOKSB7CisJCQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgc2VydmVyLCBzdGF0ZSkgPT0gLUVBR0FJTikgewogCQkJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMTI3MiwxMCArMTM4MiwxMCBAQAogCW5mc19mYXR0cl9pbml0KGNhbGxkYXRhLT5yZXMuZmF0dHIpOwogCWlmICh0ZXN0X2JpdChORlNfT19SRE9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpICE9IDApIHsKIAkJdGFzay0+dGtfbXNnLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX09QRU5fRE9XTkdSQURFXTsKLQkJY2FsbGRhdGEtPmFyZy5vcGVuX2ZsYWdzID0gRk1PREVfUkVBRDsKKwkJY2FsbGRhdGEtPmFyZy5mbW9kZSA9IEZNT0RFX1JFQUQ7CiAJfSBlbHNlIGlmICh0ZXN0X2JpdChORlNfT19XUk9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpICE9IDApIHsKIAkJdGFzay0+dGtfbXNnLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX09QRU5fRE9XTkdSQURFXTsKLQkJY2FsbGRhdGEtPmFyZy5vcGVuX2ZsYWdzID0gRk1PREVfV1JJVEU7CisJCWNhbGxkYXRhLT5hcmcuZm1vZGUgPSBGTU9ERV9XUklURTsKIAl9CiAJY2FsbGRhdGEtPnRpbWVzdGFtcCA9IGppZmZpZXM7CiAJcnBjX2NhbGxfc3RhcnQodGFzayk7CkBAIC0xMzI4LDYgKzE0MzgsNyBAQAogCWNhbGxkYXRhLT5hcmcuc2VxaWQgPSBuZnNfYWxsb2Nfc2VxaWQoJnN0YXRlLT5vd25lci0+c29fc2VxaWQpOwogCWlmIChjYWxsZGF0YS0+YXJnLnNlcWlkID09IE5VTEwpCiAJCWdvdG8gb3V0X2ZyZWVfY2FsbGRhdGE7CisJY2FsbGRhdGEtPmFyZy5mbW9kZSA9IDA7CiAJY2FsbGRhdGEtPmFyZy5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2s7CiAJY2FsbGRhdGEtPnJlcy5mYXR0ciA9ICZjYWxsZGF0YS0+ZmF0dHI7CiAJY2FsbGRhdGEtPnJlcy5zZXFpZCA9IGNhbGxkYXRhLT5hcmcuc2VxaWQ7CkBAIC0xMzU0LDEzICsxNDY1LDEzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBuZnM0X2ludGVudF9zZXRfZmlsZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3N0YXRpYyBpbnQgbmZzNF9pbnRlbnRfc2V0X2ZpbGUoc3RydWN0IG5hbWVpZGF0YSAqbmQsIHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZtb2RlX3QgZm1vZGUpCiB7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJaW50IHJldDsKIAogCS8qIElmIHRoZSBvcGVuX2ludGVudCBpcyBmb3IgZXhlY3V0ZSwgd2UgaGF2ZSBhbiBleHRyYSBjaGVjayB0byBtYWtlICovCi0JaWYgKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIEZNT0RFX0VYRUMpIHsKKwlpZiAoZm1vZGUgJiBGTU9ERV9FWEVDKSB7CiAJCXJldCA9IG5mc19tYXlfb3BlbihzdGF0ZS0+aW5vZGUsCiAJCQkJc3RhdGUtPm93bmVyLT5zb19jcmVkLAogCQkJCW5kLT5pbnRlbnQub3Blbi5mbGFncyk7CkBAIC0xMzc2LDcgKzE0ODcsNyBAQAogCX0KIAlyZXQgPSBQVFJfRVJSKGZpbHApOwogb3V0X2Nsb3NlOgotCW5mczRfY2xvc2Vfc3luYyhwYXRoLCBzdGF0ZSwgbmQtPmludGVudC5vcGVuLmZsYWdzKTsKKwluZnM0X2Nsb3NlX3N5bmMocGF0aCwgc3RhdGUsIGZtb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzkyLDYgKzE1MDMsNyBAQAogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IGRlbnRyeSAqcmVzOworCWZtb2RlX3QgZm1vZGUgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhFQyk7CiAKIAlpZiAobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgewogCQlhdHRyLmlhX21vZGUgPSBuZC0+aW50ZW50Lm9wZW4uY3JlYXRlX21vZGU7CkBAIC0xNDA5LDcgKzE1MjEsNyBAQAogCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CiAJLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2lsbHlkZWxldGVzICovCiAJbmZzX2Jsb2NrX3NpbGx5cmVuYW1lKHBhcmVudCk7Ci0Jc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCAmcGF0aCwgbmQtPmludGVudC5vcGVuLmZsYWdzLCAmYXR0ciwgY3JlZCk7CisJc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCAmcGF0aCwgZm1vZGUsIG5kLT5pbnRlbnQub3Blbi5mbGFncywgJmF0dHIsIGNyZWQpOwogCXB1dF9ycGNjcmVkKGNyZWQpOwogCWlmIChJU19FUlIoc3RhdGUpKSB7CiAJCWlmIChQVFJfRVJSKHN0YXRlKSA9PSAtRU5PRU5UKSB7CkBAIC0xNDI0LDcgKzE1MzYsNyBAQAogCQlwYXRoLmRlbnRyeSA9IHJlczsKIAluZnNfc2V0X3ZlcmlmaWVyKHBhdGguZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcikpOwogCW5mc191bmJsb2NrX3NpbGx5cmVuYW1lKHBhcmVudCk7Ci0JbmZzNF9pbnRlbnRfc2V0X2ZpbGUobmQsICZwYXRoLCBzdGF0ZSk7CisJbmZzNF9pbnRlbnRfc2V0X2ZpbGUobmQsICZwYXRoLCBzdGF0ZSwgZm1vZGUpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE0MzcsMTEgKzE1NDksMTIgQEAKIAl9OwogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisJZm1vZGVfdCBmbW9kZSA9IG9wZW5mbGFncyAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOwogCiAJY3JlZCA9IHJwY19sb29rdXBfY3JlZCgpOwogCWlmIChJU19FUlIoY3JlZCkpCiAJCXJldHVybiBQVFJfRVJSKGNyZWQpOwotCXN0YXRlID0gbmZzNF9kb19vcGVuKGRpciwgJnBhdGgsIG9wZW5mbGFncywgTlVMTCwgY3JlZCk7CisJc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCAmcGF0aCwgZm1vZGUsIG9wZW5mbGFncywgTlVMTCwgY3JlZCk7CiAJcHV0X3JwY2NyZWQoY3JlZCk7CiAJaWYgKElTX0VSUihzdGF0ZSkpIHsKIAkJc3dpdGNoIChQVFJfRVJSKHN0YXRlKSkgewpAQCAtMTQ1OCwxMCArMTU3MSwxMCBAQAogCX0KIAlpZiAoc3RhdGUtPmlub2RlID09IGRlbnRyeS0+ZF9pbm9kZSkgewogCQluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKLQkJbmZzNF9pbnRlbnRfc2V0X2ZpbGUobmQsICZwYXRoLCBzdGF0ZSk7CisJCW5mczRfaW50ZW50X3NldF9maWxlKG5kLCAmcGF0aCwgc3RhdGUsIGZtb2RlKTsKIAkJcmV0dXJuIDE7CiAJfQotCW5mczRfY2xvc2Vfc3luYygmcGF0aCwgc3RhdGUsIG9wZW5mbGFncyk7CisJbmZzNF9jbG9zZV9zeW5jKCZwYXRoLCBzdGF0ZSwgZm1vZGUpOwogb3V0X2Ryb3A6CiAJZF9kcm9wKGRlbnRyeSk7CiAJcmV0dXJuIDA7CkBAIC0xODg3LDYgKzIwMDAsNyBAQAogCX07CiAJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOwogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlmbW9kZV90IGZtb2RlID0gZmxhZ3MgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKIAlpbnQgc3RhdHVzID0gMDsKIAogCWNyZWQgPSBycGNfbG9va3VwX2NyZWQoKTsKQEAgLTE4OTQsNyArMjAwOCw3IEBACiAJCXN0YXR1cyA9IFBUUl9FUlIoY3JlZCk7CiAJCWdvdG8gb3V0OwogCX0KLQlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsICZwYXRoLCBmbGFncywgc2F0dHIsIGNyZWQpOworCXN0YXRlID0gbmZzNF9kb19vcGVuKGRpciwgJnBhdGgsIGZtb2RlLCBmbGFncywgc2F0dHIsIGNyZWQpOwogCWRfZHJvcChkZW50cnkpOwogCWlmIChJU19FUlIoc3RhdGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoc3RhdGUpOwpAQCAtMTkxMCw5ICsyMDI0LDkgQEAKIAkJbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlKHN0YXRlLT5pbm9kZSwgJmZhdHRyKTsKIAl9CiAJaWYgKHN0YXR1cyA9PSAwICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikgIT0gMCkKLQkJc3RhdHVzID0gbmZzNF9pbnRlbnRfc2V0X2ZpbGUobmQsICZwYXRoLCBzdGF0ZSk7CisJCXN0YXR1cyA9IG5mczRfaW50ZW50X3NldF9maWxlKG5kLCAmcGF0aCwgc3RhdGUsIGZtb2RlKTsKIAllbHNlCi0JCW5mczRfY2xvc2Vfc3luYygmcGF0aCwgc3RhdGUsIGZsYWdzKTsKKwkJbmZzNF9jbG9zZV9zeW5jKCZwYXRoLCBzdGF0ZSwgZm1vZGUpOwogb3V0X3B1dGNyZWQ6CiAJcHV0X3JwY2NyZWQoY3JlZCk7CiBvdXQ6CkBAIC0xOTc0LDcgKzIwODgsNyBAQAogewogCXN0cnVjdCBuZnNfcmVtb3ZlcmVzICpyZXMgPSB0YXNrLT50a19tc2cucnBjX3Jlc3A7CiAKLQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgcmVzLT5zZXJ2ZXIpID09IC1FQUdBSU4pCisJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIHJlcy0+c2VydmVyLCBOVUxMKSA9PSAtRUFHQUlOKQogCQlyZXR1cm4gMDsKIAl1cGRhdGVfY2hhbmdlYXR0cihkaXIsICZyZXMtPmNpbmZvKTsKIAluZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoZGlyLCAmcmVzLT5kaXJfYXR0cik7CkBAIC0yNDAyLDcgKzI1MTYsNyBAQAogewogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRhdGEtPmlub2RlKTsKIAotCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBzZXJ2ZXIpID09IC1FQUdBSU4pIHsKKwlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgc2VydmVyLCBkYXRhLT5hcmdzLmNvbnRleHQtPnN0YXRlKSA9PSAtRUFHQUlOKSB7CiAJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTI0MjMsNyArMjUzNyw3IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOwogCQotCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBORlNfU0VSVkVSKGlub2RlKSkgPT0gLUVBR0FJTikgeworCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBORlNfU0VSVkVSKGlub2RlKSwgZGF0YS0+YXJncy5jb250ZXh0LT5zdGF0ZSkgPT0gLUVBR0FJTikgewogCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0yNDQ5LDcgKzI1NjMsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKIAkKLQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgTkZTX1NFUlZFUihpbm9kZSkpID09IC1FQUdBSU4pIHsKKwlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgTkZTX1NFUlZFUihpbm9kZSksIE5VTEwpID09IC1FQUdBSU4pIHsKIAkJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtMjc0MiwxOSArMjg1NiwyNSBAQAogfQogCiBzdGF0aWMgaW50Ci1uZnM0X2FzeW5jX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCituZnM0X2FzeW5jX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCiAJaWYgKCFjbHAgfHwgdGFzay0+dGtfc3RhdHVzID49IDApCiAJCXJldHVybiAwOwogCXN3aXRjaCh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAtTkZTNEVSUl9BRE1JTl9SRVZPS0VEOgorCQljYXNlIC1ORlM0RVJSX0JBRF9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX09QRU5NT0RFOgorCQkJaWYgKHN0YXRlID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQluZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9ub2dyYWNlKGNscCwgc3RhdGUpOwogCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgogCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CiAJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKIAkJCXJwY19zbGVlcF9vbigmY2xwLT5jbF9ycGN3YWl0cSwgdGFzaywgTlVMTCk7CiAJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KGNscCk7Ci0JCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiwgJmNscC0+Y2xfc3RhdGUpID09IDApCisJCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfTUFOQUdFUl9SVU5OSU5HLCAmY2xwLT5jbF9zdGF0ZSkgPT0gMCkKIAkJCQlycGNfd2FrZV91cF9xdWV1ZWRfdGFzaygmY2xwLT5jbF9ycGN3YWl0cSwgdGFzayk7CiAJCQl0YXNrLT50a19zdGF0dXMgPSAwOwogCQkJcmV0dXJuIC1FQUdBSU47CkBAIC0yNzcyLDc5ICsyODkyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuZnM0X3dhaXRfYml0X2tpbGxhYmxlKHZvaWQgKndvcmQpCi17Ci0JaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCXNjaGVkdWxlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzNF93YWl0X2NsbnRfcmVjb3ZlcihzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCi17Ci0JaW50IHJlczsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlyd3NlbV9hY3F1aXJlKCZjbHAtPmNsX3NlbS5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7Ci0KLQlyZXMgPSB3YWl0X29uX2JpdCgmY2xwLT5jbF9zdGF0ZSwgTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiwKLQkJCW5mczRfd2FpdF9iaXRfa2lsbGFibGUsIFRBU0tfS0lMTEFCTEUpOwotCi0JcndzZW1fcmVsZWFzZSgmY2xwLT5jbF9zZW0uZGVwX21hcCwgMSwgX1JFVF9JUF8pOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzNF9kZWxheShzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIGxvbmcgKnRpbWVvdXQpCi17Ci0JaW50IHJlcyA9IDA7Ci0KLQltaWdodF9zbGVlcCgpOwotCi0JaWYgKCp0aW1lb3V0IDw9IDApCi0JCSp0aW1lb3V0ID0gTkZTNF9QT0xMX1JFVFJZX01JTjsKLQlpZiAoKnRpbWVvdXQgPiBORlM0X1BPTExfUkVUUllfTUFYKQotCQkqdGltZW91dCA9IE5GUzRfUE9MTF9SRVRSWV9NQVg7Ci0Jc2NoZWR1bGVfdGltZW91dF9raWxsYWJsZSgqdGltZW91dCk7Ci0JaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlyZXMgPSAtRVJFU1RBUlRTWVM7Ci0JKnRpbWVvdXQgPDw9IDE7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyogVGhpcyBpcyB0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZSBmb3IgcHJvY2Vzc2VzIHRoYXQgYXJlIGFsbG93ZWQKLSAqIHRvIHNsZWVwLgotICovCi1zdGF0aWMgaW50IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBpbnQgZXJyb3Jjb2RlLCBzdHJ1Y3QgbmZzNF9leGNlcHRpb24gKmV4Y2VwdGlvbikKLXsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwotCWludCByZXQgPSBlcnJvcmNvZGU7Ci0KLQlleGNlcHRpb24tPnJldHJ5ID0gMDsKLQlzd2l0Y2goZXJyb3Jjb2RlKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAwOwotCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgotCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6Ci0JCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKLQkJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3ZlcnkoY2xwKTsKLQkJCXJldCA9IG5mczRfd2FpdF9jbG50X3JlY292ZXIoc2VydmVyLT5jbGllbnQsIGNscCk7Ci0JCQlpZiAocmV0ID09IDApCi0JCQkJZXhjZXB0aW9uLT5yZXRyeSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAtTkZTNEVSUl9GSUxFX09QRU46Ci0JCWNhc2UgLU5GUzRFUlJfR1JBQ0U6Ci0JCWNhc2UgLU5GUzRFUlJfREVMQVk6Ci0JCQlyZXQgPSBuZnM0X2RlbGF5KHNlcnZlci0+Y2xpZW50LCAmZXhjZXB0aW9uLT50aW1lb3V0KTsKLQkJCWlmIChyZXQgIT0gMCkKLQkJCQlicmVhazsKLQkJY2FzZSAtTkZTNEVSUl9PTERfU1RBVEVJRDoKLQkJCWV4Y2VwdGlvbi0+cmV0cnkgPSAxOwotCX0KLQkvKiBXZSBmYWlsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciAqLwotCXJldHVybiBuZnM0X21hcF9lcnJvcnMocmV0KTsKLX0KLQogaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCB1MzIgcHJvZ3JhbSwgdW5zaWduZWQgc2hvcnQgcG9ydCwgc3RydWN0IHJwY19jcmVkICpjcmVkKQogewogCW5mczRfdmVyaWZpZXIgc2NfdmVyaWZpZXI7CkBAIC0yOTE2LDcgKzI5NjMsNiBAQAogCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJCWNscC0+Y2xfbGVhc2VfdGltZSA9IGZzaW5mby5sZWFzZV90aW1lICogSFo7CiAJCWNscC0+Y2xfbGFzdF9yZW5ld2FsID0gbm93OwotCQljbGVhcl9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOwogCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMwNzQsNyArMzEyMCw2IEBACiAJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOwogCWludCBzdGF0dXM7CiAKLQlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKIAlhcmcubG9ja19vd25lci5jbGllbnRpZCA9IGNscC0+Y2xfY2xpZW50aWQ7CiAJc3RhdHVzID0gbmZzNF9zZXRfbG9ja19zdGF0ZShzdGF0ZSwgcmVxdWVzdCk7CiAJaWYgKHN0YXR1cyAhPSAwKQpAQCAtMzA5MSw3ICszMTM2LDYgQEAKIAl9CiAJcmVxdWVzdC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUocmVxdWVzdCk7CiBvdXQ6Ci0JdXBfcmVhZCgmY2xwLT5jbF9zZW0pOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMxODEsMTEgKzMyMjUsMTMgQEAKIAkJCQkJc2l6ZW9mKGNhbGxkYXRhLT5sc3AtPmxzX3N0YXRlaWQuZGF0YSkpOwogCQkJcmVuZXdfbGVhc2UoY2FsbGRhdGEtPnNlcnZlciwgY2FsbGRhdGEtPnRpbWVzdGFtcCk7CiAJCQlicmVhazsKKwkJY2FzZSAtTkZTNEVSUl9CQURfU1RBVEVJRDoKKwkJY2FzZSAtTkZTNEVSUl9PTERfU1RBVEVJRDoKIAkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgogCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBjYWxsZGF0YS0+c2VydmVyKSA9PSAtRUFHQUlOKQorCQkJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIGNhbGxkYXRhLT5zZXJ2ZXIsIE5VTEwpID09IC1FQUdBSU4pCiAJCQkJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKIAl9CiB9CkBAIC0zMjQ4LDYgKzMyOTQsNyBAQAogCiBzdGF0aWMgaW50IG5mczRfcHJvY191bmxjayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCiB7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKHN0YXRlLT5pbm9kZSk7CiAJc3RydWN0IG5mc19zZXFpZCAqc2VxaWQ7CiAJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOwogCXN0cnVjdCBycGNfdGFzayAqdGFzazsKQEAgLTMyNTcsOCArMzMwNCwxMiBAQAogCXN0YXR1cyA9IG5mczRfc2V0X2xvY2tfc3RhdGUoc3RhdGUsIHJlcXVlc3QpOwogCS8qIFVubG9jayBfYmVmb3JlXyB3ZSBkbyB0aGUgUlBDIGNhbGwgKi8KIAlyZXF1ZXN0LT5mbF9mbGFncyB8PSBGTF9FWElTVFM7Ci0JaWYgKGRvX3Zmc19sb2NrKHJlcXVlc3QtPmZsX2ZpbGUsIHJlcXVlc3QpID09IC1FTk9FTlQpCisJZG93bl9yZWFkKCZuZnNpLT5yd3NlbSk7CisJaWYgKGRvX3Zmc19sb2NrKHJlcXVlc3QtPmZsX2ZpbGUsIHJlcXVlc3QpID09IC1FTk9FTlQpIHsKKwkJdXBfcmVhZCgmbmZzaS0+cndzZW0pOwogCQlnb3RvIG91dDsKKwl9CisJdXBfcmVhZCgmbmZzaS0+cndzZW0pOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7CiAJLyogSXMgdGhpcyBhIGRlbGVnYXRlZCBsb2NrPyAqLwpAQCAtMzQ4NCw3ICszNTM1LDcgQEAKIAogc3RhdGljIGludCBfbmZzNF9wcm9jX3NldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc3RhdGUtPm93bmVyLT5zb19jbGllbnQ7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKHN0YXRlLT5pbm9kZSk7CiAJdW5zaWduZWQgY2hhciBmbF9mbGFncyA9IHJlcXVlc3QtPmZsX2ZsYWdzOwogCWludCBzdGF0dXM7CiAKQEAgLTM0OTYsMTkgKzM1NDcsMTMgQEAKIAlzdGF0dXMgPSBkb192ZnNfbG9jayhyZXF1ZXN0LT5mbF9maWxlLCByZXF1ZXN0KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBvdXQ7Ci0JZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJZG93bl9yZWFkKCZuZnNpLT5yd3NlbSk7CiAJaWYgKHRlc3RfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpKSB7Ci0JCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShzdGF0ZS0+aW5vZGUpOwogCQkvKiBZZXM6IGNhY2hlIGxvY2tzISAqLwotCQlkb3duX3JlYWQoJm5mc2ktPnJ3c2VtKTsKIAkJLyogLi4uYnV0IGF2b2lkIHJhY2VzIHdpdGggZGVsZWdhdGlvbiByZWNhbGwuLi4gKi8KLQkJaWYgKHRlc3RfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpKSB7Ci0JCQlyZXF1ZXN0LT5mbF9mbGFncyA9IGZsX2ZsYWdzICYgfkZMX1NMRUVQOwotCQkJc3RhdHVzID0gZG9fdmZzX2xvY2socmVxdWVzdC0+ZmxfZmlsZSwgcmVxdWVzdCk7Ci0JCQl1cF9yZWFkKCZuZnNpLT5yd3NlbSk7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQkJdXBfcmVhZCgmbmZzaS0+cndzZW0pOworCQlyZXF1ZXN0LT5mbF9mbGFncyA9IGZsX2ZsYWdzICYgfkZMX1NMRUVQOworCQlzdGF0dXMgPSBkb192ZnNfbG9jayhyZXF1ZXN0LT5mbF9maWxlLCByZXF1ZXN0KTsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAlzdGF0dXMgPSBfbmZzNF9kb19zZXRsayhzdGF0ZSwgY21kLCByZXF1ZXN0LCAwKTsKIAlpZiAoc3RhdHVzICE9IDApCkBAIC0zNTE4LDcgKzM1NjMsNyBAQAogCWlmIChkb192ZnNfbG9jayhyZXF1ZXN0LT5mbF9maWxlLCByZXF1ZXN0KSA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBWRlMgaXMgb3V0IG9mIHN5bmMgd2l0aCBsb2NrIG1hbmFnZXIhXG4iLCBfX2Z1bmNfXyk7CiBvdXRfdW5sb2NrOgotCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwl1cF9yZWFkKCZuZnNpLT5yd3NlbSk7CiBvdXQ6CiAJcmVxdWVzdC0+ZmxfZmxhZ3MgPSBmbF9mbGFnczsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzY2NCwxMSArMzcwOSwxNSBAQAogfQogCiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzID0geworCS5vd25lcl9mbGFnX2JpdCA9IE5GU19PV05FUl9SRUNMQUlNX1JFQk9PVCwKKwkuc3RhdGVfZmxhZ19iaXQJPSBORlNfU1RBVEVfUkVDTEFJTV9SRUJPT1QsCiAJLnJlY292ZXJfb3Blbgk9IG5mczRfb3Blbl9yZWNsYWltLAogCS5yZWNvdmVyX2xvY2sJPSBuZnM0X2xvY2tfcmVjbGFpbSwKIH07CiAKLXN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X25ldHdvcmtfcGFydGl0aW9uX3JlY292ZXJ5X29wcyA9IHsKK3N0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X25vZ3JhY2VfcmVjb3Zlcnlfb3BzID0geworCS5vd25lcl9mbGFnX2JpdCA9IE5GU19PV05FUl9SRUNMQUlNX05PR1JBQ0UsCisJLnN0YXRlX2ZsYWdfYml0CT0gTkZTX1NUQVRFX1JFQ0xBSU1fTk9HUkFDRSwKIAkucmVjb3Zlcl9vcGVuCT0gbmZzNF9vcGVuX2V4cGlyZWQsCiAJLnJlY292ZXJfbG9jawk9IG5mczRfbG9ja19leHBpcmVkLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cmVuZXdkLmMgYi9mcy9uZnMvbmZzNHJlbmV3ZC5jCmluZGV4IDMzMDVhY2IuLmY1MjRlOTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cmVuZXdkLmMKKysrIGIvZnMvbmZzL25mczRyZW5ld2QuYwpAQCAtNjUsNyArNjUsNiBAQAogCWxvbmcgbGVhc2UsIHRpbWVvdXQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0LCBub3c7CiAKLQlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKIAkvKiBBcmUgdGhlcmUgYW55IGFjdGl2ZSBzdXBlcmJsb2Nrcz8gKi8KIAlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpCkBAIC03NywxNyArNzYsMTkgQEAKIAl0aW1lb3V0ID0gKDIgKiBsZWFzZSkgLyAzICsgKGxvbmcpbGFzdCAtIChsb25nKW5vdzsKIAkvKiBBcmUgd2UgY2xvc2UgdG8gYSBsZWFzZSB0aW1lb3V0PyAqLwogCWlmICh0aW1lX2FmdGVyKG5vdywgbGFzdCArIGxlYXNlLzMpKSB7Ci0JCWNyZWQgPSBuZnM0X2dldF9yZW5ld19jcmVkKGNscCk7Ci0JCWlmIChjcmVkID09IE5VTEwpIHsKLQkJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOwotCQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JCQluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucyhjbHApOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJY3JlZCA9IG5mczRfZ2V0X3JlbmV3X2NyZWRfbG9ja2VkKGNscCk7CiAJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCQkvKiBRdWV1ZSBhbiBhc3luY2hyb25vdXMgUkVORVcuICovCi0JCW5mczRfcHJvY19hc3luY19yZW5ldyhjbHAsIGNyZWQpOwotCQlwdXRfcnBjY3JlZChjcmVkKTsKKwkJaWYgKGNyZWQgPT0gTlVMTCkgeworCQkJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsZWdhdGlvbnMpKSB7CisJCQkJc2V0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucyhjbHApOworCQl9IGVsc2UgeworCQkJLyogUXVldWUgYW4gYXN5bmNocm9ub3VzIFJFTkVXLiAqLworCQkJbmZzNF9wcm9jX2FzeW5jX3JlbmV3KGNscCwgY3JlZCk7CisJCQlwdXRfcnBjY3JlZChjcmVkKTsKKwkJfQogCQl0aW1lb3V0ID0gKDIgKiBsZWFzZSkgLyAzOwogCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJfSBlbHNlCkBAIC0xMDAsMTIgKzEwMSwxMSBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNscC0+Y2xfcmVuZXdkKTsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNscC0+Y2xfcmVuZXdkLCB0aW1lb3V0KTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwluZnNfZXhwaXJlX3VucmVmZXJlbmNlZF9kZWxlZ2F0aW9ucyhjbHApOwogb3V0OgotCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKIAlkcHJpbnRrKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogfQogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGxvY2tlZCBmb3Igd3JpdGVzICovCiB2b2lkCiBuZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwppbmRleCA0MDFlZjhiLi4yMDIyZmU0NyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mcy9uZnM0c3RhdGUuYwpAQCAtNzEsMTQgKzcxLDEyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBycGNfY3JlZCAqbmZzNF9nZXRfbWFjaGluZV9jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdGF0aWMgc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9tYWNoaW5lX2NyZWRfbG9ja2VkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gTlVMTDsKIAotCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoY2xwLT5jbF9tYWNoaW5lX2NyZWQgIT0gTlVMTCkKIAkJY3JlZCA9IGdldF9ycGNjcmVkKGNscC0+Y2xfbWFjaGluZV9jcmVkKTsKLQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlyZXR1cm4gY3JlZDsKIH0KIApAQCAtOTQsNyArOTIsNyBAQAogCQlwdXRfcnBjY3JlZChjcmVkKTsKIH0KIAotc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9yZW5ld19jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdHJ1Y3QgcnBjX2NyZWQgKm5mczRfZ2V0X3JlbmV3X2NyZWRfbG9ja2VkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwOwogCXN0cnVjdCByYl9ub2RlICpwb3M7CkBAIC0xMTAsMTMgKzEwOCwyNCBAQAogCXJldHVybiBjcmVkOwogfQogCitzdGF0aWMgc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9yZW5ld19jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWNyZWQgPSBuZnM0X2dldF9yZW5ld19jcmVkX2xvY2tlZChjbHApOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXJldHVybiBjcmVkOworfQorCiBzdGF0aWMgc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwOwogCXN0cnVjdCByYl9ub2RlICpwb3M7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwogCi0JY3JlZCA9IG5mczRfZ2V0X21hY2hpbmVfY3JlZChjbHApOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwljcmVkID0gbmZzNF9nZXRfbWFjaGluZV9jcmVkX2xvY2tlZChjbHApOwogCWlmIChjcmVkICE9IE5VTEwpCiAJCWdvdG8gb3V0OwogCXBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7CkBAIC0xMjUsNiArMTM0LDcgQEAKIAkJY3JlZCA9IGdldF9ycGNjcmVkKHNwLT5zb19jcmVkKTsKIAl9CiBvdXQ6CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJcmV0dXJuIGNyZWQ7CiB9CiAKQEAgLTI5NSwxMCArMzA1LDYgQEAKIAl9CiB9CiAKLS8qCi0gKiBOb3RlOiBtdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGhlbGQgaW4gb3JkZXIgdG8gcHJldmVudCByYWNlcwotICogICAgICAgd2l0aCByZWJvb3QgcmVjb3ZlcnkhCi0gKi8KIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZnM0X2dldF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCiB7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKQEAgLTMyNywxMCArMzMzLDYgQEAKIAlyZXR1cm4gc3A7CiB9CiAKLS8qCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGhlbGQgaW4gb3JkZXIgdG8gYXZvaWQgcmFjZXMKLSAqIHdpdGggc3RhdGUgcmVjb3ZlcnkuLi4KLSAqLwogdm9pZCBuZnM0X3B1dF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCiB7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNwLT5zb19jbGllbnQ7CkBAIC0zNjEsMTggKzM2MywxOCBAQAogfQogCiB2b2lkCi1uZnM0X3N0YXRlX3NldF9tb2RlX2xvY2tlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG1vZGVfdCBtb2RlKQorbmZzNF9zdGF0ZV9zZXRfbW9kZV9sb2NrZWQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQogewotCWlmIChzdGF0ZS0+c3RhdGUgPT0gbW9kZSkKKwlpZiAoc3RhdGUtPnN0YXRlID09IGZtb2RlKQogCQlyZXR1cm47CiAJLyogTkIhIExpc3QgcmVvcmRlcmluZyAtIHNlZSB0aGUgcmVjbGFpbSBjb2RlIGZvciB3aHkuICAqLwotCWlmICgobW9kZSAmIEZNT0RFX1dSSVRFKSAhPSAoc3RhdGUtPnN0YXRlICYgRk1PREVfV1JJVEUpKSB7Ci0JCWlmIChtb2RlICYgRk1PREVfV1JJVEUpCisJaWYgKChmbW9kZSAmIEZNT0RFX1dSSVRFKSAhPSAoc3RhdGUtPnN0YXRlICYgRk1PREVfV1JJVEUpKSB7CisJCWlmIChmbW9kZSAmIEZNT0RFX1dSSVRFKQogCQkJbGlzdF9tb3ZlKCZzdGF0ZS0+b3Blbl9zdGF0ZXMsICZzdGF0ZS0+b3duZXItPnNvX3N0YXRlcyk7CiAJCWVsc2UKIAkJCWxpc3RfbW92ZV90YWlsKCZzdGF0ZS0+b3Blbl9zdGF0ZXMsICZzdGF0ZS0+b3duZXItPnNvX3N0YXRlcyk7CiAJfQotCXN0YXRlLT5zdGF0ZSA9IG1vZGU7CisJc3RhdGUtPnN0YXRlID0gZm1vZGU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqCkBAIC00MzIsMTAgKzQzNCw2IEBACiAJcmV0dXJuIHN0YXRlOwogfQogCi0vKgotICogQmV3YXJlISBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIGV4YWN0bHkgb25lCi0gKiByZWZlcmVuY2UgdG8gY2xwLT5jbF9zZW0hCi0gKi8KIHZvaWQgbmZzNF9wdXRfb3Blbl9zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKQEAgLTQ1NiwxNiArNDU0LDE2IEBACiAvKgogICogQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZS4KICAqLwotc3RhdGljIHZvaWQgX19uZnM0X2Nsb3NlKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG1vZGVfdCBtb2RlLCBpbnQgd2FpdCkKK3N0YXRpYyB2b2lkIF9fbmZzNF9jbG9zZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIgPSBzdGF0ZS0+b3duZXI7CiAJaW50IGNhbGxfY2xvc2UgPSAwOwotCWludCBuZXdzdGF0ZTsKKwlmbW9kZV90IG5ld3N0YXRlOwogCiAJYXRvbWljX2luYygmb3duZXItPnNvX2NvdW50KTsKIAkvKiBQcm90ZWN0IGFnYWluc3QgbmZzNF9maW5kX3N0YXRlKCkgKi8KIAlzcGluX2xvY2soJm93bmVyLT5zb19sb2NrKTsKLQlzd2l0Y2ggKG1vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgeworCXN3aXRjaCAoZm1vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgewogCQljYXNlIEZNT0RFX1JFQUQ6CiAJCQlzdGF0ZS0+bl9yZG9ubHktLTsKIAkJCWJyZWFrOwpAQCAtNTAwLDE0ICs0OTgsMTQgQEAKIAkJbmZzNF9kb19jbG9zZShwYXRoLCBzdGF0ZSwgd2FpdCk7CiB9CiAKLXZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBtb2RlX3QgbW9kZSkKK3ZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQogewotCV9fbmZzNF9jbG9zZShwYXRoLCBzdGF0ZSwgbW9kZSwgMCk7CisJX19uZnM0X2Nsb3NlKHBhdGgsIHN0YXRlLCBmbW9kZSwgMCk7CiB9CiAKLXZvaWQgbmZzNF9jbG9zZV9zeW5jKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG1vZGVfdCBtb2RlKQordm9pZCBuZnM0X2Nsb3NlX3N5bmMoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZm1vZGVfdCBmbW9kZSkKIHsKLQlfX25mczRfY2xvc2UocGF0aCwgc3RhdGUsIG1vZGUsIDEpOworCV9fbmZzNF9jbG9zZShwYXRoLCBzdGF0ZSwgZm1vZGUsIDEpOwogfQogCiAvKgpAQCAtNTY4LDcgKzU2Niw2IEBACiAgKiBSZXR1cm4gYSBjb21wYXRpYmxlIGxvY2tfc3RhdGUuIElmIG5vIGluaXRpYWxpemVkIGxvY2tfc3RhdGUgc3RydWN0dXJlCiAgKiBleGlzdHMsIHJldHVybiBhbiB1bmluaXRpYWxpemVkIG9uZS4KICAqCi0gKiBUaGUgY2FsbGVyIG11c3QgYmUgaG9sZGluZyBjbHAtPmNsX3NlbQogICovCiBzdGF0aWMgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbmZzNF9nZXRfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZsX293bmVyX3Qgb3duZXIpCiB7CkBAIC03NzAsMzIgKzc2NywzNCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgcmVjbGFpbWVyKHZvaWQgKik7CitzdGF0aWMgaW50IG5mczRfcnVuX3N0YXRlX21hbmFnZXIodm9pZCAqKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG5mczRfY2xlYXJfcmVjb3Zlcl9iaXQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mczRfY2xlYXJfc3RhdGVfbWFuYWdlcl9iaXQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKLQljbGVhcl9iaXQoTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiwgJmNscC0+Y2xfc3RhdGUpOworCWNsZWFyX2JpdChORlM0Q0xOVF9NQU5BR0VSX1JVTk5JTkcsICZjbHAtPmNsX3N0YXRlKTsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwotCXdha2VfdXBfYml0KCZjbHAtPmNsX3N0YXRlLCBORlM0Q0xOVF9TVEFURV9SRUNPVkVSKTsKKwl3YWtlX3VwX2JpdCgmY2xwLT5jbF9zdGF0ZSwgTkZTNENMTlRfTUFOQUdFUl9SVU5OSU5HKTsKIAlycGNfd2FrZV91cCgmY2xwLT5jbF9ycGN3YWl0cSk7CiB9CiAKIC8qCi0gKiBTdGF0ZSByZWNvdmVyeSByb3V0aW5lCisgKiBTY2hlZHVsZSB0aGUgbmZzX2NsaWVudCBhc3luY2hyb25vdXMgc3RhdGUgbWFuYWdlbWVudCByb3V0aW5lCiAgKi8KLXN0YXRpYyB2b2lkIG5mczRfcmVjb3Zlcl9zdGF0ZShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQordm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX21hbmFnZXIoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChORlM0Q0xOVF9NQU5BR0VSX1JVTk5JTkcsICZjbHAtPmNsX3N0YXRlKSAhPSAwKQorCQlyZXR1cm47CiAJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKLQl0YXNrID0ga3RocmVhZF9ydW4ocmVjbGFpbWVyLCBjbHAsICIlcy1yZWNsYWltIiwKKwl0YXNrID0ga3RocmVhZF9ydW4obmZzNF9ydW5fc3RhdGVfbWFuYWdlciwgY2xwLCAiJXMtbWFuYWdlciIsCiAJCQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwKIAkJCQkJCQlSUENfRElTUExBWV9BRERSKSk7CiAJaWYgKCFJU19FUlIodGFzaykpCiAJCXJldHVybjsKLQluZnM0X2NsZWFyX3JlY292ZXJfYml0KGNscCk7CisJbmZzNF9jbGVhcl9zdGF0ZV9tYW5hZ2VyX2JpdChjbHApOwogCW5mc19wdXRfY2xpZW50KGNscCk7CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CkBAIC04MDcsMTYgKzgwNiw0MiBAQAogewogCWlmICghY2xwKQogCQlyZXR1cm47Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoTkZTNENMTlRfU1RBVEVfUkVDT1ZFUiwgJmNscC0+Y2xfc3RhdGUpID09IDApCi0JCW5mczRfcmVjb3Zlcl9zdGF0ZShjbHApOworCWlmICghdGVzdF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpKQorCQlzZXRfYml0KE5GUzRDTE5UX0NIRUNLX0xFQVNFLCAmY2xwLT5jbF9zdGF0ZSk7CisJbmZzNF9zY2hlZHVsZV9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF9yZWNsYWltX2xvY2tzKHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyAqb3BzLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCitzdGF0aWMgaW50IG5mczRfc3RhdGVfbWFya19yZWNsYWltX3JlYm9vdChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCit7CisKKwlzZXRfYml0KE5GU19TVEFURV9SRUNMQUlNX1JFQk9PVCwgJnN0YXRlLT5mbGFncyk7CisJLyogRG9uJ3QgcmVjb3ZlciBzdGF0ZSB0aGF0IGV4cGlyZWQgYmVmb3JlIHRoZSByZWJvb3QgKi8KKwlpZiAodGVzdF9iaXQoTkZTX1NUQVRFX1JFQ0xBSU1fTk9HUkFDRSwgJnN0YXRlLT5mbGFncykpIHsKKwkJY2xlYXJfYml0KE5GU19TVEFURV9SRUNMQUlNX1JFQk9PVCwgJnN0YXRlLT5mbGFncyk7CisJCXJldHVybiAwOworCX0KKwlzZXRfYml0KE5GU19PV05FUl9SRUNMQUlNX1JFQk9PVCwgJnN0YXRlLT5vd25lci0+c29fZmxhZ3MpOworCXNldF9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKTsKKwlyZXR1cm4gMTsKK30KKworaW50IG5mczRfc3RhdGVfbWFya19yZWNsYWltX25vZ3JhY2Uoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXNldF9iaXQoTkZTX1NUQVRFX1JFQ0xBSU1fTk9HUkFDRSwgJnN0YXRlLT5mbGFncyk7CisJY2xlYXJfYml0KE5GU19TVEFURV9SRUNMQUlNX1JFQk9PVCwgJnN0YXRlLT5mbGFncyk7CisJc2V0X2JpdChORlNfT1dORVJfUkVDTEFJTV9OT0dSQUNFLCAmc3RhdGUtPm93bmVyLT5zb19mbGFncyk7CisJc2V0X2JpdChORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsICZjbHAtPmNsX3N0YXRlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBuZnM0X3JlY2xhaW1fbG9ja3Moc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAJc3RydWN0IGZpbGVfbG9jayAqZmw7CiAJaW50IHN0YXR1cyA9IDA7CiAKKwlkb3duX3dyaXRlKCZuZnNpLT5yd3NlbSk7CiAJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CiAJCWlmICghKGZsLT5mbF9mbGFncyAmIChGTF9QT1NJWHxGTF9GTE9DSykpKQogCQkJY29udGludWU7CkBAIC04MzksMTIgKzg2NCwxNCBAQAogCQkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KKwl1cF93cml0ZSgmbmZzaS0+cndzZW0pOwogCXJldHVybiAwOwogb3V0X2VycjoKKwl1cF93cml0ZSgmbmZzaS0+cndzZW0pOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF9yZWNsYWltX29wZW5fc3RhdGUoc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHMsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCkKK3N0YXRpYyBpbnQgbmZzNF9yZWNsYWltX29wZW5fc3RhdGUoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbG9jazsKQEAgLTg1OCwyOCArODg1LDM0IEBACiAJICogcmVjb3ZlcmluZyBhZnRlciBhIG5ldHdvcmsgcGFydGl0aW9uIG9yIGEgcmVib290IGZyb20gYQogCSAqIHNlcnZlciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBhIGdyYWNlIHBlcmlvZC4KIAkgKi8KK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzcC0+c29fbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdGF0ZSwgJnNwLT5zb19zdGF0ZXMsIG9wZW5fc3RhdGVzKSB7CisJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KG9wcy0+c3RhdGVfZmxhZ19iaXQsICZzdGF0ZS0+ZmxhZ3MpKQorCQkJY29udGludWU7CiAJCWlmIChzdGF0ZS0+c3RhdGUgPT0gMCkKIAkJCWNvbnRpbnVlOworCQlhdG9taWNfaW5jKCZzdGF0ZS0+Y291bnQpOworCQlzcGluX3VubG9jaygmc3AtPnNvX2xvY2spOwogCQlzdGF0dXMgPSBvcHMtPnJlY292ZXJfb3BlbihzcCwgc3RhdGUpOwogCQlpZiAoc3RhdHVzID49IDApIHsKLQkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9sb2NrcyhvcHMsIHN0YXRlKTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWdvdG8gb3V0X2VycjsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgJnN0YXRlLT5sb2NrX3N0YXRlcywgbHNfbG9ja3MpIHsKLQkJCQlpZiAoIShsb2NrLT5sc19mbGFncyAmIE5GU19MT0NLX0lOSVRJQUxJWkVEKSkKLQkJCQkJcHJpbnRrKCIlczogTG9jayByZWNsYWltIGZhaWxlZCFcbiIsCisJCQlzdGF0dXMgPSBuZnM0X3JlY2xhaW1fbG9ja3Moc3RhdGUsIG9wcyk7CisJCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZzdGF0ZS0+bG9ja19zdGF0ZXMsIGxzX2xvY2tzKSB7CisJCQkJCWlmICghKGxvY2stPmxzX2ZsYWdzICYgTkZTX0xPQ0tfSU5JVElBTElaRUQpKQorCQkJCQkJcHJpbnRrKCIlczogTG9jayByZWNsYWltIGZhaWxlZCFcbiIsCiAJCQkJCQkJX19mdW5jX18pOworCQkJCX0KKwkJCQluZnM0X3B1dF9vcGVuX3N0YXRlKHN0YXRlKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CiAJCQl9Ci0JCQljb250aW51ZTsKIAkJfQogCQlzd2l0Y2ggKHN0YXR1cykgewogCQkJZGVmYXVsdDoKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmhhbmRsZWQgZXJyb3IgJWQuIFplcm9pbmcgc3RhdGVcbiIsCiAJCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCWNhc2UgLUVOT0VOVDoKLQkJCWNhc2UgLU5GUzRFUlJfUkVDTEFJTV9CQUQ6Ci0JCQljYXNlIC1ORlM0RVJSX1JFQ0xBSU1fQ09ORkxJQ1Q6CisJCQljYXNlIC1FU1RBTEU6CiAJCQkJLyoKIAkJCQkgKiBPcGVuIHN0YXRlIG9uIHRoaXMgZmlsZSBjYW5ub3QgYmUgcmVjb3ZlcmVkCiAJCQkJICogQWxsIHdlIGNhbiBkbyBpcyByZXZlcnQgdG8gdXNpbmcgdGhlIHplcm8gc3RhdGVpZC4KQEAgLTg4OSw4NCArOTIyLDE3NiBAQAogCQkJCS8qIE1hcmsgdGhlIGZpbGUgYXMgYmVpbmcgJ2Nsb3NlZCcgKi8KIAkJCQlzdGF0ZS0+c3RhdGUgPSAwOwogCQkJCWJyZWFrOworCQkJY2FzZSAtTkZTNEVSUl9SRUNMQUlNX0JBRDoKKwkJCWNhc2UgLU5GUzRFUlJfUkVDTEFJTV9DT05GTElDVDoKKwkJCQluZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9ub2dyYWNlKHNwLT5zb19jbGllbnQsIHN0YXRlKTsKKwkJCQlicmVhazsKIAkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKIAkJCWNhc2UgLU5GUzRFUlJfTk9fR1JBQ0U6CisJCQkJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZShzcC0+c29fY2xpZW50LCBzdGF0ZSk7CiAJCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgogCQkJCWdvdG8gb3V0X2VycjsKIAkJfQorCQluZnM0X3B1dF9vcGVuX3N0YXRlKHN0YXRlKTsKKwkJZ290byByZXN0YXJ0OwogCX0KKwlzcGluX3VubG9jaygmc3AtPnNvX2xvY2spOwogCXJldHVybiAwOwogb3V0X2VycjoKKwluZnM0X3B1dF9vcGVuX3N0YXRlKHN0YXRlKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBuZnM0X3N0YXRlX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQorc3RhdGljIHZvaWQgbmZzNF9jbGVhcl9vcGVuX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsb2NrOworCisJY2xlYXJfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChORlNfT19SRE9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChORlNfT19XUk9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZzdGF0ZS0+bG9ja19zdGF0ZXMsIGxzX2xvY2tzKSB7CisJCWxvY2stPmxzX3NlcWlkLmZsYWdzID0gMDsKKwkJbG9jay0+bHNfZmxhZ3MgJj0gfk5GU19MT0NLX0lOSVRJQUxJWkVEOworCX0KK30KKworc3RhdGljIHZvaWQgbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1faGVscGVyKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGludCAoKm1hcmtfcmVjbGFpbSkoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKSkKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CiAJc3RydWN0IHJiX25vZGUgKnBvczsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbG9jazsKIAogCS8qIFJlc2V0IGFsbCBzZXF1ZW5jZSBpZHMgdG8gemVybyAqLwogCWZvciAocG9zID0gcmJfZmlyc3QoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsgcG9zICE9IE5VTEw7IHBvcyA9IHJiX25leHQocG9zKSkgewogCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKLQkJc3AtPnNvX3NlcWlkLmNvdW50ZXIgPSAwOwogCQlzcC0+c29fc2VxaWQuZmxhZ3MgPSAwOwogCQlzcGluX2xvY2soJnNwLT5zb19sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdGF0ZSwgJnNwLT5zb19zdGF0ZXMsIG9wZW5fc3RhdGVzKSB7Ci0JCQljbGVhcl9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7Ci0JCQljbGVhcl9iaXQoTkZTX09fUkRPTkxZX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKLQkJCWNsZWFyX2JpdChORlNfT19XUk9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOwotCQkJY2xlYXJfYml0KE5GU19PX1JEV1JfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmc3RhdGUtPmxvY2tfc3RhdGVzLCBsc19sb2NrcykgewotCQkJCWxvY2stPmxzX3NlcWlkLmNvdW50ZXIgPSAwOwotCQkJCWxvY2stPmxzX3NlcWlkLmZsYWdzID0gMDsKLQkJCQlsb2NrLT5sc19mbGFncyAmPSB+TkZTX0xPQ0tfSU5JVElBTElaRUQ7Ci0JCQl9CisJCQlpZiAobWFya19yZWNsYWltKGNscCwgc3RhdGUpKQorCQkJCW5mczRfY2xlYXJfb3Blbl9zdGF0ZShzdGF0ZSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJnNwLT5zb19sb2NrKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmVjbGFpbWVyKHZvaWQgKnB0cikKK3N0YXRpYyB2b2lkIG5mczRfc3RhdGVfc3RhcnRfcmVjbGFpbV9yZWJvb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gcHRyOworCS8qIE1hcmsgYWxsIGRlbGVnYXRpb25zIGZvciByZWNsYWltICovCisJbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltKGNscCk7CisJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1faGVscGVyKGNscCwgbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fcmVib290KTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9zdGF0ZV9lbmRfcmVjbGFpbV9yZWJvb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CiAJc3RydWN0IHJiX25vZGUgKnBvczsKLQlzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wczsKLQlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKSkKKwkJcmV0dXJuOworCisJZm9yIChwb3MgPSByYl9maXJzdCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOyBwb3MgIT0gTlVMTDsgcG9zID0gcmJfbmV4dChwb3MpKSB7CisJCXNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOworCQlzcGluX2xvY2soJnNwLT5zb19sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdGF0ZSwgJnNwLT5zb19zdGF0ZXMsIG9wZW5fc3RhdGVzKSB7CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChORlNfU1RBVEVfUkVDTEFJTV9SRUJPT1QsICZzdGF0ZS0+ZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCQkJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZShjbHAsIHN0YXRlKTsKKwkJfQorCQlzcGluX3VubG9jaygmc3AtPnNvX2xvY2spOworCX0KKworCW5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKGNscCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19kZWxlZ2F0aW9uX2NsZWFyX2FsbChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCW5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShjbHApOworCW5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKGNscCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfc3RhdGVfc3RhcnRfcmVjbGFpbV9ub2dyYWNlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJbmZzX2RlbGVnYXRpb25fY2xlYXJfYWxsKGNscCk7CisJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1faGVscGVyKGNscCwgbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZSk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfc3RhdGVfZW5kX3JlY2xhaW1fbm9ncmFjZShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCWNsZWFyX2JpdChORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsICZjbHAtPmNsX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3Ioc3RydWN0IG5mc19jbGllbnQgKmNscCwgaW50IGVycm9yKQoreworCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAtTkZTNEVSUl9DQl9QQVRIX0RPV046CisJCQluZnNfaGFuZGxlX2NiX3BhdGhkb3duKGNscCk7CisJCQlicmVhazsKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJY2FzZSAtTkZTNEVSUl9MRUFTRV9NT1ZFRDoKKwkJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOworCQkJbmZzNF9zdGF0ZV9zdGFydF9yZWNsYWltX3JlYm9vdChjbHApOworCQkJYnJlYWs7CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOworCQkJbmZzNF9zdGF0ZV9zdGFydF9yZWNsYWltX25vZ3JhY2UoY2xwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9kb19yZWNsYWltKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyAqb3BzKQoreworCXN0cnVjdCByYl9ub2RlICpwb3M7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlhbGxvd19zaWduYWwoU0lHS0lMTCk7Ci0KLQkvKiBFbnN1cmUgZXhjbHVzaXZlIGFjY2VzcyB0byBORlN2NCBzdGF0ZSAqLwotCWRvd25fd3JpdGUoJmNscC0+Y2xfc2VtKTsKLQkvKiBBcmUgdGhlcmUgYW55IE5GUyBtb3VudHMgb3V0IHRoZXJlPyAqLwotCWlmIChsaXN0X2VtcHR5KCZjbHAtPmNsX3N1cGVyYmxvY2tzKSkKLQkJZ290byBvdXQ7Ci1yZXN0YXJ0X2xvb3A6Ci0Jb3BzID0gJm5mczRfbmV0d29ya19wYXJ0aXRpb25fcmVjb3Zlcnlfb3BzOwotCS8qIEFyZSB0aGVyZSBhbnkgb3BlbiBmaWxlcyBvbiB0aGlzIHZvbHVtZT8gKi8KLQljcmVkID0gbmZzNF9nZXRfcmVuZXdfY3JlZChjbHApOwotCWlmIChjcmVkICE9IE5VTEwpIHsKLQkJLyogWWVzIHRoZXJlIGFyZTogdHJ5IHRvIHJlbmV3IHRoZSBvbGQgbGVhc2UgKi8KLQkJc3RhdHVzID0gbmZzNF9wcm9jX3JlbmV3KGNscCwgY3JlZCk7Ci0JCXB1dF9ycGNjcmVkKGNyZWQpOwotCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSAwOgotCQkJY2FzZSAtTkZTNEVSUl9DQl9QQVRIX0RPV046Ci0JCQkJZ290byBvdXQ7Ci0JCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgotCQkJY2FzZSAtTkZTNEVSUl9MRUFTRV9NT1ZFRDoKLQkJCQlvcHMgPSAmbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzOworcmVzdGFydDoKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJZm9yIChwb3MgPSByYl9maXJzdCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOyBwb3MgIT0gTlVMTDsgcG9zID0gcmJfbmV4dChwb3MpKSB7CisJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQob3BzLT5vd25lcl9mbGFnX2JpdCwgJnNwLT5zb19mbGFncykpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmc3AtPnNvX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9vcGVuX3N0YXRlKHNwLCBvcHMpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJc2V0X2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LCAmc3AtPnNvX2ZsYWdzKTsKKwkJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwkJCW5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQl9IGVsc2UgewotCQkvKiAicmVib290IiB0byBlbnN1cmUgd2UgY2xlYXIgYWxsIHN0YXRlIG9uIHRoZSBzZXJ2ZXIgKi8KLQkJY2xwLT5jbF9ib290X3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwkJZ290byByZXN0YXJ0OwogCX0KLQkvKiBXZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlLWVzdGFibGlzaCBhIGNsaWVudGlkICovCi0JbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW0oY2xwKTsKLQlzdGF0dXMgPSAtRU5PRU5UOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9jaGVja19sZWFzZShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlpbnQgc3RhdHVzID0gLU5GUzRFUlJfRVhQSVJFRDsKKworCS8qIElzIHRoZSBjbGllbnQgYWxyZWFkeSBrbm93biB0byBoYXZlIGFuIGV4cGlyZWQgbGVhc2U/ICovCisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKSkKKwkJcmV0dXJuIDA7CisJY3JlZCA9IG5mczRfZ2V0X3JlbmV3X2NyZWQoY2xwKTsKKwlpZiAoY3JlZCA9PSBOVUxMKSB7CisJCWNyZWQgPSBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkKGNscCk7CisJCWlmIChjcmVkID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gbmZzNF9wcm9jX3JlbmV3KGNscCwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CitvdXQ6CisJbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9yZWNsYWltX2xlYXNlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCWludCBzdGF0dXMgPSAtRU5PRU5UOworCiAJY3JlZCA9IG5mczRfZ2V0X3NldGNsaWVudGlkX2NyZWQoY2xwKTsKIAlpZiAoY3JlZCAhPSBOVUxMKSB7CiAJCXN0YXR1cyA9IG5mczRfaW5pdF9jbGllbnQoY2xwLCBjcmVkKTsKQEAgLTk3NCw0MiArMTA5OSw5MCBAQAogCQkvKiBIYW5kbGUgY2FzZSB3aGVyZSB0aGUgdXNlciBoYXNuJ3Qgc2V0IHVwIG1hY2hpbmUgY3JlZHMgKi8KIAkJaWYgKHN0YXR1cyA9PSAtRUFDQ0VTICYmIGNyZWQgPT0gY2xwLT5jbF9tYWNoaW5lX2NyZWQpIHsKIAkJCW5mczRfY2xlYXJfbWFjaGluZV9jcmVkKGNscCk7Ci0JCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwkJCXN0YXR1cyA9IC1FQUdBSU47CiAJCX0KIAl9Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXRfZXJyb3I7Ci0JLyogTWFyayBhbGwgZGVsZWdhdGlvbnMgZm9yIHJlY2xhaW0gKi8KLQluZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0oY2xwKTsKLQkvKiBOb3RlOiBsaXN0IGlzIHByb3RlY3RlZCBieSBleGNsdXNpdmUgbG9jayBvbiBjbC0+Y2xfc2VtICovCi0JZm9yIChwb3MgPSByYl9maXJzdCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOyBwb3MgIT0gTlVMTDsgcG9zID0gcmJfbmV4dChwb3MpKSB7Ci0JCXNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOwotCQlzdGF0dXMgPSBuZnM0X3JlY2xhaW1fb3Blbl9zdGF0ZShvcHMsIHNwKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfTk9fR1JBQ0UpIHsKLQkJCQlvcHMgPSAmbmZzNF9uZXR3b3JrX3BhcnRpdGlvbl9yZWNvdmVyeV9vcHM7Ci0JCQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX29wZW5fc3RhdGUob3BzLCBzcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgbmZzNF9zdGF0ZV9tYW5hZ2VyKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBFbnN1cmUgZXhjbHVzaXZlIGFjY2VzcyB0byBORlN2NCBzdGF0ZSAqLworCWZvcig7OykgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKSkgeworCQkJLyogV2UncmUgZ29pbmcgdG8gaGF2ZSB0byByZS1lc3RhYmxpc2ggYSBjbGllbnRpZCAqLworCQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX2xlYXNlKGNscCk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJc2V0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSk7CisJCQkJaWYgKHN0YXR1cyA9PSAtRUFHQUlOKQorCQkJCQljb250aW51ZTsKKwkJCQlnb3RvIG91dF9lcnJvcjsKIAkJCX0KLQkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQpCi0JCQkJZ290byByZXN0YXJ0X2xvb3A7Ci0JCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0VYUElSRUQpCi0JCQkJZ290byByZXN0YXJ0X2xvb3A7CisJCQljbGVhcl9iaXQoTkZTNENMTlRfQ0hFQ0tfTEVBU0UsICZjbHAtPmNsX3N0YXRlKTsKIAkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfQ0hFQ0tfTEVBU0UsICZjbHAtPmNsX3N0YXRlKSkgeworCQkJc3RhdHVzID0gbmZzNF9jaGVja19sZWFzZShjbHApOworCQkJaWYgKHN0YXR1cyAhPSAwKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRmlyc3QgcmVjb3ZlciByZWJvb3Qgc3RhdGUuLi4gKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChORlM0Q0xOVF9SRUNMQUlNX1JFQk9PVCwgJmNscC0+Y2xfc3RhdGUpKSB7CisJCQlzdGF0dXMgPSBuZnM0X2RvX3JlY2xhaW0oY2xwLCAmbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzKTsKKwkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQpCisJCQkJY29udGludWU7CisJCQluZnM0X3N0YXRlX2VuZF9yZWNsYWltX3JlYm9vdChjbHApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3cgcmVjb3ZlciBleHBpcmVkIHN0YXRlLi4uICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfUkVDTEFJTV9OT0dSQUNFLCAmY2xwLT5jbF9zdGF0ZSkpIHsKKwkJCXN0YXR1cyA9IG5mczRfZG9fcmVjbGFpbShjbHAsICZuZnM0X25vZ3JhY2VfcmVjb3Zlcnlfb3BzKTsKKwkJCWlmIChzdGF0dXMgPCAwKSB7CisJCQkJc2V0X2JpdChORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsICZjbHAtPmNsX3N0YXRlKTsKKwkJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0VYUElSRUQpCisJCQkJCWNvbnRpbnVlOworCQkJCWdvdG8gb3V0X2Vycm9yOworCQkJfSBlbHNlCisJCQkJbmZzNF9zdGF0ZV9lbmRfcmVjbGFpbV9ub2dyYWNlKGNscCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKSkgeworCQkJbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKGNscCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5mczRfY2xlYXJfc3RhdGVfbWFuYWdlcl9iaXQoY2xwKTsKKwkJLyogRGlkIHdlIHJhY2Ugd2l0aCBhbiBhdHRlbXB0IHRvIGdpdmUgdXMgbW9yZSB3b3JrPyAqLworCQlpZiAoY2xwLT5jbF9zdGF0ZSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KE5GUzRDTE5UX01BTkFHRVJfUlVOTklORywgJmNscC0+Y2xfc3RhdGUpICE9IDApCisJCQlicmVhazsKIAl9Ci0JbmZzX2RlbGVnYXRpb25fcmVhcF91bmNsYWltZWQoY2xwKTsKLW91dDoKLQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOwotCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfQ0JfUEFUSF9ET1dOKQotCQluZnNfaGFuZGxlX2NiX3BhdGhkb3duKGNscCk7Ci0JbmZzNF9jbGVhcl9yZWNvdmVyX2JpdChjbHApOworCXJldHVybjsKK291dF9lcnJvcjoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvcjogc3RhdGUgbWFuYWdlciBmYWlsZWQgb24gTkZTdjQgc2VydmVyICVzIgorCQkJIiB3aXRoIGVycm9yICVkXG4iLCBjbHAtPmNsX2hvc3RuYW1lLCAtc3RhdHVzKTsKKwlpZiAodGVzdF9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKSkKKwkJbmZzNF9zdGF0ZV9lbmRfcmVjbGFpbV9yZWJvb3QoY2xwKTsKKwluZnM0X2NsZWFyX3N0YXRlX21hbmFnZXJfYml0KGNscCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9ydW5fc3RhdGVfbWFuYWdlcih2b2lkICpwdHIpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHB0cjsKKworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwluZnM0X3N0YXRlX21hbmFnZXIoY2xwKTsKIAluZnNfcHV0X2NsaWVudChjbHApOwogCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7CiAJcmV0dXJuIDA7Ci1vdXRfZXJyb3I6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3I6IHN0YXRlIHJlY292ZXJ5IGZhaWxlZCBvbiBORlN2NCBzZXJ2ZXIgJXMiCi0JCQkiIHdpdGggZXJyb3IgJWRcbiIsIGNscC0+Y2xfaG9zdG5hbWUsIC1zdGF0dXMpOwotCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOwotCWdvdG8gb3V0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggYjkxNjI5Ny4uZDFlNGM4ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CiAgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+Ci0gKiAKKyAqCiAgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgKiAgYXJlIG1ldDoKQEAgLTY3LDcgKzY3LDcgQEAKICNkZWZpbmUgTkZTNF9NQVhUQUdMRU4JCTAKICNlbmRpZgogCi0vKiBsb2NrLG9wZW4gb3duZXIgaWQ6IAorLyogbG9jayxvcGVuIG93bmVyIGlkOgogICogd2UgY3VycmVudGx5IHVzZSBzaXplIDIgKHU2NCkgb3V0IG9mIChORlM0X09QQVFVRV9MSU1JVCAgPj4gMikKICAqLwogI2RlZmluZSBvcGVuX293bmVyX2lkX21heHN6CSgxICsgNCkKQEAgLTU0MSw2ICs1NDEsNyBAQAogc3RydWN0IGNvbXBvdW5kX2hkciB7CiAJaW50MzJfdAkJc3RhdHVzOwogCXVpbnQzMl90CW5vcHM7CisJX19iZTMyICoJbm9wc19wOwogCXVpbnQzMl90CXRhZ2xlbjsKIAljaGFyICoJCXRhZzsKIH07CkBAIC01NzgsNyArNTc5LDcgQEAKIAl4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHIsIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCitzdGF0aWMgdm9pZCBlbmNvZGVfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7CiAKQEAgLTU4OCw4ICs1ODksMTMgQEAKIAlXUklURTMyKGhkci0+dGFnbGVuKTsKIAlXUklURU1FTShoZHItPnRhZywgaGRyLT50YWdsZW4pOwogCVdSSVRFMzIoTkZTNF9NSU5PUl9WRVJTSU9OKTsKKwloZHItPm5vcHNfcCA9IHA7CiAJV1JJVEUzMihoZHItPm5vcHMpOwotCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfbm9wcyhzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCit7CisJKmhkci0+bm9wc19wID0gaHRvbmwoaGRyLT5ub3BzKTsKIH0KIAogc3RhdGljIHZvaWQgZW5jb2RlX25mczRfdmVyaWZpZXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgbmZzNF92ZXJpZmllciAqdmVyZikKQEAgLTYwMSw3ICs2MDcsNyBAQAogCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIHZlcmYtPmRhdGEsIE5GUzRfVkVSSUZJRVJfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2F0dHJzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBpYXR0ciAqaWFwLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQorc3RhdGljIHZvaWQgZW5jb2RlX2F0dHJzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBpYXR0ciAqaWFwLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQogewogCWNoYXIgb3duZXJfbmFtZVtJRE1BUF9OQU1FU1pdOwogCWNoYXIgb3duZXJfZ3JvdXBbSURNQVBfTkFNRVNaXTsKQEAgLTYxMiw3ICs2MTgsNiBAQAogCWludCBsZW47CiAJdWludDMyX3QgYm12YWwwID0gMDsKIAl1aW50MzJfdCBibXZhbDEgPSAwOwotCWludCBzdGF0dXM7CiAKIAkvKgogCSAqIFdlIHJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBlbnRpcmUgYXR0cmlidXRlIGJ1ZmZlciBhdCBvbmNlLgpAQCAtNzA5LDcgKzcxNCw3IEBACiAJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfVElNRV9NT0RJRllfU0VUOwogCQlXUklURTMyKE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FKTsKIAl9Ci0JCisKIAkvKgogCSAqIE5vdyB3ZSBiYWNrZmlsbCB0aGUgYml0bWFwIGFuZCB0aGUgYXR0cmlidXRlIGJ1ZmZlciBsZW5ndGguCiAJICovCkBAIC03MjMsMjMgKzcyOCwyMCBAQAogCSpxKysgPSBodG9ubChibXZhbDEpOwogCSpxKysgPSBodG9ubChsZW4pOwogCi0Jc3RhdHVzID0gMDsKIC8qIG91dDogKi8KLQlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyIGFjY2VzcykKK3N0YXRpYyB2b2lkIGVuY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyIGFjY2Vzcywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCk7CiAJV1JJVEUzMihPUF9BQ0NFU1MpOwogCVdSSVRFMzIoYWNjZXNzKTsKLQkKLQlyZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfY2xvc2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZykKK3N0YXRpYyB2b2lkIGVuY29kZV9jbG9zZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJnLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwogCkBAIC03NDcsMjYgKzc0OSwyNCBAQAogCVdSSVRFMzIoT1BfQ0xPU0UpOwogCVdSSVRFMzIoYXJnLT5zZXFpZC0+c2VxdWVuY2UtPmNvdW50ZXIpOwogCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC0+ZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOwotCQotCXJldHVybiAwOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9jb21taXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfY29tbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwotICAgICAgICAKLSAgICAgICAgUkVTRVJWRV9TUEFDRSgxNik7Ci0gICAgICAgIFdSSVRFMzIoT1BfQ09NTUlUKTsKLSAgICAgICAgV1JJVEU2NChhcmdzLT5vZmZzZXQpOwotICAgICAgICBXUklURTMyKGFyZ3MtPmNvdW50KTsKIAotICAgICAgICByZXR1cm4gMDsKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlXUklURTMyKE9QX0NPTU1JVCk7CisJV1JJVEU2NChhcmdzLT5vZmZzZXQpOworCVdSSVRFMzIoYXJncy0+Y291bnQpOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9jcmVhdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqY3JlYXRlKQorc3RhdGljIHZvaWQgZW5jb2RlX2NyZWF0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICpjcmVhdGUsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7Ci0JCisKIAlSRVNFUlZFX1NQQUNFKDgpOwogCVdSSVRFMzIoT1BfQ1JFQVRFKTsKIAlXUklURTMyKGNyZWF0ZS0+ZnR5cGUpOwpAQCAtNzkxLDY0ICs3OTEsNjIgQEAKIAlSRVNFUlZFX1NQQUNFKDQgKyBjcmVhdGUtPm5hbWUtPmxlbik7CiAJV1JJVEUzMihjcmVhdGUtPm5hbWUtPmxlbik7CiAJV1JJVEVNRU0oY3JlYXRlLT5uYW1lLT5uYW1lLCBjcmVhdGUtPm5hbWUtPmxlbik7CisJaGRyLT5ub3BzKys7CiAKLQlyZXR1cm4gZW5jb2RlX2F0dHJzKHhkciwgY3JlYXRlLT5hdHRycywgY3JlYXRlLT5zZXJ2ZXIpOworCWVuY29kZV9hdHRycyh4ZHIsIGNyZWF0ZS0+YXR0cnMsIGNyZWF0ZS0+c2VydmVyKTsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfZ2V0YXR0cl9vbmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgYml0bWFwKQorc3RhdGljIHZvaWQgZW5jb2RlX2dldGF0dHJfb25lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IGJpdG1hcCwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotICAgICAgICBfX2JlMzIgKnA7CisJX19iZTMyICpwOwogCi0gICAgICAgIFJFU0VSVkVfU1BBQ0UoMTIpOwotICAgICAgICBXUklURTMyKE9QX0dFVEFUVFIpOwotICAgICAgICBXUklURTMyKDEpOwotICAgICAgICBXUklURTMyKGJpdG1hcCk7Ci0gICAgICAgIHJldHVybiAwOworCVJFU0VSVkVfU1BBQ0UoMTIpOworCVdSSVRFMzIoT1BfR0VUQVRUUik7CisJV1JJVEUzMigxKTsKKwlXUklURTMyKGJpdG1hcCk7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2dldGF0dHJfdHdvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IGJtMCwgdWludDMyX3QgYm0xKQorc3RhdGljIHZvaWQgZW5jb2RlX2dldGF0dHJfdHdvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IGJtMCwgdWludDMyX3QgYm0xLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0gICAgICAgIF9fYmUzMiAqcDsKKwlfX2JlMzIgKnA7CiAKLSAgICAgICAgUkVTRVJWRV9TUEFDRSgxNik7Ci0gICAgICAgIFdSSVRFMzIoT1BfR0VUQVRUUik7Ci0gICAgICAgIFdSSVRFMzIoMik7Ci0gICAgICAgIFdSSVRFMzIoYm0wKTsKLSAgICAgICAgV1JJVEUzMihibTEpOwotICAgICAgICByZXR1cm4gMDsKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlXUklURTMyKE9QX0dFVEFUVFIpOworCVdSSVRFMzIoMik7CisJV1JJVEUzMihibTApOworCVdSSVRFMzIoYm0xKTsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfZ2V0ZmF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrKQorc3RhdGljIHZvaWQgZW5jb2RlX2dldGZhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCXJldHVybiBlbmNvZGVfZ2V0YXR0cl90d28oeGRyLAotCQkJYml0bWFza1swXSAmIG5mczRfZmF0dHJfYml0bWFwWzBdLAotCQkJYml0bWFza1sxXSAmIG5mczRfZmF0dHJfYml0bWFwWzFdKTsKKwllbmNvZGVfZ2V0YXR0cl90d28oeGRyLCBiaXRtYXNrWzBdICYgbmZzNF9mYXR0cl9iaXRtYXBbMF0sCisJCQkgICBiaXRtYXNrWzFdICYgbmZzNF9mYXR0cl9iaXRtYXBbMV0sIGhkcik7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2ZzaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1MzIqIGJpdG1hc2spCitzdGF0aWMgdm9pZCBlbmNvZGVfZnNpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCXJldHVybiBlbmNvZGVfZ2V0YXR0cl90d28oeGRyLCBiaXRtYXNrWzBdICYgbmZzNF9mc2luZm9fYml0bWFwWzBdLAotCQkJYml0bWFza1sxXSAmIG5mczRfZnNpbmZvX2JpdG1hcFsxXSk7CisJZW5jb2RlX2dldGF0dHJfdHdvKHhkciwgYml0bWFza1swXSAmIG5mczRfZnNpbmZvX2JpdG1hcFswXSwKKwkJCSAgIGJpdG1hc2tbMV0gJiBuZnM0X2ZzaW5mb19iaXRtYXBbMV0sIGhkcik7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1MzIqIGJpdG1hc2spCitzdGF0aWMgdm9pZCBlbmNvZGVfZnNfbG9jYXRpb25zKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCXJldHVybiBlbmNvZGVfZ2V0YXR0cl90d28oeGRyLAotCQkJCSAgYml0bWFza1swXSAmIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFswXSwKLQkJCQkgIGJpdG1hc2tbMV0gJiBuZnM0X2ZzX2xvY2F0aW9uc19iaXRtYXBbMV0pOworCWVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIGJpdG1hc2tbMF0gJiBuZnM0X2ZzX2xvY2F0aW9uc19iaXRtYXBbMF0sCisJCQkgICBiaXRtYXNrWzFdICYgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzFdLCBoZHIpOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9nZXRmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQorc3RhdGljIHZvaWQgZW5jb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCVdSSVRFMzIoT1BfR0VURkgpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2xpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCitzdGF0aWMgdm9pZCBlbmNvZGVfbGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtODU2LDggKzg1NCw3IEBACiAJV1JJVEUzMihPUF9MSU5LKTsKIAlXUklURTMyKG5hbWUtPmxlbik7CiAJV1JJVEVNRU0obmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKLQkKLQlyZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmZzNF9sb2NrX3R5cGUoc3RydWN0IGZpbGVfbG9jayAqZmwsIGludCBibG9jaykKQEAgLTg3OCw3ICs4NzUsNyBAQAogICogb3Bjb2RlLHR5cGUscmVjbGFpbSxvZmZzZXQsbGVuZ3RoLG5ld19sb2NrX293bmVyID0gMzIKICAqIG9wZW5fc2VxaWQsb3Blbl9zdGF0ZWlkLGxvY2tfc2VxaWQsbG9ja19vd25lci5jbGllbnRpZCwgbG9ja19vd25lci5pZCA9IDQwCiAgKi8KLXN0YXRpYyBpbnQgZW5jb2RlX2xvY2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrX2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfbG9jayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtOTA0LDExICs5MDEsMTAgQEAKIAkJV1JJVEVNRU0oYXJncy0+bG9ja19zdGF0ZWlkLT5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7CiAJCVdSSVRFMzIoYXJncy0+bG9ja19zZXFpZC0+c2VxdWVuY2UtPmNvdW50ZXIpOwogCX0KLQotCXJldHVybiAwOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9sb2NrdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2t0X2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfbG9ja3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrdF9hcmdzICphcmdzLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwogCkBAIC05MjEsMTEgKzkxNywxMCBAQAogCVdSSVRFMzIoMTYpOwogCVdSSVRFTUVNKCJsb2NrIGlkOiIsIDgpOwogCVdSSVRFNjQoYXJncy0+bG9ja19vd25lci5pZCk7Ci0KLQlyZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfbG9ja3Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrdV9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgZW5jb2RlX2xvY2t1KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtOTM2LDExICs5MzEsMTAgQEAKIAlXUklURU1FTShhcmdzLT5zdGF0ZWlkLT5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7CiAJV1JJVEU2NChhcmdzLT5mbC0+Zmxfc3RhcnQpOwogCVdSSVRFNjQobmZzNF9sb2NrX2xlbmd0aChhcmdzLT5mbCkpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2xvb2t1cChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3N0YXRpYyB2b2lkIGVuY29kZV9sb29rdXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlpbnQgbGVuID0gbmFtZS0+bGVuOwogCV9fYmUzMiAqcDsKQEAgLTk0OSwyNyArOTQzLDI2IEBACiAJV1JJVEUzMihPUF9MT09LVVApOwogCVdSSVRFMzIobGVuKTsKIAlXUklURU1FTShuYW1lLT5uYW1lLCBsZW4pOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyB2b2lkIGVuY29kZV9zaGFyZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IG9wZW5fZmxhZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfc2hhcmVfYWNjZXNzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGZtb2RlX3QgZm1vZGUpCiB7CiAJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4KTsKLQlzd2l0Y2ggKG9wZW5fZmxhZ3MgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpIHsKLQkJY2FzZSBGTU9ERV9SRUFEOgotCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19SRUFEKTsKLQkJCWJyZWFrOwotCQljYXNlIEZNT0RFX1dSSVRFOgotCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19XUklURSk7Ci0JCQlicmVhazsKLQkJY2FzZSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOgotCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19CT1RIKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7CisJc3dpdGNoIChmbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkgeworCWNhc2UgRk1PREVfUkVBRDoKKwkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19SRUFEKTsKKwkJYnJlYWs7CisJY2FzZSBGTU9ERV9XUklURToKKwkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19XUklURSk7CisJCWJyZWFrOworCWNhc2UgRk1PREVfUkVBRHxGTU9ERV9XUklURToKKwkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19CT1RIKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV1JJVEUzMigwKTsKIAl9CiAJV1JJVEUzMigwKTsJCS8qIGZvciBsaW51eCwgc2hhcmVfZGVueSA9IDAgYWx3YXlzICovCiB9CkBAIC05ODQsNyArOTc3LDcgQEAKIAlSRVNFUlZFX1NQQUNFKDgpOwogCVdSSVRFMzIoT1BfT1BFTik7CiAJV1JJVEUzMihhcmctPnNlcWlkLT5zZXF1ZW5jZS0+Y291bnRlcik7Ci0JZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+b3Blbl9mbGFncyk7CisJZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+Zm1vZGUpOwogCVJFU0VSVkVfU1BBQ0UoMjgpOwogCVdSSVRFNjQoYXJnLT5jbGllbnRpZCk7CiAJV1JJVEUzMigxNik7CkBAIC05OTgsMTMgKzk5MSwxMyBAQAogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlzd2l0Y2goYXJnLT5vcGVuX2ZsYWdzICYgT19FWENMKSB7Ci0JCWNhc2UgMDoKLQkJCVdSSVRFMzIoTkZTNF9DUkVBVEVfVU5DSEVDS0VEKTsKLQkJCWVuY29kZV9hdHRycyh4ZHIsIGFyZy0+dS5hdHRycywgYXJnLT5zZXJ2ZXIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXUklURTMyKE5GUzRfQ1JFQVRFX0VYQ0xVU0lWRSk7Ci0JCQllbmNvZGVfbmZzNF92ZXJpZmllcih4ZHIsICZhcmctPnUudmVyaWZpZXIpOworCWNhc2UgMDoKKwkJV1JJVEUzMihORlM0X0NSRUFURV9VTkNIRUNLRUQpOworCQllbmNvZGVfYXR0cnMoeGRyLCBhcmctPnUuYXR0cnMsIGFyZy0+c2VydmVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV1JJVEUzMihORlM0X0NSRUFURV9FWENMVVNJVkUpOworCQllbmNvZGVfbmZzNF92ZXJpZmllcih4ZHIsICZhcmctPnUudmVyaWZpZXIpOwogCX0KIH0KIApAQCAtMTAxNCwzMyArMTAwNywzMyBAQAogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlzd2l0Y2ggKGFyZy0+b3Blbl9mbGFncyAmIE9fQ1JFQVQpIHsKLQkJY2FzZSAwOgotCQkJV1JJVEUzMihORlM0X09QRU5fTk9DUkVBVEUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUdfT04oYXJnLT5jbGFpbSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTCk7Ci0JCQlXUklURTMyKE5GUzRfT1BFTl9DUkVBVEUpOwotCQkJZW5jb2RlX2NyZWF0ZW1vZGUoeGRyLCBhcmcpOworCWNhc2UgMDoKKwkJV1JJVEUzMihORlM0X09QRU5fTk9DUkVBVEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUdfT04oYXJnLT5jbGFpbSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTCk7CisJCVdSSVRFMzIoTkZTNF9PUEVOX0NSRUFURSk7CisJCWVuY29kZV9jcmVhdGVtb2RlKHhkciwgYXJnKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfZGVsZWdhdGlvbl90eXBlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBkZWxlZ2F0aW9uX3R5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2RlbGVnYXRpb25fdHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBmbW9kZV90IGRlbGVnYXRpb25fdHlwZSkKIHsKIAlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQpOwogCXN3aXRjaCAoZGVsZWdhdGlvbl90eXBlKSB7Ci0JCWNhc2UgMDoKLQkJCVdSSVRFMzIoTkZTNF9PUEVOX0RFTEVHQVRFX05PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRk1PREVfUkVBRDoKLQkJCVdSSVRFMzIoTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRk1PREVfV1JJVEV8Rk1PREVfUkVBRDoKLQkJCVdSSVRFMzIoTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7CisJY2FzZSAwOgorCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9OT05FKTsKKwkJYnJlYWs7CisJY2FzZSBGTU9ERV9SRUFEOgorCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEKTsKKwkJYnJlYWs7CisJY2FzZSBGTU9ERV9XUklURXxGTU9ERV9SRUFEOgorCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9XUklURSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOwogCX0KIH0KIApAQCAtMTA1Myw3ICsxMDQ2LDcgQEAKIAllbmNvZGVfc3RyaW5nKHhkciwgbmFtZS0+bGVuLCBuYW1lLT5uYW1lKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jbGFpbV9wcmV2aW91cyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fcHJldmlvdXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZm1vZGVfdCB0eXBlKQogewogCV9fYmUzMiAqcDsKIApAQCAtMTA3MiwyNyArMTA2NSwyNyBAQAogCWVuY29kZV9zdHJpbmcoeGRyLCBuYW1lLT5sZW4sIG5hbWUtPm5hbWUpOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9vcGVuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZykKK3N0YXRpYyB2b2lkIGVuY29kZV9vcGVuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCWVuY29kZV9vcGVuaGRyKHhkciwgYXJnKTsKIAllbmNvZGVfb3BlbnR5cGUoeGRyLCBhcmcpOwogCXN3aXRjaCAoYXJnLT5jbGFpbSkgewotCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgotCQkJZW5jb2RlX2NsYWltX251bGwoeGRyLCBhcmctPm5hbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTOgotCQkJZW5jb2RlX2NsYWltX3ByZXZpb3VzKHhkciwgYXJnLT51LmRlbGVnYXRpb25fdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgotCQkJZW5jb2RlX2NsYWltX2RlbGVnYXRlX2N1cih4ZHIsIGFyZy0+bmFtZSwgJmFyZy0+dS5kZWxlZ2F0aW9uKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7CisJY2FzZSBORlM0X09QRU5fQ0xBSU1fTlVMTDoKKwkJZW5jb2RlX2NsYWltX251bGwoeGRyLCBhcmctPm5hbWUpOworCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUzoKKwkJZW5jb2RlX2NsYWltX3ByZXZpb3VzKHhkciwgYXJnLT51LmRlbGVnYXRpb25fdHlwZSk7CisJCWJyZWFrOworCWNhc2UgTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX0NVUjoKKwkJZW5jb2RlX2NsYWltX2RlbGVnYXRlX2N1cih4ZHIsIGFyZy0+bmFtZSwgJmFyZy0+dS5kZWxlZ2F0aW9uKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CiAJfQotCXJldHVybiAwOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmcpCitzdGF0aWMgdm9pZCBlbmNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyAqYXJnLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwogCkBAIC0xMTAwLDExICsxMDkzLDEwIEBACiAJV1JJVEUzMihPUF9PUEVOX0NPTkZJUk0pOwogCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC0+ZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOwogCVdSSVRFMzIoYXJnLT5zZXFpZC0+c2VxdWVuY2UtPmNvdW50ZXIpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmcpCitzdGF0aWMgdm9pZCBlbmNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtMTExMiwxMiArMTEwNCwxMiBAQAogCVdSSVRFMzIoT1BfT1BFTl9ET1dOR1JBREUpOwogCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC0+ZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOwogCVdSSVRFMzIoYXJnLT5zZXFpZC0+c2VxdWVuY2UtPmNvdW50ZXIpOwotCWVuY29kZV9zaGFyZV9hY2Nlc3MoeGRyLCBhcmctPm9wZW5fZmxhZ3MpOwotCXJldHVybiAwOworCWVuY29kZV9zaGFyZV9hY2Nlc3MoeGRyLCBhcmctPmZtb2RlKTsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludAotZW5jb2RlX3B1dGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQorc3RhdGljIHZvaWQKK2VuY29kZV9wdXRmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCWludCBsZW4gPSBmaC0+c2l6ZTsKIAlfX2JlMzIgKnA7CkBAIC0xMTI2LDE4ICsxMTE4LDE2IEBACiAJV1JJVEUzMihPUF9QVVRGSCk7CiAJV1JJVEUzMihsZW4pOwogCVdSSVRFTUVNKGZoLT5kYXRhLCBsZW4pOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3B1dHJvb3RmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQorc3RhdGljIHZvaWQgZW5jb2RlX3B1dHJvb3RmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0gICAgICAgIF9fYmUzMiAqcDsKLSAgICAgICAgCi0gICAgICAgIFJFU0VSVkVfU1BBQ0UoNCk7Ci0gICAgICAgIFdSSVRFMzIoT1BfUFVUUk9PVEZIKTsKKwlfX2JlMzIgKnA7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKE9QX1BVVFJPT1RGSCk7CisJaGRyLT5ub3BzKys7CiB9CiAKIHN0YXRpYyB2b2lkIGVuY29kZV9zdGF0ZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCkBAIC0xMTUzLDcgKzExNDMsNyBAQAogCQlXUklURU1FTSh6ZXJvX3N0YXRlaWQuZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9yZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwogCkBAIC0xMTY1LDExICsxMTU1LDEwIEBACiAJUkVTRVJWRV9TUEFDRSgxMik7CiAJV1JJVEU2NChhcmdzLT5vZmZzZXQpOwogCVdSSVRFMzIoYXJncy0+Y291bnQpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3JlYWRkaXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIsIHN0cnVjdCBycGNfcnFzdCAqcmVxKQorc3RhdGljIHZvaWQgZW5jb2RlX3JlYWRkaXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIsIHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJdWludDMyX3QgYXR0cnNbMl0gPSB7CiAJCUZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1J8RkFUVFI0X1dPUkQwX0ZJTEVJRCwKQEAgLTExOTEsNiArMTE4MCw3IEBACiAJCWF0dHJzWzFdICY9IH5GQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQ7CiAJV1JJVEUzMihhdHRyc1swXSAmIHJlYWRkaXItPmJpdG1hc2tbMF0pOwogCVdSSVRFMzIoYXR0cnNbMV0gJiByZWFkZGlyLT5iaXRtYXNrWzFdKTsKKwloZHItPm5vcHMrKzsKIAlkcHJpbnRrKCIlczogY29va2llID0gJUx1LCB2ZXJpZmllciA9ICUwOHg6JTA4eCwgYml0bWFwID0gJTA4eDolMDh4XG4iLAogCQkJX19mdW5jX18sCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlYWRkaXItPmNvb2tpZSwKQEAgLTExOTgsMjEgKzExODgsMTggQEAKIAkJCSgodTMyICopcmVhZGRpci0+dmVyaWZpZXIuZGF0YSlbMV0sCiAJCQlhdHRyc1swXSAmIHJlYWRkaXItPmJpdG1hc2tbMF0sCiAJCQlhdHRyc1sxXSAmIHJlYWRkaXItPmJpdG1hc2tbMV0pOwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3JlYWRsaW5rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICpyZWFkbGluaywgc3RydWN0IHJwY19ycXN0ICpyZXEpCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZGxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKnJlYWRsaW5rLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9SRUFETElOSyk7Ci0KLQlyZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfcmVtb3ZlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQorc3RhdGljIHZvaWQgZW5jb2RlX3JlbW92ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtMTIyMCwxMSArMTIwNywxMCBAQAogCVdSSVRFMzIoT1BfUkVNT1ZFKTsKIAlXUklURTMyKG5hbWUtPmxlbik7CiAJV1JJVEVNRU0obmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKLQotCXJldHVybiAwOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9yZW5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm9sZG5hbWUsIGNvbnN0IHN0cnVjdCBxc3RyICpuZXduYW1lKQorc3RhdGljIHZvaWQgZW5jb2RlX3JlbmFtZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqb2xkbmFtZSwgY29uc3Qgc3RydWN0IHFzdHIgKm5ld25hbWUsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7CiAKQEAgLTEyMzIsMzggKzEyMTgsMzUgQEAKIAlXUklURTMyKE9QX1JFTkFNRSk7CiAJV1JJVEUzMihvbGRuYW1lLT5sZW4pOwogCVdSSVRFTUVNKG9sZG5hbWUtPm5hbWUsIG9sZG5hbWUtPmxlbik7Ci0JCisKIAlSRVNFUlZFX1NQQUNFKDQgKyBuZXduYW1lLT5sZW4pOwogCVdSSVRFMzIobmV3bmFtZS0+bGVuKTsKIAlXUklURU1FTShuZXduYW1lLT5uYW1lLCBuZXduYW1lLT5sZW4pOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3JlbmV3KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbGllbnRfc3RhdGVpZCkKK3N0YXRpYyB2b2lkIGVuY29kZV9yZW5ldyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xpZW50X3N0YXRlaWQsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDEyKTsKIAlXUklURTMyKE9QX1JFTkVXKTsKIAlXUklURTY0KGNsaWVudF9zdGF0ZWlkLT5jbF9jbGllbnRpZCk7Ci0KLQlyZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludAotZW5jb2RlX3Jlc3RvcmVmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQorc3RhdGljIHZvaWQKK2VuY29kZV9yZXN0b3JlZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9SRVNUT1JFRkgpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKIHN0YXRpYyBpbnQKLWVuY29kZV9zZXRhY2woc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19zZXRhY2xhcmdzICphcmcpCitlbmNvZGVfc2V0YWNsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfc2V0YWNsYXJncyAqYXJnLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwogCkBAIC0xMjc4LDM2ICsxMjYxLDMyIEBACiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKGFyZy0+YWNsX2xlbik7CiAJeGRyX3dyaXRlX3BhZ2VzKHhkciwgYXJnLT5hY2xfcGFnZXMsIGFyZy0+YWNsX3BnYmFzZSwgYXJnLT5hY2xfbGVuKTsKKwloZHItPm5vcHMrKzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotZW5jb2RlX3NhdmVmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQorc3RhdGljIHZvaWQKK2VuY29kZV9zYXZlZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9TQVZFRkgpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3NldGF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJnLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQorc3RhdGljIHZvaWQgZW5jb2RlX3NldGF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJnLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JaW50IHN0YXR1czsKIAlfX2JlMzIgKnA7Ci0JCi0gICAgICAgIFJFU0VSVkVfU1BBQ0UoNCtORlM0X1NUQVRFSURfU0laRSk7Ci0gICAgICAgIFdSSVRFMzIoT1BfU0VUQVRUUik7CisKKwlSRVNFUlZFX1NQQUNFKDQrTkZTNF9TVEFURUlEX1NJWkUpOworCVdSSVRFMzIoT1BfU0VUQVRUUik7CiAJV1JJVEVNRU0oYXJnLT5zdGF0ZWlkLmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKTsKLQotICAgICAgICBpZiAoKHN0YXR1cyA9IGVuY29kZV9hdHRycyh4ZHIsIGFyZy0+aWFwLCBzZXJ2ZXIpKSkKLQkJcmV0dXJuIHN0YXR1czsKLQotICAgICAgICByZXR1cm4gMDsKKwloZHItPm5vcHMrKzsKKwllbmNvZGVfYXR0cnMoeGRyLCBhcmctPmlhcCwgc2VydmVyKTsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNldGNsaWVudGlkKQorc3RhdGljIHZvaWQgZW5jb2RlX3NldGNsaWVudGlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3NldGNsaWVudGlkICpzZXRjbGllbnRpZCwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtMTMyMiwyMyArMTMwMSwyMSBAQAogCWVuY29kZV9zdHJpbmcoeGRyLCBzZXRjbGllbnRpZC0+c2NfdWFkZHJfbGVuLCBzZXRjbGllbnRpZC0+c2NfdWFkZHIpOwogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihzZXRjbGllbnRpZC0+c2NfY2JfaWRlbnQpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKmNsaWVudF9zdGF0ZSkKK3N0YXRpYyB2b2lkIGVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbGllbnRfc3RhdGUsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKLSAgICAgICAgX19iZTMyICpwOworCV9fYmUzMiAqcDsKIAotICAgICAgICBSRVNFUlZFX1NQQUNFKDEyICsgTkZTNF9WRVJJRklFUl9TSVpFKTsKLSAgICAgICAgV1JJVEUzMihPUF9TRVRDTElFTlRJRF9DT05GSVJNKTsKLSAgICAgICAgV1JJVEU2NChjbGllbnRfc3RhdGUtPmNsX2NsaWVudGlkKTsKLSAgICAgICAgV1JJVEVNRU0oY2xpZW50X3N0YXRlLT5jbF9jb25maXJtLmRhdGEsIE5GUzRfVkVSSUZJRVJfU0laRSk7Ci0KLSAgICAgICAgcmV0dXJuIDA7CisJUkVTRVJWRV9TUEFDRSgxMiArIE5GUzRfVkVSSUZJRVJfU0laRSk7CisJV1JJVEUzMihPUF9TRVRDTElFTlRJRF9DT05GSVJNKTsKKwlXUklURTY0KGNsaWVudF9zdGF0ZS0+Y2xfY2xpZW50aWQpOworCVdSSVRFTUVNKGNsaWVudF9zdGF0ZS0+Y2xfY29uZmlybS5kYXRhLCBORlM0X1ZFUklGSUVSX1NJWkUpOworCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV93cml0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIGVuY29kZV93cml0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKIApAQCAtMTM1MywxMSArMTMzMCwxMCBAQAogCVdSSVRFMzIoYXJncy0+Y291bnQpOwogCiAJeGRyX3dyaXRlX3BhZ2VzKHhkciwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwotCi0JcmV0dXJuIDA7CisJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX2RlbGVncmV0dXJuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3N0YXRpYyB2b2lkIGVuY29kZV9kZWxlZ3JldHVybihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7CiAKQEAgLTEzNjUsOCArMTM0MSw3IEBACiAKIAlXUklURTMyKE9QX0RFTEVHUkVUVVJOKTsKIAlXUklURU1FTShzdGF0ZWlkLT5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7Ci0JcmV0dXJuIDA7Ci0KKwloZHItPm5vcHMrKzsKIH0KIC8qCiAgKiBFTkQgT0YgIkdFTkVSSUMiIEVOQ09ERSBST1VUSU5FUy4KQEAgLTEzNzksMjEgKzEzNTQsMTYgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gMywKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfYWNjZXNzKCZ4ZHIsIGFyZ3MtPmFjY2Vzcyk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9hY2Nlc3MoJnhkciwgYXJncy0+YWNjZXNzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDAzLDIxICsxMzczLDE3IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDQsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9sb29rdXAoJnhkciwgYXJncy0+bmFtZSkpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKKwllbmNvZGVfbG9va3VwKCZ4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOworCWVuY29kZV9nZXRmaCgmeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDI3LDE4ICsxMzkzLDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDMsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRyb290ZmgoJnhkcikpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpKSA9PSAwKQotCQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0cm9vdGZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmaCgmeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDQ4LDE5ICsxNDEyLDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDMsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCkpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX3JlbW92ZSgmeGRyLCAmYXJncy0+bmFtZSkpICE9IDApCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3JlbW92ZSgmeGRyLCAmYXJncy0+bmFtZSwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTQ3MCwyNyArMTQzMSwyMCBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSA3LAorCQkubm9wcyA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+b2xkX2RpcikpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX3NhdmVmaCgmeGRyKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+bmV3X2RpcikpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX3JlbmFtZSgmeGRyLCBhcmdzLT5vbGRfbmFtZSwgYXJncy0+bmV3X25hbWUpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcmVzdG9yZWZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+b2xkX2RpciwgJmhkcik7CisJZW5jb2RlX3NhdmVmaCgmeGRyLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+bmV3X2RpciwgJmhkcik7CisJZW5jb2RlX3JlbmFtZSgmeGRyLCBhcmdzLT5vbGRfbmFtZSwgYXJncy0+bmV3X25hbWUsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1MDAsMjcgKzE0NTQsMjAgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gNywKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9saW5rKCZ4ZHIsIGFyZ3MtPm5hbWUpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcmVzdG9yZWZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9zYXZlZmgoJnhkciwgJmhkcik7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX2xpbmsoJnhkciwgYXJncy0+bmFtZSwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9yZXN0b3JlZmgoJnhkciwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTUzMCwyNyArMTQ3NywyMCBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSA3LAorCQkubm9wcyA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9jcmVhdGUoJnhkciwgYXJncykpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBlbmNvZGVfcmVzdG9yZWZoKCZ4ZHIpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKKwllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9jcmVhdGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2dldGZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1NjgsMTUgKzE1MDgsMTUgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gMiwKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKSkgPT0gMCkKLQkJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNTg0LDIzICsxNTI0LDE4IEBACiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewotICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0gICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotICAgICAgICAgICAgICAgIC5ub3BzICAgPSAzLAotICAgICAgICB9OwotICAgICAgICBpbnQgc3RhdHVzOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDAsCisJfTsKIAotICAgICAgICB4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0gICAgICAgIGVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0gICAgICAgIHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0gICAgICAgIGlmKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgc3RhdHVzID0gZW5jb2RlX2Nsb3NlKCZ4ZHIsIGFyZ3MpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotb3V0OgotICAgICAgICByZXR1cm4gc3RhdHVzOworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2Nsb3NlKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE2MTAsMzMgKzE1NDUsMjAgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gNywKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX3NhdmVmaCgmeGRyKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfb3BlbigmeGRyLCBhcmdzKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmgoJnhkcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9yZXN0b3JlZmgoJnhkcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotb3V0OgotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9vcGVuKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmaCgmeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX3Jlc3RvcmVmaCgmeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjQ2LDE4ICsxNTY4LDE1IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyAgID0gMiwKKwkJLm5vcHMgICA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZihzdGF0dXMpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9vcGVuX2NvbmZpcm0oJnhkciwgYXJncyk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9vcGVuX2NvbmZpcm0oJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjY3LDIxICsxNTg2LDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyAgID0gMywKKwkJLm5vcHMgICA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfb3BlbigmeGRyLCBhcmdzKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9vcGVuKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE2OTEsMjEgKzE2MDUsMTYgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzCT0gMywKKwkJLm5vcHMJPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX29wZW5fZG93bmdyYWRlKCZ4ZHIsIGFyZ3MpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotb3V0OgotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfb3Blbl9kb3duZ3JhZGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTcxNSwxOCArMTYyNCwxNSBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgICA9IDIsCisJCS5ub3BzICAgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfbG9jaygmeGRyLCBhcmdzKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2soJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNzM2LDE4ICsxNjQyLDE1IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyAgID0gMiwKKwkJLm5vcHMgICA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZihzdGF0dXMpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9sb2NrdCgmeGRyLCBhcmdzKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2t0KCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTc1NywxOCArMTY2MCwxNSBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgICA9IDIsCisJCS5ub3BzICAgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfbG9ja3UoJnhkciwgYXJncyk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9sb2NrdSgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE3NzgsMTggKzE2NzgsMTUgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gMiwKKwkJLm5vcHMgPSAwLAogCX07CiAJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19tc2cucnBjX2NyZWQtPmNyX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZihzdGF0dXMpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9yZWFkbGluaygmeGRyLCBhcmdzLCByZXEpOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3JlYWRsaW5rKCZ4ZHIsIGFyZ3MsIHJlcSwgJmhkcik7CiAKIAkvKiBzZXQgdXAgcmVwbHkga3ZlYwogCSAqICAgIHRvcGxldmVsX3N0YXR1cyArIHRhZ2xlbiArIHJlc2NvdW50ICsgT1BfUFVURkggKyBzdGF0dXMKQEAgLTE3OTgsOSArMTY5NSw4IEBACiAJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTNF9kZWNfcmVhZGxpbmtfc3opIDw8IDI7CiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLAogCQkJYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7Ci0KLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTgxMCwxOCArMTcwNiwxNSBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSAyLAorCQkubm9wcyA9IDAsCiAJfTsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX21zZy5ycGNfY3JlZC0+Y3JfYXV0aDsKIAlpbnQgcmVwbGVuOwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotCWlmKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX3JlYWRkaXIoJnhkciwgYXJncywgcmVxKTsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9yZWFkZGlyKCZ4ZHIsIGFyZ3MsIHJlcSwgJmhkcik7CiAKIAkvKiBzZXQgdXAgcmVwbHkga3ZlYwogCSAqICAgIHRvcGxldmVsX3N0YXR1cyArIHRhZ2xlbiArIHJlc2NvdW50ICsgT1BfUFVURkggKyBzdGF0dXMKQEAgLTE4MzMsOSArMTcyNiw4IEBACiAJZHByaW50aygiJXM6IGlubGluZWQgcGFnZSBhcmdzID0gKCV1LCAlcCwgJXUsICV1KVxuIiwKIAkJCV9fZnVuY19fLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLAogCQkJYXJncy0+cGdiYXNlLCBhcmdzLT5jb3VudCk7Ci0KLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTg0NiwxOCArMTczOCwxNCBAQAogCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfbXNnLnJwY19jcmVkLT5jcl9hdXRoOwogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSAyLAorCQkubm9wcyA9IDAsCiAJfTsKLQlpbnQgcmVwbGVuLCBzdGF0dXM7CisJaW50IHJlcGxlbjsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX3JlYWQoJnhkciwgYXJncyk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfcmVhZCgmeGRyLCBhcmdzLCAmaGRyKTsKIAogCS8qIHNldCB1cCByZXBseSBrdmVjCiAJICogICAgdG9wbGV2ZWwgc3RhdHVzICsgdGFnbGVuPTAgKyByZXNjb3VudCArIE9QX1BVVEZIICsgc3RhdHVzCkBAIC0xODY3LDMzICsxNzU1LDI3IEBACiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sCiAJCQkgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwogCXJlcS0+cnFfcmN2X2J1Zi5mbGFncyB8PSBYRFJCVUZfUkVBRDsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIFNFVEFUVFIgcmVxdWVzdAogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cmFyZ3MgKmFyZ3MpCi0KIHsKLSAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwotICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLSAgICAgICAgICAgICAgICAubm9wcyAgID0gMywKLSAgICAgICAgfTsKLSAgICAgICAgaW50IHN0YXR1czsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzICAgPSAwLAorCX07CiAKLSAgICAgICAgeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotICAgICAgICBlbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotICAgICAgICBzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotICAgICAgICBpZihzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGVuY29kZV9zZXRhdHRyKCZ4ZHIsIGFyZ3MsIGFyZ3MtPnNlcnZlcik7Ci0gICAgICAgIGlmKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfc2V0YXR0cigmeGRyLCBhcmdzLCBhcmdzLT5zZXJ2ZXIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE5MDYsMjIgKzE3ODgsMjEgQEAKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19tc2cucnBjX2NyZWQtPmNyX2F1dGg7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzICAgPSAyLAorCQkubm9wcyAgID0gMCwKIAl9OwotCWludCByZXBsZW4sIHN0YXR1czsKKwlpbnQgcmVwbGVuOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0YXR0cl90d28oJnhkciwgRkFUVFI0X1dPUkQwX0FDTCwgMCk7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfZ2V0YXR0cl90d28oJnhkciwgRkFUVFI0X1dPUkQwX0FDTCwgMCwgJmhkcik7CisKIAkvKiBzZXQgdXAgcmVwbHkgYnVmZmVyOiAqLwogCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GUzRfZGVjX2dldGFjbF9zeikgPDwgMjsKIAl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwKIAkJYXJncy0+YWNsX3BhZ2VzLCBhcmdzLT5hY2xfcGdiYXNlLCBhcmdzLT5hY2xfbGVuKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTkzMSwyMiArMTgxMiwxNyBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSAzLAorCQkubm9wcyA9IDAsCiAJfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBlbmNvZGVfd3JpdGUoJnhkciwgYXJncyk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfd3JpdGUoJnhkciwgYXJncywgJmhkcik7CiAJcmVxLT5ycV9zbmRfYnVmLmZsYWdzIHw9IFhEUkJVRl9XUklURTsKLQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xOTU2LDIxICsxODMyLDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDMsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9jb21taXQoJnhkciwgYXJncyk7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOwotb3V0OgotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfY29tbWl0KCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE5ODAsMTYgKzE4NTEsMTUgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzCT0gMiwKKwkJLm5vcHMJPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7Ci0JaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGVuY29kZV9mc2luZm8oJnhkciwgYXJncy0+Yml0bWFzayk7Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9mc2luZm8oJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xOTk5LDE3ICsxODY5LDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDIsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBlbmNvZGVfZ2V0YXR0cl9vbmUoJnhkciwKLQkJCQlhcmdzLT5iaXRtYXNrWzBdICYgbmZzNF9wYXRoY29uZl9iaXRtYXBbMF0pOwotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfZ2V0YXR0cl9vbmUoJnhkciwgYXJncy0+Yml0bWFza1swXSAmIG5mczRfcGF0aGNvbmZfYml0bWFwWzBdLAorCQkJICAgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMDE5LDE4ICsxODg4LDE2IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcyA9IDIsCisJCS5ub3BzID0gMCwKIAl9OwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gZW5jb2RlX2dldGF0dHJfdHdvKCZ4ZHIsCi0JCQkJYXJncy0+Yml0bWFza1swXSAmIG5mczRfc3RhdGZzX2JpdG1hcFswXSwKLQkJCQlhcmdzLT5iaXRtYXNrWzFdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzFdKTsKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2dldGF0dHJfdHdvKCZ4ZHIsIGFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3N0YXRmc19iaXRtYXBbMF0sCisJCQkgICBhcmdzLT5iaXRtYXNrWzFdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzFdLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIwNDAsMTkgKzE5MDcsMTggQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gMiwKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBmaGFuZGxlKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IGVuY29kZV9nZXRhdHRyX29uZSgmeGRyLCBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTfAotCQkJCUZBVFRSNF9XT1JEMF9MSU5LX1NVUFBPUlR8Ci0JCQkJRkFUVFI0X1dPUkQwX1NZTUxJTktfU1VQUE9SVHwKLQkJCQlGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCk7Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfcHV0ZmgoJnhkciwgZmhhbmRsZSwgJmhkcik7CisJZW5jb2RlX2dldGF0dHJfb25lKCZ4ZHIsIEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlN8CisJCQkgICBGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUfAorCQkJICAgRkFUVFI0X1dPUkQwX1NZTUxJTktfU1VQUE9SVHwKKwkJCSAgIEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JULCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIwNjIsMTIgKzE5MjgsMTQgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzCT0gMSwKKwkJLm5vcHMJPSAwLAogCX07CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlyZXR1cm4gZW5jb2RlX3JlbmV3KCZ4ZHIsIGNscCk7CisJZW5jb2RlX3JlbmV3KCZ4ZHIsIGNscCwgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMDc3LDEyICsxOTQ1LDE0IEBACiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewotCQkubm9wcwk9IDEsCisJCS5ub3BzCT0gMCwKIAl9OwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0JcmV0dXJuIGVuY29kZV9zZXRjbGllbnRpZCgmeGRyLCBzYyk7CisJZW5jb2RlX3NldGNsaWVudGlkKCZ4ZHIsIHNjLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIwOTIsMTkgKzE5NjIsMTcgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzCT0gMywKKwkJLm5vcHMJPSAwLAogCX07CiAJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUsIDAgfTsKLQlpbnQgc3RhdHVzOwogCiAJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0Jc3RhdHVzID0gZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkciwgY2xwKTsKLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZW5jb2RlX3B1dHJvb3RmaCgmeGRyKTsKLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZW5jb2RlX2ZzaW5mbygmeGRyLCBsZWFzZV9iaXRtYXApOwotCXJldHVybiBzdGF0dXM7CisJZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkciwgY2xwLCAmaGRyKTsKKwllbmNvZGVfcHV0cm9vdGZoKCZ4ZHIsICZoZHIpOworCWVuY29kZV9mc2luZm8oJnhkciwgbGVhc2VfYml0bWFwLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIxMTQsMjEgKzE5ODIsMTYgQEAKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5ub3BzID0gMywKKwkJLm5vcHMgPSAwLAogCX07Ci0JaW50IHN0YXR1czsKIAogCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKIAllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maGFuZGxlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9kZWxlZ3JldHVybigmeGRyLCBhcmdzLT5zdGF0ZWlkKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKLW91dDoKLQlyZXR1cm4gc3RhdHVzOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maGFuZGxlLCAmaGRyKTsKKwllbmNvZGVfZGVsZWdyZXR1cm4oJnhkciwgYXJncy0+c3RhdGVpZCwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjEzOCwyMCArMjAwMSwxNyBAQAogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLm5vcHMgPSAzLAorCQkubm9wcyA9IDAsCiAJfTsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX21zZy5ycGNfY3JlZC0+Y3JfYXV0aDsKIAlpbnQgcmVwbGVuOwotCWludCBzdGF0dXM7CiAKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CiAJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgpKSAhPSAwKQotCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGVuY29kZV9sb29rdXAoJnhkciwgYXJncy0+bmFtZSkpICE9IDApCi0JCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZW5jb2RlX2ZzX2xvY2F0aW9ucygmeGRyLCBhcmdzLT5iaXRtYXNrKSkgIT0gMCkKLQkJZ290byBvdXQ7CisJZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lLCAmaGRyKTsKKwllbmNvZGVfZnNfbG9jYXRpb25zKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCiAJLyogc2V0IHVwIHJlcGx5CiAJICogICB0b3BsZXZlbF9zdGF0dXMgKyBPUF9QVVRGSCArIHN0YXR1cwogCSAqICAgKyBPUF9MT09LVVAgKyBzdGF0dXMgKyBPUF9HRVRBVFRSICsgc3RhdHVzID0gNwpAQCAtMjE1OSw4ICsyMDE5LDggQEAKIAlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyA3KSA8PCAyOwogCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCAmYXJncy0+cGFnZSwKIAkJCTAsIFBBR0VfU0laRSk7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIyMTcsMTEgKzIwNzcsMTMgQEAKIAlSRUFEX0JVRig4KTsKIAlSRUFEMzIoaGRyLT5zdGF0dXMpOwogCVJFQUQzMihoZHItPnRhZ2xlbik7Ci0JCisKIAlSRUFEX0JVRihoZHItPnRhZ2xlbiArIDQpOwogCWhkci0+dGFnID0gKGNoYXIgKilwOwogCXAgKz0gWERSX1FVQURMRU4oaGRyLT50YWdsZW4pOwogCVJFQUQzMihoZHItPm5vcHMpOworCWlmICh1bmxpa2VseShoZHItPm5vcHMgPCAxKSkKKwkJcmV0dXJuIG5mczRfc3RhdF90b19lcnJubyhoZHItPnN0YXR1cyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNDcsOCArMjkwOSw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9zZXJ2ZXJfY2FwcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIAotCQkgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXSA9IHswfTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCkBAIC0zMDcwLDE0ICsyOTMxLDEzIEBACiAJZHByaW50aygiJXM6IHhkciByZXR1cm5lZCAlZCFcbiIsIF9fZnVuY19fLCAtc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQotCQorCiBzdGF0aWMgaW50IGRlY29kZV9zdGF0ZnMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIAotCQkgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXSA9IHswfTsKIAlpbnQgc3RhdHVzOwotCQorCiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCiAJCWdvdG8geGRyX2Vycm9yOwogCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfYml0bWFwKHhkciwgYml0bWFwKSkgIT0gMCkKQEAgLTMxMDcsMTAgKzI5NjcsOSBAQAogc3RhdGljIGludCBkZWNvZGVfcGF0aGNvbmYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCiB7CiAJX19iZTMyICpzYXZlcDsKLQl1aW50MzJfdCBhdHRybGVuLCAKLQkJIGJpdG1hcFsyXSA9IHswfTsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbMl0gPSB7MH07CiAJaW50IHN0YXR1czsKLQkKKwogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKIAlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hcCkpICE9IDApCkBAIC0zMjU2LDcgKzMxMTUsNyBAQAogc3RhdGljIGludCBkZWNvZGVfbGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCiB7CiAJaW50IHN0YXR1czsKLQkKKwogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MSU5LKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMzM0NCwyNyArMzIwMywyNyBAQAogLyogVGhpcyBpcyB0b28gc2ljayEgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX3NwYWNlX2xpbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHU2NCAqbWF4c2l6ZSkKIHsKLSAgICAgICAgX19iZTMyICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBsaW1pdF90eXBlLCBuYmxvY2tzLCBibG9ja3NpemU7CiAKIAlSRUFEX0JVRigxMik7CiAJUkVBRDMyKGxpbWl0X3R5cGUpOwogCXN3aXRjaCAobGltaXRfdHlwZSkgewotCQljYXNlIDE6Ci0JCQlSRUFENjQoKm1heHNpemUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCVJFQUQzMihuYmxvY2tzKTsKLQkJCVJFQUQzMihibG9ja3NpemUpOwotCQkJKm1heHNpemUgPSAodWludDY0X3QpbmJsb2NrcyAqICh1aW50NjRfdClibG9ja3NpemU7CisJY2FzZSAxOgorCQlSRUFENjQoKm1heHNpemUpOworCQlicmVhazsKKwljYXNlIDI6CisJCVJFQUQzMihuYmxvY2tzKTsKKwkJUkVBRDMyKGJsb2Nrc2l6ZSk7CisJCSptYXhzaXplID0gKHVpbnQ2NF90KW5ibG9ja3MgKiAodWludDY0X3QpYmxvY2tzaXplOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkZWNvZGVfZGVsZWdhdGlvbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKLSAgICAgICAgX19iZTMyICpwOwotICAgICAgICB1aW50MzJfdCBkZWxlZ2F0aW9uX3R5cGU7CisJX19iZTMyICpwOworCXVpbnQzMl90IGRlbGVnYXRpb25fdHlwZTsKIAogCVJFQURfQlVGKDQpOwogCVJFQUQzMihkZWxlZ2F0aW9uX3R5cGUpOwpAQCAtMzM3NSwxMyArMzIzNCwxNCBAQAogCVJFQURfQlVGKE5GUzRfU1RBVEVJRF9TSVpFKzQpOwogCUNPUFlNRU0ocmVzLT5kZWxlZ2F0aW9uLmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKTsKIAlSRUFEMzIocmVzLT5kb19yZWNhbGwpOworCiAJc3dpdGNoIChkZWxlZ2F0aW9uX3R5cGUpIHsKLQkJY2FzZSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDoKLQkJCXJlcy0+ZGVsZWdhdGlvbl90eXBlID0gRk1PREVfUkVBRDsKLQkJCWJyZWFrOwotCQljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9XUklURToKLQkJCXJlcy0+ZGVsZWdhdGlvbl90eXBlID0gRk1PREVfV1JJVEV8Rk1PREVfUkVBRDsKLQkJCWlmIChkZWNvZGVfc3BhY2VfbGltaXQoeGRyLCAmcmVzLT5tYXhzaXplKSA8IDApCisJY2FzZSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDoKKwkJcmVzLT5kZWxlZ2F0aW9uX3R5cGUgPSBGTU9ERV9SRUFEOworCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9XUklURToKKwkJcmVzLT5kZWxlZ2F0aW9uX3R5cGUgPSBGTU9ERV9XUklURXxGTU9ERV9SRUFEOworCQlpZiAoZGVjb2RlX3NwYWNlX2xpbWl0KHhkciwgJnJlcy0+bWF4c2l6ZSkgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gZGVjb2RlX2FjZSh4ZHIsIE5VTEwsIHJlcy0+c2VydmVyLT5uZnNfY2xpZW50KTsKQEAgLTMzODksMjcgKzMyNDksMjcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfb3BlbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKLSAgICAgICAgX19iZTMyICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBzYXZld29yZHMsIGJtbGVuLCBpOwotICAgICAgICBpbnQgc3RhdHVzOworCWludCBzdGF0dXM7CiAKLSAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX09QRU4pOworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9PUEVOKTsKIAlpZiAoc3RhdHVzICE9IC1FSU8pCiAJCW5mc19pbmNyZW1lbnRfb3Blbl9zZXFpZChzdGF0dXMsIHJlcy0+c2VxaWQpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIFJFQURfQlVGKE5GUzRfU1RBVEVJRF9TSVpFKTsKLSAgICAgICAgQ09QWU1FTShyZXMtPnN0YXRlaWQuZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoTkZTNF9TVEFURUlEX1NJWkUpOworCUNPUFlNRU0ocmVzLT5zdGF0ZWlkLmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKTsKIAotICAgICAgICBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCAmcmVzLT5jaW5mbyk7CisJZGVjb2RlX2NoYW5nZV9pbmZvKHhkciwgJnJlcy0+Y2luZm8pOwogCi0gICAgICAgIFJFQURfQlVGKDgpOwotICAgICAgICBSRUFEMzIocmVzLT5yZmxhZ3MpOwotICAgICAgICBSRUFEMzIoYm1sZW4pOwotICAgICAgICBpZiAoYm1sZW4gPiAxMCkKLSAgICAgICAgICAgICAgICBnb3RvIHhkcl9lcnJvcjsKKwlSRUFEX0JVRig4KTsKKwlSRUFEMzIocmVzLT5yZmxhZ3MpOworCVJFQUQzMihibWxlbik7CisJaWYgKGJtbGVuID4gMTApCisJCWdvdG8geGRyX2Vycm9yOwogCi0gICAgICAgIFJFQURfQlVGKGJtbGVuIDw8IDIpOworCVJFQURfQlVGKGJtbGVuIDw8IDIpOwogCXNhdmV3b3JkcyA9IG1pbl90KHVpbnQzMl90LCBibWxlbiwgTkZTNF9CSVRNQVBfU0laRSk7CiAJZm9yIChpID0gMDsgaSA8IHNhdmV3b3JkczsgKytpKQogCQlSRUFEMzIocmVzLT5hdHRyc2V0W2ldKTsKQEAgLTM0MjQsMTcgKzMyODQsMTcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCiB7Ci0gICAgICAgIF9fYmUzMiAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTl9DT05GSVJNKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTl9DT05GSVJNKTsKIAlpZiAoc3RhdHVzICE9IC1FSU8pCiAJCW5mc19pbmNyZW1lbnRfb3Blbl9zZXFpZChzdGF0dXMsIHJlcy0+c2VxaWQpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIFJFQURfQlVGKE5GUzRfU1RBVEVJRF9TSVpFKTsKLSAgICAgICAgQ09QWU1FTShyZXMtPnN0YXRlaWQuZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOwotICAgICAgICByZXR1cm4gMDsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKE5GUzRfU1RBVEVJRF9TSVpFKTsKKwlDT1BZTUVNKHJlcy0+c3RhdGVpZC5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKQEAgLTM1NjIsNyArMzQyMiw3IEBACiAJCWRwcmludGsoIk5GUzogcmVhZGRpciByZXBseSB0cnVuY2F0ZWQhXG4iKTsKIAkJZW50cnlbMV0gPSAxOwogCX0KLW91dDoJCitvdXQ6CiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCXJldHVybiAwOwogc2hvcnRfcGt0OgpAQCAtMzcxOCw3ICszNTc4LDYgQEAKIAl1aW50MzJfdCBibWxlbjsKIAlpbnQgc3RhdHVzOwogCi0gICAgICAgIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9TRVRBVFRSKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMzczOCw3ICszNTk3LDcgQEAKIAlSRUFEMzIob3BudW0pOwogCWlmIChvcG51bSAhPSBPUF9TRVRDTElFTlRJRCkgewogCQlkcHJpbnRrKCJuZnM6IGRlY29kZV9zZXRjbGllbnRpZDogU2VydmVyIHJldHVybmVkIG9wZXJhdGlvbiIKLQkJCSAgICAgICAJIiAlZFxuIiwgb3BudW0pOworCQkJIiAlZFxuIiwgb3BudW0pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJUkVBRDMyKG5mc2Vycik7CkBAIC0zNzkyLDM0ICszNjUxLDM0IEBACiB9CiAKIC8qCisgKiBFTkQgT0YgIkdFTkVSSUMiIERFQ09ERSBST1VUSU5FUy4KKyAqLworCisvKgogICogRGVjb2RlIE9QRU5fRE9XTkdSQURFIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewotICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0gICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwotICAgICAgICBpbnQgc3RhdHVzOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOwogCi0gICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9vcGVuX2Rvd25ncmFkZSgmeGRyLCByZXMpOworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9vcGVuX2Rvd25ncmFkZSgmeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7CiAJZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKIG91dDoKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgotICogRU5EIE9GICJHRU5FUklDIiBERUNPREUgUk9VVElORVMuCi0gKi8KLQotLyoKICAqIERlY29kZSBBQ0NFU1MgcmVzcG9uc2UKICAqLwogc3RhdGljIGludCBuZnM0X3hkcl9kZWNfYWNjZXNzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfYWNjZXNzcmVzICpyZXMpCkBAIC0zODI3LDcgKzM2ODYsNyBAQAogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwotCQorCiAJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQogCQlnb3RvIG91dDsKQEAgLTM4NTAsNyArMzcwOSw3IEBACiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7Ci0JCisKIAl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKIAlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCiAJCWdvdG8gb3V0OwpAQCAtMzg3Myw3ICszNzMyLDcgQEAKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKLQkKKwogCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwogCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKIAkJZ290byBvdXQ7CkBAIC0zODkzLDcgKzM3NTIsNyBAQAogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwotCQorCiAJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQogCQlnb3RvIG91dDsKQEAgLTM5MTQsNyArMzc3Myw3IEBACiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7Ci0JCisKIAl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKIAlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCiAJCWdvdG8gb3V0OwpAQCAtMzk0NCw3ICszODAzLDcgQEAKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKLQkKKwogCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwogCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKIAkJZ290byBvdXQ7CkBAIC0zOTc3LDcgKzM4MzYsNyBAQAogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwotCQorCiAJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQogCQlnb3RvIG91dDsKQEAgLTQwMTQsNyArMzg3Myw3IEBACiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7Ci0JCisKIAl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKIAlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCkBAIC00MDI1LDcgKzM4ODQsNiBAQAogCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKLQogfQogCiAvKgpAQCAtNDAzNCwyMSArMzg5MiwyMCBAQAogc3RhdGljIGludAogbmZzNF94ZHJfZW5jX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0gICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLSAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7Ci0gICAgICAgICAgICAgICAgLm5vcHMgICA9IDIsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBzdGF0dXM7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyAgID0gMCwKKwl9OworCWludCBzdGF0dXM7CiAKLSAgICAgICAgeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotICAgICAgICBlbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotICAgICAgICBzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICBzdGF0dXMgPSBlbmNvZGVfc2V0YWNsKCZ4ZHIsIGFyZ3MpOwotb3V0OgotICAgICAgICByZXR1cm4gc3RhdHVzOworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3NldGFjbCgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfbm9wcygmaGRyKTsKKwlyZXR1cm4gc3RhdHVzOwogfQorCiAvKgogICogRGVjb2RlIFNFVEFDTCByZXNwb25zZQogICovCkBAIC00MDk5LDE4ICszOTU2LDE4IEBACiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewotICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0gICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwotICAgICAgICBpbnQgc3RhdHVzOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOwogCi0gICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9jbG9zZSgmeGRyLCByZXMpOworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9jbG9zZSgmeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7CiAJLyoKQEAgLTQxMjEsNyArMzk3OCw3IEBACiAJICovCiAJZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKIG91dDoKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgpAQCAtNDEyOSwyMyArMzk4NiwyMyBAQAogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCiB7Ci0gICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLSAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7Ci0gICAgICAgIGludCBzdGF0dXM7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CiAKLSAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKLSAgICAgICAgaWYgKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgc3RhdHVzID0gZGVjb2RlX3NhdmVmaCgmeGRyKTsKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3BlbigmeGRyLCByZXMpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CiAJaWYgKGRlY29kZV9nZXRmaCgmeGRyLCAmcmVzLT5maCkgIT0gMCkKIAkJZ290byBvdXQ7CiAJaWYgKGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZfYXR0ciwgcmVzLT5zZXJ2ZXIpICE9IDApCkBAIC00MTU0LDcgKzQwMTEsNyBAQAogCQlnb3RvIG91dDsKIAlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIpOwogb3V0OgotICAgICAgICByZXR1cm4gc3RhdHVzOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC00MTYyLDIwICs0MDE5LDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCiB7Ci0gICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLSAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7Ci0gICAgICAgIGludCBzdGF0dXM7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CiAKLSAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKLSAgICAgICAgaWYgKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wZW5fY29uZmlybSgmeGRyLCByZXMpOworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9vcGVuX2NvbmZpcm0oJnhkciwgcmVzKTsKIG91dDoKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgpAQCAtNDE4MywyMyArNDA0MCwyMyBAQAogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0gICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwotICAgICAgICBpbnQgc3RhdHVzOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOwogCi0gICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7CisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX29wZW4oJnhkciwgcmVzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKIAlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mX2F0dHIsIHJlcy0+c2VydmVyKTsKIG91dDoKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgpAQCAtNDIwNywyNSArNDA2NCwyNSBAQAogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhdHRycmVzICpyZXMpCiB7Ci0gICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLSAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7Ci0gICAgICAgIGludCBzdGF0dXM7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CiAKLSAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKLSAgICAgICAgaWYgKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgc3RhdHVzID0gZGVjb2RlX3NldGF0dHIoJnhkciwgcmVzKTsKLSAgICAgICAgaWYgKHN0YXR1cykKLSAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyLCByZXMpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OwogCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CiAJaWYgKHN0YXR1cyA9PSBORlM0RVJSX0RFTEFZKQogCQlzdGF0dXMgPSAwOwogb3V0OgotICAgICAgICByZXR1cm4gc3RhdHVzOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC00NDIxLDggKzQyNzgsNiBAQAogCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CiAJaWYgKCFzdGF0dXMpCiAJCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oJnhkciwgZnNpbmZvKTsKLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gbmZzNF9zdGF0X3RvX2Vycm5vKGhkci5zdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ1MTEsOCArNDM2Niw2IEBACiAJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKIAkJc3RhdHVzID0gZGVjb2RlX3NldGNsaWVudGlkKCZ4ZHIsIGNscCk7Ci0JaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IG5mczRfc3RhdF90b19lcnJubyhoZHIuc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00NTMzLDggKzQzODYsNiBAQAogCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpOwogCWlmICghc3RhdHVzKQogCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKCZ4ZHIsIGZzaW5mbyk7Ci0JaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IG5mczRfc3RhdF90b19lcnJubyhoZHIuc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00NzE1LDcgKzQ1NjYsNyBAQAogCS5wX3JlcGxlbiA9IE5GUzRfIyNyZXN0eXBlIyNfc3osCQkJXAogCS5wX3N0YXRpZHggPSBORlNQUk9DNF9DTE5UXyMjcHJvYywJCQlcCiAJLnBfbmFtZSAgID0gI3Byb2MsCQkJCQlcCi0gICAgfQorfQogCiBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mczRfcHJvY2VkdXJlc1tdID0gewogICBQUk9DKFJFQUQsCQllbmNfcmVhZCwJZGVjX3JlYWQpLApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mc3Jvb3QuYyBiL2ZzL25mcy9uZnNyb290LmMKaW5kZXggZDc0ZDE2Yy4uZDllZjYwMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mc3Jvb3QuYworKysgYi9mcy9uZnMvbmZzcm9vdC5jCkBAIC04Niw2ICs4Niw4IEBACiAjaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCiAvKiBEZWZpbmUgdGhpcyB0byBhbGxvdyBkZWJ1Z2dpbmcgb3V0cHV0ICovCiAjdW5kZWYgTkZTUk9PVF9ERUJVRwogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX1JPT1QKQEAgLTEwMCw3ICsxMDIsNyBAQAogc3RhdGljIF9fYmUzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKIAogLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8KLXN0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9Oworc3RhdGljIGNoYXIgbmZzX2V4cG9ydF9wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OwogCiAvKiBORlMtcmVsYXRlZCBkYXRhICovCiBzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG5mc19kYXRhIF9faW5pdGRhdGEgPSB7IDAsIH07LyogTkZTIG1vdW50IGluZm8gKi8KQEAgLTMxMiw3ICszMTQsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBQYXRobmFtZSBmb3IgcmVtb3RlIGRpcmVjdG9yeSB0b28gbG9uZy5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCXNwcmludGYobmZzX3BhdGgsIGJ1ZiwgY3ApOworCXNwcmludGYobmZzX2V4cG9ydF9wYXRoLCBidWYsIGNwKTsKIAogCXJldHVybiAxOwogfQpAQCAtMzQwLDcgKzM0Miw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcm9vdF9uZnNfcHJpbnQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiBNb3VudGluZyAlcyBvbiBzZXJ2ZXIgJXMgYXMgcm9vdFxuIiwKLQkJbmZzX3BhdGgsIG5mc19kYXRhLmhvc3RuYW1lKTsKKwkJbmZzX2V4cG9ydF9wYXRoLCBuZnNfZGF0YS5ob3N0bmFtZSk7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIHJzaXplID0gJWQsIHdzaXplID0gJWQsIHRpbWVvID0gJWQsIHJldHJhbnMgPSAlZFxuIiwKIAkJbmZzX2RhdGEucnNpemUsIG5mc19kYXRhLndzaXplLCBuZnNfZGF0YS50aW1lbywgbmZzX2RhdGEucmV0cmFucyk7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIGFjcmVnIChtaW4sbWF4KSA9ICglZCwlZCksIGFjZGlyIChtaW4sbWF4KSA9ICglZCwlZClcbiIsCkBAIC00ODUsMTggKzQ4NywyMyBAQAogewogCXN0cnVjdCBuZnNfZmggZmg7CiAJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlzdHJ1Y3QgbmZzX21vdW50X3JlcXVlc3QgcmVxdWVzdCA9IHsKKwkJLnNhcAkJPSAoc3RydWN0IHNvY2thZGRyICopJnNpbiwKKwkJLnNhbGVuCQk9IHNpemVvZihzaW4pLAorCQkuZGlycGF0aAk9IG5mc19leHBvcnRfcGF0aCwKKwkJLnZlcnNpb24JPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgPworCQkJCQlORlNfTU5UM19WRVJTSU9OIDogTkZTX01OVF9WRVJTSU9OLAorCQkucHJvdG9jb2wJPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/CisJCQkJCVhQUlRfVFJBTlNQT1JUX1RDUCA6IFhQUlRfVFJBTlNQT1JUX1VEUCwKKwkJLmZoCQk9ICZmaCwKKwl9OwogCWludCBzdGF0dXM7Ci0JaW50IHByb3RvY29sID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPwotCQkJCQlYUFJUX1RSQU5TUE9SVF9UQ1AgOiBYUFJUX1RSQU5TUE9SVF9VRFA7Ci0JaW50IHZlcnNpb24gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgPwotCQkJCQlORlNfTU5UM19WRVJTSU9OIDogTkZTX01OVF9WRVJTSU9OOwogCiAJc2V0X3NvY2thZGRyKCZzaW4sIHNlcnZhZGRyLCBodG9ucyhtb3VudF9wb3J0KSk7Ci0Jc3RhdHVzID0gbmZzX21vdW50KChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHNpbiksIE5VTEwsCi0JCQkgICBuZnNfcGF0aCwgdmVyc2lvbiwgcHJvdG9jb2wsICZmaCk7CisJc3RhdHVzID0gbmZzX21vdW50KCZyZXF1ZXN0KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogU2VydmVyIHJldHVybmVkIGVycm9yICVkICIKLQkJCQkid2hpbGUgbW91bnRpbmcgJXNcbiIsIHN0YXR1cywgbmZzX3BhdGgpOworCQkJCSJ3aGlsZSBtb3VudGluZyAlc1xuIiwgc3RhdHVzLCBuZnNfZXhwb3J0X3BhdGgpOwogCWVsc2UgewogCQluZnNfZGF0YS5yb290LnNpemUgPSBmaC5zaXplOwogCQltZW1jcHkobmZzX2RhdGEucm9vdC5kYXRhLCBmaC5kYXRhLCBmaC5zaXplKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9yZWFkLmMgYi9mcy9uZnMvcmVhZC5jCmluZGV4IDQwZDE3OTguLmY4NTYwMDQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9yZWFkLmMKKysrIGIvZnMvbmZzL3JlYWQuYwpAQCAtNTMzLDEyICs1MzMsNiBAQAogCXVuc2lnbmVkIGludCBsZW47CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBuZnNfd2JfcGFnZShpbm9kZSwgcGFnZSk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCiAJbGVuID0gbmZzX3BhZ2VfbGVuZ3RoKHBhZ2UpOwogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIG5mc19yZXR1cm5fZW1wdHlfcGFnZShwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggYmIwMzEzYS4uZDY2ODZmNCAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTc1LDYgKzc1LDcgQEAKIAlPcHRfYWNsLCBPcHRfbm9hY2wsCiAJT3B0X3JkaXJwbHVzLCBPcHRfbm9yZGlycGx1cywKIAlPcHRfc2hhcmVjYWNoZSwgT3B0X25vc2hhcmVjYWNoZSwKKwlPcHRfcmVzdnBvcnQsIE9wdF9ub3Jlc3Zwb3J0LAogCiAJLyogTW91bnQgb3B0aW9ucyB0aGF0IHRha2UgaW50ZWdlciBhcmd1bWVudHMgKi8KIAlPcHRfcG9ydCwKQEAgLTEyOSw2ICsxMzAsOCBAQAogCXsgT3B0X25vcmRpcnBsdXMsICJub3JkaXJwbHVzIiB9LAogCXsgT3B0X3NoYXJlY2FjaGUsICJzaGFyZWNhY2hlIiB9LAogCXsgT3B0X25vc2hhcmVjYWNoZSwgIm5vc2hhcmVjYWNoZSIgfSwKKwl7IE9wdF9yZXN2cG9ydCwgInJlc3Zwb3J0IiB9LAorCXsgT3B0X25vcmVzdnBvcnQsICJub3Jlc3Zwb3J0IiB9LAogCiAJeyBPcHRfcG9ydCwgInBvcnQ9JXUiIH0sCiAJeyBPcHRfcnNpemUsICJyc2l6ZT0ldSIgfSwKQEAgLTUxMiw3ICs1MTUsOCBAQAogCQl7IE5GU19NT1VOVF9OT05MTSwgIixub2xvY2siLCAiIiB9LAogCQl7IE5GU19NT1VOVF9OT0FDTCwgIixub2FjbCIsICIiIH0sCiAJCXsgTkZTX01PVU5UX05PUkRJUlBMVVMsICIsbm9yZGlycGx1cyIsICIiIH0sCi0JCXsgTkZTX01PVU5UX1VOU0hBUkVELCAiLG5vc2hhcmVjYWNoZSIsICIifSwKKwkJeyBORlNfTU9VTlRfVU5TSEFSRUQsICIsbm9zaGFyZWNhY2hlIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfTk9SRVNWUE9SVCwgIixub3Jlc3Zwb3J0IiwgIiIgfSwKIAkJeyAwLCBOVUxMLCBOVUxMIH0KIAl9OwogCWNvbnN0IHN0cnVjdCBwcm9jX25mc19pbmZvICpuZnNfaW5mb3A7CkBAIC0xMDMzLDYgKzEwMzcsMTIgQEAKIAkJY2FzZSBPcHRfbm9zaGFyZWNhY2hlOgogCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfVU5TSEFSRUQ7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzdnBvcnQ6CisJCQltbnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9SRVNWUE9SVDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3Jlc3Zwb3J0OgorCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfTk9SRVNWUE9SVDsKKwkJCWJyZWFrOwogCiAJCS8qCiAJCSAqIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWMgdmFsdWVzCkBAIC0xMzI3LDggKzEzMzcsMTQgQEAKIHN0YXRpYyBpbnQgbmZzX3RyeV9tb3VudChzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhICphcmdzLAogCQkJIHN0cnVjdCBuZnNfZmggKnJvb3RfZmgpCiB7Ci0Jc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmFyZ3MtPm1vdW50X3NlcnZlci5hZGRyZXNzOwotCWNoYXIgKmhvc3RuYW1lOworCXN0cnVjdCBuZnNfbW91bnRfcmVxdWVzdCByZXF1ZXN0ID0geworCQkuc2FwCQk9IChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJCQkJCSZhcmdzLT5tb3VudF9zZXJ2ZXIuYWRkcmVzcywKKwkJLmRpcnBhdGgJPSBhcmdzLT5uZnNfc2VydmVyLmV4cG9ydF9wYXRoLAorCQkucHJvdG9jb2wJPSBhcmdzLT5tb3VudF9zZXJ2ZXIucHJvdG9jb2wsCisJCS5maAkJPSByb290X2ZoLAorCQkubm9yZXN2cG9ydAk9IGFyZ3MtPmZsYWdzICYgTkZTX01PVU5UX05PUkVTVlBPUlQsCisJfTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKGFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uID09IDApIHsKQEAgLTEzMzcsNDIgKzEzNTMsMzggQEAKIAkJZWxzZQogCQkJYXJncy0+bW91bnRfc2VydmVyLnZlcnNpb24gPSBORlNfTU5UX1ZFUlNJT047CiAJfQorCXJlcXVlc3QudmVyc2lvbiA9IGFyZ3MtPm1vdW50X3NlcnZlci52ZXJzaW9uOwogCiAJaWYgKGFyZ3MtPm1vdW50X3NlcnZlci5ob3N0bmFtZSkKLQkJaG9zdG5hbWUgPSBhcmdzLT5tb3VudF9zZXJ2ZXIuaG9zdG5hbWU7CisJCXJlcXVlc3QuaG9zdG5hbWUgPSBhcmdzLT5tb3VudF9zZXJ2ZXIuaG9zdG5hbWU7CiAJZWxzZQotCQlob3N0bmFtZSA9IGFyZ3MtPm5mc19zZXJ2ZXIuaG9zdG5hbWU7CisJCXJlcXVlc3QuaG9zdG5hbWUgPSBhcmdzLT5uZnNfc2VydmVyLmhvc3RuYW1lOwogCiAJLyoKIAkgKiBDb25zdHJ1Y3QgdGhlIG1vdW50IHNlcnZlcidzIGFkZHJlc3MuCiAJICovCiAJaWYgKGFyZ3MtPm1vdW50X3NlcnZlci5hZGRyZXNzLnNzX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKLQkJbWVtY3B5KHNhcCwgJmFyZ3MtPm5mc19zZXJ2ZXIuYWRkcmVzcywKKwkJbWVtY3B5KHJlcXVlc3Quc2FwLCAmYXJncy0+bmZzX3NlcnZlci5hZGRyZXNzLAogCQkgICAgICAgYXJncy0+bmZzX3NlcnZlci5hZGRybGVuKTsKIAkJYXJncy0+bW91bnRfc2VydmVyLmFkZHJsZW4gPSBhcmdzLT5uZnNfc2VydmVyLmFkZHJsZW47CiAJfQorCXJlcXVlc3Quc2FsZW4gPSBhcmdzLT5tb3VudF9zZXJ2ZXIuYWRkcmxlbjsKIAogCS8qCiAJICogYXV0b2JpbmQgd2lsbCBiZSB1c2VkIGlmIG1vdW50X3NlcnZlci5wb3J0ID09IDAKIAkgKi8KLQluZnNfc2V0X3BvcnQoc2FwLCBhcmdzLT5tb3VudF9zZXJ2ZXIucG9ydCk7CisJbmZzX3NldF9wb3J0KHJlcXVlc3Quc2FwLCBhcmdzLT5tb3VudF9zZXJ2ZXIucG9ydCk7CiAKIAkvKgogCSAqIE5vdyBhc2sgdGhlIG1vdW50IHNlcnZlciB0byBtYXAgb3VyIGV4cG9ydCBwYXRoCiAJICogdG8gYSBmaWxlIGhhbmRsZS4KIAkgKi8KLQlzdGF0dXMgPSBuZnNfbW91bnQoc2FwLAotCQkJICAgYXJncy0+bW91bnRfc2VydmVyLmFkZHJsZW4sCi0JCQkgICBob3N0bmFtZSwKLQkJCSAgIGFyZ3MtPm5mc19zZXJ2ZXIuZXhwb3J0X3BhdGgsCi0JCQkgICBhcmdzLT5tb3VudF9zZXJ2ZXIudmVyc2lvbiwKLQkJCSAgIGFyZ3MtPm1vdW50X3NlcnZlci5wcm90b2NvbCwKLQkJCSAgIHJvb3RfZmgpOworCXN0YXR1cyA9IG5mc19tb3VudCgmcmVxdWVzdCk7CiAJaWYgKHN0YXR1cyA9PSAwKQogCQlyZXR1cm4gMDsKIAogCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiB1bmFibGUgdG8gbW91bnQgc2VydmVyICVzLCBlcnJvciAlZFxuIiwKLQkJCWhvc3RuYW1lLCBzdGF0dXMpOworCQkJcmVxdWVzdC5ob3N0bmFtZSwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDE5LDcgKzI0MzEsNyBAQAogewogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Ioc2IpOwogCi0JbmZzX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc2IpOworCW5mc19zdXBlcl9yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKIAlraWxsX2Fub25fc3VwZXIoc2IpOwogCiAJbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYyBiL2ZzL25mc19jb21tb24vbmZzYWNsLmMKaW5kZXggYzExZjUzNy4uMDQxMzNhYSAxMDA2NDQKLS0tIGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYworKysgYi9mcy9uZnNfY29tbW9uL25mc2FjbC5jCkBAIC0yOSw4ICsyOSw4IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotRVhQT1JUX1NZTUJPTChuZnNhY2xfZW5jb2RlKTsKLUVYUE9SVF9TWU1CT0wobmZzYWNsX2RlY29kZSk7CitFWFBPUlRfU1lNQk9MX0dQTChuZnNhY2xfZW5jb2RlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mc2FjbF9kZWNvZGUpOwogCiBzdHJ1Y3QgbmZzYWNsX2VuY29kZV9kZXNjIHsKIAlzdHJ1Y3QgeGRyX2FycmF5Ml9kZXNjIGRlc2M7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCAwOTQ3NDdhLi42ZDdkOGMwIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTM1OCw2ICszNTgsNyBAQAogCQkubnJ2ZXJzCQk9IEFSUkFZX1NJWkUobmZzX2NiX3ZlcnNpb24pLAogCQkudmVyc2lvbgk9IG5mc19jYl92ZXJzaW9uLAogCQkuc3RhdHMJCT0gJmNiX3N0YXRzLAorCQkucGlwZV9kaXJfbmFtZSAgPSAiL25mc2Q0X2NiIiwKIH07CiAKIC8qIFJlZmVyZW5jZSBjb3VudGluZywgY2FsbGJhY2sgY2xlYW51cCwgZXRjLiwgYWxsIGxvb2sgcmFjeSBhcyBoZWNrLgpAQCAtMzgyLDggKzM4Myw5IEBACiAJCS5wcm9ncmFtCT0gJmNiX3Byb2dyYW0sCiAJCS5wcm9nbnVtYmVyCT0gY2ItPmNiX3Byb2csCiAJCS52ZXJzaW9uCT0gbmZzX2NiX3ZlcnNpb25bMV0tPm51bWJlciwKLQkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLCAvKiBYWFg6IG5lZWQgQVVUSF9HU1MuLi4gKi8KKwkJLmF1dGhmbGF2b3IJPSBjbHAtPmNsX2ZsYXZvciwKIAkJLmZsYWdzCQk9IChSUENfQ0xOVF9DUkVBVEVfTk9QSU5HIHwgUlBDX0NMTlRfQ1JFQVRFX1FVSUVUKSwKKwkJLmNsaWVudF9uYW1lICAgID0gY2xwLT5jbF9wcmluY2lwYWwsCiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX3Byb2MgICAgICAgPSAmbmZzNF9jYl9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ0JfTlVMTF0sCkBAIC0zOTIsNiArMzk0LDExIEBACiAJc3RydWN0IHJwY19jbG50ICpjbGllbnQ7CiAJaW50IHN0YXR1czsKIAorCWlmICghY2xwLT5jbF9wcmluY2lwYWwgJiYgKGNscC0+Y2xfZmxhdm9yID49IFJQQ19BVVRIX0dTU19LUkI1KSkgeworCQlzdGF0dXMgPSBuZnNlcnJfY2JfcGF0aF9kb3duOworCQlnb3RvIG91dF9lcnI7CisJfQorCiAJLyogSW5pdGlhbGl6ZSBhZGRyZXNzICovCiAJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwogCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCBiZjRjZDQ2Li4xM2UwZTA3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTU0LDYgKzU0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZICAgICAgICAgICAgICAgIE5GU0REQkdfUFJPQwogCkBAIC0zNzcsNiArMzc4LDcgQEAKIAlzaHV0ZG93bl9jYWxsYmFja19jbGllbnQoY2xwKTsKIAlpZiAoY2xwLT5jbF9jcmVkLmNyX2dyb3VwX2luZm8pCiAJCXB1dF9ncm91cF9pbmZvKGNscC0+Y2xfY3JlZC5jcl9ncm91cF9pbmZvKTsKKwlrZnJlZShjbHAtPmNsX3ByaW5jaXBhbCk7CiAJa2ZyZWUoY2xwLT5jbF9uYW1lLmRhdGEpOwogCWtmcmVlKGNscCk7CiB9CkBAIC02OTYsNiArNjk4LDcgQEAKIAl1bnNpZ25lZCBpbnQgCQlzdHJoYXNodmFsOwogCXN0cnVjdCBuZnM0X2NsaWVudAkqY29uZiwgKnVuY29uZiwgKm5ldzsKIAlfX2JlMzIgCQkJc3RhdHVzOworCWNoYXIJCQkqcHJpbmM7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgZG5hbWVbSEVYRElSX0xFTl07CiAJCiAJaWYgKCFjaGVja19uYW1lKGNsbmFtZSkpCkBAIC03ODMsNiArNzg2LDE1IEBACiAJfQogCWNvcHlfdmVyZihuZXcsICZjbHZlcmlmaWVyKTsKIAluZXctPmNsX2FkZHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwluZXctPmNsX2ZsYXZvciA9IHJxc3RwLT5ycV9mbGF2b3I7CisJcHJpbmMgPSBzdmNfZ3NzX3ByaW5jaXBhbChycXN0cCk7CisJaWYgKHByaW5jKSB7CisJCW5ldy0+Y2xfcHJpbmNpcGFsID0ga3N0cmR1cChwcmluYywgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXctPmNsX3ByaW5jaXBhbCA9PSBOVUxMKSB7CisJCQlmcmVlX2NsaWVudChuZXcpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CiAJY29weV9jcmVkKCZuZXctPmNsX2NyZWQsICZycXN0cC0+cnFfY3JlZCk7CiAJZ2VuX2NvbmZpcm0obmV3KTsKIAlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvc3RhdC5jIGIvZnMvcHJvYy9zdGF0LmMKaW5kZXggODE5MDRmMC4uM2JiMWNmMSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9zdGF0LmMKKysrIGIvZnMvcHJvYy9zdGF0LmMKQEAgLTQ0LDEwICs0NCwxMyBAQAogCQlzb2Z0aXJxID0gY3B1dGltZTY0X2FkZChzb2Z0aXJxLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zb2Z0aXJxKTsKIAkJc3RlYWwgPSBjcHV0aW1lNjRfYWRkKHN0ZWFsLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zdGVhbCk7CiAJCWd1ZXN0ID0gY3B1dGltZTY0X2FkZChndWVzdCwga3N0YXRfY3B1KGkpLmNwdXN0YXQuZ3Vlc3QpOwotCi0JCWZvcl9lYWNoX2lycV9ucihqKQorCQlmb3JfZWFjaF9pcnFfbnIoaikgeworI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCisJCQlpZiAoIWlycV90b19kZXNjKGopKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCiAJCQlzdW0gKz0ga3N0YXRfaXJxc19jcHUoaiwgaSk7Ci0KKwkJfQogCQlzdW0gKz0gYXJjaF9pcnFfc3RhdF9jcHUoaSk7CiAJfQogCXN1bSArPSBhcmNoX2lycV9zdGF0KCk7CkBAIC05Miw3ICs5NSwxMiBAQAogCS8qIHN1bSBhZ2FpbiA/IGl0IGNvdWxkIGJlIHVwZGF0ZWQ/ICovCiAJZm9yX2VhY2hfaXJxX25yKGopIHsKIAkJcGVyX2lycV9zdW0gPSAwOwotCisjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKKwkJaWYgKCFpcnFfdG9fZGVzYyhqKSkgeworCQkJc2VxX3ByaW50ZihwLCAiICV1IiwgcGVyX2lycV9zdW0pOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKIAkJCXBlcl9pcnFfc3VtICs9IGtzdGF0X2lycXNfY3B1KGosIGkpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvTWFrZWZpbGUgYi9mcy94ZnMvTWFrZWZpbGUKaW5kZXggNzM3YzlhNC4uYzNkYzQ5MSAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlCisrKyBiL2ZzL3hmcy9NYWtlZmlsZQpAQCAtODUsMTMgKzg1LDEzIEBACiAJCQkJICAgeGZzX3RyYW5zX2lub2RlLm8gXAogCQkJCSAgIHhmc190cmFuc19pdGVtLm8gXAogCQkJCSAgIHhmc191dGlscy5vIFwKLQkJCQkgICB4ZnNfdmZzb3BzLm8gXAogCQkJCSAgIHhmc192bm9kZW9wcy5vIFwKIAkJCQkgICB4ZnNfcncubyBcCiAJCQkJICAgeGZzX2Rtb3BzLm8gXAogCQkJCSAgIHhmc19xbW9wcy5vCiAKLXhmcy0kKENPTkZJR19YRlNfVFJBQ0UpCQkrPSB4ZnNfZGlyMl90cmFjZS5vCit4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0geGZzX2J0cmVlX3RyYWNlLm8gXAorCQkJCSAgIHhmc19kaXIyX3RyYWNlLm8KIAogIyBPYmplY3RzIGluIGxpbnV4LwogeGZzLXkJCQkJKz0gJChhZGRwcmVmaXggJChYRlNfTElOVVgpLywgXApAQCAtMTA2LDcgKzEwNiw3IEBACiAJCQkJICAgeGZzX2lvcHMubyBcCiAJCQkJICAgeGZzX2xydy5vIFwKIAkJCQkgICB4ZnNfc3VwZXIubyBcCi0JCQkJICAgeGZzX3Zub2RlLm8gXAorCQkJCSAgIHhmc19zeW5jLm8gXAogCQkJCSAgIHhmc194YXR0ci5vKQogCiAjIE9iamVjdHMgaW4gc3VwcG9ydC8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvc3YuaCBiL2ZzL3hmcy9saW51eC0yLjYvc3YuaAppbmRleCAzNTFhOGY0Li40ZGZjN2MzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3N2LmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9zdi5oCkBAIC0zMiwyMyArMzIsMTUgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0ZXJzOwogfSBzdl90OwogCi0jZGVmaW5lIFNWX0ZJRk8JCTB4MAkJLyogc3ZfdCBpcyBGSUZPIHR5cGUgKi8KLSNkZWZpbmUgU1ZfTElGTwkJMHgyCQkvKiBzdl90IGlzIExJRk8gdHlwZSAqLwotI2RlZmluZSBTVl9QUklPCQkweDQJCS8qIHN2X3QgaXMgUFJJTyB0eXBlICovCi0jZGVmaW5lIFNWX0tFWUVECTB4NgkJLyogc3ZfdCBpcyBLRVlFRCB0eXBlICovCi0jZGVmaW5lIFNWX0RFRkFVTFQgICAgICBTVl9GSUZPCi0KLQotc3RhdGljIGlubGluZSB2b2lkIF9zdl93YWl0KHN2X3QgKnN2LCBzcGlubG9ja190ICpsb2NrLCBpbnQgc3RhdGUsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3Zfd2FpdChzdl90ICpzdiwgc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmc3YtPndhaXRlcnMsICZ3YWl0KTsKLQlfX3NldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAlzcGluX3VubG9jayhsb2NrKTsKIAotCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJc2NoZWR1bGUoKTsKIAogCXJlbW92ZV93YWl0X3F1ZXVlKCZzdi0+d2FpdGVycywgJndhaXQpOwogfQpAQCAtNTgsMTMgKzUwLDcgQEAKICNkZWZpbmUgc3ZfZGVzdHJveShzdikgXAogCS8qTk9USElORyovCiAjZGVmaW5lIHN2X3dhaXQoc3YsIHByaSwgbG9jaywgcykgXAotCV9zdl93YWl0KHN2LCBsb2NrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSwgTUFYX1NDSEVEVUxFX1RJTUVPVVQpCi0jZGVmaW5lIHN2X3dhaXRfc2lnKHN2LCBwcmksIGxvY2ssIHMpICAgXAotCV9zdl93YWl0KHN2LCBsb2NrLCBUQVNLX0lOVEVSUlVQVElCTEUsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKQotI2RlZmluZSBzdl90aW1lZHdhaXQoc3YsIHByaSwgbG9jaywgcywgc3ZmLCB0cywgcnRzKSBcCi0JX3N2X3dhaXQoc3YsIGxvY2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFLCB0aW1lc3BlY190b19qaWZmaWVzKHRzKSkKLSNkZWZpbmUgc3ZfdGltZWR3YWl0X3NpZyhzdiwgcHJpLCBsb2NrLCBzLCBzdmYsIHRzLCBydHMpIFwKLQlfc3Zfd2FpdChzdiwgbG9jaywgVEFTS19JTlRFUlJVUFRJQkxFLCB0aW1lc3BlY190b19qaWZmaWVzKHRzKSkKKwlfc3Zfd2FpdChzdiwgbG9jaykKICNkZWZpbmUgc3Zfc2lnbmFsKHN2KSBcCiAJd2FrZV91cCgmKHN2KS0+d2FpdGVycykKICNkZWZpbmUgc3ZfYnJvYWRjYXN0KHN2KSBcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggYTQ0ZDY4ZS4uZGUzYTE5OCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtNDIsNiArNDIsNDAgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAKKworLyoKKyAqIFByaW1lIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgc2luY2UgYWRkcmVzcyBpcyB1c2VkIGFzIHRoZSBrZXkuCisgKi8KKyNkZWZpbmUgTlZTWU5DCQkzNworI2RlZmluZSB0b19pb2VuZF93cSh2KQkoJnhmc19pb2VuZF93cVsoKHVuc2lnbmVkIGxvbmcpdikgJSBOVlNZTkNdKQorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHhmc19pb2VuZF93cVtOVlNZTkNdOworCit2b2lkIF9faW5pdAoreGZzX2lvZW5kX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVlNZTkM7IGkrKykKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmeGZzX2lvZW5kX3dxW2ldKTsKK30KKwordm9pZAoreGZzX2lvZW5kX3dhaXQoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IHRvX2lvZW5kX3dxKGlwKTsKKworCXdhaXRfZXZlbnQoKndxLCAoYXRvbWljX3JlYWQoJmlwLT5pX2lvY291bnQpID09IDApKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19pb2VuZF93YWtlKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaXAtPmlfaW9jb3VudCkpCisJCXdha2VfdXAodG9faW9lbmRfd3EoaXApKTsKK30KKwogU1RBVElDIHZvaWQKIHhmc19jb3VudF9wYWdlX3N0YXRlKAogCXN0cnVjdCBwYWdlCQkqcGFnZSwKQEAgLTE0NiwxNiArMTgwLDI1IEBACiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqbmV4dDsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlvZW5kLT5pb19pbm9kZSk7CiAKIAlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBuZXh0KSB7CiAJCW5leHQgPSBiaC0+Yl9wcml2YXRlOwogCQliaC0+Yl9lbmRfaW8oYmgsICFpb2VuZC0+aW9fZXJyb3IpOwogCX0KLQlpZiAodW5saWtlbHkoaW9lbmQtPmlvX2Vycm9yKSkgewotCQl2bl9pb2Vycm9yKFhGU19JKGlvZW5kLT5pb19pbm9kZSksIGlvZW5kLT5pb19lcnJvciwKLQkJCQlfX0ZJTEVfXyxfX0xJTkVfXyk7CisKKwkvKgorCSAqIFZvbHVtZSBtYW5hZ2VycyBzdXBwb3J0aW5nIG11bHRpcGxlIHBhdGhzIGNhbiBzZW5kIGJhY2sgRU5PREVWCisJICogd2hlbiB0aGUgZmluYWwgcGF0aCBkaXNhcHBlYXJzLiAgSW4gdGhpcyBjYXNlIGNvbnRpbnVpbmcgdG8gZmlsbAorCSAqIHRoZSBwYWdlIGNhY2hlIHdpdGggZGlydHkgZGF0YSB3aGljaCBjYW5ub3QgYmUgd3JpdHRlbiBvdXQgaXMKKwkgKiBldmlsLCBzbyBwcmV2ZW50IHRoYXQuCisJICovCisJaWYgKHVubGlrZWx5KGlvZW5kLT5pb19lcnJvciA9PSAtRU5PREVWKSkgeworCQl4ZnNfZG9fZm9yY2Vfc2h1dGRvd24oaXAtPmlfbW91bnQsIFNIVVRET1dOX0RFVklDRV9SRVEsCisJCQkJICAgICAgX19GSUxFX18sIF9fTElORV9fKTsKIAl9Ci0Jdm5faW93YWtlKFhGU19JKGlvZW5kLT5pb19pbm9kZSkpOworCisJeGZzX2lvZW5kX3dha2UoaXApOwogCW1lbXBvb2xfZnJlZShpb2VuZCwgeGZzX2lvZW5kX3Bvb2wpOwogfQogCkBAIC0xOTEsNyArMjM0LDcgQEAKIAkJaXAtPmlfZC5kaV9zaXplID0gaXNpemU7CiAJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKIAkJaXAtPmlfdXBkYXRlX3NpemUgPSAxOwotCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW9lbmQtPmlvX2lub2RlKTsKKwkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7CiAJfQogCiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKQEAgLTMxNywxNCArMzYwLDkgQEAKIAl4ZnNfaW9tYXBfdAkJKm1hcHAsCiAJaW50CQkJZmxhZ3MpCiB7Ci0JeGZzX2lub2RlX3QJCSppcCA9IFhGU19JKGlub2RlKTsKLQlpbnQJCQllcnJvciwgbm1hcHMgPSAxOworCWludAkJCW5tYXBzID0gMTsKIAotCWVycm9yID0geGZzX2lvbWFwKGlwLCBvZmZzZXQsIGNvdW50LAotCQkJCWZsYWdzLCBtYXBwLCAmbm1hcHMpOwotCWlmICghZXJyb3IgJiYgKGZsYWdzICYgKEJNQVBJX1dSSVRFfEJNQVBJX0FMTE9DQVRFKSkpCi0JCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSU1PRElGSUVEKTsKLQlyZXR1cm4gLWVycm9yOworCXJldHVybiAteGZzX2lvbWFwKFhGU19JKGlub2RlKSwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG1hcHAsICZubWFwcyk7CiB9CiAKIFNUQVRJQ19JTkxJTkUgaW50CkBAIC01MTIsNyArNTUwLDcgQEAKIAkJCXVubG9ja19idWZmZXIoYmgpOwogCQl9IHdoaWxlICgoYmggPSBuZXh0X2JoKSAhPSBOVUxMKTsKIAotCQl2bl9pb3dha2UoWEZTX0koaW9lbmQtPmlvX2lub2RlKSk7CisJCXhmc19pb2VuZF93YWtlKFhGU19JKGlvZW5kLT5pb19pbm9kZSkpOwogCQltZW1wb29sX2ZyZWUoaW9lbmQsIHhmc19pb2VuZF9wb29sKTsKIAl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaAppbmRleCAzYmEwNjMxLi43YjI2ZjVmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCkBAIC00Myw0ICs0Myw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB4ZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwogZXh0ZXJuIGludCB4ZnNfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogCitleHRlcm4gdm9pZCB4ZnNfaW9lbmRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19pb2VuZF93YWl0KHN0cnVjdCB4ZnNfaW5vZGUgKik7CisKICNlbmRpZiAvKiBfX1hGU19BT1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAzNmQ1ZmNkLi5jYjMyOWVkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtNjMwLDYgKzYzMCwyOSBAQAogCXJldHVybiBOVUxMOwogfQogCitTVEFUSUMgaW50CitfeGZzX2J1Zl9yZWFkKAorCXhmc19idWZfdAkJKmJwLAorCXhmc19idWZfZmxhZ3NfdAkJZmxhZ3MpCit7CisJaW50CQkJc3RhdHVzOworCisJWEJfVFJBQ0UoYnAsICJfeGZzX2J1Zl9yZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCisJQVNTRVJUKCEoZmxhZ3MgJiAoWEJGX0RFTFdSSXxYQkZfV1JJVEUpKSk7CisJQVNTRVJUKGJwLT5iX2JuICE9IFhGU19CVUZfREFERFJfTlVMTCk7CisKKwlicC0+Yl9mbGFncyAmPSB+KFhCRl9XUklURSB8IFhCRl9BU1lOQyB8IFhCRl9ERUxXUkkgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CisJYnAtPmJfZmxhZ3MgfD0gZmxhZ3MgJiAoWEJGX1JFQUQgfCBYQkZfQVNZTkMgfCBcCisJCQlYQkZfUkVBRF9BSEVBRCB8IF9YQkZfUlVOX1FVRVVFUyk7CisKKwlzdGF0dXMgPSB4ZnNfYnVmX2lvcmVxdWVzdChicCk7CisJaWYgKCFzdGF0dXMgJiYgIShmbGFncyAmIFhCRl9BU1lOQykpCisJCXN0YXR1cyA9IHhmc19idWZfaW93YWl0KGJwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiB4ZnNfYnVmX3QgKgogeGZzX2J1Zl9yZWFkX2ZsYWdzKAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCkBAIC02NDYsNyArNjY5LDcgQEAKIAkJaWYgKCFYRlNfQlVGX0lTRE9ORShicCkpIHsKIAkJCVhCX1RSQUNFKGJwLCAicmVhZCIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKIAkJCVhGU19TVEFUU19JTkMoeGJfZ2V0X3JlYWQpOwotCQkJeGZzX2J1Zl9pb3N0YXJ0KGJwLCBmbGFncyk7CisJCQlfeGZzX2J1Zl9yZWFkKGJwLCBmbGFncyk7CiAJCX0gZWxzZSBpZiAoZmxhZ3MgJiBYQkZfQVNZTkMpIHsKIAkJCVhCX1RSQUNFKGJwLCAicmVhZF9hc3luYyIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKIAkJCS8qCkBAIC0xMDQ4LDUwICsxMDcxLDM5IEBACiAJWEJfVFJBQ0UoYnAsICJpb2Vycm9yIiwgKHVuc2lnbmVkIGxvbmcpZXJyb3IpOwogfQogCi0vKgotICoJSW5pdGlhdGUgSS9PIG9uIGEgYnVmZmVyLCBiYXNlZCBvbiB0aGUgZmxhZ3Mgc3VwcGxpZWQuCi0gKglUaGUgYl9pb2RvbmUgcm91dGluZSBpbiB0aGUgYnVmZmVyIHN1cHBsaWVkIHdpbGwgb25seSBiZSBjYWxsZWQKLSAqCXdoZW4gYWxsIG9mIHRoZSBzdWJzaWRpYXJ5IEkvTyByZXF1ZXN0cywgaWYgYW55LCBoYXZlIGJlZW4gY29tcGxldGVkLgotICovCiBpbnQKLXhmc19idWZfaW9zdGFydCgKLQl4ZnNfYnVmX3QJCSpicCwKLQl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzKQoreGZzX2Jhd3JpdGUoCisJdm9pZAkJCSptcCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQogewotCWludAkJCXN0YXR1cyA9IDA7CisJWEJfVFJBQ0UoYnAsICJiYXdyaXRlIiwgMCk7CiAKLQlYQl9UUkFDRShicCwgImlvc3RhcnQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CisJQVNTRVJUKGJwLT5iX2JuICE9IFhGU19CVUZfREFERFJfTlVMTCk7CiAKLQlpZiAoZmxhZ3MgJiBYQkZfREVMV1JJKSB7Ci0JCWJwLT5iX2ZsYWdzICY9IH4oWEJGX1JFQUQgfCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMpOwotCQlicC0+Yl9mbGFncyB8PSBmbGFncyAmIChYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKLQkJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwotCQlyZXR1cm4gMDsKLQl9CisJeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CiAKLQlicC0+Yl9mbGFncyAmPSB+KFhCRl9SRUFEIHwgWEJGX1dSSVRFIHwgWEJGX0FTWU5DIHwgWEJGX0RFTFdSSSB8IFwKLQkJCVhCRl9SRUFEX0FIRUFEIHwgX1hCRl9SVU5fUVVFVUVTKTsKLQlicC0+Yl9mbGFncyB8PSBmbGFncyAmIChYQkZfUkVBRCB8IFhCRl9XUklURSB8IFhCRl9BU1lOQyB8IFwKLQkJCVhCRl9SRUFEX0FIRUFEIHwgX1hCRl9SVU5fUVVFVUVTKTsKKwlicC0+Yl9mbGFncyAmPSB+KFhCRl9SRUFEIHwgWEJGX0RFTFdSSSB8IFhCRl9SRUFEX0FIRUFEKTsKKwlicC0+Yl9mbGFncyB8PSAoWEJGX1dSSVRFIHwgWEJGX0FTWU5DIHwgX1hCRl9SVU5fUVVFVUVTKTsKIAotCUJVR19PTihicC0+Yl9ibiA9PSBYRlNfQlVGX0RBRERSX05VTEwpOworCWJwLT5iX21vdW50ID0gbXA7CisJYnAtPmJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKKwlyZXR1cm4geGZzX2Jkc3RyYXRfY2IoYnApOworfQogCi0JLyogRm9yIHdyaXRlcyBhbGxvdyBhbiBhbHRlcm5hdGUgc3RyYXRlZ3kgcm91dGluZSB0byBwcmVjZWRlCi0JICogdGhlIGFjdHVhbCBJL08gcmVxdWVzdCAod2hpY2ggbWF5IG5vdCBiZSBpc3N1ZWQgYXQgYWxsIGluCi0JICogYSBzaHV0ZG93biBzaXR1YXRpb24sIGZvciBleGFtcGxlKS4KLQkgKi8KLQlzdGF0dXMgPSAoZmxhZ3MgJiBYQkZfV1JJVEUpID8KLQkJeGZzX2J1Zl9pb3N0cmF0ZWd5KGJwKSA6IHhmc19idWZfaW9yZXF1ZXN0KGJwKTsKK3ZvaWQKK3hmc19iZHdyaXRlKAorCXZvaWQJCQkqbXAsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlYQl9UUkFDRShicCwgImJkd3JpdGUiLCAwKTsKIAotCS8qIFdhaXQgZm9yIEkvTyBpZiB3ZSBhcmUgbm90IGFuIGFzeW5jIHJlcXVlc3QuCi0JICogTm90ZTogYXN5bmMgSS9PIHJlcXVlc3QgY29tcGxldGlvbiB3aWxsIHJlbGVhc2UgdGhlIGJ1ZmZlciwKLQkgKiBhbmQgdGhhdCBjYW4gYWxyZWFkeSBiZSBkb25lIGJ5IHRoaXMgcG9pbnQuICBTbyB1c2luZyB0aGUKLQkgKiBidWZmZXIgcG9pbnRlciBmcm9tIGhlcmUgb24sIGFmdGVyIGFzeW5jIEkvTywgaXMgaW52YWxpZC4KLQkgKi8KLQlpZiAoIXN0YXR1cyAmJiAhKGZsYWdzICYgWEJGX0FTWU5DKSkKLQkJc3RhdHVzID0geGZzX2J1Zl9pb3dhaXQoYnApOworCWJwLT5iX3N0cmF0ID0geGZzX2Jkc3RyYXRfY2I7CisJYnAtPmJfbW91bnQgPSBtcDsKIAotCXJldHVybiBzdGF0dXM7CisJYnAtPmJfZmxhZ3MgJj0gflhCRl9SRUFEOworCWJwLT5iX2ZsYWdzIHw9IChYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKKworCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCAxKTsKIH0KIAogU1RBVElDX0lOTElORSB2b2lkCkBAIC0xMTE0LDggKzExMjYsNyBAQAogCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gYnAtPmJfdGFyZ2V0LT5idF9ic2l6ZTsKIAlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CiAKLQlpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKQotCQlicC0+Yl9lcnJvciA9IEVJTzsKKwl4ZnNfYnVmX2lvZXJyb3IoYnAsIC1lcnJvcik7CiAKIAlkbyB7CiAJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnZlYy0+YnZfcGFnZTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggNDU2NTE5YS4uMjg4YWU3YyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTE2OCw3ICsxNjgsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uCWJfaW93YWl0OwkvKiBxdWV1ZSBmb3IgSS9PIHdhaXRlcnMgKi8KIAl2b2lkCQkJKmJfZnNwcml2OwogCXZvaWQJCQkqYl9mc3ByaXYyOwotCXZvaWQJCQkqYl9mc3ByaXYzOworCXN0cnVjdCB4ZnNfbW91bnQJKmJfbW91bnQ7CiAJdW5zaWduZWQgc2hvcnQJCWJfZXJyb3I7CS8qIGVycm9yIGNvZGUgb24gSS9PICovCiAJdW5zaWduZWQgaW50CQliX3BhZ2VfY291bnQ7CS8qIHNpemUgb2YgcGFnZSBhcnJheSAqLwogCXVuc2lnbmVkIGludAkJYl9vZmZzZXQ7CS8qIHBhZ2Ugb2Zmc2V0IGluIGZpcnN0IHBhZ2UgKi8KQEAgLTIxNCw5ICsyMTQsMTAgQEAKIGV4dGVybiB2b2lkIHhmc19idWZfdW5sb2NrKHhmc19idWZfdCAqKTsKIAogLyogQnVmZmVyIFJlYWQgYW5kIFdyaXRlIFJvdXRpbmVzICovCitleHRlcm4gaW50IHhmc19iYXdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKTsKK2V4dGVybiB2b2lkIHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKTsKIGV4dGVybiB2b2lkIHhmc19idWZfaW9lbmQoeGZzX2J1Zl90ICosCWludCk7CiBleHRlcm4gdm9pZCB4ZnNfYnVmX2lvZXJyb3IoeGZzX2J1Zl90ICosIGludCk7Ci1leHRlcm4gaW50IHhmc19idWZfaW9zdGFydCh4ZnNfYnVmX3QgKiwgeGZzX2J1Zl9mbGFnc190KTsKIGV4dGVybiBpbnQgeGZzX2J1Zl9pb3JlcXVlc3QoeGZzX2J1Zl90ICopOwogZXh0ZXJuIGludCB4ZnNfYnVmX2lvd2FpdCh4ZnNfYnVmX3QgKik7CiBleHRlcm4gdm9pZCB4ZnNfYnVmX2lvbW92ZSh4ZnNfYnVmX3QgKiwgc2l6ZV90LCBzaXplX3QsIHhmc19jYWRkcl90LApAQCAtMzExLDEwICszMTIsNiBAQAogI2RlZmluZSBYRlNfQlVGX1VOT1JERVJFRChicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9PUkRFUkVEKQogI2RlZmluZSBYRlNfQlVGX0lTT1JERVJFRChicCkJKChicCktPmJfZmxhZ3MgJiBYQkZfT1JERVJFRCkKIAotI2RlZmluZSBYRlNfQlVGX1NIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoYnApCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoYnApCSgwKQotCiAjZGVmaW5lIFhGU19CVUZfSE9MRChicCkJeGZzX2J1Zl9ob2xkKGJwKQogI2RlZmluZSBYRlNfQlVGX1JFQUQoYnApCSgoYnApLT5iX2ZsYWdzIHw9IFhCRl9SRUFEKQogI2RlZmluZSBYRlNfQlVGX1VOUkVBRChicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9SRUFEKQpAQCAtMzM0LDggKzMzMSw2IEBACiAjZGVmaW5lIFhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgdmFsKQkJKChicCktPmJfZnNwcml2ID0gKHZvaWQqKSh2YWwpKQogI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHR5cGUpCQkoKHR5cGUpKGJwKS0+Yl9mc3ByaXYyKQogI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCB2YWwpCQkoKGJwKS0+Yl9mc3ByaXYyID0gKHZvaWQqKSh2YWwpKQotI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTMoYnAsIHR5cGUpCQkoKHR5cGUpKGJwKS0+Yl9mc3ByaXYzKQotI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJwLCB2YWwpCQkoKGJwKS0+Yl9mc3ByaXYzID0gKHZvaWQqKSh2YWwpKQogI2RlZmluZSBYRlNfQlVGX1NFVF9TVEFSVChicCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFhGU19CVUZfU0VUX0JSRUxTRV9GVU5DKGJwLCBmdW5jKQkoKGJwKS0+Yl9yZWxzZSA9IChmdW5jKSkKIApAQCAtMzY2LDE0ICszNjEsNiBAQAogI2RlZmluZSBYRlNfQlVGX1RBUkdFVChicCkJCSgoYnApLT5iX3RhcmdldCkKICNkZWZpbmUgWEZTX0JVRlRBUkdfTkFNRSh0YXJnZXQpCXhmc19idWZfdGFyZ2V0X25hbWUodGFyZ2V0KQogCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfYmF3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKLXsKLQlicC0+Yl9mc3ByaXYzID0gbXA7Ci0JYnAtPmJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKLQl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKLQlyZXR1cm4geGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfV1JJVEUgfCBYQkZfQVNZTkMgfCBfWEJGX1JVTl9RVUVVRVMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2J1Zl9yZWxzZSh4ZnNfYnVmX3QgKmJwKQogewogCWlmICghYnAtPmJfcmVsc2UpCkBAIC00MTQsMTcgKzQwMSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogTm8gZXJyb3IgY2FuIGJlIHJldHVybmVkIGZyb20geGZzX2J1Zl9pb3N0YXJ0IGZvciBkZWx3cmkKLSAqIGJ1ZmZlcnMgYXMgdGhleSBhcmUgcXVldWVkIGFuZCBubyBJL08gaXMgaXNzdWVkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgeGZzX2Jkd3JpdGUodm9pZCAqbXAsIHhmc19idWZfdCAqYnApCi17Ci0JYnAtPmJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKLQlicC0+Yl9mc3ByaXYzID0gbXA7Ci0JKHZvaWQpeGZzX2J1Zl9pb3N0YXJ0KGJwLCBYQkZfREVMV1JJIHwgWEJGX0FTWU5DKTsKLX0KLQogI2RlZmluZSBYRlNfYmRzdHJhdChicCkgeGZzX2J1Zl9pb3JlcXVlc3QoYnApCiAKICNkZWZpbmUgeGZzX2lvd2FpdChicCkJeGZzX2J1Zl9pb3dhaXQoYnApCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmgKaW5kZXggOGMwMjJjZC4uNTViZGRmMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2NyZWQuaApAQCAtMjUsMTIgKzI1LDQgQEAKICAqLwogdHlwZWRlZiBjb25zdCBzdHJ1Y3QgY3JlZCBjcmVkX3Q7CiAKLWV4dGVybiBjcmVkX3QgKnN5c19jcmVkOwotCi0vKiB0aGlzIGlzIGEgaGFjay4uIChhc3N1bWVzIHN5c19jcmVkIGlzIHRoZSBvbmx5IGNyZWRfdCBpbiB0aGUgc3lzdGVtKSAqLwotc3RhdGljIGlubGluZSBpbnQgY2FwYWJsZV9jcmVkKGNyZWRfdCAqY3IsIGludCBjaWQpCi17Ci0JcmV0dXJuIChjciA9PSBzeXNfY3JlZCkgPyAxIDogY2FwYWJsZShjaWQpOwotfQotCiAjZW5kaWYgIC8qIF9fWEZTX0NSRURfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCmluZGV4IDdmN2FiZWMuLjU5NTc1MWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfdmZzb3BzLmgiCiAKIC8qCiAgKiBOb3RlIHRoYXQgd2Ugb25seSBhY2NlcHQgZmlsZWlkcyB3aGljaCBhcmUgbG9uZyBlbm91Z2ggcmF0aGVyIHRoYW4gYWxsb3cKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCAzZmVlNzkwLi5lMTRjNGUzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0zNiwzMSArMzYsMTUgQEAKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfcncuaCIKLSNpbmNsdWRlICJ4ZnNfaW9jdGwzMi5oIgogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pb2N0bC5oIgogCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIAogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB4ZnNfZmlsZV92bV9vcHM7CiAKLVNUQVRJQ19JTkxJTkUgc3NpemVfdAotX194ZnNfZmlsZV9yZWFkKAotCXN0cnVjdCBraW9jYgkJKmlvY2IsCi0JY29uc3Qgc3RydWN0IGlvdmVjCSppb3YsCi0JdW5zaWduZWQgbG9uZwkJbnJfc2VncywKLQlpbnQJCQlpb2ZsYWdzLAotCWxvZmZfdAkJCXBvcykKLXsKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCi0JQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwotCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQotCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOwotCXJldHVybiB4ZnNfcmVhZChYRlNfSShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSwgaW9jYiwgaW92LAotCQkJCW5yX3NlZ3MsICZpb2NiLT5raV9wb3MsIGlvZmxhZ3MpOwotfQotCiBTVEFUSUMgc3NpemVfdAogeGZzX2ZpbGVfYWlvX3JlYWQoCiAJc3RydWN0IGtpb2NiCQkqaW9jYiwKQEAgLTY4LDM0ICs1MiwxNiBAQAogCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCiAJbG9mZl90CQkJcG9zKQogewotCXJldHVybiBfX3hmc19maWxlX3JlYWQoaW9jYiwgaW92LCBucl9zZWdzLCBJT19JU0FJTywgcG9zKTsKLX0KLQotU1RBVElDIHNzaXplX3QKLXhmc19maWxlX2Fpb19yZWFkX2ludmlzKAotCXN0cnVjdCBraW9jYgkJKmlvY2IsCi0JY29uc3Qgc3RydWN0IGlvdmVjCSppb3YsCi0JdW5zaWduZWQgbG9uZwkJbnJfc2VncywKLQlsb2ZmX3QJCQlwb3MpCi17Ci0JcmV0dXJuIF9feGZzX2ZpbGVfcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIElPX0lTQUlPfElPX0lOVklTLCBwb3MpOwotfQotCi1TVEFUSUNfSU5MSU5FIHNzaXplX3QKLV9feGZzX2ZpbGVfd3JpdGUoCi0Jc3RydWN0IGtpb2NiCQkqaW9jYiwKLQljb25zdCBzdHJ1Y3QgaW92ZWMJKmlvdiwKLQl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAotCWludAkJCWlvZmxhZ3MsCi0JbG9mZl90CQkJcG9zKQotewotCXN0cnVjdCBmaWxlCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCWludAkJCWlvZmxhZ3MgPSBJT19JU0FJTzsKIAogCUJVR19PTihpb2NiLT5raV9wb3MgIT0gcG9zKTsKIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKIAkJaW9mbGFncyB8PSBJT19JU0RJUkVDVDsKLQlyZXR1cm4geGZzX3dyaXRlKFhGU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCksIGlvY2IsIGlvdiwgbnJfc2VncywKLQkJCQkmaW9jYi0+a2lfcG9zLCBpb2ZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfTk9DTVRJTUUpCisJCWlvZmxhZ3MgfD0gSU9fSU5WSVM7CisJcmV0dXJuIHhmc19yZWFkKFhGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLCBpb2NiLCBpb3YsCisJCQkJbnJfc2VncywgJmlvY2ItPmtpX3BvcywgaW9mbGFncyk7CiB9CiAKIFNUQVRJQyBzc2l6ZV90CkBAIC0xMDUsMTcgKzcxLDE2IEBACiAJdW5zaWduZWQgbG9uZwkJbnJfc2VncywKIAlsb2ZmX3QJCQlwb3MpCiB7Ci0JcmV0dXJuIF9feGZzX2ZpbGVfd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBJT19JU0FJTywgcG9zKTsKLX0KKwlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCWludAkJCWlvZmxhZ3MgPSBJT19JU0FJTzsKIAotU1RBVElDIHNzaXplX3QKLXhmc19maWxlX2Fpb193cml0ZV9pbnZpcygKLQlzdHJ1Y3Qga2lvY2IJCSppb2NiLAotCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92LAotCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCi0JbG9mZl90CQkJcG9zKQotewotCXJldHVybiBfX3hmc19maWxlX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgSU9fSVNBSU98SU9fSU5WSVMsIHBvcyk7CisJQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOworCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQorCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKKwkJaW9mbGFncyB8PSBJT19JTlZJUzsKKwlyZXR1cm4geGZzX3dyaXRlKFhGU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCksIGlvY2IsIGlvdiwgbnJfc2VncywKKwkJCQkmaW9jYi0+a2lfcG9zLCBpb2ZsYWdzKTsKIH0KIAogU1RBVElDIHNzaXplX3QKQEAgLTEyNiwyMCArOTEsMTMgQEAKIAlzaXplX3QJCQlsZW4sCiAJdW5zaWduZWQgaW50CQlmbGFncykKIHsKLQlyZXR1cm4geGZzX3NwbGljZV9yZWFkKFhGU19JKGluZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCi0JCQkJICAgaW5maWxwLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzLCAwKTsKLX0KKwlpbnQJCQlpb2ZsYWdzID0gMDsKIAotU1RBVElDIHNzaXplX3QKLXhmc19maWxlX3NwbGljZV9yZWFkX2ludmlzKAotCXN0cnVjdCBmaWxlCQkqaW5maWxwLAotCWxvZmZfdAkJCSpwcG9zLAotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8JKnBpcGUsCi0Jc2l6ZV90CQkJbGVuLAotCXVuc2lnbmVkIGludAkJZmxhZ3MpCi17CisJaWYgKGluZmlscC0+Zl9tb2RlICYgRk1PREVfTk9DTVRJTUUpCisJCWlvZmxhZ3MgfD0gSU9fSU5WSVM7CisKIAlyZXR1cm4geGZzX3NwbGljZV9yZWFkKFhGU19JKGluZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCi0JCQkJICAgaW5maWxwLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzLCBJT19JTlZJUyk7CisJCQkJICAgaW5maWxwLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzLCBpb2ZsYWdzKTsKIH0KIAogU1RBVElDIHNzaXplX3QKQEAgLTE1MCwzMCArMTA4LDQ5IEBACiAJc2l6ZV90CQkJbGVuLAogCXVuc2lnbmVkIGludAkJZmxhZ3MpCiB7Ci0JcmV0dXJuIHhmc19zcGxpY2Vfd3JpdGUoWEZTX0kob3V0ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCi0JCQkJICAgIHBpcGUsIG91dGZpbHAsIHBwb3MsIGxlbiwgZmxhZ3MsIDApOwotfQorCWludAkJCWlvZmxhZ3MgPSAwOwogCi1TVEFUSUMgc3NpemVfdAoteGZzX2ZpbGVfc3BsaWNlX3dyaXRlX2ludmlzKAotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8JKnBpcGUsCi0Jc3RydWN0IGZpbGUJCSpvdXRmaWxwLAotCWxvZmZfdAkJCSpwcG9zLAotCXNpemVfdAkJCWxlbiwKLQl1bnNpZ25lZCBpbnQJCWZsYWdzKQoteworCWlmIChvdXRmaWxwLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKKwkJaW9mbGFncyB8PSBJT19JTlZJUzsKKwogCXJldHVybiB4ZnNfc3BsaWNlX3dyaXRlKFhGU19JKG91dGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLAotCQkJCSAgICBwaXBlLCBvdXRmaWxwLCBwcG9zLCBsZW4sIGZsYWdzLCBJT19JTlZJUyk7CisJCQkJICAgIHBpcGUsIG91dGZpbHAsIHBwb3MsIGxlbiwgZmxhZ3MsIGlvZmxhZ3MpOwogfQogCiBTVEFUSUMgaW50CiB4ZnNfZmlsZV9vcGVuKAogCXN0cnVjdCBpbm9kZQkqaW5vZGUsCi0Jc3RydWN0IGZpbGUJKmZpbHApCisJc3RydWN0IGZpbGUJKmZpbGUpCiB7Ci0JaWYgKCEoZmlscC0+Zl9mbGFncyAmIE9fTEFSR0VGSUxFKSAmJiBpX3NpemVfcmVhZChpbm9kZSkgPiBNQVhfTk9OX0xGUykKKwlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpICYmIGlfc2l6ZV9yZWFkKGlub2RlKSA+IE1BWF9OT05fTEZTKQogCQlyZXR1cm4gLUVGQklHOwotCXJldHVybiAteGZzX29wZW4oWEZTX0koaW5vZGUpKTsKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihYRlNfTShpbm9kZS0+aV9zYikpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX2Rpcl9vcGVuKAorCXN0cnVjdCBpbm9kZQkqaW5vZGUsCisJc3RydWN0IGZpbGUJKmZpbGUpCit7CisJc3RydWN0IHhmc19pbm9kZSAqaXAgPSBYRlNfSShpbm9kZSk7CisJaW50CQltb2RlOworCWludAkJZXJyb3I7CisKKwllcnJvciA9IHhmc19maWxlX29wZW4oaW5vZGUsIGZpbGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IGJsb2NrcywgcmVhZC1haGVhZCBibG9jayAwIGFzIHdlJ3JlIGFsbW9zdAorCSAqIGNlcnRhaW4gdG8gaGF2ZSB0aGUgbmV4dCBvcGVyYXRpb24gYmUgYSByZWFkIHRoZXJlLgorCSAqLworCW1vZGUgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChpcCk7CisJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKQorCQl4ZnNfZGFfcmVhZGFfYnVmKE5VTEwsIGlwLCAwLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfaXVubG9jayhpcCwgbW9kZSk7CisJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTIyNyw3ICsyMDQsNyBAQAogCSAqIHBvaW50IHdlIGNhbiBjaGFuZ2UgdGhlIC0+cmVhZGRpciBwcm90b3R5cGUgdG8gaW5jbHVkZSB0aGUKIAkgKiBidWZmZXIgc2l6ZS4KIAkgKi8KLQlidWZzaXplID0gKHNpemVfdCltaW5fdChsb2ZmX3QsIFBBR0VfU0laRSwgaW5vZGUtPmlfc2l6ZSk7CisJYnVmc2l6ZSA9IChzaXplX3QpbWluX3QobG9mZl90LCBQQUdFX1NJWkUsIGlwLT5pX2QuZGlfc2l6ZSk7CiAKIAllcnJvciA9IHhmc19yZWFkZGlyKGlwLCBkaXJlbnQsIGJ1ZnNpemUsCiAJCQkJKHhmc19vZmZfdCAqKSZmaWxwLT5mX3BvcywgZmlsbGRpcik7CkBAIC0yNDgsNDggKzIyNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLVNUQVRJQyBsb25nCi14ZnNfZmlsZV9pb2N0bCgKLQlzdHJ1Y3QgZmlsZQkqZmlscCwKLQl1bnNpZ25lZCBpbnQJY21kLAotCXVuc2lnbmVkIGxvbmcJcCkKLXsKLQlpbnQJCWVycm9yOwotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCi0JZXJyb3IgPSB4ZnNfaW9jdGwoWEZTX0koaW5vZGUpLCBmaWxwLCAwLCBjbWQsICh2b2lkIF9fdXNlciAqKXApOwotCXhmc19pZmxhZ3Nfc2V0KFhGU19JKGlub2RlKSwgWEZTX0lNT0RJRklFRCk7Ci0KLQkvKiBOT1RFOiAgc29tZSBvZiB0aGUgaW9jdGwncyByZXR1cm4gcG9zaXRpdmUgIydzIGFzIGEKLQkgKgkgIGJ5dGUgY291bnQgaW5kaWNhdGluZyBzdWNjZXNzLCBzdWNoIGFzCi0JICoJICByZWFkbGlua19ieV9oYW5kbGUuICBTbyB3ZSBkb24ndCAic2lnbiBmbGlwIgotCSAqCSAgbGlrZSBtb3N0IG90aGVyIHJvdXRpbmVzLiAgVGhpcyBtZWFucyB0cnVlCi0JICoJICBlcnJvcnMgbmVlZCB0byBiZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgotCSAqLwotCXJldHVybiBlcnJvcjsKLX0KLQotU1RBVElDIGxvbmcKLXhmc19maWxlX2lvY3RsX2ludmlzKAotCXN0cnVjdCBmaWxlCSpmaWxwLAotCXVuc2lnbmVkIGludAljbWQsCi0JdW5zaWduZWQgbG9uZwlwKQotewotCWludAkJZXJyb3I7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0KLQllcnJvciA9IHhmc19pb2N0bChYRlNfSShpbm9kZSksIGZpbHAsIElPX0lOVklTLCBjbWQsICh2b2lkIF9fdXNlciAqKXApOwotCXhmc19pZmxhZ3Nfc2V0KFhGU19JKGlub2RlKSwgWEZTX0lNT0RJRklFRCk7Ci0KLQkvKiBOT1RFOiAgc29tZSBvZiB0aGUgaW9jdGwncyByZXR1cm4gcG9zaXRpdmUgIydzIGFzIGEKLQkgKgkgIGJ5dGUgY291bnQgaW5kaWNhdGluZyBzdWNjZXNzLCBzdWNoIGFzCi0JICoJICByZWFkbGlua19ieV9oYW5kbGUuICBTbyB3ZSBkb24ndCAic2lnbiBmbGlwIgotCSAqCSAgbGlrZSBtb3N0IG90aGVyIHJvdXRpbmVzLiAgVGhpcyBtZWFucyB0cnVlCi0JICoJICBlcnJvcnMgbmVlZCB0byBiZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgotCSAqLwotCXJldHVybiBlcnJvcjsKLX0KLQogLyoKICAqIG1tYXAoKWQgZmlsZSBoYXMgdGFrZW4gd3JpdGUgcHJvdGVjdGlvbiBmYXVsdCBhbmQgaXMgYmVpbmcgbWFkZQogICogd3JpdGFibGUuIFdlIGNhbiBzZXQgdGhlIHBhZ2Ugc3RhdGUgdXAgY29ycmVjdGx5IGZvciBhIHdyaXRhYmxlCkBAIC0zMjUsMjYgKzI2MCw4IEBACiAjZW5kaWYKIH07CiAKLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeGZzX2ludmlzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKLQkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAotCS5haW9fcmVhZAk9IHhmc19maWxlX2Fpb19yZWFkX2ludmlzLAotCS5haW9fd3JpdGUJPSB4ZnNfZmlsZV9haW9fd3JpdGVfaW52aXMsCi0JLnNwbGljZV9yZWFkCT0geGZzX2ZpbGVfc3BsaWNlX3JlYWRfaW52aXMsCi0JLnNwbGljZV93cml0ZQk9IHhmc19maWxlX3NwbGljZV93cml0ZV9pbnZpcywKLQkudW5sb2NrZWRfaW9jdGwJPSB4ZnNfZmlsZV9pb2N0bF9pbnZpcywKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bAk9IHhmc19maWxlX2NvbXBhdF9pbnZpc19pb2N0bCwKLSNlbmRpZgotCS5tbWFwCQk9IHhmc19maWxlX21tYXAsCi0JLm9wZW4JCT0geGZzX2ZpbGVfb3BlbiwKLQkucmVsZWFzZQk9IHhmc19maWxlX3JlbGVhc2UsCi0JLmZzeW5jCQk9IHhmc19maWxlX2ZzeW5jLAotfTsKLQotCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhmc19kaXJfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHhmc19kaXJfb3BlbiwKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCT0geGZzX2ZpbGVfcmVhZGRpciwKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMKaW5kZXggMzZjYWE2ZC4uNWFlYjc3NyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYwpAQCAtMjQsNiArMjQsMTAgQEAKIGludCAgZnNfbm9zeXModm9pZCkgeyByZXR1cm4gRU5PU1lTOyB9CiB2b2lkIGZzX25vdmFsKHZvaWQpIHsgcmV0dXJuOyB9CiAKKy8qCisgKiBub3RlOiBhbGwgZmlsZW1hcCBmdW5jdGlvbnMgcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGVzLiBUaGVzZQorICogbmVlZCB0byBiZSBpbnZlcnRlZCBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSB4ZnMgY29yZSBmdW5jdGlvbnMuCisgKi8KIHZvaWQKIHhmc190b3NzcGFnZXMoCiAJeGZzX2lub2RlX3QJKmlwLApAQCAtNTMsNyArNTcsNyBAQAogCQlpZiAoIXJldCkKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKG1hcHBpbmcsIGZpcnN0KTsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLXJldDsKIH0KIAogaW50CkBAIC03MiwxMCArNzYsMjMgQEAKIAkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwogCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUobWFwcGluZyk7CiAJCWlmIChmbGFncyAmIFhGU19CX0FTWU5DKQotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybiAtcmV0OwogCQlyZXQyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gcmV0MjsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLXJldDsKK30KKworaW50Cit4ZnNfd2FpdF9vbl9wYWdlcygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX29mZl90CWZpcnN0LAorCXhmc19vZmZfdAlsYXN0KQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gVkZTX0koaXApLT5pX21hcHBpbmc7CisKKwlpZiAobWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19XUklURUJBQ0spKQorCQlyZXR1cm4gLWZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jCmluZGV4IGVmOTBlNjQuLjJhZThiMWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqLwogeGZzX3BhcmFtX3QgeGZzX3BhcmFtcyA9IHsKIAkJCSAgLyoJTUlOCQlERkxUCQlNQVgJKi8KLQkucmVzdHJpY3RfY2hvd24JPSB7CTAsCQkxLAkJMQl9LAogCS5zZ2lkX2luaGVyaXQJPSB7CTAsCQkwLAkJMQl9LAogCS5zeW1saW5rX21vZGUJPSB7CTAsCQkwLAkJMQl9LAogCS5wYW5pY19tYXNrCT0gewkwLAkJMCwJCTI1NQl9LApAQCAtNDMsMTAgKzQyLDMgQEAKIAkuaW5oZXJpdF9ub2RmcmcJPSB7CTAsCQkxLAkJMQl9LAogCS5mc3RybV90aW1lcgk9IHsJMSwJCTMwKjEwMCwJCTM2MDAqMTAwfSwKIH07Ci0KLS8qCi0gKiBHbG9iYWwgc3lzdGVtIGNyZWRlbnRpYWwgc3RydWN0dXJlLgotICovCi1zdGF0aWMgY3JlZF90IHN5c19jcmVkX3ZhbDsKLWNyZWRfdCAqc3lzX2NyZWQgPSAmc3lzX2NyZWRfdmFsOwotCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmgKaW5kZXggNmVkYThhMy4uNjlmNzFjYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuaApAQCAtMTksNiArMTksNSBAQAogI2RlZmluZSBfX1hGU19HTE9CQUxTX0hfXwogCiBleHRlcm4gdWludDY0X3QJeGZzX3BhbmljX21hc2s7CQkvKiBzZXQgdG8gY2F1c2UgbW9yZSBwYW5pY3MgKi8KLWV4dGVybiBjcmVkX3QgKnN5c19jcmVkOwogCiAjZW5kaWYJLyogX19YRlNfR0xPQkFMU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDI4MWNiZDUuLjY3MjA1ZjYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtNjgsMjYgKzY4LDIyIEBACiAgKiBYRlNfSU9DX1BBVEhfVE9fSEFORExFCiAgKiAgICByZXR1cm5zIGZ1bGwgaGFuZGxlIGZvciBhIHBhdGgKICAqLwotU1RBVElDIGludAoraW50CiB4ZnNfZmluZF9oYW5kbGUoCiAJdW5zaWduZWQgaW50CQljbWQsCi0Jdm9pZAkJCV9fdXNlciAqYXJnKQorCXhmc19mc29wX2hhbmRsZXJlcV90CSpocmVxKQogewogCWludAkJCWhzaXplOwogCXhmc19oYW5kbGVfdAkJaGFuZGxlOwotCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKGhyZXEpKSkKLQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKLQogCW1lbXNldCgoY2hhciAqKSZoYW5kbGUsIDAsIHNpemVvZihoYW5kbGUpKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEU6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOiB7CiAJCXN0cnVjdCBwYXRoIHBhdGg7Ci0JCWludCBlcnJvciA9IHVzZXJfbHBhdGgoKGNvbnN0IGNoYXIgX191c2VyICopaHJlcS5wYXRoLCAmcGF0aCk7CisJCWludCBlcnJvciA9IHVzZXJfbHBhdGgoKGNvbnN0IGNoYXIgX191c2VyICopaHJlcS0+cGF0aCwgJnBhdGgpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEwMSw3ICs5Nyw3IEBACiAJY2FzZSBYRlNfSU9DX0ZEX1RPX0hBTkRMRTogewogCQlzdHJ1Y3QgZmlsZQkqZmlsZTsKIAotCQlmaWxlID0gZmdldChocmVxLmZkKTsKKwkJZmlsZSA9IGZnZXQoaHJlcS0+ZmQpOwogCQlpZiAoIWZpbGUpCiAJCSAgICByZXR1cm4gLUVCQURGOwogCkBAIC0xNTgsOCArMTU0LDggQEAKIAl9CiAKIAkvKiBub3cgY29weSBvdXIgaGFuZGxlIGludG8gdGhlIHVzZXIgYnVmZmVyICYgd3JpdGUgb3V0IHRoZSBzaXplICovCi0JaWYgKGNvcHlfdG9fdXNlcihocmVxLm9oYW5kbGUsICZoYW5kbGUsIGhzaXplKSB8fAotCSAgICBjb3B5X3RvX3VzZXIoaHJlcS5vaGFuZGxlbiwgJmhzaXplLCBzaXplb2YoX19zMzIpKSkgeworCWlmIChjb3B5X3RvX3VzZXIoaHJlcS0+b2hhbmRsZSwgJmhhbmRsZSwgaHNpemUpIHx8CisJICAgIGNvcHlfdG9fdXNlcihocmVxLT5vaGFuZGxlbiwgJmhzaXplLCBzaXplb2YoX19zMzIpKSkgewogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIAl9CkBAIC0yNDksMTAgKzI0NSwxMCBAQAogCXJldHVybiAwOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19vcGVuX2J5X2hhbmRsZSgKIAl4ZnNfbW91bnRfdAkJKm1wLAotCXZvaWQJCQlfX3VzZXIgKmFyZywKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAkqaHJlcSwKIAlzdHJ1Y3QgZmlsZQkJKnBhcmZpbHAsCiAJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpCiB7CkBAIC0yNjMsMTQgKzI1OSwxMSBAQAogCXN0cnVjdCBmaWxlCQkqZmlscDsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OwotCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2hhbmRsZXJlcV90KSkpCi0JCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CiAKLQllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmhyZXEsICZpbm9kZSk7CisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsIGhyZXEsICZpbm9kZSk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gLWVycm9yOwogCkBAIC0yODEsMTAgKzI3NCwxMCBAQAogCX0KIAogI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKLQlocmVxLm9mbGFncyB8PSBPX0xBUkdFRklMRTsKKwlocmVxLT5vZmxhZ3MgfD0gT19MQVJHRUZJTEU7CiAjZW5kaWYKIAkvKiBQdXQgb3BlbiBwZXJtaXNzaW9uIGluIG5hbWVpIGZvcm1hdC4gKi8KLQlwZXJtZmxhZyA9IGhyZXEub2ZsYWdzOworCXBlcm1mbGFnID0gaHJlcS0+b2ZsYWdzOwogCWlmICgocGVybWZsYWcrMSkgJiBPX0FDQ01PREUpCiAJCXBlcm1mbGFnKys7CiAJaWYgKHBlcm1mbGFnICYgT19UUlVOQykKQEAgLTMyMiwxNSArMzE1LDE2IEBACiAJbW50Z2V0KHBhcmZpbHAtPmZfcGF0aC5tbnQpOwogCiAJLyogQ3JlYXRlIGZpbGUgcG9pbnRlci4gKi8KLQlmaWxwID0gZGVudHJ5X29wZW4oZGVudHJ5LCBwYXJmaWxwLT5mX3BhdGgubW50LCBocmVxLm9mbGFncywgY3JlZCk7CisJZmlscCA9IGRlbnRyeV9vcGVuKGRlbnRyeSwgcGFyZmlscC0+Zl9wYXRoLm1udCwgaHJlcS0+b2ZsYWdzLCBjcmVkKTsKIAlpZiAoSVNfRVJSKGZpbHApKSB7CiAJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKIAkJcmV0dXJuIC1YRlNfRVJST1IoLVBUUl9FUlIoZmlscCkpOwogCX0KKwogCWlmIChpbm9kZS0+aV9tb2RlICYgU19JRlJFRykgewogCQkvKiBpbnZpc2libGUgb3BlcmF0aW9uIHNob3VsZCBub3QgY2hhbmdlIGF0aW1lICovCiAJCWZpbHAtPmZfZmxhZ3MgfD0gT19OT0FUSU1FOwotCQlmaWxwLT5mX29wID0gJnhmc19pbnZpc19maWxlX29wZXJhdGlvbnM7CisJCWZpbHAtPmZfbW9kZSB8PSBGTU9ERV9OT0NNVElNRTsKIAl9CiAKIAlmZF9pbnN0YWxsKG5ld19mZCwgZmlscCk7CkBAIC0zNjMsMjQgKzM1NywyMSBAQAogfQogCiAKLVNUQVRJQyBpbnQKK2ludAogeGZzX3JlYWRsaW5rX2J5X2hhbmRsZSgKIAl4ZnNfbW91bnRfdAkJKm1wLAotCXZvaWQJCQlfX3VzZXIgKmFyZywKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAkqaHJlcSwKIAlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKLQl4ZnNfZnNvcF9oYW5kbGVyZXFfdAlocmVxOwogCV9fdTMyCQkJb2xlbjsKIAl2b2lkCQkJKmxpbms7CiAJaW50CQkJZXJyb3I7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2hhbmRsZXJlcV90KSkpCi0JCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CiAKLQllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmhyZXEsICZpbm9kZSk7CisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsIGhyZXEsICZpbm9kZSk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gLWVycm9yOwogCkBAIC0zOTAsNyArMzgxLDcgQEAKIAkJZ290byBvdXRfaXB1dDsKIAl9CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJm9sZW4sIGhyZXEub2hhbmRsZW4sIHNpemVvZihfX3UzMikpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZvbGVuLCBocmVxLT5vaGFuZGxlbiwgc2l6ZW9mKF9fdTMyKSkpIHsKIAkJZXJyb3IgPSAtWEZTX0VSUk9SKEVGQVVMVCk7CiAJCWdvdG8gb3V0X2lwdXQ7CiAJfQpAQCAtNDAyLDcgKzM5Myw3IEBACiAJZXJyb3IgPSAteGZzX3JlYWRsaW5rKFhGU19JKGlub2RlKSwgbGluayk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9rZnJlZTsKLQllcnJvciA9IGRvX3JlYWRsaW5rKGhyZXEub2hhbmRsZSwgb2xlbiwgbGluayk7CisJZXJyb3IgPSBkb19yZWFkbGluayhocmVxLT5vaGFuZGxlLCBvbGVuLCBsaW5rKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2tmcmVlOwogCkBAIC01MDEsNyArNDkyLDcgQEAKIAlyZXR1cm4gLWVycm9yOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19hdHRybXVsdGlfYXR0cl9nZXQoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJY2hhcgkJCSpuYW1lLApAQCAtNTMwLDcgKzUyMSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19hdHRybXVsdGlfYXR0cl9zZXQoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJY2hhcgkJCSpuYW1lLApAQCAtNTYwLDcgKzU1MSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19hdHRybXVsdGlfYXR0cl9yZW1vdmUoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJY2hhcgkJCSpuYW1lLApAQCAtNjYyLDE5ICs2NTMsMjYgQEAKIAlyZXR1cm4gLWVycm9yOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19pb2Nfc3BhY2UoCiAJc3RydWN0IHhmc19pbm9kZQkqaXAsCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJc3RydWN0IGZpbGUJCSpmaWxwLAogCWludAkJCWlvZmxhZ3MsCiAJdW5zaWduZWQgaW50CQljbWQsCi0Jdm9pZAkJCV9fdXNlciAqYXJnKQorCXhmc19mbG9jazY0X3QJCSpiZikKIHsKLQl4ZnNfZmxvY2s2NF90CQliZjsKIAlpbnQJCQlhdHRyX2ZsYWdzID0gMDsKIAlpbnQJCQllcnJvcjsKIAorCS8qCisJICogT25seSBhbGxvdyB0aGUgc3lzIGFkbWluIHRvIHJlc2VydmUgc3BhY2UgdW5sZXNzCisJICogdW53cml0dGVuIGV4dGVudHMgYXJlIGVuYWJsZWQuCisJICovCisJaWYgKCF4ZnNfc2JfdmVyc2lvbl9oYXNleHRmbGdiaXQoJmlwLT5pX21vdW50LT5tX3NiKSAmJgorCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCiAJaWYgKGlub2RlLT5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOwogCkBAIC02ODQsMTYgKzY4MiwxMiBAQAogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmYmYsIGFyZywgc2l6ZW9mKGJmKSkpCi0JCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7Ci0KIAlpZiAoZmlscC0+Zl9mbGFncyAmIChPX05ERUxBWXxPX05PTkJMT0NLKSkKIAkJYXR0cl9mbGFncyB8PSBYRlNfQVRUUl9OT05CTE9DSzsKIAlpZiAoaW9mbGFncyAmIElPX0lOVklTKQogCQlhdHRyX2ZsYWdzIHw9IFhGU19BVFRSX0RNSTsKIAotCWVycm9yID0geGZzX2NoYW5nZV9maWxlX3NwYWNlKGlwLCBjbWQsICZiZiwgZmlscC0+Zl9wb3MsCi0JCQkJCSAgICAgIE5VTEwsIGF0dHJfZmxhZ3MpOworCWVycm9yID0geGZzX2NoYW5nZV9maWxlX3NwYWNlKGlwLCBjbWQsIGJmLCBmaWxwLT5mX3BvcywgYXR0cl9mbGFncyk7CiAJcmV0dXJuIC1lcnJvcjsKIH0KIApAQCAtMTEwNSwxMCArMTA5OSw2IEBACiAKIAkvKgogCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCi0JICogSWYgdGhlIHN5c3RlbSB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSAicmVzdHJpY3RlZF9jaG93biIKLQkgKiBvcHRpb24sIHRoZSBvd25lciBpcyBub3QgcGVybWl0dGVkIHRvIGdpdmUgYXdheSB0aGUgZmlsZSwKLQkgKiBhbmQgY2FuIGNoYW5nZSB0aGUgZ3JvdXAgaWQgb25seSB0byBhIGdyb3VwIG9mIHdoaWNoIGhlCi0JICogb3Igc2hlIGlzIGEgbWVtYmVyLgogCSAqLwogCWlmIChtYXNrICYgRlNYX1BST0pJRCkgewogCQkvKgpAQCAtMTEzNyw3ICsxMTI3LDcgQEAKIAkJCSAqIHRoZSBzdXBlcmJsb2NrIHZlcnNpb24gbnVtYmVyIHNpbmNlIHByb2ppZHMgZGlkbid0CiAJCQkgKiBleGlzdCBiZWZvcmUgRElOT0RFX1ZFUlNJT05fMiBhbmQgU0JfVkVSU0lPTl9OTElOSy4KIAkJCSAqLwotCQkJaWYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkKKwkJCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gMSkKIAkJCQl4ZnNfYnVtcF9pbm9fdmVyczIodHAsIGlwKTsKIAkJfQogCkBAIC0xMjU2LDQzICsxMjQ2LDY3IEBACiB9CiAKIFNUQVRJQyBpbnQKK3hmc19nZXRibWFwX2Zvcm1hdCh2b2lkICoqYXAsIHN0cnVjdCBnZXRibWFweCAqYm12LCBpbnQgKmZ1bGwpCit7CisJc3RydWN0IGdldGJtYXAgX191c2VyCSpiYXNlID0gKmFwOworCisJLyogY29weSBvbmx5IGdldGJtYXAgcG9ydGlvbiAobm90IGdldGJtYXB4KSAqLworCWlmIChjb3B5X3RvX3VzZXIoYmFzZSwgYm12LCBzaXplb2Yoc3RydWN0IGdldGJtYXApKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFRkFVTFQpOworCisJKmFwICs9IHNpemVvZihzdHJ1Y3QgZ2V0Ym1hcCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKIHhmc19pb2NfZ2V0Ym1hcCgKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAlpbnQJCQlpb2ZsYWdzLAogCXVuc2lnbmVkIGludAkJY21kLAogCXZvaWQJCQlfX3VzZXIgKmFyZykKIHsKLQlzdHJ1Y3QgZ2V0Ym1hcAkJYm07Ci0JaW50CQkJaWZsYWdzOworCXN0cnVjdCBnZXRibWFweAkJYm14OwogCWludAkJCWVycm9yOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZibSwgYXJnLCBzaXplb2YoYm0pKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJteCwgYXJnLCBzaXplb2Yoc3RydWN0IGdldGJtYXB4KSkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CiAKLQlpZiAoYm0uYm12X2NvdW50IDwgMikKKwlpZiAoYm14LmJtdl9jb3VudCA8IDIpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CiAKLQlpZmxhZ3MgPSAoY21kID09IFhGU19JT0NfR0VUQk1BUEEgPyBCTVZfSUZfQVRUUkZPUksgOiAwKTsKKwlibXguYm12X2lmbGFncyA9IChjbWQgPT0gWEZTX0lPQ19HRVRCTUFQQSA/IEJNVl9JRl9BVFRSRk9SSyA6IDApOwogCWlmIChpb2ZsYWdzICYgSU9fSU5WSVMpCi0JCWlmbGFncyB8PSBCTVZfSUZfTk9fRE1BUElfUkVBRDsKKwkJYm14LmJtdl9pZmxhZ3MgfD0gQk1WX0lGX05PX0RNQVBJX1JFQUQ7CiAKLQllcnJvciA9IHhmc19nZXRibWFwKGlwLCAmYm0sIChzdHJ1Y3QgZ2V0Ym1hcCBfX3VzZXIgKilhcmcrMSwgaWZsYWdzKTsKKwllcnJvciA9IHhmc19nZXRibWFwKGlwLCAmYm14LCB4ZnNfZ2V0Ym1hcF9mb3JtYXQsCisJCQkgICAgKHN0cnVjdCBnZXRibWFwICopYXJnKzEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIC1lcnJvcjsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYm0sIHNpemVvZihibSkpKQorCS8qIGNvcHkgYmFjayBoZWFkZXIgLSBvbmx5IHNpemUgb2YgZ2V0Ym1hcCAqLworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYm14LCBzaXplb2Yoc3RydWN0IGdldGJtYXApKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIAlyZXR1cm4gMDsKIH0KIAogU1RBVElDIGludAoreGZzX2dldGJtYXB4X2Zvcm1hdCh2b2lkICoqYXAsIHN0cnVjdCBnZXRibWFweCAqYm12LCBpbnQgKmZ1bGwpCit7CisJc3RydWN0IGdldGJtYXB4IF9fdXNlcgkqYmFzZSA9ICphcDsKKworCWlmIChjb3B5X3RvX3VzZXIoYmFzZSwgYm12LCBzaXplb2Yoc3RydWN0IGdldGJtYXB4KSkpCisJCXJldHVybiBYRlNfRVJST1IoRUZBVUxUKTsKKworCSphcCArPSBzaXplb2Yoc3RydWN0IGdldGJtYXB4KTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAogeGZzX2lvY19nZXRibWFweCgKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAl2b2lkCQkJX191c2VyICphcmcpCiB7CiAJc3RydWN0IGdldGJtYXB4CQlibXg7Ci0Jc3RydWN0IGdldGJtYXAJCWJtOwotCWludAkJCWlmbGFnczsKIAlpbnQJCQllcnJvcjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYm14LCBhcmcsIHNpemVvZihibXgpKSkKQEAgLTEzMDEsNDYgKzEzMTUsNDYgQEAKIAlpZiAoYm14LmJtdl9jb3VudCA8IDIpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CiAKLQkvKgotCSAqIE1hcCBpbnB1dCBnZXRibWFweCBzdHJ1Y3R1cmUgdG8gYSBnZXRibWFwCi0JICogc3RydWN0dXJlIGZvciB4ZnNfZ2V0Ym1hcC4KLQkgKi8KLQlHRVRCTUFQX0NPTlZFUlQoYm14LCBibSk7Ci0KLQlpZmxhZ3MgPSBibXguYm12X2lmbGFnczsKLQotCWlmIChpZmxhZ3MgJiAofkJNVl9JRl9WQUxJRCkpCisJaWYgKGJteC5ibXZfaWZsYWdzICYgKH5CTVZfSUZfVkFMSUQpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOwogCi0JaWZsYWdzIHw9IEJNVl9JRl9FWFRFTkRFRDsKLQotCWVycm9yID0geGZzX2dldGJtYXAoaXAsICZibSwgKHN0cnVjdCBnZXRibWFweCBfX3VzZXIgKilhcmcrMSwgaWZsYWdzKTsKKwllcnJvciA9IHhmc19nZXRibWFwKGlwLCAmYm14LCB4ZnNfZ2V0Ym1hcHhfZm9ybWF0LAorCQkJICAgIChzdHJ1Y3QgZ2V0Ym1hcHggKilhcmcrMSk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gLWVycm9yOwogCi0JR0VUQk1BUF9DT05WRVJUKGJtLCBibXgpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZibXgsIHNpemVvZihibXgpKSkKKwkvKiBjb3B5IGJhY2sgaGVhZGVyICovCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZibXgsIHNpemVvZihzdHJ1Y3QgZ2V0Ym1hcHgpKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQKLXhmc19pb2N0bCgKLQl4ZnNfaW5vZGVfdAkJKmlwLAorLyoKKyAqIE5vdGU6IHNvbWUgb2YgdGhlIGlvY3RsJ3MgcmV0dXJuIHBvc2l0aXZlIG51bWJlcnMgYXMgYQorICogYnl0ZSBjb3VudCBpbmRpY2F0aW5nIHN1Y2Nlc3MsIHN1Y2ggYXMgcmVhZGxpbmtfYnlfaGFuZGxlLgorICogU28gd2UgZG9uJ3QgInNpZ24gZmxpcCIgbGlrZSBtb3N0IG90aGVyIHJvdXRpbmVzLiAgVGhpcyBtZWFucworICogdHJ1ZSBlcnJvcnMgbmVlZCB0byBiZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgorICovCitsb25nCit4ZnNfZmlsZV9pb2N0bCgKIAlzdHJ1Y3QgZmlsZQkJKmZpbHAsCi0JaW50CQkJaW9mbGFncywKIAl1bnNpZ25lZCBpbnQJCWNtZCwKLQl2b2lkCQkJX191c2VyICphcmcpCisJdW5zaWduZWQgbG9uZwkJcCkKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJdm9pZAkJCV9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopcDsKKwlpbnQJCQlpb2ZsYWdzID0gMDsKIAlpbnQJCQllcnJvcjsKIAotCXhmc19pdHJhY2VfZW50cnkoWEZTX0koaW5vZGUpKTsKLQlzd2l0Y2ggKGNtZCkgeworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKKwkJaW9mbGFncyB8PSBJT19JTlZJUzsKIAorCXhmc19pdHJhY2VfZW50cnkoaXApOworCisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFhGU19JT0NfQUxMT0NTUDoKIAljYXNlIFhGU19JT0NfRlJFRVNQOgogCWNhc2UgWEZTX0lPQ19SRVNWU1A6CkBAIC0xMzQ4LDE3ICsxMzYyLDEzIEBACiAJY2FzZSBYRlNfSU9DX0FMTE9DU1A2NDoKIAljYXNlIFhGU19JT0NfRlJFRVNQNjQ6CiAJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0OgotCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0OgotCQkvKgotCQkgKiBPbmx5IGFsbG93IHRoZSBzeXMgYWRtaW4gdG8gcmVzZXJ2ZSBzcGFjZSB1bmxlc3MKLQkJICogdW53cml0dGVuIGV4dGVudHMgYXJlIGVuYWJsZWQuCi0JCSAqLwotCQlpZiAoIXhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCgmbXAtPm1fc2IpICYmCi0JCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07CisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQNjQ6IHsKKwkJeGZzX2Zsb2NrNjRfdAkJYmY7CiAKLQkJcmV0dXJuIHhmc19pb2Nfc3BhY2UoaXAsIGlub2RlLCBmaWxwLCBpb2ZsYWdzLCBjbWQsIGFyZyk7Ci0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiZiwgYXJnLCBzaXplb2YoYmYpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCXJldHVybiB4ZnNfaW9jX3NwYWNlKGlwLCBpbm9kZSwgZmlscCwgaW9mbGFncywgY21kLCAmYmYpOworCX0KIAljYXNlIFhGU19JT0NfRElPSU5GTzogewogCQlzdHJ1Y3QgZGlvYXR0cglkYTsKIAkJeGZzX2J1ZnRhcmdfdAkqdGFyZ2V0ID0KQEAgLTE0MTgsMTggKzE0MjgsMzAgQEAKIAogCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEU6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOgotCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFOgotCQlyZXR1cm4geGZzX2ZpbmRfaGFuZGxlKGNtZCwgYXJnKTsKKwljYXNlIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRTogeworCQl4ZnNfZnNvcF9oYW5kbGVyZXFfdAlocmVxOwogCi0JY2FzZSBYRlNfSU9DX09QRU5fQllfSEFORExFOgotCQlyZXR1cm4geGZzX29wZW5fYnlfaGFuZGxlKG1wLCBhcmcsIGZpbHAsIGlub2RlKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZocmVxLCBhcmcsIHNpemVvZihocmVxKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4geGZzX2ZpbmRfaGFuZGxlKGNtZCwgJmhyZXEpOworCX0KKwljYXNlIFhGU19JT0NfT1BFTl9CWV9IQU5ETEU6IHsKKwkJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJaHJlcTsKIAorCQlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2hhbmRsZXJlcV90KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4geGZzX29wZW5fYnlfaGFuZGxlKG1wLCAmaHJlcSwgZmlscCwgaW5vZGUpOworCX0KIAljYXNlIFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEU6CiAJCXJldHVybiB4ZnNfZnNzZXRkbV9ieV9oYW5kbGUobXAsIGFyZywgaW5vZGUpOwogCi0JY2FzZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRToKLQkJcmV0dXJuIHhmc19yZWFkbGlua19ieV9oYW5kbGUobXAsIGFyZywgaW5vZGUpOworCWNhc2UgWEZTX0lPQ19SRUFETElOS19CWV9IQU5ETEU6IHsKKwkJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJaHJlcTsKIAorCQlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2hhbmRsZXJlcV90KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4geGZzX3JlYWRsaW5rX2J5X2hhbmRsZShtcCwgJmhyZXEsIGlub2RlKTsKKwl9CiAJY2FzZSBYRlNfSU9DX0FUVFJMSVNUX0JZX0hBTkRMRToKIAkJcmV0dXJuIHhmc19hdHRybGlzdF9ieV9oYW5kbGUobXAsIGFyZywgaW5vZGUpOwogCkBAIC0xNDM3LDcgKzE0NTksMTEgQEAKIAkJcmV0dXJuIHhmc19hdHRybXVsdGlfYnlfaGFuZGxlKG1wLCBhcmcsIGZpbHAsIGlub2RlKTsKIAogCWNhc2UgWEZTX0lPQ19TV0FQRVhUOiB7Ci0JCWVycm9yID0geGZzX3N3YXBleHQoKHN0cnVjdCB4ZnNfc3dhcGV4dCBfX3VzZXIgKilhcmcpOworCQlzdHJ1Y3QgeGZzX3N3YXBleHQJc3hwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3hwLCBhcmcsIHNpemVvZih4ZnNfc3dhcGV4dF90KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQllcnJvciA9IHhmc19zd2FwZXh0KCZzeHApOwogCQlyZXR1cm4gLWVycm9yOwogCX0KIApAQCAtMTQ5Myw5ICsxNTE5LDYgQEAKIAljYXNlIFhGU19JT0NfRlNHUk9XRlNEQVRBOiB7CiAJCXhmc19ncm93ZnNfZGF0YV90IGluOwogCi0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0KIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbiwgYXJnLCBzaXplb2YoaW4pKSkKIAkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CiAKQEAgLTE1MDYsOSArMTUyOSw2IEBACiAJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTTE9HOiB7CiAJCXhmc19ncm93ZnNfbG9nX3QgaW47CiAKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQogCQlpZiAoY29weV9mcm9tX3VzZXIoJmluLCBhcmcsIHNpemVvZihpbikpKQogCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIApAQCAtMTUxOSw5ICsxNTM5LDYgQEAKIAljYXNlIFhGU19JT0NfRlNHUk9XRlNSVDogewogCQl4ZnNfZ3Jvd2ZzX3J0X3QgaW47CiAKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQogCQlpZiAoY29weV9mcm9tX3VzZXIoJmluLCBhcmcsIHNpemVvZihpbikpKQogCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxNmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaWZuZGVmIF9fWEZTX0lPQ1RMX0hfXworI2RlZmluZSBfX1hGU19JT0NUTF9IX18KKworZXh0ZXJuIGludAoreGZzX2lvY19zcGFjZSgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJaW50CQkJaW9mbGFncywKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl4ZnNfZmxvY2s2NF90CQkqYmYpOworCitleHRlcm4gaW50Cit4ZnNfZmluZF9oYW5kbGUoCisJdW5zaWduZWQgaW50CQljbWQsCisJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJKmhyZXEpOworCitleHRlcm4gaW50Cit4ZnNfb3Blbl9ieV9oYW5kbGUoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAkqaHJlcSwKKwlzdHJ1Y3QgZmlsZQkJKnBhcmZpbHAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpOworCitleHRlcm4gaW50Cit4ZnNfcmVhZGxpbmtfYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJKmhyZXEsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpOworCitleHRlcm4gaW50Cit4ZnNfYXR0cm11bHRpX2F0dHJfZ2V0KAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCWNoYXIJCQkqbmFtZSwKKwljaGFyCQkJX191c2VyICp1YnVmLAorCV9fdWludDMyX3QJCSpsZW4sCisJX191aW50MzJfdAkJZmxhZ3MpOworCitleHRlcm4gaW50CisJeGZzX2F0dHJtdWx0aV9hdHRyX3NldCgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwljaGFyCQkJKm5hbWUsCisJY29uc3QgY2hhcgkJX191c2VyICp1YnVmLAorCV9fdWludDMyX3QJCWxlbiwKKwlfX3VpbnQzMl90CQlmbGFncyk7CisKK2V4dGVybiBpbnQKK3hmc19hdHRybXVsdGlfYXR0cl9yZW1vdmUoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJY2hhcgkJCSpuYW1lLAorCV9fdWludDMyX3QJCWZsYWdzKTsKKworZXh0ZXJuIGxvbmcKK3hmc19maWxlX2lvY3RsKAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl1bnNpZ25lZCBsb25nCQlwKTsKKworZXh0ZXJuIGxvbmcKK3hmc19maWxlX2NvbXBhdF9pb2N0bCgKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUsCisJdW5zaWduZWQgaW50CQljbWQsCisJdW5zaWduZWQgbG9uZwkJYXJnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKaW5kZXggYTRiMjU0ZS4uMDUwNGNlYyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwpAQCAtMTYsMTEgKzE2LDcgQEAKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ4ZnMuaCIKICNpbmNsdWRlICJ4ZnNfZnMuaCIKQEAgLTM2LDcgKzMyLDYgQEAKICNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgogI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfdmZzLmgiCiAjaW5jbHVkZSAieGZzX3Zub2RlLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgpAQCAtNDQsMjIxICszOSwyMTkgQEAKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfZGZyYWcuaCIKICNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKKyNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2lvY3RsLmgiCiAjaW5jbHVkZSAieGZzX2lvY3RsMzIuaCIKIAogI2RlZmluZSAgX05BVElWRV9JT0MoY21kLCB0eXBlKSBcCiAJICBfSU9DKF9JT0NfRElSKGNtZCksIF9JT0NfVFlQRShjbWQpLCBfSU9DX05SKGNtZCksIHNpemVvZih0eXBlKSkKIAotI2lmIGRlZmluZWQoQ09ORklHX0lBNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLSNkZWZpbmUgQlJPS0VOX1g4Nl9BTElHTk1FTlQKLSNkZWZpbmUgX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotLyogb24gaWEzMiBsX3N0YXJ0IGlzIG9uIGEgMzItYml0IGJvdW5kYXJ5ICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMiB7Ci0JX19zMTYJCWxfdHlwZTsKLQlfX3MxNgkJbF93aGVuY2U7Ci0JX19zNjQJCWxfc3RhcnQJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0JCQkvKiBsZW4gPT0gMCBtZWFucyB1bnRpbCBlbmQgb2YgZmlsZSAqLwotCV9fczY0CQlsX2xlbiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQlfX3MzMgkJbF9zeXNpZDsKLQlfX3UzMgkJbF9waWQ7Ci0JX19zMzIJCWxfcGFkWzRdOwkvKiByZXNlcnZlIGFyZWEgKi8KLX0geGZzX2Zsb2NrNjRfMzJfdDsKLQotI2RlZmluZSBYRlNfSU9DX0FMTE9DU1BfMzIJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IHhmc19mbG9jazY0XzMyKQotI2RlZmluZSBYRlNfSU9DX0ZSRUVTUF8zMglfSU9XICgnWCcsIDExLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCi0jZGVmaW5lIFhGU19JT0NfQUxMT0NTUDY0XzMyCV9JT1cgKCdYJywgMzYsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKLSNkZWZpbmUgWEZTX0lPQ19GUkVFU1A2NF8zMglfSU9XICgnWCcsIDM3LCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCi0jZGVmaW5lIFhGU19JT0NfUkVTVlNQXzMyCV9JT1cgKCdYJywgNDAsIHN0cnVjdCB4ZnNfZmxvY2s2NF8zMikKLSNkZWZpbmUgWEZTX0lPQ19VTlJFU1ZTUF8zMglfSU9XICgnWCcsIDQxLCBzdHJ1Y3QgeGZzX2Zsb2NrNjRfMzIpCi0jZGVmaW5lIFhGU19JT0NfUkVTVlNQNjRfMzIJX0lPVyAoJ1gnLCA0Miwgc3RydWN0IHhmc19mbG9jazY0XzMyKQotI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQNjRfMzIJX0lPVyAoJ1gnLCA0Mywgc3RydWN0IHhmc19mbG9jazY0XzMyKQotCi0vKiBqdXN0IGFjY291bnQgZm9yIGRpZmZlcmVudCBhbGlnbm1lbnQgKi8KLVNUQVRJQyB1bnNpZ25lZCBsb25nCi14ZnNfaW9jdGwzMl9mbG9jaygKLQl1bnNpZ25lZCBsb25nCQlhcmcpCisjaWZkZWYgQlJPS0VOX1g4Nl9BTElHTk1FTlQKK1NUQVRJQyBpbnQKK3hmc19jb21wYXRfZmxvY2s2NF9jb3B5aW4oCisJeGZzX2Zsb2NrNjRfdAkJKmJmLAorCWNvbXBhdF94ZnNfZmxvY2s2NF90CV9fdXNlciAqYXJnMzIpCiB7Ci0JeGZzX2Zsb2NrNjRfMzJfdAlfX3VzZXIgKnAzMiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQl4ZnNfZmxvY2s2NF90CQlfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKLQotCWlmIChjb3B5X2luX3VzZXIoJnAtPmxfdHlwZSwJJnAzMi0+bF90eXBlLAlzaXplb2YoczE2KSkgfHwKLQkgICAgY29weV9pbl91c2VyKCZwLT5sX3doZW5jZSwJJnAzMi0+bF93aGVuY2UsIHNpemVvZihzMTYpKSB8fAotCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfc3RhcnQsCSZwMzItPmxfc3RhcnQsCXNpemVvZihzNjQpKSB8fAotCSAgICBjb3B5X2luX3VzZXIoJnAtPmxfbGVuLAkmcDMyLT5sX2xlbiwJc2l6ZW9mKHM2NCkpIHx8Ci0JICAgIGNvcHlfaW5fdXNlcigmcC0+bF9zeXNpZCwJJnAzMi0+bF9zeXNpZCwJc2l6ZW9mKHMzMikpIHx8Ci0JICAgIGNvcHlfaW5fdXNlcigmcC0+bF9waWQsCSZwMzItPmxfcGlkLAlzaXplb2YodTMyKSkgfHwKLQkgICAgY29weV9pbl91c2VyKCZwLT5sX3BhZCwJJnAzMi0+bF9wYWQsCTQqc2l6ZW9mKHUzMikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAodW5zaWduZWQgbG9uZylwOworCWlmIChnZXRfdXNlcihiZi0+bF90eXBlLAkmYXJnMzItPmxfdHlwZSkgfHwKKwkgICAgZ2V0X3VzZXIoYmYtPmxfd2hlbmNlLAkmYXJnMzItPmxfd2hlbmNlKSB8fAorCSAgICBnZXRfdXNlcihiZi0+bF9zdGFydCwJJmFyZzMyLT5sX3N0YXJ0KSB8fAorCSAgICBnZXRfdXNlcihiZi0+bF9sZW4sCQkmYXJnMzItPmxfbGVuKSB8fAorCSAgICBnZXRfdXNlcihiZi0+bF9zeXNpZCwJJmFyZzMyLT5sX3N5c2lkKSB8fAorCSAgICBnZXRfdXNlcihiZi0+bF9waWQsCQkmYXJnMzItPmxfcGlkKSB8fAorCSAgICBjb3B5X2Zyb21fdXNlcihiZi0+bF9wYWQsCSZhcmczMi0+bF9wYWQsCTQqc2l6ZW9mKHUzMikpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCXJldHVybiAwOwogfQogCi10eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfZ2VvbV92MSB7Ci0JX191MzIJCWJsb2Nrc2l6ZTsJLyogZmlsZXN5c3RlbSAoZGF0YSkgYmxvY2sgc2l6ZSAqLwotCV9fdTMyCQlydGV4dHNpemU7CS8qIHJlYWx0aW1lIGV4dGVudCBzaXplCQkqLwotCV9fdTMyCQlhZ2Jsb2NrczsJLyogZnNibG9ja3MgaW4gYW4gQUcJCSovCi0JX191MzIJCWFnY291bnQ7CS8qIG51bWJlciBvZiBhbGxvY2F0aW9uIGdyb3VwcwkqLwotCV9fdTMyCQlsb2dibG9ja3M7CS8qIGZzYmxvY2tzIGluIHRoZSBsb2cJCSovCi0JX191MzIJCXNlY3RzaXplOwkvKiAoZGF0YSkgc2VjdG9yIHNpemUsIGJ5dGVzCSovCi0JX191MzIJCWlub2Rlc2l6ZTsJLyogaW5vZGUgc2l6ZSBpbiBieXRlcwkJKi8KLQlfX3UzMgkJaW1heHBjdDsJLyogbWF4IGFsbG93ZWQgaW5vZGUgc3BhY2UoJSkJKi8KLQlfX3U2NAkJZGF0YWJsb2NrczsJLyogZnNibG9ja3MgaW4gZGF0YSBzdWJ2b2x1bWUJKi8KLQlfX3U2NAkJcnRibG9ja3M7CS8qIGZzYmxvY2tzIGluIHJlYWx0aW1lIHN1YnZvbAkqLwotCV9fdTY0CQlydGV4dGVudHM7CS8qIHJ0IGV4dGVudHMgaW4gcmVhbHRpbWUgc3Vidm9sKi8KLQlfX3U2NAkJbG9nc3RhcnQ7CS8qIHN0YXJ0aW5nIGZzYmxvY2sgb2YgdGhlIGxvZwkqLwotCXVuc2lnbmVkIGNoYXIJdXVpZFsxNl07CS8qIHVuaXF1ZSBpZCBvZiB0aGUgZmlsZXN5c3RlbQkqLwotCV9fdTMyCQlzdW5pdDsJCS8qIHN0cmlwZSB1bml0LCBmc2Jsb2NrcwkqLwotCV9fdTMyCQlzd2lkdGg7CQkvKiBzdHJpcGUgd2lkdGgsIGZzYmxvY2tzCSovCi0JX19zMzIJCXZlcnNpb247CS8qIHN0cnVjdHVyZSB2ZXJzaW9uCQkqLwotCV9fdTMyCQlmbGFnczsJCS8qIHN1cGVyYmxvY2sgdmVyc2lvbiBmbGFncwkqLwotCV9fdTMyCQlsb2dzZWN0c2l6ZTsJLyogbG9nIHNlY3RvciBzaXplLCBieXRlcwkqLwotCV9fdTMyCQlydHNlY3RzaXplOwkvKiByZWFsdGltZSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KLQlfX3UzMgkJZGlyYmxvY2tzaXplOwkvKiBkaXJlY3RvcnkgYmxvY2sgc2l6ZSwgYnl0ZXMJKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY29tcGF0X3hmc19mc29wX2dlb21fdjFfdDsKLQotI2RlZmluZSBYRlNfSU9DX0ZTR0VPTUVUUllfVjFfMzIgIFwKLQlfSU9SICgnWCcsIDEwMCwgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9nZW9tX3YxKQotCi1TVEFUSUMgdW5zaWduZWQgbG9uZyB4ZnNfaW9jdGwzMl9nZW9tX3YxKHVuc2lnbmVkIGxvbmcgYXJnKQorU1RBVElDIGludAoreGZzX2NvbXBhdF9pb2NfZnNnZW9tZXRyeV92MSgKKwlzdHJ1Y3QgeGZzX21vdW50CSAgKm1wLAorCWNvbXBhdF94ZnNfZnNvcF9nZW9tX3YxX3QgX191c2VyICphcmczMikKIHsKLQljb21wYXRfeGZzX2Zzb3BfZ2VvbV92MV90IF9fdXNlciAqcDMyID0gKHZvaWQgX191c2VyICopYXJnOwotCXhmc19mc29wX2dlb21fdjFfdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKwl4ZnNfZnNvcF9nZW9tX3QJCSAgZnNnZW87CisJaW50CQkJICBlcnJvcjsKIAotCWlmIChjb3B5X2luX3VzZXIocCwgcDMyLCBzaXplb2YoKnAzMikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcDsKKwllcnJvciA9IHhmc19mc19nZW9tZXRyeShtcCwgJmZzZ2VvLCAzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisJLyogVGhlIDMyLWJpdCB2YXJpYW50IHNpbXBseSBoYXMgc29tZSBwYWRkaW5nIGF0IHRoZSBlbmQgKi8KKwlpZiAoY29weV90b191c2VyKGFyZzMyLCAmZnNnZW8sIHNpemVvZihzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2dlb21fdjEpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwlyZXR1cm4gMDsKIH0KIAotdHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19pbm9ncnAgewotCV9fdTY0CQl4aV9zdGFydGlubzsJLyogc3RhcnRpbmcgaW5vZGUgbnVtYmVyCSovCi0JX19zMzIJCXhpX2FsbG9jY291bnQ7CS8qICMgYml0cyBzZXQgaW4gYWxsb2NtYXNrCSovCi0JX191NjQJCXhpX2FsbG9jbWFzazsJLyogbWFzayBvZiBhbGxvY2F0ZWQgaW5vZGVzCSovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNvbXBhdF94ZnNfaW5vZ3JwX3Q7Ci0KLVNUQVRJQyBpbnQgeGZzX2ludW1iZXJzX2ZtdF9jb21wYXQoCi0Jdm9pZCBfX3VzZXIgKnVidWZmZXIsCi0JY29uc3QgeGZzX2lub2dycF90ICpidWZmZXIsCi0JbG9uZyBjb3VudCwKLQlsb25nICp3cml0dGVuKQorU1RBVElDIGludAoreGZzX2NvbXBhdF9ncm93ZnNfZGF0YV9jb3B5aW4oCisJc3RydWN0IHhmc19ncm93ZnNfZGF0YQkgKmluLAorCWNvbXBhdF94ZnNfZ3Jvd2ZzX2RhdGFfdCBfX3VzZXIgKmFyZzMyKQogewotCWNvbXBhdF94ZnNfaW5vZ3JwX3QgX191c2VyICpwMzIgPSB1YnVmZmVyOwotCWxvbmcgaTsKKwlpZiAoZ2V0X3VzZXIoaW4tPm5ld2Jsb2NrcywgJmFyZzMyLT5uZXdibG9ja3MpIHx8CisJICAgIGdldF91c2VyKGluLT5pbWF4cGN0LCAgICZhcmczMi0+aW1heHBjdCkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19jb21wYXRfZ3Jvd2ZzX3J0X2NvcHlpbigKKwlzdHJ1Y3QgeGZzX2dyb3dmc19ydAkgKmluLAorCWNvbXBhdF94ZnNfZ3Jvd2ZzX3J0X3QJX191c2VyICphcmczMikKK3sKKwlpZiAoZ2V0X3VzZXIoaW4tPm5ld2Jsb2NrcywgJmFyZzMyLT5uZXdibG9ja3MpIHx8CisJICAgIGdldF91c2VyKGluLT5leHRzaXplLCAgICZhcmczMi0+ZXh0c2l6ZSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pbnVtYmVyc19mbXRfY29tcGF0KAorCXZvaWQJCQlfX3VzZXIgKnVidWZmZXIsCisJY29uc3QgeGZzX2lub2dycF90CSpidWZmZXIsCisJbG9uZwkJCWNvdW50LAorCWxvbmcJCQkqd3JpdHRlbikKK3sKKwljb21wYXRfeGZzX2lub2dycF90CV9fdXNlciAqcDMyID0gdWJ1ZmZlcjsKKwlsb25nCQkJaTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCWlmIChwdXRfdXNlcihidWZmZXJbaV0ueGlfc3RhcnRpbm8sICAgJnAzMltpXS54aV9zdGFydGlubykgfHwKIAkJICAgIHB1dF91c2VyKGJ1ZmZlcltpXS54aV9hbGxvY2NvdW50LCAmcDMyW2ldLnhpX2FsbG9jY291bnQpIHx8CiAJCSAgICBwdXRfdXNlcihidWZmZXJbaV0ueGlfYWxsb2NtYXNrLCAgJnAzMltpXS54aV9hbGxvY21hc2spKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCX0KIAkqd3JpdHRlbiA9IGNvdW50ICogc2l6ZW9mKCpwMzIpOwogCXJldHVybiAwOwogfQogCiAjZWxzZQotCiAjZGVmaW5lIHhmc19pbnVtYmVyc19mbXRfY29tcGF0IHhmc19pbnVtYmVyc19mbXQKLSNkZWZpbmUgX1BBQ0tFRAorI2VuZGlmCS8qIEJST0tFTl9YODZfQUxJR05NRU5UICovCiAKLSNlbmRpZgorU1RBVElDIGludAoreGZzX2lvY3RsMzJfYnN0aW1lX2NvcHlpbigKKwl4ZnNfYnN0aW1lX3QJCSpic3RpbWUsCisJY29tcGF0X3hmc19ic3RpbWVfdAlfX3VzZXIgKmJzdGltZTMyKQoreworCWNvbXBhdF90aW1lX3QJCXNlYzMyOwkvKiB0dl9zZWMgZGlmZmVycyBvbiA2NCB2cy4gMzIgKi8KKworCWlmIChnZXRfdXNlcihzZWMzMiwJCSZic3RpbWUzMi0+dHZfc2VjKQl8fAorCSAgICBnZXRfdXNlcihic3RpbWUtPnR2X25zZWMsCSZic3RpbWUzMi0+dHZfbnNlYykpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJYnN0aW1lLT50dl9zZWMgPSBzZWMzMjsKKwlyZXR1cm4gMDsKK30KKworLyogeGZzX2JzdGF0X3QgaGFzIGRpZmZlcmluZyBhbGlnbm1lbnQgb24gaW50ZWwsICYgYnN0aW1lX3Qgc2l6ZXMgZXZlcnl3aGVyZSAqLworU1RBVElDIGludAoreGZzX2lvY3RsMzJfYnN0YXRfY29weWluKAorCXhmc19ic3RhdF90CQkqYnN0YXQsCisJY29tcGF0X3hmc19ic3RhdF90CV9fdXNlciAqYnN0YXQzMikKK3sKKwlpZiAoZ2V0X3VzZXIoYnN0YXQtPmJzX2lubywJJmJzdGF0MzItPmJzX2lubykJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX21vZGUsCSZic3RhdDMyLT5ic19tb2RlKQl8fAorCSAgICBnZXRfdXNlcihic3RhdC0+YnNfbmxpbmssCSZic3RhdDMyLT5ic19ubGluaykJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX3VpZCwJJmJzdGF0MzItPmJzX3VpZCkJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX2dpZCwJJmJzdGF0MzItPmJzX2dpZCkJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX3JkZXYsCSZic3RhdDMyLT5ic19yZGV2KQl8fAorCSAgICBnZXRfdXNlcihic3RhdC0+YnNfYmxrc2l6ZSwJJmJzdGF0MzItPmJzX2Jsa3NpemUpCXx8CisJICAgIGdldF91c2VyKGJzdGF0LT5ic19zaXplLAkmYnN0YXQzMi0+YnNfc2l6ZSkJfHwKKwkgICAgeGZzX2lvY3RsMzJfYnN0aW1lX2NvcHlpbigmYnN0YXQtPmJzX2F0aW1lLCAmYnN0YXQzMi0+YnNfYXRpbWUpIHx8CisJICAgIHhmc19pb2N0bDMyX2JzdGltZV9jb3B5aW4oJmJzdGF0LT5ic19tdGltZSwgJmJzdGF0MzItPmJzX210aW1lKSB8fAorCSAgICB4ZnNfaW9jdGwzMl9ic3RpbWVfY29weWluKCZic3RhdC0+YnNfY3RpbWUsICZic3RhdDMyLT5ic19jdGltZSkgfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX2Jsb2NrcywJJmJzdGF0MzItPmJzX3NpemUpCXx8CisJICAgIGdldF91c2VyKGJzdGF0LT5ic194ZmxhZ3MsCSZic3RhdDMyLT5ic19zaXplKQl8fAorCSAgICBnZXRfdXNlcihic3RhdC0+YnNfZXh0c2l6ZSwJJmJzdGF0MzItPmJzX2V4dHNpemUpCXx8CisJICAgIGdldF91c2VyKGJzdGF0LT5ic19leHRlbnRzLAkmYnN0YXQzMi0+YnNfZXh0ZW50cykJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX2dlbiwJJmJzdGF0MzItPmJzX2dlbikJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX3Byb2ppZCwJJmJzdGF0MzItPmJzX3Byb2ppZCkJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX2RtZXZtYXNrLCAmYnN0YXQzMi0+YnNfZG1ldm1hc2spCXx8CisJICAgIGdldF91c2VyKGJzdGF0LT5ic19kbXN0YXRlLAkmYnN0YXQzMi0+YnNfZG1zdGF0ZSkJfHwKKwkgICAgZ2V0X3VzZXIoYnN0YXQtPmJzX2FleHRlbnRzLCAmYnN0YXQzMi0+YnNfYWV4dGVudHMpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCXJldHVybiAwOworfQogCiAvKiBYRlNfSU9DX0ZTQlVMS1NUQVQgYW5kIGZyaWVuZHMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19ic3RpbWUgewotCV9fczMyCQl0dl9zZWM7CQkvKiBzZWNvbmRzCQkqLwotCV9fczMyCQl0dl9uc2VjOwkvKiBhbmQgbmFub3NlY29uZHMJKi8KLX0gY29tcGF0X3hmc19ic3RpbWVfdDsKLQotU1RBVElDIGludCB4ZnNfYnN0aW1lX3N0b3JlX2NvbXBhdCgKLQljb21wYXRfeGZzX2JzdGltZV90IF9fdXNlciAqcDMyLAotCWNvbnN0IHhmc19ic3RpbWVfdCAqcCkKK1NUQVRJQyBpbnQKK3hmc19ic3RpbWVfc3RvcmVfY29tcGF0KAorCWNvbXBhdF94ZnNfYnN0aW1lX3QJX191c2VyICpwMzIsCisJY29uc3QgeGZzX2JzdGltZV90CSpwKQogewotCV9fczMyIHNlYzMyOworCV9fczMyCQkJc2VjMzI7CiAKIAlzZWMzMiA9IHAtPnR2X3NlYzsKIAlpZiAocHV0X3VzZXIoc2VjMzIsICZwMzItPnR2X3NlYykgfHwKIAkgICAgcHV0X3VzZXIocC0+dHZfbnNlYywgJnAzMi0+dHZfbnNlYykpCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCXJldHVybiAwOwogfQogCi10eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2JzdGF0IHsKLQlfX3U2NAkJYnNfaW5vOwkJLyogaW5vZGUgbnVtYmVyCQkJKi8KLQlfX3UxNgkJYnNfbW9kZTsJLyogdHlwZSBhbmQgbW9kZQkJKi8KLQlfX3UxNgkJYnNfbmxpbms7CS8qIG51bWJlciBvZiBsaW5rcwkJKi8KLQlfX3UzMgkJYnNfdWlkOwkJLyogdXNlciBpZAkJCSovCi0JX191MzIJCWJzX2dpZDsJCS8qIGdyb3VwIGlkCQkJKi8KLQlfX3UzMgkJYnNfcmRldjsJLyogZGV2aWNlIHZhbHVlCQkJKi8KLQlfX3MzMgkJYnNfYmxrc2l6ZTsJLyogYmxvY2sgc2l6ZQkJCSovCi0JX19zNjQJCWJzX3NpemU7CS8qIGZpbGUgc2l6ZQkJCSovCi0JY29tcGF0X3hmc19ic3RpbWVfdCBic19hdGltZTsJLyogYWNjZXNzIHRpbWUJCQkqLwotCWNvbXBhdF94ZnNfYnN0aW1lX3QgYnNfbXRpbWU7CS8qIG1vZGlmeSB0aW1lCQkJKi8KLQljb21wYXRfeGZzX2JzdGltZV90IGJzX2N0aW1lOwkvKiBpbm9kZSBjaGFuZ2UgdGltZQkJKi8KLQlpbnQ2NF90CQlic19ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MJCSovCi0JX191MzIJCWJzX3hmbGFnczsJLyogZXh0ZW5kZWQgZmxhZ3MJCSovCi0JX19zMzIJCWJzX2V4dHNpemU7CS8qIGV4dGVudCBzaXplCQkJKi8KLQlfX3MzMgkJYnNfZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMJCSovCi0JX191MzIJCWJzX2dlbjsJCS8qIGdlbmVyYXRpb24gY291bnQJCSovCi0JX191MTYJCWJzX3Byb2ppZDsJLyogcHJvamVjdCBpZAkJCSovCi0JdW5zaWduZWQgY2hhcglic19wYWRbMTRdOwkvKiBwYWQgc3BhY2UsIHVudXNlZAkJKi8KLQlfX3UzMgkJYnNfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzawkJKi8KLQlfX3UxNgkJYnNfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvCQkqLwotCV9fdTE2CQlic19hZXh0ZW50czsJLyogYXR0cmlidXRlIG51bWJlciBvZiBleHRlbnRzCSovCi19IF9QQUNLRUQgY29tcGF0X3hmc19ic3RhdF90OwotCi1TVEFUSUMgaW50IHhmc19idWxrc3RhdF9vbmVfZm10X2NvbXBhdCgKKy8qIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgcG9zaXRpdmUgZXJyb3IgKHRvIHhmc19idWxrc3RhdCgpKSAqLworU1RBVElDIGludAoreGZzX2J1bGtzdGF0X29uZV9mbXRfY29tcGF0KAogCXZvaWQJCQlfX3VzZXIgKnVidWZmZXIsCisJaW50CQkJdWJzaXplLAorCWludAkJCSp1YnVzZWQsCiAJY29uc3QgeGZzX2JzdGF0X3QJKmJ1ZmZlcikKIHsKLQljb21wYXRfeGZzX2JzdGF0X3QgX191c2VyICpwMzIgPSB1YnVmZmVyOworCWNvbXBhdF94ZnNfYnN0YXRfdAlfX3VzZXIgKnAzMiA9IHVidWZmZXI7CiAKLQlpZiAocHV0X3VzZXIoYnVmZmVyLT5ic19pbm8sICZwMzItPmJzX2lubykgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19tb2RlLCAmcDMyLT5ic19tb2RlKSB8fAotCSAgICBwdXRfdXNlcihidWZmZXItPmJzX25saW5rLCAmcDMyLT5ic19ubGluaykgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic191aWQsICZwMzItPmJzX3VpZCkgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19naWQsICZwMzItPmJzX2dpZCkgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19yZGV2LCAmcDMyLT5ic19yZGV2KSB8fAotCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2Jsa3NpemUsICZwMzItPmJzX2Jsa3NpemUpIHx8Ci0JICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfc2l6ZSwgJnAzMi0+YnNfc2l6ZSkgfHwKKwlpZiAodWJzaXplIDwgc2l6ZW9mKCpwMzIpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CisKKwlpZiAocHV0X3VzZXIoYnVmZmVyLT5ic19pbm8sCSAgJnAzMi0+YnNfaW5vKQkJfHwKKwkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19tb2RlLAkgICZwMzItPmJzX21vZGUpCXx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfbmxpbmssCSAgJnAzMi0+YnNfbmxpbmspCXx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfdWlkLAkgICZwMzItPmJzX3VpZCkJCXx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfZ2lkLAkgICZwMzItPmJzX2dpZCkJCXx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfcmRldiwJICAmcDMyLT5ic19yZGV2KQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2Jsa3NpemUsICAmcDMyLT5ic19ibGtzaXplKQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX3NpemUsCSAgJnAzMi0+YnNfc2l6ZSkJfHwKIAkgICAgeGZzX2JzdGltZV9zdG9yZV9jb21wYXQoJnAzMi0+YnNfYXRpbWUsICZidWZmZXItPmJzX2F0aW1lKSB8fAogCSAgICB4ZnNfYnN0aW1lX3N0b3JlX2NvbXBhdCgmcDMyLT5ic19tdGltZSwgJmJ1ZmZlci0+YnNfbXRpbWUpIHx8CiAJICAgIHhmc19ic3RpbWVfc3RvcmVfY29tcGF0KCZwMzItPmJzX2N0aW1lLCAmYnVmZmVyLT5ic19jdGltZSkgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19ibG9ja3MsICZwMzItPmJzX2Jsb2NrcykgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic194ZmxhZ3MsICZwMzItPmJzX3hmbGFncykgfHwKLQkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic19leHRzaXplLCAmcDMyLT5ic19leHRzaXplKSB8fAotCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2V4dGVudHMsICZwMzItPmJzX2V4dGVudHMpIHx8Ci0JICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfZ2VuLCAmcDMyLT5ic19nZW4pIHx8Ci0JICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfcHJvamlkLCAmcDMyLT5ic19wcm9qaWQpIHx8Ci0JICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfZG1ldm1hc2ssICZwMzItPmJzX2RtZXZtYXNrKSB8fAotCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2Rtc3RhdGUsICZwMzItPmJzX2Rtc3RhdGUpIHx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfYmxvY2tzLAkgICZwMzItPmJzX2Jsb2NrcykJfHwKKwkgICAgcHV0X3VzZXIoYnVmZmVyLT5ic194ZmxhZ3MsCSAgJnAzMi0+YnNfeGZsYWdzKQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2V4dHNpemUsICAmcDMyLT5ic19leHRzaXplKQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2V4dGVudHMsICAmcDMyLT5ic19leHRlbnRzKQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2dlbiwJICAmcDMyLT5ic19nZW4pCQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX3Byb2ppZCwJICAmcDMyLT5ic19wcm9qaWQpCXx8CisJICAgIHB1dF91c2VyKGJ1ZmZlci0+YnNfZG1ldm1hc2ssICZwMzItPmJzX2RtZXZtYXNrKQl8fAorCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2Rtc3RhdGUsICAmcDMyLT5ic19kbXN0YXRlKQl8fAogCSAgICBwdXRfdXNlcihidWZmZXItPmJzX2FleHRlbnRzLCAmcDMyLT5ic19hZXh0ZW50cykpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBzaXplb2YoKnAzMik7CisJCXJldHVybiBYRlNfRVJST1IoRUZBVUxUKTsKKwlpZiAodWJ1c2VkKQorCQkqdWJ1c2VkID0gc2l6ZW9mKCpwMzIpOworCXJldHVybiAwOwogfQogCi0KLQotdHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2J1bGtyZXEgewotCWNvbXBhdF91cHRyX3QJbGFzdGlwOwkJLyogbGFzdCBpbm9kZSAjIHBvaW50ZXIJCSovCi0JX19zMzIJCWljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgaW4gYnVmZmVyCSovCi0JY29tcGF0X3VwdHJfdAl1YnVmZmVyOwkvKiB1c2VyIGJ1ZmZlciBmb3IgaW5vZGUgZGVzYy4JKi8KLQljb21wYXRfdXB0cl90CW9jb3VudDsJCS8qIG91dHB1dCBjb3VudCBwb2ludGVyCQkqLwotfSBjb21wYXRfeGZzX2Zzb3BfYnVsa3JlcV90OwotCi0jZGVmaW5lIFhGU19JT0NfRlNCVUxLU1RBVF8zMiBcCi0JX0lPV1IoJ1gnLCAxMDEsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfYnVsa3JlcSkKLSNkZWZpbmUgWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRV8zMiBcCi0JX0lPV1IoJ1gnLCAxMDIsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfYnVsa3JlcSkKLSNkZWZpbmUgWEZTX0lPQ19GU0lOVU1CRVJTXzMyIFwKLQlfSU9XUignWCcsIDEwMywgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9idWxrcmVxKQorU1RBVElDIGludAoreGZzX2J1bGtzdGF0X29uZV9jb21wYXQoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgbnVtYmVyIHRvIGdldCBkYXRhIGZvciAqLworCXZvaWQJCV9fdXNlciAqYnVmZmVyLAkvKiBidWZmZXIgdG8gcGxhY2Ugb3V0cHV0IGluICovCisJaW50CQl1YnNpemUsCQkvKiBzaXplIG9mIGJ1ZmZlciAqLworCXZvaWQJCSpwcml2YXRlX2RhdGEsCS8qIG15IHByaXZhdGUgZGF0YSAqLworCXhmc19kYWRkcl90CWJubywJCS8qIHN0YXJ0aW5nIGJubyBvZiBpbm9kZSBjbHVzdGVyICovCisJaW50CQkqdWJ1c2VkLAkvKiBieXRlcyB1c2VkIGJ5IG1lICovCisJdm9pZAkJKmRpYnVmZiwJLyogb24tZGlzayBpbm9kZSBidWZmZXIgKi8KKwlpbnQJCSpzdGF0KQkJLyogQlVMS1NUQVRfUlZfLi4uICovCit7CisJcmV0dXJuIHhmc19idWxrc3RhdF9vbmVfaW50KG1wLCBpbm8sIGJ1ZmZlciwgdWJzaXplLAorCQkJCSAgICB4ZnNfYnVsa3N0YXRfb25lX2ZtdF9jb21wYXQsIGJubywKKwkJCQkgICAgdWJ1c2VkLCBkaWJ1ZmYsIHN0YXQpOworfQogCiAvKiBjb3BpZWQgZnJvbSB4ZnNfaW9jdGwuYyAqLwogU1RBVElDIGludAoteGZzX2lvY19idWxrc3RhdF9jb21wYXQoCi0JeGZzX21vdW50X3QJCSptcCwKLQl1bnNpZ25lZCBpbnQJCWNtZCwKLQl2b2lkCQkJX191c2VyICphcmcpCit4ZnNfY29tcGF0X2lvY19idWxrc3RhdCgKKwl4ZnNfbW91bnRfdAkJICAqbXAsCisJdW5zaWduZWQgaW50CQkgIGNtZCwKKwljb21wYXRfeGZzX2Zzb3BfYnVsa3JlcV90IF9fdXNlciAqcDMyKQogewotCWNvbXBhdF94ZnNfZnNvcF9idWxrcmVxX3QgX191c2VyICpwMzIgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJdTMyCQkJYWRkcjsKIAl4ZnNfZnNvcF9idWxrcmVxX3QJYnVsa3JlcTsKIAlpbnQJCQljb3VudDsJLyogIyBvZiByZWNvcmRzIHJldHVybmVkICovCkBAIC0yNzAsMjAgKzI2MywyMCBAQAogCS8qIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gKHVudXNlZCBoZXJlLCBidXQgdXNlZCBpbiBkbWFwaSkgKi8KIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJaWYgKGdldF91c2VyKGFkZHIsICZwMzItPmxhc3RpcCkpCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCWJ1bGtyZXEubGFzdGlwID0gY29tcGF0X3B0cihhZGRyKTsKIAlpZiAoZ2V0X3VzZXIoYnVsa3JlcS5pY291bnQsICZwMzItPmljb3VudCkgfHwKIAkgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+dWJ1ZmZlcikpCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCWJ1bGtyZXEudWJ1ZmZlciA9IGNvbXBhdF9wdHIoYWRkcik7CiAJaWYgKGdldF91c2VyKGFkZHIsICZwMzItPm9jb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCWJ1bGtyZXEub2NvdW50ID0gY29tcGF0X3B0cihhZGRyKTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmaW5sYXN0LCBidWxrcmVxLmxhc3RpcCwgc2l6ZW9mKF9fczY0KSkpCkBAIC0yOTUsMTcgKzI4OCwyMiBAQAogCWlmIChidWxrcmVxLnVidWZmZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKIAotCWlmIChjbWQgPT0gWEZTX0lPQ19GU0lOVU1CRVJTKQorCWlmIChjbWQgPT0gWEZTX0lPQ19GU0lOVU1CRVJTXzMyKSB7CiAJCWVycm9yID0geGZzX2ludW1iZXJzKG1wLCAmaW5sYXN0LCAmY291bnQsCiAJCQkJYnVsa3JlcS51YnVmZmVyLCB4ZnNfaW51bWJlcnNfZm10X2NvbXBhdCk7Ci0JZWxzZSB7Ci0JCS8qIGRlY2xhcmUgYSB2YXIgdG8gZ2V0IGEgd2FybmluZyBpbiBjYXNlIHRoZSB0eXBlIGNoYW5nZXMgKi8KLQkJYnVsa3N0YXRfb25lX2ZtdF9wZiBmb3JtYXR0ZXIgPSB4ZnNfYnVsa3N0YXRfb25lX2ZtdF9jb21wYXQ7CisJfSBlbHNlIGlmIChjbWQgPT0gWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRV8zMikgeworCQlpbnQgcmVzOworCisJCWVycm9yID0geGZzX2J1bGtzdGF0X29uZV9jb21wYXQobXAsIGlubGFzdCwgYnVsa3JlcS51YnVmZmVyLAorCQkJCXNpemVvZihjb21wYXRfeGZzX2JzdGF0X3QpLAorCQkJCU5VTEwsIDAsIE5VTEwsIE5VTEwsICZyZXMpOworCX0gZWxzZSBpZiAoY21kID09IFhGU19JT0NfRlNCVUxLU1RBVF8zMikgewogCQllcnJvciA9IHhmc19idWxrc3RhdChtcCwgJmlubGFzdCwgJmNvdW50LAotCQkJeGZzX2J1bGtzdGF0X29uZSwgZm9ybWF0dGVyLAorCQkJeGZzX2J1bGtzdGF0X29uZV9jb21wYXQsIE5VTEwsCiAJCQlzaXplb2YoY29tcGF0X3hmc19ic3RhdF90KSwgYnVsa3JlcS51YnVmZmVyLAogCQkJQlVMS1NUQVRfRkdfUVVJQ0ssICZkb25lKTsKLQl9CisJfSBlbHNlCisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gLWVycm9yOwogCkBAIC0zMjEsNjMgKzMxOSwzMDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KLXR5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEgewotCV9fdTMyCQlmZDsJCS8qIGZkIGZvciBGRF9UT19IQU5ETEUJCSovCi0JY29tcGF0X3VwdHJfdAlwYXRoOwkJLyogdXNlciBwYXRobmFtZQkJKi8KLQlfX3UzMgkJb2ZsYWdzOwkJLyogb3BlbiBmbGFncwkJCSovCi0JY29tcGF0X3VwdHJfdAlpaGFuZGxlOwkvKiB1c2VyIHN1cHBsaWVkIGhhbmRsZQkJKi8KLQlfX3UzMgkJaWhhbmRsZW47CS8qIHVzZXIgc3VwcGxpZWQgbGVuZ3RoCQkqLwotCWNvbXBhdF91cHRyX3QJb2hhbmRsZTsJLyogdXNlciBidWZmZXIgZm9yIGhhbmRsZQkqLwotCWNvbXBhdF91cHRyX3QJb2hhbmRsZW47CS8qIHVzZXIgYnVmZmVyIGxlbmd0aAkJKi8KLX0gY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcV90OwotCi0jZGVmaW5lIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRV8zMiBcCi0JX0lPV1IoJ1gnLCAxMDQsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxKQotI2RlZmluZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFXzMyIFwKLQlfSU9XUignWCcsIDEwNSwgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEpCi0jZGVmaW5lIFhGU19JT0NfRkRfVE9fSEFORExFXzMyIFwKLQlfSU9XUignWCcsIDEwNiwgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEpCi0jZGVmaW5lIFhGU19JT0NfT1BFTl9CWV9IQU5ETEVfMzIgXAotCV9JT1dSKCdYJywgMTA3LCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcSkKLSNkZWZpbmUgWEZTX0lPQ19SRUFETElOS19CWV9IQU5ETEVfMzIgXAotCV9JT1dSKCdYJywgMTA4LCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcSkKLQotU1RBVElDIHVuc2lnbmVkIGxvbmcgeGZzX2lvY3RsMzJfZnNoYW5kbGUodW5zaWduZWQgbG9uZyBhcmcpCitTVEFUSUMgaW50Cit4ZnNfY29tcGF0X2hhbmRsZXJlcV9jb3B5aW4oCisJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJCSpocmVxLAorCWNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXFfdAlfX3VzZXIgKmFyZzMyKQogewotCWNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXFfdCBfX3VzZXIgKnAzMiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQl4ZnNfZnNvcF9oYW5kbGVyZXFfdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKLQl1MzIgYWRkcjsKKwljb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxX3QJaHJlcTMyOwogCi0JaWYgKGNvcHlfaW5fdXNlcigmcC0+ZmQsICZwMzItPmZkLCBzaXplb2YoX191MzIpKSB8fAotCSAgICBnZXRfdXNlcihhZGRyLCAmcDMyLT5wYXRoKSB8fAotCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGFkZHIpLCAmcC0+cGF0aCkgfHwKLQkgICAgY29weV9pbl91c2VyKCZwLT5vZmxhZ3MsICZwMzItPm9mbGFncywgc2l6ZW9mKF9fdTMyKSkgfHwKLQkgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+aWhhbmRsZSkgfHwKLQkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPmloYW5kbGUpIHx8Ci0JICAgIGNvcHlfaW5fdXNlcigmcC0+aWhhbmRsZW4sICZwMzItPmloYW5kbGVuLCBzaXplb2YoX191MzIpKSB8fAotCSAgICBnZXRfdXNlcihhZGRyLCAmcDMyLT5vaGFuZGxlKSB8fAotCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGFkZHIpLCAmcC0+b2hhbmRsZSkgfHwKLQkgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+b2hhbmRsZW4pIHx8Ci0JICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoYWRkciksICZwLT5vaGFuZGxlbikpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmaHJlcTMyLCBhcmczMiwgc2l6ZW9mKGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXFfdCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKXA7CisJaHJlcS0+ZmQgPSBocmVxMzIuZmQ7CisJaHJlcS0+cGF0aCA9IGNvbXBhdF9wdHIoaHJlcTMyLnBhdGgpOworCWhyZXEtPm9mbGFncyA9IGhyZXEzMi5vZmxhZ3M7CisJaHJlcS0+aWhhbmRsZSA9IGNvbXBhdF9wdHIoaHJlcTMyLmloYW5kbGUpOworCWhyZXEtPmloYW5kbGVuID0gaHJlcTMyLmloYW5kbGVuOworCWhyZXEtPm9oYW5kbGUgPSBjb21wYXRfcHRyKGhyZXEzMi5vaGFuZGxlKTsKKwlocmVxLT5vaGFuZGxlbiA9IGNvbXBhdF9wdHIoaHJlcTMyLm9oYW5kbGVuKTsKKworCXJldHVybiAwOwogfQogCi0KLVNUQVRJQyBsb25nCi14ZnNfY29tcGF0X2lvY3RsKAotCWludAkJbW9kZSwKLQlzdHJ1Y3QgZmlsZQkqZmlsZSwKLQl1bnNpZ25lZAljbWQsCi0JdW5zaWduZWQgbG9uZwlhcmcpCisvKgorICogQ29udmVydCB1c2Vyc3BhY2UgaGFuZGxlIGRhdGEgaW50byBpbm9kZS4KKyAqCisgKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCBhbGwgdGhlIGZzb3BfaGFuZGxlcmVxIGlvY3RsIGNhbGxzIGhhdmUgYSBkYXRhCisgKiBzdHJ1Y3R1cmUgYXJndW1lbnQgd2hvc2UgZmlyc3QgY29tcG9uZW50IGlzIGFsd2F5cyBhIHhmc19mc29wX2hhbmRsZXJlcV90LAorICogc28gd2UgY2FuIHBhc3MgdGhhdCBzdWIgc3RydWN0dXJlIGludG8gdGhpcyBoYW5keSwgc2hhcmVkIHJvdXRpbmUuCisgKgorICogSWYgbm8gZXJyb3IsIGNhbGxlciBtdXN0IGFsd2F5cyBpcHV0IHRoZSByZXR1cm5lZCBpbm9kZS4KKyAqLworU1RBVElDIGludAoreGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXFfY29tcGF0KAorCXhmc19tb3VudF90CQkqbXAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUsCS8qIHBhcmVudCBpbm9kZSBwb2ludGVyICAgICovCisJY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcV90CSpocmVxLAorCXN0cnVjdCBpbm9kZQkJKippbm9kZSkKIHsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQJCWVycm9yOworCXZvaWQJCQlfX3VzZXIgKmhhbnA7CisJc2l6ZV90CQkJaGxlbjsKKwl4ZnNfZmlkX3QJCSp4ZmlkOworCXhmc19oYW5kbGVfdAkJKmhhbmRsZXA7CisJeGZzX2hhbmRsZV90CQloYW5kbGU7CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfaW5vX3QJCWlubzsKKwlfX3UzMgkJCWlnZW47CisJaW50CQkJZXJyb3I7CisKKwkvKgorCSAqIE9ubHkgYWxsb3cgaGFuZGxlIG9wZW5zIHVuZGVyIGEgZGlyZWN0b3J5LgorCSAqLworCWlmICghU19JU0RJUihwYXJpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9URElSKTsKKworCWhhbnAgPSBjb21wYXRfcHRyKGhyZXEtPmloYW5kbGUpOworCWhsZW4gPSBocmVxLT5paGFuZGxlbjsKKwloYW5kbGVwID0gJmhhbmRsZTsKKworCWlmIChobGVuIDwgc2l6ZW9mKGhhbmRsZXAtPmhhX2ZzaWQpIHx8IGhsZW4gPiBzaXplb2YoKmhhbmRsZXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGhhbmRsZXAsIGhhbnAsIGhsZW4pKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVGQVVMVCk7CisJaWYgKGhsZW4gPCBzaXplb2YoKmhhbmRsZXApKQorCQltZW1zZXQoKChjaGFyICopaGFuZGxlcCkgKyBobGVuLCAwLCBzaXplb2YoKmhhbmRsZXApIC0gaGxlbik7CisJaWYgKGhsZW4gPiBzaXplb2YoaGFuZGxlcC0+aGFfZnNpZCkpIHsKKwkJaWYgKGhhbmRsZXAtPmhhX2ZpZC5maWRfbGVuICE9CisJCSAgICAoaGxlbiAtIHNpemVvZihoYW5kbGVwLT5oYV9mc2lkKSAtCisJCQkgICAgc2l6ZW9mKGhhbmRsZXAtPmhhX2ZpZC5maWRfbGVuKSkgfHwKKwkJICAgIGhhbmRsZXAtPmhhX2ZpZC5maWRfcGFkKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogQ3JhY2sgdGhlIGhhbmRsZSwgb2J0YWluIHRoZSBpbm9kZSAjICYgZ2VuZXJhdGlvbiAjCisJICovCisJeGZpZCA9IChzdHJ1Y3QgeGZzX2ZpZCAqKSZoYW5kbGVwLT5oYV9maWQ7CisJaWYgKHhmaWQtPmZpZF9sZW4gPT0gc2l6ZW9mKCp4ZmlkKSAtIHNpemVvZih4ZmlkLT5maWRfbGVuKSkgeworCQlpbm8gID0geGZpZC0+ZmlkX2lubzsKKwkJaWdlbiA9IHhmaWQtPmZpZF9nZW47CisJfSBlbHNlIHsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogR2V0IHRoZSBYRlMgaW5vZGUsIGJ1aWxkaW5nIGEgTGludXggaW5vZGUgdG8gZ28gd2l0aCBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKGlwID09IE5VTEwpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwlpZiAoaXAtPmlfZC5kaV9nZW4gIT0gaWdlbikgeworCQl4ZnNfaXB1dF9uZXcoaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJfQorCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJKmlub2RlID0gVkZTX0koaXApOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfY29tcGF0X2F0dHJsaXN0X2J5X2hhbmRsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZywKKwlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKK3sKKwlpbnQJCQllcnJvcjsKKwlhdHRybGlzdF9jdXJzb3Jfa2Vybl90CSpjdXJzb3I7CisJY29tcGF0X3hmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90IGFsX2hyZXE7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJY2hhcgkJCSprYnVmOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZhbF9ocmVxLCBhcmcsCisJCQkgICBzaXplb2YoY29tcGF0X3hmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJaWYgKGFsX2hyZXEuYnVmbGVuID4gWEFUVFJfTElTVF9NQVgpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisKKwkvKgorCSAqIFJlamVjdCBmbGFncywgb25seSBhbGxvdyBuYW1lc3BhY2VzLgorCSAqLworCWlmIChhbF9ocmVxLmZsYWdzICYgfihBVFRSX1JPT1QgfCBBVFRSX1NFQ1VSRSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxX2NvbXBhdChtcCwgcGFyaW5vZGUsICZhbF9ocmVxLmhyZXEsCisJCQkJCSAgICAgICAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlrYnVmID0ga21hbGxvYyhhbF9ocmVxLmJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlnb3RvIG91dF92bl9yZWxlOworCisJY3Vyc29yID0gKGF0dHJsaXN0X2N1cnNvcl9rZXJuX3QgKikmYWxfaHJlcS5wb3M7CisJZXJyb3IgPSB4ZnNfYXR0cl9saXN0KFhGU19JKGlub2RlKSwga2J1ZiwgYWxfaHJlcS5idWZsZW4sCisJCQkJCWFsX2hyZXEuZmxhZ3MsIGN1cnNvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9rZnJlZTsKKworCWlmIChjb3B5X3RvX3VzZXIoY29tcGF0X3B0cihhbF9ocmVxLmJ1ZmZlciksIGtidWYsIGFsX2hyZXEuYnVmbGVuKSkKKwkJZXJyb3IgPSAtRUZBVUxUOworCisgb3V0X2tmcmVlOgorCWtmcmVlKGtidWYpOworIG91dF92bl9yZWxlOgorCWlwdXQoaW5vZGUpOworIG91dDoKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfY29tcGF0X2F0dHJtdWx0aV9ieV9oYW5kbGUoCisJeGZzX21vdW50X3QJCQkJKm1wLAorCXZvaWQJCQkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBpbm9kZQkJCQkqcGFyaW5vZGUpCit7CisJaW50CQkJCQllcnJvcjsKKwljb21wYXRfeGZzX2F0dHJfbXVsdGlvcF90CQkqb3BzOworCWNvbXBhdF94ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxX3QJYW1faHJlcTsKKwlzdHJ1Y3QgaW5vZGUJCQkJKmlub2RlOworCXVuc2lnbmVkIGludAkJCQlpLCBzaXplOworCWNoYXIJCQkJCSphdHRyX25hbWU7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFtX2hyZXEsIGFyZywKKwkJCSAgIHNpemVvZihjb21wYXRfeGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxX2NvbXBhdChtcCwgcGFyaW5vZGUsICZhbV9ocmVxLmhyZXEsCisJCQkJCSAgICAgICAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IEUyQklHOworCXNpemUgPSBhbV9ocmVxLm9wY291bnQgKiBzaXplb2YoY29tcGF0X3hmc19hdHRyX211bHRpb3BfdCk7CisJaWYgKCFzaXplIHx8IHNpemUgPiAxNiAqIFBBR0VfU0laRSkKKwkJZ290byBvdXRfdm5fcmVsZTsKKworCWVycm9yID0gRU5PTUVNOworCW9wcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHMpCisJCWdvdG8gb3V0X3ZuX3JlbGU7CisKKwllcnJvciA9IEVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIob3BzLCBjb21wYXRfcHRyKGFtX2hyZXEub3BzKSwgc2l6ZSkpCisJCWdvdG8gb3V0X2tmcmVlX29wczsKKworCWF0dHJfbmFtZSA9IGttYWxsb2MoTUFYTkFNRUxFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRyX25hbWUpCisJCWdvdG8gb3V0X2tmcmVlX29wczsKKworCisJZXJyb3IgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhbV9ocmVxLm9wY291bnQ7IGkrKykgeworCQlvcHNbaV0uYW1fZXJyb3IgPSBzdHJuY3B5X2Zyb21fdXNlcihhdHRyX25hbWUsCisJCQkJY29tcGF0X3B0cihvcHNbaV0uYW1fYXR0cm5hbWUpLAorCQkJCU1BWE5BTUVMRU4pOworCQlpZiAob3BzW2ldLmFtX2Vycm9yID09IDAgfHwgb3BzW2ldLmFtX2Vycm9yID09IE1BWE5BTUVMRU4pCisJCQllcnJvciA9IC1FUkFOR0U7CisJCWlmIChvcHNbaV0uYW1fZXJyb3IgPCAwKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChvcHNbaV0uYW1fb3Bjb2RlKSB7CisJCWNhc2UgQVRUUl9PUF9HRVQ6CisJCQlvcHNbaV0uYW1fZXJyb3IgPSB4ZnNfYXR0cm11bHRpX2F0dHJfZ2V0KGlub2RlLAorCQkJCQlhdHRyX25hbWUsCisJCQkJCWNvbXBhdF9wdHIob3BzW2ldLmFtX2F0dHJ2YWx1ZSksCisJCQkJCSZvcHNbaV0uYW1fbGVuZ3RoLCBvcHNbaV0uYW1fZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgQVRUUl9PUF9TRVQ6CisJCQlvcHNbaV0uYW1fZXJyb3IgPSB4ZnNfYXR0cm11bHRpX2F0dHJfc2V0KGlub2RlLAorCQkJCQlhdHRyX25hbWUsCisJCQkJCWNvbXBhdF9wdHIob3BzW2ldLmFtX2F0dHJ2YWx1ZSksCisJCQkJCW9wc1tpXS5hbV9sZW5ndGgsIG9wc1tpXS5hbV9mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBBVFRSX09QX1JFTU9WRToKKwkJCW9wc1tpXS5hbV9lcnJvciA9IHhmc19hdHRybXVsdGlfYXR0cl9yZW1vdmUoaW5vZGUsCisJCQkJCWF0dHJfbmFtZSwgb3BzW2ldLmFtX2ZsYWdzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3BzW2ldLmFtX2Vycm9yID0gRUlOVkFMOworCQl9CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihjb21wYXRfcHRyKGFtX2hyZXEub3BzKSwgb3BzLCBzaXplKSkKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKworCWtmcmVlKGF0dHJfbmFtZSk7Cisgb3V0X2tmcmVlX29wczoKKwlrZnJlZShvcHMpOworIG91dF92bl9yZWxlOgorCWlwdXQoaW5vZGUpOworIG91dDoKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfY29tcGF0X2Zzc2V0ZG1fYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlKQoreworCWludAkJCWVycm9yOworCXN0cnVjdCBmc2RtaWRhdGEJZnNkOworCWNvbXBhdF94ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXFfdCBkbWhyZXE7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisKKwlpZiAoIWNhcGFibGUoQ0FQX01LTk9EKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmZG1ocmVxLCBhcmcsCisJCQkgICBzaXplb2YoY29tcGF0X3hmc19mc29wX3NldGRtX2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxX2NvbXBhdChtcCwgcGFyaW5vZGUsICZkbWhyZXEuaHJlcSwKKwkJCQkJICAgICAgICZpbm9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkgeworCQllcnJvciA9IC1YRlNfRVJST1IoRVBFUk0pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZzZCwgY29tcGF0X3B0cihkbWhyZXEuZGF0YSksIHNpemVvZihmc2QpKSkgeworCQllcnJvciA9IC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSAteGZzX3NldF9kbWF0dHJzKFhGU19JKGlub2RlKSwgZnNkLmZzZF9kbWV2bWFzaywKKwkJCQkgZnNkLmZzZF9kbXN0YXRlKTsKKworb3V0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnJvcjsKK30KKworbG9uZworeGZzX2ZpbGVfY29tcGF0X2lvY3RsKAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwl1bnNpZ25lZAkJY21kLAorCXVuc2lnbmVkIGxvbmcJCXApCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJdm9pZAkJCV9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopcDsKKwlpbnQJCQlpb2ZsYWdzID0gMDsKKwlpbnQJCQllcnJvcjsKKworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9OT0NNVElNRSkKKwkJaW9mbGFncyB8PSBJT19JTlZJUzsKKworCXhmc19pdHJhY2VfZW50cnkoaXApOwogCiAJc3dpdGNoIChjbWQpIHsKKwkvKiBObyBzaXplIG9yIGFsaWdubWVudCBpc3N1ZXMgb24gYW55IGFyY2ggKi8KIAljYXNlIFhGU19JT0NfRElPSU5GTzoKIAljYXNlIFhGU19JT0NfRlNHRU9NRVRSWToKIAljYXNlIFhGU19JT0NfRlNHRVRYQVRUUjoKQEAgLTM4Nyw0OCArNjI4LDE4IEBACiAJY2FzZSBYRlNfSU9DX0dFVEJNQVA6CiAJY2FzZSBYRlNfSU9DX0dFVEJNQVBBOgogCWNhc2UgWEZTX0lPQ19HRVRCTUFQWDoKLS8qIG5vdCBoYW5kbGVkCi0JY2FzZSBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFOgotCWNhc2UgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEU6Ci0JY2FzZSBYRlNfSU9DX0FUVFJNVUxUSV9CWV9IQU5ETEU6Ci0qLwogCWNhc2UgWEZTX0lPQ19GU0NPVU5UUzoKIAljYXNlIFhGU19JT0NfU0VUX1JFU0JMS1M6CiAJY2FzZSBYRlNfSU9DX0dFVF9SRVNCTEtTOgotCWNhc2UgWEZTX0lPQ19GU0dST1dGU0RBVEE6CiAJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTTE9HOgotCWNhc2UgWEZTX0lPQ19GU0dST1dGU1JUOgogCWNhc2UgWEZTX0lPQ19GUkVFWkU6CiAJY2FzZSBYRlNfSU9DX1RIQVc6CiAJY2FzZSBYRlNfSU9DX0dPSU5HRE9XTjoKIAljYXNlIFhGU19JT0NfRVJST1JfSU5KRUNUSU9OOgogCWNhc2UgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTDoKLQkJYnJlYWs7Ci0KLQljYXNlIFhGU19JT0MzMl9HRVRYRkxBR1M6Ci0JY2FzZSBYRlNfSU9DMzJfU0VUWEZMQUdTOgotCWNhc2UgWEZTX0lPQzMyX0dFVFZFUlNJT046Ci0JCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgbG9uZyk7Ci0JCWJyZWFrOwotI2lmZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCi0JLyogeGZzX2Zsb2NrX3QgaGFzIHdyb25nIHUzMiB2cyB1NjQgYWxpZ25tZW50ICovCi0JY2FzZSBYRlNfSU9DX0FMTE9DU1BfMzI6Ci0JY2FzZSBYRlNfSU9DX0ZSRUVTUF8zMjoKLQljYXNlIFhGU19JT0NfQUxMT0NTUDY0XzMyOgotCWNhc2UgWEZTX0lPQ19GUkVFU1A2NF8zMjoKLQljYXNlIFhGU19JT0NfUkVTVlNQXzMyOgotCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUF8zMjoKLQljYXNlIFhGU19JT0NfUkVTVlNQNjRfMzI6Ci0JY2FzZSBYRlNfSU9DX1VOUkVTVlNQNjRfMzI6Ci0JCWFyZyA9IHhmc19pb2N0bDMyX2Zsb2NrKGFyZyk7Ci0JCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgc3RydWN0IHhmc19mbG9jazY0KTsKLQkJYnJlYWs7Ci0JY2FzZSBYRlNfSU9DX0ZTR0VPTUVUUllfVjFfMzI6Ci0JCWFyZyA9IHhmc19pb2N0bDMyX2dlb21fdjEoYXJnKTsKLQkJY21kID0gX05BVElWRV9JT0MoY21kLCBzdHJ1Y3QgeGZzX2Zzb3BfZ2VvbV92MSk7Ci0JCWJyZWFrOwotCi0jZWxzZSAvKiBUaGVzZSBhcmUgaGFuZGxlZCBmaW5lIGlmIG5vIGFsaWdubWVudCBpc3N1ZXMgKi8KKwkJcmV0dXJuIHhmc19maWxlX2lvY3RsKGZpbHAsIGNtZCwgcCk7CisjaWZuZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCisJLyogVGhlc2UgYXJlIGhhbmRsZWQgZmluZSBpZiBubyBhbGlnbm1lbnQgaXNzdWVzICovCiAJY2FzZSBYRlNfSU9DX0FMTE9DU1A6CiAJY2FzZSBYRlNfSU9DX0ZSRUVTUDoKIAljYXNlIFhGU19JT0NfUkVTVlNQOgpAQCAtNDM4LDUxICs2NDksOTcgQEAKIAljYXNlIFhGU19JT0NfUkVTVlNQNjQ6CiAJY2FzZSBYRlNfSU9DX1VOUkVTVlNQNjQ6CiAJY2FzZSBYRlNfSU9DX0ZTR0VPTUVUUllfVjE6Ci0JCWJyZWFrOworCWNhc2UgWEZTX0lPQ19GU0dST1dGU0RBVEE6CisJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTUlQ6CisJCXJldHVybiB4ZnNfZmlsZV9pb2N0bChmaWxwLCBjbWQsIHApOworI2Vsc2UKKwljYXNlIFhGU19JT0NfQUxMT0NTUF8zMjoKKwljYXNlIFhGU19JT0NfRlJFRVNQXzMyOgorCWNhc2UgWEZTX0lPQ19BTExPQ1NQNjRfMzI6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUDY0XzMyOgorCWNhc2UgWEZTX0lPQ19SRVNWU1BfMzI6CisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQXzMyOgorCWNhc2UgWEZTX0lPQ19SRVNWU1A2NF8zMjoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A2NF8zMjogeworCQlzdHJ1Y3QgeGZzX2Zsb2NrNjQJYmY7CiAKLQkvKiB4ZnNfYnN0YXRfdCBzdGlsbCBoYXMgd3JvbmcgdTMyIHZzIHU2NCBhbGlnbm1lbnQgKi8KLQljYXNlIFhGU19JT0NfU1dBUEVYVDoKLQkJYnJlYWs7CisJCWlmICh4ZnNfY29tcGF0X2Zsb2NrNjRfY29weWluKCZiZiwgYXJnKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgc3RydWN0IHhmc19mbG9jazY0KTsKKwkJcmV0dXJuIHhmc19pb2Nfc3BhY2UoaXAsIGlub2RlLCBmaWxwLCBpb2ZsYWdzLCBjbWQsICZiZik7CisJfQorCWNhc2UgWEZTX0lPQ19GU0dFT01FVFJZX1YxXzMyOgorCQlyZXR1cm4geGZzX2NvbXBhdF9pb2NfZnNnZW9tZXRyeV92MShtcCwgYXJnKTsKKwljYXNlIFhGU19JT0NfRlNHUk9XRlNEQVRBXzMyOiB7CisJCXN0cnVjdCB4ZnNfZ3Jvd2ZzX2RhdGEJaW47CiAKKwkJaWYgKHhmc19jb21wYXRfZ3Jvd2ZzX2RhdGFfY29weWluKCZpbiwgYXJnKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCWVycm9yID0geGZzX2dyb3dmc19kYXRhKG1wLCAmaW4pOworCQlyZXR1cm4gLWVycm9yOworCX0KKwljYXNlIFhGU19JT0NfRlNHUk9XRlNSVF8zMjogeworCQlzdHJ1Y3QgeGZzX2dyb3dmc19ydAlpbjsKKworCQlpZiAoeGZzX2NvbXBhdF9ncm93ZnNfcnRfY29weWluKCZpbiwgYXJnKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCWVycm9yID0geGZzX2dyb3dmc19ydChtcCwgJmluKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CiAjZW5kaWYKKwkvKiBsb25nIGNoYW5nZXMgc2l6ZSwgYnV0IHhmcyBvbmx5IGNvcGllc2Ugb3V0IDMyIGJpdHMgKi8KKwljYXNlIFhGU19JT0NfR0VUWEZMQUdTXzMyOgorCWNhc2UgWEZTX0lPQ19TRVRYRkxBR1NfMzI6CisJY2FzZSBYRlNfSU9DX0dFVFZFUlNJT05fMzI6CisJCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgbG9uZyk7CisJCXJldHVybiB4ZnNfZmlsZV9pb2N0bChmaWxwLCBjbWQsIHApOworCWNhc2UgWEZTX0lPQ19TV0FQRVhUOiB7CisJCXN0cnVjdCB4ZnNfc3dhcGV4dAkgIHN4cDsKKwkJc3RydWN0IGNvbXBhdF94ZnNfc3dhcGV4dCBfX3VzZXIgKnN4dSA9IGFyZzsKKworCQkvKiBCdWxrIGNvcHkgaW4gdXAgdG8gdGhlIHN4X3N0YXQgZmllbGQsIHRoZW4gY29weSBic3RhdCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnN4cCwgc3h1LAorCQkJCSAgIG9mZnNldG9mKHN0cnVjdCB4ZnNfc3dhcGV4dCwgc3hfc3RhdCkpIHx8CisJCSAgICB4ZnNfaW9jdGwzMl9ic3RhdF9jb3B5aW4oJnN4cC5zeF9zdGF0LCAmc3h1LT5zeF9zdGF0KSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCWVycm9yID0geGZzX3N3YXBleHQoJnN4cCk7CisJCXJldHVybiAtZXJyb3I7CisJfQogCWNhc2UgWEZTX0lPQ19GU0JVTEtTVEFUXzMyOgogCWNhc2UgWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRV8zMjoKIAljYXNlIFhGU19JT0NfRlNJTlVNQkVSU18zMjoKLQkJY21kID0gX05BVElWRV9JT0MoY21kLCBzdHJ1Y3QgeGZzX2Zzb3BfYnVsa3JlcSk7Ci0JCXJldHVybiB4ZnNfaW9jX2J1bGtzdGF0X2NvbXBhdChYRlNfSShpbm9kZSktPmlfbW91bnQsCi0JCQkJY21kLCAodm9pZCBfX3VzZXIqKWFyZyk7CisJCXJldHVybiB4ZnNfY29tcGF0X2lvY19idWxrc3RhdChtcCwgY21kLCBhcmcpOwogCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEVfMzI6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFXzMyOgotCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFXzMyOgotCWNhc2UgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRV8zMjoKLQljYXNlIFhGU19JT0NfUkVBRExJTktfQllfSEFORExFXzMyOgotCQlhcmcgPSB4ZnNfaW9jdGwzMl9mc2hhbmRsZShhcmcpOworCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFXzMyOiB7CisJCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsKKworCQlpZiAoeGZzX2NvbXBhdF9oYW5kbGVyZXFfY29weWluKCZocmVxLCBhcmcpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIAkJY21kID0gX05BVElWRV9JT0MoY21kLCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJcmV0dXJuIHhmc19maW5kX2hhbmRsZShjbWQsICZocmVxKTsKIAl9CisJY2FzZSBYRlNfSU9DX09QRU5fQllfSEFORExFXzMyOiB7CisJCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsKIAotCWVycm9yID0geGZzX2lvY3RsKFhGU19JKGlub2RlKSwgZmlsZSwgbW9kZSwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOwotCXhmc19pZmxhZ3Nfc2V0KFhGU19JKGlub2RlKSwgWEZTX0lNT0RJRklFRCk7CisJCWlmICh4ZnNfY29tcGF0X2hhbmRsZXJlcV9jb3B5aW4oJmhyZXEsIGFyZykpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4geGZzX29wZW5fYnlfaGFuZGxlKG1wLCAmaHJlcSwgZmlscCwgaW5vZGUpOworCX0KKwljYXNlIFhGU19JT0NfUkVBRExJTktfQllfSEFORExFXzMyOiB7CisJCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsKIAotCXJldHVybiBlcnJvcjsKLX0KLQotbG9uZwoteGZzX2ZpbGVfY29tcGF0X2lvY3RsKAotCXN0cnVjdCBmaWxlCQkqZmlsZSwKLQl1bnNpZ25lZAkJY21kLAotCXVuc2lnbmVkIGxvbmcJCWFyZykKLXsKLQlyZXR1cm4geGZzX2NvbXBhdF9pb2N0bCgwLCBmaWxlLCBjbWQsIGFyZyk7Ci19Ci0KLWxvbmcKLXhmc19maWxlX2NvbXBhdF9pbnZpc19pb2N0bCgKLQlzdHJ1Y3QgZmlsZQkJKmZpbGUsCi0JdW5zaWduZWQJCWNtZCwKLQl1bnNpZ25lZCBsb25nCQlhcmcpCi17Ci0JcmV0dXJuIHhmc19jb21wYXRfaW9jdGwoSU9fSU5WSVMsIGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHhmc19jb21wYXRfaGFuZGxlcmVxX2NvcHlpbigmaHJlcSwgYXJnKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCXJldHVybiB4ZnNfcmVhZGxpbmtfYnlfaGFuZGxlKG1wLCAmaHJlcSwgaW5vZGUpOworCX0KKwljYXNlIFhGU19JT0NfQVRUUkxJU1RfQllfSEFORExFXzMyOgorCQlyZXR1cm4geGZzX2NvbXBhdF9hdHRybGlzdF9ieV9oYW5kbGUobXAsIGFyZywgaW5vZGUpOworCWNhc2UgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFXzMyOgorCQlyZXR1cm4geGZzX2NvbXBhdF9hdHRybXVsdGlfYnlfaGFuZGxlKG1wLCBhcmcsIGlub2RlKTsKKwljYXNlIFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEVfMzI6CisJCXJldHVybiB4ZnNfY29tcGF0X2Zzc2V0ZG1fYnlfaGFuZGxlKG1wLCBhcmcsIGlub2RlKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLVhGU19FUlJPUihFTk9JT0NUTENNRCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5oCmluZGV4IDAyZGU2ZTYuLjEwMjRjNGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmgKQEAgLTE4LDcgKzE4LDIxNyBAQAogI2lmbmRlZiBfX1hGU19JT0NUTDMyX0hfXwogI2RlZmluZSBfX1hGU19JT0NUTDMyX0hfXwogCi1leHRlcm4gbG9uZyB4ZnNfZmlsZV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGxvbmcgeGZzX2ZpbGVfY29tcGF0X2ludmlzX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworLyoKKyAqIG9uIDMyLWJpdCBhcmNoZXMsIGlvY3RsIGFyZ3VtZW50IHN0cnVjdHVyZXMgbWF5IGhhdmUgZGlmZmVyZW50IHNpemVzCisgKiBhbmQvb3IgYWxpZ25tZW50LiAgV2UgZGVmaW5lIGNvbXBhdCBzdHJ1Y3R1cmVzIHdoaWNoIG1hdGNoIHRoZQorICogMzItYml0IHNpemVzL2FsaWdubWVudHMgaGVyZSwgYW5kIHRoZWlyIGFzc29jaWF0ZWQgaW9jdGwgbnVtYmVycy4KKyAqCisgKiB4ZnNfaW9jdGwzMi5jIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGNvcHkgdGhlc2Ugc3RydWN0dXJlcyBpbiBhbmQgb3V0LgorICovCisKKy8qIHN0b2NrIGtlcm5lbC1sZXZlbCBpb2N0bHMgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBYRlNfSU9DX0dFVFhGTEFHU18zMglGU19JT0MzMl9HRVRGTEFHUworI2RlZmluZSBYRlNfSU9DX1NFVFhGTEFHU18zMglGU19JT0MzMl9TRVRGTEFHUworI2RlZmluZSBYRlNfSU9DX0dFVFZFUlNJT05fMzIJRlNfSU9DMzJfR0VUVkVSU0lPTgorCisvKgorICogT24gaW50ZWwsIGV2ZW4gaWYgc2l6ZXMgbWF0Y2gsIGFsaWdubWVudCBhbmQvb3IgcGFkZGluZyBtYXkgZGlmZmVyLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorI2RlZmluZSBCUk9LRU5fWDg2X0FMSUdOTUVOVAorI2RlZmluZSBfX2NvbXBhdF9wYWNrZWQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbHNlCisjZGVmaW5lIF9fY29tcGF0X3BhY2tlZAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfYnN0aW1lIHsKKwljb21wYXRfdGltZV90CXR2X3NlYzsJCS8qIHNlY29uZHMJCSovCisJX19zMzIJCXR2X25zZWM7CS8qIGFuZCBuYW5vc2Vjb25kcwkqLworfSBjb21wYXRfeGZzX2JzdGltZV90OworCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2JzdGF0IHsKKwlfX3U2NAkJYnNfaW5vOwkJLyogaW5vZGUgbnVtYmVyCQkJKi8KKwlfX3UxNgkJYnNfbW9kZTsJLyogdHlwZSBhbmQgbW9kZQkJKi8KKwlfX3UxNgkJYnNfbmxpbms7CS8qIG51bWJlciBvZiBsaW5rcwkJKi8KKwlfX3UzMgkJYnNfdWlkOwkJLyogdXNlciBpZAkJCSovCisJX191MzIJCWJzX2dpZDsJCS8qIGdyb3VwIGlkCQkJKi8KKwlfX3UzMgkJYnNfcmRldjsJLyogZGV2aWNlIHZhbHVlCQkJKi8KKwlfX3MzMgkJYnNfYmxrc2l6ZTsJLyogYmxvY2sgc2l6ZQkJCSovCisJX19zNjQJCWJzX3NpemU7CS8qIGZpbGUgc2l6ZQkJCSovCisJY29tcGF0X3hmc19ic3RpbWVfdCBic19hdGltZTsJLyogYWNjZXNzIHRpbWUJCQkqLworCWNvbXBhdF94ZnNfYnN0aW1lX3QgYnNfbXRpbWU7CS8qIG1vZGlmeSB0aW1lCQkJKi8KKwljb21wYXRfeGZzX2JzdGltZV90IGJzX2N0aW1lOwkvKiBpbm9kZSBjaGFuZ2UgdGltZQkJKi8KKwlpbnQ2NF90CQlic19ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MJCSovCisJX191MzIJCWJzX3hmbGFnczsJLyogZXh0ZW5kZWQgZmxhZ3MJCSovCisJX19zMzIJCWJzX2V4dHNpemU7CS8qIGV4dGVudCBzaXplCQkJKi8KKwlfX3MzMgkJYnNfZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMJCSovCisJX191MzIJCWJzX2dlbjsJCS8qIGdlbmVyYXRpb24gY291bnQJCSovCisJX191MTYJCWJzX3Byb2ppZDsJLyogcHJvamVjdCBpZAkJCSovCisJdW5zaWduZWQgY2hhcglic19wYWRbMTRdOwkvKiBwYWQgc3BhY2UsIHVudXNlZAkJKi8KKwlfX3UzMgkJYnNfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzawkJKi8KKwlfX3UxNgkJYnNfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvCQkqLworCV9fdTE2CQlic19hZXh0ZW50czsJLyogYXR0cmlidXRlIG51bWJlciBvZiBleHRlbnRzCSovCit9IF9fY29tcGF0X3BhY2tlZCBjb21wYXRfeGZzX2JzdGF0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9idWxrcmVxIHsKKwljb21wYXRfdXB0cl90CWxhc3RpcDsJCS8qIGxhc3QgaW5vZGUgIyBwb2ludGVyCQkqLworCV9fczMyCQlpY291bnQ7CQkvKiBjb3VudCBvZiBlbnRyaWVzIGluIGJ1ZmZlcgkqLworCWNvbXBhdF91cHRyX3QJdWJ1ZmZlcjsJLyogdXNlciBidWZmZXIgZm9yIGlub2RlIGRlc2MuCSovCisJY29tcGF0X3VwdHJfdAlvY291bnQ7CQkvKiBvdXRwdXQgY291bnQgcG9pbnRlcgkJKi8KK30gY29tcGF0X3hmc19mc29wX2J1bGtyZXFfdDsKKworI2RlZmluZSBYRlNfSU9DX0ZTQlVMS1NUQVRfMzIgXAorCV9JT1dSKCdYJywgMTAxLCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEVfMzIgXAorCV9JT1dSKCdYJywgMTAyLCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNJTlVNQkVSU18zMiBcCisJX0lPV1IoJ1gnLCAxMDMsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfYnVsa3JlcSkKKwordHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcSB7CisJX191MzIJCWZkOwkJLyogZmQgZm9yIEZEX1RPX0hBTkRMRQkJKi8KKwljb21wYXRfdXB0cl90CXBhdGg7CQkvKiB1c2VyIHBhdGhuYW1lCQkqLworCV9fdTMyCQlvZmxhZ3M7CQkvKiBvcGVuIGZsYWdzCQkJKi8KKwljb21wYXRfdXB0cl90CWloYW5kbGU7CS8qIHVzZXIgc3VwcGxpZWQgaGFuZGxlCQkqLworCV9fdTMyCQlpaGFuZGxlbjsJLyogdXNlciBzdXBwbGllZCBsZW5ndGgJCSovCisJY29tcGF0X3VwdHJfdAlvaGFuZGxlOwkvKiB1c2VyIGJ1ZmZlciBmb3IgaGFuZGxlCSovCisJY29tcGF0X3VwdHJfdAlvaGFuZGxlbjsJLyogdXNlciBidWZmZXIgbGVuZ3RoCQkqLworfSBjb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxX3Q7CisKKyNkZWZpbmUgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFXzMyIFwKKwlfSU9XUignWCcsIDEwNCwgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19IQU5ETEVfMzIgXAorCV9JT1dSKCdYJywgMTA1LCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19GRF9UT19IQU5ETEVfMzIgXAorCV9JT1dSKCdYJywgMTA2LCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRV8zMiBcCisJX0lPV1IoJ1gnLCAxMDcsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRV8zMiBcCisJX0lPV1IoJ1gnLCAxMDgsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxKQorCisvKiBUaGUgYnN0YXQgZmllbGQgaW4gdGhlIHN3YXBleHQgc3RydWN0IG5lZWRzIHRyYW5zbGF0aW9uICovCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX3N3YXBleHQgeworCV9faW50NjRfdAkJc3hfdmVyc2lvbjsJLyogdmVyc2lvbiAqLworCV9faW50NjRfdAkJc3hfZmR0YXJnZXQ7CS8qIGZkIG9mIHRhcmdldCBmaWxlICovCisJX19pbnQ2NF90CQlzeF9mZHRtcDsJLyogZmQgb2YgdG1wIGZpbGUgKi8KKwl4ZnNfb2ZmX3QJCXN4X29mZnNldDsJLyogb2Zmc2V0IGludG8gZmlsZSAqLworCXhmc19vZmZfdAkJc3hfbGVuZ3RoOwkvKiBsZW5nIGZyb20gb2Zmc2V0ICovCisJY2hhcgkJCXN4X3BhZFsxNl07CS8qIHBhZCBzcGFjZSwgdW51c2VkICovCisJY29tcGF0X3hmc19ic3RhdF90CXN4X3N0YXQ7CS8qIHN0YXQgb2YgdGFyZ2V0IGI0IGNvcHkgKi8KK30gX19jb21wYXRfcGFja2VkIGNvbXBhdF94ZnNfc3dhcGV4dF90OworCisjZGVmaW5lIFhGU19JT0NfU1dBUEVYVF8zMglfSU9XUignWCcsIDEwOSwgc3RydWN0IGNvbXBhdF94ZnNfc3dhcGV4dCkKKwordHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcSB7CisJc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEgaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX2F0dHJsaXN0X2N1cnNvcglwb3M7IC8qIG9wYXF1ZSBjb29raWUsIGxpc3Qgb2Zmc2V0ICovCisJX191MzIJCQkJZmxhZ3M7CS8qIHdoaWNoIG5hbWVzcGFjZSB0byB1c2UgKi8KKwlfX3UzMgkJCQlidWZsZW47CS8qIGxlbmd0aCBvZiBidWZmZXIgc3VwcGxpZWQgKi8KKwljb21wYXRfdXB0cl90CQkJYnVmZmVyOwkvKiByZXR1cm5lZCBuYW1lcyAqLworfSBfX2NvbXBhdF9wYWNrZWQgY29tcGF0X3hmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90OworCisvKiBOb3RlOiBhY3R1YWxseSB0aGlzIGlzIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEVfMzIgXAorCV9JT1coJ1gnLCAxMjIsIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxKQorCisvKiBhbV9vcGNvZGVzIGRlZmluZWQgaW4geGZzX2ZzLmggKi8KK3R5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfYXR0cl9tdWx0aW9wIHsKKwlfX3UzMgkJYW1fb3Bjb2RlOworCV9fczMyCQlhbV9lcnJvcjsKKwljb21wYXRfdXB0cl90CWFtX2F0dHJuYW1lOworCWNvbXBhdF91cHRyX3QJYW1fYXR0cnZhbHVlOworCV9fdTMyCQlhbV9sZW5ndGg7CisJX191MzIJCWFtX2ZsYWdzOworfSBjb21wYXRfeGZzX2F0dHJfbXVsdGlvcF90OworCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcSB7CisJc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9oYW5kbGVyZXEgaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwlfX3UzMgkJCQlvcGNvdW50Oy8qIGNvdW50IG9mIGZvbGxvd2luZyBtdWx0aW9wICovCisJLyogcHRyIHRvIGNvbXBhdF94ZnNfYXR0cl9tdWx0aW9wICovCisJY29tcGF0X3VwdHJfdAkJCW9wczsgLyogYXR0cl9tdWx0aSBkYXRhICovCit9IGNvbXBhdF94ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxX3Q7CisKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFXzMyIFwKKwlfSU9XKCdYJywgMTIzLCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEpCisKK3R5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXEgeworCXN0cnVjdCBjb21wYXRfeGZzX2Zzb3BfaGFuZGxlcmVxIGhyZXE7CS8qIGhhbmRsZSBpbmZvcm1hdGlvbiAgICovCisJLyogcHRyIHRvIHN0cnVjdCBmc2RtaWRhdGEgKi8KKwljb21wYXRfdXB0cl90CQkJZGF0YTsJLyogRE1BUEkgZGF0YSAgICovCit9IGNvbXBhdF94ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXFfdDsKKworI2RlZmluZSBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFXzMyIFwKKwlfSU9XKCdYJywgMTIxLCBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX3NldGRtX2hhbmRsZXJlcSkKKworI2lmZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCisvKiBvbiBpYTMyIGxfc3RhcnQgaXMgb24gYSAzMi1iaXQgYm91bmRhcnkgKi8KK3R5cGVkZWYgc3RydWN0IGNvbXBhdF94ZnNfZmxvY2s2NCB7CisJX19zMTYJCWxfdHlwZTsKKwlfX3MxNgkJbF93aGVuY2U7CisJX19zNjQJCWxfc3RhcnQJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJCQkvKiBsZW4gPT0gMCBtZWFucyB1bnRpbCBlbmQgb2YgZmlsZSAqLworCV9fczY0CQlsX2xlbiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwlfX3MzMgkJbF9zeXNpZDsKKwlfX3UzMgkJbF9waWQ7CisJX19zMzIJCWxfcGFkWzRdOwkvKiByZXNlcnZlIGFyZWEgKi8KK30gY29tcGF0X3hmc19mbG9jazY0X3Q7CisKKyNkZWZpbmUgWEZTX0lPQ19BTExPQ1NQXzMyCV9JT1coJ1gnLCAxMCwgc3RydWN0IGNvbXBhdF94ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19GUkVFU1BfMzIJX0lPVygnWCcsIDExLCBzdHJ1Y3QgY29tcGF0X3hmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0FMTE9DU1A2NF8zMglfSU9XKCdYJywgMzYsIHN0cnVjdCBjb21wYXRfeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfRlJFRVNQNjRfMzIJX0lPVygnWCcsIDM3LCBzdHJ1Y3QgY29tcGF0X3hmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1JFU1ZTUF8zMglfSU9XKCdYJywgNDAsIHN0cnVjdCBjb21wYXRfeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfVU5SRVNWU1BfMzIJX0lPVygnWCcsIDQxLCBzdHJ1Y3QgY29tcGF0X3hmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1JFU1ZTUDY0XzMyCV9JT1coJ1gnLCA0Miwgc3RydWN0IGNvbXBhdF94ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19VTlJFU1ZTUDY0XzMyCV9JT1coJ1gnLCA0Mywgc3RydWN0IGNvbXBhdF94ZnNfZmxvY2s2NCkKKwordHlwZWRlZiBzdHJ1Y3QgY29tcGF0X3hmc19mc29wX2dlb21fdjEgeworCV9fdTMyCQlibG9ja3NpemU7CS8qIGZpbGVzeXN0ZW0gKGRhdGEpIGJsb2NrIHNpemUgKi8KKwlfX3UzMgkJcnRleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZQkJKi8KKwlfX3UzMgkJYWdibG9ja3M7CS8qIGZzYmxvY2tzIGluIGFuIEFHCQkqLworCV9fdTMyCQlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMJKi8KKwlfX3UzMgkJbG9nYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiB0aGUgbG9nCQkqLworCV9fdTMyCQlzZWN0c2l6ZTsJLyogKGRhdGEpIHNlY3RvciBzaXplLCBieXRlcwkqLworCV9fdTMyCQlpbm9kZXNpemU7CS8qIGlub2RlIHNpemUgaW4gYnl0ZXMJCSovCisJX191MzIJCWltYXhwY3Q7CS8qIG1heCBhbGxvd2VkIGlub2RlIHNwYWNlKCUpCSovCisJX191NjQJCWRhdGFibG9ja3M7CS8qIGZzYmxvY2tzIGluIGRhdGEgc3Vidm9sdW1lCSovCisJX191NjQJCXJ0YmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiByZWFsdGltZSBzdWJ2b2wJKi8KKwlfX3U2NAkJcnRleHRlbnRzOwkvKiBydCBleHRlbnRzIGluIHJlYWx0aW1lIHN1YnZvbCovCisJX191NjQJCWxvZ3N0YXJ0OwkvKiBzdGFydGluZyBmc2Jsb2NrIG9mIHRoZSBsb2cJKi8KKwl1bnNpZ25lZCBjaGFyCXV1aWRbMTZdOwkvKiB1bmlxdWUgaWQgb2YgdGhlIGZpbGVzeXN0ZW0JKi8KKwlfX3UzMgkJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCwgZnNibG9ja3MJKi8KKwlfX3UzMgkJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoLCBmc2Jsb2NrcwkqLworCV9fczMyCQl2ZXJzaW9uOwkvKiBzdHJ1Y3R1cmUgdmVyc2lvbgkJKi8KKwlfX3UzMgkJZmxhZ3M7CQkvKiBzdXBlcmJsb2NrIHZlcnNpb24gZmxhZ3MJKi8KKwlfX3UzMgkJbG9nc2VjdHNpemU7CS8qIGxvZyBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwlfX3UzMgkJcnRzZWN0c2l6ZTsJLyogcmVhbHRpbWUgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJX191MzIJCWRpcmJsb2Nrc2l6ZTsJLyogZGlyZWN0b3J5IGJsb2NrIHNpemUsIGJ5dGVzCSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNvbXBhdF94ZnNfZnNvcF9nZW9tX3YxX3Q7CisKKyNkZWZpbmUgWEZTX0lPQ19GU0dFT01FVFJZX1YxXzMyICBcCisJX0lPUignWCcsIDEwMCwgc3RydWN0IGNvbXBhdF94ZnNfZnNvcF9nZW9tX3YxKQorCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2lub2dycCB7CisJX191NjQJCXhpX3N0YXJ0aW5vOwkvKiBzdGFydGluZyBpbm9kZSBudW1iZXIJKi8KKwlfX3MzMgkJeGlfYWxsb2Njb3VudDsJLyogIyBiaXRzIHNldCBpbiBhbGxvY21hc2sJKi8KKwlfX3U2NAkJeGlfYWxsb2NtYXNrOwkvKiBtYXNrIG9mIGFsbG9jYXRlZCBpbm9kZXMJKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY29tcGF0X3hmc19pbm9ncnBfdDsKKworLyogVGhlc2UgZ3Jvd2ZzIGlucHV0IHN0cnVjdHVyZXMgaGF2ZSBwYWRkaW5nIG9uIHRoZSBlbmQsIHNvIG11c3QgdHJhbnNsYXRlICovCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2dyb3dmc19kYXRhIHsKKwlfX3U2NAkJbmV3YmxvY2tzOwkvKiBuZXcgZGF0YSBzdWJ2b2wgc2l6ZSwgZnNibG9ja3MgKi8KKwlfX3UzMgkJaW1heHBjdDsJLyogbmV3IGlub2RlIHNwYWNlIHBlcmNlbnRhZ2UgbGltaXQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY29tcGF0X3hmc19ncm93ZnNfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBjb21wYXRfeGZzX2dyb3dmc19ydCB7CisJX191NjQJCW5ld2Jsb2NrczsJLyogbmV3IHJlYWx0aW1lIHNpemUsIGZzYmxvY2tzICovCisJX191MzIJCWV4dHNpemU7CS8qIG5ldyByZWFsdGltZSBleHRlbnQgc2l6ZSwgZnNibG9ja3MgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY29tcGF0X3hmc19ncm93ZnNfcnRfdDsKKworI2RlZmluZSBYRlNfSU9DX0ZTR1JPV0ZTREFUQV8zMiBfSU9XKCdYJywgMTEwLCBzdHJ1Y3QgY29tcGF0X3hmc19ncm93ZnNfZGF0YSkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU1JUXzMyICAgX0lPVygnWCcsIDExMiwgc3RydWN0IGNvbXBhdF94ZnNfZ3Jvd2ZzX3J0KQorCisjZW5kaWYgLyogQlJPS0VOX1g4Nl9BTElHTk1FTlQgKi8KIAogI2VuZGlmIC8qIF9fWEZTX0lPQ1RMMzJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggMDk1ZDI3MS4uN2FhNTNmZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KIAogLyoKICAqIEJyaW5nIHRoZSBhdGltZSBpbiB0aGUgWEZTIGlub2RlIHVwdG9kYXRlLgpAQCAtNjQsMTQgKzY1LDE0IEBACiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IFZGU19JKGlwKTsKIAotCWlmIChpbm9kZSkgeworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9DTEVBUikpIHsKIAkJaXAtPmlfZC5kaV9hdGltZS50X3NlYyA9IChfX2ludDMyX3QpaW5vZGUtPmlfYXRpbWUudHZfc2VjOwogCQlpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYyA9IChfX2ludDMyX3QpaW5vZGUtPmlfYXRpbWUudHZfbnNlYzsKIAl9CiB9CiAKIC8qCi0gKiBJZiB0aGUgbGludXggaW5vZGUgZXhpc3RzLCBtYXJrIGl0IGRpcnR5LgorICogSWYgdGhlIGxpbnV4IGlub2RlIGlzIHZhbGlkLCBtYXJrIGl0IGRpcnR5LgogICogVXNlZCB3aGVuIGNvbW1pdGluZyBhIGRpcnR5IGlub2RlIGludG8gYSB0cmFuc2FjdGlvbiBzbyB0aGF0CiAgKiB0aGUgaW5vZGUgd2lsbCBnZXQgd3JpdHRlbiBiYWNrIGJ5IHRoZSBsaW51eCBjb2RlCiAgKi8KQEAgLTgxLDcgKzgyLDcgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gVkZTX0koaXApOwogCi0JaWYgKGlub2RlKQorCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfV0lMTF9GUkVFfElfRlJFRUlOR3xJX0NMRUFSKSkpCiAJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiB9CiAKQEAgLTEyOCw3ICsxMjksNyBAQAogCWlmIChzeW5jX2l0KSB7CiAJCVNZTkNIUk9OSVpFKCk7CiAJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKLQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKKwkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7CiAJfQogfQogCkBAIC0xNTgsOCArMTU5LDYgQEAKIAl9CiAKIAllcnJvciA9IHhmc19hdHRyX3NldChpcCwgbmFtZSwgdmFsdWUsIGxlbmd0aCwgQVRUUl9TRUNVUkUpOwotCWlmICghZXJyb3IpCi0JCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSU1PRElGSUVEKTsKIAogCWtmcmVlKG5hbWUpOwogCWtmcmVlKHZhbHVlKTsKQEAgLTI2MCw3ICsyNTksNiBAQAogCQllcnJvciA9IF9BQ0xfSU5IRVJJVChpbm9kZSwgbW9kZSwgZGVmYXVsdF9hY2wpOwogCQlpZiAodW5saWtlbHkoZXJyb3IpKQogCQkJZ290byBvdXRfY2xlYW51cF9pbm9kZTsKLQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JTU9ESUZJRUQpOwogCQlfQUNMX0ZSRUUoZGVmYXVsdF9hY2wpOwogCX0KIApAQCAtMzY2LDIxICszNjQsMTcgQEAKIAlzdHJ1Y3QgaW5vZGUJKmRpciwKIAlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkpCiB7Ci0Jc3RydWN0IGlub2RlCSppbm9kZTsJLyogaW5vZGUgb2YgZ3V5IGJlaW5nIGxpbmtlZCB0byAqLworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCB4ZnNfbmFtZQluYW1lOwogCWludAkJZXJyb3I7CiAKLQlpbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CiAJeGZzX2RlbnRyeV90b19uYW1lKCZuYW1lLCBkZW50cnkpOwogCi0JaWdyYWIoaW5vZGUpOwogCWVycm9yID0geGZzX2xpbmsoWEZTX0koZGlyKSwgWEZTX0koaW5vZGUpLCAmbmFtZSk7Ci0JaWYgKHVubGlrZWx5KGVycm9yKSkgewotCQlpcHV0KGlub2RlKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQogCQlyZXR1cm4gLWVycm9yOwotCX0KIAotCXhmc19pZmxhZ3Nfc2V0KFhGU19JKGRpciksIFhGU19JTU9ESUZJRUQpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiAwOwogfQpAQCAtNjAxLDcgKzU5NSw3IEBACiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAogCXN0cnVjdCBpYXR0cgkqaWF0dHIpCiB7Ci0JcmV0dXJuIC14ZnNfc2V0YXR0cihYRlNfSShkZW50cnktPmRfaW5vZGUpLCBpYXR0ciwgMCwgTlVMTCk7CisJcmV0dXJuIC14ZnNfc2V0YXR0cihYRlNfSShkZW50cnktPmRfaW5vZGUpLCBpYXR0ciwgMCk7CiB9CiAKIC8qCkBAIC02NDIsNyArNjM2LDcgQEAKIAogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAllcnJvciA9IHhmc19jaGFuZ2VfZmlsZV9zcGFjZShpcCwgWEZTX0lPQ19SRVNWU1AsICZiZiwKLQkJCQkgICAgICAwLCBOVUxMLCBYRlNfQVRUUl9OT0xPQ0spOworCQkJCSAgICAgIDAsIFhGU19BVFRSX05PTE9DSyk7CiAJaWYgKCFlcnJvciAmJiAhKG1vZGUgJiBGQUxMT0NfRkxfS0VFUF9TSVpFKSAmJgogCSAgICBvZmZzZXQgKyBsZW4gPiBpX3NpemVfcmVhZChpbm9kZSkpCiAJCW5ld19zaXplID0gb2Zmc2V0ICsgbGVuOwpAQCAtNjUzLDcgKzY0Nyw3IEBACiAKIAkJaWF0dHIuaWFfdmFsaWQgPSBBVFRSX1NJWkU7CiAJCWlhdHRyLmlhX3NpemUgPSBuZXdfc2l6ZTsKLQkJZXJyb3IgPSB4ZnNfc2V0YXR0cihpcCwgJmlhdHRyLCBYRlNfQVRUUl9OT0xPQ0ssIE5VTEwpOworCQllcnJvciA9IHhmc19zZXRhdHRyKGlwLCAmaWF0dHIsIFhGU19BVFRSX05PTE9DSyk7CiAJfQogCiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CkBAIC02NjEsNiArNjU1LDg4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisjZGVmaW5lIFhGU19GSUVNQVBfRkxBR1MJKEZJRU1BUF9GTEFHX1NZTkN8RklFTUFQX0ZMQUdfWEFUVFIpCisKKy8qCisgKiBDYWxsIGZpZW1hcCBoZWxwZXIgdG8gZmlsbCBpbiB1c2VyIGRhdGEuCisgKiBSZXR1cm5zIHBvc2l0aXZlIGVycm9ycyB0byB4ZnNfZ2V0Ym1hcC4KKyAqLworU1RBVElDIGludAoreGZzX2ZpZW1hcF9mb3JtYXQoCisJdm9pZAkJCSoqYXJnLAorCXN0cnVjdCBnZXRibWFweAkJKmJtdiwKKwlpbnQJCQkqZnVsbCkKK3sKKwlpbnQJCQllcnJvcjsKKwlzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvID0gKmFyZzsKKwl1MzIJCQlmaWVtYXBfZmxhZ3MgPSAwOworCXU2NAkJCWxvZ2ljYWwsIHBoeXNpY2FsLCBsZW5ndGg7CisKKwkvKiBEbyBub3RoaW5nIGZvciBhIGhvbGUgKi8KKwlpZiAoYm12LT5ibXZfYmxvY2sgPT0gLTFMTCkKKwkJcmV0dXJuIDA7CisKKwlsb2dpY2FsID0gQkJUT0IoYm12LT5ibXZfb2Zmc2V0KTsKKwlwaHlzaWNhbCA9IEJCVE9CKGJtdi0+Ym12X2Jsb2NrKTsKKwlsZW5ndGggPSBCQlRPQihibXYtPmJtdl9sZW5ndGgpOworCisJaWYgKGJtdi0+Ym12X29mbGFncyAmIEJNVl9PRl9QUkVBTExPQykKKwkJZmllbWFwX2ZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOOworCWVsc2UgaWYgKGJtdi0+Ym12X29mbGFncyAmIEJNVl9PRl9ERUxBTExPQykgeworCQlmaWVtYXBfZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9ERUxBTExPQzsKKwkJcGh5c2ljYWwgPSAwOyAgIC8qIG5vIGJsb2NrIHlldCAqLworCX0KKwlpZiAoYm12LT5ibXZfb2ZsYWdzICYgQk1WX09GX0xBU1QpCisJCWZpZW1hcF9mbGFncyB8PSBGSUVNQVBfRVhURU5UX0xBU1Q7CisKKwllcnJvciA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIGxvZ2ljYWwsIHBoeXNpY2FsLAorCQkJCQlsZW5ndGgsIGZpZW1hcF9mbGFncyk7CisJaWYgKGVycm9yID4gMCkgeworCQllcnJvciA9IDA7CisJCSpmdWxsID0gMTsJLyogdXNlciBhcnJheSBub3cgZnVsbCAqLworCX0KKworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc192bl9maWVtYXAoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwl1NjQJCQlzdGFydCwKKwl1NjQJCQlsZW5ndGgpCit7CisJeGZzX2lub2RlX3QJCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgZ2V0Ym1hcHgJCWJtOworCWludAkJCWVycm9yOworCisJZXJyb3IgPSBmaWVtYXBfY2hlY2tfZmxhZ3MoZmllaW5mbywgWEZTX0ZJRU1BUF9GTEFHUyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBTZXQgdXAgYm1hcCBoZWFkZXIgZm9yIHhmcyBpbnRlcm5hbCByb3V0aW5lICovCisJYm0uYm12X29mZnNldCA9IEJUT0JCKHN0YXJ0KTsKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIHdob2xlIGZpbGUgKi8KKwlpZiAobGVuZ3RoID09IEZJRU1BUF9NQVhfT0ZGU0VUKQorCQlibS5ibXZfbGVuZ3RoID0gLTFMTDsKKwllbHNlCisJCWJtLmJtdl9sZW5ndGggPSBCVE9CQihsZW5ndGgpOworCisJLyogb3VyIGZvcm1hdHRlciB3aWxsIHRlbGwgeGZzX2dldGJtYXAgd2hlbiB0byBzdG9wLiAqLworCWJtLmJtdl9jb3VudCA9IE1BWEVYVE5VTTsKKwlibS5ibXZfaWZsYWdzID0gQk1WX0lGX1BSRUFMTE9DOworCWlmIChmaWVpbmZvLT5maV9mbGFncyAmIEZJRU1BUF9GTEFHX1hBVFRSKQorCQlibS5ibXZfaWZsYWdzIHw9IEJNVl9JRl9BVFRSRk9SSzsKKwlpZiAoIShmaWVpbmZvLT5maV9mbGFncyAmIEZJRU1BUF9GTEFHX1NZTkMpKQorCQlibS5ibXZfaWZsYWdzIHw9IEJNVl9JRl9ERUxBTExPQzsKKworCWVycm9yID0geGZzX2dldGJtYXAoaXAsICZibSwgeGZzX2ZpZW1hcF9mb3JtYXQsIGZpZWluZm8pOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgeGZzX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnBlcm1pc3Npb24JCT0geGZzX3ZuX3Blcm1pc3Npb24sCiAJLnRydW5jYXRlCQk9IHhmc192bl90cnVuY2F0ZSwKQEAgLTY3MSw2ICs3NDcsNyBAQAogCS5yZW1vdmV4YXR0cgkJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5saXN0eGF0dHIJCT0geGZzX3ZuX2xpc3R4YXR0ciwKIAkuZmFsbG9jYXRlCQk9IHhmc192bl9mYWxsb2NhdGUsCisJLmZpZW1hcAkJCT0geGZzX3ZuX2ZpZW1hcCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB4ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CkBAIC03NjYsMTIgKzg0MywyMCBAQAogICogV2hlbiByZWFkaW5nIGV4aXN0aW5nIGlub2RlcyBmcm9tIGRpc2sgdGhpcyBpcyBjYWxsZWQgZGlyZWN0bHkKICAqIGZyb20geGZzX2lnZXQsIHdoZW4gY3JlYXRpbmcgYSBuZXcgaW5vZGUgaXQgaXMgY2FsbGVkIGZyb20KICAqIHhmc19pYWxsb2MgYWZ0ZXIgc2V0dGluZyB1cCB0aGUgaW5vZGUuCisgKgorICogV2UgYXJlIGFsd2F5cyBjYWxsZWQgd2l0aCBhbiB1bmluaXRpYWxpc2VkIGxpbnV4IGlub2RlIGhlcmUuCisgKiBXZSBuZWVkIHRvIGluaXRpYWxpc2UgdGhlIG5lY2Vzc2FyeSBmaWVsZHMgYW5kIHRha2UgYSByZWZlcmVuY2UKKyAqIG9uIGl0LgogICovCiB2b2lkCiB4ZnNfc2V0dXBfaW5vZGUoCiAJc3RydWN0IHhmc19pbm9kZQkqaXApCiB7Ci0Jc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpcC0+aV92bm9kZTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9ICZpcC0+aV92bm9kZTsKKworCWlub2RlLT5pX2lubyA9IGlwLT5pX2lubzsKKwlpbm9kZS0+aV9zdGF0ZSA9IElfTkVXfElfTE9DSzsKKwlpbm9kZV9hZGRfdG9fbGlzdHMoaXAtPmlfbW91bnQtPm1fc3VwZXIsIGlub2RlKTsKIAogCWlub2RlLT5pX21vZGUJPSBpcC0+aV9kLmRpX21vZGU7CiAJaW5vZGUtPmlfbmxpbmsJPSBpcC0+aV9kLmRpX25saW5rOwpAQCAtNzk5LDcgKzg4NCw2IEBACiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjCT0gaXAtPmlfZC5kaV9jdGltZS50X3NlYzsKIAlpbm9kZS0+aV9jdGltZS50dl9uc2VjCT0gaXAtPmlfZC5kaV9jdGltZS50X25zZWM7CiAJeGZzX2RpZmxhZ3NfdG9faWZsYWdzKGlub2RlLCBpcCk7Ci0JeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lNT0RJRklFRCk7CiAKIAlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKIAljYXNlIFNfSUZSRUc6CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmgKaW5kZXggOGIxYTFlMy4uZWY0MWM5MiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaApAQCAtMjIsNyArMjIsNiBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4ZnNfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeGZzX2Rpcl9maWxlX29wZXJhdGlvbnM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOwogCiBleHRlcm4gc3NpemVfdCB4ZnNfdm5fbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAppbmRleCBjYzBmN2IzLi41MDc0OTJkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKQEAgLTIxLDE4ICsyMSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qCi0gKiBTb21lIHR5cGVzIGFyZSBjb25kaXRpb25hbCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBzeXN0ZW0uCiAgKiBYRlNfQklHX0JMS05PUyBuZWVkcyBibG9jayBsYXllciBkaXNrIGFkZHJlc3NlcyB0byBiZSA2NCBiaXRzLgotICogWEZTX0JJR19JTlVNUyBuZWVkcyB0aGUgVkZTIGlub2RlIG51bWJlciB0byBiZSA2NCBiaXRzLCBhcyB3ZWxsCi0gKiBhcyByZXF1aXJpbmcgWEZTX0JJR19CTEtOT1MgdG8gYmUgc2V0LgorICogWEZTX0JJR19JTlVNUyByZXF1aXJlcyBYRlNfQklHX0JMS05PUyB0byBiZSBzZXQuCiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19MQkQpIHx8IChCSVRTX1BFUl9MT05HID09IDY0KQogIyBkZWZpbmUgWEZTX0JJR19CTEtOT1MJMQotIyBpZiBCSVRTX1BFUl9MT05HID09IDY0Ci0jICBkZWZpbmUgWEZTX0JJR19JTlVNUwkxCi0jIGVsc2UKLSMgIGRlZmluZSBYRlNfQklHX0lOVU1TCTAKLSMgZW5kaWYKKyMgZGVmaW5lIFhGU19CSUdfSU5VTVMJMQogI2Vsc2UKICMgZGVmaW5lIFhGU19CSUdfQkxLTk9TCTAKICMgZGVmaW5lIFhGU19CSUdfSU5VTVMJMApAQCAtNzcsNiArNzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC04NSw3ICs4MCw2IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAotI2luY2x1ZGUgPHhmc192ZnMuaD4KICNpbmNsdWRlIDx4ZnNfY3JlZC5oPgogI2luY2x1ZGUgPHhmc192bm9kZS5oPgogI2luY2x1ZGUgPHhmc19zdGF0cy5oPgpAQCAtMTA3LDcgKzEwMSw2IEBACiAjdW5kZWYgIEhBVkVfUEVSQ1BVX1NCCS8qIHBlciBjcHUgc3VwZXJibG9jayBjb3VudGVycyBhcmUgYSAyLjYgZmVhdHVyZSAqLwogI2VuZGlmCiAKLSNkZWZpbmUgcmVzdHJpY3RlZF9jaG93bgl4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLnZhbAogI2RlZmluZSBpcml4X3NnaWRfaW5oZXJpdAl4ZnNfcGFyYW1zLnNnaWRfaW5oZXJpdC52YWwKICNkZWZpbmUgaXJpeF9zeW1saW5rX21vZGUJeGZzX3BhcmFtcy5zeW1saW5rX21vZGUudmFsCiAjZGVmaW5lIHhmc19wYW5pY19tYXNrCQl4ZnNfcGFyYW1zLnBhbmljX21hc2sudmFsCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCmluZGV4IDE5NTdlNTM1Li43ZTkwZGFhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwpAQCAtNTEsNyArNTEsNiBAQAogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgogCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAKIApAQCAtMjQzLDcgKzI0Miw3IEBACiAKIAlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgewogCQlpZiAoaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykKLQkJCXJldCA9IHhmc19mbHVzaGludmFsX3BhZ2VzKGlwLCAoKm9mZnNldCAmIFBBR0VfQ0FDSEVfTUFTSyksCisJCQlyZXQgPSAteGZzX2ZsdXNoaW52YWxfcGFnZXMoaXAsICgqb2Zmc2V0ICYgUEFHRV9DQUNIRV9NQVNLKSwKIAkJCQkJCSAgICAtMSwgRklfUkVNQVBGX0xPQ0tFRCk7CiAJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlpZiAocmV0KSB7CkBAIC02NjgsMTUgKzY2Nyw4IEBACiAJaWYgKG5ld19zaXplID4geGlwLT5pX3NpemUpCiAJCXhpcC0+aV9uZXdfc2l6ZSA9IG5ld19zaXplOwogCi0JLyoKLQkgKiBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRpbWVzdGFtcHMgaW4gcmVhZG9ubHktbW91bnRlZAotCSAqIGZpbGVzeXN0ZW1zLiAgVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KLQkgKi8KLQlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSAmJgotCQkgICAhbW50X3dhbnRfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCkpKSB7CisJaWYgKGxpa2VseSghKGlvZmxhZ3MgJiBJT19JTlZJUykpKQogCQl4ZnNfaWNoZ3RpbWUoeGlwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7Ci0JCW1udF9kcm9wX3dyaXRlKGZpbGUtPmZfcGF0aC5tbnQpOwotCX0KIAogCS8qCiAJICogSWYgdGhlIG9mZnNldCBpcyBiZXlvbmQgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHdlIGhhdmUgYSBjb3VwbGUKQEAgLTcxNSw3ICs3MDcsNiBAQAogCQl9CiAJfQogCi1yZXRyeToKIAkvKiBXZSBjYW4gd3JpdGUgYmFjayB0aGlzIHF1ZXVlIGluIHBhZ2UgcmVjbGFpbSAqLwogCWN1cnJlbnQtPmJhY2tpbmdfZGV2X2luZm8gPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwogCkBAIC03NzEsNiArNzYyLDE3IEBACiAJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShpb2ZsYWdzICYgSU9fSVNBSU8pKQogCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoaW9jYik7CiAKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCAmJiByZXQgIT0gLUVGQVVMVCAmJiAqb2Zmc2V0ID4gaXNpemUpKQorCQkqb2Zmc2V0ID0gaXNpemU7CisKKwlpZiAoKm9mZnNldCA+IHhpcC0+aV9zaXplKSB7CisJCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKCpvZmZzZXQgPiB4aXAtPmlfc2l6ZSkKKwkJCXhpcC0+aV9zaXplID0gKm9mZnNldDsKKwkJeGZzX2l1bmxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCiAJaWYgKHJldCA9PSAtRU5PU1BDICYmCiAJICAgIERNX0VWRU5UX0VOQUJMRUQoeGlwLCBETV9FVkVOVF9OT1NQQUNFKSAmJiAhKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKIAkJeGZzX2l1bmxvY2soeGlwLCBpb2xvY2spOwpAQCAtNzg0LDIwICs3ODYsNyBAQAogCQl4ZnNfaWxvY2soeGlwLCBpb2xvY2spOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7Ci0JCXBvcyA9IHhpcC0+aV9zaXplOwotCQlyZXQgPSAwOwotCQlnb3RvIHJldHJ5OwotCX0KLQotCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWlmICh1bmxpa2VseShyZXQgPCAwICYmIHJldCAhPSAtRUZBVUxUICYmICpvZmZzZXQgPiBpc2l6ZSkpCi0JCSpvZmZzZXQgPSBpc2l6ZTsKLQotCWlmICgqb2Zmc2V0ID4geGlwLT5pX3NpemUpIHsKLQkJeGZzX2lsb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQlpZiAoKm9mZnNldCA+IHhpcC0+aV9zaXplKQotCQkJeGlwLT5pX3NpemUgPSAqb2Zmc2V0OwotCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJZ290byBzdGFydDsKIAl9CiAKIAllcnJvciA9IC1yZXQ7CkBAIC04NTUsMTMgKzg0NCw3IEBACiBpbnQKIHhmc19iZHN0cmF0X2NiKHN0cnVjdCB4ZnNfYnVmICpicCkKIHsKLQl4ZnNfbW91bnRfdAkqbXA7Ci0KLQltcCA9IFhGU19CVUZfRlNQUklWQVRFMyhicCwgeGZzX21vdW50X3QgKik7Ci0JaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQl4ZnNfYnVmX2lvcmVxdWVzdChicCk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oYnAtPmJfbW91bnQpKSB7CiAJCXhmc19idWZ0cmFjZSgiWEZTX19CRFNUUkFUIElPRVJST1IiLCBicCk7CiAJCS8qCiAJCSAqIE1ldGFkYXRhIHdyaXRlIHRoYXQgZGlkbid0IGdldCBsb2dnZWQgYnV0CkBAIC04NzQsNiArODU3LDkgQEAKIAkJZWxzZQogCQkJcmV0dXJuICh4ZnNfYmlvZXJyb3IoYnApKTsKIAl9CisKKwl4ZnNfYnVmX2lvcmVxdWVzdChicCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwppbmRleCAzZDViNjdjLi5jMzUyNmQ0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMKQEAgLTUzLDExICs1MywxNSBAQAogCQl7ICJpY2x1c3RlciIsCQlYRlNTVEFUX0VORF9JTk9ERV9DTFVTVEVSCX0sCiAJCXsgInZub2RlcyIsCQlYRlNTVEFUX0VORF9WTk9ERV9PUFMJCX0sCiAJCXsgImJ1ZiIsCQlYRlNTVEFUX0VORF9CVUYJCQl9LAorCQl7ICJhYnRiMiIsCQlYRlNTVEFUX0VORF9BQlRCX1YyCQl9LAorCQl7ICJhYnRjMiIsCQlYRlNTVEFUX0VORF9BQlRDX1YyCQl9LAorCQl7ICJibWJ0MiIsCQlYRlNTVEFUX0VORF9CTUJUX1YyCQl9LAorCQl7ICJpYnQyIiwJCVhGU1NUQVRfRU5EX0lCVF9WMgkJfSwKIAl9OwogCiAJLyogTG9vcCBvdmVyIGFsbCBzdGF0cyBncm91cHMgKi8KIAlmb3IgKGk9aj1sZW4gPSAwOyBpIDwgQVJSQVlfU0laRSh4c3RhdHMpOyBpKyspIHsKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCB4c3RhdHNbaV0uZGVzYyk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiVzIiwgeHN0YXRzW2ldLmRlc2MpOwogCQkvKiBpbm5lciBsb29wIGRvZXMgZWFjaCBncm91cCAqLwogCQl3aGlsZSAoaiA8IHhzdGF0c1tpXS5lbmRwb2ludCkgewogCQkJdmFsID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCmluZGV4IGU4MzgyMGYuLjczNjg1NGIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaApAQCAtMTE4LDYgKzExOCw3MSBAQAogCV9fdWludDMyX3QJCXhiX3BhZ2VfcmV0cmllczsKIAlfX3VpbnQzMl90CQl4Yl9wYWdlX2ZvdW5kOwogCV9fdWludDMyX3QJCXhiX2dldF9yZWFkOworLyogVmVyc2lvbiAyIGJ0cmVlIGNvdW50ZXJzICovCisjZGVmaW5lIFhGU1NUQVRfRU5EX0FCVEJfVjIJCShYRlNTVEFUX0VORF9CVUYrMTUpCisJX191aW50MzJfdAkJeHNfYWJ0Yl8yX2xvb2t1cDsKKwlfX3VpbnQzMl90CQl4c19hYnRiXzJfY29tcGFyZTsKKwlfX3VpbnQzMl90CQl4c19hYnRiXzJfaW5zcmVjOworCV9fdWludDMyX3QJCXhzX2FidGJfMl9kZWxyZWM7CisJX191aW50MzJfdAkJeHNfYWJ0Yl8yX25ld3Jvb3Q7CisJX191aW50MzJfdAkJeHNfYWJ0Yl8yX2tpbGxyb290OworCV9fdWludDMyX3QJCXhzX2FidGJfMl9pbmNyZW1lbnQ7CisJX191aW50MzJfdAkJeHNfYWJ0Yl8yX2RlY3JlbWVudDsKKwlfX3VpbnQzMl90CQl4c19hYnRiXzJfbHNoaWZ0OworCV9fdWludDMyX3QJCXhzX2FidGJfMl9yc2hpZnQ7CisJX191aW50MzJfdAkJeHNfYWJ0Yl8yX3NwbGl0OworCV9fdWludDMyX3QJCXhzX2FidGJfMl9qb2luOworCV9fdWludDMyX3QJCXhzX2FidGJfMl9hbGxvYzsKKwlfX3VpbnQzMl90CQl4c19hYnRiXzJfZnJlZTsKKwlfX3VpbnQzMl90CQl4c19hYnRiXzJfbW92ZXM7CisjZGVmaW5lIFhGU1NUQVRfRU5EX0FCVENfVjIJCShYRlNTVEFUX0VORF9BQlRCX1YyKzE1KQorCV9fdWludDMyX3QJCXhzX2FidGNfMl9sb29rdXA7CisJX191aW50MzJfdAkJeHNfYWJ0Y18yX2NvbXBhcmU7CisJX191aW50MzJfdAkJeHNfYWJ0Y18yX2luc3JlYzsKKwlfX3VpbnQzMl90CQl4c19hYnRjXzJfZGVscmVjOworCV9fdWludDMyX3QJCXhzX2FidGNfMl9uZXdyb290OworCV9fdWludDMyX3QJCXhzX2FidGNfMl9raWxscm9vdDsKKwlfX3VpbnQzMl90CQl4c19hYnRjXzJfaW5jcmVtZW50OworCV9fdWludDMyX3QJCXhzX2FidGNfMl9kZWNyZW1lbnQ7CisJX191aW50MzJfdAkJeHNfYWJ0Y18yX2xzaGlmdDsKKwlfX3VpbnQzMl90CQl4c19hYnRjXzJfcnNoaWZ0OworCV9fdWludDMyX3QJCXhzX2FidGNfMl9zcGxpdDsKKwlfX3VpbnQzMl90CQl4c19hYnRjXzJfam9pbjsKKwlfX3VpbnQzMl90CQl4c19hYnRjXzJfYWxsb2M7CisJX191aW50MzJfdAkJeHNfYWJ0Y18yX2ZyZWU7CisJX191aW50MzJfdAkJeHNfYWJ0Y18yX21vdmVzOworI2RlZmluZSBYRlNTVEFUX0VORF9CTUJUX1YyCQkoWEZTU1RBVF9FTkRfQUJUQ19WMisxNSkKKwlfX3VpbnQzMl90CQl4c19ibWJ0XzJfbG9va3VwOworCV9fdWludDMyX3QJCXhzX2JtYnRfMl9jb21wYXJlOworCV9fdWludDMyX3QJCXhzX2JtYnRfMl9pbnNyZWM7CisJX191aW50MzJfdAkJeHNfYm1idF8yX2RlbHJlYzsKKwlfX3VpbnQzMl90CQl4c19ibWJ0XzJfbmV3cm9vdDsKKwlfX3VpbnQzMl90CQl4c19ibWJ0XzJfa2lsbHJvb3Q7CisJX191aW50MzJfdAkJeHNfYm1idF8yX2luY3JlbWVudDsKKwlfX3VpbnQzMl90CQl4c19ibWJ0XzJfZGVjcmVtZW50OworCV9fdWludDMyX3QJCXhzX2JtYnRfMl9sc2hpZnQ7CisJX191aW50MzJfdAkJeHNfYm1idF8yX3JzaGlmdDsKKwlfX3VpbnQzMl90CQl4c19ibWJ0XzJfc3BsaXQ7CisJX191aW50MzJfdAkJeHNfYm1idF8yX2pvaW47CisJX191aW50MzJfdAkJeHNfYm1idF8yX2FsbG9jOworCV9fdWludDMyX3QJCXhzX2JtYnRfMl9mcmVlOworCV9fdWludDMyX3QJCXhzX2JtYnRfMl9tb3ZlczsKKyNkZWZpbmUgWEZTU1RBVF9FTkRfSUJUX1YyCQkoWEZTU1RBVF9FTkRfQk1CVF9WMisxNSkKKwlfX3VpbnQzMl90CQl4c19pYnRfMl9sb29rdXA7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfY29tcGFyZTsKKwlfX3VpbnQzMl90CQl4c19pYnRfMl9pbnNyZWM7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfZGVscmVjOworCV9fdWludDMyX3QJCXhzX2lidF8yX25ld3Jvb3Q7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfa2lsbHJvb3Q7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfaW5jcmVtZW50OworCV9fdWludDMyX3QJCXhzX2lidF8yX2RlY3JlbWVudDsKKwlfX3VpbnQzMl90CQl4c19pYnRfMl9sc2hpZnQ7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfcnNoaWZ0OworCV9fdWludDMyX3QJCXhzX2lidF8yX3NwbGl0OworCV9fdWludDMyX3QJCXhzX2lidF8yX2pvaW47CisJX191aW50MzJfdAkJeHNfaWJ0XzJfYWxsb2M7CisJX191aW50MzJfdAkJeHNfaWJ0XzJfZnJlZTsKKwlfX3VpbnQzMl90CQl4c19pYnRfMl9tb3ZlczsKIC8qIEV4dHJhIHByZWNpc2lvbiBjb3VudGVycyAqLwogCV9fdWludDY0X3QJCXhzX3hzdHJhdF9ieXRlczsKIAlfX3VpbnQ2NF90CQl4c193cml0ZV9ieXRlczsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDM3ZWJlMzYuLjM2ZjZjYzcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCi0jaW5jbHVkZSAieGZzX2NsbnQuaCIKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgpAQCAtMzYsNiArMzUsNyBAQAogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc191dGlscy5oIgogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgotI2luY2x1ZGUgInhmc192ZnNvcHMuaCIKICNpbmNsdWRlICJ4ZnNfdmVyc2lvbi5oIgogI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCkBAIC01OCw2ICs1Nyw3IEBACiAjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgogI2luY2x1ZGUgInhmc19tcnVfY2FjaGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19zeW5jLmgiCiAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTcwLDM2ICs3MCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIHhmc19xdW90YWN0bF9vcGVyYXRpb25zOwogc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHhmc19zdXBlcl9vcGVyYXRpb25zOwotc3RhdGljIGttZW1fem9uZV90ICp4ZnNfdm5vZGVfem9uZTsKIHN0YXRpYyBrbWVtX3pvbmVfdCAqeGZzX2lvZW5kX3pvbmU7CiBtZW1wb29sX3QgKnhmc19pb2VuZF9wb29sOwogCi1TVEFUSUMgc3RydWN0IHhmc19tb3VudF9hcmdzICoKLXhmc19hcmdzX2FsbG9jYXRlKAotCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCi0JaW50CQkJc2lsZW50KQotewotCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJnczsKLQotCWFyZ3MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX21vdW50X2FyZ3MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFyZ3MpCi0JCXJldHVybiBOVUxMOwotCi0JYXJncy0+bG9nYnVmcyA9IGFyZ3MtPmxvZ2J1ZnNpemUgPSAtMTsKLQlzdHJuY3B5KGFyZ3MtPmZzbmFtZSwgc2ItPnNfaWQsIE1BWE5BTUVMRU4pOwotCi0JLyogQ29weSB0aGUgYWxyZWFkeS1wYXJzZWQgbW91bnQoMikgZmxhZ3Mgd2UncmUgaW50ZXJlc3RlZCBpbiAqLwotCWlmIChzYi0+c19mbGFncyAmIE1TX0RJUlNZTkMpCi0JCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ESVJTWU5DOwotCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQotCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfV1NZTkM7Ci0JaWYgKHNpbGVudCkKLQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1FVSUVUOwotCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF8zMkJJVElOT0RFUzsKLQotCXJldHVybiBhcmdzOwotfQotCiAjZGVmaW5lIE1OVE9QVF9MT0dCVUZTCSJsb2didWZzIgkvKiBudW1iZXIgb2YgWEZTIGxvZyBidWZmZXJzICovCiAjZGVmaW5lIE1OVE9QVF9MT0dCU0laRQkibG9nYnNpemUiCS8qIHNpemUgb2YgWEZTIGxvZyBidWZmZXJzICovCiAjZGVmaW5lIE1OVE9QVF9MT0dERVYJImxvZ2RldiIJLyogbG9nIGRldmljZSAqLwpAQCAtMTg4LDI2ICsxNjEsNTQgQEAKIAlyZXR1cm4gc2ltcGxlX3N0cnRvdWwoKGNvbnN0IGNoYXIgKilzLCBlbmRwLCBiYXNlKSA8PCBzaGlmdF9sZWZ0X2ZhY3RvcjsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4geGZzX21vdW50X3QgZmllbGRzIGJhc2VkIG9uIG1vdW50IGFyZ3MuCisgKiBOb3RlOiB0aGUgc3VwZXJibG9jayBoYXMgX25vdF8geWV0IGJlZW4gcmVhZCBpbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBsZWFrcyB0aGUgdmFyaW91cyBkZXZpY2UgbmFtZSBhbGxvY2F0aW9ucyBvbgorICogZmFpbHVyZS4gIFRoZSBjYWxsZXIgdGFrZXMgY2FyZSBvZiB0aGVtLgorICovCiBTVEFUSUMgaW50CiB4ZnNfcGFyc2VhcmdzKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCWNoYXIJCQkqb3B0aW9ucywKLQlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MsCi0JaW50CQkJdXBkYXRlKQorCWNoYXIJCQkqKm10cHQpCiB7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IG1wLT5tX3N1cGVyOwogCWNoYXIJCQkqdGhpc19jaGFyLCAqdmFsdWUsICplb3Y7Ci0JaW50CQkJZHN1bml0LCBkc3dpZHRoLCB2b2xfZHN1bml0LCB2b2xfZHN3aWR0aDsKLQlpbnQJCQlpb3NpemU7CisJaW50CQkJZHN1bml0ID0gMDsKKwlpbnQJCQlkc3dpZHRoID0gMDsKKwlpbnQJCQlpb3NpemUgPSAwOwogCWludAkJCWRtYXBpX2ltcGxpZXNfaWtlZXAgPSAxOworCXVjaGFyX3QJCQlpb3NpemVsb2cgPSAwOwogCi0JYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0JBUlJJRVI7Ci0JYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfQ09NUEFUX0lPU0laRTsKKwkvKgorCSAqIENvcHkgYmluYXJ5IFZGUyBtb3VudCBmbGFncyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKwkgKi8KKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9SRE9OTFk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfRElSU1lOQykKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RJUlNZTkM7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9XU1lOQzsKKworCS8qCisJICogU2V0IHNvbWUgZGVmYXVsdCBmbGFncyB0aGF0IGNvdWxkIGJlIGNsZWFyZWQgYnkgdGhlIG1vdW50IG9wdGlvbgorCSAqIHBhcnNpbmcuCisJICovCisJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0JBUlJJRVI7CisJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0NPTVBBVF9JT1NJWkU7CisJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1NNQUxMX0lOVU1TOworCisJLyoKKwkgKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgbW91bnQgb3B0aW9uIHBhcnNpbmcuCisJICovCisJbXAtPm1fbG9nYnVmcyA9IC0xOworCW1wLT5tX2xvZ2JzaXplID0gLTE7CiAKIAlpZiAoIW9wdGlvbnMpCiAJCWdvdG8gZG9uZTsKIAotCWlvc2l6ZSA9IGRzdW5pdCA9IGRzd2lkdGggPSB2b2xfZHN1bml0ID0gdm9sX2Rzd2lkdGggPSAwOwotCiAJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKIAkJaWYgKCEqdGhpc19jaGFyKQogCQkJY29udGludWU7CkBAIC0yMjEsNyArMjIyLDcgQEAKIAkJCQkJdGhpc19jaGFyKTsKIAkJCQlyZXR1cm4gRUlOVkFMOwogCQkJfQotCQkJYXJncy0+bG9nYnVmcyA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCQltcC0+bV9sb2didWZzID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xPR0JTSVpFKSkgewogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CiAJCQkJY21uX2VycihDRV9XQVJOLApAQCAtMjI5LDcgKzIzMCw3IEBACiAJCQkJCXRoaXNfY2hhcik7CiAJCQkJcmV0dXJuIEVJTlZBTDsKIAkJCX0KLQkJCWFyZ3MtPmxvZ2J1ZnNpemUgPSBzdWZmaXhfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQkJbXAtPm1fbG9nYnNpemUgPSBzdWZmaXhfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTE9HREVWKSkgewogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CiAJCQkJY21uX2VycihDRV9XQVJOLApAQCAtMjM3LDcgKzIzOCw5IEBACiAJCQkJCXRoaXNfY2hhcik7CiAJCQkJcmV0dXJuIEVJTlZBTDsKIAkJCX0KLQkJCXN0cm5jcHkoYXJncy0+bG9nbmFtZSwgdmFsdWUsIE1BWE5BTUVMRU4pOworCQkJbXAtPm1fbG9nbmFtZSA9IGtzdHJuZHVwKHZhbHVlLCBNQVhOQU1FTEVOLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghbXAtPm1fbG9nbmFtZSkKKwkJCQlyZXR1cm4gRU5PTUVNOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTVRQVCkpIHsKIAkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewogCQkJCWNtbl9lcnIoQ0VfV0FSTiwKQEAgLTI0NSw3ICsyNDgsOSBAQAogCQkJCQl0aGlzX2NoYXIpOwogCQkJCXJldHVybiBFSU5WQUw7CiAJCQl9Ci0JCQlzdHJuY3B5KGFyZ3MtPm10cHQsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJCSptdHB0ID0ga3N0cm5kdXAodmFsdWUsIE1BWE5BTUVMRU4sIEdGUF9LRVJORUwpOworCQkJaWYgKCEqbXRwdCkKKwkJCQlyZXR1cm4gRU5PTUVNOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUlRERVYpKSB7CiAJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKIAkJCQljbW5fZXJyKENFX1dBUk4sCkBAIC0yNTMsNyArMjU4LDkgQEAKIAkJCQkJdGhpc19jaGFyKTsKIAkJCQlyZXR1cm4gRUlOVkFMOwogCQkJfQotCQkJc3RybmNweShhcmdzLT5ydG5hbWUsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJCW1wLT5tX3J0bmFtZSA9IGtzdHJuZHVwKHZhbHVlLCBNQVhOQU1FTEVOLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghbXAtPm1fcnRuYW1lKQorCQkJCXJldHVybiBFTk9NRU07CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CSU9TSVpFKSkgewogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CiAJCQkJY21uX2VycihDRV9XQVJOLApAQCAtMjYyLDggKzI2OSw3IEBACiAJCQkJcmV0dXJuIEVJTlZBTDsKIAkJCX0KIAkJCWlvc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSU9TSVpFOwotCQkJYXJncy0+aW9zaXplbG9nID0gKHVpbnQ4X3QpIGlvc2l6ZTsKKwkJCWlvc2l6ZWxvZyA9IGZmcyhpb3NpemUpIC0gMTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0FMTE9DU0laRSkpIHsKIAkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewogCQkJCWNtbl9lcnIoQ0VfV0FSTiwKQEAgLTI3Miw4ICsyNzgsNyBAQAogCQkJCXJldHVybiBFSU5WQUw7CiAJCQl9CiAJCQlpb3NpemUgPSBzdWZmaXhfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOwotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lPU0laRTsKLQkJCWFyZ3MtPmlvc2l6ZWxvZyA9IGZmcyhpb3NpemUpIC0gMTsKKwkJCWlvc2l6ZWxvZyA9IGZmcyhpb3NpemUpIC0gMTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dSUElEKSB8fAogCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CU0RHUk9VUFMpKSB7CiAJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfR1JQSUQ7CkBAIC0yODEsMjMgKzI4NiwyNSBAQAogCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TWVNWR1JPVVBTKSkgewogCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9HUlBJRDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1dTWU5DKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1dTWU5DOworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1dTWU5DOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfT1NZTkNJU09TWU5DKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX09TWU5DSVNPU1lOQzsKKwkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9PU1lOQ0lTT1NZTkM7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1JFQ09WRVJZKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PUkVDT1ZFUlk7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9SRUNPVkVSWTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lOTzY0KSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lOTzY0OwotI2lmICFYRlNfQklHX0lOVU1TCisjaWYgWEZTX0JJR19JTlVNUworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lOTzY0OworCQkJbXAtPm1faW5vYWRkID0gWEZTX0lOTzY0X09GRlNFVDsKKyNlbHNlCiAJCQljbW5fZXJyKENFX1dBUk4sCiAJCQkJIlhGUzogJXMgb3B0aW9uIG5vdCBhbGxvd2VkIG9uIHRoaXMgc3lzdGVtIiwKIAkJCQl0aGlzX2NoYXIpOwogCQkJcmV0dXJuIEVJTlZBTDsKICNlbmRpZgogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9BTElHTikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT0FMSUdOOworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PQUxJR047CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TV0FMTE9DKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1NXQUxMT0M7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfU1dBTExPQzsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1NVTklUKSkgewogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CiAJCQkJY21uX2VycihDRV9XQVJOLApAQCAtMzE1LDcgKzMyMiw3IEBACiAJCQl9CiAJCQlkc3dpZHRoID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUXzY0QklUSU5PREUpKSB7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UXzMyQklUSU5PREVTOworCQkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9TTUFMTF9JTlVNUzsKICNpZiAhWEZTX0JJR19JTlVNUwogCQkJY21uX2VycihDRV9XQVJOLAogCQkJCSJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbSIsCkBAIC0zMjMsNTYgKzMzMCw2MSBAQAogCQkJcmV0dXJuIEVJTlZBTDsKICNlbmRpZgogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9VVUlEKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PVVVJRDsKKwkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT1VVSUQ7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CQVJSSUVSKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0JBUlJJRVI7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQkFSUklFUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQkFSUklFUikpIHsKLQkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQkFSUklFUjsKKwkJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lLRUVQKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lLRUVQOworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lLRUVQOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9JS0VFUCkpIHsKIAkJCWRtYXBpX2ltcGxpZXNfaWtlZXAgPSAwOwotCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9JS0VFUDsKKwkJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfSUtFRVA7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MQVJHRUlPKSkgewotCQkJYXJncy0+ZmxhZ3MyICY9IH5YRlNNTlQyX0NPTVBBVF9JT1NJWkU7CisJCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0NPTVBBVF9JT1NJWkU7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0xBUkdFSU8pKSB7Ci0JCQlhcmdzLT5mbGFnczIgfD0gWEZTTU5UMl9DT01QQVRfSU9TSVpFOworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0NPTVBBVF9JT1NJWkU7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9BVFRSMikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9BVFRSMjsKKwkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9BVFRSMjsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQVRUUjIpKSB7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0FUVFIyOwotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PQVRUUjI7CisJCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0FUVFIyOworCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PQVRUUjI7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9GSUxFU1RSRUFNKSkgewotCQkJYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfRklMRVNUUkVBTVM7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRklMRVNUUkVBTVM7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1FVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgJj0gfihYRlNNTlRfVVFVT1RBRU5GfFhGU01OVF9VUVVPVEEpOwotCQkJYXJncy0+ZmxhZ3MgJj0gfihYRlNNTlRfR1FVT1RBRU5GfFhGU01OVF9HUVVPVEEpOworCQkJbXAtPm1fcWZsYWdzICY9IH4oWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX1VRVU9UQV9BQ1RJVkUgfAorCQkJCQkgIFhGU19HUVVPVEFfQUNDVCB8IFhGU19HUVVPVEFfQUNUSVZFIHwKKwkJCQkJICBYRlNfUFFVT1RBX0FDQ1QgfCBYRlNfUFFVT1RBX0FDVElWRSB8CisJCQkJCSAgWEZTX1VRVU9UQV9FTkZEIHwgWEZTX09RVU9UQV9FTkZEKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1FVT1RBKSB8fAogCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VUVVPVEEpIHx8CiAJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1VTUlFVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1VRVU9UQSB8IFhGU01OVF9VUVVPVEFFTkY7CisJCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19VUVVPVEFfQUNDVCB8IFhGU19VUVVPVEFfQUNUSVZFIHwKKwkJCQkJIFhGU19VUVVPVEFfRU5GRCk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9RVU9UQU5PRU5GKSB8fAogCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VUVVPVEFOT0VORikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9VUVVPVEE7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX1VRVU9UQUVORjsKKwkJCW1wLT5tX3FmbGFncyB8PSAoWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX1VRVU9UQV9BQ1RJVkUpOworCQkJbXAtPm1fcWZsYWdzICY9IH5YRlNfVVFVT1RBX0VORkQ7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9QUVVPVEEpIHx8CiAJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1BSSlFVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1BRVU9UQSB8IFhGU01OVF9QUVVPVEFFTkY7CisJCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19QUVVPVEFfQUNDVCB8IFhGU19QUVVPVEFfQUNUSVZFIHwKKwkJCQkJIFhGU19PUVVPVEFfRU5GRCk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9QUVVPVEFOT0VORikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9QUVVPVEE7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX1BRVU9UQUVORjsKKwkJCW1wLT5tX3FmbGFncyB8PSAoWEZTX1BRVU9UQV9BQ0NUIHwgWEZTX1BRVU9UQV9BQ1RJVkUpOworCQkJbXAtPm1fcWZsYWdzICY9IH5YRlNfT1FVT1RBX0VORkQ7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEEpIHx8CiAJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dSUFFVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0dRVU9UQSB8IFhGU01OVF9HUVVPVEFFTkY7CisJCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19HUVVPVEFfQUNDVCB8IFhGU19HUVVPVEFfQUNUSVZFIHwKKwkJCQkJIFhGU19PUVVPVEFfRU5GRCk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEFOT0VORikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9HUVVPVEE7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0dRVU9UQUVORjsKKwkJCW1wLT5tX3FmbGFncyB8PSAoWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ1RJVkUpOworCQkJbXAtPm1fcWZsYWdzICY9IH5YRlNfT1FVT1RBX0VORkQ7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUFQSSkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ETUFQSTsKKwkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ETUFQSTsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1hEU00pKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRE1BUEk7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRE1BUEk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUkpKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRE1BUEk7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRE1BUEk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJpaGFzaHNpemUiKSkgewogCQkJY21uX2VycihDRV9XQVJOLAogCSJYRlM6IGloYXNoc2l6ZSBubyBsb25nZXIgdXNlZCwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIik7CkBAIC0zOTAsMjcgKzQwMiwyOSBAQAogCQl9CiAJfQogCi0JaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PUkVDT1ZFUlkpIHsKLQkJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpID09IDApIHsKLQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkiWEZTOiBuby1yZWNvdmVyeSBtb3VudHMgbXVzdCBiZSByZWFkLW9ubHkuIik7Ci0JCQlyZXR1cm4gRUlOVkFMOwotCQl9CisJLyoKKwkgKiBubyByZWNvdmVyeSBmbGFnIHJlcXVpcmVzIGEgcmVhZC1vbmx5IG1vdW50CisJICovCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSAmJgorCSAgICAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBuby1yZWNvdmVyeSBtb3VudHMgbXVzdCBiZSByZWFkLW9ubHkuIik7CisJCXJldHVybiBFSU5WQUw7CiAJfQogCi0JaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAmJiAoZHN1bml0IHx8IGRzd2lkdGgpKSB7CisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FMSUdOKSAmJiAoZHN1bml0IHx8IGRzd2lkdGgpKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwKIAkiWEZTOiBzdW5pdCBhbmQgc3dpZHRoIG9wdGlvbnMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG5vYWxpZ24gb3B0aW9uIik7CiAJCXJldHVybiBFSU5WQUw7CiAJfQogCi0JaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9HUVVPVEEpICYmIChhcmdzLT5mbGFncyAmIFhGU01OVF9QUVVPVEEpKSB7CisJaWYgKChtcC0+bV9xZmxhZ3MgJiAoWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ1RJVkUpKSAmJgorCSAgICAobXAtPm1fcWZsYWdzICYgKFhGU19QUVVPVEFfQUNDVCB8IFhGU19QUVVPVEFfQUNUSVZFKSkpIHsKIAkJY21uX2VycihDRV9XQVJOLAogCQkJIlhGUzogY2Fubm90IG1vdW50IHdpdGggYm90aCBwcm9qZWN0IGFuZCBncm91cCBxdW90YSIpOwogCQlyZXR1cm4gRUlOVkFMOwogCX0KIAotCWlmICgoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfRE1BUEkpICYmICphcmdzLT5tdHB0ID09ICdcMCcpIHsKKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSAmJiAoISptdHB0IHx8ICptdHB0WzBdID09ICdcMCcpKSB7CiAJCXByaW50aygiWEZTOiAlcyBvcHRpb24gbmVlZHMgdGhlIG1vdW50IHBvaW50IG9wdGlvbiBhcyB3ZWxsXG4iLAogCQkJTU5UT1BUX0RNQVBJKTsKIAkJcmV0dXJuIEVJTlZBTDsKQEAgLTQzOCwyNyArNDUyLDY2IEBACiAJICogTm90ZSB0aGF0IGlmICJpa2VlcCIgb3IgIm5vaWtlZXAiIG1vdW50IG9wdGlvbnMgYXJlCiAJICogc3VwcGxpZWQsIHRoZW4gdGhleSBhcmUgaG9ub3JlZC4KIAkgKi8KLQlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0RNQVBJKSAmJiBkbWFwaV9pbXBsaWVzX2lrZWVwKQotCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSUtFRVA7Ci0KLQlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICE9IFhGU01OVF9OT0FMSUdOKSB7Ci0JCWlmIChkc3VuaXQpIHsKLQkJCWFyZ3MtPnN1bml0ID0gZHN1bml0OwotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1JFVEVSUjsKLQkJfSBlbHNlIHsKLQkJCWFyZ3MtPnN1bml0ID0gdm9sX2RzdW5pdDsKLQkJfQotCQlkc3dpZHRoID8gKGFyZ3MtPnN3aWR0aCA9IGRzd2lkdGgpIDoKLQkJCSAgKGFyZ3MtPnN3aWR0aCA9IHZvbF9kc3dpZHRoKTsKLQl9IGVsc2UgewotCQlhcmdzLT5zdW5pdCA9IGFyZ3MtPnN3aWR0aCA9IDA7Ci0JfQorCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpICYmIGRtYXBpX2ltcGxpZXNfaWtlZXApCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9JS0VFUDsKIAogZG9uZToKLQlpZiAoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfMzJCSVRJTk9ERVMpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9TTUFMTF9JTlVNUzsKLQlpZiAoYXJncy0+ZmxhZ3MyKQotCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRkxBR1MyOworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQUxJR04pKSB7CisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1cGVyYmxvY2sgaGFzIG5vdCBiZWVuIHJlYWQKKwkJICogaW4sIHRoZXJlZm9yZSB3ZSBkbyBub3Qga25vdyB0aGUgYmxvY2sgc2l6ZS4KKwkJICogQmVmb3JlIHRoZSBtb3VudCBjYWxsIGVuZHMgd2Ugd2lsbCBjb252ZXJ0CisJCSAqIHRoZXNlIHRvIEZTQnMuCisJCSAqLworCQlpZiAoZHN1bml0KSB7CisJCQltcC0+bV9kYWxpZ24gPSBkc3VuaXQ7CisJCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfUkVURVJSOworCQl9CisKKwkJaWYgKGRzd2lkdGgpCisJCQltcC0+bV9zd2lkdGggPSBkc3dpZHRoOworCX0KKworCWlmIChtcC0+bV9sb2didWZzICE9IC0xICYmCisJICAgIG1wLT5tX2xvZ2J1ZnMgIT0gMCAmJgorCSAgICAobXAtPm1fbG9nYnVmcyA8IFhMT0dfTUlOX0lDTE9HUyB8fAorCSAgICAgbXAtPm1fbG9nYnVmcyA+IFhMT0dfTUFYX0lDTE9HUykpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogaW52YWxpZCBsb2didWZzIHZhbHVlOiAlZCBbbm90ICVkLSVkXSIsCisJCQltcC0+bV9sb2didWZzLCBYTE9HX01JTl9JQ0xPR1MsIFhMT0dfTUFYX0lDTE9HUyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJaWYgKG1wLT5tX2xvZ2JzaXplICE9IC0xICYmCisJICAgIG1wLT5tX2xvZ2JzaXplICE9ICAwICYmCisJICAgIChtcC0+bV9sb2dic2l6ZSA8IFhMT0dfTUlOX1JFQ09SRF9CU0laRSB8fAorCSAgICAgbXAtPm1fbG9nYnNpemUgPiBYTE9HX01BWF9SRUNPUkRfQlNJWkUgfHwKKwkgICAgICFpc19wb3dlcl9vZl8yKG1wLT5tX2xvZ2JzaXplKSkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IGludmFsaWQgbG9nYnVmc2l6ZTogJWQgW25vdCAxNmssMzJrLDY0aywxMjhrIG9yIDI1NmtdIiwKKwkJCW1wLT5tX2xvZ2JzaXplKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCW1wLT5tX2ZzbmFtZSA9IGtzdHJuZHVwKHNiLT5zX2lkLCBNQVhOQU1FTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1wLT5tX2ZzbmFtZSkKKwkJcmV0dXJuIEVOT01FTTsKKwltcC0+bV9mc25hbWVfbGVuID0gc3RybGVuKG1wLT5tX2ZzbmFtZSkgKyAxOworCisJaWYgKGlvc2l6ZWxvZykgeworCQlpZiAoaW9zaXplbG9nID4gWEZTX01BWF9JT19MT0cgfHwKKwkJICAgIGlvc2l6ZWxvZyA8IFhGU19NSU5fSU9fTE9HKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJCSJYRlM6IGludmFsaWQgbG9nIGlvc2l6ZTogJWQgW25vdCAlZC0lZF0iLAorCQkJCWlvc2l6ZWxvZywgWEZTX01JTl9JT19MT0csCisJCQkJWEZTX01BWF9JT19MT0cpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RGTFRfSU9TSVpFOworCQltcC0+bV9yZWFkaW9fbG9nID0gaW9zaXplbG9nOworCQltcC0+bV93cml0ZWlvX2xvZyA9IGlvc2l6ZWxvZzsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzA0LDggKzc1Nyw3IEBACiAgKi8KIFNUQVRJQyBpbnQKIHhmc19vcGVuX2RldmljZXMoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0Jc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzKQorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQogewogCXN0cnVjdCBibG9ja19kZXZpY2UJKmRkZXYgPSBtcC0+bV9zdXBlci0+c19iZGV2OwogCXN0cnVjdCBibG9ja19kZXZpY2UJKmxvZ2RldiA9IE5VTEwsICpydGRldiA9IE5VTEw7CkBAIC03MTQsMTQgKzc2NiwxNCBAQAogCS8qCiAJICogT3BlbiByZWFsIHRpbWUgYW5kIGxvZyBkZXZpY2VzIC0gb3JkZXIgaXMgaW1wb3J0YW50LgogCSAqLwotCWlmIChhcmdzLT5sb2duYW1lWzBdKSB7Ci0JCWVycm9yID0geGZzX2Jsa2Rldl9nZXQobXAsIGFyZ3MtPmxvZ25hbWUsICZsb2dkZXYpOworCWlmIChtcC0+bV9sb2duYW1lKSB7CisJCWVycm9yID0geGZzX2Jsa2Rldl9nZXQobXAsIG1wLT5tX2xvZ25hbWUsICZsb2dkZXYpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoYXJncy0+cnRuYW1lWzBdKSB7Ci0JCWVycm9yID0geGZzX2Jsa2Rldl9nZXQobXAsIGFyZ3MtPnJ0bmFtZSwgJnJ0ZGV2KTsKKwlpZiAobXAtPm1fcnRuYW1lKSB7CisJCWVycm9yID0geGZzX2Jsa2Rldl9nZXQobXAsIG1wLT5tX3J0bmFtZSwgJnJ0ZGV2KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfY2xvc2VfbG9nZGV2OwogCkBAIC04MTMsMTggKzg2NSwxOCBAQAogICovCiB2b2lkCiB4ZnNhaWxkX3dha2V1cCgKLQl4ZnNfbW91bnRfdAkJKm1wLAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKIAl4ZnNfbHNuX3QJCXRocmVzaG9sZF9sc24pCiB7Ci0JbXAtPm1fYWlsLnhhX3RhcmdldCA9IHRocmVzaG9sZF9sc247Ci0Jd2FrZV91cF9wcm9jZXNzKG1wLT5tX2FpbC54YV90YXNrKTsKKwlhaWxwLT54YV90YXJnZXQgPSB0aHJlc2hvbGRfbHNuOworCXdha2VfdXBfcHJvY2VzcyhhaWxwLT54YV90YXNrKTsKIH0KIAogaW50CiB4ZnNhaWxkKAogCXZvaWQJKmRhdGEpCiB7Ci0JeGZzX21vdW50X3QJKm1wID0gKHhmc19tb3VudF90ICopZGF0YTsKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCA9IGRhdGE7CiAJeGZzX2xzbl90CWxhc3RfcHVzaGVkX2xzbiA9IDA7CiAJbG9uZwkJdG91dCA9IDA7CiAKQEAgLTgzNiwxMSArODg4LDExIEBACiAJCS8qIHN3c3VzcCAqLwogCQl0cnlfdG9fZnJlZXplKCk7CiAKLQkJQVNTRVJUKG1wLT5tX2xvZyk7Ci0JCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJQVNTRVJUKGFpbHAtPnhhX21vdW50LT5tX2xvZyk7CisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGFpbHAtPnhhX21vdW50KSkKIAkJCWNvbnRpbnVlOwogCi0JCXRvdXQgPSB4ZnNhaWxkX3B1c2gobXAsICZsYXN0X3B1c2hlZF9sc24pOworCQl0b3V0ID0geGZzYWlsZF9wdXNoKGFpbHAsICZsYXN0X3B1c2hlZF9sc24pOwogCX0KIAogCXJldHVybiAwOwpAQCAtODQ4LDQzICs5MDAsODIgQEAKIAogaW50CiB4ZnNhaWxkX3N0YXJ0KAotCXhmc19tb3VudF90CSptcCkKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCkKIHsKLQltcC0+bV9haWwueGFfdGFyZ2V0ID0gMDsKLQltcC0+bV9haWwueGFfdGFzayA9IGt0aHJlYWRfcnVuKHhmc2FpbGQsIG1wLCAieGZzYWlsZCIpOwotCWlmIChJU19FUlIobXAtPm1fYWlsLnhhX3Rhc2spKQotCQlyZXR1cm4gLVBUUl9FUlIobXAtPm1fYWlsLnhhX3Rhc2spOworCWFpbHAtPnhhX3RhcmdldCA9IDA7CisJYWlscC0+eGFfdGFzayA9IGt0aHJlYWRfcnVuKHhmc2FpbGQsIGFpbHAsICJ4ZnNhaWxkIik7CisJaWYgKElTX0VSUihhaWxwLT54YV90YXNrKSkKKwkJcmV0dXJuIC1QVFJfRVJSKGFpbHAtPnhhX3Rhc2spOwogCXJldHVybiAwOwogfQogCiB2b2lkCiB4ZnNhaWxkX3N0b3AoCi0JeGZzX21vdW50X3QJKm1wKQorCXN0cnVjdCB4ZnNfYWlsCSphaWxwKQogewotCWt0aHJlYWRfc3RvcChtcC0+bV9haWwueGFfdGFzayk7CisJa3RocmVhZF9zdG9wKGFpbHAtPnhhX3Rhc2spOwogfQogCiAKLQorLyogQ2F0Y2ggbWlzZ3VpZGVkIHNvdWxzIHRoYXQgdHJ5IHRvIHVzZSB0aGlzIGludGVyZmFjZSBvbiBYRlMgKi8KIFNUQVRJQyBzdHJ1Y3QgaW5vZGUgKgogeGZzX2ZzX2FsbG9jX2lub2RlKAogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCiB7Ci0JcmV0dXJuIGttZW1fem9uZV9hbGxvYyh4ZnNfdm5vZGVfem9uZSwgS01fU0xFRVApOworCUJVRygpOworCXJldHVybiBOVUxMOwogfQogCisvKgorICogTm93IHRoYXQgdGhlIGdlbmVyaWMgY29kZSBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBhY2Nlc3NpbmcKKyAqIHRoZSBsaW51eCBpbm9kZSwgd2UgY2FuIHJlY2xhaW0gdGhlIGlub2RlLgorICovCiBTVEFUSUMgdm9pZAogeGZzX2ZzX2Rlc3Ryb3lfaW5vZGUoCi0Jc3RydWN0IGlub2RlCQkqaW5vZGUpCisJc3RydWN0IGlub2RlCSppbm9kZSkKIHsKLQlrbWVtX3pvbmVfZnJlZSh4ZnNfdm5vZGVfem9uZSwgaW5vZGUpOworCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpbm9kZSk7CisKKwlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOworCWlmICh4ZnNfcmVjbGFpbShpcCkpCisJCXBhbmljKCIlczogY2Fubm90IHJlY2xhaW0gMHglcFxuIiwgX19mdW5jX18sIGlub2RlKTsKIH0KIAorLyoKKyAqIFNsYWIgb2JqZWN0IGNyZWF0aW9uIGluaXRpYWxpc2F0aW9uIGZvciB0aGUgWEZTIGlub2RlLgorICogVGhpcyBjb3ZlcnMgb25seSB0aGUgaWRlbXBvdGVudCBmaWVsZHMgaW4gdGhlIFhGUyBpbm9kZTsKKyAqIGFsbCBvdGhlciBmaWVsZHMgbmVlZCB0byBiZSBpbml0aWFsaXNlZCBvbiBhbGxvY2F0aW9uCisgKiBmcm9tIHRoZSBzbGFiLiBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0byByZXBlYXRlZGx5IGludGlhbGlzZQorICogZmllbGRzIGluIHRoZSB4ZnMgaW5vZGUgdGhhdCBsZWZ0IGluIHRoZSBpbml0aWFsaXNlIHN0YXRlCisgKiB3aGVuIGZyZWVpbmcgdGhlIGlub2RlLgorICovCiBTVEFUSUMgdm9pZAogeGZzX2ZzX2lub2RlX2luaXRfb25jZSgKLQl2b2lkCQkJKnZub2RlKQorCXZvaWQJCQkqaW5vZGUpCiB7Ci0JaW5vZGVfaW5pdF9vbmNlKChzdHJ1Y3QgaW5vZGUgKil2bm9kZSk7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBpbm9kZTsKKworCW1lbXNldChpcCwgMCwgc2l6ZW9mKHN0cnVjdCB4ZnNfaW5vZGUpKTsKKworCS8qIHZmcyBpbm9kZSAqLworCWlub2RlX2luaXRfb25jZShWRlNfSShpcCkpOworCisJLyogeGZzIGlub2RlICovCisJYXRvbWljX3NldCgmaXAtPmlfaW9jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaXAtPmlfcGluY291bnQsIDApOworCXNwaW5fbG9ja19pbml0KCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcC0+aV9pcGluX3dhaXQpOworCS8qCisJICogQmVjYXVzZSB3ZSB3YW50IHRvIHVzZSBhIGNvdW50aW5nIGNvbXBsZXRpb24sIGNvbXBsZXRlCisJICogdGhlIGZsdXNoIGNvbXBsZXRpb24gb25jZSB0byBhbGxvdyBhIHNpbmdsZSBhY2Nlc3MgdG8KKwkgKiB0aGUgZmx1c2ggY29tcGxldGlvbiB3aXRob3V0IGJsb2NraW5nLgorCSAqLworCWluaXRfY29tcGxldGlvbigmaXAtPmlfZmx1c2gpOworCWNvbXBsZXRlKCZpcC0+aV9mbHVzaCk7CisKKwltcmxvY2tfaW5pdCgmaXAtPmlfbG9jaywgTVJMT0NLX0FMTE9XX0VRVUFMX1BSSXxNUkxPQ0tfQkFSUklFUiwKKwkJICAgICAieGZzaW5vIiwgaXAtPmlfaW5vKTsKKwltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKIH0KIAogLyoKQEAgLTg5OCwyMSArOTg5LDI2IEBACiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJaW50CQkJc3luYykKIHsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKIAlpbnQJCQllcnJvciA9IDA7CiAJaW50CQkJZmxhZ3MgPSAwOwogCi0JeGZzX2l0cmFjZV9lbnRyeShYRlNfSShpbm9kZSkpOworCXhmc19pdHJhY2VfZW50cnkoaXApOwogCWlmIChzeW5jKSB7Ci0JCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQllcnJvciA9IHhmc193YWl0X29uX3BhZ2VzKGlwLCAwLCAtMSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2Vycm9yOwogCQlmbGFncyB8PSBGTFVTSF9TWU5DOwogCX0KLQllcnJvciA9IHhmc19pbm9kZV9mbHVzaChYRlNfSShpbm9kZSksIGZsYWdzKTsKKwllcnJvciA9IHhmc19pbm9kZV9mbHVzaChpcCwgZmxhZ3MpOworCitvdXRfZXJyb3I6CiAJLyoKIAkgKiBpZiB3ZSBmYWlsZWQgdG8gd3JpdGUgb3V0IHRoZSBpbm9kZSB0aGVuIG1hcmsKIAkgKiBpdCBkaXJ0eSBhZ2FpbiBzbyB3ZSdsbCB0cnkgYWdhaW4gbGF0ZXIuCiAJICovCiAJaWYgKGVycm9yKQotCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOworCQl4ZnNfbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlwKTsKIAogCXJldHVybiAtZXJyb3I7CiB9CkBAIC05MjMsMTY0ICsxMDE5LDEyIEBACiB7CiAJeGZzX2lub2RlX3QJCSppcCA9IFhGU19JKGlub2RlKTsKIAotCS8qCi0JICogaXAgY2FuIGJlIG51bGwgd2hlbiB4ZnNfaWdldF9jb3JlIGNhbGxzIHhmc19pZGVzdHJveSBpZiB3ZQotCSAqIGZpbmQgYW4gaW5vZGUgd2l0aCBkaV9tb2RlID09IDAgYnV0IHdpdGhvdXQgSUdFVF9DUkVBVEUgc2V0LgotCSAqLwotCWlmIChpcCkgewotCQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKLQkJWEZTX1NUQVRTX0lOQyh2bl9yZWxlKTsKLQkJWEZTX1NUQVRTX0lOQyh2bl9yZW1vdmUpOwotCQlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOwotCQlYRlNfU1RBVFNfREVDKHZuX2FjdGl2ZSk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CisJWEZTX1NUQVRTX0lOQyh2bl9yZWxlKTsKKwlYRlNfU1RBVFNfSU5DKHZuX3JlbW92ZSk7CisJWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOwogCi0JCXhmc19pbmFjdGl2ZShpcCk7Ci0JCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JTU9ESUZJRUQpOwotCQlpZiAoeGZzX3JlY2xhaW0oaXApKQotCQkJcGFuaWMoIiVzOiBjYW5ub3QgcmVjbGFpbSAweCVwXG4iLCBfX2Z1bmNfXywgaW5vZGUpOwotCX0KLQotCUFTU0VSVChYRlNfSShpbm9kZSkgPT0gTlVMTCk7Ci19Ci0KLS8qCi0gKiBFbnF1ZXVlIGEgd29yayBpdGVtIHRvIGJlIHBpY2tlZCB1cCBieSB0aGUgdmZzIHhmc3N5bmNkIHRocmVhZC4KLSAqIERvaW5nIHRoaXMgaGFzIHR3byBhZHZhbnRhZ2VzOgotICogLSBJdCBzYXZlcyBvbiBzdGFjayBzcGFjZSwgd2hpY2ggaXMgdGlnaHQgaW4gY2VydGFpbiBzaXR1YXRpb25zCi0gKiAtIEl0IGNhbiBiZSB1c2VkICh3aXRoIGNhcmUpIGFzIGEgbWVjaGFuaXNtIHRvIGF2b2lkIGRlYWRsb2Nrcy4KLSAqIEZsdXNoaW5nIHdoaWxlIGFsbG9jYXRpbmcgaW4gYSBmdWxsIGZpbGVzeXN0ZW0gcmVxdWlyZXMgYm90aC4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19zeW5jZF9xdWV1ZV93b3JrKAotCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAotCXZvaWQJCSpkYXRhLAotCXZvaWQJCSgqc3luY2VyKShzdHJ1Y3QgeGZzX21vdW50ICosIHZvaWQgKikpCi17Ci0Jc3RydWN0IGJodl92ZnNfc3luY193b3JrICp3b3JrOwotCi0Jd29yayA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaHZfdmZzX3N5bmNfd29yayksIEtNX1NMRUVQKTsKLQlJTklUX0xJU1RfSEVBRCgmd29yay0+d19saXN0KTsKLQl3b3JrLT53X3N5bmNlciA9IHN5bmNlcjsKLQl3b3JrLT53X2RhdGEgPSBkYXRhOwotCXdvcmstPndfbW91bnQgPSBtcDsKLQlzcGluX2xvY2soJm1wLT5tX3N5bmNfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmd29yay0+d19saXN0LCAmbXAtPm1fc3luY19saXN0KTsKLQlzcGluX3VubG9jaygmbXAtPm1fc3luY19sb2NrKTsKLQl3YWtlX3VwX3Byb2Nlc3MobXAtPm1fc3luY190YXNrKTsKLX0KLQotLyoKLSAqIEZsdXNoIGRlbGF5ZWQgYWxsb2NhdGUgZGF0YSwgYXR0ZW1wdGluZyB0byBmcmVlIHVwIHJlc2VydmVkIHNwYWNlCi0gKiBmcm9tIGV4aXN0aW5nIGFsbG9jYXRpb25zLiAgQXQgdGhpcyBwb2ludCBhIG5ldyBhbGxvY2F0aW9uIGF0dGVtcHQKLSAqIGhhcyBmYWlsZWQgd2l0aCBFTk9TUEMgYW5kIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBzY3JhdGNoaW5nIG91cgotICogaGVhZHMsIGxvb2tpbmcgYWJvdXQgZm9yIG1vcmUgcm9vbS4uLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2ZsdXNoX2lub2RlX3dvcmsoCi0Jc3RydWN0IHhmc19tb3VudCAqbXAsCi0Jdm9pZAkJKmFyZykKLXsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gYXJnOwotCWZpbGVtYXBfZmx1c2goaW5vZGUtPmlfbWFwcGluZyk7Ci0JaXB1dChpbm9kZSk7Ci19Ci0KLXZvaWQKLXhmc19mbHVzaF9pbm9kZSgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IFZGU19JKGlwKTsKLQotCWlncmFiKGlub2RlKTsKLQl4ZnNfc3luY2RfcXVldWVfd29yayhpcC0+aV9tb3VudCwgaW5vZGUsIHhmc19mbHVzaF9pbm9kZV93b3JrKTsKLQlkZWxheShtc2Vjc190b19qaWZmaWVzKDUwMCkpOwotfQotCi0vKgotICogVGhpcyBpcyB0aGUgImJpZ2dlciBoYW1tZXIiIHZlcnNpb24gb2YgeGZzX2ZsdXNoX2lub2RlX3dvcmsuLi4KLSAqIChJT1csICJJZiBhdCBmaXJzdCB5b3UgZG9uJ3Qgc3VjY2VlZCwgdXNlIGEgQmlnZ2VyIEhhbW1lciIpLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2ZsdXNoX2RldmljZV93b3JrKAotCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAotCXZvaWQJCSphcmcpCi17Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGFyZzsKLQlzeW5jX2Jsb2NrZGV2KG1wLT5tX3N1cGVyLT5zX2JkZXYpOwotCWlwdXQoaW5vZGUpOwotfQotCi12b2lkCi14ZnNfZmx1c2hfZGV2aWNlKAotCXhmc19pbm9kZV90CSppcCkKLXsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gVkZTX0koaXApOwotCi0JaWdyYWIoaW5vZGUpOwotCXhmc19zeW5jZF9xdWV1ZV93b3JrKGlwLT5pX21vdW50LCBpbm9kZSwgeGZzX2ZsdXNoX2RldmljZV93b3JrKTsKLQlkZWxheShtc2Vjc190b19qaWZmaWVzKDUwMCkpOwotCXhmc19sb2dfZm9yY2UoaXAtPmlfbW91bnQsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX3N5bmNfd29ya2VyKAotCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAotCXZvaWQJCSp1bnVzZWQpCi17Ci0JaW50CQllcnJvcjsKLQotCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkpCi0JCWVycm9yID0geGZzX3N5bmMobXAsIFNZTkNfRlNEQVRBIHwgU1lOQ19CREZMVVNIIHwgU1lOQ19BVFRSKTsKLQltcC0+bV9zeW5jX3NlcSsrOwotCXdha2VfdXAoJm1wLT5tX3dhaXRfc2luZ2xlX3N5bmNfdGFzayk7Ci19Ci0KLVNUQVRJQyBpbnQKLXhmc3N5bmNkKAotCXZvaWQJCQkqYXJnKQotewotCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gYXJnOwotCWxvbmcJCQl0aW1lbGVmdDsKLQliaHZfdmZzX3N5bmNfd29ya190CSp3b3JrLCAqbjsKLQlMSVNUX0hFQUQJCSh0bXApOwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCXRpbWVsZWZ0ID0geGZzX3N5bmNkX2NlbnRpc2VjcyAqIG1zZWNzX3RvX2ppZmZpZXMoMTApOwotCWZvciAoOzspIHsKLQkJdGltZWxlZnQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZWxlZnQpOwotCQkvKiBzd3N1c3AgKi8KLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGxpc3RfZW1wdHkoJm1wLT5tX3N5bmNfbGlzdCkpCi0JCQlicmVhazsKLQotCQlzcGluX2xvY2soJm1wLT5tX3N5bmNfbG9jayk7Ci0JCS8qCi0JCSAqIFdlIGNhbiBnZXQgd29rZW4gYnkgbGFwdG9wIG1vZGUsIHRvIGRvIGEgc3luYyAtCi0JCSAqIHRoYXQncyB0aGUgKG9ubHkhKSBjYXNlIHdoZXJlIHRoZSBsaXN0IHdvdWxkIGJlCi0JCSAqIGVtcHR5IHdpdGggdGltZSByZW1haW5pbmcuCi0JCSAqLwotCQlpZiAoIXRpbWVsZWZ0IHx8IGxpc3RfZW1wdHkoJm1wLT5tX3N5bmNfbGlzdCkpIHsKLQkJCWlmICghdGltZWxlZnQpCi0JCQkJdGltZWxlZnQgPSB4ZnNfc3luY2RfY2VudGlzZWNzICoKLQkJCQkJCQltc2Vjc190b19qaWZmaWVzKDEwKTsKLQkJCUlOSVRfTElTVF9IRUFEKCZtcC0+bV9zeW5jX3dvcmsud19saXN0KTsKLQkJCWxpc3RfYWRkX3RhaWwoJm1wLT5tX3N5bmNfd29yay53X2xpc3QsCi0JCQkJCSZtcC0+bV9zeW5jX2xpc3QpOwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3b3JrLCBuLCAmbXAtPm1fc3luY19saXN0LCB3X2xpc3QpCi0JCQlsaXN0X21vdmUoJndvcmstPndfbGlzdCwgJnRtcCk7Ci0JCXNwaW5fdW5sb2NrKCZtcC0+bV9zeW5jX2xvY2spOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3b3JrLCBuLCAmdG1wLCB3X2xpc3QpIHsKLQkJCSgqd29yay0+d19zeW5jZXIpKG1wLCB3b3JrLT53X2RhdGEpOwotCQkJbGlzdF9kZWwoJndvcmstPndfbGlzdCk7Ci0JCQlpZiAod29yayA9PSAmbXAtPm1fc3luY193b3JrKQotCQkJCWNvbnRpbnVlOwotCQkJa21lbV9mcmVlKHdvcmspOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7CisJeGZzX2luYWN0aXZlKGlwKTsKIH0KIAogU1RBVElDIHZvaWQKQEAgLTEwOTksMTEgKzEwNDMsOSBAQAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOwogCXN0cnVjdCB4ZnNfaW5vZGUJKnJpcCA9IG1wLT5tX3Jvb3RpcDsKIAlpbnQJCQl1bm1vdW50X2V2ZW50X2ZsYWdzID0gMDsKLQlpbnQJCQllcnJvcjsKIAotCWt0aHJlYWRfc3RvcChtcC0+bV9zeW5jX3Rhc2spOwotCi0JeGZzX3N5bmMobXAsIFNZTkNfQVRUUiB8IFNZTkNfREVMV1JJKTsKKwl4ZnNfc3luY2Rfc3RvcChtcCk7CisJeGZzX3N5bmNfaW5vZGVzKG1wLCBTWU5DX0FUVFJ8U1lOQ19ERUxXUkkpOwogCiAjaWZkZWYgSEFWRV9ETUFQSQogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgewpAQCAtMTEyOCwxOCArMTA3MCw2IEBACiAJeGZzX2ZpbGVzdHJlYW1fdW5tb3VudChtcCk7CiAKIAlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwotCWVycm9yID0geGZzX3VubW91bnRfZmx1c2gobXAsIDApOwotCVdBUk5fT04oZXJyb3IpOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBmb3JjaW5nIGEgc2h1dGRvd24sIHR5cGljYWxseSBiZWNhdXNlIG9mIGEgbWVkaWEgZXJyb3IsCi0JICogd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgaW52YWxpZGF0ZSBkaXJ0eSBwYWdlcyB0aGF0IGJlbG9uZyB0bwotCSAqIHJlZmVyZW5jZWQgdm5vZGVzIGFzIHdlbGwuCi0JICovCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7Ci0JCWVycm9yID0geGZzX3N5bmMobXAsIFNZTkNfV0FJVCB8IFNZTkNfQ0xPU0UpOwotCQlBU1NFUlQoZXJyb3IgIT0gRUZTQ09SUlVQVEVEKTsKLQl9CiAKIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpIHsKIAkJWEZTX1NFTkRfVU5NT1VOVChtcCwgcmlwLCBETV9SSUdIVF9OVUxMLCAwLCAwLApAQCAtMTE2MSw3ICsxMDkxLDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQogewogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKLQkJeGZzX3N5bmMoWEZTX00oc2IpLCBTWU5DX0ZTREFUQSk7CisJCXhmc19zeW5jX2ZzZGF0YShYRlNfTShzYiksIDApOwogCXNiLT5zX2RpcnQgPSAwOwogfQogCkBAIC0xMTcyLDcgKzExMDIsNiBAQAogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOwogCWludAkJCWVycm9yOwotCWludAkJCWZsYWdzOwogCiAJLyoKIAkgKiBUcmVhdCBhIHN5bmMgb3BlcmF0aW9uIGxpa2UgYSBmcmVlemUuICBUaGlzIGlzIHRvIHdvcmsKQEAgLTExODYsMjAgKzExMTUsMTAgQEAKIAkgKiBkaXJ0eSB0aGUgTGludXggaW5vZGUgdW50aWwgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIEkvTwogCSAqIGNvbXBsZXRlcy4KIAkgKi8KLQlpZiAod2FpdCB8fCB1bmxpa2VseShzYi0+c19mcm96ZW4gPT0gU0JfRlJFRVpFX1dSSVRFKSkgewotCQkvKgotCQkgKiBGaXJzdCBzdGFnZSBvZiBmcmVlemUgLSBubyBtb3JlIHdyaXRlcnMgd2lsbCBtYWtlIHByb2dyZXNzCi0JCSAqIG5vdyB3ZSBhcmUgaGVyZSwgc28gd2UgZmx1c2ggZGVsd3JpIGFuZCBkZWxhbGxvYyBidWZmZXJzCi0JCSAqIGhlcmUsIHRoZW4gd2FpdCBmb3IgYWxsIEkvTyB0byBjb21wbGV0ZS4gIERhdGEgaXMgZnJvemVuIGF0Ci0JCSAqIHRoYXQgcG9pbnQuIE1ldGFkYXRhIGlzIG5vdCBmcm96ZW4sIHRyYW5zYWN0aW9ucyBjYW4gc3RpbGwKLQkJICogb2NjdXIgaGVyZSBzbyBkb24ndCBib3RoZXIgZmx1c2hpbmcgdGhlIGJ1ZnRhcmcgKGkuZQotCQkgKiBTWU5DX1FVSUVTQ0UpIGJlY2F1c2UgaXQnbGwganVzdCBnZXQgZGlydHkgYWdhaW4uCi0JCSAqLwotCQlmbGFncyA9IFNZTkNfREFUQV9RVUlFU0NFOwotCX0gZWxzZQotCQlmbGFncyA9IFNZTkNfRlNEQVRBOwotCi0JZXJyb3IgPSB4ZnNfc3luYyhtcCwgZmxhZ3MpOworCWlmICh3YWl0IHx8IHVubGlrZWx5KHNiLT5zX2Zyb3plbiA9PSBTQl9GUkVFWkVfV1JJVEUpKQorCQllcnJvciA9IHhmc19xdWllc2NlX2RhdGEobXApOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfc3luY19mc2RhdGEobXAsIDApOwogCXNiLT5zX2RpcnQgPSAwOwogCiAJaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSkgewpAQCAtMTMzNyw5ICsxMjU2LDggQEAKIAogCS8qIHJ3IC0+IHJvICovCiAJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSAmJiAoKmZsYWdzICYgTVNfUkRPTkxZKSkgewotCQl4ZnNfZmlsZXN0cmVhbV9mbHVzaChtcCk7Ci0JCXhmc19zeW5jKG1wLCBTWU5DX0RBVEFfUVVJRVNDRSk7Ci0JCXhmc19hdHRyX3F1aWVzY2UobXApOworCQl4ZnNfcXVpZXNjZV9kYXRhKG1wKTsKKwkJeGZzX3F1aWVzY2VfYXR0cihtcCk7CiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9SRE9OTFk7CiAJfQogCkBAIC0xMzQ4LDcgKzEyNjYsNyBAQAogCiAvKgogICogU2Vjb25kIHN0YWdlIG9mIGEgZnJlZXplLiBUaGUgZGF0YSBpcyBhbHJlYWR5IGZyb3plbiBzbyB3ZSBvbmx5Ci0gKiBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGVtZXRhZGF0YS4gT25jZSB0aGF0J3MgZG9uZSB3cml0ZSBhIGR1bW15CisgKiBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGUgbWV0YWRhdGEuIE9uY2UgdGhhdCdzIGRvbmUgd3JpdGUgYSBkdW1teQogICogcmVjb3JkIHRvIGRpcnR5IHRoZSBsb2cgaW4gY2FzZSBvZiBhIGNyYXNoIHdoaWxlIGZyb3plbi4KICAqLwogU1RBVElDIHZvaWQKQEAgLTEzNTcsNyArMTI3NSw3IEBACiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfTShzYik7CiAKLQl4ZnNfYXR0cl9xdWllc2NlKG1wKTsKKwl4ZnNfcXVpZXNjZV9hdHRyKG1wKTsKIAl4ZnNfZnNfbG9nX2R1bW15KG1wKTsKIH0KIApAQCAtMTQyMiwxNzUgKzEzNDAsMjggQEAKIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4geGZzX21vdW50X3QgZmllbGRzIGJhc2VkIG9uIG1vdW50IGFyZ3MuCi0gKiBOb3RlOiB0aGUgc3VwZXJibG9jayBoYXMgX25vdF8geWV0IGJlZW4gcmVhZCBpbi4KLSAqLwotU1RBVElDIGludAoteGZzX3N0YXJ0X2ZsYWdzKAotCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXAsCi0Jc3RydWN0IHhmc19tb3VudAkqbXApCi17Ci0JaW50CQkJZXJyb3I7Ci0KLQkvKiBWYWx1ZXMgYXJlIGluIEJCcyAqLwotCWlmICgoYXAtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICE9IFhGU01OVF9OT0FMSUdOKSB7Ci0JCS8qCi0JCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1cGVyYmxvY2sgaGFzIG5vdCBiZWVuIHJlYWQKLQkJICogaW4sIHRoZXJlZm9yZSB3ZSBkbyBub3Qga25vdyB0aGUgYmxvY2sgc2l6ZS4KLQkJICogQmVmb3JlIHRoZSBtb3VudCBjYWxsIGVuZHMgd2Ugd2lsbCBjb252ZXJ0Ci0JCSAqIHRoZXNlIHRvIEZTQnMuCi0JCSAqLwotCQltcC0+bV9kYWxpZ24gPSBhcC0+c3VuaXQ7Ci0JCW1wLT5tX3N3aWR0aCA9IGFwLT5zd2lkdGg7Ci0JfQotCi0JaWYgKGFwLT5sb2didWZzICE9IC0xICYmCi0JICAgIGFwLT5sb2didWZzICE9IDAgJiYKLQkgICAgKGFwLT5sb2didWZzIDwgWExPR19NSU5fSUNMT0dTIHx8Ci0JICAgICBhcC0+bG9nYnVmcyA+IFhMT0dfTUFYX0lDTE9HUykpIHsKLQkJY21uX2VycihDRV9XQVJOLAotCQkJIlhGUzogaW52YWxpZCBsb2didWZzIHZhbHVlOiAlZCBbbm90ICVkLSVkXSIsCi0JCQlhcC0+bG9nYnVmcywgWExPR19NSU5fSUNMT0dTLCBYTE9HX01BWF9JQ0xPR1MpOwotCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JfQotCW1wLT5tX2xvZ2J1ZnMgPSBhcC0+bG9nYnVmczsKLQlpZiAoYXAtPmxvZ2J1ZnNpemUgIT0gLTEgJiYKLQkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gIDAgJiYKLQkgICAgKGFwLT5sb2didWZzaXplIDwgWExPR19NSU5fUkVDT1JEX0JTSVpFIHx8Ci0JICAgICBhcC0+bG9nYnVmc2l6ZSA+IFhMT0dfTUFYX1JFQ09SRF9CU0laRSB8fAotCSAgICAgIWlzX3Bvd2VyX29mXzIoYXAtPmxvZ2J1ZnNpemUpKSkgewotCQljbW5fZXJyKENFX1dBUk4sCi0JIlhGUzogaW52YWxpZCBsb2didWZzaXplOiAlZCBbbm90IDE2aywzMmssNjRrLDEyOGsgb3IgMjU2a10iLAotCQkJYXAtPmxvZ2J1ZnNpemUpOwotCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JfQotCi0JZXJyb3IgPSBFTk9NRU07Ci0KLQltcC0+bV9sb2dic2l6ZSA9IGFwLT5sb2didWZzaXplOwotCW1wLT5tX2ZzbmFtZV9sZW4gPSBzdHJsZW4oYXAtPmZzbmFtZSkgKyAxOwotCi0JbXAtPm1fZnNuYW1lID0ga3N0cmR1cChhcC0+ZnNuYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1wLT5tX2ZzbmFtZSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoYXAtPnJ0bmFtZVswXSkgewotCQltcC0+bV9ydG5hbWUgPSBrc3RyZHVwKGFwLT5ydG5hbWUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW1wLT5tX3J0bmFtZSkKLQkJCWdvdG8gb3V0X2ZyZWVfZnNuYW1lOwotCi0JfQotCi0JaWYgKGFwLT5sb2duYW1lWzBdKSB7Ci0JCW1wLT5tX2xvZ25hbWUgPSBrc3RyZHVwKGFwLT5sb2duYW1lLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtcC0+bV9sb2duYW1lKQotCQkJZ290byBvdXRfZnJlZV9ydG5hbWU7Ci0JfQotCi0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9XU1lOQykKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1dTWU5DOwotI2lmIFhGU19CSUdfSU5VTVMKLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lOTzY0KSB7Ci0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9JTk82NDsKLQkJbXAtPm1faW5vYWRkID0gWEZTX0lOTzY0X09GRlNFVDsKLQl9Ci0jZW5kaWYKLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX1JFVEVSUikKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1JFVEVSUjsKLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FMSUdOOwotCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfU1dBTExPQykKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1NXQUxMT0M7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9PU1lOQ0lTT1NZTkMpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9PU1lOQ0lTT1NZTkM7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF8zMkJJVElOT0RFUykKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UXzMyQklUSU5PREVTOwotCi0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9JT1NJWkUpIHsKLQkJaWYgKGFwLT5pb3NpemVsb2cgPiBYRlNfTUFYX0lPX0xPRyB8fAotCQkgICAgYXAtPmlvc2l6ZWxvZyA8IFhGU19NSU5fSU9fTE9HKSB7Ci0JCQljbW5fZXJyKENFX1dBUk4sCi0JCSJYRlM6IGludmFsaWQgbG9nIGlvc2l6ZTogJWQgW25vdCAlZC0lZF0iLAotCQkJCWFwLT5pb3NpemVsb2csIFhGU19NSU5fSU9fTE9HLAotCQkJCVhGU19NQVhfSU9fTE9HKTsKLQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQkJfQotCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ERkxUX0lPU0laRTsKLQkJbXAtPm1fcmVhZGlvX2xvZyA9IG1wLT5tX3dyaXRlaW9fbG9nID0gYXAtPmlvc2l6ZWxvZzsKLQl9Ci0KLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lLRUVQKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfSUtFRVA7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9ESVJTWU5DKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRElSU1lOQzsKLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0FUVFIyKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQVRUUjI7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT0FUVFIyKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9BVFRSMjsKLQotCWlmIChhcC0+ZmxhZ3MyICYgWEZTTU5UMl9DT01QQVRfSU9TSVpFKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRTsKLQotCS8qCi0JICogbm8gcmVjb3ZlcnkgZmxhZyByZXF1aXJlcyBhIHJlYWQtb25seSBtb3VudAotCSAqLwotCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfTk9SRUNPVkVSWSkgewotCQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpKSB7Ci0JCQljbW5fZXJyKENFX1dBUk4sCi0JIlhGUzogdHJpZWQgdG8gbW91bnQgYSBGUyByZWFkLXdyaXRlIHdpdGhvdXQgcmVjb3ZlcnkhIik7Ci0JCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCX0KLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PUkVDT1ZFUlk7Ci0JfQotCi0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT1VVSUQpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT1VVSUQ7Ci0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9CQVJSSUVSKQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfQkFSUklFUjsKLQllbHNlCi0JCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKLQotCWlmIChhcC0+ZmxhZ3MyICYgWEZTTU5UMl9GSUxFU1RSRUFNUykKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0ZJTEVTVFJFQU1TOwotCi0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9ETUFQSSkKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RNQVBJOwotCXJldHVybiAwOwotCi0KLSBvdXRfZnJlZV9ydG5hbWU6Ci0Ja2ZyZWUobXAtPm1fcnRuYW1lKTsKLSBvdXRfZnJlZV9mc25hbWU6Ci0Ja2ZyZWUobXAtPm1fZnNuYW1lKTsKLSBvdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB4ZnNfbW91bnRfdCBmaWVsZHMgYmFzZWQgb24gbW91bnQgYXJncy4KICAqIE5vdGU6IHRoZSBzdXBlcmJsb2NrIF9oYXNfIG5vdyBiZWVuIHJlYWQgaW4uCiAgKi8KIFNUQVRJQyBpbnQKIHhmc19maW5pc2hfZmxhZ3MoCi0Jc3RydWN0IHhmc19tb3VudF9hcmdzCSphcCwKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCkKIHsKIAlpbnQJCQlyb25seSA9IChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpOwogCiAJLyogRmFpbCBhIG1vdW50IHdoZXJlIHRoZSBsb2didWYgaXMgc21hbGxlciB0aGVuIHRoZSBsb2cgc3RyaXBlICovCiAJaWYgKHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKCZtcC0+bV9zYikpIHsKLQkJaWYgKChhcC0+bG9nYnVmc2l6ZSA8PSAwKSAmJgotCQkgICAgKG1wLT5tX3NiLnNiX2xvZ3N1bml0ID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSkgeworCQlpZiAobXAtPm1fbG9nYnNpemUgPD0gMCAmJgorCQkgICAgbXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiBYTE9HX0JJR19SRUNPUkRfQlNJWkUpIHsKIAkJCW1wLT5tX2xvZ2JzaXplID0gbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7Ci0JCX0gZWxzZSBpZiAoYXAtPmxvZ2J1ZnNpemUgPiAwICYmCi0JCQkgICBhcC0+bG9nYnVmc2l6ZSA8IG1wLT5tX3NiLnNiX2xvZ3N1bml0KSB7CisJCX0gZWxzZSBpZiAobXAtPm1fbG9nYnNpemUgPiAwICYmCisJCQkgICBtcC0+bV9sb2dic2l6ZSA8IG1wLT5tX3NiLnNiX2xvZ3N1bml0KSB7CiAJCQljbW5fZXJyKENFX1dBUk4sCiAJIlhGUzogbG9nYnVmIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbG9nIHN0cmlwZSBzaXplIik7CiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBGYWlsIGEgbW91bnQgaWYgdGhlIGxvZ2J1ZiBpcyBsYXJnZXIgdGhhbiAzMksgKi8KLQkJaWYgKGFwLT5sb2didWZzaXplID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSB7CisJCWlmIChtcC0+bV9sb2dic2l6ZSA+IFhMT0dfQklHX1JFQ09SRF9CU0laRSkgewogCQkJY21uX2VycihDRV9XQVJOLAogCSJYRlM6IGxvZ2J1ZiBzaXplIGZvciB2ZXJzaW9uIDEgbG9ncyBtdXN0IGJlIDE2SyBvciAzMksiKTsKIAkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKQEAgLTE2MDIsNyArMTM3Myw3IEBACiAJICogdG9sZCBieSBub2F0dHIyIHRvIHR1cm4gaXQgb2ZmCiAJICovCiAJaWYgKHhmc19zYl92ZXJzaW9uX2hhc2F0dHIyKCZtcC0+bV9zYikgJiYKLQkgICAgIShhcC0+ZmxhZ3MgJiBYRlNNTlRfTk9BVFRSMikpCisJICAgICEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9BVFRSMikpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9BVFRSMjsKIAogCS8qCkBAIC0xNjE0LDQ4ICsxMzg1LDYgQEAKIAkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CiAJfQogCi0JLyoKLQkgKiBjaGVjayBmb3Igc2hhcmVkIG1vdW50LgotCSAqLwotCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfU0hBUkVEKSB7Ci0JCWlmICgheGZzX3NiX3ZlcnNpb25faGFzc2hhcmVkKCZtcC0+bV9zYikpCi0JCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0KLQkJLyoKLQkJICogRm9yIElSSVggNi41LCBzaGFyZWQgbW91bnRzIG11c3QgaGF2ZSB0aGUgc2hhcmVkCi0JCSAqIHZlcnNpb24gYml0IHNldCwgaGF2ZSB0aGUgcGVyc2lzdGVudCByZWFkb25seQotCQkgKiBmaWVsZCBzZXQsIG11c3QgYmUgdmVyc2lvbiAwIGFuZCBjYW4gb25seSBiZSBtb3VudGVkCi0JCSAqIHJlYWQtb25seS4KLQkJICovCi0JCWlmICghcm9ubHkgfHwgIShtcC0+bV9zYi5zYl9mbGFncyAmIFhGU19TQkZfUkVBRE9OTFkpIHx8Ci0JCSAgICAgKG1wLT5tX3NiLnNiX3NoYXJlZF92biAhPSAwKSkKLQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQotCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfU0hBUkVEOwotCi0JCS8qCi0JCSAqIFNoYXJlZCBYRlMgVjAgY2FuJ3QgZGVhbCB3aXRoIERNSS4gIFJldHVybiBFSU5WQUwuCi0JCSAqLwotCQlpZiAobXAtPm1fc2Iuc2Jfc2hhcmVkX3ZuID09IDAgJiYgKGFwLT5mbGFncyAmIFhGU01OVF9ETUFQSSkpCi0JCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JfQotCi0JaWYgKGFwLT5mbGFncyAmIFhGU01OVF9VUVVPVEEpIHsKLQkJbXAtPm1fcWZsYWdzIHw9IChYRlNfVVFVT1RBX0FDQ1QgfCBYRlNfVVFVT1RBX0FDVElWRSk7Ci0JCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfVVFVT1RBRU5GKQotCQkJbXAtPm1fcWZsYWdzIHw9IFhGU19VUVVPVEFfRU5GRDsKLQl9Ci0KLQlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0dRVU9UQSkgewotCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19HUVVPVEFfQUNDVCB8IFhGU19HUVVPVEFfQUNUSVZFKTsKLQkJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9HUVVPVEFFTkYpCi0JCQltcC0+bV9xZmxhZ3MgfD0gWEZTX09RVU9UQV9FTkZEOwotCX0gZWxzZSBpZiAoYXAtPmZsYWdzICYgWEZTTU5UX1BRVU9UQSkgewotCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19QUVVPVEFfQUNDVCB8IFhGU19QUVVPVEFfQUNUSVZFKTsKLQkJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9QUVVPVEFFTkYpCi0JCQltcC0+bV9xZmxhZ3MgfD0gWEZTX09RVU9UQV9FTkZEOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0xNjY3LDE5ICsxMzk2LDE0IEBACiB7CiAJc3RydWN0IGlub2RlCQkqcm9vdDsKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IE5VTEw7Ci0Jc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzOwogCWludAkJCWZsYWdzID0gMCwgZXJyb3IgPSBFTk9NRU07Ci0KLQlhcmdzID0geGZzX2FyZ3NfYWxsb2NhdGUoc2IsIHNpbGVudCk7Ci0JaWYgKCFhcmdzKQotCQlyZXR1cm4gLUVOT01FTTsKKwljaGFyCQkJKm10cHQgPSBOVUxMOwogCiAJbXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX21vdW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtcCkKLQkJZ290byBvdXRfZnJlZV9hcmdzOworCQlnb3RvIG91dDsKIAogCXNwaW5fbG9ja19pbml0KCZtcC0+bV9zYl9sb2NrKTsKLQltdXRleF9pbml0KCZtcC0+bV9pbG9jayk7CiAJbXV0ZXhfaW5pdCgmbXAtPm1fZ3Jvd2xvY2spOwogCWF0b21pY19zZXQoJm1wLT5tX2FjdGl2ZV90cmFucywgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJm1wLT5tX3N5bmNfbGlzdCk7CkBAIC0xNjg5LDEyICsxNDEzLDkgQEAKIAltcC0+bV9zdXBlciA9IHNiOwogCXNiLT5zX2ZzX2luZm8gPSBtcDsKIAotCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKLQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1JET05MWTsKLQotCWVycm9yID0geGZzX3BhcnNlYXJncyhtcCwgKGNoYXIgKilkYXRhLCBhcmdzLCAwKTsKKwllcnJvciA9IHhmc19wYXJzZWFyZ3MobXAsIChjaGFyICopZGF0YSwgJm10cHQpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfZnJlZV9tcDsKKwkJZ290byBvdXRfZnJlZV9mc25hbWU7CiAKIAlzYl9taW5fYmxvY2tzaXplKHNiLCBCQlNJWkUpOwogCXNiLT5zX3hhdHRyID0geGZzX3hhdHRyX2hhbmRsZXJzOwpAQCAtMTcwMiwzMyArMTQyMywyOCBAQAogCXNiLT5zX3Fjb3AgPSAmeGZzX3F1b3RhY3RsX29wZXJhdGlvbnM7CiAJc2ItPnNfb3AgPSAmeGZzX3N1cGVyX29wZXJhdGlvbnM7CiAKLQllcnJvciA9IHhmc19kbW9wc19nZXQobXAsIGFyZ3MpOworCWVycm9yID0geGZzX2Rtb3BzX2dldChtcCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dF9mcmVlX21wOwotCWVycm9yID0geGZzX3Ftb3BzX2dldChtcCwgYXJncyk7CisJCWdvdG8gb3V0X2ZyZWVfZnNuYW1lOworCWVycm9yID0geGZzX3Ftb3BzX2dldChtcCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9wdXRfZG1vcHM7CiAKLQlpZiAoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfUVVJRVQpCisJaWYgKHNpbGVudCkKIAkJZmxhZ3MgfD0gWEZTX01GU0lfUVVJRVQ7CiAKLQllcnJvciA9IHhmc19vcGVuX2RldmljZXMobXAsIGFyZ3MpOworCWVycm9yID0geGZzX29wZW5fZGV2aWNlcyhtcCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9wdXRfcW1vcHM7CiAKIAlpZiAoeGZzX2ljc2JfaW5pdF9jb3VudGVycyhtcCkpCiAJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT19QRVJDUFVfU0I7CiAKLQkvKgotCSAqIFNldHVwIGZsYWdzIGJhc2VkIG9uIG1vdW50KDIpIG9wdGlvbnMgYW5kIHRoZW4gdGhlIHN1cGVyYmxvY2sKLQkgKi8KLQllcnJvciA9IHhmc19zdGFydF9mbGFncyhhcmdzLCBtcCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9mcmVlX2ZzbmFtZTsKIAllcnJvciA9IHhmc19yZWFkc2IobXAsIGZsYWdzKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2ZyZWVfZnNuYW1lOwotCWVycm9yID0geGZzX2ZpbmlzaF9mbGFncyhhcmdzLCBtcCk7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfY291bnRlcnM7CisKKwllcnJvciA9IHhmc19maW5pc2hfZmxhZ3MobXApOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9zYjsKIApAQCAtMTc0Nyw3ICsxNDYzLDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZpbGVzdHJlYW1fdW5tb3VudDsKIAotCVhGU19TRU5EX01PVU5UKG1wLCBETV9SSUdIVF9OVUxMLCBhcmdzLT5tdHB0LCBhcmdzLT5mc25hbWUpOworCVhGU19TRU5EX01PVU5UKG1wLCBETV9SSUdIVF9OVUxMLCBtdHB0LCBtcC0+bV9mc25hbWUpOwogCiAJc2ItPnNfZGlydCA9IDE7CiAJc2ItPnNfbWFnaWMgPSBYRlNfU0JfTUFHSUM7CkBAIC0xNzcyLDM1ICsxNDg4LDMxIEBACiAJCWdvdG8gZmFpbF92bnJlbGU7CiAJfQogCi0JbXAtPm1fc3luY193b3JrLndfc3luY2VyID0geGZzX3N5bmNfd29ya2VyOwotCW1wLT5tX3N5bmNfd29yay53X21vdW50ID0gbXA7Ci0JbXAtPm1fc3luY190YXNrID0ga3RocmVhZF9ydW4oeGZzc3luY2QsIG1wLCAieGZzc3luY2QiKTsKLQlpZiAoSVNfRVJSKG1wLT5tX3N5bmNfdGFzaykpIHsKLQkJZXJyb3IgPSAtUFRSX0VSUihtcC0+bV9zeW5jX3Rhc2spOworCWVycm9yID0geGZzX3N5bmNkX2luaXQobXApOworCWlmIChlcnJvcikKIAkJZ290byBmYWlsX3ZucmVsZTsKLQl9CisKKwlrZnJlZShtdHB0KTsKIAogCXhmc19pdHJhY2VfZXhpdChYRlNfSShzYi0+c19yb290LT5kX2lub2RlKSk7Ci0KLQlrZnJlZShhcmdzKTsKIAlyZXR1cm4gMDsKIAogIG91dF9maWxlc3RyZWFtX3VubW91bnQ6CiAJeGZzX2ZpbGVzdHJlYW1fdW5tb3VudChtcCk7CiAgb3V0X2ZyZWVfc2I6CiAJeGZzX2ZyZWVzYihtcCk7Ci0gb3V0X2ZyZWVfZnNuYW1lOgotCXhmc19mcmVlX2ZzbmFtZShtcCk7Cisgb3V0X2Rlc3Ryb3lfY291bnRlcnM6CiAJeGZzX2ljc2JfZGVzdHJveV9jb3VudGVycyhtcCk7CiAJeGZzX2Nsb3NlX2RldmljZXMobXApOwogIG91dF9wdXRfcW1vcHM6CiAJeGZzX3Ftb3BzX3B1dChtcCk7CiAgb3V0X3B1dF9kbW9wczoKIAl4ZnNfZG1vcHNfcHV0KG1wKTsKLSBvdXRfZnJlZV9tcDoKKyBvdXRfZnJlZV9mc25hbWU6CisJeGZzX2ZyZWVfZnNuYW1lKG1wKTsKKwlrZnJlZShtdHB0KTsKIAlrZnJlZShtcCk7Ci0gb3V0X2ZyZWVfYXJnczoKLQlrZnJlZShhcmdzKTsKKyBvdXQ6CiAJcmV0dXJuIC1lcnJvcjsKIAogIGZhaWxfdm5yZWxlOgpAQCAtMTgyMCw4ICsxNTMyLDYgQEAKIAl4ZnNfZmlsZXN0cmVhbV91bm1vdW50KG1wKTsKIAogCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7Ci0JZXJyb3IgPSB4ZnNfdW5tb3VudF9mbHVzaChtcCwgMCk7Ci0JV0FSTl9PTihlcnJvcik7CiAKIAl4ZnNfdW5tb3VudGZzKG1wKTsKIAlnb3RvIG91dF9mcmVlX3NiOwpAQCAtMTg4MiwxMCArMTU5MiwxOSBAQAogCWlmICgheGZzX2JtYXBfdHJhY2VfYnVmKQogCQlnb3RvIG91dF9mcmVlX2FsbG9jX3RyYWNlOwogI2VuZGlmCi0jaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKKwl4ZnNfYWxsb2NidF90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0FMTE9DQlRfVFJBQ0VfU0laRSwKKwkJCQkJICAgICBLTV9NQVlGQUlMKTsKKwlpZiAoIXhmc19hbGxvY2J0X3RyYWNlX2J1ZikKKwkJZ290byBvdXRfZnJlZV9ibWFwX3RyYWNlOworCisJeGZzX2lub2J0X3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhYRlNfSU5PQlRfVFJBQ0VfU0laRSwgS01fTUFZRkFJTCk7CisJaWYgKCF4ZnNfaW5vYnRfdHJhY2VfYnVmKQorCQlnb3RvIG91dF9mcmVlX2FsbG9jYnRfdHJhY2U7CisKIAl4ZnNfYm1idF90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQlRfVFJBQ0VfU0laRSwgS01fTUFZRkFJTCk7CiAJaWYgKCF4ZnNfYm1idF90cmFjZV9idWYpCi0JCWdvdG8gb3V0X2ZyZWVfYm1hcF90cmFjZTsKKwkJZ290byBvdXRfZnJlZV9pbm9idF90cmFjZTsKICNlbmRpZgogI2lmZGVmIFhGU19BVFRSX1RSQUNFCiAJeGZzX2F0dHJfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19BVFRSX1RSQUNFX1NJWkUsIEtNX01BWUZBSUwpOwpAQCAtMTkwNyw4ICsxNjI2LDEyIEBACiAJa3RyYWNlX2ZyZWUoeGZzX2F0dHJfdHJhY2VfYnVmKTsKICBvdXRfZnJlZV9ibWJ0X3RyYWNlOgogI2VuZGlmCi0jaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKIAlrdHJhY2VfZnJlZSh4ZnNfYm1idF90cmFjZV9idWYpOworIG91dF9mcmVlX2lub2J0X3RyYWNlOgorCWt0cmFjZV9mcmVlKHhmc19pbm9idF90cmFjZV9idWYpOworIG91dF9mcmVlX2FsbG9jYnRfdHJhY2U6CisJa3RyYWNlX2ZyZWUoeGZzX2FsbG9jYnRfdHJhY2VfYnVmKTsKICBvdXRfZnJlZV9ibWFwX3RyYWNlOgogI2VuZGlmCiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKQEAgLTE5MzEsOCArMTY1NCwxMCBAQAogI2lmZGVmIFhGU19BVFRSX1RSQUNFCiAJa3RyYWNlX2ZyZWUoeGZzX2F0dHJfdHJhY2VfYnVmKTsKICNlbmRpZgotI2lmZGVmIFhGU19CTUJUX1RSQUNFCisjaWZkZWYgWEZTX0JUUkVFX1RSQUNFCiAJa3RyYWNlX2ZyZWUoeGZzX2JtYnRfdHJhY2VfYnVmKTsKKwlrdHJhY2VfZnJlZSh4ZnNfaW5vYnRfdHJhY2VfYnVmKTsKKwlrdHJhY2VfZnJlZSh4ZnNfYWxsb2NidF90cmFjZV9idWYpOwogI2VuZGlmCiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKIAlrdHJhY2VfZnJlZSh4ZnNfYm1hcF90cmFjZV9idWYpOwpAQCAtMTk0NSwxNiArMTY3MCwxMCBAQAogU1RBVElDIGludCBfX2luaXQKIHhmc19pbml0X3pvbmVzKHZvaWQpCiB7Ci0JeGZzX3Zub2RlX3pvbmUgPSBrbWVtX3pvbmVfaW5pdF9mbGFncyhzaXplb2Yoc3RydWN0IGlub2RlKSwgInhmc192bm9kZSIsCi0JCQkJCUtNX1pPTkVfSFdBTElHTiB8IEtNX1pPTkVfUkVDTEFJTSB8Ci0JCQkJCUtNX1pPTkVfU1BSRUFELAotCQkJCQl4ZnNfZnNfaW5vZGVfaW5pdF9vbmNlKTsKLQlpZiAoIXhmc192bm9kZV96b25lKQotCQlnb3RvIG91dDsKIAogCXhmc19pb2VuZF96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19pb2VuZF90KSwgInhmc19pb2VuZCIpOwogCWlmICgheGZzX2lvZW5kX3pvbmUpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfdm5vZGVfem9uZTsKKwkJZ290byBvdXQ7CiAKIAl4ZnNfaW9lbmRfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbCg0ICogTUFYX0JVRl9QRVJfUEFHRSwKIAkJCQkJCSAgeGZzX2lvZW5kX3pvbmUpOwpAQCAtMTk3MCw2ICsxNjg5LDcgQEAKIAkJCQkJCSJ4ZnNfYm1hcF9mcmVlX2l0ZW0iKTsKIAlpZiAoIXhmc19ibWFwX2ZyZWVfaXRlbV96b25lKQogCQlnb3RvIG91dF9kZXN0cm95X2xvZ190aWNrZXRfem9uZTsKKwogCXhmc19idHJlZV9jdXJfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfYnRyZWVfY3VyX3QpLAogCQkJCQkJInhmc19idHJlZV9jdXIiKTsKIAlpZiAoIXhmc19idHJlZV9jdXJfem9uZSkKQEAgLTIwMTcsOCArMTczNyw4IEBACiAKIAl4ZnNfaW5vZGVfem9uZSA9CiAJCWttZW1fem9uZV9pbml0X2ZsYWdzKHNpemVvZih4ZnNfaW5vZGVfdCksICJ4ZnNfaW5vZGUiLAotCQkJCQlLTV9aT05FX0hXQUxJR04gfCBLTV9aT05FX1JFQ0xBSU0gfAotCQkJCQlLTV9aT05FX1NQUkVBRCwgTlVMTCk7CisJCQlLTV9aT05FX0hXQUxJR04gfCBLTV9aT05FX1JFQ0xBSU0gfCBLTV9aT05FX1NQUkVBRCwKKwkJCXhmc19mc19pbm9kZV9pbml0X29uY2UpOwogCWlmICgheGZzX2lub2RlX3pvbmUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfZWZpX3pvbmU7CiAKQEAgLTIwNjYsOCArMTc4Niw2IEBACiAJbWVtcG9vbF9kZXN0cm95KHhmc19pb2VuZF9wb29sKTsKICBvdXRfZGVzdHJveV9pb2VuZF96b25lOgogCWttZW1fem9uZV9kZXN0cm95KHhmc19pb2VuZF96b25lKTsKLSBvdXRfZGVzdHJveV92bm9kZV96b25lOgotCWttZW1fem9uZV9kZXN0cm95KHhmc192bm9kZV96b25lKTsKICBvdXQ6CiAJcmV0dXJuIC1FTk9NRU07CiB9CkBAIC0yMDkyLDcgKzE4MTAsNiBAQAogCWttZW1fem9uZV9kZXN0cm95KHhmc19sb2dfdGlja2V0X3pvbmUpOwogCW1lbXBvb2xfZGVzdHJveSh4ZnNfaW9lbmRfcG9vbCk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2lvZW5kX3pvbmUpOwotCWttZW1fem9uZV9kZXN0cm95KHhmc192bm9kZV96b25lKTsKIAogfQogCkBAIC0yMTAwLDEzICsxODE3LDEyIEBACiBpbml0X3hmc19mcyh2b2lkKQogewogCWludAkJCWVycm9yOwotCXN0YXRpYyBjaGFyCQltZXNzYWdlW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyBcCi0JCVhGU19WRVJTSU9OX1NUUklORyAiIHdpdGggIiBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWRcbiI7CiAKLQlwcmludGsobWVzc2FnZSk7CisJcHJpbnRrKEtFUk5fSU5GTyBYRlNfVkVSU0lPTl9TVFJJTkcgIiB3aXRoICIKKwkJCSBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWRcbiIpOwogCiAJa3RyYWNlX2luaXQoNjQpOwotCXZuX2luaXQoKTsKKwl4ZnNfaW9lbmRfaW5pdCgpOwogCXhmc19kaXJfc3RhcnR1cCgpOwogCiAJZXJyb3IgPSB4ZnNfaW5pdF96b25lcygpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKaW5kZXggZmUyZWY0ZS4uZDVkNzc2ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCkBAIC0yMCwyNCArMjAsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAKLSNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCi0jIGRlZmluZSB2ZnNfaW5zZXJ0ZG1hcGkodmZzKQl2ZnNfaW5zZXJ0b3BzKHZmc3AsICZ4ZnNfZG1vcHMpCi0jIGRlZmluZSB2ZnNfaW5pdGRtYXBpKCkJZG1hcGlfaW5pdCgpCi0jIGRlZmluZSB2ZnNfZXhpdGRtYXBpKCkJZG1hcGlfdW5pbml0KCkKLSNlbHNlCi0jIGRlZmluZSB2ZnNfaW5zZXJ0ZG1hcGkodmZzKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSB2ZnNfaW5pdGRtYXBpKCkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgdmZzX2V4aXRkbWFwaSgpCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1hGU19RVU9UQQotIyBkZWZpbmUgdmZzX2luc2VydHF1b3RhKHZmcykJdmZzX2luc2VydG9wcyh2ZnNwLCAmeGZzX3Ftb3BzKQogZXh0ZXJuIHZvaWQgeGZzX3FtX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB4ZnNfcW1fZXhpdCh2b2lkKTsKICMgZGVmaW5lIHZmc19pbml0cXVvdGEoKQl4ZnNfcW1faW5pdCgpCiAjIGRlZmluZSB2ZnNfZXhpdHF1b3RhKCkJeGZzX3FtX2V4aXQoKQogI2Vsc2UKLSMgZGVmaW5lIHZmc19pbnNlcnRxdW90YSh2ZnMpCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIHZmc19pbml0cXVvdGEoKQlkbyB7IH0gd2hpbGUgKDApCiAjIGRlZmluZSB2ZnNfZXhpdHF1b3RhKCkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCkBAIC0xMDEsOSArODksNiBAQAogCiBleHRlcm4gX191aW50NjRfdCB4ZnNfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCk7CiAKLWV4dGVybiB2b2lkIHhmc19mbHVzaF9pbm9kZShzdHJ1Y3QgeGZzX2lub2RlICopOwotZXh0ZXJuIHZvaWQgeGZzX2ZsdXNoX2RldmljZShzdHJ1Y3QgeGZzX2lub2RlICopOwotCiBleHRlcm4gdm9pZCB4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKHN0cnVjdCB4ZnNfYnVmdGFyZyAqKTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyB4ZnNfZXhwb3J0X29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkMDM1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYwpAQCAtMCwwICsxLDc2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19tcnVfY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZnNfZmlsZXN0cmVhbS5oIgorI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorCisvKgorICogU3luYyBhbGwgdGhlIGlub2RlcyBpbiB0aGUgZ2l2ZW4gQUcgYWNjb3JkaW5nIHRvIHRoZQorICogZGlyZWN0aW9uIGdpdmVuIGJ5IHRoZSBmbGFncy4KKyAqLworU1RBVElDIGludAoreGZzX3N5bmNfaW5vZGVzX2FnKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWFnLAorCWludAkJZmxhZ3MpCit7CisJeGZzX3BlcmFnX3QJKnBhZyA9ICZtcC0+bV9wZXJhZ1thZ107CisJaW50CQlucl9mb3VuZDsKKwl1aW50MzJfdAlmaXJzdF9pbmRleCA9IDA7CisJaW50CQllcnJvciA9IDA7CisJaW50CQlsYXN0X2Vycm9yID0gMDsKKwlpbnQJCWZmbGFnID0gWEZTX0JfQVNZTkM7CisKKwlpZiAoZmxhZ3MgJiBTWU5DX0RFTFdSSSkKKwkJZmZsYWcgPSBYRlNfQl9ERUxXUkk7CisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQlmZmxhZyA9IDA7CQkvKiBzeW5jaHJvbm91cyBvdmVycmlkZXMgYWxsICovCisKKwlkbyB7CisJCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJCXhmc19pbm9kZV90CSppcCA9IE5VTEw7CisJCWludAkJbG9ja19mbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7CisKKwkJLyoKKwkJICogdXNlIGEgZ2FuZyBsb29rdXAgdG8gZmluZCB0aGUgbmV4dCBpbm9kZSBpbiB0aGUgdHJlZQorCQkgKiBhcyB0aGUgdHJlZSBpcyBzcGFyc2UgYW5kIGEgZ2FuZyBsb29rdXAgd2Fsa3MgdG8gZmluZAorCQkgKiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgcmVxdWVzdGVkLgorCQkgKi8KKwkJcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCW5yX2ZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmcGFnLT5wYWdfaWNpX3Jvb3QsCisJCQkJKHZvaWQqKikmaXAsIGZpcnN0X2luZGV4LCAxKTsKKworCQlpZiAoIW5yX2ZvdW5kKSB7CisJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIGluZGV4IGZvciB0aGUgbmV4dCBsb29rdXAuIENhdGNoIG92ZXJmbG93cworCQkgKiBpbnRvIHRoZSBuZXh0IEFHIHJhbmdlIHdoaWNoIGNhbiBvY2N1ciBpZiB3ZSBoYXZlIGlub2RlcworCQkgKiBpbiB0aGUgbGFzdCBibG9jayBvZiB0aGUgQUcgYW5kIHdlIGFyZSBjdXJyZW50bHkKKwkJICogcG9pbnRpbmcgdG8gdGhlIGxhc3QgaW5vZGUuCisJCSAqLworCQlmaXJzdF9pbmRleCA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyArIDEpOworCQlpZiAoZmlyc3RfaW5kZXggPCBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8pKSB7CisJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBub3RoaW5nIHRvIHN5bmMgZHVyaW5nIHNodXRkb3duICovCisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UgY2FuJ3QgZ2V0IGEgcmVmZXJlbmNlIG9uIHRoZSBpbm9kZSwgaXQgbXVzdCBiZQorCQkgKiBpbiByZWNsYWltLiBMZWF2ZSBpdCBmb3IgdGhlIHJlY2xhaW0gY29kZSB0byBmbHVzaC4KKwkJICovCisJCWlub2RlID0gVkZTX0koaXApOworCQlpZiAoIWlncmFiKGlub2RlKSkgeworCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisKKwkJLyogYXZvaWQgbmV3IG9yIGJhZCBpbm9kZXMgKi8KKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKKwkJICAgIHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcpKSB7CisJCQlJUkVMRShpcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgdG8gZmx1c2ggZGF0YSBvciB3YWl0IGZvciBJL08gY29tcGxldGlvbgorCQkgKiB3ZSBuZWVkIHRvIGhvbGQgdGhlIGlvbG9jay4KKwkJICovCisJCWlmICgoZmxhZ3MgJiBTWU5DX0RFTFdSSSkgJiYgVk5fRElSVFkoaW5vZGUpKSB7CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKwkJCWxvY2tfZmxhZ3MgfD0gWEZTX0lPTE9DS19TSEFSRUQ7CisJCQllcnJvciA9IHhmc19mbHVzaF9wYWdlcyhpcCwgMCwgLTEsIGZmbGFnLCBGSV9OT05FKTsKKwkJCWlmIChmbGFncyAmIFNZTkNfSU9XQUlUKQorCQkJCXhmc19pb2VuZF93YWl0KGlwKTsKKwkJfQorCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJCWlmICgoZmxhZ3MgJiBTWU5DX0FUVFIpICYmICF4ZnNfaW5vZGVfY2xlYW4oaXApKSB7CisJCQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpIHsKKwkJCQl4ZnNfaWZsb2NrKGlwKTsKKwkJCQlpZiAoIXhmc19pbm9kZV9jbGVhbihpcCkpCisJCQkJCWVycm9yID0geGZzX2lmbHVzaChpcCwgWEZTX0lGTFVTSF9TWU5DKTsKKwkJCQllbHNlCisJCQkJCXhmc19pZnVubG9jayhpcCk7CisJCQl9IGVsc2UgaWYgKHhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkJCWlmICgheGZzX2lub2RlX2NsZWFuKGlwKSkKKwkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLCBYRlNfSUZMVVNIX0RFTFdSSSk7CisJCQkJZWxzZQorCQkJCQl4ZnNfaWZ1bmxvY2soaXApOworCQkJfQorCQl9CisJCXhmc19pcHV0KGlwLCBsb2NrX2ZsYWdzKTsKKworCQlpZiAoZXJyb3IpCisJCQlsYXN0X2Vycm9yID0gZXJyb3I7CisJCS8qCisJCSAqIGJhaWwgb3V0IGlmIHRoZSBmaWxlc3lzdGVtIGlzIGNvcnJ1cHRlZC4KKwkJICovCisJCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKworCX0gd2hpbGUgKG5yX2ZvdW5kKTsKKworCXJldHVybiBsYXN0X2Vycm9yOworfQorCitpbnQKK3hmc19zeW5jX2lub2RlcygKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQlmbGFncykKK3sKKwlpbnQJCWVycm9yOworCWludAkJbGFzdF9lcnJvcjsKKwlpbnQJCWk7CisJaW50CQlsZmxhZ3MgPSBYRlNfTE9HX0ZPUkNFOworCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkKKwkJcmV0dXJuIDA7CisJZXJyb3IgPSAwOworCWxhc3RfZXJyb3IgPSAwOworCisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQlsZmxhZ3MgfD0gWEZTX0xPR19TWU5DOworCisJZm9yIChpID0gMDsgaSA8IG1wLT5tX3NiLnNiX2FnY291bnQ7IGkrKykgeworCQlpZiAoIW1wLT5tX3BlcmFnW2ldLnBhZ19pY2lfaW5pdCkKKwkJCWNvbnRpbnVlOworCQllcnJvciA9IHhmc19zeW5jX2lub2Rlc19hZyhtcCwgaSwgZmxhZ3MpOworCQlpZiAoZXJyb3IpCisJCQlsYXN0X2Vycm9yID0gZXJyb3I7CisJCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCQlicmVhazsKKwl9CisJaWYgKGZsYWdzICYgU1lOQ19ERUxXUkkpCisJCXhmc19sb2dfZm9yY2UobXAsIDAsIGxmbGFncyk7CisKKwlyZXR1cm4gWEZTX0VSUk9SKGxhc3RfZXJyb3IpOworfQorCitTVEFUSUMgaW50Cit4ZnNfY29tbWl0X2R1bW15X3RyYW5zKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXVpbnQJCQlsb2dfZmxhZ3MpCit7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBtcC0+bV9yb290aXA7CisJc3RydWN0IHhmc190cmFucwkqdHA7CisJaW50CQkJZXJyb3I7CisKKwkvKgorCSAqIFB1dCBhIGR1bW15IHRyYW5zYWN0aW9uIGluIHRoZSBsb2cgdG8gdGVsbCByZWNvdmVyeQorCSAqIHRoYXQgYWxsIG90aGVycyBhcmUgT0suCisJICovCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEpOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLCAwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJLyogWFhYKGhjaCk6IGlnbm9yaW5nIHRoZSBlcnJvciBoZXJlLi4gKi8KKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDApOworCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCXhmc19sb2dfZm9yY2UobXAsIDAsIGxvZ19mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX3N5bmNfZnNkYXRhKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCWludAkJCWZsYWdzKQoreworCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CisJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcDsKKwlpbnQJCQllcnJvciA9IDA7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgeGZzc3luY2QoKSB0aGVuIG9ubHkgc3luYyB0aGUgc3VwZXJibG9jayBpZiB3ZSBjYW4KKwkgKiBsb2NrIGl0IHdpdGhvdXQgc2xlZXBpbmcgYW5kIGl0IGlzIG5vdCBwaW5uZWQuCisJICovCisJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKSB7CisJCUFTU0VSVCghKGZsYWdzICYgU1lOQ19XQUlUKSk7CisKKwkJYnAgPSB4ZnNfZ2V0c2IobXAsIFhGU19CVUZfVFJZTE9DSyk7CisJCWlmICghYnApCisJCQlnb3RvIG91dDsKKworCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgc3RydWN0IHhmc19idWZfbG9nX2l0ZW0gKik7CisJCWlmICghYmlwIHx8ICF4ZnNfYnVmX2l0ZW1fZGlydHkoYmlwKSB8fCBYRlNfQlVGX0lTUElOTkVEKGJwKSkKKwkJCWdvdG8gb3V0X2JyZWxzZTsKKwl9IGVsc2UgeworCQlicCA9IHhmc19nZXRzYihtcCwgMCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QKKwkJICogZ2V0IHN0dWNrIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGZvciBzb21lb25lLCBtYXliZQorCQkgKiBvdXJzZWx2ZXMsIHRvIGZsdXNoIHRoZSBsb2cuCisJCSAqCisJCSAqIEV2ZW4gdGhvdWdoIHdlIGp1c3QgcHVzaGVkIHRoZSBsb2cgYWJvdmUsIHdlIGRpZCBub3QgaGF2ZQorCQkgKiB0aGUgc3VwZXJibG9jayBidWZmZXIgbG9ja2VkIGF0IHRoYXQgcG9pbnQgc28gaXQgY2FuCisJCSAqIGJlY29tZSBwaW5uZWQgaW4gYmV0d2VlbiB0aGVyZSBhbmQgaGVyZS4KKwkJICovCisJCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkKKwkJCXhmc19sb2dfZm9yY2UobXAsIDAsIFhGU19MT0dfRk9SQ0UpOworCX0KKworCisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQlYRlNfQlVGX1VOQVNZTkMoYnApOworCWVsc2UKKwkJWEZTX0JVRl9BU1lOQyhicCk7CisKKwlyZXR1cm4geGZzX2J3cml0ZShtcCwgYnApOworCisgb3V0X2JyZWxzZToKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogV2hlbiByZW1vdW50aW5nIGEgZmlsZXN5c3RlbSByZWFkLW9ubHkgb3IgZnJlZXppbmcgdGhlIGZpbGVzeXN0ZW0sIHdlIGhhdmUKKyAqIHR3byBwaGFzZXMgdG8gZXhlY3V0ZS4gVGhpcyBmaXJzdCBwaGFzZSBpcyBzeW5jaW5nIHRoZSBkYXRhIGJlZm9yZSB3ZQorICogcXVpZXNjZSB0aGUgZmlsZXN5c3RlbSwgYW5kIHRoZSBzZWNvbmQgaXMgZmx1c2hpbmcgYWxsIHRoZSBpbm9kZXMgb3V0IGFmdGVyCisgKiB3ZSd2ZSB3YWl0ZWQgZm9yIGFsbCB0aGUgdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYnkgdGhlIGZpcnN0IHBoYXNlIHRvCisgKiBjb21wbGV0ZS4gVGhlIHNlY29uZCBwaGFzZSBlbnN1cmVzIHRoYXQgdGhlIGlub2RlcyBhcmUgd3JpdHRlbiB0byB0aGVpcgorICogbG9jYXRpb24gb24gZGlzayByYXRoZXIgdGhhbiBqdXN0IGV4aXN0aW5nIGluIHRyYW5zYWN0aW9ucyBpbiB0aGUgbG9nLiBUaGlzCisgKiBtZWFucyBhZnRlciBhIHF1aWVzY2UgdGhlcmUgaXMgbm8gbG9nIHJlcGxheSByZXF1aXJlZCB0byB3cml0ZSB0aGUgaW5vZGVzIHRvCisgKiBkaXNrICh0aGlzIGlzIHRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHN5bmMgYW5kIGEgcXVpZXNjZSkuCisgKi8KKy8qCisgKiBGaXJzdCBzdGFnZSBvZiBmcmVlemUgLSBubyB3cml0ZXJzIHdpbGwgbWFrZSBwcm9ncmVzcyBub3cgd2UgYXJlIGhlcmUsCisgKiBzbyB3ZSBmbHVzaCBkZWx3cmkgYW5kIGRlbGFsbG9jIGJ1ZmZlcnMgaGVyZSwgdGhlbiB3YWl0IGZvciBhbGwgSS9PIHRvCisgKiBjb21wbGV0ZS4gIERhdGEgaXMgZnJvemVuIGF0IHRoYXQgcG9pbnQuIE1ldGFkYXRhIGlzIG5vdCBmcm96ZW4sCisgKiB0cmFuc2FjdGlvbnMgY2FuIHN0aWxsIG9jY3VyIGhlcmUgc28gZG9uJ3QgYm90aGVyIGZsdXNoaW5nIHRoZSBidWZ0YXJnCisgKiBiZWNhdXNlIGl0J2xsIGp1c3QgZ2V0IGRpcnR5IGFnYWluLgorICovCitpbnQKK3hmc19xdWllc2NlX2RhdGEoCisJc3RydWN0IHhmc19tb3VudAkqbXApCit7CisJaW50IGVycm9yOworCisJLyogcHVzaCBub24tYmxvY2tpbmcgKi8KKwl4ZnNfc3luY19pbm9kZXMobXAsIFNZTkNfREVMV1JJfFNZTkNfQkRGTFVTSCk7CisJWEZTX1FNX0RRU1lOQyhtcCwgU1lOQ19CREZMVVNIKTsKKwl4ZnNfZmlsZXN0cmVhbV9mbHVzaChtcCk7CisKKwkvKiBwdXNoIGFuZCBibG9jayAqLworCXhmc19zeW5jX2lub2RlcyhtcCwgU1lOQ19ERUxXUkl8U1lOQ19XQUlUfFNZTkNfSU9XQUlUKTsKKwlYRlNfUU1fRFFTWU5DKG1wLCBTWU5DX1dBSVQpOworCisJLyogd3JpdGUgc3VwZXJibG9jayBhbmQgaG9vdmVyIHVwIHNodXRkb3duIGVycm9ycyAqLworCWVycm9yID0geGZzX3N5bmNfZnNkYXRhKG1wLCAwKTsKKworCS8qIGZsdXNoIGRhdGEtb25seSBkZXZpY2VzICovCisJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwKQorCQlYRlNfYmZsdXNoKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIHZvaWQKK3hmc19xdWllc2NlX2ZzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQoreworCWludAljb3VudCA9IDAsIHBpbmNvdW50OworCisJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMCk7CisJeGZzX3JlY2xhaW1faW5vZGVzKG1wLCAwLCBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX0FTWU5DKTsKKworCS8qCisJICogVGhpcyBsb29wIG11c3QgcnVuIGF0IGxlYXN0IHR3aWNlLiAgVGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBsb29wCisJICogd2lsbCBmbHVzaCBtb3N0IG1ldGEgZGF0YSBidXQgdGhhdCB3aWxsIGdlbmVyYXRlIG1vcmUgbWV0YSBkYXRhCisJICogKHR5cGljYWxseSBkaXJlY3RvcnkgdXBkYXRlcykuICBXaGljaCB0aGVuIG11c3QgYmUgZmx1c2hlZCBhbmQKKwkgKiBsb2dnZWQgYmVmb3JlIHdlIGNhbiB3cml0ZSB0aGUgdW5tb3VudCByZWNvcmQuCisJICovCisJZG8geworCQl4ZnNfc3luY19pbm9kZXMobXAsIFNZTkNfQVRUUnxTWU5DX1dBSVQpOworCQlwaW5jb3VudCA9IHhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOworCQlpZiAoIXBpbmNvdW50KSB7CisJCQlkZWxheSg1MCk7CisJCQljb3VudCsrOworCQl9CisJfSB3aGlsZSAoY291bnQgPCAyKTsKK30KKworLyoKKyAqIFNlY29uZCBzdGFnZSBvZiBhIHF1aWVzY2UuIFRoZSBkYXRhIGlzIGFscmVhZHkgc3luY2VkLCBub3cgd2UgaGF2ZSB0byB0YWtlCisgKiBjYXJlIG9mIHRoZSBtZXRhZGF0YS4gTmV3IHRyYW5zYWN0aW9ucyBhcmUgYWxyZWFkeSBibG9ja2VkLCBzbyB3ZSBuZWVkIHRvCisgKiB3YWl0IGZvciBhbnkgcmVtYWluaW5nIHRyYW5zYWN0aW9ucyB0byBkcmFpbiBvdXQgYmVmb3JlIHByb2NlZGluZy4KKyAqLwordm9pZAoreGZzX3F1aWVzY2VfYXR0cigKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKK3sKKwlpbnQJZXJyb3IgPSAwOworCisJLyogd2FpdCBmb3IgYWxsIG1vZGlmaWNhdGlvbnMgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJm1wLT5tX2FjdGl2ZV90cmFucykgPiAwKQorCQlkZWxheSgxMDApOworCisJLyogZmx1c2ggaW5vZGVzIGFuZCBwdXNoIGFsbCByZW1haW5pbmcgYnVmZmVycyBvdXQgdG8gZGlzayAqLworCXhmc19xdWllc2NlX2ZzKG1wKTsKKworCUFTU0VSVF9BTFdBWVMoYXRvbWljX3JlYWQoJm1wLT5tX2FjdGl2ZV90cmFucykgPT0gMCk7CisKKwkvKiBQdXNoIHRoZSBzdXBlcmJsb2NrIGFuZCB3cml0ZSBhbiB1bm1vdW50IHJlY29yZCAqLworCWVycm9yID0geGZzX2xvZ19zYmNvdW50KG1wLCAxKTsKKwlpZiAoZXJyb3IpCisJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJCSJ4ZnNfYXR0cl9xdWllc2NlOiBmYWlsZWQgdG8gbG9nIHNiIGNoYW5nZXMuICIKKwkJCQkiRnJvemVuIGltYWdlIG1heSBub3QgYmUgY29uc2lzdGVudC4iKTsKKwl4ZnNfbG9nX3VubW91bnRfd3JpdGUobXApOworCXhmc191bm1vdW50ZnNfd3JpdGVzYihtcCk7Cit9CisKKy8qCisgKiBFbnF1ZXVlIGEgd29yayBpdGVtIHRvIGJlIHBpY2tlZCB1cCBieSB0aGUgdmZzIHhmc3N5bmNkIHRocmVhZC4KKyAqIERvaW5nIHRoaXMgaGFzIHR3byBhZHZhbnRhZ2VzOgorICogLSBJdCBzYXZlcyBvbiBzdGFjayBzcGFjZSwgd2hpY2ggaXMgdGlnaHQgaW4gY2VydGFpbiBzaXR1YXRpb25zCisgKiAtIEl0IGNhbiBiZSB1c2VkICh3aXRoIGNhcmUpIGFzIGEgbWVjaGFuaXNtIHRvIGF2b2lkIGRlYWRsb2Nrcy4KKyAqIEZsdXNoaW5nIHdoaWxlIGFsbG9jYXRpbmcgaW4gYSBmdWxsIGZpbGVzeXN0ZW0gcmVxdWlyZXMgYm90aC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19zeW5jZF9xdWV1ZV93b3JrKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXZvaWQJCSpkYXRhLAorCXZvaWQJCSgqc3luY2VyKShzdHJ1Y3QgeGZzX21vdW50ICosIHZvaWQgKikpCit7CisJc3RydWN0IGJodl92ZnNfc3luY193b3JrICp3b3JrOworCisJd29yayA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaHZfdmZzX3N5bmNfd29yayksIEtNX1NMRUVQKTsKKwlJTklUX0xJU1RfSEVBRCgmd29yay0+d19saXN0KTsKKwl3b3JrLT53X3N5bmNlciA9IHN5bmNlcjsKKwl3b3JrLT53X2RhdGEgPSBkYXRhOworCXdvcmstPndfbW91bnQgPSBtcDsKKwlzcGluX2xvY2soJm1wLT5tX3N5bmNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmd29yay0+d19saXN0LCAmbXAtPm1fc3luY19saXN0KTsKKwlzcGluX3VubG9jaygmbXAtPm1fc3luY19sb2NrKTsKKwl3YWtlX3VwX3Byb2Nlc3MobXAtPm1fc3luY190YXNrKTsKK30KKworLyoKKyAqIEZsdXNoIGRlbGF5ZWQgYWxsb2NhdGUgZGF0YSwgYXR0ZW1wdGluZyB0byBmcmVlIHVwIHJlc2VydmVkIHNwYWNlCisgKiBmcm9tIGV4aXN0aW5nIGFsbG9jYXRpb25zLiAgQXQgdGhpcyBwb2ludCBhIG5ldyBhbGxvY2F0aW9uIGF0dGVtcHQKKyAqIGhhcyBmYWlsZWQgd2l0aCBFTk9TUEMgYW5kIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBzY3JhdGNoaW5nIG91cgorICogaGVhZHMsIGxvb2tpbmcgYWJvdXQgZm9yIG1vcmUgcm9vbS4uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2ZsdXNoX2lub2RlX3dvcmsoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJdm9pZAkJKmFyZykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gYXJnOworCWZpbGVtYXBfZmx1c2goaW5vZGUtPmlfbWFwcGluZyk7CisJaXB1dChpbm9kZSk7Cit9CisKK3ZvaWQKK3hmc19mbHVzaF9pbm9kZSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IFZGU19JKGlwKTsKKworCWlncmFiKGlub2RlKTsKKwl4ZnNfc3luY2RfcXVldWVfd29yayhpcC0+aV9tb3VudCwgaW5vZGUsIHhmc19mbHVzaF9pbm9kZV93b3JrKTsKKwlkZWxheShtc2Vjc190b19qaWZmaWVzKDUwMCkpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgImJpZ2dlciBoYW1tZXIiIHZlcnNpb24gb2YgeGZzX2ZsdXNoX2lub2RlX3dvcmsuLi4KKyAqIChJT1csICJJZiBhdCBmaXJzdCB5b3UgZG9uJ3Qgc3VjY2VlZCwgdXNlIGEgQmlnZ2VyIEhhbW1lciIpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2ZsdXNoX2RldmljZV93b3JrKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXZvaWQJCSphcmcpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGFyZzsKKwlzeW5jX2Jsb2NrZGV2KG1wLT5tX3N1cGVyLT5zX2JkZXYpOworCWlwdXQoaW5vZGUpOworfQorCit2b2lkCit4ZnNfZmx1c2hfZGV2aWNlKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gVkZTX0koaXApOworCisJaWdyYWIoaW5vZGUpOworCXhmc19zeW5jZF9xdWV1ZV93b3JrKGlwLT5pX21vdW50LCBpbm9kZSwgeGZzX2ZsdXNoX2RldmljZV93b3JrKTsKKwlkZWxheShtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCXhmc19sb2dfZm9yY2UoaXAtPmlfbW91bnQsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOworfQorCisvKgorICogRXZlcnkgc3luYyBwZXJpb2Qgd2UgbmVlZCB0byB1bnBpbiBhbGwgaXRlbXMsIHJlY2xhaW0gaW5vZGVzLCBzeW5jCisgKiBxdW90YSBhbmQgd3JpdGUgb3V0IHRoZSBzdXBlcmJsb2NrLiBXZSBtaWdodCBuZWVkIHRvIGNvdmVyIHRoZSBsb2cKKyAqIHRvIGluZGljYXRlIGl0IGlzIGlkbGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfc3luY193b3JrZXIoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJdm9pZAkJKnVudXNlZCkKK3sKKwlpbnQJCWVycm9yOworCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKSkgeworCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOworCQl4ZnNfcmVjbGFpbV9pbm9kZXMobXAsIDAsIFhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMpOworCQkvKiBkZ2M6IGVycm9ycyBpZ25vcmVkIGhlcmUgKi8KKwkJZXJyb3IgPSBYRlNfUU1fRFFTWU5DKG1wLCBTWU5DX0JERkxVU0gpOworCQllcnJvciA9IHhmc19zeW5jX2ZzZGF0YShtcCwgU1lOQ19CREZMVVNIKTsKKwkJaWYgKHhmc19sb2dfbmVlZF9jb3ZlcmVkKG1wKSkKKwkJCWVycm9yID0geGZzX2NvbW1pdF9kdW1teV90cmFucyhtcCwgWEZTX0xPR19GT1JDRSk7CisJfQorCW1wLT5tX3N5bmNfc2VxKys7CisJd2FrZV91cCgmbXAtPm1fd2FpdF9zaW5nbGVfc3luY190YXNrKTsKK30KKworU1RBVElDIGludAoreGZzc3luY2QoCisJdm9pZAkJCSphcmcpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBhcmc7CisJbG9uZwkJCXRpbWVsZWZ0OworCWJodl92ZnNfc3luY193b3JrX3QJKndvcmssICpuOworCUxJU1RfSEVBRAkJKHRtcCk7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJdGltZWxlZnQgPSB4ZnNfc3luY2RfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CisJZm9yICg7OykgeworCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbGVmdCk7CisJCS8qIHN3c3VzcCAqLworCQl0cnlfdG9fZnJlZXplKCk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgbGlzdF9lbXB0eSgmbXAtPm1fc3luY19saXN0KSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9jaygmbXAtPm1fc3luY19sb2NrKTsKKwkJLyoKKwkJICogV2UgY2FuIGdldCB3b2tlbiBieSBsYXB0b3AgbW9kZSwgdG8gZG8gYSBzeW5jIC0KKwkJICogdGhhdCdzIHRoZSAob25seSEpIGNhc2Ugd2hlcmUgdGhlIGxpc3Qgd291bGQgYmUKKwkJICogZW1wdHkgd2l0aCB0aW1lIHJlbWFpbmluZy4KKwkJICovCisJCWlmICghdGltZWxlZnQgfHwgbGlzdF9lbXB0eSgmbXAtPm1fc3luY19saXN0KSkgeworCQkJaWYgKCF0aW1lbGVmdCkKKwkJCQl0aW1lbGVmdCA9IHhmc19zeW5jZF9jZW50aXNlY3MgKgorCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTApOworCQkJSU5JVF9MSVNUX0hFQUQoJm1wLT5tX3N5bmNfd29yay53X2xpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmbXAtPm1fc3luY193b3JrLndfbGlzdCwKKwkJCQkJJm1wLT5tX3N5bmNfbGlzdCk7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIG4sICZtcC0+bV9zeW5jX2xpc3QsIHdfbGlzdCkKKwkJCWxpc3RfbW92ZSgmd29yay0+d19saXN0LCAmdG1wKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX3N5bmNfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIG4sICZ0bXAsIHdfbGlzdCkgeworCQkJKCp3b3JrLT53X3N5bmNlcikobXAsIHdvcmstPndfZGF0YSk7CisJCQlsaXN0X2RlbCgmd29yay0+d19saXN0KTsKKwkJCWlmICh3b3JrID09ICZtcC0+bV9zeW5jX3dvcmspCisJCQkJY29udGludWU7CisJCQlrbWVtX2ZyZWUod29yayk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfc3luY2RfaW5pdCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKK3sKKwltcC0+bV9zeW5jX3dvcmsud19zeW5jZXIgPSB4ZnNfc3luY193b3JrZXI7CisJbXAtPm1fc3luY193b3JrLndfbW91bnQgPSBtcDsKKwltcC0+bV9zeW5jX3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNzeW5jZCwgbXAsICJ4ZnNzeW5jZCIpOworCWlmIChJU19FUlIobXAtPm1fc3luY190YXNrKSkKKwkJcmV0dXJuIC1QVFJfRVJSKG1wLT5tX3N5bmNfdGFzayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3hmc19zeW5jZF9zdG9wKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQoreworCWt0aHJlYWRfc3RvcChtcC0+bV9zeW5jX3Rhc2spOworfQorCitpbnQKK3hmc19yZWNsYWltX2lub2RlKAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCWxvY2tlZCwKKwlpbnQJCXN5bmNfbW9kZSkKK3sKKwl4ZnNfcGVyYWdfdAkqcGFnID0geGZzX2dldF9wZXJhZyhpcC0+aV9tb3VudCwgaXAtPmlfaW5vKTsKKworCS8qIFRoZSBoYXNoIGxvY2sgaGVyZSBwcm90ZWN0cyBhIHRocmVhZCBpbiB4ZnNfaWdldF9jb3JlIGZyb20KKwkgKiByYWNpbmcgd2l0aCB1cyBvbiBsaW5raW5nIHRoZSBpbm9kZSBiYWNrIHdpdGggYSB2bm9kZS4KKwkgKiBPbmNlIHdlIGhhdmUgdGhlIFhGU19JUkVDTEFJTSBmbGFnIHNldCBpdCB3aWxsIG5vdCB0b3VjaAorCSAqIHVzLgorCSAqLworCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCWlmIChfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSB8fAorCSAgICAhX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpKSB7CisJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCWlmIChsb2NrZWQpIHsKKwkJCXhmc19pZnVubG9jayhpcCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl9CisJCXJldHVybiAxOworCX0KKwlfX3hmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU0pOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwl4ZnNfcHV0X3BlcmFnKGlwLT5pX21vdW50LCBwYWcpOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgaXMgc3RpbGwgZGlydHksIHRoZW4gZmx1c2ggaXQgb3V0LiAgSWYgdGhlIGlub2RlCisJICogaXMgbm90IGluIHRoZSBBSUwsIHRoZW4gaXQgd2lsbCBiZSBPSyB0byBmbHVzaCBpdCBkZWx3cmkgYXMKKwkgKiBsb25nIGFzIHhmc19pZmx1c2goKSBkb2VzIG5vdCBrZWVwIGFueSByZWZlcmVuY2VzIHRvIHRoZSBpbm9kZS4KKwkgKiBXZSBsZWF2ZSB0aGF0IGRlY2lzaW9uIHVwIHRvIHhmc19pZmx1c2goKSBzaW5jZSBpdCBoYXMgdGhlCisJICoga25vd2xlZGdlIG9mIHdoZXRoZXIgaXQncyBPSyB0byBzaW1wbHkgZG8gYSBkZWx3cmkgZmx1c2ggb2YKKwkgKiB0aGUgaW5vZGUgb3Igd2hldGhlciB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGlub2RlIGlzCisJICogcHVsbGVkIGZyb20gdGhlIEFJTC4KKwkgKiBXZSBnZXQgdGhlIGZsdXNoIGxvY2sgcmVnYXJkbGVzcywgdGhvdWdoLCBqdXN0IHRvIG1ha2Ugc3VyZQorCSAqIHdlIGRvbid0IGZyZWUgaXQgd2hpbGUgaXQgaXMgYmVpbmcgZmx1c2hlZC4KKwkgKi8KKwlpZiAoIWxvY2tlZCkgeworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2lmbG9jayhpcCk7CisJfQorCisJLyoKKwkgKiBJbiB0aGUgY2FzZSBvZiBhIGZvcmNlZCBzaHV0ZG93biB3ZSByZWx5IG9uIHhmc19pZmx1c2goKSB0bworCSAqIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBiZSB1bnBpbm5lZCBiZWZvcmUgcmV0dXJuaW5nIGFuIGVycm9yLgorCSAqLworCWlmICghaXNfYmFkX2lub2RlKFZGU19JKGlwKSkgJiYgeGZzX2lmbHVzaChpcCwgc3luY19tb2RlKSA9PSAwKSB7CisJCS8qIHN5bmNocm9uaXplIHdpdGggeGZzX2lmbHVzaF9kb25lICovCisJCXhmc19pZmxvY2soaXApOworCQl4ZnNfaWZ1bmxvY2soaXApOworCX0KKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX2lyZWNsYWltKGlwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIHNldCB0aGUgaW5vZGUgZmxhZyBhdG9taWNhbGx5IHdpdGggdGhlIHJhZGl4IHRyZWUgdGFnLgorICogT25jZSB3ZSBnZXQgdGFnIGxvb2t1cHMgb24gdGhlIHJhZGl4IHRyZWUsIHRoaXMgaW5vZGUgZmxhZworICogY2FuIGdvIGF3YXkuCisgKi8KK3ZvaWQKK3hmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19wZXJhZ190CSpwYWcgPSB4ZnNfZ2V0X3BlcmFnKG1wLCBpcC0+aV9pbm8pOworCisJcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlyYWRpeF90cmVlX3RhZ19zZXQoJnBhZy0+cGFnX2ljaV9yb290LAorCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKSwgWEZTX0lDSV9SRUNMQUlNX1RBRyk7CisJX194ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lSRUNMQUlNQUJMRSk7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJeGZzX3B1dF9wZXJhZyhtcCwgcGFnKTsKK30KKwordm9pZAorX194ZnNfaW5vZGVfY2xlYXJfcmVjbGFpbV90YWcoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19wZXJhZ190CSpwYWcsCisJeGZzX2lub2RlX3QJKmlwKQoreworCXJhZGl4X3RyZWVfdGFnX2NsZWFyKCZwYWctPnBhZ19pY2lfcm9vdCwKKwkJCVhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyksIFhGU19JQ0lfUkVDTEFJTV9UQUcpOworfQorCit2b2lkCit4ZnNfaW5vZGVfY2xlYXJfcmVjbGFpbV90YWcoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19wZXJhZ190CSpwYWcgPSB4ZnNfZ2V0X3BlcmFnKG1wLCBpcC0+aV9pbm8pOworCisJcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlfX3hmc19pbm9kZV9jbGVhcl9yZWNsYWltX3RhZyhtcCwgcGFnLCBpcCk7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJeGZzX3B1dF9wZXJhZyhtcCwgcGFnKTsKK30KKworCitTVEFUSUMgdm9pZAoreGZzX3JlY2xhaW1faW5vZGVzX2FnKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWFnLAorCWludAkJbm9ibG9jaywKKwlpbnQJCW1vZGUpCit7CisJeGZzX2lub2RlX3QJKmlwID0gTlVMTDsKKwl4ZnNfcGVyYWdfdAkqcGFnID0gJm1wLT5tX3BlcmFnW2FnXTsKKwlpbnQJCW5yX2ZvdW5kOworCXVpbnQzMl90CWZpcnN0X2luZGV4OworCWludAkJc2tpcHBlZDsKKworcmVzdGFydDoKKwlmaXJzdF9pbmRleCA9IDA7CisJc2tpcHBlZCA9IDA7CisJZG8geworCQkvKgorCQkgKiB1c2UgYSBnYW5nIGxvb2t1cCB0byBmaW5kIHRoZSBuZXh0IGlub2RlIGluIHRoZSB0cmVlCisJCSAqIGFzIHRoZSB0cmVlIGlzIHNwYXJzZSBhbmQgYSBnYW5nIGxvb2t1cCB3YWxrcyB0byBmaW5kCisJCSAqIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZXF1ZXN0ZWQuCisJCSAqLworCQlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZygmcGFnLT5wYWdfaWNpX3Jvb3QsCisJCQkJCSh2b2lkKiopJmlwLCBmaXJzdF9pbmRleCwgMSwKKwkJCQkJWEZTX0lDSV9SRUNMQUlNX1RBRyk7CisKKwkJaWYgKCFucl9mb3VuZCkgeworCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBpbmRleCBmb3IgdGhlIG5leHQgbG9va3VwLiBDYXRjaCBvdmVyZmxvd3MKKwkJICogaW50byB0aGUgbmV4dCBBRyByYW5nZSB3aGljaCBjYW4gb2NjdXIgaWYgd2UgaGF2ZSBpbm9kZXMKKwkJICogaW4gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIEFHIGFuZCB3ZSBhcmUgY3VycmVudGx5CisJCSAqIHBvaW50aW5nIHRvIHRoZSBsYXN0IGlub2RlLgorCQkgKi8KKwkJZmlyc3RfaW5kZXggPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8gKyAxKTsKKwkJaWYgKGZpcnN0X2luZGV4IDwgWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKSkgeworCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaWdub3JlIGlmIGFscmVhZHkgdW5kZXIgcmVjbGFpbSAqLworCQlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU0pKSB7CisJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobm9ibG9jaykgeworCQkJaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKKwkJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHhmc19pcGluY291bnQoaXApIHx8CisJCQkgICAgIXhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCisJCS8qCisJCSAqIGhtbW0gLSB0aGlzIGlzIGFuIGlub2RlIGFscmVhZHkgaW4gcmVjbGFpbS4gRG8KKwkJICogd2UgZXZlbiBib3RoZXIgY2F0Y2hpbmcgaXQgaGVyZT8KKwkJICovCisJCWlmICh4ZnNfcmVjbGFpbV9pbm9kZShpcCwgbm9ibG9jaywgbW9kZSkpCisJCQlza2lwcGVkKys7CisJfSB3aGlsZSAobnJfZm91bmQpOworCisJaWYgKHNraXBwZWQpIHsKKwkJZGVsYXkoMSk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJcmV0dXJuOworCit9CisKK2ludAoreGZzX3JlY2xhaW1faW5vZGVzKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCSBub2Jsb2NrLAorCWludAkJbW9kZSkKK3sKKwlpbnQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaSsrKSB7CisJCWlmICghbXAtPm1fcGVyYWdbaV0ucGFnX2ljaV9pbml0KQorCQkJY29udGludWU7CisJCXhmc19yZWNsYWltX2lub2Rlc19hZyhtcCwgaSwgbm9ibG9jaywgbW9kZSk7CisJfQorCXJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjZkZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaWZuZGVmIFhGU19TWU5DX0gKKyNkZWZpbmUgWEZTX1NZTkNfSCAxCisKK3N0cnVjdCB4ZnNfbW91bnQ7CisKK3R5cGVkZWYgc3RydWN0IGJodl92ZnNfc3luY193b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXdfbGlzdDsKKwlzdHJ1Y3QgeGZzX21vdW50CSp3X21vdW50OworCXZvaWQJCQkqd19kYXRhOwkvKiBzeW5jZXIgcm91dGluZSBhcmd1bWVudCAqLworCXZvaWQJCQkoKndfc3luY2VyKShzdHJ1Y3QgeGZzX21vdW50ICosIHZvaWQgKik7Cit9IGJodl92ZnNfc3luY193b3JrX3Q7CisKKyNkZWZpbmUgU1lOQ19BVFRSCQkweDAwMDEJLyogc3luYyBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNZTkNfREVMV1JJCQkweDAwMDIJLyogbG9vayBhdCBkZWxheWVkIHdyaXRlcyAqLworI2RlZmluZSBTWU5DX1dBSVQJCTB4MDAwNAkvKiB3YWl0IGZvciBpL28gdG8gY29tcGxldGUgKi8KKyNkZWZpbmUgU1lOQ19CREZMVVNICQkweDAwMDgJLyogQkRGTFVTSCBpcyBjYWxsaW5nIC0tIGRvbid0IGJsb2NrICovCisjZGVmaW5lIFNZTkNfSU9XQUlUCQkweDAwMTAgIC8qIHdhaXQgZm9yIGFsbCBJL08gdG8gY29tcGxldGUgKi8KKworaW50IHhmc19zeW5jZF9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK3ZvaWQgeGZzX3N5bmNkX3N0b3Aoc3RydWN0IHhmc19tb3VudCAqbXApOworCitpbnQgeGZzX3N5bmNfaW5vZGVzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgZmxhZ3MpOworaW50IHhmc19zeW5jX2ZzZGF0YShzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IGZsYWdzKTsKKworaW50IHhmc19xdWllc2NlX2RhdGEoc3RydWN0IHhmc19tb3VudCAqbXApOwordm9pZCB4ZnNfcXVpZXNjZV9hdHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKwordm9pZCB4ZnNfZmx1c2hfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXApOwordm9pZCB4ZnNfZmx1c2hfZGV2aWNlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKKworaW50IHhmc19yZWNsYWltX2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBpbnQgbG9ja2VkLCBpbnQgc3luY19tb2RlKTsKK2ludCB4ZnNfcmVjbGFpbV9pbm9kZXMoc3RydWN0IHhmc19tb3VudCAqbXAsIGludCBub2Jsb2NrLCBpbnQgbW9kZSk7CisKK3ZvaWQgeGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhzdHJ1Y3QgeGZzX2lub2RlICppcCk7Cit2b2lkIHhmc19pbm9kZV9jbGVhcl9yZWNsYWltX3RhZyhzdHJ1Y3QgeGZzX2lub2RlICppcCk7Cit2b2lkIF9feGZzX2lub2RlX2NsZWFyX3JlY2xhaW1fdGFnKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX3BlcmFnICpwYWcsCisJCQkJc3RydWN0IHhmc19pbm9kZSAqaXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCmluZGV4IDdkYWNiNWIuLjkxNmMwZmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCkBAIC01NiwxNyArNTYsNiBAQAogCiBzdGF0aWMgY3RsX3RhYmxlIHhmc190YWJsZVtdID0gewogCXsKLQkJLmN0bF9uYW1lCT0gWEZTX1JFU1RSSUNUX0NIT1dOLAotCQkucHJvY25hbWUJPSAicmVzdHJpY3RfY2hvd24iLAotCQkuZGF0YQkJPSAmeGZzX3BhcmFtcy5yZXN0cmljdF9jaG93bi52YWwsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAotCQkuZXh0cmExCQk9ICZ4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLm1pbiwKLQkJLmV4dHJhMgkJPSAmeGZzX3BhcmFtcy5yZXN0cmljdF9jaG93bi5tYXgKLQl9LAotCXsKIAkJLmN0bF9uYW1lCT0gWEZTX1NHSURfSU5IRVJJVCwKIAkJLnByb2NuYW1lCT0gImlyaXhfc2dpZF9pbmhlcml0IiwKIAkJLmRhdGEJCT0gJnhmc19wYXJhbXMuc2dpZF9pbmhlcml0LnZhbCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmgKaW5kZXggNGFhZGI4MC4uYjk5MzdkNCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmgKQEAgLTMxLDcgKzMxLDYgQEAKIH0geGZzX3N5c2N0bF92YWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX3BhcmFtIHsKLQl4ZnNfc3lzY3RsX3ZhbF90IHJlc3RyaWN0X2Nob3duOy8qIFJvb3Qvbm9uLXJvb3QgY2FuIGdpdmUgYXdheSBmaWxlcy4qLwogCXhmc19zeXNjdGxfdmFsX3Qgc2dpZF9pbmhlcml0OwkvKiBJbmhlcml0IFNfSVNHSUQgaWYgcHJvY2VzcycgR0lEIGlzCiAJCQkJCSAqIG5vdCBhIG1lbWJlciBvZiBwYXJlbnQgZGlyIEdJRC4gKi8KIAl4ZnNfc3lzY3RsX3ZhbF90IHN5bWxpbmtfbW9kZTsJLyogTGluayBjcmVhdCBtb2RlIGFmZmVjdGVkIGJ5IHVtYXNrICovCkBAIC02OCw3ICs2Nyw3IEBACiBlbnVtIHsKIAkvKiBYRlNfUkVGQ0FDSEVfU0laRSA9IDEgKi8KIAkvKiBYRlNfUkVGQ0FDSEVfUFVSR0UgPSAyICovCi0JWEZTX1JFU1RSSUNUX0NIT1dOID0gMywKKwkvKiBYRlNfUkVTVFJJQ1RfQ0hPV04gPSAzICovCiAJWEZTX1NHSURfSU5IRVJJVCA9IDQsCiAJWEZTX1NZTUxJTktfTU9ERSA9IDUsCiAJWEZTX1BBTklDX01BU0sgPSA2LApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2MGM3Ny4uMDAwMDAwMAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fWEZTX1ZGU19IX18KLSNkZWZpbmUgX19YRlNfVkZTX0hfXwotCi0jaW5jbHVkZSA8bGludXgvdmZzLmg+Ci0jaW5jbHVkZSAieGZzX2ZzLmgiCi0KLXN0cnVjdCBpbm9kZTsKLQotc3RydWN0IGZpZDsKLXN0cnVjdCBjcmVkOwotc3RydWN0IHNlcV9maWxlOwotc3RydWN0IHN1cGVyX2Jsb2NrOwotc3RydWN0IHhmc19pbm9kZTsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX21vdW50X2FyZ3M7Ci0KLXR5cGVkZWYgc3RydWN0IGtzdGF0ZnMJYmh2X3N0YXR2ZnNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgYmh2X3Zmc19zeW5jX3dvcmsgewotCXN0cnVjdCBsaXN0X2hlYWQJd19saXN0OwotCXN0cnVjdCB4ZnNfbW91bnQJKndfbW91bnQ7Ci0Jdm9pZAkJCSp3X2RhdGE7CS8qIHN5bmNlciByb3V0aW5lIGFyZ3VtZW50ICovCi0Jdm9pZAkJCSgqd19zeW5jZXIpKHN0cnVjdCB4ZnNfbW91bnQgKiwgdm9pZCAqKTsKLX0gYmh2X3Zmc19zeW5jX3dvcmtfdDsKLQotI2RlZmluZSBTWU5DX0FUVFIJCTB4MDAwMQkvKiBzeW5jIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgU1lOQ19DTE9TRQkJMHgwMDAyCS8qIGNsb3NlIGZpbGUgc3lzdGVtIGRvd24gKi8KLSNkZWZpbmUgU1lOQ19ERUxXUkkJCTB4MDAwNAkvKiBsb29rIGF0IGRlbGF5ZWQgd3JpdGVzICovCi0jZGVmaW5lIFNZTkNfV0FJVAkJMHgwMDA4CS8qIHdhaXQgZm9yIGkvbyB0byBjb21wbGV0ZSAqLwotI2RlZmluZSBTWU5DX0JERkxVU0gJCTB4MDAxMAkvKiBCREZMVVNIIGlzIGNhbGxpbmcgLS0gZG9uJ3QgYmxvY2sgKi8KLSNkZWZpbmUgU1lOQ19GU0RBVEEJCTB4MDAyMAkvKiBmbHVzaCBmcyBkYXRhIChlLmcuIHN1cGVyYmxvY2tzKSAqLwotI2RlZmluZSBTWU5DX1JFRkNBQ0hFCQkweDAwNDAgIC8qIHBydW5lIHNvbWUgb2YgdGhlIG5mcyByZWYgY2FjaGUgKi8KLSNkZWZpbmUgU1lOQ19SRU1PVU5UCQkweDAwODAgIC8qIHJlbW91bnQgcmVhZG9ubHksIG5vIGR1bW15IExScyAqLwotI2RlZmluZSBTWU5DX0lPV0FJVAkJMHgwMTAwICAvKiB3YWl0IGZvciBhbGwgSS9PIHRvIGNvbXBsZXRlICovCi0KLS8qCi0gKiBXaGVuIHJlbW91bnRpbmcgYSBmaWxlc3lzdGVtIHJlYWQtb25seSBvciBmcmVlemluZyB0aGUgZmlsZXN5c3RlbSwKLSAqIHdlIGhhdmUgdHdvIHBoYXNlcyB0byBleGVjdXRlLiBUaGlzIGZpcnN0IHBoYXNlIGlzIHN5bmNpbmcgdGhlIGRhdGEKLSAqIGJlZm9yZSB3ZSBxdWllc2NlIHRoZSBmaWVsc3lzdGVtLCBhbmQgdGhlIHNlY29uZCBpcyBmbHVzaGluZyBhbGwgdGhlCi0gKiBpbm9kZXMgb3V0IGFmdGVyIHdlJ3ZlIHdhaXRlZCBmb3IgYWxsIHRoZSB0cmFuc2FjdGlvbnMgY3JlYXRlZCBieQotICogdGhlIGZpcnN0IHBoYXNlIHRvIGNvbXBsZXRlLiBUaGUgc2Vjb25kIHBoYXNlIHVzZXMgU1lOQ19JTk9ERV9RVUlFU0NFCi0gKiB0byBlbnN1cmUgdGhhdCB0aGUgaW5vZGVzIGFyZSB3cml0dGVuIHRvIHRoZWlyIGxvY2F0aW9uIG9uIGRpc2sKLSAqIHJhdGhlciB0aGFuIGp1c3QgZXhpc3RpbmcgaW4gdHJhbnNhY3Rpb25zIGluIHRoZSBsb2cuIFRoaXMgbWVhbnMKLSAqIGFmdGVyIGEgcXVpZXNjZSB0aGVyZSBpcyBubyBsb2cgcmVwbGF5IHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBpbm9kZXMKLSAqIHRvIGRpc2sgKHRoaXMgaXMgdGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGEgc3luYyBhbmQgYSBxdWllc2NlKS4KLSAqLwotI2RlZmluZSBTWU5DX0RBVEFfUVVJRVNDRQkoU1lOQ19ERUxXUkl8U1lOQ19GU0RBVEF8U1lOQ19XQUlUfFNZTkNfSU9XQUlUKQotI2RlZmluZSBTWU5DX0lOT0RFX1FVSUVTQ0UJKFNZTkNfUkVNT1VOVHxTWU5DX0FUVFJ8U1lOQ19XQUlUKQotCi0jZGVmaW5lIFNIVVRET1dOX01FVEFfSU9fRVJST1IJMHgwMDAxCS8qIHdyaXRlIGF0dGVtcHQgdG8gbWV0YWRhdGEgZmFpbGVkICovCi0jZGVmaW5lIFNIVVRET1dOX0xPR19JT19FUlJPUgkweDAwMDIJLyogd3JpdGUgYXR0ZW1wdCB0byB0aGUgbG9nIGZhaWxlZCAqLwotI2RlZmluZSBTSFVURE9XTl9GT1JDRV9VTU9VTlQJMHgwMDA0CS8qIHNodXRkb3duIGZyb20gYSBmb3JjZWQgdW5tb3VudCAqLwotI2RlZmluZSBTSFVURE9XTl9DT1JSVVBUX0lOQ09SRQkweDAwMDgJLyogY29ycnVwdCBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIFNIVVRET1dOX1JFTU9URV9SRVEJMHgwMDEwCS8qIHNodXRkb3duIGNhbWUgZnJvbSByZW1vdGUgY2VsbCAqLwotI2RlZmluZSBTSFVURE9XTl9ERVZJQ0VfUkVRCTB4MDAyMAkvKiBmYWlsZWQgYWxsIHBhdGhzIHRvIHRoZSBkZXZpY2UgKi8KLQotI2RlZmluZSB4ZnNfdGVzdF9mb3JfZnJlZXplKG1wKQkJKChtcCktPm1fc3VwZXItPnNfZnJvemVuKQotI2RlZmluZSB4ZnNfd2FpdF9mb3JfZnJlZXplKG1wLGwpCXZmc19jaGVja19mcm96ZW4oKG1wKS0+bV9zdXBlciwgKGwpKQotCi0jZW5kaWYJLyogX19YRlNfVkZTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjUyOGIuLjAwMDAwMDAKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCi0jaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLQotLyoKLSAqIEFuZCB0aGlzIGd1bmsgaXMgbmVlZGVkIGZvciB4ZnNfbW91bnQuaCIKLSAqLwotI2luY2x1ZGUgInhmc19sb2cuaCIKLSNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKLSNpbmNsdWRlICJ4ZnNfc2IuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19tb3VudC5oIgotCi0KLS8qCi0gKiBEZWRpY2F0ZWQgdm5vZGUgaW5hY3RpdmUvcmVjbGFpbSBzeW5jIHdhaXQgcXVldWVzLgotICogUHJpbWUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBzaW5jZSBhZGRyZXNzIGlzIHVzZWQgYXMgdGhlIGtleS4KLSAqLwotI2RlZmluZSBOVlNZTkMgICAgICAgICAgICAgICAgICAzNwotI2RlZmluZSB2cHRvc3luYyh2KSAgICAgICAgICAgICAoJnZzeW5jWygodW5zaWduZWQgbG9uZyl2KSAlIE5WU1lOQ10pCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgdnN5bmNbTlZTWU5DXTsKLQotdm9pZCBfX2luaXQKLXZuX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVlNZTkM7IGkrKykKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdnN5bmNbaV0pOwotfQotCi12b2lkCi12bl9pb3dhaXQoCi0JeGZzX2lub2RlX3QJKmlwKQotewotCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IHZwdG9zeW5jKGlwKTsKLQotCXdhaXRfZXZlbnQoKndxLCAoYXRvbWljX3JlYWQoJmlwLT5pX2lvY291bnQpID09IDApKTsKLX0KLQotdm9pZAotdm5faW93YWtlKAotCXhmc19pbm9kZV90CSppcCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaXAtPmlfaW9jb3VudCkpCi0JCXdha2VfdXAodnB0b3N5bmMoaXApKTsKLX0KLQotLyoKLSAqIFZvbHVtZSBtYW5hZ2VycyBzdXBwb3J0aW5nIG11bHRpcGxlIHBhdGhzIGNhbiBzZW5kIGJhY2sgRU5PREVWIHdoZW4gdGhlCi0gKiBmaW5hbCBwYXRoIGRpc2FwcGVhcnMuICBJbiB0aGlzIGNhc2UgY29udGludWluZyB0byBmaWxsIHRoZSBwYWdlIGNhY2hlCi0gKiB3aXRoIGRpcnR5IGRhdGEgd2hpY2ggY2Fubm90IGJlIHdyaXR0ZW4gb3V0IGlzIGV2aWwsIHNvIHByZXZlbnQgdGhhdC4KLSAqLwotdm9pZAotdm5faW9lcnJvcigKLQl4ZnNfaW5vZGVfdAkqaXAsCi0JaW50CQllcnJvciwKLQljaGFyCQkqZiwKLQlpbnQJCWwpCi17Ci0JaWYgKHVubGlrZWx5KGVycm9yID09IC1FTk9ERVYpKQotCQl4ZnNfZG9fZm9yY2Vfc2h1dGRvd24oaXAtPmlfbW91bnQsIFNIVVRET1dOX0RFVklDRV9SRVEsIGYsIGwpOwotfQotCi0jaWZkZWYJWEZTX0lOT0RFX1RSQUNFCi0KLS8qCi0gKiBSZWZlcmVuY2UgY291bnQgb2YgTGludXggaW5vZGUgaWYgcHJlc2VudCwgLTEgaWYgdGhlIHhmc19pbm9kZQotICogaGFzIG5vIGFzc29jaWF0ZWQgTGludXggaW5vZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHhmc19pY291bnQoc3RydWN0IHhmc19pbm9kZSAqaXApCi17Ci0Jc3RydWN0IGlub2RlICp2cCA9IFZGU19JKGlwKTsKLQotCWlmICh2cCkKLQkJcmV0dXJuIHZuX2NvdW50KHZwKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNkZWZpbmUgS1RSQUNFX0VOVEVSKGlwLCB2aywgcywgbGluZSwgcmEpCQkJXAotCWt0cmFjZV9lbnRlcigJKGlwKS0+aV90cmFjZSwJCQkJXAotLyogIDAgKi8JCSh2b2lkICopKF9fcHNpbnRfdCkodmspLAkJXAotLyogIDEgKi8JCSh2b2lkICopKHMpLAkJCQlcCi0vKiAgMiAqLwkJKHZvaWQgKikoX19wc2ludF90KSBsaW5lLAkJXAotLyogIDMgKi8JCSh2b2lkICopKF9fcHNpbnRfdCl4ZnNfaWNvdW50KGlwKSwJXAotLyogIDQgKi8JCSh2b2lkICopKHJhKSwJCQkJXAotLyogIDUgKi8JCU5VTEwsCQkJCQlcCi0vKiAgNiAqLwkJKHZvaWQgKikoX19wc2ludF90KWN1cnJlbnRfY3B1KCksCVwKLS8qICA3ICovCQkodm9pZCAqKShfX3BzaW50X3QpY3VycmVudF9waWQoKSwJXAotLyogIDggKi8JCSh2b2lkICopX19yZXR1cm5fYWRkcmVzcywJCVwKLS8qICA5ICovCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKQotCi0vKgotICogVm5vZGUgdHJhY2luZyBjb2RlLgotICovCi12b2lkCi1feGZzX2l0cmFjZV9lbnRyeSh4ZnNfaW5vZGVfdCAqaXAsIGNvbnN0IGNoYXIgKmZ1bmMsIGluc3RfdCAqcmEpCi17Ci0JS1RSQUNFX0VOVEVSKGlwLCBJTk9ERV9LVFJBQ0VfRU5UUlksIGZ1bmMsIDAsIHJhKTsKLX0KLQotdm9pZAotX3hmc19pdHJhY2VfZXhpdCh4ZnNfaW5vZGVfdCAqaXAsIGNvbnN0IGNoYXIgKmZ1bmMsIGluc3RfdCAqcmEpCi17Ci0JS1RSQUNFX0VOVEVSKGlwLCBJTk9ERV9LVFJBQ0VfRVhJVCwgZnVuYywgMCwgcmEpOwotfQotCi12b2lkCi14ZnNfaXRyYWNlX2hvbGQoeGZzX2lub2RlX3QgKmlwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKLXsKLQlLVFJBQ0VfRU5URVIoaXAsIElOT0RFX0tUUkFDRV9IT0xELCBmaWxlLCBsaW5lLCByYSk7Ci19Ci0KLXZvaWQKLV94ZnNfaXRyYWNlX3JlZih4ZnNfaW5vZGVfdCAqaXAsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnN0X3QgKnJhKQotewotCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX1JFRiwgZmlsZSwgbGluZSwgcmEpOwotfQotCi12b2lkCi14ZnNfaXRyYWNlX3JlbGUoeGZzX2lub2RlX3QgKmlwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKLXsKLQlLVFJBQ0VfRU5URVIoaXAsIElOT0RFX0tUUkFDRV9SRUxFLCBmaWxlLCBsaW5lLCByYSk7Ci19Ci0jZW5kaWYJLyogWEZTX0lOT0RFX1RSQUNFICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAppbmRleCA2ODNjZTE2Li5mNjU5ODNhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKQEAgLTE4LDcgKzE4LDEwIEBACiAjaWZuZGVmIF9fWEZTX1ZOT0RFX0hfXwogI2RlZmluZSBfX1hGU19WTk9ERV9IX18KIAorI2luY2x1ZGUgInhmc19mcy5oIgorCiBzdHJ1Y3QgZmlsZTsKK3N0cnVjdCB4ZnNfaW5vZGU7CiBzdHJ1Y3QgeGZzX2lvbWFwOwogc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuOwogCkBAIC01MSw0MCArNTQsNiBAQAogCQkJCQkgICBQcmV2ZW50IFZNIGFjY2VzcyB0byB0aGUgcGFnZXMgdW50aWwKIAkJCQkJICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuICovCiAKLQotZXh0ZXJuIHZvaWQJdm5faW5pdCh2b2lkKTsKLQotLyoKLSAqIFllYWgsIHRoZXNlIGRvbid0IHRha2Ugdm5vZGUgYW55bW9yZSBhdCBhbGwsIGFsbCB0aGlzIHNob3VsZCBiZQotICogY2xlYW5lZCB1cCBhdCBzb21lIHBvaW50LgotICovCi1leHRlcm4gdm9pZAl2bl9pb3dhaXQoc3RydWN0IHhmc19pbm9kZSAqaXApOwotZXh0ZXJuIHZvaWQJdm5faW93YWtlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKLWV4dGVybiB2b2lkCXZuX2lvZXJyb3Ioc3RydWN0IHhmc19pbm9kZSAqaXAsIGludCBlcnJvciwgY2hhciAqZiwgaW50IGwpOwotCi1zdGF0aWMgaW5saW5lIGludCB2bl9jb3VudChzdHJ1Y3QgaW5vZGUgKnZwKQotewotCXJldHVybiBhdG9taWNfcmVhZCgmdnAtPmlfY291bnQpOwotfQotCi0jZGVmaW5lIElIT0xEKGlwKSBcCi1kbyB7IFwKLQlBU1NFUlQoYXRvbWljX3JlYWQoJlZGU19JKGlwKS0+aV9jb3VudCkgPiAwKSA7IFwKLQlhdG9taWNfaW5jKCYoVkZTX0koaXApLT5pX2NvdW50KSk7IFwKLQl4ZnNfaXRyYWNlX2hvbGQoKGlwKSwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSVJFTEUoaXApIFwKLWRvIHsgXAotCXhmc19pdHJhY2VfcmVsZSgoaXApLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsgXAotCWlwdXQoVkZTX0koaXApKTsgXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKnZuX2dyYWIoc3RydWN0IGlub2RlICp2cCkKLXsKLQlyZXR1cm4gaWdyYWIodnApOwotfQotCiAvKgogICogRGVhbGluZyB3aXRoIGJhZCBpbm9kZXMKICAqLwpAQCAtMTIxLDM5ICs5MCw0IEBACiAJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpCiAKIAotLyoKLSAqIFRyYWNraW5nIHZub2RlIGFjdGl2aXR5LgotICovCi0jaWYgZGVmaW5lZChYRlNfSU5PREVfVFJBQ0UpCi0KLSNkZWZpbmUJSU5PREVfVFJBQ0VfU0laRQkxNgkJLyogbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgKi8KLSNkZWZpbmUJSU5PREVfS1RSQUNFX0VOVFJZCTEKLSNkZWZpbmUJSU5PREVfS1RSQUNFX0VYSVQJMgotI2RlZmluZQlJTk9ERV9LVFJBQ0VfSE9MRAkzCi0jZGVmaW5lCUlOT0RFX0tUUkFDRV9SRUYJNAotI2RlZmluZQlJTk9ERV9LVFJBQ0VfUkVMRQk1Ci0KLWV4dGVybiB2b2lkIF94ZnNfaXRyYWNlX2VudHJ5KHN0cnVjdCB4ZnNfaW5vZGUgKiwgY29uc3QgY2hhciAqLCBpbnN0X3QgKik7Ci1leHRlcm4gdm9pZCBfeGZzX2l0cmFjZV9leGl0KHN0cnVjdCB4ZnNfaW5vZGUgKiwgY29uc3QgY2hhciAqLCBpbnN0X3QgKik7Ci1leHRlcm4gdm9pZCB4ZnNfaXRyYWNlX2hvbGQoc3RydWN0IHhmc19pbm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOwotZXh0ZXJuIHZvaWQgX3hmc19pdHJhY2VfcmVmKHN0cnVjdCB4ZnNfaW5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKLWV4dGVybiB2b2lkIHhmc19pdHJhY2VfcmVsZShzdHJ1Y3QgeGZzX2lub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7Ci0jZGVmaW5lIHhmc19pdHJhY2VfZW50cnkoaXApCVwKLQlfeGZzX2l0cmFjZV9lbnRyeShpcCwgX19mdW5jX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQotI2RlZmluZSB4ZnNfaXRyYWNlX2V4aXQoaXApCVwKLQlfeGZzX2l0cmFjZV9leGl0KGlwLCBfX2Z1bmNfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCi0jZGVmaW5lIHhmc19pdHJhY2VfZXhpdF90YWcoaXAsIHRhZykJXAotCV94ZnNfaXRyYWNlX2V4aXQoaXAsIHRhZywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCi0jZGVmaW5lIHhmc19pdHJhY2VfcmVmKGlwKQlcCi0JX3hmc19pdHJhY2VfcmVmKGlwLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQotCi0jZWxzZQotI2RlZmluZQl4ZnNfaXRyYWNlX2VudHJ5KGEpCi0jZGVmaW5lCXhmc19pdHJhY2VfZXhpdChhKQotI2RlZmluZQl4ZnNfaXRyYWNlX2V4aXRfdGFnKGEsIGIpCi0jZGVmaW5lCXhmc19pdHJhY2VfaG9sZChhLCBiLCBjLCBkKQotI2RlZmluZQl4ZnNfaXRyYWNlX3JlZihhKQotI2RlZmluZQl4ZnNfaXRyYWNlX3JlbGUoYSwgYiwgYywgZCkKLSNlbmRpZgotCiAjZW5kaWYJLyogX19YRlNfVk5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKaW5kZXggZjI3MDVmMi4uNTkxY2E2NiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJaWYgKGJyYW5kbmV3ZHF1b3QpIHsKIAkJZHFwLT5kcV9mbG5leHQgPSBkcXAtPmRxX2ZscHJldiA9IGRxcDsKIAkJbXV0ZXhfaW5pdCgmZHFwLT5xX3Fsb2NrKTsKLQkJc3ZfaW5pdCgmZHFwLT5xX3BpbndhaXQsIFNWX0RFRkFVTFQsICJwZHEiKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZHFwLT5xX3BpbndhaXQpOwogCiAJCS8qCiAJCSAqIEJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgYSBjb3VudGluZyBjb21wbGV0aW9uLCBjb21wbGV0ZQpAQCAtMTMxLDcgKzEzMSw3IEBACiAJCSBkcXAtPnFfcmVzX2Jjb3VudCA9IDA7CiAJCSBkcXAtPnFfcmVzX2ljb3VudCA9IDA7CiAJCSBkcXAtPnFfcmVzX3J0YmNvdW50ID0gMDsKLQkJIGRxcC0+cV9waW5jb3VudCA9IDA7CisJCSBhdG9taWNfc2V0KCZkcXAtPnFfcGluY291bnQsIDApOwogCQkgZHFwLT5xX2hhc2ggPSBOVUxMOwogCQkgQVNTRVJUKGRxcC0+ZHFfZmxuZXh0ID09IGRxcC0+ZHFfZmxwcmV2KTsKIApAQCAtMTIyMSwxNiArMTIyMSwxNCBAQAogCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRRkxVU0giKTsKIAogCS8qCi0JICogSWYgbm90IGRpcnR5LCBuYWRhLgorCSAqIElmIG5vdCBkaXJ0eSwgb3IgaXQncyBwaW5uZWQgYW5kIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8KKwkgKiBibG9jaywgbmFkYS4KIAkgKi8KLQlpZiAoIVhGU19EUV9JU19ESVJUWShkcXApKSB7CisJaWYgKCFYRlNfRFFfSVNfRElSVFkoZHFwKSB8fAorCSAgICAoIShmbGFncyAmIFhGU19RTU9QVF9TWU5DKSAmJiBhdG9taWNfcmVhZCgmZHFwLT5xX3BpbmNvdW50KSA+IDApKSB7CiAJCXhmc19kcWZ1bmxvY2soZHFwKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQotCi0JLyoKLQkgKiBDYW50IGZsdXNoIGEgcGlubmVkIGRxdW90LiBXYWl0IGZvciBpdC4KLQkgKi8KIAl4ZnNfcW1fZHF1bnBpbl93YWl0KGRxcCk7CiAKIAkvKgpAQCAtMTI3NCwxMCArMTI3Miw4IEBACiAJZHFwLT5kcV9mbGFncyAmPSB+KFhGU19EUV9ESVJUWSk7CiAJbXAgPSBkcXAtPnFfbW91bnQ7CiAKLQkvKiBsc24gaXMgNjQgYml0cyAqLwotCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwotCWRxcC0+cV9sb2dpdGVtLnFsaV9mbHVzaF9sc24gPSBkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9sc247Ci0Jc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwl4ZnNfdHJhbnNfYWlsX2NvcHlfbHNuKG1wLT5tX2FpbCwgJmRxcC0+cV9sb2dpdGVtLnFsaV9mbHVzaF9sc24sCisJCQkJCSZkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9sc24pOwogCiAJLyoKIAkgKiBBdHRhY2ggYW4gaW9kb25lIHJvdXRpbmUgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoaXMgZHF1b3QgZnJvbSB0aGUKQEAgLTEzMjMsOCArMTMxOSwxMCBAQAogCXhmc19kcV9sb2dpdGVtX3QJKnFpcCkKIHsKIAl4ZnNfZHF1b3RfdAkJKmRxcDsKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHA7CiAKIAlkcXAgPSBxaXAtPnFsaV9kcXVvdDsKKwlhaWxwID0gcWlwLT5xbGlfaXRlbS5saV9haWxwOwogCiAJLyoKIAkgKiBXZSBvbmx5IHdhbnQgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgaWYgaXRzCkBAIC0xMzM3LDE1ICsxMzM1LDEyIEBACiAJaWYgKChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgJiYKIAkgICAgcWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKSB7CiAKLQkJc3Bpbl9sb2NrKCZkcXAtPnFfbW91bnQtPm1fYWlsX2xvY2spOwotCQkvKgotCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KLQkJICovCisJCS8qIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLiAqLworCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCQlpZiAocWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKQotCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwoZHFwLT5xX21vdW50LAotCQkJCQkgICAgICh4ZnNfbG9nX2l0ZW1fdCopcWlwKTsKKwkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsICh4ZnNfbG9nX2l0ZW1fdCopcWlwKTsKIAkJZWxzZQotCQkJc3Bpbl91bmxvY2soJmRxcC0+cV9tb3VudC0+bV9haWxfbG9jayk7CisJCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CiAJfQogCiAJLyoKQEAgLTEzNzUsNyArMTM3MCw3IEBACiAJbXV0ZXhfdW5sb2NrKCYoZHFwLT5xX3Fsb2NrKSk7CiAJaWYgKGRxcC0+cV9sb2dpdGVtLnFsaV9kcXVvdCA9PSBkcXApIHsKIAkJLyogT25jZSB3YXMgZHFwLT5xX21vdW50LCBidXQgbWlnaHQganVzdCBoYXZlIGJlZW4gY2xlYXJlZCAqLwotCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9tb3VudHAsCisJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKGRxcC0+cV9sb2dpdGVtLnFsaV9pdGVtLmxpX2FpbHAsCiAJCQkJCSh4ZnNfbG9nX2l0ZW1fdCopJihkcXAtPnFfbG9naXRlbSkpOwogCX0KIH0KQEAgLTE0ODksNyArMTQ4NCw3IEBACiAJCQkJInhmc19xbV9kcXB1cmdlOiBkcXVvdCAlcCBmbHVzaCBmYWlsZWQiLCBkcXApOwogCQl4ZnNfZHFmbG9jayhkcXApOwogCX0KLQlBU1NFUlQoZHFwLT5xX3BpbmNvdW50ID09IDApOworCUFTU0VSVChhdG9taWNfcmVhZCgmZHFwLT5xX3BpbmNvdW50KSA9PSAwKTsKIAlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkgfHwKIAkgICAgICAgIShkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCmluZGV4IDg5NThkMGYuLjdlNDU1MzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaAorKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKQEAgLTgzLDggKzgzLDggQEAKIAl4ZnNfcWNudF90CSBxX3Jlc19ydGJjb3VudDsvKiB0b3RhbCByZWFsdGltZSBibGtzIHVzZWQrcmVzZXJ2ZWQgKi8KIAltdXRleF90CQkgcV9xbG9jazsJLyogcXVvdGEgbG9jayAqLwogCXN0cnVjdCBjb21wbGV0aW9uIHFfZmx1c2g7CS8qIGZsdXNoIGNvbXBsZXRpb24gcXVldWUgKi8KLQl1aW50CQkgcV9waW5jb3VudDsJLyogcGluIGNvdW50IGZvciB0aGlzIGRxdW90ICovCi0Jc3ZfdAkJIHFfcGlud2FpdDsJLyogc3luYyB2YXIgZm9yIHBpbm5pbmcgKi8KKwlhdG9taWNfdCAgICAgICAgICBxX3BpbmNvdW50OwkvKiBkcXVvdCBwaW4gY291bnQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBxX3BpbndhaXQ7CS8qIGRxdW90IHBpbm5pbmcgd2FpdCBxdWV1ZSAqLwogI2lmZGVmIFhGU19EUVVPVF9UUkFDRQogCXN0cnVjdCBrdHJhY2UJKnFfdHJhY2U7CS8qIHRyYWNlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwppbmRleCBmMDI4NjQ0Li4xNzI4ZjZhIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwpAQCAtODgsMjUgKzg4LDIyIEBACiAKIC8qCiAgKiBJbmNyZW1lbnQgdGhlIHBpbiBjb3VudCBvZiB0aGUgZ2l2ZW4gZHF1b3QuCi0gKiBUaGlzIHZhbHVlIGlzIHByb3RlY3RlZCBieSBwaW5sb2NrIHNwaW5sb2NrIGluIHRoZSB4UU0gc3RydWN0dXJlLgogICovCiBTVEFUSUMgdm9pZAogeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluKAogCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0pCiB7Ci0JeGZzX2RxdW90X3QgKmRxcDsKKwl4ZnNfZHF1b3RfdCAqZHFwID0gbG9naXRlbS0+cWxpX2RxdW90OwogCi0JZHFwID0gbG9naXRlbS0+cWxpX2RxdW90OwogCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOwotCXNwaW5fbG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKLQlkcXAtPnFfcGluY291bnQrKzsKLQlzcGluX3VubG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKKwlhdG9taWNfaW5jKCZkcXAtPnFfcGluY291bnQpOwogfQogCiAvKgogICogRGVjcmVtZW50IHRoZSBwaW4gY291bnQgb2YgdGhlIGdpdmVuIGRxdW90LCBhbmQgd2FrZSB1cAogICogYW55b25lIGluIHhmc19kcXdhaXRfdW5waW4oKSBpZiB0aGUgY291bnQgZ29lcyB0byAwLgkgVGhlCi0gKiBkcXVvdCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHBpbm5lZCB3aXRoIGEgY2FsbCB0byB4ZnNfZHFwaW4oKS4KKyAqIGRxdW90IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcGlubmVkIHdpdGggYSBjYWxsIHRvCisgKiB4ZnNfcW1fZHF1b3RfbG9naXRlbV9waW4oKS4KICAqLwogLyogQVJHU1VTRUQgKi8KIFNUQVRJQyB2b2lkCkBAIC0xMTQsMTYgKzExMSwxMSBAQAogCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0sCiAJaW50CQkgIHN0YWxlKQogewotCXhmc19kcXVvdF90ICpkcXA7CisJeGZzX2RxdW90X3QgKmRxcCA9IGxvZ2l0ZW0tPnFsaV9kcXVvdDsKIAotCWRxcCA9IGxvZ2l0ZW0tPnFsaV9kcXVvdDsKLQlBU1NFUlQoZHFwLT5xX3BpbmNvdW50ID4gMCk7Ci0Jc3Bpbl9sb2NrKCYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpOwotCWRxcC0+cV9waW5jb3VudC0tOwotCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgewotCQlzdl9icm9hZGNhc3QoJmRxcC0+cV9waW53YWl0KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJihYRlNfRFFfVE9fUUlORihkcXApLT5xaV9waW5sb2NrKSk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZkcXAtPnFfcGluY291bnQpID4gMCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRxcC0+cV9waW5jb3VudCkpCisJCXdha2VfdXAoJmRxcC0+cV9waW53YWl0KTsKIH0KIAogLyogQVJHU1VTRUQgKi8KQEAgLTE5MywyMSArMTg1LDE0IEBACiAJeGZzX2RxdW90X3QJKmRxcCkKIHsKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKLQlpZiAoZHFwLT5xX3BpbmNvdW50ID09IDApIHsKKwlpZiAoYXRvbWljX3JlYWQoJmRxcC0+cV9waW5jb3VudCkgPT0gMCkKIAkJcmV0dXJuOwotCX0KIAogCS8qCiAJICogR2l2ZSB0aGUgbG9nIGEgcHVzaCBzbyB3ZSBkb24ndCB3YWl0IGhlcmUgdG9vIGxvbmcuCiAJICovCiAJeGZzX2xvZ19mb3JjZShkcXAtPnFfbW91bnQsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSk7Ci0Jc3Bpbl9sb2NrKCYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpOwotCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgewotCQlzcGluX3VubG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKLQkJcmV0dXJuOwotCX0KLQlzdl93YWl0KCYoZHFwLT5xX3BpbndhaXQpLCBQSU5PRCwKLQkJJihYRlNfRFFfVE9fUUlORihkcXApLT5xaV9waW5sb2NrKSwgcyk7CisJd2FpdF9ldmVudChkcXAtPnFfcGlud2FpdCwgKGF0b21pY19yZWFkKCZkcXAtPnFfcGluY291bnQpID09IDApKTsKIH0KIAogLyoKQEAgLTMxMCw3ICsyOTUsNyBAQAogCXVpbnQJCQlyZXR2YWw7CiAKIAlkcXAgPSBxaXAtPnFsaV9kcXVvdDsKLQlpZiAoZHFwLT5xX3BpbmNvdW50ID4gMCkKKwlpZiAoYXRvbWljX3JlYWQoJmRxcC0+cV9waW5jb3VudCkgPiAwKQogCQlyZXR1cm4gKFhGU19JVEVNX1BJTk5FRCk7CiAKIAlpZiAoISB4ZnNfcW1fZHFsb2NrX25vd2FpdChkcXApKQpAQCAtNTY4LDE0ICs1NTMsMTYgQEAKIAl4ZnNfbHNuX3QgbHNuKQogewogCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcWZzOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscDsKIAogCXFmcyA9IHFmZS0+cXFsX3N0YXJ0X2xpcDsKLQlzcGluX2xvY2soJnFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLT5tX2FpbF9sb2NrKTsKKwlhaWxwID0gcWZzLT5xcWxfaXRlbS5saV9haWxwOworCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJLyoKIAkgKiBEZWxldGUgdGhlIHFvZmYtc3RhcnQgbG9naXRlbSBmcm9tIHRoZSBBSUwuCi0JICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJICogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJICovCi0JeGZzX3RyYW5zX2RlbGV0ZV9haWwocWZzLT5xcWxfaXRlbS5saV9tb3VudHAsICh4ZnNfbG9nX2l0ZW1fdCAqKXFmcyk7CisJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopcWZzKTsKIAlrbWVtX2ZyZWUocWZzKTsKIAlrbWVtX2ZyZWUocWZlKTsKIAlyZXR1cm4gKHhmc19sc25fdCktMTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCBkZjBmZmVmLi42YjEzOTYwIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAieGZzX2JpdC5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKICNpbmNsdWRlICJ4ZnNfaW51bS5oIgotI2luY2x1ZGUgInhmc19jbG50LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCkBAIC0zOTYsMTMgKzM5NSwxMCBAQAogLyoKICAqIENhbGxlZCBmcm9tIHRoZSB2ZnNvcHMgbGF5ZXIuCiAgKi8KLWludAordm9pZAogeGZzX3FtX3VubW91bnRfcXVvdGFzKAogCXhmc19tb3VudF90CSptcCkKIHsKLQl4ZnNfaW5vZGVfdAkqdXFwLCAqZ3FwOwotCWludAkJZXJyb3IgPSAwOwotCiAJLyoKIAkgKiBSZWxlYXNlIHRoZSBkcXVvdHMgdGhhdCByb290IGlub2RlLCBldCBhbCBtaWdodCBiZSBob2xkaW5nLAogCSAqIGJlZm9yZSB3ZSBmbHVzaCBxdW90YXMgYW5kIGJsb3cgYXdheSB0aGUgcXVvdGFpbmZvIHN0cnVjdHVyZS4KQEAgLTQxNSw0MyArNDExLDE4IEBACiAJCXhmc19xbV9kcWRldGFjaChtcC0+bV9yc3VtaXApOwogCiAJLyoKLQkgKiBGbHVzaCBvdXQgdGhlIHF1b3RhIGlub2Rlcy4KKwkgKiBSZWxlYXNlIHRoZSBxdW90YSBpbm9kZXMuCiAJICovCi0JdXFwID0gZ3FwID0gTlVMTDsKIAlpZiAobXAtPm1fcXVvdGFpbmZvKSB7Ci0JCWlmICgodXFwID0gbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCkgIT0gTlVMTCkgewotCQkJeGZzX2lsb2NrKHVxcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX2lmbG9jayh1cXApOwotCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKHVxcCwgWEZTX0lGTFVTSF9TWU5DKTsKLQkJCXhmc19pdW5sb2NrKHVxcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJaWYgKHVubGlrZWx5KGVycm9yID09IEVGU0NPUlJVUFRFRCkpIHsKLQkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfcW1fdW5tb3VudF9xdW90YXMoMSkiLAotCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KKwkJaWYgKG1wLT5tX3F1b3RhaW5mby0+cWlfdXF1b3RhaXApIHsKKwkJCUlSRUxFKG1wLT5tX3F1b3RhaW5mby0+cWlfdXF1b3RhaXApOworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCA9IE5VTEw7CiAJCX0KLQkJaWYgKChncXAgPSBtcC0+bV9xdW90YWluZm8tPnFpX2dxdW90YWlwKSAhPSBOVUxMKSB7Ci0JCQl4ZnNfaWxvY2soZ3FwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQl4ZnNfaWZsb2NrKGdxcCk7Ci0JCQllcnJvciA9IHhmc19pZmx1c2goZ3FwLCBYRlNfSUZMVVNIX1NZTkMpOwotCQkJeGZzX2l1bmxvY2soZ3FwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQlpZiAodW5saWtlbHkoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKSkgewotCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19xbV91bm1vdW50X3F1b3RhcygyKSIsCi0JCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQlpZiAobXAtPm1fcXVvdGFpbmZvLT5xaV9ncXVvdGFpcCkgeworCQkJSVJFTEUobXAtPm1fcXVvdGFpbmZvLT5xaV9ncXVvdGFpcCk7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX2dxdW90YWlwID0gTlVMTDsKIAkJfQogCX0KLQlpZiAodXFwKSB7Ci0JCSBJUkVMRSh1cXApOwotCQkgbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCA9IE5VTEw7Ci0JfQotCWlmIChncXApIHsKLQkJSVJFTEUoZ3FwKTsKLQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ncXVvdGFpcCA9IE5VTEw7Ci0JfQotb3V0OgotCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogfQogCiAvKgpAQCAtOTg3LDE0ICs5NTgsMTAgQEAKIH0KIAogLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IFZGU19TWU5DIGFuZCBmbGFncyBhcmcgZGV0ZXJtaW5lcyB0aGUgY2FsbGVyLAotICogYW5kIGl0cyBtb3RpdmVzLCBhcyBkb25lIGluIHhmc19zeW5jLgotICoKLSAqIHZmc19zeW5jOiBTWU5DX0ZTREFUQXxTWU5DX0FUVFJ8U1lOQ19CREZMVVNIIDB4MzEKLSAqIHN5c2NhbGwgc3luYzogU1lOQ19GU0RBVEF8U1lOQ19BVFRSfFNZTkNfREVMV1JJIDB4MjUKLSAqIHVtb3VudHJvb3QgOiBTWU5DX1dBSVQgfCBTWU5DX0NMT1NFIHwgU1lOQ19BVFRSIHwgU1lOQ19GU0RBVEEKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHN5bmMgcXVvdGFzLiBXZSBjYW4gYmUgdG9sZCB0byB1c2Ugbm9uLWJsb2NraW5nCisgKiBzZW1hbnRpY3MgYnkgZWl0aGVyIHRoZSBTWU5DX0JERkxVU0ggZmxhZyBvciB0aGUgYWJzZW5jZSBvZiB0aGUKKyAqIFNZTkNfV0FJVCBmbGFnLgogICovCi0KIGludAogeGZzX3FtX3N5bmMoCiAJeGZzX21vdW50X3QJKm1wLApAQCAtMTEzNyw3ICsxMTA0LDYgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZxaW5mLT5xaV9waW5sb2NrKTsKIAl4ZnNfcW1fbGlzdF9pbml0KCZxaW5mLT5xaV9kcWxpc3QsICJtcGRxbGlzdCIsIDApOwogCXFpbmYtPnFpX2RxcmVjbGFpbXMgPSAwOwogCkBAIC0xMjM0LDcgKzEyMDAsNiBAQAogCSAqLwogCXhmc19xbV9yZWxlX3F1b3RhZnNfcmVmKG1wKTsKIAotCXNwaW5sb2NrX2Rlc3Ryb3koJnFpLT5xaV9waW5sb2NrKTsKIAl4ZnNfcW1fbGlzdF9kZXN0cm95KCZxaS0+cWlfZHFsaXN0KTsKIAogCWlmIChxaS0+cWlfdXF1b3RhaXApIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uaCBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaAppbmRleCA0NGYyNTM0Li5kZGYwOTE2IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5oCkBAIC0xMDYsNyArMTA2LDYgQEAKIHR5cGVkZWYgc3RydWN0IHhmc19xdW90YWluZm8gewogCXhmc19pbm9kZV90CSpxaV91cXVvdGFpcDsJIC8qIHVzZXIgcXVvdGEgaW5vZGUgKi8KIAl4ZnNfaW5vZGVfdAkqcWlfZ3F1b3RhaXA7CSAvKiBncm91cCBxdW90YSBpbm9kZSAqLwotCXNwaW5sb2NrX3QJIHFpX3BpbmxvY2s7CSAvKiBkcXVvdCBwaW5uaW5nIGxvY2sgKi8KIAl4ZnNfZHFsaXN0X3QJIHFpX2RxbGlzdDsJIC8qIGFsbCBkcXVvdHMgaW4gZmlsZXN5cyAqLwogCWludAkJIHFpX2RxcmVjbGFpbXM7CSAvKiBhIGNoYW5nZSBoZXJlIGluZGljYXRlcwogCQkJCQkgICAgYSByZW1vdmFsIGluIHRoZSBkcWxpc3QgKi8KQEAgLTE2OCw3ICsxNjcsNyBAQAogZXh0ZXJuIHZvaWQJCXhmc19xbV9tb3VudF9xdW90YXMoeGZzX21vdW50X3QgKik7CiBleHRlcm4gaW50CQl4ZnNfcW1fcXVvdGFjaGVjayh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiB2b2lkCQl4ZnNfcW1fdW5tb3VudF9xdW90YWRlc3Ryb3koeGZzX21vdW50X3QgKik7Ci1leHRlcm4gaW50CQl4ZnNfcW1fdW5tb3VudF9xdW90YXMoeGZzX21vdW50X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX3VubW91bnRfcXVvdGFzKHhmc19tb3VudF90ICopOwogZXh0ZXJuIGludAkJeGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMoeGZzX21vdW50X3QgKiwgX19pbnQ2NF90KTsKIGV4dGVybiBpbnQJCXhmc19xbV9zeW5jKHhmc19tb3VudF90ICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCmluZGV4IGVlYTJlNjAuLmJjNmM1Y2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKLSNpbmNsdWRlICJ4ZnNfY2xudC5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19zYi5oIgogI2luY2x1ZGUgInhmc19hZy5oIgpAQCAtNTEsNyArNTAsNyBAQAogCiBTVEFUSUMgdm9pZAogeGZzX2ZpbGxfc3RhdHZmc19mcm9tX2RxdW90KAotCWJodl9zdGF0dmZzX3QJCSpzdGF0cCwKKwlzdHJ1Y3Qga3N0YXRmcwkJKnN0YXRwLAogCXhmc19kaXNrX2RxdW90X3QJKmRwKQogewogCV9fdWludDY0X3QJCWxpbWl0OwpAQCAtODgsNyArODcsNyBAQAogU1RBVElDIHZvaWQKIHhmc19xbV9zdGF0dmZzKAogCXhmc19pbm9kZV90CQkqaXAsCi0JYmh2X3N0YXR2ZnNfdAkJKnN0YXRwKQorCXN0cnVjdCBrc3RhdGZzCQkqc3RhdHApCiB7CiAJeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OwogCXhmc19kcXVvdF90CQkqZHFwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDFhM2I4MDMuLjY4MTM5YjMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUV9YUVVPVEFTWU5DOgotCQlyZXR1cm4gKHhmc19zeW5jX2lub2RlcyhtcCwgU1lOQ19ERUxXUkksIE5VTEwpKTsKKwkJcmV0dXJuIHhmc19zeW5jX2lub2RlcyhtcCwgU1lOQ19ERUxXUkkpOwogCiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xMDIyLDYgKzEwMjIsODYgQEAKIAogCiAvKgorICogUmVsZWFzZSBhbGwgdGhlIGRxdW90cyBvbiB0aGUgaW5vZGVzIGluIGFuIEFHLgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxcmVsZV9pbm9kZXNfYWcoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJYWcsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2lub2RlX3QJKmlwID0gTlVMTDsKKwl4ZnNfcGVyYWdfdAkqcGFnID0gJm1wLT5tX3BlcmFnW2FnXTsKKwlpbnQJCWZpcnN0X2luZGV4ID0gMDsKKwlpbnQJCW5yX2ZvdW5kOworCisJZG8geworCQkvKgorCQkgKiB1c2UgYSBnYW5nIGxvb2t1cCB0byBmaW5kIHRoZSBuZXh0IGlub2RlIGluIHRoZSB0cmVlCisJCSAqIGFzIHRoZSB0cmVlIGlzIHNwYXJzZSBhbmQgYSBnYW5nIGxvb2t1cCB3YWxrcyB0byBmaW5kCisJCSAqIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZXF1ZXN0ZWQuCisJCSAqLworCQlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZwYWctPnBhZ19pY2lfcm9vdCwKKwkJCQkodm9pZCoqKSZpcCwgZmlyc3RfaW5kZXgsIDEpOworCisJCWlmICghbnJfZm91bmQpIHsKKwkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgaW5kZXggZm9yIHRoZSBuZXh0IGxvb2t1cC4gQ2F0Y2ggb3ZlcmZsb3dzCisJCSAqIGludG8gdGhlIG5leHQgQUcgcmFuZ2Ugd2hpY2ggY2FuIG9jY3VyIGlmIHdlIGhhdmUgaW5vZGVzCisJCSAqIGluIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBBRyBhbmQgd2UgYXJlIGN1cnJlbnRseQorCQkgKiBwb2ludGluZyB0byB0aGUgbGFzdCBpbm9kZS4KKwkJICovCisJCWZpcnN0X2luZGV4ID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vICsgMSk7CisJCWlmIChmaXJzdF9pbmRleCA8IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubykpIHsKKwkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHNraXAgcXVvdGEgaW5vZGVzICovCisJCWlmIChpcCA9PSBYRlNfUUlfVVFJUChtcCkgfHwgaXAgPT0gWEZTX1FJX0dRSVAobXApKSB7CisJCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKKwkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGNhbid0IGdldCBhIHJlZmVyZW5jZSBvbiB0aGUgaW5vZGUsIGl0IG11c3QgYmUKKwkJICogaW4gcmVjbGFpbS4gTGVhdmUgaXQgZm9yIHRoZSByZWNsYWltIGNvZGUgdG8gZmx1c2guCisJCSAqLworCQlpZiAoIWlncmFiKFZGU19JKGlwKSkpIHsKKwkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCisJCS8qIGF2b2lkIG5ldyBpbm9kZXMgdGhvdWdoIHdlIHNob3VsZG4ndCBmaW5kIGFueSBoZXJlICovCisJCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JTkVXKSkgeworCQkJSVJFTEUoaXApOworCQkJY29udGludWU7CisJCX0KKworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKChmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgJiYgaXAtPmlfdWRxdW90KSB7CisJCQl4ZnNfcW1fZHFyZWxlKGlwLT5pX3VkcXVvdCk7CisJCQlpcC0+aV91ZHF1b3QgPSBOVUxMOworCQl9CisJCWlmIChmbGFncyAmIChYRlNfUFFVT1RBX0FDQ1R8WEZTX0dRVU9UQV9BQ0NUKSAmJgorCQkgICAgaXAtPmlfZ2RxdW90KSB7CisJCQl4ZnNfcW1fZHFyZWxlKGlwLT5pX2dkcXVvdCk7CisJCQlpcC0+aV9nZHF1b3QgPSBOVUxMOworCQl9CisJCXhmc19pcHV0KGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwl9IHdoaWxlIChucl9mb3VuZCk7Cit9CisKKy8qCiAgKiBHbyB0aHJ1IGFsbCB0aGUgaW5vZGVzIGluIHRoZSBmaWxlIHN5c3RlbSwgcmVsZWFzaW5nIHRoZWlyIGRxdW90cy4KICAqIE5vdGUgdGhhdCB0aGUgbW91bnQgc3RydWN0dXJlIGdldHMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgdGhhdCBxdW90YXMgYXJlIG9mZgogICogQUZURVIgdGhpcywgaW4gdGhlIGNhc2Ugb2YgcXVvdGFvZmYuIFRoaXMgYWxzbyBnZXRzIGNhbGxlZCBmcm9tCkBAIC0xMDMyLDkxICsxMTEyLDE0IEBACiAJc3RydWN0IHhmc19tb3VudCAqbXAsCiAJdWludAkJIGZsYWdzKQogewotCXhmc19pbm9kZV90CSppcCwgKnRvcGlubzsKLQl1aW50CQlpcmVjbGFpbXM7Ci0Jc3RydWN0IGlub2RlCSp2cDsKLQlib29sZWFuX3QJdm5vZGVfcmVmZDsKKwlpbnQJCWk7CiAKIAlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKLQotCVhGU19NT1VOVF9JTE9DSyhtcCk7Ci1hZ2FpbjoKLQlpcCA9IG1wLT5tX2lub2RlczsKLQlpZiAoaXAgPT0gTlVMTCkgewotCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Ci0JCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaSsrKSB7CisJCWlmICghbXAtPm1fcGVyYWdbaV0ucGFnX2ljaV9pbml0KQorCQkJY29udGludWU7CisJCXhmc19xbV9kcXJlbGVfaW5vZGVzX2FnKG1wLCBpLCBmbGFncyk7CiAJfQotCWRvIHsKLQkJLyogU2tpcCBtYXJrZXJzIGluc2VydGVkIGJ5IHhmc19zeW5jICovCi0JCWlmIChpcC0+aV9tb3VudCA9PSBOVUxMKSB7Ci0JCQlpcCA9IGlwLT5pX21uZXh0OwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogUm9vdCBpbm9kZSwgcmJtaXAgYW5kIHJzdW1pcCBoYXZlIGFzc29jaWF0ZWQgYmxvY2tzICovCi0JCWlmIChpcCA9PSBYRlNfUUlfVVFJUChtcCkgfHwgaXAgPT0gWEZTX1FJX0dRSVAobXApKSB7Ci0JCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOwotCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKLQkJCWlwID0gaXAtPmlfbW5leHQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQl2cCA9IFZGU19JKGlwKTsKLQkJaWYgKCF2cCkgewotCQkJQVNTRVJUKGlwLT5pX3VkcXVvdCA9PSBOVUxMKTsKLQkJCUFTU0VSVChpcC0+aV9nZHF1b3QgPT0gTlVMTCk7Ci0JCQlpcCA9IGlwLT5pX21uZXh0OwotCQkJY29udGludWU7Ci0JCX0KLQkJdm5vZGVfcmVmZCA9IEJfRkFMU0U7Ci0JCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkgPT0gMCkgewotCQkJaXJlY2xhaW1zID0gbXAtPm1faXJlY2xhaW1zOwotCQkJdG9waW5vID0gbXAtPm1faW5vZGVzOwotCQkJdnAgPSB2bl9ncmFiKHZwKTsKLQkJCWlmICghdnApCi0JCQkJZ290byBhZ2FpbjsKLQotCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOwotCQkJLyogWFhYIHJlc3RhcnQgbGltaXQgPyAqLwotCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQl2bm9kZV9yZWZkID0gQl9UUlVFOwotCQl9IGVsc2UgewotCQkJaXJlY2xhaW1zID0gbXAtPm1faXJlY2xhaW1zOwotCQkJdG9waW5vID0gbXAtPm1faW5vZGVzOwotCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgZG9uJ3Qga2VlcCB0aGUgbW91bnRsb2NrIGFjcm9zcyB0aGUgZHFyZWxlKCkgY2FsbCwKLQkJICogc2luY2UgaXQgY2FuIHRha2UgYSB3aGlsZS4uCi0JCSAqLwotCQlpZiAoKGZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSAmJiBpcC0+aV91ZHF1b3QpIHsKLQkJCXhmc19xbV9kcXJlbGUoaXAtPmlfdWRxdW90KTsKLQkJCWlwLT5pX3VkcXVvdCA9IE5VTEw7Ci0JCX0KLQkJaWYgKGZsYWdzICYgKFhGU19QUVVPVEFfQUNDVHxYRlNfR1FVT1RBX0FDQ1QpICYmIGlwLT5pX2dkcXVvdCkgewotCQkJeGZzX3FtX2RxcmVsZShpcC0+aV9nZHF1b3QpOwotCQkJaXAtPmlfZ2RxdW90ID0gTlVMTDsKLQkJfQotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkvKgotCQkgKiBXYWl0IHVudGlsIHdlJ3ZlIGRyb3BwZWQgdGhlIGlsb2NrIGFuZCBtb3VudGxvY2sgdG8KLQkJICogZG8gdGhlIHZuX3JlbGUuIE9yIGJlIGNvbmRlbW5lZCB0byBhbiBldGVybml0eSBpbiB0aGUKLQkJICogaW5hY3RpdmUgY29kZSBpbiBoZWxsLgotCQkgKi8KLQkJaWYgKHZub2RlX3JlZmQpCi0JCQlJUkVMRShpcCk7Ci0JCVhGU19NT1VOVF9JTE9DSyhtcCk7Ci0JCS8qCi0JCSAqIElmIGFuIGlub2RlIHdhcyBpbnNlcnRlZCBvciByZW1vdmVkLCB3ZSBnb3R0YQotCQkgKiBzdGFydCBvdmVyIGFnYWluLgotCQkgKi8KLQkJaWYgKHRvcGlubyAhPSBtcC0+bV9pbm9kZXMgfHwgbXAtPm1faXJlY2xhaW1zICE9IGlyZWNsYWltcykgewotCQkJLyogWFhYIHVzZSBhIHNlbnRpbmVsICovCi0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWlwID0gaXAtPmlfbW5leHQ7Ci0JfSB3aGlsZSAoaXAgIT0gbXAtPm1faW5vZGVzKTsKLQotCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvZGVidWcuYyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKaW5kZXggYzI3YWJlZi4uYWU1NDgyOSAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvZGVidWcuYworKysgYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCkBAIC0xOCw2ICsxOCwxMyBAQAogI2luY2x1ZGUgPHhmcy5oPgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKy8qIHhmc19tb3VudC5oIGRyYWdzIGEgbG90IG9mIGNyYXAgaW4sIHNvcnJ5Li4gKi8KKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorCiBzdGF0aWMgY2hhcgkJbWVzc2FnZVsxMDI0XTsJLyoga2VlcCBpdCBvZmYgdGhlIHN0YWNrICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHhmc19lcnJfbG9jayk7CiAKQEAgLTU1LDIyICs2Miw0MiBAQAogfQogCiB2b2lkCi1pY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3hmc19mc192Y21uX2VycigKKwlpbnQJCQlsZXZlbCwKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwljaGFyCQkJKmZtdCwKKwl2YV9saXN0CQkJYXApCiB7Ci0JdWxvbmcJZmxhZ3M7Ci0JaW50CWxlbjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlsZW4gPSAwOwogCiAJbGV2ZWwgJj0gWEZTX0VSUl9NQVNLOwotCWlmKGxldmVsID4gWEZTX01BWF9FUlJfTEVWRUwpCisJaWYgKGxldmVsID4gWEZTX01BWF9FUlJfTEVWRUwpCiAJCWxldmVsID0gWEZTX01BWF9FUlJfTEVWRUw7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGZzX2Vycl9sb2NrLGZsYWdzKTsKLQlsZW4gPSB2c25wcmludGYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpLCBmbXQsIGFwKTsKKworCWlmIChtcCkgeworCQlsZW4gPSBzcHJpbnRmKG1lc3NhZ2UsICJGaWxlc3lzdGVtIFwiJXNcIjogIiwgbXAtPm1fZnNuYW1lKTsKKworCQkvKgorCQkgKiBTa2lwIHRoZSBwcmludGsgaWYgd2UgY2FuJ3QgcHJpbnQgYW55dGhpbmcgdXNlZnVsCisJCSAqIGR1ZSB0byBhbiBvdmVyLWxvbmcgZGV2aWNlIG5hbWUuCisJCSAqLworCQlpZiAobGVuID49IHNpemVvZihtZXNzYWdlKSkKKwkJCWdvdG8gb3V0OworCX0KKworCWxlbiA9IHZzbnByaW50ZihtZXNzYWdlICsgbGVuLCBzaXplb2YobWVzc2FnZSkgLSBsZW4sIGZtdCwgYXApOwogCWlmIChsZW4gPj0gc2l6ZW9mKG1lc3NhZ2UpKQogCQlsZW4gPSBzaXplb2YobWVzc2FnZSkgLSAxOwogCWlmIChtZXNzYWdlW2xlbi0xXSA9PSAnXG4nKQogCQltZXNzYWdlW2xlbi0xXSA9IDA7CisKIAlwcmludGsoIiVzJXNcbiIsIGVycl9sZXZlbFtsZXZlbF0sIG1lc3NhZ2UpOworIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZnNfZXJyX2xvY2ssZmxhZ3MpOworCiAJQlVHX09OKGxldmVsID09IENFX1BBTklDKTsKIH0KIApAQCAtODQsNSArMTExLDUgQEAKIHZvaWQKIHhmc19oZXhfZHVtcCh2b2lkICpwLCBpbnQgbGVuZ3RoKQogewotCXByaW50X2hleF9kdW1wKEtFUk5fQUxFUlQsICIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW5ndGgsIDEpOworCXByaW50X2hleF9kdW1wKEtFUk5fQUxFUlQsICIiLCBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgMSwgcCwgbGVuZ3RoLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmggYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCmluZGV4IDc1ODQ1ZjkuLjZmNGZkMzcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaApAQCAtMjcsOCArMjcsNiBAQAogI2RlZmluZSBDRV9BTEVSVCAgICAgICAgMSAgICAgICAgICAgICAgIC8qIGFsZXJ0ICAgICAgICAqLwogI2RlZmluZSBDRV9QQU5JQyAgICAgICAgMCAgICAgICAgICAgICAgIC8qIHBhbmljICAgICAgICAqLwogCi1leHRlcm4gdm9pZCBpY21uX2VycihpbnQsIGNoYXIgKiwgdmFfbGlzdCkKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDApKSk7CiBleHRlcm4gdm9pZCBjbW5fZXJyKGludCwgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwogZXh0ZXJuIHZvaWQgYXNzZmFpbChjaGFyICpleHByLCBjaGFyICpmLCBpbnQgbCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCmluZGV4IGEzNGVmMDUuLjJkNDk0YzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCkBAIC0xMTMsMjEgKzExMywxNiBAQAogdm9pZAoga3RyYWNlX2ZyZWUoa3RyYWNlX3QgKmt0cCkKIHsKLQlpbnQgICAgIGVudHJpZXNfc2l6ZTsKLQogCWlmIChrdHAgPT0gKGt0cmFjZV90ICopTlVMTCkKIAkJcmV0dXJuOwogCiAJLyoKIAkgKiBTcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIFZub2RlIHRyYWNlIGJ1ZmZlci4KIAkgKi8KLQlpZiAoa3RwLT5rdF9uZW50cmllcyA9PSBrdHJhY2VfemVudHJpZXMpIHsKKwlpZiAoa3RwLT5rdF9uZW50cmllcyA9PSBrdHJhY2VfemVudHJpZXMpCiAJCWttZW1fem9uZV9mcmVlKGt0cmFjZV9lbnRfem9uZSwga3RwLT5rdF9lbnRyaWVzKTsKLQl9IGVsc2UgewotCQllbnRyaWVzX3NpemUgPSAoaW50KShrdHAtPmt0X25lbnRyaWVzICogc2l6ZW9mKGt0cmFjZV9lbnRyeV90KSk7Ci0KKwllbHNlCiAJCWttZW1fZnJlZShrdHAtPmt0X2VudHJpZXMpOwotCX0KIAogCWttZW1fem9uZV9mcmVlKGt0cmFjZV9oZHJfem9uZSwga3RwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnMuaCBiL2ZzL3hmcy94ZnMuaAppbmRleCA1NDBlNGM5Li4xNzI1NGI1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzLmgKKysrIGIvZnMveGZzL3hmcy5oCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIFhGU19BVFRSX1RSQUNFIDEKICNkZWZpbmUgWEZTX0JMSV9UUkFDRSAxCiAjZGVmaW5lIFhGU19CTUFQX1RSQUNFIDEKLSNkZWZpbmUgWEZTX0JNQlRfVFJBQ0UgMQorI2RlZmluZSBYRlNfQlRSRUVfVFJBQ0UgMQogI2RlZmluZSBYRlNfRElSMl9UUkFDRSAxCiAjZGVmaW5lIFhGU19EUVVPVF9UUkFDRSAxCiAjZGVmaW5lIFhGU19JTE9DS19UUkFDRSAxCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5jIGIvZnMveGZzL3hmc19hY2wuYwppbmRleCA5MWQ2OTMzLi5hOGNkZDczIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FjbC5jCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmMKQEAgLTc1OCw3ICs3NTgsNyBAQAogCWlmIChnYXAgJiYgbm9tYXNrKQogCQlpYXR0ci5pYV9tb2RlIHw9IGdhcC0+YWVfcGVybSA8PCAzOwogCi0JcmV0dXJuIHhmc19zZXRhdHRyKFhGU19JKHZwKSwgJmlhdHRyLCAwLCBzeXNfY3JlZCk7CisJcmV0dXJuIHhmc19zZXRhdHRyKFhGU19JKHZwKSwgJmlhdHRyLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWcuaCBiL2ZzL3hmcy94ZnNfYWcuaAppbmRleCA2MWIyOTJhLi5mMmUyMTgxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FnLmgKKysrIGIvZnMveGZzL3hmc19hZy5oCkBAIC05MSw2ICs5MSw4IEBACiAjZGVmaW5lCVhGU19BR0ZfQkxPQ0sobXApCVhGU19IRFJfQkxPQ0sobXAsIFhGU19BR0ZfREFERFIobXApKQogI2RlZmluZQlYRlNfQlVGX1RPX0FHRihicCkJKCh4ZnNfYWdmX3QgKilYRlNfQlVGX1BUUihicCkpCiAKK2V4dGVybiBpbnQgeGZzX3JlYWRfYWdmKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCXhmc19hZ251bWJlcl90IGFnbm8sIGludCBmbGFncywgc3RydWN0IHhmc19idWYgKipicHApOwogCiAvKgogICogU2l6ZSBvZiB0aGUgdW5saW5rZWQgaW5vZGUgaGFzaCB0YWJsZSBpbiB0aGUgYWdpLgpAQCAtMTQyLDYgKzE0NCw5IEBACiAjZGVmaW5lCVhGU19BR0lfQkxPQ0sobXApCVhGU19IRFJfQkxPQ0sobXAsIFhGU19BR0lfREFERFIobXApKQogI2RlZmluZQlYRlNfQlVGX1RPX0FHSShicCkJKCh4ZnNfYWdpX3QgKilYRlNfQlVGX1BUUihicCkpCiAKK2V4dGVybiBpbnQgeGZzX3JlYWRfYWdpKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQl4ZnNfYWdudW1iZXJfdCBhZ25vLCBzdHJ1Y3QgeGZzX2J1ZiAqKmJwcCk7CisKIC8qCiAgKiBUaGUgdGhpcmQgYS5nLiBibG9jayBjb250YWlucyB0aGUgYS5nLiBmcmVlbGlzdCwgYW4gYXJyYXkKICAqIG9mIGJsb2NrIHBvaW50ZXJzIHRvIGJsb2NrcyBvd25lZCBieSB0aGUgYWxsb2NhdGlvbiBidHJlZSBjb2RlLgpAQCAtMTkyLDE3ICsxOTcsMjMgQEAKIAl4ZnNfYWdpbm9fdAlwYWdpX2ZyZWVjb3VudDsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCiAJeGZzX2FnaW5vX3QJcGFnaV9jb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBpbm9kZXMgKi8KIAlpbnQJCXBhZ2JfY291bnQ7CS8qIHBhZ2Igc2xvdHMgaW4gdXNlICovCisJeGZzX3BlcmFnX2J1c3lfdCAqcGFnYl9saXN0OwkvKiB1bnN0YWJsZSBibG9ja3MgKi8KICNpZmRlZiBfX0tFUk5FTF9fCiAJc3BpbmxvY2tfdAlwYWdiX2xvY2s7CS8qIGxvY2sgZm9yIHBhZ2JfbGlzdCAqLwotI2VuZGlmCi0JeGZzX3BlcmFnX2J1c3lfdCAqcGFnYl9saXN0OwkvKiB1bnN0YWJsZSBibG9ja3MgKi8KKwogCWF0b21pY190ICAgICAgICBwYWdmX2ZzdHJtczsgICAgLyogIyBvZiBmaWxlc3RyZWFtcyBhY3RpdmUgaW4gdGhpcyBBRyAqLwogCiAJaW50CQlwYWdfaWNpX2luaXQ7CS8qIGluY29yZSBpbm9kZSBjYWNoZSBpbml0aWFsaXNlZCAqLwogCXJ3bG9ja190CXBhZ19pY2lfbG9jazsJLyogaW5jb3JlIGlub2RlIGxvY2sgKi8KIAlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHBhZ19pY2lfcm9vdDsJLyogaW5jb3JlIGlub2RlIGNhY2hlIHJvb3QgKi8KKyNlbmRpZgogfSB4ZnNfcGVyYWdfdDsKIAorLyoKKyAqIHRhZ3MgZm9yIGlub2RlIHJhZGl4IHRyZWUKKyAqLworI2RlZmluZSBYRlNfSUNJX1JFQ0xBSU1fVEFHCTAJLyogaW5vZGUgaXMgdG8gYmUgcmVjbGFpbWVkICovCisKICNkZWZpbmUJWEZTX0FHX01BWExFVkVMUyhtcCkJCSgobXApLT5tX2FnX21heGxldmVscykKICNkZWZpbmUJWEZTX01JTl9GUkVFTElTVF9SQVcoYmwsY2wsbXApCVwKIAkoTUlOKGJsICsgMSwgWEZTX0FHX01BWExFVkVMUyhtcCkpICsgTUlOKGNsICsgMSwgWEZTX0FHX01BWExFVkVMUyhtcCkpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCmluZGV4IDE5NTZmODMuLjAyOGU0NGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTkwLDYgKzkwLDkyIEBACiAgKi8KIAogLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIFtibm8sIGxlbl0gaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cF9lcSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jayA9IGJubzsKKwljdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQgPSBsZW47CisJcmV0dXJuIHhmc19idHJlZV9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0VRLCBzdGF0KTsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwX2dlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQlsZW4sCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2J0cmVlX2xvb2t1cChjdXIsIFhGU19MT09LVVBfR0UsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFtibm8sIGxlbl0KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19sb29rdXBfbGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYnRyZWVfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9MRSwgc3RhdCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIgdG8gdGhlIHZhbHVlIGdpdmVuCisgKiBieSBbYm5vLCBsZW5dLgorICogVGhpcyBlaXRoZXIgd29ya3MgKHJldHVybiAwKSBvciBnZXRzIGFuIEVGU0NPUlJVUFRFRCBlcnJvci4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3VwZGF0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJbGVuKQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCit7CisJdW5pb24geGZzX2J0cmVlX3JlYwlyZWM7CisKKwlyZWMuYWxsb2MuYXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKGJubyk7CisJcmVjLmFsbG9jLmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOworCXJldHVybiB4ZnNfYnRyZWVfdXBkYXRlKGN1ciwgJnJlYyk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19nZXRfcmVjKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCSpibm8sCS8qIG91dHB1dDogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQkqbGVuLAkvKiBvdXRwdXQ6IGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCkJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWM7CisJaW50CQkJZXJyb3I7CisKKwllcnJvciA9IHhmc19idHJlZV9nZXRfcmVjKGN1ciwgJnJlYywgc3RhdCk7CisJaWYgKCFlcnJvciAmJiAqc3RhdCA9PSAxKSB7CisJCSpibm8gPSBiZTMyX3RvX2NwdShyZWMtPmFsbG9jLmFyX3N0YXJ0YmxvY2spOworCQkqbGVuID0gYmUzMl90b19jcHUocmVjLT5hbGxvYy5hcl9ibG9ja2NvdW50KTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgogICogQ29tcHV0ZSBhbGlnbmVkIHZlcnNpb24gb2YgdGhlIGZvdW5kIGV4dGVudC4KICAqIFRha2VzIGFsaWdubWVudCBhbmQgbWluIGxlbmd0aCBpbnRvIGFjY291bnQuCiAgKi8KQEAgLTI5NCwyMSArMzgwLDIwIEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKIAl9Ci0jaWZkZWYgREVCVUcKLQl7Ci0JCXhmc19hbGxvY19ibG9ja190CSpibm9ibG9jazsKLQkJeGZzX2FsbG9jX2Jsb2NrX3QJKmNudGJsb2NrOwogCi0JCWlmIChibm9fY3VyLT5iY19ubGV2ZWxzID09IDEgJiYKLQkJICAgIGNudF9jdXItPmJjX25sZXZlbHMgPT0gMSkgewotCQkJYm5vYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJub19jdXItPmJjX2J1ZnNbMF0pOwotCQkJY250YmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGNudF9jdXItPmJjX2J1ZnNbMF0pOwotCQkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKLQkJCQliZTE2X3RvX2NwdShibm9ibG9jay0+YmJfbnVtcmVjcykgPT0KLQkJCQliZTE2X3RvX2NwdShjbnRibG9jay0+YmJfbnVtcmVjcykpOwotCQl9CisjaWZkZWYgREVCVUcKKwlpZiAoYm5vX2N1ci0+YmNfbmxldmVscyA9PSAxICYmIGNudF9jdXItPmJjX25sZXZlbHMgPT0gMSkgeworCQlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibm9ibG9jazsKKwkJc3RydWN0IHhmc19idHJlZV9ibG9jawkqY250YmxvY2s7CisKKwkJYm5vYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJub19jdXItPmJjX2J1ZnNbMF0pOworCQljbnRibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soY250X2N1ci0+YmNfYnVmc1swXSk7CisKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKKwkJCWJub2Jsb2NrLT5iYl9udW1yZWNzID09IGNudGJsb2NrLT5iYl9udW1yZWNzKTsKIAl9CiAjZW5kaWYKKwogCS8qCiAJICogRGVhbCB3aXRoIGFsbCBmb3VyIGNhc2VzOiB0aGUgYWxsb2NhdGVkIHJlY29yZCBpcyBjb250YWluZWQKIAkgKiB3aXRoaW4gdGhlIGZyZWVzcGFjZSByZWNvcmQsIHNvIHdlIGNhbiBoYXZlIG5ldyBmcmVlc3BhY2UKQEAgLTMzMyw3ICs0MTgsNyBAQAogCS8qCiAJICogRGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBieS1zaXplIGJ0cmVlLgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY250X2N1ciwgJmkpKSkKIAkJcmV0dXJuIGVycm9yOwogCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKIAkvKgpAQCAtMzQzLDcgKzQyOCw3IEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIG5mYm5vMSwgbmZsZW4xLCAmaSkpKQogCQkJcmV0dXJuIGVycm9yOwogCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5zZXJ0KGNudF9jdXIsICZpKSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGNudF9jdXIsICZpKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKIAl9CkBAIC0zNTEsNyArNDM2LDcgQEAKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgbmZibm8yLCBuZmxlbjIsICZpKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAwKTsKLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNlcnQoY250X2N1ciwgJmkpKSkKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbnNlcnQoY250X2N1ciwgJmkpKSkKIAkJCXJldHVybiBlcnJvcjsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOwogCX0KQEAgLTM2Miw3ICs0NDcsNyBAQAogCQkvKgogCQkgKiBObyByZW1haW5pbmcgZnJlZXNwYWNlLCBqdXN0IGRlbGV0ZSB0aGUgYnktYmxvY2sgdHJlZSBlbnRyeS4KIAkJICovCi0JCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGJub19jdXIsICZpKSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVsZXRlKGJub19jdXIsICZpKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKIAl9IGVsc2UgewpAQCAtMzc5LDcgKzQ2NCw3IEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGJub19jdXIsIG5mYm5vMiwgbmZsZW4yLCAmaSkpKQogCQkJcmV0dXJuIGVycm9yOwogCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5zZXJ0KGJub19jdXIsICZpKSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGJub19jdXIsICZpKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKIAl9CkBAIC02NDAsOCArNzI1LDggQEAKIAkvKgogCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1udW1iZXIgZnJlZXNwYWNlIGJ0cmVlLgogCSAqLwotCWJub19jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAotCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLCAwKTsKKwlibm9fY3VyID0geGZzX2FsbG9jYnRfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PKTsKIAkvKgogCSAqIExvb2t1cCBibm8gYW5kIG1pbmxlbiBpbiB0aGUgYnRyZWUgKG1pbmxlbiBpcyBpcnJlbGV2YW50LCByZWFsbHkpLgogCSAqIExvb2sgZm9yIHRoZSBjbG9zZXN0IGZyZWUgYmxvY2sgPD0gYm5vLCBpdCBtdXN0IGNvbnRhaW4gYm5vCkBAIC02OTYsOCArNzgxLDggQEAKIAkgKiBXZSBhcmUgYWxsb2NhdGluZyBhZ2JubyBmb3IgcmxlbiBbYWdibm8gLi4gZW5kXQogCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgogCSAqLwotCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAotCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLCAwKTsKKwljbnRfY3VyID0geGZzX2FsbG9jYnRfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05UKTsKIAlBU1NFUlQoYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KIAkJYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpKTsKIAlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sCkBAIC03NTksOCArODQ0LDggQEAKIAkvKgogCSAqIEdldCBhIGN1cnNvciBmb3IgdGhlIGJ5LXNpemUgYnRyZWUuCiAJICovCi0JY250X2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCi0JCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9DTlQsIE5VTEwsIDApOworCWNudF9jdXIgPSB4ZnNfYWxsb2NidF9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9DTlQpOwogCWx0bGVuID0gMDsKIAlibm9fY3VyX2x0ID0gYm5vX2N1cl9ndCA9IE5VTEw7CiAJLyoKQEAgLTgxOCw3ICs5MDMsNyBAQAogCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJCQlpZiAobHRsZW4gPj0gYXJncy0+bWlubGVuKQogCQkJCQlicmVhazsKLQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjbnRfY3VyLCAwLCAmaSkpKQorCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGNudF9jdXIsIDAsICZpKSkpCiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJfSB3aGlsZSAoaSk7CiAJCQlBU1NFUlQobHRsZW4gPj0gYXJncy0+bWlubGVuKTsKQEAgLTgyOCw3ICs5MTMsNyBAQAogCQlpID0gY250X2N1ci0+YmNfcHRyc1swXTsKIAkJZm9yIChqID0gMSwgYmxlbiA9IDAsIGJkaWZmID0gMDsKIAkJICAgICAhZXJyb3IgJiYgaiAmJiAoYmxlbiA8IGFyZ3MtPm1heGxlbiB8fCBiZGlmZiA+IDApOwotCQkgICAgIGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjbnRfY3VyLCAwLCAmaikpIHsKKwkJICAgICBlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY250X2N1ciwgMCwgJmopKSB7CiAJCQkvKgogCQkJICogRm9yIGVhY2ggZW50cnksIGRlY2lkZSBpZiBpdCdzIGJldHRlciB0aGFuCiAJCQkgKiB0aGUgcHJldmlvdXMgYmVzdCBlbnRyeS4KQEAgLTg4Niw4ICs5NzEsOCBAQAogCQkvKgogCQkgKiBTZXQgdXAgYSBjdXJzb3IgZm9yIHRoZSBieS1ibm8gdHJlZS4KIAkJICovCi0JCWJub19jdXJfbHQgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLAotCQkJYXJncy0+YWdicCwgYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJCWJub19jdXJfbHQgPSB4ZnNfYWxsb2NidF9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsCisJCQlhcmdzLT5hZ2JwLCBhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PKTsKIAkJLyoKIAkJICogRml4IHVwIHRoZSBidHJlZSBlbnRyaWVzLgogCQkgKi8KQEAgLTkxNCw4ICs5OTksOCBAQAogCS8qCiAJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGN1cnNvciBmb3IgdGhlIGxlZnR3YXJkIHNlYXJjaC4KIAkgKi8KLQlibm9fY3VyX2x0ID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKLQkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJYm5vX2N1cl9sdCA9IHhmc19hbGxvY2J0X2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTyk7CiAJLyoKIAkgKiBMb29rdXAgPD0gYm5vIHRvIGZpbmQgdGhlIGxlZnR3YXJkIHNlYXJjaCdzIHN0YXJ0aW5nIHBvaW50LgogCSAqLwpAQCAtOTM4LDcgKzEwMjMsNyBAQAogCSAqIEluY3JlbWVudCB0aGUgY3Vyc29yLCBzbyB3ZSB3aWxsIHBvaW50IGF0IHRoZSBlbnRyeSBqdXN0IHJpZ2h0CiAJICogb2YgdGhlIGxlZnR3YXJkIGVudHJ5IGlmIGFueSwgb3IgdG8gdGhlIGxlZnRtb3N0IGVudHJ5LgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGJub19jdXJfZ3QsIDAsICZpKSkpCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoYm5vX2N1cl9ndCwgMCwgJmkpKSkKIAkJZ290byBlcnJvcjA7CiAJaWYgKCFpKSB7CiAJCS8qCkBAIC05NjEsNyArMTA0Niw3IEBACiAJCQkJCWFyZ3MtPm1pbmxlbiwgJmx0Ym5vYSwgJmx0bGVuYSk7CiAJCQlpZiAobHRsZW5hID49IGFyZ3MtPm1pbmxlbikKIAkJCQlicmVhazsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGJub19jdXJfbHQsIDAsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChibm9fY3VyX2x0LCAwLCAmaSkpKQogCQkJCWdvdG8gZXJyb3IwOwogCQkJaWYgKCFpKSB7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwKQEAgLTk3Nyw3ICsxMDYyLDcgQEAKIAkJCQkJYXJncy0+bWlubGVuLCAmZ3Ribm9hLCAmZ3RsZW5hKTsKIAkJCWlmIChndGxlbmEgPj0gYXJncy0+bWlubGVuKQogCQkJCWJyZWFrOwotCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQoYm5vX2N1cl9ndCwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGJub19jdXJfZ3QsIDAsICZpKSkpCiAJCQkJZ290byBlcnJvcjA7CiAJCQlpZiAoIWkpIHsKIAkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2d0LApAQCAtMTA2Niw3ICsxMTUxLDcgQEAKIAkJCQkJLyoKIAkJCQkJICogRmVsbCBvZmYgdGhlIHJpZ2h0IGVuZC4KIAkJCQkJICovCi0JCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KAorCQkJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudCgKIAkJCQkJCQlibm9fY3VyX2d0LCAwLCAmaSkpKQogCQkJCQkJZ290byBlcnJvcjA7CiAJCQkJCWlmICghaSkgewpAQCAtMTE2Miw3ICsxMjQ3LDcgQEAKIAkJCQkJLyoKIAkJCQkJICogRmVsbCBvZmYgdGhlIGxlZnQgZW5kLgogCQkJCQkgKi8KLQkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoCisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KAogCQkJCQkJCWJub19jdXJfbHQsIDAsICZpKSkpCiAJCQkJCQlnb3RvIGVycm9yMDsKIAkJCQkJaWYgKCFpKSB7CkBAIC0xMjY3LDggKzEzNTIsOCBAQAogCS8qCiAJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgogCSAqLwotCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAotCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLCAwKTsKKwljbnRfY3VyID0geGZzX2FsbG9jYnRfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05UKTsKIAlibm9fY3VyID0gTlVMTDsKIAkvKgogCSAqIExvb2sgZm9yIGFuIGVudHJ5ID49IG1heGxlbithbGlnbm1lbnQtMSBibG9ja3MuCkBAIC0xMzIxLDcgKzE0MDYsNyBAQAogCQliZXN0ZmxlbiA9IGZsZW47CiAJCWJlc3RmYm5vID0gZmJubzsKIAkJZm9yICg7OykgewotCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY250X2N1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGNudF9jdXIsIDAsICZpKSkpCiAJCQkJZ290byBlcnJvcjA7CiAJCQlpZiAoaSA9PSAwKQogCQkJCWJyZWFrOwpAQCAtMTM3Miw4ICsxNDU3LDggQEAKIAkvKgogCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktYmxvY2sgdHJlZS4KIAkgKi8KLQlibm9fY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKLQkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJYm5vX2N1ciA9IHhmc19hbGxvY2J0X2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTyk7CiAJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyLCBmYm5vLCBmbGVuLAogCQkJcmJubywgcmxlbiwgWEZTQV9GSVhVUF9DTlRfT0spKSkKIAkJZ290byBlcnJvcjA7CkBAIC0xNDE2LDcgKzE1MDEsNyBAQAogCXhmc19leHRsZW5fdAlmbGVuOwogCWludAkJaTsKIAotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGNjdXIsIDAsICZpKSkpCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY2N1ciwgMCwgJmkpKSkKIAkJZ290byBlcnJvcjA7CiAJaWYgKGkpIHsKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNjdXIsICZmYm5vLCAmZmxlbiwgJmkpKSkKQEAgLTE1MTUsOCArMTYwMCw3IEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LWJsb2NrIGJ0cmVlLgogCSAqLwotCWJub19jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBhZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLAotCQkwKTsKKwlibm9fY3VyID0geGZzX2FsbG9jYnRfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBhZ25vLCBYRlNfQlROVU1fQk5PKTsKIAljbnRfY3VyID0gTlVMTDsKIAkvKgogCSAqIExvb2sgZm9yIGEgbmVpZ2hib3JpbmcgYmxvY2sgb24gdGhlIGxlZnQgKGxvd2VyIGJsb2NrIG51bWJlcnMpCkBAIC0xNTQ5LDcgKzE2MzMsNyBAQAogCSAqIExvb2sgZm9yIGEgbmVpZ2hib3JpbmcgYmxvY2sgb24gdGhlIHJpZ2h0IChoaWdoZXIgYmxvY2sgbnVtYmVycykKIAkgKiB0aGF0IGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGlzIHNwYWNlLgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGJub19jdXIsIDAsICZoYXZlcmlnaHQpKSkKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudChibm9fY3VyLCAwLCAmaGF2ZXJpZ2h0KSkpCiAJCWdvdG8gZXJyb3IwOwogCWlmIChoYXZlcmlnaHQpIHsKIAkJLyoKQEAgLTE1NzUsOCArMTY1OSw3IEBACiAJLyoKIAkgKiBOb3cgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIHRyZWUuCiAJICovCi0JY250X2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9DTlQsIE5VTEwsCi0JCTApOworCWNudF9jdXIgPSB4ZnNfYWxsb2NidF9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9DTlQpOwogCS8qCiAJICogSGF2ZSBib3RoIGxlZnQgYW5kIHJpZ2h0IGNvbnRpZ3VvdXMgbmVpZ2hib3JzLgogCSAqIE1lcmdlIGFsbCB0aHJlZSBpbnRvIGEgc2luZ2xlIGZyZWUgYmxvY2suCkBAIC0xNTg4LDcgKzE2NzEsNyBAQAogCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBsdGJubywgbHRsZW4sICZpKSkpCiAJCQlnb3RvIGVycm9yMDsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlbGV0ZShjbnRfY3VyLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjbnRfY3VyLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJLyoKQEAgLTE1OTcsMTkgKzE2ODAsMTkgQEAKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgZ3Ribm8sIGd0bGVuLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY250X2N1ciwgJmkpKSkKIAkJCWdvdG8gZXJyb3IwOwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCS8qCiAJCSAqIERlbGV0ZSB0aGUgb2xkIGJ5LWJsb2NrIGVudHJ5IGZvciB0aGUgcmlnaHQgYmxvY2suCiAJCSAqLwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlbGV0ZShibm9fY3VyLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShibm9fY3VyLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJLyoKIAkJICogTW92ZSB0aGUgYnktYmxvY2sgY3Vyc29yIGJhY2sgdG8gdGhlIGxlZnQgbmVpZ2hib3IuCiAJCSAqLwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChibm9fY3VyLCAwLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChibm9fY3VyLCAwLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKICNpZmRlZiBERUJVRwpAQCAtMTY0OCwxNCArMTczMSwxNCBAQAogCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBsdGJubywgbHRsZW4sICZpKSkpCiAJCQlnb3RvIGVycm9yMDsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlbGV0ZShjbnRfY3VyLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjbnRfY3VyLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJLyoKIAkJICogQmFjayB1cCB0aGUgYnktYmxvY2sgY3Vyc29yIHRvIHRoZSBsZWZ0IG5laWdoYm9yLCBhbmQKIAkJICogdXBkYXRlIGl0cyBsZW5ndGguCiAJCSAqLwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChibm9fY3VyLCAwLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChibm9fY3VyLCAwLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJbmJubyA9IGx0Ym5vOwpAQCAtMTY3NCw3ICsxNzU3LDcgQEAKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgZ3Ribm8sIGd0bGVuLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY250X2N1ciwgJmkpKSkKIAkJCWdvdG8gZXJyb3IwOwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCS8qCkBAIC0xNjkzLDcgKzE3NzYsNyBAQAogCWVsc2UgewogCQluYm5vID0gYm5vOwogCQlubGVuID0gbGVuOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChibm9fY3VyLCAmaSkpKQorCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChibm9fY3VyLCAmaSkpKQogCQkJZ290byBlcnJvcjA7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAl9CkBAIC0xNzA1LDcgKzE3ODgsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIG5ibm8sIG5sZW4sICZpKSkpCiAJCWdvdG8gZXJyb3IwOwogCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZXJyb3IwKTsKLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChjbnRfY3VyLCAmaSkpKQorCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGNudF9jdXIsICZpKSkpCiAJCWdvdG8gZXJyb3IwOwogCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CkBAIC0yMTUwLDUxICsyMjMzLDgzIEBACiAgKiBSZWFkIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAoZnJlZS9hbGxvYyBzZWN0aW9uKS4KICAqLwogaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX3JlYWRfYWdmKAotCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLwotCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KLQlpbnQJCWZsYWdzLAkJLyogWEZTX0FMTE9DX0ZMQUdfLi4uICovCi0JeGZzX2J1Zl90CSoqYnBwKQkJLyogYnVmZmVyIGZvciB0aGUgYWcgZnJlZWxpc3QgaGVhZGVyICovCit4ZnNfcmVhZF9hZ2YoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJaW50CQkJZmxhZ3MsCS8qIFhGU19CVUZfICovCisJc3RydWN0IHhmc19idWYJCSoqYnBwKQkvKiBidWZmZXIgZm9yIHRoZSBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KIHsKLQl4ZnNfYWdmX3QJKmFnZjsJCS8qIGFnIGZyZWVsaXN0IGhlYWRlciAqLworCXN0cnVjdCB4ZnNfYWdmCSphZ2Y7CQkvKiBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KIAlpbnQJCWFnZl9vazsJCS8qIHNldCBpZiBhZ2YgaXMgY29uc2lzdGVudCAqLwotCXhmc19idWZfdAkqYnA7CQkvKiByZXR1cm4gdmFsdWUgKi8KLQl4ZnNfcGVyYWdfdAkqcGFnOwkJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLwogCWludAkJZXJyb3I7CiAKIAlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOwogCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKAogCQkJbXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAogCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCi0JCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwKLQkJCShmbGFncyAmIFhGU19BTExPQ19GTEFHX1RSWUxPQ0spID8gWEZTX0JVRl9UUllMT0NLIDogMFUsCi0JCQkmYnApOworCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIGZsYWdzLCBicHApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCUFTU0VSVCghYnAgfHwgIVhGU19CVUZfR0VURVJST1IoYnApKTsKLQlpZiAoIWJwKSB7Ci0JCSpicHAgPSBOVUxMOworCWlmICghKmJwcCkKIAkJcmV0dXJuIDA7Ci0JfQorCisJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKCpicHApKTsKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRigqYnBwKTsKKwogCS8qCiAJICogVmFsaWRhdGUgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgYWdmIGJsb2NrLgogCSAqLwotCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAlhZ2Zfb2sgPQogCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9tYWdpY251bSkgPT0gWEZTX0FHRl9NQUdJQyAmJgogCQlYRlNfQUdGX0dPT0RfVkVSU0lPTihiZTMyX3RvX2NwdShhZ2YtPmFnZl92ZXJzaW9ubnVtKSkgJiYKIAkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfZnJlZWJsa3MpIDw9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xlbmd0aCkgJiYKIAkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxmaXJzdCkgPCBYRlNfQUdGTF9TSVpFKG1wKSAmJgogCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9mbGxhc3QpIDwgWEZTX0FHRkxfU0laRShtcCkgJiYKLQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfZmxjb3VudCkgPD0gWEZTX0FHRkxfU0laRShtcCk7CisJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpIDw9IFhGU19BR0ZMX1NJWkUobXApICYmCisJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKSA9PSBhZ25vOworCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsYXp5c2Jjb3VudCgmbXAtPm1fc2IpKQorCQlhZ2Zfb2sgPSBhZ2Zfb2sgJiYgYmUzMl90b19jcHUoYWdmLT5hZ2ZfYnRyZWVibGtzKSA8PQorCQkJCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKTsKIAlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnZl9vaywgbXAsIFhGU19FUlJUQUdfQUxMT0NfUkVBRF9BR0YsCiAJCQlYRlNfUkFORE9NX0FMTE9DX1JFQURfQUdGKSkpIHsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hbGxvY19yZWFkX2FnZiIsCiAJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgYWdmKTsKLQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCAqYnBwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KKworCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX0FHRiwgWEZTX0FHRl9SRUYpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKGZyZWUvYWxsb2Mgc2VjdGlvbikuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19yZWFkX2FnZigKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubywJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwlpbnQJCQlmbGFncywJLyogWEZTX0FMTE9DX0ZMQUdfLi4uICovCisJc3RydWN0IHhmc19idWYJCSoqYnBwKQkvKiBidWZmZXIgZm9yIHRoZSBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KK3sKKwlzdHJ1Y3QgeGZzX2FnZgkJKmFnZjsJCS8qIGFnIGZyZWVsaXN0IGhlYWRlciAqLworCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZzsJCS8qIHBlciBhbGxvY2F0aW9uIGdyb3VwIGRhdGEgKi8KKwlpbnQJCQllcnJvcjsKKworCUFTU0VSVChhZ25vICE9IE5VTExBR05VTUJFUik7CisKKwllcnJvciA9IHhmc19yZWFkX2FnZihtcCwgdHAsIGFnbm8sCisJCQkoZmxhZ3MgJiBYRlNfQUxMT0NfRkxBR19UUllMT0NLKSA/IFhGU19CVUZfVFJZTE9DSyA6IDAsCisJCQlicHApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmICghKmJwcCkKKwkJcmV0dXJuIDA7CisJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKCpicHApKTsKKworCWFnZiA9IFhGU19CVUZfVE9fQUdGKCpicHApOwogCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKIAlpZiAoIXBhZy0+cGFnZl9pbml0KSB7CiAJCXBhZy0+cGFnZl9mcmVlYmxrcyA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZyZWVibGtzKTsKQEAgLTIyMTMsNiArMjMyOCw3IEBACiAjaWZkZWYgREVCVUcKIAllbHNlIGlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKIAkJQVNTRVJUKHBhZy0+cGFnZl9mcmVlYmxrcyA9PSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9mcmVlYmxrcykpOworCQlBU1NFUlQocGFnLT5wYWdmX2J0cmVlYmxrcyA9PSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9idHJlZWJsa3MpKTsKIAkJQVNTRVJUKHBhZy0+cGFnZl9mbGNvdW50ID09IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2ZsY291bnQpKTsKIAkJQVNTRVJUKHBhZy0+cGFnZl9sb25nZXN0ID09IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpKTsKIAkJQVNTRVJUKHBhZy0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldID09CkBAIC0yMjIxLDggKzIzMzcsNiBAQAogCQkgICAgICAgYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSkpOwogCX0KICNlbmRpZgotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19BR0YsIFhGU19BR0ZfUkVGKTsKLQkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2MuaCBiL2ZzL3hmcy94ZnNfYWxsb2MuaAppbmRleCA1YWVjMTVkLi41ODgxNzI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jLmgKKysrIGIvZnMveGZzL3hmc19hbGxvYy5oCkBAIC0xMjEsNiArMTIxLDE5IEBACiAjZGVmaW5lCVhGU19BTExPQ19LVFJBQ0VfQlVTWVNFQVJDSAk2CiAjZW5kaWYKIAordm9pZAoreGZzX2FsbG9jX21hcmtfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCXhmc19hZ251bWJlcl90IGFnbm8sCisJCXhmc19hZ2Jsb2NrX3QgYm5vLAorCQl4ZnNfZXh0bGVuX3QgbGVuKTsKKwordm9pZAoreGZzX2FsbG9jX2NsZWFyX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQl4ZnNfYWdudW1iZXJfdCBhZywKKwkJaW50IGlkeCk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKIC8qCiAgKiBDb21wdXRlIGFuZCBmaWxsIGluIHZhbHVlIG9mIG1fYWdfbWF4bGV2ZWxzLgogICovCkBAIC0xOTYsMTggKzIwOSw0IEBACiAJeGZzX2ZzYmxvY2tfdAlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KIAl4ZnNfZXh0bGVuX3QJbGVuKTsJLyogbGVuZ3RoIG9mIGV4dGVudCAqLwogCi12b2lkCi14ZnNfYWxsb2NfbWFya19idXN5KHhmc190cmFuc190ICp0cCwKLQkJeGZzX2FnbnVtYmVyX3QgYWdubywKLQkJeGZzX2FnYmxvY2tfdCBibm8sCi0JCXhmc19leHRsZW5fdCBsZW4pOwotCi12b2lkCi14ZnNfYWxsb2NfY2xlYXJfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCi0JCXhmc19hZ251bWJlcl90IGFnLAotCQlpbnQgaWR4KTsKLQotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYJLyogX19YRlNfQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMgYi9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMKaW5kZXggM2NlMjY0NS4uNzMzY2I3NSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYwpAQCAtMzUsMjE3NyArMzUsNDY0IEBACiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgogI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgogI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAotLyoKLSAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KLSAqLwogCi1TVEFUSUMgdm9pZCB4ZnNfYWxsb2NfbG9nX2Jsb2NrKHhmc190cmFuc190ICosIHhmc19idWZfdCAqLCBpbnQpOwotU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19rZXlzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOwotU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19wdHJzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOwotU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19yZWNzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOwotU1RBVElDIGludCB4ZnNfYWxsb2NfbHNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2FsbG9jX25ld3Jvb3QoeGZzX2J0cmVlX2N1cl90ICosIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2FsbG9jX3JzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7Ci1TVEFUSUMgaW50IHhmc19hbGxvY19zcGxpdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCB4ZnNfYWdibG9ja190ICosCi0JCXhmc19hbGxvY19rZXlfdCAqLCB4ZnNfYnRyZWVfY3VyX3QgKiosIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2FsbG9jX3VwZGtleSh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2FsbG9jX2tleV90ICosIGludCk7Ci0KLS8qCi0gKiBJbnRlcm5hbCBmdW5jdGlvbnMuCi0gKi8KLQotLyoKLSAqIFNpbmdsZSBsZXZlbCBvZiB0aGUgeGZzX2FsbG9jX2RlbGV0ZSByZWNvcmQgZGVsZXRpb24gcm91dGluZS4KLSAqIERlbGV0ZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIvbGV2ZWwuCi0gKiBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIGl0cyBibG9jayB0aGVuIHJlYmFsYW5jZSB0aGUgdHJlZS4KLSAqIFJldHVybiAwIGZvciBlcnJvciwgMSBmb3IgZG9uZSwgMiB0byBnbyBvbiB0byB0aGUgbmV4dCBsZXZlbC4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2RlbHJlYygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCByZW1vdmluZyByZWNvcmQgZnJvbSAqLwotCWludAkJCSpzdGF0KQkvKiBmYWlsL2RvbmUvZ28tb24gKi8KK1NUQVRJQyBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqCit4ZnNfYWxsb2NidF9kdXBfY3Vyc29yKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIpCiB7Ci0JeGZzX2FnZl90CQkqYWdmOwkvKiBhbGxvY2F0aW9uIGdyb3VwIGZyZWVsaXN0IGhlYWRlciAqLwotCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgcmVjb3JkL2tleSBsaXZlcyBpbiAqLwotCXhmc19hZ2Jsb2NrX3QJCWJubzsJLyogYnRyZWUgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLwotCXhmc19hbGxvY19rZXlfdAkJa2V5OwkvKiBrcCBwb2ludHMgaGVyZSBpZiBibG9jayBpcyBsZXZlbCAwICovCi0JeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCBibG9jaydzIGJsb2NrIG51bWJlciAqLwotCXhmc19idWZfdAkJKmxicDsJLyogbGVmdCBibG9jaydzIGJ1ZmZlciBwb2ludGVyICovCi0JeGZzX2FsbG9jX2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYWxsb2Nfa2V5X3QJCSpsa3A9TlVMTDsJLyogbGVmdCBibG9jayBrZXkgcG9pbnRlciAqLwotCXhmc19hbGxvY19wdHJfdAkJKmxwcD1OVUxMOwkvKiBsZWZ0IGJsb2NrIGFkZHJlc3MgcG9pbnRlciAqLwotCWludAkJCWxyZWNzPTA7CS8qIG51bWJlciBvZiByZWNvcmRzIGluIGxlZnQgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfcmVjX3QJCSpscnA7CS8qIGxlZnQgYmxvY2sgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KLQlpbnQJCQlwdHI7CS8qIGluZGV4IGluIGJ0cmVlIGJsb2NrIGZvciB0aGlzIHJlYyAqLwotCXhmc19hZ2Jsb2NrX3QJCXJibm87CS8qIHJpZ2h0IGJsb2NrJ3MgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqcmJwOwkvKiByaWdodCBibG9jaydzIGJ1ZmZlciBwb2ludGVyICovCi0JeGZzX2FsbG9jX2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCBidHJlZSBibG9jayAqLwotCXhmc19hbGxvY19rZXlfdAkJKnJrcDsJLyogcmlnaHQgYmxvY2sga2V5IHBvaW50ZXIgKi8KLQl4ZnNfYWxsb2NfcHRyX3QJCSpycHA7CS8qIHJpZ2h0IGJsb2NrIGFkZHJlc3MgcG9pbnRlciAqLwotCWludAkJCXJyZWNzPTA7CS8qIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGJsb2NrICovCi0JaW50CQkJbnVtcmVjczsKLQl4ZnNfYWxsb2NfcmVjX3QJCSpycnA7CS8qIHJpZ2h0IGJsb2NrIHJlY29yZCBwb2ludGVyICovCi0JeGZzX2J0cmVlX2N1cl90CQkqdGN1cjsJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCXJldHVybiB4ZnNfYWxsb2NidF9pbml0X2N1cnNvcihjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmEuYWdicCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJCWN1ci0+YmNfYnRudW0pOworfQogCi0JLyoKLQkgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBiZWluZyBkZWxldGVkLCBjaGVjayBmb3Igbm90aGluZyB0aGVyZS4KLQkgKi8KLQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwotCWlmIChwdHIgPT0gMCkgeworU1RBVElDIHZvaWQKK3hmc19hbGxvY2J0X3NldF9yb290KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRyLAorCWludAkJCWluYykKK3sKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOworCXN0cnVjdCB4ZnNfYWdmCQkqYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJeGZzX2FnbnVtYmVyX3QJCXNlcW5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pOworCWludAkJCWJ0bnVtID0gY3VyLT5iY19idG51bTsKKworCUFTU0VSVChwdHItPnMgIT0gMCk7CisKKwlhZ2YtPmFnZl9yb290c1tidG51bV0gPSBwdHItPnM7CisJYmUzMl9hZGRfY3B1KCZhZ2YtPmFnZl9sZXZlbHNbYnRudW1dLCBpbmMpOworCWN1ci0+YmNfbXAtPm1fcGVyYWdbc2Vxbm9dLnBhZ2ZfbGV2ZWxzW2J0bnVtXSArPSBpbmM7CisKKwl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBhZ2JwLCBYRlNfQUdGX1JPT1RTIHwgWEZTX0FHRl9MRVZFTFMpOworfQorCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NidF9hbGxvY19ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnN0YXJ0LAorCXVuaW9uIHhmc19idHJlZV9wdHIJKm5ldywKKwlpbnQJCQlsZW5ndGgsCisJaW50CQkJKnN0YXQpCit7CisJaW50CQkJZXJyb3I7CisJeGZzX2FnYmxvY2tfdAkJYm5vOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrIGZyb20gdGhlIGZyZWVsaXN0LiBJZiB3ZSBjYW4ndCwgZ2l2ZSB1cC4gICovCisJZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCQkJICAgICAgICZibm8sIDEpOworCWlmIChlcnJvcikgeworCQlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmIChibm8gPT0gTlVMTEFHQkxPQ0spIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JLyoKLQkgKiBHZXQgdGhlIGJ1ZmZlciAmIGJsb2NrIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBvciBrZXkvcHRyLgotCSAqLwotCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCS8qCi0JICogRmFpbCBpZiB3ZSdyZSBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2suCi0JICovCi0JbnVtcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKLQlpZiAocHRyID4gbnVtcmVjcykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlYRlNfU1RBVFNfSU5DKHhzX2FidF9kZWxyZWMpOwotCS8qCi0JICogSXQncyBhIG5vbmxlYWYuICBFeGNpc2UgdGhlIGtleSBhbmQgcHRyIGJlaW5nIGRlbGV0ZWQsIGJ5Ci0JICogc2xpZGluZyB0aGUgZW50cmllcyBwYXN0IHRoZW0gZG93biBvbmUuCi0JICogTG9nIHRoZSBjaGFuZ2VkIGFyZWFzIG9mIHRoZSBibG9jay4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKLQkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IHB0cjsgaSA8IG51bXJlY3M7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUobHBwW2ldKSwgbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQlpZiAocHRyIDwgbnVtcmVjcykgewotCQkJbWVtbW92ZSgmbGtwW3B0ciAtIDFdLCAmbGtwW3B0cl0sCi0JCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCpsa3ApKTsKLQkJCW1lbW1vdmUoJmxwcFtwdHIgLSAxXSwgJmxwcFtwdHJdLAotCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqbHBwKSk7Ci0JCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7Ci0JCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBJdCdzIGEgbGVhZi4gIEV4Y2lzZSB0aGUgcmVjb3JkIGJlaW5nIGRlbGV0ZWQsIGJ5IHNsaWRpbmcgdGhlCi0JICogZW50cmllcyBwYXN0IGl0IGRvd24gb25lLiAgTG9nIHRoZSBjaGFuZ2VkIGFyZWFzIG9mIHRoZSBibG9jay4KLQkgKi8KLQllbHNlIHsKLQkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOwotCQlpZiAocHRyIDwgbnVtcmVjcykgewotCQkJbWVtbW92ZSgmbHJwW3B0ciAtIDFdLCAmbHJwW3B0cl0sCi0JCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCpscnApKTsKLQkJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKLQkJfQotCQkvKgotCQkgKiBJZiBpdCdzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGJsb2NrLCB3ZSdsbCBuZWVkIGEga2V5Ci0JCSAqIHN0cnVjdHVyZSB0byBwYXNzIHVwIHRvIHRoZSBuZXh0IGxldmVsICh1cGRrZXkpLgotCQkgKi8KLQkJaWYgKHB0ciA9PSAxKSB7Ci0JCQlrZXkuYXJfc3RhcnRibG9jayA9IGxycC0+YXJfc3RhcnRibG9jazsKLQkJCWtleS5hcl9ibG9ja2NvdW50ID0gbHJwLT5hcl9ibG9ja2NvdW50OwotCQkJbGtwID0gJmtleTsKLQkJfQotCX0KLQkvKgotCSAqIERlY3JlbWVudCBhbmQgbG9nIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmxvY2suCi0JICovCi0JbnVtcmVjcy0tOwotCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYobnVtcmVjcyk7Ci0JeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBicCwgWEZTX0JCX05VTVJFQ1MpOwotCS8qCi0JICogU2VlIGlmIHRoZSBsb25nZXN0IGZyZWUgZXh0ZW50IGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHdhcwotCSAqIGNoYW5nZWQgYnkgdGhpcyBvcGVyYXRpb24uICBUcnVlIGlmIGl0J3MgdGhlIGJ5LXNpemUgYnRyZWUsIGFuZAotCSAqIHRoaXMgaXMgdGhlIGxlYWYgbGV2ZWwsIGFuZCB0aGVyZSBpcyBubyByaWdodCBzaWJsaW5nIGJsb2NrLAotCSAqIGFuZCB0aGlzIHdhcyB0aGUgbGFzdCByZWNvcmQuCi0JICovCi0JYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7Ci0JbXAgPSBjdXItPmJjX21wOwogCi0JaWYgKGxldmVsID09IDAgJiYKLQkgICAgY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCi0JICAgIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0sgJiYKLQkgICAgcHRyID4gbnVtcmVjcykgewotCQlBU1NFUlQocHRyID09IG51bXJlY3MgKyAxKTsKLQkJLyoKLQkJICogVGhlcmUgYXJlIHN0aWxsIHJlY29yZHMgaW4gdGhlIGJsb2NrLiAgR3JhYiB0aGUgc2l6ZQotCQkgKiBmcm9tIHRoZSBsYXN0IG9uZS4KLQkJICovCi0JCWlmIChudW1yZWNzKSB7Ci0JCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIG51bXJlY3MsIGN1cik7Ci0JCQlhZ2YtPmFnZl9sb25nZXN0ID0gcnJwLT5hcl9ibG9ja2NvdW50OwotCQl9Ci0JCS8qCi0JCSAqIE5vIGZyZWUgZXh0ZW50cyBsZWZ0LgotCQkgKi8KLQkJZWxzZQotCQkJYWdmLT5hZ2ZfbG9uZ2VzdCA9IDA7Ci0JCW1wLT5tX3BlcmFnW2JlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKV0ucGFnZl9sb25nZXN0ID0KLQkJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpOwotCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAotCQkJWEZTX0FHRl9MT05HRVNUKTsKLQl9Ci0JLyoKLQkgKiBJcyB0aGlzIHRoZSByb290IGxldmVsPyAgSWYgc28sIHdlJ3JlIGFsbW9zdCBkb25lLgotCSAqLwotCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCS8qCi0JCSAqIElmIHRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwsCi0JCSAqIGFuZCB0aGVyZSdzIG9ubHkgb25lIGVudHJ5IGxlZnQsCi0JCSAqIGFuZCBpdCdzIE5PVCB0aGUgbGVhZiBsZXZlbCwKLQkJICogdGhlbiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGxldmVsLgotCQkgKi8KLQkJaWYgKG51bXJlY3MgPT0gMSAmJiBsZXZlbCA+IDApIHsKLQkJCS8qCi0JCQkgKiBscHAgaXMgc3RpbGwgc2V0IHRvIHRoZSBmaXJzdCBwb2ludGVyIGluIHRoZSBibG9jay4KLQkJCSAqIE1ha2UgaXQgdGhlIG5ldyByb290IG9mIHRoZSBidHJlZS4KLQkJCSAqLwotCQkJYm5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0pOwotCQkJYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0gPSAqbHBwOwotCQkJYmUzMl9hZGRfY3B1KCZhZ2YtPmFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0sIC0xKTsKLQkJCW1wLT5tX3BlcmFnW2JlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKV0ucGFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0tLTsKLQkJCS8qCi0JCQkgKiBQdXQgdGhpcyBidWZmZXIvYmxvY2sgb24gdGhlIGFnJ3MgZnJlZWxpc3QuCi0JCQkgKi8KLQkJCWVycm9yID0geGZzX2FsbG9jX3B1dF9mcmVlbGlzdChjdXItPmJjX3RwLAotCQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ2JwLCBOVUxMLCBibm8sIDEpOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCS8qCi0JCQkgKiBTaW5jZSBibG9ja3MgbW92ZSB0byB0aGUgZnJlZSBsaXN0IHdpdGhvdXQgdGhlCi0JCQkgKiBjb29yZGluYXRpb24gdXNlZCBpbiB4ZnNfYm1hcF9maW5pc2gsIHdlIGNhbid0IGFsbG93Ci0JCQkgKiBibG9jayB0byBiZSBhdmFpbGFibGUgZm9yIHJlYWxsb2NhdGlvbiBhbmQKLQkJCSAqIG5vbi10cmFuc2FjdGlvbiB3cml0aW5nICh1c2VyIGRhdGEpIHVudGlsIHdlIGtub3cKLQkJCSAqIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbW92ZWQgaXQgdG8gdGhlIGZyZWUgbGlzdAotCQkJICogaXMgcGVybWFuZW50bHkgb24gZGlzay4gV2UgdHJhY2sgdGhlIGJsb2NrcyBieQotCQkJICogZGVjbGFyaW5nIHRoZXNlIGJsb2NrcyBhcyAiYnVzeSI7IHRoZSBidXN5IGxpc3QgaXMKLQkJCSAqIG1haW50YWluZWQgb24gYSBwZXItYWcgYmFzaXMgYW5kIGVhY2ggdHJhbnNhY3Rpb24KLQkJCSAqIHJlY29yZHMgd2hpY2ggZW50cmllcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZQotCQkJICogaWNsb2cgY29tbWl0cyB0byBkaXNrLiBJZiBhIGJ1c3kgYmxvY2sgaXMKLQkJCSAqIGFsbG9jYXRlZCwgdGhlIGljbG9nIGlzIHB1c2hlZCB1cCB0byB0aGUgTFNOCi0JCQkgKiB0aGF0IGZyZWVkIHRoZSBibG9jay4KLQkJCSAqLwotCQkJeGZzX2FsbG9jX21hcmtfYnVzeShjdXItPmJjX3RwLAotCQkJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKSwgYm5vLCAxKTsKKwl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAxKTsKKwluZXctPnMgPSBjcHVfdG9fYmUzMihibm8pOwogCi0JCQl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAtMSk7Ci0JCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAotCQkJCVhGU19BR0ZfUk9PVFMgfCBYRlNfQUdGX0xFVkVMUyk7Ci0JCQkvKgotCQkJICogVXBkYXRlIHRoZSBjdXJzb3Igc28gdGhlcmUncyBvbmUgZmV3ZXIgbGV2ZWwuCi0JCQkgKi8KLQkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgTlVMTCk7Ci0JCQljdXItPmJjX25sZXZlbHMtLTsKLQkJfSBlbHNlIGlmIChsZXZlbCA+IDAgJiYKLQkJCSAgIChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBkZWxldGVkIHRoZSBsZWZ0bW9zdCBlbnRyeSBpbiB0aGUgYmxvY2ssIHVwZGF0ZSB0aGUKLQkgKiBrZXkgdmFsdWVzIGFib3ZlIHVzIGluIHRoZSB0cmVlLgotCSAqLwotCWlmIChwdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgbGtwLCBsZXZlbCArIDEpKSkKLQkJcmV0dXJuIGVycm9yOwotCS8qCi0JICogSWYgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbWFpbmluZyBpbiB0aGUgYmxvY2sgaXMgYXQgbGVhc3QKLQkgKiB0aGUgbWluaW11bSwgd2UncmUgZG9uZS4KLQkgKi8KLQlpZiAobnVtcmVjcyA+PSBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgewotCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gbW92ZSBzb21lIHJlY29yZHMgYXJvdW5kIHRvIGtlZXAgdGhlCi0JICogdHJlZSBiYWxhbmNlZC4gIExvb2sgYXQgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpYmxpbmcgYmxvY2tzIHRvCi0JICogc2VlIGlmIHdlIGNhbiByZS1iYWxhbmNlIGJ5IG1vdmluZyBvbmx5IG9uZSByZWNvcmQuCi0JICovCi0JcmJubyA9IGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7Ci0JbGJubyA9IGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKTsKLQlibm8gPSBOVUxMQUdCTE9DSzsKLQlBU1NFUlQocmJubyAhPSBOVUxMQUdCTE9DSyB8fCBsYm5vICE9IE5VTExBR0JMT0NLKTsKLQkvKgotCSAqIER1cGxpY2F0ZSB0aGUgY3Vyc29yIHNvIG91ciBidHJlZSBtYW5pcHVsYXRpb25zIGhlcmUgd29uJ3QKLQkgKiBkaXNydXB0IHRoZSBuZXh0IGxldmVsIHVwLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpCi0JCXJldHVybiBlcnJvcjsKLQkvKgotCSAqIElmIHRoZXJlJ3MgYSByaWdodCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQotCSAqIG91dCBvZiBpdC4KLQkgKi8KLQlpZiAocmJubyAhPSBOVUxMQUdCTE9DSykgewotCQkvKgotCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgbmV4dCBibG9jay4KLQkJICogQWN0dWFsbHkgYW55IGVudHJ5IGJ1dCB0aGUgZmlyc3Qgd291bGQgc3VmZmljZS4KLQkJICovCi0JCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCi0JCQlnb3RvIGVycm9yMDsKLQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOwotCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCS8qCi0JCSAqIEdyYWIgYSBwb2ludGVyIHRvIHRoZSBibG9jay4KLQkJICovCi0JCXJicCA9IHRjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlyaWdodCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socmJwKTsKLSNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCi0JCQlnb3RvIGVycm9yMDsKLSNlbmRpZgotCQkvKgotCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCi0JCSAqLwotCQlibm8gPSBiZTMyX3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYik7Ci0JCS8qCi0JCSAqIElmIHJpZ2h0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5Ci0JCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgbGVmdC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKLQkJICogb2YgcmlnaHQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCi0JCSAqLwotCQlpZiAoYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpIC0gMSA+PQotCQkgICAgIFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkKLQkJCQlnb3RvIGVycm9yMDsKLQkJCWlmIChpKSB7Ci0JCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA+PQotCQkJCSAgICAgICBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7Ci0JCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKLQkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCWlmIChsZXZlbCA+IDAgJiYKLQkJCQkgICAgKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLAotCQkJCQkgICAgJmkpKSkKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCSpzdGF0ID0gMTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgotCQkgKiBmdXR1cmUgcmVmZXJlbmNlLCBhbmQgZml4IHVwIHRoZSB0ZW1wIGN1cnNvciB0byBwb2ludAotCQkgKiB0byBvdXIgYmxvY2sgYWdhaW4gKGxhc3QgcmVjb3JkKS4KLQkJICovCi0JCXJyZWNzID0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOwotCQlpZiAobGJubyAhPSBOVUxMQUdCTE9DSykgewotCQkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkKLQkJCQlnb3RvIGVycm9yMDsKLQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJfQotCX0KLQkvKgotCSAqIElmIHRoZXJlJ3MgYSBsZWZ0IHNpYmxpbmcsIHNlZSBpZiBpdCdzIG9rIHRvIHNoaWZ0IGFuIGVudHJ5Ci0JICogb3V0IG9mIGl0LgotCSAqLwotCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7Ci0JCS8qCi0JCSAqIE1vdmUgdGhlIHRlbXAgY3Vyc29yIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKLQkJICogcHJldmlvdXMgYmxvY2suCi0JCSAqLwotCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKLQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkKLQkJCWdvdG8gZXJyb3IwOwotCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCXhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JCS8qCi0JCSAqIEdyYWIgYSBwb2ludGVyIHRvIHRoZSBibG9jay4KLQkJICovCi0JCWxicCA9IHRjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQkJZ290byBlcnJvcjA7Ci0jZW5kaWYKLQkJLyoKLQkJICogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLgotCQkgKi8KLQkJYm5vID0gYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpOwotCQkvKgotCQkgKiBJZiBsZWZ0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5Ci0JCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgcmlnaHQtc2hpZnRpbmcgYW4gZW50cnkgb3V0Ci0JCSAqIG9mIGxlZnQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCi0JCSAqLwotCQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLSAxID49Ci0JCSAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcnNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQotCQkJCWdvdG8gZXJyb3IwOwotCQkJaWYgKGkpIHsKLQkJCQlBU1NFUlQoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID49Ci0JCQkJICAgICAgIFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKTsKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLAotCQkJCQkJICAgICBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJaWYgKGxldmVsID09IDApCi0JCQkJCWN1ci0+YmNfcHRyc1swXSsrOwotCQkJCSpzdGF0ID0gMTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgotCQkgKiBmdXR1cmUgcmVmZXJlbmNlLgotCQkgKi8KLQkJbHJlY3MgPSBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKTsKLQl9Ci0JLyoKLQkgKiBEZWxldGUgdGhlIHRlbXAgY3Vyc29yLCB3ZSdyZSBkb25lIHdpdGggaXQuCi0JICovCi0JeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCS8qCi0JICogSWYgaGVyZSwgd2UgbmVlZCB0byBkbyBhIGpvaW4gdG8ga2VlcCB0aGUgdHJlZSBiYWxhbmNlZC4KLQkgKi8KLQlBU1NFUlQoYm5vICE9IE5VTExBR0JMT0NLKTsKLQkvKgotCSAqIFNlZSBpZiB3ZSBjYW4gam9pbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yIGJsb2NrLgotCSAqLwotCWlmIChsYm5vICE9IE5VTExBR0JMT0NLICYmCi0JICAgIGxyZWNzICsgbnVtcmVjcyA8PSBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewotCQkvKgotCQkgKiBTZXQgInJpZ2h0IiB0byBiZSB0aGUgc3RhcnRpbmcgYmxvY2ssCi0JCSAqICJsZWZ0IiB0byBiZSB0aGUgbGVmdCBuZWlnaGJvci4KLQkJICovCi0JCXJibm8gPSBibm87Ci0JCXJpZ2h0ID0gYmxvY2s7Ci0JCXJyZWNzID0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOwotCQlyYnAgPSBicDsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCi0JCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgbGJubywgMCwgJmxicCwKLQkJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7Ci0JCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKgotCSAqIElmIHRoYXQgd29uJ3Qgd29yaywgc2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLgotCSAqLwotCWVsc2UgaWYgKHJibm8gIT0gTlVMTEFHQkxPQ0sgJiYKLQkJIHJyZWNzICsgbnVtcmVjcyA8PSBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewotCQkvKgotCQkgKiBTZXQgImxlZnQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKLQkJICogInJpZ2h0IiB0byBiZSB0aGUgcmlnaHQgbmVpZ2hib3IuCi0JCSAqLwotCQlsYm5vID0gYm5vOwotCQlsZWZ0ID0gYmxvY2s7Ci0JCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JCWxicCA9IGJwOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCByYm5vLCAwLCAmcmJwLAotCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7Ci0JCXJyZWNzID0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCS8qCi0JICogT3RoZXJ3aXNlLCB3ZSBjYW4ndCBmaXggdGhlIGltYmFsYW5jZS4KLQkgKiBKdXN0IHJldHVybi4gIFRoaXMgaXMgcHJvYmFibHkgYSBsb2dpYyBlcnJvciwgYnV0IGl0J3Mgbm90IGZhdGFsLgotCSAqLwotCWVsc2UgewotCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBXZSdyZSBub3cgZ29pbmcgdG8gam9pbiAibGVmdCIgYW5kICJyaWdodCIgYnkgbW92aW5nIGFsbCB0aGUgc3R1ZmYKLQkgKiBpbiAicmlnaHQiIHRvICJsZWZ0IiBhbmQgZGVsZXRpbmcgInJpZ2h0Ii4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCS8qCi0JCSAqIEl0J3MgYSBub24tbGVhZi4gIE1vdmUga2V5cyBhbmQgcG9pbnRlcnMuCi0JCSAqLwotCQlsa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobGVmdCwgbHJlY3MgKyAxLCBjdXIpOwotCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgbHJlY3MgKyAxLCBjdXIpOwotCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSAwOyBpIDwgcnJlY3M7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocnBwW2ldKSwgbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQltZW1jcHkobGtwLCBya3AsIHJyZWNzICogc2l6ZW9mKCpsa3ApKTsKLQkJbWVtY3B5KGxwcCwgcnBwLCBycmVjcyAqIHNpemVvZigqbHBwKSk7Ci0JCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgbGJwLCBscmVjcyArIDEsIGxyZWNzICsgcnJlY3MpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEl0J3MgYSBsZWFmLiAgTW92ZSByZWNvcmRzLgotCQkgKi8KLQkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIGxyZWNzICsgMSwgY3VyKTsKLQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1jcHkobHJwLCBycnAsIHJyZWNzICogc2l6ZW9mKCpscnApKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgbGJwLCBscmVjcyArIDEsIGxyZWNzICsgcnJlY3MpOwotCX0KLQkvKgotCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLCBzZXQgdGhlIGJ1ZmZlciBpbiB0aGUKLQkgKiBjdXJzb3IgdG8gdGhlIGxlZnQgYmxvY2ssIGFuZCBmaXggdXAgdGhlIGluZGV4LgotCSAqLwotCWlmIChicCAhPSBsYnApIHsKLQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBsYnApOwotCQljdXItPmJjX3B0cnNbbGV2ZWxdICs9IGxyZWNzOwotCX0KLQkvKgotCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSByaWdodCBuZWlnaGJvciBhbmQgdGhlcmUncyBhIGxldmVsIGFib3ZlCi0JICogdXMsIGluY3JlbWVudCB0aGUgY3Vyc29yIGF0IHRoYXQgbGV2ZWwuCi0JICovCi0JZWxzZSBpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzICYmCi0JCSAoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGN1ciwgbGV2ZWwgKyAxLCAmaSkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBGaXggdXAgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2suCi0JICovCi0JbHJlY3MgKz0gcnJlY3M7Ci0JbGVmdC0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KGxyZWNzKTsKLQkvKgotCSAqIEZpeCB1cCB0aGUgcmlnaHQgYmxvY2sgcG9pbnRlciBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLCBhbmQgbG9nIGl0LgotCSAqLwotCWxlZnQtPmJiX3JpZ2h0c2liID0gcmlnaHQtPmJiX3JpZ2h0c2liOwotCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7Ci0JLyoKLQkgKiBJZiB0aGVyZSBpcyBhIHJpZ2h0IHNpYmxpbmcgbm93LCBtYWtlIGl0IHBvaW50IHRvIHRoZQotCSAqIHJlbWFpbmluZyBibG9jay4KLQkgKi8KLQlpZiAoYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpICE9IE5VTExBR0JMT0NLKSB7Ci0JCXhmc19hbGxvY19ibG9ja190CSpycmJsb2NrOwotCQl4ZnNfYnVmX3QJCSpycmJwOworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQogCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAotCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSwgMCwKLQkJCQkmcnJicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQotCQkJcmV0dXJuIGVycm9yOwotCQlycmJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhycmJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQotCQkJcmV0dXJuIGVycm9yOwotCQlycmJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIobGJubyk7Ci0JCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOwotCX0KLQkvKgotCSAqIEZyZWUgdGhlIGRlbGV0aW5nIGJsb2NrIGJ5IHB1dHRpbmcgaXQgb24gdGhlIGZyZWVsaXN0LgotCSAqLwotCWVycm9yID0geGZzX2FsbG9jX3B1dF9mcmVlbGlzdChjdXItPmJjX3RwLAotCQkJCQkgY3VyLT5iY19wcml2YXRlLmEuYWdicCwgTlVMTCwgcmJubywgMSk7CitTVEFUSUMgaW50Cit4ZnNfYWxsb2NidF9mcmVlX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOworCXN0cnVjdCB4ZnNfYWdmCQkqYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJeGZzX2FnYmxvY2tfdAkJYm5vOworCWludAkJCWVycm9yOworCisJYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKGN1ci0+YmNfbXAsIFhGU19CVUZfQUREUihicCkpOworCWVycm9yID0geGZzX2FsbG9jX3B1dF9mcmVlbGlzdChjdXItPmJjX3RwLCBhZ2JwLCBOVUxMLCBibm8sIDEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOworCiAJLyoKLQkgKiBTaW5jZSBibG9ja3MgbW92ZSB0byB0aGUgZnJlZSBsaXN0IHdpdGhvdXQgdGhlIGNvb3JkaW5hdGlvbgotCSAqIHVzZWQgaW4geGZzX2JtYXBfZmluaXNoLCB3ZSBjYW4ndCBhbGxvdyBibG9jayB0byBiZSBhdmFpbGFibGUKLQkgKiBmb3IgcmVhbGxvY2F0aW9uIGFuZCBub24tdHJhbnNhY3Rpb24gd3JpdGluZyAodXNlciBkYXRhKQotCSAqIHVudGlsIHdlIGtub3cgdGhhdCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBtb3ZlZCBpdCB0byB0aGUgZnJlZQotCSAqIGxpc3QgaXMgcGVybWFuZW50bHkgb24gZGlzay4gV2UgdHJhY2sgdGhlIGJsb2NrcyBieSBkZWNsYXJpbmcKLQkgKiB0aGVzZSBibG9ja3MgYXMgImJ1c3kiOyB0aGUgYnVzeSBsaXN0IGlzIG1haW50YWluZWQgb24gYQotCSAqIHBlci1hZyBiYXNpcyBhbmQgZWFjaCB0cmFuc2FjdGlvbiByZWNvcmRzIHdoaWNoIGVudHJpZXMKLQkgKiBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZSBpY2xvZyBjb21taXRzIHRvIGRpc2suIElmIGEKLQkgKiBidXN5IGJsb2NrIGlzIGFsbG9jYXRlZCwgdGhlIGljbG9nIGlzIHB1c2hlZCB1cCB0byB0aGUKKwkgKiBTaW5jZSBibG9ja3MgbW92ZSB0byB0aGUgZnJlZSBsaXN0IHdpdGhvdXQgdGhlIGNvb3JkaW5hdGlvbiB1c2VkIGluCisJICogeGZzX2JtYXBfZmluaXNoLCB3ZSBjYW4ndCBhbGxvdyBibG9jayB0byBiZSBhdmFpbGFibGUgZm9yCisJICogcmVhbGxvY2F0aW9uIGFuZCBub24tdHJhbnNhY3Rpb24gd3JpdGluZyAodXNlciBkYXRhKSB1bnRpbCB3ZSBrbm93CisJICogdGhhdCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBtb3ZlZCBpdCB0byB0aGUgZnJlZSBsaXN0IGlzIHBlcm1hbmVudGx5CisJICogb24gZGlzay4gV2UgdHJhY2sgdGhlIGJsb2NrcyBieSBkZWNsYXJpbmcgdGhlc2UgYmxvY2tzIGFzICJidXN5IjsKKwkgKiB0aGUgYnVzeSBsaXN0IGlzIG1haW50YWluZWQgb24gYSBwZXItYWcgYmFzaXMgYW5kIGVhY2ggdHJhbnNhY3Rpb24KKwkgKiByZWNvcmRzIHdoaWNoIGVudHJpZXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgaWNsb2cgY29tbWl0cyB0bworCSAqIGRpc2suIElmIGEgYnVzeSBibG9jayBpcyBhbGxvY2F0ZWQsIHRoZSBpY2xvZyBpcyBwdXNoZWQgdXAgdG8gdGhlCiAJICogTFNOIHRoYXQgZnJlZWQgdGhlIGJsb2NrLgogCSAqLwogCXhmc19hbGxvY19tYXJrX2J1c3koY3VyLT5iY190cCwgYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pLCBibm8sIDEpOwogCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIC0xKTsKLQotCS8qCi0JICogQWRqdXN0IHRoZSBjdXJyZW50IGxldmVsJ3MgY3Vyc29yIHNvIHRoYXQgd2UncmUgbGVmdCByZWZlcnJpbmcKLQkgKiB0byB0aGUgcmlnaHQgbm9kZSwgYWZ0ZXIgd2UncmUgZG9uZS4KLQkgKiBJZiB0aGlzIGxlYXZlcyB0aGUgcHRyIHZhbHVlIDAgb3VyIGNhbGxlciB3aWxsIGZpeCBpdCB1cC4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKQotCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07Ci0JLyoKLQkgKiBSZXR1cm4gdmFsdWUgbWVhbnMgdGhlIG5leHQgbGV2ZWwgdXAgaGFzIHNvbWV0aGluZyB0byBkby4KLQkgKi8KLQkqc3RhdCA9IDI7CiAJcmV0dXJuIDA7Ci0KLWVycm9yMDoKLQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfRVJST1IpOwotCXJldHVybiBlcnJvcjsKIH0KIAogLyoKLSAqIEluc2VydCBvbmUgcmVjb3JkL2xldmVsLiAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIKLSAqIGFsbG93aW5nIHRoZSBuZXh0IGxldmVsIHVwIHRvIHByb2NlZWQgaWYgbmVjZXNzYXJ5LgorICogVXBkYXRlIHRoZSBsb25nZXN0IGV4dGVudCBpbiB0aGUgQUdGCiAgKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY19pbnNyZWMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gaW5zZXJ0IHJlY29yZCBhdCAqLwotCXhmc19hZ2Jsb2NrX3QJCSpibm9wLAkvKiBpL286IGJsb2NrIG51bWJlciBpbnNlcnRlZCAqLwotCXhmc19hbGxvY19yZWNfdAkJKnJlY3AsCS8qIGkvbzogcmVjb3JkIGRhdGEgaW5zZXJ0ZWQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogb3V0cHV0OiBuZXcgY3Vyc29yIHJlcGxhY2luZyBjdXIgKi8KLQlpbnQJCQkqc3RhdCkJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NidF91cGRhdGVfbGFzdHJlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYywKKwlpbnQJCQlwdHIsCisJaW50CQkJcmVhc29uKQogewotCXhmc19hZ2ZfdAkJKmFnZjsJLyogYWxsb2NhdGlvbiBncm91cCBmcmVlbGlzdCBoZWFkZXIgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHJlY29yZC9rZXkgbGl2ZXMgaW4gKi8KLQl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCi0JeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBiZWluZyBpbnNlcnRlZCAqLwotCXhmc19hbGxvY19rZXlfdAkJKmtwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGtleXMgKi8KLQl4ZnNfYWdibG9ja190CQluYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrICovCi0JeGZzX2J0cmVlX2N1cl90CQkqbmN1cjsJLyogbmV3IGN1cnNvciB0byBiZSB1c2VkIGF0IG5leHQgbHZsICovCi0JeGZzX2FsbG9jX2tleV90CQlua2V5OwkvKiBuZXcga2V5IHZhbHVlLCBmcm9tIHNwbGl0ICovCi0JeGZzX2FsbG9jX3JlY190CQlucmVjOwkvKiBuZXcgcmVjb3JkIHZhbHVlLCBmb3IgY2FsbGVyICovCisJc3RydWN0IHhmc19hZ2YJCSphZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwl4ZnNfYWdudW1iZXJfdAkJc2Vxbm8gPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyk7CisJX19iZTMyCQkJbGVuOwogCWludAkJCW51bXJlY3M7Ci0JaW50CQkJb3B0cjsJLyogb2xkIHB0ciB2YWx1ZSAqLwotCXhmc19hbGxvY19wdHJfdAkJKnBwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGFkZHJlc3NlcyAqLwotCWludAkJCXB0cjsJLyogaW5kZXggaW4gYnRyZWUgYmxvY2sgZm9yIHRoaXMgcmVjICovCi0JeGZzX2FsbG9jX3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gYnRyZWUgcmVjb3JkcyAqLwogCi0JQVNTRVJUKGJlMzJfdG9fY3B1KHJlY3AtPmFyX2Jsb2NrY291bnQpID4gMCk7CisJQVNTRVJUKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0NOVCk7CiAKLQkvKgotCSAqIEdDQyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIChhcmd1YWJseSBjb21wbGV4KSBjb250cm9sIGZsb3cgaW4KLQkgKiB0aGlzIGZ1bmN0aW9uIGFuZCBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCBzdHJ1Y3R1cmUgZmllbGRzCi0JICogd2l0aG91dCB0aGlzLgotCSAqLwotCW1lbXNldCgmbnJlYywgMCwgc2l6ZW9mKG5yZWMpKTsKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgTEFTVFJFQ19VUERBVEU6CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgbGVhZiBibG9jayBhbmQgaXQncyB0aGUgbGFzdCByZWNvcmQsCisJCSAqIHRoZW4gdXBkYXRlIHRoZSBzaXplIG9mIHRoZSBsb25nZXN0IGV4dGVudCBpbiB0aGUgQUcuCisJCSAqLworCQlpZiAocHRyICE9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jaykpCisJCQlyZXR1cm47CisJCWxlbiA9IHJlYy0+YWxsb2MuYXJfYmxvY2tjb3VudDsKKwkJYnJlYWs7CisJY2FzZSBMQVNUUkVDX0lOU1JFQzoKKwkJaWYgKGJlMzJfdG9fY3B1KHJlYy0+YWxsb2MuYXJfYmxvY2tjb3VudCkgPD0KKwkJICAgIGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpKQorCQkJcmV0dXJuOworCQlsZW4gPSByZWMtPmFsbG9jLmFyX2Jsb2NrY291bnQ7CisJCWJyZWFrOworCWNhc2UgTEFTVFJFQ19ERUxSRUM6CisJCW51bXJlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spOworCQlpZiAocHRyIDw9IG51bXJlY3MpCisJCQlyZXR1cm47CisJCUFTU0VSVChwdHIgPT0gbnVtcmVjcyArIDEpOwogCi0JLyoKLQkgKiBJZiB3ZSBtYWRlIGl0IHRvIHRoZSByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrCi0JICogYW5kIHdlJ3JlIGRvbmUuCi0JICovCi0JaWYgKGxldmVsID49IGN1ci0+YmNfbmxldmVscykgewotCQlYRlNfU1RBVFNfSU5DKHhzX2FidF9pbnNyZWMpOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX25ld3Jvb3QoY3VyLCAmaSkpKQotCQkJcmV0dXJuIGVycm9yOwotCQkqYm5vcCA9IE5VTExBR0JMT0NLOwotCQkqc3RhdCA9IGk7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE1ha2UgYSBrZXkgb3V0IG9mIHRoZSByZWNvcmQgZGF0YSB0byBiZSBpbnNlcnRlZCwgYW5kIHNhdmUgaXQuCi0JICovCi0Ja2V5LmFyX3N0YXJ0YmxvY2sgPSByZWNwLT5hcl9zdGFydGJsb2NrOwotCWtleS5hcl9ibG9ja2NvdW50ID0gcmVjcC0+YXJfYmxvY2tjb3VudDsKLQlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKLQkvKgotCSAqIElmIHdlJ3JlIG9mZiB0aGUgbGVmdCBlZGdlLCByZXR1cm4gZmFpbHVyZS4KLQkgKi8KLQlpZiAocHRyID09IDApIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JWEZTX1NUQVRTX0lOQyh4c19hYnRfaW5zcmVjKTsKLQkvKgotCSAqIEdldCBwb2ludGVycyB0byB0aGUgYnRyZWUgYnVmZmVyIGFuZCBibG9jay4KLQkgKi8KLQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKLQludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCi0JCXJldHVybiBlcnJvcjsKLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIG5ldyBlbnRyeSBpcyBiZWluZyBpbnNlcnRlZCBpbiB0aGUgcmlnaHQgcGxhY2UuCi0JICovCi0JaWYgKHB0ciA8PSBudW1yZWNzKSB7Ci0JCWlmIChsZXZlbCA9PSAwKSB7Ci0JCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgcHRyLCBjdXIpOwotCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCByZWNwLCBycCk7CisJCWlmIChudW1yZWNzKSB7CisJCQl4ZnNfYWxsb2NfcmVjX3QgKnJycDsKKworCQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGN1ci0+YmNfbXAsIGJsb2NrLCBudW1yZWNzKTsKKwkJCWxlbiA9IHJycC0+YXJfYmxvY2tjb3VudDsKIAkJfSBlbHNlIHsKLQkJCWtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sICZrZXksIGtwKTsKKwkJCWxlbiA9IDA7CiAJCX0KLQl9Ci0jZW5kaWYKLQluYm5vID0gTlVMTEFHQkxPQ0s7Ci0JbmN1ciA9IE5VTEw7Ci0JLyoKLQkgKiBJZiB0aGUgYmxvY2sgaXMgZnVsbCwgd2UgY2FuJ3QgaW5zZXJ0IHRoZSBuZXcgZW50cnkgdW50aWwgd2UKLQkgKiBtYWtlIHRoZSBibG9jayB1bi1mdWxsLgotCSAqLwotCWlmIChudW1yZWNzID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7Ci0JCS8qCi0JCSAqIEZpcnN0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLgotCQkgKi8KLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19yc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJaWYgKGkpIHsKLQkJCS8qIG5vdGhpbmcgKi8KLQkJfQotCQkvKgotCQkgKiBOZXh0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIGxlZnQgbmVpZ2hib3IuCi0JCSAqLwotCQllbHNlIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbHNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotCQkJaWYgKGkpCi0JCQkJb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIE5leHQsIHRyeSBzcGxpdHRpbmcgdGhlIGN1cnJlbnQgYmxvY2sgaW4KLQkJCQkgKiBoYWxmLiBJZiB0aGlzIHdvcmtzIHdlIGhhdmUgdG8gcmUtc2V0IG91cgotCQkJCSAqIHZhcmlhYmxlcyBiZWNhdXNlIHdlIGNvdWxkIGJlIGluIGEKLQkJCQkgKiBkaWZmZXJlbnQgYmxvY2sgbm93LgotCQkJCSAqLwotCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2Nfc3BsaXQoY3VyLCBsZXZlbCwgJm5ibm8sCi0JCQkJCQkmbmtleSwgJm5jdXIsICZpKSkpCi0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQlpZiAoaSkgewotCQkJCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JCQkJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7Ci0jaWZkZWYgREVCVUcKLQkJCQkJaWYgKChlcnJvciA9Ci0JCQkJCQl4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwKLQkJCQkJCQlibG9jaywgbGV2ZWwsIGJwKSkpCi0JCQkJCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkJCQkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKLQkJCQkJbnJlYy5hcl9zdGFydGJsb2NrID0gbmtleS5hcl9zdGFydGJsb2NrOwotCQkJCQlucmVjLmFyX2Jsb2NrY291bnQgPSBua2V5LmFyX2Jsb2NrY291bnQ7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogT3RoZXJ3aXNlIHRoZSBpbnNlcnQgZmFpbHMuCi0JCQkJICovCi0JCQkJZWxzZSB7Ci0JCQkJCSpzdGF0ID0gMDsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qCi0JICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlJ3Mgcm9vbSBmb3Igb3VyIG5ldyBlbnRyeSBpbiB0aGUgYmxvY2sKLQkgKiB3ZSdyZSBwb2ludGluZyBhdC4KLQkgKi8KLQludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotCWlmIChsZXZlbCA+IDApIHsKLQkJLyoKLQkJICogSXQncyBhIG5vbi1sZWFmIGVudHJ5LiAgTWFrZSBhIGhvbGUgZm9yIHRoZSBuZXcgZGF0YQotCQkgKiBpbiB0aGUga2V5IGFuZCBwdHIgcmVnaW9ucyBvZiB0aGUgYmxvY2suCi0JCSAqLwotCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKLQkJcHAgPSBYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gbnVtcmVjczsgaSA+PSBwdHI7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocHBbaSAtIDFdKSwgbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOwotCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsICpibm9wLCBsZXZlbCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCS8qCi0JCSAqIE5vdyBzdHVmZiB0aGUgbmV3IGRhdGEgaW4sIGJ1bXAgbnVtcmVjcyBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KLQkJICovCi0JCWtwW3B0ciAtIDFdID0ga2V5OwotCQlwcFtwdHIgLSAxXSA9IGNwdV90b19iZTMyKCpibm9wKTsKLQkJbnVtcmVjcysrOwotCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KG51bXJlY3MpOwotCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKHB0ciA8IG51bXJlY3MpCi0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIGtwICsgcHRyIC0gMSwKLQkJCQlrcCArIHB0cik7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJdCdzIGEgbGVhZiBlbnRyeS4gIE1ha2UgYSBob2xlIGZvciB0aGUgbmV3IHJlY29yZC4KLQkJICovCi0JCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOwotCQltZW1tb3ZlKCZycFtwdHJdLCAmcnBbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpycCkpOwotCQkvKgotCQkgKiBOb3cgc3R1ZmYgdGhlIG5ldyByZWNvcmQgaW4sIGJ1bXAgbnVtcmVjcwotCQkgKiBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KLQkJICovCi0JCXJwW3B0ciAtIDFdID0gKnJlY3A7Ci0JCW51bXJlY3MrKzsKLQkJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKHB0ciA8IG51bXJlY3MpCi0JCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJwICsgcHRyIC0gMSwKLQkJCQlycCArIHB0cik7Ci0jZW5kaWYKLQl9Ci0JLyoKLQkgKiBMb2cgdGhlIG5ldyBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgYnRyZWUgaGVhZGVyLgotCSAqLwotCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgYnAsIFhGU19CQl9OVU1SRUNTKTsKLQkvKgotCSAqIElmIHdlIGluc2VydGVkIGF0IHRoZSBzdGFydCBvZiBhIGJsb2NrLCB1cGRhdGUgdGhlIHBhcmVudHMnIGtleXMuCi0JICovCi0JaWYgKG9wdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgJmtleSwgbGV2ZWwgKyAxKSkpCi0JCXJldHVybiBlcnJvcjsKLQkvKgotCSAqIExvb2sgdG8gc2VlIGlmIHRoZSBsb25nZXN0IGV4dGVudCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cAotCSAqIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCi0JICovCiAKLQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQlpZiAobGV2ZWwgPT0gMCAmJgotCSAgICBjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9DTlQgJiYKLQkgICAgYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSyAmJgotCSAgICBiZTMyX3RvX2NwdShyZWNwLT5hcl9ibG9ja2NvdW50KSA+IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xvbmdlc3QpKSB7Ci0JCS8qCi0JCSAqIElmIHRoaXMgaXMgYSBsZWFmIGluIHRoZSBieS1zaXplIGJ0cmVlIGFuZCB0aGVyZQotCQkgKiBpcyBubyByaWdodCBzaWJsaW5nIGJsb2NrIGFuZCB0aGlzIGJsb2NrIGlzIGJpZ2dlcgotCQkgKiB0aGFuIHRoZSBwcmV2aW91cyBsb25nZXN0IGJsb2NrLCB1cGRhdGUgaXQuCi0JCSAqLwotCQlhZ2YtPmFnZl9sb25nZXN0ID0gcmVjcC0+YXJfYmxvY2tjb3VudDsKLQkJY3VyLT5iY19tcC0+bV9wZXJhZ1tiZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyldLnBhZ2ZfbG9uZ2VzdAotCQkJPSBiZTMyX3RvX2NwdShyZWNwLT5hcl9ibG9ja2NvdW50KTsKLQkJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKLQkJCVhGU19BR0ZfTE9OR0VTVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuOwogCX0KLQkvKgotCSAqIFJldHVybiB0aGUgbmV3IGJsb2NrIG51bWJlciwgaWYgYW55LgotCSAqIElmIHRoZXJlIGlzIG9uZSwgZ2l2ZSBiYWNrIGEgcmVjb3JkIHZhbHVlIGFuZCBhIGN1cnNvciB0b28uCi0JICovCi0JKmJub3AgPSBuYm5vOwotCWlmIChuYm5vICE9IE5VTExBR0JMT0NLKSB7Ci0JCSpyZWNwID0gbnJlYzsKLQkJKmN1cnAgPSBuY3VyOwotCX0KLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7CisKKwlhZ2YtPmFnZl9sb25nZXN0ID0gbGVuOworCWN1ci0+YmNfbXAtPm1fcGVyYWdbc2Vxbm9dLnBhZ2ZfbG9uZ2VzdCA9IGJlMzJfdG9fY3B1KGxlbik7CisJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwgWEZTX0FHRl9MT05HRVNUKTsKIH0KIAotLyoKLSAqIExvZyBoZWFkZXIgZmllbGRzIGZyb20gYSBidHJlZSBibG9jay4KLSAqLworU1RBVElDIGludAoreGZzX2FsbG9jYnRfZ2V0X21pbnJlY3MoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlpbnQJCQlsZXZlbCkKK3sKKwlyZXR1cm4gY3VyLT5iY19tcC0+bV9hbGxvY19tbnJbbGV2ZWwgIT0gMF07Cit9CisKK1NUQVRJQyBpbnQKK3hmc19hbGxvY2J0X2dldF9tYXhyZWNzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwpCit7CisJcmV0dXJuIGN1ci0+YmNfbXAtPm1fYWxsb2NfbXhyW2xldmVsICE9IDBdOworfQorCiBTVEFUSUMgdm9pZAoteGZzX2FsbG9jX2xvZ19ibG9jaygKLQl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJZmllbGRzKQkvKiBtYXNrIG9mIGZpZWxkczogWEZTX0JCXy4uLiAqLworeGZzX2FsbG9jYnRfaW5pdF9rZXlfZnJvbV9yZWMoCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYykKIHsKLQlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCi0JaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KLQlzdGF0aWMgY29uc3Qgc2hvcnQJb2Zmc2V0c1tdID0gewkvKiB0YWJsZSBvZiBvZmZzZXRzICovCi0JCW9mZnNldG9mKHhmc19hbGxvY19ibG9ja190LCBiYl9tYWdpYyksCi0JCW9mZnNldG9mKHhmc19hbGxvY19ibG9ja190LCBiYl9sZXZlbCksCi0JCW9mZnNldG9mKHhmc19hbGxvY19ibG9ja190LCBiYl9udW1yZWNzKSwKLQkJb2Zmc2V0b2YoeGZzX2FsbG9jX2Jsb2NrX3QsIGJiX2xlZnRzaWIpLAotCQlvZmZzZXRvZih4ZnNfYWxsb2NfYmxvY2tfdCwgYmJfcmlnaHRzaWIpLAotCQlzaXplb2YoeGZzX2FsbG9jX2Jsb2NrX3QpCi0JfTsKKwlBU1NFUlQocmVjLT5hbGxvYy5hcl9zdGFydGJsb2NrICE9IDApOwogCi0JeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQkJfTlVNX0JJVFMsICZmaXJzdCwgJmxhc3QpOwotCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworCWtleS0+YWxsb2MuYXJfc3RhcnRibG9jayA9IHJlYy0+YWxsb2MuYXJfc3RhcnRibG9jazsKKwlrZXktPmFsbG9jLmFyX2Jsb2NrY291bnQgPSByZWMtPmFsbG9jLmFyX2Jsb2NrY291bnQ7CiB9CiAKLS8qCi0gKiBMb2cga2V5cyBmcm9tIGEgYnRyZWUgYmxvY2sgKG5vbmxlYWYpLgotICovCiBTVEFUSUMgdm9pZAoteGZzX2FsbG9jX2xvZ19rZXlzKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJa2ZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCBrZXkgdG8gbG9nICovCi0JaW50CQkJa2xhc3QpCS8qIGluZGV4IG9mIGxhc3Qga2V5IHRvIGxvZyAqLworeGZzX2FsbG9jYnRfaW5pdF9yZWNfZnJvbV9rZXkoCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYykKIHsKLQl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCi0JaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCXhmc19hbGxvY19rZXlfdAkJKmtwOwkvKiBrZXkgcG9pbnRlciBpbiBidHJlZSBibG9jayAqLwotCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJQVNTRVJUKGtleS0+YWxsb2MuYXJfc3RhcnRibG9jayAhPSAwKTsKIAotCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7Ci0Ja3AgPSBYRlNfQUxMT0NfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0JZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJmtwW2tmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKLQlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkma3Bba2xhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7CisJcmVjLT5hbGxvYy5hcl9zdGFydGJsb2NrID0ga2V5LT5hbGxvYy5hcl9zdGFydGJsb2NrOworCXJlYy0+YWxsb2MuYXJfYmxvY2tjb3VudCA9IGtleS0+YWxsb2MuYXJfYmxvY2tjb3VudDsKIH0KIAotLyoKLSAqIExvZyBibG9jayBwb2ludGVyIGZpZWxkcyBmcm9tIGEgYnRyZWUgYmxvY2sgKG5vbmxlYWYpLgotICovCiBTVEFUSUMgdm9pZAoteGZzX2FsbG9jX2xvZ19wdHJzKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJcGZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCBwb2ludGVyIHRvIGxvZyAqLwotCWludAkJCXBsYXN0KQkvKiBpbmRleCBvZiBsYXN0IHBvaW50ZXIgdG8gbG9nICovCit4ZnNfYWxsb2NidF9pbml0X3JlY19mcm9tX2N1cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYykKIHsKLQl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCi0JaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCi0JeGZzX2FsbG9jX3B0cl90CQkqcHA7CS8qIGJsb2NrLXBvaW50ZXIgcG9pbnRlciBpbiBidHJlZSBibGsgKi8KKwlBU1NFUlQoY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrICE9IDApOwogCi0JYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKLQlwcCA9IFhGU19BTExPQ19QVFJfQUREUihibG9jaywgMSwgY3VyKTsKLQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcHBbcGZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZwcFtwbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwlyZWMtPmFsbG9jLmFyX3N0YXJ0YmxvY2sgPSBjcHVfdG9fYmUzMihjdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2spOworCXJlYy0+YWxsb2MuYXJfYmxvY2tjb3VudCA9IGNwdV90b19iZTMyKGN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCk7CiB9CiAKLS8qCi0gKiBMb2cgcmVjb3JkcyBmcm9tIGEgYnRyZWUgYmxvY2sgKGxlYWYpLgotICovCiBTVEFUSUMgdm9pZAoteGZzX2FsbG9jX2xvZ19yZWNzKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJcmZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCByZWNvcmQgdG8gbG9nICovCi0JaW50CQkJcmxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcmVjb3JkIHRvIGxvZyAqLworeGZzX2FsbG9jYnRfaW5pdF9wdHJfZnJvbV9jdXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIpCiB7Ci0JeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayB0byBsb2cgZnJvbSAqLwotCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KLQlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCXhmc19hbGxvY19yZWNfdAkJKnJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2FnZgkJKmFnZiA9IFhGU19CVUZfVE9fQUdGKGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnApOwogCisJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8gPT0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pKTsKKwlBU1NFUlQoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0gIT0gMCk7CiAKLQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JewotCQl4ZnNfYWdmX3QJKmFnZjsKLQkJeGZzX2FsbG9jX3JlY190CSpwOwotCi0JCWFnZiA9IFhGU19CVUZfVE9fQUdGKGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnApOwotCQlmb3IgKHAgPSAmcnBbcmZpcnN0IC0gMV07IHAgPD0gJnJwW3JsYXN0IC0gMV07IHArKykKLQkJCUFTU0VSVChiZTMyX3RvX2NwdShwLT5hcl9zdGFydGJsb2NrKSArCi0JCQkgICAgICAgYmUzMl90b19jcHUocC0+YXJfYmxvY2tjb3VudCkgPD0KLQkJCSAgICAgICBiZTMyX3RvX2NwdShhZ2YtPmFnZl9sZW5ndGgpKTsKLQl9Ci0jZW5kaWYKLQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcnBbcmZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZycFtybGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwlwdHItPnMgPSBhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXTsKIH0KIAotLyoKLSAqIExvb2t1cCB0aGUgcmVjb3JkLiAgVGhlIGN1cnNvciBpcyBtYWRlIHRvIHBvaW50IHRvIGl0LCBiYXNlZCBvbiBkaXIuCi0gKiBSZXR1cm4gMCBpZiBjYW4ndCBmaW5kIGFueSBzdWNoIHJlY29yZCwgMSBmb3Igc3VjY2Vzcy4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2xvb2t1cCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19sb29rdXBfdAkJZGlyLAkvKiA8PSwgPT0sIG9yID49ICovCi0JaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworU1RBVElDIF9faW50NjRfdAoreGZzX2FsbG9jYnRfa2V5X2RpZmYoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXkpCiB7Ci0JeGZzX2FnYmxvY2tfdAkJYWdibm87CS8qIGEuZy4gcmVsYXRpdmUgYnRyZWUgYmxvY2sgbnVtYmVyICovCi0JeGZzX2FnbnVtYmVyX3QJCWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCi0JeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrPU5VTEw7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlkaWZmOwkvKiBkaWZmZXJlbmNlIGZvciB0aGUgY3VycmVudCBrZXkgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJa2V5bm89MDsJLyogY3VycmVudCBrZXkgbnVtYmVyICovCi0JaW50CQkJbGV2ZWw7CS8qIGxldmVsIGluIHRoZSBidHJlZSAqLwotCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2FsbG9jX3JlY19pbmNvcmVfdAkqcmVjID0gJmN1ci0+YmNfcmVjLmE7CisJeGZzX2FsbG9jX2tleV90CQkqa3AgPSAma2V5LT5hbGxvYzsKKwlfX2ludDY0X3QJCWRpZmY7CiAKLQlYRlNfU1RBVFNfSU5DKHhzX2FidF9sb29rdXApOwotCS8qCi0JICogR2V0IHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciwgYW5kIHRoZSByb290IGJsb2NrIG51bWJlci4KLQkgKi8KLQltcCA9IGN1ci0+YmNfbXA7Ci0KLQl7Ci0JCXhmc19hZ2ZfdAkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBoZWFkZXIgKi8KLQotCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQkJYWdubyA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX3NlcW5vKTsKLQkJYWdibm8gPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSk7CisJaWYgKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0JOTykgeworCQlyZXR1cm4gKF9faW50NjRfdCliZTMyX3RvX2NwdShrcC0+YXJfc3RhcnRibG9jaykgLQorCQkJCXJlYy0+YXJfc3RhcnRibG9jazsKIAl9CisKKwlkaWZmID0gKF9faW50NjRfdCliZTMyX3RvX2NwdShrcC0+YXJfYmxvY2tjb3VudCkgLSByZWMtPmFyX2Jsb2NrY291bnQ7CisJaWYgKGRpZmYpCisJCXJldHVybiBkaWZmOworCisJcmV0dXJuIChfX2ludDY0X3QpYmUzMl90b19jcHUoa3AtPmFyX3N0YXJ0YmxvY2spIC0gcmVjLT5hcl9zdGFydGJsb2NrOworfQorCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NidF9raWxsX3Jvb3QoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCWludAkJCWxldmVsLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKm5ld3Jvb3QpCit7CisJaW50CQkJZXJyb3I7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwga2lsbHJvb3QpOworCiAJLyoKLQkgKiBJdGVyYXRlIG92ZXIgZWFjaCBsZXZlbCBpbiB0aGUgYnRyZWUsIHN0YXJ0aW5nIGF0IHRoZSByb290LgotCSAqIEZvciBlYWNoIGxldmVsIGFib3ZlIHRoZSBsZWF2ZXMsIGZpbmQgdGhlIGtleSB3ZSBuZWVkLCBiYXNlZAotCSAqIG9uIHRoZSBsb29rdXAgcmVjb3JkLCB0aGVuIGZvbGxvdyB0aGUgY29ycmVzcG9uZGluZyBibG9jawotCSAqIHBvaW50ZXIgZG93biB0byB0aGUgbmV4dCBsZXZlbC4KKwkgKiBVcGRhdGUgdGhlIHJvb3QgcG9pbnRlciwgZGVjcmVhc2luZyB0aGUgbGV2ZWwgYnkgMSBhbmQgdGhlbgorCSAqIGZyZWUgdGhlIG9sZCByb290LgogCSAqLwotCWZvciAobGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxLCBkaWZmID0gMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgewotCQl4ZnNfYnVmX3QJKmJwOwkvKiBidWZmZXIgcG9pbnRlciBmb3IgYnRyZWUgYmxvY2sgKi8KLQkJeGZzX2RhZGRyX3QJZDsJLyogZGlzayBhZGRyZXNzIG9mIGJ0cmVlIGJsb2NrICovCi0KLQkJLyoKLQkJICogR2V0IHRoZSBkaXNrIGFkZHJlc3Mgd2UncmUgbG9va2luZyBmb3IuCi0JCSAqLwotCQlkID0gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOwotCQkvKgotCQkgKiBJZiB0aGUgb2xkIGJ1ZmZlciBhdCB0aGlzIGxldmVsIGlzIGZvciBhIGRpZmZlcmVudCBibG9jaywKLQkJICogdGhyb3cgaXQgYXdheSwgb3RoZXJ3aXNlIGp1c3QgdXNlIGl0LgotCQkgKi8KLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlpZiAoYnAgJiYgWEZTX0JVRl9BRERSKGJwKSAhPSBkKQotCQkJYnAgPSBOVUxMOwotCQlpZiAoIWJwKSB7Ci0JCQkvKgotCQkJICogTmVlZCB0byBnZXQgYSBuZXcgYnVmZmVyLiAgUmVhZCBpdCwgdGhlbgotCQkJICogc2V0IGl0IGluIHRoZSBjdXJzb3IsIHJlbGVhc2luZyB0aGUgb2xkIG9uZS4KLQkJCSAqLwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsIGFnbm8sCi0JCQkJCWFnYm5vLCAwLCAmYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIGJwKTsKLQkJCS8qCi0JCQkgKiBQb2ludCB0byB0aGUgYnRyZWUgYmxvY2ssIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGJ1ZmZlcgotCQkJICovCi0JCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsCi0JCQkJCWJwKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotCQl9IGVsc2UKLQkJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7Ci0JCS8qCi0JCSAqIElmIHdlIGFscmVhZHkgaGFkIGEga2V5IG1hdGNoIGF0IGEgaGlnaGVyIGxldmVsLCB3ZSBrbm93Ci0JCSAqIHdlIG5lZWQgdG8gdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGlzIGJsb2NrLgotCQkgKi8KLQkJaWYgKGRpZmYgPT0gMCkKLQkJCWtleW5vID0gMTsKLQkJLyoKLQkJICogT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc2VhcmNoIHRoaXMgYmxvY2suICBEbyBhIGJpbmFyeSBzZWFyY2guCi0JCSAqLwotCQllbHNlIHsKLQkJCWludAkJaGlnaDsJLyogaGlnaCBlbnRyeSBudW1iZXIgKi8KLQkJCXhmc19hbGxvY19rZXlfdAkqa2tiYXNlPU5VTEw7LyogYmFzZSBvZiBrZXlzIGluIGJsb2NrICovCi0JCQl4ZnNfYWxsb2NfcmVjX3QJKmtyYmFzZT1OVUxMOy8qIGJhc2Ugb2YgcmVjb3JkcyBpbiBibG9jayAqLwotCQkJaW50CQlsb3c7CS8qIGxvdyBlbnRyeSBudW1iZXIgKi8KLQotCQkJLyoKLQkJCSAqIEdldCBhIHBvaW50ZXIgdG8ga2V5cyBvciByZWNvcmRzLgotCQkJICovCi0JCQlpZiAobGV2ZWwgPiAwKQotCQkJCWtrYmFzZSA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKLQkJCWVsc2UKLQkJCQlrcmJhc2UgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0JCQkvKgotCQkJICogU2V0IGxvdyBhbmQgaGlnaCBlbnRyeSBudW1iZXJzLCAxLWJhc2VkLgotCQkJICovCi0JCQlsb3cgPSAxOwotCQkJaWYgKCEoaGlnaCA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkpIHsKLQkJCQkvKgotCQkJCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgdGhlIHRyZWUgbXVzdAotCQkJCSAqIGJlIGFuIGVtcHR5IGxlYWYuCi0JCQkJICovCi0JCQkJQVNTRVJUKGxldmVsID09IDAgJiYgY3VyLT5iY19ubGV2ZWxzID09IDEpOwotCQkJCWN1ci0+YmNfcHRyc1swXSA9IGRpciAhPSBYRlNfTE9PS1VQX0xFOwotCQkJCSpzdGF0ID0gMDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBCaW5hcnkgc2VhcmNoIHRoZSBibG9jay4KLQkJCSAqLwotCQkJd2hpbGUgKGxvdyA8PSBoaWdoKSB7Ci0JCQkJeGZzX2V4dGxlbl90CWJsb2NrY291bnQ7CS8qIGtleSB2YWx1ZSAqLwotCQkJCXhmc19hZ2Jsb2NrX3QJc3RhcnRibG9jazsJLyoga2V5IHZhbHVlICovCi0KLQkJCQlYRlNfU1RBVFNfSU5DKHhzX2FidF9jb21wYXJlKTsKLQkJCQkvKgotCQkJCSAqIGtleW5vIGlzIGF2ZXJhZ2Ugb2YgbG93IGFuZCBoaWdoLgotCQkJCSAqLwotCQkJCWtleW5vID0gKGxvdyArIGhpZ2gpID4+IDE7Ci0JCQkJLyoKLQkJCQkgKiBHZXQgc3RhcnRibG9jayAmIGJsb2NrY291bnQuCi0JCQkJICovCi0JCQkJaWYgKGxldmVsID4gMCkgewotCQkJCQl4ZnNfYWxsb2Nfa2V5X3QJKmtrcDsKLQotCQkJCQlra3AgPSBra2Jhc2UgKyBrZXlubyAtIDE7Ci0JCQkJCXN0YXJ0YmxvY2sgPSBiZTMyX3RvX2NwdShra3AtPmFyX3N0YXJ0YmxvY2spOwotCQkJCQlibG9ja2NvdW50ID0gYmUzMl90b19jcHUoa2twLT5hcl9ibG9ja2NvdW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQl4ZnNfYWxsb2NfcmVjX3QJKmtycDsKLQotCQkJCQlrcnAgPSBrcmJhc2UgKyBrZXlubyAtIDE7Ci0JCQkJCXN0YXJ0YmxvY2sgPSBiZTMyX3RvX2NwdShrcnAtPmFyX3N0YXJ0YmxvY2spOwotCQkJCQlibG9ja2NvdW50ID0gYmUzMl90b19jcHUoa3JwLT5hcl9ibG9ja2NvdW50KTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gZ2V0IG5leHQgZGlyZWN0aW9uLgotCQkJCSAqLwotCQkJCWlmIChjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9CTk8pCi0JCQkJCWRpZmYgPSAoaW50KXN0YXJ0YmxvY2sgLQotCQkJCQkgICAgICAgKGludCljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2s7Ci0JCQkJZWxzZSBpZiAoIShkaWZmID0gKGludClibG9ja2NvdW50IC0KLQkJCQkJICAgIChpbnQpY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50KSkKLQkJCQkJZGlmZiA9IChpbnQpc3RhcnRibG9jayAtCi0JCQkJCSAgICAoaW50KWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jazsKLQkJCQkvKgotCQkJCSAqIExlc3MgdGhhbiwgbW92ZSByaWdodC4KLQkJCQkgKi8KLQkJCQlpZiAoZGlmZiA8IDApCi0JCQkJCWxvdyA9IGtleW5vICsgMTsKLQkJCQkvKgotCQkJCSAqIEdyZWF0ZXIgdGhhbiwgbW92ZSBsZWZ0LgotCQkJCSAqLwotCQkJCWVsc2UgaWYgKGRpZmYgPiAwKQotCQkJCQloaWdoID0ga2V5bm8gLSAxOwotCQkJCS8qCi0JCQkJICogRXF1YWwsIHdlJ3JlIGRvbmUuCi0JCQkJICovCi0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHNldCB1cCBmb3IgdGhlIG5leHQgbGV2ZWwKLQkJICogYnkgZ2V0dGluZyB0aGUgYmxvY2sgbnVtYmVyIGFuZCBmaWxsaW5nIGluIHRoZSBjdXJzb3IuCi0JCSAqLwotCQlpZiAobGV2ZWwgPiAwKSB7Ci0JCQkvKgotCQkJICogSWYgd2UgbW92ZWQgbGVmdCwgbmVlZCB0aGUgcHJldmlvdXMga2V5IG51bWJlciwKLQkJCSAqIHVubGVzcyB0aGVyZSBpc24ndCBvbmUuCi0JCQkgKi8KLQkJCWlmIChkaWZmID4gMCAmJiAtLWtleW5vIDwgMSkKLQkJCQlrZXlubyA9IDE7Ci0JCQlhZ2JubyA9IGJlMzJfdG9fY3B1KCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGtleW5vLCBjdXIpKTsKLSNpZmRlZiBERUJVRwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYWdibm8sIGxldmVsKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87Ci0JCX0KKwl4ZnNfYWxsb2NidF9zZXRfcm9vdChjdXIsIG5ld3Jvb3QsIC0xKTsKKwllcnJvciA9IHhmc19hbGxvY2J0X2ZyZWVfYmxvY2soY3VyLCBicCk7CisJaWYgKGVycm9yKSB7CisJCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQotCS8qCi0JICogRG9uZSB3aXRoIHRoZSBzZWFyY2guCi0JICogU2VlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLgotCSAqLwotCWlmIChkaXIgIT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmIDwgMCkgewotCQlrZXlubysrOwotCQkvKgotCQkgKiBJZiBnZSBzZWFyY2ggYW5kIHdlIHdlbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgaXQncwotCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KLQkJICovCi0JCWlmIChkaXIgPT0gWEZTX0xPT0tVUF9HRSAmJgotCQkgICAga2V5bm8gPiBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgJiYKLQkJICAgIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJCWludAlpOwogCi0JCQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7Ci0JCQkqc3RhdCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQllbHNlIGlmIChkaXIgPT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmID4gMCkKLQkJa2V5bm8tLTsKLQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKLQkvKgotCSAqIFJldHVybiBpZiB3ZSBzdWNjZWVkZWQgb3Igbm90LgotCSAqLwotCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKQotCQkqc3RhdCA9IDA7Ci0JZWxzZQotCQkqc3RhdCA9ICgoZGlyICE9IFhGU19MT09LVVBfRVEpIHx8IChkaWZmID09IDApKTsKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgZnJlZSk7CisKKwl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIE5VTEwpOworCWN1ci0+YmNfbmxldmVscy0tOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIE1vdmUgMSByZWNvcmQgbGVmdCBmcm9tIGN1ci9sZXZlbCBpZiBwb3NzaWJsZS4KLSAqIFVwZGF0ZSBjdXIgdG8gcmVmbGVjdCB0aGUgbmV3IHBhdGguCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY19sc2hpZnQoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc2hpZnQgcmVjb3JkIG9uICovCi0JaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworI2lmZGVmIERFQlVHCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NidF9rZXlzX2lub3JkZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMSwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMikKIHsKLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0jaWZkZWYgREVCVUcKLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCi0jZW5kaWYKLQl4ZnNfYWxsb2Nfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGZvciBsZWFmIGxldmVsIHVwd2FyZCAqLwotCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IG5laWdoYm9yIGJsb2NrICovCi0JeGZzX2FsbG9jX2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlucmVjOwkvKiBuZXcgbnVtYmVyIG9mIGxlZnQgYmxvY2sgZW50cmllcyAqLwotCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCAoY3VycmVudCkgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChjdXJyZW50KSBidHJlZSBibG9jayAqLwotCXhmc19hbGxvY19rZXlfdAkJKnJrcD1OVUxMOwkvKiBrZXkgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfcHRyX3QJCSpycHA9TlVMTDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwotCXhmc19hbGxvY19yZWNfdAkJKnJycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQotCS8qCi0JICogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAicmlnaHQiLgotCSAqLwotCXJicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCS8qCi0JICogSWYgd2UndmUgZ290IG5vIGxlZnQgc2libGluZyB0aGVuIHdlIGNhbid0IHNoaWZ0IGFuIGVudHJ5IGxlZnQuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAotCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgotCSAqLwotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IDEpIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBTZXQgdXAgdGhlIGxlZnQgbmVpZ2hib3IgYXMgImxlZnQiLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBiZTMyX3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYiksCi0JCQkwLCAmbGJwLCBYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCi0JCXJldHVybiBlcnJvcjsKLQlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KLQkgKi8KLQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgPT0gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JbnJlYyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMTsKLQkvKgotCSAqIElmIG5vbi1sZWFmLCBjb3B5IGEga2V5IGFuZCBhIHB0ciB0byB0aGUgbGVmdCBibG9jay4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCXhmc19hbGxvY19rZXlfdAkqbGtwOwkvKiBrZXkgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCQl4ZnNfYWxsb2NfcHRyX3QJKmxwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCi0KLQkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIG5yZWMsIGN1cik7Ci0JCXJrcCA9IFhGU19BTExPQ19LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJKmxrcCA9ICpya3A7Ci0JCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGxicCwgbnJlYywgbnJlYyk7Ci0JCWxwcCA9IFhGU19BTExPQ19QVFJfQUREUihsZWZ0LCBucmVjLCBjdXIpOwotCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUoKnJwcCksIGxldmVsKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkJKmxwcCA9ICpycHA7Ci0JCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIGxicCwgbnJlYywgbnJlYyk7Ci0JCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgbGtwIC0gMSwgbGtwKTsKLQl9Ci0JLyoKLQkgKiBJZiBsZWFmLCBjb3B5IGEgcmVjb3JkIHRvIHRoZSBsZWZ0IGJsb2NrLgotCSAqLwotCWVsc2UgewotCQl4ZnNfYWxsb2NfcmVjX3QJKmxycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KLQotCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgbnJlYywgY3VyKTsKLQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQkqbHJwID0gKnJycDsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgbGJwLCBucmVjLCBucmVjKTsKLQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBscnAgLSAxLCBscnApOwotCX0KLQkvKgotCSAqIEJ1bXAgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgZGVjcmVtZW50IGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgotCSAqLwotCWJlMTZfYWRkX2NwdSgmbGVmdC0+YmJfbnVtcmVjcywgMSk7Ci0JeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLQliZTE2X2FkZF9jcHUoJnJpZ2h0LT5iYl9udW1yZWNzLCAtMSk7Ci0JeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKLQkvKgotCSAqIFNsaWRlIHRoZSBjb250ZW50cyBvZiByaWdodCBkb3duIG9uZSBlbnRyeS4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsgaSsrKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdShycHBbaSArIDFdKSwKLQkJCQkJbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtbW92ZShycHAsIHJwcCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7Ci0JCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOworCWlmIChjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9CTk8pIHsKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KGsxLT5hbGxvYy5hcl9zdGFydGJsb2NrKSA8CisJCSAgICAgICBiZTMyX3RvX2NwdShrMi0+YWxsb2MuYXJfc3RhcnRibG9jayk7CiAJfSBlbHNlIHsKLQkJbWVtbW92ZShycnAsIHJycCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7Ci0JCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7Ci0JCWtleS5hcl9ibG9ja2NvdW50ID0gcnJwLT5hcl9ibG9ja2NvdW50OwotCQlya3AgPSAma2V5OworCQlyZXR1cm4gYmUzMl90b19jcHUoazEtPmFsbG9jLmFyX2Jsb2NrY291bnQpIDwKKwkJCWJlMzJfdG9fY3B1KGsyLT5hbGxvYy5hcl9ibG9ja2NvdW50KSB8fAorCQkJKGsxLT5hbGxvYy5hcl9ibG9ja2NvdW50ID09IGsyLT5hbGxvYy5hcl9ibG9ja2NvdW50ICYmCisJCQkgYmUzMl90b19jcHUoazEtPmFsbG9jLmFyX3N0YXJ0YmxvY2spIDwKKwkJCSBiZTMyX3RvX2NwdShrMi0+YWxsb2MuYXJfc3RhcnRibG9jaykpOwogCX0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgcGFyZW50IGtleSB2YWx1ZXMgb2YgcmlnaHQuCi0JICovCi0JaWYgKChlcnJvciA9IHhmc19hbGxvY191cGRrZXkoY3VyLCBya3AsIGxldmVsICsgMSkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBTbGlkZSB0aGUgY3Vyc29yIHZhbHVlIGxlZnQgb25lLgotCSAqLwotCWN1ci0+YmNfcHRyc1tsZXZlbF0tLTsKLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrLCBmaWxsIGl0IGluLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2NfbmV3cm9vdCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK1NUQVRJQyBpbnQKK3hmc19hbGxvY2J0X3JlY3NfaW5vcmRlcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnIxLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnIyKQogewotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IGJsb2NrIG51bWJlciAqLwotCXhmc19idWZfdAkJKmxicDsJLyogbGVmdCBidHJlZSBidWZmZXIgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCBidHJlZSBibG9jayAqLwotCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLwotCXhmc19hZ2Jsb2NrX3QJCW5ibm87CS8qIG5ldyBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpuYnA7CS8qIG5ldyAocm9vdCkgYnVmZmVyICovCi0JeGZzX2FsbG9jX2Jsb2NrX3QJKm5ldzsJLyogbmV3IChyb290KSBidHJlZSBibG9jayAqLwotCWludAkJCW5wdHI7CS8qIG5ldyB2YWx1ZSBmb3Iga2V5IGluZGV4LCAxIG9yIDIgKi8KLQl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CS8qIHJpZ2h0IGJ0cmVlIGJ1ZmZlciAqLwotCXhmc19hbGxvY19ibG9ja190CSpyaWdodDsJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQotCW1wID0gY3VyLT5iY19tcDsKLQotCUFTU0VSVChjdXItPmJjX25sZXZlbHMgPCBYRlNfQUdfTUFYTEVWRUxTKG1wKSk7Ci0JLyoKLQkgKiBHZXQgYSBidWZmZXIgZnJvbSB0aGUgZnJlZWxpc3QgYmxvY2tzLCBmb3IgdGhlIG5ldyByb290LgotCSAqLwotCWVycm9yID0geGZzX2FsbG9jX2dldF9mcmVlbGlzdChjdXItPmJjX3RwLAotCQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ2JwLCAmbmJubywgMSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBOb25lIGF2YWlsYWJsZSwgd2UgZmFpbC4KLQkgKi8KLQlpZiAobmJubyA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAxKTsKLQluYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMobXAsIGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIG5ibm8sCi0JCTApOwotCW5ldyA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobmJwKTsKLQkvKgotCSAqIFNldCB0aGUgcm9vdCBkYXRhIGluIHRoZSBhLmcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUuCi0JICovCi0JewotCQl4ZnNfYWdmX3QJKmFnZjsJLyogYS5nLiBmcmVlc3BhY2UgaGVhZGVyICovCi0JCXhmc19hZ251bWJlcl90CXNlcW5vOwotCi0JCWFnZiA9IFhGU19CVUZfVE9fQUdGKGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnApOwotCQlhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSA9IGNwdV90b19iZTMyKG5ibm8pOwotCQliZTMyX2FkZF9jcHUoJmFnZi0+YWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSwgMSk7Ci0JCXNlcW5vID0gYmUzMl90b19jcHUoYWdmLT5hZ2Zfc2Vxbm8pOwotCQltcC0+bV9wZXJhZ1tzZXFub10ucGFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0rKzsKLQkJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKLQkJCVhGU19BR0ZfUk9PVFMgfCBYRlNfQUdGX0xFVkVMUyk7Ci0JfQotCS8qCi0JICogQXQgdGhlIHByZXZpb3VzIHJvb3QgbGV2ZWwgdGhlcmUgYXJlIG5vdyB0d28gYmxvY2tzOiB0aGUgb2xkCi0JICogcm9vdCwgYW5kIHRoZSBuZXcgYmxvY2sgZ2VuZXJhdGVkIHdoZW4gaXQgd2FzIHNwbGl0LgotCSAqIFdlIGRvbid0IGtub3cgd2hpY2ggb25lIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgYXQsIHNvIHdlCi0JICogc2V0IHVwIHZhcmlhYmxlcyAibGVmdCIgYW5kICJyaWdodCIgZm9yIGVhY2ggY2FzZS4KLQkgKi8KLQlsYnAgPSBjdXItPmJjX2J1ZnNbY3VyLT5iY19ubGV2ZWxzIC0gMV07Ci0JbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgY3VyLT5iY19ubGV2ZWxzIC0gMSwgbGJwKSkpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCWlmIChiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJLyoKLQkJICogT3VyIGJsb2NrIGlzIGxlZnQsIHBpY2sgdXAgdGhlIHJpZ2h0IGJsb2NrLgotCQkgKi8KLQkJbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhtcCwgWEZTX0JVRl9BRERSKGxicCkpOwotCQlyYm5vID0gYmUzMl90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCByYm5vLCAwLCAmcmJwLAotCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsCi0JCQkJY3VyLT5iY19ubGV2ZWxzIC0gMSwgcmJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCW5wdHIgPSAxOworCWlmIChjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9CTk8pIHsKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KHIxLT5hbGxvYy5hcl9zdGFydGJsb2NrKSArCisJCQliZTMyX3RvX2NwdShyMS0+YWxsb2MuYXJfYmxvY2tjb3VudCkgPD0KKwkJCWJlMzJfdG9fY3B1KHIyLT5hbGxvYy5hcl9zdGFydGJsb2NrKTsKIAl9IGVsc2UgewotCQkvKgotCQkgKiBPdXIgYmxvY2sgaXMgcmlnaHQsIHBpY2sgdXAgdGhlIGxlZnQgYmxvY2suCi0JCSAqLwotCQlyYnAgPSBsYnA7Ci0JCXJpZ2h0ID0gbGVmdDsKLQkJcmJubyA9IFhGU19EQUREUl9UT19BR0JOTyhtcCwgWEZTX0JVRl9BRERSKHJicCkpOwotCQlsYm5vID0gYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBsYm5vLCAwLCAmbGJwLAotCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LAotCQkJCWN1ci0+YmNfbmxldmVscyAtIDEsIGxicCkpKQotCQkJcmV0dXJuIGVycm9yOwotCQlucHRyID0gMjsKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KHIxLT5hbGxvYy5hcl9ibG9ja2NvdW50KSA8CisJCQliZTMyX3RvX2NwdShyMi0+YWxsb2MuYXJfYmxvY2tjb3VudCkgfHwKKwkJCShyMS0+YWxsb2MuYXJfYmxvY2tjb3VudCA9PSByMi0+YWxsb2MuYXJfYmxvY2tjb3VudCAmJgorCQkJIGJlMzJfdG9fY3B1KHIxLT5hbGxvYy5hcl9zdGFydGJsb2NrKSA8CisJCQkgYmUzMl90b19jcHUocjItPmFsbG9jLmFyX3N0YXJ0YmxvY2spKTsKIAl9Ci0JLyoKLQkgKiBGaWxsIGluIHRoZSBuZXcgYmxvY2sncyBidHJlZSBoZWFkZXIgYW5kIGxvZyBpdC4KLQkgKi8KLQluZXctPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7Ci0JbmV3LT5iYl9sZXZlbCA9IGNwdV90b19iZTE2KGN1ci0+YmNfbmxldmVscyk7Ci0JbmV3LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMik7Ci0JbmV3LT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwotCW5ldy0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7Ci0JeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBuYnAsIFhGU19CQl9BTExfQklUUyk7Ci0JQVNTRVJUKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYgcmJubyAhPSBOVUxMQUdCTE9DSyk7Ci0JLyoKLQkgKiBGaWxsIGluIHRoZSBrZXkgZGF0YSBpbiB0aGUgbmV3IHJvb3QuCi0JICovCi0JewotCQl4ZnNfYWxsb2Nfa2V5X3QJCSprcDsJLyogYnRyZWUga2V5IHBvaW50ZXIgKi8KK30KKyNlbmRpZgkvKiBERUJVRyAqLwogCi0JCWtwID0gWEZTX0FMTE9DX0tFWV9BRERSKG5ldywgMSwgY3VyKTsKLQkJaWYgKGJlMTZfdG9fY3B1KGxlZnQtPmJiX2xldmVsKSA+IDApIHsKLQkJCWtwWzBdID0gKlhGU19BTExPQ19LRVlfQUREUihsZWZ0LCAxLCBjdXIpOwotCQkJa3BbMV0gPSAqWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQl9IGVsc2UgewotCQkJeGZzX2FsbG9jX3JlY190CSpycDsJLyogYnRyZWUgcmVjb3JkIHBvaW50ZXIgKi8KKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKK2t0cmFjZV90CSp4ZnNfYWxsb2NidF90cmFjZV9idWY7CiAKLQkJCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIDEsIGN1cik7Ci0JCQlrcFswXS5hcl9zdGFydGJsb2NrID0gcnAtPmFyX3N0YXJ0YmxvY2s7Ci0JCQlrcFswXS5hcl9ibG9ja2NvdW50ID0gcnAtPmFyX2Jsb2NrY291bnQ7Ci0JCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJCWtwWzFdLmFyX3N0YXJ0YmxvY2sgPSBycC0+YXJfc3RhcnRibG9jazsKLQkJCWtwWzFdLmFyX2Jsb2NrY291bnQgPSBycC0+YXJfYmxvY2tjb3VudDsKLQkJfQotCX0KLQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBuYnAsIDEsIDIpOwotCS8qCi0JICogRmlsbCBpbiB0aGUgcG9pbnRlciBkYXRhIGluIHRoZSBuZXcgcm9vdC4KLQkgKi8KLQl7Ci0JCXhmc19hbGxvY19wdHJfdAkJKnBwOwkvKiBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NidF90cmFjZV9lbnRlcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCWNoYXIJCQkqcywKKwlpbnQJCQl0eXBlLAorCWludAkJCWxpbmUsCisJX19wc3Vuc2lnbmVkX3QJCWEwLAorCV9fcHN1bnNpZ25lZF90CQlhMSwKKwlfX3BzdW5zaWduZWRfdAkJYTIsCisJX19wc3Vuc2lnbmVkX3QJCWEzLAorCV9fcHN1bnNpZ25lZF90CQlhNCwKKwlfX3BzdW5zaWduZWRfdAkJYTUsCisJX19wc3Vuc2lnbmVkX3QJCWE2LAorCV9fcHN1bnNpZ25lZF90CQlhNywKKwlfX3BzdW5zaWduZWRfdAkJYTgsCisJX19wc3Vuc2lnbmVkX3QJCWE5LAorCV9fcHN1bnNpZ25lZF90CQlhMTApCit7CisJa3RyYWNlX2VudGVyKHhmc19hbGxvY2J0X3RyYWNlX2J1ZiwgKHZvaWQgKikoX19wc2ludF90KXR5cGUsCisJCSh2b2lkICopZnVuYywgKHZvaWQgKilzLCBOVUxMLCAodm9pZCAqKWN1ciwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKilhOCwgKHZvaWQgKilhOSwgKHZvaWQgKilhMTApOworfQogCi0JCXBwID0gWEZTX0FMTE9DX1BUUl9BRERSKG5ldywgMSwgY3VyKTsKLQkJcHBbMF0gPSBjcHVfdG9fYmUzMihsYm5vKTsKLQkJcHBbMV0gPSBjcHVfdG9fYmUzMihyYm5vKTsKLQl9Ci0JeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgbmJwLCAxLCAyKTsKLQkvKgotCSAqIEZpeCB1cCB0aGUgY3Vyc29yLgotCSAqLwotCXhmc19idHJlZV9zZXRidWYoY3VyLCBjdXItPmJjX25sZXZlbHMsIG5icCk7Ci0JY3VyLT5iY19wdHJzW2N1ci0+YmNfbmxldmVsc10gPSBucHRyOwotCWN1ci0+YmNfbmxldmVscysrOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NidF90cmFjZV9jdXJzb3IoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlfX3VpbnQzMl90CQkqczAsCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSkKK3sKKwkqczAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ25vOworCSpsMCA9IGN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jazsKKwkqbDEgPSBjdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQ7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NidF90cmFjZV9rZXkoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSkKK3sKKwkqbDAgPSBiZTMyX3RvX2NwdShrZXktPmFsbG9jLmFyX3N0YXJ0YmxvY2spOworCSpsMSA9IGJlMzJfdG9fY3B1KGtleS0+YWxsb2MuYXJfYmxvY2tjb3VudCk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NidF90cmFjZV9yZWNvcmQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWMsCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSwKKwlfX3VpbnQ2NF90CQkqbDIpCit7CisJKmwwID0gYmUzMl90b19jcHUocmVjLT5hbGxvYy5hcl9zdGFydGJsb2NrKTsKKwkqbDEgPSBiZTMyX3RvX2NwdShyZWMtPmFsbG9jLmFyX2Jsb2NrY291bnQpOworCSpsMiA9IDA7Cit9CisjZW5kaWYgLyogWEZTX0JUUkVFX1RSQUNFICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZzX2J0cmVlX29wcyB4ZnNfYWxsb2NidF9vcHMgPSB7CisJLnJlY19sZW4JCT0gc2l6ZW9mKHhmc19hbGxvY19yZWNfdCksCisJLmtleV9sZW4JCT0gc2l6ZW9mKHhmc19hbGxvY19rZXlfdCksCisKKwkuZHVwX2N1cnNvcgkJPSB4ZnNfYWxsb2NidF9kdXBfY3Vyc29yLAorCS5zZXRfcm9vdAkJPSB4ZnNfYWxsb2NidF9zZXRfcm9vdCwKKwkua2lsbF9yb290CQk9IHhmc19hbGxvY2J0X2tpbGxfcm9vdCwKKwkuYWxsb2NfYmxvY2sJCT0geGZzX2FsbG9jYnRfYWxsb2NfYmxvY2ssCisJLmZyZWVfYmxvY2sJCT0geGZzX2FsbG9jYnRfZnJlZV9ibG9jaywKKwkudXBkYXRlX2xhc3RyZWMJCT0geGZzX2FsbG9jYnRfdXBkYXRlX2xhc3RyZWMsCisJLmdldF9taW5yZWNzCQk9IHhmc19hbGxvY2J0X2dldF9taW5yZWNzLAorCS5nZXRfbWF4cmVjcwkJPSB4ZnNfYWxsb2NidF9nZXRfbWF4cmVjcywKKwkuaW5pdF9rZXlfZnJvbV9yZWMJPSB4ZnNfYWxsb2NidF9pbml0X2tleV9mcm9tX3JlYywKKwkuaW5pdF9yZWNfZnJvbV9rZXkJPSB4ZnNfYWxsb2NidF9pbml0X3JlY19mcm9tX2tleSwKKwkuaW5pdF9yZWNfZnJvbV9jdXIJPSB4ZnNfYWxsb2NidF9pbml0X3JlY19mcm9tX2N1ciwKKwkuaW5pdF9wdHJfZnJvbV9jdXIJPSB4ZnNfYWxsb2NidF9pbml0X3B0cl9mcm9tX2N1ciwKKwkua2V5X2RpZmYJCT0geGZzX2FsbG9jYnRfa2V5X2RpZmYsCisKKyNpZmRlZiBERUJVRworCS5rZXlzX2lub3JkZXIJCT0geGZzX2FsbG9jYnRfa2V5c19pbm9yZGVyLAorCS5yZWNzX2lub3JkZXIJCT0geGZzX2FsbG9jYnRfcmVjc19pbm9yZGVyLAorI2VuZGlmCisKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKKwkudHJhY2VfZW50ZXIJCT0geGZzX2FsbG9jYnRfdHJhY2VfZW50ZXIsCisJLnRyYWNlX2N1cnNvcgkJPSB4ZnNfYWxsb2NidF90cmFjZV9jdXJzb3IsCisJLnRyYWNlX2tleQkJPSB4ZnNfYWxsb2NidF90cmFjZV9rZXksCisJLnRyYWNlX3JlY29yZAkJPSB4ZnNfYWxsb2NidF90cmFjZV9yZWNvcmQsCisjZW5kaWYKK307CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBhbGxvY2F0aW9uIGJ0cmVlIGN1cnNvci4KKyAqLworc3RydWN0IHhmc19idHJlZV9jdXIgKgkJCS8qIG5ldyBhbGxvYyBidHJlZSBjdXJzb3IgKi8KK3hmc19hbGxvY2J0X2luaXRfY3Vyc29yKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAsCQkvKiBidWZmZXIgZm9yIGFnZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2J0bnVtX3QJCWJ0bnVtKQkJLyogYnRyZWUgaWRlbnRpZmllciAqLworeworCXN0cnVjdCB4ZnNfYWdmCQkqYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1cjsKKworCUFTU0VSVChidG51bSA9PSBYRlNfQlROVU1fQk5PIHx8IGJ0bnVtID09IFhGU19CVE5VTV9DTlQpOworCisJY3VyID0ga21lbV96b25lX3phbGxvYyh4ZnNfYnRyZWVfY3VyX3pvbmUsIEtNX1NMRUVQKTsKKworCWN1ci0+YmNfdHAgPSB0cDsKKwljdXItPmJjX21wID0gbXA7CisJY3VyLT5iY19ubGV2ZWxzID0gYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGV2ZWxzW2J0bnVtXSk7CisJY3VyLT5iY19idG51bSA9IGJ0bnVtOworCWN1ci0+YmNfYmxvY2tsb2cgPSBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKKworCWN1ci0+YmNfb3BzID0gJnhmc19hbGxvY2J0X29wczsKKwlpZiAoYnRudW0gPT0gWEZTX0JUTlVNX0NOVCkKKwkJY3VyLT5iY19mbGFncyA9IFhGU19CVFJFRV9MQVNUUkVDX1VQREFURTsKKworCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAgPSBhZ2JwOworCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8gPSBhZ25vOworCisJcmV0dXJuIGN1cjsKIH0KIAogLyoKLSAqIE1vdmUgMSByZWNvcmQgcmlnaHQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCi0gKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICogQ2FsY3VsYXRlIG51bWJlciBvZiByZWNvcmRzIGluIGFuIGFsbG9jIGJ0cmVlIGJsb2NrLgogICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2NfcnNoaWZ0KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2ludAoreGZzX2FsbG9jYnRfbWF4cmVjcygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlpbnQJCQlibG9ja2xlbiwKKwlpbnQJCQlsZWFmKQogewotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCi0JeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBmb3IgbGVhZiBsZXZlbCB1cHdhcmQgKi8KLQl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCAoY3VycmVudCkgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgbmVpZ2hib3IgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IG5laWdoYm9yIGJ0cmVlIGJsb2NrICovCi0JeGZzX2FsbG9jX2tleV90CQkqcmtwOwkvKiBrZXkgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgY3Vyc29yICovCisJYmxvY2tsZW4gLT0gWEZTX0FMTE9DX0JMT0NLX0xFTihtcCk7CiAKLQkvKgotCSAqIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgImxlZnQiLgotCSAqLwotCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIElmIHdlJ3ZlIGdvdCBubyByaWdodCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgcmlnaHQuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAotCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgotCSAqLwotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogU2V0IHVwIHRoZSByaWdodCBuZWlnaGJvciBhcyAicmlnaHQiLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksCi0JCQkwLCAmcmJwLCBYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCi0JCXJldHVybiBlcnJvcjsKLQlyaWdodCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socmJwKTsKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCi0JCXJldHVybiBlcnJvcjsKLQkvKgotCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgotCSAqLwotCWlmIChiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgPT0gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBNYWtlIGEgaG9sZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLCB0aGVuCi0JICogY29weSB0aGUgbGFzdCBsZWZ0IGJsb2NrIGVudHJ5IHRvIHRoZSBob2xlLgotCSAqLwotCWlmIChsZXZlbCA+IDApIHsKLQkJeGZzX2FsbG9jX2tleV90CSpsa3A7CS8qIGtleSBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCi0JCXhmc19hbGxvY19wdHJfdAkqbHBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KLQkJeGZzX2FsbG9jX3B0cl90CSpycHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQotCQlsa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7Ci0JCWxwcCA9IFhGU19BTExPQ19QVFJfQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKLQkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHJwcFtpXSksIGxldmVsKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0jZW5kaWYKLQkJbWVtbW92ZShya3AgKyAxLCBya3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbW1vdmUocnBwICsgMSwgcnBwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJwcCkpOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KCpscHApLCBsZXZlbCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCSpya3AgPSAqbGtwOwotCQkqcnBwID0gKmxwcDsKLQkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKLQkJeGZzX2J0cmVlX2NoZWNrX2tleShjdXItPmJjX2J0bnVtLCBya3AsIHJrcCArIDEpOwotCX0gZWxzZSB7Ci0JCXhmc19hbGxvY19yZWNfdAkqbHJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCQl4ZnNfYWxsb2NfcmVjX3QJKnJycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCi0KLQkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOwotCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCW1lbW1vdmUocnJwICsgMSwgcnJwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJycCkpOwotCQkqcnJwID0gKmxycDsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKLQkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7Ci0JCWtleS5hcl9ibG9ja2NvdW50ID0gcnJwLT5hcl9ibG9ja2NvdW50OwotCQlya3AgPSAma2V5OwotCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJycCwgcnJwICsgMSk7Ci0JfQotCS8qCi0JICogRGVjcmVtZW50IGFuZCBsb2cgbGVmdCdzIG51bXJlY3MsIGJ1bXAgYW5kIGxvZyByaWdodCdzIG51bXJlY3MuCi0JICovCi0JYmUxNl9hZGRfY3B1KCZsZWZ0LT5iYl9udW1yZWNzLCAtMSk7Ci0JeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLQliZTE2X2FkZF9jcHUoJnJpZ2h0LT5iYl9udW1yZWNzLCAxKTsKLQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJicCwgWEZTX0JCX05VTVJFQ1MpOwotCS8qCi0JICogVXNpbmcgYSB0ZW1wb3JhcnkgY3Vyc29yLCB1cGRhdGUgdGhlIHBhcmVudCBrZXkgdmFsdWVzIG9mIHRoZQotCSAqIGJsb2NrIG9uIHRoZSByaWdodC4KLQkgKi8KLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCAmdGN1cikpKQotCQlyZXR1cm4gZXJyb3I7Ci0JaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKLQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkgfHwKLQkgICAgKGVycm9yID0geGZzX2FsbG9jX3VwZGtleSh0Y3VyLCBya3AsIGxldmVsICsgMSkpKQotCQlnb3RvIGVycm9yMDsKLQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotZXJyb3IwOgotCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCi0gKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgaXRzIGZpcnN0IHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2Nfc3BsaXQoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc3BsaXQgKi8KLQl4ZnNfYWdibG9ja190CQkqYm5vcCwJLyogb3V0cHV0OiBibG9jayBudW1iZXIgYWxsb2NhdGVkICovCi0JeGZzX2FsbG9jX2tleV90CQkqa2V5cCwJLyogb3V0cHV0OiBmaXJzdCBrZXkgb2YgbmV3IGJsb2NrICovCi0JeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIG91dHB1dDogbmV3IGN1cnNvciAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJaTsJLyogbG9vcCBpbmRleC9yZWNvcmQgbnVtYmVyICovCi0JeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCAoY3VycmVudCkgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqbGJwOwkvKiBidWZmZXIgZm9yIGxlZnQgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCAobmV3KSBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChuZXcpIGJ0cmVlIGJsb2NrICovCi0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBuZXcgYmxvY2sgZnJvbSB0aGUgZnJlZWxpc3QuCi0JICogSWYgd2UgY2FuJ3QgZG8gaXQsIHdlJ3JlIHRvYXN0LiAgR2l2ZSB1cC4KLQkgKi8KLQllcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QoY3VyLT5iY190cCwKLQkJCQkJIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsICZyYm5vLCAxKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQlpZiAocmJubyA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAxKTsKLQlyYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKLQkJcmJubywgMCk7Ci0JLyoKLQkgKiBTZXQgdXAgdGhlIG5ldyBibG9jayBhcyAicmlnaHQiLgotCSAqLwotCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOwotCS8qCi0JICogIkxlZnQiIGlzIHRoZSBjdXJyZW50IChhY2NvcmRpbmcgdG8gdGhlIGN1cnNvcikgYmxvY2suCi0JICovCi0JbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCS8qCi0JICogRmlsbCBpbiB0aGUgYnRyZWUgaGVhZGVyIGZvciB0aGUgbmV3IGJsb2NrLgotCSAqLwotCXJpZ2h0LT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOwotCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOwotCXJpZ2h0LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLyAyKTsKLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZXJlJ3MgYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzIG5vdywgdGhhdAotCSAqIGVhY2ggbmV3IGJsb2NrIHdpbGwgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcy4KLQkgKi8KLQlpZiAoKGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICYgMSkgJiYKLQkgICAgY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKQotCQliZTE2X2FkZF9jcHUoJnJpZ2h0LT5iYl9udW1yZWNzLCAxKTsKLQlpID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxOwotCS8qCi0JICogRm9yIG5vbi1sZWFmIGJsb2NrcywgY29weSBrZXlzIGFuZCBhZGRyZXNzZXMgb3ZlciB0byB0aGUgbmV3IGJsb2NrLgotCSAqLwotCWlmIChsZXZlbCA+IDApIHsKLQkJeGZzX2FsbG9jX2tleV90CSpsa3A7CS8qIGxlZnQgYnRyZWUga2V5IHBvaW50ZXIgKi8KLQkJeGZzX2FsbG9jX3B0cl90CSpscHA7CS8qIGxlZnQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCi0JCXhmc19hbGxvY19rZXlfdAkqcmtwOwkvKiByaWdodCBidHJlZSBrZXkgcG9pbnRlciAqLwotCQl4ZnNfYWxsb2NfcHRyX3QJKnJwcDsJLyogcmlnaHQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCi0KLQkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIGksIGN1cik7Ci0JCWxwcCA9IFhGU19BTExPQ19QVFJfQUREUihsZWZ0LCBpLCBjdXIpOwotCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KGxwcFtpXSksIGxldmVsKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0jZW5kaWYKLQkJbWVtY3B5KHJrcCwgbGtwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJrcCkpOwotCQltZW1jcHkocnBwLCBscHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7Ci0JCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwotCQkqa2V5cCA9ICpya3A7Ci0JfQotCS8qCi0JICogRm9yIGxlYWYgYmxvY2tzLCBjb3B5IHJlY29yZHMgb3ZlciB0byB0aGUgbmV3IGJsb2NrLgotCSAqLwotCWVsc2UgewotCQl4ZnNfYWxsb2NfcmVjX3QJKmxycDsJLyogbGVmdCBidHJlZSByZWNvcmQgcG9pbnRlciAqLwotCQl4ZnNfYWxsb2NfcmVjX3QJKnJycDsJLyogcmlnaHQgYnRyZWUgcmVjb3JkIHBvaW50ZXIgKi8KLQotCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgaSwgY3VyKTsKLQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1jcHkocnJwLCBscnAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7Ci0JCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJa2V5cC0+YXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsKLQkJa2V5cC0+YXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsKLQl9Ci0JLyoKLQkgKiBGaW5kIHRoZSBsZWZ0IGJsb2NrIG51bWJlciBieSBsb29raW5nIGluIHRoZSBidWZmZXIuCi0JICogQWRqdXN0IG51bXJlY3MsIHNpYmxpbmcgcG9pbnRlcnMuCi0JICovCi0JbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhjdXItPmJjX21wLCBYRlNfQlVGX0FERFIobGJwKSk7Ci0JYmUxNl9hZGRfY3B1KCZsZWZ0LT5iYl9udW1yZWNzLCAtKGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSkpOwotCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOwotCWxlZnQtPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIocmJubyk7Ci0JcmlnaHQtPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihsYm5vKTsKLQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOwotCS8qCi0JICogSWYgdGhlcmUncyBhIGJsb2NrIHRvIHRoZSBuZXcgYmxvY2sncyByaWdodCwgbWFrZSB0aGF0IGJsb2NrCi0JICogcG9pbnQgYmFjayB0byByaWdodCBpbnN0ZWFkIG9mIHRvIGxlZnQuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJeGZzX2FsbG9jX2Jsb2NrX3QJKnJyYmxvY2s7CS8qIHJyIGJ0cmVlIGJsb2NrICovCi0JCXhmc19idWZfdAkJKnJyYnA7CQkvKiBidWZmZXIgZm9yIHJyYmxvY2sgKi8KLQotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAotCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9yaWdodHNpYiksIDAsCi0JCQkJJnJyYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcnJibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socnJicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcnJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKHJibm8pOwotCQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKLQl9Ci0JLyoKLQkgKiBJZiB0aGUgY3Vyc29yIGlzIHJlYWxseSBpbiB0aGUgcmlnaHQgYmxvY2ssIG1vdmUgaXQgdGhlcmUuCi0JICogSWYgaXQncyBqdXN0IHBvaW50aW5nIHBhc3QgdGhlIGxhc3QgZW50cnkgaW4gbGVmdCwgdGhlbiB3ZSdsbAotCSAqIGluc2VydCB0aGVyZSwgc28gZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSkgewotCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIHJicCk7Ci0JCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JfQotCS8qCi0JICogSWYgdGhlcmUgYXJlIG1vcmUgbGV2ZWxzLCB3ZSdsbCBuZWVkIGFub3RoZXIgY3Vyc29yIHdoaWNoIHJlZmVycyB0bwotCSAqIHRoZSByaWdodCBibG9jaywgbm8gbWF0dGVyIHdoZXJlIHRoaXMgY3Vyc29yIHdhcy4KLQkgKi8KLQlpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsIGN1cnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJKCpjdXJwKS0+YmNfcHRyc1tsZXZlbCArIDFdKys7Ci0JfQotCSpibm9wID0gcmJubzsKLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBVcGRhdGUga2V5cyBhdCBhbGwgbGV2ZWxzIGZyb20gaGVyZSB0byB0aGUgcm9vdCBhbG9uZyB0aGUgY3Vyc29yJ3MgcGF0aC4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX3VwZGtleSgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hbGxvY19rZXlfdAkJKmtleXAsCS8qIG5ldyBrZXkgdmFsdWUgdG8gdXBkYXRlIHRvICovCi0JaW50CQkJbGV2ZWwpCS8qIHN0YXJ0aW5nIGxldmVsIGZvciB1cGRhdGUgKi8KLXsKLQlpbnQJCQlwdHI7CS8qIGluZGV4IG9mIGtleSBpbiBibG9jayAqLwotCi0JLyoKLQkgKiBHbyB1cCB0aGUgdHJlZSBmcm9tIHRoaXMgbGV2ZWwgdG93YXJkIHRoZSByb290LgotCSAqIEF0IGVhY2ggbGV2ZWwsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHRvIHRoZSB2YWx1ZSBpbnB1dC4KLQkgKiBTdG9wIHdoZW4gd2UgcmVhY2ggYSBsZXZlbCB3aGVyZSB0aGUgY3Vyc29yIGlzbid0IHBvaW50aW5nCi0JICogYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBibG9jay4KLQkgKi8KLQlmb3IgKHB0ciA9IDE7IHB0ciA9PSAxICYmIGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7Ci0JCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KLQkJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KLSNpZmRlZiBERUJVRwotCQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0jZW5kaWYKLQkJeGZzX2FsbG9jX2tleV90CQkqa3A7CS8qIHB0ciB0byBidHJlZSBibG9jayBrZXlzICovCi0KLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCWtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCSprcCA9ICprZXlwOwotCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBwdHIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEV4dGVybmFsbHkgdmlzaWJsZSByb3V0aW5lcy4KLSAqLwotCi0vKgotICogRGVjcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KLSAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2RlY3JlbWVudCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCi0JaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJbGV2OwkvKiBidHJlZSBsZXZlbCAqLwotCi0JQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKLQkvKgotCSAqIFJlYWQtYWhlYWQgdG8gdGhlIGxlZnQgYXQgdGhpcyBsZXZlbC4KLQkgKi8KLQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9MRUZUUkEpOwotCS8qCi0JICogRGVjcmVtZW50IHRoZSBwdHIgYXQgdGhpcyBsZXZlbC4gIElmIHdlJ3JlIHN0aWxsIGluIHRoZSBibG9jawotCSAqIHRoZW4gd2UncmUgZG9uZS4KLQkgKi8KLQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2ZWxdID4gMCkgewotCQkqc3RhdCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJ0cmVlIGJsb2NrLgotCSAqLwotCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2ZWxdKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLAotCQkJY3VyLT5iY19idWZzW2xldmVsXSkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHJlZSwgcmV0dXJuIGZhaWx1cmUuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGRlY3JlbWVudGluZyBwb2ludGVycy4KLQkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBibG9jay4KLQkgKi8KLQlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgewotCQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2XSA+IDApCi0JCQlicmVhazsKLQkJLyoKLQkJICogUmVhZC1haGVhZCB0aGUgbGVmdCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAotCQkgKiBpbiB0aGUgbmV4dCBsb29wLgotCQkgKi8KLQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7Ci0JfQotCS8qCi0JICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgotCSAqLwotCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOwotCS8qCi0JICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgotCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KLQkgKi8KLQlmb3IgKGJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7IGxldiA+IGxldmVsOyApIHsKLQkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCi0JCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBwb2ludGVyIGZvciBibG9jayAqLwotCi0JCWFnYm5vID0gYmUzMl90b19jcHUoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1cikpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAotCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGFnYm5vLCAwLCAmYnAsCi0JCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQotCQkJcmV0dXJuIGVycm9yOwotCQlsZXYtLTsKLQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOwotCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWN1ci0+YmNfcHRyc1tsZXZdID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotCX0KLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZWxldGUgdGhlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci4KLSAqIFRoZSBjdXJzb3IgcmVmZXJzIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVjb3JkIHdhcyAoY291bGQgYmUgaW5zZXJ0ZWQpCi0gKiB3aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucy4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2RlbGV0ZSgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQlpOwkJLyogcmVzdWx0IGNvZGUgKi8KLQlpbnQJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgKi8KLQotCS8qCi0JICogR28gdXAgdGhlIHRyZWUsIHN0YXJ0aW5nIGF0IGxlYWYgbGV2ZWwuCi0JICogSWYgMiBpcyByZXR1cm5lZCB0aGVuIGEgam9pbiB3YXMgZG9uZTsgZ28gdG8gdGhlIG5leHQgbGV2ZWwuCi0JICogT3RoZXJ3aXNlIHdlIGFyZSBkb25lLgotCSAqLwotCWZvciAobGV2ZWwgPSAwLCBpID0gMjsgaSA9PSAyOyBsZXZlbCsrKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVscmVjKGN1ciwgbGV2ZWwsICZpKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCWlmIChpID09IDApIHsKLQkJZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7Ci0JCQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA9PSAwKSB7Ci0JCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCSpzdGF0ID0gaTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2dldF9yZWMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdibG9ja190CQkqYm5vLAkvKiBvdXRwdXQ6IHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLwotCXhmc19leHRsZW5fdAkJKmxlbiwJLyogb3V0cHV0OiBsZW5ndGggb2YgZXh0ZW50ICovCi0JaW50CQkJKnN0YXQpCS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLwotI2lmZGVmIERFQlVHCi0JaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotI2VuZGlmCi0JaW50CQkJcHRyOwkvKiByZWNvcmQgbnVtYmVyICovCi0KLQlwdHIgPSBjdXItPmJjX3B0cnNbMF07Ci0JYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGN1ci0+YmNfYnVmc1swXSk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCAwLCBjdXItPmJjX2J1ZnNbMF0pKSkKLQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JLyoKLQkgKiBPZmYgdGhlIHJpZ2h0IGVuZCBvciBsZWZ0IGVuZCwgcmV0dXJuIGZhaWx1cmUuCi0JICovCi0JaWYgKHB0ciA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSB8fCBwdHIgPD0gMCkgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIFBvaW50IHRvIHRoZSByZWNvcmQgYW5kIGV4dHJhY3QgaXRzIGRhdGEuCi0JICovCi0JewotCQl4ZnNfYWxsb2NfcmVjX3QJCSpyZWM7CS8qIHJlY29yZCBkYXRhICovCi0KLQkJcmVjID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCSpibm8gPSBiZTMyX3RvX2NwdShyZWMtPmFyX3N0YXJ0YmxvY2spOwotCQkqbGVuID0gYmUzMl90b19jcHUocmVjLT5hcl9ibG9ja2NvdW50KTsKLQl9Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KLSAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2luY3JlbWVudCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCi0JaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpicDsJLyogdHJlZSBibG9jayBidWZmZXIgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJbGV2OwkvKiBidHJlZSBsZXZlbCAqLwotCi0JQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKLQkvKgotCSAqIFJlYWQtYWhlYWQgdG8gdGhlIHJpZ2h0IGF0IHRoaXMgbGV2ZWwuCi0JICovCi0JeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfUklHSFRSQSk7Ci0JLyoKLQkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBidHJlZSBibG9jay4KLQkgKi8KLQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIEluY3JlbWVudCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwuICBJZiB3ZSdyZSBzdGlsbCBpbiB0aGUgYmxvY2sKLQkgKiB0aGVuIHdlJ3JlIGRvbmUuCi0JICovCi0JaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KLQkgKi8KLQlpZiAoYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGluY3JlbWVudGluZyBwb2ludGVycy4KLQkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSByaWdodCBlZGdlIG9mIGEgYmxvY2suCi0JICovCi0JZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2XTsKLQkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKLSNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKQotCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIFJlYWQtYWhlYWQgdGhlIHJpZ2h0IGJsb2NrLCB3ZSdyZSBnb2luZyB0byByZWFkIGl0Ci0JCSAqIGluIHRoZSBuZXh0IGxvb3AuCi0JCSAqLwotCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfUklHSFRSQSk7Ci0JfQotCS8qCi0JICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgotCSAqLwotCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOwotCS8qCi0JICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgotCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KLQkgKi8KLQlmb3IgKGJwID0gY3VyLT5iY19idWZzW2xldl0sIGJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7Ci0JICAgICBsZXYgPiBsZXZlbDsgKSB7Ci0JCXhmc19hZ2Jsb2NrX3QJYWdibm87CS8qIGJsb2NrIG51bWJlciBvZiBidHJlZSBibG9jayAqLwotCi0JCWFnYm5vID0gYmUzMl90b19jcHUoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1cikpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAotCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGFnYm5vLCAwLCAmYnAsCi0JCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQotCQkJcmV0dXJuIGVycm9yOwotCQlsZXYtLTsKLQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOwotCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWN1ci0+YmNfcHRyc1tsZXZdID0gMTsKLQl9Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCi0gKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2luc2VydCgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQlpOwkJLyogcmVzdWx0IHZhbHVlLCAwIGZvciBmYWlsdXJlICovCi0JaW50CQlsZXZlbDsJCS8qIGN1cnJlbnQgbGV2ZWwgbnVtYmVyIGluIGJ0cmVlICovCi0JeGZzX2FnYmxvY2tfdAluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAoc3BsaXQgcmVzdWx0KSAqLwotCXhmc19idHJlZV9jdXJfdAkqbmN1cjsJCS8qIG5ldyBjdXJzb3IgKHNwbGl0IHJlc3VsdCkgKi8KLQl4ZnNfYWxsb2NfcmVjX3QJbnJlYzsJCS8qIHJlY29yZCBiZWluZyBpbnNlcnRlZCB0aGlzIGxldmVsICovCi0JeGZzX2J0cmVlX2N1cl90CSpwY3VyOwkJLyogcHJldmlvdXMgbGV2ZWwncyBjdXJzb3IgKi8KLQotCWxldmVsID0gMDsKLQluYm5vID0gTlVMTEFHQkxPQ0s7Ci0JbnJlYy5hcl9zdGFydGJsb2NrID0gY3B1X3RvX2JlMzIoY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrKTsKLQlucmVjLmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMihjdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQpOwotCW5jdXIgPSBOVUxMOwotCXBjdXIgPSBjdXI7Ci0JLyoKLQkgKiBMb29wIGdvaW5nIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCB0aGUgbGVhZiBsZXZlbC4KLQkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ2V0IGEgc3BsaXQgYmxvY2ssIHRoYXQgbXVzdCBtZWFuIHRoYXQKLQkgKiB0aGUgaW5zZXJ0IGlzIGZpbmlzaGVkIHdpdGggdGhpcyBsZXZlbC4KLQkgKi8KLQlkbyB7Ci0JCS8qCi0JCSAqIEluc2VydCBucmVjL25ibm8gaW50byB0aGlzIGxldmVsIG9mIHRoZSB0cmVlLgotCQkgKiBOb3RlIGlmIHdlIGZhaWwsIG5ibm8gd2lsbCBiZSBudWxsLgotCQkgKi8KLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNyZWMocGN1ciwgbGV2ZWwrKywgJm5ibm8sICZucmVjLCAmbmN1ciwKLQkJCQkmaSkpKSB7Ci0JCQlpZiAocGN1ciAhPSBjdXIpCi0JCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQkvKgotCQkgKiBTZWUgaWYgdGhlIGN1cnNvciB3ZSBqdXN0IHVzZWQgaXMgdHJhc2guCi0JCSAqIENhbid0IHRyYXNoIHRoZSBjYWxsZXIncyBjdXJzb3IsIGJ1dCBvdGhlcndpc2Ugd2Ugc2hvdWxkCi0JCSAqIGlmIG5jdXIgaXMgYSBuZXcgY3Vyc29yIG9yIHdlJ3JlIGFib3V0IHRvIGJlIGRvbmUuCi0JCSAqLwotCQlpZiAocGN1ciAhPSBjdXIgJiYgKG5jdXIgfHwgbmJubyA9PSBOVUxMQUdCTE9DSykpIHsKLQkJCWN1ci0+YmNfbmxldmVscyA9IHBjdXItPmJjX25sZXZlbHM7Ci0JCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCX0KLQkJLyoKLQkJICogSWYgd2UgZ290IGEgbmV3IGN1cnNvciwgc3dpdGNoIHRvIGl0LgotCQkgKi8KLQkJaWYgKG5jdXIpIHsKLQkJCXBjdXIgPSBuY3VyOwotCQkJbmN1ciA9IE5VTEw7Ci0JCX0KLQl9IHdoaWxlIChuYm5vICE9IE5VTExBR0JMT0NLKTsKLQkqc3RhdCA9IGk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBMb29rdXAgdGhlIHJlY29yZCBlcXVhbCB0byBbYm5vLCBsZW5dIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY19sb29rdXBfZXEoCi0JeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLwotCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0JaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jayA9IGJubzsKLQljdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQgPSBsZW47Ci0JcmV0dXJuIHhmc19hbGxvY19sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0VRLCBzdGF0KTsKLX0KLQotLyoKLSAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCi0gKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgotICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYWxsb2NfbG9va3VwX2dlKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnYmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KLQl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLwotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2sgPSBibm87Ci0JY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50ID0gbGVuOwotCXJldHVybiB4ZnNfYWxsb2NfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9HRSwgc3RhdCk7Ci19Ci0KLS8qCi0gKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQotICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2FsbG9jX2xvb2t1cF9sZSgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2Jsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCi0JeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KLQlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrID0gYm5vOwotCWN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCA9IGxlbjsKLQlyZXR1cm4geGZzX2FsbG9jX2xvb2t1cChjdXIsIFhGU19MT09LVVBfTEUsIHN0YXQpOwotfQotCi0vKgotICogVXBkYXRlIHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgY3VyLCB0byB0aGUgdmFsdWUgZ2l2ZW4gYnkgW2JubywgbGVuXS4KLSAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19hbGxvY191cGRhdGUoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLwotCXhmc19leHRsZW5fdAkJbGVuKQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi17Ci0JeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayB0byB1cGRhdGUgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJcHRyOwkvKiBjdXJyZW50IHJlY29yZCBudW1iZXIgKHVwZGF0aW5nKSAqLwotCi0JQVNTRVJUKGxlbiA+IDApOwotCS8qCi0JICogUGljayB1cCB0aGUgYS5nLiBmcmVlbGlzdCBzdHJ1Y3QgYW5kIHRoZSBjdXJyZW50IGJsb2NrLgotCSAqLwotCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbMF0pOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgMCwgY3VyLT5iY19idWZzWzBdKSkpCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCS8qCi0JICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSByZWMgdG8gYmUgdXBkYXRlZC4KLQkgKi8KLQlwdHIgPSBjdXItPmJjX3B0cnNbMF07Ci0JewotCQl4ZnNfYWxsb2NfcmVjX3QJCSpycDsJLyogcG9pbnRlciB0byB1cGRhdGVkIHJlY29yZCAqLwotCi0JCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCS8qCi0JCSAqIEZpbGwgaW4gdGhlIG5ldyBjb250ZW50cyBhbmQgbG9nIHRoZW0uCi0JCSAqLwotCQlycC0+YXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKGJubyk7Ci0JCXJwLT5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIobGVuKTsKLQkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgY3VyLT5iY19idWZzWzBdLCBwdHIsIHB0cik7Ci0JfQotCS8qCi0JICogSWYgaXQncyB0aGUgYnktc2l6ZSBidHJlZSBhbmQgaXQncyB0aGUgbGFzdCBsZWFmIGJsb2NrIGFuZAotCSAqIGl0J3MgdGhlIGxhc3QgcmVjb3JkLi4uIHRoZW4gdXBkYXRlIHRoZSBzaXplIG9mIHRoZSBsb25nZXN0Ci0JICogZXh0ZW50IGluIHRoZSBhLmcuLCB3aGljaCB3ZSBjYWNoZSBpbiB0aGUgYS5nLiBmcmVlbGlzdCBoZWFkZXIuCi0JICovCi0JaWYgKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0NOVCAmJgotCSAgICBiZTMyX3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLICYmCi0JICAgIHB0ciA9PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKLQkJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIGhlYWRlciAqLwotCQl4ZnNfYWdudW1iZXJfdAlzZXFubzsKLQotCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQkJc2Vxbm8gPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9zZXFubyk7Ci0JCWN1ci0+YmNfbXAtPm1fcGVyYWdbc2Vxbm9dLnBhZ2ZfbG9uZ2VzdCA9IGxlbjsKLQkJYWdmLT5hZ2ZfbG9uZ2VzdCA9IGNwdV90b19iZTMyKGxlbik7Ci0JCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCi0JCQlYRlNfQUdGX0xPTkdFU1QpOwotCX0KLQkvKgotCSAqIFVwZGF0aW5nIGZpcnN0IHJlY29yZCBpbiBsZWFmLiBQYXNzIG5ldyBrZXkgdmFsdWUgdXAgdG8gb3VyIHBhcmVudC4KLQkgKi8KLQlpZiAocHRyID09IDEpIHsKLQkJeGZzX2FsbG9jX2tleV90CWtleTsJLyoga2V5IGNvbnRhaW5pbmcgW2JubywgbGVuXSAqLwotCi0JCWtleS5hcl9zdGFydGJsb2NrID0gY3B1X3RvX2JlMzIoYm5vKTsKLQkJa2V5LmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOwotCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3VwZGtleShjdXIsICZrZXksIDEpKSkKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0JcmV0dXJuIDA7CisJaWYgKGxlYWYpCisJCXJldHVybiBibG9ja2xlbiAvIHNpemVvZih4ZnNfYWxsb2NfcmVjX3QpOworCXJldHVybiBibG9ja2xlbiAvIChzaXplb2YoeGZzX2FsbG9jX2tleV90KSArIHNpemVvZih4ZnNfYWxsb2NfcHRyX3QpKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaAppbmRleCA1YmQxYTJjLi5hNmNhYTAwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5oCkBAIC0yNCw3ICsyNCw2IEBACiAKIHN0cnVjdCB4ZnNfYnVmOwogc3RydWN0IHhmc19idHJlZV9jdXI7Ci1zdHJ1Y3QgeGZzX2J0cmVlX3NibG9jazsKIHN0cnVjdCB4ZnNfbW91bnQ7CiAKIC8qCkBAIC01MCwxNiArNDksNiBAQAogCiAvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KIHR5cGVkZWYgX19iZTMyIHhmc19hbGxvY19wdHJfdDsKLS8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCi10eXBlZGVmCXN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrIHhmc19hbGxvY19ibG9ja190OwotCi0jZGVmaW5lCVhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApCSgoeGZzX2FsbG9jX2Jsb2NrX3QgKilYRlNfQlVGX1BUUihicCkpCi0KLS8qCi0gKiBSZWFsIGJsb2NrIHN0cnVjdHVyZXMgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIGRpc2sgYmxvY2sgc2l6ZS4KLSAqLwotI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKSAoKGN1ciktPmJjX21wLT5tX2FsbG9jX214cltsZXYgIT0gMF0pCi0jZGVmaW5lCVhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldixjdXIpICgoY3VyKS0+YmNfbXAtPm1fYWxsb2NfbW5yW2xldiAhPSAwXSkKIAogLyoKICAqIE1pbmltdW0gYW5kIG1heGltdW0gYmxvY2tzaXplIGFuZCBzZWN0b3JzaXplLgpAQCAtODMsNzMgKzcyLDM5IEBACiAjZGVmaW5lCVhGU19DTlRfQkxPQ0sobXApCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0JOT19CTE9DSyhtcCkgKyAxKSkKIAogLyoKKyAqIEJ0cmVlIGJsb2NrIGhlYWRlciBzaXplIGRlcGVuZHMgb24gYSBzdXBlcmJsb2NrIGZsYWcuCisgKgorICogKG5vdCBxdWl0ZSB5ZXQsIGJ1dCBzb29uKQorICovCisjZGVmaW5lIFhGU19BTExPQ19CTE9DS19MRU4obXApCVhGU19CVFJFRV9TQkxPQ0tfTEVOCisKKy8qCiAgKiBSZWNvcmQsIGtleSwgYW5kIHBvaW50ZXIgYWRkcmVzcyBtYWNyb3MgZm9yIGJ0cmVlIGJsb2Nrcy4KKyAqCisgKiAobm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgbWF5IGFwcGVhciB1bnVzZWQsIGJ1dCB0aGV5IGFyZSB1c2VkIGluIHVzZXJzcGFjZSkKICAqLwotI2RlZmluZQlYRlNfQUxMT0NfUkVDX0FERFIoYmIsaSxjdXIpCVwKLQlYRlNfQlRSRUVfUkVDX0FERFIoeGZzX2FsbG9jLCBiYiwgaSkKKyNkZWZpbmUgWEZTX0FMTE9DX1JFQ19BRERSKG1wLCBibG9jaywgaW5kZXgpIFwKKwkoKHhmc19hbGxvY19yZWNfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfQUxMT0NfQkxPQ0tfTEVOKG1wKSArIFwKKwkJICgoKGluZGV4KSAtIDEpICogc2l6ZW9mKHhmc19hbGxvY19yZWNfdCkpKSkKIAotI2RlZmluZQlYRlNfQUxMT0NfS0VZX0FERFIoYmIsaSxjdXIpCVwKLQlYRlNfQlRSRUVfS0VZX0FERFIoeGZzX2FsbG9jLCBiYiwgaSkKKyNkZWZpbmUgWEZTX0FMTE9DX0tFWV9BRERSKG1wLCBibG9jaywgaW5kZXgpIFwKKwkoKHhmc19hbGxvY19rZXlfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfQUxMT0NfQkxPQ0tfTEVOKG1wKSArIFwKKwkJICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2FsbG9jX2tleV90KSkpCiAKLSNkZWZpbmUJWEZTX0FMTE9DX1BUUl9BRERSKGJiLGksY3VyKQlcCi0JWEZTX0JUUkVFX1BUUl9BRERSKHhmc19hbGxvYywgYmIsIGksIFhGU19BTExPQ19CTE9DS19NQVhSRUNTKDEsIGN1cikpCisjZGVmaW5lIFhGU19BTExPQ19QVFJfQUREUihtcCwgYmxvY2ssIGluZGV4LCBtYXhyZWNzKSBcCisJKCh4ZnNfYWxsb2NfcHRyX3QgKikgXAorCQkoKGNoYXIgKikoYmxvY2spICsgXAorCQkgWEZTX0FMTE9DX0JMT0NLX0xFTihtcCkgKyBcCisJCSAobWF4cmVjcykgKiBzaXplb2YoeGZzX2FsbG9jX2tleV90KSArIFwKKwkJICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2FsbG9jX3B0cl90KSkpCiAKLS8qCi0gKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgotICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgotICovCi1leHRlcm4gaW50IHhmc19hbGxvY19kZWNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50IGxldmVsLCBpbnQgKnN0YXQpOwotCi0vKgotICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCi0gKiBUaGUgY3Vyc29yIHJlZmVycyB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlY29yZCB3YXMgKGNvdWxkIGJlIGluc2VydGVkKQotICogd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2FsbG9jX2RlbGV0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgKnN0YXQpOwotCi0vKgotICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgotICovCi1leHRlcm4gaW50IHhmc19hbGxvY19nZXRfcmVjKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsCXhmc19hZ2Jsb2NrX3QgKmJubywKLQkJCQl4ZnNfZXh0bGVuX3QgKmxlbiwgaW50ICpzdGF0KTsKLQotLyoKLSAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCi0gKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2FsbG9jX2luY3JlbWVudChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgbGV2ZWwsIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBJbnNlcnQgdGhlIGN1cnJlbnQgcmVjb3JkIGF0IHRoZSBwb2ludCByZWZlcmVuY2VkIGJ5IGN1ci4KLSAqIFRoZSBjdXJzb3IgbWF5IGJlIGluY29uc2lzdGVudCBvbiByZXR1cm4gaWYgc3BsaXRzIGhhdmUgYmVlbiBkb25lLgotICovCi1leHRlcm4gaW50IHhmc19hbGxvY19pbnNlcnQoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgaW50ICpzdGF0KTsKLQotLyoKLSAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIFtibm8sIGxlbl0gaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KLSAqLwotZXh0ZXJuIGludCB4ZnNfYWxsb2NfbG9va3VwX2VxKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2Jsb2NrX3QgYm5vLAotCQkJCXhmc19leHRsZW5fdCBsZW4sIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQotICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KLSAqLwotZXh0ZXJuIGludCB4ZnNfYWxsb2NfbG9va3VwX2dlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2Jsb2NrX3QgYm5vLAotCQkJCXhmc19leHRsZW5fdCBsZW4sIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQotICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KLSAqLwotZXh0ZXJuIGludCB4ZnNfYWxsb2NfbG9va3VwX2xlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2Jsb2NrX3QgYm5vLAotCQkJCXhmc19leHRsZW5fdCBsZW4sIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbiBieSBbYm5vLCBsZW5dLgotICogVGhpcyBlaXRoZXIgd29ya3MgKHJldHVybiAwKSBvciBnZXRzIGFuIEVGU0NPUlJVUFRFRCBlcnJvci4KLSAqLwotZXh0ZXJuIGludCB4ZnNfYWxsb2NfdXBkYXRlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2Jsb2NrX3QgYm5vLAotCQkJCXhmc19leHRsZW5fdCBsZW4pOworZXh0ZXJuIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICp4ZnNfYWxsb2NidF9pbml0X2N1cnNvcihzdHJ1Y3QgeGZzX21vdW50ICosCisJCXN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19idWYgKiwKKwkJeGZzX2FnbnVtYmVyX3QsIHhmc19idG51bV90KTsKK2V4dGVybiBpbnQgeGZzX2FsbG9jYnRfbWF4cmVjcyhzdHJ1Y3QgeGZzX21vdW50ICosIGludCwgaW50KTsKIAogI2VuZGlmCS8qIF9fWEZTX0FMTE9DX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hcmNoLmggYi9mcy94ZnMveGZzX2FyY2guaAppbmRleCAwYjNiNWVmLi41M2Q1ZTcwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FyY2guaAorKysgYi9mcy94ZnMveGZzX2FyY2guaApAQCAtNDEsMjEgKzQxLDM2IEBACiAjZW5kaWYKIAogI2lmZGVmIFhGU19OQVRJVkVfSE9TVAotI2RlZmluZSBjcHVfdG9fYmUxNih2YWwpCSgoX19iZTE2KSh2YWwpKQotI2RlZmluZSBjcHVfdG9fYmUzMih2YWwpCSgoX19iZTMyKSh2YWwpKQotI2RlZmluZSBjcHVfdG9fYmU2NCh2YWwpCSgoX19iZTY0KSh2YWwpKQotI2RlZmluZSBiZTE2X3RvX2NwdSh2YWwpCSgoX191aW50MTZfdCkodmFsKSkKLSNkZWZpbmUgYmUzMl90b19jcHUodmFsKQkoKF9fdWludDMyX3QpKHZhbCkpCi0jZGVmaW5lIGJlNjRfdG9fY3B1KHZhbCkJKChfX3VpbnQ2NF90KSh2YWwpKQorI2RlZmluZSBjcHVfdG9fYmUxNih2YWwpCSgoX19mb3JjZSBfX2JlMTYpKF9fdTE2KSh2YWwpKQorI2RlZmluZSBjcHVfdG9fYmUzMih2YWwpCSgoX19mb3JjZSBfX2JlMzIpKF9fdTMyKSh2YWwpKQorI2RlZmluZSBjcHVfdG9fYmU2NCh2YWwpCSgoX19mb3JjZSBfX2JlNjQpKF9fdTY0KSh2YWwpKQorI2RlZmluZSBiZTE2X3RvX2NwdSh2YWwpCSgoX19mb3JjZSBfX3UxNikoX19iZTE2KSh2YWwpKQorI2RlZmluZSBiZTMyX3RvX2NwdSh2YWwpCSgoX19mb3JjZSBfX3UzMikoX19iZTMyKSh2YWwpKQorI2RlZmluZSBiZTY0X3RvX2NwdSh2YWwpCSgoX19mb3JjZSBfX3U2NCkoX19iZTY0KSh2YWwpKQogI2Vsc2UKLSNkZWZpbmUgY3B1X3RvX2JlMTYodmFsKQkoX19zd2FiMTYoKF9fdWludDE2X3QpKHZhbCkpKQotI2RlZmluZSBjcHVfdG9fYmUzMih2YWwpCShfX3N3YWIzMigoX191aW50MzJfdCkodmFsKSkpCi0jZGVmaW5lIGNwdV90b19iZTY0KHZhbCkJKF9fc3dhYjY0KChfX3VpbnQ2NF90KSh2YWwpKSkKLSNkZWZpbmUgYmUxNl90b19jcHUodmFsKQkoX19zd2FiMTYoKF9fYmUxNikodmFsKSkpCi0jZGVmaW5lIGJlMzJfdG9fY3B1KHZhbCkJKF9fc3dhYjMyKChfX2JlMzIpKHZhbCkpKQotI2RlZmluZSBiZTY0X3RvX2NwdSh2YWwpCShfX3N3YWI2NCgoX19iZTY0KSh2YWwpKSkKKyNkZWZpbmUgY3B1X3RvX2JlMTYodmFsKQkoKF9fZm9yY2UgX19iZTE2KV9fc3dhYjE2KChfX3UxNikodmFsKSkpCisjZGVmaW5lIGNwdV90b19iZTMyKHZhbCkJKChfX2ZvcmNlIF9fYmUzMilfX3N3YWIzMigoX191MzIpKHZhbCkpKQorI2RlZmluZSBjcHVfdG9fYmU2NCh2YWwpCSgoX19mb3JjZSBfX2JlNjQpX19zd2FiNjQoKF9fdTY0KSh2YWwpKSkKKyNkZWZpbmUgYmUxNl90b19jcHUodmFsKQkoX19zd2FiMTYoKF9fZm9yY2UgX191MTYpKF9fYmUxNikodmFsKSkpCisjZGVmaW5lIGJlMzJfdG9fY3B1KHZhbCkJKF9fc3dhYjMyKChfX2ZvcmNlIF9fdTMyKShfX2JlMzIpKHZhbCkpKQorI2RlZmluZSBiZTY0X3RvX2NwdSh2YWwpCShfX3N3YWI2NCgoX19mb3JjZSBfX3U2NCkoX19iZTY0KSh2YWwpKSkKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgYmUxNl9hZGRfY3B1KF9fYmUxNiAqYSwgX19zMTYgYikKK3sKKwkqYSA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KCphKSArIGIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmUzMl9hZGRfY3B1KF9fYmUzMiAqYSwgX19zMzIgYikKK3sKKwkqYSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KCphKSArIGIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmU2NF9hZGRfY3B1KF9fYmU2NCAqYSwgX19zNjQgYikKK3sKKwkqYSA9IGNwdV90b19iZTY0KGJlNjRfdG9fY3B1KCphKSArIGIpOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAvKiBkbyB3ZSBuZWVkIGNvbnZlcnNpb24/ICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JpdC5oIGIvZnMveGZzL3hmc19iaXQuaAppbmRleCA4ZTBlNDYzLi5iY2E3YjI0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JpdC5oCisrKyBiL2ZzL3hmcy94ZnNfYml0LmgKQEAgLTYxLDggKzYxLDcgQEAKIC8qIEdldCBsb3cgYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLwogc3RhdGljIGlubGluZSBpbnQgeGZzX2xvd2JpdDMyKF9fdWludDMyX3QgdikKIHsKLQl1bnNpZ25lZCBsb25nCXQgPSB2OwotCXJldHVybiAodikgPyBmaW5kX2ZpcnN0X2JpdCgmdCwgMzIpIDogLTE7CisJcmV0dXJuIGZmcyh2KSAtIDE7CiB9CiAKIC8qIEdldCBsb3cgYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwppbmRleCBhMWFhYjkyLi4xMzgzMDhlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMveGZzX2JtYXAuYwpAQCAtMzkzLDggKzM5Myw4IEBACiAKIFNUQVRJQyB2b2lkCiB4ZnNfYm1hcF9kaXNrX2NvdW50X2xlYXZlcygKLQl4ZnNfZXh0bnVtX3QJCWlkeCwKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jaywKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywKIAlpbnQJCQludW1yZWNzLAogCWludAkJCSpjb3VudCk7CiAKQEAgLTQwMiw2ICs0MDIsNTMgQEAKICAqIEJtYXAgaW50ZXJuYWwgcm91dGluZXMuCiAgKi8KIAorU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbG9va3VwX2VxKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJeGZzX2ZpbGVvZmZfdAkJb2ZmLAorCXhmc19mc2Jsb2NrX3QJCWJubywKKwl4ZnNfZmlsYmxrc190CQlsZW4sCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRvZmYgPSBvZmY7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmIuYnJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2J0cmVlX2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOworfQorCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9sb29rdXBfZ2UoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl4ZnNfZmlsZW9mZl90CQlvZmYsCisJeGZzX2ZzYmxvY2tfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydG9mZiA9IG9mZjsKKwljdXItPmJjX3JlYy5iLmJyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYi5icl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYnRyZWVfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9HRSwgc3RhdCk7Cit9CisKKy8qCisqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciB0byB0aGUgdmFsdWUgZ2l2ZW4KKyAqIGJ5IFtvZmYsIGJubywgbGVuLCBzdGF0ZV0uCisgKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgorICovCitTVEFUSUMgaW50Cit4ZnNfYm1idF91cGRhdGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl4ZnNfZmlsZW9mZl90CQlvZmYsCisJeGZzX2ZzYmxvY2tfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwl4ZnNfZXhudHN0X3QJCXN0YXRlKQoreworCXVuaW9uIHhmc19idHJlZV9yZWMJcmVjOworCisJeGZzX2JtYnRfZGlza19zZXRfYWxsZigmcmVjLmJtYnQsIG9mZiwgYm5vLCBsZW4sIHN0YXRlKTsKKwlyZXR1cm4geGZzX2J0cmVlX3VwZGF0ZShjdXIsICZyZWMpOworfQorCiAvKgogICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBidHJlZSBmb3JtYXQgZmlsZXMuCiAgKi8KQEAgLTQyMiwxNSArNDY5LDE0IEBACiAJaWYgKGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzIDw9IFhGU19JRk9SS19EU0laRShpcCkpCiAJCSpmbGFncyB8PSBYRlNfSUxPR19EQlJPT1Q7CiAJZWxzZSB7Ci0JCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLCBpcCwKLQkJCVhGU19EQVRBX0ZPUkspOworCQljdXIgPSB4ZnNfYm1idF9pbml0X2N1cnNvcihtcCwgdHAsIGlwLCBYRlNfREFUQV9GT1JLKTsKIAkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKIAkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9ICpmaXJzdGJsb2NrOwogCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2dlKGN1ciwgMCwgMCwgMCwgJnN0YXQpKSkKIAkJCWdvdG8gZXJyb3IwOwogCQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBlbnRyeSAqLwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhzdGF0ID09IDEsIGVycm9yMCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9uZXdyb290KGN1ciwgZmxhZ3MsICZzdGF0KSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfbmV3X2lyb290KGN1ciwgZmxhZ3MsICZzdGF0KSkpCiAJCQlnb3RvIGVycm9yMDsKIAkJaWYgKHN0YXQgPT0gMCkgewogCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CkBAIC04MTgsMTAgKzg2NCwxMCBAQAogCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVsZXRlKGN1ciwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChjdXIsIDAsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLApAQCAtOTMxLDcgKzk3Nyw3IEBACiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKIAkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9CkBAIC0xMDA3LDcgKzEwNTMsNyBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZG9uZSk7CiAJCQljdXItPmJjX3JlYy5iLmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQpAQCAtMTA5Nyw3ICsxMTQzLDcgQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwogCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbnNlcnQoY3VyLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KQEAgLTExNTIsNyArMTE5OCw3IEBACiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKIAkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9CkBAIC0xMzc5LDE2ICsxNDI1LDE2IEBACiAJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY3VyLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjdXIsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKQEAgLTE0MjgsMTAgKzE0NzQsMTAgQEAKIAkJCQkJJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjdXIsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKQEAgLTE0NzEsMTAgKzE1MTcsMTAgQEAKIAkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjdXIsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKQEAgLTE1NTcsNyArMTYwMyw3IEBACiAJCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50LAogCQkJCW9sZGV4dCkpKQogCQkJCWdvdG8gZG9uZTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCWlmICh4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKQEAgLTE2MDUsNyArMTY1MSw3IEBACiAJCQkJb2xkZXh0KSkpCiAJCQkJZ290byBkb25lOwogCQkJY3VyLT5iY19yZWMuYiA9ICpuZXc7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9CkBAIC0xNjQ3LDcgKzE2OTMsNyBAQAogCQkJCVBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudCwKIAkJCQlvbGRleHQpKSkKIAkJCQlnb3RvIGRvbmU7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQluZXctPmJyX3N0YXJ0YmxvY2ssCkBAIC0xNjk1LDcgKzE3NDEsNyBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZG9uZSk7CiAJCQljdXItPmJjX3JlYy5iLmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQpAQCAtMTc0Myw3ICsxNzg5LDcgQEAKIAkJCWN1ci0+YmNfcmVjLmIgPSBQUkVWOwogCQkJY3VyLT5iY19yZWMuYi5icl9ibG9ja2NvdW50ID0KIAkJCQluZXctPmJyX3N0YXJ0b2ZmIC0gUFJFVi5icl9zdGFydG9mZjsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbnNlcnQoY3VyLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCQkvKgpAQCAtMTc1OCw3ICsxODA0LDcgQEAKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZG9uZSk7CiAJCQkvKiBuZXcgbWlkZGxlIGV4dGVudCAtIG5ld2V4dCAqLwogCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IG5ldy0+YnJfc3RhdGU7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9CkBAIC0yMTA2LDEwICsyMTUyLDEwIEBACiAJCQkJCXJpZ2h0LmJyX2Jsb2NrY291bnQsICZpKSkpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY3VyLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIGxlZnQuYnJfc3RhcnRvZmYsCkBAIC0yMjE4LDcgKzIyNjQsNyBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZG9uZSk7CiAJCQljdXItPmJjX3JlYy5iLmJyX3N0YXRlID0gbmV3LT5icl9zdGF0ZTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbnNlcnQoY3VyLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KQEAgLTI5OTYsMjQgKzMwNDIsMjQgQEAKIAlpbnQJCQl3aGljaGZvcmspICAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwogewogCS8qIFJFRkVSRU5DRUQgKi8KLQl4ZnNfYm1idF9ibG9ja190CSpjYmxvY2s7LyogY2hpbGQgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpjYmxvY2s7LyogY2hpbGQgYnRyZWUgYmxvY2sgKi8KIAl4ZnNfZnNibG9ja190CQljYm5vOwkvKiBjaGlsZCBibG9jayBudW1iZXIgKi8KIAl4ZnNfYnVmX3QJCSpjYnA7CS8qIGNoaWxkIGJsb2NrJ3MgYnVmZmVyICovCiAJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwogCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIGRhdGEgKi8KIAl4ZnNfbW91bnRfdAkJKm1wOwkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KIAlfX2JlNjQJCQkqcHA7CS8qIHB0ciB0byBibG9jayBhZGRyZXNzICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqcmJsb2NrOy8qIHJvb3QgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpyYmxvY2s7Lyogcm9vdCBidHJlZSBibG9jayAqLwogCisJbXAgPSBpcC0+aV9tb3VudDsKIAlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwogCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUyk7CiAJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpOwogCXJibG9jayA9IGlmcC0+aWZfYnJvb3Q7CiAJQVNTRVJUKGJlMTZfdG9fY3B1KHJibG9jay0+YmJfbGV2ZWwpID09IDEpOwogCUFTU0VSVChiZTE2X3RvX2NwdShyYmxvY2stPmJiX251bXJlY3MpID09IDEpOwotCUFTU0VSVChYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpID09IDEpOwotCW1wID0gaXAtPmlfbW91bnQ7Ci0JcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCUFTU0VSVCh4ZnNfYm1idF9tYXhyZWNzKG1wLCBpZnAtPmlmX2Jyb290X2J5dGVzLCAwKSA9PSAxKTsKKwlwcCA9IFhGU19CTUFQX0JST09UX1BUUl9BRERSKG1wLCByYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCWNibm8gPSBiZTY0X3RvX2NwdSgqcHApOwogCSpsb2dmbGFnc3AgPSAwOwogI2lmZGVmIERFQlVHCkBAIC0zMDIzLDggKzMwNjksOCBAQAogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgY2JubywgMCwgJmNicCwKIAkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQogCQlyZXR1cm4gZXJyb3I7Ci0JY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGNicCk7Ci0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBjYmxvY2ssIDAsIGNicCkpKQorCWNibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soY2JwKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgY2Jsb2NrLCAwLCBjYnApKSkKIAkJcmV0dXJuIGVycm9yOwogCXhmc19ibWFwX2FkZF9mcmVlKGNibm8sIDEsIGN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0LCBtcCk7CiAJaXAtPmlfZC5kaV9uYmxvY2tzLS07CkBAIC0zMTcwLDcgKzMyMTYsNyBAQAogCQkJZmxhZ3MgfD0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVsZXRlKGN1ciwgJmkpKSkKIAkJCWdvdG8gZG9uZTsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJYnJlYWs7CkBAIC0zMjU0LDEwICszMzAwLDEwIEBACiAJCQkJCQlnb3QuYnJfc3RhcnRibG9jaywgdGVtcCwKIAkJCQkJCWdvdC5icl9zdGF0ZSkpKQogCQkJCQlnb3RvIGRvbmU7Ci0JCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCQlnb3RvIGRvbmU7CiAJCQkJY3VyLT5iY19yZWMuYiA9IG5ldzsKLQkJCQllcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKTsKKwkJCQllcnJvciA9IHhmc19idHJlZV9pbnNlcnQoY3VyLCAmaSk7CiAJCQkJaWYgKGVycm9yICYmIGVycm9yICE9IEVOT1NQQykKIAkJCQkJZ290byBkb25lOwogCQkJCS8qCkBAIC0zNDA0LDExICszNDUwLDExIEBACiAJaW50CQkJKmxvZ2ZsYWdzcCwJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwogCWludAkJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIHsKLQl4ZnNfYm1idF9ibG9ja190CSphYmxvY2s7CS8qIGFsbG9jYXRlZCAoY2hpbGQpIGJ0IGJsb2NrICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYWJsb2NrOwkvKiBhbGxvY2F0ZWQgKGNoaWxkKSBidCBibG9jayAqLwogCXhmc19idWZfdAkJKmFicDsJCS8qIGJ1ZmZlciBmb3IgYWJsb2NrICovCiAJeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkJLyogYWxsb2NhdGlvbiBhcmd1bWVudHMgKi8KIAl4ZnNfYm1idF9yZWNfdAkJKmFycDsJCS8qIGNoaWxkIHJlY29yZCBwb2ludGVyICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CQkvKiBidHJlZSByb290IGJsb2NrICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CQkvKiBidHJlZSByb290IGJsb2NrICovCiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KIAl4ZnNfYm1idF9yZWNfaG9zdF90CSplcDsJCS8qIGV4dGVudCByZWNvcmQgcG9pbnRlciAqLwogCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCkBAIC0zNDI4LDYgKzM0NzQsNyBAQAogCSAqLwogCXhmc19pcm9vdF9yZWFsbG9jKGlwLCAxLCB3aGljaGZvcmspOwogCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGQlJPT1Q7CisKIAkvKgogCSAqIEZpbGwgaW4gdGhlIHJvb3QuCiAJICovCkBAIC0zNDM1LDE0ICszNDgyLDE0IEBACiAJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0JNQVBfTUFHSUMpOwogCWJsb2NrLT5iYl9sZXZlbCA9IGNwdV90b19iZTE2KDEpOwogCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMSk7Ci0JYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKLQlibG9jay0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7CisKIAkvKgogCSAqIE5lZWQgYSBjdXJzb3IuICBDYW4ndCBhbGxvY2F0ZSB1bnRpbCBiYl9sZXZlbCBpcyBmaWxsZWQgaW4uCiAJICovCiAJbXAgPSBpcC0+aV9tb3VudDsKLQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwgaXAsCi0JCXdoaWNoZm9yayk7CisJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IobXAsIHRwLCBpcCwgd2hpY2hmb3JrKTsKIAljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CiAJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKIAljdXItPmJjX3ByaXZhdGUuYi5mbGFncyA9IHdhc2RlbCA/IFhGU19CVENVUl9CUFJWX1dBU0RFTCA6IDA7CkBAIC0zNDg5LDEyICszNTM2LDEyIEBACiAJLyoKIAkgKiBGaWxsIGluIHRoZSBjaGlsZCBibG9jay4KIAkgKi8KLQlhYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYWJwKTsKKwlhYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGFicCk7CiAJYWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19CTUFQX01BR0lDKTsKIAlhYmxvY2stPmJiX2xldmVsID0gMDsKLQlhYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKLQlhYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7Ci0JYXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGFibG9jaywgMSwgY3VyKTsKKwlhYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7CisJYWJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlhcnAgPSBYRlNfQk1CVF9SRUNfQUREUihtcCwgYWJsb2NrLCAxKTsKIAluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCWZvciAoY250ID0gaSA9IDA7IGkgPCBuZXh0ZW50czsgaSsrKSB7CiAJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGkpOwpAQCAtMzUwNSwyMSArMzU1MiwyNCBAQAogCQl9CiAJfQogCUFTU0VSVChjbnQgPT0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspKTsKLQlhYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihjbnQpOworCXhmc19idHJlZV9zZXRfbnVtcmVjcyhhYmxvY2ssIGNudCk7CisKIAkvKgogCSAqIEZpbGwgaW4gdGhlIHJvb3Qga2V5IGFuZCBwb2ludGVyLgogCSAqLwotCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotCWFycCA9IFhGU19CTUFQX1JFQ19JQUREUihhYmxvY2ssIDEsIGN1cik7CisJa3AgPSBYRlNfQk1CVF9LRVlfQUREUihtcCwgYmxvY2ssIDEpOworCWFycCA9IFhGU19CTUJUX1JFQ19BRERSKG1wLCBhYmxvY2ssIDEpOwogCWtwLT5icl9zdGFydG9mZiA9IGNwdV90b19iZTY0KHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKGFycCkpOwotCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCXBwID0gWEZTX0JNQlRfUFRSX0FERFIobXAsIGJsb2NrLCAxLCB4ZnNfYm1idF9nZXRfbWF4cmVjcyhjdXIsCisJCQkJCQliZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpKSk7CiAJKnBwID0gY3B1X3RvX2JlNjQoYXJncy5mc2Jubyk7CisKIAkvKgogCSAqIERvIGFsbCB0aGlzIGxvZ2dpbmcgYXQgdGhlIGVuZCBzbyB0aGF0CiAJICogdGhlIHJvb3QgaXMgYXQgdGhlIHJpZ2h0IGxldmVsLgogCSAqLwotCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGFicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGFicCwgMSwgYmUxNl90b19jcHUoYWJsb2NrLT5iYl9udW1yZWNzKSk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGFicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfYnRyZWVfbG9nX3JlY3MoY3VyLCBhYnAsIDEsIGJlMTZfdG9fY3B1KGFibG9jay0+YmJfbnVtcmVjcykpOwogCUFTU0VSVCgqY3VycCA9PSBOVUxMKTsKIAkqY3VycCA9IGN1cjsKIAkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspOwpAQCAtNDE3Niw3ICs0MjI2LDcgQEAKIAkJbWF4bGVhZmVudHMgPSBNQVhBRVhUTlVNOwogCQlzeiA9IFhGU19CTURSX1NQQUNFX0NBTEMoTUlOQUJUUFRSUyk7CiAJfQotCW1heHJvb3RyZWNzID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhzeiwgeGZzX2JtZHIsIDApOworCW1heHJvb3RyZWNzID0geGZzX2JtZHJfbWF4cmVjcyhtcCwgc3osIDApOwogCW1pbmxlYWZyZWNzID0gbXAtPm1fYm1hcF9kbW5yWzBdOwogCW1pbm5vZGVyZWNzID0gbXAtPm1fYm1hcF9kbW5yWzFdOwogCW1heGJsb2NrcyA9IChtYXhsZWFmZW50cyArIG1pbmxlYWZyZWNzIC0gMSkgLyBtaW5sZWFmcmVjczsKQEAgLTQyNDIsOSArNDI5MiwxNSBAQAogCSAqIFdlIGhhdmUgYSBuZXcgdHJhbnNhY3Rpb24sIHNvIHdlIHNob3VsZCByZXR1cm4gY29tbWl0dGVkPTEsCiAJICogZXZlbiB0aG91Z2ggd2UncmUgcmV0dXJuaW5nIGFuIGVycm9yLgogCSAqLwotCWlmIChlcnJvcikgeworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCX0KKworCS8qCisJICogdHJhbnNhY3Rpb24gY29tbWl0IHdvcmtlZCBvayBzbyB3ZSBjYW4gZHJvcCB0aGUgZXh0cmEgdGlja2V0CisJICogcmVmZXJlbmNlIHRoYXQgd2UgZ2FpbmVkIGluIHhmc190cmFuc19kdXAoKQorCSAqLworCXhmc19sb2dfdGlja2V0X3B1dChudHAtPnRfdGlja2V0KTsKKwogCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZShudHAsIDAsIGxvZ3JlcywgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKIAkJCWxvZ2NvdW50KSkpCiAJCXJldHVybiBlcnJvcjsKQEAgLTQ0NzQsNiArNDUzMCwyMiBAQAogCXJldHVybiBydmFsOwogfQogCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9zYW5pdHlfY2hlY2soCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJc3RydWN0IHhmc19idWYJCSpicCwKKwlpbnQJCQlsZXZlbCkKK3sKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICAqYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKKworCWlmIChiZTMyX3RvX2NwdShibG9jay0+YmJfbWFnaWMpICE9IFhGU19CTUFQX01BR0lDIHx8CisJICAgIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCkgIT0gbGV2ZWwgfHwKKwkgICAgYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID09IDAgfHwKKwkgICAgYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID4gbXAtPm1fYm1hcF9kbXhyW2xldmVsICE9IDBdKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwogLyoKICAqIFJlYWQgaW4gdGhlIGV4dGVudHMgdG8gaWZfZXh0ZW50cy4KICAqIEFsbCBpbm9kZSBmaWVsZHMgYXJlIHNldCB1cCBieSBjYWxsZXIsIHdlIGp1c3QgdHJhdmVyc2UgdGhlIGJ0cmVlCkBAIC00NDg2LDcgKzQ1NTgsNyBAQAogCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSAqLwogCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIHsKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJLyogY3VycmVudCBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCiAJeGZzX2ZzYmxvY2tfdAkJYm5vOwkvKiBibG9jayAjIG9mICJibG9jayIgKi8KIAl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciAiYmxvY2siICovCiAJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwpAQCAtNDUxMCw3ICs0NTgyLDcgQEAKIAkgKi8KIAlsZXZlbCA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCk7CiAJQVNTRVJUKGxldmVsID4gMCk7Ci0JcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihtcCwgYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCWJubyA9IGJlNjRfdG9fY3B1KCpwcCk7CiAJQVNTRVJUKGJubyAhPSBOVUxMREZTQk5PKTsKIAlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBibm8pIDwgbXAtPm1fc2Iuc2JfYWdjb3VudCk7CkBAIC00NTIzLDEzICs0NTk1LDEzIEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsCiAJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCi0JCQlYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsIGJsb2NrLCBsZXZlbCksCisJCQl4ZnNfYm1hcF9zYW5pdHlfY2hlY2sobXAsIGJwLCBsZXZlbCksCiAJCQllcnJvcjApOwogCQlpZiAobGV2ZWwgPT0gMCkKIAkJCWJyZWFrOwotCQlwcCA9IFhGU19CVFJFRV9QVFJfQUREUih4ZnNfYm1idCwgYmxvY2ssIDEsIG1wLT5tX2JtYXBfZG14clsxXSk7CisJCXBwID0gWEZTX0JNQlRfUFRSX0FERFIobXAsIGJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMV0pOwogCQlibm8gPSBiZTY0X3RvX2NwdSgqcHApOwogCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgYm5vKSwgZXJyb3IwKTsKIAkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwpAQCAtNDU0OSw3ICs0NjIxLDcgQEAKIAkJeGZzX2V4dG51bV90CXN0YXJ0OwogCiAKLQkJbnVtX3JlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7CisJCW51bV9yZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGJsb2NrKTsKIAkJaWYgKHVubGlrZWx5KGkgKyBudW1fcmVjcyA+IHJvb20pKSB7CiAJCQlBU1NFUlQoaSArIG51bV9yZWNzIDw9IHJvb20pOwogCQkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LApAQCAtNDU2MSwxOCArNDYzMywxOCBAQAogCQkJZ290byBlcnJvcjA7CiAJCX0KIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCi0JCQlYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsIGJsb2NrLCAwKSwKKwkJCXhmc19ibWFwX3Nhbml0eV9jaGVjayhtcCwgYnAsIDApLAogCQkJZXJyb3IwKTsKIAkJLyoKIAkJICogUmVhZC1haGVhZCB0aGUgbmV4dCBsZWFmIGJsb2NrLCBpZiBhbnkuCiAJCSAqLwotCQluZXh0Ym5vID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKTsKKwkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpOwogCQlpZiAobmV4dGJubyAhPSBOVUxMRlNCTE9DSykKIAkJCXhmc19idHJlZV9yZWFkYV9idWZsKG1wLCBuZXh0Ym5vLCAxKTsKIAkJLyoKIAkJICogQ29weSByZWNvcmRzIGludG8gdGhlIGV4dGVudCByZWNvcmRzLgogCQkgKi8KLQkJZnJwID0gWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LCBibG9jaywgMSk7CisJCWZycCA9IFhGU19CTUJUX1JFQ19BRERSKG1wLCBibG9jaywgMSk7CiAJCXN0YXJ0ID0gaTsKIAkJZm9yIChqID0gMDsgaiA8IG51bV9yZWNzOyBqKyssIGkrKywgZnJwKyspIHsKIAkJCXhmc19ibWJ0X3JlY19ob3N0X3QgKnRycCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBpKTsKQEAgLTQ2MDMsNyArNDY3NSw3IEBACiAJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsCiAJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAl9CiAJQVNTRVJUKGkgPT0gKGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSk7CiAJQVNTRVJUKGkgPT0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspKTsKQEAgLTUwMjksOCArNTEwMSw3IEBACiAJCQkJaWYgKGFibm8gPT0gTlVMTEZTQkxPQ0spCiAJCQkJCWJyZWFrOwogCQkJCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhY3VyKSB7Ci0JCQkJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwKLQkJCQkJCXRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwKKwkJCQkJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IobXAsIHRwLAogCQkJCQkJaXAsIHdoaWNoZm9yayk7CiAJCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPQogCQkJCQkJKmZpcnN0YmxvY2s7CkBAIC01MTQ3LDkgKzUyMTgsOCBAQAogCQkJICovCiAJCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA8PSBsZW4pOwogCQkJaWYgKChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpICYmICFjdXIpIHsKLQkJCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsCi0JCQkJCXRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwKLQkJCQkJaXAsIHdoaWNoZm9yayk7CisJCQkJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IobXAsCisJCQkJCXRwLCBpcCwgd2hpY2hmb3JrKTsKIAkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KIAkJCQkJKmZpcnN0YmxvY2s7CiAJCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKQEAgLTU0NDAsOCArNTUxMCw3IEBACiAJbG9nZmxhZ3MgPSAwOwogCWlmIChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpIHsKIAkJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpOwotCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwgaXAsCi0JCQl3aGljaGZvcmspOworCQljdXIgPSB4ZnNfYm1idF9pbml0X2N1cnNvcihtcCwgdHAsIGlwLCB3aGljaGZvcmspOwogCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CiAJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gZmxpc3Q7CiAJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0gMDsKQEAgLTU3NDIsMTQgKzU4MTEsMTcgQEAKIFNUQVRJQyBpbnQKIHhmc19nZXRibWFweF9maXhfZW9mX2hvbGUoCiAJeGZzX2lub2RlX3QJCSppcCwJCS8qIHhmcyBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXN0cnVjdCBnZXRibWFwCQkqb3V0LAkJLyogb3V0cHV0IHN0cnVjdHVyZSAqLworCXN0cnVjdCBnZXRibWFweAkJKm91dCwJCS8qIG91dHB1dCBzdHJ1Y3R1cmUgKi8KIAlpbnQJCQlwcmVhbGxvY2VkLAkvKiB0aGlzIGlzIGEgZmlsZSB3aXRoCi0JCQkJCQkqIHByZWFsbG9jYXRlZCBkYXRhIHNwYWNlICovCisJCQkJCQkgKiBwcmVhbGxvY2F0ZWQgZGF0YSBzcGFjZSAqLwogCV9faW50NjRfdAkJZW5kLAkJLyogbGFzdCBibG9jayByZXF1ZXN0ZWQgKi8KIAl4ZnNfZnNibG9ja190CQlzdGFydGJsb2NrKQogewogCV9faW50NjRfdAkJZml4bGVuOwogCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19pZm9ya190CQkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlsYXN0eDsJCS8qIGxhc3QgZXh0ZW50IHBvaW50ZXIgKi8KKwl4ZnNfZmlsZW9mZl90CQlmaWxlYmxvY2s7CiAKIAlpZiAoc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgewogCQltcCA9IGlwLT5pX21vdW50OwpAQCAtNTc2MywyMSArNTgzNSwzMyBAQAogCQkJb3V0LT5ibXZfbGVuZ3RoID0gZml4bGVuOwogCQl9CiAJfSBlbHNlIHsKLQkJb3V0LT5ibXZfYmxvY2sgPSBYRlNfRlNCX1RPX0RCKGlwLCBzdGFydGJsb2NrKTsKKwkJaWYgKHN0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKQorCQkJb3V0LT5ibXZfYmxvY2sgPSAtMjsKKwkJZWxzZQorCQkJb3V0LT5ibXZfYmxvY2sgPSBYRlNfRlNCX1RPX0RCKGlwLCBzdGFydGJsb2NrKTsKKwkJZmlsZWJsb2NrID0gWEZTX0JCX1RPX0ZTQihpcC0+aV9tb3VudCwgb3V0LT5ibXZfb2Zmc2V0KTsKKwkJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisJCWlmICh4ZnNfaWV4dF9ibm9fdG9fZXh0KGlmcCwgZmlsZWJsb2NrLCAmbGFzdHgpICYmCisJCSAgIChsYXN0eCA9PSAoaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpLTEpKQorCQkJb3V0LT5ibXZfb2ZsYWdzIHw9IEJNVl9PRl9MQVNUOwogCX0KIAogCXJldHVybiAxOwogfQogCiAvKgotICogRmNudGwgaW50ZXJmYWNlIHRvIHhmc19ibWFwaS4KKyAqIEdldCBpbm9kZSdzIGV4dGVudHMgYXMgZGVzY3JpYmVkIGluIGJtdiwgYW5kIGZvcm1hdCBmb3Igb3V0cHV0LgorICogQ2FsbHMgZm9ybWF0dGVyIHRvIGZpbGwgdGhlIHVzZXIncyBidWZmZXIgdW50aWwgYWxsIGV4dGVudHMKKyAqIGFyZSBtYXBwZWQsIHVudGlsIHRoZSBwYXNzZWQtaW4gYm12LT5ibXZfY291bnQgc2xvdHMgaGF2ZQorICogYmVlbiBmaWxsZWQsIG9yIHVudGlsIHRoZSBmb3JtYXR0ZXIgc2hvcnQtY2lyY3VpdHMgdGhlIGxvb3AsCisgKiBpZiBpdCBpcyB0cmFja2luZyBmaWxsZWQtaW4gZXh0ZW50cyBvbiBpdHMgb3duLgogICovCiBpbnQJCQkJCQkvKiBlcnJvciBjb2RlICovCiB4ZnNfZ2V0Ym1hcCgKIAl4ZnNfaW5vZGVfdAkJKmlwLAotCXN0cnVjdCBnZXRibWFwCQkqYm12LAkJLyogdXNlciBibWFwIHN0cnVjdHVyZSAqLwotCXZvaWQJCQlfX3VzZXIgKmFwLAkvKiBwb2ludGVyIHRvIHVzZXIncyBhcnJheSAqLwotCWludAkJCWludGVyZmFjZSkJLyogaW50ZXJmYWNlIGZsYWdzICovCisJc3RydWN0IGdldGJtYXB4CQkqYm12LAkJLyogdXNlciBibWFwIHN0cnVjdHVyZSAqLworCXhmc19ibWFwX2Zvcm1hdF90CWZvcm1hdHRlciwJLyogZm9ybWF0IHRvIHVzZXIgKi8KKwl2b2lkCQkJKmFyZykJCS8qIGZvcm1hdHRlciBhcmcgKi8KIHsKIAlfX2ludDY0X3QJCWJtdmVuZDsJCS8qIGxhc3QgYmxvY2sgcmVxdWVzdGVkICovCiAJaW50CQkJZXJyb3I7CQkvKiByZXR1cm4gdmFsdWUgKi8KQEAgLTU3OTAsMTkgKzU4NzQsMTcgQEAKIAlpbnQJCQluZXhsZWZ0OwkvKiAjIG9mIHVzZXIgZXh0ZW50cyBsZWZ0ICovCiAJaW50CQkJc3VibmV4OwkJLyogIyBvZiBibWFwaSdzIGNhbiBkbyAqLwogCWludAkJCW5tYXA7CQkvKiBudW1iZXIgb2YgbWFwIGVudHJpZXMgKi8KLQlzdHJ1Y3QgZ2V0Ym1hcAkJb3V0OwkJLyogb3V0cHV0IHN0cnVjdHVyZSAqLworCXN0cnVjdCBnZXRibWFweAkJb3V0OwkJLyogb3V0cHV0IHN0cnVjdHVyZSAqLwogCWludAkJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIAlpbnQJCQlwcmVhbGxvY2VkOwkvKiB0aGlzIGlzIGEgZmlsZSB3aXRoCiAJCQkJCQkgKiBwcmVhbGxvY2F0ZWQgZGF0YSBzcGFjZSAqLwotCWludAkJCXNoX3Vud3JpdHRlbjsJLyogdHJ1ZSwgaWYgdW53cml0dGVuICovCi0JCQkJCQkvKiBleHRlbnRzIGxpc3RlZCBzZXBhcmF0ZWx5ICovCisJaW50CQkJaWZsYWdzOwkJLyogaW50ZXJmYWNlIGZsYWdzICovCiAJaW50CQkJYm1hcGlfZmxhZ3M7CS8qIGZsYWdzIGZvciB4ZnNfYm1hcGkgKi8KLQlfX2ludDMyX3QJCW9mbGFnczsJCS8qIGdldGJtYXB4IGJtdl9vZmxhZ3MgZmllbGQgKi8KIAogCW1wID0gaXAtPmlfbW91bnQ7CisJaWZsYWdzID0gYm12LT5ibXZfaWZsYWdzOwogCi0Jd2hpY2hmb3JrID0gaW50ZXJmYWNlICYgQk1WX0lGX0FUVFJGT1JLID8gWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7Ci0Jc2hfdW53cml0dGVuID0gKGludGVyZmFjZSAmIEJNVl9JRl9QUkVBTExPQykgIT0gMDsKKwl3aGljaGZvcmsgPSBpZmxhZ3MgJiBCTVZfSUZfQVRUUkZPUksgPyBYRlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKIAogCS8qCUlmIHRoZSBCTVZfSUZfTk9fRE1BUElfUkVBRCBpbnRlcmZhY2UgYml0IHNwZWNpZmllZCwgZG8gbm90CiAJICoJZ2VuZXJhdGUgYSBETUFQSSByZWFkIGV2ZW50LiAgT3RoZXJ3aXNlLCBpZiB0aGUgRE1fRVZFTlRfUkVBRApAQCAtNTgxNyw3ICs1ODk5LDcgQEAKIAkgKgljb3VsZCBtaXNpbnRlcnByZXQgaG9sZXMgaW4gYSBETUFQSSBmaWxlIGFzIHRydWUgaG9sZXMsCiAJICoJd2hlbiBpbiBmYWN0IHRoZXkgbWF5IHJlcHJlc2VudCBvZmZsaW5lIHVzZXIgZGF0YS4KIAkgKi8KLQlpZiAoKGludGVyZmFjZSAmIEJNVl9JRl9OT19ETUFQSV9SRUFEKSA9PSAwICYmCisJaWYgKChpZmxhZ3MgJiBCTVZfSUZfTk9fRE1BUElfUkVBRCkgPT0gMCAmJgogCSAgICBETV9FVkVOVF9FTkFCTEVEKGlwLCBETV9FVkVOVF9SRUFEKSAmJgogCSAgICB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgewogCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsIGlwLCAwLCAwLCAwLCBOVUxMKTsKQEAgLTU4NzMsOCArNTk1NSw5IEBACiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAotCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyAmJgotCQkoaXAtPmlfZGVsYXllZF9ibGtzIHx8IGlwLT5pX3NpemUgPiBpcC0+aV9kLmRpX3NpemUpKSB7CisJaWYgKCgoaWZsYWdzICYgQk1WX0lGX0RFTEFMTE9DKSA9PSAwKSAmJgorCSAgICAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspICYmCisJICAgIChpcC0+aV9kZWxheWVkX2Jsa3MgfHwgaXAtPmlfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSkpIHsKIAkJLyogeGZzX2ZzaXplX3QgbGFzdF9ieXRlID0geGZzX2ZpbGVfbGFzdF9ieXRlKGlwKTsgKi8KIAkJZXJyb3IgPSB4ZnNfZmx1c2hfcGFnZXMoaXAsICh4ZnNfb2ZmX3QpMCwKIAkJCQkJICAgICAgIC0xLCAwLCBGSV9SRU1BUEYpOwpAQCAtNTg4NCw3ICs1OTY3LDggQEAKIAkJfQogCX0KIAotCUFTU0VSVCh3aGljaGZvcmsgPT0gWEZTX0FUVFJfRk9SSyB8fCBpcC0+aV9kZWxheWVkX2Jsa3MgPT0gMCk7CisJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLIHx8IChpZmxhZ3MgJiBCTVZfSUZfREVMQUxMT0MpIHx8CisJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKIAogCWxvY2sgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChpcCk7CiAKQEAgLTU4OTYsNyArNTk4MCw3IEBACiAJCW5leCA9IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSAqIDIgKyAxOwogCiAJYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfQUZMQUcod2hpY2hmb3JrKSB8Ci0JCQkoKHNoX3Vud3JpdHRlbikgPyAwIDogWEZTX0JNQVBJX0lHU1RBVEUpOworCQkJKChpZmxhZ3MgJiBCTVZfSUZfUFJFQUxMT0MpID8gMCA6IFhGU19CTUFQSV9JR1NUQVRFKTsKIAogCS8qCiAJICogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIHRvIGhhbmRsZSAic3VibmV4IiBtYXBzIGF0IGEgdGltZS4KQEAgLTU5MDYsOSArNTk5MCwxMiBAQAogCiAJYm12LT5ibXZfZW50cmllcyA9IDA7CiAKLQlpZiAoWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID09IDApIHsKLQkJZXJyb3IgPSAwOwotCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCWlmICgoWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID09IDApKSB7CisJCWlmICgoKGlmbGFncyAmIEJNVl9JRl9ERUxBTExPQykgPT0gMCkgfHwKKwkJICAgIHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB7CisJCQllcnJvciA9IDA7CisJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCQl9CiAJfQogCiAJbmV4bGVmdCA9IG5leDsKQEAgLTU5MjQsNTIgKzYwMTEsNDAgQEAKIAkJQVNTRVJUKG5tYXAgPD0gc3VibmV4KTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbm1hcCAmJiBuZXhsZWZ0ICYmIGJtdi0+Ym12X2xlbmd0aDsgaSsrKSB7Ci0JCQluZXhsZWZ0LS07Ci0JCQlvZmxhZ3MgPSAobWFwW2ldLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKSA/Ci0JCQkJCUJNVl9PRl9QUkVBTExPQyA6IDA7CisJCQlvdXQuYm12X29mbGFncyA9IDA7CisJCQlpZiAobWFwW2ldLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQorCQkJCW91dC5ibXZfb2ZsYWdzIHw9IEJNVl9PRl9QUkVBTExPQzsKKwkJCWVsc2UgaWYgKG1hcFtpXS5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSykKKwkJCQlvdXQuYm12X29mbGFncyB8PSBCTVZfT0ZfREVMQUxMT0M7CiAJCQlvdXQuYm12X29mZnNldCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcFtpXS5icl9zdGFydG9mZik7CiAJCQlvdXQuYm12X2xlbmd0aCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcFtpXS5icl9ibG9ja2NvdW50KTsKLQkJCUFTU0VSVChtYXBbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOworCQkJb3V0LmJtdl91bnVzZWQxID0gb3V0LmJtdl91bnVzZWQyID0gMDsKKwkJCUFTU0VSVCgoKGlmbGFncyAmIEJNVl9JRl9ERUxBTExPQykgIT0gMCkgfHwKKwkJCSAgICAgIChtYXBbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBbaV0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyAmJgogCQkJICAgIHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB7CiAJCQkJLyogY2FtZSB0byB0aGUgZW5kIG9mIGF0dHJpYnV0ZSBmb3JrICovCisJCQkJb3V0LmJtdl9vZmxhZ3MgfD0gQk1WX09GX0xBU1Q7CiAJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKIAkJCX0gZWxzZSB7CisJCQkJaW50IGZ1bGwgPSAwOwkvKiB1c2VyIGFycmF5IGlzIGZ1bGwgKi8KKwogCQkJCWlmICgheGZzX2dldGJtYXB4X2ZpeF9lb2ZfaG9sZShpcCwgJm91dCwKIAkJCQkJCQlwcmVhbGxvY2VkLCBibXZlbmQsCiAJCQkJCQkJbWFwW2ldLmJyX3N0YXJ0YmxvY2spKSB7CiAJCQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAJCQkJfQogCi0JCQkJLyogcmV0dXJuIGVpdGhlciBnZXRibWFwL2dldGJtYXB4IHN0cnVjdHVyZS4gKi8KLQkJCQlpZiAoaW50ZXJmYWNlICYgQk1WX0lGX0VYVEVOREVEKSB7Ci0JCQkJCXN0cnVjdAlnZXRibWFweAlvdXR4OwotCi0JCQkJCUdFVEJNQVBfQ09OVkVSVChvdXQsb3V0eCk7Ci0JCQkJCW91dHguYm12X29mbGFncyA9IG9mbGFnczsKLQkJCQkJb3V0eC5ibXZfdW51c2VkMSA9IG91dHguYm12X3VudXNlZDIgPSAwOwotCQkJCQlpZiAoY29weV90b191c2VyKGFwLCAmb3V0eCwKLQkJCQkJCQlzaXplb2Yob3V0eCkpKSB7Ci0JCQkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOwotCQkJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIoYXAsICZvdXQsCi0JCQkJCQkJc2l6ZW9mKG91dCkpKSB7Ci0JCQkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOwotCQkJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJCQkJfQotCQkJCX0KKwkJCQkvKiBmb3JtYXQgcmVzdWx0cyAmIGFkdmFuY2UgYXJnICovCisJCQkJZXJyb3IgPSBmb3JtYXR0ZXIoJmFyZywgJm91dCwgJmZ1bGwpOworCQkJCWlmIChlcnJvciB8fCBmdWxsKQorCQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCQkJCW5leGxlZnQtLTsKIAkJCQlibXYtPmJtdl9vZmZzZXQgPQogCQkJCQlvdXQuYm12X29mZnNldCArIG91dC5ibXZfbGVuZ3RoOwogCQkJCWJtdi0+Ym12X2xlbmd0aCA9IE1BWCgoX19pbnQ2NF90KTAsCiAJCQkJCShfX2ludDY0X3QpKGJtdmVuZCAtIGJtdi0+Ym12X29mZnNldCkpOwogCQkJCWJtdi0+Ym12X2VudHJpZXMrKzsKLQkJCQlhcCA9IChpbnRlcmZhY2UgJiBCTVZfSUZfRVhURU5ERUQpID8KLQkJCQkJCSh2b2lkIF9fdXNlciAqKQotCQkJCQkoKHN0cnVjdCBnZXRibWFweCBfX3VzZXIgKilhcCArIDEpIDoKLQkJCQkJCSh2b2lkIF9fdXNlciAqKQotCQkJCQkoKHN0cnVjdCBnZXRibWFwIF9fdXNlciAqKWFwICsgMSk7CiAJCQl9CiAJCX0KIAl9IHdoaWxlIChubWFwICYmIG5leGxlZnQgJiYgYm12LT5ibXZfbGVuZ3RoKTsKQEAgLTYxMzEsNyArNjIwNiw3IEBACiAKIHZvaWQKIHhmc19jaGVja19ibG9jaygKLQl4ZnNfYm1idF9ibG9ja190ICAgICAgICAqYmxvY2ssCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2ssCiAJeGZzX21vdW50X3QJCSptcCwKIAlpbnQJCQlyb290LAogCXNob3J0CQkJc3opCkBAIC02MTQzLDM2ICs2MjE4LDI5IEBACiAJQVNTRVJUKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCkgPiAwKTsKIAogCXByZXZwID0gTlVMTDsKLQlmb3IoIGkgPSAxOyBpIDw9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsgaSsrKSB7CisJZm9yKCBpID0gMTsgaSA8PSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spOyBpKyspIHsKIAkJZG14ciA9IG1wLT5tX2JtYXBfZG14clswXTsKLQotCQlpZiAocm9vdCkgewotCQkJa2V5cCA9IFhGU19CTUFQX0JST09UX0tFWV9BRERSKGJsb2NrLCBpLCBzeik7Ci0JCX0gZWxzZSB7Ci0JCQlrZXlwID0gWEZTX0JUUkVFX0tFWV9BRERSKHhmc19ibWJ0LCBibG9jaywgaSk7Ci0JCX0KKwkJa2V5cCA9IFhGU19CTUJUX0tFWV9BRERSKG1wLCBibG9jaywgaSk7CiAKIAkJaWYgKHByZXZwKSB7Ci0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBwcmV2cCwga2V5cCk7CisJCQlBU1NFUlQoYmU2NF90b19jcHUocHJldnAtPmJyX3N0YXJ0b2ZmKSA8CisJCQkgICAgICAgYmU2NF90b19jcHUoa2V5cC0+YnJfc3RhcnRvZmYpKTsKIAkJfQogCQlwcmV2cCA9IGtleXA7CiAKIAkJLyoKIAkJICogQ29tcGFyZSB0aGUgYmxvY2sgbnVtYmVycyB0byBzZWUgaWYgdGhlcmUgYXJlIGR1cHMuCiAJCSAqLworCQlpZiAocm9vdCkKKwkJCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGJsb2NrLCBpLCBzeik7CisJCWVsc2UKKwkJCXBwID0gWEZTX0JNQlRfUFRSX0FERFIobXAsIGJsb2NrLCBpLCBkbXhyKTsKIAotCQlpZiAocm9vdCkgewotCQkJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgaSwgc3opOwotCQl9IGVsc2UgewotCQkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIoeGZzX2JtYnQsIGJsb2NrLCBpLCBkbXhyKTsKLQkJfQogCQlmb3IgKGogPSBpKzE7IGogPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOyBqKyspIHsKLQkJCWlmIChyb290KSB7Ci0JCQkJdGhpc3BhID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIGosIHN6KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpc3BhID0gWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWJ0LCBibG9jaywgaiwKLQkJCQkJCQkgICAgZG14cik7Ci0JCQl9CisJCQlpZiAocm9vdCkKKwkJCQl0aGlzcGEgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihtcCwgYmxvY2ssIGosIHN6KTsKKwkJCWVsc2UKKwkJCQl0aGlzcGEgPSBYRlNfQk1CVF9QVFJfQUREUihtcCwgYmxvY2ssIGosIGRteHIpOwogCQkJaWYgKCp0aGlzcGEgPT0gKnBwKSB7CiAJCQkJY21uX2VycihDRV9XQVJOLCAiJXM6IHRoaXNwYSglZCkgPT0gcHAoJWQpICVMZCIsCiAJCQkJCV9fZnVuY19fLCBqLCBpLApAQCAtNjE5NSw3ICs2MjYzLDcgQEAKIAl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KIAlpbnQJCQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCiB7Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJLyogY3VycmVudCBidHJlZSBibG9jayAqLwogCXhmc19mc2Jsb2NrX3QJCWJubzsJLyogYmxvY2sgIyBvZiAiYmxvY2siICovCiAJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgImJsb2NrIiAqLwogCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KQEAgLTYyMjMsNyArNjI5MSw3IEBACiAJbGV2ZWwgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbGV2ZWwpOwogCUFTU0VSVChsZXZlbCA+IDApOwogCXhmc19jaGVja19ibG9jayhibG9jaywgbXAsIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwotCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGJsb2NrLCAxLCBpZnAtPmlmX2Jyb290X2J5dGVzKTsKIAlibm8gPSBiZTY0X3RvX2NwdSgqcHApOwogCiAJQVNTRVJUKGJubyAhPSBOVUxMREZTQk5PKTsKQEAgLTYyNDUsOSArNjMxMyw5IEBACiAJCWlmICghYnAgJiYgKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgTlVMTCwgYm5vLCAwLCAmYnAsCiAJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCiAJCQlnb3RvIGVycm9yX25vcmVsc2U7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCi0JCQlYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsIGJsb2NrLCBsZXZlbCksCisJCQl4ZnNfYm1hcF9zYW5pdHlfY2hlY2sobXAsIGJwLCBsZXZlbCksCiAJCQllcnJvcjApOwogCQlpZiAobGV2ZWwgPT0gMCkKIAkJCWJyZWFrOwpAQCAtNjI1OCw3ICs2MzI2LDcgQEAKIAkJICovCiAKIAkJeGZzX2NoZWNrX2Jsb2NrKGJsb2NrLCBtcCwgMCwgMCk7Ci0JCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWJ0LCBibG9jaywgMSwgbXAtPm1fYm1hcF9kbXhyWzFdKTsKKwkJcHAgPSBYRlNfQk1CVF9QVFJfQUREUihtcCwgYmxvY2ssIDEsIG1wLT5tX2JtYXBfZG14clsxXSk7CiAJCWJubyA9IGJlNjRfdG9fY3B1KCpwcCk7CiAJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBibm8pLCBlcnJvcjApOwogCQlpZiAoYnBfcmVsZWFzZSkgewpAQCAtNjI4MCwxMyArNjM0OCwxMyBAQAogCQl4ZnNfZXh0bnVtX3QJbnVtX3JlY3M7CiAKIAotCQludW1fcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKKwkJbnVtX3JlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spOwogCiAJCS8qCiAJCSAqIFJlYWQtYWhlYWQgdGhlIG5leHQgbGVhZiBibG9jaywgaWYgYW55LgogCQkgKi8KIAotCQluZXh0Ym5vID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKTsKKwkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpOwogCiAJCS8qCiAJCSAqIENoZWNrIGFsbCB0aGUgZXh0ZW50cyB0byBtYWtlIHN1cmUgdGhleSBhcmUgT0suCkBAIC02Mjk0LDEzICs2MzYyLDE3IEBACiAJCSAqIGNvbmZvcm0gd2l0aCB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyBvbmUuCiAJCSAqLwogCi0JCWVwID0gWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LCBibG9jaywgMSk7CisJCWVwID0gWEZTX0JNQlRfUkVDX0FERFIobXAsIGJsb2NrLCAxKTsKIAkJaWYgKGkpIHsKLQkJCXhmc19idHJlZV9jaGVja19yZWMoWEZTX0JUTlVNX0JNQVAsICZsYXN0LCBlcCk7CisJCQlBU1NFUlQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoJmxhc3QpICsKKwkJCSAgICAgICB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KCZsYXN0KSA8PQorCQkJICAgICAgIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKGVwKSk7CiAJCX0KIAkJZm9yIChqID0gMTsgaiA8IG51bV9yZWNzOyBqKyspIHsKLQkJCW5leHRwID0gWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LCBibG9jaywgaiArIDEpOwotCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhYRlNfQlROVU1fQk1BUCwgZXAsIG5leHRwKTsKKwkJCW5leHRwID0gWEZTX0JNQlRfUkVDX0FERFIobXAsIGJsb2NrLCBqICsgMSk7CisJCQlBU1NFUlQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoZXApICsKKwkJCSAgICAgICB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KGVwKSA8PQorCQkJICAgICAgIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKG5leHRwKSk7CiAJCQllcCA9IG5leHRwOwogCQl9CiAKQEAgLTYzMjYsNyArNjM5OCw3IEBACiAJCWlmICghYnAgJiYgKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgTlVMTCwgYm5vLCAwLCAmYnAsCiAJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCiAJCQlnb3RvIGVycm9yX25vcmVsc2U7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAl9CiAJaWYgKGJwX3JlbGVhc2UpIHsKIAkJYnBfcmVsZWFzZSA9IDA7CkBAIC02MzU2LDcgKzY0MjgsNyBAQAogCWludAkJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KIAlpbnQJCQkqY291bnQpCQkvKiBvdXQ6IGNvdW50IG9mIGJsb2NrcyAqLwogewotCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KIAl4ZnNfZnNibG9ja190CQlibm87CS8qIGJsb2NrICMgb2YgImJsb2NrIiAqLwogCXhmc19pZm9ya190CQkqaWZwOwkvKiBmb3JrIHN0cnVjdHVyZSAqLwogCWludAkJCWxldmVsOwkvKiBidHJlZSBsZXZlbCwgZm9yIGNoZWNraW5nICovCkBAIC02Mzc5LDcgKzY0NTEsNyBAQAogCWJsb2NrID0gaWZwLT5pZl9icm9vdDsKIAlsZXZlbCA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCk7CiAJQVNTRVJUKGxldmVsID4gMCk7Ci0JcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihtcCwgYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwogCWJubyA9IGJlNjRfdG9fY3B1KCpwcCk7CiAJQVNTRVJUKGJubyAhPSBOVUxMREZTQk5PKTsKIAlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBibm8pIDwgbXAtPm1fc2Iuc2JfYWdjb3VudCk7CkBAIC02NDEzLDI5ICs2NDg1LDI5IEBACiAJX19iZTY0CQkJKnBwOwogCXhmc19mc2Jsb2NrX3QgICAgICAgICAgIGJubyA9IGJsb2Nrbm87CiAJeGZzX2ZzYmxvY2tfdAkJbmV4dGJubzsKLQl4ZnNfYm1idF9ibG9ja190ICAgICAgICAqYmxvY2ssICpuZXh0YmxvY2s7CisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2ssICpuZXh0YmxvY2s7CiAJaW50CQkJbnVtcmVjczsKIAogCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKQogCQlyZXR1cm4gZXJyb3I7CiAJKmNvdW50ICs9IDE7Ci0JYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCWJsb2NrID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAKIAlpZiAoLS1sZXZlbCkgewogCQkvKiBOb3QgYXQgbm9kZSBhYm92ZSBsZWFmcywgY291bnQgdGhpcyBsZXZlbCBvZiBub2RlcyAqLwotCQluZXh0Ym5vID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKTsKKwkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpOwogCQl3aGlsZSAobmV4dGJubyAhPSBOVUxMRlNCTE9DSykgewogCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBuZXh0Ym5vLAogCQkJCTAsICZuYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJCSpjb3VudCArPSAxOwotCQkJbmV4dGJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKG5icCk7Ci0JCQluZXh0Ym5vID0gYmU2NF90b19jcHUobmV4dGJsb2NrLT5iYl9yaWdodHNpYik7CisJCQluZXh0YmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKG5icCk7CisJCQluZXh0Ym5vID0gYmU2NF90b19jcHUobmV4dGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIpOwogCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgbmJwKTsKIAkJfQogCiAJCS8qIERpdmUgdG8gdGhlIG5leHQgbGV2ZWwgKi8KLQkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIoeGZzX2JtYnQsIGJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMV0pOworCQlwcCA9IFhGU19CTUJUX1BUUl9BRERSKG1wLCBibG9jaywgMSwgbXAtPm1fYm1hcF9kbXhyWzFdKTsKIAkJYm5vID0gYmU2NF90b19jcHUoKnBwKTsKIAkJaWYgKHVubGlrZWx5KChlcnJvciA9CiAJCSAgICAgeGZzX2JtYXBfY291bnRfdHJlZShtcCwgdHAsIGlmcCwgYm5vLCBsZXZlbCwgY291bnQpKSA8IDApKSB7CkBAIC02NDQ4LDkgKzY1MjAsOSBAQAogCX0gZWxzZSB7CiAJCS8qIGNvdW50IGFsbCBsZXZlbCAxIG5vZGVzIGFuZCB0aGVpciBsZWF2ZXMgKi8KIAkJZm9yICg7OykgewotCQkJbmV4dGJubyA9IGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYik7CisJCQluZXh0Ym5vID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYik7CiAJCQludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotCQkJeGZzX2JtYXBfZGlza19jb3VudF9sZWF2ZXMoMCwgYmxvY2ssIG51bXJlY3MsIGNvdW50KTsKKwkJCXhmc19ibWFwX2Rpc2tfY291bnRfbGVhdmVzKG1wLCBibG9jaywgbnVtcmVjcywgY291bnQpOwogCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwogCQkJaWYgKG5leHRibm8gPT0gTlVMTEZTQkxPQ0spCiAJCQkJYnJlYWs7CkBAIC02NDU5LDcgKzY1MzEsNyBAQAogCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQogCQkJCXJldHVybiBlcnJvcjsKIAkJCSpjb3VudCArPSAxOwotCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTY0ODksOCArNjU2MSw4IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYm1hcF9kaXNrX2NvdW50X2xlYXZlcygKLQl4ZnNfZXh0bnVtX3QJCWlkeCwKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jaywKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywKIAlpbnQJCQludW1yZWNzLAogCWludAkJCSpjb3VudCkKIHsKQEAgLTY0OTgsNyArNjU3MCw3IEBACiAJeGZzX2JtYnRfcmVjX3QJKmZycDsKIAogCWZvciAoYiA9IDE7IGIgPD0gbnVtcmVjczsgYisrKSB7Ci0JCWZycCA9IFhGU19CVFJFRV9SRUNfQUREUih4ZnNfYm1idCwgYmxvY2ssIGlkeCArIGIpOworCQlmcnAgPSBYRlNfQk1CVF9SRUNfQUREUihtcCwgYmxvY2ssIGIpOwogCQkqY291bnQgKz0geGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChmcnApOwogCX0KIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5oIGIvZnMveGZzL3hmc19ibWFwLmgKaW5kZXggOWYzZTNhOC4uMjg0NTcxYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmgKKysrIGIvZnMveGZzL3hmc19ibWFwLmgKQEAgLTEzNyw5ICsxMzcsNyBAQAogCWNoYXIJCQljb252OwkvKiBvdmVyd3JpdGluZyB1bndyaXR0ZW4gZXh0ZW50cyAqLwogfSB4ZnNfYm1hbGxvY2FfdDsKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2lmIGRlZmluZWQoWEZTX0JNQVBfVFJBQ0UpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKFhGU19CTUFQX1RSQUNFKQogLyoKICAqIFRyYWNlIG9wZXJhdGlvbnMgZm9yIGJtYXAgZXh0ZW50IHRyYWNpbmcKICAqLwpAQCAtMTYzLDkgKzE2MSwxMiBAQAogCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCiAjZGVmaW5lCVhGU19CTUFQX1RSQUNFX0VYTElTVChpcCxjLHcpCVwKIAl4ZnNfYm1hcF90cmFjZV9leGxpc3QoX19mdW5jX18saXAsYyx3KQotI2Vsc2UKKworI2Vsc2UJLyogX19LRVJORUxfXyAmJiBYRlNfQk1BUF9UUkFDRSAqLworCiAjZGVmaW5lCVhGU19CTUFQX1RSQUNFX0VYTElTVChpcCxjLHcpCi0jZW5kaWYKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gJiYgWEZTX0JNQVBfVFJBQ0UgKi8KIAogLyoKICAqIENvbnZlcnQgaW5vZGUgZnJvbSBub24tYXR0cmlidXRlZCB0byBhdHRyaWJ1dGVkLgpAQCAtMjA2LDIwICsyMDcsNiBAQAogCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCiAKIC8qCi0gKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCi0gKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQotICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4KLSAqCi0gKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lIGFsbG9jYXRlZCwKLSAqIGFuZCAwIG90aGVyd2lzZS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2ZpbmlzaCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSoqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyIGFkZHIgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQlpbnQJCQkqY29tbWl0dGVkKTsJLyogeGFjdCBjb21taXR0ZWQgb3Igbm90ICovCi0KLS8qCiAgKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBmaWxlLgogICogVGhpcyBpcyB0aGUgbG93ZXN0LWFkZHJlc3MgaG9sZSBpZiB0aGUgZmlsZSBoYXMgaG9sZXMsIGVsc2UgdGhlIGZpcnN0IGJsb2NrCiAgKiBwYXN0IHRoZSBlbmQgb2YgZmlsZS4KQEAgLTM0NCwxNCArMzMxLDQzIEBACiAJaW50CQkJKmRvbmUpOwkJLyogc2V0IGlmIG5vdCBkb25lIHlldCAqLwogCiAvKgotICogRmNudGwgaW50ZXJmYWNlIHRvIHhmc19ibWFwaS4KKyAqIENoZWNrIGFuIGV4dGVudCBsaXN0LCB3aGljaCBoYXMganVzdCBiZWVuIHJlYWQsIGZvcgorICogYW55IGJpdCBpbiB0aGUgZXh0ZW50IGZsYWcgZmllbGQuCisgKi8KK2ludAoreGZzX2NoZWNrX25vc3RhdGVfZXh0ZW50cygKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnAsCisJeGZzX2V4dG51bV90CQlpZHgsCisJeGZzX2V4dG51bV90CQludW0pOworCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogUm91dGluZSB0byBiZSBjYWxsZWQgYXQgdHJhbnNhY3Rpb24ncyBlbmQgYnkgeGZzX2JtYXBpLCB4ZnNfYnVubWFwaQorICogY2FsbGVyLiAgRnJlZXMgYWxsIHRoZSBleHRlbnRzIHRoYXQgbmVlZCBmcmVlaW5nLCB3aGljaCBtdXN0IGJlIGRvbmUKKyAqIGxhc3QgZHVlIHRvIGxvY2tpbmcgY29uc2lkZXJhdGlvbnMuCisgKgorICogUmV0dXJuIDEgaWYgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHdhcyBjb21taXR0ZWQgYW5kIGEgbmV3IG9uZSBhbGxvY2F0ZWQsCisgKiBhbmQgMCBvdGhlcndpc2UuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9maW5pc2goCisJc3RydWN0IHhmc190cmFucwkqKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciBhZGRyICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCisJaW50CQkJKmNvbW1pdHRlZCk7CS8qIHhhY3QgY29tbWl0dGVkIG9yIG5vdCAqLworCisvKiBibWFwIHRvIHVzZXJzcGFjZSBmb3JtYXR0ZXIgLSBjb3B5IHRvIHVzZXIgJiBhZHZhbmNlIHBvaW50ZXIgKi8KK3R5cGVkZWYgaW50ICgqeGZzX2JtYXBfZm9ybWF0X3QpKHZvaWQgKiosIHN0cnVjdCBnZXRibWFweCAqLCBpbnQgKik7CisKKy8qCisgKiBHZXQgaW5vZGUncyBleHRlbnRzIGFzIGRlc2NyaWJlZCBpbiBibXYsIGFuZCBmb3JtYXQgZm9yIG91dHB1dC4KICAqLwogaW50CQkJCQkJLyogZXJyb3IgY29kZSAqLwogeGZzX2dldGJtYXAoCiAJeGZzX2lub2RlX3QJCSppcCwKLQlzdHJ1Y3QgZ2V0Ym1hcAkJKmJtdiwJCS8qIHVzZXIgYm1hcCBzdHJ1Y3R1cmUgKi8KLQl2b2lkCQkJX191c2VyICphcCwJLyogcG9pbnRlciB0byB1c2VyJ3MgYXJyYXkgKi8KLQlpbnQJCQlpZmxhZ3MpOwkvKiBpbnRlcmZhY2UgZmxhZ3MgKi8KKwlzdHJ1Y3QgZ2V0Ym1hcHgJCSpibXYsCQkvKiB1c2VyIGJtYXAgc3RydWN0dXJlICovCisJeGZzX2JtYXBfZm9ybWF0X3QJZm9ybWF0dGVyLAkvKiBmb3JtYXQgdG8gdXNlciAqLworCXZvaWQJCQkqYXJnKTsJCS8qIGZvcm1hdHRlciBhcmcgKi8KIAogLyoKICAqIENoZWNrIGlmIHRoZSBlbmRvZmYgaXMgb3V0c2lkZSB0aGUgbGFzdCBleHRlbnQuIElmIHNvIHRoZSBjYWxsZXIgd2lsbCBncm93CkBAIC0zNzUsMTYgKzM5MSw2IEBACiAJaW50CQkJKmNvdW50KTsKIAogLyoKLSAqIENoZWNrIGFuIGV4dGVudCBsaXN0LCB3aGljaCBoYXMganVzdCBiZWVuIHJlYWQsIGZvcgotICogYW55IGJpdCBpbiB0aGUgZXh0ZW50IGZsYWcgZmllbGQuCi0gKi8KLWludAoteGZzX2NoZWNrX25vc3RhdGVfZXh0ZW50cygKLQlzdHJ1Y3QgeGZzX2lmb3JrCSppZnAsCi0JeGZzX2V4dG51bV90CQlpZHgsCi0JeGZzX2V4dG51bV90CQludW0pOwotCi0vKgogICogU2VhcmNoIHRoZSBleHRlbnQgcmVjb3JkcyBmb3IgdGhlIGVudHJ5IGNvbnRhaW5pbmcgYmxvY2sgYm5vLgogICogSWYgYm5vIGxpZXMgaW4gYSBob2xlLCBwb2ludCB0byB0aGUgbmV4dCBlbnRyeS4gIElmIGJubyBsaWVzCiAgKiBwYXN0IGVvZiwgKmVvZnAgd2lsbCBiZSBzZXQsIGFuZCAqcHJldnAgd2lsbCBjb250YWluIHRoZSBsYXN0CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCmluZGV4IDIzZWZhZDIuLjhmMWVjNzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCkBAIC0zNywxNDA2ICszNywxMyBAQAogI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlX3RyYWNlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19pdGFibGUuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcC5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19xdW90YS5oIgogCi0jaWYgZGVmaW5lZChYRlNfQk1CVF9UUkFDRSkKLWt0cmFjZV90CSp4ZnNfYm1idF90cmFjZV9idWY7Ci0jZW5kaWYKLQotLyoKLSAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGJ0cmVlIGZ1bmN0aW9ucy4KLSAqLwotCi0KLVNUQVRJQyBpbnQgeGZzX2JtYnRfa2lsbHJvb3QoeGZzX2J0cmVlX2N1cl90ICopOwotU1RBVElDIHZvaWQgeGZzX2JtYnRfbG9nX2tleXMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7Ci1TVEFUSUMgdm9pZCB4ZnNfYm1idF9sb2dfcHRycyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKLVNUQVRJQyBpbnQgeGZzX2JtYnRfbHNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2JtYnRfcnNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2JtYnRfc3BsaXQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgeGZzX2ZzYmxvY2tfdCAqLAotCQlfX3VpbnQ2NF90ICosIHhmc19idHJlZV9jdXJfdCAqKiwgaW50ICopOwotU1RBVElDIGludCB4ZnNfYm1idF91cGRrZXkoeGZzX2J0cmVlX2N1cl90ICosIHhmc19ibWJ0X2tleV90ICosIGludCk7Ci0KLQotI2lmIGRlZmluZWQoWEZTX0JNQlRfVFJBQ0UpCi0KLXN0YXRpYyBjaGFyCUFSR1NbXSA9ICJhcmdzIjsKLXN0YXRpYyBjaGFyCUVOVFJZW10gPSAiZW50cnkiOwotc3RhdGljIGNoYXIJRVJST1JbXSA9ICJlcnJvciI7Ci0jdW5kZWYgRVhJVAotc3RhdGljIGNoYXIJRVhJVFtdID0gImV4aXQiOwotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciB0aGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSByb3V0aW5lLAotICogZ2VuZXJpYyBmb3JtLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2JtYnRfdHJhY2VfZW50ZXIoCi0JY29uc3QgY2hhcgkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQljaGFyCQkqcywKLQlpbnQJCXR5cGUsCi0JaW50CQlsaW5lLAotCV9fcHN1bnNpZ25lZF90CWEwLAotCV9fcHN1bnNpZ25lZF90CWExLAotCV9fcHN1bnNpZ25lZF90CWEyLAotCV9fcHN1bnNpZ25lZF90CWEzLAotCV9fcHN1bnNpZ25lZF90CWE0LAotCV9fcHN1bnNpZ25lZF90CWE1LAotCV9fcHN1bnNpZ25lZF90CWE2LAotCV9fcHN1bnNpZ25lZF90CWE3LAotCV9fcHN1bnNpZ25lZF90CWE4LAotCV9fcHN1bnNpZ25lZF90CWE5LAotCV9fcHN1bnNpZ25lZF90CWExMCkKLXsKLQl4ZnNfaW5vZGVfdAkqaXA7Ci0JaW50CQl3aGljaGZvcms7Ci0KLQlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOwotCXdoaWNoZm9yayA9IGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yazsKLQlrdHJhY2VfZW50ZXIoeGZzX2JtYnRfdHJhY2VfYnVmLAotCQkodm9pZCAqKSgoX19wc2ludF90KXR5cGUgfCAod2hpY2hmb3JrIDw8IDgpIHwgKGxpbmUgPDwgMTYpKSwKLQkJKHZvaWQgKilmdW5jLCAodm9pZCAqKXMsICh2b2lkICopaXAsICh2b2lkICopY3VyLAotCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAotCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAotCQkodm9pZCAqKWE4LCAodm9pZCAqKWE5LCAodm9pZCAqKWExMCk7Ci0JQVNTRVJUKGlwLT5pX2J0cmFjZSk7Ci0Ja3RyYWNlX2VudGVyKGlwLT5pX2J0cmFjZSwKLQkJKHZvaWQgKikoKF9fcHNpbnRfdCl0eXBlIHwgKHdoaWNoZm9yayA8PCA4KSB8IChsaW5lIDw8IDE2KSksCi0JCSh2b2lkICopZnVuYywgKHZvaWQgKilzLCAodm9pZCAqKWlwLCAodm9pZCAqKWN1ciwKLQkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKLQkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKLQkJKHZvaWQgKilhOCwgKHZvaWQgKilhOSwgKHZvaWQgKilhMTApOwotfQotLyoKLSAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgYSBidWZmZXIgJiAxIGludGVnZXIgYXJnLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2JtYnRfdHJhY2VfYXJnYmkoCi0JY29uc3QgY2hhcgkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQl4ZnNfYnVmX3QJKmIsCi0JaW50CQlpLAotCWludAkJbGluZSkKLXsKLQl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdCSSwgbGluZSwKLQkJKF9fcHN1bnNpZ25lZF90KWIsIGksIDAsIDAsCi0JCTAsIDAsIDAsIDAsCi0JCTAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBhIGJ1ZmZlciAmIDIgaW50ZWdlciBhcmdzLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2JtYnRfdHJhY2VfYXJnYmlpKAotCWNvbnN0IGNoYXIJKmZ1bmMsCi0JeGZzX2J0cmVlX2N1cl90CSpjdXIsCi0JeGZzX2J1Zl90CSpiLAotCWludAkJaTAsCi0JaW50CQlpMSwKLQlpbnQJCWxpbmUpCi17Ci0JeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBBUkdTLCBYRlNfQk1CVF9LVFJBQ0VfQVJHQklJLCBsaW5lLAotCQkoX19wc3Vuc2lnbmVkX3QpYiwgaTAsIGkxLCAwLAotCQkwLCAwLCAwLCAwLAotCQkwLCAwLCAwKTsKLX0KLQotLyoKLSAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgMyBibG9jay1sZW5ndGggYXJncwotICogYW5kIGFuIGludGVnZXIgYXJnLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2JtYnRfdHJhY2VfYXJnZmZmaSgKLQljb25zdCBjaGFyCQkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JeGZzX2RmaWxvZmZfdAkJbywKLQl4ZnNfZGZzYm5vX3QJCWIsCi0JeGZzX2RmaWxibGtzX3QJCWksCi0JaW50CQkJaiwKLQlpbnQJCQlsaW5lKQotewotCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0ZGRkksIGxpbmUsCi0JCW8gPj4gMzIsIChpbnQpbywgYiA+PiAzMiwgKGludCliLAotCQlpID4+IDMyLCAoaW50KWksIChpbnQpaiwgMCwKLQkJMCwgMCwgMCk7Ci19Ci0KLS8qCi0gKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIG9uZSBpbnRlZ2VyIGFyZy4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2FyZ2koCi0JY29uc3QgY2hhcgkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQlpbnQJCWksCi0JaW50CQlsaW5lKQotewotCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0ksIGxpbmUsCi0JCWksIDAsIDAsIDAsCi0JCTAsIDAsIDAsIDAsCi0JCTAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIGtleS4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2FyZ2lmaygKLQljb25zdCBjaGFyCQkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JaW50CQkJaSwKLQl4ZnNfZnNibG9ja190CQlmLAotCXhmc19kZmlsb2ZmX3QJCW8sCi0JaW50CQkJbGluZSkKLXsKLQl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdJRkssIGxpbmUsCi0JCWksICh4ZnNfZGZzYm5vX3QpZiA+PiAzMiwgKGludClmLCBvID4+IDMyLAotCQkoaW50KW8sIDAsIDAsIDAsCi0JCTAsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIHJlYy4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2FyZ2lmcigKLQljb25zdCBjaGFyCQkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JaW50CQkJaSwKLQl4ZnNfZnNibG9ja190CQlmLAotCXhmc19ibWJ0X3JlY190CQkqciwKLQlpbnQJCQlsaW5lKQotewotCXhmc19kZnNibm9fdAkJYjsKLQl4ZnNfZGZpbGJsa3NfdAkJYzsKLQl4ZnNfZGZzYm5vX3QJCWQ7Ci0JeGZzX2RmaWxvZmZfdAkJbzsKLQl4ZnNfYm1idF9pcmVjX3QJCXM7Ci0KLQlkID0gKHhmc19kZnNibm9fdClmOwotCXhmc19ibWJ0X2Rpc2tfZ2V0X2FsbChyLCAmcyk7Ci0JbyA9ICh4ZnNfZGZpbG9mZl90KXMuYnJfc3RhcnRvZmY7Ci0JYiA9ICh4ZnNfZGZzYm5vX3Qpcy5icl9zdGFydGJsb2NrOwotCWMgPSBzLmJyX2Jsb2NrY291bnQ7Ci0JeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBBUkdTLCBYRlNfQk1CVF9LVFJBQ0VfQVJHSUZSLCBsaW5lLAotCQlpLCBkID4+IDMyLCAoaW50KWQsIG8gPj4gMzIsCi0JCShpbnQpbywgYiA+PiAzMiwgKGludCliLCBjID4+IDMyLAotCQkoaW50KWMsIDAsIDApOwotfQotCi0vKgotICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGtleS4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X3RyYWNlX2FyZ2lrKAotCWNvbnN0IGNoYXIJCSpmdW5jLAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQlpbnQJCQlpLAotCXhmc19ibWJ0X2tleV90CQkqaywKLQlpbnQJCQlsaW5lKQotewotCXhmc19kZmlsb2ZmX3QJCW87Ci0KLQlvID0gYmU2NF90b19jcHUoay0+YnJfc3RhcnRvZmYpOwotCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0lGSywgbGluZSwKLQkJaSwgbyA+PiAzMiwgKGludClvLCAwLAotCQkwLCAwLCAwLCAwLAotCQkwLCAwLCAwKTsKLX0KLQotLyoKLSAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgdGhlIGN1cnNvci9vcGVyYXRpb24uCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfYm1idF90cmFjZV9jdXJzb3IoCi0JY29uc3QgY2hhcgkqZnVuYywKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQljaGFyCQkqcywKLQlpbnQJCWxpbmUpCi17Ci0JeGZzX2JtYnRfcmVjX2hvc3RfdAlyOwotCi0JeGZzX2JtYnRfc2V0X2FsbCgmciwgJmN1ci0+YmNfcmVjLmIpOwotCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgcywgWEZTX0JNQlRfS1RSQUNFX0NVUiwgbGluZSwKLQkJKGN1ci0+YmNfbmxldmVscyA8PCAyNCkgfCAoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPDwgMTYpIHwKLQkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkLAotCQlyLmwwID4+IDMyLCAoaW50KXIubDAsCi0JCXIubDEgPj4gMzIsIChpbnQpci5sMSwKLQkJKHVuc2lnbmVkIGxvbmcpY3VyLT5iY19idWZzWzBdLCAodW5zaWduZWQgbG9uZyljdXItPmJjX2J1ZnNbMV0sCi0JCSh1bnNpZ25lZCBsb25nKWN1ci0+YmNfYnVmc1syXSwgKHVuc2lnbmVkIGxvbmcpY3VyLT5iY19idWZzWzNdLAotCQkoY3VyLT5iY19wdHJzWzBdIDw8IDE2KSB8IGN1ci0+YmNfcHRyc1sxXSwKLQkJKGN1ci0+YmNfcHRyc1syXSA8PCAxNikgfCBjdXItPmJjX3B0cnNbM10pOwotfQotCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0JJKGMsYixpKQlcCi0JeGZzX2JtYnRfdHJhY2VfYXJnYmkoX19mdW5jX18sIGMsIGIsIGksIF9fTElORV9fKQotI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdCSUkoYyxiLGksaikJXAotCXhmc19ibWJ0X3RyYWNlX2FyZ2JpaShfX2Z1bmNfXywgYywgYiwgaSwgaiwgX19MSU5FX18pCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0ZGRkkoYyxvLGIsaSxqKQlcCi0JeGZzX2JtYnRfdHJhY2VfYXJnZmZmaShfX2Z1bmNfXywgYywgbywgYiwgaSwgaiwgX19MSU5FX18pCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0koYyxpKQlcCi0JeGZzX2JtYnRfdHJhY2VfYXJnaShfX2Z1bmNfXywgYywgaSwgX19MSU5FX18pCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lGSyhjLGksZixzKQlcCi0JeGZzX2JtYnRfdHJhY2VfYXJnaWZrKF9fZnVuY19fLCBjLCBpLCBmLCBzLCBfX0xJTkVfXykKLSNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUZSKGMsaSxmLHIpCVwKLQl4ZnNfYm1idF90cmFjZV9hcmdpZnIoX19mdW5jX18sIGMsIGksIGYsIHIsIF9fTElORV9fKQotI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJSyhjLGksaykJXAotCXhmc19ibWJ0X3RyYWNlX2FyZ2lrKF9fZnVuY19fLCBjLCBpLCBrLCBfX0xJTkVfXykKLSNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGMscykJXAotCXhmc19ibWJ0X3RyYWNlX2N1cnNvcihfX2Z1bmNfXywgYywgcywgX19MSU5FX18pCi0jZWxzZQotI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdCSShjLGIsaSkKLSNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGMsYixpLGopCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0ZGRkkoYyxvLGIsaSxqKQotI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJKGMsaSkKLSNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUZLKGMsaSxmLHMpCi0jZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lGUihjLGksZixyKQotI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJSyhjLGksaykKLSNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGMscykKLSNlbmRpZgkvKiBYRlNfQk1CVF9UUkFDRSAqLwotCi0KLS8qCi0gKiBJbnRlcm5hbCBmdW5jdGlvbnMuCi0gKi8KLQotLyoKLSAqIERlbGV0ZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIvbGV2ZWwuCi0gKi8KLVNUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYm1idF9kZWxyZWMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAotCWludAkJCWxldmVsLAotCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CQkvKiBibWFwIGJ0cmVlIGJsb2NrICovCi0JeGZzX2ZzYmxvY2tfdAkJYm5vOwkJLyogZnMtcmVsYXRpdmUgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCi0JaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCi0JaW50CQkJajsJCS8qIHRlbXAgc3RhdGUgKi8KLQl4ZnNfYm1idF9rZXlfdAkJa2V5OwkJLyogYm1hcCBidHJlZSBrZXkgKi8KLQl4ZnNfYm1idF9rZXlfdAkJKmtwPU5VTEw7CS8qIHBvaW50ZXIgdG8gYm1hcCBidHJlZSBrZXkgKi8KLQl4ZnNfZnNibG9ja190CQlsYm5vOwkJLyogbGVmdCBzaWJsaW5nIGJsb2NrIG51bWJlciAqLwotCXhmc19idWZfdAkJKmxicDsJCS8qIGxlZnQgYnVmZmVyIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9ibG9ja190CSpsZWZ0OwkJLyogbGVmdCBidHJlZSBibG9jayAqLwotCXhmc19ibWJ0X2tleV90CQkqbGtwOwkJLyogbGVmdCBidHJlZSBrZXkgKi8KLQl4ZnNfYm1idF9wdHJfdAkJKmxwcDsJCS8qIGxlZnQgYWRkcmVzcyBwb2ludGVyICovCi0JaW50CQkJbHJlY3M9MDsJLyogbGVmdCByZWNvcmQgY291bnQgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKmxycDsJCS8qIGxlZnQgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQl4ZnNfYm1idF9wdHJfdAkJKnBwOwkJLyogcG9pbnRlciB0byBibWFwIGJsb2NrIGFkZHIgKi8KLQlpbnQJCQlwdHI7CQkvKiBrZXkvcmVjb3JkIGluZGV4ICovCi0JeGZzX2ZzYmxvY2tfdAkJcmJubzsJCS8qIHJpZ2h0IHNpYmxpbmcgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqcmJwOwkJLyogcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9ibG9ja190CSpyaWdodDsJCS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2JtYnRfa2V5X3QJCSpya3A7CQkvKiByaWdodCBidHJlZSBrZXkgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKnJwOwkJLyogcG9pbnRlciB0byBibWFwIGJ0cmVlIHJlYyAqLwotCXhmc19ibWJ0X3B0cl90CQkqcnBwOwkJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqcnJibG9jazsJLyogcmlnaHQtcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpycmJwOwkJLyogcmlnaHQtcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KLQlpbnQJCQlycmVjcz0wOwkvKiByaWdodCByZWNvcmQgY291bnQgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKnJycDsJCS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCi0JeGZzX2J0cmVlX2N1cl90CQkqdGN1cjsJCS8qIHRlbXBvcmFyeSBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQludW1yZWNzOwkvKiB0ZW1wb3JhcnkgbnVtcmVjIGNvdW50ICovCi0JaW50CQkJbnVtbHJlY3MsIG51bXJyZWNzOwotCi0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOwotCVhGU19CTUJUX1RSQUNFX0FSR0koY3VyLCBsZXZlbCk7Ci0JcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKLQl0Y3VyID0gTlVMTDsKLQlpZiAocHRyID09IDApIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0JbnVtcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJZ290byBlcnJvcjA7Ci0JfQotI2VuZGlmCi0JaWYgKHB0ciA+IG51bXJlY3MpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCVhGU19TVEFUU19JTkMoeHNfYm1idF9kZWxyZWMpOwotCWlmIChsZXZlbCA+IDApIHsKLQkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7Ci0JCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IHB0cjsgaSA8IG51bXJlY3M7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyX2Rpc2soY3VyLCBwcFtpXSwgbGV2ZWwpKSkgewotCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQlnb3RvIGVycm9yMDsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCWlmIChwdHIgPCBudW1yZWNzKSB7Ci0JCQltZW1tb3ZlKCZrcFtwdHIgLSAxXSwgJmtwW3B0cl0sCi0JCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCprcCkpOwotCQkJbWVtbW92ZSgmcHBbcHRyIC0gMV0sICZwcFtwdHJdLAotCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqcHApKTsKLQkJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOwotCQkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7Ci0JCX0KLQl9IGVsc2UgewotCQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgMSwgY3VyKTsKLQkJaWYgKHB0ciA8IG51bXJlY3MpIHsKLQkJCW1lbW1vdmUoJnJwW3B0ciAtIDFdLCAmcnBbcHRyXSwKLQkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKnJwKSk7Ci0JCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKLQkJfQotCQlpZiAocHRyID09IDEpIHsKLQkJCWtleS5icl9zdGFydG9mZiA9Ci0JCQkJY3B1X3RvX2JlNjQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnApKTsKLQkJCWtwID0gJmtleTsKLQkJfQotCX0KLQludW1yZWNzLS07Ci0JYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX05VTVJFQ1MpOwotCS8qCi0JICogV2UncmUgYXQgdGhlIHJvb3QgbGV2ZWwuCi0JICogRmlyc3QsIHNocmluayB0aGUgcm9vdCBibG9jayBpbi1tZW1vcnkuCi0JICogVHJ5IHRvIGdldCByaWQgb2YgdGhlIG5leHQgbGV2ZWwgZG93bi4KLQkgKiBJZiB3ZSBjYW4ndCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvLgotCSAqLwotCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCXhmc19pcm9vdF9yZWFsbG9jKGN1ci0+YmNfcHJpdmF0ZS5iLmlwLCAtMSwKLQkJCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9raWxscm9vdChjdXIpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJZ290byBlcnJvcjA7Ci0JCX0KLQkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmopKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJZ290byBlcnJvcjA7Ci0JCX0KLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChwdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkoY3VyLCBrcCwgbGV2ZWwgKyAxKSkpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQlnb3RvIGVycm9yMDsKLQl9Ci0JaWYgKG51bXJlY3MgPj0gWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmopKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJZ290byBlcnJvcjA7Ci0JCX0KLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJibm8gPSBiZTY0X3RvX2NwdShibG9jay0+YmJfcmlnaHRzaWIpOwotCWxibm8gPSBiZTY0X3RvX2NwdShibG9jay0+YmJfbGVmdHNpYik7Ci0JLyoKLQkgKiBPbmUgY2hpbGQgb2Ygcm9vdCwgbmVlZCB0byBnZXQgYSBjaGFuY2UgdG8gY29weSBpdHMgY29udGVudHMKLQkgKiBpbnRvIHRoZSByb290IGFuZCBkZWxldGUgaXQuIENhbid0IGdvIHVwIHRvIG5leHQgbGV2ZWwsCi0JICogdGhlcmUncyBub3RoaW5nIHRvIGRlbGV0ZSB0aGVyZS4KLQkgKi8KLQlpZiAobGJubyA9PSBOVUxMRlNCTE9DSyAmJiByYm5vID09IE5VTExGU0JMT0NLICYmCi0JICAgIGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDIpIHsKLQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2tpbGxyb290KGN1cikpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JQVNTRVJUKHJibm8gIT0gTlVMTEZTQkxPQ0sgfHwgbGJubyAhPSBOVUxMRlNCTE9DSyk7Ci0JaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCWdvdG8gZXJyb3IwOwotCX0KLQlibm8gPSBOVUxMRlNCTE9DSzsKLQlpZiAocmJubyAhPSBOVUxMRlNCTE9DSykgewotCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOwotCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0JCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKLQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlyYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKLQkJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKLSNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0jZW5kaWYKLQkJYm5vID0gYmU2NF90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpOwotCQlpZiAoYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpIC0gMSA+PQotCQkgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQkJZ290byBlcnJvcjA7Ci0JCQl9Ci0JCQlpZiAoaSkgewotCQkJCUFTU0VSVChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPj0KLQkJCQkgICAgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIHRjdXIpKTsKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJdGN1ciA9IE5VTEw7Ci0JCQkJaWYgKGxldmVsID4gMCkgewotCQkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwKLQkJCQkJCQlsZXZlbCwgJmkpKSkgewotCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwKLQkJCQkJCQlFUlJPUik7Ci0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQkJfQotCQkJCX0KLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJCQkqc3RhdCA9IDE7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJcnJlY3MgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7Ci0JCWlmIChsYm5vICE9IE5VTExGU0JMT0NLKSB7Ci0JCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKLQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQkJZ290byBlcnJvcjA7Ci0JCQl9Ci0JCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCX0KLQl9Ci0JaWYgKGxibm8gIT0gTlVMTEZTQkxPQ0spIHsKLQkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJLyoKLQkJICogZGVjcmVtZW50IHRvIGxhc3QgaW4gYmxvY2sKLQkJICovCi0JCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0JCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOwotCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCWxicCA9IHRjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlsZWZ0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGxicCk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0jZW5kaWYKLQkJYm5vID0gYmU2NF90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpOwotCQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgLSAxID49Ci0JCSAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgewotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3JzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkgewotCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQlnb3RvIGVycm9yMDsKLQkJCX0KLQkJCWlmIChpKSB7Ci0JCQkJQVNTRVJUKGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA+PQotCQkJCSAgICAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgdGN1cikpOwotCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQl0Y3VyID0gTlVMTDsKLQkJCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQkJY3VyLT5iY19wdHJzWzBdKys7Ci0JCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCQkJKnN0YXQgPSAxOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JfQotCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQl0Y3VyID0gTlVMTDsKLQltcCA9IGN1ci0+YmNfbXA7Ci0JQVNTRVJUKGJubyAhPSBOVUxMRlNCTE9DSyk7Ci0JaWYgKGxibm8gIT0gTlVMTEZTQkxPQ0sgJiYKLQkgICAgbHJlY3MgKyBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPD0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJcmJubyA9IGJubzsKLQkJcmlnaHQgPSBibG9jazsKLQkJcmJwID0gYnA7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBsYm5vLCAwLCAmbGJwLAotCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCQlsZWZ0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGxicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCX0gZWxzZSBpZiAocmJubyAhPSBOVUxMRlNCTE9DSyAmJgotCQkgICBycmVjcyArIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSA8PQotCQkgICBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSkgewotCQlsYm5vID0gYm5vOwotCQlsZWZ0ID0gYmxvY2s7Ci0JCWxicCA9IGJwOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgcmJubywgMCwgJnJicCwKLQkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJZ290byBlcnJvcjA7Ci0JCX0KLQkJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCQlscmVjcyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwotCX0gZWxzZSB7Ci0JCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQludW1scmVjcyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwotCW51bXJyZWNzID0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOwotCWlmIChsZXZlbCA+IDApIHsKLQkJbGtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGxlZnQsIG51bWxyZWNzICsgMSwgY3VyKTsKLQkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIG51bWxyZWNzICsgMSwgY3VyKTsKLQkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwotCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IG51bXJyZWNzOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cl9kaXNrKGN1ciwgcnBwW2ldLCBsZXZlbCkpKSB7Ci0JCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJCWdvdG8gZXJyb3IwOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJbWVtY3B5KGxrcCwgcmtwLCBudW1ycmVjcyAqIHNpemVvZigqbGtwKSk7Ci0JCW1lbWNweShscHAsIHJwcCwgbnVtcnJlY3MgKiBzaXplb2YoKmxwcCkpOwotCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGxicCwgbnVtbHJlY3MgKyAxLCBudW1scmVjcyArIG51bXJyZWNzKTsKLQkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBsYnAsIG51bWxyZWNzICsgMSwgbnVtbHJlY3MgKyBudW1ycmVjcyk7Ci0JfSBlbHNlIHsKLQkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIG51bWxyZWNzICsgMSwgY3VyKTsKLQkJcnJwID0gWEZTX0JNQVBfUkVDX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1jcHkobHJwLCBycnAsIG51bXJyZWNzICogc2l6ZW9mKCpscnApKTsKLQkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBsYnAsIG51bWxyZWNzICsgMSwgbnVtbHJlY3MgKyBudW1ycmVjcyk7Ci0JfQotCWJlMTZfYWRkX2NwdSgmbGVmdC0+YmJfbnVtcmVjcywgbnVtcnJlY3MpOwotCWxlZnQtPmJiX3JpZ2h0c2liID0gcmlnaHQtPmJiX3JpZ2h0c2liOwotCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX1JJR0hUU0lCIHwgWEZTX0JCX05VTVJFQ1MpOwotCWlmIChiZTY0X3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYikgIT0gTlVMTERGU0JOTykgewotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwKLQkJCQliZTY0X3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksCi0JCQkJMCwgJnJyYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlnb3RvIGVycm9yMDsKLQkJfQotCQlycmJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJyYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCWdvdG8gZXJyb3IwOwotCQl9Ci0JCXJyYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmU2NChsYm5vKTsKLQkJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOwotCX0KLQl4ZnNfYm1hcF9hZGRfZnJlZShYRlNfREFERFJfVE9fRlNCKG1wLCBYRlNfQlVGX0FERFIocmJwKSksIDEsCi0JCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0LCBtcCk7Ci0JY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzLS07Ci0JeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwgWEZTX0lMT0dfQ09SRSk7Ci0JWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmIuaXAsCi0JCQlYRlNfVFJBTlNfRFFfQkNPVU5ULCAtMUwpOwotCXhmc190cmFuc19iaW52YWwoY3VyLT5iY190cCwgcmJwKTsKLQlpZiAoYnAgIT0gbGJwKSB7Ci0JCWN1ci0+YmNfYnVmc1tsZXZlbF0gPSBsYnA7Ci0JCWN1ci0+YmNfcHRyc1tsZXZlbF0gKz0gbHJlY3M7Ci0JCWN1ci0+YmNfcmFbbGV2ZWxdID0gMDsKLQl9IGVsc2UgaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIGxldmVsICsgMSwgJmkpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCWdvdG8gZXJyb3IwOwotCX0KLQlpZiAobGV2ZWwgPiAwKQotCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JKnN0YXQgPSAyOwotCXJldHVybiAwOwotCi1lcnJvcjA6Ci0JaWYgKHRjdXIpCi0JCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogSW5zZXJ0IG9uZSByZWNvcmQvbGV2ZWwuICBSZXR1cm4gaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlcgotICogYWxsb3dpbmcgdGhlIG5leHQgbGV2ZWwgdXAgdG8gcHJvY2VlZCBpZiBuZWNlc3NhcnkuCi0gKi8KLVNUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYm1idF9pbnNyZWMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAotCWludAkJCWxldmVsLAotCXhmc19mc2Jsb2NrX3QJCSpibm9wLAotCXhmc19ibWJ0X3JlY190CQkqcmVjcCwKLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwKLQlpbnQJCQkqc3RhdCkJCS8qIG5vLWdvL2RvbmUvY29udGludWUgKi8KLXsKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJCS8qIGJtYXAgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpicDsJCS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KLQlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCWludAkJCWk7CQkvKiBsb29wIGluZGV4ICovCi0JeGZzX2JtYnRfa2V5X3QJCWtleTsJCS8qIGJtYXAgYnRyZWUga2V5ICovCi0JeGZzX2JtYnRfa2V5X3QJCSprcD1OVUxMOwkvKiBwb2ludGVyIHRvIGJtYXAgYnRyZWUga2V5ICovCi0JaW50CQkJbG9nZmxhZ3M7CS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQl4ZnNfZnNibG9ja190CQluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAqLwotCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpuY3VyOwkJLyogbmV3IGJ0cmVlIGN1cnNvciAqLwotCV9fdWludDY0X3QJCXN0YXJ0b2ZmOwkvKiBuZXcgYnRyZWUga2V5IHZhbHVlICovCi0JeGZzX2JtYnRfcmVjX3QJCW5yZWM7CQkvKiBuZXcgcmVjb3JkIGNvdW50ICovCi0JaW50CQkJb3B0cjsJCS8qIG9sZCBrZXkvcmVjb3JkIGluZGV4ICovCi0JeGZzX2JtYnRfcHRyX3QJCSpwcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBibG9jayBhZGRyICovCi0JaW50CQkJcHRyOwkJLyoga2V5L3JlY29yZCBpbmRleCAqLwotCXhmc19ibWJ0X3JlY190CQkqcnA9TlVMTDsJLyogcG9pbnRlciB0byBibWFwIGJ0cmVlIHJlYyAqLwotCWludAkJCW51bXJlY3M7Ci0KLQlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOwotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdJRlIoY3VyLCBsZXZlbCwgKmJub3AsIHJlY3ApOwotCW5jdXIgPSBOVUxMOwotCWtleS5icl9zdGFydG9mZiA9IGNwdV90b19iZTY0KHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJlY3ApKTsKLQlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKLQlpZiAocHRyID09IDApIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCVhGU19TVEFUU19JTkMoeHNfYm1idF9pbnNyZWMpOwotCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0JbnVtcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQlpZiAocHRyIDw9IG51bXJlY3MpIHsKLQkJaWYgKGxldmVsID09IDApIHsKLQkJCXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCByZWNwLCBycCk7Ci0JCX0gZWxzZSB7Ci0JCQlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgcHRyLCBjdXIpOwotCQkJeGZzX2J0cmVlX2NoZWNrX2tleShYRlNfQlROVU1fQk1BUCwgJmtleSwga3ApOwotCQl9Ci0JfQotI2VuZGlmCi0JbmJubyA9IE5VTExGU0JMT0NLOwotCWlmIChudW1yZWNzID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7Ci0JCWlmIChudW1yZWNzIDwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJCS8qCi0JCQkgKiBBIHJvb3QgYmxvY2ssIHRoYXQgY2FuIGJlIG1hZGUgYmlnZ2VyLgotCQkJICovCi0JCQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgMSwKLQkJCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOwotCQkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKLQkJfSBlbHNlIGlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbmV3cm9vdChjdXIsICZsb2dmbGFncywgc3RhdCkpIHx8Ci0JCQkgICAgKnN0YXQgPT0gMCkgewotCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAotCQkJCWxvZ2ZsYWdzKTsKLQkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfcnNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQkJcmV0dXJuIGVycm9yOwotCQkJfQotCQkJaWYgKGkpIHsKLQkJCQkvKiBub3RoaW5nICovCi0JCQl9IGVsc2UgewotCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkgewotCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQl9Ci0JCQkJaWYgKGkpIHsKLQkJCQkJb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3NwbGl0KGN1ciwgbGV2ZWwsCi0JCQkJCQkJJm5ibm8sICZzdGFydG9mZiwgJm5jdXIsCi0JCQkJCQkJJmkpKSkgewotCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwKLQkJCQkJCQlFUlJPUik7Ci0JCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJCX0KLQkJCQkJaWYgKGkpIHsKLQkJCQkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKAotCQkJCQkJCSAgICBjdXIsIGxldmVsLCAmYnApOwotI2lmZGVmIERFQlVHCi0JCQkJCQlpZiAoKGVycm9yID0KLQkJCQkJCSAgICB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwKLQkJCQkJCQkgICAgYmxvY2ssIGxldmVsLCBicCkpKSB7Ci0JCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKAotCQkJCQkJCQljdXIsIEVSUk9SKTsKLQkJCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJCQl9Ci0jZW5kaWYKLQkJCQkJCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCQkJCQl4ZnNfYm1idF9kaXNrX3NldF9hbGxmKCZucmVjLAotCQkJCQkJCXN0YXJ0b2ZmLCAwLCAwLAotCQkJCQkJCVhGU19FWFRfTk9STSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLAotCQkJCQkJCUVYSVQpOwotCQkJCQkJKnN0YXQgPSAwOwotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JbnVtcmVjcyA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotCQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywgMSwgY3VyKTsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSBudW1yZWNzOyBpID49IHB0cjsgaS0tKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHJfZGlzayhjdXIsIHBwW2kgLSAxXSwKLQkJCQkJbGV2ZWwpKSkgewotCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOwotCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsICpibm9wLCBsZXZlbCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQlrcFtwdHIgLSAxXSA9IGtleTsKLQkJcHBbcHRyIC0gMV0gPSBjcHVfdG9fYmU2NCgqYm5vcCk7Ci0JCW51bXJlY3MrKzsKLQkJYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKLQkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKLQkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKLQl9IGVsc2UgewotCQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgMSwgY3VyKTsKLQkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAotCQkJKG51bXJlY3MgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKLQkJcnBbcHRyIC0gMV0gPSAqcmVjcDsKLQkJbnVtcmVjcysrOwotCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KG51bXJlY3MpOwotCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOwotCX0KLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX05VTVJFQ1MpOwotI2lmZGVmIERFQlVHCi0JaWYgKHB0ciA8IG51bXJlY3MpIHsKLQkJaWYgKGxldmVsID09IDApCi0JCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBycCArIHB0ciAtIDEsCi0JCQkJcnAgKyBwdHIpOwotCQllbHNlCi0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBrcCArIHB0ciAtIDEsCi0JCQkJa3AgKyBwdHIpOwotCX0KLSNlbmRpZgotCWlmIChvcHRyID09IDEgJiYgKGVycm9yID0geGZzX2JtYnRfdXBka2V5KGN1ciwgJmtleSwgbGV2ZWwgKyAxKSkpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCSpibm9wID0gbmJubzsKLQlpZiAobmJubyAhPSBOVUxMRlNCTE9DSykgewotCQkqcmVjcCA9IG5yZWM7Ci0JCSpjdXJwID0gbmN1cjsKLQl9Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi1TVEFUSUMgaW50Ci14ZnNfYm1idF9raWxscm9vdCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIpCi17Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7Ci0JeGZzX2JtYnRfYmxvY2tfdAkqY2Jsb2NrOwotCXhmc19idWZfdAkJKmNicDsKLQl4ZnNfYm1idF9rZXlfdAkJKmNrcDsKLQl4ZnNfYm1idF9wdHJfdAkJKmNwcDsKLSNpZmRlZiBERUJVRwotCWludAkJCWVycm9yOwotI2VuZGlmCi0JaW50CQkJaTsKLQl4ZnNfYm1idF9rZXlfdAkJKmtwOwotCXhmc19pbm9kZV90CQkqaXA7Ci0JeGZzX2lmb3JrX3QJCSppZnA7Ci0JaW50CQkJbGV2ZWw7Ci0JeGZzX2JtYnRfcHRyX3QJCSpwcDsKLQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlsZXZlbCA9IGN1ci0+YmNfbmxldmVscyAtIDE7Ci0JQVNTRVJUKGxldmVsID49IDEpOwotCS8qCi0JICogRG9uJ3QgZGVhbCB3aXRoIHRoZSByb290IGJsb2NrIG5lZWRzIHRvIGJlIGEgbGVhZiBjYXNlLgotCSAqIFdlJ3JlIGp1c3QgZ29pbmcgdG8gdHVybiB0aGUgdGhpbmcgYmFjayBpbnRvIGV4dGVudHMgYW55d2F5LgotCSAqLwotCWlmIChsZXZlbCA9PSAxKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmNicCk7Ci0JLyoKLQkgKiBHaXZlIHVwIGlmIHRoZSByb290IGhhcyBtdWx0aXBsZSBjaGlsZHJlbi4KLQkgKi8KLQlpZiAoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpICE9IDEpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgbmV4dCBsZXZlbCB3aWxsIGZpdC4KLQkgKiBUaGVuIHRoZSBkYXRhIG11c3QgYmUgY29waWVkIHVwIHRvIHRoZSBpbm9kZSwKLQkgKiBpbnN0ZWFkIG9mIGZyZWVpbmcgdGhlIHJvb3QgeW91IGZyZWUgdGhlIG5leHQgbGV2ZWwuCi0JICovCi0JY2JwID0gY3VyLT5iY19idWZzW2xldmVsIC0gMV07Ci0JY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGNicCk7Ci0JaWYgKGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcykgPiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXZlbCwgY3VyKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJcmV0dXJuIDA7Ci0JfQotCUFTU0VSVChiZTY0X3RvX2NwdShjYmxvY2stPmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8pOwotCUFTU0VSVChiZTY0X3RvX2NwdShjYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKTsKLQlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOwotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7Ci0JQVNTRVJUKFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpID09Ci0JICAgICAgIFhGU19CTUFQX0JST09UX01BWFJFQ1MoaWZwLT5pZl9icm9vdF9ieXRlcykpOwotCWkgPSAoaW50KShiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpIC0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpOwotCWlmIChpKSB7Ci0JCXhmc19pcm9vdF9yZWFsbG9jKGlwLCBpLCBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOwotCQlibG9jayA9IGlmcC0+aWZfYnJvb3Q7Ci0JfQotCWJlMTZfYWRkX2NwdSgmYmxvY2stPmJiX251bXJlY3MsIGkpOwotCUFTU0VSVChibG9jay0+YmJfbnVtcmVjcyA9PSBjYmxvY2stPmJiX251bXJlY3MpOwotCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotCWNrcCA9IFhGU19CTUFQX0tFWV9JQUREUihjYmxvY2ssIDEsIGN1cik7Ci0JbWVtY3B5KGtwLCBja3AsIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAqIHNpemVvZigqa3ApKTsKLQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywgMSwgY3VyKTsKLQljcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JZm9yIChpID0gMDsgaSA8IGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcyk7IGkrKykgewotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHJfZGlzayhjdXIsIGNwcFtpXSwgbGV2ZWwgLSAxKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLSNlbmRpZgotCW1lbWNweShwcCwgY3BwLCBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnBwKSk7Ci0JeGZzX2JtYXBfYWRkX2ZyZWUoWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoY2JwKSksIDEsCi0JCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCwgY3VyLT5iY19tcCk7Ci0JaXAtPmlfZC5kaV9uYmxvY2tzLS07Ci0JWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhjdXItPmJjX21wLCBjdXItPmJjX3RwLCBpcCwKLQkJCVhGU19UUkFOU19EUV9CQ09VTlQsIC0xTCk7Ci0JeGZzX3RyYW5zX2JpbnZhbChjdXItPmJjX3RwLCBjYnApOwotCWN1ci0+YmNfYnVmc1tsZXZlbCAtIDFdID0gTlVMTDsKLQliZTE2X2FkZF9jcHUoJmJsb2NrLT5iYl9sZXZlbCwgLTEpOwotCXhmc190cmFuc19sb2dfaW5vZGUoY3VyLT5iY190cCwgaXAsCi0JCVhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19GQlJPT1QoY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKSk7Ci0JY3VyLT5iY19ubGV2ZWxzLS07Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBMb2cga2V5IHZhbHVlcyBmcm9tIHRoZSBidHJlZSBibG9jay4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X2xvZ19rZXlzKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAotCXhmc19idWZfdAkqYnAsCi0JaW50CQlrZmlyc3QsCi0JaW50CQlrbGFzdCkKLXsKLQl4ZnNfdHJhbnNfdAkqdHA7Ci0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGN1ciwgYnAsIGtmaXJzdCwga2xhc3QpOwotCXRwID0gY3VyLT5iY190cDsKLQlpZiAoYnApIHsKLQkJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7Ci0JCWludAkJCWZpcnN0OwotCQl4ZnNfYm1idF9rZXlfdAkJKmtwOwotCQlpbnQJCQlsYXN0OwotCi0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkJa3AgPSBYRlNfQk1BUF9LRVlfREFERFIoYmxvY2ssIDEsIGN1cik7Ci0JCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZrcFtrZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZrcFtrbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOwotCX0gZWxzZSB7Ci0JCXhmc19pbm9kZV90CQkgKmlwOwotCi0JCWlwID0gY3VyLT5iY19wcml2YXRlLmIuaXA7Ci0JCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLAotCQkJWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOwotCX0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLX0KLQotLyoKLSAqIExvZyBwb2ludGVyIHZhbHVlcyBmcm9tIHRoZSBidHJlZSBibG9jay4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19ibWJ0X2xvZ19wdHJzKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAotCXhmc19idWZfdAkqYnAsCi0JaW50CQlwZmlyc3QsCi0JaW50CQlwbGFzdCkKLXsKLQl4ZnNfdHJhbnNfdAkqdHA7Ci0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGN1ciwgYnAsIHBmaXJzdCwgcGxhc3QpOwotCXRwID0gY3VyLT5iY190cDsKLQlpZiAoYnApIHsKLQkJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7Ci0JCWludAkJCWZpcnN0OwotCQlpbnQJCQlsYXN0OwotCQl4ZnNfYm1idF9wdHJfdAkJKnBwOwotCi0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkJcHAgPSBYRlNfQk1BUF9QVFJfREFERFIoYmxvY2ssIDEsIGN1cik7Ci0JCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZwcFtwZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZwcFtwbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOwotCX0gZWxzZSB7Ci0JCXhmc19pbm9kZV90CQkqaXA7Ci0KLQkJaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKLQkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsCi0JCQlYRlNfSUxPR19GQlJPT1QoY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKSk7Ci0JfQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotfQotCi0vKgotICogTG9va3VwIHRoZSByZWNvcmQuICBUaGUgY3Vyc29yIGlzIG1hZGUgdG8gcG9pbnQgdG8gaXQsIGJhc2VkIG9uIGRpci4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2JtYnRfbG9va3VwKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQl4ZnNfbG9va3VwX3QJCWRpciwKLQlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrPU5VTEw7Ci0JeGZzX2J1Zl90CQkqYnA7Ci0JeGZzX2RhZGRyX3QJCWQ7Ci0JeGZzX3NmaWxvZmZfdAkJZGlmZjsKLQlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCXhmc19mc2Jsb2NrX3QJCWZzYm5vPTA7Ci0JaW50CQkJaGlnaDsKLQlpbnQJCQlpOwotCWludAkJCWtleW5vPTA7Ci0JeGZzX2JtYnRfa2V5X3QJCSpra2Jhc2U9TlVMTDsKLQl4ZnNfYm1idF9rZXlfdAkJKmtrcDsKLQl4ZnNfYm1idF9yZWNfdAkJKmtyYmFzZT1OVUxMOwotCXhmc19ibWJ0X3JlY190CQkqa3JwOwotCWludAkJCWxldmVsOwotCWludAkJCWxvdzsKLQl4ZnNfbW91bnRfdAkJKm1wOwotCXhmc19ibWJ0X3B0cl90CQkqcHA7Ci0JeGZzX2JtYnRfaXJlY190CQkqcnA7Ci0JeGZzX2ZpbGVvZmZfdAkJc3RhcnRvZmY7Ci0JeGZzX3RyYW5zX3QJCSp0cDsKLQotCVhGU19TVEFUU19JTkMoeHNfYm1idF9sb29rdXApOwotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgKGludClkaXIpOwotCXRwID0gY3VyLT5iY190cDsKLQltcCA9IGN1ci0+YmNfbXA7Ci0JcnAgPSAmY3VyLT5iY19yZWMuYjsKLQlmb3IgKGxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMSwgZGlmZiA9IDE7IGxldmVsID49IDA7IGxldmVsLS0pIHsKLQkJaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkgewotCQkJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKLQkJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQkJCWlmIChicCAmJiBYRlNfQlVGX0FERFIoYnApICE9IGQpCi0JCQkJYnAgPSBOVUxMOwotCQkJaWYgKCFicCkgewotCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgZnNibm8sCi0JCQkJCQkwLCAmYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKSB7Ci0JCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCX0KLQkJCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIGJwKTsKLQkJCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7Ci0JCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywKLQkJCQkJCWxldmVsLCBicCkpKSB7Ci0JCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkJfSBlbHNlCi0JCQlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOwotCQlpZiAoZGlmZiA9PSAwKQotCQkJa2V5bm8gPSAxOwotCQllbHNlIHsKLQkJCWlmIChsZXZlbCA+IDApCi0JCQkJa2tiYXNlID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotCQkJZWxzZQotCQkJCWtyYmFzZSA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgMSwgY3VyKTsKLQkJCWxvdyA9IDE7Ci0JCQlpZiAoIShoaWdoID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSkgewotCQkJCUFTU0VSVChsZXZlbCA9PSAwKTsKLQkJCQljdXItPmJjX3B0cnNbMF0gPSBkaXIgIT0gWEZTX0xPT0tVUF9MRTsKLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJCQkqc3RhdCA9IDA7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQl3aGlsZSAobG93IDw9IGhpZ2gpIHsKLQkJCQlYRlNfU1RBVFNfSU5DKHhzX2JtYnRfY29tcGFyZSk7Ci0JCQkJa2V5bm8gPSAobG93ICsgaGlnaCkgPj4gMTsKLQkJCQlpZiAobGV2ZWwgPiAwKSB7Ci0JCQkJCWtrcCA9IGtrYmFzZSArIGtleW5vIC0gMTsKLQkJCQkJc3RhcnRvZmYgPSBiZTY0X3RvX2NwdShra3AtPmJyX3N0YXJ0b2ZmKTsKLQkJCQl9IGVsc2UgewotCQkJCQlrcnAgPSBrcmJhc2UgKyBrZXlubyAtIDE7Ci0JCQkJCXN0YXJ0b2ZmID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoa3JwKTsKLQkJCQl9Ci0JCQkJZGlmZiA9ICh4ZnNfc2ZpbG9mZl90KQotCQkJCQkJKHN0YXJ0b2ZmIC0gcnAtPmJyX3N0YXJ0b2ZmKTsKLQkJCQlpZiAoZGlmZiA8IDApCi0JCQkJCWxvdyA9IGtleW5vICsgMTsKLQkJCQllbHNlIGlmIChkaWZmID4gMCkKLQkJCQkJaGlnaCA9IGtleW5vIC0gMTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsZXZlbCA+IDApIHsKLQkJCWlmIChkaWZmID4gMCAmJiAtLWtleW5vIDwgMSkKLQkJCQlrZXlubyA9IDE7Ci0JCQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywga2V5bm8sIGN1cik7Ci0JCQlmc2JubyA9IGJlNjRfdG9fY3B1KCpwcCk7Ci0jaWZkZWYgREVCVUcKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIGZzYm5vLCBsZXZlbCkpKSB7Ci0JCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KLSNlbmRpZgotCQkJY3VyLT5iY19wdHJzW2xldmVsXSA9IGtleW5vOwotCQl9Ci0JfQotCWlmIChkaXIgIT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmIDwgMCkgewotCQlrZXlubysrOwotCQkvKgotCQkgKiBJZiBnZSBzZWFyY2ggYW5kIHdlIHdlbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgaXQncwotCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KLQkJICovCi0JCWlmIChkaXIgPT0gWEZTX0xPT0tVUF9HRSAmJiBrZXlubyA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAmJgotCQkgICAgYmU2NF90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSAhPSBOVUxMREZTQk5PKSB7Ci0JCQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKSB7Ci0JCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KLQkJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkJKnN0YXQgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoZGlyID09IFhGU19MT09LVVBfTEUgJiYgZGlmZiA+IDApCi0JCWtleW5vLS07Ci0JY3VyLT5iY19wdHJzWzBdID0ga2V5bm87Ci0JaWYgKGtleW5vID09IDAgfHwga2V5bm8gPiBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQl9IGVsc2UgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAoKGRpciAhPSBYRlNfTE9PS1VQX0VRKSB8fCAoZGlmZiA9PSAwKSk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogTW92ZSAxIHJlY29yZCBsZWZ0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgotICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KLSAqLwotU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWJ0X2xzaGlmdCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JaW50CQkJbGV2ZWwsCi0JaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotI2lmZGVmIERFQlVHCi0JaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLwotI2VuZGlmCi0JeGZzX2JtYnRfa2V5X3QJCWtleTsJCS8qIGJtYXAgYnRyZWUga2V5ICovCi0JeGZzX2J1Zl90CQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2JtYnRfa2V5X3QJCSpsa3A9TlVMTDsJLyogbGVmdCBidHJlZSBrZXkgKi8KLQl4ZnNfYm1idF9wdHJfdAkJKmxwcDsJCS8qIGxlZnQgYWRkcmVzcyBwb2ludGVyICovCi0JaW50CQkJbHJlY3M7CQkvKiBsZWZ0IHJlY29yZCBjb3VudCAqLwotCXhmc19ibWJ0X3JlY190CQkqbHJwPU5VTEw7CS8qIGxlZnQgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYm1idF9rZXlfdAkJKnJrcD1OVUxMOwkvKiByaWdodCBidHJlZSBrZXkgKi8KLQl4ZnNfYm1idF9wdHJfdAkJKnJwcD1OVUxMOwkvKiByaWdodCBhZGRyZXNzIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKnJycD1OVUxMOwkvKiByaWdodCByZWNvcmQgcG9pbnRlciAqLwotCWludAkJCXJyZWNzOwkJLyogcmlnaHQgcmVjb3JkIGNvdW50ICovCi0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKLQlpZiAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQlyaWdodCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhyYnApOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLSNlbmRpZgotCWlmIChiZTY0X3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTykgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gMSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JbXAgPSBjdXItPmJjX21wOwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBiZTY0X3RvX2NwdShyaWdodC0+YmJfbGVmdHNpYiksIDAsCi0JCQkmbGJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JbGVmdCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhsYnApOwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgPT0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgKyAxOwotCWlmIChsZXZlbCA+IDApIHsKLQkJbGtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOwotCQlya3AgPSBYRlNfQk1BUF9LRVlfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0JCSpsa3AgPSAqcmtwOwotCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKLQkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOwotCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyX2Rpc2soY3VyLCAqcnBwLCBsZXZlbCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQkqbHBwID0gKnJwcDsKLQkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBsYnAsIGxyZWNzLCBscmVjcyk7Ci0JfSBlbHNlIHsKLQkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOwotCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0JCSpscnAgPSAqcnJwOwotCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKLQl9Ci0JbGVmdC0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KGxyZWNzKTsKLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLSNpZmRlZiBERUJVRwotCWlmIChsZXZlbCA+IDApCi0JCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsIGxrcCAtIDEsIGxrcCk7Ci0JZWxzZQotCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBscnAgLSAxLCBscnApOwotI2VuZGlmCi0JcnJlY3MgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxOwotCXJpZ2h0LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYocnJlY3MpOwotCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX05VTVJFQ1MpOwotCWlmIChsZXZlbCA+IDApIHsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSAwOyBpIDwgcnJlY3M7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyX2Rpc2soY3VyLCBycHBbaSArIDFdLAotCQkJCQlsZXZlbCkpKSB7Ci0JCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCW1lbW1vdmUocmtwLCBya3AgKyAxLCBycmVjcyAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbW1vdmUocnBwLCBycHAgKyAxLCBycmVjcyAqIHNpemVvZigqcnBwKSk7Ci0JCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBycmVjcyk7Ci0JCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBycmVjcyk7Ci0JfSBlbHNlIHsKLQkJbWVtbW92ZShycnAsIHJycCArIDEsIHJyZWNzICogc2l6ZW9mKCpycnApKTsKLQkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCByYnAsIDEsIHJyZWNzKTsKLQkJa2V5LmJyX3N0YXJ0b2ZmID0gY3B1X3RvX2JlNjQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnJwKSk7Ci0JCXJrcCA9ICZrZXk7Ci0JfQotCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkoY3VyLCBya3AsIGxldmVsICsgMSkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQljdXItPmJjX3B0cnNbbGV2ZWxdLS07Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogTW92ZSAxIHJlY29yZCByaWdodCBmcm9tIGN1ci9sZXZlbCBpZiBwb3NzaWJsZS4KLSAqIFVwZGF0ZSBjdXIgdG8gcmVmbGVjdCB0aGUgbmV3IHBhdGguCi0gKi8KLVNUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYm1idF9yc2hpZnQoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAotCWludAkJCWxldmVsLAotCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCi0JeGZzX2JtYnRfa2V5X3QJCWtleTsJCS8qIGJtYXAgYnRyZWUga2V5ICovCi0JeGZzX2J1Zl90CQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2JtYnRfa2V5X3QJCSpsa3A7CQkvKiBsZWZ0IGJ0cmVlIGtleSAqLwotCXhmc19ibWJ0X3B0cl90CQkqbHBwOwkJLyogbGVmdCBhZGRyZXNzIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKmxycDsJCS8qIGxlZnQgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYm1idF9rZXlfdAkJKnJrcDsJCS8qIHJpZ2h0IGJ0cmVlIGtleSAqLwotCXhmc19ibWJ0X3B0cl90CQkqcnBwOwkJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCi0JeGZzX2JtYnRfcmVjX3QJCSpycnA9TlVMTDsJLyogcmlnaHQgcmVjb3JkIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqdGN1cjsJCS8qIHRlbXBvcmFyeSBidHJlZSBjdXJzb3IgKi8KLQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOwotCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlsYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCWxlZnQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLSNlbmRpZgotCWlmIChiZTY0X3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTykgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPj0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCW1wID0gY3VyLT5iY19tcDsKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgYmU2NF90b19jcHUobGVmdC0+YmJfcmlnaHRzaWIpLCAwLAotCQkJJnJicCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCXJpZ2h0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJicCk7Ci0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQlpZiAoYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKLQkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOwotCQlya3AgPSBYRlNfQk1BUF9LRVlfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0JCXJwcCA9IFhGU19CTUFQX1BUUl9JQUREUihyaWdodCwgMSwgY3VyKTsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyX2Rpc2soY3VyLCBycHBbaV0sIGxldmVsKSkpIHsKLQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQkJcmV0dXJuIGVycm9yOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJbWVtbW92ZShya3AgKyAxLCBya3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbW1vdmUocnBwICsgMSwgcnBwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJwcCkpOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cl9kaXNrKGN1ciwgKmxwcCwgbGV2ZWwpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0jZW5kaWYKLQkJKnJrcCA9ICpsa3A7Ci0JCSpycHAgPSAqbHBwOwotCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7Ci0JCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKyAxKTsKLQl9IGVsc2UgewotCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyksIGN1cik7Ci0JCXJycCA9IFhGU19CTUFQX1JFQ19JQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtbW92ZShycnAgKyAxLCBycnAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7Ci0JCSpycnAgPSAqbHJwOwotCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7Ci0JCWtleS5icl9zdGFydG9mZiA9IGNwdV90b19iZTY0KHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJycCkpOwotCQlya3AgPSAma2V5OwotCX0KLQliZTE2X2FkZF9jcHUoJmxlZnQtPmJiX251bXJlY3MsIC0xKTsKLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLQliZTE2X2FkZF9jcHUoJnJpZ2h0LT5iYl9udW1yZWNzLCAxKTsKLSNpZmRlZiBERUJVRwotCWlmIChsZXZlbCA+IDApCi0JCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsIHJrcCwgcmtwICsgMSk7Ci0JZWxzZQotCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBycnAsIHJycCArIDEpOwotI2VuZGlmCi0JeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7Ci0JaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKLQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IodGN1ciwgRVJST1IpOwotCQlnb3RvIGVycm9yMTsKLQl9Ci0JWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkodGN1ciwgcmtwLCBsZXZlbCArIDEpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IodGN1ciwgRVJST1IpOwotCQlnb3RvIGVycm9yMTsKLQl9Ci0JeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLWVycm9yMDoKLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci1lcnJvcjE6Ci0JeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBEZXRlcm1pbmUgdGhlIGV4dGVudCBzdGF0ZS4KICAqLwpAQCAtMTQ1MywyMjkgKzYwLDE1IEBACiAJcmV0dXJuIFhGU19FWFRfTk9STTsKIH0KIAotCi0vKgotICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCi0gKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgaXRzIGZpcnN0IHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgotICovCi1TVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYnRfc3BsaXQoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAotCWludAkJCWxldmVsLAotCXhmc19mc2Jsb2NrX3QJCSpibm9wLAotCV9fdWludDY0X3QJCSpzdGFydG9mZiwKLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwKLQlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19hbGxvY19hcmdfdAkJYXJnczsJCS8qIGJsb2NrIGFsbG9jYXRpb24gYXJncyAqLwotCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLwotCXhmc19mc2Jsb2NrX3QJCWxibm87CQkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2JtYnRfa2V5X3QJCSpsa3A7CQkvKiBsZWZ0IGJ0cmVlIGtleSAqLwotCXhmc19ibWJ0X3B0cl90CQkqbHBwOwkJLyogbGVmdCBhZGRyZXNzIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKmxycDsJCS8qIGxlZnQgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19ibWJ0X2Jsb2NrX3QJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYm1idF9rZXlfdAkJKnJrcDsJCS8qIHJpZ2h0IGJ0cmVlIGtleSAqLwotCXhmc19ibWJ0X3B0cl90CQkqcnBwOwkJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqcnJibG9jazsJLyogcmlnaHQtcmlnaHQgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpycmJwOwkJLyogcmlnaHQtcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9yZWNfdAkJKnJycDsJCS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCi0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHSUZLKGN1ciwgbGV2ZWwsICpibm9wLCAqc3RhcnRvZmYpOwotCWFyZ3MudHAgPSBjdXItPmJjX3RwOwotCWFyZ3MubXAgPSBjdXItPmJjX21wOwotCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JbGJubyA9IFhGU19EQUREUl9UT19GU0IoYXJncy5tcCwgWEZTX0JVRl9BRERSKGxicCkpOwotCWxlZnQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobGJwKTsKLQlhcmdzLmZzYm5vID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKLQlhcmdzLmZpcnN0YmxvY2sgPSBhcmdzLmZzYm5vOwotCWFyZ3MubWlubGVmdCA9IDA7Ci0JaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKLQkJYXJncy5mc2JubyA9IGxibm87Ci0JCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POwotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlcmUgaXMgc3VmZmljaWVudCByb29tIGxlZnQgaW4gdGhlIEFHIHRvCi0JCSAqIGNvbXBsZXRlIGEgZnVsbCB0cmVlIHNwbGl0IGZvciBhbiBleHRlbnQgaW5zZXJ0LiAgSWYKLQkJICogd2UgYXJlIGNvbnZlcnRpbmcgdGhlIG1pZGRsZSBwYXJ0IG9mIGFuIGV4dGVudCB0aGVuCi0JCSAqIHdlIG1heSBuZWVkIHNwYWNlIGZvciB0d28gdHJlZSBzcGxpdHMuCi0JCSAqCi0JCSAqIFdlIGFyZSByZWx5aW5nIG9uIHRoZSBjYWxsZXIgdG8gbWFrZSB0aGUgY29ycmVjdCBibG9jawotCQkgKiByZXNlcnZhdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24gdG8gc3VjY2VlZC4gIElmIHRoZQotCQkgKiByZXNlcnZhdGlvbiBhbW91bnQgaXMgaW5zdWZmaWNpZW50IHRoZW4gd2UgbWF5IGZhaWwgYQotCQkgKiBibG9jayBhbGxvY2F0aW9uIGhlcmUgYW5kIGNvcnJ1cHQgdGhlIGZpbGVzeXN0ZW0uCi0JCSAqLwotCQlhcmdzLm1pbmxlZnQgPSB4ZnNfdHJhbnNfZ2V0X2Jsb2NrX3JlcyhhcmdzLnRwKTsKLQl9IGVsc2UgaWYgKGN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0LT54YmZfbG93KQotCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzsKLQllbHNlCi0JCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87Ci0JYXJncy5tb2QgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLmlzZmwgPQotCQlhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOwotCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOwotCWFyZ3Mud2FzZGVsID0gY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9XQVNERUw7Ci0JaWYgKCFhcmdzLndhc2RlbCAmJiB4ZnNfdHJhbnNfZ2V0X2Jsb2NrX3JlcyhhcmdzLnRwKSA9PSAwKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOwotCX0KLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0sgJiYgYXJncy5taW5sZWZ0KSB7Ci0JCS8qCi0JCSAqIENvdWxkIG5vdCBmaW5kIGFuIEFHIHdpdGggZW5vdWdoIGZyZWUgc3BhY2UgdG8gc2F0aXNmeQotCQkgKiBhIGZ1bGwgYnRyZWUgc3BsaXQuICBUcnkgYWdhaW4gd2l0aG91dCBtaW5sZWZ0IGFuZCBpZgotCQkgKiBzdWNjZXNzZnVsIGFjdGl2YXRlIHRoZSBsb3dzcGFjZSBhbGdvcml0aG0uCi0JCSAqLwotCQlhcmdzLmZzYm5vID0gMDsKLQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKLQkJYXJncy5taW5sZWZ0ID0gMDsKLQkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdC0+eGJmX2xvdyA9IDE7Ci0JfQotCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlBU1NFUlQoYXJncy5sZW4gPT0gMSk7Ci0JY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IGFyZ3MuZnNibm87Ci0JY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkKys7Ci0JY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzKys7Ci0JeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwgWEZTX0lMT0dfQ09SRSk7Ci0JWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhhcmdzLm1wLCBhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKLQkJCVhGU19UUkFOU19EUV9CQ09VTlQsIDFMKTsKLQlyYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgYXJncy50cCwgYXJncy5mc2JubywgMCk7Ci0JcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIHJicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLSNlbmRpZgotCXJpZ2h0LT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19CTUFQX01BR0lDKTsKLQlyaWdodC0+YmJfbGV2ZWwgPSBsZWZ0LT5iYl9sZXZlbDsKLQlyaWdodC0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC8gMik7Ci0JaWYgKChiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAmIDEpICYmCi0JICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSkKLQkJYmUxNl9hZGRfY3B1KCZyaWdodC0+YmJfbnVtcmVjcywgMSk7Ci0JaSA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMTsKLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBpLCBjdXIpOwotCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgaSwgY3VyKTsKLQkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwotCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsgaSsrKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHJfZGlzayhjdXIsIGxwcFtpXSwgbGV2ZWwpKSkgewotCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQltZW1jcHkocmtwLCBsa3AsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcmtwKSk7Ci0JCW1lbWNweShycHAsIGxwcCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycHApKTsKLQkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7Ci0JCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwotCQkqc3RhcnRvZmYgPSBiZTY0X3RvX2NwdShya3AtPmJyX3N0YXJ0b2ZmKTsKLQl9IGVsc2UgewotCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgaSwgY3VyKTsKLQkJcnJwID0gWEZTX0JNQVBfUkVDX0lBRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1jcHkocnJwLCBscnAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7Ci0JCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwotCQkqc3RhcnRvZmYgPSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycnApOwotCX0KLQliZTE2X2FkZF9jcHUoJmxlZnQtPmJiX251bXJlY3MsIC0oYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKSk7Ci0JcmlnaHQtPmJiX3JpZ2h0c2liID0gbGVmdC0+YmJfcmlnaHRzaWI7Ci0JbGVmdC0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChhcmdzLmZzYm5vKTsKLQlyaWdodC0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTY0KGxibm8pOwotCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTIHwgWEZTX0JCX1JJR0hUU0lCKTsKLQlpZiAoYmU2NF90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMREZTQk5PKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKGFyZ3MubXAsIGFyZ3MudHAsCi0JCQkJYmU2NF90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSwgMCwgJnJyYnAsCi0JCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQlycmJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJyYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQlycmJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlNjQoYXJncy5mc2Jubyk7Ci0JCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKLQl9Ci0JaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPiBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSArIDEpIHsKLQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCByYnApOwotCQljdXItPmJjX3B0cnNbbGV2ZWxdIC09IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwotCX0KLQlpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsIGN1cnApKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCSgqY3VycCktPmJjX3B0cnNbbGV2ZWwgKyAxXSsrOwotCX0KLQkqYm5vcCA9IGFyZ3MuZnNibm87Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBVcGRhdGUga2V5cyBmb3IgdGhlIHJlY29yZC4KLSAqLwotU1RBVElDIGludAoteGZzX2JtYnRfdXBka2V5KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQl4ZnNfYm1idF9rZXlfdAkJKmtleXAsCS8qIG9uLWRpc2sgZm9ybWF0ICovCi0JaW50CQkJbGV2ZWwpCi17Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7Ci0JeGZzX2J1Zl90CQkqYnA7Ci0jaWZkZWYgREVCVUcKLQlpbnQJCQllcnJvcjsKLSNlbmRpZgotCXhmc19ibWJ0X2tleV90CQkqa3A7Ci0JaW50CQkJcHRyOwotCi0JQVNTRVJUKGxldmVsID49IDEpOwotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdJSyhjdXIsIGxldmVsLCBrZXlwKTsKLQlmb3IgKHB0ciA9IDE7IHB0ciA9PSAxICYmIGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7Ci0JCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotI2VuZGlmCi0JCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCSprcCA9ICprZXlwOwotCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIHB0cik7Ci0JfQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCXJldHVybiAwOwotfQotCiAvKgogICogQ29udmVydCBvbi1kaXNrIGZvcm0gb2YgYnRyZWUgcm9vdCB0byBpbi1tZW1vcnkgZm9ybS4KICAqLwogdm9pZAogeGZzX2JtZHJfdG9fYm1idCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAl4ZnNfYm1kcl9ibG9ja190CSpkYmxvY2ssCiAJaW50CQkJZGJsb2NrbGVuLAotCXhmc19ibWJ0X2Jsb2NrX3QJKnJibG9jaywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpyYmxvY2ssCiAJaW50CQkJcmJsb2NrbGVuKQogewogCWludAkJCWRteHI7CkBAIC0xNjg4LDEyOSArODEsMTkgQEAKIAlyYmxvY2stPmJiX2xldmVsID0gZGJsb2NrLT5iYl9sZXZlbDsKIAlBU1NFUlQoYmUxNl90b19jcHUocmJsb2NrLT5iYl9sZXZlbCkgPiAwKTsKIAlyYmxvY2stPmJiX251bXJlY3MgPSBkYmxvY2stPmJiX251bXJlY3M7Ci0JcmJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7Ci0JcmJsb2NrLT5iYl9yaWdodHNpYiA9IGNwdV90b19iZTY0KE5VTExERlNCTk8pOwotCWRteHIgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGRibG9ja2xlbiwgeGZzX2JtZHIsIDApOwotCWZrcCA9IFhGU19CVFJFRV9LRVlfQUREUih4ZnNfYm1kciwgZGJsb2NrLCAxKTsKLQl0a3AgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7Ci0JZnBwID0gWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWRyLCBkYmxvY2ssIDEsIGRteHIpOwotCXRwcCA9IFhGU19CTUFQX0JST09UX1BUUl9BRERSKHJibG9jaywgMSwgcmJsb2NrbGVuKTsKKwlyYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liID0gY3B1X3RvX2JlNjQoTlVMTERGU0JOTyk7CisJcmJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMREZTQk5PKTsKKwlkbXhyID0geGZzX2JtZHJfbWF4cmVjcyhtcCwgZGJsb2NrbGVuLCAwKTsKKwlma3AgPSBYRlNfQk1EUl9LRVlfQUREUihkYmxvY2ssIDEpOworCXRrcCA9IFhGU19CTUJUX0tFWV9BRERSKG1wLCByYmxvY2ssIDEpOworCWZwcCA9IFhGU19CTURSX1BUUl9BRERSKGRibG9jaywgMSwgZG14cik7CisJdHBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIHJibG9jaywgMSwgcmJsb2NrbGVuKTsKIAlkbXhyID0gYmUxNl90b19jcHUoZGJsb2NrLT5iYl9udW1yZWNzKTsKIAltZW1jcHkodGtwLCBma3AsIHNpemVvZigqZmtwKSAqIGRteHIpOwogCW1lbWNweSh0cHAsIGZwcCwgc2l6ZW9mKCpmcHApICogZG14cik7CiB9CiAKIC8qCi0gKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgotICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgotICovCi1pbnQJCQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYnRfZGVjcmVtZW50KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQlpbnQJCQlsZXZlbCwKLQlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwotCXhmc19idWZfdAkJKmJwOwotCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2ZzYmxvY2tfdAkJZnNibm87Ci0JaW50CQkJbGV2OwotCXhmc19tb3VudF90CQkqbXA7Ci0JeGZzX3RyYW5zX3QJCSp0cDsKLQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOwotCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7Ci0JaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkKLQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfTEVGVFJBKTsKLQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2ZWxdID4gMCkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLSNlbmRpZgotCWlmIChiZTY0X3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTykgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKLQkJaWYgKC0tY3VyLT5iY19wdHJzW2xldl0gPiAwKQotCQkJYnJlYWs7Ci0JCWlmIChsZXYgPCBjdXItPmJjX25sZXZlbHMgLSAxKQotCQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7Ci0JfQotCWlmIChsZXYgPT0gY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQl0cCA9IGN1ci0+YmNfdHA7Ci0JbXAgPSBjdXItPmJjX21wOwotCWZvciAoYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7IGxldiA+IGxldmVsOyApIHsKLQkJZnNibm8gPSBiZTY0X3RvX2NwdSgqWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgZnNibm8sIDAsICZicCwKLQkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCWxldi0tOwotCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2LCBicCk7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJY3VyLT5iY19wdHJzW2xldl0gPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7Ci0JfQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgotICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfYm1idF9kZWxldGUoCi0JeGZzX2J0cmVlX2N1cl90CSpjdXIsCi0JaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCWk7Ci0JaW50CQlsZXZlbDsKLQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlmb3IgKGxldmVsID0gMCwgaSA9IDI7IGkgPT0gMjsgbGV2ZWwrKykgewotCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVscmVjKGN1ciwgbGV2ZWwsICZpKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLQlpZiAoaSA9PSAwKSB7Ci0JCWZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgewotCQkJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPT0gMCkgewotCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwKLQkJCQkJCSZpKSkpIHsKLQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCSpzdGF0ID0gaTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIENvbnZlcnQgYSBjb21wcmVzc2VkIGJtYXAgZXh0ZW50IHJlY29yZCB0byBhbiB1bmNvbXByZXNzZWQgZm9ybS4KICAqIFRoaXMgY29kZSBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUgcm91dGluZXMgeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmLAogICogeGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2ssIHhmc19ibWJ0X2dldF9ibG9ja2NvdW50IGFuZCB4ZnNfYm1idF9nZXRfc3RhdGUuCkBAIC0xODY0LDMxICsxNDcsNiBAQAogfQogCiAvKgotICogR2V0IHRoZSBibG9jayBwb2ludGVyIGZvciB0aGUgZ2l2ZW4gbGV2ZWwgb2YgdGhlIGN1cnNvci4KLSAqIEZpbGwgaW4gdGhlIGJ1ZmZlciBwb2ludGVyLCBpZiBhcHBsaWNhYmxlLgotICovCi14ZnNfYm1idF9ibG9ja190ICoKLXhmc19ibWJ0X2dldF9ibG9jaygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JaW50CQkJbGV2ZWwsCi0JeGZzX2J1Zl90CQkqKmJwcCkKLXsKLQl4ZnNfaWZvcmtfdAkJKmlmcDsKLQl4ZnNfYm1idF9ibG9ja190CSpydmFsOwotCi0JaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkgewotCQkqYnBwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQkJcnZhbCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSygqYnBwKTsKLQl9IGVsc2UgewotCQkqYnBwID0gTlVMTDsKLQkJaWZwID0gWEZTX0lGT1JLX1BUUihjdXItPmJjX3ByaXZhdGUuYi5pcCwKLQkJCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7Ci0JCXJ2YWwgPSBpZnAtPmlmX2Jyb290OwotCX0KLQlyZXR1cm4gcnZhbDsKLX0KLQotLyoKICAqIEV4dHJhY3QgdGhlIGJsb2NrY291bnQgZmllbGQgZnJvbSBhbiBpbiBtZW1vcnkgYm1hcCBleHRlbnQgcmVjb3JkLgogICovCiB4ZnNfZmlsYmxrc190CkBAIC0xOTUwLDcgKzIwOCw4IEBACiAJeGZzX2JtYnRfcmVjX3QJKnIsCiAJeGZzX2JtYnRfaXJlY190ICpzKQogewotCV9feGZzX2JtYnRfZ2V0X2FsbChiZTY0X3RvX2NwdShyLT5sMCksIGJlNjRfdG9fY3B1KHItPmwxKSwgcyk7CisJX194ZnNfYm1idF9nZXRfYWxsKGdldF91bmFsaWduZWRfYmU2NCgmci0+bDApLAorCQkJCWdldF91bmFsaWduZWRfYmU2NCgmci0+bDEpLCBzKTsKIH0KIAogLyoKQEAgLTE5NzQsMzQ4ICsyMzMsNiBAQAogCQkgWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OwogfQogCi0vKgotICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KLSAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWJ0X2luY3JlbWVudCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JaW50CQkJbGV2ZWwsCi0JaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKLQl4ZnNfYnVmX3QJCSpicDsKLQlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCXhmc19mc2Jsb2NrX3QJCWZzYm5vOwotCWludAkJCWxldjsKLQl4ZnNfbW91bnRfdAkJKm1wOwotCXhmc190cmFuc190CQkqdHA7Ci0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKLQlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOwotCWlmIChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyAtIDEpCi0JCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX1JJR0hUUkEpOwotCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0jZW5kaWYKLQlpZiAoKytjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTykgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKLQkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpCi0JCQlicmVhazsKLQkJaWYgKGxldiA8IGN1ci0+YmNfbmxldmVscyAtIDEpCi0JCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfUklHSFRSQSk7Ci0JfQotCWlmIChsZXYgPT0gY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQl0cCA9IGN1ci0+YmNfdHA7Ci0JbXAgPSBjdXItPmJjX21wOwotCWZvciAoYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7IGxldiA+IGxldmVsOyApIHsKLQkJZnNibm8gPSBiZTY0X3RvX2NwdSgqWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgZnNibm8sIDAsICZicCwKLQkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCWxldi0tOwotCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2LCBicCk7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKSB7Ci0JCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJY3VyLT5iY19wdHJzW2xldl0gPSAxOwotCX0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJbnNlcnQgdGhlIGN1cnJlbnQgcmVjb3JkIGF0IHRoZSBwb2ludCByZWZlcmVuY2VkIGJ5IGN1ci4KLSAqCi0gKiBBIG11bHRpLWxldmVsIHNwbGl0IG9mIHRoZSB0cmVlIG9uIGluc2VydCB3aWxsIGludmFsaWRhdGUgdGhlIG9yaWdpbmFsCi0gKiBjdXJzb3IuICBBbGwgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgY3Vyc29yIGlzCi0gKiBubyBsb25nZXIgdmFsaWQgYW5kIHJldmFsaWRhdGUgaXQuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWJ0X2luc2VydCgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCWludAkJaTsKLQlpbnQJCWxldmVsOwotCXhmc19mc2Jsb2NrX3QJbmJubzsKLQl4ZnNfYnRyZWVfY3VyX3QJKm5jdXI7Ci0JeGZzX2JtYnRfcmVjX3QJbnJlYzsKLQl4ZnNfYnRyZWVfY3VyX3QJKnBjdXI7Ci0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JbGV2ZWwgPSAwOwotCW5ibm8gPSBOVUxMRlNCTE9DSzsKLQl4ZnNfYm1idF9kaXNrX3NldF9hbGwoJm5yZWMsICZjdXItPmJjX3JlYy5iKTsKLQluY3VyID0gTlVMTDsKLQlwY3VyID0gY3VyOwotCWRvIHsKLQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc3JlYyhwY3VyLCBsZXZlbCsrLCAmbmJubywgJm5yZWMsICZuY3VyLAotCQkJCSZpKSkpIHsKLQkJCWlmIChwY3VyICE9IGN1cikKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfRVJST1IpOwotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJaWYgKHBjdXIgIT0gY3VyICYmIChuY3VyIHx8IG5ibm8gPT0gTlVMTEZTQkxPQ0spKSB7Ci0JCQljdXItPmJjX25sZXZlbHMgPSBwY3VyLT5iY19ubGV2ZWxzOwotCQkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkICs9Ci0JCQkJcGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZDsKLQkJCXBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOwotCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrICE9IE5VTExGU0JMT0NLKSB8fAotCQkJICAgICAgIFhGU19JU19SRUFMVElNRV9JTk9ERShjdXItPmJjX3ByaXZhdGUuYi5pcCkpOwotCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9Ci0JCQkJcGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7Ci0JCQlBU1NFUlQoY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPT0KLQkJCSAgICAgICBwY3VyLT5iY19wcml2YXRlLmIuZmxpc3QpOwotCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCQl9Ci0JCWlmIChuY3VyKSB7Ci0JCQlwY3VyID0gbmN1cjsKLQkJCW5jdXIgPSBOVUxMOwotCQl9Ci0JfSB3aGlsZSAobmJubyAhPSBOVUxMRlNCTE9DSyk7Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JKnN0YXQgPSBpOwotCXJldHVybiAwOwotZXJyb3IwOgotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBMb2cgZmllbGRzIGZyb20gdGhlIGJ0cmVlIGJsb2NrIGhlYWRlci4KLSAqLwotdm9pZAoteGZzX2JtYnRfbG9nX2Jsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQl4ZnNfYnVmX3QJCSpicCwKLQlpbnQJCQlmaWVsZHMpCi17Ci0JaW50CQkJZmlyc3Q7Ci0JaW50CQkJbGFzdDsKLQl4ZnNfdHJhbnNfdAkJKnRwOwotCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7Ci0JCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX21hZ2ljKSwKLQkJb2Zmc2V0b2YoeGZzX2JtYnRfYmxvY2tfdCwgYmJfbGV2ZWwpLAotCQlvZmZzZXRvZih4ZnNfYm1idF9ibG9ja190LCBiYl9udW1yZWNzKSwKLQkJb2Zmc2V0b2YoeGZzX2JtYnRfYmxvY2tfdCwgYmJfbGVmdHNpYiksCi0JCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX3JpZ2h0c2liKSwKLQkJc2l6ZW9mKHhmc19ibWJ0X2Jsb2NrX3QpCi0JfTsKLQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKLQlYRlNfQk1CVF9UUkFDRV9BUkdCSShjdXIsIGJwLCBmaWVsZHMpOwotCXRwID0gY3VyLT5iY190cDsKLQlpZiAoYnApIHsKLQkJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQkJfTlVNX0JJVFMsICZmaXJzdCwKLQkJCQkgICZsYXN0KTsKLQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7Ci0JfSBlbHNlCi0JCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAotCQkJWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOwotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotfQotCi0vKgotICogTG9nIHJlY29yZCB2YWx1ZXMgZnJvbSB0aGUgYnRyZWUgYmxvY2suCi0gKi8KLXZvaWQKLXhmc19ibWJ0X2xvZ19yZWNzKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKLQl4ZnNfYnVmX3QJCSpicCwKLQlpbnQJCQlyZmlyc3QsCi0JaW50CQkJcmxhc3QpCi17Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7Ci0JaW50CQkJZmlyc3Q7Ci0JaW50CQkJbGFzdDsKLQl4ZnNfYm1idF9yZWNfdAkJKnJwOwotCXhmc190cmFuc190CQkqdHA7Ci0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGN1ciwgYnAsIHJmaXJzdCwgcmxhc3QpOwotCUFTU0VSVChicCk7Ci0JdHAgPSBjdXItPmJjX3RwOwotCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQlycCA9IFhGU19CTUFQX1JFQ19EQUREUihibG9jaywgMSwgY3VyKTsKLQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcnBbcmZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZycFtybGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7Ci0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci19Ci0KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWJ0X2xvb2t1cF9lcSgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKLQl4ZnNfZmlsZW9mZl90CW9mZiwKLQl4ZnNfZnNibG9ja190CWJubywKLQl4ZnNfZmlsYmxrc190CWxlbiwKLQlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JY3VyLT5iY19yZWMuYi5icl9zdGFydG9mZiA9IG9mZjsKLQljdXItPmJjX3JlYy5iLmJyX3N0YXJ0YmxvY2sgPSBibm87Ci0JY3VyLT5iY19yZWMuYi5icl9ibG9ja2NvdW50ID0gbGVuOwotCXJldHVybiB4ZnNfYm1idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0VRLCBzdGF0KTsKLX0KLQotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYnRfbG9va3VwX2dlKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAotCXhmc19maWxlb2ZmX3QJb2ZmLAotCXhmc19mc2Jsb2NrX3QJYm5vLAotCXhmc19maWxibGtzX3QJbGVuLAotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQljdXItPmJjX3JlYy5iLmJyX3N0YXJ0b2ZmID0gb2ZmOwotCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRibG9jayA9IGJubzsKLQljdXItPmJjX3JlYy5iLmJyX2Jsb2NrY291bnQgPSBsZW47Ci0JcmV0dXJuIHhmc19ibWJ0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfR0UsIHN0YXQpOwotfQotCi0vKgotICogR2l2ZSB0aGUgYm1hcCBidHJlZSBhIG5ldyByb290IGJsb2NrLiAgQ29weSB0aGUgb2xkIGJyb290IGNvbnRlbnRzCi0gKiBkb3duIGludG8gYSByZWFsIGJsb2NrIGFuZCBtYWtlIHRoZSBicm9vdCBwb2ludCB0byBpdC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWJ0X25ld3Jvb3QoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJKmxvZ2ZsYWdzLAkvKiBsb2dnaW5nIGZsYWdzIGZvciBpbm9kZSAqLwotCWludAkJCSpzdGF0KQkJLyogcmV0dXJuIHN0YXR1cyAtIDAgZmFpbCAqLwotewotCXhmc19hbGxvY19hcmdfdAkJYXJnczsJCS8qIGFsbG9jYXRpb24gYXJndW1lbnRzICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CQkvKiBibWFwIGJ0cmVlIGJsb2NrICovCi0JeGZzX2J1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCi0JeGZzX2JtYnRfYmxvY2tfdAkqY2Jsb2NrOwkvKiBjaGlsZCBidHJlZSBibG9jayAqLwotCXhmc19ibWJ0X2tleV90CQkqY2twOwkJLyogY2hpbGQga2V5IHBvaW50ZXIgKi8KLQl4ZnNfYm1idF9wdHJfdAkJKmNwcDsJCS8qIGNoaWxkIHB0ciBwb2ludGVyICovCi0JaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLwotI2lmZGVmIERFQlVHCi0JaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLwotI2VuZGlmCi0JeGZzX2JtYnRfa2V5X3QJCSprcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBidHJlZSBrZXkgKi8KLQlpbnQJCQlsZXZlbDsJCS8qIGJ0cmVlIGxldmVsICovCi0JeGZzX2JtYnRfcHRyX3QJCSpwcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBibG9jayBhZGRyICovCi0KLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7Ci0JbGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxOwotCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0JLyoKLQkgKiBDb3B5IHRoZSByb290IGludG8gYSByZWFsIGJsb2NrLgotCSAqLwotCWFyZ3MubXAgPSBjdXItPmJjX21wOwotCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOwotCWFyZ3MudHAgPSBjdXItPmJjX3RwOwotCWFyZ3MuZnNibm8gPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOwotCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy5pc2ZsID0KLQkJYXJncy51c2VyZGF0YSA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKLQlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKLQlhcmdzLndhc2RlbCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMOwotCWFyZ3MuZmlyc3RibG9jayA9IGFyZ3MuZnNibm87Ci0JaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKLSNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHJfZGlzayhjdXIsICpwcCwgbGV2ZWwpKSkgewotCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0jZW5kaWYKLQkJYXJncy5mc2JubyA9IGJlNjRfdG9fY3B1KCpwcCk7Ci0JCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POwotCX0gZWxzZSBpZiAoY3VyLT5iY19wcml2YXRlLmIuZmxpc3QtPnhiZl9sb3cpCi0JCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POwotCWVsc2UKLQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCUFTU0VSVChhcmdzLmxlbiA9PSAxKTsKLQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gYXJncy5mc2JubzsKLQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQrKzsKLQljdXItPmJjX3ByaXZhdGUuYi5pcC0+aV9kLmRpX25ibG9ja3MrKzsKLQlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKGFyZ3MubXAsIGFyZ3MudHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAotCQkJICBYRlNfVFJBTlNfRFFfQkNPVU5ULCAxTCk7Ci0JYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgY3VyLT5iY190cCwgYXJncy5mc2JubywgMCk7Ci0JY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKLQkqY2Jsb2NrID0gKmJsb2NrOwotCWJlMTZfYWRkX2NwdSgmYmxvY2stPmJiX2xldmVsLCAxKTsKLQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KDEpOwotCWN1ci0+YmNfbmxldmVscysrOwotCWN1ci0+YmNfcHRyc1tsZXZlbCArIDFdID0gMTsKLQlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKLQlja3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOwotCW1lbWNweShja3AsIGtwLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpICogc2l6ZW9mKCprcCkpOwotCWNwcCA9IFhGU19CTUFQX1BUUl9JQUREUihjYmxvY2ssIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUoY2Jsb2NrLT5iYl9udW1yZWNzKTsgaSsrKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cl9kaXNrKGN1ciwgcHBbaV0sIGxldmVsKSkpIHsKLQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLSNlbmRpZgotCW1lbWNweShjcHAsIHBwLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpICogc2l6ZW9mKCpwcCkpOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgYXJncy5mc2JubywgbGV2ZWwpKSkgewotCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0jZW5kaWYKLQkqcHAgPSBjcHVfdG9fYmU2NChhcmdzLmZzYm5vKTsKLQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgMSAtIGJlMTZfdG9fY3B1KGNibG9jay0+YmJfbnVtcmVjcyksCi0JCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7Ci0JeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBicCk7Ci0JLyoKLQkgKiBEbyBhbGwgdGhpcyBsb2dnaW5nIGF0IHRoZSBlbmQgc28gdGhhdAotCSAqIHRoZSByb290IGlzIGF0IHRoZSByaWdodCBsZXZlbC4KLQkgKi8KLQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCAxLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpKTsKLQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGJwLCAxLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpKTsKLQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKLQkqbG9nZmxhZ3MgfD0KLQkJWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLX0KIAogLyoKICAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSBhcmd1bWVudHMuCkBAIC0yNTEyLDcgKzQyOSw4IEBACiAgKi8KIHZvaWQKIHhmc19ibWJ0X3RvX2JtZHIoCi0JeGZzX2JtYnRfYmxvY2tfdAkqcmJsb2NrLAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKnJibG9jaywKIAlpbnQJCQlyYmxvY2tsZW4sCiAJeGZzX2JtZHJfYmxvY2tfdAkqZGJsb2NrLAogCWludAkJCWRibG9ja2xlbikKQEAgLTI1MjQsNjcgKzQ0MiwyMiBAQAogCV9fYmU2NAkJCSp0cHA7CiAKIAlBU1NFUlQoYmUzMl90b19jcHUocmJsb2NrLT5iYl9tYWdpYykgPT0gWEZTX0JNQVBfTUFHSUMpOwotCUFTU0VSVChiZTY0X3RvX2NwdShyYmxvY2stPmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8pOwotCUFTU0VSVChiZTY0X3RvX2NwdShyYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoYmU2NF90b19jcHUocmJsb2NrLT5iYl91LmwuYmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKGJlNjRfdG9fY3B1KHJibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKTsKIAlBU1NFUlQoYmUxNl90b19jcHUocmJsb2NrLT5iYl9sZXZlbCkgPiAwKTsKIAlkYmxvY2stPmJiX2xldmVsID0gcmJsb2NrLT5iYl9sZXZlbDsKIAlkYmxvY2stPmJiX251bXJlY3MgPSByYmxvY2stPmJiX251bXJlY3M7Ci0JZG14ciA9IChpbnQpWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoZGJsb2NrbGVuLCB4ZnNfYm1kciwgMCk7Ci0JZmtwID0gWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIocmJsb2NrLCAxLCByYmxvY2tsZW4pOwotCXRrcCA9IFhGU19CVFJFRV9LRVlfQUREUih4ZnNfYm1kciwgZGJsb2NrLCAxKTsKLQlmcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7Ci0JdHBwID0gWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWRyLCBkYmxvY2ssIDEsIGRteHIpOworCWRteHIgPSB4ZnNfYm1kcl9tYXhyZWNzKG1wLCBkYmxvY2tsZW4sIDApOworCWZrcCA9IFhGU19CTUJUX0tFWV9BRERSKG1wLCByYmxvY2ssIDEpOworCXRrcCA9IFhGU19CTURSX0tFWV9BRERSKGRibG9jaywgMSk7CisJZnBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIHJibG9jaywgMSwgcmJsb2NrbGVuKTsKKwl0cHAgPSBYRlNfQk1EUl9QVFJfQUREUihkYmxvY2ssIDEsIGRteHIpOwogCWRteHIgPSBiZTE2X3RvX2NwdShkYmxvY2stPmJiX251bXJlY3MpOwogCW1lbWNweSh0a3AsIGZrcCwgc2l6ZW9mKCpma3ApICogZG14cik7CiAJbWVtY3B5KHRwcCwgZnBwLCBzaXplb2YoKmZwcCkgKiBkbXhyKTsKIH0KIAogLyoKLSAqIFVwZGF0ZSB0aGUgcmVjb3JkIHRvIHRoZSBwYXNzZWQgdmFsdWVzLgotICovCi1pbnQKLXhmc19ibWJ0X3VwZGF0ZSgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCi0JeGZzX2ZpbGVvZmZfdAkJb2ZmLAotCXhmc19mc2Jsb2NrX3QJCWJubywKLQl4ZnNfZmlsYmxrc190CQlsZW4sCi0JeGZzX2V4bnRzdF90CQlzdGF0ZSkKLXsKLQl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKLQl4ZnNfYnVmX3QJCSpicDsKLQlpbnQJCQllcnJvcjsKLQl4ZnNfYm1idF9rZXlfdAkJa2V5OwotCWludAkJCXB0cjsKLQl4ZnNfYm1idF9yZWNfdAkJKnJwOwotCi0JWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOwotCVhGU19CTUJUX1RSQUNFX0FSR0ZGRkkoY3VyLCAoeGZzX2RmaWxvZmZfdClvZmYsICh4ZnNfZGZzYm5vX3QpYm5vLAotCQkoeGZzX2RmaWxibGtzX3QpbGVuLCAoaW50KXN0YXRlKTsKLQlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIDAsICZicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCAwLCBicCkpKSB7Ci0JCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLSNlbmRpZgotCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKLQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgcHRyLCBjdXIpOwotCXhmc19ibWJ0X2Rpc2tfc2V0X2FsbGYocnAsIG9mZiwgYm5vLCBsZW4sIHN0YXRlKTsKLQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIHB0cik7Ci0JaWYgKHB0ciA+IDEpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Ci0JCXJldHVybiAwOwotCX0KLQlrZXkuYnJfc3RhcnRvZmYgPSBjcHVfdG9fYmU2NChvZmYpOwotCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkoY3VyLCAma2V5LCAxKSkpIHsKLQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOwotCXJldHVybiAwOwotfQotCi0vKgogICogQ2hlY2sgZXh0ZW50IHJlY29yZHMsIHdoaWNoIGhhdmUganVzdCBiZWVuIHJlYWQsIGZvcgogICogYW55IGJpdCBpbiB0aGUgZXh0ZW50IGZsYWcgZmllbGQuIEFTU0VSVCBvbiBkZWJ1ZwogICoga2VybmVscywgYXMgdGhpcyBjb25kaXRpb24gc2hvdWxkIG5vdCBvY2N1ci4KQEAgLTI2MDgsMyArNDgxLDQ1MSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworCitTVEFUSUMgc3RydWN0IHhmc19idHJlZV9jdXIgKgoreGZzX2JtYnRfZHVwX2N1cnNvcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyKQoreworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpuZXc7CisKKwluZXcgPSB4ZnNfYm1idF9pbml0X2N1cnNvcihjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmIuaXAsIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisKKwkvKgorCSAqIENvcHkgdGhlIGZpcnN0YmxvY2ssIGZsaXN0LCBhbmQgZmxhZ3MgdmFsdWVzLAorCSAqIHNpbmNlIGluaXQgY3Vyc29yIGRvZXNuJ3QgZ2V0IHRoZW0uCisJICovCisJbmV3LT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJbmV3LT5iY19wcml2YXRlLmIuZmxpc3QgPSBjdXItPmJjX3ByaXZhdGUuYi5mbGlzdDsKKwluZXctPmJjX3ByaXZhdGUuYi5mbGFncyA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzOworCisJcmV0dXJuIG5ldzsKK30KKworU1RBVElDIHZvaWQKK3hmc19ibWJ0X3VwZGF0ZV9jdXJzb3IoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKnNyYywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqZHN0KQoreworCUFTU0VSVCgoZHN0LT5iY19wcml2YXRlLmIuZmlyc3RibG9jayAhPSBOVUxMRlNCTE9DSykgfHwKKwkgICAgICAgKGRzdC0+YmNfcHJpdmF0ZS5iLmlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSk7CisJQVNTRVJUKGRzdC0+YmNfcHJpdmF0ZS5iLmZsaXN0ID09IHNyYy0+YmNfcHJpdmF0ZS5iLmZsaXN0KTsKKworCWRzdC0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCArPSBzcmMtPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7CisJZHN0LT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IHNyYy0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisKKwlzcmMtPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1idF9hbGxvY19ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnN0YXJ0LAorCXVuaW9uIHhmc19idHJlZV9wdHIJKm5ldywKKwlpbnQJCQlsZW5ndGgsCisJaW50CQkJKnN0YXQpCit7CisJeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkJLyogYmxvY2sgYWxsb2NhdGlvbiBhcmdzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLnRwID0gY3VyLT5iY190cDsKKwlhcmdzLm1wID0gY3VyLT5iY19tcDsKKwlhcmdzLmZzYm5vID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwlhcmdzLmZpcnN0YmxvY2sgPSBhcmdzLmZzYm5vOworCisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJYXJncy5mc2JubyA9IGJlNjRfdG9fY3B1KHN0YXJ0LT5sKTsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBzdWZmaWNpZW50IHJvb20gbGVmdCBpbiB0aGUgQUcgdG8KKwkJICogY29tcGxldGUgYSBmdWxsIHRyZWUgc3BsaXQgZm9yIGFuIGV4dGVudCBpbnNlcnQuICBJZgorCQkgKiB3ZSBhcmUgY29udmVydGluZyB0aGUgbWlkZGxlIHBhcnQgb2YgYW4gZXh0ZW50IHRoZW4KKwkJICogd2UgbWF5IG5lZWQgc3BhY2UgZm9yIHR3byB0cmVlIHNwbGl0cy4KKwkJICoKKwkJICogV2UgYXJlIHJlbHlpbmcgb24gdGhlIGNhbGxlciB0byBtYWtlIHRoZSBjb3JyZWN0IGJsb2NrCisJCSAqIHJlc2VydmF0aW9uIGZvciB0aGlzIG9wZXJhdGlvbiB0byBzdWNjZWVkLiAgSWYgdGhlCisJCSAqIHJlc2VydmF0aW9uIGFtb3VudCBpcyBpbnN1ZmZpY2llbnQgdGhlbiB3ZSBtYXkgZmFpbCBhCisJCSAqIGJsb2NrIGFsbG9jYXRpb24gaGVyZSBhbmQgY29ycnVwdCB0aGUgZmlsZXN5c3RlbS4KKwkJICovCisJCWFyZ3MubWlubGVmdCA9IHhmc190cmFuc19nZXRfYmxvY2tfcmVzKGFyZ3MudHApOworCX0gZWxzZSBpZiAoY3VyLT5iY19wcml2YXRlLmIuZmxpc3QtPnhiZl9sb3cpIHsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJfSBlbHNlIHsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwl9CisKKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKKwlhcmdzLndhc2RlbCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMOworCWlmICghYXJncy53YXNkZWwgJiYgeGZzX3RyYW5zX2dldF9ibG9ja19yZXMoYXJncy50cCkgPT0gMCkgeworCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOworCQlnb3RvIGVycm9yMDsKKwl9CisJZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKworCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLICYmIGFyZ3MubWlubGVmdCkgeworCQkvKgorCQkgKiBDb3VsZCBub3QgZmluZCBhbiBBRyB3aXRoIGVub3VnaCBmcmVlIHNwYWNlIHRvIHNhdGlzZnkKKwkJICogYSBmdWxsIGJ0cmVlIHNwbGl0LiAgVHJ5IGFnYWluIHdpdGhvdXQgbWlubGVmdCBhbmQgaWYKKwkJICogc3VjY2Vzc2Z1bCBhY3RpdmF0ZSB0aGUgbG93c3BhY2UgYWxnb3JpdGhtLgorCQkgKi8KKwkJYXJncy5mc2JubyA9IDA7CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfRklSU1RfQUc7CisJCWFyZ3MubWlubGVmdCA9IDA7CisJCWVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QtPnhiZl9sb3cgPSAxOworCX0KKwlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoYXJncy5sZW4gPT0gMSk7CisJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IGFyZ3MuZnNibm87CisJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkKys7CisJY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzKys7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwgWEZTX0lMT0dfQ09SRSk7CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhhcmdzLm1wLCBhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCVhGU19UUkFOU19EUV9CQ09VTlQsIDFMKTsKKworCW5ldy0+bCA9IGNwdV90b19iZTY0KGFyZ3MuZnNibm8pOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7CisKKyBlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1idF9mcmVlX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGN1ci0+YmNfbXA7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCA9IGN1ci0+YmNfdHA7CisJeGZzX2ZzYmxvY2tfdAkJZnNibm8gPSBYRlNfREFERFJfVE9fRlNCKG1wLCBYRlNfQlVGX0FERFIoYnApKTsKKworCXhmc19ibWFwX2FkZF9mcmVlKGZzYm5vLCAxLCBjdXItPmJjX3ByaXZhdGUuYi5mbGlzdCwgbXApOworCWlwLT5pX2QuZGlfbmJsb2Nrcy0tOworCisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIHRwLCBpcCwgWEZTX1RSQU5TX0RRX0JDT1VOVCwgLTFMKTsKKwl4ZnNfdHJhbnNfYmludmFsKHRwLCBicCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ibWJ0X2dldF9taW5yZWNzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwpCit7CisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJc3RydWN0IHhmc19pZm9yawkqaWZwOworCisJCWlmcCA9IFhGU19JRk9SS19QVFIoY3VyLT5iY19wcml2YXRlLmIuaXAsCisJCQkJICAgIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisKKwkJcmV0dXJuIHhmc19ibWJ0X21heHJlY3MoY3VyLT5iY19tcCwKKwkJCQkJaWZwLT5pZl9icm9vdF9ieXRlcywgbGV2ZWwgPT0gMCkgLyAyOworCX0KKworCXJldHVybiBjdXItPmJjX21wLT5tX2JtYXBfZG1ucltsZXZlbCAhPSAwXTsKK30KKworaW50Cit4ZnNfYm1idF9nZXRfbWF4cmVjcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsKQoreworCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcDsKKworCQlpZnAgPSBYRlNfSUZPUktfUFRSKGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJCSAgICBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCisJCXJldHVybiB4ZnNfYm1idF9tYXhyZWNzKGN1ci0+YmNfbXAsCisJCQkJCWlmcC0+aWZfYnJvb3RfYnl0ZXMsIGxldmVsID09IDApOworCX0KKworCXJldHVybiBjdXItPmJjX21wLT5tX2JtYXBfZG14cltsZXZlbCAhPSAwXTsKKworfQorCisvKgorICogR2V0IHRoZSBtYXhpbXVtIHJlY29yZHMgd2UgY291bGQgc3RvcmUgaW4gdGhlIG9uLWRpc2sgZm9ybWF0LgorICoKKyAqIEZvciBub24tcm9vdCBub2RlcyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8geGZzX2JtYnRfZ2V0X21heHJlY3MsIGJ1dAorICogZm9yIHRoZSByb290IG5vZGUgdGhpcyBjaGVja3MgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgZGlub2RlIGZvcmsKKyAqIHNvIHRoYXQgd2UgY2FuIHJlc2l6ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlciB0byBtYXRjaCBpdC4gIEFmdGVyIGEKKyAqIHJlc2l6ZSB0byB0aGUgbWF4aW11bSBzaXplIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSB2YWx1ZQorICogYXMgeGZzX2JtYnRfZ2V0X21heHJlY3MgZm9yIHRoZSByb290IG5vZGUsIHRvby4KKyAqLworU1RBVElDIGludAoreGZzX2JtYnRfZ2V0X2RtYXhyZWNzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwpCit7CisJaWYgKGxldmVsICE9IGN1ci0+YmNfbmxldmVscyAtIDEpCisJCXJldHVybiBjdXItPmJjX21wLT5tX2JtYXBfZG14cltsZXZlbCAhPSAwXTsKKwlyZXR1cm4geGZzX2JtZHJfbWF4cmVjcyhjdXItPmJjX21wLCBjdXItPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSwKKwkJCQlsZXZlbCA9PSAwKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19ibWJ0X2luaXRfa2V5X2Zyb21fcmVjKAorCXVuaW9uIHhmc19idHJlZV9rZXkJKmtleSwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWMpCit7CisJa2V5LT5ibWJ0LmJyX3N0YXJ0b2ZmID0KKwkJY3B1X3RvX2JlNjQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoJnJlYy0+Ym1idCkpOworfQorCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfaW5pdF9yZWNfZnJvbV9rZXkoCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYykKK3sKKwlBU1NFUlQoa2V5LT5ibWJ0LmJyX3N0YXJ0b2ZmICE9IDApOworCisJeGZzX2JtYnRfZGlza19zZXRfYWxsZigmcmVjLT5ibWJ0LCBiZTY0X3RvX2NwdShrZXktPmJtYnQuYnJfc3RhcnRvZmYpLAorCQkJICAgICAgIDAsIDAsIFhGU19FWFRfTk9STSk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYm1idF9pbml0X3JlY19mcm9tX2N1cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYykKK3sKKwl4ZnNfYm1idF9kaXNrX3NldF9hbGwoJnJlYy0+Ym1idCwgJmN1ci0+YmNfcmVjLmIpOworfQorCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfaW5pdF9wdHJfZnJvbV9jdXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIpCit7CisJcHRyLT5sID0gMDsKK30KKworU1RBVElDIF9faW50NjRfdAoreGZzX2JtYnRfa2V5X2RpZmYoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXkpCit7CisJcmV0dXJuIChfX2ludDY0X3QpYmU2NF90b19jcHUoa2V5LT5ibWJ0LmJyX3N0YXJ0b2ZmKSAtCisJCQkJICAgICAgY3VyLT5iY19yZWMuYi5icl9zdGFydG9mZjsKK30KKworI2lmZGVmIERFQlVHCitTVEFUSUMgaW50Cit4ZnNfYm1idF9rZXlzX2lub3JkZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMSwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMikKK3sKKwlyZXR1cm4gYmU2NF90b19jcHUoazEtPmJtYnQuYnJfc3RhcnRvZmYpIDwKKwkJYmU2NF90b19jcHUoazItPmJtYnQuYnJfc3RhcnRvZmYpOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1idF9yZWNzX2lub3JkZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyMSwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyMikKK3sKKwlyZXR1cm4geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoJnIxLT5ibWJ0KSArCisJCXhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQoJnIxLT5ibWJ0KSA8PQorCQl4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZigmcjItPmJtYnQpOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKK2t0cmFjZV90CSp4ZnNfYm1idF90cmFjZV9idWY7CisKK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9lbnRlcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCWNoYXIJCQkqcywKKwlpbnQJCQl0eXBlLAorCWludAkJCWxpbmUsCisJX19wc3Vuc2lnbmVkX3QJCWEwLAorCV9fcHN1bnNpZ25lZF90CQlhMSwKKwlfX3BzdW5zaWduZWRfdAkJYTIsCisJX19wc3Vuc2lnbmVkX3QJCWEzLAorCV9fcHN1bnNpZ25lZF90CQlhNCwKKwlfX3BzdW5zaWduZWRfdAkJYTUsCisJX19wc3Vuc2lnbmVkX3QJCWE2LAorCV9fcHN1bnNpZ25lZF90CQlhNywKKwlfX3BzdW5zaWduZWRfdAkJYTgsCisJX19wc3Vuc2lnbmVkX3QJCWE5LAorCV9fcHN1bnNpZ25lZF90CQlhMTApCit7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKKwlpbnQJCQl3aGljaGZvcmsgPSBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcms7CisKKwlrdHJhY2VfZW50ZXIoeGZzX2JtYnRfdHJhY2VfYnVmLAorCQkodm9pZCAqKSgoX19wc2ludF90KXR5cGUgfCAod2hpY2hmb3JrIDw8IDgpIHwgKGxpbmUgPDwgMTYpKSwKKwkJKHZvaWQgKilmdW5jLCAodm9pZCAqKXMsICh2b2lkICopaXAsICh2b2lkICopY3VyLAorCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAorCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAorCQkodm9pZCAqKWE4LCAodm9pZCAqKWE5LCAodm9pZCAqKWExMCk7CisJa3RyYWNlX2VudGVyKGlwLT5pX2J0cmFjZSwKKwkJKHZvaWQgKikoKF9fcHNpbnRfdCl0eXBlIHwgKHdoaWNoZm9yayA8PCA4KSB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopZnVuYywgKHZvaWQgKilzLCAodm9pZCAqKWlwLCAodm9pZCAqKWN1ciwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKilhOCwgKHZvaWQgKilhOSwgKHZvaWQgKilhMTApOworfQorCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfY3Vyc29yKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJX191aW50MzJfdAkJKnMwLAorCV9fdWludDY0X3QJCSpsMCwKKwlfX3VpbnQ2NF90CQkqbDEpCit7CisJc3RydWN0IHhmc19ibWJ0X3JlY19ob3N0IHI7CisKKwl4ZnNfYm1idF9zZXRfYWxsKCZyLCAmY3VyLT5iY19yZWMuYik7CisKKwkqczAgPSAoY3VyLT5iY19ubGV2ZWxzIDw8IDI0KSB8CisJICAgICAgKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzIDw8IDE2KSB8CisJICAgICAgIGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZDsKKwkqbDAgPSByLmwwOworCSpsMSA9IHIubDE7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9rZXkoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSkKK3sKKwkqbDAgPSBiZTY0X3RvX2NwdShrZXktPmJtYnQuYnJfc3RhcnRvZmYpOworCSpsMSA9IDA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9yZWNvcmQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWMsCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSwKKwlfX3VpbnQ2NF90CQkqbDIpCit7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJaXJlYzsKKworCXhmc19ibWJ0X2Rpc2tfZ2V0X2FsbCgmcmVjLT5ibWJ0LCAmaXJlYyk7CisJKmwwID0gaXJlYy5icl9zdGFydG9mZjsKKwkqbDEgPSBpcmVjLmJyX3N0YXJ0YmxvY2s7CisJKmwyID0gaXJlYy5icl9ibG9ja2NvdW50OworfQorI2VuZGlmIC8qIFhGU19CVFJFRV9UUkFDRSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19idHJlZV9vcHMgeGZzX2JtYnRfb3BzID0geworCS5yZWNfbGVuCQk9IHNpemVvZih4ZnNfYm1idF9yZWNfdCksCisJLmtleV9sZW4JCT0gc2l6ZW9mKHhmc19ibWJ0X2tleV90KSwKKworCS5kdXBfY3Vyc29yCQk9IHhmc19ibWJ0X2R1cF9jdXJzb3IsCisJLnVwZGF0ZV9jdXJzb3IJCT0geGZzX2JtYnRfdXBkYXRlX2N1cnNvciwKKwkuYWxsb2NfYmxvY2sJCT0geGZzX2JtYnRfYWxsb2NfYmxvY2ssCisJLmZyZWVfYmxvY2sJCT0geGZzX2JtYnRfZnJlZV9ibG9jaywKKwkuZ2V0X21heHJlY3MJCT0geGZzX2JtYnRfZ2V0X21heHJlY3MsCisJLmdldF9taW5yZWNzCQk9IHhmc19ibWJ0X2dldF9taW5yZWNzLAorCS5nZXRfZG1heHJlY3MJCT0geGZzX2JtYnRfZ2V0X2RtYXhyZWNzLAorCS5pbml0X2tleV9mcm9tX3JlYwk9IHhmc19ibWJ0X2luaXRfa2V5X2Zyb21fcmVjLAorCS5pbml0X3JlY19mcm9tX2tleQk9IHhmc19ibWJ0X2luaXRfcmVjX2Zyb21fa2V5LAorCS5pbml0X3JlY19mcm9tX2N1cgk9IHhmc19ibWJ0X2luaXRfcmVjX2Zyb21fY3VyLAorCS5pbml0X3B0cl9mcm9tX2N1cgk9IHhmc19ibWJ0X2luaXRfcHRyX2Zyb21fY3VyLAorCS5rZXlfZGlmZgkJPSB4ZnNfYm1idF9rZXlfZGlmZiwKKworI2lmZGVmIERFQlVHCisJLmtleXNfaW5vcmRlcgkJPSB4ZnNfYm1idF9rZXlzX2lub3JkZXIsCisJLnJlY3NfaW5vcmRlcgkJPSB4ZnNfYm1idF9yZWNzX2lub3JkZXIsCisjZW5kaWYKKworI2lmZGVmIFhGU19CVFJFRV9UUkFDRQorCS50cmFjZV9lbnRlcgkJPSB4ZnNfYm1idF90cmFjZV9lbnRlciwKKwkudHJhY2VfY3Vyc29yCQk9IHhmc19ibWJ0X3RyYWNlX2N1cnNvciwKKwkudHJhY2Vfa2V5CQk9IHhmc19ibWJ0X3RyYWNlX2tleSwKKwkudHJhY2VfcmVjb3JkCQk9IHhmc19ibWJ0X3RyYWNlX3JlY29yZCwKKyNlbmRpZgorfTsKKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJtYXAgYnRyZWUgY3Vyc29yLgorICovCitzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqCQkJCS8qIG5ldyBibWFwIGJ0cmVlIGN1cnNvciAqLworeGZzX2JtYnRfaW5pdF9jdXJzb3IoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5vZGUgb3duaW5nIHRoZSBidHJlZSAqLworCWludAkJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXI7CisKKwljdXIgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19idHJlZV9jdXJfem9uZSwgS01fU0xFRVApOworCisJY3VyLT5iY190cCA9IHRwOworCWN1ci0+YmNfbXAgPSBtcDsKKwljdXItPmJjX25sZXZlbHMgPSBiZTE2X3RvX2NwdShpZnAtPmlmX2Jyb290LT5iYl9sZXZlbCkgKyAxOworCWN1ci0+YmNfYnRudW0gPSBYRlNfQlROVU1fQk1BUDsKKwljdXItPmJjX2Jsb2NrbG9nID0gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisKKwljdXItPmJjX29wcyA9ICZ4ZnNfYm1idF9vcHM7CisJY3VyLT5iY19mbGFncyA9IFhGU19CVFJFRV9MT05HX1BUUlMgfCBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERTsKKworCWN1ci0+YmNfcHJpdmF0ZS5iLmZvcmtzaXplID0gWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yayk7CisJY3VyLT5iY19wcml2YXRlLmIuaXAgPSBpcDsKKwljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gTlVMTEZTQkxPQ0s7CisJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBOVUxMOworCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPSAwOworCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayA9IHdoaWNoZm9yazsKKworCXJldHVybiBjdXI7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gYSBibWFwIGJ0cmVlIGJsb2NrLgorICovCitpbnQKK3hmc19ibWJ0X21heHJlY3MoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJaW50CQkJYmxvY2tsZW4sCisJaW50CQkJbGVhZikKK3sKKwlibG9ja2xlbiAtPSBYRlNfQk1CVF9CTE9DS19MRU4obXApOworCisJaWYgKGxlYWYpCisJCXJldHVybiBibG9ja2xlbiAvIHNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJcmV0dXJuIGJsb2NrbGVuIC8gKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSBudW1iZXIgb2YgcmVjb3JkcyBpbiBhIGJtYXAgYnRyZWUgaW5vZGUgcm9vdC4KKyAqLworaW50Cit4ZnNfYm1kcl9tYXhyZWNzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCWludAkJCWJsb2NrbGVuLAorCWludAkJCWxlYWYpCit7CisJYmxvY2tsZW4gLT0gc2l6ZW9mKHhmc19ibWRyX2Jsb2NrX3QpOworCisJaWYgKGxlYWYpCisJCXJldHVybiBibG9ja2xlbiAvIHNpemVvZih4ZnNfYm1kcl9yZWNfdCk7CisJcmV0dXJuIGJsb2NrbGVuIC8gKHNpemVvZih4ZnNfYm1kcl9rZXlfdCkgKyBzaXplb2YoeGZzX2JtZHJfcHRyX3QpKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5oIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmgKaW5kZXggY2QwZDRiNC4uYTQ1NTVhYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmgKQEAgLTIxLDkgKzIxLDEwIEBACiAjZGVmaW5lIFhGU19CTUFQX01BR0lDCTB4NDI0ZDQxNTAJLyogJ0JNQVAnICovCiAKIHN0cnVjdCB4ZnNfYnRyZWVfY3VyOwotc3RydWN0IHhmc19idHJlZV9sYmxvY2s7CitzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrOwogc3RydWN0IHhmc19tb3VudDsKIHN0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX3RyYW5zOwogCiAvKgogICogQm1hcCByb290IGhlYWRlciwgb24tZGlzayBmb3JtIG9ubHkuCkBAIC0xNDUsNzEgKzE0Niw2MCBAQAogLyogYnRyZWUgcG9pbnRlciB0eXBlICovCiB0eXBlZGVmIF9fYmU2NCB4ZnNfYm1idF9wdHJfdCwgeGZzX2JtZHJfcHRyX3Q7CiAKLS8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfbGJsb2NrIHhmc19ibWJ0X2Jsb2NrX3Q7CisvKgorICogQnRyZWUgYmxvY2sgaGVhZGVyIHNpemUgZGVwZW5kcyBvbiBhIHN1cGVyYmxvY2sgZmxhZy4KKyAqCisgKiAobm90IHF1aXRlIHlldCwgYnV0IHNvb24pCisgKi8KKyNkZWZpbmUgWEZTX0JNQlRfQkxPQ0tfTEVOKG1wKQlYRlNfQlRSRUVfTEJMT0NLX0xFTgogCi0jZGVmaW5lIFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCkJKCh4ZnNfYm1idF9ibG9ja190ICopWEZTX0JVRl9QVFIoYnApKQorI2RlZmluZSBYRlNfQk1CVF9SRUNfQUREUihtcCwgYmxvY2ssIGluZGV4KSBcCisJKCh4ZnNfYm1idF9yZWNfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfQk1CVF9CTE9DS19MRU4obXApICsgXAorCQkgKChpbmRleCkgLSAxKSAqIHNpemVvZih4ZnNfYm1idF9yZWNfdCkpKQogCi0jZGVmaW5lIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKQkoKGN1ciktPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSkKLSNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpCVwKLQkoKGludClYRlNfSUZPUktfUFRSKChjdXIpLT5iY19wcml2YXRlLmIuaXAsIFwKLQkJICAgIChjdXIpLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKS0+aWZfYnJvb3RfYnl0ZXMpCisjZGVmaW5lIFhGU19CTUJUX0tFWV9BRERSKG1wLCBibG9jaywgaW5kZXgpIFwKKwkoKHhmc19ibWJ0X2tleV90ICopIFwKKwkJKChjaGFyICopKGJsb2NrKSArIFwKKwkJIFhGU19CTUJUX0JMT0NLX0xFTihtcCkgKyBcCisJCSAoKGluZGV4KSAtIDEpICogc2l6ZW9mKHhmc19ibWJ0X2tleV90KSkpCiAKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2LGN1cikgXAotCSgoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAotCQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1ciksIFwKLQkJCXhmc19ibWRyLCAobGV2KSA9PSAwKSA6IFwKLQkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RteHJbKGxldikgIT0gMF0pKSkKLSNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2LGN1cikgXAotCSgoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAotCQkJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpLFwKLQkJCQl4ZnNfYm1idCwgKGxldikgPT0gMCkgOiBcCi0JCQkoKGN1ciktPmJjX21wLT5tX2JtYXBfZG14clsobGV2KSAhPSAwXSkpKQorI2RlZmluZSBYRlNfQk1CVF9QVFJfQUREUihtcCwgYmxvY2ssIGluZGV4LCBtYXhyZWNzKSBcCisJKCh4ZnNfYm1idF9wdHJfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfQk1CVF9CTE9DS19MRU4obXApICsgXAorCQkgKG1heHJlY3MpICogc2l6ZW9mKHhmc19ibWJ0X2tleV90KSArIFwKKwkJICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkKIAotI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsY3VyKSBcCi0JKCgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCi0JCQlYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1ciksXAotCQkJCXhmc19ibWRyLCAobGV2KSA9PSAwKSA6IFwKLQkJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkpCi0jZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldixjdXIpIFwKLQkoKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKLQkJCVhGU19CVFJFRV9CTE9DS19NSU5SRUNTKFhGU19CTUFQX1JCTE9DS19JU0laRShsZXYsY3VyKSxcCi0JCQkJeGZzX2JtYnQsIChsZXYpID09IDApIDogXAotCQkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RtbnJbKGxldikgIT0gMF0pKSkKKyNkZWZpbmUgWEZTX0JNRFJfUkVDX0FERFIoYmxvY2ssIGluZGV4KSBcCisJKCh4ZnNfYm1kcl9yZWNfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBzaXplb2Yoc3RydWN0IHhmc19ibWRyX2Jsb2NrKSArIFwKKwkgICAgICAgICAoKGluZGV4KSAtIDEpICogc2l6ZW9mKHhmc19ibWRyX3JlY190KSkpCiAKLSNkZWZpbmUgWEZTX0JNQVBfUkVDX0RBRERSKGJiLGksY3VyKQkoWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LCBiYiwgaSkpCisjZGVmaW5lIFhGU19CTURSX0tFWV9BRERSKGJsb2NrLCBpbmRleCkgXAorCSgoeGZzX2JtZHJfa2V5X3QgKikgXAorCQkoKGNoYXIgKikoYmxvY2spICsgXAorCQkgc2l6ZW9mKHN0cnVjdCB4ZnNfYm1kcl9ibG9jaykgKyBcCisJCSAoKGluZGV4KSAtIDEpICogc2l6ZW9mKHhmc19ibWRyX2tleV90KSkpCiAKLSNkZWZpbmUgWEZTX0JNQVBfUkVDX0lBRERSKGJiLGksY3VyKQkoWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LCBiYiwgaSkpCi0KLSNkZWZpbmUgWEZTX0JNQVBfS0VZX0RBRERSKGJiLGksY3VyKQlcCi0JKFhGU19CVFJFRV9LRVlfQUREUih4ZnNfYm1idCwgYmIsIGkpKQotCi0jZGVmaW5lIFhGU19CTUFQX0tFWV9JQUREUihiYixpLGN1cikJXAotCShYRlNfQlRSRUVfS0VZX0FERFIoeGZzX2JtYnQsIGJiLCBpKSkKLQotI2RlZmluZSBYRlNfQk1BUF9QVFJfREFERFIoYmIsaSxjdXIpCVwKLQkoWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MoCVwKLQkJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1cikpKQotI2RlZmluZSBYRlNfQk1BUF9QVFJfSUFERFIoYmIsaSxjdXIpCVwKLQkoWEZTX0JUUkVFX1BUUl9BRERSKHhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoCVwKLQkJCQliZTE2X3RvX2NwdSgoYmIpLT5iYl9sZXZlbCksIGN1cikpKQorI2RlZmluZSBYRlNfQk1EUl9QVFJfQUREUihibG9jaywgaW5kZXgsIG1heHJlY3MpIFwKKwkoKHhmc19ibWRyX3B0cl90ICopIFwKKwkJKChjaGFyICopKGJsb2NrKSArIFwKKwkJIHNpemVvZihzdHJ1Y3QgeGZzX2JtZHJfYmxvY2spICsgXAorCQkgKG1heHJlY3MpICogc2l6ZW9mKHhmc19ibWRyX2tleV90KSArIFwKKwkJICgoaW5kZXgpIC0gMSkgKiBzaXplb2YoeGZzX2JtZHJfcHRyX3QpKSkKIAogLyoKICAqIFRoZXNlIGFyZSB0byBiZSB1c2VkIHdoZW4gd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgYW5kCiAgKiB3ZSBkb24ndCBoYXZlIGEgY3Vyc29yLgogICovCi0jZGVmaW5lIFhGU19CTUFQX0JST09UX1JFQ19BRERSKGJiLGksc3opIFwKLQkoWEZTX0JUUkVFX1JFQ19BRERSKHhmc19ibWJ0LGJiLGkpKQotI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihiYixpLHN6KSBcCi0JKFhGU19CVFJFRV9LRVlfQUREUih4ZnNfYm1idCxiYixpKSkKLSNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmIsaSxzeikgXAotCShYRlNfQlRSRUVfUFRSX0FERFIoeGZzX2JtYnQsYmIsaSxYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKHN6KSkpCi0KLSNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYikJYmUxNl90b19jcHUoKGJiKS0+YmJfbnVtcmVjcykKLSNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc3oseGZzX2JtYnQsMCkKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGJiLCBpLCBzeikgXAorCVhGU19CTUJUX1BUUl9BRERSKG1wLCBiYiwgaSwgeGZzX2JtYnRfbWF4cmVjcyhtcCwgc3osIDApKQogCiAjZGVmaW5lIFhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMobnJlY3MpIFwKLQkoaW50KShzaXplb2YoeGZzX2JtYnRfYmxvY2tfdCkgKyBcCisJKGludCkoWEZTX0JUUkVFX0xCTE9DS19MRU4gKyBcCiAJICAgICAgICgobnJlY3MpICogKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkpCiAKICNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfU1BBQ0UoYmIpIFwKQEAgLTIyMyw0MiArMjEzLDEyIEBACiAgKi8KICNkZWZpbmUgWEZTX0JNX01BWExFVkVMUyhtcCx3KQkJKChtcCktPm1fYm1fbWF4bGV2ZWxzWyh3KV0pCiAKLSNkZWZpbmUgWEZTX0JNQVBfU0FOSVRZX0NIRUNLKG1wLGJiLGxldmVsKSBcCi0JKGJlMzJfdG9fY3B1KChiYiktPmJiX21hZ2ljKSA9PSBYRlNfQk1BUF9NQUdJQyAmJiBcCi0JIGJlMTZfdG9fY3B1KChiYiktPmJiX2xldmVsKSA9PSBsZXZlbCAmJiBcCi0JIGJlMTZfdG9fY3B1KChiYiktPmJiX251bXJlY3MpID4gMCAmJiBcCi0JIGJlMTZfdG9fY3B1KChiYiktPmJiX251bXJlY3MpIDw9IChtcCktPm1fYm1hcF9kbXhyWyhsZXZlbCkgIT0gMF0pCi0KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2lmIGRlZmluZWQoWEZTX0JNQlRfVFJBQ0UpCi0vKgotICogVHJhY2UgYnVmZmVyIGVudHJ5IHR5cGVzLgotICovCi0jZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdCSQkxCi0jZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdCSUkJMgotI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHRkZGSSAzCi0jZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdJCTQKLSNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0lGSwk1Ci0jZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdJRlIJNgotI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHSUsJNwotI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQ1VSCTgKLQotI2RlZmluZSBYRlNfQk1CVF9UUkFDRV9TSVpFCTQwOTYJLyogc2l6ZSBvZiBnbG9iYWwgdHJhY2UgYnVmZmVyICovCi0jZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9TSVpFCTMyCS8qIHNpemUgb2YgcGVyLWlub2RlIHRyYWNlIGJ1ZmZlciAqLwotZXh0ZXJuIGt0cmFjZV90CSp4ZnNfYm1idF90cmFjZV9idWY7Ci0jZW5kaWYKLQogLyoKICAqIFByb3RvdHlwZXMgZm9yIHhmc19ibWFwLmMgdG8gY2FsbC4KICAqLwotZXh0ZXJuIHZvaWQgeGZzX2JtZHJfdG9fYm1idCh4ZnNfYm1kcl9ibG9ja190ICosIGludCwgeGZzX2JtYnRfYmxvY2tfdCAqLCBpbnQpOwotZXh0ZXJuIGludCB4ZnNfYm1idF9kZWNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQgKik7Ci1leHRlcm4gaW50IHhmc19ibWJ0X2RlbGV0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7CitleHRlcm4gdm9pZCB4ZnNfYm1kcl90b19ibWJ0KHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2JtZHJfYmxvY2tfdCAqLCBpbnQsCisJCQlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICosIGludCk7CiBleHRlcm4gdm9pZCB4ZnNfYm1idF9nZXRfYWxsKHhmc19ibWJ0X3JlY19ob3N0X3QgKnIsIHhmc19ibWJ0X2lyZWNfdCAqcyk7Ci1leHRlcm4geGZzX2JtYnRfYmxvY2tfdCAqeGZzX2JtYnRfZ2V0X2Jsb2NrKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsCi0JCQkJCQlpbnQsIHN0cnVjdCB4ZnNfYnVmICoqYnBwKTsKIGV4dGVybiB4ZnNfZmlsYmxrc190IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KHhmc19ibWJ0X3JlY19ob3N0X3QgKnIpOwogZXh0ZXJuIHhmc19mc2Jsb2NrX3QgeGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soeGZzX2JtYnRfcmVjX2hvc3RfdCAqcik7CiBleHRlcm4geGZzX2ZpbGVvZmZfdCB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoeGZzX2JtYnRfcmVjX2hvc3RfdCAqcik7CkBAIC0yNjgsMjIgKzIyOCw2IEBACiBleHRlcm4geGZzX2ZpbGJsa3NfdCB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHhmc19ibWJ0X3JlY190ICpyKTsKIGV4dGVybiB4ZnNfZmlsZW9mZl90IHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHhmc19ibWJ0X3JlY190ICpyKTsKIAotZXh0ZXJuIGludCB4ZnNfYm1idF9pbmNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQgKik7Ci1leHRlcm4gaW50IHhmc19ibWJ0X2luc2VydChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZCB4ZnNfYm1idF9sb2dfYmxvY2soc3RydWN0IHhmc19idHJlZV9jdXIgKiwgc3RydWN0IHhmc19idWYgKiwgaW50KTsKLWV4dGVybiB2b2lkIHhmc19ibWJ0X2xvZ19yZWNzKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIHN0cnVjdCB4ZnNfYnVmICosIGludCwKLQkJCQlpbnQpOwotZXh0ZXJuIGludCB4ZnNfYm1idF9sb29rdXBfZXEoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgeGZzX2ZpbGVvZmZfdCwKLQkJCQl4ZnNfZnNibG9ja190LCB4ZnNfZmlsYmxrc190LCBpbnQgKik7Ci1leHRlcm4gaW50IHhmc19ibWJ0X2xvb2t1cF9nZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCB4ZnNfZmlsZW9mZl90LAotCQkJCXhmc19mc2Jsb2NrX3QsIHhmc19maWxibGtzX3QsIGludCAqKTsKLQotLyoKLSAqIEdpdmUgdGhlIGJtYXAgYnRyZWUgYSBuZXcgcm9vdCBibG9jay4gIENvcHkgdGhlIG9sZCBicm9vdCBjb250ZW50cwotICogZG93biBpbnRvIGEgcmVhbCBibG9jayBhbmQgbWFrZSB0aGUgYnJvb3QgcG9pbnQgdG8gaXQuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2JtYnRfbmV3cm9vdChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgKmxmbGFncywgaW50ICpzdGF0KTsKLQogZXh0ZXJuIHZvaWQgeGZzX2JtYnRfc2V0X2FsbCh4ZnNfYm1idF9yZWNfaG9zdF90ICpyLCB4ZnNfYm1idF9pcmVjX3QgKnMpOwogZXh0ZXJuIHZvaWQgeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2JtYnRfcmVjX2hvc3RfdCAqciwgeGZzX2ZpbGVvZmZfdCBvLAogCQkJeGZzX2ZzYmxvY2tfdCBiLCB4ZnNfZmlsYmxrc190IGMsIHhmc19leG50c3RfdCB2KTsKQEAgLTI5NiwxMCArMjQwLDE1IEBACiBleHRlcm4gdm9pZCB4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHhmc19ibWJ0X3JlY190ICpyLCB4ZnNfZmlsZW9mZl90IG8sCiAJCQl4ZnNfZnNibG9ja190IGIsIHhmc19maWxibGtzX3QgYywgeGZzX2V4bnRzdF90IHYpOwogCi1leHRlcm4gdm9pZCB4ZnNfYm1idF90b19ibWRyKHhmc19ibWJ0X2Jsb2NrX3QgKiwgaW50LCB4ZnNfYm1kcl9ibG9ja190ICosIGludCk7Ci1leHRlcm4gaW50IHhmc19ibWJ0X3VwZGF0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCB4ZnNfZmlsZW9mZl90LAotCQkJCXhmc19mc2Jsb2NrX3QsIHhmc19maWxibGtzX3QsIHhmc19leG50c3RfdCk7CitleHRlcm4gdm9pZCB4ZnNfYm1idF90b19ibWRyKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc19idHJlZV9ibG9jayAqLCBpbnQsCisJCQl4ZnNfYm1kcl9ibG9ja190ICosIGludCk7CiAKLSNlbmRpZgkvKiBfX0tFUk5FTF9fICovCitleHRlcm4gaW50IHhmc19ibWJ0X2dldF9tYXhyZWNzKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIGludCBsZXZlbCk7CitleHRlcm4gaW50IHhmc19ibWRyX21heHJlY3Moc3RydWN0IHhmc19tb3VudCAqLCBpbnQgYmxvY2tsZW4sIGludCBsZWFmKTsKK2V4dGVybiBpbnQgeGZzX2JtYnRfbWF4cmVjcyhzdHJ1Y3QgeGZzX21vdW50ICosIGludCBibG9ja2xlbiwgaW50IGxlYWYpOworCitleHRlcm4gc3RydWN0IHhmc19idHJlZV9jdXIgKnhmc19ibWJ0X2luaXRfY3Vyc29yKHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX2lub2RlICosIGludCk7CisKIAogI2VuZGlmCS8qIF9fWEZTX0JNQVBfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmMgYi9mcy94ZnMveGZzX2J0cmVlLmMKaW5kZXggY2M1OTNhOC4uN2VkNTkyNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwpAQCAtMzQsNyArMzQsOSBAQAogI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCiAjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgogI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlX3RyYWNlLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCkBAIC01MCwxMzUgKzUyLDMzIEBACiAJWEZTX0FCVEJfTUFHSUMsIFhGU19BQlRDX01BR0lDLCBYRlNfQk1BUF9NQUdJQywgWEZTX0lCVF9NQUdJQwogfTsKIAotLyoKLSAqIENoZWNraW5nIHJvdXRpbmU6IHJldHVybiBtYXhyZWNzIGZvciB0aGUgYmxvY2suCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogbnVtYmVyIG9mIHJlY29yZHMgZml0dGluZyBpbiBibG9jayAqLwoteGZzX2J0cmVlX21heHJlY3MoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2spCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLwotewotCXN3aXRjaCAoY3VyLT5iY19idG51bSkgewotCWNhc2UgWEZTX0JUTlVNX0JOTzoKLQljYXNlIFhGU19CVE5VTV9DTlQ6Ci0JCXJldHVybiAoaW50KVhGU19BTExPQ19CTE9DS19NQVhSRUNTKAotCQkJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9oLmJiX2xldmVsKSwgY3VyKTsKLQljYXNlIFhGU19CVE5VTV9CTUFQOgotCQlyZXR1cm4gKGludClYRlNfQk1BUF9CTE9DS19JTUFYUkVDUygKLQkJCQliZTE2X3RvX2NwdShibG9jay0+YmJfaC5iYl9sZXZlbCksIGN1cik7Ci0JY2FzZSBYRlNfQlROVU1fSU5POgotCQlyZXR1cm4gKGludClYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUygKLQkJCQliZTE2X3RvX2NwdShibG9jay0+YmJfaC5iYl9sZXZlbCksIGN1cik7Ci0JZGVmYXVsdDoKLQkJQVNTRVJUKDApOwotCQlyZXR1cm4gMDsKLQl9Ci19CiAKLS8qCi0gKiBFeHRlcm5hbCByb3V0aW5lcy4KLSAqLwotCi0jaWZkZWYgREVCVUcKLS8qCi0gKiBEZWJ1ZyByb3V0aW5lOiBjaGVjayB0aGF0IGJsb2NrIGhlYWRlciBpcyBvay4KLSAqLwotdm9pZAoteGZzX2J0cmVlX2NoZWNrX2Jsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrLAkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgb2YgdGhlIGJ0cmVlIGJsb2NrICovCi0JeGZzX2J1Zl90CQkqYnApCS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrLCBpZiBhbnkgKi8KLXsKLQlpZiAoWEZTX0JUUkVFX0xPTkdfUFRSUyhjdXItPmJjX2J0bnVtKSkKLQkJeGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsICh4ZnNfYnRyZWVfbGJsb2NrX3QgKilibG9jaywgbGV2ZWwsCi0JCQlicCk7Ci0JZWxzZQotCQl4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgKHhmc19idHJlZV9zYmxvY2tfdCAqKWJsb2NrLCBsZXZlbCwKLQkJCWJwKTsKLX0KLQotLyoKLSAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQga2V5cyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyLgotICovCi12b2lkCi14ZnNfYnRyZWVfY2hlY2tfa2V5KAotCXhmc19idG51bV90CWJ0bnVtLAkJLyogYnRyZWUgaWRlbnRpZmllciAqLwotCXZvaWQJCSphazEsCQkvKiBwb2ludGVyIHRvIGxlZnQgKGxvd2VyKSBrZXkgKi8KLQl2b2lkCQkqYWsyKQkJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSBrZXkgKi8KLXsKLQlzd2l0Y2ggKGJ0bnVtKSB7Ci0JY2FzZSBYRlNfQlROVU1fQk5POiB7Ci0JCXhmc19hbGxvY19rZXlfdAkqazE7Ci0JCXhmc19hbGxvY19rZXlfdAkqazI7Ci0KLQkJazEgPSBhazE7Ci0JCWsyID0gYWsyOwotCQlBU1NFUlQoYmUzMl90b19jcHUoazEtPmFyX3N0YXJ0YmxvY2spIDwgYmUzMl90b19jcHUoazItPmFyX3N0YXJ0YmxvY2spKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQljYXNlIFhGU19CVE5VTV9DTlQ6IHsKLQkJeGZzX2FsbG9jX2tleV90CSprMTsKLQkJeGZzX2FsbG9jX2tleV90CSprMjsKLQotCQlrMSA9IGFrMTsKLQkJazIgPSBhazI7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShrMS0+YXJfYmxvY2tjb3VudCkgPCBiZTMyX3RvX2NwdShrMi0+YXJfYmxvY2tjb3VudCkgfHwKLQkJICAgICAgIChrMS0+YXJfYmxvY2tjb3VudCA9PSBrMi0+YXJfYmxvY2tjb3VudCAmJgotCQkJYmUzMl90b19jcHUoazEtPmFyX3N0YXJ0YmxvY2spIDwgYmUzMl90b19jcHUoazItPmFyX3N0YXJ0YmxvY2spKSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JY2FzZSBYRlNfQlROVU1fQk1BUDogewotCQl4ZnNfYm1idF9rZXlfdAkqazE7Ci0JCXhmc19ibWJ0X2tleV90CSprMjsKLQotCQlrMSA9IGFrMTsKLQkJazIgPSBhazI7Ci0JCUFTU0VSVChiZTY0X3RvX2NwdShrMS0+YnJfc3RhcnRvZmYpIDwgYmU2NF90b19jcHUoazItPmJyX3N0YXJ0b2ZmKSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JY2FzZSBYRlNfQlROVU1fSU5POiB7Ci0JCXhmc19pbm9idF9rZXlfdAkqazE7Ci0JCXhmc19pbm9idF9rZXlfdAkqazI7Ci0KLQkJazEgPSBhazE7Ci0JCWsyID0gYWsyOwotCQlBU1NFUlQoYmUzMl90b19jcHUoazEtPmlyX3N0YXJ0aW5vKSA8IGJlMzJfdG9fY3B1KGsyLT5pcl9zdGFydGlubykpOwotCQlicmVhazsKLQkgICAgfQotCWRlZmF1bHQ6Ci0JCUFTU0VSVCgwKTsKLQl9Ci19Ci0jZW5kaWYJLyogREVCVUcgKi8KLQotLyoKLSAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgbG9uZyBmb3JtIGJsb2NrIGhlYWRlciBpcyBvay4KLSAqLwotLyogQVJHU1VTRUQgKi8KLWludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCiB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J0cmVlX2xibG9ja190CSpibG9jaywJLyogYnRyZWUgbG9uZyBmb3JtIGJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywJLyogYnRyZWUgbG9uZyBmb3JtIGJsb2NrIHBvaW50ZXIgKi8KIAlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgb2YgdGhlIGJ0cmVlIGJsb2NrICovCi0JeGZzX2J1Zl90CQkqYnApCS8qIGJ1ZmZlciBmb3IgYmxvY2ssIGlmIGFueSAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApCS8qIGJ1ZmZlciBmb3IgYmxvY2ssIGlmIGFueSAqLwogewogCWludAkJCWxibG9ja19vazsgLyogYmxvY2sgcGFzc2VzIGNoZWNrcyAqLwotCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc19tb3VudAkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCiAKIAltcCA9IGN1ci0+YmNfbXA7CiAJbGJsb2NrX29rID0KIAkJYmUzMl90b19jcHUoYmxvY2stPmJiX21hZ2ljKSA9PSB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dICYmCiAJCWJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCkgPT0gbGV2ZWwgJiYKIAkJYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIDw9Ci0JCQl4ZnNfYnRyZWVfbWF4cmVjcyhjdXIsICh4ZnNfYnRyZWVfYmxvY2tfdCAqKWJsb2NrKSAmJgotCQlibG9jay0+YmJfbGVmdHNpYiAmJgotCQkoYmU2NF90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpID09IE5VTExERlNCTk8gfHwKLQkJIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBiZTY0X3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikpKSAmJgotCQlibG9jay0+YmJfcmlnaHRzaWIgJiYKLQkJKGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTyB8fAotCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsIGJlNjRfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikpKTsKLQlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWxibG9ja19vaywgbXAsIFhGU19FUlJUQUdfQlRSRUVfQ0hFQ0tfTEJMT0NLLAorCQkJY3VyLT5iY19vcHMtPmdldF9tYXhyZWNzKGN1ciwgbGV2ZWwpICYmCisJCWJsb2NrLT5iYl91LmwuYmJfbGVmdHNpYiAmJgorCQkoYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liKSA9PSBOVUxMREZTQk5PIHx8CisJCSBYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwKKwkJIAliZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIpKSkgJiYKKwkJYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYiAmJgorCQkoYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYikgPT0gTlVMTERGU0JOTyB8fAorCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsCisJCSAJYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYikpKTsKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWxibG9ja19vaywgbXAsCisJCQlYRlNfRVJSVEFHX0JUUkVFX0NIRUNLX0xCTE9DSywKIAkJCVhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfTEJMT0NLKSkpIHsKIAkJaWYgKGJwKQogCQkJeGZzX2J1ZnRyYWNlKCJMQlRSRUUgRVJST1IiLCBicCk7CkBAIC0xODksOTggKzg5LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChsb25nKSBwb2ludGVyIGlzIG9rLgotICovCi1pbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KLXhmc19idHJlZV9jaGVja19scHRyKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2Rmc2Jub190CXB0ciwJCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLwotCWludAkJbGV2ZWwpCQkvKiBidHJlZSBibG9jayBsZXZlbCAqLwotewotCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCi0KLQltcCA9IGN1ci0+YmNfbXA7Ci0JWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKLQkJbGV2ZWwgPiAwICYmCi0JCXB0ciAhPSBOVUxMREZTQk5PICYmCi0JCVhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBwdHIpKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIERFQlVHCi0vKgotICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCByZWNvcmRzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCi0gKi8KLXZvaWQKLXhmc19idHJlZV9jaGVja19yZWMoCi0JeGZzX2J0bnVtX3QJYnRudW0sCQkvKiBidHJlZSBpZGVudGlmaWVyICovCi0Jdm9pZAkJKmFyMSwJCS8qIHBvaW50ZXIgdG8gbGVmdCAobG93ZXIpIHJlY29yZCAqLwotCXZvaWQJCSphcjIpCQkvKiBwb2ludGVyIHRvIHJpZ2h0IChoaWdoZXIpIHJlY29yZCAqLwotewotCXN3aXRjaCAoYnRudW0pIHsKLQljYXNlIFhGU19CVE5VTV9CTk86IHsKLQkJeGZzX2FsbG9jX3JlY190CSpyMTsKLQkJeGZzX2FsbG9jX3JlY190CSpyMjsKLQotCQlyMSA9IGFyMTsKLQkJcjIgPSBhcjI7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShyMS0+YXJfc3RhcnRibG9jaykgKwotCQkgICAgICAgYmUzMl90b19jcHUocjEtPmFyX2Jsb2NrY291bnQpIDw9Ci0JCSAgICAgICBiZTMyX3RvX2NwdShyMi0+YXJfc3RhcnRibG9jaykpOwotCQlicmVhazsKLQkgICAgfQotCWNhc2UgWEZTX0JUTlVNX0NOVDogewotCQl4ZnNfYWxsb2NfcmVjX3QJKnIxOwotCQl4ZnNfYWxsb2NfcmVjX3QJKnIyOwotCi0JCXIxID0gYXIxOwotCQlyMiA9IGFyMjsKLQkJQVNTRVJUKGJlMzJfdG9fY3B1KHIxLT5hcl9ibG9ja2NvdW50KSA8IGJlMzJfdG9fY3B1KHIyLT5hcl9ibG9ja2NvdW50KSB8fAotCQkgICAgICAgKHIxLT5hcl9ibG9ja2NvdW50ID09IHIyLT5hcl9ibG9ja2NvdW50ICYmCi0JCQliZTMyX3RvX2NwdShyMS0+YXJfc3RhcnRibG9jaykgPCBiZTMyX3RvX2NwdShyMi0+YXJfc3RhcnRibG9jaykpKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQljYXNlIFhGU19CVE5VTV9CTUFQOiB7Ci0JCXhmc19ibWJ0X3JlY190CSpyMTsKLQkJeGZzX2JtYnRfcmVjX3QJKnIyOwotCi0JCXIxID0gYXIxOwotCQlyMiA9IGFyMjsKLQkJQVNTRVJUKHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHIxKSArCi0JCSAgICAgICB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHIxKSA8PQotCQkgICAgICAgeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocjIpKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQljYXNlIFhGU19CVE5VTV9JTk86IHsKLQkJeGZzX2lub2J0X3JlY190CSpyMTsKLQkJeGZzX2lub2J0X3JlY190CSpyMjsKLQotCQlyMSA9IGFyMTsKLQkJcjIgPSBhcjI7Ci0JCUFTU0VSVChiZTMyX3RvX2NwdShyMS0+aXJfc3RhcnRpbm8pICsgWEZTX0lOT0RFU19QRVJfQ0hVTksgPD0KLQkJICAgICAgIGJlMzJfdG9fY3B1KHIyLT5pcl9zdGFydGlubykpOwotCQlicmVhazsKLQkgICAgfQotCWRlZmF1bHQ6Ci0JCUFTU0VSVCgwKTsKLQl9Ci19Ci0jZW5kaWYJLyogREVCVUcgKi8KLQotLyoKLSAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgYmxvY2sgaGVhZGVyIGlzIG9rLgotICovCi0vKiBBUkdTVVNFRCAqLwotaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KIHhmc19idHJlZV9jaGVja19zYmxvY2soCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYnRyZWVfc2Jsb2NrX3QJKmJsb2NrLAkvKiBidHJlZSBzaG9ydCBmb3JtIGJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywJLyogYnRyZWUgc2hvcnQgZm9ybSBibG9jayBwb2ludGVyICovCiAJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLwotCXhmc19idWZfdAkJKmJwKQkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApCS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCiB7Ci0JeGZzX2J1Zl90CQkqYWdicDsJLyogYnVmZmVyIGZvciBhZy4gZnJlZXNwYWNlIHN0cnVjdCAqLwotCXhmc19hZ2ZfdAkJKmFnZjsJLyogYWcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnA7CS8qIGJ1ZmZlciBmb3IgYWcuIGZyZWVzcGFjZSBzdHJ1Y3QgKi8KKwlzdHJ1Y3QgeGZzX2FnZgkJKmFnZjsJLyogYWcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KIAl4ZnNfYWdibG9ja190CQlhZ2ZsZW47CS8qIG5hdGl2ZSBhZy4gZnJlZXNwYWNlIGxlbmd0aCAqLwogCWludAkJCXNibG9ja19vazsgLyogYmxvY2sgcGFzc2VzIGNoZWNrcyAqLwogCkBAIC0yOTEsMTMgKzEwOCwxMyBAQAogCQliZTMyX3RvX2NwdShibG9jay0+YmJfbWFnaWMpID09IHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0gJiYKIAkJYmUxNl90b19jcHUoYmxvY2stPmJiX2xldmVsKSA9PSBsZXZlbCAmJgogCQliZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPD0KLQkJCXhmc19idHJlZV9tYXhyZWNzKGN1ciwgKHhmc19idHJlZV9ibG9ja190ICopYmxvY2spICYmCi0JCShiZTMyX3RvX2NwdShibG9jay0+YmJfbGVmdHNpYikgPT0gTlVMTEFHQkxPQ0sgfHwKLQkJIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKSA8IGFnZmxlbikgJiYKLQkJYmxvY2stPmJiX2xlZnRzaWIgJiYKLQkJKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPT0gTlVMTEFHQkxPQ0sgfHwKLQkJIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9yaWdodHNpYikgPCBhZ2ZsZW4pICYmCi0JCWJsb2NrLT5iYl9yaWdodHNpYjsKKwkJCWN1ci0+YmNfb3BzLT5nZXRfbWF4cmVjcyhjdXIsIGxldmVsKSAmJgorCQkoYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkgYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liKSA8IGFnZmxlbikgJiYKKwkJYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liICYmCisJCShiZTMyX3RvX2NwdShibG9jay0+YmJfdS5zLmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkgYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYikgPCBhZ2ZsZW4pICYmCisJCWJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWI7CiAJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFzYmxvY2tfb2ssIGN1ci0+YmNfbXAsCiAJCQlYRlNfRVJSVEFHX0JUUkVFX0NIRUNLX1NCTE9DSywKIAkJCVhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfU0JMT0NLKSkpIHsKQEAgLTMxMSwyNiArMTI4LDc3IEBACiB9CiAKIC8qCi0gKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChzaG9ydCkgcG9pbnRlciBpcyBvay4KKyAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQgYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCitpbnQKK3hmc19idHJlZV9jaGVja19ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApCS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrLCBpZiBhbnkgKi8KK3sKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpCisJCXJldHVybiB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CisJZWxzZQorCQlyZXR1cm4geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOworfQorCisvKgorICogQ2hlY2sgdGhhdCAobG9uZykgcG9pbnRlciBpcyBvay4KICAqLwogaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCi14ZnNfYnRyZWVfY2hlY2tfc3B0cigKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2Jsb2NrX3QJcHRyLAkJLyogYnRyZWUgYmxvY2sgZGlzayBhZGRyZXNzICovCi0JaW50CQlsZXZlbCkJCS8qIGJ0cmVlIGJsb2NrIGxldmVsICovCit4ZnNfYnRyZWVfY2hlY2tfbHB0cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfZGZzYm5vX3QJCWJubywJLyogYnRyZWUgYmxvY2sgZGlzayBhZGRyZXNzICovCisJaW50CQkJbGV2ZWwpCS8qIGJ0cmVlIGJsb2NrIGxldmVsICovCiB7Ci0JeGZzX2J1Zl90CSphZ2JwOwkJLyogYnVmZmVyIGZvciBhZy4gZnJlZXNwYWNlIHN0cnVjdCAqLwotCXhmc19hZ2ZfdAkqYWdmOwkJLyogYWcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KLQotCWFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOwotCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOwogCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oCiAJCWxldmVsID4gMCAmJgotCQlwdHIgIT0gTlVMTEFHQkxPQ0sgJiYgcHRyICE9IDAgJiYKLQkJcHRyIDwgYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSk7CisJCWJubyAhPSBOVUxMREZTQk5PICYmCisJCVhGU19GU0JfU0FOSVRZX0NIRUNLKGN1ci0+YmNfbXAsIGJubykpOwogCXJldHVybiAwOwogfQogCisjaWZkZWYgREVCVUcKKy8qCisgKiBDaGVjayB0aGF0IChzaG9ydCkgcG9pbnRlciBpcyBvay4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfc3B0cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCWludAkJCWxldmVsKQkvKiBidHJlZSBibG9jayBsZXZlbCAqLworeworCXhmc19hZ2Jsb2NrX3QJCWFnYmxvY2tzID0gY3VyLT5iY19tcC0+bV9zYi5zYl9hZ2Jsb2NrczsKKworCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oCisJCWxldmVsID4gMCAmJgorCQlibm8gIT0gTlVMTEFHQkxPQ0sgJiYKKwkJYm5vICE9IDAgJiYKKwkJYm5vIDwgYWdibG9ja3MpOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdGhhdCBibG9jayBwdHIgaXMgb2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX3B0cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIsCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCWludAkJCWluZGV4LAkvKiBvZmZzZXQgZnJvbSBwdHIgdG8gY2hlY2sgKi8KKwlpbnQJCQlsZXZlbCkJLyogYnRyZWUgYmxvY2sgbGV2ZWwgKi8KK3sKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpIHsKKwkJcmV0dXJuIHhmc19idHJlZV9jaGVja19scHRyKGN1ciwKKwkJCQliZTY0X3RvX2NwdSgoJnB0ci0+bClbaW5kZXhdKSwgbGV2ZWwpOworCX0gZWxzZSB7CisJCXJldHVybiB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsCisJCQkJYmUzMl90b19jcHUoKCZwdHItPnMpW2luZGV4XSksIGxldmVsKTsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqIERlbGV0ZSB0aGUgYnRyZWUgY3Vyc29yLgogICovCkBAIC0zODcsMTYgKzI1NSwxNyBAQAogCiAJdHAgPSBjdXItPmJjX3RwOwogCW1wID0gY3VyLT5iY19tcDsKKwogCS8qCiAJICogQWxsb2NhdGUgYSBuZXcgY3Vyc29yIGxpa2UgdGhlIG9sZCBvbmUuCiAJICovCi0JbmV3ID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKLQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgY3VyLT5iY19idG51bSwgY3VyLT5iY19wcml2YXRlLmIuaXAsCi0JCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJbmV3ID0gY3VyLT5iY19vcHMtPmR1cF9jdXJzb3IoY3VyKTsKKwogCS8qCiAJICogQ29weSB0aGUgcmVjb3JkIGN1cnJlbnRseSBpbiB0aGUgY3Vyc29yLgogCSAqLwogCW5ldy0+YmNfcmVjID0gY3VyLT5iY19yZWM7CisKIAkvKgogCSAqIEZvciBlYWNoIGxldmVsIGN1cnJlbnQsIHJlLWdldCB0aGUgYnVmZmVyIGFuZCBjb3B5IHRoZSBwdHIgdmFsdWUuCiAJICovCkBAIC00MTYsNDYgKzI4NSwxNzQgQEAKIAkJfSBlbHNlCiAJCQluZXctPmJjX2J1ZnNbaV0gPSBOVUxMOwogCX0KLQkvKgotCSAqIEZvciBibWFwIGJ0cmVlcywgY29weSB0aGUgZmlyc3RibG9jaywgZmxpc3QsIGFuZCBmbGFncyB2YWx1ZXMsCi0JICogc2luY2UgaW5pdCBjdXJzb3IgZG9lc24ndCBnZXQgdGhlbS4KLQkgKi8KLQlpZiAobmV3LT5iY19idG51bSA9PSBYRlNfQlROVU1fQk1BUCkgewotCQluZXctPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKLQkJbmV3LT5iY19wcml2YXRlLmIuZmxpc3QgPSBjdXItPmJjX3ByaXZhdGUuYi5mbGlzdDsKLQkJbmV3LT5iY19wcml2YXRlLmIuZmxhZ3MgPSBjdXItPmJjX3ByaXZhdGUuYi5mbGFnczsKLQl9CiAJKm5jdXIgPSBuZXc7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBSZXRyaWV2ZSB0aGUgYmxvY2sgcG9pbnRlciBmcm9tIHRoZSBjdXJzb3IgYXQgdGhlIGdpdmVuIGxldmVsLgotICogVGhpcyBtYXkgYmUgYSBibWFwIGJ0cmVlIHJvb3Qgb3IgZnJvbSBhIGJ1ZmZlci4KKyAqIFhGUyBidHJlZSBibG9jayBsYXlvdXQgYW5kIGFkZHJlc3Npbmc6CisgKgorICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBibG9ja3MgaW4gdGhlIGJ0cmVlOiBsZWFmIGFuZCBub24tbGVhZiBibG9ja3MuCisgKgorICogVGhlIGxlYWYgcmVjb3JkIHN0YXJ0IHdpdGggYSBoZWFkZXIgdGhlbiBmb2xsb3dlZCBieSByZWNvcmRzIGNvbnRhaW5pbmcKKyAqIHRoZSB2YWx1ZXMuICBBIG5vbi1sZWFmIGJsb2NrIGFsc28gc3RhcnRzIHdpdGggdGhlIHNhbWUgaGVhZGVyLCBhbmQKKyAqIHRoZW4gZmlyc3QgY29udGFpbnMgbG9va3VwIGtleXMgZm9sbG93ZWQgYnkgYW4gZXF1YWwgbnVtYmVyIG9mIHBvaW50ZXJzCisgKiB0byB0aGUgYnRyZWUgYmxvY2tzIGF0IHRoZSBwcmV2aW91cyBsZXZlbC4KKyAqCisgKgkJKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICogTGVhZjoJfCBoZWFkZXIgfCByZWMgMSB8IHJlYyAyIHwgcmVjIDMgfCByZWMgNCB8IHJlYyA1IHwgcmVjIE4gfAorICoJCSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAqCisgKgkJKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICogTm9uLUxlYWY6CXwgaGVhZGVyIHwga2V5IDEgfCBrZXkgMiB8IGtleSBOIHwgcHRyIDEgfCBwdHIgMiB8IHB0ciBOIHwKKyAqCQkrLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgKgorICogVGhlIGhlYWRlciBpcyBjYWxsZWQgc3RydWN0IHhmc19idHJlZV9ibG9jayBmb3IgcmVhc29ucyBiZXR0ZXIgbGVmdCB1bmtub3duCisgKiBhbmQgY29tZXMgaW4gZGlmZmVyZW50IHZlcnNpb25zIGZvciBzaG9ydCAoMzJiaXQpIGFuZCBsb25nICg2NGJpdCkgYmxvY2sKKyAqIHBvaW50ZXJzLiAgVGhlIHJlY29yZCBhbmQga2V5IHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgYnkgdGhlIGJ0cmVlIGluc3RhbmNlcworICogYW5kIG9wYXF1ZSB0byB0aGUgYnRyZWUgY29yZS4gIFRoZSBibG9jayBwb2ludGVycyBhcmUgc2ltcGxlIGRpc2sgZW5kaWFuCisgKiBpbnRlZ2VycywgYXZhaWxhYmxlIGluIGEgc2hvcnQgKDMyYml0KSBhbmQgbG9uZyAoNjRiaXQpIHZhcmlhbnQuCisgKgorICogVGhlIGhlbHBlcnMgYmVsb3cgY2FsY3VsYXRlIHRoZSBvZmZzZXQgb2YgYSBnaXZlbiByZWNvcmQsIGtleSBvciBwb2ludGVyCisgKiBpbnRvIGEgYnRyZWUgYmxvY2sgKHhmc19idHJlZV8qX29mZnNldCkgb3IgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4KKyAqIHJlY29yZCwga2V5IG9yIHBvaW50ZXIgKHhmc19idHJlZV8qX2FkZHIpLiAgTm90ZSB0aGF0IGFsbCBhZGRyZXNzaW5nCisgKiBpbnNpZGUgdGhlIGJ0cmVlIGJsb2NrIGlzIGRvbmUgdXNpbmcgaW5kaWNlcyBzdGFydGluZyBhdCBvbmUsIG5vdCB6ZXJvIQogICovCi1TVEFUSUMgeGZzX2J0cmVlX2Jsb2NrX3QgKgkJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCi14ZnNfYnRyZWVfZ2V0X2Jsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlICovCi0JeGZzX2J1Zl90CQkqKmJwcCkJLyogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJsb2NrICovCi17Ci0JeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiByZXR1cm4gdmFsdWUgKi8KLQl4ZnNfYnVmX3QJCSpicDsJLyogcmV0dXJuIGJ1ZmZlciAqLwotCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KLQlpbnQJCQl3aGljaGZvcms7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCiAKLQlpZiAoY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQk1BUCAmJiBsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCXdoaWNoZm9yayA9IGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yazsKLQkJaWZwID0gWEZTX0lGT1JLX1BUUihjdXItPmJjX3ByaXZhdGUuYi5pcCwgd2hpY2hmb3JrKTsKLQkJYmxvY2sgPSAoeGZzX2J0cmVlX2Jsb2NrX3QgKilpZnAtPmlmX2Jyb290OwotCQlicCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOworLyoKKyAqIFJldHVybiBzaXplIG9mIHRoZSBidHJlZSBibG9jayBoZWFkZXIgZm9yIHRoaXMgYnRyZWUgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHhmc19idHJlZV9ibG9ja19sZW4oc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cikKK3sKKwlyZXR1cm4gKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSA/CisJCVhGU19CVFJFRV9MQkxPQ0tfTEVOIDoKKwkJWEZTX0JUUkVFX1NCTE9DS19MRU47Cit9CisKKy8qCisgKiBSZXR1cm4gc2l6ZSBvZiBidHJlZSBibG9jayBwb2ludGVycyBmb3IgdGhpcyBidHJlZSBpbnN0YW5jZS4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgeGZzX2J0cmVlX3B0cl9sZW4oc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cikKK3sKKwlyZXR1cm4gKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSA/CisJCXNpemVvZihfX2JlNjQpIDogc2l6ZW9mKF9fYmUzMik7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIHRoZSBuLXRoIHJlY29yZCBpbiBhIGJ0cmVlIGJsb2NrLgorICovCitTVEFUSUMgc2l6ZV90Cit4ZnNfYnRyZWVfcmVjX29mZnNldCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCW4pCit7CisJcmV0dXJuIHhmc19idHJlZV9ibG9ja19sZW4oY3VyKSArCisJCShuIC0gMSkgKiBjdXItPmJjX29wcy0+cmVjX2xlbjsKK30KKworLyoKKyAqIENhbGN1bGF0ZSBvZmZzZXQgb2YgdGhlIG4tdGgga2V5IGluIGEgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyBzaXplX3QKK3hmc19idHJlZV9rZXlfb2Zmc2V0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbikKK3sKKwlyZXR1cm4geGZzX2J0cmVlX2Jsb2NrX2xlbihjdXIpICsKKwkJKG4gLSAxKSAqIGN1ci0+YmNfb3BzLT5rZXlfbGVuOworfQorCisvKgorICogQ2FsY3VsYXRlIG9mZnNldCBvZiB0aGUgbi10aCBibG9jayBwb2ludGVyIGluIGEgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyBzaXplX3QKK3hmc19idHJlZV9wdHJfb2Zmc2V0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbiwKKwlpbnQJCQlsZXZlbCkKK3sKKwlyZXR1cm4geGZzX2J0cmVlX2Jsb2NrX2xlbihjdXIpICsKKwkJY3VyLT5iY19vcHMtPmdldF9tYXhyZWNzKGN1ciwgbGV2ZWwpICogY3VyLT5iY19vcHMtPmtleV9sZW4gKworCQkobiAtIDEpICogeGZzX2J0cmVlX3B0cl9sZW4oY3VyKTsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG4tdGggcmVjb3JkIGluIHRoZSBidHJlZSBibG9jay4KKyAqLworU1RBVElDIHVuaW9uIHhmc19idHJlZV9yZWMgKgoreGZzX2J0cmVlX3JlY19hZGRyKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbiwKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaykKK3sKKwlyZXR1cm4gKHVuaW9uIHhmc19idHJlZV9yZWMgKikKKwkJKChjaGFyICopYmxvY2sgKyB4ZnNfYnRyZWVfcmVjX29mZnNldChjdXIsIG4pKTsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG4tdGgga2V5IGluIHRoZSBidHJlZSBibG9jay4KKyAqLworU1RBVElDIHVuaW9uIHhmc19idHJlZV9rZXkgKgoreGZzX2J0cmVlX2tleV9hZGRyKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbiwKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaykKK3sKKwlyZXR1cm4gKHVuaW9uIHhmc19idHJlZV9rZXkgKikKKwkJKChjaGFyICopYmxvY2sgKyB4ZnNfYnRyZWVfa2V5X29mZnNldChjdXIsIG4pKTsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG4tdGggYmxvY2sgcG9pbnRlciBpbiB0aGUgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB1bmlvbiB4ZnNfYnRyZWVfcHRyICoKK3hmc19idHJlZV9wdHJfYWRkcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCW4sCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2spCit7CisJaW50CQkJbGV2ZWwgPSB4ZnNfYnRyZWVfZ2V0X2xldmVsKGJsb2NrKTsKKworCUFTU0VSVChibG9jay0+YmJfbGV2ZWwgIT0gMCk7CisKKwlyZXR1cm4gKHVuaW9uIHhmc19idHJlZV9wdHIgKikKKwkJKChjaGFyICopYmxvY2sgKyB4ZnNfYnRyZWVfcHRyX29mZnNldChjdXIsIG4sIGxldmVsKSk7Cit9CisKKy8qCisgKiBHZXQgYSB0aGUgcm9vdCBibG9jayB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIGlub2RlLgorICoKKyAqIEZvciBub3cgdGhpcyBidHJlZSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoZSBidHJlZSByb290IGlzIGFsd2F5cworICogc3RvcmVkIGluIHRoZSBpZl9icm9vdCBmaWVsZCBvZiBhbiBpbm9kZSBmb3JrLgorICovCitTVEFUSUMgc3RydWN0IHhmc19idHJlZV9ibG9jayAqCit4ZnNfYnRyZWVfZ2V0X2lyb290KAorICAgICAgIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICAgICpjdXIpCit7CisgICAgICAgc3RydWN0IHhmc19pZm9yayAgICAgICAgKmlmcDsKKworICAgICAgIGlmcCA9IFhGU19JRk9SS19QVFIoY3VyLT5iY19wcml2YXRlLmIuaXAsIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisgICAgICAgcmV0dXJuIChzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICopaWZwLT5pZl9icm9vdDsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBibG9jayBwb2ludGVyIGZyb20gdGhlIGN1cnNvciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKiBUaGlzIG1heSBiZSBhbiBpbm9kZSBidHJlZSByb290IG9yIGZyb20gYSBidWZmZXIuCisgKi8KK1NUQVRJQyBzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICoJCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworeGZzX2J0cmVlX2dldF9ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKipicHApCS8qIGJ1ZmZlciBjb250YWluaW5nIHRoZSBibG9jayAqLworeworCWlmICgoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9ST09UX0lOX0lOT0RFKSAmJgorCSAgICAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkpIHsKKwkJKmJwcCA9IE5VTEw7CisJCXJldHVybiB4ZnNfYnRyZWVfZ2V0X2lyb290KGN1cik7CiAJfQotCUFTU0VSVChibG9jayAhPSBOVUxMKTsKLQkqYnBwID0gYnA7Ci0JcmV0dXJuIGJsb2NrOworCisJKmJwcCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJcmV0dXJuIFhGU19CVUZfVE9fQkxPQ0soKmJwcCk7CiB9CiAKIC8qCkBAIC01MDUsOTcgKzUwMiw2IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBidHJlZSBjdXJzb3IuCi0gKiBUaGUgY3Vyc29yIGlzIGVpdGhlciBmb3IgYWxsb2NhdGlvbiAoQSkgb3IgYm1hcCAoQikgb3IgaW5vZGVzIChJKS4KLSAqLwoteGZzX2J0cmVlX2N1cl90ICoJCQkvKiBuZXcgYnRyZWUgY3Vyc29yICovCi14ZnNfYnRyZWVfaW5pdF9jdXJzb3IoCi0JeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2J1Zl90CSphZ2JwLAkJLyogKEEgb25seSkgYnVmZmVyIGZvciBhZ2Ygc3RydWN0dXJlICovCi0JCQkJCS8qIChJIG9ubHkpIGJ1ZmZlciBmb3IgYWdpIHN0cnVjdHVyZSAqLwotCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiAoQUkgb25seSkgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KLQl4ZnNfYnRudW1fdAlidG51bSwJCS8qIGJ0cmVlIGlkZW50aWZpZXIgKi8KLQl4ZnNfaW5vZGVfdAkqaXAsCQkvKiAoQiBvbmx5KSBpbm9kZSBvd25pbmcgdGhlIGJ0cmVlICovCi0JaW50CQl3aGljaGZvcmspCS8qIChCIG9ubHkpIGRhdGEgb3IgYXR0ciBmb3JrICovCi17Ci0JeGZzX2FnZl90CSphZ2Y7CQkvKiAoQSkgYWxsb2NhdGlvbiBncm91cCBmcmVlc3BhY2UgKi8KLQl4ZnNfYWdpX3QJKmFnaTsJCS8qIChJKSBhbGxvY2F0aW9uIGdyb3VwIGlub2Rlc3BhY2UgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJCS8qIHJldHVybiB2YWx1ZSAqLwotCXhmc19pZm9ya190CSppZnA7CQkvKiAoSSkgaW5vZGUgZm9yayBwb2ludGVyICovCi0JaW50CQlubGV2ZWxzPTA7CS8qIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIGJ0cmVlICovCi0KLQlBU1NFUlQoeGZzX2J0cmVlX2N1cl96b25lICE9IE5VTEwpOwotCS8qCi0JICogQWxsb2NhdGUgYSBuZXcgY3Vyc29yLgotCSAqLwotCWN1ciA9IGttZW1fem9uZV96YWxsb2MoeGZzX2J0cmVlX2N1cl96b25lLCBLTV9TTEVFUCk7Ci0JLyoKLQkgKiBEZWR1Y2UgdGhlIG51bWJlciBvZiBidHJlZSBsZXZlbHMgZnJvbSB0aGUgYXJndW1lbnRzLgotCSAqLwotCXN3aXRjaCAoYnRudW0pIHsKLQljYXNlIFhGU19CVE5VTV9CTk86Ci0JY2FzZSBYRlNfQlROVU1fQ05UOgotCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKLQkJbmxldmVscyA9IGJlMzJfdG9fY3B1KGFnZi0+YWdmX2xldmVsc1tidG51bV0pOwotCQlicmVhazsKLQljYXNlIFhGU19CVE5VTV9CTUFQOgotCQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCQlubGV2ZWxzID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKLQkJYnJlYWs7Ci0JY2FzZSBYRlNfQlROVU1fSU5POgotCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKLQkJbmxldmVscyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2xldmVsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQVNTRVJUKDApOwotCX0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIGNvbW1vbiBmaWVsZHMuCi0JICovCi0JY3VyLT5iY190cCA9IHRwOwotCWN1ci0+YmNfbXAgPSBtcDsKLQljdXItPmJjX25sZXZlbHMgPSBubGV2ZWxzOwotCWN1ci0+YmNfYnRudW0gPSBidG51bTsKLQljdXItPmJjX2Jsb2NrbG9nID0gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7Ci0JLyoKLQkgKiBGaWxsIGluIHByaXZhdGUgZmllbGRzLgotCSAqLwotCXN3aXRjaCAoYnRudW0pIHsKLQljYXNlIFhGU19CVE5VTV9CTk86Ci0JY2FzZSBYRlNfQlROVU1fQ05UOgotCQkvKgotCQkgKiBBbGxvY2F0aW9uIGJ0cmVlIGZpZWxkcy4KLQkJICovCi0JCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAgPSBhZ2JwOwotCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vID0gYWdubzsKLQkJYnJlYWs7Ci0JY2FzZSBYRlNfQlROVU1fSU5POgotCQkvKgotCQkgKiBJbm9kZSBhbGxvY2F0aW9uIGJ0cmVlIGZpZWxkcy4KLQkJICovCi0JCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAgPSBhZ2JwOwotCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vID0gYWdubzsKLQkJYnJlYWs7Ci0JY2FzZSBYRlNfQlROVU1fQk1BUDoKLQkJLyoKLQkJICogQm1hcCBidHJlZSBmaWVsZHMuCi0JCSAqLwotCQljdXItPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSA9IFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspOwotCQljdXItPmJjX3ByaXZhdGUuYi5pcCA9IGlwOwotCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gTlVMTEZTQkxPQ0s7Ci0JCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gTlVMTDsKLQkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKLQkJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPSAwOwotCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmsgPSB3aGljaGZvcms7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUFTU0VSVCgwKTsKLQl9Ci0JcmV0dXJuIGN1cjsKLX0KLQotLyoKICAqIENoZWNrIGZvciB0aGUgY3Vyc29yIHJlZmVycmluZyB0byB0aGUgbGFzdCBibG9jayBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCiAgKi8KIGludAkJCQkJLyogMT1pcyBsYXN0IGJsb2NrLCAwPW5vdCBsYXN0IGJsb2NrICovCkBAIC02MDMsMTIgKzUwOSwxMiBAQAogCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCiAJaW50CQkJbGV2ZWwpCS8qIGxldmVsIHRvIGNoZWNrICovCiB7Ci0JeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCiAJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCiAKIAlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKIAl4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKLQlpZiAoWEZTX0JUUkVFX0xPTkdfUFRSUyhjdXItPmJjX2J0bnVtKSkKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpCiAJCXJldHVybiBiZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5POwogCWVsc2UKIAkJcmV0dXJuIGJlMzJfdG9fY3B1KGJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIpID09IE5VTExBR0JMT0NLOwpAQCAtNjE4LDEyICs1MjQsMTIgQEAKICAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBmaXJzdCByZWNvcmQgYXQgdGhlIGdpdmVuIGxldmVsLgogICogT3RoZXIgbGV2ZWxzIGFyZSB1bmFmZmVjdGVkLgogICovCi1pbnQJCQkJCS8qIHN1Y2Nlc3M9MSwgZmFpbHVyZT0wICovCitTVEFUSUMgaW50CQkJCS8qIHN1Y2Nlc3M9MSwgZmFpbHVyZT0wICovCiB4ZnNfYnRyZWVfZmlyc3RyZWMoCiAJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KIAlpbnQJCQlsZXZlbCkJLyogbGV2ZWwgdG8gY2hhbmdlICovCiB7Ci0JeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCiAJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCiAKIAkvKgpAQCAtNjM0LDcgKzU0MCw3IEBACiAJLyoKIAkgKiBJdCdzIGVtcHR5LCB0aGVyZSBpcyBubyBzdWNoIHJlY29yZC4KIAkgKi8KLQlpZiAoIWJsb2NrLT5iYl9oLmJiX251bXJlY3MpCisJaWYgKCFibG9jay0+YmJfbnVtcmVjcykKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBTZXQgdGhlIHB0ciB2YWx1ZSB0byAxLCB0aGF0J3MgdGhlIGZpcnN0IHJlY29yZC9rZXkuCkBAIC02NDcsMTIgKzU1MywxMiBAQAogICogQ2hhbmdlIHRoZSBjdXJzb3IgdG8gcG9pbnQgdG8gdGhlIGxhc3QgcmVjb3JkIGluIHRoZSBjdXJyZW50IGJsb2NrCiAgKiBhdCB0aGUgZ2l2ZW4gbGV2ZWwuICBPdGhlciBsZXZlbHMgYXJlIHVuYWZmZWN0ZWQuCiAgKi8KLWludAkJCQkJLyogc3VjY2Vzcz0xLCBmYWlsdXJlPTAgKi8KK1NUQVRJQyBpbnQJCQkJLyogc3VjY2Vzcz0xLCBmYWlsdXJlPTAgKi8KIHhmc19idHJlZV9sYXN0cmVjKAogCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCiAJaW50CQkJbGV2ZWwpCS8qIGxldmVsIHRvIGNoYW5nZSAqLwogewotCXhmc19idHJlZV9ibG9ja190CSpibG9jazsJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLwogCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLwogCiAJLyoKQEAgLTY2MywxMiArNTY5LDEyIEBACiAJLyoKIAkgKiBJdCdzIGVtcHR5LCB0aGVyZSBpcyBubyBzdWNoIHJlY29yZC4KIAkgKi8KLQlpZiAoIWJsb2NrLT5iYl9oLmJiX251bXJlY3MpCisJaWYgKCFibG9jay0+YmJfbnVtcmVjcykKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBTZXQgdGhlIHB0ciB2YWx1ZSB0byBudW1yZWNzLCB0aGF0J3MgdGhlIGxhc3QgcmVjb3JkL2tleS4KIAkgKi8KLQljdXItPmJjX3B0cnNbbGV2ZWxdID0gYmUxNl90b19jcHUoYmxvY2stPmJiX2guYmJfbnVtcmVjcyk7CisJY3VyLT5iY19wdHJzW2xldmVsXSA9IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtODE3LDY2ICs3MjMsODQgQEAKIAl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGQsIG1wLT5tX2JzaXplICogY291bnQpOwogfQogCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfcmVhZGFoZWFkX2xibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxyLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrKQoreworCWludAkJCXJ2YWwgPSAwOworCXhmc19mc2Jsb2NrX3QJCWxlZnQgPSBiZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIpOworCXhmc19mc2Jsb2NrX3QJCXJpZ2h0ID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYik7CisKKwlpZiAoKGxyICYgWEZTX0JUQ1VSX0xFRlRSQSkgJiYgbGVmdCAhPSBOVUxMREZTQk5PKSB7CisJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIGxlZnQsIDEpOworCQlydmFsKys7CisJfQorCisJaWYgKChsciAmIFhGU19CVENVUl9SSUdIVFJBKSAmJiByaWdodCAhPSBOVUxMREZTQk5PKSB7CisJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIHJpZ2h0LCAxKTsKKwkJcnZhbCsrOworCX0KKworCXJldHVybiBydmFsOworfQorCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfcmVhZGFoZWFkX3NibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxyLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgKmJsb2NrKQoreworCWludAkJCXJ2YWwgPSAwOworCXhmc19hZ2Jsb2NrX3QJCWxlZnQgPSBiZTMyX3RvX2NwdShibG9jay0+YmJfdS5zLmJiX2xlZnRzaWIpOworCXhmc19hZ2Jsb2NrX3QJCXJpZ2h0ID0gYmUzMl90b19jcHUoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYik7CisKKworCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBsZWZ0ICE9IE5VTExBR0JMT0NLKSB7CisJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCisJCQkJICAgICBsZWZ0LCAxKTsKKwkJcnZhbCsrOworCX0KKworCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgcmlnaHQgIT0gTlVMTEFHQkxPQ0spIHsKKwkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJCQkgICAgIHJpZ2h0LCAxKTsKKwkJcnZhbCsrOworCX0KKworCXJldHVybiBydmFsOworfQorCiAvKgogICogUmVhZC1haGVhZCBidHJlZSBibG9ja3MsIGF0IHRoZSBnaXZlbiBsZXZlbC4KICAqIEJpdHMgaW4gbHIgYXJlIHNldCBmcm9tIFhGU19CVENVUl97TEVGVCxSSUdIVH1SQS4KICAqLwotaW50Ci14ZnNfYnRyZWVfcmVhZGFoZWFkX2NvcmUoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfcmVhZGFoZWFkKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KIAlpbnQJCQlsZXYsCQkvKiBsZXZlbCBpbiBidHJlZSAqLwogCWludAkJCWxyKQkJLyogbGVmdC9yaWdodCBiaXRzICovCiB7Ci0JeGZzX2FsbG9jX2Jsb2NrX3QJKmE7Ci0JeGZzX2JtYnRfYmxvY2tfdAkqYjsKLQl4ZnNfaW5vYnRfYmxvY2tfdAkqaTsKLQlpbnQJCQlydmFsID0gMDsKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsKIAotCUFTU0VSVChjdXItPmJjX2J1ZnNbbGV2XSAhPSBOVUxMKTsKKwkvKgorCSAqIE5vIHJlYWRhaGVhZCBuZWVkZWQgaWYgd2UgYXJlIGF0IHRoZSByb290IGxldmVsIGFuZCB0aGUKKwkgKiBidHJlZSByb290IGlzIHN0b3JlZCBpbiB0aGUgaW5vZGUuCisJICovCisJaWYgKChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpICYmCisJICAgIChsZXYgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkpCisJCXJldHVybiAwOworCisJaWYgKChjdXItPmJjX3JhW2xldl0gfCBscikgPT0gY3VyLT5iY19yYVtsZXZdKQorCQlyZXR1cm4gMDsKKwogCWN1ci0+YmNfcmFbbGV2XSB8PSBscjsKLQlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKLQljYXNlIFhGU19CVE5VTV9CTk86Ci0JY2FzZSBYRlNfQlROVU1fQ05UOgotCQlhID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7Ci0JCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBiZTMyX3RvX2NwdShhLT5iYl9sZWZ0c2liKSAhPSBOVUxMQUdCTE9DSykgewotCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKLQkJCQliZTMyX3RvX2NwdShhLT5iYl9sZWZ0c2liKSwgMSk7Ci0JCQlydmFsKys7Ci0JCX0KLQkJaWYgKChsciAmIFhGU19CVENVUl9SSUdIVFJBKSAmJiBiZTMyX3RvX2NwdShhLT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCi0JCQkJYmUzMl90b19jcHUoYS0+YmJfcmlnaHRzaWIpLCAxKTsKLQkJCXJ2YWwrKzsKLQkJfQotCQlicmVhazsKLQljYXNlIFhGU19CVE5VTV9CTUFQOgotCQliID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZdKTsKLQkJaWYgKChsciAmIFhGU19CVENVUl9MRUZUUkEpICYmIGJlNjRfdG9fY3B1KGItPmJiX2xlZnRzaWIpICE9IE5VTExERlNCTk8pIHsKLQkJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIGJlNjRfdG9fY3B1KGItPmJiX2xlZnRzaWIpLCAxKTsKLQkJCXJ2YWwrKzsKLQkJfQotCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIGJlNjRfdG9fY3B1KGItPmJiX3JpZ2h0c2liKSAhPSBOVUxMREZTQk5PKSB7Ci0JCQl4ZnNfYnRyZWVfcmVhZGFfYnVmbChjdXItPmJjX21wLCBiZTY0X3RvX2NwdShiLT5iYl9yaWdodHNpYiksIDEpOwotCQkJcnZhbCsrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgWEZTX0JUTlVNX0lOTzoKLQkJaSA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soY3VyLT5iY19idWZzW2xldl0pOwotCQlpZiAoKGxyICYgWEZTX0JUQ1VSX0xFRlRSQSkgJiYgYmUzMl90b19jcHUoaS0+YmJfbGVmdHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCi0JCQkJYmUzMl90b19jcHUoaS0+YmJfbGVmdHNpYiksIDEpOwotCQkJcnZhbCsrOwotCQl9Ci0JCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgYmUzMl90b19jcHUoaS0+YmJfcmlnaHRzaWIpICE9IE5VTExBR0JMT0NLKSB7Ci0JCQl4ZnNfYnRyZWVfcmVhZGFfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3ByaXZhdGUuYS5hZ25vLAotCQkJCWJlMzJfdG9fY3B1KGktPmJiX3JpZ2h0c2liKSwgMSk7Ci0JCQlydmFsKys7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQVNTRVJUKDApOwotCX0KLQlyZXR1cm4gcnZhbDsKKwlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soY3VyLT5iY19idWZzW2xldl0pOworCisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKQorCQlyZXR1cm4geGZzX2J0cmVlX3JlYWRhaGVhZF9sYmxvY2soY3VyLCBsciwgYmxvY2spOworCXJldHVybiB4ZnNfYnRyZWVfcmVhZGFoZWFkX3NibG9jayhjdXIsIGxyLCBibG9jayk7CiB9CiAKIC8qCkBAIC04ODksNyArODEzLDcgQEAKIAlpbnQJCQlsZXYsCS8qIGxldmVsIGluIGJ0cmVlICovCiAJeGZzX2J1Zl90CQkqYnApCS8qIG5ldyBidWZmZXIgdG8gc2V0ICovCiB7Ci0JeGZzX2J0cmVlX2Jsb2NrX3QJKmI7CS8qIGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYjsJLyogYnRyZWUgYmxvY2sgKi8KIAl4ZnNfYnVmX3QJCSpvYnA7CS8qIG9sZCBidWZmZXIgcG9pbnRlciAqLwogCiAJb2JwID0gY3VyLT5iY19idWZzW2xldl07CkBAIC05MDAsNyArODI0LDcgQEAKIAlpZiAoIWJwKQogCQlyZXR1cm47CiAJYiA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwotCWlmIChYRlNfQlRSRUVfTE9OR19QVFJTKGN1ci0+YmNfYnRudW0pKSB7CisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSB7CiAJCWlmIChiZTY0X3RvX2NwdShiLT5iYl91LmwuYmJfbGVmdHNpYikgPT0gTlVMTERGU0JOTykKIAkJCWN1ci0+YmNfcmFbbGV2XSB8PSBYRlNfQlRDVVJfTEVGVFJBOwogCQlpZiAoYmU2NF90b19jcHUoYi0+YmJfdS5sLmJiX3JpZ2h0c2liKSA9PSBOVUxMREZTQk5PKQpAQCAtOTEyLDMgKzgzNiwyODU1IEBACiAJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX1JJR0hUUkE7CiAJfQogfQorCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfcHRyX2lzX251bGwoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIpCit7CisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKQorCQlyZXR1cm4gYmU2NF90b19jcHUocHRyLT5sKSA9PSBOVUxMRlNCTE9DSzsKKwllbHNlCisJCXJldHVybiBiZTMyX3RvX2NwdShwdHItPnMpID09IE5VTExBR0JMT0NLOworfQorCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX3NldF9wdHJfbnVsbCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0cikKK3sKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpCisJCXB0ci0+bCA9IGNwdV90b19iZTY0KE5VTExGU0JMT0NLKTsKKwllbHNlCisJCXB0ci0+cyA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKK30KKworLyoKKyAqIEdldC9zZXQvaW5pdCBzaWJsaW5nIHBvaW50ZXJzCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIsCisJaW50CQkJbHIpCit7CisJQVNTRVJUKGxyID09IFhGU19CQl9MRUZUU0lCIHx8IGxyID09IFhGU19CQl9SSUdIVFNJQik7CisKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpIHsKKwkJaWYgKGxyID09IFhGU19CQl9SSUdIVFNJQikKKwkJCXB0ci0+bCA9IGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWI7CisJCWVsc2UKKwkJCXB0ci0+bCA9IGJsb2NrLT5iYl91LmwuYmJfbGVmdHNpYjsKKwl9IGVsc2UgeworCQlpZiAobHIgPT0gWEZTX0JCX1JJR0hUU0lCKQorCQkJcHRyLT5zID0gYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYjsKKwkJZWxzZQorCQkJcHRyLT5zID0gYmxvY2stPmJiX3Uucy5iYl9sZWZ0c2liOworCX0KK30KKworU1RBVElDIHZvaWQKK3hmc19idHJlZV9zZXRfc2libGluZygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0ciwKKwlpbnQJCQlscikKK3sKKwlBU1NFUlQobHIgPT0gWEZTX0JCX0xFRlRTSUIgfHwgbHIgPT0gWEZTX0JCX1JJR0hUU0lCKTsKKworCWlmIChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX0xPTkdfUFRSUykgeworCQlpZiAobHIgPT0gWEZTX0JCX1JJR0hUU0lCKQorCQkJYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYiA9IHB0ci0+bDsKKwkJZWxzZQorCQkJYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liID0gcHRyLT5sOworCX0gZWxzZSB7CisJCWlmIChsciA9PSBYRlNfQkJfUklHSFRTSUIpCisJCQlibG9jay0+YmJfdS5zLmJiX3JpZ2h0c2liID0gcHRyLT5zOworCQllbHNlCisJCQlibG9jay0+YmJfdS5zLmJiX2xlZnRzaWIgPSBwdHItPnM7CisJfQorfQorCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX2luaXRfYmxvY2soCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQludW1yZWNzLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKm5ldykJLyogbmV3IGJsb2NrICovCit7CisJbmV3LT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCW5ldy0+YmJfbGV2ZWwgPSBjcHVfdG9fYmUxNihsZXZlbCk7CisJbmV3LT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYobnVtcmVjcyk7CisKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpIHsKKwkJbmV3LT5iYl91LmwuYmJfbGVmdHNpYiA9IGNwdV90b19iZTY0KE5VTExGU0JMT0NLKTsKKwkJbmV3LT5iYl91LmwuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmU2NChOVUxMRlNCTE9DSyk7CisJfSBlbHNlIHsKKwkJbmV3LT5iYl91LnMuYmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJbmV3LT5iYl91LnMuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CisJfQorfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgcHRyIGlzIHRoZSBsYXN0IHJlY29yZCBpbiB0aGUgYnRyZWUgYW5kCisgKiB3ZSBuZWVkIHRvIHRyYWNrIHVwZGF0ZdGVIHRvIHRoaXMgcmVjb3JkLiAgVGhlIGRlY2lzaW9uCisgKiB3aWxsIGJlIGZ1cnRoZXIgcmVmaW5lZCBpbiB0aGUgdXBkYXRlX2xhc3RyZWMgbWV0aG9kLgorICovCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfaXNfbGFzdHJlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrLAorCWludAkJCWxldmVsKQoreworCXVuaW9uIHhmc19idHJlZV9wdHIJcHRyOworCisJaWYgKGxldmVsID4gMCkKKwkJcmV0dXJuIDA7CisJaWYgKCEoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MQVNUUkVDX1VQREFURSkpCisJCXJldHVybiAwOworCisJeGZzX2J0cmVlX2dldF9zaWJsaW5nKGN1ciwgYmxvY2ssICZwdHIsIFhGU19CQl9SSUdIVFNJQik7CisJaWYgKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmcHRyKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfYnVmX3RvX3B0cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRyKQoreworCWlmIChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX0xPTkdfUFRSUykKKwkJcHRyLT5sID0gY3B1X3RvX2JlNjQoWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLAorCQkJCQlYRlNfQlVGX0FERFIoYnApKSk7CisJZWxzZSB7CisJCXB0ci0+cyA9IGNwdV90b19iZTMyKFhGU19EQUREUl9UT19BR0JOTyhjdXItPmJjX21wLAorCQkJCQlYRlNfQlVGX0FERFIoYnApKSk7CisJfQorfQorCitTVEFUSUMgeGZzX2RhZGRyX3QKK3hmc19idHJlZV9wdHJfdG9fZGFkZHIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIpCit7CisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSB7CisJCUFTU0VSVChiZTY0X3RvX2NwdShwdHItPmwpICE9IE5VTExGU0JMT0NLKTsKKworCQlyZXR1cm4gWEZTX0ZTQl9UT19EQUREUihjdXItPmJjX21wLCBiZTY0X3RvX2NwdShwdHItPmwpKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoY3VyLT5iY19wcml2YXRlLmEuYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCQlBU1NFUlQoYmUzMl90b19jcHUocHRyLT5zKSAhPSBOVUxMQUdCTE9DSyk7CisKKwkJcmV0dXJuIFhGU19BR0JfVE9fREFERFIoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJCQkJYmUzMl90b19jcHUocHRyLT5zKSk7CisJfQorfQorCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX3NldF9yZWZzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86CisJY2FzZSBYRlNfQlROVU1fQ05UOgorCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19NQVAsIFhGU19BTExPQ19CVFJFRV9SRUYpOworCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9JTk86CisJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX0lOT01BUCwgWEZTX0lOT19CVFJFRV9SRUYpOworCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9CTUFQOgorCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19NQVAsIFhGU19CTUFQX0JUUkVFX1JFRik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3hmc19idHJlZV9nZXRfYnVmX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRyLAorCWludAkJCWZsYWdzLAorCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKipibG9jaywKKwlzdHJ1Y3QgeGZzX2J1ZgkJKipicHApCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBjdXItPmJjX21wOworCXhmc19kYWRkcl90CQlkOworCisJLyogbmVlZCB0byBzb3J0IG91dCBob3cgY2FsbGVycyBkZWFsIHdpdGggZmFpbHVyZXMgZmlyc3QgKi8KKwlBU1NFUlQoIShmbGFncyAmIFhGU19CVUZfVFJZTE9DSykpOworCisJZCA9IHhmc19idHJlZV9wdHJfdG9fZGFkZHIoY3VyLCBwdHIpOworCSpicHAgPSB4ZnNfdHJhbnNfZ2V0X2J1ZihjdXItPmJjX3RwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLAorCQkJCSBtcC0+bV9ic2l6ZSwgZmxhZ3MpOworCisJQVNTRVJUKCpicHApOworCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUigqYnBwKSk7CisKKwkqYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKCpicHApOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBpbiB0aGUgYnVmZmVyIGF0IHRoZSBnaXZlbiBwdHIgYW5kIHJldHVybiB0aGUgYnVmZmVyIGFuZAorICogdGhlIGJsb2NrIHBvaW50ZXIgd2l0aGluIHRoZSBidWZmZXIuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19idHJlZV9yZWFkX2J1Zl9ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQlmbGFncywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSoqYmxvY2ssCisJc3RydWN0IHhmc19idWYJCSoqYnBwKQoreworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gY3VyLT5iY19tcDsKKwl4ZnNfZGFkZHJfdAkJZDsKKwlpbnQJCQllcnJvcjsKKworCS8qIG5lZWQgdG8gc29ydCBvdXQgaG93IGNhbGxlcnMgZGVhbCB3aXRoIGZhaWx1cmVzIGZpcnN0ICovCisJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQlVGX1RSWUxPQ0spKTsKKworCWQgPSB4ZnNfYnRyZWVfcHRyX3RvX2RhZGRyKGN1ciwgcHRyKTsKKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgY3VyLT5iY190cCwgbXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQkgICBtcC0+bV9ic2l6ZSwgZmxhZ3MsIGJwcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlBU1NFUlQoKmJwcCAhPSBOVUxMKTsKKwlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoKmJwcCkpOworCisJeGZzX2J0cmVlX3NldF9yZWZzKGN1ciwgKmJwcCk7CisJKmJsb2NrID0gWEZTX0JVRl9UT19CTE9DSygqYnBwKTsKKworCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgKmJsb2NrLCBsZXZlbCwgKmJwcCk7CisJaWYgKGVycm9yKQorCQl4ZnNfdHJhbnNfYnJlbHNlKGN1ci0+YmNfdHAsICpicHApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENvcHkga2V5cyBmcm9tIG9uZSBidHJlZSBibG9jayB0byBhbm90aGVyLgorICovCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX2NvcHlfa2V5cygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9rZXkJKmRzdF9rZXksCisJdW5pb24geGZzX2J0cmVlX2tleQkqc3JjX2tleSwKKwlpbnQJCQludW1rZXlzKQoreworCUFTU0VSVChudW1rZXlzID49IDApOworCW1lbWNweShkc3Rfa2V5LCBzcmNfa2V5LCBudW1rZXlzICogY3VyLT5iY19vcHMtPmtleV9sZW4pOworfQorCisvKgorICogQ29weSByZWNvcmRzIGZyb20gb25lIGJ0cmVlIGJsb2NrIHRvIGFub3RoZXIuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfY29weV9yZWNzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3JlYwkqZHN0X3JlYywKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpzcmNfcmVjLAorCWludAkJCW51bXJlY3MpCit7CisJQVNTRVJUKG51bXJlY3MgPj0gMCk7CisJbWVtY3B5KGRzdF9yZWMsIHNyY19yZWMsIG51bXJlY3MgKiBjdXItPmJjX29wcy0+cmVjX2xlbik7Cit9CisKKy8qCisgKiBDb3B5IGJsb2NrIHBvaW50ZXJzIGZyb20gb25lIGJ0cmVlIGJsb2NrIHRvIGFub3RoZXIuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfY29weV9wdHJzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqZHN0X3B0ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpzcmNfcHRyLAorCWludAkJCW51bXB0cnMpCit7CisJQVNTRVJUKG51bXB0cnMgPj0gMCk7CisJbWVtY3B5KGRzdF9wdHIsIHNyY19wdHIsIG51bXB0cnMgKiB4ZnNfYnRyZWVfcHRyX2xlbihjdXIpKTsKK30KKworLyoKKyAqIFNoaWZ0IGtleXMgb25lIGluZGV4IGxlZnQvcmlnaHQgaW5zaWRlIGEgc2luZ2xlIGJ0cmVlIGJsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX3NoaWZ0X2tleXMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJaW50CQkJZGlyLAorCWludAkJCW51bWtleXMpCit7CisJY2hhcgkJCSpkc3Rfa2V5OworCisJQVNTRVJUKG51bWtleXMgPj0gMCk7CisJQVNTRVJUKGRpciA9PSAxIHx8IGRpciA9PSAtMSk7CisKKwlkc3Rfa2V5ID0gKGNoYXIgKilrZXkgKyAoZGlyICogY3VyLT5iY19vcHMtPmtleV9sZW4pOworCW1lbW1vdmUoZHN0X2tleSwga2V5LCBudW1rZXlzICogY3VyLT5iY19vcHMtPmtleV9sZW4pOworfQorCisvKgorICogU2hpZnQgcmVjb3JkcyBvbmUgaW5kZXggbGVmdC9yaWdodCBpbnNpZGUgYSBzaW5nbGUgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfc2hpZnRfcmVjcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYywKKwlpbnQJCQlkaXIsCisJaW50CQkJbnVtcmVjcykKK3sKKwljaGFyCQkJKmRzdF9yZWM7CisKKwlBU1NFUlQobnVtcmVjcyA+PSAwKTsKKwlBU1NFUlQoZGlyID09IDEgfHwgZGlyID09IC0xKTsKKworCWRzdF9yZWMgPSAoY2hhciAqKXJlYyArIChkaXIgKiBjdXItPmJjX29wcy0+cmVjX2xlbik7CisJbWVtbW92ZShkc3RfcmVjLCByZWMsIG51bXJlY3MgKiBjdXItPmJjX29wcy0+cmVjX2xlbik7Cit9CisKKy8qCisgKiBTaGlmdCBibG9jayBwb2ludGVycyBvbmUgaW5kZXggbGVmdC9yaWdodCBpbnNpZGUgYSBzaW5nbGUgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfc2hpZnRfcHRycygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0ciwKKwlpbnQJCQlkaXIsCisJaW50CQkJbnVtcHRycykKK3sKKwljaGFyCQkJKmRzdF9wdHI7CisKKwlBU1NFUlQobnVtcHRycyA+PSAwKTsKKwlBU1NFUlQoZGlyID09IDEgfHwgZGlyID09IC0xKTsKKworCWRzdF9wdHIgPSAoY2hhciAqKXB0ciArIChkaXIgKiB4ZnNfYnRyZWVfcHRyX2xlbihjdXIpKTsKKwltZW1tb3ZlKGRzdF9wdHIsIHB0ciwgbnVtcHRycyAqIHhmc19idHJlZV9wdHJfbGVuKGN1cikpOworfQorCisvKgorICogTG9nIGtleSB2YWx1ZXMgZnJvbSB0aGUgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfbG9nX2tleXMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCWludAkJCWZpcnN0LAorCWludAkJCWxhc3QpCit7CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisJWEZTX0JUUkVFX1RSQUNFX0FSR0JJSShjdXIsIGJwLCBmaXJzdCwgbGFzdCk7CisKKwlpZiAoYnApIHsKKwkJeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsCisJCQkJICB4ZnNfYnRyZWVfa2V5X29mZnNldChjdXIsIGZpcnN0KSwKKwkJCQkgIHhmc19idHJlZV9rZXlfb2Zmc2V0KGN1ciwgbGFzdCArIDEpIC0gMSk7CisJfSBlbHNlIHsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCQl4ZnNfaWxvZ19mYnJvb3QoY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKSk7CisJfQorCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKK30KKworLyoKKyAqIExvZyByZWNvcmQgdmFsdWVzIGZyb20gdGhlIGJ0cmVlIGJsb2NrLgorICovCit2b2lkCit4ZnNfYnRyZWVfbG9nX3JlY3MoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCWludAkJCWZpcnN0LAorCWludAkJCWxhc3QpCit7CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisJWEZTX0JUUkVFX1RSQUNFX0FSR0JJSShjdXIsIGJwLCBmaXJzdCwgbGFzdCk7CisKKwl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwKKwkJCSAgeGZzX2J0cmVlX3JlY19vZmZzZXQoY3VyLCBmaXJzdCksCisJCQkgIHhmc19idHJlZV9yZWNfb2Zmc2V0KGN1ciwgbGFzdCArIDEpIC0gMSk7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworfQorCisvKgorICogTG9nIGJsb2NrIHBvaW50ZXIgZmllbGRzIGZyb20gYSBidHJlZSBibG9jayAobm9ubGVhZikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnRyZWVfbG9nX3B0cnMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJc3RydWN0IHhmc19idWYJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlmaXJzdCwJLyogaW5kZXggb2YgZmlyc3QgcG9pbnRlciB0byBsb2cgKi8KKwlpbnQJCQlsYXN0KQkvKiBpbmRleCBvZiBsYXN0IHBvaW50ZXIgdG8gbG9nICovCit7CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisJWEZTX0JUUkVFX1RSQUNFX0FSR0JJSShjdXIsIGJwLCBmaXJzdCwgbGFzdCk7CisKKwlpZiAoYnApIHsKKwkJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKKwkJaW50CQkJbGV2ZWwgPSB4ZnNfYnRyZWVfZ2V0X2xldmVsKGJsb2NrKTsKKworCQl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwKKwkJCQl4ZnNfYnRyZWVfcHRyX29mZnNldChjdXIsIGZpcnN0LCBsZXZlbCksCisJCQkJeGZzX2J0cmVlX3B0cl9vZmZzZXQoY3VyLCBsYXN0ICsgMSwgbGV2ZWwpIC0gMSk7CisJfSBlbHNlIHsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCXhmc19pbG9nX2Zicm9vdChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKKwl9CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworfQorCisvKgorICogTG9nIGZpZWxkcyBmcm9tIGEgYnRyZWUgYmxvY2sgaGVhZGVyLgorICovCit2b2lkCit4ZnNfYnRyZWVfbG9nX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZmllbGRzKQkvKiBtYXNrIG9mIGZpZWxkczogWEZTX0JCXy4uLiAqLworeworCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXN0YXRpYyBjb25zdCBzaG9ydAlzb2Zmc2V0c1tdID0gewkvKiB0YWJsZSBvZiBvZmZzZXRzIChzaG9ydCkgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHhmc19idHJlZV9ibG9jaywgYmJfbWFnaWMpLAorCQlvZmZzZXRvZihzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrLCBiYl9sZXZlbCksCisJCW9mZnNldG9mKHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2ssIGJiX251bXJlY3MpLAorCQlvZmZzZXRvZihzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrLCBiYl91LnMuYmJfbGVmdHNpYiksCisJCW9mZnNldG9mKHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2ssIGJiX3Uucy5iYl9yaWdodHNpYiksCisJCVhGU19CVFJFRV9TQkxPQ0tfTEVOCisJfTsKKwlzdGF0aWMgY29uc3Qgc2hvcnQJbG9mZnNldHNbXSA9IHsJLyogdGFibGUgb2Ygb2Zmc2V0cyAobG9uZykgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHhmc19idHJlZV9ibG9jaywgYmJfbWFnaWMpLAorCQlvZmZzZXRvZihzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrLCBiYl9sZXZlbCksCisJCW9mZnNldG9mKHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2ssIGJiX251bXJlY3MpLAorCQlvZmZzZXRvZihzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrLCBiYl91LmwuYmJfbGVmdHNpYiksCisJCW9mZnNldG9mKHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2ssIGJiX3UubC5iYl9yaWdodHNpYiksCisJCVhGU19CVFJFRV9MQkxPQ0tfTEVOCisJfTsKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdCSShjdXIsIGJwLCBmaWVsZHMpOworCisJaWYgKGJwKSB7CisJCXhmc19idHJlZV9vZmZzZXRzKGZpZWxkcywKKwkJCQkgIChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX0xPTkdfUFRSUykgPworCQkJCQlsb2Zmc2V0cyA6IHNvZmZzZXRzLAorCQkJCSAgWEZTX0JCX05VTV9CSVRTLCAmZmlyc3QsICZsYXN0KTsKKwkJeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwl9IGVsc2UgeworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJeGZzX2lsb2dfZmJyb290KGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOworCX0KKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX2luY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CisJdW5pb24geGZzX2J0cmVlX3B0cglwdHI7CisJc3RydWN0IHhmc19idWYJCSpicDsKKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWxldjsKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCisJQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKKworCS8qIFJlYWQtYWhlYWQgdG8gdGhlIHJpZ2h0IGF0IHRoaXMgbGV2ZWwuICovCisJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfUklHSFRSQSk7CisKKwkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBidHJlZSBibG9jay4gKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwkvKiBXZSdyZSBkb25lIGlmIHdlIHJlbWFpbiBpbiB0aGUgYmxvY2sgYWZ0ZXIgdGhlIGluY3JlbWVudC4gKi8KKwlpZiAoKytjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jaykpCisJCWdvdG8gb3V0MTsKKworCS8qIEZhaWwgaWYgd2UganVzdCB3ZW50IG9mZiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdHJlZS4gKi8KKwl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoY3VyLCBibG9jaywgJnB0ciwgWEZTX0JCX1JJR0hUU0lCKTsKKwlpZiAoeGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJnB0cikpCisJCWdvdG8gb3V0MDsKKworCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBpbmNyZW1lbnQpOworCisJLyoKKwkgKiBNYXJjaCB1cCB0aGUgdHJlZSBpbmNyZW1lbnRpbmcgcG9pbnRlcnMuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdvIG9mZiB0aGUgcmlnaHQgZWRnZSBvZiBhIGJsb2NrLgorCSAqLworCWZvciAobGV2ID0gbGV2ZWwgKyAxOyBsZXYgPCBjdXItPmJjX25sZXZlbHM7IGxldisrKSB7CisJCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldiwgJmJwKTsKKworI2lmZGVmIERFQlVHCisJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCisJCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZdIDw9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jaykpCisJCQlicmVhazsKKworCQkvKiBSZWFkLWFoZWFkIHRoZSByaWdodCBibG9jayBmb3IgdGhlIG5leHQgbG9vcC4gKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCX0KKworCS8qCisJICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgZWl0aGVyIHNlcmlvdXNseQorCSAqIGNvbmZ1c2VkIG9yIGhhdmUgdGhlIHRyZWUgcm9vdCBpbiBhbiBpbm9kZS4KKwkgKi8KKwlpZiAobGV2ID09IGN1ci0+YmNfbmxldmVscykgeworCQlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9ST09UX0lOX0lOT0RFKQorCQkJZ290byBvdXQwOworCQlBU1NFUlQoMCk7CisJCWVycm9yID0gRUZTQ09SUlVQVEVEOworCQlnb3RvIGVycm9yMDsKKwl9CisJQVNTRVJUKGxldiA8IGN1ci0+YmNfbmxldmVscyk7CisKKwkvKgorCSAqIE5vdyB3YWxrIGJhY2sgZG93biB0aGUgdHJlZSwgZml4aW5nIHVwIHRoZSBjdXJzb3IncyBidWZmZXIKKwkgKiBwb2ludGVycyBhbmQga2V5IG51bWJlcnMuCisJICovCisJZm9yIChibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7IGxldiA+IGxldmVsOyApIHsKKwkJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRycDsKKworCQlwdHJwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgY3VyLT5iY19wdHJzW2xldl0sIGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZfYmxvY2soY3VyLCBwdHJwLCAtLWxldiwKKwkJCQkJCQkwLCAmYmxvY2ssICZicCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJY3VyLT5iY19wdHJzW2xldl0gPSAxOworCX0KK291dDE6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7CisKK291dDA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDA7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX2RlY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlsZXY7CisJdW5pb24geGZzX2J0cmVlX3B0cglwdHI7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKwlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKKworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisKKwkvKiBSZWFkLWFoZWFkIHRvIHRoZSBsZWZ0IGF0IHRoaXMgbGV2ZWwuICovCisJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfTEVGVFJBKTsKKworCS8qIFdlJ3JlIGRvbmUgaWYgd2UgcmVtYWluIGluIHRoZSBibG9jayBhZnRlciB0aGUgZGVjcmVtZW50LiAqLworCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZlbF0gPiAwKQorCQlnb3RvIG91dDE7CisKKwkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBidHJlZSBibG9jay4gKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwkvKiBGYWlsIGlmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHJlZS4gKi8KKwl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoY3VyLCBibG9jaywgJnB0ciwgWEZTX0JCX0xFRlRTSUIpOworCWlmICh4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmcHRyKSkKKwkJZ290byBvdXQwOworCisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGRlY3JlbWVudCk7CisKKwkvKgorCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGRlY3JlbWVudGluZyBwb2ludGVycy4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBibG9jay4KKwkgKi8KKwlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgeworCQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2XSA+IDApCisJCQlicmVhazsKKwkJLyogUmVhZC1haGVhZCB0aGUgbGVmdCBibG9jayBmb3IgdGhlIG5leHQgbG9vcC4gKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSB3ZW50IG9mZiB0aGUgcm9vdCB0aGVuIHdlIGFyZSBzZXJpb3VzbHkgY29uZnVzZWQuCisJICogb3IgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgaW4gYW4gaW5vZGUuCisJICovCisJaWYgKGxldiA9PSBjdXItPmJjX25sZXZlbHMpIHsKKwkJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERSkKKwkJCWdvdG8gb3V0MDsKKwkJQVNTRVJUKDApOworCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKKwkJZ290byBlcnJvcjA7CisJfQorCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOworCisJLyoKKwkgKiBOb3cgd2FsayBiYWNrIGRvd24gdGhlIHRyZWUsIGZpeGluZyB1cCB0aGUgY3Vyc29yJ3MgYnVmZmVyCisJICogcG9pbnRlcnMgYW5kIGtleSBudW1iZXJzLgorCSAqLworCWZvciAoYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2LCAmYnApOyBsZXYgPiBsZXZlbDsgKSB7CisJCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0cnA7CisKKwkJcHRycCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIGN1ci0+YmNfcHRyc1tsZXZdLCBibG9jayk7CisJCWVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmX2Jsb2NrKGN1ciwgcHRycCwgLS1sZXYsCisJCQkJCQkJMCwgJmJsb2NrLCAmYnApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQljdXItPmJjX3B0cnNbbGV2XSA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jayk7CisJfQorb3V0MToKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKKworb3V0MDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gMDsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2J0cmVlX2xvb2t1cF9nZXRfYmxvY2soCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIHRoZSBidHJlZSAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJKnBwLAkvKiBwdHIgdG8gYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSoqYmxrcCkgLyogcmV0dXJuIGJ0cmVlIGJsb2NrICovCit7CisJc3RydWN0IHhmc19idWYJCSpicDsJLyogYnVmZmVyIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZXJyb3IgPSAwOworCisJLyogc3BlY2lhbCBjYXNlIHRoZSByb290IGJsb2NrIGlmIGluIGFuIGlub2RlICovCisJaWYgKChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpICYmCisJICAgIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSkgeworCQkqYmxrcCA9IHhmc19idHJlZV9nZXRfaXJvb3QoY3VyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgb2xkIGJ1ZmZlciBhdCB0aGlzIGxldmVsIGZvciB0aGUgZGlzayBhZGRyZXNzIHdlIGFyZQorCSAqIGxvb2tpbmcgZm9yIHJlLXVzZSBpdC4KKwkgKgorCSAqIE90aGVyd2lzZSB0aHJvdyBpdCBhd2F5IGFuZCBnZXQgYSBuZXcgb25lLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlpZiAoYnAgJiYgWEZTX0JVRl9BRERSKGJwKSA9PSB4ZnNfYnRyZWVfcHRyX3RvX2RhZGRyKGN1ciwgcHApKSB7CisJCSpibGtwID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmX2Jsb2NrKGN1ciwgcHAsIGxldmVsLCAwLCBibGtwLCAmYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgY3VycmVudCBzZWFyY2gga2V5LiAgRm9yIGxldmVsIDAgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGtleQorICogc3RydWN0dXJlIHNvIHdlIG1ha2Ugb25lIHVwIGZyb20gdGhlIHJlY29yZC4gIEZvciBhbGwgb3RoZXIgbGV2ZWxzCisgKiB3ZSBqdXN0IHJldHVybiB0aGUgcmlnaHQga2V5LgorICovCitTVEFUSUMgdW5pb24geGZzX2J0cmVlX2tleSAqCit4ZnNfbG9va3VwX2dldF9zZWFyY2hfa2V5KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJaW50CQkJa2V5bm8sCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2ssCisJdW5pb24geGZzX2J0cmVlX2tleQkqa3ApCit7CisJaWYgKGxldmVsID09IDApIHsKKwkJY3VyLT5iY19vcHMtPmluaXRfa2V5X2Zyb21fcmVjKGtwLAorCQkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIGtleW5vLCBibG9jaykpOworCQlyZXR1cm4ga3A7CisJfQorCisJcmV0dXJuIHhmc19idHJlZV9rZXlfYWRkcihjdXIsIGtleW5vLCBibG9jayk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIHJlY29yZC4gIFRoZSBjdXJzb3IgaXMgbWFkZSB0byBwb2ludCB0byBpdCwgYmFzZWQgb24gZGlyLgorICogUmV0dXJuIDAgaWYgY2FuJ3QgZmluZCBhbnkgc3VjaCByZWNvcmQsIDEgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9sb29rdXAoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2xvb2t1cF90CQlkaXIsCS8qIDw9LCA9PSwgb3IgPj0gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwlfX2ludDY0X3QJCWRpZmY7CS8qIGRpZmZlcmVuY2UgZm9yIHRoZSBjdXJyZW50IGtleSAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlrZXlubzsJLyogY3VycmVudCBrZXkgbnVtYmVyICovCisJaW50CQkJbGV2ZWw7CS8qIGxldmVsIGluIHRoZSBidHJlZSAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJKnBwOwkvKiBwdHIgdG8gYnRyZWUgYmxvY2sgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCXB0cjsJLyogcHRyIHRvIGJ0cmVlIGJsb2NrICovCisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKwlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjdXIsIGRpcik7CisKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgbG9va3VwKTsKKworCWJsb2NrID0gTlVMTDsKKwlrZXlubyA9IDA7CisKKwkvKiBpbml0aWFsaXNlIHN0YXJ0IHBvaW50ZXIgZnJvbSBjdXJzb3IgKi8KKwljdXItPmJjX29wcy0+aW5pdF9wdHJfZnJvbV9jdXIoY3VyLCAmcHRyKTsKKwlwcCA9ICZwdHI7CisKKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIGxldmVsIGluIHRoZSBidHJlZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuCisJICogRm9yIGVhY2ggbGV2ZWwgYWJvdmUgdGhlIGxlYXZlcywgZmluZCB0aGUga2V5IHdlIG5lZWQsIGJhc2VkCisJICogb24gdGhlIGxvb2t1cCByZWNvcmQsIHRoZW4gZm9sbG93IHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrCisJICogcG9pbnRlciBkb3duIHRvIHRoZSBuZXh0IGxldmVsLgorCSAqLworCWZvciAobGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxLCBkaWZmID0gMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgeworCQkvKiBHZXQgdGhlIGJsb2NrIHdlIG5lZWQgdG8gZG8gdGhlIGxvb2t1cCBvbi4gKi8KKwkJZXJyb3IgPSB4ZnNfYnRyZWVfbG9va3VwX2dldF9ibG9jayhjdXIsIGxldmVsLCBwcCwgJmJsb2NrKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisKKwkJaWYgKGRpZmYgPT0gMCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGFscmVhZHkgaGFkIGEga2V5IG1hdGNoIGF0IGEgaGlnaGVyIGxldmVsLCB3ZQorCQkJICoga25vdyB3ZSBuZWVkIHRvIHVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyBibG9jay4KKwkJCSAqLworCQkJa2V5bm8gPSAxOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIHNlYXJjaCB0aGlzIGJsb2NrLiBEbyBhIGJpbmFyeSBzZWFyY2guICovCisKKwkJCWludAloaWdoOwkvKiBoaWdoIGVudHJ5IG51bWJlciAqLworCQkJaW50CWxvdzsJLyogbG93IGVudHJ5IG51bWJlciAqLworCisJCQkvKiBTZXQgbG93IGFuZCBoaWdoIGVudHJ5IG51bWJlcnMsIDEtYmFzZWQuICovCisJCQlsb3cgPSAxOworCQkJaGlnaCA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jayk7CisJCQlpZiAoIWhpZ2gpIHsKKwkJCQkvKiBCbG9jayBpcyBlbXB0eSwgbXVzdCBiZSBhbiBlbXB0eSBsZWFmLiAqLworCQkJCUFTU0VSVChsZXZlbCA9PSAwICYmIGN1ci0+YmNfbmxldmVscyA9PSAxKTsKKworCQkJCWN1ci0+YmNfcHRyc1swXSA9IGRpciAhPSBYRlNfTE9PS1VQX0xFOworCQkJCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJCQkJKnN0YXQgPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBCaW5hcnkgc2VhcmNoIHRoZSBibG9jay4gKi8KKwkJCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQkJCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OworCQkJCXVuaW9uIHhmc19idHJlZV9rZXkJKmtwOworCisJCQkJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGNvbXBhcmUpOworCisJCQkJLyoga2V5bm8gaXMgYXZlcmFnZSBvZiBsb3cgYW5kIGhpZ2guICovCisJCQkJa2V5bm8gPSAobG93ICsgaGlnaCkgPj4gMTsKKworCQkJCS8qIEdldCBjdXJyZW50IHNlYXJjaCBrZXkgKi8KKwkJCQlrcCA9IHhmc19sb29rdXBfZ2V0X3NlYXJjaF9rZXkoY3VyLCBsZXZlbCwKKwkJCQkJCWtleW5vLCBibG9jaywgJmtleSk7CisKKwkJCQkvKgorCQkJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSB0byBnZXQgbmV4dCBkaXJlY3Rpb246CisJCQkJICogIC0gbGVzcyB0aGFuLCBtb3ZlIHJpZ2h0CisJCQkJICogIC0gZ3JlYXRlciB0aGFuLCBtb3ZlIGxlZnQKKwkJCQkgKiAgLSBlcXVhbCwgd2UncmUgZG9uZQorCQkJCSAqLworCQkJCWRpZmYgPSBjdXItPmJjX29wcy0+a2V5X2RpZmYoY3VyLCBrcCk7CisJCQkJaWYgKGRpZmYgPCAwKQorCQkJCQlsb3cgPSBrZXlubyArIDE7CisJCQkJZWxzZSBpZiAoZGlmZiA+IDApCisJCQkJCWhpZ2ggPSBrZXlubyAtIDE7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtb3JlIGxldmVscywgc2V0IHVwIGZvciB0aGUgbmV4dCBsZXZlbAorCQkgKiBieSBnZXR0aW5nIHRoZSBibG9jayBudW1iZXIgYW5kIGZpbGxpbmcgaW4gdGhlIGN1cnNvci4KKwkJICovCisJCWlmIChsZXZlbCA+IDApIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBtb3ZlZCBsZWZ0LCBuZWVkIHRoZSBwcmV2aW91cyBrZXkgbnVtYmVyLAorCQkJICogdW5sZXNzIHRoZXJlIGlzbid0IG9uZS4KKwkJCSAqLworCQkJaWYgKGRpZmYgPiAwICYmIC0ta2V5bm8gPCAxKQorCQkJCWtleW5vID0gMTsKKwkJCXBwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwga2V5bm8sIGJsb2NrKTsKKworI2lmZGVmIERFQlVHCisJCQllcnJvciA9IHhmc19idHJlZV9jaGVja19wdHIoY3VyLCBwcCwgMCwgbGV2ZWwpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworI2VuZGlmCisJCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87CisJCX0KKwl9CisKKwkvKiBEb25lIHdpdGggdGhlIHNlYXJjaC4gU2VlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLiAqLworCWlmIChkaXIgIT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmIDwgMCkgeworCQlrZXlubysrOworCQkvKgorCQkgKiBJZiBnZSBzZWFyY2ggYW5kIHdlIHdlbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgaXQncworCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KKwkJICovCisJCXhmc19idHJlZV9nZXRfc2libGluZyhjdXIsIGJsb2NrLCAmcHRyLCBYRlNfQkJfUklHSFRTSUIpOworCQlpZiAoZGlyID09IFhGU19MT09LVVBfR0UgJiYKKwkJICAgIGtleW5vID4geGZzX2J0cmVlX2dldF9udW1yZWNzKGJsb2NrKSAmJgorCQkgICAgIXhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZwdHIpKSB7CisJCQlpbnQJaTsKKworCQkJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJCQllcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJCQlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKGRpciA9PSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPiAwKQorCQlrZXluby0tOworCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOworCisJLyogUmV0dXJuIGlmIHdlIHN1Y2NlZWRlZCBvciBub3QuICovCisJaWYgKGtleW5vID09IDAgfHwga2V5bm8gPiB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spKQorCQkqc3RhdCA9IDA7CisJZWxzZSBpZiAoZGlyICE9IFhGU19MT09LVVBfRVEgfHwgZGlmZiA9PSAwKQorCQkqc3RhdCA9IDE7CisJZWxzZQorCQkqc3RhdCA9IDA7CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFVwZGF0ZSBrZXlzIGF0IGFsbCBsZXZlbHMgZnJvbSBoZXJlIHRvIHRoZSByb290IGFsb25nIHRoZSBjdXJzb3IncyBwYXRoLgorICovCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfdXBka2V5KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5cCwKKwlpbnQJCQlsZXZlbCkKK3sKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOworCXVuaW9uIHhmc19idHJlZV9rZXkJKmtwOworCWludAkJCXB0cjsKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJSyhjdXIsIGxldmVsLCBrZXlwKTsKKworCUFTU0VSVCghKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERSkgfHwgbGV2ZWwgPj0gMSk7CisKKwkvKgorCSAqIEdvIHVwIHRoZSB0cmVlIGZyb20gdGhpcyBsZXZlbCB0b3dhcmQgdGhlIHJvb3QuCisJICogQXQgZWFjaCBsZXZlbCwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgdG8gdGhlIHZhbHVlIGlucHV0LgorCSAqIFN0b3Agd2hlbiB3ZSByZWFjaCBhIGxldmVsIHdoZXJlIHRoZSBjdXJzb3IgaXNuJ3QgcG9pbnRpbmcKKwkgKiBhdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGJsb2NrLgorCSAqLworCWZvciAocHRyID0gMTsgcHRyID09IDEgJiYgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKKyNpZmRlZiBERUJVRworCQlpbnQJCWVycm9yOworI2VuZGlmCisJCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworI2lmZGVmIERFQlVHCisJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CisJCWlmIChlcnJvcikgeworCQkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQlrcCA9IHhmc19idHJlZV9rZXlfYWRkcihjdXIsIHB0ciwgYmxvY2spOworCQl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwga3AsIGtleXAsIDEpOworCQl4ZnNfYnRyZWVfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBwdHIpOworCX0KKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIgdG8gdGhlIHZhbHVlIGluIHRoZQorICogZ2l2ZW4gcmVjb3JkLiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4KKyAqIEVGU0NPUlJVUFRFRCBlcnJvci4KKyAqLworaW50Cit4ZnNfYnRyZWVfdXBkYXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjKQoreworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrOworCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CisJaW50CQkJZXJyb3I7CisJaW50CQkJcHRyOworCXVuaW9uIHhmc19idHJlZV9yZWMJKnJwOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisJWEZTX0JUUkVFX1RSQUNFX0FSR1IoY3VyLCByZWMpOworCisJLyogUGljayB1cCB0aGUgY3VycmVudCBibG9jay4gKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCAwLCAmYnApOworCisjaWZkZWYgREVCVUcKKwllcnJvciA9IHhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCAwLCBicCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVjIHRvIGJlIHVwZGF0ZWQuICovCisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworCXJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgcHRyLCBibG9jayk7CisKKwkvKiBGaWxsIGluIHRoZSBuZXcgY29udGVudHMgYW5kIGxvZyB0aGVtLiAqLworCXhmc19idHJlZV9jb3B5X3JlY3MoY3VyLCBycCwgcmVjLCAxKTsKKwl4ZnNfYnRyZWVfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBwdHIpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgdHJhY2tpbmcgdGhlIGxhc3QgcmVjb3JkIGluIHRoZSB0cmVlIGFuZAorCSAqIHdlIGFyZSBhdCB0aGUgZmFyIHJpZ2h0IGVkZ2Ugb2YgdGhlIHRyZWUsIHVwZGF0ZSBpdC4KKwkgKi8KKwlpZiAoeGZzX2J0cmVlX2lzX2xhc3RyZWMoY3VyLCBibG9jaywgMCkpIHsKKwkJY3VyLT5iY19vcHMtPnVwZGF0ZV9sYXN0cmVjKGN1ciwgYmxvY2ssIHJlYywKKwkJCQkJICAgIHB0ciwgTEFTVFJFQ19VUERBVEUpOworCX0KKworCS8qIFVwZGF0aW5nIGZpcnN0IHJlYyBpbiBsZWFmLiBQYXNzIG5ldyBrZXkgdmFsdWUgdXAgdG8gb3VyIHBhcmVudC4gKi8KKwlpZiAocHRyID09IDEpIHsKKwkJdW5pb24geGZzX2J0cmVlX2tleQlrZXk7CisKKwkJY3VyLT5iY19vcHMtPmluaXRfa2V5X2Zyb21fcmVjKCZrZXksIHJlYyk7CisJCWVycm9yID0geGZzX2J0cmVlX3VwZGtleShjdXIsICZrZXksIDEpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCXJldHVybiAwOworCitlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTW92ZSAxIHJlY29yZCBsZWZ0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9sc2hpZnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OwkJLyogYnRyZWUga2V5ICovCisJc3RydWN0IHhmc19idWYJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlscmVjczsJCS8qIGxlZnQgcmVjb3JkIGNvdW50ICovCisJc3RydWN0IHhmc19idWYJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlycmVjczsJCS8qIHJpZ2h0IHJlY29yZCBjb3VudCAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJbHB0cjsJCS8qIGxlZnQgYnRyZWUgcG9pbnRlciAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJKnJrcCA9IE5VTEw7CS8qIHJpZ2h0IGJ0cmVlIGtleSAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJKnJwcCA9IE5VTEw7CS8qIHJpZ2h0IGFkZHJlc3MgcG9pbnRlciAqLworCXVuaW9uIHhmc19idHJlZV9yZWMJKnJycCA9IE5VTEw7CS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCisJaWYgKChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpICYmCisJICAgIGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpCisJCWdvdG8gb3V0MDsKKworCS8qIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgInJpZ2h0Ii4gKi8KKwlyaWdodCA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJnJicCk7CisKKyNpZmRlZiBERUJVRworCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisjZW5kaWYKKworCS8qIElmIHdlJ3ZlIGdvdCBubyBsZWZ0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSBsZWZ0LiAqLworCXhmc19idHJlZV9nZXRfc2libGluZyhjdXIsIHJpZ2h0LCAmbHB0ciwgWEZTX0JCX0xFRlRTSUIpOworCWlmICh4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmbHB0cikpCisJCWdvdG8gb3V0MDsKKworCS8qCisJICogSWYgdGhlIGN1cnNvciBlbnRyeSBpcyB0aGUgb25lIHRoYXQgd291bGQgYmUgbW92ZWQsIGRvbid0CisJICogZG8gaXQuLi4gaXQncyB0b28gY29tcGxpY2F0ZWQuCisJICovCisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gMSkKKwkJZ290byBvdXQwOworCisJLyogU2V0IHVwIHRoZSBsZWZ0IG5laWdoYm9yIGFzICJsZWZ0Ii4gKi8KKwllcnJvciA9IHhmc19idHJlZV9yZWFkX2J1Zl9ibG9jayhjdXIsICZscHRyLCBsZXZlbCwgMCwgJmxlZnQsICZsYnApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisKKwkvKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4gKi8KKwlscmVjcyA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhsZWZ0KTsKKwlpZiAobHJlY3MgPT0gY3VyLT5iY19vcHMtPmdldF9tYXhyZWNzKGN1ciwgbGV2ZWwpKQorCQlnb3RvIG91dDA7CisKKwlycmVjcyA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhyaWdodCk7CisKKwkvKgorCSAqIFdlIGFkZCBvbmUgZW50cnkgdG8gdGhlIGxlZnQgc2lkZSBhbmQgcmVtb3ZlIG9uZSBmb3IgdGhlIHJpZ2h0IHNpZGUuCisJICogQWNjb3V0IGZvciBpdCBoZXJlLCB0aGUgY2hhbmdlcyB3aWxsIGJlIHVwZGF0ZWQgb24gZGlzayBhbmQgbG9nZ2VkCisJICogbGF0ZXIuCisJICovCisJbHJlY3MrKzsKKwlycmVjcy0tOworCisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGxzaGlmdCk7CisJWEZTX0JUUkVFX1NUQVRTX0FERChjdXIsIG1vdmVzLCAxKTsKKworCS8qCisJICogSWYgbm9uLWxlYWYsIGNvcHkgYSBrZXkgYW5kIGEgcHRyIHRvIHRoZSBsZWZ0IGJsb2NrLgorCSAqIExvZyB0aGUgY2hhbmdlcyB0byB0aGUgbGVmdCBibG9jay4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qIEl0J3MgYSBub24tbGVhZi4gIE1vdmUga2V5cyBhbmQgcG9pbnRlcnMuICovCisJCXVuaW9uIHhmc19idHJlZV9rZXkJKmxrcDsJLyogbGVmdCBidHJlZSBrZXkgKi8KKwkJdW5pb24geGZzX2J0cmVlX3B0cgkqbHBwOwkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCisJCWxrcCA9IHhmc19idHJlZV9rZXlfYWRkcihjdXIsIGxyZWNzLCBsZWZ0KTsKKwkJcmtwID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMSwgcmlnaHQpOworCisJCWxwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIGxyZWNzLCBsZWZ0KTsKKwkJcnBwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgMSwgcmlnaHQpOworI2lmZGVmIERFQlVHCisJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX3B0cihjdXIsIHJwcCwgMCwgbGV2ZWwpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwgbGtwLCBya3AsIDEpOworCQl4ZnNfYnRyZWVfY29weV9wdHJzKGN1ciwgbHBwLCBycHAsIDEpOworCisJCXhmc19idHJlZV9sb2dfa2V5cyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKKwkJeGZzX2J0cmVlX2xvZ19wdHJzKGN1ciwgbGJwLCBscmVjcywgbHJlY3MpOworCisJCUFTU0VSVChjdXItPmJjX29wcy0+a2V5c19pbm9yZGVyKGN1ciwKKwkJCXhmc19idHJlZV9rZXlfYWRkcihjdXIsIGxyZWNzIC0gMSwgbGVmdCksIGxrcCkpOworCX0gZWxzZSB7CisJCS8qIEl0J3MgYSBsZWFmLiAgTW92ZSByZWNvcmRzLiAgKi8KKwkJdW5pb24geGZzX2J0cmVlX3JlYwkqbHJwOwkvKiBsZWZ0IHJlY29yZCBwb2ludGVyICovCisKKwkJbHJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgbHJlY3MsIGxlZnQpOworCQlycnAgPSB4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCAxLCByaWdodCk7CisKKwkJeGZzX2J0cmVlX2NvcHlfcmVjcyhjdXIsIGxycCwgcnJwLCAxKTsKKwkJeGZzX2J0cmVlX2xvZ19yZWNzKGN1ciwgbGJwLCBscmVjcywgbHJlY3MpOworCisJCUFTU0VSVChjdXItPmJjX29wcy0+cmVjc19pbm9yZGVyKGN1ciwKKwkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIGxyZWNzIC0gMSwgbGVmdCksIGxycCkpOworCX0KKworCXhmc19idHJlZV9zZXRfbnVtcmVjcyhsZWZ0LCBscmVjcyk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworCisJeGZzX2J0cmVlX3NldF9udW1yZWNzKHJpZ2h0LCBycmVjcyk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX05VTVJFQ1MpOworCisJLyoKKwkgKiBTbGlkZSB0aGUgY29udGVudHMgb2YgcmlnaHQgZG93biBvbmUgZW50cnkuCisJICovCisJWEZTX0JUUkVFX1NUQVRTX0FERChjdXIsIG1vdmVzLCBycmVjcyAtIDEpOworCWlmIChsZXZlbCA+IDApIHsKKwkJLyogSXQncyBhIG5vbmxlYWYuIG9wZXJhdGUgb24ga2V5cyBhbmQgcHRycyAqLworI2lmZGVmIERFQlVHCisJCWludAkJCWk7CQkvKiBsb29wIGluZGV4ICovCisKKwkJZm9yIChpID0gMDsgaSA8IHJyZWNzOyBpKyspIHsKKwkJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX3B0cihjdXIsIHJwcCwgaSArIDEsIGxldmVsKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJfQorI2VuZGlmCisJCXhmc19idHJlZV9zaGlmdF9rZXlzKGN1ciwKKwkJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAyLCByaWdodCksCisJCQkJLTEsIHJyZWNzKTsKKwkJeGZzX2J0cmVlX3NoaWZ0X3B0cnMoY3VyLAorCQkJCXhmc19idHJlZV9wdHJfYWRkcihjdXIsIDIsIHJpZ2h0KSwKKwkJCQktMSwgcnJlY3MpOworCisJCXhmc19idHJlZV9sb2dfa2V5cyhjdXIsIHJicCwgMSwgcnJlY3MpOworCQl4ZnNfYnRyZWVfbG9nX3B0cnMoY3VyLCByYnAsIDEsIHJyZWNzKTsKKwl9IGVsc2UgeworCQkvKiBJdCdzIGEgbGVhZi4gb3BlcmF0ZSBvbiByZWNvcmRzICovCisJCXhmc19idHJlZV9zaGlmdF9yZWNzKGN1ciwKKwkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIDIsIHJpZ2h0KSwKKwkJCS0xLCBycmVjcyk7CisJCXhmc19idHJlZV9sb2dfcmVjcyhjdXIsIHJicCwgMSwgcnJlY3MpOworCisJCS8qCisJCSAqIElmIGl0J3MgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgYmxvY2ssIHdlJ2xsIG5lZWQgYSBrZXkKKwkJICogc3RydWN0dXJlIHRvIHBhc3MgdXAgdG8gdGhlIG5leHQgbGV2ZWwgKHVwZGtleSkuCisJCSAqLworCQljdXItPmJjX29wcy0+aW5pdF9rZXlfZnJvbV9yZWMoJmtleSwKKwkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIDEsIHJpZ2h0KSk7CisJCXJrcCA9ICZrZXk7CisJfQorCisJLyogVXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiByaWdodC4gKi8KKwllcnJvciA9IHhmc19idHJlZV91cGRrZXkoY3VyLCBya3AsIGxldmVsICsgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKworCS8qIFNsaWRlIHRoZSBjdXJzb3IgdmFsdWUgbGVmdCBvbmUuICovCisJY3VyLT5iY19wdHJzW2xldmVsXS0tOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7CisKK291dDA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDA7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIHJpZ2h0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yc2hpZnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OwkJLyogYnRyZWUga2V5ICovCisJc3RydWN0IHhmc19idWYJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSp0Y3VyOwkJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJcnB0cjsJCS8qIHJpZ2h0IGJsb2NrIHBvaW50ZXIgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpya3A7CQkvKiByaWdodCBidHJlZSBrZXkgKi8KKwlpbnQJCQlycmVjczsJCS8qIHJpZ2h0IHJlY29yZCBjb3VudCAqLworCWludAkJCWxyZWNzOwkJLyogbGVmdCByZWNvcmQgY291bnQgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCisJaWYgKChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpICYmCisJICAgIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSkKKwkJZ290byBvdXQwOworCisJLyogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAibGVmdCIuICovCisJbGVmdCA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmxicCk7CisKKyNpZmRlZiBERUJVRworCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCisJLyogSWYgd2UndmUgZ290IG5vIHJpZ2h0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSByaWdodC4gKi8KKwl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoY3VyLCBsZWZ0LCAmcnB0ciwgWEZTX0JCX1JJR0hUU0lCKTsKKwlpZiAoeGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJnJwdHIpKQorCQlnb3RvIG91dDA7CisKKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAorCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgorCSAqLworCWxyZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGxlZnQpOworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IGxyZWNzKQorCQlnb3RvIG91dDA7CisKKwkvKiBTZXQgdXAgdGhlIHJpZ2h0IG5laWdoYm9yIGFzICJyaWdodCIuICovCisJZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZfYmxvY2soY3VyLCAmcnB0ciwgbGV2ZWwsIDAsICZyaWdodCwgJnJicCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKworCS8qIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LiAqLworCXJyZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKHJpZ2h0KTsKKwlpZiAocnJlY3MgPT0gY3VyLT5iY19vcHMtPmdldF9tYXhyZWNzKGN1ciwgbGV2ZWwpKQorCQlnb3RvIG91dDA7CisKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgcnNoaWZ0KTsKKwlYRlNfQlRSRUVfU1RBVFNfQUREKGN1ciwgbW92ZXMsIHJyZWNzKTsKKworCS8qCisJICogTWFrZSBhIGhvbGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByaWdodCBuZWlnaGJvciBibG9jaywgdGhlbgorCSAqIGNvcHkgdGhlIGxhc3QgbGVmdCBibG9jayBlbnRyeSB0byB0aGUgaG9sZS4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qIEl0J3MgYSBub25sZWFmLiBtYWtlIGEgaG9sZSBpbiB0aGUga2V5cyBhbmQgcHRycyAqLworCQl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpsa3A7CisJCXVuaW9uIHhmc19idHJlZV9wdHIJKmxwcDsKKwkJdW5pb24geGZzX2J0cmVlX3B0cgkqcnBwOworCisJCWxrcCA9IHhmc19idHJlZV9rZXlfYWRkcihjdXIsIGxyZWNzLCBsZWZ0KTsKKwkJbHBwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgbHJlY3MsIGxlZnQpOworCQlya3AgPSB4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCByaWdodCk7CisJCXJwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIDEsIHJpZ2h0KTsKKworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IHJyZWNzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX3B0cihjdXIsIHJwcCwgaSwgbGV2ZWwpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQl9CisjZW5kaWYKKworCQl4ZnNfYnRyZWVfc2hpZnRfa2V5cyhjdXIsIHJrcCwgMSwgcnJlY3MpOworCQl4ZnNfYnRyZWVfc2hpZnRfcHRycyhjdXIsIHJwcCwgMSwgcnJlY3MpOworCisjaWZkZWYgREVCVUcKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfcHRyKGN1ciwgbHBwLCAwLCBsZXZlbCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwkJLyogTm93IHB1dCB0aGUgbmV3IGRhdGEgaW4sIGFuZCBsb2cgaXQuICovCisJCXhmc19idHJlZV9jb3B5X2tleXMoY3VyLCBya3AsIGxrcCwgMSk7CisJCXhmc19idHJlZV9jb3B5X3B0cnMoY3VyLCBycHAsIGxwcCwgMSk7CisKKwkJeGZzX2J0cmVlX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBycmVjcyArIDEpOworCQl4ZnNfYnRyZWVfbG9nX3B0cnMoY3VyLCByYnAsIDEsIHJyZWNzICsgMSk7CisKKwkJQVNTRVJUKGN1ci0+YmNfb3BzLT5rZXlzX2lub3JkZXIoY3VyLCBya3AsCisJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAyLCByaWdodCkpKTsKKwl9IGVsc2UgeworCQkvKiBJdCdzIGEgbGVhZi4gbWFrZSBhIGhvbGUgaW4gdGhlIHJlY29yZHMgKi8KKwkJdW5pb24geGZzX2J0cmVlX3JlYwkqbHJwOworCQl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpycnA7CisKKwkJbHJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgbHJlY3MsIGxlZnQpOworCQlycnAgPSB4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCAxLCByaWdodCk7CisKKwkJeGZzX2J0cmVlX3NoaWZ0X3JlY3MoY3VyLCBycnAsIDEsIHJyZWNzKTsKKworCQkvKiBOb3cgcHV0IHRoZSBuZXcgZGF0YSBpbiwgYW5kIGxvZyBpdC4gKi8KKwkJeGZzX2J0cmVlX2NvcHlfcmVjcyhjdXIsIHJycCwgbHJwLCAxKTsKKwkJeGZzX2J0cmVlX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBycmVjcyArIDEpOworCisJCWN1ci0+YmNfb3BzLT5pbml0X2tleV9mcm9tX3JlYygma2V5LCBycnApOworCQlya3AgPSAma2V5OworCisJCUFTU0VSVChjdXItPmJjX29wcy0+cmVjc19pbm9yZGVyKGN1ciwgcnJwLAorCQkJeGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgMiwgcmlnaHQpKSk7CisJfQorCisJLyoKKwkgKiBEZWNyZW1lbnQgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgYnVtcCBhbmQgbG9nIHJpZ2h0J3MgbnVtcmVjcy4KKwkgKi8KKwl4ZnNfYnRyZWVfc2V0X251bXJlY3MobGVmdCwgLS1scmVjcyk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworCisJeGZzX2J0cmVlX3NldF9udW1yZWNzKHJpZ2h0LCArK3JyZWNzKTsKKwl4ZnNfYnRyZWVfbG9nX2Jsb2NrKGN1ciwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CisKKwkvKgorCSAqIFVzaW5nIGEgdGVtcG9yYXJ5IGN1cnNvciwgdXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiB0aGUKKwkgKiBibG9jayBvbiB0aGUgcmlnaHQuCisJICovCisJZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCisJZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KHRjdXIsIGxldmVsLCAmaSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMTsKKworCWVycm9yID0geGZzX2J0cmVlX3VwZGtleSh0Y3VyLCBya3AsIGxldmVsICsgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMTsKKworCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworCitvdXQwOgorCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJKnN0YXQgPSAwOworCXJldHVybiAwOworCitlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworCitlcnJvcjE6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUih0Y3VyLCBYQlRfRVJST1IpOworCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCisgKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgdGhlIGtleSB0byBpdHMgZmlyc3QKKyAqIHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX3NwbGl0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHRycCwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJc3RydWN0IHhmc19idHJlZV9jdXIJKipjdXJwLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJdW5pb24geGZzX2J0cmVlX3B0cglscHRyOwkJLyogbGVmdCBzaWJsaW5nIGJsb2NrIHB0ciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJdW5pb24geGZzX2J0cmVlX3B0cglycHRyOwkJLyogcmlnaHQgc2libGluZyBibG9jayBwdHIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJcnJwdHI7CQkvKiByaWdodC1yaWdodCBzaWJsaW5nIHB0ciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqcnJicDsJCS8qIHJpZ2h0LXJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqcnJibG9jazsJLyogcmlnaHQtcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlscmVjczsKKwlpbnQJCQlycmVjczsKKwlpbnQJCQlzcmNfaW5kZXg7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBERUJVRworCWludAkJCWk7CisjZW5kaWYKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJUEsoY3VyLCBsZXZlbCwgKnB0cnAsIGtleSk7CisKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgc3BsaXQpOworCisJLyogU2V0IHVwIGxlZnQgYmxvY2sgKGN1cnJlbnQgb25lKS4gKi8KKwlsZWZ0ID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmbGJwKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwl4ZnNfYnRyZWVfYnVmX3RvX3B0cihjdXIsIGxicCwgJmxwdHIpOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBibG9jay4gSWYgd2UgY2FuJ3QgZG8gaXQsIHdlJ3JlIHRvYXN0LiBHaXZlIHVwLiAqLworCWVycm9yID0gY3VyLT5iY19vcHMtPmFsbG9jX2Jsb2NrKGN1ciwgJmxwdHIsICZycHRyLCAxLCBzdGF0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCWlmICgqc3RhdCA9PSAwKQorCQlnb3RvIG91dDA7CisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGFsbG9jKTsKKworCS8qIFNldCB1cCB0aGUgbmV3IGJsb2NrIGFzICJyaWdodCIuICovCisJZXJyb3IgPSB4ZnNfYnRyZWVfZ2V0X2J1Zl9ibG9jayhjdXIsICZycHRyLCAwLCAmcmlnaHQsICZyYnApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisKKwkvKiBGaWxsIGluIHRoZSBidHJlZSBoZWFkZXIgZm9yIHRoZSBuZXcgcmlnaHQgYmxvY2suICovCisJeGZzX2J0cmVlX2luaXRfYmxvY2soY3VyLCB4ZnNfYnRyZWVfZ2V0X2xldmVsKGxlZnQpLCAwLCByaWdodCk7CisKKwkvKgorCSAqIFNwbGl0IHRoZSBlbnRyaWVzIGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBibG9jayBldmVubHkuCisJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUncyBhbiBvZGQgbnVtYmVyIG9mIGVudHJpZXMgbm93LCB0aGF0CisJICogZWFjaCBuZXcgYmxvY2sgd2lsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzLgorCSAqLworCWxyZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGxlZnQpOworCXJyZWNzID0gbHJlY3MgLyAyOworCWlmICgobHJlY3MgJiAxKSAmJiBjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IHJyZWNzICsgMSkKKwkJcnJlY3MrKzsKKwlzcmNfaW5kZXggPSAobHJlY3MgLSBycmVjcyArIDEpOworCisJWEZTX0JUUkVFX1NUQVRTX0FERChjdXIsIG1vdmVzLCBycmVjcyk7CisKKwkvKgorCSAqIENvcHkgYnRyZWUgYmxvY2sgZW50cmllcyBmcm9tIHRoZSBsZWZ0IGJsb2NrIG92ZXIgdG8gdGhlCisJICogbmV3IGJsb2NrLCB0aGUgcmlnaHQuIFVwZGF0ZSB0aGUgcmlnaHQgYmxvY2sgYW5kIGxvZyB0aGUKKwkgKiBjaGFuZ2VzLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJLyogSXQncyBhIG5vbi1sZWFmLiAgTW92ZSBrZXlzIGFuZCBwb2ludGVycy4gKi8KKwkJdW5pb24geGZzX2J0cmVlX2tleQkqbGtwOwkvKiBsZWZ0IGJ0cmVlIGtleSAqLworCQl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpscHA7CS8qIGxlZnQgYWRkcmVzcyBwb2ludGVyICovCisJCXVuaW9uIHhmc19idHJlZV9rZXkJKnJrcDsJLyogcmlnaHQgYnRyZWUga2V5ICovCisJCXVuaW9uIHhmc19idHJlZV9wdHIJKnJwcDsJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCisKKwkJbGtwID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgc3JjX2luZGV4LCBsZWZ0KTsKKwkJbHBwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgc3JjX2luZGV4LCBsZWZ0KTsKKwkJcmtwID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMSwgcmlnaHQpOworCQlycHAgPSB4ZnNfYnRyZWVfcHRyX2FkZHIoY3VyLCAxLCByaWdodCk7CisKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBzcmNfaW5kZXg7IGkgPCBycmVjczsgaSsrKSB7CisJCQllcnJvciA9IHhmc19idHJlZV9jaGVja19wdHIoY3VyLCBscHAsIGksIGxldmVsKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJfQorI2VuZGlmCisKKwkJeGZzX2J0cmVlX2NvcHlfa2V5cyhjdXIsIHJrcCwgbGtwLCBycmVjcyk7CisJCXhmc19idHJlZV9jb3B5X3B0cnMoY3VyLCBycHAsIGxwcCwgcnJlY3MpOworCisJCXhmc19idHJlZV9sb2dfa2V5cyhjdXIsIHJicCwgMSwgcnJlY3MpOworCQl4ZnNfYnRyZWVfbG9nX3B0cnMoY3VyLCByYnAsIDEsIHJyZWNzKTsKKworCQkvKiBHcmFiIHRoZSBrZXlzIHRvIHRoZSBlbnRyaWVzIG1vdmVkIHRvIHRoZSByaWdodCBibG9jayAqLworCQl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwga2V5LCBya3AsIDEpOworCX0gZWxzZSB7CisJCS8qIEl0J3MgYSBsZWFmLiAgTW92ZSByZWNvcmRzLiAgKi8KKwkJdW5pb24geGZzX2J0cmVlX3JlYwkqbHJwOwkvKiBsZWZ0IHJlY29yZCBwb2ludGVyICovCisJCXVuaW9uIHhmc19idHJlZV9yZWMJKnJycDsJLyogcmlnaHQgcmVjb3JkIHBvaW50ZXIgKi8KKworCQlscnAgPSB4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCBzcmNfaW5kZXgsIGxlZnQpOworCQlycnAgPSB4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCAxLCByaWdodCk7CisKKwkJeGZzX2J0cmVlX2NvcHlfcmVjcyhjdXIsIHJycCwgbHJwLCBycmVjcyk7CisJCXhmc19idHJlZV9sb2dfcmVjcyhjdXIsIHJicCwgMSwgcnJlY3MpOworCisJCWN1ci0+YmNfb3BzLT5pbml0X2tleV9mcm9tX3JlYyhrZXksCisJCQl4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCAxLCByaWdodCkpOworCX0KKworCisJLyoKKwkgKiBGaW5kIHRoZSBsZWZ0IGJsb2NrIG51bWJlciBieSBsb29raW5nIGluIHRoZSBidWZmZXIuCisJICogQWRqdXN0IG51bXJlY3MsIHNpYmxpbmcgcG9pbnRlcnMuCisJICovCisJeGZzX2J0cmVlX2dldF9zaWJsaW5nKGN1ciwgbGVmdCwgJnJycHRyLCBYRlNfQkJfUklHSFRTSUIpOworCXhmc19idHJlZV9zZXRfc2libGluZyhjdXIsIHJpZ2h0LCAmcnJwdHIsIFhGU19CQl9SSUdIVFNJQik7CisJeGZzX2J0cmVlX3NldF9zaWJsaW5nKGN1ciwgcmlnaHQsICZscHRyLCBYRlNfQkJfTEVGVFNJQik7CisJeGZzX2J0cmVlX3NldF9zaWJsaW5nKGN1ciwgbGVmdCwgJnJwdHIsIFhGU19CQl9SSUdIVFNJQik7CisKKwlscmVjcyAtPSBycmVjczsKKwl4ZnNfYnRyZWVfc2V0X251bXJlY3MobGVmdCwgbHJlY3MpOworCXhmc19idHJlZV9zZXRfbnVtcmVjcyhyaWdodCwgeGZzX2J0cmVlX2dldF9udW1yZWNzKHJpZ2h0KSArIHJyZWNzKTsKKworCXhmc19idHJlZV9sb2dfYmxvY2soY3VyLCByYnAsIFhGU19CQl9BTExfQklUUyk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOworCisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgYmxvY2sgdG8gdGhlIG5ldyBibG9jaydzIHJpZ2h0LCBtYWtlIHRoYXQgYmxvY2sKKwkgKiBwb2ludCBiYWNrIHRvIHJpZ2h0IGluc3RlYWQgb2YgdG8gbGVmdC4KKwkgKi8KKwlpZiAoIXhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZycnB0cikpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZfYmxvY2soY3VyLCAmcnJwdHIsIGxldmVsLAorCQkJCQkJCTAsICZycmJsb2NrLCAmcnJicCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCQl4ZnNfYnRyZWVfc2V0X3NpYmxpbmcoY3VyLCBycmJsb2NrLCAmcnB0ciwgWEZTX0JCX0xFRlRTSUIpOworCQl4ZnNfYnRyZWVfbG9nX2Jsb2NrKGN1ciwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgaXMgcmVhbGx5IGluIHRoZSByaWdodCBibG9jaywgbW92ZSBpdCB0aGVyZS4KKwkgKiBJZiBpdCdzIGp1c3QgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBlbnRyeSBpbiBsZWZ0LCB0aGVuIHdlJ2xsCisJICogaW5zZXJ0IHRoZXJlLCBzbyBkb24ndCBjaGFuZ2UgYW55dGhpbmcgaW4gdGhhdCBjYXNlLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gbHJlY3MgKyAxKSB7CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgcmJwKTsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBscmVjczsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHdlJ2xsIG5lZWQgYW5vdGhlciBjdXJzb3Igd2hpY2ggcmVmZXJzCisJICogdGhlIHJpZ2h0IGJsb2NrLCBubyBtYXR0ZXIgd2hlcmUgdGhpcyBjdXJzb3Igd2FzLgorCSAqLworCWlmIChsZXZlbCArIDEgPCBjdXItPmJjX25sZXZlbHMpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsIGN1cnApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJKCpjdXJwKS0+YmNfcHRyc1tsZXZlbCArIDFdKys7CisJfQorCSpwdHJwID0gcnB0cjsKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK291dDA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IDA7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDb3B5IHRoZSBvbGQgaW5vZGUgcm9vdCBjb250ZW50cyBpbnRvIGEgcmVhbCBibG9jayBhbmQgbWFrZSB0aGUKKyAqIGJyb290IHBvaW50IHRvIGl0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX25ld19pcm9vdCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKmxvZ2ZsYWdzLAkvKiBsb2dnaW5nIGZsYWdzIGZvciBpbm9kZSAqLworCWludAkJCSpzdGF0KQkJLyogcmV0dXJuIHN0YXR1cyAtIDAgZmFpbCAqLworeworCXN0cnVjdCB4ZnNfYnVmCQkqY2JwOwkJLyogYnVmZmVyIGZvciBjYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJCS8qIGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqY2Jsb2NrOwkvKiBjaGlsZCBidHJlZSBibG9jayAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJKmNrcDsJCS8qIGNoaWxkIGtleSBwb2ludGVyICovCisJdW5pb24geGZzX2J0cmVlX3B0cgkqY3BwOwkJLyogY2hpbGQgcHRyIHBvaW50ZXIgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprcDsJCS8qIHBvaW50ZXIgdG8gYnRyZWUga2V5ICovCisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHA7CQkvKiBwb2ludGVyIHRvIGJsb2NrIGFkZHIgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCW5wdHI7CQkvKiBuZXcgYmxvY2sgYWRkciAqLworCWludAkJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisjaWZkZWYgREVCVUcKKwlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCisjZW5kaWYKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBuZXdyb290KTsKKworCUFTU0VSVChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpOworCisJbGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxOworCisJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2lyb290KGN1cik7CisJcHAgPSB4ZnNfYnRyZWVfcHRyX2FkZHIoY3VyLCAxLCBibG9jayk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrLiBJZiB3ZSBjYW4ndCBkbyBpdCwgd2UncmUgdG9hc3QuIEdpdmUgdXAuICovCisJZXJyb3IgPSBjdXItPmJjX29wcy0+YWxsb2NfYmxvY2soY3VyLCBwcCwgJm5wdHIsIDEsIHN0YXQpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisJaWYgKCpzdGF0ID09IDApIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBhbGxvYyk7CisKKwkvKiBDb3B5IHRoZSByb290IGludG8gYSByZWFsIGJsb2NrLiAqLworCWVycm9yID0geGZzX2J0cmVlX2dldF9idWZfYmxvY2soY3VyLCAmbnB0ciwgMCwgJmNibG9jaywgJmNicCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKworCW1lbWNweShjYmxvY2ssIGJsb2NrLCB4ZnNfYnRyZWVfYmxvY2tfbGVuKGN1cikpOworCisJYmUxNl9hZGRfY3B1KCZibG9jay0+YmJfbGV2ZWwsIDEpOworCXhmc19idHJlZV9zZXRfbnVtcmVjcyhibG9jaywgMSk7CisJY3VyLT5iY19ubGV2ZWxzKys7CisJY3VyLT5iY19wdHJzW2xldmVsICsgMV0gPSAxOworCisJa3AgPSB4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCBibG9jayk7CisJY2twID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMSwgY2Jsb2NrKTsKKwl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwgY2twLCBrcCwgeGZzX2J0cmVlX2dldF9udW1yZWNzKGNibG9jaykpOworCisJY3BwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgMSwgY2Jsb2NrKTsKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpOyBpKyspIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfcHRyKGN1ciwgcHAsIGksIGxldmVsKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJfQorI2VuZGlmCisJeGZzX2J0cmVlX2NvcHlfcHRycyhjdXIsIGNwcCwgcHAsIHhmc19idHJlZV9nZXRfbnVtcmVjcyhjYmxvY2spKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfcHRyKGN1ciwgJm5wdHIsIDAsIGxldmVsKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworI2VuZGlmCisJeGZzX2J0cmVlX2NvcHlfcHRycyhjdXIsIHBwLCAmbnB0ciwgMSk7CisKKwl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCSAgMSAtIHhmc19idHJlZV9nZXRfbnVtcmVjcyhjYmxvY2spLAorCQkJICBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCisJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBjYnApOworCisJLyoKKwkgKiBEbyBhbGwgdGhpcyBsb2dnaW5nIGF0IHRoZSBlbmQgc28gdGhhdAorCSAqIHRoZSByb290IGlzIGF0IHRoZSByaWdodCBsZXZlbC4KKwkgKi8KKwl4ZnNfYnRyZWVfbG9nX2Jsb2NrKGN1ciwgY2JwLCBYRlNfQkJfQUxMX0JJVFMpOworCXhmc19idHJlZV9sb2dfa2V5cyhjdXIsIGNicCwgMSwgYmUxNl90b19jcHUoY2Jsb2NrLT5iYl9udW1yZWNzKSk7CisJeGZzX2J0cmVlX2xvZ19wdHJzKGN1ciwgY2JwLCAxLCBiZTE2X3RvX2NwdShjYmxvY2stPmJiX251bXJlY3MpKTsKKworCSpsb2dmbGFncyB8PQorCQlYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJKnN0YXQgPSAxOworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJcmV0dXJuIDA7CitlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaywgZmlsbCBpdCBpbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX25ld19yb290KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJLyogb25lIGhhbGYgb2YgdGhlIG9sZCByb290IGJsb2NrICovCisJc3RydWN0IHhmc19idWYJCSpicDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJc3RydWN0IHhmc19idWYJCSpsYnA7CS8qIGxlZnQgYnVmZmVyIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idWYJCSpuYnA7CS8qIG5ldyAocm9vdCkgYnVmZmVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqbmV3OwkvKiBuZXcgKHJvb3QpIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbnB0cjsJLyogbmV3IHZhbHVlIGZvciBrZXkgaW5kZXgsIDEgb3IgMiAqLworCXN0cnVjdCB4ZnNfYnVmCQkqcmJwOwkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKnJpZ2h0OwkvKiByaWdodCBidHJlZSBibG9jayAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJcnB0cjsKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCWxwdHI7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgbmV3cm9vdCk7CisKKwkvKiBpbml0aWFsaXNlIG91ciBzdGFydCBwb2ludCBmcm9tIHRoZSBjdXJzb3IgKi8KKwljdXItPmJjX29wcy0+aW5pdF9wdHJfZnJvbV9jdXIoY3VyLCAmcnB0cik7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrLiBJZiB3ZSBjYW4ndCBkbyBpdCwgd2UncmUgdG9hc3QuIEdpdmUgdXAuICovCisJZXJyb3IgPSBjdXItPmJjX29wcy0+YWxsb2NfYmxvY2soY3VyLCAmcnB0ciwgJmxwdHIsIDEsIHN0YXQpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisJaWYgKCpzdGF0ID09IDApCisJCWdvdG8gb3V0MDsKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgYWxsb2MpOworCisJLyogU2V0IHVwIHRoZSBuZXcgYmxvY2suICovCisJZXJyb3IgPSB4ZnNfYnRyZWVfZ2V0X2J1Zl9ibG9jayhjdXIsICZscHRyLCAwLCAmbmV3LCAmbmJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCisJLyogU2V0IHRoZSByb290IGluIHRoZSBob2xkaW5nIHN0cnVjdHVyZSAgaW5jcmVhc2luZyB0aGUgbGV2ZWwgYnkgMS4gKi8KKwljdXItPmJjX29wcy0+c2V0X3Jvb3QoY3VyLCAmbHB0ciwgMSk7CisKKwkvKgorCSAqIEF0IHRoZSBwcmV2aW91cyByb290IGxldmVsIHRoZXJlIGFyZSBub3cgdHdvIGJsb2NrczogdGhlIG9sZCByb290LAorCSAqIGFuZCB0aGUgbmV3IGJsb2NrIGdlbmVyYXRlZCB3aGVuIGl0IHdhcyBzcGxpdC4gIFdlIGRvbid0IGtub3cgd2hpY2gKKwkgKiBvbmUgdGhlIGN1cnNvciBpcyBwb2ludGluZyBhdCwgc28gd2Ugc2V0IHVwIHZhcmlhYmxlcyAibGVmdCIgYW5kCisJICogInJpZ2h0IiBmb3IgZWFjaCBjYXNlLgorCSAqLworCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGN1ci0+YmNfbmxldmVscyAtIDEsICZicCk7CisKKyNpZmRlZiBERUJVRworCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGN1ci0+YmNfbmxldmVscyAtIDEsIGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoY3VyLCBibG9jaywgJnJwdHIsIFhGU19CQl9SSUdIVFNJQik7CisJaWYgKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmcnB0cikpIHsKKwkJLyogT3VyIGJsb2NrIGlzIGxlZnQsIHBpY2sgdXAgdGhlIHJpZ2h0IGJsb2NrLiAqLworCQlsYnAgPSBicDsKKwkJeGZzX2J0cmVlX2J1Zl90b19wdHIoY3VyLCBsYnAsICZscHRyKTsKKwkJbGVmdCA9IGJsb2NrOworCQllcnJvciA9IHhmc19idHJlZV9yZWFkX2J1Zl9ibG9jayhjdXIsICZycHRyLAorCQkJCQljdXItPmJjX25sZXZlbHMgLSAxLCAwLCAmcmlnaHQsICZyYnApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJYnAgPSByYnA7CisJCW5wdHIgPSAxOworCX0gZWxzZSB7CisJCS8qIE91ciBibG9jayBpcyByaWdodCwgcGljayB1cCB0aGUgbGVmdCBibG9jay4gKi8KKwkJcmJwID0gYnA7CisJCXhmc19idHJlZV9idWZfdG9fcHRyKGN1ciwgcmJwLCAmcnB0cik7CisJCXJpZ2h0ID0gYmxvY2s7CisJCXhmc19idHJlZV9nZXRfc2libGluZyhjdXIsIHJpZ2h0LCAmbHB0ciwgWEZTX0JCX0xFRlRTSUIpOworCQllcnJvciA9IHhmc19idHJlZV9yZWFkX2J1Zl9ibG9jayhjdXIsICZscHRyLAorCQkJCQljdXItPmJjX25sZXZlbHMgLSAxLCAwLCAmbGVmdCwgJmxicCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCQlicCA9IGxicDsKKwkJbnB0ciA9IDI7CisJfQorCS8qIEZpbGwgaW4gdGhlIG5ldyBibG9jaydzIGJ0cmVlIGhlYWRlciBhbmQgbG9nIGl0LiAqLworCXhmc19idHJlZV9pbml0X2Jsb2NrKGN1ciwgY3VyLT5iY19ubGV2ZWxzLCAyLCBuZXcpOworCXhmc19idHJlZV9sb2dfYmxvY2soY3VyLCBuYnAsIFhGU19CQl9BTExfQklUUyk7CisJQVNTRVJUKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmbHB0cikgJiYKKwkJCSF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmcnB0cikpOworCisJLyogRmlsbCBpbiB0aGUga2V5IGRhdGEgaW4gdGhlIG5ldyByb290LiAqLworCWlmICh4ZnNfYnRyZWVfZ2V0X2xldmVsKGxlZnQpID4gMCkgeworCQl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwKKwkJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCBuZXcpLAorCQkJCXhmc19idHJlZV9rZXlfYWRkcihjdXIsIDEsIGxlZnQpLCAxKTsKKwkJeGZzX2J0cmVlX2NvcHlfa2V5cyhjdXIsCisJCQkJeGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMiwgbmV3KSwKKwkJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCByaWdodCksIDEpOworCX0gZWxzZSB7CisJCWN1ci0+YmNfb3BzLT5pbml0X2tleV9mcm9tX3JlYygKKwkJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCBuZXcpLAorCQkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIDEsIGxlZnQpKTsKKwkJY3VyLT5iY19vcHMtPmluaXRfa2V5X2Zyb21fcmVjKAorCQkJCXhmc19idHJlZV9rZXlfYWRkcihjdXIsIDIsIG5ldyksCisJCQkJeGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgMSwgcmlnaHQpKTsKKwl9CisJeGZzX2J0cmVlX2xvZ19rZXlzKGN1ciwgbmJwLCAxLCAyKTsKKworCS8qIEZpbGwgaW4gdGhlIHBvaW50ZXIgZGF0YSBpbiB0aGUgbmV3IHJvb3QuICovCisJeGZzX2J0cmVlX2NvcHlfcHRycyhjdXIsCisJCXhmc19idHJlZV9wdHJfYWRkcihjdXIsIDEsIG5ldyksICZscHRyLCAxKTsKKwl4ZnNfYnRyZWVfY29weV9wdHJzKGN1ciwKKwkJeGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgMiwgbmV3KSwgJnJwdHIsIDEpOworCXhmc19idHJlZV9sb2dfcHRycyhjdXIsIG5icCwgMSwgMik7CisKKwkvKiBGaXggdXAgdGhlIGN1cnNvci4gKi8KKwl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgY3VyLT5iY19ubGV2ZWxzLCBuYnApOworCWN1ci0+YmNfcHRyc1tjdXItPmJjX25sZXZlbHNdID0gbnB0cjsKKwljdXItPmJjX25sZXZlbHMrKzsKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7CitvdXQwOgorCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJKnN0YXQgPSAwOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfbWFrZV9ibG9ja191bmZ1bGwoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGJ0cmVlIGxldmVsICovCisJaW50CQkJbnVtcmVjcywvKiAjIG9mIHJlY3MgaW4gYmxvY2sgKi8KKwlpbnQJCQkqb2luZGV4LC8qIG9sZCB0cmVlIGluZGV4ICovCisJaW50CQkJKmluZGV4LAkvKiBuZXcgdHJlZSBpbmRleCAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJKm5wdHIsCS8qIG5ldyBidHJlZSBwdHIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqKm5jdXIsCS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpucmVjLAkvKiBuZXcgcmVjb3JkICovCisJaW50CQkJKnN0YXQpCit7CisJdW5pb24geGZzX2J0cmVlX2tleQlrZXk7CS8qIG5ldyBidHJlZSBrZXkgdmFsdWUgKi8KKwlpbnQJCQllcnJvciA9IDA7CisKKwlpZiAoKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERSkgJiYKKwkgICAgbGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCSAgICAJc3RydWN0IHhmc19pbm9kZSAqaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKKworCQlpZiAobnVtcmVjcyA8IGN1ci0+YmNfb3BzLT5nZXRfZG1heHJlY3MoY3VyLCBsZXZlbCkpIHsKKwkJCS8qIEEgcm9vdCBibG9jayB0aGF0IGNhbiBiZSBtYWRlIGJpZ2dlci4gKi8KKworCQkJeGZzX2lyb290X3JlYWxsb2MoaXAsIDEsIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJCX0gZWxzZSB7CisJCQkvKiBBIHJvb3QgYmxvY2sgdGhhdCBuZWVkcyByZXBsYWNpbmcgKi8KKwkJCWludAlsb2dmbGFncyA9IDA7CisKKwkJCWVycm9yID0geGZzX2J0cmVlX25ld19pcm9vdChjdXIsICZsb2dmbGFncywgc3RhdCk7CisJCQlpZiAoZXJyb3IgfHwgKnN0YXQgPT0gMCkKKwkJCQlyZXR1cm4gZXJyb3I7CisKKwkJCXhmc190cmFuc19sb2dfaW5vZGUoY3VyLT5iY190cCwgaXAsIGxvZ2ZsYWdzKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qIEZpcnN0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLiAqLworCWVycm9yID0geGZzX2J0cmVlX3JzaGlmdChjdXIsIGxldmVsLCBzdGF0KTsKKwlpZiAoZXJyb3IgfHwgKnN0YXQpCisJCXJldHVybiBlcnJvcjsKKworCS8qIE5leHQsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgbGVmdCBuZWlnaGJvci4gKi8KKwllcnJvciA9IHhmc19idHJlZV9sc2hpZnQoY3VyLCBsZXZlbCwgc3RhdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoKnN0YXQpIHsKKwkJKm9pbmRleCA9ICppbmRleCA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTmV4dCwgdHJ5IHNwbGl0dGluZyB0aGUgY3VycmVudCBibG9jayBpbiBoYWxmLgorCSAqCisJICogSWYgdGhpcyB3b3JrcyB3ZSBoYXZlIHRvIHJlLXNldCBvdXIgdmFyaWFibGVzIGJlY2F1c2Ugd2UKKwkgKiBjb3VsZCBiZSBpbiBhIGRpZmZlcmVudCBibG9jayBub3cuCisJICovCisJZXJyb3IgPSB4ZnNfYnRyZWVfc3BsaXQoY3VyLCBsZXZlbCwgbnB0ciwgJmtleSwgbmN1ciwgc3RhdCk7CisJaWYgKGVycm9yIHx8ICpzdGF0ID09IDApCisJCXJldHVybiBlcnJvcjsKKworCisJKmluZGV4ID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwljdXItPmJjX29wcy0+aW5pdF9yZWNfZnJvbV9rZXkoJmtleSwgbnJlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnNlcnQgb25lIHJlY29yZC9sZXZlbC4gIFJldHVybiBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyCisgKiBhbGxvd2luZyB0aGUgbmV4dCBsZXZlbCB1cCB0byBwcm9jZWVkIGlmIG5lY2Vzc2FyeS4KKyAqLworU1RBVElDIGludAoreGZzX2J0cmVlX2luc3JlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gaW5zZXJ0IHJlY29yZCBhdCAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJKnB0cnAsCS8qIGkvbzogYmxvY2sgbnVtYmVyIGluc2VydGVkICovCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjcCwJLyogaS9vOiByZWNvcmQgZGF0YSBpbnNlcnRlZCAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSoqY3VycCwJLyogb3V0cHV0OiBuZXcgY3Vyc29yIHJlcGxhY2luZyBjdXIgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idWYJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OwkvKiBidHJlZSBrZXkgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCW5wdHI7CS8qIG5ldyBibG9jayBwdHIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqbmN1cjsJLyogbmV3IGJ0cmVlIGN1cnNvciAqLworCXVuaW9uIHhmc19idHJlZV9yZWMJbnJlYzsJLyogbmV3IHJlY29yZCBjb3VudCAqLworCWludAkJCW9wdHI7CS8qIG9sZCBrZXkvcmVjb3JkIGluZGV4ICovCisJaW50CQkJcHRyOwkvKiBrZXkvcmVjb3JkIGluZGV4ICovCisJaW50CQkJbnVtcmVjczsvKiBudW1iZXIgb2YgcmVjb3JkcyAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBERUJVRworCWludAkJCWk7CisjZW5kaWYKKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9UUkFDRV9BUkdJUFIoY3VyLCBsZXZlbCwgKnB0cnAsIHJlY3ApOworCisJbmN1ciA9IE5VTEw7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWwgcm9vdCBwb2ludGVyLCBhbmQgd2UndmUgbWFkZSBpdCB0byB0aGUKKwkgKiByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrIGFuZCB3ZSdyZSBkb25lLgorCSAqLworCWlmICghKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERSkgJiYKKwkgICAgKGxldmVsID49IGN1ci0+YmNfbmxldmVscykpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfbmV3X3Jvb3QoY3VyLCBzdGF0KTsKKwkJeGZzX2J0cmVlX3NldF9wdHJfbnVsbChjdXIsIHB0cnApOworCisJCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBJZiB3ZSdyZSBvZmYgdGhlIGxlZnQgZWRnZSwgcmV0dXJuIGZhaWx1cmUuICovCisJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwlpZiAocHRyID09IDApIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNYWtlIGEga2V5IG91dCBvZiB0aGUgcmVjb3JkIGRhdGEgdG8gYmUgaW5zZXJ0ZWQsIGFuZCBzYXZlIGl0LiAqLworCWN1ci0+YmNfb3BzLT5pbml0X2tleV9mcm9tX3JlYygma2V5LCByZWNwKTsKKworCW9wdHIgPSBwdHI7CisKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgaW5zcmVjKTsKKworCS8qIEdldCBwb2ludGVycyB0byB0aGUgYnRyZWUgYnVmZmVyIGFuZCBibG9jay4gKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwludW1yZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGJsb2NrKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCisJLyogQ2hlY2sgdGhhdCB0aGUgbmV3IGVudHJ5IGlzIGJlaW5nIGluc2VydGVkIGluIHRoZSByaWdodCBwbGFjZS4gKi8KKwlpZiAocHRyIDw9IG51bXJlY3MpIHsKKwkJaWYgKGxldmVsID09IDApIHsKKwkJCUFTU0VSVChjdXItPmJjX29wcy0+cmVjc19pbm9yZGVyKGN1ciwgcmVjcCwKKwkJCQl4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCBwdHIsIGJsb2NrKSkpOworCQl9IGVsc2UgeworCQkJQVNTRVJUKGN1ci0+YmNfb3BzLT5rZXlzX2lub3JkZXIoY3VyLCAma2V5LAorCQkJCXhmc19idHJlZV9rZXlfYWRkcihjdXIsIHB0ciwgYmxvY2spKSk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogSWYgdGhlIGJsb2NrIGlzIGZ1bGwsIHdlIGNhbid0IGluc2VydCB0aGUgbmV3IGVudHJ5IHVudGlsIHdlCisJICogbWFrZSB0aGUgYmxvY2sgdW4tZnVsbC4KKwkgKi8KKwl4ZnNfYnRyZWVfc2V0X3B0cl9udWxsKGN1ciwgJm5wdHIpOworCWlmIChudW1yZWNzID09IGN1ci0+YmNfb3BzLT5nZXRfbWF4cmVjcyhjdXIsIGxldmVsKSkgeworCQllcnJvciA9IHhmc19idHJlZV9tYWtlX2Jsb2NrX3VuZnVsbChjdXIsIGxldmVsLCBudW1yZWNzLAorCQkJCQkmb3B0ciwgJnB0ciwgJm5wdHIsICZuY3VyLCAmbnJlYywgc3RhdCk7CisJCWlmIChlcnJvciB8fCAqc3RhdCA9PSAwKQorCQkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBUaGUgY3VycmVudCBibG9jayBtYXkgaGF2ZSBjaGFuZ2VkIGlmIHRoZSBibG9jayB3YXMKKwkgKiBwcmV2aW91c2x5IGZ1bGwgYW5kIHdlIGhhdmUganVzdCBtYWRlIHNwYWNlIGluIGl0LgorCSAqLworCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworCW51bXJlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spOworCisjaWZkZWYgREVCVUcKKwllcnJvciA9IHhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGVyZSdzIHJvb20gZm9yIG91ciBuZXcgZW50cnkgaW4gdGhlIGJsb2NrCisJICogd2UncmUgcG9pbnRpbmcgYXQuCisJICovCisJWEZTX0JUUkVFX1NUQVRTX0FERChjdXIsIG1vdmVzLCBudW1yZWNzIC0gcHRyICsgMSk7CisKKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qIEl0J3MgYSBub25sZWFmLiBtYWtlIGEgaG9sZSBpbiB0aGUga2V5cyBhbmQgcHRycyAqLworCQl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprcDsKKwkJdW5pb24geGZzX2J0cmVlX3B0cgkqcHA7CisKKwkJa3AgPSB4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCBwdHIsIGJsb2NrKTsKKwkJcHAgPSB4ZnNfYnRyZWVfcHRyX2FkZHIoY3VyLCBwdHIsIGJsb2NrKTsKKworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IG51bXJlY3MgLSBwdHI7IGkgPj0gMDsgaS0tKSB7CisJCQllcnJvciA9IHhmc19idHJlZV9jaGVja19wdHIoY3VyLCBwcCwgaSwgbGV2ZWwpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisKKwkJeGZzX2J0cmVlX3NoaWZ0X2tleXMoY3VyLCBrcCwgMSwgbnVtcmVjcyAtIHB0ciArIDEpOworCQl4ZnNfYnRyZWVfc2hpZnRfcHRycyhjdXIsIHBwLCAxLCBudW1yZWNzIC0gcHRyICsgMSk7CisKKyNpZmRlZiBERUJVRworCQllcnJvciA9IHhmc19idHJlZV9jaGVja19wdHIoY3VyLCBwdHJwLCAwLCBsZXZlbCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworI2VuZGlmCisKKwkJLyogTm93IHB1dCB0aGUgbmV3IGRhdGEgaW4sIGJ1bXAgbnVtcmVjcyBhbmQgbG9nIGl0LiAqLworCQl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwga3AsICZrZXksIDEpOworCQl4ZnNfYnRyZWVfY29weV9wdHJzKGN1ciwgcHAsIHB0cnAsIDEpOworCQludW1yZWNzKys7CisJCXhmc19idHJlZV9zZXRfbnVtcmVjcyhibG9jaywgbnVtcmVjcyk7CisJCXhmc19idHJlZV9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCQl4ZnNfYnRyZWVfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKyNpZmRlZiBERUJVRworCQlpZiAocHRyIDwgbnVtcmVjcykgeworCQkJQVNTRVJUKGN1ci0+YmNfb3BzLT5rZXlzX2lub3JkZXIoY3VyLCBrcCwKKwkJCQl4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCBwdHIgKyAxLCBibG9jaykpKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogSXQncyBhIGxlYWYuIG1ha2UgYSBob2xlIGluIHRoZSByZWNvcmRzICovCisJCXVuaW9uIHhmc19idHJlZV9yZWMgICAgICAgICAgICAgKnJwOworCisJCXJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgcHRyLCBibG9jayk7CisKKwkJeGZzX2J0cmVlX3NoaWZ0X3JlY3MoY3VyLCBycCwgMSwgbnVtcmVjcyAtIHB0ciArIDEpOworCisJCS8qIE5vdyBwdXQgdGhlIG5ldyBkYXRhIGluLCBidW1wIG51bXJlY3MgYW5kIGxvZyBpdC4gKi8KKwkJeGZzX2J0cmVlX2NvcHlfcmVjcyhjdXIsIHJwLCByZWNwLCAxKTsKKwkJeGZzX2J0cmVlX3NldF9udW1yZWNzKGJsb2NrLCArK251bXJlY3MpOworCQl4ZnNfYnRyZWVfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKyNpZmRlZiBERUJVRworCQlpZiAocHRyIDwgbnVtcmVjcykgeworCQkJQVNTRVJUKGN1ci0+YmNfb3BzLT5yZWNzX2lub3JkZXIoY3VyLCBycCwKKwkJCQl4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCBwdHIgKyAxLCBibG9jaykpKTsKKwkJfQorI2VuZGlmCisJfQorCisJLyogTG9nIHRoZSBuZXcgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGJ0cmVlIGhlYWRlci4gKi8KKwl4ZnNfYnRyZWVfbG9nX2Jsb2NrKGN1ciwgYnAsIFhGU19CQl9OVU1SRUNTKTsKKworCS8qIElmIHdlIGluc2VydGVkIGF0IHRoZSBzdGFydCBvZiBhIGJsb2NrLCB1cGRhdGUgdGhlIHBhcmVudHMnIGtleXMuICovCisJaWYgKG9wdHIgPT0gMSkgeworCQllcnJvciA9IHhmc19idHJlZV91cGRrZXkoY3VyLCAma2V5LCBsZXZlbCArIDEpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSB0cmFja2luZyB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIHRyZWUgYW5kCisJICogd2UgYXJlIGF0IHRoZSBmYXIgcmlnaHQgZWRnZSBvZiB0aGUgdHJlZSwgdXBkYXRlIGl0LgorCSAqLworCWlmICh4ZnNfYnRyZWVfaXNfbGFzdHJlYyhjdXIsIGJsb2NrLCBsZXZlbCkpIHsKKwkJY3VyLT5iY19vcHMtPnVwZGF0ZV9sYXN0cmVjKGN1ciwgYmxvY2ssIHJlY3AsCisJCQkJCSAgICBwdHIsIExBU1RSRUNfSU5TUkVDKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgbmV3IGJsb2NrIG51bWJlciwgaWYgYW55LgorCSAqIElmIHRoZXJlIGlzIG9uZSwgZ2l2ZSBiYWNrIGEgcmVjb3JkIHZhbHVlIGFuZCBhIGN1cnNvciB0b28uCisJICovCisJKnB0cnAgPSBucHRyOworCWlmICgheGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJm5wdHIpKSB7CisJCSpyZWNwID0gbnJlYzsKKwkJKmN1cnAgPSBuY3VyOworCX0KKworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworCitlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSW5zZXJ0IHRoZSByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgorICoKKyAqIEEgbXVsdGktbGV2ZWwgc3BsaXQgb2YgdGhlIHRyZWUgb24gaW5zZXJ0IHdpbGwgaW52YWxpZGF0ZSB0aGUgb3JpZ2luYWwKKyAqIGN1cnNvci4gIEFsbCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBjdXJzb3IgaXMKKyAqIG5vIGxvbmdlciB2YWxpZCBhbmQgcmV2YWxpZGF0ZSBpdC4KKyAqLworaW50Cit4ZnNfYnRyZWVfaW5zZXJ0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJKnN0YXQpCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIHJlc3VsdCB2YWx1ZSwgMCBmb3IgZmFpbHVyZSAqLworCWludAkJCWxldmVsOwkvKiBjdXJyZW50IGxldmVsIG51bWJlciBpbiBidHJlZSAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJbnB0cjsJLyogbmV3IGJsb2NrIG51bWJlciAoc3BsaXQgcmVzdWx0KSAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpuY3VyOwkvKiBuZXcgY3Vyc29yIChzcGxpdCByZXN1bHQpICovCisJc3RydWN0IHhmc19idHJlZV9jdXIJKnBjdXI7CS8qIHByZXZpb3VzIGxldmVsJ3MgY3Vyc29yICovCisJdW5pb24geGZzX2J0cmVlX3JlYwlyZWM7CS8qIHJlY29yZCB0byBpbnNlcnQgKi8KKworCWxldmVsID0gMDsKKwluY3VyID0gTlVMTDsKKwlwY3VyID0gY3VyOworCisJeGZzX2J0cmVlX3NldF9wdHJfbnVsbChjdXIsICZucHRyKTsKKwljdXItPmJjX29wcy0+aW5pdF9yZWNfZnJvbV9jdXIoY3VyLCAmcmVjKTsKKworCS8qCisJICogTG9vcCBnb2luZyB1cCB0aGUgdHJlZSwgc3RhcnRpbmcgYXQgdGhlIGxlYWYgbGV2ZWwuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdldCBhIHNwbGl0IGJsb2NrLCB0aGF0IG11c3QgbWVhbiB0aGF0CisJICogdGhlIGluc2VydCBpcyBmaW5pc2hlZCB3aXRoIHRoaXMgbGV2ZWwuCisJICovCisJZG8geworCQkvKgorCQkgKiBJbnNlcnQgbnJlYy9ucHRyIGludG8gdGhpcyBsZXZlbCBvZiB0aGUgdHJlZS4KKwkJICogTm90ZSBpZiB3ZSBmYWlsLCBucHRyIHdpbGwgYmUgbnVsbC4KKwkJICovCisJCWVycm9yID0geGZzX2J0cmVlX2luc3JlYyhwY3VyLCBsZXZlbCwgJm5wdHIsICZyZWMsICZuY3VyLCAmaSk7CisJCWlmIChlcnJvcikgeworCQkJaWYgKHBjdXIgIT0gY3VyKQorCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHBjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJbGV2ZWwrKzsKKworCQkvKgorCQkgKiBTZWUgaWYgdGhlIGN1cnNvciB3ZSBqdXN0IHVzZWQgaXMgdHJhc2guCisJCSAqIENhbid0IHRyYXNoIHRoZSBjYWxsZXIncyBjdXJzb3IsIGJ1dCBvdGhlcndpc2Ugd2Ugc2hvdWxkCisJCSAqIGlmIG5jdXIgaXMgYSBuZXcgY3Vyc29yIG9yIHdlJ3JlIGFib3V0IHRvIGJlIGRvbmUuCisJCSAqLworCQlpZiAocGN1ciAhPSBjdXIgJiYKKwkJICAgIChuY3VyIHx8IHhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZucHRyKSkpIHsKKwkJCS8qIFNhdmUgdGhlIHN0YXRlIGZyb20gdGhlIGN1cnNvciBiZWZvcmUgd2UgdHJhc2ggaXQgKi8KKwkJCWlmIChjdXItPmJjX29wcy0+dXBkYXRlX2N1cnNvcikKKwkJCQljdXItPmJjX29wcy0+dXBkYXRlX2N1cnNvcihwY3VyLCBjdXIpOworCQkJY3VyLT5iY19ubGV2ZWxzID0gcGN1ci0+YmNfbmxldmVsczsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHBjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJfQorCQkvKiBJZiB3ZSBnb3QgYSBuZXcgY3Vyc29yLCBzd2l0Y2ggdG8gaXQuICovCisJCWlmIChuY3VyKSB7CisJCQlwY3VyID0gbmN1cjsKKwkJCW5jdXIgPSBOVUxMOworCQl9CisJfSB3aGlsZSAoIXhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZucHRyKSk7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gaTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUcnkgdG8gbWVyZ2UgYSBub24tbGVhZiBibG9jayBiYWNrIGludG8gdGhlIGlub2RlIHJvb3QuCisgKgorICogTm90ZTogdGhlIGtpbGxyb290IG5hbWVzIGNvbWVzIGZyb20gdGhlIGZhY3QgdGhhdCB3ZSdyZSBlZmZlY3RpdmVseQorICoga2lsbGluZyB0aGUgb2xkIHJvb3QgYmxvY2suICBCdXQgYmVjYXVzZSB3ZSBjYW4ndCBqdXN0IGRlbGV0ZSB0aGUKKyAqIGlub2RlIHdlIGhhdmUgdG8gY29weSB0aGUgc2luZ2xlIGJsb2NrIGl0IHdhcyBwb2ludGluZyB0byBpbnRvIHRoZQorICogaW5vZGUuCisgKi8KK2ludAoreGZzX2J0cmVlX2tpbGxfaXJvb3QoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1cikKK3sKKwlpbnQJCQl3aGljaGZvcmsgPSBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcms7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrOworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmNibG9jazsKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprcDsKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpja3A7CisJdW5pb24geGZzX2J0cmVlX3B0cgkqcHA7CisJdW5pb24geGZzX2J0cmVlX3B0cgkqY3BwOworCXN0cnVjdCB4ZnNfYnVmCQkqY2JwOworCWludAkJCWxldmVsOworCWludAkJCWluZGV4OworCWludAkJCW51bXJlY3M7CisjaWZkZWYgREVCVUcKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCXB0cjsKKwlpbnQJCQlpOworI2VuZGlmCisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKworCUFTU0VSVChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpOworCUFTU0VSVChjdXItPmJjX25sZXZlbHMgPiAxKTsKKworCS8qCisJICogRG9uJ3QgZGVhbCB3aXRoIHRoZSByb290IGJsb2NrIG5lZWRzIHRvIGJlIGEgbGVhZiBjYXNlLgorCSAqIFdlJ3JlIGp1c3QgZ29pbmcgdG8gdHVybiB0aGUgdGhpbmcgYmFjayBpbnRvIGV4dGVudHMgYW55d2F5LgorCSAqLworCWxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMTsKKwlpZiAobGV2ZWwgPT0gMSkKKwkJZ290byBvdXQwOworCisJLyoKKwkgKiBHaXZlIHVwIGlmIHRoZSByb290IGhhcyBtdWx0aXBsZSBjaGlsZHJlbi4KKwkgKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfaXJvb3QoY3VyKTsKKwlpZiAoeGZzX2J0cmVlX2dldF9udW1yZWNzKGJsb2NrKSAhPSAxKQorCQlnb3RvIG91dDA7CisKKwljYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwgLSAxLCAmY2JwKTsKKwludW1yZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGNibG9jayk7CisKKwkvKgorCSAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgbmV4dCBsZXZlbCB3aWxsIGZpdC4KKwkgKiBUaGVuIHRoZSBkYXRhIG11c3QgYmUgY29waWVkIHVwIHRvIHRoZSBpbm9kZSwKKwkgKiBpbnN0ZWFkIG9mIGZyZWVpbmcgdGhlIHJvb3QgeW91IGZyZWUgdGhlIG5leHQgbGV2ZWwuCisJICovCisJaWYgKG51bXJlY3MgPiBjdXItPmJjX29wcy0+Z2V0X2RtYXhyZWNzKGN1ciwgbGV2ZWwpKQorCQlnb3RvIG91dDA7CisKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwga2lsbHJvb3QpOworCisjaWZkZWYgREVCVUcKKwl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcoY3VyLCBibG9jaywgJnB0ciwgWEZTX0JCX0xFRlRTSUIpOworCUFTU0VSVCh4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmcHRyKSk7CisJeGZzX2J0cmVlX2dldF9zaWJsaW5nKGN1ciwgYmxvY2ssICZwdHIsIFhGU19CQl9SSUdIVFNJQik7CisJQVNTRVJUKHhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZwdHIpKTsKKyNlbmRpZgorCisJaW5kZXggPSBudW1yZWNzIC0gY3VyLT5iY19vcHMtPmdldF9tYXhyZWNzKGN1ciwgbGV2ZWwpOworCWlmIChpbmRleCkgeworCQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgaW5kZXgsCisJCQkJICBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCQlibG9jayA9IGlmcC0+aWZfYnJvb3Q7CisJfQorCisJYmUxNl9hZGRfY3B1KCZibG9jay0+YmJfbnVtcmVjcywgaW5kZXgpOworCUFTU0VSVChibG9jay0+YmJfbnVtcmVjcyA9PSBjYmxvY2stPmJiX251bXJlY3MpOworCisJa3AgPSB4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCAxLCBibG9jayk7CisJY2twID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMSwgY2Jsb2NrKTsKKwl4ZnNfYnRyZWVfY29weV9rZXlzKGN1ciwga3AsIGNrcCwgbnVtcmVjcyk7CisKKwlwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIDEsIGJsb2NrKTsKKwljcHAgPSB4ZnNfYnRyZWVfcHRyX2FkZHIoY3VyLCAxLCBjYmxvY2spOworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8IG51bXJlY3M7IGkrKykgeworCQlpbnQJCWVycm9yOworCisJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX3B0cihjdXIsIGNwcCwgaSwgbGV2ZWwgLSAxKTsKKwkJaWYgKGVycm9yKSB7CisJCQlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKyNlbmRpZgorCXhmc19idHJlZV9jb3B5X3B0cnMoY3VyLCBwcCwgY3BwLCBudW1yZWNzKTsKKworCWN1ci0+YmNfb3BzLT5mcmVlX2Jsb2NrKGN1ciwgY2JwKTsKKwlYRlNfQlRSRUVfU1RBVFNfSU5DKGN1ciwgZnJlZSk7CisKKwljdXItPmJjX2J1ZnNbbGV2ZWwgLSAxXSA9IE5VTEw7CisJYmUxNl9hZGRfY3B1KCZibG9jay0+YmJfbGV2ZWwsIC0xKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGN1ci0+YmNfdHAsIGlwLAorCQlYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOworCWN1ci0+YmNfbmxldmVscy0tOworb3V0MDoKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYnRyZWVfZGVjX2N1cnNvcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQoreworCWludAkJCWVycm9yOworCWludAkJCWk7CisKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNpbmdsZSBsZXZlbCBvZiB0aGUgYnRyZWUgcmVjb3JkIGRlbGV0aW9uIHJvdXRpbmUuCisgKiBEZWxldGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyL2xldmVsLgorICogUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSBpdHMgYmxvY2sgdGhlbiByZWJhbGFuY2UgdGhlIHRyZWUuCisgKiBSZXR1cm4gMCBmb3IgZXJyb3IsIDEgZm9yIGRvbmUsIDIgdG8gZ28gb24gdG8gdGhlIG5leHQgbGV2ZWwuCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfZGVscmVjKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJCS8qIGxldmVsIHJlbW92aW5nIHJlY29yZCBmcm9tICovCisJaW50CQkJKnN0YXQpCQkvKiBmYWlsL2RvbmUvZ28tb24gKi8KK3sKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJCS8qIGJ0cmVlIGJsb2NrICovCisJdW5pb24geGZzX2J0cmVlX3B0cgljcHRyOwkJLyogY3VycmVudCBibG9jayBwdHIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OwkJLyogc3RvcmFnZSBmb3Iga2V5cCAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJKmtleXAgPSAma2V5OwkvKiBwYXNzZWQgdG8gdGhlIG5leHQgbGV2ZWwgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCWxwdHI7CQkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgcHRyICovCisJc3RydWN0IHhmc19idWYJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlscmVjcyA9IDA7CS8qIGxlZnQgcmVjb3JkIGNvdW50ICovCisJaW50CQkJcHRyOwkJLyoga2V5L3JlY29yZCBpbmRleCAqLworCXVuaW9uIHhmc19idHJlZV9wdHIJcnB0cjsJCS8qIHJpZ2h0IHNpYmxpbmcgYmxvY2sgcHRyICovCisJc3RydWN0IHhmc19idWYJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpycmJsb2NrOwkvKiByaWdodC1yaWdodCBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnVmCQkqcnJicDsJCS8qIHJpZ2h0LXJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJaW50CQkJcnJlY3MgPSAwOwkvKiByaWdodCByZWNvcmQgY291bnQgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqdGN1cjsJCS8qIHRlbXBvcmFyeSBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQludW1yZWNzOwkvKiB0ZW1wb3JhcnkgbnVtcmVjIGNvdW50ICovCisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKwlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKKworCXRjdXIgPSBOVUxMOworCisJLyogR2V0IHRoZSBpbmRleCBvZiB0aGUgZW50cnkgYmVpbmcgZGVsZXRlZCwgY2hlY2sgZm9yIG5vdGhpbmcgdGhlcmUuICovCisJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwlpZiAocHRyID09IDApIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgdGhlIGJ1ZmZlciAmIGJsb2NrIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBvciBrZXkvcHRyLiAqLworCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworCW51bXJlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spOworCisjaWZkZWYgREVCVUcKKwllcnJvciA9IHhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisjZW5kaWYKKworCS8qIEZhaWwgaWYgd2UncmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAqLworCWlmIChwdHIgPiBudW1yZWNzKSB7CisJCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGRlbHJlYyk7CisJWEZTX0JUUkVFX1NUQVRTX0FERChjdXIsIG1vdmVzLCBudW1yZWNzIC0gcHRyKTsKKworCS8qIEV4Y2lzZSB0aGUgZW50cmllcyBiZWluZyBkZWxldGVkLiAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJLyogSXQncyBhIG5vbmxlYWYuIG9wZXJhdGUgb24ga2V5cyBhbmQgcHRycyAqLworCQl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpsa3A7CisJCXVuaW9uIHhmc19idHJlZV9wdHIJKmxwcDsKKworCQlsa3AgPSB4ZnNfYnRyZWVfa2V5X2FkZHIoY3VyLCBwdHIgKyAxLCBibG9jayk7CisJCWxwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIHB0ciArIDEsIGJsb2NrKTsKKworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBudW1yZWNzIC0gcHRyOyBpKyspIHsKKwkJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX3B0cihjdXIsIGxwcCwgaSwgbGV2ZWwpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQl9CisjZW5kaWYKKworCQlpZiAocHRyIDwgbnVtcmVjcykgeworCQkJeGZzX2J0cmVlX3NoaWZ0X2tleXMoY3VyLCBsa3AsIC0xLCBudW1yZWNzIC0gcHRyKTsKKwkJCXhmc19idHJlZV9zaGlmdF9wdHJzKGN1ciwgbHBwLCAtMSwgbnVtcmVjcyAtIHB0cik7CisJCQl4ZnNfYnRyZWVfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7CisJCQl4ZnNfYnRyZWVfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7CisJCX0KKworCQkvKgorCQkgKiBJZiBpdCdzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGJsb2NrLCB3ZSdsbCBuZWVkIHRvIHBhc3MgYQorCQkgKiBrZXkgdXAgdG8gdGhlIG5leHQgbGV2ZWwgKHVwZGtleSkuCisJCSAqLworCQlpZiAocHRyID09IDEpCisJCQlrZXlwID0geGZzX2J0cmVlX2tleV9hZGRyKGN1ciwgMSwgYmxvY2spOworCX0gZWxzZSB7CisJCS8qIEl0J3MgYSBsZWFmLiBvcGVyYXRlIG9uIHJlY29yZHMgKi8KKwkJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJCXhmc19idHJlZV9zaGlmdF9yZWNzKGN1ciwKKwkJCQl4ZnNfYnRyZWVfcmVjX2FkZHIoY3VyLCBwdHIgKyAxLCBibG9jayksCisJCQkJLTEsIG51bXJlY3MgLSBwdHIpOworCQkJeGZzX2J0cmVlX2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOworCQl9CisKKwkJLyoKKwkJICogSWYgaXQncyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBibG9jaywgd2UnbGwgbmVlZCBhIGtleQorCQkgKiBzdHJ1Y3R1cmUgdG8gcGFzcyB1cCB0byB0aGUgbmV4dCBsZXZlbCAodXBka2V5KS4KKwkJICovCisJCWlmIChwdHIgPT0gMSkgeworCQkJY3VyLT5iY19vcHMtPmluaXRfa2V5X2Zyb21fcmVjKCZrZXksCisJCQkJCXhmc19idHJlZV9yZWNfYWRkcihjdXIsIDEsIGJsb2NrKSk7CisJCQlrZXlwID0gJmtleTsKKwkJfQorCX0KKworCS8qCisJICogRGVjcmVtZW50IGFuZCBsb2cgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBibG9jay4KKwkgKi8KKwl4ZnNfYnRyZWVfc2V0X251bXJlY3MoYmxvY2ssIC0tbnVtcmVjcyk7CisJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisKKwkvKgorCSAqIElmIHdlIGFyZSB0cmFja2luZyB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIHRyZWUgYW5kCisJICogd2UgYXJlIGF0IHRoZSBmYXIgcmlnaHQgZWRnZSBvZiB0aGUgdHJlZSwgdXBkYXRlIGl0LgorCSAqLworCWlmICh4ZnNfYnRyZWVfaXNfbGFzdHJlYyhjdXIsIGJsb2NrLCBsZXZlbCkpIHsKKwkJY3VyLT5iY19vcHMtPnVwZGF0ZV9sYXN0cmVjKGN1ciwgYmxvY2ssIE5VTEwsCisJCQkJCSAgICBwdHIsIExBU1RSRUNfREVMUkVDKTsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGF0IHRoZSByb290IGxldmVsLiAgRmlyc3QsIHNocmluayB0aGUgcm9vdCBibG9jayBpbi1tZW1vcnkuCisJICogVHJ5IHRvIGdldCByaWQgb2YgdGhlIG5leHQgbGV2ZWwgZG93bi4gIElmIHdlIGNhbid0IHRoZW4gdGhlcmUncworCSAqIG5vdGhpbmcgbGVmdCB0byBkby4KKwkgKi8KKwlpZiAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9ST09UX0lOX0lOT0RFKSB7CisJCQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgLTEsCisJCQkJCSAgY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfa2lsbF9pcm9vdChjdXIpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCisJCQllcnJvciA9IHhmc19idHJlZV9kZWNfY3Vyc29yKGN1ciwgbGV2ZWwsIHN0YXQpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSByb290IGxldmVsLCBhbmQgdGhlcmUncyBvbmx5IG9uZSBlbnRyeSBsZWZ0LAorCQkgKiBhbmQgaXQncyBOT1QgdGhlIGxlYWYgbGV2ZWwsIHRoZW4gd2UgY2FuIGdldCByaWQgb2YgdGhpcworCQkgKiBsZXZlbC4KKwkJICovCisJCWlmIChudW1yZWNzID09IDEgJiYgbGV2ZWwgPiAwKSB7CisJCQl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwcDsKKwkJCS8qCisJCQkgKiBwcCBpcyBzdGlsbCBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIGJsb2NrLgorCQkJICogTWFrZSBpdCB0aGUgbmV3IHJvb3Qgb2YgdGhlIGJ0cmVlLgorCQkJICovCisJCQlwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIDEsIGJsb2NrKTsKKwkJCWVycm9yID0gY3VyLT5iY19vcHMtPmtpbGxfcm9vdChjdXIsIGJwLCBsZXZlbCwgcHApOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQl9IGVsc2UgaWYgKGxldmVsID4gMCkgeworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjX2N1cnNvcihjdXIsIGxldmVsLCBzdGF0KTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJfQorCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgd2UgZGVsZXRlZCB0aGUgbGVmdG1vc3QgZW50cnkgaW4gdGhlIGJsb2NrLCB1cGRhdGUgdGhlCisJICoga2V5IHZhbHVlcyBhYm92ZSB1cyBpbiB0aGUgdHJlZS4KKwkgKi8KKwlpZiAocHRyID09IDEpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfdXBka2V5KGN1ciwga2V5cCwgbGV2ZWwgKyAxKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVtYWluaW5nIGluIHRoZSBibG9jayBpcyBhdCBsZWFzdAorCSAqIHRoZSBtaW5pbXVtLCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChudW1yZWNzID49IGN1ci0+YmNfb3BzLT5nZXRfbWlucmVjcyhjdXIsIGxldmVsKSkgeworCQllcnJvciA9IHhmc19idHJlZV9kZWNfY3Vyc29yKGN1ciwgbGV2ZWwsIHN0YXQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gbW92ZSBzb21lIHJlY29yZHMgYXJvdW5kIHRvIGtlZXAgdGhlCisJICogdHJlZSBiYWxhbmNlZC4gIExvb2sgYXQgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpYmxpbmcgYmxvY2tzIHRvCisJICogc2VlIGlmIHdlIGNhbiByZS1iYWxhbmNlIGJ5IG1vdmluZyBvbmx5IG9uZSByZWNvcmQuCisJICovCisJeGZzX2J0cmVlX2dldF9zaWJsaW5nKGN1ciwgYmxvY2ssICZycHRyLCBYRlNfQkJfUklHSFRTSUIpOworCXhmc19idHJlZV9nZXRfc2libGluZyhjdXIsIGJsb2NrLCAmbHB0ciwgWEZTX0JCX0xFRlRTSUIpOworCisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfUk9PVF9JTl9JTk9ERSkgeworCQkvKgorCQkgKiBPbmUgY2hpbGQgb2Ygcm9vdCwgbmVlZCB0byBnZXQgYSBjaGFuY2UgdG8gY29weSBpdHMgY29udGVudHMKKwkJICogaW50byB0aGUgcm9vdCBhbmQgZGVsZXRlIGl0LiBDYW4ndCBnbyB1cCB0byBuZXh0IGxldmVsLAorCQkgKiB0aGVyZSdzIG5vdGhpbmcgdG8gZGVsZXRlIHRoZXJlLgorCQkgKi8KKwkJaWYgKHhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZycHRyKSAmJgorCQkgICAgeGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJmxwdHIpICYmCisJCSAgICBsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAyKSB7CisJCQllcnJvciA9IHhmc19idHJlZV9raWxsX2lyb290KGN1cik7CisJCQlpZiAoIWVycm9yKQorCQkJCWVycm9yID0geGZzX2J0cmVlX2RlY19jdXJzb3IoY3VyLCBsZXZlbCwgc3RhdCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCUFTU0VSVCgheGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJnJwdHIpIHx8CisJICAgICAgICF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmbHB0cikpOworCisJLyoKKwkgKiBEdXBsaWNhdGUgdGhlIGN1cnNvciBzbyBvdXIgYnRyZWUgbWFuaXB1bGF0aW9ucyBoZXJlIHdvbid0CisJICogZGlzcnVwdCB0aGUgbmV4dCBsZXZlbCB1cC4KKwkgKi8KKwllcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSByaWdodCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQorCSAqIG91dCBvZiBpdC4KKwkgKi8KKwlpZiAoIXhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZycHRyKSkgeworCQkvKgorCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgbmV4dCBibG9jay4KKwkJICogQWN0dWFsbHkgYW55IGVudHJ5IGJ1dCB0aGUgZmlyc3Qgd291bGQgc3VmZmljZS4KKwkJICovCisJCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKworCQllcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisKKwkJLyogR3JhYiBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLiAqLworCQlyaWdodCA9IHhmc19idHJlZV9nZXRfYmxvY2sodGN1ciwgbGV2ZWwsICZyYnApOworI2lmZGVmIERFQlVHCisJCWVycm9yID0geGZzX2J0cmVlX2NoZWNrX2Jsb2NrKHRjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisjZW5kaWYKKwkJLyogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLiAqLworCQl4ZnNfYnRyZWVfZ2V0X3NpYmxpbmcodGN1ciwgcmlnaHQsICZjcHRyLCBYRlNfQkJfTEVGVFNJQik7CisKKwkJLyoKKwkJICogSWYgcmlnaHQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKKwkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCBsZWZ0LXNoaWZ0aW5nIGFuIGVudHJ5IG91dAorCQkgKiBvZiByaWdodCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KKwkJICovCisJCWlmICh4ZnNfYnRyZWVfZ2V0X251bXJlY3MocmlnaHQpIC0gMSA+PQorCQkgICAgY3VyLT5iY19vcHMtPmdldF9taW5yZWNzKHRjdXIsIGxldmVsKSkgeworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfbHNoaWZ0KHRjdXIsIGxldmVsLCAmaSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoaSkgeworCQkJCUFTU0VSVCh4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spID49CisJCQkJICAgICAgIGN1ci0+YmNfb3BzLT5nZXRfbWlucmVjcyh0Y3VyLCBsZXZlbCkpOworCisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCXRjdXIgPSBOVUxMOworCisJCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjX2N1cnNvcihjdXIsIGxldmVsLCBzdGF0KTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBncmFiIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBmb3IKKwkJICogZnV0dXJlIHJlZmVyZW5jZSwgYW5kIGZpeCB1cCB0aGUgdGVtcCBjdXJzb3IgdG8gcG9pbnQKKwkJICogdG8gb3VyIGJsb2NrIGFnYWluIChsYXN0IHJlY29yZCkuCisJCSAqLworCQlycmVjcyA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhyaWdodCk7CisJCWlmICgheGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJmxwdHIpKSB7CisJCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KHRjdXIsIGxldmVsLCAmaSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBsZWZ0IHNpYmxpbmcsIHNlZSBpZiBpdCdzIG9rIHRvIHNoaWZ0IGFuIGVudHJ5CisJICogb3V0IG9mIGl0LgorCSAqLworCWlmICgheGZzX2J0cmVlX3B0cl9pc19udWxsKGN1ciwgJmxwdHIpKSB7CisJCS8qCisJCSAqIE1vdmUgdGhlIHRlbXAgY3Vyc29yIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKKwkJICogcHJldmlvdXMgYmxvY2suCisJCSAqLworCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCisJCWVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKworCQkvKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgYmxvY2suICovCisJCWxlZnQgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKHRjdXIsIGxldmVsLCAmbGJwKTsKKyNpZmRlZiBERUJVRworCQllcnJvciA9IHhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQkvKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuICovCisJCXhmc19idHJlZV9nZXRfc2libGluZyh0Y3VyLCBsZWZ0LCAmY3B0ciwgWEZTX0JCX1JJR0hUU0lCKTsKKworCQkvKgorCQkgKiBJZiBsZWZ0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5CisJCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgcmlnaHQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CisJCSAqIG9mIGxlZnQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCisJCSAqLworCQlpZiAoeGZzX2J0cmVlX2dldF9udW1yZWNzKGxlZnQpIC0gMSA+PQorCQkgICAgY3VyLT5iY19vcHMtPmdldF9taW5yZWNzKHRjdXIsIGxldmVsKSkgeworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfcnNoaWZ0KHRjdXIsIGxldmVsLCAmaSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoaSkgeworCQkJCUFTU0VSVCh4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spID49CisJCQkJICAgICAgIGN1ci0+YmNfb3BzLT5nZXRfbWlucmVjcyh0Y3VyLCBsZXZlbCkpOworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQl0Y3VyID0gTlVMTDsKKwkJCQlpZiAobGV2ZWwgPT0gMCkKKwkJCQkJY3VyLT5iY19wdHJzWzBdKys7CisJCQkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgorCQkgKiBmdXR1cmUgcmVmZXJlbmNlLgorCQkgKi8KKwkJbHJlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MobGVmdCk7CisJfQorCisJLyogRGVsZXRlIHRoZSB0ZW1wIGN1cnNvciwgd2UncmUgZG9uZSB3aXRoIGl0LiAqLworCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwl0Y3VyID0gTlVMTDsKKworCS8qIElmIGhlcmUsIHdlIG5lZWQgdG8gZG8gYSBqb2luIHRvIGtlZXAgdGhlIHRyZWUgYmFsYW5jZWQuICovCisJQVNTRVJUKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmY3B0cikpOworCisJaWYgKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmbHB0cikgJiYKKwkgICAgbHJlY3MgKyB4ZnNfYnRyZWVfZ2V0X251bXJlY3MoYmxvY2spIDw9CisJCQljdXItPmJjX29wcy0+Z2V0X21heHJlY3MoY3VyLCBsZXZlbCkpIHsKKwkJLyoKKwkJICogU2V0ICJyaWdodCIgdG8gYmUgdGhlIHN0YXJ0aW5nIGJsb2NrLAorCQkgKiAibGVmdCIgdG8gYmUgdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQlycHRyID0gY3B0cjsKKwkJcmlnaHQgPSBibG9jazsKKwkJcmJwID0gYnA7CisJCWVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmX2Jsb2NrKGN1ciwgJmxwdHIsIGxldmVsLAorCQkJCQkJCTAsICZsZWZ0LCAmbGJwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisKKwkvKgorCSAqIElmIHRoYXQgd29uJ3Qgd29yaywgc2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLgorCSAqLworCX0gZWxzZSBpZiAoIXhmc19idHJlZV9wdHJfaXNfbnVsbChjdXIsICZycHRyKSAmJgorCQkgICBycmVjcyArIHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jaykgPD0KKwkJCWN1ci0+YmNfb3BzLT5nZXRfbWF4cmVjcyhjdXIsIGxldmVsKSkgeworCQkvKgorCQkgKiBTZXQgImxlZnQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKKwkJICogInJpZ2h0IiB0byBiZSB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQlscHRyID0gY3B0cjsKKwkJbGVmdCA9IGJsb2NrOworCQlsYnAgPSBicDsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZfYmxvY2soY3VyLCAmcnB0ciwgbGV2ZWwsCisJCQkJCQkJMCwgJnJpZ2h0LCAmcmJwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisKKwkvKgorCSAqIE90aGVyd2lzZSwgd2UgY2FuJ3QgZml4IHRoZSBpbWJhbGFuY2UuCisJICogSnVzdCByZXR1cm4uICBUaGlzIGlzIHByb2JhYmx5IGEgbG9naWMgZXJyb3IsIGJ1dCBpdCdzIG5vdCBmYXRhbC4KKwkgKi8KKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19idHJlZV9kZWNfY3Vyc29yKGN1ciwgbGV2ZWwsIHN0YXQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcnJlY3MgPSB4ZnNfYnRyZWVfZ2V0X251bXJlY3MocmlnaHQpOworCWxyZWNzID0geGZzX2J0cmVlX2dldF9udW1yZWNzKGxlZnQpOworCisJLyoKKwkgKiBXZSdyZSBub3cgZ29pbmcgdG8gam9pbiAibGVmdCIgYW5kICJyaWdodCIgYnkgbW92aW5nIGFsbCB0aGUgc3R1ZmYKKwkgKiBpbiAicmlnaHQiIHRvICJsZWZ0IiBhbmQgZGVsZXRpbmcgInJpZ2h0Ii4KKwkgKi8KKwlYRlNfQlRSRUVfU1RBVFNfQUREKGN1ciwgbW92ZXMsIHJyZWNzKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qIEl0J3MgYSBub24tbGVhZi4gIE1vdmUga2V5cyBhbmQgcG9pbnRlcnMuICovCisJCXVuaW9uIHhmc19idHJlZV9rZXkJKmxrcDsJLyogbGVmdCBidHJlZSBrZXkgKi8KKwkJdW5pb24geGZzX2J0cmVlX3B0cgkqbHBwOwkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCQl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpya3A7CS8qIHJpZ2h0IGJ0cmVlIGtleSAqLworCQl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpycHA7CS8qIHJpZ2h0IGFkZHJlc3MgcG9pbnRlciAqLworCisJCWxrcCA9IHhmc19idHJlZV9rZXlfYWRkcihjdXIsIGxyZWNzICsgMSwgbGVmdCk7CisJCWxwcCA9IHhmc19idHJlZV9wdHJfYWRkcihjdXIsIGxyZWNzICsgMSwgbGVmdCk7CisJCXJrcCA9IHhmc19idHJlZV9rZXlfYWRkcihjdXIsIDEsIHJpZ2h0KTsKKwkJcnBwID0geGZzX2J0cmVlX3B0cl9hZGRyKGN1ciwgMSwgcmlnaHQpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDE7IGkgPCBycmVjczsgaSsrKSB7CisJCQllcnJvciA9IHhmc19idHJlZV9jaGVja19wdHIoY3VyLCBycHAsIGksIGxldmVsKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJfQorI2VuZGlmCisJCXhmc19idHJlZV9jb3B5X2tleXMoY3VyLCBsa3AsIHJrcCwgcnJlY3MpOworCQl4ZnNfYnRyZWVfY29weV9wdHJzKGN1ciwgbHBwLCBycHAsIHJyZWNzKTsKKworCQl4ZnNfYnRyZWVfbG9nX2tleXMoY3VyLCBsYnAsIGxyZWNzICsgMSwgbHJlY3MgKyBycmVjcyk7CisJCXhmc19idHJlZV9sb2dfcHRycyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKKwl9IGVsc2UgeworCQkvKiBJdCdzIGEgbGVhZi4gIE1vdmUgcmVjb3Jkcy4gICovCisJCXVuaW9uIHhmc19idHJlZV9yZWMJKmxycDsJLyogbGVmdCByZWNvcmQgcG9pbnRlciAqLworCQl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpycnA7CS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCisKKwkJbHJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgbHJlY3MgKyAxLCBsZWZ0KTsKKwkJcnJwID0geGZzX2J0cmVlX3JlY19hZGRyKGN1ciwgMSwgcmlnaHQpOworCisJCXhmc19idHJlZV9jb3B5X3JlY3MoY3VyLCBscnAsIHJycCwgcnJlY3MpOworCQl4ZnNfYnRyZWVfbG9nX3JlY3MoY3VyLCBsYnAsIGxyZWNzICsgMSwgbHJlY3MgKyBycmVjcyk7CisJfQorCisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGpvaW4pOworCisJLyoKKwkgKiBGaXggdXAgdGhlIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBhbmQgcmlnaHQgYmxvY2sgcG9pbnRlciBpbiB0aGUKKwkgKiBzdXJ2aXZpbmcgYmxvY2ssIGFuZCBsb2cgaXQuCisJICovCisJeGZzX2J0cmVlX3NldF9udW1yZWNzKGxlZnQsIGxyZWNzICsgcnJlY3MpOworCXhmc19idHJlZV9nZXRfc2libGluZyhjdXIsIHJpZ2h0LCAmY3B0ciwgWEZTX0JCX1JJR0hUU0lCKSwKKwl4ZnNfYnRyZWVfc2V0X3NpYmxpbmcoY3VyLCBsZWZ0LCAmY3B0ciwgWEZTX0JCX1JJR0hUU0lCKTsKKwl4ZnNfYnRyZWVfbG9nX2Jsb2NrKGN1ciwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CisKKwkvKiBJZiB0aGVyZSBpcyBhIHJpZ2h0IHNpYmxpbmcsIHBvaW50IGl0IHRvIHRoZSByZW1haW5pbmcgYmxvY2suICovCisJeGZzX2J0cmVlX2dldF9zaWJsaW5nKGN1ciwgbGVmdCwgJmNwdHIsIFhGU19CQl9SSUdIVFNJQik7CisJaWYgKCF4ZnNfYnRyZWVfcHRyX2lzX251bGwoY3VyLCAmY3B0cikpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZfYmxvY2soY3VyLCAmY3B0ciwgbGV2ZWwsCisJCQkJCQkJMCwgJnJyYmxvY2ssICZycmJwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJCXhmc19idHJlZV9zZXRfc2libGluZyhjdXIsIHJyYmxvY2ssICZscHRyLCBYRlNfQkJfTEVGVFNJQik7CisJCXhmc19idHJlZV9sb2dfYmxvY2soY3VyLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CisJfQorCisJLyogRnJlZSB0aGUgZGVsZXRlZCBibG9jay4gKi8KKwllcnJvciA9IGN1ci0+YmNfb3BzLT5mcmVlX2Jsb2NrKGN1ciwgcmJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBmcmVlKTsKKworCS8qCisJICogSWYgd2Ugam9pbmVkIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IsIHNldCB0aGUgYnVmZmVyIGluIHRoZQorCSAqIGN1cnNvciB0byB0aGUgbGVmdCBibG9jaywgYW5kIGZpeCB1cCB0aGUgaW5kZXguCisJICovCisJaWYgKGJwICE9IGxicCkgeworCQljdXItPmJjX2J1ZnNbbGV2ZWxdID0gbGJwOworCQljdXItPmJjX3B0cnNbbGV2ZWxdICs9IGxyZWNzOworCQljdXItPmJjX3JhW2xldmVsXSA9IDA7CisJfQorCS8qCisJICogSWYgd2Ugam9pbmVkIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGFuZCB0aGVyZSdzIGEgbGV2ZWwgYWJvdmUKKwkgKiB1cywgaW5jcmVtZW50IHRoZSBjdXJzb3IgYXQgdGhhdCBsZXZlbC4KKwkgKi8KKwllbHNlIGlmICgoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9ST09UX0lOX0lOT0RFKSB8fAorCQkgICAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzKSkgeworCQllcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCBsZXZlbCArIDEsICZpKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBSZWFkanVzdCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwgaWYgaXQncyBub3QgYSBsZWFmLCBzaW5jZSBpdCdzCisJICogc3RpbGwgcG9pbnRpbmcgYXQgdGhlIGRlbGV0aW9uIHBvaW50LCB3aGljaCBtYWtlcyB0aGUgY3Vyc29yCisJICogaW5jb25zaXN0ZW50LiAgSWYgdGhpcyBtYWtlcyB0aGUgcHRyIDAsIHRoZSBjYWxsZXIgZml4ZXMgaXQgdXAuCisJICogV2UgY2FuJ3QgdXNlIGRlY3JlbWVudCBiZWNhdXNlIGl0IHdvdWxkIGNoYW5nZSB0aGUgbmV4dCBsZXZlbCB1cC4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKQorCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOworCS8qIFJldHVybiB2YWx1ZSBtZWFucyB0aGUgbmV4dCBsZXZlbCB1cCBoYXMgc29tZXRoaW5nIHRvIGRvLiAqLworCSpzdGF0ID0gMjsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVJST1IpOworCWlmICh0Y3VyKQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKKyAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfZGVsZXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlsZXZlbDsKKwlpbnQJCQlpOworCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FTlRSWSk7CisKKwkvKgorCSAqIEdvIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCBsZWFmIGxldmVsLgorCSAqCisJICogSWYgMiBpcyByZXR1cm5lZCB0aGVuIGEgam9pbiB3YXMgZG9uZTsgZ28gdG8gdGhlIG5leHQgbGV2ZWwuCisJICogT3RoZXJ3aXNlIHdlIGFyZSBkb25lLgorCSAqLworCWZvciAobGV2ZWwgPSAwLCBpID0gMjsgaSA9PSAyOyBsZXZlbCsrKSB7CisJCWVycm9yID0geGZzX2J0cmVlX2RlbHJlYyhjdXIsIGxldmVsLCAmaSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKworCWlmIChpID09IDApIHsKKwkJZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7CisJCQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA9PSAwKSB7CisJCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKKwkqc3RhdCA9IGk7CisJcmV0dXJuIDA7CitlcnJvcjA6CisJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfZ2V0X3JlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSoqcmVjcCwJLyogb3V0cHV0OiBidHJlZSByZWNvcmQgKi8KKwlpbnQJCQkqc3RhdCkJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOwkvKiBidWZmZXIgcG9pbnRlciAqLworCWludAkJCXB0cjsJLyogcmVjb3JkIG51bWJlciAqLworI2lmZGVmIERFQlVHCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisKKwlwdHIgPSBjdXItPmJjX3B0cnNbMF07CisJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgMCwgJmJwKTsKKworI2lmZGVmIERFQlVHCisJZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgMCwgYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisKKwkvKgorCSAqIE9mZiB0aGUgcmlnaHQgZW5kIG9yIGxlZnQgZW5kLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAocHRyID4geGZzX2J0cmVlX2dldF9udW1yZWNzKGJsb2NrKSB8fCBwdHIgPD0gMCkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUG9pbnQgdG8gdGhlIHJlY29yZCBhbmQgZXh0cmFjdCBpdHMgZGF0YS4KKwkgKi8KKwkqcmVjcCA9IHhmc19idHJlZV9yZWNfYWRkcihjdXIsIHB0ciwgYmxvY2spOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYnRyZWUuaAppbmRleCAxZjUyOGEyLi43ODlmZmZkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J0cmVlLmgKKysrIGIvZnMveGZzL3hmc19idHJlZS5oCkBAIC0zOSwzOSArMzksMTkgQEAKICNkZWZpbmUJWEZTX0JUTlVNX0lOTwkoKHhmc19idG51bV90KVhGU19CVE5VTV9JTk9pKQogCiAvKgotICogU2hvcnQgZm9ybSBoZWFkZXI6IHNwYWNlIGFsbG9jYXRpb24gYnRyZWVzLgorICogR2VuZXJpYyBidHJlZSBoZWFkZXIuCisgKgorICogVGhpcyBpcyBhIGNvbWluYXRpb24gb2YgdGhlIGFjdHVhbCBmb3JtYXQgdXNlZCBvbiBkaXNrIGZvciBzaG9ydCBhbmQgbG9uZworICogZm9ybWF0IGJ0cmVlcy4gIFRoZSBmaXJzdCB0aHJlZSBmaWVsZHMgYXJlIHNoYXJlZCBieSBib3RoIGZvcm1hdCwgYnV0CisgKiB0aGUgcG9pbnRlcnMgYXJlIGRpZmZlcmVudCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLgorICoKKyAqIFRvIGdldCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsIHNob3J0IG9yIGxvbmcgZm9ybSBoZWFkZXJzIHBsZWFzZSB1c2UKKyAqIHRoZSBzaXplIG1hY3JvcyBiZWxvdy4gIE5ldmVyIHVzZSBzaXplb2YoeGZzX2J0cmVlX2Jsb2NrKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX3NibG9jayB7CitzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrIHsKIAlfX2JlMzIJCWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KIAlfX2JlMTYJCWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLwogCV9fYmUxNgkJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLwotCV9fYmUzMgkJYmJfbGVmdHNpYjsJLyogbGVmdCBzaWJsaW5nIGJsb2NrIG9yIE5VTExBR0JMT0NLICovCi0JX19iZTMyCQliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMQUdCTE9DSyAqLwotfSB4ZnNfYnRyZWVfc2Jsb2NrX3Q7Ci0KLS8qCi0gKiBMb25nIGZvcm0gaGVhZGVyOiBibWFwIGJ0cmVlcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2xibG9jayB7Ci0JX19iZTMyCQliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCi0JX19iZTE2CQliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KLQlfX2JlMTYJCWJiX251bXJlY3M7CS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KLQlfX2JlNjQJCWJiX2xlZnRzaWI7CS8qIGxlZnQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCi0JX19iZTY0CQliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCi19IHhmc19idHJlZV9sYmxvY2tfdDsKLQotLyoKLSAqIENvbWJpbmVkIGhlYWRlciBhbmQgc3RydWN0dXJlLCB1c2VkIGJ5IGNvbW1vbiBjb2RlLgotICovCi10eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfaGRyCi17Ci0JX19iZTMyCQliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCi0JX19iZTE2CQliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KLQlfX2JlMTYJCWJiX251bXJlY3M7CS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KLX0geGZzX2J0cmVlX2hkcl90OwotCi10eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgewotCXhmc19idHJlZV9oZHJfdAliYl9oOwkJLyogaGVhZGVyICovCiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJX19iZTMyCQliYl9sZWZ0c2liOwpAQCAtODIsNyArNjIsMzYgQEAKIAkJCV9fYmU2NAkJYmJfcmlnaHRzaWI7CiAJCX0gbDsJCQkvKiBsb25nIGZvcm0gcG9pbnRlcnMgKi8KIAl9IGJiX3U7CQkJCS8qIHJlc3QgKi8KLX0geGZzX2J0cmVlX2Jsb2NrX3Q7Cit9OworCisjZGVmaW5lIFhGU19CVFJFRV9TQkxPQ0tfTEVOCTE2CS8qIHNpemUgb2YgYSBzaG9ydCBmb3JtIGJsb2NrICovCisjZGVmaW5lIFhGU19CVFJFRV9MQkxPQ0tfTEVOCTI0CS8qIHNpemUgb2YgYSBsb25nIGZvcm0gYmxvY2sgKi8KKworCisvKgorICogR2VuZXJpYyBrZXksIHB0ciBhbmQgcmVjb3JkIHdyYXBwZXIgc3RydWN0dXJlcy4KKyAqCisgKiBUaGVzZSBhcmUgZGlzayBmb3JtYXQgc3RydWN0dXJlcywgYW5kIGFyZSBjb252ZXJ0ZWQgd2hlcmUgbmVjZXNzYXJ5CisgKiBieSB0aGUgYnRyZWUgc3BlY2lmaWMgY29kZSB0aGF0IG5lZWRzIHRvIGludGVycHJldCB0aGVtLgorICovCit1bmlvbiB4ZnNfYnRyZWVfcHRyIHsKKwlfX2JlMzIJCQlzOwkvKiBzaG9ydCBmb3JtIHB0ciAqLworCV9fYmU2NAkJCWw7CS8qIGxvbmcgZm9ybSBwdHIgKi8KK307CisKK3VuaW9uIHhmc19idHJlZV9rZXkgeworCXhmc19ibWJ0X2tleV90CQlibWJ0OworCXhmc19ibWRyX2tleV90CQlibWJyOwkvKiBibWJ0IHJvb3QgYmxvY2sgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCWFsbG9jOworCXhmc19pbm9idF9rZXlfdAkJaW5vYnQ7Cit9OworCit1bmlvbiB4ZnNfYnRyZWVfcmVjIHsKKwl4ZnNfYm1idF9yZWNfdAkJYm1idDsKKwl4ZnNfYm1kcl9yZWNfdAkJYm1icjsJLyogYm1idCByb290IGJsb2NrICovCisJeGZzX2FsbG9jX3JlY190CQlhbGxvYzsKKwl4ZnNfaW5vYnRfcmVjX3QJCWlub2J0OworfTsKIAogLyoKICAqIEZvciBsb2dnaW5nIHJlY29yZCBmaWVsZHMuCkBAIC05Niw0NiArMTA1LDEzMSBAQAogI2RlZmluZQlYRlNfQkJfQUxMX0JJVFMJCSgoMSA8PCBYRlNfQkJfTlVNX0JJVFMpIC0gMSkKIAogLyoKLSAqIEJvb2xlYW4gdG8gc2VsZWN0IHdoaWNoIGZvcm0gb2YgeGZzX2J0cmVlX2Jsb2NrX3QuYmJfdSB0byB1c2UuCi0gKi8KLSNkZWZpbmUJWEZTX0JUUkVFX0xPTkdfUFRSUyhidG51bSkJKChidG51bSkgPT0gWEZTX0JUTlVNX0JNQVApCi0KLS8qCiAgKiBNYWdpYyBudW1iZXJzIGZvciBidHJlZSBibG9ja3MuCiAgKi8KIGV4dGVybiBjb25zdCBfX3VpbnQzMl90CXhmc19tYWdpY3NbXTsKIAogLyoKLSAqIE1heGltdW0gYW5kIG1pbmltdW0gcmVjb3JkcyBpbiBhIGJ0cmVlIGJsb2NrLgotICogR2l2ZW4gYmxvY2sgc2l6ZSwgdHlwZSBwcmVmaXgsIGFuZCBsZWFmIGZsYWcgKDAgb3IgMSkuCi0gKiBUaGUgZGl2aXNvciBiZWxvdyBpcyBlcXVpdmFsZW50IHRvIGxmID8gKGUxKSA6IChlMikgYnV0IHRoYXQgcHJvZHVjZXMKLSAqIGNvbXBpbGVyIHdhcm5pbmdzLgorICogR2VuZXJpYyBzdGF0cyBpbnRlcmZhY2UKICAqLwotI2RlZmluZQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhic3osdCxsZikJXAotCSgoaW50KSgoKGJzeikgLSAodWludClzaXplb2YodCAjIyBfYmxvY2tfdCkpIC8gXAotCSAoKChsZikgKiAodWludClzaXplb2YodCAjIyBfcmVjX3QpKSArIFwKLQkgICgoMSAtIChsZikpICogXAotCSAgICgodWludClzaXplb2YodCAjIyBfa2V5X3QpICsgKHVpbnQpc2l6ZW9mKHQgIyMgX3B0cl90KSkpKSkpCi0jZGVmaW5lCVhGU19CVFJFRV9CTE9DS19NSU5SRUNTKGJzeix0LGxmKQlcCi0JKFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGJzeix0LGxmKSAvIDIpCisjZGVmaW5lIF9fWEZTX0JUUkVFX1NUQVRTX0lOQyh0eXBlLCBzdGF0KSBcCisJWEZTX1NUQVRTX0lOQyh4c18gIyMgdHlwZSAjIyBfMl8gIyMgc3RhdCkKKyNkZWZpbmUgWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIHN0YXQpICBcCitkbyB7ICAgIFwKKwlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsgIFwKKwljYXNlIFhGU19CVE5VTV9CTk86IF9fWEZTX0JUUkVFX1NUQVRTX0lOQyhhYnRiLCBzdGF0KTsgYnJlYWs7CVwKKwljYXNlIFhGU19CVE5VTV9DTlQ6IF9fWEZTX0JUUkVFX1NUQVRTX0lOQyhhYnRjLCBzdGF0KTsgYnJlYWs7CVwKKwljYXNlIFhGU19CVE5VTV9CTUFQOiBfX1hGU19CVFJFRV9TVEFUU19JTkMoYm1idCwgc3RhdCk7IGJyZWFrOwlcCisJY2FzZSBYRlNfQlROVU1fSU5POiBfX1hGU19CVFJFRV9TVEFUU19JTkMoaWJ0LCBzdGF0KTsgYnJlYWs7CVwKKwljYXNlIFhGU19CVE5VTV9NQVg6IEFTU0VSVCgwKTsgLyogZnVja2luZyBnY2MgKi8gOyBicmVhazsJXAorCX0gICAgICAgXAorfSB3aGlsZSAoMCkKIAotLyoKLSAqIFJlY29yZCwga2V5LCBhbmQgcG9pbnRlciBhZGRyZXNzIGNhbGN1bGF0aW9uIG1hY3Jvcy4KLSAqIEdpdmVuIGJsb2NrIHNpemUsIHR5cGUgcHJlZml4LCBibG9jayBwb2ludGVyLCBhbmQgaW5kZXggb2YgcmVxdWVzdGVkIGVudHJ5Ci0gKiAoZmlyc3QgZW50cnkgbnVtYmVyZWQgMSkuCi0gKi8KLSNkZWZpbmUJWEZTX0JUUkVFX1JFQ19BRERSKHQsYmIsaSkJXAotCSgodCAjIyBfcmVjX3QgKikoKGNoYXIgKikoYmIpICsgc2l6ZW9mKHQgIyMgX2Jsb2NrX3QpICsgXAotCSAoKGkpIC0gMSkgKiBzaXplb2YodCAjIyBfcmVjX3QpKSkKLSNkZWZpbmUJWEZTX0JUUkVFX0tFWV9BRERSKHQsYmIsaSkJXAotCSgodCAjIyBfa2V5X3QgKikoKGNoYXIgKikoYmIpICsgc2l6ZW9mKHQgIyMgX2Jsb2NrX3QpICsgXAotCSAoKGkpIC0gMSkgKiBzaXplb2YodCAjIyBfa2V5X3QpKSkKLSNkZWZpbmUJWEZTX0JUUkVFX1BUUl9BRERSKHQsYmIsaSxteHIpCVwKLQkoKHQgIyMgX3B0cl90ICopKChjaGFyICopKGJiKSArIHNpemVvZih0ICMjIF9ibG9ja190KSArIFwKLQkgKG14cikgKiBzaXplb2YodCAjIyBfa2V5X3QpICsgKChpKSAtIDEpICogc2l6ZW9mKHQgIyMgX3B0cl90KSkpCisjZGVmaW5lIF9fWEZTX0JUUkVFX1NUQVRTX0FERCh0eXBlLCBzdGF0LCB2YWwpIFwKKwlYRlNfU1RBVFNfQUREKHhzXyAjIyB0eXBlICMjIF8yXyAjIyBzdGF0LCB2YWwpCisjZGVmaW5lIFhGU19CVFJFRV9TVEFUU19BREQoY3VyLCBzdGF0LCB2YWwpICBcCitkbyB7ICAgIFwKKwlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsgIFwKKwljYXNlIFhGU19CVE5VTV9CTk86IF9fWEZTX0JUUkVFX1NUQVRTX0FERChhYnRiLCBzdGF0LCB2YWwpOyBicmVhazsgXAorCWNhc2UgWEZTX0JUTlVNX0NOVDogX19YRlNfQlRSRUVfU1RBVFNfQUREKGFidGMsIHN0YXQsIHZhbCk7IGJyZWFrOyBcCisJY2FzZSBYRlNfQlROVU1fQk1BUDogX19YRlNfQlRSRUVfU1RBVFNfQUREKGJtYnQsIHN0YXQsIHZhbCk7IGJyZWFrOyBcCisJY2FzZSBYRlNfQlROVU1fSU5POiBfX1hGU19CVFJFRV9TVEFUU19BREQoaWJ0LCBzdGF0LCB2YWwpOyBicmVhazsgXAorCWNhc2UgWEZTX0JUTlVNX01BWDogQVNTRVJUKDApOyAvKiBmdWNraW5nIGdjYyAqLyA7IGJyZWFrOwlcCisJfSAgICAgICBcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lCVhGU19CVFJFRV9NQVhMRVZFTFMJOAkvKiBtYXggb2YgYWxsIGJ0cmVlcyAqLwogCitzdHJ1Y3QgeGZzX2J0cmVlX29wcyB7CisJLyogc2l6ZSBvZiB0aGUga2V5IGFuZCByZWNvcmQgc3RydWN0dXJlcyAqLworCXNpemVfdAlrZXlfbGVuOworCXNpemVfdAlyZWNfbGVuOworCisJLyogY3Vyc29yIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqKCpkdXBfY3Vyc29yKShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqKTsKKwl2b2lkCSgqdXBkYXRlX2N1cnNvcikoc3RydWN0IHhmc19idHJlZV9jdXIgKnNyYywKKwkJCQkgc3RydWN0IHhmc19idHJlZV9jdXIgKmRzdCk7CisKKwkvKiB1cGRhdGUgYnRyZWUgcm9vdCBwb2ludGVyICovCisJdm9pZAkoKnNldF9yb290KShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAorCQkJCXVuaW9uIHhmc19idHJlZV9wdHIgKm5wdHIsIGludCBsZXZlbF9jaGFuZ2UpOworCWludAkoKmtpbGxfcm9vdCkoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgc3RydWN0IHhmc19idWYgKmJwLAorCQkJCWludCBsZXZlbCwgdW5pb24geGZzX2J0cmVlX3B0ciAqbmV3cm9vdCk7CisKKwkvKiBibG9jayBhbGxvY2F0aW9uIC8gZnJlZWluZyAqLworCWludAkoKmFsbG9jX2Jsb2NrKShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAorCQkJICAgICAgIHVuaW9uIHhmc19idHJlZV9wdHIgKnN0YXJ0X2JubywKKwkJCSAgICAgICB1bmlvbiB4ZnNfYnRyZWVfcHRyICpuZXdfYm5vLAorCQkJICAgICAgIGludCBsZW5ndGgsIGludCAqc3RhdCk7CisJaW50CSgqZnJlZV9ibG9jaykoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgc3RydWN0IHhmc19idWYgKmJwKTsKKworCS8qIHVwZGF0ZSBsYXN0IHJlY29yZCBpbmZvcm1hdGlvbiAqLworCXZvaWQJKCp1cGRhdGVfbGFzdHJlYykoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwKKwkJCQkgIHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgKmJsb2NrLAorCQkJCSAgdW5pb24geGZzX2J0cmVlX3JlYyAqcmVjLAorCQkJCSAgaW50IHB0ciwgaW50IHJlYXNvbik7CisKKwkvKiByZWNvcmRzIGluIGJsb2NrL2xldmVsICovCisJaW50CSgqZ2V0X21pbnJlY3MpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCBsZXZlbCk7CisJaW50CSgqZ2V0X21heHJlY3MpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCBsZXZlbCk7CisKKwkvKiByZWNvcmRzIG9uIGRpc2suICBNYXR0ZXIgZm9yIHRoZSByb290IGluIGlub2RlIGNhc2UuICovCisJaW50CSgqZ2V0X2RtYXhyZWNzKShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgbGV2ZWwpOworCisJLyogaW5pdCB2YWx1ZXMgb2YgYnRyZWUgc3RydWN0dXJlcyAqLworCXZvaWQJKCppbml0X2tleV9mcm9tX3JlYykodW5pb24geGZzX2J0cmVlX2tleSAqa2V5LAorCQkJCSAgICAgdW5pb24geGZzX2J0cmVlX3JlYyAqcmVjKTsKKwl2b2lkCSgqaW5pdF9yZWNfZnJvbV9rZXkpKHVuaW9uIHhmc19idHJlZV9rZXkgKmtleSwKKwkJCQkgICAgIHVuaW9uIHhmc19idHJlZV9yZWMgKnJlYyk7CisJdm9pZAkoKmluaXRfcmVjX2Zyb21fY3VyKShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAorCQkJCSAgICAgdW5pb24geGZzX2J0cmVlX3JlYyAqcmVjKTsKKwl2b2lkCSgqaW5pdF9wdHJfZnJvbV9jdXIpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsCisJCQkJICAgICB1bmlvbiB4ZnNfYnRyZWVfcHRyICpwdHIpOworCisJLyogZGlmZmVyZW5jZSBiZXR3ZWVuIGtleSB2YWx1ZSBhbmQgY3Vyc29yIHZhbHVlICovCisJX19pbnQ2NF90ICgqa2V5X2RpZmYpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsCisJCQkgICAgICB1bmlvbiB4ZnNfYnRyZWVfa2V5ICprZXkpOworCisjaWZkZWYgREVCVUcKKwkvKiBjaGVjayB0aGF0IGsxIGlzIGxvd2VyIHRoYW4gazIgKi8KKwlpbnQJKCprZXlzX2lub3JkZXIpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsCisJCQkJdW5pb24geGZzX2J0cmVlX2tleSAqazEsCisJCQkJdW5pb24geGZzX2J0cmVlX2tleSAqazIpOworCisJLyogY2hlY2sgdGhhdCByMSBpcyBsb3dlciB0aGFuIHIyICovCisJaW50CSgqcmVjc19pbm9yZGVyKShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAorCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKnIxLAorCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKnIyKTsKKyNlbmRpZgorCisJLyogYnRyZWUgdHJhY2luZyAqLworI2lmZGVmIFhGU19CVFJFRV9UUkFDRQorCXZvaWQJCSgqdHJhY2VfZW50ZXIpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIGNvbnN0IGNoYXIgKiwKKwkJCQkgICAgICAgY2hhciAqLCBpbnQsIGludCwgX19wc3Vuc2lnbmVkX3QsCisJCQkJICAgICAgIF9fcHN1bnNpZ25lZF90LCBfX3BzdW5zaWduZWRfdCwKKwkJCQkgICAgICAgX19wc3Vuc2lnbmVkX3QsIF9fcHN1bnNpZ25lZF90LAorCQkJCSAgICAgICBfX3BzdW5zaWduZWRfdCwgX19wc3Vuc2lnbmVkX3QsCisJCQkJICAgICAgIF9fcHN1bnNpZ25lZF90LCBfX3BzdW5zaWduZWRfdCwKKwkJCQkgICAgICAgX19wc3Vuc2lnbmVkX3QsIF9fcHN1bnNpZ25lZF90KTsKKwl2b2lkCQkoKnRyYWNlX2N1cnNvcikoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgX191aW50MzJfdCAqLAorCQkJCQlfX3VpbnQ2NF90ICosIF9fdWludDY0X3QgKik7CisJdm9pZAkJKCp0cmFjZV9rZXkpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJCQkJICAgICB1bmlvbiB4ZnNfYnRyZWVfa2V5ICosIF9fdWludDY0X3QgKiwKKwkJCQkgICAgIF9fdWludDY0X3QgKik7CisJdm9pZAkJKCp0cmFjZV9yZWNvcmQpKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJCQkJCXVuaW9uIHhmc19idHJlZV9yZWMgKiwgX191aW50NjRfdCAqLAorCQkJCQlfX3VpbnQ2NF90ICosIF9fdWludDY0X3QgKik7CisjZW5kaWYKK307CisKKy8qCisgKiBSZWFzb25zIGZvciB0aGUgdXBkYXRlX2xhc3RyZWMgbWV0aG9kIHRvIGJlIGNhbGxlZC4KKyAqLworI2RlZmluZSBMQVNUUkVDX1VQREFURQkwCisjZGVmaW5lIExBU1RSRUNfSU5TUkVDCTEKKyNkZWZpbmUgTEFTVFJFQ19ERUxSRUMJMgorCisKIC8qCiAgKiBCdHJlZSBjdXJzb3Igc3RydWN0dXJlLgogICogVGhpcyBjb2xsZWN0cyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBidHJlZSBjb2RlIGluIG9uZSBwbGFjZS4KQEAgLTE0NCw2ICsyMzgsOCBAQAogewogCXN0cnVjdCB4ZnNfdHJhbnMJKmJjX3RwOwkvKiB0cmFuc2FjdGlvbiB3ZSdyZSBpbiwgaWYgYW55ICovCiAJc3RydWN0IHhmc19tb3VudAkqYmNfbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdCAqLworCWNvbnN0IHN0cnVjdCB4ZnNfYnRyZWVfb3BzICpiY19vcHM7CisJdWludAkJCWJjX2ZsYWdzOyAvKiBidHJlZSBmZWF0dXJlcyAtIGJlbG93ICovCiAJdW5pb24gewogCQl4ZnNfYWxsb2NfcmVjX2luY29yZV90CWE7CiAJCXhmc19ibWJ0X2lyZWNfdAkJYjsKQEAgLTE3NSw5NCArMjcxLDQwIEBACiAJfQkJYmNfcHJpdmF0ZTsJLyogcGVyLWJ0cmVlIHR5cGUgZGF0YSAqLwogfSB4ZnNfYnRyZWVfY3VyX3Q7CiAKKy8qIGN1cnNvciBmbGFncyAqLworI2RlZmluZSBYRlNfQlRSRUVfTE9OR19QVFJTCQkoMTw8MCkJLyogcG9pbnRlcnMgYXJlIDY0Yml0cyBsb25nICovCisjZGVmaW5lIFhGU19CVFJFRV9ST09UX0lOX0lOT0RFCQkoMTw8MSkJLyogcm9vdCBtYXkgYmUgdmFyaWFibGUgc2l6ZSAqLworI2RlZmluZSBYRlNfQlRSRUVfTEFTVFJFQ19VUERBVEUJKDE8PDIpCS8qIHRyYWNrIGxhc3QgcmVjIGV4dGVybmFsbHkgKi8KKworCiAjZGVmaW5lCVhGU19CVFJFRV9OT0VSUk9SCTAKICNkZWZpbmUJWEZTX0JUUkVFX0VSUk9SCQkxCiAKIC8qCiAgKiBDb252ZXJ0IGZyb20gYnVmZmVyIHRvIGJ0cmVlIGJsb2NrIGhlYWRlci4KICAqLwotI2RlZmluZQlYRlNfQlVGX1RPX0JMT0NLKGJwKQkoKHhmc19idHJlZV9ibG9ja190ICopWEZTX0JVRl9QVFIoYnApKQotI2RlZmluZQlYRlNfQlVGX1RPX0xCTE9DSyhicCkJKCh4ZnNfYnRyZWVfbGJsb2NrX3QgKilYRlNfQlVGX1BUUihicCkpCi0jZGVmaW5lCVhGU19CVUZfVE9fU0JMT0NLKGJwKQkoKHhmc19idHJlZV9zYmxvY2tfdCAqKVhGU19CVUZfUFRSKGJwKSkKKyNkZWZpbmUJWEZTX0JVRl9UT19CTE9DSyhicCkJKChzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICopWEZTX0JVRl9QVFIoYnApKQogCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZmRlZiBERUJVRwogLyoKLSAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQgYmxvY2sgaGVhZGVyIGlzIG9rLgorICogQ2hlY2sgdGhhdCBibG9jayBoZWFkZXIgaXMgb2suCiAgKi8KLXZvaWQKK2ludAogeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrLAkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jaywJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCiAJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLwogCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jaywgaWYgYW55ICovCiAKIC8qCi0gKiBEZWJ1ZyByb3V0aW5lOiBjaGVjayB0aGF0IGtleXMgYXJlIGluIHRoZSByaWdodCBvcmRlci4KLSAqLwotdm9pZAoteGZzX2J0cmVlX2NoZWNrX2tleSgKLQl4ZnNfYnRudW1fdAkJYnRudW0sCS8qIGJ0cmVlIGlkZW50aWZpZXIgKi8KLQl2b2lkCQkJKmFrMSwJLyogcG9pbnRlciB0byBsZWZ0IChsb3dlcikga2V5ICovCi0Jdm9pZAkJCSphazIpOwkvKiBwb2ludGVyIHRvIHJpZ2h0IChoaWdoZXIpIGtleSAqLwotCi0vKgotICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCByZWNvcmRzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCi0gKi8KLXZvaWQKLXhmc19idHJlZV9jaGVja19yZWMoCi0JeGZzX2J0bnVtX3QJCWJ0bnVtLAkvKiBidHJlZSBpZGVudGlmaWVyICovCi0Jdm9pZAkJCSphcjEsCS8qIHBvaW50ZXIgdG8gbGVmdCAobG93ZXIpIHJlY29yZCAqLwotCXZvaWQJCQkqYXIyKTsJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSByZWNvcmQgKi8KLSNlbHNlCi0jZGVmaW5lCXhmc19idHJlZV9jaGVja19ibG9jayhhLGIsYyxkKQotI2RlZmluZQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGEsYixjKQotI2RlZmluZQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGEsYixjKQotI2VuZGlmCS8qIERFQlVHICovCi0KLS8qCi0gKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IGxvbmcgZm9ybSBibG9jayBoZWFkZXIgaXMgb2suCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLwoteGZzX2J0cmVlX2NoZWNrX2xibG9jaygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19idHJlZV9sYmxvY2tfdAkqYmxvY2ssCS8qIGJ0cmVlIGxvbmcgZm9ybSBibG9jayBwb2ludGVyICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLwotCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jaywgaWYgYW55ICovCi0KLS8qCi0gKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChsb25nKSBwb2ludGVyIGlzIG9rLgorICogQ2hlY2sgdGhhdCAobG9uZykgcG9pbnRlciBpcyBvay4KICAqLwogaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCiB4ZnNfYnRyZWVfY2hlY2tfbHB0cigKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwogCXhmc19kZnNibm9fdAkJcHRyLAkvKiBidHJlZSBibG9jayBkaXNrIGFkZHJlc3MgKi8KIAlpbnQJCQlsZXZlbCk7CS8qIGJ0cmVlIGJsb2NrIGxldmVsICovCiAKLSNkZWZpbmUgeGZzX2J0cmVlX2NoZWNrX2xwdHJfZGlzayhjdXIsIHB0ciwgbGV2ZWwpIFwKLQl4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIGJlNjRfdG9fY3B1KHB0ciksIGxldmVsKQotCi0vKgotICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCBzaG9ydCBmb3JtIGJsb2NrIGhlYWRlciBpcyBvay4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCi14ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J0cmVlX3NibG9ja190CSpibG9jaywJLyogYnRyZWUgc2hvcnQgZm9ybSBibG9jayBwb2ludGVyICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLwotCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLwotCi0vKgotICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCAoc2hvcnQpIHBvaW50ZXIgaXMgb2suCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLwoteGZzX2J0cmVlX2NoZWNrX3NwdHIoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdibG9ja190CQlwdHIsCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLwotCWludAkJCWxldmVsKTsJLyogYnRyZWUgYmxvY2sgbGV2ZWwgKi8KLQogLyoKICAqIERlbGV0ZSB0aGUgYnRyZWUgY3Vyc29yLgogICovCkBAIC0yODEsMTUgKzMyMyw2IEBACiAJeGZzX2J0cmVlX2N1cl90CQkqKm5jdXIpOy8qIG91dHB1dCBjdXJzb3IgKi8KIAogLyoKLSAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGN1cnJlbnQgYmxvY2sKLSAqIGF0IHRoZSBnaXZlbiBsZXZlbC4gIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KLSAqLwotaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLwoteGZzX2J0cmVlX2ZpcnN0cmVjKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwpOwkvKiBsZXZlbCB0byBjaGFuZ2UgKi8KLQotLyoKICAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgd2l0aCBubyBkYXRhIHJlYWQuCiAgKiBMb25nLWZvcm0gYWRkcmVzc2luZy4KICAqLwpAQCAtMzEzLDIwICszNDYsNiBAQAogCXVpbnQJCQlsb2NrKTsJLyogbG9jayBmbGFncyBmb3IgZ2V0X2J1ZiAqLwogCiAvKgotICogQWxsb2NhdGUgYSBuZXcgYnRyZWUgY3Vyc29yLgotICogVGhlIGN1cnNvciBpcyBlaXRoZXIgZm9yIGFsbG9jYXRpb24gKEEpIG9yIGJtYXAgKEIpLgotICovCi14ZnNfYnRyZWVfY3VyX3QgKgkJCS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KLXhmc19idHJlZV9pbml0X2N1cnNvcigKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfYnVmCQkqYWdicCwJLyogKEEgb25seSkgYnVmZmVyIGZvciBhZ2Ygc3RydWN0dXJlICovCi0JeGZzX2FnbnVtYmVyX3QJCWFnbm8sCS8qIChBIG9ubHkpIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCi0JeGZzX2J0bnVtX3QJCWJ0bnVtLAkvKiBidHJlZSBpZGVudGlmaWVyICovCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIChCIG9ubHkpIGlub2RlIG93bmluZyB0aGUgYnRyZWUgKi8KLQlpbnQJCQl3aGljaGZvcmspOyAvKiAoQiBvbmx5KSBkYXRhL2F0dHIgZm9yayAqLwotCi0vKgogICogQ2hlY2sgZm9yIHRoZSBjdXJzb3IgcmVmZXJyaW5nIHRvIHRoZSBsYXN0IGJsb2NrIGF0IHRoZSBnaXZlbiBsZXZlbC4KICAqLwogaW50CQkJCQkvKiAxPWlzIGxhc3QgYmxvY2ssIDA9bm90IGxhc3QgYmxvY2sgKi8KQEAgLTMzNSwxNSArMzU0LDYgQEAKIAlpbnQJCQlsZXZlbCk7CS8qIGxldmVsIHRvIGNoZWNrICovCiAKIC8qCi0gKiBDaGFuZ2UgdGhlIGN1cnNvciB0byBwb2ludCB0byB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIGN1cnJlbnQgYmxvY2sKLSAqIGF0IHRoZSBnaXZlbiBsZXZlbC4gIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KLSAqLwotaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLwoteGZzX2J0cmVlX2xhc3RyZWMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCk7CS8qIGxldmVsIHRvIGNoYW5nZSAqLwotCi0vKgogICogQ29tcHV0ZSBmaXJzdCBhbmQgbGFzdCBieXRlIG9mZnNldHMgZm9yIHRoZSBmaWVsZHMgZ2l2ZW4uCiAgKiBJbnRlcnByZXRzIHRoZSBvZmZzZXRzIHRhYmxlLCB3aGljaCBjb250YWlucyBzdHJ1Y3QgZmllbGQgb2Zmc2V0cy4KICAqLwpAQCAtNDA0LDI5ICs0MTQsNiBAQAogCXhmc19leHRsZW5fdAkJY291bnQpOwkvKiBjb3VudCBvZiBmaWxlc3lzdGVtIGJsb2NrcyAqLwogCiAvKgotICogUmVhZC1haGVhZCBidHJlZSBibG9ja3MsIGF0IHRoZSBnaXZlbiBsZXZlbC4KLSAqIEJpdHMgaW4gbHIgYXJlIHNldCBmcm9tIFhGU19CVENVUl97TEVGVCxSSUdIVH1SQS4KLSAqLwotaW50CQkJCQkvKiByZWFkYWhlYWQgYmxvY2sgY291bnQgKi8KLXhmc19idHJlZV9yZWFkYWhlYWRfY29yZSgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KLQlpbnQJCQlscik7CS8qIGxlZnQvcmlnaHQgYml0cyAqLwotCi1zdGF0aWMgaW5saW5lIGludAkJCS8qIHJlYWRhaGVhZCBibG9jayBjb3VudCAqLwoteGZzX2J0cmVlX3JlYWRhaGVhZCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KLQlpbnQJCQlscikJLyogbGVmdC9yaWdodCBiaXRzICovCi17Ci0JaWYgKChjdXItPmJjX3JhW2xldl0gfCBscikgPT0gY3VyLT5iY19yYVtsZXZdKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB4ZnNfYnRyZWVfcmVhZGFoZWFkX2NvcmUoY3VyLCBsZXYsIGxyKTsKLX0KLQotCi0vKgogICogU2V0IHRoZSBidWZmZXIgZm9yIGxldmVsICJsZXYiIGluIHRoZSBjdXJzb3IgdG8gYnAsIHJlbGVhc2luZwogICogYW55IHByZXZpb3VzIGJ1ZmZlci4KICAqLwpAQCAtNDM2LDcgKzQyMyw0NCBAQAogCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsJLyogbmV3IGJ1ZmZlciB0byBzZXQgKi8KIAotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworLyoKKyAqIENvbW1vbiBidHJlZSBjb3JlIGVudHJ5IHBvaW50cy4KKyAqLworaW50IHhmc19idHJlZV9pbmNyZW1lbnQoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQgKik7CitpbnQgeGZzX2J0cmVlX2RlY3JlbWVudChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsIGludCAqKTsKK2ludCB4ZnNfYnRyZWVfbG9va3VwKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIHhmc19sb29rdXBfdCwgaW50ICopOworaW50IHhmc19idHJlZV91cGRhdGUoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgdW5pb24geGZzX2J0cmVlX3JlYyAqKTsKK2ludCB4ZnNfYnRyZWVfbmV3X2lyb290KHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIGludCAqLCBpbnQgKik7CitpbnQgeGZzX2J0cmVlX2tpbGxfaXJvb3Qoc3RydWN0IHhmc19idHJlZV9jdXIgKik7CitpbnQgeGZzX2J0cmVlX2luc2VydChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7CitpbnQgeGZzX2J0cmVlX2RlbGV0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQgKik7CitpbnQgeGZzX2J0cmVlX2dldF9yZWMoc3RydWN0IHhmc19idHJlZV9jdXIgKiwgdW5pb24geGZzX2J0cmVlX3JlYyAqKiwgaW50ICopOworCisvKgorICogSW50ZXJuYWwgYnRyZWUgaGVscGVycyBhbHNvIHVzZWQgYnkgeGZzX2JtYXAuYy4KKyAqLwordm9pZCB4ZnNfYnRyZWVfbG9nX2Jsb2NrKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICosIHN0cnVjdCB4ZnNfYnVmICosIGludCk7Cit2b2lkIHhmc19idHJlZV9sb2dfcmVjcyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCBpbnQsIGludCk7CisKKy8qCisgKiBIZWxwZXJzLgorICovCitzdGF0aWMgaW5saW5lIGludCB4ZnNfYnRyZWVfZ2V0X251bXJlY3Moc3RydWN0IHhmc19idHJlZV9ibG9jayAqYmxvY2spCit7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhmc19idHJlZV9zZXRfbnVtcmVjcyhzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrICpibG9jaywKKwkJX191aW50MTZfdCBudW1yZWNzKQoreworCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYobnVtcmVjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19idHJlZV9nZXRfbGV2ZWwoc3RydWN0IHhmc19idHJlZV9ibG9jayAqYmxvY2spCit7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9sZXZlbCk7Cit9CiAKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWVfdHJhY2UuYyBiL2ZzL3hmcy94ZnNfYnRyZWVfdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZmOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19idHJlZV90cmFjZS5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZV90cmFjZS5oIgorCitTVEFUSUMgdm9pZAoreGZzX2J0cmVlX3RyYWNlX3B0cigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJcHRyLAorCV9fcHN1bnNpZ25lZF90CQkqaGlnaCwKKwlfX3BzdW5zaWduZWRfdAkJKmxvdykKK3sKKwlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpIHsKKwkJX191NjQgdmFsID0gYmU2NF90b19jcHUocHRyLmwpOworCQkqaGlnaCA9IHZhbCA+PiAzMjsKKwkJKmxvdyA9IChpbnQpdmFsOworCX0gZWxzZSB7CisJCSpoaWdoID0gMDsKKwkJKmxvdyA9IGJlMzJfdG9fY3B1KHB0ci5zKTsKKwl9Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGEgYnVmZmVyICYgMSBpbnRlZ2VyIGFyZy4KKyAqLwordm9pZAoreGZzX2J0cmVlX3RyYWNlX2FyZ2JpKAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpiLAorCWludAkJCWksCisJaW50CQkJbGluZSkKK3sKKwljdXItPmJjX29wcy0+dHJhY2VfZW50ZXIoY3VyLCBmdW5jLCBYQlRfQVJHUywgWEZTX0JUUkVFX0tUUkFDRV9BUkdCSSwKKwkJCQkgbGluZSwgKF9fcHN1bnNpZ25lZF90KWIsIGksIDAsIDAsIDAsIDAsIDAsCisJCQkJIDAsIDAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBhIGJ1ZmZlciAmIDIgaW50ZWdlciBhcmdzLgorICovCit2b2lkCit4ZnNfYnRyZWVfdHJhY2VfYXJnYmlpKAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpiLAorCWludAkJCWkwLAorCWludAkJCWkxLAorCWludAkJCWxpbmUpCit7CisJY3VyLT5iY19vcHMtPnRyYWNlX2VudGVyKGN1ciwgZnVuYywgWEJUX0FSR1MsIFhGU19CVFJFRV9LVFJBQ0VfQVJHQklJLAorCQkJCSBsaW5lLCAoX19wc3Vuc2lnbmVkX3QpYiwgaTAsIGkxLCAwLCAwLCAwLCAwLAorCQkJCSAwLCAwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgMyBibG9jay1sZW5ndGggYXJncworICogYW5kIGFuIGludGVnZXIgYXJnLgorICovCit2b2lkCit4ZnNfYnRyZWVfdHJhY2VfYXJnZmZmaSgKKwljb25zdCBjaGFyCQkqZnVuYywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXhmc19kZmlsb2ZmX3QJCW8sCisJeGZzX2Rmc2Jub190CQliLAorCXhmc19kZmlsYmxrc190CQlpLAorCWludAkJCWosCisJaW50CQkJbGluZSkKK3sKKwljdXItPmJjX29wcy0+dHJhY2VfZW50ZXIoY3VyLCBmdW5jLCBYQlRfQVJHUywgWEZTX0JUUkVFX0tUUkFDRV9BUkdGRkZJLAorCQkJCSBsaW5lLAorCQkJCSBvID4+IDMyLCAoaW50KW8sCisJCQkJIGIgPj4gMzIsIChpbnQpYiwKKwkJCQkgaSA+PiAzMiwgKGludClpLAorCQkJCSAoaW50KWosIDAsIDAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBvbmUgaW50ZWdlciBhcmcuCisgKi8KK3ZvaWQKK3hmc19idHJlZV90cmFjZV9hcmdpKAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJaSwKKwlpbnQJCQlsaW5lKQoreworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0ksCisJCQkJIGxpbmUsIGksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIGtleS4KKyAqLwordm9pZAoreGZzX2J0cmVlX3RyYWNlX2FyZ2lwaygKKwljb25zdCBjaGFyCQkqZnVuYywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWksCisJdW5pb24geGZzX2J0cmVlX3B0cglwdHIsCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAorCWludAkJCWxpbmUpCit7CisJX19wc3Vuc2lnbmVkX3QJCWhpZ2gsIGxvdzsKKwlfX3VpbnQ2NF90CQlsMCwgbDE7CisKKwl4ZnNfYnRyZWVfdHJhY2VfcHRyKGN1ciwgcHRyLCAmaGlnaCwgJmxvdyk7CisJY3VyLT5iY19vcHMtPnRyYWNlX2tleShjdXIsIGtleSwgJmwwLCAmbDEpOworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQSywKKwkJCQkgbGluZSwgaSwgaGlnaCwgbG93LAorCQkJCSBsMCA+PiAzMiwgKGludClsMCwKKwkJCQkgbDEgPj4gMzIsIChpbnQpbDEsCisJCQkJIDAsIDAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIHJlYy4KKyAqLwordm9pZAoreGZzX2J0cmVlX3RyYWNlX2FyZ2lwcigKKwljb25zdCBjaGFyCQkqZnVuYywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWksCisJdW5pb24geGZzX2J0cmVlX3B0cglwdHIsCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjLAorCWludAkJCWxpbmUpCit7CisJX19wc3Vuc2lnbmVkX3QJCWhpZ2gsIGxvdzsKKwlfX3VpbnQ2NF90CQlsMCwgbDEsIGwyOworCisJeGZzX2J0cmVlX3RyYWNlX3B0cihjdXIsIHB0ciwgJmhpZ2gsICZsb3cpOworCWN1ci0+YmNfb3BzLT50cmFjZV9yZWNvcmQoY3VyLCByZWMsICZsMCwgJmwxLCAmbDIpOworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQUiwKKwkJCSAgICAgIGxpbmUsIGksCisJCQkgICAgICBoaWdoLCBsb3csCisJCQkgICAgICBsMCA+PiAzMiwgKGludClsMCwKKwkJCSAgICAgIGwxID4+IDMyLCAoaW50KWwxLAorCQkJICAgICAgbDIgPj4gMzIsIChpbnQpbDIsCisJCQkgICAgICAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgaW50LCBrZXkuCisgKi8KK3ZvaWQKK3hmc19idHJlZV90cmFjZV9hcmdpaygKKwljb25zdCBjaGFyCQkqZnVuYywKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWksCisJdW5pb24geGZzX2J0cmVlX2tleQkqa2V5LAorCWludAkJCWxpbmUpCit7CisJX191aW50NjRfdAkJbDAsIGwxOworCisJY3VyLT5iY19vcHMtPnRyYWNlX2tleShjdXIsIGtleSwgJmwwLCAmbDEpOworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR0lLLAorCQkJCSBsaW5lLCBpLAorCQkJCSBsMCA+PiAzMiwgKGludClsMCwKKwkJCQkgbDEgPj4gMzIsIChpbnQpbDEsCisJCQkJIDAsIDAsIDAsIDAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciByZWNvcmQuCisgKi8KK3ZvaWQKK3hmc19idHJlZV90cmFjZV9hcmdyKAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjLAorCWludAkJCWxpbmUpCit7CisJX191aW50NjRfdAkJbDAsIGwxLCBsMjsKKworCWN1ci0+YmNfb3BzLT50cmFjZV9yZWNvcmQoY3VyLCByZWMsICZsMCwgJmwxLCAmbDIpOworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIFhCVF9BUkdTLCBYRlNfQlRSRUVfS1RSQUNFX0FSR1IsCisJCQkgICAgICBsaW5lLAorCQkJICAgICAgbDAgPj4gMzIsIChpbnQpbDAsCisJCQkgICAgICBsMSA+PiAzMiwgKGludClsMSwKKwkJCSAgICAgIGwyID4+IDMyLCAoaW50KWwyLAorCQkJICAgICAgMCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIHRoZSBjdXJzb3Ivb3BlcmF0aW9uLgorICovCit2b2lkCit4ZnNfYnRyZWVfdHJhY2VfY3Vyc29yKAorCWNvbnN0IGNoYXIJCSpmdW5jLAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJdHlwZSwKKwlpbnQJCQlsaW5lKQoreworCV9fdWludDMyX3QJCXMwOworCV9fdWludDY0X3QJCWwwLCBsMTsKKwljaGFyCQkJKnM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhCVF9BUkdTOgorCQlzID0gImFyZ3MiOworCQlicmVhazsKKwljYXNlIFhCVF9FTlRSWToKKwkJcyA9ICJlbnRyeSI7CisJCWJyZWFrOworCWNhc2UgWEJUX0VSUk9SOgorCQlzID0gImVycm9yIjsKKwkJYnJlYWs7CisJY2FzZSBYQlRfRVhJVDoKKwkJcyA9ICJleGl0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCisJY3VyLT5iY19vcHMtPnRyYWNlX2N1cnNvcihjdXIsICZzMCwgJmwwLCAmbDEpOworCWN1ci0+YmNfb3BzLT50cmFjZV9lbnRlcihjdXIsIGZ1bmMsIHMsIFhGU19CVFJFRV9LVFJBQ0VfQ1VSLCBsaW5lLAorCQkJCSBzMCwKKwkJCQkgbDAgPj4gMzIsIChpbnQpbDAsCisJCQkJIGwxID4+IDMyLCAoaW50KWwxLAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzBdLAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzFdLAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzJdLAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpY3VyLT5iY19idWZzWzNdLAorCQkJCSAoY3VyLT5iY19wdHJzWzBdIDw8IDE2KSB8IGN1ci0+YmNfcHRyc1sxXSwKKwkJCQkgKGN1ci0+YmNfcHRyc1syXSA8PCAxNikgfCBjdXItPmJjX3B0cnNbM10pOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZV90cmFjZS5oIGIvZnMveGZzL3hmc19idHJlZV90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjVlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2J0cmVlX3RyYWNlLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBfX1hGU19CVFJFRV9UUkFDRV9IX18KKyNkZWZpbmUJX19YRlNfQlRSRUVfVFJBQ0VfSF9fCisKK3N0cnVjdCB4ZnNfYnRyZWVfY3VyOworc3RydWN0IHhmc19idWY7CisKKworLyoKKyAqIFRyYWNlIGhvb2tzLgorICogaSxqID0gaW50ZWdlciAoMzIgYml0KQorICogYiA9IGJ0cmVlIGJsb2NrIGJ1ZmZlciAoeGZzX2J1Zl90KQorICogcCA9IGJ0cmVlIHB0cgorICogciA9IGJ0cmVlIHJlY29yZAorICogayA9IGJ0cmVlIGtleQorICovCisKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKKworLyoKKyAqIFRyYWNlIGJ1ZmZlciBlbnRyeSB0eXBlcy4KKyAqLworI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0JJICAgMQorI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0JJSSAgMgorI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0ZGRkkgMworI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0kgICAgNAorI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQSyAgNQorI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lQUiAgNgorI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR0lLICAgNworI2RlZmluZSBYRlNfQlRSRUVfS1RSQUNFX0FSR1IJIDgKKyNkZWZpbmUgWEZTX0JUUkVFX0tUUkFDRV9DVVIgICAgIDkKKworLyoKKyAqIFN1Yi10eXBlcyBmb3IgY3Vyc29yIHRyYWNlcy4KKyAqLworI2RlZmluZSBYQlRfQVJHUwkwCisjZGVmaW5lIFhCVF9FTlRSWQkxCisjZGVmaW5lIFhCVF9FUlJPUgkyCisjZGVmaW5lIFhCVF9FWElUCTMKKwordm9pZCB4ZnNfYnRyZWVfdHJhY2VfYXJnYmkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCQlzdHJ1Y3QgeGZzX2J1ZiAqLCBpbnQsIGludCk7Cit2b2lkIHhmc19idHJlZV90cmFjZV9hcmdiaWkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCQlzdHJ1Y3QgeGZzX2J1ZiAqLCBpbnQsIGludCwgaW50KTsKK3ZvaWQgeGZzX2J0cmVlX3RyYWNlX2FyZ2ZmZmkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCQl4ZnNfZGZpbG9mZl90LCB4ZnNfZGZzYm5vX3QsIHhmc19kZmlsYmxrc190LCBpbnQsIGludCk7Cit2b2lkIHhmc19idHJlZV90cmFjZV9hcmdpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQpOwordm9pZCB4ZnNfYnRyZWVfdHJhY2VfYXJnaXBrKGNvbnN0IGNoYXIgKiwgc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LAorCQl1bmlvbiB4ZnNfYnRyZWVfcHRyLCB1bmlvbiB4ZnNfYnRyZWVfa2V5ICosIGludCk7Cit2b2lkIHhmc19idHJlZV90cmFjZV9hcmdpcHIoY29uc3QgY2hhciAqLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLCBpbnQsCisJCXVuaW9uIHhmc19idHJlZV9wdHIsIHVuaW9uIHhmc19idHJlZV9yZWMgKiwgaW50KTsKK3ZvaWQgeGZzX2J0cmVlX3RyYWNlX2FyZ2lrKGNvbnN0IGNoYXIgKiwgc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LAorCQl1bmlvbiB4ZnNfYnRyZWVfa2V5ICosIGludCk7Cit2b2lkIHhmc19idHJlZV90cmFjZV9hcmdyKGNvbnN0IGNoYXIgKiwgc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwkJdW5pb24geGZzX2J0cmVlX3JlYyAqLCBpbnQpOwordm9pZCB4ZnNfYnRyZWVfdHJhY2VfY3Vyc29yKGNvbnN0IGNoYXIgKiwgc3RydWN0IHhmc19idHJlZV9jdXIgKiwgaW50LCBpbnQpOworCisKKyNkZWZpbmUgWEZTX0FMTE9DQlRfVFJBQ0VfU0laRQk0MDk2CS8qIHNpemUgb2YgZ2xvYmFsIHRyYWNlIGJ1ZmZlciAqLworZXh0ZXJuIGt0cmFjZV90CSp4ZnNfYWxsb2NidF90cmFjZV9idWY7CisKKyNkZWZpbmUgWEZTX0lOT0JUX1RSQUNFX1NJWkUJNDA5NgkvKiBzaXplIG9mIGdsb2JhbCB0cmFjZSBidWZmZXIgKi8KK2V4dGVybiBrdHJhY2VfdAkqeGZzX2lub2J0X3RyYWNlX2J1ZjsKKworI2RlZmluZSBYRlNfQk1CVF9UUkFDRV9TSVpFCTQwOTYJLyogc2l6ZSBvZiBnbG9iYWwgdHJhY2UgYnVmZmVyICovCisjZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9TSVpFCTMyCS8qIHNpemUgb2YgcGVyLWlub2RlIHRyYWNlIGJ1ZmZlciAqLworZXh0ZXJuIGt0cmFjZV90CSp4ZnNfYm1idF90cmFjZV9idWY7CisKKworI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHQkkoYywgYiwgaSkJXAorCXhmc19idHJlZV90cmFjZV9hcmdiaShfX2Z1bmNfXywgYywgYiwgaSwgX19MSU5FX18pCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdCSUkoYywgYiwgaSwgaikJXAorCXhmc19idHJlZV90cmFjZV9hcmdiaWkoX19mdW5jX18sIGMsIGIsIGksIGosIF9fTElORV9fKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHRkZGSShjLCBvLCBiLCBpLCBqKQlcCisJeGZzX2J0cmVlX3RyYWNlX2FyZ2ZmZmkoX19mdW5jX18sIGMsIG8sIGIsIGksIGosIF9fTElORV9fKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjLCBpKQlcCisJeGZzX2J0cmVlX3RyYWNlX2FyZ2koX19mdW5jX18sIGMsIGksIF9fTElORV9fKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSVBLKGMsIGksIHAsIGspCVwKKwl4ZnNfYnRyZWVfdHJhY2VfYXJnaXBrKF9fZnVuY19fLCBjLCBpLCBwLCBrLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0lQUihjLCBpLCBwLCByKQlcCisJeGZzX2J0cmVlX3RyYWNlX2FyZ2lwcihfX2Z1bmNfXywgYywgaSwgcCwgciwgX19MSU5FX18pCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdJSyhjLCBpLCBrKQlcCisJeGZzX2J0cmVlX3RyYWNlX2FyZ2lrKF9fZnVuY19fLCBjLCBpLCBrLCBfX0xJTkVfXykKKyNkZWZpbmUgWEZTX0JUUkVFX1RSQUNFX0FSR1IoYywgcikJXAorCXhmc19idHJlZV90cmFjZV9hcmdyKF9fZnVuY19fLCBjLCByLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjLCB0KQlcCisJeGZzX2J0cmVlX3RyYWNlX2N1cnNvcihfX2Z1bmNfXywgYywgdCwgX19MSU5FX18pCisjZWxzZQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHQkkoYywgYiwgaSkKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0JJSShjLCBiLCBpLCBqKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHRkZGSShjLCBvLCBiLCBpLCBqKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSShjLCBpKQorI2RlZmluZQlYRlNfQlRSRUVfVFJBQ0VfQVJHSVBLKGMsIGksIHAsIHMpCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9BUkdJUFIoYywgaSwgcCwgcikKKyNkZWZpbmUJWEZTX0JUUkVFX1RSQUNFX0FSR0lLKGMsIGksIGspCisjZGVmaW5lIFhGU19CVFJFRV9UUkFDRV9BUkdSKGMsIHIpCisjZGVmaW5lCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoYywgdCkKKyNlbmRpZgkvKiBYRlNfQlRSRUVfVFJBQ0UgKi8KKworI2VuZGlmIC8qIF9fWEZTX0JUUkVFX1RSQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCmluZGV4IDAwMmZjMjYuLjkyYWY0MDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwLAogCWludAkJCXN0YWxlKQogewotCXhmc19tb3VudF90CSptcDsKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscDsKIAl4ZnNfYnVmX3QJKmJwOwogCWludAkJZnJlZWQ7CiAKQEAgLTM4Nyw3ICszODcsNyBAQAogCXhmc19idWZ0cmFjZSgiWEZTX1VOUElOIiwgYnApOwogCiAJZnJlZWQgPSBhdG9taWNfZGVjX2FuZF90ZXN0KCZiaXAtPmJsaV9yZWZjb3VudCk7Ci0JbXAgPSBiaXAtPmJsaV9pdGVtLmxpX21vdW50cDsKKwlhaWxwID0gYmlwLT5ibGlfaXRlbS5saV9haWxwOwogCXhmc19idW5waW4oYnApOwogCWlmIChmcmVlZCAmJiBzdGFsZSkgewogCQlBU1NFUlQoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKTsKQEAgLTM5OSwxNyArMzk5LDE3IEBACiAJCXhmc19idWZ0cmFjZSgiWEZTX1VOUElOIFNUQUxFIiwgYnApOwogCQkvKgogCQkgKiBJZiB3ZSBnZXQgY2FsbGVkIGhlcmUgYmVjYXVzZSBvZiBhbiBJTyBlcnJvciwgd2UgbWF5Ci0JCSAqIG9yIG1heSBub3QgaGF2ZSB0aGUgaXRlbSBvbiB0aGUgQUlMLiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpCisJCSAqIG9yIG1heSBub3QgaGF2ZSB0aGUgaXRlbSBvbiB0aGUgQUlMLiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpCiAJCSAqIHdpbGwgdGFrZSBjYXJlIG9mIHRoYXQgc2l0dWF0aW9uLgotCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJICogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCSAqLwogCQlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFX0lOT0RFKSB7CiAJCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgKHhmc19sb2dfaXRlbV90ICopYmlwKTsKIAkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CiAJCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CiAJCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOworCQkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCk7CiAJCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOwogCQkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopID09IE5VTEwpOwogCQl9CkBAIC03MDcsOCArNzA3LDggQEAKIAkgKiB0aGUgZmlyc3QuICBJZiB3ZSBkbyBhbHJlYWR5IGhhdmUgb25lLCB0aGVyZSBpcwogCSAqIG5vdGhpbmcgdG8gZG8gaGVyZSBzbyByZXR1cm4uCiAJICovCi0JaWYgKFhGU19CVUZfRlNQUklWQVRFMyhicCwgeGZzX21vdW50X3QgKikgIT0gbXApCi0JCVhGU19CVUZfU0VUX0ZTUFJJVkFURTMoYnAsIG1wKTsKKwlpZiAoYnAtPmJfbW91bnQgIT0gbXApCisJCWJwLT5iX21vdW50ID0gbXA7CiAJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4ZnNfYmRzdHJhdF9jYik7CiAJaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKIAkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOwpAQCAtNzMxLDYgKzczMSw3IEBACiAJYmlwLT5ibGlfaXRlbS5saV90eXBlID0gWEZTX0xJX0JVRjsKIAliaXAtPmJsaV9pdGVtLmxpX29wcyA9ICZ4ZnNfYnVmX2l0ZW1fb3BzOwogCWJpcC0+YmxpX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJYmlwLT5ibGlfaXRlbS5saV9haWxwID0gbXAtPm1fYWlsOwogCWJpcC0+YmxpX2J1ZiA9IGJwOwogCXhmc19idWZfaG9sZChicCk7CiAJYmlwLT5ibGlfZm9ybWF0LmJsZl90eXBlID0gWEZTX0xJX0JVRjsKQEAgLTk5NywyMSArOTk4LDcgQEAKIAkJCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwLCBsaXApOwogCQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKIAkJCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKLQotCQkJLyoKLQkJCSAqIFhGU19TSFVUIGZsYWcgZ2V0cyBzZXQgd2hlbiB3ZSBnbyB0aHJ1IHRoZQotCQkJICogZW50aXJlIGJ1ZmZlciBjYWNoZSBhbmQgZGVsaWJlcmF0ZWx5IHN0YXJ0Ci0JCQkgKiB0aHJvd2luZyBhd2F5IGRlbGF5ZWQgd3JpdGUgYnVmZmVycy4KLQkJCSAqIFNpbmNlIHRoZXJlJ3Mgbm8gYmlvd2FpdCBkb25lIG9uIHRob3NlLAotCQkJICogd2Ugc2hvdWxkIGp1c3QgYnJlbHNlIHRoZW0uCi0JCQkgKi8KLQkJCWlmIChYRlNfQlVGX0lTU0hVVChicCkpIHsKLQkJCSAgICBYRlNfQlVGX1VOU0hVVChicCk7Ci0JCQkJeGZzX2J1Zl9yZWxzZShicCk7Ci0JCQl9IGVsc2UgewotCQkJCXhmc19iaW9kb25lKGJwKTsKLQkJCX0KLQorCQkJeGZzX2Jpb2RvbmUoYnApOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTExMjIsMjcgKzExMDksMjMgQEAKIAl4ZnNfYnVmX3QJCSpicCwKIAl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKIHsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcDsKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBiaXAtPmJsaV9pdGVtLmxpX2FpbHA7CiAKIAlBU1NFUlQoYmlwLT5ibGlfYnVmID09IGJwKTsKIAogCXhmc19idWZfcmVsZShicCk7Ci0JbXAgPSBiaXAtPmJsaV9pdGVtLmxpX21vdW50cDsKIAogCS8qCiAJICogSWYgd2UgYXJlIGZvcmNpYmx5IHNodXR0aW5nIGRvd24sIHRoaXMgbWF5IHdlbGwgYmUKIAkgKiBvZmYgdGhlIEFJTCBhbHJlYWR5LiBUaGF0J3MgYmVjYXVzZSB3ZSBzaW11bGF0ZSB0aGUKIAkgKiBsb2ctY29tbWl0dGVkIGNhbGxiYWNrcyB0byB1bnBpbiB0aGVzZSBidWZmZXJzLiBPciB3ZSBtYXkgbmV2ZXIKIAkgKiBoYXZlIHB1dCB0aGlzIGl0ZW0gb24gQUlMIGJlY2F1c2Ugb2YgdGhlIHRyYW5zYWN0aW9uIHdhcwotCSAqIGFib3J0ZWQgZm9yY2libHkuIHhmc190cmFuc19kZWxldGVfYWlsKCkgdGFrZXMgY2FyZSBvZiB0aGVzZS4KKwkgKiBhYm9ydGVkIGZvcmNpYmx5LiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIHRha2VzIGNhcmUgb2YgdGhlc2UuCiAJICoKIAkgKiBFaXRoZXIgd2F5LCBBSUwgaXMgdXNlbGVzcyBpZiB3ZSdyZSBmb3JjaW5nIGEgc2h1dGRvd24uCiAJICovCi0Jc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JLyoKLQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KLQkgKi8KLQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopYmlwKTsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCk7CiAJeGZzX2J1Zl9pdGVtX2ZyZWUoYmlwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19jbG50LmggYi9mcy94ZnMveGZzX2NsbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZTVkZC4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2NsbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotI2lmbmRlZiBfX1hGU19DTE5UX0hfXwotI2RlZmluZSBfX1hGU19DTE5UX0hfXwotCi0vKgotICogWEZTIGFyZ3VtZW50cyBzdHJ1Y3R1cmUsIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFyZ3VtZW50cyB3ZQotICogYXJlIHBhc3NlZCB2aWEgdGhlIG1vdW50IHN5c3RlbSBjYWxsLgotICoKLSAqIE5PVEU6IFRoZSBtb3VudCBzeXN0ZW0gY2FsbCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IGJldHdlZW4KLSAqIExpbnV4IGFuZCBJUklYLiAgSW4gSVJJWCB3ZSB3b3JrZWQgd29yayB3aXRoIGEgYmluYXJ5IGRhdGEKLSAqIHN0cnVjdHVyZSBjb21pbmcgaW4gYWNyb3NzIHRoZSBzeXNjYWxsIGludGVyZmFjZSBmcm9tIHVzZXIKLSAqIHNwYWNlICh0aGUgbW91bnQgdXNlcnNwYWNlIGtub3dzIGFib3V0IGVhY2ggZmlsZXN5c3RlbSB0eXBlCi0gKiBhbmQgdGhlIHNldCBvZiB2YWxpZCBvcHRpb25zIGZvciBpdCwgYW5kIGNvbnZlcnRzIHRoZSB1c2VycwotICogYXJndW1lbnQgc3RyaW5nIGludG8gYSBiaW5hcnkgc3RydWN0dXJlIF9iZWZvcmVfIG1ha2luZyB0aGUKLSAqIHN5c3RlbSBjYWxsKSwgYW5kIHRoZSBBQkkgaXNzdWVzIHRoYXQgdGhpcyBpbXBsaWVzLgotICoKLSAqIEluIExpbnV4LCB3ZSBhcmUgcGFzc2VkIGEgY29tbWEgc2VwYXJhdGVkIHNldCBvZiBvcHRpb25zOwotICogaWUuIGEgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiAgVXNlcnNwYWNlIG1vdW50Ci0gKiBjb2RlIGRvZXMgbm90IGhhdmUgYW55IGtub3dsZWRnZSBvZiBtb3VudCBvcHRpb25zIGV4cGVjdGVkIGJ5Ci0gKiBlYWNoIGZpbGVzeXN0ZW0gdHlwZSBhbmQgc28gZWFjaCBmaWxlc3lzdGVtIHBhcnNlcyBpdHMgbW91bnQKLSAqIG9wdGlvbnMgaW4ga2VybmVsIHNwYWNlLgotICoKLSAqIEZvciB0aGUgTGludXggcG9ydCwgd2Uga2VwdCB0aGlzIHN0cnVjdHVyZSBwcmV0dHkgbXVjaCBpbnRhY3QKLSAqIGFuZCB1c2UgaXQgaW50ZXJuYWxseSAoYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29kZSBncm9rcyBpdCkuCi0gKi8KLXN0cnVjdCB4ZnNfbW91bnRfYXJncyB7Ci0JaW50CWZsYWdzOwkJLyogZmxhZ3MgLT4gc2VlIFhGU01OVF8uLi4gbWFjcm9zIGJlbG93ICovCi0JaW50CWZsYWdzMjsJCS8qIGZsYWdzIC0+IHNlZSBYRlNNTlQyXy4uLiBtYWNyb3MgYmVsb3cgKi8KLQlpbnQJbG9nYnVmczsJLyogTnVtYmVyIG9mIGxvZyBidWZmZXJzLCAtMSB0byBkZWZhdWx0ICovCi0JaW50CWxvZ2J1ZnNpemU7CS8qIFNpemUgb2YgbG9nIGJ1ZmZlcnMsIC0xIHRvIGRlZmF1bHQgKi8KLQljaGFyCWZzbmFtZVtNQVhOQU1FTEVOKzFdOwkvKiBkYXRhIGRldmljZSBuYW1lICovCi0JY2hhcglydG5hbWVbTUFYTkFNRUxFTisxXTsJLyogcmVhbHRpbWUgZGV2aWNlIGZpbGVuYW1lICovCi0JY2hhcglsb2duYW1lW01BWE5BTUVMRU4rMV07CS8qIGpvdXJuYWwgZGV2aWNlIGZpbGVuYW1lICovCi0JY2hhcgltdHB0W01BWE5BTUVMRU4rMV07CS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQlpbnQJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCAoQkJzKSAqLwotCWludAlzd2lkdGg7CQkvKiBzdHJpcGUgd2lkdGggKEJCcyksIG11bHRpcGxlIG9mIHN1bml0ICovCi0JdWNoYXJfdCBpb3NpemVsb2c7CS8qIGxvZzIgb2YgdGhlIHByZWZlcnJlZCBJL08gc2l6ZSAqLwotCWludAlpaGFzaHNpemU7CS8qIGlub2RlIGhhc2ggdGFibGUgc2l6ZSAoYnVja2V0cykgKi8KLX07Ci0KLS8qCi0gKiBYRlMgbW91bnQgb3B0aW9uIGZsYWdzIC0tIGFyZ3MtPmZsYWdzMQotICovCi0jZGVmaW5lCVhGU01OVF9BVFRSMgkJMHgwMDAwMDAwMQkvKiBhbGxvdyBBVFRSMiBFQSBmb3JtYXQgKi8KLSNkZWZpbmUJWEZTTU5UX1dTWU5DCQkweDAwMDAwMDAyCS8qIHNhZmUgbW9kZSBuZnMgbW91bnQKLQkJCQkJCSAqIGNvbXBhdGlibGUgKi8KLSNkZWZpbmUJWEZTTU5UX0lOTzY0CQkweDAwMDAwMDA0CS8qIG1vdmUgaW5vZGUgbnVtYmVycyB1cAotCQkJCQkJICogcGFzdCAyXjMyICovCi0jZGVmaW5lIFhGU01OVF9VUVVPVEEJCTB4MDAwMDAwMDgJLyogdXNlciBxdW90YSBhY2NvdW50aW5nICovCi0jZGVmaW5lIFhGU01OVF9QUVVPVEEJCTB4MDAwMDAwMTAJLyogSVJJWCBwcmogcXVvdGEgYWNjb3VudGluZyAqLwotI2RlZmluZSBYRlNNTlRfVVFVT1RBRU5GCTB4MDAwMDAwMjAJLyogdXNlciBxdW90YSBsaW1pdAotCQkJCQkJICogZW5mb3JjZW1lbnQgKi8KLSNkZWZpbmUgWEZTTU5UX1BRVU9UQUVORgkweDAwMDAwMDQwCS8qIElSSVggcHJvamVjdCBxdW90YSBsaW1pdAotCQkJCQkJICogZW5mb3JjZW1lbnQgKi8KLSNkZWZpbmUgWEZTTU5UX1FVSUVUCQkweDAwMDAwMDgwCS8qIGRvbid0IHJlcG9ydCBtb3VudCBlcnJvcnMgKi8KLSNkZWZpbmUgWEZTTU5UX05PQUxJR04JCTB4MDAwMDAyMDAJLyogZG9uJ3QgYWxsb2NhdGUgYXQKLQkJCQkJCSAqIHN0cmlwZSBib3VuZGFyaWVzKi8KLSNkZWZpbmUgWEZTTU5UX1JFVEVSUgkJMHgwMDAwMDQwMAkvKiByZXR1cm4gZXJyb3IgdG8gdXNlciAqLwotI2RlZmluZSBYRlNNTlRfTk9SRUNPVkVSWQkweDAwMDAwODAwCS8qIG5vIHJlY292ZXJ5LCBpbXBsaWVzCi0JCQkJCQkgKiByZWFkLW9ubHkgbW91bnQgKi8KLSNkZWZpbmUgWEZTTU5UX1NIQVJFRAkJMHgwMDAwMTAwMAkvKiBzaGFyZWQgWEZTIG1vdW50ICovCi0jZGVmaW5lIFhGU01OVF9JT1NJWkUJCTB4MDAwMDIwMDAJLyogb3B0aW1pemUgZm9yIEkvTyBzaXplICovCi0jZGVmaW5lIFhGU01OVF9PU1lOQ0lTT1NZTkMJMHgwMDAwNDAwMAkvKiBvX3N5bmMgaXMgUkVBTExZIG9fc3luYyAqLwotCQkJCQkJLyogKG9zeW5jaXNkc3luYyBpcyBkZWZhdWx0KSAqLwotI2RlZmluZSBYRlNNTlRfTk9BVFRSMgkJMHgwMDAwODAwMAkvKiB0dXJuIG9mZiBBVFRSMiBFQSBmb3JtYXQgKi8KLSNkZWZpbmUgWEZTTU5UXzMyQklUSU5PREVTCTB4MDAyMDAwMDAJLyogcmVzdHJpY3QgaW5vZGVzIHRvIDMyCi0JCQkJCQkgKiBiaXRzIG9mIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgWEZTTU5UX0dRVU9UQQkJMHgwMDQwMDAwMAkvKiBncm91cCBxdW90YSBhY2NvdW50aW5nICovCi0jZGVmaW5lIFhGU01OVF9HUVVPVEFFTkYJMHgwMDgwMDAwMAkvKiBncm91cCBxdW90YSBsaW1pdAotCQkJCQkJICogZW5mb3JjZW1lbnQgKi8KLSNkZWZpbmUgWEZTTU5UX05PVVVJRAkJMHgwMTAwMDAwMAkvKiBJZ25vcmUgZnMgdXVpZCAqLwotI2RlZmluZSBYRlNNTlRfRE1BUEkJCTB4MDIwMDAwMDAJLyogZW5hYmxlIGRtYXBpL3hkc20gKi8KLSNkZWZpbmUgWEZTTU5UX0JBUlJJRVIJCTB4MDQwMDAwMDAJLyogdXNlIHdyaXRlIGJhcnJpZXJzICovCi0jZGVmaW5lIFhGU01OVF9JS0VFUAkJMHgwODAwMDAwMAkvKiBpbm9kZSBjbHVzdGVyIGRlbGV0ZSAqLwotI2RlZmluZSBYRlNNTlRfU1dBTExPQwkJMHgxMDAwMDAwMAkvKiB0dXJuIG9uIHN0cmlwZSB3aWR0aAotCQkJCQkJICogYWxsb2NhdGlvbiAqLwotI2RlZmluZSBYRlNNTlRfRElSU1lOQwkJMHg0MDAwMDAwMAkvKiBzeW5jIGNyZWF0LGxpbmssdW5saW5rLHJlbmFtZQotCQkJCQkJICogc3ltbGluayxta2RpcixybWRpcixta25vZCAqLwotI2RlZmluZSBYRlNNTlRfRkxBR1MyCQkweDgwMDAwMDAwCS8qIG1vcmUgZmxhZ3Mgc2V0IGluIGZsYWdzMiAqLwotCi0vKgotICogWEZTIG1vdW50IG9wdGlvbiBmbGFncyAtLSBhcmdzLT5mbGFnczIKLSAqLwotI2RlZmluZSBYRlNNTlQyX0NPTVBBVF9JT1NJWkUJMHgwMDAwMDAwMQkvKiBkb24ndCByZXBvcnQgbGFyZ2UgcHJlZmVycmVkCi0JCQkJCQkgKiBJL08gc2l6ZSBpbiBzdGF0KDIpICovCi0jZGVmaW5lIFhGU01OVDJfRklMRVNUUkVBTVMJMHgwMDAwMDAwMgkvKiBlbmFibGUgdGhlIGZpbGVzdHJlYW1zCi0JCQkJCQkgKiBhbGxvY2F0b3IgKi8KLQotI2VuZGlmCS8qIF9fWEZTX0NMTlRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RhX2J0cmVlLmggYi9mcy94ZnMveGZzX2RhX2J0cmVlLmgKaW5kZXggOGJlMGIwMC4uNzBiNzEwYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kYV9idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaApAQCAtNzIsMjcgKzcyLDcgQEAKIHR5cGVkZWYgc3RydWN0IHhmc19kYV9ub2RlX2hkciB4ZnNfZGFfbm9kZV9oZHJfdDsKIHR5cGVkZWYgc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5IHhmc19kYV9ub2RlX2VudHJ5X3Q7CiAKLSNkZWZpbmUgWEZTX0RBX01BWEhBU0gJKCh4ZnNfZGFoYXNoX3QpLTEpIC8qIGxhcmdlc3QgdmFsaWQgaGFzaCB2YWx1ZSAqLwotCiAjZGVmaW5lCVhGU19MQlNJWkUobXApCShtcCktPm1fc2Iuc2JfYmxvY2tzaXplCi0jZGVmaW5lCVhGU19MQkxPRyhtcCkJKG1wKS0+bV9zYi5zYl9ibG9ja2xvZwotCi0jZGVmaW5lCVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLGJubyxlbnRyeSkJXAotCSgoKGJubykgPDwgKG1wKS0+bV9kaXJjb29rX2Vsb2cpIHwgKGVudHJ5KSkKLSNkZWZpbmUJWEZTX0RBX01BS0VfQ09PS0lFKG1wLGJubyxlbnRyeSxoYXNoKQlcCi0JKCgoeGZzX29mZl90KVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLCBibm8sIGVudHJ5KSA8PCAzMikgfCAoaGFzaCkpCi0jZGVmaW5lCVhGU19EQV9DT09LSUVfSEFTSChtcCxjb29raWUpCQkoKHhmc19kYWhhc2hfdCljb29raWUpCi0jZGVmaW5lCVhGU19EQV9DT09LSUVfQk5PKG1wLGNvb2tpZSkJCVwKLQkoKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8gXAotCQkoeGZzX2RhYmxrX3QpMCA6IFwKLQkJKHhmc19kYWJsa190KSgoeGZzX29mZl90KShjb29raWUpID4+IFwKLQkJCQkoKG1wKS0+bV9kaXJjb29rX2Vsb2cgKyAzMikpKSkKLSNkZWZpbmUJWEZTX0RBX0NPT0tJRV9FTlRSWShtcCxjb29raWUpCQlcCi0JKCgoKHhmc19vZmZfdCkoY29va2llKSA+PiAzMSkgPT0gLTFMTCA/CVwKLQkJKHhmc19kYWJsa190KTAgOiBcCi0JCSh4ZnNfZGFibGtfdCkoKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gMzIpICYgXAotCQkJCSgoMSA8PCAobXApLT5tX2RpcmNvb2tfZWxvZykgLSAxKSkpKQotCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBCdHJlZSBzZWFyY2hpbmcgYW5kIG1vZGlmaWNhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCkBAIC0yMjYsOSArMjA2LDggQEAKIH07CiAKIAotI2lmZGVmIF9fS0VSTkVMX18KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICogRnVuY3Rpb24gcHJvdG90eXBlcy4KICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyoKQEAgLTI4OSw2ICsyNjgsNSBAQAogCiBleHRlcm4gc3RydWN0IGttZW1fem9uZSAqeGZzX2RhX3N0YXRlX3pvbmU7CiBleHRlcm4gc3RydWN0IGttZW1fem9uZSAqeGZzX2RhYnVmX3pvbmU7Ci0jZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX19YRlNfREFfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmMgYi9mcy94ZnMveGZzX2RmcmFnLmMKaW5kZXggNzViMGNkNC4uYjRjMWVlNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5jCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpAQCAtNDksOSArNDksOCBAQAogICovCiBpbnQKIHhmc19zd2FwZXh0KAotCXhmc19zd2FwZXh0X3QJX191c2VyICpzeHUpCisJeGZzX3N3YXBleHRfdAkqc3hwKQogewotCXhmc19zd2FwZXh0X3QJKnN4cDsKIAl4ZnNfaW5vZGVfdCAgICAgKmlwLCAqdGlwOwogCXN0cnVjdCBmaWxlCSpmaWxlLCAqdGFyZ2V0X2ZpbGU7CiAJaW50CQllcnJvciA9IDA7CkBAIC02MiwxMSArNjEsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoc3hwLCBzeHUsIHNpemVvZih4ZnNfc3dhcGV4dF90KSkpIHsKLQkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKLQkJZ290byBvdXRfZnJlZV9zeHA7Ci0JfQotCiAJLyogUHVsbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCBmZCAqLwogCWZpbGUgPSBmZ2V0KChpbnQpc3hwLT5zeF9mZHRhcmdldCk7CiAJaWYgKCFmaWxlKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmggYi9mcy94ZnMveGZzX2RmcmFnLmgKaW5kZXggZGExNzgyMC4uNGY1NWE2MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5oCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuaApAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIFN5c2NhbGwgaW50ZXJmYWNlIGZvciB4ZnNfc3dhcGV4dAogICovCi1pbnQJeGZzX3N3YXBleHQoc3RydWN0IHhmc19zd2FwZXh0IF9fdXNlciAqc3gpOworaW50CXhmc19zd2FwZXh0KHN0cnVjdCB4ZnNfc3dhcGV4dCAqc3gpOwogCiBpbnQJeGZzX3N3YXBfZXh0ZW50cyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IHhmc19pbm9kZSAqdGlwLAogCQlzdHJ1Y3QgeGZzX3N3YXBleHQgKnN4cCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpbm9kZS5oIGIvZnMveGZzL3hmc19kaW5vZGUuaAppbmRleCBjOTA2NWVhLi4xNjJlODcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKQEAgLTE4LDMyICsxOCwyOSBAQAogI2lmbmRlZiBfX1hGU19ESU5PREVfSF9fCiAjZGVmaW5lCV9fWEZTX0RJTk9ERV9IX18KIAotc3RydWN0IHhmc19idWY7Ci1zdHJ1Y3QgeGZzX21vdW50OworI2RlZmluZQlYRlNfRElOT0RFX01BR0lDCQkweDQ5NGUJLyogJ0lOJyAqLworI2RlZmluZSBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTih2KQkoKCh2KSA9PSAxIHx8ICh2KSA9PSAyKSkKIAotI2RlZmluZQlYRlNfRElOT0RFX1ZFUlNJT05fMQkxCi0jZGVmaW5lCVhGU19ESU5PREVfVkVSU0lPTl8yCTIKLSNkZWZpbmUgWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04odikJXAotCSgoKHYpID09IFhGU19ESU5PREVfVkVSU0lPTl8xIHx8ICh2KSA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMikpCi0jZGVmaW5lCVhGU19ESU5PREVfTUFHSUMJMHg0OTRlCS8qICdJTicgKi8KLQotLyoKLSAqIERpc2sgaW5vZGUgc3RydWN0dXJlLgotICogVGhpcyBpcyBqdXN0IHRoZSBoZWFkZXI7IHRoZSBpbm9kZSBpcyBleHBhbmRlZCB0byBmaWxsIGEgdmFyaWFibGUgc2l6ZQotICogd2l0aCB0aGUgbGFzdCBmaWVsZCBleHBhbmRpbmcuICBJdCBpcyBzcGxpdCBpbnRvIHRoZSBjb3JlIGFuZCAib3RoZXIiCi0gKiBiZWNhdXNlIHdlIG9ubHkgbmVlZCB0aGUgY29yZSBwYXJ0IGluIHRoZSBpbi1jb3JlIGlub2RlLgotICovCiB0eXBlZGVmIHN0cnVjdCB4ZnNfdGltZXN0YW1wIHsKIAlfX2JlMzIJCXRfc2VjOwkJLyogdGltZXN0YW1wIHNlY29uZHMgKi8KIAlfX2JlMzIJCXRfbnNlYzsJCS8qIHRpbWVzdGFtcCBuYW5vc2Vjb25kcyAqLwogfSB4ZnNfdGltZXN0YW1wX3Q7CiAKIC8qCi0gKiBOb3RlOiBDb29yZGluYXRlIGNoYW5nZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGUgWEZTX0RJXyogI2RlZmluZXMKLSAqIGJlbG93LCB0aGUgb2Zmc2V0cyB0YWJsZSBpbiB4ZnNfaWFsbG9jX2xvZ19kaSgpIGFuZCBzdHJ1Y3QgeGZzX2ljZGlub2RlCi0gKiBpbiB4ZnNfaW5vZGUuaC4KKyAqIE9uLWRpc2sgaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgaXMganVzdCB0aGUgaGVhZGVyIG9yICJkaW5vZGUgY29yZSIsIHRoZSBpbm9kZSBpcyBleHBhbmRlZCB0byBmaWxsIGEKKyAqIHZhcmlhYmxlIHNpemUgdGhlIGxlZnRvdmVyIGFyZWEgc3BsaXQgaW50byBhIGRhdGEgYW5kIGFuIGF0dHJpYnV0ZSBmb3JrLgorICogVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBhbmQgYXR0cmlidXRlIGZvcmsgZGVwZW5kcyBvbiB0aGUgZm9ybWF0IG9mIHRoZQorICogaW5vZGUgYXMgaW5kaWNhdGVkIGJ5IGRpX2Zvcm1hdCBhbmQgZGlfYWZvcm1hdC4gIFRvIGFjY2VzcyB0aGUgZGF0YSBhbmQKKyAqIGF0dHJpYnV0ZSB1c2UgdGhlIFhGU19ERk9SS19QVFIsIFhGU19ERk9SS19EUFRSLCBhbmQgWEZTX0RGT1JLX1BUUiBtYWNyb3MKKyAqIGJlbG93LgorICoKKyAqIFRoZXJlIGlzIGEgdmVyeSBzaW1pbGFyIHN0cnVjdCBpY2Rpbm9kZSBpbiB4ZnNfaW5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUKKyAqIGxheW91dCBvZiB0aGUgZmlyc3QgOTYgYnl0ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUsIGJ1dCBpcyBrZXB0IGluIG5hdGl2ZQorICogZm9ybWF0IGluc3RlYWQgb2YgYmlnIGVuZGlhbi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpbm9kZV9jb3JlIHsKK3R5cGVkZWYgc3RydWN0IHhmc19kaW5vZGUgewogCV9fYmUxNgkJZGlfbWFnaWM7CS8qIGlub2RlIG1hZ2ljICMgPSBYRlNfRElOT0RFX01BR0lDICovCiAJX19iZTE2CQlkaV9tb2RlOwkvKiBtb2RlIGFuZCB0eXBlIG9mIGZpbGUgKi8KIAlfX3U4CQlkaV92ZXJzaW9uOwkvKiBpbm9kZSB2ZXJzaW9uICovCkBAIC02OSwzNSArNjYsMTMgQEAKIAlfX2JlMTYJCWRpX2Rtc3RhdGU7CS8qIERNSUcgc3RhdGUgaW5mbyAqLwogCV9fYmUxNgkJZGlfZmxhZ3M7CS8qIHJhbmRvbSBmbGFncywgWEZTX0RJRkxBR18uLi4gKi8KIAlfX2JlMzIJCWRpX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyICovCi19IHhmc19kaW5vZGVfY29yZV90OworCisJLyogZGlfbmV4dF91bmxpbmtlZCBpcyB0aGUgb25seSBub24tY29yZSBmaWVsZCBpbiB0aGUgb2xkIGRpbm9kZSAqLworCV9fYmUzMgkJZGlfbmV4dF91bmxpbmtlZDsvKiBhZ2kgdW5saW5rZWQgbGlzdCBwdHIgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgeGZzX2Rpbm9kZV90OwogCiAjZGVmaW5lIERJX01BWF9GTFVTSCAweGZmZmYKIAotdHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpbm9kZQotewotCXhmc19kaW5vZGVfY29yZV90CWRpX2NvcmU7Ci0JLyoKLQkgKiBJbiBhZGRpbmcgYW55dGhpbmcgYmV0d2VlbiB0aGUgY29yZSBhbmQgdGhlIHVuaW9uLCBiZQotCSAqIHN1cmUgdG8gdXBkYXRlIHRoZSBtYWNyb3MgbGlrZSBYRlNfTElUSU5PIGJlbG93IGFuZAotCSAqIFhGU19CTUFQX1JCTE9DS19EU0laRSBpbiB4ZnNfYm1hcF9idHJlZS5oLgotCSAqLwotCV9fYmUzMgkJCWRpX25leHRfdW5saW5rZWQ7LyogYWdpIHVubGlua2VkIGxpc3QgcHRyICovCi0JdW5pb24gewotCQl4ZnNfYm1kcl9ibG9ja190IGRpX2JtYnQ7CS8qIGJ0cmVlIHJvb3QgYmxvY2sgKi8KLQkJeGZzX2JtYnRfcmVjXzMyX3QgZGlfYm14WzFdOwkvKiBleHRlbnQgbGlzdCAqLwotCQl4ZnNfZGlyMl9zZl90CWRpX2RpcjJzZjsJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSB2MiAqLwotCQljaGFyCQlkaV9jWzFdOwkvKiBsb2NhbCBjb250ZW50cyAqLwotCQlfX2JlMzIJCWRpX2RldjsJCS8qIGRldmljZSBmb3IgU19JRkNIUi9TX0lGQkxLICovCi0JCXV1aWRfdAkJZGlfbXV1aWQ7CS8qIG1vdW50IHBvaW50IHZhbHVlICovCi0JCWNoYXIJCWRpX3N5bWxpbmtbMV07CS8qIGxvY2FsIHN5bWJvbGljIGxpbmsgKi8KLQl9CQlkaV91OwotCXVuaW9uIHsKLQkJeGZzX2JtZHJfYmxvY2tfdCBkaV9hYm1idDsJLyogYnRyZWUgcm9vdCBibG9jayAqLwotCQl4ZnNfYm1idF9yZWNfMzJfdCBkaV9hYm14WzFdOwkvKiBleHRlbnQgbGlzdCAqLwotCQl4ZnNfYXR0cl9zaG9ydGZvcm1fdCBkaV9hdHRyc2Y7CS8qIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdCAqLwotCX0JCWRpX2E7Ci19IHhmc19kaW5vZGVfdDsKLQogLyoKICAqIFRoZSAzMiBiaXQgbGluayBjb3VudCBpbiB0aGUgaW5vZGUgdGhlb3JldGljYWxseSBtYXhlcyBvdXQgYXQgVUlOVF9NQVguCiAgKiBTaW5jZSB0aGUgcGF0aGNvbmYgaW50ZXJmYWNlIGlzIHNpZ25lZCwgd2UgdXNlIDJeMzEgLSAxIGluc3RlYWQuCkBAIC0xMDcsNTAgKzgyLDE0IEBACiAjZGVmaW5lCVhGU19NQVhMSU5LXzEJCTY1NTM1VQogCiAvKgotICogQml0IG5hbWVzIGZvciBsb2dnaW5nIGRpc2sgaW5vZGVzIG9ubHkKLSAqLwotI2RlZmluZQlYRlNfRElfTUFHSUMJCTB4MDAwMDAwMQotI2RlZmluZQlYRlNfRElfTU9ERQkJMHgwMDAwMDAyCi0jZGVmaW5lCVhGU19ESV9WRVJTSU9OCQkweDAwMDAwMDQKLSNkZWZpbmUJWEZTX0RJX0ZPUk1BVAkJMHgwMDAwMDA4Ci0jZGVmaW5lCVhGU19ESV9PTkxJTksJCTB4MDAwMDAxMAotI2RlZmluZQlYRlNfRElfVUlECQkweDAwMDAwMjAKLSNkZWZpbmUJWEZTX0RJX0dJRAkJMHgwMDAwMDQwCi0jZGVmaW5lCVhGU19ESV9OTElOSwkJMHgwMDAwMDgwCi0jZGVmaW5lCVhGU19ESV9QUk9KSUQJCTB4MDAwMDEwMAotI2RlZmluZQlYRlNfRElfUEFECQkweDAwMDAyMDAKLSNkZWZpbmUJWEZTX0RJX0FUSU1FCQkweDAwMDA0MDAKLSNkZWZpbmUJWEZTX0RJX01USU1FCQkweDAwMDA4MDAKLSNkZWZpbmUJWEZTX0RJX0NUSU1FCQkweDAwMDEwMDAKLSNkZWZpbmUJWEZTX0RJX1NJWkUJCTB4MDAwMjAwMAotI2RlZmluZQlYRlNfRElfTkJMT0NLUwkJMHgwMDA0MDAwCi0jZGVmaW5lCVhGU19ESV9FWFRTSVpFCQkweDAwMDgwMDAKLSNkZWZpbmUJWEZTX0RJX05FWFRFTlRTCQkweDAwMTAwMDAKLSNkZWZpbmUJWEZTX0RJX05BRVhURU5UUwkweDAwMjAwMDAKLSNkZWZpbmUJWEZTX0RJX0ZPUktPRkYJCTB4MDA0MDAwMAotI2RlZmluZQlYRlNfRElfQUZPUk1BVAkJMHgwMDgwMDAwCi0jZGVmaW5lCVhGU19ESV9ETUVWTUFTSwkJMHgwMTAwMDAwCi0jZGVmaW5lCVhGU19ESV9ETVNUQVRFCQkweDAyMDAwMDAKLSNkZWZpbmUJWEZTX0RJX0ZMQUdTCQkweDA0MDAwMDAKLSNkZWZpbmUJWEZTX0RJX0dFTgkJMHgwODAwMDAwCi0jZGVmaW5lCVhGU19ESV9ORVhUX1VOTElOS0VECTB4MTAwMDAwMAotI2RlZmluZQlYRlNfRElfVQkJMHgyMDAwMDAwCi0jZGVmaW5lCVhGU19ESV9BCQkweDQwMDAwMDAKLSNkZWZpbmUJWEZTX0RJX05VTV9CSVRTCQkyNwotI2RlZmluZQlYRlNfRElfQUxMX0JJVFMJCSgoMSA8PCBYRlNfRElfTlVNX0JJVFMpIC0gMSkKLSNkZWZpbmUJWEZTX0RJX0NPUkVfQklUUwkoWEZTX0RJX0FMTF9CSVRTICYgfihYRlNfRElfVXxYRlNfRElfQSkpCi0KLS8qCiAgKiBWYWx1ZXMgZm9yIGRpX2Zvcm1hdAogICovCi10eXBlZGVmIGVudW0geGZzX2Rpbm9kZV9mbXQKLXsKLQlYRlNfRElOT0RFX0ZNVF9ERVYsCQkvKiBDSFIsIEJMSzogZGlfZGV2ICovCi0JWEZTX0RJTk9ERV9GTVRfTE9DQUwsCQkvKiBESVIsIFJFRzogZGlfYyAqLwotCQkJCQkvKiBMTks6IGRpX3N5bWxpbmsgKi8KLQlYRlNfRElOT0RFX0ZNVF9FWFRFTlRTLAkJLyogRElSLCBSRUcsIExOSzogZGlfYm14ICovCi0JWEZTX0RJTk9ERV9GTVRfQlRSRUUsCQkvKiBESVIsIFJFRywgTE5LOiBkaV9ibWJ0ICovCi0JWEZTX0RJTk9ERV9GTVRfVVVJRAkJLyogTU5UOiBkaV91dWlkICovCit0eXBlZGVmIGVudW0geGZzX2Rpbm9kZV9mbXQgeworCVhGU19ESU5PREVfRk1UX0RFViwJCS8qIHhmc19kZXZfdCAqLworCVhGU19ESU5PREVfRk1UX0xPQ0FMLAkJLyogYnVsayBkYXRhICovCisJWEZTX0RJTk9ERV9GTVRfRVhURU5UUywJCS8qIHN0cnVjdCB4ZnNfYm1idF9yZWMgKi8KKwlYRlNfRElOT0RFX0ZNVF9CVFJFRSwJCS8qIHN0cnVjdCB4ZnNfYm1kcl9ibG9jayAqLworCVhGU19ESU5PREVfRk1UX1VVSUQJCS8qIHV1aWRfdCAqLwogfSB4ZnNfZGlub2RlX2ZtdF90OwogCiAvKgpAQCAtMTY2LDEzICsxMDUsMTMgQEAKICAqLwogI2RlZmluZQlYRlNfTElUSU5PKG1wKQkoKG1wKS0+bV9saXRpbm8pCiAjZGVmaW5lCVhGU19CUk9PVF9TSVpFX0FESglcCi0JKHNpemVvZih4ZnNfYm1idF9ibG9ja190KSAtIHNpemVvZih4ZnNfYm1kcl9ibG9ja190KSkKKwkoWEZTX0JUUkVFX0xCTE9DS19MRU4gLSBzaXplb2YoeGZzX2JtZHJfYmxvY2tfdCkpCiAKIC8qCiAgKiBJbm9kZSBkYXRhICYgYXR0cmlidXRlIGZvcmsgc2l6ZXMsIHBlciBpbm9kZS4KICAqLwotI2RlZmluZSBYRlNfREZPUktfUShkaXApCQkoKGRpcCktPmRpX2NvcmUuZGlfZm9ya29mZiAhPSAwKQotI2RlZmluZSBYRlNfREZPUktfQk9GRihkaXApCQkoKGludCkoKGRpcCktPmRpX2NvcmUuZGlfZm9ya29mZiA8PCAzKSkKKyNkZWZpbmUgWEZTX0RGT1JLX1EoZGlwKQkJKChkaXApLT5kaV9mb3Jrb2ZmICE9IDApCisjZGVmaW5lIFhGU19ERk9SS19CT0ZGKGRpcCkJCSgoaW50KSgoZGlwKS0+ZGlfZm9ya29mZiA8PCAzKSkKIAogI2RlZmluZSBYRlNfREZPUktfRFNJWkUoZGlwLG1wKSBcCiAJKFhGU19ERk9SS19RKGRpcCkgPyBcCkBAIC0xODcsMjMgKzEyNiw0MiBAQAogCQlYRlNfREZPUktfRFNJWkUoZGlwLCBtcCkgOiBcCiAJCVhGU19ERk9SS19BU0laRShkaXAsIG1wKSkKIAotI2RlZmluZSBYRlNfREZPUktfRFBUUihkaXApCQkgICAgKChkaXApLT5kaV91LmRpX2MpCisvKgorICogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSBkYXRhIG9yIGF0dHJpYnV0ZSBmb3Jrcy4KKyAqLworI2RlZmluZSBYRlNfREZPUktfRFBUUihkaXApIFwKKwkoKGNoYXIgKikoZGlwKSArIHNpemVvZihzdHJ1Y3QgeGZzX2Rpbm9kZSkpCiAjZGVmaW5lIFhGU19ERk9SS19BUFRSKGRpcCkJXAotCSgoZGlwKS0+ZGlfdS5kaV9jICsgWEZTX0RGT1JLX0JPRkYoZGlwKSkKKwkoWEZTX0RGT1JLX0RQVFIoZGlwKSArIFhGU19ERk9SS19CT0ZGKGRpcCkpCiAjZGVmaW5lIFhGU19ERk9SS19QVFIoZGlwLHcpCVwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBYRlNfREZPUktfRFBUUihkaXApIDogWEZTX0RGT1JLX0FQVFIoZGlwKSkKKwogI2RlZmluZSBYRlNfREZPUktfRk9STUFUKGRpcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAotCQkoZGlwKS0+ZGlfY29yZS5kaV9mb3JtYXQgOiBcCi0JCShkaXApLT5kaV9jb3JlLmRpX2Fmb3JtYXQpCisJCShkaXApLT5kaV9mb3JtYXQgOiBcCisJCShkaXApLT5kaV9hZm9ybWF0KQogI2RlZmluZSBYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIFwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCi0JIAliZTMyX3RvX2NwdSgoZGlwKS0+ZGlfY29yZS5kaV9uZXh0ZW50cykgOiBcCi0JIAliZTE2X3RvX2NwdSgoZGlwKS0+ZGlfY29yZS5kaV9hbmV4dGVudHMpKQorCQliZTMyX3RvX2NwdSgoZGlwKS0+ZGlfbmV4dGVudHMpIDogXAorCQliZTE2X3RvX2NwdSgoZGlwKS0+ZGlfYW5leHRlbnRzKSkKIAogI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJKCh4ZnNfZGlub2RlX3QgKilYRlNfQlVGX1BUUihicCkpCiAKIC8qCisgKiBGb3IgYmxvY2sgYW5kIGNoYXJhY3RlciBzcGVjaWFsIGZpbGVzIHRoZSAzMmJpdCBkZXZfdCBpcyBzdG9yZWQgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgZm9yay4KKyAqLworc3RhdGljIGlubGluZSB4ZnNfZGV2X3QgeGZzX2Rpbm9kZV9nZXRfcmRldihzdHJ1Y3QgeGZzX2Rpbm9kZSAqZGlwKQoreworCXJldHVybiBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKVhGU19ERk9SS19EUFRSKGRpcCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2Rpbm9kZV9wdXRfcmRldihzdHJ1Y3QgeGZzX2Rpbm9kZSAqZGlwLCB4ZnNfZGV2X3QgcmRldikKK3sKKwkqKF9fYmUzMiAqKVhGU19ERk9SS19EUFRSKGRpcCkgPSBjcHVfdG9fYmUzMihyZGV2KTsKK30KKworLyoKICAqIFZhbHVlcyBmb3IgZGlfZmxhZ3MKICAqIFRoZXJlIHNob3VsZCBiZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVzZSBmbGFncyBhbmQgdGhlCiAgKiBYRlNfWEZMQUdfcy4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5oIGIvZnMveGZzL3hmc19kaXIyX3NmLmgKaW5kZXggZGVlY2M5ZC4uNmFjNDRiNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX3NmLmgKKysrIGIvZnMveGZzL3hmc19kaXIyX3NmLmgKQEAgLTM0LDEzICszNCw2IEBACiBzdHJ1Y3QgeGZzX3RyYW5zOwogCiAvKgotICogTWF4aW11bSBzaXplIG9mIGEgc2hvcnRmb3JtIGRpcmVjdG9yeS4KLSAqLwotI2RlZmluZQlYRlNfRElSMl9TRl9NQVhfU0laRQlcCi0JKFhGU19ESU5PREVfTUFYX1NJWkUgLSAodWludClzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpIC0gXAotCSAodWludClzaXplb2YoeGZzX2FnaW5vX3QpKQotCi0vKgogICogSW5vZGUgbnVtYmVyIHN0b3JlZCBhcyA4IDgtYml0IHZhbHVlcy4KICAqLwogdHlwZWRlZglzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVs4XTsgfSB4ZnNfZGlyMl9pbm84X3Q7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rtb3BzLmMgYi9mcy94ZnMveGZzX2Rtb3BzLmMKaW5kZXggYTFlNTVmYi4uZTcxZTI1OCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kbW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfZG1vcHMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2NsbnQuaCIKIAogCiBzdGF0aWMgc3RydWN0IHhmc19kbW9wcyB4ZnNfZG1jb3JlX3N0dWIgPSB7CkBAIC0zOCw5ICszNyw5IEBACiB9OwogCiBpbnQKLXhmc19kbW9wc19nZXQoc3RydWN0IHhmc19tb3VudCAqbXAsIHN0cnVjdCB4ZnNfbW91bnRfYXJncyAqYXJncykKK3hmc19kbW9wc19nZXQoc3RydWN0IHhmc19tb3VudCAqbXApCiB7Ci0JaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0RNQVBJKSB7CisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCSJYRlM6IGRtYXBpIHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGtlcm5lbC4iKTsKIAkJcmV0dXJuIEVJTlZBTDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuYyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwppbmRleCBmMjI3ZWNkLi45MmQ1Y2Q1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Vycm9yLmMKKysrIGIvZnMveGZzL3hmc19lcnJvci5jCkBAIC0xNTMsMjEgKzE1Myw2IEBACiB9CiAjZW5kaWYgLyogREVCVUcgKi8KIAotc3RhdGljIHZvaWQKLXhmc19mc192Y21uX2VycihpbnQgbGV2ZWwsIHhmc19tb3VudF90ICptcCwgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotCWlmIChtcCAhPSBOVUxMKSB7Ci0JCWNoYXIJKm5ld2ZtdDsKLQkJaW50CWxlbiA9IDE2ICsgbXAtPm1fZnNuYW1lX2xlbiArIHN0cmxlbihmbXQpOwotCi0JCW5ld2ZtdCA9IGttZW1fYWxsb2MobGVuLCBLTV9TTEVFUCk7Ci0JCXNwcmludGYobmV3Zm10LCAiRmlsZXN5c3RlbSBcIiVzXCI6ICVzIiwgbXAtPm1fZnNuYW1lLCBmbXQpOwotCQlpY21uX2VycihsZXZlbCwgbmV3Zm10LCBhcCk7Ci0JCWttZW1fZnJlZShuZXdmbXQpOwotCX0gZWxzZSB7Ci0JCWljbW5fZXJyKGxldmVsLCBmbXQsIGFwKTsKLQl9Ci19CiAKIHZvaWQKIHhmc19mc19jbW5fZXJyKGludCBsZXZlbCwgeGZzX21vdW50X3QgKm1wLCBjaGFyICpmbXQsIC4uLikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuaCBiL2ZzL3hmcy94ZnNfZXJyb3IuaAppbmRleCAxMTU0M2YxLi4wYzkzMDUxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Vycm9yLmgKKysrIGIvZnMveGZzL3hmc19lcnJvci5oCkBAIC0xNTksMTEgKzE1OSwxNSBAQAogI2RlZmluZQkJWEZTX1BUQUdfRlNCTE9DS19aRVJPCQkweDAwMDAwMDgwCiAKIHN0cnVjdCB4ZnNfbW91bnQ7Ci0vKiBQUklOVEZMSUtFNCAqLworCitleHRlcm4gdm9pZCB4ZnNfZnNfdmNtbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJY2hhciAqZm10LCB2YV9saXN0IGFwKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgMCkpKTsKIGV4dGVybiB2b2lkIHhmc19jbW5fZXJyKGludCBwYW5pY190YWcsIGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQljaGFyICpmbXQsIC4uLik7Ci0vKiBQUklOVEZMSUtFMyAqLwotZXh0ZXJuIHZvaWQgeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pOworCQkJY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIHZvaWQgeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogCiBleHRlcm4gdm9pZCB4ZnNfaGV4X2R1bXAodm9pZCAqcCwgaW50IGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCmluZGV4IDhhYTI4ZjcuLjA1YTRiZGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtMTA4LDE5ICsxMDgsMTYgQEAKIFNUQVRJQyB2b2lkCiB4ZnNfZWZpX2l0ZW1fdW5waW4oeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwLCBpbnQgc3RhbGUpCiB7Ci0JeGZzX21vdW50X3QJKm1wOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGVmaXAtPmVmaV9pdGVtLmxpX2FpbHA7CiAKLQltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCWlmIChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NBTkNFTEVEKSB7Ci0JCS8qCi0JCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgotCQkgKi8KLQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXApOworCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCk7CiAJCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwogCX0gZWxzZSB7CiAJCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NPTU1JVFRFRDsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCX0KIH0KIApAQCAtMTM0LDI2ICsxMzEsMjMgQEAKIFNUQVRJQyB2b2lkCiB4ZnNfZWZpX2l0ZW1fdW5waW5fcmVtb3ZlKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX3RyYW5zX3QgKnRwKQogewotCXhmc19tb3VudF90CSptcDsKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBlZmlwLT5lZmlfaXRlbS5saV9haWxwOwogCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CiAKLQltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCWlmIChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NBTkNFTEVEKSB7CiAJCS8qCiAJCSAqIGZyZWUgdGhlIHhhY3Rpb24gZGVzY3JpcHRvciBwb2ludGluZyB0byB0aGlzIGl0ZW0KIAkJICovCiAJCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKikgZWZpcCk7CiAJCXhmc190cmFuc19mcmVlX2l0ZW0odHAsIGxpZHApOwotCQkvKgotCQkgKiBwdWxsIHRoZSBpdGVtIG9mZiB0aGUgQUlMLgotCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KLQkJICovCi0JCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwKTsKKworCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCk7CiAJCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwogCX0gZWxzZSB7CiAJCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NPTU1JVFRFRDsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCX0KIH0KIApAQCAtMjY4LDYgKzI2Miw3IEBACiAJZWZpcC0+ZWZpX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9FRkk7CiAJZWZpcC0+ZWZpX2l0ZW0ubGlfb3BzID0gJnhmc19lZmlfaXRlbV9vcHM7CiAJZWZpcC0+ZWZpX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJZWZpcC0+ZWZpX2l0ZW0ubGlfYWlscCA9IG1wLT5tX2FpbDsKIAllZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyA9IG5leHRlbnRzOwogCWVmaXAtPmVmaV9mb3JtYXQuZWZpX2lkID0gKF9fcHNpbnRfdCkodm9pZCopZWZpcDsKIApAQCAtMzQ1LDI1ICszNDAsMjIgQEAKIHhmc19lZmlfcmVsZWFzZSh4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCiAJCXVpbnQJCQluZXh0ZW50cykKIHsKLQl4ZnNfbW91bnRfdAkqbXA7Ci0JaW50CQlleHRlbnRzX2xlZnQ7CisJc3RydWN0IHhmc19haWwJCSphaWxwID0gZWZpcC0+ZWZpX2l0ZW0ubGlfYWlscDsKKwlpbnQJCQlleHRlbnRzX2xlZnQ7CiAKLQltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKIAlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID4gMCk7CiAJQVNTRVJUKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ09NTUlUVEVEKTsKIAotCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOworCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA+PSBuZXh0ZW50cyk7CiAJZWZpcC0+ZWZpX25leHRfZXh0ZW50IC09IG5leHRlbnRzOwogCWV4dGVudHNfbGVmdCA9IGVmaXAtPmVmaV9uZXh0X2V4dGVudDsKIAlpZiAoZXh0ZW50c19sZWZ0ID09IDApIHsKLQkJLyoKLQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCi0JCSAqLwotCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCk7CisJCS8qIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLiAqLworCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwKTsKIAkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCX0KIH0KIApAQCAtNTY1LDYgKzU1Nyw3IEBACiAJZWZkcC0+ZWZkX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9FRkQ7CiAJZWZkcC0+ZWZkX2l0ZW0ubGlfb3BzID0gJnhmc19lZmRfaXRlbV9vcHM7CiAJZWZkcC0+ZWZkX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJZWZkcC0+ZWZkX2l0ZW0ubGlfYWlscCA9IG1wLT5tX2FpbDsKIAllZmRwLT5lZmRfZWZpcCA9IGVmaXA7CiAJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMgPSBuZXh0ZW50czsKIAllZmRwLT5lZmRfZm9ybWF0LmVmZF9lZmlfaWQgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9pZDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnMuaCBiL2ZzL3hmcy94ZnNfZnMuaAppbmRleCAwMWMwY2M4Li41ODljNDFjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZzLmgKKysrIGIvZnMveGZzL3hmc19mcy5oCkBAIC0xMTMsMjIgKzExMywxNCBAQAogI2RlZmluZSBCTVZfSUZfQVRUUkZPUksJCTB4MQkvKiByZXR1cm4gYXR0ciBmb3JrIHJhdGhlciB0aGFuIGRhdGEgKi8KICNkZWZpbmUgQk1WX0lGX05PX0RNQVBJX1JFQUQJMHgyCS8qIERvIG5vdCBnZW5lcmF0ZSBETUFQSSByZWFkIGV2ZW50ICAqLwogI2RlZmluZSBCTVZfSUZfUFJFQUxMT0MJCTB4NAkvKiBydG4gc3RhdHVzIEJNVl9PRl9QUkVBTExPQyBpZiByZXEgKi8KLSNkZWZpbmUgQk1WX0lGX1ZBTElECShCTVZfSUZfQVRUUkZPUkt8Qk1WX0lGX05PX0RNQVBJX1JFQUR8Qk1WX0lGX1BSRUFMTE9DKQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgQk1WX0lGX0VYVEVOREVEIDB4NDAwMDAwMDAJLyogZ2V0cG1hcHggaWYgc2V0ICovCi0jZW5kaWYKKyNkZWZpbmUgQk1WX0lGX0RFTEFMTE9DCQkweDgJLyogcnRuIHN0YXR1cyBCTVZfT0ZfREVMQUxMT0MgaWYgcmVxICovCisjZGVmaW5lIEJNVl9JRl9WQUxJRAlcCisJKEJNVl9JRl9BVFRSRk9SS3xCTVZfSUZfTk9fRE1BUElfUkVBRHxCTVZfSUZfUFJFQUxMT0N8Qk1WX0lGX0RFTEFMTE9DKQogCiAvKglibXZfb2ZsYWdzIHZhbHVlcyAtIHJldHVybmVkIGZvciBmb3IgZWFjaCBub24taGVhZGVyIHNlZ21lbnQgKi8KICNkZWZpbmUgQk1WX09GX1BSRUFMTE9DCQkweDEJLyogc2VnbWVudCA9IHVud3JpdHRlbiBwcmUtYWxsb2NhdGlvbiAqLwotCi0vKglDb252ZXJ0IGdldGJtYXAgPC0+IGdldGJtYXB4IC0gbW92ZSBmaWVsZHMgZnJvbSBwMSB0byBwMi4gKi8KLSNkZWZpbmUgR0VUQk1BUF9DT05WRVJUKHAxLHAyKSB7CVwKLQlwMi5ibXZfb2Zmc2V0ID0gcDEuYm12X29mZnNldDsJXAotCXAyLmJtdl9ibG9jayA9IHAxLmJtdl9ibG9jazsJXAotCXAyLmJtdl9sZW5ndGggPSBwMS5ibXZfbGVuZ3RoOwlcCi0JcDIuYm12X2NvdW50ID0gcDEuYm12X2NvdW50OwlcCi0JcDIuYm12X2VudHJpZXMgPSBwMS5ibXZfZW50cmllczsgIH0KLQorI2RlZmluZSBCTVZfT0ZfREVMQUxMT0MJCTB4MgkvKiBzZWdtZW50ID0gZGVsYXllZCBhbGxvY2F0aW9uICovCisjZGVmaW5lIEJNVl9PRl9MQVNUCQkweDQJLyogc2VnbWVudCBpcyB0aGUgbGFzdCBpbiB0aGUgZmlsZSAqLwogCiAvKgogICogU3RydWN0dXJlIGZvciBYRlNfSU9DX0ZTU0VURE0uCkBAIC00MjYsMTAgKzQxOCw2IEBACiAjZGVmaW5lIFhGU19JT0NfR0VUWEZMQUdTCUZTX0lPQ19HRVRGTEFHUwogI2RlZmluZSBYRlNfSU9DX1NFVFhGTEFHUwlGU19JT0NfU0VURkxBR1MKICNkZWZpbmUgWEZTX0lPQ19HRVRWRVJTSU9OCUZTX0lPQ19HRVRWRVJTSU9OCi0vKiAzMi1iaXQgY29tcGF0IGNvdW50ZXJwYXJ0cyAqLwotI2RlZmluZSBYRlNfSU9DMzJfR0VUWEZMQUdTCUZTX0lPQzMyX0dFVEZMQUdTCi0jZGVmaW5lIFhGU19JT0MzMl9TRVRYRkxBR1MJRlNfSU9DMzJfU0VURkxBR1MKLSNkZWZpbmUgWEZTX0lPQzMyX0dFVFZFUlNJT04JRlNfSU9DMzJfR0VUVkVSU0lPTgogCiAvKgogICogaW9jdGwgY29tbWFuZHMgdGhhdCByZXBsYWNlIElSSVggZmNudGwoKSdzCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmMgYi9mcy94ZnMveGZzX2Zzb3BzLmMKaW5kZXggODQ1ODNjZi4uODUyYjZkMyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJeGZzX2V4dGxlbl90CQlhZ3NpemU7CiAJeGZzX2V4dGxlbl90CQl0bXBzaXplOwogCXhmc19hbGxvY19yZWNfdAkJKmFyZWM7Ci0JeGZzX2J0cmVlX3NibG9ja190CSpibG9jazsKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpibG9jazsKIAl4ZnNfYnVmX3QJCSpicDsKIAlpbnQJCQlidWNrZXQ7CiAJaW50CQkJZHBjdDsKQEAgLTI1MSwxNCArMjUxLDE0IEBACiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKIAkJCVhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19CTk9fQkxPQ0sobXApKSwKIAkJCUJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksIDApOwotCQlibG9jayA9IFhGU19CVUZfVE9fU0JMT0NLKGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQUJUQl9NQUdJQyk7CiAJCWJsb2NrLT5iYl9sZXZlbCA9IDA7CiAJCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYoMSk7Ci0JCWJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwotCQlibG9jay0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7Ci0JCWFyZWMgPSBYRlNfQlRSRUVfUkVDX0FERFIoeGZzX2FsbG9jLCBibG9jaywgMSk7CisJCWJsb2NrLT5iYl91LnMuYmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYXJlYyA9IFhGU19BTExPQ19SRUNfQUREUihtcCwgYmxvY2ssIDEpOwogCQlhcmVjLT5hcl9zdGFydGJsb2NrID0gY3B1X3RvX2JlMzIoWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOwogCQlhcmVjLT5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIoCiAJCQlhZ3NpemUgLSBiZTMyX3RvX2NwdShhcmVjLT5hcl9zdGFydGJsb2NrKSk7CkBAIC0yNzIsMTQgKzI3MiwxNCBAQAogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCiAJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQ05UX0JMT0NLKG1wKSksCiAJCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKLQkJYmxvY2sgPSBYRlNfQlVGX1RPX1NCTE9DSyhicCk7CisJCWJsb2NrID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKIAkJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0FCVENfTUFHSUMpOwogCQlibG9jay0+YmJfbGV2ZWwgPSAwOwogCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KDEpOwotCQlibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKLQkJYmxvY2stPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwotCQlhcmVjID0gWEZTX0JUUkVFX1JFQ19BRERSKHhmc19hbGxvYywgYmxvY2ssIDEpOworCQlibG9jay0+YmJfdS5zLmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CisJCWJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CisJCWFyZWMgPSBYRlNfQUxMT0NfUkVDX0FERFIobXAsIGJsb2NrLCAxKTsKIAkJYXJlYy0+YXJfc3RhcnRibG9jayA9IGNwdV90b19iZTMyKFhGU19QUkVBTExPQ19CTE9DS1MobXApKTsKIAkJYXJlYy0+YXJfYmxvY2tjb3VudCA9IGNwdV90b19iZTMyKAogCQkJYWdzaXplIC0gYmUzMl90b19jcHUoYXJlYy0+YXJfc3RhcnRibG9jaykpOwpAQCAtMjk0LDEzICsyOTQsMTMgQEAKIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAogCQkJWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0lCVF9CTE9DSyhtcCkpLAogCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19JQlRfTUFHSUMpOwogCQlibG9jay0+YmJfbGV2ZWwgPSAwOwogCQlibG9jay0+YmJfbnVtcmVjcyA9IDA7Ci0JCWJsb2NrLT5iYl9sZWZ0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwotCQlibG9jay0+YmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CisJCWJsb2NrLT5iYl91LnMuYmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKKwkJYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKIAkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CiAJCWlmIChlcnJvcikgewogCQkJZ290byBlcnJvcjA7CkBAIC00MzUsNiArNDM1LDkgQEAKIAl4ZnNfZ3Jvd2ZzX2RhdGFfdAkqaW4pCiB7CiAJaW50IGVycm9yOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKIAlpZiAoIW11dGV4X3RyeWxvY2soJm1wLT5tX2dyb3dsb2NrKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFV09VTERCTE9DSyk7CiAJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX2RhdGFfcHJpdmF0ZShtcCwgaW4pOwpAQCAtNDQ4LDYgKzQ1MSw5IEBACiAJeGZzX2dyb3dmc19sb2dfdAkqaW4pCiB7CiAJaW50IGVycm9yOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKIAlpZiAoIW11dGV4X3RyeWxvY2soJm1wLT5tX2dyb3dsb2NrKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFV09VTERCTE9DSyk7CiAJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX2xvZ19wcml2YXRlKG1wLCBpbik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCBhYWQ4YzVkLi5lNmViYmFlYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2lhbGxvYy5jCkBAIC00MSw2OCArNDEsNiBAQAogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19ibWFwLmgiCiAKLS8qCi0gKiBMb2cgc3BlY2lmaWVkIGZpZWxkcyBmb3IgdGhlIGlub2RlIGdpdmVuIGJ5IGJwIGFuZCBvZmYuCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfaWFsbG9jX2xvZ19kaSgKLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2J1Zl90CSpicCwJCS8qIGlub2RlIGJ1ZmZlciAqLwotCWludAkJb2ZmLAkJLyogaW5kZXggb2YgaW5vZGUgaW4gYnVmZmVyICovCi0JaW50CQlmaWVsZHMpCQkvKiBiaXRtYXNrIG9mIGZpZWxkcyB0byBsb2cgKi8KLXsKLQlpbnQJCQlmaXJzdDsJCS8qIGZpcnN0IGJ5dGUgbnVtYmVyICovCi0JaW50CQkJaW9mZnNldDsJLyogb2ZmIGluIGJ5dGVzICovCi0JaW50CQkJbGFzdDsJCS8qIGxhc3QgYnl0ZSBudW1iZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCi0Jc3RhdGljIGNvbnN0IHNob3J0CW9mZnNldHNbXSA9IHsJLyogZmllbGQgb2Zmc2V0cyAqLwotCQkJCQkJLyoga2VlcCBpbiBzeW5jIHdpdGggYml0cyAqLwotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbWFnaWMpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbW9kZSksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV92ZXJzaW9uKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2Zvcm1hdCksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9vbmxpbmspLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfdWlkKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2dpZCksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9ubGluayksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9wcm9qaWQpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfcGFkKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2F0aW1lKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX210aW1lKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2N0aW1lKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX3NpemUpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbmJsb2NrcyksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9leHRzaXplKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX25leHRlbnRzKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2FuZXh0ZW50cyksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9mb3Jrb2ZmKSwKLQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2Fmb3JtYXQpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZG1ldm1hc2spLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZG1zdGF0ZSksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9mbGFncyksCi0JCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9nZW4pLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX25leHRfdW5saW5rZWQpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX3UpLAotCQlvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX2EpLAotCQlzaXplb2YoeGZzX2Rpbm9kZV90KQotCX07Ci0KLQotCUFTU0VSVChvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX2NvcmUpID09IDApOwotCUFTU0VSVCgoZmllbGRzICYgKFhGU19ESV9VfFhGU19ESV9BKSkgPT0gMCk7Ci0JbXAgPSB0cC0+dF9tb3VudHA7Ci0JLyoKLQkgKiBHZXQgdGhlIGlub2RlLXJlbGF0aXZlIGZpcnN0IGFuZCBsYXN0IGJ5dGVzIGZvciB0aGVzZSBmaWVsZHMKLQkgKi8KLQl4ZnNfYnRyZWVfb2Zmc2V0cyhmaWVsZHMsIG9mZnNldHMsIFhGU19ESV9OVU1fQklUUywgJmZpcnN0LCAmbGFzdCk7Ci0JLyoKLQkgKiBDb252ZXJ0IHRvIGJ1ZmZlciBvZmZzZXRzIGFuZCBsb2cgaXQuCi0JICovCi0JaW9mZnNldCA9IG9mZiA8PCBtcC0+bV9zYi5zYl9pbm9kZWxvZzsKLQlmaXJzdCArPSBpb2Zmc2V0OwotCWxhc3QgKz0gaW9mZnNldDsKLQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKLX0KIAogLyoKICAqIEFsbG9jYXRpb24gZ3JvdXAgbGV2ZWwgZnVuY3Rpb25zLgpAQCAtMTE5LDYgKzU3LDEwMiBAQAogfQogCiAvKgorICogTG9va3VwIHRoZSByZWNvcmQgZXF1YWwgdG8gaW5vIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXBfZXEoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlmcmVlLAkvKiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubyA9IGlubzsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWVjb3VudCA9IGZjbnQ7CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlID0gZnJlZTsKKwlyZXR1cm4geGZzX2J0cmVlX2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlubworICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xvb2t1cF9nZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJCWZyZWUsCS8qIGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vID0gaW5vOworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50ID0gZmNudDsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWUgPSBmcmVlOworCXJldHVybiB4ZnNfYnRyZWVfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9HRSwgc3RhdCk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW5vCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwX2xlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAkJZnJlZSwJLyogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8gPSBpbm87CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQgPSBmY250OworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZSA9IGZyZWU7CisJcmV0dXJuIHhmc19idHJlZV9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0xFLCBzdGF0KTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciB0byB0aGUgdmFsdWUgZ2l2ZW4KKyAqIGJ5IFtpbm8sIGZjbnQsIGZyZWVdLgorICogVGhpcyBlaXRoZXIgd29ya3MgKHJldHVybiAwKSBvciBnZXRzIGFuIEVGU0NPUlJVUFRFRCBlcnJvci4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X3VwZGF0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJCWZyZWUpCS8qIGZyZWUgaW5vZGUgbWFzayAqLworeworCXVuaW9uIHhmc19idHJlZV9yZWMJcmVjOworCisJcmVjLmlub2J0LmlyX3N0YXJ0aW5vID0gY3B1X3RvX2JlMzIoaW5vKTsKKwlyZWMuaW5vYnQuaXJfZnJlZWNvdW50ID0gY3B1X3RvX2JlMzIoZmNudCk7CisJcmVjLmlub2J0LmlyX2ZyZWUgPSBjcHVfdG9fYmU2NChmcmVlKTsKKwlyZXR1cm4geGZzX2J0cmVlX3VwZGF0ZShjdXIsICZyZWMpOworfQorCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfZ2V0X3JlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJKmlubywJLyogb3V0cHV0OiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJKmZjbnQsCS8qIG91dHB1dDogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisJeGZzX2lub2ZyZWVfdAkJKmZyZWUsCS8qIG91dHB1dDogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkJKnN0YXQpCS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjOworCWludAkJCWVycm9yOworCisJZXJyb3IgPSB4ZnNfYnRyZWVfZ2V0X3JlYyhjdXIsICZyZWMsIHN0YXQpOworCWlmICghZXJyb3IgJiYgKnN0YXQgPT0gMSkgeworCQkqaW5vID0gYmUzMl90b19jcHUocmVjLT5pbm9idC5pcl9zdGFydGlubyk7CisJCSpmY250ID0gYmUzMl90b19jcHUocmVjLT5pbm9idC5pcl9mcmVlY291bnQpOworCQkqZnJlZSA9IGJlNjRfdG9fY3B1KHJlYy0+aW5vYnQuaXJfZnJlZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKICAqIEFsbG9jYXRlIG5ldyBpbm9kZXMgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgc3BlY2lmaWVkIGJ5IGFnYnAuCiAgKiBSZXR1cm4gMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvciBjb2RlLgogICovCkBAIC0yODcsOSArMzIxLDkgQEAKIAkgKiBhYmxlIHRvIHVzZSB0aGUgZmlsZSBzeXN0ZW0uCiAJICovCiAJaWYgKHhmc19zYl92ZXJzaW9uX2hhc25saW5rKCZhcmdzLm1wLT5tX3NiKSkKLQkJdmVyc2lvbiA9IFhGU19ESU5PREVfVkVSU0lPTl8yOworCQl2ZXJzaW9uID0gMjsKIAllbHNlCi0JCXZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMTsKKwkJdmVyc2lvbiA9IDE7CiAKIAkvKgogCSAqIFNlZWQgdGhlIG5ldyBpbm9kZSBjbHVzdGVyIHdpdGggYSByYW5kb20gZ2VuZXJhdGlvbiBudW1iZXIuIFRoaXMKQEAgLTMxMCwxOCArMzQ0LDI1IEBACiAJCQkJCSBYRlNfQlVGX0xPQ0spOwogCQlBU1NFUlQoZmJ1Zik7CiAJCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihmYnVmKSk7CisKIAkJLyoKLQkJICogU2V0IGluaXRpYWwgdmFsdWVzIGZvciB0aGUgaW5vZGVzIGluIHRoaXMgYnVmZmVyLgorCQkgKiBJbml0aWFsaXplIGFsbCBpbm9kZXMgaW4gdGhpcyBidWZmZXIgYW5kIHRoZW4gbG9nIHRoZW0uCisJCSAqCisJCSAqIFhYWDogSXQgd291bGQgYmUgbXVjaCBiZXR0ZXIgaWYgd2UgaGFkIGp1c3Qgb25lIHRyYW5zYWN0aW9uIHRvCisJCSAqICAgICAgbG9nIGEgd2hvbGUgY2x1c3RlciBvZiBpbm9kZXMgaW5zdGVhZCBvZiBhbGwgdGhlIGluZGl2ZHVhbAorCQkgKiAgICAgIHRyYW5zYWN0aW9ucyBjYXVzaW5nIGEgbG90IG9mIGxvZyB0cmFmZmljLgogCQkgKi8KIAkJeGZzX2Jpb3plcm8oZmJ1ZiwgMCwgbmlub2RlcyA8PCBhcmdzLm1wLT5tX3NiLnNiX2lub2RlbG9nKTsKIAkJZm9yIChpID0gMDsgaSA8IG5pbm9kZXM7IGkrKykgeworCQkJaW50CWlvZmZzZXQgPSBpIDw8IGFyZ3MubXAtPm1fc2Iuc2JfaW5vZGVsb2c7CisJCQl1aW50CWlzaXplID0gc2l6ZW9mKHN0cnVjdCB4ZnNfZGlub2RlKTsKKwogCQkJZnJlZSA9IFhGU19NQUtFX0lQVFIoYXJncy5tcCwgZmJ1ZiwgaSk7Ci0JCQlmcmVlLT5kaV9jb3JlLmRpX21hZ2ljID0gY3B1X3RvX2JlMTYoWEZTX0RJTk9ERV9NQUdJQyk7Ci0JCQlmcmVlLT5kaV9jb3JlLmRpX3ZlcnNpb24gPSB2ZXJzaW9uOwotCQkJZnJlZS0+ZGlfY29yZS5kaV9nZW4gPSBjcHVfdG9fYmUzMihnZW4pOworCQkJZnJlZS0+ZGlfbWFnaWMgPSBjcHVfdG9fYmUxNihYRlNfRElOT0RFX01BR0lDKTsKKwkJCWZyZWUtPmRpX3ZlcnNpb24gPSB2ZXJzaW9uOworCQkJZnJlZS0+ZGlfZ2VuID0gY3B1X3RvX2JlMzIoZ2VuKTsKIAkJCWZyZWUtPmRpX25leHRfdW5saW5rZWQgPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pOwotCQkJeGZzX2lhbGxvY19sb2dfZGkodHAsIGZidWYsIGksCi0JCQkJWEZTX0RJX0NPUkVfQklUUyB8IFhGU19ESV9ORVhUX1VOTElOS0VEKTsKKwkJCXhmc190cmFuc19sb2dfYnVmKHRwLCBmYnVmLCBpb2Zmc2V0LCBpb2Zmc2V0ICsgaXNpemUgLSAxKTsKIAkJfQogCQl4ZnNfdHJhbnNfaW5vZGVfYWxsb2NfYnVmKHRwLCBmYnVmKTsKIAl9CkBAIC0zMzUsOCArMzc2LDcgQEAKIAkvKgogCSAqIEluc2VydCByZWNvcmRzIGRlc2NyaWJpbmcgdGhlIG5ldyBpbm9kZSBjaHVuayBpbnRvIHRoZSBidHJlZS4KIAkgKi8KLQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy5tcCwgdHAsIGFnYnAsIGFnbm8sCi0JCQlYRlNfQlROVU1fSU5PLCAoeGZzX2lub2RlX3QgKikwLCAwKTsKKwljdXIgPSB4ZnNfaW5vYnRfaW5pdF9jdXJzb3IoYXJncy5tcCwgdHAsIGFnYnAsIGFnbm8pOwogCWZvciAodGhpc2lubyA9IG5ld2lubzsKIAkgICAgIHRoaXNpbm8gPCBuZXdpbm8gKyBuZXdsZW47CiAJICAgICB0aGlzaW5vICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LKSB7CkBAIC0zNDYsNyArMzg2LDcgQEAKIAkJCXJldHVybiBlcnJvcjsKIAkJfQogCQlBU1NFUlQoaSA9PSAwKTsKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbnNlcnQoY3VyLCAmaSkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkgewogCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC02NzYsOCArNzE2LDcgQEAKIAkgKi8KIAlhZ25vID0gdGFnbm87CiAJKklPX2FnYnAgPSBOVUxMOwotCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGJlMzJfdG9fY3B1KGFnaS0+YWdpX3NlcW5vKSwKLQkJCQkgICAgWEZTX0JUTlVNX0lOTywgKHhmc19pbm9kZV90ICopMCwgMCk7CisJY3VyID0geGZzX2lub2J0X2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYmUzMl90b19jcHUoYWdpLT5hZ2lfc2Vxbm8pKTsKIAkvKgogCSAqIElmIHBhZ2lubyBpcyAwICh0aGlzIGlzIHRoZSByb290IGlub2RlIGFsbG9jYXRpb24pIHVzZSBuZXdpbm8uCiAJICogVGhpcyBtdXN0IHdvcmsgYmVjYXVzZSB3ZSd2ZSBqdXN0IGFsbG9jYXRlZCBzb21lLgpAQCAtNjk3LDcgKzczNiw3IEBACiAJCQkJZ290byBlcnJvcjA7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGVycm9yMDsKIAkJfSB3aGlsZSAoaSA9PSAxKTsKIApAQCAtNzQxLDcgKzc4MCw3IEBACiAJCQkvKgogCQkJICogU2VhcmNoIGxlZnQgd2l0aCB0Y3VyLCBiYWNrIHVwIDEgcmVjb3JkLgogCQkJICovCi0JCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudCh0Y3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQodGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGVycm9yMTsKIAkJCWRvbmVsZWZ0ID0gIWk7CiAJCQlpZiAoIWRvbmVsZWZ0KSB7CkBAIC03NTUsNyArNzk0LDcgQEAKIAkJCS8qCiAJCQkgKiBTZWFyY2ggcmlnaHQgd2l0aCBjdXIsIGdvIGZvcndhcmQgMSByZWNvcmQuCiAJCQkgKi8KLQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKIAkJCQlnb3RvIGVycm9yMTsKIAkJCWRvbmVyaWdodCA9ICFpOwogCQkJaWYgKCFkb25lcmlnaHQpIHsKQEAgLTgxNyw3ICs4NTYsNyBAQAogCQkJCSAqIGZ1cnRoZXIgbGVmdC4KIAkJCQkgKi8KIAkJCQlpZiAodXNlbGVmdCkgewotCQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudCh0Y3VyLCAwLAorCQkJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudCh0Y3VyLCAwLAogCQkJCQkJCSZpKSkpCiAJCQkJCQlnb3RvIGVycm9yMTsKIAkJCQkJZG9uZWxlZnQgPSAhaTsKQEAgLTgzNyw3ICs4NzYsNyBAQAogCQkJCSAqIGZ1cnRoZXIgcmlnaHQuCiAJCQkJICovCiAJCQkJZWxzZSB7Ci0JCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwKKwkJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLAogCQkJCQkJCSZpKSkpCiAJCQkJCQlnb3RvIGVycm9yMTsKIAkJCQkJZG9uZXJpZ2h0ID0gIWk7CkBAIC04OTIsNyArOTMxLDcgQEAKIAkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCQkJaWYgKHJlYy5pcl9mcmVlY291bnQgPiAwKQogCQkJCQlicmVhazsKLQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCQlnb3RvIGVycm9yMDsKIAkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJCQl9CkBAIC05MjYsNyArOTY1LDcgQEAKIAkJCQlnb3RvIGVycm9yMDsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAkJCWZyZWVjb3VudCArPSByZWMuaXJfZnJlZWNvdW50OwotCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZXJyb3IwOwogCQl9IHdoaWxlIChpID09IDEpOwogCQlBU1NFUlQoZnJlZWNvdW50ID09IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2ZyZWVjb3VudCkgfHwKQEAgLTEwMjIsOCArMTA2MSw3IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBjdXJzb3IuCiAJICovCi0JY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYWdubywgWEZTX0JUTlVNX0lOTywKLQkJKHhmc19pbm9kZV90ICopMCwgMCk7CisJY3VyID0geGZzX2lub2J0X2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYWdubyk7CiAjaWZkZWYgREVCVUcKIAlpZiAoY3VyLT5iY19ubGV2ZWxzID09IDEpIHsKIAkJaW50IGZyZWVjb3VudCA9IDA7CkBAIC0xMDM2LDcgKzEwNzQsNyBAQAogCQkJCWdvdG8gZXJyb3IwOwogCQkJaWYgKGkpIHsKIAkJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKLQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCQlnb3RvIGVycm9yMDsKIAkJCX0KIAkJfSB3aGlsZSAoaSA9PSAxKTsKQEAgLTEwOTgsOCArMTEzNiw4IEBACiAJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JQ09VTlQsIC1pbGVuKTsKIAkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lGUkVFLCAtKGlsZW4gLSAxKSk7CiAKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWxldGUoY3VyLCAmaSkpKSB7Ci0JCQljbW5fZXJyKENFX1dBUk4sICJ4ZnNfZGlmcmVlOiB4ZnNfaW5vYnRfZGVsZXRlIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLlxuIiwKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWxldGUoY3VyLCAmaSkpKSB7CisJCQljbW5fZXJyKENFX1dBUk4sICJ4ZnNfZGlmcmVlOiB4ZnNfYnRyZWVfZGVsZXRlIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLlxuIiwKIAkJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKIAkJCWdvdG8gZXJyb3IwOwogCQl9CkBAIC0xMTQxLDcgKzExNzksNyBAQAogCQkJCWdvdG8gZXJyb3IwOwogCQkJaWYgKGkpIHsKIAkJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKLQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCQlnb3RvIGVycm9yMDsKIAkJCX0KIAkJfSB3aGlsZSAoaSA9PSAxKTsKQEAgLTExNTgsMzYgKzExOTYsMjggQEAKIH0KIAogLyoKLSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGlub2RlIGluIGJuby9vZmYsIGZvciBtYXBwaW5nIGl0IGludG8gYSBidWZmZXIuCisgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBpbm9kZSBpbiBpbWFwLCBmb3IgbWFwcGluZyBpdCBpbnRvIGEgYnVmZmVyLgogICovCi0vKkFSR1NVU0VEKi8KIGludAoteGZzX2RpbG9jYXRlKAotCXhmc19tb3VudF90CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCi0JeGZzX3RyYW5zX3QJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCit4ZnNfaW1hcCgKKwl4ZnNfbW91bnRfdAkgKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkgKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAJeGZzX2lub190CWlubywJLyogaW5vZGUgdG8gbG9jYXRlICovCi0JeGZzX2ZzYmxvY2tfdAkqYm5vLAkvKiBvdXRwdXQ6IGJsb2NrIGNvbnRhaW5pbmcgaW5vZGUgKi8KLQlpbnQJCSpsZW4sCS8qIG91dHB1dDogbnVtIGJsb2NrcyBpbiBpbm9kZSBjbHVzdGVyICovCi0JaW50CQkqb2ZmLAkvKiBvdXRwdXQ6IGluZGV4IGluIGJsb2NrIG9mIGlub2RlICovCi0JdWludAkJZmxhZ3MpCS8qIGZsYWdzIGNvbmNlcm5pbmcgaW5vZGUgbG9va3VwICovCisJc3RydWN0IHhmc19pbWFwCSppbWFwLAkvKiBsb2NhdGlvbiBtYXAgc3RydWN0dXJlICovCisJdWludAkJZmxhZ3MpCS8qIGZsYWdzIGZvciBpbm9kZSBidHJlZSBsb29rdXAgKi8KIHsKIAl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgaW5vZGUgaW4gdGhlIGFsbG9jIGdyb3VwICovCi0JeGZzX2J1Zl90CSphZ2JwOwkvKiBhZ2kgYnVmZmVyICovCiAJeGZzX2FnaW5vX3QJYWdpbm87CS8qIGlub2RlIG51bWJlciB3aXRoaW4gYWxsb2MgZ3JvdXAgKi8KIAl4ZnNfYWdudW1iZXJfdAlhZ25vOwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwogCWludAkJYmxrc19wZXJfY2x1c3RlcjsgLyogbnVtIGJsb2NrcyBwZXIgaW5vZGUgY2x1c3RlciAqLwogCXhmc19hZ2Jsb2NrX3QJY2h1bmtfYWdibm87CS8qIGZpcnN0IGJsb2NrIGluIGlub2RlIGNodW5rICovCi0JeGZzX2FnaW5vX3QJY2h1bmtfYWdpbm87CS8qIGZpcnN0IGFnaW5vIGluIGlub2RlIGNodW5rICovCi0JX19pbnQzMl90CWNodW5rX2NudDsJLyogY291bnQgb2YgZnJlZSBpbm9kZXMgaW4gY2h1bmsgKi8KLQl4ZnNfaW5vZnJlZV90CWNodW5rX2ZyZWU7CS8qIG1hc2sgb2YgZnJlZSBpbm9kZXMgaW4gY2h1bmsgKi8KIAl4ZnNfYWdibG9ja190CWNsdXN0ZXJfYWdibm87CS8qIGZpcnN0IGJsb2NrIGluIGlub2RlIGNsdXN0ZXIgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJLyogaW5vZGUgYnRyZWUgY3Vyc29yICovCiAJaW50CQllcnJvcjsJLyogZXJyb3IgY29kZSAqLwotCWludAkJaTsJLyogdGVtcCBzdGF0ZSAqLwogCWludAkJb2Zmc2V0OwkvKiBpbmRleCBvZiBpbm9kZSBpbiBpdHMgYnVmZmVyICovCiAJaW50CQlvZmZzZXRfYWdibm87CS8qIGJsa3MgZnJvbSBjaHVuayBzdGFydCB0byBpbm9kZSAqLwogCiAJQVNTRVJUKGlubyAhPSBOVUxMRlNJTk8pOworCiAJLyoKIAkgKiBTcGxpdCB1cCB0aGUgaW5vZGUgbnVtYmVyIGludG8gaXRzIHBhcnRzLgogCSAqLwpAQCAtMTE5OCwyNCArMTIyOCwyNCBAQAogCSAgICBpbm8gIT0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pKSB7CiAjaWZkZWYgREVCVUcKIAkJLyogbm8gZGlhZ25vc3RpY3MgZm9yIGJ1bGtzdGF0LCBpbm8gY29tZXMgZnJvbSB1c2Vyc3BhY2UgKi8KLQkJaWYgKGZsYWdzICYgWEZTX0lNQVBfQlVMS1NUQVQpCisJCWlmIChmbGFncyAmIFhGU19JR0VUX0JVTEtTVEFUKQogCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQlpZiAoYWdubyA+PSBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CiAJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCi0JCQkJCSJ4ZnNfZGlsb2NhdGU6IGFnbm8gKCVkKSA+PSAiCisJCQkJCSJ4ZnNfaW1hcDogYWdubyAoJWQpID49ICIKIAkJCQkJIm1wLT5tX3NiLnNiX2FnY291bnQgKCVkKSIsCiAJCQkJCWFnbm8sICBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKIAkJfQogCQlpZiAoYWdibm8gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpIHsKIAkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKLQkJCQkJInhmc19kaWxvY2F0ZTogYWdibm8gKDB4JWxseCkgPj0gIgorCQkJCQkieGZzX2ltYXA6IGFnYm5vICgweCVsbHgpID49ICIKIAkJCQkJIm1wLT5tX3NiLnNiX2FnYmxvY2tzICgweCVseCkiLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBhZ2JubywKIAkJCQkJKHVuc2lnbmVkIGxvbmcpIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKIAkJfQogCQlpZiAoaW5vICE9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSkgewogCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAotCQkJCQkieGZzX2RpbG9jYXRlOiBpbm8gKDB4JWxseCkgIT0gIgorCQkJCQkieGZzX2ltYXA6IGlubyAoMHglbGx4KSAhPSAiCiAJCQkJCSJYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykgIgogCQkJCQkiKDB4JWxseCkiLAogCQkJCQlpbm8sIFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSk7CkBAIC0xMjI0LDY1ICsxMjU0LDg5IEBACiAjZW5kaWYgLyogREVCVUcgKi8KIAkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCX0KLQlpZiAoKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSkgfHwKLQkgICAgIShmbGFncyAmIFhGU19JTUFQX0xPT0tVUCkpIHsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGNsdXN0ZXIgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgYmxvY2tzaXplIG9yCisJICogc21hbGxlciB3ZSBnZXQgdG8gdGhlIGJ1ZmZlciBieSBzaW1wbGUgYXJpdGhtZXRpY3MuCisJICovCisJaWYgKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApIDw9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSkgewogCQlvZmZzZXQgPSBYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKIAkJQVNTRVJUKG9mZnNldCA8IG1wLT5tX3NiLnNiX2lub3BibG9jayk7Ci0JCSpibm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgYWdibm8pOwotCQkqb2ZmID0gb2Zmc2V0OwotCQkqbGVuID0gMTsKKworCQlpbWFwLT5pbV9ibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKKwkJaW1hcC0+aW1fbGVuID0gWEZTX0ZTQl9UT19CQihtcCwgMSk7CisJCWltYXAtPmltX2JvZmZzZXQgPSAodXNob3J0KShvZmZzZXQgPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2cpOwogCQlyZXR1cm4gMDsKIAl9CisKIAlibGtzX3Blcl9jbHVzdGVyID0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7Ci0JaWYgKCpibm8gIT0gTlVMTEZTQkxPQ0spIHsKKworCS8qCisJICogSWYgd2UgZ2V0IGEgYmxvY2sgbnVtYmVyIHBhc3NlZCBmcm9tIGJ1bGtzdGF0IHdlIGNhbiB1c2UgaXQgdG8KKwkgKiBmaW5kIHRoZSBidWZmZXIgZWFzaWx5LgorCSAqLworCWlmIChpbWFwLT5pbV9ibGtubykgewogCQlvZmZzZXQgPSBYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKIAkJQVNTRVJUKG9mZnNldCA8IG1wLT5tX3NiLnNiX2lub3BibG9jayk7Ci0JCWNsdXN0ZXJfYWdibm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLCAqYm5vKTsKLQkJKm9mZiA9ICgoYWdibm8gLSBjbHVzdGVyX2FnYm5vKSAqIG1wLT5tX3NiLnNiX2lub3BibG9jaykgKwotCQkJb2Zmc2V0OwotCQkqbGVuID0gYmxrc19wZXJfY2x1c3RlcjsKKworCQljbHVzdGVyX2FnYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKG1wLCBpbWFwLT5pbV9ibGtubyk7CisJCW9mZnNldCArPSAoYWdibm8gLSBjbHVzdGVyX2FnYm5vKSAqIG1wLT5tX3NiLnNiX2lub3BibG9jazsKKworCQlpbWFwLT5pbV9sZW4gPSBYRlNfRlNCX1RPX0JCKG1wLCBibGtzX3Blcl9jbHVzdGVyKTsKKwkJaW1hcC0+aW1fYm9mZnNldCA9ICh1c2hvcnQpKG9mZnNldCA8PCBtcC0+bV9zYi5zYl9pbm9kZWxvZyk7CiAJCXJldHVybiAwOwogCX0KKworCS8qCisJICogSWYgdGhlIGlub2RlIGNodW5rcyBhcmUgYWxpZ25lZCB0aGVuIHVzZSBzaW1wbGUgbWF0aHMgdG8KKwkgKiBmaW5kIHRoZSBsb2NhdGlvbi4gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gZG8gYSBidHJlZQorCSAqIGxvb2t1cCB0byBmaW5kIHRoZSBsb2NhdGlvbi4KKwkgKi8KIAlpZiAobXAtPm1faW5vYWxpZ25fbWFzaykgewogCQlvZmZzZXRfYWdibm8gPSBhZ2JubyAmIG1wLT5tX2lub2FsaWduX21hc2s7CiAJCWNodW5rX2FnYm5vID0gYWdibm8gLSBvZmZzZXRfYWdibm87CiAJfSBlbHNlIHsKKwkJeGZzX2J0cmVlX2N1cl90CSpjdXI7CS8qIGlub2RlIGJ0cmVlIGN1cnNvciAqLworCQl4ZnNfYWdpbm9fdAljaHVua19hZ2lubzsgLyogZmlyc3QgYWdpbm8gaW4gaW5vZGUgY2h1bmsgKi8KKwkJX19pbnQzMl90CWNodW5rX2NudDsgLyogY291bnQgb2YgZnJlZSBpbm9kZXMgaW4gY2h1bmsgKi8KKwkJeGZzX2lub2ZyZWVfdAljaHVua19mcmVlOyAvKiBtYXNrIG9mIGZyZWUgaW5vZGVzIGluIGNodW5rICovCisJCXhmc19idWZfdAkqYWdicDsJLyogYWdpIGJ1ZmZlciAqLworCQlpbnQJCWk7CS8qIHRlbXAgc3RhdGUgKi8KKwogCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CiAJCWVycm9yID0geGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIGFnbm8sICZhZ2JwKTsKIAkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKIAkJaWYgKGVycm9yKSB7Ci0jaWZkZWYgREVCVUcKLQkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2ltYXA6ICIKIAkJCQkJInhmc19pYWxsb2NfcmVhZF9hZ2koKSByZXR1cm5lZCAiCiAJCQkJCSJlcnJvciAlZCwgYWdubyAlZCIsCiAJCQkJCWVycm9yLCBhZ25vKTsKLSNlbmRpZiAvKiBERUJVRyAqLwogCQkJcmV0dXJuIGVycm9yOwogCQl9Ci0JCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9JTk8sCi0JCQkoeGZzX2lub2RlX3QgKikwLCAwKTsKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfbGUoY3VyLCBhZ2lubywgMCwgMCwgJmkpKSkgewotI2lmZGVmIERFQlVHCi0JCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfZGlsb2NhdGU6ICIKKworCQljdXIgPSB4ZnNfaW5vYnRfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBhZ25vKTsKKwkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2xlKGN1ciwgYWdpbm8sIDAsIDAsICZpKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfaW1hcDogIgogCQkJCQkieGZzX2lub2J0X2xvb2t1cF9sZSgpIGZhaWxlZCIpOwotI2VuZGlmIC8qIERFQlVHICovCiAJCQlnb3RvIGVycm9yMDsKIAkJfQotCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmY2h1bmtfYWdpbm8sICZjaHVua19jbnQsCi0JCQkJJmNodW5rX2ZyZWUsICZpKSkpIHsKLSNpZmRlZiBERUJVRwotCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2RpbG9jYXRlOiAiCisKKwkJZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZjaHVua19hZ2lubywgJmNodW5rX2NudCwKKwkJCQkmY2h1bmtfZnJlZSwgJmkpOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19pbWFwOiAiCiAJCQkJCSJ4ZnNfaW5vYnRfZ2V0X3JlYygpIGZhaWxlZCIpOwotI2VuZGlmIC8qIERFQlVHICovCiAJCQlnb3RvIGVycm9yMDsKIAkJfQogCQlpZiAoaSA9PSAwKSB7CiAjaWZkZWYgREVCVUcKLQkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2ltYXA6ICIKIAkJCQkJInhmc19pbm9idF9nZXRfcmVjKCkgZmFpbGVkIik7CiAjZW5kaWYgLyogREVCVUcgKi8KIAkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCX0KKyBlcnJvcjA6CiAJCXhmc190cmFuc19icmVsc2UodHAsIGFnYnApOwogCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKIAkJaWYgKGVycm9yKQpAQCAtMTI5MCwxOSArMTM0NCwzNSBAQAogCQljaHVua19hZ2JubyA9IFhGU19BR0lOT19UT19BR0JOTyhtcCwgY2h1bmtfYWdpbm8pOwogCQlvZmZzZXRfYWdibm8gPSBhZ2JubyAtIGNodW5rX2FnYm5vOwogCX0KKwogCUFTU0VSVChhZ2JubyA+PSBjaHVua19hZ2Jubyk7CiAJY2x1c3Rlcl9hZ2JubyA9IGNodW5rX2FnYm5vICsKIAkJKChvZmZzZXRfYWdibm8gLyBibGtzX3Blcl9jbHVzdGVyKSAqIGJsa3NfcGVyX2NsdXN0ZXIpOwogCW9mZnNldCA9ICgoYWdibm8gLSBjbHVzdGVyX2FnYm5vKSAqIG1wLT5tX3NiLnNiX2lub3BibG9jaykgKwogCQlYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKLQkqYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGNsdXN0ZXJfYWdibm8pOwotCSpvZmYgPSBvZmZzZXQ7Ci0JKmxlbiA9IGJsa3NfcGVyX2NsdXN0ZXI7CisKKwlpbWFwLT5pbV9ibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGNsdXN0ZXJfYWdibm8pOworCWltYXAtPmltX2xlbiA9IFhGU19GU0JfVE9fQkIobXAsIGJsa3NfcGVyX2NsdXN0ZXIpOworCWltYXAtPmltX2JvZmZzZXQgPSAodXNob3J0KShvZmZzZXQgPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2cpOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgbnVtYmVyIG1hcHMgdG8gYSBibG9jayBvdXRzaWRlIHRoZSBib3VuZHMKKwkgKiBvZiB0aGUgZmlsZSBzeXN0ZW0gdGhlbiByZXR1cm4gTlVMTCByYXRoZXIgdGhhbiBjYWxsaW5nCisJICogcmVhZF9idWYgYW5kIHBhbmljaW5nIHdoZW4gd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlCisJICogZHJpdmVyLgorCSAqLworCWlmICgoaW1hcC0+aW1fYmxrbm8gKyBpbWFwLT5pbV9sZW4pID4KKwkgICAgWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfZGJsb2NrcykpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2ltYXA6ICIKKwkJCSIoaW1hcC0+aW1fYmxrbm8gKDB4JWxseCkgKyBpbWFwLT5pbV9sZW4gKDB4JWxseCkpID4gIgorCQkJIiBYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9kYmxvY2tzKSAoMHglbGx4KSIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbWFwLT5pbV9ibGtubywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGltYXAtPmltX2xlbiwKKwkJCVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwogCXJldHVybiAwOwotZXJyb3IwOgotCXhmc190cmFuc19icmVsc2UodHAsIGFnYnApOwotCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKLQlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0xMzcwLDcwICsxNDQwLDk1IEBACiAJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7CiB9CiAKKyNpZmRlZiBERUJVRworU1RBVElDIHZvaWQKK3hmc19jaGVja19hZ2lfdW5saW5rZWQoCisJc3RydWN0IHhmc19hZ2kJCSphZ2kpCit7CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFM7IGkrKykKKwkJQVNTRVJUKGFnaS0+YWdpX3VubGlua2VkW2ldKTsKK30KKyNlbHNlCisjZGVmaW5lIHhmc19jaGVja19hZ2lfdW5saW5rZWQoYWdpKQorI2VuZGlmCisKIC8qCiAgKiBSZWFkIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAoaW5vZGUgYWxsb2NhdGlvbiBzZWN0aW9uKQogICovCiBpbnQKLXhmc19pYWxsb2NfcmVhZF9hZ2koCi0JeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCi0JeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwotCXhmc19idWZfdAkqKmJwcCkJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGRyIGJ1ZiAqLworeGZzX3JlYWRfYWdpKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCiB7Ci0JeGZzX2FnaV90CSphZ2k7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAqLwotCWludAkJYWdpX29rOwkJLyogYWdpIGlzIGNvbnNpc3RlbnQgKi8KLQl4ZnNfYnVmX3QJKmJwOwkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCi0JeGZzX3BlcmFnX3QJKnBhZzsJCS8qIHBlciBhbGxvY2F0aW9uIGdyb3VwIGRhdGEgKi8KLQlpbnQJCWVycm9yOworCXN0cnVjdCB4ZnNfYWdpCQkqYWdpOwkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAqLworCWludAkJCWFnaV9vazsJLyogYWdpIGlzIGNvbnNpc3RlbnQgKi8KKwlpbnQJCQllcnJvcjsKIAogCUFTU0VSVChhZ25vICE9IE5VTExBR05VTUJFUik7Ci0JZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYoCi0JCQltcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisKKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCiAJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSwKLQkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYnApOworCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDAsIGJwcCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JQVNTRVJUKGJwICYmICFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisKKwlBU1NFUlQoKmJwcCAmJiAhWEZTX0JVRl9HRVRFUlJPUigqYnBwKSk7CisJYWdpID0gWEZTX0JVRl9UT19BR0koKmJwcCk7CiAKIAkvKgogCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGFnaSBibG9jay4KIAkgKi8KLQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7Ci0JYWdpX29rID0KLQkJYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pID09IFhGU19BR0lfTUFHSUMgJiYKLQkJWEZTX0FHSV9HT09EX1ZFUlNJT04oYmUzMl90b19jcHUoYWdpLT5hZ2lfdmVyc2lvbm51bSkpOworCWFnaV9vayA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDICYmCisJCVhGU19BR0lfR09PRF9WRVJTSU9OKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3ZlcnNpb25udW0pKSAmJgorCQliZTMyX3RvX2NwdShhZ2ktPmFnaV9zZXFubykgPT0gYWdubzsKIAlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnaV9vaywgbXAsIFhGU19FUlJUQUdfSUFMTE9DX1JFQURfQUdJLAogCQkJWEZTX1JBTkRPTV9JQUxMT0NfUkVBRF9BR0kpKSkgewotCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lhbGxvY19yZWFkX2FnaSIsIFhGU19FUlJMRVZFTF9MT1csCisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfcmVhZF9hZ2kiLCBYRlNfRVJSTEVWRUxfTE9XLAogCQkJCSAgICAgbXAsIGFnaSk7Ci0JCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgKmJwcCk7CiAJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKIAl9CisKKwlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19BR0ksIFhGU19BR0lfUkVGKTsKKworCXhmc19jaGVja19hZ2lfdW5saW5rZWQoYWdpKTsKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfaWFsbG9jX3JlYWRfYWdpKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCit7CisJc3RydWN0IHhmc19hZ2kJCSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisJc3RydWN0IHhmc19wZXJhZwkqcGFnOwkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisJaW50CQkJZXJyb3I7CisKKwllcnJvciA9IHhmc19yZWFkX2FnaShtcCwgdHAsIGFnbm8sIGJwcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSSgqYnBwKTsKIAlwYWcgPSAmbXAtPm1fcGVyYWdbYWdub107CisKIAlpZiAoIXBhZy0+cGFnaV9pbml0KSB7CiAJCXBhZy0+cGFnaV9mcmVlY291bnQgPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9mcmVlY291bnQpOwogCQlwYWctPnBhZ2lfY291bnQgPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9jb3VudCk7CiAJCXBhZy0+cGFnaV9pbml0ID0gMTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJdCdzIHBvc3NpYmxlIGZvciB0aGVzZSB0byBiZSBvdXQgb2Ygc3luYyBpZgotCQkgKiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZvcmNlZCBzaHV0ZG93bi4KLQkJICovCi0JCUFTU0VSVChwYWctPnBhZ2lfZnJlZWNvdW50ID09IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2ZyZWVjb3VudCkgfHwKLQkJCVhGU19GT1JDRURfU0hVVERPV04obXApKTsKIAl9CiAKLSNpZmRlZiBERUJVRwotCXsKLQkJaW50CWk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsgaSsrKQotCQkJQVNTRVJUKGFnaS0+YWdpX3VubGlua2VkW2ldKTsKLQl9Ci0jZW5kaWYKLQotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19BR0ksIFhGU19BR0lfUkVGKTsKLQkqYnBwID0gYnA7CisJLyoKKwkgKiBJdCdzIHBvc3NpYmxlIGZvciB0aGVzZSB0byBiZSBvdXQgb2Ygc3luYyBpZgorCSAqIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZm9yY2VkIHNodXRkb3duLgorCSAqLworCUFTU0VSVChwYWctPnBhZ2lfZnJlZWNvdW50ID09IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2ZyZWVjb3VudCkgfHwKKwkJWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5oIGIvZnMveGZzL3hmc19pYWxsb2MuaAppbmRleCA0ZTMwZWMxLi41MGY1NThhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5oCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogc3RydWN0IHhmc19idWY7CiBzdHJ1Y3QgeGZzX2Rpbm9kZTsKK3N0cnVjdCB4ZnNfaW1hcDsKIHN0cnVjdCB4ZnNfbW91bnQ7CiBzdHJ1Y3QgeGZzX3RyYW5zOwogCkBAIC01Niw3ICs1Nyw2IEBACiB9CiAKIAotI2lmZGVmIF9fS0VSTkVMX18KIC8qCiAgKiBBbGxvY2F0ZSBhbiBpbm9kZSBvbiBkaXNrLgogICogTW9kZSBpcyB1c2VkIHRvIHRlbGwgd2hldGhlciB0aGUgbmV3IGlub2RlIHdpbGwgbmVlZCBzcGFjZSwgYW5kIHdoZXRoZXIKQEAgLTEwNSwxNyArMTA1LDE0IEBACiAJeGZzX2lub190CSpmaXJzdF9pbm8pOwkvKiBmaXJzdCBpbm9kZSBpbiBkZWxldGVkIGNsdXN0ZXIgKi8KIAogLyoKLSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGlub2RlIGluIGJuby9sZW4vb2ZmLAotICogZm9yIG1hcHBpbmcgaXQgaW50byBhIGJ1ZmZlci4KKyAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGlub2RlIGluIGltYXAsIGZvciBtYXBwaW5nIGl0IGludG8gYSBidWZmZXIuCiAgKi8KIGludAoteGZzX2RpbG9jYXRlKAoreGZzX2ltYXAoCiAJc3RydWN0IHhmc19tb3VudCAqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgdG8gbG9jYXRlICovCi0JeGZzX2ZzYmxvY2tfdAkqYm5vLAkJLyogb3V0cHV0OiBibG9jayBjb250YWluaW5nIGlub2RlICovCi0JaW50CQkqbGVuLAkJLyogb3V0cHV0OiBudW0gYmxvY2tzIGluIGNsdXN0ZXIqLwotCWludAkJKm9mZiwJCS8qIG91dHB1dDogaW5kZXggaW4gYmxvY2sgb2YgaW5vZGUgKi8KKwlzdHJ1Y3QgeGZzX2ltYXAJKmltYXAsCQkvKiBsb2NhdGlvbiBtYXAgc3RydWN0dXJlICovCiAJdWludAkJZmxhZ3MpOwkJLyogZmxhZ3MgZm9yIGlub2RlIGJ0cmVlIGxvb2t1cCAqLwogCiAvKgpAQCAtMTU0LDYgKzE1MSwyNCBAQAogCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwogICAgICAgICB4ZnNfYWdudW1iZXJfdCAgYWdubyk7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwogCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpbm8KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludCB4ZnNfaW5vYnRfbG9va3VwX2dlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2lub190IGlubywKKwkJX19pbnQzMl90IGZjbnQsCXhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbm8KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludCB4ZnNfaW5vYnRfbG9va3VwX2xlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19hZ2lub190IGlubywKKwkJX19pbnQzMl90IGZjbnQsCXhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKKworLyoKKyAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KKyAqLworZXh0ZXJuIGludCB4ZnNfaW5vYnRfZ2V0X3JlYyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCAqaW5vLAorCQkJICAgICBfX2ludDMyX3QgKmZjbnQsIHhmc19pbm9mcmVlX3QgKmZyZWUsIGludCAqc3RhdCk7CiAKICNlbmRpZgkvKiBfX1hGU19JQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwppbmRleCA4MzUwMmYzLi45OWYyNDA4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMKQEAgLTM1LDIwNDQgKzM1LDM0OSBAQAogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAKLVNUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfYmxvY2soeGZzX3RyYW5zX3QgKiwgeGZzX2J1Zl90ICosIGludCk7Ci1TVEFUSUMgdm9pZCB4ZnNfaW5vYnRfbG9nX2tleXMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7Ci1TVEFUSUMgdm9pZCB4ZnNfaW5vYnRfbG9nX3B0cnMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7Ci1TVEFUSUMgdm9pZCB4ZnNfaW5vYnRfbG9nX3JlY3MoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7Ci1TVEFUSUMgaW50IHhmc19pbm9idF9sc2hpZnQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgaW50ICopOwotU1RBVElDIGludCB4ZnNfaW5vYnRfbmV3cm9vdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50ICopOwotU1RBVElDIGludCB4ZnNfaW5vYnRfcnNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2lub2J0X3NwbGl0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIHhmc19hZ2Jsb2NrX3QgKiwKLQkJeGZzX2lub2J0X2tleV90ICosIHhmc19idHJlZV9jdXJfdCAqKiwgaW50ICopOwotU1RBVElDIGludCB4ZnNfaW5vYnRfdXBka2V5KHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfaW5vYnRfa2V5X3QgKiwgaW50KTsKIAotLyoKLSAqIFNpbmdsZSBsZXZlbCBvZiB0aGUgeGZzX2lub2J0X2RlbGV0ZSByZWNvcmQgZGVsZXRpb24gcm91dGluZS4KLSAqIERlbGV0ZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIvbGV2ZWwuCi0gKiBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIGl0cyBibG9jayB0aGVuIHJlYmFsYW5jZSB0aGUgdHJlZS4KLSAqIFJldHVybiAwIGZvciBlcnJvciwgMSBmb3IgZG9uZSwgMiB0byBnbyBvbiB0byB0aGUgbmV4dCBsZXZlbC4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2RlbHJlYygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCByZW1vdmluZyByZWNvcmQgZnJvbSAqLwotCWludAkJCSpzdGF0KQkvKiBmYWlsL2RvbmUvZ28tb24gKi8KK1NUQVRJQyBpbnQKK3hmc19pbm9idF9nZXRfbWlucmVjcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsKQogewotCXhmc19idWZfdAkJKmFnYnA7CS8qIGJ1ZmZlciBmb3IgYS5nLiBpbm9kZSBoZWFkZXIgKi8KLQl4ZnNfbW91bnRfdAkJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KLQl4ZnNfYWdpX3QJCSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaW5vZGUgaGVhZGVyICovCi0JeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayByZWNvcmQva2V5IGxpdmVzIGluICovCi0JeGZzX2FnYmxvY2tfdAkJYm5vOwkvKiBidHJlZSBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCi0JeGZzX2lub2J0X2tleV90CQlrZXk7CS8qIGtwIHBvaW50cyBoZXJlIGlmIGJsb2NrIGlzIGxldmVsIDAgKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCSprcCA9IE5VTEw7CS8qIHBvaW50ZXIgdG8gYnRyZWUga2V5cyAqLwotCXhmc19hZ2Jsb2NrX3QJCWxibm87CS8qIGxlZnQgYmxvY2sncyBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpsYnA7CS8qIGxlZnQgYmxvY2sncyBidWZmZXIgcG9pbnRlciAqLwotCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2lub2J0X2tleV90CQkqbGtwOwkvKiBsZWZ0IGJsb2NrIGtleSBwb2ludGVyICovCi0JeGZzX2lub2J0X3B0cl90CQkqbHBwOwkvKiBsZWZ0IGJsb2NrIGFkZHJlc3MgcG9pbnRlciAqLwotCWludAkJCWxyZWNzID0gMDsJLyogbnVtYmVyIG9mIHJlY29yZHMgaW4gbGVmdCBibG9jayAqLwotCXhmc19pbm9idF9yZWNfdAkJKmxycDsJLyogbGVmdCBibG9jayByZWNvcmQgcG9pbnRlciAqLwotCXhmc19pbm9idF9wdHJfdAkJKnBwID0gTlVMTDsJLyogcG9pbnRlciB0byBidHJlZSBhZGRyZXNzZXMgKi8KLQlpbnQJCQlwdHI7CS8qIGluZGV4IGluIGJ0cmVlIGJsb2NrIGZvciB0aGlzIHJlYyAqLwotCXhmc19hZ2Jsb2NrX3QJCXJibm87CS8qIHJpZ2h0IGJsb2NrJ3MgYmxvY2sgbnVtYmVyICovCi0JeGZzX2J1Zl90CQkqcmJwOwkvKiByaWdodCBibG9jaydzIGJ1ZmZlciBwb2ludGVyICovCi0JeGZzX2lub2J0X2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCBidHJlZSBibG9jayAqLwotCXhmc19pbm9idF9rZXlfdAkJKnJrcDsJLyogcmlnaHQgYmxvY2sga2V5IHBvaW50ZXIgKi8KLQl4ZnNfaW5vYnRfcmVjX3QJCSpycDsJLyogcG9pbnRlciB0byBidHJlZSByZWNvcmRzICovCi0JeGZzX2lub2J0X3B0cl90CQkqcnBwOwkvKiByaWdodCBibG9jayBhZGRyZXNzIHBvaW50ZXIgKi8KLQlpbnQJCQlycmVjcyA9IDA7CS8qIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGJsb2NrICovCi0JaW50CQkJbnVtcmVjczsKLQl4ZnNfaW5vYnRfcmVjX3QJCSpycnA7CS8qIHJpZ2h0IGJsb2NrIHJlY29yZCBwb2ludGVyICovCi0JeGZzX2J0cmVlX2N1cl90CQkqdGN1cjsJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCXJldHVybiBjdXItPmJjX21wLT5tX2lub2J0X21ucltsZXZlbCAhPSAwXTsKK30KIAotCW1wID0gY3VyLT5iY19tcDsKK1NUQVRJQyBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqCit4ZnNfaW5vYnRfZHVwX2N1cnNvcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyKQoreworCXJldHVybiB4ZnNfaW5vYnRfaW5pdF9jdXJzb3IoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8pOworfQogCi0JLyoKLQkgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBiZWluZyBkZWxldGVkLCBjaGVjayBmb3Igbm90aGluZyB0aGVyZS4KLQkgKi8KLQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwotCWlmIChwdHIgPT0gMCkgeworU1RBVElDIHZvaWQKK3hmc19pbm9idF9zZXRfcm9vdCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9wdHIJKm5wdHIsCisJaW50CQkJaW5jKQkvKiBsZXZlbCBjaGFuZ2UgKi8KK3sKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOworCXN0cnVjdCB4ZnNfYWdpCQkqYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisKKwlhZ2ktPmFnaV9yb290ID0gbnB0ci0+czsKKwliZTMyX2FkZF9jcHUoJmFnaS0+YWdpX2xldmVsLCBpbmMpOworCXhmc19pYWxsb2NfbG9nX2FnaShjdXItPmJjX3RwLCBhZ2JwLCBYRlNfQUdJX1JPT1QgfCBYRlNfQUdJX0xFVkVMKTsKK30KKworU1RBVElDIGludAoreGZzX2lub2J0X2FsbG9jX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqc3RhcnQsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqbmV3LAorCWludAkJCWxlbmd0aCwKKwlpbnQJCQkqc3RhdCkKK3sKKwl4ZnNfYWxsb2NfYXJnX3QJCWFyZ3M7CQkvKiBibG9jayBhbGxvY2F0aW9uIGFyZ3MgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19hZ2Jsb2NrX3QJCXNibm8gPSBiZTMyX3RvX2NwdShzdGFydC0+cyk7CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VOVFJZKTsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLnRwID0gY3VyLT5iY190cDsKKwlhcmdzLm1wID0gY3VyLT5iY19tcDsKKwlhcmdzLmZzYm5vID0gWEZTX0FHQl9UT19GU0IoYXJncy5tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywgc2Jubyk7CisJYXJncy5taW5sZW4gPSAxOworCWFyZ3MubWF4bGVuID0gMTsKKwlhcmdzLnByb2QgPSAxOworCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisKKwllcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKTsKKwlpZiAoZXJyb3IpIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJWEZTX0JUUkVFX1RSQUNFX0NVUlNPUihjdXIsIFhCVF9FWElUKTsKIAkJKnN0YXQgPSAwOwogCQlyZXR1cm4gMDsKIAl9CisJQVNTRVJUKGFyZ3MubGVuID09IDEpOworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVhJVCk7CiAKLQkvKgotCSAqIEdldCB0aGUgYnVmZmVyICYgYmxvY2sgY29udGFpbmluZyB0aGUgcmVjb3JkIG9yIGtleS9wdHIuCi0JICovCi0JYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKLQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JLyoKLQkgKiBGYWlsIGlmIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KLQkgKi8KLQotCW51bXJlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7Ci0JaWYgKHB0ciA+IG51bXJlY3MpIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBJdCdzIGEgbm9ubGVhZi4gIEV4Y2lzZSB0aGUga2V5IGFuZCBwdHIgYmVpbmcgZGVsZXRlZCwgYnkKLQkgKiBzbGlkaW5nIHRoZSBlbnRyaWVzIHBhc3QgdGhlbSBkb3duIG9uZS4KLQkgKiBMb2cgdGhlIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGJsb2NrLgotCSAqLwotCWlmIChsZXZlbCA+IDApIHsKLQkJa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0JCXBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JCWZvciAoaSA9IHB0cjsgaSA8IG51bXJlY3M7IGkrKykgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocHBbaV0pLCBsZXZlbCkpKQotCQkJCXJldHVybiBlcnJvcjsKLQkJfQotI2VuZGlmCi0JCWlmIChwdHIgPCBudW1yZWNzKSB7Ci0JCQltZW1tb3ZlKCZrcFtwdHIgLSAxXSwgJmtwW3B0cl0sCi0JCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCprcCkpOwotCQkJbWVtbW92ZSgmcHBbcHRyIC0gMV0sICZwcFtwdHJdLAotCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqa3ApKTsKLQkJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKLQkJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKLQkJfQotCX0KLQkvKgotCSAqIEl0J3MgYSBsZWFmLiAgRXhjaXNlIHRoZSByZWNvcmQgYmVpbmcgZGVsZXRlZCwgYnkgc2xpZGluZyB0aGUKLQkgKiBlbnRyaWVzIHBhc3QgaXQgZG93biBvbmUuICBMb2cgdGhlIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGJsb2NrLgotCSAqLwotCWVsc2UgewotCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKLQkJaWYgKHB0ciA8IG51bXJlY3MpIHsKLQkJCW1lbW1vdmUoJnJwW3B0ciAtIDFdLCAmcnBbcHRyXSwKLQkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKnJwKSk7Ci0JCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7Ci0JCX0KLQkJLyoKLQkJICogSWYgaXQncyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBibG9jaywgd2UnbGwgbmVlZCBhIGtleQotCQkgKiBzdHJ1Y3R1cmUgdG8gcGFzcyB1cCB0byB0aGUgbmV4dCBsZXZlbCAodXBka2V5KS4KLQkJICovCi0JCWlmIChwdHIgPT0gMSkgewotCQkJa2V5LmlyX3N0YXJ0aW5vID0gcnAtPmlyX3N0YXJ0aW5vOwotCQkJa3AgPSAma2V5OwotCQl9Ci0JfQotCS8qCi0JICogRGVjcmVtZW50IGFuZCBsb2cgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBibG9jay4KLQkgKi8KLQludW1yZWNzLS07Ci0JYmxvY2stPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihudW1yZWNzKTsKLQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7Ci0JLyoKLQkgKiBJcyB0aGlzIHRoZSByb290IGxldmVsPyAgSWYgc28sIHdlJ3JlIGFsbW9zdCBkb25lLgotCSAqLwotCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7Ci0JCS8qCi0JCSAqIElmIHRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwsCi0JCSAqIGFuZCB0aGVyZSdzIG9ubHkgb25lIGVudHJ5IGxlZnQsCi0JCSAqIGFuZCBpdCdzIE5PVCB0aGUgbGVhZiBsZXZlbCwKLQkJICogdGhlbiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGxldmVsLgotCQkgKi8KLQkJaWYgKG51bXJlY3MgPT0gMSAmJiBsZXZlbCA+IDApIHsKLQkJCWFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOwotCQkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7Ci0JCQkvKgotCQkJICogcHAgaXMgc3RpbGwgc2V0IHRvIHRoZSBmaXJzdCBwb2ludGVyIGluIHRoZSBibG9jay4KLQkJCSAqIE1ha2UgaXQgdGhlIG5ldyByb290IG9mIHRoZSBidHJlZS4KLQkJCSAqLwotCQkJYm5vID0gYmUzMl90b19jcHUoYWdpLT5hZ2lfcm9vdCk7Ci0JCQlhZ2ktPmFnaV9yb290ID0gKnBwOwotCQkJYmUzMl9hZGRfY3B1KCZhZ2ktPmFnaV9sZXZlbCwgLTEpOwotCQkJLyoKLQkJCSAqIEZyZWUgdGhlIGJsb2NrLgotCQkJICovCi0JCQlpZiAoKGVycm9yID0geGZzX2ZyZWVfZXh0ZW50KGN1ci0+YmNfdHAsCi0JCQkJWEZTX0FHQl9UT19GU0IobXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJubyksIDEpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQl4ZnNfdHJhbnNfYmludmFsKGN1ci0+YmNfdHAsIGJwKTsKLQkJCXhmc19pYWxsb2NfbG9nX2FnaShjdXItPmJjX3RwLCBhZ2JwLAotCQkJCVhGU19BR0lfUk9PVCB8IFhGU19BR0lfTEVWRUwpOwotCQkJLyoKLQkJCSAqIFVwZGF0ZSB0aGUgY3Vyc29yIHNvIHRoZXJlJ3Mgb25lIGZld2VyIGxldmVsLgotCQkJICovCi0JCQljdXItPmJjX2J1ZnNbbGV2ZWxdID0gTlVMTDsKLQkJCWN1ci0+YmNfbmxldmVscy0tOwotCQl9IGVsc2UgaWYgKGxldmVsID4gMCAmJgotCQkJICAgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQotCQkJcmV0dXJuIGVycm9yOwotCQkqc3RhdCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIElmIHdlIGRlbGV0ZWQgdGhlIGxlZnRtb3N0IGVudHJ5IGluIHRoZSBibG9jaywgdXBkYXRlIHRoZQotCSAqIGtleSB2YWx1ZXMgYWJvdmUgdXMgaW4gdGhlIHRyZWUuCi0JICovCi0JaWYgKHB0ciA9PSAxICYmIChlcnJvciA9IHhmc19pbm9idF91cGRrZXkoY3VyLCBrcCwgbGV2ZWwgKyAxKSkpCi0JCXJldHVybiBlcnJvcjsKLQkvKgotCSAqIElmIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZW1haW5pbmcgaW4gdGhlIGJsb2NrIGlzIGF0IGxlYXN0Ci0JICogdGhlIG1pbmltdW0sIHdlJ3JlIGRvbmUuCi0JICovCi0JaWYgKG51bXJlY3MgPj0gWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJaWYgKGxldmVsID4gMCAmJgotCQkgICAgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQotCQkJcmV0dXJuIGVycm9yOwotCQkqc3RhdCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBtb3ZlIHNvbWUgcmVjb3JkcyBhcm91bmQgdG8ga2VlcCB0aGUKLQkgKiB0cmVlIGJhbGFuY2VkLiAgTG9vayBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgc2libGluZyBibG9ja3MgdG8KLQkgKiBzZWUgaWYgd2UgY2FuIHJlLWJhbGFuY2UgYnkgbW92aW5nIG9ubHkgb25lIHJlY29yZC4KLQkgKi8KLQlyYm5vID0gYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKTsKLQlsYm5vID0gYmUzMl90b19jcHUoYmxvY2stPmJiX2xlZnRzaWIpOwotCWJubyA9IE5VTExBR0JMT0NLOwotCUFTU0VSVChyYm5vICE9IE5VTExBR0JMT0NLIHx8IGxibm8gIT0gTlVMTEFHQkxPQ0spOwotCS8qCi0JICogRHVwbGljYXRlIHRoZSBjdXJzb3Igc28gb3VyIGJ0cmVlIG1hbmlwdWxhdGlvbnMgaGVyZSB3b24ndAotCSAqIGRpc3J1cHQgdGhlIG5leHQgbGV2ZWwgdXAuCi0JICovCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkKLQkJcmV0dXJuIGVycm9yOwotCS8qCi0JICogSWYgdGhlcmUncyBhIHJpZ2h0IHNpYmxpbmcsIHNlZSBpZiBpdCdzIG9rIHRvIHNoaWZ0IGFuIGVudHJ5Ci0JICogb3V0IG9mIGl0LgotCSAqLwotCWlmIChyYm5vICE9IE5VTExBR0JMT0NLKSB7Ci0JCS8qCi0JCSAqIE1vdmUgdGhlIHRlbXAgY3Vyc29yIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBuZXh0IGJsb2NrLgotCQkgKiBBY3R1YWxseSBhbnkgZW50cnkgYnV0IHRoZSBmaXJzdCB3b3VsZCBzdWZmaWNlLgotCQkgKi8KLQkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKLQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkKLQkJCWdvdG8gZXJyb3IwOwotCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJLyoKLQkJICogR3JhYiBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLgotCQkgKi8KLQkJcmJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKLQkJCWdvdG8gZXJyb3IwOwotI2VuZGlmCi0JCS8qCi0JCSAqIEdyYWIgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLCBmb3IgZnV0dXJlIHVzZS4KLQkJICovCi0JCWJubyA9IGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKTsKLQkJLyoKLQkJICogSWYgcmlnaHQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKLQkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCBsZWZ0LXNoaWZ0aW5nIGFuIGVudHJ5IG91dAotCQkgKiBvZiByaWdodCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KLQkJICovCi0JCWlmIChiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxID49Ci0JCSAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbHNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQotCQkJCWdvdG8gZXJyb3IwOwotCQkJaWYgKGkpIHsKLQkJCQlBU1NFUlQoYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpID49Ci0JCQkJICAgICAgIFhGU19JTk9CVF9CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKTsKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLAotCQkJCQkJICAgICBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJaWYgKGxldmVsID4gMCAmJgotCQkJCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsCi0JCQkJCQkmaSkpKQotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJKnN0YXQgPSAxOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSwgZ3JhYiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgZm9yCi0JCSAqIGZ1dHVyZSByZWZlcmVuY2UsIGFuZCBmaXggdXAgdGhlIHRlbXAgY3Vyc29yIHRvIHBvaW50Ci0JCSAqIHRvIG91ciBibG9jayBhZ2FpbiAobGFzdCByZWNvcmQpLgotCQkgKi8KLQkJcnJlY3MgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7Ci0JCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7Ci0JCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOwotCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCi0JCQkJZ290byBlcnJvcjA7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBJZiB0aGVyZSdzIGEgbGVmdCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQotCSAqIG91dCBvZiBpdC4KLQkgKi8KLQlpZiAobGJubyAhPSBOVUxMQUdCTE9DSykgewotCQkvKgotCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlCi0JCSAqIHByZXZpb3VzIGJsb2NrLgotCQkgKi8KLQkJeGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCi0JCQlnb3RvIGVycm9yMDsKLQkJeGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKLQkJLyoKLQkJICogR3JhYiBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLgotCQkgKi8KLQkJbGJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCi0JCQlnb3RvIGVycm9yMDsKLSNlbmRpZgotCQkvKgotCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCi0JCSAqLwotCQlibm8gPSBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYik7Ci0JCS8qCi0JCSAqIElmIGxlZnQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKLQkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCByaWdodC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKLQkJICogb2YgbGVmdCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KLQkJICovCi0JCWlmIChiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAtIDEgPj0KLQkJICAgICBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgewotCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9yc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpCi0JCQkJZ290byBlcnJvcjA7Ci0JCQlpZiAoaSkgewotCQkJCUFTU0VSVChiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykgPj0KLQkJCQkgICAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOwotCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCi0JCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQkJY3VyLT5iY19wdHJzWzBdKys7Ci0JCQkJKnN0YXQgPSAxOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSwgZ3JhYiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgZm9yCi0JCSAqIGZ1dHVyZSByZWZlcmVuY2UuCi0JCSAqLwotCQlscmVjcyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpOwotCX0KLQkvKgotCSAqIERlbGV0ZSB0aGUgdGVtcCBjdXJzb3IsIHdlJ3JlIGRvbmUgd2l0aCBpdC4KLQkgKi8KLQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JLyoKLQkgKiBJZiBoZXJlLCB3ZSBuZWVkIHRvIGRvIGEgam9pbiB0byBrZWVwIHRoZSB0cmVlIGJhbGFuY2VkLgotCSAqLwotCUFTU0VSVChibm8gIT0gTlVMTEFHQkxPQ0spOwotCS8qCi0JICogU2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IgYmxvY2suCi0JICovCi0JaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYKLQkgICAgbHJlY3MgKyBudW1yZWNzIDw9IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7Ci0JCS8qCi0JCSAqIFNldCAicmlnaHQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKLQkJICogImxlZnQiIHRvIGJlIHRoZSBsZWZ0IG5laWdoYm9yLgotCQkgKi8KLQkJcmJubyA9IGJubzsKLQkJcmlnaHQgPSBibG9jazsKLQkJcnJlY3MgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcyk7Ci0JCXJicCA9IGJwOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBsYm5vLCAwLCAmbGJwLAotCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7Ci0JCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKgotCSAqIElmIHRoYXQgd29uJ3Qgd29yaywgc2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLgotCSAqLwotCWVsc2UgaWYgKHJibm8gIT0gTlVMTEFHQkxPQ0sgJiYKLQkJIHJyZWNzICsgbnVtcmVjcyA8PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgewotCQkvKgotCQkgKiBTZXQgImxlZnQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKLQkJICogInJpZ2h0IiB0byBiZSB0aGUgcmlnaHQgbmVpZ2hib3IuCi0JCSAqLwotCQlsYm5vID0gYm5vOwotCQlsZWZ0ID0gYmxvY2s7Ci0JCWxyZWNzID0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JCWxicCA9IGJwOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCByYm5vLCAwLCAmcmJwLAotCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOwotCQlycmVjcyA9IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKgotCSAqIE90aGVyd2lzZSwgd2UgY2FuJ3QgZml4IHRoZSBpbWJhbGFuY2UuCi0JICogSnVzdCByZXR1cm4uICBUaGlzIGlzIHByb2JhYmx5IGEgbG9naWMgZXJyb3IsIGJ1dCBpdCdzIG5vdCBmYXRhbC4KLQkgKi8KLQllbHNlIHsKLQkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCSpzdGF0ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogV2UncmUgbm93IGdvaW5nIHRvIGpvaW4gImxlZnQiIGFuZCAicmlnaHQiIGJ5IG1vdmluZyBhbGwgdGhlIHN0dWZmCi0JICogaW4gInJpZ2h0IiB0byAibGVmdCIgYW5kIGRlbGV0aW5nICJyaWdodCIuCi0JICovCi0JaWYgKGxldmVsID4gMCkgewotCQkvKgotCQkgKiBJdCdzIGEgbm9uLWxlYWYuICBNb3ZlIGtleXMgYW5kIHBvaW50ZXJzLgotCQkgKi8KLQkJbGtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGxlZnQsIGxyZWNzICsgMSwgY3VyKTsKLQkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIGxyZWNzICsgMSwgY3VyKTsKLQkJcmtwID0gWEZTX0lOT0JUX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQlycHAgPSBYRlNfSU5PQlRfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IHJyZWNzOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHJwcFtpXSksIGxldmVsKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0jZW5kaWYKLQkJbWVtY3B5KGxrcCwgcmtwLCBycmVjcyAqIHNpemVvZigqbGtwKSk7Ci0JCW1lbWNweShscHAsIHJwcCwgcnJlY3MgKiBzaXplb2YoKmxwcCkpOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBsYnAsIGxyZWNzICsgMSwgbHJlY3MgKyBycmVjcyk7Ci0JCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJdCdzIGEgbGVhZi4gIE1vdmUgcmVjb3Jkcy4KLQkJICovCi0JCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBscmVjcyArIDEsIGN1cik7Ci0JCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtY3B5KGxycCwgcnJwLCBycmVjcyAqIHNpemVvZigqbHJwKSk7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgbGVmdCBuZWlnaGJvciwgc2V0IHRoZSBidWZmZXIgaW4gdGhlCi0JICogY3Vyc29yIHRvIHRoZSBsZWZ0IGJsb2NrLCBhbmQgZml4IHVwIHRoZSBpbmRleC4KLQkgKi8KLQlpZiAoYnAgIT0gbGJwKSB7Ci0JCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgbGJwKTsKLQkJY3VyLT5iY19wdHJzW2xldmVsXSArPSBscmVjczsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYW5kIHRoZXJlJ3MgYSBsZXZlbCBhYm92ZQotCSAqIHVzLCBpbmNyZW1lbnQgdGhlIGN1cnNvciBhdCB0aGF0IGxldmVsLgotCSAqLwotCWVsc2UgaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscyAmJgotCQkgKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjdXIsIGxldmVsICsgMSwgJmkpKSkKLQkJcmV0dXJuIGVycm9yOwotCS8qCi0JICogRml4IHVwIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLgotCSAqLwotCWxyZWNzICs9IHJyZWNzOwotCWxlZnQtPmJiX251bXJlY3MgPSBjcHVfdG9fYmUxNihscmVjcyk7Ci0JLyoKLQkgKiBGaXggdXAgdGhlIHJpZ2h0IGJsb2NrIHBvaW50ZXIgaW4gdGhlIHN1cnZpdmluZyBibG9jaywgYW5kIGxvZyBpdC4KLQkgKi8KLQlsZWZ0LT5iYl9yaWdodHNpYiA9IHJpZ2h0LT5iYl9yaWdodHNpYjsKLQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOwotCS8qCi0JICogSWYgdGhlcmUgaXMgYSByaWdodCBzaWJsaW5nIG5vdywgbWFrZSBpdCBwb2ludCB0byB0aGUKLQkgKiByZW1haW5pbmcgYmxvY2suCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewotCQl4ZnNfaW5vYnRfYmxvY2tfdAkqcnJibG9jazsKLQkJeGZzX2J1Zl90CQkqcnJicDsKLQotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksIDAsCi0JCQkJJnJyYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJyYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCXJyYmxvY2stPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihsYm5vKTsKLQkJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7Ci0JfQotCS8qCi0JICogRnJlZSB0aGUgZGVsZXRpbmcgYmxvY2suCi0JICovCi0JaWYgKChlcnJvciA9IHhmc19mcmVlX2V4dGVudChjdXItPmJjX3RwLCBYRlNfQUdCX1RPX0ZTQihtcCwKLQkJCQkgICAgIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIHJibm8pLCAxKSkpCi0JCXJldHVybiBlcnJvcjsKLQl4ZnNfdHJhbnNfYmludmFsKGN1ci0+YmNfdHAsIHJicCk7Ci0JLyoKLQkgKiBSZWFkanVzdCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwgaWYgaXQncyBub3QgYSBsZWFmLCBzaW5jZSBpdCdzCi0JICogc3RpbGwgcG9pbnRpbmcgYXQgdGhlIGRlbGV0aW9uIHBvaW50LCB3aGljaCBtYWtlcyB0aGUgY3Vyc29yCi0JICogaW5jb25zaXN0ZW50LiAgSWYgdGhpcyBtYWtlcyB0aGUgcHRyIDAsIHRoZSBjYWxsZXIgZml4ZXMgaXQgdXAuCi0JICogV2UgY2FuJ3QgdXNlIGRlY3JlbWVudCBiZWNhdXNlIGl0IHdvdWxkIGNoYW5nZSB0aGUgbmV4dCBsZXZlbCB1cC4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKQotCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07Ci0JLyoKLQkgKiBSZXR1cm4gdmFsdWUgbWVhbnMgdGhlIG5leHQgbGV2ZWwgdXAgaGFzIHNvbWV0aGluZyB0byBkby4KLQkgKi8KLQkqc3RhdCA9IDI7CisJbmV3LT5zID0gY3B1X3RvX2JlMzIoWEZTX0ZTQl9UT19BR0JOTyhhcmdzLm1wLCBhcmdzLmZzYm5vKSk7CisJKnN0YXQgPSAxOwogCXJldHVybiAwOworfQogCi1lcnJvcjA6Ci0JeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKK1NUQVRJQyBpbnQKK3hmc19pbm9idF9mcmVlX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwl4ZnNfZnNibG9ja190CQlmc2JubzsKKwlpbnQJCQllcnJvcjsKKworCWZzYm5vID0gWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoYnApKTsKKwllcnJvciA9IHhmc19mcmVlX2V4dGVudChjdXItPmJjX3RwLCBmc2JubywgMSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwl4ZnNfdHJhbnNfYmludmFsKGN1ci0+YmNfdHAsIGJwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBJbnNlcnQgb25lIHJlY29yZC9sZXZlbC4gIFJldHVybiBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyCi0gKiBhbGxvd2luZyB0aGUgbmV4dCBsZXZlbCB1cCB0byBwcm9jZWVkIGlmIG5lY2Vzc2FyeS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2luc3JlYygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBpbnNlcnQgcmVjb3JkIGF0ICovCi0JeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIGkvbzogYmxvY2sgbnVtYmVyIGluc2VydGVkICovCi0JeGZzX2lub2J0X3JlY190CQkqcmVjcCwJLyogaS9vOiByZWNvcmQgZGF0YSBpbnNlcnRlZCAqLwotCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgcmVwbGFjaW5nIGN1ciAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK1NUQVRJQyBpbnQKK3hmc19pbm9idF9nZXRfbWF4cmVjcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsKQogewotCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgcmVjb3JkL2tleSBsaXZlcyBpbiAqLwotCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCi0JaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGJlaW5nIGluc2VydGVkICovCi0JeGZzX2lub2J0X2tleV90CQkqa3A9TlVMTDsJLyogcG9pbnRlciB0byBidHJlZSBrZXlzICovCi0JeGZzX2FnYmxvY2tfdAkJbmJubzsJLyogYmxvY2sgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9jayAqLwotCXhmc19idHJlZV9jdXJfdAkJKm5jdXI7CS8qIG5ldyBjdXJzb3IgdG8gYmUgdXNlZCBhdCBuZXh0IGx2bCAqLwotCXhmc19pbm9idF9rZXlfdAkJbmtleTsJLyogbmV3IGtleSB2YWx1ZSwgZnJvbSBzcGxpdCAqLwotCXhmc19pbm9idF9yZWNfdAkJbnJlYzsJLyogbmV3IHJlY29yZCB2YWx1ZSwgZm9yIGNhbGxlciAqLwotCWludAkJCW51bXJlY3M7Ci0JaW50CQkJb3B0cjsJLyogb2xkIHB0ciB2YWx1ZSAqLwotCXhmc19pbm9idF9wdHJfdAkJKnBwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGFkZHJlc3NlcyAqLwotCWludAkJCXB0cjsJLyogaW5kZXggaW4gYnRyZWUgYmxvY2sgZm9yIHRoaXMgcmVjICovCi0JeGZzX2lub2J0X3JlY190CQkqcnA9TlVMTDsJLyogcG9pbnRlciB0byBidHJlZSByZWNvcmRzICovCisJcmV0dXJuIGN1ci0+YmNfbXAtPm1faW5vYnRfbXhyW2xldmVsICE9IDBdOworfQogCi0JLyoKLQkgKiBHQ0MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAoYXJndWFibHkgY29tcGxleCkgY29udHJvbCBmbG93IGluCi0JICogdGhpcyBmdW5jdGlvbiBhbmQgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGl6ZWQgc3RydWN0dXJlIGZpZWxkcwotCSAqIHdpdGhvdXQgdGhpcy4KLQkgKi8KLQltZW1zZXQoJm5yZWMsIDAsIHNpemVvZihucmVjKSk7CitTVEFUSUMgdm9pZAoreGZzX2lub2J0X2luaXRfa2V5X2Zyb21fcmVjKAorCXVuaW9uIHhmc19idHJlZV9rZXkJKmtleSwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyZWMpCit7CisJa2V5LT5pbm9idC5pcl9zdGFydGlubyA9IHJlYy0+aW5vYnQuaXJfc3RhcnRpbm87Cit9CiAKLQkvKgotCSAqIElmIHdlIG1hZGUgaXQgdG8gdGhlIHJvb3QgbGV2ZWwsIGFsbG9jYXRlIGEgbmV3IHJvb3QgYmxvY2sKLQkgKiBhbmQgd2UncmUgZG9uZS4KLQkgKi8KLQlpZiAobGV2ZWwgPj0gY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCWVycm9yID0geGZzX2lub2J0X25ld3Jvb3QoY3VyLCAmaSk7Ci0JCSpibm9wID0gTlVMTEFHQkxPQ0s7Ci0JCSpzdGF0ID0gaTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKgotCSAqIE1ha2UgYSBrZXkgb3V0IG9mIHRoZSByZWNvcmQgZGF0YSB0byBiZSBpbnNlcnRlZCwgYW5kIHNhdmUgaXQuCi0JICovCi0Ja2V5LmlyX3N0YXJ0aW5vID0gcmVjcC0+aXJfc3RhcnRpbm87Ci0Jb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JLyoKLQkgKiBJZiB3ZSdyZSBvZmYgdGhlIGxlZnQgZWRnZSwgcmV0dXJuIGZhaWx1cmUuCi0JICovCi0JaWYgKHB0ciA9PSAwKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogR2V0IHBvaW50ZXJzIHRvIHRoZSBidHJlZSBidWZmZXIgYW5kIGJsb2NrLgotCSAqLwotCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotCW51bXJlY3MgPSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcyk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKLQkJcmV0dXJuIGVycm9yOwotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgbmV3IGVudHJ5IGlzIGJlaW5nIGluc2VydGVkIGluIHRoZSByaWdodCBwbGFjZS4KLQkgKi8KLQlpZiAocHRyIDw9IG51bXJlY3MpIHsKLQkJaWYgKGxldmVsID09IDApIHsKLQkJCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJlY3AsIHJwKTsKLQkJfSBlbHNlIHsKLQkJCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sICZrZXksIGtwKTsKLQkJfQotCX0KLSNlbmRpZgotCW5ibm8gPSBOVUxMQUdCTE9DSzsKLQluY3VyID0gTlVMTDsKLQkvKgotCSAqIElmIHRoZSBibG9jayBpcyBmdWxsLCB3ZSBjYW4ndCBpbnNlcnQgdGhlIG5ldyBlbnRyeSB1bnRpbCB3ZQotCSAqIG1ha2UgdGhlIGJsb2NrIHVuLWZ1bGwuCi0JICovCi0JaWYgKG51bXJlY3MgPT0gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJLyoKLQkJICogRmlyc3QsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgcmlnaHQgbmVpZ2hib3IuCi0JCSAqLwotCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3JzaGlmdChjdXIsIGxldmVsLCAmaSkpKQotCQkJcmV0dXJuIGVycm9yOwotCQlpZiAoaSkgewotCQkJLyogbm90aGluZyAqLwotCQl9Ci0JCS8qCi0JCSAqIE5leHQsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgbGVmdCBuZWlnaGJvci4KLQkJICovCi0JCWVsc2UgewotCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQlpZiAoaSkgewotCQkJCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIE5leHQsIHRyeSBzcGxpdHRpbmcgdGhlIGN1cnJlbnQgYmxvY2sKLQkJCQkgKiBpbiBoYWxmLiBJZiB0aGlzIHdvcmtzIHdlIGhhdmUgdG8KLQkJCQkgKiByZS1zZXQgb3VyIHZhcmlhYmxlcyBiZWNhdXNlCi0JCQkJICogd2UgY291bGQgYmUgaW4gYSBkaWZmZXJlbnQgYmxvY2sgbm93LgotCQkJCSAqLwotCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfc3BsaXQoY3VyLCBsZXZlbCwgJm5ibm8sCi0JCQkJCQkmbmtleSwgJm5jdXIsICZpKSkpCi0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQlpZiAoaSkgewotCQkJCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JCQkJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0jaWZkZWYgREVCVUcKLQkJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLAotCQkJCQkJCWJsb2NrLCBsZXZlbCwgYnApKSkKLQkJCQkJCXJldHVybiBlcnJvcjsKLSNlbmRpZgotCQkJCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOwotCQkJCQlucmVjLmlyX3N0YXJ0aW5vID0gbmtleS5pcl9zdGFydGlubzsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBPdGhlcndpc2UgdGhlIGluc2VydCBmYWlscy4KLQkJCQkJICovCi0JCQkJCSpzdGF0ID0gMDsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qCi0JICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlJ3Mgcm9vbSBmb3Igb3VyIG5ldyBlbnRyeSBpbiB0aGUgYmxvY2sKLQkgKiB3ZSdyZSBwb2ludGluZyBhdC4KLQkgKi8KLQludW1yZWNzID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotCWlmIChsZXZlbCA+IDApIHsKLQkJLyoKLQkJICogSXQncyBhIG5vbi1sZWFmIGVudHJ5LiAgTWFrZSBhIGhvbGUgZm9yIHRoZSBuZXcgZGF0YQotCQkgKiBpbiB0aGUga2V5IGFuZCBwdHIgcmVnaW9ucyBvZiB0aGUgYmxvY2suCi0JCSAqLwotCQlrcCA9IFhGU19JTk9CVF9LRVlfQUREUihibG9jaywgMSwgY3VyKTsKLQkJcHAgPSBYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gbnVtcmVjczsgaSA+PSBwdHI7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocHBbaSAtIDFdKSwgbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOwotCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sCi0JCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOwotCQkvKgotCQkgKiBOb3cgc3R1ZmYgdGhlIG5ldyBkYXRhIGluLCBidW1wIG51bXJlY3MgYW5kIGxvZyB0aGUgbmV3IGRhdGEuCi0JCSAqLwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsICpibm9wLCBsZXZlbCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCWtwW3B0ciAtIDFdID0ga2V5OwotCQlwcFtwdHIgLSAxXSA9IGNwdV90b19iZTMyKCpibm9wKTsKLQkJbnVtcmVjcysrOwotCQlibG9jay0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KG51bXJlY3MpOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKLQkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogSXQncyBhIGxlYWYgZW50cnkuICBNYWtlIGEgaG9sZSBmb3IgdGhlIG5ldyByZWNvcmQuCi0JCSAqLwotCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKLQkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAotCQkJKG51bXJlY3MgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKLQkJLyoKLQkJICogTm93IHN0dWZmIHRoZSBuZXcgcmVjb3JkIGluLCBidW1wIG51bXJlY3MKLQkJICogYW5kIGxvZyB0aGUgbmV3IGRhdGEuCi0JCSAqLwotCQlycFtwdHIgLSAxXSA9ICpyZWNwOwotCQludW1yZWNzKys7Ci0JCWJsb2NrLT5iYl9udW1yZWNzID0gY3B1X3RvX2JlMTYobnVtcmVjcyk7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOwotCX0KLQkvKgotCSAqIExvZyB0aGUgbmV3IG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBidHJlZSBoZWFkZXIuCi0JICovCi0JeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBicCwgWEZTX0JCX05VTVJFQ1MpOwotI2lmZGVmIERFQlVHCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBrZXkvcmVjb3JkIGlzIGluIHRoZSByaWdodCBwbGFjZSwgbm93LgotCSAqLwotCWlmIChwdHIgPCBudW1yZWNzKSB7Ci0JCWlmIChsZXZlbCA9PSAwKQotCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycCArIHB0ciAtIDEsCi0JCQkJcnAgKyBwdHIpOwotCQllbHNlCi0JCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIGtwICsgcHRyIC0gMSwKLQkJCQlrcCArIHB0cik7Ci0JfQotI2VuZGlmCi0JLyoKLQkgKiBJZiB3ZSBpbnNlcnRlZCBhdCB0aGUgc3RhcnQgb2YgYSBibG9jaywgdXBkYXRlIHRoZSBwYXJlbnRzJyBrZXlzLgotCSAqLwotCWlmIChvcHRyID09IDEgJiYgKGVycm9yID0geGZzX2lub2J0X3VwZGtleShjdXIsICZrZXksIGxldmVsICsgMSkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBSZXR1cm4gdGhlIG5ldyBibG9jayBudW1iZXIsIGlmIGFueS4KLQkgKiBJZiB0aGVyZSBpcyBvbmUsIGdpdmUgYmFjayBhIHJlY29yZCB2YWx1ZSBhbmQgYSBjdXJzb3IgdG9vLgotCSAqLwotCSpibm9wID0gbmJubzsKLQlpZiAobmJubyAhPSBOVUxMQUdCTE9DSykgewotCQkqcmVjcCA9IG5yZWM7Ci0JCSpjdXJwID0gbmN1cjsKLQl9Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOworU1RBVElDIHZvaWQKK3hmc19pbm9idF9pbml0X3JlY19mcm9tX2tleSgKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjKQoreworCXJlYy0+aW5vYnQuaXJfc3RhcnRpbm8gPSBrZXktPmlub2J0LmlyX3N0YXJ0aW5vOworfQorCitTVEFUSUMgdm9pZAoreGZzX2lub2J0X2luaXRfcmVjX2Zyb21fY3VyKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJdW5pb24geGZzX2J0cmVlX3JlYwkqcmVjKQoreworCXJlYy0+aW5vYnQuaXJfc3RhcnRpbm8gPSBjcHVfdG9fYmUzMihjdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vKTsKKwlyZWMtPmlub2J0LmlyX2ZyZWVjb3VudCA9IGNwdV90b19iZTMyKGN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50KTsKKwlyZWMtPmlub2J0LmlyX2ZyZWUgPSBjcHVfdG9fYmU2NChjdXItPmJjX3JlYy5pLmlyX2ZyZWUpOwogfQogCiAvKgotICogTG9nIGhlYWRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrLgorICogaW50aWFsIHZhbHVlIG9mIHB0ciBmb3IgbG9va3VwCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfaW5vYnRfbG9nX2Jsb2NrKAotCXhmc190cmFuc190CQkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlmaWVsZHMpCS8qIG1hc2sgb2YgZmllbGRzOiBYRlNfQkJfLi4uICovCit4ZnNfaW5vYnRfaW5pdF9wdHJfZnJvbV9jdXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcHRyCSpwdHIpCiB7Ci0JaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCi0Jc3RhdGljIGNvbnN0IHNob3J0CW9mZnNldHNbXSA9IHsJLyogdGFibGUgb2Ygb2Zmc2V0cyAqLwotCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbWFnaWMpLAotCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbGV2ZWwpLAotCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbnVtcmVjcyksCi0JCW9mZnNldG9mKHhmc19pbm9idF9ibG9ja190LCBiYl9sZWZ0c2liKSwKLQkJb2Zmc2V0b2YoeGZzX2lub2J0X2Jsb2NrX3QsIGJiX3JpZ2h0c2liKSwKLQkJc2l6ZW9mKHhmc19pbm9idF9ibG9ja190KQotCX07CisJc3RydWN0IHhmc19hZ2kJCSphZ2kgPSBYRlNfQlVGX1RPX0FHSShjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKIAotCXhmc19idHJlZV9vZmZzZXRzKGZpZWxkcywgb2Zmc2V0cywgWEZTX0JCX05VTV9CSVRTLCAmZmlyc3QsICZsYXN0KTsKLQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwlBU1NFUlQoY3VyLT5iY19wcml2YXRlLmEuYWdubyA9PSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9zZXFubykpOworCisJcHRyLT5zID0gYWdpLT5hZ2lfcm9vdDsKIH0KIAotLyoKLSAqIExvZyBrZXlzIGZyb20gYSBidHJlZSBibG9jayAobm9ubGVhZikuCi0gKi8KLVNUQVRJQyB2b2lkCi14ZnNfaW5vYnRfbG9nX2tleXMoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlrZmlyc3QsCS8qIGluZGV4IG9mIGZpcnN0IGtleSB0byBsb2cgKi8KLQlpbnQJCQlrbGFzdCkJLyogaW5kZXggb2YgbGFzdCBrZXkgdG8gbG9nICovCitTVEFUSUMgX19pbnQ2NF90Cit4ZnNfaW5vYnRfa2V5X2RpZmYoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXkpCiB7Ci0JeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayB0byBsb2cgZnJvbSAqLwotCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCSprcDsJLyoga2V5IHBvaW50ZXIgaW4gYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCi0JYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKLQlrcCA9IFhGU19JTk9CVF9LRVlfQUREUihibG9jaywgMSwgY3VyKTsKLQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkma3Bba2ZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZrcFtrbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwlyZXR1cm4gKF9faW50NjRfdCliZTMyX3RvX2NwdShrZXktPmlub2J0LmlyX3N0YXJ0aW5vKSAtCisJCQkgIGN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm87CiB9CiAKLS8qCi0gKiBMb2cgYmxvY2sgcG9pbnRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrIChub25sZWFmKS4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19pbm9idF9sb2dfcHRycygKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19idWZfdAkJKmJwLAkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLwotCWludAkJCXBmaXJzdCwJLyogaW5kZXggb2YgZmlyc3QgcG9pbnRlciB0byBsb2cgKi8KLQlpbnQJCQlwbGFzdCkJLyogaW5kZXggb2YgbGFzdCBwb2ludGVyIHRvIGxvZyAqLworU1RBVElDIGludAoreGZzX2lub2J0X2tpbGxfcm9vdCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCisJaW50CQkJbGV2ZWwsCisJdW5pb24geGZzX2J0cmVlX3B0cgkqbmV3cm9vdCkKIHsKLQl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCi0JaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLwotCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCi0JeGZzX2lub2J0X3B0cl90CQkqcHA7CS8qIGJsb2NrLXBvaW50ZXIgcG9pbnRlciBpbiBidHJlZSBibGsgKi8KLQotCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0JcHAgPSBYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7Ci0JZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnBwW3BmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKLQlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkmcHBbcGxhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOwotCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Ci19Ci0KLS8qCi0gKiBMb2cgcmVjb3JkcyBmcm9tIGEgYnRyZWUgYmxvY2sgKGxlYWYpLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2lub2J0X2xvZ19yZWNzKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJcmZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCByZWNvcmQgdG8gbG9nICovCi0JaW50CQkJcmxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcmVjb3JkIHRvIGxvZyAqLwotewotCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KLQlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCi0JaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KLQl4ZnNfaW5vYnRfcmVjX3QJCSpycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCi0KLQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOwotCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZycFtyZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7Ci0JbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJnJwW3JsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKLQl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwgZmlyc3QsIGxhc3QpOwotfQotCi0vKgotICogTG9va3VwIHRoZSByZWNvcmQuICBUaGUgY3Vyc29yIGlzIG1hZGUgdG8gcG9pbnQgdG8gaXQsIGJhc2VkIG9uIGRpci4KLSAqIFJldHVybiAwIGlmIGNhbid0IGZpbmQgYW55IHN1Y2ggcmVjb3JkLCAxIGZvciBzdWNjZXNzLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfbG9va3VwKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2xvb2t1cF90CQlkaXIsCS8qIDw9LCA9PSwgb3IgPj0gKi8KLQlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JeGZzX2FnYmxvY2tfdAkJYWdibm87CS8qIGEuZy4gcmVsYXRpdmUgYnRyZWUgYmxvY2sgbnVtYmVyICovCi0JeGZzX2FnbnVtYmVyX3QJCWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCi0JeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrPU5VTEw7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KLQlfX2ludDY0X3QJCWRpZmY7CS8qIGRpZmZlcmVuY2UgZm9yIHRoZSBjdXJyZW50IGtleSAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlrZXlubz0wOwkvKiBjdXJyZW50IGtleSBudW1iZXIgKi8KLQlpbnQJCQlsZXZlbDsJLyogbGV2ZWwgaW4gdGhlIGJ0cmVlICovCi0JeGZzX21vdW50X3QJCSptcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KLQotCS8qCi0JICogR2V0IHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciwgYW5kIHRoZSByb290IGJsb2NrIG51bWJlci4KLQkgKi8KLQltcCA9IGN1ci0+YmNfbXA7Ci0JewotCQl4ZnNfYWdpX3QJKmFnaTsJLyogYS5nLiBpbm9kZSBoZWFkZXIgKi8KLQotCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKLQkJYWdubyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX3NlcW5vKTsKLQkJYWdibm8gPSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9yb290KTsKLQl9Ci0JLyoKLQkgKiBJdGVyYXRlIG92ZXIgZWFjaCBsZXZlbCBpbiB0aGUgYnRyZWUsIHN0YXJ0aW5nIGF0IHRoZSByb290LgotCSAqIEZvciBlYWNoIGxldmVsIGFib3ZlIHRoZSBsZWF2ZXMsIGZpbmQgdGhlIGtleSB3ZSBuZWVkLCBiYXNlZAotCSAqIG9uIHRoZSBsb29rdXAgcmVjb3JkLCB0aGVuIGZvbGxvdyB0aGUgY29ycmVzcG9uZGluZyBibG9jawotCSAqIHBvaW50ZXIgZG93biB0byB0aGUgbmV4dCBsZXZlbC4KLQkgKi8KLQlmb3IgKGxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMSwgZGlmZiA9IDE7IGxldmVsID49IDA7IGxldmVsLS0pIHsKLQkJeGZzX2J1Zl90CSpicDsJLyogYnVmZmVyIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCi0JCXhmc19kYWRkcl90CWQ7CS8qIGRpc2sgYWRkcmVzcyBvZiBidHJlZSBibG9jayAqLwotCi0JCS8qCi0JCSAqIEdldCB0aGUgZGlzayBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgZm9yLgotCQkgKi8KLQkJZCA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKLQkJLyoKLQkJICogSWYgdGhlIG9sZCBidWZmZXIgYXQgdGhpcyBsZXZlbCBpcyBmb3IgYSBkaWZmZXJlbnQgYmxvY2ssCi0JCSAqIHRocm93IGl0IGF3YXksIG90aGVyd2lzZSBqdXN0IHVzZSBpdC4KLQkJICovCi0JCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQkJaWYgKGJwICYmIFhGU19CVUZfQUREUihicCkgIT0gZCkKLQkJCWJwID0gTlVMTDsKLQkJaWYgKCFicCkgewotCQkJLyoKLQkJCSAqIE5lZWQgdG8gZ2V0IGEgbmV3IGJ1ZmZlci4gIFJlYWQgaXQsIHRoZW4KLQkJCSAqIHNldCBpdCBpbiB0aGUgY3Vyc29yLCByZWxlYXNpbmcgdGhlIG9sZCBvbmUuCi0JCQkgKi8KLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAotCQkJCQlhZ25vLCBhZ2JubywgMCwgJmJwLCBYRlNfSU5PX0JUUkVFX1JFRikpKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOwotCQkJLyoKLQkJCSAqIFBvaW50IHRvIHRoZSBidHJlZSBibG9jaywgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyCi0JCQkgKi8KLQkJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwKLQkJCQkJYnApKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0gZWxzZQotCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKLQkJLyoKLQkJICogSWYgd2UgYWxyZWFkeSBoYWQgYSBrZXkgbWF0Y2ggYXQgYSBoaWdoZXIgbGV2ZWwsIHdlIGtub3cKLQkJICogd2UgbmVlZCB0byB1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoaXMgYmxvY2suCi0JCSAqLwotCQlpZiAoZGlmZiA9PSAwKQotCQkJa2V5bm8gPSAxOwotCQkvKgotCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCB0byBzZWFyY2ggdGhpcyBibG9jay4gIERvIGEgYmluYXJ5IHNlYXJjaC4KLQkJICovCi0JCWVsc2UgewotCQkJaW50CQloaWdoOwkvKiBoaWdoIGVudHJ5IG51bWJlciAqLwotCQkJeGZzX2lub2J0X2tleV90CSpra2Jhc2U9TlVMTDsvKiBiYXNlIG9mIGtleXMgaW4gYmxvY2sgKi8KLQkJCXhmc19pbm9idF9yZWNfdAkqa3JiYXNlPU5VTEw7LyogYmFzZSBvZiByZWNvcmRzIGluIGJsb2NrICovCi0JCQlpbnQJCWxvdzsJLyogbG93IGVudHJ5IG51bWJlciAqLwotCi0JCQkvKgotCQkJICogR2V0IGEgcG9pbnRlciB0byBrZXlzIG9yIHJlY29yZHMuCi0JCQkgKi8KLQkJCWlmIChsZXZlbCA+IDApCi0JCQkJa2tiYXNlID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOwotCQkJZWxzZQotCQkJCWtyYmFzZSA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKLQkJCS8qCi0JCQkgKiBTZXQgbG93IGFuZCBoaWdoIGVudHJ5IG51bWJlcnMsIDEtYmFzZWQuCi0JCQkgKi8KLQkJCWxvdyA9IDE7Ci0JCQlpZiAoIShoaWdoID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKSkgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB0aGUgdHJlZSBtdXN0Ci0JCQkJICogYmUgYW4gZW1wdHkgbGVhZi4KLQkJCQkgKi8KLQkJCQlBU1NFUlQobGV2ZWwgPT0gMCAmJiBjdXItPmJjX25sZXZlbHMgPT0gMSk7Ci0JCQkJY3VyLT5iY19wdHJzWzBdID0gZGlyICE9IFhGU19MT09LVVBfTEU7Ci0JCQkJKnN0YXQgPSAwOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyoKLQkJCSAqIEJpbmFyeSBzZWFyY2ggdGhlIGJsb2NrLgotCQkJICovCi0JCQl3aGlsZSAobG93IDw9IGhpZ2gpIHsKLQkJCQl4ZnNfYWdpbm9fdAlzdGFydGlubzsJLyoga2V5IHZhbHVlICovCi0KLQkJCQkvKgotCQkJCSAqIGtleW5vIGlzIGF2ZXJhZ2Ugb2YgbG93IGFuZCBoaWdoLgotCQkJCSAqLwotCQkJCWtleW5vID0gKGxvdyArIGhpZ2gpID4+IDE7Ci0JCQkJLyoKLQkJCQkgKiBHZXQgc3RhcnRpbm8uCi0JCQkJICovCi0JCQkJaWYgKGxldmVsID4gMCkgewotCQkJCQl4ZnNfaW5vYnRfa2V5X3QJKmtrcDsKLQotCQkJCQlra3AgPSBra2Jhc2UgKyBrZXlubyAtIDE7Ci0JCQkJCXN0YXJ0aW5vID0gYmUzMl90b19jcHUoa2twLT5pcl9zdGFydGlubyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJeGZzX2lub2J0X3JlY190CSprcnA7Ci0KLQkJCQkJa3JwID0ga3JiYXNlICsga2V5bm8gLSAxOwotCQkJCQlzdGFydGlubyA9IGJlMzJfdG9fY3B1KGtycC0+aXJfc3RhcnRpbm8pOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSB0byBnZXQgbmV4dCBkaXJlY3Rpb24uCi0JCQkJICovCi0JCQkJZGlmZiA9IChfX2ludDY0X3QpCi0JCQkJCXN0YXJ0aW5vIC0gY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubzsKLQkJCQkvKgotCQkJCSAqIExlc3MgdGhhbiwgbW92ZSByaWdodC4KLQkJCQkgKi8KLQkJCQlpZiAoZGlmZiA8IDApCi0JCQkJCWxvdyA9IGtleW5vICsgMTsKLQkJCQkvKgotCQkJCSAqIEdyZWF0ZXIgdGhhbiwgbW92ZSBsZWZ0LgotCQkJCSAqLwotCQkJCWVsc2UgaWYgKGRpZmYgPiAwKQotCQkJCQloaWdoID0ga2V5bm8gLSAxOwotCQkJCS8qCi0JCQkJICogRXF1YWwsIHdlJ3JlIGRvbmUuCi0JCQkJICovCi0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHNldCB1cCBmb3IgdGhlIG5leHQgbGV2ZWwKLQkJICogYnkgZ2V0dGluZyB0aGUgYmxvY2sgbnVtYmVyIGFuZCBmaWxsaW5nIGluIHRoZSBjdXJzb3IuCi0JCSAqLwotCQlpZiAobGV2ZWwgPiAwKSB7Ci0JCQkvKgotCQkJICogSWYgd2UgbW92ZWQgbGVmdCwgbmVlZCB0aGUgcHJldmlvdXMga2V5IG51bWJlciwKLQkJCSAqIHVubGVzcyB0aGVyZSBpc24ndCBvbmUuCi0JCQkgKi8KLQkJCWlmIChkaWZmID4gMCAmJiAtLWtleW5vIDwgMSkKLQkJCQlrZXlubyA9IDE7Ci0JCQlhZ2JubyA9IGJlMzJfdG9fY3B1KCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGtleW5vLCBjdXIpKTsKLSNpZmRlZiBERUJVRwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYWdibm8sIGxldmVsKSkpCi0JCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87Ci0JCX0KLQl9Ci0JLyoKLQkgKiBEb25lIHdpdGggdGhlIHNlYXJjaC4KLQkgKiBTZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuCi0JICovCi0JaWYgKGRpciAhPSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPCAwKSB7Ci0JCWtleW5vKys7Ci0JCS8qCi0JCSAqIElmIGdlIHNlYXJjaCBhbmQgd2Ugd2VudCBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBpdCdzCi0JCSAqIG5vdCB0aGUgbGFzdCBibG9jaywgd2UncmUgaW4gdGhlIHdyb25nIGJsb2NrLgotCQkgKi8KLQkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmCi0JCSAgICBrZXlubyA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSAmJgotCQkgICAgYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewotCQkJaW50CWk7Ci0KLQkJCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOwotCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCUFTU0VSVChpID09IDEpOwotCQkJKnN0YXQgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoZGlyID09IFhGU19MT09LVVBfTEUgJiYgZGlmZiA+IDApCi0JCWtleW5vLS07Ci0JY3VyLT5iY19wdHJzWzBdID0ga2V5bm87Ci0JLyoKLQkgKiBSZXR1cm4gaWYgd2Ugc3VjY2VlZGVkIG9yIG5vdC4KLQkgKi8KLQlpZiAoa2V5bm8gPT0gMCB8fCBrZXlubyA+IGJlMTZfdG9fY3B1KGJsb2NrLT5iYl9udW1yZWNzKSkKLQkJKnN0YXQgPSAwOwotCWVsc2UKLQkJKnN0YXQgPSAoKGRpciAhPSBYRlNfTE9PS1VQX0VRKSB8fCAoZGlmZiA9PSAwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBNb3ZlIDEgcmVjb3JkIGxlZnQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCi0gKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfbHNoaWZ0KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0jaWZkZWYgREVCVUcKLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCi0jZW5kaWYKLQl4ZnNfaW5vYnRfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGZvciBsZWFmIGxldmVsIHVwd2FyZCAqLwotCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IG5laWdoYm9yIGJsb2NrICovCi0JeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCSpsa3A9TlVMTDsJLyoga2V5IHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KLQl4ZnNfaW5vYnRfcHRyX3QJCSpscHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCXhmc19pbm9idF9yZWNfdAkJKmxycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCWludAkJCW5yZWM7CS8qIG5ldyBudW1iZXIgb2YgbGVmdCBibG9jayBlbnRyaWVzICovCi0JeGZzX2J1Zl90CQkqcmJwOwkvKiBidWZmZXIgZm9yIHJpZ2h0IChjdXJyZW50KSBibG9jayAqLwotCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCi0JeGZzX2lub2J0X2tleV90CQkqcmtwPU5VTEw7CS8qIGtleSBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwotCXhmc19pbm9idF9wdHJfdAkJKnJwcD1OVUxMOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCi0JeGZzX2lub2J0X3JlY190CQkqcnJwPU5VTEw7CS8qIHJlY29yZCBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwotCi0JLyoKLQkgKiBTZXQgdXAgdmFyaWFibGVzIGZvciB0aGlzIGJsb2NrIGFzICJyaWdodCIuCi0JICovCi0JcmJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKLQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKLQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JLyoKLQkgKiBJZiB3ZSd2ZSBnb3Qgbm8gbGVmdCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgbGVmdC4KLQkgKi8KLQlpZiAoYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpID09IE5VTExBR0JMT0NLKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogSWYgdGhlIGN1cnNvciBlbnRyeSBpcyB0aGUgb25lIHRoYXQgd291bGQgYmUgbW92ZWQsIGRvbid0Ci0JICogZG8gaXQuLi4gaXQncyB0b28gY29tcGxpY2F0ZWQuCi0JICovCi0JaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gMSkgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIFNldCB1cCB0aGUgbGVmdCBuZWlnaGJvciBhcyAibGVmdCIuCi0JICovCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKLQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9sZWZ0c2liKSwKLQkJCTAsICZsYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCXJldHVybiBlcnJvcjsKLQlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KLQkgKi8KLQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcykgPT0gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKLQkJKnN0YXQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JbnJlYyA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMTsKLQkvKgotCSAqIElmIG5vbi1sZWFmLCBjb3B5IGEga2V5IGFuZCBhIHB0ciB0byB0aGUgbGVmdCBibG9jay4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBucmVjLCBjdXIpOwotCQlya3AgPSBYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCSpsa3AgPSAqcmtwOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOwotCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgbnJlYywgY3VyKTsKLQkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KCpycHApLCBsZXZlbCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCSpscHAgPSAqcnBwOwotCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOwotCX0KLQkvKgotCSAqIElmIGxlYWYsIGNvcHkgYSByZWNvcmQgdG8gdGhlIGxlZnQgYmxvY2suCi0JICovCi0JZWxzZSB7Ci0JCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBucmVjLCBjdXIpOwotCQlycnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCSpscnAgPSAqcnJwOwotCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOwotCX0KLQkvKgotCSAqIEJ1bXAgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgZGVjcmVtZW50IGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgotCSAqLwotCWJlMTZfYWRkX2NwdSgmbGVmdC0+YmJfbnVtcmVjcywgMSk7Ci0JeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLSNpZmRlZiBERUJVRwotCWlmIChsZXZlbCA+IDApCi0JCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgbGtwIC0gMSwgbGtwKTsKLQllbHNlCi0JCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgbHJwIC0gMSwgbHJwKTsKLSNlbmRpZgotCWJlMTZfYWRkX2NwdSgmcmlnaHQtPmJiX251bXJlY3MsIC0xKTsKLQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJicCwgWEZTX0JCX05VTVJFQ1MpOwotCS8qCi0JICogU2xpZGUgdGhlIGNvbnRlbnRzIG9mIHJpZ2h0IGRvd24gb25lIGVudHJ5LgotCSAqLwotCWlmIChsZXZlbCA+IDApIHsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpOyBpKyspIHsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGJlMzJfdG9fY3B1KHJwcFtpICsgMV0pLAotCQkJCQlsZXZlbCkpKQotCQkJCXJldHVybiBlcnJvcjsKLQkJfQotI2VuZGlmCi0JCW1lbW1vdmUocmtwLCBya3AgKyAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJrcCkpOwotCQltZW1tb3ZlKHJwcCwgcnBwICsgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycHApKTsKLQkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykpOwotCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7Ci0JfSBlbHNlIHsKLQkJbWVtbW92ZShycnAsIHJycCArIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnJwKSk7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJa2V5LmlyX3N0YXJ0aW5vID0gcnJwLT5pcl9zdGFydGlubzsKLQkJcmtwID0gJmtleTsKLQl9Ci0JLyoKLQkgKiBVcGRhdGUgdGhlIHBhcmVudCBrZXkgdmFsdWVzIG9mIHJpZ2h0LgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfdXBka2V5KGN1ciwgcmtwLCBsZXZlbCArIDEpKSkKLQkJcmV0dXJuIGVycm9yOwotCS8qCi0JICogU2xpZGUgdGhlIGN1cnNvciB2YWx1ZSBsZWZ0IG9uZS4KLQkgKi8KLQljdXItPmJjX3B0cnNbbGV2ZWxdLS07Ci0JKnN0YXQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogQWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaywgZmlsbCBpdCBpbi4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X25ld3Jvb3QoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JeGZzX2FnaV90CQkqYWdpOwkvKiBhLmcuIGlub2RlIGhlYWRlciAqLwotCXhmc19hbGxvY19hcmdfdAkJYXJnczsJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KLQl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIG9uZSBoYWxmIG9mIHRoZSBvbGQgcm9vdCBibG9jayAqLwotCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCSprcDsJLyogYnRyZWUga2V5IHBvaW50ZXIgKi8KLQl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IGJsb2NrIG51bWJlciAqLwotCXhmc19idWZfdAkJKmxicDsJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLwotCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2J1Zl90CQkqbmJwOwkvKiBuZXcgKHJvb3QpIGJ1ZmZlciAqLwotCXhmc19pbm9idF9ibG9ja190CSpuZXc7CS8qIG5ldyAocm9vdCkgYnRyZWUgYmxvY2sgKi8KLQlpbnQJCQlucHRyOwkvKiBuZXcgdmFsdWUgZm9yIGtleSBpbmRleCwgMSBvciAyICovCi0JeGZzX2lub2J0X3B0cl90CQkqcHA7CS8qIGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLwotCXhmc19hZ2Jsb2NrX3QJCXJibm87CS8qIHJpZ2h0IGJsb2NrIG51bWJlciAqLwotCXhmc19idWZfdAkJKnJicDsJLyogcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KLQl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCi0JeGZzX2lub2J0X3JlY190CQkqcnA7CS8qIGJ0cmVlIHJlY29yZCBwb2ludGVyICovCi0KLQlBU1NFUlQoY3VyLT5iY19ubGV2ZWxzIDwgWEZTX0lOX01BWExFVkVMUyhjdXItPmJjX21wKSk7Ci0KLQkvKgotCSAqIEdldCBhIGJsb2NrICYgYSBidWZmZXIuCi0JICovCi0JYWdpID0gWEZTX0JVRl9UT19BR0koY3VyLT5iY19wcml2YXRlLmEuYWdicCk7Ci0JYXJncy50cCA9IGN1ci0+YmNfdHA7Ci0JYXJncy5tcCA9IGN1ci0+YmNfbXA7Ci0JYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCi0JCWJlMzJfdG9fY3B1KGFnaS0+YWdpX3Jvb3QpKTsKLQlhcmdzLm1vZCA9IGFyZ3MubWlubGVmdCA9IGFyZ3MuYWxpZ25tZW50ID0gYXJncy50b3RhbCA9IGFyZ3Mud2FzZGVsID0KLQkJYXJncy5pc2ZsID0gYXJncy51c2VyZGF0YSA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKLQlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKLQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBOb25lIGF2YWlsYWJsZSwgd2UgZmFpbC4KLQkgKi8KLQlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlBU1NFUlQoYXJncy5sZW4gPT0gMSk7Ci0JbmJwID0geGZzX2J0cmVlX2dldF9idWZzKGFyZ3MubXAsIGFyZ3MudHAsIGFyZ3MuYWdubywgYXJncy5hZ2JubywgMCk7Ci0JbmV3ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhuYnApOwotCS8qCi0JICogU2V0IHRoZSByb290IGRhdGEgaW4gdGhlIGEuZy4gaW5vZGUgc3RydWN0dXJlLgotCSAqLwotCWFnaS0+YWdpX3Jvb3QgPSBjcHVfdG9fYmUzMihhcmdzLmFnYm5vKTsKLQliZTMyX2FkZF9jcHUoJmFnaS0+YWdpX2xldmVsLCAxKTsKLQl4ZnNfaWFsbG9jX2xvZ19hZ2koYXJncy50cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKLQkJWEZTX0FHSV9ST09UIHwgWEZTX0FHSV9MRVZFTCk7Ci0JLyoKLQkgKiBBdCB0aGUgcHJldmlvdXMgcm9vdCBsZXZlbCB0aGVyZSBhcmUgbm93IHR3byBibG9ja3M6IHRoZSBvbGQKLQkgKiByb290LCBhbmQgdGhlIG5ldyBibG9jayBnZW5lcmF0ZWQgd2hlbiBpdCB3YXMgc3BsaXQuCi0JICogV2UgZG9uJ3Qga25vdyB3aGljaCBvbmUgdGhlIGN1cnNvciBpcyBwb2ludGluZyBhdCwgc28gd2UKLQkgKiBzZXQgdXAgdmFyaWFibGVzICJsZWZ0IiBhbmQgInJpZ2h0IiBmb3IgZWFjaCBjYXNlLgotCSAqLwotCWJwID0gY3VyLT5iY19idWZzW2N1ci0+YmNfbmxldmVscyAtIDFdOwotCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBjdXItPmJjX25sZXZlbHMgLSAxLCBicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQlpZiAoYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSAhPSBOVUxMQUdCTE9DSykgewotCQkvKgotCQkgKiBPdXIgYmxvY2sgaXMgbGVmdCwgcGljayB1cCB0aGUgcmlnaHQgYmxvY2suCi0JCSAqLwotCQlsYnAgPSBicDsKLQkJbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhhcmdzLm1wLCBYRlNfQlVGX0FERFIobGJwKSk7Ci0JCWxlZnQgPSBibG9jazsKLQkJcmJubyA9IGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLAotCQkJCXJibm8sIDAsICZyYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWJwID0gcmJwOwotCQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwKLQkJCQljdXItPmJjX25sZXZlbHMgLSAxLCByYnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJbnB0ciA9IDE7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT3VyIGJsb2NrIGlzIHJpZ2h0LCBwaWNrIHVwIHRoZSBsZWZ0IGJsb2NrLgotCQkgKi8KLQkJcmJwID0gYnA7Ci0JCXJibm8gPSBYRlNfREFERFJfVE9fQUdCTk8oYXJncy5tcCwgWEZTX0JVRl9BRERSKHJicCkpOwotCQlyaWdodCA9IGJsb2NrOwotCQlsYm5vID0gYmUzMl90b19jcHUocmlnaHQtPmJiX2xlZnRzaWIpOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCi0JCQkJbGJubywgMCwgJmxicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJYnAgPSBsYnA7Ci0JCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwKLQkJCQljdXItPmJjX25sZXZlbHMgLSAxLCBsYnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJbnB0ciA9IDI7Ci0JfQotCS8qCi0JICogRmlsbCBpbiB0aGUgbmV3IGJsb2NrJ3MgYnRyZWUgaGVhZGVyIGFuZCBsb2cgaXQuCi0JICovCi0JbmV3LT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOwotCW5ldy0+YmJfbGV2ZWwgPSBjcHVfdG9fYmUxNihjdXItPmJjX25sZXZlbHMpOwotCW5ldy0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KDIpOwotCW5ldy0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKE5VTExBR0JMT0NLKTsKLQluZXctPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoTlVMTEFHQkxPQ0spOwotCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgbmJwLCBYRlNfQkJfQUxMX0JJVFMpOwotCUFTU0VSVChsYm5vICE9IE5VTExBR0JMT0NLICYmIHJibm8gIT0gTlVMTEFHQkxPQ0spOwotCS8qCi0JICogRmlsbCBpbiB0aGUga2V5IGRhdGEgaW4gdGhlIG5ldyByb290LgotCSAqLwotCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKG5ldywgMSwgY3VyKTsKLQlpZiAoYmUxNl90b19jcHUobGVmdC0+YmJfbGV2ZWwpID4gMCkgewotCQlrcFswXSA9ICpYRlNfSU5PQlRfS0VZX0FERFIobGVmdCwgMSwgY3VyKTsKLQkJa3BbMV0gPSAqWEZTX0lOT0JUX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwotCX0gZWxzZSB7Ci0JCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGxlZnQsIDEsIGN1cik7Ci0JCWtwWzBdLmlyX3N0YXJ0aW5vID0gcnAtPmlyX3N0YXJ0aW5vOwotCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJa3BbMV0uaXJfc3RhcnRpbm8gPSBycC0+aXJfc3RhcnRpbm87Ci0JfQotCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIG5icCwgMSwgMik7Ci0JLyoKLQkgKiBGaWxsIGluIHRoZSBwb2ludGVyIGRhdGEgaW4gdGhlIG5ldyByb290LgotCSAqLwotCXBwID0gWEZTX0lOT0JUX1BUUl9BRERSKG5ldywgMSwgY3VyKTsKLQlwcFswXSA9IGNwdV90b19iZTMyKGxibm8pOwotCXBwWzFdID0gY3B1X3RvX2JlMzIocmJubyk7Ci0JeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgbmJwLCAxLCAyKTsKLQkvKgotCSAqIEZpeCB1cCB0aGUgY3Vyc29yLgotCSAqLwotCXhmc19idHJlZV9zZXRidWYoY3VyLCBjdXItPmJjX25sZXZlbHMsIG5icCk7Ci0JY3VyLT5iY19wdHJzW2N1ci0+YmNfbmxldmVsc10gPSBucHRyOwotCWN1ci0+YmNfbmxldmVscysrOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIE1vdmUgMSByZWNvcmQgcmlnaHQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCi0gKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfcnNoaWZ0KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLwotCXhmc19pbm9idF9rZXlfdAkJa2V5OwkvKiBrZXkgdmFsdWUgZm9yIGxlYWYgbGV2ZWwgdXB3YXJkICovCi0JeGZzX2J1Zl90CQkqbGJwOwkvKiBidWZmZXIgZm9yIGxlZnQgKGN1cnJlbnQpIGJsb2NrICovCi0JeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCi0JeGZzX2lub2J0X2tleV90CQkqbGtwOwkvKiBrZXkgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCXhmc19pbm9idF9wdHJfdAkJKmxwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCi0JeGZzX2lub2J0X3JlY190CQkqbHJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLwotCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCBuZWlnaGJvciBibG9jayAqLwotCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KLQl4ZnNfaW5vYnRfa2V5X3QJCSpya3A7CS8qIGtleSBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwotCXhmc19pbm9idF9wdHJfdAkJKnJwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLwotCXhmc19pbm9idF9yZWNfdAkJKnJycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgY3Vyc29yICovCi0KLQkvKgotCSAqIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgImxlZnQiLgotCSAqLwotCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIElmIHdlJ3ZlIGdvdCBubyByaWdodCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgcmlnaHQuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KGxlZnQtPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAotCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgotCSAqLwotCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogU2V0IHVwIHRoZSByaWdodCBuZWlnaGJvciBhcyAicmlnaHQiLgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBiZTMyX3RvX2NwdShsZWZ0LT5iYl9yaWdodHNpYiksCi0JCQkwLCAmcmJwLCBYRlNfSU5PX0JUUkVFX1JFRikpKQotCQlyZXR1cm4gZXJyb3I7Ci0JcmlnaHQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJicCk7Ci0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0JLyoKLQkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KLQkgKi8KLQlpZiAoYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpID09IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogTWFrZSBhIGhvbGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByaWdodCBuZWlnaGJvciBibG9jaywgdGhlbgotCSAqIGNvcHkgdGhlIGxhc3QgbGVmdCBibG9jayBlbnRyeSB0byB0aGUgaG9sZS4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKLQkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpLCBjdXIpOwotCQlya3AgPSBYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7Ci0JCXJwcCA9IFhGU19JTk9CVF9QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKLSNpZmRlZiBERUJVRwotCQlmb3IgKGkgPSBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUocnBwW2ldKSwgbGV2ZWwpKSkKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLSNlbmRpZgotCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtbW92ZShycHAgKyAxLCBycHAsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSAqIHNpemVvZigqcnBwKSk7Ci0jaWZkZWYgREVCVUcKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYmUzMl90b19jcHUoKmxwcCksIGxldmVsKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkJKnJrcCA9ICpsa3A7Ci0JCSpycHAgPSAqbHBwOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOwotCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSArIDEpOwotCX0gZWxzZSB7Ci0JCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSwgY3VyKTsKLQkJcnJwID0gWEZTX0lOT0JUX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQltZW1tb3ZlKHJycCArIDEsIHJycCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpycnApKTsKLQkJKnJycCA9ICpscnA7Ci0JCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSk7Ci0JCWtleS5pcl9zdGFydGlubyA9IHJycC0+aXJfc3RhcnRpbm87Ci0JCXJrcCA9ICZrZXk7Ci0JfQotCS8qCi0JICogRGVjcmVtZW50IGFuZCBsb2cgbGVmdCdzIG51bXJlY3MsIGJ1bXAgYW5kIGxvZyByaWdodCdzIG51bXJlY3MuCi0JICovCi0JYmUxNl9hZGRfY3B1KCZsZWZ0LT5iYl9udW1yZWNzLCAtMSk7Ci0JeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKLQliZTE2X2FkZF9jcHUoJnJpZ2h0LT5iYl9udW1yZWNzLCAxKTsKLSNpZmRlZiBERUJVRwotCWlmIChsZXZlbCA+IDApCi0JCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgcmtwLCBya3AgKyAxKTsKLQllbHNlCi0JCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgcnJwLCBycnAgKyAxKTsKLSNlbmRpZgotCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7Ci0JLyoKLQkgKiBVc2luZyBhIHRlbXBvcmFyeSBjdXJzb3IsIHVwZGF0ZSB0aGUgcGFyZW50IGtleSB2YWx1ZXMgb2YgdGhlCi0JICogYmxvY2sgb24gdGhlIHJpZ2h0LgotCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpCi0JCXJldHVybiBlcnJvcjsKLQl4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7Ci0JaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkgfHwKLQkgICAgKGVycm9yID0geGZzX2lub2J0X3VwZGtleSh0Y3VyLCBya3AsIGxldmVsICsgMSkpKSB7Ci0JCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNwbGl0IGN1ci9sZXZlbCBibG9jayBpbiBoYWxmLgotICogUmV0dXJuIG5ldyBibG9jayBudW1iZXIgYW5kIGl0cyBmaXJzdCByZWNvcmQgKHRvIGJlIGluc2VydGVkIGludG8gcGFyZW50KS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X3NwbGl0KAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNwbGl0ICovCi0JeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIG91dHB1dDogYmxvY2sgbnVtYmVyIGFsbG9jYXRlZCAqLwotCXhmc19pbm9idF9rZXlfdAkJKmtleXAsCS8qIG91dHB1dDogZmlyc3Qga2V5IG9mIG5ldyBibG9jayAqLwotCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgKi8KLQlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlpOwkvKiBsb29wIGluZGV4L3JlY29yZCBudW1iZXIgKi8KLQl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IChjdXJyZW50KSBibG9jayBudW1iZXIgKi8KLQl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCBibG9jayAqLwotCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IChjdXJyZW50KSBidHJlZSBibG9jayAqLwotCXhmc19pbm9idF9rZXlfdAkJKmxrcDsJLyogbGVmdCBidHJlZSBrZXkgcG9pbnRlciAqLwotCXhmc19pbm9idF9wdHJfdAkJKmxwcDsJLyogbGVmdCBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KLQl4ZnNfaW5vYnRfcmVjX3QJCSpscnA7CS8qIGxlZnQgYnRyZWUgcmVjb3JkIHBvaW50ZXIgKi8KLQl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgYmxvY2sgKi8KLQl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChuZXcpIGJ0cmVlIGJsb2NrICovCi0JeGZzX2lub2J0X2tleV90CQkqcmtwOwkvKiByaWdodCBidHJlZSBrZXkgcG9pbnRlciAqLwotCXhmc19pbm9idF9wdHJfdAkJKnJwcDsJLyogcmlnaHQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCi0JeGZzX2lub2J0X3JlY190CQkqcnJwOwkvKiByaWdodCBidHJlZSByZWNvcmQgcG9pbnRlciAqLwotCi0JLyoKLQkgKiBTZXQgdXAgbGVmdCBibG9jayAoY3VycmVudCBvbmUpLgotCSAqLwotCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07Ci0JYXJncy50cCA9IGN1ci0+YmNfdHA7Ci0JYXJncy5tcCA9IGN1ci0+YmNfbXA7Ci0JbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhhcmdzLm1wLCBYRlNfQlVGX0FERFIobGJwKSk7Ci0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrLgotCSAqIElmIHdlIGNhbid0IGRvIGl0LCB3ZSdyZSB0b2FzdC4gIEdpdmUgdXAuCi0JICovCi0JYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGxibm8pOwotCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy53YXNkZWwgPQotCQlhcmdzLmlzZmwgPSBhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOwotCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOwotCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87Ci0JaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCi0JCXJldHVybiBlcnJvcjsKLQlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlBU1NFUlQoYXJncy5sZW4gPT0gMSk7Ci0JcmJwID0geGZzX2J0cmVlX2dldF9idWZzKGFyZ3MubXAsIGFyZ3MudHAsIGFyZ3MuYWdubywgYXJncy5hZ2JubywgMCk7Ci0JLyoKLQkgKiBTZXQgdXAgdGhlIG5ldyBibG9jayBhcyAicmlnaHQiLgotCSAqLwotCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOwotCS8qCi0JICogIkxlZnQiIGlzIHRoZSBjdXJyZW50IChhY2NvcmRpbmcgdG8gdGhlIGN1cnNvcikgYmxvY2suCi0JICovCi0JbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKLSNpZmRlZiBERUJVRwotCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQotCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIEZpbGwgaW4gdGhlIGJ0cmVlIGhlYWRlciBmb3IgdGhlIG5ldyBibG9jay4KLQkgKi8KLQlyaWdodC0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMih4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKLQlyaWdodC0+YmJfbGV2ZWwgPSBsZWZ0LT5iYl9sZXZlbDsKLQlyaWdodC0+YmJfbnVtcmVjcyA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC8gMik7Ci0JLyoKLQkgKiBNYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSdzIGFuIG9kZCBudW1iZXIgb2YgZW50cmllcyBub3csIHRoYXQKLQkgKiBlYWNoIG5ldyBibG9jayB3aWxsIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMuCi0JICovCi0JaWYgKChiZTE2X3RvX2NwdShsZWZ0LT5iYl9udW1yZWNzKSAmIDEpICYmCi0JICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMSkKLQkJYmUxNl9hZGRfY3B1KCZyaWdodC0+YmJfbnVtcmVjcywgMSk7Ci0JaSA9IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpIC0gYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICsgMTsKLQkvKgotCSAqIEZvciBub24tbGVhZiBibG9ja3MsIGNvcHkga2V5cyBhbmQgYWRkcmVzc2VzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KLQkgKi8KLQlpZiAobGV2ZWwgPiAwKSB7Ci0JCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBpLCBjdXIpOwotCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgaSwgY3VyKTsKLQkJcmtwID0gWEZTX0lOT0JUX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOwotCQlycHAgPSBYRlNfSU5PQlRfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7Ci0jaWZkZWYgREVCVUcKLQkJZm9yIChpID0gMDsgaSA8IGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKTsgaSsrKSB7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBiZTMyX3RvX2NwdShscHBbaV0pLCBsZXZlbCkpKQotCQkJCXJldHVybiBlcnJvcjsKLQkJfQotI2VuZGlmCi0JCW1lbWNweShya3AsIGxrcCwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpICogc2l6ZW9mKCpya3ApKTsKLQkJbWVtY3B5KHJwcCwgbHBwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJwcCkpOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7Ci0JCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgYmUxNl90b19jcHUocmlnaHQtPmJiX251bXJlY3MpKTsKLQkJKmtleXAgPSAqcmtwOwotCX0KLQkvKgotCSAqIEZvciBsZWFmIGJsb2NrcywgY29weSByZWNvcmRzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KLQkgKi8KLQllbHNlIHsKLQkJbHJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGxlZnQsIGksIGN1cik7Ci0JCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKLQkJbWVtY3B5KHJycCwgbHJwLCBiZTE2X3RvX2NwdShyaWdodC0+YmJfbnVtcmVjcykgKiBzaXplb2YoKnJycCkpOwotCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCByYnAsIDEsIGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSk7Ci0JCWtleXAtPmlyX3N0YXJ0aW5vID0gcnJwLT5pcl9zdGFydGlubzsKLQl9Ci0JLyoKLQkgKiBGaW5kIHRoZSBsZWZ0IGJsb2NrIG51bWJlciBieSBsb29raW5nIGluIHRoZSBidWZmZXIuCi0JICogQWRqdXN0IG51bXJlY3MsIHNpYmxpbmcgcG9pbnRlcnMuCi0JICovCi0JYmUxNl9hZGRfY3B1KCZsZWZ0LT5iYl9udW1yZWNzLCAtKGJlMTZfdG9fY3B1KHJpZ2h0LT5iYl9udW1yZWNzKSkpOwotCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOwotCWxlZnQtPmJiX3JpZ2h0c2liID0gY3B1X3RvX2JlMzIoYXJncy5hZ2Jubyk7Ci0JcmlnaHQtPmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihsYm5vKTsKLQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKLQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOwotCS8qCi0JICogSWYgdGhlcmUncyBhIGJsb2NrIHRvIHRoZSBuZXcgYmxvY2sncyByaWdodCwgbWFrZSB0aGF0IGJsb2NrCi0JICogcG9pbnQgYmFjayB0byByaWdodCBpbnN0ZWFkIG9mIHRvIGxlZnQuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KHJpZ2h0LT5iYl9yaWdodHNpYikgIT0gTlVMTEFHQkxPQ0spIHsKLQkJeGZzX2lub2J0X2Jsb2NrX3QJKnJyYmxvY2s7CS8qIHJyIGJ0cmVlIGJsb2NrICovCi0JCXhmc19idWZfdAkJKnJyYnA7CQkvKiBidWZmZXIgZm9yIHJyYmxvY2sgKi8KLQotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCi0JCQkJYmUzMl90b19jcHUocmlnaHQtPmJiX3JpZ2h0c2liKSwgMCwgJnJyYnAsCi0JCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcnJibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socnJicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJcnJibG9jay0+YmJfbGVmdHNpYiA9IGNwdV90b19iZTMyKGFyZ3MuYWdibm8pOwotCQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKLQl9Ci0JLyoKLQkgKiBJZiB0aGUgY3Vyc29yIGlzIHJlYWxseSBpbiB0aGUgcmlnaHQgYmxvY2ssIG1vdmUgaXQgdGhlcmUuCi0JICogSWYgaXQncyBqdXN0IHBvaW50aW5nIHBhc3QgdGhlIGxhc3QgZW50cnkgaW4gbGVmdCwgdGhlbiB3ZSdsbAotCSAqIGluc2VydCB0aGVyZSwgc28gZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+IGJlMTZfdG9fY3B1KGxlZnQtPmJiX251bXJlY3MpICsgMSkgewotCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIHJicCk7Ci0JCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gYmUxNl90b19jcHUobGVmdC0+YmJfbnVtcmVjcyk7Ci0JfQotCS8qCi0JICogSWYgdGhlcmUgYXJlIG1vcmUgbGV2ZWxzLCB3ZSdsbCBuZWVkIGFub3RoZXIgY3Vyc29yIHdoaWNoIHJlZmVycwotCSAqIHRoZSByaWdodCBibG9jaywgbm8gbWF0dGVyIHdoZXJlIHRoaXMgY3Vyc29yIHdhcy4KLQkgKi8KLQlpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsIGN1cnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJKCpjdXJwKS0+YmNfcHRyc1tsZXZlbCArIDFdKys7Ci0JfQotCSpibm9wID0gYXJncy5hZ2JubzsKLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBVcGRhdGUga2V5cyBhdCBhbGwgbGV2ZWxzIGZyb20gaGVyZSB0byB0aGUgcm9vdCBhbG9uZyB0aGUgY3Vyc29yJ3MgcGF0aC4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X3VwZGtleSgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19pbm9idF9rZXlfdAkJKmtleXAsCS8qIG5ldyBrZXkgdmFsdWUgdG8gdXBkYXRlIHRvICovCi0JaW50CQkJbGV2ZWwpCS8qIHN0YXJ0aW5nIGxldmVsIGZvciB1cGRhdGUgKi8KLXsKLQlpbnQJCQlwdHI7CS8qIGluZGV4IG9mIGtleSBpbiBibG9jayAqLwotCi0JLyoKLQkgKiBHbyB1cCB0aGUgdHJlZSBmcm9tIHRoaXMgbGV2ZWwgdG93YXJkIHRoZSByb290LgotCSAqIEF0IGVhY2ggbGV2ZWwsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHRvIHRoZSB2YWx1ZSBpbnB1dC4KLQkgKiBTdG9wIHdoZW4gd2UgcmVhY2ggYSBsZXZlbCB3aGVyZSB0aGUgY3Vyc29yIGlzbid0IHBvaW50aW5nCi0JICogYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBibG9jay4KLQkgKi8KLQlmb3IgKHB0ciA9IDE7IHB0ciA9PSAxICYmIGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7Ci0JCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCi0JCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KLSNpZmRlZiBERUJVRwotCQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0jZW5kaWYKLQkJeGZzX2lub2J0X2tleV90CQkqa3A7CS8qIHB0ciB0byBidHJlZSBibG9jayBrZXlzICovCi0KLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotI2lmZGVmIERFQlVHCi0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQotCQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07Ci0JCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7Ci0JCSprcCA9ICprZXlwOwotCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBwdHIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEV4dGVybmFsbHkgdmlzaWJsZSByb3V0aW5lcy4KLSAqLwotCi0vKgotICogRGVjcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KLSAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2RlY3JlbWVudCgKLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCi0JaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KIAlpbnQJCQllcnJvcjsKLQlpbnQJCQlsZXY7CS8qIGJ0cmVlIGxldmVsICovCiAKLQlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRU5UUlkpOworCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBraWxscm9vdCk7CisKIAkvKgotCSAqIFJlYWQtYWhlYWQgdG8gdGhlIGxlZnQgYXQgdGhpcyBsZXZlbC4KKwkgKiBVcGRhdGUgdGhlIHJvb3QgcG9pbnRlciwgZGVjcmVhc2luZyB0aGUgbGV2ZWwgYnkgMSBhbmQgdGhlbgorCSAqIGZyZWUgdGhlIG9sZCByb290LgogCSAqLwotCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX0xFRlRSQSk7Ci0JLyoKLQkgKiBEZWNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCi0JICogdGhlbiB3ZSdyZSBkb25lLgotCSAqLwotCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZlbF0gPiAwKSB7Ci0JCSpzdGF0ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCi0JICovCi0JYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZlbF0pOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsCi0JCQljdXItPmJjX2J1ZnNbbGV2ZWxdKSkpCisJeGZzX2lub2J0X3NldF9yb290KGN1ciwgbmV3cm9vdCwgLTEpOworCWVycm9yID0geGZzX2lub2J0X2ZyZWVfYmxvY2soY3VyLCBicCk7CisJaWYgKGVycm9yKSB7CisJCVhGU19CVFJFRV9UUkFDRV9DVVJTT1IoY3VyLCBYQlRfRVJST1IpOwogCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkvKgotCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHJlZSwgcmV0dXJuIGZhaWx1cmUuCi0JICovCi0JaWYgKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9sZWZ0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwogCX0KLQkvKgotCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGRlY3JlbWVudGluZyBwb2ludGVycy4KLQkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBibG9jay4KLQkgKi8KLQlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgewotCQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2XSA+IDApCi0JCQlicmVhazsKLQkJLyoKLQkJICogUmVhZC1haGVhZCB0aGUgbGVmdCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAotCQkgKiBpbiB0aGUgbmV4dCBsb29wLgotCQkgKi8KLQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7Ci0JfQotCS8qCi0JICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgotCSAqLwotCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOwotCS8qCi0JICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgotCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KLQkgKi8KLQlmb3IgKGJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7IGxldiA+IGxldmVsOyApIHsKLQkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCi0JCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCiAKLQkJYWdibm8gPSBiZTMyX3RvX2NwdSgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCi0JCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgYWdibm8sIDAsICZicCwKLQkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQotCQkJcmV0dXJuIGVycm9yOwotCQlsZXYtLTsKLQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOwotCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWN1ci0+YmNfcHRyc1tsZXZdID0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpOwotCX0KLQkqc3RhdCA9IDE7CisJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGZyZWUpOworCisJY3VyLT5iY19idWZzW2xldmVsXSA9IE5VTEw7CisJY3VyLT5iY19ubGV2ZWxzLS07CisKKwlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOwogCXJldHVybiAwOwogfQogCi0vKgotICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCi0gKiBUaGUgY3Vyc29yIHJlZmVycyB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlY29yZCB3YXMgKGNvdWxkIGJlIGluc2VydGVkKQotICogd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9kZWxldGUoCi0JeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JaW50CQllcnJvcjsKLQlpbnQJCWk7CQkvKiByZXN1bHQgY29kZSAqLwotCWludAkJbGV2ZWw7CQkvKiBidHJlZSBsZXZlbCAqLwotCi0JLyoKLQkgKiBHbyB1cCB0aGUgdHJlZSwgc3RhcnRpbmcgYXQgbGVhZiBsZXZlbC4KLQkgKiBJZiAyIGlzIHJldHVybmVkIHRoZW4gYSBqb2luIHdhcyBkb25lOyBnbyB0byB0aGUgbmV4dCBsZXZlbC4KLQkgKiBPdGhlcndpc2Ugd2UgYXJlIGRvbmUuCi0JICovCi0JZm9yIChsZXZlbCA9IDAsIGkgPSAyOyBpID09IDI7IGxldmVsKyspIHsKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWxyZWMoY3VyLCBsZXZlbCwgJmkpKSkKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0JaWYgKGkgPT0gMCkgewotCQlmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKLQkJCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID09IDApIHsKLQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JKnN0YXQgPSBpOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9nZXRfcmVjKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnaW5vX3QJCSppbm8sCS8qIG91dHB1dDogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KLQlfX2ludDMyX3QJCSpmY250LAkvKiBvdXRwdXQ6IG51bWJlciBvZiBmcmVlIGlub2RlcyAqLwotCXhmc19pbm9mcmVlX3QJCSpmcmVlLAkvKiBvdXRwdXQ6IGZyZWUgaW5vZGUgbWFzayAqLwotCWludAkJCSpzdGF0KQkvKiBvdXRwdXQ6IHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KLQl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KICNpZmRlZiBERUJVRwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLSNlbmRpZgotCWludAkJCXB0cjsJLyogcmVjb3JkIG51bWJlciAqLwotCXhmc19pbm9idF9yZWNfdAkJKnJlYzsJLyogcmVjb3JkIGRhdGEgKi8KK1NUQVRJQyBpbnQKK3hmc19pbm9idF9rZXlzX2lub3JkZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMSwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprMikKK3sKKwlyZXR1cm4gYmUzMl90b19jcHUoazEtPmlub2J0LmlyX3N0YXJ0aW5vKSA8CisJCWJlMzJfdG9fY3B1KGsyLT5pbm9idC5pcl9zdGFydGlubyk7Cit9CiAKLQlicCA9IGN1ci0+YmNfYnVmc1swXTsKLQlwdHIgPSBjdXItPmJjX3B0cnNbMF07Ci0JYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKK1NUQVRJQyBpbnQKK3hmc19pbm9idF9yZWNzX2lub3JkZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyMSwKKwl1bmlvbiB4ZnNfYnRyZWVfcmVjCSpyMikKK3sKKwlyZXR1cm4gYmUzMl90b19jcHUocjEtPmlub2J0LmlyX3N0YXJ0aW5vKSArIFhGU19JTk9ERVNfUEVSX0NIVU5LIDw9CisJCWJlMzJfdG9fY3B1KHIyLT5pbm9idC5pcl9zdGFydGlubyk7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworI2lmZGVmIFhGU19CVFJFRV9UUkFDRQora3RyYWNlX3QJKnhmc19pbm9idF90cmFjZV9idWY7CisKK1NUQVRJQyB2b2lkCit4ZnNfaW5vYnRfdHJhY2VfZW50ZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwljb25zdCBjaGFyCQkqZnVuYywKKwljaGFyCQkJKnMsCisJaW50CQkJdHlwZSwKKwlpbnQJCQlsaW5lLAorCV9fcHN1bnNpZ25lZF90CQlhMCwKKwlfX3BzdW5zaWduZWRfdAkJYTEsCisJX19wc3Vuc2lnbmVkX3QJCWEyLAorCV9fcHN1bnNpZ25lZF90CQlhMywKKwlfX3BzdW5zaWduZWRfdAkJYTQsCisJX19wc3Vuc2lnbmVkX3QJCWE1LAorCV9fcHN1bnNpZ25lZF90CQlhNiwKKwlfX3BzdW5zaWduZWRfdAkJYTcsCisJX19wc3Vuc2lnbmVkX3QJCWE4LAorCV9fcHN1bnNpZ25lZF90CQlhOSwKKwlfX3BzdW5zaWduZWRfdAkJYTEwKQoreworCWt0cmFjZV9lbnRlcih4ZnNfaW5vYnRfdHJhY2VfYnVmLCAodm9pZCAqKShfX3BzaW50X3QpdHlwZSwKKwkJKHZvaWQgKilmdW5jLCAodm9pZCAqKXMsIE5VTEwsICh2b2lkICopY3VyLAorCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAorCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAorCQkodm9pZCAqKWE4LCAodm9pZCAqKWE5LCAodm9pZCAqKWExMCk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfaW5vYnRfdHJhY2VfY3Vyc29yKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJX191aW50MzJfdAkJKnMwLAorCV9fdWludDY0X3QJCSpsMCwKKwlfX3VpbnQ2NF90CQkqbDEpCit7CisJKnMwID0gY3VyLT5iY19wcml2YXRlLmEuYWdubzsKKwkqbDAgPSBjdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vOworCSpsMSA9IGN1ci0+YmNfcmVjLmkuaXJfZnJlZTsKK30KKworU1RBVElDIHZvaWQKK3hmc19pbm9idF90cmFjZV9rZXkoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXksCisJX191aW50NjRfdAkJKmwwLAorCV9fdWludDY0X3QJCSpsMSkKK3sKKwkqbDAgPSBiZTMyX3RvX2NwdShrZXktPmlub2J0LmlyX3N0YXJ0aW5vKTsKKwkqbDEgPSAwOworfQorCitTVEFUSUMgdm9pZAoreGZzX2lub2J0X3RyYWNlX3JlY29yZCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXVuaW9uIHhmc19idHJlZV9yZWMJKnJlYywKKwlfX3VpbnQ2NF90CQkqbDAsCisJX191aW50NjRfdAkJKmwxLAorCV9fdWludDY0X3QJCSpsMikKK3sKKwkqbDAgPSBiZTMyX3RvX2NwdShyZWMtPmlub2J0LmlyX3N0YXJ0aW5vKTsKKwkqbDEgPSBiZTMyX3RvX2NwdShyZWMtPmlub2J0LmlyX2ZyZWVjb3VudCk7CisJKmwyID0gYmU2NF90b19jcHUocmVjLT5pbm9idC5pcl9mcmVlKTsKK30KKyNlbmRpZiAvKiBYRlNfQlRSRUVfVFJBQ0UgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfYnRyZWVfb3BzIHhmc19pbm9idF9vcHMgPSB7CisJLnJlY19sZW4JCT0gc2l6ZW9mKHhmc19pbm9idF9yZWNfdCksCisJLmtleV9sZW4JCT0gc2l6ZW9mKHhmc19pbm9idF9rZXlfdCksCisKKwkuZHVwX2N1cnNvcgkJPSB4ZnNfaW5vYnRfZHVwX2N1cnNvciwKKwkuc2V0X3Jvb3QJCT0geGZzX2lub2J0X3NldF9yb290LAorCS5raWxsX3Jvb3QJCT0geGZzX2lub2J0X2tpbGxfcm9vdCwKKwkuYWxsb2NfYmxvY2sJCT0geGZzX2lub2J0X2FsbG9jX2Jsb2NrLAorCS5mcmVlX2Jsb2NrCQk9IHhmc19pbm9idF9mcmVlX2Jsb2NrLAorCS5nZXRfbWlucmVjcwkJPSB4ZnNfaW5vYnRfZ2V0X21pbnJlY3MsCisJLmdldF9tYXhyZWNzCQk9IHhmc19pbm9idF9nZXRfbWF4cmVjcywKKwkuaW5pdF9rZXlfZnJvbV9yZWMJPSB4ZnNfaW5vYnRfaW5pdF9rZXlfZnJvbV9yZWMsCisJLmluaXRfcmVjX2Zyb21fa2V5CT0geGZzX2lub2J0X2luaXRfcmVjX2Zyb21fa2V5LAorCS5pbml0X3JlY19mcm9tX2N1cgk9IHhmc19pbm9idF9pbml0X3JlY19mcm9tX2N1ciwKKwkuaW5pdF9wdHJfZnJvbV9jdXIJPSB4ZnNfaW5vYnRfaW5pdF9wdHJfZnJvbV9jdXIsCisJLmtleV9kaWZmCQk9IHhmc19pbm9idF9rZXlfZGlmZiwKKwogI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgMCwgYnApKSkKLQkJcmV0dXJuIGVycm9yOworCS5rZXlzX2lub3JkZXIJCT0geGZzX2lub2J0X2tleXNfaW5vcmRlciwKKwkucmVjc19pbm9yZGVyCQk9IHhmc19pbm9idF9yZWNzX2lub3JkZXIsCiAjZW5kaWYKLQkvKgotCSAqIE9mZiB0aGUgcmlnaHQgZW5kIG9yIGxlZnQgZW5kLCByZXR1cm4gZmFpbHVyZS4KLQkgKi8KLQlpZiAocHRyID4gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpIHx8IHB0ciA8PSAwKSB7Ci0JCSpzdGF0ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogUG9pbnQgdG8gdGhlIHJlY29yZCBhbmQgZXh0cmFjdCBpdHMgZGF0YS4KLQkgKi8KLQlyZWMgPSBYRlNfSU5PQlRfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKLQkqaW5vID0gYmUzMl90b19jcHUocmVjLT5pcl9zdGFydGlubyk7Ci0JKmZjbnQgPSBiZTMyX3RvX2NwdShyZWMtPmlyX2ZyZWVjb3VudCk7Ci0JKmZyZWUgPSBiZTY0X3RvX2NwdShyZWMtPmlyX2ZyZWUpOwotCSpzdGF0ID0gMTsKLQlyZXR1cm4gMDsKLX0KIAotLyoKLSAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCi0gKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9pbmNyZW1lbnQoCi0JeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KLQlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLwotCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCi0JeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCi0JaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCWludAkJCWxldjsJLyogYnRyZWUgbGV2ZWwgKi8KLQotCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7Ci0JLyoKLQkgKiBSZWFkLWFoZWFkIHRvIHRoZSByaWdodCBhdCB0aGlzIGxldmVsLgotCSAqLwotCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX1JJR0hUUkEpOwotCS8qCi0JICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCi0JICovCi0JYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOwotCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0jaWZkZWYgREVCVUcKLQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKLQkJcmV0dXJuIGVycm9yOworI2lmZGVmIFhGU19CVFJFRV9UUkFDRQorCS50cmFjZV9lbnRlcgkJPSB4ZnNfaW5vYnRfdHJhY2VfZW50ZXIsCisJLnRyYWNlX2N1cnNvcgkJPSB4ZnNfaW5vYnRfdHJhY2VfY3Vyc29yLAorCS50cmFjZV9rZXkJCT0geGZzX2lub2J0X3RyYWNlX2tleSwKKwkudHJhY2VfcmVjb3JkCQk9IHhmc19pbm9idF90cmFjZV9yZWNvcmQsCiAjZW5kaWYKLQkvKgotCSAqIEluY3JlbWVudCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwuICBJZiB3ZSdyZSBzdGlsbCBpbiB0aGUgYmxvY2sKLQkgKiB0aGVuIHdlJ3JlIGRvbmUuCi0JICovCi0JaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBiZTE2X3RvX2NwdShibG9jay0+YmJfbnVtcmVjcykpIHsKLQkJKnN0YXQgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KLQkgKi8KLQlpZiAoYmUzMl90b19jcHUoYmxvY2stPmJiX3JpZ2h0c2liKSA9PSBOVUxMQUdCTE9DSykgewotCQkqc3RhdCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkvKgotCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGluY3JlbWVudGluZyBwb2ludGVycy4KLQkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSByaWdodCBlZGdlIG9mIGEgYmxvY2suCi0JICovCi0JZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKLQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2XTsKLQkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKLSNpZmRlZiBERUJVRwotCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLQkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gYmUxNl90b19jcHUoYmxvY2stPmJiX251bXJlY3MpKQotCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIFJlYWQtYWhlYWQgdGhlIHJpZ2h0IGJsb2NrLCB3ZSdyZSBnb2luZyB0byByZWFkIGl0Ci0JCSAqIGluIHRoZSBuZXh0IGxvb3AuCi0JCSAqLwotCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfUklHSFRSQSk7Ci0JfQotCS8qCi0JICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgotCSAqLwotCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOwotCS8qCi0JICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgotCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KLQkgKi8KLQlmb3IgKGJwID0gY3VyLT5iY19idWZzW2xldl0sIGJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0JICAgICBsZXYgPiBsZXZlbDsgKSB7Ci0JCXhmc19hZ2Jsb2NrX3QJYWdibm87CS8qIGJsb2NrIG51bWJlciBvZiBidHJlZSBibG9jayAqLworfTsKIAotCQlhZ2JubyA9IGJlMzJfdG9fY3B1KCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpKTsKLQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKLQkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBhZ2JubywgMCwgJmJwLAotCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWxldi0tOwotCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2LCBicCk7Ci0JCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkKLQkJCXJldHVybiBlcnJvcjsKLQkJY3VyLT5iY19wdHJzW2xldl0gPSAxOwotCX0KLQkqc3RhdCA9IDE7Ci0JcmV0dXJuIDA7CisvKgorICogQWxsb2NhdGUgYSBuZXcgaW5vZGUgYnRyZWUgY3Vyc29yLgorICovCitzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqCQkJCS8qIG5ldyBpbm9kZSBidHJlZSBjdXJzb3IgKi8KK3hmc19pbm9idF9pbml0X2N1cnNvcigKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19idWYJCSphZ2JwLAkJLyogYnVmZmVyIGZvciBhZ2kgc3RydWN0dXJlICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8pCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworeworCXN0cnVjdCB4ZnNfYWdpCQkqYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1cjsKKworCWN1ciA9IGttZW1fem9uZV96YWxsb2MoeGZzX2J0cmVlX2N1cl96b25lLCBLTV9TTEVFUCk7CisKKwljdXItPmJjX3RwID0gdHA7CisJY3VyLT5iY19tcCA9IG1wOworCWN1ci0+YmNfbmxldmVscyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2xldmVsKTsKKwljdXItPmJjX2J0bnVtID0gWEZTX0JUTlVNX0lOTzsKKwljdXItPmJjX2Jsb2NrbG9nID0gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisKKwljdXItPmJjX29wcyA9ICZ4ZnNfaW5vYnRfb3BzOworCisJY3VyLT5iY19wcml2YXRlLmEuYWdicCA9IGFnYnA7CisJY3VyLT5iY19wcml2YXRlLmEuYWdubyA9IGFnbm87CisKKwlyZXR1cm4gY3VyOwogfQogCiAvKgotICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCi0gKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KKyAqIENhbGN1bGF0ZSBudW1iZXIgb2YgcmVjb3JkcyBpbiBhbiBpbm9idCBidHJlZSBibG9jay4KICAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2luc2VydCgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK2ludAoreGZzX2lub2J0X21heHJlY3MoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJaW50CQkJYmxvY2tsZW4sCisJaW50CQkJbGVhZikKIHsKLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JaW50CQlpOwkJLyogcmVzdWx0IHZhbHVlLCAwIGZvciBmYWlsdXJlICovCi0JaW50CQlsZXZlbDsJCS8qIGN1cnJlbnQgbGV2ZWwgbnVtYmVyIGluIGJ0cmVlICovCi0JeGZzX2FnYmxvY2tfdAluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAoc3BsaXQgcmVzdWx0KSAqLwotCXhmc19idHJlZV9jdXJfdAkqbmN1cjsJCS8qIG5ldyBjdXJzb3IgKHNwbGl0IHJlc3VsdCkgKi8KLQl4ZnNfaW5vYnRfcmVjX3QJbnJlYzsJCS8qIHJlY29yZCBiZWluZyBpbnNlcnRlZCB0aGlzIGxldmVsICovCi0JeGZzX2J0cmVlX2N1cl90CSpwY3VyOwkJLyogcHJldmlvdXMgbGV2ZWwncyBjdXJzb3IgKi8KKwlibG9ja2xlbiAtPSBYRlNfSU5PQlRfQkxPQ0tfTEVOKG1wKTsKIAotCWxldmVsID0gMDsKLQluYm5vID0gTlVMTEFHQkxPQ0s7Ci0JbnJlYy5pcl9zdGFydGlubyA9IGNwdV90b19iZTMyKGN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8pOwotCW5yZWMuaXJfZnJlZWNvdW50ID0gY3B1X3RvX2JlMzIoY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQpOwotCW5yZWMuaXJfZnJlZSA9IGNwdV90b19iZTY0KGN1ci0+YmNfcmVjLmkuaXJfZnJlZSk7Ci0JbmN1ciA9IE5VTEw7Ci0JcGN1ciA9IGN1cjsKLQkvKgotCSAqIExvb3AgZ29pbmcgdXAgdGhlIHRyZWUsIHN0YXJ0aW5nIGF0IHRoZSBsZWFmIGxldmVsLgotCSAqIFN0b3Agd2hlbiB3ZSBkb24ndCBnZXQgYSBzcGxpdCBibG9jaywgdGhhdCBtdXN0IG1lYW4gdGhhdAotCSAqIHRoZSBpbnNlcnQgaXMgZmluaXNoZWQgd2l0aCB0aGlzIGxldmVsLgotCSAqLwotCWRvIHsKLQkJLyoKLQkJICogSW5zZXJ0IG5yZWMvbmJubyBpbnRvIHRoaXMgbGV2ZWwgb2YgdGhlIHRyZWUuCi0JCSAqIE5vdGUgaWYgd2UgZmFpbCwgbmJubyB3aWxsIGJlIG51bGwuCi0JCSAqLwotCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luc3JlYyhwY3VyLCBsZXZlbCsrLCAmbmJubywgJm5yZWMsICZuY3VyLAotCQkJCSZpKSkpIHsKLQkJCWlmIChwY3VyICE9IGN1cikKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfRVJST1IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCS8qCi0JCSAqIFNlZSBpZiB0aGUgY3Vyc29yIHdlIGp1c3QgdXNlZCBpcyB0cmFzaC4KLQkJICogQ2FuJ3QgdHJhc2ggdGhlIGNhbGxlcidzIGN1cnNvciwgYnV0IG90aGVyd2lzZSB3ZSBzaG91bGQKLQkJICogaWYgbmN1ciBpcyBhIG5ldyBjdXJzb3Igb3Igd2UncmUgYWJvdXQgdG8gYmUgZG9uZS4KLQkJICovCi0JCWlmIChwY3VyICE9IGN1ciAmJiAobmN1ciB8fCBuYm5vID09IE5VTExBR0JMT0NLKSkgewotCQkJY3VyLT5iY19ubGV2ZWxzID0gcGN1ci0+YmNfbmxldmVsczsKLQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHBjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJfQotCQkvKgotCQkgKiBJZiB3ZSBnb3QgYSBuZXcgY3Vyc29yLCBzd2l0Y2ggdG8gaXQuCi0JCSAqLwotCQlpZiAobmN1cikgewotCQkJcGN1ciA9IG5jdXI7Ci0JCQluY3VyID0gTlVMTDsKLQkJfQotCX0gd2hpbGUgKG5ibm8gIT0gTlVMTEFHQkxPQ0spOwotCSpzdGF0ID0gaTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIGlubyBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgotICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfbG9va3VwX2VxKAotCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnaW5vX3QJaW5vLAkJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KLQlfX2ludDMyX3QJZmNudCwJCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KLQl4ZnNfaW5vZnJlZV90CWZyZWUsCQkvKiBmcmVlIGlub2RlIG1hc2sgKi8KLQlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCi17Ci0JY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubyA9IGlubzsKLQljdXItPmJjX3JlYy5pLmlyX2ZyZWVjb3VudCA9IGZjbnQ7Ci0JY3VyLT5iY19yZWMuaS5pcl9mcmVlID0gZnJlZTsKLQlyZXR1cm4geGZzX2lub2J0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOwotfQotCi0vKgotICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlubwotICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2lub2J0X2xvb2t1cF9nZSgKLQl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLwotCXhmc19hZ2lub190CWlubywJCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCi0JX19pbnQzMl90CWZjbnQsCQkvKiBmcmVlIGlub2RlIGNvdW50ICovCi0JeGZzX2lub2ZyZWVfdAlmcmVlLAkJLyogZnJlZSBpbm9kZSBtYXNrICovCi0JaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLwotewotCWN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8gPSBpbm87Ci0JY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQgPSBmY250OwotCWN1ci0+YmNfcmVjLmkuaXJfZnJlZSA9IGZyZWU7Ci0JcmV0dXJuIHhmc19pbm9idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0dFLCBzdGF0KTsKLX0KLQotLyoKLSAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbm8KLSAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19pbm9idF9sb29rdXBfbGUoCi0JeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfYWdpbm9fdAlpbm8sCQkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLwotCV9faW50MzJfdAlmY250LAkJLyogZnJlZSBpbm9kZSBjb3VudCAqLwotCXhmc19pbm9mcmVlX3QJZnJlZSwJCS8qIGZyZWUgaW5vZGUgbWFzayAqLwotCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KLXsKLQljdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vID0gaW5vOwotCWN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50ID0gZmNudDsKLQljdXItPmJjX3JlYy5pLmlyX2ZyZWUgPSBmcmVlOwotCXJldHVybiB4ZnNfaW5vYnRfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9MRSwgc3RhdCk7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbgotICogYnkgW2lubywgZmNudCwgZnJlZV0uCi0gKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgotICovCi1pbnQJCQkJCS8qIGVycm9yICovCi14ZnNfaW5vYnRfdXBkYXRlKAotCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCi0JeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KLQlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KLQl4ZnNfaW5vZnJlZV90CQlmcmVlKQkvKiBmcmVlIGlub2RlIG1hc2sgKi8KLXsKLQl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIHVwZGF0ZSAqLwotCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLwotCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KLQlpbnQJCQlwdHI7CS8qIGN1cnJlbnQgcmVjb3JkIG51bWJlciAodXBkYXRpbmcpICovCi0JeGZzX2lub2J0X3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gdXBkYXRlZCByZWNvcmQgKi8KLQotCS8qCi0JICogUGljayB1cCB0aGUgY3VycmVudCBibG9jay4KLQkgKi8KLQlicCA9IGN1ci0+YmNfYnVmc1swXTsKLQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOwotI2lmZGVmIERFQlVHCi0JaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgMCwgYnApKSkKLQkJcmV0dXJuIGVycm9yOwotI2VuZGlmCi0JLyoKLQkgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlYyB0byBiZSB1cGRhdGVkLgotCSAqLwotCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKLQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgcHRyLCBjdXIpOwotCS8qCi0JICogRmlsbCBpbiB0aGUgbmV3IGNvbnRlbnRzIGFuZCBsb2cgdGhlbS4KLQkgKi8KLQlycC0+aXJfc3RhcnRpbm8gPSBjcHVfdG9fYmUzMihpbm8pOwotCXJwLT5pcl9mcmVlY291bnQgPSBjcHVfdG9fYmUzMihmY250KTsKLQlycC0+aXJfZnJlZSA9IGNwdV90b19iZTY0KGZyZWUpOwotCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIHB0cik7Ci0JLyoKLQkgKiBVcGRhdGluZyBmaXJzdCByZWNvcmQgaW4gbGVhZi4gUGFzcyBuZXcga2V5IHZhbHVlIHVwIHRvIG91ciBwYXJlbnQuCi0JICovCi0JaWYgKHB0ciA9PSAxKSB7Ci0JCXhmc19pbm9idF9rZXlfdAlrZXk7CS8qIGtleSBjb250YWluaW5nIFtpbm9dICovCi0KLQkJa2V5LmlyX3N0YXJ0aW5vID0gY3B1X3RvX2JlMzIoaW5vKTsKLQkJaWYgKChlcnJvciA9IHhmc19pbm9idF91cGRrZXkoY3VyLCAma2V5LCAxKSkpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCXJldHVybiAwOworCWlmIChsZWFmKQorCQlyZXR1cm4gYmxvY2tsZW4gLyBzaXplb2YoeGZzX2lub2J0X3JlY190KTsKKwlyZXR1cm4gYmxvY2tsZW4gLyAoc2l6ZW9mKHhmc19pbm9idF9rZXlfdCkgKyBzaXplb2YoeGZzX2lub2J0X3B0cl90KSk7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5oIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaAppbmRleCA4ZWZjNGE1Li4zN2U1ZGQwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmgKQEAgLTI0LDcgKzI0LDYgQEAKIAogc3RydWN0IHhmc19idWY7CiBzdHJ1Y3QgeGZzX2J0cmVlX2N1cjsKLXN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrOwogc3RydWN0IHhmc19tb3VudDsKIAogLyoKQEAgLTcwLDExICs2OSw2IEBACiAvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KIHR5cGVkZWYgX19iZTMyIHhmc19pbm9idF9wdHJfdDsKIAotLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KLXR5cGVkZWYJc3RydWN0IHhmc19idHJlZV9zYmxvY2sgeGZzX2lub2J0X2Jsb2NrX3Q7Ci0KLSNkZWZpbmUJWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCkJKCh4ZnNfaW5vYnRfYmxvY2tfdCAqKVhGU19CVUZfUFRSKGJwKSkKLQogLyoKICAqIEJpdCBtYW5pcHVsYXRpb25zIGZvciBpcl9mcmVlLgogICovCkBAIC04NSwxNCArNzksNiBAQAogI2RlZmluZQlYRlNfSU5PQlRfQ0xSX0ZSRUUocnAsaSkJKChycCktPmlyX2ZyZWUgJj0gflhGU19JTk9CVF9NQVNLKGkpKQogCiAvKgotICogUmVhbCBibG9jayBzdHJ1Y3R1cmVzIGhhdmUgYSBzaXplIGVxdWFsIHRvIHRoZSBkaXNrIGJsb2NrIHNpemUuCi0gKi8KLSNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2LGN1cikgKChjdXIpLT5iY19tcC0+bV9pbm9idF9teHJbbGV2ICE9IDBdKQotI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXYsY3VyKSAoKGN1ciktPmJjX21wLT5tX2lub2J0X21ucltsZXYgIT0gMF0pCi0jZGVmaW5lCVhGU19JTk9CVF9JU19MQVNUX1JFQyhjdXIpCVwKLQkoKGN1ciktPmJjX3B0cnNbMF0gPT0gYmUxNl90b19jcHUoWEZTX0JVRl9UT19JTk9CVF9CTE9DSygoY3VyKS0+YmNfYnVmc1swXSktPmJiX251bXJlY3MpKQotCi0vKgogICogTWF4aW11bSBudW1iZXIgb2YgaW5vZGUgYnRyZWUgbGV2ZWxzLgogICovCiAjZGVmaW5lCVhGU19JTl9NQVhMRVZFTFMobXApCQkoKG1wKS0+bV9pbl9tYXhsZXZlbHMpCkBAIC0xMDQsNzUgKzkwLDM4IEBACiAjZGVmaW5lCVhGU19QUkVBTExPQ19CTE9DS1MobXApCQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19JQlRfQkxPQ0sobXApICsgMSkpCiAKIC8qCisgKiBCdHJlZSBibG9jayBoZWFkZXIgc2l6ZSBkZXBlbmRzIG9uIGEgc3VwZXJibG9jayBmbGFnLgorICoKKyAqIChub3QgcXVpdGUgeWV0LCBidXQgc29vbikKKyAqLworI2RlZmluZSBYRlNfSU5PQlRfQkxPQ0tfTEVOKG1wKQlYRlNfQlRSRUVfU0JMT0NLX0xFTgorCisvKgogICogUmVjb3JkLCBrZXksIGFuZCBwb2ludGVyIGFkZHJlc3MgbWFjcm9zIGZvciBidHJlZSBibG9ja3MuCisgKgorICogKG5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG1heSBhcHBlYXIgdW51c2VkLCBidXQgdGhleSBhcmUgdXNlZCBpbiB1c2Vyc3BhY2UpCiAgKi8KLSNkZWZpbmUgWEZTX0lOT0JUX1JFQ19BRERSKGJiLGksY3VyKSBcCi0JKFhGU19CVFJFRV9SRUNfQUREUih4ZnNfaW5vYnQsIGJiLCBpKSkKKyNkZWZpbmUgWEZTX0lOT0JUX1JFQ19BRERSKG1wLCBibG9jaywgaW5kZXgpIFwKKwkoKHhmc19pbm9idF9yZWNfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfSU5PQlRfQkxPQ0tfTEVOKG1wKSArIFwKKwkJICgoKGluZGV4KSAtIDEpICogc2l6ZW9mKHhmc19pbm9idF9yZWNfdCkpKSkKIAotI2RlZmluZQlYRlNfSU5PQlRfS0VZX0FERFIoYmIsaSxjdXIpIFwKLQkoWEZTX0JUUkVFX0tFWV9BRERSKHhmc19pbm9idCwgYmIsIGkpKQorI2RlZmluZSBYRlNfSU5PQlRfS0VZX0FERFIobXAsIGJsb2NrLCBpbmRleCkgXAorCSgoeGZzX2lub2J0X2tleV90ICopIFwKKwkJKChjaGFyICopKGJsb2NrKSArIFwKKwkJIFhGU19JTk9CVF9CTE9DS19MRU4obXApICsgXAorCQkgKChpbmRleCkgLSAxKSAqIHNpemVvZih4ZnNfaW5vYnRfa2V5X3QpKSkKIAotI2RlZmluZQlYRlNfSU5PQlRfUFRSX0FERFIoYmIsaSxjdXIpIFwKLQkoWEZTX0JUUkVFX1BUUl9BRERSKHhmc19pbm9idCwgYmIsIFwKLQkJCQlpLCBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUygxLCBjdXIpKSkKKyNkZWZpbmUgWEZTX0lOT0JUX1BUUl9BRERSKG1wLCBibG9jaywgaW5kZXgsIG1heHJlY3MpIFwKKwkoKHhmc19pbm9idF9wdHJfdCAqKSBcCisJCSgoY2hhciAqKShibG9jaykgKyBcCisJCSBYRlNfSU5PQlRfQkxPQ0tfTEVOKG1wKSArIFwKKwkJIChtYXhyZWNzKSAqIHNpemVvZih4ZnNfaW5vYnRfa2V5X3QpICsgXAorCQkgKChpbmRleCkgLSAxKSAqIHNpemVvZih4ZnNfaW5vYnRfcHRyX3QpKSkKIAotLyoKLSAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCi0gKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2RlY3JlbWVudChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgbGV2ZWwsIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBEZWxldGUgdGhlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci4KLSAqIFRoZSBjdXJzb3IgcmVmZXJzIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVjb3JkIHdhcyAoY291bGQgYmUgaW5zZXJ0ZWQpCi0gKiB3aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucy4KLSAqLwotZXh0ZXJuIGludCB4ZnNfaW5vYnRfZGVsZXRlKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCAqc3RhdCk7Ci0KLS8qCi0gKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2dldF9yZWMoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgeGZzX2FnaW5vX3QgKmlubywKLQkJCSAgICAgX19pbnQzMl90ICpmY250LCB4ZnNfaW5vZnJlZV90ICpmcmVlLCBpbnQgKnN0YXQpOwotCi0vKgotICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KLSAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KLSAqLwotZXh0ZXJuIGludCB4ZnNfaW5vYnRfaW5jcmVtZW50KHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIGludCBsZXZlbCwgaW50ICpzdGF0KTsKLQotLyoKLSAqIEluc2VydCB0aGUgY3VycmVudCByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgotICogVGhlIGN1cnNvciBtYXkgYmUgaW5jb25zaXN0ZW50IG9uIHJldHVybiBpZiBzcGxpdHMgaGF2ZSBiZWVuIGRvbmUuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2luc2VydChzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCBpbnQgKnN0YXQpOwotCi0vKgotICogTG9va3VwIHRoZSByZWNvcmQgZXF1YWwgdG8gaW5vIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2xvb2t1cF9lcShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCBpbm8sCi0JCQkJX19pbnQzMl90IGZjbnQsIHhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKLQotLyoKLSAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpbm8KLSAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2xvb2t1cF9nZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCBpbm8sCi0JCQkJX19pbnQzMl90IGZjbnQsCXhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKLQotLyoKLSAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbm8KLSAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X2xvb2t1cF9sZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCBpbm8sCi0JCQkJX19pbnQzMl90IGZjbnQsCXhmc19pbm9mcmVlX3QgZnJlZSwgaW50ICpzdGF0KTsKLQotLyoKLSAqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciwgdG8gdGhlIHZhbHVlIGdpdmVuCi0gKiBieSBbaW5vLCBmY250LCBmcmVlXS4KLSAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCi0gKi8KLWV4dGVybiBpbnQgeGZzX2lub2J0X3VwZGF0ZShzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLCB4ZnNfYWdpbm9fdCBpbm8sCi0JCQkJX19pbnQzMl90IGZjbnQsIHhmc19pbm9mcmVlX3QgZnJlZSk7CitleHRlcm4gc3RydWN0IHhmc19idHJlZV9jdXIgKnhmc19pbm9idF9pbml0X2N1cnNvcihzdHJ1Y3QgeGZzX21vdW50ICosCisJCXN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19idWYgKiwgeGZzX2FnbnVtYmVyX3QpOworZXh0ZXJuIGludCB4ZnNfaW5vYnRfbWF4cmVjcyhzdHJ1Y3QgeGZzX21vdW50ICosIGludCwgaW50KTsKIAogI2VuZGlmCS8qIF9fWEZTX0lBTExPQ19CVFJFRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggZTIyOWU5ZS4uZTJmYjYyMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTM4LDE1ICszOCwyNjggQEAKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKworCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYW4geGZzX2lub2RlLgorICovCitTVEFUSUMgc3RydWN0IHhmc19pbm9kZSAqCit4ZnNfaW5vZGVfYWxsb2MoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJeGZzX2lub190CQlpbm8pCit7CisJc3RydWN0IHhmc19pbm9kZQkqaXA7CisKKwkvKgorCSAqIGlmIHRoaXMgZGlkbid0IG9jY3VyIGluIHRyYW5zYWN0aW9ucywgd2UgY291bGQgdXNlCisJICogS01fTUFZRkFJTCBhbmQgcmV0dXJuIE5VTEwgaGVyZSBvbiBFTk9NRU0uIFNldCB0aGUKKwkgKiBjb2RlIHVwIHRvIGRvIHRoaXMgYW55d2F5LgorCSAqLworCWlwID0ga21lbV96b25lX2FsbG9jKHhmc19pbm9kZV96b25lLCBLTV9TTEVFUCk7CisJaWYgKCFpcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX2lvY291bnQpID09IDApOworCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApOworCUFTU0VSVCghc3Bpbl9pc19sb2NrZWQoJmlwLT5pX2ZsYWdzX2xvY2spKTsKKwlBU1NFUlQoY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkpOworCisJLyoKKwkgKiBpbml0aWFsaXNlIHRoZSBWRlMgaW5vZGUgaGVyZSB0byBnZXQgZmFpbHVyZXMKKwkgKiBvdXQgb2YgdGhlIHdheSBlYXJseS4KKwkgKi8KKwlpZiAoIWlub2RlX2luaXRfYWx3YXlzKG1wLT5tX3N1cGVyLCBWRlNfSShpcCkpKSB7CisJCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGluaXRpYWxpc2UgdGhlIHhmcyBpbm9kZSAqLworCWlwLT5pX2lubyA9IGlubzsKKwlpcC0+aV9tb3VudCA9IG1wOworCW1lbXNldCgmaXAtPmlfaW1hcCwgMCwgc2l6ZW9mKHN0cnVjdCB4ZnNfaW1hcCkpOworCWlwLT5pX2FmcCA9IE5VTEw7CisJbWVtc2V0KCZpcC0+aV9kZiwgMCwgc2l6ZW9mKHhmc19pZm9ya190KSk7CisJaXAtPmlfZmxhZ3MgPSAwOworCWlwLT5pX3VwZGF0ZV9jb3JlID0gMDsKKwlpcC0+aV91cGRhdGVfc2l6ZSA9IDA7CisJaXAtPmlfZGVsYXllZF9ibGtzID0gMDsKKwltZW1zZXQoJmlwLT5pX2QsIDAsIHNpemVvZih4ZnNfaWNkaW5vZGVfdCkpOworCWlwLT5pX3NpemUgPSAwOworCWlwLT5pX25ld19zaXplID0gMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpbm9kZSdzIHRyYWNlIGJ1ZmZlcnMuCisJICovCisjaWZkZWYJWEZTX0lOT0RFX1RSQUNFCisJaXAtPmlfdHJhY2UgPSBrdHJhY2VfYWxsb2MoSU5PREVfVFJBQ0VfU0laRSwgS01fTk9GUyk7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCWlwLT5pX3h0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfQk1BUF9LVFJBQ0VfU0laRSwgS01fTk9GUyk7CisjZW5kaWYKKyNpZmRlZiBYRlNfQlRSRUVfVFJBQ0UKKwlpcC0+aV9idHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQlRfS1RSQUNFX1NJWkUsIEtNX05PRlMpOworI2VuZGlmCisjaWZkZWYgWEZTX1JXX1RSQUNFCisJaXAtPmlfcnd0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfUldfS1RSQUNFX1NJWkUsIEtNX05PRlMpOworI2VuZGlmCisjaWZkZWYgWEZTX0lMT0NLX1RSQUNFCisJaXAtPmlfbG9ja190cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfSUxPQ0tfS1RSQUNFX1NJWkUsIEtNX05PRlMpOworI2VuZGlmCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKKwlpcC0+aV9kaXJfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0RJUjJfS1RSQUNFX1NJWkUsIEtNX05PRlMpOworI2VuZGlmCisKKwlyZXR1cm4gaXA7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGlub2RlIHdlIGp1c3QgZm91bmQgaXQgdGhlIGNhY2hlCisgKi8KK3N0YXRpYyBpbnQKK3hmc19pZ2V0X2NhY2hlX2hpdCgKKwlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWcsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJaW50CQkJZmxhZ3MsCisJaW50CQkJbG9ja19mbGFncykgX19yZWxlYXNlcyhwYWctPnBhZ19pY2lfbG9jaykKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCWludAkJCWVycm9yID0gRUFHQUlOOworCisJLyoKKwkgKiBJZiBJTkVXIGlzIHNldCB0aGlzIGlub2RlIGlzIGJlaW5nIHNldCB1cAorCSAqIElmIElSRUNMQUlNIGlzIHNldCB0aGlzIGlub2RlIGlzIGJlaW5nIHRvcm4gZG93bgorCSAqIFBhdXNlIGFuZCB0cnkgYWdhaW4uCisJICovCisJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgKFhGU19JTkVXfFhGU19JUkVDTEFJTSkpKSB7CisJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOworCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwkvKiBJZiBJUkVDTEFJTUFCTEUgaXMgc2V0LCB3ZSd2ZSB0b3JuIGRvd24gdGhlIHZmcyBpbm9kZSBwYXJ0ICovCisJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpIHsKKworCQkvKgorCQkgKiBJZiBsb29rdXAgaXMgcmFjaW5nIHdpdGggdW5saW5rLCB0aGVuIHdlIHNob3VsZCByZXR1cm4gYW4KKwkJICogZXJyb3IgaW1tZWRpYXRlbHkgc28gd2UgZG9uJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIHJlY2xhaW0KKwkJICogbGlzdCBhbmQgcG90ZW50aWFsbHkgbGVhayB0aGUgaW5vZGUuCisJCSAqLworCQlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSAmJiAhKGZsYWdzICYgWEZTX0lHRVRfQ1JFQVRFKSkgeworCQkJZXJyb3IgPSBFTk9FTlQ7CisJCQlnb3RvIG91dF9lcnJvcjsKKwkJfQorCisJCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5hbGxvYyIpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gcmUtaW5pdGlhbGlzZSB0aGUgVkZTIGlub2RlIGFzIGl0IGhhcyBiZWVuCisJCSAqICdmcmVlZCcgYnkgdGhlIFZGUy4gRG8gdGhpcyBoZXJlIHNvIHdlIGNhbiBkZWFsIHdpdGgKKwkJICogZXJyb3JzIGNsZWFubHksIHRoZW4gdGFnIGl0IHNvIGl0IGNhbiBiZSBzZXQgdXAgY29ycmVjdGx5CisJCSAqIGxhdGVyLgorCQkgKi8KKwkJaWYgKCFpbm9kZV9pbml0X2Fsd2F5cyhtcC0+bV9zdXBlciwgVkZTX0koaXApKSkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIG91dF9lcnJvcjsKKwkJfQorCisJCS8qCisJCSAqIFdlIG11c3Qgc2V0IHRoZSBYRlNfSU5FVyBmbGFnIGJlZm9yZSBjbGVhcmluZyB0aGUKKwkJICogWEZTX0lSRUNMQUlNQUJMRSBmbGFnIHNvIHRoYXQgaWYgYSByYWNpbmcgbG9va3VwIGRvZXMKKwkJICogbm90IGZpbmQgdGhlIFhGU19JUkVDTEFJTUFCTEUgYWJvdmUgYnV0IGhhcyB0aGUgaWdyYWIoKQorCQkgKiBiZWxvdyBzdWNjZWVkIHdlIGNhbiBzYWZlbHkgY2hlY2sgWEZTX0lORVcgdG8gZGV0ZWN0CisJCSAqIHRoYXQgdGhpcyBpbm9kZSBpcyBzdGlsbCBiZWluZyBpbml0aWFsaXNlZC4KKwkJICovCisJCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSU5FVyk7CisJCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JUkVDTEFJTUFCTEUpOworCisJCS8qIGNsZWFyIHRoZSByYWRpeCB0cmVlIHJlY2xhaW0gZmxhZyBhcyB3ZWxsLiAqLworCQlfX3hmc19pbm9kZV9jbGVhcl9yZWNsYWltX3RhZyhtcCwgcGFnLCBpcCk7CisJfSBlbHNlIGlmICghaWdyYWIoVkZTX0koaXApKSkgeworCQkvKiBJZiB0aGUgVkZTIGlub2RlIGlzIGJlaW5nIHRvcm4gZG93biwgcGF1c2UgYW5kIHRyeSBhZ2Fpbi4gKi8KKwkJWEZTX1NUQVRTX0lOQyh4c19pZ19mcmVjeWNsZSk7CisJCWdvdG8gb3V0X2Vycm9yOworCX0gZWxzZSBpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSU5FVykpIHsKKwkJLyoKKwkJICogV2UgYXJlIHJhY2luZyB3aXRoIGFub3RoZXIgY2FjaGUgaGl0IHRoYXQgaXMKKwkJICogY3VycmVudGx5IHJlY3ljbGluZyB0aGlzIGlub2RlIG91dCBvZiB0aGUgWEZTX0lSRUNMQUlNQUJMRQorCQkgKiBzdGF0ZS4gV2FpdCBmb3IgdGhlIGluaXRpYWxpc2F0aW9uIHRvIGNvbXBsZXRlIGJlZm9yZQorCQkgKiBjb250aW51aW5nLgorCQkgKi8KKwkJd2FpdF9vbl9pbm9kZShWRlNfSShpcCkpOworCX0KKworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCAmJiAhKGZsYWdzICYgWEZTX0lHRVRfQ1JFQVRFKSkgeworCQllcnJvciA9IEVOT0VOVDsKKwkJaXB1dChWRlNfSShpcCkpOworCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwkvKiBXZSd2ZSBnb3QgYSBsaXZlIG9uZS4gKi8KKwlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCisJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKKwkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JU1RBTEUpOworCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5mb3VuZCIpOworCVhGU19TVEFUU19JTkMoeHNfaWdfZm91bmQpOworCXJldHVybiAwOworCitvdXRfZXJyb3I6CisJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludAoreGZzX2lnZXRfY2FjaGVfbWlzcygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWcsCisJeGZzX3RyYW5zX3QJCSp0cCwKKwl4ZnNfaW5vX3QJCWlubywKKwlzdHJ1Y3QgeGZzX2lub2RlCSoqaXBwLAorCXhmc19kYWRkcl90CQlibm8sCisJaW50CQkJZmxhZ3MsCisJaW50CQkJbG9ja19mbGFncykgX19yZWxlYXNlcyhwYWctPnBhZ19pY2lfbG9jaykKK3sKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcDsKKwlpbnQJCQllcnJvcjsKKwl1bnNpZ25lZCBsb25nCQlmaXJzdF9pbmRleCwgbWFzazsKKwl4ZnNfYWdpbm9fdAkJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpbm8pOworCisJaXAgPSB4ZnNfaW5vZGVfYWxsb2MobXAsIGlubyk7CisJaWYgKCFpcCkKKwkJcmV0dXJuIEVOT01FTTsKKworCWVycm9yID0geGZzX2lyZWFkKG1wLCB0cCwgaXAsIGJubywgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZGVzdHJveTsKKworCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5hbGxvYyIpOworCisJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkgJiYgIShmbGFncyAmIFhGU19JR0VUX0NSRUFURSkpIHsKKwkJZXJyb3IgPSBFTk9FTlQ7CisJCWdvdG8gb3V0X2Rlc3Ryb3k7CisJfQorCisJaWYgKGxvY2tfZmxhZ3MpCisJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CisKKwkvKgorCSAqIFByZWxvYWQgdGhlIHJhZGl4IHRyZWUgc28gd2UgY2FuIGluc2VydCBzYWZlbHkgdW5kZXIgdGhlCisJICogd3JpdGUgc3BpbmxvY2suIE5vdGUgdGhhdCB3ZSBjYW5ub3Qgc2xlZXAgaW5zaWRlIHRoZSBwcmVsb2FkCisJICogcmVnaW9uLgorCSAqLworCWlmIChyYWRpeF90cmVlX3ByZWxvYWQoR0ZQX0tFUk5FTCkpIHsKKwkJZXJyb3IgPSBFQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwltYXNrID0gfigoKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKSkgLSAxKTsKKwlmaXJzdF9pbmRleCA9IGFnaW5vICYgbWFzazsKKwl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisKKwkvKiBpbnNlcnQgdGhlIG5ldyBpbm9kZSAqLworCWVycm9yID0gcmFkaXhfdHJlZV9pbnNlcnQoJnBhZy0+cGFnX2ljaV9yb290LCBhZ2lubywgaXApOworCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJV0FSTl9PTihlcnJvciAhPSAtRUVYSVNUKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19pZ19kdXApOworCQllcnJvciA9IEVBR0FJTjsKKwkJZ290byBvdXRfcHJlbG9hZF9lbmQ7CisJfQorCisJLyogVGhlc2UgdmFsdWVzIF9tdXN0XyBiZSBzZXQgYmVmb3JlIHJlbGVhc2luZyB0aGUgcmFkaXggdHJlZSBsb2NrISAqLworCWlwLT5pX3VkcXVvdCA9IGlwLT5pX2dkcXVvdCA9IE5VTEw7CisJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JTkVXKTsKKworCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKKwkqaXBwID0gaXA7CisJcmV0dXJuIDA7CisKK291dF9wcmVsb2FkX2VuZDoKKwl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CitvdXRfdW5sb2NrOgorCWlmIChsb2NrX2ZsYWdzKQorCQl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CitvdXRfZGVzdHJveToKKwl4ZnNfZGVzdHJveV9pbm9kZShpcCk7CisJcmV0dXJuIGVycm9yOworfQogCiAvKgogICogTG9vayB1cCBhbiBpbm9kZSBieSBudW1iZXIgaW4gdGhlIGdpdmVuIGZpbGUgc3lzdGVtLgogICogVGhlIGlub2RlIGlzIGxvb2tlZCB1cCBpbiB0aGUgY2FjaGUgaGVsZCBpbiBlYWNoIEFHLgotICogSWYgdGhlIGlub2RlIGlzIGZvdW5kIGluIHRoZSBjYWNoZSwgYXR0YWNoIGl0IHRvIHRoZSBwcm92aWRlZAotICogdm5vZGUuCisgKiBJZiB0aGUgaW5vZGUgaXMgZm91bmQgaW4gdGhlIGNhY2hlLCBpbml0aWFsaXNlIHRoZSB2ZnMgaW5vZGUKKyAqIGlmIG5lY2Vzc2FyeS4KICAqCiAgKiBJZiBpdCBpcyBub3QgaW4gY29yZSwgcmVhZCBpdCBpbiBmcm9tIHRoZSBmaWxlIHN5c3RlbSdzIGRldmljZSwKLSAqIGFkZCBpdCB0byB0aGUgY2FjaGUgYW5kIGF0dGFjaCB0aGUgcHJvdmlkZWQgdm5vZGUuCisgKiBhZGQgaXQgdG8gdGhlIGNhY2hlIGFuZCBpbml0aWFsaXNlIHRoZSB2ZnMgaW5vZGUuCiAgKgogICogVGhlIGlub2RlIGlzIGxvY2tlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBsb2NrX2ZsYWdzIHBhcmFtZXRlci4KICAqIFRoaXMgZmxhZyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyBhbmQgaWYgdGhlIGlub2RlJ3MgSU8gbG9jayBhbmQgaW5vZGUgbG9jawpAQCAtNjMsOSArMzE2LDggQEAKICAqIGJubyAtLSB0aGUgYmxvY2sgbnVtYmVyIHN0YXJ0aW5nIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgaW5vZGUsCiAgKgkgIGlmIGtub3duIChhcyBieSBidWxrc3RhdCksIGVsc2UgMC4KICAqLwotU1RBVElDIGludAoteGZzX2lnZXRfY29yZSgKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlLAoraW50Cit4ZnNfaWdldCgKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX3RyYW5zX3QJKnRwLAogCXhmc19pbm9fdAlpbm8sCkBAIC03NCwxMSArMzI2LDggQEAKIAl4ZnNfaW5vZGVfdAkqKmlwcCwKIAl4ZnNfZGFkZHJfdAlibm8pCiB7Ci0Jc3RydWN0IGlub2RlCSpvbGRfaW5vZGU7CiAJeGZzX2lub2RlX3QJKmlwOwotCXhmc19pbm9kZV90CSppcTsKIAlpbnQJCWVycm9yOwotCXVuc2lnbmVkIGxvbmcJZmlyc3RfaW5kZXgsIG1hc2s7CiAJeGZzX3BlcmFnX3QJKnBhZzsKIAl4ZnNfYWdpbm9fdAlhZ2lubzsKIApAQCAtOTQsMjkyICszNDMsNDggQEAKIAlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CiAKIGFnYWluOgorCWVycm9yID0gMDsKIAlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlpcCA9IHJhZGl4X3RyZWVfbG9va3VwKCZwYWctPnBhZ19pY2lfcm9vdCwgYWdpbm8pOwogCi0JaWYgKGlwICE9IE5VTEwpIHsKLQkJLyoKLQkJICogSWYgSU5FVyBpcyBzZXQgdGhpcyBpbm9kZSBpcyBiZWluZyBzZXQgdXAKLQkJICogd2UgbmVlZCB0byBwYXVzZSBhbmQgdHJ5IGFnYWluLgotCQkgKi8KLQkJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcpKSB7Ci0JCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCQkJZGVsYXkoMSk7Ci0JCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKLQotCQkJZ290byBhZ2FpbjsKLQkJfQotCi0JCW9sZF9pbm9kZSA9IGlwLT5pX3Zub2RlOwotCQlpZiAob2xkX2lub2RlID09IE5VTEwpIHsKLQkJCS8qCi0JCQkgKiBJZiBJUkVDTEFJTSBpcyBzZXQgdGhpcyBpbm9kZSBpcwotCQkJICogb24gaXRzIHdheSBvdXQgb2YgdGhlIHN5c3RlbSwKLQkJCSAqIHdlIG5lZWQgdG8gcGF1c2UgYW5kIHRyeSBhZ2Fpbi4KLQkJCSAqLwotCQkJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSkgewotCQkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7Ci0JCQkJZGVsYXkoMSk7Ci0JCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mcmVjeWNsZSk7Ci0KLQkJCQlnb3RvIGFnYWluOwotCQkJfQotCQkJQVNTRVJUKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpOwotCi0JCQkvKgotCQkJICogSWYgbG9va3VwIGlzIHJhY2luZyB3aXRoIHVubGluaywgdGhlbiB3ZQotCQkJICogc2hvdWxkIHJldHVybiBhbiBlcnJvciBpbW1lZGlhdGVseSBzbyB3ZQotCQkJICogZG9uJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIHJlY2xhaW0gbGlzdCBhbmQKLQkJCSAqIHBvdGVudGlhbGx5IGxlYWsgdGhlIGlub2RlLgotCQkJICovCi0JCQlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSAmJgotCQkJICAgICEoZmxhZ3MgJiBYRlNfSUdFVF9DUkVBVEUpKSB7Ci0JCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKLQkJCQl4ZnNfcHV0X3BlcmFnKG1wLCBwYWcpOwotCQkJCXJldHVybiBFTk9FTlQ7Ci0JCQl9Ci0KLQkJCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5hbGxvYyIpOwotCi0JCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKLQkJCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JUkVDTEFJTUFCTEUpOwotCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKLQotCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKLQkJCWxpc3RfZGVsX2luaXQoJmlwLT5pX3JlY2xhaW0pOwotCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOwotCi0JCQlnb3RvIGZpbmlzaF9pbm9kZTsKLQotCQl9IGVsc2UgaWYgKGlub2RlICE9IG9sZF9pbm9kZSkgewotCQkJLyogVGhlIGlub2RlIGlzIGJlaW5nIHRvcm4gZG93biwgcGF1c2UgYW5kCi0JCQkgKiB0cnkgYWdhaW4uCi0JCQkgKi8KLQkJCWlmIChvbGRfaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HIHwgSV9DTEVBUikpIHsKLQkJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCQkJCWRlbGF5KDEpOwotCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOwotCi0JCQkJZ290byBhZ2FpbjsKLQkJCX0KLS8qIENoYW5jZXMgYXJlIHRoZSBvdGhlciB2bm9kZSAodGhlIG9uZSBpbiB0aGUgaW5vZGUpIGlzIGJlaW5nIHRvcm4KLSogZG93biByaWdodCBub3csIGFuZCB3ZSBsYW5kZWQgb24gdG9wIG9mIGl0LiBRdWVzdGlvbiBpcywgd2hhdCBkbwotKiB3ZSBkbz8gVW5ob29rIHRoZSBvbGQgaW5vZGUgYW5kIGhvb2sgdXAgdGhlIG5ldyBvbmU/Ci0qLwotCQkJY21uX2VycihDRV9QQU5JQywKLQkJInhmc19pZ2V0X2NvcmU6IGFtYmlndW91cyB2bnM6IHZwLzB4JXAsIGludnAvMHglcCIsCi0JCQkJCW9sZF9pbm9kZSwgaW5vZGUpOwotCQl9Ci0KLQkJLyoKLQkJICogSW5vZGUgY2FjaGUgaGl0Ci0JCSAqLwotCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKLQotZmluaXNoX2lub2RlOgotCQlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDAgJiYgIShmbGFncyAmIFhGU19JR0VUX0NSRUFURSkpIHsKLQkJCXhmc19wdXRfcGVyYWcobXAsIHBhZyk7Ci0JCQlyZXR1cm4gRU5PRU5UOwotCQl9Ci0KLQkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKLQkJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7Ci0KLQkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lTVEFMRSk7Ci0JCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5mb3VuZCIpOwotCQlnb3RvIHJldHVybl9pcDsKLQl9Ci0KLQkvKgotCSAqIElub2RlIGNhY2hlIG1pc3MKLQkgKi8KLQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCVhGU19TVEFUU19JTkMoeHNfaWdfbWlzc2VkKTsKLQotCS8qCi0JICogUmVhZCB0aGUgZGlzayBpbm9kZSBhdHRyaWJ1dGVzIGludG8gYSBuZXcgaW5vZGUgc3RydWN0dXJlIGFuZCBnZXQKLQkgKiBhIG5ldyB2bm9kZSBmb3IgaXQuIFRoaXMgc2hvdWxkIGFsc28gaW5pdGlhbGl6ZSBpX2lubyBhbmQgaV9tb3VudC4KLQkgKi8KLQllcnJvciA9IHhmc19pcmVhZChtcCwgdHAsIGlubywgJmlwLCBibm8sCi0JCQkgIChmbGFncyAmIFhGU19JR0VUX0JVTEtTVEFUKSA/IFhGU19JTUFQX0JVTEtTVEFUIDogMCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXhmc19wdXRfcGVyYWcobXAsIHBhZyk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQl4ZnNfaXRyYWNlX2V4aXRfdGFnKGlwLCAieGZzX2lnZXQuYWxsb2MiKTsKLQotCi0JbXJsb2NrX2luaXQoJmlwLT5pX2xvY2ssIE1STE9DS19BTExPV19FUVVBTF9QUkl8TVJMT0NLX0JBUlJJRVIsCi0JCSAgICAgInhmc2lubyIsIGlwLT5pX2lubyk7Ci0JbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmaXAtPmlfaXBpbl93YWl0KTsKLQlhdG9taWNfc2V0KCZpcC0+aV9waW5jb3VudCwgMCk7Ci0KLQkvKgotCSAqIEJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgYSBjb3VudGluZyBjb21wbGV0aW9uLCBjb21wbGV0ZQotCSAqIHRoZSBmbHVzaCBjb21wbGV0aW9uIG9uY2UgdG8gYWxsb3cgYSBzaW5nbGUgYWNjZXNzIHRvCi0JICogdGhlIGZsdXNoIGNvbXBsZXRpb24gd2l0aG91dCBibG9ja2luZy4KLQkgKi8KLQlpbml0X2NvbXBsZXRpb24oJmlwLT5pX2ZsdXNoKTsKLQljb21wbGV0ZSgmaXAtPmlfZmx1c2gpOwotCi0JaWYgKGxvY2tfZmxhZ3MpCi0JCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7Ci0KLQlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSAmJiAhKGZsYWdzICYgWEZTX0lHRVRfQ1JFQVRFKSkgewotCQl4ZnNfaWRlc3Ryb3koaXApOwotCQl4ZnNfcHV0X3BlcmFnKG1wLCBwYWcpOwotCQlyZXR1cm4gRU5PRU5UOwotCX0KLQotCS8qCi0JICogUHJlbG9hZCB0aGUgcmFkaXggdHJlZSBzbyB3ZSBjYW4gaW5zZXJ0IHNhZmVseSB1bmRlciB0aGUKLQkgKiB3cml0ZSBzcGlubG9jay4KLQkgKi8KLQlpZiAocmFkaXhfdHJlZV9wcmVsb2FkKEdGUF9LRVJORUwpKSB7Ci0JCXhmc19pZGVzdHJveShpcCk7Ci0JCWRlbGF5KDEpOwotCQlnb3RvIGFnYWluOwotCX0KLQltYXNrID0gfigoKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKSkgLSAxKTsKLQlmaXJzdF9pbmRleCA9IGFnaW5vICYgbWFzazsKLQl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7Ci0JLyoKLQkgKiBpbnNlcnQgdGhlIG5ldyBpbm9kZQotCSAqLwotCWVycm9yID0gcmFkaXhfdHJlZV9pbnNlcnQoJnBhZy0+cGFnX2ljaV9yb290LCBhZ2lubywgaXApOwotCWlmICh1bmxpa2VseShlcnJvcikpIHsKLQkJQlVHX09OKGVycm9yICE9IC1FRVhJU1QpOwotCQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKLQkJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwotCQl4ZnNfaWRlc3Ryb3koaXApOwotCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2R1cCk7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JLyoKLQkgKiBUaGVzZSB2YWx1ZXMgX211c3RfIGJlIHNldCBiZWZvcmUgcmVsZWFzaW5nIHRoZSByYWRpeCB0cmVlIGxvY2shCi0JICovCi0JaXAtPmlfdWRxdW90ID0gaXAtPmlfZ2RxdW90ID0gTlVMTDsKLQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lORVcpOwotCi0Jd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7Ci0JcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwotCi0JLyoKLQkgKiBMaW5rIGlwIHRvIGl0cyBtb3VudCBhbmQgdGhyZWFkIGl0IG9uIHRoZSBtb3VudCdzIGlub2RlIGxpc3QuCi0JICovCi0JWEZTX01PVU5UX0lMT0NLKG1wKTsKLQlpZiAoKGlxID0gbXAtPm1faW5vZGVzKSkgewotCQlBU1NFUlQoaXEtPmlfbXByZXYtPmlfbW5leHQgPT0gaXEpOwotCQlpcC0+aV9tcHJldiA9IGlxLT5pX21wcmV2OwotCQlpcS0+aV9tcHJldi0+aV9tbmV4dCA9IGlwOwotCQlpcS0+aV9tcHJldiA9IGlwOwotCQlpcC0+aV9tbmV4dCA9IGlxOworCWlmIChpcCkgeworCQllcnJvciA9IHhmc19pZ2V0X2NhY2hlX2hpdChwYWcsIGlwLCBmbGFncywgbG9ja19mbGFncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2Vycm9yX29yX2FnYWluOwogCX0gZWxzZSB7Ci0JCWlwLT5pX21uZXh0ID0gaXA7Ci0JCWlwLT5pX21wcmV2ID0gaXA7Ci0JfQotCW1wLT5tX2lub2RlcyA9IGlwOworCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlYRlNfU1RBVFNfSU5DKHhzX2lnX21pc3NlZCk7CiAKLQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCWVycm9yID0geGZzX2lnZXRfY2FjaGVfbWlzcyhtcCwgcGFnLCB0cCwgaW5vLCAmaXAsIGJubywKKwkJCQkJCQlmbGFncywgbG9ja19mbGFncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2Vycm9yX29yX2FnYWluOworCX0KIAl4ZnNfcHV0X3BlcmFnKG1wLCBwYWcpOwogCi0gcmV0dXJuX2lwOgotCUFTU0VSVChpcC0+aV9kZi5pZl9leHRfbWF4ID09Ci0JICAgICAgIFhGU19JRk9SS19EU0laRShpcCkgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKLQotCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSU1PRElGSUVEKTsKIAkqaXBwID0gaXA7CiAKLQkvKgotCSAqIFNldCB1cCB0aGUgTGludXggd2l0aCB0aGUgTGludXggaW5vZGUuCi0JICovCi0JaXAtPmlfdm5vZGUgPSBpbm9kZTsKLQlpbm9kZS0+aV9wcml2YXRlID0gaXA7Ci0KKwlBU1NFUlQoaXAtPmlfZGYuaWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfRFNJWkUoaXApIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CiAJLyoKIAkgKiBJZiB3ZSBoYXZlIGEgcmVhbCB0eXBlIGZvciBhbiBvbi1kaXNrIGlub2RlLCB3ZSBjYW4gc2V0IG9wcygmdW5sb2NrKQogCSAqIG5vdy4JIElmIGl0J3MgYSBuZXcgaW5vZGUgYmVpbmcgY3JlYXRlZCwgeGZzX2lhbGxvYyB3aWxsIGhhbmRsZSBpdC4KIAkgKi8KLQlpZiAoaXAtPmlfZC5kaV9tb2RlICE9IDApCisJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcpICYmIGlwLT5pX2QuZGlfbW9kZSAhPSAwKQogCQl4ZnNfc2V0dXBfaW5vZGUoaXApOwogCXJldHVybiAwOworCitvdXRfZXJyb3Jfb3JfYWdhaW46CisJaWYgKGVycm9yID09IEVBR0FJTikgeworCQlkZWxheSgxKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJeGZzX3B1dF9wZXJhZyhtcCwgcGFnKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIAogLyoKLSAqIFRoZSAnbm9ybWFsJyBpbnRlcm5hbCB4ZnNfaWdldCwgaWYgbmVlZGVkIGl0IHdpbGwKLSAqICdhbGxvY2F0ZScsIG9yICdnZXQnLCB0aGUgdm5vZGUuCi0gKi8KLWludAoteGZzX2lnZXQoCi0JeGZzX21vdW50X3QJKm1wLAotCXhmc190cmFuc190CSp0cCwKLQl4ZnNfaW5vX3QJaW5vLAotCXVpbnQJCWZsYWdzLAotCXVpbnQJCWxvY2tfZmxhZ3MsCi0JeGZzX2lub2RlX3QJKippcHAsCi0JeGZzX2RhZGRyX3QJYm5vKQotewotCXN0cnVjdCBpbm9kZQkqaW5vZGU7Ci0JeGZzX2lub2RlX3QJKmlwOwotCWludAkJZXJyb3I7Ci0KLQlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dGVtcHRzKTsKLQotcmV0cnk6Ci0JaW5vZGUgPSBpZ2V0X2xvY2tlZChtcC0+bV9zdXBlciwgaW5vKTsKLQlpZiAoIWlub2RlKQotCQkvKiBJZiB3ZSBnb3Qgbm8gaW5vZGUgd2UgYXJlIG91dCBvZiBtZW1vcnkgKi8KLQkJcmV0dXJuIEVOT01FTTsKLQotCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7Ci0JCVhGU19TVEFUU19JTkModm5fYWN0aXZlKTsKLQkJWEZTX1NUQVRTX0lOQyh2bl9hbGxvYyk7Ci0KLQkJZXJyb3IgPSB4ZnNfaWdldF9jb3JlKGlub2RlLCBtcCwgdHAsIGlubywgZmxhZ3MsCi0JCQkJbG9ja19mbGFncywgaXBwLCBibm8pOwotCQlpZiAoZXJyb3IpIHsKLQkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKQotCQkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCQkJaXB1dChpbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qCi0JICogSWYgdGhlIGlub2RlIGlzIG5vdCBmdWxseSBjb25zdHJ1Y3RlZCBkdWUgdG8KLQkgKiBmaWxlaGFuZGxlIG1pc21hdGNoZXMgd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvCi0JICogYXdheSBhbmQgdHJ5IGFnYWluLgotCSAqCi0JICogaWdldF9sb2NrZWQgd2lsbCBjYWxsIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlCi0JICogdG8gd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvIGF3YXkuCi0JICovCi0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKLQkJaXB1dChpbm9kZSk7Ci0JCWRlbGF5KDEpOwotCQlnb3RvIHJldHJ5OwotCX0KLQotCWlwID0gWEZTX0koaW5vZGUpOwotCWlmICghaXApIHsKLQkJaXB1dChpbm9kZSk7Ci0JCWRlbGF5KDEpOwotCQlnb3RvIHJldHJ5OwotCX0KLQotCWlmIChsb2NrX2ZsYWdzICE9IDApCi0JCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7Ci0JWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7Ci0JKmlwcCA9IGlwOwotCXJldHVybiAwOwotfQotCi0vKgogICogTG9vayBmb3IgdGhlIGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGlubyBpbiB0aGUgaGFzaCB0YWJsZS4KICAqIElmIGl0IGlzIHRoZXJlIGFuZCBpdHMgaV90cmFuc3AgcG9pbnRlciBtYXRjaGVzIHRwLCByZXR1cm4gaXQuCiAgKiBPdGhlcndpc2UsIHJldHVybiBOVUxMLgpAQCAtNDQ0LDk5ICs0NDksMTA5IEBACiAJSVJFTEUoaXApOwogfQogCi0KIC8qCi0gKiBUaGlzIHJvdXRpbmUgZW1ib2RpZXMgdGhlIHBhcnQgb2YgdGhlIHJlY2xhaW0gY29kZSB0aGF0IHB1bGxzCi0gKiB0aGUgaW5vZGUgZnJvbSB0aGUgaW5vZGUgaGFzaCB0YWJsZSBhbmQgdGhlIG1vdW50IHN0cnVjdHVyZSdzCi0gKiBpbm9kZSBsaXN0LgotICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB4ZnNfcmVjbGFpbSgpLgorICogVGhpcyBpcyBjYWxsZWQgZnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gaW5vZGUuCisgKiBJdCBtdXN0IGZyZWUgdGhlIGlub2RlIGl0c2VsZiBhbmQgYW55IGJ1ZmZlcnMgYWxsb2NhdGVkIGZvcgorICogaWZfZXh0ZW50cy9pZl9kYXRhIGFuZCBpZl9icm9vdC4gIEl0IG11c3QgYWxzbyBmcmVlIHRoZSBsb2NrCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlLgorICoKKyAqIE5vdGU6IGJlY2F1c2Ugd2UgZG9uJ3QgaW5pdGlhbGlzZSBldmVyeXRoaW5nIG9uIHJlYWxsb2NhdGlvbiBvdXQKKyAqIG9mIHRoZSB6b25lLCB3ZSBtdXN0IGVuc3VyZSB3ZSBudWxsaWZ5IGV2ZXJ5dGhpbmcgY29ycmVjdGx5IGJlZm9yZQorICogZnJlZWluZyB0aGUgc3RydWN0dXJlLgogICovCiB2b2lkCi14ZnNfaXJlY2xhaW0oeGZzX2lub2RlX3QgKmlwKQoreGZzX2lyZWNsYWltKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKQogewotCS8qCi0JICogUmVtb3ZlIGZyb20gb2xkIGhhc2ggbGlzdCBhbmQgbW91bnQgbGlzdC4KLQkgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZzsKKwogCVhGU19TVEFUU19JTkMoeHNfaWdfcmVjbGFpbXMpOwogCi0JeGZzX2lleHRyYWN0KGlwKTsKLQogCS8qCi0JICogSGVyZSB3ZSBkbyBhIHNwdXJpb3VzIGlub2RlIGxvY2sgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZSB3aXRoCi0JICogeGZzX3N5bmMoKS4gIFRoaXMgaXMgYmVjYXVzZSB4ZnNfc3luYygpIHJlZmVyZW5jZXMgdGhlIGlub2RlcwotCSAqIGluIHRoZSBtb3VudCBsaXN0IHdpdGhvdXQgdGFraW5nIHJlZmVyZW5jZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiB2bm9kZXMuICBXZSBtYWtlIHRoYXQgT0sgaGVyZSBieSBlbnN1cmluZyB0aGF0IHdlIHdhaXQgdW50aWwKLQkgKiB0aGUgaW5vZGUgaXMgdW5sb2NrZWQgaW4geGZzX3N5bmMoKSBiZWZvcmUgd2UgZ28gYWhlYWQgYW5kCi0JICogZnJlZSBpdC4gIFdlIGdldCBib3RoIHRoZSByZWd1bGFyIGxvY2sgYW5kIHRoZSBpbyBsb2NrIGJlY2F1c2UKLQkgKiB0aGUgeGZzX3N5bmMoKSBjb2RlIG1heSBuZWVkIHRvIGRyb3AgdGhlIHJlZ3VsYXIgb25lIGJ1dCB3aWxsCi0JICogc3RpbGwgaG9sZCB0aGUgaW8gbG9jay4KKwkgKiBSZW1vdmUgdGhlIGlub2RlIGZyb20gdGhlIHBlci1BRyByYWRpeCB0cmVlLiAgSXQgZG9lc24ndCBtYXR0ZXIKKwkgKiBpZiBpdCB3YXMgbmV2ZXIgYWRkZWQgdG8gaXQgYmVjYXVzZSByYWRpeF90cmVlX2RlbGV0ZSBjYW4gZGVhbAorCSAqIHdpdGggdGhhdCBjYXNlIGp1c3QgZmluZS4KIAkgKi8KLQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKLQotCS8qCi0JICogUmVsZWFzZSBkcXVvdHMgKGFuZCB0aGVpciByZWZlcmVuY2VzKSBpZiBhbnkuIEFuIGlub2RlIG1heSBlc2NhcGUKLQkgKiB4ZnNfaW5hY3RpdmUgYW5kIGdldCBoZXJlIHZpYSB2bl9hbGxvYy0+dm5fcmVjbGFpbSBwYXRoLgotCSAqLwotCVhGU19RTV9EUURFVEFDSChpcC0+aV9tb3VudCwgaXApOwotCi0JLyoKLQkgKiBQdWxsIG91ciBiZWhhdmlvciBkZXNjcmlwdG9yIGZyb20gdGhlIHZub2RlIGNoYWluLgotCSAqLwotCWlmIChpcC0+aV92bm9kZSkgewotCQlpcC0+aV92bm9kZS0+aV9wcml2YXRlID0gTlVMTDsKLQkJaXAtPmlfdm5vZGUgPSBOVUxMOwotCX0KLQotCS8qCi0JICogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5vZGUuCi0JICovCi0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKLQl4ZnNfaWRlc3Ryb3koaXApOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIHJlbW92ZXMgYW4gYWJvdXQtdG8tYmUtZGVzdHJveWVkIGlub2RlIGZyb20KLSAqIGFsbCBvZiB0aGUgbGlzdHMgaW4gd2hpY2ggaXQgaXMgbG9jYXRlZCB3aXRoIHRoZSBleGNlcHRpb24KLSAqIG9mIHRoZSBiZWhhdmlvciBjaGFpbi4KLSAqLwotdm9pZAoteGZzX2lleHRyYWN0KAotCXhmc19pbm9kZV90CSppcCkKLXsKLQl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQl4ZnNfcGVyYWdfdAkqcGFnID0geGZzX2dldF9wZXJhZyhtcCwgaXAtPmlfaW5vKTsKLQl4ZnNfaW5vZGVfdAkqaXE7Ci0KKwlwYWcgPSB4ZnNfZ2V0X3BlcmFnKG1wLCBpcC0+aV9pbm8pOwogCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlyYWRpeF90cmVlX2RlbGV0ZSgmcGFnLT5wYWdfaWNpX3Jvb3QsIFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubykpOwogCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCXhmc19wdXRfcGVyYWcobXAsIHBhZyk7CiAKIAkvKgotCSAqIFJlbW92ZSBmcm9tIG1vdW50J3MgaW5vZGUgbGlzdC4KKwkgKiBIZXJlIHdlIGRvIGFuIChhbG1vc3QpIHNwdXJpb3VzIGlub2RlIGxvY2sgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZQorCSAqIHdpdGggaW5vZGUgY2FjaGUgcmFkaXggdHJlZSBsb29rdXBzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsb29rdXAKKwkgKiBjYW4gcmVmZXJlbmNlIHRoZSBpbm9kZXMgaW4gdGhlIGNhY2hlIHdpdGhvdXQgdGFraW5nIHJlZmVyZW5jZXMuCisJICoKKwkgKiBXZSBtYWtlIHRoYXQgT0sgaGVyZSBieSBlbnN1cmluZyB0aGF0IHdlIHdhaXQgdW50aWwgdGhlIGlub2RlIGlzCisJICogdW5sb2NrZWQgYWZ0ZXIgdGhlIGxvb2t1cCBiZWZvcmUgd2UgZ28gYWhlYWQgYW5kIGZyZWUgaXQuICBXZSBnZXQKKwkgKiBib3RoIHRoZSBpbG9jayBhbmQgdGhlIGlvbG9jayBiZWNhdXNlIHRoZSBjb2RlIG1heSBuZWVkIHRvIGRyb3AgdGhlCisJICogaWxvY2sgb25lIGJ1dCB3aWxsIHN0aWxsIGhvbGQgdGhlIGlvbG9jay4KIAkgKi8KLQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCUFTU0VSVCgoaXAtPmlfbW5leHQgIT0gTlVMTCkgJiYgKGlwLT5pX21wcmV2ICE9IE5VTEwpKTsKLQlpcSA9IGlwLT5pX21uZXh0OwotCWlxLT5pX21wcmV2ID0gaXAtPmlfbXByZXY7Ci0JaXAtPmlfbXByZXYtPmlfbW5leHQgPSBpcTsKLQorCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwogCS8qCi0JICogRml4IHVwIHRoZSBoZWFkIHBvaW50ZXIgaWYgaXQgcG9pbnRzIHRvIHRoZSBpbm9kZSBiZWluZyBkZWxldGVkLgorCSAqIFJlbGVhc2UgZHF1b3RzIChhbmQgdGhlaXIgcmVmZXJlbmNlcykgaWYgYW55LgogCSAqLwotCWlmIChtcC0+bV9pbm9kZXMgPT0gaXApIHsKLQkJaWYgKGlwID09IGlxKSB7Ci0JCQltcC0+bV9pbm9kZXMgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJbXAtPm1faW5vZGVzID0gaXE7Ci0JCX0KKwlYRlNfUU1fRFFERVRBQ0goaXAtPmlfbW91bnQsIGlwKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCisJc3dpdGNoIChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJY2FzZSBTX0lGRElSOgorCWNhc2UgU19JRkxOSzoKKwkJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19EQVRBX0ZPUkspOworCQlicmVhazsKIAl9CiAKLQkvKiBEZWFsIHdpdGggdGhlIGRlbGV0ZWQgaW5vZGVzIGxpc3QgKi8KLQlsaXN0X2RlbF9pbml0KCZpcC0+aV9yZWNsYWltKTsKKwlpZiAoaXAtPmlfYWZwKQorCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0FUVFJfRk9SSyk7CiAKLQltcC0+bV9pcmVjbGFpbXMrKzsKLQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisjaWZkZWYgWEZTX0lOT0RFX1RSQUNFCisJa3RyYWNlX2ZyZWUoaXAtPmlfdHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV94dHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX0JUUkVFX1RSQUNFCisJa3RyYWNlX2ZyZWUoaXAtPmlfYnRyYWNlKTsKKyNlbmRpZgorI2lmZGVmIFhGU19SV19UUkFDRQorCWt0cmFjZV9mcmVlKGlwLT5pX3J3dHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX0lMT0NLX1RSQUNFCisJa3RyYWNlX2ZyZWUoaXAtPmlfbG9ja190cmFjZSk7CisjZW5kaWYKKyNpZmRlZiBYRlNfRElSMl9UUkFDRQorCWt0cmFjZV9mcmVlKGlwLT5pX2Rpcl90cmFjZSk7CisjZW5kaWYKKwlpZiAoaXAtPmlfaXRlbXApIHsKKwkJLyoKKwkJICogT25seSBpZiB3ZSBhcmUgc2h1dHRpbmcgZG93biB0aGUgZnMgd2lsbCB3ZSBzZWUgYW4KKwkJICogaW5vZGUgc3RpbGwgaW4gdGhlIEFJTC4gSWYgaXQgaXMgdGhlcmUsIHdlIHNob3VsZCByZW1vdmUKKwkJICogaXQgdG8gcHJldmVudCBhIHVzZS1hZnRlci1mcmVlIGZyb20gb2NjdXJyaW5nLgorCQkgKi8KKwkJeGZzX2xvZ19pdGVtX3QJKmxpcCA9ICZpcC0+aV9pdGVtcC0+aWxpX2l0ZW07CisJCXN0cnVjdCB4ZnNfYWlsCSphaWxwID0gbGlwLT5saV9haWxwOworCisJCUFTU0VSVCgoKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKSB8fAorCQkJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSk7CisJCWlmIChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgeworCQkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCWlmIChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkKKwkJCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOworCQkJZWxzZQorCQkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJfQorCQl4ZnNfaW5vZGVfaXRlbV9kZXN0cm95KGlwKTsKKwkJaXAtPmlfaXRlbXAgPSBOVUxMOworCX0KKwkvKiBhc3NlcnRzIHRvIHZlcmlmeSBhbGwgc3RhdGUgaXMgY29ycmVjdCBoZXJlICovCisJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9pb2NvdW50KSA9PSAwKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA9PSAwKTsKKwlBU1NFUlQoIXNwaW5faXNfbG9ja2VkKCZpcC0+aV9mbGFnc19sb2NrKSk7CisJQVNTRVJUKGNvbXBsZXRpb25fZG9uZSgmaXAtPmlfZmx1c2gpKTsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOwogfQogCiAvKgpAQCAtNzM3LDcgKzc1Miw3IEBACiAJCSAqIGl0IGlzIGluIHRoZSBBSUwgYW5kIGFueW9uZSBpcyB3YWl0aW5nIG9uIGl0LiAgRG9uJ3QgZG8KIAkJICogdGhpcyBpZiB0aGUgY2FsbGVyIGhhcyBhc2tlZCB1cyBub3QgdG8uCiAJCSAqLwotCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShpcC0+aV9tb3VudCwKKwkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oaXAtPmlfaXRlbXAtPmlsaV9pdGVtLmxpX2FpbHAsCiAJCQkJCSh4ZnNfbG9nX2l0ZW1fdCopKGlwLT5pX2l0ZW1wKSk7CiAJfQogCXhmc19pbG9ja190cmFjZShpcCwgMywgbG9ja19mbGFncywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwpAQCAtNzkwLDMgKzgwNSw1MSBAQAogfQogI2VuZGlmCiAKKyNpZmRlZglYRlNfSU5PREVfVFJBQ0UKKworI2RlZmluZSBLVFJBQ0VfRU5URVIoaXAsIHZrLCBzLCBsaW5lLCByYSkJCQlcCisJa3RyYWNlX2VudGVyKChpcCktPmlfdHJhY2UsCQkJCVwKKy8qICAwICovCQkodm9pZCAqKShfX3BzaW50X3QpKHZrKSwJCVwKKy8qICAxICovCQkodm9pZCAqKShzKSwJCQkJXAorLyogIDIgKi8JCSh2b2lkICopKF9fcHNpbnRfdCkgbGluZSwJCVwKKy8qICAzICovCQkodm9pZCAqKShfX3BzaW50X3QpYXRvbWljX3JlYWQoJlZGU19JKGlwKS0+aV9jb3VudCksIFwKKy8qICA0ICovCQkodm9pZCAqKShyYSksCQkJCVwKKy8qICA1ICovCQlOVUxMLAkJCQkJXAorLyogIDYgKi8JCSh2b2lkICopKF9fcHNpbnRfdCljdXJyZW50X2NwdSgpLAlcCisvKiAgNyAqLwkJKHZvaWQgKikoX19wc2ludF90KWN1cnJlbnRfcGlkKCksCVwKKy8qICA4ICovCQkodm9pZCAqKV9fcmV0dXJuX2FkZHJlc3MsCQlcCisvKiAgOSAqLwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkKKworLyoKKyAqIFZub2RlIHRyYWNpbmcgY29kZS4KKyAqLwordm9pZAorX3hmc19pdHJhY2VfZW50cnkoeGZzX2lub2RlX3QgKmlwLCBjb25zdCBjaGFyICpmdW5jLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX0VOVFJZLCBmdW5jLCAwLCByYSk7Cit9CisKK3ZvaWQKK194ZnNfaXRyYWNlX2V4aXQoeGZzX2lub2RlX3QgKmlwLCBjb25zdCBjaGFyICpmdW5jLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX0VYSVQsIGZ1bmMsIDAsIHJhKTsKK30KKwordm9pZAoreGZzX2l0cmFjZV9ob2xkKHhmc19pbm9kZV90ICppcCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCit7CisJS1RSQUNFX0VOVEVSKGlwLCBJTk9ERV9LVFJBQ0VfSE9MRCwgZmlsZSwgbGluZSwgcmEpOworfQorCit2b2lkCitfeGZzX2l0cmFjZV9yZWYoeGZzX2lub2RlX3QgKmlwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKK3sKKwlLVFJBQ0VfRU5URVIoaXAsIElOT0RFX0tUUkFDRV9SRUYsIGZpbGUsIGxpbmUsIHJhKTsKK30KKwordm9pZAoreGZzX2l0cmFjZV9yZWxlKHhmc19pbm9kZV90ICppcCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCit7CisJS1RSQUNFX0VOVEVSKGlwLCBJTk9ERV9LVFJBQ0VfUkVMRSwgZmlsZSwgbGluZSwgcmEpOworfQorI2VuZGlmCS8qIFhGU19JTk9ERV9UUkFDRSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbWFwLmggYi9mcy94ZnMveGZzX2ltYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2NDUwMC4uMDAwMDAwMAotLS0gYS9mcy94ZnMveGZzX2ltYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fWEZTX0lNQVBfSF9fCi0jZGVmaW5lCV9fWEZTX0lNQVBfSF9fCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHhmc19pbWFwKCkgdG8gbWFwCi0gKiBhbiBpbm9kZSBudW1iZXIgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19pbWFwIHsKLQl4ZnNfZGFkZHJfdAlpbV9ibGtubzsJLyogc3RhcnRpbmcgQkIgb2YgaW5vZGUgY2h1bmsgKi8KLQl1aW50CQlpbV9sZW47CQkvKiBsZW5ndGggaW4gQkJzIG9mIGlub2RlIGNodW5rICovCi0JeGZzX2FnYmxvY2tfdAlpbV9hZ2Jsa25vOwkvKiBsb2dpY2FsIGJsb2NrIG9mIGlub2RlIGNodW5rIGluIGFnICovCi0JdXNob3J0CQlpbV9pb2Zmc2V0OwkvKiBpbm9kZSBvZmZzZXQgaW4gYmxvY2sgaW4gImlub2RlcyIgKi8KLQl1c2hvcnQJCWltX2JvZmZzZXQ7CS8qIGlub2RlIG9mZnNldCBpbiBibG9jayBpbiBieXRlcyAqLwotfSB4ZnNfaW1hcF90OwotCi0jaWZkZWYgX19LRVJORUxfXwotc3RydWN0IHhmc19tb3VudDsKLXN0cnVjdCB4ZnNfdHJhbnM7Ci1pbnQJeGZzX2ltYXAoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKLQkJIHhmc19pbWFwX3QgKiwgdWludCk7Ci0jZW5kaWYKLQotI2VuZGlmCS8qIF9fWEZTX0lNQVBfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggYTM5MWI5NS4uNWE1ZTAzNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgInhmc19iaXQuaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCiAjaW5jbHVkZSAieGZzX2ludW0uaCIKLSNpbmNsdWRlICJ4ZnNfaW1hcC5oIgogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCiAjaW5jbHVkZSAieGZzX3NiLmgiCkBAIC00MSw2ICs0MCw3IEBACiAjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWVfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKQEAgLTEzMywxMCArMTMzLDEwIEBACiB4ZnNfaW1hcF90b19icCgKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX3RyYW5zX3QJKnRwLAotCXhmc19pbWFwX3QJKmltYXAsCisJc3RydWN0IHhmc19pbWFwCSppbWFwLAogCXhmc19idWZfdAkqKmJwcCwKIAl1aW50CQlidWZfZmxhZ3MsCi0JdWludAkJaW1hcF9mbGFncykKKwl1aW50CQlpZ2V0X2ZsYWdzKQogewogCWludAkJZXJyb3I7CiAJaW50CQlpOwpAQCAtMTczLDEyICsxNzMsMTIgQEAKIAogCQlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsCiAJCQkJCShpIDw8IG1wLT5tX3NiLnNiX2lub2RlbG9nKSk7Ci0JCWRpX29rID0gYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSA9PSBYRlNfRElOT0RFX01BR0lDICYmCi0JCQkgICAgWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04oZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24pOworCQlkaV9vayA9IGJlMTZfdG9fY3B1KGRpcC0+ZGlfbWFnaWMpID09IFhGU19ESU5PREVfTUFHSUMgJiYKKwkJCSAgICBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTihkaXAtPmRpX3ZlcnNpb24pOwogCQlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWRpX29rLCBtcCwKIAkJCQkJCVhGU19FUlJUQUdfSVRPQlBfSU5PVE9CUCwKIAkJCQkJCVhGU19SQU5ET01fSVRPQlBfSU5PVE9CUCkpKSB7Ci0JCQlpZiAoaW1hcF9mbGFncyAmIFhGU19JTUFQX0JVTEtTVEFUKSB7CisJCQlpZiAoaWdldF9mbGFncyAmIFhGU19JR0VUX0JVTEtTVEFUKSB7CiAJCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwogCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAkJCX0KQEAgLTE5MCw3ICsxOTAsNyBAQAogCQkJCQkiZGFkZHIgJWxsZCAjJWQgKG1hZ2ljPSV4KSIsCiAJCQkJWEZTX0JVRlRBUkdfTkFNRShtcC0+bV9kZGV2X3RhcmdwKSwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKWltYXAtPmltX2Jsa25vLCBpLAotCQkJCWJlMTZfdG9fY3B1KGRpcC0+ZGlfY29yZS5kaV9tYWdpYykpOworCQkJCWJlMTZfdG9fY3B1KGRpcC0+ZGlfbWFnaWMpKTsKICNlbmRpZgogCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwogCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwpAQCAtMjIxLDI1ICsyMjEsMjYgQEAKICAqIFVzZSB4ZnNfaW1hcCgpIHRvIGRldGVybWluZSB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgdGhlCiAgKiBidWZmZXIgdG8gcmVhZCBmcm9tIGRpc2suCiAgKi8KLVNUQVRJQyBpbnQKK2ludAogeGZzX2lub3RvYnAoCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc190cmFuc190CSp0cCwKIAl4ZnNfaW5vX3QJaW5vLAogCXhmc19kaW5vZGVfdAkqKmRpcHAsCiAJeGZzX2J1Zl90CSoqYnBwLAotCWludAkJKm9mZnNldCkKKwlpbnQJCSpvZmZzZXQsCisJdWludAkJaW1hcF9mbGFncykKIHsKLQl4ZnNfaW1hcF90CWltYXA7CisJc3RydWN0IHhmc19pbWFwCWltYXA7CiAJeGZzX2J1Zl90CSpicDsKIAlpbnQJCWVycm9yOwogCiAJaW1hcC5pbV9ibGtubyA9IDA7Ci0JZXJyb3IgPSB4ZnNfaW1hcChtcCwgdHAsIGlubywgJmltYXAsIFhGU19JTUFQX0xPT0tVUCk7CisJZXJyb3IgPSB4ZnNfaW1hcChtcCwgdHAsIGlubywgJmltYXAsIGltYXBfZmxhZ3MpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSB4ZnNfaW1hcF90b19icChtcCwgdHAsICZpbWFwLCAmYnAsIFhGU19CVUZfTE9DSywgMCk7CisJZXJyb3IgPSB4ZnNfaW1hcF90b19icChtcCwgdHAsICZpbWFwLCAmYnAsIFhGU19CVUZfTE9DSywgaW1hcF9mbGFncyk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTI2MCwxNSArMjYxLDExIEBACiAgKiBJZiBhIG5vbi16ZXJvIGVycm9yIGlzIHJldHVybmVkLCB0aGVuIHRoZSBjb250ZW50cyBvZiBicHAgYW5kCiAgKiBkaXBwIGFyZSB1bmRlZmluZWQuCiAgKgotICogSWYgdGhlIGlub2RlIGlzIG5ldyBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCwgdXNlIHhmc19pbWFwKCkKLSAqIHRvIGRldGVybWluZSB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gZGlzay4KLSAqIElmIHRoZSBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIG1hcHBlZCB0byBpdHMgYnVmZmVyIGFuZCByZWFkIGluIG9uY2UsCi0gKiB0aGVuIHVzZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGlub2RlIHJhdGhlciB0aGFuCi0gKiBjYWxsaW5nIHhmc19pbWFwKCkuICBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgbG9va2luZwotICogYXQgdGhlIGlub2RlIGJ0cmVlIGZvciBzbWFsbCBibG9jayBmaWxlIHN5c3RlbXMgKHNlZSB4ZnNfZGlsb2NhdGUoKSkuCi0gKiBXZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBpbm9kZSBoYXMgYmVlbiBtYXBwZWQgaW4gYmVmb3JlIGJ5IGNvbXBhcmluZwotICogaXRzIGRpc2sgYmxvY2sgYWRkcmVzcyB0byAwLiAgT25seSB1bmluaXRpYWxpemVkIGlub2RlcyB3aWxsIGhhdmUKLSAqIDAgZm9yIHRoZSBkaXNrIGJsb2NrIGFkZHJlc3MuCisgKiBUaGUgaW5vZGUgaXMgZXhwZWN0ZWQgdG8gYWxyZWFkeSBiZWVuIG1hcHBlZCB0byBpdHMgYnVmZmVyIGFuZCByZWFkCisgKiBpbiBvbmNlLCB0aHVzIHdlIGNhbiB1c2UgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBpbm9kZQorICogcmF0aGVyIHRoYW4gY2FsbGluZyB4ZnNfaW1hcCgpLiAgVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkCisgKiBvZiBsb29raW5nIGF0IHRoZSBpbm9kZSBidHJlZSBmb3Igc21hbGwgYmxvY2sgZmlsZSBzeXN0ZW1zCisgKiAoc2VlIHhmc19pbWFwKCkpLgogICovCiBpbnQKIHhmc19pdG9icCgKQEAgLTI3Nyw0MCArMjc0LDE0IEBACiAJeGZzX2lub2RlX3QJKmlwLAogCXhmc19kaW5vZGVfdAkqKmRpcHAsCiAJeGZzX2J1Zl90CSoqYnBwLAotCXhmc19kYWRkcl90CWJubywKLQl1aW50CQlpbWFwX2ZsYWdzLAogCXVpbnQJCWJ1Zl9mbGFncykKIHsKLQl4ZnNfaW1hcF90CWltYXA7CiAJeGZzX2J1Zl90CSpicDsKIAlpbnQJCWVycm9yOwogCi0JaWYgKGlwLT5pX2Jsa25vID09ICh4ZnNfZGFkZHJfdCkwKSB7Ci0JCWltYXAuaW1fYmxrbm8gPSBibm87Ci0JCWVycm9yID0geGZzX2ltYXAobXAsIHRwLCBpcC0+aV9pbm8sICZpbWFwLAotCQkJCQlYRlNfSU1BUF9MT09LVVAgfCBpbWFwX2ZsYWdzKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOworCUFTU0VSVChpcC0+aV9pbWFwLmltX2Jsa25vICE9IDApOwogCi0JCS8qCi0JCSAqIEZpbGwgaW4gdGhlIGZpZWxkcyBpbiB0aGUgaW5vZGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8KLQkJICogbWFwIHRoZSBpbm9kZSB0byBpdHMgYnVmZmVyIGZyb20gbm93IG9uLgotCQkgKi8KLQkJaXAtPmlfYmxrbm8gPSBpbWFwLmltX2Jsa25vOwotCQlpcC0+aV9sZW4gPSBpbWFwLmltX2xlbjsKLQkJaXAtPmlfYm9mZnNldCA9IGltYXAuaW1fYm9mZnNldDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBXZSd2ZSBhbHJlYWR5IG1hcHBlZCB0aGUgaW5vZGUgb25jZSwgc28ganVzdCB1c2UgdGhlCi0JCSAqIG1hcHBpbmcgdGhhdCB3ZSBzYXZlZCB0aGUgZmlyc3QgdGltZS4KLQkJICovCi0JCWltYXAuaW1fYmxrbm8gPSBpcC0+aV9ibGtubzsKLQkJaW1hcC5pbV9sZW4gPSBpcC0+aV9sZW47Ci0JCWltYXAuaW1fYm9mZnNldCA9IGlwLT5pX2JvZmZzZXQ7Ci0JfQotCUFTU0VSVChibm8gPT0gMCB8fCBibm8gPT0gaW1hcC5pbV9ibGtubyk7Ci0KLQllcnJvciA9IHhmc19pbWFwX3RvX2JwKG1wLCB0cCwgJmltYXAsICZicCwgYnVmX2ZsYWdzLCBpbWFwX2ZsYWdzKTsKKwllcnJvciA9IHhmc19pbWFwX3RvX2JwKG1wLCB0cCwgJmlwLT5pX2ltYXAsICZicCwgYnVmX2ZsYWdzLCAwKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIApAQCAtMzIxLDcgKzI5Miw3IEBACiAJCXJldHVybiBFQUdBSU47CiAJfQogCi0JKmRpcHAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGltYXAuaW1fYm9mZnNldCk7CisJKmRpcHAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGlwLT5pX2ltYXAuaW1fYm9mZnNldCk7CiAJKmJwcCA9IGJwOwogCXJldHVybiAwOwogfQpAQCAtMzQ4LDI2ICszMTksMjYgQEAKIAkJWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CiAJZXJyb3IgPSAwOwogCi0JaWYgKHVubGlrZWx5KGJlMzJfdG9fY3B1KGRpcC0+ZGlfY29yZS5kaV9uZXh0ZW50cykgKwotCQkgICAgIGJlMTZfdG9fY3B1KGRpcC0+ZGlfY29yZS5kaV9hbmV4dGVudHMpID4KLQkJICAgICBiZTY0X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfbmJsb2NrcykpKSB7CisJaWYgKHVubGlrZWx5KGJlMzJfdG9fY3B1KGRpcC0+ZGlfbmV4dGVudHMpICsKKwkJICAgICBiZTE2X3RvX2NwdShkaXAtPmRpX2FuZXh0ZW50cykgPgorCQkgICAgIGJlNjRfdG9fY3B1KGRpcC0+ZGlfbmJsb2NrcykpKSB7CiAJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKIAkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGV4dGVudCB0b3RhbCA9ICVkLCBuYmxvY2tzID0gJUx1LiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lubywKLQkJCShpbnQpKGJlMzJfdG9fY3B1KGRpcC0+ZGlfY29yZS5kaV9uZXh0ZW50cykgKwotCQkJICAgICAgYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cykpLAorCQkJKGludCkoYmUzMl90b19jcHUoZGlwLT5kaV9uZXh0ZW50cykgKworCQkJICAgICAgYmUxNl90b19jcHUoZGlwLT5kaV9hbmV4dGVudHMpKSwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCi0JCQkJYmU2NF90b19jcHUoZGlwLT5kaV9jb3JlLmRpX25ibG9ja3MpKTsKKwkJCQliZTY0X3RvX2NwdShkaXAtPmRpX25ibG9ja3MpKTsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDEpIiwgWEZTX0VSUkxFVkVMX0xPVywKIAkJCQkgICAgIGlwLT5pX21vdW50LCBkaXApOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CiAJfQogCi0JaWYgKHVubGlrZWx5KGRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmID4gaXAtPmlfbW91bnQtPm1fc2Iuc2JfaW5vZGVzaXplKSkgeworCWlmICh1bmxpa2VseShkaXAtPmRpX2ZvcmtvZmYgPiBpcC0+aV9tb3VudC0+bV9zYi5zYl9pbm9kZXNpemUpKSB7CiAJCXhmc19mc19yZXBhaXJfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKIAkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGZvcmtvZmYgPSAweCV4LiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lubywKLQkJCWRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmKTsKKwkJCWRpcC0+ZGlfZm9ya29mZik7CiAJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgyKSIsIFhGU19FUlJMRVZFTF9MT1csCiAJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwpAQCAtMzc4LDI1ICszNDksMjUgQEAKIAljYXNlIFNfSUZDSFI6CiAJY2FzZSBTX0lGQkxLOgogCWNhc2UgU19JRlNPQ0s6Ci0JCWlmICh1bmxpa2VseShkaXAtPmRpX2NvcmUuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0RFVikpIHsKKwkJaWYgKHVubGlrZWx5KGRpcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0RFVikpIHsKIAkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgzKSIsIFhGU19FUlJMRVZFTF9MT1csCiAJCQkJCSAgICAgIGlwLT5pX21vdW50LCBkaXApOwogCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCQl9CiAJCWlwLT5pX2QuZGlfc2l6ZSA9IDA7CiAJCWlwLT5pX3NpemUgPSAwOwotCQlpcC0+aV9kZi5pZl91Mi5pZl9yZGV2ID0gYmUzMl90b19jcHUoZGlwLT5kaV91LmRpX2Rldik7CisJCWlwLT5pX2RmLmlmX3UyLmlmX3JkZXYgPSB4ZnNfZGlub2RlX2dldF9yZGV2KGRpcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTX0lGUkVHOgogCWNhc2UgU19JRkxOSzoKIAljYXNlIFNfSUZESVI6Ci0JCXN3aXRjaCAoZGlwLT5kaV9jb3JlLmRpX2Zvcm1hdCkgeworCQlzd2l0Y2ggKGRpcC0+ZGlfZm9ybWF0KSB7CiAJCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CiAJCQkvKgogCQkJICogbm8gbG9jYWwgcmVndWxhciBmaWxlcyB5ZXQKIAkJCSAqLwotCQkJaWYgKHVubGlrZWx5KChiZTE2X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZSRUcpKSB7CisJCQlpZiAodW5saWtlbHkoKGJlMTZfdG9fY3B1KGRpcC0+ZGlfbW9kZSkgJiBTX0lGTVQpID09IFNfSUZSRUcpKSB7CiAJCQkJeGZzX2ZzX3JlcGFpcl9jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAogCQkJCQkiY29ycnVwdCBpbm9kZSAlTHUgIgogCQkJCQkiKGxvY2FsIGZvcm1hdCBmb3IgcmVndWxhciBmaWxlKS4iLApAQCAtNDA3LDcgKzM3OCw3IEBACiAJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCQkJfQogCi0JCQlkaV9zaXplID0gYmU2NF90b19jcHUoZGlwLT5kaV9jb3JlLmRpX3NpemUpOworCQkJZGlfc2l6ZSA9IGJlNjRfdG9fY3B1KGRpcC0+ZGlfc2l6ZSk7CiAJCQlpZiAodW5saWtlbHkoZGlfc2l6ZSA+IFhGU19ERk9SS19EU0laRShkaXAsIGlwLT5pX21vdW50KSkpIHsKIAkJCQl4ZnNfZnNfcmVwYWlyX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCiAJCQkJCSJjb3JydXB0IGlub2RlICVMdSAiCkBAIC00NDksNyArNDIwLDcgQEAKIAlpcC0+aV9hZnAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pZm9ya196b25lLCBLTV9TTEVFUCk7CiAJaXAtPmlfYWZwLT5pZl9leHRfbWF4ID0KIAkJWEZTX0lGT1JLX0FTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7Ci0Jc3dpdGNoIChkaXAtPmRpX2NvcmUuZGlfYWZvcm1hdCkgeworCXN3aXRjaCAoZGlwLT5kaV9hZm9ybWF0KSB7CiAJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKIAkJYXRwID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopWEZTX0RGT1JLX0FQVFIoZGlwKTsKIAkJc2l6ZSA9IGJlMTZfdG9fY3B1KGF0cC0+aGRyLnRvdHNpemUpOwpAQCAtNjIxLDcgKzU5Miw3IEBACiAJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKIAlkZnAgPSAoeGZzX2JtZHJfYmxvY2tfdCAqKVhGU19ERk9SS19QVFIoZGlwLCB3aGljaGZvcmspOwogCXNpemUgPSBYRlNfQk1BUF9CUk9PVF9TUEFDRShkZnApOwotCW5yZWNzID0gWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhkZnApOworCW5yZWNzID0gYmUxNl90b19jcHUoZGZwLT5iYl9udW1yZWNzKTsKIAogCS8qCiAJICogYmxvdyBvdXQgaWYgLS0gZm9yayBoYXMgbGVzcyBleHRlbnRzIHRoYW4gY2FuIGZpdCBpbgpAQCAtNjQ5LDggKzYyMCw5IEBACiAJICogQ29weSBhbmQgY29udmVydCBmcm9tIHRoZSBvbi1kaXNrIHN0cnVjdHVyZQogCSAqIHRvIHRoZSBpbi1tZW1vcnkgc3RydWN0dXJlLgogCSAqLwotCXhmc19ibWRyX3RvX2JtYnQoZGZwLCBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspLAotCQlpZnAtPmlmX2Jyb290LCBzaXplKTsKKwl4ZnNfYm1kcl90b19ibWJ0KGlwLT5pX21vdW50LCBkZnAsCisJCQkgWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSwKKwkJCSBpZnAtPmlmX2Jyb290LCBzaXplKTsKIAlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOwogCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGQlJPT1Q7CiAKQEAgLTY2MCw3ICs2MzIsNyBAQAogdm9pZAogeGZzX2Rpbm9kZV9mcm9tX2Rpc2soCiAJeGZzX2ljZGlub2RlX3QJCSp0bywKLQl4ZnNfZGlub2RlX2NvcmVfdAkqZnJvbSkKKwl4ZnNfZGlub2RlX3QJCSpmcm9tKQogewogCXRvLT5kaV9tYWdpYyA9IGJlMTZfdG9fY3B1KGZyb20tPmRpX21hZ2ljKTsKIAl0by0+ZGlfbW9kZSA9IGJlMTZfdG9fY3B1KGZyb20tPmRpX21vZGUpOwpAQCAtNjk0LDcgKzY2Niw3IEBACiAKIHZvaWQKIHhmc19kaW5vZGVfdG9fZGlzaygKLQl4ZnNfZGlub2RlX2NvcmVfdAkqdG8sCisJeGZzX2Rpbm9kZV90CQkqdG8sCiAJeGZzX2ljZGlub2RlX3QJCSpmcm9tKQogewogCXRvLT5kaV9tYWdpYyA9IGNwdV90b19iZTE2KGZyb20tPmRpX21hZ2ljKTsKQEAgLTc4MSw5MyArNzUzLDU3IEBACiB4ZnNfZGljMnhmbGFncygKIAl4ZnNfZGlub2RlX3QJCSpkaXApCiB7Ci0JeGZzX2Rpbm9kZV9jb3JlX3QJKmRpYyA9ICZkaXAtPmRpX2NvcmU7Ci0KLQlyZXR1cm4gX3hmc19kaWMyeGZsYWdzKGJlMTZfdG9fY3B1KGRpYy0+ZGlfZmxhZ3MpKSB8CisJcmV0dXJuIF94ZnNfZGljMnhmbGFncyhiZTE2X3RvX2NwdShkaXAtPmRpX2ZsYWdzKSkgfAogCQkJCShYRlNfREZPUktfUShkaXApID8gWEZTX1hGTEFHX0hBU0FUVFIgOiAwKTsKIH0KIAogLyoKLSAqIEdpdmVuIGEgbW91bnQgc3RydWN0dXJlIGFuZCBhbiBpbm9kZSBudW1iZXIsIHJldHVybiBhIHBvaW50ZXIKLSAqIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGluLWNvcmUgaW5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAqIGlub2RlIG51bWJlci4KLSAqCi0gKiBJbml0aWFsaXplIHRoZSBpbm9kZSdzIGF0dHJpYnV0ZXMgYW5kIGV4dGVudCBwb2ludGVycyBpZiBpdAotICogYWxyZWFkeSBoYXMgdGhlbSAoaXQgd2lsbCBub3QgaWYgdGhlIGlub2RlIGhhcyBubyBsaW5rcykuCisgKiBSZWFkIHRoZSBkaXNrIGlub2RlIGF0dHJpYnV0ZXMgaW50byB0aGUgaW4tY29yZSBpbm9kZSBzdHJ1Y3R1cmUuCiAgKi8KIGludAogeGZzX2lyZWFkKAogCXhmc19tb3VudF90CSptcCwKIAl4ZnNfdHJhbnNfdAkqdHAsCi0JeGZzX2lub190CWlubywKLQl4ZnNfaW5vZGVfdAkqKmlwcCwKKwl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX2RhZGRyX3QJYm5vLAotCXVpbnQJCWltYXBfZmxhZ3MpCisJdWludAkJaWdldF9mbGFncykKIHsKIAl4ZnNfYnVmX3QJKmJwOwogCXhmc19kaW5vZGVfdAkqZGlwOwotCXhmc19pbm9kZV90CSppcDsKIAlpbnQJCWVycm9yOwogCi0JQVNTRVJUKHhmc19pbm9kZV96b25lICE9IE5VTEwpOwotCi0JaXAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pbm9kZV96b25lLCBLTV9TTEVFUCk7Ci0JaXAtPmlfaW5vID0gaW5vOwotCWlwLT5pX21vdW50ID0gbXA7Ci0JYXRvbWljX3NldCgmaXAtPmlfaW9jb3VudCwgMCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmlwLT5pX2ZsYWdzX2xvY2spOwotCiAJLyoKLQkgKiBHZXQgcG9pbnRlcidzIHRvIHRoZSBvbi1kaXNrIGlub2RlIGFuZCB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgaXQuCi0JICogSWYgdGhlIGlub2RlIG51bWJlciByZWZlcnMgdG8gYSBibG9jayBvdXRzaWRlIHRoZSBmaWxlIHN5c3RlbQotCSAqIHRoZW4geGZzX2l0b2JwKCkgd2lsbCByZXR1cm4gTlVMTC4gIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQKLQkgKiByZXR1cm4gTlVMTCBhcyB3ZWxsLiAgU2V0IGlfYmxrbm8gdG8gMCBzbyB0aGF0IHhmc19pdG9icCgpIHdpbGwKLQkgKiBrbm93IHRoYXQgdGhpcyBpcyBhIG5ldyBpbmNvcmUgaW5vZGUuCisJICogRmlsbCBpbiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIGluLWNvcmUgaW5vZGUuCiAJICovCi0JZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmJwLCBibm8sIGltYXBfZmxhZ3MsIFhGU19CVUZfTE9DSyk7Ci0JaWYgKGVycm9yKSB7Ci0JCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7CisJaXAtPmlfaW1hcC5pbV9ibGtubyA9IGJubzsKKwllcnJvciA9IHhmc19pbWFwKG1wLCB0cCwgaXAtPmlfaW5vLCAmaXAtPmlfaW1hcCwgaWdldF9mbGFncyk7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JfQorCUFTU0VSVChibm8gPT0gMCB8fCBibm8gPT0gaXAtPmlfaW1hcC5pbV9ibGtubyk7CiAKIAkvKgotCSAqIEluaXRpYWxpemUgaW5vZGUncyB0cmFjZSBidWZmZXJzLgotCSAqIERvIHRoaXMgYmVmb3JlIHhmc19pZm9ybWF0IGluIGNhc2UgaXQgYWRkcyBlbnRyaWVzLgorCSAqIEdldCBwb2ludGVycyB0byB0aGUgb24tZGlzayBpbm9kZSBhbmQgdGhlIGJ1ZmZlciBjb250YWluaW5nIGl0LgogCSAqLwotI2lmZGVmCVhGU19JTk9ERV9UUkFDRQotCWlwLT5pX3RyYWNlID0ga3RyYWNlX2FsbG9jKElOT0RFX1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCi0jaWZkZWYgWEZTX0JNQVBfVFJBQ0UKLQlpcC0+aV94dHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQVBfS1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCi0jaWZkZWYgWEZTX0JNQlRfVFJBQ0UKLQlpcC0+aV9idHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQlRfS1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCi0jaWZkZWYgWEZTX1JXX1RSQUNFCi0JaXAtPmlfcnd0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfUldfS1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCi0jaWZkZWYgWEZTX0lMT0NLX1RSQUNFCi0JaXAtPmlfbG9ja190cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfSUxPQ0tfS1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCi0jaWZkZWYgWEZTX0RJUjJfVFJBQ0UKLQlpcC0+aV9kaXJfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0RJUjJfS1RSQUNFX1NJWkUsIEtNX05PRlMpOwotI2VuZGlmCisJZXJyb3IgPSB4ZnNfaW1hcF90b19icChtcCwgdHAsICZpcC0+aV9pbWFwLCAmYnAsCisJCQkgICAgICAgWEZTX0JVRl9MT0NLLCBpZ2V0X2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGlwLT5pX2ltYXAuaW1fYm9mZnNldCk7CiAKIAkvKgogCSAqIElmIHdlIGdvdCBzb21ldGhpbmcgdGhhdCBpc24ndCBhbiBpbm9kZSBpdCBtZWFucyBzb21lb25lCiAJICogKG5mcyBvciBkbWkpIGhhcyBhIHN0YWxlIGhhbmRsZS4KIAkgKi8KLQlpZiAoYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDKSB7Ci0JCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7Ci0JCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwlpZiAoYmUxNl90b19jcHUoZGlwLT5kaV9tYWdpYykgIT0gWEZTX0RJTk9ERV9NQUdJQykgewogI2lmZGVmIERFQlVHCiAJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19pcmVhZDogIgotCQkJCSJkaXAtPmRpX2NvcmUuZGlfbWFnaWMgKDB4JXgpICE9ICIKKwkJCQkiZGlwLT5kaV9tYWdpYyAoMHgleCkgIT0gIgogCQkJCSJYRlNfRElOT0RFX01BR0lDICgweCV4KSIsCi0JCQkJYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSwKKwkJCQliZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSwKIAkJCQlYRlNfRElOT0RFX01BR0lDKTsKICNlbmRpZiAvKiBERUJVRyAqLwotCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gb3V0X2JyZWxzZTsKIAl9CiAKIAkvKgpAQCAtODc3LDI0ICs4MTMsMjIgQEAKIAkgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KIAkgKiBPdGhlcndpc2UsIGp1c3QgZ2V0IHRoZSB0cnVseSBwZXJtYW5lbnQgaW5mb3JtYXRpb24uCiAJICovCi0JaWYgKGRpcC0+ZGlfY29yZS5kaV9tb2RlKSB7Ci0JCXhmc19kaW5vZGVfZnJvbV9kaXNrKCZpcC0+aV9kLCAmZGlwLT5kaV9jb3JlKTsKKwlpZiAoZGlwLT5kaV9tb2RlKSB7CisJCXhmc19kaW5vZGVfZnJvbV9kaXNrKCZpcC0+aV9kLCBkaXApOwogCQllcnJvciA9IHhmc19pZm9ybWF0KGlwLCBkaXApOwogCQlpZiAoZXJyb3IpICB7Ci0JCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOwotCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwogI2lmZGVmIERFQlVHCiAJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfaXJlYWQ6ICIKIAkJCQkJInhmc19pZm9ybWF0KCkgcmV0dXJuZWQgZXJyb3IgJWQiLAogCQkJCQllcnJvcik7CiAjZW5kaWYgLyogREVCVUcgKi8KLQkJCXJldHVybiBlcnJvcjsKKwkJCWdvdG8gb3V0X2JyZWxzZTsKIAkJfQogCX0gZWxzZSB7Ci0JCWlwLT5pX2QuZGlfbWFnaWMgPSBiZTE2X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfbWFnaWMpOwotCQlpcC0+aV9kLmRpX3ZlcnNpb24gPSBkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbjsKLQkJaXAtPmlfZC5kaV9nZW4gPSBiZTMyX3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfZ2VuKTsKLQkJaXAtPmlfZC5kaV9mbHVzaGl0ZXIgPSBiZTE2X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfZmx1c2hpdGVyKTsKKwkJaXAtPmlfZC5kaV9tYWdpYyA9IGJlMTZfdG9fY3B1KGRpcC0+ZGlfbWFnaWMpOworCQlpcC0+aV9kLmRpX3ZlcnNpb24gPSBkaXAtPmRpX3ZlcnNpb247CisJCWlwLT5pX2QuZGlfZ2VuID0gYmUzMl90b19jcHUoZGlwLT5kaV9nZW4pOworCQlpcC0+aV9kLmRpX2ZsdXNoaXRlciA9IGJlMTZfdG9fY3B1KGRpcC0+ZGlfZmx1c2hpdGVyKTsKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRvIHB1bGwgaW4gdGhlIG1vZGUgaGVyZSBhcyB3ZWxsIGluCiAJCSAqIGNhc2UgdGhlIGlub2RlIGlzIHJlbGVhc2VkIHdpdGhvdXQgYmVpbmcgdXNlZC4KQEAgLTkxMSw4ICs4NDUsNiBAQAogCQkJWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJmlwLT5pX3JlY2xhaW0pOwotCiAJLyoKIAkgKiBUaGUgaW5vZGUgZm9ybWF0IGNoYW5nZWQgd2hlbiB3ZSBtb3ZlZCB0aGUgbGluayBjb3VudCBhbmQKIAkgKiBtYWRlIGl0IDMyIGJpdHMgbG9uZy4gIElmIHRoaXMgaXMgYW4gb2xkIGZvcm1hdCBpbm9kZSwKQEAgLTkyNCw3ICs4NTYsNyBAQAogCSAqIHRoZSBuZXcgZm9ybWF0LiBXZSBkb24ndCBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgd2UKIAkgKiBjYW4gZGlzdGluZ3Vpc2ggdGhpcyBmcm9tIGEgcmVhbCBuZXcgZm9ybWF0IGlub2RlLgogCSAqLwotCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IDEpIHsKIAkJaXAtPmlfZC5kaV9ubGluayA9IGlwLT5pX2QuZGlfb25saW5rOwogCQlpcC0+aV9kLmRpX29ubGluayA9IDA7CiAJCWlwLT5pX2QuZGlfcHJvamlkID0gMDsKQEAgLTkzOCw3ICs4NzAsNyBAQAogCSAqIGFyb3VuZCBmb3IgYSB3aGlsZS4gIFRoaXMgaGVscHMgdG8ga2VlcCByZWNlbnRseSBhY2Nlc3NlZAogCSAqIG1ldGEtZGF0YSBpbi1jb3JlIGxvbmdlci4KIAkgKi8KLQkgWEZTX0JVRl9TRVRfUkVGKGJwLCBYRlNfSU5PX1JFRik7CisJWEZTX0JVRl9TRVRfUkVGKGJwLCBYRlNfSU5PX1JFRik7CiAKIAkvKgogCSAqIFVzZSB4ZnNfdHJhbnNfYnJlbHNlKCkgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCkBAIC05NTMsOSArODg1LDkgQEAKIAkgKiB0byB3b3JyeSBhYm91dCB0aGUgaW5vZGUgYmVpbmcgY2hhbmdlZCBqdXN0IGJlY2F1c2Ugd2UgcmVsZWFzZWQKIAkgKiB0aGUgYnVmZmVyLgogCSAqLworIG91dF9icmVsc2U6CiAJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOwotCSppcHAgPSBpcDsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0xMDQ5LDYgKzk4MSw3IEBACiAJdWludAkJZmxhZ3M7CiAJaW50CQllcnJvcjsKIAl0aW1lc3BlY190CXR2OworCWludAkJZmlsZXN0cmVhbXMgPSAwOwogCiAJLyoKIAkgKiBDYWxsIHRoZSBzcGFjZSBtYW5hZ2VtZW50IGNvZGUgdG8gcGljawpAQCAtMTA1Niw5ICs5ODksOCBAQAogCSAqLwogCWVycm9yID0geGZzX2RpYWxsb2ModHAsIHBpcCA/IHBpcC0+aV9pbm8gOiAwLCBtb2RlLCBva2FsbG9jLAogCQkJICAgIGlhbGxvY19jb250ZXh0LCBjYWxsX2FnYWluLCAmaW5vKTsKLQlpZiAoZXJyb3IgIT0gMCkgeworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCX0KIAlpZiAoKmNhbGxfYWdhaW4gfHwgaW5vID09IE5VTExGU0lOTykgewogCQkqaXBwID0gTlVMTDsKIAkJcmV0dXJuIDA7CkBAIC0xMDcyLDkgKzEwMDQsOCBAQAogCSAqLwogCWVycm9yID0geGZzX3RyYW5zX2lnZXQodHAtPnRfbW91bnRwLCB0cCwgaW5vLAogCQkJCVhGU19JR0VUX0NSRUFURSwgWEZTX0lMT0NLX0VYQ0wsICZpcCk7Ci0JaWYgKGVycm9yICE9IDApIHsKKwlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKLQl9CiAJQVNTRVJUKGlwICE9IE5VTEwpOwogCiAJaXAtPmlfZC5kaV9tb2RlID0gKF9fdWludDE2X3QpbW9kZTsKQEAgLTEwOTMsOCArMTAyNCw4IEBACiAJICogaGVyZSByYXRoZXIgdGhhbiBoZXJlIGFuZCBpbiB0aGUgZmx1c2gvbG9nZ2luZyBjb2RlLgogCSAqLwogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNubGluaygmdHAtPnRfbW91bnRwLT5tX3NiKSAmJgotCSAgICBpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKLQkJaXAtPmlfZC5kaV92ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7CisJICAgIGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAxKSB7CisJCWlwLT5pX2QuZGlfdmVyc2lvbiA9IDI7CiAJCS8qCiAJCSAqIFdlJ3ZlIGFscmVhZHkgemVyb2VkIHRoZSBvbGQgbGluayBjb3VudCwgdGhlIHByb2ppZCBmaWVsZCwKIAkJICogYW5kIHRoZSBwYWQgZmllbGQuCkBAIC0xMTA0LDcgKzEwMzUsNyBAQAogCS8qCiAJICogUHJvamVjdCBpZHMgd29uJ3QgYmUgc3RvcmVkIG9uIGRpc2sgaWYgd2UgYXJlIHVzaW5nIGEgdmVyc2lvbiAxIGlub2RlLgogCSAqLwotCWlmICgocHJpZCAhPSAwKSAmJiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSkKKwlpZiAoKHByaWQgIT0gMCkgJiYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAxKSkKIAkJeGZzX2J1bXBfaW5vX3ZlcnMyKHRwLCBpcCk7CiAKIAlpZiAocGlwICYmIFhGU19JTkhFUklUX0dJRChwaXApKSB7CkBAIC0xMTU1LDEzICsxMDg2LDEyIEBACiAJCWZsYWdzIHw9IFhGU19JTE9HX0RFVjsKIAkJYnJlYWs7CiAJY2FzZSBTX0lGUkVHOgotCQlpZiAocGlwICYmIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKHBpcCkpIHsKLQkJCWVycm9yID0geGZzX2ZpbGVzdHJlYW1fYXNzb2NpYXRlKHBpcCwgaXApOwotCQkJaWYgKGVycm9yIDwgMCkKLQkJCQlyZXR1cm4gLWVycm9yOwotCQkJaWYgKCFlcnJvcikKLQkJCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lGSUxFU1RSRUFNKTsKLQkJfQorCQkvKgorCQkgKiB3ZSBjYW4ndCBzZXQgdXAgZmlsZXN0cmVhbXMgdW50aWwgYWZ0ZXIgdGhlIFZGUyBpbm9kZQorCQkgKiBpcyBzZXQgdXAgcHJvcGVybHkuCisJCSAqLworCQlpZiAocGlwICYmIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKHBpcCkpCisJCQlmaWxlc3RyZWFtcyA9IDE7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU19JRkRJUjoKIAkJaWYgKHBpcCAmJiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0FOWSkpIHsKQEAgLTEyMjcsNiArMTE1NywxNSBAQAogCS8qIG5vdyB0aGF0IHdlIGhhdmUgYW4gaV9tb2RlIHdlIGNhbiBzZXR1cCBpbm9kZSBvcHMgYW5kIHVubG9jayAqLwogCXhmc19zZXR1cF9pbm9kZShpcCk7CiAKKwkvKiBub3cgd2UgaGF2ZSBzZXQgdXAgdGhlIHZmcyBpbm9kZSB3ZSBjYW4gYXNzb2NpYXRlIHRoZSBmaWxlc3RyZWFtICovCisJaWYgKGZpbGVzdHJlYW1zKSB7CisJCWVycm9yID0geGZzX2ZpbGVzdHJlYW1fYXNzb2NpYXRlKHBpcCwgaXApOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIC1lcnJvcjsKKwkJaWYgKCFlcnJvcikKKwkJCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSUZJTEVTVFJFQU0pOworCX0KKwogCSppcHAgPSBpcDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzODMsOCArMTMyMiw4IEBACiAgKiBkaXJlY3QgSS9PIHdpdGggdGhlIHRydW5jYXRlIG9wZXJhdGlvbi4gIEFsc28sIGJlY2F1c2Ugd2UgaG9sZAogICogdGhlIElPTE9DSyBpbiBleGNsdXNpdmUgbW9kZSwgd2UgcHJldmVudCBuZXcgZGlyZWN0IEkvT3MgZnJvbSBiZWluZwogICogc3RhcnRlZCB1bnRpbCB0aGUgdHJ1bmNhdGUgY29tcGxldGVzIGFuZCBkcm9wcyB0aGUgbG9jay4gRXNzZW50aWFsbHksCi0gKiB0aGUgdm5faW93YWl0KCkgY2FsbCBmb3JtcyBhbiBJL08gYmFycmllciB0aGF0IHByb3ZpZGVzIHN0cmljdCBvcmRlcmluZwotICogYmV0d2VlbiBkaXJlY3QgSS9PcyBhbmQgdGhlIHRydW5jYXRlIG9wZXJhdGlvbi4KKyAqIHRoZSB4ZnNfaW9lbmRfd2FpdCgpIGNhbGwgZm9ybXMgYW4gSS9PIGJhcnJpZXIgdGhhdCBwcm92aWRlcyBzdHJpY3QKKyAqIG9yZGVyaW5nIGJldHdlZW4gZGlyZWN0IEkvT3MgYW5kIHRoZSB0cnVuY2F0ZSBvcGVyYXRpb24uCiAgKgogICogVGhlIGZsYWdzIHBhcmFtZXRlciBjYW4gaGF2ZSBlaXRoZXIgdGhlIHZhbHVlIFhGU19JVFJVTkNfREVGSU5JVEUKICAqIG9yIFhGU19JVFJVTkNfTUFZQkUuICBUaGUgWEZTX0lUUlVOQ19NQVlCRSB2YWx1ZSBzaG91bGQgYmUgdXNlZApAQCAtMTQxNSw3ICsxMzU0LDcgQEAKIAogCS8qIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGFueSBwZW5kaW5nIERJT3MgKi8KIAlpZiAobmV3X3NpemUgPT0gMCB8fCBuZXdfc2l6ZSA8IGlwLT5pX3NpemUpCi0JCXZuX2lvd2FpdChpcCk7CisJCXhmc19pb2VuZF93YWl0KGlwKTsKIAogCS8qCiAJICogQ2FsbCB0b3NzX3BhZ2VzIG9yIGZsdXNoaW52YWxfcGFnZXMgdG8gZ2V0IHJpZCBvZiBwYWdlcwpAQCAtMTcyNiw4ICsxNjY1LDE0IEBACiAJCXhmc190cmFuc19pam9pbihudHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CiAJCXhmc190cmFuc19paG9sZChudHAsIGlwKTsKIAotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZShudHAsIDAsCisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJLyoKKwkJICogdHJhbnNhY3Rpb24gY29tbWl0IHdvcmtlZCBvayBzbyB3ZSBjYW4gZHJvcCB0aGUgZXh0cmEgdGlja2V0CisJCSAqIHJlZmVyZW5jZSB0aGF0IHdlIGdhaW5lZCBpbiB4ZnNfdHJhbnNfZHVwKCkKKwkJICovCisJCXhmc19sb2dfdGlja2V0X3B1dChudHAtPnRfdGlja2V0KTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZShudHAsIDAsCiAJCQkJCVhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksIDAsCiAJCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCiAJCQkJCVhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKTsKQEAgLTE3ODEsMTMgKzE3MjYsMTAgQEAKIAl4ZnNfZGlub2RlX3QJKmRpcDsKIAl4ZnNfYnVmX3QJKmFnaWJwOwogCXhmc19idWZfdAkqaWJwOwotCXhmc19hZ251bWJlcl90CWFnbm87Ci0JeGZzX2RhZGRyX3QJYWdkYWRkcjsKIAl4ZnNfYWdpbm9fdAlhZ2lubzsKIAlzaG9ydAkJYnVja2V0X2luZGV4OwogCWludAkJb2Zmc2V0OwogCWludAkJZXJyb3I7Ci0JaW50CQlhZ2lfb2s7CiAKIAlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA9PSAwKTsKIAlBU1NFUlQoaXAtPmlfZC5kaV9tb2RlICE9IDApOwpAQCAtMTc5NSwzMSArMTczNywxNSBAQAogCiAJbXAgPSB0cC0+dF9tb3VudHA7CiAKLQlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pOwotCWFnZGFkZHIgPSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKTsKLQogCS8qCiAJICogR2V0IHRoZSBhZ2kgYnVmZmVyIGZpcnN0LiAgSXQgZW5zdXJlcyBsb2NrIG9yZGVyaW5nCiAJICogb24gdGhlIGxpc3QuCiAJICovCi0JZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBhZ2RhZGRyLAotCQkJCSAgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYWdpYnApOworCWVycm9yID0geGZzX3JlYWRfYWdpKG1wLCB0cCwgWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pLCAmYWdpYnApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBhZ2kgYmxvY2suCi0JICovCiAJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOwotCWFnaV9vayA9Ci0JCWJlMzJfdG9fY3B1KGFnaS0+YWdpX21hZ2ljbnVtKSA9PSBYRlNfQUdJX01BR0lDICYmCi0JCVhGU19BR0lfR09PRF9WRVJTSU9OKGJlMzJfdG9fY3B1KGFnaS0+YWdpX3ZlcnNpb25udW0pKTsKLQlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnaV9vaywgbXAsIFhGU19FUlJUQUdfSVVOTElOSywKLQkJCVhGU19SQU5ET01fSVVOTElOSykpKSB7Ci0JCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaXVubGluayIsIFhGU19FUlJMRVZFTF9MT1csIG1wLCBhZ2kpOwotCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2licCk7Ci0JCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKLQl9CisKIAkvKgogCSAqIEdldCB0aGUgaW5kZXggaW50byB0aGUgYWdpIGhhc2ggdGFibGUgZm9yIHRoZQogCSAqIGxpc3QgdGhpcyBpbm9kZSB3aWxsIGdvIG9uLgpAQCAtMTgzNywxNCArMTc2MywxNCBAQAogCQkgKiBIZXJlIHdlIHB1dCB0aGUgaGVhZCBwb2ludGVyIGludG8gb3VyIG5leHQgcG9pbnRlciwKIAkJICogYW5kIHRoZW4gd2UgZmFsbCB0aHJvdWdoIHRvIHBvaW50IHRoZSBoZWFkIGF0IHVzLgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCwgMCwgWEZTX0JVRl9MT0NLKTsKKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgWEZTX0JVRl9MT0NLKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCiAJCUFTU0VSVChiZTMyX3RvX2NwdShkaXAtPmRpX25leHRfdW5saW5rZWQpID09IE5VTExBR0lOTyk7CiAJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuIGZsaXAgdHdpY2UgKi8KIAkJZGlwLT5kaV9uZXh0X3VubGlua2VkID0gYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XTsKLQkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCW9mZnNldCA9IGlwLT5pX2ltYXAuaW1fYm9mZnNldCArCiAJCQlvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX25leHRfdW5saW5rZWQpOwogCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOwogCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgaWJwLCBvZmZzZXQsCkBAIC0xODc5LDcgKzE4MDUsNiBAQAogCXhmc19idWZfdAkqYWdpYnA7CiAJeGZzX2J1Zl90CSppYnA7CiAJeGZzX2FnbnVtYmVyX3QJYWdubzsKLQl4ZnNfZGFkZHJfdAlhZ2RhZGRyOwogCXhmc19hZ2lub190CWFnaW5vOwogCXhmc19hZ2lub190CW5leHRfYWdpbm87CiAJeGZzX2J1Zl90CSpsYXN0X2licDsKQEAgLTE4ODcsNDUgKzE4MTIsMjAgQEAKIAlzaG9ydAkJYnVja2V0X2luZGV4OwogCWludAkJb2Zmc2V0LCBsYXN0X29mZnNldCA9IDA7CiAJaW50CQllcnJvcjsKLQlpbnQJCWFnaV9vazsKIAotCS8qCi0JICogRmlyc3QgcHVsbCB0aGUgb24tZGlzayBpbm9kZSBmcm9tIHRoZSBBR0kgdW5saW5rZWQgbGlzdC4KLQkgKi8KIAltcCA9IHRwLT50X21vdW50cDsKLQogCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlwLT5pX2lubyk7Ci0JYWdkYWRkciA9IFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpOwogCiAJLyoKIAkgKiBHZXQgdGhlIGFnaSBidWZmZXIgZmlyc3QuICBJdCBlbnN1cmVzIGxvY2sgb3JkZXJpbmcKIAkgKiBvbiB0aGUgbGlzdC4KIAkgKi8KLQllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGFnZGFkZHIsCi0JCQkJICAgWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZhZ2licCk7Ci0JaWYgKGVycm9yKSB7Ci0JCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc190cmFuc19yZWFkX2J1ZigpICByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAotCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJZXJyb3IgPSB4ZnNfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdpYnApOworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCX0KLQkvKgotCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGFnaSBibG9jay4KLQkgKi8KKwogCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKLQlhZ2lfb2sgPQotCQliZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkgPT0gWEZTX0FHSV9NQUdJQyAmJgotCQlYRlNfQUdJX0dPT0RfVkVSU0lPTihiZTMyX3RvX2NwdShhZ2ktPmFnaV92ZXJzaW9ubnVtKSk7Ci0JaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFhZ2lfb2ssIG1wLCBYRlNfRVJSVEFHX0lVTkxJTktfUkVNT1ZFLAotCQkJWEZTX1JBTkRPTV9JVU5MSU5LX1JFTU9WRSkpKSB7Ci0JCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaXVubGlua19yZW1vdmUiLCBYRlNfRVJSTEVWRUxfTE9XLAotCQkJCSAgICAgbXAsIGFnaSk7Ci0JCXhmc190cmFuc19icmVsc2UodHAsIGFnaWJwKTsKLQkJY21uX2VycihDRV9XQVJOLAotCQkJInhmc19pdW5saW5rX3JlbW92ZTogWEZTX1RFU1RfRVJST1IoKSAgcmV0dXJuZWQgYW4gZXJyb3Igb24gJXMuICBSZXR1cm5pbmcgRUZTQ09SUlVQVEVELiIsCi0JCQkgbXAtPm1fZnNuYW1lKTsKLQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwotCX0KKwogCS8qCiAJICogR2V0IHRoZSBpbmRleCBpbnRvIHRoZSBhZ2kgaGFzaCB0YWJsZSBmb3IgdGhlCiAJICogbGlzdCB0aGlzIGlub2RlIHdpbGwgZ28gb24uCkBAIC0xOTQ1LDcgKzE4NDUsNyBAQAogCQkgKiBvZiBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8KIAkJICogY2hhbmdlIGl0LgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCwgMCwgWEZTX0JVRl9MT0NLKTsKKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgWEZTX0JVRl9MT0NLKTsKIAkJaWYgKGVycm9yKSB7CiAJCQljbW5fZXJyKENFX1dBUk4sCiAJCQkJInhmc19pdW5saW5rX3JlbW92ZTogeGZzX2l0b2JwKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCkBAIC0xOTU2LDcgKzE4NTYsNyBAQAogCQlBU1NFUlQobmV4dF9hZ2lubyAhPSAwKTsKIAkJaWYgKG5leHRfYWdpbm8gIT0gTlVMTEFHSU5PKSB7CiAJCQlkaXAtPmRpX25leHRfdW5saW5rZWQgPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pOwotCQkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCQlvZmZzZXQgPSBpcC0+aV9pbWFwLmltX2JvZmZzZXQgKwogCQkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CiAJCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOwogCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGlicCwgb2Zmc2V0LApAQCAtMTk5Miw3ICsxODkyLDcgQEAKIAkJCX0KIAkJCW5leHRfaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgbmV4dF9hZ2lubyk7CiAJCQllcnJvciA9IHhmc19pbm90b2JwKG1wLCB0cCwgbmV4dF9pbm8sICZsYXN0X2RpcCwKLQkJCQkJICAgICZsYXN0X2licCwgJmxhc3Rfb2Zmc2V0KTsKKwkJCQkJICAgICZsYXN0X2licCwgJmxhc3Rfb2Zmc2V0LCAwKTsKIAkJCWlmIChlcnJvcikgewogCQkJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc19pbm90b2JwKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCkBAIC0yMDA3LDcgKzE5MDcsNyBAQAogCQkgKiBOb3cgbGFzdF9pYnAgcG9pbnRzIHRvIHRoZSBidWZmZXIgcHJldmlvdXMgdG8gdXMgb24KIAkJICogdGhlIHVubGlua2VkIGxpc3QuICBQdWxsIHVzIGZyb20gdGhlIGxpc3QuCiAJCSAqLwotCQllcnJvciA9IHhmc19pdG9icChtcCwgdHAsIGlwLCAmZGlwLCAmaWJwLCAwLCAwLCBYRlNfQlVGX0xPQ0spOworCQllcnJvciA9IHhmc19pdG9icChtcCwgdHAsIGlwLCAmZGlwLCAmaWJwLCBYRlNfQlVGX0xPQ0spOwogCQlpZiAoZXJyb3IpIHsKIAkJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCQkieGZzX2l1bmxpbmtfcmVtb3ZlOiB4ZnNfaXRvYnAoKSAgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKQEAgLTIwMTksNyArMTkxOSw3IEBACiAJCUFTU0VSVChuZXh0X2FnaW5vICE9IGFnaW5vKTsKIAkJaWYgKG5leHRfYWdpbm8gIT0gTlVMTEFHSU5PKSB7CiAJCQlkaXAtPmRpX25leHRfdW5saW5rZWQgPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pOwotCQkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCQlvZmZzZXQgPSBpcC0+aV9pbWFwLmltX2JvZmZzZXQgKwogCQkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CiAJCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOwogCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGlicCwgb2Zmc2V0LApAQCAtMjE2MCw5ICsyMDYwLDkgQEAKIAkJCQlpaXAgPSAoeGZzX2lub2RlX2xvZ19pdGVtX3QgKilsaXA7CiAJCQkJQVNTRVJUKGlpcC0+aWxpX2xvZ2dlZCA9PSAxKTsKIAkJCQlsaXAtPmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKSB4ZnNfaXN0YWxlX2RvbmU7Ci0JCQkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JCQkJaWlwLT5pbGlfZmx1c2hfbHNuID0gaWlwLT5pbGlfaXRlbS5saV9sc247Ci0JCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJCQl4ZnNfdHJhbnNfYWlsX2NvcHlfbHNuKG1wLT5tX2FpbCwKKwkJCQkJCQkmaWlwLT5pbGlfZmx1c2hfbHNuLAorCQkJCQkJCSZpaXAtPmlsaV9pdGVtLmxpX2xzbik7CiAJCQkJeGZzX2lmbGFnc19zZXQoaWlwLT5pbGlfaW5vZGUsIFhGU19JU1RBTEUpOwogCQkJCXByZV9mbHVzaGVkKys7CiAJCQl9CkBAIC0yMTgzLDkgKzIwODMsOCBAQAogCQkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkczsKIAkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzID0gMDsKIAkJCWlpcC0+aWxpX2xvZ2dlZCA9IDE7Ci0JCQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQkJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOwotCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJCXhmc190cmFuc19haWxfY29weV9sc24obXAtPm1fYWlsLCAmaWlwLT5pbGlfZmx1c2hfbHNuLAorCQkJCQkJJmlpcC0+aWxpX2l0ZW0ubGlfbHNuKTsKIAogCQkJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLAogCQkJCSh2b2lkKCopKHhmc19idWZfdCoseGZzX2xvZ19pdGVtX3QqKSkKQEAgLTIyNjMsNyArMjE2Miw3IEBACiAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAKLQllcnJvciA9IHhmc19pdG9icChpcC0+aV9tb3VudCwgdHAsIGlwLCAmZGlwLCAmaWJwLCAwLCAwLCBYRlNfQlVGX0xPQ0spOworCWVycm9yID0geGZzX2l0b2JwKGlwLT5pX21vdW50LCB0cCwgaXAsICZkaXAsICZpYnAsIFhGU19CVUZfTE9DSyk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTIyNzksNyArMjE3OCw3IEBACiAJKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdGhhdCB3b3VsZCByZXF1aXJlIGEgcHJvcGVyIGZpeAogCSogaW4gdGhlIGZ1dHVyZS4KIAkqLwotCWRpcC0+ZGlfY29yZS5kaV9tb2RlID0gMDsKKwlkaXAtPmRpX21vZGUgPSAwOwogCiAJaWYgKGRlbGV0ZSkgewogCQl4ZnNfaWZyZWVfY2x1c3RlcihpcCwgdHAsIGZpcnN0X2lubyk7CkBAIC0yMzEyLDkgKzIyMTEsMTAgQEAKIAlpbnQJCQlyZWNfZGlmZiwKIAlpbnQJCQl3aGljaGZvcmspCiB7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKIAlpbnQJCQljdXJfbWF4OwogCXhmc19pZm9ya190CQkqaWZwOwotCXhmc19ibWJ0X2Jsb2NrX3QJKm5ld19icm9vdDsKKwlzdHJ1Y3QgeGZzX2J0cmVlX2Jsb2NrCSpuZXdfYnJvb3Q7CiAJaW50CQkJbmV3X21heDsKIAlzaXplX3QJCQluZXdfc2l6ZTsKIAljaGFyCQkJKm5wOwpAQCAtMjMzNSw4ICsyMjM1LDcgQEAKIAkJICovCiAJCWlmIChpZnAtPmlmX2Jyb290X2J5dGVzID09IDApIHsKIAkJCW5ld19zaXplID0gKHNpemVfdClYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKHJlY19kaWZmKTsKLQkJCWlmcC0+aWZfYnJvb3QgPSAoeGZzX2JtYnRfYmxvY2tfdCopa21lbV9hbGxvYyhuZXdfc2l6ZSwKLQkJCQkJCQkJICAgICBLTV9TTEVFUCk7CisJCQlpZnAtPmlmX2Jyb290ID0ga21lbV9hbGxvYyhuZXdfc2l6ZSwgS01fU0xFRVApOwogCQkJaWZwLT5pZl9icm9vdF9ieXRlcyA9IChpbnQpbmV3X3NpemU7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIzNDcsMTggKzIyNDYsMTYgQEAKIAkJICogbG9jYXRpb24uICBUaGUgcmVjb3JkcyBkb24ndCBjaGFuZ2UgbG9jYXRpb24gYmVjYXVzZQogCQkgKiB0aGV5IGFyZSBrZXB0IGJ1dHRlZCB1cCBhZ2FpbnN0IHRoZSBidHJlZSBibG9jayBoZWFkZXIuCiAJCSAqLwotCQljdXJfbWF4ID0gWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkJY3VyX21heCA9IHhmc19ibWJ0X21heHJlY3MobXAsIGlmcC0+aWZfYnJvb3RfYnl0ZXMsIDApOwogCQluZXdfbWF4ID0gY3VyX21heCArIHJlY19kaWZmOwogCQluZXdfc2l6ZSA9IChzaXplX3QpWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhuZXdfbWF4KTsKLQkJaWZwLT5pZl9icm9vdCA9ICh4ZnNfYm1idF9ibG9ja190ICopCi0JCSAga21lbV9yZWFsbG9jKGlmcC0+aWZfYnJvb3QsCi0JCQkJbmV3X3NpemUsCisJCWlmcC0+aWZfYnJvb3QgPSBrbWVtX3JlYWxsb2MoaWZwLT5pZl9icm9vdCwgbmV3X3NpemUsCiAJCQkJKHNpemVfdClYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKGN1cl9tYXgpLCAvKiBvbGQgc2l6ZSAqLwogCQkJCUtNX1NMRUVQKTsKLQkJb3AgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1BUUl9BRERSKGlmcC0+aWZfYnJvb3QsIDEsCi0JCQkJCQkgICAgICBpZnAtPmlmX2Jyb290X2J5dGVzKTsKLQkJbnAgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1BUUl9BRERSKGlmcC0+aWZfYnJvb3QsIDEsCi0JCQkJCQkgICAgICAoaW50KW5ld19zaXplKTsKKwkJb3AgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1BUUl9BRERSKG1wLCBpZnAtPmlmX2Jyb290LCAxLAorCQkJCQkJICAgICBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkJbnAgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1BUUl9BRERSKG1wLCBpZnAtPmlmX2Jyb290LCAxLAorCQkJCQkJICAgICAoaW50KW5ld19zaXplKTsKIAkJaWZwLT5pZl9icm9vdF9ieXRlcyA9IChpbnQpbmV3X3NpemU7CiAJCUFTU0VSVChpZnAtPmlmX2Jyb290X2J5dGVzIDw9CiAJCQlYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSArIFhGU19CUk9PVF9TSVpFX0FESik7CkBAIC0yMzcyLDcgKzIyNjksNyBAQAogCSAqIHJlY29yZHMsIGp1c3QgZ2V0IHJpZCBvZiB0aGUgcm9vdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyBiaXQuCiAJICovCiAJQVNTRVJUKChpZnAtPmlmX2Jyb290ICE9IE5VTEwpICYmIChpZnAtPmlmX2Jyb290X2J5dGVzID4gMCkpOwotCWN1cl9tYXggPSBYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCWN1cl9tYXggPSB4ZnNfYm1idF9tYXhyZWNzKG1wLCBpZnAtPmlmX2Jyb290X2J5dGVzLCAwKTsKIAluZXdfbWF4ID0gY3VyX21heCArIHJlY19kaWZmOwogCUFTU0VSVChuZXdfbWF4ID49IDApOwogCWlmIChuZXdfbWF4ID4gMCkKQEAgLTIzODAsMTEgKzIyNzcsMTEgQEAKIAllbHNlCiAJCW5ld19zaXplID0gMDsKIAlpZiAobmV3X3NpemUgPiAwKSB7Ci0JCW5ld19icm9vdCA9ICh4ZnNfYm1idF9ibG9ja190ICopa21lbV9hbGxvYyhuZXdfc2l6ZSwgS01fU0xFRVApOworCQluZXdfYnJvb3QgPSBrbWVtX2FsbG9jKG5ld19zaXplLCBLTV9TTEVFUCk7CiAJCS8qCiAJCSAqIEZpcnN0IGNvcHkgb3ZlciB0aGUgYnRyZWUgYmxvY2sgaGVhZGVyLgogCQkgKi8KLQkJbWVtY3B5KG5ld19icm9vdCwgaWZwLT5pZl9icm9vdCwgc2l6ZW9mKHhmc19ibWJ0X2Jsb2NrX3QpKTsKKwkJbWVtY3B5KG5ld19icm9vdCwgaWZwLT5pZl9icm9vdCwgWEZTX0JUUkVFX0xCTE9DS19MRU4pOwogCX0gZWxzZSB7CiAJCW5ld19icm9vdCA9IE5VTEw7CiAJCWlmcC0+aWZfZmxhZ3MgJj0gflhGU19JRkJST09UOwpAQCAtMjM5NywxOCArMjI5NCwxNiBAQAogCQkvKgogCQkgKiBGaXJzdCBjb3B5IHRoZSByZWNvcmRzLgogCQkgKi8KLQkJb3AgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1JFQ19BRERSKGlmcC0+aWZfYnJvb3QsIDEsCi0JCQkJCQkgICAgIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwotCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIobmV3X2Jyb290LCAxLAotCQkJCQkJICAgICAoaW50KW5ld19zaXplKTsKKwkJb3AgPSAoY2hhciAqKVhGU19CTUJUX1JFQ19BRERSKG1wLCBpZnAtPmlmX2Jyb290LCAxKTsKKwkJbnAgPSAoY2hhciAqKVhGU19CTUJUX1JFQ19BRERSKG1wLCBuZXdfYnJvb3QsIDEpOwogCQltZW1jcHkobnAsIG9wLCBuZXdfbWF4ICogKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CiAKIAkJLyoKIAkJICogVGhlbiBjb3B5IHRoZSBwb2ludGVycy4KIAkJICovCi0JCW9wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihpZnAtPmlmX2Jyb290LCAxLAorCQlvcCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIGlmcC0+aWZfYnJvb3QsIDEsCiAJCQkJCQkgICAgIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOwotCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobmV3X2Jyb290LCAxLAorCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIobXAsIG5ld19icm9vdCwgMSwKIAkJCQkJCSAgICAgKGludCluZXdfc2l6ZSk7CiAJCW1lbWNweShucCwgb3AsIG5ld19tYXggKiAodWludClzaXplb2YoeGZzX2Rmc2Jub190KSk7CiAJfQpAQCAtMjUxMSw2NCArMjQwNiw2IEBACiAJQVNTRVJUKGlmcC0+aWZfYnl0ZXMgPD0gWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykpOwogfQogCi0KLQotCi0vKgotICogTWFwIGlub2RlIHRvIGRpc2sgYmxvY2sgYW5kIG9mZnNldC4KLSAqCi0gKiBtcCAtLSB0aGUgbW91bnQgcG9pbnQgc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBmaWxlIHN5c3RlbQotICogdHAgLS0gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KLSAqIGlubyAtLSB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB0byBiZSBsb2NhdGVkCi0gKiBpbWFwIC0tIHRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkKLSAqCSB0byByZXRyaWV2ZSB0aGUgZ2l2ZW4gaW5vZGUgZnJvbSBkaXNrCi0gKiBmbGFncyAtLSBmbGFncyB0byBwYXNzIHRvIHhmc19kaWxvY2F0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90Ci0gKgkgbG9va3VwcyBpbiB0aGUgaW5vZGUgYnRyZWUgd2VyZSBPSyBvciBub3QKLSAqLwotaW50Ci14ZnNfaW1hcCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX3RyYW5zX3QJKnRwLAotCXhmc19pbm9fdAlpbm8sCi0JeGZzX2ltYXBfdAkqaW1hcCwKLQl1aW50CQlmbGFncykKLXsKLQl4ZnNfZnNibG9ja190CWZzYm5vOwotCWludAkJbGVuOwotCWludAkJb2ZmOwotCWludAkJZXJyb3I7Ci0KLQlmc2JubyA9IGltYXAtPmltX2Jsa25vID8KLQkJWEZTX0RBRERSX1RPX0ZTQihtcCwgaW1hcC0+aW1fYmxrbm8pIDogTlVMTEZTQkxPQ0s7Ci0JZXJyb3IgPSB4ZnNfZGlsb2NhdGUobXAsIHRwLCBpbm8sICZmc2JubywgJmxlbiwgJm9mZiwgZmxhZ3MpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JaW1hcC0+aW1fYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Jubyk7Ci0JaW1hcC0+aW1fbGVuID0gWEZTX0ZTQl9UT19CQihtcCwgbGVuKTsKLQlpbWFwLT5pbV9hZ2Jsa25vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwgZnNibm8pOwotCWltYXAtPmltX2lvZmZzZXQgPSAodXNob3J0KW9mZjsKLQlpbWFwLT5pbV9ib2Zmc2V0ID0gKHVzaG9ydCkob2ZmIDw8IG1wLT5tX3NiLnNiX2lub2RlbG9nKTsKLQotCS8qCi0JICogSWYgdGhlIGlub2RlIG51bWJlciBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzCi0JICogb2YgdGhlIGZpbGUgc3lzdGVtIHRoZW4gcmV0dXJuIE5VTEwgcmF0aGVyIHRoYW4gY2FsbGluZwotCSAqIHJlYWRfYnVmIGFuZCBwYW5pY2luZyB3aGVuIHdlIGdldCBhbiBlcnJvciBmcm9tIHRoZQotCSAqIGRyaXZlci4KLQkgKi8KLQlpZiAoKGltYXAtPmltX2Jsa25vICsgaW1hcC0+aW1fbGVuKSA+Ci0JICAgIFhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpKSB7Ci0JCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19pbWFwOiAiCi0JCQkiKGltYXAtPmltX2Jsa25vICgweCVsbHgpICsgaW1hcC0+aW1fbGVuICgweCVsbHgpKSA+ICIKLQkJCSIgWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfZGJsb2NrcykgKDB4JWxseCkiLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW1hcC0+aW1fYmxrbm8sCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbWFwLT5pbV9sZW4sCi0JCQlYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9kYmxvY2tzKSk7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCiB2b2lkCiB4ZnNfaWRlc3Ryb3lfZm9yaygKIAl4ZnNfaW5vZGVfdAkqaXAsCkBAIC0yNjEzLDcwICsyNDUwLDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGZyZWUgYWxsIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGFuIGlub2RlLgotICogSXQgbXVzdCBmcmVlIHRoZSBpbm9kZSBpdHNlbGYgYW5kIGFueSBidWZmZXJzIGFsbG9jYXRlZCBmb3IKLSAqIGlmX2V4dGVudHMvaWZfZGF0YSBhbmQgaWZfYnJvb3QuICBJdCBtdXN0IGFsc28gZnJlZSB0aGUgbG9jawotICogYXNzb2NpYXRlZCB3aXRoIHRoZSBpbm9kZS4KLSAqLwotdm9pZAoteGZzX2lkZXN0cm95KAotCXhmc19pbm9kZV90CSppcCkKLXsKLQlzd2l0Y2ggKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgewotCWNhc2UgU19JRlJFRzoKLQljYXNlIFNfSUZESVI6Ci0JY2FzZSBTX0lGTE5LOgotCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0RBVEFfRk9SSyk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoaXAtPmlfYWZwKQotCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0FUVFJfRk9SSyk7Ci0JbXJmcmVlKCZpcC0+aV9sb2NrKTsKLQltcmZyZWUoJmlwLT5pX2lvbG9jayk7Ci0KLSNpZmRlZiBYRlNfSU5PREVfVFJBQ0UKLQlrdHJhY2VfZnJlZShpcC0+aV90cmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBYRlNfQk1BUF9UUkFDRQotCWt0cmFjZV9mcmVlKGlwLT5pX3h0cmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBYRlNfQk1CVF9UUkFDRQotCWt0cmFjZV9mcmVlKGlwLT5pX2J0cmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBYRlNfUldfVFJBQ0UKLQlrdHJhY2VfZnJlZShpcC0+aV9yd3RyYWNlKTsKLSNlbmRpZgotI2lmZGVmIFhGU19JTE9DS19UUkFDRQotCWt0cmFjZV9mcmVlKGlwLT5pX2xvY2tfdHJhY2UpOwotI2VuZGlmCi0jaWZkZWYgWEZTX0RJUjJfVFJBQ0UKLQlrdHJhY2VfZnJlZShpcC0+aV9kaXJfdHJhY2UpOwotI2VuZGlmCi0JaWYgKGlwLT5pX2l0ZW1wKSB7Ci0JCS8qCi0JCSAqIE9ubHkgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gdGhlIGZzIHdpbGwgd2Ugc2VlIGFuCi0JCSAqIGlub2RlIHN0aWxsIGluIHRoZSBBSUwuIElmIGl0IGlzIHRoZXJlLCB3ZSBzaG91bGQgcmVtb3ZlCi0JCSAqIGl0IHRvIHByZXZlbnQgYSB1c2UtYWZ0ZXItZnJlZSBmcm9tIG9jY3VycmluZy4KLQkJICovCi0JCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwotCQl4ZnNfbG9nX2l0ZW1fdAkqbGlwID0gJmlwLT5pX2l0ZW1wLT5pbGlfaXRlbTsKLQotCQlBU1NFUlQoKChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgPT0gMCkgfHwKLQkJCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpOwotCQlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKLQkJCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwotCQkJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKQotCQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCBsaXApOwotCQkJZWxzZQotCQkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JCX0KLQkJeGZzX2lub2RlX2l0ZW1fZGVzdHJveShpcCk7Ci0JfQotCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7Ci19Ci0KLQotLyoKICAqIEluY3JlbWVudCB0aGUgcGluIGNvdW50IG9mIHRoZSBnaXZlbiBidWZmZXIuCiAgKiBUaGlzIHZhbHVlIGlzIHByb3RlY3RlZCBieSBpcGlubG9jayBzcGlubG9jayBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgogICovCkBAIC0yODgwLDcgKzI2NTMsNyBAQAogCQkJQVNTRVJUKGlmcC0+aWZfYnJvb3RfYnl0ZXMgPD0KIAkJCSAgICAgICAoWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgKwogCQkJCVhGU19CUk9PVF9TSVpFX0FESikpOwotCQkJeGZzX2JtYnRfdG9fYm1kcihpZnAtPmlmX2Jyb290LCBpZnAtPmlmX2Jyb290X2J5dGVzLAorCQkJeGZzX2JtYnRfdG9fYm1kcihtcCwgaWZwLT5pZl9icm9vdCwgaWZwLT5pZl9icm9vdF9ieXRlcywKIAkJCQkoeGZzX2JtZHJfYmxvY2tfdCAqKWNwLAogCQkJCVhGU19ERk9SS19TSVpFKGRpcCwgbXAsIHdoaWNoZm9yaykpOwogCQl9CkBAIC0yODg5LDE1ICsyNjYyLDE2IEBACiAJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CiAJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RFVikgewogCQkJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQkJCWRpcC0+ZGlfdS5kaV9kZXYgPSBjcHVfdG9fYmUzMihpcC0+aV9kZi5pZl91Mi5pZl9yZGV2KTsKKwkJCXhmc19kaW5vZGVfcHV0X3JkZXYoZGlwLCBpcC0+aV9kZi5pZl91Mi5pZl9yZGV2KTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgWEZTX0RJTk9ERV9GTVRfVVVJRDoKIAkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfVVVJRCkgewogCQkJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQkJCW1lbWNweSgmZGlwLT5kaV91LmRpX211dWlkLCAmaXAtPmlfZGYuaWZfdTIuaWZfdXVpZCwKLQkJCQlzaXplb2YodXVpZF90KSk7CisJCQltZW1jcHkoWEZTX0RGT1JLX0RQVFIoZGlwKSwKKwkJCSAgICAgICAmaXAtPmlfZGYuaWZfdTIuaWZfdXVpZCwKKwkJCSAgICAgICBzaXplb2YodXVpZF90KSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTMwMzAsNyArMjgwNCw2IEBACiAJCQlYRlNfQlVGX0NMUl9CRFNUUkFUX0ZVTkMoYnApOwogCQkJWEZTX0JVRl9VTkRPTkUoYnApOwogCQkJWEZTX0JVRl9TVEFMRShicCk7Ci0JCQlYRlNfQlVGX1NIVVQoYnApOwogCQkJWEZTX0JVRl9FUlJPUihicCxFSU8pOwogCQkJeGZzX2Jpb2RvbmUoYnApOwogCQl9IGVsc2UgewpAQCAtMzE3Miw3ICsyOTQ1LDcgQEAKIAkvKgogCSAqIEdldCB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgaW5vZGUuCiAJICovCi0JZXJyb3IgPSB4ZnNfaXRvYnAobXAsIE5VTEwsIGlwLCAmZGlwLCAmYnAsIDAsIDAsCisJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIE5VTEwsIGlwLCAmZGlwLCAmYnAsCiAJCQkJbm9ibG9jayA/IFhGU19CVUZfVFJZTE9DSyA6IFhGU19CVUZfTE9DSyk7CiAJaWYgKGVycm9yIHx8ICFicCkgewogCQl4ZnNfaWZ1bmxvY2soaXApOwpAQCAtMzI1Myw3ICszMDI2LDcgQEAKIAl9CiAKIAkvKiBzZXQgKmRpcCA9IGlub2RlJ3MgcGxhY2UgaW4gdGhlIGJ1ZmZlciAqLwotCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwgaXAtPmlfYm9mZnNldCk7CisJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCBpcC0+aV9pbWFwLmltX2JvZmZzZXQpOwogCiAJLyoKIAkgKiBDbGVhciBpX3VwZGF0ZV9jb3JlIGJlZm9yZSBjb3B5aW5nIG91dCB0aGUgZGF0YS4KQEAgLTMyNzUsMTEgKzMwNDgsMTEgQEAKIAkgKi8KIAl4ZnNfc3luY2hyb25pemVfYXRpbWUoaXApOwogCi0JaWYgKFhGU19URVNUX0VSUk9SKGJlMTZfdG9fY3B1KGRpcC0+ZGlfY29yZS5kaV9tYWdpYykgIT0gWEZTX0RJTk9ERV9NQUdJQywKKwlpZiAoWEZTX1RFU1RfRVJST1IoYmUxNl90b19jcHUoZGlwLT5kaV9tYWdpYykgIT0gWEZTX0RJTk9ERV9NQUdJQywKIAkJCSAgICAgICBtcCwgWEZTX0VSUlRBR19JRkxVU0hfMSwgWEZTX1JBTkRPTV9JRkxVU0hfMSkpIHsKIAkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCiAJCSAgICAieGZzX2lmbHVzaDogQmFkIGlub2RlICVMdSBtYWdpYyBudW1iZXIgMHgleCwgcHRyIDB4JXAiLAotCQkJaXAtPmlfaW5vLCBiZTE2X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfbWFnaWMpLCBkaXApOworCQkJaXAtPmlfaW5vLCBiZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSwgZGlwKTsKIAkJZ290byBjb3JydXB0X291dDsKIAl9CiAJaWYgKFhGU19URVNUX0VSUk9SKGlwLT5pX2QuZGlfbWFnaWMgIT0gWEZTX0RJTk9ERV9NQUdJQywKQEAgLTMzNDIsNyArMzExNSw3IEBACiAJICogYmVjYXVzZSBpZiB0aGUgaW5vZGUgaXMgZGlydHkgYXQgYWxsIHRoZSBjb3JlIG11c3QKIAkgKiBiZS4KIAkgKi8KLQl4ZnNfZGlub2RlX3RvX2Rpc2soJmRpcC0+ZGlfY29yZSwgJmlwLT5pX2QpOworCXhmc19kaW5vZGVfdG9fZGlzayhkaXAsICZpcC0+aV9kKTsKIAogCS8qIFdyYXAsIHdlIG5ldmVyIGxldCB0aGUgbG9nIHB1dCBvdXQgRElfTUFYX0ZMVVNIICovCiAJaWYgKGlwLT5pX2QuZGlfZmx1c2hpdGVyID09IERJX01BWF9GTFVTSCkKQEAgLTMzNTQsMjggKzMxMjcsMjcgQEAKIAkgKiBjb252ZXJ0IGJhY2sgdG8gdGhlIG9sZCBpbm9kZSBmb3JtYXQuICBJZiB0aGUgc3VwZXJibG9jayB2ZXJzaW9uCiAJICogaGFzIGJlZW4gdXBkYXRlZCwgdGhlbiBtYWtlIHRoZSBjb252ZXJzaW9uIHBlcm1hbmVudC4KIAkgKi8KLQlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xIHx8Ci0JICAgICAgIHhmc19zYl92ZXJzaW9uX2hhc25saW5rKCZtcC0+bV9zYikpOwotCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IDEgfHwgeGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoJm1wLT5tX3NiKSk7CisJaWYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAxKSB7CiAJCWlmICgheGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoJm1wLT5tX3NiKSkgewogCQkJLyoKIAkJCSAqIENvbnZlcnQgaXQgYmFjay4KIAkJCSAqLwogCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPD0gWEZTX01BWExJTktfMSk7Ci0JCQlkaXAtPmRpX2NvcmUuZGlfb25saW5rID0gY3B1X3RvX2JlMTYoaXAtPmlfZC5kaV9ubGluayk7CisJCQlkaXAtPmRpX29ubGluayA9IGNwdV90b19iZTE2KGlwLT5pX2QuZGlfbmxpbmspOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoZSBzdXBlcmJsb2NrIHZlcnNpb24gaGFzIGFscmVhZHkgYmVlbiBidW1wZWQsCiAJCQkgKiBzbyBqdXN0IG1ha2UgdGhlIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBpbm9kZQogCQkJICogZm9ybWF0IHBlcm1hbmVudC4KIAkJCSAqLwotCQkJaXAtPmlfZC5kaV92ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7Ci0JCQlkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbiA9ICBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwkJCWlwLT5pX2QuZGlfdmVyc2lvbiA9IDI7CisJCQlkaXAtPmRpX3ZlcnNpb24gPSAyOwogCQkJaXAtPmlfZC5kaV9vbmxpbmsgPSAwOwotCQkJZGlwLT5kaV9jb3JlLmRpX29ubGluayA9IDA7CisJCQlkaXAtPmRpX29ubGluayA9IDA7CiAJCQltZW1zZXQoJihpcC0+aV9kLmRpX3BhZFswXSksIDAsIHNpemVvZihpcC0+aV9kLmRpX3BhZCkpOwotCQkJbWVtc2V0KCYoZGlwLT5kaV9jb3JlLmRpX3BhZFswXSksIDAsCi0JCQkgICAgICBzaXplb2YoZGlwLT5kaV9jb3JlLmRpX3BhZCkpOworCQkJbWVtc2V0KCYoZGlwLT5kaV9wYWRbMF0pLCAwLAorCQkJICAgICAgc2l6ZW9mKGRpcC0+ZGlfcGFkKSk7CiAJCQlBU1NFUlQoaXAtPmlfZC5kaV9wcm9qaWQgPT0gMCk7CiAJCX0KIAl9CkBAIC0zNDE4LDEwICszMTkwLDggQEAKIAkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgPSAwOwogCQlpaXAtPmlsaV9sb2dnZWQgPSAxOwogCi0JCUFTU0VSVChzaXplb2YoeGZzX2xzbl90KSA9PSA4KTsJLyogZG9uJ3QgbG9jayBpZiBpdCBzaHJpbmtzICovCi0JCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwotCQlpaXAtPmlsaV9mbHVzaF9sc24gPSBpaXAtPmlsaV9pdGVtLmxpX2xzbjsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJeGZzX3RyYW5zX2FpbF9jb3B5X2xzbihtcC0+bV9haWwsICZpaXAtPmlsaV9mbHVzaF9sc24sCisJCQkJCSZpaXAtPmlsaV9pdGVtLmxpX2xzbik7CiAKIAkJLyoKIAkJICogQXR0YWNoIHRoZSBmdW5jdGlvbiB4ZnNfaWZsdXNoX2RvbmUgdG8gdGhlIGlub2RlJ3MKQEAgLTM0NTksNDUgKzMyMjksOCBAQAogfQogCiAKLS8qCi0gKiBGbHVzaCBhbGwgaW5hY3RpdmUgaW5vZGVzIGluIG1wLgotICovCi12b2lkCi14ZnNfaWZsdXNoX2FsbCgKLQl4ZnNfbW91bnRfdAkqbXApCi17Ci0JeGZzX2lub2RlX3QJKmlwOwotCi0gYWdhaW46Ci0JWEZTX01PVU5UX0lMT0NLKG1wKTsKLQlpcCA9IG1wLT5tX2lub2RlczsKLQlpZiAoaXAgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlkbyB7Ci0JCS8qIE1ha2Ugc3VyZSB3ZSBza2lwIG1hcmtlcnMgaW5zZXJ0ZWQgYnkgc3luYyAqLwotCQlpZiAoaXAtPmlfbW91bnQgPT0gTlVMTCkgewotCQkJaXAgPSBpcC0+aV9tbmV4dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFWRlNfSShpcCkpIHsKLQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKLQkJCXhmc19maW5pc2hfcmVjbGFpbShpcCwgMCwgWEZTX0lGTFVTSF9BU1lOQyk7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0KLQkJQVNTRVJUKHZuX2NvdW50KFZGU19JKGlwKSkgPT0gMCk7Ci0KLQkJaXAgPSBpcC0+aV9tbmV4dDsKLQl9IHdoaWxlIChpcCAhPSBtcC0+bV9pbm9kZXMpOwotIG91dDoKLQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Ci19CiAKICNpZmRlZiBYRlNfSUxPQ0tfVFJBQ0UKLWt0cmFjZV90CSp4ZnNfaWxvY2tfdHJhY2VfYnVmOwotCiB2b2lkCiB4ZnNfaWxvY2tfdHJhY2UoeGZzX2lub2RlX3QgKmlwLCBpbnQgbG9jaywgdW5zaWduZWQgaW50IGxvY2tmbGFncywgaW5zdF90ICpyYSkKIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCA2YmUzMTBkLi4xZjE3NWZhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC0xOSw4ICsxOSw3IEBACiAjZGVmaW5lCV9fWEZTX0lOT0RFX0hfXwogCiBzdHJ1Y3QgeGZzX2Rpbm9kZTsKLXN0cnVjdCB4ZnNfZGlub2RlX2NvcmU7Ci0KK3N0cnVjdCB4ZnNfaW5vZGU7CiAKIC8qCiAgKiBGb3JrIGlkZW50aWZpZXJzLgpAQCAtNjMsNyArNjIsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2lmb3JrIHsKIAlpbnQJCQlpZl9ieXRlczsJLyogYnl0ZXMgaW4gaWZfdTEgKi8KIAlpbnQJCQlpZl9yZWFsX2J5dGVzOwkvKiBieXRlcyBhbGxvY2F0ZWQgaW4gaWZfdTEgKi8KLQl4ZnNfYm1idF9ibG9ja190CSppZl9icm9vdDsJLyogZmlsZSdzIGluY29yZSBidHJlZSByb290ICovCisJc3RydWN0IHhmc19idHJlZV9ibG9jawkqaWZfYnJvb3Q7CS8qIGZpbGUncyBpbmNvcmUgYnRyZWUgcm9vdCAqLwogCXNob3J0CQkJaWZfYnJvb3RfYnl0ZXM7CS8qIGJ5dGVzIGFsbG9jYXRlZCBmb3Igcm9vdCAqLwogCXVuc2lnbmVkIGNoYXIJCWlmX2ZsYWdzOwkvKiBwZXItZm9yayBmbGFncyAqLwogCXVuc2lnbmVkIGNoYXIJCWlmX2V4dF9tYXg7CS8qIG1heCAjIG9mIGV4dGVudCByZWNvcmRzICovCkBAIC04NCw1MiArODMsMTQgQEAKIH0geGZzX2lmb3JrX3Q7CiAKIC8qCi0gKiBGbGFncyBmb3IgeGZzX2ljaGd0aW1lKCkuCisgKiBJbm9kZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gIFN0b3JlZCBpbiB0aGUgaW5vZGUgYW5kIHBhc3NlZCB0bworICogeGZzX2ltYXBfdG9fYnAoKSB0byBnZXQgYSBidWZmZXIgYW5kIGRpbm9kZSBmb3IgYSBnaXZlbiBpbm9kZS4KICAqLwotI2RlZmluZQlYRlNfSUNIR1RJTUVfTU9ECTB4MQkvKiBkYXRhIGZvcmsgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAqLwotI2RlZmluZQlYRlNfSUNIR1RJTUVfQ0hHCTB4MgkvKiBpbm9kZSBmaWVsZCBjaGFuZ2UgdGltZXN0YW1wICovCi0KLS8qCi0gKiBQZXItZm9yayBpbmNvcmUgaW5vZGUgZmxhZ3MuCi0gKi8KLSNkZWZpbmUJWEZTX0lGSU5MSU5FCTB4MDEJLyogSW5saW5lIGRhdGEgaXMgcmVhZCBpbiAqLwotI2RlZmluZQlYRlNfSUZFWFRFTlRTCTB4MDIJLyogQWxsIGV4dGVudCBwb2ludGVycyBhcmUgcmVhZCBpbiAqLwotI2RlZmluZQlYRlNfSUZCUk9PVAkweDA0CS8qIGlfYnJvb3QgcG9pbnRzIHRvIHRoZSBibWFwIGItdHJlZSByb290ICovCi0jZGVmaW5lCVhGU19JRkVYVElSRUMJMHgwOAkvKiBJbmRpcmVjdGlvbiBhcnJheSBvZiBleHRlbnQgYmxvY2tzICovCi0KLS8qCi0gKiBGbGFncyBmb3IgeGZzX2l0b2JwKCksIHhmc19pbWFwKCkgYW5kIHhmc19kaWxvY2F0ZSgpLgotICovCi0jZGVmaW5lIFhGU19JTUFQX0xPT0tVUAkJMHgxCi0jZGVmaW5lIFhGU19JTUFQX0JVTEtTVEFUCTB4MgotCi0jaWZkZWYgX19LRVJORUxfXwotc3RydWN0IGJodl9kZXNjOwotc3RydWN0IGNyZWQ7Ci1zdHJ1Y3Qga3RyYWNlOwotc3RydWN0IHhmc19idWY7Ci1zdHJ1Y3QgeGZzX2JtYXBfZnJlZTsKLXN0cnVjdCB4ZnNfYm1idF9pcmVjOwotc3RydWN0IHhmc19ibWJ0X2Jsb2NrOwotc3RydWN0IHhmc19pbm9kZTsKLXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW07Ci1zdHJ1Y3QgeGZzX21vdW50Owotc3RydWN0IHhmc190cmFuczsKLXN0cnVjdCB4ZnNfZHF1b3Q7Ci0KLSNpZiBkZWZpbmVkKFhGU19JTE9DS19UUkFDRSkKLSNkZWZpbmUgWEZTX0lMT0NLX0tUUkFDRV9TSVpFCTMyCi1leHRlcm4ga3RyYWNlX3QgKnhmc19pbG9ja190cmFjZV9idWY7Ci1leHRlcm4gdm9pZCB4ZnNfaWxvY2tfdHJhY2Uoc3RydWN0IHhmc19pbm9kZSAqLCBpbnQsIHVuc2lnbmVkIGludCwgaW5zdF90ICopOwotI2Vsc2UKLSNkZWZpbmUJeGZzX2lsb2NrX3RyYWNlKGksbixmLHJhKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGRtX2F0dHJzX3MgewotCV9fdWludDMyX3QJZGFfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzayAqLwotCV9fdWludDE2X3QJZGFfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvICovCi0JX191aW50MTZfdAlkYV9wYWQ7CQkvKiBETUlHIGV4dHJhIHBhZGRpbmcgKi8KLX0gZG1fYXR0cnNfdDsKK3N0cnVjdCB4ZnNfaW1hcCB7CisJeGZzX2RhZGRyX3QJaW1fYmxrbm87CS8qIHN0YXJ0aW5nIEJCIG9mIGlub2RlIGNodW5rICovCisJdXNob3J0CQlpbV9sZW47CQkvKiBsZW5ndGggaW4gQkJzIG9mIGlub2RlIGNodW5rICovCisJdXNob3J0CQlpbV9ib2Zmc2V0OwkvKiBpbm9kZSBvZmZzZXQgaW4gYmxvY2sgaW4gYnl0ZXMgKi8KK307CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSB4ZnMgaW4tY29yZSBpbm9kZSBzdHJ1Y3R1cmUuCkBAIC0xNjAsNyArMTIxLDcgQEAKIH0geGZzX2ljdGltZXN0YW1wX3Q7CiAKIC8qCi0gKiBOT1RFOiAgVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBrZXB0IGlkZW50aWNhbCB0byBzdHJ1Y3QgeGZzX2Rpbm9kZV9jb3JlCisgKiBOT1RFOiAgVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBrZXB0IGlkZW50aWNhbCB0byBzdHJ1Y3QgeGZzX2Rpbm9kZQogICogCSAgaW4geGZzX2Rpbm9kZS5oIGV4Y2VwdCBmb3IgdGhlIGVuZGlhbmVzcyBhbm5vdGF0aW9ucy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2ljZGlub2RlIHsKQEAgLTE5MSwyNyArMTUyLDk3IEBACiAJX191aW50MzJfdAlkaV9nZW47CQkvKiBnZW5lcmF0aW9uIG51bWJlciAqLwogfSB4ZnNfaWNkaW5vZGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwX21uZXh0OwkvKiBuZXh0IGlub2RlIGluIG1vdW50IGxpc3QgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcF9tcHJldjsJLyogcHRyIHRvIHByZXYgaW5vZGUgKi8KLQlzdHJ1Y3QgeGZzX21vdW50CSppcF9tb3VudDsJLyogZnMgbW91bnQgc3RydWN0IHB0ciAqLwotfSB4ZnNfaXB0cl90OworLyoKKyAqIEZsYWdzIGZvciB4ZnNfaWNoZ3RpbWUoKS4KKyAqLworI2RlZmluZQlYRlNfSUNIR1RJTUVfTU9ECTB4MQkvKiBkYXRhIGZvcmsgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAqLworI2RlZmluZQlYRlNfSUNIR1RJTUVfQ0hHCTB4MgkvKiBpbm9kZSBmaWVsZCBjaGFuZ2UgdGltZXN0YW1wICovCisKKy8qCisgKiBQZXItZm9yayBpbmNvcmUgaW5vZGUgZmxhZ3MuCisgKi8KKyNkZWZpbmUJWEZTX0lGSU5MSU5FCTB4MDEJLyogSW5saW5lIGRhdGEgaXMgcmVhZCBpbiAqLworI2RlZmluZQlYRlNfSUZFWFRFTlRTCTB4MDIJLyogQWxsIGV4dGVudCBwb2ludGVycyBhcmUgcmVhZCBpbiAqLworI2RlZmluZQlYRlNfSUZCUk9PVAkweDA0CS8qIGlfYnJvb3QgcG9pbnRzIHRvIHRoZSBibWFwIGItdHJlZSByb290ICovCisjZGVmaW5lCVhGU19JRkVYVElSRUMJMHgwOAkvKiBJbmRpcmVjdGlvbiBhcnJheSBvZiBleHRlbnQgYmxvY2tzICovCisKKy8qCisgKiBGb3JrIGhhbmRsaW5nLgorICovCisKKyNkZWZpbmUgWEZTX0lGT1JLX1EoaXApCQkJKChpcCktPmlfZC5kaV9mb3Jrb2ZmICE9IDApCisjZGVmaW5lIFhGU19JRk9SS19CT0ZGKGlwKQkJKChpbnQpKChpcCktPmlfZC5kaV9mb3Jrb2ZmIDw8IDMpKQorCisjZGVmaW5lIFhGU19JRk9SS19QVFIoaXAsdykJCVwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCSYoaXApLT5pX2RmIDogXAorCQkoaXApLT5pX2FmcCkKKyNkZWZpbmUgWEZTX0lGT1JLX0RTSVpFKGlwKSBcCisJKFhGU19JRk9SS19RKGlwKSA/IFwKKwkJWEZTX0lGT1JLX0JPRkYoaXApIDogXAorCQlYRlNfTElUSU5PKChpcCktPmlfbW91bnQpKQorI2RlZmluZSBYRlNfSUZPUktfQVNJWkUoaXApIFwKKwkoWEZTX0lGT1JLX1EoaXApID8gXAorCQlYRlNfTElUSU5PKChpcCktPmlfbW91bnQpIC0gWEZTX0lGT1JLX0JPRkYoaXApIDogXAorCQkwKQorI2RlZmluZSBYRlNfSUZPUktfU0laRShpcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQlYRlNfSUZPUktfRFNJWkUoaXApIDogXAorCQlYRlNfSUZPUktfQVNJWkUoaXApKQorI2RlZmluZSBYRlNfSUZPUktfRk9STUFUKGlwLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCShpcCktPmlfZC5kaV9mb3JtYXQgOiBcCisJCShpcCktPmlfZC5kaV9hZm9ybWF0KQorI2RlZmluZSBYRlNfSUZPUktfRk1UX1NFVChpcCx3LG4pIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCSgoaXApLT5pX2QuZGlfZm9ybWF0ID0gKG4pKSA6IFwKKwkJKChpcCktPmlfZC5kaV9hZm9ybWF0ID0gKG4pKSkKKyNkZWZpbmUgWEZTX0lGT1JLX05FWFRFTlRTKGlwLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCShpcCktPmlfZC5kaV9uZXh0ZW50cyA6IFwKKwkJKGlwKS0+aV9kLmRpX2FuZXh0ZW50cykKKyNkZWZpbmUgWEZTX0lGT1JLX05FWFRfU0VUKGlwLHcsbikgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJKChpcCktPmlfZC5kaV9uZXh0ZW50cyA9IChuKSkgOiBcCisJCSgoaXApLT5pX2QuZGlfYW5leHRlbnRzID0gKG4pKSkKKworCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCBiaHZfZGVzYzsKK3N0cnVjdCBjcmVkOworc3RydWN0IGt0cmFjZTsKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKK3N0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW07CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKK3N0cnVjdCB4ZnNfZHF1b3Q7CisKKyNpZiBkZWZpbmVkKFhGU19JTE9DS19UUkFDRSkKKyNkZWZpbmUgWEZTX0lMT0NLX0tUUkFDRV9TSVpFCTMyCitleHRlcm4gdm9pZCB4ZnNfaWxvY2tfdHJhY2Uoc3RydWN0IHhmc19pbm9kZSAqLCBpbnQsIHVuc2lnbmVkIGludCwgaW5zdF90ICopOworI2Vsc2UKKyNkZWZpbmUJeGZzX2lsb2NrX3RyYWNlKGksbixmLHJhKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGRtX2F0dHJzX3MgeworCV9fdWludDMyX3QJZGFfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzayAqLworCV9fdWludDE2X3QJZGFfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvICovCisJX191aW50MTZfdAlkYV9wYWQ7CQkvKiBETUlHIGV4dHJhIHBhZGRpbmcgKi8KK30gZG1fYXR0cnNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2RlIHsKIAkvKiBJbm9kZSBsaW5raW5nIGFuZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppX21uZXh0OwkvKiBuZXh0IGlub2RlIGluIG1vdW50IGxpc3QgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppX21wcmV2OwkvKiBwdHIgdG8gcHJldiBpbm9kZSAqLwogCXN0cnVjdCB4ZnNfbW91bnQJKmlfbW91bnQ7CS8qIGZzIG1vdW50IHN0cnVjdCBwdHIgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWlfcmVjbGFpbTsJLyogcmVjbGFpbSBsaXN0ICovCi0Jc3RydWN0IGlub2RlCQkqaV92bm9kZTsJLyogdm5vZGUgYmFja3BvaW50ZXIgKi8KIAlzdHJ1Y3QgeGZzX2RxdW90CSppX3VkcXVvdDsJLyogdXNlciBkcXVvdCAqLwogCXN0cnVjdCB4ZnNfZHF1b3QJKmlfZ2RxdW90OwkvKiBncm91cCBkcXVvdCAqLwogCiAJLyogSW5vZGUgbG9jYXRpb24gc3R1ZmYgKi8KIAl4ZnNfaW5vX3QJCWlfaW5vOwkJLyogaW5vZGUgbnVtYmVyIChhZ25vL2FnaW5vKSovCi0JeGZzX2RhZGRyX3QJCWlfYmxrbm87CS8qIGJsa25vIG9mIGlub2RlIGJ1ZmZlciAqLwotCXVzaG9ydAkJCWlfbGVuOwkJLyogbGVuIG9mIGlub2RlIGJ1ZmZlciAqLwotCXVzaG9ydAkJCWlfYm9mZnNldDsJLyogb2ZmIG9mIGlub2RlIGluIGJ1ZmZlciAqLworCXN0cnVjdCB4ZnNfaW1hcAkJaV9pbWFwOwkJLyogbG9jYXRpb24gZm9yIHhmc19pbWFwKCkgKi8KIAogCS8qIEV4dGVudCBpbmZvcm1hdGlvbi4gKi8KIAl4ZnNfaWZvcmtfdAkJKmlfYWZwOwkJLyogYXR0cmlidXRlIGZvcmsgcG9pbnRlciAqLwpAQCAtMjMwLDcgKzI2MSw2IEBACiAJdW5zaWduZWQgc2hvcnQJCWlfZmxhZ3M7CS8qIHNlZSBkZWZpbmVkIGZsYWdzIGJlbG93ICovCiAJdW5zaWduZWQgY2hhcgkJaV91cGRhdGVfY29yZTsJLyogdGltZXN0YW1wcy9zaXplIGlzIGRpcnR5ICovCiAJdW5zaWduZWQgY2hhcgkJaV91cGRhdGVfc2l6ZTsJLyogZGlfc2l6ZSBmaWVsZCBpcyBkaXJ0eSAqLwotCXVuc2lnbmVkIGludAkJaV9nZW47CQkvKiBnZW5lcmF0aW9uIGNvdW50ICovCiAJdW5zaWduZWQgaW50CQlpX2RlbGF5ZWRfYmxrczsJLyogY291bnQgb2YgZGVsYXkgYWxsb2MgYmxrcyAqLwogCiAJeGZzX2ljZGlub2RlX3QJCWlfZDsJCS8qIG1vc3Qgb2Ygb25kaXNrIGlub2RlICovCkBAIC0yMzgsNiArMjY4LDEwIEBACiAJeGZzX2ZzaXplX3QJCWlfc2l6ZTsJCS8qIGluLW1lbW9yeSBzaXplICovCiAJeGZzX2ZzaXplX3QJCWlfbmV3X3NpemU7CS8qIHNpemUgd2hlbiB3cml0ZSBjb21wbGV0ZXMgKi8KIAlhdG9taWNfdAkJaV9pb2NvdW50OwkvKiBvdXRzdGFuZGluZyBJL08gY291bnQgKi8KKworCS8qIFZGUyBpbm9kZSAqLworCXN0cnVjdCBpbm9kZQkJaV92bm9kZTsJLyogZW1iZWRkZWQgVkZTIGlub2RlICovCisKIAkvKiBUcmFjZSBidWZmZXJzIHBlciBpbm9kZS4gKi8KICNpZmRlZiBYRlNfSU5PREVfVFJBQ0UKIAlzdHJ1Y3Qga3RyYWNlCQkqaV90cmFjZTsJLyogZ2VuZXJhbCBpbm9kZSB0cmFjZSAqLwpAQCAtMjQ1LDcgKzI3OSw3IEBACiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKIAlzdHJ1Y3Qga3RyYWNlCQkqaV94dHJhY2U7CS8qIGlub2RlIGV4dGVudCBsaXN0IHRyYWNlICovCiAjZW5kaWYKLSNpZmRlZiBYRlNfQk1CVF9UUkFDRQorI2lmZGVmIFhGU19CVFJFRV9UUkFDRQogCXN0cnVjdCBrdHJhY2UJCSppX2J0cmFjZTsJLyogaW5vZGUgYm1hcCBidHJlZSB0cmFjZSAqLwogI2VuZGlmCiAjaWZkZWYgWEZTX1JXX1RSQUNFCkBAIC0yNjUsMTMgKzI5OSwzMCBAQAogLyogQ29udmVydCBmcm9tIHZmcyBpbm9kZSB0byB4ZnMgaW5vZGUgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19pbm9kZSAqWEZTX0koc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlyZXR1cm4gKHN0cnVjdCB4ZnNfaW5vZGUgKilpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCB4ZnNfaW5vZGUsIGlfdm5vZGUpOwogfQogCiAvKiBjb252ZXJ0IGZyb20geGZzIGlub2RlIHRvIHZmcyBpbm9kZSAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKlZGU19JKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKQogewotCXJldHVybiAoc3RydWN0IGlub2RlICopaXAtPmlfdm5vZGU7CisJcmV0dXJuICZpcC0+aV92bm9kZTsKK30KKworLyoKKyAqIEdldCByaWQgb2YgYSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgaW5vZGUuCisgKgorICogV2UgaGF2ZSB0byBnbyB0aHJvdWdoIGRlc3Ryb3lfaW5vZGUgdG8gbWFrZSBzdXJlIGFsbG9jYXRpb25zCisgKiBmcm9tIGluaXRfaW5vZGVfYWx3YXlzIGxpa2UgdGhlIHNlY3VyaXR5IGRhdGEgYXJlIHVuZG9uZS4KKyAqCisgKiBXZSBtYXJrIHRoZSBpbm9kZSBiYWQgc28gdGhhdCBpdCB0YWtlcyB0aGUgc2hvcnQgY3V0IGluCisgKiB0aGUgcmVjbGFpbSBwYXRoIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCB0aGUgZmx1c2ggcGF0aAorICogd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciBhbiBpbm9kZSB0aGF0IGhhcyBuZXZlciBzZWVuIHRoZQorICogbGlnaHQgb2YgZGF5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXApCit7CisJbWFrZV9iYWRfaW5vZGUoVkZTX0koaXApKTsKKwlyZXR1cm4gZGVzdHJveV9pbm9kZShWRlNfSShpcCkpOwogfQogCiAvKgpAQCAtMzI3LDY1ICszNzgsMzYgQEAKIAlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KLSNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0KIAogLyoKLSAqIEZvcmsgaGFuZGxpbmcuCisgKiBNYW5hZ2UgdGhlIGlfZmx1c2ggcXVldWUgZW1iZWRkZWQgaW4gdGhlIGlub2RlLiAgVGhpcyBjb21wbGV0aW9uCisgKiBxdWV1ZSBzeW5jaHJvbml6ZXMgcHJvY2Vzc2VzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhlIGluLWNvcmUKKyAqIGlub2RlIGJhY2sgdG8gZGlzay4KICAqLworc3RhdGljIGlubGluZSB2b2lkIHhmc19pZmxvY2soeGZzX2lub2RlX3QgKmlwKQoreworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlwLT5pX2ZsdXNoKTsKK30KIAotI2RlZmluZSBYRlNfSUZPUktfUShpcCkJCQkoKGlwKS0+aV9kLmRpX2ZvcmtvZmYgIT0gMCkKLSNkZWZpbmUgWEZTX0lGT1JLX0JPRkYoaXApCQkoKGludCkoKGlwKS0+aV9kLmRpX2ZvcmtvZmYgPDwgMykpCitzdGF0aWMgaW5saW5lIGludCB4ZnNfaWZsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdCAqaXApCit7CisJcmV0dXJuIHRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZpcC0+aV9mbHVzaCk7Cit9CiAKLSNkZWZpbmUgWEZTX0lGT1JLX1BUUihpcCx3KQkJXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJJihpcCktPmlfZGYgOiBcCi0JCShpcCktPmlfYWZwKQotI2RlZmluZSBYRlNfSUZPUktfRFNJWkUoaXApIFwKLQkoWEZTX0lGT1JLX1EoaXApID8gXAotCQlYRlNfSUZPUktfQk9GRihpcCkgOiBcCi0JCVhGU19MSVRJTk8oKGlwKS0+aV9tb3VudCkpCi0jZGVmaW5lIFhGU19JRk9SS19BU0laRShpcCkgXAotCShYRlNfSUZPUktfUShpcCkgPyBcCi0JCVhGU19MSVRJTk8oKGlwKS0+aV9tb3VudCkgLSBYRlNfSUZPUktfQk9GRihpcCkgOiBcCi0JCTApCi0jZGVmaW5lIFhGU19JRk9SS19TSVpFKGlwLHcpIFwKLQkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCi0JCVhGU19JRk9SS19EU0laRShpcCkgOiBcCi0JCVhGU19JRk9SS19BU0laRShpcCkpCi0jZGVmaW5lIFhGU19JRk9SS19GT1JNQVQoaXAsdykgXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJKGlwKS0+aV9kLmRpX2Zvcm1hdCA6IFwKLQkJKGlwKS0+aV9kLmRpX2Fmb3JtYXQpCi0jZGVmaW5lIFhGU19JRk9SS19GTVRfU0VUKGlwLHcsbikgXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJKChpcCktPmlfZC5kaV9mb3JtYXQgPSAobikpIDogXAotCQkoKGlwKS0+aV9kLmRpX2Fmb3JtYXQgPSAobikpKQotI2RlZmluZSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsdykgXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJKGlwKS0+aV9kLmRpX25leHRlbnRzIDogXAotCQkoaXApLT5pX2QuZGlfYW5leHRlbnRzKQotI2RlZmluZSBYRlNfSUZPUktfTkVYVF9TRVQoaXAsdyxuKSBcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAotCQkoKGlwKS0+aV9kLmRpX25leHRlbnRzID0gKG4pKSA6IFwKLQkJKChpcCktPmlfZC5kaV9hbmV4dGVudHMgPSAobikpKQotCi0jaWZkZWYgX19LRVJORUxfXworc3RhdGljIGlubGluZSB2b2lkIHhmc19pZnVubG9jayh4ZnNfaW5vZGVfdCAqaXApCit7CisJY29tcGxldGUoJmlwLT5pX2ZsdXNoKTsKK30KIAogLyoKICAqIEluLWNvcmUgaW5vZGUgZmxhZ3MuCiAgKi8KLSNkZWZpbmUgWEZTX0lHUklPCTB4MDAwMSAgLyogaW5vZGUgdXNlZCBmb3IgZ3VhcmFudGVlZCByYXRlIGkvbyAqLwotI2RlZmluZSBYRlNfSVVJT1NaCTB4MDAwMiAgLyogaW5vZGUgaS9vIHNpemVzIGhhdmUgYmVlbiBleHBsaWNpdGx5IHNldCAqLwotI2RlZmluZSBYRlNfSVFVSUVTQ0UgICAgMHgwMDA0ICAvKiB3ZSBoYXZlIHN0YXJ0ZWQgcXVpZXNjaW5nIGZvciB0aGlzIGlub2RlICovCi0jZGVmaW5lIFhGU19JUkVDTEFJTSAgICAweDAwMDggIC8qIHdlIGhhdmUgc3RhcnRlZCByZWNsYWltaW5nIHRoaXMgaW5vZGUgICAgKi8KLSNkZWZpbmUgWEZTX0lTVEFMRQkweDAwMTAJLyogaW5vZGUgaGFzIGJlZW4gc3RhbGVkICovCi0jZGVmaW5lIFhGU19JUkVDTEFJTUFCTEUgMHgwMDIwIC8qIGlub2RlIGNhbiBiZSByZWNsYWltZWQgKi8KLSNkZWZpbmUgWEZTX0lORVcJMHgwMDQwCi0jZGVmaW5lIFhGU19JRklMRVNUUkVBTQkweDAwODAJLyogaW5vZGUgaXMgaW4gYSBmaWxlc3RyZWFtIGRpcmVjdG9yeSAqLwotI2RlZmluZSBYRlNfSU1PRElGSUVECTB4MDEwMAkvKiBYRlMgaW5vZGUgc3RhdGUgcG9zc2libHkgZGlmZmVycyAqLwotCQkJCS8qIHRvIHRoZSBMaW51eCBpbm9kZSBzdGF0ZS4gKi8KLSNkZWZpbmUgWEZTX0lUUlVOQ0FURUQJMHgwMjAwCS8qIHRydW5jYXRlZCBkb3duIHNvIGZsdXNoLW9uLWNsb3NlICovCisjZGVmaW5lIFhGU19JUkVDTEFJTSAgICAweDAwMDEgIC8qIHdlIGhhdmUgc3RhcnRlZCByZWNsYWltaW5nIHRoaXMgaW5vZGUgICAgKi8KKyNkZWZpbmUgWEZTX0lTVEFMRQkweDAwMDIJLyogaW5vZGUgaGFzIGJlZW4gc3RhbGVkICovCisjZGVmaW5lIFhGU19JUkVDTEFJTUFCTEUgMHgwMDA0IC8qIGlub2RlIGNhbiBiZSByZWNsYWltZWQgKi8KKyNkZWZpbmUgWEZTX0lORVcJMHgwMDA4CS8qIGlub2RlIGhhcyBqdXN0IGJlZW4gYWxsb2NhdGVkICovCisjZGVmaW5lIFhGU19JRklMRVNUUkVBTQkweDAwMTAJLyogaW5vZGUgaXMgaW4gYSBmaWxlc3RyZWFtIGRpcmVjdG9yeSAqLworI2RlZmluZSBYRlNfSVRSVU5DQVRFRAkweDAwMjAJLyogdHJ1bmNhdGVkIGRvd24gc28gZmx1c2gtb24tY2xvc2UgKi8KIAogLyoKICAqIEZsYWdzIGZvciBpbm9kZSBsb2NraW5nLgpAQCAtNDYwLDE2ICs0ODIsOCBAQAogCSAoKHBpcCktPmlfZC5kaV9tb2RlICYgU19JU0dJRCkpCiAKIC8qCi0gKiBGbGFncyBmb3IgeGZzX2lnZXQoKQotICovCi0jZGVmaW5lIFhGU19JR0VUX0NSRUFURQkJMHgxCi0jZGVmaW5lIFhGU19JR0VUX0JVTEtTVEFUCTB4MgotCi0vKgogICogeGZzX2lnZXQuYyBwcm90b3R5cGVzLgogICovCi12b2lkCQl4ZnNfaWhhc2hfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwotdm9pZAkJeGZzX2loYXNoX2ZyZWUoc3RydWN0IHhmc19tb3VudCAqKTsKIHhmc19pbm9kZV90CSp4ZnNfaW5vZGVfaW5jb3JlKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2lub190LAogCQkJCSAgc3RydWN0IHhmc190cmFucyAqKTsKIGludAkJeGZzX2lnZXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKQEAgLTQ4NCwyNSArNDk4LDEzIEBACiB1aW50CQl4ZnNfaWxvY2tfbWFwX3NoYXJlZCh4ZnNfaW5vZGVfdCAqKTsKIHZvaWQJCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoeGZzX2lub2RlX3QgKiwgdWludCk7CiB2b2lkCQl4ZnNfaXJlY2xhaW0oeGZzX2lub2RlX3QgKik7Ci1pbnQJCXhmc19maW5pc2hfcmVjbGFpbSh4ZnNfaW5vZGVfdCAqLCBpbnQsIGludCk7Ci1pbnQJCXhmc19maW5pc2hfcmVjbGFpbV9hbGwoc3RydWN0IHhmc19tb3VudCAqLCBpbnQpOwogCiAvKgogICogeGZzX2lub2RlLmMgcHJvdG90eXBlcy4KICAqLwotaW50CQl4ZnNfaXRvYnAoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosCi0JCQkgIHhmc19pbm9kZV90ICosIHN0cnVjdCB4ZnNfZGlub2RlICoqLCBzdHJ1Y3QgeGZzX2J1ZiAqKiwKLQkJCSAgeGZzX2RhZGRyX3QsIHVpbnQsIHVpbnQpOwotaW50CQl4ZnNfaXJlYWQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKLQkJCSAgeGZzX2lub2RlX3QgKiosIHhmc19kYWRkcl90LCB1aW50KTsKLWludAkJeGZzX2lyZWFkX2V4dGVudHMoc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqLCBpbnQpOwogaW50CQl4ZnNfaWFsbG9jKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKiwgbW9kZV90LAogCQkJICAgeGZzX25saW5rX3QsIHhmc19kZXZfdCwgY3JlZF90ICosIHhmc19wcmlkX3QsCiAJCQkgICBpbnQsIHN0cnVjdCB4ZnNfYnVmICoqLCBib29sZWFuX3QgKiwgeGZzX2lub2RlX3QgKiopOwotdm9pZAkJeGZzX2Rpbm9kZV9mcm9tX2Rpc2soc3RydWN0IHhmc19pY2Rpbm9kZSAqLAotCQkJCSAgICAgc3RydWN0IHhmc19kaW5vZGVfY29yZSAqKTsKLXZvaWQJCXhmc19kaW5vZGVfdG9fZGlzayhzdHJ1Y3QgeGZzX2Rpbm9kZV9jb3JlICosCi0JCQkJICAgc3RydWN0IHhmc19pY2Rpbm9kZSAqKTsKIAogdWludAkJeGZzX2lwMnhmbGFncyhzdHJ1Y3QgeGZzX2lub2RlICopOwogdWludAkJeGZzX2RpYzJ4ZmxhZ3Moc3RydWN0IHhmc19kaW5vZGUgKik7CkBAIC01MTMsMTcgKzUxNSwxMCBAQAogCQkJCSAgICAgeGZzX2ZzaXplX3QsIGludCwgaW50KTsKIGludAkJeGZzX2l1bmxpbmsoc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqKTsKIAotdm9pZAkJeGZzX2lkZXN0cm95X2ZvcmsoeGZzX2lub2RlX3QgKiwgaW50KTsKLXZvaWQJCXhmc19pZGVzdHJveSh4ZnNfaW5vZGVfdCAqKTsKLXZvaWQJCXhmc19pZGF0YV9yZWFsbG9jKHhmc19pbm9kZV90ICosIGludCwgaW50KTsKLXZvaWQJCXhmc19pZXh0cmFjdCh4ZnNfaW5vZGVfdCAqKTsKIHZvaWQJCXhmc19pZXh0X3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwotdm9pZAkJeGZzX2lyb290X3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwogdm9pZAkJeGZzX2lwaW4oeGZzX2lub2RlX3QgKik7CiB2b2lkCQl4ZnNfaXVucGluKHhmc19pbm9kZV90ICopOwotaW50CQl4ZnNfaWV4dGVudHNfY29weSh4ZnNfaW5vZGVfdCAqLCB4ZnNfYm1idF9yZWNfdCAqLCBpbnQpOwogaW50CQl4ZnNfaWZsdXNoKHhmc19pbm9kZV90ICosIHVpbnQpOwotdm9pZAkJeGZzX2lmbHVzaF9hbGwoc3RydWN0IHhmc19tb3VudCAqKTsKIHZvaWQJCXhmc19pY2hndGltZSh4ZnNfaW5vZGVfdCAqLCBpbnQpOwogeGZzX2ZzaXplX3QJeGZzX2ZpbGVfbGFzdF9ieXRlKHhmc19pbm9kZV90ICopOwogdm9pZAkJeGZzX2xvY2tfaW5vZGVzKHhmc19pbm9kZV90ICoqLCBpbnQsIHVpbnQpOwpAQCAtNTMyLDYgKzUyNyw3NyBAQAogdm9pZAkJeGZzX3N5bmNocm9uaXplX2F0aW1lKHhmc19pbm9kZV90ICopOwogdm9pZAkJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyh4ZnNfaW5vZGVfdCAqKTsKIAorI2lmIGRlZmluZWQoWEZTX0lOT0RFX1RSQUNFKQorCisjZGVmaW5lCUlOT0RFX1RSQUNFX1NJWkUJMTYJCS8qIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzICovCisjZGVmaW5lCUlOT0RFX0tUUkFDRV9FTlRSWQkxCisjZGVmaW5lCUlOT0RFX0tUUkFDRV9FWElUCTIKKyNkZWZpbmUJSU5PREVfS1RSQUNFX0hPTEQJMworI2RlZmluZQlJTk9ERV9LVFJBQ0VfUkVGCTQKKyNkZWZpbmUJSU5PREVfS1RSQUNFX1JFTEUJNQorCitleHRlcm4gdm9pZCBfeGZzX2l0cmFjZV9lbnRyeShzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgX3hmc19pdHJhY2VfZXhpdChzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgeGZzX2l0cmFjZV9ob2xkKHN0cnVjdCB4ZnNfaW5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKK2V4dGVybiB2b2lkIF94ZnNfaXRyYWNlX3JlZihzdHJ1Y3QgeGZzX2lub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7CitleHRlcm4gdm9pZCB4ZnNfaXRyYWNlX3JlbGUoc3RydWN0IHhmc19pbm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOworI2RlZmluZSB4ZnNfaXRyYWNlX2VudHJ5KGlwKQlcCisJX3hmc19pdHJhY2VfZW50cnkoaXAsIF9fZnVuY19fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcykKKyNkZWZpbmUgeGZzX2l0cmFjZV9leGl0KGlwKQlcCisJX3hmc19pdHJhY2VfZXhpdChpcCwgX19mdW5jX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQorI2RlZmluZSB4ZnNfaXRyYWNlX2V4aXRfdGFnKGlwLCB0YWcpCVwKKwlfeGZzX2l0cmFjZV9leGl0KGlwLCB0YWcsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQorI2RlZmluZSB4ZnNfaXRyYWNlX3JlZihpcCkJXAorCV94ZnNfaXRyYWNlX3JlZihpcCwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcykKKworI2Vsc2UKKyNkZWZpbmUJeGZzX2l0cmFjZV9lbnRyeShhKQorI2RlZmluZQl4ZnNfaXRyYWNlX2V4aXQoYSkKKyNkZWZpbmUJeGZzX2l0cmFjZV9leGl0X3RhZyhhLCBiKQorI2RlZmluZQl4ZnNfaXRyYWNlX2hvbGQoYSwgYiwgYywgZCkKKyNkZWZpbmUJeGZzX2l0cmFjZV9yZWYoYSkKKyNkZWZpbmUJeGZzX2l0cmFjZV9yZWxlKGEsIGIsIGMsIGQpCisjZW5kaWYKKworI2RlZmluZSBJSE9MRChpcCkgXAorZG8geyBcCisJQVNTRVJUKGF0b21pY19yZWFkKCZWRlNfSShpcCktPmlfY291bnQpID4gMCkgOyBcCisJYXRvbWljX2luYygmKFZGU19JKGlwKS0+aV9jb3VudCkpOyBcCisJeGZzX2l0cmFjZV9ob2xkKChpcCksIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElSRUxFKGlwKSBcCitkbyB7IFwKKwl4ZnNfaXRyYWNlX3JlbGUoKGlwKSwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7IFwKKwlpcHV0KFZGU19JKGlwKSk7IFwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qCisgKiBGbGFncyBmb3IgeGZzX2lnZXQoKQorICovCisjZGVmaW5lIFhGU19JR0VUX0NSRUFURQkJMHgxCisjZGVmaW5lIFhGU19JR0VUX0JVTEtTVEFUCTB4MgorCitpbnQJCXhmc19pbm90b2JwKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc190cmFucyAqLAorCQkJICAgIHhmc19pbm9fdCwgc3RydWN0IHhmc19kaW5vZGUgKiosCisJCQkgICAgc3RydWN0IHhmc19idWYgKiosIGludCAqLCB1aW50KTsKK2ludAkJeGZzX2l0b2JwKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc190cmFucyAqLAorCQkJICBzdHJ1Y3QgeGZzX2lub2RlICosIHN0cnVjdCB4ZnNfZGlub2RlICoqLAorCQkJICBzdHJ1Y3QgeGZzX2J1ZiAqKiwgdWludCk7CitpbnQJCXhmc19pcmVhZChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCSAgc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfZGFkZHJfdCwgdWludCk7Cit2b2lkCQl4ZnNfZGlub2RlX2Zyb21fZGlzayhzdHJ1Y3QgeGZzX2ljZGlub2RlICosCisJCQkJICAgICBzdHJ1Y3QgeGZzX2Rpbm9kZSAqKTsKK3ZvaWQJCXhmc19kaW5vZGVfdG9fZGlzayhzdHJ1Y3QgeGZzX2Rpbm9kZSAqLAorCQkJCSAgIHN0cnVjdCB4ZnNfaWNkaW5vZGUgKik7Cit2b2lkCQl4ZnNfaWRlc3Ryb3lfZm9yayhzdHJ1Y3QgeGZzX2lub2RlICosIGludCk7Cit2b2lkCQl4ZnNfaWRhdGFfcmVhbGxvYyhzdHJ1Y3QgeGZzX2lub2RlICosIGludCwgaW50KTsKK3ZvaWQJCXhmc19pcm9vdF9yZWFsbG9jKHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50LCBpbnQpOworaW50CQl4ZnNfaXJlYWRfZXh0ZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50KTsKK2ludAkJeGZzX2lleHRlbnRzX2NvcHkoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfYm1idF9yZWNfdCAqLCBpbnQpOworCiB4ZnNfYm1idF9yZWNfaG9zdF90ICp4ZnNfaWV4dF9nZXRfZXh0KHhmc19pZm9ya190ICosIHhmc19leHRudW1fdCk7CiB2b2lkCQl4ZnNfaWV4dF9pbnNlcnQoeGZzX2lmb3JrX3QgKiwgeGZzX2V4dG51bV90LCB4ZnNfZXh0bnVtX3QsCiAJCQkJeGZzX2JtYnRfaXJlY190ICopOwpAQCAtNTYxLDcgKzYyNyw4IEBACiAjZGVmaW5lIHhmc19pcGluY291bnQoaXApCSgodW5zaWduZWQgaW50KSBhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpKQogCiAjaWZkZWYgREVCVUcKLXZvaWQJCXhmc19pc2l6ZV9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHhmc19pbm9kZV90ICosIHhmc19mc2l6ZV90KTsKK3ZvaWQJCXhmc19pc2l6ZV9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCQl4ZnNfZnNpemVfdCk7CiAjZWxzZQkvKiBERUJVRyAqLwogI2RlZmluZSB4ZnNfaXNpemVfY2hlY2sobXAsIGlwLCBpc2l6ZSkKICNlbmRpZgkvKiBERUJVRyAqLwpAQCAtNTc2LDI2ICs2NDMsNCBAQAogZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19pbm9kZV96b25lOwogZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19pbGlfem9uZTsKIAotLyoKLSAqIE1hbmFnZSB0aGUgaV9mbHVzaCBxdWV1ZSBlbWJlZGRlZCBpbiB0aGUgaW5vZGUuICBUaGlzIGNvbXBsZXRpb24KLSAqIHF1ZXVlIHN5bmNocm9uaXplcyBwcm9jZXNzZXMgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGUgaW4tY29yZQotICogaW5vZGUgYmFjayB0byBkaXNrLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgeGZzX2lmbG9jayh4ZnNfaW5vZGVfdCAqaXApCi17Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmaXAtPmlfZmx1c2gpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfaWZsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdCAqaXApCi17Ci0JcmV0dXJuIHRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZpcC0+aV9mbHVzaCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfaWZ1bmxvY2soeGZzX2lub2RlX3QgKmlwKQotewotCWNvbXBsZXRlKCZpcC0+aV9mbHVzaCk7Ci19Ci0KLSNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZgkvKiBfX1hGU19JTk9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggOTdjNzQ1Mi4uOTc3YzRhZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCXhmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoaXApOwogCiAJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZpcC0+aV9kOwotCXZlY3AtPmlfbGVuICA9IHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCk7CisJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpOwogCVhMT0dfVkVDX1NFVF9UWVBFKHZlY3AsIFhMT0dfUkVHX1RZUEVfSUNPUkUpOwogCXZlY3ArKzsKIAludmVjcysrOwpAQCAtMjk2LDkgKzI5Niw4IEBACiAJICogaGFzIGEgbmV3IHZlcnNpb24gbnVtYmVyLCB0aGVuIHdlIGRvbid0IGJvdGhlciBjb252ZXJ0aW5nIGJhY2suCiAJICovCiAJbXAgPSBpcC0+aV9tb3VudDsKLQlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xIHx8Ci0JICAgICAgIHhmc19zYl92ZXJzaW9uX2hhc25saW5rKCZtcC0+bV9zYikpOwotCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IDEgfHwgeGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoJm1wLT5tX3NiKSk7CisJaWYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAxKSB7CiAJCWlmICgheGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoJm1wLT5tX3NiKSkgewogCQkJLyoKIAkJCSAqIENvbnZlcnQgaXQgYmFjay4KQEAgLTMxMSw3ICszMTAsNyBAQAogCQkJICogc28ganVzdCBtYWtlIHRoZSBjb252ZXJzaW9uIHRvIHRoZSBuZXcgaW5vZGUKIAkJCSAqIGZvcm1hdCBwZXJtYW5lbnQuCiAJCQkgKi8KLQkJCWlwLT5pX2QuZGlfdmVyc2lvbiA9IFhGU19ESU5PREVfVkVSU0lPTl8yOworCQkJaXAtPmlfZC5kaV92ZXJzaW9uID0gMjsKIAkJCWlwLT5pX2QuZGlfb25saW5rID0gMDsKIAkJCW1lbXNldCgmKGlwLT5pX2QuZGlfcGFkWzBdKSwgMCwgc2l6ZW9mKGlwLT5pX2QuZGlfcGFkKSk7CiAJCX0KQEAgLTkzMiw2ICs5MzEsNyBAQAogCWlpcC0+aWxpX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9JTk9ERTsKIAlpaXAtPmlsaV9pdGVtLmxpX29wcyA9ICZ4ZnNfaW5vZGVfaXRlbV9vcHM7CiAJaWlwLT5pbGlfaXRlbS5saV9tb3VudHAgPSBtcDsKKwlpaXAtPmlsaV9pdGVtLmxpX2FpbHAgPSBtcC0+bV9haWw7CiAJaWlwLT5pbGlfaW5vZGUgPSBpcDsKIAogCS8qCkBAIC05NDIsOSArOTQyLDkgQEAKIAogCWlpcC0+aWxpX2Zvcm1hdC5pbGZfdHlwZSA9IFhGU19MSV9JTk9ERTsKIAlpaXAtPmlsaV9mb3JtYXQuaWxmX2lubyA9IGlwLT5pX2lubzsKLQlpaXAtPmlsaV9mb3JtYXQuaWxmX2Jsa25vID0gaXAtPmlfYmxrbm87Ci0JaWlwLT5pbGlfZm9ybWF0LmlsZl9sZW4gPSBpcC0+aV9sZW47Ci0JaWlwLT5pbGlfZm9ybWF0LmlsZl9ib2Zmc2V0ID0gaXAtPmlfYm9mZnNldDsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2Jsa25vID0gaXAtPmlfaW1hcC5pbV9ibGtubzsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2xlbiA9IGlwLT5pX2ltYXAuaW1fbGVuOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYm9mZnNldCA9IGlwLT5pX2ltYXAuaW1fYm9mZnNldDsKIH0KIAogLyoKQEAgLTk3Niw5ICs5NzYsOCBAQAogCXhmc19idWZfdAkJKmJwLAogCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCiB7Ci0JeGZzX2lub2RlX3QJKmlwOwotCi0JaXAgPSBpaXAtPmlsaV9pbm9kZTsKKwl4ZnNfaW5vZGVfdAkJKmlwID0gaWlwLT5pbGlfaW5vZGU7CisJc3RydWN0IHhmc19haWwJCSphaWxwID0gaWlwLT5pbGlfaXRlbS5saV9haWxwOwogCiAJLyoKIAkgKiBXZSBvbmx5IHdhbnQgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgaWYgaXQgaXMKQEAgLTk5MSwxNSArOTkwLDEyIEBACiAJICovCiAJaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJgogCSAgICAoaWlwLT5pbGlfaXRlbS5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSkgewotCQlzcGluX2xvY2soJmlwLT5pX21vdW50LT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJaWYgKGlpcC0+aWxpX2l0ZW0ubGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikgewotCQkJLyoKLQkJCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgotCQkJICovCi0JCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChpcC0+aV9tb3VudCwKLQkJCQkJICAgICAoeGZzX2xvZ19pdGVtX3QqKWlpcCk7CisJCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsICh4ZnNfbG9nX2l0ZW1fdCopaWlwKTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZpcC0+aV9tb3VudC0+bV9haWxfbG9jayk7CisJCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CiAJCX0KIAl9CiAKQEAgLTEwMzEsMjEgKzEwMjcsMjAgQEAKIHhmc19pZmx1c2hfYWJvcnQoCiAJeGZzX2lub2RlX3QJCSppcCkKIHsKLQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXAgPSBpcC0+aV9pdGVtcDsKIAl4ZnNfbW91bnRfdAkJKm1wOwogCiAJaWlwID0gaXAtPmlfaXRlbXA7CiAJbXAgPSBpcC0+aV9tb3VudDsKIAlpZiAoaWlwKSB7CisJCXN0cnVjdCB4ZnNfYWlsCSphaWxwID0gaWlwLT5pbGlfaXRlbS5saV9haWxwOwogCQlpZiAoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKLQkJCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOworCQkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgewotCQkJCS8qCi0JCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCi0JCQkJICovCi0JCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWlpcCk7CisJCQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCisJCQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopaWlwKTsKIAkJCX0gZWxzZQotCQkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCQl9CiAJCWlpcC0+aWxpX2xvZ2dlZCA9IDA7CiAJCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oCmluZGV4IDQwNTEzMDcuLjFmZjA0Y2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oCkBAIC0xMTIsNiArMTEyLDI0IEBACiAjZGVmaW5lCVhGU19JTElfSU9MT0NLRURfQU5ZICAgKFhGU19JTElfSU9MT0NLRURfRVhDTCB8IFhGU19JTElfSU9MT0NLRURfU0hBUkVEKQogCiAKKyNkZWZpbmUJWEZTX0lMT0dfRkJST09UKHcpCXhmc19pbG9nX2Zicm9vdCh3KQorc3RhdGljIGlubGluZSBpbnQgeGZzX2lsb2dfZmJyb290KGludCB3KQoreworCXJldHVybiAodyA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREJST09UIDogWEZTX0lMT0dfQUJST09UKTsKK30KKworI2RlZmluZQlYRlNfSUxPR19GRVhUKHcpCXhmc19pbG9nX2ZleHQodykKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19pbG9nX2ZleHQoaW50IHcpCit7CisJcmV0dXJuICh3ID09IFhGU19EQVRBX0ZPUksgPyBYRlNfSUxPR19ERVhUIDogWEZTX0lMT0dfQUVYVCk7Cit9CisKKyNkZWZpbmUJWEZTX0lMT0dfRkRBVEEodykJeGZzX2lsb2dfZmRhdGEodykKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19pbG9nX2ZkYXRhKGludCB3KQoreworCXJldHVybiAodyA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfRERBVEEgOiBYRlNfSUxPR19BREFUQSk7Cit9CisKICNpZmRlZiBfX0tFUk5FTF9fCiAKIHN0cnVjdCB4ZnNfYnVmOwpAQCAtMTQ4LDI2ICsxNjYsNiBAQAogfSB4ZnNfaW5vZGVfbG9nX2l0ZW1fdDsKIAogCi0jZGVmaW5lCVhGU19JTE9HX0ZEQVRBKHcpCXhmc19pbG9nX2ZkYXRhKHcpCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfaWxvZ19mZGF0YShpbnQgdykKLXsKLQlyZXR1cm4gKHcgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19JTE9HX0REQVRBIDogWEZTX0lMT0dfQURBVEEpOwotfQotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwotCi0jZGVmaW5lCVhGU19JTE9HX0ZCUk9PVCh3KQl4ZnNfaWxvZ19mYnJvb3QodykKLXN0YXRpYyBpbmxpbmUgaW50IHhmc19pbG9nX2Zicm9vdChpbnQgdykKLXsKLQlyZXR1cm4gKHcgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19JTE9HX0RCUk9PVCA6IFhGU19JTE9HX0FCUk9PVCk7Ci19Ci0KLSNkZWZpbmUJWEZTX0lMT0dfRkVYVCh3KQl4ZnNfaWxvZ19mZXh0KHcpCi1zdGF0aWMgaW5saW5lIGludCB4ZnNfaWxvZ19mZXh0KGludCB3KQotewotCXJldHVybiAodyA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREVYVCA6IFhGU19JTE9HX0FFWFQpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfaW5vZGVfY2xlYW4oeGZzX2lub2RlX3QgKmlwKQogewogCXJldHVybiAoIWlwLT5pX2l0ZW1wIHx8CkBAIC0xNzUsOSArMTczLDYgQEAKIAkgICAgICAgIWlwLT5pX3VwZGF0ZV9jb3JlOwogfQogCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KIGV4dGVybiB2b2lkIHhmc19pbm9kZV9pdGVtX2luaXQoc3RydWN0IHhmc19pbm9kZSAqLCBzdHJ1Y3QgeGZzX21vdW50ICopOwogZXh0ZXJuIHZvaWQgeGZzX2lub2RlX2l0ZW1fZGVzdHJveShzdHJ1Y3QgeGZzX2lub2RlICopOwogZXh0ZXJuIHZvaWQgeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IDY3ZjIyYjIuLjkxMTA2MmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTI5MCw3ICsyOTAsNiBAQAogeGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYigKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX2lub2RlX3QJKmlwLAotCXhmc19mc2l6ZV90CWlzaXplLAogCXhmc19leHRsZW5fdAlleHRzaXplLAogCXhmc19maWxlb2ZmX3QJKmxhc3RfZnNiKQogewpAQCAtMzA2LDE0ICszMDUsMTQgQEAKIAkgKiBzdHJpcGUgd2lkdGggYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QgdGhlIGFsbG9jYXRpb24gZW9mLgogCSAqLwogCWVsc2UgaWYgKG1wLT5tX3N3aWR0aCAmJiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfU1dBTExPQykgJiYKLQkgICAgICAgIChpc2l6ZSA+PSBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3N3aWR0aCkpKQorCSAgICAgICAgKGlwLT5pX3NpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9zd2lkdGgpKSkKIAkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NCgqbGFzdF9mc2IsIG1wLT5tX3N3aWR0aCk7CiAJLyoKIAkgKiBSb3VuZHVwIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gYSBzdHJpcGUgdW5pdCAobV9kYWxpZ24pIGJvdW5kYXJ5CiAJICogaWYgdGhlIGZpbGUgc2l6ZSBpcyA+PSBzdHJpcGUgdW5pdCBzaXplLCBhbmQgd2UgYXJlIGFsbG9jYXRpbmcgcGFzdAogCSAqIHRoZSBhbGxvY2F0aW9uIGVvZi4KIAkgKi8KLQllbHNlIGlmIChtcC0+bV9kYWxpZ24gJiYgKGlzaXplID49IFhGU19GU0JfVE9fQihtcCwgbXAtPm1fZGFsaWduKSkpCisJZWxzZSBpZiAobXAtPm1fZGFsaWduICYmIChpcC0+aV9zaXplID49IFhGU19GU0JfVE9fQihtcCwgbXAtPm1fZGFsaWduKSkpCiAJCW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQoKmxhc3RfZnNiLCBtcC0+bV9kYWxpZ24pOwogCiAJLyoKQEAgLTQwMyw3ICs0MDIsNiBAQAogCXhmc19maWxibGtzX3QJY291bnRfZnNiLCByZXNhbGlnbmVkOwogCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7CiAJeGZzX2V4dGxlbl90CWV4dHN6LCB0ZW1wOwotCXhmc19mc2l6ZV90CWlzaXplOwogCWludAkJbmltYXBzOwogCWludAkJYm1hcGlfZmxhZzsKIAlpbnQJCXF1b3RhX2ZsYWc7CkBAIC00MjYsMTUgKzQyNCwxMCBAQAogCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKTsKIAlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7CiAKLQlpc2l6ZSA9IGlwLT5pX3NpemU7Ci0JaWYgKGlwLT5pX25ld19zaXplID4gaXNpemUpCi0JCWlzaXplID0gaXAtPmlfbmV3X3NpemU7Ci0KIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCWlmICgob2Zmc2V0ICsgY291bnQpID4gaXNpemUpIHsKLQkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpcCwgaXNpemUsIGV4dHN6LAotCQkJCQkJCSZsYXN0X2ZzYik7CisJaWYgKChvZmZzZXQgKyBjb3VudCkgPiBpcC0+aV9zaXplKSB7CisJCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihtcCwgaXAsIGV4dHN6LCAmbGFzdF9mc2IpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yX291dDsKIAl9IGVsc2UgewpAQCAtNTU5LDcgKzU1Miw2IEBACiB4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUoCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfZnNpemVfdAlpc2l6ZSwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCiAJaW50CQlpb2ZsYWcsCkBAIC01NzMsNyArNTY1LDcgQEAKIAlpbnQJCW4sIGVycm9yLCBpbWFwczsKIAogCSpwcmVhbGxvYyA9IDA7Ci0JaWYgKChpb2ZsYWcgJiBCTUFQSV9TWU5DKSB8fCAob2Zmc2V0ICsgY291bnQpIDw9IGlzaXplKQorCWlmICgoaW9mbGFnICYgQk1BUElfU1lOQykgfHwgKG9mZnNldCArIGNvdW50KSA8PSBpcC0+aV9zaXplKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC02MTcsNyArNjA5LDYgQEAKIAl4ZnNfZmlsZW9mZl90CWlvYWxpZ247CiAJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOwogCXhmc19leHRsZW5fdAlleHRzejsKLQl4ZnNfZnNpemVfdAlpc2l6ZTsKIAlpbnQJCW5pbWFwczsKIAl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdOwogCWludAkJcHJlYWxsb2MsIGZzeW5jZWQgPSAwOwpAQCAtNjM3LDExICs2MjgsNyBAQAogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCiByZXRyeToKLQlpc2l6ZSA9IGlwLT5pX3NpemU7Ci0JaWYgKGlwLT5pX25ld19zaXplID4gaXNpemUpCi0JCWlzaXplID0gaXAtPmlfbmV3X3NpemU7Ci0KLQllcnJvciA9IHhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZShtcCwgaXAsIGlzaXplLCBvZmZzZXQsIGNvdW50LAorCWVycm9yID0geGZzX2lvbWFwX2VvZl93YW50X3ByZWFsbG9jYXRlKG1wLCBpcCwgb2Zmc2V0LCBjb3VudCwKIAkJCQlpb2ZsYWcsIGltYXAsIFhGU19XUklURV9JTUFQUywgJnByZWFsbG9jKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKQEAgLTY1NSw4ICs2NDIsNyBAQAogCX0KIAogCWlmIChwcmVhbGxvYyB8fCBleHRzeikgewotCQllcnJvciA9IHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IobXAsIGlwLCBpc2l6ZSwgZXh0c3osCi0JCQkJCQkJJmxhc3RfZnNiKTsKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpcCwgZXh0c3osICZsYXN0X2ZzYik7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5jIGIvZnMveGZzL3hmc19pdGFibGUuYwppbmRleCBjZjY3NTRhLi5lMTlkMGE4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5jCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAl9CiAKIAlBU1NFUlQoaXAgIT0gTlVMTCk7Ci0JQVNTRVJUKGlwLT5pX2Jsa25vICE9ICh4ZnNfZGFkZHJfdCkwKTsKKwlBU1NFUlQoaXAtPmlfaW1hcC5pbV9ibGtubyAhPSAwKTsKIAogCWRpYyA9ICZpcC0+aV9kOwogCkBAIC0xMjUsMTMgKzEyNSw5IEBACiB4ZnNfYnVsa3N0YXRfb25lX2Rpbm9kZSgKIAl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLwogCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSBudW1iZXIgdG8gZ2V0IGRhdGEgZm9yICovCi0JeGZzX2Rpbm9kZV90CSpkaXAsCQkvKiBkaW5vZGUgaW5vZGUgcG9pbnRlciAqLworCXhmc19kaW5vZGVfdAkqZGljLAkJLyogZGlub2RlIGlub2RlIHBvaW50ZXIgKi8KIAl4ZnNfYnN0YXRfdAkqYnVmKQkJLyogcmV0dXJuIGJ1ZmZlciAqLwogewotCXhmc19kaW5vZGVfY29yZV90ICpkaWM7CQkvKiBkaW5vZGUgY29yZSBpbmZvIHBvaW50ZXIgKi8KLQotCWRpYyA9ICZkaXAtPmRpX2NvcmU7Ci0KIAkvKgogCSAqIFRoZSBpbm9kZSBmb3JtYXQgY2hhbmdlZCB3aGVuIHdlIG1vdmVkIHRoZSBsaW5rIGNvdW50IGFuZAogCSAqIG1hZGUgaXQgMzIgYml0cyBsb25nLiAgSWYgdGhpcyBpcyBhbiBvbGQgZm9ybWF0IGlub2RlLApAQCAtMTQzLDcgKzEzOSw3IEBACiAJICogdGhlIG5ldyBmb3JtYXQuIFdlIGRvbid0IGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIgc28gdGhhdCB3ZQogCSAqIGNhbiBkaXN0aW5ndWlzaCB0aGlzIGZyb20gYSByZWFsIG5ldyBmb3JtYXQgaW5vZGUuCiAJICovCi0JaWYgKGRpYy0+ZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkgeworCWlmIChkaWMtPmRpX3ZlcnNpb24gPT0gMSkgewogCQlidWYtPmJzX25saW5rID0gYmUxNl90b19jcHUoZGljLT5kaV9vbmxpbmspOwogCQlidWYtPmJzX3Byb2ppZCA9IDA7CiAJfSBlbHNlIHsKQEAgLTE2Miw3ICsxNTgsNyBAQAogCWJ1Zi0+YnNfbXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfbXRpbWUudF9uc2VjKTsKIAlidWYtPmJzX2N0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfY3RpbWUudF9zZWMpOwogCWJ1Zi0+YnNfY3RpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfY3RpbWUudF9uc2VjKTsKLQlidWYtPmJzX3hmbGFncyA9IHhmc19kaWMyeGZsYWdzKGRpcCk7CisJYnVmLT5ic194ZmxhZ3MgPSB4ZnNfZGljMnhmbGFncyhkaWMpOwogCWJ1Zi0+YnNfZXh0c2l6ZSA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfZXh0c2l6ZSkgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CiAJYnVmLT5ic19leHRlbnRzID0gYmUzMl90b19jcHUoZGljLT5kaV9uZXh0ZW50cyk7CiAJYnVmLT5ic19nZW4gPSBiZTMyX3RvX2NwdShkaWMtPmRpX2dlbik7CkBAIC0xNzMsNyArMTY5LDcgQEAKIAogCXN3aXRjaCAoZGljLT5kaV9mb3JtYXQpIHsKIAljYXNlIFhGU19ESU5PREVfRk1UX0RFVjoKLQkJYnVmLT5ic19yZGV2ID0gYmUzMl90b19jcHUoZGlwLT5kaV91LmRpX2Rldik7CisJCWJ1Zi0+YnNfcmRldiA9IHhmc19kaW5vZGVfZ2V0X3JkZXYoZGljKTsKIAkJYnVmLT5ic19ibGtzaXplID0gQkxLREVWX0lPU0laRTsKIAkJYnVmLT5ic19ibG9ja3MgPSAwOwogCQlicmVhazsKQEAgLTE5MiwyNyArMTg4LDM0IEBACiAJfQogfQogCisvKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIHBvc2l0aXZlIGVycm9yICovCiBTVEFUSUMgaW50CiB4ZnNfYnVsa3N0YXRfb25lX2ZtdCgKIAl2b2lkCQkJX191c2VyICp1YnVmZmVyLAorCWludAkJCXVic2l6ZSwKKwlpbnQJCQkqdWJ1c2VkLAogCWNvbnN0IHhmc19ic3RhdF90CSpidWZmZXIpCiB7CisJaWYgKHVic2l6ZSA8IHNpemVvZigqYnVmZmVyKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9NRU0pOwogCWlmIChjb3B5X3RvX3VzZXIodWJ1ZmZlciwgYnVmZmVyLCBzaXplb2YoKmJ1ZmZlcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gc2l6ZW9mKCpidWZmZXIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGQVVMVCk7CisJaWYgKHVidXNlZCkKKwkJKnVidXNlZCA9IHNpemVvZigqYnVmZmVyKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFJldHVybiBzdGF0IGluZm9ybWF0aW9uIGZvciBvbmUgaW5vZGUuCiAgKiBSZXR1cm4gMCBpZiBvaywgZWxzZSBlcnJuby4KICAqLwotaW50CQkgICAgICAgCQkvKiBlcnJvciBzdGF0dXMgKi8KLXhmc19idWxrc3RhdF9vbmUoCitpbnQJCSAgIAkgICAgCQkvKiBlcnJvciBzdGF0dXMgKi8KK3hmc19idWxrc3RhdF9vbmVfaW50KAogCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCiAJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KIAl2b2lkCQlfX3VzZXIgKmJ1ZmZlciwJLyogYnVmZmVyIHRvIHBsYWNlIG91dHB1dCBpbiAqLwogCWludAkJdWJzaXplLAkJLyogc2l6ZSBvZiBidWZmZXIgKi8KLQl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBteSBwcml2YXRlIGRhdGEgKi8KKwlidWxrc3RhdF9vbmVfZm10X3BmIGZvcm1hdHRlciwJLyogZm9ybWF0dGVyLCBjb3B5IHRvIHVzZXIgKi8KIAl4ZnNfZGFkZHJfdAlibm8sCQkvKiBzdGFydGluZyBibm8gb2YgaW5vZGUgY2x1c3RlciAqLwogCWludAkJKnVidXNlZCwJLyogYnl0ZXMgdXNlZCBieSBtZSAqLwogCXZvaWQJCSpkaWJ1ZmYsCS8qIG9uLWRpc2sgaW5vZGUgYnVmZmVyICovCkBAIC0yMjEsMTUgKzIyNCwxMiBAQAogCXhmc19ic3RhdF90CSpidWY7CQkvKiByZXR1cm4gYnVmZmVyICovCiAJaW50CQllcnJvciA9IDA7CS8qIGVycm9yIHZhbHVlICovCiAJeGZzX2Rpbm9kZV90CSpkaXA7CQkvKiBkaW5vZGUgaW5vZGUgcG9pbnRlciAqLwotCWJ1bGtzdGF0X29uZV9mbXRfcGYgZm9ybWF0dGVyID0gcHJpdmF0ZV9kYXRhID8gOiB4ZnNfYnVsa3N0YXRfb25lX2ZtdDsKIAogCWRpcCA9ICh4ZnNfZGlub2RlX3QgKilkaWJ1ZmY7CiAJKnN0YXQgPSBCVUxLU1RBVF9SVl9OT1RISU5HOwogCiAJaWYgKCFidWZmZXIgfHwgeGZzX2ludGVybmFsX2ludW0obXAsIGlubykpCiAJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKLQlpZiAodWJzaXplIDwgc2l6ZW9mKCpidWYpKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CiAKIAlidWYgPSBrbWVtX2FsbG9jKHNpemVvZigqYnVmKSwgS01fU0xFRVApOwogCkBAIC0yNDQsMjEgKzI0NCwzNCBAQAogCQl4ZnNfYnVsa3N0YXRfb25lX2Rpbm9kZShtcCwgaW5vLCBkaXAsIGJ1Zik7CiAJfQogCi0JZXJyb3IgPSBmb3JtYXR0ZXIoYnVmZmVyLCBidWYpOwotCWlmIChlcnJvciA8IDApICB7Ci0JCWVycm9yID0gRUZBVUxUOworCWVycm9yID0gZm9ybWF0dGVyKGJ1ZmZlciwgdWJzaXplLCB1YnVzZWQsIGJ1Zik7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlOwotCX0KIAogCSpzdGF0ID0gQlVMS1NUQVRfUlZfRElET05FOwotCWlmICh1YnVzZWQpCi0JCSp1YnVzZWQgPSBlcnJvcjsKIAogIG91dF9mcmVlOgogCWttZW1fZnJlZShidWYpOwogCXJldHVybiBlcnJvcjsKIH0KIAoraW50Cit4ZnNfYnVsa3N0YXRfb25lKAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KKwl2b2lkCQlfX3VzZXIgKmJ1ZmZlciwJLyogYnVmZmVyIHRvIHBsYWNlIG91dHB1dCBpbiAqLworCWludAkJdWJzaXplLAkJLyogc2l6ZSBvZiBidWZmZXIgKi8KKwl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBteSBwcml2YXRlIGRhdGEgKi8KKwl4ZnNfZGFkZHJfdAlibm8sCQkvKiBzdGFydGluZyBibm8gb2YgaW5vZGUgY2x1c3RlciAqLworCWludAkJKnVidXNlZCwJLyogYnl0ZXMgdXNlZCBieSBtZSAqLworCXZvaWQJCSpkaWJ1ZmYsCS8qIG9uLWRpc2sgaW5vZGUgYnVmZmVyICovCisJaW50CQkqc3RhdCkJCS8qIEJVTEtTVEFUX1JWXy4uLiAqLworeworCXJldHVybiB4ZnNfYnVsa3N0YXRfb25lX2ludChtcCwgaW5vLCBidWZmZXIsIHVic2l6ZSwKKwkJCQkgICAgeGZzX2J1bGtzdGF0X29uZV9mbXQsIGJubywKKwkJCQkgICAgdWJ1c2VkLCBkaWJ1ZmYsIHN0YXQpOworfQorCiAvKgogICogVGVzdCB0byBzZWUgd2hldGhlciB3ZSBjYW4gdXNlIHRoZSBvbmRpc2sgaW5vZGUgZGlyZWN0bHksIGJhc2VkCiAgKiBvbiB0aGUgZ2l2ZW4gYnVsa3N0YXQgZmxhZ3MsIGZpbGxpbmcgaW4gZGlwcCBhY2NvcmRpbmdseS4KQEAgLTI4NywxOSArMzAwLDE5IEBACiAJICogdG8gZGlzayB5ZXQuIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB0aGF0IHdvdWxkIHJlcXVpcmUgYSBwcm9wZXIKIAkgKiBmaXggaW4gdGhlIGZ1dHVyZS4KIAkgKi8KLQlpZiAoYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDIHx8Ci0JICAgICFYRlNfRElOT0RFX0dPT0RfVkVSU0lPTihkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbikgfHwKLQkgICAgIWRpcC0+ZGlfY29yZS5kaV9tb2RlKQorCWlmIChiZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDIHx8CisJICAgICFYRlNfRElOT0RFX0dPT0RfVkVSU0lPTihkaXAtPmRpX3ZlcnNpb24pIHx8CisJICAgICFkaXAtPmRpX21vZGUpCiAJCXJldHVybiAwOwogCWlmIChmbGFncyAmIEJVTEtTVEFUX0ZHX1FVSUNLKSB7CiAJCSpkaXBwID0gZGlwOwogCQlyZXR1cm4gMTsKIAl9CiAJLyogQlVMS1NUQVRfRkdfSU5MSU5FOiBpZiBhdHRyIGZvcmsgaXMgbG9jYWwsIG9yIG5vdCB0aGVyZSwgdXNlIGl0ICovCi0JYWZvcm1hdCA9IGRpcC0+ZGlfY29yZS5kaV9hZm9ybWF0OworCWFmb3JtYXQgPSBkaXAtPmRpX2Fmb3JtYXQ7CiAJaWYgKChYRlNfREZPUktfUShkaXApID09IDApIHx8CiAJICAgIChhZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB8fAotCSAgICAoYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmICFkaXAtPmRpX2NvcmUuZGlfYW5leHRlbnRzKSkgeworCSAgICAoYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmICFkaXAtPmRpX2FuZXh0ZW50cykpIHsKIAkJKmRpcHAgPSBkaXA7CiAJCXJldHVybiAxOwogCX0KQEAgLTM1OSw3ICszNzIsNiBAQAogCWludAkJCXVidXNlZDsJLyogYnl0ZXMgdXNlZCBieSBmb3JtYXR0ZXIgKi8KIAl4ZnNfYnVmX3QJCSpicDsJLyogcHRyIHRvIG9uLWRpc2sgaW5vZGUgY2x1c3RlciBidWYgKi8KIAl4ZnNfZGlub2RlX3QJCSpkaXA7CS8qIHB0ciBpbnRvIGJwIGZvciBzcGVjaWZpYyBpbm9kZSAqLwotCXhmc19pbm9kZV90CQkqaXA7CS8qIHB0ciB0byBpbi1jb3JlIGlub2RlIHN0cnVjdCAqLwogCiAJLyoKIAkgKiBHZXQgdGhlIGxhc3QgaW5vZGUgdmFsdWUsIHNlZSBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCkBAIC00MTYsOCArNDI4LDcgQEAKIAkJLyoKIAkJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBidHJlZSBjdXJzb3IgZm9yIGlhbGxvYyBidHJlZS4KIAkJICovCi0JCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgTlVMTCwgYWdicCwgYWdubywgWEZTX0JUTlVNX0lOTywKLQkJCQkJCSh4ZnNfaW5vZGVfdCAqKTAsIDApOworCQljdXIgPSB4ZnNfaW5vYnRfaW5pdF9jdXJzb3IobXAsIE5VTEwsIGFnYnAsIGFnbm8pOwogCQlpcmJwID0gaXJidWY7CiAJCWlyYnVmZW5kID0gaXJidWYgKyBuaXJidWY7CiAJCWVuZF9vZl9hZyA9IDA7CkBAIC00NzIsNyArNDgzLDcgQEAKIAkJCSAqIEluIGFueSBjYXNlLCBpbmNyZW1lbnQgdG8gdGhlIG5leHQgcmVjb3JkLgogCQkJICovCiAJCQlpZiAoIWVycm9yKQotCQkJCWVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZ0bXApOworCQkJCWVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudChjdXIsIDAsICZ0bXApOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFN0YXJ0IG9mIGFnLiAgTG9va3VwIHRoZSBmaXJzdCBpbm9kZSBjaHVuay4KQEAgLTUzOSw3ICs1NTAsNyBAQAogCQkJICogU2V0IGFnaW5vIHRvIGFmdGVyIHRoaXMgY2h1bmsgYW5kIGJ1bXAgdGhlIGN1cnNvci4KIAkJCSAqLwogCQkJYWdpbm8gPSBnaW5vICsgWEZTX0lOT0RFU19QRVJfQ0hVTks7Ci0JCQllcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmdG1wKTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudChjdXIsIDAsICZ0bXApOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KIAkJLyoKQEAgLTU4Niw2ICs1OTcsOCBAQAogCiAJCQkJCWlmIChmbGFncyAmIChCVUxLU1RBVF9GR19RVUlDSyB8CiAJCQkJCQkgICAgIEJVTEtTVEFUX0ZHX0lOTElORSkpIHsKKwkJCQkJCWludCBvZmZzZXQ7CisKIAkJCQkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sCiAJCQkJCQkJCSAgICAgICBhZ2lubyk7CiAJCQkJCQlibm8gPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLApAQCAtNTk0LDIxICs2MDcsMTUgQEAKIAkJCQkJCS8qCiAJCQkJCQkgKiBHZXQgdGhlIGlub2RlIGNsdXN0ZXIgYnVmZmVyCiAJCQkJCQkgKi8KLQkJCQkJCUFTU0VSVCh4ZnNfaW5vZGVfem9uZSAhPSBOVUxMKTsKLQkJCQkJCWlwID0ga21lbV96b25lX3phbGxvYyh4ZnNfaW5vZGVfem9uZSwKLQkJCQkJCQkJICAgICAgS01fU0xFRVApOwotCQkJCQkJaXAtPmlfaW5vID0gaW5vOwotCQkJCQkJaXAtPmlfbW91bnQgPSBtcDsKLQkJCQkJCXNwaW5fbG9ja19pbml0KCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJCQkJCWlmIChicCkKIAkJCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKLQkJCQkJCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwKLQkJCQkJCQkJJmRpcCwgJmJwLCBibm8sCi0JCQkJCQkJCVhGU19JTUFQX0JVTEtTVEFULAotCQkJCQkJCQlYRlNfQlVGX0xPQ0spOworCisJCQkJCQllcnJvciA9IHhmc19pbm90b2JwKG1wLCBOVUxMLCBpbm8sICZkaXAsCisJCQkJCQkJCSAgICAmYnAsICZvZmZzZXQsCisJCQkJCQkJCSAgICBYRlNfSUdFVF9CVUxLU1RBVCk7CisKIAkJCQkJCWlmICghZXJyb3IpCi0JCQkJCQkJY2x1c3RpZHggPSBpcC0+aV9ib2Zmc2V0IC8gbXAtPm1fc2Iuc2JfaW5vZGVzaXplOwotCQkJCQkJa21lbV96b25lX2ZyZWUoeGZzX2lub2RlX3pvbmUsIGlwKTsKKwkJCQkJCQljbHVzdGlkeCA9IG9mZnNldCAvIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZTsKIAkJCQkJCWlmIChYRlNfVEVTVF9FUlJPUihlcnJvciAhPSAwLAogCQkJCQkJCQkgICBtcCwgWEZTX0VSUlRBR19CVUxLU1RBVF9SRUFEX0NIVU5LLAogCQkJCQkJCQkgICBYRlNfUkFORE9NX0JVTEtTVEFUX1JFQURfQ0hVTkspKSB7CkBAIC04NDIsOCArODQ5LDcgQEAKIAkJCQlhZ2lubyA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIE5VTEwsIGFnYnAsIGFnbm8sCi0JCQkJWEZTX0JUTlVNX0lOTywgKHhmc19pbm9kZV90ICopMCwgMCk7CisJCQljdXIgPSB4ZnNfaW5vYnRfaW5pdF9jdXJzb3IobXAsIE5VTEwsIGFnYnAsIGFnbm8pOwogCQkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgYWdpbm8sIDAsIDAsICZ0bXApOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOwpAQCAtODg3LDcgKzg5Myw3IEBACiAJCQlidWZpZHggPSAwOwogCQl9CiAJCWlmIChsZWZ0KSB7Ci0JCQllcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmdG1wKTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudChjdXIsIDAsICZ0bXApOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOwogCQkJCWN1ciA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5oIGIvZnMveGZzL3hmc19pdGFibGUuaAppbmRleCBhMWYxOGZjLi4xZmIwNGU3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5oCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmgKQEAgLTcxLDkgKzcxLDIzIEBACiAKIHR5cGVkZWYgaW50ICgqYnVsa3N0YXRfb25lX2ZtdF9wZikoICAvKiB1c2VkIHNpemUgaW4gYnl0ZXMgb3IgbmVnYXRpdmUgZXJyb3IgKi8KIAl2b2lkCQkJX191c2VyICp1YnVmZmVyLCAvKiBidWZmZXIgdG8gd3JpdGUgdG8gKi8KKwlpbnQJCQl1YnNpemUsCQkgLyogcmVtYWluaW5nIHVzZXIgYnVmZmVyIHN6ICovCisJaW50CQkJKnVidXNlZCwJIC8qIGJ5dGVzIHVzZWQgYnkgZm9ybWF0dGVyICovCiAJY29uc3QgeGZzX2JzdGF0X3QJKmJ1ZmZlcik7ICAgICAgICAvKiBidWZmZXIgdG8gcmVhZCBmcm9tICovCiAKIGludAoreGZzX2J1bGtzdGF0X29uZV9pbnQoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfaW5vX3QJCWlubywKKwl2b2lkCQkJX191c2VyICpidWZmZXIsCisJaW50CQkJdWJzaXplLAorCWJ1bGtzdGF0X29uZV9mbXRfcGYJZm9ybWF0dGVyLAorCXhmc19kYWRkcl90CQlibm8sCisJaW50CQkJKnVidXNlZCwKKwl2b2lkCQkJKmRpYnVmZiwKKwlpbnQJCQkqc3RhdCk7CisKK2ludAogeGZzX2J1bGtzdGF0X29uZSgKIAl4ZnNfbW91bnRfdAkJKm1wLAogCXhmc19pbm9fdAkJaW5vLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuYyBiL2ZzL3hmcy94ZnNfbG9nLmMKaW5kZXggMzYwOGEwZi4uZjQ3MjZmNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2cuYworKysgYi9mcy94ZnMveGZzX2xvZy5jCkBAIC0xMDAsMTIgKzEwMCwxMSBAQAogCiAKIC8qIGxvY2FsIHRpY2tldCBmdW5jdGlvbnMgKi8KLVNUQVRJQyB4bG9nX3RpY2tldF90CSp4bG9nX3RpY2tldF9nZXQoeGxvZ190ICpsb2csCitTVEFUSUMgeGxvZ190aWNrZXRfdAkqeGxvZ190aWNrZXRfYWxsb2MoeGxvZ190ICpsb2csCiAJCQkJCSBpbnQJdW5pdF9ieXRlcywKIAkJCQkJIGludAljb3VudCwKIAkJCQkJIGNoYXIJY2xpZW50aWQsCiAJCQkJCSB1aW50CWZsYWdzKTsKLVNUQVRJQyB2b2lkCQl4bG9nX3RpY2tldF9wdXQoeGxvZ190ICpsb2csIHhsb2dfdGlja2V0X3QgKnRpY2tldCk7CiAKICNpZiBkZWZpbmVkKERFQlVHKQogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZGVzdF9wdHIoeGxvZ190ICpsb2csIF9fcHNpbnRfdCBwdHIpOwpAQCAtMzYwLDcgKzM1OSw3IEBACiAJCSAqLwogCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGZzX2xvZ19kb25lOiAobm9uLXBlcm1hbmVudCkiKTsKIAkJeGxvZ191bmdyYW50X2xvZ19zcGFjZShsb2csIHRpY2tldCk7Ci0JCXhsb2dfdGlja2V0X3B1dChsb2csIHRpY2tldCk7CisJCXhmc19sb2dfdGlja2V0X3B1dCh0aWNrZXQpOwogCX0gZWxzZSB7CiAJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4ZnNfbG9nX2RvbmU6IChwZXJtYW5lbnQpIik7CiAJCXhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZShsb2csIHRpY2tldCk7CkBAIC01MTQsNyArNTEzLDcgQEAKIAkJcmV0dmFsID0geGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CiAJfSBlbHNlIHsKIAkJLyogbWF5IHNsZWVwIGlmIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSB0aWNrZXRzICovCi0JCWludGVybmFsX3RpY2tldCA9IHhsb2dfdGlja2V0X2dldChsb2csIHVuaXRfYnl0ZXMsIGNudCwKKwkJaW50ZXJuYWxfdGlja2V0ID0geGxvZ190aWNrZXRfYWxsb2MobG9nLCB1bml0X2J5dGVzLCBjbnQsCiAJCQkJCQkgIGNsaWVudCwgZmxhZ3MpOwogCQlpZiAoIWludGVybmFsX3RpY2tldCkKIAkJCXJldHVybiBYRlNfRVJST1IoRU5PTUVNKTsKQEAgLTU3MiwxMiArNTcxLDEyIEBACiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBBSUwgbm93IHdlIGhhdmUgYSBsb2cuCiAJICovCi0Jc3Bpbl9sb2NrX2luaXQoJm1wLT5tX2FpbF9sb2NrKTsKIAllcnJvciA9IHhmc190cmFuc19haWxfaW5pdChtcCk7CiAJaWYgKGVycm9yKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogQUlMIGluaXRpYWxpc2F0aW9uIGZhaWxlZDogZXJyb3IgJWQiLCBlcnJvcik7CiAJCWdvdG8gZXJyb3I7CiAJfQorCW1wLT5tX2xvZy0+bF9haWxwID0gbXAtPm1fYWlsOwogCiAJLyoKIAkgKiBza2lwIGxvZyByZWNvdmVyeSBvbiBhIG5vcmVjb3ZlcnkgbW91bnQuICBwcmV0ZW5kIGl0IGFsbApAQCAtNzMwLDggKzcyOSw4IEBACiAJCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCWljbG9nID0gbG9nLT5sX2ljbG9nOwogCQlhdG9taWNfaW5jKCZpY2xvZy0+aWNfcmVmY250KTsKLQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl4bG9nX3N0YXRlX3dhbnRfc3luYyhsb2csIGljbG9nKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQllcnJvciA9IHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKTsKIAogCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwpAQCAtNzQ5LDcgKzc0OCw3IEBACiAJCWlmICh0aWMpIHsKIAkJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ1bm1vdW50IHJlYyIpOwogCQkJeGxvZ191bmdyYW50X2xvZ19zcGFjZShsb2csIHRpYyk7Ci0JCQl4bG9nX3RpY2tldF9wdXQobG9nLCB0aWMpOworCQkJeGZzX2xvZ190aWNrZXRfcHV0KHRpYyk7CiAJCX0KIAl9IGVsc2UgewogCQkvKgpAQCAtNzY4LDkgKzc2Nyw5IEBACiAJCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCWljbG9nID0gbG9nLT5sX2ljbG9nOwogCQlhdG9taWNfaW5jKCZpY2xvZy0+aWNfcmVmY250KTsKLQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCXhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCWVycm9yID0gIHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKTsKIAogCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwpAQCAtOTA2LDcgKzkwNSw3IEBACiBpbnQKIHhmc19sb2dfbmVlZF9jb3ZlcmVkKHhmc19tb3VudF90ICptcCkKIHsKLQlpbnQJCW5lZWRlZCA9IDAsIGdlbjsKKwlpbnQJCW5lZWRlZCA9IDA7CiAJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOwogCiAJaWYgKCF4ZnNfZnNfd3JpdGFibGUobXApKQpAQCAtOTE1LDcgKzkxNCw3IEBACiAJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAlpZiAoKChsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQpIHx8CiAJCShsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQyKSkKLQkJCSYmICF4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKQorCQkJJiYgIXhmc190cmFuc19haWxfdGFpbChsb2ctPmxfYWlscCkKIAkJCSYmIHhsb2dfaWNsb2dzX2VtcHR5KGxvZykpIHsKIAkJaWYgKGxvZy0+bF9jb3ZlcmVkX3N0YXRlID09IFhMT0dfU1RBVEVfQ09WRVJfTkVFRCkKIAkJCWxvZy0+bF9jb3ZlcmVkX3N0YXRlID0gWExPR19TVEFURV9DT1ZFUl9ET05FOwpAQCAtOTUyLDcgKzk1MSw3IEBACiAJeGZzX2xzbl90IHRhaWxfbHNuOwogCXhsb2dfdAkgICpsb2cgPSBtcC0+bV9sb2c7CiAKLQl0YWlsX2xzbiA9IHhmc190cmFuc190YWlsX2FpbChtcCk7CisJdGFpbF9sc24gPSB4ZnNfdHJhbnNfYWlsX3RhaWwobXAtPm1fYWlsKTsKIAlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAlpZiAodGFpbF9sc24gIT0gMCkgewogCQlsb2ctPmxfdGFpbF9sc24gPSB0YWlsX2xzbjsKQEAgLTEwMzAsMTIgKzEwMjksNiBAQAogCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHVuc2lnbmVkIGxvbmcpID09ICh1bnNpZ25lZCBsb25nKSAyKTsKIAlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykxKTsKIAlhYm9ydGVkID0gMDsKLQotCS8qCi0JICogU29tZSB2ZXJzaW9ucyBvZiBjcHAgYmFyZiBvbiB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gb2YKLQkgKiBpY19sb2cgLT4gaGljX2ZpZWxkcy5pY19sb2cgYW5kIGV4cGFuZCBpY19sb2cgdHdpY2Ugd2hlbgotCSAqIGl0IGlzIHBhc3NlZCB0aHJvdWdoIHR3byBtYWNyb3MuICBXb3JrYXJvdW5kIGJyb2tlbiBjcHAuCi0JICovCiAJbCA9IGljbG9nLT5pY19sb2c7CiAKIAkvKgpAQCAtMTMwMiw3ICsxMjk1LDcgQEAKIAkJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4bG9nX2Jkc3RyYXRfY2IpOwogCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykxKTsKIAkJaWNsb2ctPmljX2JwID0gYnA7Ci0JCWljbG9nLT5oaWNfZGF0YSA9IGJwLT5iX2FkZHI7CisJCWljbG9nLT5pY19kYXRhID0gYnAtPmJfYWRkcjsKICNpZmRlZiBERUJVRwogCQlsb2ctPmxfaWNsb2dfYmFrW2ldID0gKHhmc19jYWRkcl90KSYoaWNsb2ctPmljX2hlYWRlcik7CiAjZW5kaWYKQEAgLTEzMjIsNyArMTMxNSw3IEBACiAJCWF0b21pY19zZXQoJmljbG9nLT5pY19yZWZjbnQsIDApOwogCQlzcGluX2xvY2tfaW5pdCgmaWNsb2ctPmljX2NhbGxiYWNrX2xvY2spOwogCQlpY2xvZy0+aWNfY2FsbGJhY2tfdGFpbCA9ICYoaWNsb2ctPmljX2NhbGxiYWNrKTsKLQkJaWNsb2ctPmljX2RhdGFwID0gKGNoYXIgKilpY2xvZy0+aGljX2RhdGEgKyBsb2ctPmxfaWNsb2dfaHNpemU7CisJCWljbG9nLT5pY19kYXRhcCA9IChjaGFyICopaWNsb2ctPmljX2RhdGEgKyBsb2ctPmxfaWNsb2dfaHNpemU7CiAKIAkJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGljbG9nLT5pY19icCkpOwogCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShpY2xvZy0+aWNfYnApIDw9IDApOwpAQCAtMTQ0Niw3ICsxNDM5LDcgQEAKICAgICAgKi8KICAgICBpZiAodGhyZXNob2xkX2xzbiAmJgogCSFYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCSAgICB4ZnNfdHJhbnNfcHVzaF9haWwobXAsIHRocmVzaG9sZF9sc24pOworCSAgICB4ZnNfdHJhbnNfYWlsX3B1c2gobG9nLT5sX2FpbHAsIHRocmVzaG9sZF9sc24pOwogfQkvKiB4bG9nX2dyYW50X3B1c2hfYWlsICovCiAKIApAQCAtMTk5MSw3ICsxOTg0LDkgQEAKIAkJaWYgKGljbG9nLT5pY19zaXplIC0gbG9nX29mZnNldCA8PSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCkpIHsKIAkJICAgIHhsb2dfc3RhdGVfZmluaXNoX2NvcHkobG9nLCBpY2xvZywgcmVjb3JkX2NudCwgZGF0YV9jbnQpOwogCQkgICAgcmVjb3JkX2NudCA9IGRhdGFfY250ID0gMDsKKwkJICAgIHNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCSAgICB4bG9nX3N0YXRlX3dhbnRfc3luYyhsb2csIGljbG9nKTsKKwkJICAgIHNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJICAgIGlmIChjb21taXRfaWNsb2cpIHsKIAkJCUFTU0VSVChmbGFncyAmIFhMT0dfQ09NTUlUX1RSQU5TKTsKIAkJCSpjb21taXRfaWNsb2cgPSBpY2xvZzsKQEAgLTMyMDAsNyArMzE5NSw3IEBACiBTVEFUSUMgdm9pZAogeGxvZ19zdGF0ZV93YW50X3N5bmMoeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZykKIHsKLQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOworCUFTU0VSVChzcGluX2lzX2xvY2tlZCgmbG9nLT5sX2ljbG9nbG9jaykpOwogCiAJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRSkgewogCQl4bG9nX3N0YXRlX3N3aXRjaF9pY2xvZ3MobG9nLCBpY2xvZywgMCk7CkBAIC0zMjA4LDEwICszMjAzLDcgQEAKIAkJQVNTRVJUKGljbG9nLT5pY19zdGF0ZSAmCiAJCQkoWExPR19TVEFURV9XQU5UX1NZTkN8WExPR19TVEFURV9JT0VSUk9SKSk7CiAJfQotCi0Jc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwotfQkvKiB4bG9nX3N0YXRlX3dhbnRfc3luYyAqLwotCit9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjIyLDIyICszMjE0LDMzIEBACiAgKi8KIAogLyoKLSAqIEZyZWUgYSB1c2VkIHRpY2tldC4KKyAqIEZyZWUgYSB1c2VkIHRpY2tldCB3aGVuIGl0J3MgcmVmY291bnQgZmFsbHMgdG8gemVyby4KICAqLwotU1RBVElDIHZvaWQKLXhsb2dfdGlja2V0X3B1dCh4bG9nX3QJCSpsb2csCi0JCXhsb2dfdGlja2V0X3QJKnRpY2tldCkKK3ZvaWQKK3hmc19sb2dfdGlja2V0X3B1dCgKKwl4bG9nX3RpY2tldF90CSp0aWNrZXQpCiB7Ci0Jc3ZfZGVzdHJveSgmdGlja2V0LT50X3dhaXQpOwotCWttZW1fem9uZV9mcmVlKHhmc19sb2dfdGlja2V0X3pvbmUsIHRpY2tldCk7Ci19CS8qIHhsb2dfdGlja2V0X3B1dCAqLworCUFTU0VSVChhdG9taWNfcmVhZCgmdGlja2V0LT50X3JlZikgPiAwKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdGlja2V0LT50X3JlZikpIHsKKwkJc3ZfZGVzdHJveSgmdGlja2V0LT50X3dhaXQpOworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfbG9nX3RpY2tldF96b25lLCB0aWNrZXQpOworCX0KK30KIAoreGxvZ190aWNrZXRfdCAqCit4ZnNfbG9nX3RpY2tldF9nZXQoCisJeGxvZ190aWNrZXRfdAkqdGlja2V0KQoreworCUFTU0VSVChhdG9taWNfcmVhZCgmdGlja2V0LT50X3JlZikgPiAwKTsKKwlhdG9taWNfaW5jKCZ0aWNrZXQtPnRfcmVmKTsKKwlyZXR1cm4gdGlja2V0OworfQogCiAvKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBuZXcgbG9nIHRpY2tldC4KICAqLwogU1RBVElDIHhsb2dfdGlja2V0X3QgKgoteGxvZ190aWNrZXRfZ2V0KHhsb2dfdAkJKmxvZywKK3hsb2dfdGlja2V0X2FsbG9jKHhsb2dfdAkJKmxvZywKIAkJaW50CQl1bml0X2J5dGVzLAogCQlpbnQJCWNudCwKIAkJY2hhcgkJY2xpZW50LApAQCAtMzMwOCw2ICszMzExLDcgQEAKIAkJdW5pdF9ieXRlcyArPSAyKkJCU0laRTsKICAgICAgICAgfQogCisJYXRvbWljX3NldCgmdGljLT50X3JlZiwgMSk7CiAJdGljLT50X3VuaXRfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2N1cnJfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2NudAkJPSBjbnQ7CkBAIC0zMzIzLDcgKzMzMjcsNyBAQAogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWMpOwogCiAJcmV0dXJuIHRpYzsKLX0JLyogeGxvZ190aWNrZXRfZ2V0ICovCit9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzQ1Miw3ICszNDU2LDcgQEAKIAlwdHIgPSBpY2xvZy0+aWNfZGF0YXA7CiAJYmFzZV9wdHIgPSBwdHI7CiAJb3BoZWFkID0gKHhsb2dfb3BfaGVhZGVyX3QgKilwdHI7Ci0JeGhkciA9ICh4bG9nX2luX2NvcmVfMl90ICopJmljbG9nLT5pY19oZWFkZXI7CisJeGhkciA9IGljbG9nLT5pY19kYXRhOwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlvcGhlYWQgPSAoeGxvZ19vcF9oZWFkZXJfdCAqKXB0cjsKIApAQCAtMzU1OCw3ICszNTYyLDggQEAKIAlpZiAoIWxvZyB8fAogCSAgICBsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkgewogCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRlNfU0hVVERPV047Ci0JCVhGU19CVUZfRE9ORShtcC0+bV9zYl9icCk7CisJCWlmIChtcC0+bV9zYl9icCkKKwkJCVhGU19CVUZfRE9ORShtcC0+bV9zYl9icCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzU3OSw3ICszNTg0LDkgQEAKIAlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9GU19TSFVURE9XTjsKLQlYRlNfQlVGX0RPTkUobXAtPm1fc2JfYnApOworCWlmIChtcC0+bV9zYl9icCkKKwkJWEZTX0JVRl9ET05FKG1wLT5tX3NiX2JwKTsKKwogCS8qCiAJICogVGhpcyBmbGFnIGlzIHNvcnQgb2YgcmVkdW5kYW50IGJlY2F1c2Ugb2YgdGhlIG1vdW50IGZsYWcsIGJ1dAogCSAqIGl0J3MgZ29vZCB0byBtYWludGFpbiB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSBsb2cgYW5kIHRoZSByZXN0CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5oIGIvZnMveGZzL3hmc19sb2cuaAppbmRleCBkNDdiOTFmLi44YTNlODRlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmgKQEAgLTEzNCw2ICsxMzQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIC8qIExvZyBtYW5hZ2VyIGludGVyZmFjZXMgKi8KIHN0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGxvZ190aWNrZXQ7CiB4ZnNfbHNuX3QgeGZzX2xvZ19kb25lKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAogCQkgICAgICAgeGZzX2xvZ190aWNrZXRfdCB0aWNrZXQsCiAJCSAgICAgICB2b2lkCQkqKmljbG9nLApAQCAtMTc3LDYgKzE3OCw5IEBACiAKIHZvaWQJICB4bG9nX2lvZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqKTsKIAorc3RydWN0IHhsb2dfdGlja2V0ICogeGZzX2xvZ190aWNrZXRfZ2V0KHN0cnVjdCB4bG9nX3RpY2tldCAqdGlja2V0KTsKK3ZvaWQJICB4ZnNfbG9nX3RpY2tldF9wdXQoc3RydWN0IHhsb2dfdGlja2V0ICp0aWNrZXQpOworCiAjZW5kaWYKIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19wcml2LmggYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKaW5kZXggZTdkOGY4NC4uNjU0MTY3YiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcHJpdi5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaApAQCAtMjQ1LDYgKzI0NSw3IEBACiAJc3RydWN0IHhsb2dfdGlja2V0ICp0X25leHQ7CSAvKgkJCSAgICAgICAgIDo0fDggKi8KIAlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfcHJldjsJIC8qCQkJCSA6NHw4ICovCiAJeGxvZ190aWRfdAkgICB0X3RpZDsJIC8qIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIJIDogNCAgKi8KKwlhdG9taWNfdAkgICB0X3JlZjsJIC8qIHRpY2tldCByZWZlcmVuY2UgY291bnQgICAgICAgOiA0ICAqLwogCWludAkJICAgdF9jdXJyX3JlczsJIC8qIGN1cnJlbnQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgOiA0ICAqLwogCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICAqLwogCWNoYXIJCSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICAqLwpAQCAtMzA5LDYgKzMxMCwxNiBAQAogfSB4bG9nX3JlY19leHRfaGVhZGVyX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBRdWl0ZSBtaXNuYW1lZCwgYmVjYXVzZSB0aGlzIHVuaW9uIGxheXMgb3V0IHRoZSBhY3R1YWwgb24tZGlzayBsb2cgYnVmZmVyLgorICovCit0eXBlZGVmIHVuaW9uIHhsb2dfaW5fY29yZTIgeworCXhsb2dfcmVjX2hlYWRlcl90CWhpY19oZWFkZXI7CisJeGxvZ19yZWNfZXh0X2hlYWRlcl90CWhpY194aGVhZGVyOworCWNoYXIJCQloaWNfc2VjdG9yW1hMT0dfSEVBREVSX1NJWkVdOworfSB4bG9nX2luX2NvcmVfMl90OworCiAvKgogICogLSBBIGxvZyByZWNvcmQgaGVhZGVyIGlzIDUxMiBieXRlcy4gIFRoZXJlIGlzIHBsZW50eSBvZiByb29tIHRvIGdyb3cgdGhlCiAgKgl4bG9nX3JlY19oZWFkZXJfdCBpbnRvIHRoZSByZXNlcnZlZCBzcGFjZS4KQEAgLTMzOCw3ICszNDksNyBAQAogICogV2UnbGwgcHV0IGFsbCB0aGUgcmVhZC1vbmx5IGFuZCBsX2ljbG9nbG9jayBmaWVsZHMgaW4gdGhlIGZpcnN0IGNhY2hlbGluZSwKICAqIGFuZCBtb3ZlIGV2ZXJ5dGhpbmcgZWxzZSBvdXQgdG8gc3Vic2VxdWVudCBjYWNoZWxpbmVzLgogICovCi10eXBlZGVmIHN0cnVjdCB4bG9nX2ljbG9nX2ZpZWxkcyB7Cit0eXBlZGVmIHN0cnVjdCB4bG9nX2luX2NvcmUgewogCXN2X3QJCQlpY19mb3JjZV93YWl0OwogCXN2X3QJCQlpY193cml0ZV93YWl0OwogCXN0cnVjdCB4bG9nX2luX2NvcmUJKmljX25leHQ7CkBAIC0zNjEsNDEgKzM3MiwxMSBAQAogCiAJLyogcmVmZXJlbmNlIGNvdW50cyBuZWVkIHRoZWlyIG93biBjYWNoZWxpbmUgKi8KIAlhdG9taWNfdAkJaWNfcmVmY250IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci19IHhsb2dfaWNsb2dfZmllbGRzX3Q7Ci0KLXR5cGVkZWYgdW5pb24geGxvZ19pbl9jb3JlMiB7Ci0JeGxvZ19yZWNfaGVhZGVyX3QJaGljX2hlYWRlcjsKLQl4bG9nX3JlY19leHRfaGVhZGVyX3QJaGljX3hoZWFkZXI7Ci0JY2hhcgkJCWhpY19zZWN0b3JbWExPR19IRUFERVJfU0laRV07Ci19IHhsb2dfaW5fY29yZV8yX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHhsb2dfaW5fY29yZSB7Ci0JeGxvZ19pY2xvZ19maWVsZHNfdAloaWNfZmllbGRzOwotCXhsb2dfaW5fY29yZV8yX3QJKmhpY19kYXRhOworCXhsb2dfaW5fY29yZV8yX3QJKmljX2RhdGE7CisjZGVmaW5lIGljX2hlYWRlcglpY19kYXRhLT5oaWNfaGVhZGVyCiB9IHhsb2dfaW5fY29yZV90OwogCiAvKgotICogRGVmaW5lcyB0byBzYXZlIG91ciBjb2RlIGZyb20gdGhpcyBnbG9wLgotICovCi0jZGVmaW5lCWljX2ZvcmNlX3dhaXQJaGljX2ZpZWxkcy5pY19mb3JjZV93YWl0Ci0jZGVmaW5lIGljX3dyaXRlX3dhaXQJaGljX2ZpZWxkcy5pY193cml0ZV93YWl0Ci0jZGVmaW5lCWljX25leHQJCWhpY19maWVsZHMuaWNfbmV4dAotI2RlZmluZQlpY19wcmV2CQloaWNfZmllbGRzLmljX3ByZXYKLSNkZWZpbmUJaWNfYnAJCWhpY19maWVsZHMuaWNfYnAKLSNkZWZpbmUJaWNfbG9nCQloaWNfZmllbGRzLmljX2xvZwotI2RlZmluZQlpY19jYWxsYmFjawloaWNfZmllbGRzLmljX2NhbGxiYWNrCi0jZGVmaW5lCWljX2NhbGxiYWNrX2xvY2sgaGljX2ZpZWxkcy5pY19jYWxsYmFja19sb2NrCi0jZGVmaW5lCWljX2NhbGxiYWNrX3RhaWwgaGljX2ZpZWxkcy5pY19jYWxsYmFja190YWlsCi0jZGVmaW5lCWljX3RyYWNlCWhpY19maWVsZHMuaWNfdHJhY2UKLSNkZWZpbmUJaWNfc2l6ZQkJaGljX2ZpZWxkcy5pY19zaXplCi0jZGVmaW5lCWljX29mZnNldAloaWNfZmllbGRzLmljX29mZnNldAotI2RlZmluZQlpY19yZWZjbnQJaGljX2ZpZWxkcy5pY19yZWZjbnQKLSNkZWZpbmUJaWNfYndyaXRlY250CWhpY19maWVsZHMuaWNfYndyaXRlY250Ci0jZGVmaW5lCWljX3N0YXRlCWhpY19maWVsZHMuaWNfc3RhdGUKLSNkZWZpbmUgaWNfZGF0YXAJaGljX2ZpZWxkcy5pY19kYXRhcAotI2RlZmluZSBpY19oZWFkZXIJaGljX2RhdGEtPmhpY19oZWFkZXIKLQotLyoKICAqIFRoZSByZXNlcnZhdGlvbiBoZWFkIGxzbiBpcyBub3QgbWFkZSB1cCBvZiBhIGN5Y2xlIG51bWJlciBhbmQgYmxvY2sgbnVtYmVyLgogICogSW5zdGVhZCwgaXQgdXNlcyBhIGN5Y2xlIG51bWJlciBhbmQgYnl0ZSBudW1iZXIuICBMb2dzIGRvbid0IGV4cGVjdCB0bwogICogb3ZlcmZsb3cgMzEgYml0cyB3b3J0aCBvZiBieXRlIG9mZnNldCwgc28gdXNpbmcgYSBieXRlIG51bWJlciB3aWxsIG1lYW4KQEAgLTQwNCw2ICszODUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgbG9nIHsKIAkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBkb24ndCBuZWVkIGxvY2tpbmcgKi8KIAlzdHJ1Y3QgeGZzX21vdW50CSpsX21wOwkgICAgICAgIC8qIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc19haWwJCSpsX2FpbHA7CS8qIEFJTCBsb2cgaXMgd29ya2luZyB3aXRoICovCiAJc3RydWN0IHhmc19idWYJCSpsX3hidWY7ICAgICAgICAvKiBleHRyYSBidWZmZXIgZm9yIGxvZwogCQkJCQkJICogd3JhcHBpbmcgKi8KIAlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmxfdGFyZzsgICAgICAgIC8qIGJ1ZnRhcmcgb2YgbG9nICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKaW5kZXggNzBlM2JhMy4uMzVjY2E5OCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pbWFwLmgiCiAjaW5jbHVkZSAieGZzX2FsbG9jLmgiCiAjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgogI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgpAQCAtNTQsMTAgKzUzLDggQEAKIAkJCQkJICAgICAgIHhsb2dfcmVjb3Zlcl9pdGVtX3QgKml0ZW0pOwogI2lmIGRlZmluZWQoREVCVUcpCiBTVEFUSUMgdm9pZAl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeSh4bG9nX3QgKik7Ci1TVEFUSUMgdm9pZAl4bG9nX3JlY292ZXJfY2hlY2tfYWlsKHhmc19tb3VudF90ICosIHhmc19sb2dfaXRlbV90ICosIGludCk7CiAjZWxzZQogI2RlZmluZQl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShsb2cpCi0jZGVmaW5lCXhsb2dfcmVjb3Zlcl9jaGVja19haWwobXAsIGxpcCwgZ2VuKQogI2VuZGlmCiAKIApAQCAtMjcwLDIxICsyNjcsMTYgQEAKIHhsb2dfcmVjb3Zlcl9pb2RvbmUoCiAJc3RydWN0IHhmc19idWYJKmJwKQogewotCXhmc19tb3VudF90CSptcDsKLQotCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSk7Ci0KIAlpZiAoWEZTX0JVRl9HRVRFUlJPUihicCkpIHsKIAkJLyoKIAkJICogV2UncmUgbm90IGdvaW5nIHRvIGJvdGhlciBhYm91dCByZXRyeWluZwogCQkgKiB0aGlzIGR1cmluZyByZWNvdmVyeS4gT25lIHN0cmlrZSEKIAkJICovCi0JCW1wID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19tb3VudF90ICopOwogCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2lvZG9uZSIsCi0JCQkJICBtcCwgYnAsIFhGU19CVUZfQUREUihicCkpOwotCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFNIVVRET1dOX01FVEFfSU9fRVJST1IpOworCQkJCSAgYnAtPmJfbW91bnQsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKGJwLT5iX21vdW50LCBTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKIAl9Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKKwlicC0+Yl9tb3VudCA9IE5VTEw7CiAJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOwogCXhmc19iaW9kb25lKGJwKTsKIH0KQEAgLTIyMjgsOSArMjIyMCw4IEBACiAJCVhGU19CVUZfU1RBTEUoYnApOwogCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKIAl9IGVsc2UgewotCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCB8fAotCQkgICAgICAgWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19tb3VudF90ICopID09IG1wKTsKLQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBtcCk7CisJCUFTU0VSVChicC0+Yl9tb3VudCA9PSBOVUxMIHx8IGJwLT5iX21vdW50ID09IG1wKTsKKwkJYnAtPmJfbW91bnQgPSBtcDsKIAkJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfcmVjb3Zlcl9pb2RvbmUpOwogCQl4ZnNfYmR3cml0ZShtcCwgYnApOwogCX0KQEAgLTIyNDcsNyArMjIzOCw2IEBACiAJeGZzX2lub2RlX2xvZ19mb3JtYXRfdAkqaW5fZjsKIAl4ZnNfbW91bnRfdAkJKm1wOwogCXhmc19idWZfdAkJKmJwOwotCXhmc19pbWFwX3QJCWltYXA7CiAJeGZzX2Rpbm9kZV90CQkqZGlwOwogCXhmc19pbm9fdAkJaW5vOwogCWludAkJCWxlbjsKQEAgLTIyNzUsNTQgKzIyNjUsMzUgQEAKIAl9CiAJaW5vID0gaW5fZi0+aWxmX2lubzsKIAltcCA9IGxvZy0+bF9tcDsKLQlpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9JTk9ERSkgewotCQlpbWFwLmltX2Jsa25vID0gKHhmc19kYWRkcl90KWluX2YtPmlsZl9ibGtubzsKLQkJaW1hcC5pbV9sZW4gPSBpbl9mLT5pbGZfbGVuOwotCQlpbWFwLmltX2JvZmZzZXQgPSBpbl9mLT5pbGZfYm9mZnNldDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJdCdzIGFuIG9sZCBpbm9kZSBmb3JtYXQgcmVjb3JkLiAgV2UgZG9uJ3Qga25vdyB3aGVyZQotCQkgKiBpdHMgY2x1c3RlciBpcyBsb2NhdGVkIG9uIGRpc2ssIGFuZCB3ZSBjYW4ndCBhbGxvdwotCQkgKiB4ZnNfaW1hcCgpIHRvIGZpZ3VyZSBpdCBvdXQgYmVjYXVzZSB0aGUgaW5vZGUgYnRyZWVzCi0JCSAqIGFyZSBub3QgcmVhZHkgdG8gYmUgdXNlZC4gIFRoZXJlZm9yZSBkbyBub3QgcGFzcyB0aGUKLQkJICogWEZTX0lNQVBfTE9PS1VQIGZsYWcgdG8geGZzX2ltYXAoKS4gIFRoaXMgd2lsbCBnaXZlCi0JCSAqIHVzIG9ubHkgdGhlIHNpbmdsZSBibG9jayBpbiB3aGljaCB0aGUgaW5vZGUgbGl2ZXMKLQkJICogcmF0aGVyIHRoYW4gaXRzIGNsdXN0ZXIsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRvCi0JCSAqIGludmFsaWRhdGUgdGhlIGJ1ZmZlciB3aGVuIHdlIHdyaXRlIGl0IG91dCBiZWxvdy4KLQkJICovCi0JCWltYXAuaW1fYmxrbm8gPSAwOwotCQllcnJvciA9IHhmc19pbWFwKGxvZy0+bF9tcCwgTlVMTCwgaW5vLCAmaW1hcCwgMCk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyoKIAkgKiBJbm9kZSBidWZmZXJzIGNhbiBiZSBmcmVlZCwgbG9vayBvdXQgZm9yIGl0LAogCSAqIGFuZCBkbyBub3QgcmVwbGF5IHRoZSBpbm9kZS4KIAkgKi8KLQlpZiAoeGxvZ19jaGVja19idWZmZXJfY2FuY2VsbGVkKGxvZywgaW1hcC5pbV9ibGtubywgaW1hcC5pbV9sZW4sIDApKSB7CisJaWYgKHhsb2dfY2hlY2tfYnVmZmVyX2NhbmNlbGxlZChsb2csIGluX2YtPmlsZl9ibGtubywKKwkJCQkJaW5fZi0+aWxmX2xlbiwgMCkpIHsKIAkJZXJyb3IgPSAwOwogCQlnb3RvIGVycm9yOwogCX0KIAotCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIGltYXAuaW1fYmxrbm8sIGltYXAuaW1fbGVuLAotCQkJCQkJCQlYRlNfQlVGX0xPQ0spOworCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIGluX2YtPmlsZl9ibGtubywKKwkJCQlpbl9mLT5pbGZfbGVuLCBYRlNfQlVGX0xPQ0spOwogCWlmIChYRlNfQlVGX0lTRVJST1IoYnApKSB7CiAJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzIpIiwgbXAsCi0JCQkJICBicCwgaW1hcC5pbV9ibGtubyk7CisJCQkJICBicCwgaW5fZi0+aWxmX2Jsa25vKTsKIAkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWVycm9yID0gMDsKIAlBU1NFUlQoaW5fZi0+aWxmX2ZpZWxkcyAmIFhGU19JTE9HX0NPUkUpOwotCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwgaW1hcC5pbV9ib2Zmc2V0KTsKKwlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGluX2YtPmlsZl9ib2Zmc2V0KTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBwbGFjZSB3ZSdyZSBmbHVzaGluZyBvdXQgdG8gcmVhbGx5IGxvb2tzCiAJICogbGlrZSBhbiBpbm9kZSEKIAkgKi8KLQlpZiAodW5saWtlbHkoYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDKSkgeworCWlmICh1bmxpa2VseShiZTE2X3RvX2NwdShkaXAtPmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDKSkgewogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAogCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbWFnaWMgbnVtYmVyLCBkaW5vIHB0ciA9IDB4JXAsIGRpbm8gYnAgPSAweCVwLCBpbm8gPSAlTGQiLApAQCAtMjM0NSwxMiArMjMxNiwxMiBAQAogCX0KIAogCS8qIFNraXAgcmVwbGF5IHdoZW4gdGhlIG9uIGRpc2sgaW5vZGUgaXMgbmV3ZXIgdGhhbiB0aGUgbG9nIG9uZSAqLwotCWlmIChkaWNwLT5kaV9mbHVzaGl0ZXIgPCBiZTE2X3RvX2NwdShkaXAtPmRpX2NvcmUuZGlfZmx1c2hpdGVyKSkgeworCWlmIChkaWNwLT5kaV9mbHVzaGl0ZXIgPCBiZTE2X3RvX2NwdShkaXAtPmRpX2ZsdXNoaXRlcikpIHsKIAkJLyoKIAkJICogRGVhbCB3aXRoIHRoZSB3cmFwIGNhc2UsIERJX01BWF9GTFVTSCBpcyBsZXNzCiAJCSAqIHRoYW4gc21hbGxlciBudW1iZXJzCiAJCSAqLwotCQlpZiAoYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX2ZsdXNoaXRlcikgPT0gRElfTUFYX0ZMVVNIICYmCisJCWlmIChiZTE2X3RvX2NwdShkaXAtPmRpX2ZsdXNoaXRlcikgPT0gRElfTUFYX0ZMVVNIICYmCiAJCSAgICBkaWNwLT5kaV9mbHVzaGl0ZXIgPCAoRElfTUFYX0ZMVVNIID4+IDEpKSB7CiAJCQkvKiBkbyBub3RoaW5nICovCiAJCX0gZWxzZSB7CkBAIC0yNDEwLDcgKzIzODEsNyBAQAogCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAkJZ290byBlcnJvcjsKIAl9Ci0JaWYgKHVubGlrZWx5KGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiA+IHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkpKSB7CisJaWYgKHVubGlrZWx5KGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiA+IHNpemVvZihzdHJ1Y3QgeGZzX2ljZGlub2RlKSkpIHsKIAkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucyg3KSIsCiAJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwpAQCAtMjQyMiwyMyArMjM5MywyNCBAQAogCX0KIAogCS8qIFRoZSBjb3JlIGlzIGluIGluLWNvcmUgZm9ybWF0ICovCi0JeGZzX2Rpbm9kZV90b19kaXNrKCZkaXAtPmRpX2NvcmUsCi0JCSh4ZnNfaWNkaW5vZGVfdCAqKWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOworCXhmc19kaW5vZGVfdG9fZGlzayhkaXAsICh4ZnNfaWNkaW5vZGVfdCAqKWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOwogCiAJLyogdGhlIHJlc3QgaXMgaW4gb24tZGlzayBmb3JtYXQgKi8KLQlpZiAoaXRlbS0+cmlfYnVmWzFdLmlfbGVuID4gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSkgewotCQltZW1jcHkoKHhmc19jYWRkcl90KSBkaXAgKyBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpLAotCQkJaXRlbS0+cmlfYnVmWzFdLmlfYWRkciArIHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCksCi0JCQlpdGVtLT5yaV9idWZbMV0uaV9sZW4gIC0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSk7CisJaWYgKGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiA+IHNpemVvZihzdHJ1Y3QgeGZzX2ljZGlub2RlKSkgeworCQltZW1jcHkoKHhmc19jYWRkcl90KSBkaXAgKyBzaXplb2Yoc3RydWN0IHhmc19pY2Rpbm9kZSksCisJCQlpdGVtLT5yaV9idWZbMV0uaV9hZGRyICsgc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpLAorCQkJaXRlbS0+cmlfYnVmWzFdLmlfbGVuICAtIHNpemVvZihzdHJ1Y3QgeGZzX2ljZGlub2RlKSk7CiAJfQogCiAJZmllbGRzID0gaW5fZi0+aWxmX2ZpZWxkczsKIAlzd2l0Y2ggKGZpZWxkcyAmIChYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEKSkgewogCWNhc2UgWEZTX0lMT0dfREVWOgotCQlkaXAtPmRpX3UuZGlfZGV2ID0gY3B1X3RvX2JlMzIoaW5fZi0+aWxmX3UuaWxmdV9yZGV2KTsKKwkJeGZzX2Rpbm9kZV9wdXRfcmRldihkaXAsIGluX2YtPmlsZl91LmlsZnVfcmRldik7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0lMT0dfVVVJRDoKLQkJZGlwLT5kaV91LmRpX211dWlkID0gaW5fZi0+aWxmX3UuaWxmdV91dWlkOworCQltZW1jcHkoWEZTX0RGT1JLX0RQVFIoZGlwKSwKKwkJICAgICAgICZpbl9mLT5pbGZfdS5pbGZ1X3V1aWQsCisJCSAgICAgICBzaXplb2YodXVpZF90KSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjQ1NCwxMiArMjQyNiwxMiBAQAogCXN3aXRjaCAoZmllbGRzICYgWEZTX0lMT0dfREZPUkspIHsKIAljYXNlIFhGU19JTE9HX0REQVRBOgogCWNhc2UgWEZTX0lMT0dfREVYVDoKLQkJbWVtY3B5KCZkaXAtPmRpX3UsIHNyYywgbGVuKTsKKwkJbWVtY3B5KFhGU19ERk9SS19EUFRSKGRpcCksIHNyYywgbGVuKTsKIAkJYnJlYWs7CiAKIAljYXNlIFhGU19JTE9HX0RCUk9PVDoKLQkJeGZzX2JtYnRfdG9fYm1kcigoeGZzX2JtYnRfYmxvY2tfdCAqKXNyYywgbGVuLAotCQkJCSAmKGRpcC0+ZGlfdS5kaV9ibWJ0KSwKKwkJeGZzX2JtYnRfdG9fYm1kcihtcCwgKHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sgKilzcmMsIGxlbiwKKwkJCQkgKHhmc19ibWRyX2Jsb2NrX3QgKilYRlNfREZPUktfRFBUUihkaXApLAogCQkJCSBYRlNfREZPUktfRFNJWkUoZGlwLCBtcCkpOwogCQlicmVhazsKIApAQCAtMjQ5Niw4ICsyNDY4LDggQEAKIAogCQljYXNlIFhGU19JTE9HX0FCUk9PVDoKIAkJCWRlc3QgPSBYRlNfREZPUktfQVBUUihkaXApOwotCQkJeGZzX2JtYnRfdG9fYm1kcigoeGZzX2JtYnRfYmxvY2tfdCAqKXNyYywgbGVuLAotCQkJCQkgKHhmc19ibWRyX2Jsb2NrX3QqKWRlc3QsCisJCQl4ZnNfYm1idF90b19ibWRyKG1wLCAoc3RydWN0IHhmc19idHJlZV9ibG9jayAqKXNyYywKKwkJCQkJIGxlbiwgKHhmc19ibWRyX2Jsb2NrX3QqKWRlc3QsCiAJCQkJCSBYRlNfREZPUktfQVNJWkUoZGlwLCBtcCkpOwogCQkJYnJlYWs7CiAKQEAgLTI1MTIsOSArMjQ4NCw4IEBACiAKIHdyaXRlX2lub2RlX2J1ZmZlcjoKIAlpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9JTk9ERSkgewotCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCB8fAotCQkgICAgICAgWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19tb3VudF90ICopID09IG1wKTsKLQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBtcCk7CisJCUFTU0VSVChicC0+Yl9tb3VudCA9PSBOVUxMIHx8IGJwLT5iX21vdW50ID09IG1wKTsKKwkJYnAtPmJfbW91bnQgPSBtcDsKIAkJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfcmVjb3Zlcl9pb2RvbmUpOwogCQl4ZnNfYmR3cml0ZShtcCwgYnApOwogCX0gZWxzZSB7CkBAIC0yNjQ1LDkgKzI2MTYsOCBAQAogCW1lbWNweShkZHEsIHJlY2RkcSwgaXRlbS0+cmlfYnVmWzFdLmlfbGVuKTsKIAogCUFTU0VSVChkcV9mLT5xbGZfc2l6ZSA9PSAyKTsKLQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCB8fAotCSAgICAgICBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX21vdW50X3QgKikgPT0gbXApOwotCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbXApOworCUFTU0VSVChicC0+Yl9tb3VudCA9PSBOVUxMIHx8IGJwLT5iX21vdW50ID09IG1wKTsKKwlicC0+Yl9tb3VudCA9IG1wOwogCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX3JlY292ZXJfaW9kb25lKTsKIAl4ZnNfYmR3cml0ZShtcCwgYnApOwogCkBAIC0yNjg5LDExICsyNjU5LDExIEBACiAJZWZpcC0+ZWZpX25leHRfZXh0ZW50ID0gZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50czsKIAllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7CiAKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwlzcGluX2xvY2soJmxvZy0+bF9haWxwLT54YV9sb2NrKTsKIAkvKgotCSAqIHhmc190cmFuc191cGRhdGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCSAqIHhmc190cmFuc19haWxfdXBkYXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCSAqLwotCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBsc24pOworCXhmc190cmFuc19haWxfdXBkYXRlKGxvZy0+bF9haWxwLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBsc24pOwogCXJldHVybiAwOwogfQogCkBAIC0yNzEyLDEyICsyNjgyLDEyIEBACiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKIAlpbnQJCQlwYXNzKQogewotCXhmc19tb3VudF90CQkqbXA7CiAJeGZzX2VmZF9sb2dfZm9ybWF0X3QJKmVmZF9mb3JtYXRwOwogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCA9IE5VTEw7CiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7Ci0JaW50CQkJZ2VuOwogCV9fdWludDY0X3QJCWVmaV9pZDsKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJY3VyOworCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGxvZy0+bF9haWxwOwogCiAJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7CiAJCXJldHVybjsKQEAgLTI3MzQsMjUgKzI3MDQsMjYgQEAKIAkgKiBTZWFyY2ggZm9yIHRoZSBlZmkgd2l0aCB0aGUgaWQgaW4gdGhlIGVmZCBmb3JtYXQgc3RydWN0dXJlCiAJICogaW4gdGhlIEFJTC4KIAkgKi8KLQltcCA9IGxvZy0+bF9tcDsKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQlsaXAgPSB4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKTsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KGFpbHAsICZjdXIsIDApOwogCXdoaWxlIChsaXAgIT0gTlVMTCkgewogCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9FRkkpIHsKIAkJCWVmaXAgPSAoeGZzX2VmaV9sb2dfaXRlbV90ICopbGlwOwogCQkJaWYgKGVmaXAtPmVmaV9mb3JtYXQuZWZpX2lkID09IGVmaV9pZCkgewogCQkJCS8qCi0JCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUKKwkJCQkgKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZQogCQkJCSAqIEFJTCBsb2NrLgogCQkJCSAqLwotCQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCBsaXApOworCQkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CiAJCQkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7Ci0JCQkJcmV0dXJuOworCQkJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOworCQlsaXAgPSB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KGFpbHAsICZjdXIpOwogCX0KLQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOworCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoYWlscCwgJmN1cik7CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogfQogCiAvKgpAQCAtMzAzNiwzMyArMzAwNyw2IEBACiB9CiAKIC8qCi0gKiBWZXJpZnkgdGhhdCBvbmNlIHdlJ3ZlIGVuY291bnRlcmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIEVGSQotICogaW4gdGhlIEFJTCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIEVGSXMgaW4gdGhlIEFJTC4KLSAqLwotI2lmIGRlZmluZWQoREVCVUcpCi1TVEFUSUMgdm9pZAoteGxvZ19yZWNvdmVyX2NoZWNrX2FpbCgKLQl4ZnNfbW91bnRfdAkJKm1wLAotCXhmc19sb2dfaXRlbV90CQkqbGlwLAotCWludAkJCWdlbikKLXsKLQlpbnQJCQlvcmlnX2dlbiA9IGdlbjsKLQotCWRvIHsKLQkJQVNTRVJUKGxpcC0+bGlfdHlwZSAhPSBYRlNfTElfRUZJKTsKLQkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOwotCQkvKgotCQkgKiBUaGUgY2hlY2sgd2lsbCBiZSBib2d1cyBpZiB3ZSByZXN0YXJ0IGZyb20gdGhlCi0JCSAqIGJlZ2lubmluZyBvZiB0aGUgQUlMLCBzbyBBU1NFUlQgdGhhdCB3ZSBkb24ndC4KLQkJICogV2UgbmV2ZXIgc2hvdWxkIHNpbmNlIHdlJ3JlIGhvbGRpbmcgdGhlIEFJTCBsb2NrCi0JCSAqIHRoZSBlbnRpcmUgdGltZS4KLQkJICovCi0JCUFTU0VSVChnZW4gPT0gb3JpZ19nZW4pOwotCX0gd2hpbGUgKGxpcCAhPSBOVUxMKTsKLX0KLSNlbmRpZgkvKiBERUJVRyAqLwotCi0vKgogICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgYWxsIG9mIHRoZSBFRklzIHdoaWNoIGRpZCBub3QgaGF2ZQogICogY29ycmVzcG9uZGluZyBFRkRzIHNob3VsZCBiZSBpbiB0aGUgQUlMLiAgV2hhdCB3ZSBkbyBub3cKICAqIGlzIGZyZWUgdGhlIGV4dGVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLgpAQCAtMzA4NiwyMCArMzAzMCwyMyBAQAogewogCXhmc19sb2dfaXRlbV90CQkqbGlwOwogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKLQlpbnQJCQlnZW47Ci0JeGZzX21vdW50X3QJCSptcDsKIAlpbnQJCQllcnJvciA9IDA7CisJc3RydWN0IHhmc19haWxfY3Vyc29yCWN1cjsKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHA7CiAKLQltcCA9IGxvZy0+bF9tcDsKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQotCWxpcCA9IHhmc190cmFuc19maXJzdF9haWwobXAsICZnZW4pOworCWFpbHAgPSBsb2ctPmxfYWlscDsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KGFpbHAsICZjdXIsIDApOwogCXdoaWxlIChsaXAgIT0gTlVMTCkgewogCQkvKgogCQkgKiBXZSdyZSBkb25lIHdoZW4gd2Ugc2VlIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIEVGSS4KKwkJICogVGhlcmUgc2hvdWxkIGJlIG5vIEVGSXMgbGVmdCBpbiB0aGUgQUlMIG5vdy4KIAkJICovCiAJCWlmIChsaXAtPmxpX3R5cGUgIT0gWEZTX0xJX0VGSSkgewotCQkJeGxvZ19yZWNvdmVyX2NoZWNrX2FpbChtcCwgbGlwLCBnZW4pOworI2lmZGVmIERFQlVHCisJCQlmb3IgKDsgbGlwOyBsaXAgPSB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KGFpbHAsICZjdXIpKQorCQkJCUFTU0VSVChsaXAtPmxpX3R5cGUgIT0gWEZTX0xJX0VGSSk7CisjZW5kaWYKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTMxMDgsMTggKzMwNTUsMjAgQEAKIAkJICovCiAJCWVmaXAgPSAoeGZzX2VmaV9sb2dfaXRlbV90ICopbGlwOwogCQlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9SRUNPVkVSRUQpIHsKLQkJCWxpcCA9IHhmc190cmFuc19uZXh0X2FpbChtcCwgbGlwLCAmZ2VuLCBOVUxMKTsKKwkJCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX25leHQoYWlscCwgJmN1cik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JCWVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZWZpKG1wLCBlZmlwKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2VmaShsb2ctPmxfbXAsIGVmaXApOworCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwotCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgTlVMTCk7CisJCQlnb3RvIG91dDsKKwkJbGlwID0geGZzX3RyYW5zX2FpbF9jdXJzb3JfbmV4dChhaWxwLCAmY3VyKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKK291dDoKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9kb25lKGFpbHAsICZjdXIpOworCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTMxNDAsMTkgKzMwODksMTYgQEAKIAlpbnQJCWVycm9yOwogCiAJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19DTEVBUl9BR0lfQlVDS0VUKTsKLQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfQ0xFQVJfQUdJX0JVQ0tFVF9MT0dfUkVTKG1wKSwgMCwgMCwgMCk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAotCQkJCSAgIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAotCQkJCSAgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYWdpYnApOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19DTEVBUl9BR0lfQlVDS0VUX0xPR19SRVMobXApLAorCQkJCSAgMCwgMCwgMCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9hYm9ydDsKIAotCWVycm9yID0gRUlOVkFMOwotCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKLQlpZiAoYmUzMl90b19jcHUoYWdpLT5hZ2lfbWFnaWNudW0pICE9IFhGU19BR0lfTUFHSUMpCisJZXJyb3IgPSB4ZnNfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdpYnApOworCWlmIChlcnJvcikKIAkJZ290byBvdXRfYWJvcnQ7CiAKKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CiAJYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0XSA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CiAJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKIAkJIChzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0KTsKQEAgLTMxNzIsNiArMzExOCw2MiBAQAogCXJldHVybjsKIH0KIAorU1RBVElDIHhmc19hZ2lub190Cit4bG9nX3JlY292ZXJfcHJvY2Vzc19vbmVfaXVubGluaygKKwlzdHJ1Y3QgeGZzX21vdW50CQkqbXAsCisJeGZzX2FnbnVtYmVyX3QJCQlhZ25vLAorCXhmc19hZ2lub190CQkJYWdpbm8sCisJaW50CQkJCWJ1Y2tldCkKK3sKKwlzdHJ1Y3QgeGZzX2J1ZgkJCSppYnA7CisJc3RydWN0IHhmc19kaW5vZGUJCSpkaXA7CisJc3RydWN0IHhmc19pbm9kZQkJKmlwOworCXhmc19pbm9fdAkJCWlubzsKKwlpbnQJCQkJZXJyb3I7CisKKwlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyk7CisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCAwLCAmaXAsIDApOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiBHZXQgdGhlIG9uIGRpc2sgaW5vZGUgdG8gZmluZCB0aGUgbmV4dCBpbm9kZSBpbiB0aGUgYnVja2V0LgorCSAqLworCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwgJmRpcCwgJmlicCwgWEZTX0JVRl9MT0NLKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9pcHV0OworCisJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfbW9kZSAhPSAwKTsKKworCS8qIHNldHVwIGZvciB0aGUgbmV4dCBwYXNzICovCisJYWdpbm8gPSBiZTMyX3RvX2NwdShkaXAtPmRpX25leHRfdW5saW5rZWQpOworCXhmc19idWZfcmVsc2UoaWJwKTsKKworCS8qCisJICogUHJldmVudCBhbnkgRE1BUEkgZXZlbnQgZnJvbSBiZWluZyBzZW50IHdoZW4gdGhlIHJlZmVyZW5jZSBvbgorCSAqIHRoZSBpbm9kZSBpcyBkcm9wcGVkLgorCSAqLworCWlwLT5pX2QuZGlfZG1ldm1hc2sgPSAwOworCisJSVJFTEUoaXApOworCXJldHVybiBhZ2lubzsKKworIGZhaWxfaXB1dDoKKwlJUkVMRShpcCk7CisgZmFpbDoKKwkvKgorCSAqIFdlIGNhbid0IHJlYWQgaW4gdGhlIGlub2RlIHRoaXMgYnVja2V0IHBvaW50cyB0bywgb3IgdGhpcyBpbm9kZQorCSAqIGlzIG1lc3NlZCB1cC4gIEp1c3QgZGl0Y2ggdGhpcyBidWNrZXQgb2YgaW5vZGVzLiAgV2Ugd2lsbCBsb3NlCisJICogc29tZSBpbm9kZXMgYW5kIHNwYWNlLCBidXQgYXQgbGVhc3Qgd2Ugd29uJ3QgaGFuZy4KKwkgKgorCSAqIENhbGwgeGxvZ19yZWNvdmVyX2NsZWFyX2FnaV9idWNrZXQoKSB0byBwZXJmb3JtIGEgdHJhbnNhY3Rpb24gdG8KKwkgKiBjbGVhciB0aGUgaW5vZGUgcG9pbnRlciBpbiB0aGUgYnVja2V0LgorCSAqLworCXhsb2dfcmVjb3Zlcl9jbGVhcl9hZ2lfYnVja2V0KG1wLCBhZ25vLCBidWNrZXQpOworCXJldHVybiBOVUxMQUdJTk87Cit9CisKIC8qCiAgKiB4bG9nX2l1bmxpbmtfcmVjb3ZlcgogICoKQEAgLTMxOTIsMTEgKzMxOTQsNyBAQAogCXhmc19hZ251bWJlcl90CWFnbm87CiAJeGZzX2FnaV90CSphZ2k7CiAJeGZzX2J1Zl90CSphZ2licDsKLQl4ZnNfYnVmX3QJKmlicDsKLQl4ZnNfZGlub2RlX3QJKmRpcDsKLQl4ZnNfaW5vZGVfdAkqaXA7CiAJeGZzX2FnaW5vX3QJYWdpbm87Ci0JeGZzX2lub190CWlubzsKIAlpbnQJCWJ1Y2tldDsKIAlpbnQJCWVycm9yOwogCXVpbnQJCW1wX2RtZXZtYXNrOwpAQCAtMzIxMywyMiArMzIxMSwyMSBAQAogCQkvKgogCQkgKiBGaW5kIHRoZSBhZ2kgZm9yIHRoaXMgYWcuCiAJCSAqLwotCQlhZ2licCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLAotCQkJCVhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAotCQkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKLQkJaWYgKFhGU19CVUZfSVNFUlJPUihhZ2licCkpIHsKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfcHJvY2Vzc19pdW5saW5rcygjMSkiLAotCQkJCWxvZy0+bF9tcCwgYWdpYnAsCi0JCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSkpOworCQllcnJvciA9IHhmc19yZWFkX2FnaShtcCwgTlVMTCwgYWdubywgJmFnaWJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogQUdJIGlzIGIwcmtlZC4gRG9uJ3QgcHJvY2VzcyBpdC4KKwkJCSAqCisJCQkgKiBXZSBzaG91bGQgcHJvYmFibHkgbWFyayB0aGUgZmlsZXN5c3RlbSBhcyBjb3JydXB0CisJCQkgKiBhZnRlciB3ZSd2ZSByZWNvdmVyZWQgYWxsIHRoZSBhZydzIHdlIGNhbi4uLi4KKwkJCSAqLworCQkJY29udGludWU7CiAJCX0KIAkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOwotCQlBU1NFUlQoWEZTX0FHSV9NQUdJQyA9PSBiZTMyX3RvX2NwdShhZ2ktPmFnaV9tYWdpY251bSkpOwogCiAJCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBidWNrZXQrKykgewotCiAJCQlhZ2lubyA9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF0pOwogCQkJd2hpbGUgKGFnaW5vICE9IE5VTExBR0lOTykgewotCiAJCQkJLyoKIAkJCQkgKiBSZWxlYXNlIHRoZSBhZ2kgYnVmZmVyIHNvIHRoYXQgaXQgY2FuCiAJCQkJICogYmUgYWNxdWlyZWQgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdGhlCkBAIC0zMjM2LDg3ICszMjMzLDE3IEBACiAJCQkJICovCiAJCQkJeGZzX2J1Zl9yZWxzZShhZ2licCk7CiAKLQkJCQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyk7Ci0JCQkJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCAwLCAmaXAsIDApOwotCQkJCUFTU0VSVChlcnJvciB8fCAoaXAgIT0gTlVMTCkpOwotCi0JCQkJaWYgKCFlcnJvcikgewotCQkJCQkvKgotCQkJCQkgKiBHZXQgdGhlIG9uIGRpc2sgaW5vZGUgdG8gZmluZCB0aGUKLQkJCQkJICogbmV4dCBpbm9kZSBpbiB0aGUgYnVja2V0LgotCQkJCQkgKi8KLQkJCQkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIE5VTEwsIGlwLCAmZGlwLAotCQkJCQkJCSZpYnAsIDAsIDAsCi0JCQkJCQkJWEZTX0JVRl9MT0NLKTsKLQkJCQkJQVNTRVJUKGVycm9yIHx8IChkaXAgIT0gTlVMTCkpOwotCQkJCX0KLQotCQkJCWlmICghZXJyb3IpIHsKLQkJCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7Ci0KLQkJCQkJLyogc2V0dXAgZm9yIHRoZSBuZXh0IHBhc3MgKi8KLQkJCQkJYWdpbm8gPSBiZTMyX3RvX2NwdSgKLQkJCQkJCQlkaXAtPmRpX25leHRfdW5saW5rZWQpOwotCQkJCQl4ZnNfYnVmX3JlbHNlKGlicCk7Ci0JCQkJCS8qCi0JCQkJCSAqIFByZXZlbnQgYW55IERNQVBJIGV2ZW50IGZyb20KLQkJCQkJICogYmVpbmcgc2VudCB3aGVuIHRoZQotCQkJCQkgKiByZWZlcmVuY2Ugb24gdGhlIGlub2RlIGlzCi0JCQkJCSAqIGRyb3BwZWQuCi0JCQkJCSAqLwotCQkJCQlpcC0+aV9kLmRpX2RtZXZtYXNrID0gMDsKLQotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGlzIGlzIGEgbmV3IGlub2RlLCBoYW5kbGUKLQkJCQkJICogaXQgc3BlY2lhbGx5LiAgT3RoZXJ3aXNlLAotCQkJCQkgKiBqdXN0IGRyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUKLQkJCQkJICogaW5vZGUuICBJZiB0aGVyZSBhcmUgbm8KLQkJCQkJICogb3RoZXIgcmVmZXJlbmNlcywgdGhpcyB3aWxsCi0JCQkJCSAqIHNlbmQgdGhlIGlub2RlIHRvCi0JCQkJCSAqIHhmc19pbmFjdGl2ZSgpIHdoaWNoIHdpbGwKLQkJCQkJICogdHJ1bmNhdGUgdGhlIGZpbGUgYW5kIGZyZWUKLQkJCQkJICogdGhlIGlub2RlLgotCQkJCQkgKi8KLQkJCQkJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKQotCQkJCQkJeGZzX2lwdXRfbmV3KGlwLCAwKTsKLQkJCQkJZWxzZQotCQkJCQkJSVJFTEUoaXApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFdlIGNhbid0IHJlYWQgaW4gdGhlIGlub2RlCi0JCQkJCSAqIHRoaXMgYnVja2V0IHBvaW50cyB0bywgb3IKLQkJCQkJICogdGhpcyBpbm9kZSBpcyBtZXNzZWQgdXAuICBKdXN0Ci0JCQkJCSAqIGRpdGNoIHRoaXMgYnVja2V0IG9mIGlub2Rlcy4gIFdlCi0JCQkJCSAqIHdpbGwgbG9zZSBzb21lIGlub2RlcyBhbmQgc3BhY2UsCi0JCQkJCSAqIGJ1dCBhdCBsZWFzdCB3ZSB3b24ndCBoYW5nLiAgQ2FsbAotCQkJCQkgKiB4bG9nX3JlY292ZXJfY2xlYXJfYWdpX2J1Y2tldCgpCi0JCQkJCSAqIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiB0byBjbGVhcgotCQkJCQkgKiB0aGUgaW5vZGUgcG9pbnRlciBpbiB0aGUgYnVja2V0LgotCQkJCQkgKi8KLQkJCQkJeGxvZ19yZWNvdmVyX2NsZWFyX2FnaV9idWNrZXQobXAsIGFnbm8sCi0JCQkJCQkJYnVja2V0KTsKLQotCQkJCQlhZ2lubyA9IE5VTExBR0lOTzsKLQkJCQl9CisJCQkJYWdpbm8gPSB4bG9nX3JlY292ZXJfcHJvY2Vzc19vbmVfaXVubGluayhtcCwKKwkJCQkJCQlhZ25vLCBhZ2lubywgYnVja2V0KTsKIAogCQkJCS8qCiAJCQkJICogUmVhY3F1aXJlIHRoZSBhZ2lidWZmZXIgYW5kIGNvbnRpbnVlIGFyb3VuZAotCQkJCSAqIHRoZSBsb29wLgorCQkJCSAqIHRoZSBsb29wLiBUaGlzIHNob3VsZCBuZXZlciBmYWlsIGFzIHdlIGtub3cKKwkJCQkgKiB0aGUgYnVmZmVyIHdhcyBnb29kIGVhcmxpZXIgb24uCiAJCQkJICovCi0JCQkJYWdpYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwKLQkJCQkJCVhGU19BR19EQUREUihtcCwgYWdubywKLQkJCQkJCQlYRlNfQUdJX0RBRERSKG1wKSksCi0JCQkJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7Ci0JCQkJaWYgKFhGU19CVUZfSVNFUlJPUihhZ2licCkpIHsKLQkJCQkJeGZzX2lvZXJyb3JfYWxlcnQoCi0JCQkJInhsb2dfcmVjb3Zlcl9wcm9jZXNzX2l1bmxpbmtzKCMyKSIsCi0JCQkJCQlsb2ctPmxfbXAsIGFnaWJwLAotCQkJCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLAotCQkJCQkJCVhGU19BR0lfREFERFIobXApKSk7Ci0JCQkJfQorCQkJCWVycm9yID0geGZzX3JlYWRfYWdpKG1wLCBOVUxMLCBhZ25vLCAmYWdpYnApOworCQkJCUFTU0VSVChlcnJvciA9PSAwKTsKIAkJCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7Ci0JCQkJQVNTRVJUKFhGU19BR0lfTUFHSUMgPT0gYmUzMl90b19jcHUoCi0JCQkJCWFnaS0+YWdpX21hZ2ljbnVtKSk7CiAJCQl9CiAJCX0KIApAQCAtMzM2Nyw3ICszMjk0LDYgQEAKIAlpbnQJCQlzaXplID0gaWNsb2ctPmljX29mZnNldCArIHJvdW5kb2ZmOwogCV9fYmUzMgkJCWN5Y2xlX2xzbjsKIAl4ZnNfY2FkZHJfdAkJZHA7Ci0JeGxvZ19pbl9jb3JlXzJfdAkqeGhkcjsKIAogCXhsb2dfcGFja19kYXRhX2NoZWNrc3VtKGxvZywgaWNsb2csIHNpemUpOwogCkBAIC0zMzgyLDcgKzMzMDgsOCBAQAogCX0KIAogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MigmbG9nLT5sX21wLT5tX3NiKSkgewotCQl4aGRyID0gKHhsb2dfaW5fY29yZV8yX3QgKikmaWNsb2ctPmljX2hlYWRlcjsKKwkJeGxvZ19pbl9jb3JlXzJfdCAqeGhkciA9IGljbG9nLT5pY19kYXRhOworCiAJCWZvciAoIDsgaSA8IEJUT0JCKHNpemUpOyBpKyspIHsKIAkJCWogPSBpIC8gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOwogCQkJayA9IGkgJSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CkBAIC0zNDQwLDcgKzMzNjcsNiBAQAogCXhsb2dfdAkJCSpsb2cpCiB7CiAJaW50CQkJaSwgaiwgazsKLQl4bG9nX2luX2NvcmVfMl90CSp4aGRyOwogCiAJZm9yIChpID0gMDsgaSA8IEJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpICYmCiAJCSAgaSA8IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsgaSsrKSB7CkBAIC0zNDQ5LDcgKzMzNzUsNyBAQAogCX0KIAogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MigmbG9nLT5sX21wLT5tX3NiKSkgewotCQl4aGRyID0gKHhsb2dfaW5fY29yZV8yX3QgKilyaGVhZDsKKwkJeGxvZ19pbl9jb3JlXzJfdCAqeGhkciA9ICh4bG9nX2luX2NvcmVfMl90ICopcmhlYWQ7CiAJCWZvciAoIDsgaSA8IEJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpOyBpKyspIHsKIAkJCWogPSBpIC8gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOwogCQkJayA9IGkgJSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CkBAIC00MDAzLDExICszOTI5LDggQEAKIHsKIAl4ZnNfbW91bnRfdAkqbXA7CiAJeGZzX2FnZl90CSphZ2ZwOwotCXhmc19hZ2lfdAkqYWdpcDsKIAl4ZnNfYnVmX3QJKmFnZmJwOwogCXhmc19idWZfdAkqYWdpYnA7Ci0JeGZzX2RhZGRyX3QJYWdmZGFkZHI7Ci0JeGZzX2RhZGRyX3QJYWdpZGFkZHI7CiAJeGZzX2J1Zl90CSpzYmJwOwogI2lmZGVmIFhGU19MT1VEX1JFQ09WRVJZCiAJeGZzX3NiX3QJKnNicDsKQEAgLTQwMTYsNiArMzkzOSw3IEBACiAJX191aW50NjRfdAlmcmVlYmxrczsKIAlfX3VpbnQ2NF90CWl0b3RhbDsKIAlfX3VpbnQ2NF90CWlmcmVlOworCWludAkJZXJyb3I7CiAKIAltcCA9IGxvZy0+bF9tcDsKIApAQCAtNDAyMywzNyArMzk0NywyNyBAQAogCWl0b3RhbCA9IDBMTDsKIAlpZnJlZSA9IDBMTDsKIAlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgYWdubysrKSB7Ci0JCWFnZmRhZGRyID0gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSk7Ci0JCWFnZmJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGFnZmRhZGRyLAotCQkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKLQkJaWYgKFhGU19CVUZfSVNFUlJPUihhZ2ZicCkpIHsKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShhZ2YpIiwKLQkJCQkJCW1wLCBhZ2ZicCwgYWdmZGFkZHIpOworCQllcnJvciA9IHhmc19yZWFkX2FnZihtcCwgTlVMTCwgYWdubywgMCwgJmFnZmJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJCSJ4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShhZ2YpIgorCQkJCQkiYWdmIHJlYWQgZmFpbGVkIGFnbm8gJWQgZXJyb3IgJWQiLAorCQkJCQkJCWFnbm8sIGVycm9yKTsKKwkJfSBlbHNlIHsKKwkJCWFnZnAgPSBYRlNfQlVGX1RPX0FHRihhZ2ZicCk7CisJCQlmcmVlYmxrcyArPSBiZTMyX3RvX2NwdShhZ2ZwLT5hZ2ZfZnJlZWJsa3MpICsKKwkJCQkgICAgYmUzMl90b19jcHUoYWdmcC0+YWdmX2ZsY291bnQpOworCQkJeGZzX2J1Zl9yZWxzZShhZ2ZicCk7CiAJCX0KLQkJYWdmcCA9IFhGU19CVUZfVE9fQUdGKGFnZmJwKTsKLQkJQVNTRVJUKFhGU19BR0ZfTUFHSUMgPT0gYmUzMl90b19jcHUoYWdmcC0+YWdmX21hZ2ljbnVtKSk7Ci0JCUFTU0VSVChYRlNfQUdGX0dPT0RfVkVSU0lPTihiZTMyX3RvX2NwdShhZ2ZwLT5hZ2ZfdmVyc2lvbm51bSkpKTsKLQkJQVNTRVJUKGJlMzJfdG9fY3B1KGFnZnAtPmFnZl9zZXFubykgPT0gYWdubyk7CiAKLQkJZnJlZWJsa3MgKz0gYmUzMl90b19jcHUoYWdmcC0+YWdmX2ZyZWVibGtzKSArCi0JCQkgICAgYmUzMl90b19jcHUoYWdmcC0+YWdmX2ZsY291bnQpOwotCQl4ZnNfYnVmX3JlbHNlKGFnZmJwKTsKKwkJZXJyb3IgPSB4ZnNfcmVhZF9hZ2kobXAsIE5VTEwsIGFnbm8sICZhZ2licCk7CisJCWlmICghZXJyb3IpIHsKKwkJCXN0cnVjdCB4ZnNfYWdpCSphZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CiAKLQkJYWdpZGFkZHIgPSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKTsKLQkJYWdpYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgYWdpZGFkZHIsCi0JCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDApOwotCQlpZiAoWEZTX0JVRl9JU0VSUk9SKGFnaWJwKSkgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5KGFnaSkiLAotCQkJCQkgIG1wLCBhZ2licCwgYWdpZGFkZHIpOworCQkJaXRvdGFsICs9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2NvdW50KTsKKwkJCWlmcmVlICs9IGJlMzJfdG9fY3B1KGFnaS0+YWdpX2ZyZWVjb3VudCk7CisJCQl4ZnNfYnVmX3JlbHNlKGFnaWJwKTsKIAkJfQotCQlhZ2lwID0gWEZTX0JVRl9UT19BR0koYWdpYnApOwotCQlBU1NFUlQoWEZTX0FHSV9NQUdJQyA9PSBiZTMyX3RvX2NwdShhZ2lwLT5hZ2lfbWFnaWNudW0pKTsKLQkJQVNTRVJUKFhGU19BR0lfR09PRF9WRVJTSU9OKGJlMzJfdG9fY3B1KGFnaXAtPmFnaV92ZXJzaW9ubnVtKSkpOwotCQlBU1NFUlQoYmUzMl90b19jcHUoYWdpcC0+YWdpX3NlcW5vKSA9PSBhZ25vKTsKLQotCQlpdG90YWwgKz0gYmUzMl90b19jcHUoYWdpcC0+YWdpX2NvdW50KTsKLQkJaWZyZWUgKz0gYmUzMl90b19jcHUoYWdpcC0+YWdpX2ZyZWVjb3VudCk7Ci0JCXhmc19idWZfcmVsc2UoYWdpYnApOwogCX0KIAogCXNiYnAgPSB4ZnNfZ2V0c2IobXAsIDApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IDE1ZjVkZDIuLjNjOTdjNjQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTU2Nyw4ICs1NjcsNiBAQAogU1RBVElDIHZvaWQKIHhmc19tb3VudF9jb21tb24oeGZzX21vdW50X3QgKm1wLCB4ZnNfc2JfdCAqc2JwKQogewotCWludAlpOwotCiAJbXAtPm1fYWdmcm90b3IgPSBtcC0+bV9hZ2lyb3RvciA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJm1wLT5tX2FnaXJvdG9yX2xvY2spOwogCW1wLT5tX21heGFnaSA9IG1wLT5tX3NiLnNiX2FnY291bnQ7CkBAIC01NzcsMTIgKzU3NSwxMCBAQAogCW1wLT5tX3NlY3RiYl9sb2cgPSBzYnAtPnNiX3NlY3Rsb2cgLSBCQlNISUZUOwogCW1wLT5tX2Fnbm9fbG9nID0geGZzX2hpZ2hiaXQzMihzYnAtPnNiX2FnY291bnQgLSAxKSArIDE7CiAJbXAtPm1fYWdpbm9fbG9nID0gc2JwLT5zYl9pbm9wYmxvZyArIHNicC0+c2JfYWdibGtsb2c7Ci0JbXAtPm1fbGl0aW5vID0gc2JwLT5zYl9pbm9kZXNpemUgLQotCQkoKHVpbnQpc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSArICh1aW50KXNpemVvZih4ZnNfYWdpbm9fdCkpOworCW1wLT5tX2xpdGlubyA9IHNicC0+c2JfaW5vZGVzaXplIC0gc2l6ZW9mKHN0cnVjdCB4ZnNfZGlub2RlKTsKIAltcC0+bV9ibG9ja21hc2sgPSBzYnAtPnNiX2Jsb2Nrc2l6ZSAtIDE7CiAJbXAtPm1fYmxvY2t3c2l6ZSA9IHNicC0+c2JfYmxvY2tzaXplID4+IFhGU19XT1JETE9HOwogCW1wLT5tX2Jsb2Nrd21hc2sgPSBtcC0+bV9ibG9ja3dzaXplIC0gMTsKLQlJTklUX0xJU1RfSEVBRCgmbXAtPm1fZGVsX2lub2Rlcyk7CiAKIAkvKgogCSAqIFNldHVwIGZvciBhdHRyaWJ1dGVzLCBpbiBjYXNlIHRoZXkgZ2V0IGNyZWF0ZWQuCkBAIC02MDUsMjQgKzYwMSwyMCBAQAogCX0KIAlBU1NFUlQobXAtPm1fYXR0cm9mZnNldCA8IFhGU19MSVRJTk8obXApKTsKIAotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJbXAtPm1fYWxsb2NfbXhyW2ldID0gWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc2JwLT5zYl9ibG9ja3NpemUsCi0JCQl4ZnNfYWxsb2MsIGkgPT0gMCk7Ci0JCW1wLT5tX2FsbG9jX21ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAotCQkJeGZzX2FsbG9jLCBpID09IDApOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCW1wLT5tX2JtYXBfZG14cltpXSA9IFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHNicC0+c2JfYmxvY2tzaXplLAotCQkJeGZzX2JtYnQsIGkgPT0gMCk7Ci0JCW1wLT5tX2JtYXBfZG1ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAotCQkJeGZzX2JtYnQsIGkgPT0gMCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJbXAtPm1faW5vYnRfbXhyW2ldID0gWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc2JwLT5zYl9ibG9ja3NpemUsCi0JCQl4ZnNfaW5vYnQsIGkgPT0gMCk7Ci0JCW1wLT5tX2lub2J0X21ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAotCQkJeGZzX2lub2J0LCBpID09IDApOwotCX0KKwltcC0+bV9hbGxvY19teHJbMF0gPSB4ZnNfYWxsb2NidF9tYXhyZWNzKG1wLCBzYnAtPnNiX2Jsb2Nrc2l6ZSwgMSk7CisJbXAtPm1fYWxsb2NfbXhyWzFdID0geGZzX2FsbG9jYnRfbWF4cmVjcyhtcCwgc2JwLT5zYl9ibG9ja3NpemUsIDApOworCW1wLT5tX2FsbG9jX21uclswXSA9IG1wLT5tX2FsbG9jX214clswXSAvIDI7CisJbXAtPm1fYWxsb2NfbW5yWzFdID0gbXAtPm1fYWxsb2NfbXhyWzFdIC8gMjsKKworCW1wLT5tX2lub2J0X214clswXSA9IHhmc19pbm9idF9tYXhyZWNzKG1wLCBzYnAtPnNiX2Jsb2Nrc2l6ZSwgMSk7CisJbXAtPm1faW5vYnRfbXhyWzFdID0geGZzX2lub2J0X21heHJlY3MobXAsIHNicC0+c2JfYmxvY2tzaXplLCAwKTsKKwltcC0+bV9pbm9idF9tbnJbMF0gPSBtcC0+bV9pbm9idF9teHJbMF0gLyAyOworCW1wLT5tX2lub2J0X21uclsxXSA9IG1wLT5tX2lub2J0X214clsxXSAvIDI7CisKKwltcC0+bV9ibWFwX2RteHJbMF0gPSB4ZnNfYm1idF9tYXhyZWNzKG1wLCBzYnAtPnNiX2Jsb2Nrc2l6ZSwgMSk7CisJbXAtPm1fYm1hcF9kbXhyWzFdID0geGZzX2JtYnRfbWF4cmVjcyhtcCwgc2JwLT5zYl9ibG9ja3NpemUsIDApOworCW1wLT5tX2JtYXBfZG1uclswXSA9IG1wLT5tX2JtYXBfZG14clswXSAvIDI7CisJbXAtPm1fYm1hcF9kbW5yWzFdID0gbXAtPm1fYm1hcF9kbXhyWzFdIC8gMjsKIAogCW1wLT5tX2JzaXplID0gWEZTX0ZTQl9UT19CQihtcCwgMSk7CiAJbXAtPm1faWFsbG9jX2lub3MgPSAoaW50KU1BWCgoX191aW50MTZfdClYRlNfSU5PREVTX1BFUl9DSFVOSywKQEAgLTEyMjgsNiArMTIyMCwxNiBAQAogCV9fdWludDY0X3QJCXJlc2Jsa3M7CiAJaW50CQkJZXJyb3I7CiAKKwkvKgorCSAqIFJlbGVhc2UgZHF1b3QgdGhhdCByb290aW5vZGUsIHJibWlubyBhbmQgcnN1bWlubyBtaWdodCBiZSBob2xkaW5nLAorCSAqIGFuZCByZWxlYXNlIHRoZSBxdW90YSBpbm9kZXMuCisJICovCisJWEZTX1FNX1VOTU9VTlQobXApOworCisJaWYgKG1wLT5tX3JibWlwKQorCQlJUkVMRShtcC0+bV9yYm1pcCk7CisJaWYgKG1wLT5tX3JzdW1pcCkKKwkJSVJFTEUobXAtPm1fcnN1bWlwKTsKIAlJUkVMRShtcC0+bV9yb290aXApOwogCiAJLyoKQEAgLTEyNDEsNyArMTI0Myw3IEBACiAJICogbmVlZCB0byBmb3JjZSB0aGUgbG9nIGZpcnN0LgogCSAqLwogCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7Ci0JeGZzX2lmbHVzaF9hbGwobXApOworCXhmc19yZWNsYWltX2lub2RlcyhtcCwgMCwgWEZTX0lGTFVTSF9BU1lOQyk7CiAKIAlYRlNfUU1fRFFQVVJHRUFMTChtcCwgWEZTX1FNT1BUX1FVT1RBTEwgfCBYRlNfUU1PUFRfVU1PVU5USU5HKTsKIApAQCAtMTI4OCwxMSArMTI5MCw2IEBACiAJeGZzX3VubW91bnRmc193YWl0KG1wKTsgCQkvKiB3YWl0IGZvciBhc3luYyBidWZzICovCiAJeGZzX2xvZ191bm1vdW50KG1wKTsJCQkvKiBEb25lISBObyBtb3JlIGZzIG9wcy4gKi8KIAotCS8qCi0JICogQWxsIGlub2RlcyBmcm9tIHRoaXMgbW91bnQgcG9pbnQgc2hvdWxkIGJlIGZyZWVkLgotCSAqLwotCUFTU0VSVChtcC0+bV9pbm9kZXMgPT0gTlVMTCk7Ci0KIAlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PVVVJRCkgPT0gMCkKIAkJdXVpZF90YWJsZV9yZW1vdmUoJm1wLT5tX3NiLnNiX3V1aWQpOwogCkBAIC0xMzY1LDI0ICsxMzYyLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLVNUQVRJQyB2b2lkCi14ZnNfbWFya19zaGFyZWRfcm8oCi0JeGZzX21vdW50X3QJKm1wLAotCXhmc19idWZfdAkqYnApCi17Ci0JeGZzX2RzYl90CSpzYiA9IFhGU19CVUZfVE9fU0JQKGJwKTsKLQlfX3VpbnQxNl90CXZlcnNpb247Ci0KLQlpZiAoIShzYi0+c2JfZmxhZ3MgJiBYRlNfU0JGX1JFQURPTkxZKSkKLQkJc2ItPnNiX2ZsYWdzIHw9IFhGU19TQkZfUkVBRE9OTFk7Ci0KLQl2ZXJzaW9uID0gYmUxNl90b19jcHUoc2ItPnNiX3ZlcnNpb25udW0pOwotCWlmICgodmVyc2lvbiAmIFhGU19TQl9WRVJTSU9OX05VTUJJVFMpICE9IFhGU19TQl9WRVJTSU9OXzQgfHwKLQkgICAgISh2ZXJzaW9uICYgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUKSkKLQkJdmVyc2lvbiB8PSBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQ7Ci0Jc2ItPnNiX3ZlcnNpb25udW0gPSBjcHVfdG9fYmUxNih2ZXJzaW9uKTsKLX0KLQogaW50CiB4ZnNfdW5tb3VudGZzX3dyaXRlc2IoeGZzX21vdW50X3QgKm1wKQogewpAQCAtMTM5OCwxMiArMTM3Nyw2IEBACiAKIAkJc2JwID0geGZzX2dldHNiKG1wLCAwKTsKIAotCQkvKgotCQkgKiBtYXJrIHNoYXJlZC1yZWFkb25seSBpZiBkZXNpcmVkCi0JCSAqLwotCQlpZiAobXAtPm1fbWtfc2hhcmVkcm8pCi0JCQl4ZnNfbWFya19zaGFyZWRfcm8obXAsIHNicCk7Ci0KIAkJWEZTX0JVRl9VTkRPTkUoc2JwKTsKIAkJWEZTX0JVRl9VTlJFQUQoc2JwKTsKIAkJWEZTX0JVRl9VTkRFTEFZV1JJVEUoc2JwKTsKQEAgLTE0MTUsOCArMTM4OCw2IEBACiAJCWlmIChlcnJvcikKIAkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdW5tb3VudGZzX3dyaXRlc2IiLAogCQkJCQkgIG1wLCBzYnAsIFhGU19CVUZfQUREUihzYnApKTsKLQkJaWYgKGVycm9yICYmIG1wLT5tX21rX3NoYXJlZHJvKQotCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAiU3VwZXJibG9jayB3cml0ZSBlcnJvciBkZXRlY3RlZCB3aGlsZSB1bm1vdW50aW5nLiAgRmlsZXN5c3RlbSBtYXkgbm90IGJlIG1hcmtlZCBzaGFyZWQgcmVhZG9ubHkiKTsKIAkJeGZzX2J1Zl9yZWxzZShzYnApOwogCX0KIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKaW5kZXggZjNjMTAyNC4uYzFlMDI4NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5oCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtMTgsNyArMTgsNiBAQAogI2lmbmRlZiBfX1hGU19NT1VOVF9IX18KICNkZWZpbmUJX19YRlNfTU9VTlRfSF9fCiAKLQogdHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zX3Jlc2VydmF0aW9ucyB7CiAJdWludAl0cl93cml0ZTsJLyogZXh0ZW50IGFsbG9jIHRyYW5zICovCiAJdWludAl0cl9pdHJ1bmNhdGU7CS8qIHRydW5jYXRlIHRyYW5zICovCkBAIC00NCwxNCArNDMsMTYgQEAKIH0geGZzX3RyYW5zX3Jlc2VydmF0aW9uc190OwogCiAjaWZuZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBNb3ZlZCBoZXJlIGZyb20geGZzX2FnLmggdG8gYXZvaWQgcmVvcmRlcmluZyBoZWFkZXIgZmlsZXMKLSAqLworCiAjZGVmaW5lIFhGU19EQUREUl9UT19BR05PKG1wLGQpIFwKIAkoKHhmc19hZ251bWJlcl90KShYRlNfQkJfVE9fRlNCVChtcCwgZCkgLyAobXApLT5tX3NiLnNiX2FnYmxvY2tzKSkKICNkZWZpbmUgWEZTX0RBRERSX1RPX0FHQk5PKG1wLGQpIFwKIAkoKHhmc19hZ2Jsb2NrX3QpKFhGU19CQl9UT19GU0JUKG1wLCBkKSAlIChtcCktPm1fc2Iuc2JfYWdibG9ja3MpKQotI2Vsc2UKKworI2Vsc2UgLyogX19LRVJORUxfXyAqLworCisjaW5jbHVkZSAieGZzX3N5bmMuaCIKKwogc3RydWN0IGNyZWQ7CiBzdHJ1Y3QgbG9nOwogc3RydWN0IHhmc19tb3VudF9hcmdzOwpAQCAtNjIsNiArNjMsNyBAQAogc3RydWN0IHhmc19zd2FwZXh0Owogc3RydWN0IHhmc19tcnVfY2FjaGU7CiBzdHJ1Y3QgeGZzX25hbWVvcHM7CitzdHJ1Y3QgeGZzX2FpbDsKIAogLyoKICAqIFByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIERhdGEgTWlncmF0aW9uIHN1YnN5c3RlbS4KQEAgLTExNSw3ICsxMTcsNyBAQAogCiB0eXBlZGVmIGludAkoKnhmc19xbWluaXRfdCkoc3RydWN0IHhmc19tb3VudCAqLCB1aW50ICosIHVpbnQgKik7CiB0eXBlZGVmIGludAkoKnhmc19xbW1vdW50X3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCwgdWludCk7Ci10eXBlZGVmIGludAkoKnhmc19xbXVubW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqKTsKK3R5cGVkZWYgdm9pZAkoKnhmc19xbXVubW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqKTsKIHR5cGVkZWYgdm9pZAkoKnhmc19xbWRvbmVfdCkoc3RydWN0IHhmc19tb3VudCAqKTsKIHR5cGVkZWYgdm9pZAkoKnhmc19kcXJlbGVfdCkoc3RydWN0IHhmc19kcXVvdCAqKTsKIHR5cGVkZWYgaW50CSgqeGZzX2RxYXR0YWNoX3QpKHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CkBAIC0xMzIsNyArMTM0LDcgQEAKIAkJCXN0cnVjdCB4ZnNfZHF1b3QgKiosIHN0cnVjdCB4ZnNfZHF1b3QgKik7CiB0eXBlZGVmIGludAkoKnhmc19kcXZvcGNob3ducmVzdl90KShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKIAkJCXN0cnVjdCB4ZnNfZHF1b3QgKiwgc3RydWN0IHhmc19kcXVvdCAqLCB1aW50KTsKLXR5cGVkZWYgdm9pZAkoKnhmc19kcXN0YXR2ZnNfdCkoc3RydWN0IHhmc19pbm9kZSAqLCBiaHZfc3RhdHZmc190ICopOwordHlwZWRlZiB2b2lkCSgqeGZzX2Rxc3RhdHZmc190KShzdHJ1Y3QgeGZzX2lub2RlICosIHN0cnVjdCBrc3RhdGZzICopOwogdHlwZWRlZiBpbnQJKCp4ZnNfZHFzeW5jX3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50IGZsYWdzKTsKIHR5cGVkZWYgaW50CSgqeGZzX3F1b3RhY3RsX3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50LCBpbnQsIHhmc19jYWRkcl90KTsKIApAQCAtMjIzLDE4ICsyMjUsMTAgQEAKICNkZWZpbmUgeGZzX2ljc2Jfc3luY19jb3VudGVyc19sb2NrZWQobXAsIGZsYWdzKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotdHlwZWRlZiBzdHJ1Y3QgeGZzX2FpbCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAl4YV9haWw7Ci0JdWludAkJCXhhX2dlbjsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnhhX3Rhc2s7Ci0JeGZzX2xzbl90CQl4YV90YXJnZXQ7Ci19IHhmc19haWxfdDsKLQogdHlwZWRlZiBzdHJ1Y3QgeGZzX21vdW50IHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKm1fc3VwZXI7CiAJeGZzX3RpZF90CQltX3RpZDsJCS8qIG5leHQgdW51c2VkIHRpZCBmb3IgZnMgKi8KLQlzcGlubG9ja190CQltX2FpbF9sb2NrOwkvKiBmcyBBSUwgbXV0ZXggKi8KLQl4ZnNfYWlsX3QJCW1fYWlsOwkJLyogZnMgYWN0aXZlIGxvZyBpdGVtIGxpc3QgKi8KKwlzdHJ1Y3QgeGZzX2FpbAkJKm1fYWlsOwkJLyogZnMgYWN0aXZlIGxvZyBpdGVtIGxpc3QgKi8KIAl4ZnNfc2JfdAkJbV9zYjsJCS8qIGNvcHkgb2YgZnMgc3VwZXJibG9jayAqLwogCXNwaW5sb2NrX3QJCW1fc2JfbG9jazsJLyogc2IgY291bnRlciBsb2NrICovCiAJc3RydWN0IHhmc19idWYJCSptX3NiX2JwOwkvKiBidWZmZXIgZm9yIHN1cGVyYmxvY2sgKi8KQEAgLTI0NywxMCArMjQxLDYgQEAKIAl4ZnNfYWdudW1iZXJfdAkJbV9hZ2lyb3RvcjsJLyogbGFzdCBhZyBkaXIgaW5vZGUgYWxsb2NlZCAqLwogCXNwaW5sb2NrX3QJCW1fYWdpcm90b3JfbG9jazsvKiAuLiBhbmQgbG9jayBwcm90ZWN0aW5nIGl0ICovCiAJeGZzX2FnbnVtYmVyX3QJCW1fbWF4YWdpOwkvKiBoaWdoZXN0IGlub2RlIGFsbG9jIGdyb3VwICovCi0Jc3RydWN0IHhmc19pbm9kZQkqbV9pbm9kZXM7CS8qIGFjdGl2ZSBpbm9kZSBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAltX2RlbF9pbm9kZXM7CS8qIGlub2RlcyB0byByZWNsYWltICovCi0JbXV0ZXhfdAkJCW1faWxvY2s7CS8qIGlub2RlIGxpc3QgbXV0ZXggKi8KLQl1aW50CQkJbV9pcmVjbGFpbXM7CS8qIGNvdW50IG9mIGNhbGxzIHRvIHJlY2xhaW0qLwogCXVpbnQJCQltX3JlYWRpb19sb2c7CS8qIG1pbiByZWFkIHNpemUgbG9nIGJ5dGVzICovCiAJdWludAkJCW1fcmVhZGlvX2Jsb2NrczsgLyogbWluIHJlYWQgc2l6ZSBibG9ja3MgKi8KIAl1aW50CQkJbV93cml0ZWlvX2xvZzsJLyogbWluIHdyaXRlIHNpemUgbG9nIGJ5dGVzICovCkBAIC0yNjcsNyArMjU3LDYgQEAKIAl4ZnNfYnVmdGFyZ190CQkqbV9kZGV2X3RhcmdwOwkvKiBzYXZlcyB0YWtpbmcgdGhlIGFkZHJlc3MgKi8KIAl4ZnNfYnVmdGFyZ190CQkqbV9sb2dkZXZfdGFyZ3A7LyogcHRyIHRvIGxvZyBkZXZpY2UgKi8KIAl4ZnNfYnVmdGFyZ190CQkqbV9ydGRldl90YXJncDsJLyogcHRyIHRvIHJ0IGRldmljZSAqLwotCV9fdWludDhfdAkJbV9kaXJjb29rX2Vsb2c7CS8qIGxvZyBkLWNvb2tpZSBlbnRyeSBiaXRzICovCiAJX191aW50OF90CQltX2Jsa2JpdF9sb2c7CS8qIGJsb2NrbG9nICsgTkJCWSAqLwogCV9fdWludDhfdAkJbV9ibGtiYl9sb2c7CS8qIGJsb2NrbG9nIC0gQkJTSElGVCAqLwogCV9fdWludDhfdAkJbV9hZ25vX2xvZzsJLyogbG9nICNhZydzICovCkBAIC0yNzYsMTIgKzI2NSwxMiBAQAogCXVpbnQJCQltX2Jsb2NrbWFzazsJLyogc2JfYmxvY2tzaXplLTEgKi8KIAl1aW50CQkJbV9ibG9ja3dzaXplOwkvKiBzYl9ibG9ja3NpemUgaW4gd29yZHMgKi8KIAl1aW50CQkJbV9ibG9ja3dtYXNrOwkvKiBibG9ja3dzaXplLTEgKi8KLQl1aW50CQkJbV9hbGxvY19teHJbMl07CS8qIFhGU19BTExPQ19CTE9DS19NQVhSRUNTICovCi0JdWludAkJCW1fYWxsb2NfbW5yWzJdOwkvKiBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyAqLwotCXVpbnQJCQltX2JtYXBfZG14clsyXTsJLyogWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MgKi8KLQl1aW50CQkJbV9ibWFwX2RtbnJbMl07CS8qIFhGU19CTUFQX0JMT0NLX0RNSU5SRUNTICovCi0JdWludAkJCW1faW5vYnRfbXhyWzJdOwkvKiBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyAqLwotCXVpbnQJCQltX2lub2J0X21uclsyXTsJLyogWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MgKi8KKwl1aW50CQkJbV9hbGxvY19teHJbMl07CS8qIG1heCBhbGxvYyBidHJlZSByZWNvcmRzICovCisJdWludAkJCW1fYWxsb2NfbW5yWzJdOwkvKiBtaW4gYWxsb2MgYnRyZWUgcmVjb3JkcyAqLworCXVpbnQJCQltX2JtYXBfZG14clsyXTsJLyogbWF4IGJtYXAgYnRyZWUgcmVjb3JkcyAqLworCXVpbnQJCQltX2JtYXBfZG1uclsyXTsJLyogbWluIGJtYXAgYnRyZWUgcmVjb3JkcyAqLworCXVpbnQJCQltX2lub2J0X214clsyXTsJLyogbWF4IGlub2J0IGJ0cmVlIHJlY29yZHMgKi8KKwl1aW50CQkJbV9pbm9idF9tbnJbMl07CS8qIG1pbiBpbm9idCBidHJlZSByZWNvcmRzICovCiAJdWludAkJCW1fYWdfbWF4bGV2ZWxzOwkvKiBYRlNfQUdfTUFYTEVWRUxTICovCiAJdWludAkJCW1fYm1fbWF4bGV2ZWxzWzJdOyAvKiBYRlNfQk1fTUFYTEVWRUxTICovCiAJdWludAkJCW1faW5fbWF4bGV2ZWxzOwkvKiBYRlNfSU5fTUFYTEVWRUxTICovCkBAIC0zMTIsOSArMzAxLDYgQEAKIAlpbnQJCQltX3Npbm9hbGlnbjsJLyogc3RyaXBlIHVuaXQgaW5vZGUgYWxpZ25tZW50ICovCiAJaW50CQkJbV9hdHRyX21hZ2ljcGN0Oy8qIDM3JSBvZiB0aGUgYmxvY2tzaXplICovCiAJaW50CQkJbV9kaXJfbWFnaWNwY3Q7CS8qIDM3JSBvZiB0aGUgZGlyIGJsb2Nrc2l6ZSAqLwotCV9fdWludDhfdAkJbV9ta19zaGFyZWRybzsJLyogbWFyayBzaGFyZWQgcm8gb24gdW5tb3VudCAqLwotCV9fdWludDhfdAkJbV9pbm9kZV9xdWllc2NlOy8qIGNhbGwgcXVpZXNjZSBvbiBuZXcgaW5vZGVzLgotCQkJCQkJICAgZmllbGQgZ292ZXJuZWQgYnkgbV9pbG9jayAqLwogCV9fdWludDhfdAkJbV9zZWN0YmJfbG9nOwkvKiBzZWN0bG9nIC0gQkJTSElGVCAqLwogCWNvbnN0IHN0cnVjdCB4ZnNfbmFtZW9wcyAqbV9kaXJuYW1lb3BzOwkvKiB2ZWN0b3Igb2YgZGlyIG5hbWUgb3BzICovCiAJaW50CQkJbV9kaXJibGtzaXplOwkvKiBkaXJlY3RvcnkgYmxvY2sgc3otLWJ5dGVzICovCkBAIC0zNjIsNyArMzQ4LDYgQEAKICNkZWZpbmUgWEZTX01PVU5UX0FUVFIyCQkoMVVMTCA8PCA4KQkvKiBhbGxvdyB1c2Ugb2YgYXR0cjIgZm9ybWF0ICovCiAjZGVmaW5lIFhGU19NT1VOVF9HUlBJRAkJKDFVTEwgPDwgOSkJLyogZ3JvdXAtSUQgYXNzaWduZWQgZnJvbSBkaXJlY3RvcnkgKi8KICNkZWZpbmUgWEZTX01PVU5UX05PUkVDT1ZFUlkJKDFVTEwgPDwgMTApCS8qIG5vIHJlY292ZXJ5IC0gZGlydHkgZnMgKi8KLSNkZWZpbmUgWEZTX01PVU5UX1NIQVJFRAkoMVVMTCA8PCAxMSkJLyogc2hhcmVkIG1vdW50ICovCiAjZGVmaW5lIFhGU19NT1VOVF9ERkxUX0lPU0laRQkoMVVMTCA8PCAxMikJLyogc2V0IGRlZmF1bHQgaS9vIHNpemUgKi8KICNkZWZpbmUgWEZTX01PVU5UX09TWU5DSVNPU1lOQwkoMVVMTCA8PCAxMykJLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KIAkJCQkJCS8qIG9zeW5jaXNkc3luYyBpcyBub3cgZGVmYXVsdCovCkBAIC00MzksNiArNDI0LDE2IEBACiAjZGVmaW5lIHhmc19mb3JjZV9zaHV0ZG93bihtLGYpCVwKIAl4ZnNfZG9fZm9yY2Vfc2h1dGRvd24obSwgZiwgX19GSUxFX18sIF9fTElORV9fKQogCisjZGVmaW5lIFNIVVRET1dOX01FVEFfSU9fRVJST1IJMHgwMDAxCS8qIHdyaXRlIGF0dGVtcHQgdG8gbWV0YWRhdGEgZmFpbGVkICovCisjZGVmaW5lIFNIVVRET1dOX0xPR19JT19FUlJPUgkweDAwMDIJLyogd3JpdGUgYXR0ZW1wdCB0byB0aGUgbG9nIGZhaWxlZCAqLworI2RlZmluZSBTSFVURE9XTl9GT1JDRV9VTU9VTlQJMHgwMDA0CS8qIHNodXRkb3duIGZyb20gYSBmb3JjZWQgdW5tb3VudCAqLworI2RlZmluZSBTSFVURE9XTl9DT1JSVVBUX0lOQ09SRQkweDAwMDgJLyogY29ycnVwdCBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIFNIVVRET1dOX1JFTU9URV9SRVEJMHgwMDEwCS8qIHNodXRkb3duIGNhbWUgZnJvbSByZW1vdGUgY2VsbCAqLworI2RlZmluZSBTSFVURE9XTl9ERVZJQ0VfUkVRCTB4MDAyMAkvKiBmYWlsZWQgYWxsIHBhdGhzIHRvIHRoZSBkZXZpY2UgKi8KKworI2RlZmluZSB4ZnNfdGVzdF9mb3JfZnJlZXplKG1wKQkJKChtcCktPm1fc3VwZXItPnNfZnJvemVuKQorI2RlZmluZSB4ZnNfd2FpdF9mb3JfZnJlZXplKG1wLGwpCXZmc19jaGVja19mcm96ZW4oKG1wKS0+bV9zdXBlciwgKGwpKQorCiAvKgogICogRmxhZ3MgZm9yIHhmc19tb3VudGZzCiAgKi8KQEAgLTUwOCwxNCArNTAzLDEyIEBACiAjZGVmaW5lCVhGU19NT1VOVF9JTE9DSyhtcCkJbXV0ZXhfbG9jaygmKChtcCktPm1faWxvY2spKQogI2RlZmluZQlYRlNfTU9VTlRfSVVOTE9DSyhtcCkJbXV0ZXhfdW5sb2NrKCYoKG1wKS0+bV9pbG9jaykpCiAKLWV4dGVybiB2b2lkCXhmc19tb2Rfc2IoeGZzX3RyYW5zX3QgKiwgX19pbnQ2NF90KTsKIGV4dGVybiBpbnQJeGZzX2xvZ19zYmNvdW50KHhmc19tb3VudF90ICosIHVpbnQpOwogZXh0ZXJuIGludAl4ZnNfbW91bnRmcyh4ZnNfbW91bnRfdCAqbXApOwogZXh0ZXJuIHZvaWQJeGZzX21vdW50ZnNfY2hlY2tfYmFycmllcnMoeGZzX21vdW50X3QgKm1wKTsKIAogZXh0ZXJuIHZvaWQJeGZzX3VubW91bnRmcyh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBpbnQJeGZzX3VubW91bnRmc193cml0ZXNiKHhmc19tb3VudF90ICopOwotZXh0ZXJuIGludAl4ZnNfdW5tb3VudF9mbHVzaCh4ZnNfbW91bnRfdCAqLCBpbnQpOwogZXh0ZXJuIGludAl4ZnNfbW9kX2luY29yZV9zYih4ZnNfbW91bnRfdCAqLCB4ZnNfc2JfZmllbGRfdCwgaW50NjRfdCwgaW50KTsKIGV4dGVybiBpbnQJeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoeGZzX21vdW50X3QgKiwgeGZzX3NiX2ZpZWxkX3QsCiAJCQlpbnQ2NF90LCBpbnQpOwpAQCAtNTI1LDIwICs1MTgsMjAgQEAKIGV4dGVybiBpbnQJeGZzX3JlYWRzYih4ZnNfbW91bnRfdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQJeGZzX2ZyZWVzYih4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBpbnQJeGZzX2ZzX3dyaXRhYmxlKHhmc19tb3VudF90ICopOwotZXh0ZXJuIGludAl4ZnNfc3luY3N1Yih4ZnNfbW91bnRfdCAqLCBpbnQsIGludCAqKTsKLWV4dGVybiBpbnQJeGZzX3N5bmNfaW5vZGVzKHhmc19tb3VudF90ICosIGludCwgaW50ICopOwotZXh0ZXJuIHhmc19hZ251bWJlcl90CXhmc19pbml0aWFsaXplX3BlcmFnKHhmc19tb3VudF90ICosIHhmc19hZ251bWJlcl90KTsKLWV4dGVybiB2b2lkCXhmc19zYl9mcm9tX2Rpc2soc3RydWN0IHhmc19zYiAqLCBzdHJ1Y3QgeGZzX2RzYiAqKTsKLWV4dGVybiB2b2lkCXhmc19zYl90b19kaXNrKHN0cnVjdCB4ZnNfZHNiICosIHN0cnVjdCB4ZnNfc2IgKiwgX19pbnQ2NF90KTsKIGV4dGVybiBpbnQJeGZzX3NiX3ZhbGlkYXRlX2ZzYl9jb3VudChzdHJ1Y3QgeGZzX3NiICosIF9fdWludDY0X3QpOwogCi1leHRlcm4gaW50CXhmc19kbW9wc19nZXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKik7CitleHRlcm4gaW50CXhmc19kbW9wc19nZXQoc3RydWN0IHhmc19tb3VudCAqKTsKIGV4dGVybiB2b2lkCXhmc19kbW9wc19wdXQoc3RydWN0IHhmc19tb3VudCAqKTsKLWV4dGVybiBpbnQJeGZzX3Ftb3BzX2dldChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfbW91bnRfYXJncyAqKTsKK2V4dGVybiBpbnQJeGZzX3Ftb3BzX2dldChzdHJ1Y3QgeGZzX21vdW50ICopOwogZXh0ZXJuIHZvaWQJeGZzX3Ftb3BzX3B1dChzdHJ1Y3QgeGZzX21vdW50ICopOwogCiBleHRlcm4gc3RydWN0IHhmc19kbW9wcyB4ZnNfZG1jb3JlX3hmczsKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAorZXh0ZXJuIHZvaWQJeGZzX21vZF9zYihzdHJ1Y3QgeGZzX3RyYW5zICosIF9faW50NjRfdCk7CitleHRlcm4geGZzX2FnbnVtYmVyX3QJeGZzX2luaXRpYWxpemVfcGVyYWcoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfYWdudW1iZXJfdCk7CitleHRlcm4gdm9pZAl4ZnNfc2JfZnJvbV9kaXNrKHN0cnVjdCB4ZnNfc2IgKiwgc3RydWN0IHhmc19kc2IgKik7CitleHRlcm4gdm9pZAl4ZnNfc2JfdG9fZGlzayhzdHJ1Y3QgeGZzX2RzYiAqLCBzdHJ1Y3QgeGZzX3NiICosIF9faW50NjRfdCk7CisKICNlbmRpZgkvKiBfX1hGU19NT1VOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcW1vcHMuYyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwppbmRleCBhMjk0ZTU4Li4yN2Y4MDU4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Ftb3BzLmMKKysrIGIvZnMveGZzL3hmc19xbW9wcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX3F1b3RhLmgiCiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCi0jaW5jbHVkZSAieGZzX2NsbnQuaCIKIAogCiBTVEFUSUMgc3RydWN0IHhmc19kcXVvdCAqCkBAIC0xMzEsOSArMTMwLDkgQEAKIH07CiAKIGludAoteGZzX3Ftb3BzX2dldChzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19tb3VudF9hcmdzICphcmdzKQoreGZzX3Ftb3BzX2dldChzdHJ1Y3QgeGZzX21vdW50ICptcCkKIHsKLQlpZiAoYXJncy0+ZmxhZ3MgJiAoWEZTTU5UX1VRVU9UQSB8IFhGU01OVF9QUVVPVEEgfCBYRlNNTlRfR1FVT1RBKSkgeworCWlmIChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpIHsKICNpZmRlZiBDT05GSUdfWEZTX1FVT1RBCiAJCW1wLT5tX3FtX29wcyA9ICZ4ZnNfcW1jb3JlX3hmczsKICNlbHNlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3F1b3RhLmggYi9mcy94ZnMveGZzX3F1b3RhLmgKaW5kZXggMTJjNGVjNy4uNDg5NjVlYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19xdW90YS5oCisrKyBiL2ZzL3hmcy94ZnNfcXVvdGEuaApAQCAtODQsMTEgKzg0LDkgQEAKICNkZWZpbmUgWEZTX0RRX1VTRVIJCTB4MDAwMQkJLyogYSB1c2VyIHF1b3RhICovCiAjZGVmaW5lIFhGU19EUV9QUk9KCQkweDAwMDIJCS8qIHByb2plY3QgcXVvdGEgKi8KICNkZWZpbmUgWEZTX0RRX0dST1VQCQkweDAwMDQJCS8qIGEgZ3JvdXAgcXVvdGEgKi8KLSNkZWZpbmUgWEZTX0RRX0ZMT0NLRUQJCTB4MDAwOAkJLyogZmx1c2ggbG9jayB0YWtlbiAqLwotI2RlZmluZSBYRlNfRFFfRElSVFkJCTB4MDAxMAkJLyogZHF1b3QgaXMgZGlydHkgKi8KLSNkZWZpbmUgWEZTX0RRX1dBTlQJCTB4MDAyMAkJLyogZm9yIGxvb2t1cC9yZWNsYWltIHJhY2UgKi8KLSNkZWZpbmUgWEZTX0RRX0lOQUNUSVZFCQkweDAwNDAJCS8qIGRxIG9mZiBtcGxpc3QgJiBoYXNobGlzdCAqLwotI2RlZmluZSBYRlNfRFFfTUFSS0VSCQkweDAwODAJCS8qIHNlbnRpbmVsICovCisjZGVmaW5lIFhGU19EUV9ESVJUWQkJMHgwMDA4CQkvKiBkcXVvdCBpcyBkaXJ0eSAqLworI2RlZmluZSBYRlNfRFFfV0FOVAkJMHgwMDEwCQkvKiBmb3IgbG9va3VwL3JlY2xhaW0gcmFjZSAqLworI2RlZmluZSBYRlNfRFFfSU5BQ1RJVkUJCTB4MDAyMAkJLyogZHEgb2ZmIG1wbGlzdCAmIGhhc2hsaXN0ICovCiAKICNkZWZpbmUgWEZTX0RRX0FMTFRZUEVTCQkoWEZTX0RRX1VTRVJ8WEZTX0RRX1BST0p8WEZTX0RRX0dST1VQKQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JlbmFtZS5jIGIvZnMveGZzL3hmc19yZW5hbWUuYwppbmRleCBjOTAzMTMwLi44NjQ3MWJiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JlbmFtZS5jCisrKyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKQEAgLTQyLDMxICs0Miw2IEBACiAKIAogLyoKLSAqIEdpdmVuIGFuIGFycmF5IG9mIHVwIHRvIDQgaW5vZGUgcG9pbnRlcnMsIHVubG9jayB0aGUgcG9pbnRlZCB0byBpbm9kZXMuCi0gKiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiA0IGVudHJpZXMgaW4gdGhlIGFycmF5LCB0aGUgZW1wdHkgZW50cmllcyB3aWxsCi0gKiBiZSBhdCB0aGUgZW5kIGFuZCB3aWxsIGhhdmUgTlVMTCBwb2ludGVycyBpbiB0aGVtLgotICovCi1TVEFUSUMgdm9pZAoteGZzX3JlbmFtZV91bmxvY2s0KAotCXhmc19pbm9kZV90CSoqaV90YWIsCi0JdWludAkJbG9ja19tb2RlKQotewotCWludAlpOwotCi0JeGZzX2l1bmxvY2soaV90YWJbMF0sIGxvY2tfbW9kZSk7Ci0JZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgewotCQlpZiAoaV90YWJbaV0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIFdhdGNoIG91dCBmb3IgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhYmxlLgotCQkgKi8KLQkJaWYgKGlfdGFiW2ldICE9IGlfdGFiW2ktMV0pCi0JCQl4ZnNfaXVubG9jayhpX3RhYltpXSwgbG9ja19tb2RlKTsKLQl9Ci19Ci0KLS8qCiAgKiBFbnRlciBhbGwgaW5vZGVzIGZvciBhIHJlbmFtZSB0cmFuc2FjdGlvbiBpbnRvIGEgc29ydGVkIGFycmF5LgogICovCiBTVEFUSUMgdm9pZApAQCAtMjA1LDE5ICsxODAsNiBAQAogCXhmc19sb2NrX2lub2Rlcyhpbm9kZXMsIG51bV9pbm9kZXMsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCi0JICogSWYgd2UgYXJlIHVzaW5nIHByb2plY3QgaW5oZXJpdGFuY2UsIHdlIG9ubHkgYWxsb3cgcmVuYW1lcwotCSAqIGludG8gb3VyIHRyZWUgd2hlbiB0aGUgcHJvamVjdCBJRHMgYXJlIHRoZSBzYW1lOyBlbHNlIHRoZQotCSAqIHRyZWUgcXVvdGEgbWVjaGFuaXNtIHdvdWxkIGJlIGNpcmN1bXZlbnRlZC4KLQkgKi8KLQlpZiAodW5saWtlbHkoKHRhcmdldF9kcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCkgJiYKLQkJICAgICAodGFyZ2V0X2RwLT5pX2QuZGlfcHJvamlkICE9IHNyY19pcC0+aV9kLmRpX3Byb2ppZCkpKSB7Ci0JCWVycm9yID0gWEZTX0VSUk9SKEVYREVWKTsKLQkJeGZzX3JlbmFtZV91bmxvY2s0KGlub2RlcywgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOwotCQlnb3RvIHN0ZF9yZXR1cm47Ci0JfQotCi0JLyoKIAkgKiBKb2luIGFsbCB0aGUgaW5vZGVzIHRvIHRoZSB0cmFuc2FjdGlvbi4gRnJvbSB0aGlzIHBvaW50IG9uLAogCSAqIHdlIGNhbiByZWx5IG9uIGVpdGhlciB0cmFuc19jb21taXQgb3IgdHJhbnNfY2FuY2VsIHRvIHVubG9jawogCSAqIHRoZW0uICBOb3RlIHRoYXQgd2UgbmVlZCB0byBhZGQgYSB2bm9kZSByZWZlcmVuY2UgdG8gdGhlCkBAIC0yNDIsNiArMjA0LDE3IEBACiAJfQogCiAJLyoKKwkgKiBJZiB3ZSBhcmUgdXNpbmcgcHJvamVjdCBpbmhlcml0YW5jZSwgd2Ugb25seSBhbGxvdyByZW5hbWVzCisJICogaW50byBvdXIgdHJlZSB3aGVuIHRoZSBwcm9qZWN0IElEcyBhcmUgdGhlIHNhbWU7IGVsc2UgdGhlCisJICogdHJlZSBxdW90YSBtZWNoYW5pc20gd291bGQgYmUgY2lyY3VtdmVudGVkLgorCSAqLworCWlmICh1bmxpa2VseSgodGFyZ2V0X2RwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1BST0pJTkhFUklUKSAmJgorCQkgICAgICh0YXJnZXRfZHAtPmlfZC5kaV9wcm9qaWQgIT0gc3JjX2lwLT5pX2QuZGlfcHJvamlkKSkpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRVhERVYpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwkvKgogCSAqIFNldCB1cCB0aGUgdGFyZ2V0LgogCSAqLwogCWlmICh0YXJnZXRfaXAgPT0gTlVMTCkgewpAQCAtMzY3LDE5ICszNDAsMTEgQEAKIAkJCQkJJmZpcnN0X2Jsb2NrLCAmZnJlZV9saXN0LCBzcGFjZXJlcyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGFib3J0X3JldHVybjsKKwogCXhmc19pY2hndGltZShzcmNfZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKLQotCS8qCi0JICogVXBkYXRlIHRoZSBnZW5lcmF0aW9uIGNvdW50cyBvbiBhbGwgdGhlIGRpcmVjdG9yeSBpbm9kZXMKLQkgKiB0aGF0IHdlJ3JlIG1vZGlmeWluZy4KLQkgKi8KLQlzcmNfZHAtPmlfZ2VuKys7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgc3JjX2RwLCBYRlNfSUxPR19DT1JFKTsKLQotCWlmIChuZXdfcGFyZW50KSB7Ci0JCXRhcmdldF9kcC0+aV9nZW4rKzsKKwlpZiAobmV3X3BhcmVudCkKIAkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdGFyZ2V0X2RwLCBYRlNfSUxPR19DT1JFKTsKLQl9CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCmluZGV4IGUyZjY4ZGUuLmVkZjEyYzcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCkBAIC04NSw3ICs4NSw2IEBACiB7CiAJeGZzX2ZpbGVvZmZfdAlibm87CQkvKiBibG9jayBudW1iZXIgaW4gZmlsZSAqLwogCXhmc19idWZfdAkqYnA7CQkvKiB0ZW1wb3JhcnkgYnVmZmVyIGZvciB6ZXJvaW5nICovCi0JaW50CQljYW5jZWxmbGFnczsJLyogZmxhZ3MgZm9yIHhmc190cmFuc19jYW5jZWwgKi8KIAlpbnQJCWNvbW1pdHRlZDsJLyogdHJhbnNhY3Rpb24gY29tbWl0dGVkIGZsYWcgKi8KIAl4ZnNfZGFkZHJfdAlkOwkJLyogZGlzayBibG9jayBhZGRyZXNzICovCiAJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwpAQCAtOTYsMTUgKzk1LDE2IEBACiAJeGZzX2JtYnRfaXJlY190CW1hcDsJCS8qIGJsb2NrIG1hcCBvdXRwdXQgKi8KIAlpbnQJCW5tYXA7CQkvKiBudW1iZXIgb2YgYmxvY2sgbWFwcyAqLwogCWludAkJcmVzYmxrczsJLyogc3BhY2UgcmVzZXJ2YXRpb24gKi8KLQl4ZnNfdHJhbnNfdAkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAKIAkvKgogCSAqIEFsbG9jYXRlIHNwYWNlIHRvIHRoZSBmaWxlLCBhcyBuZWNlc3NhcnkuCiAJICovCiAJd2hpbGUgKG9ibG9ja3MgPCBuYmxvY2tzKSB7CisJCWludAkJY2FuY2VsZmxhZ3MgPSAwOworCQl4ZnNfdHJhbnNfdAkqdHA7CisKIAkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19HUk9XRlNSVF9BTExPQyk7CiAJCXJlc2Jsa3MgPSBYRlNfR1JPV0ZTUlRfU1BBQ0VfUkVTKG1wLCBuYmxvY2tzIC0gb2Jsb2Nrcyk7Ci0JCWNhbmNlbGZsYWdzID0gMDsKIAkJLyoKIAkJICogUmVzZXJ2ZSBzcGFjZSAmIGxvZyBmb3Igb25lIGV4dGVudCBhZGRlZCB0byB0aGUgZmlsZS4KIAkJICovCkBAIC0xNzEsNyArMTcxLDkgQEAKIAkJCQltcC0+bV9ic2l6ZSwgMCk7CiAJCQlpZiAoYnAgPT0gTlVMTCkgewogCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7Ci0JCQkJZ290byBlcnJvcl9jYW5jZWw7CitlcnJvcl9jYW5jZWw6CisJCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsZmxhZ3MpOworCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCQltZW1zZXQoWEZTX0JVRl9QVFIoYnApLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUgLSAxKTsKQEAgLTE4OCw4ICsxOTAsNiBAQAogCQlvYmxvY2tzID0gbWFwLmJyX3N0YXJ0b2ZmICsgbWFwLmJyX2Jsb2NrY291bnQ7CiAJfQogCXJldHVybiAwOwotZXJyb3JfY2FuY2VsOgotCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbGZsYWdzKTsKIGVycm9yOgogCXJldHVybiBlcnJvcjsKIH0KQEAgLTE4NTYsNyArMTg1Niw2IEBACiB7CiAJeGZzX3J0YmxvY2tfdAlibWJubzsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KIAl4ZnNfYnVmX3QJKmJwOwkJLyogdGVtcG9yYXJ5IGJ1ZmZlciAqLwotCWludAkJY2FuY2VsZmxhZ3M7CS8qIGZsYWdzIGZvciB4ZnNfdHJhbnNfY2FuY2VsICovCiAJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwogCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBpbm9kZSwgdXNlZCBhcyBsb2NrICovCiAJeGZzX21vdW50X3QJKm5tcDsJCS8qIG5ldyAoZmFrZSkgbW91bnQgc3RydWN0dXJlICovCkBAIC0xODcyLDEzICsxODcxLDEzIEBACiAJeGZzX2V4dGxlbl90CXJzdW1ibG9ja3M7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIHJ0IHN1bW1hcnkgYmxrcyAqLwogCXhmc19zYl90CSpzYnA7CQkvKiBvbGQgc3VwZXJibG9jayAqLwogCXhmc19mc2Jsb2NrX3QJc3VtYm5vOwkJLyogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KLQl4ZnNfdHJhbnNfdAkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCiAKIAlzYnAgPSAmbXAtPm1fc2I7Ci0JY2FuY2VsZmxhZ3MgPSAwOwogCS8qCiAJICogSW5pdGlhbCBlcnJvciBjaGVja2luZy4KIAkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOwogCWlmIChtcC0+bV9ydGRldl90YXJncCA9PSBOVUxMIHx8IG1wLT5tX3JibWlwID09IE5VTEwgfHwKIAkgICAgKG5yYmxvY2tzID0gaW4tPm5ld2Jsb2NrcykgPD0gc2JwLT5zYl9yYmxvY2tzIHx8CiAJICAgIChzYnAtPnNiX3JibG9ja3MgJiYgKGluLT5leHRzaXplICE9IHNicC0+c2JfcmV4dHNpemUpKSkKQEAgLTE5NDIsNiArMTk0MSw5IEBACiAJCSAgICAgKChzYnAtPnNiX3JleHRlbnRzICYgKCgxIDw8IG1wLT5tX2Jsa2JpdF9sb2cpIC0gMSkpICE9IDApOwogCSAgICAgYm1ibm8gPCBucmJtYmxvY2tzOwogCSAgICAgYm1ibm8rKykgeworCQl4ZnNfdHJhbnNfdAkqdHA7CisJCWludAkJY2FuY2VsZmxhZ3MgPSAwOworCiAJCSpubXAgPSAqbXA7CiAJCW5zYnAgPSAmbm1wLT5tX3NiOwogCQkvKgpAQCAtMTk2NywxNiArMTk2OSwxNSBAQAogCQkgKiBTdGFydCBhIHRyYW5zYWN0aW9uLCBnZXQgdGhlIGxvZyByZXNlcnZhdGlvbi4KIAkJICovCiAJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfR1JPV0ZTUlRfRlJFRSk7Ci0JCWNhbmNlbGZsYWdzID0gMDsKIAkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAogCQkJCVhGU19HUk9XUlRGUkVFX0xPR19SRVMobm1wKSwgMCwgMCwgMCkpKQotCQkJYnJlYWs7CisJCQlnb3RvIGVycm9yX2NhbmNlbDsKIAkJLyoKIAkJICogTG9jayBvdXQgb3RoZXIgY2FsbGVycyBieSBncmFiYmluZyB0aGUgYml0bWFwIGlub2RlIGxvY2suCiAJCSAqLwogCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX2lnZXQobXAsIHRwLCBtcC0+bV9zYi5zYl9yYm1pbm8sIDAsCiAJCQkJCQlYRlNfSUxPQ0tfRVhDTCwgJmlwKSkpCi0JCQlicmVhazsKKwkJCWdvdG8gZXJyb3JfY2FuY2VsOwogCQlBU1NFUlQoaXAgPT0gbXAtPm1fcmJtaXApOwogCQkvKgogCQkgKiBVcGRhdGUgdGhlIGJpdG1hcCBpbm9kZSdzIHNpemUuCkBAIC0xOTkwLDcgKzE5OTEsNyBAQAogCQkgKi8KIAkJaWYgKChlcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgbXAtPm1fc2Iuc2JfcnN1bWlubywgMCwKIAkJCQkJCVhGU19JTE9DS19FWENMLCAmaXApKSkKLQkJCWJyZWFrOworCQkJZ290byBlcnJvcl9jYW5jZWw7CiAJCUFTU0VSVChpcCA9PSBtcC0+bV9yc3VtaXApOwogCQkvKgogCQkgKiBVcGRhdGUgdGhlIHN1bW1hcnkgaW5vZGUncyBzaXplLgpAQCAtMjAwNSw3ICsyMDA2LDcgQEAKIAkJICAgIG1wLT5tX3JzdW1sZXZlbHMgIT0gbm1wLT5tX3JzdW1sZXZlbHMpIHsKIAkJCWVycm9yID0geGZzX3J0Y29weV9zdW1tYXJ5KG1wLCBubXAsIHRwKTsKIAkJCWlmIChlcnJvcikKLQkJCQlicmVhazsKKwkJCQlnb3RvIGVycm9yX2NhbmNlbDsKIAkJfQogCQkvKgogCQkgKiBVcGRhdGUgc3VwZXJibG9jayBmaWVsZHMuCkBAIC0yMDMxLDggKzIwMzIsMTEgQEAKIAkJYnAgPSBOVUxMOwogCQllcnJvciA9IHhmc19ydGZyZWVfcmFuZ2Uobm1wLCB0cCwgc2JwLT5zYl9yZXh0ZW50cywKIAkJCW5zYnAtPnNiX3JleHRlbnRzIC0gc2JwLT5zYl9yZXh0ZW50cywgJmJwLCAmc3VtYm5vKTsKLQkJaWYgKGVycm9yKQorCQlpZiAoZXJyb3IpIHsKK2Vycm9yX2NhbmNlbDoKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbGZsYWdzKTsKIAkJCWJyZWFrOworCQl9CiAJCS8qCiAJCSAqIE1hcmsgbW9yZSBibG9ja3MgZnJlZSBpbiB0aGUgc3VwZXJibG9jay4KIAkJICovCkBAIC0yMDQ1LDE1ICsyMDQ5LDEwIEBACiAJCW1wLT5tX3JzdW1zaXplID0gbnJzdW1zaXplOwogCiAJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7Ci0JCWlmIChlcnJvcikgewotCQkJdHAgPSBOVUxMOworCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKLQkJfQogCX0KIAotCWlmIChlcnJvciAmJiB0cCkKLQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsZmxhZ3MpOwotCiAJLyoKIAkgKiBGcmVlIHRoZSBmYWtlIG1wIHN0cnVjdHVyZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuYyBiL2ZzL3hmcy94ZnNfcncuYwppbmRleCAzYTgyNTc2Li4zNmYzYTIxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3J3LmMKKysrIGIvZnMveGZzL3hmc19ydy5jCkBAIC00MDYsNyArNDA2LDcgQEAKIAkgKiBYWFhzdXAgaG93IGRvZXMgdGhpcyB3b3JrIGZvciBxdW90YXMuCiAJICovCiAJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4ZnNfYmRzdHJhdF9jYik7Ci0JWEZTX0JVRl9TRVRfRlNQUklWQVRFMyhicCwgbXApOworCWJwLT5iX21vdW50ID0gbXA7CiAJWEZTX0JVRl9XUklURShicCk7CiAKIAlpZiAoKGVycm9yID0gWEZTX2J3cml0ZShicCkpKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3NiLmggYi9mcy94ZnMveGZzX3NiLmgKaW5kZXggM2Y4Y2YxNS4uMWVkNzE5MSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zYi5oCisrKyBiL2ZzL3hmcy94ZnNfc2IuaApAQCAtNzksNiArNzksNyBAQAogI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfTEFaWVNCQ09VTlRCSVQJMHgwMDAwMDAwMgkvKiBTdXBlcmJsayBjb3VudGVycyAqLwogI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVTRVJWRUQ0QklUCTB4MDAwMDAwMDQKICNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUCTB4MDAwMDAwMDgJLyogSW5saW5lIGF0dHIgcmV3b3JrICovCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9QQVJFTlRCSVQJMHgwMDAwMDAxMAkvKiBwYXJlbnQgcG9pbnRlcnMgKi8KIAogI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tSRUFMRkJJVFMJXAogCShYRlNfU0JfVkVSU0lPTjJfTEFaWVNCQ09VTlRCSVQJfCBcCkBAIC0yOTYsMzAgKzI5NywzNCBAQAogCiAjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTShzYnApCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX05VTUJJVFMpCiAKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19zYl9nb29kX3ZlcnNpb24oeGZzX3NiX3QgKnNicCkKK3sKKwkvKiBXZSBhbHdheXMgc3VwcG9ydCB2ZXJzaW9uIDEtMyAqLworCWlmIChzYnAtPnNiX3ZlcnNpb25udW0gPj0gWEZTX1NCX1ZFUlNJT05fMSAmJgorCSAgICBzYnAtPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMykKKwkJcmV0dXJuIDE7CisKKwkvKiBXZSBzdXBwb3J0IHZlcnNpb24gNCBpZiBhbGwgZmVhdHVyZSBiaXRzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgeworCQlpZiAoKHNicC0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9PS1JFQUxCSVRTKSB8fAorCQkgICAgKChzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCkgJiYKKwkJICAgICAoc2JwLT5zYl9mZWF0dXJlczIgJiB+WEZTX1NCX1ZFUlNJT04yX09LUkVBTEJJVFMpKSkKKwkJCXJldHVybiAwOworCiAjaWZkZWYgX19LRVJORUxfXwotc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX2dvb2RfdmVyc2lvbih4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiAoKChzYnAtPnNiX3ZlcnNpb25udW0gPj0gWEZTX1NCX1ZFUlNJT05fMSkgJiYgXAotCQkgIChzYnAtPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMykpIHx8IFwKLQkJICAgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSAgICAhKChzYnAtPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUykgfHwgXAotCQkgICAgICAoKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSAmJiBcCi0JCSAgICAgICAoc2JwLT5zYl9mZWF0dXJlczIgJiB+WEZTX1NCX1ZFUlNJT04yX09LUkVBTEJJVFMpKSkgJiYgXAotCSAgCSAgICAoc2JwLT5zYl9zaGFyZWRfdm4gPD0gWEZTX1NCX01BWF9TSEFSRURfVk4pKSk7Ci19CisJCWlmIChzYnAtPnNiX3NoYXJlZF92biA+IFhGU19TQl9NQVhfU0hBUkVEX1ZOKQorCQkJcmV0dXJuIDA7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX2dvb2RfdmVyc2lvbih4ZnNfc2JfdCAqc2JwKQotewotCXJldHVybiAoKChzYnAtPnNiX3ZlcnNpb25udW0gPj0gWEZTX1NCX1ZFUlNJT05fMSkgJiYgXAotCQkgIChzYnAtPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMykpIHx8IFwKLQkJICAgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSAgICAhKChzYnAtPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUykgfHwgXAotCQkgICAgICAoKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSAmJiBcCi0JCSAgICAgICAoc2JwLT5zYl9mZWF0dXJlczIgJiB+WEZTX1NCX1ZFUlNJT04yX09LUkVBTEJJVFMpKSkgJiYgXAotCQkgICghKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkgfHwgXAotCQkgICAoc2JwLT5zYl9zaGFyZWRfdm4gPD0gWEZTX1NCX01BWF9TSEFSRURfVk4pKSkpOworCQlpZiAoKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkgJiYKKwkJICAgIHNicC0+c2Jfc2hhcmVkX3ZuID4gWEZTX1NCX01BWF9TSEFSRURfVk4pCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwogfQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyoKICAqIERldGVjdCBhIG1pc21hdGNoZWQgZmVhdHVyZXMyIGZpZWxkLiAgT2xkZXIga2VybmVscyByZWFkL3dyb3RlCkBAIC0zMzIsMTIzICszMzcsMTI3IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgeGZzX3NiX3ZlcnNpb25fdG9uZXcodW5zaWduZWQgdikKIHsKLQlyZXR1cm4gKCgoKHYpID09IFhGU19TQl9WRVJTSU9OXzEpID8gXAotCQkwIDogXAotCQkoKCh2KSA9PSBYRlNfU0JfVkVSU0lPTl8yKSA/IFwKLQkJCVhGU19TQl9WRVJTSU9OX0FUVFJCSVQgOiBcCi0JCQkoWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8IFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSkpIHwgXAotCQlYRlNfU0JfVkVSU0lPTl80KTsKKwlpZiAodiA9PSBYRlNfU0JfVkVSU0lPTl8xKQorCQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fNDsKKworCWlmICh2ID09IFhGU19TQl9WRVJTSU9OXzIpCisJCXJldHVybiBYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVDsKKworCXJldHVybiBYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8CisJCVhGU19TQl9WRVJTSU9OX05MSU5LQklUOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHhmc19zYl92ZXJzaW9uX3Rvb2xkKHVuc2lnbmVkIHYpCiB7Ci0JcmV0dXJuICgoKHYpICYgKFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKSA/IFwKLQkJMCA6IFwKLQkJKCgodikgJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkgPyBcCi0JCQlYRlNfU0JfVkVSU0lPTl8zIDogXAotCQkJKCgodikgJiBYRlNfU0JfVkVSU0lPTl9BVFRSQklUKSA/ICBcCi0JCQkJWEZTX1NCX1ZFUlNJT05fMiA6IFwKLQkJCQlYRlNfU0JfVkVSU0lPTl8xKSkpOworCWlmICh2ICYgKFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKQorCQlyZXR1cm4gMDsKKwlpZiAodiAmIFhGU19TQl9WRVJTSU9OX05MSU5LQklUKQorCQlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fMzsKKwlpZiAodiAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpCisJCXJldHVybiBYRlNfU0JfVkVSU0lPTl8yOworCXJldHVybiBYRlNfU0JfVkVSU0lPTl8xOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHhmc19zYl90ICpzYnApCiB7Ci0JcmV0dXJuICgoc2JwKS0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8yKSB8fCBcCi0JCSAoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMykgfHwgXAotCQkgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSAgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkpOworCXJldHVybiBzYnAtPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMiB8fAorCQlzYnAtPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMyB8fAorCQkoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkgKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHhmc19zYl92ZXJzaW9uX2FkZGF0dHIoeGZzX3NiX3QgKnNicCkKIHsKLQkoc2JwKS0+c2JfdmVyc2lvbm51bSA9ICgoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMSkgPyBcCi0JCVhGU19TQl9WRVJTSU9OXzIgOiBcCi0JCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgPyBcCi0JCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9BVFRSQklUKSA6IFwKLQkJCShYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkpKTsKKwlpZiAoc2JwLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzEpCisJCXNicC0+c2JfdmVyc2lvbm51bSA9IFhGU19TQl9WRVJTSU9OXzI7CisJZWxzZSBpZiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkKKwkJc2JwLT5zYl92ZXJzaW9ubnVtIHw9IFhGU19TQl9WRVJTSU9OX0FUVFJCSVQ7CisJZWxzZQorCQlzYnAtPnNiX3ZlcnNpb25udW0gPSBYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzMpIHx8IFwKLQkJICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAotCQkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSk7CisJcmV0dXJuIHNicC0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8zIHx8CisJCSAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkgIChzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoeGZzX3NiX3QgKnNicCkKIHsKLQkoc2JwKS0+c2JfdmVyc2lvbm51bSA9ICgoc2JwKS0+c2JfdmVyc2lvbm51bSA8PSBYRlNfU0JfVkVSU0lPTl8yID8gXAotCQlYRlNfU0JfVkVSU0lPTl8zIDogXAotCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpOworCWlmIChzYnAtPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMikKKwkJc2JwLT5zYl92ZXJzaW9ubnVtID0gWEZTX1NCX1ZFUlNJT05fMzsKKwllbHNlCisJCXNicC0+c2JfdmVyc2lvbm51bSB8PSBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzcXVvdGEoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQpOworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80ICYmCisJCShzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfc2JfdmVyc2lvbl9hZGRxdW90YSh4ZnNfc2JfdCAqc2JwKQogewotCShzYnApLT5zYl92ZXJzaW9ubnVtID0gXAotCQkgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgPyBcCi0JCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCkgOiBcCi0JCQkoeGZzX3NiX3ZlcnNpb25fdG9uZXcoKHNicCktPnNiX3ZlcnNpb25udW0pIHwgXAotCQkJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSk7CisJaWYgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpCisJCXNicC0+c2JfdmVyc2lvbm51bSB8PSBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVDsKKwllbHNlCisJCXNicC0+c2JfdmVyc2lvbm51bSA9IHhmc19zYl92ZXJzaW9uX3RvbmV3KHNicC0+c2JfdmVyc2lvbm51bSkgfAorCQkJCQlYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpOworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80ICYmCisJCShzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2RhbGlnbih4ZnNfc2JfdCAqc2JwKQogewotCXJldHVybiAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAotCQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpOworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80ICYmCisJCShzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNzaGFyZWQoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUKTsKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzZGlydjIoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRElSVjJCSVQpOworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80ICYmCisJCShzYnAtPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKHhmc19zYl90ICpzYnApCiB7Ci0JcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUKTsKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfc2JfdmVyc2lvbl9oYXNleHRmbGdiaXQoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKLQkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKTsKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHhmc19zYl90ICpzYnApCiB7Ci0JcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCk7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgJiYKKwkJKHNicC0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2FzY2lpY2koeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgogCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQk9SR0JJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHhmc19zYl90ICpzYnApCiB7Ci0JcmV0dXJuIChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKTsKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCAmJgorCQkoc2JwLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQpOwogfQogCiAvKgpAQCAtNDYzLDIyICs0NzIsMjAgQEAKIAogc3RhdGljIGlubGluZSBpbnQgeGZzX3NiX3ZlcnNpb25faGFzbGF6eXNiY291bnQoeGZzX3NiX3QgKnNicCkKIHsKLQlyZXR1cm4gKHhmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHNicCkgJiYJXAotCQkoKHNicCktPnNiX2ZlYXR1cmVzMiAmIFhGU19TQl9WRVJTSU9OMl9MQVpZU0JDT1VOVEJJVCkpOworCXJldHVybiB4ZnNfc2JfdmVyc2lvbl9oYXNtb3JlYml0cyhzYnApICYmCisJCShzYnAtPnNiX2ZlYXR1cmVzMiAmIFhGU19TQl9WRVJTSU9OMl9MQVpZU0JDT1VOVEJJVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHhmc19zYl92ZXJzaW9uX2hhc2F0dHIyKHhmc19zYl90ICpzYnApCiB7Ci0JcmV0dXJuICh4ZnNfc2JfdmVyc2lvbl9oYXNtb3JlYml0cyhzYnApKSAmJglcCi0JCSgoc2JwKS0+c2JfZmVhdHVyZXMyICYgWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUKTsKKwlyZXR1cm4geGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoc2JwKSAmJgorCQkoc2JwLT5zYl9mZWF0dXJlczIgJiBYRlNfU0JfVkVSU0lPTjJfQVRUUjJCSVQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkYXR0cjIoeGZzX3NiX3QgKnNicCkKIHsKLQkoKHNicCktPnNiX3ZlcnNpb25udW0gPQlcCi0JCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSwJXAotCSgoc2JwKS0+c2JfZmVhdHVyZXMyID0JXAotCQkoKHNicCktPnNiX2ZlYXR1cmVzMiB8IFhGU19TQl9WRVJTSU9OMl9BVFRSMkJJVCkpKTsKKwlzYnAtPnNiX3ZlcnNpb25udW0gfD0gWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQ7CisJc2JwLT5zYl9mZWF0dXJlczIgfD0gWEZTX1NCX1ZFUlNJT04yX0FUVFIyQklUOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZzX3NiX3ZlcnNpb25fcmVtb3ZlYXR0cjIoeGZzX3NiX3QgKnNicCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCA0ZTFjMjJhLi44NTcwYjgyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0yOTAsNyArMjkwLDcgQEAKIAlBU1NFUlQodHAtPnRfdGlja2V0ICE9IE5VTEwpOwogCiAJbnRwLT50X2ZsYWdzID0gWEZTX1RSQU5TX1BFUk1fTE9HX1JFUyB8ICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19SRVNFUlZFKTsKLQludHAtPnRfdGlja2V0ID0gdHAtPnRfdGlja2V0OworCW50cC0+dF90aWNrZXQgPSB4ZnNfbG9nX3RpY2tldF9nZXQodHAtPnRfdGlja2V0KTsKIAludHAtPnRfYmxrX3JlcyA9IHRwLT50X2Jsa19yZXMgLSB0cC0+dF9ibGtfcmVzX3VzZWQ7CiAJdHAtPnRfYmxrX3JlcyA9IHRwLT50X2Jsa19yZXNfdXNlZDsKIAludHAtPnRfcnR4X3JlcyA9IHRwLT50X3J0eF9yZXMgLSB0cC0+dF9ydHhfcmVzX3VzZWQ7CkBAIC0xMjYwLDYgKzEyNjAsMTMgQEAKIAl0cmFucyA9ICp0cHA7CiAKIAkvKgorCSAqIHRyYW5zYWN0aW9uIGNvbW1pdCB3b3JrZWQgb2sgc28gd2UgY2FuIGRyb3AgdGhlIGV4dHJhIHRpY2tldAorCSAqIHJlZmVyZW5jZSB0aGF0IHdlIGdhaW5lZCBpbiB4ZnNfdHJhbnNfZHVwKCkKKwkgKi8KKwl4ZnNfbG9nX3RpY2tldF9wdXQodHJhbnMtPnRfdGlja2V0KTsKKworCisJLyoKIAkgKiBSZXNlcnZlIHNwYWNlIGluIHRoZSBsb2cgZm9yIHRoIG5leHQgdHJhbnNhY3Rpb24uCiAJICogVGhpcyBhbHNvIHB1c2hlcyBpdGVtcyBpbiB0aGUgIkFJTCIsIHRoZSBsaXN0IG9mIGxvZ2dlZCBpdGVtcywKIAkgKiBvdXQgdG8gZGlzayBpZiB0aGV5IGFyZSB0YWtpbmcgdXAgc3BhY2UgYXQgdGhlIHRhaWwgb2YgdGhlIGxvZwpAQCAtMTM4MywxMSArMTM5MCwxMiBAQAogCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAJeGZzX2xzbl90CQlpdGVtX2xzbjsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcDsKIAlpbnQJCQlpOwogCiAJbGlkcCA9IGxpY3AtPmxpY19kZXNjczsKIAlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrLCBsaWRwKyspIHsKKwkJc3RydWN0IHhmc19haWwJCSphaWxwOworCiAJCWlmICh4ZnNfbGljX2lzZnJlZShsaWNwLCBpKSkgewogCQkJY29udGludWU7CiAJCX0KQEAgLTE0MjQsMTkgKzE0MzIsMTkgQEAKIAkJICogVGhpcyB3b3VsZCBjYXVzZSB0aGUgZWFybGllciB0cmFuc2FjdGlvbiB0byBmYWlsCiAJCSAqIHRoZSB0ZXN0IGJlbG93LgogCQkgKi8KLQkJbXAgPSBsaXAtPmxpX21vdW50cDsKLQkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJCWFpbHAgPSBsaXAtPmxpX2FpbHA7CisJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgbGlwLT5saV9sc24pID4gMCkgewogCQkJLyoKIAkJCSAqIFRoaXMgd2lsbCBzZXQgdGhlIGl0ZW0ncyBsc24gdG8gaXRlbV9sc24KIAkJCSAqIGFuZCB1cGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluCiAJCQkgKiB0aGUgQUlMLgogCQkJICoKLQkJCSAqIHhmc190cmFuc191cGRhdGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCQkJICogeGZzX3RyYW5zX2FpbF91cGRhdGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCQkgKi8KLQkJCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCBsaXAsIGl0ZW1fbHNuKTsKKwkJCXhmc190cmFuc19haWxfdXBkYXRlKGFpbHAsIGxpcCwgaXRlbV9sc24pOwogCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJfQogCiAJCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggNzRjODBiZC4uZDZmZTRhOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtMTgsNiArMTgsOCBAQAogI2lmbmRlZglfX1hGU19UUkFOU19IX18KICNkZWZpbmUJX19YRlNfVFJBTlNfSF9fCiAKK3N0cnVjdCB4ZnNfbG9nX2l0ZW07CisKIC8qCiAgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd3JpdHRlbiBpbiB0aGUgbG9nIGF0IHRoZSBoZWFkIG9mCiAgKiBldmVyeSB0cmFuc2FjdGlvbi4gSXQgaWRlbnRpZmllcyB0aGUgdHlwZSBhbmQgaWQgb2YgdGhlCkBAIC05OCw3NiArMTAwLDYgQEAKICNkZWZpbmUJWEZTX1RSQU5TX1RZUEVfTUFYCQk0MQogLyogbmV3IHRyYW5zYWN0aW9uIHR5cGVzIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluIHhmc19sb2dwcmludCg4KSAqLwogCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi1zdHJ1Y3QgeGZzX2J1ZjsKLXN0cnVjdCB4ZnNfYnVmdGFyZzsKLXN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtOwotc3RydWN0IHhmc19lZmlfbG9nX2l0ZW07Ci1zdHJ1Y3QgeGZzX2lub2RlOwotc3RydWN0IHhmc19pdGVtX29wczsKLXN0cnVjdCB4ZnNfbG9nX2lvdmVjOwotc3RydWN0IHhmc19sb2dfaXRlbTsKLXN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYzsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX3RyYW5zOwotc3RydWN0IHhmc19kcXVvdF9hY2N0OwotCi10eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gewotCXN0cnVjdCBsaXN0X2hlYWQJCWxpX2FpbDsJCS8qIEFJTCBwb2ludGVycyAqLwotCXhmc19sc25fdAkJCWxpX2xzbjsJCS8qIGxhc3Qgb24tZGlzayBsc24gKi8KLQlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKmxpX2Rlc2M7CS8qIHB0ciB0byBjdXJyZW50IGRlc2MqLwotCXN0cnVjdCB4ZnNfbW91bnQJCSpsaV9tb3VudHA7CS8qIHB0ciB0byBmcyBtb3VudCAqLwotCXVpbnQJCQkJbGlfdHlwZTsJLyogaXRlbSB0eXBlICovCi0JdWludAkJCQlsaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLwotCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JCSpsaV9iaW9fbGlzdDsJLyogYnVmZmVyIGl0ZW0gbGlzdCAqLwotCXZvaWQJCQkJKCpsaV9jYikoc3RydWN0IHhmc19idWYgKiwKLQkJCQkJCSBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwotCQkJCQkJCS8qIGJ1ZmZlciBpdGVtIGlvZG9uZSAqLwotCQkJCQkJCS8qIGNhbGxiYWNrIGZ1bmMgKi8KLQlzdHJ1Y3QgeGZzX2l0ZW1fb3BzCQkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCi19IHhmc19sb2dfaXRlbV90OwotCi0jZGVmaW5lCVhGU19MSV9JTl9BSUwJMHgxCi0jZGVmaW5lIFhGU19MSV9BQk9SVEVECTB4MgotCi10eXBlZGVmIHN0cnVjdCB4ZnNfaXRlbV9vcHMgewotCXVpbnQgKCppb3Bfc2l6ZSkoeGZzX2xvZ19pdGVtX3QgKik7Ci0Jdm9pZCAoKmlvcF9mb3JtYXQpKHhmc19sb2dfaXRlbV90ICosIHN0cnVjdCB4ZnNfbG9nX2lvdmVjICopOwotCXZvaWQgKCppb3BfcGluKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKLQl2b2lkICgqaW9wX3VucGluKSh4ZnNfbG9nX2l0ZW1fdCAqLCBpbnQpOwotCXZvaWQgKCppb3BfdW5waW5fcmVtb3ZlKSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICopOwotCXVpbnQgKCppb3BfdHJ5bG9jaykoeGZzX2xvZ19pdGVtX3QgKik7Ci0Jdm9pZCAoKmlvcF91bmxvY2spKHhmc19sb2dfaXRlbV90ICopOwotCXhmc19sc25fdCAoKmlvcF9jb21taXR0ZWQpKHhmc19sb2dfaXRlbV90ICosIHhmc19sc25fdCk7Ci0Jdm9pZCAoKmlvcF9wdXNoKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKLQl2b2lkICgqaW9wX3B1c2hidWYpKHhmc19sb2dfaXRlbV90ICopOwotCXZvaWQgKCppb3BfY29tbWl0dGluZykoeGZzX2xvZ19pdGVtX3QgKiwgeGZzX2xzbl90KTsKLX0geGZzX2l0ZW1fb3BzX3Q7Ci0KLSNkZWZpbmUgSU9QX1NJWkUoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3NpemUpKGlwKQotI2RlZmluZSBJT1BfRk9STUFUKGlwLHZwKQkoKihpcCktPmxpX29wcy0+aW9wX2Zvcm1hdCkoaXAsIHZwKQotI2RlZmluZSBJT1BfUElOKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9waW4pKGlwKQotI2RlZmluZSBJT1BfVU5QSU4oaXAsIGZsYWdzKQkoKihpcCktPmxpX29wcy0+aW9wX3VucGluKShpcCwgZmxhZ3MpCi0jZGVmaW5lIElPUF9VTlBJTl9SRU1PVkUoaXAsdHApICgqKGlwKS0+bGlfb3BzLT5pb3BfdW5waW5fcmVtb3ZlKShpcCwgdHApCi0jZGVmaW5lIElPUF9UUllMT0NLKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF90cnlsb2NrKShpcCkKLSNkZWZpbmUgSU9QX1VOTE9DSyhpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfdW5sb2NrKShpcCkKLSNkZWZpbmUgSU9QX0NPTU1JVFRFRChpcCwgbHNuKQkoKihpcCktPmxpX29wcy0+aW9wX2NvbW1pdHRlZCkoaXAsIGxzbikKLSNkZWZpbmUgSU9QX1BVU0goaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3B1c2gpKGlwKQotI2RlZmluZSBJT1BfUFVTSEJVRihpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfcHVzaGJ1ZikoaXApCi0jZGVmaW5lIElPUF9DT01NSVRUSU5HKGlwLCBsc24pICgqKGlwKS0+bGlfb3BzLT5pb3BfY29tbWl0dGluZykoaXAsIGxzbikKLQotLyoKLSAqIFJldHVybiB2YWx1ZXMgZm9yIHRoZSBJT1BfVFJZTE9DSygpIHJvdXRpbmVzLgotICovCi0jZGVmaW5lCVhGU19JVEVNX1NVQ0NFU1MJMAotI2RlZmluZQlYRlNfSVRFTV9QSU5ORUQJCTEKLSNkZWZpbmUJWEZTX0lURU1fTE9DS0VECQkyCi0jZGVmaW5lCVhGU19JVEVNX0ZMVVNISU5HCTMKLSNkZWZpbmUgWEZTX0lURU1fUFVTSEJVRgk0Ci0KLSNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0KIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHRyYWNrIGxvZyBpdGVtcyBhc3NvY2lhdGVkIHdpdGgKICAqIGEgdHJhbnNhY3Rpb24uICBJdCBwb2ludHMgdG8gdGhlIGxvZyBpdGVtIGFuZCBrZWVwcyBzb21lCkBAIC0xNzYsNyArMTA4LDcgQEAKICAqIG9uY2Ugd2UgZ2V0IHRvIGNvbW1pdCBwcm9jZXNzaW5nIChzZWUgeGZzX3RyYW5zX2NvbW1pdCgpKS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgewotCXhmc19sb2dfaXRlbV90CSpsaWRfaXRlbTsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaWRfaXRlbTsKIAl1c2hvcnQJCWxpZF9zaXplOwogCXVuc2lnbmVkIGNoYXIJbGlkX2ZsYWdzOwogCXVuc2lnbmVkIGNoYXIJbGlkX2luZGV4OwpAQCAtMjc2LDk0ICsyMDgsNiBAQAogCQkoeGZzX2NhZGRyX3QpKCgoeGZzX2xvZ19pdGVtX2NodW5rX3QqKTApLT5saWNfZGVzY3MpKTsKIH0KIAotI2lmZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1haW50YWluIGEgbGlzdCBvZiBibG9jayByYW5nZXMgdGhhdCBoYXZlIGJlZW4KLSAqIGZyZWVkIGluIHRoZSB0cmFuc2FjdGlvbi4gIFRoZSByYW5nZXMgYXJlIGxpc3RlZCBpbiB0aGUgcGVyYWdbXSBidXN5IGxpc3QKLSAqIGJldHdlZW4gd2hlbiB0aGV5J3JlIGZyZWVkIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHRvIGRpc2suCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19idXN5X3Nsb3QgewotCXhmc19hZ251bWJlcl90CQlsYmNfYWc7Ci0JdXNob3J0CQkJbGJjX2lkeDsJLyogaW5kZXggaW4gcGVyYWcuYnVzeVtdICovCi19IHhmc19sb2dfYnVzeV9zbG90X3Q7Ci0KLSNkZWZpbmUgWEZTX0xCQ19OVU1fU0xPVFMJMzEKLXR5cGVkZWYgc3RydWN0IHhmc19sb2dfYnVzeV9jaHVuayB7Ci0Jc3RydWN0IHhmc19sb2dfYnVzeV9jaHVuawkqbGJjX25leHQ7Ci0JdWludAkJCQlsYmNfZnJlZTsJLyogZnJlZSBzbG90cyBiaXRtYXNrICovCi0JdXNob3J0CQkJCWxiY191bnVzZWQ7CS8qIGZpcnN0IHVudXNlZCAqLwotCXhmc19sb2dfYnVzeV9zbG90X3QJCWxiY19idXN5W1hGU19MQkNfTlVNX1NMT1RTXTsKLX0geGZzX2xvZ19idXN5X2NodW5rX3Q7Ci0KLSNkZWZpbmUJWEZTX0xCQ19NQVhfU0xPVAkoWEZTX0xCQ19OVU1fU0xPVFMgLSAxKQotI2RlZmluZQlYRlNfTEJDX0ZSRUVNQVNLCSgoMVUgPDwgWEZTX0xCQ19OVU1fU0xPVFMpIC0gMSkKLQotI2RlZmluZQlYRlNfTEJDX0lOSVQoY3ApCSgoY3ApLT5sYmNfZnJlZSA9IFhGU19MQkNfRlJFRU1BU0spCi0jZGVmaW5lCVhGU19MQkNfQ0xBSU0oY3AsIHNsb3QpCSgoY3ApLT5sYmNfZnJlZSAmPSB+KDEgPDwgKHNsb3QpKSkKLSNkZWZpbmUJWEZTX0xCQ19TTE9UKGNwLCBzbG90KQkoJigoY3ApLT5sYmNfYnVzeVsoc2xvdCldKSkKLSNkZWZpbmUJWEZTX0xCQ19WQUNBTkNZKGNwKQkoKChjcCktPmxiY19mcmVlKSAmIFhGU19MQkNfRlJFRU1BU0spCi0jZGVmaW5lCVhGU19MQkNfSVNGUkVFKGNwLCBzbG90KSAoKGNwKS0+bGJjX2ZyZWUgJiAoMSA8PCAoc2xvdCkpKQotCi0vKgotICogVGhpcyBpcyB0aGUgdHlwZSBvZiBmdW5jdGlvbiB3aGljaCBjYW4gYmUgZ2l2ZW4gdG8geGZzX3RyYW5zX2NhbGxiYWNrKCkKLSAqIHRvIGJlIGNhbGxlZCB1cG9uIHRoZSB0cmFuc2FjdGlvbidzIGNvbW1pdCB0byBkaXNrLgotICovCi10eXBlZGVmIHZvaWQgKCp4ZnNfdHJhbnNfY2FsbGJhY2tfdCkoc3RydWN0IHhmc190cmFucyAqLCB2b2lkICopOwotCi0vKgotICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG1haW50YWluZWQgZm9yIGV2ZXJ5IGFjdGl2ZSB0cmFuc2FjdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zIHsKLQl1bnNpZ25lZCBpbnQJCXRfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAqLwotCXhmc19sb2dfY2FsbGJhY2tfdAl0X2xvZ2NiOwkvKiBsb2cgY2FsbGJhY2sgc3RydWN0ICovCi0JdW5zaWduZWQgaW50CQl0X3R5cGU7CQkvKiB0cmFuc2FjdGlvbiB0eXBlICovCi0JdW5zaWduZWQgaW50CQl0X2xvZ19yZXM7CS8qIGFtdCBvZiBsb2cgc3BhY2UgcmVzdmQgKi8KLQl1bnNpZ25lZCBpbnQJCXRfbG9nX2NvdW50OwkvKiBjb3VudCBmb3IgcGVybSBsb2cgcmVzICovCi0JdW5zaWduZWQgaW50CQl0X2Jsa19yZXM7CS8qICMgb2YgYmxvY2tzIHJlc3ZkICovCi0JdW5zaWduZWQgaW50CQl0X2Jsa19yZXNfdXNlZDsJLyogIyBvZiByZXN2ZCBibG9ja3MgdXNlZCAqLwotCXVuc2lnbmVkIGludAkJdF9ydHhfcmVzOwkvKiAjIG9mIHJ0IGV4dGVudHMgcmVzdmQgKi8KLQl1bnNpZ25lZCBpbnQJCXRfcnR4X3Jlc191c2VkOwkvKiAjIG9mIHJlc3ZkIHJ0IGV4dGVudHMgdXNlZCAqLwotCXhmc19sb2dfdGlja2V0X3QJdF90aWNrZXQ7CS8qIGxvZyBtZ3IgdGlja2V0ICovCi0JeGZzX2xzbl90CQl0X2xzbjsJCS8qIGxvZyBzZXEgbnVtIG9mIHN0YXJ0IG9mCi0JCQkJCQkgKiB0cmFuc2FjdGlvbi4gKi8KLQl4ZnNfbHNuX3QJCXRfY29tbWl0X2xzbjsJLyogbG9nIHNlcSBudW0gb2YgZW5kIG9mCi0JCQkJCQkgKiB0cmFuc2FjdGlvbi4gKi8KLQlzdHJ1Y3QgeGZzX21vdW50CSp0X21vdW50cDsJLyogcHRyIHRvIGZzIG1vdW50IHN0cnVjdCAqLwotCXN0cnVjdCB4ZnNfZHF1b3RfYWNjdCAgICp0X2RxaW5mbzsJLyogYWNjdGcgaW5mbyBmb3IgZHF1b3RzICovCi0JeGZzX3RyYW5zX2NhbGxiYWNrX3QJdF9jYWxsYmFjazsJLyogdHJhbnNhY3Rpb24gY2FsbGJhY2sgKi8KLQl2b2lkCQkJKnRfY2FsbGFyZzsJLyogY2FsbGJhY2sgYXJnICovCi0JdW5zaWduZWQgaW50CQl0X2ZsYWdzOwkvKiBtaXNjIGZsYWdzICovCi0JaW50NjRfdAkJCXRfaWNvdW50X2RlbHRhOwkvKiBzdXBlcmJsb2NrIGljb3VudCBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9pZnJlZV9kZWx0YTsJLyogc3VwZXJibG9jayBpZnJlZSBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9mZGJsb2Nrc19kZWx0YTsgLyogc3VwZXJibG9jayBmZGJsb2NrcyBjaGcgKi8KLQlpbnQ2NF90CQkJdF9yZXNfZmRibG9ja3NfZGVsdGE7IC8qIG9uLWRpc2sgb25seSBjaGcgKi8KLQlpbnQ2NF90CQkJdF9mcmV4dGVudHNfZGVsdGE7Lyogc3VwZXJibG9jayBmcmVleHRlbnRzIGNoZyovCi0JaW50NjRfdAkJCXRfcmVzX2ZyZXh0ZW50c19kZWx0YTsgLyogb24tZGlzayBvbmx5IGNoZyAqLwotI2lmZGVmIERFQlVHCi0JaW50NjRfdAkJCXRfYWdfZnJlZWJsa3NfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCi0JaW50NjRfdAkJCXRfYWdfZmxpc3RfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCi0JaW50NjRfdAkJCXRfYWdfYnRyZWVfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCi0jZW5kaWYKLQlpbnQ2NF90CQkJdF9kYmxvY2tzX2RlbHRhOy8qIHN1cGVyYmxvY2sgZGJsb2NrcyBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9hZ2NvdW50X2RlbHRhOy8qIHN1cGVyYmxvY2sgYWdjb3VudCBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9pbWF4cGN0X2RlbHRhOy8qIHN1cGVyYmxvY2sgaW1heHBjdCBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9yZXh0c2l6ZV9kZWx0YTsvKiBzdXBlcmJsb2NrIHJleHRzaXplIGNoZyAqLwotCWludDY0X3QJCQl0X3JibWJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIHJibWJsb2NrcyBjaGcgKi8KLQlpbnQ2NF90CQkJdF9yYmxvY2tzX2RlbHRhOy8qIHN1cGVyYmxvY2sgcmJsb2NrcyBjaGFuZ2UgKi8KLQlpbnQ2NF90CQkJdF9yZXh0ZW50c19kZWx0YTsvKiBzdXBlcmJsb2NrcyByZXh0ZW50cyBjaGcgKi8KLQlpbnQ2NF90CQkJdF9yZXh0c2xvZ19kZWx0YTsvKiBzdXBlcmJsb2NrcyByZXh0c2xvZyBjaGcgKi8KLQl1bnNpZ25lZCBpbnQJCXRfaXRlbXNfZnJlZTsJLyogbG9nIGl0ZW0gZGVzY3MgZnJlZSAqLwotCXhmc19sb2dfaXRlbV9jaHVua190CXRfaXRlbXM7CS8qIGZpcnN0IGxvZyBpdGVtIGRlc2MgY2h1bmsgKi8KLQl4ZnNfdHJhbnNfaGVhZGVyX3QJdF9oZWFkZXI7CS8qIGhlYWRlciBmb3IgaW4tbG9nIHRyYW5zICovCi0JdW5zaWduZWQgaW50CQl0X2J1c3lfZnJlZTsJLyogYnVzeSBkZXNjcyBmcmVlICovCi0JeGZzX2xvZ19idXN5X2NodW5rX3QJdF9idXN5OwkJLyogYnVzeS9hc3luYyBmcmVlIGJsb2NrcyAqLwotCXVuc2lnbmVkIGxvbmcJCXRfcGZsYWdzOwkvKiBzYXZlZCBwcm9jZXNzIGZsYWdzIHN0YXRlICovCi19IHhmc190cmFuc190OwotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwotCi0KICNkZWZpbmUJWEZTX1RSQU5TX01BR0lDCQkweDU0NTI0MTRFCS8qICdUUkFOJyAqLwogLyoKICAqIFZhbHVlcyBmb3IgdF9mbGFncy4KQEAgLTkwNiw2ICs3NTAsMTU3IEBACiAjZGVmaW5lCVhGU19EUVVPVF9SRUYJCTEKIAogI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX2J1ZnRhcmc7CitzdHJ1Y3QgeGZzX2VmZF9sb2dfaXRlbTsKK3N0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfaXRlbV9vcHM7CitzdHJ1Y3QgeGZzX2xvZ19pb3ZlYzsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYzsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworc3RydWN0IHhmc19kcXVvdF9hY2N0OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW0geworCXN0cnVjdCBsaXN0X2hlYWQJCWxpX2FpbDsJCS8qIEFJTCBwb2ludGVycyAqLworCXhmc19sc25fdAkJCWxpX2xzbjsJCS8qIGxhc3Qgb24tZGlzayBsc24gKi8KKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKmxpX2Rlc2M7CS8qIHB0ciB0byBjdXJyZW50IGRlc2MqLworCXN0cnVjdCB4ZnNfbW91bnQJCSpsaV9tb3VudHA7CS8qIHB0ciB0byBmcyBtb3VudCAqLworCXN0cnVjdCB4ZnNfYWlsCQkJKmxpX2FpbHA7CS8qIHB0ciB0byBBSUwgKi8KKwl1aW50CQkJCWxpX3R5cGU7CS8qIGl0ZW0gdHlwZSAqLworCXVpbnQJCQkJbGlfZmxhZ3M7CS8qIG1pc2MgZmxhZ3MgKi8KKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCQkqbGlfYmlvX2xpc3Q7CS8qIGJ1ZmZlciBpdGVtIGxpc3QgKi8KKwl2b2lkCQkJCSgqbGlfY2IpKHN0cnVjdCB4ZnNfYnVmICosCisJCQkJCQkgc3RydWN0IHhmc19sb2dfaXRlbSAqKTsKKwkJCQkJCQkvKiBidWZmZXIgaXRlbSBpb2RvbmUgKi8KKwkJCQkJCQkvKiBjYWxsYmFjayBmdW5jICovCisJc3RydWN0IHhmc19pdGVtX29wcwkJKmxpX29wczsJLyogZnVuY3Rpb24gbGlzdCAqLworfSB4ZnNfbG9nX2l0ZW1fdDsKKworI2RlZmluZQlYRlNfTElfSU5fQUlMCTB4MQorI2RlZmluZSBYRlNfTElfQUJPUlRFRAkweDIKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHsKKwl1aW50ICgqaW9wX3NpemUpKHhmc19sb2dfaXRlbV90ICopOworCXZvaWQgKCppb3BfZm9ybWF0KSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyAqKTsKKwl2b2lkICgqaW9wX3BpbikoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF91bnBpbikoeGZzX2xvZ19pdGVtX3QgKiwgaW50KTsKKwl2b2lkICgqaW9wX3VucGluX3JlbW92ZSkoeGZzX2xvZ19pdGVtX3QgKiwgc3RydWN0IHhmc190cmFucyAqKTsKKwl1aW50ICgqaW9wX3RyeWxvY2spKHhmc19sb2dfaXRlbV90ICopOworCXZvaWQgKCppb3BfdW5sb2NrKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl4ZnNfbHNuX3QgKCppb3BfY29tbWl0dGVkKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfbHNuX3QpOworCXZvaWQgKCppb3BfcHVzaCkoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF9wdXNoYnVmKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl2b2lkICgqaW9wX2NvbW1pdHRpbmcpKHhmc19sb2dfaXRlbV90ICosIHhmc19sc25fdCk7Cit9IHhmc19pdGVtX29wc190OworCisjZGVmaW5lIElPUF9TSVpFKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9zaXplKShpcCkKKyNkZWZpbmUgSU9QX0ZPUk1BVChpcCx2cCkJKCooaXApLT5saV9vcHMtPmlvcF9mb3JtYXQpKGlwLCB2cCkKKyNkZWZpbmUgSU9QX1BJTihpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfcGluKShpcCkKKyNkZWZpbmUgSU9QX1VOUElOKGlwLCBmbGFncykJKCooaXApLT5saV9vcHMtPmlvcF91bnBpbikoaXAsIGZsYWdzKQorI2RlZmluZSBJT1BfVU5QSU5fUkVNT1ZFKGlwLHRwKSAoKihpcCktPmxpX29wcy0+aW9wX3VucGluX3JlbW92ZSkoaXAsIHRwKQorI2RlZmluZSBJT1BfVFJZTE9DSyhpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfdHJ5bG9jaykoaXApCisjZGVmaW5lIElPUF9VTkxPQ0soaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3VubG9jaykoaXApCisjZGVmaW5lIElPUF9DT01NSVRURUQoaXAsIGxzbikJKCooaXApLT5saV9vcHMtPmlvcF9jb21taXR0ZWQpKGlwLCBsc24pCisjZGVmaW5lIElPUF9QVVNIKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9wdXNoKShpcCkKKyNkZWZpbmUgSU9QX1BVU0hCVUYoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3B1c2hidWYpKGlwKQorI2RlZmluZSBJT1BfQ09NTUlUVElORyhpcCwgbHNuKSAoKihpcCktPmxpX29wcy0+aW9wX2NvbW1pdHRpbmcpKGlwLCBsc24pCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgSU9QX1RSWUxPQ0soKSByb3V0aW5lcy4KKyAqLworI2RlZmluZQlYRlNfSVRFTV9TVUNDRVNTCTAKKyNkZWZpbmUJWEZTX0lURU1fUElOTkVECQkxCisjZGVmaW5lCVhGU19JVEVNX0xPQ0tFRAkJMgorI2RlZmluZQlYRlNfSVRFTV9GTFVTSElORwkzCisjZGVmaW5lIFhGU19JVEVNX1BVU0hCVUYJNAorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgYmxvY2sgcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuCisgKiBmcmVlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBUaGUgcmFuZ2VzIGFyZSBsaXN0ZWQgaW4gdGhlIHBlcmFnW10gYnVzeSBsaXN0CisgKiBiZXR3ZWVuIHdoZW4gdGhleSdyZSBmcmVlZCBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCB0byBkaXNrLgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfYnVzeV9zbG90IHsKKwl4ZnNfYWdudW1iZXJfdAkJbGJjX2FnOworCXVzaG9ydAkJCWxiY19pZHg7CS8qIGluZGV4IGluIHBlcmFnLmJ1c3lbXSAqLworfSB4ZnNfbG9nX2J1c3lfc2xvdF90OworCisjZGVmaW5lIFhGU19MQkNfTlVNX1NMT1RTCTMxCit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2J1c3lfY2h1bmsgeworCXN0cnVjdCB4ZnNfbG9nX2J1c3lfY2h1bmsJKmxiY19uZXh0OworCXVpbnQJCQkJbGJjX2ZyZWU7CS8qIGZyZWUgc2xvdHMgYml0bWFzayAqLworCXVzaG9ydAkJCQlsYmNfdW51c2VkOwkvKiBmaXJzdCB1bnVzZWQgKi8KKwl4ZnNfbG9nX2J1c3lfc2xvdF90CQlsYmNfYnVzeVtYRlNfTEJDX05VTV9TTE9UU107Cit9IHhmc19sb2dfYnVzeV9jaHVua190OworCisjZGVmaW5lCVhGU19MQkNfTUFYX1NMT1QJKFhGU19MQkNfTlVNX1NMT1RTIC0gMSkKKyNkZWZpbmUJWEZTX0xCQ19GUkVFTUFTSwkoKDFVIDw8IFhGU19MQkNfTlVNX1NMT1RTKSAtIDEpCisKKyNkZWZpbmUJWEZTX0xCQ19JTklUKGNwKQkoKGNwKS0+bGJjX2ZyZWUgPSBYRlNfTEJDX0ZSRUVNQVNLKQorI2RlZmluZQlYRlNfTEJDX0NMQUlNKGNwLCBzbG90KQkoKGNwKS0+bGJjX2ZyZWUgJj0gfigxIDw8IChzbG90KSkpCisjZGVmaW5lCVhGU19MQkNfU0xPVChjcCwgc2xvdCkJKCYoKGNwKS0+bGJjX2J1c3lbKHNsb3QpXSkpCisjZGVmaW5lCVhGU19MQkNfVkFDQU5DWShjcCkJKCgoY3ApLT5sYmNfZnJlZSkgJiBYRlNfTEJDX0ZSRUVNQVNLKQorI2RlZmluZQlYRlNfTEJDX0lTRlJFRShjcCwgc2xvdCkgKChjcCktPmxiY19mcmVlICYgKDEgPDwgKHNsb3QpKSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIHR5cGUgb2YgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIGdpdmVuIHRvIHhmc190cmFuc19jYWxsYmFjaygpCisgKiB0byBiZSBjYWxsZWQgdXBvbiB0aGUgdHJhbnNhY3Rpb24ncyBjb21taXQgdG8gZGlzay4KKyAqLwordHlwZWRlZiB2b2lkICgqeGZzX3RyYW5zX2NhbGxiYWNrX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKiwgdm9pZCAqKTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBtYWludGFpbmVkIGZvciBldmVyeSBhY3RpdmUgdHJhbnNhY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc190cmFucyB7CisJdW5zaWduZWQgaW50CQl0X21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KKwl4ZnNfbG9nX2NhbGxiYWNrX3QJdF9sb2djYjsJLyogbG9nIGNhbGxiYWNrIHN0cnVjdCAqLworCXVuc2lnbmVkIGludAkJdF90eXBlOwkJLyogdHJhbnNhY3Rpb24gdHlwZSAqLworCXVuc2lnbmVkIGludAkJdF9sb2dfcmVzOwkvKiBhbXQgb2YgbG9nIHNwYWNlIHJlc3ZkICovCisJdW5zaWduZWQgaW50CQl0X2xvZ19jb3VudDsJLyogY291bnQgZm9yIHBlcm0gbG9nIHJlcyAqLworCXVuc2lnbmVkIGludAkJdF9ibGtfcmVzOwkvKiAjIG9mIGJsb2NrcyByZXN2ZCAqLworCXVuc2lnbmVkIGludAkJdF9ibGtfcmVzX3VzZWQ7CS8qICMgb2YgcmVzdmQgYmxvY2tzIHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQJCXRfcnR4X3JlczsJLyogIyBvZiBydCBleHRlbnRzIHJlc3ZkICovCisJdW5zaWduZWQgaW50CQl0X3J0eF9yZXNfdXNlZDsJLyogIyBvZiByZXN2ZCBydCBleHRlbnRzIHVzZWQgKi8KKwl4ZnNfbG9nX3RpY2tldF90CXRfdGlja2V0OwkvKiBsb2cgbWdyIHRpY2tldCAqLworCXhmc19sc25fdAkJdF9sc247CQkvKiBsb2cgc2VxIG51bSBvZiBzdGFydCBvZgorCQkJCQkJICogdHJhbnNhY3Rpb24uICovCisJeGZzX2xzbl90CQl0X2NvbW1pdF9sc247CS8qIGxvZyBzZXEgbnVtIG9mIGVuZCBvZgorCQkJCQkJICogdHJhbnNhY3Rpb24uICovCisJc3RydWN0IHhmc19tb3VudAkqdF9tb3VudHA7CS8qIHB0ciB0byBmcyBtb3VudCBzdHJ1Y3QgKi8KKwlzdHJ1Y3QgeGZzX2RxdW90X2FjY3QgICAqdF9kcWluZm87CS8qIGFjY3RnIGluZm8gZm9yIGRxdW90cyAqLworCXhmc190cmFuc19jYWxsYmFja190CXRfY2FsbGJhY2s7CS8qIHRyYW5zYWN0aW9uIGNhbGxiYWNrICovCisJdm9pZAkJCSp0X2NhbGxhcmc7CS8qIGNhbGxiYWNrIGFyZyAqLworCXVuc2lnbmVkIGludAkJdF9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCWludDY0X3QJCQl0X2ljb3VudF9kZWx0YTsJLyogc3VwZXJibG9jayBpY291bnQgY2hhbmdlICovCisJaW50NjRfdAkJCXRfaWZyZWVfZGVsdGE7CS8qIHN1cGVyYmxvY2sgaWZyZWUgY2hhbmdlICovCisJaW50NjRfdAkJCXRfZmRibG9ja3NfZGVsdGE7IC8qIHN1cGVyYmxvY2sgZmRibG9ja3MgY2hnICovCisJaW50NjRfdAkJCXRfcmVzX2ZkYmxvY2tzX2RlbHRhOyAvKiBvbi1kaXNrIG9ubHkgY2hnICovCisJaW50NjRfdAkJCXRfZnJleHRlbnRzX2RlbHRhOy8qIHN1cGVyYmxvY2sgZnJlZXh0ZW50cyBjaGcqLworCWludDY0X3QJCQl0X3Jlc19mcmV4dGVudHNfZGVsdGE7IC8qIG9uLWRpc2sgb25seSBjaGcgKi8KKyNpZmRlZiBERUJVRworCWludDY0X3QJCQl0X2FnX2ZyZWVibGtzX2RlbHRhOyAvKiBkZWJ1Z2dpbmcgY291bnRlciAqLworCWludDY0X3QJCQl0X2FnX2ZsaXN0X2RlbHRhOyAvKiBkZWJ1Z2dpbmcgY291bnRlciAqLworCWludDY0X3QJCQl0X2FnX2J0cmVlX2RlbHRhOyAvKiBkZWJ1Z2dpbmcgY291bnRlciAqLworI2VuZGlmCisJaW50NjRfdAkJCXRfZGJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIGRibG9ja3MgY2hhbmdlICovCisJaW50NjRfdAkJCXRfYWdjb3VudF9kZWx0YTsvKiBzdXBlcmJsb2NrIGFnY291bnQgY2hhbmdlICovCisJaW50NjRfdAkJCXRfaW1heHBjdF9kZWx0YTsvKiBzdXBlcmJsb2NrIGltYXhwY3QgY2hhbmdlICovCisJaW50NjRfdAkJCXRfcmV4dHNpemVfZGVsdGE7Lyogc3VwZXJibG9jayByZXh0c2l6ZSBjaGcgKi8KKwlpbnQ2NF90CQkJdF9yYm1ibG9ja3NfZGVsdGE7Lyogc3VwZXJibG9jayByYm1ibG9ja3MgY2hnICovCisJaW50NjRfdAkJCXRfcmJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIHJibG9ja3MgY2hhbmdlICovCisJaW50NjRfdAkJCXRfcmV4dGVudHNfZGVsdGE7Lyogc3VwZXJibG9ja3MgcmV4dGVudHMgY2hnICovCisJaW50NjRfdAkJCXRfcmV4dHNsb2dfZGVsdGE7Lyogc3VwZXJibG9ja3MgcmV4dHNsb2cgY2hnICovCisJdW5zaWduZWQgaW50CQl0X2l0ZW1zX2ZyZWU7CS8qIGxvZyBpdGVtIGRlc2NzIGZyZWUgKi8KKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAl0X2l0ZW1zOwkvKiBmaXJzdCBsb2cgaXRlbSBkZXNjIGNodW5rICovCisJeGZzX3RyYW5zX2hlYWRlcl90CXRfaGVhZGVyOwkvKiBoZWFkZXIgZm9yIGluLWxvZyB0cmFucyAqLworCXVuc2lnbmVkIGludAkJdF9idXN5X2ZyZWU7CS8qIGJ1c3kgZGVzY3MgZnJlZSAqLworCXhmc19sb2dfYnVzeV9jaHVua190CXRfYnVzeTsJCS8qIGJ1c3kvYXN5bmMgZnJlZSBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nCQl0X3BmbGFnczsJLyogc2F2ZWQgcHJvY2VzcyBmbGFncyBzdGF0ZSAqLworfSB4ZnNfdHJhbnNfdDsKKwogLyoKICAqIFhGUyB0cmFuc2FjdGlvbiBtZWNoYW5pc20gZXhwb3J0ZWQgaW50ZXJmYWNlcyB0aGF0IGFyZQogICogYWN0dWFsbHkgbWFjcm9zLgpAQCAtOTI4LDcgKzkyMyw2IEBACiAvKgogICogWEZTIHRyYW5zYWN0aW9uIG1lY2hhbmlzbSBleHBvcnRlZCBpbnRlcmZhY2VzLgogICovCi12b2lkCQl4ZnNfdHJhbnNfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwogeGZzX3RyYW5zX3QJKnhmc190cmFuc19hbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQpOwogeGZzX3RyYW5zX3QJKl94ZnNfdHJhbnNfYWxsb2Moc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKIHhmc190cmFuc190CSp4ZnNfdHJhbnNfZHVwKHhmc190cmFuc190ICopOwpAQCAtOTc1LDEzICs5NjksOCBAQAogCQkJCSAgaW50ICopOwogI2RlZmluZSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBmbGFncykJX3hmc190cmFuc19jb21taXQodHAsIGZsYWdzLCBOVUxMKQogdm9pZAkJeGZzX3RyYW5zX2NhbmNlbCh4ZnNfdHJhbnNfdCAqLCBpbnQpOwotaW50CQl4ZnNfdHJhbnNfcm9sbChzdHJ1Y3QgeGZzX3RyYW5zICoqLCBzdHJ1Y3QgeGZzX2lub2RlICopOwogaW50CQl4ZnNfdHJhbnNfYWlsX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKIHZvaWQJCXhmc190cmFuc19haWxfZGVzdHJveShzdHJ1Y3QgeGZzX21vdW50ICopOwotdm9pZAkJeGZzX3RyYW5zX3B1c2hfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2xzbl90KTsKLXhmc19sc25fdAl4ZnNfdHJhbnNfdGFpbF9haWwoc3RydWN0IHhmc19tb3VudCAqKTsKLXZvaWQJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKHN0cnVjdCB4ZnNfbW91bnQgKiwKLQkJCQkJeGZzX2xvZ19pdGVtX3QgKik7CiB4ZnNfbG9nX2J1c3lfc2xvdF90ICp4ZnNfdHJhbnNfYWRkX2J1c3koeGZzX3RyYW5zX3QgKnRwLAogCQkJCQl4ZnNfYWdudW1iZXJfdCBhZywKIAkJCQkJeGZzX2V4dGxlbl90IGlkeCk7CkBAIC05OTAsNCArOTc5LDcgQEAKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAordm9pZAkJeGZzX3RyYW5zX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKK2ludAkJeGZzX3RyYW5zX3JvbGwoc3RydWN0IHhmc190cmFucyAqKiwgc3RydWN0IHhmc19pbm9kZSAqKTsKKwogI2VuZGlmCS8qIF9fWEZTX1RSQU5TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19haWwuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKaW5kZXggMWY3N2MwMC4uMmQ0N2YxMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyLDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA4IERhdmUgQ2hpbm5lcgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yOCwxMyArMjksMTMgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgogCi1TVEFUSUMgdm9pZCB4ZnNfYWlsX2luc2VydCh4ZnNfYWlsX3QgKiwgeGZzX2xvZ19pdGVtX3QgKik7Ci1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX2RlbGV0ZSh4ZnNfYWlsX3QgKiwgeGZzX2xvZ19pdGVtX3QgKik7Ci1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX21pbih4ZnNfYWlsX3QgKik7Ci1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX25leHQoeGZzX2FpbF90ICosIHhmc19sb2dfaXRlbV90ICopOworU1RBVElDIHZvaWQgeGZzX2FpbF9pbnNlcnQoc3RydWN0IHhmc19haWwgKiwgeGZzX2xvZ19pdGVtX3QgKik7CitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX2RlbGV0ZShzdHJ1Y3QgeGZzX2FpbCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqIHhmc19haWxfbWluKHN0cnVjdCB4ZnNfYWlsICopOworU1RBVElDIHhmc19sb2dfaXRlbV90ICogeGZzX2FpbF9uZXh0KHN0cnVjdCB4ZnNfYWlsICosIHhmc19sb2dfaXRlbV90ICopOwogCiAjaWZkZWYgREVCVUcKLVNUQVRJQyB2b2lkIHhmc19haWxfY2hlY2soeGZzX2FpbF90ICosIHhmc19sb2dfaXRlbV90ICopOworU1RBVElDIHZvaWQgeGZzX2FpbF9jaGVjayhzdHJ1Y3QgeGZzX2FpbCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKICNlbHNlCiAjZGVmaW5lCXhmc19haWxfY2hlY2soYSxsKQogI2VuZGlmIC8qIERFQlVHICovCkBAIC01MCwyMCArNTEsMjAgQEAKICAqIGxzbiBvZiB0aGUgbGFzdCBpdGVtIGluIHRoZSBBSUwuCiAgKi8KIHhmc19sc25fdAoteGZzX3RyYW5zX3RhaWxfYWlsKAotCXhmc19tb3VudF90CSptcCkKK3hmc190cmFuc19haWxfdGFpbCgKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCkKIHsKIAl4ZnNfbHNuX3QJbHNuOwogCXhmc19sb2dfaXRlbV90CSpsaXA7CiAKLQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQlsaXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCWxpcCA9IHhmc19haWxfbWluKGFpbHApOwogCWlmIChsaXAgPT0gTlVMTCkgewogCQlsc24gPSAoeGZzX2xzbl90KTA7CiAJfSBlbHNlIHsKIAkJbHNuID0gbGlwLT5saV9sc247CiAJfQotCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCiAJcmV0dXJuIGxzbjsKIH0KQEAgLTg1LDE2ICs4NiwxMjUgQEAKICAqIGFueSBvZiB0aGUgb2JqZWN0cywgc28gdGhlIGxvY2sgaXMgbm90IG5lZWRlZC4KICAqLwogdm9pZAoteGZzX3RyYW5zX3B1c2hfYWlsKAotCXhmc19tb3VudF90CQkqbXAsCi0JeGZzX2xzbl90CQl0aHJlc2hvbGRfbHNuKQoreGZzX3RyYW5zX2FpbF9wdXNoKAorCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAorCXhmc19sc25fdAl0aHJlc2hvbGRfbHNuKQogewotCXhmc19sb2dfaXRlbV90CQkqbGlwOworCXhmc19sb2dfaXRlbV90CSpsaXA7CiAKLQlsaXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKLQlpZiAobGlwICYmICFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQlpZiAoWEZTX0xTTl9DTVAodGhyZXNob2xkX2xzbiwgbXAtPm1fYWlsLnhhX3RhcmdldCkgPiAwKQotCQkJeGZzYWlsZF93YWtldXAobXAsIHRocmVzaG9sZF9sc24pOworCWxpcCA9IHhmc19haWxfbWluKGFpbHApOworCWlmIChsaXAgJiYgIVhGU19GT1JDRURfU0hVVERPV04oYWlscC0+eGFfbW91bnQpKSB7CisJCWlmIChYRlNfTFNOX0NNUCh0aHJlc2hvbGRfbHNuLCBhaWxwLT54YV90YXJnZXQpID4gMCkKKwkJCXhmc2FpbGRfd2FrZXVwKGFpbHAsIHRocmVzaG9sZF9sc24pOworCX0KK30KKworLyoKKyAqIEFJTCB0cmF2ZXJzYWwgY3Vyc29yIGluaXRpYWxpc2F0aW9uLgorICoKKyAqIFRoZSBjdXJzb3Iga2VlcHMgdHJhY2sgb2Ygd2hlcmUgb3VyIGN1cnJlbnQgdHJhdmVyc2FsIGlzIHVwCisgKiB0byBieSB0cmFja2luZyB0aGUgbmV4dCDGo3RlbSBpbiB0aGUgbGlzdCBmb3IgdXMuIEhvd2V2ZXIsIGZvcgorICogdGhpcyB0byBiZSBzYWZlLCByZW1vdmluZyBhbiBvYmplY3QgZnJvbSB0aGUgQUlMIG5lZWRzIHRvIGludmFsaWRhdGUKKyAqIGFueSBjdXJzb3IgdGhhdCBwb2ludHMgdG8gaXQuIGhlbmNlIHRoZSB0cmF2ZXJzYWwgY3Vyc29yIG5lZWRzIHRvCisgKiBiZSBsaW5rZWQgdG8gdGhlIHN0cnVjdCB4ZnNfYWlsIHNvIHRoYXQgZGVsZXRpb24gY2FuIHNlYXJjaCBhbGwgdGhlCisgKiBhY3RpdmUgY3Vyc29ycyBmb3IgaW52YWxpZGF0aW9uLgorICoKKyAqIFdlIGRvbid0IGxpbmsgdGhlIHB1c2ggY3Vyc29yIGJlY2F1c2UgaXQgaXMgZW1iZWRkZWQgaW4gdGhlIHN0cnVjdAorICogeGZzX2FpbCBhbmQgaGVuY2UgZWFzaWx5IGZpbmRhYmxlLgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2FpbF9jdXJzb3JfaW5pdCgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXIpCit7CisJY3VyLT5pdGVtID0gTlVMTDsKKwlpZiAoY3VyID09ICZhaWxwLT54YV9jdXJzb3JzKQorCQlyZXR1cm47CisKKwljdXItPm5leHQgPSBhaWxwLT54YV9jdXJzb3JzLm5leHQ7CisJYWlscC0+eGFfY3Vyc29ycy5uZXh0ID0gY3VyOworfQorCisvKgorICogU2V0IHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgaXRlbSwgYmVjYXVzZSB3aGVuIHdlIGxvb2sKKyAqIHVwIHRoZSBjdXJzb3IgdGhlIGN1cnJlbnQgaXRlbSBtYXkgaGF2ZSBiZWVuIGZyZWVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2FpbF9jdXJzb3Jfc2V0KAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCit7CisJaWYgKGxpcCkKKwkJY3VyLT5pdGVtID0geGZzX2FpbF9uZXh0KGFpbHAsIGxpcCk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5leHQgaXRlbSBpbiB0aGUgdHJhdmVyc2FsIGFuZCBhZHZhbmNlIHRoZSBjdXJzb3IuCisgKiBJZiB0aGUgY3Vyc29yIHdhcyBpbnZhbGlkYXRlZCAoaW5pZGljYXRlZCBieSBhIGxpcCBvZiAxKSwKKyAqIHJlc3RhcnQgdGhlIHRyYXZlcnNhbC4KKyAqLworc3RydWN0IHhmc19sb2dfaXRlbSAqCit4ZnNfdHJhbnNfYWlsX2N1cnNvcl9uZXh0KAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1cikKK3sKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAgPSBjdXItPml0ZW07CisKKwlpZiAoKF9fcHNpbnRfdClsaXAgJiAxKQorCQlsaXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9zZXQoYWlscCwgY3VyLCBsaXApOworCXJldHVybiBsaXA7Cit9CisKKy8qCisgKiBOb3cgdGhhdCB0aGUgdHJhdmVyc2FsIGlzIGNvbXBsZXRlLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgY3Vyc29yCisgKiBmcm9tIHRoZSBsaXN0IG9mIHRyYXZlcnNpbmcgY3Vyc29ycy4gQXZvaWQgcmVtb3ZpbmcgdGhlIGVtYmVkZGVkCisgKiBwdXNoIGN1cnNvciwgYnV0IHVzZSB0aGUgZmFjdCBpdCBpcyBhbHdheSBwcmVzZW50IHRvIG1ha2UgdGhlCisgKiBsaXN0IGRlbGV0aW9uIHNpbXBsZS4KKyAqLwordm9pZAoreGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZSgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19haWxfY3Vyc29yCSpkb25lKQoreworCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqcHJldiA9IE5VTEw7CisJc3RydWN0IHhmc19haWxfY3Vyc29yCSpjdXI7CisKKwlkb25lLT5pdGVtID0gTlVMTDsKKwlpZiAoZG9uZSA9PSAmYWlscC0+eGFfY3Vyc29ycykKKwkJcmV0dXJuOworCXByZXYgPSAmYWlscC0+eGFfY3Vyc29yczsKKwlmb3IgKGN1ciA9IHByZXYtPm5leHQ7IGN1cjsgcHJldiA9IGN1ciwgY3VyID0gcHJldi0+bmV4dCkgeworCQlpZiAoY3VyID09IGRvbmUpIHsKKwkJCXByZXYtPm5leHQgPSBjdXItPm5leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlBU1NFUlQoY3VyKTsKK30KKworLyoKKyAqIEludmFsaWRhdGUgYW55IGN1cnNvciB0aGF0IGlzIHBvaW50aW5nIHRvIHRoaXMgaXRlbS4gVGhpcyBpcworICogY2FsbGVkIHdoZW4gYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIEFJTC4gQW55IGN1cnNvciBwb2ludGluZworICogdG8gdGhpcyBvYmplY3QgaXMgbm93IGludmFsaWQgYW5kIHRoZSB0cmF2ZXJzYWwgbmVlZHMgdG8gYmUKKyAqIHRlcm1pbmF0ZWQgc28gaXQgZG9lc24ndCByZWZlcmVuY2UgYSBmcmVlZCBvYmplY3QuIFdlIHNldCB0aGUKKyAqIGN1cnNvciBpdGVtIHRvIGEgdmFsdWUgb2YgMSBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbgorICogaW52YWxpZGF0aW9uIGFuZCB0aGUgZW5kIG9mIHRoZSBsaXN0IHdoZW4gZ2V0dGluZyB0aGUgbmV4dCBpdGVtCisgKiBmcm9tIHRoZSBjdXJzb3IuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcigKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQoreworCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgkqY3VyOworCisJLyogbmVlZCB0byBzZWFyY2ggYWxsIGN1cnNvcnMgKi8KKwlmb3IgKGN1ciA9ICZhaWxwLT54YV9jdXJzb3JzOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQlpZiAoY3VyLT5pdGVtID09IGxpcCkKKwkJCWN1ci0+aXRlbSA9IChzdHJ1Y3QgeGZzX2xvZ19pdGVtICopCisJCQkJCSgoX19wc2ludF90KWN1ci0+aXRlbSB8IDEpOwogCX0KIH0KIApAQCAtMTAzLDI1ICsyMTMsMjcgQEAKICAqIFJldHVybiB0aGUgY3VycmVudCB0cmVlIGdlbmVyYXRpb24gbnVtYmVyIGZvciB1c2UKICAqIGluIGNhbGxzIHRvIHhmc190cmFuc19uZXh0X2FpbCgpLgogICovCi1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgoteGZzX3RyYW5zX2ZpcnN0X3B1c2hfYWlsKAotCXhmc19tb3VudF90CSptcCwKLQlpbnQJCSpnZW4sCi0JeGZzX2xzbl90CWxzbikKK3hmc19sb2dfaXRlbV90ICoKK3hmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciwKKwl4ZnNfbHNuX3QJCWxzbikKIHsKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwOworCXhmc19sb2dfaXRlbV90CQkqbGlwOwogCi0JbGlwID0geGZzX2FpbF9taW4oJm1wLT5tX2FpbCk7Ci0JKmdlbiA9IChpbnQpbXAtPm1fYWlsLnhhX2dlbjsKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9pbml0KGFpbHAsIGN1cik7CisJbGlwID0geGZzX2FpbF9taW4oYWlscCk7CiAJaWYgKGxzbiA9PSAwKQotCQlyZXR1cm4gbGlwOworCQlnb3RvIG91dDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobGlwLCAmbXAtPm1fYWlsLnhhX2FpbCwgbGlfYWlsKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsaXAsICZhaWxwLT54YV9haWwsIGxpX2FpbCkgewogCQlpZiAoWEZTX0xTTl9DTVAobGlwLT5saV9sc24sIGxzbikgPj0gMCkKLQkJCXJldHVybiBsaXA7CisJCQlnb3RvIG91dDsKIAl9Ci0KLQlyZXR1cm4gTlVMTDsKKwlsaXAgPSBOVUxMOworb3V0OgorCXhmc190cmFuc19haWxfY3Vyc29yX3NldChhaWxwLCBjdXIsIGxpcCk7CisJcmV0dXJuIGxpcDsKIH0KIAogLyoKQEAgLTEyOSwyOSArMjQxLDI5IEBACiAgKi8KIGxvbmcKIHhmc2FpbGRfcHVzaCgKLQl4ZnNfbW91bnRfdAkqbXAsCisJc3RydWN0IHhmc19haWwJKmFpbHAsCiAJeGZzX2xzbl90CSpsYXN0X2xzbikKIHsKIAlsb25nCQl0b3V0ID0gMTAwMDsgLyogbWlsbGlzZWNvbmRzICovCiAJeGZzX2xzbl90CWxhc3RfcHVzaGVkX2xzbiA9ICpsYXN0X2xzbjsKLQl4ZnNfbHNuX3QJdGFyZ2V0ID0gIG1wLT5tX2FpbC54YV90YXJnZXQ7CisJeGZzX2xzbl90CXRhcmdldCA9ICBhaWxwLT54YV90YXJnZXQ7CiAJeGZzX2xzbl90CWxzbjsKIAl4ZnNfbG9nX2l0ZW1fdAkqbGlwOwotCWludAkJZ2VuOwotCWludAkJcmVzdGFydHM7CiAJaW50CQlmbHVzaF9sb2csIGNvdW50LCBzdHVjazsKKwl4ZnNfbW91bnRfdAkqbXAgPSBhaWxwLT54YV9tb3VudDsKKwlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJKmN1ciA9ICZhaWxwLT54YV9jdXJzb3JzOwogCi0jZGVmaW5lCVhGU19UUkFOU19QVVNIX0FJTF9SRVNUQVJUUwkxMAotCi0Jc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JbGlwID0geGZzX3RyYW5zX2ZpcnN0X3B1c2hfYWlsKG1wLCAmZ2VuLCAqbGFzdF9sc24pOworCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJeGZzX3RyYW5zX2FpbF9jdXJzb3JfaW5pdChhaWxwLCBjdXIpOworCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KGFpbHAsIGN1ciwgKmxhc3RfbHNuKTsKIAlpZiAoIWxpcCB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewogCQkvKgogCQkgKiBBSUwgaXMgZW1wdHkgb3Igb3VyIHB1c2ggaGFzIHJlYWNoZWQgdGhlIGVuZC4KIAkJICovCi0JCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoYWlscCwgY3VyKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCQlsYXN0X3B1c2hlZF9sc24gPSAwOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHRvdXQ7CiAJfQogCiAJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbCk7CkBAIC0xNjksNyArMjgxLDcgQEAKIAkgKi8KIAl0b3V0ID0gMTA7CiAJbHNuID0gbGlwLT5saV9sc247Ci0JZmx1c2hfbG9nID0gc3R1Y2sgPSBjb3VudCA9IHJlc3RhcnRzID0gMDsKKwlmbHVzaF9sb2cgPSBzdHVjayA9IGNvdW50ID0gMDsKIAl3aGlsZSAoKFhGU19MU05fQ01QKGxpcC0+bGlfbHNuLCB0YXJnZXQpIDwgMCkpIHsKIAkJaW50CWxvY2tfcmVzdWx0OwogCQkvKgpAQCAtMTg0LDcgKzI5Niw3IEBACiAJCSAqIHNraXAgdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdC4KIAkJICovCiAJCWxvY2tfcmVzdWx0ID0gSU9QX1RSWUxPQ0sobGlwKTsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCQlzd2l0Y2ggKGxvY2tfcmVzdWx0KSB7CiAJCWNhc2UgWEZTX0lURU1fU1VDQ0VTUzoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfc3VjY2Vzcyk7CkBAIC0yMjEsNyArMzMzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CiAJCS8qIHNob3VsZCB3ZSBib3RoZXIgY29udGludWluZz8gKi8KIAkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQkJYnJlYWs7CkBAIC0yNDQsMTQgKzM1NiwxMyBAQAogCQlpZiAoc3R1Y2sgPiAxMDApCiAJCQlicmVhazsKIAotCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgJnJlc3RhcnRzKTsKKwkJbGlwID0geGZzX3RyYW5zX2FpbF9jdXJzb3JfbmV4dChhaWxwLCBjdXIpOwogCQlpZiAobGlwID09IE5VTEwpCiAJCQlicmVhazsKLQkJaWYgKHJlc3RhcnRzID4gWEZTX1RSQU5TX1BVU0hfQUlMX1JFU1RBUlRTKQotCQkJYnJlYWs7CiAJCWxzbiA9IGxpcC0+bGlfbHNuOwogCX0KLQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOworCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoYWlscCwgY3VyKTsKKwlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CiAKIAlpZiAoZmx1c2hfbG9nKSB7CiAJCS8qCkBAIC0yNzQsOCArMzg1LDcgQEAKIAkJICovCiAJCXRvdXQgKz0gMjA7CiAJCWxhc3RfcHVzaGVkX2xzbiA9IDA7Ci0JfSBlbHNlIGlmICgocmVzdGFydHMgPiBYRlNfVFJBTlNfUFVTSF9BSUxfUkVTVEFSVFMpIHx8Ci0JCSAgICgoc3R1Y2sgKiAxMDApIC8gY291bnQgPiA5MCkpIHsKKwl9IGVsc2UgaWYgKChzdHVjayAqIDEwMCkgLyBjb3VudCA+IDkwKSB7CiAJCS8qCiAJCSAqIEVpdGhlciB0aGVyZSBpcyBhIGxvdCBvZiBjb250ZW50aW9uIG9uIHRoZSBBSUwgb3Igd2UKIAkJICogYXJlIHN0dWNrIGR1ZSB0byBvcGVyYXRpb25zIGluIHByb2dyZXNzLiAiU3R1Y2siIGluIHRoaXMKQEAgLTI4Nyw3ICszOTcsNiBAQAogCQkgKi8KIAkJdG91dCArPSAxMDsKIAl9Ci1vdXQ6CiAJKmxhc3RfbHNuID0gbGFzdF9wdXNoZWRfbHNuOwogCXJldHVybiB0b3V0OwogfQkvKiB4ZnNhaWxkX3B1c2ggKi8KQEAgLTMwMyw3ICs0MTIsNyBAQAogICovCiB2b2lkCiB4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbSgKLQl4ZnNfbW91bnRfdAkqbXAsCisJc3RydWN0IHhmc19haWwJKmFpbHAsCiAJeGZzX2xvZ19pdGVtX3QJKmxpcCkKIHsKIAl4ZnNfbG9nX2l0ZW1fdAkqbWluX2xpcDsKQEAgLTMxNSw3ICs0MjQsNyBAQAogCSAqIG92ZXIgc29tZSBwb3RlbnRpYWxseSB2YWxpZCBkYXRhLgogCSAqLwogCWlmICghKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB8fAotCSAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCSAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKGFpbHAtPnhhX21vdW50KSkgewogCQlyZXR1cm47CiAJfQogCkBAIC0zMzEsMTAgKzQ0MCwxMCBAQAogCSAqIHRoZSBjYWxsIHRvIHhmc19sb2dfbW92ZV90YWlsKCkgZG9lc24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSdzCiAJICogbm90IGVub3VnaCBmcmVlIHNwYWNlIHRvIHdha2UgcGVvcGxlIHVwIHNvIHdlJ3JlIHNhZmUgY2FsbGluZyBpdC4KIAkgKi8KLQltaW5fbGlwID0geGZzX2FpbF9taW4oJm1wLT5tX2FpbCk7CisJbWluX2xpcCA9IHhmc19haWxfbWluKGFpbHApOwogCiAJaWYgKG1pbl9saXAgPT0gbGlwKQotCQl4ZnNfbG9nX21vdmVfdGFpbChtcCwgMSk7CisJCXhmc19sb2dfbW92ZV90YWlsKGFpbHAtPnhhX21vdW50LCAxKTsKIH0JLyogeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0gKi8KIAogCkBAIC0zNDcsNDEgKzQ1NiwzNyBAQAogICogd2UgbW92ZSBpbiB0aGUgQUlMIGlzIHRoZSBtaW5pbXVtIG9uZSwgdXBkYXRlIHRoZSB0YWlsIGxzbiBpbiB0aGUKICAqIGxvZyBtYW5hZ2VyLgogICoKLSAqIEluY3JlbWVudCB0aGUgQUlMJ3MgZ2VuZXJhdGlvbiBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlCi0gKiBoYXMgY2hhbmdlZC4KLSAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawogICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgogICovCiB2b2lkCi14ZnNfdHJhbnNfdXBkYXRlX2FpbCgKLQl4ZnNfbW91bnRfdAkqbXAsCit4ZnNfdHJhbnNfYWlsX3VwZGF0ZSgKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKIAl4ZnNfbG9nX2l0ZW1fdAkqbGlwLAotCXhmc19sc25fdAlsc24pIF9fcmVsZWFzZXMobXAtPm1fYWlsX2xvY2spCisJeGZzX2xzbl90CWxzbikgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKQogewotCXhmc19sb2dfaXRlbV90CQkqZGxpcD1OVUxMOworCXhmc19sb2dfaXRlbV90CQkqZGxpcCA9IE5VTEw7CiAJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwkvKiBwdHIgdG8gbWluaW11bSBsaXAgKi8KIAotCW1saXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKKwltbGlwID0geGZzX2FpbF9taW4oYWlscCk7CiAKIAlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKLQkJZGxpcCA9IHhmc19haWxfZGVsZXRlKCZtcC0+bV9haWwsIGxpcCk7CisJCWRsaXAgPSB4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwogCQlBU1NFUlQoZGxpcCA9PSBsaXApOworCQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcihhaWxwLCBkbGlwKTsKIAl9IGVsc2UgewogCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9JTl9BSUw7CiAJfQogCiAJbGlwLT5saV9sc24gPSBsc247Ci0KLQl4ZnNfYWlsX2luc2VydCgmbXAtPm1fYWlsLCBsaXApOwotCW1wLT5tX2FpbC54YV9nZW4rKzsKKwl4ZnNfYWlsX2luc2VydChhaWxwLCBsaXApOwogCiAJaWYgKG1saXAgPT0gZGxpcCkgewotCQltbGlwID0geGZzX2FpbF9taW4oJm1wLT5tX2FpbCk7Ci0JCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JCXhmc19sb2dfbW92ZV90YWlsKG1wLCBtbGlwLT5saV9sc24pOworCQltbGlwID0geGZzX2FpbF9taW4oYWlscCk7CisJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIG1saXAtPmxpX2xzbik7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCX0KIAogCkBAIC00MDMsMjkgKzUwOCwzMCBAQAogICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgogICovCiB2b2lkCi14ZnNfdHJhbnNfZGVsZXRlX2FpbCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX2xvZ19pdGVtX3QJKmxpcCkgX19yZWxlYXNlcyhtcC0+bV9haWxfbG9jaykKK3hmc190cmFuc19haWxfZGVsZXRlKAorCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAorCXhmc19sb2dfaXRlbV90CSpsaXApIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKIHsKIAl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXA7CiAJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwogCiAJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCW1saXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKLQkJZGxpcCA9IHhmc19haWxfZGVsZXRlKCZtcC0+bV9haWwsIGxpcCk7CisJCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwkJZGxpcCA9IHhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CiAJCUFTU0VSVChkbGlwID09IGxpcCk7CisJCXhmc190cmFuc19haWxfY3Vyc29yX2NsZWFyKGFpbHAsIGRsaXApOwogCiAKIAkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKIAkJbGlwLT5saV9sc24gPSAwOwotCQltcC0+bV9haWwueGFfZ2VuKys7CiAKIAkJaWYgKG1saXAgPT0gZGxpcCkgewotCQkJbWxpcCA9IHhmc19haWxfbWluKCZtcC0+bV9haWwpOwotCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKLQkJCXhmc19sb2dfbW92ZV90YWlsKG1wLCAobWxpcCA/IG1saXAtPmxpX2xzbiA6IDApKTsKKwkJCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCXhmc19sb2dfbW92ZV90YWlsKGFpbHAtPnhhX21vdW50LAorCQkJCQkJKG1saXAgPyBtbGlwLT5saV9sc24gOiAwKSk7CiAJCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwogCQl9CiAJfQogCWVsc2UgewpAQCAtNDMzLDEzICs1MzksMTMgQEAKIAkJICogSWYgdGhlIGZpbGUgc3lzdGVtIGlzIG5vdCBiZWluZyBzaHV0ZG93biwgd2UgYXJlIGluCiAJCSAqIHNlcmlvdXMgdHJvdWJsZSBpZiB3ZSBnZXQgdG8gdGhpcyBzdGFnZS4KIAkJICovCi0JCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7Ci0JCWVsc2UgeworCQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGFpbHAtPnhhX21vdW50OworCisJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewogCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCiAJCSIlczogYXR0ZW1wdGluZyB0byBkZWxldGUgYSBsb2cgaXRlbSB0aGF0IGlzIG5vdCBpbiB0aGUgQUlMIiwKIAkJCQkJX19mdW5jX18pOwotCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgU0hVVERPV05fQ09SUlVQVF9JTkNPUkUpOwogCQl9CiAJfQpAQCAtNDQ4LDU2ICs1NTQsNiBAQAogCiAKIC8qCi0gKiBSZXR1cm4gdGhlIGl0ZW0gaW4gdGhlIEFJTCB3aXRoIHRoZSBzbWFsbGVzdCBsc24uCi0gKiBSZXR1cm4gdGhlIGN1cnJlbnQgdHJlZSBnZW5lcmF0aW9uIG51bWJlciBmb3IgdXNlCi0gKiBpbiBjYWxscyB0byB4ZnNfdHJhbnNfbmV4dF9haWwoKS4KLSAqLwoteGZzX2xvZ19pdGVtX3QgKgoteGZzX3RyYW5zX2ZpcnN0X2FpbCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JaW50CQkqZ2VuKQotewotCXhmc19sb2dfaXRlbV90CSpsaXA7Ci0KLQlsaXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKLQkqZ2VuID0gKGludCltcC0+bV9haWwueGFfZ2VuOwotCi0JcmV0dXJuIGxpcDsKLX0KLQotLyoKLSAqIElmIHRoZSBnZW5lcmF0aW9uIGNvdW50IG9mIHRoZSB0cmVlIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUKLSAqIGNhbGxlciBsYXN0IHRvb2sgc29tZXRoaW5nIGZyb20gdGhlIEFJTCwgdGhlbiByZXR1cm4gdGhlIGVsbXQKLSAqIGluIHRoZSB0cmVlIHdoaWNoIGZvbGxvd3MgdGhlIG9uZSBnaXZlbi4gIElmIHRoZSBjb3VudCBoYXMgY2hhbmdlZCwKLSAqIHRoZW4gcmV0dXJuIHRoZSBtaW5pbXVtIGVsbXQgb2YgdGhlIEFJTCBhbmQgYnVtcCB0aGUgcmVzdGFydHMgY291bnRlcgotICogaWYgb25lIGlzIGdpdmVuLgotICovCi14ZnNfbG9nX2l0ZW1fdCAqCi14ZnNfdHJhbnNfbmV4dF9haWwoCi0JeGZzX21vdW50X3QJKm1wLAotCXhmc19sb2dfaXRlbV90CSpsaXAsCi0JaW50CQkqZ2VuLAotCWludAkJKnJlc3RhcnRzKQotewotCXhmc19sb2dfaXRlbV90CSpubGlwOwotCi0JQVNTRVJUKG1wICYmIGxpcCAmJiBnZW4pOwotCWlmIChtcC0+bV9haWwueGFfZ2VuID09ICpnZW4pIHsKLQkJbmxpcCA9IHhmc19haWxfbmV4dCgmbXAtPm1fYWlsLCBsaXApOwotCX0gZWxzZSB7Ci0JCW5saXAgPSB4ZnNfYWlsX21pbigmbXAtPm1fYWlsKTsKLQkJKmdlbiA9IChpbnQpbXAtPm1fYWlsLnhhX2dlbjsKLQkJaWYgKHJlc3RhcnRzICE9IE5VTEwpIHsKLQkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcmVzdGFydHMpOwotCQkJKCpyZXN0YXJ0cykrKzsKLQkJfQotCX0KLQotCXJldHVybiAobmxpcCk7Ci19Ci0KLQotLyoKICAqIFRoZSBhY3RpdmUgaXRlbSBsaXN0IChBSUwpIGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGxvZwogICogaXRlbXMgc29ydGVkIGJ5IGFzY2VuZGluZyBsc24uICBUaGUgYmFzZSBvZiB0aGUgbGlzdCBpcwogICogYSBmb3J3L2JhY2sgcG9pbnRlciBwYWlyIGVtYmVkZGVkIGluIHRoZSB4ZnMgbW91bnQgc3RydWN0dXJlLgpAQCAtNTE1LDE1ICs1NzEsMzUgQEAKIHhmc190cmFuc19haWxfaW5pdCgKIAl4ZnNfbW91bnRfdAkqbXApCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJm1wLT5tX2FpbC54YV9haWwpOwotCXJldHVybiB4ZnNhaWxkX3N0YXJ0KG1wKTsKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscDsKKwlpbnQJCWVycm9yOworCisJYWlscCA9IGttZW1femFsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX2FpbCksIEtNX01BWUZBSUwpOworCWlmICghYWlscCkKKwkJcmV0dXJuIEVOT01FTTsKKworCWFpbHAtPnhhX21vdW50ID0gbXA7CisJSU5JVF9MSVNUX0hFQUQoJmFpbHAtPnhhX2FpbCk7CisJc3Bpbl9sb2NrX2luaXQoJmFpbHAtPnhhX2xvY2spOworCWVycm9yID0geGZzYWlsZF9zdGFydChhaWxwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWVfYWlscDsKKwltcC0+bV9haWwgPSBhaWxwOworCXJldHVybiAwOworCitvdXRfZnJlZV9haWxwOgorCWttZW1fZnJlZShhaWxwKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHZvaWQKIHhmc190cmFuc19haWxfZGVzdHJveSgKIAl4ZnNfbW91bnRfdAkqbXApCiB7Ci0JeGZzYWlsZF9zdG9wKG1wKTsKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCA9IG1wLT5tX2FpbDsKKworCXhmc2FpbGRfc3RvcChhaWxwKTsKKwlrbWVtX2ZyZWUoYWlscCk7CiB9CiAKIC8qCkBAIC01MzQsNyArNjEwLDcgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19haWxfaW5zZXJ0KAotCXhmc19haWxfdAkqYWlscCwKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKIAl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQogLyogQVJHU1VTRUQgKi8KIHsKQEAgLTU2OCw3ICs2NDQsNyBAQAogLypBUkdTVVNFRCovCiBTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgogeGZzX2FpbF9kZWxldGUoCi0JeGZzX2FpbF90CSphaWxwLAorCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAogCXhmc19sb2dfaXRlbV90CSpsaXApCiAvKiBBUkdTVVNFRCAqLwogewpAQCAtNTg1LDcgKzY2MSw3IEBACiAgKi8KIFNUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqCiB4ZnNfYWlsX21pbigKLQl4ZnNfYWlsX3QJKmFpbHApCisJc3RydWN0IHhmc19haWwJKmFpbHApCiAvKiBBUkdTVVNFRCAqLwogewogCWlmIChsaXN0X2VtcHR5KCZhaWxwLT54YV9haWwpKQpAQCAtNjAxLDcgKzY3Nyw3IEBACiAgKi8KIFNUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqCiB4ZnNfYWlsX25leHQoCi0JeGZzX2FpbF90CSphaWxwLAorCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAogCXhmc19sb2dfaXRlbV90CSpsaXApCiAvKiBBUkdTVVNFRCAqLwogewpAQCAtNjE3LDcgKzY5Myw3IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYWlsX2NoZWNrKAotCXhmc19haWxfdCAJKmFpbHAsCisJc3RydWN0IHhmc19haWwJKmFpbHAsCiAJeGZzX2xvZ19pdGVtX3QJKmxpcCkKIHsKIAl4ZnNfbG9nX2l0ZW1fdAkqcHJldl9saXA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jIGIvZnMveGZzL3hmc190cmFuc19idWYuYwppbmRleCA0ZTg1NWI1Li44ZWUyZjhjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKQEAgLTUyNyw5ICs1MjcsOCBAQAogCQkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOwogCQkJaWYgKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfQlVGKSB7CiAJCQkJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAseGZzX2J1Zl9sb2dfaXRlbV90Kik7Ci0JCQkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oCi0JCQkJCQliaXAtPmJsaV9pdGVtLmxpX21vdW50cCwKLQkJCQkJCWxpcCk7CisJCQkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oYmlwLT5ibGlfaXRlbS5saV9haWxwLAorCQkJCQkJCWxpcCk7CiAJCQl9CiAJCX0KIAkJeGZzX2J1Zl9yZWxzZShicCk7CkBAIC02MjYsNyArNjI1LDcgQEAKIAkgKiB0ZWxsIHRoZSBBSUwgdGhhdCB0aGUgYnVmZmVyIGlzIGJlaW5nIHVubG9ja2VkLgogCSAqLwogCWlmIChiaXAgIT0gTlVMTCkgewotCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShiaXAtPmJsaV9pdGVtLmxpX21vdW50cCwKKwkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oYmlwLT5ibGlfaXRlbS5saV9haWxwLAogCQkJCQkoeGZzX2xvZ19pdGVtX3QqKWJpcCk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKaW5kZXggMmExYzBmMC4uMjNkMjc2YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYwpAQCAtODUsNyArODUsNiBAQAogewogCWludAkJCWVycm9yOwogCXhmc19pbm9kZV90CQkqaXA7Ci0JeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKIAogCS8qCiAJICogSWYgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwganVzdCBjYWxsIHRoZSBub3JtYWwKQEAgLTEzOCwzNCArMTM3LDcgQEAKIAl9CiAJQVNTRVJUKGlwICE9IE5VTEwpOwogCi0JLyoKLQkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KLQkgKi8KLQlpZiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkKLQkJeGZzX2lub2RlX2l0ZW1faW5pdChpcCwgbXApOwotCWlpcCA9IGlwLT5pX2l0ZW1wOwotCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKShpaXApKTsKLQotCXhmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZyhpcCk7Ci0KLQkvKgotCSAqIElmIHRoZSBJTyBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkLCBtYXJrIHRoYXQgaW4KLQkgKiB0aGUgaW5vZGUgbG9nIGl0ZW0gc28gd2UnbGwga25vdyB0byB1bmxvY2sgaXQKLQkgKiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgotCSAqLwotCUFTU0VSVChpaXAtPmlsaV9mbGFncyA9PSAwKTsKLQlpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfRVhDTCkgewotCQlpaXAtPmlsaV9mbGFncyB8PSBYRlNfSUxJX0lPTE9DS0VEX0VYQ0w7Ci0JfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHsKLQkJaWlwLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQ7Ci0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIGlfdHJhbnNwIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggeGZzX2lub2RlX2luY29yZSgpCi0JICogYWJvdmUuCi0JICovCi0JaXAtPmlfdHJhbnNwID0gdHA7Ci0KKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBsb2NrX2ZsYWdzKTsKIAkqaXBwID0gaXA7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCmluZGV4IDNjNjY2ZTguLmUxMTBiZjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCkBAIC0yMiw2ICsyMiwxNCBAQAogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKy8qIFhYWDogZnJvbSBoZXJlIGRvd24gbmVlZGVkIHVudGlsIHN0cnVjdCB4ZnNfdHJhbnMgaGFzIGl0J3Mgb3duIGFpbHAgKi8KKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKIAogU1RBVElDIGludAl4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKHhmc19sb2dfaXRlbV9jaHVua190ICosCiAJCQkJCWludCwgaW50LCB4ZnNfbHNuX3QpOwpAQCAtNzksNiArODcsNyBAQAogCQlsaWRwLT5saWRfc2l6ZSA9IDA7CiAJCWxpcC0+bGlfZGVzYyA9IGxpZHA7CiAJCWxpcC0+bGlfbW91bnRwID0gdHAtPnRfbW91bnRwOworCQlsaXAtPmxpX2FpbHAgPSB0cC0+dF9tb3VudHAtPm1fYWlsOwogCQlyZXR1cm4gbGlkcDsKIAl9CiAKQEAgLTEyMCw2ICsxMjksNyBAQAogCWxpZHAtPmxpZF9zaXplID0gMDsKIAlsaXAtPmxpX2Rlc2MgPSBsaWRwOwogCWxpcC0+bGlfbW91bnRwID0gdHAtPnRfbW91bnRwOworCWxpcC0+bGlfYWlscCA9IHRwLT50X21vdW50cC0+bV9haWw7CiAJcmV0dXJuIGxpZHA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKaW5kZXggM2M3NDhjNC4uNzNlMmFkMyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19wcml2LmgKKysrIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKQEAgLTQ0LDI1ICs0NCw5MyBAQAogCQkJCQkJICAgIHhmc19leHRsZW5fdCBpZHgpOwogCiAvKgotICogRnJvbSB4ZnNfdHJhbnNfYWlsLmMKKyAqIEFJTCB0cmF2ZXJzYWwgY3Vyc29yLgorICoKKyAqIFJhdGhlciB0aGFuIHVzaW5nIGEgZ2VuZXJhdGlvbiBudW1iZXIgZm9yIGRldGVjdGluZyBjaGFuZ2VzIGluIHRoZSBhaWwsIHVzZQorICogYSBjdXJzb3IgdGhhdCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGFpbCBsb2NrLiBUaGUgYWlsZCBjdXJzb3IgZXhpc3RzIGluIHRoZQorICogc3RydWN0IHhmc19haWwsIGJ1dCBvdGhlciB0cmF2ZXJzYWxzIGNhbiBkZWNsYXJlIGl0IG9uIHRoZSBzdGFjayBhbmQgbGluayBpdAorICogdG8gdGhlIGFpbCBsaXN0LgorICoKKyAqIFdoZW4gYW4gb2JqZWN0IGlzIGRlbGV0ZWQgZnJvbSBvciBtb3ZlZCBpbnQgdGhlIEFJTCwgdGhlIGN1cnNvciBsaXN0IGlzCisgKiBzZWFyY2hlZCB0byBzZWUgaWYgdGhlIG9iamVjdCBpcyBhIGRlc2lnbmF0ZWQgY3Vyc29yIGl0ZW0uIElmIGl0IGlzLCBpdCBpcworICogZGVsZXRlZCBmcm9tIHRoZSBjdXJzb3Igc28gdGhhdCB0aGUgbmV4dCB0aW1lIHRoZSBjdXJzb3IgaXMgdXNlZCB0cmF2ZXJzYWwKKyAqIHdpbGwgcmV0dXJuIHRvIHRoZSBzdGFydC4KKyAqCisgKiBUaGlzIG1lYW5zIGEgdHJhdmVyc2FsIGNvbGxpZGluZyB3aXRoIGEgcmVtb3ZhbCB3aWxsIGNhdXNlIGEgcmVzdGFydCBvZiB0aGUKKyAqIGxpc3Qgc2NhbiwgcmF0aGVyIHRoYW4gYW55IGluc2VydGlvbiBvciBkZWxldGlvbiBhbnl3aGVyZSBpbiB0aGUgbGlzdC4gVGhlCisgKiBsb3cgYml0IG9mIHRoZSBpdGVtIHBvaW50ZXIgaXMgc2V0IGlmIHRoZSBjdXJzb3IgaGFzIGJlZW4gaW52YWxpZGF0ZWQgc28KKyAqIHRoYXQgd2UgY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpbnZhbGlkYXRpb24gYW5kIHJlYWNoaW5nIHRoZSBlbmQKKyAqIG9mIHRoZSBsaXN0IHRvIHRyaWdnZXIgdHJhdmVyc2FsIHJlc3RhcnRzLgogICovCi12b2lkCQkJeGZzX3RyYW5zX3VwZGF0ZV9haWwoc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXAsIHhmc19sc25fdCBsc24pCi0JCQkJICAgICBfX3JlbGVhc2VzKG1wLT5tX2FpbF9sb2NrKTsKLXZvaWQJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKLQkJCQkgICAgIF9fcmVsZWFzZXMobXAtPm1fYWlsX2xvY2spOwotc3RydWN0IHhmc19sb2dfaXRlbQkqeGZzX3RyYW5zX2ZpcnN0X2FpbChzdHJ1Y3QgeGZzX21vdW50ICosIGludCAqKTsKLXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKnhmc190cmFuc19uZXh0X2FpbChzdHJ1Y3QgeGZzX21vdW50ICosCi0JCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICosIGludCAqLCBpbnQgKik7Ci0KK3N0cnVjdCB4ZnNfYWlsX2N1cnNvciB7CisJc3RydWN0IHhmc19haWxfY3Vyc29yCSpuZXh0OworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKml0ZW07Cit9OwogCiAvKgotICogQUlMIHB1c2ggdGhyZWFkIHN1cHBvcnQKKyAqIFByaXZhdGUgQUlMIHN0cnVjdHVyZXMuCisgKgorICogRXZlbnR1YWxseSB3ZSBuZWVkIHRvIGRyaXZlIHRoZSBsb2NraW5nIGluIGhlcmUgYXMgd2VsbC4KICAqLwotbG9uZwl4ZnNhaWxkX3B1c2goc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfbHNuX3QgKik7Ci12b2lkCXhmc2FpbGRfd2FrZXVwKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2xzbl90KTsKLWludAl4ZnNhaWxkX3N0YXJ0KHN0cnVjdCB4ZnNfbW91bnQgKik7Ci12b2lkCXhmc2FpbGRfc3RvcChzdHJ1Y3QgeGZzX21vdW50ICopOworc3RydWN0IHhmc19haWwgeworCXN0cnVjdCB4ZnNfbW91bnQJKnhhX21vdW50OworCXN0cnVjdCBsaXN0X2hlYWQJeGFfYWlsOworCXVpbnQJCQl4YV9nZW47CisJc3RydWN0IHRhc2tfc3RydWN0CSp4YV90YXNrOworCXhmc19sc25fdAkJeGFfdGFyZ2V0OworCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgl4YV9jdXJzb3JzOworCXNwaW5sb2NrX3QJCXhhX2xvY2s7Cit9OwogCisvKgorICogRnJvbSB4ZnNfdHJhbnNfYWlsLmMKKyAqLwordm9pZAkJCXhmc190cmFuc19haWxfdXBkYXRlKHN0cnVjdCB4ZnNfYWlsICphaWxwLAorCQkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXAsIHhmc19sc25fdCBsc24pCisJCQkJCV9fcmVsZWFzZXMoYWlscC0+eGFfbG9jayk7Cit2b2lkCQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoc3RydWN0IHhmc19haWwgKmFpbHAsCisJCQkJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKKwkJCQkJX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKTsKK3ZvaWQJCQl4ZnNfdHJhbnNfYWlsX3B1c2goc3RydWN0IHhmc19haWwgKiwgeGZzX2xzbl90KTsKK3ZvaWQJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShzdHJ1Y3QgeGZzX2FpbCAqLAorCQkJCQl4ZnNfbG9nX2l0ZW1fdCAqKTsKKworeGZzX2xzbl90CQl4ZnNfdHJhbnNfYWlsX3RhaWwoc3RydWN0IHhmc19haWwgKmFpbHApOworCitzdHJ1Y3QgeGZzX2xvZ19pdGVtCSp4ZnNfdHJhbnNfYWlsX2N1cnNvcl9maXJzdChzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKKwkJCQkJc3RydWN0IHhmc19haWxfY3Vyc29yICpjdXIsCisJCQkJCXhmc19sc25fdCBsc24pOworc3RydWN0IHhmc19sb2dfaXRlbQkqeGZzX3RyYW5zX2FpbF9jdXJzb3JfbmV4dChzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKKwkJCQkJc3RydWN0IHhmc19haWxfY3Vyc29yICpjdXIpOwordm9pZAkJCXhmc190cmFuc19haWxfY3Vyc29yX2RvbmUoc3RydWN0IHhmc19haWwgKmFpbHAsCisJCQkJCXN0cnVjdCB4ZnNfYWlsX2N1cnNvciAqY3VyKTsKKworbG9uZwl4ZnNhaWxkX3B1c2goc3RydWN0IHhmc19haWwgKiwgeGZzX2xzbl90ICopOwordm9pZAl4ZnNhaWxkX3dha2V1cChzdHJ1Y3QgeGZzX2FpbCAqLCB4ZnNfbHNuX3QpOworaW50CXhmc2FpbGRfc3RhcnQoc3RydWN0IHhmc19haWwgKik7Cit2b2lkCXhmc2FpbGRfc3RvcChzdHJ1Y3QgeGZzX2FpbCAqKTsKKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gNjQKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX3RyYW5zX2FpbF9jb3B5X2xzbigKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKKwl4ZnNfbHNuX3QJKmRzdCwKKwl4ZnNfbHNuX3QJKnNyYykKK3sKKwlBU1NFUlQoc2l6ZW9mKHhmc19sc25fdCkgPT0gOCk7CS8qIGRvbid0IGxvY2sgaWYgaXQgc2hyaW5rcyAqLworCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJKmRzdCA9ICpzcmM7CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX3RyYW5zX2FpbF9jb3B5X2xzbigKKwlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKKwl4ZnNfbHNuX3QJKmRzdCwKKwl4ZnNfbHNuX3QJKnNyYykKK3sKKwlBU1NFUlQoc2l6ZW9mKHhmc19sc25fdCkgPT0gOCk7CisJKmRzdCA9ICpzcmM7Cit9CisjZW5kaWYKICNlbmRpZgkvKiBfX1hGU19UUkFOU19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc191dGlscy5jIGIvZnMveGZzL3hmc191dGlscy5jCmluZGV4IDM1ZDRkNDEuLmZjYzIyODUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdXRpbHMuYworKysgYi9mcy94ZnMveGZzX3V0aWxzLmMKQEAgLTE3Miw2ICsxNzIsMTIgQEAKIAkJCSppcHAgPSBOVUxMOwogCQkJcmV0dXJuIGNvZGU7CiAJCX0KKworCQkvKgorCQkgKiB0cmFuc2FjdGlvbiBjb21taXQgd29ya2VkIG9rIHNvIHdlIGNhbiBkcm9wIHRoZSBleHRyYSB0aWNrZXQKKwkJICogcmVmZXJlbmNlIHRoYXQgd2UgZ2FpbmVkIGluIHhmc190cmFuc19kdXAoKQorCQkgKi8KKwkJeGZzX2xvZ190aWNrZXRfcHV0KHRwLT50X3RpY2tldCk7CiAJCWNvZGUgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgbG9nX3JlcywgMCwKIAkJCQkJIFhGU19UUkFOU19QRVJNX0xPR19SRVMsIGxvZ19jb3VudCk7CiAJCS8qCkBAIC0yNjgsOSArMjc0LDkgQEAKIAl4ZnNfbW91bnRfdAkqbXA7CiAKIAlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKLQlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKTsKKwlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IDEpOwogCi0JaXAtPmlfZC5kaV92ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7CisJaXAtPmlfZC5kaV92ZXJzaW9uID0gMjsKIAlpcC0+aV9kLmRpX29ubGluayA9IDA7CiAJbWVtc2V0KCYoaXAtPmlfZC5kaV9wYWRbMF0pLCAwLCBzaXplb2YoaXAtPmlfZC5kaV9wYWQpKTsKIAltcCA9IHRwLT50X21vdW50cDsKQEAgLTMwMiw3ICszMDgsNyBAQAogCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID4gMCk7CiAJaXAtPmlfZC5kaV9ubGluaysrOwogCWluY19ubGluayhWRlNfSShpcCkpOwotCWlmICgoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSAmJgorCWlmICgoaXAtPmlfZC5kaV92ZXJzaW9uID09IDEpICYmCiAJICAgIChpcC0+aV9kLmRpX25saW5rID4gWEZTX01BWExJTktfMSkpIHsKIAkJLyoKIAkJICogVGhlIGlub2RlIGhhcyBpbmNyZWFzZWQgaXRzIG51bWJlciBvZiBsaW5rcyBiZXlvbmQKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMgYi9mcy94ZnMveGZzX3Zmc29wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzlkZDM5Li4wMDAwMDAwCi0tLSBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpbmNsdWRlICJ4ZnMuaCIKLSNpbmNsdWRlICJ4ZnNfZnMuaCIKLSNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKLSNpbmNsdWRlICJ4ZnNfYml0LmgiCi0jaW5jbHVkZSAieGZzX2xvZy5oIgotI2luY2x1ZGUgInhmc19pbnVtLmgiCi0jaW5jbHVkZSAieGZzX3RyYW5zLmgiCi0jaW5jbHVkZSAieGZzX3NiLmgiCi0jaW5jbHVkZSAieGZzX2FnLmgiCi0jaW5jbHVkZSAieGZzX2RpcjIuaCIKLSNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKLSNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKLSNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgotI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgotI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCi0jaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZS5oIgotI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2FsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2lhbGxvYy5oIgotI2luY2x1ZGUgInhmc19xdW90YS5oIgotI2luY2x1ZGUgInhmc19lcnJvci5oIgotI2luY2x1ZGUgInhmc19ibWFwLmgiCi0jaW5jbHVkZSAieGZzX3J3LmgiCi0jaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKLSNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCi0jaW5jbHVkZSAieGZzX2FjbC5oIgotI2luY2x1ZGUgInhmc19hdHRyLmgiCi0jaW5jbHVkZSAieGZzX2NsbnQuaCIKLSNpbmNsdWRlICJ4ZnNfbXJ1X2NhY2hlLmgiCi0jaW5jbHVkZSAieGZzX2ZpbGVzdHJlYW0uaCIKLSNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKLSNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKLSNpbmNsdWRlICJ4ZnNfdmZzb3BzLmgiCi0jaW5jbHVkZSAieGZzX3V0aWxzLmgiCi0KLQotU1RBVElDIHZvaWQKLXhmc19xdWllc2NlX2ZzKAotCXhmc19tb3VudF90CQkqbXApCi17Ci0JaW50CQkJY291bnQgPSAwLCBwaW5jb3VudDsKLQotCXhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDApOwotCXhmc19maW5pc2hfcmVjbGFpbV9hbGwobXAsIDApOwotCi0JLyogVGhpcyBsb29wIG11c3QgcnVuIGF0IGxlYXN0IHR3aWNlLgotCSAqIFRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbG9vcCB3aWxsIGZsdXNoCi0JICogbW9zdCBtZXRhIGRhdGEgYnV0IHRoYXQgd2lsbCBnZW5lcmF0ZSBtb3JlCi0JICogbWV0YSBkYXRhICh0eXBpY2FsbHkgZGlyZWN0b3J5IHVwZGF0ZXMpLgotCSAqIFdoaWNoIHRoZW4gbXVzdCBiZSBmbHVzaGVkIGFuZCBsb2dnZWQgYmVmb3JlCi0JICogd2UgY2FuIHdyaXRlIHRoZSB1bm1vdW50IHJlY29yZC4KLQkgKi8KLQlkbyB7Ci0JCXhmc19zeW5jc3ViKG1wLCBTWU5DX0lOT0RFX1FVSUVTQ0UsIE5VTEwpOwotCQlwaW5jb3VudCA9IHhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOwotCQlpZiAoIXBpbmNvdW50KSB7Ci0JCQlkZWxheSg1MCk7Ci0JCQljb3VudCsrOwotCQl9Ci0JfSB3aGlsZSAoY291bnQgPCAyKTsKLX0KLQotLyoKLSAqIFNlY29uZCBzdGFnZSBvZiBhIHF1aWVzY2UuIFRoZSBkYXRhIGlzIGFscmVhZHkgc3luY2VkLCBub3cgd2UgaGF2ZSB0byB0YWtlCi0gKiBjYXJlIG9mIHRoZSBtZXRhZGF0YS4gTmV3IHRyYW5zYWN0aW9ucyBhcmUgYWxyZWFkeSBibG9ja2VkLCBzbyB3ZSBuZWVkIHRvCi0gKiB3YWl0IGZvciBhbnkgcmVtYWluaW5nIHRyYW5zYWN0aW9ucyB0byBkcmFpbiBvdXQgYmVmb3JlIHByb2NlZGluZy4KLSAqLwotdm9pZAoteGZzX2F0dHJfcXVpZXNjZSgKLQl4ZnNfbW91bnRfdAkqbXApCi17Ci0JaW50CWVycm9yID0gMDsKLQotCS8qIHdhaXQgZm9yIGFsbCBtb2RpZmljYXRpb25zIHRvIGNvbXBsZXRlICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZtcC0+bV9hY3RpdmVfdHJhbnMpID4gMCkKLQkJZGVsYXkoMTAwKTsKLQotCS8qIGZsdXNoIGlub2RlcyBhbmQgcHVzaCBhbGwgcmVtYWluaW5nIGJ1ZmZlcnMgb3V0IHRvIGRpc2sgKi8KLQl4ZnNfcXVpZXNjZV9mcyhtcCk7Ci0KLQlBU1NFUlRfQUxXQVlTKGF0b21pY19yZWFkKCZtcC0+bV9hY3RpdmVfdHJhbnMpID09IDApOwotCi0JLyogUHVzaCB0aGUgc3VwZXJibG9jayBhbmQgd3JpdGUgYW4gdW5tb3VudCByZWNvcmQgKi8KLQllcnJvciA9IHhmc19sb2dfc2Jjb3VudChtcCwgMSk7Ci0JaWYgKGVycm9yKQotCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKLQkJCQkieGZzX2F0dHJfcXVpZXNjZTogZmFpbGVkIHRvIGxvZyBzYiBjaGFuZ2VzLiAiCi0JCQkJIkZyb3plbiBpbWFnZSBtYXkgbm90IGJlIGNvbnNpc3RlbnQuIik7Ci0JeGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKLQl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOwotfQotCi0vKgotICogeGZzX3VubW91bnRfZmx1c2ggaW1wbGVtZW50cyBhIHNldCBvZiBmbHVzaCBvcGVyYXRpb24gb24gc3BlY2lhbAotICogaW5vZGVzLCB3aGljaCBhcmUgbmVlZGVkIGFzIGEgc2VwYXJhdGUgc2V0IG9mIG9wZXJhdGlvbnMgc28gdGhhdAotICogdGhleSBjYW4gYmUgY2FsbGVkIGFzIHBhcnQgb2YgcmVsb2NhdGlvbiBwcm9jZXNzLgotICovCi1pbnQKLXhmc191bm1vdW50X2ZsdXNoKAotCXhmc19tb3VudF90CSptcCwJCS8qIE1vdW50IHN0cnVjdHVyZSB3ZSBhcmUgZ2V0dGluZwotCQkJCQkgICByaWQgb2YuICovCi0JaW50ICAgICAgICAgICAgIHJlbG9jYXRpb24pCS8qIENhbGxlZCBmcm9tIHZmcyByZWxvY2F0aW9uLiAqLwotewotCXhmc19pbm9kZV90CSpyaXAgPSBtcC0+bV9yb290aXA7Ci0JeGZzX2lub2RlX3QJKnJibWlwOwotCXhmc19pbm9kZV90CSpyc3VtaXAgPSBOVUxMOwotCWludAkJZXJyb3I7Ci0KLQl4ZnNfaWxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JTE9DS19QQVJFTlQpOwotCXhmc19pZmxvY2socmlwKTsKLQotCS8qCi0JICogRmx1c2ggb3V0IHRoZSByZWFsIHRpbWUgaW5vZGVzLgotCSAqLwotCWlmICgocmJtaXAgPSBtcC0+bV9yYm1pcCkgIT0gTlVMTCkgewotCQl4ZnNfaWxvY2socmJtaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2lmbG9jayhyYm1pcCk7Ci0JCWVycm9yID0geGZzX2lmbHVzaChyYm1pcCwgWEZTX0lGTFVTSF9TWU5DKTsKLQkJeGZzX2l1bmxvY2socmJtaXAsIFhGU19JTE9DS19FWENMKTsKLQotCQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKQotCQkJZ290byBmc2NvcnJ1cHRfb3V0OwotCi0JCUFTU0VSVCh2bl9jb3VudChWRlNfSShyYm1pcCkpID09IDEpOwotCi0JCXJzdW1pcCA9IG1wLT5tX3JzdW1pcDsKLQkJeGZzX2lsb2NrKHJzdW1pcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfaWZsb2NrKHJzdW1pcCk7Ci0JCWVycm9yID0geGZzX2lmbHVzaChyc3VtaXAsIFhGU19JRkxVU0hfU1lOQyk7Ci0JCXhmc19pdW5sb2NrKHJzdW1pcCwgWEZTX0lMT0NLX0VYQ0wpOwotCi0JCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCi0JCQlnb3RvIGZzY29ycnVwdF9vdXQ7Ci0KLQkJQVNTRVJUKHZuX2NvdW50KFZGU19JKHJzdW1pcCkpID09IDEpOwotCX0KLQotCS8qCi0JICogU3luY2hyb25vdXNseSBmbHVzaCByb290IGlub2RlIHRvIGRpc2sKLQkgKi8KLQllcnJvciA9IHhmc19pZmx1c2gocmlwLCBYRlNfSUZMVVNIX1NZTkMpOwotCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCi0JCWdvdG8gZnNjb3JydXB0X291dDI7Ci0KLQlpZiAodm5fY291bnQoVkZTX0kocmlwKSkgIT0gMSAmJiAhcmVsb2NhdGlvbikgewotCQl4ZnNfaXVubG9jayhyaXAsIFhGU19JTE9DS19FWENMKTsKLQkJcmV0dXJuIFhGU19FUlJPUihFQlVTWSk7Ci0JfQotCi0JLyoKLQkgKiBSZWxlYXNlIGRxdW90IHRoYXQgcm9vdGlub2RlLCByYm1pbm8gYW5kIHJzdW1pbm8gbWlnaHQgYmUgaG9sZGluZywKLQkgKiBmbHVzaCBhbmQgcHVyZ2UgdGhlIHF1b3RhIGlub2Rlcy4KLQkgKi8KLQllcnJvciA9IFhGU19RTV9VTk1PVU5UKG1wKTsKLQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKQotCQlnb3RvIGZzY29ycnVwdF9vdXQyOwotCi0JaWYgKHJibWlwKSB7Ci0JCUlSRUxFKHJibWlwKTsKLQkJSVJFTEUocnN1bWlwKTsKLQl9Ci0KLQl4ZnNfaXVubG9jayhyaXAsIFhGU19JTE9DS19FWENMKTsKLQlyZXR1cm4gMDsKLQotZnNjb3JydXB0X291dDoKLQl4ZnNfaWZ1bmxvY2socmlwKTsKLQotZnNjb3JydXB0X291dDI6Ci0JeGZzX2l1bmxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Ci19Ci0KLS8qCi0gKiB4ZnNfc3luYyBmbHVzaGVzIGFueSBwZW5kaW5nIEkvTyB0byBmaWxlIHN5c3RlbSB2ZnNwLgotICoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdmZzX3N5bmMoKSB0byBtYWtlIHN1cmUgdGhhdCB0aGluZ3MgbWFrZSBpdAotICogb3V0IHRvIGRpc2sgZXZlbnR1YWxseSwgb24gc3luYygpIHN5c3RlbSBjYWxscyB0byBmbHVzaCBvdXQgZXZlcnl0aGluZywKLSAqIGFuZCB3aGVuIHRoZSBmaWxlIHN5c3RlbSBpcyB1bm1vdW50ZWQuICBGb3IgdGhlIHZmc19zeW5jKCkgY2FzZSwgYWxsCi0gKiB3ZSByZWFsbHkgbmVlZCB0byBkbyBpcyBzeW5jIG91dCB0aGUgbG9nIHRvIG1ha2UgYWxsIG9mIG91ciBtZXRhLWRhdGEKLSAqIHVwZGF0ZXMgcGVybWFuZW50IChleGNlcHQgZm9yIHRpbWVzdGFtcHMpLiAgRm9yIGNhbGxzIGZyb20gcGZsdXNoZCgpLAotICogZGlydHkgcGFnZXMgYXJlIGtlcHQgbW92aW5nIGJ5IGNhbGxpbmcgcGRmbHVzaCgpIG9uIHRoZSBpbm9kZXMKLSAqIGNvbnRhaW5pbmcgdGhlbS4gIFdlIGFsc28gZmx1c2ggdGhlIGlub2RlcyB0aGF0IHdlIGNhbiBsb2NrIHdpdGhvdXQKLSAqIHNsZWVwaW5nIGFuZCB0aGUgc3VwZXJibG9jayBpZiB3ZSBjYW4gbG9jayBpdCB3aXRob3V0IHNsZWVwaW5nIGZyb20KLSAqIHZmc19zeW5jKCkgc28gdGhhdCBpdGVtcyBhdCB0aGUgdGFpbCBvZiB0aGUgbG9nIGFyZSBhbHdheXMgbW92aW5nIG91dC4KLSAqCi0gKiBGbGFnczoKLSAqICAgICAgU1lOQ19CREZMVVNIIC0gV2UncmUgYmVpbmcgY2FsbGVkIGZyb20gdmZzX3N5bmMoKSBzbyB3ZSBkb24ndCB3YW50Ci0gKgkJICAgICAgIHRvIHNsZWVwIGlmIHdlIGNhbiBoZWxwIGl0LiAgQWxsIHdlIHJlYWxseSBuZWVkCi0gKgkJICAgICAgIHRvIGRvIGlzIGVuc3VyZSB0aGF0IHRoZSBsb2cgaXMgc3luY2VkIGF0IGxlYXN0Ci0gKgkJICAgICAgIHBlcmlvZGljYWxseS4gIFdlIGFsc28gcHVzaCB0aGUgaW5vZGVzIGFuZAotICoJCSAgICAgICBzdXBlcmJsb2NrIGlmIHdlIGNhbiBsb2NrIHRoZW0gd2l0aG91dCBzbGVlcGluZwotICoJCQlhbmQgdGhleSBhcmUgbm90IHBpbm5lZC4KLSAqICAgICAgU1lOQ19BVFRSICAgIC0gV2UgbmVlZCB0byBmbHVzaCB0aGUgaW5vZGVzLiAgSWYgU1lOQ19CREZMVVNIIGlzIG5vdAotICoJCSAgICAgICBzZXQsIHRoZW4gd2UgcmVhbGx5IHdhbnQgdG8gbG9jayBlYWNoIGlub2RlIGFuZCBmbHVzaAotICoJCSAgICAgICBpdC4KLSAqICAgICAgU1lOQ19XQUlUICAgIC0gQWxsIHRoZSBmbHVzaGVzIHRoYXQgdGFrZSBwbGFjZSBpbiB0aGlzIGNhbGwgc2hvdWxkCi0gKgkJICAgICAgIGJlIHN5bmNocm9ub3VzLgotICogICAgICBTWU5DX0RFTFdSSSAgLSBUaGlzIHRlbGxzIHVzIHRvIHB1c2ggZGlydHkgcGFnZXMgYXNzb2NpYXRlZCB3aXRoCi0gKgkJICAgICAgIGlub2Rlcy4gIFNZTkNfV0FJVCBhbmQgU1lOQ19CREZMVVNIIGFyZSB1c2VkIHRvCi0gKgkJICAgICAgIGRldGVybWluZSBpZiB0aGV5IHNob3VsZCBiZSBmbHVzaGVkIHN5bmMsIGFzeW5jLCBvcgotICoJCSAgICAgICBkZWx3cmkuCi0gKiAgICAgIFNZTkNfQ0xPU0UgICAtIFRoaXMgZmxhZyBpcyBwYXNzZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGJlaW5nCi0gKgkJICAgICAgIHVubW91bnRlZC4gIFdlIHNob3VsZCBzeW5jIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcuCi0gKiAgICAgIFNZTkNfRlNEQVRBICAtIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBsaWtlIHRvIG1ha2UKLSAqCQkgICAgICAgc3VyZSB0aGUgc3VwZXJibG9jayBpcyBzYWZlIG9uIGRpc2suICBXZSBjYW4gZW5zdXJlCi0gKgkJICAgICAgIHRoaXMgYnkgc2ltcGx5IG1ha2luZyBzdXJlIHRoZSBsb2cgZ2V0cyBmbHVzaGVkCi0gKgkJICAgICAgIGlmIFNZTkNfQkRGTFVTSCBpcyBzZXQsIGFuZCBieSBhY3R1YWxseSB3cml0aW5nIGl0Ci0gKgkJICAgICAgIG91dCBvdGhlcndpc2UuCi0gKglTWU5DX0lPV0FJVCAgLSBUaGUgY2FsbGVyIHdhbnRzIHVzIHRvIHdhaXQgZm9yIGFsbCBkYXRhIEkvTyB0byBjb21wbGV0ZQotICoJCSAgICAgICBiZWZvcmUgd2UgcmV0dXJuIChpbmNsdWRpbmcgZGlyZWN0IEkvTykuIEZvcm1zIHRoZSBkcmFpbgotICoJCSAgICAgICBzaWRlIG9mIHRoZSB3cml0ZSBiYXJyaWVyIG5lZWRlZCB0byBzYWZlbHkgcXVpZXNjZSB0aGUKLSAqCQkgICAgICAgZmlsZXN5c3RlbS4KLSAqCi0gKi8KLWludAoteGZzX3N5bmMoCi0JeGZzX21vdW50X3QJKm1wLAotCWludAkJZmxhZ3MpCi17Ci0JaW50CQllcnJvcjsKLQotCS8qCi0JICogR2V0IHRoZSBRdW90YSBNYW5hZ2VyIHRvIGZsdXNoIHRoZSBkcXVvdHMuCi0JICoKLQkgKiBJZiBYRlMgcXVvdGEgc3VwcG9ydCBpcyBub3QgZW5hYmxlZCBvciB0aGlzIGZpbGVzeXN0ZW0KLQkgKiBpbnN0YW5jZSBkb2VzIG5vdCB1c2UgcXVvdGFzIFhGU19RTV9EUVNZTkMgd2lsbCBhbHdheXMKLQkgKiByZXR1cm4gemVyby4KLQkgKi8KLQllcnJvciA9IFhGU19RTV9EUVNZTkMobXAsIGZsYWdzKTsKLQlpZiAoZXJyb3IpIHsKLQkJLyoKLQkJICogSWYgd2UgZ290IGFuIElPIGVycm9yLCB3ZSB3aWxsIGJlIHNodXR0aW5nIGRvd24uCi0JCSAqIFNvLCB0aGVyZSdzIG5vdGhpbmcgbW9yZSBmb3IgdXMgdG8gZG8gaGVyZS4KLQkJICovCi0JCUFTU0VSVChlcnJvciAhPSBFSU8gfHwgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOwotCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCi0JCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKLQl9Ci0KLQlpZiAoZmxhZ3MgJiBTWU5DX0lPV0FJVCkKLQkJeGZzX2ZpbGVzdHJlYW1fZmx1c2gobXApOwotCi0JcmV0dXJuIHhmc19zeW5jc3ViKG1wLCBmbGFncywgTlVMTCk7Ci19Ci0KLS8qCi0gKiB4ZnMgc3luYyByb3V0aW5lIGZvciBpbnRlcm5hbCB1c2UKLSAqCi0gKiBUaGlzIHJvdXRpbmUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmbGFncyBkZWZpbmVkIGZvciB0aGUgZ2VuZXJpYyB2ZnNfc3luYwotICogaW50ZXJmYWNlIGFzIGV4cGxhaW5lZCBhYm92ZSB1bmRlciB4ZnNfc3luYy4KLSAqCi0gKi8KLWludAoteGZzX3N5bmNfaW5vZGVzKAotCXhmc19tb3VudF90CSptcCwKLQlpbnQJCWZsYWdzLAotCWludCAgICAgICAgICAgICAqYnlwYXNzZWQpCi17Ci0JeGZzX2lub2RlX3QJKmlwID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUJKnZwID0gTlVMTDsKLQlpbnQJCWVycm9yOwotCWludAkJbGFzdF9lcnJvcjsKLQl1aW50NjRfdAlmZmxhZzsKLQl1aW50CQlsb2NrX2ZsYWdzOwotCXVpbnQJCWJhc2VfbG9ja19mbGFnczsKLQlib29sZWFuX3QJbW91bnRfbG9ja2VkOwotCWJvb2xlYW5fdAl2bm9kZV9yZWZlZDsKLQlpbnQJCXByZWVtcHQ7Ci0JeGZzX2lwdHJfdAkqaXBvaW50ZXI7Ci0jaWZkZWYgREVCVUcKLQlib29sZWFuX3QJaXBvaW50ZXJfaW4gPSBCX0ZBTFNFOwotCi0jZGVmaW5lIElQT0lOVEVSX1NFVAlpcG9pbnRlcl9pbiA9IEJfVFJVRQotI2RlZmluZSBJUE9JTlRFUl9DTFIJaXBvaW50ZXJfaW4gPSBCX0ZBTFNFCi0jZWxzZQotI2RlZmluZSBJUE9JTlRFUl9TRVQKLSNkZWZpbmUgSVBPSU5URVJfQ0xSCi0jZW5kaWYKLQotCi0vKiBJbnNlcnQgYSBtYXJrZXIgcmVjb3JkIGludG8gdGhlIGlub2RlIGxpc3QgYWZ0ZXIgaW5vZGUgaXAuIFRoZSBsaXN0Ci0gKiBtdXN0IGJlIGxvY2tlZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiBBZnRlciB0aGUgY2FsbCB0aGUgbGlzdCB3aWxsIG5vCi0gKiBsb25nZXIgYmUgbG9ja2VkLgotICovCi0jZGVmaW5lIElQT0lOVEVSX0lOU0VSVChpcCwgbXApCXsgXAotCQlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7IFwKLQkJaXBvaW50ZXItPmlwX21uZXh0ID0gaXAtPmlfbW5leHQ7IFwKLQkJaXBvaW50ZXItPmlwX21wcmV2ID0gaXA7IFwKLQkJaXAtPmlfbW5leHQgPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcjsgXAotCQlpcG9pbnRlci0+aXBfbW5leHQtPmlfbXByZXYgPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcjsgXAotCQlwcmVlbXB0ID0gMDsgXAotCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7IFwKLQkJbW91bnRfbG9ja2VkID0gQl9GQUxTRTsgXAotCQlJUE9JTlRFUl9TRVQ7IFwKLQl9Ci0KLS8qIFJlbW92ZSB0aGUgbWFya2VyIGZyb20gdGhlIGlub2RlIGxpc3QuIElmIHRoZSBtYXJrZXIgd2FzIHRoZSBvbmx5IGl0ZW0KLSAqIGluIHRoZSBsaXN0IHRoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBpbm9kZXMgYW5kIHdlIHNob3VsZCB6ZXJvIG91dAotICogdGhlIHdob2xlIGxpc3QuIElmIHdlIGFyZSB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBsaXN0IHRoZW4gbW92ZSB0aGUgaGVhZAotICogcGFzdCB1cy4KLSAqLwotI2RlZmluZSBJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKQl7IFwKLQkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfVFJVRSk7IFwKLQkJaWYgKGlwb2ludGVyLT5pcF9tbmV4dCAhPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcikgeyBcCi0JCQlpcCA9IGlwb2ludGVyLT5pcF9tbmV4dDsgXAotCQkJaXAtPmlfbXByZXYgPSBpcG9pbnRlci0+aXBfbXByZXY7IFwKLQkJCWlwb2ludGVyLT5pcF9tcHJldi0+aV9tbmV4dCA9IGlwOyBcCi0JCQlpZiAobXAtPm1faW5vZGVzID09ICh4ZnNfaW5vZGVfdCAqKWlwb2ludGVyKSB7IFwKLQkJCQltcC0+bV9pbm9kZXMgPSBpcDsgXAotCQkJfSBcCi0JCX0gZWxzZSB7IFwKLQkJCUFTU0VSVChtcC0+bV9pbm9kZXMgPT0gKHhmc19pbm9kZV90ICopaXBvaW50ZXIpOyBcCi0JCQltcC0+bV9pbm9kZXMgPSBOVUxMOyBcCi0JCQlpcCA9IE5VTEw7IFwKLQkJfSBcCi0JCUlQT0lOVEVSX0NMUjsgXAotCX0KLQotI2RlZmluZSBYRlNfUFJFRU1QVF9NQVNLCTB4N2YKLQotCUFTU0VSVCghKGZsYWdzICYgU1lOQ19CREZMVVNIKSk7Ci0KLQlpZiAoYnlwYXNzZWQpCi0JCSpieXBhc3NlZCA9IDA7Ci0JaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkKLQkJcmV0dXJuIDA7Ci0JZXJyb3IgPSAwOwotCWxhc3RfZXJyb3IgPSAwOwotCXByZWVtcHQgPSAwOwotCi0JLyogQWxsb2NhdGUgYSByZWZlcmVuY2UgbWFya2VyICovCi0JaXBvaW50ZXIgPSAoeGZzX2lwdHJfdCAqKWttZW1femFsbG9jKHNpemVvZih4ZnNfaXB0cl90KSwgS01fU0xFRVApOwotCi0JZmZsYWcgPSBYRlNfQl9BU1lOQzsJCS8qIGRlZmF1bHQgaXMgZG9uJ3Qgd2FpdCAqLwotCWlmIChmbGFncyAmIFNZTkNfREVMV1JJKQotCQlmZmxhZyA9IFhGU19CX0RFTFdSSTsKLQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCi0JCWZmbGFnID0gMDsJCS8qIHN5bmNocm9ub3VzIG92ZXJyaWRlcyBhbGwgKi8KLQotCWJhc2VfbG9ja19mbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7Ci0JaWYgKGZsYWdzICYgKFNZTkNfREVMV1JJIHwgU1lOQ19DTE9TRSkpIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0aGUgSS9PIGxvY2sgaWYgd2UncmUgZ29pbmcgdG8gY2FsbCBhbnkgb2YKLQkJICogdGhlIGZsdXNoL2ludmFsIHJvdXRpbmVzLgotCQkgKi8KLQkJYmFzZV9sb2NrX2ZsYWdzIHw9IFhGU19JT0xPQ0tfU0hBUkVEOwotCX0KLQotCVhGU19NT1VOVF9JTE9DSyhtcCk7Ci0KLQlpcCA9IG1wLT5tX2lub2RlczsKLQotCW1vdW50X2xvY2tlZCA9IEJfVFJVRTsKLQl2bm9kZV9yZWZlZCAgPSBCX0ZBTFNFOwotCi0JSVBPSU5URVJfQ0xSOwotCi0JZG8gewotCQlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7Ci0JCUFTU0VSVCh2bm9kZV9yZWZlZCA9PSBCX0ZBTFNFKTsKLQotCQlsb2NrX2ZsYWdzID0gYmFzZV9sb2NrX2ZsYWdzOwotCi0JCS8qCi0JCSAqIFRoZXJlIHdlcmUgbm8gaW5vZGVzIGluIHRoZSBsaXN0LCBqdXN0IGJyZWFrIG91dAotCQkgKiBvZiB0aGUgbG9vcC4KLQkJICovCi0JCWlmIChpcCA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIGZvdW5kIGFub3RoZXIgc3luYyB0aHJlYWQgbWFya2VyIC0gc2tpcCBpdAotCQkgKi8KLQkJaWYgKGlwLT5pX21vdW50ID09IE5VTEwpIHsKLQkJCWlwID0gaXAtPmlfbW5leHQ7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXZwID0gVkZTX0koaXApOwotCi0JCS8qCi0JCSAqIElmIHRoZSB2bm9kZSBpcyBnb25lIHRoZW4gdGhpcyBpcyBiZWluZyB0b3JuIGRvd24sCi0JCSAqIGNhbGwgcmVjbGFpbSBpZiBpdCBpcyBmbHVzaGVkLCBlbHNlIGxldCByZWd1bGFyIGZsdXNoCi0JCSAqIGNvZGUgZGVhbCB3aXRoIGl0IGxhdGVyIGluIHRoZSBsb29wLgotCQkgKi8KLQotCQlpZiAodnAgPT0gTlVMTCkgewotCQkJLyogU2tpcCBvbmVzIGFscmVhZHkgaW4gcmVjbGFpbSAqLwotCQkJaWYgKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNKSB7Ci0JCQkJaXAgPSBpcC0+aV9tbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkgPT0gMCkgewotCQkJCWlwID0gaXAtPmlfbW5leHQ7Ci0JCQl9IGVsc2UgaWYgKCh4ZnNfaXBpbmNvdW50KGlwKSA9PSAwKSAmJgotCQkJCSAgICB4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKLQkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKLQotCQkJCXhmc19maW5pc2hfcmVjbGFpbShpcCwgMSwKLQkJCQkJCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMpOwotCi0JCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKLQkJCQltb3VudF9sb2NrZWQgPSBCX1RSVUU7Ci0JCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7Ci0JCQl9IGVsc2UgewotCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQkJaXAgPSBpcC0+aV9tbmV4dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKFZOX0JBRCh2cCkpIHsKLQkJCWlwID0gaXAtPmlfbW5leHQ7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSAmJiAhKGZsYWdzICYgU1lOQ19DTE9TRSkpIHsKLQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKLQkJCWttZW1fZnJlZShpcG9pbnRlcik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qCi0JCSAqIFRyeSB0byBsb2NrIHdpdGhvdXQgc2xlZXBpbmcuICBXZSdyZSBvdXQgb2Ygb3JkZXIgd2l0aAotCQkgKiB0aGUgaW5vZGUgbGlzdCBsb2NrIGhlcmUsIHNvIGlmIHdlIGZhaWwgd2UgbmVlZCB0byBkcm9wCi0JCSAqIHRoZSBtb3VudCBsb2NrIGFuZCB0cnkgYWdhaW4uICBJZiB3ZSdyZSBjYWxsZWQgZnJvbQotCQkgKiBiZGZsdXNoKCkgaGVyZSwgdGhlbiBkb24ndCBib3RoZXIuCi0JCSAqCi0JCSAqIFRoZSBpbm9kZSBsb2NrIGhlcmUgYWN0dWFsbHkgY29vcmRpbmF0ZXMgd2l0aCB0aGUKLQkJICogYWxtb3N0IHNwdXJpb3VzIGlub2RlIGxvY2sgaW4geGZzX2lyZWNsYWltKCkgdG8gcHJldmVudAotCQkgKiB0aGUgdm5vZGUgd2UgaGFuZGxlIGhlcmUgd2l0aG91dCBhIHJlZmVyZW5jZSBmcm9tCi0JCSAqIGJlaW5nIGZyZWVkIHdoaWxlIHdlIHJlZmVyZW5jZSBpdC4gIElmIHdlIGxvY2sgdGhlIGlub2RlCi0JCSAqIHdoaWxlIGl0J3Mgb24gdGhlIG1vdW50IGxpc3QgaGVyZSwgdGhlbiB0aGUgc3B1cmlvdXMgaW5vZGUKLQkJICogbG9jayBpbiB4ZnNfaXJlY2xhaW0oKSBhZnRlciB0aGUgaW5vZGUgaXMgcHVsbGVkIGZyb20KLQkJICogdGhlIG1vdW50IGxpc3Qgd2lsbCBzbGVlcCB1bnRpbCB3ZSByZWxlYXNlIGl0IGhlcmUuCi0JCSAqIFRoaXMga2VlcHMgdGhlIHZub2RlIGZyb20gYmVpbmcgZnJlZWQgd2hpbGUgd2UgcmVmZXJlbmNlCi0JCSAqIGl0LgotCQkgKi8KLQkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIGxvY2tfZmxhZ3MpID09IDApIHsKLQkJCWlmICh2cCA9PSBOVUxMKSB7Ci0JCQkJaXAgPSBpcC0+aV9tbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdnAgPSB2bl9ncmFiKHZwKTsKLQkJCWlmICh2cCA9PSBOVUxMKSB7Ci0JCQkJaXAgPSBpcC0+aV9tbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7Ci0JCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCi0JCQlBU1NFUlQodnAgPT0gVkZTX0koaXApKTsKLQkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7Ci0KLQkJCXZub2RlX3JlZmVkID0gQl9UUlVFOwotCQl9Ci0KLQkJLyogRnJvbSBoZXJlIG9uIGluIHRoZSBsb29wIHdlIG1heSBoYXZlIGEgbWFya2VyIHJlY29yZAotCQkgKiBpbiB0aGUgaW5vZGUgbGlzdC4KLQkJICovCi0KLQkJLyoKLQkJICogSWYgd2UgaGF2ZSB0byBmbHVzaCBkYXRhIG9yIHdhaXQgZm9yIEkvTyBjb21wbGV0aW9uCi0JCSAqIHdlIG5lZWQgdG8gZHJvcCB0aGUgaWxvY2sgdGhhdCB3ZSBjdXJyZW50bHkgaG9sZC4KLQkJICogSWYgd2UgbmVlZCB0byBkcm9wIHRoZSBsb2NrLCBpbnNlcnQgYSBtYXJrZXIgaWYgd2UKLQkJICogaGF2ZSBub3QgYWxyZWFkeSBkb25lIHNvLgotCQkgKi8KLQkJaWYgKChmbGFncyAmIChTWU5DX0NMT1NFfFNZTkNfSU9XQUlUKSkgfHwKLQkJICAgICgoZmxhZ3MgJiBTWU5DX0RFTFdSSSkgJiYgVk5fRElSVFkodnApKSkgewotCQkJaWYgKG1vdW50X2xvY2tlZCkgewotCQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOwotCQkJfQotCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCi0JCQlpZiAoZmxhZ3MgJiBTWU5DX0NMT1NFKSB7Ci0JCQkJLyogU2h1dGRvd24gY2FzZS4gRmx1c2ggYW5kIGludmFsaWRhdGUuICovCi0JCQkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQotCQkJCQl4ZnNfdG9zc3BhZ2VzKGlwLCAwLCAtMSwKLQkJCQkJCQkgICAgIEZJX1JFTUFQRik7Ci0JCQkJZWxzZQotCQkJCQllcnJvciA9IHhmc19mbHVzaGludmFsX3BhZ2VzKGlwLAotCQkJCQkJCTAsIC0xLCBGSV9SRU1BUEYpOwotCQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBTWU5DX0RFTFdSSSkgJiYgVk5fRElSVFkodnApKSB7Ci0JCQkJZXJyb3IgPSB4ZnNfZmx1c2hfcGFnZXMoaXAsIDAsCi0JCQkJCQkJLTEsIGZmbGFnLCBGSV9OT05FKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFdoZW4gZnJlZXppbmcsIHdlIG5lZWQgdG8gd2FpdCBlbnN1cmUgYWxsIEkvTyAoaW5jbHVkaW5nIGRpcmVjdAotCQkJICogSS9PKSBpcyBjb21wbGV0ZSB0byBlbnN1cmUgbm8gZnVydGhlciBkYXRhIG1vZGlmaWNhdGlvbiBjYW4gdGFrZQotCQkJICogcGxhY2UgYWZ0ZXIgdGhpcyBwb2ludAotCQkJICovCi0JCQlpZiAoZmxhZ3MgJiBTWU5DX0lPV0FJVCkKLQkJCQl2bl9pb3dhaXQoaXApOwotCi0JCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCQl9Ci0KLQkJaWYgKChmbGFncyAmIFNZTkNfQVRUUikgJiYKLQkJICAgIChpcC0+aV91cGRhdGVfY29yZSB8fAotCQkgICAgIChpcC0+aV9pdGVtcCAmJiBpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzKSkpIHsKLQkJCWlmIChtb3VudF9sb2NrZWQpCi0JCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7Ci0KLQkJCWlmIChmbGFncyAmIFNZTkNfV0FJVCkgewotCQkJCXhmc19pZmxvY2soaXApOwotCQkJCWVycm9yID0geGZzX2lmbHVzaChpcCwgWEZTX0lGTFVTSF9TWU5DKTsKLQotCQkJLyoKLQkJCSAqIElmIHdlIGNhbid0IGFjcXVpcmUgdGhlIGZsdXNoIGxvY2ssIHRoZW4gdGhlIGlub2RlCi0JCQkgKiBpcyBhbHJlYWR5IGJlaW5nIGZsdXNoZWQgc28gZG9uJ3QgYm90aGVyIHdhaXRpbmcuCi0JCQkgKgotCQkJICogSWYgd2UgY2FuIGxvY2sgaXQgdGhlbiBkbyBhIGRlbHdyaSBmbHVzaCBzbyB3ZSBjYW4KLQkJCSAqIGNvbWJpbmUgbXVsdGlwbGUgaW5vZGUgZmx1c2hlcyBpbiBlYWNoIGRpc2sgd3JpdGUuCi0JCQkgKi8KLQkJCX0gZWxzZSBpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7Ci0JCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLCBYRlNfSUZMVVNIX0RFTFdSSSk7Ci0JCQl9IGVsc2UgaWYgKGJ5cGFzc2VkKSB7Ci0JCQkJKCpieXBhc3NlZCkrKzsKLQkJCX0KLQkJfQotCi0JCWlmIChsb2NrX2ZsYWdzICE9IDApIHsKLQkJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQkJfQotCi0JCWlmICh2bm9kZV9yZWZlZCkgewotCQkJLyoKLQkJCSAqIElmIHdlIGhhZCB0byB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSB2bm9kZQotCQkJICogYWJvdmUsIHRoZW4gd2FpdCB1bnRpbCBhZnRlciB3ZSd2ZSB1bmxvY2tlZAotCQkJICogdGhlIGlub2RlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZS4gIFRoaXMgaXMKLQkJCSAqIGJlY2F1c2Ugd2UgY2FuIGJlIGFscmVhZHkgaG9sZGluZyB0aGUgaW5vZGUKLQkJCSAqIGxvY2sgd2hlbiBJUkVMRSgpIGNhbGxzIHhmc19pbmFjdGl2ZSgpLgotCQkJICoKLQkJCSAqIE1ha2Ugc3VyZSB0byBkcm9wIHRoZSBtb3VudCBsb2NrIGJlZm9yZSBjYWxsaW5nCi0JCQkgKiBJUkVMRSgpIHNvIHRoYXQgd2UgZG9uJ3QgdHJpcCBvdmVyIG91cnNlbHZlcyBpZgotCQkJICogd2UgaGF2ZSB0byBnbyBmb3IgdGhlIG1vdW50IGxvY2sgYWdhaW4gaW4gdGhlCi0JCQkgKiBpbmFjdGl2ZSBjb2RlLgotCQkJICovCi0JCQlpZiAobW91bnRfbG9ja2VkKSB7Ci0JCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7Ci0JCQl9Ci0KLQkJCUlSRUxFKGlwKTsKLQotCQkJdm5vZGVfcmVmZWQgPSBCX0ZBTFNFOwotCQl9Ci0KLQkJaWYgKGVycm9yKSB7Ci0JCQlsYXN0X2Vycm9yID0gZXJyb3I7Ci0JCX0KLQotCQkvKgotCQkgKiBiYWlsIG91dCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBjb3JydXB0ZWQuCi0JCSAqLwotCQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKSAgewotCQkJaWYgKCFtb3VudF9sb2NrZWQpIHsKLQkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOwotCQkJfQotCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOwotCQkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOwotCQkJa21lbV9mcmVlKGlwb2ludGVyKTsKLQkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwotCQl9Ci0KLQkJLyogTGV0IG90aGVyIHRocmVhZHMgaGF2ZSBhIGNoYW5jZSBhdCB0aGUgbW91bnQgbG9jawotCQkgKiBpZiB3ZSBoYXZlIGxvb3BlZCBtYW55IHRpbWVzIHdpdGhvdXQgZHJvcHBpbmcgdGhlCi0JCSAqIGxvY2suCi0JCSAqLwotCQlpZiAoKCsrcHJlZW1wdCAmIFhGU19QUkVFTVBUX01BU0spID09IDApIHsKLQkJCWlmIChtb3VudF9sb2NrZWQpIHsKLQkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb3VudF9sb2NrZWQgPT0gQl9GQUxTRSkgewotCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKLQkJCW1vdW50X2xvY2tlZCA9IEJfVFJVRTsKLQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7Ci0JCWlwID0gaXAtPmlfbW5leHQ7Ci0KLQl9IHdoaWxlIChpcCAhPSBtcC0+bV9pbm9kZXMpOwotCi0JWEZTX01PVU5UX0lVTkxPQ0sobXApOwotCi0JQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOwotCi0Ja21lbV9mcmVlKGlwb2ludGVyKTsKLQlyZXR1cm4gWEZTX0VSUk9SKGxhc3RfZXJyb3IpOwotfQotCi0vKgotICogeGZzIHN5bmMgcm91dGluZSBmb3IgaW50ZXJuYWwgdXNlCi0gKgotICogVGhpcyByb3V0aW5lIHN1cHBvcnRzIGFsbCBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBmb3IgdGhlIGdlbmVyaWMgdmZzX3N5bmMKLSAqIGludGVyZmFjZSBhcyBleHBsYWluZWQgYWJvdmUgdW5kZXIgeGZzX3N5bmMuCi0gKgotICovCi1pbnQKLXhmc19zeW5jc3ViKAotCXhmc19tb3VudF90CSptcCwKLQlpbnQJCWZsYWdzLAotCWludCAgICAgICAgICAgICAqYnlwYXNzZWQpCi17Ci0JaW50CQllcnJvciA9IDA7Ci0JaW50CQlsYXN0X2Vycm9yID0gMDsKLQl1aW50CQlsb2dfZmxhZ3MgPSBYRlNfTE9HX0ZPUkNFOwotCXhmc19idWZfdAkqYnA7Ci0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7Ci0KLQkvKgotCSAqIFN5bmMgb3V0IHRoZSBsb2cuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbG9nIGlzIHBlcmlvZGljYWxseQotCSAqIGZsdXNoZWQgZXZlbiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGFjdGl2aXR5IHRvIGZpbGwgaXQgdXAuCi0JICovCi0JaWYgKGZsYWdzICYgU1lOQ19XQUlUKQotCQlsb2dfZmxhZ3MgfD0gWEZTX0xPR19TWU5DOwotCi0JeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBsb2dfZmxhZ3MpOwotCi0JaWYgKGZsYWdzICYgKFNZTkNfQVRUUnxTWU5DX0RFTFdSSSkpIHsKLQkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKQotCQkJeGZzX2ZpbmlzaF9yZWNsYWltX2FsbChtcCwgMSk7Ci0JCWVsc2UKLQkJCWVycm9yID0geGZzX3N5bmNfaW5vZGVzKG1wLCBmbGFncywgYnlwYXNzZWQpOwotCX0KLQotCS8qCi0JICogRmx1c2hpbmcgb3V0IGRpcnR5IGRhdGEgYWJvdmUgcHJvYmFibHkgZ2VuZXJhdGVkIG1vcmUKLQkgKiBsb2cgYWN0aXZpdHksIHNvIGlmIHRoaXMgaXNuJ3QgdmZzX3N5bmMoKSB0aGVuIGZsdXNoCi0JICogdGhlIGxvZyBhZ2Fpbi4KLQkgKi8KLQlpZiAoZmxhZ3MgJiBTWU5DX0RFTFdSSSkgewotCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIGxvZ19mbGFncyk7Ci0JfQotCi0JaWYgKGZsYWdzICYgU1lOQ19GU0RBVEEpIHsKLQkJLyoKLQkJICogSWYgdGhpcyBpcyB2ZnNfc3luYygpIHRoZW4gb25seSBzeW5jIHRoZSBzdXBlcmJsb2NrCi0JCSAqIGlmIHdlIGNhbiBsb2NrIGl0IHdpdGhvdXQgc2xlZXBpbmcgYW5kIGl0IGlzIG5vdCBwaW5uZWQuCi0JCSAqLwotCQlpZiAoZmxhZ3MgJiBTWU5DX0JERkxVU0gpIHsKLQkJCWJwID0geGZzX2dldHNiKG1wLCBYRlNfQlVGX1RSWUxPQ0spOwotCQkJaWYgKGJwICE9IE5VTEwpIHsKLQkJCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCx4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKLQkJCQlpZiAoKGJpcCAhPSBOVUxMKSAmJgotCQkJCSAgICB4ZnNfYnVmX2l0ZW1fZGlydHkoYmlwKSkgewotCQkJCQlpZiAoIShYRlNfQlVGX0lTUElOTkVEKGJwKSkpIHsKLQkJCQkJCVhGU19CVUZfQVNZTkMoYnApOwotCQkJCQkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXhmc19idWZfcmVsc2UoYnApOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJwID0geGZzX2dldHNiKG1wLCAwKTsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgYnVmZmVyIGlzIHBpbm5lZCB0aGVuIHB1c2ggb24gdGhlIGxvZyBzbwotCQkJICogd2Ugd29uJ3QgZ2V0IHN0dWNrIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGZvcgotCQkJICogc29tZW9uZSwgbWF5YmUgb3Vyc2VsdmVzLCB0byBmbHVzaCB0aGUgbG9nLgotCQkJICogRXZlbiB0aG91Z2ggd2UganVzdCBwdXNoZWQgdGhlIGxvZyBhYm92ZSwgd2UKLQkJCSAqIGRpZCBub3QgaGF2ZSB0aGUgc3VwZXJibG9jayBidWZmZXIgbG9ja2VkIGF0Ci0JCQkgKiB0aGF0IHBvaW50IHNvIGl0IGNhbiBiZWNvbWUgcGlubmVkIGluIGJldHdlZW4KLQkJCSAqIHRoZXJlIGFuZCBoZXJlLgotCQkJICovCi0JCQlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpCi0JCQkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFKTsKLQkJCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKLQkJCQlYRlNfQlVGX1VOQVNZTkMoYnApOwotCQkJZWxzZQotCQkJCVhGU19CVUZfQVNZTkMoYnApOwotCQkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7Ci0JCX0KLQkJaWYgKGVycm9yKSB7Ci0JCQlsYXN0X2Vycm9yID0gZXJyb3I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5vdyBjaGVjayB0byBzZWUgaWYgdGhlIGxvZyBuZWVkcyBhICJkdW1teSIgdHJhbnNhY3Rpb24uCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBTWU5DX1JFTU9VTlQpICYmIHhmc19sb2dfbmVlZF9jb3ZlcmVkKG1wKSkgewotCQl4ZnNfdHJhbnNfdCAqdHA7Ci0JCXhmc19pbm9kZV90ICppcDsKLQotCQkvKgotCQkgKiBQdXQgYSBkdW1teSB0cmFuc2FjdGlvbiBpbiB0aGUgbG9nIHRvIHRlbGwKLQkJICogcmVjb3ZlcnkgdGhhdCBhbGwgb3RoZXJzIGFyZSBPSy4KLQkJICovCi0JCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRFVNTVkxKTsKLQkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAotCQkJCVhGU19JQ0hBTkdFX0xPR19SRVMobXApLAotCQkJCTAsIDAsIDApKSkgIHsKLQkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0KLQkJaXAgPSBtcC0+bV9yb290aXA7Ci0JCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCi0JCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7Ci0JCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBsb2dfZmxhZ3MpOwotCX0KLQotCS8qCi0JICogV2hlbiBzaHV0dGluZyBkb3duLCB3ZSBuZWVkIHRvIGluc3VyZSB0aGF0IHRoZSBBSUwgaXMgcHVzaGVkCi0JICogdG8gZGlzayBvciB0aGUgZmlsZXN5c3RlbSBjYW4gYXBwZWFyIGNvcnJ1cHQgZnJvbSB0aGUgUFJPTS4KLQkgKi8KLQlpZiAoKGZsYWdzICYgKFNZTkNfQ0xPU0V8U1lOQ19XQUlUKSkgPT0gKFNZTkNfQ0xPU0V8U1lOQ19XQUlUKSkgewotCQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOwotCQlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApIHsKLQkJCVhGU19iZmx1c2gobXAtPm1fcnRkZXZfdGFyZ3ApOwotCQl9Ci0JfQotCi0JcmV0dXJuIFhGU19FUlJPUihsYXN0X2Vycm9yKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmggYi9mcy94ZnMveGZzX3Zmc29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzRiMDUwLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy94ZnNfdmZzb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jaWZuZGVmIF9YRlNfVkZTT1BTX0gKLSNkZWZpbmUgX1hGU19WRlNPUFNfSCAxCi0KLXN0cnVjdCBjcmVkOwotc3RydWN0IHhmc19maWQ7Ci1zdHJ1Y3QgaW5vZGU7Ci1zdHJ1Y3Qga3N0YXRmczsKLXN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX21vdW50X2FyZ3M7Ci0KLWludCB4ZnNfc3luYyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IGZsYWdzKTsKLXZvaWQgeGZzX2RvX2ZvcmNlX3NodXRkb3duKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgZmxhZ3MsIGNoYXIgKmZuYW1lLAotCQlpbnQgbG5udW0pOwotdm9pZCB4ZnNfYXR0cl9xdWllc2NlKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKLQotI2VuZGlmIC8qIF9YRlNfVkZTT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCA4YjY4MTJmLi5mMDdiZjg3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC01NCwzMyArNTQsMTAgQEAKICNpbmNsdWRlICJ4ZnNfdm5vZGVvcHMuaCIKIAogaW50Ci14ZnNfb3BlbigKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JaW50CQltb2RlOwotCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7Ci0KLQkvKgotCSAqIElmIGl0J3MgYSBkaXJlY3Rvcnkgd2l0aCBhbnkgYmxvY2tzLCByZWFkLWFoZWFkIGJsb2NrIDAKLQkgKiBhcyB3ZSdyZSBhbG1vc3QgY2VydGFpbiB0byBoYXZlIHRoZSBuZXh0IG9wZXJhdGlvbiBiZSBhIHJlYWQgdGhlcmUuCi0JICovCi0JaWYgKFNfSVNESVIoaXAtPmlfZC5kaV9tb2RlKSAmJiBpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgewotCQltb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwotCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApCi0JCQkodm9pZCl4ZnNfZGFfcmVhZGFfYnVmKE5VTEwsIGlwLCAwLCBYRlNfREFUQV9GT1JLKTsKLQkJeGZzX2l1bmxvY2soaXAsIG1vZGUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50CiB4ZnNfc2V0YXR0cigKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAlzdHJ1Y3QgaWF0dHIJCSppYXR0ciwKLQlpbnQJCQlmbGFncywKLQljcmVkX3QJCQkqY3JlZHApCisJaW50CQkJZmxhZ3MpCiB7CiAJeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OwogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gVkZTX0koaXApOwpAQCAtOTMsNyArNzAsNiBAQAogCWdpZF90CQkJZ2lkPTAsIGlnaWQ9MDsKIAlpbnQJCQl0aW1lZmxhZ3MgPSAwOwogCXN0cnVjdCB4ZnNfZHF1b3QJKnVkcXAsICpnZHFwLCAqb2xkZHF1b3QxLCAqb2xkZHF1b3QyOwotCWludAkJCWZpbGVfb3duZXI7CiAJaW50CQkJbmVlZF9pb2xvY2sgPSAxOwogCiAJeGZzX2l0cmFjZV9lbnRyeShpcCk7CkBAIC0xMDQsNiArODAsMTAgQEAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAorCWNvZGUgPSAtaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKGNvZGUpCisJCXJldHVybiBjb2RlOworCiAJb2xkZHF1b3QxID0gb2xkZHF1b3QyID0gTlVMTDsKIAl1ZHFwID0gZ2RxcCA9IE5VTEw7CiAKQEAgLTE4MSw2MiArMTYxLDggQEAKIAogCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CiAKLQkvKiBib29sZWFuOiBhcmUgd2UgdGhlIGZpbGUgb3duZXI/ICovCi0JZmlsZV9vd25lciA9IChjdXJyZW50X2ZzdWlkKCkgPT0gaXAtPmlfZC5kaV91aWQpOwotCi0JLyoKLQkgKiBDaGFuZ2UgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIGEgZmlsZS4KLQkgKiBPbmx5IHRoZSBvd25lciBvciB1c2VycyB3aXRoIENBUF9GT1dORVIKLQkgKiBjYXBhYmlsaXR5IG1heSBkbyB0aGVzZSB0aGluZ3MuCi0JICovCi0JaWYgKG1hc2sgJiAoQVRUUl9NT0RFfEFUVFJfVUlEfEFUVFJfR0lEKSkgewotCQkvKgotCQkgKiBDQVBfRk9XTkVSIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQkJICoKLQkJICogVGhlIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyBtdXN0IGJlIGVxdWFsCi0JCSAqIHRvIHRoZSBmaWxlIG93bmVyIElELCBleGNlcHQgaW4gY2FzZXMgd2hlcmUgdGhlCi0JCSAqIENBUF9GU0VUSUQgY2FwYWJpbGl0eSBpcyBhcHBsaWNhYmxlLgotCQkgKi8KLQkJaWYgKCFmaWxlX293bmVyICYmICFjYXBhYmxlKENBUF9GT1dORVIpKSB7Ci0JCQljb2RlID0gWEZTX0VSUk9SKEVQRVJNKTsKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkJLyoKLQkJICogQ0FQX0ZTRVRJRCBvdmVycmlkZXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0JCSAqCi0JCSAqIFRoZSBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHNoYWxsIG1hdGNoCi0JCSAqIHRoZSBmaWxlIG93bmVyIHdoZW4gc2V0dGluZyB0aGUgc2V0LXVzZXItSUQgYW5kCi0JCSAqIHNldC1ncm91cC1JRCBiaXRzIG9uIHRoYXQgZmlsZS4KLQkJICoKLQkJICogVGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvciBvbmUgb2YgdGhlIHN1cHBsZW1lbnRhcnkgZ3JvdXAKLQkJICogSURzIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2hhbGwgbWF0Y2ggdGhlIGdyb3VwIG93bmVyIG9mCi0JCSAqIHRoZSBmaWxlIHdoZW4gc2V0dGluZyB0aGUgc2V0LWdyb3VwLUlEIGJpdCBvbiB0aGF0IGZpbGUKLQkJICovCi0JCWlmIChtYXNrICYgQVRUUl9NT0RFKSB7Ci0JCQltb2RlX3QgbSA9IDA7Ci0KLQkJCWlmICgoaWF0dHItPmlhX21vZGUgJiBTX0lTVUlEKSAmJiAhZmlsZV9vd25lcikKLQkJCQltIHw9IFNfSVNVSUQ7Ci0JCQlpZiAoKGlhdHRyLT5pYV9tb2RlICYgU19JU0dJRCkgJiYKLQkJCSAgICAhaW5fZ3JvdXBfcCgoZ2lkX3QpaXAtPmlfZC5kaV9naWQpKQotCQkJCW0gfD0gU19JU0dJRDsKLSNpZiAwCi0JCQkvKiBMaW51eCBhbGxvd3MgdGhpcywgSXJpeCBkb2Vzbid0LiAqLwotCQkJaWYgKChpYXR0ci0+aWFfbW9kZSAmIFNfSVNWVFgpICYmICFTX0lTRElSKGlwLT5pX2QuZGlfbW9kZSkpCi0JCQkJbSB8PSBTX0lTVlRYOwotI2VuZGlmCi0JCQlpZiAobSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKLQkJCQlpYXR0ci0+aWFfbW9kZSAmPSB+bTsKLQkJfQotCX0KLQogCS8qCiAJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KLQkgKiBJZiB0aGUgc3lzdGVtIHdhcyBjb25maWd1cmVkIHdpdGggdGhlICJyZXN0cmljdGVkX2Nob3duIgotCSAqIG9wdGlvbiwgdGhlIG93bmVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZ2l2ZSBhd2F5IHRoZSBmaWxlLAotCSAqIGFuZCBjYW4gY2hhbmdlIHRoZSBncm91cCBpZCBvbmx5IHRvIGEgZ3JvdXAgb2Ygd2hpY2ggaGUKLQkgKiBvciBzaGUgaXMgYSBtZW1iZXIuCiAJICovCiAJaWYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSB7CiAJCS8qCkBAIC0yNTEsMjMgKzE3Nyw2IEBACiAJCXVpZCA9IChtYXNrICYgQVRUUl9VSUQpID8gaWF0dHItPmlhX3VpZCA6IGl1aWQ7CiAKIAkJLyoKLQkJICogQ0FQX0NIT1dOIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQkJICoKLQkJICogSWYgX1BPU0lYX0NIT1dOX1JFU1RSSUNURUQgaXMgZGVmaW5lZCwgdGhpcyBjYXBhYmlsaXR5Ci0JCSAqIHNoYWxsIG92ZXJyaWRlIHRoZSByZXN0cmljdGlvbiB0aGF0IGEgcHJvY2VzcyBjYW5ub3QKLQkJICogY2hhbmdlIHRoZSB1c2VyIElEIG9mIGEgZmlsZSBpdCBvd25zIGFuZCB0aGUgcmVzdHJpY3Rpb24KLQkJICogdGhhdCB0aGUgZ3JvdXAgSUQgc3VwcGxpZWQgdG8gdGhlIGNob3duKCkgZnVuY3Rpb24KLQkJICogc2hhbGwgYmUgZXF1YWwgdG8gZWl0aGVyIHRoZSBncm91cCBJRCBvciBvbmUgb2YgdGhlCi0JCSAqIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCi0JCSAqLwotCQlpZiAocmVzdHJpY3RlZF9jaG93biAmJgotCQkgICAgKGl1aWQgIT0gdWlkIHx8IChpZ2lkICE9IGdpZCAmJgotCQkJCSAgICAgIWluX2dyb3VwX3AoKGdpZF90KWdpZCkpKSAmJgotCQkgICAgIWNhcGFibGUoQ0FQX0NIT1dOKSkgewotCQkJY29kZSA9IFhGU19FUlJPUihFUEVSTSk7Ci0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCQkvKgogCQkgKiBEbyBhIHF1b3RhIHJlc2VydmF0aW9uIG9ubHkgaWYgdWlkL2dpZCBpcyBhY3R1YWxseQogCQkgKiBnb2luZyB0byBjaGFuZ2UuCiAJCSAqLwpAQCAtMzA0LDM2ICsyMTMsMjIgQEAKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQl9CisKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgYXR0YWNoZWQgdG8gdGhlIGlub2RlLgogCQkgKi8KLQkJaWYgKChjb2RlID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgWEZTX1FNT1BUX0lMT0NLRUQpKSkKKwkJY29kZSA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIFhGU19RTU9QVF9JTE9DS0VEKTsKKwkJaWYgKGNvZGUpCiAJCQlnb3RvIGVycm9yX3JldHVybjsKLQl9CiAKLQkvKgotCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBvciBtb2RpZmllZCB0aW1lcy4KLQkgKi8KLQlpZiAobWFzayAmIChBVFRSX0FUSU1FfEFUVFJfTVRJTUUpKSB7Ci0JCWlmICghZmlsZV9vd25lcikgewotCQkJaWYgKChtYXNrICYgKEFUVFJfTVRJTUVfU0VUfEFUVFJfQVRJTUVfU0VUKSkgJiYKLQkJCSAgICAhY2FwYWJsZShDQVBfRk9XTkVSKSkgewotCQkJCWNvZGUgPSBYRlNfRVJST1IoRVBFUk0pOwotCQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBOb3cgd2UgY2FuIG1ha2UgdGhlIGNoYW5nZXMuICBCZWZvcmUgd2Ugam9pbiB0aGUgaW5vZGUKLQkgKiB0byB0aGUgdHJhbnNhY3Rpb24sIGlmIEFUVFJfU0laRSBpcyBzZXQgdGhlbiB0YWtlIGNhcmUgb2YKLQkgKiB0aGUgcGFydCBvZiB0aGUgdHJ1bmNhdGlvbiB0aGF0IG11c3QgYmUgZG9uZSB3aXRob3V0IHRoZQotCSAqIGlub2RlIGxvY2suICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGpvaW5pbmcgdGhlIGlub2RlCi0JICogdG8gdGhlIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHRoZSBpbm9kZSBjYW5ub3QgYmUgdW5sb2NrZWQKLQkgKiBvbmNlIGl0IGlzIGEgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCi0JICovCi0JaWYgKG1hc2sgJiBBVFRSX1NJWkUpIHsKLQkJY29kZSA9IDA7CisJCS8qCisJCSAqIE5vdyB3ZSBjYW4gbWFrZSB0aGUgY2hhbmdlcy4gIEJlZm9yZSB3ZSBqb2luIHRoZSBpbm9kZQorCQkgKiB0byB0aGUgdHJhbnNhY3Rpb24sIGlmIEFUVFJfU0laRSBpcyBzZXQgdGhlbiB0YWtlIGNhcmUgb2YKKwkJICogdGhlIHBhcnQgb2YgdGhlIHRydW5jYXRpb24gdGhhdCBtdXN0IGJlIGRvbmUgd2l0aG91dCB0aGUKKwkJICogaW5vZGUgbG9jay4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgam9pbmluZyB0aGUgaW5vZGUKKwkJICogdG8gdGhlIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHRoZSBpbm9kZSBjYW5ub3QgYmUgdW5sb2NrZWQKKwkJICogb25jZSBpdCBpcyBhIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorCQkgKi8KIAkJaWYgKGlhdHRyLT5pYV9zaXplID4gaXAtPmlfc2l6ZSkgewogCQkJLyoKIAkJCSAqIERvIHRoZSBmaXJzdCBwYXJ0IG9mIGdyb3dpbmcgYSBmaWxlOiB6ZXJvIGFueSBkYXRhCkBAIC0zNjYsNyArMjYxLDcgQEAKIAkJfQogCiAJCS8qIHdhaXQgZm9yIGFsbCBJL08gdG8gY29tcGxldGUgKi8KLQkJdm5faW93YWl0KGlwKTsKKwkJeGZzX2lvZW5kX3dhaXQoaXApOwogCiAJCWlmICghY29kZSkKIAkJCWNvZGUgPSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIGlhdHRyLT5pYV9zaXplKTsKQEAgLTM4OCwxNyArMjgzLDEwIEBACiAJCX0KIAkJY29tbWl0X2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JfQogCi0JaWYgKHRwKSB7CiAJCXhmc190cmFuc19pam9pbih0cCwgaXAsIGxvY2tfZmxhZ3MpOwogCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKLQl9CiAKLQkvKgotCSAqIFRydW5jYXRlIGZpbGUuICBNdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBhbmQgbm90IGJlIGEgZGlyZWN0b3J5LgotCSAqLwotCWlmIChtYXNrICYgQVRUUl9TSVpFKSB7CiAJCS8qCiAJCSAqIE9ubHkgY2hhbmdlIHRoZSBjL210aW1lIGlmIHdlIGFyZSBjaGFuZ2luZyB0aGUgc2l6ZQogCQkgKiBvciB3ZSBhcmUgZXhwbGljaXRseSBhc2tlZCB0byBjaGFuZ2UgaXQuIFRoaXMgaGFuZGxlcwpAQCAtNDM4LDI4ICszMjYsMTMgQEAKIAkJCSAqLwogCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JVFJVTkNBVEVEKTsKIAkJfQotCX0KLQotCS8qCi0JICogQ2hhbmdlIGZpbGUgYWNjZXNzIG1vZGVzLgotCSAqLwotCWlmIChtYXNrICYgQVRUUl9NT0RFKSB7Ci0JCWlwLT5pX2QuZGlfbW9kZSAmPSBTX0lGTVQ7Ci0JCWlwLT5pX2QuZGlfbW9kZSB8PSBpYXR0ci0+aWFfbW9kZSAmIH5TX0lGTVQ7Ci0KLQkJaW5vZGUtPmlfbW9kZSAmPSBTX0lGTVQ7Ci0JCWlub2RlLT5pX21vZGUgfD0gaWF0dHItPmlhX21vZGUgJiB+U19JRk1UOwotCi0JCXhmc190cmFuc19sb2dfaW5vZGUgKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7Ci0JCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOworCX0gZWxzZSBpZiAodHApIHsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgbG9ja19mbGFncyk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOwogCX0KIAogCS8qCiAJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KLQkgKiBJZiB0aGUgc3lzdGVtIHdhcyBjb25maWd1cmVkIHdpdGggdGhlICJyZXN0cmljdGVkX2Nob3duIgotCSAqIG9wdGlvbiwgdGhlIG93bmVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZ2l2ZSBhd2F5IHRoZSBmaWxlLAotCSAqIGFuZCBjYW4gY2hhbmdlIHRoZSBncm91cCBpZCBvbmx5IHRvIGEgZ3JvdXAgb2Ygd2hpY2ggaGUKLQkgKiBvciBzaGUgaXMgYSBtZW1iZXIuCiAJICovCiAJaWYgKG1hc2sgJiAoQVRUUl9VSUR8QVRUUl9HSUQpKSB7CiAJCS8qCkBAIC01MDMsNiArMzc2LDI0IEBACiAJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOwogCX0KIAorCS8qCisJICogQ2hhbmdlIGZpbGUgYWNjZXNzIG1vZGVzLgorCSAqLworCWlmIChtYXNrICYgQVRUUl9NT0RFKSB7CisJCXVtb2RlX3QgbW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCisJCWlmICghaW5fZ3JvdXBfcChpbm9kZS0+aV9naWQpICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKQorCQkJbW9kZSAmPSB+U19JU0dJRDsKKworCQlpcC0+aV9kLmRpX21vZGUgJj0gU19JRk1UOworCQlpcC0+aV9kLmRpX21vZGUgfD0gbW9kZSAmIH5TX0lGTVQ7CisKKwkJaW5vZGUtPmlfbW9kZSAmPSBTX0lGTVQ7CisJCWlub2RlLT5pX21vZGUgfD0gbW9kZSAmIH5TX0lGTVQ7CisKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCQl0aW1lZmxhZ3MgfD0gWEZTX0lDSEdUSU1FX0NIRzsKKwl9CiAKIAkvKgogCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBvciBtb2RpZmllZCB0aW1lcy4KQEAgLTcxMyw3ICs2MDQsNyBAQAogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAKIAkvKiBjYXB0dXJlIHNpemUgdXBkYXRlcyBpbiBJL08gY29tcGxldGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgaW5vZGUuICovCi0JZXJyb3IgPSBmaWxlbWFwX2ZkYXRhd2FpdChWRlNfSShpcCktPmlfbWFwcGluZyk7CisJZXJyb3IgPSB4ZnNfd2FpdF9vbl9wYWdlcyhpcCwgMCwgLTEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CiAKQEAgLTEwMjksNiArOTIwLDEyIEBACiAJCWdvdG8gZXJyb3IwOwogCX0KIAkvKgorCSAqIHRyYW5zYWN0aW9uIGNvbW1pdCB3b3JrZWQgb2sgc28gd2UgY2FuIGRyb3AgdGhlIGV4dHJhIHRpY2tldAorCSAqIHJlZmVyZW5jZSB0aGF0IHdlIGdhaW5lZCBpbiB4ZnNfdHJhbnNfZHVwKCkKKwkgKi8KKwl4ZnNfbG9nX3RpY2tldF9wdXQodHAtPnRfdGlja2V0KTsKKworCS8qCiAJICogUmVtb3ZlIHRoZSBtZW1vcnkgZm9yIGV4dGVudCBkZXNjcmlwdGlvbnMgKGp1c3QgYm9va2tlZXBpbmcpLgogCSAqLwogCWlmIChpcC0+aV9kZi5pZl9ieXRlcykKQEAgLTE2MjUsOCArMTUyMiw2IEBACiAJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CiAJfQogCi0JZHAtPmlfZ2VuKys7Ci0KIAkvKgogCSAqIEF0dGFjaCB0aGUgZHF1b3QocykgdG8gdGhlIGlub2RlcyBhbmQgbW9kaWZ5IHRoZW0gaW5jb3JlLgogCSAqIFRoZXNlIGlkcyBvZiB0aGUgaW5vZGUgY291bGRuJ3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBuZXcKQEAgLTE5OTMsMTMgKzE4ODgsNiBAQAogCX0KIAl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKIAotCS8qCi0JICogQnVtcCB0aGUgaW4gbWVtb3J5IGdlbmVyYXRpb24gY291bnQgb24gdGhlIHBhcmVudAotCSAqIGRpcmVjdG9yeSBzbyB0aGF0IG90aGVyIGNhbiBrbm93IHRoYXQgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0JZHAtPmlfZ2VuKys7Ci0JeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOwotCiAJaWYgKGlzX2RpcikgewogCQkvKgogCQkgKiBEcm9wIHRoZSBsaW5rIGZyb20gaXAncyAiLi4iLgpAQCAtMjAwOSw3ICsxODk3LDcgQEAKIAkJCWdvdG8gb3V0X2JtYXBfY2FuY2VsOwogCiAJCS8qCi0JCSAqIERyb3AgdGhlIGxpbmsgZnJvbSBkcCB0byBpcC4KKwkJICogRHJvcCB0aGUgIi4iIGxpbmsgZnJvbSBpcCB0byBzZWxmLgogCQkgKi8KIAkJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIGlwKTsKIAkJaWYgKGVycm9yKQpAQCAtMjAxNywxNCArMTkwNSwxNCBAQAogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFdoZW4gcmVtb3ZpbmcgYSBub24tZGlyZWN0b3J5IHdlIG5lZWQgdG8gbG9nIHRoZSBwYXJlbnQKLQkJICogaW5vZGUgaGVyZSBmb3IgdGhlIGlfZ2VuIHVwZGF0ZS4gIEZvciBhIGRpcmVjdG9yeSB0aGlzIGlzCi0JCSAqIGRvbmUgaW1wbGljaXRseSBieSB0aGUgeGZzX2Ryb3BsaW5rIGNhbGwgZm9yIHRoZSAiLi4iIGVudHJ5LgorCQkgKiBpbm9kZSBoZXJlLiAgRm9yIGEgZGlyZWN0b3J5IHRoaXMgaXMgZG9uZSBpbXBsaWNpdGx5CisJCSAqIGJ5IHRoZSB4ZnNfZHJvcGxpbmsgY2FsbCBmb3IgdGhlICIuLiIgZW50cnkuCiAJCSAqLwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CiAJfQogCiAJLyoKLQkgKiBEcm9wIHRoZSAiLiIgbGluayBmcm9tIGlwIHRvIHNlbGYuCisJICogRHJvcCB0aGUgbGluayBmcm9tIGRwIHRvIGlwLgogCSAqLwogCWVycm9yID0geGZzX2Ryb3BsaW5rKHRwLCBpcCk7CiAJaWYgKGVycm9yKQpAQCAtMjE3OCw3ICsyMDY2LDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gYWJvcnRfcmV0dXJuOwogCXhmc19pY2hndGltZSh0ZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKLQl0ZHAtPmlfZ2VuKys7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdGRwLCBYRlNfSUxPR19DT1JFKTsKIAogCWVycm9yID0geGZzX2J1bXBsaW5rKHRwLCBzaXApOwpAQCAtMjM1NSwxOCArMjI0MiwxMCBAQAogCX0KIAl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKIAotCS8qCi0JICogQnVtcCB0aGUgaW4gbWVtb3J5IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0JICogc28gdGhhdCBvdGhlciBwcm9jZXNzZXMgYWNjZXNzaW5nIGl0IHdpbGwgcmVjb2duaXplIHRoYXQKLQkgKiB0aGUgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkLgotCSAqLwotCWRwLT5pX2dlbisrOwotCiAJZXJyb3IgPSB4ZnNfZGlyX2luaXQodHAsIGNkcCwgZHApOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjI7CiAKLQljZHAtPmlfZ2VuID0gMTsKIAllcnJvciA9IHhmc19idW1wbGluayh0cCwgZHApOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjI7CkBAIC0yNjUzLDEzICsyNTMyLDYgQEAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CiAKIAkvKgotCSAqIEJ1bXAgdGhlIGluIG1lbW9yeSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeQotCSAqIHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGFjY2Vzc2luZyBpdCB3aWxsIHJlY29nbml6ZSB0aGF0Ci0JICogdGhlIGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlkcC0+aV9nZW4rKzsKLQotCS8qCiAJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKIAkgKiBzeW1saW5rIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvCiAJICogdGhlIHVzZXIuCkBAIC0yODA5LDcgKzI2ODEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQl2bl9pb3dhaXQoaXApOworCXhmc19pb2VuZF93YWl0KGlwKTsKIAogCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSB8fCBpcC0+aV9kZWxheWVkX2Jsa3MgPT0gMCk7CiAKQEAgLTI4MzMsMTIyICsyNzA1LDEwIEBACiAJaWYgKCFpcC0+aV91cGRhdGVfY29yZSAmJiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkpIHsKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCXhmc19pZmxvY2soaXApOwotCQlyZXR1cm4geGZzX2ZpbmlzaF9yZWNsYWltKGlwLCAxLCBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX1NZTkMpOwotCX0gZWxzZSB7Ci0JCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwotCi0JCS8qIFByb3RlY3Qgc3luYyBhbmQgdW5waW4gZnJvbSB1cyAqLwotCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlfX3hmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKTsKLQkJVkZTX0koaXApLT5pX3ByaXZhdGUgPSBOVUxMOwotCQlpcC0+aV92bm9kZSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmaXAtPmlfcmVjbGFpbSwgJm1wLT5tX2RlbF9pbm9kZXMpOwotCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKTsKKwkJcmV0dXJuIHhmc19yZWNsYWltX2lub2RlKGlwLCAxLCBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX1NZTkMpOwogCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci14ZnNfZmluaXNoX3JlY2xhaW0oCi0JeGZzX2lub2RlX3QJKmlwLAotCWludAkJbG9ja2VkLAotCWludAkJc3luY19tb2RlKQotewotCXhmc19wZXJhZ190CSpwYWcgPSB4ZnNfZ2V0X3BlcmFnKGlwLT5pX21vdW50LCBpcC0+aV9pbm8pOwotCXN0cnVjdCBpbm9kZQkqdnAgPSBWRlNfSShpcCk7Ci0KLQlpZiAodnAgJiYgVk5fQkFEKHZwKSkKLQkJZ290byByZWNsYWltOwotCi0JLyogVGhlIGhhc2ggbG9jayBoZXJlIHByb3RlY3RzIGEgdGhyZWFkIGluIHhmc19pZ2V0X2NvcmUgZnJvbQotCSAqIHJhY2luZyB3aXRoIHVzIG9uIGxpbmtpbmcgdGhlIGlub2RlIGJhY2sgd2l0aCBhIHZub2RlLgotCSAqIE9uY2Ugd2UgaGF2ZSB0aGUgWEZTX0lSRUNMQUlNIGZsYWcgc2V0IGl0IHdpbGwgbm90IHRvdWNoCi0JICogdXMuCi0JICovCi0Jd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JaWYgKF9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU0pIHx8Ci0JICAgICghX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpICYmIHZwID09IE5VTEwpKSB7Ci0JCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCXhmc19pZnVubG9jayhpcCk7Ci0JCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQlfX3hmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU0pOwotCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKLQl4ZnNfcHV0X3BlcmFnKGlwLT5pX21vdW50LCBwYWcpOwotCi0JLyoKLQkgKiBJZiB0aGUgaW5vZGUgaXMgc3RpbGwgZGlydHksIHRoZW4gZmx1c2ggaXQgb3V0LiAgSWYgdGhlIGlub2RlCi0JICogaXMgbm90IGluIHRoZSBBSUwsIHRoZW4gaXQgd2lsbCBiZSBPSyB0byBmbHVzaCBpdCBkZWx3cmkgYXMKLQkgKiBsb25nIGFzIHhmc19pZmx1c2goKSBkb2VzIG5vdCBrZWVwIGFueSByZWZlcmVuY2VzIHRvIHRoZSBpbm9kZS4KLQkgKiBXZSBsZWF2ZSB0aGF0IGRlY2lzaW9uIHVwIHRvIHhmc19pZmx1c2goKSBzaW5jZSBpdCBoYXMgdGhlCi0JICoga25vd2xlZGdlIG9mIHdoZXRoZXIgaXQncyBPSyB0byBzaW1wbHkgZG8gYSBkZWx3cmkgZmx1c2ggb2YKLQkgKiB0aGUgaW5vZGUgb3Igd2hldGhlciB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGlub2RlIGlzCi0JICogcHVsbGVkIGZyb20gdGhlIEFJTC4KLQkgKiBXZSBnZXQgdGhlIGZsdXNoIGxvY2sgcmVnYXJkbGVzcywgdGhvdWdoLCBqdXN0IHRvIG1ha2Ugc3VyZQotCSAqIHdlIGRvbid0IGZyZWUgaXQgd2hpbGUgaXQgaXMgYmVpbmcgZmx1c2hlZC4KLQkgKi8KLQlpZiAoIWxvY2tlZCkgewotCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2lmbG9jayhpcCk7Ci0JfQotCi0JLyoKLQkgKiBJbiB0aGUgY2FzZSBvZiBhIGZvcmNlZCBzaHV0ZG93biB3ZSByZWx5IG9uIHhmc19pZmx1c2goKSB0bwotCSAqIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBiZSB1bnBpbm5lZCBiZWZvcmUgcmV0dXJuaW5nIGFuIGVycm9yLgotCSAqLwotCWlmICh4ZnNfaWZsdXNoKGlwLCBzeW5jX21vZGUpID09IDApIHsKLQkJLyogc3luY2hyb25pemUgd2l0aCB4ZnNfaWZsdXNoX2RvbmUgKi8KLQkJeGZzX2lmbG9jayhpcCk7Ci0JCXhmc19pZnVubG9jayhpcCk7Ci0JfQotCi0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQotIHJlY2xhaW06Ci0JeGZzX2lyZWNsYWltKGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci14ZnNfZmluaXNoX3JlY2xhaW1fYWxsKHhmc19tb3VudF90ICptcCwgaW50IG5vYmxvY2spCi17Ci0JaW50CQlwdXJnZWQ7Ci0JeGZzX2lub2RlX3QJKmlwLCAqbjsKLQlpbnQJCWRvbmUgPSAwOwotCi0Jd2hpbGUgKCFkb25lKSB7Ci0JCXB1cmdlZCA9IDA7Ci0JCVhGU19NT1VOVF9JTE9DSyhtcCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcCwgbiwgJm1wLT5tX2RlbF9pbm9kZXMsIGlfcmVjbGFpbSkgewotCQkJaWYgKG5vYmxvY2spIHsKLQkJCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSB8fAotCQkJCSAgICAheGZzX2lmbG9ja19ub3dhaXQoaXApKSB7Ci0JCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKLQkJCWlmICh4ZnNfZmluaXNoX3JlY2xhaW0oaXAsIG5vYmxvY2ssCi0JCQkJCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMpKQotCQkJCWRlbGF5KDEpOwotCQkJcHVyZ2VkID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZG9uZSA9ICFwdXJnZWQ7Ci0JfQotCi0JWEZTX01PVU5UX0lVTkxPQ0sobXApOworCXhmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoaXApOwogCXJldHVybiAwOwogfQogCkBAIC0zMTk3LDYgKzI5NTcsOCBAQAogCWJwID0geGZzX2J1Zl9nZXRfbm9hZGRyKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKIAkJCQlYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApID8KIAkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3ApOworCWlmICghYnApCisJCXJldHVybiBYRlNfRVJST1IoRU5PTUVNKTsKIAogCWZvciAob2Zmc2V0ID0gc3RhcnRvZmY7IG9mZnNldCA8PSBlbmRvZmY7IG9mZnNldCA9IGxhc3RvZmZzZXQgKyAxKSB7CiAJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwpAQCAtMzMxMiw3ICszMDc0LDggQEAKIAkJbmVlZF9pb2xvY2sgPSAwOwogCWlmIChuZWVkX2lvbG9jaykgewogCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JCXZuX2lvd2FpdChpcCk7CS8qIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGFueSBwZW5kaW5nIERJT3MgKi8KKwkJLyogd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW55IHBlbmRpbmcgRElPcyAqLworCQl4ZnNfaW9lbmRfd2FpdChpcCk7CiAJfQogCiAJcm91bmRpbmcgPSBtYXhfdCh1aW50LCAxIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nLCBQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtMzQ3NCw3ICszMjM3LDYgQEAKIAlpbnQJCWNtZCwKIAl4ZnNfZmxvY2s2NF90CSpiZiwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAotCWNyZWRfdAkJKmNyZWRwLAogCWludAkJYXR0cl9mbGFncykKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKQEAgLTM1NjIsNyArMzMyNCw3IEBACiAJCWlhdHRyLmlhX3ZhbGlkID0gQVRUUl9TSVpFOwogCQlpYXR0ci5pYV9zaXplID0gc3RhcnRvZmZzZXQ7CiAKLQkJZXJyb3IgPSB4ZnNfc2V0YXR0cihpcCwgJmlhdHRyLCBhdHRyX2ZsYWdzLCBjcmVkcCk7CisJCWVycm9yID0geGZzX3NldGF0dHIoaXAsICZpYXR0ciwgYXR0cl9mbGFncyk7CiAKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5oIGIvZnMveGZzL3hmc192bm9kZW9wcy5oCmluZGV4IDdiMGMyYWIuLjc2ZGYzMjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaAorKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmgKQEAgLTE0LDkgKzE0LDcgQEAKIHN0cnVjdCB4ZnNfaW9tYXA7CiAKIAotaW50IHhmc19vcGVuKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKLWludCB4ZnNfc2V0YXR0cihzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGlhdHRyICp2YXAsIGludCBmbGFncywKLQkJY3JlZF90ICpjcmVkcCk7CitpbnQgeGZzX3NldGF0dHIoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqdmFwLCBpbnQgZmxhZ3MpOwogI2RlZmluZQlYRlNfQVRUUl9ETUkJCTB4MDEJLyogaW52b2NhdGlvbiBmcm9tIGEgRE1JIGZ1bmN0aW9uICovCiAjZGVmaW5lCVhGU19BVFRSX05PTkJMT0NLCTB4MDIJLyogcmV0dXJuIEVBR0FJTiBpZiBvcGVyYXRpb24gd291bGQgYmxvY2sgKi8KICNkZWZpbmUgWEZTX0FUVFJfTk9MT0NLCQkweDA0CS8qIERvbid0IGdyYWIgYW55IGNvbmZsaWN0aW5nIGxvY2tzICovCkBAIC00NCw4ICs0Miw3IEBACiBpbnQgeGZzX3NldF9kbWF0dHJzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB1X2ludCBldm1hc2ssIHVfaW50MTZfdCBzdGF0ZSk7CiBpbnQgeGZzX3JlY2xhaW0oc3RydWN0IHhmc19pbm9kZSAqaXApOwogaW50IHhmc19jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IGNtZCwKLQkJeGZzX2Zsb2NrNjRfdCAqYmYsIHhmc19vZmZfdCBvZmZzZXQsCi0JCWNyZWRfdCAqY3JlZHAsIGludAlhdHRyX2ZsYWdzKTsKKwkJeGZzX2Zsb2NrNjRfdCAqYmYsIHhmc19vZmZfdCBvZmZzZXQsIGludCBhdHRyX2ZsYWdzKTsKIGludCB4ZnNfcmVuYW1lKHN0cnVjdCB4ZnNfaW5vZGUgKnNyY19kcCwgc3RydWN0IHhmc19uYW1lICpzcmNfbmFtZSwKIAkJc3RydWN0IHhmc19pbm9kZSAqc3JjX2lwLCBzdHJ1Y3QgeGZzX2lub2RlICp0YXJnZXRfZHAsCiAJCXN0cnVjdCB4ZnNfbmFtZSAqdGFyZ2V0X25hbWUsIHN0cnVjdCB4ZnNfaW5vZGUgKnRhcmdldF9pcCk7CkBAIC01Niw4ICs1Myw2IEBACiBpbnQgeGZzX2F0dHJfcmVtb3ZlKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwogaW50IHhmc19hdHRyX2xpc3Qoc3RydWN0IHhmc19pbm9kZSAqZHAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUsCiAJCWludCBmbGFncywgc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuICpjdXJzb3IpOwotaW50IHhmc19pb2N0bChzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCWludCBpb2ZsYWdzLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKIHNzaXplX3QgeGZzX3JlYWQoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCBraW9jYiAqaW9jYiwKIAkJY29uc3Qgc3RydWN0IGlvdmVjICppb3ZwLCB1bnNpZ25lZCBpbnQgc2VncywKIAkJbG9mZl90ICpvZmZzZXQsIGludCBpb2ZsYWdzKTsKQEAgLTc4LDUgKzczLDYgQEAKIAkJeGZzX29mZl90IGxhc3QsIGludCBmaW9wdCk7CiBpbnQgeGZzX2ZsdXNoX3BhZ2VzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfb2ZmX3QgZmlyc3QsCiAJCXhmc19vZmZfdCBsYXN0LCB1aW50NjRfdCBmbGFncywgaW50IGZpb3B0KTsKK2ludCB4ZnNfd2FpdF9vbl9wYWdlcyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgeGZzX29mZl90IGZpcnN0LCB4ZnNfb2ZmX3QgbGFzdCk7CiAKICNlbmRpZiAvKiBfWEZTX1ZOT0RFT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9paWMuaCBiL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9paWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNmFjYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvaWljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2lpYy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0MTAgLSBJMkMgQ29udHJvbGxlciBwbGF0ZnJvbV9kZXZpY2UgaW5mbwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSUlDX0gKLSNkZWZpbmUgX19BU01fQVJDSF9JSUNfSCBfX0ZJTEVfXwotCi0jZGVmaW5lIFMzQ19JSUNGTEdfRklMVEVSCSgxPDwwKQkvKiBlbmFibGUgczNjMjQ0MCBmaWx0ZXIgKi8KLQotLyogTm90ZXM6Ci0gKgkxKSBBbGwgZnJlcXVlbmNpZXMgYXJlIGV4cHJlc3NlZCBpbiBIegotICoJMikgQSB2YWx1ZSBvZiB6ZXJvIGlzIGBkbyBub3QgY2FyZWAKLSovCi0KLXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyB7Ci0JaW50CQlidXNfbnVtOwkvKiBidXMgbnVtYmVyIHRvIHVzZSAqLwotCXVuc2lnbmVkIGludAlmbGFnczsKLQl1bnNpZ25lZCBpbnQJc2xhdmVfYWRkcjsJLyogc2xhdmUgYWRkcmVzcyBmb3IgY29udHJvbGxlciAqLwotCXVuc2lnbmVkIGxvbmcJYnVzX2ZyZXE7CS8qIHN0YW5kYXJkIGJ1cyBmcmVxdWVuY3kgKi8KLQl1bnNpZ25lZCBsb25nCW1heF9mcmVxOwkvKiBtYXggZnJlcXVlbmN5IGZvciB0aGUgYnVzICovCi0JdW5zaWduZWQgbG9uZwltaW5fZnJlcTsJLyogbWluIGZyZXF1ZW5jeSBmb3IgdGhlIGJ1cyAqLwotCXVuc2lnbmVkIGludAlzZGFfZGVsYXk7CS8qIHBjbGtzIChzM2MyNDQwIG9ubHkpICovCi19OwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9JSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggNGM3OTRkNy4uOGFmMjc2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC00MSwxNSArNDEsMTQgQEAKIAogI2lmbmRlZiBfX1dBUk4KICNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCB3YXJuX29uX3Nsb3dwYXRoKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lKTsKIGV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGgoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgaW50IGxpbmUsCiAJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwogI2RlZmluZSBXQU5UX1dBUk5fT05fU0xPV1BBVEgKICNlbmRpZgotI2RlZmluZSBfX1dBUk4oKSB3YXJuX29uX3Nsb3dwYXRoKF9fRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgX19XQVJOX3ByaW50ZihhcmcuLi4pIHdhcm5fc2xvd3BhdGgoX19GSUxFX18sIF9fTElORV9fLCBhcmcpCisjZGVmaW5lIF9fV0FSTigpCQl3YXJuX3Nsb3dwYXRoKF9fRklMRV9fLCBfX0xJTkVfXywgTlVMTCkKKyNkZWZpbmUgX19XQVJOX3ByaW50ZihhcmcuLi4pCXdhcm5fc2xvd3BhdGgoX19GSUxFX18sIF9fTElORV9fLCBhcmcpCiAjZWxzZQotI2RlZmluZSBfX1dBUk5fcHJpbnRmKGFyZy4uLikgZG8geyBwcmludGsoYXJnKTsgX19XQVJOKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fV0FSTl9wcmludGYoYXJnLi4uKQlkbyB7IHByaW50ayhhcmcpOyBfX1dBUk4oKTsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiAjaWZuZGVmIFdBUk5fT04KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0tidWlsZCBiL2luY2x1ZGUvZHJtL0tidWlsZAppbmRleCA4MmI2OTgzLi5iOTQwZmRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9LYnVpbGQKKysrIGIvaW5jbHVkZS9kcm0vS2J1aWxkCkBAIC0xLDQgKzEsNCBAQAotdW5pZmRlZi15ICs9IGRybS5oIGRybV9zYXJlYS5oCit1bmlmZGVmLXkgKz0gZHJtLmggZHJtX3NhcmVhLmggZHJtX21vZGUuaAogdW5pZmRlZi15ICs9IGk4MTBfZHJtLmgKIHVuaWZkZWYteSArPSBpODMwX2RybS5oCiB1bmlmZGVmLXkgKz0gaTkxNV9kcm0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtLmggYi9pbmNsdWRlL2RybS9kcm0uaAppbmRleCBmNDZiYTRiLi4zMmU1MDk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9kcm0uaApAQCAtMTczLDYgKzE3Myw3IEBACiAJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCiAJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLwogCV9EUk1fQ09OU0lTVEVOVCA9IDUsCSAgLyoqPCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgUENJIERNQSAqLworCV9EUk1fR0VNID0gNiwJCSAgLyoqPCBHRU0gb2JqZWN0ICovCiB9OwogCiAvKioKQEAgLTU5OCw2ICs1OTksOCBAQAogCXVpbnQ2NF90IHNpemU7CiB9OwogCisjaW5jbHVkZSAiZHJtX21vZGUuaCIKKwogI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJwogI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQogI2RlZmluZSBEUk1fSU9SKG5yLHR5cGUpCQlfSU9SKERSTV9JT0NUTF9CQVNFLG5yLHR5cGUpCkBAIC02MzQsNiArNjM3LDkgQEAKICNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgJCURSTV9JT1coIDB4MWMsIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwKQogI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWCAJRFJNX0lPV1IoMHgxZCwgc3RydWN0IGRybV9jdHhfcHJpdl9tYXApCiAKKyNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9NQVNURVIgICAgICAgICAgICBEUk1fSU8oMHgxZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0RST1BfTUFTVEVSICAgICAgICAgICBEUk1fSU8oMHgxZikKKwogI2RlZmluZSBEUk1fSU9DVExfQUREX0NUWAkJRFJNX0lPV1IoMHgyMCwgc3RydWN0IGRybV9jdHgpCiAjZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIHN0cnVjdCBkcm1fY3R4KQogI2RlZmluZSBEUk1fSU9DVExfTU9EX0NUWAkJRFJNX0lPVyggMHgyMiwgc3RydWN0IGRybV9jdHgpCkBAIC02NjQsNiArNjcwLDI0IEBACiAKICNkZWZpbmUgRFJNX0lPQ1RMX1VQREFURV9EUkFXCQlEUk1fSU9XKDB4M2YsIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcpCiAKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUkVTT1VSQ0VTCURSTV9JT1dSKDB4QTAsIHN0cnVjdCBkcm1fbW9kZV9jYXJkX3JlcykKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUQ1JUQwkJRFJNX0lPV1IoMHhBMSwgc3RydWN0IGRybV9tb2RlX2NydGMpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVENSVEMJCURSTV9JT1dSKDB4QTIsIHN0cnVjdCBkcm1fbW9kZV9jcnRjKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9DVVJTT1IJCURSTV9JT1dSKDB4QTMsIHN0cnVjdCBkcm1fbW9kZV9jdXJzb3IpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVEdBTU1BCQlEUk1fSU9XUigweEE0LCBzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1NFVEdBTU1BCQlEUk1fSU9XUigweEE1LCBzdHJ1Y3QgZHJtX21vZGVfY3J0Y19sdXQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0dFVEVOQ09ERVIJRFJNX0lPV1IoMHhBNiwgc3RydWN0IGRybV9tb2RlX2dldF9lbmNvZGVyKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRDT05ORUNUT1IJRFJNX0lPV1IoMHhBNywgc3RydWN0IGRybV9tb2RlX2dldF9jb25uZWN0b3IpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX0FUVEFDSE1PREUJRFJNX0lPV1IoMHhBOCwgc3RydWN0IGRybV9tb2RlX21vZGVfY21kKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9ERVRBQ0hNT0RFCURSTV9JT1dSKDB4QTksIHN0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCkKKworI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRQUk9QRVJUWQlEUk1fSU9XUigweEFBLCBzdHJ1Y3QgZHJtX21vZGVfZ2V0X3Byb3BlcnR5KQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9TRVRQUk9QRVJUWQlEUk1fSU9XUigweEFCLCBzdHJ1Y3QgZHJtX21vZGVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfR0VUUFJPUEJMT0IJRFJNX0lPV1IoMHhBQywgc3RydWN0IGRybV9tb2RlX2dldF9ibG9iKQorI2RlZmluZSBEUk1fSU9DVExfTU9ERV9HRVRGQgkJRFJNX0lPV1IoMHhBRCwgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PREVfQURERkIJCURSTV9JT1dSKDB4QUUsIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQpCisjZGVmaW5lIERSTV9JT0NUTF9NT0RFX1JNRkIJCURSTV9JT1dSKDB4QUYsIHVuc2lnbmVkIGludCkKKwogLyoqCiAgKiBEZXZpY2Ugc3BlY2lmaWMgaW9jdGxzIHNob3VsZCBvbmx5IGJlIGluIHRoZWlyIHJlc3BlY3RpdmUgaGVhZGVycwogICogVGhlIGRldmljZSBzcGVjaWZpYyBpb2N0bCByYW5nZSBpcyBmcm9tIDB4NDAgdG8gMHg5OS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybVAuaCBiL2luY2x1ZGUvZHJtL2RybVAuaAppbmRleCBkNWU4ZTVjLi5hZmI3ODU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1QLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtUC5oCkBAIC0xMDUsNiArMTA1LDcgQEAKICNkZWZpbmUgRFJJVkVSX0ZCX0RNQSAgICAgIDB4NDAwCiAjZGVmaW5lIERSSVZFUl9JUlFfVkJMMiAgICAweDgwMAogI2RlZmluZSBEUklWRVJfR0VNICAgICAgICAgMHgxMDAwCisjZGVmaW5lIERSSVZFUl9NT0RFU0VUICAgICAweDIwMDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqIFxuYW1lIEJlZ2luIHRoZSBEUk0uLi4gKi8KQEAgLTIzOCwxMSArMjM5LDExIEBACiAgKi8KICNkZWZpbmUgTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbGVfcHJpdiApCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JaWYgKCAhX0RSTV9MT0NLX0lTX0hFTEQoIGRldi0+bG9jay5od19sb2NrLT5sb2NrICkgfHwJCVwKLQkgICAgIGRldi0+bG9jay5maWxlX3ByaXYgIT0gZmlsZV9wcml2ICkJewkJCVwKKwlpZiAoIV9EUk1fTE9DS19JU19IRUxEKGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmh3X2xvY2stPmxvY2spIHx8CQlcCisJICAgIGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmZpbGVfcHJpdiAhPSBmaWxlX3ByaXYpCXsJCQlcCiAJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZCwgaGVsZCAgJWQgb3duZXIgJXAgJXBcbiIsXAotCQkJICAgX19mdW5jX18sIF9EUk1fTE9DS19JU19IRUxEKCBkZXYtPmxvY2suaHdfbG9jay0+bG9jayApLFwKLQkJCSAgIGRldi0+bG9jay5maWxlX3ByaXYsIGZpbGVfcHJpdiApOwkJXAorCQkJICAgX19mdW5jX18sIF9EUk1fTE9DS19JU19IRUxEKGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmh3X2xvY2stPmxvY2spLFwKKwkJCSAgIGZpbGVfcHJpdi0+bWFzdGVyLT5sb2NrLmZpbGVfcHJpdiwgZmlsZV9wcml2KTsJCVwKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC0yNzYsNiArMjc3LDcgQEAKICNkZWZpbmUgRFJNX0FVVEgJMHgxCiAjZGVmaW5lCURSTV9NQVNURVIJMHgyCiAjZGVmaW5lIERSTV9ST09UX09OTFkJMHg0CisjZGVmaW5lIERSTV9DT05UUk9MX0FMTE9XIDB4OAogCiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgewogCXVuc2lnbmVkIGludCBjbWQ7CkBAIC0zNzksMjEgKzM4MSwyNiBAQAogLyoqIEZpbGUgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZHJtX2ZpbGUgewogCWludCBhdXRoZW50aWNhdGVkOwotCWludCBtYXN0ZXI7CiAJcGlkX3QgcGlkOwogCXVpZF90IHVpZDsKIAlkcm1fbWFnaWNfdCBtYWdpYzsKIAl1bnNpZ25lZCBsb25nIGlvY3RsX2NvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQgbGhlYWQ7CiAJc3RydWN0IGRybV9taW5vciAqbWlub3I7Ci0JaW50IHJlbW92ZV9hdXRoX29uX2Nsb3NlOwogCXVuc2lnbmVkIGxvbmcgbG9ja19jb3VudDsKKwogCS8qKiBNYXBwaW5nIG9mIG1tIG9iamVjdCBoYW5kbGVzIHRvIG9iamVjdCBwb2ludGVycy4gKi8KIAlzdHJ1Y3QgaWRyIG9iamVjdF9pZHI7CiAJLyoqIExvY2sgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gb2JqZWN0X2lkci4gKi8KIAlzcGlubG9ja190IHRhYmxlX2xvY2s7CisKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAl2b2lkICpkcml2ZXJfcHJpdjsKKworCWludCBpc19tYXN0ZXI7IC8qIHRoaXMgZmlsZSBwcml2YXRlIGlzIGEgbWFzdGVyIGZvciBhIG1pbm9yICovCisJc3RydWN0IGRybV9tYXN0ZXIgKm1hc3RlcjsgLyogbWFzdGVyIHRoaXMgbm9kZSBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoCisJCQkJICAgICAgTi5CLiBub3QgYWx3YXlzIG1pbm9yLT5tYXN0ZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZiczsKIH07CiAKIC8qKiBXYWl0IHF1ZXVlICovCkBAIC01MjMsNiArNTMwLDggQEAKIAlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoOwogCXN0cnVjdCBkcm1fbWFwICptYXA7CQkJLyoqPCBtYXBwaW5nICovCiAJdWludDY0X3QgdXNlcl90b2tlbjsKKwlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZmlsZV9vZmZzZXRfbm9kZTsJLyoqPCBmYWtlIG9mZnNldCAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbG9jYWxfbWFwX3Q7CkBAIC01NjMsNiArNTcyLDE0IEBACiB9OwogCiAvKioKKyAqIEdFTSBzcGVjaWZpYyBtbSBwcml2YXRlIGZvciB0cmFja2luZyBHRU0gb2JqZWN0cworICovCitzdHJ1Y3QgZHJtX2dlbV9tbSB7CisJc3RydWN0IGRybV9tbSBvZmZzZXRfbWFuYWdlcjsJLyoqPCBPZmZzZXQgbWdtdCBmb3IgYnVmZmVyIG9iamVjdHMgKi8KKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBvZmZzZXRfaGFzaDsgLyoqPCBVc2VyIHRva2VuIGhhc2ggdGFibGUgZm9yIG1hcHMgKi8KK307CisKKy8qKgogICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZHJtX21tIG1lbW9yeSBvYmplY3QsIHdoaWNoIHdpbGwgYmUgdXNlZCBieSB0aGUKICAqIERSTSBmb3IgaXRzIGJ1ZmZlciBvYmplY3RzLgogICovCkBAIC01NzksNiArNTk2LDkgQEAKIAkvKiogRmlsZSByZXByZXNlbnRpbmcgdGhlIHNobWVtIHN0b3JhZ2UgKi8KIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAorCS8qIE1hcHBpbmcgaW5mbyBmb3IgdGhpcyBvYmplY3QgKi8KKwlzdHJ1Y3QgZHJtX21hcF9saXN0IG1hcF9saXN0OworCiAJLyoqCiAJICogU2l6ZSBvZiB0aGUgb2JqZWN0LCBpbiBieXRlcy4gIEltbXV0YWJsZSBvdmVyIHRoZSBvYmplY3QncwogCSAqIGxpZmV0aW1lLgpAQCAtNjEyLDYgKzYzMiwzMyBAQAogCXZvaWQgKmRyaXZlcl9wcml2YXRlOwogfTsKIAorI2luY2x1ZGUgImRybV9jcnRjLmgiCisKKy8qIHBlci1tYXN0ZXIgc3RydWN0dXJlICovCitzdHJ1Y3QgZHJtX21hc3RlciB7CisKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsgLyogcmVmY291bnQgZm9yIHRoaXMgbWFzdGVyICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7IC8qKjwgZWFjaCBtaW5vciBjb250YWlucyBhIGxpc3Qgb2YgbWFzdGVycyAqLworCXN0cnVjdCBkcm1fbWlub3IgKm1pbm9yOyAvKio8IGxpbmsgYmFjayB0byBtaW5vciB3ZSBhcmUgYSBtYXN0ZXIgZm9yICovCisKKwljaGFyICp1bmlxdWU7CQkJLyoqPCBVbmlxdWUgaWRlbnRpZmllcjogZS5nLiwgYnVzaWQgKi8KKwlpbnQgdW5pcXVlX2xlbjsJCQkvKio8IExlbmd0aCBvZiB1bmlxdWUgZmllbGQgKi8KKwlpbnQgdW5pcXVlX3NpemU7CQkvKio8IGFtb3VudCBhbGxvY2F0ZWQgKi8KKworCWludCBibG9ja2VkOwkJCS8qKjwgQmxvY2tlZCBkdWUgdG8gVkMgc3dpdGNoPyAqLworCisJLyoqIFxuYW1lIEF1dGhlbnRpY2F0aW9uICovCisJLypAeyAqLworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG1hZ2ljbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hZ2ljZnJlZTsKKwkvKkB9ICovCisKKwlzdHJ1Y3QgZHJtX2xvY2tfZGF0YSBsb2NrOwkvKio8IEluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIGxvY2sgKi8KKworCXZvaWQgKmRyaXZlcl9wcml2OyAvKio8IFByaXZhdGUgc3RydWN0dXJlIGZvciBkcml2ZXIgdG8gdXNlICovCit9OworCiAvKioKICAqIERSTSBkcml2ZXIgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgdGhlIGNvbW1vbiBjb2RlIGZvcgogICogYSBmYW1pbHkgb2YgY2FyZHMuIFRoZXJlIHdpbGwgb25lIGRybV9kZXZpY2UgZm9yIGVhY2ggY2FyZCBwcmVzZW50CkBAIC03MTIsNiArNzU5LDEwIEBACiAJdm9pZCAoKnNldF92ZXJzaW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGRybV9zZXRfdmVyc2lvbiAqc3YpOwogCisJLyogTWFzdGVyIHJvdXRpbmVzICovCisJaW50ICgqbWFzdGVyX2NyZWF0ZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tYXN0ZXIgKm1hc3Rlcik7CisJdm9pZCAoKm1hc3Rlcl9kZXN0cm95KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKKwogCWludCAoKnByb2NfaW5pdCkoc3RydWN0IGRybV9taW5vciAqbWlub3IpOwogCXZvaWQgKCpwcm9jX2NsZWFudXApKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKTsKIApAQCAtNzI0LDYgKzc3NSw5IEBACiAJaW50ICgqZ2VtX2luaXRfb2JqZWN0KSAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwogCXZvaWQgKCpnZW1fZnJlZV9vYmplY3QpIChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiAKKwkvKiBEcml2ZXIgcHJpdmF0ZSBvcHMgZm9yIHRoaXMgb2JqZWN0ICovCisJc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICpnZW1fdm1fb3BzOworCiAJaW50IG1ham9yOwogCWludCBtaW5vcjsKIAlpbnQgcGF0Y2hsZXZlbDsKQEAgLTczNywxMCArNzkxLDE0IEBACiAJaW50IG51bV9pb2N0bHM7CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwogCXN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXI7CisJLyogTGlzdCBvZiBkZXZpY2VzIGhhbmdpbmcgb2ZmIHRoaXMgZHJpdmVyICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VfbGlzdDsKIH07CiAKICNkZWZpbmUgRFJNX01JTk9SX1VOQVNTSUdORUQgMAogI2RlZmluZSBEUk1fTUlOT1JfTEVHQUNZIDEKKyNkZWZpbmUgRFJNX01JTk9SX0NPTlRST0wgMgorI2RlZmluZSBEUk1fTUlOT1JfUkVOREVSIDMKIAogLyoqCiAgKiBEUk0gbWlub3Igc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgZHJtIG1pbm9yIG51bWJlci4KQEAgLTc1Miw2ICs4MTAsOSBAQAogCXN0cnVjdCBkZXZpY2Uga2RldjsJCS8qKjwgTGludXggZGV2aWNlICovCiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldl9yb290OyAgLyoqPCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLworCXN0cnVjdCBkcm1fbWFzdGVyICptYXN0ZXI7IC8qIGN1cnJlbnRseSBhY3RpdmUgbWFzdGVyIGZvciB0aGlzIG5vZGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hc3Rlcl9saXN0OworCXN0cnVjdCBkcm1fbW9kZV9ncm91cCBtb2RlX2dyb3VwOwogfTsKIAogLyoqCkBAIC03NTksMTMgKzgyMCwxMCBAQAogICogbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuCiAgKi8KIHN0cnVjdCBkcm1fZGV2aWNlIHsKLQljaGFyICp1bmlxdWU7CQkJLyoqPCBVbmlxdWUgaWRlbnRpZmllcjogZS5nLiwgYnVzaWQgKi8KLQlpbnQgdW5pcXVlX2xlbjsJCQkvKio8IExlbmd0aCBvZiB1bmlxdWUgZmllbGQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRyaXZlcl9pdGVtOwkvKio8IGxpc3Qgb2YgZGV2aWNlcyBwZXIgZHJpdmVyICovCiAJY2hhciAqZGV2bmFtZTsJCQkvKio8IEZvciAvcHJvYy9pbnRlcnJ1cHRzICovCiAJaW50IGlmX3ZlcnNpb247CQkJLyoqPCBIaWdoZXN0IGludGVyZmFjZSB2ZXJzaW9uIHNldCAqLwogCi0JaW50IGJsb2NrZWQ7CQkJLyoqPCBCbG9ja2VkIGR1ZSB0byBWQyBzd2l0Y2g/ICovCi0KIAkvKiogXG5hbWUgTG9ja3MgKi8KIAkvKkB7ICovCiAJc3BpbmxvY2tfdCBjb3VudF9sb2NrOwkJLyoqPCBGb3IgaW51c2UsIGRybV9kZXZpY2U6Om9wZW5fY291bnQsIGRybV9kZXZpY2U6OmJ1Zl91c2UgKi8KQEAgLTc4OCwxMiArODQ2LDcgQEAKIAlhdG9taWNfdCBjb3VudHNbMTVdOwogCS8qQH0gKi8KIAotCS8qKiBcbmFtZSBBdXRoZW50aWNhdGlvbiAqLwotCS8qQHsgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVsaXN0OwotCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG1hZ2ljbGlzdDsJLyoqPCBtYWdpYyBoYXNoIHRhYmxlICovCi0Jc3RydWN0IGxpc3RfaGVhZCBtYWdpY2ZyZWU7Ci0JLypAfSAqLwogCiAJLyoqIFxuYW1lIE1lbW9yeSBtYW5hZ2VtZW50ICovCiAJLypAeyAqLwpAQCAtODEwLDcgKzg2Myw3IEBACiAJc3RydWN0IGlkciBjdHhfaWRyOwogCiAJc3RydWN0IGxpc3RfaGVhZCB2bWFsaXN0OwkvKio8IExpc3Qgb2Ygdm1hcyAoZm9yIGRlYnVnZ2luZykgKi8KLQlzdHJ1Y3QgZHJtX2xvY2tfZGF0YSBsb2NrOwkvKio8IEluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIGxvY2sgKi8KKwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBETUEgcXVldWVzIChjb250ZXh0cykgKi8KQEAgLTg1OCw2ICs5MTEsNyBAQAogCWludCAqdmJsYW5rX2VuYWJsZWQ7ICAgICAgICAgICAgLyogc28gd2UgZG9uJ3QgY2FsbCBlbmFibGUgbW9yZSB0aGFuCiAJCQkJCSAgIG9uY2UgcGVyIGRpc2FibGUgKi8KIAlpbnQgKnZibGFua19pbm1vZGVzZXQ7ICAgICAgICAgIC8qIERpc3BsYXkgZHJpdmVyIGlzIHNldHRpbmcgbW9kZSAqLworCXUzMiAqbGFzdF92Ymxhbmtfd2FpdDsJCS8qIExhc3QgdmJsYW5rIHNlcW5vIHdhaXRlZCBwZXIgQ1JUQyAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHZibGFua19kaXNhYmxlX3RpbWVyOwogCiAJdTMyIG1heF92YmxhbmtfY291bnQ7ICAgICAgICAgICAvKio8IHNpemUgb2YgdmJsYW5rIGNvdW50ZXIgcmVnaXN0ZXIgKi8KQEAgLTg4MSwxMiArOTM1LDE1IEBACiAJc3RydWN0IGRybV9zZ19tZW0gKnNnOwkvKio8IFNjYXR0ZXIgZ2F0aGVyIG1lbW9yeSAqLwogCWludCBudW1fY3J0Y3M7ICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgQ1JUQ3Mgb24gdGhpcyBkZXZpY2UgKi8KIAl2b2lkICpkZXZfcHJpdmF0ZTsJCS8qKjwgZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKm1tX3ByaXZhdGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmRldl9tYXBwaW5nOwogCXN0cnVjdCBkcm1fc2lnZGF0YSBzaWdkYXRhOwkgICAvKio8IEZvciBibG9ja19hbGxfc2lnbmFscyAqLwogCXNpZ3NldF90IHNpZ21hc2s7CiAKIAlzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyOwogCWRybV9sb2NhbF9tYXBfdCAqYWdwX2J1ZmZlcl9tYXA7CiAJdW5zaWduZWQgaW50IGFncF9idWZmZXJfdG9rZW47CisJc3RydWN0IGRybV9taW5vciAqY29udHJvbDsJCS8qKjwgQ29udHJvbCBub2RlIGZvciBjYXJkICovCiAJc3RydWN0IGRybV9taW5vciAqcHJpbWFyeTsJCS8qKjwgcmVuZGVyIHR5cGUgcHJpbWFyeSBzY3JlZW4gaGVhZCAqLwogCiAJLyoqIFxuYW1lIERyYXdhYmxlIGluZm9ybWF0aW9uICovCkBAIC04OTUsNiArOTUyLDggQEAKIAlzdHJ1Y3QgaWRyIGRyd19pZHI7CiAJLypAfSAqLwogCisgICAgICAgIHN0cnVjdCBkcm1fbW9kZV9jb25maWcgbW9kZV9jb25maWc7CS8qKjwgQ3VycmVudCBtb2RlIGNvbmZpZyAqLworCiAJLyoqIFxuYW1lIEdFTSBpbmZvcm1hdGlvbiAqLwogCS8qQHsgKi8KIAlzcGlubG9ja190IG9iamVjdF9uYW1lX2xvY2s7CkBAIC05OTcsNiArMTA1Niw4IEBACiAKIAkJCQkvKiBNYXBwaW5nIHN1cHBvcnQgKGRybV92bS5oKSAqLwogZXh0ZXJuIGludCBkcm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIGludCBkcm1fbW1hcF9sb2NrZWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2V4dGVybiB2b2lkIGRybV92bV9vcGVuX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhzdHJ1Y3QgZHJtX21hcCAqIG1hcCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfcmVnX29mcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CkBAIC0xMTUzLDYgKzEyMTQsOCBAQAogZXh0ZXJuIHZvaWQgZHJtX3ZibGFua19wdXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgZHJtX3ZibGFua19jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogLyogTW9kZXNldHRpbmcgc3VwcG9ydCAqLworZXh0ZXJuIHZvaWQgZHJtX3ZibGFua19wcmVfbW9kZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gdm9pZCBkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IGRybV9tb2Rlc2V0X2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCkBAIC0xMTg5LDYgKzEyNTIsMTMgQEAKIGV4dGVybiB2b2lkIGRybV9hZ3BfY2hpcHNldF9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIFN0dWIgc3VwcG9ydCAoZHJtX3N0dWIuaCkgKi8KK2V4dGVybiBpbnQgZHJtX3NldG1hc3Rlcl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX2Ryb3BtYXN0ZXJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitzdHJ1Y3QgZHJtX21hc3RlciAqZHJtX21hc3Rlcl9jcmVhdGUoc3RydWN0IGRybV9taW5vciAqbWlub3IpOworZXh0ZXJuIHN0cnVjdCBkcm1fbWFzdGVyICpkcm1fbWFzdGVyX2dldChzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyKTsKK2V4dGVybiB2b2lkIGRybV9tYXN0ZXJfcHV0KHN0cnVjdCBkcm1fbWFzdGVyICoqbWFzdGVyKTsKIGV4dGVybiBpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCSAgICAgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKIGV4dGVybiBpbnQgZHJtX3B1dF9kZXYoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0xMjMxLDcgKzEzMDEsMTEgQEAKIGV4dGVybiBzdHJ1Y3QgY2xhc3MgKmRybV9zeXNmc19jcmVhdGUoc3RydWN0IG1vZHVsZSAqb3duZXIsIGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgZHJtX3N5c2ZzX2Rlc3Ryb3kodm9pZCk7CiBleHRlcm4gaW50IGRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKTsKK2V4dGVybiB2b2lkIGRybV9zeXNmc19ob3RwbHVnX2V2ZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoc3RydWN0IGRybV9taW5vciAqbWlub3IpOworZXh0ZXJuIGNoYXIgKmRybV9nZXRfY29ubmVjdG9yX3N0YXR1c19uYW1lKGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzKTsKK2V4dGVybiBpbnQgZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIAogLyoKICAqIEJhc2ljIG1lbW9yeSBtYW5hZ2VyIHN1cHBvcnQgKGRybV9tbS5jKQpAQCAtMTI1MSwxMCArMTMyNSwxMiBAQAogCiAvKiBHcmFwaGljcyBFeGVjdXRpb24gTWFuYWdlciBsaWJyYXJ5IGZ1bmN0aW9ucyAoZHJtX2dlbS5jKSAqLwogaW50IGRybV9nZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgZHJtX2dlbV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBkcm1fZ2VtX29iamVjdF9mcmVlKHN0cnVjdCBrcmVmICprcmVmKTsKIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZHJtX2dlbV9vYmplY3RfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgIHNpemVfdCBzaXplKTsKIHZvaWQgZHJtX2dlbV9vYmplY3RfaGFuZGxlX2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpOworaW50IGRybV9nZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2IwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDYgS2VpdGggUGFja2FyZAorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBEYXZlIEFpcmxpZQorICogQ29weXJpZ2h0IMKpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX19EUk1fQ1JUQ19IX18KKyNkZWZpbmUgX19EUk1fQ1JUQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKK3N0cnVjdCBkcm1fZGV2aWNlOworc3RydWN0IGRybV9tb2RlX3NldDsKK3N0cnVjdCBkcm1fZnJhbWVidWZmZXI7CisKKworI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfQ1JUQyAweGNjY2NjY2NjCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9DT05ORUNUT1IgMHhjMGMwYzBjMAorI2RlZmluZSBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUiAweGUwZTBlMGUwCisjZGVmaW5lIERSTV9NT0RFX09CSkVDVF9NT0RFIDB4ZGVkZWRlZGUKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX1BST1BFUlRZIDB4YjBiMGIwYjAKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0ZCIDB4ZmJmYmZiZmIKKyNkZWZpbmUgRFJNX01PREVfT0JKRUNUX0JMT0IgMHhiYmJiYmJiYgorCitzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0IHsKKwl1aW50MzJfdCBpZDsKKwl1aW50MzJfdCB0eXBlOworfTsKKworLyoKKyAqIE5vdGUgb24gdGVybWlub2xvZ3k6ICBoZXJlLCBmb3IgYnJldml0eSBhbmQgY29udmVuaWVuY2UsIHdlIHJlZmVyIHRvIGNvbm5lY3RvcgorICogY29udHJvbCBjaGlwcyBhcyAnQ1JUQ3MnLiAgVGhleSBjYW4gY29udHJvbCBhbnkgdHlwZSBvZiBjb25uZWN0b3IsIFZHQSwgTFZEUywKKyAqIERWSSwgZXRjLiAgQW5kICdzY3JlZW4nIHJlZmVycyB0byB0aGUgd2hvbGUgb2YgdGhlIHZpc2libGUgZGlzcGxheSwgd2hpY2gKKyAqIG1heSBzcGFuIG11bHRpcGxlIG1vbml0b3JzIChhbmQgdGhlcmVmb3JlIG11bHRpcGxlIENSVEMgYW5kIGNvbm5lY3RvcgorICogc3RydWN0dXJlcykuCisgKi8KKworZW51bSBkcm1fbW9kZV9zdGF0dXMgeworICAgIE1PREVfT0sJPSAwLAkvKiBNb2RlIE9LICovCisgICAgTU9ERV9IU1lOQywJCS8qIGhzeW5jIG91dCBvZiByYW5nZSAqLworICAgIE1PREVfVlNZTkMsCQkvKiB2c3luYyBvdXQgb2YgcmFuZ2UgKi8KKyAgICBNT0RFX0hfSUxMRUdBTCwJLyogbW9kZSBoYXMgaWxsZWdhbCBob3Jpem9udGFsIHRpbWluZ3MgKi8KKyAgICBNT0RFX1ZfSUxMRUdBTCwJLyogbW9kZSBoYXMgaWxsZWdhbCBob3Jpem9udGFsIHRpbWluZ3MgKi8KKyAgICBNT0RFX0JBRF9XSURUSCwJLyogcmVxdWlyZXMgYW4gdW5zdXBwb3J0ZWQgbGluZXBpdGNoICovCisgICAgTU9ERV9OT01PREUsCS8qIG5vIG1vZGUgd2l0aCBhIG1hY2hpbmcgbmFtZSAqLworICAgIE1PREVfTk9fSU5URVJMQUNFLAkvKiBpbnRlcmxhY2VkIG1vZGUgbm90IHN1cHBvcnRlZCAqLworICAgIE1PREVfTk9fREJMRVNDQU4sCS8qIGRvdWJsZXNjYW4gbW9kZSBub3Qgc3VwcG9ydGVkICovCisgICAgTU9ERV9OT19WU0NBTiwJLyogbXVsdGlzY2FuIG1vZGUgbm90IHN1cHBvcnRlZCAqLworICAgIE1PREVfTUVNLAkJLyogaW5zdWZmaWNpZW50IHZpZGVvIG1lbW9yeSAqLworICAgIE1PREVfVklSVFVBTF9YLAkvKiBtb2RlIHdpZHRoIHRvbyBsYXJnZSBmb3Igc3BlY2lmaWVkIHZpcnR1YWwgc2l6ZSAqLworICAgIE1PREVfVklSVFVBTF9ZLAkvKiBtb2RlIGhlaWdodCB0b28gbGFyZ2UgZm9yIHNwZWNpZmllZCB2aXJ0dWFsIHNpemUgKi8KKyAgICBNT0RFX01FTV9WSVJULAkvKiBpbnN1ZmZpY2llbnQgdmlkZW8gbWVtb3J5IGdpdmVuIHZpcnR1YWwgc2l6ZSAqLworICAgIE1PREVfTk9DTE9DSywJLyogbm8gZml4ZWQgY2xvY2sgYXZhaWxhYmxlICovCisgICAgTU9ERV9DTE9DS19ISUdILAkvKiBjbG9jayByZXF1aXJlZCBpcyB0b28gaGlnaCAqLworICAgIE1PREVfQ0xPQ0tfTE9XLAkvKiBjbG9jayByZXF1aXJlZCBpcyB0b28gbG93ICovCisgICAgTU9ERV9DTE9DS19SQU5HRSwJLyogY2xvY2svbW9kZSBpc24ndCBpbiBhIENsb2NrUmFuZ2UgKi8KKyAgICBNT0RFX0JBRF9IVkFMVUUsCS8qIGhvcml6b250YWwgdGltaW5nIHdhcyBvdXQgb2YgcmFuZ2UgKi8KKyAgICBNT0RFX0JBRF9WVkFMVUUsCS8qIHZlcnRpY2FsIHRpbWluZyB3YXMgb3V0IG9mIHJhbmdlICovCisgICAgTU9ERV9CQURfVlNDQU4sCS8qIFZTY2FuIHZhbHVlIG91dCBvZiByYW5nZSAqLworICAgIE1PREVfSFNZTkNfTkFSUk9XLAkvKiBob3Jpem9udGFsIHN5bmMgdG9vIG5hcnJvdyAqLworICAgIE1PREVfSFNZTkNfV0lERSwJLyogaG9yaXpvbnRhbCBzeW5jIHRvbyB3aWRlICovCisgICAgTU9ERV9IQkxBTktfTkFSUk9XLAkvKiBob3Jpem9udGFsIGJsYW5raW5nIHRvbyBuYXJyb3cgKi8KKyAgICBNT0RFX0hCTEFOS19XSURFLAkvKiBob3Jpem9udGFsIGJsYW5raW5nIHRvbyB3aWRlICovCisgICAgTU9ERV9WU1lOQ19OQVJST1csCS8qIHZlcnRpY2FsIHN5bmMgdG9vIG5hcnJvdyAqLworICAgIE1PREVfVlNZTkNfV0lERSwJLyogdmVydGljYWwgc3luYyB0b28gd2lkZSAqLworICAgIE1PREVfVkJMQU5LX05BUlJPVywJLyogdmVydGljYWwgYmxhbmtpbmcgdG9vIG5hcnJvdyAqLworICAgIE1PREVfVkJMQU5LX1dJREUsCS8qIHZlcnRpY2FsIGJsYW5raW5nIHRvbyB3aWRlICovCisgICAgTU9ERV9QQU5FTCwgICAgICAgICAvKiBleGNlZWRzIHBhbmVsIGRpbWVuc2lvbnMgKi8KKyAgICBNT0RFX0lOVEVSTEFDRV9XSURUSCwgLyogd2lkdGggdG9vIGxhcmdlIGZvciBpbnRlcmxhY2VkIG1vZGUgKi8KKyAgICBNT0RFX09ORV9XSURUSCwgICAgIC8qIG9ubHkgb25lIHdpZHRoIGlzIHN1cHBvcnRlZCAqLworICAgIE1PREVfT05FX0hFSUdIVCwgICAgLyogb25seSBvbmUgaGVpZ2h0IGlzIHN1cHBvcnRlZCAqLworICAgIE1PREVfT05FX1NJWkUsICAgICAgLyogb25seSBvbmUgcmVzb2x1dGlvbiBpcyBzdXBwb3J0ZWQgKi8KKyAgICBNT0RFX05PX1JFRFVDRUQsICAgIC8qIG1vbml0b3IgZG9lc24ndCBhY2NlcHQgcmVkdWNlZCBibGFua2luZyAqLworICAgIE1PREVfVU5WRVJJRklFRCA9IC0zLCAvKiBtb2RlIG5lZWRzIHRvIHJldmVyaWZpZWQgKi8KKyAgICBNT0RFX0JBRCA9IC0yLAkvKiB1bnNwZWNpZmllZCByZWFzb24gKi8KKyAgICBNT0RFX0VSUk9SCT0gLTEJLyogZXJyb3IgY29uZGl0aW9uICovCit9OworCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfQ0xPQ0tfQ1JUQ19DIChEUk1fTU9ERV9UWVBFX0NMT0NLX0MgfCBcCisJCQkJICAgIERSTV9NT0RFX1RZUEVfQ1JUQ19DKQorCisjZGVmaW5lIERSTV9NT0RFKG5tLCB0LCBjLCBoZCwgaHNzLCBoc2UsIGh0LCBoc2ssIHZkLCB2c3MsIHZzZSwgdnQsIHZzLCBmKSBcCisJLm5hbWUgPSBubSwgLnN0YXR1cyA9IDAsIC50eXBlID0gKHQpLCAuY2xvY2sgPSAoYyksIFwKKwkuaGRpc3BsYXkgPSAoaGQpLCAuaHN5bmNfc3RhcnQgPSAoaHNzKSwgLmhzeW5jX2VuZCA9IChoc2UpLCBcCisJLmh0b3RhbCA9IChodCksIC5oc2tldyA9IChoc2spLCAudmRpc3BsYXkgPSAodmQpLCBcCisJLnZzeW5jX3N0YXJ0ID0gKHZzcyksIC52c3luY19lbmQgPSAodnNlKSwgLnZ0b3RhbCA9ICh2dCksIFwKKwkudnNjYW4gPSAodnMpLCAuZmxhZ3MgPSAoZiksIC52cmVmcmVzaCA9IDAKKworI2RlZmluZSBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WIDB4MSAvKiBoYWx2ZSBWIHZhbHVlcyBmb3IgaW50ZXJsYWNpbmcgKi8KKworc3RydWN0IGRybV9kaXNwbGF5X21vZGUgeworCS8qIEhlYWRlciAqLworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0IGJhc2U7CisKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworCisJaW50IGNvbm5lY3Rvcl9jb3VudDsKKwllbnVtIGRybV9tb2RlX3N0YXR1cyBzdGF0dXM7CisJaW50IHR5cGU7CisKKwkvKiBQcm9wb3NlZCBtb2RlIHZhbHVlcyAqLworCWludCBjbG9jazsKKwlpbnQgaGRpc3BsYXk7CisJaW50IGhzeW5jX3N0YXJ0OworCWludCBoc3luY19lbmQ7CisJaW50IGh0b3RhbDsKKwlpbnQgaHNrZXc7CisJaW50IHZkaXNwbGF5OworCWludCB2c3luY19zdGFydDsKKwlpbnQgdnN5bmNfZW5kOworCWludCB2dG90YWw7CisJaW50IHZzY2FuOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIEFkZHJlc3NhYmxlIGltYWdlIHNpemUgKG1heSBiZSAwIGZvciBwcm9qZWN0b3JzLCBldGMuKSAqLworCWludCB3aWR0aF9tbTsKKwlpbnQgaGVpZ2h0X21tOworCisJLyogQWN0dWFsIG1vZGUgd2UgZ2l2ZSB0byBodyAqLworCWludCBjbG9ja19pbmRleDsKKwlpbnQgc3ludGhfY2xvY2s7CisJaW50IGNydGNfaGRpc3BsYXk7CisJaW50IGNydGNfaGJsYW5rX3N0YXJ0OworCWludCBjcnRjX2hibGFua19lbmQ7CisJaW50IGNydGNfaHN5bmNfc3RhcnQ7CisJaW50IGNydGNfaHN5bmNfZW5kOworCWludCBjcnRjX2h0b3RhbDsKKwlpbnQgY3J0Y19oc2tldzsKKwlpbnQgY3J0Y192ZGlzcGxheTsKKwlpbnQgY3J0Y192Ymxhbmtfc3RhcnQ7CisJaW50IGNydGNfdmJsYW5rX2VuZDsKKwlpbnQgY3J0Y192c3luY19zdGFydDsKKwlpbnQgY3J0Y192c3luY19lbmQ7CisJaW50IGNydGNfdnRvdGFsOworCWludCBjcnRjX2hhZGp1c3RlZDsKKwlpbnQgY3J0Y192YWRqdXN0ZWQ7CisKKwkvKiBEcml2ZXIgcHJpdmF0ZSBtb2RlIGluZm8gKi8KKwlpbnQgcHJpdmF0ZV9zaXplOworCWludCAqcHJpdmF0ZTsKKwlpbnQgcHJpdmF0ZV9mbGFnczsKKworCWludCB2cmVmcmVzaDsKKwlmbG9hdCBoc3luYzsKK307CisKK2VudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgeworCWNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkID0gMSwKKwljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCA9IDIsCisJY29ubmVjdG9yX3N0YXR1c191bmtub3duID0gMywKK307CisKK2VudW0gc3VicGl4ZWxfb3JkZXIgeworCVN1YlBpeGVsVW5rbm93biA9IDAsCisJU3ViUGl4ZWxIb3Jpem9udGFsUkdCLAorCVN1YlBpeGVsSG9yaXpvbnRhbEJHUiwKKwlTdWJQaXhlbFZlcnRpY2FsUkdCLAorCVN1YlBpeGVsVmVydGljYWxCR1IsCisJU3ViUGl4ZWxOb25lLAorfTsKKworCisvKgorICogRGVzY3JpYmVzIGEgZ2l2ZW4gZGlzcGxheSAoZS5nLiBDUlQgb3IgZmxhdCBwYW5lbCkgYW5kIGl0cyBsaW1pdGF0aW9ucy4KKyAqLworc3RydWN0IGRybV9kaXNwbGF5X2luZm8geworCWNoYXIgbmFtZVtEUk1fRElTUExBWV9JTkZPX0xFTl07CisJLyogSW5wdXQgaW5mbyAqLworCWJvb2wgc2VycmF0aW9uX3ZzeW5jOworCWJvb2wgc3luY19vbl9ncmVlbjsKKwlib29sIGNvbXBvc2l0ZV9zeW5jOworCWJvb2wgc2VwYXJhdGVfc3luY3M7CisJYm9vbCBibGFua190b19ibGFjazsKKwl1bnNpZ25lZCBjaGFyIHZpZGVvX2xldmVsOworCWJvb2wgZGlnaXRhbDsKKwkvKiBQaHlzaWNhbCBzaXplICovCisgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aF9tbTsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0X21tOworCisJLyogRGlzcGxheSBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgY2hhciBnYW1tYTsgLyogRklYTUU6IHN0b3JhZ2UgZm9ybWF0ICovCisJYm9vbCBndGZfc3VwcG9ydGVkOworCWJvb2wgc3RhbmRhcmRfY29sb3I7CisJZW51bSB7CisJCW1vbm9jaHJvbWUgPSAwLAorCQlyZ2IsCisJCW90aGVyLAorCQl1bmtub3duLAorCX0gZGlzcGxheV90eXBlOworCWJvb2wgYWN0aXZlX29mZl9zdXBwb3J0ZWQ7CisJYm9vbCBzdXNwZW5kX3N1cHBvcnRlZDsKKwlib29sIHN0YW5kYnlfc3VwcG9ydGVkOworCisJLyogQ29sb3IgaW5mbyBGSVhNRTogc3RvcmFnZSBmb3JtYXQgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWR4LCByZWR5OworCXVuc2lnbmVkIHNob3J0IGdyZWVueCwgZ3JlZW55OworCXVuc2lnbmVkIHNob3J0IGJsdWV4LCBibHVleTsKKwl1bnNpZ25lZCBzaG9ydCB3aGl0ZXgsIHdoaXRleTsKKworCS8qIENsb2NrIGxpbWl0cyBGSVhNRTogc3RvcmFnZSBmb3JtYXQgKi8KKwl1bnNpZ25lZCBpbnQgbWluX3ZmcmVxLCBtYXhfdmZyZXE7CisJdW5zaWduZWQgaW50IG1pbl9oZnJlcSwgbWF4X2hmcmVxOworCXVuc2lnbmVkIGludCBwaXhlbF9jbG9jazsKKworCS8qIFdoaXRlIHBvaW50IGluZGljZXMgRklYTUU6IHN0b3JhZ2UgZm9ybWF0ICovCisJdW5zaWduZWQgaW50IHdweDEsIHdweTE7CisJdW5zaWduZWQgaW50IHdwZ2FtbWExOworCXVuc2lnbmVkIGludCB3cHgyLCB3cHkyOworCXVuc2lnbmVkIGludCB3cGdhbW1hMjsKKworCWVudW0gc3VicGl4ZWxfb3JkZXIgc3VicGl4ZWxfb3JkZXI7CisKKwljaGFyICpyYXdfZWRpZDsgLyogaWYgYW55ICovCit9OworCitzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIHsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIpOworCWludCAoKmNyZWF0ZV9oYW5kbGUpKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpoYW5kbGUpOworfTsKKworc3RydWN0IGRybV9mcmFtZWJ1ZmZlciB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCBiYXNlOworCWNvbnN0IHN0cnVjdCBkcm1fZnJhbWVidWZmZXJfZnVuY3MgKmZ1bmNzOworCXVuc2lnbmVkIGludCBwaXRjaDsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwkvKiBkZXB0aCBjYW4gYmUgMTUgb3IgMTYgKi8KKwl1bnNpZ25lZCBpbnQgZGVwdGg7CisJaW50IGJpdHNfcGVyX3BpeGVsOworCWludCBmbGFnczsKKwl2b2lkICpmYmRldjsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgZmlscF9oZWFkOworfTsKKworc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iIHsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0IGJhc2U7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBkcm1fcHJvcGVydHlfZW51bSB7CisJdWludDY0X3QgdmFsdWU7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07Cit9OworCitzdHJ1Y3QgZHJtX3Byb3BlcnR5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCBiYXNlOworCXVpbnQzMl90IGZsYWdzOworCWNoYXIgbmFtZVtEUk1fUFJPUF9OQU1FX0xFTl07CisJdWludDMyX3QgbnVtX3ZhbHVlczsKKwl1aW50NjRfdCAqdmFsdWVzOworCisJc3RydWN0IGxpc3RfaGVhZCBlbnVtX2Jsb2JfbGlzdDsKK307CisKK3N0cnVjdCBkcm1fY3J0YzsKK3N0cnVjdCBkcm1fY29ubmVjdG9yOworc3RydWN0IGRybV9lbmNvZGVyOworCisvKioKKyAqIGRybV9jcnRjX2Z1bmNzIC0gY29udHJvbCBDUlRDcyBmb3IgYSBnaXZlbiBkZXZpY2UKKyAqIEBkcG1zOiBjb250cm9sIGRpc3BsYXkgcG93ZXIgbGV2ZWxzCisgKiBAc2F2ZTogc2F2ZSBDUlRDIHN0YXRlCisgKiBAcmVzb3JlOiByZXN0b3JlIENSVEMgc3RhdGUKKyAqIEBsb2NrOiBsb2NrIHRoZSBDUlRDCisgKiBAdW5sb2NrOiB1bmxvY2sgdGhlIENSVEMKKyAqIEBzaGFkb3dfYWxsb2NhdGU6IGFsbG9jYXRlIHNoYWRvdyBwaXhtYXAKKyAqIEBzaGFkb3dfY3JlYXRlOiBjcmVhdGUgc2hhZG93IHBpeG1hcCBmb3Igcm90YXRpb24gc3VwcG9ydAorICogQHNoYWRvd19kZXN0cm95OiBmcmVlIHNoYWRvdyBwaXhtYXAKKyAqIEBtb2RlX2ZpeHVwOiBmaXh1cCBwcm9wb3NlZCBtb2RlCisgKiBAbW9kZV9zZXQ6IHNldCB0aGUgZGVzaXJlZCBtb2RlIG9uIHRoZSBDUlRDCisgKiBAZ2FtbWFfc2V0OiBzcGVjaWZ5IGNvbG9yIHJhbXAgZm9yIENSVEMKKyAqIEBkZXN0cm95OiBkZWluaXQgYW5kIGZyZWUgb2JqZWN0LgorICoKKyAqIFRoZSBkcm1fY3J0Y19mdW5jcyBzdHJ1Y3R1cmUgaXMgdGhlIGNlbnRyYWwgQ1JUQyBtYW5hZ2VtZW50IHN0cnVjdHVyZQorICogaW4gdGhlIERSTS4gIEVhY2ggQ1JUQyBjb250cm9scyBvbmUgb3IgbW9yZSBjb25uZWN0b3JzIChub3RlIHRoYXQgdGhlIG5hbWUKKyAqIENSVEMgaXMgc2ltcGx5IGhpc3RvcmljYWwsIGEgQ1JUQyBtYXkgY29udHJvbCBMVkRTLCBWR0EsIERWSSwgVFYgb3V0LCBldGMuCisgKiBjb25uZWN0b3JzLCBub3QganVzdCBDUlRzKS4KKyAqCisgKiBFYWNoIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBvdXQgdGhpcyBzdHJ1Y3R1cmUgYXQgc3RhcnR1cCB0aW1lLAorICogaW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIG90aGVyIG1vZGVzZXR0aW5nIGZlYXR1cmVzLCBsaWtlIGkyYyBhbmQgRERDCisgKiBidXMgYWNjZXNzb3JzLgorICovCitzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgeworCS8qIFNhdmUgQ1JUQyBzdGF0ZSAqLworCXZvaWQgKCpzYXZlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOyAvKiBzdXNwZW5kPyAqLworCS8qIFJlc3RvcmUgQ1JUQyBzdGF0ZSAqLworCXZvaWQgKCpyZXN0b3JlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOyAvKiByZXN1bWU/ICovCisKKwkvKiBjdXJzb3IgY29udHJvbHMgKi8KKwlpbnQgKCpjdXJzb3Jfc2V0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworCWludCAoKmN1cnNvcl9tb3ZlKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSk7CisKKwkvKiBTZXQgZ2FtbWEgb24gdGhlIENSVEMgKi8KKwl2b2lkICgqZ2FtbWFfc2V0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqciwgdTE2ICpnLCB1MTYgKmIsCisJCQkgIHVpbnQzMl90IHNpemUpOworCS8qIE9iamVjdCBkZXN0cm95IHJvdXRpbmUgKi8KKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKworCWludCAoKnNldF9jb25maWcpKHN0cnVjdCBkcm1fbW9kZV9zZXQgKnNldCk7Cit9OworCisvKioKKyAqIGRybV9jcnRjIC0gY2VudHJhbCBDUlRDIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAZW5hYmxlZDogaXMgdGhpcyBDUlRDIGVuYWJsZWQ/CisgKiBAeDogeCBwb3NpdGlvbiBvbiBzY3JlZW4KKyAqIEB5OiB5IHBvc2l0aW9uIG9uIHNjcmVlbgorICogQGRlc2lyZWRfbW9kZTogbmV3IGRlc2lyZWQgbW9kZQorICogQGRlc2lyZWRfeDogZGVzaXJlZCB4IGZvciBkZXNpcmVkX21vZGUKKyAqIEBkZXNpcmVkX3k6IGRlc2lyZWQgeSBmb3IgZGVzaXJlZF9tb2RlCisgKiBAZnVuY3M6IENSVEMgY29udHJvbCBmdW5jdGlvbnMKKyAqCisgKiBFYWNoIENSVEMgbWF5IGhhdmUgb25lIG9yIG1vcmUgY29ubmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGlzIHN0cnVjdHVyZQorICogYWxsb3dzIHRoZSBDUlRDIHRvIGJlIGNvbnRyb2xsZWQuCisgKi8KK3N0cnVjdCBkcm1fY3J0YyB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0IGJhc2U7CisKKwkvKiBmcmFtZWJ1ZmZlciB0aGUgY29ubmVjdG9yIGlzIGN1cnJlbnRseSBib3VuZCB0byAqLworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCisJYm9vbCBlbmFibGVkOworCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbW9kZTsKKworCWludCB4LCB5OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkZXNpcmVkX21vZGU7CisJaW50IGRlc2lyZWRfeCwgZGVzaXJlZF95OworCWNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyAqZnVuY3M7CisKKwkvKiBDUlRDIGdhbW1hIHNpemUgZm9yIHJlcG9ydGluZyB0byB1c2Vyc3BhY2UgKi8KKwl1aW50MzJfdCBnYW1tYV9zaXplOworCXVpbnQxNl90ICpnYW1tYV9zdG9yZTsKKworCS8qIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGhlbHBlciAqLworCXZvaWQgKmhlbHBlcl9wcml2YXRlOworfTsKKworCisvKioKKyAqIGRybV9jb25uZWN0b3JfZnVuY3MgLSBjb250cm9sIGNvbm5lY3RvcnMgb24gYSBnaXZlbiBkZXZpY2UKKyAqIEBkcG1zOiBzZXQgcG93ZXIgc3RhdGUgKHNlZSBkcm1fY3J0Y19mdW5jcyBhYm92ZSkKKyAqIEBzYXZlOiBzYXZlIGNvbm5lY3RvciBzdGF0ZQorICogQHJlc3RvcmU6IHJlc3RvcmUgY29ubmVjdG9yIHN0YXRlCisgKiBAbW9kZV92YWxpZDogaXMgdGhpcyBtb2RlIHZhbGlkIG9uIHRoZSBnaXZlbiBjb25uZWN0b3I/CisgKiBAbW9kZV9maXh1cDogdHJ5IHRvIGZpeHVwIHByb3Bvc2VkIG1vZGUgZm9yIHRoaXMgY29ubmVjdG9yCisgKiBAbW9kZV9zZXQ6IHNldCB0aGlzIG1vZGUKKyAqIEBkZXRlY3Q6IGlzIHRoaXMgY29ubmVjdG9yIGFjdGl2ZT8KKyAqIEBnZXRfbW9kZXM6IGdldCBtb2RlIGxpc3QgZm9yIHRoaXMgY29ubmVjdG9yCisgKiBAc2V0X3Byb3BlcnR5OiBwcm9wZXJ0eSBmb3IgdGhpcyBjb25uZWN0b3IgbWF5IG5lZWQgdXBkYXRlCisgKiBAZGVzdHJveTogbWFrZSBvYmplY3QgZ28gYXdheQorICoKKyAqIEVhY2ggQ1JUQyBtYXkgaGF2ZSBvbmUgb3IgbW9yZSBjb25uZWN0b3JzIGF0dGFjaGVkIHRvIGl0LiAgVGhlIGZ1bmN0aW9ucworICogYmVsb3cgYWxsb3cgdGhlIGNvcmUgRFJNIGNvZGUgdG8gY29udHJvbCBjb25uZWN0b3JzLCBlbnVtZXJhdGUgYXZhaWxhYmxlIG1vZGVzLAorICogZXRjLgorICovCitzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyB7CisJdm9pZCAoKmRwbXMpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBtb2RlKTsKKwl2b2lkICgqc2F2ZSkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CisJdm9pZCAoKnJlc3RvcmUpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgKCpkZXRlY3QpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCXZvaWQgKCpmaWxsX21vZGVzKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1aW50MzJfdCBtYXhfd2lkdGgsIHVpbnQzMl90IG1heF9oZWlnaHQpOworCWludCAoKnNldF9wcm9wZXJ0eSkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkgICAgIHVpbnQ2NF90IHZhbCk7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworfTsKKworc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIHsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK307CisKKyNkZWZpbmUgRFJNX0NPTk5FQ1RPUl9NQVhfVU1PREVTIDE2CisjZGVmaW5lIERSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZIDE2CisjZGVmaW5lIERSTV9DT05ORUNUT1JfTEVOIDMyCisjZGVmaW5lIERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVIgMgorCisvKioKKyAqIGRybV9lbmNvZGVyIC0gY2VudHJhbCBEUk0gZW5jb2RlciBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGRybV9lbmNvZGVyIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKworCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgYmFzZTsKKwlpbnQgZW5jb2Rlcl90eXBlOworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzOworCXVpbnQzMl90IHBvc3NpYmxlX2Nsb25lczsKKworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwljb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgKmZ1bmNzOworCXZvaWQgKmhlbHBlcl9wcml2YXRlOworfTsKKworLyoqCisgKiBkcm1fY29ubmVjdG9yIC0gY2VudHJhbCBEUk0gY29ubmVjdG9yIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAY3J0YzogQ1JUQyB0aGlzIGNvbm5lY3RvciBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLCBOVUxMIGlmIG5vbmUKKyAqIEBpbnRlcmxhY2VfYWxsb3dlZDogY2FuIHRoaXMgY29ubmVjdG9yIGhhbmRsZSBpbnRlcmxhY2VkIG1vZGVzPworICogQGRvdWJsZXNjYW5fYWxsb3dlZDogY2FuIHRoaXMgY29ubmVjdG9yIGhhbmRsZSBkb3VibGVzY2FuPworICogQGF2YWlsYWJsZV9tb2RlczogbW9kZXMgYXZhaWxhYmxlIG9uIHRoaXMgY29ubmVjdG9yIChmcm9tIGdldF9tb2RlcygpICsgdXNlcikKKyAqIEBpbml0aWFsX3g6IGluaXRpYWwgeCBwb3NpdGlvbiBmb3IgdGhpcyBjb25uZWN0b3IKKyAqIEBpbml0aWFsX3k6IGluaXRpYWwgeSBwb3NpdGlvbiBmb3IgdGhpcyBjb25uZWN0b3IKKyAqIEBzdGF0dXM6IGNvbm5lY3RvciBjb25uZWN0ZWQ/CisgKiBAZnVuY3M6IGNvbm5lY3RvciBjb250cm9sIGZ1bmN0aW9ucworICoKKyAqIEVhY2ggY29ubmVjdG9yIG1heSBiZSBjb25uZWN0ZWQgdG8gb25lIG9yIG1vcmUgQ1JUQ3MsIG9yIG1heSBiZSBjbG9uYWJsZSBieQorICogYW5vdGhlciBjb25uZWN0b3IgaWYgdGhleSBjYW4gc2hhcmUgYSBDUlRDLiAgRWFjaCBjb25uZWN0b3IgYWxzbyBoYXMgYSBzcGVjaWZpYworICogcG9zaXRpb24gaW4gdGhlIGJyb2FkZXIgZGlzcGxheSAocmVmZXJyZWQgdG8gYXMgYSAnc2NyZWVuJyB0aG91Z2ggaXQgY291bGQKKyAqIHNwYW4gbXVsdGlwbGUgbW9uaXRvcnMpLgorICovCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlIGtkZXY7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHI7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCisJc3RydWN0IGRybV9tb2RlX29iamVjdCBiYXNlOworCisJaW50IGNvbm5lY3Rvcl90eXBlOworCWludCBjb25uZWN0b3JfdHlwZV9pZDsKKwlib29sIGludGVybGFjZV9hbGxvd2VkOworCWJvb2wgZG91Ymxlc2Nhbl9hbGxvd2VkOworCXN0cnVjdCBsaXN0X2hlYWQgbW9kZXM7IC8qIGxpc3Qgb2YgbW9kZXMgb24gdGhpcyBjb25uZWN0b3IgKi8KKworCWludCBpbml0aWFsX3gsIGluaXRpYWxfeTsKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1czsKKworCS8qIHRoZXNlIGFyZSBtb2RlcyBhZGRlZCBieSBwcm9iaW5nIHdpdGggRERDIG9yIHRoZSBCSU9TICovCisJc3RydWN0IGxpc3RfaGVhZCBwcm9iZWRfbW9kZXM7CisKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfaW5mbyBkaXNwbGF5X2luZm87CisJY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgKmZ1bmNzOworCisJc3RydWN0IGxpc3RfaGVhZCB1c2VyX21vZGVzOworCXN0cnVjdCBkcm1fcHJvcGVydHlfYmxvYiAqZWRpZF9ibG9iX3B0cjsKKwl1MzIgcHJvcGVydHlfaWRzW0RSTV9DT05ORUNUT1JfTUFYX1BST1BFUlRZXTsKKwl1aW50NjRfdCBwcm9wZXJ0eV92YWx1ZXNbRFJNX0NPTk5FQ1RPUl9NQVhfUFJPUEVSVFldOworCisJdm9pZCAqaGVscGVyX3ByaXZhdGU7CisKKwl1aW50MzJfdCBlbmNvZGVyX2lkc1tEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSXTsKKwl1aW50MzJfdCBmb3JjZV9lbmNvZGVyX2lkOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsgLyogY3VycmVudGx5IGFjdGl2ZSBlbmNvZGVyICovCit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fbW9kZV9zZXQKKyAqCisgKiBSZXByZXNlbnRzIGEgc2luZ2xlIGNydGMgdGhlIGNvbm5lY3RvcnMgdGhhdCBpdCBkcml2ZXMgd2l0aCB3aGF0IG1vZGUKKyAqIGFuZCBmcm9tIHdoaWNoIGZyYW1lYnVmZmVyIGl0IHNjYW5zIG91dCBmcm9tLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBzZXQgbW9kZXMuCisgKi8KK3N0cnVjdCBkcm1fbW9kZV9zZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKworCXVpbnQzMl90IHg7CisJdWludDMyX3QgeTsKKworCXN0cnVjdCBkcm1fY29ubmVjdG9yICoqY29ubmVjdG9yczsKKwlzaXplX3QgbnVtX2Nvbm5lY3RvcnM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgLSBjb25maWd1cmUgQ1JUQ3MgZm9yIGEgZ2l2ZW4gc2NyZWVuIGxheW91dAorICogQHJlc2l6ZTogYWRqdXN0IENSVENzIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHByb3Bvc2VkIGxheW91dAorICoKKyAqIEN1cnJlbnRseSBvbmx5IGEgcmVzaXplIGhvb2sgaXMgYXZhaWxhYmxlLiAgRFJNIHdpbGwgY2FsbCBiYWNrIGludG8gdGhlCisgKiBkcml2ZXIgd2l0aCBhIG5ldyBzY3JlZW4gd2lkdGggYW5kIGhlaWdodC4gIElmIHRoZSBkcml2ZXIgY2FuJ3Qgc3VwcG9ydAorICogdGhlIHByb3Bvc2VkIHNpemUsIGl0IGNhbiByZXR1cm4gZmFsc2UuICBPdGhlcndpc2UgaXQgc2hvdWxkIGFkanVzdAorICogdGhlIENSVEM8LT5jb25uZWN0b3IgbWFwcGluZ3MgYXMgbmVlZGVkIGFuZCB1cGRhdGUgaXRzIHZpZXcgb2YgdGhlIHNjcmVlbi4KKyAqLworc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyB7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqKCpmYl9jcmVhdGUpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCk7CisJaW50ICgqZmJfY2hhbmdlZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgeworCXVpbnQzMl90IG51bV9jcnRjczsKKwl1aW50MzJfdCBudW1fZW5jb2RlcnM7CisJdWludDMyX3QgbnVtX2Nvbm5lY3RvcnM7CisKKwkvKiBsaXN0IG9mIG9iamVjdCBJRHMgZm9yIHRoaXMgZ3JvdXAgKi8KKwl1aW50MzJfdCAqaWRfbGlzdDsKK307CisKKy8qKgorICogZHJtX21vZGVfY29uZmlnIC0gTW9kZSBjb25maWd1cmF0aW9uIGNvbnRyb2wgc3RydWN0dXJlCisgKgorICovCitzdHJ1Y3QgZHJtX21vZGVfY29uZmlnIHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7IC8qIHByb3RlY3RzIGNvbmZpZ3VyYXRpb24gYW5kIElEUiAqLworCXN0cnVjdCBpZHIgY3J0Y19pZHI7IC8qIHVzZSB0aGlzIGlkciBmb3IgYWxsIElEcywgZmIsIGNydGMsIGNvbm5lY3RvciwgbW9kZXMgLSBqdXN0IG1ha2VzIGxpZmUgZWFzaWVyICovCisJLyogdGhpcyBpcyBsaW1pdGVkIHRvIG9uZSBmb3Igbm93ICovCisJaW50IG51bV9mYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZiX2xpc3Q7CisJaW50IG51bV9jb25uZWN0b3I7CisJc3RydWN0IGxpc3RfaGVhZCBjb25uZWN0b3JfbGlzdDsKKwlpbnQgbnVtX2VuY29kZXI7CisJc3RydWN0IGxpc3RfaGVhZCBlbmNvZGVyX2xpc3Q7CisKKwlpbnQgbnVtX2NydGM7CisJc3RydWN0IGxpc3RfaGVhZCBjcnRjX2xpc3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByb3BlcnR5X2xpc3Q7CisKKwkvKiBpbi1rZXJuZWwgZnJhbWVidWZmZXJzIC0gaHVuZyBvZiBmaWxwX2hlYWQgaW4gZHJtX2ZyYW1lYnVmZmVyICovCisJc3RydWN0IGxpc3RfaGVhZCBmYl9rZXJuZWxfbGlzdDsKKworCWludCBtaW5fd2lkdGgsIG1pbl9oZWlnaHQ7CisJaW50IG1heF93aWR0aCwgbWF4X2hlaWdodDsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzICpmdW5jczsKKwl1bnNpZ25lZCBsb25nIGZiX2Jhc2U7CisKKwkvKiBwb2ludGVycyB0byBzdGFuZGFyZCBwcm9wZXJ0aWVzICovCisJc3RydWN0IGxpc3RfaGVhZCBwcm9wZXJ0eV9ibG9iX2xpc3Q7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqZWRpZF9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkcG1zX3Byb3BlcnR5OworCisJLyogRFZJLUkgcHJvcGVydGllcyAqLworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmR2aV9pX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkdmlfaV9zZWxlY3Rfc3ViY29ubmVjdG9yX3Byb3BlcnR5OworCisJLyogVFYgcHJvcGVydGllcyAqLworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICp0dl9zZWxlY3Rfc3ViY29ubmVjdG9yX3Byb3BlcnR5OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X21vZGVfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqdHZfbGVmdF9tYXJnaW5fcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqdHZfcmlnaHRfbWFyZ2luX3Byb3BlcnR5OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKnR2X3RvcF9tYXJnaW5fcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqdHZfYm90dG9tX21hcmdpbl9wcm9wZXJ0eTsKKworCS8qIE9wdGlvbmFsIHByb3BlcnRpZXMgKi8KKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpzY2FsaW5nX21vZGVfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqZGl0aGVyaW5nX21vZGVfcHJvcGVydHk7Cit9OworCisjZGVmaW5lIG9ial90b19jcnRjKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHJtX2NydGMsIGJhc2UpCisjZGVmaW5lIG9ial90b19jb25uZWN0b3IoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBkcm1fY29ubmVjdG9yLCBiYXNlKQorI2RlZmluZSBvYmpfdG9fZW5jb2Rlcih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRybV9lbmNvZGVyLCBiYXNlKQorI2RlZmluZSBvYmpfdG9fbW9kZSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGJhc2UpCisjZGVmaW5lIG9ial90b19mYih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciwgYmFzZSkKKyNkZWZpbmUgb2JqX3RvX3Byb3BlcnR5KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHJtX3Byb3BlcnR5LCBiYXNlKQorI2RlZmluZSBvYmpfdG9fYmxvYih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRybV9wcm9wZXJ0eV9ibG9iLCBiYXNlKQorCisKK2V4dGVybiB2b2lkIGRybV9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgKmZ1bmNzKTsKK2V4dGVybiB2b2lkIGRybV9jcnRjX2NsZWFudXAoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKworZXh0ZXJuIHZvaWQgZHJtX2Nvbm5lY3Rvcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyAqZnVuY3MsCisJCQkgICAgaW50IGNvbm5lY3Rvcl90eXBlKTsKKworZXh0ZXJuIHZvaWQgZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCitleHRlcm4gdm9pZCBkcm1fZW5jb2Rlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzICpmdW5jcywKKwkJCSAgICAgaW50IGVuY29kZXJfdHlwZSk7CisKK2V4dGVybiB2b2lkIGRybV9lbmNvZGVyX2NsZWFudXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKworZXh0ZXJuIGNoYXIgKmRybV9nZXRfY29ubmVjdG9yX25hbWUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CitleHRlcm4gY2hhciAqZHJtX2dldF9kcG1zX25hbWUoaW50IHZhbCk7CitleHRlcm4gY2hhciAqZHJtX2dldF9kdmlfaV9zdWJjb25uZWN0b3JfbmFtZShpbnQgdmFsKTsKK2V4dGVybiBjaGFyICpkcm1fZ2V0X2R2aV9pX3NlbGVjdF9uYW1lKGludCB2YWwpOworZXh0ZXJuIGNoYXIgKmRybV9nZXRfdHZfc3ViY29ubmVjdG9yX25hbWUoaW50IHZhbCk7CitleHRlcm4gY2hhciAqZHJtX2dldF90dl9zZWxlY3RfbmFtZShpbnQgdmFsKTsKK2V4dGVybiB2b2lkIGRybV9mYl9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tb2RlX2dyb3VwICpncm91cCk7CitleHRlcm4gc3RydWN0IGVkaWQgKmRybV9nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmRybV9kb19wcm9iZV9kZGNfZWRpZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIGludCBkcm1fYWRkX2VkaWRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpOworZXh0ZXJuIHZvaWQgZHJtX21vZGVfcHJvYmVkX2FkZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CitleHRlcm4gdm9pZCBkcm1fbW9kZV9yZW1vdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9kdXBsaWNhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworZXh0ZXJuIHZvaWQgZHJtX21vZGVfY29uZmlnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fbW9kZV9jb25maWdfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9tb2RlX3NldF9uYW1lKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiBib29sIGRybV9tb2RlX2VxdWFsKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMSwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUyKTsKK2V4dGVybiBpbnQgZHJtX21vZGVfd2lkdGgoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworZXh0ZXJuIGludCBkcm1fbW9kZV9oZWlnaHQoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworCisvKiBmb3IgdXMgYnkgZmIgbW9kdWxlICovCitleHRlcm4gaW50IGRybV9tb2RlX2F0dGFjaG1vZGVfY3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZGV0YWNobW9kZV9jcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKKworZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fbW9kZV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGRybV9tb2RlX2xpc3RfY29uY2F0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKm5ldyk7CitleHRlcm4gdm9pZCBkcm1fbW9kZV92YWxpZGF0ZV9zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqbW9kZV9saXN0LAorCQkJCSAgIGludCBtYXhYLCBpbnQgbWF4WSwgaW50IG1heFBpdGNoKTsKK2V4dGVybiB2b2lkIGRybV9tb2RlX3BydW5lX2ludmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICptb2RlX2xpc3QsIGJvb2wgdmVyYm9zZSk7CitleHRlcm4gdm9pZCBkcm1fbW9kZV9zb3J0KHN0cnVjdCBsaXN0X2hlYWQgKm1vZGVfbGlzdCk7CitleHRlcm4gaW50IGRybV9tb2RlX3ZyZWZyZXNoKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGRybV9tb2RlX3NldF9jcnRjaW5mbyhzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcCwKKwkJCQkgIGludCBhZGp1c3RfZmxhZ3MpOworZXh0ZXJuIHZvaWQgZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworZXh0ZXJuIGludCBkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJCXN0cnVjdCBlZGlkICplZGlkKTsKK2V4dGVybiBpbnQgZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCQkgdWludDY0X3QgdmFsdWUpOworZXh0ZXJuIGludCBkcm1fY29ubmVjdG9yX3Byb3BlcnR5X2dldF92YWx1ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQkgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkJCSB1aW50NjRfdCAqdmFsdWUpOworZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fY3J0Y19tb2RlX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9mcmFtZWJ1ZmZlcl9zZXRfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaGFuZGxlKTsKK2V4dGVybiBpbnQgZHJtX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQljb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzICpmdW5jcyk7CitleHRlcm4gdm9pZCBkcm1fZnJhbWVidWZmZXJfY2xlYW51cChzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7CitleHRlcm4gaW50IGRybWZiX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitleHRlcm4gaW50IGRybWZiX3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYik7CitleHRlcm4gdm9pZCBkcm1fY3J0Y19wcm9iZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1heFgsIGludCBtYXhZKTsKK2V4dGVybiBib29sIGRybV9jcnRjX2luX3VzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworCitleHRlcm4gaW50IGRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksIHVpbnQ2NF90IGluaXRfdmFsKTsKK2V4dGVybiBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpkcm1fcHJvcGVydHlfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBmbGFncywKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBudW1fdmFsdWVzKTsKK2V4dGVybiB2b2lkIGRybV9wcm9wZXJ0eV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5KTsKK2V4dGVybiBpbnQgZHJtX3Byb3BlcnR5X2FkZF9lbnVtKHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LCBpbnQgaW5kZXgsCisJCQkJIHVpbnQ2NF90IHZhbHVlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgZHJtX21vZGVfY3JlYXRlX2R2aV9pX3Byb3BlcnRpZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGRybV9tb2RlX2NyZWF0ZV90dl9wcm9wZXJ0aWVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBudW1fZm9ybWF0cywKKwkJCQkgICAgIGNoYXIgKmZvcm1hdHNbXSk7CitleHRlcm4gaW50IGRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGRybV9tb2RlX2NyZWF0ZV9kaXRoZXJpbmdfcHJvcGVydHkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gY2hhciAqZHJtX2dldF9lbmNvZGVyX25hbWUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKworZXh0ZXJuIGludCBkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHZvaWQgZHJtX21vZGVfY29ubmVjdG9yX2RldGFjaF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJCSAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CitleHRlcm4gYm9vbCBkcm1fbW9kZV9jcnRjX3NldF9nYW1tYV9zaXplKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkJIGludCBnYW1tYV9zaXplKTsKK2V4dGVybiB2b2lkICpkcm1fbW9kZV9vYmplY3RfZmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBpZCwgdWludDMyX3QgdHlwZSk7CisvKiBJT0NUTHMgKi8KK2V4dGVybiBpbnQgZHJtX21vZGVfZ2V0cmVzb3VyY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworZXh0ZXJuIGludCBkcm1fbW9kZV9nZXRjcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9nZXRjb25uZWN0b3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfc2V0Y3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfY3Vyc29yX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9hZGRmYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IGRybV9tb2RlX3JtZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IGRybV9tb2RlX2dldGZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfYWRkbW9kZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9ybW1vZGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9hdHRhY2htb2RlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IGRybV9tb2RlX2RldGFjaG1vZGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworZXh0ZXJuIGludCBkcm1fbW9kZV9nZXRwcm9wZXJ0eV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZ2V0YmxvYl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9jb25uZWN0b3JfcHJvcGVydHlfc2V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfaG90cGx1Z19pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCBkcm1fbW9kZV9yZXBsYWNlZmIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZ2V0ZW5jb2RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZ2FtbWFfZ2V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgZHJtX21vZGVfZ2FtbWFfc2V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKyNlbmRpZiAvKiBfX0RSTV9DUlRDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Y19oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmMwNGNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBLZWl0aCBQYWNrYXJkCisgKiBDb3B5cmlnaHQgwqkgMjAwNy0yMDA4IERhdmUgQWlybGllCisgKiBDb3B5cmlnaHQgwqkgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVGhlIERSTSBtb2RlIHNldHRpbmcgaGVscGVyIGZ1bmN0aW9ucyBhcmUgY29tbW9uIGNvZGUgZm9yIGRyaXZlcnMgdG8gdXNlIGlmCisgKiB0aGV5IHdpc2guICBEcml2ZXJzIGFyZSBub3QgZm9yY2VkIHRvIHVzZSB0aGlzIGNvZGUgaW4gdGhlaXIKKyAqIGltcGxlbWVudGF0aW9ucyBidXQgaXQgd291bGQgYmUgdXNlZnVsIGlmIHRoZXkgY29kZSB0aGV5IGRvIHVzZSBhdCBsZWFzdAorICogcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSBhbmQgb3BlcmF0aW9uIHRvIHVzZXJzcGFjZQorICovCisKKyNpZm5kZWYgX19EUk1fQ1JUQ19IRUxQRVJfSF9fCisjZGVmaW5lIF9fRFJNX0NSVENfSEVMUEVSX0hfXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyB7CisJLyoKKwkgKiBDb250cm9sIHBvd2VyIGxldmVscyBvbiB0aGUgQ1JUQy4gIElmIHRoZSBtb2RlIHBhc3NlZCBpbiBpcworCSAqIHVuc3VwcG9ydGVkLCB0aGUgcHJvdmlkZXIgbXVzdCB1c2UgdGhlIG5leHQgbG93ZXN0IHBvd2VyIGxldmVsLgorCSAqLworCXZvaWQgKCpkcG1zKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKTsKKwl2b2lkICgqcHJlcGFyZSkoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKwl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworCisJLyogUHJvdmlkZXIgY2FuIGZpeHVwIG9yIGNoYW5nZSBtb2RlIHRpbWluZ3MgYmVmb3JlIG1vZGVzZXQgb2NjdXJzICovCisJYm9vbCAoKm1vZGVfZml4dXApKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOworCS8qIEFjdHVhbGx5IHNldCB0aGUgbW9kZSAqLworCXZvaWQgKCptb2RlX3NldCkoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwgaW50IHgsIGludCB5LAorCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYik7CisKKwkvKiBNb3ZlIHRoZSBjcnRjIG9uIHRoZSBjdXJyZW50IGZiIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiAqb3B0aW9uYWwqICovCisJdm9pZCAoKm1vZGVfc2V0X2Jhc2UpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAorCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKTsKK307CisKK3N0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgeworCXZvaWQgKCpkcG1zKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKTsKKwl2b2lkICgqc2F2ZSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKwl2b2lkICgqcmVzdG9yZSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKworCWJvb2wgKCptb2RlX2ZpeHVwKShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKKwl2b2lkICgqcHJlcGFyZSkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKwl2b2lkICgqY29tbWl0KShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworCXZvaWQgKCptb2RlX3NldCkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKTsKKwkvKiBkZXRlY3QgZm9yIERBQyBzdHlsZSBlbmNvZGVycyAqLworCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgKCpkZXRlY3QpKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworfTsKKworc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIHsKKwlpbnQgKCpnZXRfbW9kZXMpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCWludCAoKm1vZGVfdmFsaWQpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKigqYmVzdF9lbmNvZGVyKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK307CisKK2V4dGVybiB2b2lkIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1aW50MzJfdCBtYXhYLCB1aW50MzJfdCBtYXhZKTsKK2V4dGVybiB2b2lkIGRybV9oZWxwZXJfZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBkcm1faGVscGVyX2hvdHBsdWdfc3RhZ2VfdHdvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGJvb2wgZHJtX2hlbHBlcl9pbml0aWFsX2NvbmZpZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGNhbl9ncm93KTsKK2V4dGVybiBpbnQgZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcoc3RydWN0IGRybV9tb2RlX3NldCAqc2V0KTsKK2V4dGVybiBib29sIGRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICAgIGludCB4LCBpbnQgeSwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYik7CitleHRlcm4gYm9vbCBkcm1faGVscGVyX2NydGNfaW5fdXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisKK2V4dGVybiBpbnQgZHJtX2hlbHBlcl9tb2RlX2ZpbGxfZmJfc3RydWN0KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kKTsKKworc3RhdGljIGlubGluZSB2b2lkIGRybV9jcnRjX2hlbHBlcl9hZGQoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpmdW5jcykKK3sKKwljcnRjLT5oZWxwZXJfcHJpdmF0ZSA9ICh2b2lkICopZnVuY3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpmdW5jcykKK3sKKwllbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZSA9ICh2b2lkICopZnVuY3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyAqZnVuY3MpCit7CisJY29ubmVjdG9yLT5oZWxwZXJfcHJpdmF0ZSA9ICh2b2lkICopZnVuY3M7Cit9CisKK2V4dGVybiBpbnQgZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaCBiL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwN2MxNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfX0RSTV9FRElEX0hfXworI2RlZmluZSBfX0RSTV9FRElEX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFRElEX0xFTkdUSCAxMjgKKyNkZWZpbmUgRERDX0FERFIgMHg1MAorCisjaWZkZWYgQklHX0VORElBTgorI2Vycm9yICJFRElEIHN0cnVjdHVyZSBpcyBsaXR0bGUgZW5kaWFuLCBuZWVkIGJpZyBlbmRpYW4gdmVyc2lvbnMiCisjZWxzZQorCitzdHJ1Y3QgZXN0X3RpbWluZ3MgeworCXU4IHQxOworCXU4IHQyOworCXU4IG1mZ19yc3ZkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHN0ZF90aW1pbmcgeworCXU4IGhzaXplOyAvKiBuZWVkIHRvIG11bHRpcGx5IGJ5IDggdGhlbiBhZGQgMjQ4ICovCisJdTggdmZyZXE6NjsgLyogbmVlZCB0byBhZGQgNjAgKi8KKwl1OCBhc3BlY3RfcmF0aW86MjsgLyogMDA9MTY6MTAsIDAxPTQ6MywgMTA9NTo0LCAxMT0xNjo5ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBJZiBkZXRhaWxlZCBkYXRhIGlzIHBpeGVsIHRpbWluZyAqLworc3RydWN0IGRldGFpbGVkX3BpeGVsX3RpbWluZyB7CisJdTggaGFjdGl2ZV9sbzsKKwl1OCBoYmxhbmtfbG87CisJdTggaGJsYW5rX2hpOjQ7CisJdTggaGFjdGl2ZV9oaTo0OworCXU4IHZhY3RpdmVfbG87CisJdTggdmJsYW5rX2xvOworCXU4IHZibGFua19oaTo0OworCXU4IHZhY3RpdmVfaGk6NDsKKwl1OCBoc3luY19vZmZzZXRfbG87CisJdTggaHN5bmNfcHVsc2Vfd2lkdGhfbG87CisJdTggdnN5bmNfcHVsc2Vfd2lkdGhfbG86NDsKKwl1OCB2c3luY19vZmZzZXRfbG86NDsKKwl1OCBoc3luY19wdWxzZV93aWR0aF9oaToyOworCXU4IGhzeW5jX29mZnNldF9oaToyOworCXU4IHZzeW5jX3B1bHNlX3dpZHRoX2hpOjI7CisJdTggdnN5bmNfb2Zmc2V0X2hpOjI7CisJdTggd2lkdGhfbW1fbG87CisJdTggaGVpZ2h0X21tX2xvOworCXU4IGhlaWdodF9tbV9oaTo0OworCXU4IHdpZHRoX21tX2hpOjQ7CisJdTggaGJvcmRlcjsKKwl1OCB2Ym9yZGVyOworCXU4IHVua25vd24wOjE7CisJdTggdnN5bmNfcG9zaXRpdmU6MTsKKwl1OCBoc3luY19wb3NpdGl2ZToxOworCXU4IHNlcGFyYXRlX3N5bmM6MjsKKwl1OCBzdGVyZW86MTsKKwl1OCB1bmtub3duNjoxOworCXU4IGludGVybGFjZWQ6MTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIElmIGl0J3Mgbm90IHBpeGVsIHRpbWluZywgaXQnbGwgYmUgb25lIG9mIHRoZSBiZWxvdyAqLworc3RydWN0IGRldGFpbGVkX2RhdGFfc3RyaW5nIHsKKwl1OCBzdHJbMTNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGRldGFpbGVkX2RhdGFfbW9uaXRvcl9yYW5nZSB7CisJdTggbWluX3ZmcmVxOworCXU4IG1heF92ZnJlcTsKKwl1OCBtaW5faGZyZXFfa2h6OworCXU4IG1heF9oZnJlcV9raHo7CisJdTggcGl4ZWxfY2xvY2tfbWh6OyAvKiBuZWVkIHRvIG11bHRpcGx5IGJ5IDEwICovCisJdTE2IHNlY19ndGZfdG9nZ2xlOyAvKiBBMDAwPXVzZSBhYm92ZSwgMjA9dXNlIGJlbG93ICovIC8qIEZJWE1FOiBieXRlIG9yZGVyICovCisJdTggaGZyZXFfc3RhcnRfa2h6OyAvKiBuZWVkIHRvIG11bHRpcGx5IGJ5IDIgKi8KKwl1OCBjOyAvKiBuZWVkIHRvIGRpdmlkZSBieSAyICovCisJdTE2IG07IC8qIEZJWE1FOiBieXRlIG9yZGVyICovCisJdTggazsKKwl1OCBqOyAvKiBuZWVkIHRvIGRpdmlkZSBieSAyICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGV0YWlsZWRfZGF0YV93cGluZGV4IHsKKwl1OCB3aGl0ZV95X2xvOjI7CisJdTggd2hpdGVfeF9sbzoyOworCXU4IHBhZDo0OworCXU4IHdoaXRlX3hfaGk7CisJdTggd2hpdGVfeV9oaTsKKwl1OCBnYW1tYTsgLyogbmVlZCB0byBkaXZpZGUgYnkgMTAwIHRoZW4gYWRkIDEgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZXRhaWxlZF9kYXRhX2NvbG9yX3BvaW50IHsKKwl1OCB3aW5kZXgxOworCXU4IHdwaW5kZXgxWzNdOworCXU4IHdpbmRleDI7CisJdTggd3BpbmRleDJbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGV0YWlsZWRfbm9uX3BpeGVsIHsKKwl1OCBwYWQxOworCXU4IHR5cGU7IC8qIGZmPXNlcmlhbCwgZmU9c3RyaW5nLCBmZD1tb25pdG9yIHJhbmdlLCBmYz1tb25pdG9yIG5hbWUKKwkJICAgIGZiPWNvbG9yIHBvaW50IGRhdGEsIGZhPXN0YW5kYXJkIHRpbWluZyBkYXRhLAorCQkgICAgZjk9dW5kZWZpbmVkLCBmOD1tZmcuIHJlc2VydmVkICovCisJdTggcGFkMjsKKwl1bmlvbiB7CisJCXN0cnVjdCBkZXRhaWxlZF9kYXRhX3N0cmluZyBzdHI7CisJCXN0cnVjdCBkZXRhaWxlZF9kYXRhX21vbml0b3JfcmFuZ2UgcmFuZ2U7CisJCXN0cnVjdCBkZXRhaWxlZF9kYXRhX3dwaW5kZXggY29sb3I7CisJCXN0cnVjdCBzdGRfdGltaW5nIHRpbWluZ3NbNV07CisJfSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBFRElEX0RFVEFJTF9TVERfTU9ERVMgMHhmYQorI2RlZmluZSBFRElEX0RFVEFJTF9NT05JVE9SX0NQREFUQSAweGZiCisjZGVmaW5lIEVESURfREVUQUlMX01PTklUT1JfTkFNRSAweGZjCisjZGVmaW5lIEVESURfREVUQUlMX01PTklUT1JfUkFOR0UgMHhmZAorI2RlZmluZSBFRElEX0RFVEFJTF9NT05JVE9SX1NUUklORyAweGZlCisjZGVmaW5lIEVESURfREVUQUlMX01PTklUT1JfU0VSSUFMIDB4ZmYKKworc3RydWN0IGRldGFpbGVkX3RpbWluZyB7CisJdTE2IHBpeGVsX2Nsb2NrOyAvKiBuZWVkIHRvIG11bHRpcGx5IGJ5IDEwIEtIeiAqLyAvKiBGSVhNRTogYnl0ZSBvcmRlciAqLworCXVuaW9uIHsKKwkJc3RydWN0IGRldGFpbGVkX3BpeGVsX3RpbWluZyBwaXhlbF9kYXRhOworCQlzdHJ1Y3QgZGV0YWlsZWRfbm9uX3BpeGVsIG90aGVyX2RhdGE7CisJfSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGVkaWQgeworCXU4IGhlYWRlcls4XTsKKwkvKiBWZW5kb3IgJiBwcm9kdWN0IGluZm8gKi8KKwl1OCBtZmdfaWRbMl07CisJdTggcHJvZF9jb2RlWzJdOworCXUzMiBzZXJpYWw7IC8qIEZJWE1FOiBieXRlIG9yZGVyICovCisJdTggbWZnX3dlZWs7CisJdTggbWZnX3llYXI7CisJLyogRURJRCB2ZXJzaW9uICovCisJdTggdmVyc2lvbjsKKwl1OCByZXZpc2lvbjsKKwkvKiBEaXNwbGF5IGluZm86ICovCisJLyogICBpbnB1dCBkZWZpbml0aW9uICovCisJdTggc2VycmF0aW9uX3ZzeW5jOjE7CisJdTggc3luY19vbl9ncmVlbjoxOworCXU4IGNvbXBvc2l0ZV9zeW5jOjE7CisJdTggc2VwYXJhdGVfc3luY3M6MTsKKwl1OCBibGFua190b19ibGFjazoxOworCXU4IHZpZGVvX2xldmVsOjI7CisJdTggZGlnaXRhbDoxOyAvKiBiaXRzIGJlbG93IG11c3QgYmUgemVybyBpZiBzZXQgKi8KKwl1OCB3aWR0aF9jbTsKKwl1OCBoZWlnaHRfY207CisJdTggZ2FtbWE7CisJLyogICBmZWF0dXJlIHN1cHBvcnQgKi8KKwl1OCBkZWZhdWx0X2d0ZjoxOworCXU4IHByZWZlcnJlZF90aW1pbmc6MTsKKwl1OCBzdGFuZGFyZF9jb2xvcjoxOworCXU4IGRpc3BsYXlfdHlwZToyOyAvKiAwMD1tb25vLCAwMT1yZ2IsIDEwPW5vbi1yZ2IsIDExPXVua25vd24gKi8KKwl1OCBwbV9hY3RpdmVfb2ZmOjE7CisJdTggcG1fc3VzcGVuZDoxOworCXU4IHBtX3N0YW5kYnk6MTsKKwkvKiBDb2xvciBjaGFyYWN0ZXJpc3RpY3MgKi8KKwl1OCByZWRfZ3JlZW5fbG87CisJdTggYmxhY2tfd2hpdGVfbG87CisJdTggcmVkX3g7CisJdTggcmVkX3k7CisJdTggZ3JlZW5feDsKKwl1OCBncmVlbl95OworCXU4IGJsdWVfeDsKKwl1OCBibHVlX3k7CisJdTggd2hpdGVfeDsKKwl1OCB3aGl0ZV95OworCS8qIEVzdC4gdGltaW5ncyBhbmQgbWZnIHJzdmQgdGltaW5ncyovCisJc3RydWN0IGVzdF90aW1pbmdzIGVzdGFibGlzaGVkX3RpbWluZ3M7CisJLyogU3RhbmRhcmQgdGltaW5ncyAxLTgqLworCXN0cnVjdCBzdGRfdGltaW5nIHN0YW5kYXJkX3RpbWluZ3NbOF07CisJLyogRGV0YWlsaW5nIHRpbWluZ3MgMS00ICovCisJc3RydWN0IGRldGFpbGVkX3RpbWluZyBkZXRhaWxlZF90aW1pbmdzWzRdOworCS8qIE51bWJlciBvZiAxMjggYnl0ZSBleHQuIGJsb2NrcyAqLworCXU4IGV4dGVuc2lvbnM7CisJLyogQ2hlY2tzdW0gKi8KKwl1OCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBsaXR0bGUgZW5kaWFuIHN0cnVjdHMgKi8KKworI2RlZmluZSBFRElEX1BST0RVQ1RfSUQoZSkgKChlKS0+cHJvZF9jb2RlWzBdIHwgKChlKS0+cHJvZF9jb2RlWzFdIDw8IDgpKQorCisjZW5kaWYgLyogX19EUk1fRURJRF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2RlLmggYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWQyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgorICogQ29weXJpZ2h0IChjKSAyMDA3IEpha29iIEJvcm5lY3JhbnR6IDx3YWxsYnJha2VyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0IEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFJNX01PREVfSAorI2RlZmluZSBfRFJNX01PREVfSAorCisjaWYgIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX0tFUk5FTCkKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjZW5kaWYKKworI2RlZmluZSBEUk1fRElTUExBWV9JTkZPX0xFTgkzMgorI2RlZmluZSBEUk1fQ09OTkVDVE9SX05BTUVfTEVOCTMyCisjZGVmaW5lIERSTV9ESVNQTEFZX01PREVfTEVOCTMyCisjZGVmaW5lIERSTV9QUk9QX05BTUVfTEVOCTMyCisKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9CVUlMVElOCSgxPDwwKQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0NMT0NLX0MJKCgxPDwxKSB8IERSTV9NT0RFX1RZUEVfQlVJTFRJTikKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9DUlRDX0MJKCgxPDwyKSB8IERSTV9NT0RFX1RZUEVfQlVJTFRJTikKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQJKDE8PDMpCisjZGVmaW5lIERSTV9NT0RFX1RZUEVfREVGQVVMVAkoMTw8NCkKKyNkZWZpbmUgRFJNX01PREVfVFlQRV9VU0VSREVGCSgxPDw1KQorI2RlZmluZSBEUk1fTU9ERV9UWVBFX0RSSVZFUgkoMTw8NikKKworLyogVmlkZW8gbW9kZSBmbGFncyAqLworLyogYml0IGNvbXBhdGlibGUgd2l0aCB0aGUgeG9yZyBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgRFJNX01PREVfRkxBR19QSFNZTkMJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfTkhTWU5DCSgxPDwxKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX1BWU1lOQwkoMTw8MikKKyNkZWZpbmUgRFJNX01PREVfRkxBR19OVlNZTkMJKDE8PDMpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFCSgxPDw0KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0RCTFNDQU4JKDE8PDUpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfQ1NZTkMJKDE8PDYpCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUENTWU5DCSgxPDw3KQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX05DU1lOQwkoMTw8OCkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19IU0tFVwkoMTw8OSkgLyogaHNrZXcgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRFJNX01PREVfRkxBR19CQ0FTVAkoMTw8MTApCisjZGVmaW5lIERSTV9NT0RFX0ZMQUdfUElYTVVYCSgxPDwxMSkKKyNkZWZpbmUgRFJNX01PREVfRkxBR19EQkxDTEsJKDE8PDEyKQorI2RlZmluZSBEUk1fTU9ERV9GTEFHX0NMS0RJVjIJKDE8PDEzKQorCisvKiBEUE1TIGZsYWdzICovCisvKiBiaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB4b3JnIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEUk1fTU9ERV9EUE1TX09OCTAKKyNkZWZpbmUgRFJNX01PREVfRFBNU19TVEFOREJZCTEKKyNkZWZpbmUgRFJNX01PREVfRFBNU19TVVNQRU5ECTIKKyNkZWZpbmUgRFJNX01PREVfRFBNU19PRkYJMworCisvKiBTY2FsaW5nIG1vZGUgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9OT05fR1BVCQkwCisjZGVmaW5lIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4JMQorI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9OT19TQ0FMRQkJMgorI2RlZmluZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1QJCTMKKworLyogRGl0aGVyaW5nIG1vZGUgb3B0aW9ucyAqLworI2RlZmluZSBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGCTAKKyNkZWZpbmUgRFJNX01PREVfRElUSEVSSU5HX09OCTEKKworc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIHsKKwl1aW50MzJfdCBjbG9jazsKKwl1aW50MTZfdCBoZGlzcGxheSwgaHN5bmNfc3RhcnQsIGhzeW5jX2VuZCwgaHRvdGFsLCBoc2tldzsKKwl1aW50MTZfdCB2ZGlzcGxheSwgdnN5bmNfc3RhcnQsIHZzeW5jX2VuZCwgdnRvdGFsLCB2c2NhbjsKKworCXVpbnQzMl90IHZyZWZyZXNoOyAvKiB2ZXJ0aWNhbCByZWZyZXNoICogMTAwMCAqLworCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgdHlwZTsKKwljaGFyIG5hbWVbRFJNX0RJU1BMQVlfTU9ERV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2NhcmRfcmVzIHsKKwl1aW50NjRfdCBmYl9pZF9wdHI7CisJdWludDY0X3QgY3J0Y19pZF9wdHI7CisJdWludDY0X3QgY29ubmVjdG9yX2lkX3B0cjsKKwl1aW50NjRfdCBlbmNvZGVyX2lkX3B0cjsKKwl1aW50MzJfdCBjb3VudF9mYnM7CisJdWludDMyX3QgY291bnRfY3J0Y3M7CisJdWludDMyX3QgY291bnRfY29ubmVjdG9yczsKKwl1aW50MzJfdCBjb3VudF9lbmNvZGVyczsKKwl1aW50MzJfdCBtaW5fd2lkdGgsIG1heF93aWR0aDsKKwl1aW50MzJfdCBtaW5faGVpZ2h0LCBtYXhfaGVpZ2h0OworfTsKKworc3RydWN0IGRybV9tb2RlX2NydGMgeworCXVpbnQ2NF90IHNldF9jb25uZWN0b3JzX3B0cjsKKwl1aW50MzJfdCBjb3VudF9jb25uZWN0b3JzOworCisJdWludDMyX3QgY3J0Y19pZDsgLyoqPCBJZCAqLworCXVpbnQzMl90IGZiX2lkOyAvKio8IElkIG9mIGZyYW1lYnVmZmVyICovCisKKwl1aW50MzJfdCB4LCB5OyAvKio8IFBvc2l0aW9uIG9uIHRoZSBmcmFtZXVmZmVyICovCisKKwl1aW50MzJfdCBnYW1tYV9zaXplOworCXVpbnQzMl90IG1vZGVfdmFsaWQ7CisJc3RydWN0IGRybV9tb2RlX21vZGVpbmZvIG1vZGU7Cit9OworCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfTk9ORQkwCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfREFDCTEKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UTURTCTIKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9MVkRTCTMKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQwk0CisKK3N0cnVjdCBkcm1fbW9kZV9nZXRfZW5jb2RlciB7CisJdWludDMyX3QgZW5jb2Rlcl9pZDsKKwl1aW50MzJfdCBlbmNvZGVyX3R5cGU7CisKKwl1aW50MzJfdCBjcnRjX2lkOyAvKio8IElkIG9mIGNydGMgKi8KKworCXVpbnQzMl90IHBvc3NpYmxlX2NydGNzOworCXVpbnQzMl90IHBvc3NpYmxlX2Nsb25lczsKK307CisKKy8qIFRoaXMgaXMgZm9yIGNvbm5lY3RvcnMgd2l0aCBtdWx0aXBsZSBzaWduYWwgdHlwZXMuICovCisvKiBUcnkgdG8gbWF0Y2ggRFJNX01PREVfQ09OTkVDVE9SX1ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZS4gKi8KKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0F1dG9tYXRpYwkwCisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duCTAKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0RWSUQJMworI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJQQk0CisjZGVmaW5lIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGUJNQorI2RlZmluZSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfU1ZJREVPCTYKKyNkZWZpbmUgRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvbmVudAk4CisKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1Vua25vd24JMAorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBCQkxCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJCQkyCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklECQkzCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklBCQk0CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGUJNQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPCTYKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0xWRFMJCTcKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0NvbXBvbmVudAk4CisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOCTkKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0CTEwCisjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQQkxMQorI2RlZmluZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUIJMTIKKworc3RydWN0IGRybV9tb2RlX2dldF9jb25uZWN0b3IgeworCisJdWludDY0X3QgZW5jb2RlcnNfcHRyOworCXVpbnQ2NF90IG1vZGVzX3B0cjsKKwl1aW50NjRfdCBwcm9wc19wdHI7CisJdWludDY0X3QgcHJvcF92YWx1ZXNfcHRyOworCisJdWludDMyX3QgY291bnRfbW9kZXM7CisJdWludDMyX3QgY291bnRfcHJvcHM7CisJdWludDMyX3QgY291bnRfZW5jb2RlcnM7CisKKwl1aW50MzJfdCBlbmNvZGVyX2lkOyAvKio8IEN1cnJlbnQgRW5jb2RlciAqLworCXVpbnQzMl90IGNvbm5lY3Rvcl9pZDsgLyoqPCBJZCAqLworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlOworCXVpbnQzMl90IGNvbm5lY3Rvcl90eXBlX2lkOworCisJdWludDMyX3QgY29ubmVjdGlvbjsKKwl1aW50MzJfdCBtbV93aWR0aCwgbW1faGVpZ2h0OyAvKio8IEh4VyBpbiBtaWxsaW1ldGVycyAqLworCXVpbnQzMl90IHN1YnBpeGVsOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9QUk9QX1BFTkRJTkcJKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX1BST1BfUkFOR0UJKDE8PDEpCisjZGVmaW5lIERSTV9NT0RFX1BST1BfSU1NVVRBQkxFCSgxPDwyKQorI2RlZmluZSBEUk1fTU9ERV9QUk9QX0VOVU0JKDE8PDMpIC8qIGVudW1lcmF0ZWQgdHlwZSB3aXRoIHRleHQgc3RyaW5ncyAqLworI2RlZmluZSBEUk1fTU9ERV9QUk9QX0JMT0IJKDE8PDQpCisKK3N0cnVjdCBkcm1fbW9kZV9wcm9wZXJ0eV9lbnVtIHsKKwl1aW50NjRfdCB2YWx1ZTsKKwljaGFyIG5hbWVbRFJNX1BST1BfTkFNRV9MRU5dOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9wcm9wZXJ0eSB7CisJdWludDY0X3QgdmFsdWVzX3B0cjsgLyogdmFsdWVzIGFuZCBibG9iIGxlbmd0aHMgKi8KKwl1aW50NjRfdCBlbnVtX2Jsb2JfcHRyOyAvKiBlbnVtIGFuZCBibG9iIGlkIHB0cnMgKi8KKworCXVpbnQzMl90IHByb3BfaWQ7CisJdWludDMyX3QgZmxhZ3M7CisJY2hhciBuYW1lW0RSTV9QUk9QX05BTUVfTEVOXTsKKworCXVpbnQzMl90IGNvdW50X3ZhbHVlczsKKwl1aW50MzJfdCBjb3VudF9lbnVtX2Jsb2JzOworfTsKKworc3RydWN0IGRybV9tb2RlX2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkgeworCXVpbnQ2NF90IHZhbHVlOworCXVpbnQzMl90IHByb3BfaWQ7CisJdWludDMyX3QgY29ubmVjdG9yX2lkOworfTsKKworc3RydWN0IGRybV9tb2RlX2dldF9ibG9iIHsKKwl1aW50MzJfdCBibG9iX2lkOworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50NjRfdCBkYXRhOworfTsKKworc3RydWN0IGRybV9tb2RlX2ZiX2NtZCB7CisJdWludDMyX3QgZmJfaWQ7CisJdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKKwl1aW50MzJfdCBwaXRjaDsKKwl1aW50MzJfdCBicHA7CisJdWludDMyX3QgZGVwdGg7CisJLyogZHJpdmVyIHNwZWNpZmljIGhhbmRsZSAqLworCXVpbnQzMl90IGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9tb2RlX2NtZCB7CisJdWludDMyX3QgY29ubmVjdG9yX2lkOworCXN0cnVjdCBkcm1fbW9kZV9tb2RlaW5mbyBtb2RlOworfTsKKworI2RlZmluZSBEUk1fTU9ERV9DVVJTT1JfQk8JKDE8PDApCisjZGVmaW5lIERSTV9NT0RFX0NVUlNPUl9NT1ZFCSgxPDwxKQorCisvKgorICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBpbiBmbGFncyBkaWZmcmVudCBtZW1iZXJzIGFyZSB1c2VkLgorICoKKyAqIENVUlNPUl9CTyB1c2VzCisgKiAgICBjcnRjCisgKiAgICB3aWR0aAorICogICAgaGVpZ2h0CisgKiAgICBoYW5kbGUgLSBpZiAwIHR1cm5zIHRoZSBjdXJzb3Igb2YKKyAqCisgKiBDVVJTT1JfTU9WRSB1c2VzCisgKiAgICBjcnRjCisgKiAgICB4CisgKiAgICB5CisgKi8KK3N0cnVjdCBkcm1fbW9kZV9jdXJzb3IgeworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IGNydGNfaWQ7CisJaW50MzJfdCB4OworCWludDMyX3QgeTsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBoZWlnaHQ7CisJLyogZHJpdmVyIHNwZWNpZmljIGhhbmRsZSAqLworCXVpbnQzMl90IGhhbmRsZTsKK307CisKK3N0cnVjdCBkcm1fbW9kZV9jcnRjX2x1dCB7CisJdWludDMyX3QgY3J0Y19pZDsKKwl1aW50MzJfdCBnYW1tYV9zaXplOworCisJLyogcG9pbnRlcnMgdG8gYXJyYXlzICovCisJdWludDY0X3QgcmVkOworCXVpbnQ2NF90IGdyZWVuOworCXVpbnQ2NF90IGJsdWU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9zYXJlYS5oIGIvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKaW5kZXggNDgwMDM3My4uZWU1Mzg5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3NhcmVhLmgKQEAgLTM2LDEyICszNiwxMiBAQAogCiAvKiBTQVJFQSBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0IGEgcGFnZSAqLwogI2lmIGRlZmluZWQoX19hbHBoYV9fKQotI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMFUKICNlbGlmIGRlZmluZWQoX19pYTY0X18pCi0jZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMAkvKiA2NGtCICovCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMFUJLyogNjRrQiAqLwogI2Vsc2UKIC8qIEludGVsIDgzME0gZHJpdmVyIG5lZWRzIGF0IGxlYXN0IDhrIFNBUkVBICovCi0jZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwVQogI2VuZGlmCiAKIC8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gdGhlIFNBUkVBICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9pOTE1X2RybS5oIGIvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaAppbmRleCAxNTJiMzRkLi5iM2JjZjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9pOTE1X2RybS5oCisrKyBiL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKQEAgLTExMyw4ICsxMTMsMzEgQEAKIAlpbnQgcGlwZUJfeTsKIAlpbnQgcGlwZUJfdzsKIAlpbnQgcGlwZUJfaDsKKworCS8qIGZpbGwgb3V0IHNvbWUgc3BhY2UgZm9yIG9sZCB1c2Vyc3BhY2UgdHJpcGxlIGJ1ZmZlciAqLworCWRybV9oYW5kbGVfdCB1bnVzZWRfaGFuZGxlOworCXVpbnQzMl90IHVudXNlZDEsIHVudXNlZDIsIHVudXNlZDM7CisKKwkvKiBidWZmZXIgb2JqZWN0IGhhbmRsZXMgZm9yIHN0YXRpYyBidWZmZXJzLiBNYXkgY2hhbmdlCisJICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNsaWVudC4KKwkgKi8KKwl1aW50MzJfdCBmcm9udF9ib19oYW5kbGU7CisJdWludDMyX3QgYmFja19ib19oYW5kbGU7CisJdWludDMyX3QgdW51c2VkX2JvX2hhbmRsZTsKKwl1aW50MzJfdCBkZXB0aF9ib19oYW5kbGU7CisKIH0gZHJtX2k5MTVfc2FyZWFfdDsKIAorLyogZHVlIHRvIHVzZXJzcGFjZSBidWlsZGluZyBhZ2FpbnN0IHRoZXNlIGhlYWRlcnMgd2UgbmVlZCBzb21lIGNvbXBhdCBoZXJlICovCisjZGVmaW5lIHBsYW5lQV94IHBpcGVBX3gKKyNkZWZpbmUgcGxhbmVBX3kgcGlwZUFfeQorI2RlZmluZSBwbGFuZUFfdyBwaXBlQV93CisjZGVmaW5lIHBsYW5lQV9oIHBpcGVBX2gKKyNkZWZpbmUgcGxhbmVCX3ggcGlwZUJfeAorI2RlZmluZSBwbGFuZUJfeSBwaXBlQl95CisjZGVmaW5lIHBsYW5lQl93IHBpcGVCX3cKKyNkZWZpbmUgcGxhbmVCX2ggcGlwZUJfaAorCiAvKiBGbGFncyBmb3IgcGVyZl9ib3hlcwogICovCiAjZGVmaW5lIEk5MTVfQk9YX1JJTkdfRU1QVFkgICAgMHgxCkBAIC0xNjAsNiArMTgzLDcgQEAKICNkZWZpbmUgRFJNX0k5MTVfR0VNX1NFVF9USUxJTkcJMHgyMQogI2RlZmluZSBEUk1fSTkxNV9HRU1fR0VUX1RJTElORwkweDIyCiAjZGVmaW5lIERSTV9JOTE1X0dFTV9HRVRfQVBFUlRVUkUgMHgyMworI2RlZmluZSBEUk1fSTkxNV9HRU1fTU1BUF9HVFQJMHgyNAogCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklULCBkcm1faTkxNV9pbml0X3QpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0ZMVVNICQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxVU0gpCkBAIC0xNzcsNiArMjAxLDggQEAKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUX1ZCTEFOS19QSVBFCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9WQkxBTktfUElQRQlEUk1fSU9SKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1ZCTEFOS19QSVBFLCBkcm1faTkxNV92YmxhbmtfcGlwZV90KQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9WQkxBTktfU1dBUAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfVkJMQU5LX1NXQVAsIGRybV9pOTE1X3ZibGFua19zd2FwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9JTklUCQlEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fSU5JVCwgc3RydWN0IGRybV9pOTE1X2dlbV9pbml0KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fRVhFQ0JVRkZFUiwgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyKQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUElOCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BJTiwgc3RydWN0IGRybV9pOTE1X2dlbV9waW4pCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9VTlBJTglEUk1fSU9XKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fVU5QSU4sIHN0cnVjdCBkcm1faTkxNV9nZW1fdW5waW4pCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9CVVNZCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX0JVU1ksIHN0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSkKQEAgLTE4Nyw2ICsyMTMsNyBAQAogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fUFJFQUQJRFJNX0lPVyAoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0dFTV9QUkVBRCwgc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1BXUklURQlEUk1fSU9XIChEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX1BXUklURSwgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VNX01NQVAsIHN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVBfR1RUCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fTU1BUF9HVFQsIHN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfRE9NQUlOCURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU0VUX0RPTUFJTiwgc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluKQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9HRU1fU1dfRklOSVNICURSTV9JT1cgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU1dfRklOSVNILCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3N3X2ZpbmlzaCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9USUxJTkcJRFJNX0lPV1IgKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRU1fU0VUX1RJTElORywgc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nKQpAQCAtMTk2LDcgKzIyMyw3IEBACiAvKiBBbGxvdyBkcml2ZXJzIHRvIHN1Ym1pdCBiYXRjaGJ1ZmZlcnMgZGlyZWN0bHkgdG8gaGFyZHdhcmUsIHJlbHlpbmcKICAqIG9uIHRoZSBzZWN1cml0eSBtZWNoYW5pc21zIHByb3ZpZGVkIGJ5IGhhcmR3YXJlLgogICovCi10eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfYmF0Y2hidWZmZXIgewordHlwZWRlZiBzdHJ1Y3QgZHJtX2k5MTVfYmF0Y2hidWZmZXIgewogCWludCBzdGFydDsJCS8qIGFncCBvZmZzZXQgKi8KIAlpbnQgdXNlZDsJCS8qIG5yIGJ5dGVzIGluIHVzZSAqLwogCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KQEAgLTM4Miw2ICs0MDksMTggQEAKIAl1aW50NjRfdCBhZGRyX3B0cjsKIH07CiAKK3N0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgeworCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBwYWQ7CisJLyoqCisJICogRmFrZSBvZmZzZXQgdG8gdXNlIGZvciBzdWJzZXF1ZW50IG1tYXAgY2FsbAorCSAqCisJICogVGhpcyBpcyBhIGZpeGVkLXNpemUgdHlwZSBmb3IgMzIvNjQgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4gewogCS8qKiBIYW5kbGUgZm9yIHRoZSBvYmplY3QgKi8KIAl1aW50MzJfdCBoYW5kbGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IGU1MzE3ODMuLjk1YWM4MjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMzEzLDYgKzMxMyw3IEBACiB1bmlmZGVmLXkgKz0gcW54NF9mcy5oCiB1bmlmZGVmLXkgKz0gcXVvdGEuaAogdW5pZmRlZi15ICs9IHJhbmRvbS5oCit1bmlmZGVmLXkgKz0gaXJxbnIuaAogdW5pZmRlZi15ICs9IHJlYm9vdC5oCiB1bmlmZGVmLXkgKz0gcmVpc2VyZnNfZnMuaAogdW5pZmRlZi15ICs9IHJlaXNlcmZzX3hhdHRyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWlvLmggYi9pbmNsdWRlL2xpbnV4L2Fpby5oCmluZGV4IGY2YjhjZjkuLmIxNmE5NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9haW8uaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9haW9fYWJpLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApAQCAtMTgzLDcgKzE4NCw3IEBACiAKIAkvKiBUaGlzIG5lZWRzIGltcHJvdmluZyAqLwogCXVuc2lnbmVkIGxvbmcJCXVzZXJfaWQ7Ci0Jc3RydWN0IGtpb2N0eAkJKm5leHQ7CisJc3RydWN0IGhsaXN0X25vZGUJbGlzdDsKIAogCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CiAKQEAgLTE5OSw2ICsyMDAsOCBAQAogCXN0cnVjdCBhaW9fcmluZ19pbmZvCXJpbmdfaW5mbzsKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsJd3E7CisKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdV9oZWFkOwogfTsKIAogLyogcHJvdG90eXBlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggNmE2NDIwOS4uMTg0NjJjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC05MCwxMCArOTAsMTEgQEAKIAogCXVuc2lnbmVkIGludAkJYmlfY29tcF9jcHU7CS8qIGNvbXBsZXRpb24gQ1BVICovCiAKKwlhdG9taWNfdAkJYmlfY250OwkJLyogcGluIGNvdW50ICovCisKIAlzdHJ1Y3QgYmlvX3ZlYwkJKmJpX2lvX3ZlYzsJLyogdGhlIGFjdHVhbCB2ZWMgbGlzdCAqLwogCiAJYmlvX2VuZF9pb190CQkqYmlfZW5kX2lvOwotCWF0b21pY190CQliaV9jbnQ7CQkvKiBwaW4gY291bnQgKi8KIAogCXZvaWQJCQkqYmlfcHJpdmF0ZTsKICNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOVEVHUklUWSkKQEAgLTEwMSw2ICsxMDIsMTMgQEAKICNlbmRpZgogCiAJYmlvX2Rlc3RydWN0b3JfdAkqYmlfZGVzdHJ1Y3RvcjsJLyogZGVzdHJ1Y3RvciAqLworCisJLyoKKwkgKiBXZSBjYW4gaW5saW5lIGEgbnVtYmVyIG9mIHZlY3MgYXQgdGhlIGVuZCBvZiB0aGUgYmlvLCB0byBhdm9pZAorCSAqIGRvdWJsZSBhbGxvY2F0aW9ucyBmb3IgYSBzbWFsbCBudW1iZXIgb2YgYmlvX3ZlY3MuIFRoaXMgbWVtYmVyCisJICogTVVTVCBvYnZpb3VzbHkgYmUga2VwdCBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJpby4KKwkgKi8KKwlzdHJ1Y3QgYmlvX3ZlYwkJYmlfaW5saW5lX3ZlY3NbMF07CiB9OwogCiAvKgpAQCAtMTE3LDYgKzEyNSw3IEBACiAjZGVmaW5lIEJJT19DUFVfQUZGSU5FCTgJLyogY29tcGxldGUgYmlvIG9uIHNhbWUgQ1BVIGFzIHN1Ym1pdHRlZCAqLwogI2RlZmluZSBCSU9fTlVMTF9NQVBQRUQgOQkvKiBjb250YWlucyBpbnZhbGlkIHVzZXIgcGFnZXMgKi8KICNkZWZpbmUgQklPX0ZTX0lOVEVHUklUWSAxMAkvKiBmcyBvd25zIGludGVncml0eSBkYXRhLCBub3QgYmxvY2sgbGF5ZXIgKi8KKyNkZWZpbmUgQklPX1FVSUVUCTExCS8qIE1ha2UgQklPIFF1aWV0ICovCiAjZGVmaW5lIGJpb19mbGFnZ2VkKGJpbywgZmxhZykJKChiaW8pLT5iaV9mbGFncyAmICgxIDw8IChmbGFnKSkpCiAKIC8qCkBAIC0yMTEsNiArMjIwLDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJpb19oYXNfYWxsb2NhdGVkX3ZlYyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuIGJpby0+YmlfaW9fdmVjICYmIGJpby0+YmlfaW9fdmVjICE9IGJpby0+YmlfaW5saW5lX3ZlY3M7Cit9CisKIC8qCiAgKiB3aWxsIGRpZQogICovCkBAIC0zMzIsNyArMzQ2LDcgQEAKIGV4dGVybiBzdHJ1Y3QgYmlvX3BhaXIgKmJpb19zcGxpdChzdHJ1Y3QgYmlvICpiaSwgaW50IGZpcnN0X3NlY3RvcnMpOwogZXh0ZXJuIHZvaWQgYmlvX3BhaXJfcmVsZWFzZShzdHJ1Y3QgYmlvX3BhaXIgKmRiaW8pOwogCi1leHRlcm4gc3RydWN0IGJpb19zZXQgKmJpb3NldF9jcmVhdGUoaW50LCBpbnQpOworZXh0ZXJuIHN0cnVjdCBiaW9fc2V0ICpiaW9zZXRfY3JlYXRlKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJpb3NldF9mcmVlKHN0cnVjdCBiaW9fc2V0ICopOwogCiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX2FsbG9jKGdmcF90LCBpbnQpOwpAQCAtMzc3LDYgKzM5MSw3IEBACiBleHRlcm4gaW50IGJpb191bmNvcHlfdXNlcihzdHJ1Y3QgYmlvICopOwogdm9pZCB6ZXJvX2ZpbGxfYmlvKHN0cnVjdCBiaW8gKmJpbyk7CiBleHRlcm4gc3RydWN0IGJpb192ZWMgKmJ2ZWNfYWxsb2NfYnMoZ2ZwX3QsIGludCwgdW5zaWduZWQgbG9uZyAqLCBzdHJ1Y3QgYmlvX3NldCAqKTsKK2V4dGVybiB2b2lkIGJ2ZWNfZnJlZV9icyhzdHJ1Y3QgYmlvX3NldCAqLCBzdHJ1Y3QgYmlvX3ZlYyAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBidmVjX25yX3ZlY3ModW5zaWduZWQgc2hvcnQgaWR4KTsKIAogLyoKQEAgLTM5NSwxMyArNDEwLDE3IEBACiAgKi8KICNkZWZpbmUgQklPX1BPT0xfU0laRSAyCiAjZGVmaW5lIEJJT1ZFQ19OUl9QT09MUyA2CisjZGVmaW5lIEJJT1ZFQ19NQVhfSURYCShCSU9WRUNfTlJfUE9PTFMgLSAxKQogCiBzdHJ1Y3QgYmlvX3NldCB7CisJc3RydWN0IGttZW1fY2FjaGUgKmJpb19zbGFiOworCXVuc2lnbmVkIGludCBmcm9udF9wYWQ7CisKIAltZW1wb29sX3QgKmJpb19wb29sOwogI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5URUdSSVRZKQogCW1lbXBvb2xfdCAqYmlvX2ludGVncml0eV9wb29sOwogI2VuZGlmCi0JbWVtcG9vbF90ICpidmVjX3Bvb2xzW0JJT1ZFQ19OUl9QT09MU107CisJbWVtcG9vbF90ICpidmVjX3Bvb2w7CiB9OwogCiBzdHJ1Y3QgYmlvdmVjX3NsYWIgewpAQCAtNDExLDYgKzQzMCw3IEBACiB9OwogCiBleHRlcm4gc3RydWN0IGJpb19zZXQgKmZzX2Jpb19zZXQ7CitleHRlcm4gc3RydWN0IGJpb3ZlY19zbGFiIGJ2ZWNfc2xhYnNbQklPVkVDX05SX1BPT0xTXSBfX3JlYWRfbW9zdGx5OwogCiAvKgogICogYSBzbWFsbCBudW1iZXIgb2YgZW50cmllcyBpcyBmaW5lLCBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWFuY2UgY3JpdGljYWwuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAwMzFhMzE1Li43MDM1Y2VjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogc3RydWN0IHJlcXVlc3RfcXVldWU7CiBzdHJ1Y3QgZWxldmF0b3JfcXVldWU7Ci10eXBlZGVmIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSBlbGV2YXRvcl90Owogc3RydWN0IHJlcXVlc3RfcG1fc3RhdGU7CiBzdHJ1Y3QgYmxrX3RyYWNlOwogc3RydWN0IHJlcXVlc3Q7CkBAIC0zMTMsNyArMzEyLDcgQEAKIAkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlX2hlYWQ7CiAJc3RydWN0IHJlcXVlc3QJCSpsYXN0X21lcmdlOwotCWVsZXZhdG9yX3QJCSplbGV2YXRvcjsKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUJKmVsZXZhdG9yOwogCiAJLyoKIAkgKiB0aGUgcXVldWUgcmVxdWVzdCBmcmVlbGlzdCwgb25lIGZvciByZWFkcyBhbmQgb25lIGZvciB3cml0ZXMKQEAgLTQ0OSw2ICs0NDgsNyBAQAogI2RlZmluZSBRVUVVRV9GTEFHX0ZBSUxfSU8gICAgIDEyCS8qIGZha2UgdGltZW91dCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX1NUQUNLQUJMRSAgIDEzCS8qIHN1cHBvcnRzIHJlcXVlc3Qgc3RhY2tpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT05ST1QgICAgICAxNAkvKiBub24tcm90YXRpb25hbCBkZXZpY2UgKFNTRCkgKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19WSVJUICAgICAgICBRVUVVRV9GTEFHX05PTlJPVCAvKiBwYXJhdmlydCBkZXZpY2UgKi8KIAogc3RhdGljIGlubGluZSBpbnQgcXVldWVfaXNfbG9ja2VkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewpAQCAtNTIyLDIyICs1MjIsMzIgQEAKIAkgKiBUQUdfRkxVU0gJOiBvcmRlcmluZyBieSB0YWcgdy8gcHJlIGFuZCBwb3N0IGZsdXNoZXMKIAkgKiBUQUdfRlVBCTogb3JkZXJpbmcgYnkgdGFnIHcvIHByZSBmbHVzaCBhbmQgRlVBIHdyaXRlCiAJICovCi0JUVVFVUVfT1JERVJFRF9OT05FCT0gMHgwMCwKLQlRVUVVRV9PUkRFUkVEX0RSQUlOCT0gMHgwMSwKLQlRVUVVRV9PUkRFUkVEX1RBRwk9IDB4MDIsCisJUVVFVUVfT1JERVJFRF9CWV9EUkFJTgkJPSAweDAxLAorCVFVRVVFX09SREVSRURfQllfVEFHCQk9IDB4MDIsCisJUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSAk9IDB4MTAsCisJUVVFVUVfT1JERVJFRF9ET19CQVIJCT0gMHgyMCwKKwlRVUVVRV9PUkRFUkVEX0RPX1BPU1RGTFVTSAk9IDB4NDAsCisJUVVFVUVfT1JERVJFRF9ET19GVUEJCT0gMHg4MCwKIAotCVFVRVVFX09SREVSRURfUFJFRkxVU0gJPSAweDEwLAotCVFVRVVFX09SREVSRURfUE9TVEZMVVNICT0gMHgyMCwKLQlRVUVVRV9PUkRFUkVEX0ZVQQk9IDB4NDAsCisJUVVFVUVfT1JERVJFRF9OT05FCQk9IDB4MDAsCiAKLQlRVUVVRV9PUkRFUkVEX0RSQUlOX0ZMVVNIID0gUVVFVUVfT1JERVJFRF9EUkFJTiB8Ci0JCQlRVUVVRV9PUkRFUkVEX1BSRUZMVVNIIHwgUVVFVUVfT1JERVJFRF9QT1NURkxVU0gsCi0JUVVFVUVfT1JERVJFRF9EUkFJTl9GVUEJPSBRVUVVRV9PUkRFUkVEX0RSQUlOIHwKLQkJCVFVRVVFX09SREVSRURfUFJFRkxVU0ggfCBRVUVVRV9PUkRFUkVEX0ZVQSwKLQlRVUVVRV9PUkRFUkVEX1RBR19GTFVTSAk9IFFVRVVFX09SREVSRURfVEFHIHwKLQkJCVFVRVVFX09SREVSRURfUFJFRkxVU0ggfCBRVUVVRV9PUkRFUkVEX1BPU1RGTFVTSCwKLQlRVUVVRV9PUkRFUkVEX1RBR19GVUEJPSBRVUVVRV9PUkRFUkVEX1RBRyB8Ci0JCQlRVUVVRV9PUkRFUkVEX1BSRUZMVVNIIHwgUVVFVUVfT1JERVJFRF9GVUEsCisJUVVFVUVfT1JERVJFRF9EUkFJTgkJPSBRVUVVRV9PUkRFUkVEX0JZX0RSQUlOIHwKKwkJCQkJICBRVUVVRV9PUkRFUkVEX0RPX0JBUiwKKwlRVUVVRV9PUkRFUkVEX0RSQUlOX0ZMVVNICT0gUVVFVUVfT1JERVJFRF9EUkFJTiB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSCB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19QT1NURkxVU0gsCisJUVVFVUVfT1JERVJFRF9EUkFJTl9GVUEJCT0gUVVFVUVfT1JERVJFRF9EUkFJTiB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSCB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19GVUEsCisKKwlRVUVVRV9PUkRFUkVEX1RBRwkJPSBRVUVVRV9PUkRFUkVEX0JZX1RBRyB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19CQVIsCisJUVVFVUVfT1JERVJFRF9UQUdfRkxVU0gJCT0gUVVFVUVfT1JERVJFRF9UQUcgfAorCQkJCQkgIFFVRVVFX09SREVSRURfRE9fUFJFRkxVU0ggfAorCQkJCQkgIFFVRVVFX09SREVSRURfRE9fUE9TVEZMVVNILAorCVFVRVVFX09SREVSRURfVEFHX0ZVQQkJPSBRVUVVRV9PUkRFUkVEX1RBRyB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19QUkVGTFVTSCB8CisJCQkJCSAgUVVFVUVfT1JERVJFRF9ET19GVUEsCiAKIAkvKgogCSAqIE9yZGVyZWQgb3BlcmF0aW9uIHNlcXVlbmNlCkBAIC01ODUsNyArNTk1LDYgQEAKICNkZWZpbmUgYmxrX2Z1YV9ycShycSkJCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfRlVBKQogI2RlZmluZSBibGtfZGlzY2FyZF9ycShycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9ESVNDQVJEKQogI2RlZmluZSBibGtfYmlkaV9ycShycSkJCSgocnEpLT5uZXh0X3JxICE9IE5VTEwpCi0jZGVmaW5lIGJsa19lbXB0eV9iYXJyaWVyKHJxKQkoYmxrX2JhcnJpZXJfcnEocnEpICYmIGJsa19mc19yZXF1ZXN0KHJxKSAmJiAhKHJxKS0+aGFyZF9ucl9zZWN0b3JzKQogLyogcnEtPnF1ZXVlbGlzdCBvZiBkZXF1ZXVlZCByZXF1ZXN0IG11c3QgYmUgbGlzdF9lbXB0eSgpICovCiAjZGVmaW5lIGJsa19xdWV1ZWRfcnEocnEpCSghbGlzdF9lbXB0eSgmKHJxKS0+cXVldWVsaXN0KSkKIApAQCAtODU1LDEwICs4NjQsMTAgQEAKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9ycV90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJsa19nZXRfYmFja2luZ19kZXZfaW5mbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIGV4dGVybiBpbnQgYmxrX3F1ZXVlX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQsIHByZXBhcmVfZmx1c2hfZm4gKik7Ci1leHRlcm4gaW50IGJsa19kb19vcmRlcmVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICoqKTsKK2V4dGVybiBib29sIGJsa19kb19vcmRlcmVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICoqKTsKIGV4dGVybiB1bnNpZ25lZCBibGtfb3JkZXJlZF9jdXJfc2VxKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogZXh0ZXJuIHVuc2lnbmVkIGJsa19vcmRlcmVkX3JlcV9zZXEoc3RydWN0IHJlcXVlc3QgKik7Ci1leHRlcm4gdm9pZCBibGtfb3JkZXJlZF9jb21wbGV0ZV9zZXEoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQsIGludCk7CitleHRlcm4gYm9vbCBibGtfb3JkZXJlZF9jb21wbGV0ZV9zZXEoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQsIGludCk7CiAKIGV4dGVybiBpbnQgYmxrX3JxX21hcF9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKik7CiBleHRlcm4gdm9pZCBibGtfZHVtcF9ycV9mbGFncyhzdHJ1Y3QgcmVxdWVzdCAqLCBjaGFyICopOwpAQCAtOTc3LDcgKzk4Niw2IEBACiAKIHN0cnVjdCB3b3JrX3N0cnVjdDsKIGludCBrYmxvY2tkX3NjaGVkdWxlX3dvcmsoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIGtibG9ja2RfZmx1c2hfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAjZGVmaW5lIE1PRFVMRV9BTElBU19CTE9DS0RFVihtYWpvcixtaW5vcikgXAogCU1PRFVMRV9BTElBUygiYmxvY2stbWFqb3ItIiBfX3N0cmluZ2lmeShtYWpvcikgIi0iIF9fc3RyaW5naWZ5KG1pbm9yKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYm90dG9tX2hhbGYuaCBiL2luY2x1ZGUvbGludXgvYm90dG9tX2hhbGYuaAppbmRleCA3NzdkYmY2Li4yN2IxYmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JvdHRvbV9oYWxmLmgKKysrIGIvaW5jbHVkZS9saW51eC9ib3R0b21faGFsZi5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfTElOVVhfQkhfSAogCiBleHRlcm4gdm9pZCBsb2NhbF9iaF9kaXNhYmxlKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19sb2NhbF9iaF9lbmFibGUodm9pZCk7CiBleHRlcm4gdm9pZCBfbG9jYWxfYmhfZW5hYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgbG9jYWxfYmhfZW5hYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgbG9jYWxfYmhfZW5hYmxlX2lwKHVuc2lnbmVkIGxvbmcgaXApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oIGIvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCmluZGV4IDNjZTY0YjkuLjg2MDVmOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKQEAgLTM1LDYgKzM1LDcgQEAKIAlCSF9PcmRlcmVkLAkvKiBvcmRlcmVkIHdyaXRlICovCiAJQkhfRW9wbm90c3VwcCwJLyogb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKGJhcnJpZXIpICovCiAJQkhfVW53cml0dGVuLAkvKiBCdWZmZXIgaXMgYWxsb2NhdGVkIG9uIGRpc2sgYnV0IG5vdCB3cml0dGVuICovCisJQkhfUXVpZXQsCS8qIEJ1ZmZlciBFcnJvciBQcmlua3MgdG8gYmUgcXVpZXQgKi8KIAogCUJIX1ByaXZhdGVTdGFydCwvKiBub3QgYSBzdGF0ZSBiaXQsIGJ1dCB0aGUgZmlyc3QgYml0IGF2YWlsYWJsZQogCQkJICogZm9yIHByaXZhdGUgYWxsb2NhdGlvbiBieSBvdGhlciBlbnRpdGllcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCAyNDhlNmUzLi5hNjdhOTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtMTUzLDQgKzE1Myw4IEBACiAjZGVmaW5lIFZFU0FfSFNZTkNfU1VTUEVORCAgICAgIDIKICNkZWZpbmUgVkVTQV9QT1dFUkRPV04gICAgICAgICAgMwogCisjaWZkZWYgQ09ORklHX1ZHQV9DT05TT0xFCitleHRlcm4gYm9vbCB2Z2Fjb25fdGV4dF9mb3JjZSh2b2lkKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0xJTlVYX0NPTlNPTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWJ1Z19sb2Nrcy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z19sb2Nrcy5oCmluZGV4IDRhYWE0YWYuLjA5NjQ3NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGVidWdfbG9ja3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RlYnVnX2xvY2tzLmgKQEAgLTE3LDcgKzE3LDcgQEAKICh7CQkJCQkJCQkJXAogCWludCBfX3JldCA9IDA7CQkJCQkJCVwKIAkJCQkJCQkJCVwKLQlpZiAodW5saWtlbHkoYykpIHsJCQkJCQlcCisJaWYgKCFvb3BzX2luX3Byb2dyZXNzICYmIHVubGlrZWx5KGMpKSB7CQkJCVwKIAkJaWYgKGRlYnVnX2xvY2tzX29mZigpICYmICFkZWJ1Z19sb2Nrc19zaWxlbnQpCQlcCiAJCQlXQVJOX09OKDEpOwkJCQkJXAogCQlfX3JldCA9IDE7CQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWkuaCBiL2luY2x1ZGUvbGludXgvZG1pLmgKaW5kZXggMmJmZGExNy4uMzQxNjE5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtaS5oCkBAIC00Nyw2ICs0Nyw3IEBACiBleHRlcm4gaW50IGRtaV9uYW1lX2luX3NlcmlhbChjb25zdCBjaGFyICpzdHIpOwogZXh0ZXJuIGludCBkbWlfYXZhaWxhYmxlOwogZXh0ZXJuIGludCBkbWlfd2Fsayh2b2lkICgqZGVjb2RlKShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqKSk7CitleHRlcm4gYm9vbCBkbWlfbWF0Y2goZW51bSBkbWlfZmllbGQgZiwgY29uc3QgY2hhciAqc3RyKTsKIAogI2Vsc2UKIApAQCAtNjEsNiArNjIsOCBAQAogI2RlZmluZSBkbWlfYXZhaWxhYmxlIDAKIHN0YXRpYyBpbmxpbmUgaW50IGRtaV93YWxrKHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopKQogCXsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgZG1pX21hdGNoKGVudW0gZG1pX2ZpZWxkIGYsIGNvbnN0IGNoYXIgKnN0cikKKwl7IHJldHVybiBmYWxzZTsgfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCmluZGV4IDkyZjZmNjMuLjdhMjA0MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKQEAgLTI4LDcgKzI4LDcgQEAKIHR5cGVkZWYgdm9pZCAoZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAogdHlwZWRlZiB2b2lkICooZWxldmF0b3JfaW5pdF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwotdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9leGl0X2ZuKSAoZWxldmF0b3JfdCAqKTsKK3R5cGVkZWYgdm9pZCAoZWxldmF0b3JfZXhpdF9mbikgKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqKTsKIAogc3RydWN0IGVsZXZhdG9yX29wcwogewpAQCAtNjIsOCArNjIsOCBAQAogCiBzdHJ1Y3QgZWx2X2ZzX2VudHJ5IHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKGVsZXZhdG9yX3QgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKGVsZXZhdG9yX3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKiwgY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwogCiAvKgpAQCAtMTMwLDcgKzEzMCw3IEBACiBleHRlcm4gc3NpemVfdCBlbHZfaW9zY2hlZF9zdG9yZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiAKIGV4dGVybiBpbnQgZWxldmF0b3JfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjaGFyICopOwotZXh0ZXJuIHZvaWQgZWxldmF0b3JfZXhpdChlbGV2YXRvcl90ICopOworZXh0ZXJuIHZvaWQgZWxldmF0b3JfZXhpdChzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKik7CiBleHRlcm4gaW50IGVsdl9ycV9tZXJnZV9vayhzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgYmlvICopOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaCBiL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKaW5kZXggMzIzNjhjNC4uMDZjYTliMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZhdWx0LWluamVjdC5oCkBAIC04MSw0ICs4MSwxMyBAQAogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTiAqLwogCisjaWZkZWYgQ09ORklHX0ZBSUxTTEFCCitleHRlcm4gYm9vbCBzaG91bGRfZmFpbHNsYWIoc2l6ZV90IHNpemUsIGdmcF90IGdmcGZsYWdzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2ZhaWxzbGFiKHNpemVfdCBzaXplLCBnZnBfdCBnZnBmbGFncykKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZBSUxTTEFCICovCisKICNlbmRpZiAvKiBfTElOVVhfRkFVTFRfSU5KRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAxOTVhOGNiLi4wMDFkZWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC04Miw2ICs4MiwxNCBAQAogICAgKHNwZWNpYWx5IGhhY2sgZm9yIGZsb3BweS5jKSAqLwogI2RlZmluZSBGTU9ERV9XUklURV9JT0NUTAkoKF9fZm9yY2UgZm1vZGVfdCkxMjgpCiAKKy8qCisgKiBEb24ndCB1cGRhdGUgY3RpbWUgYW5kIG10aW1lLgorICoKKyAqIEN1cnJlbnRseSBhIHNwZWNpYWwgaGFjayBmb3IgdGhlIFhGUyBvcGVuX2J5X2hhbmRsZSBpb2N0bCwgYnV0IHdlJ2xsCisgKiBob3BlZnVsbHkgZ3JhZHVhdGUgaXQgdG8gYSBwcm9wZXIgT19DTVRJTUUgZmxhZyBzdXBwb3J0ZWQgYnkgb3BlbigyKSBzb29uLgorICovCisjZGVmaW5lIEZNT0RFX05PQ01USU1FCQkoKF9fZm9yY2UgZm1vZGVfdCkyMDQ4KQorCiAjZGVmaW5lIFJXX01BU0sJCTEKICNkZWZpbmUgUldBX01BU0sJMgogI2RlZmluZSBSRUFEIDAKQEAgLTE4NzcsNyArMTg4NSw5IEBACiAKIGV4dGVybiBsb2ZmX3QgdmZzX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbik7CiAKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKiBpbm9kZV9pbml0X2Fsd2F5cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgaW5vZGVfaW5pdF9vbmNlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGlub2RlX2FkZF90b19saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgaXB1dChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICogaWdyYWIoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGlub190IGl1bmlxdWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnV0ZXguaCBiL2luY2x1ZGUvbGludXgvZnV0ZXguaAppbmRleCA1ODZhYjU2Li4zYmY1YmI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCkBAIC0yNSw3ICsyNSw4IEBACiAjZGVmaW5lIEZVVEVYX1dBS0VfQklUU0VUCTEwCiAKICNkZWZpbmUgRlVURVhfUFJJVkFURV9GTEFHCTEyOAotI2RlZmluZSBGVVRFWF9DTURfTUFTSwkJfkZVVEVYX1BSSVZBVEVfRkxBRworI2RlZmluZSBGVVRFWF9DTE9DS19SRUFMVElNRQkyNTYKKyNkZWZpbmUgRlVURVhfQ01EX01BU0sJCX4oRlVURVhfUFJJVkFURV9GTEFHIHwgRlVURVhfQ0xPQ0tfUkVBTFRJTUUpCiAKICNkZWZpbmUgRlVURVhfV0FJVF9QUklWQVRFCShGVVRFWF9XQUlUIHwgRlVURVhfUFJJVkFURV9GTEFHKQogI2RlZmluZSBGVVRFWF9XQUtFX1BSSVZBVEUJKEZVVEVYX1dBS0UgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCkBAIC0xNjQsNiArMTY1LDggQEAKIAl9IGJvdGg7CiB9OwogCisjZGVmaW5lIEZVVEVYX0tFWV9JTklUICh1bmlvbiBmdXRleF9rZXkpIHsgLmJvdGggPSB7IC5wdHIgPSBOVUxMIH0gfQorCiAjaWZkZWYgQ09ORklHX0ZVVEVYCiBleHRlcm4gdm9pZCBleGl0X3JvYnVzdF9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycik7CiBleHRlcm4gdm9pZCBleGl0X3BpX3N0YXRlX2xpc3Qoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaCBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaAppbmRleCAzZGY3NzQyLi4xNjk0OGVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCkBAIC0xMjYsNiArMTI2LDcgQEAKIHN0cnVjdCBkaXNrX3BhcnRfdGJsIHsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiAJaW50IGxlbjsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpsYXN0X2xvb2t1cDsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0W107CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IDg5YTU2ZDcuLmY4MzI4ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC0xMTksMTMgKzExOSwxNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUX1JDVSkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFopCisjaWYgZGVmaW5lZChDT05GSUdfTk9fSFopICYmICFkZWZpbmVkKENPTkZJR19DTEFTU0lDX1JDVSkKIGV4dGVybiB2b2lkIHJjdV9pcnFfZW50ZXIodm9pZCk7CiBleHRlcm4gdm9pZCByY3VfaXJxX2V4aXQodm9pZCk7CitleHRlcm4gdm9pZCByY3Vfbm1pX2VudGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgcmN1X25taV9leGl0KHZvaWQpOwogI2Vsc2UKICMgZGVmaW5lIHJjdV9pcnFfZW50ZXIoKSBkbyB7IH0gd2hpbGUgKDApCiAjIGRlZmluZSByY3VfaXJxX2V4aXQoKSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX1BSRUVNUFRfUkNVICovCisjIGRlZmluZSByY3Vfbm1pX2VudGVyKCkgZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgcmN1X25taV9leGl0KCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19OT19IWikgJiYgIWRlZmluZWQoQ09ORklHX0NMQVNTSUNfUkNVKSAqLwogCiAvKgogICogSXQgaXMgc2FmZSB0byBkbyBub24tYXRvbWljIG9wcyBvbiAtPmhhcmRpcnFfY29udGV4dCwKQEAgLTEzNSw3ICsxMzksNiBAQAogICovCiAjZGVmaW5lIF9faXJxX2VudGVyKCkJCQkJCVwKIAlkbyB7CQkJCQkJXAotCQlyY3VfaXJxX2VudGVyKCk7CQkJXAogCQlhY2NvdW50X3N5c3RlbV92dGltZShjdXJyZW50KTsJCVwKIAkJYWRkX3ByZWVtcHRfY291bnQoSEFSRElSUV9PRkZTRVQpOwlcCiAJCXRyYWNlX2hhcmRpcnFfZW50ZXIoKTsJCQlcCkBAIC0xNTQsNyArMTU3LDYgQEAKIAkJdHJhY2VfaGFyZGlycV9leGl0KCk7CQkJXAogCQlhY2NvdW50X3N5c3RlbV92dGltZShjdXJyZW50KTsJCVwKIAkJc3ViX3ByZWVtcHRfY291bnQoSEFSRElSUV9PRkZTRVQpOwlcCi0JCXJjdV9pcnFfZXhpdCgpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAogLyoKQEAgLTE2NiwxMSArMTY4LDE0IEBACiAJZG8gewkJCQkJXAogCQlmdHJhY2Vfbm1pX2VudGVyKCk7CQlcCiAJCWxvY2tkZXBfb2ZmKCk7CQkJXAorCQlyY3Vfbm1pX2VudGVyKCk7CQlcCiAJCV9faXJxX2VudGVyKCk7CQkJXAogCX0gd2hpbGUgKDApCisKICNkZWZpbmUgbm1pX2V4aXQoKQkJCQlcCiAJZG8gewkJCQkJXAogCQlfX2lycV9leGl0KCk7CQkJXAorCQlyY3Vfbm1pX2V4aXQoKTsJCQlcCiAJCWxvY2tkZXBfb24oKTsJCQlcCiAJCWZ0cmFjZV9ubWlfZXhpdCgpOwkJXAogCX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDNlYmE0MzguLmJkMzcwNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC00MywyNiArNDMsNiBAQAogfTsKIAogLyoKLSAqIGhydGltZXIgY2FsbGJhY2sgbW9kZXM6Ci0gKgotICoJSFJUSU1FUl9DQl9TT0ZUSVJROgkJQ2FsbGJhY2sgbXVzdCBydW4gaW4gc29mdGlycSBjb250ZXh0Ci0gKglIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVOglDYWxsYmFjayBtdXN0IHJ1biBpbiBoYXJkaXJxIGNvbnRleHQKLSAqCQkJCQlTcGVjaWFsIG1vZGUgZm9yIHRpY2sgZW11bGF0aW9uIGFuZAotICoJCQkJCXNjaGVkdWxlciB0aW1lci4gU3VjaCB0aW1lcnMgYXJlIHBlcgotICoJCQkJCWNwdSBhbmQgbm90IGFsbG93ZWQgdG8gYmUgbWlncmF0ZWQgb24KLSAqCQkJCQljcHUgdW5wbHVnLgotICoJSFJUSU1FUl9DQl9JUlFTQUZFX1VOTE9DS0VEOglDYWxsYmFjayBzaG91bGQgcnVuIGluIGhhcmRpcnEgY29udGV4dAotICoJCQkJCXdpdGggdGltZXItPmJhc2UgbG9jayB1bmxvY2tlZAotICoJCQkJCXVzZWQgZm9yIHRpbWVycyB3aGljaCBjYWxsIHdha2V1cCB0bwotICoJCQkJCWF2b2lkIGxvY2sgb3JkZXIgcHJvYmxlbXMgd2l0aCBycS0+bG9jawotICovCi1lbnVtIGhydGltZXJfY2JfbW9kZSB7Ci0JSFJUSU1FUl9DQl9TT0ZUSVJRLAotCUhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFUsCi0JSFJUSU1FUl9DQl9JUlFTQUZFX1VOTE9DS0VELAotfTsKLQotLyoKICAqIFZhbHVlcyB0byB0cmFjayBzdGF0ZSBvZiB0aGUgdGltZXIKICAqCiAgKiBQb3NzaWJsZSBzdGF0ZXM6CkBAIC03MCw3ICs1MCw2IEBACiAgKiAweDAwCQlpbmFjdGl2ZQogICogMHgwMQkJZW5xdWV1ZWQgaW50byByYnRyZWUKICAqIDB4MDIJCWNhbGxiYWNrIGZ1bmN0aW9uIHJ1bm5pbmcKLSAqIDB4MDQJCWNhbGxiYWNrIHBlbmRpbmcgKGhpZ2ggcmVzb2x1dGlvbiBtb2RlKQogICoKICAqIFNwZWNpYWwgY2FzZXM6CiAgKiAweDAzCQljYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nIGFuZCBlbnF1ZXVlZApAQCAtOTIsOCArNzEsNyBAQAogI2RlZmluZSBIUlRJTUVSX1NUQVRFX0lOQUNUSVZFCTB4MDAKICNkZWZpbmUgSFJUSU1FUl9TVEFURV9FTlFVRVVFRAkweDAxCiAjZGVmaW5lIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sJMHgwMgotI2RlZmluZSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcJMHgwNAotI2RlZmluZSBIUlRJTUVSX1NUQVRFX01JR1JBVEUJMHgwOAorI2RlZmluZSBIUlRJTUVSX1NUQVRFX01JR1JBVEUJMHgwNAogCiAvKioKICAqIHN0cnVjdCBocnRpbWVyIC0gdGhlIGJhc2ljIGhydGltZXIgc3RydWN0dXJlCkBAIC0xMDksOCArODcsNiBAQAogICogQGZ1bmN0aW9uOgl0aW1lciBleHBpcnkgY2FsbGJhY2sgZnVuY3Rpb24KICAqIEBiYXNlOglwb2ludGVyIHRvIHRoZSB0aW1lciBiYXNlIChwZXIgY3B1IGFuZCBwZXIgY2xvY2spCiAgKiBAc3RhdGU6CXN0YXRlIGluZm9ybWF0aW9uIChTZWUgYml0IHZhbHVlcyBhYm92ZSkKLSAqIEBjYl9tb2RlOgloaWdoIHJlc29sdXRpb24gdGltZXIgZmVhdHVyZSB0byBzZWxlY3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbgotICoJCSBtb2RlCiAgKiBAY2JfZW50cnk6CWxpc3QgaGVhZCB0byBlbnF1ZXVlIGFuIGV4cGlyZWQgdGltZXIgaW50byB0aGUgY2FsbGJhY2sgbGlzdAogICogQHN0YXJ0X3NpdGU6CXRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHNpdGUgd2hlcmUgdGhlIHRpbWVyCiAgKgkJd2FzIHN0YXJ0ZWQKQEAgLTEyOSw3ICsxMDUsNiBAQAogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UJKmJhc2U7CiAJdW5zaWduZWQgbG9uZwkJCXN0YXRlOwogCXN0cnVjdCBsaXN0X2hlYWQJCWNiX2VudHJ5OwotCWVudW0gaHJ0aW1lcl9jYl9tb2RlCQljYl9tb2RlOwogI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwogCWludAkJCQlzdGFydF9waWQ7CiAJdm9pZAkJCQkqc3RhcnRfc2l0ZTsKQEAgLTE4OCwxNSArMTYzLDExIEBACiAgKiBAY2hlY2tfY2xvY2tzOglJbmRpY3RhdG9yLCB3aGVuIHNldCBldmFsdWF0ZSB0aW1lIHNvdXJjZSBhbmQgY2xvY2sKICAqCQkJZXZlbnQgZGV2aWNlcyB3aGV0aGVyIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIGNhbiBiZQogICoJCQlhY3RpdmF0ZWQuCi0gKiBAY2JfcGVuZGluZzoJCUV4cGlyZWQgdGltZXJzIGFyZSBtb3ZlZCBmcm9tIHRoZSByYnRyZWUgdG8gdGhpcwotICoJCQlsaXN0IGluIHRoZSB0aW1lciBpbnRlcnJ1cHQuIFRoZSBsaXN0IGlzIHByb2Nlc3NlZAotICoJCQlpbiB0aGUgc29mdGlycS4KICAqIEBucl9ldmVudHM6CQlUb3RhbCBudW1iZXIgb2YgdGltZXIgaW50ZXJydXB0IGV2ZW50cwogICovCiBzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSB7CiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZQljbG9ja19iYXNlW0hSVElNRVJfTUFYX0NMT0NLX0JBU0VTXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQljYl9wZW5kaW5nOwogI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKIAlrdGltZV90CQkJCWV4cGlyZXNfbmV4dDsKIAlpbnQJCQkJaHJlc19hY3RpdmU7CkBAIC00MDQsOCArMzc1LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19xdWV1ZWQoc3RydWN0IGhydGltZXIgKnRpbWVyKQogewotCXJldHVybiB0aW1lci0+c3RhdGUgJgotCQkoSFJUSU1FUl9TVEFURV9FTlFVRVVFRCB8IEhSVElNRVJfU1RBVEVfUEVORElORyk7CisJcmV0dXJuIHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkZS5oIGIvaW5jbHVkZS9saW51eC9pZGUuaAppbmRleCAwMTBmYjI2Li5lOTljNTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRlLmgKQEAgLTEyMiw4ICsxMjIsNiBAQAogI2RlZmluZSBNQVhfRFJJVkVTCTIJLyogcGVyIGludGVyZmFjZTsgMiBhc3N1bWVkIGJ5IGxvdHMgb2YgY29kZSAqLwogI2RlZmluZSBTRUNUT1JfU0laRQk1MTIKIAotI2RlZmluZSBJREVfTEFSR0VfU0VFSyhiMSxiMix0KQkoKChiMSkgPiAoYjIpICsgKHQpKSB8fCAoKGIyKSA+IChiMSkgKyAodCkpKQotCiAvKgogICogVGltZW91dHMgZm9yIHZhcmlvdXMgb3BlcmF0aW9uczoKICAqLwpAQCAtMTcyLDkgKzE3MCw3IEBACiBlbnVtIHsJCWlkZV91bmtub3duLAlpZGVfZ2VuZXJpYywJaWRlX3BjaSwKIAkJaWRlX2NtZDY0MCwJaWRlX2R0YzIyNzgsCWlkZV9hbGkxNHh4LAogCQlpZGVfcWQ2NXh4LAlpZGVfdW1jODY3MiwJaWRlX2h0NjU2MGIsCi0JCWlkZV9yejEwMDAsCWlkZV90cm0yOTAsCi0JCWlkZV9jbWQ2NDYsCWlkZV9jeTgyYzY5MywJaWRlXzRkcml2ZXMsCi0JCWlkZV9wbWFjLAlpZGVfYWNvcm4sCisJCWlkZV80ZHJpdmVzLAlpZGVfcG1hYywJaWRlX2Fjb3JuLAogCQlpZGVfYXUxeHh4LAlpZGVfcGFsbTM3MTAKIH07CiAKQEAgLTQ5Niw4ICs0OTIsNiBAQAogCSAqIHdoZW4gbW9yZSB0aGFuIG9uZSBpbnRlcnJ1cHQgaXMgbmVlZGVkLgogCSAqLwogCUlERV9BRkxBR19MSU1JVF9ORlJBTUVTCQk9ICgxIDw8IDcpLAotCS8qIFNlZWtpbmcgaW4gcHJvZ3Jlc3MuICovCi0JSURFX0FGTEFHX1NFRUtJTkcJCT0gKDEgPDwgOCksCiAJLyogU2F2ZWQgVE9DIGluZm9ybWF0aW9uIGlzIGN1cnJlbnQuICovCiAJSURFX0FGTEFHX1RPQ19WQUxJRAkJPSAoMSA8PCA5KSwKIAkvKiBXZSB0aGluayB0aGF0IHRoZSBkcml2ZSBkb29yIGlzIGxvY2tlZC4gKi8KQEAgLTg0NSw4ICs4MzksNiBAQAogCXVuc2lnbmVkCWV4dHJhX3BvcnRzOwkvKiBudW1iZXIgb2YgZXh0cmEgZG1hIHBvcnRzICovCiAKIAl1bnNpZ25lZAlwcmVzZW50ICAgIDogMTsJLyogdGhpcyBpbnRlcmZhY2UgZXhpc3RzICovCi0JdW5zaWduZWQJc2VyaWFsaXplZCA6IDE7CS8qIHNlcmlhbGl6ZWQgYWxsIGNoYW5uZWwgb3BlcmF0aW9uICovCi0JdW5zaWduZWQJc2hhcmluZ19pcnE6IDE7CS8qIDEgPSBzaGFyaW5nIGlycSB3aXRoIGFub3RoZXIgaHdpZiAqLwogCXVuc2lnbmVkCXNnX21hcHBlZCAgOiAxOwkvKiBzZ190YWJsZSBhbmQgc2dfbmVudHMgYXJlIHJlYWR5ICovCiAKIAlzdHJ1Y3QgZGV2aWNlCQlnZW5kZXY7CkBAIC05MDksNiArOTAxLDggQEAKIAogCWludCByZXFfZ2VuOwogCWludCByZXFfZ2VuX3RpbWVyOworCisJc3BpbmxvY2tfdCBsb2NrOwogfSBpZGVfaHdncm91cF90OwogCiB0eXBlZGVmIHN0cnVjdCBpZGVfZHJpdmVyX3MgaWRlX2RyaXZlcl90OwpAQCAtMTEyMiw2ICsxMTE2LDE0IEBACiAJSURFX1BNX0NPTVBMRVRFRCwKIH07CiAKK2ludCBnZW5lcmljX2lkZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsKK2ludCBnZW5lcmljX2lkZV9yZXN1bWUoc3RydWN0IGRldmljZSAqKTsKKwordm9pZCBpZGVfY29tcGxldGVfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK2lkZV9zdGFydHN0b3BfdCBpZGVfc3RhcnRfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3ZvaWQgaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Cit2b2lkIGlkZV9jaGVja19wbV9zdGF0ZShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKKwogLyoKICAqIFN1YmRyaXZlcnMgc3VwcG9ydC4KICAqCkBAIC0xMzc2LDggKzEzNzgsOCBAQAogCUlERV9IRkxBR19MRUdBQ1lfSVJRUwkJPSAoMSA8PCAyMSksCiAJLyogZm9yY2UgdXNlIG9mIGxlZ2FjeSBJUlFzICovCiAJSURFX0hGTEFHX0ZPUkNFX0xFR0FDWV9JUlFTCT0gKDEgPDwgMjIpLAotCS8qIGxpbWl0IExCQTQ4IHJlcXVlc3RzIHRvIDI1NiBzZWN0b3JzICovCi0JSURFX0hGTEFHX1JRU0laRV8yNTYJCT0gKDEgPDwgMjMpLAorCS8qIGhvc3QgaXMgVFJNMjkwICovCisJSURFX0hGTEFHX1RSTTI5MAkJPSAoMSA8PCAyMyksCiAJLyogdXNlIDMyLWJpdCBJL08gb3BzICovCiAJSURFX0hGTEFHX0lPXzMyQklUCQk9ICgxIDw8IDI0KSwKIAkvKiB1bm1hc2sgSVJRcyAqLwpAQCAtMTQxNSw2ICsxNDE3LDkgQEAKIAogCWlkZV9wY2lfZW5hYmxlYml0X3QJZW5hYmxlYml0c1syXTsKIAlod2lmX2NoaXBzZXRfdAkJY2hpcHNldDsKKworCXUxNgkJCW1heF9zZWN0b3JzOwkvKiBpZiA8IHRoYW4gdGhlIGRlZmF1bHQgb25lICovCisKIAl1MzIJCQlob3N0X2ZsYWdzOwogCXU4CQkJcGlvX21hc2s7CiAJdTgJCQlzd2RtYV9tYXNrOwpAQCAtMTYxMCwxMyArMTYxNSwxMyBAQAogLyoKICAqIFN0cnVjdHVyZSBsb2NraW5nOgogICoKLSAqIGlkZV9jZmdfbXR4IGFuZCBpZGVfbG9jayB0b2dldGhlciBwcm90ZWN0IGNoYW5nZXMgdG8KLSAqIGlkZV9od2lmX3QtPntuZXh0LGh3Z3JvdXB9CisgKiBpZGVfY2ZnX210eCBhbmQgaHdncm91cC0+bG9jayB0b2dldGhlciBwcm90ZWN0IGNoYW5nZXMgdG8KKyAqIGlkZV9od2lmX3QtPm5leHQKICAqIGlkZV9kcml2ZV90LT5uZXh0CiAgKgotICogaWRlX2h3Z3JvdXBfdC0+YnVzeTogaWRlX2xvY2sKLSAqIGlkZV9od2dyb3VwX3QtPmh3aWY6IGlkZV9sb2NrCi0gKiBpZGVfaHdpZl90LT5tYXRlOiBjb25zdGFudCwgbm8gbG9ja2luZworICogaWRlX2h3Z3JvdXBfdC0+YnVzeTogaHdncm91cC0+bG9jaworICogaWRlX2h3Z3JvdXBfdC0+aHdpZjogaHdncm91cC0+bG9jaworICogaWRlX2h3aWZfdC0+e2h3Z3JvdXAsbWF0ZX06IGNvbnN0YW50LCBubyBsb2NraW5nCiAgKiBpZGVfZHJpdmVfdC0+aHdpZjogY29uc3RhbnQsIG5vIGxvY2tpbmcKICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCBmNThhMGNmLi5iZTNjNDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+CisKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTI1MSw5ICsyNTMsNiBAQAogCUJMT0NLX1NPRlRJUlEsCiAJVEFTS0xFVF9TT0ZUSVJRLAogCVNDSEVEX1NPRlRJUlEsCi0jaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUwotCUhSVElNRVJfU09GVElSUSwKLSNlbmRpZgogCVJDVV9TT0ZUSVJRLCAJLyogUHJlZmVyYWJsZSBSQ1Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbGFzdCBzb2Z0aXJxICovCiAKIAlOUl9TT0ZUSVJRUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggM2RkZGZhNy4uOTg1NjRkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xMjksOSArMTI5LDE0IEBACiAJY29uc3QgY2hhcgkqdHlwZW5hbWU7CiB9OwogCitzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZTsKK3N0cnVjdCBpcnFfMl9pb21tdTsKIC8qKgogICogc3RydWN0IGlycV9kZXNjIC0gaW50ZXJydXB0IGRlc2NyaXB0b3IKICAqIEBpcnE6CQlpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGlzIGRlc2NyaXB0b3IKKyAqIEB0aW1lcl9yYW5kX3N0YXRlOglwb2ludGVyIHRvIHRpbWVyIHJhbmQgc3RhdGUgc3RydWN0CisgKiBAa3N0YXRfaXJxczoJCWlycSBzdGF0cyBwZXIgY3B1CisgKiBAaXJxXzJfaW9tbXU6CWlvbW11IHdpdGggdGhpcyBpcnEKICAqIEBoYW5kbGVfaXJxOgkJaGlnaGxldmVsIGlycS1ldmVudHMgaGFuZGxlciBbaWYgTlVMTCwgX19kb19JUlEoKV0KICAqIEBjaGlwOgkJbG93IGxldmVsIGludGVycnVwdCBoYXJkd2FyZSBhY2Nlc3MKICAqIEBtc2lfZGVzYzoJCU1TSSBkZXNjcmlwdG9yCkBAIC0xNDMsOCArMTQ4LDggQEAKICAqIEBkZXB0aDoJCWRpc2FibGUtZGVwdGgsIGZvciBuZXN0ZWQgaXJxX2Rpc2FibGUoKSBjYWxscwogICogQHdha2VfZGVwdGg6CQllbmFibGUgZGVwdGgsIGZvciBtdWx0aXBsZSBzZXRfaXJxX3dha2UoKSBjYWxsZXJzCiAgKiBAaXJxX2NvdW50OgkJc3RhdHMgZmllbGQgdG8gZGV0ZWN0IHN0YWxsZWQgaXJxcwotICogQGlycXNfdW5oYW5kbGVkOglzdGF0cyBmaWVsZCBmb3Igc3B1cmlvdXMgdW5oYW5kbGVkIGludGVycnVwdHMKICAqIEBsYXN0X3VuaGFuZGxlZDoJYWdpbmcgdGltZXIgZm9yIHVuaGFuZGxlZCBjb3VudAorICogQGlycXNfdW5oYW5kbGVkOglzdGF0cyBmaWVsZCBmb3Igc3B1cmlvdXMgdW5oYW5kbGVkIGludGVycnVwdHMKICAqIEBsb2NrOgkJbG9ja2luZyBmb3IgU01QCiAgKiBAYWZmaW5pdHk6CQlJUlEgYWZmaW5pdHkgb24gU01QCiAgKiBAY3B1OgkJY3B1IGluZGV4IHVzZWZ1bCBmb3IgYmFsYW5jaW5nCkBAIC0xNTQsNiArMTU5LDEzIEBACiAgKi8KIHN0cnVjdCBpcnFfZGVzYyB7CiAJdW5zaWduZWQgaW50CQlpcnE7CisjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKKwlzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqdGltZXJfcmFuZF9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAqa3N0YXRfaXJxczsKKyMgaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlzdHJ1Y3QgaXJxXzJfaW9tbXUgICAgICAqaXJxXzJfaW9tbXU7CisjIGVuZGlmCisjZW5kaWYKIAlpcnFfZmxvd19oYW5kbGVyX3QJaGFuZGxlX2lycTsKIAlzdHJ1Y3QgaXJxX2NoaXAJCSpjaGlwOwogCXN0cnVjdCBtc2lfZGVzYwkJKm1zaV9kZXNjOwpAQCAtMTY1LDggKzE3Nyw4IEBACiAJdW5zaWduZWQgaW50CQlkZXB0aDsJCS8qIG5lc3RlZCBpcnEgZGlzYWJsZXMgKi8KIAl1bnNpZ25lZCBpbnQJCXdha2VfZGVwdGg7CS8qIG5lc3RlZCB3YWtlIGVuYWJsZXMgKi8KIAl1bnNpZ25lZCBpbnQJCWlycV9jb3VudDsJLyogRm9yIGRldGVjdGluZyBicm9rZW4gSVJRcyAqLwotCXVuc2lnbmVkIGludAkJaXJxc191bmhhbmRsZWQ7CiAJdW5zaWduZWQgbG9uZwkJbGFzdF91bmhhbmRsZWQ7CS8qIEFnaW5nIHRpbWVyIGZvciB1bmhhbmRsZWQgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQJCWlycXNfdW5oYW5kbGVkOwogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1NNUAogCWNwdW1hc2tfdAkJYWZmaW5pdHk7CkBAIC0xODEsMTIgKzE5Myw1MSBAQAogCWNvbnN0IGNoYXIJCSpuYW1lOwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogCitleHRlcm4gdm9pZCBlYXJseV9pcnFfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGFyY2hfZWFybHlfaXJxX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSk7CitleHRlcm4gdm9pZCBhcmNoX2luaXRfY29weV9jaGlwX2RhdGEoc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywKKwkJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIGFyY2hfZnJlZV9jaGlwX2RhdGEoc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIAorI2lmbmRlZiBDT05GSUdfU1BBUlNFX0lSUQogZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyBpcnFfZGVzY1tOUl9JUlFTXTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcmV0dXJuIChpcnEgPCBucl9pcnFzKSA/IGlycV9kZXNjICsgaXJxIDogTlVMTDsKKwlyZXR1cm4gKGlycSA8IE5SX0lSUVMpID8gaXJxX2Rlc2MgKyBpcnEgOiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQoreworCXJldHVybiBpcnFfdG9fZGVzYyhpcnEpOworfQorCisjZWxzZQorCitleHRlcm4gc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzYyh1bnNpZ25lZCBpbnQgaXJxKTsKK2V4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KTsKK2V4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywgaW50IGNwdSk7CisKKyMgZGVmaW5lIGZvcl9lYWNoX2lycV9kZXNjKGlycSwgZGVzYykJCVwKKwlmb3IgKGlycSA9IDAsIGRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOyBpcnEgPCBucl9pcnFzOyBpcnErKywgZGVzYyA9IGlycV90b19kZXNjKGlycSkpCisjIGRlZmluZSBmb3JfZWFjaF9pcnFfZGVzY19yZXZlcnNlKGlycSwgZGVzYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKGlycSA9IG5yX2lycXMgLSAxLCBkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsgaXJxID49IDA7IGlycS0tLCBkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKSkKKworI2RlZmluZSBrc3RhdF9pcnFzX3RoaXNfY3B1KERFU0MpIFwKKwkoKERFU0MpLT5rc3RhdF9pcnFzW3NtcF9wcm9jZXNzb3JfaWQoKV0pCisjZGVmaW5lIGtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnFubywgREVTQykgXAorCSgoREVTQyktPmtzdGF0X2lycXNbc21wX3Byb2Nlc3Nvcl9pZCgpXSsrKQorCisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2Rlc2MgKgoraXJxX3JlbWFwX3RvX2Rlc2ModW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKKwlyZXR1cm4gaXJxX3RvX2Rlc2MoaXJxKTsKKyNlbHNlCisJcmV0dXJuIGRlc2M7CisjZW5kaWYKIH0KIAogLyoKQEAgLTM4MCw2ICs0MzEsMTEgQEAKICNkZWZpbmUgZ2V0X2lycV9kYXRhKGlycSkJKGlycV90b19kZXNjKGlycSktPmhhbmRsZXJfZGF0YSkKICNkZWZpbmUgZ2V0X2lycV9tc2koaXJxKQkoaXJxX3RvX2Rlc2MoaXJxKS0+bXNpX2Rlc2MpCiAKKyNkZWZpbmUgZ2V0X2lycV9kZXNjX2NoaXAoZGVzYykJCSgoZGVzYyktPmNoaXApCisjZGVmaW5lIGdldF9pcnFfZGVzY19jaGlwX2RhdGEoZGVzYykJKChkZXNjKS0+Y2hpcF9kYXRhKQorI2RlZmluZSBnZXRfaXJxX2Rlc2NfZGF0YShkZXNjKQkJKChkZXNjKS0+aGFuZGxlcl9kYXRhKQorI2RlZmluZSBnZXRfaXJxX2Rlc2NfbXNpKGRlc2MpCQkoKGRlc2MpLT5tc2lfZGVzYykKKwogI2VuZGlmIC8qIENPTkZJR19HRU5FUklDX0hBUkRJUlFTICovCiAKICNlbmRpZiAvKiAhQ09ORklHX1MzOTAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxbnIuaCBiL2luY2x1ZGUvbGludXgvaXJxbnIuaAppbmRleCA0NTJjMjgwLi45NWQyYjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycW5yLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFuci5oCkBAIC0xLDI0ICsxLDM4IEBACiAjaWZuZGVmIF9MSU5VWF9JUlFOUl9ICiAjZGVmaW5lIF9MSU5VWF9JUlFOUl9ICiAKKy8qCisgKiBHZW5lcmljIGlycV9kZXNjIGl0ZXJhdG9yczoKKyAqLworI2lmZGVmIF9fS0VSTkVMX18KKwogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19IQVJESVJRUwogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICMgZGVmaW5lIG5yX2lycXMJCU5SX0lSUVMKIAogIyBkZWZpbmUgZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKQkJXAogCWZvciAoaXJxID0gMDsgaXJxIDwgbnJfaXJxczsgaXJxKyspCisKKyMgZGVmaW5lIGZvcl9lYWNoX2lycV9kZXNjX3JldmVyc2UoaXJxLCBkZXNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoaXJxID0gbnJfaXJxcyAtIDE7IGlycSA+PSAwOyBpcnEtLSkKICNlbHNlCisKIGV4dGVybiBpbnQgbnJfaXJxczsKIAorI2lmbmRlZiBDT05GSUdfU1BBUlNFX0lSUQorCitzdHJ1Y3QgaXJxX2Rlc2M7CiAjIGRlZmluZSBmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpCQlcCiAJZm9yIChpcnEgPSAwLCBkZXNjID0gaXJxX2Rlc2M7IGlycSA8IG5yX2lycXM7IGlycSsrLCBkZXNjKyspCi0KLSMgZGVmaW5lIGZvcl9lYWNoX2lycV9kZXNjX3JldmVyc2UoaXJxLCBkZXNjKQkJCQlcCi0JZm9yIChpcnEgPSBucl9pcnFzIC0gMSwgZGVzYyA9IGlycV9kZXNjICsgKG5yX2lycXMgLSAxKTsJXAotCSAgICAgaXJxID49IDA7IGlycS0tLCBkZXNjLS0pCisjIGRlZmluZSBmb3JfZWFjaF9pcnFfZGVzY19yZXZlcnNlKGlycSwgZGVzYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKGlycSA9IG5yX2lycXMgLSAxLCBkZXNjID0gaXJxX2Rlc2MgKyAobnJfaXJxcyAtIDEpOyAgICAgICAgXAorCSAgICBpcnEgPj0gMDsgaXJxLS0sIGRlc2MtLSkKKyNlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgZm9yX2VhY2hfaXJxX25yKGlycSkJCQlcCi0JZm9yIChpcnEgPSAwOyBpcnEgPCBucl9pcnFzOyBpcnErKykKKyNkZWZpbmUgZm9yX2VhY2hfaXJxX25yKGlycSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZvciAoaXJxID0gMDsgaXJxIDwgbnJfaXJxczsgaXJxKyspCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmggYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAppbmRleCBhYmI2YWM2Li4xYTljZjc4YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0xMTUsMTAgKzExNSwyMCBAQAogCSAoKGxvbmcpKGEpIC0gKGxvbmcpKGIpID49IDApKQogI2RlZmluZSB0aW1lX2JlZm9yZV9lcShhLGIpCXRpbWVfYWZ0ZXJfZXEoYixhKQogCisvKgorICogQ2FsY3VsYXRlIHdoZXRoZXIgYSBpcyBpbiB0aGUgcmFuZ2Ugb2YgW2IsIGNdLgorICovCiAjZGVmaW5lIHRpbWVfaW5fcmFuZ2UoYSxiLGMpIFwKIAkodGltZV9hZnRlcl9lcShhLGIpICYmIFwKIAkgdGltZV9iZWZvcmVfZXEoYSxjKSkKIAorLyoKKyAqIENhbGN1bGF0ZSB3aGV0aGVyIGEgaXMgaW4gdGhlIHJhbmdlIG9mIFtiLCBjKS4KKyAqLworI2RlZmluZSB0aW1lX2luX3JhbmdlX29wZW4oYSxiLGMpIFwKKwkodGltZV9hZnRlcl9lcShhLGIpICYmIFwKKwkgdGltZV9iZWZvcmUoYSxjKSkKKwogLyogU2FtZSBhcyBhYm92ZSwgYnV0IGRvZXMgc28gd2l0aCBwbGF0Zm9ybSBpbmRlcGVuZGVudCA2NGJpdCB0eXBlcy4KICAqIFRoZXNlIG11c3QgYmUgdXNlZCB3aGVuIHV0aWxpemluZyBqaWZmaWVzXzY0IChpLmUuIHJldHVybiB2YWx1ZSBvZgogICogZ2V0X2ppZmZpZXNfNjQoKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggNjAwMmFlNy4uY2E5ZmY2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0xNDEsNiArMTQxLDE1IEBACiAJCShfX3ggPCAwKSA/IC1fX3ggOiBfX3g7CQlcCiAJfSkKIAorI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCit2b2lkIG1pZ2h0X2ZhdWx0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaWdodF9mYXVsdCh2b2lkKQoreworCW1pZ2h0X3NsZWVwKCk7Cit9CisjZW5kaWYKKwogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBwYW5pY19ub3RpZmllcl9saXN0OwogZXh0ZXJuIGxvbmcgKCpwYW5pY19ibGluaykobG9uZyB0aW1lKTsKIE5PUkVUX1RZUEUgdm9pZCBwYW5pYyhjb25zdCBjaGFyICogZm10LCAuLi4pCkBAIC0xODgsNiArMTk3LDggQEAKIGV4dGVybiBpbnQgY29yZV9rZXJuZWxfdGV4dCh1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIGludCBfX2tlcm5lbF90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiBpbnQga2VybmVsX3RleHRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIGludCBmdW5jX3B0cl9pc19rZXJuZWxfdGV4dCh2b2lkICpwdHIpOworCiBzdHJ1Y3QgcGlkOwogZXh0ZXJuIHN0cnVjdCBwaWQgKnNlc3Npb25fb2ZfcGdycChzdHJ1Y3QgcGlkICpwZ3JwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCmluZGV4IDRhMTQ1Y2EuLjRlZTRiM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKQEAgLTI4LDcgKzI4LDkgQEAKIAogc3RydWN0IGtlcm5lbF9zdGF0IHsKIAlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQJY3B1c3RhdDsKLQl1bnNpZ25lZCBpbnQgaXJxc1tOUl9JUlFTXTsKKyNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKKyAgICAgICB1bnNpZ25lZCBpbnQgaXJxc1tOUl9JUlFTXTsKKyNlbmRpZgogfTsKIAogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBrZXJuZWxfc3RhdCwga3N0YXQpOwpAQCAtMzksNiArNDEsMTAgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBucl9jb250ZXh0X3N3aXRjaGVzKHZvaWQpOwogCisjaWZuZGVmIENPTkZJR19TUEFSU0VfSVJRCisjZGVmaW5lIGtzdGF0X2lycXNfdGhpc19jcHUoaXJxKSBcCisJKGtzdGF0X3RoaXNfY3B1LmlycXNbaXJxXSkKKwogc3RydWN0IGlycV9kZXNjOwogCiBzdGF0aWMgaW5saW5lIHZvaWQga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KHVuc2lnbmVkIGludCBpcnEsCkBAIC00NiwxMSArNTIsMTcgQEAKIHsKIAlrc3RhdF90aGlzX2NwdS5pcnFzW2lycV0rKzsKIH0KKyNlbmRpZgogCisKKyNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpCiB7CiAgICAgICAgcmV0dXJuIGtzdGF0X2NwdShjcHUpLmlycXNbaXJxXTsKIH0KKyNlbHNlCitleHRlcm4gdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpOworI2VuZGlmCiAKIC8qCiAgKiBOdW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgc3BlY2lmaWMgSVJRIHNvdXJjZSwgc2luY2UgYm9vdHVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xndWVzdF9sYXVuY2hlci5oIGIvaW5jbHVkZS9saW51eC9sZ3Vlc3RfbGF1bmNoZXIuaAppbmRleCBlNzIxN2RjLi5hNTM0MDdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xndWVzdF9sYXVuY2hlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmgKQEAgLTU0LDkgKzU0LDEzIEBACiAvKiBXcml0ZSBjb21tYW5kIGZpcnN0IHdvcmQgaXMgYSByZXF1ZXN0LiAqLwogZW51bSBsZ3Vlc3RfcmVxCiB7Ci0JTEhSRVFfSU5JVElBTElaRSwgLyogKyBiYXNlLCBwZm5saW1pdCwgcGdkaXIsIHN0YXJ0ICovCisJTEhSRVFfSU5JVElBTElaRSwgLyogKyBiYXNlLCBwZm5saW1pdCwgc3RhcnQgKi8KIAlMSFJFUV9HRVRETUEsIC8qIE5vIGxvbmdlciB1c2VkICovCiAJTEhSRVFfSVJRLCAvKiArIGlycSAqLwogCUxIUkVRX0JSRUFLLCAvKiArIG9uL29mZiBmbGFnIChvbiBibG9ja3MgdW50aWwgc29tZW9uZSBkb2VzIG9mZikgKi8KIH07CisKKy8qIFRoZSBhbGlnbm1lbnQgdG8gdXNlIGJldHdlZW4gY29uc3VtZXIgYW5kIHByb2R1Y2VyIHBhcnRzIG9mIHZyaW5nLgorICogeDg2IHBhZ2VzaXplIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICovCisjZGVmaW5lIExHVUVTVF9WUklOR19BTElHTgk0MDk2CiAjZW5kaWYgLyogX0xJTlVYX0xHVUVTVF9MQVVOQ0hFUiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggZWQzZjI2ZS4uMzQ0OWRlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0yMTMsMTAgKzIxMywxMSBAQAogCUFUQV9QRkxBR19GUk9aRU4JPSAoMSA8PCAyKSwgLyogcG9ydCBpcyBmcm96ZW4gKi8KIAlBVEFfUEZMQUdfUkVDT1ZFUkVECT0gKDEgPDwgMyksIC8qIHJlY292ZXJ5IGFjdGlvbiBwZXJmb3JtZWQgKi8KIAlBVEFfUEZMQUdfTE9BRElORwk9ICgxIDw8IDQpLCAvKiBib290L2xvYWRpbmcgcHJvYmUgKi8KLQlBVEFfUEZMQUdfVU5MT0FESU5HCT0gKDEgPDwgNSksIC8qIG1vZHVsZSBpcyB1bmxvYWRpbmcgKi8KIAlBVEFfUEZMQUdfU0NTSV9IT1RQTFVHCT0gKDEgPDwgNiksIC8qIFNDU0kgaG90cGx1ZyBzY2hlZHVsZWQgKi8KIAlBVEFfUEZMQUdfSU5JVElBTElaSU5HCT0gKDEgPDwgNyksIC8qIGJlaW5nIGluaXRpYWxpemVkLCBkb24ndCB0b3VjaCAqLwogCUFUQV9QRkxBR19SRVNFVFRJTkcJPSAoMSA8PCA4KSwgLyogcmVzZXQgaW4gcHJvZ3Jlc3MgKi8KKwlBVEFfUEZMQUdfVU5MT0FESU5HCT0gKDEgPDwgOSksIC8qIGRyaXZlciBpcyBiZWluZyB1bmxvYWRlZCAqLworCUFUQV9QRkxBR19VTkxPQURFRAk9ICgxIDw8IDEwKSwgLyogZHJpdmVyIGlzIHVubG9hZGVkICovCiAKIAlBVEFfUEZMQUdfU1VTUEVOREVECT0gKDEgPDwgMTcpLCAvKiBwb3J0IGlzIHN1c3BlbmRlZCAocG93ZXIpICovCiAJQVRBX1BGTEFHX1BNX1BFTkRJTkcJPSAoMSA8PCAxOCksIC8qIFBNIG9wZXJhdGlvbiBwZW5kaW5nICovCkBAIC0xMjg1LDI2ICsxMjg2LDYyIEBACiAJcmV0dXJuIGF0YV90YWdfdmFsaWQobGluay0+YWN0aXZlX3RhZykgfHwgbGluay0+c2FjdGl2ZTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBhdGFfbGluayAqX19hdGFfcG9ydF9uZXh0X2xpbmsoc3RydWN0IGF0YV9wb3J0ICphcCwKLQkJCQkJICAgICBzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCi0JCQkJCSAgICAgYm9vbCBkZXZfb25seSk7CisvKgorICogSXRlcmF0b3JzCisgKgorICogQVRBX0xJVEVSXyogY29uc3RhbnRzIGFyZSB1c2VkIHRvIHNlbGVjdCBsaW5rIGl0ZXJhdGlvbiBtb2RlIGFuZAorICogQVRBX0RJVEVSXyogZGV2aWNlIGl0ZXJhdGlvbiBtb2RlLgorICoKKyAqIEZvciBhIGN1c3RvbSBpdGVyYXRpb24gZGlyZWN0bHkgdXNpbmcgYXRhX3tsaW5rfGRldn1fbmV4dCgpLCBpZgorICogQGxpbmsgb3IgQGRldiwgcmVzcGVjdGl2ZWx5LCBpcyBOVUxMLCB0aGUgZmlyc3QgZWxlbWVudCBpcworICogcmV0dXJuZWQuICBAZGV2IGFuZCBAbGluayBjYW4gYmUgYW55IHZhbGlkIGRldmljZSBvciBsaW5rIGFuZCB0aGUKKyAqIG5leHQgZWxlbWVudCBhY2NvcmRpbmcgdG8gdGhlIGl0ZXJhdGlvbiBtb2RlIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBBZnRlciB0aGUgbGFzdCBlbGVtZW50LCBOVUxMIGlzIHJldHVybmVkLgorICovCitlbnVtIGF0YV9saW5rX2l0ZXJfbW9kZSB7CisJQVRBX0xJVEVSX0VER0UsCQkvKiBpZiBwcmVzZW50LCBQTVAgbGlua3Mgb25seTsgb3RoZXJ3aXNlLAorCQkJCSAqIGhvc3QgbGluay4gIG5vIHNsYXZlIGxpbmsgKi8KKwlBVEFfTElURVJfSE9TVF9GSVJTVCwJLyogaG9zdCBsaW5rIGZvbGxvd2VkIGJ5IFBNUCBvciBzbGF2ZSBsaW5rcyAqLworCUFUQV9MSVRFUl9QTVBfRklSU1QsCS8qIFBNUCBsaW5rcyBmb2xsb3dlZCBieSBob3N0IGxpbmssCisJCQkJICogc2xhdmUgbGluayBzdGlsbCBjb21lcyBhZnRlciBob3N0IGxpbmsgKi8KK307CiAKLSNkZWZpbmUgX19hdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSBcCi0JZm9yICgobGluaykgPSBfX2F0YV9wb3J0X25leHRfbGluaygoYXApLCBOVUxMLCBmYWxzZSk7IChsaW5rKTsgXAotCSAgICAgKGxpbmspID0gX19hdGFfcG9ydF9uZXh0X2xpbmsoKGFwKSwgKGxpbmspLCBmYWxzZSkpCitlbnVtIGF0YV9kZXZfaXRlcl9tb2RlIHsKKwlBVEFfRElURVJfRU5BQkxFRCwKKwlBVEFfRElURVJfRU5BQkxFRF9SRVZFUlNFLAorCUFUQV9ESVRFUl9BTEwsCisJQVRBX0RJVEVSX0FMTF9SRVZFUlNFLAorfTsKIAotI2RlZmluZSBhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSBcCi0JZm9yICgobGluaykgPSBfX2F0YV9wb3J0X25leHRfbGluaygoYXApLCBOVUxMLCB0cnVlKTsgKGxpbmspOyBcCi0JICAgICAobGluaykgPSBfX2F0YV9wb3J0X25leHRfbGluaygoYXApLCAobGluayksIHRydWUpKQorZXh0ZXJuIHN0cnVjdCBhdGFfbGluayAqYXRhX2xpbmtfbmV4dChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCisJCQkJICAgICAgc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICBlbnVtIGF0YV9saW5rX2l0ZXJfbW9kZSBtb2RlKTsKIAotI2RlZmluZSBhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSBcCi0JZm9yICgoZGV2KSA9IChsaW5rKS0+ZGV2aWNlOyBcCi0JICAgICAoZGV2KSA8IChsaW5rKS0+ZGV2aWNlICsgYXRhX2xpbmtfbWF4X2RldmljZXMobGluaykgfHwgKChkZXYpID0gTlVMTCk7IFwKLQkgICAgIChkZXYpKyspCitleHRlcm4gc3RydWN0IGF0YV9kZXZpY2UgKmF0YV9kZXZfbmV4dChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCisJCQkJICAgICAgIGVudW0gYXRhX2Rldl9pdGVyX21vZGUgbW9kZSk7CiAKLSNkZWZpbmUgYXRhX2xpbmtfZm9yX2VhY2hfZGV2X3JldmVyc2UoZGV2LCBsaW5rKSBcCi0JZm9yICgoZGV2KSA9IChsaW5rKS0+ZGV2aWNlICsgYXRhX2xpbmtfbWF4X2RldmljZXMobGluaykgLSAxOyBcCi0JICAgICAoZGV2KSA+PSAobGluayktPmRldmljZSB8fCAoKGRldikgPSBOVUxMKTsgKGRldiktLSkKKy8qCisgKiBTaG9ydGN1dCBub3RhdGlvbiBmb3IgaXRlcmF0aW9ucworICoKKyAqIGF0YV9mb3JfZWFjaF9saW5rKCkgaXRlcmF0ZXMgb3ZlciBlYWNoIGxpbmsgb2YgQGFwIGFjY29yZGluZyB0bworICogQG1vZGUuICBAbGluayBwb2ludHMgdG8gdGhlIGN1cnJlbnQgbGluayBpbiB0aGUgbG9vcC4gIEBsaW5rIGlzCisgKiBOVUxMIGFmdGVyIGxvb3AgdGVybWluYXRpb24uICBhdGFfZm9yX2VhY2hfZGV2KCkgd29ya3MgdGhlIHNhbWUgd2F5CisgKiBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVhY2ggZGV2aWNlIG9mIEBsaW5rLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgbW9kZSBwcmVmaXhlcyBBVEFfe0x8RH1JVEVSXyBzaG91bGRuJ3QgbmVlZCB0byBiZQorICogc3BlY2lmaWVkIHdoZW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzaG9ydGhhbmQgbm90YXRpb25zLiAgT25seSB0aGUKKyAqIG1vZGUgaXRzZWxmIChFREdFLCBIT1NUX0ZJUlNULCBFTkFCTEVELCBldGMuLi4pIHNob3VsZCBiZQorICogc3BlY2lmaWVkLiAgVGhpcyBub3Qgb25seSBpbmNyZWFzZXMgYnJldml0eSBidXQgYWxzbyBtYWtlcyBpdAorICogaW1wb3NzaWJsZSB0byB1c2UgQVRBX0xJVEVSXyogZm9yIGRldmljZSBpdGVyYXRpb24gb3IgdmljZS12ZXJzYS4KKyAqLworI2RlZmluZSBhdGFfZm9yX2VhY2hfbGluayhsaW5rLCBhcCwgbW9kZSkgXAorCWZvciAoKGxpbmspID0gYXRhX2xpbmtfbmV4dChOVUxMLCAoYXApLCBBVEFfTElURVJfIyNtb2RlKTsgKGxpbmspOyBcCisJICAgICAobGluaykgPSBhdGFfbGlua19uZXh0KChsaW5rKSwgKGFwKSwgQVRBX0xJVEVSXyMjbW9kZSkpCisKKyNkZWZpbmUgYXRhX2Zvcl9lYWNoX2RldihkZXYsIGxpbmssIG1vZGUpIFwKKwlmb3IgKChkZXYpID0gYXRhX2Rldl9uZXh0KE5VTEwsIChsaW5rKSwgQVRBX0RJVEVSXyMjbW9kZSk7IChkZXYpOyBcCisJICAgICAoZGV2KSA9IGF0YV9kZXZfbmV4dCgoZGV2KSwgKGxpbmspLCBBVEFfRElURVJfIyNtb2RlKSkKIAogLyoqCiAgKglhdGFfbmNxX2VuYWJsZWQgLSBUZXN0IHdoZXRoZXIgTkNRIGlzIGVuYWJsZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKaW5kZXggZTU4NzJkYy4uZmJjNDhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAlzaXplX3QJCQlhZGRybGVuOwogCXVuc2lnbmVkIHNob3J0CQlwcm90b2NvbDsKIAl1MzIJCQluZnNfdmVyc2lvbjsKKwlpbnQJCQlub3Jlc3Zwb3J0OwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCBiNTZkNWFhLi4yM2RhM2ZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC00OSw2ICs0OSw3IEBACiAJdW5zaWduZWQgc2hvcnQJCWhfcHJvdG87CS8qIHRyYW5zcG9ydCBwcm90byAqLwogCXVuc2lnbmVkIHNob3J0CQloX3JlY2xhaW1pbmcgOiAxLAogCQkJCWhfc2VydmVyICAgICA6IDEsIC8qIHNlcnZlciBzaWRlLCBub3QgY2xpZW50IHNpZGUgKi8KKwkJCQloX25vcmVzdnBvcnQgOiAxLAogCQkJCWhfaW51c2UgICAgICA6IDE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJaF9ncmFjZXdhaXQ7CS8qIHdhaXQgd2hpbGUgcmVjbGFpbWluZyAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUJaF9yd3NlbTsJLyogUmVib290IHJlY292ZXJ5IGxvY2sgKi8KQEAgLTIyMCw3ICsyMjEsOCBAQAogCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCiAJCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAogCQkJCQljb25zdCB1MzIgdmVyc2lvbiwKLQkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUpOworCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJaW50IG5vcmVzdnBvcnQpOwogc3RydWN0IG5sbV9ob3N0ICAqbmxtc3ZjX2xvb2t1cF9ob3N0KGNvbnN0IHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAogCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKaW5kZXggMjlhZWM2ZS4uMjNiZjAyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKQEAgLTczLDYgKzczLDggQEAKIAlzdHJ1Y3QgbG9ja2RlcF9zdWJjbGFzc19rZXkJc3Via2V5c1tNQVhfTE9DS0RFUF9TVUJDTEFTU0VTXTsKIH07CiAKKyNkZWZpbmUgTE9DS1NUQVRfUE9JTlRTCQk0CisKIC8qCiAgKiBUaGUgbG9jay1jbGFzcyBpdHNlbGY6CiAgKi8KQEAgLTExOSw3ICsxMjEsOCBAQAogCWludAkJCQluYW1lX3ZlcnNpb247CiAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCi0JdW5zaWduZWQgbG9uZwkJCWNvbnRlbnRpb25fcG9pbnRbNF07CisJdW5zaWduZWQgbG9uZwkJCWNvbnRlbnRpb25fcG9pbnRbTE9DS1NUQVRfUE9JTlRTXTsKKwl1bnNpZ25lZCBsb25nCQkJY29udGVuZGluZ19wb2ludFtMT0NLU1RBVF9QT0lOVFNdOwogI2VuZGlmCiB9OwogCkBAIC0xNDQsNiArMTQ3LDcgQEAKIAogc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHMgewogCXVuc2lnbmVkIGxvbmcJCQljb250ZW50aW9uX3BvaW50WzRdOworCXVuc2lnbmVkIGxvbmcJCQljb250ZW5kaW5nX3BvaW50WzRdOwogCXN0cnVjdCBsb2NrX3RpbWUJCXJlYWRfd2FpdHRpbWU7CiAJc3RydWN0IGxvY2tfdGltZQkJd3JpdGVfd2FpdHRpbWU7CiAJc3RydWN0IGxvY2tfdGltZQkJcmVhZF9ob2xkdGltZTsKQEAgLTE2NSw2ICsxNjksNyBAQAogCWNvbnN0IGNoYXIJCQkqbmFtZTsKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCiAJaW50CQkJCWNwdTsKKwl1bnNpZ25lZCBsb25nCQkJaXA7CiAjZW5kaWYKIH07CiAKQEAgLTMwOSw4ICszMTQsMTUgQEAKIGV4dGVybiB2b2lkIGxvY2tfcmVsZWFzZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGludCBuZXN0ZWQsCiAJCQkgdW5zaWduZWQgbG9uZyBpcCk7CiAKLWV4dGVybiB2b2lkIGxvY2tfc2V0X3N1YmNsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBpcCk7CitleHRlcm4gdm9pZCBsb2NrX3NldF9jbGFzcyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSwgdW5zaWduZWQgaW50IHN1YmNsYXNzLAorCQkJICAgdW5zaWduZWQgbG9uZyBpcCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX3NldF9zdWJjbGFzcyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssCisJCXVuc2lnbmVkIGludCBzdWJjbGFzcywgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlsb2NrX3NldF9jbGFzcyhsb2NrLCBsb2NrLT5uYW1lLCBsb2NrLT5rZXksIHN1YmNsYXNzLCBpcCk7Cit9CiAKICMgZGVmaW5lIElOSVRfTE9DS0RFUAkJCQkubG9ja2RlcF9yZWN1cnNpb24gPSAwLAogCkBAIC0zMjgsNiArMzQwLDcgQEAKIAogIyBkZWZpbmUgbG9ja19hY3F1aXJlKGwsIHMsIHQsIHIsIGMsIG4sIGkpCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tfcmVsZWFzZShsLCBuLCBpKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGxvY2tfc2V0X2NsYXNzKGwsIG4sIGssIHMsIGkpCQlkbyB7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBsb2NrX3NldF9zdWJjbGFzcyhsLCBzLCBpKQkJZG8geyB9IHdoaWxlICgwKQogIyBkZWZpbmUgbG9ja2RlcF9pbml0KCkJCQkJZG8geyB9IHdoaWxlICgwKQogIyBkZWZpbmUgbG9ja2RlcF9pbmZvKCkJCQkJZG8geyB9IHdoaWxlICgwKQpAQCAtMzU2LDcgKzM2OSw3IEBACiAjaWZkZWYgQ09ORklHX0xPQ0tfU1RBVAogCiBleHRlcm4gdm9pZCBsb2NrX2NvbnRlbmRlZChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGxvbmcgaXApOwotZXh0ZXJuIHZvaWQgbG9ja19hY3F1aXJlZChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2spOworZXh0ZXJuIHZvaWQgbG9ja19hY3F1aXJlZChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGxvbmcgaXApOwogCiAjZGVmaW5lIExPQ0tfQ09OVEVOREVEKF9sb2NrLCB0cnksIGxvY2spCQkJXAogZG8gewkJCQkJCQkJXApAQCAtMzY0LDIwICszNzcsMjAgQEAKIAkJbG9ja19jb250ZW5kZWQoJihfbG9jayktPmRlcF9tYXAsIF9SRVRfSVBfKTsJXAogCQlsb2NrKF9sb2NrKTsJCQkJCVwKIAl9CQkJCQkJCVwKLQlsb2NrX2FjcXVpcmVkKCYoX2xvY2spLT5kZXBfbWFwKTsJCQlcCisJbG9ja19hY3F1aXJlZCgmKF9sb2NrKS0+ZGVwX21hcCwgX1JFVF9JUF8pOwkJCVwKIH0gd2hpbGUgKDApCiAKICNlbHNlIC8qIENPTkZJR19MT0NLX1NUQVQgKi8KIAogI2RlZmluZSBsb2NrX2NvbnRlbmRlZChsb2NrZGVwX21hcCwgaXApIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBsb2NrX2FjcXVpcmVkKGxvY2tkZXBfbWFwKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbG9ja19hY3F1aXJlZChsb2NrZGVwX21hcCwgaXApIGRvIHt9IHdoaWxlICgwKQogCiAjZGVmaW5lIExPQ0tfQ09OVEVOREVEKF9sb2NrLCB0cnksIGxvY2spIFwKIAlsb2NrKF9sb2NrKQogCiAjZW5kaWYgLyogQ09ORklHX0xPQ0tfU1RBVCAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVFJBQ0VfSVJRRkxBR1MpICYmIGRlZmluZWQoQ09ORklHX0dFTkVSSUNfSEFSRElSUVMpCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfSEFSRElSUVMKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfaXJxX2xvY2tfY2xhc3Modm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X2luaXRfaXJxX2xvY2tfY2xhc3Modm9pZCkKQEAgLTQ4MSw0ICs0OTQsMjIgQEAKICMgZGVmaW5lIGxvY2tfbWFwX3JlbGVhc2UobCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCisjIGRlZmluZSBtaWdodF9sb2NrKGxvY2spIAkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdHlwZWNoZWNrKHN0cnVjdCBsb2NrZGVwX21hcCAqLCAmKGxvY2spLT5kZXBfbWFwKTsJCVwKKwlsb2NrX2FjcXVpcmUoJihsb2NrKS0+ZGVwX21hcCwgMCwgMCwgMCwgMiwgTlVMTCwgX1RISVNfSVBfKTsJXAorCWxvY2tfcmVsZWFzZSgmKGxvY2spLT5kZXBfbWFwLCAwLCBfVEhJU19JUF8pOwkJCVwKK30gd2hpbGUgKDApCisjIGRlZmluZSBtaWdodF9sb2NrX3JlYWQobG9jaykgCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwl0eXBlY2hlY2soc3RydWN0IGxvY2tkZXBfbWFwICosICYobG9jayktPmRlcF9tYXApOwkJXAorCWxvY2tfYWNxdWlyZSgmKGxvY2spLT5kZXBfbWFwLCAwLCAwLCAxLCAyLCBOVUxMLCBfVEhJU19JUF8pOwlcCisJbG9ja19yZWxlYXNlKCYobG9jayktPmRlcF9tYXAsIDAsIF9USElTX0lQXyk7CQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBtaWdodF9sb2NrKGxvY2spIGRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIG1pZ2h0X2xvY2tfcmVhZChsb2NrKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fTElOVVhfTE9DS0RFUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKaW5kZXggZmU4MjU0NzEuLjljZmM5YjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKQEAgLTIzMiw4ICsyMzIsOSBAQAogCXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOyAvKiBjb3JlZHVtcGluZyBzdXBwb3J0ICovCiAKIAkvKiBhaW8gYml0cyAqLwotCXJ3bG9ja190CQlpb2N0eF9saXN0X2xvY2s7CS8qIGFpbyBsb2NrICovCi0Jc3RydWN0IGtpb2N0eAkJKmlvY3R4X2xpc3Q7CisJc3BpbmxvY2tfdAkJaW9jdHhfbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlpb2N0eF9saXN0OworCiAjaWZkZWYgQ09ORklHX01NX09XTkVSCiAJLyoKIAkgKiAib3duZXIiIHBvaW50cyB0byBhIHRhc2sgdGhhdCBpcyByZWdhcmRlZCBhcyB0aGUgY2Fub25pY2FsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zaS5oIGIvaW5jbHVkZS9saW51eC9tc2kuaAppbmRleCA4ZjI5MzkyLi5kMmI4YTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNpLmgKQEAgLTEwLDggKzEwLDExIEBACiB9OwogCiAvKiBIZWxwZXIgZnVuY3Rpb25zICovCitzdHJ1Y3QgaXJxX2Rlc2M7CiBleHRlcm4gdm9pZCBtYXNrX21zaV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCB1bm1hc2tfbXNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIHJlYWRfbXNpX21zZ19kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgc3RydWN0IG1zaV9tc2cgKm1zZyk7CitleHRlcm4gdm9pZCB3cml0ZV9tc2lfbXNnX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKTsKIGV4dGVybiB2b2lkIHJlYWRfbXNpX21zZyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKTsKIGV4dGVybiB2b2lkIHdyaXRlX21zaV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IG1zaV9tc2cgKm1zZyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaAppbmRleCBiYzZkYTEwLi43YTBlNWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L211dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC0xNDQsNiArMTQ0LDggQEAKIC8qCiAgKiBOT1RFOiBtdXRleF90cnlsb2NrKCkgZm9sbG93cyB0aGUgc3Bpbl90cnlsb2NrKCkgY29udmVudGlvbiwKICAqICAgICAgIG5vdCB0aGUgZG93bl90cnlsb2NrKCkgY29udmVudGlvbiEKKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIG11dGV4IGhhcyBiZWVuIGFjcXVpcmVkIHN1Y2Nlc3NmdWxseSwgYW5kIDAgb24gY29udGVudGlvbi4KICAqLwogZXh0ZXJuIGludCBtdXRleF90cnlsb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CiBleHRlcm4gdm9pZCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDRlYWE4MzQuLmRiODY3YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtODMsNyArODMsNyBAQAogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CiAJZmxfb3duZXJfdCBsb2Nrb3duZXI7Ci0JaW50IG1vZGU7CisJZm1vZGVfdCBtb2RlOwogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKICNkZWZpbmUgTkZTX0NPTlRFWFRfRVJST1JfV1JJVEUJCSgwKQpAQCAtMTMwLDcgKzEzMCwxMCBAQAogCSAqCiAJICogV2UgbmVlZCB0byByZXZhbGlkYXRlIHRoZSBjYWNoZWQgYXR0cnMgZm9yIHRoaXMgaW5vZGUgaWYKIAkgKgotCSAqCWppZmZpZXMgLSByZWFkX2NhY2hlX2ppZmZpZXMgPiBhdHRydGltZW8KKwkgKglqaWZmaWVzIC0gcmVhZF9jYWNoZV9qaWZmaWVzID49IGF0dHJ0aW1lbworCSAqCisJICogUGxlYXNlIG5vdGUgdGhlIGNvbXBhcmlzb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisJICogc28gdGhhdCB6ZXJvIHRpbWVvdXQgdmFsdWVzIGNhbiBiZSBzcGVjaWZpZWQuCiAJICovCiAJdW5zaWduZWQgbG9uZwkJcmVhZF9jYWNoZV9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcJCWF0dHJ0aW1lbzsKQEAgLTE4MCw3ICsxODMsNyBAQAogICAgICAgICAvKiBORlN2NCBzdGF0ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJb3Blbl9zdGF0ZXM7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uCSpkZWxlZ2F0aW9uOwotCWludAkJCSBkZWxlZ2F0aW9uX3N0YXRlOworCWZtb2RlX3QJCQkgZGVsZWdhdGlvbl9zdGF0ZTsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJ3c2VtOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjQqLwogCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOwpAQCAtMzQyLDcgKzM0NSw3IEBACiBleHRlcm4gdm9pZCBuZnNfc2V0YXR0cl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRyKTsKIGV4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqZ2V0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCk7CiBleHRlcm4gdm9pZCBwdXRfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KTsKLWV4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqbmZzX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgaW50IG1vZGUpOworZXh0ZXJuIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnNfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBmbW9kZV90IG1vZGUpOwogZXh0ZXJuIHU2NCBuZnNfY29tcGF0X3VzZXJfaW5vNjQodTY0IGZpbGVpZCk7CiBleHRlcm4gdm9pZCBuZnNfZmF0dHJfaW5pdChzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cik7CiAKQEAgLTUzMywxMiArNTM2LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfTkZTX1YzX0FDTCAqLwogCiAvKgotICogbGludXgvZnMvbW91bnRfY2xudC5jCi0gKi8KLWV4dGVybiBpbnQgIG5mc19tb3VudChzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBjaGFyICosIGNoYXIgKiwKLQkJICAgICAgaW50LCBpbnQsIHN0cnVjdCBuZnNfZmggKik7Ci0KLS8qCiAgKiBpbmxpbmUgZnVuY3Rpb25zCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNGU0NzdhZS4uOWJiODFhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC00MiwxMiArNDIsNiBAQAogCXN0cnVjdCByYl9yb290CQljbF9vcGVub3duZXJfaWQ7CiAJc3RydWN0IHJiX3Jvb3QJCWNsX2xvY2tvd25lcl9pZDsKIAotCS8qCi0JICogVGhlIGZvbGxvd2luZyByd3NlbSBlbnN1cmVzIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHNlcnZlcgotCSAqIHdoaWxlIHdlIHJlY292ZXIgdGhlIHN0YXRlIGZvbGxvd2luZyBhIGxlYXNlIGV4cGlyYXRpb24uCi0JICovCi0Jc3RydWN0IHJ3X3NlbWFwaG9yZQljbF9zZW07Ci0KIAlzdHJ1Y3QgbGlzdF9oZWFkCWNsX2RlbGVnYXRpb25zOwogCXN0cnVjdCByYl9yb290CQljbF9zdGF0ZV9vd25lcnM7CiAJc3BpbmxvY2tfdAkJY2xfbG9jazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmggYi9pbmNsdWRlL2xpbnV4L25mc19tb3VudC5oCmluZGV4IDY1NDlhMDYuLjQ0OTkwMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaApAQCAtNDUsNyArNDUsNyBAQAogCWNoYXIJCWNvbnRleHRbTkZTX01BWF9DT05URVhUX0xFTiArIDFdOwkvKiA2ICovCiB9OwogCi0vKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLworLyogYml0cyBpbiB0aGUgZmxhZ3MgZmllbGQgdmlzaWJsZSB0byB1c2VyIHNwYWNlICovCiAKICNkZWZpbmUgTkZTX01PVU5UX1NPRlQJCTB4MDAwMQkvKiAxICovCiAjZGVmaW5lIE5GU19NT1VOVF9JTlRSCQkweDAwMDIJLyogMSAqLyAvKiBub3cgdW51c2VkLCBidXQgQUJJICovCkBAIC02OCw1ICs2OCw2IEBACiAvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KICNkZWZpbmUgTkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FRwkweDEwMDAwCiAjZGVmaW5lIE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORQkweDIwMDAwCisjZGVmaW5lIE5GU19NT1VOVF9OT1JFU1ZQT1JUCQkweDQwMDAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCBjMWMzMWFjLi5hNTUwYjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTIwLDEzICsxMjAsMTQgQEAKIAljb25zdCBzdHJ1Y3QgbmZzX2ZoICoJZmg7CiAJc3RydWN0IG5mc19zZXFpZCAqCXNlcWlkOwogCWludAkJCW9wZW5fZmxhZ3M7CisJZm1vZGVfdAkJCWZtb2RlOwogCV9fdTY0ICAgICAgICAgICAgICAgICAgIGNsaWVudGlkOwogCV9fdTY0ICAgICAgICAgICAgICAgICAgIGlkOwogCXVuaW9uIHsKIAkJc3RydWN0IGlhdHRyICogIGF0dHJzOyAgICAvKiBVTkNIRUNLRUQsIEdVQVJERUQgKi8KIAkJbmZzNF92ZXJpZmllciAgIHZlcmlmaWVyOyAvKiBFWENMVVNJVkUgKi8KIAkJbmZzNF9zdGF0ZWlkCWRlbGVnYXRpb247CQkvKiBDTEFJTV9ERUxFR0FURV9DVVIgKi8KLQkJaW50CQlkZWxlZ2F0aW9uX3R5cGU7CS8qIENMQUlNX1BSRVZJT1VTICovCisJCWZtb2RlX3QJCWRlbGVnYXRpb25fdHlwZTsJLyogQ0xBSU1fUFJFVklPVVMgKi8KIAl9IHU7CiAJY29uc3Qgc3RydWN0IHFzdHIgKgluYW1lOwogCWNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CSAvKiBOZWVkZWQgZm9yIElEIG1hcHBpbmcgKi8KQEAgLTE0Myw3ICsxNDQsNyBAQAogCXN0cnVjdCBuZnNfZmF0dHIgKiAgICAgIGRpcl9hdHRyOwogCXN0cnVjdCBuZnNfc2VxaWQgKglzZXFpZDsKIAljb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOwotCWludAkJCWRlbGVnYXRpb25fdHlwZTsKKwlmbW9kZV90CQkJZGVsZWdhdGlvbl90eXBlOwogCW5mczRfc3RhdGVpZAkJZGVsZWdhdGlvbjsKIAlfX3UzMgkJCWRvX3JlY2FsbDsKIAlfX3U2NAkJCW1heHNpemU7CkBAIC0xNzEsNyArMTcyLDcgQEAKIAlzdHJ1Y3QgbmZzX2ZoICogICAgICAgICBmaDsKIAluZnM0X3N0YXRlaWQgKgkJc3RhdGVpZDsKIAlzdHJ1Y3QgbmZzX3NlcWlkICoJc2VxaWQ7Ci0JaW50CQkJb3Blbl9mbGFnczsKKwlmbW9kZV90CQkJZm1vZGU7CiAJY29uc3QgdTMyICoJCWJpdG1hc2s7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCmluZGV4IGQwZmUyZTMuLjEyODI5OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCkBAIC0xMjQsNiArMTI0LDggQEAKIAluZnM0X3ZlcmlmaWVyCQljbF92ZXJpZmllcjsgCS8qIGdlbmVyYXRlZCBieSBjbGllbnQgKi8KIAl0aW1lX3QgICAgICAgICAgICAgICAgICBjbF90aW1lOyAgICAgICAgLyogdGltZSBvZiBsYXN0IGxlYXNlIHJlbmV3YWwgKi8KIAlfX2JlMzIJCQljbF9hZGRyOyAJLyogY2xpZW50IGlwYWRkcmVzcyAqLworCXUzMgkJCWNsX2ZsYXZvcjsJLyogc2V0Y2xpZW50aWQgcHNldWRvZmxhdm9yICovCisJY2hhcgkJCSpjbF9wcmluY2lwYWw7CS8qIHNldGNsaWVudGlkIHByaW5jaXBhbCBuYW1lICovCiAJc3RydWN0IHN2Y19jcmVkCQljbF9jcmVkOyAJLyogc2V0Y2xpZW50aWQgcHJpbmNpcGFsICovCiAJY2xpZW50aWRfdAkJY2xfY2xpZW50aWQ7CS8qIGdlbmVyYXRlZCBieSBzZXJ2ZXIgKi8KIAluZnM0X3ZlcmlmaWVyCQljbF9jb25maXJtOwkvKiBnZW5lcmF0ZWQgYnkgc2VydmVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmggYi9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmgKaW5kZXggYThlZmNmZS4uM2QzMjdiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaApAQCAtMjYsOCArMjYsNyBAQAogCiAvKgogICogQW4gb2ZfcGxhdGZvcm1fZHJpdmVyIGRyaXZlciBpcyBhdHRhY2hlZCB0byBhIGJhc2ljIG9mX2RldmljZSBvbgotICogdGhlICJwbGF0Zm9ybSBidXMiIChvZl9wbGF0Zm9ybV9idXNfdHlwZSkgKG9yIElTQSwgRUJVUyBhbmQgU0JVUwotICogYnVzc2VzIG9uIHNwYXJjKS4KKyAqIHRoZSAicGxhdGZvcm0gYnVzIiAob2ZfcGxhdGZvcm1fYnVzX3R5cGUpLgogICovCiBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29wcm9maWxlLmggYi9pbmNsdWRlL2xpbnV4L29wcm9maWxlLmgKaW5kZXggNTIzMTg2MS4uMWNlOWZlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvb3Byb2ZpbGUuaApAQCAtODYsOCArODYsNyBAQAogdm9pZCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCk7CiAKIC8qKgotICogQWRkIGEgc2FtcGxlLiBUaGlzIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gUGFzcwotICogc21wX3Byb2Nlc3Nvcl9pZCgpIGFzIGNwdS4KKyAqIEFkZCBhIHNhbXBsZS4gVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCiAgKi8KIHZvaWQgb3Byb2ZpbGVfYWRkX3NhbXBsZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGxvbmcgZXZlbnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvc2l4LXRpbWVycy5oIGIvaW5jbHVkZS9saW51eC9wb3NpeC10aW1lcnMuaAppbmRleCBhN2M3MjEzLi40ZjcxYmY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvc2l4LXRpbWVycy5oCisrKyBiL2luY2x1ZGUvbGludXgvcG9zaXgtdGltZXJzLmgKQEAgLTQ1LDcgKzQ1LDExIEBACiAJaW50IGl0X3JlcXVldWVfcGVuZGluZzsJCS8qIHdhaXRpbmcgdG8gcmVxdWV1ZSB0aGlzIHRpbWVyICovCiAjZGVmaW5lIFJFUVVFVUVfUEVORElORyAxCiAJaW50IGl0X3NpZ2V2X25vdGlmeTsJCS8qIG5vdGlmeSB3b3JkIG9mIHNpZ2V2ZW50IHN0cnVjdCAqLwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqaXRfcHJvY2VzczsJLyogcHJvY2VzcyB0byBzZW5kIHNpZ25hbCB0byAqLworCXN0cnVjdCBzaWduYWxfc3RydWN0ICppdF9zaWduYWw7CisJdW5pb24geworCQlzdHJ1Y3QgcGlkICppdF9waWQ7CS8qIHBpZCBvZiBwcm9jZXNzIHRvIHNlbmQgc2lnbmFsIHRvICovCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqaXRfcHJvY2VzczsJLyogZm9yIGNsb2NrX25hbm9zbGVlcCAqLworCX07CiAJc3RydWN0IHNpZ3F1ZXVlICpzaWdxOwkJLyogc2lnbmFsIHF1ZXVlIGVudHJ5LiAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCmluZGV4IDM2ZjEyNWMuLmFkYmYzYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaApAQCAtOCw2ICs4LDcgQEAKICNkZWZpbmUgX0xJTlVYX1JBTkRPTV9ICiAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+CiAKIC8qIGlvY3RsKCkncyBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICovCiAKQEAgLTQ0LDYgKzQ1LDU2IEBACiAKIGV4dGVybiB2b2lkIHJhbmRfaW5pdGlhbGl6ZV9pcnEoaW50IGlycSk7CiAKK3N0cnVjdCB0aW1lcl9yYW5kX3N0YXRlOworI2lmbmRlZiBDT05GSUdfU1BBUlNFX0lSUQorCitleHRlcm4gc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKmlycV90aW1lcl9zdGF0ZVtdOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICpnZXRfdGltZXJfcmFuZF9zdGF0ZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPj0gbnJfaXJxcykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaXJxX3RpbWVyX3N0YXRlW2lycV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGltZXJfcmFuZF9zdGF0ZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKGlycSA+PSBucl9pcnFzKQorCQlyZXR1cm47CisKKwlpcnFfdGltZXJfc3RhdGVbaXJxXSA9IHN0YXRlOworfQorCisjZWxzZQorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICpnZXRfdGltZXJfcmFuZF9zdGF0ZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKCFkZXNjKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkZXNjLT50aW1lcl9yYW5kX3N0YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RpbWVyX3JhbmRfc3RhdGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJaWYgKCFkZXNjKQorCQlyZXR1cm47CisKKwlkZXNjLT50aW1lcl9yYW5kX3N0YXRlID0gc3RhdGU7Cit9CisjZW5kaWYKKworCiBleHRlcm4gdm9pZCBhZGRfaW5wdXRfcmFuZG9tbmVzcyh1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsCiAJCQkJIHVuc2lnbmVkIGludCB2YWx1ZSk7CiBleHRlcm4gdm9pZCBhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaW50IGlycSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdWNsYXNzaWMuaCBiL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCmluZGV4IDVmODliNjIuLjMwMWRkYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogCiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKLSNkZWZpbmUgUkNVX1NFQ09ORFNfVElMTF9TVEFMTF9DSEVDSwkoIDMgKiBIWikgLyogZm9yIHJjcC0+amlmZmllc19zdGFsbCAqLworI2RlZmluZSBSQ1VfU0VDT05EU19USUxMX1NUQUxMX0NIRUNLCSgxMCAqIEhaKSAvKiBmb3IgcmNwLT5qaWZmaWVzX3N0YWxsICovCiAjZGVmaW5lIFJDVV9TRUNPTkRTX1RJTExfU1RBTExfUkVDSEVDSwkoMzAgKiBIWikgLyogZm9yIHJjcC0+amlmZmllc19zdGFsbCAqLwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggODk1ZGM5Yy4uMTE2OGZiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtNTIsMTEgKzUyLDE1IEBACiAJdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqaGVhZCk7CiB9OwogCi0jaWZkZWYgQ09ORklHX0NMQVNTSUNfUkNVCisjaWYgZGVmaW5lZChDT05GSUdfQ0xBU1NJQ19SQ1UpCiAjaW5jbHVkZSA8bGludXgvcmN1Y2xhc3NpYy5oPgotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19DTEFTU0lDX1JDVSAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfVFJFRV9SQ1UpCisjaW5jbHVkZSA8bGludXgvcmN1dHJlZS5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVF9SQ1UpCiAjaW5jbHVkZSA8bGludXgvcmN1cHJlZW1wdC5oPgotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfQ0xBU1NJQ19SQ1UgKi8KKyNlbHNlCisjZXJyb3IgIlVua25vd24gUkNVIGltcGxlbWVudGF0aW9uIHNwZWNpZmllZCB0byBrZXJuZWwgY29uZmlndXJhdGlvbiIKKyNlbmRpZiAvKiAjZWxzZSAjaWYgZGVmaW5lZChDT05GSUdfQ0xBU1NJQ19SQ1UpICovCiAKICNkZWZpbmUgUkNVX0hFQURfSU5JVCAJeyAubmV4dCA9IE5VTEwsIC5mdW5jID0gTlVMTCB9CiAjZGVmaW5lIFJDVV9IRUFEKGhlYWQpIHN0cnVjdCByY3VfaGVhZCBoZWFkID0gUkNVX0hFQURfSU5JVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3V0cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM2OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBSZWFkLUNvcHkgVXBkYXRlIG1lY2hhbmlzbSBmb3IgbXV0dWFsIGV4Y2x1c2lvbiAodHJlZS1iYXNlZCB2ZXJzaW9uKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAorICoKKyAqIEF1dGhvcjogRGlwYW5rYXIgU2FybWEgPGRpcGFua2FyQGluLmlibS5jb20+CisgKgkgICBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4gSGllcmFyY2hpY2FsIGFsZ29yaXRobQorICoKKyAqIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIGJ5IFBhdWwgTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4KKyAqIGFuZCBpbnB1dHMgZnJvbSBSdXN0eSBSdXNzZWxsLCBBbmRyZWEgQXJjYW5nZWxpIGFuZCBBbmRpIEtsZWVuLgorICoKKyAqIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBSZWFkLUNvcHkgVXBkYXRlIG1lY2hhbmlzbSBzZWUgLQorICogCURvY3VtZW50YXRpb24vUkNVCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1JDVVRSRUVfSAorI2RlZmluZSBfX0xJTlVYX1JDVVRSRUVfSAorCisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorCisvKgorICogRGVmaW5lIHNoYXBlIG9mIGhpZXJhcmNoeSBiYXNlZCBvbiBOUl9DUFVTIGFuZCBDT05GSUdfUkNVX0ZBTk9VVC4KKyAqIEluIHRoZW9yeSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGFkZCBtb3JlIGxldmVscyBzdHJhaWdodGZvcndhcmRseS4KKyAqIEluIHByYWN0aWNlLCB0aGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQsIHNvIHRoZXJlIGlzIHByb2JhYmx5IHNvbWUKKyAqIGJ1ZyBzb21ld2hlcmUuCisgKi8KKyNkZWZpbmUgTUFYX1JDVV9MVkxTIDMKKyNkZWZpbmUgUkNVX0ZBTk9VVAkgICAgICAoQ09ORklHX1JDVV9GQU5PVVQpCisjZGVmaW5lIFJDVV9GQU5PVVRfU1EJICAgICAgKFJDVV9GQU5PVVQgKiBSQ1VfRkFOT1VUKQorI2RlZmluZSBSQ1VfRkFOT1VUX0NVQkUJICAgICAgKFJDVV9GQU5PVVRfU1EgKiBSQ1VfRkFOT1VUKQorCisjaWYgTlJfQ1BVUyA8PSBSQ1VfRkFOT1VUCisjICBkZWZpbmUgTlVNX1JDVV9MVkxTCSAgICAgIDEKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8wCSAgICAgIDEKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8xCSAgICAgIChOUl9DUFVTKQorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzIJICAgICAgMAorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzMJICAgICAgMAorI2VsaWYgTlJfQ1BVUyA8PSBSQ1VfRkFOT1VUX1NRCisjICBkZWZpbmUgTlVNX1JDVV9MVkxTCSAgICAgIDIKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8wCSAgICAgIDEKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8xCSAgICAgICgoKE5SX0NQVVMpICsgUkNVX0ZBTk9VVCAtIDEpIC8gUkNVX0ZBTk9VVCkKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8yCSAgICAgIChOUl9DUFVTKQorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzMJICAgICAgMAorI2VsaWYgTlJfQ1BVUyA8PSBSQ1VfRkFOT1VUX0NVQkUKKyMgIGRlZmluZSBOVU1fUkNVX0xWTFMJICAgICAgMworIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzAJICAgICAgMQorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzEJICAgICAgKCgoTlJfQ1BVUykgKyBSQ1VfRkFOT1VUX1NRIC0gMSkgLyBSQ1VfRkFOT1VUX1NRKQorIyAgZGVmaW5lIE5VTV9SQ1VfTFZMXzIJICAgICAgKCgoTlJfQ1BVUykgKyAoUkNVX0ZBTk9VVCkgLSAxKSAvIChSQ1VfRkFOT1VUKSkKKyMgIGRlZmluZSBOVU1fUkNVX0xWTF8zCSAgICAgIE5SX0NQVVMKKyNlbHNlCisjIGVycm9yICJDT05GSUdfUkNVX0ZBTk9VVCBpbnN1ZmZpY2llbnQgZm9yIE5SX0NQVVMiCisjZW5kaWYgLyogI2lmIChOUl9DUFVTKSA8PSBSQ1VfRkFOT1VUICovCisKKyNkZWZpbmUgUkNVX1NVTSAoTlVNX1JDVV9MVkxfMCArIE5VTV9SQ1VfTFZMXzEgKyBOVU1fUkNVX0xWTF8yICsgTlVNX1JDVV9MVkxfMykKKyNkZWZpbmUgTlVNX1JDVV9OT0RFUyAoUkNVX1NVTSAtIE5SX0NQVVMpCisKKy8qCisgKiBEeW50aWNrcyBwZXItQ1BVIHN0YXRlLgorICovCitzdHJ1Y3QgcmN1X2R5bnRpY2tzIHsKKwlpbnQgZHludGlja3NfbmVzdGluZzsJLyogVHJhY2sgbmVzdGluZyBsZXZlbCwgc29ydCBvZi4gKi8KKwlpbnQgZHludGlja3M7CQkvKiBFdmVuIHZhbHVlIGZvciBkeW50aWNrcy1pZGxlLCBlbHNlIG9kZC4gKi8KKwlpbnQgZHludGlja3Nfbm1pOwkvKiBFdmVuIHZhbHVlIGZvciBlaXRoZXIgZHludGlja3MtaWRsZSBvciAqLworCQkJCS8qICBub3QgaW4gbm1pIGhhbmRsZXIsIGVsc2Ugb2RkLiAgU28gdGhpcyAqLworCQkJCS8qICByZW1haW5zIGV2ZW4gZm9yIG5taSBmcm9tIGlycSBoYW5kbGVyLiAqLworfTsKKworLyoKKyAqIERlZmluaXRpb24gZm9yIG5vZGUgd2l0aGluIHRoZSBSQ1UgZ3JhY2UtcGVyaW9kLWRldGVjdGlvbiBoaWVyYXJjaHkuCisgKi8KK3N0cnVjdCByY3Vfbm9kZSB7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGxvbmcgcXNtYXNrOwkvKiBDUFVzIG9yIGdyb3VwcyB0aGF0IG5lZWQgdG8gc3dpdGNoIGluICovCisJCQkJLyogIG9yZGVyIGZvciBjdXJyZW50IGdyYWNlIHBlcmlvZCB0byBwcm9jZWVkLiovCisJdW5zaWduZWQgbG9uZyBxc21hc2tpbml0OworCQkJCS8qIFBlci1HUCBpbml0aWFsaXphdGlvbiBmb3IgcXNtYXNrLiAqLworCXVuc2lnbmVkIGxvbmcgZ3JwbWFzazsJLyogTWFzayB0byBhcHBseSB0byBwYXJlbnQgcXNtYXNrLiAqLworCWludAlncnBsbzsJCS8qIGxvd2VzdC1udW1iZXJlZCBDUFUgb3IgZ3JvdXAgaGVyZS4gKi8KKwlpbnQJZ3JwaGk7CQkvKiBoaWdoZXN0LW51bWJlcmVkIENQVSBvciBncm91cCBoZXJlLiAqLworCXU4CWdycG51bTsJCS8qIENQVS9ncm91cCBudW1iZXIgZm9yIG5leHQgbGV2ZWwgdXAuICovCisJdTgJbGV2ZWw7CQkvKiByb290IGlzIGF0IGxldmVsIDAuICovCisJc3RydWN0IHJjdV9ub2RlICpwYXJlbnQ7Cit9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CisKKy8qIEluZGV4IHZhbHVlcyBmb3Igbnh0dGFpbCBhcnJheSBpbiBzdHJ1Y3QgcmN1X2RhdGEuICovCisjZGVmaW5lIFJDVV9ET05FX1RBSUwJCTAJLyogQWxzbyBSQ1VfV0FJVCBoZWFkLiAqLworI2RlZmluZSBSQ1VfV0FJVF9UQUlMCQkxCS8qIEFsc28gUkNVX05FWFRfUkVBRFkgaGVhZC4gKi8KKyNkZWZpbmUgUkNVX05FWFRfUkVBRFlfVEFJTAkyCS8qIEFsc28gUkNVX05FWFQgaGVhZC4gKi8KKyNkZWZpbmUgUkNVX05FWFRfVEFJTAkJMworI2RlZmluZSBSQ1VfTkVYVF9TSVpFCQk0CisKKy8qIFBlci1DUFUgZGF0YSBmb3IgcmVhZC1jb3B5IHVwZGF0ZS4gKi8KK3N0cnVjdCByY3VfZGF0YSB7CisJLyogMSkgcXVpZXNjZW50LXN0YXRlIGFuZCBncmFjZS1wZXJpb2QgaGFuZGxpbmcgOiAqLworCWxvbmcJCWNvbXBsZXRlZDsJLyogVHJhY2sgcnNwLT5jb21wbGV0ZWQgZ3AgbnVtYmVyICovCisJCQkJCS8qICBpbiBvcmRlciB0byBkZXRlY3QgR1AgZW5kLiAqLworCWxvbmcJCWdwbnVtOwkJLyogSGlnaGVzdCBncCBudW1iZXIgdGhhdCB0aGlzIENQVSAqLworCQkJCQkvKiAgaXMgYXdhcmUgb2YgaGF2aW5nIHN0YXJ0ZWQuICovCisJbG9uZwkJcGFzc2VkX3F1aWVzY19jb21wbGV0ZWQ7CisJCQkJCS8qIFZhbHVlIG9mIGNvbXBsZXRlZCBhdCB0aW1lIG9mIHFzLiAqLworCWJvb2wJCXBhc3NlZF9xdWllc2M7CS8qIFVzZXItbW9kZS9pZGxlIGxvb3AgZXRjLiAqLworCWJvb2wJCXFzX3BlbmRpbmc7CS8qIENvcmUgd2FpdHMgZm9yIHF1aWVzYyBzdGF0ZS4gKi8KKwlib29sCQliZWVub25saW5lOwkvKiBDUFUgb25saW5lIGF0IGxlYXN0IG9uY2UuICovCisJc3RydWN0IHJjdV9ub2RlICpteW5vZGU7CS8qIFRoaXMgQ1BVJ3MgbGVhZiBvZiBoaWVyYXJjaHkgKi8KKwl1bnNpZ25lZCBsb25nIGdycG1hc2s7CQkvKiBNYXNrIHRvIGFwcGx5IHRvIGxlYWYgcXNtYXNrLiAqLworCisJLyogMikgYmF0Y2ggaGFuZGxpbmcgKi8KKwkvKgorCSAqIElmIG54dGxpc3QgaXMgbm90IE5VTEwsIGl0IGlzIHBhcnRpdGlvbmVkIGFzIGZvbGxvd3MuCisJICogQW55IG9mIHRoZSBwYXJ0aXRpb25zIG1pZ2h0IGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZQorCSAqIHBvaW50ZXIgdG8gdGhhdCBwYXJ0aXRpb24gd2lsbCBiZSBlcXVhbCB0byB0aGUgcG9pbnRlciBmb3IKKwkgKiB0aGUgZm9sbG93aW5nIHBhcnRpdGlvbi4gIFdoZW4gdGhlIGxpc3QgaXMgZW1wdHksIGFsbCBvZgorCSAqIHRoZSBueHR0YWlsIGVsZW1lbnRzIHBvaW50IHRvIG54dGxpc3QsIHdoaWNoIGlzIE5VTEwuCisJICoKKwkgKiBbKm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0sIE5VTEwgPSAqbnh0dGFpbFtSQ1VfTkVYVF9UQUlMXSk6CisJICoJRW50cmllcyB0aGF0IG1pZ2h0IGhhdmUgYXJyaXZlZCBhZnRlciBjdXJyZW50IEdQIGVuZGVkCisJICogWypueHR0YWlsW1JDVV9XQUlUX1RBSUxdLCAqbnh0dGFpbFtSQ1VfTkVYVF9SRUFEWV9UQUlMXSk6CisJICoJRW50cmllcyBrbm93biB0byBoYXZlIGFycml2ZWQgYmVmb3JlIGN1cnJlbnQgR1AgZW5kZWQKKwkgKiBbKm54dHRhaWxbUkNVX0RPTkVfVEFJTF0sICpueHR0YWlsW1JDVV9XQUlUX1RBSUxdKToKKwkgKglFbnRyaWVzIHRoYXQgYmF0Y2ggIyA8PSAtPmNvbXBsZXRlZCAtIDE6IHdhaXRpbmcgZm9yIGN1cnJlbnQgR1AKKwkgKiBbbnh0bGlzdCwgKm54dHRhaWxbUkNVX0RPTkVfVEFJTF0pOgorCSAqCUVudHJpZXMgdGhhdCBiYXRjaCAjIDw9IC0+Y29tcGxldGVkCisJICoJVGhlIGdyYWNlIHBlcmlvZCBmb3IgdGhlc2UgZW50cmllcyBoYXMgY29tcGxldGVkLCBhbmQKKwkgKgl0aGUgb3RoZXIgZ3JhY2UtcGVyaW9kLWNvbXBsZXRlZCBlbnRyaWVzIG1heSBiZSBtb3ZlZAorCSAqCWhlcmUgdGVtcG9yYXJpbHkgaW4gcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkuCisJICovCisJc3RydWN0IHJjdV9oZWFkICpueHRsaXN0OworCXN0cnVjdCByY3VfaGVhZCAqKm54dHRhaWxbUkNVX05FWFRfU0laRV07CisJbG9uZwkJcWxlbjsgCSAJLyogIyBvZiBxdWV1ZWQgY2FsbGJhY2tzICovCisJbG9uZwkJYmxpbWl0OwkJLyogVXBwZXIgbGltaXQgb24gYSBwcm9jZXNzZWQgYmF0Y2ggKi8KKworI2lmZGVmIENPTkZJR19OT19IWgorCS8qIDMpIGR5bnRpY2tzIGludGVyZmFjZS4gKi8KKwlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpkeW50aWNrczsJLyogU2hhcmVkIHBlci1DUFUgZHludGlja3Mgc3RhdGUuICovCisJaW50IGR5bnRpY2tzX3NuYXA7CQkvKiBQZXItR1AgdHJhY2tpbmcgZm9yIGR5bnRpY2tzLiAqLworCWludCBkeW50aWNrc19ubWlfc25hcDsJCS8qIFBlci1HUCB0cmFja2luZyBmb3IgZHludGlja3Nfbm1pLiAqLworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KKworCS8qIDQpIHJlYXNvbnMgdGhpcyBDUFUgbmVlZGVkIHRvIGJlIGtpY2tlZCBieSBmb3JjZV9xdWllc2NlbnRfc3RhdGUgKi8KKyNpZmRlZiBDT05GSUdfTk9fSFoKKwl1bnNpZ25lZCBsb25nIGR5bnRpY2tzX2ZxczsJLyogS2lja2VkIGR1ZSB0byBkeW50aWNrcyBpZGxlLiAqLworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KKwl1bnNpZ25lZCBsb25nIG9mZmxpbmVfZnFzOwkvKiBLaWNrZWQgZHVlIHRvIGJlaW5nIG9mZmxpbmUuICovCisJdW5zaWduZWQgbG9uZyByZXNjaGVkX2lwaTsJLyogU2VudCBhIHJlc2NoZWQgSVBJLiAqLworCisJLyogNSkgc3RhdGUgdG8gYWxsb3cgdGhpcyBDUFUgdG8gZm9yY2VfcXVpZXNjZW50X3N0YXRlIG9uIG90aGVycyAqLworCWxvbmcgbl9yY3VfcGVuZGluZzsJCS8qIHJjdV9wZW5kaW5nKCkgY2FsbHMgc2luY2UgYm9vdC4gKi8KKwlsb25nIG5fcmN1X3BlbmRpbmdfZm9yY2VfcXM7CS8qIHdoZW4gdG8gZm9yY2UgcXVpZXNjZW50IHN0YXRlcy4gKi8KKworCWludCBjcHU7Cit9OworCisvKiBWYWx1ZXMgZm9yIHNpZ25hbGVkIGZpZWxkIGluIHN0cnVjdCByY3Vfc3RhdGUuICovCisjZGVmaW5lIFJDVV9HUF9JTklUCQkwCS8qIEdyYWNlIHBlcmlvZCBiZWluZyBpbml0aWFsaXplZC4gKi8KKyNkZWZpbmUgUkNVX1NBVkVfRFlOVElDSwkxCS8qIE5lZWQgdG8gc2NhbiBkeW50aWNrIHN0YXRlLiAqLworI2RlZmluZSBSQ1VfRk9SQ0VfUVMJCTIJLyogTmVlZCB0byBmb3JjZSBxdWllc2NlbnQgc3RhdGUuICovCisjaWZkZWYgQ09ORklHX05PX0haCisjZGVmaW5lIFJDVV9TSUdOQUxfSU5JVAkJUkNVX1NBVkVfRFlOVElDSworI2Vsc2UgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworI2RlZmluZSBSQ1VfU0lHTkFMX0lOSVQJCVJDVV9GT1JDRV9RUworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfTk9fSFogKi8KKworI2RlZmluZSBSQ1VfSklGRklFU19USUxMX0ZPUkNFX1FTCSAzCS8qIGZvciByc3AtPmppZmZpZXNfZm9yY2VfcXMgKi8KKyNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUgorI2RlZmluZSBSQ1VfU0VDT05EU19USUxMX1NUQUxMX0NIRUNLICAgKDEwICogSFopICAvKiBmb3IgcnNwLT5qaWZmaWVzX3N0YWxsICovCisjZGVmaW5lIFJDVV9TRUNPTkRTX1RJTExfU1RBTExfUkVDSEVDSyAoMzAgKiBIWikgIC8qIGZvciByc3AtPmppZmZpZXNfc3RhbGwgKi8KKyNkZWZpbmUgUkNVX1NUQUxMX1JBVF9ERUxBWQkJMgkgIC8qIEFsbG93IG90aGVyIENQVXMgdGltZSAqLworCQkJCQkJICAvKiAgdG8gdGFrZSBhdCBsZWFzdCBvbmUgKi8KKwkJCQkJCSAgLyogIHNjaGVkdWxpbmcgY2xvY2sgaXJxICovCisJCQkJCQkgIC8qICBiZWZvcmUgcmF0dGluZyBvbiB0aGVtLiAqLworCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCisKKy8qCisgKiBSQ1UgZ2xvYmFsIHN0YXRlLCBpbmNsdWRpbmcgbm9kZSBoaWVyYXJjaHkuICBUaGlzIGhpZXJhcmNoeSBpcworICogcmVwcmVzZW50ZWQgaW4gImhlYXAiIGZvcm0gaW4gYSBkZW5zZSBhcnJheS4gIFRoZSByb290IChmaXJzdCBsZXZlbCkKKyAqIG9mIHRoZSBoaWVyYXJjaHkgaXMgaW4gLT5ub2RlWzBdIChyZWZlcmVuY2VkIGJ5IC0+bGV2ZWxbMF0pLCB0aGUgc2Vjb25kCisgKiBsZXZlbCBpbiAtPm5vZGVbMV0gdGhyb3VnaCAtPm5vZGVbbV0gKC0+bm9kZVsxXSByZWZlcmVuY2VkIGJ5IC0+bGV2ZWxbMV0pLAorICogYW5kIHRoZSB0aGlyZCBsZXZlbCBpbiAtPm5vZGVbbSsxXSBhbmQgZm9sbG93aW5nICgtPm5vZGVbbSsxXSByZWZlcmVuY2VkCisgKiBieSAtPmxldmVsWzJdKS4gIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGlzIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZgorICogQ1BVcyBhbmQgYnkgQ09ORklHX1JDVV9GQU5PVVQuICBTbWFsbCBzeXN0ZW1zIHdpbGwgaGF2ZSBhICJoaWVyYXJjaHkiCisgKiBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIHJjdV9ub2RlLgorICovCitzdHJ1Y3QgcmN1X3N0YXRlIHsKKwlzdHJ1Y3QgcmN1X25vZGUgbm9kZVtOVU1fUkNVX05PREVTXTsJLyogSGllcmFyY2h5LiAqLworCXN0cnVjdCByY3Vfbm9kZSAqbGV2ZWxbTlVNX1JDVV9MVkxTXTsJLyogSGllcmFyY2h5IGxldmVscy4gKi8KKwl1MzIgbGV2ZWxjbnRbTUFYX1JDVV9MVkxTICsgMV07CQkvKiAjIG5vZGVzIGluIGVhY2ggbGV2ZWwuICovCisJdTggbGV2ZWxzcHJlYWRbTlVNX1JDVV9MVkxTXTsJCS8qIGtpZHMvbm9kZSBpbiBlYWNoIGxldmVsLiAqLworCXN0cnVjdCByY3VfZGF0YSAqcmRhW05SX0NQVVNdOwkJLyogYXJyYXkgb2YgcmRwIHBvaW50ZXJzLiAqLworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGd1YXJkZWQgYnkgdGhlIHJvb3QgcmN1X25vZGUncyBsb2NrLiAqLworCisJdTgJc2lnbmFsZWQgX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKKwkJCQkJCS8qIEZvcmNlIFFTIHN0YXRlLiAqLworCWxvbmcJZ3BudW07CQkJCS8qIEN1cnJlbnQgZ3AgbnVtYmVyLiAqLworCWxvbmcJY29tcGxldGVkOwkJCS8qICMgb2YgbGFzdCBjb21wbGV0ZWQgZ3AuICovCisJc3BpbmxvY2tfdCBvbm9mZmxvY2s7CQkJLyogZXhjbHVkZSBvbi9vZmZsaW5lIGFuZCAqLworCQkJCQkJLyogIHN0YXJ0aW5nIG5ldyBHUC4gKi8KKwlzcGlubG9ja190IGZxc2xvY2s7CQkJLyogT25seSBvbmUgdGFzayBmb3JjaW5nICovCisJCQkJCQkvKiAgcXVpZXNjZW50IHN0YXRlcy4gKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfZm9yY2VfcXM7CQkvKiBUaW1lIGF0IHdoaWNoIHRvIGludm9rZSAqLworCQkJCQkJLyogIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpLiAqLworCXVuc2lnbmVkIGxvbmcgbl9mb3JjZV9xczsJCS8qIE51bWJlciBvZiBjYWxscyB0byAqLworCQkJCQkJLyogIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpLiAqLworCXVuc2lnbmVkIGxvbmcgbl9mb3JjZV9xc19saDsJCS8qIH5OdW1iZXIgb2YgY2FsbHMgbGVhdmluZyAqLworCQkJCQkJLyogIGR1ZSB0byBsb2NrIHVuYXZhaWxhYmxlLiAqLworCXVuc2lnbmVkIGxvbmcgbl9mb3JjZV9xc19uZ3A7CQkvKiBOdW1iZXIgb2YgY2FsbHMgbGVhdmluZyAqLworCQkJCQkJLyogIGR1ZSB0byBubyBHUCBhY3RpdmUuICovCisjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKKwl1bnNpZ25lZCBsb25nIGdwX3N0YXJ0OwkJCS8qIFRpbWUgYXQgd2hpY2ggR1Agc3RhcnRlZCwgKi8KKwkJCQkJCS8qICBidXQgaW4gamlmZmllcy4gKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfc3RhbGw7CQkvKiBUaW1lIGF0IHdoaWNoIHRvIGNoZWNrICovCisJCQkJCQkvKiAgZm9yIENQVSBzdGFsbHMuICovCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCisjaWZkZWYgQ09ORklHX05PX0haCisJbG9uZyBkeW50aWNrc19jb21wbGV0ZWQ7CQkvKiBWYWx1ZSBvZiBjb21wbGV0ZWQgQCBzbmFwLiAqLworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgcmN1X3N0YXRlIHJjdV9zdGF0ZTsKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9kYXRhKTsKKworZXh0ZXJuIHN0cnVjdCByY3Vfc3RhdGUgcmN1X2JoX3N0YXRlOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCByY3VfZGF0YSwgcmN1X2JoX2RhdGEpOworCisvKgorICogSW5jcmVtZW50IHRoZSBxdWllc2NlbnQgc3RhdGUgY291bnRlci4KKyAqIFRoZSBjb3VudGVyIGlzIGEgYml0IGRlZ2VuZXJhdGVkOiBXZSBkbyBub3QgbmVlZCB0byBrbm93CisgKiBob3cgbWFueSBxdWllc2NlbnQgc3RhdGVzIHBhc3NlZCwganVzdCBpZiB0aGVyZSB3YXMgYXQgbGVhc3QKKyAqIG9uZSBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIGdyYWNlIHBlcmlvZC4gVGh1cyBqdXN0IGEgZmxhZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJjdV9xc2N0cl9pbmMoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9ICZwZXJfY3B1KHJjdV9kYXRhLCBjcHUpOworCXJkcC0+cGFzc2VkX3F1aWVzYyA9IDE7CisJcmRwLT5wYXNzZWRfcXVpZXNjX2NvbXBsZXRlZCA9IHJkcC0+Y29tcGxldGVkOworfQorc3RhdGljIGlubGluZSB2b2lkIHJjdV9iaF9xc2N0cl9pbmMoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9ICZwZXJfY3B1KHJjdV9iaF9kYXRhLCBjcHUpOworCXJkcC0+cGFzc2VkX3F1aWVzYyA9IDE7CisJcmRwLT5wYXNzZWRfcXVpZXNjX2NvbXBsZXRlZCA9IHJkcC0+Y29tcGxldGVkOworfQorCitleHRlcm4gaW50IHJjdV9wZW5kaW5nKGludCBjcHUpOworZXh0ZXJuIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKK2V4dGVybiBzdHJ1Y3QgbG9ja2RlcF9tYXAgcmN1X2xvY2tfbWFwOworIyBkZWZpbmUgcmN1X3JlYWRfYWNxdWlyZSgpCVwKKwkJCWxvY2tfYWNxdWlyZSgmcmN1X2xvY2tfbWFwLCAwLCAwLCAyLCAxLCBOVUxMLCBfVEhJU19JUF8pCisjIGRlZmluZSByY3VfcmVhZF9yZWxlYXNlKCkJbG9ja19yZWxlYXNlKCZyY3VfbG9ja19tYXAsIDEsIF9USElTX0lQXykKKyNlbHNlCisjIGRlZmluZSByY3VfcmVhZF9hY3F1aXJlKCkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgcmN1X3JlYWRfcmVsZWFzZSgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yY3VfcmVhZF9sb2NrKHZvaWQpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX19hY3F1aXJlKFJDVSk7CisJcmN1X3JlYWRfYWNxdWlyZSgpOworfQorc3RhdGljIGlubGluZSB2b2lkIF9fcmN1X3JlYWRfdW5sb2NrKHZvaWQpCit7CisJcmN1X3JlYWRfcmVsZWFzZSgpOworCV9fcmVsZWFzZShSQ1UpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgX19yY3VfcmVhZF9sb2NrX2JoKHZvaWQpCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCV9fYWNxdWlyZShSQ1VfQkgpOworCXJjdV9yZWFkX2FjcXVpcmUoKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3JjdV9yZWFkX3VubG9ja19iaCh2b2lkKQoreworCXJjdV9yZWFkX3JlbGVhc2UoKTsKKwlfX3JlbGVhc2UoUkNVX0JIKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKK30KKworI2RlZmluZSBfX3N5bmNocm9uaXplX3NjaGVkKCkgc3luY2hyb25pemVfcmN1KCkKKworI2RlZmluZSBjYWxsX3JjdV9zY2hlZChoZWFkLCBmdW5jKSBjYWxsX3JjdShoZWFkLCBmdW5jKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2luaXRfc2NoZWQodm9pZCkKK3sKK30KKworZXh0ZXJuIHZvaWQgX19yY3VfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJjdV9jaGVja19jYWxsYmFja3MoaW50IGNwdSwgaW50IHVzZXIpOworZXh0ZXJuIHZvaWQgcmN1X3Jlc3RhcnRfY3B1KGludCBjcHUpOworCitleHRlcm4gbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWQodm9pZCk7CitleHRlcm4gbG9uZyByY3VfYmF0Y2hlc19jb21wbGV0ZWRfYmgodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfTk9fSFoKK3ZvaWQgcmN1X2VudGVyX25vaHoodm9pZCk7Cit2b2lkIHJjdV9leGl0X25vaHoodm9pZCk7CisjZWxzZSAvKiBDT05GSUdfTk9fSFogKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VfZW50ZXJfbm9oeih2b2lkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHJjdV9leGl0X25vaHoodm9pZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfTk9fSFogKi8KKworI2VuZGlmIC8qIF9fTElOVVhfUkNVVFJFRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmggYi9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmgKaW5kZXggZDM2MzQ2Ny4uYjNiMzU5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW5nX2J1ZmZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaApAQCAtMTE4LDYgKzExOCw4IEBACiAKIHVuc2lnbmVkIGxvbmcgcmluZ19idWZmZXJfZW50cmllcyhzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcik7CiB1bnNpZ25lZCBsb25nIHJpbmdfYnVmZmVyX292ZXJydW5zKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKTsKK3Vuc2lnbmVkIGxvbmcgcmluZ19idWZmZXJfZW50cmllc19jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9vdmVycnVuX2NwdShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CiAKIHU2NCByaW5nX2J1ZmZlcl90aW1lX3N0YW1wKGludCBjcHUpOwogdm9pZCByaW5nX2J1ZmZlcl9ub3JtYWxpemVfdGltZV9zdGFtcChpbnQgY3B1LCB1NjQgKnRzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCA0ZTRmMTI3Li5mZWIzYjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xNTgsNiArMTU4LDggQEAKIC8qIFNILVNDSSAqLwogI2RlZmluZSBQT1JUX1NDSUZBCTgzCiAKKyNkZWZpbmUgUE9SVF9TM0M2NDAwCTg0CisKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCBjOTdlZDI4Li5mOTZkMTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtMjg1LDcgKzI4NSw3IEBACiAjZGVmaW5lIGttYWxsb2Nfbm9kZV90cmFja19jYWxsZXIoc2l6ZSwgZmxhZ3MsIG5vZGUpIFwKIAlrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncykKIAotI2VuZGlmIC8qIERFQlVHX1NMQUIgKi8KKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiAvKgogICogU2hvcnRjdXRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKaW5kZXggNmYwZWUxYi4uYzM5YTIxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaApAQCAtNTgsNiArNTgsNyBAQAogCXN0cnVjdCBycGNfdGltZW91dAljbF90aW1lb3V0X2RlZmF1bHQ7CiAJc3RydWN0IHJwY19wcm9ncmFtICoJY2xfcHJvZ3JhbTsKIAljaGFyCQkJY2xfaW5saW5lX25hbWVbMzJdOworCWNoYXIJCQkqY2xfcHJpbmNpcGFsOwkvKiB0YXJnZXQgdG8gYXV0aGVudGljYXRlIHRvICovCiB9OwogCiAvKgpAQCAtMTA4LDYgKzEwOSw3IEBACiAJdTMyCQkJdmVyc2lvbjsKIAlycGNfYXV0aGZsYXZvcl90CWF1dGhmbGF2b3I7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJY2hhcgkJCSpjbGllbnRfbmFtZTsKIH07CiAKIC8qIFZhbHVlcyBmb3IgImZsYWdzIiBmaWVsZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvcnBjX3BpcGVfZnMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3JwY19waXBlX2ZzLmgKaW5kZXggNTFiOTc3YS4uY2VhNzY0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvcnBjX3BpcGVfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oCkBAIC0xNSw2ICsxNSw3IEBACiAJc3NpemVfdCAoKnVwY2FsbCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJwY19waXBlX21zZyAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QpOwogCXNzaXplX3QgKCpkb3duY2FsbCkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKIAl2b2lkICgqcmVsZWFzZV9waXBlKShzdHJ1Y3QgaW5vZGUgKik7CisJaW50ICgqb3Blbl9waXBlKShzdHJ1Y3QgaW5vZGUgKik7CiAJdm9pZCAoKmRlc3Ryb3lfbXNnKShzdHJ1Y3QgcnBjX3BpcGVfbXNnICopOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKaW5kZXggYzkxNjVkOS4uY2E3ZDcyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCkBAIC0yMCw2ICsyMCw3IEBACiB2b2lkIGdzc19zdmNfc2h1dGRvd24odm9pZCk7CiBpbnQgc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKTsKIHUzMiBzdmNhdXRoX2dzc19mbGF2b3Ioc3RydWN0IGF1dGhfZG9tYWluICpkb20pOworY2hhciAqc3ZjX2dzc19wcmluY2lwYWwoc3RydWN0IHN2Y19ycXN0ICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TVU5SUENfU1ZDQVVUSF9HU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAppbmRleCBlNDA1N2Q3Li40OWUxZWI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaApAQCAtMzcsMjEgKzM3LDYgQEAKIHR5cGVkZWYgaW50CSgqa3hkcnByb2NfdCkodm9pZCAqcnFzdHAsIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKTsKIAogLyoKLSAqIFdlJ3JlIHN0aWxsIHJlcXVpcmluZyB0aGUgQktMIGluIHRoZSB4ZHIgY29kZSB1bnRpbCBpdCdzIGJlZW4KLSAqIG1vcmUgY2FyZWZ1bGx5IGF1ZGl0ZWQsIGF0IHdoaWNoIHBvaW50IHRoaXMgd3JhcHBlciB3aWxsIGJlY29tZQotICogdW5uZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJwY19jYWxsX3hkcnByb2Moa3hkcnByb2NfdCB4ZHJwcm9jLCB2b2lkICpycXN0cCwgX19iZTMyICpkYXRhLCB2b2lkICpvYmopCi17Ci0JaW50IHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0geGRycHJvYyhycXN0cCwgZGF0YSwgb2JqKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKICAqIEJhc2ljIHN0cnVjdHVyZSBmb3IgdHJhbnNtaXNzaW9uL3JlY2VwdGlvbiBvZiBhIGNsaWVudCBYRFIgbWVzc2FnZS4KICAqIEZlYXR1cmVzIGEgaGVhZGVyIChmb3IgYSBsaW5lYXIgYnVmZmVyIGNvbnRhaW5pbmcgUlBDIGhlYWRlcnMKICAqIGFuZCB0aGUgZGF0YSBwYXlsb2FkIGZvciBzaG9ydCBtZXNzYWdlcyksIGFuZCB0aGVuIGFuIGFycmF5IG9mCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmgKaW5kZXggNGQ4MGExMS4uMTFmYzcxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveHBydC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3hwcnQuaApAQCAtNzYsOCArNzYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcnFfbGlzdDsKIAogCV9fdTMyICoJCQlycV9idWZmZXI7CS8qIFhEUiBlbmNvZGUgYnVmZmVyICovCi0Jc2l6ZV90CQkJcnFfYnVmc2l6ZSwKLQkJCQlycV9jYWxsc2l6ZSwKKwlzaXplX3QJCQlycV9jYWxsc2l6ZSwKIAkJCQlycV9yY3ZzaXplOwogCiAJc3RydWN0IHhkcl9idWYJCXJxX3ByaXZhdGVfYnVmOwkJLyogVGhlIHJlY2VpdmUgYnVmZmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaCBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCmluZGV4IGIxOGVjNTUuLjMyNWFmMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCkBAIC03LDkgKzcsMzEgQEAKIHN0cnVjdCBkbWFfYXR0cnM7CiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CiAKKy8qCisgKiBNYXhpbXVtIGFsbG93YWJsZSBudW1iZXIgb2YgY29udGlndW91cyBzbGFicyB0byBtYXAsCisgKiBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gIFdoYXQgaXMgdGhlIGFwcHJvcHJpYXRlIHZhbHVlID8KKyAqIFRoZSBjb21wbGV4aXR5IG9mIHttYXAsdW5tYXB9X3NpbmdsZSBpcyBsaW5lYXJseSBkZXBlbmRlbnQgb24gdGhpcyB2YWx1ZS4KKyAqLworI2RlZmluZSBJT19UTEJfU0VHU0laRQkxMjgKKworCisvKgorICogbG9nIG9mIHRoZSBzaXplIG9mIGVhY2ggSU8gVExCIHNsYWIuICBUaGUgbnVtYmVyIG9mIHNsYWJzIGlzIGNvbW1hbmQgbGluZQorICogY29udHJvbGxhYmxlLgorICovCisjZGVmaW5lIElPX1RMQl9TSElGVCAxMQorCiBleHRlcm4gdm9pZAogc3dpb3RsYl9pbml0KHZvaWQpOwogCitleHRlcm4gdm9pZCAqc3dpb3RsYl9hbGxvY19ib290KHNpemVfdCBieXRlcywgdW5zaWduZWQgbG9uZyBuc2xhYnMpOworZXh0ZXJuIHZvaWQgKnN3aW90bGJfYWxsb2ModW5zaWduZWQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKTsKKworZXh0ZXJuIGRtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2J1cyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKGRtYV9hZGRyX3QgYWRkcmVzcyk7CisKK2V4dGVybiBpbnQgc3dpb3RsYl9hcmNoX3JhbmdlX25lZWRzX21hcHBpbmcodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKIGV4dGVybiB2b2lkCiAqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCiAJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKaW5kZXggOTAwNzMxMy4uOTk4YTU1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1leC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtNTMsNDcgKzUzLDExIEBACiAjaWZuZGVmIF9MSU5VWF9USU1FWF9ICiAjZGVmaW5lIF9MSU5VWF9USU1FWF9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAotI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgotCiAjZGVmaW5lIE5UUF9BUEkJCTQJLyogTlRQIEFQSSB2ZXJzaW9uICovCiAKIC8qCi0gKiBTSElGVF9LRyBhbmQgU0hJRlRfS0YgZXN0YWJsaXNoIHRoZSBkYW1waW5nIG9mIHRoZSBQTEwgYW5kIGFyZSBjaG9zZW4KLSAqIGZvciBhIHNsaWdodGx5IHVuZGVyZGFtcGVkIGNvbnZlcmdlbmNlIGNoYXJhY3RlcmlzdGljLiBTSElGVF9LSAotICogZXN0YWJsaXNoZXMgdGhlIGRhbXBpbmcgb2YgdGhlIEZMTCBhbmQgaXMgY2hvc2VuIGJ5IHdpc2RvbSBhbmQgYmxhY2sKLSAqIGFydC4KLSAqCi0gKiBNQVhUQyBlc3RhYmxpc2hlcyB0aGUgbWF4aW11bSB0aW1lIGNvbnN0YW50IG9mIHRoZSBQTEwuIFdpdGggdGhlCi0gKiBTSElGVF9LRyBhbmQgU0hJRlRfS0YgdmFsdWVzIGdpdmVuIGFuZCBhIHRpbWUgY29uc3RhbnQgcmFuZ2UgZnJvbQotICogemVybyB0byBNQVhUQywgdGhlIFBMTCB3aWxsIGNvbnZlcmdlIGluIDE1IG1pbnV0ZXMgdG8gMTYgaG91cnMsCi0gKiByZXNwZWN0aXZlbHkuCi0gKi8KLSNkZWZpbmUgU0hJRlRfUExMCTQJLyogUExMIGZyZXF1ZW5jeSBmYWN0b3IgKHNoaWZ0KSAqLwotI2RlZmluZSBTSElGVF9GTEwJMgkvKiBGTEwgZnJlcXVlbmN5IGZhY3RvciAoc2hpZnQpICovCi0jZGVmaW5lIE1BWFRDCQkxMAkvKiBtYXhpbXVtIHRpbWUgY29uc3RhbnQgKHNoaWZ0KSAqLwotCi0vKgotICogU0hJRlRfVVNFQyBkZWZpbmVzIHRoZSBzY2FsaW5nIChzaGlmdCkgb2YgdGhlIHRpbWVfZnJlcSBhbmQKLSAqIHRpbWVfdG9sZXJhbmNlIHZhcmlhYmxlcywgd2hpY2ggcmVwcmVzZW50IHRoZSBjdXJyZW50IGZyZXF1ZW5jeQotICogb2Zmc2V0IGFuZCBtYXhpbXVtIGZyZXF1ZW5jeSB0b2xlcmFuY2UuCi0gKi8KLSNkZWZpbmUgU0hJRlRfVVNFQyAxNgkJLyogZnJlcXVlbmN5IG9mZnNldCBzY2FsZSAoc2hpZnQpICovCi0jZGVmaW5lIFBQTV9TQ0FMRSAoTlNFQ19QRVJfVVNFQyA8PCAoTlRQX1NDQUxFX1NISUZUIC0gU0hJRlRfVVNFQykpCi0jZGVmaW5lIFBQTV9TQ0FMRV9JTlZfU0hJRlQgMTkKLSNkZWZpbmUgUFBNX1NDQUxFX0lOViAoKDFsbCA8PCAoUFBNX1NDQUxFX0lOVl9TSElGVCArIE5UUF9TQ0FMRV9TSElGVCkpIC8gXAotCQkgICAgICAgUFBNX1NDQUxFICsgMSkKLQotI2RlZmluZSBNQVhQSEFTRSA1MDAwMDAwMDBsCS8qIG1heCBwaGFzZSBlcnJvciAobnMpICovCi0jZGVmaW5lIE1BWEZSRVEgNTAwMDAwCQkvKiBtYXggZnJlcXVlbmN5IGVycm9yIChucy9zKSAqLwotI2RlZmluZSBNQVhGUkVRX1NDQUxFRCAoKHM2NClNQVhGUkVRIDw8IE5UUF9TQ0FMRV9TSElGVCkKLSNkZWZpbmUgTUlOU0VDIDI1NgkJLyogbWluIGludGVydmFsIGJldHdlZW4gdXBkYXRlcyAocykgKi8KLSNkZWZpbmUgTUFYU0VDIDIwNDgJCS8qIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHVwZGF0ZXMgKHMpICovCi0jZGVmaW5lIE5UUF9QSEFTRV9MSU1JVCAoKE1BWFBIQVNFIC8gTlNFQ19QRVJfVVNFQykgPDwgNSkgLyogYmV5b25kIG1heC4gZGlzcGVyc2lvbiAqLwotCi0vKgogICogc3lzY2FsbCBpbnRlcmZhY2UgLSB1c2VkIChtYWlubHkgYnkgTlRQIGRhZW1vbikKICAqIHRvIGRpc2NpcGxpbmUga2VybmVsIGNsb2NrIG9zY2lsbGF0b3IKICAqLwpAQCAtMTk5LDkgKzE2Myw0NiBAQAogI2RlZmluZSBUSU1FX0JBRAlUSU1FX0VSUk9SIC8qIGJ3IGNvbXBhdCAqLwogCiAjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorCiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAKIC8qCisgKiBTSElGVF9LRyBhbmQgU0hJRlRfS0YgZXN0YWJsaXNoIHRoZSBkYW1waW5nIG9mIHRoZSBQTEwgYW5kIGFyZSBjaG9zZW4KKyAqIGZvciBhIHNsaWdodGx5IHVuZGVyZGFtcGVkIGNvbnZlcmdlbmNlIGNoYXJhY3RlcmlzdGljLiBTSElGVF9LSAorICogZXN0YWJsaXNoZXMgdGhlIGRhbXBpbmcgb2YgdGhlIEZMTCBhbmQgaXMgY2hvc2VuIGJ5IHdpc2RvbSBhbmQgYmxhY2sKKyAqIGFydC4KKyAqCisgKiBNQVhUQyBlc3RhYmxpc2hlcyB0aGUgbWF4aW11bSB0aW1lIGNvbnN0YW50IG9mIHRoZSBQTEwuIFdpdGggdGhlCisgKiBTSElGVF9LRyBhbmQgU0hJRlRfS0YgdmFsdWVzIGdpdmVuIGFuZCBhIHRpbWUgY29uc3RhbnQgcmFuZ2UgZnJvbQorICogemVybyB0byBNQVhUQywgdGhlIFBMTCB3aWxsIGNvbnZlcmdlIGluIDE1IG1pbnV0ZXMgdG8gMTYgaG91cnMsCisgKiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0hJRlRfUExMCTQJLyogUExMIGZyZXF1ZW5jeSBmYWN0b3IgKHNoaWZ0KSAqLworI2RlZmluZSBTSElGVF9GTEwJMgkvKiBGTEwgZnJlcXVlbmN5IGZhY3RvciAoc2hpZnQpICovCisjZGVmaW5lIE1BWFRDCQkxMAkvKiBtYXhpbXVtIHRpbWUgY29uc3RhbnQgKHNoaWZ0KSAqLworCisvKgorICogU0hJRlRfVVNFQyBkZWZpbmVzIHRoZSBzY2FsaW5nIChzaGlmdCkgb2YgdGhlIHRpbWVfZnJlcSBhbmQKKyAqIHRpbWVfdG9sZXJhbmNlIHZhcmlhYmxlcywgd2hpY2ggcmVwcmVzZW50IHRoZSBjdXJyZW50IGZyZXF1ZW5jeQorICogb2Zmc2V0IGFuZCBtYXhpbXVtIGZyZXF1ZW5jeSB0b2xlcmFuY2UuCisgKi8KKyNkZWZpbmUgU0hJRlRfVVNFQyAxNgkJLyogZnJlcXVlbmN5IG9mZnNldCBzY2FsZSAoc2hpZnQpICovCisjZGVmaW5lIFBQTV9TQ0FMRSAoTlNFQ19QRVJfVVNFQyA8PCAoTlRQX1NDQUxFX1NISUZUIC0gU0hJRlRfVVNFQykpCisjZGVmaW5lIFBQTV9TQ0FMRV9JTlZfU0hJRlQgMTkKKyNkZWZpbmUgUFBNX1NDQUxFX0lOViAoKDFsbCA8PCAoUFBNX1NDQUxFX0lOVl9TSElGVCArIE5UUF9TQ0FMRV9TSElGVCkpIC8gXAorCQkgICAgICAgUFBNX1NDQUxFICsgMSkKKworI2RlZmluZSBNQVhQSEFTRSA1MDAwMDAwMDBsCS8qIG1heCBwaGFzZSBlcnJvciAobnMpICovCisjZGVmaW5lIE1BWEZSRVEgNTAwMDAwCQkvKiBtYXggZnJlcXVlbmN5IGVycm9yIChucy9zKSAqLworI2RlZmluZSBNQVhGUkVRX1NDQUxFRCAoKHM2NClNQVhGUkVRIDw8IE5UUF9TQ0FMRV9TSElGVCkKKyNkZWZpbmUgTUlOU0VDIDI1NgkJLyogbWluIGludGVydmFsIGJldHdlZW4gdXBkYXRlcyAocykgKi8KKyNkZWZpbmUgTUFYU0VDIDIwNDgJCS8qIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHVwZGF0ZXMgKHMpICovCisjZGVmaW5lIE5UUF9QSEFTRV9MSU1JVCAoKE1BWFBIQVNFIC8gTlNFQ19QRVJfVVNFQykgPDwgNSkgLyogYmV5b25kIG1heC4gZGlzcGVyc2lvbiAqLworCisvKgogICoga2VybmVsIHZhcmlhYmxlcwogICogTm90ZTogbWF4aW11bSBlcnJvciA9IE5UUCBzeW5jaCBkaXN0YW5jZSA9IGRpc3BlcnNpb24gKyBkZWxheSAvIDI7CiAgKiBlc3RpbWF0ZWQgZXJyb3IgPSBOVFAgZGlzcGVyc2lvbi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvdHlwZXMuaAppbmRleCAxZDk4MzMwLi4xMjFmMzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0xMzUsMTkgKzEzNSwxNCBAQAogICoKICAqIExpbnV4IGFsd2F5cyBjb25zaWRlcnMgc2VjdG9ycyB0byBiZSA1MTIgYnl0ZXMgbG9uZyBpbmRlcGVuZGVudGx5CiAgKiBvZiB0aGUgZGV2aWNlcyByZWFsIGJsb2NrIHNpemUuCisgKgorICogYmxrY250X3QgaXMgdGhlIHR5cGUgb2YgdGhlIGlub2RlJ3MgYmxvY2sgY291bnQuCiAgKi8KICNpZmRlZiBDT05GSUdfTEJECiB0eXBlZGVmIHU2NCBzZWN0b3JfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2VjdG9yX3Q7Ci0jZW5kaWYKLQotLyoKLSAqIFRoZSB0eXBlIG9mIHRoZSBpbm9kZSdzIGJsb2NrIGNvdW50LgotICovCi0jaWZkZWYgQ09ORklHX0xTRgogdHlwZWRlZiB1NjQgYmxrY250X3Q7CiAjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNlY3Rvcl90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJsa2NudF90OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKaW5kZXggZmVjNmRlYy4uNmI1ODM2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCQkJCQlcCiAJCXNldF9mcyhLRVJORUxfRFMpOwkJCVwKIAkJcGFnZWZhdWx0X2Rpc2FibGUoKTsJCQlcCi0JCXJldCA9IF9fZ2V0X3VzZXIocmV0dmFsLCAoX19mb3JjZSB0eXBlb2YocmV0dmFsKSBfX3VzZXIgKikoYWRkcikpOwkJXAorCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCYocmV0dmFsKSwgKF9fZm9yY2UgdHlwZW9mKHJldHZhbCkgX191c2VyICopKGFkZHIpLCBzaXplb2YocmV0dmFsKSk7CQlcCiAJCXBhZ2VmYXVsdF9lbmFibGUoKTsJCQlcCiAJCXNldF9mcyhvbGRfZnMpOwkJCQlcCiAJCXJldDsJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IDQ2NjlkN2UuLjFmMTI2ZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMjkzLDYgKzI5Myw3IEBACiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MjAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFlWVSA0OjI6MCAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVWVYgICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdZJywgJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfVVlWWSAgICB2NGwyX2ZvdXJjYygnVScsICdZJywgJ1YnLCAnWScpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WWVVZICAgIHY0bDJfZm91cmNjKCdWJywgJ1knLCAnVScsICdZJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyMlAgdjRsMl9mb3VyY2MoJzQnLCAnMicsICcyJywgJ1AnKSAvKiAxNiAgWVZVNDIyIHBsYW5hciAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDExUCB2NGwyX2ZvdXJjYygnNCcsICcxJywgJzEnLCAnUCcpIC8qIDE2ICBZVlU0MTEgcGxhbmFyICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNDFQICAgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnMScsICdQJykgLyogMTIgIFlVViA0OjE6MSAgICAgKi8KQEAgLTMwNCw2ICszMDUsOCBAQAogLyogdHdvIHBsYW5lcyAtLSBvbmUgWSwgb25lIENyICsgQ2IgaW50ZXJsZWF2ZWQgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMjEgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcyJywgJzEnKSAvKiAxMiAgWS9DckNiIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxNiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnNicpIC8qIDE2ICBZL0NiQ3IgNDoyOjIgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjYxICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykgLyogMTYgIFkvQ3JDYiA0OjI6MiAgKi8KIAogLyogIFRoZSBmb2xsb3dpbmcgZm9ybWF0cyBhcmUgbm90IGRlZmluZWQgaW4gdGhlIFY0TDIgc3BlY2lmaWNhdGlvbiAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDEwICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnOScpIC8qICA5ICBZVVYgNDoxOjAgICAgICovCkBAIC0xMDUwLDcgKzEwNTMsNyBAQAogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMCkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVViAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjExKQogCi0vKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyNTg0eCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyMzQxeCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFIAkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDEwMDApCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMCkKIGVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSB7CkBAIC0xMTE3LDYgKzExMjAsMTIgQEAKICNkZWZpbmUgVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTEpCiAjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTIpCiAKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9DT05USU5VT1VTCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTUpCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFDWQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNikKKwogLyoKICAqCVQgVSBOIEkgTiBHCiAgKi8KQEAgLTEzNjksNiArMTM3OCw3IEBACiAjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9IT1NUICAgICAgIDAgIC8qIE1hdGNoIGFnYWluc3QgY2hpcCBJRCBvbiBob3N0ICgwIGZvciB0aGUgaG9zdCkgKi8KICNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIgMSAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgZHJpdmVyIElEICovCiAjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAgIDIgIC8qIE1hdGNoIGFnYWluc3QgSTJDIDctYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0FDOTcgICAgICAgMyAgLyogTWF0Y2ggYWdhaW5zdCBhbmNpbGlhcnkgQUM5NyBjaGlwICovCiAKIHN0cnVjdCB2NGwyX3JlZ2lzdGVyIHsKIAlfX3UzMiBtYXRjaF90eXBlOyAvKiBNYXRjaCB0eXBlICovCkBAIC0xNDU4LDYgKzE0NjgsOCBAQAogI2RlZmluZSBWSURJT0NfR19DSElQX0lERU5UICAgICBfSU9XUignVicsIDgxLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50KQogI2VuZGlmCiAjZGVmaW5lIFZJRElPQ19TX0hXX0ZSRVFfU0VFSwkgX0lPVygnVicsIDgyLCBzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWspCisvKiBSZW1pbmRlcjogd2hlbiBhZGRpbmcgbmV3IGlvY3RscyBwbGVhc2UgYWRkIHN1cHBvcnQgZm9yIHRoZW0gdG8KKyAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGFzIHdlbGwhICovCiAKICNpZmRlZiBfX09MRF9WSURJT0NfCiAvKiBmb3IgY29tcGF0aWJpbGl0eSwgd2lsbCBnbyBhd2F5IHNvbWUgZGF5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19iYWxsb29uLmgKaW5kZXggYzMwYzdiZi4uODcyNmZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fYmFsbG9vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2JhbGxvb24uaApAQCAtMTAsNiArMTAsOSBAQAogLyogVGhlIGZlYXR1cmUgYml0bWFwIGZvciB2aXJ0aW8gYmFsbG9vbiAqLwogI2RlZmluZSBWSVJUSU9fQkFMTE9PTl9GX01VU1RfVEVMTF9IT1NUCTAgLyogVGVsbCBiZWZvcmUgcmVjbGFpbWluZyBwYWdlcyAqLwogCisvKiBTaXplIG9mIGEgUEZOIGluIHRoZSBiYWxsb29uIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgVklSVElPX0JBTExPT05fUEZOX1NISUZUIDEyCisKIHN0cnVjdCB2aXJ0aW9fYmFsbG9vbl9jb25maWcKIHsKIAkvKiBOdW1iZXIgb2YgcGFnZXMgaG9zdCB3YW50cyBHdWVzdCB0byBnaXZlIHVwLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uc29sZS5oCmluZGV4IDE5YTBkYTAuLjc2MTVmZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25zb2xlLmgKQEAgLTcsNiArNywxNyBAQAogLyogVGhlIElEIGZvciB2aXJ0aW8gY29uc29sZSAqLwogI2RlZmluZSBWSVJUSU9fSURfQ09OU09MRQkzCiAKKy8qIEZlYXR1cmUgYml0cyAqLworI2RlZmluZSBWSVJUSU9fQ09OU09MRV9GX1NJWkUJMAkvKiBEb2VzIGhvc3QgcHJvdmlkZSBjb25zb2xlIHNpemU/ICovCisKK3N0cnVjdCB2aXJ0aW9fY29uc29sZV9jb25maWcgeworCS8qIGNvbHVtcyBvZiB0aGUgc2NyZWVucyAqLworCV9fdTE2IGNvbHM7CisJLyogcm93cyBvZiB0aGUgc2NyZWVucyAqLworCV9fdTE2IHJvd3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKICNpZmRlZiBfX0tFUk5FTF9fCiBpbnQgX19pbml0IHZpcnRpb19jb25zX2Vhcmx5X2luaXQoaW50ICgqcHV0X2NoYXJzKSh1MzIsIGNvbnN0IGNoYXIgKiwgaW50KSk7CiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fcGNpLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaAppbmRleCBjZGVmMzU3Li5jZDBmZDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19wY2kuaApAQCAtNTMsNCArNTMsMTIgQEAKIAogLyogVmlydGlvIEFCSSB2ZXJzaW9uLCB0aGlzIG11c3QgbWF0Y2ggZXhhY3RseSAqLwogI2RlZmluZSBWSVJUSU9fUENJX0FCSV9WRVJTSU9OCQkwCisKKy8qIEhvdyBtYW55IGJpdHMgdG8gc2hpZnQgcGh5c2ljYWwgcXVldWUgYWRkcmVzcyB3cml0dGVuIHRvIFFVRVVFX1BGTi4KKyAqIDEyIGlzIGhpc3RvcmljYWwsIGFuZCBkdWUgdG8geDg2IHBhZ2Ugc2l6ZS4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9RVUVVRV9BRERSX1NISUZUCTEyCisKKy8qIFRoZSBhbGlnbm1lbnQgdG8gdXNlIGJldHdlZW4gY29uc3VtZXIgYW5kIHByb2R1Y2VyIHBhcnRzIG9mIHZyaW5nLgorICogeDg2IHBhZ2VzaXplIGFnYWluLiAqLworI2RlZmluZSBWSVJUSU9fUENJX1ZSSU5HX0FMSUdOCQk0MDk2CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaAppbmRleCBjNGE1OThmLi43MWUwMzcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCkBAIC04Myw3ICs4Myw3IEBACiAgKglfX3UxNiBhdmFpbF9pZHg7CiAgKglfX3UxNiBhdmFpbGFibGVbbnVtXTsKICAqCi0gKgkvLyBQYWRkaW5nIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkuCisgKgkvLyBQYWRkaW5nIHRvIHRoZSBuZXh0IGFsaWduIGJvdW5kYXJ5LgogICoJY2hhciBwYWRbXTsKICAqCiAgKgkvLyBBIHJpbmcgb2YgdXNlZCBkZXNjcmlwdG9yIGhlYWRzIHdpdGggZnJlZS1ydW5uaW5nIGluZGV4LgpAQCAtOTMsMTkgKzkzLDE5IEBACiAgKiB9OwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdnJpbmdfaW5pdChzdHJ1Y3QgdnJpbmcgKnZyLCB1bnNpZ25lZCBpbnQgbnVtLCB2b2lkICpwLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWdlc2l6ZSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCiB7CiAJdnItPm51bSA9IG51bTsKIAl2ci0+ZGVzYyA9IHA7CiAJdnItPmF2YWlsID0gcCArIG51bSpzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpOwotCXZyLT51c2VkID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSZ2ci0+YXZhaWwtPnJpbmdbbnVtXSArIHBhZ2VzaXplLTEpCi0JCQkgICAgJiB+KHBhZ2VzaXplIC0gMSkpOworCXZyLT51c2VkID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSZ2ci0+YXZhaWwtPnJpbmdbbnVtXSArIGFsaWduLTEpCisJCQkgICAgJiB+KGFsaWduIC0gMSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHZyaW5nX3NpemUodW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgbG9uZyBwYWdlc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgdnJpbmdfc2l6ZSh1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBsb25nIGFsaWduKQogewogCXJldHVybiAoKHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYykgKiBudW0gKyBzaXplb2YoX191MTYpICogKDIgKyBudW0pCi0JCSArIHBhZ2VzaXplIC0gMSkgJiB+KHBhZ2VzaXplIC0gMSkpCisJCSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCiAJCSsgc2l6ZW9mKF9fdTE2KSAqIDIgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07CiB9CiAKQEAgLTExNSw2ICsxMTUsNyBAQAogc3RydWN0IHZpcnRxdWV1ZTsKIAogc3RydWN0IHZpcnRxdWV1ZSAqdnJpbmdfbmV3X3ZpcnRxdWV1ZSh1bnNpZ25lZCBpbnQgbnVtLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB2cmluZ19hbGlnbiwKIAkJCQkgICAgICBzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwKIAkJCQkgICAgICB2b2lkICpwYWdlcywKIAkJCQkgICAgICB2b2lkICgqbm90aWZ5KShzdHJ1Y3QgdmlydHF1ZXVlICp2cSksCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2kyYy1hZGRyLmggYi9pbmNsdWRlL21lZGlhL2kyYy1hZGRyLmgKaW5kZXggZTdmZjQ0YS4uNWQwZjU2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pMmMtYWRkci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaTJjLWFkZHIuaApAQCAtMTIsOCArMTIsNiBAQAogLyogYnR0diBhZGRyZXNzIGxpc3QgKi8KICNkZWZpbmUgSTJDX0FERFJfVFNBNTUyMgkweGMyCiAjZGVmaW5lIEkyQ19BRERSX1REQTc0MzIJMHg4YQotI2RlZmluZSBJMkNfQUREUl9CVDgzMl9BTFQxCTB4ODgKLSNkZWZpbmUgSTJDX0FERFJfQlQ4MzJfQUxUMgkweDhhIC8vIGFsdGVybmF0ZSBzZXR0aW5nCiAjZGVmaW5lIEkyQ19BRERSX1REQTg0MjUJMHg4MgogI2RlZmluZSBJMkNfQUREUl9UREE5ODQwCTB4ODQKICNkZWZpbmUgSTJDX0FERFJfVERBOTg1MAkweGI2IC8qIGFsc28gdXNlZCBieSA5ODU1LDk4NzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCmluZGV4IDM4ZjJkOTMuLjViZjJlYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaApAQCAtMTU3LDYgKzE1Nyw4IEBACiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW5jb3JlX2VubHR2X2ZtNTNbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3JlYWxfYXVkaW9fMjIwXzMyX2tleXNbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX21zaV90dmFueXdoZXJlX3BsdXNbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F0aV90dl93b25kZXJfaGRfNjAwW0lSX0tFWVRBQl9TSVpFXTsKK2V4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19rd29ybGRfcGx1c190dl9hbmFsb2dbSVJfS0VZVEFCX1NJWkVdOwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL292NzcyeC5oIGIvaW5jbHVkZS9tZWRpYS9vdjc3MnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzkxZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vdjc3MnguaApAQCAtMCwwICsxLDIxIEBACisvKiBvdjc3MnggQ2FtZXJhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBLdW5pbm9yaSBNb3JpbW90byA8bW9yaW1vdG8ua3VuaW5vcmlAcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fT1Y3NzJYX0hfXworI2RlZmluZSBfX09WNzcyWF9IX18KKworI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKworc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyB7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICBidXN3aWR0aDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rIGxpbms7Cit9OworCisjZW5kaWYgLyogX19PVjc3MlhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NhYTcxNDZfdnYuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCmluZGV4IDFkMTA0MDkuLjZiYmIwZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oCkBAIC0yMTYsOCArMjE2LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc2FhNzE0Nl91c2Vfb3BzIHNhYTcxNDZfdmlkZW9fdW9wczsKIGludCBzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcoc3RydWN0IHNhYTcxNDZfZmggKmZoKTsKIGludCBzYWE3MTQ2X3N0b3BfcHJldmlldyhzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgpOwotaW50IHNhYTcxNDZfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IHNhYTcxNDZfdmlkZW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKIC8qIGZyb20gc2FhNzE0Nl92YmkuYyAqLwogZXh0ZXJuIHN0cnVjdCBzYWE3MTQ2X3VzZV9vcHMgc2FhNzE0Nl92YmlfdW9wczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKaW5kZXggYzVkZTdiYi4uNDI1YjZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKQEAgLTEyLDkgKzEyLDEwIEBACiAjaWZuZGVmIFNPQ19DQU1FUkFfSAogI2RlZmluZSBTT0NfQ0FNRVJBX0gKIAorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG0uaD4KIAogc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0zNiwxNCArMzcsMTkgQEAKIAl1bnNpZ25lZCBjaGFyIGlmYWNlOwkJLyogSG9zdCBudW1iZXIgKi8KIAl1bnNpZ25lZCBjaGFyIGRldm51bTsJCS8qIERldmljZSBudW1iZXIgcGVyIGhvc3QgKi8KIAl1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoOwkJLyogU2VlIGNvbW1lbnQgaW4gLmMgKi8KKwlzdHJ1Y3Qgc29jX2NhbWVyYV9zZW5zZSAqc2Vuc2U7CS8qIFNlZSBjb21tZW50IGluIHN0cnVjdCBkZWZpbml0aW9uICovCiAJc3RydWN0IHNvY19jYW1lcmFfb3BzICpvcHM7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCAqY3VycmVudF9mbXQ7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmZvcm1hdHM7CiAJaW50IG51bV9mb3JtYXRzOworCXN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqdXNlcl9mb3JtYXRzOworCWludCBudW1fdXNlcl9mb3JtYXRzOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCS8qIHNvY19jYW1lcmEuYyBwcml2YXRlIGNvdW50LiBPbmx5IGFjY2Vzc2VkIHdpdGggdmlkZW9fbG9jayBoZWxkICovCisJdm9pZCAqaG9zdF9wcml2OwkJLyogUGVyLWRldmljZSBob3N0IHByaXZhdGUgZGF0YSAqLworCS8qIHNvY19jYW1lcmEuYyBwcml2YXRlIGNvdW50LiBPbmx5IGFjY2Vzc2VkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogCWludCB1c2VfY291bnQ7CisJc3RydWN0IG11dGV4IHZpZGVvX2xvY2s7CS8qIFByb3RlY3RzIGRldmljZSBkYXRhICovCiB9OwogCiBzdHJ1Y3Qgc29jX2NhbWVyYV9maWxlIHsKQEAgLTU2LDcgKzYyLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAl1bnNpZ25lZCBjaGFyIG5yOwkJCQkvKiBIb3N0IG51bWJlciAqLwogCXZvaWQgKnByaXY7Ci0JY2hhciAqZHJ2X25hbWU7CisJY29uc3QgY2hhciAqZHJ2X25hbWU7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdF9vcHMgKm9wczsKIH07CiAKQEAgLTY0LDI1ICs3MCwzMyBAQAogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCWludCAoKmFkZCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKLQlpbnQgKCpzdXNwZW5kKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKLQlpbnQgKCpzZXRfZm10X2NhcCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIF9fdTMyLAotCQkJICAgc3RydWN0IHY0bDJfcmVjdCAqKTsKLQlpbnQgKCp0cnlfZm10X2NhcCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2Zvcm1hdCAqKTsKKwlpbnQgKCpnZXRfZm9ybWF0cykoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIGludCwKKwkJCSAgIHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqKTsKKwlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgX191MzIsIHN0cnVjdCB2NGwyX3JlY3QgKik7CisJaW50ICgqdHJ5X2ZtdCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2Zvcm1hdCAqKTsKIAl2b2lkICgqaW5pdF92aWRlb2J1Zikoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICosCiAJCQkgICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJaW50ICgqcmVxYnVmcykoc3RydWN0IHNvY19jYW1lcmFfZmlsZSAqLCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqKTsKIAlpbnQgKCpxdWVyeWNhcCkoc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICopOwotCWludCAoKnRyeV9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBfX3UzMik7CiAJaW50ICgqc2V0X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIF9fdTMyKTsKIAl1bnNpZ25lZCBpbnQgKCpwb2xsKShzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOwogfTsKIAorI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX1BDTEsJKDEgPDwgMCkKKyNkZWZpbmUgU09DQU1fU0VOU09SX0lOVkVSVF9NQ0xLCSgxIDw8IDEpCisjZGVmaW5lIFNPQ0FNX1NFTlNPUl9JTlZFUlRfSFNZTkMJKDEgPDwgMikKKyNkZWZpbmUgU09DQU1fU0VOU09SX0lOVkVSVF9WU1lOQwkoMSA8PCAzKQorI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX0RBVEEJKDEgPDwgNCkKKwogc3RydWN0IHNvY19jYW1lcmFfbGluayB7CiAJLyogQ2FtZXJhIGJ1cyBpZCwgdXNlZCB0byBtYXRjaCBhIGNhbWVyYSBhbmQgYSBidXMgKi8KIAlpbnQgYnVzX2lkOwogCS8qIEdQSU8gbnVtYmVyIHRvIHN3aXRjaCBiZXR3ZWVuIDggYW5kIDEwIGJpdCBtb2RlcyAqLwogCXVuc2lnbmVkIGludCBncGlvOworCS8qIFBlciBjYW1lcmEgU09DQU1fU0VOU09SXyogYnVzIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkvKiBPcHRpb25hbCBjYWxsYmFja3MgdG8gcG93ZXIgb24gb3Igb2ZmIGFuZCByZXNldCB0aGUgc2Vuc29yICovCiAJaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAlpbnQgKCpyZXNldCkoc3RydWN0IGRldmljZSAqKTsKQEAgLTEwNiwxMyArMTIwLDM1IEBACiBleHRlcm4gaW50IHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOwogZXh0ZXJuIHZvaWQgc29jX2NhbWVyYV92aWRlb19zdG9wKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RhdGFfZm9ybWF0ICpzb2NfY2FtZXJhX2Zvcm1hdF9ieV9mb3VyY2MoCisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHVuc2lnbmVkIGludCBmb3VyY2MpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoCisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHVuc2lnbmVkIGludCBmb3VyY2MpOworCiBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCB7Ci0JY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBkZXB0aDsKIAlfX3UzMiBmb3VyY2M7CiAJZW51bSB2NGwyX2NvbG9yc3BhY2UgY29sb3JzcGFjZTsKIH07CiAKKy8qKgorICogc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlIC0gbWF0Y2ggYmV0d2VlbiBob3N0IGFuZCBzZW5zb3IgZm9ybWF0cworICogQGNhbV9mbXQ6IHNlbnNvciBmb3JtYXQgcHJvdmlkZWQgYnkgdGhlIHNlbnNvcgorICogQGhvc3RfZm10OiBob3N0IGZvcm1hdCBhZnRlciBob3N0IHRyYW5zbGF0aW9uIGZyb20gY2FtX2ZtdAorICogQGJ1c3dpZHRoOiBidXMgd2lkdGggZm9yIHRoaXMgZm9ybWF0CisgKgorICogSG9zdCBhbmQgc2Vuc29yIHRyYW5zbGF0aW9uIHN0cnVjdHVyZS4gVXNlZCBpbiB0YWJsZSBvZiBob3N0IGFuZCBzZW5zb3IKKyAqIGZvcm1hdHMgbWF0Y2hpbmdzIGluIHNvY19jYW1lcmFfZGV2aWNlLiBBIGhvc3QgY2FuIG92ZXJyaWRlIHRoZSBnZW5lcmljIGxpc3QKKyAqIGdlbmVyYXRpb24gYnkgaW1wbGVtZW50aW5nIGdldF9mb3JtYXRzKCksIGFuZCB1c2UgaXQgZm9yIGZvcm1hdCBjaGVja3MgYW5kCisgKiBmb3JtYXQgc2V0dXAuCisgKi8KK3N0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSB7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmNhbV9mbXQ7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGF0YV9mb3JtYXQgKmhvc3RfZm10OworCXVuc2lnbmVkIGNoYXIgYnVzd2lkdGg7Cit9OworCiBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgewogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCWludCAoKnByb2JlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CkBAIC0xMjMsMTMgKzE1OSwxNCBAQAogCWludCAoKnJlbGVhc2UpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAlpbnQgKCpzdGFydF9jYXB0dXJlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJaW50ICgqc3RvcF9jYXB0dXJlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7Ci0JaW50ICgqc2V0X2ZtdF9jYXApKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBfX3UzMiwKLQkJCSAgIHN0cnVjdCB2NGwyX3JlY3QgKik7Ci0JaW50ICgqdHJ5X2ZtdF9jYXApKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKik7CisJaW50ICgqc2V0X2ZtdCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIF9fdTMyLCBzdHJ1Y3QgdjRsMl9yZWN0ICopOworCWludCAoKnRyeV9mbXQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKik7CiAJdW5zaWduZWQgbG9uZyAoKnF1ZXJ5X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCWludCAoKnNldF9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKIAlpbnQgKCpnZXRfY2hpcF9pZCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosCiAJCQkgICBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICopOworCWludCAoKnNldF9zdGQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCB2NGwyX3N0ZF9pZCAqKTsKKwlpbnQgKCplbnVtX2lucHV0KShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfaW5wdXQgKik7CiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCWludCAoKmdldF9yZWdpc3Rlcikoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICopOwogCWludCAoKnNldF9yZWdpc3Rlcikoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX3JlZ2lzdGVyICopOwpAQCAtMTQwLDYgKzE3NywzMiBAQAogCWludCBudW1fY29udHJvbHM7CiB9OwogCisjZGVmaW5lIFNPQ0FNX1NFTlNFX1BDTEtfQ0hBTkdFRAkoMSA8PCAwKQorCisvKioKKyAqIFRoaXMgc3RydWN0IGNhbiBiZSBhdHRhY2hlZCB0byBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgYnkgdGhlIGhvc3QgZHJpdmVyCisgKiB0byByZXF1ZXN0IHNlbnNlIGZyb20gdGhlIGNhbWVyYSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyAuc2V0X2ZtdCgpLiBUaGUKKyAqIGhvc3QgdGhlbiBjYW4gY2hlY2sgd2hpY2ggZmxhZ3MgYXJlIHNldCBhbmQgdmVyaWZ5IHJlc3BlY3RpdmUgdmFsdWVzIGlmIGFueS4KKyAqIEZvciBleGFtcGxlLCBpZiBTT0NBTV9TRU5TRV9QQ0xLX0NIQU5HRUQgaXMgc2V0LCBpdCBtZWFucywgcGl4Y2xvY2sgaGFzCisgKiBjaGFuZ2VkIGR1cmluZyB0aGlzIG9wZXJhdGlvbi4gQWZ0ZXIgY29tcGxldGlvbiB0aGUgaG9zdCBzaG91bGQgZGV0YWNoIHNlbnNlLgorICoKKyAqIEBmbGFncwkJb3JlZCBTT0NBTV9TRU5TRV8qIGZsYWdzCisgKiBAbWFzdGVyX2Nsb2NrCWlmIHRoZSBob3N0IHdhbnRzIHRvIGJlIGluZm9ybWVkIGFib3V0IHBpeGVsLWNsb2NrCisgKgkJCWNoYW5nZSwgaXQgYmV0dGVyIHNldCBtYXN0ZXJfY2xvY2suCisgKiBAcGl4ZWxfY2xvY2tfbWF4CW1heGltdW0gcGl4ZWwgY2xvY2sgZnJlcXVlbmN5IHN1cHBvcnRlZCBieSB0aGUgaG9zdCwKKyAqCQkJY2FtZXJhIGlzIG5vdCBhbGxvd2VkIHRvIGV4Y2VlZCB0aGlzLgorICogQHBpeGVsX2Nsb2NrCQlpZiB0aGUgY2FtZXJhIGRyaXZlciBjaGFuZ2VkIHBpeGVsIGNsb2NrIGR1cmluZyB0aGlzCisgKgkJCW9wZXJhdGlvbiwgaXQgc2V0cyBTT0NBTV9TRU5TRV9QQ0xLX0NIQU5HRUQsIHVzZXMKKyAqCQkJbWFzdGVyX2Nsb2NrIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHBpeGVsLWNsb2NrIGFuZAorICoJCQlzZXRzIHRoaXMgZmllbGQuCisgKi8KK3N0cnVjdCBzb2NfY2FtZXJhX3NlbnNlIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzdGVyX2Nsb2NrOworCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xvY2tfbWF4OworCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xvY2s7Cit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjb25zdCAqc29jX2NhbWVyYV9maW5kX3FjdHJsKAogCXN0cnVjdCBzb2NfY2FtZXJhX29wcyAqb3BzLCBpbnQgaWQpCiB7CkBAIC0xNTgsMTUgKzIyMSwyMCBAQAogI2RlZmluZSBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XCQkoMSA8PCAzKQogI2RlZmluZSBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSAkJKDEgPDwgNCkKICNkZWZpbmUgU09DQU1fVlNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgNSkKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzgJCSgxIDw8IDYpCi0jZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF85CQkoMSA8PCA3KQotI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTAJCSgxIDw8IDgpCi0jZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF8xNgkJKDEgPDwgOSkKLSNkZWZpbmUgU09DQU1fUENMS19TQU1QTEVfUklTSU5HCSgxIDw8IDEwKQotI2RlZmluZSBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HCSgxIDw8IDExKQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfNAkJKDEgPDwgNikKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzgJCSgxIDw8IDcpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF85CQkoMSA8PCA4KQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTAJCSgxIDw8IDkpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF8xNQkJKDEgPDwgMTApCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF8xNgkJKDEgPDwgMTEpCisjZGVmaW5lIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORwkoMSA8PCAxMikKKyNkZWZpbmUgU09DQU1fUENMS19TQU1QTEVfRkFMTElORwkoMSA8PCAxMykKKyNkZWZpbmUgU09DQU1fREFUQV9BQ1RJVkVfSElHSAkJKDEgPDwgMTQpCisjZGVmaW5lIFNPQ0FNX0RBVEFfQUNUSVZFX0xPVwkJKDEgPDwgMTUpCiAKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIX01BU0sgKFNPQ0FNX0RBVEFXSURUSF84IHwgU09DQU1fREFUQVdJRFRIXzkgfCBcCi0JCQkgICAgICBTT0NBTV9EQVRBV0lEVEhfMTAgfCBTT0NBTV9EQVRBV0lEVEhfMTYpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF9NQVNLIChTT0NBTV9EQVRBV0lEVEhfNCB8IFNPQ0FNX0RBVEFXSURUSF84IHwgXAorCQkJICAgICAgU09DQU1fREFUQVdJRFRIXzkgfCBTT0NBTV9EQVRBV0lEVEhfMTAgfCBcCisJCQkgICAgICBTT0NBTV9EQVRBV0lEVEhfMTUgfCBTT0NBTV9EQVRBV0lEVEhfMTYpCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKAogCQkJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzKQpAQCAtMTgyLDQgKzI1MCw3IEBACiAJcmV0dXJuICghaHN5bmMgfHwgIXZzeW5jIHx8ICFwY2xrKSA/IDAgOiBjb21tb25fZmxhZ3M7CiB9CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKKwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHZwNTE0eC5oIGIvaW5jbHVkZS9tZWRpYS90dnA1MTR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3ZWU5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdHZwNTE0eC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTR4LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKiBBdXRob3I6IFZhaWJoYXYgSGlyZW1hdGggPGh2YWliaGF2QHRpLmNvbT4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU2l2YXJhaiBSIDxzaXZhcmFqQHRpLmNvbT4KKyAqICAgICBCcmlqZXNoIFIgSmFkYXYgPGJyaWplc2guakB0aS5jb20+CisgKiAgICAgSGFyZGlrIFNoYWggPGhhcmRpay5zaGFoQHRpLmNvbT4KKyAqICAgICBNYW5qdW5hdGggSGFkbGkgPG1yaEB0aS5jb20+CisgKiAgICAgS2FyaWNoZXJpIE11cmFsaWRoYXJhbiA8bS1rYXJpY2hlcmkyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfVFZQNTE0WF9ICisjZGVmaW5lIF9UVlA1MTRYX0gKKworLyoKKyAqIE90aGVyIG1hY3JvcworICovCisjZGVmaW5lIFRWUDUxNFhfTU9EVUxFX05BTUUJCSJ0dnA1MTR4IgorCisjZGVmaW5lIFRWUDUxNFhfWENMS19CVDY1NgkJKDI3MDAwMDAwKQorCisvKiBOdW1iZXIgb2YgcGl4ZWxzIGFuZCBudW1iZXIgb2YgbGluZXMgcGVyIGZyYW1lIGZvciBkaWZmZXJlbnQgc3RhbmRhcmRzICovCisjZGVmaW5lIE5UU0NfTlVNX0FDVElWRV9QSVhFTFMJCSg3MjApCisjZGVmaW5lIE5UU0NfTlVNX0FDVElWRV9MSU5FUwkJKDQ4MCkKKyNkZWZpbmUgUEFMX05VTV9BQ1RJVkVfUElYRUxTCQkoNzIwKQorI2RlZmluZSBQQUxfTlVNX0FDVElWRV9MSU5FUwkJKDU3NikKKworLyoqCisgKiBlbnVtIHR2cDUxNHhfaW5wdXQgLSBlbnVtIGZvciBkaWZmZXJlbnQgZGVjb2RlciBpbnB1dCBwaW4KKyAqCQljb25maWd1cmF0aW9uLgorICovCitlbnVtIHR2cDUxNHhfaW5wdXQgeworCS8qCisJICogQ1ZCUyBpbnB1dCBzZWxlY3Rpb24KKwkgKi8KKwlJTlBVVF9DVkJTX1ZJMUEgPSAweDAsCisJSU5QVVRfQ1ZCU19WSTFCLAorCUlOUFVUX0NWQlNfVkkxQywKKwlJTlBVVF9DVkJTX1ZJMkEgPSAweDA0LAorCUlOUFVUX0NWQlNfVkkyQiwKKwlJTlBVVF9DVkJTX1ZJMkMsCisJSU5QVVRfQ1ZCU19WSTNBID0gMHgwOCwKKwlJTlBVVF9DVkJTX1ZJM0IsCisJSU5QVVRfQ1ZCU19WSTNDLAorCUlOUFVUX0NWQlNfVkk0QSA9IDB4MEMsCisJLyoKKwkgKiBTLVZpZGVvIGlucHV0IHNlbGVjdGlvbgorCSAqLworCUlOUFVUX1NWSURFT19WSTJBX1ZJMUEgPSAweDQ0LAorCUlOUFVUX1NWSURFT19WSTJCX1ZJMUIsCisJSU5QVVRfU1ZJREVPX1ZJMkNfVkkxQywKKwlJTlBVVF9TVklERU9fVkkyQV9WSTNBID0gMHg1NCwKKwlJTlBVVF9TVklERU9fVkkyQl9WSTNCLAorCUlOUFVUX1NWSURFT19WSTJDX1ZJM0MsCisJSU5QVVRfU1ZJREVPX1ZJNEFfVkkxQSA9IDB4NEMsCisJSU5QVVRfU1ZJREVPX1ZJNEFfVkkxQiwKKwlJTlBVVF9TVklERU9fVkk0QV9WSTFDLAorCUlOUFVUX1NWSURFT19WSTRBX1ZJM0EgPSAweDVDLAorCUlOUFVUX1NWSURFT19WSTRBX1ZJM0IsCisJSU5QVVRfU1ZJREVPX1ZJNEFfVkkzQywKKworCS8qIE5lZWQgdG8gYWRkIGVudHJpZXMgZm9yCisJICogUkdCLCBZUGJQciBhbmQgU0NBUlQuCisJICovCisJSU5QVVRfSU5WQUxJRAorfTsKKworLyoqCisgKiBlbnVtIHR2cDUxNHhfb3V0cHV0IC0gZW51bSBmb3Igb3V0cHV0IGZvcm1hdAorICoJCQlzdXBwb3J0ZWQuCisgKgorICovCitlbnVtIHR2cDUxNHhfb3V0cHV0IHsKKwlPVVRQVVRfMTBCSVRfNDIyX0VNQkVEREVEX1NZTkMgPSAwLAorCU9VVFBVVF8yMEJJVF80MjJfU0VQRVJBVEVfU1lOQywKKwlPVVRQVVRfMTBCSVRfNDIyX1NFUEVSQVRFX1NZTkMgPSAzLAorCU9VVFBVVF9JTlZBTElECit9OworCisvKioKKyAqIHN0cnVjdCB0dnA1MTR4X3BsYXRmb3JtX2RhdGEgLSBQbGF0Zm9ybSBkYXRhIHZhbHVlcyBhbmQgYWNjZXNzIGZ1bmN0aW9ucy4KKyAqIEBwb3dlcl9zZXQ6IFBvd2VyIHN0YXRlIGFjY2VzcyBmdW5jdGlvbiwgemVybyBpcyBvZmYsIG5vbi16ZXJvIGlzIG9uLgorICogQGlmcGFybTogSW50ZXJmYWNlIHBhcmFtZXRlcnMgYWNjZXNzIGZ1bmN0aW9uLgorICogQHByaXZfZGF0YV9zZXQ6IERldmljZSBwcml2YXRlIGRhdGEgKHBvaW50ZXIpIGFjY2VzcyBmdW5jdGlvbi4KKyAqIEBjbGtfcG9sYXJpdHk6IENsb2NrIHBvbGFyaXR5IG9mIHRoZSBjdXJyZW50IGludGVyZmFjZS4KKyAqIEAgaHNfcG9sYXJpdHk6IEhTWU5DIFBvbGFyaXR5IGNvbmZpZ3VyYXRpb24gZm9yIGN1cnJlbnQgaW50ZXJmYWNlLgorICogQCB2c19wb2xhcml0eTogVlNZTkMgUG9sYXJpdHkgY29uZmlndXJhdGlvbiBmb3IgY3VycmVudCBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCB0dnA1MTR4X3BsYXRmb3JtX2RhdGEgeworCWNoYXIgKm1hc3RlcjsKKwlpbnQgKCpwb3dlcl9zZXQpIChlbnVtIHY0bDJfcG93ZXIgb24pOworCWludCAoKmlmcGFybSkgKHN0cnVjdCB2NGwyX2lmcGFybSAqcCk7CisJaW50ICgqcHJpdl9kYXRhX3NldCkgKHZvaWQgKik7CisJLyogSW50ZXJmYWNlIGNvbnRyb2wgcGFyYW1zICovCisJYm9vbCBjbGtfcG9sYXJpdHk7CisJYm9vbCBoc19wb2xhcml0eTsKKwlib29sIHZzX3BvbGFyaXR5OworfTsKKworCisjZW5kaWYJCQkJLyogaWZuZGVmIF9UVlA1MTRYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHc5OTEwLmggYi9pbmNsdWRlL21lZGlhL3R3OTkxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjMxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3R3OTkxMC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiB0dzk5MTAgRHJpdmVyIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIEJhc2VkIG9uIG92NzcyeC5oCisgKgorICogQ29weXJpZ2h0IChDKSBLdW5pbm9yaSBNb3JpbW90byA8bW9yaW1vdG8ua3VuaW5vcmlAcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fVFc5OTEwX0hfXworI2RlZmluZSBfX1RXOTkxMF9IX18KKworI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKworZW51bSB0dzk5MTBfbXBvdXRfcGluIHsKKwlUVzk5MTBfTVBPX1ZMT1NTLAorCVRXOTkxMF9NUE9fSExPQ0ssCisJVFc5OTEwX01QT19TTE9DSywKKwlUVzk5MTBfTVBPX1ZMT0NLLAorCVRXOTkxMF9NUE9fTU9OTywKKwlUVzk5MTBfTVBPX0RFVDUwLAorCVRXOTkxMF9NUE9fRklFTEQsCisJVFc5OTEwX01QT19SVENPLAorfTsKKworc3RydWN0IHR3OTkxMF92aWRlb19pbmZvIHsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgIGJ1c3dpZHRoOworCWVudW0gdHc5OTEwX21wb3V0X3BpbiAgbXBvdXQ7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayBsaW5rOworfTsKKworCisjZW5kaWYgLyogX19UVzk5MTBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAppbmRleCBkNzNhOGU5Li40M2RiYjY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKQEAgLTYwLDYgKzYwLDggQEAKIAogCS8qIE9tbmlWaXNpb24gc2Vuc29yczogcmVzZXJ2ZWQgcmFuZ2UgMjUwLTI5OSAqLwogCVY0TDJfSURFTlRfT1Y3NjcwID0gMjUwLAorCVY0TDJfSURFTlRfT1Y3NzIwID0gMjUxLAorCVY0TDJfSURFTlRfT1Y3NzI1ID0gMjUyLAogCiAJLyogQ29uZXhhbnQgTVBFRyBlbmNvZGVyL2RlY29kZXJzOiByZXNlcnZlZCByYW5nZSA0MTAtNDIwICovCiAJVjRMMl9JREVOVF9DWDIzNDE1ID0gNDE1LApAQCAtNjksNiArNzEsOSBAQAogCS8qIG1vZHVsZSB2cDI3c21weDoganVzdCBpZGVudCAyNzAwICovCiAJVjRMMl9JREVOVF9WUDI3U01QWCA9IDI3MDAsCiAKKwkvKiBtb2R1bGUgdHZwNTE1MCAqLworCVY0TDJfSURFTlRfVFZQNTE1MCA9IDUxNTAsCisKIAkvKiBtb2R1bGUgY3M1MzQ1OiBqdXN0IGlkZW50IDUzNDUgKi8KIAlWNEwyX0lERU5UX0NTNTM0NSA9IDUzNDUsCiAKQEAgLTgyLDYgKzg3LDkgQEAKIAkvKiBtb2R1bGUgd204Nzc1OiBqdXN0IGlkZW50IDg3NzUgKi8KIAlWNEwyX0lERU5UX1dNODc3NSA9IDg3NzUsCiAKKwkvKiBtb2R1bGUgdHc5OTEwOiBqdXN0IGlkZW50IDk5MTAgKi8KKwlWNEwyX0lERU5UX1RXOTkxMCA9IDk5MTAsCisKIAkvKiBtb2R1bGUgY3M1MzEzMmE6IGp1c3QgaWRlbnQgNTMxMzIgKi8KIAlWNEwyX0lERU5UX0NTNTNsMzJBID0gNTMxMzIsCiAKQEAgLTE2Niw4ICsxNzQsMTAgQEAKIAlWNEwyX0lERU5UX01UOU0wMDFDMTJTVAkJPSA0NTAwMCwKIAlWNEwyX0lERU5UX01UOU0wMDFDMTJTVE0JPSA0NTAwNSwKIAlWNEwyX0lERU5UX01UOU0xMTEJCT0gNDUwMDcsCisJVjRMMl9JREVOVF9NVDlNMTEyCQk9IDQ1MDA4LAogCVY0TDJfSURFTlRfTVQ5VjAyMklYN0FUQwk9IDQ1MDEwLCAvKiBObyB3YXkgdG8gZGV0ZWN0ICJub3JtYWwiIEk3N0FUeCAqLwogCVY0TDJfSURFTlRfTVQ5VjAyMklYN0FUTQk9IDQ1MDE1LCAvKiBhbmQgImxlYWQgZnJlZSIgSUE3QVR4IGNoaXBzICovCisJVjRMMl9JREVOVF9NVDlUMDMxCQk9IDQ1MDIwLAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKaW5kZXggMmY4NzE5YS4uZjk5Yzg2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaApAQCAtNTcsNiArNTcsMjkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBUaGVzZSBwcmludGsgY29uc3RydWN0cyBjYW4gYmUgdXNlZCB3aXRoIHY0bDJfZGV2aWNlIGFuZCB2NGwyX3N1YmRldiAqLworI2RlZmluZSB2NGwyX3ByaW50ayhsZXZlbCwgZGV2LCBmbXQsIGFyZy4uLikgXAorCXByaW50ayhsZXZlbCAiJXM6ICIgZm10LCAoZGV2KS0+bmFtZSAsICMjIGFyZykKKworI2RlZmluZSB2NGwyX2VycihkZXYsIGZtdCwgYXJnLi4uKSBcCisJdjRsMl9wcmludGsoS0VSTl9FUlIsIGRldiwgZm10ICwgIyMgYXJnKQorCisjZGVmaW5lIHY0bDJfd2FybihkZXYsIGZtdCwgYXJnLi4uKSBcCisJdjRsMl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsIGZtdCAsICMjIGFyZykKKworI2RlZmluZSB2NGwyX2luZm8oZGV2LCBmbXQsIGFyZy4uLikgXAorCXY0bDJfcHJpbnRrKEtFUk5fSU5GTywgZGV2LCBmbXQgLCAjIyBhcmcpCisKKy8qIFRoZXNlIHRocmVlIG1hY3JvcyBhc3N1bWUgdGhhdCB0aGUgZGVidWcgbGV2ZWwgaXMgc2V0IHdpdGggYSBtb2R1bGUKKyAgIHBhcmFtZXRlciBjYWxsZWQgJ2RlYnVnJy4gKi8KKyNkZWZpbmUgdjRsMl9kYmcobGV2ZWwsIGRlYnVnLCBkZXYsIGZtdCwgYXJnLi4uKQkJCVwKKwlkbyB7IAkJCQkJCQkJXAorCQlpZiAoZGVidWcgPj0gKGxldmVsKSkJCQkJCVwKKwkJCXY0bDJfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgZm10ICwgIyMgYXJnKTsgCVwKKwl9IHdoaWxlICgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIC8qIFByaW9yaXR5IGhlbHBlciBmdW5jdGlvbnMgKi8KIAogc3RydWN0IHY0bDJfcHJpb19zdGF0ZSB7CkBAIC0xMDQsMTEgKzEyNywyOSBAQAogc3RydWN0IGkyY19hZGFwdGVyOwogc3RydWN0IGkyY19jbGllbnQ7CiBzdHJ1Y3QgaTJjX2RldmljZV9pZDsKK3N0cnVjdCB2NGwyX2RldmljZTsKK3N0cnVjdCB2NGwyX3N1YmRldjsKK3N0cnVjdCB2NGwyX3N1YmRldl9vcHM7CiAKIGludCB2NGwyX2kyY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlciwKIAkJY29uc3QgY2hhciAqbmFtZSwKIAkJaW50ICgqcHJvYmUpKHN0cnVjdCBpMmNfY2xpZW50ICosIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICopKTsKIAorLyogTG9hZCBhbiBpMmMgbW9kdWxlIGFuZCByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgdjRsMl9zdWJkZXYgc3RydWN0LgorICAgT25seSBjYWxsIHJlcXVlc3RfbW9kdWxlIGlmIG1vZHVsZV9uYW1lICE9IE5VTEwuCisgICBUaGUgY2xpZW50X3R5cGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGNoaXAgdGhhdCdzIG9uIHRoZSBhZGFwdGVyLiAqLworc3RydWN0IHY0bDJfc3ViZGV2ICp2NGwyX2kyY19uZXdfc3ViZGV2KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIGNvbnN0IGNoYXIgKmNsaWVudF90eXBlLCB1OCBhZGRyKTsKKy8qIFByb2JlIGFuZCBsb2FkIGFuIGkyYyBtb2R1bGUgYW5kIHJldHVybiBhbiBpbml0aWFsaXplZCB2NGwyX3N1YmRldiBzdHJ1Y3QuCisgICBPbmx5IGNhbGwgcmVxdWVzdF9tb2R1bGUgaWYgbW9kdWxlX25hbWUgIT0gTlVMTC4KKyAgIFRoZSBjbGllbnRfdHlwZSBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgY2hpcCB0aGF0J3Mgb24gdGhlIGFkYXB0ZXIuICovCitzdHJ1Y3QgdjRsMl9zdWJkZXYgKnY0bDJfaTJjX25ld19wcm9iZWRfc3ViZGV2KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIGNvbnN0IGNoYXIgKmNsaWVudF90eXBlLAorCQljb25zdCB1bnNpZ25lZCBzaG9ydCAqYWRkcnMpOworLyogSW5pdGlhbGl6ZSBhbiB2NGwyX3N1YmRldiB3aXRoIGRhdGEgZnJvbSBhbiBpMmNfY2xpZW50IHN0cnVjdCAqLwordm9pZCB2NGwyX2kyY19zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICpvcHMpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIEludGVybmFsIGlvY3RscyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCmluZGV4IGEwYTZiNDEuLjBhODhkMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKQEAgLTI1LDYgKzI1LDEyIEBACiAjZGVmaW5lIFZGTF9UWVBFX01BWAkJNAogCiBzdHJ1Y3QgdjRsMl9pb2N0bF9jYWxsYmFja3M7CitzdHJ1Y3QgdjRsMl9kZXZpY2U7CisKKy8qIEZsYWcgdG8gbWFyayB0aGUgdmlkZW9fZGV2aWNlIHN0cnVjdCBhcyB1bnJlZ2lzdGVyZWQuCisgICBEcml2ZXJzIGNhbiBzZXQgdGhpcyBmbGFnIGlmIHRoZXkgd2FudCB0byBibG9jayBhbGwgZnV0dXJlCisgICBkZXZpY2UgYWNjZXNzLiBJdCBpcyBzZXQgYnkgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UuICovCisjZGVmaW5lIFY0TDJfRkxfVU5SRUdJU1RFUkVECSgwKQogCiAvKgogICogTmV3ZXIgdmVyc2lvbiBvZiB2aWRlb19kZXZpY2UsIGhhbmRsZWQgYnkgdmlkZW9kZXYyLmMKQEAgLTM5LDE1ICs0NSwyMCBAQAogCiAJLyogc3lzZnMgKi8KIAlzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHY0bCBkZXZpY2UgKi8KLQlzdHJ1Y3QgY2RldiBjZGV2OwkJLyogY2hhcmFjdGVyIGRldmljZSAqLwotCXZvaWQgKCpjZGV2X3JlbGVhc2UpKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKwlzdHJ1Y3QgY2RldiAqY2RldjsJCS8qIGNoYXJhY3RlciBkZXZpY2UgKi8KKworCS8qIFNldCBlaXRoZXIgcGFyZW50IG9yIHY0bDJfZGV2IGlmIHlvdXIgZHJpdmVyIHVzZXMgdjRsMl9kZXZpY2UgKi8KIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CQkvKiBkZXZpY2UgcGFyZW50ICovCisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldjsJLyogdjRsMl9kZXZpY2UgcGFyZW50ICovCiAKIAkvKiBkZXZpY2UgaW5mbyAqLwogCWNoYXIgbmFtZVszMl07CiAJaW50IHZmbF90eXBlOworCS8qICdtaW5vcicgaXMgc2V0IHRvIC0xIGlmIHRoZSByZWdpc3RyYXRpb24gZmFpbGVkICovCiAJaW50IG1pbm9yOwogCXUxNiBudW07CisJLyogdXNlIGJpdG9wcyB0byBzZXQvY2xlYXIvdGVzdCBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLyogYXR0cmlidXRlIHRvIGRpZmZlcmVudGlhdGUgbXVsdGlwbGUgaW5kaWNlcyBvbiBvbmUgcGh5c2ljYWwgZGV2aWNlICovCiAJaW50IGluZGV4OwogCkBAIC01OCw3ICs2OSw3IEBACiAJdjRsMl9zdGRfaWQgY3VycmVudF9ub3JtOwkvKiBDdXJyZW50IHR2bm9ybSAqLwogCiAJLyogY2FsbGJhY2tzICovCi0Jdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpOwogCiAJLyogaW9jdGwgY2FsbGJhY2tzICovCiAJY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzICppb2N0bF9vcHM7CkBAIC02NywzNiArNzgsNDEgQEAKIC8qIGRldiB0byB2aWRlby1kZXZpY2UgKi8KICNkZWZpbmUgdG9fdmlkZW9fZGV2aWNlKGNkKSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGRldikKIAotLyogUmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgZGV2aWNlcy4gTm90ZSB0aGF0IGlmIHZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlscywKKy8qIFJlZ2lzdGVyIHZpZGVvIGRldmljZXMuIE5vdGUgdGhhdCBpZiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbHMsCiAgICB0aGUgcmVsZWFzZSgpIGNhbGxiYWNrIG9mIHRoZSB2aWRlb19kZXZpY2Ugc3RydWN0dXJlIGlzICpub3QqIGNhbGxlZCwgc28KICAgIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYW55IGRhdGEuIFVzdWFsbHkgdGhhdCBtZWFucyB0aGF0Ci0gICB5b3UgY2FsbCB2aWRlb19kZXZpY2VfcmVsZWFzZSgpIG9uIGZhaWx1cmUuICovCi1pbnQgX19tdXN0X2NoZWNrIHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsIGludCB0eXBlLCBpbnQgbnIpOwotaW50IF9fbXVzdF9jaGVjayB2aWRlb19yZWdpc3Rlcl9kZXZpY2VfaW5kZXgoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorICAgeW91IGNhbGwgdmlkZW9fZGV2aWNlX3JlbGVhc2UoKSBvbiBmYWlsdXJlLgorCisgICBBbHNvIG5vdGUgdGhhdCB2ZGV2LT5taW5vciBpcyBzZXQgdG8gLTEgaWYgdGhlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuICovCitpbnQgX19tdXN0X2NoZWNrIHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2LCBpbnQgdHlwZSwgaW50IG5yKTsKK2ludCBfX211c3RfY2hlY2sgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlX2luZGV4KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsCiAJCQkJCQlpbnQgdHlwZSwgaW50IG5yLCBpbnQgaW5kZXgpOwotdm9pZCB2aWRlb191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpOworCisvKiBVbnJlZ2lzdGVyIHZpZGVvIGRldmljZXMuIFdpbGwgZG8gbm90aGluZyBpZiB2ZGV2ID09IE5VTEwgb3IKKyAgIHZkZXYtPm1pbm9yIDwgMC4gKi8KK3ZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7CiAKIC8qIGhlbHBlciBmdW5jdGlvbnMgdG8gYWxsb2MvcmVsZWFzZSBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCB0aGUKICAgIGxhdHRlciBjYW4gYWxzbyBiZSB1c2VkIGZvciB2aWRlb19kZXZpY2UtPnJlbGVhc2UoKS4gKi8KIHN0cnVjdCB2aWRlb19kZXZpY2UgKiBfX211c3RfY2hlY2sgdmlkZW9fZGV2aWNlX2FsbG9jKHZvaWQpOwogCi0vKiB0aGlzIHJlbGVhc2UgZnVuY3Rpb24gZnJlZXMgdGhlIHZmZCBwb2ludGVyICovCi12b2lkIHZpZGVvX2RldmljZV9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CisvKiB0aGlzIHJlbGVhc2UgZnVuY3Rpb24gZnJlZXMgdGhlIHZkZXYgcG9pbnRlciAqLwordm9pZCB2aWRlb19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KTsKIAogLyogdGhpcyByZWxlYXNlIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgdXNlIHdoZW4gdGhlIHZpZGVvX2RldmljZSBpcyBhCiAgICBzdGF0aWMgZ2xvYmFsIHN0cnVjdC4gTm90ZSB0aGF0IGhhdmluZyBhIHN0YXRpYyB2aWRlb19kZXZpY2UgaXMKICAgIGEgZHViaW91cyBjb25zdHJ1Y3Rpb24gYXQgYmVzdC4gKi8KLXZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHkoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKTsKK3ZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHkoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7CiAKIC8qIGhlbHBlciBmdW5jdGlvbnMgdG8gYWNjZXNzIGRyaXZlciBwcml2YXRlIGRhdGEuICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKnZpZGVvX2dldF9kcnZkYXRhKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlkZW9fZ2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIHsKLQlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHZpZGVvX3NldF9kcnZkYXRhKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19zZXRfZHJ2ZGF0YShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2LCB2b2lkICpkYXRhKQogewotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGRhdGEpOworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBkYXRhKTsKIH0KIAogc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xMDgsNCArMTI0LDkgQEAKIAlyZXR1cm4gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHZpZGVvX2lzX3VucmVnaXN0ZXJlZChzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXJldHVybiB0ZXN0X2JpdChWNEwyX0ZMX1VOUkVHSVNURVJFRCwgJnZkZXYtPmZsYWdzKTsKK30KKwogI2VuZGlmIC8qIF9WNEwyX0RFVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2aWNlLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiMjgzYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXZpY2UuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAgICBWNEwyIGRldmljZSBzdXBwb3J0IGhlYWRlci4KKworICAgIENvcHlyaWdodCAoQykgMjAwOCAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfVjRMMl9ERVZJQ0VfSAorI2RlZmluZSBfVjRMMl9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworLyogRWFjaCBpbnN0YW5jZSBvZiBhIFY0TDIgZGV2aWNlIHNob3VsZCBjcmVhdGUgdGhlIHY0bDJfZGV2aWNlIHN0cnVjdCwKKyAgIGVpdGhlciBzdGFuZC1hbG9uZSBvciBlbWJlZGRlZCBpbiBhIGxhcmdlciBzdHJ1Y3QuCisKKyAgIEl0IGFsbG93cyBlYXN5IGFjY2VzcyB0byBzdWItZGV2aWNlcyAoc2VlIHY0bDItc3ViZGV2LmgpIGFuZCBwcm92aWRlcworICAgYmFzaWMgVjRMMiBkZXZpY2UtbGV2ZWwgc3VwcG9ydC4KKyAqLworCisjZGVmaW5lIFY0TDJfREVWSUNFX05BTUVfU0laRSAoQlVTX0lEX1NJWkUgKyAxNikKKworc3RydWN0IHY0bDJfZGV2aWNlIHsKKwkvKiBkZXYtPmRyaXZlcl9kYXRhIHBvaW50cyB0byB0aGlzIHN0cnVjdCAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwkvKiB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJlZ2lzdGVyZWQgc3ViZGV2cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3ViZGV2czsKKwkvKiBsb2NrIHRoaXMgc3RydWN0OyBjYW4gYmUgdXNlZCBieSB0aGUgZHJpdmVyIGFzIHdlbGwgaWYgdGhpcworCSAgIHN0cnVjdCBpcyBlbWJlZGRlZCBpbnRvIGEgbGFyZ2VyIHN0cnVjdC4gKi8KKwlzcGlubG9ja190IGxvY2s7CisJLyogdW5pcXVlIGRldmljZSBuYW1lLCBieSBkZWZhdWx0IHRoZSBkcml2ZXIgbmFtZSArIGJ1cyBJRCAqLworCWNoYXIgbmFtZVtWNEwyX0RFVklDRV9OQU1FX1NJWkVdOworfTsKKworLyogSW5pdGlhbGl6ZSB2NGwyX2RldiBhbmQgbWFrZSBkZXYtPmRyaXZlcl9kYXRhIHBvaW50IHRvIHY0bDJfZGV2ICovCitpbnQgX19tdXN0X2NoZWNrIHY0bDJfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2Rldik7CisvKiBTZXQgdjRsMl9kZXYtPmRldi0+ZHJpdmVyX2RhdGEgdG8gTlVMTCBhbmQgdW5yZWdpc3RlciBhbGwgc3ViLWRldmljZXMgKi8KK3ZvaWQgdjRsMl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KTsKKworLyogUmVnaXN0ZXIgYSBzdWJkZXYgd2l0aCBhIHY0bDIgZGV2aWNlLiBXaGlsZSByZWdpc3RlcmVkIHRoZSBzdWJkZXYgbW9kdWxlCisgICBpcyBtYXJrZWQgYXMgaW4tdXNlLiBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgbW9kdWxlIGlzIG5vIGxvbmdlcgorICAgbG9hZGVkIHdoZW4geW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgaXQuICovCitpbnQgX19tdXN0X2NoZWNrIHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldihzdHJ1Y3QgdjRsMl9kZXZpY2UgKmRldiwgc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7CisvKiBVbnJlZ2lzdGVyIGEgc3ViZGV2IHdpdGggYSB2NGwyIGRldmljZS4gQ2FuIGFsc28gYmUgY2FsbGVkIGlmIHRoZSBzdWJkZXYKKyAgIHdhc24ndCByZWdpc3RlcmVkLiBJbiB0aGF0IGNhc2UgaXQgd2lsbCBkbyBub3RoaW5nLiAqLwordm9pZCB2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKKworLyogSXRlcmF0ZSBvdmVyIGFsbCBzdWJkZXZzLiAqLworI2RlZmluZSB2NGwyX2RldmljZV9mb3JfZWFjaF9zdWJkZXYoc2QsIGRldikJCQkJXAorCWxpc3RfZm9yX2VhY2hfZW50cnkoc2QsICYoZGV2KS0+c3ViZGV2cywgbGlzdCkKKworLyogQ2FsbCB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrIGZvciBhbGwgc3ViZGV2cyBtYXRjaGluZyB0aGUgY29uZGl0aW9uLgorICAgSWdub3JlIGFueSBlcnJvcnMuIE5vdGUgdGhhdCB5b3UgY2Fubm90IGFkZCBvciBkZWxldGUgYSBzdWJkZXYKKyAgIHdoaWxlIHdhbGtpbmcgdGhlIHN1YmRldnMgbGlzdC4gKi8KKyNkZWZpbmUgX192NGwyX2RldmljZV9jYWxsX3N1YmRldnMoZGV2LCBjb25kLCBvLCBmLCBhcmdzLi4uKSAJCVwKKwlkbyB7IAkJCQkJCQkJXAorCQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOyAJCQkJXAorCQkJCQkJCQkJXAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkLCAmKGRldiktPnN1YmRldnMsIGxpc3QpICAgCVwKKwkJCWlmICgoY29uZCkgJiYgc2QtPm9wcy0+byAmJiBzZC0+b3BzLT5vLT5mKSAJXAorCQkJCXNkLT5vcHMtPm8tPmYoc2QgLCAjI2FyZ3MpOyAJCVwKKwl9IHdoaWxlICgwKQorCisvKiBDYWxsIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgZm9yIGFsbCBzdWJkZXZzIG1hdGNoaW5nIHRoZSBjb25kaXRpb24uCisgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhbiBlcnJvciBvdGhlciB0aGFuIDAgb3IgLUVOT0lPQ1RMQ01ELCB0aGVuCisgICByZXR1cm4gd2l0aCB0aGF0IGVycm9yIGNvZGUuIE5vdGUgdGhhdCB5b3UgY2Fubm90IGFkZCBvciBkZWxldGUgYQorICAgc3ViZGV2IHdoaWxlIHdhbGtpbmcgdGhlIHN1YmRldnMgbGlzdC4gKi8KKyNkZWZpbmUgX192NGwyX2RldmljZV9jYWxsX3N1YmRldnNfdW50aWxfZXJyKGRldiwgY29uZCwgbywgZiwgYXJncy4uLikgIFwKKyh7IAkJCQkJCQkJCVwKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOyAJCQkJCVwKKwlpbnQgZXJyID0gMDsgCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkLCAmKGRldiktPnN1YmRldnMsIGxpc3QpIHsgCQlcCisJCWlmICgoY29uZCkgJiYgc2QtPm9wcy0+byAmJiBzZC0+b3BzLT5vLT5mKSAJCVwKKwkJCWVyciA9IHNkLT5vcHMtPm8tPmYoc2QgLCAjI2FyZ3MpOyAJCVwKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0lPQ1RMQ01EKQkJCQlcCisJCQlicmVhazsgCQkJCQkJXAorCX0gCQkJCQkJCQlcCisJKGVyciA9PSAtRU5PSU9DVExDTUQpID8gMCA6IGVycjsgCQkJCVwKK30pCisKKy8qIENhbGwgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmb3IgYWxsIHN1YmRldnMgbWF0Y2hpbmcgZ3JwX2lkIChpZiAwLCB0aGVuCisgICBtYXRjaCB0aGVtIGFsbCkuIElnbm9yZSBhbnkgZXJyb3JzLiBOb3RlIHRoYXQgeW91IGNhbm5vdCBhZGQgb3IgZGVsZXRlCisgICBhIHN1YmRldiB3aGlsZSB3YWxraW5nIHRoZSBzdWJkZXZzIGxpc3QuICovCisjZGVmaW5lIHY0bDJfZGV2aWNlX2NhbGxfYWxsKGRldiwgZ3JwX2lkLCBvLCBmLCBhcmdzLi4uKSAJCVwKKwlfX3Y0bDJfZGV2aWNlX2NhbGxfc3ViZGV2cyhkZXYsIAkJCQlcCisJCQkhKGdycF9pZCkgfHwgc2QtPmdycF9pZCA9PSAoZ3JwX2lkKSwgbywgZiAsICMjYXJncykKKworLyogQ2FsbCB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrIGZvciBhbGwgc3ViZGV2cyBtYXRjaGluZyBncnBfaWQgKGlmIDAsIHRoZW4KKyAgIG1hdGNoIHRoZW0gYWxsKS4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYW4gZXJyb3Igb3RoZXIgdGhhbiAwIG9yCisgICAtRU5PSU9DVExDTUQsIHRoZW4gcmV0dXJuIHdpdGggdGhhdCBlcnJvciBjb2RlLiBOb3RlIHRoYXQgeW91IGNhbm5vdAorICAgYWRkIG9yIGRlbGV0ZSBhIHN1YmRldiB3aGlsZSB3YWxraW5nIHRoZSBzdWJkZXZzIGxpc3QuICovCisjZGVmaW5lIHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKGRldiwgZ3JwX2lkLCBvLCBmLCBhcmdzLi4uKSAJCVwKKwlfX3Y0bDJfZGV2aWNlX2NhbGxfc3ViZGV2c191bnRpbF9lcnIoZGV2LAkJCVwKKwkJICAgICAgICEoZ3JwX2lkKSB8fCBzZC0+Z3JwX2lkID09IChncnBfaWQpLCBvLCBmICwgIyNhcmdzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItaW50LWRldmljZS5oCmluZGV4IDljMmRmNDEuLmVjZGEzYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWludC1kZXZpY2UuaApAQCAtMTgzLDYgKzE4Myw5IEBACiAJdmlkaW9jX2ludF9zX2Nyb3BfbnVtLAogCXZpZGlvY19pbnRfZ19wYXJtX251bSwKIAl2aWRpb2NfaW50X3NfcGFybV9udW0sCisJdmlkaW9jX2ludF9xdWVyeXN0ZF9udW0sCisJdmlkaW9jX2ludF9zX3N0ZF9udW0sCisJdmlkaW9jX2ludF9zX3ZpZGVvX3JvdXRpbmdfbnVtLAogCiAJLyoKIAkgKgpAQCAtMjg0LDYgKzI4Nyw5IEBACiBWNEwyX0lOVF9XUkFQUEVSXzEoc19jcm9wLCBzdHJ1Y3QgdjRsMl9jcm9wLCAqKTsKIFY0TDJfSU5UX1dSQVBQRVJfMShnX3Bhcm0sIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0sICopOwogVjRMMl9JTlRfV1JBUFBFUl8xKHNfcGFybSwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSwgKik7CitWNEwyX0lOVF9XUkFQUEVSXzEocXVlcnlzdGQsIHY0bDJfc3RkX2lkLCAqKTsKK1Y0TDJfSU5UX1dSQVBQRVJfMShzX3N0ZCwgdjRsMl9zdGRfaWQsICopOworVjRMMl9JTlRfV1JBUFBFUl8xKHNfdmlkZW9fcm91dGluZywgc3RydWN0IHY0bDJfcm91dGluZywgKik7CiAKIFY0TDJfSU5UX1dSQVBQRVJfMChkZXZfaW5pdCk7CiBWNEwyX0lOVF9XUkFQUEVSXzAoZGV2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAppbmRleCBlNmJhMjViLi5mY2RiNThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaApAQCAtMjMyLDYgKzIzMiwxMiBAQAogCWludCAoKnZpZGlvY19nX2NoaXBfaWRlbnQpICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAogCQkJCQlzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKTsKIAorCWludCAoKnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSk7CisKKwlpbnQgKCp2aWRpb2NfZW51bV9mcmFtZWludGVydmFscykgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICAgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmZpdmFsKTsKKwogCS8qIEZvciBvdGhlciBwcml2YXRlIGlvY3RscyAqLwogCWludCAoKnZpZGlvY19kZWZhdWx0KQkgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJaW50IGNtZCwgdm9pZCAqYXJnKTsKQEAgLTI4NSwxNSArMjkxLDEzIEBACiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCiAvKiBJbmNsdWRlIHN1cHBvcnQgZm9yIG9ic29sZXRlZCBzdHVmZiAqLwotZXh0ZXJuIGludCB2aWRlb191c2VyY29weShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCi0JCQkgIGludCAoKmZ1bmMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykpOworZXh0ZXJuIGludCB2aWRlb191c2VyY29weShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZywgdjRsMl9raW9jdGwgZnVuYyk7CiAKIC8qIFN0YW5kYXJkIGhhbmRsZXJzIGZvciBWNEwgaW9jdGwncyAqLwogCiAvKiBUaGlzIHByb3RvdHlwZSBpcyB1c2VkIG9uIGZvcHMudW5sb2NrZWRfaW9jdGwgKi8KLWV4dGVybiBpbnQgX192aWRlb19pb2N0bDIoc3RydWN0IGZpbGUgKmZpbGUsCitleHRlcm4gbG9uZyBfX3ZpZGVvX2lvY3RsMihzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogLyogVGhpcyBwcm90b3R5cGUgaXMgdXNlZCBvbiBmb3BzLmlvY3RsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlZjAxNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAgICBWNEwyIHN1Yi1kZXZpY2Ugc3VwcG9ydCBoZWFkZXIuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX1Y0TDJfU1VCREVWX0gKKyNkZWZpbmUgX1Y0TDJfU1VCREVWX0gKKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisKK3N0cnVjdCB2NGwyX2RldmljZTsKK3N0cnVjdCB2NGwyX3N1YmRldjsKK3N0cnVjdCB0dW5lcl9zZXR1cDsKKworLyogU3ViLWRldmljZXMgYXJlIGRldmljZXMgdGhhdCBhcmUgY29ubmVjdGVkIHNvbWVob3cgdG8gdGhlIG1haW4gYnJpZGdlCisgICBkZXZpY2UuIFRoZXNlIGRldmljZXMgYXJlIHVzdWFsbHkgYXVkaW8vdmlkZW8gbXV4ZXJzL2VuY29kZXJzL2RlY29kZXJzIG9yCisgICBzZW5zb3JzIGFuZCB3ZWJjYW0gY29udHJvbGxlcnMuCisKKyAgIFVzdWFsbHkgdGhlc2UgZGV2aWNlcyBhcmUgY29udHJvbGxlZCB0aHJvdWdoIGFuIGkyYyBidXMsIGJ1dCBvdGhlciBidXNzZXMKKyAgIG1heSBhbHNvIGJlIHVzZWQuCisKKyAgIFRoZSB2NGwyX3N1YmRldiBzdHJ1Y3QgcHJvdmlkZXMgYSB3YXkgb2YgYWNjZXNzaW5nIHRoZXNlIGRldmljZXMgaW4gYQorICAgZ2VuZXJpYyBtYW5uZXIuIE1vc3Qgb3BlcmF0aW9ucyB0aGF0IHRoZXNlIHN1Yi1kZXZpY2VzIHN1cHBvcnQgZmFsbCBpbgorICAgYSBmZXcgY2F0ZWdvcmllczogY29yZSBvcHMsIGF1ZGlvIG9wcywgdmlkZW8gb3BzIGFuZCB0dW5lciBvcHMuCisKKyAgIE1vcmUgY2F0ZWdvcmllcyBjYW4gYmUgYWRkZWQgaWYgbmVlZGVkLCBhbHRob3VnaCB0aGlzIHNob3VsZCByZW1haW4gYQorICAgbGltaXRlZCBzZXQgKG5vIG1vcmUgdGhhbiBhcHByb3guIDggY2F0ZWdvcmllcykuCisKKyAgIEVhY2ggY2F0ZWdvcnkgaGFzIGl0cyBvd24gc2V0IG9mIG9wcyB0aGF0IHN1YmRldiBkcml2ZXJzIGNhbiBpbXBsZW1lbnQuCisKKyAgIEEgc3ViZGV2IGRyaXZlciBjYW4gbGVhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGNhdGVnb3J5IG9wcyBOVUxMIGlmCisgICBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlbSAoZS5nLiBhbiBhdWRpbyBzdWJkZXYgd2lsbCBnZW5lcmFsbHkgbm90CisgICBpbXBsZW1lbnQgdGhlIHZpZGVvIGNhdGVnb3J5IG9wcykuIFRoZSBleGNlcHRpb24gaXMgdGhlIGNvcmUgY2F0ZWdvcnk6CisgICB0aGlzIG11c3QgYWx3YXlzIGJlIHByZXNlbnQuCisKKyAgIFRoZXNlIG9wcyBhcmUgYWxsIHVzZWQgaW50ZXJuYWxseSBzbyBpdCBpcyBubyBwcm9ibGVtIHRvIGNoYW5nZSwgcmVtb3ZlCisgICBvciBhZGQgb3BzIG9yIG1vdmUgb3BzIGZyb20gb25lIHRvIGFub3RoZXIgY2F0ZWdvcnkuIEN1cnJlbnRseSB0aGVzZQorICAgb3BzIGFyZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaW9jdGxzLCBidXQgc2luY2Ugb3BzIGFyZSBub3QgbGltaXRlZCB0bworICAgb25lIGFyZ3VtZW50IHRoZXJlIGlzIHJvb20gZm9yIGltcHJvdmVtZW50IGhlcmUgb25jZSBhbGwgaTJjIHN1YmRldgorICAgZHJpdmVycyBhcmUgY29udmVydGVkIHRvIHVzZSB0aGVzZSBvcHMuCisgKi8KKworLyogQ29yZSBvcHM6IGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBpbXBsZW1lbnQgYXQgbGVhc3QgdGhlc2Ugb3BzOgorCisgICBnX2NoaXBfaWRlbnQKKyAgIGxvZ19zdGF0dXMKKyAgIGdfcmVnaXN0ZXIKKyAgIHNfcmVnaXN0ZXIKKworICAgVGhpcyBwcm92aWRlcyBiYXNpYyBkZWJ1Z2dpbmcgc3VwcG9ydC4KKworICAgVGhlIGlvY3RsIG9wcyBpcyBtZWFudCBmb3IgZ2VuZXJpYyBpb2N0bC1saWtlIGNvbW1hbmRzLiBEZXBlbmRpbmcgb24KKyAgIHRoZSB1c2UtY2FzZSBpdCBtaWdodCBiZSBiZXR0ZXIgdG8gdXNlIHN1YmRldi1zcGVjaWZpYyBvcHMgKGN1cnJlbnRseQorICAgbm90IHlldCBpbXBsZW1lbnRlZCkgc2luY2Ugb3BzIHByb3ZpZGUgcHJvcGVyIHR5cGUtY2hlY2tpbmcuCisgKi8KK3N0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB7CisJaW50ICgqZ19jaGlwX2lkZW50KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwKTsKKwlpbnQgKCpsb2dfc3RhdHVzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgdmFsKTsKKwlpbnQgKCpzX3N0YW5kYnkpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBzdGFuZGJ5KTsKKwlpbnQgKCpyZXNldCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHZhbCk7CisJaW50ICgqc19ncGlvKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgdmFsKTsKKwlpbnQgKCpxdWVyeWN0cmwpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpOworCWludCAoKmdfY3RybCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7CisJaW50ICgqc19jdHJsKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKKwlpbnQgKCpxdWVyeW1lbnUpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW0pOworCWludCAoKmlvY3RsKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwlpbnQgKCpnX3JlZ2lzdGVyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKTsKKwlpbnQgKCpzX3JlZ2lzdGVyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKTsKKyNlbmRpZgorfTsKKworc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyB7CisJaW50ICgqc19tb2RlKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBlbnVtIHY0bDJfdHVuZXJfdHlwZSk7CisJaW50ICgqc19yYWRpbykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7CisJaW50ICgqc19mcmVxdWVuY3kpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSk7CisJaW50ICgqZ19mcmVxdWVuY3kpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSk7CisJaW50ICgqZ190dW5lcikoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfdHVuZXIgKnZ0KTsKKwlpbnQgKCpzX3R1bmVyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpOworCWludCAoKnNfc3RkKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBub3JtKTsKKwlpbnQgKCpzX3R5cGVfYWRkcikoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHR1bmVyX3NldHVwICp0eXBlKTsKKwlpbnQgKCpzX2NvbmZpZykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnICpjb25maWcpOworfTsKKworc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyB7CisJaW50ICgqc19jbG9ja19mcmVxKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZnJlcSk7CisJaW50ICgqc19pMnNfY2xvY2tfZnJlcSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGZyZXEpOworCWludCAoKnNfcm91dGluZykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgY29uc3Qgc3RydWN0IHY0bDJfcm91dGluZyAqcm91dGUpOworfTsKKworc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyB7CisJaW50ICgqc19yb3V0aW5nKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSk7CisJaW50ICgqc19jcnlzdGFsX2ZyZXEpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSAqZnJlcSk7CisJaW50ICgqZGVjb2RlX3ZiaV9saW5lKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kZWNvZGVfdmJpX2xpbmUgKnZiaV9saW5lKTsKKwlpbnQgKCpzX3ZiaV9kYXRhKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBjb25zdCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgKnZiaV9kYXRhKTsKKwlpbnQgKCpnX3ZiaV9kYXRhKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgKnZiaV9kYXRhKTsKKwlpbnQgKCpnX3NsaWNlZF92YmlfY2FwKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCAqY2FwKTsKKwlpbnQgKCpzX3N0ZF9vdXRwdXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCk7CisJaW50ICgqc19zdHJlYW0pKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpOworCWludCAoKnNfZm10KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCk7CisJaW50ICgqZ19mbXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KTsKK307CisKK3N0cnVjdCB2NGwyX3N1YmRldl9vcHMgeworCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyAgKmNvcmU7CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3R1bmVyX29wcyAqdHVuZXI7CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2F1ZGlvX29wcyAqYXVkaW87CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyAqdmlkZW87Cit9OworCisjZGVmaW5lIFY0TDJfU1VCREVWX05BTUVfU0laRSAzMgorCisvKiBFYWNoIGluc3RhbmNlIG9mIGEgc3ViZGV2IGRyaXZlciBzaG91bGQgY3JlYXRlIHRoaXMgc3RydWN0LCBlaXRoZXIKKyAgIHN0YW5kLWFsb25lIG9yIGVtYmVkZGVkIGluIGEgbGFyZ2VyIHN0cnVjdC4KKyAqLworc3RydWN0IHY0bDJfc3ViZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJc3RydWN0IHY0bDJfZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyAqb3BzOworCS8qIG5hbWUgbXVzdCBiZSB1bmlxdWUgKi8KKwljaGFyIG5hbWVbVjRMMl9TVUJERVZfTkFNRV9TSVpFXTsKKwkvKiBjYW4gYmUgdXNlZCB0byBncm91cCBzaW1pbGFyIHN1YmRldnMsIHZhbHVlIGlzIGRyaXZlci1zcGVjaWZpYyAqLworCXUzMiBncnBfaWQ7CisJLyogcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpwcml2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHY0bDJfc2V0X3N1YmRldmRhdGEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdm9pZCAqcCkKK3sKKwlzZC0+cHJpdiA9IHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdjRsMl9nZXRfc3ViZGV2ZGF0YShjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBzZC0+cHJpdjsKK30KKworLyogQ29udmVydCBhbiBpb2N0bC10eXBlIGNvbW1hbmQgdG8gdGhlIHByb3BlciB2NGwyX3N1YmRldl9vcHMgZnVuY3Rpb24gY2FsbC4KKyAgIFRoaXMgaXMgdXNlZCBieSBzdWJkZXYgbW9kdWxlcyB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgYm90aCBvbGQtc3R5bGUgaW9jdGwKKyAgIGNvbW1hbmRzIGFuZCB0aHJvdWdoIHRoZSB2NGwyX3N1YmRldl9vcHMuCisKKyAgIFRoZSBpb2N0bCBBUEkgb2YgdGhlIHN1YmRldiBkcml2ZXIgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjYWxsIHRoZQorICAgcmlnaHQgb3BzIGJhc2VkIG9uIHRoZSBpb2N0bCBjbWQgYW5kIGFyZy4KKworICAgT25jZSBhbGwgc3ViZGV2IGRyaXZlcnMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBhbmQgYWxsIGRyaXZlcnMgbm8gbG9uZ2VyCisgICB1c2UgdGhlIGlvY3RsIGludGVyZmFjZSwgdGhlbiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSByZW1vdmVkLgorICovCitpbnQgdjRsMl9zdWJkZXZfY29tbWFuZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2NGwyX3N1YmRldl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJCWNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKm9wcykKK3sKKwlJTklUX0xJU1RfSEVBRCgmc2QtPmxpc3QpOworCS8qIG9wcy0+Y29yZSBNVVNUIGJlIHNldCAqLworCUJVR19PTighb3BzIHx8ICFvcHMtPmNvcmUpOworCXNkLT5vcHMgPSBvcHM7CisJc2QtPmRldiA9IE5VTEw7CisJc2QtPm5hbWVbMF0gPSAnXDAnOworCXNkLT5ncnBfaWQgPSAwOworCXNkLT5wcml2ID0gTlVMTDsKK30KKworLyogQ2FsbCBhbiBvcHMgb2YgYSB2NGwyX3N1YmRldiwgZG9pbmcgdGhlIHJpZ2h0IGNoZWNrcyBhZ2FpbnN0CisgICBOVUxMIHBvaW50ZXJzLgorCisgICBFeGFtcGxlOiBlcnIgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBnX2NoaXBfaWRlbnQsICZjaGlwKTsKKyAqLworI2RlZmluZSB2NGwyX3N1YmRldl9jYWxsKHNkLCBvLCBmLCBhcmdzLi4uKQkJCQlcCisJKCEoc2QpID8gLUVOT0RFViA6ICgoKHNkKSAmJiAoc2QpLT5vcHMtPm8gJiYgKHNkKS0+b3BzLT5vLT5mKSA/CVwKKwkJKHNkKS0+b3BzLT5vLT5mKChzZCkgLCAjI2FyZ3MpIDogLUVOT0lPQ1RMQ01EKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1Y2EwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19lbHMuaApAQCAtMCwwICsxLDgxNiBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0ZDX0VMU19IXworI2RlZmluZQlfRkNfRUxTX0hfCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIFN3aXRjaCAtIEVuaGFuY2VkIExpbmsgU2VydmljZXMgZGVmaW5pdGlvbnMuCisgKiBGcm9tIFQxMSBGQy1MUyBSZXYgMS4yIEp1bmUgNywgMjAwNS4KKyAqLworCisvKgorICogRUxTIENvbW1hbmQgY29kZXMgLSBieXRlIDAgb2YgdGhlIGZyYW1lIHBheWxvYWQKKyAqLworZW51bSBmY19lbHNfY21kIHsKKwlFTFNfTFNfUkpUID0JMHgwMSwJLyogRVNMIHJlamVjdCAqLworCUVMU19MU19BQ0MgPQkweDAyLAkvKiBFU0wgQWNjZXB0ICovCisJRUxTX1BMT0dJID0JMHgwMywJLyogTl9Qb3J0IGxvZ2luICovCisJRUxTX0ZMT0dJID0JMHgwNCwJLyogRl9Qb3J0IGxvZ2luICovCisJRUxTX0xPR08gPQkweDA1LAkvKiBMb2dvdXQgKi8KKwlFTFNfQUJUWCA9CTB4MDYsCS8qIEFib3J0IGV4Y2hhbmdlIC0gb2Jzb2xldGUgKi8KKwlFTFNfUkNTID0JMHgwNywJLyogcmVhZCBjb25uZWN0aW9uIHN0YXR1cyAqLworCUVMU19SRVMgPQkweDA4LAkvKiByZWFkIGV4Y2hhbmdlIHN0YXR1cyBibG9jayAqLworCUVMU19SU1MgPQkweDA5LAkvKiByZWFkIHNlcXVlbmNlIHN0YXR1cyBibG9jayAqLworCUVMU19SU0kgPQkweDBhLAkvKiByZWFkIHNlcXVlbmNlIGluaXRpYXRpdmUgKi8KKwlFTFNfRVNUUyA9CTB4MGIsCS8qIGVzdGFibGlzaCBzdHJlYW1pbmcgKi8KKwlFTFNfRVNUQyA9CTB4MGMsCS8qIGVzdGltYXRlIGNyZWRpdCAqLworCUVMU19BRFZDID0JMHgwZCwJLyogYWR2aXNlIGNyZWRpdCAqLworCUVMU19SVFYgPQkweDBlLAkvKiByZWFkIHRpbWVvdXQgdmFsdWUgKi8KKwlFTFNfUkxTID0JMHgwZiwJLyogcmVhZCBsaW5rIGVycm9yIHN0YXR1cyBibG9jayAqLworCUVMU19FQ0hPID0JMHgxMCwJLyogZWNobyAqLworCUVMU19URVNUID0JMHgxMSwJLyogdGVzdCAqLworCUVMU19SUlEgPQkweDEyLAkvKiByZWluc3RhdGUgcmVjb3ZlcnkgcXVhbGlmaWVyICovCisJRUxTX1JFQyA9CTB4MTMsCS8qIHJlYWQgZXhjaGFuZ2UgY29uY2lzZSAqLworCUVMU19TUlIgPQkweDE0LAkvKiBzZXF1ZW5jZSByZXRyYW5zbWlzc2lvbiByZXF1ZXN0ICovCisJRUxTX1BSTEkgPQkweDIwLAkvKiBwcm9jZXNzIGxvZ2luICovCisJRUxTX1BSTE8gPQkweDIxLAkvKiBwcm9jZXNzIGxvZ291dCAqLworCUVMU19TQ04gPQkweDIyLAkvKiBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCisJRUxTX1RQTFMgPQkweDIzLAkvKiB0ZXN0IHByb2Nlc3MgbG9naW4gc3RhdGUgKi8KKwlFTFNfVFBSTE8gPQkweDI0LAkvKiB0aGlyZCBwYXJ0eSBwcm9jZXNzIGxvZ291dCAqLworCUVMU19MQ0xNID0JMHgyNSwJLyogbG9naW4gY29udHJvbCBsaXN0IG1nbXQgKG9icykgKi8KKwlFTFNfR0FJRCA9CTB4MzAsCS8qIGdldCBhbGlhc19JRCAqLworCUVMU19GQUNUID0JMHgzMSwJLyogZmFicmljIGFjdGl2YXRlIGFsaWFzX2lkICovCisJRUxTX0ZEQUNEVCA9CTB4MzIsCS8qIGZhYnJpYyBkZWFjdGl2YXRlIGFsaWFzX2lkICovCisJRUxTX05BQ1QgPQkweDMzLAkvKiBOLXBvcnQgYWN0aXZhdGUgYWxpYXNfaWQgKi8KKwlFTFNfTkRBQ1QgPQkweDM0LAkvKiBOLXBvcnQgZGVhY3RpdmF0ZSBhbGlhc19pZCAqLworCUVMU19RT1NSID0JMHg0MCwJLyogcXVhbGl0eSBvZiBzZXJ2aWNlIHJlcXVlc3QgKi8KKwlFTFNfUlZDUyA9CTB4NDEsCS8qIHJlYWQgdmlydHVhbCBjaXJjdWl0IHN0YXR1cyAqLworCUVMU19QRElTQyA9CTB4NTAsCS8qIGRpc2NvdmVyIE5fcG9ydCBzZXJ2aWNlIHBhcmFtcyAqLworCUVMU19GRElTQyA9CTB4NTEsCS8qIGRpc2NvdmVyIEZfcG9ydCBzZXJ2aWNlIHBhcmFtcyAqLworCUVMU19BRElTQyA9CTB4NTIsCS8qIGRpc2NvdmVyIGFkZHJlc3MgKi8KKwlFTFNfUk5DID0JMHg1MywJLyogcmVwb3J0IG5vZGUgY2FwIChvYnMpICovCisJRUxTX0ZBUlBfUkVRID0JMHg1NCwJLyogRkMgQVJQIHJlcXVlc3QgKi8KKwlFTFNfRkFSUF9SRVBMID0JMHg1NSwJLyogRkMgQVJQIHJlcGx5ICovCisJRUxTX1JQUyA9CTB4NTYsCS8qIHJlYWQgcG9ydCBzdGF0dXMgYmxvY2sgKi8KKwlFTFNfUlBMID0JMHg1NywJLyogcmVhZCBwb3J0IGxpc3QgKi8KKwlFTFNfUlBCQyA9CTB4NTgsCS8qIHJlYWQgcG9ydCBidWZmZXIgY29uZGl0aW9uICovCisJRUxTX0ZBTiA9CTB4NjAsCS8qIGZhYnJpYyBhZGRyZXNzIG5vdGlmaWNhdGlvbiAqLworCUVMU19SU0NOID0JMHg2MSwJLyogcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCisJRUxTX1NDUiA9CTB4NjIsCS8qIHN0YXRlIGNoYW5nZSByZWdpc3RyYXRpb24gKi8KKwlFTFNfUk5GVCA9CTB4NjMsCS8qIHJlcG9ydCBub2RlIEZDLTQgdHlwZXMgKi8KKwlFTFNfQ1NSID0JMHg2OCwJLyogY2xvY2sgc3luY2guIHJlcXVlc3QgKi8KKwlFTFNfQ1NVID0JMHg2OSwJLyogY2xvY2sgc3luY2guIHVwZGF0ZSAqLworCUVMU19MSU5JVCA9CTB4NzAsCS8qIGxvb3AgaW5pdGlhbGl6ZSAqLworCUVMU19MU1RTID0JMHg3MiwJLyogbG9vcCBzdGF0dXMgKi8KKwlFTFNfUk5JRCA9CTB4NzgsCS8qIHJlcXVlc3Qgbm9kZSBJRCBkYXRhICovCisJRUxTX1JMSVIgPQkweDc5LAkvKiByZWdpc3RlcmVkIGxpbmsgaW5jaWRlbnQgcmVwb3J0ICovCisJRUxTX0xJUlIgPQkweDdhLAkvKiBsaW5rIGluY2lkZW50IHJlY29yZCByZWdpc3RyYXRpb24gKi8KKwlFTFNfU1JMID0JMHg3YiwJLyogc2NhbiByZW1vdGUgbG9vcCAqLworCUVMU19TQlJQID0JMHg3YywJLyogc2V0IGJpdC1lcnJvciByZXBvcnRpbmcgcGFyYW1zICovCisJRUxTX1JQU0MgPQkweDdkLAkvKiByZXBvcnQgc3BlZWQgY2FwYWJpbGl0aWVzICovCisJRUxTX1FTQSA9CTB4N2UsCS8qIHF1ZXJ5IHNlY3VyaXR5IGF0dHJpYnV0ZXMgKi8KKwlFTFNfRVZGUCA9CTB4N2YsCS8qIGV4Y2hhbmdlIHZpcnQuIGZhYnJpY3MgcGFyYW1zICovCisJRUxTX0xLQSA9CTB4ODAsCS8qIGxpbmsga2VlcC1hbGl2ZSAqLworCUVMU19BVVRIX0VMUyA9CTB4OTAsCS8qIGF1dGhlbnRpY2F0aW9uIEVMUyAqLworfTsKKworLyoKKyAqIEluaXRpYWxpemVyIHVzZWZ1bCBmb3IgZGVjb2RpbmcgdGFibGUuCisgKiBQbGVhc2Uga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGUgYWJvdmUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJRkNfRUxTX0NNRFNfSU5JVCB7CQkJXAorCVtFTFNfTFNfUkpUXSA9CSJMU19SSlQiLAkJXAorCVtFTFNfTFNfQUNDXSA9CSJMU19BQ0MiLAkJXAorCVtFTFNfUExPR0ldID0JIlBMT0dJIiwJCVwKKwlbRUxTX0ZMT0dJXSA9CSJGTE9HSSIsCQlcCisJW0VMU19MT0dPXSA9CSJMT0dPIiwJCQlcCisJW0VMU19BQlRYXSA9CSJBQlRYIiwJCQlcCisJW0VMU19SQ1NdID0JIlJDUyIsCQkJXAorCVtFTFNfUkVTXSA9CSJSRVMiLAkJCVwKKwlbRUxTX1JTU10gPQkiUlNTIiwJCQlcCisJW0VMU19SU0ldID0JIlJTSSIsCQkJXAorCVtFTFNfRVNUU10gPQkiRVNUUyIsCQkJXAorCVtFTFNfRVNUQ10gPQkiRVNUQyIsCQkJXAorCVtFTFNfQURWQ10gPQkiQURWQyIsCQkJXAorCVtFTFNfUlRWXSA9CSJSVFYiLAkJCVwKKwlbRUxTX1JMU10gPQkiUkxTIiwJCQlcCisJW0VMU19FQ0hPXSA9CSJFQ0hPIiwJCQlcCisJW0VMU19URVNUXSA9CSJURVNUIiwJCQlcCisJW0VMU19SUlFdID0JIlJSUSIsCQkJXAorCVtFTFNfUkVDXSA9CSJSRUMiLAkJCVwKKwlbRUxTX1NSUl0gPQkiU1JSIiwJCQlcCisJW0VMU19QUkxJXSA9CSJQUkxJIiwJCQlcCisJW0VMU19QUkxPXSA9CSJQUkxPIiwJCQlcCisJW0VMU19TQ05dID0JIlNDTiIsCQkJXAorCVtFTFNfVFBMU10gPQkiVFBMUyIsCQkJXAorCVtFTFNfVFBSTE9dID0JIlRQUkxPIiwJCVwKKwlbRUxTX0xDTE1dID0JIkxDTE0iLAkJCVwKKwlbRUxTX0dBSURdID0JIkdBSUQiLAkJCVwKKwlbRUxTX0ZBQ1RdID0JIkZBQ1QiLAkJCVwKKwlbRUxTX0ZEQUNEVF0gPQkiRkRBQ0RUIiwJCVwKKwlbRUxTX05BQ1RdID0JIk5BQ1QiLAkJCVwKKwlbRUxTX05EQUNUXSA9CSJOREFDVCIsCQlcCisJW0VMU19RT1NSXSA9CSJRT1NSIiwJCQlcCisJW0VMU19SVkNTXSA9CSJSVkNTIiwJCQlcCisJW0VMU19QRElTQ10gPQkiUERJU0MiLAkJXAorCVtFTFNfRkRJU0NdID0JIkZESVNDIiwJCVwKKwlbRUxTX0FESVNDXSA9CSJBRElTQyIsCQlcCisJW0VMU19STkNdID0JIlJOQyIsCQkJXAorCVtFTFNfRkFSUF9SRVFdID0gIkZBUlBfUkVRIiwJCVwKKwlbRUxTX0ZBUlBfUkVQTF0gPSAgIkZBUlBfUkVQTCIsCQlcCisJW0VMU19SUFNdID0JIlJQUyIsCQkJXAorCVtFTFNfUlBMXSA9CSJSUEwiLAkJCVwKKwlbRUxTX1JQQkNdID0JIlJQQkMiLAkJCVwKKwlbRUxTX0ZBTl0gPQkiRkFOIiwJCQlcCisJW0VMU19SU0NOXSA9CSJSU0NOIiwJCQlcCisJW0VMU19TQ1JdID0JIlNDUiIsCQkJXAorCVtFTFNfUk5GVF0gPQkiUk5GVCIsCQkJXAorCVtFTFNfQ1NSXSA9CSJDU1IiLAkJCVwKKwlbRUxTX0NTVV0gPQkiQ1NVIiwJCQlcCisJW0VMU19MSU5JVF0gPQkiTElOSVQiLAkJXAorCVtFTFNfTFNUU10gPQkiTFNUUyIsCQkJXAorCVtFTFNfUk5JRF0gPQkiUk5JRCIsCQkJXAorCVtFTFNfUkxJUl0gPQkiUkxJUiIsCQkJXAorCVtFTFNfTElSUl0gPQkiTElSUiIsCQkJXAorCVtFTFNfU1JMXSA9CSJTUkwiLAkJCVwKKwlbRUxTX1NCUlBdID0JIlNCUlAiLAkJCVwKKwlbRUxTX1JQU0NdID0JIlJQU0MiLAkJCVwKKwlbRUxTX1FTQV0gPQkiUVNBIiwJCQlcCisJW0VMU19FVkZQXSA9CSJFVkZQIiwJCQlcCisJW0VMU19MS0FdID0JIkxLQSIsCQkJXAorCVtFTFNfQVVUSF9FTFNdID0gIkFVVEhfRUxTIiwJCVwKK30KKworLyoKKyAqIExTX0FDQyBwYXlsb2FkLgorICovCitzdHJ1Y3QgZmNfZWxzX2xzX2FjYyB7CisJX191OCAgICAgICAgICBsYV9jbWQ7CQkvKiBjb21tYW5kIGNvZGUgRUxTX0xTX0FDQyAqLworCV9fdTggICAgICAgICAgbGFfcmVzdlszXTsJLyogcmVzZXJ2ZWQgKi8KK307CisKKy8qCisgKiBFTFMgcmVqZWN0IHBheWxvYWQuCisgKi8KK3N0cnVjdCBmY19lbHNfbHNfcmp0IHsKKwlfX3U4CWVyX2NtZDsJCS8qIGNvbW1hbmQgY29kZSBFTFNfTFNfUkpUICovCisJX191OAllcl9yZXN2WzRdOwkvKiByZXNlcnZlZCBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CWVyX3JlYXNvbjsJLyogcmVhc29uIChlbnVtIGZjX2Vsc19yanRfcmVhc29uIGJlbG93KSAqLworCV9fdTgJZXJfZXhwbGFuOwkvKiBleHBsYW5hdGlvbiAoZW51bSBmY19lbHNfcmp0X2V4cGxhbiBiZWxvdykgKi8KKwlfX3U4CWVyX3ZlbmRvcjsJLyogdmVuZG9yIHNwZWNpZmljIGNvZGUgKi8KK307CisKKy8qCisgKiBFTFMgcmVqZWN0IHJlYXNvbiBjb2RlcyAoZXJfcmVhc29uKS4KKyAqLworZW51bSBmY19lbHNfcmp0X3JlYXNvbiB7CisJRUxTX1JKVF9OT05FID0JCTAsCS8qIG5vIHJlamVjdCAtIG5vdCB0byBiZSBzZW50ICovCisJRUxTX1JKVF9JTlZBTCA9CQkweDAxLAkvKiBpbnZhbGlkIEVMUyBjb21tYW5kIGNvZGUgKi8KKwlFTFNfUkpUX0xPR0lDID0JCTB4MDMsCS8qIGxvZ2ljYWwgZXJyb3IgKi8KKwlFTFNfUkpUX0JVU1kgPQkJMHgwNSwJLyogbG9naWNhbCBidXN5ICovCisJRUxTX1JKVF9QUk9UID0JCTB4MDcsCS8qIHByb3RvY29sIGVycm9yICovCisJRUxTX1JKVF9VTkFCID0JCTB4MDksCS8qIHVuYWJsZSB0byBwZXJmb3JtIGNvbW1hbmQgcmVxdWVzdCAqLworCUVMU19SSlRfVU5TVVAgPQkJMHgwYiwJLyogY29tbWFuZCBub3Qgc3VwcG9ydGVkICovCisJRUxTX1JKVF9JTlBST0cgPQkweDBlLAkvKiBjb21tYW5kIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKwlFTFNfUkpUX1ZFTkRPUiA9CTB4ZmYsCS8qIHZlbmRvciBzcGVjaWZpYyBlcnJvciAqLworfTsKKworCisvKgorICogcmVhc29uIGNvZGUgZXhwbGFuYXRpb24gKGVyX2V4cGxhbikuCisgKi8KK2VudW0gZmNfZWxzX3JqdF9leHBsYW4geworCUVMU19FWFBMX05PTkUgPQkJMHgwMCwJLyogTm8gYWRkaXRpb25hbCBleHBsYW5hdGlvbiAqLworCUVMU19FWFBMX1NQUF9PUFRfRVJSID0JMHgwMSwJLyogc2VydmljZSBwYXJhbWV0ZXIgZXJyb3IgLSBvcHRpb25zICovCisJRUxTX0VYUExfU1BQX0lDVExfRVJSID0JMHgwMywJLyogc2VydmljZSBwYXJtIGVycm9yIC0gaW5pdGlhdG9yIGN0bCAqLworCUVMU19FWFBMX0FIID0JCTB4MTEsCS8qIGludmFsaWQgYXNzb2NpYXRpb24gaGVhZGVyICovCisJRUxTX0VYUExfQUhfUkVRID0JMHgxMywJLyogYXNzb2NpYXRpb25faGVhZGVyIHJlcXVpcmVkICovCisJRUxTX0VYUExfU0lEID0JCTB4MTUsCS8qIGludmFsaWQgb3JpZ2luYXRvciBTX0lEICovCisJRUxTX0VYUExfT1hJRF9SWElEID0JMHgxNywJLyogaW52YWxpZCBPWF9JRC1SWF9JRCBjb21iaW5hdGlvbiAqLworCUVMU19FWFBMX0lOUFJPRyA9CTB4MTksCS8qIFJlcXVlc3QgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworCUVMU19FWFBMX1BMT0dJX1JFUUQgPQkweDFlLAkvKiBOX1BvcnQgbG9naW4gcmVxdWlyZWQgKi8KKwlFTFNfRVhQTF9JTlNVRl9SRVMgPQkweDI5LAkvKiBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzICovCisJRUxTX0VYUExfVU5BQl9EQVRBID0JMHgyYSwJLyogdW5hYmxlIHRvIHN1cHBseSByZXF1ZXN0ZWQgZGF0YSAqLworCUVMU19FWFBMX1VOU1VQUiA9CTB4MmMsCS8qIFJlcXVlc3Qgbm90IHN1cHBvcnRlZCAqLworCUVMU19FWFBMX0lOVl9MRU4gPQkweDJkLAkvKiBJbnZhbGlkIHBheWxvYWQgbGVuZ3RoICovCisJLyogVEJEIC0gYWJvdmUgZGVmaW5pdGlvbnMgaW5jb21wbGV0ZSAqLworfTsKKworLyoKKyAqIENvbW1vbiBzZXJ2aWNlIHBhcmFtZXRlcnMgKE4gcG9ydHMpLgorICovCitzdHJ1Y3QgZmNfZWxzX2NzcCB7CisJX191OAkJc3BfaGlfdmVyOwkvKiBoaWdoZXN0IHZlcnNpb24gc3VwcG9ydGVkIChvYnMuKSAqLworCV9fdTgJCXNwX2xvX3ZlcjsJLyogaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCAob2JzLikgKi8KKwlfX2JlMTYJCXNwX2JiX2NyZWQ7CS8qIGJ1ZmZlci10by1idWZmZXIgY3JlZGl0cyAqLworCV9fYmUxNgkJc3BfZmVhdHVyZXM7CS8qIGNvbW1vbiBmZWF0dXJlIGZsYWdzICovCisJX19iZTE2CQlzcF9iYl9kYXRhOwkvKiBiLWIgc3RhdGUgbnVtYmVyIGFuZCBkYXRhIGZpZWxkIHN6ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19iZTE2CV9zcF90b3Rfc2VxOyAvKiB0b3RhbCBjb25jdXJyZW50IHNlcXVlbmNlcyAqLworCQkJX19iZTE2CV9zcF9yZWxfb2ZmOyAvKiByZWwuIG9mZnNldCBieSBpbmZvIGNhdCAqLworCQl9IHNwX3Bsb2dpOworCQlzdHJ1Y3QgeworCQkJX19iZTMyCV9zcF9yX2FfdG92OyAvKiByZXNvdXJjZSBhbGxvYy4gdGltZW91dCBtc2VjICovCisJCX0gc3BfZmxvZ2lfYWNjOworCX0gc3BfdTsKKwlfX2JlMzIJCXNwX2VfZF90b3Y7CS8qIGVycm9yIGRldGVjdCB0aW1lb3V0IHZhbHVlICovCit9OworI2RlZmluZQlzcF90b3Rfc2VxCXNwX3Uuc3BfcGxvZ2kuX3NwX3RvdF9zZXEKKyNkZWZpbmUJc3BfcmVsX29mZglzcF91LnNwX3Bsb2dpLl9zcF9yZWxfb2ZmCisjZGVmaW5lCXNwX3JfYV90b3YJc3BfdS5zcF9mbG9naV9hY2MuX3NwX3JfYV90b3YKKworI2RlZmluZQlGQ19TUF9CQl9EQVRBX01BU0sgMHhmZmYgLyogbWFzayBmb3IgZGF0YSBmaWVsZCBzaXplIGluIHNwX2JiX2RhdGEgKi8KKworLyoKKyAqIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGZvciBtYXggZGF0YSBmaWVsZCBzaXplIGluIHNlcnZpY2UgcGFyYW1ldGVycy4KKyAqLworI2RlZmluZQlGQ19TUF9NSU5fTUFYX1BBWUxPQUQJRkNfTUlOX01BWF9QQVlMT0FECisjZGVmaW5lCUZDX1NQX01BWF9NQVhfUEFZTE9BRAlGQ19NQVhfUEFZTE9BRAorCisvKgorICogc3BfZmVhdHVyZXMKKyAqLworI2RlZmluZQlGQ19TUF9GVF9DSVJPCTB4ODAwMAkvKiBjb250aW51b3VzbHkgaW5jcmVhc2luZyByZWwuIG9mZi4gKi8KKyNkZWZpbmUJRkNfU1BfRlRfQ0xBRAkweDgwMDAJLyogY2xlYW4gYWRkcmVzcyAoaW4gRkxPR0kgTFNfQUNDKSAqLworI2RlZmluZQlGQ19TUF9GVF9SQU5ECTB4NDAwMAkvKiByYW5kb20gcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lCUZDX1NQX0ZUX1ZBTAkweDIwMDAJLyogdmFsaWQgdmVuZG9yIHZlcnNpb24gbGV2ZWwgKi8KKyNkZWZpbmUJRkNfU1BfRlRfRlBPUlQJMHgxMDAwCS8qIEYgcG9ydCAoMSkgdnMuIE4gcG9ydCAoMCkgKi8KKyNkZWZpbmUJRkNfU1BfRlRfQUJCCTB4MDgwMAkvKiBhbHRlcm5hdGUgQkJfY3JlZGl0IG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUJRkNfU1BfRlRfRURUUgkweDA0MDAJLyogRV9EX1RPViBSZXNvbHV0aW9uIGlzIG5hbm9zZWNvbmRzICovCisjZGVmaW5lCUZDX1NQX0ZUX01DQVNUCTB4MDIwMAkvKiBtdWx0aWNhc3QgKi8KKyNkZWZpbmUJRkNfU1BfRlRfQkNBU1QJMHgwMTAwCS8qIGJyb2FkY2FzdCAqLworI2RlZmluZQlGQ19TUF9GVF9IVU5UCTB4MDA4MAkvKiBodW50IGdyb3VwICovCisjZGVmaW5lCUZDX1NQX0ZUX1NJTVAJMHgwMDQwCS8qIGRlZGljYXRlZCBzaW1wbGV4ICovCisjZGVmaW5lCUZDX1NQX0ZUX1NFQwkweDAwMjAJLyogcmVzZXJ2ZWQgZm9yIHNlY3VyaXR5ICovCisjZGVmaW5lCUZDX1NQX0ZUX0NTWU4JMHgwMDEwCS8qIGNsb2NrIHN5bmNoLiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRkNfU1BfRlRfUlRUT1YJMHgwMDA4CS8qIFJfVF9UT1YgdmFsdWUgMTAwIHVTLCBlbHNlIDEwMCBtUyAqLworI2RlZmluZQlGQ19TUF9GVF9IQUxGCTB4MDAwNAkvKiBkeW5hbWljIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lCUZDX1NQX0ZUX1NFUUMJMHgwMDAyCS8qIFNFUV9DTlQgKi8KKyNkZWZpbmUJRkNfU1BfRlRfUEFZTAkweDAwMDEJLyogRkxPR0kgcGF5bG9hZCBsZW5ndGggMjU2LCBlbHNlIDExNiAqLworCisvKgorICogQ2xhc3Mtc3BlY2lmaWMgc2VydmljZSBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgZmNfZWxzX2Nzc3AgeworCV9fYmUxNgkJY3BfY2xhc3M7CS8qIGNsYXNzIGZsYWdzICovCisJX19iZTE2CQljcF9pbml0OwkvKiBpbml0aWF0b3IgZmxhZ3MgKi8KKwlfX2JlMTYJCWNwX3JlY2lwOwkvKiByZWNpcGllbnQgZmxhZ3MgKi8KKwlfX2JlMTYJCWNwX3JkZnM7CS8qIHJlY2VpdmUgZGF0YSBmaWVsZCBzaXplICovCisJX19iZTE2CQljcF9jb25fc2VxOwkvKiBjb25jdXJyZW50IHNlcXVlbmNlcyAqLworCV9fYmUxNgkJY3BfZWVfY3JlZDsJLyogTi1wb3J0IGVuZC10by1lbmQgY3JlZGl0ICovCisJX191OAkJY3BfcmVzdjE7CS8qIHJlc2VydmVkICovCisJX191OAkJY3Bfb3Blbl9zZXE7CS8qIG9wZW4gc2VxdWVuY2VzIHBlciBleGNoYW5nZSAqLworCV9fdTgJCV9jcF9yZXN2MlsyXTsJLyogcmVzZXJ2ZWQgKi8KK307CisKKy8qCisgKiBjcF9jbGFzcyBmbGFncy4KKyAqLworI2RlZmluZQlGQ19DUENfVkFMSUQJMHg4MDAwCQkvKiBjbGFzcyB2YWxpZCAqLworI2RlZmluZQlGQ19DUENfSU1JWAkweDQwMDAJCS8qIGludGVybWl4IG1vZGUgKi8KKyNkZWZpbmUJRkNfQ1BDX1NFUQkweDA4MDAJCS8qIHNlcXVlbnRpYWwgZGVsaXZlcnkgKi8KKyNkZWZpbmUJRkNfQ1BDX0NBTVAJMHgwMjAwCQkvKiBjYW1wLW9uICovCisjZGVmaW5lCUZDX0NQQ19QUkkJMHgwMDgwCQkvKiBwcmlvcml0eSAqLworCisvKgorICogY3BfaW5pdCBmbGFncy4KKyAqIChUQkQ6IG5vdCBhbGwgZmxhZ3MgZGVmaW5lZCBoZXJlKS4KKyAqLworI2RlZmluZQlGQ19DUElfQ1NZTgkweDAwMTAJCS8qIGNsb2NrIHN5bmNoLiBjYXBhYmxlICovCisKKy8qCisgKiBjcF9yZWNpcCBmbGFncy4KKyAqLworI2RlZmluZQlGQ19DUFJfQ1NZTgkweDAwMDgJCS8qIGNsb2NrIHN5bmNoLiBjYXBhYmxlICovCisKKy8qCisgKiBORkNfRUxTX0ZMT0dJOiBGYWJyaWMgbG9naW4gcmVxdWVzdC4KKyAqIE5GQ19FTFNfUExPR0k6IFBvcnQgbG9naW4gcmVxdWVzdCAoc2FtZSBmb3JtYXQpLgorICovCitzdHJ1Y3QgZmNfZWxzX2Zsb2dpIHsKKwlfX3U4CQlmbF9jbWQ7CQkvKiBjb21tYW5kICovCisJX191OAkJX2ZsX3Jlc3ZkWzNdOwkvKiBtdXN0IGJlIHplcm8gKi8KKwlzdHJ1Y3QgZmNfZWxzX2NzcCBmbF9jc3A7CS8qIGNvbW1vbiBzZXJ2aWNlIHBhcmFtZXRlcnMgKi8KKwlfX2JlNjQJCWZsX3d3cG47CS8qIHBvcnQgbmFtZSAqLworCV9fYmU2NAkJZmxfd3dubjsJLyogbm9kZSBuYW1lICovCisJc3RydWN0IGZjX2Vsc19jc3NwIGZsX2Nzc3BbNF07CS8qIGNsYXNzIDEtNCBzZXJ2aWNlIHBhcmFtZXRlcnMgKi8KKwlfX3U4CQlmbF92ZW5kWzE2XTsJLyogdmVuZG9yIHZlcnNpb24gbGV2ZWwgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogUHJvY2VzcyBsb2dpbiBzZXJ2aWNlIHBhcmFtZXRlciBwYWdlLgorICovCitzdHJ1Y3QgZmNfZWxzX3NwcCB7CisJX191OAkJc3BwX3R5cGU7CS8qIHR5cGUgY29kZSBvciBjb21tb24gc2VydmljZSBwYXJhbXMgKi8KKwlfX3U4CQlzcHBfdHlwZV9leHQ7CS8qIHR5cGUgY29kZSBleHRlbnNpb24gKi8KKwlfX3U4CQlzcHBfZmxhZ3M7CisJX191OAkJX3NwcF9yZXN2ZDsKKwlfX2JlMzIJCXNwcF9vcmlnX3BhOwkvKiBvcmlnaW5hdG9yIHByb2Nlc3MgYXNzb2NpYXRvciAqLworCV9fYmUzMgkJc3BwX3Jlc3BfcGE7CS8qIHJlc3BvbmRlciBwcm9jZXNzIGFzc29jaWF0b3IgKi8KKwlfX2JlMzIJCXNwcF9wYXJhbXM7CS8qIHNlcnZpY2UgcGFyYW1ldGVycyAqLworfTsKKworLyoKKyAqIHNwcF9mbGFncy4KKyAqLworI2RlZmluZQlGQ19TUFBfT1BBX1ZBTAkgICAgMHg4MAkvKiBvcmlnaW5hdG9yIHByb2MuIGFzc29jLiB2YWxpZCAqLworI2RlZmluZQlGQ19TUFBfUlBBX1ZBTAkgICAgMHg0MAkvKiByZXNwb25kZXIgcHJvYy4gYXNzb2MuIHZhbGlkICovCisjZGVmaW5lCUZDX1NQUF9FU1RfSU1HX1BBSVIgMHgyMAkvKiBlc3RhYmxpc2ggaW1hZ2UgcGFpciAqLworI2RlZmluZQlGQ19TUFBfUkVTUF9NQVNLICAgIDB4MGYJLyogbWFzayBmb3IgcmVzcG9uc2UgY29kZSAoYmVsb3cpICovCisKKy8qCisgKiBTUFAgcmVzcG9uc2UgY29kZSBpbiBzcHBfZmxhZ3MgLSBsb3dlciA0IGJpdHMuCisgKi8KK2VudW0gZmNfZWxzX3NwcF9yZXNwIHsKKwlGQ19TUFBfUkVTUF9BQ0sJPQkxLAkvKiByZXF1ZXN0IGV4ZWN1dGVkICovCisJRkNfU1BQX1JFU1BfUkVTID0JMiwJLyogdW5hYmxlIGR1ZSB0byBsYWNrIG9mIHJlc291cmNlcyAqLworCUZDX1NQUF9SRVNQX0lOSVQgPQkzLAkvKiBpbml0aWFsaXphdGlvbiBub3QgY29tcGxldGUgKi8KKwlGQ19TUFBfUkVTUF9OT19QQSA9IAk0LAkvKiB1bmtub3duIHByb2Nlc3MgYXNzb2NpYXRvciAqLworCUZDX1NQUF9SRVNQX0NPTkYgPSAJNSwJLyogY29uZmlndXJhdGlvbiBwcmVjbHVkZXMgaW1hZ2UgcGFpciAqLworCUZDX1NQUF9SRVNQX0NPTkQgPSAJNiwJLyogcmVxdWVzdCBjb21wbGV0ZWQgY29uZGl0aW9uYWxseSAqLworCUZDX1NQUF9SRVNQX01VTFQgPSAJNywJLyogdW5hYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBTUFBzICovCisJRkNfU1BQX1JFU1BfSU5WTCA9IAk4LAkvKiBTUFAgaXMgaW52YWxpZCAqLworfTsKKworLyoKKyAqIEVMU19SUlEgLSBSZWluc3RhdGUgUmVjb3ZlcnkgUXVhbGlmaWVyCisgKi8KK3N0cnVjdCBmY19lbHNfcnJxIHsKKwlfX3U4CQlycnFfY21kOwkvKiBjb21tYW5kICgweDEyKSAqLworCV9fdTgJCXJycV96ZXJvWzNdOwkvKiBzcGVjaWZpZWQgYXMgemVybyAtIHBhcnQgb2YgY21kICovCisJX191OAkJcnJxX3Jlc3ZkOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCXJycV9zX2lkWzNdOwkvKiBvcmlnaW5hdG9yIEZJRCAqLworCV9fYmUxNgkJcnJxX294X2lkOwkvKiBvcmlnaW5hdG9yIGV4Y2hhbmdlIElEICovCisJX19iZTE2CQlycnFfcnhfaWQ7CS8qIHJlc3BvbmRlcnMgZXhjaGFuZ2UgSUQgKi8KK307CisKKy8qCisgKiBFTFNfUkVDIC0gUmVhZCBleGNoYW5nZSBjb25jaXNlLgorICovCitzdHJ1Y3QgZmNfZWxzX3JlYyB7CisJX191OAkJcmVjX2NtZDsJLyogY29tbWFuZCAoMHgxMykgKi8KKwlfX3U4CQlyZWNfemVyb1szXTsJLyogc3BlY2lmaWVkIGFzIHplcm8gLSBwYXJ0IG9mIGNtZCAqLworCV9fdTgJCXJlY19yZXN2ZDsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlyZWNfc19pZFszXTsJLyogb3JpZ2luYXRvciBGSUQgKi8KKwlfX2JlMTYJCXJlY19veF9pZDsJLyogb3JpZ2luYXRvciBleGNoYW5nZSBJRCAqLworCV9fYmUxNgkJcmVjX3J4X2lkOwkvKiByZXNwb25kZXJzIGV4Y2hhbmdlIElEICovCit9OworCisvKgorICogRUxTX1JFQyBMU19BQ0MgcGF5bG9hZC4KKyAqLworc3RydWN0IGZjX2Vsc19yZWNfYWNjIHsKKwlfX3U4CQlyZWNhX2NtZDsJLyogYWNjZXB0ICgweDAyKSAqLworCV9fdTgJCXJlY2FfemVyb1szXTsJLyogc3BlY2lmaWVkIGFzIHplcm8gLSBwYXJ0IG9mIGNtZCAqLworCV9fYmUxNgkJcmVjYV9veF9pZDsJLyogb3JpZ2luYXRvciBleGNoYW5nZSBJRCAqLworCV9fYmUxNgkJcmVjYV9yeF9pZDsJLyogcmVzcG9uZGVycyBleGNoYW5nZSBJRCAqLworCV9fdTgJCXJlY2FfcmVzdmQxOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCXJlY2Ffb2ZpZFszXTsJLyogb3JpZ2luYXRvciBGSUQgKi8KKwlfX3U4CQlyZWNhX3Jlc3ZkMjsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlyZWNhX3JmaWRbM107CS8qIHJlc3BvbmRlciBGSUQgKi8KKwlfX2JlMzIJCXJlY2FfZmM0dmFsdWU7CS8qIEZDNCB2YWx1ZSAqLworCV9fYmUzMgkJcmVjYV9lX3N0YXQ7CS8qIEVTQiAoZXhjaGFuZ2Ugc3RhdHVzIGJsb2NrKSBzdGF0dXMgKi8KK307CisKKy8qCisgKiBFTFNfUFJMSSAtIFByb2Nlc3MgbG9naW4gcmVxdWVzdCBhbmQgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBmY19lbHNfcHJsaSB7CisJX191OAkJcHJsaV9jbWQ7CS8qIGNvbW1hbmQgKi8KKwlfX3U4CQlwcmxpX3NwcF9sZW47CS8qIGxlbmd0aCBvZiBlYWNoIHNlcnYuIHBhcm0uIHBhZ2UgKi8KKwlfX2JlMTYJCXBybGlfbGVuOwkvKiBsZW5ndGggb2YgZW50aXJlIHBheWxvYWQgKi8KKwkvKiBzZXJ2aWNlIHBhcmFtZXRlciBwYWdlcyBmb2xsb3cgKi8KK307CisKKy8qCisgKiBFTFNfQURJU0MgcGF5bG9hZAorICovCitzdHJ1Y3QgZmNfZWxzX2FkaXNjIHsKKwlfX3U4CQlhZGlzY19jbWQ7CisJX191OAkJYWRpc2NfcmVzdlszXTsKKwlfX3U4ICAgICAgICAgICAgYWRpc2NfcmVzdjE7CisJX191OCAgICAgICAgICAgIGFkaXNjX2hhcmRfYWRkclszXTsKKwlfX2JlNjQgICAgICAgICAgYWRpc2Nfd3dwbjsKKwlfX2JlNjQgICAgICAgICAgYWRpc2Nfd3dubjsKKwlfX3U4ICAgICAgICAgICAgYWRpc2NfcmVzdjI7CisJX191OCAgICAgICAgICAgIGFkaXNjX3BvcnRfaWRbM107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyoKKyAqIEVMU19MT0dPIC0gcHJvY2VzcyBvciBmYWJyaWMgbG9nb3V0LgorICovCitzdHJ1Y3QgZmNfZWxzX2xvZ28geworCV9fdTgJCWZsX2NtZDsJCS8qIGNvbW1hbmQgY29kZSAqLworCV9fdTgJCWZsX3plcm9bM107CS8qIHNwZWNpZmllZCBhcyB6ZXJvIC0gcGFydCBvZiBjbWQgKi8KKwlfX3U4CQlmbF9yZXN2ZDsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlmbF9uX3BvcnRfaWRbM107LyogTiBwb3J0IElEICovCisJX19iZTY0CQlmbF9uX3BvcnRfd3duOwkvKiBwb3J0IG5hbWUgKi8KK307CisKKy8qCisgKiBFTFNfUlRWIC0gcmVhZCB0aW1lb3V0IHZhbHVlLgorICovCitzdHJ1Y3QgZmNfZWxzX3J0diB7CisJX191OAkJcnR2X2NtZDsJLyogY29tbWFuZCBjb2RlIDB4MGUgKi8KKwlfX3U4CQlydHZfemVyb1szXTsJLyogc3BlY2lmaWVkIGFzIHplcm8gLSBwYXJ0IG9mIGNtZCAqLworfTsKKworLyoKKyAqIExTX0FDQyBmb3IgRUxTX1JUViAtIHJlYWQgdGltZW91dCB2YWx1ZS4KKyAqLworc3RydWN0IGZjX2Vsc19ydHZfYWNjIHsKKwlfX3U4CQlydHZfY21kOwkvKiBjb21tYW5kIGNvZGUgMHgwMiAqLworCV9fdTgJCXJ0dl96ZXJvWzNdOwkvKiBzcGVjaWZpZWQgYXMgemVybyAtIHBhcnQgb2YgY21kICovCisJX19iZTMyCQlydHZfcl9hX3RvdjsJLyogcmVzb3VyY2UgYWxsb2NhdGlvbiB0aW1lb3V0IHZhbHVlICovCisJX19iZTMyCQlydHZfZV9kX3RvdjsJLyogZXJyb3IgZGV0ZWN0aW9uIHRpbWVvdXQgdmFsdWUgKi8KKwlfX2JlMzIJCXJ0dl90b3E7CS8qIHRpbWVvdXQgcXVhbGlmaWVyIChzZWUgYmVsb3cpICovCit9OworCisvKgorICogcnR2X3RvcSBiaXRzLgorICovCisjZGVmaW5lCUZDX0VMU19SVFZfRURSRVMgKDEgPDwgMjYpCS8qIEVfRF9UT1YgcmVzb2x1dGlvbiBpcyBuUyBlbHNlIG1TICovCisjZGVmaW5lCUZDX0VMU19SVFZfUlRUT1YgKDEgPDwgMTkpCS8qIFJfVF9UT1YgaXMgMTAwIHVTIGVsc2UgMTAwIG1TICovCisKKy8qCisgKiBFTFNfU0NSIC0gc3RhdGUgY2hhbmdlIHJlZ2lzdHJhdGlvbiBwYXlsb2FkLgorICovCitzdHJ1Y3QgZmNfZWxzX3NjciB7CisJX191OAkJc2NyX2NtZDsJLyogY29tbWFuZCBjb2RlICovCisJX191OAkJc2NyX3Jlc3ZbNl07CS8qIHJlc2VydmVkICovCisJX191OAkJc2NyX3JlZ19mdW5jOwkvKiByZWdpc3RyYXRpb24gZnVuY3Rpb24gKHNlZSBiZWxvdykgKi8KK307CisKK2VudW0gZmNfZWxzX3Njcl9mdW5jIHsKKwlFTFNfU0NSRl9GQUIgPQkxLAkvKiBmYWJyaWMtZGV0ZWN0ZWQgcmVnaXN0cmF0aW9uICovCisJRUxTX1NDUkZfTlBPUlQgPSAyLAkvKiBOeF9Qb3J0LWRldGVjdGVkIHJlZ2lzdHJhdGlvbiAqLworCUVMU19TQ1JGX0ZVTEwgPQkzLAkvKiBmdWxsIHJlZ2lzdHJhdGlvbiAqLworCUVMU19TQ1JGX0NMRUFSID0gMjU1LAkvKiByZW1vdmUgYW55IGN1cnJlbnQgcmVnaXN0cmF0aW9ucyAqLworfTsKKworLyoKKyAqIEVMU19SU0NOIC0gcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHBheWxvYWQuCisgKi8KK3N0cnVjdCBmY19lbHNfcnNjbiB7CisJX191OAkJcnNjbl9jbWQ7CS8qIFJTQ04gb3Bjb2RlICgweDYxKSAqLworCV9fdTgJCXJzY25fcGFnZV9sZW47CS8qIHBhZ2UgbGVuZ3RoICg0KSAqLworCV9fYmUxNgkJcnNjbl9wbGVuOwkvKiBwYXlsb2FkIGxlbmd0aCBpbmNsdWRpbmcgdGhpcyB3b3JkICovCisKKwkvKiBmb2xsb3dlZCBieSA0LWJ5dGUgZ2VuZXJpYyBhZmZlY3RlZCBQb3J0X0lEIHBhZ2VzICovCit9OworCitzdHJ1Y3QgZmNfZWxzX3JzY25fcGFnZSB7CisJX191OAkJcnNjbl9wYWdlX2ZsYWdzOyAvKiBldmVudCBhbmQgYWRkcmVzcyBmb3JtYXQgKi8KKwlfX3U4CQlyc2NuX2ZpZFszXTsJLyogZmFicmljIElEICovCit9OworCisjZGVmaW5lCUVMU19SU0NOX0VWX1FVQUxfQklUCTIJLyogc2hpZnQgY291bnQgZm9yIGV2ZW50IHF1YWxpZmllciAqLworI2RlZmluZQlFTFNfUlNDTl9FVl9RVUFMX01BU0sJMHhmCS8qIG1hc2sgZm9yIGV2ZW50IHF1YWxpZmllciAqLworI2RlZmluZQlFTFNfUlNDTl9BRERSX0ZNVF9CSVQJMAkvKiBzaGlmdCBjb3VudCBmb3IgYWRkcmVzcyBmb3JtYXQgKi8KKyNkZWZpbmUJRUxTX1JTQ05fQUREUl9GTVRfTUFTSwkweDMJLyogbWFzayBmb3IgYWRkcmVzcyBmb3JtYXQgKi8KKworZW51bSBmY19lbHNfcnNjbl9ldl9xdWFsIHsKKwlFTFNfRVZfUVVBTF9OT05FID0gMCwJCS8qIHVuc3BlY2lmaWVkICovCisJRUxTX0VWX1FVQUxfTlNfT0JKID0gMSwJCS8qIGNoYW5nZWQgbmFtZSBzZXJ2ZXIgb2JqZWN0ICovCisJRUxTX0VWX1FVQUxfUE9SVF9BVFRSID0gMiwJLyogY2hhbmdlZCBwb3J0IGF0dHJpYnV0ZSAqLworCUVMU19FVl9RVUFMX1NFUlZfT0JKID0gMywJLyogY2hhbmdlZCBzZXJ2aWNlIG9iamVjdCAqLworCUVMU19FVl9RVUFMX1NXX0NPTkZJRyA9IDQsCS8qIGNoYW5nZWQgc3dpdGNoIGNvbmZpZ3VyYXRpb24gKi8KKwlFTFNfRVZfUVVBTF9SRU1fT0JKID0gNSwJLyogcmVtb3ZlZCBvYmplY3QgKi8KK307CisKK2VudW0gZmNfZWxzX3JzY25fYWRkcl9mbXQgeworCUVMU19BRERSX0ZNVF9QT1JUID0gMCwJLyogcnNjbl9maWQgaXMgYSBwb3J0IGFkZHJlc3MgKi8KKwlFTFNfQUREUl9GTVRfQVJFQSA9IDEsCS8qIHJzY25fZmlkIGlzIGEgYXJlYSBhZGRyZXNzICovCisJRUxTX0FERFJfRk1UX0RPTSA9IDIsCS8qIHJzY25fZmlkIGlzIGEgZG9tYWluIGFkZHJlc3MgKi8KKwlFTFNfQUREUl9GTVRfRkFCID0gMywJLyogYW55dGhpbmcgb24gZmFicmljIG1heSBoYXZlIGNoYW5nZWQgKi8KK307CisKKy8qCisgKiBFTFNfUk5JRCAtIHJlcXVlc3QgTm9kZSBJRC4KKyAqLworc3RydWN0IGZjX2Vsc19ybmlkIHsKKwlfX3U4CQlybmlkX2NtZDsJLyogUk5JRCBvcGNvZGUgKDB4NzgpICovCisJX191OAkJcm5pZF9yZXN2WzNdOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCXJuaWRfZm10OwkvKiBkYXRhIGZvcm1hdCAqLworCV9fdTgJCXJuaWRfcmVzdjJbM107CS8qIHJlc2VydmVkICovCit9OworCisvKgorICogTm9kZSBJZGVudGlmaWNhdGlvbiBEYXRhIGZvcm1hdHMgKHJuaWRfZm10KQorICovCitlbnVtIGZjX2Vsc19ybmlkX2ZtdCB7CisJRUxTX1JOSURGX05PTkUgPSAwLAkJLyogbm8gc3BlY2lmaWMgaWRlbnRpZmljYXRpb24gZGF0YSAqLworCUVMU19STklERl9HRU4gPSAweGRmLAkJLyogZ2VuZXJhbCB0b3BvbG9neSBkaXNjb3ZlcnkgZm9ybWF0ICovCit9OworCisvKgorICogRUxTX1JOSUQgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBmY19lbHNfcm5pZF9yZXNwIHsKKwlfX3U4CQlybmlkX2NtZDsJLyogcmVzcG9uc2UgY29kZSAoTFNfQUNDKSAqLworCV9fdTgJCXJuaWRfcmVzdlszXTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlybmlkX2ZtdDsJLyogZGF0YSBmb3JtYXQgKi8KKwlfX3U4CQlybmlkX2NpZF9sZW47CS8qIGNvbW1vbiBJRCBkYXRhIGxlbmd0aCAqLworCV9fdTgJCXJuaWRfcmVzdjI7CS8qIHJlc2VydmVkICovCisJX191OAkJcm5pZF9zaWRfbGVuOwkvKiBzcGVjaWZpYyBJRCBkYXRhIGxlbmd0aCAqLworfTsKKworc3RydWN0IGZjX2Vsc19ybmlkX2NpZCB7CisJX19iZTY0CQlybmlkX3d3cG47CS8qIE4gcG9ydCBuYW1lICovCisJX19iZTY0CQlybmlkX3d3bm47CS8qIG5vZGUgbmFtZSAqLworfTsKKworc3RydWN0IGZjX2Vsc19ybmlkX2dlbiB7CisJX191OAkJcm5pZF92ZW5kX2lkWzE2XTsgLyogdmVuZG9yLXVuaXF1ZSBJRCAqLworCV9fYmUzMgkJcm5pZF9hdHlwZTsJLyogYXNzb2NpYXRlZCB0eXBlIChzZWUgYmVsb3cpICovCisJX19iZTMyCQlybmlkX3BoeXNfcG9ydDsJLyogcGh5c2ljYWwgcG9ydCBudW1iZXIgKi8KKwlfX2JlMzIJCXJuaWRfYXR0X25vZGVzOwkvKiBudW1iZXIgb2YgYXR0YWNoZWQgbm9kZXMgKi8KKwlfX3U4CQlybmlkX25vZGVfbWdtdDsJLyogbm9kZSBtYW5hZ2VtZW50IChzZWUgYmVsb3cpICovCisJX191OAkJcm5pZF9pcF92ZXI7CS8qIElQIHZlcnNpb24gKHNlZSBiZWxvdykgKi8KKwlfX2JlMTYJCXJuaWRfcHJvdF9wb3J0OwkvKiBVRFAgLyBUQ1AgcG9ydCBudW1iZXIgKi8KKwlfX2JlMzIJCXJuaWRfaXBfYWRkcls0XTsgLyogSVAgYWRkcmVzcyAqLworCV9fdTgJCXJuaWRfcmVzdmRbMl07CS8qIHJlc2VydmVkICovCisJX19iZTE2CQlybmlkX3ZlbmRfc3BlYzsJLyogdmVuZG9yLXNwZWNpZmljIGZpZWxkICovCit9OworCitlbnVtIGZjX2Vsc19ybmlkX2F0eXBlIHsKKwlFTFNfUk5JREFfVU5LID0JCTB4MDEsCS8qIHVua25vd24gKi8KKwlFTFNfUk5JREFfT1RIRVIgPQkweDAyLAkvKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgKi8KKwlFTFNfUk5JREFfSFVCID0JCTB4MDMsCisJRUxTX1JOSURBX1NXSVRDSCA9CTB4MDQsCisJRUxTX1JOSURBX0dBVEVXQVkgPQkweDA1LAorCUVMU19STklEQV9DT05WID0JMHgwNiwgICAvKiBPYnNvbGV0ZSwgZG8gbm90IHVzZSB0aGlzIHZhbHVlICovCisJRUxTX1JOSURBX0hCQSA9CSAgICAgICAgMHgwNywgICAvKiBPYnNvbGV0ZSwgZG8gbm90IHVzZSB0aGlzIHZhbHVlICovCisJRUxTX1JOSURBX1BST1hZID0gICAgICAgMHgwOCwgICAvKiBPYnNvbGV0ZSwgZG8gbm90IHVzZSB0aGlzIHZhbHVlICovCisJRUxTX1JOSURBX1NUT1JBR0UgPQkweDA5LAorCUVMU19STklEQV9IT1NUID0JMHgwYSwKKwlFTFNfUk5JREFfU1VCU1lTID0JMHgwYiwJLyogc3RvcmFnZSBzdWJzeXN0ZW0gKGUuZy4sIFJBSUQpICovCisJRUxTX1JOSURBX0FDQ0VTUyA9CTB4MGUsCS8qIGFjY2VzcyBkZXZpY2UgKGUuZy4gbWVkaWEgY2hhbmdlcikgKi8KKwlFTFNfUk5JREFfTkFTID0JCTB4MTEsCS8qIE5BUyBzZXJ2ZXIgKi8KKwlFTFNfUk5JREFfQlJJREdFID0JMHgxMiwJLyogYnJpZGdlICovCisJRUxTX1JOSURBX1ZJUlQgPQkweDEzLAkvKiB2aXJ0dWFsaXphdGlvbiBkZXZpY2UgKi8KKwlFTFNfUk5JREFfTUYgPQkJMHhmZiwJLyogbXVsdGlmdW5jdGlvbiBkZXZpY2UgKGJpdHMgYmVsb3cpICovCisJRUxTX1JOSURBX01GX0hVQiA9CTFVTCA8PCAzMSwgCS8qIGh1YiAqLworCUVMU19STklEQV9NRl9TVyA9CTFVTCA8PCAzMCwgCS8qIHN3aXRjaCAqLworCUVMU19STklEQV9NRl9HVyA9CTFVTCA8PCAyOSwJLyogZ2F0ZXdheSAqLworCUVMU19STklEQV9NRl9TVCA9CTFVTCA8PCAyOCwJLyogc3RvcmFnZSAqLworCUVMU19STklEQV9NRl9IT1NUID0JMVVMIDw8IDI3LAkvKiBob3N0ICovCisJRUxTX1JOSURBX01GX1NVQiA9CTFVTCA8PCAyNiwJLyogc3RvcmFnZSBzdWJzeXN0ZW0gKi8KKwlFTFNfUk5JREFfTUZfQUNDID0JMVVMIDw8IDI1LAkvKiBzdG9yYWdlIGFjY2VzcyBkZXYgKi8KKwlFTFNfUk5JREFfTUZfV0RNID0JMVVMIDw8IDI0LAkvKiB3YXZlbGVuZ3RoIGRpdmlzaW9uIG11eCAqLworCUVMU19STklEQV9NRl9OQVMgPQkxVUwgPDwgMjMsCS8qIE5BUyBzZXJ2ZXIgKi8KKwlFTFNfUk5JREFfTUZfQlIgPQkxVUwgPDwgMjIsCS8qIGJyaWRnZSAqLworCUVMU19STklEQV9NRl9WSVJUID0JMVVMIDw8IDIxLAkvKiB2aXJ0dWFsaXphdGlvbiBkZXZpY2UgKi8KK307CisKK2VudW0gZmNfZWxzX3JuaWRfbWdtdCB7CisJRUxTX1JOSURNX1NOTVAgPQkwLAorCUVMU19STklETV9URUxORVQgPQkxLAorCUVMU19STklETV9IVFRQID0JMiwKKwlFTFNfUk5JRE1fSFRUUFMgPQkzLAorCUVMU19STklETV9YTUwgPQkJNCwJLyogSFRUUCArIFhNTCAqLworfTsKKworZW51bSBmY19lbHNfcm5pZF9pcHZlciB7CisJRUxTX1JOSURJUF9OT05FID0JMCwJLyogbm8gSVAgc3VwcG9ydCBvciBub2RlIG1nbXQuICovCisJRUxTX1JOSURJUF9WNCA9CQkxLAkvKiBJUHY0ICovCisJRUxTX1JOSURJUF9WNiA9CQkyLAkvKiBJUHY2ICovCit9OworCisvKgorICogRUxTIFJQTCAtIFJlYWQgUG9ydCBMaXN0LgorICovCitzdHJ1Y3QgZmNfZWxzX3JwbCB7CisJX191OAkJcnBsX2NtZDsJLyogY29tbWFuZCAqLworCV9fdTgJCXJwbF9yZXN2WzVdOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCV9fYmUxNgkJcnBsX21heF9zaXplOwkvKiBtYXhpbXVtIHJlc3BvbnNlIHNpemUgb3IgemVybyAqLworCV9fdTgJCXJwbF9yZXN2MTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlycGxfaW5kZXhbM107CS8qIHN0YXJ0aW5nIGluZGV4ICovCit9OworCisvKgorICogUG9ydCBudW1iZXIgYmxvY2sgaW4gUlBMIHJlc3BvbnNlLgorICovCitzdHJ1Y3QgZmNfZWxzX3BuYiB7CisJX19iZTMyCQlwbmJfcGh5c19wbjsJLyogcGh5c2ljYWwgcG9ydCBudW1iZXIgKi8KKwlfX3U4CQlwbmJfcmVzdjsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlwbmJfcG9ydF9pZFszXTsJLyogcG9ydCBJRCAqLworCV9fYmU2NAkJcG5iX3d3cG47CS8qIHBvcnQgbmFtZSAqLworfTsKKworLyoKKyAqIFJQTCBMU19BQ0MgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBmY19lbHNfcnBsX3Jlc3AgeworCV9fdTgJCXJwbF9jbWQ7CS8qIEVMU19MU19BQ0MgKi8KKwlfX3U4CQlycGxfcmVzdjE7CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJX19iZTE2CQlycGxfcGxlbjsJLyogcGF5bG9hZCBsZW5ndGggKi8KKwlfX3U4CQlycGxfcmVzdjI7CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJX191OAkJcnBsX2xsZW5bM107CS8qIGxpc3QgbGVuZ3RoICovCisJX191OAkJcnBsX3Jlc3YzOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCV9fdTgJCXJwbF9pbmRleFszXTsJLyogc3RhcnRpbmcgaW5kZXggKi8KKwlzdHJ1Y3QgZmNfZWxzX3BuYiBycGxfcG5iWzFdOwkvKiB2YXJpYWJsZSBudW1iZXIgb2YgUE5CcyAqLworfTsKKworLyoKKyAqIExpbmsgRXJyb3IgU3RhdHVzIEJsb2NrLgorICovCitzdHJ1Y3QgZmNfZWxzX2xlc2IgeworCV9fYmUzMgkJbGVzYl9saW5rX2ZhaWw7CS8qIGxpbmsgZmFpbHVyZSBjb3VudCAqLworCV9fYmUzMgkJbGVzYl9zeW5jX2xvc3M7CS8qIGxvc3Mgb2Ygc3luY2hyb25pemF0aW9uIGNvdW50ICovCisJX19iZTMyCQlsZXNiX3NpZ19sb3NzOwkvKiBsb3NzIG9mIHNpZ25hbCBjb3VudCAqLworCV9fYmUzMgkJbGVzYl9wcmltX2VycjsJLyogcHJpbWl0aXZlIHNlcXVlbmNlIGVycm9yIGNvdW50ICovCisJX19iZTMyCQlsZXNiX2ludl93b3JkOwkvKiBpbnZhbGlkIHRyYW5zbWlzc2lvbiB3b3JkIGNvdW50ICovCisJX19iZTMyCQlsZXNiX2ludl9jcmM7CS8qIGludmFsaWQgQ1JDIGNvdW50ICovCit9OworCisvKgorICogRUxTIFJQUyAtIFJlYWQgUG9ydCBTdGF0dXMgQmxvY2sgcmVxdWVzdC4KKyAqLworc3RydWN0IGZjX2Vsc19ycHMgeworCV9fdTgJCXJwc19jbWQ7CS8qIGNvbW1hbmQgKi8KKwlfX3U4CQlycHNfcmVzdlsyXTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlycHNfZmxhZzsJLyogZmxhZyAtIHNlZSBiZWxvdyAqLworCV9fYmU2NAkJcnBzX3BvcnRfc3BlYzsJLyogcG9ydCBzZWxlY3Rpb24gKi8KK307CisKK2VudW0gZmNfZWxzX3Jwc19mbGFnIHsKKwlGQ19FTFNfUlBTX0RJRCA9CTB4MDAsCS8qIHBvcnQgaWRlbnRpZmllZCBieSBEX0lEIG9mIHJlcS4gKi8KKwlGQ19FTFNfUlBTX1BQTiA9CTB4MDEsCS8qIHBvcnRfc3BlYyBpcyBwaHlzaWNhbCBwb3J0IG51bWJlciAqLworCUZDX0VMU19SUFNfV1dQTiA9CTB4MDIsCS8qIHBvcnRfc3BlYyBpcyBwb3J0IFdXTiAqLworfTsKKworLyoKKyAqIEVMUyBSUFMgTFNfQUNDIHJlc3BvbnNlLgorICovCitzdHJ1Y3QgZmNfZWxzX3Jwc19yZXNwIHsKKwlfX3U4CQlycHNfY21kOwkvKiBjb21tYW5kIC0gTFNfQUNDICovCisJX191OAkJcnBzX3Jlc3ZbMl07CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJX191OAkJcnBzX2ZsYWc7CS8qIGZsYWcgLSBzZWUgYmVsb3cgKi8KKwlfX3U4CQlycHNfcmVzdjJbMl07CS8qIHJlc2VydmVkICovCisJX19iZTE2CQlycHNfc3RhdHVzOwkvKiBwb3J0IHN0YXR1cyAtIHNlZSBiZWxvdyAqLworCXN0cnVjdCBmY19lbHNfbGVzYiBycHNfbGVzYjsJLyogbGluayBlcnJvciBzdGF0dXMgYmxvY2sgKi8KK307CisKK2VudW0gZmNfZWxzX3Jwc19yZXNwX2ZsYWcgeworCUZDX0VMU19SUFNfTFBFViA9CTB4MDEsCS8qIExfcG9ydCBleHRlbnNpb24gdmFsaWQgKi8KK307CisKK2VudW0gZmNfZWxzX3Jwc19yZXNwX3N0YXR1cyB7CisJRkNfRUxTX1JQU19QVFAgPQkxIDw8IDUsCS8qIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb24gKi8KKwlGQ19FTFNfUlBTX0xPT1AgPQkxIDw8IDQsCS8qIGxvb3AgbW9kZSAqLworCUZDX0VMU19SUFNfRkFCID0JMSA8PCAzLAkvKiBmYWJyaWMgcHJlc2VudCAqLworCUZDX0VMU19SUFNfTk9fU0lHID0JMSA8PCAyLAkvKiBsb3NzIG9mIHNpZ25hbCAqLworCUZDX0VMU19SUFNfTk9fU1lOQyA9CTEgPDwgMSwJLyogbG9zcyBvZiBzeW5jaHJvbml6YXRpb24gKi8KKwlGQ19FTFNfUlBTX1JFU0VUID0JMSA8PCAwLAkvKiBpbiBsaW5rIHJlc2V0IHByb3RvY29sICovCit9OworCisvKgorICogRUxTIExJUlIgLSBMaW5rIEluY2lkZW50IFJlY29yZCBSZWdpc3RyYXRpb24gcmVxdWVzdC4KKyAqLworc3RydWN0IGZjX2Vsc19saXJyIHsKKwlfX3U4CQlsaXJyX2NtZDsJLyogY29tbWFuZCAqLworCV9fdTgJCWxpcnJfcmVzdlszXTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlsaXJyX2Z1bmM7CS8qIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiAqLworCV9fdTgJCWxpcnJfZm10OwkvKiBGQy00IHR5cGUgb2YgUkxJUiByZXF1ZXN0ZWQgKi8KKwlfX3U4CQlsaXJyX3Jlc3YyWzJdOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworfTsKKworZW51bSBmY19lbHNfbGlycl9mdW5jIHsKKwlFTFNfTElSUl9TRVRfQ09ORCA9IAkweDAxLAkvKiBzZXQgLSBjb25kaXRpb25hbGx5IHJlY2VpdmUgKi8KKwlFTFNfTElSUl9TRVRfVU5DT05EID0gCTB4MDIsCS8qIHNldCAtIHVuY29uZGl0aW9uYWxseSByZWNlaXZlICovCisJRUxTX0xJUlJfQ0xFQVIgPSAJMHhmZgkvKiBjbGVhciByZWdpc3RyYXRpb24gKi8KK307CisKKy8qCisgKiBFTFMgU1JMIC0gU2NhbiBSZW1vdGUgTG9vcCByZXF1ZXN0LgorICovCitzdHJ1Y3QgZmNfZWxzX3NybCB7CisJX191OAkJc3JsX2NtZDsJLyogY29tbWFuZCAqLworCV9fdTgJCXNybF9yZXN2WzNdOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCV9fdTgJCXNybF9mbGFnOwkvKiBmbGFnIC0gc2VlIGJlbG93ICovCisJX191OAkJc3JsX2ZsYWdfcGFyYW1bM107CS8qIGZsYWcgcGFyYW1ldGVyICovCit9OworCitlbnVtIGZjX2Vsc19zcmxfZmxhZyB7CisJRkNfRUxTX1NSTF9BTEwgPQkweDAwLAkvKiBzY2FuIGFsbCBGTCBwb3J0cyAqLworCUZDX0VMU19TUkxfT05FID0JMHgwMSwJLyogc2NhbiBzcGVjaWZpZWQgbG9vcCAqLworCUZDX0VMU19TUkxfRU5fUEVSID0JMHgwMiwJLyogZW5hYmxlIHBlcmlvZGljIHNjYW5uaW5nIChwYXJhbSkgKi8KKwlGQ19FTFNfU1JMX0RJU19QRVIgPQkweDAzLAkvKiBkaXNhYmxlIHBlcmlvZGljIHNjYW5uaW5nICovCit9OworCisvKgorICogRUxTIFJMUyAtIFJlYWQgTGluayBFcnJvciBTdGF0dXMgQmxvY2sgcmVxdWVzdC4KKyAqLworc3RydWN0IGZjX2Vsc19ybHMgeworCV9fdTgJCXJsc19jbWQ7CS8qIGNvbW1hbmQgKi8KKwlfX3U4CQlybHNfcmVzdls0XTsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlybHNfcG9ydF9pZFszXTsJLyogcG9ydCBJRCAqLworfTsKKworLyoKKyAqIEVMUyBSTFMgTFNfQUNDIFJlc3BvbnNlLgorICovCitzdHJ1Y3QgZmNfZWxzX3Jsc19yZXNwIHsKKwlfX3U4CQlybHNfY21kOwkvKiBFTFNfTFNfQUNDICovCisJX191OAkJcmxzX3Jlc3ZbM107CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJc3RydWN0IGZjX2Vsc19sZXNiIHJsc19sZXNiOwkvKiBsaW5rIGVycm9yIHN0YXR1cyBibG9jayAqLworfTsKKworLyoKKyAqIEVMUyBSTElSIC0gUmVnaXN0ZXJlZCBMaW5rIEluY2lkZW50IFJlcG9ydC4KKyAqIFRoaXMgaXMgZm9sbG93ZWQgYnkgdGhlIENMSVIgYW5kIHRoZSBDTElELCBkZXNjcmliZWQgYmVsb3cuCisgKi8KK3N0cnVjdCBmY19lbHNfcmxpciB7CisJX191OAkJcmxpcl9jbWQ7CS8qIGNvbW1hbmQgKi8KKwlfX3U4CQlybGlyX3Jlc3ZbM107CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJX191OAkJcmxpcl9mbXQ7CS8qIGZvcm1hdCAoRkM0LXR5cGUgaWYgdHlwZSBzcGVjaWZpYykgKi8KKwlfX3U4CQlybGlyX2Nscl9sZW47CS8qIGNvbW1vbiBsaW5rIGluY2lkZW50IHJlY29yZCBsZW5ndGggKi8KKwlfX3U4CQlybGlyX2NsZF9sZW47CS8qIGNvbW1vbiBsaW5rIGluY2lkZW50IGRlc2MuIGxlbmd0aCAqLworCV9fdTgJCXJsaXJfc2xyX2xlbjsJLyogc3BlYy4gbGluayBpbmNpZGVudCByZWNvcmQgbGVuZ3RoICovCit9OworCisvKgorICogQ0xJUiAtIENvbW1vbiBMaW5rIEluY2lkZW50IFJlY29yZCBEYXRhLiAtIFNlbnQgdmlhIFJMSVIuCisgKi8KK3N0cnVjdCBmY19lbHNfY2xpciB7CisJX19iZTY0CQljbGlyX3d3cG47CS8qIGluY2lkZW50IHBvcnQgbmFtZSAqLworCV9fYmU2NAkJY2xpcl93d25uOwkvKiBpbmNpZGVudCBwb3J0IG5vZGUgbmFtZSAqLworCV9fdTgJCWNsaXJfcG9ydF90eXBlOwkvKiBpbmNpZGVudCBwb3J0IHR5cGUgKi8KKwlfX3U4CQljbGlyX3BvcnRfaWRbM107CS8qIGluY2lkZW50IHBvcnQgSUQgKi8KKworCV9fYmU2NAkJY2xpcl9jb25uX3d3cG47CS8qIGNvbm5lY3RlZCBwb3J0IG5hbWUgKi8KKwlfX2JlNjQJCWNsaXJfY29ubl93d25uOwkvKiBjb25uZWN0ZWQgbm9kZSBuYW1lICovCisJX19iZTY0CQljbGlyX2ZhYl9uYW1lOwkvKiBmYWJyaWMgbmFtZSAqLworCV9fYmUzMgkJY2xpcl9waHlzX3BvcnQ7CS8qIHBoeXNpY2FsIHBvcnQgbnVtYmVyICovCisJX19iZTMyCQljbGlyX3RyYW5zX2lkOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCV9fdTgJCWNsaXJfcmVzdlszXTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQljbGlyX3RzX2ZtdDsJLyogdGltZSBzdGFtcCBmb3JtYXQgKi8KKwlfX2JlNjQJCWNsaXJfdGltZXN0YW1wOwkvKiB0aW1lIHN0YW1wICovCit9OworCisvKgorICogQ0xJUiBjbGlyX3RzX2ZtdCAtIHRpbWUgc3RhbXAgZm9ybWF0IHZhbHVlcy4KKyAqLworZW51bSBmY19lbHNfY2xpcl90c19mbXQgeworCUVMU19DTElSX1RTX1VOS05PV04gPSAJMCwJLyogdGltZSBzdGFtcCBmaWVsZCB1bmtub3duICovCisJRUxTX0NMSVJfVFNfU0VDX0ZSQUMgPSAJMSwJLyogdGltZSBpbiBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgKi8KKwlFTFNfQ0xJUl9UU19DU1UgPQkyLAkvKiB0aW1lIGluIGNsb2NrIHN5bmNoIHVwZGF0ZSBmb3JtYXQgKi8KK307CisKKy8qCisgKiBDb21tb24gTGluayBJbmNpZGVudCBEZXNjcmlwdG9yIC0gc2VudCB2aWEgUkxJUi4KKyAqLworc3RydWN0IGZjX2Vsc19jbGlkIHsKKwlfX3U4CQljbGlkX2lxOwkvKiBpbmNpZGVudCBxdWFsaWZpZXIgZmxhZ3MgKi8KKwlfX3U4CQljbGlkX2ljOwkvKiBpbmNpZGVudCBjb2RlICovCisJX19iZTE2CQljbGlkX2VwYWk7CS8qIGRvbWFpbi9hcmVhIG9mIElTTCAqLworfTsKKworLyoKKyAqIENMSUQgaW5jaWRlbnQgcXVhbGlmaWVyIGZsYWdzLgorICovCitlbnVtIGZjX2Vsc19jbGlkX2lxIHsKKwlFTFNfQ0xJRF9TV0lUQ0ggPQkweDIwLAkvKiBpbmNpZGVudCBwb3J0IGlzIGEgc3dpdGNoIG5vZGUgKi8KKwlFTFNfQ0xJRF9FX1BPUlQgPQkweDEwLAkvKiBpbmNpZGVudCBpcyBhbiBJU0wgKEUpIHBvcnQgKi8KKwlFTFNfQ0xJRF9TRVZfTUFTSyA9CTB4MGMsCS8qIHNldmVyaXR5IDItYml0IGZpZWxkIG1hc2sgKi8KKwlFTFNfQ0xJRF9TRVZfSU5GTyA9CTB4MDAsCS8qIHJlcG9ydCBpcyBpbmZvcm1hdGlvbmFsICovCisJRUxTX0NMSURfU0VWX0lOT1AgPQkweDA4LAkvKiBsaW5rIG5vdCBvcGVyYXRpb25hbCAqLworCUVMU19DTElEX1NFVl9ERUcgPQkweDA0LAkvKiBsaW5rIGRlZ3JhZGVkIGJ1dCBvcGVyYXRpb25hbCAqLworCUVMU19DTElEX0xBU0VSID0JMHgwMiwJLyogc3ViYXNzZW1ibHkgaXMgYSBsYXNlciAqLworCUVMU19DTElEX0ZSVSA9CQkweDAxLAkvKiBmb3JtYXQgY2FuIGlkZW50aWZ5IGEgRlJVICovCit9OworCisvKgorICogQ0xJRCBpbmNpZGVudCBjb2RlLgorICovCitlbnVtIGZjX2Vsc19jbGlkX2ljIHsKKwlFTFNfQ0xJRF9JQ19JTVBMID0JMSwJLyogaW1wbGljaXQgaW5jaWRlbnQgKi8KKwlFTFNfQ0xJRF9JQ19CRVIgPQkyLAkvKiBiaXQtZXJyb3ItcmF0ZSB0aHJlc2hvbGQgZXhjZWVkZWQgKi8KKwlFTFNfQ0xJRF9JQ19MT1MgPQkzLAkvKiBsb3NzIG9mIHN5bmNoIG9yIHNpZ25hbCAqLworCUVMU19DTElEX0lDX05PUyA9CTQsCS8qIG5vbi1vcGVyYXRpb25hbCBwcmltaXRpdmUgc2VxdWVuY2UgKi8KKwlFTFNfQ0xJRF9JQ19QU1QgPQk1LAkvKiBwcmltaXRpdmUgc2VxdWVuY2UgdGltZW91dCAqLworCUVMU19DTElEX0lDX0lOVkFMID0JNiwJLyogaW52YWxpZCBwcmltaXRpdmUgc2VxdWVuY2UgKi8KKwlFTFNfQ0xJRF9JQ19MT09QX1RPID0JNywJLyogbG9vcCBpbml0aWFsaXphdGlvbiB0aW1lIG91dCAqLworCUVMU19DTElEX0lDX0xJUCA9CTgsCS8qIHJlY2VpdmluZyBMSVAgKi8KK307CisKKyNlbmRpZiAvKiBfRkNfRUxTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZW5jYXBzLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZW5jYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MGMzZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19lbmNhcHMuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisjaWZuZGVmIF9GQ19FTkNBUFNfSF8KKyNkZWZpbmUgX0ZDX0VOQ0FQU19IXworCisvKgorICogUHJvdG9jb2wgZGVmaW5pdGlvbnMgZnJvbSBSRkMgMzY0MyAtIEZpYnJlIENoYW5uZWwgRnJhbWUgRW5jYXBzdWxhdGlvbi4KKyAqCisgKiBOb3RlOiAgVGhlIGZyYW1lIGxlbmd0aCBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBpbgorICogdGhlIGVuY2Fwc3VsYXRpb24gaW5jbHVkaW5nIHRoZSBmY2lwX2VuY2Fwc19oZWFkZXIsIENSQyBhbmQgRU9GIHdvcmRzLgorICogVGhlIG1pbmltdW0gZnJhbWUgbGVuZ3RoIHZhbHVlIGluIGJ5dGVzIGlzICgzMiArIDI0ICsgNCArIDQpICogNCA9IDY0LgorICogVGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIHZhbHVlIGluIGJ5dGVzIGlzICgzMiArIDI0ICsgMjExMiArIDQgKyA0KSA9IDIxNzIuCisgKi8KKyNkZWZpbmUgRkNfRU5DQVBTX01JTl9GUkFNRV9MRU4gNjQJLyogbWluIGZyYW1lIGxlbiAoYnl0ZXMpIChzZWUgYWJvdmUpICovCisjZGVmaW5lIEZDX0VOQ0FQU19NQVhfRlJBTUVfTEVOIChGQ19FTkNBUFNfTUlOX0ZSQU1FX0xFTiArIEZDX01BWF9QQVlMT0FEKQorCisjZGVmaW5lIEZDX0VOQ0FQU19WRVIgICAgICAgMSAgICAgICAgICAgLyogY3VycmVudCB2ZXJzaW9uIG51bWJlciAqLworCitzdHJ1Y3QgZmNfZW5jYXBzX2hkciB7CisJX191OAlmY19wcm90bzsJLyogcHJvdG9jb2wgbnVtYmVyICovCisJX191OAlmY192ZXI7CQkvKiB2ZXJzaW9uIG9mIGVuY2Fwc3VsYXRpb24gKi8KKwlfX3U4CWZjX3Byb3RvX247CS8qIG9uZXMgY29tcGxlbWVudCBvZiBwcm90b2NvbCAqLworCV9fdTgJZmNfdmVyX247CS8qIG9uZXMgY29tcGxlbWVudCBvZiB2ZXJzaW9uICovCisKKwl1bnNpZ25lZCBjaGFyIGZjX3Byb3RvX2RhdGFbOF07IC8qIHByb3RvY29sIHNwZWNpZmljIGRhdGEgKi8KKworCV9fYmUxNglmY19sZW5fZmxhZ3M7CS8qIDEwLWJpdCBsZW5ndGgvNCB3LyA2IGZsYWcgYml0cyAqLworCV9fYmUxNglmY19sZW5fZmxhZ3NfbjsJLyogb25lcyBjb21wbGVtZW50IG9mIGxlbmd0aCAvIGZsYWdzICovCisKKwkvKgorCSAqIE9mZnNldCAweDEwCisJICovCisJX19iZTMyCWZjX3RpbWVbMl07CS8qIHRpbWUgc3RhbXA6IHNlY29uZHMgYW5kIGZyYWN0aW9uICovCisJX19iZTMyCWZjX2NyYzsJCS8qIENSQyAqLworCV9fYmUzMglmY19zb2Y7CQkvKiBzdGFydCBvZiBmcmFtZSAoc2VlIEZDX1NPRiBiZWxvdykgKi8KKworCS8qIDB4MjAgLSBGQyBmcmFtZSBjb250ZW50IGZvbGxvd2VkIGJ5IEVPRiB3b3JkICovCit9OworCisjZGVmaW5lIEZDSVBfRU5DQVBTX0hEUl9MRU4gMHgyMAkvKiBleHBlY3RlZCBsZW5ndGggZm9yIGFzc2VydHMgKi8KKworLyoKKyAqIE1hY3JvJ3MgZm9yIG1ha2luZyByZWR1bmRhbnQgY29waWVzIG9mIEVPRiBhbmQgU09GLgorICovCisjZGVmaW5lIEZDX1hZKHgsIHkpCQkoKCgoeCkgJiAweGZmKSA8PCA4KSB8ICgoeSkgJiAweGZmKSkKKyNkZWZpbmUgRkNfWFlYWSh4LCB5KQkJKChGQ0lQX1hZKHgsIHkpIDw8IDE2KSB8IEZDSVBfWFkoeCwgeSkpCisjZGVmaW5lIEZDX1hZTk4oeCwgeSkJCShGQ0lQX1hZWFkoeCwgeSkgXiAweGZmZmYpCisKKyNkZWZpbmUgRkNfU09GX0VOQ09ERShuKQlGQ19YWU5OKG4sIG4pCisjZGVmaW5lIEZDX0VPRl9FTkNPREUobikJRkNfWFlOTihuLCBuKQorCisvKgorICogU09GIC8gRU9GIGJ5dGVzLgorICovCitlbnVtIGZjX3NvZiB7CisJRkNfU09GX0YgPQkweDI4LAkvKiBmYWJyaWMgKi8KKwlGQ19TT0ZfSTQgPQkweDI5LAkvKiBpbml0aWF0ZSBjbGFzcyA0ICovCisJRkNfU09GX0kyID0JMHgyZCwJLyogaW5pdGlhdGUgY2xhc3MgMiAqLworCUZDX1NPRl9JMyA9CTB4MmUsCS8qIGluaXRpYXRlIGNsYXNzIDMgKi8KKwlGQ19TT0ZfTjQgPQkweDMxLAkvKiBub3JtYWwgY2xhc3MgNCAqLworCUZDX1NPRl9OMiA9CTB4MzUsCS8qIG5vcm1hbCBjbGFzcyAyICovCisJRkNfU09GX04zID0JMHgzNiwJLyogbm9ybWFsIGNsYXNzIDMgKi8KKwlGQ19TT0ZfQzQgPQkweDM5LAkvKiBhY3RpdmF0ZSBjbGFzcyA0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIGZjX2VvZiB7CisJRkNfRU9GX04gPQkweDQxLAkvKiBub3JtYWwgKG5vdCBsYXN0IGZyYW1lIG9mIHNlcSkgKi8KKwlGQ19FT0ZfVCA9CTB4NDIsCS8qIHRlcm1pbmF0ZSAobGFzdCBmcmFtZSBvZiBzZXF1ZW5jZSkgKi8KKwlGQ19FT0ZfUlQgPQkweDQ0LAorCUZDX0VPRl9EVCA9CTB4NDYsCS8qIGRpc2Nvbm5lY3QtdGVybWluYXRlIGNsYXNzLTEgKi8KKwlGQ19FT0ZfTkkgPQkweDQ5LAkvKiBub3JtYWwtaW52YWxpZCAqLworCUZDX0VPRl9EVEkgPQkweDRlLAkvKiBkaXNjb25uZWN0LXRlcm1pbmF0ZS1pbnZhbGlkICovCisJRkNfRU9GX1JUSSA9CTB4NGYsCisJRkNfRU9GX0EgPQkweDUwLAkvKiBhYm9ydCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBGQ19TT0ZfQ0xBU1NfTUFTSyAweDA2CS8qIG1hc2sgZm9yIGNsYXNzIG9mIHNlcnZpY2UgaW4gU09GICovCisKKy8qCisgKiBEZWZpbmUgY2xhc3NlcyBpbiB0ZXJtcyBvZiB0aGUgU09GIGNvZGUgKGluaXRpYWwpLgorICovCitlbnVtIGZjX2NsYXNzIHsKKwlGQ19DTEFTU19OT05FID0gMCwJLyogc29mdHdhcmUgdmFsdWUgaW5kaWNhdGluZyBubyBjbGFzcyAqLworCUZDX0NMQVNTXzIgPQlGQ19TT0ZfSTIsCisJRkNfQ0xBU1NfMyA9CUZDX1NPRl9JMywKKwlGQ19DTEFTU180ID0JRkNfU09GX0k0LAorCUZDX0NMQVNTX0YgPQlGQ19TT0ZfRiwKK307CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBTT0YgY29kZSBpbmRpY2F0ZXMgdGhlIG5lZWQgZm9yIGEgQkxTIEFDSy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmNfc29mX25lZWRzX2FjayhlbnVtIGZjX3NvZiBzb2YpCit7CisJcmV0dXJuICh+c29mKSAmIDB4MDI7CS8qIHRydWUgZm9yIGNsYXNzIDEsIDIsIDQsIDYsIG9yIEYgKi8KK30KKworLyoKKyAqIEdpdmVuIGFuIGZjX2NsYXNzLCByZXR1cm4gdGhlIG5vcm1hbCAobm9uLWluaXRpYWwpIFNPRiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBlbnVtIGZjX3NvZiBmY19zb2Zfbm9ybWFsKGVudW0gZmNfY2xhc3MgY2xhc3MpCit7CisJcmV0dXJuIGNsYXNzICsgRkNfU09GX04zIC0gRkNfU09GX0kzOwkvKiBkaWZmIGlzIGFsd2F5cyA4ICovCit9CisKKy8qCisgKiBDb21wdXRlIGNsYXNzIGZyb20gU09GIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGVudW0gZmNfY2xhc3MgZmNfc29mX2NsYXNzKGVudW0gZmNfc29mIHNvZikKK3sKKwlyZXR1cm4gKHNvZiAmIDB4NykgfCBGQ19TT0ZfRjsKK30KKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIFNPRiBpcyBmb3IgdGhlIGluaXRpYWwgZnJhbWUgb2YgYSBzZXF1ZW5jZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmNfc29mX2lzX2luaXQoZW51bSBmY19zb2Ygc29mKQoreworCXJldHVybiBzb2YgPCAweDMwOworfQorCisjZW5kaWYgLyogX0ZDX0VOQ0FQU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZjMi5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZjMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjhhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmMyLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYXQgd3d3Lk9wZW4tRkNvRS5vcmcKKyAqLworCisjaWZuZGVmIF9GQ19GQzJfSF8KKyNkZWZpbmUgX0ZDX0ZDMl9IXworCisvKgorICogRmlicmUgQ2hhbm5lbCBFeGNoYW5nZXMgYW5kIFNlcXVlbmNlcy4KKyAqLworI2lmbmRlZiBQQUNLRUQKKyNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpCisjZW5kaWYgLyogUEFDS0VEICovCisKKworLyoKKyAqIFNlcXVlbmNlIFN0YXR1cyBCbG9jay4KKyAqIFRoaXMgZm9ybWF0IGlzIHNldCBieSB0aGUgRkMtRlMgc3RhbmRhcmQgYW5kIGlzIHNlbnQgb3ZlciB0aGUgd2lyZS4KKyAqIE5vdGUgdGhhdCB0aGUgZmllbGRzIGFyZW4ndCBhbGwgbmF0dXJhbGx5IGFsaWduZWQuCisgKi8KK3N0cnVjdCBmY19zc2IgeworCV9fdTgJc3NiX3NlcV9pZDsJCS8qIHNlcXVlbmNlIElEICovCisJX191OAlfc3NiX3Jlc3ZkOworCV9fYmUxNglzc2JfbG93X3NlcV9jbnQ7CS8qIGxvd2VzdCBTRVFfQ05UICovCisKKwlfX2JlMTYJc3NiX2hpZ2hfc2VxX2NudDsJLyogaGlnaGVzdCBTRVFfQ05UICovCisJX19iZTE2CXNzYl9zX3N0YXQ7CQkvKiBzZXF1ZW5jZSBzdGF0dXMgZmxhZ3MgKi8KKworCV9fYmUxNglzc2JfZXJyX3NlcV9jbnQ7CS8qIGVycm9yIFNFUV9DTlQgKi8KKwlfX3U4CXNzYl9maF9jc19jdGw7CQkvKiBmcmFtZSBoZWFkZXIgQ1NfQ1RMICovCisJX19iZTE2CXNzYl9maF9veF9pZDsJCS8qIGZyYW1lIGhlYWRlciBPWF9JRCAqLworCV9fYmUxNglzc2JfcnhfaWQ7CQkvKiByZXNwb25kZXIncyBleGNoYW5nZSBJRCAqLworCV9fdTgJX3NzYl9yZXN2ZDJbMl07Cit9IFBBQ0tFRDsKKworLyoKKyAqIFRoZSBTU0Igc2hvdWxkIGJlIDE3IGJ5dGVzLiAgU2luY2UgaXQncyBsYXlvdXQgaXMgc29tZXdoYXQgc3RyYW5nZSwKKyAqIHdlIGRlZmluZSB0aGUgc2l6ZSBoZXJlIHNvIHRoYXQgY29kZSBjYW4gQVNTRVJUIHRoYXQgdGhlIHNpemUgY29tZXMgb3V0CisgKiBjb3JyZWN0LgorICovCisjZGVmaW5lIEZDX1NTQl9TSVpFICAgICAgICAgMTcgICAgICAgICAgLyogbGVuZ3RoIG9mIGZjX3NzYiBmb3IgYXNzZXJ0ICovCisKKy8qCisgKiBzc2Jfc19zdGF0IC0gZmxhZ3MgZnJvbSBGQy1GUy0yIFQxMS8xNjE5LUQgUmV2IDAuOTAuCisgKi8KKyNkZWZpbmUgU1NCX1NUX1JFU1AgICAgICAgICAoMSA8PCAxNSkgICAvKiBzZXF1ZW5jZSByZXNwb25kZXIgKi8KKyNkZWZpbmUgU1NCX1NUX0FDVElWRSAgICAgICAoMSA8PCAxNCkgICAvKiBzZXF1ZW5jZSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgU1NCX1NUX0FCTk9STUFMICAgICAoMSA8PCAxMikgICAvKiBhYm5vcm1hbCBlbmRpbmcgY29uZGl0aW9uICovCisKKyNkZWZpbmUgU1NCX1NUX1JFUV9NQVNLICAgICAoMyA8PCAxMCkgICAvKiBBQ0ssIGFib3J0IHNlcXVlbmNlIGNvbmRpdGlvbiAqLworI2RlZmluZSBTU0JfU1RfUkVRX0NPTlQgICAgICgwIDw8IDEwKQorI2RlZmluZSBTU0JfU1RfUkVRX0FCT1JUICAgICgxIDw8IDEwKQorI2RlZmluZSBTU0JfU1RfUkVRX1NUT1AgICAgICgyIDw8IDEwKQorI2RlZmluZSBTU0JfU1RfUkVRX1JFVFJBTlMgICgzIDw8IDEwKQorCisjZGVmaW5lIFNTQl9TVF9BQlRTICAgICAgICAgKDEgPDwgOSkgICAgLyogQUJUUyBwcm90b2NvbCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgU1NCX1NUX1JFVFJBTlMgICAgICAoMSA8PCA4KSAgICAvKiByZXRyYW5zbWlzc2lvbiBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgU1NCX1NUX1RJTUVPVVQgICAgICAoMSA8PCA3KSAgICAvKiBzZXF1ZW5jZSB0aW1lZCBvdXQgYnkgcmVjaXBpZW50ICovCisjZGVmaW5lIFNTQl9TVF9QX1JKVCAgICAgICAgKDEgPDwgNikgICAgLyogUF9SSlQgdHJhbnNtaXR0ZWQgKi8KKworI2RlZmluZSBTU0JfU1RfQ0xBU1NfQklUICAgIDQgICAgICAgICAgIC8qIGNsYXNzIG9mIHNlcnZpY2UgZmllbGQgTFNCICovCisjZGVmaW5lIFNTQl9TVF9DTEFTU19NQVNLICAgMyAgICAgICAgICAgLyogY2xhc3Mgb2Ygc2VydmljZSBtYXNrICovCisjZGVmaW5lIFNTQl9TVF9BQ0sgICAgICAgICAgKDEgPDwgMykgICAgLyogQUNLIChFT0Z0IG9yIEVPRmR0KSB0cmFuc21pdHRlZCAqLworCisvKgorICogRXhjaGFuZ2UgU3RhdHVzIEJsb2NrLgorICogVGhpcyBmb3JtYXQgaXMgc2V0IGJ5IHRoZSBGQy1GUyBzdGFuZGFyZCBhbmQgaXMgc2VudCBvdmVyIHRoZSB3aXJlLgorICogTm90ZSB0aGF0IHRoZSBmaWVsZHMgYXJlbid0IGFsbCBuYXR1cmFsbHkgYWxpZ25lZC4KKyAqLworc3RydWN0IGZjX2VzYiB7CisJX191OAllc2JfY3NfY3RsOwkJLyogQ1NfQ1RMIGZvciBmcmFtZSBoZWFkZXIgKi8KKwlfX2JlMTYJZXNiX294X2lkOwkJLyogb3JpZ2luYXRvciBleGNoYW5nZSBJRCAqLworCV9fYmUxNgllc2JfcnhfaWQ7CQkvKiByZXNwb25kZXIgZXhjaGFuZ2UgSUQgKi8KKwlfX2JlMzIJZXNiX29yaWdfZmlkOwkJLyogZmFicmljIElEIG9mIG9yaWdpbmF0b3IgKi8KKwlfX2JlMzIJZXNiX3Jlc3BfZmlkOwkJLyogZmFicmljIElEIG9mIHJlc3BvbmRlciAqLworCV9fYmUzMgllc2JfZV9zdGF0OwkJLyogc3RhdHVzICovCisJX191OAlfZXNiX3Jlc3ZkWzRdOworCV9fdTgJZXNiX3NlcnZpY2VfcGFyYW1zWzExMl07IC8qIFRCRCAqLworCV9fdTgJZXNiX3NlcV9zdGF0dXNbOF07CS8qIHNlcXVlbmNlIHN0YXR1c2VzLCA4IGJ5dGVzIGVhY2ggKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7OworCisKKy8qCisgKiBEZWZpbmUgZXhwZWN0ZWQgc2l6ZSBmb3IgQVNTRVJUcy4KKyAqIFNlZSBjb21tZW50cyBvbiBGQ19TU0JfU0laRS4KKyAqLworI2RlZmluZSBGQ19FU0JfU0laRSAgICAgICAgICgxICsgNSo0ICsgMTEyICsgOCkgICAgIC8qIGV4cGVjdGVkIHNpemUgKi8KKworLyoKKyAqIGVzYl9lX3N0YXQgLSBmbGFncyBmcm9tIEZDLUZTLTIgVDExLzE2MTktRCBSZXYgMC45MC4KKyAqLworI2RlZmluZSBFU0JfU1RfUkVTUCAgICAgICAgICgxIDw8IDMxKSAgIC8qIHJlc3BvbmRlciB0byBleGNoYW5nZSAqLworI2RlZmluZSBFU0JfU1RfU0VRX0lOSVQgICAgICgxIDw8IDMwKSAgIC8qIHBvcnQgaG9sZHMgc2VxdWVuY2UgaW5pdGlhaXZlICovCisjZGVmaW5lIEVTQl9TVF9DT01QTEVURSAgICAgKDEgPDwgMjkpICAgLyogZXhjaGFuZ2UgaXMgY29tcGxldGUgKi8KKyNkZWZpbmUgRVNCX1NUX0FCTk9STUFMICAgICAoMSA8PCAyOCkgICAvKiBhYm5vcm1hbCBlbmRpbmcgY29uZGl0aW9uICovCisjZGVmaW5lIEVTQl9TVF9SRUNfUVVBTCAgICAgKDEgPDwgMjYpICAgLyogcmVjb3ZlcnkgcXVhbGlmaWVyIGFjdGl2ZSAqLworCisjZGVmaW5lIEVTQl9TVF9FUlJQX0JJVCAgICAgMjQgICAgICAgICAgLyogTFNCIGZvciBlcnJvciBwb2xpY3kgKi8KKyNkZWZpbmUgRVNCX1NUX0VSUlBfTUFTSyAgICAoMyA8PCAyNCkgICAvKiBtYXNrIGZvciBlcnJvciBwb2xpY3kgKi8KKyNkZWZpbmUgRVNCX1NUX0VSUlBfTVVMVCAgICAoMCA8PCAyNCkgICAvKiBhYm9ydCwgZGlzY2FyZCBtdWx0aXBsZSBzZXF1ZW5jZXMgKi8KKyNkZWZpbmUgRVNCX1NUX0VSUlBfU0lORyAgICAoMSA8PCAyNCkgICAvKiBhYm9ydCwgZGlzY2FyZCBzaW5nbGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNCX1NUX0VSUlBfSU5GICAgICAoMiA8PCAyNCkgICAvKiBwcm9jZXNzIHdpdGggaW5maW5pdGUgYnVmZmVycyAqLworI2RlZmluZSBFU0JfU1RfRVJSUF9JTU0gICAgICgzIDw8IDI0KSAgIC8qIGRpc2NhcmQgbXVsdC4gd2l0aCBpbW1lZC4gcmV0cmFuLiAqLworCisjZGVmaW5lIEVTQl9TVF9PWF9JRF9JTlZMICAgKDEgPDwgMjMpICAgLyogb3JpZ2luYXRvciBYSUQgaW52YWxpZCAqLworI2RlZmluZSBFU0JfU1RfUlhfSURfSU5WTCAgICgxIDw8IDIyKSAgIC8qIHJlc3BvbmRlciBYSUQgaW52YWxpZCAqLworI2RlZmluZSBFU0JfU1RfUFJJX0lOVVNFICAgICgxIDw8IDIxKSAgIC8qIHByaW9yaXR5IC8gcHJlZW1wdGlvbiBpbiB1c2UgKi8KKworI2VuZGlmIC8qIF9GQ19GQzJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mYy9mY19mY29lLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWFhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNvZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworI2lmbmRlZiBfRkNfRkNPRV9IXworI2RlZmluZQlfRkNfRkNPRV9IXworCisvKgorICogRkNvRSAtIEZpYnJlIENoYW5uZWwgb3ZlciBFdGhlcm5ldC4KKyAqLworCisvKgorICogVGhlIEZDb0UgZXRoZXJ0eXBlIGV2ZW50dWFsbHkgZ29lcyBpbiBuZXQvaWZfZXRoZXIuaC4KKyAqLworI2lmbmRlZiBFVEhfUF9GQ09FCisjZGVmaW5lCUVUSF9QX0ZDT0UJMHg4OTA2CQkvKiBGQ09FIGV0aGVyIHR5cGUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVUSF9QXzgwMjFRCisjZGVmaW5lCUVUSF9QXzgwMjFRCTB4ODEwMAorI2VuZGlmCisKKy8qCisgKiBGQ19GQ09FX09VSSBoYXNuJ3QgYmVlbiBzdGFuZGFyZGl6ZWQgeWV0LiAgIFhYWCBUQkQuCisgKi8KKyNpZm5kZWYgRkNfRkNPRV9PVUkKKyNkZWZpbmUJRkNfRkNPRV9PVUkJMHgwZWZjMDAJLyogdXBwZXIgMjQgYml0cyBvZiBGQ09FIGRlc3QgTUFDIFRCRCAqLworI2VuZGlmCisKKy8qCisgKiBUaGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgZm9yIHRoZSBmYWJyaWMgbG9naW4gbWF5IGdldCBhIGRpZmZlcmVudCBPVUkuCisgKiBUaGlzIGlzbid0IHN0YW5kYXJkaXplZCB5ZXQuCisgKi8KKyNpZm5kZWYgRkNfRkNPRV9GTE9HSV9NQUMKKy8qIGdhdGV3YXkgTUFDIC0gVEJEICovCisjZGVmaW5lCUZDX0ZDT0VfRkxPR0lfTUFDIHsgMHgwZSwgMHhmYywgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZSB9CisjZW5kaWYKKworI2RlZmluZQlGQ19GQ09FX1ZFUgkwCQkJLyogdmVyc2lvbiAqLworCisvKgorICogRXRoZXJuZXQgQWRkcmVzc2VzIGJhc2VkIG9uIEZDIFNfSUQgYW5kIERfSUQuCisgKiBHZW5lcmF0ZWQgYnkgRkNfRkNPRV9PVUkgfCBTX0lEL0RfSUQKKyAqLworI2RlZmluZQlGQ19GQ09FX0VOQ0FQU19JRChuKQkoKCh1NjQpIEZDX0ZDT0VfT1VJIDw8IDI0KSB8IChuKSkKKyNkZWZpbmUJRkNfRkNPRV9ERUNBUFNfSUQobikJKChuKSA+PiAyNCkKKworLyoKKyAqIEZDb0UgZnJhbWUgaGVhZGVyIC0gMTQgYnl0ZXMKKyAqCisgKiBUaGlzIGlzIHRoZSBBdWd1c3QgMjAwNyB2ZXJzaW9uIG9mIHRoZSBGQ29FIGhlYWRlciBhcyBkZWZpbmVkIGJ5IFQxMS4KKyAqIFRoaXMgZm9sbG93cyB0aGUgVkxBTiBoZWFkZXIsIHdoaWNoIGluY2x1ZGVzIHRoZSBldGhlcnR5cGUuCisgKi8KK3N0cnVjdCBmY29lX2hkciB7CisJX191OAkJZmNvZV92ZXI7CS8qIHZlcnNpb24gZmllbGQgLSB1cHBlciA0IGJpdHMgKi8KKwlfX3U4CQlmY29lX3Jlc3ZkWzEyXTsJLyogcmVzZXJ2ZWQgLSBzZW5kIHplcm8gYW5kIGlnbm9yZSAqLworCV9fdTgJCWZjb2Vfc29mOwkvKiBzdGFydCBvZiBmcmFtZSBwZXIgUkZDIDM2NDMgKi8KK307CisKKyNkZWZpbmUgRkNfRkNPRV9ERUNBUFNfVkVSKGhwKQkgICAgKChocCktPmZjb2VfdmVyID4+IDQpCisjZGVmaW5lIEZDX0ZDT0VfRU5DQVBTX1ZFUihocCwgdmVyKSAoKGhwKS0+ZmNvZV92ZXIgPSAodmVyKSA8PCA0KQorCisvKgorICogRkNvRSBDUkMgJiBFT0YgLSA4IGJ5dGVzLgorICovCitzdHJ1Y3QgZmNvZV9jcmNfZW9mIHsKKwlfX2xlMzIJCWZjb2VfY3JjMzI7CS8qIENSQyBmb3IgRkMgcGFja2V0ICovCisJX191OAkJZmNvZV9lb2Y7CS8qIEVPRiBmcm9tIFJGQyAzNjQzICovCisJX191OAkJZmNvZV9yZXN2ZFszXTsJLyogcmVzZXJ2ZWQgLSBzZW5kIHplcm8gYW5kIGlnbm9yZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIE1pbmltdW0gRkNvRSArIEZDIGhlYWRlciBsZW5ndGgKKyAqIDE0IGJ5dGVzIEZDb0UgaGVhZGVyICsgMjQgYnl0ZSBGQyBoZWFkZXIgPSAzOCBieXRlcworICovCisjZGVmaW5lIEZDT0VfSEVBREVSX0xFTiAzOAorCisvKgorICogTWluaW11bSBGQ29FIGZyYW1lIHNpemUKKyAqIDE0IGJ5dGVzIEZDb0UgaGVhZGVyICsgMjQgYnl0ZSBGQyBoZWFkZXIgKyA4IGJ5dGUgRkNvRSB0cmFpbGVyID0gNDYgYnl0ZXMKKyAqLworI2RlZmluZSBGQ09FX01JTl9GUkFNRSA0NgorCisvKgorICogZmNfZmNvZV9zZXRfbWFjIC0gU3RvcmUgT1VJICsgRElEIGludG8gTUFDIGFkZHJlc3MgZmllbGQuCisgKiBAbWFjOiBtYWMgYWRkcmVzcyB0byBiZSBzZXQKKyAqIEBkaWQ6IGZjIGRlc3QgaWQgdG8gdXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmY19mY29lX3NldF9tYWModTggKm1hYywgdTggKmRpZCkKK3sKKwltYWNbMF0gPSAodTgpIChGQ19GQ09FX09VSSA+PiAxNik7CisJbWFjWzFdID0gKHU4KSAoRkNfRkNPRV9PVUkgPj4gOCk7CisJbWFjWzJdID0gKHU4KSBGQ19GQ09FX09VSTsKKwltYWNbM10gPSBkaWRbMF07CisJbWFjWzRdID0gZGlkWzFdOworCW1hY1s1XSA9IGRpZFsyXTsKK30KKworI2VuZGlmIC8qIF9GQ19GQ09FX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZmNwLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzOGYxOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19mY3AuaApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0ZDX0ZDUF9IXworI2RlZmluZQlfRkNfRkNQX0hfCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIFByb3RvY29sIGZvciBTQ1NJLgorICogRnJvbSBUMTAgRkNQLTMsIFQxMCBwcm9qZWN0IDE1NjAtRCBSZXYgNCwgU2VwdC4gMTMsIDIwMDUuCisgKi8KKworLyoKKyAqIGZjL2ZzLmggZGVmaW5lcyBGQ19UWVBFX0ZDUC4KKyAqLworCisvKgorICogU2VydmljZSBwYXJhbWV0ZXIgcGFnZSBwYXJhbWV0ZXJzICh3b3JkIDMgYml0cykgZm9yIFByb2Nlc3MgTG9naW4uCisgKi8KKyNkZWZpbmUJRkNQX1NQUEZfVEFTS19SRVRSWV9JRAkweDAyMDAJLyogdGFzayByZXRyeSBJRCByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUJRkNQX1NQUEZfUkVUUlkJCTB4MDEwMAkvKiByZXRyeSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJRkNQX1NQUEZfQ09ORl9DT01QTAkweDAwODAJLyogY29uZmlybWVkIGNvbXBsZXRpb24gYWxsb3dlZCAqLworI2RlZmluZQlGQ1BfU1BQRl9PVkxZX0FMTE9XCTB4MDA0MAkvKiBkYXRhIG92ZXJsYXkgYWxsb3dlZCAqLworI2RlZmluZQlGQ1BfU1BQRl9JTklUX0ZDTgkweDAwMjAJLyogaW5pdGlhdG9yIGZ1bmN0aW9uICovCisjZGVmaW5lCUZDUF9TUFBGX1RBUkdfRkNOCTB4MDAxMAkvKiB0YXJnZXQgZnVuY3Rpb24gKi8KKyNkZWZpbmUJRkNQX1NQUEZfUkRfWFJEWV9ESVMJMHgwMDAyCS8qIGRpc2FibGUgWEZFUl9SRFkgZm9yIHJlYWRzICovCisjZGVmaW5lCUZDUF9TUFBGX1dSX1hSRFlfRElTCTB4MDAwMQkvKiBkaXNhYmxlIFhGRVJfUkRZIGZvciB3cml0ZXMgKi8KKworLyoKKyAqIEZDUF9DTU5EIElVIFBheWxvYWQuCisgKi8KK3N0cnVjdCBmY3BfY21uZCB7CisJX191OAkJZmNfbHVuWzhdOwkvKiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisJX191OAkJZmNfY21kcmVmOwkvKiBjb21tbWFuZCByZWZlcmVuY2UgbnVtYmVyICovCisJX191OAkJZmNfcHJpX3RhOwkvKiBwcmlvcml0eSBhbmQgdGFzayBhdHRyaWJ1dGUgKi8KKwlfX3U4CQlmY190bV9mbGFnczsJLyogdGFzayBtYW5hZ2VtZW50IGZsYWdzICovCisJX191OAkJZmNfZmxhZ3M7CS8qIGFkZGl0aW9uYWwgbGVuICYgZmxhZ3MgKi8KKwlfX3U4CQlmY19jZGJbMTZdOwkvKiBiYXNlIENEQiAqLworCV9fYmUzMgkJZmNfZGw7CQkvKiBkYXRhIGxlbmd0aCAobXVzdCBmb2xsb3cgZmNfY2RiKSAqLworfTsKKworI2RlZmluZQlGQ1BfQ01ORF9MRU4JMzIJLyogZXhwZWN0ZWQgbGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgZmNwX2NtbmQzMiB7CisJX191OAkJZmNfbHVuWzhdOwkvKiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisJX191OAkJZmNfY21kcmVmOwkvKiBjb21tbWFuZCByZWZlcmVuY2UgbnVtYmVyICovCisJX191OAkJZmNfcHJpX3RhOwkvKiBwcmlvcml0eSBhbmQgdGFzayBhdHRyaWJ1dGUgKi8KKwlfX3U4CQlmY190bV9mbGFnczsJLyogdGFzayBtYW5hZ2VtZW50IGZsYWdzICovCisJX191OAkJZmNfZmxhZ3M7CS8qIGFkZGl0aW9uYWwgbGVuICYgZmxhZ3MgKi8KKwlfX3U4CQlmY19jZGJbMzJdOwkvKiBiYXNlIENEQiAqLworCV9fYmUzMgkJZmNfZGw7CQkvKiBkYXRhIGxlbmd0aCAobXVzdCBmb2xsb3cgZmNfY2RiKSAqLworfTsKKworI2RlZmluZQlGQ1BfQ01ORDMyX0xFTgkgICAgNDgJLyogZXhwZWN0ZWQgbGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworI2RlZmluZQlGQ1BfQ01ORDMyX0FERF9MRU4gICgxNiAvIDQpCS8qIEFkZGl0aW9uYWwgY2RiIGxlbmd0aCAqLworCisvKgorICogZmNfcHJpX3RhLgorICovCisjZGVmaW5lCUZDUF9QVEFfU0lNUExFCSAgICAwCS8qIHNpbXBsZSB0YXNrIGF0dHJpYnV0ZSAqLworI2RlZmluZQlGQ1BfUFRBX0hFQURRCSAgICAxCS8qIGhlYWQgb2YgcXVldWUgdGFzayBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUJRkNQX1BUQV9PUkRFUkVEICAgICAyCS8qIG9yZGVyZWQgdGFzayBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUJRkNQX1BUQV9BQ0EJICAgIDQJLyogYXV0by4gY29udGlnZW50IGFsbGVnaWFuY2UgKi8KKyNkZWZpbmUJRkNQX1BSSV9TSElGVAkgICAgMwkvKiBwcmlvcml0eSBmaWVsZCBzdGFydHMgaW4gYml0IDMgKi8KKyNkZWZpbmUJRkNQX1BSSV9SRVNWRF9NQVNLICAweDgwCS8qIHJlc2VydmVkIGJpdHMgaW4gcHJpb3JpdHkgZmllbGQgKi8KKworLyoKKyAqIGZjX3RtX2ZsYWdzIC0gdGFzayBtYW5hZ2VtZW50IGZsYWdzIGZpZWxkLgorICovCisjZGVmaW5lCUZDUF9UTUZfQ0xSX0FDQQkJMHg0MAkvKiBjbGVhciBBQ0EgY29uZGl0aW9uICovCisjZGVmaW5lCUZDUF9UTUZfTFVOX1JFU0VUCTB4MTAJLyogbG9naWNhbCB1bml0IHJlc2V0IHRhc2sgbWFuYWdlbWVudCAqLworI2RlZmluZQlGQ1BfVE1GX0NMUl9UQVNLX1NFVAkweDA0CS8qIGNsZWFyIHRhc2sgc2V0ICovCisjZGVmaW5lCUZDUF9UTUZfQUJUX1RBU0tfU0VUCTB4MDIJLyogYWJvcnQgdGFzayBzZXQgKi8KKworLyoKKyAqIGZjX2ZsYWdzLgorICogIEJpdHMgNzoyIGFyZSB0aGUgYWRkaXRpb25hbCBGQ1BfQ0RCIGxlbmd0aCAvIDQuCisgKi8KKyNkZWZpbmUJRkNQX0NGTF9MRU5fTUFTSwkweGZjCS8qIG1hc2sgZm9yIGFkZGl0aW9uYWwgbGVuZ3RoICovCisjZGVmaW5lCUZDUF9DRkxfTEVOX1NISUZUCTIJLyogc2hpZnQgYml0cyBmb3IgYWRkaXRpb25hbCBsZW5ndGggKi8KKyNkZWZpbmUJRkNQX0NGTF9SRERBVEEJCTB4MDIJLyogcmVhZCBkYXRhICovCisjZGVmaW5lCUZDUF9DRkxfV1JEQVRBCQkweDAxCS8qIHdyaXRlIGRhdGEgKi8KKworLyoKKyAqIEZDUF9UWFJEWSBJVSAtIHRyYW5zZmVyIHJlYWR5IHBheWxvYWQuCisgKi8KK3N0cnVjdCBmY3BfdHhyZHkgeworCV9fYmUzMgkJZnRfZGF0YV9ybzsJLyogZGF0YSByZWxhdGl2ZSBvZmZzZXQgKi8KKwlfX2JlMzIJCWZ0X2J1cnN0X2xlbjsJLyogYnVyc3QgbGVuZ3RoICovCisJX191OAkJX2Z0X3Jlc3ZkWzRdOwkvKiByZXNlcnZlZCAqLworfTsKKworI2RlZmluZQlGQ1BfVFhSRFlfTEVOCTEyCS8qIGV4cGVjdGVkIGxlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIEZDUF9SRVNQIElVIC0gcmVzcG9uc2UgcGF5bG9hZC4KKyAqCisgKiBUaGUgcmVzcG9uc2UgcGF5bG9hZCBjb21lcyBpbiB0aHJlZSBwYXJ0czogdGhlIGZsYWdzL3N0YXR1cywgdGhlCisgKiBzZW5zZS9yZXNwb25zZSBsZW5ndGhzIGFuZCB0aGUgc2Vuc2UgZGF0YS9yZXNwb25zZSBpbmZvIHNlY3Rpb24uCisgKgorICogRnJvbSBGQ1AzcjA0LCBub3RlIDYgb2Ygc2VjdGlvbiA5LjUuMTM6CisgKgorICogU29tZSBlYXJseSBpbXBsZW1lbnRhdGlvbnMgcHJlc2VudGVkIHRoZSBGQ1BfUlNQIElVIHdpdGhvdXQgdGhlIEZDUF9SRVNJRCwKKyAqIEZDUF9TTlNfTEVOLCBhbmQgRkNQX1JTUF9MRU4gZmllbGRzIGlmIHRoZSBGQ1BfUkVTSURfVU5ERVIsIEZDUF9SRVNJRF9PVkVSLAorICogRkNQX1NOU19MRU5fVkFMSUQsIGFuZCBGQ1BfUlNQX0xFTl9WQUxJRCBiaXRzIHdlcmUgYWxsIHNldCB0byB6ZXJvLiBUaGlzCisgKiBub24tc3RhbmRhcmQgYmVoYXZpb3Igc2hvdWxkIGJlIHRvbGVyYXRlZC4KKyAqCisgKiBBbGwgcmVzcG9uc2UgZnJhbWVzIHdpbGwgYWx3YXlzIGNvbnRhaW4gdGhlIGZjcF9yZXNwIHRlbXBsYXRlLiAgU29tZQorICogd2lsbCBhbHNvIGluY2x1ZGUgdGhlIGZjcF9yZXNwX2xlbiB0ZW1wbGF0ZS4KKyAqLworc3RydWN0IGZjcF9yZXNwIHsKKwlfX3U4CQlfZnJfcmVzdmRbOF07CS8qIHJlc2VydmVkICovCisJX19iZTE2CQlmcl9yZXRyeV9kZWxheTsJLyogcmV0cnkgZGVsYXkgdGltZXIgKi8KKwlfX3U4CQlmcl9mbGFnczsJLyogZmxhZ3MgKi8KKwlfX3U4CQlmcl9zdGF0dXM7CS8qIFNDU0kgc3RhdHVzIGNvZGUgKi8KK307CisKKyNkZWZpbmUJRkNQX1JFU1BfTEVOCTEyCS8qIGV4cGVjdGVkIGxlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGZjcF9yZXNwX2V4dCB7CisJX19iZTMyCQlmcl9yZXNpZDsJLyogUmVzaWR1YWwgdmFsdWUgKi8KKwlfX2JlMzIJCWZyX3Nuc19sZW47CS8qIFNDU0kgU2Vuc2UgbGVuZ3RoICovCisJX19iZTMyCQlmcl9yc3BfbGVuOwkvKiBSZXNwb25zZSBJbmZvIGxlbmd0aCAqLworCisJLyoKKwkgKiBPcHRpb25hbGx5IGZvbGxvd2VkIGJ5IFJTUCBpbmZvIGFuZC9vciBTTlMgaW5mbyBhbmQvb3IKKwkgKiBiaWRpcmVjdGlvbmFsIHJlYWQgcmVzaWR1YWwgbGVuZ3RoLCBpZiBhbnkuCisJICovCit9OworCisjZGVmaW5lIEZDUF9SRVNQX0VYVF9MRU4gICAgMTIgIC8qIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgc3RydWN0dXJlICovCisKK3N0cnVjdCBmY3BfcmVzcF9yc3BfaW5mbyB7CisgICAgX191OCAgICAgIF9mcl9yZXN2ZFszXTsgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBfX3U4ICAgICAgcnNwX2NvZGU7ICAgICAgICAgICAvKiBSZXNwb25zZSBJbmZvIENvZGUgKi8KKyAgICBfX3U4ICAgICAgX2ZyX3Jlc3ZkMls0XTsgICAgICAvKiByZXNlcnZlZCAqLworfTsKKworc3RydWN0IGZjcF9yZXNwX3dpdGhfZXh0IHsKKwlzdHJ1Y3QgZmNwX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgZmNwX3Jlc3BfZXh0IGV4dDsKK307CisKKyNkZWZpbmUJRkNQX1JFU1BfV0lUSF9FWFQgICAoRkNQX1JFU1BfTEVOICsgRkNQX1JFU1BfRVhUX0xFTikKKworLyoKKyAqIGZyX2ZsYWdzLgorICovCisjZGVmaW5lCUZDUF9CSURJX1JTUAkgICAgMHg4MAkvKiBiaWRpcmVjdGlvbmFsIHJlYWQgcmVzcG9uc2UgKi8KKyNkZWZpbmUJRkNQX0JJRElfUkVBRF9VTkRFUiAweDQwCS8qIGJpZGlyLiByZWFkIGxlc3MgdGhhbiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUJRkNQX0JJRElfUkVBRF9PVkVSICAweDIwCS8qIERMIGluc3VmZmljaWVudCBmb3IgZnVsbCB0cmFuc2ZlciAqLworI2RlZmluZQlGQ1BfQ09ORl9SRVEJICAgIDB4MTAJLyogY29uZmlybWF0aW9uIHJlcXVlc3RlZCAqLworI2RlZmluZQlGQ1BfUkVTSURfVU5ERVIgICAgIDB4MDgJLyogdHJhbnNmZXIgc2hvcnRlciB0aGFuIGV4cGVjdGVkICovCisjZGVmaW5lCUZDUF9SRVNJRF9PVkVSCSAgICAweDA0CS8qIERMIGluc3VmZmljaWVudCBmb3IgZnVsbCB0cmFuc2ZlciAqLworI2RlZmluZQlGQ1BfU05TX0xFTl9WQUwgICAgIDB4MDIJLyogU05TX0xFTiBmaWVsZCBpcyB2YWxpZCAqLworI2RlZmluZQlGQ1BfUlNQX0xFTl9WQUwgICAgIDB4MDEJLyogUlNQX0xFTiBmaWVsZCBpcyB2YWxpZCAqLworCisvKgorICogcnNwX2NvZGVzCisgKi8KK2VudW0gZmNwX3Jlc3BfcnNwX2NvZGVzIHsKKwlGQ1BfVE1GX0NNUEwgPSAwLAorCUZDUF9EQVRBX0xFTl9JTlZBTElEID0gMSwKKwlGQ1BfQ01ORF9GSUVMRFNfSU5WQUxJRCA9IDIsCisJRkNQX0RBVEFfUEFSQU1fTUlTTUFUQ0ggPSAzLAorCUZDUF9UTUZfUkVKRUNURUQgPSA0LAorCUZDUF9UTUZfRkFJTEVEID0gNSwKKwlGQ1BfVE1GX0lOVkFMSURfTFVOID0gOSwKK307CisKKy8qCisgKiBGQ1AgU1JSIExpbmsgU2VydmljZSByZXF1ZXN0IC0gU2VxdWVuY2UgUmV0cmFuc21pc3Npb24gUmVxdWVzdC4KKyAqLworc3RydWN0IGZjcF9zcnIgeworCV9fdTgJCXNycl9vcDsJCS8qIG9wY29kZSBFTFNfU1JSICovCisJX191OAkJc3JyX3Jlc3ZkWzNdOwkvKiBvcGNvZGUgLyByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCV9fYmUxNgkJc3JyX294X2lkOwkvKiBPWF9JRCBvZiBmYWlsZWQgY29tbWFuZCAqLworCV9fYmUxNgkJc3JyX3J4X2lkOwkvKiBSWF9JRCBvZiBmYWlsZWQgY29tbWFuZCAqLworCV9fYmUzMgkJc3JyX3JlbF9vZmY7CS8qIHJlbGF0aXZlIG9mZnNldCAqLworCV9fdTgJCXNycl9yX2N0bDsJLyogcl9jdGwgZm9yIHRoZSBpbmZvcm1hdGlvbiB1bml0ICovCisJX191OAkJc3JyX3Jlc3ZkMlszXTsJLyogcmVzZXJ2ZWQgKi8KK307CisKKyNlbmRpZiAvKiBfRkNfRkNQX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZnMuaCBiL2luY2x1ZGUvc2NzaS9mYy9mY19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDgwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZnMuaApAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0ZDX0ZTX0hfCisjZGVmaW5lIF9GQ19GU19IXworCisvKgorICogRmlicmUgQ2hhbm5lbCBGcmFtaW5nIGFuZCBTaWduYWxsaW5nIGRlZmluaXRpb25zLgorICogRnJvbSBUMTEgRkMtRlMtMiBSZXYgMC45MCAtIDkgQXVndXN0IDIwMDUuCisgKi8KKworLyoKKyAqIEZyYW1lIGhlYWRlcgorICovCitzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyIHsKKwlfX3U4ICAgICAgICAgIGZoX3JfY3RsOwkvKiByb3V0aW5nIGNvbnRyb2wgKi8KKwlfX3U4ICAgICAgICAgIGZoX2RfaWRbM107CS8qIERlc3RpbmF0aW9uIElEICovCisKKwlfX3U4ICAgICAgICAgIGZoX2NzX2N0bDsJLyogY2xhc3Mgb2Ygc2VydmljZSBjb250cm9sIC8gcHJpICovCisJX191OCAgICAgICAgICBmaF9zX2lkWzNdOwkvKiBTb3VyY2UgSUQgKi8KKworCV9fdTggICAgICAgICAgZmhfdHlwZTsJCS8qIHNlZSBlbnVtIGZjX2ZoX3R5cGUgYmVsb3cgKi8KKwlfX3U4ICAgICAgICAgIGZoX2ZfY3RsWzNdOwkvKiBmcmFtZSBjb250cm9sICovCisKKwlfX3U4ICAgICAgICAgIGZoX3NlcV9pZDsJLyogc2VxdWVuY2UgSUQgKi8KKwlfX3U4ICAgICAgICAgIGZoX2RmX2N0bDsJLyogZGF0YSBmaWVsZCBjb250cm9sICovCisJX19iZTE2ICAgICAgICBmaF9zZXFfY250OwkvKiBzZXF1ZW5jZSBjb3VudCAqLworCisJX19iZTE2ICAgICAgICBmaF9veF9pZDsJCS8qIG9yaWdpbmF0b3IgZXhjaGFuZ2UgSUQgKi8KKwlfX2JlMTYgICAgICAgIGZoX3J4X2lkOwkJLyogcmVzcG9uZGVyIGV4Y2hhbmdlIElEICovCisJX19iZTMyICAgICAgICBmaF9wYXJtX29mZnNldDsJLyogcGFyYW1ldGVyIG9yIHJlbGF0aXZlIG9mZnNldCAqLworfTsKKworI2RlZmluZSBGQ19GUkFNRV9IRUFERVJfTEVOIDI0CS8qIGV4cGVjdGVkIGxlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBGQ19NQVhfUEFZTE9BRCAgMjExMlUJCS8qIG1heCBwYXlsb2FkIGxlbmd0aCBpbiBieXRlcyAqLworI2RlZmluZSBGQ19NSU5fTUFYX1BBWUxPQUQgIDI1NlUgCS8qIGxvd2VyIGxpbWl0IG9uIG1heCBwYXlsb2FkICovCisKKyNkZWZpbmUgRkNfTUFYX0ZSQU1FCShGQ19NQVhfUEFZTE9BRCArIEZDX0ZSQU1FX0hFQURFUl9MRU4pCisjZGVmaW5lIEZDX01JTl9NQVhfRlJBTUUgKEZDX01JTl9NQVhfUEFZTE9BRCArIEZDX0ZSQU1FX0hFQURFUl9MRU4pCisKKy8qCisgKiBmaF9yX2N0bCAtIFJvdXRpbmcgY29udHJvbCBkZWZpbml0aW9ucy4KKyAqLworICAgIC8qCisgICAgICogRkMtNCBkZXZpY2VfZGF0YS4KKyAgICAgKi8KK2VudW0gZmNfcmN0bCB7CisJRkNfUkNUTF9ERF9VTkNBVCA9IDB4MDAsCS8qIHVuY2F0ZWdvcml6ZWQgaW5mb3JtYXRpb24gKi8KKwlGQ19SQ1RMX0REX1NPTF9EQVRBID0gMHgwMSwJLyogc29saWNpdGVkIGRhdGEgKi8KKwlGQ19SQ1RMX0REX1VOU09MX0NUTCA9IDB4MDIsCS8qIHVuc29saWNpdGVkIGNvbnRyb2wgKi8KKwlGQ19SQ1RMX0REX1NPTF9DVEwgPSAweDAzLAkvKiBzb2xpY2l0ZWQgY29udHJvbCBvciByZXBseSAqLworCUZDX1JDVExfRERfVU5TT0xfREFUQSA9IDB4MDQsCS8qIHVuc29saWNpdGVkIGRhdGEgKi8KKwlGQ19SQ1RMX0REX0RBVEFfREVTQyA9IDB4MDUsCS8qIGRhdGEgZGVzY3JpcHRvciAqLworCUZDX1JDVExfRERfVU5TT0xfQ01EID0gMHgwNiwJLyogdW5zb2xpY2l0ZWQgY29tbWFuZCAqLworCUZDX1JDVExfRERfQ01EX1NUQVRVUyA9IDB4MDcsCS8qIGNvbW1hbmQgc3RhdHVzICovCisKKyNkZWZpbmUgRkNfUkNUTF9JTFNfUkVRIEZDX1JDVExfRERfVU5TT0xfQ1RMCS8qIElMUyByZXF1ZXN0ICovCisjZGVmaW5lIEZDX1JDVExfSUxTX1JFUCBGQ19SQ1RMX0REX1NPTF9DVEwJLyogSUxTIHJlcGx5ICovCisKKwkvKgorCSAqIEV4dGVuZGVkIExpbmtfRGF0YQorCSAqLworCUZDX1JDVExfRUxTX1JFUSA9IDB4MjIsCS8qIGV4dGVuZGVkIGxpbmsgc2VydmljZXMgcmVxdWVzdCAqLworCUZDX1JDVExfRUxTX1JFUCA9IDB4MjMsCS8qIGV4dGVuZGVkIGxpbmsgc2VydmljZXMgcmVwbHkgKi8KKwlGQ19SQ1RMX0VMUzRfUkVRID0gMHgzMiwgLyogRkMtNCBFTFMgcmVxdWVzdCAqLworCUZDX1JDVExfRUxTNF9SRVAgPSAweDMzLCAvKiBGQy00IEVMUyByZXBseSAqLworCS8qCisJICogT3B0aW9uYWwgRXh0ZW5kZWQgSGVhZGVycworCSAqLworCUZDX1JDVExfVkZUSCA9IDB4NTAsCS8qIHZpcnR1YWwgZmFicmljIHRhZ2dpbmcgaGVhZGVyICovCisJRkNfUkNUTF9JRlJIID0gMHg1MSwJLyogaW50ZXItZmFicmljIHJvdXRpbmcgaGVhZGVyICovCisJRkNfUkNUTF9FTkNIID0gMHg1MiwJLyogZW5jYXBzdWxhdGlvbiBoZWFkZXIgKi8KKwkvKgorCSAqIEJhc2ljIExpbmsgU2VydmljZXMgZmhfcl9jdGwgdmFsdWVzLgorCSAqLworCUZDX1JDVExfQkFfTk9QID0gMHg4MCwJLyogYmFzaWMgbGluayBzZXJ2aWNlIE5PUCAqLworCUZDX1JDVExfQkFfQUJUUyA9IDB4ODEsCS8qIGJhc2ljIGxpbmsgc2VydmljZSBhYm9ydCAqLworCUZDX1JDVExfQkFfUk1DID0gMHg4MiwJLyogcmVtb3ZlIGNvbm5lY3Rpb24gKi8KKwlGQ19SQ1RMX0JBX0FDQyA9IDB4ODQsCS8qIGJhc2ljIGFjY2VwdCAqLworCUZDX1JDVExfQkFfUkpUID0gMHg4NSwJLyogYmFzaWMgcmVqZWN0ICovCisJRkNfUkNUTF9CQV9QUk1UID0gMHg4NiwJLyogZGVkaWNhdGVkIGNvbm5lY3Rpb24gcHJlZW1wdGVkICovCisJLyoKKwkgKiBMaW5rIENvbnRyb2wgSW5mb3JtYXRpb24uCisJICovCisJRkNfUkNUTF9BQ0tfMSA9IDB4YzAsCS8qIGFja25vd2xlZGdlXzEgKi8KKwlGQ19SQ1RMX0FDS18wID0gMHhjMSwJLyogYWNrbm93bGVkZ2VfMCAqLworCUZDX1JDVExfUF9SSlQgPSAweGMyLAkvKiBwb3J0IHJlamVjdCAqLworCUZDX1JDVExfRl9SSlQgPSAweGMzLAkvKiBmYWJyaWMgcmVqZWN0ICovCisJRkNfUkNUTF9QX0JTWSA9IDB4YzQsCS8qIHBvcnQgYnVzeSAqLworCUZDX1JDVExfRl9CU1kgPSAweGM1LAkvKiBmYWJyaWMgYnVzeSB0byBkYXRhIGZyYW1lICovCisJRkNfUkNUTF9GX0JTWUwgPSAweGM2LAkvKiBmYWJyaWMgYnVzeSB0byBsaW5rIGNvbnRyb2wgZnJhbWUgKi8KKwlGQ19SQ1RMX0xDUiA9IDB4YzcsCS8qIGxpbmsgY3JlZGl0IHJlc2V0ICovCisJRkNfUkNUTF9FTkQgPSAweGM5LAkvKiBlbmQgKi8KK307CisJCQkJICAgIC8qIGluY29tcGxldGUgbGlzdCBvZiBkZWZpbml0aW9ucyAqLworCisvKgorICogUl9DVEwgbmFtZXMgaW5pdGlhbGl6ZXIuCisgKiBQbGVhc2Uga2VlcCB0aGlzIG1hdGNoaW5nIHRoZSBhYm92ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBGQ19SQ1RMX05BTUVTX0lOSVQgeyBcCisJW0ZDX1JDVExfRERfVU5DQVRdID0JCSJ1bmNhdCIsCQkJXAorCVtGQ19SQ1RMX0REX1NPTF9EQVRBXSA9CQkic29sIGRhdGEiLAkJCVwKKwlbRkNfUkNUTF9ERF9VTlNPTF9DVExdID0JInVuc29sIGN0bCIsCQkJXAorCVtGQ19SQ1RMX0REX1NPTF9DVExdID0JCSJzb2wgY3RsL3JlcGx5IiwJCVwKKwlbRkNfUkNUTF9ERF9VTlNPTF9EQVRBXSA9CSJ1bnNvbCBkYXRhIiwJCQlcCisJW0ZDX1JDVExfRERfREFUQV9ERVNDXSA9CSJkYXRhIGRlc2MiLAkJCVwKKwlbRkNfUkNUTF9ERF9VTlNPTF9DTURdID0JInVuc29sIGNtZCIsCQkJXAorCVtGQ19SQ1RMX0REX0NNRF9TVEFUVVNdID0JImNtZCBzdGF0dXMiLAkJCVwKKwlbRkNfUkNUTF9FTFNfUkVRXSA9CQkiRUxTIHJlcSIsCQkJXAorCVtGQ19SQ1RMX0VMU19SRVBdID0JCSJFTFMgcmVwIiwJCQlcCisJW0ZDX1JDVExfRUxTNF9SRVFdID0JCSJGQy00IEVMUyByZXEiLAkJCVwKKwlbRkNfUkNUTF9FTFM0X1JFUF0gPQkJIkZDLTQgRUxTIHJlcCIsCQkJXAorCVtGQ19SQ1RMX0JBX05PUF0gPQkJIkJMUyBOT1AiLAkJCVwKKwlbRkNfUkNUTF9CQV9BQlRTXSA9CQkiQkxTIGFib3J0IiwJCQlcCisJW0ZDX1JDVExfQkFfUk1DXSA9CQkiQkxTIHJlbW92ZSBjb25uZWN0aW9uIiwJXAorCVtGQ19SQ1RMX0JBX0FDQ10gPQkJIkJMUyBhY2NlcHQiLAkJCVwKKwlbRkNfUkNUTF9CQV9SSlRdID0JCSJCTFMgcmVqZWN0IiwJCQlcCisJW0ZDX1JDVExfQkFfUFJNVF0gPQkJIkJMUyBkZWRpY2F0ZWQgY29ubmVjdGlvbiBwcmVlbXB0ZWQiLCBcCisJW0ZDX1JDVExfQUNLXzFdID0JCSJMQyBBQ0tfMSIsCQkJXAorCVtGQ19SQ1RMX0FDS18wXSA9CQkiTEMgQUNLXzAiLAkJCVwKKwlbRkNfUkNUTF9QX1JKVF0gPQkJIkxDIHBvcnQgcmVqZWN0IiwJCVwKKwlbRkNfUkNUTF9GX1JKVF0gPQkJIkxDIGZhYnJpYyByZWplY3QiLAkJXAorCVtGQ19SQ1RMX1BfQlNZXSA9CQkiTEMgcG9ydCBidXN5IiwJCQlcCisJW0ZDX1JDVExfRl9CU1ldID0JCSJMQyBmYWJyaWMgYnVzeSB0byBkYXRhIGZyYW1lIiwJXAorCVtGQ19SQ1RMX0ZfQlNZTF0gPQkJIkxDIGZhYnJpYyBidXN5IHRvIGxpbmsgY29udHJvbCBmcmFtZSIsXAorCVtGQ19SQ1RMX0xDUl0gPQkJCSJMQyBsaW5rIGNyZWRpdCByZXNldCIsCQlcCisJW0ZDX1JDVExfRU5EXSA9CQkJIkxDIGVuZCIsCQkJXAorfQorCisvKgorICogV2VsbC1rbm93biBmYWJyaWMgYWRkcmVzc2VzLgorICovCitlbnVtIGZjX3dlbGxfa25vd25fZmlkIHsKKwlGQ19GSURfQkNBU1QgPQkJMHhmZmZmZmYsCS8qIGJyb2FkY2FzdCAqLworCUZDX0ZJRF9GTE9HSSA9CQkweGZmZmZmZSwJLyogZmFicmljIGxvZ2luICovCisJRkNfRklEX0ZDVFJMID0JCTB4ZmZmZmZkLAkvKiBmYWJyaWMgY29udHJvbGxlciAqLworCUZDX0ZJRF9ESVJfU0VSViA9CTB4ZmZmZmZjLAkvKiBkaXJlY3Rvcnkgc2VydmVyICovCisJRkNfRklEX1RJTUVfU0VSViA9CTB4ZmZmZmZiLAkvKiB0aW1lIHNlcnZlciAqLworCUZDX0ZJRF9NR01UX1NFUlYgPQkweGZmZmZmYSwJLyogbWFuYWdlbWVudCBzZXJ2ZXIgKi8KKwlGQ19GSURfUU9TID0JCTB4ZmZmZmY5LAkvKiBRb1MgRmFjaWxpdGF0b3IgKi8KKwlGQ19GSURfQUxJQVNFUyA9CTB4ZmZmZmY4LAkvKiBhbGlhcyBzZXJ2ZXIgKEZDLVBIMikgKi8KKwlGQ19GSURfU0VDX0tFWSA9CTB4ZmZmZmY3LAkvKiBTZWN1cml0eSBrZXkgZGlzdC4gc2VydmVyICovCisJRkNfRklEX0NMT0NLID0JCTB4ZmZmZmY2LAkvKiBjbG9jayBzeW5jaCBzZXJ2ZXIgKi8KKwlGQ19GSURfTUNBU1RfU0VSViA9CTB4ZmZmZmY1LAkvKiBtdWx0aWNhc3Qgc2VydmVyICovCit9OworCisjZGVmaW5lCUZDX0ZJRF9XRUxMX0tOT1dOX01BWAkweGZmZmZmZiAvKiBoaWdoZXN0IHdlbGwta25vd24gZmFicmljIElEICovCisjZGVmaW5lCUZDX0ZJRF9XRUxMX0tOT1dOX0JBU0UJMHhmZmZmZjUgLyogc3RhcnQgb2Ygd2VsbC1rbm93biBmYWJyaWMgSUQgKi8KKworLyoKKyAqIE90aGVyIHdlbGwta25vd24gYWRkcmVzc2VzLCBvdXRzaWRlIHRoZSBhYm92ZSBjb250aWd1b3VzIHJhbmdlLgorICovCisjZGVmaW5lCUZDX0ZJRF9ET01fTUdSCQkweGZmZmMwMAkvKiBkb21haW4gbWFuYWdlciBiYXNlICovCisKKy8qCisgKiBGYWJyaWMgSUQgYnl0ZXMuCisgKi8KKyNkZWZpbmUJRkNfRklEX0RPTUFJTgkJMAorI2RlZmluZQlGQ19GSURfUE9SVAkJMQorI2RlZmluZQlGQ19GSURfTElOSwkJMgorCisvKgorICogZmhfdHlwZSBjb2RlcworICovCitlbnVtIGZjX2ZoX3R5cGUgeworCUZDX1RZUEVfQkxTID0JMHgwMCwJLyogYmFzaWMgbGluayBzZXJ2aWNlICovCisJRkNfVFlQRV9FTFMgPQkweDAxLAkvKiBleHRlbmRlZCBsaW5rIHNlcnZpY2UgKi8KKwlGQ19UWVBFX0lQID0JMHgwNSwJLyogSVAgb3ZlciBGQywgUkZDIDQzMzggKi8KKwlGQ19UWVBFX0ZDUCA9CTB4MDgsCS8qIFNDU0kgRkNQICovCisJRkNfVFlQRV9DVCA9CTB4MjAsCS8qIEZpYnJlIENoYW5uZWwgU2VydmljZXMgKEZDLUNUKSAqLworCUZDX1RZUEVfSUxTID0JMHgyMiwJLyogaW50ZXJuYWwgbGluayBzZXJ2aWNlICovCit9OworCisvKgorICogRkNfVFlQRSBuYW1lcyBpbml0aWFsaXplci4KKyAqIFBsZWFzZSBrZWVwIHRoaXMgbWF0Y2hpbmcgdGhlIGFib3ZlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIEZDX1RZUEVfTkFNRVNfSU5JVCB7CQkJCVwKKwlbRkNfVFlQRV9CTFNdID0JCSJCTFMiLAkJCVwKKwlbRkNfVFlQRV9FTFNdID0JCSJFTFMiLAkJCVwKKwlbRkNfVFlQRV9JUF0gPQkJIklQIiwJCQlcCisJW0ZDX1RZUEVfRkNQXSA9CQkiRkNQIiwJCQlcCisJW0ZDX1RZUEVfQ1RdID0JCSJDVCIsCQkJXAorCVtGQ19UWVBFX0lMU10gPQkJIklMUyIsCQkJXAorfQorCisvKgorICogRXhjaGFuZ2UgSURzLgorICovCisjZGVmaW5lIEZDX1hJRF9VTktOT1dOICAweGZmZmYJLyogdW5rbm93biBleGNoYW5nZSBJRCAqLworI2RlZmluZSBGQ19YSURfTUlOCTB4MAkvKiBzdXBwb3J0ZWQgbWluIGV4Y2hhbmdlIElEICovCisjZGVmaW5lIEZDX1hJRF9NQVgJMHhmZmZlCS8qIHN1cHBvcnRlZCBtYXggZXhjaGFuZ2UgSUQgKi8KKworLyoKKyAqIGZoX2ZfY3RsIC0gRnJhbWUgY29udHJvbCBmbGFncy4KKyAqLworI2RlZmluZQlGQ19GQ19FWF9DVFgJKDEgPDwgMjMpCS8qIHNlbnQgYnkgcmVzcG9uZGVyIHRvIGV4Y2hhbmdlICovCisjZGVmaW5lCUZDX0ZDX1NFUV9DVFgJKDEgPDwgMjIpCS8qIHNlbnQgYnkgcmVzcG9uZGVyIHRvIHNlcXVlbmNlICovCisjZGVmaW5lCUZDX0ZDX0ZJUlNUX1NFUSAoMSA8PCAyMSkJLyogZmlyc3Qgc2VxdWVuY2Ugb2YgdGhpcyBleGNoYW5nZSAqLworI2RlZmluZQlGQ19GQ19MQVNUX1NFUQkoMSA8PCAyMCkJLyogbGFzdCBzZXF1ZW5jZSBvZiB0aGlzIGV4Y2hhbmdlICovCisjZGVmaW5lCUZDX0ZDX0VORF9TRVEJKDEgPDwgMTkpCS8qIGxhc3QgZnJhbWUgb2Ygc2VxdWVuY2UgKi8KKyNkZWZpbmUJRkNfRkNfRU5EX0NPTk4JKDEgPDwgMTgpCS8qIGVuZCBvZiBjbGFzcyAxIGNvbm5lY3Rpb24gcGVuZGluZyAqLworI2RlZmluZQlGQ19GQ19SRVNfQjE3CSgxIDw8IDE3KQkvKiByZXNlcnZlZCAqLworI2RlZmluZQlGQ19GQ19TRVFfSU5JVAkoMSA8PCAxNikJLyogdHJhbnNmZXIgb2Ygc2VxdWVuY2UgaW5pdGlhdGl2ZSAqLworI2RlZmluZQlGQ19GQ19YX0lEX1JFQVNTICgxIDw8IDE1KQkvKiBleGNoYW5nZSBJRCBoYXMgYmVlbiBjaGFuZ2VkICovCisjZGVmaW5lCUZDX0ZDX1hfSURfSU5WQUwgKDEgPDwgMTQpCS8qIGV4Y2hhbmdlIElEIGludmFsaWRhdGVkICovCisKKyNkZWZpbmUJRkNfRkNfQUNLXzEJKDEgPDwgMTIpCS8qIDEzOjEyID0gMTogQUNLXzEgZXhwZWN0ZWQgKi8KKyNkZWZpbmUJRkNfRkNfQUNLX04JKDIgPDwgMTIpCS8qIDEzOjEyID0gMjogQUNLX04gZXhwZWN0ZWQgKi8KKyNkZWZpbmUJRkNfRkNfQUNLXzAJKDMgPDwgMTIpCS8qIDEzOjEyID0gMzogQUNLXzAgZXhwZWN0ZWQgKi8KKworI2RlZmluZQlGQ19GQ19SRVNfQjExCSgxIDw8IDExKQkvKiByZXNlcnZlZCAqLworI2RlZmluZQlGQ19GQ19SRVNfQjEwCSgxIDw8IDEwKQkvKiByZXNlcnZlZCAqLworI2RlZmluZQlGQ19GQ19SRVRYX1NFUQkoMSA8PCA5KQkvKiByZXRyYW5zbWl0dGVkIHNlcXVlbmNlICovCisjZGVmaW5lCUZDX0ZDX1VOSV9UWAkoMSA8PCA4KQkvKiB1bmlkaXJlY3Rpb25hbCB0cmFuc21pdCAoY2xhc3MgMSkgKi8KKyNkZWZpbmUJRkNfRkNfQ09OVF9TRVEoaSkgKChpKSA8PCA2KQorI2RlZmluZQlGQ19GQ19BQlRfU0VRKGkpICgoaSkgPDwgNCkKKyNkZWZpbmUJRkNfRkNfUkVMX09GRgkoMSA8PCAzKQkvKiBwYXJhbWV0ZXIgaXMgcmVsYXRpdmUgb2Zmc2V0ICovCisjZGVmaW5lCUZDX0ZDX1JFUzIJKDEgPDwgMikJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJRkNfRkNfRklMTChpKQkoKGkpICYgMykJLyogMTowOiBieXRlcyBvZiB0cmFpbGluZyBmaWxsICovCisKKy8qCisgKiBCQV9BQ0MgcGF5bG9hZC4KKyAqLworc3RydWN0IGZjX2JhX2FjYyB7CisJX191OAkJYmFfc2VxX2lkX3ZhbDsJLyogU0VRX0lEIHZhbGlkaXR5ICovCisjZGVmaW5lIEZDX0JBX1NFUV9JRF9WQUwgMHg4MAorCV9fdTgJCWJhX3NlcV9pZDsJLyogU0VRX0lEIG9mIHNlcSBsYXN0IGRlbGl2ZXJhYmxlICovCisJX191OAkJYmFfcmVzdmRbMl07CS8qIHJlc2VydmVkICovCisJX19iZTE2CQliYV9veF9pZDsJLyogT1hfSUQgZm9yIGFib3J0ZWQgc2VxIG9yIGV4Y2ggKi8KKwlfX2JlMTYJCWJhX3J4X2lkOwkvKiBSWF9JRCBmb3IgYWJvcnRlZCBzZXEgb3IgZXhjaCAqLworCV9fYmUxNgkJYmFfbG93X3NlcV9jbnQ7CS8qIGxvdyBTRVFfQ05UIG9mIGFib3J0ZWQgc2VxICovCisJX19iZTE2CQliYV9oaWdoX3NlcV9jbnQ7IC8qIGhpZ2ggU0VRX0NOVCBvZiBhYm9ydGVkIHNlcSAqLworfTsKKworLyoKKyAqIEJBX1JKVDogQmFzaWMgUmVqZWN0IHBheWxvYWQuCisgKi8KK3N0cnVjdCBmY19iYV9yanQgeworCV9fdTgJCWJyX3Jlc3ZkOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCWJyX3JlYXNvbjsJLyogcmVhc29uIGNvZGUgKi8KKwlfX3U4CQlicl9leHBsYW47CS8qIHJlYXNvbiBleHBsYW5hdGlvbiAqLworCV9fdTgJCWJyX3ZlbmRvcjsJLyogdmVuZG9yIHVuaXF1ZSBjb2RlICovCit9OworCisvKgorICogQkFfUkpUIHJlYXNvbiBjb2Rlcy4KKyAqIEZyb20gRlMtMi4KKyAqLworZW51bSBmY19iYV9yanRfcmVhc29uIHsKKwlGQ19CQV9SSlRfTk9ORSA9CTAsCS8qIGluIHNvZnR3YXJlIHRoaXMgbWVhbnMgbm8gcmVqZWN0ICovCisJRkNfQkFfUkpUX0lOVkxfQ01EID0JMHgwMSwJLyogaW52YWxpZCBjb21tYW5kIGNvZGUgKi8KKwlGQ19CQV9SSlRfTE9HX0VSUiA9CTB4MDMsCS8qIGxvZ2ljYWwgZXJyb3IgKi8KKwlGQ19CQV9SSlRfTE9HX0JVU1kgPQkweDA1LAkvKiBsb2dpY2FsIGJ1c3kgKi8KKwlGQ19CQV9SSlRfUFJPVE9fRVJSID0JMHgwNywJLyogcHJvdG9jb2wgZXJyb3IgKi8KKwlGQ19CQV9SSlRfVU5BQkxFID0JMHgwOSwJLyogdW5hYmxlIHRvIHBlcmZvcm0gcmVxdWVzdCAqLworCUZDX0JBX1JKVF9WRU5ET1IgPQkweGZmLAkvKiB2ZW5kb3Itc3BlY2lmaWMgKHNlZSBicl92ZW5kb3IpICovCit9OworCisvKgorICogQkFfUkpUIHJlYXNvbiBjb2RlIGV4cGxhbmF0aW9ucy4KKyAqLworZW51bSBmY19iYV9yanRfZXhwbGFuIHsKKwlGQ19CQV9SSlRfRVhQX05PTkUgPQkweDAwLAkvKiBubyBhZGRpdGlvbmFsIGV4cGFuYXRpb24gKi8KKwlGQ19CQV9SSlRfSU5WX1hJRCA9CTB4MDMsCS8qIGludmFsaWQgT1hfSUQtUlhfSUQgY29tYmluYXRpb24gKi8KKwlGQ19CQV9SSlRfQUJUID0JCTB4MDUsCS8qIHNlcXVlbmNlIGFib3J0ZWQsIG5vIHNlcSBpbmZvICovCit9OworCisvKgorICogUF9SSlQgb3IgRl9SSlQ6IFBvcnQgUmVqZWN0IG9yIEZhYnJpYyBSZWplY3QgcGFyYW1ldGVyIGZpZWxkLgorICovCitzdHJ1Y3QgZmNfcGZfcmp0IHsKKwlfX3U4CQlyal9hY3Rpb247CS8qIHJlc2VydmVkICovCisJX191OAkJcmpfcmVhc29uOwkvKiByZWFzb24gY29kZSAqLworCV9fdTgJCXJqX3Jlc3ZkOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCXJqX3ZlbmRvcjsJLyogdmVuZG9yIHVuaXF1ZSBjb2RlICovCit9OworCisvKgorICogUF9SSlQgYW5kIEZfUkpUIHJlamVjdCByZWFzb24gY29kZXMuCisgKi8KK2VudW0gZmNfcGZfcmp0X3JlYXNvbiB7CisJRkNfUkpUX05PTkUgPQkJMCwJLyogbm9uLXJlamVjdCAocmVzZXJ2ZWQgYnkgc3RhbmRhcmQpICovCisJRkNfUkpUX0lOVkxfRElEID0JMHgwMSwJLyogaW52YWxpZCBkZXN0aW5hdGlvbiBJRCAqLworCUZDX1JKVF9JTlZMX1NJRCA9CTB4MDIsCS8qIGludmFsaWQgc291cmNlIElEICovCisJRkNfUkpUX1BfVU5BVl9UID0JMHgwMywJLyogcG9ydCB1bmF2YWlsYWJsZSwgdGVtcG9yYXJ5ICovCisJRkNfUkpUX1BfVU5BViA9CQkweDA0LAkvKiBwb3J0IHVuYXZhaWxhYmxlLCBwZXJtYW5lbnQgKi8KKwlGQ19SSlRfQ0xTX1VOU1VQID0JMHgwNSwJLyogY2xhc3Mgbm90IHN1cHBvcnRlZCAqLworCUZDX1JKVF9ERUxfVVNBR0UgPQkweDA2LAkvKiBkZWxpbWl0ZXIgdXNhZ2UgZXJyb3IgKi8KKwlGQ19SSlRfVFlQRV9VTlNVUCA9CTB4MDcsCS8qIHR5cGUgbm90IHN1cHBvcnRlZCAqLworCUZDX1JKVF9MSU5LX0NUTCA9CTB4MDgsCS8qIGludmFsaWQgbGluayBjb250cm9sICovCisJRkNfUkpUX1JfQ1RMID0JCTB4MDksCS8qIGludmFsaWQgUl9DVEwgZmllbGQgKi8KKwlGQ19SSlRfRl9DVEwgPQkJMHgwYSwJLyogaW52YWxpZCBGX0NUTCBmaWVsZCAqLworCUZDX1JKVF9PWF9JRCA9CQkweDBiLAkvKiBpbnZhbGlkIG9yaWdpbmF0b3IgZXhjaGFuZ2UgSUQgKi8KKwlGQ19SSlRfUlhfSUQgPQkJMHgwYywJLyogaW52YWxpZCByZXNwb25kZXIgZXhjaGFuZ2UgSUQgKi8KKwlGQ19SSlRfU0VRX0lEID0JCTB4MGQsCS8qIGludmFsaWQgc2VxdWVuY2UgSUQgKi8KKwlGQ19SSlRfREZfQ1RMID0JCTB4MGUsCS8qIGludmFsaWQgREZfQ1RMIGZpZWxkICovCisJRkNfUkpUX1NFUV9DTlQgPQkweDBmLAkvKiBpbnZhbGlkIFNFUV9DTlQgZmllbGQgKi8KKwlGQ19SSlRfUEFSQU0gPQkJMHgxMCwJLyogaW52YWxpZCBwYXJhbWV0ZXIgZmllbGQgKi8KKwlGQ19SSlRfRVhDSF9FUlIgPQkweDExLAkvKiBleGNoYW5nZSBlcnJvciAqLworCUZDX1JKVF9QUk9UTyA9CQkweDEyLAkvKiBwcm90b2NvbCBlcnJvciAqLworCUZDX1JKVF9MRU4gPQkJMHgxMywJLyogaW5jb3JyZWN0IGxlbmd0aCAqLworCUZDX1JKVF9VTkVYUF9BQ0sgPQkweDE0LAkvKiB1bmV4cGVjdGVkIEFDSyAqLworCUZDX1JKVF9GQUJfQ0xBU1MgPQkweDE1LAkvKiBjbGFzcyB1bnN1cHBvcnRlZCBieSBmYWJyaWMgZW50aXR5ICovCisJRkNfUkpUX0xPR0lfUkVRID0JMHgxNiwJLyogbG9naW4gcmVxdWlyZWQgKi8KKwlGQ19SSlRfU0VRX1hTID0JCTB4MTcsCS8qIGV4Y2Vzc2l2ZSBzZXF1ZW5jZXMgYXR0ZW1wdGVkICovCisJRkNfUkpUX0VYQ0hfRVNUID0JMHgxOCwJLyogdW5hYmxlIHRvIGVzdGFibGlzaCBleGNoYW5nZSAqLworCUZDX1JKVF9GQUJfVU5BViA9CTB4MWEsCS8qIGZhYnJpYyB1bmF2YWlsYWJsZSAqLworCUZDX1JKVF9WQ19JRCA9CQkweDFiLAkvKiBpbnZhbGlkIFZDX0lEIChjbGFzcyA0KSAqLworCUZDX1JKVF9DU19DVEwgPQkJMHgxYywJLyogaW52YWxpZCBDU19DVEwgZmllbGQgKi8KKwlGQ19SSlRfSU5TVUZfUkVTID0JMHgxZCwJLyogaW5zdWZmLiByZXNvdXJjZXMgZm9yIFZDIChDbGFzcyA0KSAqLworCUZDX1JKVF9JTlZMX0NMUyA9CTB4MWYsCS8qIGludmFsaWQgY2xhc3Mgb2Ygc2VydmljZSAqLworCUZDX1JKVF9QUkVFTVRfUkpUID0JMHgyMCwJLyogcHJlZW1wdGlvbiByZXF1ZXN0IHJlamVjdGVkICovCisJRkNfUkpUX1BSRUVNVF9ESVMgPQkweDIxLAkvKiBwcmVlbXB0aW9uIG5vdCBlbmFibGVkICovCisJRkNfUkpUX01DQVNUX0VSUiA9CTB4MjIsCS8qIG11bHRpY2FzdCBlcnJvciAqLworCUZDX1JKVF9NQ0FTVF9FVCA9CTB4MjMsCS8qIG11bHRpY2FzdCBlcnJvciB0ZXJtaW5hdGUgKi8KKwlGQ19SSlRfUFJMSV9SRVEgPQkweDI0LAkvKiBwcm9jZXNzIGxvZ2luIHJlcXVpcmVkICovCisJRkNfUkpUX0lOVkxfQVRUID0JMHgyNSwJLyogaW52YWxpZCBhdHRhY2htZW50ICovCisJRkNfUkpUX1ZFTkRPUiA9CQkweGZmLAkvKiB2ZW5kb3Igc3BlY2lmaWMgcmVqZWN0ICovCit9OworCisjZW5kaWYgLyogX0ZDX0ZTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZ3MuaCBiL2luY2x1ZGUvc2NzaS9mYy9mY19ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYWIwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvZmMvZmNfZ3MuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworI2lmbmRlZiBfRkNfR1NfSF8KKyNkZWZpbmUJX0ZDX0dTX0hfCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIFNlcnZpY2VzIC0gQ29tbW9uIFRyYW5zcG9ydC4KKyAqIEZyb20gVDExLm9yZyBGQy1HUy0yIFJldiA1LjMgTm92ZW1iZXIgMTk5OC4KKyAqLworCitzdHJ1Y3QgZmNfY3RfaGRyIHsKKwlfX3U4CQljdF9yZXY7CQkvKiByZXZpc2lvbiAqLworCV9fdTgJCWN0X2luX2lkWzNdOwkvKiBOX1BvcnQgSUQgb2Ygb3JpZ2luYWwgcmVxdWVzdG9yICovCisJX191OAkJY3RfZnNfdHlwZTsJLyogdHlwZSBvZiBmaWJyZSBjaGFubmVsIHNlcnZpY2UgKi8KKwlfX3U4CQljdF9mc19zdWJ0eXBlOwkvKiBzdWJ0eXBlICovCisJX191OAkJY3Rfb3B0aW9uczsKKwlfX3U4CQlfY3RfcmVzdmQxOworCV9fYmUxNgkJY3RfY21kOwkJLyogY29tbWFuZCAvIHJlc3BvbnNlIGNvZGUgKi8KKwlfX2JlMTYJCWN0X21yX3NpemU7CS8qIG1heGltdW0gLyByZXNpZHVhbCBzaXplICovCisJX191OAkJX2N0X3Jlc3ZkMjsKKwlfX3U4CQljdF9yZWFzb247CS8qIHJlamVjdCByZWFzb24gKi8KKwlfX3U4CQljdF9leHBsYW47CS8qIHJlYXNvbiBjb2RlIGV4cGxhbmF0aW9uICovCisJX191OAkJY3RfdmVuZG9yOwkvKiB2ZW5kb3IgdW5pcXVlIGRhdGEgKi8KK307CisKKyNkZWZpbmUJRkNfQ1RfSERSX0xFTgkxNgkvKiBleHBlY3RlZCBzaXplb2YgKHN0cnVjdCBmY19jdF9oZHIpICovCisKK2VudW0gZmNfY3RfcmV2IHsKKwlGQ19DVF9SRVYgPSAxCQkvKiBjb21tb24gdHJhbnNwb3J0IHJldmlzaW9uICovCit9OworCisvKgorICogY3RfZnNfdHlwZSB2YWx1ZXMuCisgKi8KK2VudW0gZmNfY3RfZnNfdHlwZSB7CisJRkNfRlNUX0FMSUFTID0JMHhmOCwJLyogYWxpYXMgc2VydmljZSAqLworCUZDX0ZTVF9NR01UID0JMHhmYSwJLyogbWFuYWdlbWVudCBzZXJ2aWNlICovCisJRkNfRlNUX1RJTUUgPQkweGZiLAkvKiB0aW1lIHNlcnZpY2UgKi8KKwlGQ19GU1RfRElSID0JMHhmYywJLyogZGlyZWN0b3J5IHNlcnZpY2UgKi8KK307CisKKy8qCisgKiBjdF9jbWQ6IENvbW1hbmQgLyByZXNwb25zZSBjb2RlcworICovCitlbnVtIGZjX2N0X2NtZCB7CisJRkNfRlNfUkpUID0JMHg4MDAxLAkvKiByZWplY3QgKi8KKwlGQ19GU19BQ0MgPQkweDgwMDIsCS8qIGFjY2VwdCAqLworfTsKKworLyoKKyAqIEZTX1JKVCByZWFzb24gY29kZXMuCisgKi8KK2VudW0gZmNfY3RfcmVhc29uIHsKKwlGQ19GU19SSlRfQ01EID0JCTB4MDEsCS8qIGludmFsaWQgY29tbWFuZCBjb2RlICovCisJRkNfRlNfUkpUX1ZFUiA9CQkweDAyLAkvKiBpbnZhbGlkIHZlcnNpb24gbGV2ZWwgKi8KKwlGQ19GU19SSlRfTE9HID0JCTB4MDMsCS8qIGxvZ2ljYWwgZXJyb3IgKi8KKwlGQ19GU19SSlRfSVVTSVogPQkweDA0LAkvKiBpbnZhbGlkIElVIHNpemUgKi8KKwlGQ19GU19SSlRfQlNZID0JCTB4MDUsCS8qIGxvZ2ljYWwgYnVzeSAqLworCUZDX0ZTX1JKVF9QUk9UTyA9CTB4MDcsCS8qIHByb3RvY29sIGVycm9yICovCisJRkNfRlNfUkpUX1VOQUJMID0JMHgwOSwJLyogdW5hYmxlIHRvIHBlcmZvcm0gY29tbWFuZCByZXF1ZXN0ICovCisJRkNfRlNfUkpUX1VOU1VQID0JMHgwYiwJLyogY29tbWFuZCBub3Qgc3VwcG9ydGVkICovCit9OworCisvKgorICogRlNfUkpUIHJlYXNvbiBjb2RlIGV4cGxhbmF0aW9ucy4KKyAqLworZW51bSBmY19jdF9leHBsYW4geworCUZDX0ZTX0VYUF9OT05FID0JMHgwMCwJLyogbm8gYWRkaXRpb25hbCBleHBsYW5hdGlvbiAqLworCUZDX0ZTX0VYUF9QSUQgPQkJMHgwMSwJLyogcG9ydCBJRCBub3QgcmVnaXN0ZXJlZCAqLworCUZDX0ZTX0VYUF9QTkFNID0JMHgwMiwJLyogcG9ydCBuYW1lIG5vdCByZWdpc3RlcmVkICovCisJRkNfRlNfRVhQX05OQU0gPQkweDAzLAkvKiBub2RlIG5hbWUgbm90IHJlZ2lzdGVyZWQgKi8KKwlGQ19GU19FWFBfQ09TID0JCTB4MDQsCS8qIGNsYXNzIG9mIHNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQgKi8KKwkvKiBkZWZpbml0aW9ucyBub3QgY29tcGxldGUgKi8KK307CisKKyNlbmRpZiAvKiBfRkNfR1NfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oIGIvaW5jbHVkZS9zY3NpL2ZjL2ZjX25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwZDdiOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19ucy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBNYWludGFpbmVkIGF0IHd3dy5PcGVuLUZDb0Uub3JnCisgKi8KKworI2lmbmRlZiBfRkNfTlNfSF8KKyNkZWZpbmUJX0ZDX05TX0hfCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIFNlcnZpY2VzIC0gTmFtZSBTZXJ2aWNlIChkTlMpCisgKiBGcm9tIFQxMS5vcmcgRkMtR1MtMiBSZXYgNS4zIE5vdmVtYmVyIDE5OTguCisgKi8KKworLyoKKyAqIENvbW1vbi10cmFuc3BvcnQgc3ViLXR5cGUgZm9yIE5hbWUgU2VydmVyLgorICovCisjZGVmaW5lCUZDX05TX1NVQlRZUEUJICAgIDIJLyogZnNfY3RfaGRyLmN0X2ZzX3N1YnR5cGUgKi8KKworLyoKKyAqIE5hbWUgc2VydmVyIFJlcXVlc3RzLgorICogTm90ZTogIHRoaXMgaXMgYW4gaW5jb21wbGV0ZSBsaXN0LCBzb21lIHVudXNlZCByZXF1ZXN0cyBhcmUgb21pdHRlZC4KKyAqLworZW51bSBmY19uc19yZXEgeworCUZDX05TX0dBX05YVCA9CTB4MDEwMCwJCS8qIGdldCBhbGwgbmV4dCAqLworCUZDX05TX0dJX0EgPQkweDAxMDEsCQkvKiBnZXQgaWRlbnRpZmllcnMgLSBzY29wZSAqLworCUZDX05TX0dQTl9JRCA9CTB4MDExMiwJCS8qIGdldCBwb3J0IG5hbWUgYnkgSUQgKi8KKwlGQ19OU19HTk5fSUQgPQkweDAxMTMsCQkvKiBnZXQgbm9kZSBuYW1lIGJ5IElEICovCisJRkNfTlNfR0lEX1BOID0JMHgwMTIxLAkJLyogZ2V0IElEIGZvciBwb3J0IG5hbWUgKi8KKwlGQ19OU19HSURfTk4gPQkweDAxMzEsCQkvKiBnZXQgSURzIGZvciBub2RlIG5hbWUgKi8KKwlGQ19OU19HSURfRlQgPQkweDAxNzEsCQkvKiBnZXQgSURzIGJ5IEZDNCB0eXBlICovCisJRkNfTlNfR1BOX0ZUID0JMHgwMTcyLAkJLyogZ2V0IHBvcnQgbmFtZXMgYnkgRkM0IHR5cGUgKi8KKwlGQ19OU19HSURfUFQgPQkweDAxYTEsCQkvKiBnZXQgSURzIGJ5IHBvcnQgdHlwZSAqLworCUZDX05TX1JGVF9JRCA9CTB4MDIxNywJCS8qIHJlZyBGQzQgdHlwZSBmb3IgSUQgKi8KKwlGQ19OU19SUE5fSUQgPQkweDAyMTIsCQkvKiByZWcgcG9ydCBuYW1lIGZvciBJRCAqLworCUZDX05TX1JOTl9JRCA9CTB4MDIxMywJCS8qIHJlZyBub2RlIG5hbWUgZm9yIElEICovCit9OworCisvKgorICogUG9ydCB0eXBlIHZhbHVlcy4KKyAqLworZW51bSBmY19uc19wdCB7CisJRkNfTlNfVU5JRF9QT1JUID0gMHgwMCwJLyogdW5pZGVudGlmaWVkICovCisJRkNfTlNfTl9QT1JUID0JMHgwMSwJLyogTiBwb3J0ICovCisJRkNfTlNfTkxfUE9SVCA9CTB4MDIsCS8qIE5MIHBvcnQgKi8KKwlGQ19OU19GTkxfUE9SVCA9IDB4MDMsCS8qIEYvTkwgcG9ydCAqLworCUZDX05TX05YX1BPUlQgPQkweDdmLAkvKiBOeCBwb3J0ICovCisJRkNfTlNfRl9QT1JUID0JMHg4MSwJLyogRiBwb3J0ICovCisJRkNfTlNfRkxfUE9SVCA9CTB4ODIsCS8qIEZMIHBvcnQgKi8KKwlGQ19OU19FX1BPUlQgPQkweDg0LAkvKiBFIHBvcnQgKi8KKwlGQ19OU19CX1BPUlQgPQkweDg1LAkvKiBCIHBvcnQgKi8KK307CisKKy8qCisgKiBQb3J0IHR5cGUgb2JqZWN0LgorICovCitzdHJ1Y3QgZmNfbnNfcHRfb2JqIHsKKwlfX3U4CQlwdF90eXBlOworfTsKKworLyoKKyAqIFBvcnQgSUQgb2JqZWN0CisgKi8KK3N0cnVjdCBmY19uc19maWQgeworCV9fdTgJCWZwX2ZsYWdzOwkvKiBmbGFncyBmb3IgcmVzcG9uc2VzIG9ubHkgKi8KKwlfX3U4CQlmcF9maWRbM107Cit9OworCisvKgorICogZnBfZmxhZ3MgaW4gcG9ydCBJRCBvYmplY3QsIGZvciByZXNwb25zZXMgb25seS4KKyAqLworI2RlZmluZQlGQ19OU19GSURfTEFTVAkweDgwCQkvKiBsYXN0IG9iamVjdCAqLworCisvKgorICogRkM0LXR5cGVzIG9iamVjdC4KKyAqLworI2RlZmluZQlGQ19OU19UWVBFUwkyNTYJLyogbnVtYmVyIG9mIHBvc3NpYmxlIEZDLTQgdHlwZXMgKi8KKyNkZWZpbmUJRkNfTlNfQlBXCTMyCS8qIGJpdHMgcGVyIHdvcmQgaW4gYml0bWFwICovCisKK3N0cnVjdCBmY19uc19mdHMgeworCV9fYmUzMglmZl90eXBlX21hcFtGQ19OU19UWVBFUyAvIEZDX05TX0JQV107IC8qIGJpdG1hcCBvZiBGQy00IHR5cGVzICovCit9OworCisvKgorICogR0lEX1BUIHJlcXVlc3QuCisgKi8KK3N0cnVjdCBmY19uc19naWRfcHQgeworCV9fdTgJCWZuX3B0X3R5cGU7CisJX191OAkJZm5fZG9tYWluX2lkX3Njb3BlOworCV9fdTgJCWZuX2FyZWFfaWRfc2NvcGU7CisJX191OAkJZm5fcmVzdmQ7Cit9OworCisvKgorICogR0lEX0ZUIG9yIEdQTl9GVCByZXF1ZXN0LgorICovCitzdHJ1Y3QgZmNfbnNfZ2lkX2Z0IHsKKwlfX3U4CQlmbl9yZXN2ZDsKKwlfX3U4CQlmbl9kb21haW5faWRfc2NvcGU7CisJX191OAkJZm5fYXJlYV9pZF9zY29wZTsKKwlfX3U4CQlmbl9mYzRfdHlwZTsKK307CisKKy8qCisgKiBHUE5fRlQgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBmY19ncG5fZnRfcmVzcCB7CisJX191OAkJZnBfZmxhZ3M7CS8qIHNlZSBmcF9mbGFncyBkZWZpbml0aW9ucyBhYm92ZSAqLworCV9fdTgJCWZwX2ZpZFszXTsJLyogcG9ydCBJRCAqLworCV9fYmUzMgkJZnBfcmVzdmQ7CisJX19iZTY0CQlmcF93d3BuOwkvKiBwb3J0IG5hbWUgKi8KK307CisKKy8qCisgKiBHSURfUE4gcmVxdWVzdAorICovCitzdHJ1Y3QgZmNfbnNfZ2lkX3BuIHsKKwlfX2JlNjQgICAgIGZuX3d3cG47ICAgIC8qIHBvcnQgbmFtZSAqLworfTsKKworLyoKKyAqIEdJRF9QTiByZXNwb25zZQorICovCitzdHJ1Y3QgZmNfZ2lkX3BuX3Jlc3AgeworCV9fdTggICAgICBmcF9yZXN2ZDsKKwlfX3U4ICAgICAgZnBfZmlkWzNdOyAgICAgLyogcG9ydCBJRCAqLworfTsKKworLyoKKyAqIFJGVF9JRCByZXF1ZXN0IC0gcmVnaXN0ZXIgRkMtNCB0eXBlcyBmb3IgSUQuCisgKi8KK3N0cnVjdCBmY19uc19yZnRfaWQgeworCXN0cnVjdCBmY19uc19maWQgZnJfZmlkOwkvKiBwb3J0IElEIG9iamVjdCAqLworCXN0cnVjdCBmY19uc19mdHMgZnJfZnRzOwkvKiBGQy00IHR5cGVzIG9iamVjdCAqLworfTsKKworLyoKKyAqIFJQTl9JRCByZXF1ZXN0IC0gcmVnaXN0ZXIgcG9ydCBuYW1lIGZvciBJRC4KKyAqIFJOTl9JRCByZXF1ZXN0IC0gcmVnaXN0ZXIgbm9kZSBuYW1lIGZvciBJRC4KKyAqLworc3RydWN0IGZjX25zX3JuX2lkIHsKKwlzdHJ1Y3QgZmNfbnNfZmlkIGZyX2ZpZDsJLyogcG9ydCBJRCBvYmplY3QgKi8KKwlfX2JlNjQJCWZyX3d3bjsJCS8qIG5vZGUgbmFtZSBvciBwb3J0IG5hbWUgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZW5kaWYgLyogX0ZDX05TX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmNfZW5jb2RlLmggYi9pbmNsdWRlL3Njc2kvZmNfZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mY19lbmNvZGUuaApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0ZDX0VOQ09ERV9IXworI2RlZmluZSBfRkNfRU5DT0RFX0hfCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCitzdHJ1Y3QgZmNfbnNfcmZ0IHsKKwlzdHJ1Y3QgZmNfbnNfZmlkIGZpZDsJLyogcG9ydCBJRCBvYmplY3QgKi8KKwlzdHJ1Y3QgZmNfbnNfZnRzIGZ0czsJLyogRkM0LXR5cGVzIG9iamVjdCAqLworfTsKKworc3RydWN0IGZjX2N0X3JlcSB7CisJc3RydWN0IGZjX2N0X2hkciBoZHI7CisJdW5pb24geworCQlzdHJ1Y3QgZmNfbnNfZ2lkX2Z0IGdpZDsKKwkJc3RydWN0IGZjX25zX3JuX2lkICBybjsKKwkJc3RydWN0IGZjX25zX3JmdCByZnQ7CisJfSBwYXlsb2FkOworfTsKKworLyoqCisgKiBmaWxsIEZDIGhlYWRlciBmaWVsZHMgaW4gc3BlY2lmaWVkIGZjX2ZyYW1lCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmY19maWxsX2ZjX2hkcihzdHJ1Y3QgZmNfZnJhbWUgKmZwLCBlbnVtIGZjX3JjdGwgcl9jdGwsCisJCQkJICB1MzIgZGlkLCB1MzIgc2lkLCBlbnVtIGZjX2ZoX3R5cGUgdHlwZSwKKwkJCQkgIHUzMiBmX2N0bCwgdTMyIHBhcm1fb2Zmc2V0KQoreworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOworCisJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwlXQVJOX09OKHJfY3RsID09IDApOworCWZoLT5maF9yX2N0bCA9IHJfY3RsOworCWh0b24yNChmaC0+ZmhfZF9pZCwgZGlkKTsKKwlodG9uMjQoZmgtPmZoX3NfaWQsIHNpZCk7CisJZmgtPmZoX3R5cGUgPSB0eXBlOworCWh0b24yNChmaC0+ZmhfZl9jdGwsIGZfY3RsKTsKKwlmaC0+ZmhfY3NfY3RsID0gMDsKKwlmaC0+ZmhfZGZfY3RsID0gMDsKKwlmaC0+ZmhfcGFybV9vZmZzZXQgPSBodG9ubChwYXJtX29mZnNldCk7Cit9CisKKy8qKgorICogZmNfY3RfaGRyX2ZpbGwtIGZpbGxzIGN0IGhlYWRlciBhbmQgcmVzZXQgY3QgcGF5bG9hZAorICogcmV0dXJucyBwb2ludGVyIHRvIGN0IHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZjX2N0X3JlcSAqZmNfY3RfaGRyX2ZpbGwoY29uc3Qgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvcCwgc2l6ZV90IHJlcV9zaXplKQoreworCXN0cnVjdCBmY19jdF9yZXEgKmN0OworCXNpemVfdCBjdF9wbGVuOworCisJY3RfcGxlbiAgPSBzaXplb2Yoc3RydWN0IGZjX2N0X2hkcikgKyByZXFfc2l6ZTsKKwljdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBjdF9wbGVuKTsKKwltZW1zZXQoY3QsIDAsIGN0X3BsZW4pOworCWN0LT5oZHIuY3RfcmV2ID0gRkNfQ1RfUkVWOworCWN0LT5oZHIuY3RfZnNfdHlwZSA9IEZDX0ZTVF9ESVI7CisJY3QtPmhkci5jdF9mc19zdWJ0eXBlID0gRkNfTlNfU1VCVFlQRTsKKwljdC0+aGRyLmN0X2NtZCA9IGh0b25zKCh1MTYpIG9wKTsKKwlyZXR1cm4gY3Q7Cit9CisKKy8qKgorICogZmNfY3RfZmlsbCAtIEZpbGwgaW4gYSBuYW1lIHNlcnZpY2UgcmVxdWVzdCBmcmFtZQorICovCitzdGF0aWMgaW5saW5lIGludCBmY19jdF9maWxsKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCSAgICAgIHVuc2lnbmVkIGludCBvcCwgZW51bSBmY19yY3RsICpyX2N0bCwgdTMyICpkaWQsCisJCSAgICAgIGVudW0gZmNfZmhfdHlwZSAqZmhfdHlwZSkKK3sKKwlzdHJ1Y3QgZmNfY3RfcmVxICpjdDsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZDX05TX0dQTl9GVDoKKwkJY3QgPSBmY19jdF9oZHJfZmlsbChmcCwgb3AsIHNpemVvZihzdHJ1Y3QgZmNfbnNfZ2lkX2Z0KSk7CisJCWN0LT5wYXlsb2FkLmdpZC5mbl9mYzRfdHlwZSA9IEZDX1RZUEVfRkNQOworCQlicmVhazsKKworCWNhc2UgRkNfTlNfUkZUX0lEOgorCQljdCA9IGZjX2N0X2hkcl9maWxsKGZwLCBvcCwgc2l6ZW9mKHN0cnVjdCBmY19uc19yZnQpKTsKKwkJaHRvbjI0KGN0LT5wYXlsb2FkLnJmdC5maWQuZnBfZmlkLAorCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJCWN0LT5wYXlsb2FkLnJmdC5mdHMgPSBscG9ydC0+ZmN0czsKKwkJYnJlYWs7CisKKwljYXNlIEZDX05TX1JQTl9JRDoKKwkJY3QgPSBmY19jdF9oZHJfZmlsbChmcCwgb3AsIHNpemVvZihzdHJ1Y3QgZmNfbnNfcm5faWQpKTsKKwkJaHRvbjI0KGN0LT5wYXlsb2FkLnJuLmZyX2ZpZC5mcF9maWQsCisJCSAgICAgICBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpKTsKKwkJY3QtPnBheWxvYWQucmZ0LmZ0cyA9IGxwb3J0LT5mY3RzOworCQlwdXRfdW5hbGlnbmVkX2JlNjQobHBvcnQtPnd3cG4sICZjdC0+cGF5bG9hZC5ybi5mcl93d24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUZDX0RCRygiSW52YWxpZCBvcCBjb2RlICV4IFxuIiwgb3ApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJKnJfY3RsID0gRkNfUkNUTF9ERF9VTlNPTF9DVEw7CisJKmRpZCA9IEZDX0ZJRF9ESVJfU0VSVjsKKwkqZmhfdHlwZSA9IEZDX1RZUEVfQ1Q7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmNfcGxvZ2lfZmlsbCAtIEZpbGwgaW4gcGxvZ2kgcmVxdWVzdCBmcmFtZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfcGxvZ2lfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCSB1bnNpZ25lZCBpbnQgb3ApCit7CisJc3RydWN0IGZjX2Vsc19mbG9naSAqcGxvZ2k7CisJc3RydWN0IGZjX2Vsc19jc3AgKmNzcDsKKwlzdHJ1Y3QgZmNfZWxzX2Nzc3AgKmNwOworCisJcGxvZ2kgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpwbG9naSkpOworCW1lbXNldChwbG9naSwgMCwgc2l6ZW9mKCpwbG9naSkpOworCXBsb2dpLT5mbF9jbWQgPSAodTgpIG9wOworCXB1dF91bmFsaWduZWRfYmU2NChscG9ydC0+d3dwbiwgJnBsb2dpLT5mbF93d3BuKTsKKwlwdXRfdW5hbGlnbmVkX2JlNjQobHBvcnQtPnd3bm4sICZwbG9naS0+Zmxfd3dubik7CisKKwljc3AgPSAmcGxvZ2ktPmZsX2NzcDsKKwljc3AtPnNwX2hpX3ZlciA9IDB4MjA7CisJY3NwLT5zcF9sb192ZXIgPSAweDIwOworCWNzcC0+c3BfYmJfY3JlZCA9IGh0b25zKDEwKTsJLyogdGhpcyBnZXRzIHNldCBieSBnYXRld2F5ICovCisJY3NwLT5zcF9iYl9kYXRhID0gaHRvbnMoKHUxNikgbHBvcnQtPm1mcyk7CisJY3AgPSAmcGxvZ2ktPmZsX2Nzc3BbMyAtIDFdOwkvKiBjbGFzcyAzIHBhcmFtZXRlcnMgKi8KKwljcC0+Y3BfY2xhc3MgPSBodG9ucyhGQ19DUENfVkFMSUQgfCBGQ19DUENfU0VRKTsKKwljc3AtPnNwX2ZlYXR1cmVzID0gaHRvbnMoRkNfU1BfRlRfQ0lSTyk7CisJY3NwLT5zcF90b3Rfc2VxID0gaHRvbnMoMjU1KTsJLyogc2VxLiB3ZSBhY2NlcHQgKi8KKwljc3AtPnNwX3JlbF9vZmYgPSBodG9ucygweDFmKTsKKwljc3AtPnNwX2VfZF90b3YgPSBodG9ubChscG9ydC0+ZV9kX3Rvdik7CisKKwljcC0+Y3BfcmRmcyA9IGh0b25zKCh1MTYpIGxwb3J0LT5tZnMpOworCWNwLT5jcF9jb25fc2VxID0gaHRvbnMoMjU1KTsKKwljcC0+Y3Bfb3Blbl9zZXEgPSAxOworfQorCisvKioKKyAqIGZjX2Zsb2dpX2ZpbGwgLSBGaWxsIGluIGEgZmxvZ2kgcmVxdWVzdCBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX2Zsb2dpX2ZpbGwoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlzdHJ1Y3QgZmNfZWxzX2NzcCAqc3A7CisJc3RydWN0IGZjX2Vsc19jc3NwICpjcDsKKwlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpmbG9naTsKKworCWZsb2dpID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqZmxvZ2kpKTsKKwltZW1zZXQoZmxvZ2ksIDAsIHNpemVvZigqZmxvZ2kpKTsKKwlmbG9naS0+ZmxfY21kID0gKHU4KSBFTFNfRkxPR0k7CisJcHV0X3VuYWxpZ25lZF9iZTY0KGxwb3J0LT53d3BuLCAmZmxvZ2ktPmZsX3d3cG4pOworCXB1dF91bmFsaWduZWRfYmU2NChscG9ydC0+d3dubiwgJmZsb2dpLT5mbF93d25uKTsKKwlzcCA9ICZmbG9naS0+ZmxfY3NwOworCXNwLT5zcF9oaV92ZXIgPSAweDIwOworCXNwLT5zcF9sb192ZXIgPSAweDIwOworCXNwLT5zcF9iYl9jcmVkID0gaHRvbnMoMTApOwkvKiB0aGlzIGdldHMgc2V0IGJ5IGdhdGV3YXkgKi8KKwlzcC0+c3BfYmJfZGF0YSA9IGh0b25zKCh1MTYpIGxwb3J0LT5tZnMpOworCWNwID0gJmZsb2dpLT5mbF9jc3NwWzMgLSAxXTsJLyogY2xhc3MgMyBwYXJhbWV0ZXJzICovCisJY3AtPmNwX2NsYXNzID0gaHRvbnMoRkNfQ1BDX1ZBTElEIHwgRkNfQ1BDX1NFUSk7Cit9CisKKy8qKgorICogZmNfbG9nb19maWxsIC0gRmlsbCBpbiBhIGxvZ28gcmVxdWVzdCBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX2xvZ29fZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCBmY19lbHNfbG9nbyAqbG9nbzsKKworCWxvZ28gPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpsb2dvKSk7CisJbWVtc2V0KGxvZ28sIDAsIHNpemVvZigqbG9nbykpOworCWxvZ28tPmZsX2NtZCA9IEVMU19MT0dPOworCWh0b24yNChsb2dvLT5mbF9uX3BvcnRfaWQsIGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCkpOworCWxvZ28tPmZsX25fcG9ydF93d24gPSBodG9ubGwobHBvcnQtPnd3cG4pOworfQorCisvKioKKyAqIGZjX3J0dl9maWxsIC0gRmlsbCBpbiBSVFYgKHJlYWQgdGltZW91dCB2YWx1ZSkgcmVxdWVzdCBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX3J0dl9maWxsKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2Vsc19ydHYgKnJ0djsKKworCXJ0diA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJ0dikpOworCW1lbXNldChydHYsIDAsIHNpemVvZigqcnR2KSk7CisJcnR2LT5ydHZfY21kID0gRUxTX1JUVjsKK30KKworLyoqCisgKiBmY19yZWNfZmlsbCAtIEZpbGwgaW4gcmVjIHJlcXVlc3QgZnJhbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX3JlY19maWxsKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2Vsc19yZWMgKnJlYzsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBmY19zZXFfZXhjaChmcl9zZXEoZnApKTsKKworCXJlYyA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJlYykpOworCW1lbXNldChyZWMsIDAsIHNpemVvZigqcmVjKSk7CisJcmVjLT5yZWNfY21kID0gRUxTX1JFQzsKKwlodG9uMjQocmVjLT5yZWNfc19pZCwgZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KSk7CisJcmVjLT5yZWNfb3hfaWQgPSBodG9ucyhlcC0+b3hpZCk7CisJcmVjLT5yZWNfcnhfaWQgPSBodG9ucyhlcC0+cnhpZCk7Cit9CisKKy8qKgorICogZmNfcHJsaV9maWxsIC0gRmlsbCBpbiBwcmxpIHJlcXVlc3QgZnJhbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX3BybGlfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBmY19lbHNfcHJsaSBwcmxpOworCQlzdHJ1Y3QgZmNfZWxzX3NwcCBzcHA7CisJfSAqcHA7CisKKwlwcCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnBwKSk7CisJbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisJcHAtPnBybGkucHJsaV9jbWQgPSBFTFNfUFJMSTsKKwlwcC0+cHJsaS5wcmxpX3NwcF9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2Vsc19zcHApOworCXBwLT5wcmxpLnBybGlfbGVuID0gaHRvbnMoc2l6ZW9mKCpwcCkpOworCXBwLT5zcHAuc3BwX3R5cGUgPSBGQ19UWVBFX0ZDUDsKKwlwcC0+c3BwLnNwcF9mbGFncyA9IEZDX1NQUF9FU1RfSU1HX1BBSVI7CisJcHAtPnNwcC5zcHBfcGFyYW1zID0gaHRvbmwobHBvcnQtPnNlcnZpY2VfcGFyYW1zKTsKK30KKworLyoqCisgKiBmY19zY3JfZmlsbCAtIEZpbGwgaW4gYSBzY3IgcmVxdWVzdCBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX3Njcl9maWxsKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJc3RydWN0IGZjX2Vsc19zY3IgKnNjcjsKKworCXNjciA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnNjcikpOworCW1lbXNldChzY3IsIDAsIHNpemVvZigqc2NyKSk7CisJc2NyLT5zY3JfY21kID0gRUxTX1NDUjsKKwlzY3ItPnNjcl9yZWdfZnVuYyA9IEVMU19TQ1JGX0ZVTEw7Cit9CisKKy8qKgorICogZmNfZWxzX2ZpbGwgLSBGaWxsIGluIGFuIEVMUyAgcmVxdWVzdCBmcmFtZQorICovCitzdGF0aWMgaW5saW5lIGludCBmY19lbHNfZmlsbChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LAorCQkgICAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwgdW5zaWduZWQgaW50IG9wLAorCQkgICAgICAgZW51bSBmY19yY3RsICpyX2N0bCwgdTMyICpkaWQsIGVudW0gZmNfZmhfdHlwZSAqZmhfdHlwZSkKK3sKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBFTFNfUExPR0k6CisJCWZjX3Bsb2dpX2ZpbGwobHBvcnQsIGZwLCBFTFNfUExPR0kpOworCQkqZGlkID0gcnBvcnQtPnBvcnRfaWQ7CisJCWJyZWFrOworCisJY2FzZSBFTFNfRkxPR0k6CisJCWZjX2Zsb2dpX2ZpbGwobHBvcnQsIGZwKTsKKwkJKmRpZCA9IEZDX0ZJRF9GTE9HSTsKKwkJYnJlYWs7CisKKwljYXNlIEVMU19MT0dPOgorCQlmY19sb2dvX2ZpbGwobHBvcnQsIGZwKTsKKwkJKmRpZCA9IEZDX0ZJRF9GTE9HSTsKKwkJLyoKKwkJICogaWYgcnBvcnQgaXMgdmFsaWQgdGhlbiBpdAorCQkgKiBpcyBwb3J0IGxvZ28sIHRoZXJlZm9yZQorCQkgKiBzZXQgZGlkIHRvIHJwb3J0IGlkLgorCQkgKi8KKwkJaWYgKHJwb3J0KQorCQkJKmRpZCA9IHJwb3J0LT5wb3J0X2lkOworCQlicmVhazsKKworCWNhc2UgRUxTX1JUVjoKKwkJZmNfcnR2X2ZpbGwobHBvcnQsIGZwKTsKKwkJKmRpZCA9IHJwb3J0LT5wb3J0X2lkOworCQlicmVhazsKKworCWNhc2UgRUxTX1JFQzoKKwkJZmNfcmVjX2ZpbGwobHBvcnQsIGZwKTsKKwkJKmRpZCA9IHJwb3J0LT5wb3J0X2lkOworCQlicmVhazsKKworCWNhc2UgRUxTX1BSTEk6CisJCWZjX3BybGlfZmlsbChscG9ydCwgZnApOworCQkqZGlkID0gcnBvcnQtPnBvcnRfaWQ7CisJCWJyZWFrOworCisJY2FzZSBFTFNfU0NSOgorCQlmY19zY3JfZmlsbChscG9ydCwgZnApOworCQkqZGlkID0gRkNfRklEX0ZDVFJMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUZDX0RCRygiSW52YWxpZCBvcCBjb2RlICV4IFxuIiwgb3ApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqcl9jdGwgPSBGQ19SQ1RMX0VMU19SRVE7CisJKmZoX3R5cGUgPSBGQ19UWVBFX0VMUzsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfRkNfRU5DT0RFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaCBiL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDM0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA3IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0ZDX0ZSQU1FX0hfCisjZGVmaW5lIF9GQ19GUkFNRV9IXworCisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorCisjaW5jbHVkZSA8c2NzaS9mYy9mY19mcy5oPgorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmNwLmg+CisjaW5jbHVkZSA8c2NzaS9mYy9mY19lbmNhcHMuaD4KKworLyoKKyAqIFRoZSBmY19mcmFtZSBpbnRlcmZhY2UgaXMgdXNlZCB0byBwYXNzIGZyYW1lIGRhdGEgYmV0d2VlbiBmdW5jdGlvbnMuCisgKiBUaGUgZnJhbWUgaW5jbHVkZXMgdGhlIGRhdGEgYnVmZmVyLCBsZW5ndGgsIGFuZCBTT0YgLyBFT0YgZGVsaW1pdGVyIHR5cGVzLgorICogQSBwb2ludGVyIHRvIHRoZSBwb3J0IHN0cnVjdHVyZSBvZiB0aGUgcmVjZWl2aW5nIHBvcnQgaXMgYWxzbyBpbmNsdWRlZGVkLgorICovCisKKyNkZWZpbmUJRkNfRlJBTUVfSEVBRFJPT00JMzIJLyogaGVhZHJvb20gZm9yIFZMQU4gKyBGQ29FIGhlYWRlcnMgKi8KKyNkZWZpbmUJRkNfRlJBTUVfVEFJTFJPT00JOAkvKiB0cmFpbGVyIHNwYWNlIGZvciBGQ29FICovCisKKy8qCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBpbmRpdmlkdWFsIGZpYnJlIGNoYW5uZWwgZnJhbWUgcmVjZWl2ZWQgb3IgdG8gYmUgc2VudC4KKyAqIFRoZSBidWZmZXIgbWF5IGJlIGluIHVwIHRvIDQgYWRkaXRpb25hbCBub24tY29udGlndW91cyBzZWN0aW9ucywKKyAqIGJ1dCB0aGUgbGluZWFyIHNlY3Rpb24gbXVzdCBob2xkIHRoZSBmcmFtZSBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRkNfRlJBTUVfU0dfTEVOCQk0CS8qIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgbWF4aW11bSBsZW5ndGggKi8KKworI2RlZmluZSBmcF9za2IoZnApCSgmKChmcCktPnNrYikpCisjZGVmaW5lIGZyX2hkcihmcCkJKChmcCktPnNrYi5kYXRhKQorI2RlZmluZSBmcl9sZW4oZnApCSgoZnApLT5za2IubGVuKQorI2RlZmluZSBmcl9jYihmcCkJKChzdHJ1Y3QgZmNvZV9yY3ZfaW5mbyAqKSYoKGZwKS0+c2tiLmNiWzBdKSkKKyNkZWZpbmUgZnJfZGV2KGZwKQkoZnJfY2IoZnApLT5mcl9kZXYpCisjZGVmaW5lIGZyX3NlcShmcCkJKGZyX2NiKGZwKS0+ZnJfc2VxKQorI2RlZmluZSBmcl9zb2YoZnApCShmcl9jYihmcCktPmZyX3NvZikKKyNkZWZpbmUgZnJfZW9mKGZwKQkoZnJfY2IoZnApLT5mcl9lb2YpCisjZGVmaW5lIGZyX2ZsYWdzKGZwKQkoZnJfY2IoZnApLT5mcl9mbGFncykKKyNkZWZpbmUgZnJfbWF4X3BheWxvYWQoZnApCShmcl9jYihmcCktPmZyX21heF9wYXlsb2FkKQorI2RlZmluZSBmcl9jbWQoZnApCShmcl9jYihmcCktPmZyX2NtZCkKKyNkZWZpbmUgZnJfZGlyKGZwKQkoZnJfY21kKGZwKS0+c2NfZGF0YV9kaXJlY3Rpb24pCisjZGVmaW5lIGZyX2NyYyhmcCkJKGZyX2NiKGZwKS0+ZnJfY3JjKQorCitzdHJ1Y3QgZmNfZnJhbWUgeworCXN0cnVjdCBza19idWZmIHNrYjsKK307CisKK3N0cnVjdCBmY29lX3Jjdl9pbmZvIHsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgICpwdHlwZTsKKwlzdHJ1Y3QgZmNfbHBvcnQJKmZyX2RldjsJLyogdHJhbnNwb3J0IGxheWVyIHByaXZhdGUgcG9pbnRlciAqLworCXN0cnVjdCBmY19zZXEJKmZyX3NlcTsJLyogZm9yIHVzZSB3aXRoIGV4Y2hhbmdlIG1hbmFnZXIgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpmcl9jbWQ7CS8qIGZvciB1c2Ugb2Ygc2NzaSBjb21tYW5kICovCisJdTMyCQlmcl9jcmM7CisJdTE2CQlmcl9tYXhfcGF5bG9hZDsJLyogbWF4IEZDIHBheWxvYWQgKi8KKwllbnVtIGZjX3NvZglmcl9zb2Y7CQkvKiBzdGFydCBvZiBmcmFtZSBkZWxpbWl0ZXIgKi8KKwllbnVtIGZjX2VvZglmcl9lb2Y7CQkvKiBlbmQgb2YgZnJhbWUgZGVsaW1pdGVyICovCisJdTgJCWZyX2ZsYWdzOwkvKiBmbGFncyAtIHNlZSBiZWxvdyAqLworfTsKKworCisvKgorICogR2V0IGZjX2ZyYW1lIHBvaW50ZXIgZm9yIGFuIHNrYiB0aGF0J3MgYWxyZWFkeSBiZWVuIGltcG9ydGVkLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmY29lX3Jjdl9pbmZvICpmY29lX2Rldl9mcm9tX3NrYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGZjb2VfcmN2X2luZm8pID4gc2l6ZW9mKHNrYi0+Y2IpKTsKKwlyZXR1cm4gKHN0cnVjdCBmY29lX3Jjdl9pbmZvICopIHNrYi0+Y2I7Cit9CisKKy8qCisgKiBmcl9mbGFncy4KKyAqLworI2RlZmluZQlGQ1BIRl9DUkNfVU5DSEVDS0VECTB4MDEJLyogQ1JDIG5vdCBjb21wdXRlZCwgc3RpbGwgYXBwZW5kZWQgKi8KKworLyoKKyAqIEluaXRpYWxpemUgYSBmcmFtZS4KKyAqIFdlIGRvbid0IGRvIGEgY29tcGxldGUgbWVtc2V0IGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKiBUaGUgY2FsbGVyIG11c3Qgc2V0IGZyX2ZyZWUsIGZyX2hkciwgZnJfbGVuLCBmcl9zb2YsIGFuZCBmcl9lb2YgZXZlbnR1YWxseS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX2ZyYW1lX2luaXQoc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlmcl9kZXYoZnApID0gTlVMTDsKKwlmcl9zZXEoZnApID0gTlVMTDsKKwlmcl9mbGFncyhmcCkgPSAwOworfQorCitzdHJ1Y3QgZmNfZnJhbWUgKmZjX2ZyYW1lX2FsbG9jX2ZpbGwoc3RydWN0IGZjX2xwb3J0ICosIHNpemVfdCBwYXlsb2FkX2xlbik7CisKK3N0cnVjdCBmY19mcmFtZSAqX19mY19mcmFtZV9hbGxvYyhzaXplX3QgcGF5bG9hZF9sZW4pOworCisvKgorICogR2V0IGZyYW1lIGZvciBzZW5kaW5nIHZpYSBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmY19mcmFtZSAqX2ZjX2ZyYW1lX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqZGV2LAorCQkJCQkgICAgICAgc2l6ZV90IHBheWxvYWRfbGVuKQoreworCXJldHVybiBfX2ZjX2ZyYW1lX2FsbG9jKHBheWxvYWRfbGVuKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGZjX2ZyYW1lIHN0cnVjdHVyZSBhbmQgYnVmZmVyLiAgU2V0IHRoZSBpbml0aWFsIGxlbmd0aCB0bworICogcGF5bG9hZF9zaXplICsgc2l6ZW9mIChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNfZnJhbWUgKmZjX2ZyYW1lX2FsbG9jKHN0cnVjdCBmY19scG9ydCAqZGV2LCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisKKwkvKgorCSAqIE5vdGU6IFNpbmNlIGxlbiB3aWxsIG9mdGVuIGJlIGEgY29uc3RhbnQgbXVsdGlwbGUgb2YgNCwKKwkgKiB0aGlzIGNoZWNrIHdpbGwgdXN1YWxseSBiZSBldmFsdWF0ZWQgYW5kIGVsaW1pbmF0ZWQgYXQgY29tcGlsZSB0aW1lLgorCSAqLworCWlmICgobGVuICUgNCkgIT0gMCkKKwkJZnAgPSBmY19mcmFtZV9hbGxvY19maWxsKGRldiwgbGVuKTsKKwllbHNlCisJCWZwID0gX2ZjX2ZyYW1lX2FsbG9jKGRldiwgbGVuKTsKKwlyZXR1cm4gZnA7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBmY19mcmFtZSBzdHJ1Y3R1cmUgYW5kIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZjX2ZyYW1lX2ZyZWUoc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlrZnJlZV9za2IoZnBfc2tiKGZwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZjX2ZyYW1lX2lzX2xpbmVhcihzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXJldHVybiAhc2tiX2lzX25vbmxpbmVhcihmcF9za2IoZnApKTsKK30KKworLyoKKyAqIEdldCBmcmFtZSBoZWFkZXIgZnJvbSBtZXNzYWdlIGluIGZjX2ZyYW1lIHN0cnVjdHVyZS4KKyAqIFRoaXMgaGlkZXMgYSBjYXN0IGFuZCBwcm92aWRlcyBhIHBsYWNlIHRvIGFkZCBzb21lIGNoZWNraW5nLgorICovCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmY19mcmFtZV9oZWFkZXJfZ2V0KGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJV0FSTl9PTihmcl9sZW4oZnApIDwgc2l6ZW9mKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIpKTsKKwlyZXR1cm4gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgZnJfaGRyKGZwKTsKK30KKworLyoKKyAqIEdldCBmcmFtZSBwYXlsb2FkIGZyb20gbWVzc2FnZSBpbiBmY19mcmFtZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGhpZGVzIGEgY2FzdCBhbmQgcHJvdmlkZXMgYSBwbGFjZSB0byBhZGQgc29tZSBjaGVja2luZy4KKyAqIFRoZSBsZW4gcGFyYW1ldGVyIGlzIHRoZSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHBheWxvYWQgcG9ydGlvbi4KKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgZnJhbWUgaXMgdG9vIHNob3J0LgorICoKKyAqIFRoaXMgYXNzdW1lcyB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgcGF5bG9hZCBpcyBpbiB0aGUgZmlyc3QgcGFydAorICogb2YgdGhlIGJ1ZmZlciBmb3IgcmVjZWl2ZWQgZGF0YS4gIFRoaXMgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSB0byB1c2UgZm9yCisgKiBidWZmZXJzIGJlaW5nIHRyYW5zbWl0dGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmZjX2ZyYW1lX3BheWxvYWRfZ2V0KGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJCSBzaXplX3QgbGVuKQoreworCXZvaWQgKnBwID0gTlVMTDsKKworCWlmIChmcl9sZW4oZnApID49IHNpemVvZihzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyKSArIGxlbikKKwkJcHAgPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKSArIDE7CisJcmV0dXJuIHBwOworfQorCisvKgorICogR2V0IGZyYW1lIHBheWxvYWQgb3Bjb2RlIChmaXJzdCBieXRlKSBmcm9tIG1lc3NhZ2UgaW4gZmNfZnJhbWUgc3RydWN0dXJlLgorICogVGhpcyBoaWRlcyBhIGNhc3QgYW5kIHByb3ZpZGVzIGEgcGxhY2UgdG8gYWRkIHNvbWUgY2hlY2tpbmcuIFJldHVybiAwCisgKiBpZiB0aGUgZnJhbWUgaGFzIG5vIHBheWxvYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggZmNfZnJhbWVfcGF5bG9hZF9vcChjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXU4ICpjcDsKKworCWNwID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZih1OCkpOworCWlmICghY3ApCisJCXJldHVybiAwOworCXJldHVybiAqY3A7CisKK30KKworLyoKKyAqIEdldCBGQyBjbGFzcyBmcm9tIGZyYW1lLgorICovCitzdGF0aWMgaW5saW5lIGVudW0gZmNfY2xhc3MgZmNfZnJhbWVfY2xhc3MoY29uc3Qgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlyZXR1cm4gZmNfc29mX2NsYXNzKGZyX3NvZihmcCkpOworfQorCisvKgorICogQ2hlY2sgdGhlIENSQyBpbiBhIGZyYW1lLgorICogVGhlIENSQyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBsYXN0IGRhdGEgaXRlbSAqQUZURVIqIHRoZSBsZW5ndGguCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gaWYgdGhlIENSQyBtYXRjaGVzLgorICovCit1MzIgZmNfZnJhbWVfY3JjX2NoZWNrKHN0cnVjdCBmY19mcmFtZSAqKTsKKworc3RhdGljIGlubGluZSB1OCBmY19mcmFtZV9yY3RsKGNvbnN0IHN0cnVjdCBmY19mcmFtZSAqZnApCit7CisJcmV0dXJuIGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApLT5maF9yX2N0bDsKK30KKworc3RhdGljIGlubGluZSBib29sIGZjX2ZyYW1lX2lzX2NtZChjb25zdCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQoreworCXJldHVybiBmY19mcmFtZV9yY3RsKGZwKSA9PSBGQ19SQ1RMX0REX1VOU09MX0NNRDsKK30KKworc3RhdGljIGlubGluZSBib29sIGZjX2ZyYW1lX2lzX3JlYWQoY29uc3Qgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlpZiAoZmNfZnJhbWVfaXNfY21kKGZwKSAmJiBmcl9jbWQoZnApKQorCQlyZXR1cm4gZnJfZGlyKGZwKSA9PSBETUFfRlJPTV9ERVZJQ0U7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZmNfZnJhbWVfaXNfd3JpdGUoY29uc3Qgc3RydWN0IGZjX2ZyYW1lICpmcCkKK3sKKwlpZiAoZmNfZnJhbWVfaXNfY21kKGZwKSAmJiBmcl9jbWQoZnApKQorCQlyZXR1cm4gZnJfZGlyKGZwKSA9PSBETUFfVE9fREVWSUNFOworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIENoZWNrIGZvciBsZWFrcy4KKyAqIFByaW50IHRoZSBmcmFtZSBoZWFkZXIgb2YgYW55IGN1cnJlbnRseSBhbGxvY2F0ZWQgZnJhbWUsIGFzc3VtaW5nIHRoZXJlCisgKiBzaG91bGQgYmUgbm9uZSBhdCB0aGlzIHBvaW50LgorICovCit2b2lkIGZjX2ZyYW1lX2xlYWtfY2hlY2sodm9pZCk7CisKKyNlbmRpZiAvKiBfRkNfRlJBTUVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mY190cmFuc3BvcnRfZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2ZjX3RyYW5zcG9ydF9mY29lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjYTJhZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9mY190cmFuc3BvcnRfZmNvZS5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgRkNfVFJBTlNQT1JUX0ZDT0VfSAorI2RlZmluZSBGQ19UUkFOU1BPUlRfRkNPRV9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvbGliZmMuaD4KKworLyoqCisgKiBzdHJ1Y3QgZmNvZV90cmFuc3BvcnQgLSBGQ29FIHRyYW5zcG9ydCBzdHJ1Y3QgZm9yIGdlbmVyaWMgdHJhbnNwb3J0CisgKiBmb3IgRXRoZXJuZXQgZGV2aWNlcyBhcyB3ZWxsIGFzIHB1cmUgSEJBcworICoKKyAqIEBuYW1lOiBuYW1lIGZvciB0aHNpIHRyYW5zcG9ydAorICogQGJ1czogcGh5c2ljYWwgYnVzIHR5cGUgKHBjaV9idXNfdHlwZSkKKyAqIEBkcml2ZXI6IHBoeXNpY2FsIGJ1cyBkcml2ZXIgZm9yIG5ldHdvcmsgZGV2aWNlCisgKiBAY3JlYXRlOiBlbnRyeSBjcmVhdGUgZnVuY3Rpb24KKyAqIEBkZXN0cm95OiBleGl0IGRlc3Ryb3kgZnVuY3Rpb24KKyAqIEBsaXN0OiBsaXN0IG9mIHRyYW5zcG9ydHMKKyAqLworc3RydWN0IGZjb2VfdHJhbnNwb3J0IHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7CisJc3RydWN0IGJ1c190eXBlICpidXM7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcjsKKwlpbnQgKCpjcmVhdGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXZpY2UpOworCWludCAoKmRlc3Ryb3kpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXZpY2UpOworCWJvb2wgKCptYXRjaCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldmljZSk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKKwlzdHJ1Y3QgbXV0ZXggZGV2bG9jazsKK307CisKKy8qKgorICogTU9EVUxFX0FMSUFTX0ZDT0VfUENJCisgKgorICogc29tZSBjYXJlIG11c3QgYmUgdGFrZW4gd2l0aCB0aGlzLCB2ZW5kb3IgYW5kIGRldmljZSBNVVNUIGJlIGEgaGV4IHZhbHVlCisgKiBwcmVjZWRlZCB3aXRoIDB4IGFuZCB3aXRoIGxldHRlcnMgaW4gbG93ZXIgY2FzZSAoMHgxMmFiLCBub3QgMHgxMkFCIG9yIDEyQUIpCisgKi8KKyNkZWZpbmUgTU9EVUxFX0FMSUFTX0ZDT0VfUENJKHZlbmRvciwgZGV2aWNlKSBcCisJTU9EVUxFX0FMSUFTKCJmY29lLXBjaS0iIF9fc3RyaW5naWZ5KHZlbmRvcikgIi0iIF9fc3RyaW5naWZ5KGRldmljZSkpCisKKy8qIGV4cG9ydGVkIGZ1bmNzICovCitpbnQgZmNvZV90cmFuc3BvcnRfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworaW50IGZjb2VfdHJhbnNwb3J0X3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitpbnQgZmNvZV90cmFuc3BvcnRfcmVnaXN0ZXIoc3RydWN0IGZjb2VfdHJhbnNwb3J0ICp0KTsKK2ludCBmY29lX3RyYW5zcG9ydF91bnJlZ2lzdGVyKHN0cnVjdCBmY29lX3RyYW5zcG9ydCAqdCk7CitpbnQgZmNvZV9sb2FkX3RyYW5zcG9ydF9kcml2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitpbnQgX19pbml0IGZjb2VfdHJhbnNwb3J0X2luaXQodm9pZCk7CitpbnQgX19leGl0IGZjb2VfdHJhbnNwb3J0X2V4aXQodm9pZCk7CisKKy8qIGZjb3dfc3cgaXMgdGhlIGRlZmF1bHQgdHJhbnNwb3J0ICovCitleHRlcm4gc3RydWN0IGZjb2VfdHJhbnNwb3J0IGZjb2Vfc3dfdHJhbnNwb3J0OworI2VuZGlmIC8qIEZDX1RSQU5TUE9SVF9GQ09FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9pc2NzaV9pZi5oIGIvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKaW5kZXggMGM5NTE0ZC4uZDBlZDUyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKKysrIGIvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmgKQEAgLTMzMyw4ICszMzMsMTEgQEAKICNkZWZpbmUgQ0FQX1RFWFRfTkVHTwkJMHg4MAogI2RlZmluZSBDQVBfTUFSS0VSUwkJMHgxMDAKICNkZWZpbmUgQ0FQX0ZXX0RCCQkweDIwMAotI2RlZmluZSBDQVBfU0VORFRBUkdFVFNfT0ZGTE9BRAkweDQwMAotI2RlZmluZSBDQVBfREFUQV9QQVRIX09GRkxPQUQJMHg4MDAKKyNkZWZpbmUgQ0FQX1NFTkRUQVJHRVRTX09GRkxPQUQJMHg0MDAJLyogb2ZmbG9hZCBkaXNjb3ZlcnkgcHJvY2VzcyAqLworI2RlZmluZSBDQVBfREFUQV9QQVRIX09GRkxPQUQJMHg4MDAJLyogb2ZmbG9hZCBlbnRpcmUgSU8gcGF0aCAqLworI2RlZmluZSBDQVBfRElHRVNUX09GRkxPQUQJMHgxMDAwCS8qIG9mZmxvYWQgaGRyIGFuZCBkYXRhIGRpZ2VzdHMgKi8KKyNkZWZpbmUgQ0FQX1BBRERJTkdfT0ZGTE9BRAkweDIwMDAJLyogb2ZmbG9hZCBwYWRkaW5nIGluc2VydGlvbiwgcmVtb3ZhbCwKKwkJCQkJIGFuZCB2ZXJpZmljYXRpb24gKi8KIAogLyoKICAqIFRoZXNlIGZsYWdzIGRlc2NyaWJlcyByZWFzb24gb2Ygc3RvcF9jb25uKCkgY2FsbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmZjLmggYi9pbmNsdWRlL3Njc2kvbGliZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjI4NzYzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmZjLmgKQEAgLTAsMCArMSw5MzggQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIE1haW50YWluZWQgYXQgd3d3Lk9wZW4tRkNvRS5vcmcKKyAqLworCisjaWZuZGVmIF9MSUJGQ19IXworI2RlZmluZSBfTElCRkNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisKKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgorI2luY2x1ZGUgPHNjc2kvZmMvZmNfbnMuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2Vscy5oPgorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZ3MuaD4KKworI2luY2x1ZGUgPHNjc2kvZmNfZnJhbWUuaD4KKworI2RlZmluZSBMSUJGQ19ERUJVRworCisjaWZkZWYgTElCRkNfREVCVUcKKy8qIExvZyBtZXNzYWdlcyAqLworI2RlZmluZSBGQ19EQkcoZm10LCBhcmdzLi4uKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gIiVzICIgZm10LCBfX2Z1bmNfXywgIyNhcmdzKTsJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRkNfREJHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisvKgorICogbGliZmMgZXJyb3IgY29kZXMKKyAqLworI2RlZmluZQlGQ19OT19FUlIJMAkvKiBubyBlcnJvciAqLworI2RlZmluZQlGQ19FWF9USU1FT1VUCTEJLyogRXhjaGFuZ2UgdGltZW91dCAqLworI2RlZmluZQlGQ19FWF9DTE9TRUQJMgkvKiBFeGNoYW5nZSBjbG9zZWQgKi8KKworLyogc29tZSBoZWxwZnVsIG1hY3JvcyAqLworCisjZGVmaW5lIG50b2hsbCh4KSBiZTY0X3RvX2NwdSh4KQorI2RlZmluZSBodG9ubGwoeCkgY3B1X3RvX2JlNjQoeCkKKworI2RlZmluZSBudG9oMjQocCkgKCgocClbMF0gPDwgMTYpIHwgKChwKVsxXSA8PCA4KSB8ICgocClbMl0pKQorCisjZGVmaW5lIGh0b24yNChwLCB2KQlkbyB7CQkJXAorCQlwWzBdID0gKCgodikgPj4gMTYpICYgMHhGRik7CVwKKwkJcFsxXSA9ICgoKHYpID4+IDgpICYgMHhGRik7CVwKKwkJcFsyXSA9ICgodikgJiAweEZGKTsJCVwKKwl9IHdoaWxlICgwKQorCisvKgorICogRkMgSEJBIHN0YXR1cworICovCisjZGVmaW5lIEZDX1BBVVNFCQkgICAgKDEgPDwgMSkKKyNkZWZpbmUgRkNfTElOS19VUAkJICAgICgxIDw8IDApCisKK2VudW0gZmNfbHBvcnRfc3RhdGUgeworCUxQT1JUX1NUX05PTkUgPSAwLAorCUxQT1JUX1NUX0ZMT0dJLAorCUxQT1JUX1NUX0ROUywKKwlMUE9SVF9TVF9SUE5fSUQsCisJTFBPUlRfU1RfUkZUX0lELAorCUxQT1JUX1NUX1NDUiwKKwlMUE9SVF9TVF9SRUFEWSwKKwlMUE9SVF9TVF9MT0dPLAorCUxQT1JUX1NUX1JFU0VUCit9OworCitlbnVtIGZjX2Rpc2NfZXZlbnQgeworCURJU0NfRVZfTk9ORSA9IDAsCisJRElTQ19FVl9TVUNDRVNTLAorCURJU0NfRVZfRkFJTEVECit9OworCitlbnVtIGZjX3Jwb3J0X3N0YXRlIHsKKwlSUE9SVF9TVF9OT05FID0gMCwKKwlSUE9SVF9TVF9JTklULAkJLyogaW5pdGlhbGl6ZWQgKi8KKwlSUE9SVF9TVF9QTE9HSSwJCS8qIHdhaXRpbmcgZm9yIFBMT0dJIGNvbXBsZXRpb24gKi8KKwlSUE9SVF9TVF9QUkxJLAkJLyogd2FpdGluZyBmb3IgUFJMSSBjb21wbGV0aW9uICovCisJUlBPUlRfU1RfUlRWLAkJLyogd2FpdGluZyBmb3IgUlRWIGNvbXBsZXRpb24gKi8KKwlSUE9SVF9TVF9SRUFEWSwJCS8qIHJlYWR5IGZvciB1c2UgKi8KKwlSUE9SVF9TVF9MT0dPLAkJLyogcG9ydCBsb2dvdXQgc2VudCAqLworfTsKKworZW51bSBmY19ycG9ydF90cmFuc19zdGF0ZSB7CisJRkNfUE9SVFNUQVRFX1JPR1VFLAorCUZDX1BPUlRTVEFURV9SRUFMLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgZmNfZGlzY19wb3J0IC0gdGVtcG9yYXJ5IGRpc2NvdmVyeSBwb3J0IHRvIGhvbGQgcnBvcnQgaWRlbnRpZmllcnMKKyAqIEBscDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqIEBwZWVyczogbm9kZSBmb3IgbGlzdCBtYW5hZ2VtZW50IGR1cmluZyBkaXNjb3ZlcnkgYW5kIFJTQ04gcHJvY2Vzc2luZworICogQGlkczogaWRlbnRpZmllcnMgc3RydWN0dXJlIHRvIHBhc3MgdG8gZmNfcmVtb3RlX3BvcnRfYWRkKCkKKyAqIEBycG9ydF93b3JrOiB3b3JrIHN0cnVjdCBmb3Igc3RhcnRpbmcgdGhlIHJwb3J0IHN0YXRlIG1hY2hpbmUKKyAqLworc3RydWN0IGZjX2Rpc2NfcG9ydCB7CisJc3RydWN0IGZjX2xwb3J0ICAgICAgICAgICAgICpscDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgcGVlcnM7CisJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIGlkczsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJICAgIHJwb3J0X3dvcms7Cit9OworCitlbnVtIGZjX3Jwb3J0X2V2ZW50IHsKKwlSUE9SVF9FVl9OT05FID0gMCwKKwlSUE9SVF9FVl9DUkVBVEVELAorCVJQT1JUX0VWX0ZBSUxFRCwKKwlSUE9SVF9FVl9TVE9QLAorCVJQT1JUX0VWX0xPR08KK307CisKK3N0cnVjdCBmY19ycG9ydF9vcGVyYXRpb25zIHsKKwl2b2lkICgqZXZlbnRfY2FsbGJhY2spKHN0cnVjdCBmY19scG9ydCAqLCBzdHJ1Y3QgZmNfcnBvcnQgKiwKKwkJCSAgICAgICBlbnVtIGZjX3Jwb3J0X2V2ZW50KTsKK307CisKKy8qKgorICogc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgLSBsaWJmYyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBhIHJlbW90ZSBwb3J0CisgKiBAbG9jYWxfcG9ydDogRmlicmUgQ2hhbm5lbCBob3N0IHBvcnQgaW5zdGFuY2UKKyAqIEBycF9zdGF0ZTogc3RhdGUgdHJhY2tzIHByb2dyZXNzIG9mIFBMT0dJLCBQUkxJLCBhbmQgUlRWIGV4Y2hhbmdlcworICogQGZsYWdzOiBSRUMgYW5kIFJFVFJZIHN1cHBvcnRlZCBmbGFncworICogQG1heF9zZXE6IG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgc2VxdWVuY2VzCisgKiBAcmV0cmllczogcmV0cnkgY291bnQgaW4gY3VycmVudCBzdGF0ZQorICogQGVfZF90b3Y6IGVycm9yIGRldGVjdCB0aW1lb3V0IHZhbHVlIChpbiBtc2VjKQorICogQHJfYV90b3Y6IHJlc291cmNlIGFsbG9jYXRpb24gdGltZW91dCB2YWx1ZSAoaW4gbXNlYykKKyAqIEBycF9tdXRleDogbXV0ZXggcHJvdGVjdHMgcnBvcnQKKyAqIEByZXRyeV93b3JrOgorICogQGV2ZW50X2NhbGxiYWNrOiBDYWxsYmFjayBmb3IgcnBvcnQgUkVBRFksIEZBSUxFRCBvciBMT0dPCisgKi8KK3N0cnVjdCBmY19ycG9ydF9saWJmY19wcml2IHsKKwlzdHJ1Y3QgZmNfbHBvcnQJCSAgICpsb2NhbF9wb3J0OworCWVudW0gZmNfcnBvcnRfc3RhdGUgICAgICAgIHJwX3N0YXRlOworCXUxNgkJCSAgIGZsYWdzOworCSNkZWZpbmUgRkNfUlBfRkxBR1NfUkVDX1NVUFBPUlRFRAkoMSA8PCAwKQorCSNkZWZpbmUgRkNfUlBfRkxBR1NfUkVUUlkJCSgxIDw8IDEpCisJdTE2CQkgICAgICAgICAgIG1heF9zZXE7CisJdW5zaWduZWQgaW50CSAgICAgICAgICAgcmV0cmllczsKKwl1bnNpZ25lZCBpbnQJICAgICAgICAgICBlX2RfdG92OworCXVuc2lnbmVkIGludAkgICAgICAgICAgIHJfYV90b3Y7CisJZW51bSBmY19ycG9ydF90cmFuc19zdGF0ZSAgdHJhbnNfc3RhdGU7CisJc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgcnBfbXV0ZXg7CisJc3RydWN0IGRlbGF5ZWRfd29yawkgICByZXRyeV93b3JrOworCWVudW0gZmNfcnBvcnRfZXZlbnQgICAgICAgIGV2ZW50OworCXN0cnVjdCBmY19ycG9ydF9vcGVyYXRpb25zICpvcHM7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgcGVlcnM7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICAgZXZlbnRfd29yazsKK307CisKKyNkZWZpbmUgUFJJVl9UT19SUE9SVCh4KQkJCQkJCVwKKwkoc3RydWN0IGZjX3Jwb3J0ICopKCh2b2lkICopeCAtIHNpemVvZihzdHJ1Y3QgZmNfcnBvcnQpKTsKKyNkZWZpbmUgUlBPUlRfVE9fUFJJVih4KQkJCQkJCVwKKwkoc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKikoKHZvaWQgKil4ICsgc2l6ZW9mKHN0cnVjdCBmY19ycG9ydCkpOworCitzdHJ1Y3QgZmNfcnBvcnQgKmZjX3Jwb3J0X3JvZ3VlX2NyZWF0ZShzdHJ1Y3QgZmNfZGlzY19wb3J0ICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmNfcnBvcnRfc2V0X25hbWUoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdTY0IHd3cG4sIHU2NCB3d25uKQoreworCXJwb3J0LT5ub2RlX25hbWUgPSB3d25uOworCXJwb3J0LT5wb3J0X25hbWUgPSB3d3BuOworfQorCisvKgorICogZmNvZSBzdGF0cyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGZjb2VfZGV2X3N0YXRzIHsKKwl1NjQJCVNlY29uZHNTaW5jZUxhc3RSZXNldDsKKwl1NjQJCVR4RnJhbWVzOworCXU2NAkJVHhXb3JkczsKKwl1NjQJCVJ4RnJhbWVzOworCXU2NAkJUnhXb3JkczsKKwl1NjQJCUVycm9yRnJhbWVzOworCXU2NAkJRHVtcGVkRnJhbWVzOworCXU2NAkJTGlua0ZhaWx1cmVDb3VudDsKKwl1NjQJCUxvc3NPZlNpZ25hbENvdW50OworCXU2NAkJSW52YWxpZFR4V29yZENvdW50OworCXU2NAkJSW52YWxpZENSQ0NvdW50OworCXU2NAkJSW5wdXRSZXF1ZXN0czsKKwl1NjQJCU91dHB1dFJlcXVlc3RzOworCXU2NAkJQ29udHJvbFJlcXVlc3RzOworCXU2NAkJSW5wdXRNZWdhYnl0ZXM7CisJdTY0CQlPdXRwdXRNZWdhYnl0ZXM7Cit9OworCisvKgorICogZWxzIGRhdGEgaXMgdXNlZCBmb3IgcGFzc2luZyBFTFMgcmVzcG9uZSBzcGVjaWZpYworICogZGF0YSB0byBzZW5kIEVMUyByZXNwb25zZSBtYWlubHkgdXNpbmcgaW5mb21hdGlvbgorICogaW4gZXhjaGFuZ2UgYW5kIHNlcXVlbmNlIGluIEVNIGxheWVyLgorICovCitzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhIHsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCWVudW0gZmNfZWxzX3JqdF9yZWFzb24gcmVhc29uOworCWVudW0gZmNfZWxzX3JqdF9leHBsYW4gZXhwbGFuOworfTsKKworLyoKKyAqIEZDUCByZXF1ZXN0IHN0cnVjdHVyZSwgb25lIGZvciBlYWNoIHNjc2kgY21kIHJlcXVlc3QKKyAqLworc3RydWN0IGZjX2ZjcF9wa3QgeworCS8qCisJICogaG91c2VrZWVwaW5nIHN0dWZmCisJICovCisJc3RydWN0IGZjX2xwb3J0ICpscDsJLyogaGFuZGxlIHRvIGhiYSBzdHJ1Y3QgKi8KKwl1MTYJCXN0YXRlOwkJLyogc2NzaV9wa3Qgc3RhdGUgc3RhdGUgKi8KKwl1MTYJCXRndF9mbGFnczsJLyogdGFyZ2V0IGZsYWdzCSAqLworCWF0b21pY190CXJlZl9jbnQ7CS8qIGZjcCBwa3QgcmVmIGNvdW50ICovCisJc3BpbmxvY2tfdAlzY3NpX3BrdF9sb2NrOwkvKiBNdXN0IGJlIHRha2VuIGJlZm9yZSB0aGUgaG9zdCBsb2NrCisJCQkJCSAqIGlmIGJvdGggYXJlIGhlbGQgYXQgdGhlIHNhbWUgdGltZSAqLworCS8qCisJICogU0NTSSBJL08gcmVsYXRlZCBzdHVmZgorCSAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsJCS8qIHNjc2kgY29tbWFuZCBwb2ludGVyLiBzZXQvY2xlYXIKKwkJCQkJICogdW5kZXIgaG9zdCBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogdHJhY2tzIHF1ZXVlZCBjb21tYW5kcy4gYWNjZXNzIHVuZGVyCisJCQkJCSAqIGhvc3QgbG9jayAqLworCS8qCisJICogdGltZW91dCByZWxhdGVkIHN0dWZmCisJICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIGNvbW1hbmQgdGltZXIgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOworCWludAl3YWl0X2Zvcl9jb21wOworCXVuc2lnbmVkIGxvbmcJc3RhcnRfdGltZTsJLyogc3RhcnQgamlmZmllICovCisJdW5zaWduZWQgbG9uZwllbmRfdGltZTsJLyogZW5kIGppZmZpZSAqLworCXVuc2lnbmVkIGxvbmcJbGFzdF9wa3RfdGltZTsJIC8qIGppZmZpZXMgb2YgbGFzdCBmcmFtZSByZWNlaXZlZCAqLworCisJLyoKKwkgKiBzY3NpIGNtZCBhbmQgZGF0YSB0cmFuc2ZlciBpbmZvcm1hdGlvbgorCSAqLworCXUzMgkJZGF0YV9sZW47CisJLyoKKwkgKiB0cmFuc3BvcnQgcmVsYXRlZCB2ZXJpYWJsZXMKKwkgKi8KKwlzdHJ1Y3QgZmNwX2NtbmQgY2RiX2NtZDsKKwlzaXplX3QJCXhmZXJfbGVuOworCXUzMgkJeGZlcl9jb250aWdfZW5kOyAvKiBvZmZzZXQgb2YgZW5kIG9mIGNvbnRpZ3VvdXMgeGZlciAqLworCXUxNgkJbWF4X3BheWxvYWQ7CS8qIG1heCBwYXlsb2FkIHNpemUgaW4gYnl0ZXMgKi8KKworCS8qCisJICogc2NzaS9mY3AgcmV0dXJuIHN0YXR1cworCSAqLworCXUzMgkJaW9fc3RhdHVzOwkvKiBTQ1NJIHJlc3VsdCB1cHBlciAyNCBiaXRzICovCisJdTgJCWNkYl9zdGF0dXM7CisJdTgJCXN0YXR1c19jb2RlOwkvKiBGQ1AgSS9PIHN0YXR1cyAqLworCS8qIGJpdCAzIFVuZGVycnVuIGJpdCAyOiBvdmVycnVuICovCisJdTgJCXNjc2lfY29tcF9mbGFnczsKKwl1MzIJCXJlcV9mbGFnczsJLyogYml0IDA6IHJlYWQgYml0OjEgd3JpdGUgKi8KKwl1MzIJCXNjc2lfcmVzaWQ7CS8qIHJlc2lkdWxlIGxlbmd0aCAqLworCisJc3RydWN0IGZjX3Jwb3J0CSpycG9ydDsJCS8qIHJlbW90ZSBwb3J0IHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZmNfc2VxCSpzZXFfcHRyOwkvKiBjdXJyZW50IHNlcXVlbmNlIHBvaW50ZXIgKi8KKwkvKgorCSAqIEVycm9yIFByb2Nlc3NpbmcKKwkgKi8KKwl1OAkJcmVjb3ZfcmV0cnk7CS8qIGNvdW50IG9mIHJlY292ZXJ5IHJldHJpZXMgKi8KKwlzdHJ1Y3QgZmNfc2VxCSpyZWNvdl9zZXE7CS8qIHNlcXVlbmNlIGZvciBSRUMgb3IgU1JSICovCit9OworCisvKgorICogU3RydWN0dXJlIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbWFuYWdpbmcgRmlicmUgQ2hhbm5lbCBFeGNoYW5nZXMKKyAqIGFuZCBTZXF1ZW5jZXMKKyAqCisgKiBmY19leGNoIGhvbGRzIHN0YXRlIGZvciBvbmUgZXhjaGFuZ2UgYW5kIGxpbmtzIHRvIGl0cyBhY3RpdmUgc2VxdWVuY2UuCisgKgorICogZmNfc2VxIGhvbGRzIHRoZSBzdGF0ZSBmb3IgYW4gaW5kaXZpZHVhbCBzZXF1ZW5jZS4KKyAqLworCitzdHJ1Y3QgZmNfZXhjaF9tZ3I7CisKKy8qCisgKiBTZXF1ZW5jZS4KKyAqLworc3RydWN0IGZjX3NlcSB7CisJdTgJaWQ7CQkvKiBzZXEgSUQgKi8KKwl1MTYJc3NiX3N0YXQ7CS8qIHN0YXR1cyBmbGFncyBmb3Igc2VxdWVuY2Ugc3RhdHVzIGJsb2NrICovCisJdTE2CWNudDsJCS8qIGZyYW1lcyBzZW50IHNvIGZhciBvbiBzZXF1ZW5jZSAqLworCXUzMglyZWNfZGF0YTsJLyogRkMtNCB2YWx1ZSBmb3IgUkVDICovCit9OworCisjZGVmaW5lIEZDX0VYX0RPTkUJCSgxIDw8IDApIC8qIGVwIGlzIGNvbXBsZXRlZCAqLworI2RlZmluZSBGQ19FWF9SU1RfQ0xFQU5VUAkoMSA8PCAxKSAvKiByZXNldCBpcyBmb3JjaW5nIGNvbXBsZXRpb24gKi8KKworLyoKKyAqIEV4Y2hhbmdlLgorICoKKyAqIExvY2tpbmcgbm90ZXM6IFRoZSBleF9sb2NrIHByb3RlY3RzIGZvbGxvd2luZyBpdGVtczoKKyAqCXN0YXRlLCBlc2Jfc3RhdCwgZl9jdGwsIHNlcS5zc2Jfc3RhdAorICoJc2VxX2lkCisgKglzZXF1ZW5jZSBhbGxvY2F0aW9uCisgKi8KK3N0cnVjdCBmY19leGNoIHsKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3IgKmVtOwkJLyogZXhjaGFuZ2UgbWFuYWdlciAqLworCXUzMgkJc3RhdGU7CQkvKiBpbnRlcm5hbCBkcml2ZXIgc3RhdGUgKi8KKwl1MTYJCXhpZDsJCS8qIG91ciBleGNoYW5nZSBJRCAqLworCXN0cnVjdCBsaXN0X2hlYWQJZXhfbGlzdDsJLyogZnJlZSBvciBidXN5IGxpc3QgbGlua2FnZSAqLworCXNwaW5sb2NrX3QJZXhfbG9jazsJLyogbG9jayBjb3ZlcmluZyBleGNoYW5nZSBzdGF0ZSAqLworCWF0b21pY190CWV4X3JlZmNudDsJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfd29yazsgLyogdGltZXIgZm9yIHVwcGVyIGxldmVsIHByb3RvY29scyAqLworCXN0cnVjdCBmY19scG9ydAkqbHA7CQkvKiBmYyBkZXZpY2UgaW5zdGFuY2UgKi8KKwl1MTYJCW94aWQ7CQkvKiBvcmlnaW5hdG9yJ3MgZXhjaGFuZ2UgSUQgKi8KKwl1MTYJCXJ4aWQ7CQkvKiByZXNwb25kZXIncyBleGNoYW5nZSBJRCAqLworCXUzMgkJb2lkOwkJLyogb3JpZ2luYXRvcidzIEZDSUQgKi8KKwl1MzIJCXNpZDsJCS8qIHNvdXJjZSBGQ0lEICovCisJdTMyCQlkaWQ7CQkvKiBkZXN0aW5hdGlvbiBGQ0lEICovCisJdTMyCQllc2Jfc3RhdDsJLyogZXhjaGFuZ2Ugc3RhdHVzIGZvciBFU0IgKi8KKwl1MzIJCXJfYV90b3Y7CS8qIHJfYV90b3YgZnJvbSBycG9ydCAobXNlYykgKi8KKwl1OAkJc2VxX2lkOwkJLyogbmV4dCBzZXF1ZW5jZSBJRCB0byB1c2UgKi8KKwl1MzIJCWZfY3RsOwkJLyogRl9DVEwgZmxhZ3MgZm9yIHNlcXVlbmNlcyAqLworCXU4CQlmaF90eXBlOwkvKiBmcmFtZSB0eXBlICovCisJZW51bSBmY19jbGFzcwljbGFzczsJCS8qIGNsYXNzIG9mIHNlcnZpY2UgKi8KKwlzdHJ1Y3QgZmNfc2VxCXNlcTsJCS8qIHNpbmdsZSBzZXF1ZW5jZSAqLworCS8qCisJICogSGFuZGxlciBmb3IgcmVzcG9uc2VzIHRvIHRoaXMgY3VycmVudCBleGNoYW5nZS4KKwkgKi8KKwl2b2lkCQkoKnJlc3ApKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosIHZvaWQgKik7CisJdm9pZAkJKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICosIHZvaWQgKik7CisJLyoKKwkgKiBhcmcgaXMgcGFzc2VkIGFzIHZvaWQgcG9pbnRlciB0byBleGNoYW5nZQorCSAqIHJlc3AgYW5kIGRlc3RydWN0b3IgaGFuZGxlcnMKKwkgKi8KKwl2b2lkCQkqYXJnOworfTsKKyNkZWZpbmUJZmNfc2VxX2V4Y2goc3ApIGNvbnRhaW5lcl9vZihzcCwgc3RydWN0IGZjX2V4Y2gsIHNlcSkKKworc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlIHsKKworCS8qKgorCSAqIE1hbmRhdG9yeSBGaWVsZHMKKwkgKgorCSAqIFRoZXNlIGhhbmRsZXJzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIExMRC4KKwkgKi8KKworCS8qCisJICogSW50ZXJmYWNlIHRvIHNlbmQgYSBGQyBmcmFtZQorCSAqLworCWludCAoKmZyYW1lX3NlbmQpKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mcmFtZSAqZnApOworCisJLyoqCisJICogT3B0aW9uYWwgRmllbGRzCisJICoKKwkgKiBUaGUgTExEIG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IGFueSBvZiB0aGUgZm9sbG93aW5nIGhhbmRsZXJzLgorCSAqIElmIExMRCBkb2Vzbid0IHNwZWNpZnkgaGFuZGVyIGFuZCBsZWF2ZXMgaXRzIHBvaW50ZXIgTlVMTCB0aGVuCisJICogdGhlIGRlZmF1bHQgbGliZmMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGZvciB0aGF0IGhhbmRsZXIuCisJICovCisKKwkvKioKKwkgKiBFTFMvQ1QgaW50ZXJmYWNlcworCSAqLworCisJLyoKKwkgKiBlbHNjdF9zZW5kIC0gc2VuZHMgRUxTL0NUIGZyYW1lCisJICovCisJc3RydWN0IGZjX3NlcSAqKCplbHNjdF9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJCSAgICAgc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwKKwkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb3AsCisJCQkJICAgICB2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLAorCQkJCQkgICAgIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJCSAgICAgdm9pZCAqYXJnKSwKKwkJCQkgICAgIHZvaWQgKmFyZywgdTMyIHRpbWVyX21zZWMpOworCS8qKgorCSAqIEV4aGFuY2UgTWFuYWdlciBpbnRlcmZhY2VzCisJICovCisKKwkvKgorCSAqIFNlbmQgdGhlIEZDIGZyYW1lIHBheWxvYWQgdXNpbmcgYSBuZXcgZXhjaGFuZ2UgYW5kIHNlcXVlbmNlLgorCSAqCisJICogVGhlIGZyYW1lIHBvaW50ZXIgd2l0aCBzb21lIG9mIHRoZSBoZWFkZXIncyBmaWVsZHMgbXVzdCBiZQorCSAqIGZpbGxlZCBiZWZvcmUgY2FsbGluZyBleGNoX3NlcV9zZW5kKCksIHRob3NlIGZpZWxkcyBhcmUsCisJICoKKwkgKiAtIHJvdXRpbmcgY29udHJvbAorCSAqIC0gRkMgcG9ydCBkaWQKKwkgKiAtIEZDIHBvcnQgc2lkCisJICogLSBGQyBoZWFkZXIgdHlwZQorCSAqIC0gZnJhbWUgY29udHJvbAorCSAqIC0gcGFyYW1ldGVyIG9yIHJlbGF0aXZlIG9mZnNldAorCSAqCisJICogVGhlIGV4Y2hhbmdlIHJlc3BvbnNlIGhhbmRsZXIgaXMgc2V0IGluIHRoaXMgcm91dGluZSB0byByZXNwKCkKKwkgKiBmdW5jdGlvbiBwb2ludGVyLiBJdCBjYW4gYmUgY2FsbGVkIGluIHR3byBzY2VuYXJpb3M6IGlmIGEgdGltZW91dAorCSAqIG9jY3VycyBvciBpZiBhIHJlc3BvbnNlIGZyYW1lIGlzIHJlY2VpdmVkIGZvciB0aGUgZXhjaGFuZ2UuIFRoZQorCSAqIGZjX2ZyYW1lIHBvaW50ZXIgaW4gcmVzcG9uc2UgaGFuZGxlciB3aWxsIGFsc28gaW5kaWNhdGUgdGltZW91dAorCSAqIGFzIGVycm9yIHVzaW5nIElTX0VSUiByZWxhdGVkIG1hY3Jvcy4KKwkgKgorCSAqIFRoZSBleGNoYW5nZSBkZXN0cnVjdG9yIGhhbmRsZXIgaXMgYWxzbyBzZXQgaW4gdGhpcyByb3V0aW5lLgorCSAqIFRoZSBkZXN0cnVjdG9yIGhhbmRsZXIgaXMgaW52b2tlZCBieSBFTSBsYXllciB3aGVuIGV4Y2hhbmdlCisJICogaXMgYWJvdXQgdG8gZnJlZSwgdGhpcyBjYW4gYmUgdXNlZCBieSBjYWxsZXIgdG8gZnJlZSBpdHMKKwkgKiByZXNvdXJjZXMgYWxvbmcgd2l0aCBleGNoYW5nZSBmcmVlLgorCSAqCisJICogVGhlIGFyZyBpcyBwYXNzZWQgYmFjayB0byByZXNwIGFuZCBkZXN0cnVjdG9yIGhhbmRsZXIuCisJICoKKwkgKiBUaGUgdGltZW91dCB2YWx1ZSAoaW4gbXNlYykgZm9yIGFuIGV4Y2hhbmdlIGlzIHNldCBpZiBub24gemVybworCSAqIHRpbWVyX21zZWMgYXJndW1lbnQgaXMgc3BlY2lmaWVkLiBUaGUgdGltZXIgaXMgY2FuY2VsZWQgd2hlbgorCSAqIGl0IGZpcmVzIG9yIHdoZW4gdGhlIGV4Y2hhbmdlIGlzIGRvbmUuIFRoZSBleGNoYW5nZSB0aW1lb3V0IGhhbmRsZXIKKwkgKiBpcyByZWdpc3RlcmVkIGJ5IEVNIGxheWVyLgorCSAqLworCXN0cnVjdCBmY19zZXEgKigqZXhjaF9zZXFfc2VuZCkoc3RydWN0IGZjX2xwb3J0ICpscCwKKwkJCQkJc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkJdm9pZCAoKnJlc3ApKHN0cnVjdCBmY19zZXEgKnNwLAorCQkJCQkJICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwLAorCQkJCQkJICAgICB2b2lkICphcmcpLAorCQkJCQl2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IGZjX3NlcSAqc3AsCisJCQkJCQkJICAgdm9pZCAqYXJnKSwKKwkJCQkJdm9pZCAqYXJnLCB1bnNpZ25lZCBpbnQgdGltZXJfbXNlYyk7CisKKwkvKgorCSAqIHNlbmQgYSBmcmFtZSB1c2luZyBleGlzdGluZyBzZXF1ZW5jZSBhbmQgZXhjaGFuZ2UuCisJICovCisJaW50ICgqc2VxX3NlbmQpKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19zZXEgKnNwLAorCQkJc3RydWN0IGZjX2ZyYW1lICpmcCk7CisKKwkvKgorCSAqIFNlbmQgRUxTIHJlc3BvbnNlIHVzaW5nIG1haW5seSBpbmZvbWF0aW9uCisJICogaW4gZXhjaGFuZ2UgYW5kIHNlcXVlbmNlIGluIEVNIGxheWVyLgorCSAqLworCXZvaWQgKCpzZXFfZWxzX3JzcF9zZW5kKShzdHJ1Y3QgZmNfc2VxICpzcCwgZW51bSBmY19lbHNfY21kIGVsc19jbWQsCisJCQkJIHN0cnVjdCBmY19zZXFfZWxzX2RhdGEgKmVsc19kYXRhKTsKKworCS8qCisJICogQWJvcnQgYW4gZXhjaGFuZ2UgYW5kIHNlcXVlbmNlLiBHZW5lcmFsbHkgY2FsbGVkIGJlY2F1c2Ugb2YgYQorCSAqIGV4Y2hhbmdlIHRpbWVvdXQgb3IgYW4gYWJvcnQgZnJvbSB0aGUgdXBwZXIgbGF5ZXIuCisJICoKKwkgKiBBIHRpbWVyX21zZWMgY2FuIGJlIHNwZWNpZmllZCBmb3IgYWJvcnQgdGltZW91dCwgaWYgbm9uLXplcm8KKwkgKiB0aW1lcl9tc2VjIHZhbHVlIGlzIHNwZWNpZmllZCB0aGVuIGV4Y2hhbmdlIHJlc3AgaGFuZGxlcgorCSAqIHdpbGwgYmUgY2FsbGVkIHdpdGggdGltZW91dCBlcnJvciBpZiBubyByZXNwb25zZSB0byBhYm9ydC4KKwkgKi8KKwlpbnQgKCpzZXFfZXhjaF9hYm9ydCkoY29uc3Qgc3RydWN0IGZjX3NlcSAqcmVxX3NwLAorCQkJICAgICAgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpOworCisJLyoKKwkgKiBJbmRpY2F0ZSB0aGF0IGFuIGV4Y2hhbmdlL3NlcXVlbmNlIHR1cGxlIGlzIGNvbXBsZXRlIGFuZCB0aGUgbWVtb3J5CisJICogYWxsb2NhdGVkIGZvciB0aGUgcmVsYXRlZCBvYmplY3RzIG1heSBiZSBmcmVlZC4KKwkgKi8KKwl2b2lkICgqZXhjaF9kb25lKShzdHJ1Y3QgZmNfc2VxICpzcCk7CisKKwkvKgorCSAqIEFzc2lnbnMgYSBFTSBhbmQgYSBmcmVlIFhJRCBmb3IgYW4gbmV3IGV4Y2hhbmdlIGFuZCB0aGVuCisJICogYWxsb2NhdGVzIGEgbmV3IGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZSBwYWlyLgorCSAqIFRoZSBmcCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgZnJlZSBYSUQuCisJICovCisJc3RydWN0IGZjX2V4Y2ggKigqZXhjaF9nZXQpKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19mcmFtZSAqZnApOworCisJLyoKKwkgKiBSZWxlYXNlIHByZXZpb3VzbHkgYXNzaWduZWQgWElEIGJ5IGV4Y2hfZ2V0IEFQSS4KKwkgKiBUaGUgTExEIG1heSBpbXBsZW1lbnQgdGhpcyBpZiBYSUQgaXMgYXNzaWduZWQgYnkgTExECisJICogaW4gZXhjaF9nZXQoKS4KKwkgKi8KKwl2b2lkICgqZXhjaF9wdXQpKHN0cnVjdCBmY19scG9ydCAqbHAsIHN0cnVjdCBmY19leGNoX21nciAqbXAsCisJCQkgdTE2IGV4X2lkKTsKKworCS8qCisJICogU3RhcnQgYSBuZXcgc2VxdWVuY2Ugb24gdGhlIHNhbWUgZXhjaGFuZ2Uvc2VxdWVuY2UgdHVwbGUuCisJICovCisJc3RydWN0IGZjX3NlcSAqKCpzZXFfc3RhcnRfbmV4dCkoc3RydWN0IGZjX3NlcSAqc3ApOworCisJLyoKKwkgKiBSZXNldCBhbiBleGNoYW5nZSBtYW5hZ2VyLCBjb21wbGV0aW5nIGFsbCBzZXF1ZW5jZXMgYW5kIGV4Y2hhbmdlcy4KKwkgKiBJZiBzX2lkIGlzIG5vbi16ZXJvLCByZXNldCBvbmx5IGV4Y2hhbmdlcyBvcmlnaW5hdGluZyBmcm9tIHRoYXQgRklELgorCSAqIElmIGRfaWQgaXMgbm9uLXplcm8sIHJlc2V0IG9ubHkgZXhjaGFuZ2VzIHNlbmRpbmcgdG8gdGhhdCBGSUQuCisJICovCisJdm9pZCAoKmV4Y2hfbWdyX3Jlc2V0KShzdHJ1Y3QgZmNfZXhjaF9tZ3IgKiwKKwkJCSAgICAgICB1MzIgc19pZCwgdTMyIGRfaWQpOworCisJdm9pZCAoKnJwb3J0X2ZsdXNoX3F1ZXVlKSh2b2lkKTsKKwkvKioKKwkgKiBMb2NhbCBQb3J0IGludGVyZmFjZXMKKwkgKi8KKworCS8qCisJICogUmVjZWl2ZSBhIGZyYW1lIHRvIGEgbG9jYWwgcG9ydC4KKwkgKi8KKwl2b2lkICgqbHBvcnRfcmVjdikoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX3NlcSAqc3AsCisJCQkgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKKworCWludCAoKmxwb3J0X3Jlc2V0KShzdHJ1Y3QgZmNfbHBvcnQgKik7CisKKwkvKioKKwkgKiBSZW1vdGUgUG9ydCBpbnRlcmZhY2VzCisJICovCisKKwkvKgorCSAqIEluaXRpYXRlcyB0aGUgUlAgc3RhdGUgbWFjaGluZS4gSXQgaXMgY2FsbGVkIGZyb20gdGhlIExQIG1vZHVsZS4KKwkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byB0aGUgTl9Qb3J0CisJICogaWRlbnRpZmllZCBieSB0aGUgRkMgSUQgcHJvdmlkZWQuCisJICoKKwkgKiAtIFBMT0dJCisJICogLSBQUkxJCisJICogLSBSVFYKKwkgKi8KKwlpbnQgKCpycG9ydF9sb2dpbikoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCk7CisKKwkvKgorCSAqIExvZ29mZiwgYW5kIHJlbW92ZSB0aGUgcnBvcnQgZnJvbSB0aGUgdHJhbnNwb3J0IGlmCisJICogaXQgaGFkIGJlZW4gYWRkZWQuIFRoaXMgd2lsbCBzZW5kIGEgTE9HTyB0byB0aGUgdGFyZ2V0LgorCSAqLworCWludCAoKnJwb3J0X2xvZ29mZikoc3RydWN0IGZjX3Jwb3J0ICpycG9ydCk7CisKKwkvKgorCSAqIFJlY2lldmUgYSByZXF1ZXN0IGZyb20gYSByZW1vdGUgcG9ydC4KKwkgKi8KKwl2b2lkICgqcnBvcnRfcmVjdl9yZXEpKHN0cnVjdCBmY19zZXEgKiwgc3RydWN0IGZjX2ZyYW1lICosCisJCQkgICAgICAgc3RydWN0IGZjX3Jwb3J0ICopOworCisJc3RydWN0IGZjX3Jwb3J0ICooKnJwb3J0X2xvb2t1cCkoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICosIHUzMik7CisKKwkvKioKKwkgKiBGQ1AgaW50ZXJmYWNlcworCSAqLworCisJLyoKKwkgKiBTZW5kIGEgZmNwIGNtZCBmcm9tIGZzcCBwa3QuCisJICogQ2FsbGVkIHdpdGggdGhlIFNDU0kgaG9zdCBsb2NrIHVubG9ja2VkIGFuZCBpcnFzIGRpc2FibGVkLgorCSAqCisJICogVGhlIHJlc3AgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiBGQ1BfUlNQIHJlY2VpdmVkLgorCSAqCisJICovCisJaW50ICgqZmNwX2NtZF9zZW5kKShzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZmNwX3BrdCAqZnNwLAorCQkJICAgIHZvaWQgKCpyZXNwKShzdHJ1Y3QgZmNfc2VxICosIHN0cnVjdCBmY19mcmFtZSAqZnAsCisJCQkJCSB2b2lkICphcmcpKTsKKworCS8qCisJICogVXNlZCBhdCBsZWFzdCBkdXJyaW5nIGxpbmtkb3duIGFuZCByZXNldAorCSAqLworCXZvaWQgKCpmY3BfY2xlYW51cCkoc3RydWN0IGZjX2xwb3J0ICpscCk7CisKKwkvKgorCSAqIEFib3J0IGFsbCBJL08gb24gYSBsb2NhbCBwb3J0CisJICovCisJdm9pZCAoKmZjcF9hYm9ydF9pbykoc3RydWN0IGZjX2xwb3J0ICpscCk7CisKKwkvKioKKwkgKiBEaXNjb3ZlcnkgaW50ZXJmYWNlcworCSAqLworCisJdm9pZCAoKmRpc2NfcmVjdl9yZXEpKHN0cnVjdCBmY19zZXEgKiwKKwkJCSAgICAgIHN0cnVjdCBmY19mcmFtZSAqLCBzdHJ1Y3QgZmNfbHBvcnQgKik7CisKKwkvKgorCSAqIFN0YXJ0IGRpc2NvdmVyeSBmb3IgYSBsb2NhbCBwb3J0LgorCSAqLworCXZvaWQgKCpkaXNjX3N0YXJ0KSh2b2lkICgqZGlzY19jYWxsYmFjaykoc3RydWN0IGZjX2xwb3J0ICosCisJCQkJCQkgZW51bSBmY19kaXNjX2V2ZW50KSwKKwkJCSAgIHN0cnVjdCBmY19scG9ydCAqKTsKKworCS8qCisJICogU3RvcCBkaXNjb3ZlcnkgZm9yIGEgZ2l2ZW4gbHBvcnQuIFRoaXMgd2lsbCByZW1vdmUKKwkgKiBhbGwgZGlzY292ZXJlZCBycG9ydHMKKwkgKi8KKwl2b2lkICgqZGlzY19zdG9wKSAoc3RydWN0IGZjX2xwb3J0ICopOworCisJLyoKKwkgKiBTdG9wIGRpc2NvdmVyeSBmb3IgYSBnaXZlbiBscG9ydC4gVGhpcyB3aWxsIGJsb2NrCisJICogdW50aWwgYWxsIGRpc2NvdmVyZWQgcnBvcnRzIGFyZSBkZWxldGVkIGZyb20gdGhlCisJICogRkMgdHJhbnNwb3J0IGNsYXNzCisJICovCisJdm9pZCAoKmRpc2Nfc3RvcF9maW5hbCkgKHN0cnVjdCBmY19scG9ydCAqKTsKK307CisKKy8qIGluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIGRpc2NvdmVyeSBsYXllciAqLworc3RydWN0IGZjX2Rpc2MgeworCXVuc2lnbmVkIGNoYXIJCXJldHJ5X2NvdW50OworCXVuc2lnbmVkIGNoYXIJCWRlbGF5OworCXVuc2lnbmVkIGNoYXIJCXBlbmRpbmc7CisJdW5zaWduZWQgY2hhcgkJcmVxdWVzdGVkOworCXVuc2lnbmVkIHNob3J0CQlzZXFfY291bnQ7CisJdW5zaWduZWQgY2hhcgkJYnVmX2xlbjsKKwllbnVtIGZjX2Rpc2NfZXZlbnQJZXZlbnQ7CisKKwl2b2lkICgqZGlzY19jYWxsYmFjaykoc3RydWN0IGZjX2xwb3J0ICosCisJCQkgICAgICBlbnVtIGZjX2Rpc2NfZXZlbnQpOworCisJc3RydWN0IGxpc3RfaGVhZAkgcnBvcnRzOworCXN0cnVjdCBmY19scG9ydAkJKmxwb3J0OworCXN0cnVjdCBtdXRleAkJZGlzY19tdXRleDsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AJcGFydGlhbF9idWY7CS8qIHBhcnRpYWwgbmFtZSBidWZmZXIgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWRpc2Nfd29yazsKK307CisKK3N0cnVjdCBmY19scG9ydCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyogQXNzb2NpYXRpb25zICovCisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKwlzdHJ1Y3QgZmNfZXhjaF9tZ3IJKmVtcDsKKwlzdHJ1Y3QgZmNfcnBvcnQJCSpkbnNfcnA7CisJc3RydWN0IGZjX3Jwb3J0CQkqcHRwX3JwOworCXZvaWQJCQkqc2NzaV9wcml2OworCXN0cnVjdCBmY19kaXNjICAgICAgICAgIGRpc2M7CisKKwkvKiBPcGVyYXRpb25hbCBJbmZvcm1hdGlvbiAqLworCXN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSB0dDsKKwl1MTYJCQlsaW5rX3N0YXR1czsKKwllbnVtIGZjX2xwb3J0X3N0YXRlCXN0YXRlOworCXVuc2lnbmVkIGxvbmcJCWJvb3RfdGltZTsKKworCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgaG9zdF9zdGF0czsKKwlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMJKmRldl9zdGF0c1tOUl9DUFVTXTsKKwl1NjQJCQl3d3BuOworCXU2NAkJCXd3bm47CisJdTgJCQlyZXRyeV9jb3VudDsKKworCS8qIENhcGFiaWxpdGllcyAqLworCXUzMgkJCXNnX3N1cHA6MTsJLyogc2NhdHRlciBnYXRoZXIgc3VwcG9ydGVkICovCisJdTMyCQkJc2VxX29mZmxvYWQ6MTsJLyogc2VxIG9mZmxvYWQgc3VwcG9ydGVkICovCisJdTMyCQkJY3JjX29mZmxvYWQ6MTsJLyogY3JjIG9mZmxvYWQgc3VwcG9ydGVkICovCisJdTMyCQkJbHJvX2VuYWJsZWQ6MTsJLyogbGFyZ2UgcmVjZWl2ZSBvZmZsb2FkICovCisJdTMyCQkJbWZzOwkgICAgICAgIC8qIG1heCBGQyBwYXlsb2FkIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQJCXNlcnZpY2VfcGFyYW1zOworCXVuc2lnbmVkIGludAkJZV9kX3RvdjsKKwl1bnNpZ25lZCBpbnQJCXJfYV90b3Y7CisJdTgJCQltYXhfcmV0cnlfY291bnQ7CisJdTE2CQkJbGlua19zcGVlZDsKKwl1MTYJCQlsaW5rX3N1cHBvcnRlZF9zcGVlZHM7CisJdTE2CQkJbHJvX3hpZDsJLyogbWF4IHhpZCBmb3IgZmNvZSBscm8gKi8KKwlzdHJ1Y3QgZmNfbnNfZnRzCWZjdHM7CSAgICAgICAgLyogRkMtNCB0eXBlIG1hc2tzICovCisJc3RydWN0IGZjX2Vsc19ybmlkX2dlbglybmlkX2dlbjsJLyogUk5JRCBpbmZvcm1hdGlvbiAqLworCisJLyogU2VtYXBob3JlcyAqLworCXN0cnVjdCBtdXRleCBscF9tdXRleDsKKworCS8qIE1pc2NlbGxhbmVvdXMgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXJldHJ5X3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yawlkaXNjX3dvcms7Cit9OworCisvKioKKyAqIEZDX0xQT1JUIEhFTFBFUiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbHBvcnRfcHJpdihjb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCXJldHVybiAodm9pZCAqKShscCArIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmY19scG9ydF90ZXN0X3JlYWR5KHN0cnVjdCBmY19scG9ydCAqbHApCit7CisJcmV0dXJuIGxwLT5zdGF0ZSA9PSBMUE9SVF9TVF9SRUFEWTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZjX3NldF93d25uKHN0cnVjdCBmY19scG9ydCAqbHAsIHU2NCB3d25uKQoreworCWxwLT53d25uID0gd3dubjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZjX3NldF93d3BuKHN0cnVjdCBmY19scG9ydCAqbHAsIHU2NCB3d25uKQoreworCWxwLT53d3BuID0gd3dubjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZjX2xwb3J0X3N0YXRlX2VudGVyKHN0cnVjdCBmY19scG9ydCAqbHAsCisJCQkJCWVudW0gZmNfbHBvcnRfc3RhdGUgc3RhdGUpCit7CisJaWYgKHN0YXRlICE9IGxwLT5zdGF0ZSkKKwkJbHAtPnJldHJ5X2NvdW50ID0gMDsKKwlscC0+c3RhdGUgPSBzdGF0ZTsKK30KKworCisvKioKKyAqIExPQ0FMIFBPUlQgTEFZRVIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmY19scG9ydF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHApOworCisvKgorICogRGVzdHJveSB0aGUgc3BlY2lmaWVkIGxvY2FsIHBvcnQgYnkgZmluZGluZyBhbmQgZnJlZWluZyBhbGwKKyAqIGZjX3Jwb3J0cyBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHRoZW4gYnkgZnJlZWluZyB0aGUgZmNfbHBvcnQKKyAqIGl0c2VsZi4KKyAqLworaW50IGZjX2xwb3J0X2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscCk7CisKKy8qCisgKiBMb2dvdXQgdGhlIHNwZWNpZmllZCBsb2NhbCBwb3J0IGZyb20gdGhlIGZhYnJpYworICovCitpbnQgZmNfZmFicmljX2xvZ29mZihzdHJ1Y3QgZmNfbHBvcnQgKmxwKTsKKworLyoKKyAqIEluaXRpYXRlIHRoZSBMUCBzdGF0ZSBtYWNoaW5lLiBUaGlzIGhhbmRsZXIgd2lsbCB1c2UgZmNfaG9zdF9hdHRyCisgKiB0byBzdG9yZSB0aGUgRkxPR0kgc2VydmljZSBwYXJhbWV0ZXJzLCBzbyBmY19ob3N0X2F0dHIgbXVzdCBiZQorICogaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBoYW5kbGVyLgorICovCitpbnQgZmNfZmFicmljX2xvZ2luKHN0cnVjdCBmY19scG9ydCAqbHApOworCisvKgorICogVGhlIGxpbmsgaXMgdXAgZm9yIHRoZSBnaXZlbiBsb2NhbCBwb3J0LgorICovCit2b2lkIGZjX2xpbmt1cChzdHJ1Y3QgZmNfbHBvcnQgKik7CisKKy8qCisgKiBMaW5rIGlzIGRvd24gZm9yIHRoZSBnaXZlbiBsb2NhbCBwb3J0LgorICovCit2b2lkIGZjX2xpbmtkb3duKHN0cnVjdCBmY19scG9ydCAqKTsKKworLyoKKyAqIFBhdXNlIGFuZCB1bnBhdXNlIHRyYWZmaWMuCisgKi8KK3ZvaWQgZmNfcGF1c2Uoc3RydWN0IGZjX2xwb3J0ICopOwordm9pZCBmY191bnBhdXNlKHN0cnVjdCBmY19scG9ydCAqKTsKKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgbG9jYWwgcG9ydC4KKyAqLworaW50IGZjX2xwb3J0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKik7CisKKy8qCisgKiBSZXNldCB0aGUgbG9jYWwgcG9ydC4KKyAqLworaW50IGZjX2xwb3J0X3Jlc2V0KHN0cnVjdCBmY19scG9ydCAqKTsKKworLyoKKyAqIFNldCB0aGUgbWZzIG9yIHJlc2V0CisgKi8KK2ludCBmY19zZXRfbWZzKHN0cnVjdCBmY19scG9ydCAqbHAsIHUzMiBtZnMpOworCisKKy8qKgorICogUkVNT1RFIFBPUlQgTEFZRVIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmY19ycG9ydF9pbml0KHN0cnVjdCBmY19scG9ydCAqbHApOwordm9pZCBmY19ycG9ydF90ZXJtaW5hdGVfaW8oc3RydWN0IGZjX3Jwb3J0ICpycCk7CisKKy8qKgorICogRElTQ09WRVJZIExBWUVSCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmNfZGlzY19pbml0KHN0cnVjdCBmY19scG9ydCAqbHApOworCisKKy8qKgorICogU0NTSSBMQVlFUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEluaXRpYWxpemUgdGhlIFNDU0kgYmxvY2sgb2YgbGliZmMKKyAqLworaW50IGZjX2ZjcF9pbml0KHN0cnVjdCBmY19scG9ydCAqKTsKKworLyoKKyAqIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBhbiBBUEkgd2hpY2ggYWxsb3dzIGRpcmVjdCBpbnRlcmFjdGlvbgorICogd2l0aCB0aGUgU0NTSS1tbC4gRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgc2F0aXNmaWVzIGEgZnVuY3Rpb24KKyAqIHBvaW50ZXIgZGVmaW5lZCBpbiBTY3NpX0hvc3QgYW5kIHRoZXJlZm9yZSBpcyBhbHdheXMgY2FsbGVkCisgKiBkaXJlY3RseSBmcm9tIHRoZSBTQ1NJLW1sLgorICovCitpbnQgZmNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCwKKwkJICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKKworLyoKKyAqIGNvbXBsZXRlIHByb2Nlc3Npbmcgb2YgYSBmY3AgcGFja2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgaWYgYSBmc3AgdGltZXIgaXMgcGVuZGluZy4KKyAqIFRoZSBob3N0IGxvY2sgbXVzdCBub3QgYmUgaGVsZCBieSBjYWxsZXIuCisgKi8KK3ZvaWQgZmNfZmNwX2NvbXBsZXRlKHN0cnVjdCBmY19mY3BfcGt0ICpmc3ApOworCisvKgorICogU2VuZCBhbiBBQlRTIGZyYW1lIHRvIHRoZSB0YXJnZXQgZGV2aWNlLiBUaGUgc2NfY21kIGFyZ3VtZW50CisgKiBpcyBhIHBvaW50ZXIgdG8gdGhlIFNDU0kgY29tbWFuZCB0byBiZSBhYm9ydGVkLgorICovCitpbnQgZmNfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKTsKKworLyoKKyAqIFJlc2V0IGEgTFVOIGJ5IHNlbmRpbmcgc2VuZCB0aGUgdG0gY21kIHRvIHRoZSB0YXJnZXQuCisgKi8KK2ludCBmY19laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKTsKKworLyoKKyAqIFJlc2V0IHRoZSBob3N0IGFkYXB0ZXIuCisgKi8KK2ludCBmY19laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCk7CisKKy8qCisgKiBDaGVjayBycG9ydCBzdGF0dXMuCisgKi8KK2ludCBmY19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworCisvKgorICogQWRqdXN0IHRoZSBxdWV1ZSBkZXB0aC4KKyAqLworaW50IGZjX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpOworCisvKgorICogQ2hhbmdlIHRoZSB0YWcgdHlwZS4KKyAqLworaW50IGZjX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRhZ190eXBlKTsKKworLyoKKyAqIEZyZWUgbWVtb3J5IHBvb2xzIHVzZWQgYnkgdGhlIEZDUCBsYXllci4KKyAqLwordm9pZCBmY19mY3BfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKik7CisKKy8qKgorICogRUxTL0NUIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEluaXRpYWxpemVzIEVMUy9DVCBpbnRlcmZhY2UKKyAqLworaW50IGZjX2Vsc2N0X2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCk7CisKKworLyoqCisgKiBFWENIQU5HRSBNQU5BR0VSIExBWUVSCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5pdGlhbGl6ZXMgRXhjaGFuZ2UgTWFuYWdlciByZWxhdGVkCisgKiBmdW5jdGlvbiBwb2ludGVycyBpbiBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUuCisgKi8KK2ludCBmY19leGNoX2luaXQoc3RydWN0IGZjX2xwb3J0ICpscCk7CisKKy8qCisgKiBBbGxvY2F0ZXMgYW4gRXhjaGFuZ2UgTWFuYWdlciAoRU0pLgorICoKKyAqIFRoZSBFTSBtYW5hZ2VzIGV4Y2hhbmdlcyBmb3IgdGhlaXIgYWxsb2NhdGlvbiBhbmQKKyAqIGZyZWUsIGFsc28gYWxsb3dzIGV4Y2hhbmdlIGxvb2t1cCBmb3IgcmVjZWl2ZWQKKyAqIGZyYW1lLgorICoKKyAqIFRoZSBjbGFzcyBpcyB1c2VkIGZvciBpbml0aWFsaXppbmcgRkMgY2xhc3Mgb2YKKyAqIGFsbG9jYXRlZCBleGNoYW5nZSBmcm9tIEVNLgorICoKKyAqIFRoZSBtaW5feGlkIGFuZCBtYXhfeGlkIHdpbGwgbGltaXQgbmV3CisgKiBleGNoYW5nZSBJRCAoWElEKSB3aXRoaW4gdGhpcyByYW5nZSBmb3IKKyAqIGEgbmV3IGV4Y2hhbmdlLgorICogVGhlIExMRCBtYXkgY2hvb3NlIHRvIGhhdmUgbXVsdGlwbGUgRU1zLAorICogZS5nLiBvbmUgRU0gaW5zdGFuY2UgcGVyIENQVSByZWNlaXZlIHRocmVhZCBpbiBMTEQuCisgKiBUaGUgTExEIGNhbiB1c2UgZXhjaF9nZXQoKSBvZiBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUKKyAqIHRvIHNwZWNpZnkgWElEIGZvciBhIG5ldyBleGNoYW5nZSB3aXRoaW4KKyAqIGEgc3BlY2lmaWVkIEVNIGluc3RhbmNlLgorICoKKyAqIFRoZSBlbV9pZHggdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gRU0gaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBmY19leGNoX21nciAqZmNfZXhjaF9tZ3JfYWxsb2Moc3RydWN0IGZjX2xwb3J0ICpscCwKKwkJCQkgICAgICBlbnVtIGZjX2NsYXNzIGNsYXNzLAorCQkJCSAgICAgIHUxNiBtaW5feGlkLAorCQkJCSAgICAgIHUxNiBtYXhfeGlkKTsKKworLyoKKyAqIEZyZWUgYW4gZXhjaGFuZ2UgbWFuYWdlci4KKyAqLwordm9pZCBmY19leGNoX21ncl9mcmVlKHN0cnVjdCBmY19leGNoX21nciAqbXApOworCisvKgorICogUmVjZWl2ZSBhIGZyYW1lIG9uIHNwZWNpZmllZCBsb2NhbCBwb3J0IGFuZCBleGNoYW5nZSBtYW5hZ2VyLgorICovCit2b2lkIGZjX2V4Y2hfcmVjdihzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZXhjaF9tZ3IgKm1wLAorCQkgIHN0cnVjdCBmY19mcmFtZSAqZnApOworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZXhjaF9zZXFfc2VuZCBmdW5jdGlvbiBwb2ludGVyIGluCisgKiBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUsIHNlZSBjb21tZW50IGJsb2NrIG9uCisgKiBleGNoX3NlcV9zZW5kIGZvciBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICovCitzdHJ1Y3QgZmNfc2VxICpmY19leGNoX3NlcV9zZW5kKHN0cnVjdCBmY19scG9ydCAqbHAsCisJCQkJc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQl2b2lkICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqc3AsCisJCQkJCSAgICAgc3RydWN0IGZjX2ZyYW1lICpmcCwKKwkJCQkJICAgICB2b2lkICphcmcpLAorCQkJCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgZmNfc2VxICpzcCwKKwkJCQkJCSAgIHZvaWQgKmFyZyksCisJCQkJdm9pZCAqYXJnLCB1MzIgdGltZXJfbXNlYyk7CisKKy8qCisgKiBzZW5kIGEgZnJhbWUgdXNpbmcgZXhpc3Rpbmcgc2VxdWVuY2UgYW5kIGV4Y2hhbmdlLgorICovCitpbnQgZmNfc2VxX3NlbmQoc3RydWN0IGZjX2xwb3J0ICpscCwgc3RydWN0IGZjX3NlcSAqc3AsIHN0cnVjdCBmY19mcmFtZSAqZnApOworCisvKgorICogU2VuZCBFTFMgcmVzcG9uc2UgdXNpbmcgbWFpbmx5IGluZm9tYXRpb24KKyAqIGluIGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZSBpbiBFTSBsYXllci4KKyAqLwordm9pZCBmY19zZXFfZWxzX3JzcF9zZW5kKHN0cnVjdCBmY19zZXEgKnNwLCBlbnVtIGZjX2Vsc19jbWQgZWxzX2NtZCwKKwkJCSBzdHJ1Y3QgZmNfc2VxX2Vsc19kYXRhICplbHNfZGF0YSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBzZXFfZXhjaF9hYm9ydCBmdW5jdGlvbiBwb2ludGVyIGluCisgKiBzdHJ1Y3QgbGliZmNfZnVuY3Rpb25fdGVtcGxhdGUsIHNlZSBjb21tZW50IGJsb2NrIG9uCisgKiBzZXFfZXhjaF9hYm9ydCBmb3IgZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IGZjX3NlcV9leGNoX2Fib3J0KGNvbnN0IHN0cnVjdCBmY19zZXEgKnJlcV9zcCwgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpOworCisvKgorICogSW5kaWNhdGUgdGhhdCBhbiBleGNoYW5nZS9zZXF1ZW5jZSB0dXBsZSBpcyBjb21wbGV0ZSBhbmQgdGhlIG1lbW9yeQorICogYWxsb2NhdGVkIGZvciB0aGUgcmVsYXRlZCBvYmplY3RzIG1heSBiZSBmcmVlZC4KKyAqLwordm9pZCBmY19leGNoX2RvbmUoc3RydWN0IGZjX3NlcSAqc3ApOworCisvKgorICogQXNzaWducyBhIEVNIGFuZCBYSUQgZm9yIGEgZnJhbWUgYW5kIHRoZW4gYWxsb2NhdGVzCisgKiBhIG5ldyBleGNoYW5nZSBhbmQgc2VxdWVuY2UgcGFpci4KKyAqIFRoZSBmcCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgZnJlZSBYSUQuCisgKi8KK3N0cnVjdCBmY19leGNoICpmY19leGNoX2dldChzdHJ1Y3QgZmNfbHBvcnQgKmxwLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKTsKKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGV4Y2hhbmdlIGFuZCBzZXF1ZW5jZSBwYWlyLgorICogaWYgZXhfaWQgaXMgemVybyB0aGVuIG5leHQgZnJlZSBleGNoYW5nZSBpZAorICogZnJvbSBzcGVjaWZpZWQgZXhjaGFuZ2UgbWFuZ2VyIG1wIHdpbGwgYmUgYXNzaWduZWQuCisgKi8KK3N0cnVjdCBmY19leGNoICpmY19leGNoX2FsbG9jKHN0cnVjdCBmY19leGNoX21nciAqbXAsCisJCQkgICAgICBzdHJ1Y3QgZmNfZnJhbWUgKmZwLCB1MTYgZXhfaWQpOworLyoKKyAqIFN0YXJ0IGEgbmV3IHNlcXVlbmNlIG9uIHRoZSBzYW1lIGV4Y2hhbmdlIGFzIHRoZSBzdXBwbGllZCBzZXF1ZW5jZS4KKyAqLworc3RydWN0IGZjX3NlcSAqZmNfc2VxX3N0YXJ0X25leHQoc3RydWN0IGZjX3NlcSAqc3ApOworCisvKgorICogUmVzZXQgYW4gZXhjaGFuZ2UgbWFuYWdlciwgY29tcGxldGluZyBhbGwgc2VxdWVuY2VzIGFuZCBleGNoYW5nZXMuCisgKiBJZiBzX2lkIGlzIG5vbi16ZXJvLCByZXNldCBvbmx5IGV4Y2hhbmdlcyBvcmlnaW5hdGluZyBmcm9tIHRoYXQgRklELgorICogSWYgZF9pZCBpcyBub24temVybywgcmVzZXQgb25seSBleGNoYW5nZXMgc2VuZGluZyB0byB0aGF0IEZJRC4KKyAqLwordm9pZCBmY19leGNoX21ncl9yZXNldChzdHJ1Y3QgZmNfZXhjaF9tZ3IgKiwgdTMyIHNfaWQsIHUzMiBkX2lkKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgZmNfZnVuY3Rpb25zX3RlbXBsYXRlCisgKi8KK3ZvaWQgZmNfZ2V0X2hvc3Rfc3BlZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwordm9pZCBmY19nZXRfaG9zdF9wb3J0X3R5cGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwordm9pZCBmY19nZXRfaG9zdF9wb3J0X3N0YXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK3ZvaWQgZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHUzMiB0aW1lb3V0KTsKK3N0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmZjX2dldF9ob3N0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKy8qCisgKiBtb2R1bGUgc2V0dXAgZnVuY3Rpb25zLgorICovCitpbnQgZmNfc2V0dXBfZXhjaF9tZ3Iodm9pZCk7Cit2b2lkIGZjX2Rlc3Ryb3lfZXhjaF9tZ3Iodm9pZCk7CitpbnQgZmNfc2V0dXBfcnBvcnQodm9pZCk7Cit2b2lkIGZjX2Rlc3Ryb3lfcnBvcnQodm9pZCk7CisKKyNlbmRpZiAvKiBfTElCRkNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJmY29lLmggYi9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogTWFpbnRhaW5lZCBhdCB3d3cuT3Blbi1GQ29FLm9yZworICovCisKKyNpZm5kZWYgX0xJQkZDT0VfSAorI2RlZmluZSBfTElCRkNPRV9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2Zjb2UuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CisKKy8qCisgKiB0aGlzIHBlcmNwdSBzdHJ1Y3QgZm9yIGZjb2UKKyAqLworc3RydWN0IGZjb2VfcGVyY3B1X3MgeworCWludAkJY3B1OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCBza19idWZmX2hlYWQgZmNvZV9yeF9saXN0OworCXN0cnVjdCBwYWdlICpjcmNfZW9mX3BhZ2U7CisJaW50IGNyY19lb2Zfb2Zmc2V0OworfTsKKworLyoKKyAqIHRoZSBmY29lIHN3IHRyYW5zcG9ydCBwcml2YXRlIGRhdGEKKyAqLworc3RydWN0IGZjb2Vfc29mdGMgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwOworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7CQkvKiBkZXZpY2Ugd2l0aCBldGh0b29sX29wcyAqLworCXN0cnVjdCBwYWNrZXRfdHlwZSAgZmNvZV9wYWNrZXRfdHlwZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZjb2VfcGVuZGluZ19xdWV1ZTsKKworCXU4IGRlc3RfYWRkcltFVEhfQUxFTl07CisJdTggY3RsX3NyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkYXRhX3NyY19hZGRyW0VUSF9BTEVOXTsKKwkvKgorCSAqIGZjb2UgcHJvdG9jb2wgYWRkcmVzcyBsZWFybmluZyByZWxhdGVkIHN0dWZmCisJICovCisJdTE2IGZsb2dpX294aWQ7CisJdTggZmxvZ2lfcHJvZ3Jlc3M7CisJdTggYWRkcmVzc19tb2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmNvZV9zb2Z0YyAqZmNvZV9zb2Z0YygKKwljb25zdCBzdHJ1Y3QgZmNfbHBvcnQgKmxwKQoreworCXJldHVybiAoc3RydWN0IGZjb2Vfc29mdGMgKilscG9ydF9wcml2KGxwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqZmNvZV9uZXRkZXYoCisJY29uc3Qgc3RydWN0IGZjX2xwb3J0ICpscCkKK3sKKwlyZXR1cm4gZmNvZV9zb2Z0YyhscCktPnJlYWxfZGV2OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmY29lX2hkciAqc2tiX2Zjb2VfaGVhZGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgZmNvZV9oZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tiX2Zjb2Vfb2Zmc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9uZXR3b3JrX29mZnNldChza2IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKnNrYl9mY19oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2JfZmNfb2Zmc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfZmNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgKworCQkJCSBzaXplb2Yoc3RydWN0IGZjb2VfaGRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZmNfaXNfZGF0YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2JfZmNfaGVhZGVyKHNrYiktPmZoX3JfY3RsID09IEZDX1JDVExfRERfU09MX0RBVEE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZmNfaXNfY21kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9mY19oZWFkZXIoc2tiKS0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9ERF9VTlNPTF9DTUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZmNfaGFzX2V4dGhkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc2tiX2ZjX2hlYWRlcihza2IpLT5maF9yX2N0bCA9PSBGQ19SQ1RMX1ZGVEgpIHx8CisJICAgIChza2JfZmNfaGVhZGVyKHNrYiktPmZoX3JfY3RsID09IEZDX1JDVExfSUZSSCkgfHwKKwkgICAgKHNrYl9mY19oZWFkZXIoc2tiKS0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9FTkNIKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHNrYl9mY19pc19yb2ZmKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9mY19oZWFkZXIoc2tiKS0+ZmhfZl9jdGxbMl0gJiBGQ19GQ19SRUxfT0ZGOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBza2JfZmNfb3hpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBiZTE2X3RvX2NwdShza2JfZmNfaGVhZGVyKHNrYiktPmZoX294X2lkKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgc2tiX2ZjX3J4aWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gYmUxNl90b19jcHUoc2tiX2ZjX2hlYWRlcihza2IpLT5maF9yeF9pZCk7Cit9CisKKy8qIEZJWE1FIC0gRE1BX0JJRElSRUNUSU9OQUwgPyAqLworI2RlZmluZSBza2JfY2Ioc2tiKQkoKHN0cnVjdCBmY29lX3Jjdl9pbmZvICopJigoc2tiKS0+Y2JbMF0pKQorI2RlZmluZSBza2JfY21kKHNrYikJKHNrYl9jYihza2IpLT5mcl9jbWQpCisjZGVmaW5lIHNrYl9kaXIoc2tiKQkoc2tiX2NtZChza2IpLT5zY19kYXRhX2RpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZmNfaXNfcmVhZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2JfZmNfaXNfY21kKHNrYikgJiYgc2tiX2NtZChza2IpKQorCQlyZXR1cm4gc2tiX2Rpcihza2IpID09IERNQV9GUk9NX0RFVklDRTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2JfZmNfaXNfd3JpdGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiX2ZjX2lzX2NtZChza2IpICYmIHNrYl9jbWQoc2tiKSkKKwkJcmV0dXJuIHNrYl9kaXIoc2tiKSA9PSBETUFfVE9fREVWSUNFOworCXJldHVybiBmYWxzZTsKK30KKworLyogbGliZmNvZSBmdW5jcyAqLworaW50IGZjb2VfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwordTY0IGZjb2Vfd3duX2Zyb21fbWFjKHVuc2lnbmVkIGNoYXIgbWFjW01BWF9BRERSX0xFTl0sCisJCSAgICAgIHVuc2lnbmVkIGludCBzY2hlbWUsIHVuc2lnbmVkIGludCBwb3J0KTsKKwordTMyIGZjb2VfZmNfY3JjKHN0cnVjdCBmY19mcmFtZSAqZnApOworaW50IGZjb2VfeG1pdChzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGZjX2ZyYW1lICopOworaW50IGZjb2VfcmN2KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosCisJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK2ludCBmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCh2b2lkICphcmcpOwordm9pZCBmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoc3RydWN0IGZjX2xwb3J0ICpscCk7Cit2b2lkIGZjb2VfcGVyY3B1X2NsZWFuKHN0cnVjdCBmY19scG9ydCAqbHApOwordm9pZCBmY29lX3dhdGNoZG9nKHVsb25nIHZwKTsKK2ludCBmY29lX2xpbmtfb2soc3RydWN0IGZjX2xwb3J0ICpscCk7CisKK3N0cnVjdCBmY19scG9ydCAqZmNvZV9ob3N0bGlzdF9sb29rdXAoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgZmNvZV9ob3N0bGlzdF9hZGQoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICopOworaW50IGZjb2VfaG9zdGxpc3RfcmVtb3ZlKGNvbnN0IHN0cnVjdCBmY19scG9ydCAqKTsKKworc3RydWN0IFNjc2lfSG9zdCAqZmNvZV9ob3N0X2FsbG9jKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiwgaW50KTsKK2ludCBmY29lX2xpYmZjX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKiwgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICopOworCisvKiBmY29lIHN3IGhiYSAqLworaW50IF9faW5pdCBmY29lX3N3X2luaXQodm9pZCk7CitpbnQgX19leGl0IGZjb2Vfc3dfZXhpdCh2b2lkKTsKKyNlbmRpZiAvKiBfTElCRkNPRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaCBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCmluZGV4IDYxZTUzZjEuLjczNjBlMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJpc2NzaS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8c2NzaS9pc2NzaV9wcm90by5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfaWYuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CiAKIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGU7CkBAIC03MCwxMiArNzEsMTIgQEAKIC8qIENvbm5lY3Rpb24gc3VzcGVuZCAiYml0IiAqLwogI2RlZmluZSBJU0NTSV9TVVNQRU5EX0JJVAkJMQogCi0jZGVmaW5lIElTQ1NJX0lUVF9NQVNLCQkJKDB4MWZmZikKKyNkZWZpbmUgSVNDU0lfSVRUX01BU0sJCQkweDFmZmYKICNkZWZpbmUgSVNDU0lfVE9UQUxfQ01EU19NQVgJCTQwOTYKIC8qIHRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBncmVhdGVyIHRoYW4gSVNDU0lfTUdNVF9DTURTX01BWCAqLwogI2RlZmluZSBJU0NTSV9UT1RBTF9DTURTX01JTgkJMTYKICNkZWZpbmUgSVNDU0lfQUdFX1NISUZUCQkJMjgKLSNkZWZpbmUgSVNDU0lfQUdFX01BU0sJCQkoMHhmIDw8IElTQ1NJX0FHRV9TSElGVCkKKyNkZWZpbmUgSVNDU0lfQUdFX01BU0sJCQkweGYKIAogI2RlZmluZSBJU0NTSV9BRERSRVNTX0JVRl9MRU4JCTY0CiAKQEAgLTkzLDI0ICs5NCwzOCBAQAogCUlTQ1NJX1RBU0tfUlVOTklORywKIH07CiAKK3N0cnVjdCBpc2NzaV9yMnRfaW5mbyB7CisJX19iZTMyCQkJdHR0OwkJLyogY29waWVkIGZyb20gUjJUICovCisJX19iZTMyCQkJZXhwX3N0YXRzbjsJLyogY29waWVkIGZyb20gUjJUICovCisJdWludDMyX3QJCWRhdGFfbGVuZ3RoOwkvKiBjb3BpZWQgZnJvbSBSMlQgKi8KKwl1aW50MzJfdAkJZGF0YV9vZmZzZXQ7CS8qIGNvcGllZCBmcm9tIFIyVCAqLworCWludAkJCWRhdGFfY291bnQ7CS8qIERBVEEtT3V0IHBheWxvYWQgcHJvZ3Jlc3MgKi8KKwlpbnQJCQlkYXRhc247CisJLyogTExEcyBzaG91bGQgc2V0L3VwZGF0ZSB0aGVzZSB2YWx1ZXMgKi8KKwlpbnQJCQlzZW50OwkJLyogUjJUIHNlcXVlbmNlIHByb2dyZXNzICovCit9OworCiBzdHJ1Y3QgaXNjc2lfdGFzayB7CiAJLyoKIAkgKiBCZWNhdXNlIExMRHMgYWxsb2NhdGUgdGhlaXIgaGRyIGRpZmZlcmVudGx5LCB0aGlzIGlzIGEgcG9pbnRlcgogCSAqIGFuZCBsZW5ndGggdG8gdGhhdCBzdG9yYWdlLiBJdCBtdXN0IGJlIHNldHVwIGF0IHNlc3Npb24KIAkgKiBjcmVhdGlvbiB0aW1lLgogCSAqLwotCXN0cnVjdCBpc2NzaV9jbWQJKmhkcjsKKwlzdHJ1Y3QgaXNjc2lfaGRyCSpoZHI7CiAJdW5zaWduZWQgc2hvcnQJCWhkcl9tYXg7CiAJdW5zaWduZWQgc2hvcnQJCWhkcl9sZW47CS8qIGFjY3VtdWxhdGVkIHNpemUgb2YgaGRyIHVzZWQgKi8KKwkvKiBjb3BpZWQgdmFsdWVzIGluIGNhc2Ugd2UgbmVlZCB0byBzZW5kIHRtZnMgKi8KKwlpdHRfdAkJCWhkcl9pdHQ7CisJX19iZTMyCQkJY21kc247CisJdWludDhfdAkJCWx1bls4XTsKKwogCWludAkJCWl0dDsJCS8qIHRoaXMgSVRUICovCiAKLQl1aW50MzJfdAkJdW5zb2xfZGF0YXNuOwogCXVuc2lnbmVkCQlpbW1fY291bnQ7CS8qIGltbS1kYXRhIChieXRlcykgICAqLwotCXVuc2lnbmVkCQl1bnNvbF9jb3VudDsJLyogdW5zb2xpY2l0ZWQgKGJ5dGVzKSovCiAJLyogb2Zmc2V0IGluIHVuc29saWNpdGVkIHN0cmVhbSAoYnl0ZXMpOyAqLwotCXVuc2lnbmVkCQl1bnNvbF9vZmZzZXQ7Ci0JdW5zaWduZWQJCWRhdGFfY291bnQ7CS8qIHJlbWFpbmluZyBEYXRhLU91dCAqLworCXN0cnVjdCBpc2NzaV9yMnRfaW5mbwl1bnNvbF9yMnQ7CiAJY2hhcgkJCSpkYXRhOwkJLyogbWdtdCBwYXlsb2FkICovCisJdW5zaWduZWQJCWRhdGFfY291bnQ7CiAJc3RydWN0IHNjc2lfY21uZAkqc2M7CQkvKiBhc3NvY2lhdGVkIFNDU0kgY21kKi8KIAlzdHJ1Y3QgaXNjc2lfY29ubgkqY29ubjsJCS8qIHVzZWQgY29ubmVjdGlvbiAgICAqLwogCkBAIC0xMjEsNiArMTM2LDExIEBACiAJdm9pZAkJCSpkZF9kYXRhOwkvKiBkcml2ZXIvdHJhbnNwb3J0IGRhdGEgKi8KIH07CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzY3NpX3Rhc2tfaGFzX3Vuc29sX2RhdGEoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPnVuc29sX3IydC5kYXRhX2xlbmd0aCA+IHRhc2stPnVuc29sX3IydC5zZW50OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQqIGlzY3NpX25leHRfaGRyKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKQogewogCXJldHVybiAodm9pZCopdGFzay0+aGRyICsgdGFzay0+aGRyX2xlbjsKQEAgLTM3Niw4ICszOTYsOSBAQAogICogcGR1IGFuZCB0YXNrIHByb2Nlc3NpbmcKICAqLwogZXh0ZXJuIHZvaWQgaXNjc2lfdXBkYXRlX2NtZHNuKHN0cnVjdCBpc2NzaV9zZXNzaW9uICosIHN0cnVjdCBpc2NzaV9ub3BpbiAqKTsKLWV4dGVybiB2b2lkIGlzY3NpX3ByZXBfdW5zb2xpY2l0X2RhdGFfcGR1KHN0cnVjdCBpc2NzaV90YXNrICosCi0JCQkJCXN0cnVjdCBpc2NzaV9kYXRhICpoZHIpOworZXh0ZXJuIHZvaWQgaXNjc2lfcHJlcF9kYXRhX291dF9wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssCisJCQkJICAgIHN0cnVjdCBpc2NzaV9yMnRfaW5mbyAqcjJ0LAorCQkJCSAgICBzdHJ1Y3QgaXNjc2lfZGF0YSAqaGRyKTsKIGV4dGVybiBpbnQgaXNjc2lfY29ubl9zZW5kX3BkdShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKiwgc3RydWN0IGlzY3NpX2hkciAqLAogCQkJCWNoYXIgKiwgdWludDMyX3QpOwogZXh0ZXJuIGludCBpc2NzaV9jb21wbGV0ZV9wZHUoc3RydWN0IGlzY3NpX2Nvbm4gKiwgc3RydWN0IGlzY3NpX2hkciAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTMyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBpU0NTSSBvdmVyIFRDUC9JUCBEYXRhLVBhdGggbGliCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pa2UgQ2hyaXN0aWUKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogbWFpbnRhaW5lZCBieSBvcGVuLWlzY3NpQGdvb2dsZWdyb3Vwcy5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBMSUJJU0NTSV9UQ1BfSAorI2RlZmluZSBMSUJJU0NTSV9UQ1BfSAorCisjaW5jbHVkZSA8c2NzaS9saWJpc2NzaS5oPgorCitzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm47CitzdHJ1Y3QgaXNjc2lfc2VnbWVudDsKK3N0cnVjdCBza19idWZmOworc3RydWN0IGhhc2hfZGVzYzsKKwordHlwZWRlZiBpbnQgaXNjc2lfc2VnbWVudF9kb25lX2ZuX3Qoc3RydWN0IGlzY3NpX3RjcF9jb25uICosCisJCQkJICAgIHN0cnVjdCBpc2NzaV9zZWdtZW50ICopOworCitzdHJ1Y3QgaXNjc2lfc2VnbWVudCB7CisJdW5zaWduZWQgY2hhcgkJKmRhdGE7CisJdW5zaWduZWQgaW50CQlzaXplOworCXVuc2lnbmVkIGludAkJY29waWVkOworCXVuc2lnbmVkIGludAkJdG90YWxfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCXRvdGFsX2NvcGllZDsKKworCXN0cnVjdCBoYXNoX2Rlc2MJKmhhc2g7CisJdW5zaWduZWQgY2hhcgkJcmVjdl9kaWdlc3RbSVNDU0lfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIJCWRpZ2VzdFtJU0NTSV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgaW50CQlkaWdlc3RfbGVuOworCisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKKwl2b2lkCQkJKnNnX21hcHBlZDsKKwl1bnNpZ25lZCBpbnQJCXNnX29mZnNldDsKKworCWlzY3NpX3NlZ21lbnRfZG9uZV9mbl90CSpkb25lOworfTsKKworLyogU29ja2V0IGNvbm5lY3Rpb24gcmVjaWV2ZSBoZWxwZXIgKi8KK3N0cnVjdCBpc2NzaV90Y3BfcmVjdiB7CisJc3RydWN0IGlzY3NpX2hkcgkqaGRyOworCXN0cnVjdCBpc2NzaV9zZWdtZW50CXNlZ21lbnQ7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIEJIUyArIEFIUyAqLworCXVpbnQzMl90CQloZHJfYnVmWzY0XTsKKworCS8qIGNvcGllZCBhbmQgZmxpcHBlZCB2YWx1ZXMgKi8KKwlpbnQJCQlkYXRhbGVuOworfTsKKworc3RydWN0IGlzY3NpX3RjcF9jb25uIHsKKwlzdHJ1Y3QgaXNjc2lfY29ubgkqaXNjc2lfY29ubjsKKwl2b2lkCQkJKmRkX2RhdGE7CisJaW50CQkJc3RvcF9zdGFnZTsJLyogY29ubl9zdG9wKCkgZmxhZzogKgorCQkJCQkJICogc3RvcCB0byByZWNvdmVyLCAgKgorCQkJCQkJICogc3RvcCB0byB0ZXJtaW5hdGUgKi8KKwkvKiBjb250cm9sIGRhdGEgKi8KKwlzdHJ1Y3QgaXNjc2lfdGNwX3JlY3YJaW47CQkvKiBUQ1AgcmVjZWl2ZSBjb250ZXh0ICovCisJLyogQ1JDMzJDIChSeCkgTExEIHNob3VsZCBzZXQgdGhpcyBpcyB0aGV5IGRvIG5vdCBvZmZsb2FkICovCisJc3RydWN0IGhhc2hfZGVzYwkqcnhfaGFzaDsKK307CisKK3N0cnVjdCBpc2NzaV90Y3BfdGFzayB7CisJdWludDMyX3QJCWV4cF9kYXRhc247CS8qIGV4cGVjdGVkIHRhcmdldCdzIFIyVFNOL0RhdGFTTiAqLworCWludAkJCWRhdGFfb2Zmc2V0OworCXN0cnVjdCBpc2NzaV9yMnRfaW5mbwkqcjJ0OwkJLyogaW4gcHJvZ3Jlc3Mgc29saWN0IFIyVCAqLworCXN0cnVjdCBpc2NzaV9wb29sCXIydHBvb2w7CisJc3RydWN0IGtmaWZvCQkqcjJ0cXVldWU7CisJdm9pZAkJCSpkZF9kYXRhOworfTsKKworZW51bSB7CisJSVNDU0lfVENQX1NFR01FTlRfRE9ORSwJCS8qIGN1cnIgc2VnIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworCUlTQ1NJX1RDUF9TS0JfRE9ORSwJCS8qIHNrYiBpcyBvdXQgb2YgZGF0YSAqLworCUlTQ1NJX1RDUF9DT05OX0VSUiwJCS8qIGlzY3NpIGxheWVyIGhhcyBmaXJlZCBhIGNvbm4gZXJyICovCisJSVNDU0lfVENQX1NVU1BFTkRFRCwJCS8qIGNvbm4gaXMgc3VzcGVuZGVkICovCit9OworCitleHRlcm4gdm9pZCBpc2NzaV90Y3BfaGRyX3JlY3ZfcHJlcChzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uKTsKK2V4dGVybiBpbnQgaXNjc2lfdGNwX3JlY3Zfc2tiKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgYm9vbCBvZmZsb2FkZWQsIGludCAqc3RhdHVzKTsKK2V4dGVybiB2b2lkIGlzY3NpX3RjcF9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spOworZXh0ZXJuIGludCBpc2NzaV90Y3BfdGFza19pbml0KHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKK2V4dGVybiBpbnQgaXNjc2lfdGNwX3Rhc2tfeG1pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayk7CisKKy8qIHNlZ21lbnQgaGVscGVycyAqLworZXh0ZXJuIGludCBpc2NzaV90Y3BfcmVjdl9zZWdtZW50X2lzX2hkcihzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uKTsKK2V4dGVybiBpbnQgaXNjc2lfdGNwX3NlZ21lbnRfZG9uZShzdHJ1Y3QgaXNjc2lfdGNwX2Nvbm4gKnRjcF9jb25uLAorCQkJCSAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsIGludCByZWN2LAorCQkJCSAgdW5zaWduZWQgY29waWVkKTsKK2V4dGVybiB2b2lkIGlzY3NpX3RjcF9zZWdtZW50X3VubWFwKHN0cnVjdCBpc2NzaV9zZWdtZW50ICpzZWdtZW50KTsKKworZXh0ZXJuIHZvaWQgaXNjc2lfc2VnbWVudF9pbml0X2xpbmVhcihzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwKKwkJCQkgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBpc2NzaV9zZWdtZW50X2RvbmVfZm5fdCAqZG9uZSwKKwkJCQkgICAgICBzdHJ1Y3QgaGFzaF9kZXNjICpoYXNoKTsKK2V4dGVybiBpbnQKK2lzY3NpX3NlZ21lbnRfc2Vla19zZyhzdHJ1Y3QgaXNjc2lfc2VnbWVudCAqc2VnbWVudCwKKwkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0LCB1bnNpZ25lZCBpbnQgc2dfY291bnQsCisJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkgICAgICBpc2NzaV9zZWdtZW50X2RvbmVfZm5fdCAqZG9uZSwgc3RydWN0IGhhc2hfZGVzYyAqaGFzaCk7CisKKy8qIGRpZ2VzdCBoZWxwZXJzICovCitleHRlcm4gdm9pZCBpc2NzaV90Y3BfZGdzdF9oZWFkZXIoc3RydWN0IGhhc2hfZGVzYyAqaGFzaCwgY29uc3Qgdm9pZCAqaGRyLAorCQkJCSAgc2l6ZV90IGhkcmxlbiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgZGlnZXN0W0lTQ1NJX0RJR0VTVF9TSVpFXSk7CitleHRlcm4gc3RydWN0IGlzY3NpX2Nsc19jb25uICoKK2lzY3NpX3RjcF9jb25uX3NldHVwKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sIGludCBkZF9kYXRhX3NpemUsCisJCSAgICAgdWludDMyX3QgY29ubl9pZHgpOworZXh0ZXJuIHZvaWQgaXNjc2lfdGNwX2Nvbm5fdGVhcmRvd24oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubik7CisKKy8qIG1pc2MgaGVscGVycyAqLworZXh0ZXJuIGludCBpc2NzaV90Y3BfcjJ0cG9vbF9hbGxvYyhzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbik7CitleHRlcm4gdm9pZCBpc2NzaV90Y3BfcjJ0cG9vbF9mcmVlKHN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uKTsKKworZXh0ZXJuIHZvaWQgaXNjc2lfdGNwX2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkJICAgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKTsKKyNlbmRpZiAvKiBMSUJJU0NTSV9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAppbmRleCBhMzdhODE0Li4wMWE0YzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaApAQCAtMTU5LDggKzE1OSw2IEBACiAJYXRvbWljX3QgaW9kb25lX2NudDsKIAlhdG9taWNfdCBpb2Vycl9jbnQ7CiAKLQlpbnQgdGltZW91dDsKLQogCXN0cnVjdCBkZXZpY2UJCXNkZXZfZ2VuZGV2LAogCQkJCXNkZXZfZGV2OwogCkBAIC0zNjcsMTAgKzM2NSwxMSBAQAogZXh0ZXJuIGludCBzY3NpX2V4ZWN1dGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsCiAJCQlpbnQgZGF0YV9kaXJlY3Rpb24sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKIAkJCXVuc2lnbmVkIGNoYXIgKnNlbnNlLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsCi0JCQlpbnQgZmxhZyk7CisJCQlpbnQgZmxhZywgaW50ICpyZXNpZCk7CiBleHRlcm4gaW50IHNjc2lfZXhlY3V0ZV9yZXEoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsCiAJCQkgICAgaW50IGRhdGFfZGlyZWN0aW9uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCi0JCQkgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICosIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcyk7CisJCQkgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICosIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKKwkJCSAgICBpbnQgKnJlc2lkKTsKIGV4dGVybiBpbnQgc2NzaV9leGVjdXRlX2FzeW5jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwgaW50IGNtZF9sZW4sIGludCBkYXRhX2RpcmVjdGlvbiwKIAkJCSAgICAgIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwgaW50IHVzZV9zZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKaW5kZXggYzY2N2NjMy4uYjUwYWFiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKQEAgLTExMywxMCArMTEzLDE4IEBACiAJCQkgY2hhciAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKTsKIAl2b2lkICgqZ2V0X3N0YXRzKSAoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAogCQkJICAgc3RydWN0IGlzY3NpX3N0YXRzICpzdGF0cyk7CisKIAlpbnQgKCppbml0X3Rhc2spIChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayk7CiAJaW50ICgqeG1pdF90YXNrKSAoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spOwotCXZvaWQgKCpjbGVhbnVwX3Rhc2spIChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwKLQkJCQkgIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKKwl2b2lkICgqY2xlYW51cF90YXNrKSAoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spOworCisJaW50ICgqYWxsb2NfcGR1KSAoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIHVpbnQ4X3Qgb3Bjb2RlKTsKKwlpbnQgKCp4bWl0X3BkdSkgKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKKwlpbnQgKCppbml0X3BkdSkgKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJIHVuc2lnbmVkIGludCBjb3VudCk7CisJdm9pZCAoKnBhcnNlX3BkdV9pdHQpIChzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgaXR0X3QgaXR0LAorCQkJICAgICAgIGludCAqaW5kZXgsIGludCAqYWdlKTsKKwogCXZvaWQgKCpzZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0KSAoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKIAlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKigqZXBfY29ubmVjdCkgKHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCiAJCQkJCSAgICAgIGludCBub25fYmxvY2tpbmcpOwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDhhNjNjNDAuLjEzNjI3MTkgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTkzNiwxMCArOTM2LDkwIEBACiBjb25maWcgUFJFRU1QVF9OT1RJRklFUlMKIAlib29sCiAKK2Nob2ljZQorCXByb21wdCAiUkNVIEltcGxlbWVudGF0aW9uIgorCWRlZmF1bHQgQ0xBU1NJQ19SQ1UKKwogY29uZmlnIENMQVNTSUNfUkNVCi0JZGVmX2Jvb2wgIVBSRUVNUFRfUkNVCisJYm9vbCAiQ2xhc3NpYyBSQ1UiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gc2VsZWN0cyB0aGUgY2xhc3NpYyBSQ1UgaW1wbGVtZW50YXRpb24gdGhhdCBpcwogCSAgZGVzaWduZWQgZm9yIGJlc3QgcmVhZC1zaWRlIHBlcmZvcm1hbmNlIG9uIG5vbi1yZWFsdGltZQotCSAgc3lzdGVtcy4gIENsYXNzaWMgUkNVIGlzIHRoZSBkZWZhdWx0LiAgTm90ZSB0aGF0IHRoZQotCSAgUFJFRU1QVF9SQ1Ugc3ltYm9sIGlzIHVzZWQgdG8gc2VsZWN0L2Rlc2VsZWN0IHRoaXMgb3B0aW9uLgorCSAgc3lzdGVtcy4KKworCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdW5zdXJlLgorCitjb25maWcgVFJFRV9SQ1UKKwlib29sICJUcmVlLWJhc2VkIGhpZXJhcmNoaWNhbCBSQ1UiCisJaGVscAorCSAgVGhpcyBvcHRpb24gc2VsZWN0cyB0aGUgUkNVIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKwkgIGRlc2lnbmVkIGZvciB2ZXJ5IGxhcmdlIFNNUCBzeXN0ZW0gd2l0aCBodW5kcmVkcyBvcgorCSAgdGhvdXNhbmRzIG9mIENQVXMuCisKK2NvbmZpZyBQUkVFTVBUX1JDVQorCWJvb2wgIlByZWVtcHRpYmxlIFJDVSIKKwlkZXBlbmRzIG9uIFBSRUVNUFQKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgYnkgbWFraW5nIGNlcnRhaW4KKwkgIFJDVSBzZWN0aW9ucyBwcmVlbXB0aWJsZS4gTm9ybWFsbHkgUkNVIGNvZGUgaXMgbm9uLXByZWVtcHRpYmxlLCBpZgorCSAgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgdGhlbiByZWFkLW9ubHkgUkNVIHNlY3Rpb25zIGJlY29tZQorCSAgcHJlZW1wdGlibGUuIFRoaXMgaGVscHMgbGF0ZW5jeSwgYnV0IG1heSBleHBvc2UgYnVncyBkdWUgdG8KKwkgIG5vdy1uYWl2ZSBhc3N1bXB0aW9ucyBhYm91dCBlYWNoIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbgorCSAgcmVtYWluaW5nIG9uIGEgZ2l2ZW4gQ1BVIHRocm91Z2ggaXRzIGV4ZWN1dGlvbi4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBSQ1VfVFJBQ0UKKwlib29sICJFbmFibGUgdHJhY2luZyBmb3IgUkNVIgorCWRlcGVuZHMgb24gVFJFRV9SQ1UgfHwgUFJFRU1QVF9SQ1UKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0cmFjaW5nIGluIFJDVSB3aGljaCBwcmVzZW50cyBzdGF0cworCSAgaW4gZGVidWdmcyBmb3IgZGVidWdnaW5nIFJDVSBpbXBsZW1lbnRhdGlvbi4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgUkNVIHRyYWNpbmcKKwkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCitjb25maWcgUkNVX0ZBTk9VVAorCWludCAiVHJlZS1iYXNlZCBoaWVyYXJjaGljYWwgUkNVIGZhbm91dCB2YWx1ZSIKKwlyYW5nZSAyIDY0IGlmIDY0QklUCisJcmFuZ2UgMiAzMiBpZiAhNjRCSVQKKwlkZXBlbmRzIG9uIFRSRUVfUkNVCisJZGVmYXVsdCA2NCBpZiA2NEJJVAorCWRlZmF1bHQgMzIgaWYgITY0QklUCisJaGVscAorCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIGZhbm91dCBvZiBoaWVyYXJjaGljYWwgaW1wbGVtZW50YXRpb25zCisJICBvZiBSQ1UsIGFsbG93aW5nIFJDVSB0byB3b3JrIGVmZmljaWVudGx5IG9uIG1hY2hpbmVzIHdpdGgKKwkgIGxhcmdlIG51bWJlcnMgb2YgQ1BVcy4gIFRoaXMgdmFsdWUgbXVzdCBiZSBhdCBsZWFzdCB0aGUgY3ViZQorCSAgcm9vdCBvZiBOUl9DUFVTLCB3aGljaCBhbGxvd3MgTlJfQ1BVUyB1cCB0byAzMiw3NjggZm9yIDMyLWJpdAorCSAgc3lzdGVtcyBhbmQgdXAgdG8gMjYyLDE0NCBmb3IgNjQtYml0IHN5c3RlbXMuCisKKwkgIFNlbGVjdCBhIHNwZWNpZmljIG51bWJlciBpZiB0ZXN0aW5nIFJDVSBpdHNlbGYuCisJICBUYWtlIHRoZSBkZWZhdWx0IGlmIHVuc3VyZS4KKworY29uZmlnIFJDVV9GQU5PVVRfRVhBQ1QKKwlib29sICJEaXNhYmxlIHRyZWUtYmFzZWQgaGllcmFyY2hpY2FsIFJDVSBhdXRvLWJhbGFuY2luZyIKKwlkZXBlbmRzIG9uIFRSRUVfUkNVCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZm9yY2VzIHVzZSBvZiB0aGUgZXhhY3QgUkNVX0ZBTk9VVCB2YWx1ZSBzcGVjaWZpZWQsCisJICByZWdhcmRsZXNzIG9mIGltYmFsYW5jZXMgaW4gdGhlIGhpZXJhcmNoeS4gIFRoaXMgaXMgdXNlZnVsIGZvcgorCSAgdGVzdGluZyBSQ1UgaXRzZWxmLCBhbmQgbWlnaHQgb25lIGRheSBiZSB1c2VmdWwgb24gc3lzdGVtcyB3aXRoCisJICBzdHJvbmcgTlVNQSBiZWhhdmlvci4KKworCSAgV2l0aG91dCBSQ1VfRkFOT1VUX0VYQUNULCB0aGUgY29kZSB3aWxsIGJhbGFuY2UgdGhlIGhpZXJhcmNoeS4KKworCSAgU2F5IE4gaWYgdW5zdXJlLgorCitjb25maWcgVFJFRV9SQ1VfVFJBQ0UKKwlkZWZfYm9vbCBSQ1VfVFJBQ0UgJiYgVFJFRV9SQ1UKKwlzZWxlY3QgREVCVUdfRlMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0cmFjaW5nIGZvciB0aGUgVFJFRV9SQ1UgaW1wbGVtZW50YXRpb24sCisJICBwZXJtaXR0aW5nIE1ha2VmaWxlIHRvIHRyaXZpYWxseSBzZWxlY3Qga2VybmVsL3JjdXRyZWVfdHJhY2UuYy4KKworY29uZmlnIFBSRUVNUFRfUkNVX1RSQUNFCisJZGVmX2Jvb2wgUkNVX1RSQUNFICYmIFBSRUVNUFRfUkNVCisJc2VsZWN0IERFQlVHX0ZTCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdHJhY2luZyBmb3IgdGhlIFBSRUVNUFRfUkNVIGltcGxlbWVudGF0aW9uLAorCSAgcGVybWl0dGluZyBNYWtlZmlsZSB0byB0cml2aWFsbHkgc2VsZWN0IGtlcm5lbC9yY3VwcmVlbXB0X3RyYWNlLmMuCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGJlY2E3YWEuLjc3Y2I3MjAgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01NDEsNiArNTQxLDE1IEBACiB7CiB9CiAKK3ZvaWQgX19pbml0IF9fd2VhayBhcmNoX2Vhcmx5X2lycV9pbml0KHZvaWQpCit7Cit9CisKK3ZvaWQgX19pbml0IF9fd2VhayBlYXJseV9pcnFfaW5pdCh2b2lkKQoreworCWFyY2hfZWFybHlfaXJxX2luaXQoKTsKK30KKwogYXNtbGlua2FnZSB2b2lkIF9faW5pdCBzdGFydF9rZXJuZWwodm9pZCkKIHsKIAljaGFyICogY29tbWFuZF9saW5lOwpAQCAtNjA1LDYgKzYxNCw4IEBACiAJc29ydF9tYWluX2V4dGFibGUoKTsKIAl0cmFwX2luaXQoKTsKIAlyY3VfaW5pdCgpOworCS8qIGluaXQgc29tZSBsaW5rcyBiZWZvcmUgaW5pdF9JU0FfaXJxcygpICovCisJZWFybHlfaXJxX2luaXQoKTsKIAlpbml0X0lSUSgpOwogCXBpZGhhc2hfaW5pdCgpOwogCWluaXRfdGltZXJzKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvS2NvbmZpZy5wcmVlbXB0IGIva2VybmVsL0tjb25maWcucHJlZW1wdAppbmRleCA5ZmRiYTAzLi5iZjk4N2I5IDEwMDY0NAotLS0gYS9rZXJuZWwvS2NvbmZpZy5wcmVlbXB0CisrKyBiL2tlcm5lbC9LY29uZmlnLnByZWVtcHQKQEAgLTUyLDI4ICs1MiwzIEBACiAKIGVuZGNob2ljZQogCi1jb25maWcgUFJFRU1QVF9SQ1UKLQlib29sICJQcmVlbXB0aWJsZSBSQ1UiCi0JZGVwZW5kcyBvbiBQUkVFTVBUCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIGJ5IG1ha2luZyBjZXJ0YWluCi0JICBSQ1Ugc2VjdGlvbnMgcHJlZW1wdGlibGUuIE5vcm1hbGx5IFJDVSBjb2RlIGlzIG5vbi1wcmVlbXB0aWJsZSwgaWYKLQkgIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIHRoZW4gcmVhZC1vbmx5IFJDVSBzZWN0aW9ucyBiZWNvbWUKLQkgIHByZWVtcHRpYmxlLiBUaGlzIGhlbHBzIGxhdGVuY3ksIGJ1dCBtYXkgZXhwb3NlIGJ1Z3MgZHVlIHRvCi0JICBub3ctbmFpdmUgYXNzdW1wdGlvbnMgYWJvdXQgZWFjaCBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24KLQkgIHJlbWFpbmluZyBvbiBhIGdpdmVuIENQVSB0aHJvdWdoIGl0cyBleGVjdXRpb24uCi0KLQkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgotCi1jb25maWcgUkNVX1RSQUNFCi0JYm9vbCAiRW5hYmxlIHRyYWNpbmcgZm9yIFJDVSAtIGN1cnJlbnRseSBzdGF0cyBpbiBkZWJ1Z2ZzIgotCWRlcGVuZHMgb24gUFJFRU1QVF9SQ1UKLQlzZWxlY3QgREVCVUdfRlMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0cmFjaW5nIGluIFJDVSB3aGljaCBwcmVzZW50cyBzdGF0cwotCSAgaW4gZGVidWdmcyBmb3IgZGVidWdnaW5nIFJDVSBpbXBsZW1lbnRhdGlvbi4KLQotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgUkNVIHRyYWNpbmcKLQkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDAyN2VkZGEuLmUxYzViZjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTczLDEwICs3MywxMCBAQAogb2JqLSQoQ09ORklHX1NFQ0NPTVApICs9IHNlY2NvbXAubwogb2JqLSQoQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QpICs9IHJjdXRvcnR1cmUubwogb2JqLSQoQ09ORklHX0NMQVNTSUNfUkNVKSArPSByY3VjbGFzc2ljLm8KK29iai0kKENPTkZJR19UUkVFX1JDVSkgKz0gcmN1dHJlZS5vCiBvYmotJChDT05GSUdfUFJFRU1QVF9SQ1UpICs9IHJjdXByZWVtcHQubwotaWZlcSAoJChDT05GSUdfUFJFRU1QVF9SQ1UpLHkpCi1vYmotJChDT05GSUdfUkNVX1RSQUNFKSArPSByY3VwcmVlbXB0X3RyYWNlLm8KLWVuZGlmCitvYmotJChDT05GSUdfVFJFRV9SQ1VfVFJBQ0UpICs9IHJjdXRyZWVfdHJhY2Uubworb2JqLSQoQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFKSArPSByY3VwcmVlbXB0X3RyYWNlLm8KIG9iai0kKENPTkZJR19SRUxBWSkgKz0gcmVsYXkubwogb2JqLSQoQ09ORklHX1NZU0NUTCkgKz0gdXRzbmFtZV9zeXNjdGwubwogb2JqLSQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkgKz0gZGVsYXlhY2N0Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGM3NDIyY2EuLmM5ZTVhMWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMTAzNyw4ICsxMDM3LDYgQEAKIAkJICogdGFzayBpbnRvIHRoZSB3YWl0IGZvciBldmVyIG5pcndhbmEgYXMgd2VsbC4KIAkJICovCiAJCXRzay0+ZmxhZ3MgfD0gUEZfRVhJVFBJRE9ORTsKLQkJaWYgKHRzay0+aW9fY29udGV4dCkKLQkJCWV4aXRfaW9fY29udGV4dCgpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXNjaGVkdWxlKCk7CiAJfQpAQCAtMTMyOCwxMCArMTMyNiwxMCBAQAogCQkgKiBncm91cCwgd2hpY2ggY29uc29saWRhdGVzIHRpbWVzIGZvciBhbGwgdGhyZWFkcyBpbiB0aGUKIAkJICogZ3JvdXAgaW5jbHVkaW5nIHRoZSBncm91cCBsZWFkZXIuCiAJCSAqLworCQl0aHJlYWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7CiAJCXNwaW5fbG9ja19pcnEoJnAtPnBhcmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCXBzaWcgPSBwLT5wYXJlbnQtPnNpZ25hbDsKIAkJc2lnID0gcC0+c2lnbmFsOwotCQl0aHJlYWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7CiAJCXBzaWctPmN1dGltZSA9CiAJCQljcHV0aW1lX2FkZChwc2lnLT5jdXRpbWUsCiAJCQljcHV0aW1lX2FkZChjcHV0aW1lLnV0aW1lLApkaWZmIC0tZ2l0IGEva2VybmVsL2V4dGFibGUuYyBiL2tlcm5lbC9leHRhYmxlLmMKaW5kZXggZmViMDMxNy4uZTEzNmVkOCAxMDA2NDQKLS0tIGEva2VybmVsL2V4dGFibGUuYworKysgYi9rZXJuZWwvZXh0YWJsZS5jCkBAIC02NywzICs2NywxOSBAQAogCQlyZXR1cm4gMTsKIAlyZXR1cm4gbW9kdWxlX3RleHRfYWRkcmVzcyhhZGRyKSAhPSBOVUxMOwogfQorCisvKgorICogT24gc29tZSBhcmNoaXRlY3R1cmVzIChQUEM2NCwgSUE2NCkgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIGFyZSBhY3R1YWxseSBvbmx5IHRva2VucyB0byBzb21lIGRhdGEgdGhhdCB0aGVuIGhvbGRzIHRoZQorICogcmVhbCBmdW5jdGlvbiBhZGRyZXNzLiBBcyBhIHJlc3VsdCwgdG8gZmluZCBpZiBhIGZ1bmN0aW9uCisgKiBwb2ludGVyIGlzIHBhcnQgb2YgdGhlIGtlcm5lbCB0ZXh0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKKyAqIHNwZWNpYWwgZGVyZWZlcmVuY2luZyBmaXJzdC4KKyAqLworaW50IGZ1bmNfcHRyX2lzX2tlcm5lbF90ZXh0KHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKHB0cik7CisJaWYgKGNvcmVfa2VybmVsX3RleHQoYWRkcikpCisJCXJldHVybiAxOworCXJldHVybiBtb2R1bGVfdGV4dF9hZGRyZXNzKGFkZHIpICE9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA2MTQ0YjM2Li40M2NiZjMwIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTQxNSw4ICs0MTUsOCBAQAogCXNldF9tbV9jb3VudGVyKG1tLCBmaWxlX3JzcywgMCk7CiAJc2V0X21tX2NvdW50ZXIobW0sIGFub25fcnNzLCAwKTsKIAlzcGluX2xvY2tfaW5pdCgmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0Jcndsb2NrX2luaXQoJm1tLT5pb2N0eF9saXN0X2xvY2spOwotCW1tLT5pb2N0eF9saXN0ID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmbW0tPmlvY3R4X2xvY2spOworCUlOSVRfSExJU1RfSEVBRCgmbW0tPmlvY3R4X2xpc3QpOwogCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CiAJbW0tPmNhY2hlZF9ob2xlX3NpemUgPSB+MFVMOwogCW1tX2luaXRfb3duZXIobW0sIHApOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA0ZmU3OTBlLi43YzZjYmFiIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtOTIsMTEgKzkyLDEyIEBACiAgKiBBIGZ1dGV4X3EgaGFzIGEgd29rZW4gc3RhdGUsIGp1c3QgbGlrZSB0YXNrcyBoYXZlIFRBU0tfUlVOTklORy4KICAqIEl0IGlzIGNvbnNpZGVyZWQgd29rZW4gd2hlbiBwbGlzdF9ub2RlX2VtcHR5KCZxLT5saXN0KSB8fCBxLT5sb2NrX3B0ciA9PSAwLgogICogVGhlIG9yZGVyIG9mIHdha3VwIGlzIGFsd2F5cyB0byBtYWtlIHRoZSBmaXJzdCBjb25kaXRpb24gdHJ1ZSwgdGhlbgotICogd2FrZSB1cCBxLT53YWl0ZXJzLCB0aGVuIG1ha2UgdGhlIHNlY29uZCBjb25kaXRpb24gdHJ1ZS4KKyAqIHdha2UgdXAgcS0+d2FpdGVyLCB0aGVuIG1ha2UgdGhlIHNlY29uZCBjb25kaXRpb24gdHJ1ZS4KICAqLwogc3RydWN0IGZ1dGV4X3EgewogCXN0cnVjdCBwbGlzdF9ub2RlIGxpc3Q7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGVyczsKKwkvKiBUaGVyZSBjYW4gb25seSBiZSBhIHNpbmdsZSB3YWl0ZXIgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0ZXI7CiAKIAkvKiBXaGljaCBoYXNoIGxpc3QgbG9jayB0byB1c2U6ICovCiAJc3BpbmxvY2tfdCAqbG9ja19wdHI7CkBAIC0xMjMsMjQgKzEyNCw2IEBACiBzdGF0aWMgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0IGZ1dGV4X3F1ZXVlc1sxPDxGVVRFWF9IQVNIQklUU107CiAKIC8qCi0gKiBUYWtlIG1tLT5tbWFwX3NlbSwgd2hlbiBmdXRleCBpcyBzaGFyZWQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X2xvY2tfbW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCkKLXsKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOwotfQotCi0vKgotICogUmVsZWFzZSBtbS0+bW1hcF9zZW0sIHdoZW4gdGhlIGZ1dGV4IGlzIHNoYXJlZAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfdW5sb2NrX21tKHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQpCi17Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7Ci19Ci0KLS8qCiAgKiBXZSBoYXNoIG9uIHRoZSBrZXlzIHJldHVybmVkIGZyb20gZ2V0X2Z1dGV4X2tleSAoc2VlIGJlbG93KS4KICAqLwogc3RhdGljIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGFzaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleSkKQEAgLTE2MSw2ICsxNDQsNDUgQEAKIAkJJiYga2V5MS0+Ym90aC5vZmZzZXQgPT0ga2V5Mi0+Ym90aC5vZmZzZXQpOwogfQogCisvKgorICogVGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UgYWRkcmVzc2VkIGJ5IGEga2V5LgorICogQ2FuIGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHNwaW5sb2Nrcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGdldF9mdXRleF9rZXlfcmVmcyh1bmlvbiBmdXRleF9rZXkgKmtleSkKK3sKKwlpZiAoIWtleS0+Ym90aC5wdHIpCisJCXJldHVybjsKKworCXN3aXRjaCAoa2V5LT5ib3RoLm9mZnNldCAmIChGVVRfT0ZGX0lOT0RFfEZVVF9PRkZfTU1TSEFSRUQpKSB7CisJY2FzZSBGVVRfT0ZGX0lOT0RFOgorCQlhdG9taWNfaW5jKCZrZXktPnNoYXJlZC5pbm9kZS0+aV9jb3VudCk7CisJCWJyZWFrOworCWNhc2UgRlVUX09GRl9NTVNIQVJFRDoKKwkJYXRvbWljX2luYygma2V5LT5wcml2YXRlLm1tLT5tbV9jb3VudCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIERyb3AgYSByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlIGFkZHJlc3NlZCBieSBhIGtleS4KKyAqIFRoZSBoYXNoIGJ1Y2tldCBzcGlubG9jayBtdXN0IG5vdCBiZSBoZWxkLgorICovCitzdGF0aWMgdm9pZCBkcm9wX2Z1dGV4X2tleV9yZWZzKHVuaW9uIGZ1dGV4X2tleSAqa2V5KQoreworCWlmICgha2V5LT5ib3RoLnB0cikKKwkJcmV0dXJuOworCisJc3dpdGNoIChrZXktPmJvdGgub2Zmc2V0ICYgKEZVVF9PRkZfSU5PREV8RlVUX09GRl9NTVNIQVJFRCkpIHsKKwljYXNlIEZVVF9PRkZfSU5PREU6CisJCWlwdXQoa2V5LT5zaGFyZWQuaW5vZGUpOworCQlicmVhazsKKwljYXNlIEZVVF9PRkZfTU1TSEFSRUQ6CisJCW1tZHJvcChrZXktPnByaXZhdGUubW0pOworCQlicmVhazsKKwl9Cit9CisKIC8qKgogICogZ2V0X2Z1dGV4X2tleSAtIEdldCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSB0aGUga2V5cyBmb3IgYSBmdXRleC4KICAqIEB1YWRkcjogdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBmdXRleApAQCAtMTc5LDEyICsyMDEsMTAgQEAKICAqIEZvciBvdGhlciBmdXRleGVzLCBpdCBwb2ludHMgdG8gJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSBhbmQKICAqIGNhbGxlciBtdXN0IGhhdmUgdGFrZW4gdGhlIHJlYWRlciBsb2NrLiBidXQgTk9UIGFueSBzcGlubG9ja3MuCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2Z1dGV4X2tleSh1MzIgX191c2VyICp1YWRkciwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCwKLQkJCSB1bmlvbiBmdXRleF9rZXkgKmtleSkKK3N0YXRpYyBpbnQgZ2V0X2Z1dGV4X2tleSh1MzIgX191c2VyICp1YWRkciwgaW50IGZzaGFyZWQsIHVuaW9uIGZ1dGV4X2tleSAqa2V5KQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXVhZGRyOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGVycjsKIApAQCAtMjA4LDEwMCArMjI4LDUwIEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJa2V5LT5wcml2YXRlLm1tID0gbW07CiAJCWtleS0+cHJpdmF0ZS5hZGRyZXNzID0gYWRkcmVzczsKKwkJZ2V0X2Z1dGV4X2tleV9yZWZzKGtleSk7CiAJCXJldHVybiAwOwogCX0KLQkvKgotCSAqIFRoZSBmdXRleCBpcyBoYXNoZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLQkgKiBpdCdzIGluIGEgc2hhcmVkIG9yIHByaXZhdGUgbWFwcGluZy4gIFNvIGNoZWNrIHZtYSBmaXJzdC4KLQkgKi8KLQl2bWEgPSBmaW5kX2V4dGVuZF92bWEobW0sIGFkZHJlc3MpOwotCWlmICh1bmxpa2VseSghdm1hKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkvKgotCSAqIFBlcm1pc3Npb25zLgotCSAqLwotCWlmICh1bmxpa2VseSgodm1hLT52bV9mbGFncyAmIChWTV9JT3xWTV9SRUFEKSkgIT0gVk1fUkVBRCkpCi0JCXJldHVybiAodm1hLT52bV9mbGFncyAmIFZNX0lPKSA/IC1FUEVSTSA6IC1FQUNDRVM7CithZ2FpbjoKKwllcnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHJlc3MsIDEsIDAsICZwYWdlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwlpZiAoIXBhZ2UtPm1hcHBpbmcpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlnb3RvIGFnYWluOworCX0KIAogCS8qCiAJICogUHJpdmF0ZSBtYXBwaW5ncyBhcmUgaGFuZGxlZCBpbiBhIHNpbXBsZSB3YXkuCiAJICoKIAkgKiBOT1RFOiBXaGVuIHVzZXJzcGFjZSB3YWl0cyBvbiBhIE1BUF9TSEFSRUQgbWFwcGluZywgZXZlbiBpZgogCSAqIGl0J3MgYSByZWFkLW9ubHkgaGFuZGxlLCBpdCdzIGV4cGVjdGVkIHRoYXQgZnV0ZXhlcyBhdHRhY2ggdG8KLQkgKiB0aGUgb2JqZWN0IG5vdCB0aGUgcGFydGljdWxhciBwcm9jZXNzLiAgVGhlcmVmb3JlIHdlIHVzZQotCSAqIFZNX01BWVNIQVJFIGhlcmUsIG5vdCBWTV9TSEFSRUQgd2hpY2ggaXMgcmVzdHJpY3RlZCB0byBzaGFyZWQKLQkgKiBtYXBwaW5ncyBvZiBfd3JpdGFibGVfIGhhbmRsZXMuCisJICogdGhlIG9iamVjdCBub3QgdGhlIHBhcnRpY3VsYXIgcHJvY2Vzcy4KIAkgKi8KLQlpZiAobGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSkpIHsKLQkJa2V5LT5ib3RoLm9mZnNldCB8PSBGVVRfT0ZGX01NU0hBUkVEOyAvKiByZWZlcmVuY2UgdGFrZW4gb24gbW0gKi8KKwlpZiAoUGFnZUFub24ocGFnZSkpIHsKKwkJa2V5LT5ib3RoLm9mZnNldCB8PSBGVVRfT0ZGX01NU0hBUkVEOyAvKiByZWYgdGFrZW4gb24gbW0gKi8KIAkJa2V5LT5wcml2YXRlLm1tID0gbW07CiAJCWtleS0+cHJpdmF0ZS5hZGRyZXNzID0gYWRkcmVzczsKLQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJa2V5LT5ib3RoLm9mZnNldCB8PSBGVVRfT0ZGX0lOT0RFOyAvKiBpbm9kZS1iYXNlZCBrZXkgKi8KKwkJa2V5LT5zaGFyZWQuaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCQlrZXktPnNoYXJlZC5wZ29mZiA9IHBhZ2UtPmluZGV4OwogCX0KIAotCS8qCi0JICogTGluZWFyIGZpbGUgbWFwcGluZ3MgYXJlIGFsc28gc2ltcGxlLgotCSAqLwotCWtleS0+c2hhcmVkLmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWtleS0+Ym90aC5vZmZzZXQgfD0gRlVUX09GRl9JTk9ERTsgLyogaW5vZGUtYmFzZWQga2V5LiAqLwotCWlmIChsaWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSkpIHsKLQkJa2V5LT5zaGFyZWQucGdvZmYgPSAoKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkKLQkJCQkgICAgICsgdm1hLT52bV9wZ29mZik7Ci0JCXJldHVybiAwOwotCX0KKwlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIAotCS8qCi0JICogV2UgY291bGQgd2FsayB0aGUgcGFnZSB0YWJsZSB0byByZWFkIHRoZSBub24tbGluZWFyCi0JICogcHRlLCBhbmQgZ2V0IHRoZSBwYWdlIGluZGV4IHdpdGhvdXQgZmV0Y2hpbmcgdGhlIHBhZ2UKLQkgKiBmcm9tIHN3YXAuICBCdXQgdGhhdCdzIGEgbG90IG9mIGNvZGUgdG8gZHVwbGljYXRlIGhlcmUKLQkgKiBmb3IgYSByYXJlIGNhc2UsIHNvIHdlIHNpbXBseSBmZXRjaCB0aGUgcGFnZS4KLQkgKi8KLQllcnIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkcmVzcywgMSwgMCwgMCwgJnBhZ2UsIE5VTEwpOwotCWlmIChlcnIgPj0gMCkgewotCQlrZXktPnNoYXJlZC5wZ29mZiA9Ci0JCQlwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQpOwotCQlwdXRfcGFnZShwYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBlcnI7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBUYWtlIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvdXJjZSBhZGRyZXNzZWQgYnkgYSBrZXkuCi0gKiBDYW4gYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgc3BpbmxvY2tzLgotICoKLSAqLwotc3RhdGljIHZvaWQgZ2V0X2Z1dGV4X2tleV9yZWZzKHVuaW9uIGZ1dGV4X2tleSAqa2V5KQorc3RhdGljIGlubGluZQordm9pZCBwdXRfZnV0ZXhfa2V5KGludCBmc2hhcmVkLCB1bmlvbiBmdXRleF9rZXkgKmtleSkKIHsKLQlpZiAoa2V5LT5ib3RoLnB0ciA9PSBOVUxMKQotCQlyZXR1cm47Ci0Jc3dpdGNoIChrZXktPmJvdGgub2Zmc2V0ICYgKEZVVF9PRkZfSU5PREV8RlVUX09GRl9NTVNIQVJFRCkpIHsKLQkJY2FzZSBGVVRfT0ZGX0lOT0RFOgotCQkJYXRvbWljX2luYygma2V5LT5zaGFyZWQuaW5vZGUtPmlfY291bnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRlVUX09GRl9NTVNIQVJFRDoKLQkJCWF0b21pY19pbmMoJmtleS0+cHJpdmF0ZS5tbS0+bW1fY291bnQpOwotCQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogRHJvcCBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UgYWRkcmVzc2VkIGJ5IGEga2V5LgotICogVGhlIGhhc2ggYnVja2V0IHNwaW5sb2NrIG11c3Qgbm90IGJlIGhlbGQuCi0gKi8KLXN0YXRpYyB2b2lkIGRyb3BfZnV0ZXhfa2V5X3JlZnModW5pb24gZnV0ZXhfa2V5ICprZXkpCi17Ci0JaWYgKCFrZXktPmJvdGgucHRyKQotCQlyZXR1cm47Ci0Jc3dpdGNoIChrZXktPmJvdGgub2Zmc2V0ICYgKEZVVF9PRkZfSU5PREV8RlVUX09GRl9NTVNIQVJFRCkpIHsKLQkJY2FzZSBGVVRfT0ZGX0lOT0RFOgotCQkJaXB1dChrZXktPnNoYXJlZC5pbm9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBGVVRfT0ZGX01NU0hBUkVEOgotCQkJbW1kcm9wKGtleS0+cHJpdmF0ZS5tbSk7Ci0JCQlicmVhazsKLQl9CisJZHJvcF9mdXRleF9rZXlfcmVmcyhrZXkpOwogfQogCiBzdGF0aWMgdTMyIGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgdXZhbCwgdTMyIG5ld3ZhbCkKQEAgLTMyOCwxMCArMjk4LDggQEAKIAogLyoKICAqIEZhdWx0IGhhbmRsaW5nLgotICogaWYgZnNoYXJlZCBpcyBub24gTlVMTCwgY3VycmVudC0+bW0tPm1tYXBfc2VtIGlzIGFscmVhZHkgaGVsZAogICovCi1zdGF0aWMgaW50IGZ1dGV4X2hhbmRsZV9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JCQkgICAgICBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkLCBpbnQgYXR0ZW1wdCkKK3N0YXRpYyBpbnQgZnV0ZXhfaGFuZGxlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IGF0dGVtcHQpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CkBAIC0zNDAsOCArMzA4LDcgQEAKIAlpZiAoYXR0ZW1wdCA+IDIpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoIWZzaGFyZWQpCi0JCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwogCWlmICh2bWEgJiYgYWRkcmVzcyA+PSB2bWEtPnZtX3N0YXJ0ICYmCiAJICAgICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSB7CkBAIC0zNjEsOCArMzI4LDcgQEAKIAkJCQljdXJyZW50LT5taW5fZmx0Kys7CiAJCX0KIAl9Ci0JaWYgKCFmc2hhcmVkKQotCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzg1LDYgKzM1MSw3IEBACiAJLyogcGlfbXV0ZXggZ2V0cyBpbml0aWFsaXplZCBsYXRlciAqLwogCXBpX3N0YXRlLT5vd25lciA9IE5VTEw7CiAJYXRvbWljX3NldCgmcGlfc3RhdGUtPnJlZmNvdW50LCAxKTsKKwlwaV9zdGF0ZS0+a2V5ID0gRlVURVhfS0VZX0lOSVQ7CiAKIAljdXJyZW50LT5waV9zdGF0ZV9jYWNoZSA9IHBpX3N0YXRlOwogCkBAIC00NjksNyArNDM2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqaGVhZCA9ICZjdXJyLT5waV9zdGF0ZV9saXN0OwogCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqcGlfc3RhdGU7CiAJc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKLQl1bmlvbiBmdXRleF9rZXkga2V5OworCXVuaW9uIGZ1dGV4X2tleSBrZXkgPSBGVVRFWF9LRVlfSU5JVDsKIAogCWlmICghZnV0ZXhfY21weGNoZ19lbmFibGVkKQogCQlyZXR1cm47CkBAIC02MTQsNyArNTgxLDcgQEAKIAkgKiBUaGUgbG9jayBpbiB3YWtlX3VwX2FsbCgpIGlzIGEgY3J1Y2lhbCBtZW1vcnkgYmFycmllciBhZnRlciB0aGUKIAkgKiBwbGlzdF9kZWwoKSBhbmQgYWxzbyBiZWZvcmUgYXNzaWduaW5nIHRvIHEtPmxvY2tfcHRyLgogCSAqLwotCXdha2VfdXBfYWxsKCZxLT53YWl0ZXJzKTsKKwl3YWtlX3VwKCZxLT53YWl0ZXIpOwogCS8qCiAJICogVGhlIHdhaXRpbmcgdGFzayBjYW4gZnJlZSB0aGUgZnV0ZXhfcSBhcyBzb29uIGFzIHRoaXMgaXMgd3JpdHRlbiwKIAkgKiB3aXRob3V0IHRha2luZyBhbnkgbG9ja3MuICBUaGlzIG11c3QgY29tZSBsYXN0LgpAQCAtNzI2LDIwICs2OTMsMTcgQEAKICAqIFdha2UgdXAgYWxsIHdhaXRlcnMgaGFzaGVkIG9uIHRoZSBwaHlzaWNhbCBwYWdlIHRoYXQgaXMgbWFwcGVkCiAgKiB0byB0aGlzIHZpcnR1YWwgYWRkcmVzczoKICAqLwotc3RhdGljIGludCBmdXRleF93YWtlKHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkLAotCQkgICAgICBpbnQgbnJfd2FrZSwgdTMyIGJpdHNldCkKK3N0YXRpYyBpbnQgZnV0ZXhfd2FrZSh1MzIgX191c2VyICp1YWRkciwgaW50IGZzaGFyZWQsIGludCBucl93YWtlLCB1MzIgYml0c2V0KQogewogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGI7CiAJc3RydWN0IGZ1dGV4X3EgKnRoaXMsICpuZXh0OwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkOwotCXVuaW9uIGZ1dGV4X2tleSBrZXk7CisJdW5pb24gZnV0ZXhfa2V5IGtleSA9IEZVVEVYX0tFWV9JTklUOwogCWludCByZXQ7CiAKIAlpZiAoIWJpdHNldCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwotCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CkBAIC03NjcsNyArNzMxLDcgQEAKIAogCXNwaW5fdW5sb2NrKCZoYi0+bG9jayk7CiBvdXQ6Ci0JZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOworCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzc2LDE5ICs3NDAsMTYgQEAKICAqIHRvIHRoaXMgdmlydHVhbCBhZGRyZXNzOgogICovCiBzdGF0aWMgaW50Ci1mdXRleF93YWtlX29wKHUzMiBfX3VzZXIgKnVhZGRyMSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCwKLQkgICAgICB1MzIgX191c2VyICp1YWRkcjIsCitmdXRleF93YWtlX29wKHUzMiBfX3VzZXIgKnVhZGRyMSwgaW50IGZzaGFyZWQsIHUzMiBfX3VzZXIgKnVhZGRyMiwKIAkgICAgICBpbnQgbnJfd2FrZSwgaW50IG5yX3dha2UyLCBpbnQgb3ApCiB7Ci0JdW5pb24gZnV0ZXhfa2V5IGtleTEsIGtleTI7CisJdW5pb24gZnV0ZXhfa2V5IGtleTEgPSBGVVRFWF9LRVlfSU5JVCwga2V5MiA9IEZVVEVYX0tFWV9JTklUOwogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIxLCAqaGIyOwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBmdXRleF9xICp0aGlzLCAqbmV4dDsKIAlpbnQgcmV0LCBvcF9yZXQsIGF0dGVtcHQgPSAwOwogCiByZXRyeWZ1bGw6Ci0JZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKLQogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmc2hhcmVkLCAma2V5MSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CkBAIC04MzMsMTggKzc5NCwxMiBAQAogCQkgKi8KIAkJaWYgKGF0dGVtcHQrKykgewogCQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyMiwKLQkJCQkJCSBmc2hhcmVkLCBhdHRlbXB0KTsKKwkJCQkJCSBhdHRlbXB0KTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKLQkJLyoKLQkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLAotCQkgKiBmYXVsdCBpdCBpbiBhbmQgc3RhcnQgYWxsIG92ZXIgYWdhaW4uCi0JCSAqLwotCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7Ci0KIAkJcmV0ID0gZ2V0X3VzZXIoZHVtbXksIHVhZGRyMik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtODgwLDcgKzgzNSw4IEBACiAJaWYgKGhiMSAhPSBoYjIpCiAJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwogb3V0OgotCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04ODksMTkgKzg0NSwxNiBAQAogICogUmVxdWV1ZSBhbGwgd2FpdGVycyBoYXNoZWQgb24gb25lIHBoeXNpY2FsIHBhZ2UgdG8gYW5vdGhlcgogICogcGh5c2ljYWwgcGFnZS4KICAqLwotc3RhdGljIGludCBmdXRleF9yZXF1ZXVlKHUzMiBfX3VzZXIgKnVhZGRyMSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCwKLQkJCSB1MzIgX191c2VyICp1YWRkcjIsCitzdGF0aWMgaW50IGZ1dGV4X3JlcXVldWUodTMyIF9fdXNlciAqdWFkZHIxLCBpbnQgZnNoYXJlZCwgdTMyIF9fdXNlciAqdWFkZHIyLAogCQkJIGludCBucl93YWtlLCBpbnQgbnJfcmVxdWV1ZSwgdTMyICpjbXB2YWwpCiB7Ci0JdW5pb24gZnV0ZXhfa2V5IGtleTEsIGtleTI7CisJdW5pb24gZnV0ZXhfa2V5IGtleTEgPSBGVVRFWF9LRVlfSU5JVCwga2V5MiA9IEZVVEVYX0tFWV9JTklUOwogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIxLCAqaGIyOwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkMTsKIAlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7CiAJaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CiAKICByZXRyeToKLQlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwotCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKQEAgLTkyNCwxMiArODc3LDYgQEAKIAkJCWlmIChoYjEgIT0gaGIyKQogCQkJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwogCi0JCQkvKgotCQkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLCBmYXVsdAotCQkJICogaXQgaW4gYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgotCQkJICovCi0JCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7Ci0KIAkJCXJldCA9IGdldF91c2VyKGN1cnZhbCwgdWFkZHIxKTsKIAogCQkJaWYgKCFyZXQpCkBAIC05ODEsNyArOTI4LDggQEAKIAkJZHJvcF9mdXRleF9rZXlfcmVmcygma2V5MSk7CiAKIG91dDoKLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CisJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5Mik7CisJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5MSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTkwLDcgKzkzOCw3IEBACiB7CiAJc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPndhaXRlcnMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPndhaXRlcik7CiAKIAlnZXRfZnV0ZXhfa2V5X3JlZnMoJnEtPmtleSk7CiAJaGIgPSBoYXNoX2Z1dGV4KCZxLT5rZXkpOwpAQCAtMTEwMyw4ICsxMDUxLDcgQEAKICAqIHByaXZhdGUgZnV0ZXhlcy4KICAqLwogc3RhdGljIGludCBmaXh1cF9waV9zdGF0ZV9vd25lcih1MzIgX191c2VyICp1YWRkciwgc3RydWN0IGZ1dGV4X3EgKnEsCi0JCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXdvd25lciwKLQkJCQlzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkKQorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3b3duZXIsIGludCBmc2hhcmVkKQogewogCXUzMiBuZXd0aWQgPSB0YXNrX3BpZF92bnIobmV3b3duZXIpIHwgRlVURVhfV0FJVEVSUzsKIAlzdHJ1Y3QgZnV0ZXhfcGlfc3RhdGUgKnBpX3N0YXRlID0gcS0+cGlfc3RhdGU7CkBAIC0xMTgzLDcgKzExMzAsNyBAQAogaGFuZGxlX2ZhdWx0OgogCXNwaW5fdW5sb2NrKHEtPmxvY2tfcHRyKTsKIAotCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkciwgZnNoYXJlZCwgYXR0ZW1wdCsrKTsKKwlyZXQgPSBmdXRleF9oYW5kbGVfZmF1bHQoKHVuc2lnbmVkIGxvbmcpdWFkZHIsIGF0dGVtcHQrKyk7CiAKIAlzcGluX2xvY2socS0+bG9ja19wdHIpOwogCkBAIC0xMjAzLDEyICsxMTUwLDEzIEBACiAgKiBJbiBjYXNlIHdlIG11c3QgdXNlIHJlc3RhcnRfYmxvY2sgdG8gcmVzdGFydCBhIGZ1dGV4X3dhaXQsCiAgKiB3ZSBlbmNvZGUgaW4gdGhlICdmbGFncycgc2hhcmVkIGNhcGFiaWxpdHkKICAqLwotI2RlZmluZSBGTEFHU19TSEFSRUQgIDEKKyNkZWZpbmUgRkxBR1NfU0hBUkVECQkweDAxCisjZGVmaW5lIEZMQUdTX0NMT0NLUlQJCTB4MDIKIAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KTsKIAotc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkLAotCQkgICAgICB1MzIgdmFsLCBrdGltZV90ICphYnNfdGltZSwgdTMyIGJpdHNldCkKK3N0YXRpYyBpbnQgZnV0ZXhfd2FpdCh1MzIgX191c2VyICp1YWRkciwgaW50IGZzaGFyZWQsCisJCSAgICAgIHUzMiB2YWwsIGt0aW1lX3QgKmFic190aW1lLCB1MzIgYml0c2V0LCBpbnQgY2xvY2tydCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnIpOwpAQCAtMTIyNSw4ICsxMTczLDcgQEAKIAlxLnBpX3N0YXRlID0gTlVMTDsKIAlxLmJpdHNldCA9IGJpdHNldDsKICByZXRyeToKLQlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwotCisJcS5rZXkgPSBGVVRFWF9LRVlfSU5JVDsKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X3JlbGVhc2Vfc2VtOwpAQCAtMTI1OCwxMiArMTIwNSw2IEBACiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJcXVldWVfdW5sb2NrKCZxLCBoYik7CiAKLQkJLyoKLQkJICogSWYgd2Ugd291bGQgaGF2ZSBmYXVsdGVkLCByZWxlYXNlIG1tYXBfc2VtLCBmYXVsdCBpdCBpbiBhbmQKLQkJICogc3RhcnQgYWxsIG92ZXIgYWdhaW4uCi0JCSAqLwotCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7Ci0KIAkJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCiAJCWlmICghcmV0KQpAQCAtMTI3OCwxMiArMTIxOSw2IEBACiAJcXVldWVfbWUoJnEsIGhiKTsKIAogCS8qCi0JICogTm93IHRoZSBmdXRleCBpcyBxdWV1ZWQgYW5kIHdlIGhhdmUgY2hlY2tlZCB0aGUgZGF0YSwgd2UKLQkgKiBkb24ndCB3YW50IHRvIGhvbGQgbW1hcF9zZW0gd2hpbGUgd2Ugc2xlZXAuCi0JICovCi0JZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwotCi0JLyoKIAkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKIAkgKiBjYW5ub3QgaG9sZCBhIHNwaW5sb2NrIGFjcm9zcyB0aGUgZ2V0X3VzZXIoKSBpbiBjYXNlIGl0CiAJICogZmF1bHRzLCBhbmQgd2UgY2Fubm90IGp1c3Qgc2V0IFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZSB3aGVuCkBAIC0xMjk0LDcgKzEyMjksNyBAQAogCiAJLyogYWRkX3dhaXRfcXVldWUgaXMgdGhlIGJhcnJpZXIgYWZ0ZXIgX19zZXRfY3VycmVudF9zdGF0ZS4gKi8KIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUoJnEud2FpdGVycywgJndhaXQpOworCWFkZF93YWl0X3F1ZXVlKCZxLndhaXRlciwgJndhaXQpOwogCS8qCiAJICogIXBsaXN0X25vZGVfZW1wdHkoKSBpcyBzYWZlIGhlcmUgd2l0aG91dCBhbnkgbG9jay4KIAkgKiBxLmxvY2tfcHRyICE9IDAgaXMgbm90IHNhZmUsIGJlY2F1c2Ugb2Ygb3JkZXJpbmcgYWdhaW5zdCB3YWtldXAuCkBAIC0xMzA3LDggKzEyNDIsMTAgQEAKIAkJCXNsYWNrID0gY3VycmVudC0+dGltZXJfc2xhY2tfbnM7CiAJCQlpZiAocnRfdGFzayhjdXJyZW50KSkKIAkJCQlzbGFjayA9IDA7Ci0JCQlocnRpbWVyX2luaXRfb25fc3RhY2soJnQudGltZXIsIENMT0NLX01PTk9UT05JQywKLQkJCQkJCUhSVElNRVJfTU9ERV9BQlMpOworCQkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0LnRpbWVyLAorCQkJCQkgICAgICBjbG9ja3J0ID8gQ0xPQ0tfUkVBTFRJTUUgOgorCQkJCQkgICAgICBDTE9DS19NT05PVE9OSUMsCisJCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwogCQkJaHJ0aW1lcl9pbml0X3NsZWVwZXIoJnQsIGN1cnJlbnQpOwogCQkJaHJ0aW1lcl9zZXRfZXhwaXJlc19yYW5nZV9ucygmdC50aW1lciwgKmFic190aW1lLCBzbGFjayk7CiAKQEAgLTEzNjMsNiArMTMwMCw4IEBACiAKIAkJaWYgKGZzaGFyZWQpCiAJCQlyZXN0YXJ0LT5mdXRleC5mbGFncyB8PSBGTEFHU19TSEFSRUQ7CisJCWlmIChjbG9ja3J0KQorCQkJcmVzdGFydC0+ZnV0ZXguZmxhZ3MgfD0gRkxBR1NfQ0xPQ0tSVDsKIAkJcmV0dXJuIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s7CiAJfQogCkBAIC0xMzcwLDcgKzEzMDksNyBAQAogCXF1ZXVlX3VubG9jaygmcSwgaGIpOwogCiAgb3V0X3JlbGVhc2Vfc2VtOgotCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM3OCwxNSArMTMxNywxNiBAQAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KQogewogCXUzMiBfX3VzZXIgKnVhZGRyID0gKHUzMiBfX3VzZXIgKilyZXN0YXJ0LT5mdXRleC51YWRkcjsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkID0gTlVMTDsKKwlpbnQgZnNoYXJlZCA9IDA7CiAJa3RpbWVfdCB0OwogCiAJdC50djY0ID0gcmVzdGFydC0+ZnV0ZXgudGltZTsKIAlyZXN0YXJ0LT5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbDsKIAlpZiAocmVzdGFydC0+ZnV0ZXguZmxhZ3MgJiBGTEFHU19TSEFSRUQpCi0JCWZzaGFyZWQgPSAmY3VycmVudC0+bW0tPm1tYXBfc2VtOworCQlmc2hhcmVkID0gMTsKIAlyZXR1cm4gKGxvbmcpZnV0ZXhfd2FpdCh1YWRkciwgZnNoYXJlZCwgcmVzdGFydC0+ZnV0ZXgudmFsLCAmdCwKLQkJCQlyZXN0YXJ0LT5mdXRleC5iaXRzZXQpOworCQkJCXJlc3RhcnQtPmZ1dGV4LmJpdHNldCwKKwkJCQlyZXN0YXJ0LT5mdXRleC5mbGFncyAmIEZMQUdTX0NMT0NLUlQpOwogfQogCiAKQEAgLTEzOTYsNyArMTMzNiw3IEBACiAgKiBpZiB0aGVyZSBhcmUgd2FpdGVycyB0aGVuIGl0IHdpbGwgYmxvY2ssIGl0IGRvZXMgUEksIGV0Yy4gKER1ZSB0bwogICogcmFjZXMgdGhlIGtlcm5lbCBtaWdodCBzZWUgYSAwIHZhbHVlIG9mIHRoZSBmdXRleCB0b28uKQogICovCi1zdGF0aWMgaW50IGZ1dGV4X2xvY2tfcGkodTMyIF9fdXNlciAqdWFkZHIsIHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQsCitzdGF0aWMgaW50IGZ1dGV4X2xvY2tfcGkodTMyIF9fdXNlciAqdWFkZHIsIGludCBmc2hhcmVkLAogCQkJIGludCBkZXRlY3QsIGt0aW1lX3QgKnRpbWUsIGludCB0cnlsb2NrKQogewogCXN0cnVjdCBocnRpbWVyX3NsZWVwZXIgdGltZW91dCwgKnRvID0gTlVMTDsKQEAgLTE0MTksOCArMTM1OSw3IEBACiAKIAlxLnBpX3N0YXRlID0gTlVMTDsKICByZXRyeToKLQlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwotCisJcS5rZXkgPSBGVVRFWF9LRVlfSU5JVDsKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X3JlbGVhc2Vfc2VtOwpAQCAtMTUwOSw3ICsxNDQ4LDYgQEAKIAkJCSAqIGV4aXQgdG8gY29tcGxldGUuCiAJCQkgKi8KIAkJCXF1ZXVlX3VubG9jaygmcSwgaGIpOwotCQkJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCQlnb3RvIHJldHJ5OwogCkBAIC0xNTQxLDEyICsxNDc5LDYgQEAKIAkgKi8KIAlxdWV1ZV9tZSgmcSwgaGIpOwogCi0JLyoKLQkgKiBOb3cgdGhlIGZ1dGV4IGlzIHF1ZXVlZCBhbmQgd2UgaGF2ZSBjaGVja2VkIHRoZSBkYXRhLCB3ZQotCSAqIGRvbid0IHdhbnQgdG8gaG9sZCBtbWFwX3NlbSB3aGlsZSB3ZSBzbGVlcC4KLQkgKi8KLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7Ci0KIAlXQVJOX09OKCFxLnBpX3N0YXRlKTsKIAkvKgogCSAqIEJsb2NrIG9uIHRoZSBQSSBtdXRleDoKQEAgLTE1NTksNyArMTQ5MSw2IEBACiAJCXJldCA9IHJldCA/IDAgOiAtRVdPVUxEQkxPQ0s7CiAJfQogCi0JZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAlzcGluX2xvY2socS5sb2NrX3B0cik7CiAKIAlpZiAoIXJldCkgewpAQCAtMTYyNSw3ICsxNTU2LDYgQEAKIAogCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2sgKi8KIAl1bnF1ZXVlX21lX3BpKCZxKTsKLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlpZiAodG8pCiAJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdG8tPnRpbWVyKTsKQEAgLTE2MzUsMzQgKzE1NjUsMzAgQEAKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAogIG91dF9yZWxlYXNlX3NlbToKLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CisJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh0bykKIAkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwogCXJldHVybiByZXQ7CiAKICB1YWRkcl9mYXVsdGVkOgogCS8qCi0JICogV2UgaGF2ZSB0byByL3cgICooaW50IF9fdXNlciAqKXVhZGRyLCBidXQgd2UgY2FuJ3QgbW9kaWZ5IGl0Ci0JICogbm9uLWF0b21pY2FsbHkuICBUaGVyZWZvcmUsIGlmIGdldF91c2VyIGJlbG93IGlzIG5vdAotCSAqIGVub3VnaCwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGZhdWx0IG91cnNlbHZlcywgd2hpbGUKLQkgKiBzdGlsbCBob2xkaW5nIHRoZSBtbWFwX3NlbS4KLQkgKgotCSAqIC4uLiBhbmQgaGItPmxvY2suIDotKSAtLUFOSworCSAqIFdlIGhhdmUgdG8gci93ICAqKGludCBfX3VzZXIgKil1YWRkciwgYW5kIHdlIGhhdmUgdG8gbW9kaWZ5IGl0CisJICogYXRvbWljYWxseS4gIFRoZXJlZm9yZSwgaWYgd2UgY29udGludWUgdG8gZmF1bHQgYWZ0ZXIgZ2V0X3VzZXIoKQorCSAqIGJlbG93LCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgZmF1bHQgb3Vyc2VsdmVzLCB3aGlsZSBzdGlsbCBob2xkaW5nCisJICogdGhlIG1tYXBfc2VtLiAgVGhpcyBjYW4gb2NjdXIgaWYgdGhlIHVhZGRyIGlzIHVuZGVyIGNvbnRlbnRpb24gYXMKKwkgKiB3ZSBoYXZlIHRvIGRyb3AgdGhlIG1tYXBfc2VtIGluIG9yZGVyIHRvIGNhbGwgZ2V0X3VzZXIoKS4KIAkgKi8KIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAogCWlmIChhdHRlbXB0KyspIHsKLQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyLCBmc2hhcmVkLAotCQkJCQkgYXR0ZW1wdCk7CisJCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkciwgYXR0ZW1wdCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9yZWxlYXNlX3NlbTsKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7Ci0KIAlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7Ci0JaWYgKCFyZXQgJiYgKHV2YWwgIT0gLUVGQVVMVCkpCisJaWYgKCFyZXQpCiAJCWdvdG8gcmV0cnk7CiAKIAlpZiAodG8pCkBAIC0xNjc1LDEzICsxNjAxLDEzIEBACiAgKiBUaGlzIGlzIHRoZSBpbi1rZXJuZWwgc2xvd3BhdGg6IHdlIGxvb2sgdXAgdGhlIFBJIHN0YXRlIChpZiBhbnkpLAogICogYW5kIGRvIHRoZSBydC1tdXRleCB1bmxvY2suCiAgKi8KLXN0YXRpYyBpbnQgZnV0ZXhfdW5sb2NrX3BpKHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkKQorc3RhdGljIGludCBmdXRleF91bmxvY2tfcGkodTMyIF9fdXNlciAqdWFkZHIsIGludCBmc2hhcmVkKQogewogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGI7CiAJc3RydWN0IGZ1dGV4X3EgKnRoaXMsICpuZXh0OwogCXUzMiB1dmFsOwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkOwotCXVuaW9uIGZ1dGV4X2tleSBrZXk7CisJdW5pb24gZnV0ZXhfa2V5IGtleSA9IEZVVEVYX0tFWV9JTklUOwogCWludCByZXQsIGF0dGVtcHQgPSAwOwogCiByZXRyeToKQEAgLTE2OTIsMTAgKzE2MTgsNiBAQAogCSAqLwogCWlmICgodXZhbCAmIEZVVEVYX1RJRF9NQVNLKSAhPSB0YXNrX3BpZF92bnIoY3VycmVudCkpCiAJCXJldHVybiAtRVBFUk07Ci0JLyoKLQkgKiBGaXJzdCB0YWtlIGFsbCB0aGUgZnV0ZXggcmVsYXRlZCBsb2NrczoKLQkgKi8KLQlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTE3NTQsMzQgKzE2NzYsMzAgQEAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIG91dDoKLQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CisJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5KTsKIAogCXJldHVybiByZXQ7CiAKIHBpX2ZhdWx0ZWQ6CiAJLyoKLQkgKiBXZSBoYXZlIHRvIHIvdyAgKihpbnQgX191c2VyICopdWFkZHIsIGJ1dCB3ZSBjYW4ndCBtb2RpZnkgaXQKLQkgKiBub24tYXRvbWljYWxseS4gIFRoZXJlZm9yZSwgaWYgZ2V0X3VzZXIgYmVsb3cgaXMgbm90Ci0JICogZW5vdWdoLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgZmF1bHQgb3Vyc2VsdmVzLCB3aGlsZQotCSAqIHN0aWxsIGhvbGRpbmcgdGhlIG1tYXBfc2VtLgotCSAqCi0JICogLi4uIGFuZCBoYi0+bG9jay4gLS1BTksKKwkgKiBXZSBoYXZlIHRvIHIvdyAgKihpbnQgX191c2VyICopdWFkZHIsIGFuZCB3ZSBoYXZlIHRvIG1vZGlmeSBpdAorCSAqIGF0b21pY2FsbHkuICBUaGVyZWZvcmUsIGlmIHdlIGNvbnRpbnVlIHRvIGZhdWx0IGFmdGVyIGdldF91c2VyKCkKKwkgKiBiZWxvdywgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGZhdWx0IG91cnNlbHZlcywgd2hpbGUgc3RpbGwgaG9sZGluZworCSAqIHRoZSBtbWFwX3NlbS4gIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSB1YWRkciBpcyB1bmRlciBjb250ZW50aW9uIGFzCisJICogd2UgaGF2ZSB0byBkcm9wIHRoZSBtbWFwX3NlbSBpbiBvcmRlciB0byBjYWxsIGdldF91c2VyKCkuCiAJICovCiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIAogCWlmIChhdHRlbXB0KyspIHsKLQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyLCBmc2hhcmVkLAotCQkJCQkgYXR0ZW1wdCk7CisJCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkciwgYXR0ZW1wdCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAkJdXZhbCA9IDA7CiAJCWdvdG8gcmV0cnlfdW5sb2NrZWQ7CiAJfQogCi0JZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwotCiAJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwotCWlmICghcmV0ICYmICh1dmFsICE9IC1FRkFVTFQpKQorCWlmICghcmV0KQogCQlnb3RvIHJldHJ5OwogCiAJcmV0dXJuIHJldDsKQEAgLTE5MDgsOCArMTgyNiw3IEBACiAJCSAqIFBJIGZ1dGV4ZXMgaGFwcGVucyBpbiBleGl0X3BpX3N0YXRlKCk6CiAJCSAqLwogCQlpZiAoIXBpICYmICh1dmFsICYgRlVURVhfV0FJVEVSUykpCi0JCQlmdXRleF93YWtlKHVhZGRyLCAmY3Vyci0+bW0tPm1tYXBfc2VtLCAxLAotCQkJCSAgIEZVVEVYX0JJVFNFVF9NQVRDSF9BTlkpOworCQkJZnV0ZXhfd2FrZSh1YWRkciwgMSwgMSwgRlVURVhfQklUU0VUX01BVENIX0FOWSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjAwMywxOCArMTkyMCwyMiBAQAogbG9uZyBkb19mdXRleCh1MzIgX191c2VyICp1YWRkciwgaW50IG9wLCB1MzIgdmFsLCBrdGltZV90ICp0aW1lb3V0LAogCQl1MzIgX191c2VyICp1YWRkcjIsIHUzMiB2YWwyLCB1MzIgdmFsMykKIHsKLQlpbnQgcmV0ID0gLUVOT1NZUzsKKwlpbnQgY2xvY2tydCwgcmV0ID0gLUVOT1NZUzsKIAlpbnQgY21kID0gb3AgJiBGVVRFWF9DTURfTUFTSzsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlICpmc2hhcmVkID0gTlVMTDsKKwlpbnQgZnNoYXJlZCA9IDA7CiAKIAlpZiAoIShvcCAmIEZVVEVYX1BSSVZBVEVfRkxBRykpCi0JCWZzaGFyZWQgPSAmY3VycmVudC0+bW0tPm1tYXBfc2VtOworCQlmc2hhcmVkID0gMTsKKworCWNsb2NrcnQgPSBvcCAmIEZVVEVYX0NMT0NLX1JFQUxUSU1FOworCWlmIChjbG9ja3J0ICYmIGNtZCAhPSBGVVRFWF9XQUlUX0JJVFNFVCkKKwkJcmV0dXJuIC1FTk9TWVM7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRlVURVhfV0FJVDoKIAkJdmFsMyA9IEZVVEVYX0JJVFNFVF9NQVRDSF9BTlk7CiAJY2FzZSBGVVRFWF9XQUlUX0JJVFNFVDoKLQkJcmV0ID0gZnV0ZXhfd2FpdCh1YWRkciwgZnNoYXJlZCwgdmFsLCB0aW1lb3V0LCB2YWwzKTsKKwkJcmV0ID0gZnV0ZXhfd2FpdCh1YWRkciwgZnNoYXJlZCwgdmFsLCB0aW1lb3V0LCB2YWwzLCBjbG9ja3J0KTsKIAkJYnJlYWs7CiAJY2FzZSBGVVRFWF9XQUtFOgogCQl2YWwzID0gRlVURVhfQklUU0VUX01BVENIX0FOWTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IDQ3ZTYzMzQuLmJkYTljYjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtNDQyLDIyICs0NDIsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2hydGltZXJfZGVhY3RpdmF0ZShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQogI2VuZGlmCiAKLS8qCi0gKiBDaGVjaywgd2hldGhlciB0aGUgdGltZXIgaXMgb24gdGhlIGNhbGxiYWNrIHBlbmRpbmcgbGlzdAotICovCi1zdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2NiX3BlbmRpbmcoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyKQotewotCXJldHVybiB0aW1lci0+c3RhdGUgJiBIUlRJTUVSX1NUQVRFX1BFTkRJTkc7Ci19Ci0KLS8qCi0gKiBSZW1vdmUgYSB0aW1lciBmcm9tIHRoZSBjYWxsYmFjayBwZW5kaW5nIGxpc3QKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfcmVtb3ZlX2NiX3BlbmRpbmcoc3RydWN0IGhydGltZXIgKnRpbWVyKQotewotCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5jYl9lbnRyeSk7Ci19Ci0KIC8qIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciByZWxhdGVkIGZ1bmN0aW9ucyAqLwogI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKIApAQCAtNjUxLDYgKzYzNSw4IEBACiB7CiB9CiAKK3N0YXRpYyB2b2lkIF9fcnVuX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKTsKKwogLyoKICAqIFdoZW4gSGlnaCByZXNvbHV0aW9uIHRpbWVycyBhcmUgYWN0aXZlLCB0cnkgdG8gcmVwcm9ncmFtLiBOb3RlLCB0aGF0IGluIGNhc2UKICAqIHRoZSBzdGF0ZSBoYXMgSFJUSU1FUl9TVEFURV9DQUxMQkFDSyBzZXQsIG5vIHJlcHJvZ3JhbW1pbmcgYW5kIG5vIGV4cGlyeQpAQCAtNjYxLDMxICs2NDcsMTQgQEAKIAkJCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCiB7CiAJaWYgKGJhc2UtPmNwdV9iYXNlLT5ocmVzX2FjdGl2ZSAmJiBocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgYmFzZSkpIHsKLQotCQkvKiBUaW1lciBpcyBleHBpcmVkLCBhY3QgdXBvbiB0aGUgY2FsbGJhY2sgbW9kZSAqLwotCQlzd2l0Y2godGltZXItPmNiX21vZGUpIHsKLQkJY2FzZSBIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVOgotCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRDoKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIHNvbGVseSBmb3IgdGhlIHNjaGVkIHRpY2sgZW11bGF0aW9uIHdpdGgKLQkJCSAqIGR5bmFtaWMgdGljayBzdXBwb3J0IHRvIGVuc3VyZSB0aGF0IHdlIGRvIG5vdAotCQkJICogcmVzdGFydCB0aGUgdGljayByaWdodCBvbiB0aGUgZWRnZSBhbmQgZW5kIHVwIHdpdGgKLQkJCSAqIHRoZSB0aWNrIHRpbWVyIGluIHRoZSBzb2Z0aXJxICEgVGhlIGNhbGxpbmcgc2l0ZQotCQkJICogdGFrZXMgY2FyZSBvZiB0aGlzLiBBbHNvIHVzZWQgZm9yIGhydGltZXIgc2xlZXBlciAhCi0JCQkgKi8KLQkJCWRlYnVnX2hydGltZXJfZGVhY3RpdmF0ZSh0aW1lcik7Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBIUlRJTUVSX0NCX1NPRlRJUlE6Ci0JCQkvKgotCQkJICogTW92ZSBldmVyeXRoaW5nIGVsc2UgaW50byB0aGUgc29mdGlycSBwZW5kaW5nIGxpc3QgIQotCQkJICovCi0JCQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+Y2JfZW50cnksCi0JCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKLQkJCXRpbWVyLT5zdGF0ZSA9IEhSVElNRVJfU1RBVEVfUEVORElORzsKLQkJCXJldHVybiAxOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCX0KKwkJLyoKKwkJICogWFhYOiByZWN1cnNpb24gY2hlY2s/CisJCSAqIGhydGltZXJfZm9yd2FyZCgpIHNob3VsZCByb3VuZCB1cCB3aXRoIHRpbWVyIGdyYW51bGFyaXR5CisJCSAqIHNvIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gaW5mIHJlY3Vyc2lvbiBoZXJlLAorCQkgKiBpdCBkb2Vzbid0IGRvIHRoYXQgdGhvdWdoCisJCSAqLworCQlfX3J1bl9ocnRpbWVyKHRpbWVyKTsKKwkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzI0LDExICs2OTMsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yYWlzZV9zb2Z0aXJxKHZvaWQpCi17Ci0JcmFpc2Vfc29mdGlycShIUlRJTUVSX1NPRlRJUlEpOwotfQotCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2hyZXNfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KQEAgLTc0Nyw3ICs3MTEsNiBAQAogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfcmFpc2Vfc29mdGlycSh2b2lkKSB7IH0KIAogI2VuZGlmIC8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KIApAQCAtODkwLDEwICs4NTMsNyBAQAogCQkJICAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlLAogCQkJICAgICB1bnNpZ25lZCBsb25nIG5ld3N0YXRlLCBpbnQgcmVwcm9ncmFtKQogewotCS8qIEhpZ2ggcmVzLiBjYWxsYmFjayBsaXN0LiBOT1AgZm9yICFISUdIUkVTICovCi0JaWYgKGhydGltZXJfY2JfcGVuZGluZyh0aW1lcikpCi0JCWhydGltZXJfcmVtb3ZlX2NiX3BlbmRpbmcodGltZXIpOwotCWVsc2UgeworCWlmICh0aW1lci0+c3RhdGUgJiBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEKSB7CiAJCS8qCiAJCSAqIFJlbW92ZSB0aGUgdGltZXIgZnJvbSB0aGUgcmJ0cmVlIGFuZCByZXBsYWNlIHRoZQogCQkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KQEAgLTk1Myw3ICs5MTMsNyBAQAogewogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsICpuZXdfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQsIHJhaXNlOworCWludCByZXQ7CiAKIAliYXNlID0gbG9ja19ocnRpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CiAKQEAgLTk4OCwyNiArOTQ4LDggQEAKIAllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlLAogCQkJbmV3X2Jhc2UtPmNwdV9iYXNlID09ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpKTsKIAotCS8qCi0JICogVGhlIHRpbWVyIG1heSBiZSBleHBpcmVkIGFuZCBtb3ZlZCB0byB0aGUgY2JfcGVuZGluZwotCSAqIGxpc3QuIFdlIGNhbiBub3QgcmFpc2UgdGhlIHNvZnRpcnEgd2l0aCBiYXNlIGxvY2sgaGVsZCBkdWUKLQkgKiB0byBhIHBvc3NpYmxlIGRlYWRsb2NrIHdpdGggcnVucXVldWUgbG9jay4KLQkgKi8KLQlyYWlzZSA9IHRpbWVyLT5zdGF0ZSA9PSBIUlRJTUVSX1NUQVRFX1BFTkRJTkc7Ci0KLQkvKgotCSAqIFdlIHVzZSBwcmVlbXB0X2Rpc2FibGUgdG8gcHJldmVudCB0aGlzIHRhc2sgZnJvbSBtaWdyYXRpbmcgYWZ0ZXIKLQkgKiBzZXR0aW5nIHVwIHRoZSBzb2Z0aXJxIGFuZCByYWlzaW5nIGl0LiBPdGhlcndpc2UsIGlmIG1lIG1pZ3JhdGUKLQkgKiB3ZSB3aWxsIHJhaXNlIHRoZSBzb2Z0aXJxIG9uIHRoZSB3cm9uZyBDUFUuCi0JICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCi0JaWYgKHJhaXNlKQotCQlocnRpbWVyX3JhaXNlX3NvZnRpcnEoKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGhydGltZXJfc3RhcnRfcmFuZ2VfbnMpOwpAQCAtMTE5Miw3NSArMTEzNCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZXMpOwogCi1zdGF0aWMgdm9pZCBydW5faHJ0aW1lcl9wZW5kaW5nKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSkKLXsKLQlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNwdV9iYXNlLT5jYl9wZW5kaW5nKSkgewotCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKLQkJc3RydWN0IGhydGltZXIgKnRpbWVyOwotCQlpbnQgcmVzdGFydDsKLQkJaW50IGVtdWxhdGVfaGFyZGlycV9jdHggPSAwOwotCi0JCXRpbWVyID0gbGlzdF9lbnRyeShjcHVfYmFzZS0+Y2JfcGVuZGluZy5uZXh0LAotCQkJCSAgIHN0cnVjdCBocnRpbWVyLCBjYl9lbnRyeSk7Ci0KLQkJZGVidWdfaHJ0aW1lcl9kZWFjdGl2YXRlKHRpbWVyKTsKLQkJdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHRpbWVyKTsKLQotCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKLQkJLyoKLQkJICogQSB0aW1lciBtaWdodCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNiX3BlbmRpbmcgbGlzdAotCQkgKiB3aGVuIGl0IHdhcyBtaWdyYXRlZCBkdXJpbmcgYSBjcHUtb2ZmbGluZSBvcGVyYXRpb24uCi0JCSAqIEVtdWxhdGUgaGFyZGlycSBjb250ZXh0IGZvciBzdWNoIHRpbWVycy4KLQkJICovCi0JCWlmICh0aW1lci0+Y2JfbW9kZSA9PSBIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVIHx8Ci0JCSAgICB0aW1lci0+Y2JfbW9kZSA9PSBIUlRJTUVSX0NCX0lSUVNBRkVfVU5MT0NLRUQpCi0JCQllbXVsYXRlX2hhcmRpcnFfY3R4ID0gMTsKLQotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCB0aW1lci0+YmFzZSwgSFJUSU1FUl9TVEFURV9DQUxMQkFDSywgMCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwotCi0JCWlmICh1bmxpa2VseShlbXVsYXRlX2hhcmRpcnFfY3R4KSkgewotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJCXJlc3RhcnQgPSBmbih0aW1lcik7Ci0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCX0gZWxzZQotCQkJcmVzdGFydCA9IGZuKHRpbWVyKTsKLQotCQlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7Ci0KLQkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOwotCQlpZiAocmVzdGFydCA9PSBIUlRJTUVSX1JFU1RBUlQpIHsKLQkJCUJVR19PTihocnRpbWVyX2FjdGl2ZSh0aW1lcikpOwotCQkJLyoKLQkJCSAqIEVucXVldWUgdGhlIHRpbWVyLCBhbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudAotCQkJICogZGV2aWNlCi0JCQkgKi8KLQkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgdGltZXItPmJhc2UsIDEpOwotCQl9IGVsc2UgaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgewotCQkJLyoKLQkJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVhcm1lZCBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtCi0JCQkgKiB0aGUgZXZlbnQgZGV2aWNlLgotCQkJICovCi0JCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlID0gdGltZXItPmJhc2U7Ci0KLQkJCWlmIChiYXNlLT5maXJzdCA9PSAmdGltZXItPm5vZGUgJiYKLQkJCSAgICBocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgYmFzZSkpIHsKLQkJCQkvKgotCQkJCSAqIFRpbWVyIGlzIGV4cGlyZWQuIFRodXMgbW92ZSBpdCBmcm9tIHRyZWUgdG8KLQkJCQkgKiBwZW5kaW5nIGxpc3QgYWdhaW4uCi0JCQkJICovCi0JCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKLQkJCQkJCSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcsIDApOwotCQkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKLQkJCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnEoJmNwdV9iYXNlLT5sb2NrKTsKLX0KLQogc3RhdGljIHZvaWQgX19ydW5faHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlOwpAQCAtMTI2OCwyNSArMTE0MSwyMSBAQAogCWVudW0gaHJ0aW1lcl9yZXN0YXJ0ICgqZm4pKHN0cnVjdCBocnRpbWVyICopOwogCWludCByZXN0YXJ0OwogCisJV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKKwogCWRlYnVnX2hydGltZXJfZGVhY3RpdmF0ZSh0aW1lcik7CiAJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9DQUxMQkFDSywgMCk7CiAJdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHRpbWVyKTsKLQogCWZuID0gdGltZXItPmZ1bmN0aW9uOwotCWlmICh0aW1lci0+Y2JfbW9kZSA9PSBIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVIHx8Ci0JICAgIHRpbWVyLT5jYl9tb2RlID09IEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRCkgewotCQkvKgotCQkgKiBVc2VkIGZvciBzY2hlZHVsZXIgdGltZXJzLCBhdm9pZCBsb2NrIGludmVyc2lvbiB3aXRoCi0JCSAqIHJxLT5sb2NrIGFuZCB0YXNrbGlzdF9sb2NrLgotCQkgKgotCQkgKiBUaGVzZSB0aW1lcnMgYXJlIHJlcXVpcmVkIHRvIGRlYWwgd2l0aCBlbnF1ZXVlIGV4cGlyeQotCQkgKiB0aGVtc2VsdmVzIGFuZCBhcmUgbm90IGFsbG93ZWQgdG8gbWlncmF0ZS4KLQkJICovCi0JCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7Ci0JCXJlc3RhcnQgPSBmbih0aW1lcik7Ci0JCXNwaW5fbG9jaygmY3B1X2Jhc2UtPmxvY2spOwotCX0gZWxzZQotCQlyZXN0YXJ0ID0gZm4odGltZXIpOworCisJLyoKKwkgKiBCZWNhdXNlIHdlIHJ1biB0aW1lcnMgZnJvbSBoYXJkaXJxIGNvbnRleHQsIHRoZXJlIGlzIG5vIGNoYW5jZQorCSAqIHRoZXkgZ2V0IG1pZ3JhdGVkIHRvIGFub3RoZXIgY3B1LCB0aGVyZWZvcmUgaXRzIHNhZmUgdG8gdW5sb2NrCisJICogdGhlIHRpbWVyIGJhc2UuCisJICovCisJc3Bpbl91bmxvY2soJmNwdV9iYXNlLT5sb2NrKTsKKwlyZXN0YXJ0ID0gZm4odGltZXIpOworCXNwaW5fbG9jaygmY3B1X2Jhc2UtPmxvY2spOwogCiAJLyoKIAkgKiBOb3RlOiBXZSBjbGVhciB0aGUgQ0FMTEJBQ0sgYml0IGFmdGVyIGVucXVldWVfaHJ0aW1lciB0byBhdm9pZApAQCAtMTMxMSw3ICsxMTgwLDcgQEAKIAlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKIAlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3c7Ci0JaW50IGksIHJhaXNlID0gMDsKKwlpbnQgaTsKIAogCUJVR19PTighY3B1X2Jhc2UtPmhyZXNfYWN0aXZlKTsKIAljcHVfYmFzZS0+bnJfZXZlbnRzKys7CkBAIC0xMzYwLDE2ICsxMjI5LDYgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJLyogTW92ZSBzb2Z0aXJxIGNhbGxiYWNrcyB0byB0aGUgcGVuZGluZyBsaXN0ICovCi0JCQlpZiAodGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9TT0ZUSVJRKSB7Ci0JCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKLQkJCQkJCSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcsIDApOwotCQkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKLQkJCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKLQkJCQlyYWlzZSA9IDE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KIAkJCV9fcnVuX2hydGltZXIodGltZXIpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7CkBAIC0xMzgzLDEwICsxMjQyLDYgQEAKIAkJaWYgKHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDApKQogCQkJZ290byByZXRyeTsKIAl9Ci0KLQkvKiBSYWlzZSBzb2Z0aXJxID8gKi8KLQlpZiAocmFpc2UpCi0JCXJhaXNlX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRKTsKIH0KIAogLyoqCkBAIC0xNDEzLDExICsxMjY4LDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ1bl9ocnRpbWVyX3NvZnRpcnEoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQotewotCXJ1bl9ocnRpbWVyX3BlbmRpbmcoJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcykpOwotfQotCiAjZW5kaWYJLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLwogCiAvKgpAQCAtMTQyOSw4ICsxMjc5LDYgQEAKICAqLwogdm9pZCBocnRpbWVyX3J1bl9wZW5kaW5nKHZvaWQpCiB7Ci0Jc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7Ci0KIAlpZiAoaHJ0aW1lcl9ocmVzX2FjdGl2ZSgpKQogCQlyZXR1cm47CiAKQEAgLTE0NDQsOCArMTI5Miw2IEBACiAJICovCiAJaWYgKHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoIWhydGltZXJfaXNfaHJlc19lbmFibGVkKCkpKQogCQlocnRpbWVyX3N3aXRjaF90b19ocmVzKCk7Ci0KLQlydW5faHJ0aW1lcl9wZW5kaW5nKGNwdV9iYXNlKTsKIH0KIAogLyoKQEAgLTE0ODIsMTQgKzEzMjgsNiBAQAogCQkJCQlocnRpbWVyX2dldF9leHBpcmVzX3R2NjQodGltZXIpKQogCQkJCWJyZWFrOwogCi0JCQlpZiAodGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9TT0ZUSVJRKSB7Ci0JCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKLQkJCQkJSFJUSU1FUl9TVEFURV9QRU5ESU5HLCAwKTsKLQkJCQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+Y2JfZW50cnksCi0JCQkJCSZiYXNlLT5jcHVfYmFzZS0+Y2JfcGVuZGluZyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KIAkJCV9fcnVuX2hydGltZXIodGltZXIpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7CkBAIC0xNTE2LDkgKzEzNTQsNiBAQAogewogCXNsLT50aW1lci5mdW5jdGlvbiA9IGhydGltZXJfd2FrZXVwOwogCXNsLT50YXNrID0gdGFzazsKLSNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCi0Jc2wtPnRpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfVU5MT0NLRUQ7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBfX3NjaGVkIGRvX25hbm9zbGVlcChzdHJ1Y3QgaHJ0aW1lcl9zbGVlcGVyICp0LCBlbnVtIGhydGltZXJfbW9kZSBtb2RlKQpAQCAtMTY1NSwxOCArMTQ5MCwxNiBAQAogCWZvciAoaSA9IDA7IGkgPCBIUlRJTUVSX01BWF9DTE9DS19CQVNFUzsgaSsrKQogCQljcHVfYmFzZS0+Y2xvY2tfYmFzZVtpXS5jcHVfYmFzZSA9IGNwdV9iYXNlOwogCi0JSU5JVF9MSVNUX0hFQUQoJmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKIAlocnRpbWVyX2luaXRfaHJlcyhjcHVfYmFzZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpvbGRfYmFzZSwKLQkJCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpuZXdfYmFzZSwgaW50IGRjcHUpCitzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpvbGRfYmFzZSwKKwkJCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpuZXdfYmFzZSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0JaW50IHJhaXNlID0gMDsKIAogCXdoaWxlICgobm9kZSA9IHJiX2ZpcnN0KCZvbGRfYmFzZS0+YWN0aXZlKSkpIHsKIAkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CkBAIC0xNjc0LDE4ICsxNTA3LDYgQEAKIAkJZGVidWdfaHJ0aW1lcl9kZWFjdGl2YXRlKHRpbWVyKTsKIAogCQkvKgotCQkgKiBTaG91bGQgbm90IGhhcHBlbi4gUGVyIENQVSB0aW1lcnMgc2hvdWxkIGJlCi0JCSAqIGNhbmNlbGVkIF9iZWZvcmVfIHRoZSBtaWdyYXRpb24gY29kZSBpcyBjYWxsZWQKLQkJICovCi0JCWlmICh0aW1lci0+Y2JfbW9kZSA9PSBIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVKSB7Ci0JCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBvbGRfYmFzZSwKLQkJCQkJIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUsIDApOwotCQkJV0FSTigxLCAiaHJ0aW1lciAoJXAgJXApYWN0aXZlIGJ1dCBjcHUgJWQgZGVhZFxuIiwKLQkJCSAgICAgdGltZXIsIHRpbWVyLT5mdW5jdGlvbiwgZGNwdSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCiAJCSAqIE1hcmsgaXQgYXMgU1RBVEVfTUlHUkFURSBub3QgSU5BQ1RJVkUgb3RoZXJ3aXNlIHRoZQogCQkgKiB0aW1lciBjb3VsZCBiZSBzZWVuIGFzICFhY3RpdmUgYW5kIGp1c3QgdmFuaXNoIGF3YXkKIAkJICogdW5kZXIgdXMgb24gYW5vdGhlciBDUFUKQEAgLTE2OTMsNjkgKzE1MTQsMzQgQEAKIAkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfTUlHUkFURSwgMCk7CiAJCXRpbWVyLT5iYXNlID0gbmV3X2Jhc2U7CiAJCS8qCi0JCSAqIEVucXVldWUgdGhlIHRpbWVyLiBBbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudCBkZXZpY2UKKwkJICogRW5xdWV1ZSB0aGUgdGltZXJzIG9uIHRoZSBuZXcgY3B1LCBidXQgZG8gbm90IHJlcHJvZ3JhbSAKKwkJICogdGhlIHRpbWVyIGFzIHRoYXQgd291bGQgZW5hYmxlIGEgZGVhZGxvY2sgYmV0d2VlbgorCQkgKiBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtbSgpIHJ1bm5pbmcgdGhlIHRpbWVyIGFuZCB1cyBzdGlsbAorCQkgKiBob2xkaW5nIGEgbmVzdGVkIGJhc2UgbG9jay4KKwkJICoKKwkJICogSW5zdGVhZCB3ZSB0aWNrbGUgdGhlIGhydGltZXIgaW50ZXJydXB0IGFmdGVyIHRoZSBtaWdyYXRpb24KKwkJICogaXMgZG9uZSwgd2hpY2ggd2lsbCBydW4gYWxsIGV4cGlyZWQgdGltZXJzIGFuZCByZS1wcm9ncmFtbQorCQkgKiB0aGUgdGltZXIgZGV2aWNlLgogCQkgKi8KLQkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMSk7CisJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIDApOwogCi0jaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUwotCQkvKgotCQkgKiBIYXBwZW5zIHdpdGggaGlnaCByZXMgZW5hYmxlZCB3aGVuIHRoZSB0aW1lciB3YXMKLQkJICogYWxyZWFkeSBleHBpcmVkIGFuZCB0aGUgY2FsbGJhY2sgbW9kZSBpcwotCQkgKiBIUlRJTUVSX0NCX0lSUVNBRkVfVU5MT0NLRUQgKGhydGltZXJfc2xlZXBlcikuIFRoZQotCQkgKiBlbnF1ZXVlIGNvZGUgZG9lcyBub3QgbW92ZSB0aGVtIHRvIHRoZSBzb2Z0IGlycQotCQkgKiBwZW5kaW5nIGxpc3QgZm9yIHBlcmZvcm1hbmNlL2xhdGVuY3kgcmVhc29ucywgYnV0Ci0JCSAqIGluIHRoZSBtaWdyYXRpb24gc3RhdGUsIHdlIG5lZWQgdG8gZG8gdGhhdAotCQkgKiBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggYSBzdGFsZSB0aW1lci4KLQkJICovCi0JCWlmICh0aW1lci0+c3RhdGUgPT0gSFJUSU1FUl9TVEFURV9NSUdSQVRFKSB7Ci0JCQl0aW1lci0+c3RhdGUgPSBIUlRJTUVSX1NUQVRFX1BFTkRJTkc7Ci0JCQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+Y2JfZW50cnksCi0JCQkJICAgICAgJm5ld19iYXNlLT5jcHVfYmFzZS0+Y2JfcGVuZGluZyk7Ci0JCQlyYWlzZSA9IDE7Ci0JCX0KLSNlbmRpZgogCQkvKiBDbGVhciB0aGUgbWlncmF0aW9uIHN0YXRlIGJpdCAqLwogCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfTUlHUkFURTsKIAl9Ci0JcmV0dXJuIHJhaXNlOwogfQogCi0jaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUwotc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsCi0JCQkJICAgc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKm5ld19iYXNlKQotewotCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKLQlpbnQgcmFpc2UgPSAwOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZvbGRfYmFzZS0+Y2JfcGVuZGluZykpIHsKLQkJdGltZXIgPSBsaXN0X2VudHJ5KG9sZF9iYXNlLT5jYl9wZW5kaW5nLm5leHQsCi0JCQkJICAgc3RydWN0IGhydGltZXIsIGNiX2VudHJ5KTsKLQotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCB0aW1lci0+YmFzZSwgSFJUSU1FUl9TVEFURV9QRU5ESU5HLCAwKTsKLQkJdGltZXItPmJhc2UgPSAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbdGltZXItPmJhc2UtPmluZGV4XTsKLQkJbGlzdF9hZGRfdGFpbCgmdGltZXItPmNiX2VudHJ5LCAmbmV3X2Jhc2UtPmNiX3BlbmRpbmcpOwotCQlyYWlzZSA9IDE7Ci0JfQotCXJldHVybiByYWlzZTsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IG1pZ3JhdGVfaHJ0aW1lcl9wZW5kaW5nKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpvbGRfYmFzZSwKLQkJCQkgICBzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqbmV3X2Jhc2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVycyhpbnQgY3B1KQorc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJzKGludCBzY3B1KQogewogCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpvbGRfYmFzZSwgKm5ld19iYXNlOwotCWludCBpLCByYWlzZSA9IDA7CisJaW50IGRjcHUsIGk7CiAKLQlCVUdfT04oY3B1X29ubGluZShjcHUpKTsKLQlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJQlVHX09OKGNwdV9vbmxpbmUoc2NwdSkpOworCW9sZF9iYXNlID0gJnBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgc2NwdSk7CiAJbmV3X2Jhc2UgPSAmZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAKLQl0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihjcHUpOworCWRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwl0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihzY3B1KTsKIAkvKgogCSAqIFRoZSBjYWxsZXIgaXMgZ2xvYmFsbHkgc2VyaWFsaXplZCBhbmQgbm9ib2R5IGVsc2UKIAkgKiB0YWtlcyB0d28gbG9ja3MgYXQgb25jZSwgZGVhZGxvY2sgaXMgbm90IHBvc3NpYmxlLgpAQCAtMTc2NCw0MSArMTU1MCw0NyBAQAogCXNwaW5fbG9ja19uZXN0ZWQoJm9sZF9iYXNlLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKykgewotCQlpZiAobWlncmF0ZV9ocnRpbWVyX2xpc3QoJm9sZF9iYXNlLT5jbG9ja19iYXNlW2ldLAotCQkJCQkgJm5ld19iYXNlLT5jbG9ja19iYXNlW2ldLCBjcHUpKQotCQkJcmFpc2UgPSAxOworCQltaWdyYXRlX2hydGltZXJfbGlzdCgmb2xkX2Jhc2UtPmNsb2NrX2Jhc2VbaV0sCisJCQkJICAgICAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbaV0pOwogCX0KIAotCWlmIChtaWdyYXRlX2hydGltZXJfcGVuZGluZyhvbGRfYmFzZSwgbmV3X2Jhc2UpKQotCQlyYWlzZSA9IDE7Ci0KIAlzcGluX3VubG9jaygmb2xkX2Jhc2UtPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmbmV3X2Jhc2UtPmxvY2spOwogCXB1dF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCi0JaWYgKHJhaXNlKQotCQlocnRpbWVyX3JhaXNlX3NvZnRpcnEoKTsKKwlyZXR1cm4gZGNwdTsKIH0KKworc3RhdGljIHZvaWQgdGlja2xlX3RpbWVycyh2b2lkICphcmcpCit7CisJaHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOworfQorCiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGhydGltZXJfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAobG9uZyloY3B1OworCWludCBzY3B1ID0gKGxvbmcpaGNwdTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQlpbml0X2hydGltZXJzX2NwdShjcHUpOworCQlpbml0X2hydGltZXJzX2NwdShzY3B1KTsKIAkJYnJlYWs7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwgJmNwdSk7Ci0JCW1pZ3JhdGVfaHJ0aW1lcnMoY3B1KTsKKwl7CisJCWludCBkY3B1OworCisJCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELCAmc2NwdSk7CisJCWRjcHUgPSBtaWdyYXRlX2hydGltZXJzKHNjcHUpOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZGNwdSwgdGlja2xlX3RpbWVycywgTlVMTCwgMCk7CiAJCWJyZWFrOworCX0KICNlbmRpZgogCiAJZGVmYXVsdDoKQEAgLTE4MTcsOSArMTYwOSw2IEBACiAJaHJ0aW1lcl9jcHVfbm90aWZ5KCZocnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCiAJCQkgICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmhydGltZXJzX25iKTsKLSNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCi0Jb3Blbl9zb2Z0aXJxKEhSVElNRVJfU09GVElSUSwgcnVuX2hydGltZXJfc29mdGlycSk7Ci0jZW5kaWYKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL01ha2VmaWxlIGIva2VybmVsL2lycS9NYWtlZmlsZQppbmRleCA2ODFjNTJkLi40ZGQ1YjFlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL01ha2VmaWxlCisrKyBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBACiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfUFJPQkUpICs9IGF1dG9wcm9iZS5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgKz0gbWlncmF0aW9uLm8KK29iai0kKENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MpICs9IG51bWFfbWlncmF0ZS5vCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jIGIva2VybmVsL2lycS9hdXRvcHJvYmUuYwppbmRleCBjYzBmNzMyLi42NTBjZTQxIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCisrKyBiL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKQEAgLTQwLDYgKzQwLDkgQEAKIAkgKiBmbHVzaCBzdWNoIGEgbG9uZ3N0YW5kaW5nIGlycSBiZWZvcmUgY29uc2lkZXJpbmcgaXQgYXMgc3B1cmlvdXMuCiAJICovCiAJZm9yX2VhY2hfaXJxX2Rlc2NfcmV2ZXJzZShpLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCXNwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOwogCQlpZiAoIWRlc2MtPmFjdGlvbiAmJiAhKGRlc2MtPnN0YXR1cyAmIElSUV9OT1BST0JFKSkgewogCQkJLyoKQEAgLTY4LDYgKzcxLDkgQEAKIAkgKiBoYXBwZW5lZCBpbiB0aGUgcHJldmlvdXMgc3RhZ2UsIGl0IG1heSBoYXZlIG1hc2tlZCBpdHNlbGYpCiAJICovCiAJZm9yX2VhY2hfaXJxX2Rlc2NfcmV2ZXJzZShpLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCXNwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOwogCQlpZiAoIWRlc2MtPmFjdGlvbiAmJiAhKGRlc2MtPnN0YXR1cyAmIElSUV9OT1BST0JFKSkgewogCQkJZGVzYy0+c3RhdHVzIHw9IElSUV9BVVRPREVURUNUIHwgSVJRX1dBSVRJTkc7CkBAIC04Niw2ICs5Miw5IEBACiAJICogTm93IGZpbHRlciBvdXQgYW55IG9idmlvdXNseSBzcHVyaW91cyBpbnRlcnJ1cHRzCiAJICovCiAJZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykgeworCQlpZiAoIWRlc2MpCisJCQljb250aW51ZTsKKwogCQlzcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKIAkJc3RhdHVzID0gZGVzYy0+c3RhdHVzOwogCkBAIC0xMjQsNiArMTMzLDkgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisKIAkJc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAJCXN0YXR1cyA9IGRlc2MtPnN0YXR1czsKIApAQCAtMTY2LDYgKzE3OCw5IEBACiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAogCWZvcl9lYWNoX2lycV9kZXNjKGksIGRlc2MpIHsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisKIAkJc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAJCXN0YXR1cyA9IGRlc2MtPnN0YXR1czsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCAxMGI1MDkyLi42ZWIzYzc5IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtMjQsOSArMjQsMTAgQEAKICAqLwogdm9pZCBkeW5hbWljX2lycV9pbml0KHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCWlmICghZGVzYykgewogCQlXQVJOKDEsIEtFUk5fRVJSICJUcnlpbmcgdG8gaW5pdGlhbGl6ZSBpbnZhbGlkIElSUSVkXG4iLCBpcnEpOwogCQlyZXR1cm47CkBAIC0xMjQsNiArMTI1LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJdHlwZSAmPSBJUlFfVFlQRV9TRU5TRV9NQVNLOwogCWlmICh0eXBlID09IElSUV9UWVBFX05PTkUpCiAJCXJldHVybiAwOwogCkBAIC0zNTIsNiArMzU0LDcgQEAKIAogCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJbWFza19hY2tfaXJxKGRlc2MsIGlycSk7CisJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CiAKIAlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgSVJRX0lOUFJPR1JFU1MpKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC00MjksNiArNDMyLDcgQEAKIAlkZXNjLT5zdGF0dXMgJj0gfklSUV9JTlBST0dSRVNTOwogb3V0OgogCWRlc2MtPmNoaXAtPmVvaShpcnEpOworCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwogCiAJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogfQpAQCAtNDY1LDEyICs0NjksMTQgQEAKIAkJICAgICFkZXNjLT5hY3Rpb24pKSB7CiAJCWRlc2MtPnN0YXR1cyB8PSAoSVJRX1BFTkRJTkcgfCBJUlFfTUFTS0VEKTsKIAkJbWFza19hY2tfaXJxKGRlc2MsIGlycSk7CisJCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCWtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnEsIGRlc2MpOwogCiAJLyogU3RhcnQgaGFuZGxpbmcgdGhlIGlycSAqLwogCWRlc2MtPmNoaXAtPmFjayhpcnEpOworCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwogCiAJLyogTWFyayB0aGUgSVJRIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4qLwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKQEAgLTUzMSw4ICs1MzcsMTAgQEAKIAlpZiAoIW5vaXJxZGVidWcpCiAJCW5vdGVfaW50ZXJydXB0KGlycSwgZGVzYywgYWN0aW9uX3JldCk7CiAKLQlpZiAoZGVzYy0+Y2hpcC0+ZW9pKQorCWlmIChkZXNjLT5jaGlwLT5lb2kpIHsKIAkJZGVzYy0+Y2hpcC0+ZW9pKGlycSk7CisJCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOworCX0KIH0KIAogdm9pZApAQCAtNTY3LDggKzU3NSwxMCBAQAogCiAJLyogVW5pbnN0YWxsPyAqLwogCWlmIChoYW5kbGUgPT0gaGFuZGxlX2JhZF9pcnEpIHsKLQkJaWYgKGRlc2MtPmNoaXAgIT0gJm5vX2lycV9jaGlwKQorCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKIAkJCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOworCQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CisJCX0KIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9ESVNBQkxFRDsKIAkJZGVzYy0+ZGVwdGggPSAxOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IGM4MTViNDIuLjY0OTI0MDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtMTUsOSArMTUsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbHMuaCIKIAorLyoKKyAqIGxvY2tkZXA6IHdlIHdhbnQgdG8gaGFuZGxlIGFsbCBpcnFfZGVzYyBsb2NrcyBhcyBhIHNpbmdsZSBsb2NrLWNsYXNzOgorICovCitzdHJ1Y3QgbG9ja19jbGFzc19rZXkgaXJxX2Rlc2NfbG9ja19jbGFzczsKKwogLyoqCiAgKiBoYW5kbGVfYmFkX2lycSAtIGhhbmRsZSBzcHVyaW91cyBhbmQgdW5oYW5kbGVkIGlycXMKICAqIEBpcnE6ICAgICAgIHRoZSBpbnRlcnJ1cHQgbnVtYmVyCkBAIC00OSw2ICs1NiwxNTUgQEAKIGludCBucl9pcnFzID0gTlJfSVJRUzsKIEVYUE9SVF9TWU1CT0xfR1BMKG5yX2lycXMpOwogCit2b2lkIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgYXJjaF9lYXJseV9pcnFfaW5pdCh2b2lkKQoreworfQorCisjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKK3N0YXRpYyBzdHJ1Y3QgaXJxX2Rlc2MgaXJxX2Rlc2NfaW5pdCA9IHsKKwkuaXJxCSAgICA9IC0xLAorCS5zdGF0dXMJICAgID0gSVJRX0RJU0FCTEVELAorCS5jaGlwCSAgICA9ICZub19pcnFfY2hpcCwKKwkuaGFuZGxlX2lycSA9IGhhbmRsZV9iYWRfaXJxLAorCS5kZXB0aCAgICAgID0gMSwKKwkubG9jayAgICAgICA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGlycV9kZXNjX2luaXQubG9jayksCisjaWZkZWYgQ09ORklHX1NNUAorCS5hZmZpbml0eSAgID0gQ1BVX01BU0tfQUxMCisjZW5kaWYKK307CisKK3ZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisJY2hhciAqcHRyOworCWludCBub2RlOworCisJLyogQ29tcHV0ZSBob3cgbWFueSBieXRlcyB3ZSBuZWVkIHBlciBpcnEgYW5kIGFsbG9jYXRlIHRoZW0gKi8KKwlieXRlcyA9IG5yICogc2l6ZW9mKHVuc2lnbmVkIGludCk7CisKKwlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKwlwdHIgPSBremFsbG9jX25vZGUoYnl0ZXMsIEdGUF9BVE9NSUMsIG5vZGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGtzdGF0X2lycXMgb24gY3B1ICVkIG5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CisKKwlpZiAocHRyKQorCQlkZXNjLT5rc3RhdF9pcnFzID0gKHVuc2lnbmVkIGludCAqKXB0cjsKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgYXJjaF9pbml0X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCit7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25lX2lycV9kZXNjKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK3sKKwltZW1jcHkoZGVzYywgJmlycV9kZXNjX2luaXQsIHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpKTsKKwlkZXNjLT5pcnEgPSBpcnE7CisjaWZkZWYgQ09ORklHX1NNUAorCWRlc2MtPmNwdSA9IGNwdTsKKyNlbmRpZgorCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjLT5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7CisJaW5pdF9rc3RhdF9pcnFzKGRlc2MsIGNwdSwgbnJfY3B1X2lkcyk7CisJaWYgKCFkZXNjLT5rc3RhdF9pcnFzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBrc3RhdF9pcnFzXG4iKTsKKwkJQlVHX09OKDEpOworCX0KKwlhcmNoX2luaXRfY2hpcF9kYXRhKGRlc2MsIGNwdSk7Cit9CisKKy8qCisgKiBQcm90ZWN0IHRoZSBzcGFyc2VfaXJxczoKKyAqLworREVGSU5FX1NQSU5MT0NLKHNwYXJzZV9pcnFfbG9jayk7CisKK3N0cnVjdCBpcnFfZGVzYyAqaXJxX2Rlc2NfcHRyc1tOUl9JUlFTXSBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgc3RydWN0IGlycV9kZXNjIGlycV9kZXNjX2xlZ2FjeVtOUl9JUlFTX0xFR0FDWV0gX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgPSB7CisJWzAgLi4uIE5SX0lSUVNfTEVHQUNZLTFdID0geworCQkuaXJxCSAgICA9IC0xLAorCQkuc3RhdHVzCSAgICA9IElSUV9ESVNBQkxFRCwKKwkJLmNoaXAJICAgID0gJm5vX2lycV9jaGlwLAorCQkuaGFuZGxlX2lycSA9IGhhbmRsZV9iYWRfaXJxLAorCQkuZGVwdGgJICAgID0gMSwKKwkJLmxvY2sJICAgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaXJxX2Rlc2NfaW5pdC5sb2NrKSwKKyNpZmRlZiBDT05GSUdfU01QCisJCS5hZmZpbml0eSAgID0gQ1BVX01BU0tfQUxMCisjZW5kaWYKKwl9Cit9OworCisvKiBGSVhNRTogdXNlIGJvb3RtZW0gYWxsb2MgLi4uKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQga3N0YXRfaXJxc19sZWdhY3lbTlJfSVJRU19MRUdBQ1ldW05SX0NQVVNdOworCit2b2lkIF9faW5pdCBlYXJseV9pcnFfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlpbnQgbGVnYWN5X2NvdW50OworCWludCBpOworCisJZGVzYyA9IGlycV9kZXNjX2xlZ2FjeTsKKwlsZWdhY3lfY291bnQgPSBBUlJBWV9TSVpFKGlycV9kZXNjX2xlZ2FjeSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVnYWN5X2NvdW50OyBpKyspIHsKKwkJZGVzY1tpXS5pcnEgPSBpOworCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBrc3RhdF9pcnFzX2xlZ2FjeVtpXTsKKworCQlpcnFfZGVzY19wdHJzW2ldID0gZGVzYyArIGk7CisJfQorCisJZm9yIChpID0gbGVnYWN5X2NvdW50OyBpIDwgTlJfSVJRUzsgaSsrKQorCQlpcnFfZGVzY19wdHJzW2ldID0gTlVMTDsKKworCWFyY2hfZWFybHlfaXJxX2luaXQoKTsKK30KKworc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzYyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXJldHVybiAoaXJxIDwgTlJfSVJRUykgPyBpcnFfZGVzY19wdHJzW2lycV0gOiBOVUxMOworfQorCitzdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBub2RlOworCisJaWYgKGlycSA+PSBOUl9JUlFTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlycSA+PSBOUl9JUlFTIGluIGlycV90b19kZXNjX2FsbG9jOiAlZCAlZFxuIiwKKwkJCQlpcnEsIE5SX0lSUVMpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZXNjID0gaXJxX2Rlc2NfcHRyc1tpcnFdOworCWlmIChkZXNjKQorCQlyZXR1cm4gZGVzYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcGFyc2VfaXJxX2xvY2ssIGZsYWdzKTsKKworCS8qIFdlIGhhdmUgdG8gY2hlY2sgaXQgdG8gYXZvaWQgcmFjZXMgd2l0aCBhbm90aGVyIENQVSAqLworCWRlc2MgPSBpcnFfZGVzY19wdHJzW2lycV07CisJaWYgKGRlc2MpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCWRlc2MgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpkZXNjKSwgR0ZQX0FUT01JQywgbm9kZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWxsb2MgaXJxX2Rlc2MgZm9yICVkIG9uIGNwdSAlZCBub2RlICVkXG4iLAorCQkgaXJxLCBjcHUsIG5vZGUpOworCWlmICghZGVzYykgeworCQlwcmludGsoS0VSTl9FUlIgImNhbiBub3QgYWxsb2MgaXJxX2Rlc2NcbiIpOworCQlCVUdfT04oMSk7CisJfQorCWluaXRfb25lX2lycV9kZXNjKGlycSwgZGVzYywgY3B1KTsKKworCWlycV9kZXNjX3B0cnNbaXJxXSA9IGRlc2M7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BhcnNlX2lycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGVzYzsKK30KKworI2Vsc2UKKwogc3RydWN0IGlycV9kZXNjIGlycV9kZXNjW05SX0lSUVNdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wID0gewogCVswIC4uLiBOUl9JUlFTLTFdID0gewogCQkuc3RhdHVzID0gSVJRX0RJU0FCTEVELApAQCAtNjIsNiArMjE4LDggQEAKIAl9CiB9OwogCisjZW5kaWYKKwogLyoKICAqIFdoYXQgc2hvdWxkIHdlIGRvIGlmIHdlIGdldCBhIGh3IGlycSBldmVudCBvbiBhbiBpbGxlZ2FsIHZlY3Rvcj8KICAqIEVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsZi4KQEAgLTE3OSw4ICszMzcsMTEgQEAKIAkJLyoKIAkJICogTm8gbG9ja2luZyByZXF1aXJlZCBmb3IgQ1BVLWxvY2FsIGludGVycnVwdHM6CiAJCSAqLwotCQlpZiAoZGVzYy0+Y2hpcC0+YWNrKQorCQlpZiAoZGVzYy0+Y2hpcC0+YWNrKSB7CiAJCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKwkJCS8qIGdldCBuZXcgb25lICovCisJCQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKKwkJfQogCQlpZiAobGlrZWx5KCEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKIAkJCWFjdGlvbl9yZXQgPSBoYW5kbGVfSVJRX2V2ZW50KGlycSwgZGVzYy0+YWN0aW9uKTsKIAkJCWlmICghbm9pcnFkZWJ1ZykKQEAgLTE5MSw4ICszNTIsMTAgQEAKIAl9CiAKIAlzcGluX2xvY2soJmRlc2MtPmxvY2spOwotCWlmIChkZXNjLT5jaGlwLT5hY2spCisJaWYgKGRlc2MtPmNoaXAtPmFjaykgewogCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKwkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CisJfQogCS8qCiAJICogUkVQTEFZIGlzIHdoZW4gTGludXggcmVzZW5kcyBhbiBJUlEgdGhhdCB3YXMgZHJvcHBlZCBlYXJsaWVyCiAJICogV0FJVElORyBpcyB1c2VkIGJ5IHByb2JlIHRvIG1hcmsgaXJxcyB0aGF0IGFyZSBiZWluZyB0ZXN0ZWQKQEAgLTI1OSwxOSArNDIyLDI1IEBACiB9CiAjZW5kaWYKIAotCi0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCi0vKgotICogbG9ja2RlcDogd2Ugd2FudCB0byBoYW5kbGUgYWxsIGlycV9kZXNjIGxvY2tzIGFzIGEgc2luZ2xlIGxvY2stY2xhc3M6Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgaXJxX2Rlc2NfbG9ja19jbGFzczsKLQogdm9pZCBlYXJseV9pbml0X2lycV9sb2NrX2NsYXNzKHZvaWQpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCWludCBpOwogCi0JZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykKKwlmb3JfZWFjaF9pcnFfZGVzYyhpLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjLT5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKK3Vuc2lnbmVkIGludCBrc3RhdF9pcnFzX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJcmV0dXJuIGRlc2MtPmtzdGF0X2lycXNbY3B1XTsKIH0KICNlbmRpZgorRVhQT1JUX1NZTUJPTChrc3RhdF9pcnFzX2NwdSk7CisKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmggYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCmluZGV4IDY0YzFjNzIuLmU2ZDBhNDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKKysrIGIva2VybmVsL2lycS9pbnRlcm5hbHMuaApAQCAtMTMsNiArMTMsMTEgQEAKIGV4dGVybiBpbnQgX19pcnFfc2V0X3RyaWdnZXIoc3RydWN0IGlycV9kZXNjICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxLAogCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAorZXh0ZXJuIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBpcnFfZGVzY19sb2NrX2NsYXNzOworZXh0ZXJuIHZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwgaW50IG5yKTsKK2V4dGVybiBzcGlubG9ja190IHNwYXJzZV9pcnFfbG9jazsKK2V4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgKmlycV9kZXNjX3B0cnNbTlJfSVJRU107CisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfaXJxX3Byb2ModW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX2hhbmRsZXJfcHJvYyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggODAxYWRkZC4uNTQwZjZjNCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC0zNzAsMTYgKzM3MCwxOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXQgPSBjaGlwLT5zZXRfdHlwZShpcnEsIGZsYWdzICYgSVJRRl9UUklHR0VSX01BU0spOworCS8qIGNhbGxlciBtYXNrZWQgb3V0IGFsbCBleGNlcHQgdHJpZ2dlciBtb2RlIGZsYWdzICovCisJcmV0ID0gY2hpcC0+c2V0X3R5cGUoaXJxLCBmbGFncyk7CiAKIAlpZiAocmV0KQogCQlwcl9lcnIoInNldHRpbmcgdHJpZ2dlciBtb2RlICVkIGZvciBpcnEgJXUgZmFpbGVkICglcEYpXG4iLAotCQkJCShpbnQpKGZsYWdzICYgSVJRRl9UUklHR0VSX01BU0spLAotCQkJCWlycSwgY2hpcC0+c2V0X3R5cGUpOworCQkJCShpbnQpZmxhZ3MsIGlycSwgY2hpcC0+c2V0X3R5cGUpOwogCWVsc2UgeworCQlpZiAoZmxhZ3MgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpCisJCQlmbGFncyB8PSBJUlFfTEVWRUw7CiAJCS8qIG5vdGUgdGhhdCBJUlFGX1RSSUdHRVJfTUFTSyA9PSBJUlFfVFlQRV9TRU5TRV9NQVNLICovCi0JCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1RZUEVfU0VOU0VfTUFTSzsKLQkJZGVzYy0+c3RhdHVzIHw9IGZsYWdzICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKKwkJZGVzYy0+c3RhdHVzICY9IH4oSVJRX0xFVkVMIHwgSVJRX1RZUEVfU0VOU0VfTUFTSyk7CisJCWRlc2MtPnN0YXR1cyB8PSBmbGFnczsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDU5LDcgKzQ2MSw4IEBACiAKIAkJLyogU2V0dXAgdGhlIHR5cGUgKGxldmVsLCBlZGdlIHBvbGFyaXR5KSBpZiBjb25maWd1cmVkOiAqLwogCQlpZiAobmV3LT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLKSB7Ci0JCQlyZXQgPSBfX2lycV9zZXRfdHJpZ2dlcihkZXNjLCBpcnEsIG5ldy0+ZmxhZ3MpOworCQkJcmV0ID0gX19pcnFfc2V0X3RyaWdnZXIoZGVzYywgaXJxLAorCQkJCQluZXctPmZsYWdzICYgSVJRRl9UUklHR0VSX01BU0spOwogCiAJCQlpZiAocmV0KSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwpAQCAtNjczLDYgKzY3NiwxOCBAQAogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAlpbnQgcmV0dmFsOwogCisJLyoKKwkgKiBoYW5kbGVfSVJRX2V2ZW50KCkgYWx3YXlzIGlnbm9yZXMgSVJRRl9ESVNBQkxFRCBleGNlcHQgZm9yCisJICogdGhlIF9maXJzdF8gaXJxYWN0aW9uIChzaWdoKS4gIFRoYXQgY2FuIGNhdXNlIG9vcHNpbmcsIGJ1dAorCSAqIHRoZSBiZWhhdmlvciBpcyBjbGFzc2lmaWVkIGFzICJ3aWxsIG5vdCBmaXgiIHNvIHdlIG5lZWQgdG8KKwkgKiBzdGFydCBudWRnaW5nIGRyaXZlcnMgYXdheSBmcm9tIHVzaW5nIHRoYXQgaWRpb20uCisJICovCisJaWYgKChpcnFmbGFncyAmIChJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVEKSkKKwkJCT09IChJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVEKSkKKwkJcHJfd2FybmluZygiSVJRICVkLyVzOiBJUlFGX0RJU0FCTEVEIGlzIG5vdCAiCisJCQkJImd1YXJhbnRlZWQgb24gc2hhcmVkIElSUXNcbiIsCisJCQkJaXJxLCBkZXZuYW1lKTsKKwogI2lmZGVmIENPTkZJR19MT0NLREVQCiAJLyoKIAkgKiBMb2NrZGVwIHdhbnRzIGF0b21pYyBpbnRlcnJ1cHQgaGFuZGxlcnM6CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL251bWFfbWlncmF0ZS5jIGIva2VybmVsL2lycS9udW1hX21pZ3JhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODljMzc0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2lycS9udW1hX21pZ3JhdGUuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIE5VTUEgaXJxLWRlc2MgbWlncmF0aW9uIGNvZGUKKyAqCisgKiBNaWdyYXRlIElSUSBkYXRhIHN0cnVjdHVyZXMgKGlycV9kZXNjLCBjaGlwX2RhdGEsIGV0Yy4pIG92ZXIgdG8KKyAqIHRoZSBuZXcgImhvbWUgbm9kZSIgb2YgdGhlIElSUS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKworI2luY2x1ZGUgImludGVybmFscy5oIgorCitzdGF0aWMgdm9pZCBpbml0X2NvcHlfa3N0YXRfaXJxcyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAorCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsCisJCQkJIGludCBjcHUsIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nIGJ5dGVzOworCisJaW5pdF9rc3RhdF9pcnFzKGRlc2MsIGNwdSwgbnIpOworCisJaWYgKGRlc2MtPmtzdGF0X2lycXMgIT0gb2xkX2Rlc2MtPmtzdGF0X2lycXMpIHsKKwkJLyogQ29tcHV0ZSBob3cgbWFueSBieXRlcyB3ZSBuZWVkIHBlciBpcnEgYW5kIGFsbG9jYXRlIHRoZW0gKi8KKwkJYnl0ZXMgPSBuciAqIHNpemVvZih1bnNpZ25lZCBpbnQpOworCisJCW1lbWNweShkZXNjLT5rc3RhdF9pcnFzLCBvbGRfZGVzYy0+a3N0YXRfaXJxcywgYnl0ZXMpOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlpZiAob2xkX2Rlc2MtPmtzdGF0X2lycXMgPT0gZGVzYy0+a3N0YXRfaXJxcykKKwkJcmV0dXJuOworCisJa2ZyZWUob2xkX2Rlc2MtPmtzdGF0X2lycXMpOworCW9sZF9kZXNjLT5rc3RhdF9pcnFzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9jb3B5X29uZV9pcnFfZGVzYyhpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAorCQkgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQoreworCW1lbWNweShkZXNjLCBvbGRfZGVzYywgc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYykpOworCWRlc2MtPmNwdSA9IGNwdTsKKwlsb2NrZGVwX3NldF9jbGFzcygmZGVzYy0+bG9jaywgJmlycV9kZXNjX2xvY2tfY2xhc3MpOworCWluaXRfY29weV9rc3RhdF9pcnFzKG9sZF9kZXNjLCBkZXNjLCBjcHUsIG5yX2NwdV9pZHMpOworCWFyY2hfaW5pdF9jb3B5X2NoaXBfZGF0YShvbGRfZGVzYywgZGVzYywgY3B1KTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9vbmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWZyZWVfa3N0YXRfaXJxcyhvbGRfZGVzYywgZGVzYyk7CisJYXJjaF9mcmVlX2NoaXBfZGF0YShvbGRfZGVzYywgZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2Rlc2MgKl9fcmVhbF9tb3ZlX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCisJCQkJCQlpbnQgY3B1KQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG5vZGU7CisKKwlpcnEgPSBvbGRfZGVzYy0+aXJxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwYXJzZV9pcnFfbG9jaywgZmxhZ3MpOworCisJLyogV2UgaGF2ZSB0byBjaGVjayBpdCB0byBhdm9pZCByYWNlcyB3aXRoIGFub3RoZXIgQ1BVICovCisJZGVzYyA9IGlycV9kZXNjX3B0cnNbaXJxXTsKKworCWlmIChkZXNjICYmIG9sZF9kZXNjICE9IGRlc2MpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKwlkZXNjID0ga3phbGxvY19ub2RlKHNpemVvZigqZGVzYyksIEdGUF9BVE9NSUMsIG5vZGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIG1vdmUgaXJxX2Rlc2MgZm9yICVkIHRvIGNwdSAlZCBub2RlICVkXG4iLAorCQkgaXJxLCBjcHUsIG5vZGUpOworCWlmICghZGVzYykgeworCQlwcmludGsoS0VSTl9FUlIgImNhbiBub3QgZ2V0IG5ldyBpcnFfZGVzYyBmb3IgbW92aW5nXG4iKTsKKwkJLyogc3RpbGwgdXNlIG9sZCBvbmUgKi8KKwkJZGVzYyA9IG9sZF9kZXNjOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWluaXRfY29weV9vbmVfaXJxX2Rlc2MoaXJxLCBvbGRfZGVzYywgZGVzYywgY3B1KTsKKworCWlycV9kZXNjX3B0cnNbaXJxXSA9IGRlc2M7CisKKwkvKiBmcmVlIHRoZSBvbGQgb25lICovCisJZnJlZV9vbmVfaXJxX2Rlc2Mob2xkX2Rlc2MsIGRlc2MpOworCWtmcmVlKG9sZF9kZXNjKTsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGFyc2VfaXJxX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBkZXNjOworfQorCitzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQoreworCWludCBvbGRfY3B1OworCWludCBub2RlLCBvbGRfbm9kZTsKKworCS8qIHRob3NlIGFsbCBzdGF0aWMsIGRvIG1vdmUgdGhlbSAqLworCWlmIChkZXNjLT5pcnEgPCBOUl9JUlFTX0xFR0FDWSkKKwkJcmV0dXJuIGRlc2M7CisKKwlvbGRfY3B1ID0gZGVzYy0+Y3B1OworCXByaW50ayhLRVJOX0RFQlVHCisJCSAidHJ5IHRvIG1vdmUgaXJxX2Rlc2MgZnJvbSBjcHUgJWQgdG8gJWRcbiIsIG9sZF9jcHUsIGNwdSk7CisJaWYgKG9sZF9jcHUgIT0gY3B1KSB7CisJCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCQlvbGRfbm9kZSA9IGNwdV90b19ub2RlKG9sZF9jcHUpOworCQlpZiAob2xkX25vZGUgIT0gbm9kZSkKKwkJCWRlc2MgPSBfX3JlYWxfbW92ZV9pcnFfZGVzYyhkZXNjLCBjcHUpOworCQllbHNlCisJCQlkZXNjLT5jcHUgPSBjcHU7CisJfQorCisJcmV0dXJuIGRlc2M7Cit9CisKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvcHJvYy5jIGIva2VybmVsL2lycS9wcm9jLmMKaW5kZXggZDI1N2U3ZC4uZjZiMzQ0MCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9wcm9jLmMKKysrIGIva2VybmVsL2lycS9wcm9jLmMKQEAgLTI0Myw3ICsyNDMsMTEgQEAKIAkvKgogCSAqIENyZWF0ZSBlbnRyaWVzIGZvciBhbGwgZXhpc3RpbmcgSVJRcy4KIAkgKi8KLQlmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpCisJZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCXJlZ2lzdGVyX2lycV9wcm9jKGlycSwgZGVzYyk7CisJfQogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKaW5kZXggZGQzNjRjMS4uMzczODEwNyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9zcHVyaW91cy5jCisrKyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwpAQCAtOTEsNiArOTEsOSBAQAogCWludCBpLCBvayA9IDA7CiAKIAlmb3JfZWFjaF9pcnFfZGVzYyhpLCBkZXNjKSB7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCWlmICghaSkKIAkJCSBjb250aW51ZTsKIApAQCAtMTEyLDYgKzExNSw4IEBACiAJZm9yX2VhY2hfaXJxX2Rlc2MoaSwgZGVzYykgewogCQl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOwogCQlpZiAoIWkpCiAJCQkgY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IDc0YjE4NzguLjA2YjBjMzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwLmMKKysrIGIva2VybmVsL2xvY2tkZXAuYwpAQCAtMTM3LDE2ICsxMzcsMTYgQEAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHNbTUFYX0xPQ0tERVBfS0VZU10sIGxvY2tfc3RhdHMpOwogCi1zdGF0aWMgaW50IGxvY2tfY29udGVudGlvbl9wb2ludChzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MsIHVuc2lnbmVkIGxvbmcgaXApCitzdGF0aWMgaW50IGxvY2tfcG9pbnQodW5zaWduZWQgbG9uZyBwb2ludHNbXSwgdW5zaWduZWQgbG9uZyBpcCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzLT5jb250ZW50aW9uX3BvaW50KTsgaSsrKSB7Ci0JCWlmIChjbGFzcy0+Y29udGVudGlvbl9wb2ludFtpXSA9PSAwKSB7Ci0JCQljbGFzcy0+Y29udGVudGlvbl9wb2ludFtpXSA9IGlwOworCWZvciAoaSA9IDA7IGkgPCBMT0NLU1RBVF9QT0lOVFM7IGkrKykgeworCQlpZiAocG9pbnRzW2ldID09IDApIHsKKwkJCXBvaW50c1tpXSA9IGlwOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGNsYXNzLT5jb250ZW50aW9uX3BvaW50W2ldID09IGlwKQorCQlpZiAocG9pbnRzW2ldID09IGlwKQogCQkJYnJlYWs7CiAJfQogCkBAIC0xODYsNiArMTg2LDkgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMuY29udGVudGlvbl9wb2ludCk7IGkrKykKIAkJCXN0YXRzLmNvbnRlbnRpb25fcG9pbnRbaV0gKz0gcGNzLT5jb250ZW50aW9uX3BvaW50W2ldOwogCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLmNvbnRlbmRpbmdfcG9pbnQpOyBpKyspCisJCQlzdGF0cy5jb250ZW5kaW5nX3BvaW50W2ldICs9IHBjcy0+Y29udGVuZGluZ19wb2ludFtpXTsKKwogCQlsb2NrX3RpbWVfYWRkKCZwY3MtPnJlYWRfd2FpdHRpbWUsICZzdGF0cy5yZWFkX3dhaXR0aW1lKTsKIAkJbG9ja190aW1lX2FkZCgmcGNzLT53cml0ZV93YWl0dGltZSwgJnN0YXRzLndyaXRlX3dhaXR0aW1lKTsKIApAQCAtMjEwLDYgKzIxMyw3IEBACiAJCW1lbXNldChjcHVfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbG9ja19jbGFzc19zdGF0cykpOwogCX0KIAltZW1zZXQoY2xhc3MtPmNvbnRlbnRpb25fcG9pbnQsIDAsIHNpemVvZihjbGFzcy0+Y29udGVudGlvbl9wb2ludCkpOworCW1lbXNldChjbGFzcy0+Y29udGVuZGluZ19wb2ludCwgMCwgc2l6ZW9mKGNsYXNzLT5jb250ZW5kaW5nX3BvaW50KSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19zdGF0cyAqZ2V0X2xvY2tfc3RhdHMoc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzKQpAQCAtMjg4LDE0ICsyOTIsMTIgQEAKIHsKIAljdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbisrOwogfQotCiBFWFBPUlRfU1lNQk9MKGxvY2tkZXBfb2ZmKTsKIAogdm9pZCBsb2NrZGVwX29uKHZvaWQpCiB7CiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24tLTsKIH0KLQogRVhQT1JUX1NZTUJPTChsb2NrZGVwX29uKTsKIAogLyoKQEAgLTU3Nyw3ICs1NzksOCBAQAogLyoKICAqIHByaW50ayBhbGwgbG9jayBkZXBlbmRlbmNpZXMgc3RhcnRpbmcgYXQgPGVudHJ5PjoKICAqLwotc3RhdGljIHZvaWQgcHJpbnRfbG9ja19kZXBlbmRlbmNpZXMoc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzLCBpbnQgZGVwdGgpCitzdGF0aWMgdm9pZCBfX3VzZWQKK3ByaW50X2xvY2tfZGVwZW5kZW5jaWVzKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcywgaW50IGRlcHRoKQogewogCXN0cnVjdCBsb2NrX2xpc3QgKmVudHJ5OwogCkBAIC0yNTA5LDcgKzI1MTIsNiBAQAogCWlmIChzdWJjbGFzcykKIAkJcmVnaXN0ZXJfbG9ja19jbGFzcyhsb2NrLCBzdWJjbGFzcywgMSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tkZXBfaW5pdF9tYXApOwogCiAvKgpAQCAtMjY5MCw4ICsyNjkyLDkgQEAKIH0KIAogc3RhdGljIGludAotX19sb2NrX3NldF9zdWJjbGFzcyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssCi0JCSAgICB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsIHVuc2lnbmVkIGxvbmcgaXApCitfX2xvY2tfc2V0X2NsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgY29uc3QgY2hhciAqbmFtZSwKKwkJIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5LCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsCisJCSB1bnNpZ25lZCBsb25nIGlwKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAJc3RydWN0IGhlbGRfbG9jayAqaGxvY2ssICpwcmV2X2hsb2NrOwpAQCAtMjcxOCw2ICsyNzIxLDcgQEAKIAlyZXR1cm4gcHJpbnRfdW5sb2NrX2luYmFsYW5jZV9idWcoY3VyciwgbG9jaywgaXApOwogCiBmb3VuZF9pdDoKKwlsb2NrZGVwX2luaXRfbWFwKGxvY2ssIG5hbWUsIGtleSwgMCk7CiAJY2xhc3MgPSByZWdpc3Rlcl9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzLCAwKTsKIAlobG9jay0+Y2xhc3NfaWR4ID0gY2xhc3MgLSBsb2NrX2NsYXNzZXMgKyAxOwogCkBAIC0yOTAyLDkgKzI5MDYsOSBAQAogI2VuZGlmCiB9CiAKLXZvaWQKLWxvY2tfc2V0X3N1YmNsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywKLQkJICB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsIHVuc2lnbmVkIGxvbmcgaXApCit2b2lkIGxvY2tfc2V0X2NsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5LCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsCisJCSAgICB1bnNpZ25lZCBsb25nIGlwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI5MTQsMTMgKzI5MTgsMTIgQEAKIAlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uID0gMTsKIAljaGVja19mbGFncyhmbGFncyk7Ci0JaWYgKF9fbG9ja19zZXRfc3ViY2xhc3MobG9jaywgc3ViY2xhc3MsIGlwKSkKKwlpZiAoX19sb2NrX3NldF9jbGFzcyhsb2NrLCBuYW1lLCBrZXksIHN1YmNsYXNzLCBpcCkpCiAJCWNoZWNrX2NoYWluX2tleShjdXJyZW50KTsKIAljdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbiA9IDA7CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwobG9ja19zZXRfc3ViY2xhc3MpOworRVhQT1JUX1NZTUJPTF9HUEwobG9ja19zZXRfY2xhc3MpOwogCiAvKgogICogV2UgYXJlIG5vdCBhbHdheXMgY2FsbGVkIHdpdGggaXJxcyBkaXNhYmxlZCAtIGRvIHRoYXQgaGVyZSwKQEAgLTI5NDQsNyArMjk0Nyw2IEBACiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfYWNxdWlyZSk7CiAKIHZvaWQgbG9ja19yZWxlYXNlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgaW50IG5lc3RlZCwKQEAgLTI5NjIsNyArMjk2NCw2IEBACiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfcmVsZWFzZSk7CiAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCkBAIC0zMDAwLDcgKzMwMDEsNyBAQAogCXN0cnVjdCBoZWxkX2xvY2sgKmhsb2NrLCAqcHJldl9obG9jazsKIAlzdHJ1Y3QgbG9ja19jbGFzc19zdGF0cyAqc3RhdHM7CiAJdW5zaWduZWQgaW50IGRlcHRoOwotCWludCBpLCBwb2ludDsKKwlpbnQgaSwgY29udGVudGlvbl9wb2ludCwgY29udGVuZGluZ19wb2ludDsKIAogCWRlcHRoID0gY3Vyci0+bG9ja2RlcF9kZXB0aDsKIAlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTighZGVwdGgpKQpAQCAtMzAyNCwxOCArMzAyNSwyMiBAQAogZm91bmRfaXQ6CiAJaGxvY2stPndhaXR0aW1lX3N0YW1wID0gc2NoZWRfY2xvY2soKTsKIAotCXBvaW50ID0gbG9ja19jb250ZW50aW9uX3BvaW50KGhsb2NrX2NsYXNzKGhsb2NrKSwgaXApOworCWNvbnRlbnRpb25fcG9pbnQgPSBsb2NrX3BvaW50KGhsb2NrX2NsYXNzKGhsb2NrKS0+Y29udGVudGlvbl9wb2ludCwgaXApOworCWNvbnRlbmRpbmdfcG9pbnQgPSBsb2NrX3BvaW50KGhsb2NrX2NsYXNzKGhsb2NrKS0+Y29udGVuZGluZ19wb2ludCwKKwkJCQkgICAgICBsb2NrLT5pcCk7CiAKIAlzdGF0cyA9IGdldF9sb2NrX3N0YXRzKGhsb2NrX2NsYXNzKGhsb2NrKSk7Ci0JaWYgKHBvaW50IDwgQVJSQVlfU0laRShzdGF0cy0+Y29udGVudGlvbl9wb2ludCkpCi0JCXN0YXRzLT5jb250ZW50aW9uX3BvaW50W3BvaW50XSsrOworCWlmIChjb250ZW50aW9uX3BvaW50IDwgTE9DS1NUQVRfUE9JTlRTKQorCQlzdGF0cy0+Y29udGVudGlvbl9wb2ludFtjb250ZW50aW9uX3BvaW50XSsrOworCWlmIChjb250ZW5kaW5nX3BvaW50IDwgTE9DS1NUQVRfUE9JTlRTKQorCQlzdGF0cy0+Y29udGVuZGluZ19wb2ludFtjb250ZW5kaW5nX3BvaW50XSsrOwogCWlmIChsb2NrLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQlzdGF0cy0+Ym91bmNlc1tib3VuY2VfY29udGVuZGVkICsgISFobG9jay0+cmVhZF0rKzsKIAlwdXRfbG9ja19zdGF0cyhzdGF0cyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1fX2xvY2tfYWNxdWlyZWQoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrKQorX19sb2NrX2FjcXVpcmVkKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgbG9uZyBpcCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCXN0cnVjdCBoZWxkX2xvY2sgKmhsb2NrLCAqcHJldl9obG9jazsKQEAgLTMwODQsNiArMzA4OSw3IEBACiAJcHV0X2xvY2tfc3RhdHMoc3RhdHMpOwogCiAJbG9jay0+Y3B1ID0gY3B1OworCWxvY2stPmlwID0gaXA7CiB9CiAKIHZvaWQgbG9ja19jb250ZW5kZWQoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKQpAQCAtMzEwNSw3ICszMTExLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfY29udGVuZGVkKTsKIAotdm9pZCBsb2NrX2FjcXVpcmVkKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaykKK3ZvaWQgbG9ja19hY3F1aXJlZChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzExOCw3ICszMTI0LDcgQEAKIAlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWNoZWNrX2ZsYWdzKGZsYWdzKTsKIAljdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbiA9IDE7Ci0JX19sb2NrX2FjcXVpcmVkKGxvY2spOworCV9fbG9ja19hY3F1aXJlZChsb2NrLCBpcCk7CiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC0zNDQyLDcgKzM0NDgsNiBAQAogCWlmICh1bmxvY2spCiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdfc2hvd19hbGxfbG9ja3MpOwogCiAvKgpAQCAtMzQ2Myw3ICszNDY4LDYgQEAKIHsKIAkJX19kZWJ1Z19zaG93X2hlbGRfbG9ja3ModGFzayk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX3Nob3dfaGVsZF9sb2Nrcyk7CiAKIHZvaWQgbG9ja2RlcF9zeXNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXBfcHJvYy5jIGIva2VybmVsL2xvY2tkZXBfcHJvYy5jCmluZGV4IDIwZGJjYmYuLjEzNzE2YjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwX3Byb2MuYworKysgYi9rZXJuZWwvbG9ja2RlcF9wcm9jLmMKQEAgLTQ3MCwxMSArNDcwLDEyIEBACiAKIHN0YXRpYyB2b2lkIHNucHJpbnRfdGltZShjaGFyICpidWYsIHNpemVfdCBidWZzaXosIHM2NCBucikKIHsKLQl1bnNpZ25lZCBsb25nIHJlbTsKKwlzNjQgZGl2OworCXMzMiByZW07CiAKIAluciArPSA1OyAvKiBmb3IgZGlzcGxheSByb3VuZGluZyAqLwotCXJlbSA9IGRvX2RpdihuciwgMTAwMCk7IC8qIFhYWDogZG9fZGl2X3NpZ25lZCAqLwotCXNucHJpbnRmKGJ1ZiwgYnVmc2l6LCAiJWxsZC4lMDJkIiwgKGxvbmcgbG9uZyluciwgKGludClyZW0vMTApOworCWRpdiA9IGRpdl9zNjRfcmVtKG5yLCAxMDAwLCAmcmVtKTsKKwlzbnByaW50ZihidWYsIGJ1ZnNpeiwgIiVsbGQuJTAyZCIsIChsb25nIGxvbmcpZGl2LCAoaW50KXJlbS8xMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcV90aW1lKHN0cnVjdCBzZXFfZmlsZSAqbSwgczY0IHRpbWUpCkBAIC01NTYsNyArNTU3LDcgQEAKIAlpZiAoc3RhdHMtPnJlYWRfaG9sZHRpbWUubnIpCiAJCW5hbWVsZW4gKz0gMjsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzLT5jb250ZW50aW9uX3BvaW50KTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IExPQ0tTVEFUX1BPSU5UUzsgaSsrKSB7CiAJCWNoYXIgc3ltW0tTWU1fU1lNQk9MX0xFTl07CiAJCWNoYXIgaXBbMzJdOwogCkBAIC01NzMsNiArNTc0LDIzIEBACiAJCQkJc3RhdHMtPmNvbnRlbnRpb25fcG9pbnRbaV0sCiAJCQkJaXAsIHN5bSk7CiAJfQorCWZvciAoaSA9IDA7IGkgPCBMT0NLU1RBVF9QT0lOVFM7IGkrKykgeworCQljaGFyIHN5bVtLU1lNX1NZTUJPTF9MRU5dOworCQljaGFyIGlwWzMyXTsKKworCQlpZiAoY2xhc3MtPmNvbnRlbmRpbmdfcG9pbnRbaV0gPT0gMCkKKwkJCWJyZWFrOworCisJCWlmICghaSkKKwkJCXNlcV9saW5lKG0sICctJywgNDAtbmFtZWxlbiwgbmFtZWxlbik7CisKKwkJc3ByaW50X3N5bWJvbChzeW0sIGNsYXNzLT5jb250ZW5kaW5nX3BvaW50W2ldKTsKKwkJc25wcmludGYoaXAsIHNpemVvZihpcCksICJbPCVwPl0iLAorCQkJCSh2b2lkICopY2xhc3MtPmNvbnRlbmRpbmdfcG9pbnRbaV0pOworCQlzZXFfcHJpbnRmKG0sICIlNDBzICUxNGx1ICUyOXMgJXNcbiIsIG5hbWUsCisJCQkJc3RhdHMtPmNvbnRlbmRpbmdfcG9pbnRbaV0sCisJCQkJaXAsIHN5bSk7CisJfQogCWlmIChpKSB7CiAJCXNlcV9wdXRzKG0sICJcbiIpOwogCQlzZXFfbGluZShtLCAnLicsIDAsIDQwICsgMSArIDEwICogKDE0ICsgMSkpOwpAQCAtNTgyLDcgKzYwMCw3IEBACiAKIHN0YXRpYyB2b2lkIHNlcV9oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKQogewotCXNlcV9wcmludGYobSwgImxvY2tfc3RhdCB2ZXJzaW9uIDAuMlxuIik7CisJc2VxX3ByaW50ZihtLCAibG9ja19zdGF0IHZlcnNpb24gMC4zXG4iKTsKIAlzZXFfbGluZShtLCAnLScsIDAsIDQwICsgMSArIDEwICogKDE0ICsgMSkpOwogCXNlcV9wcmludGYobSwgIiU0MHMgJTE0cyAlMTRzICUxNHMgJTE0cyAlMTRzICUxNHMgJTE0cyAlMTRzICIKIAkJCSIlMTRzICUxNHNcbiIsCmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IDEyYzc3OWQuLjRmNDVkNGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC01OSw3ICs1OSw3IEBACiAgKiBXZSBhbHNvIHB1dCB0aGUgZmFzdHBhdGggZmlyc3QgaW4gdGhlIGtlcm5lbCBpbWFnZSwgdG8gbWFrZSBzdXJlIHRoZQogICogYnJhbmNoIGlzIHByZWRpY3RlZCBieSB0aGUgQ1BVIGFzIGRlZmF1bHQtdW50YWtlbi4KICAqLwotc3RhdGljIHZvaWQgbm9pbmxpbmUgX19zY2hlZAorc3RhdGljIF9fdXNlZCBub2lubGluZSB2b2lkIF9fc2NoZWQKIF9fbXV0ZXhfbG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CiAKIC8qKioKQEAgLTk2LDcgKzk2LDcgQEAKIEVYUE9SVF9TWU1CT0wobXV0ZXhfbG9jayk7CiAjZW5kaWYKIAotc3RhdGljIG5vaW5saW5lIHZvaWQgX19zY2hlZCBfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitzdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZCBfX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CiAKIC8qKioKICAqIG11dGV4X3VubG9jayAtIHJlbGVhc2UgdGhlIG11dGV4CkBAIC0xODQsNyArMTg0LDcgQEAKIAl9CiAKIGRvbmU6Ci0JbG9ja19hY3F1aXJlZCgmbG9jay0+ZGVwX21hcCk7CisJbG9ja19hY3F1aXJlZCgmbG9jay0+ZGVwX21hcCwgaXApOwogCS8qIGdvdCB0aGUgbG9jayAtIHJlam9pY2UhICovCiAJbXV0ZXhfcmVtb3ZlX3dhaXRlcihsb2NrLCAmd2FpdGVyLCB0YXNrX3RocmVhZF9pbmZvKHRhc2spKTsKIAlkZWJ1Z19tdXRleF9zZXRfb3duZXIobG9jaywgdGFza190aHJlYWRfaW5mbyh0YXNrKSk7CkBAIC0yNjgsNyArMjY4LDcgQEAKIC8qCiAgKiBSZWxlYXNlIHRoZSBsb2NrLCBzbG93cGF0aDoKICAqLwotc3RhdGljIG5vaW5saW5lIHZvaWQKK3N0YXRpYyBfX3VzZWQgbm9pbmxpbmUgdm9pZAogX19tdXRleF91bmxvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpCiB7CiAJX19tdXRleF91bmxvY2tfY29tbW9uX3Nsb3dwYXRoKGxvY2tfY291bnQsIDEpOwpAQCAtMzEzLDcgKzMxMyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG11dGV4X2xvY2tfa2lsbGFibGUpOwogCi1zdGF0aWMgbm9pbmxpbmUgdm9pZCBfX3NjaGVkCitzdGF0aWMgX191c2VkIG5vaW5saW5lIHZvaWQgX19zY2hlZAogX19tdXRleF9sb2NrX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ub3RpZmllci5jIGIva2VybmVsL25vdGlmaWVyLmMKaW5kZXggNDI4MmMwYS4uNjFkNWFhNSAxMDA2NDQKLS0tIGEva2VybmVsL25vdGlmaWVyLmMKKysrIGIva2VybmVsL25vdGlmaWVyLmMKQEAgLTgyLDYgKzgyLDE0IEBACiAKIAl3aGlsZSAobmIgJiYgbnJfdG9fY2FsbCkgewogCQluZXh0X25iID0gcmN1X2RlcmVmZXJlbmNlKG5iLT5uZXh0KTsKKworI2lmZGVmIENPTkZJR19ERUJVR19OT1RJRklFUlMKKwkJaWYgKHVubGlrZWx5KCFmdW5jX3B0cl9pc19rZXJuZWxfdGV4dChuYi0+bm90aWZpZXJfY2FsbCkpKSB7CisJCQlXQVJOKDEsICJJbnZhbGlkIG5vdGlmaWVyIGNhbGxlZCEiKTsKKwkJCW5iID0gbmV4dF9uYjsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKIAkJcmV0ID0gbmItPm5vdGlmaWVyX2NhbGwobmIsIHZhbCwgdik7CiAKIAkJaWYgKG5yX2NhbGxzKQpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA0ZDUwODgzLi4xM2YwNjM0IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogaW50IHBhbmljX29uX29vcHM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0YWludGVkX21hc2s7CkBAIC0zMjEsMzYgKzMyMiwyNyBAQAogfQogCiAjaWZkZWYgV0FOVF9XQVJOX09OX1NMT1dQQVRICi12b2lkIHdhcm5fb25fc2xvd3BhdGgoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0JY2hhciBmdW5jdGlvbltLU1lNX1NZTUJPTF9MRU5dOwotCXVuc2lnbmVkIGxvbmcgY2FsbGVyID0gKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQlzcHJpbnRfc3ltYm9sKGZ1bmN0aW9uLCBjYWxsZXIpOwotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tXG4iKTsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBhdCAlczolZCAlcygpXG4iLCBmaWxlLAotCQlsaW5lLCBmdW5jdGlvbik7Ci0JcHJpbnRfbW9kdWxlcygpOwotCWR1bXBfc3RhY2soKTsKLQlwcmludF9vb3BzX2VuZF9tYXJrZXIoKTsKLQlhZGRfdGFpbnQoVEFJTlRfV0FSTik7Ci19Ci1FWFBPUlRfU1lNQk9MKHdhcm5fb25fc2xvd3BhdGgpOwotCi0KIHZvaWQgd2Fybl9zbG93cGF0aChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCWNoYXIgZnVuY3Rpb25bS1NZTV9TWU1CT0xfTEVOXTsKIAl1bnNpZ25lZCBsb25nIGNhbGxlciA9ICh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwljb25zdCBjaGFyICpib2FyZDsKKwogCXNwcmludF9zeW1ib2woZnVuY3Rpb24sIGNhbGxlcik7CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICItLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IGF0ICVzOiVkICVzKClcbiIsIGZpbGUsCiAJCWxpbmUsIGZ1bmN0aW9uKTsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7CisJYm9hcmQgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOworCWlmIChib2FyZCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSGFyZHdhcmUgbmFtZTogJXNcbiIsIGJvYXJkKTsKKworCWlmIChmbXQpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnByaW50ayhmbXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfQogCiAJcHJpbnRfbW9kdWxlcygpOwogCWR1bXBfc3RhY2soKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCmluZGV4IDRlNTI4OGEuLjE1N2RlM2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwpAQCAtNTgsMjEgKzU4LDIxIEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJc3RydWN0IHRhc2tfY3B1dGltZSAqdGltZXMpCiB7Ci0Jc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZzsKKwlzdHJ1Y3QgdGFza19jcHV0aW1lICp0b3RhbHMsICp0b3Q7CiAJaW50IGk7Ci0Jc3RydWN0IHRhc2tfY3B1dGltZSAqdG90OwogCi0Jc2lnID0gdHNrLT5zaWduYWw7Ci0JaWYgKHVubGlrZWx5KCFzaWcpIHx8ICFzaWctPmNwdXRpbWUudG90YWxzKSB7CisJdG90YWxzID0gdHNrLT5zaWduYWwtPmNwdXRpbWUudG90YWxzOworCWlmICghdG90YWxzKSB7CiAJCXRpbWVzLT51dGltZSA9IHRzay0+dXRpbWU7CiAJCXRpbWVzLT5zdGltZSA9IHRzay0+c3RpbWU7CiAJCXRpbWVzLT5zdW1fZXhlY19ydW50aW1lID0gdHNrLT5zZS5zdW1fZXhlY19ydW50aW1lOwogCQlyZXR1cm47CiAJfQorCiAJdGltZXMtPnN0aW1lID0gdGltZXMtPnV0aW1lID0gY3B1dGltZV96ZXJvOwogCXRpbWVzLT5zdW1fZXhlY19ydW50aW1lID0gMDsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQl0b3QgPSBwZXJfY3B1X3B0cih0c2stPnNpZ25hbC0+Y3B1dGltZS50b3RhbHMsIGkpOworCQl0b3QgPSBwZXJfY3B1X3B0cih0b3RhbHMsIGkpOwogCQl0aW1lcy0+dXRpbWUgPSBjcHV0aW1lX2FkZCh0aW1lcy0+dXRpbWUsIHRvdC0+dXRpbWUpOwogCQl0aW1lcy0+c3RpbWUgPSBjcHV0aW1lX2FkZCh0aW1lcy0+c3RpbWUsIHRvdC0+c3RpbWUpOwogCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSB0b3QtPnN1bV9leGVjX3J1bnRpbWU7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggYTE0MGU0NC4uODg3YzYzNyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAgKgkgICAgbXVzdCBzdXBwbHkgZnVuY3Rpb25zIGhlcmUsIGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGp1c3QgcmV0dXJucwogICoJICAgIEVOT1NZUy4gIFRoZSBzdGFuZGFyZCBQT1NJWCB0aW1lciBtYW5hZ2VtZW50IGNvZGUgYXNzdW1lcyB0aGUKICAqCSAgICBmb2xsb3dpbmc6IDEuKSBUaGUga19pdGltZXIgc3RydWN0IChzY2hlZC5oKSBpcyB1c2VkIGZvciB0aGUKLSAqCSAgICB0aW1lci4gIDIuKSBUaGUgbGlzdCwgaXRfbG9jaywgaXRfY2xvY2ssIGl0X2lkIGFuZCBpdF9wcm9jZXNzCisgKgkgICAgdGltZXIuICAyLikgVGhlIGxpc3QsIGl0X2xvY2ssIGl0X2Nsb2NrLCBpdF9pZCBhbmQgaXRfcGlkCiAgKgkgICAgZmllbGRzIGFyZSBub3QgbW9kaWZpZWQgYnkgdGltZXIgY29kZS4KICAqCiAgKiAgICAgICAgICBBdCB0aGlzIHRpbWUgYWxsIGZ1bmN0aW9ucyBFWENFUFQgY2xvY2tfbmFub3NsZWVwIGNhbiBiZQpAQCAtMzE5LDcgKzMxOSw4IEBACiAKIGludCBwb3NpeF90aW1lcl9ldmVudChzdHJ1Y3Qga19pdGltZXIgKnRpbXIsIGludCBzaV9wcml2YXRlKQogewotCWludCBzaGFyZWQsIHJldDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJaW50IHNoYXJlZCwgcmV0ID0gLTE7CiAJLyoKIAkgKiBGSVhNRTogaWYgLT5zaWdxIGlzIHF1ZXVlZCB3ZSBjYW4gcmFjZSB3aXRoCiAJICogZGVxdWV1ZV9zaWduYWwoKS0+ZG9fc2NoZWR1bGVfbmV4dF90aW1lcigpLgpAQCAtMzMzLDggKzMzNCwxMyBAQAogCSAqLwogCXRpbXItPnNpZ3EtPmluZm8uc2lfc3lzX3ByaXZhdGUgPSBzaV9wcml2YXRlOwogCi0Jc2hhcmVkID0gISh0aW1yLT5pdF9zaWdldl9ub3RpZnkgJiBTSUdFVl9USFJFQURfSUQpOwotCXJldCA9IHNlbmRfc2lncXVldWUodGltci0+c2lncSwgdGltci0+aXRfcHJvY2Vzcywgc2hhcmVkKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJdGFzayA9IHBpZF90YXNrKHRpbXItPml0X3BpZCwgUElEVFlQRV9QSUQpOworCWlmICh0YXNrKSB7CisJCXNoYXJlZCA9ICEodGltci0+aXRfc2lnZXZfbm90aWZ5ICYgU0lHRVZfVEhSRUFEX0lEKTsKKwkJcmV0ID0gc2VuZF9zaWdxdWV1ZSh0aW1yLT5zaWdxLCB0YXNrLCBzaGFyZWQpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAkvKiBJZiB3ZSBmYWlsZWQgdG8gc2VuZCB0aGUgc2lnbmFsIHRoZSB0aW1lciBzdG9wcy4gKi8KIAlyZXR1cm4gcmV0ID4gMDsKIH0KQEAgLTQxMSw3ICs0MTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBnb29kX3NpZ2V2ZW50KHNpZ2V2ZW50X3QgKiBldmVudCkKK3N0YXRpYyBzdHJ1Y3QgcGlkICpnb29kX3NpZ2V2ZW50KHNpZ2V2ZW50X3QgKiBldmVudCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ0biA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKIApAQCAtNDI1LDcgKzQzMSw3IEBACiAJICAgICgoZXZlbnQtPnNpZ2V2X3NpZ25vIDw9IDApIHx8IChldmVudC0+c2lnZXZfc2lnbm8gPiBTSUdSVE1BWCkpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBydG47CisJcmV0dXJuIHRhc2tfcGlkKHJ0bik7CiB9CiAKIHZvaWQgcmVnaXN0ZXJfcG9zaXhfY2xvY2soY29uc3QgY2xvY2tpZF90IGNsb2NrX2lkLCBzdHJ1Y3Qga19jbG9jayAqbmV3X2Nsb2NrKQpAQCAtNDY0LDYgKzQ3MCw3IEBACiAJCWlkcl9yZW1vdmUoJnBvc2l4X3RpbWVyc19pZCwgdG1yLT5pdF9pZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkcl9sb2NrLCBmbGFncyk7CiAJfQorCXB1dF9waWQodG1yLT5pdF9waWQpOwogCXNpZ3F1ZXVlX2ZyZWUodG1yLT5zaWdxKTsKIAlrbWVtX2NhY2hlX2ZyZWUocG9zaXhfdGltZXJzX2NhY2hlLCB0bXIpOwogfQpAQCAtNDc3LDcgKzQ4NCw2IEBACiB7CiAJc3RydWN0IGtfaXRpbWVyICpuZXdfdGltZXI7CiAJaW50IGVycm9yLCBuZXdfdGltZXJfaWQ7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwcm9jZXNzOwogCXNpZ2V2ZW50X3QgZXZlbnQ7CiAJaW50IGl0X2lkX3NldCA9IElUX0lEX05PVF9TRVQ7CiAKQEAgLTUzMSwxMSArNTM3LDkgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJcHJvY2VzcyA9IGdvb2Rfc2lnZXZlbnQoJmV2ZW50KTsKLQkJaWYgKHByb2Nlc3MpCi0JCQlnZXRfdGFza19zdHJ1Y3QocHJvY2Vzcyk7CisJCW5ld190aW1lci0+aXRfcGlkID0gZ2V0X3BpZChnb29kX3NpZ2V2ZW50KCZldmVudCkpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKCFwcm9jZXNzKSB7CisJCWlmICghbmV3X3RpbWVyLT5pdF9waWQpIHsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC01NDMsOCArNTQ3LDcgQEAKIAkJZXZlbnQuc2lnZXZfbm90aWZ5ID0gU0lHRVZfU0lHTkFMOwogCQlldmVudC5zaWdldl9zaWdubyA9IFNJR0FMUk07CiAJCWV2ZW50LnNpZ2V2X3ZhbHVlLnNpdmFsX2ludCA9IG5ld190aW1lci0+aXRfaWQ7Ci0JCXByb2Nlc3MgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7Ci0JCWdldF90YXNrX3N0cnVjdChwcm9jZXNzKTsKKwkJbmV3X3RpbWVyLT5pdF9waWQgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7CiAJfQogCiAJbmV3X3RpbWVyLT5pdF9zaWdldl9ub3RpZnkgICAgID0gZXZlbnQuc2lnZXZfbm90aWZ5OwpAQCAtNTU0LDcgKzU1Nyw3IEBACiAJbmV3X3RpbWVyLT5zaWdxLT5pbmZvLnNpX2NvZGUgID0gU0lfVElNRVI7CiAKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQluZXdfdGltZXItPml0X3Byb2Nlc3MgPSBwcm9jZXNzOworCW5ld190aW1lci0+aXRfc2lnbmFsID0gY3VycmVudC0+c2lnbmFsOwogCWxpc3RfYWRkKCZuZXdfdGltZXItPmxpc3QsICZjdXJyZW50LT5zaWduYWwtPnBvc2l4X3RpbWVycyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIApAQCAtNTg5LDggKzU5Miw3IEBACiAJdGltciA9IGlkcl9maW5kKCZwb3NpeF90aW1lcnNfaWQsIChpbnQpdGltZXJfaWQpOwogCWlmICh0aW1yKSB7CiAJCXNwaW5fbG9jaygmdGltci0+aXRfbG9jayk7Ci0JCWlmICh0aW1yLT5pdF9wcm9jZXNzICYmCi0JCSAgICBzYW1lX3RocmVhZF9ncm91cCh0aW1yLT5pdF9wcm9jZXNzLCBjdXJyZW50KSkgeworCQlpZiAodGltci0+aXRfc2lnbmFsID09IGN1cnJlbnQtPnNpZ25hbCkgewogCQkJc3Bpbl91bmxvY2soJmlkcl9sb2NrKTsKIAkJCXJldHVybiB0aW1yOwogCQl9CkBAIC04MzcsOCArODM5LDcgQEAKIAkgKiBUaGlzIGtlZXBzIGFueSB0YXNrcyB3YWl0aW5nIG9uIHRoZSBzcGluIGxvY2sgZnJvbSB0aGlua2luZwogCSAqIHRoZXkgZ290IHNvbWV0aGluZyAoc2VlIHRoZSBsb2NrIGNvZGUgYWJvdmUpLgogCSAqLwotCXB1dF90YXNrX3N0cnVjdCh0aW1lci0+aXRfcHJvY2Vzcyk7Ci0JdGltZXItPml0X3Byb2Nlc3MgPSBOVUxMOworCXRpbWVyLT5pdF9zaWduYWwgPSBOVUxMOwogCiAJdW5sb2NrX3RpbWVyKHRpbWVyLCBmbGFncyk7CiAJcmVsZWFzZV9wb3NpeF90aW1lcih0aW1lciwgSVRfSURfU0VUKTsKQEAgLTg2NCw4ICs4NjUsNyBAQAogCSAqIFRoaXMga2VlcHMgYW55IHRhc2tzIHdhaXRpbmcgb24gdGhlIHNwaW4gbG9jayBmcm9tIHRoaW5raW5nCiAJICogdGhleSBnb3Qgc29tZXRoaW5nIChzZWUgdGhlIGxvY2sgY29kZSBhYm92ZSkuCiAJICovCi0JcHV0X3Rhc2tfc3RydWN0KHRpbWVyLT5pdF9wcm9jZXNzKTsKLQl0aW1lci0+aXRfcHJvY2VzcyA9IE5VTEw7CisJdGltZXItPml0X3NpZ25hbCA9IE5VTEw7CiAKIAl1bmxvY2tfdGltZXIodGltZXIsIGZsYWdzKTsKIAlyZWxlYXNlX3Bvc2l4X3RpbWVyKHRpbWVyLCBJVF9JRF9TRVQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IGY0OTJmMTUuLmU2NTFhYjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTY2Miw3ICs2NjIsNyBAQAogCWlmIChyZWN1cnNpb25fYnVnKSB7CiAJCXJlY3Vyc2lvbl9idWcgPSAwOwogCQlzdHJjcHkocHJpbnRrX2J1ZiwgcmVjdXJzaW9uX2J1Z19tc2cpOwotCQlwcmludGVkX2xlbiA9IHNpemVvZihyZWN1cnNpb25fYnVnX21zZyk7CisJCXByaW50ZWRfbGVuID0gc3RybGVuKHJlY3Vyc2lvbl9idWdfbXNnKTsKIAl9CiAJLyogRW1pdCB0aGUgb3V0cHV0IGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIgKi8KIAlwcmludGVkX2xlbiArPSB2c2NucHJpbnRmKHByaW50a19idWYgKyBwcmludGVkX2xlbiwKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VjbGFzc2ljLmMgYi9rZXJuZWwvcmN1Y2xhc3NpYy5jCmluZGV4IDM3ZjcyZTU1MS4uZTUwM2EwMCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdWNsYXNzaWMuYworKysgYi9rZXJuZWwvcmN1Y2xhc3NpYy5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAogCS8qIE9LLCB0aW1lIHRvIHJhdCBvbiBvdXIgYnVkZHkuLi4gKi8KIAotCXByaW50ayhLRVJOX0VSUiAiUkNVIGRldGVjdGVkIENQVSBzdGFsbHM6Iik7CisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiBSQ1UgZGV0ZWN0ZWQgQ1BVIHN0YWxsczoiKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCWlmIChjcHVfaXNzZXQoY3B1LCByY3AtPmNwdW1hc2spKQogCQkJcHJpbnRrKCIgJWQiLCBjcHUpOwpAQCAtMjA0LDcgKzIwNCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXByaW50ayhLRVJOX0VSUiAiUkNVIGRldGVjdGVkIENQVSAlZCBzdGFsbCAodD0lbHUvJWx1IGppZmZpZXMpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiSU5GTzogUkNVIGRldGVjdGVkIENQVSAlZCBzdGFsbCAodD0lbHUvJWx1IGppZmZpZXMpXG4iLAogCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBqaWZmaWVzLAogCQkJamlmZmllcyAtIHJjcC0+Z3Bfc3RhcnQpOwogCWR1bXBfc3RhY2soKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwcmVlbXB0LmMgYi9rZXJuZWwvcmN1cHJlZW1wdC5jCmluZGV4IDU5MjM2ZTguLjA0OTgyNjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwcmVlbXB0LmMKKysrIGIva2VybmVsL3JjdXByZWVtcHQuYwpAQCAtNTUxLDYgKzU1MSwxNiBAQAogCX0KIH0KIAordm9pZCByY3Vfbm1pX2VudGVyKHZvaWQpCit7CisJcmN1X2lycV9lbnRlcigpOworfQorCit2b2lkIHJjdV9ubWlfZXhpdCh2b2lkKQoreworCXJjdV9pcnFfZXhpdCgpOworfQorCiBzdGF0aWMgdm9pZCBkeW50aWNrX3NhdmVfcHJvZ3Jlc3NfY291bnRlcihpbnQgY3B1KQogewogCXN0cnVjdCByY3VfZHludGlja19zY2hlZCAqcmRzc3AgPSAmcGVyX2NwdShyY3VfZHludGlja19zY2hlZCwgY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwcmVlbXB0X3RyYWNlLmMgYi9rZXJuZWwvcmN1cHJlZW1wdF90cmFjZS5jCmluZGV4IDM1YzJkMzMuLjdjMjY2NWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwcmVlbXB0X3RyYWNlLmMKKysrIGIva2VybmVsL3JjdXByZWVtcHRfdHJhY2UuYwpAQCAtMTQ5LDEyICsxNDksMTIgQEAKIAkJc3AtPmRvbmVfbGVuZ3RoICs9IGNwLT5kb25lX2xlbmd0aDsKIAkJc3AtPmRvbmVfYWRkICs9IGNwLT5kb25lX2FkZDsKIAkJc3AtPmRvbmVfcmVtb3ZlICs9IGNwLT5kb25lX3JlbW92ZTsKLQkJYXRvbWljX3NldCgmc3AtPmRvbmVfaW52b2tlZCwgYXRvbWljX3JlYWQoJmNwLT5kb25lX2ludm9rZWQpKTsKKwkJYXRvbWljX2FkZChhdG9taWNfcmVhZCgmY3AtPmRvbmVfaW52b2tlZCksICZzcC0+ZG9uZV9pbnZva2VkKTsKIAkJc3AtPnJjdV9jaGVja19jYWxsYmFja3MgKz0gY3AtPnJjdV9jaGVja19jYWxsYmFja3M7Ci0JCWF0b21pY19zZXQoJnNwLT5yY3VfdHJ5X2ZsaXBfMSwKLQkJCSAgIGF0b21pY19yZWFkKCZjcC0+cmN1X3RyeV9mbGlwXzEpKTsKLQkJYXRvbWljX3NldCgmc3AtPnJjdV90cnlfZmxpcF9lMSwKLQkJCSAgIGF0b21pY19yZWFkKCZjcC0+cmN1X3RyeV9mbGlwX2UxKSk7CisJCWF0b21pY19hZGQoYXRvbWljX3JlYWQoJmNwLT5yY3VfdHJ5X2ZsaXBfMSksCisJCQkgICAmc3AtPnJjdV90cnlfZmxpcF8xKTsKKwkJYXRvbWljX2FkZChhdG9taWNfcmVhZCgmY3AtPnJjdV90cnlfZmxpcF9lMSksCisJCQkgICAmc3AtPnJjdV90cnlfZmxpcF9lMSk7CiAJCXNwLT5yY3VfdHJ5X2ZsaXBfaTEgKz0gY3AtPnJjdV90cnlfZmxpcF9pMTsKIAkJc3AtPnJjdV90cnlfZmxpcF9pZTEgKz0gY3AtPnJjdV90cnlfZmxpcF9pZTE7CiAJCXNwLT5yY3VfdHJ5X2ZsaXBfZzEgKz0gY3AtPnJjdV90cnlfZmxpcF9nMTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCmluZGV4IDg1Y2I5MDUuLmIzMTA2NTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdXRvcnR1cmUuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTEwOCw3ICsxMDksNiBAQAogCWludCBydG9ydF9tYnRlc3Q7CiB9OwogCi1zdGF0aWMgaW50IGZ1bGxzdG9wID0gMDsJLyogc3RvcCBnZW5lcmF0aW5nIGNhbGxiYWNrcyBhdCB0ZXN0IGVuZC4gKi8KIHN0YXRpYyBMSVNUX0hFQUQocmN1X3RvcnR1cmVfZnJlZWxpc3QpOwogc3RhdGljIHN0cnVjdCByY3VfdG9ydHVyZSAqcmN1X3RvcnR1cmVfY3VycmVudCA9IE5VTEw7CiBzdGF0aWMgbG9uZyByY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24gPSAwOwpAQCAtMTM2LDYgKzEzNiwzMCBAQAogI2VuZGlmCiBpbnQgcmN1dG9ydHVyZV9ydW5uYWJsZSA9IFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVDsKIAorI2RlZmluZSBGVUxMU1RPUF9TSUdOQUxFRCAxCS8qIEJhaWwgZHVlIHRvIHNpZ25hbC4gKi8KKyNkZWZpbmUgRlVMTFNUT1BfQ0xFQU5VUCAgMgkvKiBPcmRlcmx5IHNodXRkb3duLiAqLworc3RhdGljIGludCBmdWxsc3RvcDsJCS8qIHN0b3AgZ2VuZXJhdGluZyBjYWxsYmFja3MgYXQgdGVzdCBlbmQuICovCitERUZJTkVfTVVURVgoZnVsbHN0b3BfbXV0ZXgpOwkvKiBwcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCAqLworCQkJCS8qICBzcGF3bmluZyBvZiBrdGhyZWFkcy4gKi8KKworLyoKKyAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHNpZ25hbC1iYXNlZCBzaHV0ZG93bi4KKyAqLworc3RhdGljIGludAorcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQxLAorCQkJICAgdW5zaWduZWQgbG9uZyB1bnVzZWQyLCB2b2lkICp1bnVzZWQzKQoreworCWlmIChmdWxsc3RvcCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJCWlmICghQUNDRVNTX09OQ0UoZnVsbHN0b3ApKQorCQkJZnVsbHN0b3AgPSBGVUxMU1RPUF9TSUdOQUxFRDsKKwkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKwogLyoKICAqIEFsbG9jYXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcmN1X3RvcnR1cmVzIHBvb2wuCiAgKi8KQEAgLTE5OSwxMSArMjIzLDEyIEBACiBzdGF0aWMgdm9pZAogcmN1X3N0dXR0ZXJfd2FpdCh2b2lkKQogewotCXdoaWxlIChzdHV0dGVyX3BhdXNlX3Rlc3QgfHwgIXJjdXRvcnR1cmVfcnVubmFibGUpCisJd2hpbGUgKChzdHV0dGVyX3BhdXNlX3Rlc3QgfHwgIXJjdXRvcnR1cmVfcnVubmFibGUpICYmICFmdWxsc3RvcCkgewogCQlpZiAocmN1dG9ydHVyZV9ydW5uYWJsZSkKIAkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAkJZWxzZQogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoSFopKTsKKwl9CiB9CiAKIC8qCkBAIC01OTksNyArNjI0LDcgQEAKIAkJcmN1X3N0dXR0ZXJfd2FpdCgpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWZ1bGxzdG9wKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0lHTkFMRUQpCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpAQCAtNjI0LDcgKzY0OSw3IEBACiAJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOwogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RvcHBpbmciKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSUdOQUxFRCkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MzQsNyArNzU5LDcgQEAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0b3BwaW5nIik7CiAJaWYgKGlycXJlYWRlciAmJiBjdXJfb3BzLT5pcnFjYXBhYmxlKQogCQlkZWxfdGltZXJfc3luYygmdCk7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0lHTkFMRUQpCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpAQCAtODMxLDcgKzg1Niw3IEBACiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3RhdF9pbnRlcnZhbCAqIEhaKTsKIAkJcmN1X3RvcnR1cmVfc3RhdHNfcHJpbnQoKTsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFmdWxsc3RvcCk7CiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdGF0cyB0YXNrIHN0b3BwaW5nIik7CiAJcmV0dXJuIDA7CiB9CkBAIC04OTksNyArOTI0LDcgQEAKIAlkbyB7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzaHVmZmxlX2ludGVydmFsICogSFopOwogCQlyY3VfdG9ydHVyZV9zaHVmZmxlX3Rhc2tzKCk7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOwogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1ZmZsZSB0YXNrIHN0b3BwaW5nIik7CiAJcmV0dXJuIDA7CiB9CkBAIC05MTQsMTAgKzkzOSwxMCBAQAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0dXR0ZXIgKiBIWik7CiAJCXN0dXR0ZXJfcGF1c2VfdGVzdCA9IDE7Ci0JCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApCiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc3R1dHRlciAqIEhaKTsKIAkJc3R1dHRlcl9wYXVzZV90ZXN0ID0gMDsKLQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFmdWxsc3RvcCk7CiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zdHV0dGVyIHRhc2sgc3RvcHBpbmciKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTkzNCwxMiArOTU5LDI3IEBACiAJCXN0dXR0ZXIsIGlycXJlYWRlcik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmN1dG9ydHVyZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfc2h1dGRvd25fbm90aWZ5LAorfTsKKwogc3RhdGljIHZvaWQKIHJjdV90b3J0dXJlX2NsZWFudXAodm9pZCkKIHsKIAlpbnQgaTsKIAotCWZ1bGxzdG9wID0gMTsKKwltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJaWYgKCFmdWxsc3RvcCkgeworCQkvKiBJZiBiZWluZyBzaWduYWxlZCwgbGV0IGl0IGhhcHBlbiwgdGhlbiBleGl0LiAqLworCQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEwICogSFopOworCQlpZiAoY3VyX29wcy0+Y2JfYmFycmllciAhPSBOVUxMKQorCQkJY3VyX29wcy0+Y2JfYmFycmllcigpOworCQlyZXR1cm47CisJfQorCWZ1bGxzdG9wID0gRlVMTFNUT1BfQ0xFQU5VUDsKKwltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmN1dG9ydHVyZV9uYik7CiAJaWYgKHN0dXR0ZXJfdGFzaykgewogCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3N0dXR0ZXIgdGFzayIpOwogCQlrdGhyZWFkX3N0b3Aoc3R1dHRlcl90YXNrKTsKQEAgLTEwMTUsNiArMTA1NSw4IEBACiAJCXsgJnJjdV9vcHMsICZyY3Vfc3luY19vcHMsICZyY3VfYmhfb3BzLCAmcmN1X2JoX3N5bmNfb3BzLAogCQkgICZzcmN1X29wcywgJnNjaGVkX29wcywgJnNjaGVkX29wc19zeW5jLCB9OwogCisJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCiAJLyogUHJvY2VzcyBhcmdzIGFuZCB0ZWxsIHRoZSB3b3JsZCB0aGF0IHRoZSB0b3J0dXJlciBpcyBvbiB0aGUgam9iLiAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcnR1cmVfb3BzKTsgaSsrKSB7CiAJCWN1cl9vcHMgPSB0b3J0dXJlX29wc1tpXTsKQEAgLTEwMjQsNiArMTA2Niw3IEBACiAJaWYgKGkgPT0gQVJSQVlfU0laRSh0b3J0dXJlX29wcykpIHsKIAkJcHJpbnRrKEtFUk5fQUxFUlQgInJjdXRvcnR1cmU6IGludmFsaWQgdG9ydHVyZSB0eXBlOiBcIiVzXCJcbiIsCiAJCSAgICAgICB0b3J0dXJlX3R5cGUpOworCQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKIAkJcmV0dXJuICgtRUlOVkFMKTsKIAl9CiAJaWYgKGN1cl9vcHMtPmluaXQpCkBAIC0xMTQ2LDkgKzExODksMTIgQEAKIAkJCWdvdG8gdW53aW5kOwogCQl9CiAJfQorCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcmN1dG9ydHVyZV9uYik7CisJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIHVud2luZDoKKwltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKIAlyY3VfdG9ydHVyZV9jbGVhbnVwKCk7CiAJcmV0dXJuIGZpcnN0ZXJyOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuYyBiL2tlcm5lbC9yY3V0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0MmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9yY3V0cmVlLmMKQEAgLTAsMCArMSwxNTM1IEBACisvKgorICogUmVhZC1Db3B5IFVwZGF0ZSBtZWNoYW5pc20gZm9yIG11dHVhbCBleGNsdXNpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKKyAqCisgKiBBdXRob3JzOiBEaXBhbmthciBTYXJtYSA8ZGlwYW5rYXJAaW4uaWJtLmNvbT4KKyAqCSAgICBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorICoJICAgIFBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAbGludXgudm5ldC5pYm0uY29tPiBIaWVyYXJjaGljYWwgdmVyc2lvbgorICoKKyAqIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIGJ5IFBhdWwgTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4KKyAqIGFuZCBpbnB1dHMgZnJvbSBSdXN0eSBSdXNzZWxsLCBBbmRyZWEgQXJjYW5nZWxpIGFuZCBBbmRpIEtsZWVuLgorICoKKyAqIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBSZWFkLUNvcHkgVXBkYXRlIG1lY2hhbmlzbSBzZWUgLQorICogCURvY3VtZW50YXRpb24vUkNVCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHJjdV9sb2NrX2tleTsKK3N0cnVjdCBsb2NrZGVwX21hcCByY3VfbG9ja19tYXAgPQorCVNUQVRJQ19MT0NLREVQX01BUF9JTklUKCJyY3VfcmVhZF9sb2NrIiwgJnJjdV9sb2NrX2tleSk7CitFWFBPUlRfU1lNQk9MX0dQTChyY3VfbG9ja19tYXApOworI2VuZGlmCisKKy8qIERhdGEgc3RydWN0dXJlcy4gKi8KKworI2RlZmluZSBSQ1VfU1RBVEVfSU5JVElBTElaRVIobmFtZSkgeyBcCisJLmxldmVsID0geyAmbmFtZS5ub2RlWzBdIH0sIFwKKwkubGV2ZWxjbnQgPSB7IFwKKwkJTlVNX1JDVV9MVkxfMCwgIC8qIHJvb3Qgb2YgaGllcmFyY2h5LiAqLyBcCisJCU5VTV9SQ1VfTFZMXzEsIFwKKwkJTlVNX1JDVV9MVkxfMiwgXAorCQlOVU1fUkNVX0xWTF8zLCAvKiA9PSBNQVhfUkNVX0xWTFMgKi8gXAorCX0sIFwKKwkuc2lnbmFsZWQgPSBSQ1VfU0lHTkFMX0lOSVQsIFwKKwkuZ3BudW0gPSAtMzAwLCBcCisJLmNvbXBsZXRlZCA9IC0zMDAsIFwKKwkub25vZmZsb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJm5hbWUub25vZmZsb2NrKSwgXAorCS5mcXNsb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJm5hbWUuZnFzbG9jayksIFwKKwkubl9mb3JjZV9xcyA9IDAsIFwKKwkubl9mb3JjZV9xc19uZ3AgPSAwLCBcCit9CisKK3N0cnVjdCByY3Vfc3RhdGUgcmN1X3N0YXRlID0gUkNVX1NUQVRFX0lOSVRJQUxJWkVSKHJjdV9zdGF0ZSk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9kYXRhKTsKKworc3RydWN0IHJjdV9zdGF0ZSByY3VfYmhfc3RhdGUgPSBSQ1VfU1RBVEVfSU5JVElBTElaRVIocmN1X2JoX3N0YXRlKTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfZGF0YSwgcmN1X2JoX2RhdGEpOworCisjaWZkZWYgQ09ORklHX05PX0haCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2R5bnRpY2tzLCByY3VfZHludGlja3MpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KKworc3RhdGljIGludCBibGltaXQgPSAxMDsJCS8qIE1heGltdW0gY2FsbGJhY2tzIHBlciBzb2Z0aXJxLiAqLworc3RhdGljIGludCBxaGltYXJrID0gMTAwMDA7CS8qIElmIHRoaXMgbWFueSBwZW5kaW5nLCBpZ25vcmUgYmxpbWl0LiAqLworc3RhdGljIGludCBxbG93bWFyayA9IDEwMDsJLyogT25jZSBvbmx5IHRoaXMgbWFueSBwZW5kaW5nLCB1c2UgYmxpbWl0LiAqLworCitzdGF0aWMgdm9pZCBmb3JjZV9xdWllc2NlbnRfc3RhdGUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBpbnQgcmVsYXhlZCk7CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBSQ1UgYmF0Y2hlcyBwcm9jZXNzZWQgdGh1cyBmYXIgZm9yIGRlYnVnICYgc3RhdHMuCisgKi8KK2xvbmcgcmN1X2JhdGNoZXNfY29tcGxldGVkKHZvaWQpCit7CisJcmV0dXJuIHJjdV9zdGF0ZS5jb21wbGV0ZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyY3VfYmF0Y2hlc19jb21wbGV0ZWQpOworCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgUkNVIEJIIGJhdGNoZXMgcHJvY2Vzc2VkIHRodXMgZmFyIGZvciBkZWJ1ZyAmIHN0YXRzLgorICovCitsb25nIHJjdV9iYXRjaGVzX2NvbXBsZXRlZF9iaCh2b2lkKQoreworCXJldHVybiByY3VfYmhfc3RhdGUuY29tcGxldGVkOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhdGNoZXNfY29tcGxldGVkX2JoKTsKKworLyoKKyAqIERvZXMgdGhlIENQVSBoYXZlIGNhbGxiYWNrcyByZWFkeSB0byBiZSBpbnZva2VkPworICovCitzdGF0aWMgaW50CitjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2Uoc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJcmV0dXJuICZyZHAtPm54dGxpc3QgIT0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdOworfQorCisvKgorICogRG9lcyB0aGUgY3VycmVudCBDUFUgcmVxdWlyZSBhIHlldC1hcy11bnNjaGVkdWxlZCBncmFjZSBwZXJpb2Q/CisgKi8KK3N0YXRpYyBpbnQKK2NwdV9uZWVkc19hbm90aGVyX2dwKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJLyogQUNDRVNTX09OQ0UoKSBiZWNhdXNlIHdlIGFyZSBhY2Nlc3Npbmcgb3V0c2lkZSBvZiBsb2NrLiAqLworCXJldHVybiAqcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdICYmCisJICAgICAgIEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSA9PSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBzcGVjaWZpZWQgcmN1X3N0YXRlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCByY3Vfbm9kZSAqcmN1X2dldF9yb290KHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlyZXR1cm4gJnJzcC0+bm9kZVswXTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKworLyoKKyAqIElmIHRoZSBzcGVjaWZpZWQgQ1BVIGlzIG9mZmxpbmUsIHRlbGwgdGhlIGNhbGxlciB0aGF0IGl0IGlzIGluCisgKiBhIHF1aWVzY2VudCBzdGF0ZS4gIE90aGVyd2lzZSwgd2hhY2sgaXQgd2l0aCBhIHJlc2NoZWR1bGUgSVBJLgorICogR3JhY2UgcGVyaW9kcyBjYW4gZW5kIHVwIHdhaXRpbmcgb24gYW4gb2ZmbGluZSBDUFUgd2hlbiB0aGF0CisgKiBDUFUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29taW5nIG9ubGluZSAtLSBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICogcmN1X25vZGUgYml0bWFza3MgYmVmb3JlIGl0IGFjdHVhbGx5IG1ha2VzIGl0IG9ubGluZS4gIFRoZSBzYW1lIHRoaW5nCisgKiBjYW4gaGFwcGVuIHdoaWxlIGEgQ1BVIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbWluZyBvbmxpbmUuICBCZWNhdXNlIHRoaXMKKyAqIHJhY2UgaXMgcXVpdGUgcmFyZSwgd2UgY2hlY2sgZm9yIGl0IGFmdGVyIGRldGVjdGluZyB0aGF0IHRoZSBncmFjZQorICogcGVyaW9kIGhhcyBiZWVuIGRlbGF5ZWQgcmF0aGVyIHRoYW4gY2hlY2tpbmcgZWFjaCBhbmQgZXZlcnkgQ1BVCisgKiBlYWNoIGFuZCBldmVyeSB0aW1lIHdlIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4KKyAqLworc3RhdGljIGludCByY3VfaW1wbGljaXRfb2ZmbGluZV9xcyhzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwkvKgorCSAqIElmIHRoZSBDUFUgaXMgb2ZmbGluZSwgaXQgaXMgaW4gYSBxdWllc2NlbnQgc3RhdGUuICBXZSBjYW4KKwkgKiB0cnVzdCBpdHMgc3RhdGUgbm90IHRvIGNoYW5nZSBiZWNhdXNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorCSAqLworCWlmIChjcHVfaXNfb2ZmbGluZShyZHAtPmNwdSkpIHsKKwkJcmRwLT5vZmZsaW5lX2ZxcysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBUaGUgQ1BVIGlzIG9ubGluZSwgc28gc2VuZCBpdCBhIHJlc2NoZWR1bGUgSVBJLiAqLworCWlmIChyZHAtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXNtcF9zZW5kX3Jlc2NoZWR1bGUocmRwLT5jcHUpOworCWVsc2UKKwkJc2V0X25lZWRfcmVzY2hlZCgpOworCXJkcC0+cmVzY2hlZF9pcGkrKzsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfU01QICovCisKKyNpZmRlZiBDT05GSUdfTk9fSFoKK3N0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKHJjdV9ycywgMTAgKiBIWiwgNSk7CisKKy8qKgorICogcmN1X2VudGVyX25vaHogLSBpbmZvcm0gUkNVIHRoYXQgY3VycmVudCBDUFUgaXMgZW50ZXJpbmcgbm9oegorICoKKyAqIEVudGVyIG5vaHogbW9kZSwgaW4gb3RoZXIgd29yZHMsIC1sZWF2ZS0gdGhlIG1vZGUgaW4gd2hpY2ggUkNVCisgKiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgY2FuIG9jY3VyLiAgKFRob3VnaCBSQ1UgcmVhZC1zaWRlCisgKiBjcml0aWNhbCBzZWN0aW9ucyBjYW4gb2NjdXIgaW4gaXJxIGhhbmRsZXJzIGluIG5vaHogbW9kZSwgYSBwb3NzaWJpbGl0eQorICogaGFuZGxlZCBieSByY3VfaXJxX2VudGVyKCkgYW5kIHJjdV9pcnFfZXhpdCgpKS4KKyAqLwordm9pZCByY3VfZW50ZXJfbm9oeih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cDsKKworCXNtcF9tYigpOyAvKiBDUFVzIHNlZWluZyArKyBtdXN0IHNlZSBwcmlvciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisJcmR0cC0+ZHludGlja3MrKzsKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nLS07CisJV0FSTl9PTl9SQVRFTElNSVQocmR0cC0+ZHludGlja3MgJiAweDEsICZyY3VfcnMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIHJjdV9leGl0X25vaHogLSBpbmZvcm0gUkNVIHRoYXQgY3VycmVudCBDUFUgaXMgbGVhdmluZyBub2h6CisgKgorICogRXhpdCBub2h6IG1vZGUsIGluIG90aGVyIHdvcmRzLCAtZW50ZXItIHRoZSBtb2RlIGluIHdoaWNoIFJDVQorICogcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG5vcm1hbGx5IG9jY3VyLgorICovCit2b2lkIHJjdV9leGl0X25vaHoodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisJcmR0cC0+ZHludGlja3MrKzsKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nKys7CisJV0FSTl9PTl9SQVRFTElNSVQoIShyZHRwLT5keW50aWNrcyAmIDB4MSksICZyY3VfcnMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzbXBfbWIoKTsgLyogQ1BVcyBzZWVpbmcgKysgbXVzdCBzZWUgbGF0ZXIgUkNVIHJlYWQtc2lkZSBjcml0IHNlY3RzICovCit9CisKKy8qKgorICogcmN1X25taV9lbnRlciAtIGluZm9ybSBSQ1Ugb2YgZW50cnkgdG8gTk1JIGNvbnRleHQKKyAqCisgKiBJZiB0aGUgQ1BVIHdhcyBpZGxlIHdpdGggZHluYW1pYyB0aWNrcyBhY3RpdmUsIGFuZCB0aGVyZSBpcyBubworICogaXJxIGhhbmRsZXIgcnVubmluZywgdGhpcyB1cGRhdGVzIHJkdHAtPmR5bnRpY2tzX25taSB0byBsZXQgdGhlCisgKiBSQ1UgZ3JhY2UtcGVyaW9kIGhhbmRsaW5nIGtub3cgdGhhdCB0aGUgQ1BVIGlzIGFjdGl2ZS4KKyAqLwordm9pZCByY3Vfbm1pX2VudGVyKHZvaWQpCit7CisJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisKKwlpZiAocmR0cC0+ZHludGlja3MgJiAweDEpCisJCXJldHVybjsKKwlyZHRwLT5keW50aWNrc19ubWkrKzsKKwlXQVJOX09OX1JBVEVMSU1JVCghKHJkdHAtPmR5bnRpY2tzX25taSAmIDB4MSksICZyY3VfcnMpOworCXNtcF9tYigpOyAvKiBDUFVzIHNlZWluZyArKyBtdXN0IHNlZSBsYXRlciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KK30KKworLyoqCisgKiByY3Vfbm1pX2V4aXQgLSBpbmZvcm0gUkNVIG9mIGV4aXQgZnJvbSBOTUkgY29udGV4dAorICoKKyAqIElmIHRoZSBDUFUgd2FzIGlkbGUgd2l0aCBkeW5hbWljIHRpY2tzIGFjdGl2ZSwgYW5kIHRoZXJlIGlzIG5vCisgKiBpcnEgaGFuZGxlciBydW5uaW5nLCB0aGlzIHVwZGF0ZXMgcmR0cC0+ZHludGlja3Nfbm1pIHRvIGxldCB0aGUKKyAqIFJDVSBncmFjZS1wZXJpb2QgaGFuZGxpbmcga25vdyB0aGF0IHRoZSBDUFUgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAqLwordm9pZCByY3Vfbm1pX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpyZHRwID0gJl9fZ2V0X2NwdV92YXIocmN1X2R5bnRpY2tzKTsKKworCWlmIChyZHRwLT5keW50aWNrcyAmIDB4MSkKKwkJcmV0dXJuOworCXNtcF9tYigpOyAvKiBDUFVzIHNlZWluZyArKyBtdXN0IHNlZSBwcmlvciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KKwlyZHRwLT5keW50aWNrc19ubWkrKzsKKwlXQVJOX09OX1JBVEVMSU1JVChyZHRwLT5keW50aWNrc19ubWkgJiAweDEsICZyY3VfcnMpOworfQorCisvKioKKyAqIHJjdV9pcnFfZW50ZXIgLSBpbmZvcm0gUkNVIG9mIGVudHJ5IHRvIGhhcmQgaXJxIGNvbnRleHQKKyAqCisgKiBJZiB0aGUgQ1BVIHdhcyBpZGxlIHdpdGggZHluYW1pYyB0aWNrcyBhY3RpdmUsIHRoaXMgdXBkYXRlcyB0aGUKKyAqIHJkdHAtPmR5bnRpY2tzIHRvIGxldCB0aGUgUkNVIGhhbmRsaW5nIGtub3cgdGhhdCB0aGUgQ1BVIGlzIGFjdGl2ZS4KKyAqLwordm9pZCByY3VfaXJxX2VudGVyKHZvaWQpCit7CisJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisKKwlpZiAocmR0cC0+ZHludGlja3NfbmVzdGluZysrKQorCQlyZXR1cm47CisJcmR0cC0+ZHludGlja3MrKzsKKwlXQVJOX09OX1JBVEVMSU1JVCghKHJkdHAtPmR5bnRpY2tzICYgMHgxKSwgJnJjdV9ycyk7CisJc21wX21iKCk7IC8qIENQVXMgc2VlaW5nICsrIG11c3Qgc2VlIGxhdGVyIFJDVSByZWFkLXNpZGUgY3JpdCBzZWN0cyAqLworfQorCisvKioKKyAqIHJjdV9pcnFfZXhpdCAtIGluZm9ybSBSQ1Ugb2YgZXhpdCBmcm9tIGhhcmQgaXJxIGNvbnRleHQKKyAqCisgKiBJZiB0aGUgQ1BVIHdhcyBpZGxlIHdpdGggZHluYW1pYyB0aWNrcyBhY3RpdmUsIHVwZGF0ZSB0aGUgcmRwLT5keW50aWNrcworICogdG8gcHV0IGxldCB0aGUgUkNVIGhhbmRsaW5nIGJlIGF3YXJlIHRoYXQgdGhlIENQVSBpcyBnb2luZyBiYWNrIHRvIGlkbGUKKyAqIHdpdGggbm8gdGlja3MuCisgKi8KK3ZvaWQgcmN1X2lycV9leGl0KHZvaWQpCit7CisJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisKKwlpZiAoLS1yZHRwLT5keW50aWNrc19uZXN0aW5nKQorCQlyZXR1cm47CisJc21wX21iKCk7IC8qIENQVXMgc2VlaW5nICsrIG11c3Qgc2VlIHByaW9yIFJDVSByZWFkLXNpZGUgY3JpdCBzZWN0cyAqLworCXJkdHAtPmR5bnRpY2tzKys7CisJV0FSTl9PTl9SQVRFTElNSVQocmR0cC0+ZHludGlja3MgJiAweDEsICZyY3VfcnMpOworCisJLyogSWYgdGhlIGludGVycnVwdCBxdWV1ZWQgYSBjYWxsYmFjaywgZ2V0IG91dCBvZiBkeW50aWNrIG1vZGUuICovCisJaWYgKF9fZ2V0X2NwdV92YXIocmN1X2RhdGEpLm54dGxpc3QgfHwKKwkgICAgX19nZXRfY3B1X3ZhcihyY3VfYmhfZGF0YSkubnh0bGlzdCkKKwkJc2V0X25lZWRfcmVzY2hlZCgpOworfQorCisvKgorICogUmVjb3JkIHRoZSBzcGVjaWZpZWQgImNvbXBsZXRlZCIgdmFsdWUsIHdoaWNoIGlzIGxhdGVyIHVzZWQgdG8gdmFsaWRhdGUKKyAqIGR5bnRpY2tzIGNvdW50ZXIgbWFuaXB1bGF0aW9ucy4gIFNwZWNpZnkgInJzcC0+Y29tcGxldGVkIC0gMSIgdG8KKyAqIHVuY29uZGl0aW9uYWxseSBpbnZhbGlkYXRlIGFueSBmdXR1cmUgZHludGlja3MgbWFuaXB1bGF0aW9ucyAod2hpY2ggaXMKKyAqIHVzZWZ1bCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZ3JhY2UgcGVyaW9kKS4KKyAqLworc3RhdGljIHZvaWQgZHludGlja19yZWNvcmRfY29tcGxldGVkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgbG9uZyBjb21wKQoreworCXJzcC0+ZHludGlja3NfY29tcGxldGVkID0gY29tcDsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKworLyoKKyAqIFJlY2FsbCB0aGUgcHJldmlvdXNseSByZWNvcmRlZCB2YWx1ZSBvZiB0aGUgY29tcGxldGlvbiBmb3IgZHludGlja3MuCisgKi8KK3N0YXRpYyBsb25nIGR5bnRpY2tfcmVjYWxsX2NvbXBsZXRlZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJcmV0dXJuIHJzcC0+ZHludGlja3NfY29tcGxldGVkOworfQorCisvKgorICogU25hcHNob3QgdGhlIHNwZWNpZmllZCBDUFUncyBkeW50aWNrcyBjb3VudGVyIHNvIHRoYXQgd2UgY2FuIGxhdGVyCisgKiBjcmVkaXQgdGhlbSB3aXRoIGFuIGltcGxpY2l0IHF1aWVzY2VudCBzdGF0ZS4gIFJldHVybiAxIGlmIHRoaXMgQ1BVCisgKiBpcyBhbHJlYWR5IGluIGEgcXVpZXNjZW50IHN0YXRlIGNvdXJ0ZXN5IG9mIGR5bnRpY2tzIGlkbGUgbW9kZS4KKyAqLworc3RhdGljIGludCBkeW50aWNrX3NhdmVfcHJvZ3Jlc3NfY291bnRlcihzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwlpbnQgcmV0OworCWludCBzbmFwOworCWludCBzbmFwX25taTsKKworCXNuYXAgPSByZHAtPmR5bnRpY2tzLT5keW50aWNrczsKKwlzbmFwX25taSA9IHJkcC0+ZHludGlja3MtPmR5bnRpY2tzX25taTsKKwlzbXBfbWIoKTsJLyogT3JkZXIgc2FtcGxpbmcgb2Ygc25hcCB3aXRoIGVuZCBvZiBncmFjZSBwZXJpb2QuICovCisJcmRwLT5keW50aWNrc19zbmFwID0gc25hcDsKKwlyZHAtPmR5bnRpY2tzX25taV9zbmFwID0gc25hcF9ubWk7CisJcmV0ID0gKChzbmFwICYgMHgxKSA9PSAwKSAmJiAoKHNuYXBfbm1pICYgMHgxKSA9PSAwKTsKKwlpZiAocmV0KQorCQlyZHAtPmR5bnRpY2tzX2ZxcysrOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIENQVSBoYXMgcGFzc2VkIHRocm91Z2ggYSBxdWllc2NlbnQKKyAqIHN0YXRlIGJ5IHZpcnR1ZSBvZiBiZWluZyBpbiBvciBoYXZpbmcgcGFzc2VkIHRocm91Z2ggYW4gZHludGlja3MKKyAqIGlkbGUgc3RhdGUgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBkeW50aWNrX3NhdmVfcHJvZ3Jlc3NfY291bnRlcigpCisgKiBmb3IgdGhpcyBzYW1lIENQVS4KKyAqLworc3RhdGljIGludCByY3VfaW1wbGljaXRfZHludGlja3NfcXMoc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJbG9uZyBjdXJyOworCWxvbmcgY3Vycl9ubWk7CisJbG9uZyBzbmFwOworCWxvbmcgc25hcF9ubWk7CisKKwljdXJyID0gcmRwLT5keW50aWNrcy0+ZHludGlja3M7CisJc25hcCA9IHJkcC0+ZHludGlja3Nfc25hcDsKKwljdXJyX25taSA9IHJkcC0+ZHludGlja3MtPmR5bnRpY2tzX25taTsKKwlzbmFwX25taSA9IHJkcC0+ZHludGlja3Nfbm1pX3NuYXA7CisJc21wX21iKCk7IC8qIGZvcmNlIG9yZGVyaW5nIHdpdGggY3B1IGVudGVyaW5nL2xlYXZpbmcgZHludGlja3MuICovCisKKwkvKgorCSAqIElmIHRoZSBDUFUgcGFzc2VkIHRocm91Z2ggb3IgZW50ZXJlZCBhIGR5bnRpY2tzIGlkbGUgcGhhc2Ugd2l0aAorCSAqIG5vIGFjdGl2ZSBpcnEvTk1JIGhhbmRsZXJzLCB0aGVuIHdlIGNhbiBzYWZlbHkgcHJldGVuZCB0aGF0IHRoZSBDUFUKKwkgKiBhbHJlYWR5IGFja25vd2xlZGdlZCB0aGUgcmVxdWVzdCB0byBwYXNzIHRocm91Z2ggYSBxdWllc2NlbnQKKwkgKiBzdGF0ZS4gIEVpdGhlciB3YXksIHRoYXQgQ1BVIGNhbm5vdCBwb3NzaWJseSBiZSBpbiBhbiBSQ1UKKwkgKiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiB0aGF0IHN0YXJ0ZWQgYmVmb3JlIHRoZSBiZWdpbm5pbmcKKwkgKiBvZiB0aGUgY3VycmVudCBSQ1UgZ3JhY2UgcGVyaW9kLgorCSAqLworCWlmICgoY3VyciAhPSBzbmFwIHx8IChjdXJyICYgMHgxKSA9PSAwKSAmJgorCSAgICAoY3Vycl9ubWkgIT0gc25hcF9ubWkgfHwgKGN1cnJfbm1pICYgMHgxKSA9PSAwKSkgeworCQlyZHAtPmR5bnRpY2tzX2ZxcysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBHbyBjaGVjayBmb3IgdGhlIENQVSBiZWluZyBvZmZsaW5lLiAqLworCXJldHVybiByY3VfaW1wbGljaXRfb2ZmbGluZV9xcyhyZHApOworfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19TTVAgKi8KKworI2Vsc2UgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworCitzdGF0aWMgdm9pZCBkeW50aWNrX3JlY29yZF9jb21wbGV0ZWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBsb25nIGNvbXApCit7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisKKy8qCisgKiBJZiB0aGVyZSBhcmUgbm8gZHludGlja3MsIHRoZW4gdGhlIG9ubHkgd2F5IHRoYXQgYSBDUFUgY2FuIHBhc3NpdmVseQorICogYmUgaW4gYSBxdWllc2NlbnQgc3RhdGUgaXMgdG8gYmUgb2ZmbGluZS4gIFVubGlrZSBkeW50aWNrcyBpZGxlLCB3aGljaAorICogaXMgYSBwb2ludCBpbiB0aW1lIGR1cmluZyB0aGUgcHJpb3IgKGFscmVhZHkgZmluaXNoZWQpIGdyYWNlIHBlcmlvZCwKKyAqIGFuIG9mZmxpbmUgQ1BVIGlzIGFsd2F5cyBpbiBhIHF1aWVzY2VudCBzdGF0ZSwgYW5kIHRodXMgY2FuIGJlCisgKiB1bmNvbmRpdGlvbmFsbHkgYXBwbGllZC4gIFNvIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIGxvbmcgZHludGlja19yZWNhbGxfY29tcGxldGVkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlyZXR1cm4gcnNwLT5jb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgZHludGlja19zYXZlX3Byb2dyZXNzX2NvdW50ZXIoc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmN1X2ltcGxpY2l0X2R5bnRpY2tzX3FzKHN0cnVjdCByY3VfZGF0YSAqcmRwKQoreworCXJldHVybiByY3VfaW1wbGljaXRfb2ZmbGluZV9xcyhyZHApOworfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19TTVAgKi8KKworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfTk9fSFogKi8KKworI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCisKK3N0YXRpYyB2b2lkIHJlY29yZF9ncF9zdGFsbF9jaGVja190aW1lKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlyc3AtPmdwX3N0YXJ0ID0gamlmZmllczsKKwlyc3AtPmppZmZpZXNfc3RhbGwgPSBqaWZmaWVzICsgUkNVX1NFQ09ORFNfVElMTF9TVEFMTF9DSEVDSzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfb3RoZXJfY3B1X3N0YWxsKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlpbnQgY3B1OworCWxvbmcgZGVsdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wX2N1ciA9IHJzcC0+bGV2ZWxbTlVNX1JDVV9MVkxTIC0gMV07CisJc3RydWN0IHJjdV9ub2RlICpybnBfZW5kID0gJnJzcC0+bm9kZVtOVU1fUkNVX05PREVTXTsKKworCS8qIE9ubHkgbGV0IG9uZSBDUFUgY29tcGxhaW4gYWJvdXQgb3RoZXJzIHBlciB0aW1lIGludGVydmFsLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOworCWRlbHRhID0gamlmZmllcyAtIHJzcC0+amlmZmllc19zdGFsbDsKKwlpZiAoZGVsdGEgPCBSQ1VfU1RBTExfUkFUX0RFTEFZIHx8IHJzcC0+Z3BudW0gPT0gcnNwLT5jb21wbGV0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJcnNwLT5qaWZmaWVzX3N0YWxsID0gamlmZmllcyArIFJDVV9TRUNPTkRTX1RJTExfU1RBTExfUkVDSEVDSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKworCS8qIE9LLCB0aW1lIHRvIHJhdCBvbiBvdXIgYnVkZHkuLi4gKi8KKworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogUkNVIGRldGVjdGVkIENQVSBzdGFsbHM6Iik7CisJZm9yICg7IHJucF9jdXIgPCBybnBfZW5kOyBybnBfY3VyKyspIHsKKwkJaWYgKHJucF9jdXItPnFzbWFzayA9PSAwKQorCQkJY29udGludWU7CisJCWZvciAoY3B1ID0gMDsgY3B1IDw9IHJucF9jdXItPmdycGhpIC0gcm5wX2N1ci0+Z3JwbG87IGNwdSsrKQorCQkJaWYgKHJucF9jdXItPnFzbWFzayAmICgxVUwgPDwgY3B1KSkKKwkJCQlwcmludGsoIiAlZCIsIHJucF9jdXItPmdycGxvICsgY3B1KTsKKwl9CisJcHJpbnRrKCIgKGRldGVjdGVkIGJ5ICVkLCB0PSVsZCBqaWZmaWVzKVxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCAobG9uZykoamlmZmllcyAtIHJzcC0+Z3Bfc3RhcnQpKTsKKwlmb3JjZV9xdWllc2NlbnRfc3RhdGUocnNwLCAwKTsgIC8qIEtpY2sgdGhlbSBhbGwuICovCit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NwdV9zdGFsbChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiBSQ1UgZGV0ZWN0ZWQgQ1BVICVkIHN0YWxsICh0PSVsdSBqaWZmaWVzKVxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcyAtIHJzcC0+Z3Bfc3RhcnQpOworCWR1bXBfc3RhY2soKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJaWYgKChsb25nKShqaWZmaWVzIC0gcnNwLT5qaWZmaWVzX3N0YWxsKSA+PSAwKQorCQlyc3AtPmppZmZpZXNfc3RhbGwgPQorCQkJamlmZmllcyArIFJDVV9TRUNPTkRTX1RJTExfU1RBTExfUkVDSEVDSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwlzZXRfbmVlZF9yZXNjaGVkKCk7ICAvKiBraWNrIG91cnNlbHZlcyB0byBnZXQgdGhpbmdzIGdvaW5nLiAqLworfQorCitzdGF0aWMgdm9pZCBjaGVja19jcHVfc3RhbGwoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwlsb25nIGRlbHRhOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCisJZGVsdGEgPSBqaWZmaWVzIC0gcnNwLT5qaWZmaWVzX3N0YWxsOworCXJucCA9IHJkcC0+bXlub2RlOworCWlmICgocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spICYmIGRlbHRhID49IDApIHsKKworCQkvKiBXZSBoYXZlbid0IGNoZWNrZWQgaW4sIHNvIGdvIGR1bXAgc3RhY2suICovCisJCXByaW50X2NwdV9zdGFsbChyc3ApOworCisJfSBlbHNlIGlmIChyc3AtPmdwbnVtICE9IHJzcC0+Y29tcGxldGVkICYmCisJCSAgIGRlbHRhID49IFJDVV9TVEFMTF9SQVRfREVMQVkpIHsKKworCQkvKiBUaGV5IGhhZCB0d28gdGltZSB1bml0cyB0byBkdW1wIHN0YWNrLCBzbyBjb21wbGFpbi4gKi8KKwkJcHJpbnRfb3RoZXJfY3B1X3N0YWxsKHJzcCk7CisJfQorfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KKworc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQoreworfQorCitzdGF0aWMgdm9pZCBjaGVja19jcHVfc3RhbGwoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKK30KKworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLworCisvKgorICogVXBkYXRlIENQVS1sb2NhbCByY3VfZGF0YSBzdGF0ZSB0byByZWNvcmQgdGhlIG5ld2x5IG5vdGljZWQgZ3JhY2UgcGVyaW9kLgorICogVGhpcyBpcyB1c2VkIGJvdGggd2hlbiB3ZSBzdGFydGVkIHRoZSBncmFjZSBwZXJpb2QgYW5kIHdoZW4gd2Ugbm90aWNlCisgKiB0aGF0IHNvbWVvbmUgZWxzZSBzdGFydGVkIHRoZSBncmFjZSBwZXJpb2QuCisgKi8KK3N0YXRpYyB2b2lkIG5vdGVfbmV3X2dwbnVtKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJcmRwLT5xc19wZW5kaW5nID0gMTsKKwlyZHAtPnBhc3NlZF9xdWllc2MgPSAwOworCXJkcC0+Z3BudW0gPSByc3AtPmdwbnVtOworCXJkcC0+bl9yY3VfcGVuZGluZ19mb3JjZV9xcyA9IHJkcC0+bl9yY3VfcGVuZGluZyArCisJCQkJICAgICAgUkNVX0pJRkZJRVNfVElMTF9GT1JDRV9RUzsKK30KKworLyoKKyAqIERpZCBzb21lb25lIGVsc2Ugc3RhcnQgYSBuZXcgUkNVIGdyYWNlIHBlcmlvZCBzdGFydCBzaW5jZSB3ZSBsYXN0CisgKiBjaGVja2VkPyAgVXBkYXRlIGxvY2FsIHN0YXRlIGFwcHJvcHJpYXRlbHkgaWYgc28uICBNdXN0IGJlIGNhbGxlZAorICogb24gdGhlIENQVSBjb3JyZXNwb25kaW5nIHRvIHJkcC4KKyAqLworc3RhdGljIGludAorY2hlY2tfZm9yX25ld19ncmFjZV9wZXJpb2Qoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChyZHAtPmdwbnVtICE9IHJzcC0+Z3BudW0pIHsKKwkJbm90ZV9uZXdfZ3BudW0ocnNwLCByZHApOworCQlyZXQgPSAxOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFN0YXJ0IGEgbmV3IFJDVSBncmFjZSBwZXJpb2QgaWYgd2FycmFudGVkLCByZS1pbml0aWFsaXppbmcgdGhlIGhpZXJhcmNoeQorICogaW4gcHJlcGFyYXRpb24gZm9yIGRldGVjdGluZyB0aGUgbmV4dCBncmFjZSBwZXJpb2QuICBUaGUgY2FsbGVyIG11c3QgaG9sZAorICogdGhlIHJvb3Qgbm9kZSdzIC0+bG9jaywgd2hpY2ggaXMgcmVsZWFzZWQgYmVmb3JlIHJldHVybi4gIEhhcmQgaXJxcyBtdXN0CisgKiBiZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQKK3JjdV9zdGFydF9ncChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJX19yZWxlYXNlcyhyY3VfZ2V0X3Jvb3QocnNwKS0+bG9jaykKK3sKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHJzcC0+cmRhW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucF9jdXI7CisJc3RydWN0IHJjdV9ub2RlICpybnBfZW5kOworCisJaWYgKCFjcHVfbmVlZHNfYW5vdGhlcl9ncChyc3AsIHJkcCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBZHZhbmNlIHRvIGEgbmV3IGdyYWNlIHBlcmlvZCBhbmQgaW5pdGlhbGl6ZSBzdGF0ZS4gKi8KKwlyc3AtPmdwbnVtKys7CisJcnNwLT5zaWduYWxlZCA9IFJDVV9HUF9JTklUOyAvKiBIb2xkIG9mZiBmb3JjZV9xdWllc2NlbnRfc3RhdGUuICovCisJcnNwLT5qaWZmaWVzX2ZvcmNlX3FzID0gamlmZmllcyArIFJDVV9KSUZGSUVTX1RJTExfRk9SQ0VfUVM7CisJcmRwLT5uX3JjdV9wZW5kaW5nX2ZvcmNlX3FzID0gcmRwLT5uX3JjdV9wZW5kaW5nICsKKwkJCQkgICAgICBSQ1VfSklGRklFU19USUxMX0ZPUkNFX1FTOworCXJlY29yZF9ncF9zdGFsbF9jaGVja190aW1lKHJzcCk7CisJZHludGlja19yZWNvcmRfY29tcGxldGVkKHJzcCwgcnNwLT5jb21wbGV0ZWQgLSAxKTsKKwlub3RlX25ld19ncG51bShyc3AsIHJkcCk7CisKKwkvKgorCSAqIEJlY2F1c2Ugd2UgYXJlIGZpcnN0LCB3ZSBrbm93IHRoYXQgYWxsIG91ciBjYWxsYmFja3Mgd2lsbAorCSAqIGJlIGNvdmVyZWQgYnkgdGhpcyB1cGNvbWluZyBncmFjZSBwZXJpb2QsIGV2ZW4gdGhlIG9uZXMKKwkgKiB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBhcmJpdHJhcmlseSByZWNlbnRseS4KKwkgKi8KKwlyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gPSByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF07CisJcmRwLT5ueHR0YWlsW1JDVV9XQUlUX1RBSUxdID0gcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdOworCisJLyogU3BlY2lhbC1jYXNlIHRoZSBjb21tb24gc2luZ2xlLWxldmVsIGNhc2UuICovCisJaWYgKE5VTV9SQ1VfTk9ERVMgPT0gMSkgeworCQlybnAtPnFzbWFzayA9IHJucC0+cXNtYXNraW5pdDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX3VubG9jaygmcm5wLT5sb2NrKTsgIC8qIGxlYXZlIGlycXMgZGlzYWJsZWQuICovCisKKworCS8qIEV4Y2x1ZGUgYW55IGNvbmN1cnJlbnQgQ1BVLWhvdHBsdWcgb3BlcmF0aW9ucy4gKi8KKwlzcGluX2xvY2soJnJzcC0+b25vZmZsb2NrKTsgIC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KKworCS8qCisJICogU2V0IHRoZSBxdWllc2NlbnQtc3RhdGUtbmVlZGVkIGJpdHMgaW4gYWxsIHRoZSBub24tbGVhZiBSQ1UKKwkgKiBub2RlcyBmb3IgYWxsIGN1cnJlbnRseSBvbmxpbmUgQ1BVcy4gIFRoaXMgb3BlcmF0aW9uIHJlbGllcworCSAqIG9uIHRoZSBsYXlvdXQgb2YgdGhlIGhpZXJhcmNoeSB3aXRoaW4gdGhlIHJzcC0+bm9kZVtdIGFycmF5LgorCSAqIE5vdGUgdGhhdCBvdGhlciBDUFVzIHdpbGwgYWNjZXNzIG9ubHkgdGhlIGxlYXZlcyBvZiB0aGUKKwkgKiBoaWVyYXJjaHksIHdoaWNoIHN0aWxsIGluZGljYXRlIHRoYXQgbm8gZ3JhY2UgcGVyaW9kIGlzIGluCisJICogcHJvZ3Jlc3MuICBJbiBhZGRpdGlvbiwgd2UgaGF2ZSBleGNsdWRlZCBDUFUtaG90cGx1ZyBvcGVyYXRpb25zLgorCSAqCisJICogV2UgdGhlcmVmb3JlIGRvIG5vdCBuZWVkIHRvIGhvbGQgYW55IGxvY2tzLiAgQW55IHJlcXVpcmVkCisJICogbWVtb3J5IGJhcnJpZXJzIHdpbGwgYmUgc3VwcGxpZWQgYnkgdGhlIGxvY2tzIGd1YXJkaW5nIHRoZQorCSAqIGxlYWYgcmN1X25vZGVzIGluIHRoZSBoaWVyYXJjaHkuCisJICovCisKKwlybnBfZW5kID0gcnNwLT5sZXZlbFtOVU1fUkNVX0xWTFMgLSAxXTsKKwlmb3IgKHJucF9jdXIgPSAmcnNwLT5ub2RlWzBdOyBybnBfY3VyIDwgcm5wX2VuZDsgcm5wX2N1cisrKQorCQlybnBfY3VyLT5xc21hc2sgPSBybnBfY3VyLT5xc21hc2tpbml0OworCisJLyoKKwkgKiBOb3cgc2V0IHVwIHRoZSBsZWFmIG5vZGVzLiAgSGVyZSB3ZSBtdXN0IGJlIGNhcmVmdWwuICBGaXJzdCwKKwkgKiB3ZSBuZWVkIHRvIGhvbGQgdGhlIGxvY2sgaW4gb3JkZXIgdG8gZXhjbHVkZSBvdGhlciBDUFVzLCB3aGljaAorCSAqIG1pZ2h0IGJlIGNvbnRlbmRpbmcgZm9yIHRoZSBsZWFmIG5vZGVzJyBsb2Nrcy4gIFNlY29uZCwgYXMKKwkgKiBzb29uIGFzIHdlIGluaXRpYWxpemUgYSBnaXZlbiBsZWFmIG5vZGUsIGl0cyBDUFVzIG1pZ2h0IHJ1bgorCSAqIHVwIHRoZSByZXN0IG9mIHRoZSBoaWVyYXJjaHkuICBXZSBtdXN0IHRoZXJlZm9yZSBhY3F1aXJlIGxvY2tzCisJICogZm9yIGVhY2ggbm9kZSB0aGF0IHdlIHRvdWNoIGR1cmluZyB0aGlzIHN0YWdlLiAgKEJ1dCB3ZSBzdGlsbAorCSAqIGFyZSBleGNsdWRpbmcgQ1BVLWhvdHBsdWcgb3BlcmF0aW9ucy4pCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBjYW5ub3QgY29tcGxldGUgdW50aWwgd2UgZmluaXNoCisJICogdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MsIGFzIHRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgb25lCisJICogcXNtYXNrIGJpdCBzZXQgaW4gdGhlIHJvb3Qgbm9kZSB1bnRpbCB0aGF0IHRpbWUsIG5hbWVseSB0aGUKKwkgKiBvbmUgY29ycmVzcG9uZGluZyB0byB0aGlzIENQVS4KKwkgKi8KKwlybnBfZW5kID0gJnJzcC0+bm9kZVtOVU1fUkNVX05PREVTXTsKKwlybnBfY3VyID0gcnNwLT5sZXZlbFtOVU1fUkNVX0xWTFMgLSAxXTsKKwlmb3IgKDsgcm5wX2N1ciA8IHJucF9lbmQ7IHJucF9jdXIrKykgeworCQlzcGluX2xvY2soJnJucF9jdXItPmxvY2spOwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCisJCXJucF9jdXItPnFzbWFzayA9IHJucF9jdXItPnFzbWFza2luaXQ7CisJCXNwaW5fdW5sb2NrKCZybnBfY3VyLT5sb2NrKTsJLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLworCX0KKworCXJzcC0+c2lnbmFsZWQgPSBSQ1VfU0lHTkFMX0lOSVQ7IC8qIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSBub3cgT0suICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwLT5vbm9mZmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEFkdmFuY2UgdGhpcyBDUFUncyBjYWxsYmFja3MsIGJ1dCBvbmx5IGlmIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZAorICogaGFzIGVuZGVkLiAgVGhpcyBtYXkgYmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgQ1BVIHRvIHdob20gdGhlIHJkcAorICogYmVsb25ncy4KKyAqLworc3RhdGljIHZvaWQKK3JjdV9wcm9jZXNzX2dwX2VuZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKQoreworCWxvbmcgY29tcGxldGVkX3NuYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljb21wbGV0ZWRfc25hcCA9IEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKTsgIC8qIG91dHNpZGUgb2YgbG9jay4gKi8KKworCS8qIERpZCBhbm90aGVyIGdyYWNlIHBlcmlvZCBlbmQ/ICovCisJaWYgKHJkcC0+Y29tcGxldGVkICE9IGNvbXBsZXRlZF9zbmFwKSB7CisKKwkJLyogQWR2YW5jZSBjYWxsYmFja3MuICBObyBoYXJtIGlmIGxpc3QgZW1wdHkuICovCisJCXJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSA9IHJkcC0+bnh0dGFpbFtSQ1VfV0FJVF9UQUlMXTsKKwkJcmRwLT5ueHR0YWlsW1JDVV9XQUlUX1RBSUxdID0gcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1JFQURZX1RBSUxdOworCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gPSByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF07CisKKwkJLyogUmVtZW1iZXIgdGhhdCB3ZSBzYXcgdGhpcyBncmFjZS1wZXJpb2QgY29tcGxldGlvbi4gKi8KKwkJcmRwLT5jb21wbGV0ZWQgPSBjb21wbGV0ZWRfc25hcDsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogU2ltaWxhciB0byBjcHVfcXVpZXQoKSwgZm9yIHdoaWNoIGl0IGlzIGEgaGVscGVyIGZ1bmN0aW9uLiAgQWxsb3dzCisgKiBhIGdyb3VwIG9mIENQVXMgdG8gYmUgcXVpZXRlZCBhdCBvbmUgZ28sIHRob3VnaCBhbGwgdGhlIENQVXMgaW4gdGhlCisgKiBncm91cCBtdXN0IGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIGxlYWYgcmN1X25vZGUgc3RydWN0dXJlLgorICogVGhhdCBzdHJ1Y3R1cmUncyBsb2NrIG11c3QgYmUgaGVsZCB1cG9uIGVudHJ5LCBhbmQgaXQgaXMgcmVsZWFzZWQKKyAqIGJlZm9yZSByZXR1cm4uCisgKi8KK3N0YXRpYyB2b2lkCitjcHVfcXVpZXRfbXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKKwkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQorCV9fcmVsZWFzZXMocm5wLT5sb2NrKQoreworCS8qIFdhbGsgdXAgdGhlIHJjdV9ub2RlIGhpZXJhcmNoeS4gKi8KKwlmb3IgKDs7KSB7CisJCWlmICghKHJucC0+cXNtYXNrICYgbWFzaykpIHsKKworCQkJLyogT3VyIGJpdCBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQsIHNvIGRvbmUuICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlybnAtPnFzbWFzayAmPSB+bWFzazsKKwkJaWYgKHJucC0+cXNtYXNrICE9IDApIHsKKworCQkJLyogT3RoZXIgYml0cyBzdGlsbCBzZXQgYXQgdGhpcyBsZXZlbCwgc28gZG9uZS4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCW1hc2sgPSBybnAtPmdycG1hc2s7CisJCWlmIChybnAtPnBhcmVudCA9PSBOVUxMKSB7CisKKwkJCS8qIE5vIG1vcmUgbGV2ZWxzLiAgRXhpdCBsb29wIGhvbGRpbmcgcm9vdCBsb2NrLiAqLworCisJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcm5wID0gcm5wLT5wYXJlbnQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwkvKgorCSAqIEdldCBoZXJlIGlmIHdlIGFyZSB0aGUgbGFzdCBDUFUgdG8gcGFzcyB0aHJvdWdoIGEgcXVpZXNjZW50CisJICogc3RhdGUgZm9yIHRoaXMgZ3JhY2UgcGVyaW9kLiAgQ2xlYW4gdXAgYW5kIGxldCByY3Vfc3RhcnRfZ3AoKQorCSAqIHN0YXJ0IHVwIHRoZSBuZXh0IGdyYWNlIHBlcmlvZCBpZiBvbmUgaXMgbmVlZGVkLiAgTm90ZSB0aGF0CisJICogd2Ugc3RpbGwgaG9sZCBybnAtPmxvY2ssIGFzIHJlcXVpcmVkIGJ5IHJjdV9zdGFydF9ncCgpLCB3aGljaAorCSAqIHdpbGwgcmVsZWFzZSBpdC4KKwkgKi8KKwlyc3AtPmNvbXBsZXRlZCA9IHJzcC0+Z3BudW07CisJcmN1X3Byb2Nlc3NfZ3BfZW5kKHJzcCwgcnNwLT5yZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CisJcmN1X3N0YXJ0X2dwKHJzcCwgZmxhZ3MpOyAgLyogcmVsZWFzZXMgcm5wLT5sb2NrLiAqLworfQorCisvKgorICogUmVjb3JkIGEgcXVpZXNjZW50IHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIENQVSwgd2hpY2ggbXVzdCBlaXRoZXIgYmUKKyAqIHRoZSBjdXJyZW50IENQVSBvciBhbiBvZmZsaW5lIENQVS4gIFRoZSBsYXN0Y29tcCBhcmd1bWVudCBpcyB1c2VkIHRvCisgKiBtYWtlIHN1cmUgd2UgYXJlIHN0aWxsIGluIHRoZSBncmFjZSBwZXJpb2Qgb2YgaW50ZXJlc3QuICBXZSBkb24ndCB3YW50CisgKiB0byBlbmQgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kIGJhc2VkIG9uIHF1aWVzY2VudCBzdGF0ZXMgZGV0ZWN0ZWQgaW4KKyAqIGFuIGVhcmxpZXIgZ3JhY2UgcGVyaW9kIQorICovCitzdGF0aWMgdm9pZAorY3B1X3F1aWV0KGludCBjcHUsIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHAsIGxvbmcgbGFzdGNvbXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisKKwlybnAgPSByZHAtPm15bm9kZTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJaWYgKGxhc3Rjb21wICE9IEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSkgeworCisJCS8qCisJCSAqIFNvbWVvbmUgYmVhdCB1cyB0byBpdCBmb3IgdGhpcyBncmFjZSBwZXJpb2QsIHNvIGxlYXZlLgorCQkgKiBUaGUgcmFjZSB3aXRoIEdQIHN0YXJ0IGlzIHJlc29sdmVkIGJ5IHRoZSBmYWN0IHRoYXQgd2UKKwkJICogaG9sZCB0aGUgbGVhZiByY3Vfbm9kZSBsb2NrLCBzbyB0aGF0IHRoZSBwZXItQ1BVIGJpdHMKKwkJICogY2Fubm90IHlldCBiZSBpbml0aWFsaXplZCAtLSBzbyB3ZSB3b3VsZCBzaW1wbHkgZmluZCBvdXIKKwkJICogQ1BVJ3MgYml0IGFscmVhZHkgY2xlYXJlZCBpbiBjcHVfcXVpZXRfbXNrKCkgaWYgdGhpcyByYWNlCisJCSAqIG9jY3VycmVkLgorCQkgKi8KKwkJcmRwLT5wYXNzZWRfcXVpZXNjID0gMDsJLyogdHJ5IGFnYWluIGxhdGVyISAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwltYXNrID0gcmRwLT5ncnBtYXNrOworCWlmICgocm5wLT5xc21hc2sgJiBtYXNrKSA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXJkcC0+cXNfcGVuZGluZyA9IDA7CisKKwkJLyoKKwkJICogVGhpcyBHUCBjYW4ndCBlbmQgdW50aWwgY3B1IGNoZWNrcyBpbiwgc28gYWxsIG9mIG91cgorCQkgKiBjYWxsYmFja3MgY2FuIGJlIHByb2Nlc3NlZCBkdXJpbmcgdGhlIG5leHQgR1AuCisJCSAqLworCQlyZHAgPSByc3AtPnJkYVtzbXBfcHJvY2Vzc29yX2lkKCldOworCQlyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gPSByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF07CisKKwkJY3B1X3F1aWV0X21zayhtYXNrLCByc3AsIHJucCwgZmxhZ3MpOyAvKiByZWxlYXNlcyBybnAtPmxvY2sgKi8KKwl9Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBuZXcgZ3JhY2UgcGVyaW9kIG9mIHdoaWNoIHRoaXMgQ1BVCisgKiBpcyBub3QgeWV0IGF3YXJlLCBhbmQgaWYgc28sIHNldCB1cCBsb2NhbCByY3VfZGF0YSBzdGF0ZSBmb3IgaXQuCisgKiBPdGhlcndpc2UsIHNlZSBpZiB0aGlzIENQVSBoYXMganVzdCBwYXNzZWQgdGhyb3VnaCBpdHMgZmlyc3QKKyAqIHF1aWVzY2VudCBzdGF0ZSBmb3IgdGhpcyBncmFjZSBwZXJpb2QsIGFuZCByZWNvcmQgdGhhdCBmYWN0IGlmIHNvLgorICovCitzdGF0aWMgdm9pZAorcmN1X2NoZWNrX3F1aWVzY2VudF9zdGF0ZShzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKQoreworCS8qIElmIHRoZXJlIGlzIG5vdyBhIG5ldyBncmFjZSBwZXJpb2QsIHJlY29yZCBhbmQgcmV0dXJuLiAqLworCWlmIChjaGVja19mb3JfbmV3X2dyYWNlX3BlcmlvZChyc3AsIHJkcCkpCisJCXJldHVybjsKKworCS8qCisJICogRG9lcyB0aGlzIENQVSBzdGlsbCBuZWVkIHRvIGRvIGl0cyBwYXJ0IGZvciBjdXJyZW50IGdyYWNlIHBlcmlvZD8KKwkgKiBJZiBubywgcmV0dXJuIGFuZCBsZXQgdGhlIG90aGVyIENQVXMgZG8gdGhlaXIgcGFydCBhcyB3ZWxsLgorCSAqLworCWlmICghcmRwLT5xc19wZW5kaW5nKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdhcyB0aGVyZSBhIHF1aWVzY2VudCBzdGF0ZSBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmFjZQorCSAqIHBlcmlvZD8gSWYgbm8sIHRoZW4gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIG5leHQgY2FsbC4KKwkgKi8KKwlpZiAoIXJkcC0+cGFzc2VkX3F1aWVzYykKKwkJcmV0dXJuOworCisJLyogVGVsbCBSQ1Ugd2UgYXJlIGRvbmUgKGJ1dCBjcHVfcXVpZXQoKSB3aWxsIGJlIHRoZSBqdWRnZSBvZiB0aGF0KS4gKi8KKwljcHVfcXVpZXQocmRwLT5jcHUsIHJzcCwgcmRwLCByZHAtPnBhc3NlZF9xdWllc2NfY29tcGxldGVkKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCisvKgorICogUmVtb3ZlIHRoZSBvdXRnb2luZyBDUFUgZnJvbSB0aGUgYml0bWFza3MgaW4gdGhlIHJjdV9ub2RlIGhpZXJhcmNoeQorICogYW5kIG1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBvdXRnb2luZyBDUFUgdG8gdGhlIGN1cnJlbnQgb25lLgorICovCitzdGF0aWMgdm9pZCBfX3JjdV9vZmZsaW5lX2NwdShpbnQgY3B1LCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGxhc3Rjb21wOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHJzcC0+cmRhW2NwdV07CisJc3RydWN0IHJjdV9kYXRhICpyZHBfbWU7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisKKwkvKiBFeGNsdWRlIGFueSBhdHRlbXB0cyB0byBzdGFydCBhIG5ldyBncmFjZSBwZXJpb2QuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzcC0+b25vZmZsb2NrLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgdGhlIG91dGdvaW5nIENQVSBmcm9tIHRoZSBtYXNrcyBpbiB0aGUgcmN1X25vZGUgaGllcmFyY2h5LiAqLworCXJucCA9IHJkcC0+bXlub2RlOworCW1hc2sgPSByZHAtPmdycG1hc2s7CS8qIHJucC0+Z3JwbG8gaXMgY29uc3RhbnQuICovCisJZG8geworCQlzcGluX2xvY2soJnJucC0+bG9jayk7CQkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCisJCXJucC0+cXNtYXNraW5pdCAmPSB+bWFzazsKKwkJaWYgKHJucC0+cXNtYXNraW5pdCAhPSAwKSB7CisJCQlzcGluX3VubG9jaygmcm5wLT5sb2NrKTsgLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLworCQkJYnJlYWs7CisJCX0KKwkJbWFzayA9IHJucC0+Z3JwbWFzazsKKwkJc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KKwkJcm5wID0gcm5wLT5wYXJlbnQ7CisJfSB3aGlsZSAocm5wICE9IE5VTEwpOworCWxhc3Rjb21wID0gcnNwLT5jb21wbGV0ZWQ7CisKKwlzcGluX3VubG9jaygmcnNwLT5vbm9mZmxvY2spOwkJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCisKKwkvKiBCZWluZyBvZmZsaW5lIGlzIGEgcXVpZXNjZW50IHN0YXRlLCBzbyBnbyByZWNvcmQgaXQuICovCisJY3B1X3F1aWV0KGNwdSwgcnNwLCByZHAsIGxhc3Rjb21wKTsKKworCS8qCisJICogTW92ZSBjYWxsYmFja3MgZnJvbSB0aGUgb3V0Z29pbmcgQ1BVIHRvIHRoZSBydW5uaW5nIENQVS4KKwkgKiBOb3RlIHRoYXQgdGhlIG91dGdvaW5nIENQVSBpcyBub3cgcXVpc2NlbnQsIHNvIGl0IGlzIG5vdworCSAqICh1bmNoYXJhY3RlcmlzdGljYWxseSkgc2FmZSB0byBhY2Nlc3MgaXQgcmN1X2RhdGEgc3RydWN0dXJlLgorCSAqIE5vdGUgYWxzbyB0aGF0IHdlIG11c3QgY2FyZWZ1bGx5IHJldGFpbiB0aGUgb3JkZXIgb2YgdGhlCisJICogb3V0Z29pbmcgQ1BVJ3MgY2FsbGJhY2tzIGluIG9yZGVyIGZvciByY3VfYmFycmllcigpIHRvIHdvcmsKKwkgKiBjb3JyZWN0bHkuICBGaW5hbGx5LCBub3RlIHRoYXQgd2Ugc3RhcnQgYWxsIHRoZSBjYWxsYmFja3MKKwkgKiBhZnJlc2gsIGV2ZW4gdGhvc2UgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIGEgZ3JhY2UgcGVyaW9kCisJICogYW5kIGFyZSB0aGVyZWZvcmUgcmVhZHkgdG8gaW52b2tlLiAgVGhlIHRoZW9yeSBpcyB0aGF0IGhvdHBsdWcKKwkgKiBldmVudHMgYXJlIHJhcmUsIGFuZCB0aGF0IGlmIHRoZXkgYXJlIGZyZXF1ZW50IGVub3VnaCB0bworCSAqIGluZGVmaW5pdGVseSBkZWxheSBjYWxsYmFja3MsIHlvdSBoYXZlIGZhciB3b3JzZSB0aGluZ3MgdG8KKwkgKiBiZSB3b3JyeWluZyBhYm91dC4KKwkgKi8KKwlyZHBfbWUgPSByc3AtPnJkYVtzbXBfcHJvY2Vzc29yX2lkKCldOworCWlmIChyZHAtPm54dGxpc3QgIT0gTlVMTCkgeworCQkqcmRwX21lLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdID0gcmRwLT5ueHRsaXN0OworCQlyZHBfbWUtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF07CisJCXJkcC0+bnh0bGlzdCA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPCBSQ1VfTkVYVF9TSVpFOyBpKyspCisJCQlyZHAtPm54dHRhaWxbaV0gPSAmcmRwLT5ueHRsaXN0OworCQlyZHBfbWUtPnFsZW4gKz0gcmRwLT5xbGVuOworCQlyZHAtPnFsZW4gPSAwOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBDUFUgZnJvbSB0aGUgUkNVIGhpZXJhcmNoeSBhbmQgbW92ZSBhbnkgcGVuZGluZworICogY2FsbGJhY2tzIHRoYXQgaXQgbWlnaHQgaGF2ZSB0byB0aGUgY3VycmVudCBDUFUuICBUaGlzIGNvZGUgYXNzdW1lcworICogdGhhdCBhdCBsZWFzdCBvbmUgQ1BVIGluIHRoZSBzeXN0ZW0gd2lsbCByZW1haW4gcnVubmluZyBhdCBhbGwgdGltZXMuCisgKiBBbnkgYXR0ZW1wdCB0byBvZmZsaW5lIC1hbGwtIENQVXMgaXMgbGlrZWx5IHRvIHN0cmFuZCBSQ1UgY2FsbGJhY2tzLgorICovCitzdGF0aWMgdm9pZCByY3Vfb2ZmbGluZV9jcHUoaW50IGNwdSkKK3sKKwlfX3JjdV9vZmZsaW5lX2NwdShjcHUsICZyY3Vfc3RhdGUpOworCV9fcmN1X29mZmxpbmVfY3B1KGNwdSwgJnJjdV9iaF9zdGF0ZSk7Cit9CisKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIHZvaWQgcmN1X29mZmxpbmVfY3B1KGludCBjcHUpCit7Cit9CisKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKKy8qCisgKiBJbnZva2UgYW55IFJDVSBjYWxsYmFja3MgdGhhdCBoYXZlIG1hZGUgaXQgdG8gdGhlIGVuZCBvZiB0aGVpciBncmFjZQorICogcGVyaW9kLiAgVGhvdHRsZSBhcyBzcGVjaWZpZWQgYnkgcmRwLT5ibGltaXQuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9kb19iYXRjaChzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByY3VfaGVhZCAqbmV4dCwgKmxpc3QsICoqdGFpbDsKKwlpbnQgY291bnQ7CisKKwkvKiBJZiBubyBjYWxsYmFja3MgYXJlIHJlYWR5LCBqdXN0IHJldHVybi4qLworCWlmICghY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCisJCXJldHVybjsKKworCS8qCisJICogRXh0cmFjdCB0aGUgbGlzdCBvZiByZWFkeSBjYWxsYmFja3MsIGRpc2FibGluZyB0byBwcmV2ZW50CisJICogcmFjZXMgd2l0aCBjYWxsX3JjdSgpIGZyb20gaW50ZXJydXB0IGhhbmRsZXJzLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsaXN0ID0gcmRwLT5ueHRsaXN0OworCXJkcC0+bnh0bGlzdCA9ICpyZHAtPm54dHRhaWxbUkNVX0RPTkVfVEFJTF07CisJKnJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSA9IE5VTEw7CisJdGFpbCA9IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXTsKKwlmb3IgKGNvdW50ID0gUkNVX05FWFRfU0laRSAtIDE7IGNvdW50ID49IDA7IGNvdW50LS0pCisJCWlmIChyZHAtPm54dHRhaWxbY291bnRdID09IHJkcC0+bnh0dGFpbFtSQ1VfRE9ORV9UQUlMXSkKKwkJCXJkcC0+bnh0dGFpbFtjb3VudF0gPSAmcmRwLT5ueHRsaXN0OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIEludm9rZSBjYWxsYmFja3MuICovCisJY291bnQgPSAwOworCXdoaWxlIChsaXN0KSB7CisJCW5leHQgPSBsaXN0LT5uZXh0OworCQlwcmVmZXRjaChuZXh0KTsKKwkJbGlzdC0+ZnVuYyhsaXN0KTsKKwkJbGlzdCA9IG5leHQ7CisJCWlmICgrK2NvdW50ID49IHJkcC0+YmxpbWl0KQorCQkJYnJlYWs7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogVXBkYXRlIGNvdW50LCBhbmQgcmVxdWV1ZSBhbnkgcmVtYWluaW5nIGNhbGxiYWNrcy4gKi8KKwlyZHAtPnFsZW4gLT0gY291bnQ7CisJaWYgKGxpc3QgIT0gTlVMTCkgeworCQkqdGFpbCA9IHJkcC0+bnh0bGlzdDsKKwkJcmRwLT5ueHRsaXN0ID0gbGlzdDsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgUkNVX05FWFRfU0laRTsgY291bnQrKykKKwkJCWlmICgmcmRwLT5ueHRsaXN0ID09IHJkcC0+bnh0dGFpbFtjb3VudF0pCisJCQkJcmRwLT5ueHR0YWlsW2NvdW50XSA9IHRhaWw7CisJCQllbHNlCisJCQkJYnJlYWs7CisJfQorCisJLyogUmVpbnN0YXRlIGJhdGNoIGxpbWl0IGlmIHdlIGhhdmUgd29ya2VkIGRvd24gdGhlIGV4Y2Vzcy4gKi8KKwlpZiAocmRwLT5ibGltaXQgPT0gTE9OR19NQVggJiYgcmRwLT5xbGVuIDw9IHFsb3dtYXJrKQorCQlyZHAtPmJsaW1pdCA9IGJsaW1pdDsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIFJlLXJhaXNlIHRoZSBSQ1Ugc29mdGlycSBpZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlbWFpbmluZy4gKi8KKwlpZiAoY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCisJCXJhaXNlX3NvZnRpcnEoUkNVX1NPRlRJUlEpOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgQ1BVIGlzIGluIGEgbm9uLWNvbnRleHQtc3dpdGNoIHF1aWVzY2VudCBzdGF0ZQorICogKHVzZXIgbW9kZSBvciBpZGxlIGxvb3AgZm9yIHJjdSwgbm9uLXNvZnRpcnEgZXhlY3V0aW9uIGZvciByY3VfYmgpLgorICogQWxzbyBzY2hlZHVsZSB0aGUgUkNVIHNvZnRpcnEgaGFuZGxlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaGFyZGlycXMgZGlzYWJsZWQuICBJdCBpcyBub3JtYWxseQorICogaW52b2tlZCBmcm9tIHRoZSBzY2hlZHVsaW5nLWNsb2NrIGludGVycnVwdC4gIElmIHJjdV9wZW5kaW5nIHJldHVybnMKKyAqIGZhbHNlLCB0aGVyZSBpcyBubyBwb2ludCBpbiBpbnZva2luZyByY3VfY2hlY2tfY2FsbGJhY2tzKCkuCisgKi8KK3ZvaWQgcmN1X2NoZWNrX2NhbGxiYWNrcyhpbnQgY3B1LCBpbnQgdXNlcikKK3sKKwlpZiAodXNlciB8fAorCSAgICAoaWRsZV9jcHUoY3B1KSAmJiAhaW5fc29mdGlycSgpICYmCisJCQkJaGFyZGlycV9jb3VudCgpIDw9ICgxIDw8IEhBUkRJUlFfU0hJRlQpKSkgeworCisJCS8qCisJCSAqIEdldCBoZXJlIGlmIHRoaXMgQ1BVIHRvb2sgaXRzIGludGVycnVwdCBmcm9tIHVzZXIKKwkJICogbW9kZSBvciBmcm9tIHRoZSBpZGxlIGxvb3AsIGFuZCBpZiB0aGlzIGlzIG5vdCBhCisJCSAqIG5lc3RlZCBpbnRlcnJ1cHQuICBJbiB0aGlzIGNhc2UsIHRoZSBDUFUgaXMgaW4KKwkJICogYSBxdWllc2NlbnQgc3RhdGUsIHNvIGNvdW50IGl0LgorCQkgKgorCQkgKiBObyBtZW1vcnkgYmFycmllciBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgYm90aAorCQkgKiByY3VfcXNjdHJfaW5jKCkgYW5kIHJjdV9iaF9xc2N0cl9pbmMoKSByZWZlcmVuY2UKKwkJICogb25seSBDUFUtbG9jYWwgdmFyaWFibGVzIHRoYXQgb3RoZXIgQ1BVcyBuZWl0aGVyCisJCSAqIGFjY2VzcyBub3IgbW9kaWZ5LCBhdCBsZWFzdCBub3Qgd2hpbGUgdGhlIGNvcnJlc3BvbmRpbmcKKwkJICogQ1BVIGlzIG9ubGluZS4KKwkJICovCisKKwkJcmN1X3FzY3RyX2luYyhjcHUpOworCQlyY3VfYmhfcXNjdHJfaW5jKGNwdSk7CisKKwl9IGVsc2UgaWYgKCFpbl9zb2Z0aXJxKCkpIHsKKworCQkvKgorCQkgKiBHZXQgaGVyZSBpZiB0aGlzIENQVSBkaWQgbm90IHRha2UgaXRzIGludGVycnVwdCBmcm9tCisJCSAqIHNvZnRpcnEsIGluIG90aGVyIHdvcmRzLCBpZiBpdCBpcyBub3QgaW50ZXJydXB0aW5nCisJCSAqIGEgcmN1X2JoIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLiAgVGhpcyBpcyBhbiBfYmgKKwkJICogY3JpdGljYWwgc2VjdGlvbiwgc28gY291bnQgaXQuCisJCSAqLworCisJCXJjdV9iaF9xc2N0cl9pbmMoY3B1KTsKKwl9CisJcmFpc2Vfc29mdGlycShSQ1VfU09GVElSUSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisKKy8qCisgKiBTY2FuIHRoZSBsZWFmIHJjdV9ub2RlIHN0cnVjdHVyZXMsIHByb2Nlc3NpbmcgZHludGljayBzdGF0ZSBmb3IgYW55IHRoYXQKKyAqIGhhdmUgbm90IHlldCBlbmNvdW50ZXJlZCBhIHF1aWVzY2VudCBzdGF0ZSwgdXNpbmcgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZC4KKyAqIFJldHVybnMgMSBpZiB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QgZW5kcyB3aGlsZSBzY2FubmluZyAocG9zc2libHkKKyAqIGJlY2F1c2Ugd2UgbWFkZSBpdCBlbmQpLgorICovCitzdGF0aWMgaW50IHJjdV9wcm9jZXNzX2R5bnRpY2soc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBsb25nIGxhc3Rjb21wLAorCQkJICAgICAgIGludCAoKmYpKHN0cnVjdCByY3VfZGF0YSAqKSkKK3sKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wX2N1ciA9IHJzcC0+bGV2ZWxbTlVNX1JDVV9MVkxTIC0gMV07CisJc3RydWN0IHJjdV9ub2RlICpybnBfZW5kID0gJnJzcC0+bm9kZVtOVU1fUkNVX05PREVTXTsKKworCWZvciAoOyBybnBfY3VyIDwgcm5wX2VuZDsgcm5wX2N1cisrKSB7CisJCW1hc2sgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wX2N1ci0+bG9jaywgZmxhZ3MpOworCQlpZiAocnNwLT5jb21wbGV0ZWQgIT0gbGFzdGNvbXApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucF9jdXItPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChybnBfY3VyLT5xc21hc2sgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wX2N1ci0+bG9jaywgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0KKwkJY3B1ID0gcm5wX2N1ci0+Z3JwbG87CisJCWJpdCA9IDE7CisJCWZvciAoOyBjcHUgPD0gcm5wX2N1ci0+Z3JwaGk7IGNwdSsrLCBiaXQgPDw9IDEpIHsKKwkJCWlmICgocm5wX2N1ci0+cXNtYXNrICYgYml0KSAhPSAwICYmIGYocnNwLT5yZGFbY3B1XSkpCisJCQkJbWFzayB8PSBiaXQ7CisJCX0KKwkJaWYgKG1hc2sgIT0gMCAmJiByc3AtPmNvbXBsZXRlZCA9PSBsYXN0Y29tcCkgeworCisJCQkvKiBjcHVfcXVpZXRfbXNrKCkgcmVsZWFzZXMgcm5wX2N1ci0+bG9jay4gKi8KKwkJCWNwdV9xdWlldF9tc2sobWFzaywgcnNwLCBybnBfY3VyLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnBfY3VyLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRm9yY2UgcXVpZXNjZW50IHN0YXRlcyBvbiByZWx1Y3RhbnQgQ1BVcywgYW5kIGFsc28gZGV0ZWN0IHdoaWNoCisgKiBDUFVzIGFyZSBpbiBkeW50aWNrLWlkbGUgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgZm9yY2VfcXVpZXNjZW50X3N0YXRlKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgaW50IHJlbGF4ZWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGxhc3Rjb21wOworCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcnNwLT5yZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCXU4IHNpZ25hbGVkOworCisJaWYgKEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSA9PSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSkKKwkJcmV0dXJuOyAgLyogTm8gZ3JhY2UgcGVyaW9kIGluIHByb2dyZXNzLCBub3RoaW5nIHRvIGZvcmNlLiAqLworCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJnJzcC0+ZnFzbG9jaywgZmxhZ3MpKSB7CisJCXJzcC0+bl9mb3JjZV9xc19saCsrOyAvKiBJbmV4YWN0LCBjYW4gbG9zZSBjb3VudHMuICBUb3VnaCEgKi8KKwkJcmV0dXJuOwkvKiBTb21lb25lIGVsc2UgaXMgYWxyZWFkeSBvbiB0aGUgam9iLiAqLworCX0KKwlpZiAocmVsYXhlZCAmJgorCSAgICAobG9uZykocnNwLT5qaWZmaWVzX2ZvcmNlX3FzIC0gamlmZmllcykgPj0gMCAmJgorCSAgICAocmRwLT5uX3JjdV9wZW5kaW5nX2ZvcmNlX3FzIC0gcmRwLT5uX3JjdV9wZW5kaW5nKSA+PSAwKQorCQlnb3RvIHVubG9ja19yZXQ7IC8qIG5vIGVtZXJnZW5jeSBhbmQgZG9uZSByZWNlbnRseS4gKi8KKwlyc3AtPm5fZm9yY2VfcXMrKzsKKwlzcGluX2xvY2soJnJucC0+bG9jayk7CisJbGFzdGNvbXAgPSByc3AtPmNvbXBsZXRlZDsKKwlzaWduYWxlZCA9IHJzcC0+c2lnbmFsZWQ7CisJcnNwLT5qaWZmaWVzX2ZvcmNlX3FzID0gamlmZmllcyArIFJDVV9KSUZGSUVTX1RJTExfRk9SQ0VfUVM7CisJcmRwLT5uX3JjdV9wZW5kaW5nX2ZvcmNlX3FzID0gcmRwLT5uX3JjdV9wZW5kaW5nICsKKwkJCQkgICAgICBSQ1VfSklGRklFU19USUxMX0ZPUkNFX1FTOworCWlmIChsYXN0Y29tcCA9PSByc3AtPmdwbnVtKSB7CisJCXJzcC0+bl9mb3JjZV9xc19uZ3ArKzsKKwkJc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CisJCWdvdG8gdW5sb2NrX3JldDsgIC8qIG5vIEdQIGluIHByb2dyZXNzLCB0aW1lIHVwZGF0ZWQuICovCisJfQorCXNwaW5fdW5sb2NrKCZybnAtPmxvY2spOworCXN3aXRjaCAoc2lnbmFsZWQpIHsKKwljYXNlIFJDVV9HUF9JTklUOgorCisJCWJyZWFrOyAvKiBncmFjZSBwZXJpb2Qgc3RpbGwgaW5pdGlhbGl6aW5nLCBpZ25vcmUuICovCisKKwljYXNlIFJDVV9TQVZFX0RZTlRJQ0s6CisKKwkJaWYgKFJDVV9TSUdOQUxfSU5JVCAhPSBSQ1VfU0FWRV9EWU5USUNLKQorCQkJYnJlYWs7IC8qIFNvIGdjYyByZWNvZ25pemVzIHRoZSBkZWFkIGNvZGUuICovCisKKwkJLyogUmVjb3JkIGR5bnRpY2staWRsZSBzdGF0ZS4gKi8KKwkJaWYgKHJjdV9wcm9jZXNzX2R5bnRpY2socnNwLCBsYXN0Y29tcCwKKwkJCQkJZHludGlja19zYXZlX3Byb2dyZXNzX2NvdW50ZXIpKQorCQkJZ290byB1bmxvY2tfcmV0OworCisJCS8qIFVwZGF0ZSBzdGF0ZSwgcmVjb3JkIGNvbXBsZXRpb24gY291bnRlci4gKi8KKwkJc3Bpbl9sb2NrKCZybnAtPmxvY2spOworCQlpZiAobGFzdGNvbXAgPT0gcnNwLT5jb21wbGV0ZWQpIHsKKwkJCXJzcC0+c2lnbmFsZWQgPSBSQ1VfRk9SQ0VfUVM7CisJCQlkeW50aWNrX3JlY29yZF9jb21wbGV0ZWQocnNwLCBsYXN0Y29tcCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBSQ1VfRk9SQ0VfUVM6CisKKwkJLyogQ2hlY2sgZHludGljay1pZGxlIHN0YXRlLCBzZW5kIElQSSB0byBsYWdnYXJ0cy4gKi8KKwkJaWYgKHJjdV9wcm9jZXNzX2R5bnRpY2socnNwLCBkeW50aWNrX3JlY2FsbF9jb21wbGV0ZWQocnNwKSwKKwkJCQkJcmN1X2ltcGxpY2l0X2R5bnRpY2tzX3FzKSkKKwkJCWdvdG8gdW5sb2NrX3JldDsKKworCQkvKiBMZWF2ZSBzdGF0ZSBpbiBjYXNlIG1vcmUgZm9yY2luZyBpcyByZXF1aXJlZC4gKi8KKworCQlicmVhazsKKwl9Cit1bmxvY2tfcmV0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzcC0+ZnFzbG9jaywgZmxhZ3MpOworfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1NNUCAqLworCitzdGF0aWMgdm9pZCBmb3JjZV9xdWllc2NlbnRfc3RhdGUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBpbnQgcmVsYXhlZCkKK3sKKwlzZXRfbmVlZF9yZXNjaGVkKCk7Cit9CisKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1NNUCAqLworCisvKgorICogVGhpcyBkb2VzIHRoZSBSQ1UgcHJvY2Vzc2luZyB3b3JrIGZyb20gc29mdGlycSBjb250ZXh0IGZvciB0aGUKKyAqIHNwZWNpZmllZCByY3Vfc3RhdGUgYW5kIHJjdV9kYXRhIHN0cnVjdHVyZXMuICBUaGlzIG1heSBiZSBjYWxsZWQKKyAqIG9ubHkgZnJvbSB0aGUgQ1BVIHRvIHdob20gdGhlIHJkcCBiZWxvbmdzLgorICovCitzdGF0aWMgdm9pZAorX19yY3VfcHJvY2Vzc19jYWxsYmFja3Moc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiBhbiBSQ1UgR1AgaGFzIGdvbmUgbG9uZyBlbm91Z2gsIGdvIGNoZWNrIGZvciBkeW50aWNrCisJICogaWRsZSBDUFVzIGFuZCwgaWYgbmVlZGVkLCBzZW5kIHJlc2NoZWQgSVBJcy4KKwkgKi8KKwlpZiAoKGxvbmcpKEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19mb3JjZV9xcykgLSBqaWZmaWVzKSA8IDAgfHwKKwkgICAgKHJkcC0+bl9yY3VfcGVuZGluZ19mb3JjZV9xcyAtIHJkcC0+bl9yY3VfcGVuZGluZykgPCAwKQorCQlmb3JjZV9xdWllc2NlbnRfc3RhdGUocnNwLCAxKTsKKworCS8qCisJICogQWR2YW5jZSBjYWxsYmFja3MgaW4gcmVzcG9uc2UgdG8gZW5kIG9mIGVhcmxpZXIgZ3JhY2UKKwkgKiBwZXJpb2QgdGhhdCBzb21lIG90aGVyIENQVSBlbmRlZC4KKwkgKi8KKwlyY3VfcHJvY2Vzc19ncF9lbmQocnNwLCByZHApOworCisJLyogVXBkYXRlIFJDVSBzdGF0ZSBiYXNlZCBvbiBhbnkgcmVjZW50IHF1aWVzY2VudCBzdGF0ZXMuICovCisJcmN1X2NoZWNrX3F1aWVzY2VudF9zdGF0ZShyc3AsIHJkcCk7CisKKwkvKiBEb2VzIHRoaXMgQ1BVIHJlcXVpcmUgYSBub3QteWV0LXN0YXJ0ZWQgZ3JhY2UgcGVyaW9kPyAqLworCWlmIChjcHVfbmVlZHNfYW5vdGhlcl9ncChyc3AsIHJkcCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJjdV9nZXRfcm9vdChyc3ApLT5sb2NrLCBmbGFncyk7CisJCXJjdV9zdGFydF9ncChyc3AsIGZsYWdzKTsgIC8qIHJlbGVhc2VzIGFib3ZlIGxvY2sgKi8KKwl9CisKKwkvKiBJZiB0aGVyZSBhcmUgY2FsbGJhY2tzIHJlYWR5LCBpbnZva2UgdGhlbS4gKi8KKwlyY3VfZG9fYmF0Y2gocmRwKTsKK30KKworLyoKKyAqIERvIHNvZnRpcnEgcHJvY2Vzc2luZyBmb3IgdGhlIGN1cnJlbnQgQ1BVLgorICovCitzdGF0aWMgdm9pZCByY3VfcHJvY2Vzc19jYWxsYmFja3Moc3RydWN0IHNvZnRpcnFfYWN0aW9uICp1bnVzZWQpCit7CisJLyoKKwkgKiBNZW1vcnkgcmVmZXJlbmNlcyBmcm9tIGFueSBwcmlvciBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zCisJICogZXhlY3V0ZWQgYnkgdGhlIGludGVycnVwdGVkIGNvZGUgbXVzdCBiZSBzZWVuIGJlZm9yZSBhbnkgUkNVCisJICogZ3JhY2UtcGVyaW9kIG1hbmlwdWxhdGlvbnMgYmVsb3cuCisJICovCisJc21wX21iKCk7IC8qIFNlZSBhYm92ZSBibG9jayBjb21tZW50LiAqLworCisJX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9zdGF0ZSwgJl9fZ2V0X2NwdV92YXIocmN1X2RhdGEpKTsKKwlfX3JjdV9wcm9jZXNzX2NhbGxiYWNrcygmcmN1X2JoX3N0YXRlLCAmX19nZXRfY3B1X3ZhcihyY3VfYmhfZGF0YSkpOworCisJLyoKKwkgKiBNZW1vcnkgcmVmZXJlbmNlcyBmcm9tIGFueSBsYXRlciBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zCisJICogZXhlY3V0ZWQgYnkgdGhlIGludGVycnVwdGVkIGNvZGUgbXVzdCBiZSBzZWVuIGFmdGVyIGFueSBSQ1UKKwkgKiBncmFjZS1wZXJpb2QgbWFuaXB1bGF0aW9ucyBhYm92ZS4KKwkgKi8KKwlzbXBfbWIoKTsgLyogU2VlIGFib3ZlIGJsb2NrIGNvbW1lbnQuICovCit9CisKK3N0YXRpYyB2b2lkCitfX2NhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSwKKwkgICBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKKworCWhlYWQtPmZ1bmMgPSBmdW5jOworCWhlYWQtPm5leHQgPSBOVUxMOworCisJc21wX21iKCk7IC8qIEVuc3VyZSBSQ1UgdXBkYXRlIHNlZW4gYmVmb3JlIGNhbGxiYWNrIHJlZ2lzdHJ5LiAqLworCisJLyoKKwkgKiBPcHBvcnR1bmlzdGljYWxseSBub3RlIGdyYWNlLXBlcmlvZCBlbmRpbmdzIGFuZCBiZWdpbm5pbmdzLgorCSAqIE5vdGUgdGhhdCB3ZSBtaWdodCBzZWUgYSBiZWdpbm5pbmcgcmlnaHQgYWZ0ZXIgd2Ugc2VlIGFuCisJICogZW5kLCBidXQgbmV2ZXIgdmljZSB2ZXJzYSwgc2luY2UgdGhpcyBDUFUgaGFzIHRvIHBhc3MgdGhyb3VnaAorCSAqIGEgcXVpZXNjZW50IHN0YXRlIGJldHdlZW50aW1lcy4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmRwID0gcnNwLT5yZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlyY3VfcHJvY2Vzc19ncF9lbmQocnNwLCByZHApOworCWNoZWNrX2Zvcl9uZXdfZ3JhY2VfcGVyaW9kKHJzcCwgcmRwKTsKKworCS8qIEFkZCB0aGUgY2FsbGJhY2sgdG8gb3VyIGxpc3QuICovCisJKnJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXSA9IGhlYWQ7CisJcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdID0gJmhlYWQtPm5leHQ7CisKKwkvKiBTdGFydCBhIG5ldyBncmFjZSBwZXJpb2QgaWYgb25lIG5vdCBhbHJlYWR5IHN0YXJ0ZWQuICovCisJaWYgKEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSA9PSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSkgeworCQl1bnNpZ25lZCBsb25nIG5lc3RmbGFnOworCQlzdHJ1Y3QgcmN1X25vZGUgKnJucF9yb290ID0gcmN1X2dldF9yb290KHJzcCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJucF9yb290LT5sb2NrLCBuZXN0ZmxhZyk7CisJCXJjdV9zdGFydF9ncChyc3AsIG5lc3RmbGFnKTsgIC8qIHJlbGVhc2VzIHJucF9yb290LT5sb2NrLiAqLworCX0KKworCS8qIEZvcmNlIHRoZSBncmFjZSBwZXJpb2QgaWYgdG9vIG1hbnkgY2FsbGJhY2tzIG9yIHRvbyBsb25nIHdhaXRpbmcuICovCisJaWYgKHVubGlrZWx5KCsrcmRwLT5xbGVuID4gcWhpbWFyaykpIHsKKwkJcmRwLT5ibGltaXQgPSBMT05HX01BWDsKKwkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKHJzcCwgMCk7CisJfSBlbHNlIGlmICgobG9uZykoQUNDRVNTX09OQ0UocnNwLT5qaWZmaWVzX2ZvcmNlX3FzKSAtIGppZmZpZXMpIDwgMCB8fAorCQkgICAocmRwLT5uX3JjdV9wZW5kaW5nX2ZvcmNlX3FzIC0gcmRwLT5uX3JjdV9wZW5kaW5nKSA8IDApCisJCWZvcmNlX3F1aWVzY2VudF9zdGF0ZShyc3AsIDEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIFF1ZXVlIGFuIFJDVSBjYWxsYmFjayBmb3IgaW52b2NhdGlvbiBhZnRlciBhIGdyYWNlIHBlcmlvZC4KKyAqLwordm9pZCBjYWxsX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkpCit7CisJX19jYWxsX3JjdShoZWFkLCBmdW5jLCAmcmN1X3N0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNhbGxfcmN1KTsKKworLyoKKyAqIFF1ZXVlIGFuIFJDVSBmb3IgaW52b2NhdGlvbiBhZnRlciBhIHF1aWNrZXIgZ3JhY2UgcGVyaW9kLgorICovCit2b2lkIGNhbGxfcmN1X2JoKHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSkKK3sKKwlfX2NhbGxfcmN1KGhlYWQsIGZ1bmMsICZyY3VfYmhfc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2FsbF9yY3VfYmgpOworCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSBpbW1lZGlhdGUgUkNVLXJlbGF0ZWQgd29yayB0byBiZSBkb25lCisgKiBieSB0aGUgY3VycmVudCBDUFUsIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgUkNVLCByZXR1cm5pbmcgMSBpZiBzby4KKyAqIFRoZSBjaGVja3MgYXJlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgZXhwZW5zZTogY2hlY2tzIHRoYXQgY2FuIGJlCisgKiBjYXJyaWVkIG91dCBhZ2FpbnN0IENQVS1sb2NhbCBzdGF0ZSBhcmUgcGVyZm9ybWVkIGZpcnN0LiAgSG93ZXZlciwKKyAqIHdlIG11c3QgY2hlY2sgZm9yIENQVSBzdGFsbHMgZmlyc3QsIGVsc2Ugd2UgbWlnaHQgbm90IGdldCBhIGNoYW5jZS4KKyAqLworc3RhdGljIGludCBfX3JjdV9wZW5kaW5nKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJcmRwLT5uX3JjdV9wZW5kaW5nKys7CisKKwkvKiBDaGVjayBmb3IgQ1BVIHN0YWxscywgaWYgZW5hYmxlZC4gKi8KKwljaGVja19jcHVfc3RhbGwocnNwLCByZHApOworCisJLyogSXMgdGhlIFJDVSBjb3JlIHdhaXRpbmcgZm9yIGEgcXVpZXNjZW50IHN0YXRlIGZyb20gdGhpcyBDUFU/ICovCisJaWYgKHJkcC0+cXNfcGVuZGluZykKKwkJcmV0dXJuIDE7CisKKwkvKiBEb2VzIHRoaXMgQ1BVIGhhdmUgY2FsbGJhY2tzIHJlYWR5IHRvIGludm9rZT8gKi8KKwlpZiAoY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCisJCXJldHVybiAxOworCisJLyogSGFzIFJDVSBnb25lIGlkbGUgd2l0aCB0aGlzIENQVSBuZWVkaW5nIGFub3RoZXIgZ3JhY2UgcGVyaW9kPyAqLworCWlmIChjcHVfbmVlZHNfYW5vdGhlcl9ncChyc3AsIHJkcCkpCisJCXJldHVybiAxOworCisJLyogSGFzIGFub3RoZXIgUkNVIGdyYWNlIHBlcmlvZCBjb21wbGV0ZWQ/ICAqLworCWlmIChBQ0NFU1NfT05DRShyc3AtPmNvbXBsZXRlZCkgIT0gcmRwLT5jb21wbGV0ZWQpIC8qIG91dHNpZGUgb2YgbG9jayAqLworCQlyZXR1cm4gMTsKKworCS8qIEhhcyBhIG5ldyBSQ1UgZ3JhY2UgcGVyaW9kIHN0YXJ0ZWQ/ICovCisJaWYgKEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pICE9IHJkcC0+Z3BudW0pIC8qIG91dHNpZGUgb2YgbG9jayAqLworCQlyZXR1cm4gMTsKKworCS8qIEhhcyBhbiBSQ1UgR1AgZ29uZSBsb25nIGVub3VnaCB0byBzZW5kIHJlc2NoZWQgSVBJcyAmYz8gKi8KKwlpZiAoQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpICE9IEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pICYmCisJICAgICgobG9uZykoQUNDRVNTX09OQ0UocnNwLT5qaWZmaWVzX2ZvcmNlX3FzKSAtIGppZmZpZXMpIDwgMCB8fAorCSAgICAgKHJkcC0+bl9yY3VfcGVuZGluZ19mb3JjZV9xcyAtIHJkcC0+bl9yY3VfcGVuZGluZykgPCAwKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBub3RoaW5nIHRvIGRvICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW55IGltbWVkaWF0ZSBSQ1UtcmVsYXRlZCB3b3JrIHRvIGJlIGRvbmUKKyAqIGJ5IHRoZSBjdXJyZW50IENQVSwgcmV0dXJuaW5nIDEgaWYgc28uICBUaGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlCisgKiBSQ1UgaW1wbGVtZW50YXRpb247IGl0IGlzIC1ub3QtIGFuIGV4cG9ydGVkIG1lbWJlciBvZiB0aGUgUkNVIEFQSS4KKyAqLworaW50IHJjdV9wZW5kaW5nKGludCBjcHUpCit7CisJcmV0dXJuIF9fcmN1X3BlbmRpbmcoJnJjdV9zdGF0ZSwgJnBlcl9jcHUocmN1X2RhdGEsIGNwdSkpIHx8CisJICAgICAgIF9fcmN1X3BlbmRpbmcoJnJjdV9iaF9zdGF0ZSwgJnBlcl9jcHUocmN1X2JoX2RhdGEsIGNwdSkpOworfQorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIGFueSBmdXR1cmUgUkNVLXJlbGF0ZWQgd29yayB3aWxsIG5lZWQgdG8gYmUgZG9uZQorICogYnkgdGhlIGN1cnJlbnQgQ1BVLCBldmVuIGlmIG5vbmUgbmVlZCBiZSBkb25lIGltbWVkaWF0ZWx5LCByZXR1cm5pbmcKKyAqIDEgaWYgc28uICBUaGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlIFJDVSBpbXBsZW1lbnRhdGlvbjsgaXQgaXMgLW5vdC0KKyAqIGFuIGV4cG9ydGVkIG1lbWJlciBvZiB0aGUgUkNVIEFQSS4KKyAqLworaW50IHJjdV9uZWVkc19jcHUoaW50IGNwdSkKK3sKKwkvKiBSQ1UgY2FsbGJhY2tzIGVpdGhlciByZWFkeSBvciBwZW5kaW5nPyAqLworCXJldHVybiBwZXJfY3B1KHJjdV9kYXRhLCBjcHUpLm54dGxpc3QgfHwKKwkgICAgICAgcGVyX2NwdShyY3VfYmhfZGF0YSwgY3B1KS5ueHRsaXN0OworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIENQVSdzIHBlci1DUFUgUkNVIGRhdGEuICBXZSB0YWtlIHRoaXMgInNjb3JjaGVkIGVhcnRoIgorICogYXBwcm9hY2ggc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGhvdyBsb25nIHRoZSBDUFUgaGFzCisgKiBiZWVuIGdvbmUsIG9yIHdoZXRoZXIgaXQgZXZlciB3YXMgb25saW5lIHByZXZpb3VzbHkuICBXZSBkbyB0cnVzdCB0aGUKKyAqIC0+bXlub2RlIGZpZWxkLCBhcyBpdCBpcyBjb25zdGFudCBmb3IgYSBnaXZlbiBzdHJ1Y3QgcmN1X2RhdGEgYW5kCisgKiBpbml0aWFsaXplZCBkdXJpbmcgZWFybHkgYm9vdC4KKyAqCisgKiBOb3RlIHRoYXQgb25seSBvbmUgb25saW5lIG9yIG9mZmxpbmUgZXZlbnQgY2FuIGJlIGhhcHBlbmluZyBhdCBhIGdpdmVuCisgKiB0aW1lLiAgTm90ZSBhbHNvIHRoYXQgd2UgY2FuIGFjY2VwdCBzb21lIHNsb3AgaW4gdGhlIHJzcC0+Y29tcGxldGVkCisgKiBhY2Nlc3MgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhpcyBDUFUgY2Fubm90IHBvc3NpYmx5IGhhdmUgYW55IFJDVQorICogY2FsbGJhY2tzIGluIGZsaWdodCB5ZXQuCisgKi8KK3N0YXRpYyB2b2lkCityY3VfaW5pdF9wZXJjcHVfZGF0YShpbnQgY3B1LCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlsb25nIGxhc3Rjb21wOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHJzcC0+cmRhW2NwdV07CisJc3RydWN0IHJjdV9ub2RlICpybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKKworCS8qIFNldCB1cCBsb2NhbCBzdGF0ZSwgZW5zdXJpbmcgY29uc2lzdGVudCB2aWV3IG9mIGdsb2JhbCBzdGF0ZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJbGFzdGNvbXAgPSByc3AtPmNvbXBsZXRlZDsKKwlyZHAtPmNvbXBsZXRlZCA9IGxhc3Rjb21wOworCXJkcC0+Z3BudW0gPSBsYXN0Y29tcDsKKwlyZHAtPnBhc3NlZF9xdWllc2MgPSAwOyAgLyogV2UgY291bGQgYmUgcmFjaW5nIHdpdGggbmV3IEdQLCAqLworCXJkcC0+cXNfcGVuZGluZyA9IDE7CSAvKiAgc28gc2V0IHVwIHRvIHJlc3BvbmQgdG8gY3VycmVudCBHUC4gKi8KKwlyZHAtPmJlZW5vbmxpbmUgPSAxOwkgLyogV2UgaGF2ZSBub3cgYmVlbiBvbmxpbmUuICovCisJcmRwLT5wYXNzZWRfcXVpZXNjX2NvbXBsZXRlZCA9IGxhc3Rjb21wIC0gMTsKKwlyZHAtPmdycG1hc2sgPSAxVUwgPDwgKGNwdSAtIHJkcC0+bXlub2RlLT5ncnBsbyk7CisJcmRwLT5ueHRsaXN0ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgUkNVX05FWFRfU0laRTsgaSsrKQorCQlyZHAtPm54dHRhaWxbaV0gPSAmcmRwLT5ueHRsaXN0OworCXJkcC0+cWxlbiA9IDA7CisJcmRwLT5ibGltaXQgPSBibGltaXQ7CisjaWZkZWYgQ09ORklHX05PX0haCisJcmRwLT5keW50aWNrcyA9ICZwZXJfY3B1KHJjdV9keW50aWNrcywgY3B1KTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCisJcmRwLT5jcHUgPSBjcHU7CisJc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CQkvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KKworCS8qCisJICogQSBuZXcgZ3JhY2UgcGVyaW9kIG1pZ2h0IHN0YXJ0IGhlcmUuICBJZiBzbywgd2Ugd29uJ3QgYmUgcGFydAorCSAqIG9mIGl0LCBidXQgdGhhdCBpcyBPSywgYXMgd2UgYXJlIGN1cnJlbnRseSBpbiBhIHF1aWVzY2VudCBzdGF0ZS4KKwkgKi8KKworCS8qIEV4Y2x1ZGUgYW55IGF0dGVtcHRzIHRvIHN0YXJ0IGEgbmV3IEdQIG9uIGxhcmdlIHN5c3RlbXMuICovCisJc3Bpbl9sb2NrKCZyc3AtPm9ub2ZmbG9jayk7CQkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCisKKwkvKiBBZGQgQ1BVIHRvIHJjdV9ub2RlIGJpdG1hc2tzLiAqLworCXJucCA9IHJkcC0+bXlub2RlOworCW1hc2sgPSByZHAtPmdycG1hc2s7CisJZG8geworCQkvKiBFeGNsdWRlIGFueSBhdHRlbXB0cyB0byBzdGFydCBhIG5ldyBHUCBvbiBzbWFsbCBzeXN0ZW1zLiAqLworCQlzcGluX2xvY2soJnJucC0+bG9jayk7CS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KKwkJcm5wLT5xc21hc2tpbml0IHw9IG1hc2s7CisJCW1hc2sgPSBybnAtPmdycG1hc2s7CisJCXNwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCisJCXJucCA9IHJucC0+cGFyZW50OworCX0gd2hpbGUgKHJucCAhPSBOVUxMICYmICEocm5wLT5xc21hc2tpbml0ICYgbWFzaykpOworCisJc3Bpbl91bmxvY2soJnJzcC0+b25vZmZsb2NrKTsJCS8qIGlycXMgcmVtYWluIGRpc2FibGVkLiAqLworCisJLyoKKwkgKiBBIG5ldyBncmFjZSBwZXJpb2QgbWlnaHQgc3RhcnQgaGVyZS4gIElmIHNvLCB3ZSB3aWxsIGJlIHBhcnQgb2YKKwkgKiBpdCwgYW5kIGl0cyBncG51bSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBvdXJzLCBzbyB3ZSB3aWxsCisJICogcGFydGljaXBhdGUuICBJdCBpcyBhbHNvIHBvc3NpYmxlIGZvciB0aGUgZ3BudW0gdG8gaGF2ZSBiZWVuCisJICogaW5jcmVtZW50ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCwgYW5kIHRoZSBiaXRtYXNrcworCSAqIHRvIG5vdCBiZSBmaWxsZWQgb3V0IHVudGlsIG5vdywgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGFsc28KKwkgKiBwYXJ0aWNpcGF0ZSBkdWUgdG8gb3VyIGdwbnVtIGJlaW5nIGJlaGluZC4KKwkgKi8KKworCS8qIFNpbmNlIGl0IGlzIGNvbWluZyBvbmxpbmUsIHRoZSBDUFUgaXMgaW4gYSBxdWllc2NlbnQgc3RhdGUuICovCisJY3B1X3F1aWV0KGNwdSwgcnNwLCByZHAsIGxhc3Rjb21wKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3Vfb25saW5lX2NwdShpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19OT19IWgorCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHAgPSAmcGVyX2NwdShyY3VfZHludGlja3MsIGNwdSk7CisKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nID0gMTsKKwlyZHRwLT5keW50aWNrcyB8PSAxOyAJLyogbmVlZCBjb25zZWN1dGl2ZSAjcyBldmVuIGZvciBob3RwbHVnLiAqLworCXJkdHAtPmR5bnRpY2tzX25taSA9IChyZHRwLT5keW50aWNrc19ubWkgKyAxKSAmIH4weDE7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworCXJjdV9pbml0X3BlcmNwdV9kYXRhKGNwdSwgJnJjdV9zdGF0ZSk7CisJcmN1X2luaXRfcGVyY3B1X2RhdGEoY3B1LCAmcmN1X2JoX3N0YXRlKTsKKwlvcGVuX3NvZnRpcnEoUkNVX1NPRlRJUlEsIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyk7Cit9CisKKy8qCisgKiBIYW5kbGUgQ1BVIG9ubGluZS9vZmZsaW5lIG5vdGlmY2F0aW9uIGV2ZW50cy4KKyAqLworc3RhdGljIGludCBfX2NwdWluaXQgcmN1X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKKwkJcmN1X29ubGluZV9jcHUoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKKwljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46CisJCXJjdV9vZmZsaW5lX2NwdShjcHUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHBlci1sZXZlbCBmYW5vdXQsIGVpdGhlciB1c2luZyB0aGUgZXhhY3QgZmFub3V0IHNwZWNpZmllZAorICogb3IgYmFsYW5jaW5nIHRoZSB0cmVlLCBkZXBlbmRpbmcgb24gQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QuCisgKi8KKyNpZmRlZiBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVAorc3RhdGljIHZvaWQgX19pbml0IHJjdV9pbml0X2xldmVsc3ByZWFkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IE5VTV9SQ1VfTFZMUyAtIDE7IGkgPj0gMDsgaS0tKQorCQlyc3AtPmxldmVsc3ByZWFkW2ldID0gQ09ORklHX1JDVV9GQU5PVVQ7Cit9CisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByY3VfaW5pdF9sZXZlbHNwcmVhZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJaW50IGNjdXI7CisJaW50IGNwcnY7CisJaW50IGk7CisKKwljcHJ2ID0gTlJfQ1BVUzsKKwlmb3IgKGkgPSBOVU1fUkNVX0xWTFMgLSAxOyBpID49IDA7IGktLSkgeworCQljY3VyID0gcnNwLT5sZXZlbGNudFtpXTsKKwkJcnNwLT5sZXZlbHNwcmVhZFtpXSA9IChjcHJ2ICsgY2N1ciAtIDEpIC8gY2N1cjsKKwkJY3BydiA9IGNjdXI7CisJfQorfQorI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCAqLworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciByY3VfaW5pdCgpIHRoYXQgaW5pdGlhbGl6ZXMgb25lIHJjdV9zdGF0ZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByY3VfaW5pdF9vbmUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQoreworCWludCBjcHVzdHJpZGUgPSAxOworCWludCBpOworCWludCBqOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbGV2ZWwtdHJhY2tpbmcgYXJyYXlzLiAqLworCisJZm9yIChpID0gMTsgaSA8IE5VTV9SQ1VfTFZMUzsgaSsrKQorCQlyc3AtPmxldmVsW2ldID0gcnNwLT5sZXZlbFtpIC0gMV0gKyByc3AtPmxldmVsY250W2kgLSAxXTsKKwlyY3VfaW5pdF9sZXZlbHNwcmVhZChyc3ApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcywgc3RhcnRpbmcgZnJvbSB0aGUgbGVhdmVzLiAqLworCisJZm9yIChpID0gTlVNX1JDVV9MVkxTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJY3B1c3RyaWRlICo9IHJzcC0+bGV2ZWxzcHJlYWRbaV07CisJCXJucCA9IHJzcC0+bGV2ZWxbaV07CisJCWZvciAoaiA9IDA7IGogPCByc3AtPmxldmVsY250W2ldOyBqKyssIHJucCsrKSB7CisJCQlzcGluX2xvY2tfaW5pdCgmcm5wLT5sb2NrKTsKKwkJCXJucC0+cXNtYXNrID0gMDsKKwkJCXJucC0+cXNtYXNraW5pdCA9IDA7CisJCQlybnAtPmdycGxvID0gaiAqIGNwdXN0cmlkZTsKKwkJCXJucC0+Z3JwaGkgPSAoaiArIDEpICogY3B1c3RyaWRlIC0gMTsKKwkJCWlmIChybnAtPmdycGhpID49IE5SX0NQVVMpCisJCQkJcm5wLT5ncnBoaSA9IE5SX0NQVVMgLSAxOworCQkJaWYgKGkgPT0gMCkgeworCQkJCXJucC0+Z3JwbnVtID0gMDsKKwkJCQlybnAtPmdycG1hc2sgPSAwOworCQkJCXJucC0+cGFyZW50ID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcm5wLT5ncnBudW0gPSBqICUgcnNwLT5sZXZlbHNwcmVhZFtpIC0gMV07CisJCQkJcm5wLT5ncnBtYXNrID0gMVVMIDw8IHJucC0+Z3JwbnVtOworCQkJCXJucC0+cGFyZW50ID0gcnNwLT5sZXZlbFtpIC0gMV0gKworCQkJCQkgICAgICBqIC8gcnNwLT5sZXZlbHNwcmVhZFtpIC0gMV07CisJCQl9CisJCQlybnAtPmxldmVsID0gaTsKKwkJfQorCX0KK30KKworLyoKKyAqIEhlbHBlciBtYWNybyBmb3IgX19yY3VfaW5pdCgpLiAgVG8gYmUgdXNlZCBub3doZXJlIGVsc2UhCisgKiBBc3NpZ25zIGxlYWYgbm9kZSBwb2ludGVycyBpbnRvIGVhY2ggQ1BVJ3MgcmN1X2RhdGEgc3RydWN0dXJlLgorICovCisjZGVmaW5lIFJDVV9EQVRBX1BUUl9JTklUKHJzcCwgcmN1X2RhdGEpIFwKK2RvIHsgXAorCXJucCA9IChyc3ApLT5sZXZlbFtOVU1fUkNVX0xWTFMgLSAxXTsgXAorCWogPSAwOyBcCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsgXAorCQlpZiAoaSA+IHJucFtqXS5ncnBoaSkgXAorCQkJaisrOyBcCisJCXBlcl9jcHUocmN1X2RhdGEsIGkpLm15bm9kZSA9ICZybnBbal07IFwKKwkJKHJzcCktPnJkYVtpXSA9ICZwZXJfY3B1KHJjdV9kYXRhLCBpKTsgXAorCX0gXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIHJjdV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHJjdV9jcHVfbm90aWZ5LAorfTsKKwordm9pZCBfX2luaXQgX19yY3VfaW5pdCh2b2lkKQoreworCWludCBpOwkJCS8qIEFsbCB1c2VkIGJ5IFJDVV9EQVRBX1BUUl9JTklUKCkuICovCisJaW50IGo7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFeHBlcmltZW50YWwgaGllcmFyY2hpY2FsIFJDVSBpbXBsZW1lbnRhdGlvbi5cbiIpOworI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCisJcHJpbnRrKEtFUk5fSU5GTyAiUkNVLWJhc2VkIGRldGVjdGlvbiBvZiBzdGFsbGVkIENQVXMgaXMgZW5hYmxlZC5cbiIpOworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiAqLworCXJjdV9pbml0X29uZSgmcmN1X3N0YXRlKTsKKwlSQ1VfREFUQV9QVFJfSU5JVCgmcmN1X3N0YXRlLCByY3VfZGF0YSk7CisJcmN1X2luaXRfb25lKCZyY3VfYmhfc3RhdGUpOworCVJDVV9EQVRBX1BUUl9JTklUKCZyY3VfYmhfc3RhdGUsIHJjdV9iaF9kYXRhKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKKwkJcmN1X2NwdV9ub3RpZnkoJnJjdV9uYiwgQ1BVX1VQX1BSRVBBUkUsICh2b2lkICopKGxvbmcpaSk7CisJLyogUmVnaXN0ZXIgbm90aWZpZXIgZm9yIG5vbi1ib290IENQVXMgKi8KKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdV9uYik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRXhwZXJpbWVudGFsIGhpZXJhcmNoaWNhbCBSQ1UgaW5pdCBkb25lLlxuIik7Cit9CisKK21vZHVsZV9wYXJhbShibGltaXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocWhpbWFyaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShxbG93bWFyaywgaW50LCAwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGIzZTgzCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3JjdXRyZWVfdHJhY2UuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIFJlYWQtQ29weSBVcGRhdGUgdHJhY2luZyBmb3IgY2xhc3NpYyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiwgMjAwOAorICoKKyAqIFBhcGVyczogIGh0dHA6Ly93d3cucmRyb3AuY29tL3VzZXJzL3BhdWxtY2svUkNVCisgKgorICogRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIFJlYWQtQ29weSBVcGRhdGUgbWVjaGFuaXNtIHNlZSAtCisgKiAJCURvY3VtZW50YXRpb24vUkNVCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9kYXRhKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJaWYgKCFyZHAtPmJlZW5vbmxpbmUpCisJCXJldHVybjsKKwlzZXFfcHJpbnRmKG0sICIlM2QlY2M9JWxkIGc9JWxkIHBxPSVkIHBxYz0lbGQgcXA9JWQgcnBmcT0lbGQgcnA9JXgiLAorCQkgICByZHAtPmNwdSwKKwkJICAgY3B1X2lzX29mZmxpbmUocmRwLT5jcHUpID8gJyEnIDogJyAnLAorCQkgICByZHAtPmNvbXBsZXRlZCwgcmRwLT5ncG51bSwKKwkJICAgcmRwLT5wYXNzZWRfcXVpZXNjLCByZHAtPnBhc3NlZF9xdWllc2NfY29tcGxldGVkLAorCQkgICByZHAtPnFzX3BlbmRpbmcsCisJCSAgIHJkcC0+bl9yY3VfcGVuZGluZ19mb3JjZV9xcyAtIHJkcC0+bl9yY3VfcGVuZGluZywKKwkJICAgKGludCkocmRwLT5uX3JjdV9wZW5kaW5nICYgMHhmZmZmKSk7CisjaWZkZWYgQ09ORklHX05PX0haCisJc2VxX3ByaW50ZihtLCAiIGR0PSVkLyVkIGRuPSVkIGRmPSVsdSIsCisJCSAgIHJkcC0+ZHludGlja3MtPmR5bnRpY2tzLAorCQkgICByZHAtPmR5bnRpY2tzLT5keW50aWNrc19uZXN0aW5nLAorCQkgICByZHAtPmR5bnRpY2tzLT5keW50aWNrc19ubWksCisJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCisJc2VxX3ByaW50ZihtLCAiIG9mPSVsdSByaT0lbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKKwlzZXFfcHJpbnRmKG0sICIgcWw9JWxkIGI9JWxkXG4iLCByZHAtPnFsZW4sIHJkcC0+YmxpbWl0KTsKK30KKworI2RlZmluZSBQUklOVF9SQ1VfREFUQShuYW1lLCBmdW5jLCBtKSBcCisJZG8geyBcCisJCWludCBfcF9yX2RfaTsgXAorCQlcCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShfcF9yX2RfaSkgXAorCQkJZnVuYyhtLCAmcGVyX2NwdShuYW1lLCBfcF9yX2RfaSkpOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBzaG93X3JjdWRhdGEoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCit7CisJc2VxX3B1dHMobSwgInJjdTpcbiIpOworCVBSSU5UX1JDVV9EQVRBKHJjdV9kYXRhLCBwcmludF9vbmVfcmN1X2RhdGEsIG0pOworCXNlcV9wdXRzKG0sICJyY3VfYmg6XG4iKTsKKwlQUklOVF9SQ1VfREFUQShyY3VfYmhfZGF0YSwgcHJpbnRfb25lX3JjdV9kYXRhLCBtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByY3VkYXRhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1ZGF0YSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWRhdGFfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJjdWRhdGFfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X29uZV9yY3VfZGF0YV9jc3Yoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwlpZiAoIXJkcC0+YmVlbm9ubGluZSkKKwkJcmV0dXJuOworCXNlcV9wcmludGYobSwgIiVkLCVzLCVsZCwlbGQsJWQsJWxkLCVkLCVsZCwlbGQiLAorCQkgICByZHAtPmNwdSwKKwkJICAgY3B1X2lzX29mZmxpbmUocmRwLT5jcHUpID8gIlwiWVwiIiA6ICJcIk5cIiIsCisJCSAgIHJkcC0+Y29tcGxldGVkLCByZHAtPmdwbnVtLAorCQkgICByZHAtPnBhc3NlZF9xdWllc2MsIHJkcC0+cGFzc2VkX3F1aWVzY19jb21wbGV0ZWQsCisJCSAgIHJkcC0+cXNfcGVuZGluZywKKwkJICAgcmRwLT5uX3JjdV9wZW5kaW5nX2ZvcmNlX3FzIC0gcmRwLT5uX3JjdV9wZW5kaW5nLAorCQkgICByZHAtPm5fcmN1X3BlbmRpbmcpOworI2lmZGVmIENPTkZJR19OT19IWgorCXNlcV9wcmludGYobSwgIiwlZCwlZCwlZCwlbHUiLAorCQkgICByZHAtPmR5bnRpY2tzLT5keW50aWNrcywKKwkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3NfbmVzdGluZywKKwkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3Nfbm1pLAorCQkgICByZHAtPmR5bnRpY2tzX2Zxcyk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworCXNlcV9wcmludGYobSwgIiwlbHUsJWx1IiwgcmRwLT5vZmZsaW5lX2ZxcywgcmRwLT5yZXNjaGVkX2lwaSk7CisJc2VxX3ByaW50ZihtLCAiLCVsZCwlbGRcbiIsIHJkcC0+cWxlbiwgcmRwLT5ibGltaXQpOworfQorCitzdGF0aWMgaW50IHNob3dfcmN1ZGF0YV9jc3Yoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCit7CisJc2VxX3B1dHMobSwgIlwiQ1BVXCIsXCJPbmxpbmU/XCIsXCJjXCIsXCJnXCIsXCJwcVwiLFwicHFjXCIsXCJwcVwiLFwicnBmcVwiLFwicnBcIiwiKTsKKyNpZmRlZiBDT05GSUdfTk9fSFoKKwlzZXFfcHV0cyhtLCAiXCJkdFwiLFwiZHQgbmVzdGluZ1wiLFwiZG5cIixcImRmXCIsIik7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworCXNlcV9wdXRzKG0sICJcIm9mXCIsXCJyaVwiLFwicWxcIixcImJcIlxuIik7CisJc2VxX3B1dHMobSwgIlwicmN1OlwiXG4iKTsKKwlQUklOVF9SQ1VfREFUQShyY3VfZGF0YSwgcHJpbnRfb25lX3JjdV9kYXRhX2NzdiwgbSk7CisJc2VxX3B1dHMobSwgIlwicmN1X2JoOlwiXG4iKTsKKwlQUklOVF9SQ1VfREFUQShyY3VfYmhfZGF0YSwgcHJpbnRfb25lX3JjdV9kYXRhX2NzdiwgbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmN1ZGF0YV9jc3Zfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19yY3VkYXRhX2NzdiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWRhdGFfY3N2X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSByY3VkYXRhX2Nzdl9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlpbnQgbGV2ZWwgPSAwOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCisJc2VxX3ByaW50ZihtLCAiYz0lbGQgZz0lbGQgcz0lZCBqZnE9JWxkIGo9JXggIgorCSAgICAgICAgICAgICAgIm5mcXM9JWx1L25mcXNuZz0lbHUoJWx1KSBmcWxoPSVsdVxuIiwKKwkJICAgcnNwLT5jb21wbGV0ZWQsIHJzcC0+Z3BudW0sIHJzcC0+c2lnbmFsZWQsCisJCSAgIChsb25nKShyc3AtPmppZmZpZXNfZm9yY2VfcXMgLSBqaWZmaWVzKSwKKwkJICAgKGludCkoamlmZmllcyAmIDB4ZmZmZiksCisJCSAgIHJzcC0+bl9mb3JjZV9xcywgcnNwLT5uX2ZvcmNlX3FzX25ncCwKKwkJICAgcnNwLT5uX2ZvcmNlX3FzIC0gcnNwLT5uX2ZvcmNlX3FzX25ncCwKKwkJICAgcnNwLT5uX2ZvcmNlX3FzX2xoKTsKKwlmb3IgKHJucCA9ICZyc3AtPm5vZGVbMF07IHJucCAtICZyc3AtPm5vZGVbMF0gPCBOVU1fUkNVX05PREVTOyBybnArKykgeworCQlpZiAocm5wLT5sZXZlbCAhPSBsZXZlbCkgeworCQkJc2VxX3B1dHMobSwgIlxuIik7CisJCQlsZXZlbCA9IHJucC0+bGV2ZWw7CisJCX0KKwkJc2VxX3ByaW50ZihtLCAiJWx4LyVseCAlZDolZCBeJWQgICAgIiwKKwkJCSAgIHJucC0+cXNtYXNrLCBybnAtPnFzbWFza2luaXQsCisJCQkgICBybnAtPmdycGxvLCBybnAtPmdycGhpLCBybnAtPmdycG51bSk7CisJfQorCXNlcV9wdXRzKG0sICJcbiIpOworfQorCitzdGF0aWMgaW50IHNob3dfcmN1aGllcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKK3sKKwlzZXFfcHV0cyhtLCAicmN1OlxuIik7CisJcHJpbnRfb25lX3JjdV9zdGF0ZShtLCAmcmN1X3N0YXRlKTsKKwlzZXFfcHV0cyhtLCAicmN1X2JoOlxuIik7CisJcHJpbnRfb25lX3JjdV9zdGF0ZShtLCAmcmN1X2JoX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByY3VoaWVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1aGllciwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJjdWhpZXJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJjdWhpZXJfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2hvd19yY3VncChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKK3sKKwlzZXFfcHJpbnRmKG0sICJyY3U6IGNvbXBsZXRlZD0lbGQgIGdwbnVtPSVsZFxuIiwKKwkJICAgcmN1X3N0YXRlLmNvbXBsZXRlZCwgcmN1X3N0YXRlLmdwbnVtKTsKKwlzZXFfcHJpbnRmKG0sICJyY3VfYmg6IGNvbXBsZXRlZD0lbGQgIGdwbnVtPSVsZFxuIiwKKwkJICAgcmN1X2JoX3N0YXRlLmNvbXBsZXRlZCwgcmN1X2JoX3N0YXRlLmdwbnVtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByY3VncF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3JjdWdwLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1Z3BfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJjdWdwX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcmN1ZGlyLCAqZGF0YWRpciwgKmRhdGFkaXJfY3N2LCAqaGllcmRpciwgKmdwZGlyOworc3RhdGljIGludCBfX2luaXQgcmN1Y2xhc3NpY190cmFjZV9pbml0KHZvaWQpCit7CisJcmN1ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJyY3UiLCBOVUxMKTsKKwlpZiAoIXJjdWRpcikKKwkJZ290byBvdXQ7CisKKwlkYXRhZGlyID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmN1ZGF0YSIsIDA0NDQsIHJjdWRpciwKKwkJCQkJCU5VTEwsICZyY3VkYXRhX2ZvcHMpOworCWlmICghZGF0YWRpcikKKwkJZ290byBmcmVlX291dDsKKworCWRhdGFkaXJfY3N2ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmN1ZGF0YS5jc3YiLCAwNDQ0LCByY3VkaXIsCisJCQkJCQlOVUxMLCAmcmN1ZGF0YV9jc3ZfZm9wcyk7CisJaWYgKCFkYXRhZGlyX2NzdikKKwkJZ290byBmcmVlX291dDsKKworCWdwZGlyID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmN1Z3AiLCAwNDQ0LCByY3VkaXIsIE5VTEwsICZyY3VncF9mb3BzKTsKKwlpZiAoIWdwZGlyKQorCQlnb3RvIGZyZWVfb3V0OworCisJaGllcmRpciA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJjdWhpZXIiLCAwNDQ0LCByY3VkaXIsCisJCQkJCQlOVUxMLCAmcmN1aGllcl9mb3BzKTsKKwlpZiAoIWhpZXJkaXIpCisJCWdvdG8gZnJlZV9vdXQ7CisJcmV0dXJuIDA7CitmcmVlX291dDoKKwlpZiAoZGF0YWRpcikKKwkJZGVidWdmc19yZW1vdmUoZGF0YWRpcik7CisJaWYgKGRhdGFkaXJfY3N2KQorCQlkZWJ1Z2ZzX3JlbW92ZShkYXRhZGlyX2Nzdik7CisJaWYgKGdwZGlyKQorCQlkZWJ1Z2ZzX3JlbW92ZShncGRpcik7CisJZGVidWdmc19yZW1vdmUocmN1ZGlyKTsKK291dDoKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJjdWNsYXNzaWNfdHJhY2VfY2xlYW51cCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlKGRhdGFkaXIpOworCWRlYnVnZnNfcmVtb3ZlKGRhdGFkaXJfY3N2KTsKKwlkZWJ1Z2ZzX3JlbW92ZShncGRpcik7CisJZGVidWdmc19yZW1vdmUoaGllcmRpcik7CisJZGVidWdmc19yZW1vdmUocmN1ZGlyKTsKK30KKworCittb2R1bGVfaW5pdChyY3VjbGFzc2ljX3RyYWNlX2luaXQpOworbW9kdWxlX2V4aXQocmN1Y2xhc3NpY190cmFjZV9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiUGF1bCBFLiBNY0tlbm5leSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFkLUNvcHkgVXBkYXRlIHRyYWNpbmcgZm9yIGhpZXJhcmNoaWNhbCBpbXBsZW1lbnRhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA0MzM3MDYzLi5lNjMzMTA2IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtODUzLDYgKzg1MywxNSBAQAogCQlpZiAoUEZOX0RPV04ocC0+c3RhcnQpIDw9IFBGTl9ET1dOKGFkZHIpICYmCiAJCSAgICBQRk5fRE9XTihwLT5lbmQpID49IFBGTl9ET1dOKGFkZHIgKyBzaXplIC0gMSkpCiAJCQljb250aW51ZTsKKwkJLyoKKwkJICogaWYgYSByZXNvdXJjZSBpcyAiQlVTWSIsIGl0J3Mgbm90IGEgaGFyZHdhcmUgcmVzb3VyY2UKKwkJICogYnV0IGEgZHJpdmVyIG1hcHBpbmcgb2Ygc3VjaCBhIHJlc291cmNlOyB3ZSBkb24ndCB3YW50CisJCSAqIHRvIHdhcm4gZm9yIHRob3NlOyBzb21lIGRyaXZlcnMgbGVnaXRpbWF0ZWx5IG1hcCBvbmx5CisJCSAqIHBhcnRpYWwgaGFyZHdhcmUgcmVzb3VyY2VzLiAoZXhhbXBsZTogdmVzYWZiKQorCQkgKi8KKwkJaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9CVVNZKQorCQkJY29udGludWU7CisKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVzb3VyY2UgbWFwIHNhbml0eSBjaGVjayBjb25mbGljdDogIgogCQkgICAgICAgIjB4JWxseCAweCVsbHggMHglbGx4IDB4JWxseCAlc1xuIiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkciwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNzQ4ZmY5Mi4uZmZmMWM0YSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTIwOSw3ICsyMDksNiBAQAogCWhydGltZXJfaW5pdCgmcnRfYi0+cnRfcGVyaW9kX3RpbWVyLAogCQkJQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlydF9iLT5ydF9wZXJpb2RfdGltZXIuZnVuY3Rpb24gPSBzY2hlZF9ydF9wZXJpb2RfdGltZXI7Ci0JcnRfYi0+cnRfcGVyaW9kX3RpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfVU5MT0NLRUQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0X2JhbmR3aWR0aF9lbmFibGVkKHZvaWQpCkBAIC0xMTM5LDcgKzExMzgsNiBAQAogCiAJaHJ0aW1lcl9pbml0KCZycS0+aHJ0aWNrX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXJxLT5ocnRpY2tfdGltZXIuZnVuY3Rpb24gPSBocnRpY2s7Ci0JcnEtPmhydGlja190aW1lci5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX1BFUkNQVTsKIH0KICNlbHNlCS8qIENPTkZJR19TQ0hFRF9IUlRJQ0sgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBocnRpY2tfY2xlYXIoc3RydWN0IHJxICpycSkKQEAgLTQxOTIsNyArNDE5MCw2IEBACiAKIAlpZiAocCA9PSBycS0+aWRsZSkgewogCQlwLT5zdGltZSA9IGNwdXRpbWVfYWRkKHAtPnN0aW1lLCBzdGVhbCk7Ci0JCWFjY291bnRfZ3JvdXBfc3lzdGVtX3RpbWUocCwgc3RlYWwpOwogCQlpZiAoYXRvbWljX3JlYWQoJnJxLT5ucl9pb3dhaXQpID4gMCkKIAkJCWNwdXN0YXQtPmlvd2FpdCA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+aW93YWl0LCB0bXApOwogCQllbHNlCkBAIC00MzI4LDcgKzQzMjUsNyBAQAogCS8qCiAJICogVW5kZXJmbG93PwogCSAqLwotCWlmIChERUJVR19MT0NLU19XQVJOX09OKHZhbCA+IHByZWVtcHRfY291bnQoKSkpCisgICAgICAgaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odmFsID4gcHJlZW1wdF9jb3VudCgpIC0gKCEha2VybmVsX2xvY2tlZCgpKSkpCiAJCXJldHVybjsKIAkvKgogCSAqIElzIHRoZSBzcGlubG9jayBwb3J0aW9uIHVuZGVyZmxvd2luZz8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IGU3YzY5YTcuLjQ2NmU3NWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMTAyLDIwICsxMDIsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGxvY2FsX2JoX2Rpc2FibGUpOwogCi12b2lkIF9fbG9jYWxfYmhfZW5hYmxlKHZvaWQpCi17Ci0JV0FSTl9PTl9PTkNFKGluX2lycSgpKTsKLQotCS8qCi0JICogc29mdGlycXMgc2hvdWxkIG5ldmVyIGJlIGVuYWJsZWQgYnkgX19sb2NhbF9iaF9lbmFibGUoKSwKLQkgKiBpdCBhbHdheXMgbmVzdHMgaW5zaWRlIGxvY2FsX2JoX2VuYWJsZSgpIHNlY3Rpb25zOgotCSAqLwotCVdBUk5fT05fT05DRShzb2Z0aXJxX2NvdW50KCkgPT0gU09GVElSUV9PRkZTRVQpOwotCi0Jc3ViX3ByZWVtcHRfY291bnQoU09GVElSUV9PRkZTRVQpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoX19sb2NhbF9iaF9lbmFibGUpOwotCiAvKgogICogU3BlY2lhbC1jYXNlIC0gc29mdGlycXMgY2FuIHNhZmVseSBiZSBlbmFibGVkIGluCiAgKiBjb25kX3Jlc2NoZWRfc29mdGlycSgpLCBvciBieSBfX2RvX3NvZnRpcnEoKSwKQEAgLTI2OSw2ICsyNTUsNyBAQAogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKKwlyY3VfaXJxX2VudGVyKCk7CiAJaWYgKGlkbGVfY3B1KGNwdSkgJiYgIWluX2ludGVycnVwdCgpKSB7CiAJCV9faXJxX2VudGVyKCk7CiAJCXRpY2tfY2hlY2tfaWRsZShjcHUpOwpAQCAtMjk1LDkgKzI4Miw5IEBACiAKICNpZmRlZiBDT05GSUdfTk9fSFoKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aW1lciB3aGVlbCB1cGRhdGVzIGFyZSBwcm9wYWdhdGVkICovCi0JaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiBpZGxlX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpICYmICFuZWVkX3Jlc2NoZWQoKSkKLQkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygwKTsKIAlyY3VfaXJxX2V4aXQoKTsKKwlpZiAoaWRsZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJiAhaW5faW50ZXJydXB0KCkgJiYgIW5lZWRfcmVzY2hlZCgpKQorCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDApOwogI2VuZGlmCiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRsb2NrdXAuYyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKaW5kZXggZGMwYjNiZS4uMWFiNzkwYyAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRsb2NrdXAuYworKysgYi9rZXJuZWwvc29mdGxvY2t1cC5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIC8qCiAgKiBaZXJvIG1lYW5zIGluZmluaXRlIHRpbWVvdXQgLSBubyBjaGVja2luZyBkb25lOgogICovCi11bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3MgPSAxMjA7Cit1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgc3lzY3RsX2h1bmdfdGFza190aW1lb3V0X3NlY3MgPSA0ODA7CiAKIHVuc2lnbmVkIGxvbmcgX19yZWFkX21vc3RseSBzeXNjdGxfaHVuZ190YXNrX3dhcm5pbmdzID0gMTA7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IDk0YjUyN2UuLmViMjEyZjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtNiw2ICs2LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgpAQCAtMjQsMyArMjUsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHByaW50X3N0YWNrX3RyYWNlKTsKIAorLyoKKyAqIEFyY2hpdGVjdHVyZXMgdGhhdCBkbyBub3QgaW1wbGVtZW50IHNhdmVfc3RhY2tfdHJhY2VfdHNrIGdldCB0aGlzCisgKiB3ZWFrIGFsaWFzIGFuZCBhIG9uY2UtcGVyLWJvb3R1cCB3YXJuaW5nICh3aGVuZXZlciB0aGlzIGZhY2lsaXR5CisgKiBpcyB1dGlsaXplZCAtIGZvciBleGFtcGxlIGJ5IHByb2Nmcyk6CisgKi8KK19fd2VhayB2b2lkCitzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlXQVJOX09OQ0UoMSwgS0VSTl9JTkZPICJzYXZlX3N0YWNrX3RyYWNlX3RzaygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCBlYmU2NWMyLi5kMzU2ZDc5IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC05MDcsOCArOTA3LDggQEAKIAlzdHJ1Y3QgdGFza19jcHV0aW1lIGNwdXRpbWU7CiAJY3B1dGltZV90IGN1dGltZSwgY3N0aW1lOwogCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJdGhyZWFkX2dyb3VwX2NwdXRpbWUoY3VycmVudCwgJmNwdXRpbWUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWN1dGltZSA9IGN1cnJlbnQtPnNpZ25hbC0+Y3V0aW1lOwogCWNzdGltZSA9IGN1cnJlbnQtPnNpZ25hbC0+Y3N0aW1lOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggMGI2MjdkOS4uZmY2ZDQ1YyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMTIxLDYgKzEyMSwxMCBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKK2V4dGVybiBpbnQgc3lzY3RsX3RzYl9yYXRpbzsKKyNlbmRpZgorCiAjaWZkZWYgX19ocHBhX18KIGV4dGVybiBpbnQgcHdyc3dfZW5hYmxlZDsKIGV4dGVybiBpbnQgdW5hbGlnbmVkX2VuYWJsZWQ7CkBAIC00NTEsNiArNDU1LDE2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAidHNiLXJhdGlvIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90c2JfcmF0aW8sCisJCS5tYXhsZW4JCT0gc2l6ZW9mIChpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKyNlbmRpZgogI2lmZGVmIF9faHBwYV9fCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX0hQUEFfUFdSU1csCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsX2NoZWNrLmMgYi9rZXJuZWwvc3lzY3RsX2NoZWNrLmMKaW5kZXggYzM1ZGEyM2EuLmZhZmViNDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGxfY2hlY2suYworKysgYi9rZXJuZWwvc3lzY3RsX2NoZWNrLmMKQEAgLTczMCw3ICs3MzAsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfZnNfeGZzX3RhYmxlW10gPSB7Ci0JeyBYRlNfUkVTVFJJQ1RfQ0hPV04sCSJyZXN0cmljdF9jaG93biIgfSwKIAl7IFhGU19TR0lEX0lOSEVSSVQsCSJpcml4X3NnaWRfaW5oZXJpdCIgfSwKIAl7IFhGU19TWU1MSU5LX01PREUsCSJpcml4X3N5bWxpbmtfbW9kZSIgfSwKIAl7IFhGU19QQU5JQ19NQVNLLAkicGFuaWNfbWFzayIgfSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggOGZmMTVlNS4uZjVmNzkzZCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogewogCWVudW0gaHJ0aW1lcl9yZXN0YXJ0IHJlcyA9IEhSVElNRVJfTk9SRVNUQVJUOwogCi0Jd3JpdGVfc2VxbG9ja19pcnEoJnh0aW1lX2xvY2spOworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCiAJc3dpdGNoICh0aW1lX3N0YXRlKSB7CiAJY2FzZSBUSU1FX09LOgpAQCAtMTY0LDcgKzE2NCw3IEBACiAJfQogCXVwZGF0ZV92c3lzY2FsbCgmeHRpbWUsIGNsb2NrKTsKIAotCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAKIAlyZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IDM0MmZjOWMuLjhmM2ZjMjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCWlmIChuZWVkX3Jlc2NoZWQoKSkKIAkJZ290byBlbmQ7CiAKLQlpZiAodW5saWtlbHkobG9jYWxfc29mdGlycV9wZW5kaW5nKCkpKSB7CisJaWYgKHVubGlrZWx5KGxvY2FsX3NvZnRpcnFfcGVuZGluZygpICYmIGNwdV9vbmxpbmUoY3B1KSkpIHsKIAkJc3RhdGljIGludCByYXRlbGltaXQ7CiAKIAkJaWYgKHJhdGVsaW1pdCA8IDEwKSB7CkBAIC0yODIsOCArMjgyLDMxIEBACiAJLyogU2NoZWR1bGUgdGhlIHRpY2ssIGlmIHdlIGFyZSBhdCBsZWFzdCBvbmUgamlmZmllIG9mZiAqLwogCWlmICgobG9uZylkZWx0YV9qaWZmaWVzID49IDEpIHsKIAorCQkvKgorCQkqIGNhbGN1bGF0ZSB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSBuZXh0IHRpbWVyIHdoZWVsCisJCSogdGltZXIKKwkJKi8KKwkJZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhsYXN0X3VwZGF0ZSwgdGlja19wZXJpb2QudHY2NCAqCisJCQkJICAgZGVsdGFfamlmZmllcyk7CisKKwkJLyoKKwkJICogSWYgdGhpcyBjcHUgaXMgdGhlIG9uZSB3aGljaCB1cGRhdGVzIGppZmZpZXMsIHRoZW4KKwkJICogZ2l2ZSB1cCB0aGUgYXNzaWdubWVudCBhbmQgbGV0IGl0IGJlIHRha2VuIGJ5IHRoZQorCQkgKiBjcHUgd2hpY2ggcnVucyB0aGUgdGljayB0aW1lciBuZXh0LCB3aGljaCBtaWdodCBiZQorCQkgKiB0aGlzIGNwdSBhcyB3ZWxsLiBJZiB3ZSBkb24ndCBkcm9wIHRoaXMgaGVyZSB0aGUKKwkJICogamlmZmllcyBtaWdodCBiZSBzdGFsZSBhbmQgZG9fdGltZXIoKSBuZXZlcgorCQkgKiBpbnZva2VkLgorCQkgKi8KKwkJaWYgKGNwdSA9PSB0aWNrX2RvX3RpbWVyX2NwdSkKKwkJCXRpY2tfZG9fdGltZXJfY3B1ID0gVElDS19ET19USU1FUl9OT05FOworCiAJCWlmIChkZWx0YV9qaWZmaWVzID4gMSkKIAkJCWNwdV9zZXQoY3B1LCBub2h6X2NwdV9tYXNrKTsKKworCQkvKiBTa2lwIHJlcHJvZ3JhbSBvZiBldmVudCBpZiBpdHMgbm90IGNoYW5nZWQgKi8KKwkJaWYgKHRzLT50aWNrX3N0b3BwZWQgJiYga3RpbWVfZXF1YWwoZXhwaXJlcywgZGV2LT5uZXh0X2V2ZW50KSkKKwkJCWdvdG8gb3V0OworCiAJCS8qCiAJCSAqIG5vaHpfc3RvcF9zY2hlZF90aWNrIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBiZWZvcmUKIAkJICogdGhlIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIGlzIGNhbGxlZC4gVGhpcyBoYXBwZW5zIHdoZW4KQEAgLTMwNiwxNyArMzI5LDYgQEAKIAkJCXJjdV9lbnRlcl9ub2h6KCk7CiAJCX0KIAotCQkvKgotCQkgKiBJZiB0aGlzIGNwdSBpcyB0aGUgb25lIHdoaWNoIHVwZGF0ZXMgamlmZmllcywgdGhlbgotCQkgKiBnaXZlIHVwIHRoZSBhc3NpZ25tZW50IGFuZCBsZXQgaXQgYmUgdGFrZW4gYnkgdGhlCi0JCSAqIGNwdSB3aGljaCBydW5zIHRoZSB0aWNrIHRpbWVyIG5leHQsIHdoaWNoIG1pZ2h0IGJlCi0JCSAqIHRoaXMgY3B1IGFzIHdlbGwuIElmIHdlIGRvbid0IGRyb3AgdGhpcyBoZXJlIHRoZQotCQkgKiBqaWZmaWVzIG1pZ2h0IGJlIHN0YWxlIGFuZCBkb190aW1lcigpIG5ldmVyCi0JCSAqIGludm9rZWQuCi0JCSAqLwotCQlpZiAoY3B1ID09IHRpY2tfZG9fdGltZXJfY3B1KQotCQkJdGlja19kb190aW1lcl9jcHUgPSBUSUNLX0RPX1RJTUVSX05PTkU7Ci0KIAkJdHMtPmlkbGVfc2xlZXBzKys7CiAKIAkJLyoKQEAgLTMzMiwxMiArMzQ0LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJLyoKLQkJICogY2FsY3VsYXRlIHRoZSBleHBpcnkgdGltZSBmb3IgdGhlIG5leHQgdGltZXIgd2hlZWwKLQkJICogdGltZXIKLQkJICovCi0JCWV4cGlyZXMgPSBrdGltZV9hZGRfbnMobGFzdF91cGRhdGUsIHRpY2tfcGVyaW9kLnR2NjQgKgotCQkJCSAgICAgICBkZWx0YV9qaWZmaWVzKTsKKwkJLyogTWFyayBleHBpcmllcyAqLwogCQl0cy0+aWRsZV9leHBpcmVzID0gZXhwaXJlczsKIAogCQlpZiAodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSElHSFJFUykgewpAQCAtNjgxLDcgKzY4OCw2IEBACiAJICovCiAJaHJ0aW1lcl9pbml0KCZ0cy0+c2NoZWRfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CiAJdHMtPnNjaGVkX3RpbWVyLmZ1bmN0aW9uID0gdGlja19zY2hlZF90aW1lcjsKLQl0cy0+c2NoZWRfdGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFU7CiAKIAkvKiBHZXQgdGhlIG5leHQgcGVyaW9kIChwZXIgY3B1KSAqLwogCWhydGltZXJfc2V0X2V4cGlyZXMoJnRzLT5zY2hlZF90aW1lciwgdGlja19pbml0X2ppZmZ5X3VwZGF0ZSgpKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jIGIva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMKaW5kZXggNzZmMzRjMC4uMWQ2MDFhNyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMKKysrIGIva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMKQEAgLTY5LDYgKzY5LDcgQEAKIHsKIAlzZXRfYml0KFJCX0JVRkZFUlNfT05fQklULCAmcmluZ19idWZmZXJfZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2luZ19vbik7CiAKIC8qKgogICogdHJhY2luZ19vZmYgLSB0dXJuIG9mZiBhbGwgdHJhY2luZyBidWZmZXJzCkBAIC04Miw2ICs4Myw3IEBACiB7CiAJY2xlYXJfYml0KFJCX0JVRkZFUlNfT05fQklULCAmcmluZ19idWZmZXJfZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2luZ19vZmYpOwogCiAvKioKICAqIHRyYWNpbmdfb2ZmX3Blcm1hbmVudCAtIHBlcm1hbmVudGx5IGRpc2FibGUgcmluZyBidWZmZXJzCkBAIC0xMTEsMTIgKzExMywxNCBAQAogCiAJcmV0dXJuIHRpbWU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl90aW1lX3N0YW1wKTsKIAogdm9pZCByaW5nX2J1ZmZlcl9ub3JtYWxpemVfdGltZV9zdGFtcChpbnQgY3B1LCB1NjQgKnRzKQogewogCS8qIEp1c3Qgc3R1cGlkIHRlc3RpbmcgdGhlIG5vcm1hbGl6ZSBmdW5jdGlvbiBhbmQgZGVsdGFzICovCiAJKnRzID4+PSBERUJVR19TSElGVDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX25vcm1hbGl6ZV90aW1lX3N0YW1wKTsKIAogI2RlZmluZSBSQl9FVk5UX0hEUl9TSVpFIChzaXplb2Yoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50KSkKICNkZWZpbmUgUkJfQUxJR05NRU5UX1NISUZUCTIKQEAgLTE2Niw2ICsxNzAsNyBAQAogewogCXJldHVybiByYl9ldmVudF9sZW5ndGgoZXZlbnQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZXZlbnRfbGVuZ3RoKTsKIAogLyogaW5saW5lIGZvciByaW5nIGJ1ZmZlciBmYXN0IHBhdGhzICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKgpAQCAtMTg3LDYgKzE5Miw3IEBACiB7CiAJcmV0dXJuIHJiX2V2ZW50X2RhdGEoZXZlbnQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZXZlbnRfZGF0YSk7CiAKICNkZWZpbmUgZm9yX2VhY2hfYnVmZmVyX2NwdShidWZmZXIsIGNwdSkJCVwKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGJ1ZmZlci0+Y3B1bWFzaykKQEAgLTQyNyw3ICs0MzMsNyBAQAogCiAvKioKICAqIHJpbmdfYnVmZmVyX2FsbG9jIC0gYWxsb2NhdGUgYSBuZXcgcmluZ19idWZmZXIKLSAqIEBzaXplOiB0aGUgc2l6ZSBpbiBieXRlcyB0aGF0IGlzIG5lZWRlZC4KKyAqIEBzaXplOiB0aGUgc2l6ZSBpbiBieXRlcyBwZXIgY3B1IHRoYXQgaXMgbmVlZGVkLgogICogQGZsYWdzOiBhdHRyaWJ1dGVzIHRvIHNldCBmb3IgdGhlIHJpbmcgYnVmZmVyLgogICoKICAqIEN1cnJlbnRseSB0aGUgb25seSBmbGFnIHRoYXQgaXMgYXZhaWxhYmxlIGlzIHRoZSBSQl9GTF9PVkVSV1JJVEUKQEAgLTQ5MCw2ICs0OTYsNyBAQAogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9hbGxvYyk7CiAKIC8qKgogICogcmluZ19idWZmZXJfZnJlZSAtIGZyZWUgYSByaW5nIGJ1ZmZlci4KQEAgLTUwNSw2ICs1MTIsNyBAQAogCiAJa2ZyZWUoYnVmZmVyKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2ZyZWUpOwogCiBzdGF0aWMgdm9pZCByYl9yZXNldF9jcHUoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIpOwogCkBAIC02ODAsNiArNjg4LDcgQEAKIAltdXRleF91bmxvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCXJldHVybiAtRU5PTUVNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfcmVzaXplKTsKIAogc3RhdGljIGlubGluZSBpbnQgcmJfbnVsbF9ldmVudChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewpAQCAtMTMwNCw2ICsxMzEzLDcgQEAKIAlmdHJhY2VfcHJlZW1wdF9lbmFibGUocmVzY2hlZCk7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9sb2NrX3Jlc2VydmUpOwogCiBzdGF0aWMgdm9pZCByYl9jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsCiAJCSAgICAgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCkBAIC0xMzUwLDYgKzEzNjAsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl93cml0ZSAtIHdyaXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciB3aXRob3V0IHJlc2VydmluZwpAQCAtMTQxMSw2ICsxNDIyLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl93cml0ZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJiX3Blcl9jcHVfZW1wdHkoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIpCiB7CkBAIC0xNDM3LDYgKzE0NDksNyBAQAogewogCWF0b21pY19pbmMoJmJ1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3JlY29yZF9kaXNhYmxlKTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9yZWNvcmRfZW5hYmxlIC0gZW5hYmxlIHdyaXRlcyB0byB0aGUgYnVmZmVyCkBAIC0xNDQ5LDYgKzE0NjIsNyBAQAogewogCWF0b21pY19kZWMoJmJ1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3JlY29yZF9lbmFibGUpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX3JlY29yZF9kaXNhYmxlX2NwdSAtIHN0b3AgYWxsIHdyaXRlcyBpbnRvIHRoZSBjcHVfYnVmZmVyCkBAIC0xNDcwLDYgKzE0ODQsNyBAQAogCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKIAlhdG9taWNfaW5jKCZjcHVfYnVmZmVyLT5yZWNvcmRfZGlzYWJsZWQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfcmVjb3JkX2Rpc2FibGVfY3B1KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9yZWNvcmRfZW5hYmxlX2NwdSAtIGVuYWJsZSB3cml0ZXMgdG8gdGhlIGJ1ZmZlcgpAQCAtMTQ4OSw2ICsxNTA0LDcgQEAKIAljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07CiAJYXRvbWljX2RlYygmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3JlY29yZF9lbmFibGVfY3B1KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdSAtIGdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBjcHUgYnVmZmVyCkBAIC0xNTA1LDYgKzE1MjEsNyBAQAogCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKIAlyZXR1cm4gY3B1X2J1ZmZlci0+ZW50cmllczsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9vdmVycnVuX2NwdSAtIGdldCB0aGUgbnVtYmVyIG9mIG92ZXJydW5zIGluIGEgY3B1X2J1ZmZlcgpAQCAtMTUyMSw2ICsxNTM4LDcgQEAKIAljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07CiAJcmV0dXJuIGNwdV9idWZmZXItPm92ZXJydW47CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9vdmVycnVuX2NwdSk7CiAKIC8qKgogICogcmluZ19idWZmZXJfZW50cmllcyAtIGdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBidWZmZXIKQEAgLTE1NDMsNiArMTU2MSw3IEBACiAKIAlyZXR1cm4gZW50cmllczsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2VudHJpZXMpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX292ZXJydW5fY3B1IC0gZ2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnJ1bnMgaW4gYnVmZmVyCkBAIC0xNTY1LDYgKzE1ODQsNyBAQAogCiAJcmV0dXJuIG92ZXJydW5zOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfb3ZlcnJ1bnMpOwogCiBzdGF0aWMgdm9pZCByYl9pdGVyX3Jlc2V0KHN0cnVjdCByaW5nX2J1ZmZlcl9pdGVyICppdGVyKQogewpAQCAtMTYwMCw2ICsxNjIwLDcgQEAKIAlyYl9pdGVyX3Jlc2V0KGl0ZXIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9pdGVyX3Jlc2V0KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9pdGVyX2VtcHR5IC0gY2hlY2sgaWYgYW4gaXRlcmF0b3IgaGFzIG5vIG1vcmUgdG8gcmVhZApAQCAtMTYxNCw2ICsxNjM1LDcgQEAKIAlyZXR1cm4gaXRlci0+aGVhZF9wYWdlID09IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlICYmCiAJCWl0ZXItPmhlYWQgPT0gcmJfY29tbWl0X2luZGV4KGNwdV9idWZmZXIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfaXRlcl9lbXB0eSk7CiAKIHN0YXRpYyB2b2lkCiByYl91cGRhdGVfcmVhZF9zdGFtcChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKQEAgLTE4ODAsNiArMTkwMiw3IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3BlZWspOwogCiBzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKIHJiX2l0ZXJfcGVlayhzdHJ1Y3QgcmluZ19idWZmZXJfaXRlciAqaXRlciwgdTY0ICp0cykKQEAgLTE5NDAsNiArMTk2Myw3IEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2l0ZXJfcGVlayk7CiAKIC8qKgogICogcmluZ19idWZmZXJfcGVlayAtIHBlZWsgYXQgdGhlIG5leHQgZXZlbnQgdG8gYmUgcmVhZApAQCAtMjAxNyw2ICsyMDQxLDcgQEAKIAogCXJldHVybiBldmVudDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2NvbnN1bWUpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX3JlYWRfc3RhcnQgLSBzdGFydCBhIG5vbiBjb25zdW1pbmcgcmVhZCBvZiB0aGUgYnVmZmVyCkBAIC0yMDU5LDYgKzIwODQsNyBAQAogCiAJcmV0dXJuIGl0ZXI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9yZWFkX3N0YXJ0KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9maW5pc2ggLSBmaW5pc2ggcmVhZGluZyB0aGUgaXRlcmF0b3Igb2YgdGhlIGJ1ZmZlcgpAQCAtMjA3NSw2ICsyMTAxLDcgQEAKIAlhdG9taWNfZGVjKCZjcHVfYnVmZmVyLT5yZWNvcmRfZGlzYWJsZWQpOwogCWtmcmVlKGl0ZXIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfcmVhZF9maW5pc2gpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX3JlYWQgLSByZWFkIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHJpbmcgYnVmZmVyIGJ5IHRoZSBpdGVyYXRvcgpAQCAtMjEwMSw2ICsyMTI4LDcgQEAKIAogCXJldHVybiBldmVudDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3JlYWQpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX3NpemUgLSByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHJpbmcgYnVmZmVyIChpbiBieXRlcykKQEAgLTIxMTAsNiArMjEzOCw3IEBACiB7CiAJcmV0dXJuIEJVRl9QQUdFX1NJWkUgKiBidWZmZXItPnBhZ2VzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfc2l6ZSk7CiAKIHN0YXRpYyB2b2lkCiByYl9yZXNldF9jcHUoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIpCkBAIC0yMTU2LDYgKzIxODUsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X2J1ZmZlci0+cmVhZGVyX2xvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3Jlc2V0X2NwdSk7CiAKIC8qKgogICogcmluZ19idWZmZXJfcmVzZXQgLSByZXNldCBhIHJpbmcgYnVmZmVyCkBAIC0yMTY4LDYgKzIxOTgsNyBAQAogCWZvcl9lYWNoX2J1ZmZlcl9jcHUoYnVmZmVyLCBjcHUpCiAJCXJpbmdfYnVmZmVyX3Jlc2V0X2NwdShidWZmZXIsIGNwdSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9yZXNldCk7CiAKIC8qKgogICogcmluZF9idWZmZXJfZW1wdHkgLSBpcyB0aGUgcmluZyBidWZmZXIgZW1wdHk/CkBAIC0yMTg2LDYgKzIyMTcsNyBAQAogCX0KIAlyZXR1cm4gMTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2VtcHR5KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9lbXB0eV9jcHUgLSBpcyBhIGNwdSBidWZmZXIgb2YgYSByaW5nIGJ1ZmZlciBlbXB0eT8KQEAgLTIyMDIsNiArMjIzNCw3IEBACiAJY3B1X2J1ZmZlciA9IGJ1ZmZlci0+YnVmZmVyc1tjcHVdOwogCXJldHVybiByYl9wZXJfY3B1X2VtcHR5KGNwdV9idWZmZXIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZW1wdHlfY3B1KTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9zd2FwX2NwdSAtIHN3YXAgYSBDUFUgYnVmZmVyIGJldHdlZW4gdHdvIHJpbmcgYnVmZmVycwpAQCAtMjI1MCw2ICsyMjgzLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfc3dhcF9jcHUpOwogCiBzdGF0aWMgdm9pZCByYl9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfZGF0YV9wYWdlICpicGFnZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggZjRiYjM4MC4uNDE4NWQ1MiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgpAQCAtMTMxMCw3ICsxMzA5LDcgQEAKIAlUUkFDRV9GSUxFX0FOTk9UQVRFCT0gMiwKIH07CiAKLXN0YXRpYyB2b2lkIHRyYWNlX2l0ZXJhdG9yX2luY3JlbWVudChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBjcHUpCitzdGF0aWMgdm9pZCB0cmFjZV9pdGVyYXRvcl9pbmNyZW1lbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewogCS8qIERvbid0IGFsbG93IGZ0cmFjZSB0byB0cmFjZSBpbnRvIHRoZSByaW5nIGJ1ZmZlcnMgKi8KIAlmdHJhY2VfZGlzYWJsZV9jcHUoKTsKQEAgLTEzODksNyArMTM4OCw3IEBACiAJaXRlci0+ZW50ID0gX19maW5kX25leHRfZW50cnkoaXRlciwgJml0ZXItPmNwdSwgJml0ZXItPnRzKTsKIAogCWlmIChpdGVyLT5lbnQpCi0JCXRyYWNlX2l0ZXJhdG9yX2luY3JlbWVudChpdGVyLCBpdGVyLT5jcHUpOworCQl0cmFjZV9pdGVyYXRvcl9pbmNyZW1lbnQoaXRlcik7CiAKIAlyZXR1cm4gaXRlci0+ZW50ID8gaXRlciA6IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYwppbmRleCAwMWJlY2YxLi5hNTc3OWJkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zeXNwcm9mLmMKQEAgLTIwMiw3ICsyMDIsNiBAQAogCiAJaHJ0aW1lcl9pbml0KGhydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJaHJ0aW1lci0+ZnVuY3Rpb24gPSBzdGFja190cmFjZV90aW1lcl9mbjsKLQlocnRpbWVyLT5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX1BFUkNQVTsKIAogCWhydGltZXJfc3RhcnQoaHJ0aW1lciwgbnNfdG9fa3RpbWUoc2FtcGxlX3BlcmlvZCksIEhSVElNRVJfTU9ERV9SRUwpOwogfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBiMGYyMzllLi4yZTc1NDc4IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMjUyLDYgKzI1MiwxNCBAQAogCSAgdGltZXIgcm91dGluZXMgdG8gdHJhY2sgdGhlIGxpZmUgdGltZSBvZiB0aW1lciBvYmplY3RzIGFuZAogCSAgdmFsaWRhdGUgdGhlIHRpbWVyIG9wZXJhdGlvbnMuCiAKK2NvbmZpZyBERUJVR19PQkpFQ1RTX0VOQUJMRV9ERUZBVUxUCisJaW50ICJkZWJ1Z19vYmplY3RzIGJvb3R1cCBkZWZhdWx0IHZhbHVlICgwLTEpIgorICAgICAgICByYW5nZSAwIDEKKyAgICAgICAgZGVmYXVsdCAiMSIKKyAgICAgICAgZGVwZW5kcyBvbiBERUJVR19PQkpFQ1RTCisgICAgICAgIGhlbHAKKyAgICAgICAgICBEZWJ1ZyBvYmplY3RzIGJvb3QgcGFyYW1ldGVyIGRlZmF1bHQgdmFsdWUKKwogY29uZmlnIERFQlVHX1NMQUIKIAlib29sICJEZWJ1ZyBzbGFiIG1lbW9yeSBhbGxvY2F0aW9ucyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBTTEFCCkBAIC01NDUsNiArNTUzLDE2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUJVR19OT1RJRklFUlMKKwlib29sICJEZWJ1ZyBub3RpZmllciBjYWxsIGNoYWlucyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gc2FuaXR5IGNoZWNraW5nIGZvciBub3RpZmllciBjYWxsIGNoYWlucy4KKwkgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGtlcm5lbCBkZXZlbG9wZXJzIHRvIG1ha2Ugc3VyZSB0aGF0CisJICBtb2R1bGVzIHByb3Blcmx5IHVucmVnaXN0ZXIgdGhlbXNlbHZlcyBmcm9tIG5vdGlmaWVyIGNoYWlucy4KKwkgIFRoaXMgaXMgYSByZWxhdGl2ZWx5IGNoZWFwIGNoZWNrIGJ1dCBpZiB5b3UgY2FyZSBhYm91dCBtYXhpbXVtCisJICBwZXJmb3JtYW5jZSwgc2F5IE4uCisKIGNvbmZpZyBGUkFNRV9QT0lOVEVSCiAJYm9vbCAiQ29tcGlsZSB0aGUga2VybmVsIHdpdGggZnJhbWUgcG9pbnRlcnMiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgXApAQCAtNjE5LDYgKzYzNywxOSBAQAogCiAJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KIAorY29uZmlnIFJDVV9DUFVfU1RBTExfREVURUNUT1IKKwlib29sICJDaGVjayBmb3Igc3RhbGxlZCBDUFVzIGRlbGF5aW5nIFJDVSBncmFjZSBwZXJpb2RzIgorCWRlcGVuZHMgb24gQ0xBU1NJQ19SQ1UgfHwgVFJFRV9SQ1UKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgUkNVIHRvIHByaW50ayBpbmZvcm1hdGlvbiBvbiB3aGljaAorCSAgQ1BVcyBhcmUgZGVsYXlpbmcgdGhlIGN1cnJlbnQgZ3JhY2UgcGVyaW9kLCBidXQgb25seSB3aGVuCisJICB0aGUgZ3JhY2UgcGVyaW9kIGV4dGVuZHMgZm9yIGV4Y2Vzc2l2ZSB0aW1lIHBlcmlvZHMuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IFJDVSB0byBwZXJmb3JtIHN1Y2ggY2hlY2tzLgorCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKwogY29uZmlnIEtQUk9CRVNfU0FOSVRZX1RFU1QKIAlib29sICJLcHJvYmVzIHNhbml0eSB0ZXN0cyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApAQCAtNjk5LDYgKzczMCw3IEBACiBjb25maWcgRkFJTFNMQUIKIAlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3Iga21hbGxvYyIKIAlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTgorCWRlcGVuZHMgb24gU0xBQiB8fCBTTFVCCiAJaGVscAogCSAgUHJvdmlkZSBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3Iga21hbGxvYy4KIApkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IGUzYWIzNzQuLjVkOTliZTEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTQ1LDcgKzQ1LDkgQEAKIHN0YXRpYyBpbnQJCQlkZWJ1Z19vYmplY3RzX21heGNoYWluIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19maXh1cHMgX19yZWFkX21vc3RseTsKIHN0YXRpYyBpbnQJCQlkZWJ1Z19vYmplY3RzX3dhcm5pbmdzIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19lbmFibGVkIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19lbmFibGVkIF9fcmVhZF9tb3N0bHkKKwkJCQk9IENPTkZJR19ERUJVR19PQkpFQ1RTX0VOQUJMRV9ERUZBVUxUOworCiBzdGF0aWMgc3RydWN0IGRlYnVnX29ial9kZXNjcgkqZGVzY3JfdGVzdCAgX19yZWFkX21vc3RseTsKIAogc3RhdGljIGludCBfX2luaXQgZW5hYmxlX29iamVjdF9kZWJ1ZyhjaGFyICpzdHIpCmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCA1ZjZjNjI5Li5mYTJkYzRlIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTIxLDkgKzIxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KQEAgLTM2LDIyICszOSw2IEBACiAjZGVmaW5lIE9GRlNFVCh2YWwsYWxpZ24pICgodW5zaWduZWQgbG9uZykJXAogCSAgICAgICAgICAgICAgICAgICAoICh2YWwpICYgKCAoYWxpZ24pIC0gMSkpKQogCi0jZGVmaW5lIFNHX0VOVF9WSVJUX0FERFJFU1Moc2cpCShzZ192aXJ0KChzZykpKQotI2RlZmluZSBTR19FTlRfUEhZU19BRERSRVNTKHNnKQl2aXJ0X3RvX2J1cyhTR19FTlRfVklSVF9BRERSRVNTKHNnKSkKLQotLyoKLSAqIE1heGltdW0gYWxsb3dhYmxlIG51bWJlciBvZiBjb250aWd1b3VzIHNsYWJzIHRvIG1hcCwKLSAqIG11c3QgYmUgYSBwb3dlciBvZiAyLiAgV2hhdCBpcyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgPwotICogVGhlIGNvbXBsZXhpdHkgb2Yge21hcCx1bm1hcH1fc2luZ2xlIGlzIGxpbmVhcmx5IGRlcGVuZGVudCBvbiB0aGlzIHZhbHVlLgotICovCi0jZGVmaW5lIElPX1RMQl9TRUdTSVpFCTEyOAotCi0vKgotICogbG9nIG9mIHRoZSBzaXplIG9mIGVhY2ggSU8gVExCIHNsYWIuICBUaGUgbnVtYmVyIG9mIHNsYWJzIGlzIGNvbW1hbmQgbGluZQotICogY29udHJvbGxhYmxlLgotICovCi0jZGVmaW5lIElPX1RMQl9TSElGVCAxMQotCiAjZGVmaW5lIFNMQUJTX1BFUl9QQUdFICgxIDw8IChQQUdFX1NISUZUIC0gSU9fVExCX1NISUZUKSkKIAogLyoKQEAgLTEwMiw3ICs4OSwxMCBAQAogICogV2UgbmVlZCB0byBzYXZlIGF3YXkgdGhlIG9yaWdpbmFsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBhIG1hcHBlZCBlbnRyeQogICogZm9yIHRoZSBzeW5jIG9wZXJhdGlvbnMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoqaW9fdGxiX29yaWdfYWRkcjsKK3N0YXRpYyBzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgeworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBvZmZzZXQ7Cit9ICppb190bGJfb3JpZ19hZGRyOwogCiAvKgogICogUHJvdGVjdCB0aGUgYWJvdmUgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoZSBtYXAgYW5kIHVubWFwIGNhbGxzCkBAIC0xMjYsNiArMTE2LDcyIEBACiBfX3NldHVwKCJzd2lvdGxiPSIsIHNldHVwX2lvX3RsYl9ucGFnZXMpOwogLyogbWFrZSBpb190bGJfb3ZlcmZsb3cgdHVuYWJsZSB0b28/ICovCiAKK3ZvaWQgKiBfX3dlYWsgc3dpb3RsYl9hbGxvY19ib290KHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIG5zbGFicykKK3sKKwlyZXR1cm4gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoc2l6ZSk7Cit9CisKK3ZvaWQgKiBfX3dlYWsgc3dpb3RsYl9hbGxvYyh1bnNpZ25lZCBvcmRlciwgdW5zaWduZWQgbG9uZyBuc2xhYnMpCit7CisJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLCBvcmRlcik7Cit9CisKK2RtYV9hZGRyX3QgX193ZWFrIHN3aW90bGJfcGh5c190b19idXMocGh5c19hZGRyX3QgcGFkZHIpCit7CisJcmV0dXJuIHBhZGRyOworfQorCitwaHlzX2FkZHJfdCBfX3dlYWsgc3dpb3RsYl9idXNfdG9fcGh5cyhkbWFfYWRkcl90IGJhZGRyKQoreworCXJldHVybiBiYWRkcjsKK30KKworc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl92aXJ0X3RvX2J1cyh2b2xhdGlsZSB2b2lkICphZGRyZXNzKQoreworCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fYnVzKHZpcnRfdG9fcGh5cyhhZGRyZXNzKSk7Cit9CisKK3N0YXRpYyB2b2lkICpzd2lvdGxiX2J1c190b192aXJ0KGRtYV9hZGRyX3QgYWRkcmVzcykKK3sKKwlyZXR1cm4gcGh5c190b192aXJ0KHN3aW90bGJfYnVzX3RvX3BoeXMoYWRkcmVzcykpOworfQorCitpbnQgX193ZWFrIHN3aW90bGJfYXJjaF9yYW5nZV9uZWVkc19tYXBwaW5nKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IHN3aW90bGJfc2dfdG9fYnVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJcmV0dXJuIHN3aW90bGJfcGh5c190b19idXMocGFnZV90b19waHlzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBzd2lvdGxiX3ByaW50X2luZm8odW5zaWduZWQgbG9uZyBieXRlcykKK3sKKwlwaHlzX2FkZHJfdCBwc3RhcnQsIHBlbmQ7CisJZG1hX2FkZHJfdCBic3RhcnQsIGJlbmQ7CisKKwlwc3RhcnQgPSB2aXJ0X3RvX3BoeXMoaW9fdGxiX3N0YXJ0KTsKKwlwZW5kID0gdmlydF90b19waHlzKGlvX3RsYl9lbmQpOworCisJYnN0YXJ0ID0gc3dpb3RsYl9waHlzX3RvX2J1cyhwc3RhcnQpOworCWJlbmQgPSBzd2lvdGxiX3BoeXNfdG9fYnVzKHBlbmQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUGxhY2luZyAlbHVNQiBzb2Z0d2FyZSBJTyBUTEIgYmV0d2VlbiAlcCAtICVwXG4iLAorCSAgICAgICBieXRlcyA+PiAyMCwgaW9fdGxiX3N0YXJ0LCBpb190bGJfZW5kKTsKKwlpZiAocHN0YXJ0ICE9IGJzdGFydCB8fCBwZW5kICE9IGJlbmQpCisJCXByaW50ayhLRVJOX0lORk8gInNvZnR3YXJlIElPIFRMQiBhdCBwaHlzICUjbGx4IC0gJSNsbHgiCisJCSAgICAgICAiIGJ1cyAlI2xseCAtICUjbGx4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwc3RhcnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlbmQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJzdGFydCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmVuZCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAlI2xseCAtICUjbGx4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwc3RhcnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBlbmQpOworfQorCiAvKgogICogU3RhdGljYWxseSByZXNlcnZlIGJvdW5jZSBidWZmZXIgc3BhY2UgYW5kIGluaXRpYWxpemUgYm91bmNlIGJ1ZmZlciBkYXRhCiAgKiBzdHJ1Y3R1cmVzIGZvciB0aGUgc29mdHdhcmUgSU8gVExCIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBETUEgQVBJLgpAQCAtMTQ1LDcgKzIwMSw3IEBACiAJLyoKIAkgKiBHZXQgSU8gVExCIG1lbW9yeSBmcm9tIHRoZSBsb3cgcGFnZXMKIAkgKi8KLQlpb190bGJfc3RhcnQgPSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhieXRlcyk7CisJaW9fdGxiX3N0YXJ0ID0gc3dpb3RsYl9hbGxvY19ib290KGJ5dGVzLCBpb190bGJfbnNsYWJzKTsKIAlpZiAoIWlvX3RsYl9zdGFydCkKIAkJcGFuaWMoIkNhbm5vdCBhbGxvY2F0ZSBTV0lPVExCIGJ1ZmZlciIpOwogCWlvX3RsYl9lbmQgPSBpb190bGJfc3RhcnQgKyBieXRlczsKQEAgLTE1OSw3ICsyMTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpb190bGJfbnNsYWJzOyBpKyspCiAgCQlpb190bGJfbGlzdFtpXSA9IElPX1RMQl9TRUdTSVpFIC0gT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKTsKIAlpb190bGJfaW5kZXggPSAwOwotCWlvX3RsYl9vcmlnX2FkZHIgPSBhbGxvY19ib290bWVtKGlvX3RsYl9uc2xhYnMgKiBzaXplb2YoY2hhciAqKSk7CisJaW9fdGxiX29yaWdfYWRkciA9IGFsbG9jX2Jvb3RtZW0oaW9fdGxiX25zbGFicyAqIHNpemVvZihzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIpKTsKIAogCS8qCiAJICogR2V0IHRoZSBvdmVyZmxvdyBlbWVyZ2VuY3kgYnVmZmVyCkBAIC0xNjgsOCArMjI0LDcgQEAKIAlpZiAoIWlvX3RsYl9vdmVyZmxvd19idWZmZXIpCiAJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgU1dJT1RMQiBvdmVyZmxvdyBidWZmZXIhXG4iKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlBsYWNpbmcgc29mdHdhcmUgSU8gVExCIGJldHdlZW4gMHglbHggLSAweCVseFxuIiwKLQkgICAgICAgdmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSwgdmlydF90b19idXMoaW9fdGxiX2VuZCkpOworCXN3aW90bGJfcHJpbnRfaW5mbyhieXRlcyk7CiB9CiAKIHZvaWQgX19pbml0CkBAIC0yMDIsOCArMjU3LDcgQEAKIAlieXRlcyA9IGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUOwogCiAJd2hpbGUgKChTTEFCU19QRVJfUEFHRSA8PCBvcmRlcikgPiBJT19UTEJfTUlOX1NMQUJTKSB7Ci0JCWlvX3RsYl9zdGFydCA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOworCQlpb190bGJfc3RhcnQgPSBzd2lvdGxiX2FsbG9jKG9yZGVyLCBpb190bGJfbnNsYWJzKTsKIAkJaWYgKGlvX3RsYl9zdGFydCkKIAkJCWJyZWFrOwogCQlvcmRlci0tOwpAQCAtMjM1LDEyICsyODksMTIgQEAKICAJCWlvX3RsYl9saXN0W2ldID0gSU9fVExCX1NFR1NJWkUgLSBPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpOwogCWlvX3RsYl9pbmRleCA9IDA7CiAKLQlpb190bGJfb3JpZ19hZGRyID0gKHVuc2lnbmVkIGNoYXIgKiopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogc2l6ZW9mKGNoYXIgKikpKTsKKwlpb190bGJfb3JpZ19hZGRyID0gKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqIHNpemVvZihzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIpKSk7CiAJaWYgKCFpb190bGJfb3JpZ19hZGRyKQogCQlnb3RvIGNsZWFudXAzOwogCi0JbWVtc2V0KGlvX3RsYl9vcmlnX2FkZHIsIDAsIGlvX3RsYl9uc2xhYnMgKiBzaXplb2YoY2hhciAqKSk7CisJbWVtc2V0KGlvX3RsYl9vcmlnX2FkZHIsIDAsIGlvX3RsYl9uc2xhYnMgKiBzaXplb2Yoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyKSk7CiAKIAkvKgogCSAqIEdldCB0aGUgb3ZlcmZsb3cgZW1lcmdlbmN5IGJ1ZmZlcgpAQCAtMjUwLDkgKzMwNCw3IEBACiAJaWYgKCFpb190bGJfb3ZlcmZsb3dfYnVmZmVyKQogCQlnb3RvIGNsZWFudXA0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUGxhY2luZyAlbHVNQiBzb2Z0d2FyZSBJTyBUTEIgYmV0d2VlbiAweCVseCAtICIKLQkgICAgICAgIjB4JWx4XG4iLCBieXRlcyA+PiAyMCwKLQkgICAgICAgdmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSwgdmlydF90b19idXMoaW9fdGxiX2VuZCkpOworCXN3aW90bGJfcHJpbnRfaW5mbyhieXRlcyk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjc5LDE2ICszMzEsNjkgQEAKIAlyZXR1cm4gIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfZ2V0X21hc2soaHdkZXYpLCBhZGRyLCBzaXplKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfbmVlZHNfbWFwcGluZyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBzd2lvdGxiX2ZvcmNlIHx8IHN3aW90bGJfYXJjaF9yYW5nZV9uZWVkc19tYXBwaW5nKHB0ciwgc2l6ZSk7Cit9CisKIHN0YXRpYyBpbnQgaXNfc3dpb3RsYl9idWZmZXIoY2hhciAqYWRkcikKIHsKIAlyZXR1cm4gYWRkciA+PSBpb190bGJfc3RhcnQgJiYgYWRkciA8IGlvX3RsYl9lbmQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgc3dpb3RsYl9idXNfdG9fcGh5c19hZGRyKGNoYXIgKmRtYV9hZGRyKQoreworCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOworCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKKwlidWZmZXIub2Zmc2V0ICs9IChsb25nKWRtYV9hZGRyICYgKCgxIDw8IElPX1RMQl9TSElGVCkgLSAxKTsKKwlidWZmZXIucGFnZSArPSBidWZmZXIub2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJYnVmZmVyLm9mZnNldCAmPSBQQUdFX1NJWkUgLSAxOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitfX3N5bmNfc2luZ2xlKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK3sKKwlpZiAoUGFnZUhpZ2hNZW0oYnVmZmVyLnBhZ2UpKSB7CisJCXNpemVfdCBsZW4sIGJ5dGVzOworCQljaGFyICpkZXYsICpob3N0LCAqa21wOworCisJCWxlbiA9IHNpemU7CisJCXdoaWxlIChsZW4gIT0gMCkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJYnl0ZXMgPSBsZW47CisJCQlpZiAoKGJ5dGVzICsgYnVmZmVyLm9mZnNldCkgPiBQQUdFX1NJWkUpCisJCQkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBidWZmZXIub2Zmc2V0OworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyAvKiBwcm90ZWN0cyBLTV9CT1VOQ0VfUkVBRCAqLworCQkJa21wICA9IGttYXBfYXRvbWljKGJ1ZmZlci5wYWdlLCBLTV9CT1VOQ0VfUkVBRCk7CisJCQlkZXYgID0gZG1hX2FkZHIgKyBzaXplIC0gbGVuOworCQkJaG9zdCA9IGttcCArIGJ1ZmZlci5vZmZzZXQ7CisJCQlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKKwkJCQltZW1jcHkoaG9zdCwgZGV2LCBieXRlcyk7CisJCQllbHNlCisJCQkJbWVtY3B5KGRldiwgaG9zdCwgYnl0ZXMpOworCQkJa3VubWFwX2F0b21pYyhrbXAsIEtNX0JPVU5DRV9SRUFEKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWxlbiAtPSBieXRlczsKKwkJCWJ1ZmZlci5wYWdlKys7CisJCQlidWZmZXIub2Zmc2V0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXZvaWQgKnYgPSBwYWdlX2FkZHJlc3MoYnVmZmVyLnBhZ2UpICsgYnVmZmVyLm9mZnNldDsKKworCQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpCisJCQltZW1jcHkoZG1hX2FkZHIsIHYsIHNpemUpOworCQllbHNlCisJCQltZW1jcHkodiwgZG1hX2FkZHIsIHNpemUpOworCX0KK30KKwogLyoKICAqIEFsbG9jYXRlcyBib3VuY2UgYnVmZmVyIGFuZCByZXR1cm5zIGl0cyBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLgogICovCiBzdGF0aWMgdm9pZCAqCi1tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQorbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpkbWFfYWRkcjsKQEAgLTI5OCwxMSArNDAzLDE2IEBACiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0X3Nsb3RzOwogCXVuc2lnbmVkIGxvbmcgbWF4X3Nsb3RzOworCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBzbG90X2J1ZjsKIAogCW1hc2sgPSBkbWFfZ2V0X3NlZ19ib3VuZGFyeShod2Rldik7Ci0Jc3RhcnRfZG1hX2FkZHIgPSB2aXJ0X3RvX2J1cyhpb190bGJfc3RhcnQpICYgbWFzazsKKwlzdGFydF9kbWFfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSAmIG1hc2s7CiAKIAlvZmZzZXRfc2xvdHMgPSBBTElHTihzdGFydF9kbWFfYWRkciwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKKworCS8qCisgCSAqIENhcmVmdWxseSBoYW5kbGUgaW50ZWdlciBvdmVyZmxvdyB3aGljaCBjYW4gb2NjdXIgd2hlbiBtYXNrID09IH4wVUwuCisgCSAqLwogCW1heF9zbG90cyA9IG1hc2sgKyAxCiAJCSAgICA/IEFMSUdOKG1hc2sgKyAxLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUCiAJCSAgICA6IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIElPX1RMQl9TSElGVCk7CkBAIC0zNzgsMTAgKzQ4OCwxNSBAQAogCSAqIFRoaXMgaXMgbmVlZGVkIHdoZW4gd2Ugc3luYyB0aGUgbWVtb3J5LiAgVGhlbiB3ZSBzeW5jIHRoZSBidWZmZXIgaWYKIAkgKiBuZWVkZWQuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKQotCQlpb190bGJfb3JpZ19hZGRyW2luZGV4K2ldID0gYnVmZmVyICsgKGkgPDwgSU9fVExCX1NISUZUKTsKKwlzbG90X2J1ZiA9IGJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKKwkJc2xvdF9idWYucGFnZSArPSBzbG90X2J1Zi5vZmZzZXQgPj4gUEFHRV9TSElGVDsKKwkJc2xvdF9idWYub2Zmc2V0ICY9IFBBR0VfU0laRSAtIDE7CisJCWlvX3RsYl9vcmlnX2FkZHJbaW5kZXgraV0gPSBzbG90X2J1ZjsKKwkJc2xvdF9idWYub2Zmc2V0ICs9IDEgPDwgSU9fVExCX1NISUZUOworCX0KIAlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKQotCQltZW1jcHkoZG1hX2FkZHIsIGJ1ZmZlciwgc2l6ZSk7CisJCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiAKIAlyZXR1cm4gZG1hX2FkZHI7CiB9CkBAIC0zOTUsMTcgKzUxMCwxNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIGNvdW50LCBuc2xvdHMgPSBBTElHTihzaXplLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOwogCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOwotCWNoYXIgKmJ1ZmZlciA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOworCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIgPSBzd2lvdGxiX2J1c190b19waHlzX2FkZHIoZG1hX2FkZHIpOwogCiAJLyoKIAkgKiBGaXJzdCwgc3luYyB0aGUgbWVtb3J5IGJlZm9yZSB1bm1hcHBpbmcgdGhlIGVudHJ5CiAJICovCi0JaWYgKGJ1ZmZlciAmJiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8IChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKSkKKwlpZiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8IChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQogCQkvKgogCQkgKiBib3VuY2UuLi4gY29weSB0aGUgZGF0YSBiYWNrIGludG8gdGhlIG9yaWdpbmFsIGJ1ZmZlciAqIGFuZAogCQkgKiBkZWxldGUgdGhlIGJvdW5jZSBidWZmZXIuCiAJCSAqLwotCQltZW1jcHkoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSk7CisJCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAogCS8qCiAJICogUmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGZyZWUgbGlzdCBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nCkBAIC00MzcsMjEgKzU1MiwxOCBAQAogc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgaW50IGRpciwgaW50IHRhcmdldCkKIHsKLQlpbnQgaW5kZXggPSAoZG1hX2FkZHIgLSBpb190bGJfc3RhcnQpID4+IElPX1RMQl9TSElGVDsKLQljaGFyICpidWZmZXIgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKLQotCWJ1ZmZlciArPSAoKHVuc2lnbmVkIGxvbmcpZG1hX2FkZHIgJiAoKDEgPDwgSU9fVExCX1NISUZUKSAtIDEpKTsKKwlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyID0gc3dpb3RsYl9idXNfdG9fcGh5c19hZGRyKGRtYV9hZGRyKTsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBTWU5DX0ZPUl9DUFU6CiAJCWlmIChsaWtlbHkoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQotCQkJbWVtY3B5KGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUpOworCQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQllbHNlCiAJCQlCVUdfT04oZGlyICE9IERNQV9UT19ERVZJQ0UpOwogCQlicmVhazsKIAljYXNlIFNZTkNfRk9SX0RFVklDRToKIAkJaWYgKGxpa2VseShkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQotCQkJbWVtY3B5KGRtYV9hZGRyLCBidWZmZXIsIHNpemUpOworCQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIAkJZWxzZQogCQkJQlVHX09OKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpOwogCQlicmVhazsKQEAgLTQ3Myw3ICs1ODUsNyBAQAogCQlkbWFfbWFzayA9IGh3ZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKIAogCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwotCWlmIChyZXQgJiYgIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfbWFzaywgdmlydF90b19idXMocmV0KSwgc2l6ZSkpIHsKKwlpZiAocmV0ICYmICFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX21hc2ssIHN3aW90bGJfdmlydF90b19idXMocmV0KSwgc2l6ZSkpIHsKIAkJLyoKIAkJICogVGhlIGFsbG9jYXRlZCBtZW1vcnkgaXNuJ3QgcmVhY2hhYmxlIGJ5IHRoZSBkZXZpY2UuCiAJCSAqIEZhbGwgYmFjayBvbiBzd2lvdGxiX21hcF9zaW5nbGUoKS4KQEAgLTQ4OCwxMyArNjAwLDE2IEBACiAJCSAqIHN3aW90bGJfbWFwX3NpbmdsZSgpLCB3aGljaCB3aWxsIGdyYWIgbWVtb3J5IGZyb20KIAkJICogdGhlIGxvd2VzdCBhdmFpbGFibGUgYWRkcmVzcyByYW5nZS4KIAkJICovCi0JCXJldCA9IG1hcF9zaW5nbGUoaHdkZXYsIE5VTEwsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXI7CisJCWJ1ZmZlci5wYWdlID0gdmlydF90b19wYWdlKE5VTEwpOworCQlidWZmZXIub2Zmc2V0ID0gMDsKKwkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgYnVmZmVyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAoIXJldCkKIAkJCXJldHVybiBOVUxMOwogCX0KIAogCW1lbXNldChyZXQsIDAsIHNpemUpOwotCWRldl9hZGRyID0gdmlydF90b19idXMocmV0KTsKKwlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMocmV0KTsKIAogCS8qIENvbmZpcm0gYWRkcmVzcyBjYW4gYmUgRE1BJ2QgYnkgZGV2aWNlICovCiAJaWYgKCFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX21hc2ssIGRldl9hZGRyLCBzaXplKSkgewpAQCAtNTU0LDggKzY2OSw5IEBACiBzd2lvdGxiX21hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCiAJCQkgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0JZG1hX2FkZHJfdCBkZXZfYWRkciA9IHZpcnRfdG9fYnVzKHB0cik7CisJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMocHRyKTsKIAl2b2lkICptYXA7CisJc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlcjsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCS8qCkBAIC01NjMsMTkgKzY3OSwyMiBAQAogCSAqIHdlIGNhbiBzYWZlbHkgcmV0dXJuIHRoZSBkZXZpY2UgYWRkciBhbmQgbm90IHdvcnJ5IGFib3V0IGJvdW5jZQogCSAqIGJ1ZmZlcmluZyBpdC4KIAkgKi8KLQlpZiAoIWFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIsIHNpemUpICYmICFzd2lvdGxiX2ZvcmNlKQorCWlmICghYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSkgJiYKKwkgICAgIXJhbmdlX25lZWRzX21hcHBpbmcocHRyLCBzaXplKSkKIAkJcmV0dXJuIGRldl9hZGRyOwogCiAJLyoKIAkgKiBPaCB3ZWxsLCBoYXZlIHRvIGFsbG9jYXRlIGFuZCBtYXAgYSBib3VuY2UgYnVmZmVyLgogCSAqLwotCW1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIHB0ciwgc2l6ZSwgZGlyKTsKKwlidWZmZXIucGFnZSAgID0gdmlydF90b19wYWdlKHB0cik7CisJYnVmZmVyLm9mZnNldCA9ICh1bnNpZ25lZCBsb25nKXB0ciAmIH5QQUdFX01BU0s7CisJbWFwID0gbWFwX3NpbmdsZShod2RldiwgYnVmZmVyLCBzaXplLCBkaXIpOwogCWlmICghbWFwKSB7CiAJCXN3aW90bGJfZnVsbChod2Rldiwgc2l6ZSwgZGlyLCAxKTsKIAkJbWFwID0gaW9fdGxiX292ZXJmbG93X2J1ZmZlcjsKIAl9CiAKLQlkZXZfYWRkciA9IHZpcnRfdG9fYnVzKG1hcCk7CisJZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKG1hcCk7CiAKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSBhZGRyZXNzIHJldHVybmVkIGlzIERNQSdibGUKQEAgLTYwNSw3ICs3MjQsNyBAQAogc3dpb3RsYl91bm1hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCiAJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0JY2hhciAqZG1hX2FkZHIgPSBidXNfdG9fdmlydChkZXZfYWRkcik7CisJY2hhciAqZG1hX2FkZHIgPSBzd2lvdGxiX2J1c190b192aXJ0KGRldl9hZGRyKTsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCkBAIC02MzUsNyArNzU0LDcgQEAKIHN3aW90bGJfc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCiAJCSAgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgaW50IHRhcmdldCkKIHsKLQljaGFyICpkbWFfYWRkciA9IGJ1c190b192aXJ0KGRldl9hZGRyKTsKKwljaGFyICpkbWFfYWRkciA9IHN3aW90bGJfYnVzX3RvX3ZpcnQoZGV2X2FkZHIpOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAJaWYgKGlzX3N3aW90bGJfYnVmZmVyKGRtYV9hZGRyKSkKQEAgLTY2Niw3ICs3ODUsNyBAQAogCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCiAJCQkgIGludCBkaXIsIGludCB0YXJnZXQpCiB7Ci0JY2hhciAqZG1hX2FkZHIgPSBidXNfdG9fdmlydChkZXZfYWRkcikgKyBvZmZzZXQ7CisJY2hhciAqZG1hX2FkZHIgPSBzd2lvdGxiX2J1c190b192aXJ0KGRldl9hZGRyKSArIG9mZnNldDsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCkBAIC03MTQsMTggKzgzMywyMCBAQAogCQkgICAgIGludCBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jdm9pZCAqYWRkcjsKKwlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyOwogCWRtYV9hZGRyX3QgZGV2X2FkZHI7CiAJaW50IGk7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlhZGRyID0gU0dfRU5UX1ZJUlRfQUREUkVTUyhzZyk7Ci0JCWRldl9hZGRyID0gdmlydF90b19idXMoYWRkcik7Ci0JCWlmIChzd2lvdGxiX2ZvcmNlIHx8CisJCWRldl9hZGRyID0gc3dpb3RsYl9zZ190b19idXMoc2cpOworCQlpZiAocmFuZ2VfbmVlZHNfbWFwcGluZyhzZ192aXJ0KHNnKSwgc2ctPmxlbmd0aCkgfHwKIAkJICAgIGFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIsIHNnLT5sZW5ndGgpKSB7Ci0JCQl2b2lkICptYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCBhZGRyLCBzZy0+bGVuZ3RoLCBkaXIpOworCQkJdm9pZCAqbWFwOworCQkJYnVmZmVyLnBhZ2UgICA9IHNnX3BhZ2Uoc2cpOworCQkJYnVmZmVyLm9mZnNldCA9IHNnLT5vZmZzZXQ7CisJCQltYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCBidWZmZXIsIHNnLT5sZW5ndGgsIGRpcik7CiAJCQlpZiAoIW1hcCkgewogCQkJCS8qIERvbid0IHBhbmljIGhlcmUsIHdlIGV4cGVjdCBtYXBfc2cgdXNlcnMKIAkJCQkgICB0byBkbyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICovCkBAIC03MzUsNyArODU2LDcgQEAKIAkJCQlzZ2xbMF0uZG1hX2xlbmd0aCA9IDA7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlzZy0+ZG1hX2FkZHJlc3MgPSB2aXJ0X3RvX2J1cyhtYXApOworCQkJc2ctPmRtYV9hZGRyZXNzID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhtYXApOwogCQl9IGVsc2UKIAkJCXNnLT5kbWFfYWRkcmVzcyA9IGRldl9hZGRyOwogCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CkBAIC03NjUsMTEgKzg4NiwxMSBAQAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKSB7Ci0JCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gU0dfRU5UX1BIWVNfQUREUkVTUyhzZykpCi0JCQl1bm1hcF9zaW5nbGUoaHdkZXYsIGJ1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksCisJCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl9zZ190b19idXMoc2cpKQorCQkJdW5tYXBfc2luZ2xlKGh3ZGV2LCBzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksCiAJCQkJICAgICBzZy0+ZG1hX2xlbmd0aCwgZGlyKTsKIAkJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCWRtYV9tYXJrX2NsZWFuKFNHX0VOVF9WSVJUX0FERFJFU1Moc2cpLCBzZy0+ZG1hX2xlbmd0aCk7CisJCQlkbWFfbWFya19jbGVhbihzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVuZ3RoKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2dfYXR0cnMpOwpAQCAtNzk4LDExICs5MTksMTEgQEAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IFNHX0VOVF9QSFlTX0FERFJFU1Moc2cpKQotCQkJc3luY19zaW5nbGUoaHdkZXYsIGJ1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksCisJCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl9zZ190b19idXMoc2cpKQorCQkJc3luY19zaW5nbGUoaHdkZXYsIHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwKIAkJCQkgICAgc2ctPmRtYV9sZW5ndGgsIGRpciwgdGFyZ2V0KTsKIAkJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCWRtYV9tYXJrX2NsZWFuKFNHX0VOVF9WSVJUX0FERFJFU1Moc2cpLCBzZy0+ZG1hX2xlbmd0aCk7CisJCQlkbWFfbWFya19jbGVhbihzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVuZ3RoKTsKIAl9CiB9CiAKQEAgLTgyMyw3ICs5NDQsNyBAQAogaW50CiBzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewotCXJldHVybiAoZG1hX2FkZHIgPT0gdmlydF90b19idXMoaW9fdGxiX292ZXJmbG93X2J1ZmZlcikpOworCXJldHVybiAoZG1hX2FkZHIgPT0gc3dpb3RsYl92aXJ0X3RvX2J1cyhpb190bGJfb3ZlcmZsb3dfYnVmZmVyKSk7CiB9CiAKIC8qCkBAIC04MzUsNyArOTU2LDcgQEAKIGludAogc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzaykKIHsKLQlyZXR1cm4gdmlydF90b19idXMoaW9fdGxiX2VuZCAtIDEpIDw9IG1hc2s7CisJcmV0dXJuIHN3aW90bGJfdmlydF90b19idXMoaW9fdGxiX2VuZCAtIDEpIDw9IG1hc2s7CiB9CiAKIEVYUE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2luZ2xlKTsKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggMzc4MmViNi4uYzkyZThhZiAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19NTVVfTk9USUZJRVIpICs9IG1tdV9ub3RpZmllci5vCiBvYmotJChDT05GSUdfU0xBQikgKz0gc2xhYi5vCiBvYmotJChDT05GSUdfU0xVQikgKz0gc2x1Yi5vCitvYmotJChDT05GSUdfRkFJTFNMQUIpICs9IGZhaWxzbGFiLm8KIG9iai0kKENPTkZJR19NRU1PUllfSE9UUExVRykgKz0gbWVtb3J5X2hvdHBsdWcubwogb2JqLSQoQ09ORklHX0ZTX1hJUCkgKz0gZmlsZW1hcF94aXAubwogb2JqLSQoQ09ORklHX01JR1JBVElPTikgKz0gbWlncmF0ZS5vCmRpZmYgLS1naXQgYS9tbS9ib3VuY2UuYyBiL21tL2JvdW5jZS5jCmluZGV4IGJmMGNmN2MuLmU1OTAyNzIgMTAwNjQ0Ci0tLSBhL21tL2JvdW5jZS5jCisrKyBiL21tL2JvdW5jZS5jCkBAIC0xOTgsOCArMTk4LDEzIEBACiAJCS8qCiAJCSAqIGlyaywgYm91bmNlIGl0CiAJCSAqLwotCQlpZiAoIWJpbykKLQkJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgKCpiaW9fb3JpZyktPmJpX3ZjbnQpOworCQlpZiAoIWJpbykgeworCQkJdW5zaWduZWQgaW50IGNudCA9ICgqYmlvX29yaWcpLT5iaV92Y250OworCisJCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIGNudCk7CisJCQltZW1zZXQoYmlvLT5iaV9pb192ZWMsIDAsIGNudCAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOworCQl9CisJCQkKIAogCQl0byA9IGJpby0+YmlfaW9fdmVjICsgaTsKIApkaWZmIC0tZ2l0IGEvbW0vZmFpbHNsYWIuYyBiL21tL2ZhaWxzbGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2ZWE2NAotLS0gL2Rldi9udWxsCisrKyBiL21tL2ZhaWxzbGFiLmMKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgorCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgZmF1bHRfYXR0ciBhdHRyOworCXUzMiBpZ25vcmVfZ2ZwX3dhaXQ7CisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUworCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfd2FpdF9maWxlOworI2VuZGlmCit9IGZhaWxzbGFiID0geworCS5hdHRyID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUiwKKwkuaWdub3JlX2dmcF93YWl0ID0gMSwKK307CisKK2Jvb2wgc2hvdWxkX2ZhaWxzbGFiKHNpemVfdCBzaXplLCBnZnBfdCBnZnBmbGFncykKK3sKKwlpZiAoZ2ZwZmxhZ3MgJiBfX0dGUF9OT0ZBSUwpCisJCXJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0ICYmIChnZnBmbGFncyAmIF9fR0ZQX1dBSVQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gc2hvdWxkX2ZhaWwoJmZhaWxzbGFiLmF0dHIsIHNpemUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9mYWlsc2xhYihjaGFyICpzdHIpCit7CisJcmV0dXJuIHNldHVwX2ZhdWx0X2F0dHIoJmZhaWxzbGFiLmF0dHIsIHN0cik7Cit9CitfX3NldHVwKCJmYWlsc2xhYj0iLCBzZXR1cF9mYWlsc2xhYik7CisKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCisKK3N0YXRpYyBpbnQgX19pbml0IGZhaWxzbGFiX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOworCXN0cnVjdCBkZW50cnkgKmRpcjsKKwlpbnQgZXJyOworCisJZXJyID0gaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyLCAiZmFpbHNsYWIiKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWRpciA9IGZhaWxzbGFiLmF0dHIuZGVudHJpZXMuZGlyOworCisJZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0X2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLXdhaXQiLCBtb2RlLCBkaXIsCisJCQkJICAgICAgJmZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdCk7CisKKwlpZiAoIWZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWRlYnVnZnNfcmVtb3ZlKGZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKKwkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitsYXRlX2luaXRjYWxsKGZhaWxzbGFiX2RlYnVnZnNfaW5pdCk7CisKKyNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IGYwMWI3ZWUuLjBhMjAxMGEgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0zMDc1LDMgKzMwNzUsMTggQEAKIAl9CiAJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIH0KKworI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCit2b2lkIG1pZ2h0X2ZhdWx0KHZvaWQpCit7CisJbWlnaHRfc2xlZXAoKTsKKwkvKgorCSAqIGl0IHdvdWxkIGJlIG5pY2VyIG9ubHkgdG8gYW5ub3RhdGUgcGF0aHMgd2hpY2ggYXJlIG5vdCB1bmRlcgorCSAqIHBhZ2VmYXVsdF9kaXNhYmxlLCBob3dldmVyIHRoYXQgcmVxdWlyZXMgYSBsYXJnZXIgYXVkaXQgYW5kCisJICogcHJvdmlkaW5nIGhlbHBlcnMgbGlrZSBnZXRfdXNlcl9hdG9taWMuCisJICovCisJaWYgKCFpbl9hdG9taWMoKSAmJiBjdXJyZW50LT5tbSkKKwkJbWlnaHRfbG9ja19yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworfQorRVhQT1JUX1NZTUJPTChtaWdodF9mYXVsdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCA3ZjcyYmIzLi44MzA3NWYzIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0yMTMyLDYgKzIxMzIsOCBAQAogICoKICAqIEBuYW1lIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIGNhY2hlIGlzIGRlc3Ryb3llZC4gVGhpcyBpbXBsaWVzIHRoYXQKICAqIHRoZSBtb2R1bGUgY2FsbGluZyB0aGlzIGhhcyB0byBkZXN0cm95IHRoZSBjYWNoZSBiZWZvcmUgZ2V0dGluZyB1bmxvYWRlZC4KKyAqIE5vdGUgdGhhdCBrbWVtX2NhY2hlX25hbWUoKSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgcG9pbnRlciwKKyAqIHRoZXJlZm9yZSBhcHBsaWNhdGlvbnMgbXVzdCBtYW5hZ2UgaXQgdGhlbXNlbHZlcy4KICAqCiAgKiBUaGUgZmxhZ3MgYXJlCiAgKgpAQCAtMjYxOCw3ICsyNjIwLDcgQEAKIAlpZiAoT0ZGX1NMQUIoY2FjaGVwKSkgewogCQkvKiBTbGFiIG1hbmFnZW1lbnQgb2JqIGlzIG9mZi1zbGFiLiAqLwogCQlzbGFicCA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAtPnNsYWJwX2NhY2hlLAotCQkJCQkgICAgICBsb2NhbF9mbGFncyAmIH5HRlBfVEhJU05PREUsIG5vZGVpZCk7CisJCQkJCSAgICAgIGxvY2FsX2ZsYWdzLCBub2RlaWQpOwogCQlpZiAoIXNsYWJwKQogCQkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIHsKQEAgLTMwMDYsNyArMzAwOCw3IEBACiAJCSAqIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG9iamVjdCBhdmFpbGFibGUgZm9yCiAJCSAqIGFsbG9jYXRpb24uCiAJCSAqLwotCQlCVUdfT04oc2xhYnAtPmludXNlIDwgMCB8fCBzbGFicC0+aW51c2UgPj0gY2FjaGVwLT5udW0pOworCQlCVUdfT04oc2xhYnAtPmludXNlID49IGNhY2hlcC0+bnVtKTsKIAogCQl3aGlsZSAoc2xhYnAtPmludXNlIDwgY2FjaGVwLT5udW0gJiYgYmF0Y2hjb3VudC0tKSB7CiAJCQlTVEFUU19JTkNfQUxMT0NFRChjYWNoZXApOwpAQCAtMzExNSw3OSArMzExNywxNCBAQAogI2RlZmluZSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGEsYixvYmpwLGQpIChvYmpwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRkFJTFNMQUIKLQotc3RhdGljIHN0cnVjdCBmYWlsc2xhYl9hdHRyIHsKLQotCXN0cnVjdCBmYXVsdF9hdHRyIGF0dHI7Ci0KLQl1MzIgaWdub3JlX2dmcF93YWl0OwotI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICppZ25vcmVfZ2ZwX3dhaXRfZmlsZTsKLSNlbmRpZgotCi19IGZhaWxzbGFiID0gewotCS5hdHRyID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUiwKLQkuaWdub3JlX2dmcF93YWl0ID0gMSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2ZhaWxzbGFiKGNoYXIgKnN0cikKLXsKLQlyZXR1cm4gc2V0dXBfZmF1bHRfYXR0cigmZmFpbHNsYWIuYXR0ciwgc3RyKTsKLX0KLV9fc2V0dXAoImZhaWxzbGFiPSIsIHNldHVwX2ZhaWxzbGFiKTsKLQotc3RhdGljIGludCBzaG91bGRfZmFpbHNsYWIoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCitzdGF0aWMgYm9vbCBzbGFiX3Nob3VsZF9mYWlsc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKIHsKIAlpZiAoY2FjaGVwID09ICZjYWNoZV9jYWNoZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGZsYWdzICYgX19HRlBfTk9GQUlMKQotCQlyZXR1cm4gMDsKLQlpZiAoZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0ICYmIChmbGFncyAmIF9fR0ZQX1dBSVQpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIHNob3VsZF9mYWlsKCZmYWlsc2xhYi5hdHRyLCBvYmpfc2l6ZShjYWNoZXApKTsKKwlyZXR1cm4gc2hvdWxkX2ZhaWxzbGFiKG9ial9zaXplKGNhY2hlcCksIGZsYWdzKTsKIH0KIAotI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKLQotc3RhdGljIGludCBfX2luaXQgZmFpbHNsYWJfZGVidWdmcyh2b2lkKQotewotCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOwotCXN0cnVjdCBkZW50cnkgKmRpcjsKLQlpbnQgZXJyOwotCi0JZXJyID0gaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyLCAiZmFpbHNsYWIiKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWRpciA9IGZhaWxzbGFiLmF0dHIuZGVudHJpZXMuZGlyOwotCi0JZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0X2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLXdhaXQiLCBtb2RlLCBkaXIsCi0JCQkJICAgICAgJmZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdCk7Ci0KLQlpZiAoIWZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWRlYnVnZnNfcmVtb3ZlKGZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKLQkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1sYXRlX2luaXRjYWxsKGZhaWxzbGFiX2RlYnVnZnMpOwotCi0jZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwotCi0jZWxzZSAvKiBDT05GSUdfRkFJTFNMQUIgKi8KLQotc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX2ZhaWxzbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0ZBSUxTTEFCICovCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCAqX19fX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewogCXZvaWQgKm9ianA7CkBAIC0zMzkwLDcgKzMzMjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgc2F2ZV9mbGFnczsKIAl2b2lkICpwdHI7CiAKLQlpZiAoc2hvdWxkX2ZhaWxzbGFiKGNhY2hlcCwgZmxhZ3MpKQorCWlmIChzbGFiX3Nob3VsZF9mYWlsc2xhYihjYWNoZXAsIGZsYWdzKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAljYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2JlZm9yZShjYWNoZXAsIGZsYWdzKTsKQEAgLTM0NjYsNyArMzQwMyw3IEBACiAJdW5zaWduZWQgbG9uZyBzYXZlX2ZsYWdzOwogCXZvaWQgKm9ianA7CiAKLQlpZiAoc2hvdWxkX2ZhaWxzbGFiKGNhY2hlcCwgZmxhZ3MpKQorCWlmIChzbGFiX3Nob3VsZF9mYWlsc2xhYihjYWNoZXAsIGZsYWdzKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAljYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2JlZm9yZShjYWNoZXAsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA3YmY4Y2Y4Li40ZmFjN2JiIDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KIAogLyoKICAqIExvY2sgb3JkZXI6CkBAIC0xNTQsNiArMTU1LDEwIEBACiAjZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCiAjZW5kaWYKIAorI2RlZmluZSBPT19TSElGVAkxNgorI2RlZmluZSBPT19NQVNLCQkoKDEgPDwgT09fU0hJRlQpIC0gMSkKKyNkZWZpbmUgTUFYX09CSlNfUEVSX1BBR0UJNjU1MzUgLyogc2luY2UgcGFnZS5vYmplY3RzIGlzIHUxNiAqLworCiAvKiBJbnRlcm5hbCBTTFVCIGZsYWdzICovCiAjZGVmaW5lIF9fT0JKRUNUX1BPSVNPTgkJMHg4MDAwMDAwMCAvKiBQb2lzb24gb2JqZWN0ICovCiAjZGVmaW5lIF9fU1lTRlNfQUREX0RFRkVSUkVECTB4NDAwMDAwMDAgLyogTm90IHlldCB2aXNpYmxlIHZpYSBzeXNmcyAqLwpAQCAtMjkxLDcgKzI5Niw3IEBACiAJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGttZW1fY2FjaGVfb3JkZXJfb2JqZWN0cyB4ID0gewotCQkob3JkZXIgPDwgMTYpICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLyBzaXplCisJCShvcmRlciA8PCBPT19TSElGVCkgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAvIHNpemUKIAl9OwogCiAJcmV0dXJuIHg7CkBAIC0yOTksMTIgKzMwNCwxMiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBvb19vcmRlcihzdHJ1Y3Qga21lbV9jYWNoZV9vcmRlcl9vYmplY3RzIHgpCiB7Ci0JcmV0dXJuIHgueCA+PiAxNjsKKwlyZXR1cm4geC54ID4+IE9PX1NISUZUOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBvb19vYmplY3RzKHN0cnVjdCBrbWVtX2NhY2hlX29yZGVyX29iamVjdHMgeCkKIHsKLQlyZXR1cm4geC54ICYgKCgxIDw8IDE2KSAtIDEpOworCXJldHVybiB4LnggJiBPT19NQVNLOwogfQogCiAjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKQEAgLTY5Myw3ICs2OTgsNyBAQAogCWlmICghY2hlY2tfdmFsaWRfcG9pbnRlcihzLCBwYWdlLCBnZXRfZnJlZXBvaW50ZXIocywgcCkpKSB7CiAJCW9iamVjdF9lcnIocywgcGFnZSwgcCwgIkZyZWVwb2ludGVyIGNvcnJ1cHQiKTsKIAkJLyoKLQkJICogTm8gY2hvaWNlIGJ1dCB0byB6YXAgaXQgYW5kIHRodXMgbG9vc2UgdGhlIHJlbWFpbmRlcgorCQkgKiBObyBjaG9pY2UgYnV0IHRvIHphcCBpdCBhbmQgdGh1cyBsb3NlIHRoZSByZW1haW5kZXIKIAkJICogb2YgdGhlIGZyZWUgb2JqZWN0cyBpbiB0aGlzIHNsYWIuIE1heSBjYXVzZQogCQkgKiBhbm90aGVyIGVycm9yIGJlY2F1c2UgdGhlIG9iamVjdCBjb3VudCBpcyBub3cgd3JvbmcuCiAJCSAqLwpAQCAtNzY1LDggKzc3MCw4IEBACiAJfQogCiAJbWF4X29iamVjdHMgPSAoUEFHRV9TSVpFIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpKSAvIHMtPnNpemU7Ci0JaWYgKG1heF9vYmplY3RzID4gNjU1MzUpCi0JCW1heF9vYmplY3RzID0gNjU1MzU7CisJaWYgKG1heF9vYmplY3RzID4gTUFYX09CSlNfUEVSX1BBR0UpCisJCW1heF9vYmplY3RzID0gTUFYX09CSlNfUEVSX1BBR0U7CiAKIAlpZiAocGFnZS0+b2JqZWN0cyAhPSBtYXhfb2JqZWN0cykgewogCQlzbGFiX2VycihzLCBwYWdlLCAiV3JvbmcgbnVtYmVyIG9mIG9iamVjdHMuIEZvdW5kICVkIGJ1dCAiCkBAIC0xNTkyLDYgKzE1OTcsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBvYmpzaXplOwogCisJbWlnaHRfc2xlZXBfaWYoZ2ZwZmxhZ3MgJiBfX0dGUF9XQUlUKTsKKworCWlmIChzaG91bGRfZmFpbHNsYWIocy0+b2Jqc2l6ZSwgZ2ZwZmxhZ3MpKQorCQlyZXR1cm4gTlVMTDsKKwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAljID0gZ2V0X2NwdV9zbGFiKHMsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJb2Jqc2l6ZSA9IGMtPm9ianNpemU7CkBAIC0xNzY2LDcgKzE3NzYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2ZyZWUpOwogCi0vKiBGaWd1cmUgb3V0IG9uIHdoaWNoIHNsYWIgb2JqZWN0IHRoZSBvYmplY3QgcmVzaWRlcyAqLworLyogRmlndXJlIG91dCBvbiB3aGljaCBzbGFiIHBhZ2UgdGhlIG9iamVjdCByZXNpZGVzICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKmdldF9vYmplY3RfcGFnZShjb25zdCB2b2lkICp4KQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19oZWFkX3BhZ2UoeCk7CkBAIC0xODM4LDggKzE4NDgsOCBAQAogCWludCByZW07CiAJaW50IG1pbl9vcmRlciA9IHNsdWJfbWluX29yZGVyOwogCi0JaWYgKChQQUdFX1NJWkUgPDwgbWluX29yZGVyKSAvIHNpemUgPiA2NTUzNSkKLQkJcmV0dXJuIGdldF9vcmRlcihzaXplICogNjU1MzUpIC0gMTsKKwlpZiAoKFBBR0VfU0laRSA8PCBtaW5fb3JkZXIpIC8gc2l6ZSA+IE1BWF9PQkpTX1BFUl9QQUdFKQorCQlyZXR1cm4gZ2V0X29yZGVyKHNpemUgKiBNQVhfT0JKU19QRVJfUEFHRSkgLSAxOwogCiAJZm9yIChvcmRlciA9IG1heChtaW5fb3JkZXIsCiAJCQkJZmxzKG1pbl9vYmplY3RzICogc2l6ZSAtIDEpIC0gUEFHRV9TSElGVCk7CkBAIC0yMTA0LDggKzIxMTQsNyBAQAogICogd2hlbiBhbGxvY2F0aW5nIGZvciB0aGUga21hbGxvY19ub2RlX2NhY2hlLiBUaGlzIGlzIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKICAqIG1lbW9yeSBvbiBhIGZyZXNoIG5vZGUgdGhhdCBoYXMgbm8gc2xhYiBzdHJ1Y3R1cmVzIHlldC4KICAqLwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKmVhcmx5X2ttZW1fY2FjaGVfbm9kZV9hbGxvYyhnZnBfdCBnZnBmbGFncywKLQkJCQkJCQkgICBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIGVhcmx5X2ttZW1fY2FjaGVfbm9kZV9hbGxvYyhnZnBfdCBnZnBmbGFncywgaW50IG5vZGUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbjsKQEAgLTIxNDMsNyArMjE1Miw2IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIDApOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gbjsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9rbWVtX2NhY2hlX25vZGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzKQpAQCAtMjE3NSw4ICsyMTgzLDcgQEAKIAkJCW4gPSAmcy0+bG9jYWxfbm9kZTsKIAkJZWxzZSB7CiAJCQlpZiAoc2xhYl9zdGF0ZSA9PSBET1dOKSB7Ci0JCQkJbiA9IGVhcmx5X2ttZW1fY2FjaGVfbm9kZV9hbGxvYyhnZnBmbGFncywKLQkJCQkJCQkJbm9kZSk7CisJCQkJZWFybHlfa21lbV9jYWNoZV9ub2RlX2FsbG9jKGdmcGZsYWdzLCBub2RlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCW4gPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoa21hbGxvY19jYWNoZXMsCkBAIC0zMTc2LDggKzMxODMsMTIgQEAKIAkJcy0+aW51c2UgPSBtYXhfdChpbnQsIHMtPmludXNlLCBBTElHTihzaXplLCBzaXplb2Yodm9pZCAqKSkpOwogCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAotCQlpZiAoc3lzZnNfc2xhYl9hbGlhcyhzLCBuYW1lKSkKKwkJaWYgKHN5c2ZzX3NsYWJfYWxpYXMocywgbmFtZSkpIHsKKwkJCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CisJCQlzLT5yZWZjb3VudC0tOworCQkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCQlnb3RvIGVycjsKKwkJfQogCQlyZXR1cm4gczsKIAl9CiAKQEAgLTMxODcsOCArMzE5OCwxMyBAQAogCQkJCXNpemUsIGFsaWduLCBmbGFncywgY3RvcikpIHsKIAkJCWxpc3RfYWRkKCZzLT5saXN0LCAmc2xhYl9jYWNoZXMpOwogCQkJdXBfd3JpdGUoJnNsdWJfbG9jayk7Ci0JCQlpZiAoc3lzZnNfc2xhYl9hZGQocykpCisJCQlpZiAoc3lzZnNfc2xhYl9hZGQocykpIHsKKwkJCQlkb3duX3dyaXRlKCZzbHViX2xvY2spOworCQkJCWxpc3RfZGVsKCZzLT5saXN0KTsKKwkJCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwkJCQlrZnJlZShzKTsKIAkJCQlnb3RvIGVycjsKKwkJCX0KIAkJCXJldHVybiBzOwogCQl9CiAJCWtmcmVlKHMpOwpAQCAtNDQxMiw3ICs0NDI4LDcgQEAKIAogLyoKICAqIE5lZWQgdG8gYnVmZmVyIGFsaWFzZXMgZHVyaW5nIGJvb3R1cCB1bnRpbCBzeXNmcyBiZWNvbWVzCi0gKiBhdmFpbGFibGUgbGVzdCB3ZSBsb29zZSB0aGF0IGluZm9ybWF0aW9uLgorICogYXZhaWxhYmxlIGxlc3Qgd2UgbG9zZSB0aGF0IGluZm9ybWF0aW9uLgogICovCiBzdHJ1Y3Qgc2F2ZWRfYWxpYXMgewogCXN0cnVjdCBrbWVtX2NhY2hlICpzOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA0NDY0MjQwLi4wOWM2NmE0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNTA2NiwxMyArNTA2NiwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IGRlZmF1bHRfZGV2aWNlX2V4aXQoc3RydWN0IG5ldCAqbmV0KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpuZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJLyoKIAkgKiBQdXNoIGFsbCBtaWdyYXRhYmxlIG9mIHRoZSBuZXR3b3JrIGRldmljZXMgYmFjayB0byB0aGUKIAkgKiBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlCiAJICovCiAJcnRubF9sb2NrKCk7Ci0JZm9yX2VhY2hfbmV0ZGV2X3NhZmUobmV0LCBkZXYsIG5leHQpIHsKK3Jlc3RhcnQ6CisJZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7CiAJCWludCBlcnI7CiAJCWNoYXIgZmJfbmFtZVtJRk5BTVNJWl07CiAKQEAgLTUwODMsNyArNTA4NCw3IEBACiAJCS8qIERlbGV0ZSB2aXJ0dWFsIGRldmljZXMgKi8KIAkJaWYgKGRldi0+cnRubF9saW5rX29wcyAmJiBkZXYtPnJ0bmxfbGlua19vcHMtPmRlbGxpbmspIHsKIAkJCWRldi0+cnRubF9saW5rX29wcy0+ZGVsbGluayhkZXYpOwotCQkJY29udGludWU7CisJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAogCQkvKiBQdXNoIHJlbWFpbmcgbmV0d29yayBkZXZpY2VzIHRvIGluaXRfbmV0ICovCkBAIC01MDk0LDYgKzUwOTUsNyBAQAogCQkJCV9fZnVuY19fLCBkZXYtPm5hbWUsIGVycik7CiAJCQlCVUcoKTsKIAkJfQorCQlnb3RvIHJlc3RhcnQ7CiAJfQogCXJ0bmxfdW5sb2NrKCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZWlnaGJvdXIuYyBiL25ldC9jb3JlL25laWdoYm91ci5jCmluZGV4IDljMzcxN2EuLmY2NmM1OGQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25laWdoYm91ci5jCisrKyBiL25ldC9jb3JlL25laWdoYm91ci5jCkBAIC0yNDE0LDcgKzI0MTQsNyBAQAogCWlmICgqcG9zID09IDApCiAJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CiAKLQlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgbnJfY3B1X2lkczsgKytjcHUpIHsKIAkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKIAkJCWNvbnRpbnVlOwogCQkqcG9zID0gY3B1KzE7CkBAIC0yNDI5LDcgKzI0MjksNyBAQAogCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gcGRlLT5kYXRhOwogCWludCBjcHU7CiAKLQlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBucl9jcHVfaWRzOyArK2NwdSkgewogCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQogCQkJY29udGludWU7CiAJCSpwb3MgPSBjcHUrMTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IGQ1YzJiYWMuLjE3NDdjY2EgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtOTY0LDcgKzk2NCw2IEBACiAJc3RhdGUgPSBzay0+c2tfc3RhdGU7CiAJc29ja19ob2xkKHNrKTsKIAlzb2NrX29ycGhhbihzayk7Ci0JcGVyY3B1X2NvdW50ZXJfaW5jKHNrLT5za19wcm90LT5vcnBoYW5fY291bnQpOwogCiAJLyoKIAkgKiBJdCBpcyB0aGUgbGFzdCByZWxlYXNlX3NvY2sgaW4gaXRzIGxpZmUuIEl0IHdpbGwgcmVtb3ZlIGJhY2tsb2cuCkBAIC05NzgsNiArOTc3LDggQEAKIAliaF9sb2NrX3NvY2soc2spOwogCVdBUk5fT04oc29ja19vd25lZF9ieV91c2VyKHNrKSk7CiAKKwlwZXJjcHVfY291bnRlcl9pbmMoc2stPnNrX3Byb3QtPm9ycGhhbl9jb3VudCk7CisKIAkvKiBIYXZlIHdlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgYnkgYSBzb2Z0aXJxIG9yIGJhY2tsb2c/ICovCiAJaWYgKHN0YXRlICE9IERDQ1BfQ0xPU0VEICYmIHNrLT5za19zdGF0ZSA9PSBEQ0NQX0NMT1NFRCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwppbmRleCBjN2NkYTFjLi5mMjZhYjM4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTYzMyw4ICs2MzMsNiBAQAogCiAJCWFjY19yZXEgPSByZXEtPmRsX25leHQ7CiAKLQkJcGVyY3B1X2NvdW50ZXJfaW5jKHNrLT5za19wcm90LT5vcnBoYW5fY291bnQpOwotCiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJYmhfbG9ja19zb2NrKGNoaWxkKTsKIAkJV0FSTl9PTihzb2NrX293bmVkX2J5X3VzZXIoY2hpbGQpKTsKQEAgLTY0NCw2ICs2NDIsOCBAQAogCiAJCXNvY2tfb3JwaGFuKGNoaWxkKTsKIAorCQlwZXJjcHVfY291bnRlcl9pbmMoc2stPnNrX3Byb3QtPm9ycGhhbl9jb3VudCk7CisKIAkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKGNoaWxkKTsKIAogCQliaF91bmxvY2tfc29jayhjaGlsZCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCmluZGV4IDMxM2ViZjAuLjZiYTVjNTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCkBAIC0yOTEsNyArMjkxLDcgQEAKIAlpZiAoKnBvcyA9PSAwKQogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogCi0JZm9yIChjcHUgPSAqcG9zLTE7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJZm9yIChjcHUgPSAqcG9zLTE7IGNwdSA8IG5yX2NwdV9pZHM7ICsrY3B1KSB7CiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSsxOwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJaW50IGNwdTsKIAotCWZvciAoY3B1ID0gKnBvczsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IG5yX2NwdV9pZHM7ICsrY3B1KSB7CiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSsxOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvYy5jIGIvbmV0L2lwdjQvcHJvYy5jCmluZGV4IDYxNDk1OGIuLmViNjJlNTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Byb2MuYworKysgYi9uZXQvaXB2NC9wcm9jLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgogI2luY2x1ZGUgPG5ldC91ZHBsaXRlLmg+CisjaW5jbHVkZSA8bGludXgvYm90dG9tX2hhbGYuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC01MCwxMyArNTEsMTcgQEAKIHN0YXRpYyBpbnQgc29ja3N0YXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOworCWludCBvcnBoYW5zLCBzb2NrZXRzOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCW9ycGhhbnMgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnRjcF9vcnBoYW5fY291bnQpLAorCXNvY2tldHMgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCksCisJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlzb2NrZXRfc2VxX3Nob3coc2VxKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlRDUDogaW51c2UgJWQgb3JwaGFuICVkIHR3ICVkIGFsbG9jICVkIG1lbSAlZFxuIiwKLQkJICAgc29ja19wcm90X2ludXNlX2dldChuZXQsICZ0Y3BfcHJvdCksCi0JCSAgIChpbnQpcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZ0Y3Bfb3JwaGFuX2NvdW50KSwKLQkJICAgdGNwX2RlYXRoX3Jvdy50d19jb3VudCwKLQkJICAgKGludClwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCksCisJCSAgIHNvY2tfcHJvdF9pbnVzZV9nZXQobmV0LCAmdGNwX3Byb3QpLCBvcnBoYW5zLAorCQkgICB0Y3BfZGVhdGhfcm93LnR3X2NvdW50LCBzb2NrZXRzLAogCQkgICBhdG9taWNfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlVEUDogaW51c2UgJWQgbWVtICVkXG4iLAogCQkgICBzb2NrX3Byb3RfaW51c2VfZ2V0KG5ldCwgJnVkcF9wcm90KSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDc3YmZiYTkuLjk3ZjcxMTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJaWYgKCpwb3MgPT0gMCkKIAkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKIAotCWZvciAoY3B1ID0gKnBvcy0xOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgeworCWZvciAoY3B1ID0gKnBvcy0xOyBjcHUgPCBucl9jcHVfaWRzOyArK2NwdSkgewogCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQogCQkJY29udGludWU7CiAJCSpwb3MgPSBjcHUrMTsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogewogCWludCBjcHU7CiAKLQlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBucl9jcHVfaWRzOyArK2NwdSkgewogCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQogCQkJY29udGludWU7CiAJCSpwb3MgPSBjcHUrMTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggMWYzZDUyOS4uZjI4YWNmMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTE4MzYsNyArMTgzNiw2IEBACiAJc3RhdGUgPSBzay0+c2tfc3RhdGU7CiAJc29ja19ob2xkKHNrKTsKIAlzb2NrX29ycGhhbihzayk7Ci0JcGVyY3B1X2NvdW50ZXJfaW5jKHNrLT5za19wcm90LT5vcnBoYW5fY291bnQpOwogCiAJLyogSXQgaXMgdGhlIGxhc3QgcmVsZWFzZV9zb2NrIGluIGl0cyBsaWZlLiBJdCB3aWxsIHJlbW92ZSBiYWNrbG9nLiAqLwogCXJlbGVhc2Vfc29jayhzayk7CkBAIC0xODQ5LDYgKzE4NDgsOCBAQAogCWJoX2xvY2tfc29jayhzayk7CiAJV0FSTl9PTihzb2NrX293bmVkX2J5X3VzZXIoc2spKTsKIAorCXBlcmNwdV9jb3VudGVyX2luYyhzay0+c2tfcHJvdC0+b3JwaGFuX2NvdW50KTsKKwogCS8qIEhhdmUgd2UgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCBieSBhIHNvZnRpcnEgb3IgYmFja2xvZz8gKi8KIAlpZiAoc3RhdGUgIT0gVENQX0NMT1NFICYmIHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMTAxNzI0OC4uOWQ4MzlmYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC01MSw2ICs1MSw3IEBACiAgKi8KIAogCisjaW5jbHVkZSA8bGludXgvYm90dG9tX2hhbGYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNzk3LDcgKzE3OTgsOSBAQAogCXNrLT5za19zbmRidWYgPSBzeXNjdGxfdGNwX3dtZW1bMV07CiAJc2stPnNrX3JjdmJ1ZiA9IHN5c2N0bF90Y3Bfcm1lbVsxXTsKIAorCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlwZXJjcHVfY291bnRlcl9pbmMoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDg3MDJiMDYuLmU4YjgzMzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMjMsNiArMjMsNyBAQAogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ib3R0b21faGFsZi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE4MzAsNyArMTgzMSw5IEBACiAJc2stPnNrX3NuZGJ1ZiA9IHN5c2N0bF90Y3Bfd21lbVsxXTsKIAlzay0+c2tfcmN2YnVmID0gc3lzY3RsX3RjcF9ybWVtWzFdOwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOwogCXBlcmNwdV9jb3VudGVyX2luYygmdGNwX3NvY2tldHNfYWxsb2NhdGVkKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMKaW5kZXggOTM5NGY1My4uM2ViNWUyNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsYy5jCkBAIC01MDcsNyArNTA3LDcgQEAKIAkvKiBObyBjYWNoZSBlbnRyeSBvciBpdCBpcyBpbnZhbGlkLCB0aW1lIHRvIHNjaGVkdWxlICovCiAJZGVzdCA9IF9faXBfdnNfbGJsY19zY2hlZHVsZShzdmMpOwogCWlmICghZGVzdCkgewotCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCUlQX1ZTX0VSUl9STCgiTEJMQzogbm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCmluZGV4IDkyZGM3NmEuLmMwNGNlNTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCkBAIC02OTAsNyArNjkwLDcgQEAKIAkJLyogVGhlIGNhY2hlIGVudHJ5IGlzIGludmFsaWQsIHRpbWUgdG8gc2NoZWR1bGUgKi8KIAkJZGVzdCA9IF9faXBfdnNfbGJsY3Jfc2NoZWR1bGUoc3ZjKTsKIAkJaWYgKCFkZXN0KSB7Ci0JCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCQlJUF9WU19FUlJfUkwoIkxCTENSOiBubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOwogCQkJcmVhZF91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xjLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGMuYwppbmRleCA1MTkxMmNhLi5kMGRhZGM4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGMuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGMuYwpAQCAtNjYsMTEgKzY2LDE1IEBACiAJCX0KIAl9CiAKLQlpZiAobGVhc3QpCi0JSVBfVlNfREJHX0JVRig2LCAiTEM6IHNlcnZlciAlczoldSBhY3RpdmVjb25ucyAlZCBpbmFjdGNvbm5zICVkXG4iLAotCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmbGVhc3QtPmFkZHIpLCBudG9ocyhsZWFzdC0+cG9ydCksCi0JCSAgICAgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgICAgICBhdG9taWNfcmVhZCgmbGVhc3QtPmluYWN0Y29ubnMpKTsKKwlpZiAoIWxlYXN0KQorCQlJUF9WU19FUlJfUkwoIkxDOiBubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOworCWVsc2UKKwkJSVBfVlNfREJHX0JVRig2LCAiTEM6IHNlcnZlciAlczoldSBhY3RpdmVjb25ucyAlZCAiCisJCQkgICAgICAiaW5hY3Rjb25ucyAlZFxuIiwKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKHN2Yy0+YWYsICZsZWFzdC0+YWRkciksCisJCQkgICAgICBudG9ocyhsZWFzdC0+cG9ydCksCisJCQkgICAgICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJCSAgICAgIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucykpOwogCiAJcmV0dXJuIGxlYXN0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25xLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbnEuYwppbmRleCA2NzU4YWQyLi42OTQ5NTJkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbnEuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbnEuYwpAQCAtOTUsOCArOTUsMTAgQEAKIAkJfQogCX0KIAotCWlmICghbGVhc3QpCisJaWYgKCFsZWFzdCkgeworCQlJUF9WU19FUlJfUkwoIk5ROiBubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAKICAgb3V0OgogCUlQX1ZTX0RCR19CVUYoNiwgIk5ROiBzZXJ2ZXIgJXM6JXUgIgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3JyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcnIuYwppbmRleCA4ZmI1MWMxLi4yZDE2YWI3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcnIuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcnIuYwpAQCAtNjksNiArNjksNyBAQAogCQlxID0gcS0+bmV4dDsKIAl9IHdoaWxlIChxICE9IHApOwogCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlJUF9WU19FUlJfUkwoIlJSOiBubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOwogCXJldHVybiBOVUxMOwogCiAgIG91dDoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zZWQuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zZWQuYwppbmRleCA2OTFhNmEwLi4yMGU0NjU3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2VkLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3NlZC5jCkBAIC04NCw2ICs4NCw3IEBACiAJCQlnb3RvIG5leHRzdGFnZTsKIAkJfQogCX0KKwlJUF9WU19FUlJfUkwoIlNFRDogbm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKIAlyZXR1cm4gTlVMTDsKIAogCS8qCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2guYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCmluZGV4IDBlNTM5NTUuLjc1NzA5ZWIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCkBAIC0yMTksNiArMjE5LDcgQEAKIAkgICAgfHwgIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpCiAJICAgIHx8IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpIDw9IDAKIAkgICAgfHwgaXNfb3ZlcmxvYWRlZChkZXN0KSkgeworCQlJUF9WU19FUlJfUkwoIlNIOiBubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193bGMuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193bGMuYwppbmRleCA1N2I0NTJiLi44ZTk0MjU2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd2xjLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dsYy5jCkBAIC03Miw2ICs3Miw3IEBACiAJCQlnb3RvIG5leHRzdGFnZTsKIAkJfQogCX0KKwlJUF9WU19FUlJfUkwoIldMQzogbm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKIAlyZXR1cm4gTlVMTDsKIAogCS8qCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMKaW5kZXggMmY2MThkYy4uZjdkNzRlZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dyci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193cnIuYwpAQCAtMTU1LDYgKzE1NSw4IEBACiAKIAkJCWlmIChtYXJrLT5jbCA9PSBtYXJrLT5jbC0+bmV4dCkgewogCQkJCS8qIG5vIGRlc3QgZW50cnkgKi8KKwkJCQlJUF9WU19FUlJfUkwoIldSUjogbm8gZGVzdGluYXRpb24gYXZhaWxhYmxlOiAiCisJCQkJCSAgICAgIm5vIGRlc3RpbmF0aW9ucyBwcmVzZW50XG4iKTsKIAkJCQlkZXN0ID0gTlVMTDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTE2OCw4ICsxNzAsOCBAQAogCQkJCSAqLwogCQkJCWlmIChtYXJrLT5jdyA9PSAwKSB7CiAJCQkJCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOwotCQkJCQlJUF9WU19FUlJfUkwoImlwX3ZzX3dycl9zY2hlZHVsZSgpOiAiCi0JCQkJCQkgICAibm8gYXZhaWxhYmxlIHNlcnZlcnNcbiIpOworCQkJCQlJUF9WU19FUlJfUkwoIldSUjogbm8gZGVzdGluYXRpb24gIgorCQkJCQkJICAgICAiYXZhaWxhYmxlXG4iKTsKIAkJCQkJZGVzdCA9IE5VTEw7CiAJCQkJCWdvdG8gb3V0OwogCQkJCX0KQEAgLTE5MSw2ICsxOTMsOCBAQAogCQkJLyogYmFjayB0byB0aGUgc3RhcnQsIGFuZCBubyBkZXN0IGlzIGZvdW5kLgogCQkJICAgSXQgaXMgb25seSBwb3NzaWJsZSB3aGVuIGFsbCBkZXN0cyBhcmUgT1ZFUkxPQURFRCAqLwogCQkJZGVzdCA9IE5VTEw7CisJCQlJUF9WU19FUlJfUkwoIldSUjogbm8gZGVzdGluYXRpb24gYXZhaWxhYmxlOiAiCisJCQkJICAgICAiYWxsIGRlc3RpbmF0aW9ucyBhcmUgb3ZlcmxvYWRlZFxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCBmMzdiOWI3Li40ZGE1NGIwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAlpZiAoKnBvcyA9PSAwKQogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogCi0JZm9yIChjcHUgPSAqcG9zLTE7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJZm9yIChjcHUgPSAqcG9zLTE7IGNwdSA8IG5yX2NwdV9pZHM7ICsrY3B1KSB7CiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSArIDE7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlpbnQgY3B1OwogCi0JZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgeworCWZvciAoY3B1ID0gKnBvczsgY3B1IDwgbnJfY3B1X2lkczsgKytjcHUpIHsKIAkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKIAkJCWNvbnRpbnVlOwogCQkqcG9zID0gY3B1ICsgMTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9LY29uZmlnIGIvbmV0L3NjaGVkL0tjb25maWcKaW5kZXggNGY3ZWYwZC4uOTI5MjE4YTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9LY29uZmlnCisrKyBiL25ldC9zY2hlZC9LY29uZmlnCkBAIC0zMzUsOSArMzM1LDYgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY2xhc3NpZnkgcGFja2V0cyBiYXNlZCBvbiB0aGUgY29udHJvbAogCSAgY2dyb3VwIG9mIHRoZWlyIHByb2Nlc3MuCiAKLQkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbHNfY2dyb3VwLgotCiBjb25maWcgTkVUX0VNQVRDSAogCWJvb2wgIkV4dGVuZGVkIE1hdGNoZXMiCiAJc2VsZWN0IE5FVF9DTFMKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMgYi9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCmluZGV4IDBkNjhiMTkuLjkxYTNkYjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19jZ3JvdXAuYwpAQCAtMjQsMTAgKzI0LDE2IEBACiAJdTMyIGNsYXNzaWQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjZ3JvdXBfY2xzX3N0YXRlICpuZXRfY2xzX3N0YXRlKHN0cnVjdCBjZ3JvdXAgKmNncnApCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZ3JvdXBfY2xzX3N0YXRlICpjZ3JwX2Nsc19zdGF0ZShzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogewotCXJldHVybiAoc3RydWN0IGNncm91cF9jbHNfc3RhdGUgKikKLQkJY2dyb3VwX3N1YnN5c19zdGF0ZShjZ3JwLCBuZXRfY2xzX3N1YnN5c19pZCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjZ3JvdXBfc3Vic3lzX3N0YXRlKGNncnAsIG5ldF9jbHNfc3Vic3lzX2lkKSwKKwkJCSAgICBzdHJ1Y3QgY2dyb3VwX2Nsc19zdGF0ZSwgY3NzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2dyb3VwX2Nsc19zdGF0ZSAqdGFza19jbHNfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBjb250YWluZXJfb2YodGFza19zdWJzeXNfc3RhdGUocCwgbmV0X2Nsc19zdWJzeXNfaWQpLAorCQkJICAgIHN0cnVjdCBjZ3JvdXBfY2xzX3N0YXRlLCBjc3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNncnBfY3JlYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKQEAgLTM5LDE5ICs0NSwxOSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlmIChjZ3JwLT5wYXJlbnQpCi0JCWNzLT5jbGFzc2lkID0gbmV0X2Nsc19zdGF0ZShjZ3JwLT5wYXJlbnQpLT5jbGFzc2lkOworCQljcy0+Y2xhc3NpZCA9IGNncnBfY2xzX3N0YXRlKGNncnAtPnBhcmVudCktPmNsYXNzaWQ7CiAKIAlyZXR1cm4gJmNzLT5jc3M7CiB9CiAKIHN0YXRpYyB2b2lkIGNncnBfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApCiB7Ci0Ja2ZyZWUoc3MpOworCWtmcmVlKGNncnBfY2xzX3N0YXRlKGNncnApKTsKIH0KIAogc3RhdGljIHU2NCByZWFkX2NsYXNzaWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQogewotCXJldHVybiBuZXRfY2xzX3N0YXRlKGNncnApLT5jbGFzc2lkOworCXJldHVybiBjZ3JwX2Nsc19zdGF0ZShjZ3JwKS0+Y2xhc3NpZDsKIH0KIAogc3RhdGljIGludCB3cml0ZV9jbGFzc2lkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwgdTY0IHZhbHVlKQpAQCAtNTksNyArNjUsNyBAQAogCWlmICghY2dyb3VwX2xvY2tfbGl2ZV9ncm91cChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQluZXRfY2xzX3N0YXRlKGNncnApLT5jbGFzc2lkID0gKHUzMikgdmFsdWU7CisJY2dycF9jbHNfc3RhdGUoY2dycCktPmNsYXNzaWQgPSAodTMyKSB2YWx1ZTsKIAogCWNncm91cF91bmxvY2soKTsKIApAQCAtMTE1LDggKzEyMSw3IEBACiAJCXJldHVybiAtMTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQljcyA9IChzdHJ1Y3QgY2dyb3VwX2Nsc19zdGF0ZSAqKSB0YXNrX3N1YnN5c19zdGF0ZShjdXJyZW50LAotCQkJCQkJCSAgIG5ldF9jbHNfc3Vic3lzX2lkKTsKKwljcyA9IHRhc2tfY2xzX3N0YXRlKGN1cnJlbnQpOwogCWlmIChjcy0+Y2xhc3NpZCAmJiB0Y2ZfZW1fdHJlZV9tYXRjaChza2IsICZoZWFkLT5lbWF0Y2hlcywgTlVMTCkpIHsKIAkJcmVzLT5jbGFzc2lkID0gY3MtPmNsYXNzaWQ7CiAJCXJlcy0+Y2xhc3MgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoLmMgYi9uZXQvc3VucnBjL2F1dGguYwppbmRleCAwNDQzZjgzLi4wYzQzMWMyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGguYworKysgYi9uZXQvc3VucnBjL2F1dGguYwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNyZWQsIG5leHQsICZjcmVkX3VudXNlZCwgY3JfbHJ1KSB7CiAKIAkJLyogRW5mb3JjZSBhIDYwIHNlY29uZCBnYXJiYWdlIGNvbGxlY3Rpb24gbW9yYXRvcml1bSAqLwotCQlpZiAodGltZV9pbl9yYW5nZShjcmVkLT5jcl9leHBpcmUsIGV4cGlyZWQsIGppZmZpZXMpICYmCisJCWlmICh0aW1lX2luX3JhbmdlX29wZW4oY3JlZC0+Y3JfZXhwaXJlLCBleHBpcmVkLCBqaWZmaWVzKSAmJgogCQkgICAgdGVzdF9iaXQoUlBDQVVUSF9DUkVEX0hBU0hFRCwgJmNyZWQtPmNyX2ZsYWdzKSAhPSAwKQogCQkJY29udGludWU7CiAKQEAgLTUxNSw3ICs1MTUsNyBAQAogCWlmIChjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEpCiAJCXJldHVybiBjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEodGFzaywgZW5jb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKIAkvKiBCeSBkZWZhdWx0LCB3ZSBlbmNvZGUgdGhlIGFyZ3VtZW50cyBub3JtYWxseS4gKi8KLQlyZXR1cm4gcnBjX2NhbGxfeGRycHJvYyhlbmNvZGUsIHJxc3RwLCBkYXRhLCBvYmopOworCXJldHVybiBlbmNvZGUocnFzdHAsIGRhdGEsIG9iaik7CiB9CiAKIGludApAQCAtNTMwLDcgKzUzMCw3IEBACiAJCXJldHVybiBjcmVkLT5jcl9vcHMtPmNydW53cmFwX3Jlc3AodGFzaywgZGVjb2RlLCBycXN0cCwKIAkJCQkJCSAgIGRhdGEsIG9iaik7CiAJLyogQnkgZGVmYXVsdCwgd2UgZGVjb2RlIHRoZSBhcmd1bWVudHMgbm9ybWFsbHkuICovCi0JcmV0dXJuIHJwY19jYWxsX3hkcnByb2MoZGVjb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKKwlyZXR1cm4gZGVjb2RlKHJxc3RwLCBkYXRhLCBvYmopOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwppbmRleCA4NTNhNDE0Li5lNjMwYjM4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC03MiwxMSArNzIsMjUgQEAKIAlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICptZWNoOwogCWVudW0gcnBjX2dzc19zdmMgc2VydmljZTsKIAlzdHJ1Y3QgcnBjX2NsbnQgKmNsaWVudDsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJLyoKKwkgKiBUaGVyZSBhcmUgdHdvIHVwY2FsbCBwaXBlczsgZGVudHJ5WzFdLCBuYW1lZCAiZ3NzZCIsIGlzIHVzZWQKKwkgKiBmb3IgdGhlIG5ldyB0ZXh0LWJhc2VkIHVwY2FsbDsgZGVudHJ5WzBdIGlzIG5hbWVkIGFmdGVyIHRoZQorCSAqIG1lY2hhbmlzbSAoZm9yIGV4YW1wbGUsICJrcmI1IikgYW5kIGV4aXN0cyBmb3IKKwkgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGdzc2Qncy4KKwkgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnlbMl07CiB9OwogCisvKiBwaXBlX3ZlcnNpb24gPj0gMCBpZiBhbmQgb25seSBpZiBzb21lb25lIGhhcyBhIHBpcGUgb3Blbi4gKi8KK3N0YXRpYyBpbnQgcGlwZV92ZXJzaW9uID0gLTE7CitzdGF0aWMgYXRvbWljX3QgcGlwZV91c2VycyA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFRklORV9TUElOTE9DSyhwaXBlX3ZlcnNpb25fbG9jayk7CitzdGF0aWMgc3RydWN0IHJwY193YWl0X3F1ZXVlIHBpcGVfdmVyc2lvbl9ycGNfd2FpdHF1ZXVlOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHBpcGVfdmVyc2lvbl93YWl0cXVldWUpOworCiBzdGF0aWMgdm9pZCBnc3NfZnJlZV9jdHgoc3RydWN0IGdzc19jbF9jdHggKik7Ci1zdGF0aWMgc3RydWN0IHJwY19waXBlX29wcyBnc3NfdXBjYWxsX29wczsKK3N0YXRpYyBzdHJ1Y3QgcnBjX3BpcGVfb3BzIGdzc191cGNhbGxfb3BzX3YwOworc3RhdGljIHN0cnVjdCBycGNfcGlwZV9vcHMgZ3NzX3VwY2FsbF9vcHNfdjE7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdzc19jbF9jdHggKgogZ3NzX2dldF9jdHgoc3RydWN0IGdzc19jbF9jdHggKmN0eCkKQEAgLTIyMCw2ICsyMzQsNyBAQAogCXJldHVybiBwOwogfQogCisjZGVmaW5lIFVQQ0FMTF9CVUZfTEVOIDEyOAogCiBzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgewogCWF0b21pY190IGNvdW50OwpAQCAtMjI3LDE2ICsyNDIsNDEgQEAKIAlzdHJ1Y3QgcnBjX3BpcGVfbXNnIG1zZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGdzc19hdXRoICphdXRoOworCXN0cnVjdCBycGNfaW5vZGUgKmlub2RlOwogCXN0cnVjdCBycGNfd2FpdF9xdWV1ZSBycGNfd2FpdHF1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxdWV1ZTsKIAlzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4OworCWNoYXIgZGF0YWJ1ZltVUENBTExfQlVGX0xFTl07CiB9OwogCitzdGF0aWMgaW50IGdldF9waXBlX3ZlcnNpb24odm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZwaXBlX3ZlcnNpb25fbG9jayk7CisJaWYgKHBpcGVfdmVyc2lvbiA+PSAwKSB7CisJCWF0b21pY19pbmMoJnBpcGVfdXNlcnMpOworCQlyZXQgPSBwaXBlX3ZlcnNpb247CisJfSBlbHNlCisJCXJldCA9IC1FQUdBSU47CisJc3Bpbl91bmxvY2soJnBpcGVfdmVyc2lvbl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdXRfcGlwZV92ZXJzaW9uKHZvaWQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJnBpcGVfdXNlcnMsICZwaXBlX3ZlcnNpb25fbG9jaykpIHsKKwkJcGlwZV92ZXJzaW9uID0gLTE7CisJCXNwaW5fdW5sb2NrKCZwaXBlX3ZlcnNpb25fbG9jayk7CisJfQorfQorCiBzdGF0aWMgdm9pZAogZ3NzX3JlbGVhc2VfbXNnKHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZykKIHsKIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmdzc19tc2ctPmNvdW50KSkKIAkJcmV0dXJuOworCXB1dF9waXBlX3ZlcnNpb24oKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmdzc19tc2ctPmxpc3QpKTsKIAlpZiAoZ3NzX21zZy0+Y3R4ICE9IE5VTEwpCiAJCWdzc19wdXRfY3R4KGdzc19tc2ctPmN0eCk7CkBAIC0yNjYsOCArMzA2LDggQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdzc191cGNhbGxfbXNnICoKIGdzc19hZGRfbXNnKHN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGgsIHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZ3NzX2F1dGgtPmRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSBnc3NfbXNnLT5pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJnJwY2ktPnZmc19pbm9kZTsKIAlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKm9sZDsKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC0yOTMsOCArMzMzLDcgQEAKIHN0YXRpYyB2b2lkCiBnc3NfdW5oYXNoX21zZyhzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cpCiB7Ci0Jc3RydWN0IGdzc19hdXRoICpnc3NfYXV0aCA9IGdzc19tc2ctPmF1dGg7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGdzc19hdXRoLT5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICZnc3NfbXNnLT5pbm9kZS0+dmZzX2lub2RlOwogCiAJaWYgKGxpc3RfZW1wdHkoJmdzc19tc2ctPmxpc3QpKQogCQlyZXR1cm47CkBAIC0zMTAsNyArMzQ5LDcgQEAKIAlzdHJ1Y3QgZ3NzX2NyZWQgKmdzc19jcmVkID0gY29udGFpbmVyX29mKHRhc2stPnRrX21zZy5ycGNfY3JlZCwKIAkJCXN0cnVjdCBnc3NfY3JlZCwgZ2NfYmFzZSk7CiAJc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnID0gZ3NzX2NyZWQtPmdjX3VwY2FsbDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZ3NzX21zZy0+YXV0aC0+ZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmZ3NzX21zZy0+aW5vZGUtPnZmc19pbm9kZTsKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKGdzc19tc2ctPmN0eCkKQEAgLTMyMywyMiArMzYyLDc1IEBACiAJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOwogfQogCitzdGF0aWMgdm9pZCBnc3NfZW5jb2RlX3YwX21zZyhzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cpCit7CisJZ3NzX21zZy0+bXNnLmRhdGEgPSAmZ3NzX21zZy0+dWlkOworCWdzc19tc2ctPm1zZy5sZW4gPSBzaXplb2YoZ3NzX21zZy0+dWlkKTsKK30KKworc3RhdGljIHZvaWQgZ3NzX2VuY29kZV92MV9tc2coc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnLAorCQkJCXN0cnVjdCBycGNfY2xudCAqY2xudCwgaW50IG1hY2hpbmVfY3JlZCkKK3sKKwljaGFyICpwID0gZ3NzX21zZy0+ZGF0YWJ1ZjsKKwlpbnQgbGVuID0gMDsKKworCWdzc19tc2ctPm1zZy5sZW4gPSBzcHJpbnRmKGdzc19tc2ctPmRhdGFidWYsICJtZWNoPSVzIHVpZD0lZCAiLAorCQkJCSAgIGdzc19tc2ctPmF1dGgtPm1lY2gtPmdtX25hbWUsCisJCQkJICAgZ3NzX21zZy0+dWlkKTsKKwlwICs9IGdzc19tc2ctPm1zZy5sZW47CisJaWYgKGNsbnQtPmNsX3ByaW5jaXBhbCkgeworCQlsZW4gPSBzcHJpbnRmKHAsICJ0YXJnZXQ9JXMgIiwgY2xudC0+Y2xfcHJpbmNpcGFsKTsKKwkJcCArPSBsZW47CisJCWdzc19tc2ctPm1zZy5sZW4gKz0gbGVuOworCX0KKwlpZiAobWFjaGluZV9jcmVkKSB7CisJCWxlbiA9IHNwcmludGYocCwgInNlcnZpY2U9KiAiKTsKKwkJcCArPSBsZW47CisJCWdzc19tc2ctPm1zZy5sZW4gKz0gbGVuOworCX0gZWxzZSBpZiAoIXN0cmNtcChjbG50LT5jbF9wcm9ncmFtLT5uYW1lLCAibmZzNF9jYiIpKSB7CisJCWxlbiA9IHNwcmludGYocCwgInNlcnZpY2U9bmZzICIpOworCQlwICs9IGxlbjsKKwkJZ3NzX21zZy0+bXNnLmxlbiArPSBsZW47CisJfQorCWxlbiA9IHNwcmludGYocCwgIlxuIik7CisJZ3NzX21zZy0+bXNnLmxlbiArPSBsZW47CisKKwlnc3NfbXNnLT5tc2cuZGF0YSA9IGdzc19tc2ctPmRhdGFidWY7CisJQlVHX09OKGdzc19tc2ctPm1zZy5sZW4gPiBVUENBTExfQlVGX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkIGdzc19lbmNvZGVfbXNnKHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZywKKwkJCQlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIGludCBtYWNoaW5lX2NyZWQpCit7CisJaWYgKHBpcGVfdmVyc2lvbiA9PSAwKQorCQlnc3NfZW5jb2RlX3YwX21zZyhnc3NfbXNnKTsKKwllbHNlIC8qIHBpcGVfdmVyc2lvbiA9PSAxICovCisJCWdzc19lbmNvZGVfdjFfbXNnKGdzc19tc2csIGNsbnQsIG1hY2hpbmVfY3JlZCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdzc191cGNhbGxfbXNnICoKLWdzc19hbGxvY19tc2coc3RydWN0IGdzc19hdXRoICpnc3NfYXV0aCwgdWlkX3QgdWlkKQorZ3NzX2FsbG9jX21zZyhzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCB1aWRfdCB1aWQsIHN0cnVjdCBycGNfY2xudCAqY2xudCwKKwkJaW50IG1hY2hpbmVfY3JlZCkKIHsKIAlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisJaW50IHZlcnM7CiAKIAlnc3NfbXNnID0ga3phbGxvYyhzaXplb2YoKmdzc19tc2cpLCBHRlBfTk9GUyk7Ci0JaWYgKGdzc19tc2cgIT0gTlVMTCkgewotCQlJTklUX0xJU1RfSEVBRCgmZ3NzX21zZy0+bGlzdCk7Ci0JCXJwY19pbml0X3dhaXRfcXVldWUoJmdzc19tc2ctPnJwY193YWl0cXVldWUsICJSUENTRUNfR1NTIHVwY2FsbCB3YWl0cSIpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZnc3NfbXNnLT53YWl0cXVldWUpOwotCQlhdG9taWNfc2V0KCZnc3NfbXNnLT5jb3VudCwgMSk7Ci0JCWdzc19tc2ctPm1zZy5kYXRhID0gJmdzc19tc2ctPnVpZDsKLQkJZ3NzX21zZy0+bXNnLmxlbiA9IHNpemVvZihnc3NfbXNnLT51aWQpOwotCQlnc3NfbXNnLT51aWQgPSB1aWQ7Ci0JCWdzc19tc2ctPmF1dGggPSBnc3NfYXV0aDsKKwlpZiAoZ3NzX21zZyA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl2ZXJzID0gZ2V0X3BpcGVfdmVyc2lvbigpOworCWlmICh2ZXJzIDwgMCkgeworCQlrZnJlZShnc3NfbXNnKTsKKwkJcmV0dXJuIEVSUl9QVFIodmVycyk7CiAJfQorCWdzc19tc2ctPmlub2RlID0gUlBDX0koZ3NzX2F1dGgtPmRlbnRyeVt2ZXJzXS0+ZF9pbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmdzc19tc2ctPmxpc3QpOworCXJwY19pbml0X3dhaXRfcXVldWUoJmdzc19tc2ctPnJwY193YWl0cXVldWUsICJSUENTRUNfR1NTIHVwY2FsbCB3YWl0cSIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmdzc19tc2ctPndhaXRxdWV1ZSk7CisJYXRvbWljX3NldCgmZ3NzX21zZy0+Y291bnQsIDEpOworCWdzc19tc2ctPnVpZCA9IHVpZDsKKwlnc3NfbXNnLT5hdXRoID0gZ3NzX2F1dGg7CisJZ3NzX2VuY29kZV9tc2coZ3NzX21zZywgY2xudCwgbWFjaGluZV9jcmVkKTsKIAlyZXR1cm4gZ3NzX21zZzsKIH0KIApAQCAtMzUwLDE2ICs0NDIsMTMgQEAKIAlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19uZXcsICpnc3NfbXNnOwogCXVpZF90IHVpZCA9IGNyZWQtPmNyX3VpZDsKIAotCS8qIFNwZWNpYWwgY2FzZTogcnBjLmdzc2QgYXNzdW1lcyB0aGF0IHVpZCA9PSAwIGltcGxpZXMgbWFjaGluZSBjcmVkcyAqLwotCWlmIChnc3NfY3JlZC0+Z2NfbWFjaGluZV9jcmVkICE9IDApCi0JCXVpZCA9IDA7Ci0KLQlnc3NfbmV3ID0gZ3NzX2FsbG9jX21zZyhnc3NfYXV0aCwgdWlkKTsKLQlpZiAoZ3NzX25ldyA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlnc3NfbmV3ID0gZ3NzX2FsbG9jX21zZyhnc3NfYXV0aCwgdWlkLCBjbG50LCBnc3NfY3JlZC0+Z2NfbWFjaGluZV9jcmVkKTsKKwlpZiAoSVNfRVJSKGdzc19uZXcpKQorCQlyZXR1cm4gZ3NzX25ldzsKIAlnc3NfbXNnID0gZ3NzX2FkZF9tc2coZ3NzX2F1dGgsIGdzc19uZXcpOwogCWlmIChnc3NfbXNnID09IGdzc19uZXcpIHsKLQkJaW50IHJlcyA9IHJwY19xdWV1ZV91cGNhbGwoZ3NzX2F1dGgtPmRlbnRyeS0+ZF9pbm9kZSwgJmdzc19uZXctPm1zZyk7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmZ3NzX25ldy0+aW5vZGUtPnZmc19pbm9kZTsKKwkJaW50IHJlcyA9IHJwY19xdWV1ZV91cGNhbGwoaW5vZGUsICZnc3NfbmV3LT5tc2cpOwogCQlpZiAocmVzKSB7CiAJCQlnc3NfdW5oYXNoX21zZyhnc3NfbmV3KTsKIAkJCWdzc19tc2cgPSBFUlJfUFRSKHJlcyk7CkBAIC0zNjksNiArNDU4LDE4IEBACiAJcmV0dXJuIGdzc19tc2c7CiB9CiAKK3N0YXRpYyB2b2lkIHdhcm5fZ3NzZCh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJhdGVsaW1pdDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlpZiAodGltZV9hZnRlcihub3csIHJhdGVsaW1pdCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlBDOiBBVVRIX0dTUyB1cGNhbGwgdGltZWQgb3V0LlxuIgorCQkJCSJQbGVhc2UgY2hlY2sgdXNlciBkYWVtb24gaXMgcnVubmluZy5cbiIpOworCQlyYXRlbGltaXQgPSBub3cgKyAxNSpIWjsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50CiBnc3NfcmVmcmVzaF91cGNhbGwoc3RydWN0IHJwY190YXNrICp0YXNrKQogewpAQCAtMzc4LDE2ICs0NzksMjUgQEAKIAlzdHJ1Y3QgZ3NzX2NyZWQgKmdzc19jcmVkID0gY29udGFpbmVyX29mKGNyZWQsCiAJCQlzdHJ1Y3QgZ3NzX2NyZWQsIGdjX2Jhc2UpOwogCXN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZ3NzX2F1dGgtPmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnIgPSAwOwogCiAJZHByaW50aygiUlBDOiAlNXUgZ3NzX3JlZnJlc2hfdXBjYWxsIGZvciB1aWQgJXVcbiIsIHRhc2stPnRrX3BpZCwKIAkJCQkJCQkJY3JlZC0+Y3JfdWlkKTsKIAlnc3NfbXNnID0gZ3NzX3NldHVwX3VwY2FsbCh0YXNrLT50a19jbGllbnQsIGdzc19hdXRoLCBjcmVkKTsKKwlpZiAoSVNfRVJSKGdzc19tc2cpID09IC1FQUdBSU4pIHsKKwkJLyogWFhYOiB3YXJuaW5nIG9uIHRoZSBmaXJzdCwgdW5kZXIgdGhlIGFzc3VtcHRpb24gd2UKKwkJICogc2hvdWxkbid0IG5vcm1hbGx5IGhpdCB0aGlzIGNhc2Ugb24gYSByZWZyZXNoLiAqLworCQl3YXJuX2dzc2QoKTsKKwkJdGFzay0+dGtfdGltZW91dCA9IDE1KkhaOworCQlycGNfc2xlZXBfb24oJnBpcGVfdmVyc2lvbl9ycGNfd2FpdHF1ZXVlLCB0YXNrLCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQogCWlmIChJU19FUlIoZ3NzX21zZykpIHsKIAkJZXJyID0gUFRSX0VSUihnc3NfbXNnKTsKIAkJZ290byBvdXQ7CiAJfQorCWlub2RlID0gJmdzc19tc2ctPmlub2RlLT52ZnNfaW5vZGU7CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAoZ3NzX2NyZWQtPmdjX3VwY2FsbCAhPSBOVUxMKQogCQlycGNfc2xlZXBfb24oJmdzc19jcmVkLT5nY191cGNhbGwtPnJwY193YWl0cXVldWUsIHRhc2ssIE5VTEwpOwpAQCAtNDE0LDE4ICs1MjQsMjkgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBnc3NfY3JlYXRlX3VwY2FsbChzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCBzdHJ1Y3QgZ3NzX2NyZWQgKmdzc19jcmVkKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBnc3NfYXV0aC0+ZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gJmdzc19jcmVkLT5nY19iYXNlOwogCXN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZzsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlpbnQgZXJyID0gMDsKIAogCWRwcmludGsoIlJQQzogICAgICAgZ3NzX3VwY2FsbCBmb3IgdWlkICV1XG4iLCBjcmVkLT5jcl91aWQpOworcmV0cnk6CiAJZ3NzX21zZyA9IGdzc19zZXR1cF91cGNhbGwoZ3NzX2F1dGgtPmNsaWVudCwgZ3NzX2F1dGgsIGNyZWQpOworCWlmIChQVFJfRVJSKGdzc19tc2cpID09IC1FQUdBSU4pIHsKKwkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocGlwZV92ZXJzaW9uX3dhaXRxdWV1ZSwKKwkJCQlwaXBlX3ZlcnNpb24gPj0gMCwgMTUqSFopOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChwaXBlX3ZlcnNpb24gPCAwKQorCQkJd2Fybl9nc3NkKCk7CisJCWdvdG8gcmV0cnk7CisJfQogCWlmIChJU19FUlIoZ3NzX21zZykpIHsKIAkJZXJyID0gUFRSX0VSUihnc3NfbXNnKTsKIAkJZ290byBvdXQ7CiAJfQorCWlub2RlID0gJmdzc19tc2ctPmlub2RlLT52ZnNfaW5vZGU7CiAJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXQoJmdzc19tc2ctPndhaXRxdWV1ZSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC01NDMsNiArNjY0LDM4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBnc3NfcGlwZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuZXdfdmVyc2lvbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmcGlwZV92ZXJzaW9uX2xvY2spOworCWlmIChwaXBlX3ZlcnNpb24gPCAwKSB7CisJCS8qIEZpcnN0IG9wZW4gb2YgYW55IGdzcyBwaXBlIGRldGVybWluZXMgdGhlIHZlcnNpb246ICovCisJCXBpcGVfdmVyc2lvbiA9IG5ld192ZXJzaW9uOworCQlycGNfd2FrZV91cCgmcGlwZV92ZXJzaW9uX3JwY193YWl0cXVldWUpOworCQl3YWtlX3VwKCZwaXBlX3ZlcnNpb25fd2FpdHF1ZXVlKTsKKwl9IGVsc2UgaWYgKHBpcGVfdmVyc2lvbiAhPSBuZXdfdmVyc2lvbikgeworCQkvKiBUcnlpbmcgdG8gb3BlbiBhIHBpcGUgb2YgYSBkaWZmZXJlbnQgdmVyc2lvbiAqLworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlhdG9taWNfaW5jKCZwaXBlX3VzZXJzKTsKK291dDoKKwlzcGluX3VubG9jaygmcGlwZV92ZXJzaW9uX2xvY2spOworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCBnc3NfcGlwZV9vcGVuX3YwKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGdzc19waXBlX29wZW4oaW5vZGUsIDApOworfQorCitzdGF0aWMgaW50IGdzc19waXBlX29wZW5fdjEoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gZ3NzX3BpcGVfb3Blbihpbm9kZSwgMSk7Cit9CisKIHN0YXRpYyB2b2lkCiBnc3NfcGlwZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC01NjIsMjcgKzcxNSwyMiBAQAogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlwdXRfcGlwZV92ZXJzaW9uKCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBnc3NfcGlwZV9kZXN0cm95X21zZyhzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2cpCiB7CiAJc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnID0gY29udGFpbmVyX29mKG1zZywgc3RydWN0IGdzc191cGNhbGxfbXNnLCBtc2cpOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJhdGVsaW1pdDsKIAogCWlmIChtc2ctPmVycm5vIDwgMCkgewogCQlkcHJpbnRrKCJSUEM6ICAgICAgIGdzc19waXBlX2Rlc3Ryb3lfbXNnIHJlbGVhc2luZyBtc2cgJXBcbiIsCiAJCQkJZ3NzX21zZyk7CiAJCWF0b21pY19pbmMoJmdzc19tc2ctPmNvdW50KTsKIAkJZ3NzX3VuaGFzaF9tc2coZ3NzX21zZyk7Ci0JCWlmIChtc2ctPmVycm5vID09IC1FVElNRURPVVQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQkJCWlmICh0aW1lX2FmdGVyKG5vdywgcmF0ZWxpbWl0KSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJQQzogQVVUSF9HU1MgdXBjYWxsIHRpbWVkIG91dC5cbiIKLQkJCQkJCSAgICAiUGxlYXNlIGNoZWNrIHVzZXIgZGFlbW9uIGlzIHJ1bm5pbmchXG4iKTsKLQkJCQlyYXRlbGltaXQgPSBub3cgKyAxNSpIWjsKLQkJCX0KLQkJfQorCQlpZiAobXNnLT5lcnJubyA9PSAtRVRJTUVET1VUKQorCQkJd2Fybl9nc3NkKCk7CiAJCWdzc19yZWxlYXNlX21zZyhnc3NfbXNnKTsKIAl9CiB9CkBAIC02MjMsMjAgKzc3MSwzOCBAQAogCWF0b21pY19zZXQoJmF1dGgtPmF1X2NvdW50LCAxKTsKIAlrcmVmX2luaXQoJmdzc19hdXRoLT5rcmVmKTsKIAotCWdzc19hdXRoLT5kZW50cnkgPSBycGNfbWtwaXBlKGNsbnQtPmNsX2RlbnRyeSwgZ3NzX2F1dGgtPm1lY2gtPmdtX25hbWUsCi0JCQljbG50LCAmZ3NzX3VwY2FsbF9vcHMsIFJQQ19QSVBFX1dBSVRfRk9SX09QRU4pOwotCWlmIChJU19FUlIoZ3NzX2F1dGgtPmRlbnRyeSkpIHsKLQkJZXJyID0gUFRSX0VSUihnc3NfYXV0aC0+ZGVudHJ5KTsKKwkvKgorCSAqIE5vdGU6IGlmIHdlIGNyZWF0ZWQgdGhlIG9sZCBwaXBlIGZpcnN0LCB0aGVuIHNvbWVvbmUgd2hvCisJICogZXhhbWluZWQgdGhlIGRpcmVjdG9yeSBhdCB0aGUgcmlnaHQgbW9tZW50IG1pZ2h0IGNvbmNsdWRlCisJICogdGhhdCB3ZSBzdXBwb3J0ZWQgb25seSB0aGUgb2xkIHBpcGUuICBTbyB3ZSBpbnN0ZWFkIGNyZWF0ZQorCSAqIHRoZSBuZXcgcGlwZSBmaXJzdC4KKwkgKi8KKwlnc3NfYXV0aC0+ZGVudHJ5WzFdID0gcnBjX21rcGlwZShjbG50LT5jbF9kZW50cnksCisJCQkJCSAiZ3NzZCIsCisJCQkJCSBjbG50LCAmZ3NzX3VwY2FsbF9vcHNfdjEsCisJCQkJCSBSUENfUElQRV9XQUlUX0ZPUl9PUEVOKTsKKwlpZiAoSVNfRVJSKGdzc19hdXRoLT5kZW50cnlbMV0pKSB7CisJCWVyciA9IFBUUl9FUlIoZ3NzX2F1dGgtPmRlbnRyeVsxXSk7CiAJCWdvdG8gZXJyX3B1dF9tZWNoOwogCX0KIAorCWdzc19hdXRoLT5kZW50cnlbMF0gPSBycGNfbWtwaXBlKGNsbnQtPmNsX2RlbnRyeSwKKwkJCQkJIGdzc19hdXRoLT5tZWNoLT5nbV9uYW1lLAorCQkJCQkgY2xudCwgJmdzc191cGNhbGxfb3BzX3YwLAorCQkJCQkgUlBDX1BJUEVfV0FJVF9GT1JfT1BFTik7CisJaWYgKElTX0VSUihnc3NfYXV0aC0+ZGVudHJ5WzBdKSkgeworCQllcnIgPSBQVFJfRVJSKGdzc19hdXRoLT5kZW50cnlbMF0pOworCQlnb3RvIGVycl91bmxpbmtfcGlwZV8xOworCX0KIAllcnIgPSBycGNhdXRoX2luaXRfY3JlZGNhY2hlKGF1dGgpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3VubGlua19waXBlOworCQlnb3RvIGVycl91bmxpbmtfcGlwZV8wOwogCiAJcmV0dXJuIGF1dGg7Ci1lcnJfdW5saW5rX3BpcGU6Ci0JcnBjX3VubGluayhnc3NfYXV0aC0+ZGVudHJ5KTsKK2Vycl91bmxpbmtfcGlwZV8wOgorCXJwY191bmxpbmsoZ3NzX2F1dGgtPmRlbnRyeVswXSk7CitlcnJfdW5saW5rX3BpcGVfMToKKwlycGNfdW5saW5rKGdzc19hdXRoLT5kZW50cnlbMV0pOwogZXJyX3B1dF9tZWNoOgogCWdzc19tZWNoX3B1dChnc3NfYXV0aC0+bWVjaCk7CiBlcnJfZnJlZToKQEAgLTY0OSw4ICs4MTUsOCBAQAogc3RhdGljIHZvaWQKIGdzc19mcmVlKHN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGgpCiB7Ci0JcnBjX3VubGluayhnc3NfYXV0aC0+ZGVudHJ5KTsKLQlnc3NfYXV0aC0+ZGVudHJ5ID0gTlVMTDsKKwlycGNfdW5saW5rKGdzc19hdXRoLT5kZW50cnlbMV0pOworCXJwY191bmxpbmsoZ3NzX2F1dGgtPmRlbnRyeVswXSk7CiAJZ3NzX21lY2hfcHV0KGdzc19hdXRoLT5tZWNoKTsKIAogCWtmcmVlKGdzc19hdXRoKTsKQEAgLTY5Myw3ICs4NTksNyBAQAogCXN0cnVjdCBycGNfdGFzayAqdGFzazsKIAogCWlmIChnc3NfY3JlZC0+Z2NfY3R4ID09IE5VTEwgfHwKLQkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKSA9PSAwKQorCSAgICB0ZXN0X2JpdChSUENBVVRIX0NSRURfVVBUT0RBVEUsICZjcmVkLT5jcl9mbGFncykgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlnc3NfY3JlZC0+Z2NfY3R4LT5nY19wcm9jID0gUlBDX0dTU19QUk9DX0RFU1RST1k7CkBAIC03NTcsMTQgKzkyMywxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotZ3NzX2Rlc3Ryb3lfY3JlZChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCitnc3NfZGVzdHJveV9udWxsY3JlZChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCiB7CiAJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsIGdjX2Jhc2UpOwogCXN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGggPSBjb250YWluZXJfb2YoY3JlZC0+Y3JfYXV0aCwgc3RydWN0IGdzc19hdXRoLCBycGNfYXV0aCk7CiAJc3RydWN0IGdzc19jbF9jdHggKmN0eCA9IGdzc19jcmVkLT5nY19jdHg7CiAKLQlpZiAoZ3NzX2Rlc3Ryb3lpbmdfY29udGV4dChjcmVkKSkKLQkJcmV0dXJuOwogCXJjdV9hc3NpZ25fcG9pbnRlcihnc3NfY3JlZC0+Z2NfY3R4LCBOVUxMKTsKIAljYWxsX3JjdSgmY3JlZC0+Y3JfcmN1LCBnc3NfZnJlZV9jcmVkX2NhbGxiYWNrKTsKIAlpZiAoY3R4KQpAQCAtNzcyLDYgKzkzNiwxNSBAQAogCWtyZWZfcHV0KCZnc3NfYXV0aC0+a3JlZiwgZ3NzX2ZyZWVfY2FsbGJhY2spOwogfQogCitzdGF0aWMgdm9pZAorZ3NzX2Rlc3Ryb3lfY3JlZChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisKKwlpZiAoZ3NzX2Rlc3Ryb3lpbmdfY29udGV4dChjcmVkKSkKKwkJcmV0dXJuOworCWdzc19kZXN0cm95X251bGxjcmVkKGNyZWQpOworfQorCiAvKgogICogTG9va3VwIFJQQ1NFQ19HU1MgY3JlZCBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcwogICovCkBAIC0xMDE3LDcgKzExOTAsNyBAQAogCW9mZnNldCA9ICh1OCAqKXAgLSAodTggKilzbmRfYnVmLT5oZWFkWzBdLmlvdl9iYXNlOwogCSpwKysgPSBodG9ubChycXN0cC0+cnFfc2Vxbm8pOwogCi0Jc3RhdHVzID0gcnBjX2NhbGxfeGRycHJvYyhlbmNvZGUsIHJxc3RwLCBwLCBvYmopOworCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCkBAIC0xMTExLDcgKzEyODQsNyBAQAogCW9mZnNldCA9ICh1OCAqKXAgLSAodTggKilzbmRfYnVmLT5oZWFkWzBdLmlvdl9iYXNlOwogCSpwKysgPSBodG9ubChycXN0cC0+cnFfc2Vxbm8pOwogCi0Jc3RhdHVzID0gcnBjX2NhbGxfeGRycHJvYyhlbmNvZGUsIHJxc3RwLCBwLCBvYmopOworCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCkBAIC0xMTcwLDEyICsxMzQzLDEyIEBACiAJCS8qIFRoZSBzcGVjIHNlZW1zIGEgbGl0dGxlIGFtYmlndW91cyBoZXJlLCBidXQgSSB0aGluayB0aGF0IG5vdAogCQkgKiB3cmFwcGluZyBjb250ZXh0IGRlc3RydWN0aW9uIHJlcXVlc3RzIG1ha2VzIHRoZSBtb3N0IHNlbnNlLgogCQkgKi8KLQkJc3RhdHVzID0gcnBjX2NhbGxfeGRycHJvYyhlbmNvZGUsIHJxc3RwLCBwLCBvYmopOworCQlzdGF0dXMgPSBlbmNvZGUocnFzdHAsIHAsIG9iaik7CiAJCWdvdG8gb3V0OwogCX0KIAlzd2l0Y2ggKGdzc19jcmVkLT5nY19zZXJ2aWNlKSB7CiAJCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKLQkJCXN0YXR1cyA9IHJwY19jYWxsX3hkcnByb2MoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKKwkJCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKIAkJCWJyZWFrOwogCQljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKIAkJCXN0YXR1cyA9IGdzc193cmFwX3JlcV9pbnRlZyhjcmVkLCBjdHgsIGVuY29kZSwKQEAgLTEyOTEsNyArMTQ2NCw3IEBACiAJY3JlZC0+Y3JfYXV0aC0+YXVfcnNsYWNrID0gY3JlZC0+Y3JfYXV0aC0+YXVfdmVyZnNpemUgKyAocCAtIHNhdmVkcCkKIAkJCQkJCSsgKHNhdmVkbGVuIC0gaGVhZC0+aW92X2xlbik7CiBvdXRfZGVjb2RlOgotCXN0YXR1cyA9IHJwY19jYWxsX3hkcnByb2MoZGVjb2RlLCBycXN0cCwgcCwgb2JqKTsKKwlzdGF0dXMgPSBkZWNvZGUocnFzdHAsIHAsIG9iaik7CiBvdXQ6CiAJZ3NzX3B1dF9jdHgoY3R4KTsKIAlkcHJpbnRrKCJSUEM6ICU1dSBnc3NfdW53cmFwX3Jlc3AgcmV0dXJuaW5nICVkXG4iLCB0YXNrLT50a19waWQsCkBAIC0xMzI0LDcgKzE0OTcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jcmVkb3BzIGdzc19udWxsb3BzID0gewogCS5jcl9uYW1lCT0gIkFVVEhfR1NTIiwKLQkuY3JkZXN0cm95CT0gZ3NzX2Rlc3Ryb3lfY3JlZCwKKwkuY3JkZXN0cm95CT0gZ3NzX2Rlc3Ryb3lfbnVsbGNyZWQsCiAJLmNyYmluZAkJPSBycGNhdXRoX2dlbmVyaWNfYmluZF9jcmVkLAogCS5jcm1hdGNoCT0gZ3NzX21hdGNoLAogCS5jcm1hcnNoYWwJPSBnc3NfbWFyc2hhbCwKQEAgLTEzMzQsMTAgKzE1MDcsMTkgQEAKIAkuY3J1bndyYXBfcmVzcAk9IGdzc191bndyYXBfcmVzcCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX3BpcGVfb3BzIGdzc191cGNhbGxfb3BzID0geworc3RhdGljIHN0cnVjdCBycGNfcGlwZV9vcHMgZ3NzX3VwY2FsbF9vcHNfdjAgPSB7CiAJLnVwY2FsbAkJPSBnc3NfcGlwZV91cGNhbGwsCiAJLmRvd25jYWxsCT0gZ3NzX3BpcGVfZG93bmNhbGwsCiAJLmRlc3Ryb3lfbXNnCT0gZ3NzX3BpcGVfZGVzdHJveV9tc2csCisJLm9wZW5fcGlwZQk9IGdzc19waXBlX29wZW5fdjAsCisJLnJlbGVhc2VfcGlwZQk9IGdzc19waXBlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHJwY19waXBlX29wcyBnc3NfdXBjYWxsX29wc192MSA9IHsKKwkudXBjYWxsCQk9IGdzc19waXBlX3VwY2FsbCwKKwkuZG93bmNhbGwJPSBnc3NfcGlwZV9kb3duY2FsbCwKKwkuZGVzdHJveV9tc2cJPSBnc3NfcGlwZV9kZXN0cm95X21zZywKKwkub3Blbl9waXBlCT0gZ3NzX3BpcGVfb3Blbl92MSwKIAkucmVsZWFzZV9waXBlCT0gZ3NzX3BpcGVfcmVsZWFzZSwKIH07CiAKQEAgLTEzNTQsNiArMTUzNiw3IEBACiAJZXJyID0gZ3NzX3N2Y19pbml0KCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwlycGNfaW5pdF93YWl0X3F1ZXVlKCZwaXBlX3ZlcnNpb25fcnBjX3dhaXRxdWV1ZSwgImdzcyBwaXBlIHZlcnNpb24iKTsKIAlyZXR1cm4gMDsKIG91dF91bnJlZ2lzdGVyOgogCXJwY2F1dGhfdW5yZWdpc3RlcigmYXV0aGdzc19vcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jCmluZGV4IGQ4M2I4ODEuLmMwYmEzOWMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19nZW5lcmljX3Rva2VuLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXJldHVybigxICsgZGVyX2xlbmd0aF9zaXplKGJvZHlfc2l6ZSkgKyBib2R5X3NpemUpOwogfQogCi1FWFBPUlRfU1lNQk9MKGdfdG9rZW5fc2l6ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChnX3Rva2VuX3NpemUpOwogCiAvKiBmaWxscyBpbiBhIGJ1ZmZlciB3aXRoIHRoZSB0b2tlbiBoZWFkZXIuICBUaGUgYnVmZmVyIGlzIGFzc3VtZWQgdG8KICAgIGJlIHRoZSByaWdodCBzaXplLiAgYnVmIGlzIGFkdmFuY2VkIHBhc3QgdGhlIHRva2VuIGhlYWRlciAqLwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJVFdSSVRFX1NUUigqYnVmLCBtZWNoLT5kYXRhLCAoKGludCkgbWVjaC0+bGVuKSk7CiB9CiAKLUVYUE9SVF9TWU1CT0woZ19tYWtlX3Rva2VuX2hlYWRlcik7CitFWFBPUlRfU1lNQk9MX0dQTChnX21ha2VfdG9rZW5faGVhZGVyKTsKIAogLyoKICAqIEdpdmVuIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSB0b2tlbiwgcmVhZHMgYW5kIHZlcmlmaWVzIHRoZSB0b2tlbiwKQEAgLTIzMSw1ICsyMzEsNSBAQAogCXJldHVybihyZXQpOwogfQogCi1FWFBPUlRfU1lNQk9MKGdfdmVyaWZ5X3Rva2VuX2hlYWRlcik7CitFWFBPUlRfU1lNQk9MX0dQTChnX3ZlcmlmeV90b2tlbl9oZWFkZXIpOwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYwppbmRleCBiY2U5ZDUyLi42ZWZiYjBjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19tZWNoX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGdzc19tZWNoX3JlZ2lzdGVyKTsKIAogdm9pZAogZ3NzX21lY2hfdW5yZWdpc3RlcihzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSkKQEAgLTEyOSw3ICsxMjksNyBAQAogCWdzc19tZWNoX2ZyZWUoZ20pOwogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19tZWNoX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoZ3NzX21lY2hfdW5yZWdpc3Rlcik7CiAKIHN0cnVjdCBnc3NfYXBpX21lY2ggKgogZ3NzX21lY2hfZ2V0KHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtKQpAQCAtMTM4LDcgKzEzOCw3IEBACiAJcmV0dXJuIGdtOwogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldCk7CitFWFBPUlRfU1lNQk9MX0dQTChnc3NfbWVjaF9nZXQpOwogCiBzdHJ1Y3QgZ3NzX2FwaV9tZWNoICoKIGdzc19tZWNoX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCkBAIC0xNTgsNyArMTU4LDcgQEAKIAogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldF9ieV9uYW1lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGdzc19tZWNoX2dldF9ieV9uYW1lKTsKIAogc3RhdGljIGlubGluZSBpbnQKIG1lY2hfc3VwcG9ydHNfcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgcHNldWRvZmxhdm9yKQpAQCAtMTkxLDcgKzE5MSw3IEBACiAJcmV0dXJuIGdtOwogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IpOworRVhQT1JUX1NZTUJPTF9HUEwoZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcik7CiAKIHUzMgogZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3Ioc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBzZXJ2aWNlKQpAQCAtMjA1LDcgKzIwNSw3IEBACiAJfQogCXJldHVybiBSUENfQVVUSF9NQVhGTEFWT1I7IC8qIGlsbGVnYWwgdmFsdWUgKi8KIH0KLUVYUE9SVF9TWU1CT0woZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3IpOworRVhQT1JUX1NZTUJPTF9HUEwoZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3IpOwogCiB1MzIKIGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSwgdTMyIHBzZXVkb2ZsYXZvcikKQEAgLTIxOSw3ICsyMTksNyBAQAogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MKGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZSk7CitFWFBPUlRfU1lNQk9MX0dQTChnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2UpOwogCiBjaGFyICoKIGdzc19zZXJ2aWNlX3RvX2F1dGhfZG9tYWluX25hbWUoc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBzZXJ2aWNlKQpAQCAtMjMzLDcgKzIzMyw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLUVYUE9SVF9TWU1CT0woZ3NzX3NlcnZpY2VfdG9fYXV0aF9kb21haW5fbmFtZSk7CitFWFBPUlRfU1lNQk9MX0dQTChnc3Nfc2VydmljZV90b19hdXRoX2RvbWFpbl9uYW1lKTsKIAogdm9pZAogZ3NzX21lY2hfcHV0KHN0cnVjdCBnc3NfYXBpX21lY2ggKiBnbSkKQEAgLTI0Miw3ICsyNDIsNyBAQAogCQltb2R1bGVfcHV0KGdtLT5nbV9vd25lcik7CiB9CiAKLUVYUE9SVF9TWU1CT0woZ3NzX21lY2hfcHV0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGdzc19tZWNoX3B1dCk7CiAKIC8qIFRoZSBtZWNoIGNvdWxkIHByb2JhYmx5IGJlIGRldGVybWluZWQgZnJvbSB0aGUgdG9rZW4gaW5zdGVhZCwgYnV0IGl0J3MganVzdAogICogYXMgZWFzeSBmb3Igbm93IHRvIHBhc3MgaXQgaW4uICovCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKaW5kZXggODFhZTNkNi4uMjI3OGE1MCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtMzMyLDYgKzMzMiw3IEBACiAJc3RydWN0IHN2Y19jcmVkCQljcmVkOwogCXN0cnVjdCBnc3Nfc3ZjX3NlcV9kYXRhCXNlcWRhdGE7CiAJc3RydWN0IGdzc19jdHgJCSptZWNoY3R4OworCWNoYXIJCQkqY2xpZW50X25hbWU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKnJzY190YWJsZVtSU0NfSEFTSE1BWF07CkBAIC0zNDYsNiArMzQ3LDcgQEAKIAkJZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmcnNjaS0+bWVjaGN0eCk7CiAJaWYgKHJzY2ktPmNyZWQuY3JfZ3JvdXBfaW5mbykKIAkJcHV0X2dyb3VwX2luZm8ocnNjaS0+Y3JlZC5jcl9ncm91cF9pbmZvKTsKKwlrZnJlZShyc2NpLT5jbGllbnRfbmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJzY19wdXQoc3RydWN0IGtyZWYgKnJlZikKQEAgLTM4Myw2ICszODUsNyBAQAogCXRtcC0+aGFuZGxlLmRhdGEgPSBOVUxMOwogCW5ldy0+bWVjaGN0eCA9IE5VTEw7CiAJbmV3LT5jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOworCW5ldy0+Y2xpZW50X25hbWUgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzk3LDYgKzQwMCw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJm5ldy0+c2VxZGF0YS5zZF9sb2NrKTsKIAluZXctPmNyZWQgPSB0bXAtPmNyZWQ7CiAJdG1wLT5jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOworCW5ldy0+Y2xpZW50X25hbWUgPSB0bXAtPmNsaWVudF9uYW1lOworCXRtcC0+Y2xpZW50X25hbWUgPSBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKgpAQCAtNDg2LDYgKzQ5MSwxNSBAQAogCQlzdGF0dXMgPSBnc3NfaW1wb3J0X3NlY19jb250ZXh0KGJ1ZiwgbGVuLCBnbSwgJnJzY2kubWVjaGN0eCk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKKworCQkvKiBnZXQgY2xpZW50IG5hbWUgKi8KKwkJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBidWYsIG1sZW4pOworCQlpZiAobGVuID4gMCkgeworCQkJcnNjaS5jbGllbnRfbmFtZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghcnNjaS5jbGllbnRfbmFtZSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCiAJfQogCXJzY2kuaC5leHBpcnlfdGltZSA9IGV4cGlyeTsKIAlyc2NwID0gcnNjX3VwZGF0ZSgmcnNjaSwgcnNjcCk7CkBAIC03NDYsNyArNzYwLDcgQEAKIAlyZXR1cm4gZ2QtPnBzZXVkb2ZsYXZvcjsKIH0KIAotRVhQT1JUX1NZTUJPTChzdmNhdXRoX2dzc19mbGF2b3IpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjYXV0aF9nc3NfZmxhdm9yKTsKIAogaW50CiBzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvciwgY2hhciAqIG5hbWUpCkBAIC03ODAsNyArNzk0LDcgQEAKIAlyZXR1cm4gc3RhdDsKIH0KIAotRVhQT1JUX1NZTUJPTChzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKTsKIAogc3RhdGljIGlubGluZSBpbnQKIHJlYWRfdTMyX2Zyb21feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBpbnQgYmFzZSwgdTMyICpvYmopCkBAIC05MTMsNiArOTI3LDE2IEBACiAJc3RydWN0IHJzYwkJCSpyc2NpOwogfTsKIAorY2hhciAqc3ZjX2dzc19wcmluY2lwYWwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgZ3NzX3N2Y19kYXRhICpnZCA9IChzdHJ1Y3QgZ3NzX3N2Y19kYXRhICopcnFzdHAtPnJxX2F1dGhfZGF0YTsKKworCWlmIChnZCAmJiBnZC0+cnNjaSkKKwkJcmV0dXJuIGdkLT5yc2NpLT5jbGllbnRfbmFtZTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19nc3NfcHJpbmNpcGFsKTsKKwogc3RhdGljIGludAogc3ZjYXV0aF9nc3Nfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCAzY2E1MTgzLi44MzZmMTVjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtMTk3LDYgKzE5NywxMiBAQAogCiAJY2xudC0+Y2xfcnR0ID0gJmNsbnQtPmNsX3J0dF9kZWZhdWx0OwogCXJwY19pbml0X3J0dCgmY2xudC0+Y2xfcnR0X2RlZmF1bHQsIGNsbnQtPmNsX3RpbWVvdXQtPnRvX2luaXR2YWwpOworCWNsbnQtPmNsX3ByaW5jaXBhbCA9IE5VTEw7CisJaWYgKGFyZ3MtPmNsaWVudF9uYW1lKSB7CisJCWNsbnQtPmNsX3ByaW5jaXBhbCA9IGtzdHJkdXAoYXJncy0+Y2xpZW50X25hbWUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNsbnQtPmNsX3ByaW5jaXBhbCkKKwkJCWdvdG8gb3V0X25vX3ByaW5jaXBhbDsKKwl9CiAKIAlrcmVmX2luaXQoJmNsbnQtPmNsX2tyZWYpOwogCkBAIC0yMjYsNiArMjMyLDggQEAKIAkJcnBjX3B1dF9tb3VudCgpOwogCX0KIG91dF9ub19wYXRoOgorCWtmcmVlKGNsbnQtPmNsX3ByaW5jaXBhbCk7CitvdXRfbm9fcHJpbmNpcGFsOgogCXJwY19mcmVlX2lvc3RhdHMoY2xudC0+Y2xfbWV0cmljcyk7CiBvdXRfbm9fc3RhdHM6CiAJaWYgKGNsbnQtPmNsX3NlcnZlciAhPSBjbG50LT5jbF9pbmxpbmVfbmFtZSkKQEAgLTM1NCw2ICszNjIsMTEgQEAKIAluZXctPmNsX21ldHJpY3MgPSBycGNfYWxsb2NfaW9zdGF0cyhjbG50KTsKIAlpZiAobmV3LT5jbF9tZXRyaWNzID09IE5VTEwpCiAJCWdvdG8gb3V0X25vX3N0YXRzOworCWlmIChjbG50LT5jbF9wcmluY2lwYWwpIHsKKwkJbmV3LT5jbF9wcmluY2lwYWwgPSBrc3RyZHVwKGNsbnQtPmNsX3ByaW5jaXBhbCwgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXctPmNsX3ByaW5jaXBhbCA9PSBOVUxMKQorCQkJZ290byBvdXRfbm9fcHJpbmNpcGFsOworCX0KIAlrcmVmX2luaXQoJm5ldy0+Y2xfa3JlZik7CiAJZXJyID0gcnBjX3NldHVwX3BpcGVkaXIobmV3LCBjbG50LT5jbF9wcm9ncmFtLT5waXBlX2Rpcl9uYW1lKTsKIAlpZiAoZXJyICE9IDApCkBAIC0zNjYsNiArMzc5LDggQEAKIAlycGNpb2RfdXAoKTsKIAlyZXR1cm4gbmV3Owogb3V0X25vX3BhdGg6CisJa2ZyZWUobmV3LT5jbF9wcmluY2lwYWwpOworb3V0X25vX3ByaW5jaXBhbDoKIAlycGNfZnJlZV9pb3N0YXRzKG5ldy0+Y2xfbWV0cmljcyk7CiBvdXRfbm9fc3RhdHM6CiAJa2ZyZWUobmV3KTsKQEAgLTQxNyw2ICs0MzIsNyBAQAogb3V0X2ZyZWU6CiAJcnBjX3VucmVnaXN0ZXJfY2xpZW50KGNsbnQpOwogCXJwY19mcmVlX2lvc3RhdHMoY2xudC0+Y2xfbWV0cmljcyk7CisJa2ZyZWUoY2xudC0+Y2xfcHJpbmNpcGFsKTsKIAljbG50LT5jbF9tZXRyaWNzID0gTlVMTDsKIAl4cHJ0X3B1dChjbG50LT5jbF94cHJ0KTsKIAlycGNpb2RfZG93bigpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCmluZGV4IDIzYTJiOGYuLjE5MjQ1MzIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYworKysgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXdha2VfdXAoJnJwY2ktPndhaXRxKTsKIAlyZXR1cm4gcmVzOwogfQotRVhQT1JUX1NZTUJPTChycGNfcXVldWVfdXBjYWxsKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJwY19xdWV1ZV91cGNhbGwpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHJwY19pbm9kZV9zZXRvd25lcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpwcml2YXRlKQpAQCAtMTI2LDEzICsxMjYsMTQgQEAKIHsKIAlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOwogCXN0cnVjdCBycGNfcGlwZV9vcHMgKm9wczsKKwlpbnQgbmVlZF9yZWxlYXNlOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCW9wcyA9IHJwY2ktPm9wczsKIAlpZiAob3BzICE9IE5VTEwpIHsKIAkJTElTVF9IRUFEKGZyZWVfbGlzdCk7Ci0KIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJbmVlZF9yZWxlYXNlID0gcnBjaS0+bnJlYWRlcnMgIT0gMCB8fCBycGNpLT5ud3JpdGVycyAhPSAwOwogCQlycGNpLT5ucmVhZGVycyA9IDA7CiAJCWxpc3Rfc3BsaWNlX2luaXQoJnJwY2ktPmluX3VwY2FsbCwgJmZyZWVfbGlzdCk7CiAJCWxpc3Rfc3BsaWNlX2luaXQoJnJwY2ktPnBpcGUsICZmcmVlX2xpc3QpOwpAQCAtMTQxLDcgKzE0Miw3IEBACiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJcnBjX3B1cmdlX2xpc3QocnBjaSwgJmZyZWVfbGlzdCwgb3BzLT5kZXN0cm95X21zZywgLUVQSVBFKTsKIAkJcnBjaS0+bndyaXRlcnMgPSAwOwotCQlpZiAob3BzLT5yZWxlYXNlX3BpcGUpCisJCWlmIChuZWVkX3JlbGVhc2UgJiYgb3BzLT5yZWxlYXNlX3BpcGUpCiAJCQlvcHMtPnJlbGVhc2VfcGlwZShpbm9kZSk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnBjaS0+cXVldWVfdGltZW91dCk7CiAJfQpAQCAtMTY5LDE2ICsxNzAsMjQgQEAKIHJwY19waXBlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKKwlpbnQgZmlyc3Rfb3BlbjsKIAlpbnQgcmVzID0gLUVOWElPOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCWlmIChycGNpLT5vcHMgIT0gTlVMTCkgewotCQlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXJwY2ktPm5yZWFkZXJzICsrOwotCQlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQlycGNpLT5ud3JpdGVycyArKzsKLQkJcmVzID0gMDsKKwlpZiAocnBjaS0+b3BzID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZpcnN0X29wZW4gPSBycGNpLT5ucmVhZGVycyA9PSAwICYmIHJwY2ktPm53cml0ZXJzID09IDA7CisJaWYgKGZpcnN0X29wZW4gJiYgcnBjaS0+b3BzLT5vcGVuX3BpcGUpIHsKKwkJcmVzID0gcnBjaS0+b3BzLT5vcGVuX3BpcGUoaW5vZGUpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CiAJfQorCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlycGNpLT5ucmVhZGVycysrOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcnBjaS0+bndyaXRlcnMrKzsKKwlyZXMgPSAwOworb3V0OgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXM7CiB9CkBAIC0xODgsNiArMTk3LDcgQEAKIHsKIAlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOwogCXN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZzsKKwlpbnQgbGFzdF9jbG9zZTsKIAogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAocnBjaS0+b3BzID09IE5VTEwpCkBAIC0yMTQsNyArMjI0LDggQEAKIAkJCQkJcnBjaS0+b3BzLT5kZXN0cm95X21zZywgLUVBR0FJTik7CiAJCX0KIAl9Ci0JaWYgKHJwY2ktPm9wcy0+cmVsZWFzZV9waXBlKQorCWxhc3RfY2xvc2UgPSBycGNpLT5ud3JpdGVycyA9PSAwICYmIHJwY2ktPm5yZWFkZXJzID09IDA7CisJaWYgKGxhc3RfY2xvc2UgJiYgcnBjaS0+b3BzLT5yZWxlYXNlX3BpcGUpCiAJCXJwY2ktPm9wcy0+cmVsZWFzZV9waXBlKGlub2RlKTsKIG91dDoKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKQEAgLTM5Niw2ICs0MDcsNyBAQAogCVJQQ0FVVEhfbmZzLAogCVJQQ0FVVEhfcG9ydG1hcCwKIAlSUENBVVRIX3N0YXRkLAorCVJQQ0FVVEhfbmZzZDRfY2IsCiAJUlBDQVVUSF9Sb290RU9GCiB9OwogCkBAIC00MjksNiArNDQxLDEwIEBACiAJCS5uYW1lID0gInN0YXRkIiwKIAkJLm1vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCiAJfSwKKwlbUlBDQVVUSF9uZnNkNF9jYl0gPSB7CisJCS5uYW1lID0gIm5mc2Q0X2NiIiwKKwkJLm1vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCisJfSwKIH07CiAKIGVudW0gewpAQCAtNzQ4LDcgKzc2NCw3IEBACiAgKiBAbmFtZTogbmFtZSBvZiBwaXBlCiAgKiBAcHJpdmF0ZTogcHJpdmF0ZSBkYXRhIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwaXBlLCBmb3IgdGhlIGNhbGxlcidzIHVzZQogICogQG9wczogb3BlcmF0aW9ucyBkZWZpbmluZyB0aGUgYmVoYXZpb3Igb2YgdGhlIHBpcGU6IHVwY2FsbCwgZG93bmNhbGwsCi0gKglyZWxlYXNlX3BpcGUsIGFuZCBkZXN0cm95X21zZy4KKyAqCXJlbGVhc2VfcGlwZSwgb3Blbl9waXBlLCBhbmQgZGVzdHJveV9tc2cuCiAgKiBAZmxhZ3M6IHJwY19pbm9kZSBmbGFncwogICoKICAqIERhdGEgaXMgbWFkZSBhdmFpbGFibGUgZm9yIHVzZXJzcGFjZSB0byByZWFkIGJ5IGNhbGxzIHRvCkBAIC04MDgsNyArODI0LDcgQEAKIAkJCS1FTk9NRU0pOwogCWdvdG8gb3V0OwogfQotRVhQT1JUX1NZTUJPTChycGNfbWtwaXBlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJwY19ta3BpcGUpOwogCiAvKioKICAqIHJwY191bmxpbmsgLSByZW1vdmUgYSBwaXBlCkBAIC04MzksNyArODU1LDcgQEAKIAlkcHV0KHBhcmVudCk7CiAJcmV0dXJuIGVycm9yOwogfQotRVhQT1JUX1NZTUJPTChycGNfdW5saW5rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJwY191bmxpbmspOwogCiAvKgogICogcG9wdWxhdGUgdGhlIGZpbGVzeXN0ZW0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveGRyLmMgYi9uZXQvc3VucnBjL3hkci5jCmluZGV4IDc5YTU1ZDUuLjQwNmUyNmQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveGRyLmMKKysrIGIvbmV0L3N1bnJwYy94ZHIuYwpAQCAtMjgsNyArMjgsNyBAQAogCW1lbWNweShwLCBvYmotPmRhdGEsIG9iai0+bGVuKTsKIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKG9iai0+bGVuKTsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2VuY29kZV9uZXRvYmopOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2VuY29kZV9uZXRvYmopOwogCiBfX2JlMzIgKgogeGRyX2RlY29kZV9uZXRvYmooX19iZTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2JqKQpAQCAtNDEsNyArNDEsNyBAQAogCW9iai0+ZGF0YSA9ICh1OCAqKSBwOwogCXJldHVybiBwICsgWERSX1FVQURMRU4obGVuKTsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2RlY29kZV9uZXRvYmopOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2RlY29kZV9uZXRvYmopOwogCiAvKioKICAqIHhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkIC0gRW5jb2RlIGZpeGVkIGxlbmd0aCBvcGFxdWUgZGF0YQpAQCAtNzEsNyArNzEsNyBAQAogCX0KIAlyZXR1cm4gcDsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQpOwogCiAvKioKICAqIHhkcl9lbmNvZGVfb3BhcXVlIC0gRW5jb2RlIHZhcmlhYmxlIGxlbmd0aCBvcGFxdWUgZGF0YQpAQCAtODYsMTQgKzg2LDE0IEBACiAJKnArKyA9IGh0b25sKG5ieXRlcyk7CiAJcmV0dXJuIHhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIHB0ciwgbmJ5dGVzKTsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2VuY29kZV9vcGFxdWUpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2VuY29kZV9vcGFxdWUpOwogCiBfX2JlMzIgKgogeGRyX2VuY29kZV9zdHJpbmcoX19iZTMyICpwLCBjb25zdCBjaGFyICpzdHJpbmcpCiB7CiAJcmV0dXJuIHhkcl9lbmNvZGVfYXJyYXkocCwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9lbmNvZGVfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9lbmNvZGVfc3RyaW5nKTsKIAogX19iZTMyICoKIHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UoX19iZTMyICpwLCBjaGFyICoqc3AsCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkqc3AgPSAoY2hhciAqKSBwOwogCXJldHVybiBwICsgWERSX1FVQURMRU4obGVuKTsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKTsKIAogdm9pZAogeGRyX2VuY29kZV9wYWdlcyhzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgYmFzZSwKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXhkci0+YnVmbGVuICs9IGxlbjsKIAl4ZHItPmxlbiArPSBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9lbmNvZGVfcGFnZXMpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2VuY29kZV9wYWdlcyk7CiAKIHZvaWQKIHhkcl9pbmxpbmVfcGFnZXMoc3RydWN0IHhkcl9idWYgKnhkciwgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAJeGRyLT5idWZsZW4gKz0gbGVuOwogfQotRVhQT1JUX1NZTUJPTCh4ZHJfaW5saW5lX3BhZ2VzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9pbmxpbmVfcGFnZXMpOwogCiAvKgogICogSGVscGVyIHJvdXRpbmVzIGZvciBkb2luZyAnbWVtbW92ZScgbGlrZSBvcGVyYXRpb25zIG9uIGEgc3RydWN0IHhkcl9idWYKQEAgLTQyOCw3ICs0MjgsNyBAQAogewogCXhkcl9zaHJpbmtfYnVmaGVhZChidWYsIGxlbik7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9zaGlmdF9idWYpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX3NoaWZ0X2J1Zik7CiAKIC8qKgogICogeGRyX2luaXRfZW5jb2RlIC0gSW5pdGlhbGl6ZSBhIHN0cnVjdCB4ZHJfc3RyZWFtIGZvciBzZW5kaW5nIGRhdGEuCkBAIC00NjUsNyArNDY1LDcgQEAKIAkJaW92LT5pb3ZfbGVuICs9IGxlbjsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9pbml0X2VuY29kZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5pdF9lbmNvZGUpOwogCiAvKioKICAqIHhkcl9yZXNlcnZlX3NwYWNlIC0gUmVzZXJ2ZSBidWZmZXIgc3BhY2UgZm9yIHNlbmRpbmcKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCXhkci0+YnVmLT5sZW4gKz0gbmJ5dGVzOwogCXJldHVybiBwOwogfQotRVhQT1JUX1NZTUJPTCh4ZHJfcmVzZXJ2ZV9zcGFjZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfcmVzZXJ2ZV9zcGFjZSk7CiAKIC8qKgogICogeGRyX3dyaXRlX3BhZ2VzIC0gSW5zZXJ0IGEgbGlzdCBvZiBwYWdlcyBpbnRvIGFuIFhEUiBidWZmZXIgZm9yIHNlbmRpbmcKQEAgLTUyNyw3ICs1MjcsNyBAQAogCWJ1Zi0+YnVmbGVuICs9IGxlbjsKIAlidWYtPmxlbiArPSBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl93cml0ZV9wYWdlcyk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfd3JpdGVfcGFnZXMpOwogCiAvKioKICAqIHhkcl9pbml0X2RlY29kZSAtIEluaXRpYWxpemUgYW4geGRyX3N0cmVhbSBmb3IgZGVjb2RpbmcgZGF0YS4KQEAgLTU0Nyw3ICs1NDcsNyBAQAogCXhkci0+cCA9IHA7CiAJeGRyLT5lbmQgPSAoX19iZTMyICopKChjaGFyICopaW92LT5pb3ZfYmFzZSArIGxlbik7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9pbml0X2RlY29kZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5pdF9kZWNvZGUpOwogCiAvKioKICAqIHhkcl9pbmxpbmVfZGVjb2RlIC0gUmV0cmlldmUgbm9uLXBhZ2UgWERSIGRhdGEgdG8gZGVjb2RlCkBAIC01NjksNyArNTY5LDcgQEAKIAl4ZHItPnAgPSBxOwogCXJldHVybiBwOwogfQotRVhQT1JUX1NZTUJPTCh4ZHJfaW5saW5lX2RlY29kZSk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5saW5lX2RlY29kZSk7CiAKIC8qKgogICogeGRyX3JlYWRfcGFnZXMgLSBFbnN1cmUgcGFnZS1iYXNlZCBYRFIgZGF0YSB0byBkZWNvZGUgaXMgYWxpZ25lZCBhdCBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24KQEAgLTYxMyw3ICs2MTMsNyBAQAogCXhkci0+cCA9IChfX2JlMzIgKikoKGNoYXIgKilpb3YtPmlvdl9iYXNlICsgcGFkZGluZyk7CiAJeGRyLT5lbmQgPSAoX19iZTMyICopKChjaGFyICopaW92LT5pb3ZfYmFzZSArIGVuZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9yZWFkX3BhZ2VzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9yZWFkX3BhZ2VzKTsKIAogLyoqCiAgKiB4ZHJfZW50ZXJfcGFnZSAtIGRlY29kZSBkYXRhIGZyb20gdGhlIFhEUiBwYWdlCkBAIC02MzgsNyArNjM4LDcgQEAKIAl4ZHItPnAgPSAoX19iZTMyICopKGthZGRyICsgeGRyLT5idWYtPnBhZ2VfYmFzZSk7CiAJeGRyLT5lbmQgPSAoX19iZTMyICopKChjaGFyICopeGRyLT5wICsgbGVuKTsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2VudGVyX3BhZ2UpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2VudGVyX3BhZ2UpOwogCiBzdGF0aWMgc3RydWN0IGt2ZWMgZW1wdHlfaW92ID0gey5pb3ZfYmFzZSA9IE5VTEwsIC5pb3ZfbGVuID0gMH07CiAKQEAgLTY1MCw3ICs2NTAsNyBAQAogCWJ1Zi0+cGFnZV9sZW4gPSAwOwogCWJ1Zi0+YnVmbGVuID0gYnVmLT5sZW4gPSBpb3YtPmlvdl9sZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9idWZfZnJvbV9pb3YpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2J1Zl9mcm9tX2lvdik7CiAKIC8qIFNldHMgc3ViYnVmIHRvIHRoZSBwb3J0aW9uIG9mIGJ1ZiBvZiBsZW5ndGggbGVuIGJlZ2lubmluZyBiYXNlIGJ5dGVzCiAgKiBmcm9tIHRoZSBzdGFydCBvZiBidWYuIFJldHVybnMgLTEgaWYgYmFzZSBvZiBsZW5ndGggYXJlIG91dCBvZiBib3VuZHMuICovCkBAIC02OTksNyArNjk5LDcgQEAKIAkJcmV0dXJuIC0xOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh4ZHJfYnVmX3N1YnNlZ21lbnQpOworRVhQT1JUX1NZTUJPTF9HUEwoeGRyX2J1Zl9zdWJzZWdtZW50KTsKIAogc3RhdGljIHZvaWQgX19yZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqc3ViYnVmLCB2b2lkICpvYmosIHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC03MzAsNyArNzMwLDcgQEAKIAlfX3JlYWRfYnl0ZXNfZnJvbV94ZHJfYnVmKCZzdWJidWYsIG9iaiwgbGVuKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocmVhZF9ieXRlc19mcm9tX3hkcl9idWYpOworRVhQT1JUX1NZTUJPTF9HUEwocmVhZF9ieXRlc19mcm9tX3hkcl9idWYpOwogCiBzdGF0aWMgdm9pZCBfX3dyaXRlX2J5dGVzX3RvX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKnN1YmJ1Ziwgdm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtNzc0LDcgKzc3NCw3IEBACiAJKm9iaiA9IG50b2hsKHJhdyk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9kZWNvZGVfd29yZCk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZGVjb2RlX3dvcmQpOwogCiBpbnQKIHhkcl9lbmNvZGVfd29yZChzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgYmFzZSwgdTMyIG9iaikKQEAgLTc4Myw3ICs3ODMsNyBAQAogCiAJcmV0dXJuIHdyaXRlX2J5dGVzX3RvX3hkcl9idWYoYnVmLCBiYXNlLCAmcmF3LCBzaXplb2Yob2JqKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9lbmNvZGVfd29yZCk7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZW5jb2RlX3dvcmQpOwogCiAvKiBJZiB0aGUgbmV0b2JqIHN0YXJ0aW5nIG9mZnNldCBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB4ZHJfYnVmIGlzIGNvbnRhaW5lZAogICogZW50aXJlbHkgaW4gdGhlIGhlYWQgb3IgdGhlIHRhaWwsIHNldCBvYmplY3QgdG8gcG9pbnQgdG8gaXQ7IG90aGVyd2lzZQpAQCAtODIxLDcgKzgyMSw3IEBACiAJX19yZWFkX2J5dGVzX2Zyb21feGRyX2J1Zigmc3ViYnVmLCBvYmotPmRhdGEsIG9iai0+bGVuKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woeGRyX2J1Zl9yZWFkX25ldG9iaik7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfYnVmX3JlYWRfbmV0b2JqKTsKIAogLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLwogc3RhdGljIGludApAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAogCXJldHVybiB4ZHJfeGNvZGVfYXJyYXkyKGJ1ZiwgYmFzZSwgZGVzYywgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9kZWNvZGVfYXJyYXkyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9kZWNvZGVfYXJyYXkyKTsKIAogaW50CiB4ZHJfZW5jb2RlX2FycmF5MihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgYmFzZSwKQEAgLTEwMzksNyArMTAzOSw3IEBACiAKIAlyZXR1cm4geGRyX3hjb2RlX2FycmF5MihidWYsIGJhc2UsIGRlc2MsIDEpOwogfQotRVhQT1JUX1NZTUJPTCh4ZHJfZW5jb2RlX2FycmF5Mik7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZW5jb2RlX2FycmF5Mik7CiAKIGludAogeGRyX3Byb2Nlc3NfYnVmKHN0cnVjdCB4ZHJfYnVmICpidWYsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCkBAIC0xMTA2LDUgKzExMDYsNSBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHhkcl9wcm9jZXNzX2J1Zik7CitFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfcHJvY2Vzc19idWYpOwogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3Byb2MuYyBiL25ldC94ZnJtL3hmcm1fcHJvYy5jCmluZGV4IDI4NGVhZWYuLmEyYWRiNTEgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcHJvYy5jCisrKyBiL25ldC94ZnJtL3hmcm1fcHJvYy5jCkBAIC00NCwyNyArNDQsMTQgQEAKIAlTTk1QX01JQl9TRU5USU5FTAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQotewotICAgICAgICB1bnNpZ25lZCBsb25nIHJlcyA9IDA7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0gICAgICAgICAgICAgICAgcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopcGVyX2NwdV9wdHIobWliWzBdLCBpKSkgKyBvZmZ0KTsKLSAgICAgICAgICAgICAgICByZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1X3B0cihtaWJbMV0sIGkpKSArIG9mZnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci19Ci0KIHN0YXRpYyBpbnQgeGZybV9zdGF0aXN0aWNzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKIAlpbnQgaTsKIAlmb3IgKGk9MDsgeGZybV9taWJfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiJS0yNHNcdCVsdVxuIiwgeGZybV9taWJfbGlzdFtpXS5uYW1lLAotCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKiluZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MsCi0JCQkJICAgICAgeGZybV9taWJfbGlzdFtpXS5lbnRyeSkpOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKW5ldC0+bWliLnhmcm1fc3RhdGlzdGljcywKKwkJCQkJICAgeGZybV9taWJfbGlzdFtpXS5lbnRyeSkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCA3YzcyYmFhLi42Njg4NzY1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTgzOCwxMSArODM4LDExIEBACiB7CiAJa2V5X3JlZl90IGRrcmVmOwogCisJKl9kZXN0X2tleXJpbmcgPSBOVUxMOworCiAJLyoganVzdCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgaWYgd2Ugd2VyZW4ndCBhc2tlZCB0byBtYWtlIGEgbGluayAqLwotCWlmIChyaW5naWQgPT0gMCkgewotCQkqX2Rlc3Rfa2V5cmluZyA9IE5VTEw7CisJaWYgKHJpbmdpZCA9PSAwKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkvKiBpZiBhIHNwZWNpZmljIGtleXJpbmcgaXMgbm9taW5hdGVkIGJ5IElELCB0aGVuIHVzZSB0aGF0ICovCiAJaWYgKHJpbmdpZCA+IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYwppbmRleCAzNGMxZDk0Li5lZjY1MzllIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKaW5kZXggYzI2MzViZS4uODVjZjU5MSAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWFjOTcuaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJweGEyeHgtcGNtLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LXBjbS5oIGIvc291bmQvYXJtL3B4YTJ4eC1wY20uaAppbmRleCA1YzRhNGQzLi42NWY4NmI1IDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LXBjbS5oCisrKyBiL3NvdW5kL2FybS9weGEyeHgtcGNtLmgKQEAgLTksNyArOSw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgewogCWludCBkbWFfY2g7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2hydGltZXIuYyBiL3NvdW5kL2NvcmUvaHJ0aW1lci5jCmluZGV4IGMxZDI4NTkuLjM0YzdkNDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaHJ0aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvaHJ0aW1lci5jCkBAIC01Nyw3ICs1Nyw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCWhydGltZXJfaW5pdCgmc3RpbWUtPmhydCwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzdGltZS0+dGltZXIgPSB0OwotCXN0aW1lLT5ocnQuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRDsKIAlzdGltZS0+aHJ0LmZ1bmN0aW9uID0gc25kX2hydGltZXJfY2FsbGJhY2s7CiAJdC0+cHJpdmF0ZV9kYXRhID0gc3RpbWU7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwppbmRleCAyYTAyZjcwLi5hNDA0OWViIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKQEAgLTk2LDcgKzk2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlocnRpbWVyX2luaXQoJnBjc3BfY2hpcC50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKLQlwY3NwX2NoaXAudGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRDsKIAlwY3NwX2NoaXAudGltZXIuZnVuY3Rpb24gPSBwY3NwX2RvX3RpbWVyOwogCiAJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMgYi9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCmluZGV4IGMxM2ExNzguLjU0OWI0ZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKKysrIGIvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYwpAQCAtMTgsNyArMTgsNyBAQAogICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqCi0gKi8gICAgICAKKyAqLwogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTg5LDcgKzg5LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JCisKIAlzd2l0Y2goY21kKSB7CiAJCWNhc2UgVklESU9DR0NBUDoKIAkJewpAQCAtMTEwLDkgKzExMCw5IEBACiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLHNpemVvZih2KSkhPTApIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsc2l6ZW9mKHYpKSE9MCkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmICh2LnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8gCisJCQlpZiAodi50dW5lcikJLyogT25seSAxIHR1bmVyICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl2LnJhbmdlbG93ID0gKDg3KjE2MDAwKTsKIAkJCXYucmFuZ2VoaWdoID0gKDEwOCoxNjAwMCk7CkBAIC0xNDQsMjQgKzE0NCwyNCBAQAogCQkJc25kX3RlYTU3NXhfc2V0X2ZyZXEodGVhKTsKIAkJCXJldHVybiAwOwogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvIHY7CiAJCQltZW1zZXQoJnYsIDAsIHNpemVvZih2KSk7CiAJCQlzdHJjcHkodi5uYW1lLCAiUmFkaW8iKTsKIAkJCWlmKGNvcHlfdG9fdXNlcihhcmcsJnYsIHNpemVvZih2KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gdjsKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsIHNpemVvZih2KSkpIAotCQkJCXJldHVybiAtRUZBVUxUOwkKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmcsIHNpemVvZih2KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlpZiAodGVhLT5vcHMtPm11dGUpCiAJCQkJdGVhLT5vcHMtPm11dGUodGVhLAogCQkJCQkgICAgICAgKHYuZmxhZ3MgJgogCQkJCQkJVklERU9fQVVESU9fTVVURSkgPyAxIDogMCk7Ci0JCQlpZih2LmF1ZGlvKSAKKwkJCWlmKHYuYXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjQwLDExICsyNDAsMTEgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLSAgICAgICAgCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX3RlYTU3NXhfbW9kdWxlX2V4aXQodm9pZCkKIHsKIH0KLSAgICAgICAgCisKIG1vZHVsZV9pbml0KGFsc2FfdGVhNTc1eF9tb2R1bGVfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2FfdGVhNTc1eF9tb2R1bGVfZXhpdCkKIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKaW5kZXggYzQ3ODQyZi4uMmM2M2JiOSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYworKysgYi9zb3VuZC9vc3Mvd2F2ZWFydGlzdC5jCkBAIC0xNDgzLDE2ICsxNDgzLDE0IEBACiAjZGVmaW5lIFZOQ19IQU5EU0VUX0RFVEVDVAkweDQwCiAjZGVmaW5lIFZOQ19ESVNBQkxFX0FVVE9TV0lUQ0gJMHg4MAogCi1leHRlcm4gc3BpbmxvY2tfdCBncGlvX2xvY2s7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogdm5jX211dGVfc3Brcih3YXZuY19pbmZvICpkZXZjKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0JY3BsZF9tb2RpZnkoQ1BMRF9VTk1VVEUsIGRldmMtPnNwa3JfbXV0ZV9zdGF0ZSA/IDAgOiBDUExEX1VOTVVURSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOworCW53X2NwbGRfbW9kaWZ5KENQTERfVU5NVVRFLCBkZXZjLT5zcGtyX211dGVfc3RhdGUgPyAwIDogQ1BMRF9VTk1VVEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm53X2dwaW9fbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jCmluZGV4IDc4MGRiNjcuLjgxMmMyYjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWFjOTcuaD4KIAogI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKICNpbmNsdWRlICJweGEyeHgtYWM5Ny5oIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjMjQ0My1hYzk3LmMgYi9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNDQzLWFjOTcuYwppbmRleCAxYmZjZTQwLi41ODIyZDJkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNDQzLWFjOTcuYworKysgYi9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNDQzLWFjOTcuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtYWM5Ny5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgo=